@dollhousemcp/mcp-server 1.3.2 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +87 -5
  2. package/dist/collection/ElementInstaller.d.ts.map +1 -1
  3. package/dist/collection/ElementInstaller.js +3 -7
  4. package/dist/elements/index.d.ts +0 -2
  5. package/dist/elements/index.d.ts.map +1 -1
  6. package/dist/elements/index.js +1 -3
  7. package/dist/elements/skills/Skill.d.ts.map +1 -1
  8. package/dist/elements/skills/Skill.js +3 -2
  9. package/dist/elements/skills/SkillManager.d.ts +83 -0
  10. package/dist/elements/skills/SkillManager.d.ts.map +1 -0
  11. package/dist/elements/skills/SkillManager.js +383 -0
  12. package/dist/elements/skills/index.d.ts +1 -0
  13. package/dist/elements/skills/index.d.ts.map +1 -1
  14. package/dist/elements/skills/index.js +2 -1
  15. package/dist/index.d.ts +51 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +577 -3
  18. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  19. package/dist/portfolio/PortfolioManager.js +1 -3
  20. package/dist/portfolio/types.d.ts +1 -3
  21. package/dist/portfolio/types.d.ts.map +1 -1
  22. package/dist/portfolio/types.js +1 -3
  23. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  24. package/dist/security/audit/config/suppressions.js +6 -1
  25. package/dist/server/ServerSetup.d.ts.map +1 -1
  26. package/dist/server/ServerSetup.js +5 -2
  27. package/dist/server/tools/CollectionTools.js +6 -6
  28. package/dist/server/tools/ElementTools.d.ts +11 -0
  29. package/dist/server/tools/ElementTools.d.ts.map +1 -0
  30. package/dist/server/tools/ElementTools.js +174 -0
  31. package/dist/server/tools/index.d.ts +1 -0
  32. package/dist/server/tools/index.d.ts.map +1 -1
  33. package/dist/server/tools/index.js +2 -1
  34. package/dist/server/types.d.ts +8 -0
  35. package/dist/server/types.d.ts.map +1 -1
  36. package/dist/server/types.js +1 -1
  37. package/package.json +1 -1
  38. package/dist/elements/ensembles/Ensemble.d.ts +0 -144
  39. package/dist/elements/ensembles/Ensemble.d.ts.map +0 -1
  40. package/dist/elements/ensembles/Ensemble.js +0 -860
  41. package/dist/elements/ensembles/EnsembleManager.d.ts +0 -85
  42. package/dist/elements/ensembles/EnsembleManager.d.ts.map +0 -1
  43. package/dist/elements/ensembles/EnsembleManager.js +0 -378
  44. package/dist/elements/ensembles/constants.d.ts +0 -73
  45. package/dist/elements/ensembles/constants.d.ts.map +0 -1
  46. package/dist/elements/ensembles/constants.js +0 -92
  47. package/dist/elements/ensembles/index.d.ts +0 -8
  48. package/dist/elements/ensembles/index.d.ts.map +0 -1
  49. package/dist/elements/ensembles/index.js +0 -8
  50. package/dist/elements/ensembles/types.d.ts +0 -92
  51. package/dist/elements/ensembles/types.d.ts.map +0 -1
  52. package/dist/elements/ensembles/types.js +0 -8
  53. package/dist/elements/memories/Memory.d.ts +0 -110
  54. package/dist/elements/memories/Memory.d.ts.map +0 -1
  55. package/dist/elements/memories/Memory.js +0 -470
  56. package/dist/elements/memories/MemoryManager.d.ts +0 -86
  57. package/dist/elements/memories/MemoryManager.d.ts.map +0 -1
  58. package/dist/elements/memories/MemoryManager.js +0 -435
  59. package/dist/elements/memories/constants.d.ts +0 -42
  60. package/dist/elements/memories/constants.d.ts.map +0 -1
  61. package/dist/elements/memories/constants.js +0 -49
  62. package/dist/elements/memories/index.d.ts +0 -6
  63. package/dist/elements/memories/index.d.ts.map +0 -1
  64. package/dist/elements/memories/index.js +0 -6
package/dist/index.js CHANGED
@@ -24,6 +24,9 @@ import { PersonaExporter, PersonaImporter, PersonaSharer } from './persona/expor
24
24
  import { isDefaultPersona } from './constants/defaultPersonas.js';
25
25
  import { PortfolioManager, ElementType } from './portfolio/PortfolioManager.js';
26
26
  import { MigrationManager } from './portfolio/MigrationManager.js';
27
+ import { SkillManager } from './elements/skills/index.js';
28
+ import { TemplateManager } from './elements/templates/TemplateManager.js';
29
+ import { AgentManager } from './elements/agents/AgentManager.js';
27
30
  export class DollhouseMCPServer {
28
31
  server;
29
32
  personasDir;
@@ -47,6 +50,9 @@ export class DollhouseMCPServer {
47
50
  personaSharer;
48
51
  portfolioManager;
49
52
  migrationManager;
53
+ skillManager;
54
+ templateManager;
55
+ agentManager;
50
56
  constructor() {
51
57
  this.server = new Server({
52
58
  name: "dollhousemcp",
@@ -61,6 +67,10 @@ export class DollhouseMCPServer {
61
67
  this.migrationManager = new MigrationManager(this.portfolioManager);
62
68
  // Use portfolio personas directory
63
69
  this.personasDir = this.portfolioManager.getElementDir(ElementType.PERSONA);
70
+ // Initialize element managers
71
+ this.skillManager = new SkillManager();
72
+ this.templateManager = new TemplateManager();
73
+ this.agentManager = new AgentManager(this.portfolioManager.getBaseDir());
64
74
  // Log resolved path for debugging
65
75
  logger.info(`Personas directory resolved to: ${this.personasDir}`);
66
76
  // Initialize PathValidator with the personas directory
@@ -78,8 +88,10 @@ export class DollhouseMCPServer {
78
88
  this.personaDetails = new PersonaDetails(this.githubClient);
79
89
  this.elementInstaller = new ElementInstaller(this.githubClient);
80
90
  this.personaSubmitter = new PersonaSubmitter();
81
- // Initialize update manager
82
- this.updateManager = new UpdateManager();
91
+ // Initialize update manager with safe directory
92
+ // Use the parent of personas directory to avoid production check
93
+ const safeDir = path.dirname(this.personasDir);
94
+ this.updateManager = new UpdateManager(safeDir);
83
95
  // Initialize export/import/share modules
84
96
  this.personaExporter = new PersonaExporter(this.currentUser);
85
97
  this.personaImporter = new PersonaImporter(this.personasDir, this.currentUser);
@@ -359,6 +371,568 @@ export class DollhouseMCPServer {
359
371
  ],
360
372
  };
361
373
  }
374
+ // ===== Element Methods (Generic for all element types) =====
375
+ async listElements(type) {
376
+ try {
377
+ switch (type) {
378
+ case 'personas':
379
+ return this.listPersonas();
380
+ case 'skills': {
381
+ const skills = await this.skillManager.list();
382
+ if (skills.length === 0) {
383
+ return {
384
+ content: [{
385
+ type: "text",
386
+ text: "📚 No skills found in your portfolio. Skills are discrete capabilities for specific tasks."
387
+ }]
388
+ };
389
+ }
390
+ const skillList = skills.map(skill => {
391
+ const complexity = skill.metadata.complexity || 'beginner';
392
+ const domains = skill.metadata.domains?.join(', ') || 'general';
393
+ return `🛠️ ${skill.metadata.name} - ${skill.metadata.description}\n Complexity: ${complexity} | Domains: ${domains}`;
394
+ }).join('\n\n');
395
+ return {
396
+ content: [{
397
+ type: "text",
398
+ text: `📚 Available Skills:\n\n${skillList}`
399
+ }]
400
+ };
401
+ }
402
+ case 'templates': {
403
+ const templates = await this.templateManager.list();
404
+ if (templates.length === 0) {
405
+ return {
406
+ content: [{
407
+ type: "text",
408
+ text: "📝 No templates found in your portfolio. Templates are reusable content structures."
409
+ }]
410
+ };
411
+ }
412
+ const templateList = templates.map(template => {
413
+ const variables = template.metadata.variables?.map(v => v.name).join(', ') || 'none';
414
+ return `📄 ${template.metadata.name} - ${template.metadata.description}\n Variables: ${variables}`;
415
+ }).join('\n\n');
416
+ return {
417
+ content: [{
418
+ type: "text",
419
+ text: `📝 Available Templates:\n\n${templateList}`
420
+ }]
421
+ };
422
+ }
423
+ case 'agents': {
424
+ const agents = await this.agentManager.list();
425
+ if (agents.length === 0) {
426
+ return {
427
+ content: [{
428
+ type: "text",
429
+ text: "🤖 No agents found in your portfolio. Agents are autonomous goal-oriented actors."
430
+ }]
431
+ };
432
+ }
433
+ const agentList = agents.map(agent => {
434
+ const specializations = agent.metadata.specializations?.join(', ') || 'general';
435
+ const status = agent.getStatus();
436
+ return `🤖 ${agent.metadata.name} - ${agent.metadata.description}\n Status: ${status} | Specializations: ${specializations}`;
437
+ }).join('\n\n');
438
+ return {
439
+ content: [{
440
+ type: "text",
441
+ text: `🤖 Available Agents:\n\n${agentList}`
442
+ }]
443
+ };
444
+ }
445
+ default:
446
+ return {
447
+ content: [{
448
+ type: "text",
449
+ text: `❌ Unknown element type '${type}'. Available types: personas, skills, templates, agents`
450
+ }]
451
+ };
452
+ }
453
+ }
454
+ catch (error) {
455
+ logger.error(`Failed to list ${type} elements:`, error);
456
+ return {
457
+ content: [{
458
+ type: "text",
459
+ text: `❌ Failed to list ${type}: ${error instanceof Error ? error.message : 'Unknown error'}`
460
+ }]
461
+ };
462
+ }
463
+ }
464
+ async activateElement(name, type) {
465
+ try {
466
+ switch (type) {
467
+ case 'personas':
468
+ return this.activatePersona(name);
469
+ case 'skills': {
470
+ const skill = await this.skillManager.find(s => s.metadata.name === name);
471
+ if (!skill) {
472
+ return {
473
+ content: [{
474
+ type: "text",
475
+ text: `❌ Skill '${name}' not found`
476
+ }]
477
+ };
478
+ }
479
+ // Activate the skill
480
+ await skill.activate?.();
481
+ return {
482
+ content: [{
483
+ type: "text",
484
+ text: `✅ Skill '${name}' activated\n\n${skill.instructions}`
485
+ }]
486
+ };
487
+ }
488
+ case 'templates': {
489
+ const template = await this.templateManager.find(t => t.metadata.name === name);
490
+ if (!template) {
491
+ return {
492
+ content: [{
493
+ type: "text",
494
+ text: `❌ Template '${name}' not found`
495
+ }]
496
+ };
497
+ }
498
+ const variables = template.metadata.variables?.map(v => v.name).join(', ') || 'none';
499
+ return {
500
+ content: [{
501
+ type: "text",
502
+ text: `✅ Template '${name}' ready to use\nVariables: ${variables}\n\nUse 'render_template' to generate content with this template.`
503
+ }]
504
+ };
505
+ }
506
+ case 'agents': {
507
+ const agent = await this.agentManager.find(a => a.metadata.name === name);
508
+ if (!agent) {
509
+ return {
510
+ content: [{
511
+ type: "text",
512
+ text: `❌ Agent '${name}' not found`
513
+ }]
514
+ };
515
+ }
516
+ // Activate the agent
517
+ await agent.activate();
518
+ return {
519
+ content: [{
520
+ type: "text",
521
+ text: `✅ Agent '${name}' activated and ready\nSpecializations: ${agent.metadata.specializations?.join(', ') || 'general'}\n\nUse 'execute_agent' to give this agent a goal.`
522
+ }]
523
+ };
524
+ }
525
+ default:
526
+ return {
527
+ content: [{
528
+ type: "text",
529
+ text: `❌ Unknown element type '${type}'`
530
+ }]
531
+ };
532
+ }
533
+ }
534
+ catch (error) {
535
+ logger.error(`Failed to activate ${type} '${name}':`, error);
536
+ return {
537
+ content: [{
538
+ type: "text",
539
+ text: `❌ Failed to activate ${type} '${name}': ${error instanceof Error ? error.message : 'Unknown error'}`
540
+ }]
541
+ };
542
+ }
543
+ }
544
+ async getActiveElements(type) {
545
+ try {
546
+ switch (type) {
547
+ case 'personas':
548
+ return this.getActivePersona();
549
+ case 'skills': {
550
+ const skills = await this.skillManager.list();
551
+ const activeSkills = skills.filter(s => s.getStatus() === 'active');
552
+ if (activeSkills.length === 0) {
553
+ return {
554
+ content: [{
555
+ type: "text",
556
+ text: "📋 No active skills"
557
+ }]
558
+ };
559
+ }
560
+ const skillList = activeSkills.map(s => `🛠️ ${s.metadata.name}`).join(', ');
561
+ return {
562
+ content: [{
563
+ type: "text",
564
+ text: `Active skills: ${skillList}`
565
+ }]
566
+ };
567
+ }
568
+ case 'templates': {
569
+ return {
570
+ content: [{
571
+ type: "text",
572
+ text: "📝 Templates are stateless and activated on-demand when rendering"
573
+ }]
574
+ };
575
+ }
576
+ case 'agents': {
577
+ const agents = await this.agentManager.list();
578
+ const activeAgents = agents.filter(a => a.getStatus() === 'active');
579
+ if (activeAgents.length === 0) {
580
+ return {
581
+ content: [{
582
+ type: "text",
583
+ text: "🤖 No active agents"
584
+ }]
585
+ };
586
+ }
587
+ const agentList = activeAgents.map(a => {
588
+ const goals = a.state?.goals?.length || 0;
589
+ return `🤖 ${a.metadata.name} (${goals} active goals)`;
590
+ }).join('\n');
591
+ return {
592
+ content: [{
593
+ type: "text",
594
+ text: `Active agents:\n${agentList}`
595
+ }]
596
+ };
597
+ }
598
+ default:
599
+ return {
600
+ content: [{
601
+ type: "text",
602
+ text: `❌ Unknown element type '${type}'`
603
+ }]
604
+ };
605
+ }
606
+ }
607
+ catch (error) {
608
+ logger.error(`Failed to get active ${type}:`, error);
609
+ return {
610
+ content: [{
611
+ type: "text",
612
+ text: `❌ Failed to get active ${type}: ${error instanceof Error ? error.message : 'Unknown error'}`
613
+ }]
614
+ };
615
+ }
616
+ }
617
+ async deactivateElement(name, type) {
618
+ try {
619
+ switch (type) {
620
+ case 'personas':
621
+ return this.deactivatePersona();
622
+ case 'skills': {
623
+ const skill = await this.skillManager.find(s => s.metadata.name === name);
624
+ if (!skill) {
625
+ return {
626
+ content: [{
627
+ type: "text",
628
+ text: `❌ Skill '${name}' not found`
629
+ }]
630
+ };
631
+ }
632
+ await skill.deactivate?.();
633
+ return {
634
+ content: [{
635
+ type: "text",
636
+ text: `✅ Skill '${name}' deactivated`
637
+ }]
638
+ };
639
+ }
640
+ case 'templates': {
641
+ return {
642
+ content: [{
643
+ type: "text",
644
+ text: "📝 Templates are stateless - nothing to deactivate"
645
+ }]
646
+ };
647
+ }
648
+ case 'agents': {
649
+ const agent = await this.agentManager.find(a => a.metadata.name === name);
650
+ if (!agent) {
651
+ return {
652
+ content: [{
653
+ type: "text",
654
+ text: `❌ Agent '${name}' not found`
655
+ }]
656
+ };
657
+ }
658
+ await agent.deactivate();
659
+ return {
660
+ content: [{
661
+ type: "text",
662
+ text: `✅ Agent '${name}' deactivated`
663
+ }]
664
+ };
665
+ }
666
+ default:
667
+ return {
668
+ content: [{
669
+ type: "text",
670
+ text: `❌ Unknown element type '${type}'`
671
+ }]
672
+ };
673
+ }
674
+ }
675
+ catch (error) {
676
+ logger.error(`Failed to deactivate ${type} '${name}':`, error);
677
+ return {
678
+ content: [{
679
+ type: "text",
680
+ text: `❌ Failed to deactivate ${type} '${name}': ${error instanceof Error ? error.message : 'Unknown error'}`
681
+ }]
682
+ };
683
+ }
684
+ }
685
+ async getElementDetails(name, type) {
686
+ try {
687
+ switch (type) {
688
+ case 'personas':
689
+ return this.getPersonaDetails(name);
690
+ case 'skills': {
691
+ const skill = await this.skillManager.find(s => s.metadata.name === name);
692
+ if (!skill) {
693
+ return {
694
+ content: [{
695
+ type: "text",
696
+ text: `❌ Skill '${name}' not found`
697
+ }]
698
+ };
699
+ }
700
+ const details = [
701
+ `🛠️ **${skill.metadata.name}**`,
702
+ `${skill.metadata.description}`,
703
+ ``,
704
+ `**Complexity**: ${skill.metadata.complexity || 'beginner'}`,
705
+ `**Domains**: ${skill.metadata.domains?.join(', ') || 'general'}`,
706
+ `**Languages**: ${skill.metadata.languages?.join(', ') || 'any'}`,
707
+ `**Prerequisites**: ${skill.metadata.prerequisites?.join(', ') || 'none'}`,
708
+ ``,
709
+ `**Instructions**:`,
710
+ skill.instructions
711
+ ];
712
+ if (skill.metadata.parameters && skill.metadata.parameters.length > 0) {
713
+ details.push('', '**Parameters**:');
714
+ skill.metadata.parameters.forEach(p => {
715
+ details.push(`- ${p.name} (${p.type}): ${p.description}`);
716
+ });
717
+ }
718
+ return {
719
+ content: [{
720
+ type: "text",
721
+ text: details.join('\n')
722
+ }]
723
+ };
724
+ }
725
+ case 'templates': {
726
+ const template = await this.templateManager.find(t => t.metadata.name === name);
727
+ if (!template) {
728
+ return {
729
+ content: [{
730
+ type: "text",
731
+ text: `❌ Template '${name}' not found`
732
+ }]
733
+ };
734
+ }
735
+ const details = [
736
+ `📄 **${template.metadata.name}**`,
737
+ `${template.metadata.description}`,
738
+ ``,
739
+ `**Output Format**: ${template.metadata.output_format || 'text'}`,
740
+ `**Template Content**:`,
741
+ '```',
742
+ template.content,
743
+ '```'
744
+ ];
745
+ if (template.metadata.variables && template.metadata.variables.length > 0) {
746
+ details.push('', '**Variables**:');
747
+ template.metadata.variables.forEach(v => {
748
+ details.push(`- ${v.name} (${v.type}): ${v.description}`);
749
+ });
750
+ }
751
+ return {
752
+ content: [{
753
+ type: "text",
754
+ text: details.join('\n')
755
+ }]
756
+ };
757
+ }
758
+ case 'agents': {
759
+ const agent = await this.agentManager.find(a => a.metadata.name === name);
760
+ if (!agent) {
761
+ return {
762
+ content: [{
763
+ type: "text",
764
+ text: `❌ Agent '${name}' not found`
765
+ }]
766
+ };
767
+ }
768
+ const details = [
769
+ `🤖 **${agent.metadata.name}**`,
770
+ `${agent.metadata.description}`,
771
+ ``,
772
+ `**Status**: ${agent.getStatus()}`,
773
+ `**Specializations**: ${agent.metadata.specializations?.join(', ') || 'general'}`,
774
+ `**Decision Framework**: ${agent.metadata.decisionFramework || 'rule-based'}`,
775
+ `**Risk Tolerance**: ${agent.metadata.riskTolerance || 'low'}`,
776
+ ``,
777
+ `**Instructions**:`,
778
+ agent.instructions || 'No instructions available'
779
+ ];
780
+ const agentState = agent.state;
781
+ if (agentState?.goals && agentState.goals.length > 0) {
782
+ details.push('', '**Current Goals**:');
783
+ agentState.goals.forEach((g) => {
784
+ details.push(`- ${g.description} (${g.status})`);
785
+ });
786
+ }
787
+ return {
788
+ content: [{
789
+ type: "text",
790
+ text: details.join('\n')
791
+ }]
792
+ };
793
+ }
794
+ default:
795
+ return {
796
+ content: [{
797
+ type: "text",
798
+ text: `❌ Unknown element type '${type}'`
799
+ }]
800
+ };
801
+ }
802
+ }
803
+ catch (error) {
804
+ logger.error(`Failed to get ${type} details for '${name}':`, error);
805
+ return {
806
+ content: [{
807
+ type: "text",
808
+ text: `❌ Failed to get ${type} details: ${error instanceof Error ? error.message : 'Unknown error'}`
809
+ }]
810
+ };
811
+ }
812
+ }
813
+ async reloadElements(type) {
814
+ try {
815
+ switch (type) {
816
+ case 'personas':
817
+ return this.reloadPersonas();
818
+ case 'skills': {
819
+ this.skillManager.clearCache();
820
+ const skills = await this.skillManager.list();
821
+ return {
822
+ content: [{
823
+ type: "text",
824
+ text: `🔄 Reloaded ${skills.length} skills from portfolio`
825
+ }]
826
+ };
827
+ }
828
+ case 'templates': {
829
+ // Template manager doesn't have clearCache, just list
830
+ const templates = await this.templateManager.list();
831
+ return {
832
+ content: [{
833
+ type: "text",
834
+ text: `🔄 Reloaded ${templates.length} templates from portfolio`
835
+ }]
836
+ };
837
+ }
838
+ case 'agents': {
839
+ // Agent manager doesn't have clearCache, just list
840
+ const agents = await this.agentManager.list();
841
+ return {
842
+ content: [{
843
+ type: "text",
844
+ text: `🔄 Reloaded ${agents.length} agents from portfolio`
845
+ }]
846
+ };
847
+ }
848
+ default:
849
+ return {
850
+ content: [{
851
+ type: "text",
852
+ text: `❌ Unknown element type '${type}'`
853
+ }]
854
+ };
855
+ }
856
+ }
857
+ catch (error) {
858
+ logger.error(`Failed to reload ${type}:`, error);
859
+ return {
860
+ content: [{
861
+ type: "text",
862
+ text: `❌ Failed to reload ${type}: ${error instanceof Error ? error.message : 'Unknown error'}`
863
+ }]
864
+ };
865
+ }
866
+ }
867
+ // Element-specific methods
868
+ async renderTemplate(name, variables) {
869
+ try {
870
+ const template = await this.templateManager.find(t => t.metadata.name === name);
871
+ if (!template) {
872
+ return {
873
+ content: [{
874
+ type: "text",
875
+ text: `❌ Template '${name}' not found`
876
+ }]
877
+ };
878
+ }
879
+ // Simple template rendering - replace variables in content
880
+ let rendered = template.content;
881
+ for (const [key, value] of Object.entries(variables)) {
882
+ const regex = new RegExp(`\\{\\{\\s*${key}\\s*\\}\\}`, 'g');
883
+ rendered = rendered.replace(regex, String(value));
884
+ }
885
+ return {
886
+ content: [{
887
+ type: "text",
888
+ text: `📄 Rendered template '${name}':\n\n${rendered}`
889
+ }]
890
+ };
891
+ }
892
+ catch (error) {
893
+ logger.error(`Failed to render template '${name}':`, error);
894
+ return {
895
+ content: [{
896
+ type: "text",
897
+ text: `❌ Failed to render template: ${error instanceof Error ? error.message : 'Unknown error'}`
898
+ }]
899
+ };
900
+ }
901
+ }
902
+ async executeAgent(name, goal) {
903
+ try {
904
+ const agent = await this.agentManager.find(a => a.metadata.name === name);
905
+ if (!agent) {
906
+ return {
907
+ content: [{
908
+ type: "text",
909
+ text: `❌ Agent '${name}' not found`
910
+ }]
911
+ };
912
+ }
913
+ // Simple agent execution simulation
914
+ const result = {
915
+ summary: `Agent '${name}' is now working on: ${goal}`,
916
+ status: 'in-progress',
917
+ actionsTaken: 1
918
+ };
919
+ return {
920
+ content: [{
921
+ type: "text",
922
+ text: `🤖 Agent '${name}' execution result:\n\n${result.summary}\n\nStatus: ${result.status}\nActions taken: ${result.actionsTaken || 0}`
923
+ }]
924
+ };
925
+ }
926
+ catch (error) {
927
+ logger.error(`Failed to execute agent '${name}':`, error);
928
+ return {
929
+ content: [{
930
+ type: "text",
931
+ text: `❌ Failed to execute agent: ${error instanceof Error ? error.message : 'Unknown error'}`
932
+ }]
933
+ };
934
+ }
935
+ }
362
936
  // checkRateLimit and fetchFromGitHub are now handled by GitHubClient
363
937
  async browseCollection(section, type) {
364
938
  try {
@@ -1603,4 +2177,4 @@ if (import.meta.url === `file://${process.argv[1]}` && !process.env.JEST_WORKER_
1603
2177
  process.exit(1);
1604
2178
  });
1605
2179
  }
1606
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQXdCLE1BQU0sOEJBQThCLENBQUM7QUFDaEksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBSWhFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQWdCLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pLLE9BQU8sRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsTUFB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RixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLFVBQVUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNuRixNQUFNLE1BQU0sR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7SUFDeEMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzNCLE1BQU0sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCB7IFNlcnZlciB9IGZyb20gXCJAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2RrL3NlcnZlci9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU3RkaW9TZXJ2ZXJUcmFuc3BvcnQgfSBmcm9tIFwiQG1vZGVsY29udGV4dHByb3RvY29sL3Nkay9zZXJ2ZXIvc3RkaW8uanNcIjtcbmltcG9ydCB7IE1jcEVycm9yLCBFcnJvckNvZGUgfSBmcm9tIFwiQG1vZGVsY29udGV4dHByb3RvY29sL3Nkay90eXBlcy5qc1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcInVybFwiO1xuaW1wb3J0IG1hdHRlciBmcm9tIFwiZ3JheS1tYXR0ZXJcIjtcbmltcG9ydCB7IGxvYWRJbmRpY2F0b3JDb25maWcsIGZvcm1hdEluZGljYXRvciwgdmFsaWRhdGVDdXN0b21Gb3JtYXQsIHR5cGUgSW5kaWNhdG9yQ29uZmlnIH0gZnJvbSAnLi9jb25maWcvaW5kaWNhdG9yLWNvbmZpZy5qcyc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuL2Vycm9ycy9TZWN1cml0eUVycm9yLmpzJztcbmltcG9ydCB7IFNlY3VyZUVycm9ySGFuZGxlciB9IGZyb20gJy4vc2VjdXJpdHkvZXJyb3JIYW5kbGVyLmpzJztcblxuLy8gSW1wb3J0IG1vZHVsYXJpemVkIGNvbXBvbmVudHNcbmltcG9ydCB7IFBlcnNvbmEsIFBlcnNvbmFNZXRhZGF0YSB9IGZyb20gJy4vdHlwZXMvcGVyc29uYS5qcyc7XG5pbXBvcnQgeyBBUElDYWNoZSB9IGZyb20gJy4vY2FjaGUvQVBJQ2FjaGUuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVGaWxlbmFtZSwgdmFsaWRhdGVQYXRoLCBzYW5pdGl6ZUlucHV0LCB2YWxpZGF0ZUNvbnRlbnRTaXplLCB2YWxpZGF0ZVVzZXJuYW1lLCB2YWxpZGF0ZUNhdGVnb3J5LCBNQ1BJbnB1dFZhbGlkYXRvciB9IGZyb20gJy4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTLCBWQUxJREFUSU9OX1BBVFRFUk5TIH0gZnJvbSAnLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBQYXRoVmFsaWRhdG9yIH0gZnJvbSAnLi9zZWN1cml0eS9wYXRoVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFlhbWxWYWxpZGF0b3IgfSBmcm9tICcuL3NlY3VyaXR5L3lhbWxWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBbm9ueW1vdXNJZCwgZ2VuZXJhdGVVbmlxdWVJZCwgc2x1Z2lmeSB9IGZyb20gJy4vdXRpbHMvZmlsZXN5c3RlbS5qcyc7XG5pbXBvcnQgeyBQZXJzb25hTWFuYWdlciB9IGZyb20gJy4vcGVyc29uYS9QZXJzb25hTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBHaXRIdWJDbGllbnQsIENvbGxlY3Rpb25Ccm93c2VyLCBDb2xsZWN0aW9uU2VhcmNoLCBQZXJzb25hRGV0YWlscywgUGVyc29uYVN1Ym1pdHRlciwgRWxlbWVudEluc3RhbGxlciB9IGZyb20gJy4vY29sbGVjdGlvbi9pbmRleC5qcyc7XG5pbXBvcnQgeyBVcGRhdGVNYW5hZ2VyIH0gZnJvbSAnLi91cGRhdGUvaW5kZXguanMnO1xuaW1wb3J0IHsgU2VydmVyU2V0dXAsIElUb29sSGFuZGxlciB9IGZyb20gJy4vc2VydmVyL2luZGV4LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFBlcnNvbmFFeHBvcnRlciwgUGVyc29uYUltcG9ydGVyLCBQZXJzb25hU2hhcmVyIH0gZnJvbSAnLi9wZXJzb25hL2V4cG9ydC1pbXBvcnQvaW5kZXguanMnO1xuaW1wb3J0IHsgaXNEZWZhdWx0UGVyc29uYSB9IGZyb20gJy4vY29uc3RhbnRzL2RlZmF1bHRQZXJzb25hcy5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyLCBFbGVtZW50VHlwZSB9IGZyb20gJy4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgTWlncmF0aW9uTWFuYWdlciB9IGZyb20gJy4vcG9ydGZvbGlvL01pZ3JhdGlvbk1hbmFnZXIuanMnO1xuXG5cblxuZXhwb3J0IGNsYXNzIERvbGxob3VzZU1DUFNlcnZlciBpbXBsZW1lbnRzIElUb29sSGFuZGxlciB7XG4gIHByaXZhdGUgc2VydmVyOiBTZXJ2ZXI7XG4gIHByaXZhdGUgcGVyc29uYXNEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSBwZXJzb25hczogTWFwPHN0cmluZywgUGVyc29uYT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgYWN0aXZlUGVyc29uYTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFVzZXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFwaUNhY2hlOiBBUElDYWNoZSA9IG5ldyBBUElDYWNoZSgpO1xuICBwcml2YXRlIHJhdGVMaW1pdFRyYWNrZXIgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCk7XG4gIHByaXZhdGUgaW5kaWNhdG9yQ29uZmlnOiBJbmRpY2F0b3JDb25maWc7XG4gIHByaXZhdGUgcGVyc29uYU1hbmFnZXI6IFBlcnNvbmFNYW5hZ2VyO1xuICBwcml2YXRlIGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50O1xuICBwcml2YXRlIGNvbGxlY3Rpb25Ccm93c2VyOiBDb2xsZWN0aW9uQnJvd3NlcjtcbiAgcHJpdmF0ZSBjb2xsZWN0aW9uU2VhcmNoOiBDb2xsZWN0aW9uU2VhcmNoO1xuICBwcml2YXRlIHBlcnNvbmFEZXRhaWxzOiBQZXJzb25hRGV0YWlscztcbiAgcHJpdmF0ZSBlbGVtZW50SW5zdGFsbGVyOiBFbGVtZW50SW5zdGFsbGVyO1xuICBwcml2YXRlIHBlcnNvbmFTdWJtaXR0ZXI6IFBlcnNvbmFTdWJtaXR0ZXI7XG4gIHByaXZhdGUgdXBkYXRlTWFuYWdlcjogVXBkYXRlTWFuYWdlcjtcbiAgcHJpdmF0ZSBzZXJ2ZXJTZXR1cDogU2VydmVyU2V0dXA7XG4gIHByaXZhdGUgcGVyc29uYUV4cG9ydGVyOiBQZXJzb25hRXhwb3J0ZXI7XG4gIHByaXZhdGUgcGVyc29uYUltcG9ydGVyOiBQZXJzb25hSW1wb3J0ZXI7XG4gIHByaXZhdGUgcGVyc29uYVNoYXJlcjogUGVyc29uYVNoYXJlcjtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcml2YXRlIG1pZ3JhdGlvbk1hbmFnZXI6IE1pZ3JhdGlvbk1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zZXJ2ZXIgPSBuZXcgU2VydmVyKFxuICAgICAge1xuICAgICAgICBuYW1lOiBcImRvbGxob3VzZW1jcFwiLFxuICAgICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICB0b29sczoge30sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEluaXRpYWxpemUgcG9ydGZvbGlvIHN5c3RlbVxuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB0aGlzLm1pZ3JhdGlvbk1hbmFnZXIgPSBuZXcgTWlncmF0aW9uTWFuYWdlcih0aGlzLnBvcnRmb2xpb01hbmFnZXIpO1xuICAgIFxuICAgIC8vIFVzZSBwb3J0Zm9saW8gcGVyc29uYXMgZGlyZWN0b3J5XG4gICAgdGhpcy5wZXJzb25hc0RpciA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLlBFUlNPTkEpO1xuICAgIFxuICAgIC8vIExvZyByZXNvbHZlZCBwYXRoIGZvciBkZWJ1Z2dpbmdcbiAgICBsb2dnZXIuaW5mbyhgUGVyc29uYXMgZGlyZWN0b3J5IHJlc29sdmVkIHRvOiAke3RoaXMucGVyc29uYXNEaXJ9YCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBQYXRoVmFsaWRhdG9yIHdpdGggdGhlIHBlcnNvbmFzIGRpcmVjdG9yeVxuICAgIFBhdGhWYWxpZGF0b3IuaW5pdGlhbGl6ZSh0aGlzLnBlcnNvbmFzRGlyKTtcbiAgICBcbiAgICAvLyBMb2FkIHVzZXIgaWRlbnRpdHkgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICB0aGlzLmN1cnJlbnRVc2VyID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1VTRVIgfHwgbnVsbDtcbiAgICBcbiAgICAvLyBMb2FkIGluZGljYXRvciBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5pbmRpY2F0b3JDb25maWcgPSBsb2FkSW5kaWNhdG9yQ29uZmlnKCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBwZXJzb25hIG1hbmFnZXJcbiAgICB0aGlzLnBlcnNvbmFNYW5hZ2VyID0gbmV3IFBlcnNvbmFNYW5hZ2VyKHRoaXMucGVyc29uYXNEaXIsIHRoaXMuaW5kaWNhdG9yQ29uZmlnKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGNvbGxlY3Rpb24gbW9kdWxlc1xuICAgIHRoaXMuZ2l0aHViQ2xpZW50ID0gbmV3IEdpdEh1YkNsaWVudCh0aGlzLmFwaUNhY2hlLCB0aGlzLnJhdGVMaW1pdFRyYWNrZXIpO1xuICAgIHRoaXMuY29sbGVjdGlvbkJyb3dzZXIgPSBuZXcgQ29sbGVjdGlvbkJyb3dzZXIodGhpcy5naXRodWJDbGllbnQpO1xuICAgIHRoaXMuY29sbGVjdGlvblNlYXJjaCA9IG5ldyBDb2xsZWN0aW9uU2VhcmNoKHRoaXMuZ2l0aHViQ2xpZW50KTtcbiAgICB0aGlzLnBlcnNvbmFEZXRhaWxzID0gbmV3IFBlcnNvbmFEZXRhaWxzKHRoaXMuZ2l0aHViQ2xpZW50KTtcbiAgICB0aGlzLmVsZW1lbnRJbnN0YWxsZXIgPSBuZXcgRWxlbWVudEluc3RhbGxlcih0aGlzLmdpdGh1YkNsaWVudCk7XG4gICAgdGhpcy5wZXJzb25hU3VibWl0dGVyID0gbmV3IFBlcnNvbmFTdWJtaXR0ZXIoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHVwZGF0ZSBtYW5hZ2VyXG4gICAgdGhpcy51cGRhdGVNYW5hZ2VyID0gbmV3IFVwZGF0ZU1hbmFnZXIoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGV4cG9ydC9pbXBvcnQvc2hhcmUgbW9kdWxlc1xuICAgIHRoaXMucGVyc29uYUV4cG9ydGVyID0gbmV3IFBlcnNvbmFFeHBvcnRlcih0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICB0aGlzLnBlcnNvbmFJbXBvcnRlciA9IG5ldyBQZXJzb25hSW1wb3J0ZXIodGhpcy5wZXJzb25hc0RpciwgdGhpcy5jdXJyZW50VXNlcik7XG4gICAgdGhpcy5wZXJzb25hU2hhcmVyID0gbmV3IFBlcnNvbmFTaGFyZXIodGhpcy5naXRodWJDbGllbnQsIHRoaXMuY3VycmVudFVzZXIpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgc2VydmVyIHNldHVwXG4gICAgdGhpcy5zZXJ2ZXJTZXR1cCA9IG5ldyBTZXJ2ZXJTZXR1cCgpO1xuICAgIHRoaXMuc2VydmVyU2V0dXAuc2V0dXBTZXJ2ZXIodGhpcy5zZXJ2ZXIsIHRoaXMpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgcG9ydGZvbGlvIGFuZCBwZXJmb3JtIG1pZ3JhdGlvbiBpZiBuZWVkZWRcbiAgICB0aGlzLmluaXRpYWxpemVQb3J0Zm9saW8oKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMubG9hZFBlcnNvbmFzKCk7XG4gICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwb3J0Zm9saW86ICR7ZXJyb3J9YCk7XG4gICAgfSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVBvcnRmb2xpbygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBtaWdyYXRpb24gaXMgbmVlZGVkXG4gICAgY29uc3QgbmVlZHNNaWdyYXRpb24gPSBhd2FpdCB0aGlzLm1pZ3JhdGlvbk1hbmFnZXIubmVlZHNNaWdyYXRpb24oKTtcbiAgICBcbiAgICBpZiAobmVlZHNNaWdyYXRpb24pIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdMZWdhY3kgcGVyc29uYXMgZGV0ZWN0ZWQuIFN0YXJ0aW5nIG1pZ3JhdGlvbi4uLicpO1xuICAgICAgXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1pZ3JhdGlvbk1hbmFnZXIubWlncmF0ZSh7IGJhY2t1cDogdHJ1ZSB9KTtcbiAgICAgIFxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBTdWNjZXNzZnVsbHkgbWlncmF0ZWQgJHtyZXN1bHQubWlncmF0ZWRDb3VudH0gcGVyc29uYXNgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5iYWNrZWRVcCAmJiByZXN1bHQuYmFja3VwUGF0aCkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGBCYWNrdXAgY3JlYXRlZCBhdDogJHtyZXN1bHQuYmFja3VwUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdNaWdyYXRpb24gY29tcGxldGVkIHdpdGggZXJyb3JzOicpO1xuICAgICAgICByZXN1bHQuZXJyb3JzLmZvckVhY2goZXJyID0+IGxvZ2dlci5lcnJvcihgICAtICR7ZXJyfWApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIHBvcnRmb2xpbyBzdHJ1Y3R1cmUgZXhpc3RzXG4gICAgY29uc3QgcG9ydGZvbGlvRXhpc3RzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmV4aXN0cygpO1xuICAgIGlmICghcG9ydGZvbGlvRXhpc3RzKSB7XG4gICAgICBsb2dnZXIuaW5mbygnQ3JlYXRpbmcgcG9ydGZvbGlvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuLi4nKTtcbiAgICAgIGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5pbml0aWFsaXplKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVG9vbCBoYW5kbGVyIG1ldGhvZHMgLSBub3cgcHVibGljIGZvciBhY2Nlc3MgZnJvbSB0b29sIG1vZHVsZXNcbiAgXG4gIHByaXZhdGUgZ2V0UGVyc29uYUluZGljYXRvcigpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5hY3RpdmVQZXJzb25hKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBjb25zdCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQodGhpcy5hY3RpdmVQZXJzb25hKTtcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXRJbmRpY2F0b3IodGhpcy5pbmRpY2F0b3JDb25maWcsIHtcbiAgICAgIG5hbWU6IHBlcnNvbmEubWV0YWRhdGEubmFtZSxcbiAgICAgIHZlcnNpb246IHBlcnNvbmEubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogcGVyc29uYS5tZXRhZGF0YS5hdXRob3IsXG4gICAgICBjYXRlZ29yeTogcGVyc29uYS5tZXRhZGF0YS5jYXRlZ29yeVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkUGVyc29uYXMoKSB7XG4gICAgLy8gVmFsaWRhdGUgdGhlIHBlcnNvbmFzIGRpcmVjdG9yeSBwYXRoXG4gICAgaWYgKCFwYXRoLmlzQWJzb2x1dGUodGhpcy5wZXJzb25hc0RpcikpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBQZXJzb25hcyBkaXJlY3RvcnkgcGF0aCBpcyBub3QgYWJzb2x1dGU6ICR7dGhpcy5wZXJzb25hc0Rpcn1gKTtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2Vzcyh0aGlzLnBlcnNvbmFzRGlyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQ3JlYXRlIHBlcnNvbmFzIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5ta2Rpcih0aGlzLnBlcnNvbmFzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYENyZWF0ZWQgcGVyc29uYXMgZGlyZWN0b3J5IGF0OiAke3RoaXMucGVyc29uYXNEaXJ9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKG1rZGlyRXJyb3I6IGFueSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgcGVyc29uYXMgZGlyZWN0b3J5IGF0ICR7dGhpcy5wZXJzb25hc0Rpcn06ICR7bWtkaXJFcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgcGVyc29uYXMgZGlyZWN0b3J5OiAke21rZGlyRXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHRoaXMucGVyc29uYXNEaXIpO1xuICAgICAgY29uc3QgbWFya2Rvd25GaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGUuZW5kc1dpdGgoJy5tZCcpKTtcblxuICAgICAgdGhpcy5wZXJzb25hcy5jbGVhcigpO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgbWFya2Rvd25GaWxlcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMucGVyc29uYXNEaXIsIGZpbGUpO1xuICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgUGF0aFZhbGlkYXRvci5zYWZlUmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFVzZSBzZWN1cmUgWUFNTCBwYXJzZXJcbiAgICAgICAgICBsZXQgcGFyc2VkO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnNhZmVNYXR0ZXIoZmlsZUNvbnRlbnQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZWN1cml0eUVycm9yKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBTZWN1cml0eSB0aHJlYXQgZGV0ZWN0ZWQgaW4gcGVyc29uYSAke2ZpbGV9OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gcGFyc2VkLmRhdGEgYXMgUGVyc29uYU1ldGFkYXRhO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBwYXJzZWQuY29udGVudDtcblxuICAgICAgICAgIGlmICghbWV0YWRhdGEubmFtZSkge1xuICAgICAgICAgICAgbWV0YWRhdGEubmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZSwgJy5tZCcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEdlbmVyYXRlIHVuaXF1ZSBJRCBpZiBub3QgcHJlc2VudFxuICAgICAgICAgIGxldCB1bmlxdWVJZCA9IG1ldGFkYXRhLnVuaXF1ZV9pZDtcbiAgICAgICAgICBpZiAoIXVuaXF1ZUlkKSB7XG4gICAgICAgICAgICBjb25zdCBhdXRob3JGb3JJZCA9IG1ldGFkYXRhLmF1dGhvciB8fCB0aGlzLmdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTtcbiAgICAgICAgICAgIHVuaXF1ZUlkID0gZ2VuZXJhdGVVbmlxdWVJZChtZXRhZGF0YS5uYW1lLCBhdXRob3JGb3JJZCk7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEdlbmVyYXRlZCB1bmlxdWUgSUQgZm9yICR7bWV0YWRhdGEubmFtZX06ICR7dW5pcXVlSWR9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2V0IGRlZmF1bHQgdmFsdWVzIGZvciBuZXcgbWV0YWRhdGEgZmllbGRzXG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5jYXRlZ29yeSkgbWV0YWRhdGEuY2F0ZWdvcnkgPSAnZ2VuZXJhbCc7XG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5hZ2VfcmF0aW5nKSBtZXRhZGF0YS5hZ2VfcmF0aW5nID0gJ2FsbCc7XG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5jb250ZW50X2ZsYWdzKSBtZXRhZGF0YS5jb250ZW50X2ZsYWdzID0gW107XG4gICAgICAgICAgaWYgKG1ldGFkYXRhLmFpX2dlbmVyYXRlZCA9PT0gdW5kZWZpbmVkKSBtZXRhZGF0YS5haV9nZW5lcmF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLmdlbmVyYXRpb25fbWV0aG9kKSBtZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZCA9ICdodW1hbic7XG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5wcmljZSkgbWV0YWRhdGEucHJpY2UgPSAnZnJlZSc7XG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5saWNlbnNlKSBtZXRhZGF0YS5saWNlbnNlID0gJ0NDLUJZLVNBLTQuMCc7XG5cbiAgICAgICAgICBjb25zdCBwZXJzb25hOiBQZXJzb25hID0ge1xuICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGUsXG4gICAgICAgICAgICB1bmlxdWVfaWQ6IHVuaXF1ZUlkLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0aGlzLnBlcnNvbmFzLnNldChmaWxlLCBwZXJzb25hKTtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYExvYWRlZCBwZXJzb25hOiAke21ldGFkYXRhLm5hbWV9ICgke3VuaXF1ZUlkfWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgRXJyb3IgbG9hZGluZyBwZXJzb25hICR7ZmlsZX06ICR7ZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBFcnJvciByZWFkaW5nIHBlcnNvbmFzIGRpcmVjdG9yeTogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsaXN0UGVyc29uYXMoKSB7XG4gICAgY29uc3QgcGVyc29uYUxpc3QgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLm1hcChwZXJzb25hID0+ICh7XG4gICAgICBmaWxlbmFtZTogcGVyc29uYS5maWxlbmFtZSxcbiAgICAgIHVuaXF1ZV9pZDogcGVyc29uYS51bmlxdWVfaWQsXG4gICAgICBuYW1lOiBwZXJzb25hLm1ldGFkYXRhLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogcGVyc29uYS5tZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIHRyaWdnZXJzOiBwZXJzb25hLm1ldGFkYXRhLnRyaWdnZXJzIHx8IFtdLFxuICAgICAgdmVyc2lvbjogcGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uIHx8IFwiMS4wXCIsXG4gICAgICBhdXRob3I6IHBlcnNvbmEubWV0YWRhdGEuYXV0aG9yIHx8IFwiVW5rbm93blwiLFxuICAgICAgY2F0ZWdvcnk6IHBlcnNvbmEubWV0YWRhdGEuY2F0ZWdvcnkgfHwgJ2dlbmVyYWwnLFxuICAgICAgYWdlX3JhdGluZzogcGVyc29uYS5tZXRhZGF0YS5hZ2VfcmF0aW5nIHx8ICdhbGwnLFxuICAgICAgcHJpY2U6IHBlcnNvbmEubWV0YWRhdGEucHJpY2UgfHwgJ2ZyZWUnLFxuICAgICAgYWlfZ2VuZXJhdGVkOiBwZXJzb25hLm1ldGFkYXRhLmFpX2dlbmVyYXRlZCB8fCBmYWxzZSxcbiAgICAgIGFjdGl2ZTogdGhpcy5hY3RpdmVQZXJzb25hID09PSBwZXJzb25hLmZpbGVuYW1lLFxuICAgIH0pKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX1BdmFpbGFibGUgUGVyc29uYXMgKCR7cGVyc29uYUxpc3QubGVuZ3RofSk6XFxuXFxuYCArXG4gICAgICAgICAgICBwZXJzb25hTGlzdC5tYXAocCA9PiBcbiAgICAgICAgICAgICAgYCR7cC5hY3RpdmUgPyAn8J+UuSAnIDogJ+KWq++4jyAnfSoqJHtwLm5hbWV9KiogKCR7cC51bmlxdWVfaWR9KVxcbmAgK1xuICAgICAgICAgICAgICBgICAgJHtwLmRlc2NyaXB0aW9ufVxcbmAgK1xuICAgICAgICAgICAgICBgICAg8J+TgSAke3AuY2F0ZWdvcnl9IHwg8J+OrSAke3AuYXV0aG9yfSB8IPCflJYgJHtwLnByaWNlfSB8ICR7cC5haV9nZW5lcmF0ZWQgPyAn8J+kliBBSScgOiAn8J+RpCBIdW1hbid9XFxuYCArXG4gICAgICAgICAgICAgIGAgICBBZ2U6ICR7cC5hZ2VfcmF0aW5nfSB8IFZlcnNpb246ICR7cC52ZXJzaW9ufVxcbmAgK1xuICAgICAgICAgICAgICBgICAgVHJpZ2dlcnM6ICR7cC50cmlnZ2Vycy5qb2luKCcsICcpIHx8ICdOb25lJ31cXG5gXG4gICAgICAgICAgICApLmpvaW4oJ1xcbicpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgYWN0aXZhdGVQZXJzb25hKHBlcnNvbmFJZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAvLyBFbmhhbmNlZCBpbnB1dCB2YWxpZGF0aW9uIGZvciBwZXJzb25hIGlkZW50aWZpZXJcbiAgICBjb25zdCB2YWxpZGF0ZWRJZGVudGlmaWVyID0gTUNQSW5wdXRWYWxpZGF0b3IudmFsaWRhdGVQZXJzb25hSWRlbnRpZmllcihwZXJzb25hSWRlbnRpZmllcik7XG4gICAgXG4gICAgLy8gVHJ5IHRvIGZpbmQgcGVyc29uYSBieSBmaWxlbmFtZSBmaXJzdCwgdGhlbiBieSBuYW1lXG4gICAgbGV0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh2YWxpZGF0ZWRJZGVudGlmaWVyKTtcbiAgICBcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIC8vIFNlYXJjaCBieSBuYW1lXG4gICAgICBwZXJzb25hID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gXG4gICAgICAgIHAubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSB2YWxpZGF0ZWRJZGVudGlmaWVyLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICB0aHJvdyBuZXcgTWNwRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5JbnZhbGlkUGFyYW1zLFxuICAgICAgICBgUGVyc29uYSBub3QgZm91bmQ6ICR7cGVyc29uYUlkZW50aWZpZXJ9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2ZVBlcnNvbmEgPSBwZXJzb25hLmZpbGVuYW1lO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfVBlcnNvbmEgQWN0aXZhdGVkOiAqKiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfSoqXFxuXFxuYCArXG4gICAgICAgICAgICBgJHtwZXJzb25hLm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxcblxcbmAgK1xuICAgICAgICAgICAgYCoqSW5zdHJ1Y3Rpb25zOioqXFxuJHtwZXJzb25hLmNvbnRlbnR9YCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldEFjdGl2ZVBlcnNvbmEoKSB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZVBlcnNvbmEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfU5vIHBlcnNvbmEgaXMgY3VycmVudGx5IGFjdGl2ZS5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh0aGlzLmFjdGl2ZVBlcnNvbmEpO1xuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgdGhpcy5hY3RpdmVQZXJzb25hID0gbnVsbDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfUFjdGl2ZSBwZXJzb25hIG5vdCBmb3VuZC4gRGVhY3RpdmF0ZWQuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9QWN0aXZlIFBlcnNvbmE6ICoqJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9KipcXG5cXG5gICtcbiAgICAgICAgICAgIGAke3BlcnNvbmEubWV0YWRhdGEuZGVzY3JpcHRpb259XFxuXFxuYCArXG4gICAgICAgICAgICBgRmlsZTogJHtwZXJzb25hLmZpbGVuYW1lfVxcbmAgK1xuICAgICAgICAgICAgYFZlcnNpb246ICR7cGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAnfVxcbmAgK1xuICAgICAgICAgICAgYEF1dGhvcjogJHtwZXJzb25hLm1ldGFkYXRhLmF1dGhvciB8fCAnVW5rbm93bid9YCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlYWN0aXZhdGVQZXJzb25hKCkge1xuICAgIGNvbnN0IHdhc0FjdGl2ZSA9IHRoaXMuYWN0aXZlUGVyc29uYSAhPT0gbnVsbDtcbiAgICBjb25zdCBpbmRpY2F0b3IgPSB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKTtcbiAgICB0aGlzLmFjdGl2ZVBlcnNvbmEgPSBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IHdhc0FjdGl2ZSBcbiAgICAgICAgICAgID8gYCR7aW5kaWNhdG9yfeKchSBQZXJzb25hIGRlYWN0aXZhdGVkLiBCYWNrIHRvIGRlZmF1bHQgbW9kZS5gXG4gICAgICAgICAgICA6IFwiTm8gcGVyc29uYSB3YXMgYWN0aXZlLlwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0UGVyc29uYURldGFpbHMocGVyc29uYUlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIC8vIFRyeSB0byBmaW5kIHBlcnNvbmEgYnkgZmlsZW5hbWUgZmlyc3QsIHRoZW4gYnkgbmFtZVxuICAgIGxldCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQocGVyc29uYUlkZW50aWZpZXIpO1xuICAgIFxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgLy8gU2VhcmNoIGJ5IG5hbWVcbiAgICAgIHBlcnNvbmEgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLmZpbmQocCA9PiBcbiAgICAgICAgcC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBlcnNvbmFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICB0aHJvdyBuZXcgTWNwRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5JbnZhbGlkUGFyYW1zLFxuICAgICAgICBgUGVyc29uYSBub3QgZm91bmQ6ICR7cGVyc29uYUlkZW50aWZpZXJ9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+TiyAqKiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfSoqIERldGFpbHNcXG5cXG5gICtcbiAgICAgICAgICAgIGAqKkRlc2NyaXB0aW9uOioqICR7cGVyc29uYS5tZXRhZGF0YS5kZXNjcmlwdGlvbn1cXG5gICtcbiAgICAgICAgICAgIGAqKkZpbGU6KiogJHtwZXJzb25hLmZpbGVuYW1lfVxcbmAgK1xuICAgICAgICAgICAgYCoqVmVyc2lvbjoqKiAke3BlcnNvbmEubWV0YWRhdGEudmVyc2lvbiB8fCAnMS4wJ31cXG5gICtcbiAgICAgICAgICAgIGAqKkF1dGhvcjoqKiAke3BlcnNvbmEubWV0YWRhdGEuYXV0aG9yIHx8ICdVbmtub3duJ31cXG5gICtcbiAgICAgICAgICAgIGAqKlRyaWdnZXJzOioqICR7cGVyc29uYS5tZXRhZGF0YS50cmlnZ2Vycz8uam9pbignLCAnKSB8fCAnTm9uZSd9XFxuXFxuYCArXG4gICAgICAgICAgICBgKipGdWxsIENvbnRlbnQ6KipcXG5cXGBcXGBcXGBcXG4ke3BlcnNvbmEuY29udGVudH1cXG5cXGBcXGBcXGBgLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcmVsb2FkUGVyc29uYXMoKSB7XG4gICAgYXdhaXQgdGhpcy5sb2FkUGVyc29uYXMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+UhCBSZWxvYWRlZCAke3RoaXMucGVyc29uYXMuc2l6ZX0gcGVyc29uYXMgZnJvbSAke3RoaXMucGVyc29uYXNEaXJ9YCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIGNoZWNrUmF0ZUxpbWl0IGFuZCBmZXRjaEZyb21HaXRIdWIgYXJlIG5vdyBoYW5kbGVkIGJ5IEdpdEh1YkNsaWVudFxuXG4gIGFzeW5jIGJyb3dzZUNvbGxlY3Rpb24oc2VjdGlvbj86IHN0cmluZywgdHlwZT86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbmhhbmNlZCBpbnB1dCB2YWxpZGF0aW9uIGZvciBzZWN0aW9uIGFuZCB0eXBlXG4gICAgICBjb25zdCB2YWxpZGF0ZWRTZWN0aW9uID0gc2VjdGlvbiA/IHZhbGlkYXRlQ2F0ZWdvcnkoc2VjdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB2YWxpZGF0ZWRUeXBlID0gdHlwZSA/IHZhbGlkYXRlQ2F0ZWdvcnkodHlwZSkgOiB1bmRlZmluZWQ7XG4gICAgICBcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29sbGVjdGlvbkJyb3dzZXIuYnJvd3NlQ29sbGVjdGlvbih2YWxpZGF0ZWRTZWN0aW9uLCB2YWxpZGF0ZWRUeXBlKTtcbiAgICAgIFxuICAgICAgLy8gSGFuZGxlIHNlY3Rpb25zIHZpZXdcbiAgICAgIGNvbnN0IGl0ZW1zID0gcmVzdWx0Lml0ZW1zO1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IHJlc3VsdC5zZWN0aW9ucyB8fCByZXN1bHQuY2F0ZWdvcmllcztcbiAgICAgIFxuICAgICAgY29uc3QgdGV4dCA9IHRoaXMuY29sbGVjdGlvbkJyb3dzZXIuZm9ybWF0QnJvd3NlUmVzdWx0cyhcbiAgICAgICAgaXRlbXMsIFxuICAgICAgICBjYXRlZ29yaWVzLCBcbiAgICAgICAgdmFsaWRhdGVkU2VjdGlvbiwgXG4gICAgICAgIHZhbGlkYXRlZFR5cGUsIFxuICAgICAgICB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIENvbGxlY3Rpb24gYnJvd3NpbmcgZmFpbGVkOiAke3Nhbml0aXplZC5tZXNzYWdlfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2VhcmNoQ29sbGVjdGlvbihxdWVyeTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuaGFuY2VkIGlucHV0IHZhbGlkYXRpb24gZm9yIHNlYXJjaCBxdWVyeVxuICAgICAgY29uc3QgdmFsaWRhdGVkUXVlcnkgPSBNQ1BJbnB1dFZhbGlkYXRvci52YWxpZGF0ZVNlYXJjaFF1ZXJ5KHF1ZXJ5KTtcbiAgICAgIFxuICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25TZWFyY2guc2VhcmNoQ29sbGVjdGlvbih2YWxpZGF0ZWRRdWVyeSk7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5jb2xsZWN0aW9uU2VhcmNoLmZvcm1hdFNlYXJjaFJlc3VsdHMoaXRlbXMsIHZhbGlkYXRlZFF1ZXJ5LCB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBFcnJvciBzZWFyY2hpbmcgY29sbGVjdGlvbjogJHtzYW5pdGl6ZWQubWVzc2FnZX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldENvbGxlY3Rpb25Db250ZW50KHBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IG1ldGFkYXRhLCBjb250ZW50IH0gPSBhd2FpdCB0aGlzLnBlcnNvbmFEZXRhaWxzLmdldENvbGxlY3Rpb25Db250ZW50KHBhdGgpO1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMucGVyc29uYURldGFpbHMuZm9ybWF0UGVyc29uYURldGFpbHMobWV0YWRhdGEsIGNvbnRlbnQsIHBhdGgsIHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEVycm9yIGZldGNoaW5nIGNvbnRlbnQ6ICR7c2FuaXRpemVkLm1lc3NhZ2V9YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbnN0YWxsQ29udGVudChpbnB1dFBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmVsZW1lbnRJbnN0YWxsZXIuaW5zdGFsbENvbnRlbnQoaW5wdXRQYXRoKTtcbiAgICAgIFxuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDimqDvuI8gJHtyZXN1bHQubWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBpdCdzIGEgcGVyc29uYSwgcmVsb2FkIHBlcnNvbmFzXG4gICAgICBpZiAocmVzdWx0LmVsZW1lbnRUeXBlID09PSBFbGVtZW50VHlwZS5QRVJTT05BKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFBlcnNvbmFzKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmVsZW1lbnRJbnN0YWxsZXIuZm9ybWF0SW5zdGFsbFN1Y2Nlc3MoXG4gICAgICAgIHJlc3VsdC5tZXRhZGF0YSEsIFxuICAgICAgICByZXN1bHQuZmlsZW5hbWUhLFxuICAgICAgICByZXN1bHQuZWxlbWVudFR5cGUhXG4gICAgICApO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRXJyb3IgaW5zdGFsbGluZyBBSSBjdXN0b21pemF0aW9uIGVsZW1lbnQ6ICR7c2FuaXRpemVkLm1lc3NhZ2V9YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdWJtaXRDb250ZW50KGNvbnRlbnRJZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAvLyBGaW5kIHRoZSBjb250ZW50IGluIGxvY2FsIGNvbGxlY3Rpb25cbiAgICBsZXQgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KGNvbnRlbnRJZGVudGlmaWVyKTtcbiAgICBcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIC8vIFNlYXJjaCBieSBuYW1lXG4gICAgICBwZXJzb25hID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gXG4gICAgICAgIHAubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBjb250ZW50SWRlbnRpZmllci50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIENvbnRlbnQgbm90IGZvdW5kOiAke2NvbnRlbnRJZGVudGlmaWVyfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgcGVyc29uYSBjb250ZW50IGJlZm9yZSBzdWJtaXNzaW9uXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlYWQgdGhlIGZ1bGwgcGVyc29uYSBmaWxlIGNvbnRlbnRcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHRoaXMucGVyc29uYXNEaXIsIHBlcnNvbmEuZmlsZW5hbWUpO1xuICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBQYXRoVmFsaWRhdG9yLnNhZmVSZWFkRmlsZShmdWxsUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGNvbnRlbnQgZm9yIHNlY3VyaXR5IHRocmVhdHNcbiAgICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGZpbGVDb250ZW50KTtcbiAgICAgIGlmICghY29udGVudFZhbGlkYXRpb24uaXNWYWxpZCAmJiBjb250ZW50VmFsaWRhdGlvbi5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKlNlY3VyaXR5IFZhbGlkYXRpb24gRmFpbGVkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFRoaXMgcGVyc29uYSBjb250YWlucyBjb250ZW50IHRoYXQgY291bGQgYmUgdXNlZCBmb3IgcHJvbXB0IGluamVjdGlvbiBhdHRhY2tzOlxcbmAgK1xuICAgICAgICAgICAgICBg4oCiICR7Y29udGVudFZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignXFxu4oCiICcpfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIHJlbW92ZSB0aGVzZSBwYXR0ZXJucyBiZWZvcmUgc3VibWl0dGluZyB0byB0aGUgY29sbGVjdGlvbi5gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBtZXRhZGF0YVxuICAgICAgY29uc3QgbWV0YWRhdGFWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZU1ldGFkYXRhKHBlcnNvbmEubWV0YWRhdGEpO1xuICAgICAgaWYgKCFtZXRhZGF0YVZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKaoO+4jyAqKk1ldGFkYXRhIFNlY3VyaXR5IFdhcm5pbmcqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgVGhlIHBlcnNvbmEgbWV0YWRhdGEgY29udGFpbnMgcG90ZW50aWFsbHkgcHJvYmxlbWF0aWMgY29udGVudDpcXG5gICtcbiAgICAgICAgICAgICAgYOKAoiAke21ldGFkYXRhVmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCdcXG7igKIgJyl9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGBQbGVhc2UgZml4IHRoZXNlIGlzc3VlcyBiZWZvcmUgc3VibWl0dGluZy5gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRXJyb3IgdmFsaWRhdGluZyBwZXJzb25hOiAke3Nhbml0aXplZC5tZXNzYWdlfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBnaXRodWJJc3N1ZVVybCB9ID0gdGhpcy5wZXJzb25hU3VibWl0dGVyLmdlbmVyYXRlU3VibWlzc2lvbklzc3VlKHBlcnNvbmEpO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnBlcnNvbmFTdWJtaXR0ZXIuZm9ybWF0U3VibWlzc2lvblJlc3BvbnNlKHBlcnNvbmEsIGdpdGh1Yklzc3VlVXJsLCB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogdGV4dCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFVzZXIgaWRlbnRpdHkgbWFuYWdlbWVudFxuICBhc3luYyBzZXRVc2VySWRlbnRpdHkodXNlcm5hbWU6IHN0cmluZywgZW1haWw/OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF1c2VybmFtZSB8fCB1c2VybmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIFVzZXJuYW1lIGNhbm5vdCBiZSBlbXB0eWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSB1c2VybmFtZVxuICAgICAgY29uc3QgdmFsaWRhdGVkVXNlcm5hbWUgPSB2YWxpZGF0ZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgZW1haWwgaWYgcHJvdmlkZWRcbiAgICAgIGxldCB2YWxpZGF0ZWRFbWFpbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGVtYWlsKSB7XG4gICAgICAgIGNvbnN0IHNhbml0aXplZEVtYWlsID0gc2FuaXRpemVJbnB1dChlbWFpbCwgMTAwKTtcbiAgICAgICAgaWYgKCFWQUxJREFUSU9OX1BBVFRFUk5TLlNBRkVfRU1BSUwudGVzdChzYW5pdGl6ZWRFbWFpbCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZW1haWwgZm9ybWF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRhdGVkRW1haWwgPSBzYW5pdGl6ZWRFbWFpbDtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSB2YWxpZGF0ZWQgdXNlciBpZGVudGl0eVxuICAgICAgdGhpcy5jdXJyZW50VXNlciA9IHZhbGlkYXRlZFVzZXJuYW1lO1xuICAgICAgaWYgKHZhbGlkYXRlZEVtYWlsKSB7XG4gICAgICAgIHByb2Nlc3MuZW52LkRPTExIT1VTRV9FTUFJTCA9IHZhbGlkYXRlZEVtYWlsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgKipVc2VyIElkZW50aXR5IFNldCoqXFxuXFxuYCArXG4gICAgICAgICAgICBg8J+RpCAqKlVzZXJuYW1lOioqICR7dmFsaWRhdGVkVXNlcm5hbWV9XFxuYCArXG4gICAgICAgICAgICBgJHt2YWxpZGF0ZWRFbWFpbCA/IGDwn5OnICoqRW1haWw6KiogJHt2YWxpZGF0ZWRFbWFpbH1cXG5gIDogJyd9YCArXG4gICAgICAgICAgICBgXFxu8J+OryAqKk5leHQgU3RlcHM6KipcXG5gICtcbiAgICAgICAgICAgIGDigKIgTmV3IHBlcnNvbmFzIHlvdSBjcmVhdGUgd2lsbCBiZSBhdHRyaWJ1dGVkIHRvIFwiJHt2YWxpZGF0ZWRVc2VybmFtZX1cIlxcbmAgK1xuICAgICAgICAgICAgYOKAoiBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgXFxgRE9MTEhPVVNFX1VTRVI9JHt2YWxpZGF0ZWRVc2VybmFtZX1cXGAgdG8gcGVyc2lzdCB0aGlzIHNldHRpbmdcXG5gICtcbiAgICAgICAgICAgIGAke3ZhbGlkYXRlZEVtYWlsID8gYOKAoiBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgXFxgRE9MTEhPVVNFX0VNQUlMPSR7dmFsaWRhdGVkRW1haWx9XFxgIGZvciBjb250YWN0IGluZm9cXG5gIDogJyd9YCArXG4gICAgICAgICAgICBg4oCiIFVzZSBcXGBjbGVhcl91c2VyX2lkZW50aXR5XFxgIHRvIHJldHVybiB0byBhbm9ueW1vdXMgbW9kZWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKlZhbGlkYXRpb24gRXJyb3IqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgJHtzYW5pdGl6ZWQubWVzc2FnZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFBsZWFzZSBwcm92aWRlIGEgdmFsaWQgdXNlcm5hbWUgKGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgZG90cyBvbmx5KS5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFVzZXJJZGVudGl0eSgpIHtcbiAgICBjb25zdCBlbWFpbCA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9FTUFJTDtcbiAgICBcbiAgICBpZiAoIXRoaXMuY3VycmVudFVzZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCfkaQgKipVc2VyIElkZW50aXR5OiBBbm9ueW1vdXMqKlxcblxcbmAgK1xuICAgICAgICAgICAgYPCflJIgKipTdGF0dXM6KiogQW5vbnltb3VzIG1vZGVcXG5gICtcbiAgICAgICAgICAgIGDwn5OdICoqQXR0cmlidXRpb246KiogUGVyc29uYXMgd2lsbCB1c2UgYW5vbnltb3VzIElEc1xcblxcbmAgK1xuICAgICAgICAgICAgYCoqVG8gc2V0IHlvdXIgaWRlbnRpdHk6KipcXG5gICtcbiAgICAgICAgICAgIGDigKIgVXNlOiBcXGBzZXRfdXNlcl9pZGVudGl0eSBcInlvdXItdXNlcm5hbWVcIlxcYFxcbmAgK1xuICAgICAgICAgICAgYOKAoiBPciBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGU6IFxcYERPTExIT1VTRV9VU0VSPXlvdXItdXNlcm5hbWVcXGBgLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3wn5GkICoqVXNlciBJZGVudGl0eTogJHt0aGlzLmN1cnJlbnRVc2VyfSoqXFxuXFxuYCArXG4gICAgICAgICAgYOKchSAqKlN0YXR1czoqKiBBdXRoZW50aWNhdGVkXFxuYCArXG4gICAgICAgICAgYPCfkaQgKipVc2VybmFtZToqKiAke3RoaXMuY3VycmVudFVzZXJ9XFxuYCArXG4gICAgICAgICAgYCR7ZW1haWwgPyBg8J+TpyAqKkVtYWlsOioqICR7ZW1haWx9XFxuYCA6ICcnfWAgK1xuICAgICAgICAgIGDwn5OdICoqQXR0cmlidXRpb246KiogTmV3IHBlcnNvbmFzIHdpbGwgYmUgY3JlZGl0ZWQgdG8gXCIke3RoaXMuY3VycmVudFVzZXJ9XCJcXG5cXG5gICtcbiAgICAgICAgICBgKipFbnZpcm9ubWVudCBWYXJpYWJsZXM6KipcXG5gICtcbiAgICAgICAgICBg4oCiIFxcYERPTExIT1VTRV9VU0VSPSR7dGhpcy5jdXJyZW50VXNlcn1cXGBcXG5gICtcbiAgICAgICAgICBgJHtlbWFpbCA/IGDigKIgXFxgRE9MTEhPVVNFX0VNQUlMPSR7ZW1haWx9XFxgXFxuYCA6ICcnfWAgK1xuICAgICAgICAgIGBcXG4qKk1hbmFnZW1lbnQ6KipcXG5gICtcbiAgICAgICAgICBg4oCiIFVzZSBcXGBjbGVhcl91c2VyX2lkZW50aXR5XFxgIHRvIHJldHVybiB0byBhbm9ueW1vdXMgbW9kZVxcbmAgK1xuICAgICAgICAgIGDigKIgVXNlIFxcYHNldF91c2VyX2lkZW50aXR5IFwibmV3LXVzZXJuYW1lXCJcXGAgdG8gY2hhbmdlIHVzZXJuYW1lYCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyVXNlcklkZW50aXR5KCkge1xuICAgIGNvbnN0IHdhc1NldCA9IHRoaXMuY3VycmVudFVzZXIgIT09IG51bGw7XG4gICAgY29uc3QgcHJldmlvdXNVc2VyID0gdGhpcy5jdXJyZW50VXNlcjtcbiAgICB0aGlzLmN1cnJlbnRVc2VyID0gbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiB3YXNTZXQgXG4gICAgICAgICAgICA/IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSAqKlVzZXIgSWRlbnRpdHkgQ2xlYXJlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGDwn5GkICoqUHJldmlvdXM6KiogJHtwcmV2aW91c1VzZXJ9XFxuYCArXG4gICAgICAgICAgICAgIGDwn5SSICoqQ3VycmVudDoqKiBBbm9ueW1vdXMgbW9kZVxcblxcbmAgK1xuICAgICAgICAgICAgICBg8J+TnSAqKkVmZmVjdDoqKiBOZXcgcGVyc29uYXMgd2lsbCB1c2UgYW5vbnltb3VzIElEc1xcblxcbmAgK1xuICAgICAgICAgICAgICBg4pqg77iPICoqTm90ZToqKiBUaGlzIG9ubHkgYWZmZWN0cyB0aGUgY3VycmVudCBzZXNzaW9uLlxcbmAgK1xuICAgICAgICAgICAgICBgVG8gcGVyc2lzdCB0aGlzIGNoYW5nZSwgdW5zZXQgdGhlIFxcYERPTExIT1VTRV9VU0VSXFxgIGVudmlyb25tZW50IHZhcmlhYmxlLmBcbiAgICAgICAgICAgIDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94oS577iPICoqQWxyZWFkeSBpbiBBbm9ueW1vdXMgTW9kZSoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGDwn5GkIE5vIHVzZXIgaWRlbnRpdHkgd2FzIHNldC5cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFVzZSBcXGBzZXRfdXNlcl9pZGVudGl0eSBcInVzZXJuYW1lXCJcXGAgdG8gc2V0IHlvdXIgaWRlbnRpdHkuYCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRVc2VyIHx8IGdlbmVyYXRlQW5vbnltb3VzSWQoKTtcbiAgfVxuXG4gIC8vIENoYXQtYmFzZWQgcGVyc29uYSBtYW5hZ2VtZW50IHRvb2xzXG4gIGFzeW5jIGNyZWF0ZVBlcnNvbmEobmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nLCBjYXRlZ29yeTogc3RyaW5nLCBpbnN0cnVjdGlvbnM6IHN0cmluZywgdHJpZ2dlcnM/OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzXG4gICAgICBpZiAoIW5hbWUgfHwgIWRlc2NyaXB0aW9uIHx8ICFjYXRlZ29yeSB8fCAhaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqTWlzc2luZyBSZXF1aXJlZCBGaWVsZHMqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGBQbGVhc2UgcHJvdmlkZSBhbGwgcmVxdWlyZWQgZmllbGRzOlxcbmAgK1xuICAgICAgICAgICAgICAgIGDigKIgKipuYW1lKio6IERpc3BsYXkgbmFtZSBmb3IgdGhlIHBlcnNvbmFcXG5gICtcbiAgICAgICAgICAgICAgICBg4oCiICoqZGVzY3JpcHRpb24qKjogQnJpZWYgZGVzY3JpcHRpb24gb2Ygd2hhdCBpdCBkb2VzXFxuYCArXG4gICAgICAgICAgICAgICAgYOKAoiAqKmNhdGVnb3J5Kio6IGNyZWF0aXZlLCBwcm9mZXNzaW9uYWwsIGVkdWNhdGlvbmFsLCBnYW1pbmcsIG9yIHBlcnNvbmFsXFxuYCArXG4gICAgICAgICAgICAgICAgYOKAoiAqKmluc3RydWN0aW9ucyoqOiBUaGUgcGVyc29uYSdzIGJlaGF2aW9yYWwgZ3VpZGVsaW5lc1xcblxcbmAgK1xuICAgICAgICAgICAgICAgIGAqKk9wdGlvbmFsOioqXFxuYCArXG4gICAgICAgICAgICAgICAgYOKAoiAqKnRyaWdnZXJzKio6IENvbW1hLXNlcGFyYXRlZCBrZXl3b3JkcyBmb3IgYWN0aXZhdGlvbmAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFNhbml0aXplIGFuZCB2YWxpZGF0ZSBpbnB1dHNcbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWREZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQoZGVzY3JpcHRpb24sIDUwMCk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRJbnN0cnVjdGlvbnMgPSBzYW5pdGl6ZUlucHV0KGluc3RydWN0aW9ucyk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRUcmlnZ2VycyA9IHRyaWdnZXJzID8gc2FuaXRpemVJbnB1dCh0cmlnZ2VycywgMjAwKSA6ICcnO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBuYW1lIGxlbmd0aCBhbmQgZm9ybWF0XG4gICAgICBpZiAoc2FuaXRpemVkTmFtZS5sZW5ndGggPCAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGVyc29uYSBuYW1lIG11c3QgYmUgYXQgbGVhc3QgMiBjaGFyYWN0ZXJzIGxvbmcnKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgY2F0ZWdvcnlcbiAgICAgIGNvbnN0IHZhbGlkYXRlZENhdGVnb3J5ID0gdmFsaWRhdGVDYXRlZ29yeShjYXRlZ29yeSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIGNvbnRlbnQgc2l6ZXNcbiAgICAgIHZhbGlkYXRlQ29udGVudFNpemUoc2FuaXRpemVkSW5zdHJ1Y3Rpb25zLCBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RIKTtcbiAgICAgIHZhbGlkYXRlQ29udGVudFNpemUoc2FuaXRpemVkRGVzY3JpcHRpb24sIDIwMDApOyAvLyAyS0IgbWF4IGZvciBkZXNjcmlwdGlvblxuXG4gICAgICAvLyBWYWxpZGF0ZSBjb250ZW50IGZvciBzZWN1cml0eSB0aHJlYXRzXG4gICAgICBjb25zdCBuYW1lVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIGlmICghbmFtZVZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5hbWUgY29udGFpbnMgcHJvaGliaXRlZCBjb250ZW50OiAke25hbWVWYWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlc2NWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKHNhbml0aXplZERlc2NyaXB0aW9uKTtcbiAgICAgIGlmICghZGVzY1ZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlc2NyaXB0aW9uIGNvbnRhaW5zIHByb2hpYml0ZWQgY29udGVudDogJHtkZXNjVmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnNWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKHNhbml0aXplZEluc3RydWN0aW9ucyk7XG4gICAgICBpZiAoIWluc3RydWN0aW9uc1ZhbGlkYXRpb24uaXNWYWxpZCAmJiBpbnN0cnVjdGlvbnNWYWxpZGF0aW9uLnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5zdHJ1Y3Rpb25zIGNvbnRhaW4gc2VjdXJpdHkgdGhyZWF0czogJHtpbnN0cnVjdGlvbnNWYWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIG1ldGFkYXRhXG4gICAgICBjb25zdCBhdXRob3IgPSB0aGlzLmdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTtcbiAgICAgIGNvbnN0IHVuaXF1ZUlkID0gZ2VuZXJhdGVVbmlxdWVJZChzYW5pdGl6ZWROYW1lLCB0aGlzLmN1cnJlbnRVc2VyIHx8IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHZhbGlkYXRlRmlsZW5hbWUoYCR7c2x1Z2lmeShzYW5pdGl6ZWROYW1lKX0ubWRgKTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMucGVyc29uYXNEaXIsIGZpbGVuYW1lKTtcblxuICAgIC8vIENoZWNrIGlmIGZpbGUgYWxyZWFkeSBleGlzdHNcbiAgICB0cnkge1xuICAgICAgYXdhaXQgUGF0aFZhbGlkYXRvci52YWxpZGF0ZVBlcnNvbmFQYXRoKGZpbGVQYXRoKTtcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3imqDvuI8gKipQZXJzb25hIEFscmVhZHkgRXhpc3RzKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYEEgcGVyc29uYSBmaWxlIG5hbWVkIFwiJHtmaWxlbmFtZX1cIiBhbHJlYWR5IGV4aXN0cy5cXG5gICtcbiAgICAgICAgICAgICAgYFVzZSBcXGBlZGl0X3BlcnNvbmFcXGAgdG8gbW9kaWZ5IGl0LCBvciBjaG9vc2UgYSBkaWZmZXJlbnQgbmFtZS5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBwcm9jZWVkIHdpdGggY3JlYXRpb25cbiAgICB9XG5cbiAgICAgIC8vIFBhcnNlIGFuZCBzYW5pdGl6ZSB0cmlnZ2Vyc1xuICAgICAgY29uc3QgdHJpZ2dlckxpc3QgPSBzYW5pdGl6ZWRUcmlnZ2VycyA/IFxuICAgICAgICBzYW5pdGl6ZWRUcmlnZ2Vycy5zcGxpdCgnLCcpLm1hcCh0ID0+IHNhbml0aXplSW5wdXQodC50cmltKCksIDUwKSkuZmlsdGVyKHQgPT4gdC5sZW5ndGggPiAwKSA6IFxuICAgICAgICBbXTtcblxuICAgICAgLy8gQ3JlYXRlIHBlcnNvbmEgbWV0YWRhdGEgd2l0aCBzYW5pdGl6ZWQgdmFsdWVzXG4gICAgICBjb25zdCBtZXRhZGF0YTogUGVyc29uYU1ldGFkYXRhID0ge1xuICAgICAgICBuYW1lOiBzYW5pdGl6ZWROYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogc2FuaXRpemVkRGVzY3JpcHRpb24sXG4gICAgICAgIHVuaXF1ZV9pZDogdW5pcXVlSWQsXG4gICAgICAgIGF1dGhvcixcbiAgICAgICAgdHJpZ2dlcnM6IHRyaWdnZXJMaXN0LFxuICAgICAgICB2ZXJzaW9uOiBcIjEuMFwiLFxuICAgICAgICBjYXRlZ29yeTogdmFsaWRhdGVkQ2F0ZWdvcnksXG4gICAgICAgIGFnZV9yYXRpbmc6IFwiYWxsXCIsXG4gICAgICAgIGNvbnRlbnRfZmxhZ3M6IFtcInVzZXItY3JlYXRlZFwiXSxcbiAgICAgICAgYWlfZ2VuZXJhdGVkOiB0cnVlLFxuICAgICAgICBnZW5lcmF0aW9uX21ldGhvZDogXCJDbGF1ZGVcIixcbiAgICAgICAgcHJpY2U6IFwiZnJlZVwiLFxuICAgICAgICByZXZlbnVlX3NwbGl0OiBcIjgwLzIwXCIsXG4gICAgICAgIGxpY2Vuc2U6IFwiQ0MtQlktU0EtNC4wXCIsXG4gICAgICAgIGNyZWF0ZWRfZGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKVxuICAgICAgfTtcblxuICAgICAgLy8gQ3JlYXRlIGZ1bGwgcGVyc29uYSBjb250ZW50IHdpdGggc2FuaXRpemVkIHZhbHVlc1xuICAgICAgY29uc3QgZnJvbnRtYXR0ZXIgPSBPYmplY3QuZW50cmllcyhtZXRhZGF0YSlcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9OiAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKVxuICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICAgIGNvbnN0IHBlcnNvbmFDb250ZW50ID0gYC0tLVxuJHtmcm9udG1hdHRlcn1cbi0tLVxuXG4jICR7c2FuaXRpemVkTmFtZX1cblxuJHtzYW5pdGl6ZWRJbnN0cnVjdGlvbnN9XG5cbiMjIFJlc3BvbnNlIFN0eWxlXG4tIEZvbGxvdyB0aGUgYmVoYXZpb3JhbCBndWlkZWxpbmVzIGFib3ZlXG4tIE1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggdGhlIHBlcnNvbmEncyBjaGFyYWN0ZXJcbi0gQWRhcHQgcmVzcG9uc2VzIHRvIG1hdGNoIHRoZSBpbnRlbmRlZCBwdXJwb3NlXG5cbiMjIFVzYWdlIE5vdGVzXG4tIENyZWF0ZWQgdmlhIERvbGxob3VzZU1DUCBjaGF0IGludGVyZmFjZVxuLSBBdXRob3I6ICR7YXV0aG9yfVxuLSBWZXJzaW9uOiAxLjBgO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBmaW5hbCBjb250ZW50IHNpemVcbiAgICAgIHZhbGlkYXRlQ29udGVudFNpemUocGVyc29uYUNvbnRlbnQsIFNFQ1VSSVRZX0xJTUlUUy5NQVhfUEVSU09OQV9TSVpFX0JZVEVTKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgZmlsZSBsb2NraW5nIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIud2l0aExvY2soYHBlcnNvbmE6JHtzYW5pdGl6ZWROYW1lfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gRG91YmxlLWNoZWNrIGZpbGUgZG9lc24ndCBleGlzdCAoaW4gY2FzZSBvZiByYWNlIGNvbmRpdGlvbilcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGVyc29uYSBmaWxlIFwiJHtmaWxlbmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgLy8gSWYgZXJyb3IgaXMgbm90IEVOT0VOVCAoZmlsZSBub3QgZm91bmQpLCByZS10aHJvdyBpdFxuICAgICAgICAgIGlmIChlcnJvci5jb2RlICE9PSAnRU5PRU5UJyAmJiBlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgcHJvY2VlZFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBXcml0ZSB0aGUgZmlsZSBhdG9taWNhbGx5XG4gICAgICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoZmlsZVBhdGgsIHBlcnNvbmFDb250ZW50KTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZWxvYWQgcGVyc29uYXMgdG8gaW5jbHVkZSB0aGUgbmV3IG9uZVxuICAgICAgYXdhaXQgdGhpcy5sb2FkUGVyc29uYXMoKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICoqUGVyc29uYSBDcmVhdGVkIFN1Y2Nlc3NmdWxseSEqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBg8J+OrSAqKiR7c2FuaXRpemVkTmFtZX0qKiBieSAke2F1dGhvcn1cXG5gICtcbiAgICAgICAgICAgICAgYPCfk4EgQ2F0ZWdvcnk6ICR7Y2F0ZWdvcnl9XFxuYCArXG4gICAgICAgICAgICAgIGDwn4aUIFVuaXF1ZSBJRDogJHt1bmlxdWVJZH1cXG5gICtcbiAgICAgICAgICAgICAgYPCfk4QgU2F2ZWQgYXM6ICR7ZmlsZW5hbWV9XFxuYCArXG4gICAgICAgICAgICAgIGDwn5OKIFRvdGFsIHBlcnNvbmFzOiAke3RoaXMucGVyc29uYXMuc2l6ZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYPCfjq8gKipSZWFkeSB0byB1c2U6KiogXFxgYWN0aXZhdGVfcGVyc29uYSBcIiR7c2FuaXRpemVkTmFtZX1cIlxcYFxcbmAgK1xuICAgICAgICAgICAgICBg8J+TpCAqKlNoYXJlIGl0OioqIFxcYHN1Ym1pdF9jb250ZW50IFwiJHtzYW5pdGl6ZWROYW1lfVwiXFxgXFxuYCArXG4gICAgICAgICAgICAgIGDinI/vuI8gKipFZGl0IGl0OioqIFxcYGVkaXRfcGVyc29uYSBcIiR7c2FuaXRpemVkTmFtZX1cIiBcImZpZWxkXCIgXCJuZXcgdmFsdWVcIlxcYGAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKkVycm9yIENyZWF0aW5nIFBlcnNvbmEqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHdyaXRlIHBlcnNvbmEgZmlsZTogJHtzYW5pdGl6ZWQubWVzc2FnZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFBsZWFzZSBjaGVjayBwZXJtaXNzaW9ucyBhbmQgdHJ5IGFnYWluLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipWYWxpZGF0aW9uIEVycm9yKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYCR7c2FuaXRpemVkLm1lc3NhZ2V9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGBQbGVhc2UgZml4IHRoZSBpc3N1ZSBhbmQgdHJ5IGFnYWluLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZWRpdFBlcnNvbmEocGVyc29uYUlkZW50aWZpZXI6IHN0cmluZywgZmllbGQ6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGlmICghcGVyc29uYUlkZW50aWZpZXIgfHwgIWZpZWxkIHx8ICF2YWx1ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqTWlzc2luZyBQYXJhbWV0ZXJzKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFVzYWdlOiBcXGBlZGl0X3BlcnNvbmEgXCJwZXJzb25hX25hbWVcIiBcImZpZWxkXCIgXCJuZXdfdmFsdWVcIlxcYFxcblxcbmAgK1xuICAgICAgICAgICAgICBgKipFZGl0YWJsZSBmaWVsZHM6KipcXG5gICtcbiAgICAgICAgICAgICAgYOKAoiAqKm5hbWUqKiAtIERpc3BsYXkgbmFtZVxcbmAgK1xuICAgICAgICAgICAgICBg4oCiICoqZGVzY3JpcHRpb24qKiAtIEJyaWVmIGRlc2NyaXB0aW9uXFxuYCArXG4gICAgICAgICAgICAgIGDigKIgKipjYXRlZ29yeSoqIC0gY3JlYXRpdmUsIHByb2Zlc3Npb25hbCwgZWR1Y2F0aW9uYWwsIGdhbWluZywgcGVyc29uYWxcXG5gICtcbiAgICAgICAgICAgICAgYOKAoiAqKmluc3RydWN0aW9ucyoqIC0gTWFpbiBwZXJzb25hIGNvbnRlbnRcXG5gICtcbiAgICAgICAgICAgICAgYOKAoiAqKnRyaWdnZXJzKiogLSBDb21tYS1zZXBhcmF0ZWQga2V5d29yZHNcXG5gICtcbiAgICAgICAgICAgICAgYOKAoiAqKnZlcnNpb24qKiAtIFZlcnNpb24gbnVtYmVyYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBwZXJzb25hXG4gICAgbGV0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldChwZXJzb25hSWRlbnRpZmllcik7XG4gICAgXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAvLyBTZWFyY2ggYnkgbmFtZVxuICAgICAgcGVyc29uYSA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkuZmluZChwID0+IFxuICAgICAgICBwLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGVyc29uYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKlBlcnNvbmEgTm90IEZvdW5kKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYENvdWxkIG5vdCBmaW5kIHBlcnNvbmE6IFwiJHtwZXJzb25hSWRlbnRpZmllcn1cIlxcblxcbmAgK1xuICAgICAgICAgICAgICBgVXNlIFxcYGxpc3RfcGVyc29uYXNcXGAgdG8gc2VlIGF2YWlsYWJsZSBwZXJzb25hcy5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkRmllbGRzID0gWyduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ2NhdGVnb3J5JywgJ2luc3RydWN0aW9ucycsICd0cmlnZ2VycycsICd2ZXJzaW9uJ107XG4gICAgaWYgKCF2YWxpZEZpZWxkcy5pbmNsdWRlcyhmaWVsZC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqSW52YWxpZCBGaWVsZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBGaWVsZCBcIiR7ZmllbGR9XCIgaXMgbm90IGVkaXRhYmxlLlxcblxcbmAgK1xuICAgICAgICAgICAgICBgKipWYWxpZCBmaWVsZHM6KiogJHt2YWxpZEZpZWxkcy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMucGVyc29uYXNEaXIsIHBlcnNvbmEuZmlsZW5hbWUpO1xuICAgIGxldCBpc0RlZmF1bHQgPSBpc0RlZmF1bHRQZXJzb25hKHBlcnNvbmEuZmlsZW5hbWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlYWQgY3VycmVudCBmaWxlXG4gICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IFBhdGhWYWxpZGF0b3Iuc2FmZVJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgIFxuICAgICAgLy8gVXNlIHNlY3VyZSBZQU1MIHBhcnNlclxuICAgICAgbGV0IHBhcnNlZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIuc2FmZU1hdHRlcihmaWxlQ29udGVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZWN1cml0eUVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKlNlY3VyaXR5IEVycm9yKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBDYW5ub3QgZWRpdCBwZXJzb25hIGR1ZSB0byBzZWN1cml0eSB0aHJlYXQ6ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBlZGl0aW5nIGEgZGVmYXVsdCBwZXJzb25hLCBjcmVhdGUgYSBjb3B5IGluc3RlYWRcbiAgICAgIGlmIChpc0RlZmF1bHQpIHtcbiAgICAgICAgLy8gR2VuZXJhdGUgdW5pcXVlIElEIGZvciB0aGUgY29weVxuICAgICAgICBjb25zdCBhdXRob3IgPSB0aGlzLmN1cnJlbnRVc2VyIHx8IGdlbmVyYXRlQW5vbnltb3VzSWQoKTtcbiAgICAgICAgY29uc3QgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKHBlcnNvbmEubWV0YWRhdGEubmFtZSwgYXV0aG9yKTtcbiAgICAgICAgY29uc3QgbmV3RmlsZW5hbWUgPSBgJHt1bmlxdWVJZH0ubWRgO1xuICAgICAgICBjb25zdCBuZXdGaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLnBlcnNvbmFzRGlyLCBuZXdGaWxlbmFtZSk7XG4gICAgICAgIFxuICAgICAgICAvLyBDcmVhdGUgY29weSBvZiB0aGUgZGVmYXVsdCBwZXJzb25hXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBQYXRoVmFsaWRhdG9yLnNhZmVSZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIFxuICAgICAgICAvLyBVc2UgZmlsZSBsb2NraW5nIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdoZW4gY3JlYXRpbmcgdGhlIGNvcHlcbiAgICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLndpdGhMb2NrKGBwZXJzb25hOiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfS1jb3B5YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUobmV3RmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmaWxlIHBhdGggdG8gcG9pbnQgdG8gdGhlIGNvcHlcbiAgICAgICAgZmlsZVBhdGggPSBuZXdGaWxlUGF0aDtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgdW5pcXVlX2lkIGluIHRoZSBtZXRhZGF0YVxuICAgICAgICBwYXJzZWQuZGF0YS51bmlxdWVfaWQgPSB1bmlxdWVJZDtcbiAgICAgICAgcGFyc2VkLmRhdGEuYXV0aG9yID0gYXV0aG9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUgdGhlIGFwcHJvcHJpYXRlIGZpZWxkXG4gICAgICBjb25zdCBub3JtYWxpemVkRmllbGQgPSBmaWVsZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgbmV3IHZhbHVlIGZvciBzZWN1cml0eSB0aHJlYXRzXG4gICAgICBjb25zdCB2YWx1ZVZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUodmFsdWUpO1xuICAgICAgaWYgKCF2YWx1ZVZhbGlkYXRpb24uaXNWYWxpZCAmJiB2YWx1ZVZhbGlkYXRpb24uc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipTZWN1cml0eSBWYWxpZGF0aW9uIEZhaWxlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBUaGUgbmV3IHZhbHVlIGNvbnRhaW5zIHByb2hpYml0ZWQgY29udGVudDpcXG5gICtcbiAgICAgICAgICAgICAgYOKAoiAke3ZhbHVlVmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCdcXG7igKIgJyl9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGBQbGVhc2UgcmVtb3ZlIHRoZXNlIHBhdHRlcm5zIGFuZCB0cnkgYWdhaW4uYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXNlIHNhbml0aXplZCB2YWx1ZSBpZiBuZWVkZWRcbiAgICAgIGxldCBzYW5pdGl6ZWRWYWx1ZSA9IHZhbHVlVmFsaWRhdGlvbi5zYW5pdGl6ZWRDb250ZW50IHx8IHZhbHVlO1xuICAgICAgXG4gICAgICAvLyBBbHdheXMgcmVtb3ZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIGZyb20gZGlzcGxheSBvdXRwdXRcbiAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IHNhbml0aXplZFZhbHVlLnJlcGxhY2UoL1s7JnxgJCgpXS9nLCAnJyk7XG4gICAgICBcbiAgICAgIGlmIChub3JtYWxpemVkRmllbGQgPT09ICdpbnN0cnVjdGlvbnMnKSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgbWFpbiBjb250ZW50XG4gICAgICAgIHBhcnNlZC5jb250ZW50ID0gc2FuaXRpemVkVmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRGaWVsZCA9PT0gJ3RyaWdnZXJzJykge1xuICAgICAgICAvLyBQYXJzZSB0cmlnZ2VycyBhcyBjb21tYS1zZXBhcmF0ZWQgbGlzdFxuICAgICAgICBwYXJzZWQuZGF0YVtub3JtYWxpemVkRmllbGRdID0gc2FuaXRpemVkVmFsdWUuc3BsaXQoJywnKS5tYXAodCA9PiB0LnRyaW0oKSkuZmlsdGVyKHQgPT4gdC5sZW5ndGggPiAwKTtcbiAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZEZpZWxkID09PSAnY2F0ZWdvcnknKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIGNhdGVnb3J5XG4gICAgICAgIGNvbnN0IHZhbGlkQ2F0ZWdvcmllcyA9IFsnY3JlYXRpdmUnLCAncHJvZmVzc2lvbmFsJywgJ2VkdWNhdGlvbmFsJywgJ2dhbWluZycsICdwZXJzb25hbCddO1xuICAgICAgICBpZiAoIXZhbGlkQ2F0ZWdvcmllcy5pbmNsdWRlcyhzYW5pdGl6ZWRWYWx1ZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipJbnZhbGlkIENhdGVnb3J5KipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYENhdGVnb3J5IG11c3QgYmUgb25lIG9mOiAke3ZhbGlkQ2F0ZWdvcmllcy5qb2luKCcsICcpfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgWW91IHByb3ZpZGVkOiBcIiR7c2FuaXRpemVkVmFsdWV9XCJgLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHBhcnNlZC5kYXRhW25vcm1hbGl6ZWRGaWVsZF0gPSBzYW5pdGl6ZWRWYWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXBkYXRlIG1ldGFkYXRhIGZpZWxkXG4gICAgICAgIC8vIEZvciBuYW1lIGZpZWxkLCBhcHBseSBhZGRpdGlvbmFsIHNhbml0aXphdGlvbiB0byByZW1vdmUgc2hlbGwgbWV0YWNoYXJhY3RlcnNcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRGaWVsZCA9PT0gJ25hbWUnKSB7XG4gICAgICAgICAgcGFyc2VkLmRhdGFbbm9ybWFsaXplZEZpZWxkXSA9IHNhbml0aXplSW5wdXQoc2FuaXRpemVkVmFsdWUsIDEwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyc2VkLmRhdGFbbm9ybWFsaXplZEZpZWxkXSA9IHNhbml0aXplZFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB2ZXJzaW9uIGFuZCBtb2RpZmljYXRpb24gaW5mb1xuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWVsZCAhPT0gJ3ZlcnNpb24nKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gcGFyc2VkLmRhdGEudmVyc2lvbiB8fCAnMS4wJztcbiAgICAgICAgY29uc3QgdmVyc2lvblBhcnRzID0gY3VycmVudFZlcnNpb24uc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgdmVyc2lvblBhcnRzWzFdID0gKHZlcnNpb25QYXJ0c1sxXSB8fCAwKSArIDE7XG4gICAgICAgIHBhcnNlZC5kYXRhLnZlcnNpb24gPSB2ZXJzaW9uUGFydHMuam9pbignLicpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWdlbmVyYXRlIGZpbGUgY29udGVudFxuICAgICAgLy8gVXNlIHNlY3VyZSBZQU1MIHN0cmluZ2lmaWNhdGlvblxuICAgICAgY29uc3Qgc2VjdXJlUGFyc2VyID0gU2VjdXJlWWFtbFBhcnNlci5jcmVhdGVTZWN1cmVNYXR0ZXJQYXJzZXIoKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gc2VjdXJlUGFyc2VyLnN0cmluZ2lmeShwYXJzZWQuY29udGVudCwgcGFyc2VkLmRhdGEpO1xuICAgICAgXG4gICAgICAvLyBVc2UgZmlsZSBsb2NraW5nIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIud2l0aExvY2soYHBlcnNvbmE6JHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBXcml0ZSB1cGRhdGVkIGZpbGUgYXRvbWljYWxseVxuICAgICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKGZpbGVQYXRoLCB1cGRhdGVkQ29udGVudCk7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUmVsb2FkIHBlcnNvbmFzXG4gICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgKipQZXJzb25hIFVwZGF0ZWQgU3VjY2Vzc2Z1bGx5ISoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIChpc0RlZmF1bHQgPyBg8J+TiyAqKk5vdGU6KiogQ3JlYXRlZCBhIGNvcHkgb2YgdGhlIGRlZmF1bHQgcGVyc29uYSB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwuXFxuXFxuYCA6ICcnKSArXG4gICAgICAgICAgICAgIGDwn46tICoqJHsocGFyc2VkLmRhdGEubmFtZSB8fCBwZXJzb25hLm1ldGFkYXRhLm5hbWUgfHwgJycpLnJlcGxhY2UoL1s7JnxgJCgpXS9nLCAnJyl9KipcXG5gICtcbiAgICAgICAgICAgICAgYPCfk50gKipGaWVsZCBVcGRhdGVkOioqICR7ZmllbGR9XFxuYCArXG4gICAgICAgICAgICAgIGDwn5SEICoqTmV3IFZhbHVlOioqICR7bm9ybWFsaXplZEZpZWxkID09PSAnaW5zdHJ1Y3Rpb25zJyA/ICdDb250ZW50IHVwZGF0ZWQnIDogZGlzcGxheVZhbHVlfVxcbmAgK1xuICAgICAgICAgICAgICBg8J+TiiAqKlZlcnNpb246KiogJHtwYXJzZWQuZGF0YS52ZXJzaW9ufVxcbmAgK1xuICAgICAgICAgICAgICAoaXNEZWZhdWx0ID8gYPCfhpQgKipOZXcgSUQ6KiogJHtwYXJzZWQuZGF0YS51bmlxdWVfaWR9XFxuYCA6ICcnKSArXG4gICAgICAgICAgICAgIGBcXG5gICtcbiAgICAgICAgICAgICAgYFVzZSBcXGBnZXRfcGVyc29uYV9kZXRhaWxzIFwiJHsocGFyc2VkLmRhdGEubmFtZSB8fCBwZXJzb25hLm1ldGFkYXRhLm5hbWUgfHwgJycpLnJlcGxhY2UoL1s7JnxgJCgpXS9nLCAnJyl9XCJcXGAgdG8gc2VlIGFsbCBjaGFuZ2VzLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKkVycm9yIFVwZGF0aW5nIFBlcnNvbmEqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSBwZXJzb25hOiAke3Nhbml0aXplZC5tZXNzYWdlfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIGNoZWNrIGZpbGUgcGVybWlzc2lvbnMgYW5kIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlUGVyc29uYShwZXJzb25hSWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgaWYgKCFwZXJzb25hSWRlbnRpZmllcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqTWlzc2luZyBQZXJzb25hIElkZW50aWZpZXIqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgVXNhZ2U6IFxcYHZhbGlkYXRlX3BlcnNvbmEgXCJwZXJzb25hX25hbWVcIlxcYFxcblxcbmAgK1xuICAgICAgICAgICAgICBgVXNlIFxcYGxpc3RfcGVyc29uYXNcXGAgdG8gc2VlIGF2YWlsYWJsZSBwZXJzb25hcy5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIHBlcnNvbmFcbiAgICBsZXQgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHBlcnNvbmFJZGVudGlmaWVyKTtcbiAgICBcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIC8vIFNlYXJjaCBieSBuYW1lXG4gICAgICBwZXJzb25hID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gXG4gICAgICAgIHAubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBwZXJzb25hSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqUGVyc29uYSBOb3QgRm91bmQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgcGVyc29uYTogXCIke3BlcnNvbmFJZGVudGlmaWVyfVwiXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2UgXFxgbGlzdF9wZXJzb25hc1xcYCB0byBzZWUgYXZhaWxhYmxlIHBlcnNvbmFzLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGlvbiBjaGVja3NcbiAgICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbWV0YWRhdGEgPSBwZXJzb25hLm1ldGFkYXRhO1xuXG4gICAgLy8gUmVxdWlyZWQgZmllbGQgY2hlY2tzXG4gICAgaWYgKCFtZXRhZGF0YS5uYW1lIHx8IG1ldGFkYXRhLm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaXNzdWVzLnB1c2goXCJNaXNzaW5nIG9yIGVtcHR5ICduYW1lJyBmaWVsZFwiKTtcbiAgICB9XG4gICAgaWYgKCFtZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCBtZXRhZGF0YS5kZXNjcmlwdGlvbi50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICBpc3N1ZXMucHVzaChcIk1pc3Npbmcgb3IgZW1wdHkgJ2Rlc2NyaXB0aW9uJyBmaWVsZFwiKTtcbiAgICB9XG4gICAgaWYgKCFwZXJzb25hLmNvbnRlbnQgfHwgcGVyc29uYS5jb250ZW50LnRyaW0oKS5sZW5ndGggPCA1MCkge1xuICAgICAgaXNzdWVzLnB1c2goXCJQZXJzb25hIGNvbnRlbnQgaXMgdG9vIHNob3J0IChtaW5pbXVtIDUwIGNoYXJhY3RlcnMpXCIpO1xuICAgIH1cblxuICAgIC8vIENhdGVnb3J5IHZhbGlkYXRpb25cbiAgICBjb25zdCB2YWxpZENhdGVnb3JpZXMgPSBbJ2NyZWF0aXZlJywgJ3Byb2Zlc3Npb25hbCcsICdlZHVjYXRpb25hbCcsICdnYW1pbmcnLCAncGVyc29uYWwnLCAnZ2VuZXJhbCddO1xuICAgIGlmIChtZXRhZGF0YS5jYXRlZ29yeSAmJiAhdmFsaWRDYXRlZ29yaWVzLmluY2x1ZGVzKG1ldGFkYXRhLmNhdGVnb3J5KSkge1xuICAgICAgaXNzdWVzLnB1c2goYEludmFsaWQgY2F0ZWdvcnkgJyR7bWV0YWRhdGEuY2F0ZWdvcnl9Jy4gTXVzdCBiZSBvbmUgb2Y6ICR7dmFsaWRDYXRlZ29yaWVzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gQWdlIHJhdGluZyB2YWxpZGF0aW9uXG4gICAgY29uc3QgdmFsaWRBZ2VSYXRpbmdzID0gWydhbGwnLCAnMTMrJywgJzE4KyddO1xuICAgIGlmIChtZXRhZGF0YS5hZ2VfcmF0aW5nICYmICF2YWxpZEFnZVJhdGluZ3MuaW5jbHVkZXMobWV0YWRhdGEuYWdlX3JhdGluZykpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goYEludmFsaWQgYWdlX3JhdGluZyAnJHttZXRhZGF0YS5hZ2VfcmF0aW5nfScuIFNob3VsZCBiZSBvbmUgb2Y6ICR7dmFsaWRBZ2VSYXRpbmdzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gT3B0aW9uYWwgZmllbGQgd2FybmluZ3NcbiAgICBpZiAoIW1ldGFkYXRhLnRyaWdnZXJzIHx8IG1ldGFkYXRhLnRyaWdnZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2FybmluZ3MucHVzaChcIk5vIHRyaWdnZXIga2V5d29yZHMgZGVmaW5lZCAtIHVzZXJzIG1heSBoYXZlIGRpZmZpY3VsdHkgZmluZGluZyB0aGlzIHBlcnNvbmFcIik7XG4gICAgfVxuICAgIGlmICghbWV0YWRhdGEudmVyc2lvbikge1xuICAgICAgd2FybmluZ3MucHVzaChcIk5vIHZlcnNpb24gc3BlY2lmaWVkIC0gZGVmYXVsdGluZyB0byAnMS4wJ1wiKTtcbiAgICB9XG4gICAgaWYgKCFtZXRhZGF0YS51bmlxdWVfaWQpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXCJObyB1bmlxdWVfaWQgLSBvbmUgd2lsbCBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseVwiKTtcbiAgICB9XG5cbiAgICAvLyBDb250ZW50IHF1YWxpdHkgY2hlY2tzXG4gICAgaWYgKHBlcnNvbmEuY29udGVudC5sZW5ndGggPiA1MDAwKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKFwiUGVyc29uYSBjb250ZW50IGlzIHZlcnkgbG9uZyAtIGNvbnNpZGVyIGJyZWFraW5nIGl0IGludG8gc2VjdGlvbnNcIik7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YS5uYW1lICYmIG1ldGFkYXRhLm5hbWUubGVuZ3RoID4gNTApIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXCJQZXJzb25hIG5hbWUgaXMgdmVyeSBsb25nIC0gY29uc2lkZXIgc2hvcnRlbmluZyBmb3IgYmV0dGVyIGRpc3BsYXlcIik7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YS5kZXNjcmlwdGlvbiAmJiBtZXRhZGF0YS5kZXNjcmlwdGlvbi5sZW5ndGggPiAyMDApIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXCJEZXNjcmlwdGlvbiBpcyB2ZXJ5IGxvbmcgLSBjb25zaWRlciBrZWVwaW5nIGl0IHVuZGVyIDIwMCBjaGFyYWN0ZXJzXCIpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIHZhbGlkYXRpb24gcmVwb3J0XG4gICAgbGV0IHJlcG9ydCA9IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCfk4sgKipWYWxpZGF0aW9uIFJlcG9ydDogJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9KipcXG5cXG5gO1xuICAgIFxuICAgIGlmIChpc3N1ZXMubGVuZ3RoID09PSAwICYmIHdhcm5pbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmVwb3J0ICs9IGDinIUgKipBbGwgQ2hlY2tzIFBhc3NlZCEqKlxcblxcbmAgK1xuICAgICAgICBg8J+OrSAqKlBlcnNvbmE6KiogJHttZXRhZGF0YS5uYW1lfVxcbmAgK1xuICAgICAgICBg8J+TgSAqKkNhdGVnb3J5OioqICR7bWV0YWRhdGEuY2F0ZWdvcnkgfHwgJ2dlbmVyYWwnfVxcbmAgK1xuICAgICAgICBg8J+TiiAqKlZlcnNpb246KiogJHttZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAnfVxcbmAgK1xuICAgICAgICBg8J+TnSAqKkNvbnRlbnQgTGVuZ3RoOioqICR7cGVyc29uYS5jb250ZW50Lmxlbmd0aH0gY2hhcmFjdGVyc1xcbmAgK1xuICAgICAgICBg8J+UlyAqKlRyaWdnZXJzOioqICR7bWV0YWRhdGEudHJpZ2dlcnM/Lmxlbmd0aCB8fCAwfSBrZXl3b3Jkc1xcblxcbmAgK1xuICAgICAgICBgVGhpcyBwZXJzb25hIG1lZXRzIGFsbCB2YWxpZGF0aW9uIHJlcXVpcmVtZW50cyBhbmQgaXMgcmVhZHkgZm9yIHVzZSFgO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVwb3J0ICs9IGDinYwgKipJc3N1ZXMgRm91bmQgKCR7aXNzdWVzLmxlbmd0aH0pOioqXFxuYDtcbiAgICAgICAgaXNzdWVzLmZvckVhY2goKGlzc3VlLCBpKSA9PiB7XG4gICAgICAgICAgcmVwb3J0ICs9IGAgICAke2kgKyAxfS4gJHtpc3N1ZX1cXG5gO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgICAgfVxuXG4gICAgICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXBvcnQgKz0gYOKaoO+4jyAqKldhcm5pbmdzICgke3dhcm5pbmdzLmxlbmd0aH0pOioqXFxuYDtcbiAgICAgICAgd2FybmluZ3MuZm9yRWFjaCgod2FybmluZywgaSkgPT4ge1xuICAgICAgICAgIHJlcG9ydCArPSBgICAgJHtpICsgMX0uICR7d2FybmluZ31cXG5gO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVwb3J0ICs9IGAqKlJlY29tbWVuZGF0aW9uOioqIEZpeCB0aGUgaXNzdWVzIGFib3ZlIGJlZm9yZSB1c2luZyB0aGlzIHBlcnNvbmEuXFxuYDtcbiAgICAgICAgcmVwb3J0ICs9IGBVc2UgXFxgZWRpdF9wZXJzb25hIFwiJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9XCIgXCJmaWVsZFwiIFwidmFsdWVcIlxcYCB0byBtYWtlIGNvcnJlY3Rpb25zLmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXBvcnQgKz0gYCoqU3RhdHVzOioqIFBlcnNvbmEgaXMgZnVuY3Rpb25hbCBidXQgY291bGQgYmUgaW1wcm92ZWQuXFxuYDtcbiAgICAgICAgcmVwb3J0ICs9IGBBZGRyZXNzIHdhcm5pbmdzIGFib3ZlIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlLmA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IHJlcG9ydCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIHJldHJ5TmV0d29ya09wZXJhdGlvbiBpcyBub3cgaGFuZGxlZCBieSBVcGRhdGVDaGVja2VyXG5cbiAgLy8gQXV0by11cGRhdGUgbWFuYWdlbWVudCB0b29sc1xuICBhc3luYyBjaGVja0ZvclVwZGF0ZXMoKSB7XG4gICAgY29uc3QgeyB0ZXh0IH0gPSBhd2FpdCB0aGlzLnVwZGF0ZU1hbmFnZXIuY2hlY2tGb3JVcGRhdGVzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSArIHRleHQgfV1cbiAgICB9O1xuICB9XG5cbiAgLy8gVXBkYXRlIGhlbHBlciBtZXRob2RzIGFyZSBub3cgaGFuZGxlZCBieSBVcGRhdGVNYW5hZ2VyXG5cbiAgYXN5bmMgdXBkYXRlU2VydmVyKGNvbmZpcm06IGJvb2xlYW4pIHtcbiAgICBpZiAoIWNvbmZpcm0pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkgKyBcbiAgICAgICAgICAgICfimqDvuI8gKipVcGRhdGUgQ29uZmlybWF0aW9uIFJlcXVpcmVkKipcXG5cXG4nICtcbiAgICAgICAgICAgICdUbyBwcm9jZWVkIHdpdGggdGhlIHVwZGF0ZSwgeW91IG11c3QgY29uZmlybTpcXG4nICtcbiAgICAgICAgICAgICdgdXBkYXRlX3NlcnZlciB0cnVlYFxcblxcbicgK1xuICAgICAgICAgICAgJyoqV2hhdCB3aWxsIGhhcHBlbjoqKlxcbicgK1xuICAgICAgICAgICAgJ+KAoiBCYWNrdXAgY3VycmVudCB2ZXJzaW9uXFxuJyArXG4gICAgICAgICAgICAn4oCiIFB1bGwgbGF0ZXN0IGNoYW5nZXMgZnJvbSBHaXRIdWJcXG4nICtcbiAgICAgICAgICAgICfigKIgVXBkYXRlIGRlcGVuZGVuY2llc1xcbicgK1xuICAgICAgICAgICAgJ+KAoiBSZWJ1aWxkIFR5cGVTY3JpcHRcXG4nICtcbiAgICAgICAgICAgICfigKIgUmVzdGFydCBzZXJ2ZXIgKHdpbGwgZGlzY29ubmVjdCB0ZW1wb3JhcmlseSlcXG5cXG4nICtcbiAgICAgICAgICAgICcqKlByZXJlcXVpc2l0ZXM6KipcXG4nICtcbiAgICAgICAgICAgICfigKIgR2l0IHJlcG9zaXRvcnkgbXVzdCBiZSBjbGVhbiAobm8gdW5jb21taXR0ZWQgY2hhbmdlcylcXG4nICtcbiAgICAgICAgICAgICfigKIgTmV0d29yayBjb25uZWN0aW9uIHJlcXVpcmVkXFxuJyArXG4gICAgICAgICAgICAn4oCiIFN1ZmZpY2llbnQgZGlzayBzcGFjZSBmb3IgYmFja3VwJ1xuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHRleHQgfSA9IGF3YWl0IHRoaXMudXBkYXRlTWFuYWdlci51cGRhdGVTZXJ2ZXIoY29uZmlybSwgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dCB9XVxuICAgIH07XG4gIH1cblxuICAvLyBSb2xsYmFjayBoZWxwZXIgbWV0aG9kcyBhcmUgbm93IGhhbmRsZWQgYnkgVXBkYXRlTWFuYWdlclxuXG4gIGFzeW5jIHJvbGxiYWNrVXBkYXRlKGNvbmZpcm06IGJvb2xlYW4pIHtcbiAgICBjb25zdCB7IHRleHQgfSA9IGF3YWl0IHRoaXMudXBkYXRlTWFuYWdlci5yb2xsYmFja1VwZGF0ZShjb25maXJtLCB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0IH1dXG4gICAgfTtcbiAgfVxuXG4gIC8vIFZlcnNpb24gYW5kIGdpdCBpbmZvIG1ldGhvZHMgYXJlIG5vdyBoYW5kbGVkIGJ5IFVwZGF0ZU1hbmFnZXJcblxuICAvLyBTdGF0dXMgaGVscGVyIG1ldGhvZHMgYXJlIG5vdyBoYW5kbGVkIGJ5IFVwZGF0ZU1hbmFnZXJcblxuICBhc3luYyBnZXRTZXJ2ZXJTdGF0dXMoKSB7XG4gICAgLy8gQWRkIHBlcnNvbmEgaW5mb3JtYXRpb24gdG8gdGhlIHN0YXR1c1xuICAgIGNvbnN0IHBlcnNvbmFJbmZvID0gYFxuKirwn46tIFBlcnNvbmEgSW5mb3JtYXRpb246KipcbuKAoiAqKlRvdGFsIFBlcnNvbmFzOioqICR7dGhpcy5wZXJzb25hcy5zaXplfVxu4oCiICoqQWN0aXZlIFBlcnNvbmE6KiogJHt0aGlzLmFjdGl2ZVBlcnNvbmEgfHwgJ05vbmUnfVxu4oCiICoqVXNlciBJZGVudGl0eToqKiAke3RoaXMuY3VycmVudFVzZXIgfHwgJ0Fub255bW91cyd9XG7igKIgKipQZXJzb25hcyBEaXJlY3Rvcnk6KiogJHt0aGlzLnBlcnNvbmFzRGlyfWA7XG4gICAgXG4gICAgY29uc3QgeyB0ZXh0IH0gPSBhd2FpdCB0aGlzLnVwZGF0ZU1hbmFnZXIuZ2V0U2VydmVyU3RhdHVzKHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpKTtcbiAgICAvLyBJbnNlcnQgcGVyc29uYSBpbmZvIGludG8gdGhlIHN0YXR1cyB0ZXh0XG4gICAgY29uc3QgdXBkYXRlZFRleHQgPSB0ZXh0LnJlcGxhY2UoJyoqQXZhaWxhYmxlIENvbW1hbmRzOioqJywgcGVyc29uYUluZm8gKyAnXFxuXFxuKipBdmFpbGFibGUgQ29tbWFuZHM6KionKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHVwZGF0ZWRUZXh0IH1dXG4gICAgfTtcbiAgfVxuXG4gIC8vIFZlcnNpb24gYW5kIGRlcGVuZGVuY3kgbWV0aG9kcyBhcmUgbm93IGhhbmRsZWQgYnkgVXBkYXRlTWFuYWdlclxuXG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBpbmRpY2F0b3Igc2V0dGluZ3NcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZUluZGljYXRvcihjb25maWc6IFBhcnRpYWw8SW5kaWNhdG9yQ29uZmlnPikge1xuICAgIHRyeSB7XG4gICAgICAvLyBVcGRhdGUgdGhlIGNvbmZpZ3VyYXRpb25cbiAgICAgIGlmIChjb25maWcuZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLmVuYWJsZWQgPSBjb25maWcuZW5hYmxlZDtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuc3R5bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5zdHlsZSA9IGNvbmZpZy5zdHlsZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuY3VzdG9tRm9ybWF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgY3VzdG9tIGZvcm1hdCBiZWZvcmUgYXBwbHlpbmdcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlQ3VzdG9tRm9ybWF0KGNvbmZpZy5jdXN0b21Gb3JtYXQpO1xuICAgICAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEludmFsaWQgY3VzdG9tIGZvcm1hdDogJHt2YWxpZGF0aW9uLmVycm9yfWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuY3VzdG9tRm9ybWF0ID0gY29uZmlnLmN1c3RvbUZvcm1hdDtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuc2hvd1ZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5zaG93VmVyc2lvbiA9IGNvbmZpZy5zaG93VmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuc2hvd0F1dGhvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dBdXRob3IgPSBjb25maWcuc2hvd0F1dGhvcjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuc2hvd0NhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd0NhdGVnb3J5ID0gY29uZmlnLnNob3dDYXRlZ29yeTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZW1vamkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5lbW9qaSA9IGNvbmZpZy5lbW9qaTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuYnJhY2tldFN0eWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuYnJhY2tldFN0eWxlID0gY29uZmlnLmJyYWNrZXRTdHlsZTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdyBleGFtcGxlIG9mIHdoYXQgdGhlIGluZGljYXRvciB3b3VsZCBsb29rIGxpa2VcbiAgICAgIGxldCBleGFtcGxlSW5kaWNhdG9yID0gXCJcIjtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZVBlcnNvbmEpIHtcbiAgICAgICAgY29uc3QgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHRoaXMuYWN0aXZlUGVyc29uYSk7XG4gICAgICAgIGlmIChwZXJzb25hKSB7XG4gICAgICAgICAgZXhhbXBsZUluZGljYXRvciA9IGZvcm1hdEluZGljYXRvcih0aGlzLmluZGljYXRvckNvbmZpZywge1xuICAgICAgICAgICAgbmFtZTogcGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgdmVyc2lvbjogcGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgICAgYXV0aG9yOiBwZXJzb25hLm1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBwZXJzb25hLm1ldGFkYXRhLmNhdGVnb3J5XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNob3cgZXhhbXBsZSB3aXRoIHNhbXBsZSBkYXRhXG4gICAgICAgIGV4YW1wbGVJbmRpY2F0b3IgPSBmb3JtYXRJbmRpY2F0b3IodGhpcy5pbmRpY2F0b3JDb25maWcsIHtcbiAgICAgICAgICBuYW1lOiBcIkV4YW1wbGUgUGVyc29uYVwiLFxuICAgICAgICAgIHZlcnNpb246IFwiMS4wXCIsXG4gICAgICAgICAgYXV0aG9yOiBcIkB1c2VybmFtZVwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImNyZWF0aXZlXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSBJbmRpY2F0b3IgY29uZmlndXJhdGlvbiB1cGRhdGVkIHN1Y2Nlc3NmdWxseSFcblxuQ3VycmVudCBzZXR0aW5nczpcbi0gRW5hYmxlZDogJHt0aGlzLmluZGljYXRvckNvbmZpZy5lbmFibGVkfVxuLSBTdHlsZTogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zdHlsZX1cbi0gU2hvdyBWZXJzaW9uOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dWZXJzaW9ufVxuLSBTaG93IEF1dGhvcjogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zaG93QXV0aG9yfVxuLSBTaG93IENhdGVnb3J5OiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dDYXRlZ29yeX1cbi0gRW1vamk6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuZW1vaml9XG4tIEJyYWNrZXRzOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmJyYWNrZXRTdHlsZX1cbiR7dGhpcy5pbmRpY2F0b3JDb25maWcuY3VzdG9tRm9ybWF0ID8gYC0gQ3VzdG9tIEZvcm1hdDogJHt0aGlzLmluZGljYXRvckNvbmZpZy5jdXN0b21Gb3JtYXR9YCA6ICcnfVxuXG5FeGFtcGxlIGluZGljYXRvcjogJHtleGFtcGxlSW5kaWNhdG9yIHx8IFwiKG5vbmUgLSBpbmRpY2F0b3JzIGRpc2FibGVkKVwifVxuXG5Ob3RlOiBDb25maWd1cmF0aW9uIGlzIHRlbXBvcmFyeSBmb3IgdGhpcyBzZXNzaW9uLiBUbyBtYWtlIHBlcm1hbmVudCwgc2V0IGVudmlyb25tZW50IHZhcmlhYmxlczpcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9FTkFCTEVEPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TVFlMRT1mdWxsL21pbmltYWwvY29tcGFjdC9jdXN0b21cbi0gRE9MTEhPVVNFX0lORElDQVRPUl9GT1JNQVQ9XCJjdXN0b20gZm9ybWF0IHRlbXBsYXRlXCJcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TSE9XX1ZFUlNJT049dHJ1ZS9mYWxzZVxuLSBET0xMSE9VU0VfSU5ESUNBVE9SX1NIT1dfQVVUSE9SPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TSE9XX0NBVEVHT1JZPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9FTU9KST3wn46tXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfQlJBQ0tFVFM9c3F1YXJlL3JvdW5kL2N1cmx5L2FuZ2xlL25vbmVgXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRXJyb3IgY29uZmlndXJpbmcgaW5kaWNhdG9yOiAke1NlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKS5tZXNzYWdlfWBcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGluZGljYXRvciBjb25maWd1cmF0aW9uXG4gICAqL1xuICBhc3luYyBnZXRJbmRpY2F0b3JDb25maWcoKSB7XG4gICAgLy8gU2hvdyBjdXJyZW50IGNvbmZpZ3VyYXRpb24gYW5kIGV4YW1wbGVcbiAgICBsZXQgZXhhbXBsZUluZGljYXRvciA9IFwiXCI7XG4gICAgaWYgKHRoaXMuYWN0aXZlUGVyc29uYSkge1xuICAgICAgY29uc3QgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHRoaXMuYWN0aXZlUGVyc29uYSk7XG4gICAgICBpZiAocGVyc29uYSkge1xuICAgICAgICBleGFtcGxlSW5kaWNhdG9yID0gZm9ybWF0SW5kaWNhdG9yKHRoaXMuaW5kaWNhdG9yQ29uZmlnLCB7XG4gICAgICAgICAgbmFtZTogcGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIHZlcnNpb246IHBlcnNvbmEubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgICBhdXRob3I6IHBlcnNvbmEubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICAgIGNhdGVnb3J5OiBwZXJzb25hLm1ldGFkYXRhLmNhdGVnb3J5XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTaG93IGV4YW1wbGUgd2l0aCBzYW1wbGUgZGF0YVxuICAgICAgZXhhbXBsZUluZGljYXRvciA9IGZvcm1hdEluZGljYXRvcih0aGlzLmluZGljYXRvckNvbmZpZywge1xuICAgICAgICBuYW1lOiBcIkV4YW1wbGUgUGVyc29uYVwiLFxuICAgICAgICB2ZXJzaW9uOiBcIjEuMFwiLFxuICAgICAgICBhdXRob3I6IFwiQHVzZXJuYW1lXCIsXG4gICAgICAgIGNhdGVnb3J5OiBcImNyZWF0aXZlXCJcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3wn5OKIEN1cnJlbnQgSW5kaWNhdG9yIENvbmZpZ3VyYXRpb246XG5cblNldHRpbmdzOlxuLSBFbmFibGVkOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmVuYWJsZWR9XG4tIFN0eWxlOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnN0eWxlfVxuLSBTaG93IFZlcnNpb246ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd1ZlcnNpb259XG4tIFNob3cgQXV0aG9yOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dBdXRob3J9XG4tIFNob3cgQ2F0ZWdvcnk6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd0NhdGVnb3J5fVxuLSBFbW9qaTogJHt0aGlzLmluZGljYXRvckNvbmZpZy5lbW9qaX1cbi0gQnJhY2tldHM6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuYnJhY2tldFN0eWxlfVxuLSBTZXBhcmF0b3I6IFwiJHt0aGlzLmluZGljYXRvckNvbmZpZy5zZXBhcmF0b3J9XCJcbiR7dGhpcy5pbmRpY2F0b3JDb25maWcuY3VzdG9tRm9ybWF0ID8gYC0gQ3VzdG9tIEZvcm1hdDogJHt0aGlzLmluZGljYXRvckNvbmZpZy5jdXN0b21Gb3JtYXR9YCA6ICcnfVxuXG5BdmFpbGFibGUgc3R5bGVzOlxuLSBmdWxsOiBb8J+OrSBQZXJzb25hIE5hbWUgdjEuMCBieSBAYXV0aG9yXVxuLSBtaW5pbWFsOiDwn46tIFBlcnNvbmEgTmFtZVxuLSBjb21wYWN0OiBbUGVyc29uYSBOYW1lIHYxLjBdXG4tIGN1c3RvbTogVXNlIHlvdXIgb3duIGZvcm1hdCB3aXRoIHBsYWNlaG9sZGVyc1xuXG5FeGFtcGxlIHdpdGggY3VycmVudCBzZXR0aW5nczogJHtleGFtcGxlSW5kaWNhdG9yIHx8IFwiKG5vbmUgLSBpbmRpY2F0b3JzIGRpc2FibGVkKVwifVxuXG5QbGFjZWhvbGRlcnMgZm9yIGN1c3RvbSBmb3JtYXQ6XG4tIHtlbW9qaX0gLSBUaGUgY29uZmlndXJlZCBlbW9qaVxuLSB7bmFtZX0gLSBQZXJzb25hIG5hbWVcbi0ge3ZlcnNpb259IC0gUGVyc29uYSB2ZXJzaW9uXG4tIHthdXRob3J9IC0gUGVyc29uYSBhdXRob3Jcbi0ge2NhdGVnb3J5fSAtIFBlcnNvbmEgY2F0ZWdvcnlgXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuICB9XG5cblxuICAvKipcbiAgICogRXhwb3J0IGEgc2luZ2xlIHBlcnNvbmFcbiAgICovXG4gIGFzeW5jIGV4cG9ydFBlcnNvbmEocGVyc29uYU5hbWU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgYSBzaW5nbGUgbG9va3VwIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uc1xuICAgICAgbGV0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldChwZXJzb25hTmFtZSk7XG4gICAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgICAgLy8gVHJ5IGJ5IGZpbGVuYW1lXG4gICAgICAgIHBlcnNvbmEgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09PSBwZXJzb25hTmFtZSk7XG4gICAgICAgIGlmICghcGVyc29uYSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIFBlcnNvbmEgbm90IGZvdW5kOiAke3BlcnNvbmFOYW1lfWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBleHBvcnREYXRhID0gdGhpcy5wZXJzb25hRXhwb3J0ZXIuZXhwb3J0UGVyc29uYShwZXJzb25hKTtcbiAgICAgIGNvbnN0IGJhc2U2NCA9IHRoaXMucGVyc29uYUV4cG9ydGVyLnRvQmFzZTY0KGV4cG9ydERhdGEpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wZXJzb25hRXhwb3J0ZXIuZm9ybWF0RXhwb3J0UmVzdWx0KHBlcnNvbmEsIGJhc2U2NCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9JHtyZXN1bHR9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRXhwb3J0IGZhaWxlZDogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYWxsIHBlcnNvbmFzXG4gICAqL1xuICBhc3luYyBleHBvcnRBbGxQZXJzb25hcyhpbmNsdWRlRGVmYXVsdHMgPSB0cnVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBlcnNvbmFzQXJyYXkgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpO1xuICAgICAgY29uc3QgYnVuZGxlID0gdGhpcy5wZXJzb25hRXhwb3J0ZXIuZXhwb3J0QnVuZGxlKHBlcnNvbmFzQXJyYXksIGluY2x1ZGVEZWZhdWx0cyk7XG4gICAgICBjb25zdCBiYXNlNjQgPSB0aGlzLnBlcnNvbmFFeHBvcnRlci50b0Jhc2U2NChidW5kbGUpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wZXJzb25hRXhwb3J0ZXIuZm9ybWF0QnVuZGxlUmVzdWx0KGJ1bmRsZSwgYmFzZTY0KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3Jlc3VsdH1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBFeHBvcnQgZmFpbGVkOiAke1NlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKS5tZXNzYWdlfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhIHBlcnNvbmFcbiAgICovXG4gIGFzeW5jIGltcG9ydFBlcnNvbmEoc291cmNlOiBzdHJpbmcsIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucGVyc29uYUltcG9ydGVyLmltcG9ydFBlcnNvbmEoc291cmNlLCB0aGlzLnBlcnNvbmFzLCBvdmVyd3JpdGUpO1xuICAgICAgXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gUmVsb2FkIHBlcnNvbmFzIHRvIGluY2x1ZGUgdGhlIG5ldyBvbmVcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkUGVyc29uYXMoKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICR7cmVzdWx0Lm1lc3NhZ2V9XFxuXFxuUGVyc29uYSBcIiR7cmVzdWx0LnBlcnNvbmE/Lm1ldGFkYXRhLm5hbWV9XCIgaXMgbm93IGF2YWlsYWJsZS5cXG5Ub3RhbCBwZXJzb25hczogJHt0aGlzLnBlcnNvbmFzLnNpemV9YFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAke3Jlc3VsdC5tZXNzYWdlfWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBJbXBvcnQgZmFpbGVkOiAke1NlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKS5tZXNzYWdlfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIGEgcGVyc29uYSB2aWEgVVJMXG4gICAqL1xuICBhc3luYyBzaGFyZVBlcnNvbmEocGVyc29uYU5hbWU6IHN0cmluZywgZXhwaXJ5RGF5cyA9IDcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5oYW5jZWQgaW5wdXQgdmFsaWRhdGlvblxuICAgICAgY29uc3QgdmFsaWRhdGVkUGVyc29uYU5hbWUgPSBNQ1BJbnB1dFZhbGlkYXRvci52YWxpZGF0ZVBlcnNvbmFJZGVudGlmaWVyKHBlcnNvbmFOYW1lKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZEV4cGlyeURheXMgPSBNQ1BJbnB1dFZhbGlkYXRvci52YWxpZGF0ZUV4cGlyeURheXMoZXhwaXJ5RGF5cyk7XG4gICAgICBcbiAgICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh2YWxpZGF0ZWRQZXJzb25hTmFtZSk7XG4gICAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgICAgLy8gVHJ5IGJ5IGZpbGVuYW1lXG4gICAgICAgIGNvbnN0IGJ5RmlsZW5hbWUgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09PSB2YWxpZGF0ZWRQZXJzb25hTmFtZSk7XG4gICAgICAgIGlmICghYnlGaWxlbmFtZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIFBlcnNvbmEgbm90IGZvdW5kOiAke3ZhbGlkYXRlZFBlcnNvbmFOYW1lfWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBwZXJzb25hTmFtZSA9IGJ5RmlsZW5hbWUubWV0YWRhdGEubmFtZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJzb25hU2hhcmVyLnNoYXJlUGVyc29uYSh0aGlzLnBlcnNvbmFzLmdldChwZXJzb25hTmFtZSkhLCB2YWxpZGF0ZWRFeHBpcnlEYXlzKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3Jlc3VsdC5tZXNzYWdlfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIFNoYXJlIGZhaWxlZDogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgZnJvbSBhIHNoYXJlZCBVUkxcbiAgICovXG4gIGFzeW5jIGltcG9ydEZyb21VcmwodXJsOiBzdHJpbmcsIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuaGFuY2VkIGlucHV0IHZhbGlkYXRpb24gZm9yIFVSTFxuICAgICAgY29uc3QgdmFsaWRhdGVkVXJsID0gTUNQSW5wdXRWYWxpZGF0b3IudmFsaWRhdGVJbXBvcnRVcmwodXJsKTtcbiAgICAgIFxuICAgICAgY29uc3QgZmV0Y2hSZXN1bHQgPSBhd2FpdCB0aGlzLnBlcnNvbmFTaGFyZXIuaW1wb3J0RnJvbVVybCh2YWxpZGF0ZWRVcmwpO1xuICAgICAgXG4gICAgICBpZiAoIWZldGNoUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgJHtmZXRjaFJlc3VsdC5tZXNzYWdlfWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBJbXBvcnQgdGhlIGZldGNoZWQgZGF0YVxuICAgICAgY29uc3QgaW1wb3J0UmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJzb25hSW1wb3J0ZXIuaW1wb3J0UGVyc29uYShcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZmV0Y2hSZXN1bHQuZGF0YSksXG4gICAgICAgIHRoaXMucGVyc29uYXMsXG4gICAgICAgIG92ZXJ3cml0ZVxuICAgICAgKTtcblxuICAgICAgaWYgKGltcG9ydFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIC8vIFJlbG9hZCBwZXJzb25hc1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgU3VjY2Vzc2Z1bGx5IGltcG9ydGVkIGZyb20gVVJMIVxcblxcbiR7aW1wb3J0UmVzdWx0Lm1lc3NhZ2V9XFxuVG90YWwgcGVyc29uYXM6ICR7dGhpcy5wZXJzb25hcy5zaXplfWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgJHtpbXBvcnRSZXN1bHQubWVzc2FnZX1gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgSW1wb3J0IGZyb20gVVJMIGZhaWxlZDogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJ1bigpIHtcbiAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgU3RkaW9TZXJ2ZXJUcmFuc3BvcnQoKTtcbiAgICBsb2dnZXIuaW5mbyhcIlN0YXJ0aW5nIERvbGxob3VzZU1DUCBzZXJ2ZXIuLi5cIik7XG4gICAgYXdhaXQgdGhpcy5zZXJ2ZXIuY29ubmVjdCh0cmFuc3BvcnQpO1xuICAgIC8vIE1hcmsgdGhhdCBNQ1AgaXMgbm93IGNvbm5lY3RlZCAtIG5vIG1vcmUgY29uc29sZSBvdXRwdXQgYWxsb3dlZFxuICAgIGxvZ2dlci5zZXRNQ1BDb25uZWN0ZWQoKTtcbiAgICBsb2dnZXIuaW5mbyhcIkRvbGxob3VzZU1DUCBzZXJ2ZXIgcnVubmluZyBvbiBzdGRpb1wiKTtcbiAgfVxufVxuXG4vLyBFeHBvcnQgaXMgYWxyZWFkeSBhdCBjbGFzcyBkZWNsYXJhdGlvblxuXG4vLyBPbmx5IHN0YXJ0IHRoZSBzZXJ2ZXIgaWYgdGhpcyBmaWxlIGlzIGJlaW5nIHJ1biBkaXJlY3RseSAobm90IGltcG9ydGVkIGJ5IHRlc3RzKVxuaWYgKGltcG9ydC5tZXRhLnVybCA9PT0gYGZpbGU6Ly8ke3Byb2Nlc3MuYXJndlsxXX1gICYmICFwcm9jZXNzLmVudi5KRVNUX1dPUktFUl9JRCkge1xuICBjb25zdCBzZXJ2ZXIgPSBuZXcgRG9sbGhvdXNlTUNQU2VydmVyKCk7XG4gIHNlcnZlci5ydW4oKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBsb2dnZXIuZXJyb3IoXCJGYXRhbCBlcnJvciBzdGFydGluZyBzZXJ2ZXJcIiwgZXJyb3IpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG59Il19
2180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQXdCLE1BQU0sOEJBQThCLENBQUM7QUFDaEksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBSWhFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQWdCLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pLLE9BQU8sRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsTUFB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QUFFLENBQUM7UUFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FDRjtBQUVELHlDQUF5QztBQUV6QyxtRkFBbUY7QUFDbkYsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxVQUFVLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDbkYsTUFBTSxNQUFNLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO0lBQ3hDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUMzQixNQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBTZXJ2ZXIgfSBmcm9tIFwiQG1vZGVsY29udGV4dHByb3RvY29sL3Nkay9zZXJ2ZXIvaW5kZXguanNcIjtcbmltcG9ydCB7IFN0ZGlvU2VydmVyVHJhbnNwb3J0IH0gZnJvbSBcIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvc2VydmVyL3N0ZGlvLmpzXCI7XG5pbXBvcnQgeyBNY3BFcnJvciwgRXJyb3JDb2RlIH0gZnJvbSBcIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvdHlwZXMuanNcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJ1cmxcIjtcbmltcG9ydCBtYXR0ZXIgZnJvbSBcImdyYXktbWF0dGVyXCI7XG5pbXBvcnQgeyBsb2FkSW5kaWNhdG9yQ29uZmlnLCBmb3JtYXRJbmRpY2F0b3IsIHZhbGlkYXRlQ3VzdG9tRm9ybWF0LCB0eXBlIEluZGljYXRvckNvbmZpZyB9IGZyb20gJy4vY29uZmlnL2luZGljYXRvci1jb25maWcuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eUVycm9yIH0gZnJvbSAnLi9lcnJvcnMvU2VjdXJpdHlFcnJvci5qcyc7XG5pbXBvcnQgeyBTZWN1cmVFcnJvckhhbmRsZXIgfSBmcm9tICcuL3NlY3VyaXR5L2Vycm9ySGFuZGxlci5qcyc7XG5cbi8vIEltcG9ydCBtb2R1bGFyaXplZCBjb21wb25lbnRzXG5pbXBvcnQgeyBQZXJzb25hLCBQZXJzb25hTWV0YWRhdGEgfSBmcm9tICcuL3R5cGVzL3BlcnNvbmEuanMnO1xuaW1wb3J0IHsgQVBJQ2FjaGUgfSBmcm9tICcuL2NhY2hlL0FQSUNhY2hlLmpzJztcbmltcG9ydCB7IHZhbGlkYXRlRmlsZW5hbWUsIHZhbGlkYXRlUGF0aCwgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVDb250ZW50U2l6ZSwgdmFsaWRhdGVVc2VybmFtZSwgdmFsaWRhdGVDYXRlZ29yeSwgTUNQSW5wdXRWYWxpZGF0b3IgfSBmcm9tICcuL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUywgVkFMSURBVElPTl9QQVRURVJOUyB9IGZyb20gJy4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgUGF0aFZhbGlkYXRvciB9IGZyb20gJy4vc2VjdXJpdHkvcGF0aFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBZYW1sVmFsaWRhdG9yIH0gZnJvbSAnLi9zZWN1cml0eS95YW1sVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQW5vbnltb3VzSWQsIGdlbmVyYXRlVW5pcXVlSWQsIHNsdWdpZnkgfSBmcm9tICcuL3V0aWxzL2ZpbGVzeXN0ZW0uanMnO1xuaW1wb3J0IHsgUGVyc29uYU1hbmFnZXIgfSBmcm9tICcuL3BlcnNvbmEvUGVyc29uYU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgR2l0SHViQ2xpZW50LCBDb2xsZWN0aW9uQnJvd3NlciwgQ29sbGVjdGlvblNlYXJjaCwgUGVyc29uYURldGFpbHMsIFBlcnNvbmFTdWJtaXR0ZXIsIEVsZW1lbnRJbnN0YWxsZXIgfSBmcm9tICcuL2NvbGxlY3Rpb24vaW5kZXguanMnO1xuaW1wb3J0IHsgVXBkYXRlTWFuYWdlciB9IGZyb20gJy4vdXBkYXRlL2luZGV4LmpzJztcbmltcG9ydCB7IFNlcnZlclNldHVwLCBJVG9vbEhhbmRsZXIgfSBmcm9tICcuL3NlcnZlci9pbmRleC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBQZXJzb25hRXhwb3J0ZXIsIFBlcnNvbmFJbXBvcnRlciwgUGVyc29uYVNoYXJlciB9IGZyb20gJy4vcGVyc29uYS9leHBvcnQtaW1wb3J0L2luZGV4LmpzJztcbmltcG9ydCB7IGlzRGVmYXVsdFBlcnNvbmEgfSBmcm9tICcuL2NvbnN0YW50cy9kZWZhdWx0UGVyc29uYXMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciwgRWxlbWVudFR5cGUgfSBmcm9tICcuL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IE1pZ3JhdGlvbk1hbmFnZXIgfSBmcm9tICcuL3BvcnRmb2xpby9NaWdyYXRpb25NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNraWxsTWFuYWdlciB9IGZyb20gJy4vZWxlbWVudHMvc2tpbGxzL2luZGV4LmpzJztcbmltcG9ydCB7IFRlbXBsYXRlTWFuYWdlciB9IGZyb20gJy4vZWxlbWVudHMvdGVtcGxhdGVzL1RlbXBsYXRlTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBBZ2VudE1hbmFnZXIgfSBmcm9tICcuL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIuanMnO1xuXG5cblxuZXhwb3J0IGNsYXNzIERvbGxob3VzZU1DUFNlcnZlciBpbXBsZW1lbnRzIElUb29sSGFuZGxlciB7XG4gIHByaXZhdGUgc2VydmVyOiBTZXJ2ZXI7XG4gIHByaXZhdGUgcGVyc29uYXNEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSBwZXJzb25hczogTWFwPHN0cmluZywgUGVyc29uYT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgYWN0aXZlUGVyc29uYTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFVzZXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFwaUNhY2hlOiBBUElDYWNoZSA9IG5ldyBBUElDYWNoZSgpO1xuICBwcml2YXRlIHJhdGVMaW1pdFRyYWNrZXIgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCk7XG4gIHByaXZhdGUgaW5kaWNhdG9yQ29uZmlnOiBJbmRpY2F0b3JDb25maWc7XG4gIHByaXZhdGUgcGVyc29uYU1hbmFnZXI6IFBlcnNvbmFNYW5hZ2VyO1xuICBwcml2YXRlIGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50O1xuICBwcml2YXRlIGNvbGxlY3Rpb25Ccm93c2VyOiBDb2xsZWN0aW9uQnJvd3NlcjtcbiAgcHJpdmF0ZSBjb2xsZWN0aW9uU2VhcmNoOiBDb2xsZWN0aW9uU2VhcmNoO1xuICBwcml2YXRlIHBlcnNvbmFEZXRhaWxzOiBQZXJzb25hRGV0YWlscztcbiAgcHJpdmF0ZSBlbGVtZW50SW5zdGFsbGVyOiBFbGVtZW50SW5zdGFsbGVyO1xuICBwcml2YXRlIHBlcnNvbmFTdWJtaXR0ZXI6IFBlcnNvbmFTdWJtaXR0ZXI7XG4gIHByaXZhdGUgdXBkYXRlTWFuYWdlcjogVXBkYXRlTWFuYWdlcjtcbiAgcHJpdmF0ZSBzZXJ2ZXJTZXR1cDogU2VydmVyU2V0dXA7XG4gIHByaXZhdGUgcGVyc29uYUV4cG9ydGVyOiBQZXJzb25hRXhwb3J0ZXI7XG4gIHByaXZhdGUgcGVyc29uYUltcG9ydGVyOiBQZXJzb25hSW1wb3J0ZXI7XG4gIHByaXZhdGUgcGVyc29uYVNoYXJlcjogUGVyc29uYVNoYXJlcjtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcml2YXRlIG1pZ3JhdGlvbk1hbmFnZXI6IE1pZ3JhdGlvbk1hbmFnZXI7XG4gIHByaXZhdGUgc2tpbGxNYW5hZ2VyOiBTa2lsbE1hbmFnZXI7XG4gIHByaXZhdGUgdGVtcGxhdGVNYW5hZ2VyOiBUZW1wbGF0ZU1hbmFnZXI7XG4gIHByaXZhdGUgYWdlbnRNYW5hZ2VyOiBBZ2VudE1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zZXJ2ZXIgPSBuZXcgU2VydmVyKFxuICAgICAge1xuICAgICAgICBuYW1lOiBcImRvbGxob3VzZW1jcFwiLFxuICAgICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICB0b29sczoge30sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEluaXRpYWxpemUgcG9ydGZvbGlvIHN5c3RlbVxuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB0aGlzLm1pZ3JhdGlvbk1hbmFnZXIgPSBuZXcgTWlncmF0aW9uTWFuYWdlcih0aGlzLnBvcnRmb2xpb01hbmFnZXIpO1xuICAgIFxuICAgIC8vIFVzZSBwb3J0Zm9saW8gcGVyc29uYXMgZGlyZWN0b3J5XG4gICAgdGhpcy5wZXJzb25hc0RpciA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLlBFUlNPTkEpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgZWxlbWVudCBtYW5hZ2Vyc1xuICAgIHRoaXMuc2tpbGxNYW5hZ2VyID0gbmV3IFNraWxsTWFuYWdlcigpO1xuICAgIHRoaXMudGVtcGxhdGVNYW5hZ2VyID0gbmV3IFRlbXBsYXRlTWFuYWdlcigpO1xuICAgIHRoaXMuYWdlbnRNYW5hZ2VyID0gbmV3IEFnZW50TWFuYWdlcih0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0QmFzZURpcigpKTtcbiAgICBcbiAgICAvLyBMb2cgcmVzb2x2ZWQgcGF0aCBmb3IgZGVidWdnaW5nXG4gICAgbG9nZ2VyLmluZm8oYFBlcnNvbmFzIGRpcmVjdG9yeSByZXNvbHZlZCB0bzogJHt0aGlzLnBlcnNvbmFzRGlyfWApO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgUGF0aFZhbGlkYXRvciB3aXRoIHRoZSBwZXJzb25hcyBkaXJlY3RvcnlcbiAgICBQYXRoVmFsaWRhdG9yLmluaXRpYWxpemUodGhpcy5wZXJzb25hc0Rpcik7XG4gICAgXG4gICAgLy8gTG9hZCB1c2VyIGlkZW50aXR5IGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgdGhpcy5jdXJyZW50VXNlciA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9VU0VSIHx8IG51bGw7XG4gICAgXG4gICAgLy8gTG9hZCBpbmRpY2F0b3IgY29uZmlndXJhdGlvblxuICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnID0gbG9hZEluZGljYXRvckNvbmZpZygpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgcGVyc29uYSBtYW5hZ2VyXG4gICAgdGhpcy5wZXJzb25hTWFuYWdlciA9IG5ldyBQZXJzb25hTWFuYWdlcih0aGlzLnBlcnNvbmFzRGlyLCB0aGlzLmluZGljYXRvckNvbmZpZyk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBjb2xsZWN0aW9uIG1vZHVsZXNcbiAgICB0aGlzLmdpdGh1YkNsaWVudCA9IG5ldyBHaXRIdWJDbGllbnQodGhpcy5hcGlDYWNoZSwgdGhpcy5yYXRlTGltaXRUcmFja2VyKTtcbiAgICB0aGlzLmNvbGxlY3Rpb25Ccm93c2VyID0gbmV3IENvbGxlY3Rpb25Ccm93c2VyKHRoaXMuZ2l0aHViQ2xpZW50KTtcbiAgICB0aGlzLmNvbGxlY3Rpb25TZWFyY2ggPSBuZXcgQ29sbGVjdGlvblNlYXJjaCh0aGlzLmdpdGh1YkNsaWVudCk7XG4gICAgdGhpcy5wZXJzb25hRGV0YWlscyA9IG5ldyBQZXJzb25hRGV0YWlscyh0aGlzLmdpdGh1YkNsaWVudCk7XG4gICAgdGhpcy5lbGVtZW50SW5zdGFsbGVyID0gbmV3IEVsZW1lbnRJbnN0YWxsZXIodGhpcy5naXRodWJDbGllbnQpO1xuICAgIHRoaXMucGVyc29uYVN1Ym1pdHRlciA9IG5ldyBQZXJzb25hU3VibWl0dGVyKCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSB1cGRhdGUgbWFuYWdlciB3aXRoIHNhZmUgZGlyZWN0b3J5XG4gICAgLy8gVXNlIHRoZSBwYXJlbnQgb2YgcGVyc29uYXMgZGlyZWN0b3J5IHRvIGF2b2lkIHByb2R1Y3Rpb24gY2hlY2tcbiAgICBjb25zdCBzYWZlRGlyID0gcGF0aC5kaXJuYW1lKHRoaXMucGVyc29uYXNEaXIpO1xuICAgIHRoaXMudXBkYXRlTWFuYWdlciA9IG5ldyBVcGRhdGVNYW5hZ2VyKHNhZmVEaXIpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgZXhwb3J0L2ltcG9ydC9zaGFyZSBtb2R1bGVzXG4gICAgdGhpcy5wZXJzb25hRXhwb3J0ZXIgPSBuZXcgUGVyc29uYUV4cG9ydGVyKHRoaXMuY3VycmVudFVzZXIpO1xuICAgIHRoaXMucGVyc29uYUltcG9ydGVyID0gbmV3IFBlcnNvbmFJbXBvcnRlcih0aGlzLnBlcnNvbmFzRGlyLCB0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICB0aGlzLnBlcnNvbmFTaGFyZXIgPSBuZXcgUGVyc29uYVNoYXJlcih0aGlzLmdpdGh1YkNsaWVudCwgdGhpcy5jdXJyZW50VXNlcik7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBzZXJ2ZXIgc2V0dXBcbiAgICB0aGlzLnNlcnZlclNldHVwID0gbmV3IFNlcnZlclNldHVwKCk7XG4gICAgdGhpcy5zZXJ2ZXJTZXR1cC5zZXR1cFNlcnZlcih0aGlzLnNlcnZlciwgdGhpcyk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBwb3J0Zm9saW8gYW5kIHBlcmZvcm0gbWlncmF0aW9uIGlmIG5lZWRlZFxuICAgIHRoaXMuaW5pdGlhbGl6ZVBvcnRmb2xpbygpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5sb2FkUGVyc29uYXMoKTtcbiAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIHBvcnRmb2xpbzogJHtlcnJvcn1gKTtcbiAgICB9KTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplUG9ydGZvbGlvKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIG1pZ3JhdGlvbiBpcyBuZWVkZWRcbiAgICBjb25zdCBuZWVkc01pZ3JhdGlvbiA9IGF3YWl0IHRoaXMubWlncmF0aW9uTWFuYWdlci5uZWVkc01pZ3JhdGlvbigpO1xuICAgIFxuICAgIGlmIChuZWVkc01pZ3JhdGlvbikge1xuICAgICAgbG9nZ2VyLmluZm8oJ0xlZ2FjeSBwZXJzb25hcyBkZXRlY3RlZC4gU3RhcnRpbmcgbWlncmF0aW9uLi4uJyk7XG4gICAgICBcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubWlncmF0aW9uTWFuYWdlci5taWdyYXRlKHsgYmFja3VwOiB0cnVlIH0pO1xuICAgICAgXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFN1Y2Nlc3NmdWxseSBtaWdyYXRlZCAke3Jlc3VsdC5taWdyYXRlZENvdW50fSBwZXJzb25hc2ApO1xuICAgICAgICBpZiAocmVzdWx0LmJhY2tlZFVwICYmIHJlc3VsdC5iYWNrdXBQYXRoKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYEJhY2t1cCBjcmVhdGVkIGF0OiAke3Jlc3VsdC5iYWNrdXBQYXRofWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ01pZ3JhdGlvbiBjb21wbGV0ZWQgd2l0aCBlcnJvcnM6Jyk7XG4gICAgICAgIHJlc3VsdC5lcnJvcnMuZm9yRWFjaChlcnIgPT4gbG9nZ2VyLmVycm9yKGAgIC0gJHtlcnJ9YCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBFbnN1cmUgcG9ydGZvbGlvIHN0cnVjdHVyZSBleGlzdHNcbiAgICBjb25zdCBwb3J0Zm9saW9FeGlzdHMgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZXhpc3RzKCk7XG4gICAgaWYgKCFwb3J0Zm9saW9FeGlzdHMpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdDcmVhdGluZyBwb3J0Zm9saW8gZGlyZWN0b3J5IHN0cnVjdHVyZS4uLicpO1xuICAgICAgYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmluaXRpYWxpemUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBUb29sIGhhbmRsZXIgbWV0aG9kcyAtIG5vdyBwdWJsaWMgZm9yIGFjY2VzcyBmcm9tIHRvb2wgbW9kdWxlc1xuICBcbiAgcHJpdmF0ZSBnZXRQZXJzb25hSW5kaWNhdG9yKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZVBlcnNvbmEpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh0aGlzLmFjdGl2ZVBlcnNvbmEpO1xuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdEluZGljYXRvcih0aGlzLmluZGljYXRvckNvbmZpZywge1xuICAgICAgbmFtZTogcGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgICAgdmVyc2lvbjogcGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgYXV0aG9yOiBwZXJzb25hLm1ldGFkYXRhLmF1dGhvcixcbiAgICAgIGNhdGVnb3J5OiBwZXJzb25hLm1ldGFkYXRhLmNhdGVnb3J5XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRQZXJzb25hcygpIHtcbiAgICAvLyBWYWxpZGF0ZSB0aGUgcGVyc29uYXMgZGlyZWN0b3J5IHBhdGhcbiAgICBpZiAoIXBhdGguaXNBYnNvbHV0ZSh0aGlzLnBlcnNvbmFzRGlyKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYFBlcnNvbmFzIGRpcmVjdG9yeSBwYXRoIGlzIG5vdCBhYnNvbHV0ZTogJHt0aGlzLnBlcnNvbmFzRGlyfWApO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKHRoaXMucGVyc29uYXNEaXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBDcmVhdGUgcGVyc29uYXMgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHRoaXMucGVyc29uYXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBsb2dnZXIuaW5mbyhgQ3JlYXRlZCBwZXJzb25hcyBkaXJlY3RvcnkgYXQ6ICR7dGhpcy5wZXJzb25hc0Rpcn1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAobWtkaXJFcnJvcjogYW55KSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBwZXJzb25hcyBkaXJlY3RvcnkgYXQgJHt0aGlzLnBlcnNvbmFzRGlyfTogJHtta2RpckVycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBwZXJzb25hcyBkaXJlY3Rvcnk6ICR7bWtkaXJFcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIodGhpcy5wZXJzb25hc0Rpcik7XG4gICAgICBjb25zdCBtYXJrZG93bkZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgnLm1kJykpO1xuXG4gICAgICB0aGlzLnBlcnNvbmFzLmNsZWFyKCk7XG5cbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBtYXJrZG93bkZpbGVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciwgZmlsZSk7XG4gICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBQYXRoVmFsaWRhdG9yLnNhZmVSZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gVXNlIHNlY3VyZSBZQU1MIHBhcnNlclxuICAgICAgICAgIGxldCBwYXJzZWQ7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIuc2FmZU1hdHRlcihmaWxlQ29udGVudCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlY3VyaXR5RXJyb3IpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYFNlY3VyaXR5IHRocmVhdCBkZXRlY3RlZCBpbiBwZXJzb25hICR7ZmlsZX06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZWQuZGF0YSBhcyBQZXJzb25hTWV0YWRhdGE7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IHBhcnNlZC5jb250ZW50O1xuXG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5uYW1lKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5uYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlLCAnLm1kJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gR2VuZXJhdGUgdW5pcXVlIElEIGlmIG5vdCBwcmVzZW50XG4gICAgICAgICAgbGV0IHVuaXF1ZUlkID0gbWV0YWRhdGEudW5pcXVlX2lkO1xuICAgICAgICAgIGlmICghdW5pcXVlSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGF1dGhvckZvcklkID0gbWV0YWRhdGEuYXV0aG9yIHx8IHRoaXMuZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpO1xuICAgICAgICAgICAgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKG1ldGFkYXRhLm5hbWUsIGF1dGhvckZvcklkKTtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgR2VuZXJhdGVkIHVuaXF1ZSBJRCBmb3IgJHttZXRhZGF0YS5uYW1lfTogJHt1bmlxdWVJZH1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyBtZXRhZGF0YSBmaWVsZHNcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLmNhdGVnb3J5KSBtZXRhZGF0YS5jYXRlZ29yeSA9ICdnZW5lcmFsJztcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLmFnZV9yYXRpbmcpIG1ldGFkYXRhLmFnZV9yYXRpbmcgPSAnYWxsJztcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLmNvbnRlbnRfZmxhZ3MpIG1ldGFkYXRhLmNvbnRlbnRfZmxhZ3MgPSBbXTtcbiAgICAgICAgICBpZiAobWV0YWRhdGEuYWlfZ2VuZXJhdGVkID09PSB1bmRlZmluZWQpIG1ldGFkYXRhLmFpX2dlbmVyYXRlZCA9IGZhbHNlO1xuICAgICAgICAgIGlmICghbWV0YWRhdGEuZ2VuZXJhdGlvbl9tZXRob2QpIG1ldGFkYXRhLmdlbmVyYXRpb25fbWV0aG9kID0gJ2h1bWFuJztcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLnByaWNlKSBtZXRhZGF0YS5wcmljZSA9ICdmcmVlJztcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLmxpY2Vuc2UpIG1ldGFkYXRhLmxpY2Vuc2UgPSAnQ0MtQlktU0EtNC4wJztcblxuICAgICAgICAgIGNvbnN0IHBlcnNvbmE6IFBlcnNvbmEgPSB7XG4gICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICBmaWxlbmFtZTogZmlsZSxcbiAgICAgICAgICAgIHVuaXF1ZV9pZDogdW5pcXVlSWQsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRoaXMucGVyc29uYXMuc2V0KGZpbGUsIHBlcnNvbmEpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgTG9hZGVkIHBlcnNvbmE6ICR7bWV0YWRhdGEubmFtZX0gKCR7dW5pcXVlSWR9YCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBFcnJvciBsb2FkaW5nIHBlcnNvbmEgJHtmaWxlfTogJHtlcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIHJlYWRpbmcgcGVyc29uYXMgZGlyZWN0b3J5OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxpc3RQZXJzb25hcygpIHtcbiAgICBjb25zdCBwZXJzb25hTGlzdCA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkubWFwKHBlcnNvbmEgPT4gKHtcbiAgICAgIGZpbGVuYW1lOiBwZXJzb25hLmZpbGVuYW1lLFxuICAgICAgdW5pcXVlX2lkOiBwZXJzb25hLnVuaXF1ZV9pZCxcbiAgICAgIG5hbWU6IHBlcnNvbmEubWV0YWRhdGEubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwZXJzb25hLm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgdHJpZ2dlcnM6IHBlcnNvbmEubWV0YWRhdGEudHJpZ2dlcnMgfHwgW10sXG4gICAgICB2ZXJzaW9uOiBwZXJzb25hLm1ldGFkYXRhLnZlcnNpb24gfHwgXCIxLjBcIixcbiAgICAgIGF1dGhvcjogcGVyc29uYS5tZXRhZGF0YS5hdXRob3IgfHwgXCJVbmtub3duXCIsXG4gICAgICBjYXRlZ29yeTogcGVyc29uYS5tZXRhZGF0YS5jYXRlZ29yeSB8fCAnZ2VuZXJhbCcsXG4gICAgICBhZ2VfcmF0aW5nOiBwZXJzb25hLm1ldGFkYXRhLmFnZV9yYXRpbmcgfHwgJ2FsbCcsXG4gICAgICBwcmljZTogcGVyc29uYS5tZXRhZGF0YS5wcmljZSB8fCAnZnJlZScsXG4gICAgICBhaV9nZW5lcmF0ZWQ6IHBlcnNvbmEubWV0YWRhdGEuYWlfZ2VuZXJhdGVkIHx8IGZhbHNlLFxuICAgICAgYWN0aXZlOiB0aGlzLmFjdGl2ZVBlcnNvbmEgPT09IHBlcnNvbmEuZmlsZW5hbWUsXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfUF2YWlsYWJsZSBQZXJzb25hcyAoJHtwZXJzb25hTGlzdC5sZW5ndGh9KTpcXG5cXG5gICtcbiAgICAgICAgICAgIHBlcnNvbmFMaXN0Lm1hcChwID0+IFxuICAgICAgICAgICAgICBgJHtwLmFjdGl2ZSA/ICfwn5S5ICcgOiAn4par77iPICd9Kioke3AubmFtZX0qKiAoJHtwLnVuaXF1ZV9pZH0pXFxuYCArXG4gICAgICAgICAgICAgIGAgICAke3AuZGVzY3JpcHRpb259XFxuYCArXG4gICAgICAgICAgICAgIGAgICDwn5OBICR7cC5jYXRlZ29yeX0gfCDwn46tICR7cC5hdXRob3J9IHwg8J+UliAke3AucHJpY2V9IHwgJHtwLmFpX2dlbmVyYXRlZCA/ICfwn6SWIEFJJyA6ICfwn5GkIEh1bWFuJ31cXG5gICtcbiAgICAgICAgICAgICAgYCAgIEFnZTogJHtwLmFnZV9yYXRpbmd9IHwgVmVyc2lvbjogJHtwLnZlcnNpb259XFxuYCArXG4gICAgICAgICAgICAgIGAgICBUcmlnZ2VyczogJHtwLnRyaWdnZXJzLmpvaW4oJywgJykgfHwgJ05vbmUnfVxcbmBcbiAgICAgICAgICAgICkuam9pbignXFxuJyksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBhY3RpdmF0ZVBlcnNvbmEocGVyc29uYUlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIC8vIEVuaGFuY2VkIGlucHV0IHZhbGlkYXRpb24gZm9yIHBlcnNvbmEgaWRlbnRpZmllclxuICAgIGNvbnN0IHZhbGlkYXRlZElkZW50aWZpZXIgPSBNQ1BJbnB1dFZhbGlkYXRvci52YWxpZGF0ZVBlcnNvbmFJZGVudGlmaWVyKHBlcnNvbmFJZGVudGlmaWVyKTtcbiAgICBcbiAgICAvLyBUcnkgdG8gZmluZCBwZXJzb25hIGJ5IGZpbGVuYW1lIGZpcnN0LCB0aGVuIGJ5IG5hbWVcbiAgICBsZXQgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHZhbGlkYXRlZElkZW50aWZpZXIpO1xuICAgIFxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgLy8gU2VhcmNoIGJ5IG5hbWVcbiAgICAgIHBlcnNvbmEgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLmZpbmQocCA9PiBcbiAgICAgICAgcC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHZhbGlkYXRlZElkZW50aWZpZXIudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIHRocm93IG5ldyBNY3BFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLkludmFsaWRQYXJhbXMsXG4gICAgICAgIGBQZXJzb25hIG5vdCBmb3VuZDogJHtwZXJzb25hSWRlbnRpZmllcn1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlUGVyc29uYSA9IHBlcnNvbmEuZmlsZW5hbWU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9UGVyc29uYSBBY3RpdmF0ZWQ6ICoqJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9KipcXG5cXG5gICtcbiAgICAgICAgICAgIGAke3BlcnNvbmEubWV0YWRhdGEuZGVzY3JpcHRpb259XFxuXFxuYCArXG4gICAgICAgICAgICBgKipJbnN0cnVjdGlvbnM6KipcXG4ke3BlcnNvbmEuY29udGVudH1gLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0QWN0aXZlUGVyc29uYSgpIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlUGVyc29uYSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9Tm8gcGVyc29uYSBpcyBjdXJyZW50bHkgYWN0aXZlLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHRoaXMuYWN0aXZlUGVyc29uYSk7XG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICB0aGlzLmFjdGl2ZVBlcnNvbmEgPSBudWxsO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9QWN0aXZlIHBlcnNvbmEgbm90IGZvdW5kLiBEZWFjdGl2YXRlZC5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX1BY3RpdmUgUGVyc29uYTogKioke3BlcnNvbmEubWV0YWRhdGEubmFtZX0qKlxcblxcbmAgK1xuICAgICAgICAgICAgYCR7cGVyc29uYS5tZXRhZGF0YS5kZXNjcmlwdGlvbn1cXG5cXG5gICtcbiAgICAgICAgICAgIGBGaWxlOiAke3BlcnNvbmEuZmlsZW5hbWV9XFxuYCArXG4gICAgICAgICAgICBgVmVyc2lvbjogJHtwZXJzb25hLm1ldGFkYXRhLnZlcnNpb24gfHwgJzEuMCd9XFxuYCArXG4gICAgICAgICAgICBgQXV0aG9yOiAke3BlcnNvbmEubWV0YWRhdGEuYXV0aG9yIHx8ICdVbmtub3duJ31gLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVhY3RpdmF0ZVBlcnNvbmEoKSB7XG4gICAgY29uc3Qgd2FzQWN0aXZlID0gdGhpcy5hY3RpdmVQZXJzb25hICE9PSBudWxsO1xuICAgIGNvbnN0IGluZGljYXRvciA9IHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpO1xuICAgIHRoaXMuYWN0aXZlUGVyc29uYSA9IG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogd2FzQWN0aXZlIFxuICAgICAgICAgICAgPyBgJHtpbmRpY2F0b3J94pyFIFBlcnNvbmEgZGVhY3RpdmF0ZWQuIEJhY2sgdG8gZGVmYXVsdCBtb2RlLmBcbiAgICAgICAgICAgIDogXCJObyBwZXJzb25hIHdhcyBhY3RpdmUuXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBnZXRQZXJzb25hRGV0YWlscyhwZXJzb25hSWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgLy8gVHJ5IHRvIGZpbmQgcGVyc29uYSBieSBmaWxlbmFtZSBmaXJzdCwgdGhlbiBieSBuYW1lXG4gICAgbGV0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldChwZXJzb25hSWRlbnRpZmllcik7XG4gICAgXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAvLyBTZWFyY2ggYnkgbmFtZVxuICAgICAgcGVyc29uYSA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkuZmluZChwID0+IFxuICAgICAgICBwLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGVyc29uYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIHRocm93IG5ldyBNY3BFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLkludmFsaWRQYXJhbXMsXG4gICAgICAgIGBQZXJzb25hIG5vdCBmb3VuZDogJHtwZXJzb25hSWRlbnRpZmllcn1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3wn5OLICoqJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9KiogRGV0YWlsc1xcblxcbmAgK1xuICAgICAgICAgICAgYCoqRGVzY3JpcHRpb246KiogJHtwZXJzb25hLm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxcbmAgK1xuICAgICAgICAgICAgYCoqRmlsZToqKiAke3BlcnNvbmEuZmlsZW5hbWV9XFxuYCArXG4gICAgICAgICAgICBgKipWZXJzaW9uOioqICR7cGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAnfVxcbmAgK1xuICAgICAgICAgICAgYCoqQXV0aG9yOioqICR7cGVyc29uYS5tZXRhZGF0YS5hdXRob3IgfHwgJ1Vua25vd24nfVxcbmAgK1xuICAgICAgICAgICAgYCoqVHJpZ2dlcnM6KiogJHtwZXJzb25hLm1ldGFkYXRhLnRyaWdnZXJzPy5qb2luKCcsICcpIHx8ICdOb25lJ31cXG5cXG5gICtcbiAgICAgICAgICAgIGAqKkZ1bGwgQ29udGVudDoqKlxcblxcYFxcYFxcYFxcbiR7cGVyc29uYS5jb250ZW50fVxcblxcYFxcYFxcYGAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBhc3luYyByZWxvYWRQZXJzb25hcygpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3wn5SEIFJlbG9hZGVkICR7dGhpcy5wZXJzb25hcy5zaXplfSBwZXJzb25hcyBmcm9tICR7dGhpcy5wZXJzb25hc0Rpcn1gLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgLy8gPT09PT0gRWxlbWVudCBNZXRob2RzIChHZW5lcmljIGZvciBhbGwgZWxlbWVudCB0eXBlcykgPT09PT1cbiAgXG4gIGFzeW5jIGxpc3RFbGVtZW50cyh0eXBlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3BlcnNvbmFzJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5saXN0UGVyc29uYXMoKTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSAnc2tpbGxzJzoge1xuICAgICAgICAgIGNvbnN0IHNraWxscyA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICBpZiAoc2tpbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIvCfk5ogTm8gc2tpbGxzIGZvdW5kIGluIHlvdXIgcG9ydGZvbGlvLiBTa2lsbHMgYXJlIGRpc2NyZXRlIGNhcGFiaWxpdGllcyBmb3Igc3BlY2lmaWMgdGFza3MuXCJcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHNraWxsTGlzdCA9IHNraWxscy5tYXAoc2tpbGwgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tcGxleGl0eSA9IHNraWxsLm1ldGFkYXRhLmNvbXBsZXhpdHkgfHwgJ2JlZ2lubmVyJztcbiAgICAgICAgICAgIGNvbnN0IGRvbWFpbnMgPSBza2lsbC5tZXRhZGF0YS5kb21haW5zPy5qb2luKCcsICcpIHx8ICdnZW5lcmFsJztcbiAgICAgICAgICAgIHJldHVybiBg8J+boO+4jyAke3NraWxsLm1ldGFkYXRhLm5hbWV9IC0gJHtza2lsbC5tZXRhZGF0YS5kZXNjcmlwdGlvbn1cXG4gICBDb21wbGV4aXR5OiAke2NvbXBsZXhpdHl9IHwgRG9tYWluczogJHtkb21haW5zfWA7XG4gICAgICAgICAgfSkuam9pbignXFxuXFxuJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg8J+TmiBBdmFpbGFibGUgU2tpbGxzOlxcblxcbiR7c2tpbGxMaXN0fWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSAndGVtcGxhdGVzJzoge1xuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IHRoaXMudGVtcGxhdGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICBpZiAodGVtcGxhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIvCfk50gTm8gdGVtcGxhdGVzIGZvdW5kIGluIHlvdXIgcG9ydGZvbGlvLiBUZW1wbGF0ZXMgYXJlIHJldXNhYmxlIGNvbnRlbnQgc3RydWN0dXJlcy5cIlxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVMaXN0ID0gdGVtcGxhdGVzLm1hcCh0ZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZXMgPSB0ZW1wbGF0ZS5tZXRhZGF0YS52YXJpYWJsZXM/Lm1hcCh2ID0+IHYubmFtZSkuam9pbignLCAnKSB8fCAnbm9uZSc7XG4gICAgICAgICAgICByZXR1cm4gYPCfk4QgJHt0ZW1wbGF0ZS5tZXRhZGF0YS5uYW1lfSAtICR7dGVtcGxhdGUubWV0YWRhdGEuZGVzY3JpcHRpb259XFxuICAgVmFyaWFibGVzOiAke3ZhcmlhYmxlc31gO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcblxcbicpO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCfk50gQXZhaWxhYmxlIFRlbXBsYXRlczpcXG5cXG4ke3RlbXBsYXRlTGlzdH1gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgJ2FnZW50cyc6IHtcbiAgICAgICAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5saXN0KCk7XG4gICAgICAgICAgaWYgKGFnZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogXCLwn6SWIE5vIGFnZW50cyBmb3VuZCBpbiB5b3VyIHBvcnRmb2xpby4gQWdlbnRzIGFyZSBhdXRvbm9tb3VzIGdvYWwtb3JpZW50ZWQgYWN0b3JzLlwiXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBhZ2VudExpc3QgPSBhZ2VudHMubWFwKGFnZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNwZWNpYWxpemF0aW9ucyA9IChhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLnNwZWNpYWxpemF0aW9ucz8uam9pbignLCAnKSB8fCAnZ2VuZXJhbCc7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSBhZ2VudC5nZXRTdGF0dXMoKTtcbiAgICAgICAgICAgIHJldHVybiBg8J+kliAke2FnZW50Lm1ldGFkYXRhLm5hbWV9IC0gJHthZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbn1cXG4gICBTdGF0dXM6ICR7c3RhdHVzfSB8IFNwZWNpYWxpemF0aW9uczogJHtzcGVjaWFsaXphdGlvbnN9YDtcbiAgICAgICAgICB9KS5qb2luKCdcXG5cXG4nKTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn6SWIEF2YWlsYWJsZSBBZ2VudHM6XFxuXFxuJHthZ2VudExpc3R9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfScuIEF2YWlsYWJsZSB0eXBlczogcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhZ2VudHNgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxpc3QgJHt0eXBlfSBlbGVtZW50czpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGxpc3QgJHt0eXBlfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdwZXJzb25hcyc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZhdGVQZXJzb25hKG5hbWUpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlICdza2lsbHMnOiB7XG4gICAgICAgICAgY29uc3Qgc2tpbGwgPSBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5maW5kKHMgPT4gcy5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIXNraWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgU2tpbGwgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEFjdGl2YXRlIHRoZSBza2lsbFxuICAgICAgICAgIGF3YWl0IHNraWxsLmFjdGl2YXRlPy4oKTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4pyFIFNraWxsICcke25hbWV9JyBhY3RpdmF0ZWRcXG5cXG4ke3NraWxsLmluc3RydWN0aW9uc31gXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSAndGVtcGxhdGVzJzoge1xuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIuZmluZCh0ID0+IHQubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFRlbXBsYXRlICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCB2YXJpYWJsZXMgPSB0ZW1wbGF0ZS5tZXRhZGF0YS52YXJpYWJsZXM/Lm1hcCh2ID0+IHYubmFtZSkuam9pbignLCAnKSB8fCAnbm9uZSc7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4pyFIFRlbXBsYXRlICcke25hbWV9JyByZWFkeSB0byB1c2VcXG5WYXJpYWJsZXM6ICR7dmFyaWFibGVzfVxcblxcblVzZSAncmVuZGVyX3RlbXBsYXRlJyB0byBnZW5lcmF0ZSBjb250ZW50IHdpdGggdGhpcyB0ZW1wbGF0ZS5gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgJ2FnZW50cyc6IHtcbiAgICAgICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmZpbmQoYSA9PiBhLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCBBZ2VudCAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQWN0aXZhdGUgdGhlIGFnZW50XG4gICAgICAgICAgYXdhaXQgYWdlbnQuYWN0aXZhdGUoKTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinIUgQWdlbnQgJyR7bmFtZX0nIGFjdGl2YXRlZCBhbmQgcmVhZHlcXG5TcGVjaWFsaXphdGlvbnM6ICR7KGFnZW50Lm1ldGFkYXRhIGFzIGFueSkuc3BlY2lhbGl6YXRpb25zPy5qb2luKCcsICcpIHx8ICdnZW5lcmFsJ31cXG5cXG5Vc2UgJ2V4ZWN1dGVfYWdlbnQnIHRvIGdpdmUgdGhpcyBhZ2VudCBhIGdvYWwuYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGFjdGl2YXRlICR7dHlwZX0gJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gYWN0aXZhdGUgJHt0eXBlfSAnJHtuYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGdldEFjdGl2ZUVsZW1lbnRzKHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAncGVyc29uYXMnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZVBlcnNvbmEoKTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSAnc2tpbGxzJzoge1xuICAgICAgICAgIGNvbnN0IHNraWxscyA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICBjb25zdCBhY3RpdmVTa2lsbHMgPSBza2lsbHMuZmlsdGVyKHMgPT4gcy5nZXRTdGF0dXMoKSA9PT0gJ2FjdGl2ZScpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChhY3RpdmVTa2lsbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IFwi8J+TiyBObyBhY3RpdmUgc2tpbGxzXCJcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHNraWxsTGlzdCA9IGFjdGl2ZVNraWxscy5tYXAocyA9PiBg8J+boO+4jyAke3MubWV0YWRhdGEubmFtZX1gKS5qb2luKCcsICcpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYEFjdGl2ZSBza2lsbHM6ICR7c2tpbGxMaXN0fWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSAndGVtcGxhdGVzJzoge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogXCLwn5OdIFRlbXBsYXRlcyBhcmUgc3RhdGVsZXNzIGFuZCBhY3RpdmF0ZWQgb24tZGVtYW5kIHdoZW4gcmVuZGVyaW5nXCJcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSAnYWdlbnRzJzoge1xuICAgICAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICBjb25zdCBhY3RpdmVBZ2VudHMgPSBhZ2VudHMuZmlsdGVyKGEgPT4gYS5nZXRTdGF0dXMoKSA9PT0gJ2FjdGl2ZScpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChhY3RpdmVBZ2VudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IFwi8J+kliBObyBhY3RpdmUgYWdlbnRzXCJcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IGFnZW50TGlzdCA9IGFjdGl2ZUFnZW50cy5tYXAoYSA9PiB7XG4gICAgICAgICAgICBjb25zdCBnb2FscyA9IChhIGFzIGFueSkuc3RhdGU/LmdvYWxzPy5sZW5ndGggfHwgMDtcbiAgICAgICAgICAgIHJldHVybiBg8J+kliAke2EubWV0YWRhdGEubmFtZX0gKCR7Z29hbHN9IGFjdGl2ZSBnb2FscylgO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYEFjdGl2ZSBhZ2VudHM6XFxuJHthZ2VudExpc3R9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGdldCBhY3RpdmUgJHt0eXBlfTpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGdldCBhY3RpdmUgJHt0eXBlfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZGVhY3RpdmF0ZUVsZW1lbnQobmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3BlcnNvbmFzJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5kZWFjdGl2YXRlUGVyc29uYSgpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlICdza2lsbHMnOiB7XG4gICAgICAgICAgY29uc3Qgc2tpbGwgPSBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5maW5kKHMgPT4gcy5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIXNraWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgU2tpbGwgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGF3YWl0IHNraWxsLmRlYWN0aXZhdGU/LigpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKchSBTa2lsbCAnJHtuYW1lfScgZGVhY3RpdmF0ZWRgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgJ3RlbXBsYXRlcyc6IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IFwi8J+TnSBUZW1wbGF0ZXMgYXJlIHN0YXRlbGVzcyAtIG5vdGhpbmcgdG8gZGVhY3RpdmF0ZVwiXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgJ2FnZW50cyc6IHtcbiAgICAgICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmZpbmQoYSA9PiBhLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCBBZ2VudCAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgYXdhaXQgYWdlbnQuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKchSBBZ2VudCAnJHtuYW1lfScgZGVhY3RpdmF0ZWRgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGVhY3RpdmF0ZSAke3R5cGV9ICcke25hbWV9JzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGRlYWN0aXZhdGUgJHt0eXBlfSAnJHtuYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGdldEVsZW1lbnREZXRhaWxzKG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdwZXJzb25hcyc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGVyc29uYURldGFpbHMobmFtZSk7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgJ3NraWxscyc6IHtcbiAgICAgICAgICBjb25zdCBza2lsbCA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmZpbmQocyA9PiBzLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgIGlmICghc2tpbGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCBTa2lsbCAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgZGV0YWlscyA9IFtcbiAgICAgICAgICAgIGDwn5ug77iPICoqJHtza2lsbC5tZXRhZGF0YS5uYW1lfSoqYCxcbiAgICAgICAgICAgIGAke3NraWxsLm1ldGFkYXRhLmRlc2NyaXB0aW9ufWAsXG4gICAgICAgICAgICBgYCxcbiAgICAgICAgICAgIGAqKkNvbXBsZXhpdHkqKjogJHtza2lsbC5tZXRhZGF0YS5jb21wbGV4aXR5IHx8ICdiZWdpbm5lcid9YCxcbiAgICAgICAgICAgIGAqKkRvbWFpbnMqKjogJHtza2lsbC5tZXRhZGF0YS5kb21haW5zPy5qb2luKCcsICcpIHx8ICdnZW5lcmFsJ31gLFxuICAgICAgICAgICAgYCoqTGFuZ3VhZ2VzKio6ICR7c2tpbGwubWV0YWRhdGEubGFuZ3VhZ2VzPy5qb2luKCcsICcpIHx8ICdhbnknfWAsXG4gICAgICAgICAgICBgKipQcmVyZXF1aXNpdGVzKio6ICR7c2tpbGwubWV0YWRhdGEucHJlcmVxdWlzaXRlcz8uam9pbignLCAnKSB8fCAnbm9uZSd9YCxcbiAgICAgICAgICAgIGBgLFxuICAgICAgICAgICAgYCoqSW5zdHJ1Y3Rpb25zKio6YCxcbiAgICAgICAgICAgIHNraWxsLmluc3RydWN0aW9uc1xuICAgICAgICAgIF07XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHNraWxsLm1ldGFkYXRhLnBhcmFtZXRlcnMgJiYgc2tpbGwubWV0YWRhdGEucGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZXRhaWxzLnB1c2goJycsICcqKlBhcmFtZXRlcnMqKjonKTtcbiAgICAgICAgICAgIHNraWxsLm1ldGFkYXRhLnBhcmFtZXRlcnMuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgICAgZGV0YWlscy5wdXNoKGAtICR7cC5uYW1lfSAoJHtwLnR5cGV9KTogJHtwLmRlc2NyaXB0aW9ufWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogZGV0YWlscy5qb2luKCdcXG4nKVxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlICd0ZW1wbGF0ZXMnOiB7XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnRlbXBsYXRlTWFuYWdlci5maW5kKHQgPT4gdC5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgVGVtcGxhdGUgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBbXG4gICAgICAgICAgICBg8J+ThCAqKiR7dGVtcGxhdGUubWV0YWRhdGEubmFtZX0qKmAsXG4gICAgICAgICAgICBgJHt0ZW1wbGF0ZS5tZXRhZGF0YS5kZXNjcmlwdGlvbn1gLFxuICAgICAgICAgICAgYGAsXG4gICAgICAgICAgICBgKipPdXRwdXQgRm9ybWF0Kio6ICR7KHRlbXBsYXRlLm1ldGFkYXRhIGFzIGFueSkub3V0cHV0X2Zvcm1hdCB8fCAndGV4dCd9YCxcbiAgICAgICAgICAgIGAqKlRlbXBsYXRlIENvbnRlbnQqKjpgLFxuICAgICAgICAgICAgJ2BgYCcsXG4gICAgICAgICAgICB0ZW1wbGF0ZS5jb250ZW50LFxuICAgICAgICAgICAgJ2BgYCdcbiAgICAgICAgICBdO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICh0ZW1wbGF0ZS5tZXRhZGF0YS52YXJpYWJsZXMgJiYgdGVtcGxhdGUubWV0YWRhdGEudmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRldGFpbHMucHVzaCgnJywgJyoqVmFyaWFibGVzKio6Jyk7XG4gICAgICAgICAgICB0ZW1wbGF0ZS5tZXRhZGF0YS52YXJpYWJsZXMuZm9yRWFjaCh2ID0+IHtcbiAgICAgICAgICAgICAgZGV0YWlscy5wdXNoKGAtICR7di5uYW1lfSAoJHt2LnR5cGV9KTogJHt2LmRlc2NyaXB0aW9ufWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogZGV0YWlscy5qb2luKCdcXG4nKVxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlICdhZ2VudHMnOiB7XG4gICAgICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5maW5kKGEgPT4gYS5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIWFnZW50KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgQWdlbnQgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBbXG4gICAgICAgICAgICBg8J+kliAqKiR7YWdlbnQubWV0YWRhdGEubmFtZX0qKmAsXG4gICAgICAgICAgICBgJHthZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbn1gLFxuICAgICAgICAgICAgYGAsXG4gICAgICAgICAgICBgKipTdGF0dXMqKjogJHthZ2VudC5nZXRTdGF0dXMoKX1gLFxuICAgICAgICAgICAgYCoqU3BlY2lhbGl6YXRpb25zKio6ICR7KGFnZW50Lm1ldGFkYXRhIGFzIGFueSkuc3BlY2lhbGl6YXRpb25zPy5qb2luKCcsICcpIHx8ICdnZW5lcmFsJ31gLFxuICAgICAgICAgICAgYCoqRGVjaXNpb24gRnJhbWV3b3JrKio6ICR7KGFnZW50Lm1ldGFkYXRhIGFzIGFueSkuZGVjaXNpb25GcmFtZXdvcmsgfHwgJ3J1bGUtYmFzZWQnfWAsXG4gICAgICAgICAgICBgKipSaXNrIFRvbGVyYW5jZSoqOiAkeyhhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLnJpc2tUb2xlcmFuY2UgfHwgJ2xvdyd9YCxcbiAgICAgICAgICAgIGBgLFxuICAgICAgICAgICAgYCoqSW5zdHJ1Y3Rpb25zKio6YCxcbiAgICAgICAgICAgIChhZ2VudCBhcyBhbnkpLmluc3RydWN0aW9ucyB8fCAnTm8gaW5zdHJ1Y3Rpb25zIGF2YWlsYWJsZSdcbiAgICAgICAgICBdO1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IGFnZW50U3RhdGUgPSAoYWdlbnQgYXMgYW55KS5zdGF0ZTtcbiAgICAgICAgICBpZiAoYWdlbnRTdGF0ZT8uZ29hbHMgJiYgYWdlbnRTdGF0ZS5nb2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZXRhaWxzLnB1c2goJycsICcqKkN1cnJlbnQgR29hbHMqKjonKTtcbiAgICAgICAgICAgIGFnZW50U3RhdGUuZ29hbHMuZm9yRWFjaCgoZzogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGRldGFpbHMucHVzaChgLSAke2cuZGVzY3JpcHRpb259ICgke2cuc3RhdHVzfSlgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGRldGFpbHMuam9pbignXFxuJylcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBnZXQgJHt0eXBlfSBkZXRhaWxzIGZvciAnJHtuYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBnZXQgJHt0eXBlfSBkZXRhaWxzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyByZWxvYWRFbGVtZW50cyh0eXBlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3BlcnNvbmFzJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWxvYWRQZXJzb25hcygpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlICdza2lsbHMnOiB7XG4gICAgICAgICAgdGhpcy5za2lsbE1hbmFnZXIuY2xlYXJDYWNoZSgpO1xuICAgICAgICAgIGNvbnN0IHNraWxscyA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7c2tpbGxzLmxlbmd0aH0gc2tpbGxzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlICd0ZW1wbGF0ZXMnOiB7XG4gICAgICAgICAgLy8gVGVtcGxhdGUgbWFuYWdlciBkb2Vzbid0IGhhdmUgY2xlYXJDYWNoZSwganVzdCBsaXN0XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVzID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCflIQgUmVsb2FkZWQgJHt0ZW1wbGF0ZXMubGVuZ3RofSB0ZW1wbGF0ZXMgZnJvbSBwb3J0Zm9saW9gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgJ2FnZW50cyc6IHtcbiAgICAgICAgICAvLyBBZ2VudCBtYW5hZ2VyIGRvZXNuJ3QgaGF2ZSBjbGVhckNhY2hlLCBqdXN0IGxpc3RcbiAgICAgICAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5saXN0KCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg8J+UhCBSZWxvYWRlZCAke2FnZW50cy5sZW5ndGh9IGFnZW50cyBmcm9tIHBvcnRmb2xpb2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byByZWxvYWQgJHt0eXBlfTpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIHJlbG9hZCAke3R5cGV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICAvLyBFbGVtZW50LXNwZWNpZmljIG1ldGhvZHNcbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGUobmFtZTogc3RyaW5nLCB2YXJpYWJsZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnRlbXBsYXRlTWFuYWdlci5maW5kKHQgPT4gdC5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgIGlmICghdGVtcGxhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIFRlbXBsYXRlICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2ltcGxlIHRlbXBsYXRlIHJlbmRlcmluZyAtIHJlcGxhY2UgdmFyaWFibGVzIGluIGNvbnRlbnRcbiAgICAgIGxldCByZW5kZXJlZCA9IHRlbXBsYXRlLmNvbnRlbnQ7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMpKSB7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXHtcXFxce1xcXFxzKiR7a2V5fVxcXFxzKlxcXFx9XFxcXH1gLCAnZycpO1xuICAgICAgICByZW5kZXJlZCA9IHJlbmRlcmVkLnJlcGxhY2UocmVnZXgsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg8J+ThCBSZW5kZXJlZCB0ZW1wbGF0ZSAnJHtuYW1lfSc6XFxuXFxuJHtyZW5kZXJlZH1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byByZW5kZXIgdGVtcGxhdGUgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gcmVuZGVyIHRlbXBsYXRlOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBleGVjdXRlQWdlbnQobmFtZTogc3RyaW5nLCBnb2FsOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5maW5kKGEgPT4gYS5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIEFnZW50ICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2ltcGxlIGFnZW50IGV4ZWN1dGlvbiBzaW11bGF0aW9uXG4gICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIHN1bW1hcnk6IGBBZ2VudCAnJHtuYW1lfScgaXMgbm93IHdvcmtpbmcgb246ICR7Z29hbH1gLFxuICAgICAgICBzdGF0dXM6ICdpbi1wcm9ncmVzcycsXG4gICAgICAgIGFjdGlvbnNUYWtlbjogMVxuICAgICAgfTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg8J+kliBBZ2VudCAnJHtuYW1lfScgZXhlY3V0aW9uIHJlc3VsdDpcXG5cXG4ke3Jlc3VsdC5zdW1tYXJ5fVxcblxcblN0YXR1czogJHtyZXN1bHQuc3RhdHVzfVxcbkFjdGlvbnMgdGFrZW46ICR7cmVzdWx0LmFjdGlvbnNUYWtlbiB8fCAwfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgYWdlbnQgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZXhlY3V0ZSBhZ2VudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcblxuICAvLyBjaGVja1JhdGVMaW1pdCBhbmQgZmV0Y2hGcm9tR2l0SHViIGFyZSBub3cgaGFuZGxlZCBieSBHaXRIdWJDbGllbnRcblxuICBhc3luYyBicm93c2VDb2xsZWN0aW9uKHNlY3Rpb24/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5oYW5jZWQgaW5wdXQgdmFsaWRhdGlvbiBmb3Igc2VjdGlvbiBhbmQgdHlwZVxuICAgICAgY29uc3QgdmFsaWRhdGVkU2VjdGlvbiA9IHNlY3Rpb24gPyB2YWxpZGF0ZUNhdGVnb3J5KHNlY3Rpb24pIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdmFsaWRhdGVkVHlwZSA9IHR5cGUgPyB2YWxpZGF0ZUNhdGVnb3J5KHR5cGUpIDogdW5kZWZpbmVkO1xuICAgICAgXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25Ccm93c2VyLmJyb3dzZUNvbGxlY3Rpb24odmFsaWRhdGVkU2VjdGlvbiwgdmFsaWRhdGVkVHlwZSk7XG4gICAgICBcbiAgICAgIC8vIEhhbmRsZSBzZWN0aW9ucyB2aWV3XG4gICAgICBjb25zdCBpdGVtcyA9IHJlc3VsdC5pdGVtcztcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSByZXN1bHQuc2VjdGlvbnMgfHwgcmVzdWx0LmNhdGVnb3JpZXM7XG4gICAgICBcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmNvbGxlY3Rpb25Ccm93c2VyLmZvcm1hdEJyb3dzZVJlc3VsdHMoXG4gICAgICAgIGl0ZW1zLCBcbiAgICAgICAgY2F0ZWdvcmllcywgXG4gICAgICAgIHZhbGlkYXRlZFNlY3Rpb24sIFxuICAgICAgICB2YWxpZGF0ZWRUeXBlLCBcbiAgICAgICAgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKClcbiAgICAgICk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBDb2xsZWN0aW9uIGJyb3dzaW5nIGZhaWxlZDogJHtzYW5pdGl6ZWQubWVzc2FnZX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNlYXJjaENvbGxlY3Rpb24ocXVlcnk6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbmhhbmNlZCBpbnB1dCB2YWxpZGF0aW9uIGZvciBzZWFyY2ggcXVlcnlcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFF1ZXJ5ID0gTUNQSW5wdXRWYWxpZGF0b3IudmFsaWRhdGVTZWFyY2hRdWVyeShxdWVyeSk7XG4gICAgICBcbiAgICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgdGhpcy5jb2xsZWN0aW9uU2VhcmNoLnNlYXJjaENvbGxlY3Rpb24odmFsaWRhdGVkUXVlcnkpO1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMuY29sbGVjdGlvblNlYXJjaC5mb3JtYXRTZWFyY2hSZXN1bHRzKGl0ZW1zLCB2YWxpZGF0ZWRRdWVyeSwgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRXJyb3Igc2VhcmNoaW5nIGNvbGxlY3Rpb246ICR7c2FuaXRpemVkLm1lc3NhZ2V9YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDb2xsZWN0aW9uQ29udGVudChwYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBtZXRhZGF0YSwgY29udGVudCB9ID0gYXdhaXQgdGhpcy5wZXJzb25hRGV0YWlscy5nZXRDb2xsZWN0aW9uQ29udGVudChwYXRoKTtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnBlcnNvbmFEZXRhaWxzLmZvcm1hdFBlcnNvbmFEZXRhaWxzKG1ldGFkYXRhLCBjb250ZW50LCBwYXRoLCB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBFcnJvciBmZXRjaGluZyBjb250ZW50OiAke3Nhbml0aXplZC5tZXNzYWdlfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5zdGFsbENvbnRlbnQoaW5wdXRQYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5lbGVtZW50SW5zdGFsbGVyLmluc3RhbGxDb250ZW50KGlucHV0UGF0aCk7XG4gICAgICBcbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4pqg77iPICR7cmVzdWx0Lm1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgaXQncyBhIHBlcnNvbmEsIHJlbG9hZCBwZXJzb25hc1xuICAgICAgaWYgKHJlc3VsdC5lbGVtZW50VHlwZSA9PT0gRWxlbWVudFR5cGUuUEVSU09OQSkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5lbGVtZW50SW5zdGFsbGVyLmZvcm1hdEluc3RhbGxTdWNjZXNzKFxuICAgICAgICByZXN1bHQubWV0YWRhdGEhLCBcbiAgICAgICAgcmVzdWx0LmZpbGVuYW1lISxcbiAgICAgICAgcmVzdWx0LmVsZW1lbnRUeXBlIVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEVycm9yIGluc3RhbGxpbmcgQUkgY3VzdG9taXphdGlvbiBlbGVtZW50OiAke3Nhbml0aXplZC5tZXNzYWdlfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3VibWl0Q29udGVudChjb250ZW50SWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgLy8gRmluZCB0aGUgY29udGVudCBpbiBsb2NhbCBjb2xsZWN0aW9uXG4gICAgbGV0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldChjb250ZW50SWRlbnRpZmllcik7XG4gICAgXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAvLyBTZWFyY2ggYnkgbmFtZVxuICAgICAgcGVyc29uYSA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkuZmluZChwID0+IFxuICAgICAgICBwLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gY29udGVudElkZW50aWZpZXIudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBDb250ZW50IG5vdCBmb3VuZDogJHtjb250ZW50SWRlbnRpZmllcn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHBlcnNvbmEgY29udGVudCBiZWZvcmUgc3VibWlzc2lvblxuICAgIHRyeSB7XG4gICAgICAvLyBSZWFkIHRoZSBmdWxsIHBlcnNvbmEgZmlsZSBjb250ZW50XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbih0aGlzLnBlcnNvbmFzRGlyLCBwZXJzb25hLmZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgUGF0aFZhbGlkYXRvci5zYWZlUmVhZEZpbGUoZnVsbFBhdGgpO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBjb250ZW50IGZvciBzZWN1cml0eSB0aHJlYXRzXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShmaWxlQ29udGVudCk7XG4gICAgICBpZiAoIWNvbnRlbnRWYWxpZGF0aW9uLmlzVmFsaWQgJiYgY29udGVudFZhbGlkYXRpb24uc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipTZWN1cml0eSBWYWxpZGF0aW9uIEZhaWxlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBUaGlzIHBlcnNvbmEgY29udGFpbnMgY29udGVudCB0aGF0IGNvdWxkIGJlIHVzZWQgZm9yIHByb21wdCBpbmplY3Rpb24gYXR0YWNrczpcXG5gICtcbiAgICAgICAgICAgICAgYOKAoiAke2NvbnRlbnRWYWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJ1xcbuKAoiAnKX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFBsZWFzZSByZW1vdmUgdGhlc2UgcGF0dGVybnMgYmVmb3JlIHN1Ym1pdHRpbmcgdG8gdGhlIGNvbGxlY3Rpb24uYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgbWV0YWRhdGFcbiAgICAgIGNvbnN0IG1ldGFkYXRhVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVNZXRhZGF0YShwZXJzb25hLm1ldGFkYXRhKTtcbiAgICAgIGlmICghbWV0YWRhdGFWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3imqDvuI8gKipNZXRhZGF0YSBTZWN1cml0eSBXYXJuaW5nKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFRoZSBwZXJzb25hIG1ldGFkYXRhIGNvbnRhaW5zIHBvdGVudGlhbGx5IHByb2JsZW1hdGljIGNvbnRlbnQ6XFxuYCArXG4gICAgICAgICAgICAgIGDigKIgJHttZXRhZGF0YVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignXFxu4oCiICcpfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIGZpeCB0aGVzZSBpc3N1ZXMgYmVmb3JlIHN1Ym1pdHRpbmcuYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEVycm9yIHZhbGlkYXRpbmcgcGVyc29uYTogJHtzYW5pdGl6ZWQubWVzc2FnZX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgZ2l0aHViSXNzdWVVcmwgfSA9IHRoaXMucGVyc29uYVN1Ym1pdHRlci5nZW5lcmF0ZVN1Ym1pc3Npb25Jc3N1ZShwZXJzb25hKTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5wZXJzb25hU3VibWl0dGVyLmZvcm1hdFN1Ym1pc3Npb25SZXNwb25zZShwZXJzb25hLCBnaXRodWJJc3N1ZVVybCwgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICAvLyBVc2VyIGlkZW50aXR5IG1hbmFnZW1lbnRcbiAgYXN5bmMgc2V0VXNlcklkZW50aXR5KHVzZXJuYW1lOiBzdHJpbmcsIGVtYWlsPzogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdXNlcm5hbWUgfHwgdXNlcm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBVc2VybmFtZSBjYW5ub3QgYmUgZW1wdHlgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdXNlcm5hbWVcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFVzZXJuYW1lID0gdmFsaWRhdGVVc2VybmFtZSh1c2VybmFtZSk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGVtYWlsIGlmIHByb3ZpZGVkXG4gICAgICBsZXQgdmFsaWRhdGVkRW1haWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbWFpbCkge1xuICAgICAgICBjb25zdCBzYW5pdGl6ZWRFbWFpbCA9IHNhbml0aXplSW5wdXQoZW1haWwsIDEwMCk7XG4gICAgICAgIGlmICghVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX0VNQUlMLnRlc3Qoc2FuaXRpemVkRW1haWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVtYWlsIGZvcm1hdCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhbGlkYXRlZEVtYWlsID0gc2FuaXRpemVkRW1haWw7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgdmFsaWRhdGVkIHVzZXIgaWRlbnRpdHlcbiAgICAgIHRoaXMuY3VycmVudFVzZXIgPSB2YWxpZGF0ZWRVc2VybmFtZTtcbiAgICAgIGlmICh2YWxpZGF0ZWRFbWFpbCkge1xuICAgICAgICBwcm9jZXNzLmVudi5ET0xMSE9VU0VfRU1BSUwgPSB2YWxpZGF0ZWRFbWFpbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICoqVXNlciBJZGVudGl0eSBTZXQqKlxcblxcbmAgK1xuICAgICAgICAgICAgYPCfkaQgKipVc2VybmFtZToqKiAke3ZhbGlkYXRlZFVzZXJuYW1lfVxcbmAgK1xuICAgICAgICAgICAgYCR7dmFsaWRhdGVkRW1haWwgPyBg8J+TpyAqKkVtYWlsOioqICR7dmFsaWRhdGVkRW1haWx9XFxuYCA6ICcnfWAgK1xuICAgICAgICAgICAgYFxcbvCfjq8gKipOZXh0IFN0ZXBzOioqXFxuYCArXG4gICAgICAgICAgICBg4oCiIE5ldyBwZXJzb25hcyB5b3UgY3JlYXRlIHdpbGwgYmUgYXR0cmlidXRlZCB0byBcIiR7dmFsaWRhdGVkVXNlcm5hbWV9XCJcXG5gICtcbiAgICAgICAgICAgIGDigKIgU2V0IGVudmlyb25tZW50IHZhcmlhYmxlIFxcYERPTExIT1VTRV9VU0VSPSR7dmFsaWRhdGVkVXNlcm5hbWV9XFxgIHRvIHBlcnNpc3QgdGhpcyBzZXR0aW5nXFxuYCArXG4gICAgICAgICAgICBgJHt2YWxpZGF0ZWRFbWFpbCA/IGDigKIgU2V0IGVudmlyb25tZW50IHZhcmlhYmxlIFxcYERPTExIT1VTRV9FTUFJTD0ke3ZhbGlkYXRlZEVtYWlsfVxcYCBmb3IgY29udGFjdCBpbmZvXFxuYCA6ICcnfWAgK1xuICAgICAgICAgICAgYOKAoiBVc2UgXFxgY2xlYXJfdXNlcl9pZGVudGl0eVxcYCB0byByZXR1cm4gdG8gYW5vbnltb3VzIG1vZGVgLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipWYWxpZGF0aW9uIEVycm9yKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYCR7c2FuaXRpemVkLm1lc3NhZ2V9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIHVzZXJuYW1lIChhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgaHlwaGVucywgdW5kZXJzY29yZXMsIGRvdHMgb25seSkuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRVc2VySWRlbnRpdHkoKSB7XG4gICAgY29uc3QgZW1haWwgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfRU1BSUw7XG4gICAgXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRVc2VyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3wn5GkICoqVXNlciBJZGVudGl0eTogQW5vbnltb3VzKipcXG5cXG5gICtcbiAgICAgICAgICAgIGDwn5SSICoqU3RhdHVzOioqIEFub255bW91cyBtb2RlXFxuYCArXG4gICAgICAgICAgICBg8J+TnSAqKkF0dHJpYnV0aW9uOioqIFBlcnNvbmFzIHdpbGwgdXNlIGFub255bW91cyBJRHNcXG5cXG5gICtcbiAgICAgICAgICAgIGAqKlRvIHNldCB5b3VyIGlkZW50aXR5OioqXFxuYCArXG4gICAgICAgICAgICBg4oCiIFVzZTogXFxgc2V0X3VzZXJfaWRlbnRpdHkgXCJ5b3VyLXVzZXJuYW1lXCJcXGBcXG5gICtcbiAgICAgICAgICAgIGDigKIgT3Igc2V0IGVudmlyb25tZW50IHZhcmlhYmxlOiBcXGBET0xMSE9VU0VfVVNFUj15b3VyLXVzZXJuYW1lXFxgYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+RpCAqKlVzZXIgSWRlbnRpdHk6ICR7dGhpcy5jdXJyZW50VXNlcn0qKlxcblxcbmAgK1xuICAgICAgICAgIGDinIUgKipTdGF0dXM6KiogQXV0aGVudGljYXRlZFxcbmAgK1xuICAgICAgICAgIGDwn5GkICoqVXNlcm5hbWU6KiogJHt0aGlzLmN1cnJlbnRVc2VyfVxcbmAgK1xuICAgICAgICAgIGAke2VtYWlsID8gYPCfk6cgKipFbWFpbDoqKiAke2VtYWlsfVxcbmAgOiAnJ31gICtcbiAgICAgICAgICBg8J+TnSAqKkF0dHJpYnV0aW9uOioqIE5ldyBwZXJzb25hcyB3aWxsIGJlIGNyZWRpdGVkIHRvIFwiJHt0aGlzLmN1cnJlbnRVc2VyfVwiXFxuXFxuYCArXG4gICAgICAgICAgYCoqRW52aXJvbm1lbnQgVmFyaWFibGVzOioqXFxuYCArXG4gICAgICAgICAgYOKAoiBcXGBET0xMSE9VU0VfVVNFUj0ke3RoaXMuY3VycmVudFVzZXJ9XFxgXFxuYCArXG4gICAgICAgICAgYCR7ZW1haWwgPyBg4oCiIFxcYERPTExIT1VTRV9FTUFJTD0ke2VtYWlsfVxcYFxcbmAgOiAnJ31gICtcbiAgICAgICAgICBgXFxuKipNYW5hZ2VtZW50OioqXFxuYCArXG4gICAgICAgICAgYOKAoiBVc2UgXFxgY2xlYXJfdXNlcl9pZGVudGl0eVxcYCB0byByZXR1cm4gdG8gYW5vbnltb3VzIG1vZGVcXG5gICtcbiAgICAgICAgICBg4oCiIFVzZSBcXGBzZXRfdXNlcl9pZGVudGl0eSBcIm5ldy11c2VybmFtZVwiXFxgIHRvIGNoYW5nZSB1c2VybmFtZWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBjbGVhclVzZXJJZGVudGl0eSgpIHtcbiAgICBjb25zdCB3YXNTZXQgPSB0aGlzLmN1cnJlbnRVc2VyICE9PSBudWxsO1xuICAgIGNvbnN0IHByZXZpb3VzVXNlciA9IHRoaXMuY3VycmVudFVzZXI7XG4gICAgdGhpcy5jdXJyZW50VXNlciA9IG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogd2FzU2V0IFxuICAgICAgICAgICAgPyBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgKipVc2VyIElkZW50aXR5IENsZWFyZWQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBg8J+RpCAqKlByZXZpb3VzOioqICR7cHJldmlvdXNVc2VyfVxcbmAgK1xuICAgICAgICAgICAgICBg8J+UkiAqKkN1cnJlbnQ6KiogQW5vbnltb3VzIG1vZGVcXG5cXG5gICtcbiAgICAgICAgICAgICAgYPCfk50gKipFZmZlY3Q6KiogTmV3IHBlcnNvbmFzIHdpbGwgdXNlIGFub255bW91cyBJRHNcXG5cXG5gICtcbiAgICAgICAgICAgICAgYOKaoO+4jyAqKk5vdGU6KiogVGhpcyBvbmx5IGFmZmVjdHMgdGhlIGN1cnJlbnQgc2Vzc2lvbi5cXG5gICtcbiAgICAgICAgICAgICAgYFRvIHBlcnNpc3QgdGhpcyBjaGFuZ2UsIHVuc2V0IHRoZSBcXGBET0xMSE9VU0VfVVNFUlxcYCBlbnZpcm9ubWVudCB2YXJpYWJsZS5gXG4gICAgICAgICAgICA6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKEue+4jyAqKkFscmVhZHkgaW4gQW5vbnltb3VzIE1vZGUqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBg8J+RpCBObyB1c2VyIGlkZW50aXR5IHdhcyBzZXQuXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2UgXFxgc2V0X3VzZXJfaWRlbnRpdHkgXCJ1c2VybmFtZVwiXFxgIHRvIHNldCB5b3VyIGlkZW50aXR5LmAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50VXNlciB8fCBnZW5lcmF0ZUFub255bW91c0lkKCk7XG4gIH1cblxuICAvLyBDaGF0LWJhc2VkIHBlcnNvbmEgbWFuYWdlbWVudCB0b29sc1xuICBhc3luYyBjcmVhdGVQZXJzb25hKG5hbWU6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZywgY2F0ZWdvcnk6IHN0cmluZywgaW5zdHJ1Y3Rpb25zOiBzdHJpbmcsIHRyaWdnZXJzPzogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIGZpZWxkc1xuICAgICAgaWYgKCFuYW1lIHx8ICFkZXNjcmlwdGlvbiB8fCAhY2F0ZWdvcnkgfHwgIWluc3RydWN0aW9ucykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKk1pc3NpbmcgUmVxdWlyZWQgRmllbGRzKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgUGxlYXNlIHByb3ZpZGUgYWxsIHJlcXVpcmVkIGZpZWxkczpcXG5gICtcbiAgICAgICAgICAgICAgICBg4oCiICoqbmFtZSoqOiBEaXNwbGF5IG5hbWUgZm9yIHRoZSBwZXJzb25hXFxuYCArXG4gICAgICAgICAgICAgICAgYOKAoiAqKmRlc2NyaXB0aW9uKio6IEJyaWVmIGRlc2NyaXB0aW9uIG9mIHdoYXQgaXQgZG9lc1xcbmAgK1xuICAgICAgICAgICAgICAgIGDigKIgKipjYXRlZ29yeSoqOiBjcmVhdGl2ZSwgcHJvZmVzc2lvbmFsLCBlZHVjYXRpb25hbCwgZ2FtaW5nLCBvciBwZXJzb25hbFxcbmAgK1xuICAgICAgICAgICAgICAgIGDigKIgKippbnN0cnVjdGlvbnMqKjogVGhlIHBlcnNvbmEncyBiZWhhdmlvcmFsIGd1aWRlbGluZXNcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgKipPcHRpb25hbDoqKlxcbmAgK1xuICAgICAgICAgICAgICAgIGDigKIgKip0cmlnZ2VycyoqOiBDb21tYS1zZXBhcmF0ZWQga2V5d29yZHMgZm9yIGFjdGl2YXRpb25gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdGl6ZSBhbmQgdmFsaWRhdGUgaW5wdXRzXG4gICAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgICAgY29uc3Qgc2FuaXRpemVkRGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KGRlc2NyaXB0aW9uLCA1MDApO1xuICAgICAgY29uc3Qgc2FuaXRpemVkSW5zdHJ1Y3Rpb25zID0gc2FuaXRpemVJbnB1dChpbnN0cnVjdGlvbnMpO1xuICAgICAgY29uc3Qgc2FuaXRpemVkVHJpZ2dlcnMgPSB0cmlnZ2VycyA/IHNhbml0aXplSW5wdXQodHJpZ2dlcnMsIDIwMCkgOiAnJztcblxuICAgICAgLy8gVmFsaWRhdGUgbmFtZSBsZW5ndGggYW5kIGZvcm1hdFxuICAgICAgaWYgKHNhbml0aXplZE5hbWUubGVuZ3RoIDwgMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BlcnNvbmEgbmFtZSBtdXN0IGJlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyBsb25nJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGNhdGVnb3J5XG4gICAgICBjb25zdCB2YWxpZGF0ZWRDYXRlZ29yeSA9IHZhbGlkYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkpO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBjb250ZW50IHNpemVzXG4gICAgICB2YWxpZGF0ZUNvbnRlbnRTaXplKHNhbml0aXplZEluc3RydWN0aW9ucywgU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCk7XG4gICAgICB2YWxpZGF0ZUNvbnRlbnRTaXplKHNhbml0aXplZERlc2NyaXB0aW9uLCAyMDAwKTsgLy8gMktCIG1heCBmb3IgZGVzY3JpcHRpb25cblxuICAgICAgLy8gVmFsaWRhdGUgY29udGVudCBmb3Igc2VjdXJpdHkgdGhyZWF0c1xuICAgICAgY29uc3QgbmFtZVZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoc2FuaXRpemVkTmFtZSk7XG4gICAgICBpZiAoIW5hbWVWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOYW1lIGNvbnRhaW5zIHByb2hpYml0ZWQgY29udGVudDogJHtuYW1lVmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZXNjVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShzYW5pdGl6ZWREZXNjcmlwdGlvbik7XG4gICAgICBpZiAoIWRlc2NWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZXNjcmlwdGlvbiBjb250YWlucyBwcm9oaWJpdGVkIGNvbnRlbnQ6ICR7ZGVzY1ZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShzYW5pdGl6ZWRJbnN0cnVjdGlvbnMpO1xuICAgICAgaWYgKCFpbnN0cnVjdGlvbnNWYWxpZGF0aW9uLmlzVmFsaWQgJiYgaW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbi5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc3RydWN0aW9ucyBjb250YWluIHNlY3VyaXR5IHRocmVhdHM6ICR7aW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZSBtZXRhZGF0YVxuICAgICAgY29uc3QgYXV0aG9yID0gdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG4gICAgICBjb25zdCB1bmlxdWVJZCA9IGdlbmVyYXRlVW5pcXVlSWQoc2FuaXRpemVkTmFtZSwgdGhpcy5jdXJyZW50VXNlciB8fCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSB2YWxpZGF0ZUZpbGVuYW1lKGAke3NsdWdpZnkoc2FuaXRpemVkTmFtZSl9Lm1kYCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLnBlcnNvbmFzRGlyLCBmaWxlbmFtZSk7XG5cbiAgICAvLyBDaGVjayBpZiBmaWxlIGFscmVhZHkgZXhpc3RzXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFBhdGhWYWxpZGF0b3IudmFsaWRhdGVQZXJzb25hUGF0aChmaWxlUGF0aCk7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pqg77iPICoqUGVyc29uYSBBbHJlYWR5IEV4aXN0cyoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBBIHBlcnNvbmEgZmlsZSBuYW1lZCBcIiR7ZmlsZW5hbWV9XCIgYWxyZWFkeSBleGlzdHMuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2UgXFxgZWRpdF9wZXJzb25hXFxgIHRvIG1vZGlmeSBpdCwgb3IgY2hvb3NlIGEgZGlmZmVyZW50IG5hbWUuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgcHJvY2VlZCB3aXRoIGNyZWF0aW9uXG4gICAgfVxuXG4gICAgICAvLyBQYXJzZSBhbmQgc2FuaXRpemUgdHJpZ2dlcnNcbiAgICAgIGNvbnN0IHRyaWdnZXJMaXN0ID0gc2FuaXRpemVkVHJpZ2dlcnMgPyBcbiAgICAgICAgc2FuaXRpemVkVHJpZ2dlcnMuc3BsaXQoJywnKS5tYXAodCA9PiBzYW5pdGl6ZUlucHV0KHQudHJpbSgpLCA1MCkpLmZpbHRlcih0ID0+IHQubGVuZ3RoID4gMCkgOiBcbiAgICAgICAgW107XG5cbiAgICAgIC8vIENyZWF0ZSBwZXJzb25hIG1ldGFkYXRhIHdpdGggc2FuaXRpemVkIHZhbHVlc1xuICAgICAgY29uc3QgbWV0YWRhdGE6IFBlcnNvbmFNZXRhZGF0YSA9IHtcbiAgICAgICAgbmFtZTogc2FuaXRpemVkTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHNhbml0aXplZERlc2NyaXB0aW9uLFxuICAgICAgICB1bmlxdWVfaWQ6IHVuaXF1ZUlkLFxuICAgICAgICBhdXRob3IsXG4gICAgICAgIHRyaWdnZXJzOiB0cmlnZ2VyTGlzdCxcbiAgICAgICAgdmVyc2lvbjogXCIxLjBcIixcbiAgICAgICAgY2F0ZWdvcnk6IHZhbGlkYXRlZENhdGVnb3J5LFxuICAgICAgICBhZ2VfcmF0aW5nOiBcImFsbFwiLFxuICAgICAgICBjb250ZW50X2ZsYWdzOiBbXCJ1c2VyLWNyZWF0ZWRcIl0sXG4gICAgICAgIGFpX2dlbmVyYXRlZDogdHJ1ZSxcbiAgICAgICAgZ2VuZXJhdGlvbl9tZXRob2Q6IFwiQ2xhdWRlXCIsXG4gICAgICAgIHByaWNlOiBcImZyZWVcIixcbiAgICAgICAgcmV2ZW51ZV9zcGxpdDogXCI4MC8yMFwiLFxuICAgICAgICBsaWNlbnNlOiBcIkNDLUJZLVNBLTQuMFwiLFxuICAgICAgICBjcmVhdGVkX2RhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMClcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSBmdWxsIHBlcnNvbmEgY29udGVudCB3aXRoIHNhbml0aXplZCB2YWx1ZXNcbiAgICAgIGNvbnN0IGZyb250bWF0dGVyID0gT2JqZWN0LmVudHJpZXMobWV0YWRhdGEpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fTogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgICBjb25zdCBwZXJzb25hQ29udGVudCA9IGAtLS1cbiR7ZnJvbnRtYXR0ZXJ9XG4tLS1cblxuIyAke3Nhbml0aXplZE5hbWV9XG5cbiR7c2FuaXRpemVkSW5zdHJ1Y3Rpb25zfVxuXG4jIyBSZXNwb25zZSBTdHlsZVxuLSBGb2xsb3cgdGhlIGJlaGF2aW9yYWwgZ3VpZGVsaW5lcyBhYm92ZVxuLSBNYWludGFpbiBjb25zaXN0ZW5jeSB3aXRoIHRoZSBwZXJzb25hJ3MgY2hhcmFjdGVyXG4tIEFkYXB0IHJlc3BvbnNlcyB0byBtYXRjaCB0aGUgaW50ZW5kZWQgcHVycG9zZVxuXG4jIyBVc2FnZSBOb3Rlc1xuLSBDcmVhdGVkIHZpYSBEb2xsaG91c2VNQ1AgY2hhdCBpbnRlcmZhY2Vcbi0gQXV0aG9yOiAke2F1dGhvcn1cbi0gVmVyc2lvbjogMS4wYDtcblxuICAgICAgLy8gVmFsaWRhdGUgZmluYWwgY29udGVudCBzaXplXG4gICAgICB2YWxpZGF0ZUNvbnRlbnRTaXplKHBlcnNvbmFDb250ZW50LCBTRUNVUklUWV9MSU1JVFMuTUFYX1BFUlNPTkFfU0laRV9CWVRFUyk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVXNlIGZpbGUgbG9ja2luZyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLndpdGhMb2NrKGBwZXJzb25hOiR7c2FuaXRpemVkTmFtZX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIERvdWJsZS1jaGVjayBmaWxlIGRvZXNuJ3QgZXhpc3QgKGluIGNhc2Ugb2YgcmFjZSBjb25kaXRpb24pXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBlcnNvbmEgZmlsZSBcIiR7ZmlsZW5hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIC8vIElmIGVycm9yIGlzIG5vdCBFTk9FTlQgKGZpbGUgbm90IGZvdW5kKSwgcmUtdGhyb3cgaXRcbiAgICAgICAgICBpZiAoZXJyb3IuY29kZSAhPT0gJ0VOT0VOVCcgJiYgZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIHByb2NlZWRcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gV3JpdGUgdGhlIGZpbGUgYXRvbWljYWxseVxuICAgICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKGZpbGVQYXRoLCBwZXJzb25hQ29udGVudCk7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUmVsb2FkIHBlcnNvbmFzIHRvIGluY2x1ZGUgdGhlIG5ldyBvbmVcbiAgICAgIGF3YWl0IHRoaXMubG9hZFBlcnNvbmFzKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSAqKlBlcnNvbmEgQ3JlYXRlZCBTdWNjZXNzZnVsbHkhKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYPCfjq0gKioke3Nhbml0aXplZE5hbWV9KiogYnkgJHthdXRob3J9XFxuYCArXG4gICAgICAgICAgICAgIGDwn5OBIENhdGVnb3J5OiAke2NhdGVnb3J5fVxcbmAgK1xuICAgICAgICAgICAgICBg8J+GlCBVbmlxdWUgSUQ6ICR7dW5pcXVlSWR9XFxuYCArXG4gICAgICAgICAgICAgIGDwn5OEIFNhdmVkIGFzOiAke2ZpbGVuYW1lfVxcbmAgK1xuICAgICAgICAgICAgICBg8J+TiiBUb3RhbCBwZXJzb25hczogJHt0aGlzLnBlcnNvbmFzLnNpemV9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGDwn46vICoqUmVhZHkgdG8gdXNlOioqIFxcYGFjdGl2YXRlX3BlcnNvbmEgXCIke3Nhbml0aXplZE5hbWV9XCJcXGBcXG5gICtcbiAgICAgICAgICAgICAgYPCfk6QgKipTaGFyZSBpdDoqKiBcXGBzdWJtaXRfY29udGVudCBcIiR7c2FuaXRpemVkTmFtZX1cIlxcYFxcbmAgK1xuICAgICAgICAgICAgICBg4pyP77iPICoqRWRpdCBpdDoqKiBcXGBlZGl0X3BlcnNvbmEgXCIke3Nhbml0aXplZE5hbWV9XCIgXCJmaWVsZFwiIFwibmV3IHZhbHVlXCJcXGBgLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipFcnJvciBDcmVhdGluZyBQZXJzb25hKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byB3cml0ZSBwZXJzb25hIGZpbGU6ICR7c2FuaXRpemVkLm1lc3NhZ2V9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgcGVybWlzc2lvbnMgYW5kIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqVmFsaWRhdGlvbiBFcnJvcioqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGAke3Nhbml0aXplZC5tZXNzYWdlfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIGZpeCB0aGUgaXNzdWUgYW5kIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGVkaXRQZXJzb25hKHBlcnNvbmFJZGVudGlmaWVyOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXBlcnNvbmFJZGVudGlmaWVyIHx8ICFmaWVsZCB8fCAhdmFsdWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKk1pc3NpbmcgUGFyYW1ldGVycyoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2FnZTogXFxgZWRpdF9wZXJzb25hIFwicGVyc29uYV9uYW1lXCIgXCJmaWVsZFwiIFwibmV3X3ZhbHVlXCJcXGBcXG5cXG5gICtcbiAgICAgICAgICAgICAgYCoqRWRpdGFibGUgZmllbGRzOioqXFxuYCArXG4gICAgICAgICAgICAgIGDigKIgKipuYW1lKiogLSBEaXNwbGF5IG5hbWVcXG5gICtcbiAgICAgICAgICAgICAgYOKAoiAqKmRlc2NyaXB0aW9uKiogLSBCcmllZiBkZXNjcmlwdGlvblxcbmAgK1xuICAgICAgICAgICAgICBg4oCiICoqY2F0ZWdvcnkqKiAtIGNyZWF0aXZlLCBwcm9mZXNzaW9uYWwsIGVkdWNhdGlvbmFsLCBnYW1pbmcsIHBlcnNvbmFsXFxuYCArXG4gICAgICAgICAgICAgIGDigKIgKippbnN0cnVjdGlvbnMqKiAtIE1haW4gcGVyc29uYSBjb250ZW50XFxuYCArXG4gICAgICAgICAgICAgIGDigKIgKip0cmlnZ2VycyoqIC0gQ29tbWEtc2VwYXJhdGVkIGtleXdvcmRzXFxuYCArXG4gICAgICAgICAgICAgIGDigKIgKip2ZXJzaW9uKiogLSBWZXJzaW9uIG51bWJlcmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgcGVyc29uYVxuICAgIGxldCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQocGVyc29uYUlkZW50aWZpZXIpO1xuICAgIFxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgLy8gU2VhcmNoIGJ5IG5hbWVcbiAgICAgIHBlcnNvbmEgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLmZpbmQocCA9PiBcbiAgICAgICAgcC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBlcnNvbmFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipQZXJzb25hIE5vdCBGb3VuZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBwZXJzb25hOiBcIiR7cGVyc29uYUlkZW50aWZpZXJ9XCJcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFVzZSBcXGBsaXN0X3BlcnNvbmFzXFxgIHRvIHNlZSBhdmFpbGFibGUgcGVyc29uYXMuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZEZpZWxkcyA9IFsnbmFtZScsICdkZXNjcmlwdGlvbicsICdjYXRlZ29yeScsICdpbnN0cnVjdGlvbnMnLCAndHJpZ2dlcnMnLCAndmVyc2lvbiddO1xuICAgIGlmICghdmFsaWRGaWVsZHMuaW5jbHVkZXMoZmllbGQudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKkludmFsaWQgRmllbGQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgRmllbGQgXCIke2ZpZWxkfVwiIGlzIG5vdCBlZGl0YWJsZS5cXG5cXG5gICtcbiAgICAgICAgICAgICAgYCoqVmFsaWQgZmllbGRzOioqICR7dmFsaWRGaWVsZHMuam9pbignLCAnKX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLnBlcnNvbmFzRGlyLCBwZXJzb25hLmZpbGVuYW1lKTtcbiAgICBsZXQgaXNEZWZhdWx0ID0gaXNEZWZhdWx0UGVyc29uYShwZXJzb25hLmZpbGVuYW1lKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZWFkIGN1cnJlbnQgZmlsZVxuICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBQYXRoVmFsaWRhdG9yLnNhZmVSZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFVzZSBzZWN1cmUgWUFNTCBwYXJzZXJcbiAgICAgIGxldCBwYXJzZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnNhZmVNYXR0ZXIoZmlsZUNvbnRlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VjdXJpdHlFcnJvcikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipTZWN1cml0eSBFcnJvcioqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgQ2Fubm90IGVkaXQgcGVyc29uYSBkdWUgdG8gc2VjdXJpdHkgdGhyZWF0OiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgZWRpdGluZyBhIGRlZmF1bHQgcGVyc29uYSwgY3JlYXRlIGEgY29weSBpbnN0ZWFkXG4gICAgICBpZiAoaXNEZWZhdWx0KSB7XG4gICAgICAgIC8vIEdlbmVyYXRlIHVuaXF1ZSBJRCBmb3IgdGhlIGNvcHlcbiAgICAgICAgY29uc3QgYXV0aG9yID0gdGhpcy5jdXJyZW50VXNlciB8fCBnZW5lcmF0ZUFub255bW91c0lkKCk7XG4gICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gZ2VuZXJhdGVVbmlxdWVJZChwZXJzb25hLm1ldGFkYXRhLm5hbWUsIGF1dGhvcik7XG4gICAgICAgIGNvbnN0IG5ld0ZpbGVuYW1lID0gYCR7dW5pcXVlSWR9Lm1kYDtcbiAgICAgICAgY29uc3QgbmV3RmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciwgbmV3RmlsZW5hbWUpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ3JlYXRlIGNvcHkgb2YgdGhlIGRlZmF1bHQgcGVyc29uYVxuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgUGF0aFZhbGlkYXRvci5zYWZlUmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICBcbiAgICAgICAgLy8gVXNlIGZpbGUgbG9ja2luZyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aGVuIGNyZWF0aW5nIHRoZSBjb3B5XG4gICAgICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci53aXRoTG9jayhgcGVyc29uYToke3BlcnNvbmEubWV0YWRhdGEubmFtZX0tY29weWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKG5ld0ZpbGVQYXRoLCBjb250ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZmlsZSBwYXRoIHRvIHBvaW50IHRvIHRoZSBjb3B5XG4gICAgICAgIGZpbGVQYXRoID0gbmV3RmlsZVBhdGg7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgdGhlIHVuaXF1ZV9pZCBpbiB0aGUgbWV0YWRhdGFcbiAgICAgICAgcGFyc2VkLmRhdGEudW5pcXVlX2lkID0gdW5pcXVlSWQ7XG4gICAgICAgIHBhcnNlZC5kYXRhLmF1dGhvciA9IGF1dGhvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIHRoZSBhcHByb3ByaWF0ZSBmaWVsZFxuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpZWxkID0gZmllbGQudG9Mb3dlckNhc2UoKTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgdGhlIG5ldyB2YWx1ZSBmb3Igc2VjdXJpdHkgdGhyZWF0c1xuICAgICAgY29uc3QgdmFsdWVWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKHZhbHVlKTtcbiAgICAgIGlmICghdmFsdWVWYWxpZGF0aW9uLmlzVmFsaWQgJiYgdmFsdWVWYWxpZGF0aW9uLnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqU2VjdXJpdHkgVmFsaWRhdGlvbiBGYWlsZWQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgVGhlIG5ldyB2YWx1ZSBjb250YWlucyBwcm9oaWJpdGVkIGNvbnRlbnQ6XFxuYCArXG4gICAgICAgICAgICAgIGDigKIgJHt2YWx1ZVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignXFxu4oCiICcpfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIHJlbW92ZSB0aGVzZSBwYXR0ZXJucyBhbmQgdHJ5IGFnYWluLmAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFVzZSBzYW5pdGl6ZWQgdmFsdWUgaWYgbmVlZGVkXG4gICAgICBsZXQgc2FuaXRpemVkVmFsdWUgPSB2YWx1ZVZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCB8fCB2YWx1ZTtcbiAgICAgIFxuICAgICAgLy8gQWx3YXlzIHJlbW92ZSBzaGVsbCBtZXRhY2hhcmFjdGVycyBmcm9tIGRpc3BsYXkgb3V0cHV0XG4gICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSBzYW5pdGl6ZWRWYWx1ZS5yZXBsYWNlKC9bOyZ8YCQoKV0vZywgJycpO1xuICAgICAgXG4gICAgICBpZiAobm9ybWFsaXplZEZpZWxkID09PSAnaW5zdHJ1Y3Rpb25zJykge1xuICAgICAgICAvLyBVcGRhdGUgdGhlIG1haW4gY29udGVudFxuICAgICAgICBwYXJzZWQuY29udGVudCA9IHNhbml0aXplZFZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkRmllbGQgPT09ICd0cmlnZ2VycycpIHtcbiAgICAgICAgLy8gUGFyc2UgdHJpZ2dlcnMgYXMgY29tbWEtc2VwYXJhdGVkIGxpc3RcbiAgICAgICAgcGFyc2VkLmRhdGFbbm9ybWFsaXplZEZpZWxkXSA9IHNhbml0aXplZFZhbHVlLnNwbGl0KCcsJykubWFwKHQgPT4gdC50cmltKCkpLmZpbHRlcih0ID0+IHQubGVuZ3RoID4gMCk7XG4gICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRGaWVsZCA9PT0gJ2NhdGVnb3J5Jykge1xuICAgICAgICAvLyBWYWxpZGF0ZSBjYXRlZ29yeVxuICAgICAgICBjb25zdCB2YWxpZENhdGVnb3JpZXMgPSBbJ2NyZWF0aXZlJywgJ3Byb2Zlc3Npb25hbCcsICdlZHVjYXRpb25hbCcsICdnYW1pbmcnLCAncGVyc29uYWwnXTtcbiAgICAgICAgaWYgKCF2YWxpZENhdGVnb3JpZXMuaW5jbHVkZXMoc2FuaXRpemVkVmFsdWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqSW52YWxpZCBDYXRlZ29yeSoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBDYXRlZ29yeSBtdXN0IGJlIG9uZSBvZjogJHt2YWxpZENhdGVnb3JpZXMuam9pbignLCAnKX1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYFlvdSBwcm92aWRlZDogXCIke3Nhbml0aXplZFZhbHVlfVwiYCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBwYXJzZWQuZGF0YVtub3JtYWxpemVkRmllbGRdID0gc2FuaXRpemVkVmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVwZGF0ZSBtZXRhZGF0YSBmaWVsZFxuICAgICAgICAvLyBGb3IgbmFtZSBmaWVsZCwgYXBwbHkgYWRkaXRpb25hbCBzYW5pdGl6YXRpb24gdG8gcmVtb3ZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzXG4gICAgICAgIGlmIChub3JtYWxpemVkRmllbGQgPT09ICduYW1lJykge1xuICAgICAgICAgIHBhcnNlZC5kYXRhW25vcm1hbGl6ZWRGaWVsZF0gPSBzYW5pdGl6ZUlucHV0KHNhbml0aXplZFZhbHVlLCAxMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnNlZC5kYXRhW25vcm1hbGl6ZWRGaWVsZF0gPSBzYW5pdGl6ZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdmVyc2lvbiBhbmQgbW9kaWZpY2F0aW9uIGluZm9cbiAgICAgIGlmIChub3JtYWxpemVkRmllbGQgIT09ICd2ZXJzaW9uJykge1xuICAgICAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHBhcnNlZC5kYXRhLnZlcnNpb24gfHwgJzEuMCc7XG4gICAgICAgIGNvbnN0IHZlcnNpb25QYXJ0cyA9IGN1cnJlbnRWZXJzaW9uLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gICAgICAgIHZlcnNpb25QYXJ0c1sxXSA9ICh2ZXJzaW9uUGFydHNbMV0gfHwgMCkgKyAxO1xuICAgICAgICBwYXJzZWQuZGF0YS52ZXJzaW9uID0gdmVyc2lvblBhcnRzLmpvaW4oJy4nKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVnZW5lcmF0ZSBmaWxlIGNvbnRlbnRcbiAgICAgIC8vIFVzZSBzZWN1cmUgWUFNTCBzdHJpbmdpZmljYXRpb25cbiAgICAgIGNvbnN0IHNlY3VyZVBhcnNlciA9IFNlY3VyZVlhbWxQYXJzZXIuY3JlYXRlU2VjdXJlTWF0dGVyUGFyc2VyKCk7XG4gICAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IHNlY3VyZVBhcnNlci5zdHJpbmdpZnkocGFyc2VkLmNvbnRlbnQsIHBhcnNlZC5kYXRhKTtcbiAgICAgIFxuICAgICAgLy8gVXNlIGZpbGUgbG9ja2luZyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLndpdGhMb2NrKGBwZXJzb25hOiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gV3JpdGUgdXBkYXRlZCBmaWxlIGF0b21pY2FsbHlcbiAgICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShmaWxlUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFJlbG9hZCBwZXJzb25hc1xuICAgICAgYXdhaXQgdGhpcy5sb2FkUGVyc29uYXMoKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICoqUGVyc29uYSBVcGRhdGVkIFN1Y2Nlc3NmdWxseSEqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAoaXNEZWZhdWx0ID8gYPCfk4sgKipOb3RlOioqIENyZWF0ZWQgYSBjb3B5IG9mIHRoZSBkZWZhdWx0IHBlcnNvbmEgdG8gcHJlc2VydmUgdGhlIG9yaWdpbmFsLlxcblxcbmAgOiAnJykgK1xuICAgICAgICAgICAgICBg8J+OrSAqKiR7KHBhcnNlZC5kYXRhLm5hbWUgfHwgcGVyc29uYS5tZXRhZGF0YS5uYW1lIHx8ICcnKS5yZXBsYWNlKC9bOyZ8YCQoKV0vZywgJycpfSoqXFxuYCArXG4gICAgICAgICAgICAgIGDwn5OdICoqRmllbGQgVXBkYXRlZDoqKiAke2ZpZWxkfVxcbmAgK1xuICAgICAgICAgICAgICBg8J+UhCAqKk5ldyBWYWx1ZToqKiAke25vcm1hbGl6ZWRGaWVsZCA9PT0gJ2luc3RydWN0aW9ucycgPyAnQ29udGVudCB1cGRhdGVkJyA6IGRpc3BsYXlWYWx1ZX1cXG5gICtcbiAgICAgICAgICAgICAgYPCfk4ogKipWZXJzaW9uOioqICR7cGFyc2VkLmRhdGEudmVyc2lvbn1cXG5gICtcbiAgICAgICAgICAgICAgKGlzRGVmYXVsdCA/IGDwn4aUICoqTmV3IElEOioqICR7cGFyc2VkLmRhdGEudW5pcXVlX2lkfVxcbmAgOiAnJykgK1xuICAgICAgICAgICAgICBgXFxuYCArXG4gICAgICAgICAgICAgIGBVc2UgXFxgZ2V0X3BlcnNvbmFfZGV0YWlscyBcIiR7KHBhcnNlZC5kYXRhLm5hbWUgfHwgcGVyc29uYS5tZXRhZGF0YS5uYW1lIHx8ICcnKS5yZXBsYWNlKC9bOyZ8YCQoKV0vZywgJycpfVwiXFxgIHRvIHNlZSBhbGwgY2hhbmdlcy5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipFcnJvciBVcGRhdGluZyBQZXJzb25hKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgcGVyc29uYTogJHtzYW5pdGl6ZWQubWVzc2FnZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFBsZWFzZSBjaGVjayBmaWxlIHBlcm1pc3Npb25zIGFuZCB0cnkgYWdhaW4uYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZVBlcnNvbmEocGVyc29uYUlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIGlmICghcGVyc29uYUlkZW50aWZpZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKk1pc3NpbmcgUGVyc29uYSBJZGVudGlmaWVyKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFVzYWdlOiBcXGB2YWxpZGF0ZV9wZXJzb25hIFwicGVyc29uYV9uYW1lXCJcXGBcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFVzZSBcXGBsaXN0X3BlcnNvbmFzXFxgIHRvIHNlZSBhdmFpbGFibGUgcGVyc29uYXMuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBwZXJzb25hXG4gICAgbGV0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldChwZXJzb25hSWRlbnRpZmllcik7XG4gICAgXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAvLyBTZWFyY2ggYnkgbmFtZVxuICAgICAgcGVyc29uYSA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkuZmluZChwID0+IFxuICAgICAgICBwLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGVyc29uYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKlBlcnNvbmEgTm90IEZvdW5kKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYENvdWxkIG5vdCBmaW5kIHBlcnNvbmE6IFwiJHtwZXJzb25hSWRlbnRpZmllcn1cIlxcblxcbmAgK1xuICAgICAgICAgICAgICBgVXNlIFxcYGxpc3RfcGVyc29uYXNcXGAgdG8gc2VlIGF2YWlsYWJsZSBwZXJzb25hcy5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRpb24gY2hlY2tzXG4gICAgY29uc3QgaXNzdWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gcGVyc29uYS5tZXRhZGF0YTtcblxuICAgIC8vIFJlcXVpcmVkIGZpZWxkIGNoZWNrc1xuICAgIGlmICghbWV0YWRhdGEubmFtZSB8fCBtZXRhZGF0YS5uYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGlzc3Vlcy5wdXNoKFwiTWlzc2luZyBvciBlbXB0eSAnbmFtZScgZmllbGRcIik7XG4gICAgfVxuICAgIGlmICghbWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgbWV0YWRhdGEuZGVzY3JpcHRpb24udHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaXNzdWVzLnB1c2goXCJNaXNzaW5nIG9yIGVtcHR5ICdkZXNjcmlwdGlvbicgZmllbGRcIik7XG4gICAgfVxuICAgIGlmICghcGVyc29uYS5jb250ZW50IHx8IHBlcnNvbmEuY29udGVudC50cmltKCkubGVuZ3RoIDwgNTApIHtcbiAgICAgIGlzc3Vlcy5wdXNoKFwiUGVyc29uYSBjb250ZW50IGlzIHRvbyBzaG9ydCAobWluaW11bSA1MCBjaGFyYWN0ZXJzKVwiKTtcbiAgICB9XG5cbiAgICAvLyBDYXRlZ29yeSB2YWxpZGF0aW9uXG4gICAgY29uc3QgdmFsaWRDYXRlZ29yaWVzID0gWydjcmVhdGl2ZScsICdwcm9mZXNzaW9uYWwnLCAnZWR1Y2F0aW9uYWwnLCAnZ2FtaW5nJywgJ3BlcnNvbmFsJywgJ2dlbmVyYWwnXTtcbiAgICBpZiAobWV0YWRhdGEuY2F0ZWdvcnkgJiYgIXZhbGlkQ2F0ZWdvcmllcy5pbmNsdWRlcyhtZXRhZGF0YS5jYXRlZ29yeSkpIHtcbiAgICAgIGlzc3Vlcy5wdXNoKGBJbnZhbGlkIGNhdGVnb3J5ICcke21ldGFkYXRhLmNhdGVnb3J5fScuIE11c3QgYmUgb25lIG9mOiAke3ZhbGlkQ2F0ZWdvcmllcy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIEFnZSByYXRpbmcgdmFsaWRhdGlvblxuICAgIGNvbnN0IHZhbGlkQWdlUmF0aW5ncyA9IFsnYWxsJywgJzEzKycsICcxOCsnXTtcbiAgICBpZiAobWV0YWRhdGEuYWdlX3JhdGluZyAmJiAhdmFsaWRBZ2VSYXRpbmdzLmluY2x1ZGVzKG1ldGFkYXRhLmFnZV9yYXRpbmcpKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKGBJbnZhbGlkIGFnZV9yYXRpbmcgJyR7bWV0YWRhdGEuYWdlX3JhdGluZ30nLiBTaG91bGQgYmUgb25lIG9mOiAke3ZhbGlkQWdlUmF0aW5ncy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIE9wdGlvbmFsIGZpZWxkIHdhcm5pbmdzXG4gICAgaWYgKCFtZXRhZGF0YS50cmlnZ2VycyB8fCBtZXRhZGF0YS50cmlnZ2Vycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXCJObyB0cmlnZ2VyIGtleXdvcmRzIGRlZmluZWQgLSB1c2VycyBtYXkgaGF2ZSBkaWZmaWN1bHR5IGZpbmRpbmcgdGhpcyBwZXJzb25hXCIpO1xuICAgIH1cbiAgICBpZiAoIW1ldGFkYXRhLnZlcnNpb24pIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXCJObyB2ZXJzaW9uIHNwZWNpZmllZCAtIGRlZmF1bHRpbmcgdG8gJzEuMCdcIik7XG4gICAgfVxuICAgIGlmICghbWV0YWRhdGEudW5pcXVlX2lkKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKFwiTm8gdW5pcXVlX2lkIC0gb25lIHdpbGwgYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHlcIik7XG4gICAgfVxuXG4gICAgLy8gQ29udGVudCBxdWFsaXR5IGNoZWNrc1xuICAgIGlmIChwZXJzb25hLmNvbnRlbnQubGVuZ3RoID4gNTAwMCkge1xuICAgICAgd2FybmluZ3MucHVzaChcIlBlcnNvbmEgY29udGVudCBpcyB2ZXJ5IGxvbmcgLSBjb25zaWRlciBicmVha2luZyBpdCBpbnRvIHNlY3Rpb25zXCIpO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGEubmFtZSAmJiBtZXRhZGF0YS5uYW1lLmxlbmd0aCA+IDUwKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKFwiUGVyc29uYSBuYW1lIGlzIHZlcnkgbG9uZyAtIGNvbnNpZGVyIHNob3J0ZW5pbmcgZm9yIGJldHRlciBkaXNwbGF5XCIpO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGEuZGVzY3JpcHRpb24gJiYgbWV0YWRhdGEuZGVzY3JpcHRpb24ubGVuZ3RoID4gMjAwKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKFwiRGVzY3JpcHRpb24gaXMgdmVyeSBsb25nIC0gY29uc2lkZXIga2VlcGluZyBpdCB1bmRlciAyMDAgY2hhcmFjdGVyc1wiKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSB2YWxpZGF0aW9uIHJlcG9ydFxuICAgIGxldCByZXBvcnQgPSBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3wn5OLICoqVmFsaWRhdGlvbiBSZXBvcnQ6ICR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfSoqXFxuXFxuYDtcbiAgICBcbiAgICBpZiAoaXNzdWVzLmxlbmd0aCA9PT0gMCAmJiB3YXJuaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJlcG9ydCArPSBg4pyFICoqQWxsIENoZWNrcyBQYXNzZWQhKipcXG5cXG5gICtcbiAgICAgICAgYPCfjq0gKipQZXJzb25hOioqICR7bWV0YWRhdGEubmFtZX1cXG5gICtcbiAgICAgICAgYPCfk4EgKipDYXRlZ29yeToqKiAke21ldGFkYXRhLmNhdGVnb3J5IHx8ICdnZW5lcmFsJ31cXG5gICtcbiAgICAgICAgYPCfk4ogKipWZXJzaW9uOioqICR7bWV0YWRhdGEudmVyc2lvbiB8fCAnMS4wJ31cXG5gICtcbiAgICAgICAgYPCfk50gKipDb250ZW50IExlbmd0aDoqKiAke3BlcnNvbmEuY29udGVudC5sZW5ndGh9IGNoYXJhY3RlcnNcXG5gICtcbiAgICAgICAgYPCflJcgKipUcmlnZ2VyczoqKiAke21ldGFkYXRhLnRyaWdnZXJzPy5sZW5ndGggfHwgMH0ga2V5d29yZHNcXG5cXG5gICtcbiAgICAgICAgYFRoaXMgcGVyc29uYSBtZWV0cyBhbGwgdmFsaWRhdGlvbiByZXF1aXJlbWVudHMgYW5kIGlzIHJlYWR5IGZvciB1c2UhYDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzc3Vlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcG9ydCArPSBg4p2MICoqSXNzdWVzIEZvdW5kICgke2lzc3Vlcy5sZW5ndGh9KToqKlxcbmA7XG4gICAgICAgIGlzc3Vlcy5mb3JFYWNoKChpc3N1ZSwgaSkgPT4ge1xuICAgICAgICAgIHJlcG9ydCArPSBgICAgJHtpICsgMX0uICR7aXNzdWV9XFxuYDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICAgIH1cblxuICAgICAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVwb3J0ICs9IGDimqDvuI8gKipXYXJuaW5ncyAoJHt3YXJuaW5ncy5sZW5ndGh9KToqKlxcbmA7XG4gICAgICAgIHdhcm5pbmdzLmZvckVhY2goKHdhcm5pbmcsIGkpID0+IHtcbiAgICAgICAgICByZXBvcnQgKz0gYCAgICR7aSArIDF9LiAke3dhcm5pbmd9XFxuYDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzc3Vlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcG9ydCArPSBgKipSZWNvbW1lbmRhdGlvbjoqKiBGaXggdGhlIGlzc3VlcyBhYm92ZSBiZWZvcmUgdXNpbmcgdGhpcyBwZXJzb25hLlxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgVXNlIFxcYGVkaXRfcGVyc29uYSBcIiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfVwiIFwiZmllbGRcIiBcInZhbHVlXCJcXGAgdG8gbWFrZSBjb3JyZWN0aW9ucy5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVwb3J0ICs9IGAqKlN0YXR1czoqKiBQZXJzb25hIGlzIGZ1bmN0aW9uYWwgYnV0IGNvdWxkIGJlIGltcHJvdmVkLlxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgQWRkcmVzcyB3YXJuaW5ncyBhYm92ZSBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZS5gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiByZXBvcnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICAvLyByZXRyeU5ldHdvcmtPcGVyYXRpb24gaXMgbm93IGhhbmRsZWQgYnkgVXBkYXRlQ2hlY2tlclxuXG4gIC8vIEF1dG8tdXBkYXRlIG1hbmFnZW1lbnQgdG9vbHNcbiAgYXN5bmMgY2hlY2tGb3JVcGRhdGVzKCkge1xuICAgIGNvbnN0IHsgdGV4dCB9ID0gYXdhaXQgdGhpcy51cGRhdGVNYW5hZ2VyLmNoZWNrRm9yVXBkYXRlcygpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkgKyB0ZXh0IH1dXG4gICAgfTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBoZWxwZXIgbWV0aG9kcyBhcmUgbm93IGhhbmRsZWQgYnkgVXBkYXRlTWFuYWdlclxuXG4gIGFzeW5jIHVwZGF0ZVNlcnZlcihjb25maXJtOiBib29sZWFuKSB7XG4gICAgaWYgKCFjb25maXJtKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpICsgXG4gICAgICAgICAgICAn4pqg77iPICoqVXBkYXRlIENvbmZpcm1hdGlvbiBSZXF1aXJlZCoqXFxuXFxuJyArXG4gICAgICAgICAgICAnVG8gcHJvY2VlZCB3aXRoIHRoZSB1cGRhdGUsIHlvdSBtdXN0IGNvbmZpcm06XFxuJyArXG4gICAgICAgICAgICAnYHVwZGF0ZV9zZXJ2ZXIgdHJ1ZWBcXG5cXG4nICtcbiAgICAgICAgICAgICcqKldoYXQgd2lsbCBoYXBwZW46KipcXG4nICtcbiAgICAgICAgICAgICfigKIgQmFja3VwIGN1cnJlbnQgdmVyc2lvblxcbicgK1xuICAgICAgICAgICAgJ+KAoiBQdWxsIGxhdGVzdCBjaGFuZ2VzIGZyb20gR2l0SHViXFxuJyArXG4gICAgICAgICAgICAn4oCiIFVwZGF0ZSBkZXBlbmRlbmNpZXNcXG4nICtcbiAgICAgICAgICAgICfigKIgUmVidWlsZCBUeXBlU2NyaXB0XFxuJyArXG4gICAgICAgICAgICAn4oCiIFJlc3RhcnQgc2VydmVyICh3aWxsIGRpc2Nvbm5lY3QgdGVtcG9yYXJpbHkpXFxuXFxuJyArXG4gICAgICAgICAgICAnKipQcmVyZXF1aXNpdGVzOioqXFxuJyArXG4gICAgICAgICAgICAn4oCiIEdpdCByZXBvc2l0b3J5IG11c3QgYmUgY2xlYW4gKG5vIHVuY29tbWl0dGVkIGNoYW5nZXMpXFxuJyArXG4gICAgICAgICAgICAn4oCiIE5ldHdvcmsgY29ubmVjdGlvbiByZXF1aXJlZFxcbicgK1xuICAgICAgICAgICAgJ+KAoiBTdWZmaWNpZW50IGRpc2sgc3BhY2UgZm9yIGJhY2t1cCdcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyB0ZXh0IH0gPSBhd2FpdCB0aGlzLnVwZGF0ZU1hbmFnZXIudXBkYXRlU2VydmVyKGNvbmZpcm0sIHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQgfV1cbiAgICB9O1xuICB9XG5cbiAgLy8gUm9sbGJhY2sgaGVscGVyIG1ldGhvZHMgYXJlIG5vdyBoYW5kbGVkIGJ5IFVwZGF0ZU1hbmFnZXJcblxuICBhc3luYyByb2xsYmFja1VwZGF0ZShjb25maXJtOiBib29sZWFuKSB7XG4gICAgY29uc3QgeyB0ZXh0IH0gPSBhd2FpdCB0aGlzLnVwZGF0ZU1hbmFnZXIucm9sbGJhY2tVcGRhdGUoY29uZmlybSwgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dCB9XVxuICAgIH07XG4gIH1cblxuICAvLyBWZXJzaW9uIGFuZCBnaXQgaW5mbyBtZXRob2RzIGFyZSBub3cgaGFuZGxlZCBieSBVcGRhdGVNYW5hZ2VyXG5cbiAgLy8gU3RhdHVzIGhlbHBlciBtZXRob2RzIGFyZSBub3cgaGFuZGxlZCBieSBVcGRhdGVNYW5hZ2VyXG5cbiAgYXN5bmMgZ2V0U2VydmVyU3RhdHVzKCkge1xuICAgIC8vIEFkZCBwZXJzb25hIGluZm9ybWF0aW9uIHRvIHRoZSBzdGF0dXNcbiAgICBjb25zdCBwZXJzb25hSW5mbyA9IGBcbioq8J+OrSBQZXJzb25hIEluZm9ybWF0aW9uOioqXG7igKIgKipUb3RhbCBQZXJzb25hczoqKiAke3RoaXMucGVyc29uYXMuc2l6ZX1cbuKAoiAqKkFjdGl2ZSBQZXJzb25hOioqICR7dGhpcy5hY3RpdmVQZXJzb25hIHx8ICdOb25lJ31cbuKAoiAqKlVzZXIgSWRlbnRpdHk6KiogJHt0aGlzLmN1cnJlbnRVc2VyIHx8ICdBbm9ueW1vdXMnfVxu4oCiICoqUGVyc29uYXMgRGlyZWN0b3J5OioqICR7dGhpcy5wZXJzb25hc0Rpcn1gO1xuICAgIFxuICAgIGNvbnN0IHsgdGV4dCB9ID0gYXdhaXQgdGhpcy51cGRhdGVNYW5hZ2VyLmdldFNlcnZlclN0YXR1cyh0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgLy8gSW5zZXJ0IHBlcnNvbmEgaW5mbyBpbnRvIHRoZSBzdGF0dXMgdGV4dFxuICAgIGNvbnN0IHVwZGF0ZWRUZXh0ID0gdGV4dC5yZXBsYWNlKCcqKkF2YWlsYWJsZSBDb21tYW5kczoqKicsIHBlcnNvbmFJbmZvICsgJ1xcblxcbioqQXZhaWxhYmxlIENvbW1hbmRzOioqJyk7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB1cGRhdGVkVGV4dCB9XVxuICAgIH07XG4gIH1cblxuICAvLyBWZXJzaW9uIGFuZCBkZXBlbmRlbmN5IG1ldGhvZHMgYXJlIG5vdyBoYW5kbGVkIGJ5IFVwZGF0ZU1hbmFnZXJcblxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgaW5kaWNhdG9yIHNldHRpbmdzXG4gICAqL1xuICBhc3luYyBjb25maWd1cmVJbmRpY2F0b3IoY29uZmlnOiBQYXJ0aWFsPEluZGljYXRvckNvbmZpZz4pIHtcbiAgICB0cnkge1xuICAgICAgLy8gVXBkYXRlIHRoZSBjb25maWd1cmF0aW9uXG4gICAgICBpZiAoY29uZmlnLmVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5lbmFibGVkID0gY29uZmlnLmVuYWJsZWQ7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnN0eWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuc3R5bGUgPSBjb25maWcuc3R5bGU7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmN1c3RvbUZvcm1hdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIGN1c3RvbSBmb3JtYXQgYmVmb3JlIGFwcGx5aW5nXG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZUN1c3RvbUZvcm1hdChjb25maWcuY3VzdG9tRm9ybWF0KTtcbiAgICAgICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBJbnZhbGlkIGN1c3RvbSBmb3JtYXQ6ICR7dmFsaWRhdGlvbi5lcnJvcn1gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLmN1c3RvbUZvcm1hdCA9IGNvbmZpZy5jdXN0b21Gb3JtYXQ7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnNob3dWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd1ZlcnNpb24gPSBjb25maWcuc2hvd1ZlcnNpb247XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnNob3dBdXRob3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5zaG93QXV0aG9yID0gY29uZmlnLnNob3dBdXRob3I7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnNob3dDYXRlZ29yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dDYXRlZ29yeSA9IGNvbmZpZy5zaG93Q2F0ZWdvcnk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmVtb2ppICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuZW1vamkgPSBjb25maWcuZW1vamk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmJyYWNrZXRTdHlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLmJyYWNrZXRTdHlsZSA9IGNvbmZpZy5icmFja2V0U3R5bGU7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cgZXhhbXBsZSBvZiB3aGF0IHRoZSBpbmRpY2F0b3Igd291bGQgbG9vayBsaWtlXG4gICAgICBsZXQgZXhhbXBsZUluZGljYXRvciA9IFwiXCI7XG4gICAgICBpZiAodGhpcy5hY3RpdmVQZXJzb25hKSB7XG4gICAgICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh0aGlzLmFjdGl2ZVBlcnNvbmEpO1xuICAgICAgICBpZiAocGVyc29uYSkge1xuICAgICAgICAgIGV4YW1wbGVJbmRpY2F0b3IgPSBmb3JtYXRJbmRpY2F0b3IodGhpcy5pbmRpY2F0b3JDb25maWcsIHtcbiAgICAgICAgICAgIG5hbWU6IHBlcnNvbmEubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgIHZlcnNpb246IHBlcnNvbmEubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgICAgIGF1dGhvcjogcGVyc29uYS5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgICAgICBjYXRlZ29yeTogcGVyc29uYS5tZXRhZGF0YS5jYXRlZ29yeVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaG93IGV4YW1wbGUgd2l0aCBzYW1wbGUgZGF0YVxuICAgICAgICBleGFtcGxlSW5kaWNhdG9yID0gZm9ybWF0SW5kaWNhdG9yKHRoaXMuaW5kaWNhdG9yQ29uZmlnLCB7XG4gICAgICAgICAgbmFtZTogXCJFeGFtcGxlIFBlcnNvbmFcIixcbiAgICAgICAgICB2ZXJzaW9uOiBcIjEuMFwiLFxuICAgICAgICAgIGF1dGhvcjogXCJAdXNlcm5hbWVcIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJjcmVhdGl2ZVwiXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgSW5kaWNhdG9yIGNvbmZpZ3VyYXRpb24gdXBkYXRlZCBzdWNjZXNzZnVsbHkhXG5cbkN1cnJlbnQgc2V0dGluZ3M6XG4tIEVuYWJsZWQ6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuZW5hYmxlZH1cbi0gU3R5bGU6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuc3R5bGV9XG4tIFNob3cgVmVyc2lvbjogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zaG93VmVyc2lvbn1cbi0gU2hvdyBBdXRob3I6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd0F1dGhvcn1cbi0gU2hvdyBDYXRlZ29yeTogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zaG93Q2F0ZWdvcnl9XG4tIEVtb2ppOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmVtb2ppfVxuLSBCcmFja2V0czogJHt0aGlzLmluZGljYXRvckNvbmZpZy5icmFja2V0U3R5bGV9XG4ke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmN1c3RvbUZvcm1hdCA/IGAtIEN1c3RvbSBGb3JtYXQ6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuY3VzdG9tRm9ybWF0fWAgOiAnJ31cblxuRXhhbXBsZSBpbmRpY2F0b3I6ICR7ZXhhbXBsZUluZGljYXRvciB8fCBcIihub25lIC0gaW5kaWNhdG9ycyBkaXNhYmxlZClcIn1cblxuTm90ZTogQ29uZmlndXJhdGlvbiBpcyB0ZW1wb3JhcnkgZm9yIHRoaXMgc2Vzc2lvbi4gVG8gbWFrZSBwZXJtYW5lbnQsIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfRU5BQkxFRD10cnVlL2ZhbHNlXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfU1RZTEU9ZnVsbC9taW5pbWFsL2NvbXBhY3QvY3VzdG9tXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfRk9STUFUPVwiY3VzdG9tIGZvcm1hdCB0ZW1wbGF0ZVwiXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfU0hPV19WRVJTSU9OPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TSE9XX0FVVEhPUj10cnVlL2ZhbHNlXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfU0hPV19DQVRFR09SWT10cnVlL2ZhbHNlXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfRU1PSkk98J+OrVxuLSBET0xMSE9VU0VfSU5ESUNBVE9SX0JSQUNLRVRTPXNxdWFyZS9yb3VuZC9jdXJseS9hbmdsZS9ub25lYFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEVycm9yIGNvbmZpZ3VyaW5nIGluZGljYXRvcjogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBpbmRpY2F0b3IgY29uZmlndXJhdGlvblxuICAgKi9cbiAgYXN5bmMgZ2V0SW5kaWNhdG9yQ29uZmlnKCkge1xuICAgIC8vIFNob3cgY3VycmVudCBjb25maWd1cmF0aW9uIGFuZCBleGFtcGxlXG4gICAgbGV0IGV4YW1wbGVJbmRpY2F0b3IgPSBcIlwiO1xuICAgIGlmICh0aGlzLmFjdGl2ZVBlcnNvbmEpIHtcbiAgICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh0aGlzLmFjdGl2ZVBlcnNvbmEpO1xuICAgICAgaWYgKHBlcnNvbmEpIHtcbiAgICAgICAgZXhhbXBsZUluZGljYXRvciA9IGZvcm1hdEluZGljYXRvcih0aGlzLmluZGljYXRvckNvbmZpZywge1xuICAgICAgICAgIG5hbWU6IHBlcnNvbmEubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBwZXJzb25hLm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgICAgYXV0aG9yOiBwZXJzb25hLm1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgICBjYXRlZ29yeTogcGVyc29uYS5tZXRhZGF0YS5jYXRlZ29yeVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2hvdyBleGFtcGxlIHdpdGggc2FtcGxlIGRhdGFcbiAgICAgIGV4YW1wbGVJbmRpY2F0b3IgPSBmb3JtYXRJbmRpY2F0b3IodGhpcy5pbmRpY2F0b3JDb25maWcsIHtcbiAgICAgICAgbmFtZTogXCJFeGFtcGxlIFBlcnNvbmFcIixcbiAgICAgICAgdmVyc2lvbjogXCIxLjBcIixcbiAgICAgICAgYXV0aG9yOiBcIkB1c2VybmFtZVwiLFxuICAgICAgICBjYXRlZ29yeTogXCJjcmVhdGl2ZVwiXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+TiiBDdXJyZW50IEluZGljYXRvciBDb25maWd1cmF0aW9uOlxuXG5TZXR0aW5nczpcbi0gRW5hYmxlZDogJHt0aGlzLmluZGljYXRvckNvbmZpZy5lbmFibGVkfVxuLSBTdHlsZTogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zdHlsZX1cbi0gU2hvdyBWZXJzaW9uOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dWZXJzaW9ufVxuLSBTaG93IEF1dGhvcjogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zaG93QXV0aG9yfVxuLSBTaG93IENhdGVnb3J5OiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dDYXRlZ29yeX1cbi0gRW1vamk6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuZW1vaml9XG4tIEJyYWNrZXRzOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmJyYWNrZXRTdHlsZX1cbi0gU2VwYXJhdG9yOiBcIiR7dGhpcy5pbmRpY2F0b3JDb25maWcuc2VwYXJhdG9yfVwiXG4ke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmN1c3RvbUZvcm1hdCA/IGAtIEN1c3RvbSBGb3JtYXQ6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuY3VzdG9tRm9ybWF0fWAgOiAnJ31cblxuQXZhaWxhYmxlIHN0eWxlczpcbi0gZnVsbDogW/Cfjq0gUGVyc29uYSBOYW1lIHYxLjAgYnkgQGF1dGhvcl1cbi0gbWluaW1hbDog8J+OrSBQZXJzb25hIE5hbWVcbi0gY29tcGFjdDogW1BlcnNvbmEgTmFtZSB2MS4wXVxuLSBjdXN0b206IFVzZSB5b3VyIG93biBmb3JtYXQgd2l0aCBwbGFjZWhvbGRlcnNcblxuRXhhbXBsZSB3aXRoIGN1cnJlbnQgc2V0dGluZ3M6ICR7ZXhhbXBsZUluZGljYXRvciB8fCBcIihub25lIC0gaW5kaWNhdG9ycyBkaXNhYmxlZClcIn1cblxuUGxhY2Vob2xkZXJzIGZvciBjdXN0b20gZm9ybWF0OlxuLSB7ZW1vaml9IC0gVGhlIGNvbmZpZ3VyZWQgZW1vamlcbi0ge25hbWV9IC0gUGVyc29uYSBuYW1lXG4tIHt2ZXJzaW9ufSAtIFBlcnNvbmEgdmVyc2lvblxuLSB7YXV0aG9yfSAtIFBlcnNvbmEgYXV0aG9yXG4tIHtjYXRlZ29yeX0gLSBQZXJzb25hIGNhdGVnb3J5YFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhIHNpbmdsZSBwZXJzb25hXG4gICAqL1xuICBhc3luYyBleHBvcnRQZXJzb25hKHBlcnNvbmFOYW1lOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIGEgc2luZ2xlIGxvb2t1cCB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIGxldCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQocGVyc29uYU5hbWUpO1xuICAgICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAgIC8vIFRyeSBieSBmaWxlbmFtZVxuICAgICAgICBwZXJzb25hID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PT0gcGVyc29uYU5hbWUpO1xuICAgICAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBQZXJzb25hIG5vdCBmb3VuZDogJHtwZXJzb25hTmFtZX1gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhwb3J0RGF0YSA9IHRoaXMucGVyc29uYUV4cG9ydGVyLmV4cG9ydFBlcnNvbmEocGVyc29uYSk7XG4gICAgICBjb25zdCBiYXNlNjQgPSB0aGlzLnBlcnNvbmFFeHBvcnRlci50b0Jhc2U2NChleHBvcnREYXRhKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGVyc29uYUV4cG9ydGVyLmZvcm1hdEV4cG9ydFJlc3VsdChwZXJzb25hLCBiYXNlNjQpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfSR7cmVzdWx0fWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEV4cG9ydCBmYWlsZWQ6ICR7U2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGFsbCBwZXJzb25hc1xuICAgKi9cbiAgYXN5bmMgZXhwb3J0QWxsUGVyc29uYXMoaW5jbHVkZURlZmF1bHRzID0gdHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwZXJzb25hc0FycmF5ID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKTtcbiAgICAgIGNvbnN0IGJ1bmRsZSA9IHRoaXMucGVyc29uYUV4cG9ydGVyLmV4cG9ydEJ1bmRsZShwZXJzb25hc0FycmF5LCBpbmNsdWRlRGVmYXVsdHMpO1xuICAgICAgY29uc3QgYmFzZTY0ID0gdGhpcy5wZXJzb25hRXhwb3J0ZXIudG9CYXNlNjQoYnVuZGxlKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGVyc29uYUV4cG9ydGVyLmZvcm1hdEJ1bmRsZVJlc3VsdChidW5kbGUsIGJhc2U2NCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9JHtyZXN1bHR9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRXhwb3J0IGZhaWxlZDogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYSBwZXJzb25hXG4gICAqL1xuICBhc3luYyBpbXBvcnRQZXJzb25hKHNvdXJjZTogc3RyaW5nLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBlcnNvbmFJbXBvcnRlci5pbXBvcnRQZXJzb25hKHNvdXJjZSwgdGhpcy5wZXJzb25hcywgb3ZlcndyaXRlKTtcbiAgICAgIFxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIC8vIFJlbG9hZCBwZXJzb25hcyB0byBpbmNsdWRlIHRoZSBuZXcgb25lXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFBlcnNvbmFzKCk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSAke3Jlc3VsdC5tZXNzYWdlfVxcblxcblBlcnNvbmEgXCIke3Jlc3VsdC5wZXJzb25hPy5tZXRhZGF0YS5uYW1lfVwiIGlzIG5vdyBhdmFpbGFibGUuXFxuVG90YWwgcGVyc29uYXM6ICR7dGhpcy5wZXJzb25hcy5zaXplfWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgJHtyZXN1bHQubWVzc2FnZX1gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgSW1wb3J0IGZhaWxlZDogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZSBhIHBlcnNvbmEgdmlhIFVSTFxuICAgKi9cbiAgYXN5bmMgc2hhcmVQZXJzb25hKHBlcnNvbmFOYW1lOiBzdHJpbmcsIGV4cGlyeURheXMgPSA3KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuaGFuY2VkIGlucHV0IHZhbGlkYXRpb25cbiAgICAgIGNvbnN0IHZhbGlkYXRlZFBlcnNvbmFOYW1lID0gTUNQSW5wdXRWYWxpZGF0b3IudmFsaWRhdGVQZXJzb25hSWRlbnRpZmllcihwZXJzb25hTmFtZSk7XG4gICAgICBjb25zdCB2YWxpZGF0ZWRFeHBpcnlEYXlzID0gTUNQSW5wdXRWYWxpZGF0b3IudmFsaWRhdGVFeHBpcnlEYXlzKGV4cGlyeURheXMpO1xuICAgICAgXG4gICAgICBjb25zdCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQodmFsaWRhdGVkUGVyc29uYU5hbWUpO1xuICAgICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAgIC8vIFRyeSBieSBmaWxlbmFtZVxuICAgICAgICBjb25zdCBieUZpbGVuYW1lID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PT0gdmFsaWRhdGVkUGVyc29uYU5hbWUpO1xuICAgICAgICBpZiAoIWJ5RmlsZW5hbWUpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBQZXJzb25hIG5vdCBmb3VuZDogJHt2YWxpZGF0ZWRQZXJzb25hTmFtZX1gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcGVyc29uYU5hbWUgPSBieUZpbGVuYW1lLm1ldGFkYXRhLm5hbWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucGVyc29uYVNoYXJlci5zaGFyZVBlcnNvbmEodGhpcy5wZXJzb25hcy5nZXQocGVyc29uYU5hbWUpISwgdmFsaWRhdGVkRXhwaXJ5RGF5cyk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9JHtyZXN1bHQubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBTaGFyZSBmYWlsZWQ6ICR7U2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGZyb20gYSBzaGFyZWQgVVJMXG4gICAqL1xuICBhc3luYyBpbXBvcnRGcm9tVXJsKHVybDogc3RyaW5nLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbmhhbmNlZCBpbnB1dCB2YWxpZGF0aW9uIGZvciBVUkxcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFVybCA9IE1DUElucHV0VmFsaWRhdG9yLnZhbGlkYXRlSW1wb3J0VXJsKHVybCk7XG4gICAgICBcbiAgICAgIGNvbnN0IGZldGNoUmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJzb25hU2hhcmVyLmltcG9ydEZyb21VcmwodmFsaWRhdGVkVXJsKTtcbiAgICAgIFxuICAgICAgaWYgKCFmZXRjaFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICR7ZmV0Y2hSZXN1bHQubWVzc2FnZX1gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gSW1wb3J0IHRoZSBmZXRjaGVkIGRhdGFcbiAgICAgIGNvbnN0IGltcG9ydFJlc3VsdCA9IGF3YWl0IHRoaXMucGVyc29uYUltcG9ydGVyLmltcG9ydFBlcnNvbmEoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGZldGNoUmVzdWx0LmRhdGEpLFxuICAgICAgICB0aGlzLnBlcnNvbmFzLFxuICAgICAgICBvdmVyd3JpdGVcbiAgICAgICk7XG5cbiAgICAgIGlmIChpbXBvcnRSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAvLyBSZWxvYWQgcGVyc29uYXNcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkUGVyc29uYXMoKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFIFN1Y2Nlc3NmdWxseSBpbXBvcnRlZCBmcm9tIFVSTCFcXG5cXG4ke2ltcG9ydFJlc3VsdC5tZXNzYWdlfVxcblRvdGFsIHBlcnNvbmFzOiAke3RoaXMucGVyc29uYXMuc2l6ZX1gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICR7aW1wb3J0UmVzdWx0Lm1lc3NhZ2V9YFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEltcG9ydCBmcm9tIFVSTCBmYWlsZWQ6ICR7U2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBydW4oKSB7XG4gICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFN0ZGlvU2VydmVyVHJhbnNwb3J0KCk7XG4gICAgbG9nZ2VyLmluZm8oXCJTdGFydGluZyBEb2xsaG91c2VNQ1Agc2VydmVyLi4uXCIpO1xuICAgIGF3YWl0IHRoaXMuc2VydmVyLmNvbm5lY3QodHJhbnNwb3J0KTtcbiAgICAvLyBNYXJrIHRoYXQgTUNQIGlzIG5vdyBjb25uZWN0ZWQgLSBubyBtb3JlIGNvbnNvbGUgb3V0cHV0IGFsbG93ZWRcbiAgICBsb2dnZXIuc2V0TUNQQ29ubmVjdGVkKCk7XG4gICAgbG9nZ2VyLmluZm8oXCJEb2xsaG91c2VNQ1Agc2VydmVyIHJ1bm5pbmcgb24gc3RkaW9cIik7XG4gIH1cbn1cblxuLy8gRXhwb3J0IGlzIGFscmVhZHkgYXQgY2xhc3MgZGVjbGFyYXRpb25cblxuLy8gT25seSBzdGFydCB0aGUgc2VydmVyIGlmIHRoaXMgZmlsZSBpcyBiZWluZyBydW4gZGlyZWN0bHkgKG5vdCBpbXBvcnRlZCBieSB0ZXN0cylcbmlmIChpbXBvcnQubWV0YS51cmwgPT09IGBmaWxlOi8vJHtwcm9jZXNzLmFyZ3ZbMV19YCAmJiAhcHJvY2Vzcy5lbnYuSkVTVF9XT1JLRVJfSUQpIHtcbiAgY29uc3Qgc2VydmVyID0gbmV3IERvbGxob3VzZU1DUFNlcnZlcigpO1xuICBzZXJ2ZXIucnVuKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgbG9nZ2VyLmVycm9yKFwiRmF0YWwgZXJyb3Igc3RhcnRpbmcgc2VydmVyXCIsIGVycm9yKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH0pO1xufSJdfQ==