@dollhousemcp/mcp-server 2.0.17 → 2.0.19

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 (78) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/elements/BaseElement.d.ts +1 -0
  3. package/dist/elements/BaseElement.d.ts.map +1 -1
  4. package/dist/elements/BaseElement.js +7 -1
  5. package/dist/elements/agents/AgentManager.js +2 -2
  6. package/dist/elements/base/ElementFileOperations.js +2 -2
  7. package/dist/elements/ensembles/EnsembleManager.js +3 -3
  8. package/dist/elements/memories/MemoryManager.js +2 -2
  9. package/dist/elements/skills/SkillManager.js +2 -2
  10. package/dist/elements/templates/TemplateManager.js +2 -2
  11. package/dist/generated/version.d.ts +2 -2
  12. package/dist/generated/version.js +3 -3
  13. package/dist/handlers/ElementCRUDHandler.d.ts +30 -0
  14. package/dist/handlers/ElementCRUDHandler.d.ts.map +1 -1
  15. package/dist/handlers/ElementCRUDHandler.js +142 -2
  16. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +4 -0
  17. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  18. package/dist/handlers/mcp-aql/MCPAQLHandler.js +132 -14
  19. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  20. package/dist/handlers/mcp-aql/OperationRouter.js +6 -1
  21. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  22. package/dist/handlers/mcp-aql/OperationSchema.js +17 -1
  23. package/dist/handlers/mcp-aql/policies/AgentToolPolicyTranslator.d.ts.map +1 -1
  24. package/dist/handlers/mcp-aql/policies/AgentToolPolicyTranslator.js +2 -1
  25. package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts +9 -1
  26. package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
  27. package/dist/handlers/mcp-aql/policies/ElementPolicies.js +64 -4
  28. package/dist/handlers/mcp-aql/policies/OperationPolicies.d.ts.map +1 -1
  29. package/dist/handlers/mcp-aql/policies/OperationPolicies.js +6 -1
  30. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  31. package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
  32. package/dist/handlers/strategies/AgentActivationStrategy.d.ts.map +1 -1
  33. package/dist/handlers/strategies/AgentActivationStrategy.js +5 -1
  34. package/dist/handlers/strategies/BaseActivationStrategy.d.ts +1 -0
  35. package/dist/handlers/strategies/BaseActivationStrategy.d.ts.map +1 -1
  36. package/dist/handlers/strategies/BaseActivationStrategy.js +15 -1
  37. package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts.map +1 -1
  38. package/dist/handlers/strategies/EnsembleActivationStrategy.js +5 -1
  39. package/dist/handlers/strategies/MemoryActivationStrategy.d.ts.map +1 -1
  40. package/dist/handlers/strategies/MemoryActivationStrategy.js +5 -1
  41. package/dist/handlers/strategies/PersonaActivationStrategy.d.ts.map +1 -1
  42. package/dist/handlers/strategies/PersonaActivationStrategy.js +5 -1
  43. package/dist/handlers/strategies/SkillActivationStrategy.d.ts.map +1 -1
  44. package/dist/handlers/strategies/SkillActivationStrategy.js +5 -1
  45. package/dist/handlers/strategies/TemplateActivationStrategy.d.ts.map +1 -1
  46. package/dist/handlers/strategies/TemplateActivationStrategy.js +7 -2
  47. package/dist/persona/PersonaElement.js +2 -2
  48. package/dist/server/tools/MCPAQLTools.js +2 -1
  49. package/dist/services/SerializationService.d.ts.map +1 -1
  50. package/dist/services/SerializationService.js +7 -1
  51. package/dist/types/elements/IElement.d.ts +9 -0
  52. package/dist/types/elements/IElement.d.ts.map +1 -1
  53. package/dist/types/elements/IElement.js +1 -1
  54. package/dist/web/console/IngestRoutes.d.ts +6 -0
  55. package/dist/web/console/IngestRoutes.d.ts.map +1 -1
  56. package/dist/web/console/IngestRoutes.js +38 -9
  57. package/dist/web/console/LeaderElection.d.ts +39 -0
  58. package/dist/web/console/LeaderElection.d.ts.map +1 -1
  59. package/dist/web/console/LeaderElection.js +147 -29
  60. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -1
  61. package/dist/web/console/LeaderForwardingSink.js +5 -1
  62. package/dist/web/console/PromotionManager.d.ts.map +1 -1
  63. package/dist/web/console/PromotionManager.js +3 -11
  64. package/dist/web/public/app.js +62 -1
  65. package/dist/web/public/index.html +19 -17
  66. package/dist/web/public/permissions.css +190 -2
  67. package/dist/web/public/permissions.js +171 -30
  68. package/dist/web/public/sessions.js +111 -0
  69. package/dist/web/public/setup.js +131 -60
  70. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  71. package/dist/web/routes/permissionRoutes.js +77 -5
  72. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  73. package/dist/web/routes/setupRoutes.js +16 -2
  74. package/dist/web/server.d.ts.map +1 -1
  75. package/dist/web/server.js +12 -10
  76. package/package.json +1 -1
  77. package/scripts/pretooluse-dollhouse.sh +39 -1
  78. package/server.json +2 -2
@@ -17,6 +17,8 @@
17
17
  * @security-audit-suppress DMCP-SEC-006
18
18
  */
19
19
  import { ElementType } from '../portfolio/PortfolioManager.js';
20
+ import os from 'node:os';
21
+ import path from 'node:path';
20
22
  import { logger } from '../utils/logger.js';
21
23
  import { ElementNotFoundError } from '../utils/ErrorHandler.js';
22
24
  import { createElement as createElementCommand } from './element-crud/createElement.js';
@@ -30,6 +32,7 @@ import { SecurityMonitor } from '../security/securityMonitor.js';
30
32
  import { ELEMENT_TYPE_MAP } from '../utils/elementTypeNormalization.js';
31
33
  import { TemplateActivationStrategy, SkillActivationStrategy, AgentActivationStrategy, MemoryActivationStrategy, PersonaActivationStrategy, EnsembleActivationStrategy } from './strategies/index.js';
32
34
  import { formatValidationFailedError } from './element-crud/responseFormatter.js';
35
+ import { findConfirmAdvisoryElements, findConfirmDenyingElement, getGatekeeperDiagnostics, } from './mcp-aql/policies/ElementPolicies.js';
33
36
  export class ElementCRUDHandler {
34
37
  skillManager;
35
38
  templateManager;
@@ -119,7 +122,7 @@ export class ElementCRUDHandler {
119
122
  : '';
120
123
  }
121
124
  hasGatekeeperPolicy(metadata) {
122
- return Boolean(metadata?.['gatekeeper']);
125
+ return Boolean(metadata?.['gatekeeper'] || getGatekeeperDiagnostics(metadata));
123
126
  }
124
127
  toPolicyElementType(type) {
125
128
  const normalizedType = this.normalizeLookupValue(type).toLowerCase();
@@ -466,6 +469,143 @@ export class ElementCRUDHandler {
466
469
  : {}),
467
470
  }));
468
471
  }
472
+ async releaseDeadlock() {
473
+ const activeElements = await this.collectActiveElementsForDeadlockRelief();
474
+ const activePolicyElements = await this.getActiveElementsForPolicy();
475
+ const sandboxingElement = findConfirmDenyingElement(activePolicyElements);
476
+ const advisoryElements = findConfirmAdvisoryElements(activePolicyElements);
477
+ const deactivated = [];
478
+ const failed = [];
479
+ for (const element of activeElements) {
480
+ const strategy = this.strategies.get(element.type);
481
+ if (!strategy) {
482
+ failed.push({
483
+ type: element.type,
484
+ name: element.name,
485
+ error: `No activation strategy registered for type '${element.type}'`,
486
+ });
487
+ continue;
488
+ }
489
+ try {
490
+ await strategy.deactivate(element.name);
491
+ deactivated.push(element);
492
+ }
493
+ catch (error) {
494
+ failed.push({
495
+ type: element.type,
496
+ name: element.name,
497
+ error: error instanceof Error ? error.message : String(error),
498
+ });
499
+ }
500
+ }
501
+ const persistedStateCleared = Boolean(this.activationStore?.isEnabled());
502
+ const snapshotFile = await this.writeDeadlockReliefSnapshot({
503
+ sessionId: this.activationStore?.getSessionId(),
504
+ activeBeforeReset: activeElements,
505
+ deactivated,
506
+ failed,
507
+ likelyDeadlockCause: {
508
+ ...(sandboxingElement ? { sandboxingElement } : {}),
509
+ advisoryElements,
510
+ },
511
+ persistedStateCleared,
512
+ });
513
+ this.activationStore?.clearAll();
514
+ this.policyExportService?.exportPolicies().catch(() => { });
515
+ const failureSummary = failed.length > 0 ? ` with ${failed.length} failure(s)` : '';
516
+ SecurityMonitor.logSecurityEvent({
517
+ type: 'ELEMENT_DEACTIVATED',
518
+ severity: failed.length > 0 ? 'MEDIUM' : 'LOW',
519
+ source: 'ElementCRUDHandler.releaseDeadlock',
520
+ details: `Deadlock relief deactivated ${deactivated.length} element(s)${failureSummary}`,
521
+ additionalData: {
522
+ sessionId: this.activationStore?.getSessionId(),
523
+ activeBeforeReset: activeElements,
524
+ deactivated,
525
+ failed,
526
+ persistedStateCleared,
527
+ likelyDeadlockCause: {
528
+ ...(sandboxingElement ? { sandboxingElement } : {}),
529
+ advisoryElements,
530
+ },
531
+ snapshotFile,
532
+ },
533
+ });
534
+ return {
535
+ ...(this.activationStore?.getSessionId()
536
+ ? { sessionId: this.activationStore.getSessionId() }
537
+ : {}),
538
+ activeBeforeReset: activeElements,
539
+ deactivated,
540
+ failed,
541
+ persistedStateCleared,
542
+ likelyDeadlockCause: {
543
+ ...(sandboxingElement ? { sandboxingElement } : {}),
544
+ advisoryElements,
545
+ },
546
+ ...(snapshotFile ? { snapshotFile } : {}),
547
+ };
548
+ }
549
+ async collectActiveElementsForDeadlockRelief() {
550
+ const activeElements = [];
551
+ const activePersonas = this.personaManager.getActivePersonas();
552
+ activeElements.push(...activePersonas.map((persona) => ({
553
+ type: ElementType.PERSONA,
554
+ name: persona.metadata.name,
555
+ })));
556
+ const activeSkills = await this.skillManager.getActiveSkills();
557
+ activeElements.push(...activeSkills.map((skill) => ({
558
+ type: ElementType.SKILL,
559
+ name: skill.metadata.name,
560
+ })));
561
+ const activeAgents = await this.agentManager.getActiveAgents();
562
+ activeElements.push(...activeAgents.map((agent) => ({
563
+ type: ElementType.AGENT,
564
+ name: agent.metadata.name,
565
+ })));
566
+ const activeMemories = await this.memoryManager.getActiveMemories();
567
+ activeElements.push(...activeMemories.map((memory) => ({
568
+ type: ElementType.MEMORY,
569
+ name: memory.metadata.name,
570
+ })));
571
+ const activeEnsembles = await this.ensembleManager.getActiveEnsembles();
572
+ activeElements.push(...activeEnsembles.map((ensemble) => ({
573
+ type: ElementType.ENSEMBLE,
574
+ name: ensemble.metadata.name,
575
+ })));
576
+ const seen = new Set();
577
+ return activeElements.filter((element) => {
578
+ const key = `${element.type}:${element.name}`;
579
+ if (seen.has(key)) {
580
+ return false;
581
+ }
582
+ seen.add(key);
583
+ return true;
584
+ });
585
+ }
586
+ async writeDeadlockReliefSnapshot(snapshot) {
587
+ const snapshotDir = path.join(os.homedir(), '.dollhouse', 'state', 'deadlock-relief');
588
+ const safeSessionId = (snapshot.sessionId ?? 'session')
589
+ .replaceAll(/[^a-zA-Z0-9_-]/g, '-')
590
+ .slice(0, 64);
591
+ const timestamp = new Date().toISOString().replaceAll(/[:.]/g, '-');
592
+ const snapshotFile = path.join(snapshotDir, `deadlock-relief-${safeSessionId}-${timestamp}.json`);
593
+ try {
594
+ await this.fileOperations.createDirectory(snapshotDir);
595
+ await this.fileOperations.writeFile(snapshotFile, JSON.stringify({
596
+ createdAt: new Date().toISOString(),
597
+ ...snapshot,
598
+ }, null, 2), { source: 'ElementCRUDHandler.releaseDeadlock' });
599
+ return snapshotFile;
600
+ }
601
+ catch (error) {
602
+ logger.warn('Failed to write deadlock relief snapshot', {
603
+ snapshotFile,
604
+ error: error instanceof Error ? error.message : String(error),
605
+ });
606
+ return undefined;
607
+ }
608
+ }
469
609
  async mergePersistedPolicyState(state, addElement, findPersistedElement) {
470
610
  const pending = [];
471
611
  for (const [type, activations] of Object.entries(state.activations)) {
@@ -859,4 +999,4 @@ export class ElementCRUDHandler {
859
999
  };
860
1000
  }
861
1001
  }
862
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudENSVURIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZXJzL0VsZW1lbnRDUlVESGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFvQixNQUFNLGtDQUFrQyxDQUFDO0FBT2pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxJQUFJLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEYsT0FBTyxFQUFFLGFBQWEsSUFBSSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxXQUFXLElBQUksa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsY0FBYyxJQUFJLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxlQUFlLElBQUksc0JBQXNCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUs5RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHeEUsT0FBTyxFQUNMLDBCQUEwQixFQUMxQix1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN4Qix5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzNCLE1BQU0sdUJBQXVCLENBQUM7QUFPL0Is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UUFDbkMsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBRTlCLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ2xELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO2dCQUNyQyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNULFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDN0MsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLFdBQVcsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDL0UsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUM7b0JBQ1IsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3dCQUN2QixDQUFDLENBQUMsMkJBQTJCO2lCQUNoQyxDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRWxlbWVudENSVURIYW5kbGVyIC0gSGFuZGxlcyBhbGwgZ2VuZXJpYyBlbGVtZW50IENSVUQgb3BlcmF0aW9uc1xuICpcbiAqIFByb3ZpZGVzIGNyZWF0ZSwgZWRpdCwgdmFsaWRhdGUsIGFuZCBkZWxldGUgb3BlcmF0aW9ucyBmb3IgYWxsIGVsZW1lbnQgdHlwZXNcbiAqIChwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFnZW50cywgbWVtb3JpZXMpLlxuICpcbiAqIFVzZXMgZGVwZW5kZW5jeSBpbmplY3Rpb24gZm9yIGFsbCBzZXJ2aWNlczpcbiAqIC0gSW5pdGlhbGl6YXRpb25TZXJ2aWNlIGZvciBzZXR1cCB0YXNrc1xuICogLSBQZXJzb25hSW5kaWNhdG9yU2VydmljZSBmb3IgcGVyc29uYSBpbmRpY2F0b3IgZm9ybWF0dGluZ1xuICogLSBFbGVtZW50IG1hbmFnZXJzIChTa2lsbE1hbmFnZXIsIFRlbXBsYXRlTWFuYWdlciwgQWdlbnRNYW5hZ2VyLCBNZW1vcnlNYW5hZ2VyKVxuICogLSBQZXJzb25hTWFuYWdlciBmb3IgcGVyc29uYSBvcGVyYXRpb25zXG4gKiAtIFBvcnRmb2xpb01hbmFnZXIgZm9yIHBvcnRmb2xpbyBvcGVyYXRpb25zXG4gKlxuICogRklYOiBETUNQLVNFQy0wMDYgLSBTZWN1cml0eSBhdWRpdCBzdXBwcmVzc2lvblxuICogVGhpcyBoYW5kbGVyIGRlbGVnYXRlcyBhbGwgb3BlcmF0aW9ucyB0byBzcGVjaWFsaXplZCBlbGVtZW50IG1hbmFnZXJzLlxuICogQXVkaXQgbG9nZ2luZyBoYXBwZW5zIGluIHRoZSBlbGVtZW50IG1hbmFnZXJzIHRoZW1zZWx2ZXMuXG4gKiBAc2VjdXJpdHktYXVkaXQtc3VwcHJlc3MgRE1DUC1TRUMtMDA2XG4gKi9cblxuaW1wb3J0IHsgRWxlbWVudFR5cGUsIFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTa2lsbE1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy9za2lsbHMvaW5kZXguanMnO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSAnLi4vZWxlbWVudHMvdGVtcGxhdGVzL1RlbXBsYXRlTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZVJlbmRlcmVyIH0gZnJvbSAnLi4vdXRpbHMvVGVtcGxhdGVSZW5kZXJlci5qcyc7XG5pbXBvcnQgeyBBZ2VudE1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy9hZ2VudHMvQWdlbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IE1lbW9yeU1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEVuc2VtYmxlTWFuYWdlciB9IGZyb20gJy4uL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnROb3RGb3VuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQgYXMgY3JlYXRlRWxlbWVudENvbW1hbmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC9jcmVhdGVFbGVtZW50LmpzJztcbmltcG9ydCB7IGRlbGV0ZUVsZW1lbnQgYXMgZGVsZXRlRWxlbWVudENvbW1hbmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC9kZWxldGVFbGVtZW50LmpzJztcbmltcG9ydCB7IGVkaXRFbGVtZW50IGFzIGVkaXRFbGVtZW50Q29tbWFuZCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL2VkaXRFbGVtZW50LmpzJztcbmltcG9ydCB7IHVwZ3JhZGVFbGVtZW50IGFzIHVwZ3JhZGVFbGVtZW50Q29tbWFuZCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL3VwZ3JhZGVFbGVtZW50LmpzJztcbmltcG9ydCB7IGxpc3RFbGVtZW50cyBhcyBsaXN0RWxlbWVudHNDb21tYW5kIH0gZnJvbSAnLi9lbGVtZW50LWNydWQvbGlzdEVsZW1lbnRzLmpzJztcbmltcG9ydCB7IGZpbmRFbGVtZW50RmxleGlibHksIHNhbml0aXplTWV0YWRhdGEgYXMgc2FuaXRpemVNZXRhZGF0YVJlY29yZCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVFbGVtZW50IGFzIHZhbGlkYXRlRWxlbWVudENvbW1hbmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC92YWxpZGF0ZUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgRWxlbWVudENydWRDb250ZXh0IH0gZnJvbSAnLi9lbGVtZW50LWNydWQvdHlwZXMuanMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvSW5pdGlhbGl6YXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFBlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvUGVyc29uYUluZGljYXRvclNlcnZpY2UuanMnO1xuaW1wb3J0IHsgUGVyc29uYU1hbmFnZXIgfSBmcm9tICcuLi9wZXJzb25hL1BlcnNvbmFNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBFTEVNRU5UX1RZUEVfTUFQIH0gZnJvbSAnLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSUZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRBY3RpdmF0aW9uU3RyYXRlZ3ksIE1DUFJlc3BvbnNlIH0gZnJvbSAnLi9zdHJhdGVnaWVzL2luZGV4LmpzJztcbmltcG9ydCB7XG4gIFRlbXBsYXRlQWN0aXZhdGlvblN0cmF0ZWd5LFxuICBTa2lsbEFjdGl2YXRpb25TdHJhdGVneSxcbiAgQWdlbnRBY3RpdmF0aW9uU3RyYXRlZ3ksXG4gIE1lbW9yeUFjdGl2YXRpb25TdHJhdGVneSxcbiAgUGVyc29uYUFjdGl2YXRpb25TdHJhdGVneSxcbiAgRW5zZW1ibGVBY3RpdmF0aW9uU3RyYXRlZ3lcbn0gZnJvbSAnLi9zdHJhdGVnaWVzL2luZGV4LmpzJztcbmltcG9ydCB7IEVsZW1lbnRRdWVyeVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWVyeS9FbGVtZW50UXVlcnlTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB0eXBlIHsgQWN0aXZhdGlvblN0b3JlLCBQZXJzaXN0ZWRBY3RpdmF0aW9uLCBQZXJzaXN0ZWRBY3RpdmF0aW9uU3RhdGVTbmFwc2hvdCB9IGZyb20gJy4uL3NlcnZpY2VzL0FjdGl2YXRpb25TdG9yZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhY2t1cFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9CYWNrdXBTZXJ2aWNlLmpzJztcbmltcG9ydCB0eXBlIHsgUG9saWN5RXhwb3J0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL1BvbGljeUV4cG9ydFNlcnZpY2UuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy9iYXNlL0Jhc2VFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBmb3JtYXRWYWxpZGF0aW9uRmFpbGVkRXJyb3IgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC9yZXNwb25zZUZvcm1hdHRlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50Q1JVREhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0cmF0ZWdpZXM6IE1hcDxzdHJpbmcsIEVsZW1lbnRBY3RpdmF0aW9uU3RyYXRlZ3k+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2tpbGxNYW5hZ2VyOiBTa2lsbE1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZU1hbmFnZXI6IFRlbXBsYXRlTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlUmVuZGVyZXI6IFRlbXBsYXRlUmVuZGVyZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhZ2VudE1hbmFnZXI6IEFnZW50TWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yeU1hbmFnZXI6IE1lbW9yeU1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbnNlbWJsZU1hbmFnZXI6IEVuc2VtYmxlTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlcnNvbmFNYW5hZ2VyOiBQZXJzb25hTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbml0U2VydmljZTogSW5pdGlhbGl6YXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yU2VydmljZTogUGVyc29uYUluZGljYXRvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWxlT3BlcmF0aW9uczogSUZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRRdWVyeVNlcnZpY2U6IEVsZW1lbnRRdWVyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRpb25TdG9yZT86IEFjdGl2YXRpb25TdG9yZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJhY2t1cFNlcnZpY2U/OiBCYWNrdXBTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9saWN5RXhwb3J0U2VydmljZT86IFBvbGljeUV4cG9ydFNlcnZpY2VcbiAgKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBzdHJhdGVneSBtYXAgd2l0aCBhbGwgZWxlbWVudCB0eXBlIHN0cmF0ZWdpZXNcbiAgICB0aGlzLnN0cmF0ZWdpZXMgPSBuZXcgTWFwPHN0cmluZywgRWxlbWVudEFjdGl2YXRpb25TdHJhdGVneT4oW1xuICAgICAgW0VsZW1lbnRUeXBlLlBFUlNPTkEsIG5ldyBQZXJzb25hQWN0aXZhdGlvblN0cmF0ZWd5KHBlcnNvbmFNYW5hZ2VyLCBpbmRpY2F0b3JTZXJ2aWNlKV0sXG4gICAgICBbRWxlbWVudFR5cGUuU0tJTEwsIG5ldyBTa2lsbEFjdGl2YXRpb25TdHJhdGVneShza2lsbE1hbmFnZXIpXSxcbiAgICAgIFtFbGVtZW50VHlwZS5URU1QTEFURSwgbmV3IFRlbXBsYXRlQWN0aXZhdGlvblN0cmF0ZWd5KHRlbXBsYXRlTWFuYWdlcildLFxuICAgICAgW0VsZW1lbnRUeXBlLkFHRU5ULCBuZXcgQWdlbnRBY3RpdmF0aW9uU3RyYXRlZ3koYWdlbnRNYW5hZ2VyKV0sXG4gICAgICBbRWxlbWVudFR5cGUuTUVNT1JZLCBuZXcgTWVtb3J5QWN0aXZhdGlvblN0cmF0ZWd5KG1lbW9yeU1hbmFnZXIpXSxcbiAgICAgIFtFbGVtZW50VHlwZS5FTlNFTUJMRSwgbmV3IEVuc2VtYmxlQWN0aXZhdGlvblN0cmF0ZWd5KFxuICAgICAgICBlbnNlbWJsZU1hbmFnZXIsXG4gICAgICAgIHBvcnRmb2xpb01hbmFnZXIsXG4gICAgICAgIHNraWxsTWFuYWdlcixcbiAgICAgICAgdGVtcGxhdGVNYW5hZ2VyLFxuICAgICAgICBhZ2VudE1hbmFnZXIsXG4gICAgICAgIG1lbW9yeU1hbmFnZXIsXG4gICAgICAgIHBlcnNvbmFNYW5hZ2VyXG4gICAgICApXVxuICAgIF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVJbml0aWFsaXplZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXRTZXJ2aWNlLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFBlcnNvbmFJbmRpY2F0b3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbmRpY2F0b3JTZXJ2aWNlLmdldFBlcnNvbmFJbmRpY2F0b3IoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udGV4dCgpOiBFbGVtZW50Q3J1ZENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBlbnN1cmVJbml0aWFsaXplZDogKCkgPT4gdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpLFxuICAgICAgZ2V0UGVyc29uYUluZGljYXRvcjogKCkgPT4gdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCksXG4gICAgICBza2lsbE1hbmFnZXI6IHRoaXMuc2tpbGxNYW5hZ2VyLFxuICAgICAgdGVtcGxhdGVNYW5hZ2VyOiB0aGlzLnRlbXBsYXRlTWFuYWdlcixcbiAgICAgIHRlbXBsYXRlUmVuZGVyZXI6IHRoaXMudGVtcGxhdGVSZW5kZXJlcixcbiAgICAgIGFnZW50TWFuYWdlcjogdGhpcy5hZ2VudE1hbmFnZXIsXG4gICAgICBtZW1vcnlNYW5hZ2VyOiB0aGlzLm1lbW9yeU1hbmFnZXIsXG4gICAgICBlbnNlbWJsZU1hbmFnZXI6IHRoaXMuZW5zZW1ibGVNYW5hZ2VyLFxuICAgICAgcG9ydGZvbGlvTWFuYWdlcjogdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLFxuICAgICAgcGVyc29uYU1hbmFnZXI6IHRoaXMucGVyc29uYU1hbmFnZXIsXG4gICAgICBmaWxlT3BlcmF0aW9uczogdGhpcy5maWxlT3BlcmF0aW9ucyxcbiAgICAgIGVsZW1lbnRRdWVyeVNlcnZpY2U6IHRoaXMuZWxlbWVudFF1ZXJ5U2VydmljZSxcbiAgICAgIHZhbGlkYXRpb25SZWdpc3RyeTogdGhpcy52YWxpZGF0aW9uUmVnaXN0cnksXG4gICAgICBiYWNrdXBTZXJ2aWNlOiB0aGlzLmJhY2t1cFNlcnZpY2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYnkgbmFtZSwgc3VwcG9ydGluZyBib3RoIGV4YWN0IGRpc3BsYXkgbmFtZSBhbmQgZmlsZW5hbWUgKHNsdWcpIG1hdGNoaW5nXG4gICAqIEhlbHBlciBtZXRob2QgZXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MzQ2LTM3OVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kRWxlbWVudEZsZXhpYmx5KG5hbWU6IHN0cmluZywgZWxlbWVudExpc3Q6IGFueVtdKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gZmluZEVsZW1lbnRGbGV4aWJseShuYW1lLCBlbGVtZW50TGlzdCk7XG4gIH1cblxuICAvKipcbiAgICogU2FuaXRpemUgbWV0YWRhdGEgb2JqZWN0IHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgKiBIZWxwZXIgbWV0aG9kIGV4dHJhY3RlZCBmcm9tIGluZGV4LnRzOjM5MC00MTBcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVNZXRhZGF0YShtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiBzYW5pdGl6ZU1ldGFkYXRhUmVjb3JkKG1ldGFkYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplTG9va3VwVmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICA/IHZhbHVlLm5vcm1hbGl6ZSgnTkZDJykudHJpbSgpXG4gICAgICA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNHYXRla2VlcGVyUG9saWN5KG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKG1ldGFkYXRhPy5bJ2dhdGVrZWVwZXInXSk7XG4gIH1cblxuICBwcml2YXRlIHRvUG9saWN5RWxlbWVudFR5cGUodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplTG9va3VwVmFsdWUodHlwZSkudG9Mb3dlckNhc2UoKTtcbiAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICBjYXNlICdwZXJzb25hcyc6XG4gICAgICAgIHJldHVybiAncGVyc29uYSc7XG4gICAgICBjYXNlICdza2lsbHMnOlxuICAgICAgICByZXR1cm4gJ3NraWxsJztcbiAgICAgIGNhc2UgJ2FnZW50cyc6XG4gICAgICAgIHJldHVybiAnYWdlbnQnO1xuICAgICAgY2FzZSAnbWVtb3JpZXMnOlxuICAgICAgICByZXR1cm4gJ21lbW9yeSc7XG4gICAgICBjYXNlICdlbnNlbWJsZXMnOlxuICAgICAgICByZXR1cm4gJ2Vuc2VtYmxlJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkVHlwZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MTQ5Mi0xNjMxICgxNDAgbGluZXMgLSBleGFjdCBjb3B5KVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmc7IGluc3RydWN0aW9ucz86IHN0cmluZzsgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSkge1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50Q29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogRWRpdCBhbiBleGlzdGluZyBlbGVtZW50IHVzaW5nIEdyYXBoUUwtYWxpZ25lZCBuZXN0ZWQgaW5wdXQgb2JqZWN0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgaGFuZGxlci5lZGl0RWxlbWVudCh7XG4gICAqICAgbmFtZTogJ215LXNraWxsJyxcbiAgICogICB0eXBlOiAnc2tpbGxzJyxcbiAgICogICBpbnB1dDoge1xuICAgKiAgICAgZGVzY3JpcHRpb246ICdVcGRhdGVkJyxcbiAgICogICAgIG1ldGFkYXRhOiB7IHRyaWdnZXJzOiBbJ2NvZGUnXSB9XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICovXG4gIGFzeW5jIGVkaXRFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSkge1xuICAgIHJldHVybiBlZGl0RWxlbWVudENvbW1hbmQodGhpcy5nZXRDb250ZXh0KCksIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZ3JhZGUgZWxlbWVudCBmcm9tIHYxIHNpbmdsZS1ib2R5IHRvIHYyIGR1YWwtZmllbGQgZm9ybWF0IChpbnN0cnVjdGlvbnMgKyBjb250ZW50KVxuICAgKi9cbiAgYXN5bmMgdXBncmFkZUVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBkcnlfcnVuPzogYm9vbGVhbjsgaW5zdHJ1Y3Rpb25zX292ZXJyaWRlPzogc3RyaW5nOyBjb250ZW50X292ZXJyaWRlPzogc3RyaW5nfSkge1xuICAgIHJldHVybiB1cGdyYWRlRWxlbWVudENvbW1hbmQodGhpcy5nZXRDb250ZXh0KCksIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MTk0MS0yMDU0ICgxMTQgbGluZXMgLSBleGFjdCBjb3B5KVxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgc3RyaWN0PzogYm9vbGVhbn0pIHtcbiAgICByZXR1cm4gdmFsaWRhdGVFbGVtZW50Q29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MjA1Ni0yMzEwICgyNTUgbGluZXMgLSBleGFjdCBjb3B5LCBzcGxpdCBmb3IgcmVhZGFiaWxpdHkpXG4gICAqL1xuICBhc3luYyBkZWxldGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZGVsZXRlRGF0YT86IGJvb2xlYW59KSB7XG4gICAgcmV0dXJuIGRlbGV0ZUVsZW1lbnRDb21tYW5kKHRoaXMuZ2V0Q29udGV4dCgpLCBhcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogc3RyaW5nIHtcbiAgICAvLyBJc3N1ZSAjNTAxOiBHdWFyZCBhZ2FpbnN0IG51bGwvdW5kZWZpbmVkIHRvIG1hdGNoIHNoYXJlZCB1dGlsaXR5IHBhdHRlcm5cbiAgICBpZiAodHlwZSA9PSBudWxsIHx8IHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJyB8fCB0eXBlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFscmVhZHkgYSB2YWxpZCBFbGVtZW50VHlwZSB2YWx1ZSwgcmV0dXJuIGFzLWlzXG4gICAgaWYgKE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmluY2x1ZGVzKHR5cGUgYXMgRWxlbWVudFR5cGUpKSB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugc2hhcmVkIG5vcm1hbGl6YXRpb24gbWFwIChJc3N1ZSAjNDMzKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBFTEVNRU5UX1RZUEVfTUFQW3R5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCldO1xuICAgIGlmIChub3JtYWxpemVkKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9XG5cbiAgICAvLyBVbmtub3duIHR5cGUgLSByZXR1cm4gYXMtaXMgYW5kIGxldCB2YWxpZGF0aW9uIGhhbmRsZSBpdFxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgYXN5bmMgbGlzdEVsZW1lbnRzKHR5cGU6IHN0cmluZywgb3B0aW9ucz86IGltcG9ydCgnLi4vc2VydmljZXMvcXVlcnkvdHlwZXMuanMnKS5RdWVyeU9wdGlvbnMpIHtcbiAgICByZXR1cm4gbGlzdEVsZW1lbnRzQ29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgdHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJhdyBlbGVtZW50cyBhcnJheSBmb3IgYSBnaXZlbiB0eXBlLlxuICAgKiBVbmxpa2UgbGlzdEVsZW1lbnRzIHdoaWNoIHJldHVybnMgTUNQUmVzcG9uc2UgZm9ybWF0LCB0aGlzIHJldHVybnMgcmF3IGVsZW1lbnQgb2JqZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBFbGVtZW50IHR5cGUgKHBlcnNvbmEsIHNraWxsLCB0ZW1wbGF0ZSwgYWdlbnQsIG1lbW9yeSwgZW5zZW1ibGUpXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHJhdyBlbGVtZW50IG9iamVjdHNcbiAgICovXG4gIGFzeW5jIGdldEVsZW1lbnRzKHR5cGU6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bltdPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcblxuICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uYU1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlTWFuYWdlci5saXN0KCk7XG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOlxuICAgICAgICByZXR1cm4gdGhpcy5hZ2VudE1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5NRU1PUlk6XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeU1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5FTlNFTUJMRTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5zZW1ibGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhY3RpdmF0ZUVsZW1lbnQobmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZJWDogRE1DUC1TRUMtMDA2IC0gQWRkIHNlY3VyaXR5IGF1ZGl0IGxvZ2dpbmcgZm9yIGVsZW1lbnQgYWN0aXZhdGlvblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9BQ1RJVkFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0VsZW1lbnRDUlVESGFuZGxlci5hY3RpdmF0ZUVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgRWxlbWVudCBhY3RpdmF0aW9uIHJlcXVlc3RlZDogJHt0eXBlfS8ke25hbWV9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZWxlbWVudFR5cGU6IHR5cGUsIGVsZW1lbnROYW1lOiBuYW1lLCBjb250ZXh0UHJvdmlkZWQ6ICEhY29udGV4dCB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWdpZXMuZ2V0KG5vcm1hbGl6ZWRUeXBlKTtcblxuICAgICAgaWYgKCFzdHJhdGVneSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmF0ZWd5LmFjdGl2YXRlKG5hbWUsIGNvbnRleHQpO1xuXG4gICAgICAvLyBJc3N1ZSAjNTk4OiBQZXJzaXN0IGFjdGl2YXRpb24gc3RhdGUgZm9yIHNlc3Npb24gcmVzdG9yZVxuICAgICAgaWYgKHRoaXMuYWN0aXZhdGlvblN0b3JlKSB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gbm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLlBFUlNPTkFcbiAgICAgICAgICA/IHRoaXMucGVyc29uYU1hbmFnZXIuZmluZFBlcnNvbmEobmFtZSk/LmZpbGVuYW1lXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYWN0aXZhdGlvblN0b3JlLnJlY29yZEFjdGl2YXRpb24obm9ybWFsaXplZFR5cGUsIG5hbWUsIGZpbGVuYW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzc2MjogRXhwb3J0IHBvbGljaWVzIHRvIGJyaWRnZSBhZnRlciBhY3RpdmF0aW9uXG4gICAgICB0aGlzLnBvbGljeUV4cG9ydFNlcnZpY2U/LmV4cG9ydFBvbGljaWVzKCkuY2F0Y2goKCkgPT4ge30pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBhY3RpdmF0ZSBlbGVtZW50OmAsIHsgdHlwZSwgbmFtZSwgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGFjdGl2YXRlICR7dHlwZX0gJyR7bmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0QWN0aXZlRWxlbWVudHModHlwZT86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBJc3N1ZSAjNTAxOiBXaGVuIHR5cGUgaXMgb21pdHRlZCwgYWdncmVnYXRlIGFjdGl2ZSBlbGVtZW50cyBhY3Jvc3MgYWxsIHR5cGVzXG4gICAgICBpZiAoIXR5cGUgfHwgdHlwZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFnZ3JlZ2F0ZUFjdGl2ZUVsZW1lbnRzKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVnaWVzLmdldChub3JtYWxpemVkVHlwZSk7XG5cbiAgICAgIGlmICghc3RyYXRlZ3kpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgc3RyYXRlZ3kuZ2V0QWN0aXZlRWxlbWVudHMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSBlbGVtZW50czpgLCB7IHR5cGUsIGVycm9yIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBnZXQgYWN0aXZlICR7dHlwZSB8fCAnYWxsJ306ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJhdyBhY3RpdmUgZWxlbWVudHMgZm9yIEdhdGVrZWVwZXIgcG9saWN5IGV2YWx1YXRpb24uXG4gICAqIFJldHVybnMgYWN0aXZlIHBlcnNvbmFzLCBza2lsbHMsIGFuZCBlbnNlbWJsZXMgd2l0aCB0aGVpciBtZXRhZGF0YVxuICAgKiBtYXBwZWQgdG8gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IHRoZSBHYXRla2VlcGVyJ3MgQWN0aXZlRWxlbWVudCBpbnRlcmZhY2UuXG4gICAqXG4gICAqIElzc3VlICM0NTI6IFByb3ZpZGVzIGFjdGl2ZSBlbGVtZW50IGNvbnRleHQgZm9yIGVuZm9yY2UoKSBwb2xpY3kgY2hlY2tzLlxuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlRWxlbWVudHNGb3JQb2xpY3koKTogUHJvbWlzZTxBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4+IHtcbiAgICBjb25zdCByZXN1bHQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PiA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBBY3RpdmUgcGVyc29uYXMgKHN5bmMpXG4gICAgICBjb25zdCBwZXJzb25hcyA9IHRoaXMucGVyc29uYU1hbmFnZXIuZ2V0QWN0aXZlUGVyc29uYXMoKTtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBwZXJzb25hcykge1xuICAgICAgICBjb25zdCBrZXkgPSBgcGVyc29uYToke3AubWV0YWRhdGEubmFtZX1gO1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3BlcnNvbmEnLFxuICAgICAgICAgIG5hbWU6IHAubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBtZXRhZGF0YTogcC5tZXRhZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnYXRoZXIgYWN0aXZlIHBlcnNvbmFzIGZvciBwb2xpY3kgZXZhbHVhdGlvbicsIHsgZXJyb3IgfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEFjdGl2ZSBza2lsbHMgKGFzeW5jKVxuICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIuZ2V0QWN0aXZlU2tpbGxzKCk7XG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc2tpbGxzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGBza2lsbDoke3MubWV0YWRhdGEubmFtZX1gO1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3NraWxsJyxcbiAgICAgICAgICBuYW1lOiBzLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHMubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIGFjdGl2ZSBza2lsbHMgZm9yIHBvbGljeSBldmFsdWF0aW9uJywgeyBlcnJvciB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0aXZlIGFnZW50cyAoYXN5bmMpXG4gICAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5nZXRBY3RpdmVBZ2VudHMoKTtcbiAgICAgIGZvciAoY29uc3QgYWdlbnQgb2YgYWdlbnRzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGBhZ2VudDoke2FnZW50Lm1ldGFkYXRhLm5hbWV9YDtcbiAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdhZ2VudCcsXG4gICAgICAgICAgbmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBtZXRhZGF0YTogYWdlbnQubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIGFjdGl2ZSBhZ2VudHMgZm9yIHBvbGljeSBldmFsdWF0aW9uJywgeyBlcnJvciB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0aXZlIGVuc2VtYmxlcyAoYXN5bmMpXG4gICAgICBjb25zdCBlbnNlbWJsZXMgPSBhd2FpdCB0aGlzLmVuc2VtYmxlTWFuYWdlci5nZXRBY3RpdmVFbnNlbWJsZXMoKTtcbiAgICAgIGZvciAoY29uc3QgZSBvZiBlbnNlbWJsZXMpIHtcbiAgICAgICAgY29uc3QgZW5zZW1ibGVLZXkgPSBgZW5zZW1ibGU6JHtlLm1ldGFkYXRhLm5hbWV9YDtcbiAgICAgICAgc2Vlbi5hZGQoZW5zZW1ibGVLZXkpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2Vuc2VtYmxlJyxcbiAgICAgICAgICBuYW1lOiBlLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgbWV0YWRhdGE6IGUubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSA0OiBSZXNvbHZlIGVuc2VtYmxlIG1lbWJlciBnYXRla2VlcGVyIHBvbGljaWVzXG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSAoZS5tZXRhZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8uZWxlbWVudHMgYXNcbiAgICAgICAgICBBcnJheTx7IGVsZW1lbnRfbmFtZTogc3RyaW5nOyBlbGVtZW50X3R5cGU6IHN0cmluZyB9PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWVtYmVycykpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBtZW1iZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBtZW1iZXJLZXkgPSBgJHttZW1iZXIuZWxlbWVudF90eXBlfToke21lbWJlci5lbGVtZW50X25hbWV9YDtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhtZW1iZXJLZXkpKSBjb250aW51ZTsgLy8gQWxyZWFkeSBhY3RpdmUgaW5kaXZpZHVhbGx5XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBtZW1iZXJFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudHMobWVtYmVyLmVsZW1lbnRfdHlwZSk7XG4gICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gKG1lbWJlckVsZW1lbnRzIGFzIEFycmF5PHsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KS5maW5kKFxuICAgICAgICAgICAgICAgIGVsID0+IChlbD8ubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5uYW1lID09PSBtZW1iZXIuZWxlbWVudF9uYW1lXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChmb3VuZD8ubWV0YWRhdGEgJiYgKGZvdW5kLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8uZ2F0ZWtlZXBlcikge1xuICAgICAgICAgICAgICAgIHNlZW4uYWRkKG1lbWJlcktleSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogbWVtYmVyLmVsZW1lbnRfdHlwZSxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IG1lbWJlci5lbGVtZW50X25hbWUsXG4gICAgICAgICAgICAgICAgICBtZXRhZGF0YTogZm91bmQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAvLyBOb24tZmF0YWw6IHNraXAgbWVtYmVyIGlmIGVsZW1lbnQgdHlwZSBsb29rdXAgZmFpbHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnYXRoZXIgYWN0aXZlIGVuc2VtYmxlcyBmb3IgcG9saWN5IGV2YWx1YXRpb24nLCB7IGVycm9yIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBnZXRQb2xpY3lFbGVtZW50c0ZvclJlcG9ydChzZXNzaW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBzZXNzaW9uSWRzPzogc3RyaW5nW107XG4gIH0+PiB7XG4gICAgY29uc3QgbWVyZ2VkID0gbmV3IE1hcDxzdHJpbmcsIHtcbiAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIHNlc3Npb25JZHM6IFNldDxzdHJpbmc+O1xuICAgIH0+KCk7XG5cbiAgICBjb25zdCBhZGRFbGVtZW50ID0gKFxuICAgICAgZWxlbWVudDogeyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0sXG4gICAgICBzZXNzaW9uSWRzOiBzdHJpbmdbXSA9IFtdLFxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCF0aGlzLmhhc0dhdGVrZWVwZXJQb2xpY3koZWxlbWVudC5tZXRhZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSBgJHtlbGVtZW50LnR5cGV9OiR7ZWxlbWVudC5uYW1lfWA7XG4gICAgICBjb25zdCBleGlzdGluZyA9IG1lcmdlZC5nZXQoa2V5KTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICBzZXNzaW9uSWRzLmZvckVhY2goaWQgPT4gZXhpc3Rpbmcuc2Vzc2lvbklkcy5hZGQoaWQpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBtZXJnZWQuc2V0KGtleSwge1xuICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgbWV0YWRhdGE6IGVsZW1lbnQubWV0YWRhdGEsXG4gICAgICAgIHNlc3Npb25JZHM6IG5ldyBTZXQoc2Vzc2lvbklkcyksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgY3VycmVudFNlc3Npb25JZCA9IHRoaXMuYWN0aXZhdGlvblN0b3JlPy5nZXRTZXNzaW9uSWQoKTtcbiAgICBjb25zdCBpbmNsdWRlQ3VycmVudFNlc3Npb24gPSAhc2Vzc2lvbklkIHx8ICFjdXJyZW50U2Vzc2lvbklkIHx8IGN1cnJlbnRTZXNzaW9uSWQgPT09IHNlc3Npb25JZDtcblxuICAgIGlmIChpbmNsdWRlQ3VycmVudFNlc3Npb24pIHtcbiAgICAgIGZvciAoY29uc3QgYWN0aXZlRWxlbWVudCBvZiBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzRm9yUG9saWN5KCkpIHtcbiAgICAgICAgYWRkRWxlbWVudChhY3RpdmVFbGVtZW50LCBjdXJyZW50U2Vzc2lvbklkID8gW2N1cnJlbnRTZXNzaW9uSWRdIDogW10pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2YXRpb25TdG9yZT8uaXNFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IHBlcnNpc3RlZFN0YXRlcyA9IGF3YWl0IHRoaXMuYWN0aXZhdGlvblN0b3JlLmxpc3RQZXJzaXN0ZWRBY3RpdmF0aW9uU3RhdGVzKHNlc3Npb25JZCk7XG4gICAgICBjb25zdCBjYXRhbG9ncyA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTx7IG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGZpbGVuYW1lPzogc3RyaW5nIH0+PigpO1xuXG4gICAgICBjb25zdCBnZXRDYXRhbG9nID0gYXN5bmMgKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICAgIGlmICghY2F0YWxvZ3MuaGFzKG5vcm1hbGl6ZWRUeXBlKSkge1xuICAgICAgICAgIGNhdGFsb2dzLnNldChcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRUeXBlLFxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuZ2V0RWxlbWVudHMobm9ybWFsaXplZFR5cGUpKSBhcyBBcnJheTx7IG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGZpbGVuYW1lPzogc3RyaW5nIH0+LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhdGFsb2dzLmdldChub3JtYWxpemVkVHlwZSkgPz8gW107XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5kUGVyc2lzdGVkRWxlbWVudCA9IGFzeW5jIChcbiAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICBhY3RpdmF0aW9uOiBQZXJzaXN0ZWRBY3RpdmF0aW9uLFxuICAgICAgKTogUHJvbWlzZTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSB8IG51bGw+ID0+IHtcbiAgICAgICAgY29uc3QgY2F0YWxvZyA9IGF3YWl0IGdldENhdGFsb2codHlwZSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gdGhpcy5ub3JtYWxpemVMb29rdXBWYWx1ZShhY3RpdmF0aW9uLm5hbWUpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkRmlsZW5hbWUgPSB0aGlzLm5vcm1hbGl6ZUxvb2t1cFZhbHVlKGFjdGl2YXRpb24uZmlsZW5hbWUpO1xuXG4gICAgICAgIGNvbnN0IGZvdW5kID0gY2F0YWxvZy5maW5kKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBlbGVtZW50Lm1ldGFkYXRhID8/IHt9O1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gdGhpcy5ub3JtYWxpemVMb29rdXBWYWx1ZShtZXRhZGF0YVsnbmFtZSddKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50RmlsZW5hbWUgPSB0aGlzLm5vcm1hbGl6ZUxvb2t1cFZhbHVlKFxuICAgICAgICAgICAgZWxlbWVudC5maWxlbmFtZSA/PyBtZXRhZGF0YVsnZmlsZW5hbWUnXSA/PyBtZXRhZGF0YVsnc291cmNlRmlsZSddLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gZWxlbWVudE5hbWUgPT09IG5vcm1hbGl6ZWROYW1lIHx8IChub3JtYWxpemVkRmlsZW5hbWUgIT09ICcnICYmIGVsZW1lbnRGaWxlbmFtZSA9PT0gbm9ybWFsaXplZEZpbGVuYW1lKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFmb3VuZD8ubWV0YWRhdGEgfHwgIXRoaXMuaGFzR2F0ZWtlZXBlclBvbGljeShmb3VuZC5tZXRhZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdGhpcy50b1BvbGljeUVsZW1lbnRUeXBlKHR5cGUpLFxuICAgICAgICAgIG5hbWU6IChmb3VuZC5tZXRhZGF0YVsnbmFtZSddIGFzIHN0cmluZykgPz8gYWN0aXZhdGlvbi5uYW1lLFxuICAgICAgICAgIG1ldGFkYXRhOiBmb3VuZC5tZXRhZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3Qgc3RhdGUgb2YgcGVyc2lzdGVkU3RhdGVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubWVyZ2VQZXJzaXN0ZWRQb2xpY3lTdGF0ZShzdGF0ZSwgYWRkRWxlbWVudCwgZmluZFBlcnNpc3RlZEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKG1lcmdlZC52YWx1ZXMoKSkubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIHR5cGU6IGVudHJ5LnR5cGUsXG4gICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgbWV0YWRhdGE6IGVudHJ5Lm1ldGFkYXRhLFxuICAgICAgLi4uKGVudHJ5LnNlc3Npb25JZHMuc2l6ZSA+IDBcbiAgICAgICAgPyB7IHNlc3Npb25JZHM6IEFycmF5LmZyb20oZW50cnkuc2Vzc2lvbklkcykuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSB9XG4gICAgICAgIDoge30pLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVyZ2VQZXJzaXN0ZWRQb2xpY3lTdGF0ZShcbiAgICBzdGF0ZTogUGVyc2lzdGVkQWN0aXZhdGlvblN0YXRlU25hcHNob3QsXG4gICAgYWRkRWxlbWVudDogKGVsZW1lbnQ6IHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LCBzZXNzaW9uSWRzPzogc3RyaW5nW10pID0+IHZvaWQsXG4gICAgZmluZFBlcnNpc3RlZEVsZW1lbnQ6ICh0eXBlOiBzdHJpbmcsIGFjdGl2YXRpb246IFBlcnNpc3RlZEFjdGl2YXRpb24pID0+IFByb21pc2U8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gfCBudWxsPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGVuZGluZzogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFt0eXBlLCBhY3RpdmF0aW9uc10gb2YgT2JqZWN0LmVudHJpZXMoc3RhdGUuYWN0aXZhdGlvbnMpKSB7XG4gICAgICBmb3IgKGNvbnN0IGFjdGl2YXRpb24gb2YgYWN0aXZhdGlvbnMgPz8gW10pIHtcbiAgICAgICAgcGVuZGluZy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZm91bmQgPSBhd2FpdCBmaW5kUGVyc2lzdGVkRWxlbWVudCh0eXBlLCBhY3RpdmF0aW9uKTtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIGFkZEVsZW1lbnQoZm91bmQsIFtzdGF0ZS5zZXNzaW9uSWRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwZW5kaW5nKTtcbiAgfVxuXG4gIGFzeW5jIGRlYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVBQ1RJVkFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0VsZW1lbnRDUlVESGFuZGxlci5kZWFjdGl2YXRlRWxlbWVudCcsXG4gICAgICAgIGRldGFpbHM6IGBFbGVtZW50IGRlYWN0aXZhdGlvbiByZXF1ZXN0ZWQ6ICR7dHlwZX0vJHtuYW1lfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGVsZW1lbnRUeXBlOiB0eXBlLCBlbGVtZW50TmFtZTogbmFtZSB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWdpZXMuZ2V0KG5vcm1hbGl6ZWRUeXBlKTtcblxuICAgICAgaWYgKCFzdHJhdGVneSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmF0ZWd5LmRlYWN0aXZhdGUobmFtZSk7XG5cbiAgICAgIC8vIElzc3VlICM1OTg6IFBlcnNpc3QgZGVhY3RpdmF0aW9uIHN0YXRlIGZvciBzZXNzaW9uIHJlc3RvcmVcbiAgICAgIGlmICh0aGlzLmFjdGl2YXRpb25TdG9yZSkge1xuICAgICAgICB0aGlzLmFjdGl2YXRpb25TdG9yZS5yZWNvcmREZWFjdGl2YXRpb24obm9ybWFsaXplZFR5cGUsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNzYyOiBFeHBvcnQgcG9saWNpZXMgdG8gYnJpZGdlIGFmdGVyIGRlYWN0aXZhdGlvblxuICAgICAgdGhpcy5wb2xpY3lFeHBvcnRTZXJ2aWNlPy5leHBvcnRQb2xpY2llcygpLmNhdGNoKCgpID0+IHt9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUmUtdGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgdG8gcHJvcGFnYXRlIHRvIE1DUC1BUUwgbGF5ZXJcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBvcGVyYXRpb25zIHJldHVybiBzdWNjZXNzPWZhbHNlIGluc3RlYWQgb2Ygc3VjY2Vzcz10cnVlIHdpdGggZXJyb3IgdGV4dFxuICAgICAgLy8gSXNzdWUgIzI3NTogSGFuZGxlcnMgcmV0dXJuIHN1Y2Nlc3M9dHJ1ZSBmb3IgbWlzc2luZyBlbGVtZW50c1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIEFsc28gcmUtdGhyb3cgdmFsaWRhdGlvbiBlcnJvcnMgKGUuZy4sIG1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVycylcbiAgICAgIC8vIHNvIHRoZXkgcmVzdWx0IGluIHN1Y2Nlc3M9ZmFsc2UgaW5zdGVhZCBvZiBzdWNjZXNzPXRydWUgd2l0aCBlcnJvciBjb250ZW50XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdwYXJhbWV0ZXIgaXMgcmVxdWlyZWQnKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGVhY3RpdmF0ZSBlbGVtZW50OmAsIHsgdHlwZSwgbmFtZSwgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGRlYWN0aXZhdGUgJHt0eXBlfSAnJHtuYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzcwODogR2V0IHRoZSBlbGVtZW50IG1hbmFnZXIgZm9yIGEgbm9ybWFsaXplZCB0eXBlLlxuICAgKiBVc2VkIHRvIGNoZWNrIGludmFsaWQgZWxlbWVudCByZWNvcmRzIHdoZW4gYW4gZWxlbWVudCBpcyBcIm5vdCBmb3VuZFwiLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRNYW5hZ2VyRm9yVHlwZShub3JtYWxpemVkVHlwZTogc3RyaW5nKTogQmFzZUVsZW1lbnRNYW5hZ2VyPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTogcmV0dXJuIHRoaXMucGVyc29uYU1hbmFnZXIgYXMgdW5rbm93biBhcyBCYXNlRWxlbWVudE1hbmFnZXI8YW55PjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6IHJldHVybiB0aGlzLnNraWxsTWFuYWdlcjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHJldHVybiB0aGlzLnRlbXBsYXRlTWFuYWdlcjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6IHJldHVybiB0aGlzLmFnZW50TWFuYWdlcjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuTUVNT1JZOiByZXR1cm4gdGhpcy5tZW1vcnlNYW5hZ2VyO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5FTlNFTUJMRTogcmV0dXJuIHRoaXMuZW5zZW1ibGVNYW5hZ2VyO1xuICAgICAgZGVmYXVsdDogcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRFbGVtZW50RGV0YWlscyhuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBjb25zdCBzdHJhdGVneSA9IHRoaXMuc3RyYXRlZ2llcy5nZXQobm9ybWFsaXplZFR5cGUpO1xuXG4gICAgICBpZiAoIXN0cmF0ZWd5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHN0cmF0ZWd5LmdldEVsZW1lbnREZXRhaWxzKG5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJc3N1ZSAjNzA4OiBXaGVuIGVsZW1lbnQgaXMgXCJub3QgZm91bmRcIiwgY2hlY2sgaWYgaXQgYWN0dWFsbHkgZXhpc3RzXG4gICAgICAvLyBvbiBkaXNrIGJ1dCBmYWlsZWQgdmFsaWRhdGlvbi4gUmV0dXJuIGEgZGlzdGluY3QgZXJyb3IgaW4gdGhhdCBjYXNlLlxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRNYW5hZ2VyRm9yVHlwZShub3JtYWxpemVkVHlwZSk7XG4gICAgICAgIGlmIChtYW5hZ2VyICYmIHR5cGVvZiBtYW5hZ2VyLmdldEludmFsaWRFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgaW52YWxpZFJlY29yZCA9IG1hbmFnZXIuZ2V0SW52YWxpZEVsZW1lbnQobmFtZSk7XG4gICAgICAgICAgaWYgKGludmFsaWRSZWNvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRWYWxpZGF0aW9uRmFpbGVkRXJyb3IoXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWRUeXBlIGFzIEVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBpbnZhbGlkUmVjb3JkLnJlYXNvbixcbiAgICAgICAgICAgICAgaW52YWxpZFJlY29yZC5maWxlUGF0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGdldCBlbGVtZW50IGRldGFpbHM6YCwgeyB0eXBlLCBuYW1lLCBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0ICR7dHlwZX0gZGV0YWlscyBmb3IgJyR7bmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9hZCBlbGVtZW50cyBvZiBhIHNwZWNpZmljIHR5cGUgZnJvbSB0aGUgZmlsZXN5c3RlbVxuICAgKiBFeHRyYWN0ZWQgZnJvbSBpbmRleC50czo2MDktNjc5IChleGFjdCBjb3B5LCBhZGFwdGVkIGZvciBoYW5kbGVyIHBhdHRlcm4pXG4gICAqL1xuICBhc3luYyByZWxvYWRFbGVtZW50cyh0eXBlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gTm9ybWFsaXplIHRoZSB0eXBlIHRvIGhhbmRsZSBib3RoIHBsdXJhbCBhbmQgc2luZ3VsYXIgZm9ybXNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcblxuICAgICAgc3dpdGNoIChub3JtYWxpemVkVHlwZSkge1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uYU1hbmFnZXIucmVsb2FkUGVyc29uYXMoKTtcblxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgdGhpcy5za2lsbE1hbmFnZXIuY2xlYXJDYWNoZSgpO1xuICAgICAgICAgIGNvbnN0IHNraWxscyA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7c2tpbGxzLmxlbmd0aH0gc2tpbGxzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURToge1xuICAgICAgICAgIC8vIFRlbXBsYXRlIG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IHRoaXMudGVtcGxhdGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7dGVtcGxhdGVzLmxlbmd0aH0gdGVtcGxhdGVzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDoge1xuICAgICAgICAgIC8vIEFnZW50IG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7YWdlbnRzLmxlbmd0aH0gYWdlbnRzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5NRU1PUlk6IHtcbiAgICAgICAgICAvLyBNZW1vcnkgbWFuYWdlciBkb2Vzbid0IGhhdmUgY2xlYXJDYWNoZSwganVzdCBsaXN0XG4gICAgICAgICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLm1lbW9yeU1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCflIQgUmVsb2FkZWQgJHttZW1vcmllcy5sZW5ndGh9IG1lbW9yaWVzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5FTlNFTUJMRToge1xuICAgICAgICAgIC8vIEVuc2VtYmxlIG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IGVuc2VtYmxlcyA9IGF3YWl0IHRoaXMuZW5zZW1ibGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7ZW5zZW1ibGVzLmxlbmd0aH0gZW5zZW1ibGVzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byByZWxvYWQgJHt0eXBlfTpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIHJlbG9hZCAke3R5cGV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIHRlbXBsYXRlIHdpdGggdmFyaWFibGVzXG4gICAqIEV4dHJhY3RlZCBmcm9tIGluZGV4LnRzOjY4Mi03MDEgKGV4YWN0IGNvcHkpXG4gICAqXG4gICAqIEB0aHJvd3Mge0VsZW1lbnROb3RGb3VuZEVycm9yfSBXaGVuIHRlbXBsYXRlIGRvZXMgbm90IGV4aXN0XG4gICAqIEBzZWUgSXNzdWUgIzI3NSAtIEhhbmRsZXJzIHJldHVybiBzdWNjZXNzPXRydWUgZm9yIG1pc3NpbmcgZWxlbWVudHNcbiAgICovXG4gIGFzeW5jIHJlbmRlclRlbXBsYXRlKG5hbWU6IHN0cmluZywgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgLy8gVXNlIHRoZSBuZXcgVGVtcGxhdGVSZW5kZXJlciB1dGlsaXR5IGZvciBjbGVhbmVyIGNvZGUgYW5kIGJldHRlciB2YWxpZGF0aW9uXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50ZW1wbGF0ZVJlbmRlcmVyLnJlbmRlcihuYW1lLCB2YXJpYWJsZXMpO1xuXG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5jb250ZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDwn5OEIFJlbmRlcmVkIHRlbXBsYXRlICcke25hbWV9JzpcXG5cXG4ke3Jlc3VsdC5jb250ZW50fWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElzc3VlICMyNzU6IFRocm93IGVycm9yIGZvciBtaXNzaW5nIHRlbXBsYXRlcyBpbnN0ZWFkIG9mIHJldHVybmluZyBjb250ZW50XG4gICAgICBpZiAocmVzdWx0LmVycm9yPy5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdUZW1wbGF0ZScsIG5hbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MICR7cmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gcmVuZGVyIHRlbXBsYXRlJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIGFnZW50IHdpdGggZ29hbCBwYXJhbWV0ZXJzXG4gICAqIFJldHVybnMgY29udGV4dCBmb3IgTExNIHRvIGRyaXZlIHRoZSBhZ2VudGljIGxvb3BcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudChuYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuZXhlY3V0ZUFnZW50KG5hbWUsIHBhcmFtZXRlcnMpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgYWdlbnQgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZXhlY3V0ZSBhZ2VudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSBzdGVwIGluIGFnZW50IGV4ZWN1dGlvblxuICAgKi9cbiAgYXN5bmMgcmVjb3JkQWdlbnRTdGVwKGFyZ3M6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBzdGVwRGVzY3JpcHRpb246IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgZmluZGluZ3M/OiBzdHJpbmc7XG4gICAgY29uZmlkZW5jZT86IG51bWJlcjtcbiAgICBuZXh0QWN0aW9uSGludD86IHN0cmluZztcbiAgICByaXNrU2NvcmU/OiBudW1iZXI7XG4gIH0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIucmVjb3JkQWdlbnRTdGVwKGFyZ3MpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlY29yZCBhZ2VudCBzdGVwIGZvciAnJHthcmdzLmFnZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gcmVjb3JkIHN0ZXA6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcGxldGUgYW4gYWdlbnQgZ29hbFxuICAgKi9cbiAgYXN5bmMgY29tcGxldGVBZ2VudEdvYWwoYXJnczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGdvYWxJZD86IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgc3VtbWFyeTogc3RyaW5nO1xuICB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmNvbXBsZXRlQWdlbnRHb2FsKGFyZ3MpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNvbXBsZXRlIGFnZW50IGdvYWwgZm9yICcke2FyZ3MuYWdlbnROYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBjb21wbGV0ZSBnb2FsOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhZ2VudCBzdGF0ZVxuICAgKi9cbiAgYXN5bmMgZ2V0QWdlbnRTdGF0ZShhcmdzOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgaW5jbHVkZURlY2lzaW9uSGlzdG9yeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZUNvbnRleHQ/OiBib29sZWFuO1xuICB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmdldEFnZW50U3RhdGUoYXJncyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gUmUtdGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVsZW1lbnROb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0IGFnZW50IHN0YXRlIGZvciAnJHthcmdzLmFnZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0IHN0YXRlOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRpbnVlIGFnZW50IGV4ZWN1dGlvbiBmcm9tIHByZXZpb3VzIHN0YXRlXG4gICAqL1xuICBhc3luYyBjb250aW51ZUFnZW50RXhlY3V0aW9uKGFyZ3M6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBwcmV2aW91c1N0ZXBSZXN1bHQ/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuY29udGludWVBZ2VudEV4ZWN1dGlvbihhcmdzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBSZS10aHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjb250aW51ZSBhZ2VudCBleGVjdXRpb24gZm9yICcke2FyZ3MuYWdlbnROYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBjb250aW51ZSBleGVjdXRpb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWdncmVnYXRlIGFjdGl2ZSBlbGVtZW50cyBhY3Jvc3MgYWxsIHJlZ2lzdGVyZWQgZWxlbWVudCB0eXBlcy5cbiAgICogSXNzdWUgIzUwMTogQ2FsbGVkIHdoZW4gZ2V0X2FjdGl2ZV9lbGVtZW50cyBpcyBpbnZva2VkIHdpdGhvdXQgZWxlbWVudF90eXBlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhZ2dyZWdhdGVBY3RpdmVFbGVtZW50cygpOiBQcm9taXNlPE1DUFJlc3BvbnNlPiB7XG4gICAgY29uc3Qgc2VjdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtlbGVtZW50VHlwZSwgc3RyYXRlZ3ldIG9mIHRoaXMuc3RyYXRlZ2llcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RyYXRlZ3kuZ2V0QWN0aXZlRWxlbWVudHMoKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHJlc3VsdC5jb250ZW50WzBdPy50ZXh0O1xuICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgIHNlY3Rpb25zLnB1c2goYFske2VsZW1lbnRUeXBlfV1cXG4ke3RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEZhaWxlZCB0byBnZXQgYWN0aXZlICR7ZWxlbWVudFR5cGV9IGVsZW1lbnRzYCwgeyBlcnJvcjogZXJyIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgdGV4dDogc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgID8gc2VjdGlvbnMuam9pbignXFxuXFxuJylcbiAgICAgICAgICA6ICdObyBhY3RpdmUgZWxlbWVudHMgZm91bmQuJ1xuICAgICAgfV1cbiAgICB9O1xuICB9XG5cbn1cbiJdfQ==
1002
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudENSVURIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZXJzL0VsZW1lbnRDUlVESGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFvQixNQUFNLGtDQUFrQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFPN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxhQUFhLElBQUksb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RixPQUFPLEVBQUUsYUFBYSxJQUFJLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEYsT0FBTyxFQUFFLFdBQVcsSUFBSSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxjQUFjLElBQUkscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsWUFBWSxJQUFJLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixJQUFJLHNCQUFzQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUcsT0FBTyxFQUFFLGVBQWUsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBSzlGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUd4RSxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2Qix1QkFBdUIsRUFDdkIs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QUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO2dCQUNyQyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNULFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDN0MsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLFdBQVcsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDL0UsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUM7b0JBQ1IsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3dCQUN2QixDQUFDLENBQUMsMkJBQTJCO2lCQUNoQyxDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRWxlbWVudENSVURIYW5kbGVyIC0gSGFuZGxlcyBhbGwgZ2VuZXJpYyBlbGVtZW50IENSVUQgb3BlcmF0aW9uc1xuICpcbiAqIFByb3ZpZGVzIGNyZWF0ZSwgZWRpdCwgdmFsaWRhdGUsIGFuZCBkZWxldGUgb3BlcmF0aW9ucyBmb3IgYWxsIGVsZW1lbnQgdHlwZXNcbiAqIChwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFnZW50cywgbWVtb3JpZXMpLlxuICpcbiAqIFVzZXMgZGVwZW5kZW5jeSBpbmplY3Rpb24gZm9yIGFsbCBzZXJ2aWNlczpcbiAqIC0gSW5pdGlhbGl6YXRpb25TZXJ2aWNlIGZvciBzZXR1cCB0YXNrc1xuICogLSBQZXJzb25hSW5kaWNhdG9yU2VydmljZSBmb3IgcGVyc29uYSBpbmRpY2F0b3IgZm9ybWF0dGluZ1xuICogLSBFbGVtZW50IG1hbmFnZXJzIChTa2lsbE1hbmFnZXIsIFRlbXBsYXRlTWFuYWdlciwgQWdlbnRNYW5hZ2VyLCBNZW1vcnlNYW5hZ2VyKVxuICogLSBQZXJzb25hTWFuYWdlciBmb3IgcGVyc29uYSBvcGVyYXRpb25zXG4gKiAtIFBvcnRmb2xpb01hbmFnZXIgZm9yIHBvcnRmb2xpbyBvcGVyYXRpb25zXG4gKlxuICogRklYOiBETUNQLVNFQy0wMDYgLSBTZWN1cml0eSBhdWRpdCBzdXBwcmVzc2lvblxuICogVGhpcyBoYW5kbGVyIGRlbGVnYXRlcyBhbGwgb3BlcmF0aW9ucyB0byBzcGVjaWFsaXplZCBlbGVtZW50IG1hbmFnZXJzLlxuICogQXVkaXQgbG9nZ2luZyBoYXBwZW5zIGluIHRoZSBlbGVtZW50IG1hbmFnZXJzIHRoZW1zZWx2ZXMuXG4gKiBAc2VjdXJpdHktYXVkaXQtc3VwcHJlc3MgRE1DUC1TRUMtMDA2XG4gKi9cblxuaW1wb3J0IHsgRWxlbWVudFR5cGUsIFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgU2tpbGxNYW5hZ2VyIH0gZnJvbSAnLi4vZWxlbWVudHMvc2tpbGxzL2luZGV4LmpzJztcbmltcG9ydCB7IFRlbXBsYXRlTWFuYWdlciB9IGZyb20gJy4uL2VsZW1lbnRzL3RlbXBsYXRlcy9UZW1wbGF0ZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgVGVtcGxhdGVSZW5kZXJlciB9IGZyb20gJy4uL3V0aWxzL1RlbXBsYXRlUmVuZGVyZXIuanMnO1xuaW1wb3J0IHsgQWdlbnRNYW5hZ2VyIH0gZnJvbSAnLi4vZWxlbWVudHMvYWdlbnRzL0FnZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBNZW1vcnlNYW5hZ2VyIH0gZnJvbSAnLi4vZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBFbnNlbWJsZU1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy9lbnNlbWJsZXMvRW5zZW1ibGVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50Tm90Rm91bmRFcnJvciB9IGZyb20gJy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50IGFzIGNyZWF0ZUVsZW1lbnRDb21tYW5kIH0gZnJvbSAnLi9lbGVtZW50LWNydWQvY3JlYXRlRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBkZWxldGVFbGVtZW50IGFzIGRlbGV0ZUVsZW1lbnRDb21tYW5kIH0gZnJvbSAnLi9lbGVtZW50LWNydWQvZGVsZXRlRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBlZGl0RWxlbWVudCBhcyBlZGl0RWxlbWVudENvbW1hbmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC9lZGl0RWxlbWVudC5qcyc7XG5pbXBvcnQgeyB1cGdyYWRlRWxlbWVudCBhcyB1cGdyYWRlRWxlbWVudENvbW1hbmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC91cGdyYWRlRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBsaXN0RWxlbWVudHMgYXMgbGlzdEVsZW1lbnRzQ29tbWFuZCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL2xpc3RFbGVtZW50cy5qcyc7XG5pbXBvcnQgeyBmaW5kRWxlbWVudEZsZXhpYmx5LCBzYW5pdGl6ZU1ldGFkYXRhIGFzIHNhbml0aXplTWV0YWRhdGFSZWNvcmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC9oZWxwZXJzLmpzJztcbmltcG9ydCB7IHZhbGlkYXRlRWxlbWVudCBhcyB2YWxpZGF0ZUVsZW1lbnRDb21tYW5kIH0gZnJvbSAnLi9lbGVtZW50LWNydWQvdmFsaWRhdGVFbGVtZW50LmpzJztcbmltcG9ydCB7IEVsZW1lbnRDcnVkQ29udGV4dCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL3R5cGVzLmpzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0luaXRpYWxpemF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBQZXJzb25hSW5kaWNhdG9yU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL1BlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFBlcnNvbmFNYW5hZ2VyIH0gZnJvbSAnLi4vcGVyc29uYS9QZXJzb25hTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgRUxFTUVOVF9UWVBFX01BUCB9IGZyb20gJy4uL3V0aWxzL2VsZW1lbnRUeXBlTm9ybWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50QWN0aXZhdGlvblN0cmF0ZWd5LCBNQ1BSZXNwb25zZSB9IGZyb20gJy4vc3RyYXRlZ2llcy9pbmRleC5qcyc7XG5pbXBvcnQge1xuICBUZW1wbGF0ZUFjdGl2YXRpb25TdHJhdGVneSxcbiAgU2tpbGxBY3RpdmF0aW9uU3RyYXRlZ3ksXG4gIEFnZW50QWN0aXZhdGlvblN0cmF0ZWd5LFxuICBNZW1vcnlBY3RpdmF0aW9uU3RyYXRlZ3ksXG4gIFBlcnNvbmFBY3RpdmF0aW9uU3RyYXRlZ3ksXG4gIEVuc2VtYmxlQWN0aXZhdGlvblN0cmF0ZWd5XG59IGZyb20gJy4vc3RyYXRlZ2llcy9pbmRleC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50UXVlcnlTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcXVlcnkvRWxlbWVudFF1ZXJ5U2VydmljZS5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZWdpc3RyeS5qcyc7XG5pbXBvcnQgdHlwZSB7IEFjdGl2YXRpb25TdG9yZSwgUGVyc2lzdGVkQWN0aXZhdGlvbiwgUGVyc2lzdGVkQWN0aXZhdGlvblN0YXRlU25hcHNob3QgfSBmcm9tICcuLi9zZXJ2aWNlcy9BY3RpdmF0aW9uU3RvcmUuanMnO1xuaW1wb3J0IHR5cGUgeyBCYWNrdXBTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvQmFja3VwU2VydmljZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFBvbGljeUV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9Qb2xpY3lFeHBvcnRTZXJ2aWNlLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZUVsZW1lbnRNYW5hZ2VyIH0gZnJvbSAnLi4vZWxlbWVudHMvYmFzZS9CYXNlRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZm9ybWF0VmFsaWRhdGlvbkZhaWxlZEVycm9yIH0gZnJvbSAnLi9lbGVtZW50LWNydWQvcmVzcG9uc2VGb3JtYXR0ZXIuanMnO1xuaW1wb3J0IHtcbiAgZmluZENvbmZpcm1BZHZpc29yeUVsZW1lbnRzLFxuICBmaW5kQ29uZmlybURlbnlpbmdFbGVtZW50LFxuICBnZXRHYXRla2VlcGVyRGlhZ25vc3RpY3MsXG59IGZyb20gJy4vbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgRWxlbWVudENSVURIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdHJhdGVnaWVzOiBNYXA8c3RyaW5nLCBFbGVtZW50QWN0aXZhdGlvblN0cmF0ZWd5PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNraWxsTWFuYWdlcjogU2tpbGxNYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVNYW5hZ2VyOiBUZW1wbGF0ZU1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZVJlbmRlcmVyOiBUZW1wbGF0ZVJlbmRlcmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWdlbnRNYW5hZ2VyOiBBZ2VudE1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBtZW1vcnlNYW5hZ2VyOiBNZW1vcnlNYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZW5zZW1ibGVNYW5hZ2VyOiBFbnNlbWJsZU1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwZXJzb25hTWFuYWdlcjogUGVyc29uYU1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5pdFNlcnZpY2U6IEluaXRpYWxpemF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvclNlcnZpY2U6IFBlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmlsZU9wZXJhdGlvbnM6IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UXVlcnlTZXJ2aWNlOiBFbGVtZW50UXVlcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdGlvblJlZ2lzdHJ5OiBWYWxpZGF0aW9uUmVnaXN0cnksXG4gICAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmF0aW9uU3RvcmU/OiBBY3RpdmF0aW9uU3RvcmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBiYWNrdXBTZXJ2aWNlPzogQmFja3VwU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvbGljeUV4cG9ydFNlcnZpY2U/OiBQb2xpY3lFeHBvcnRTZXJ2aWNlXG4gICkge1xuICAgIC8vIEluaXRpYWxpemUgc3RyYXRlZ3kgbWFwIHdpdGggYWxsIGVsZW1lbnQgdHlwZSBzdHJhdGVnaWVzXG4gICAgdGhpcy5zdHJhdGVnaWVzID0gbmV3IE1hcDxzdHJpbmcsIEVsZW1lbnRBY3RpdmF0aW9uU3RyYXRlZ3k+KFtcbiAgICAgIFtFbGVtZW50VHlwZS5QRVJTT05BLCBuZXcgUGVyc29uYUFjdGl2YXRpb25TdHJhdGVneShwZXJzb25hTWFuYWdlciwgaW5kaWNhdG9yU2VydmljZSldLFxuICAgICAgW0VsZW1lbnRUeXBlLlNLSUxMLCBuZXcgU2tpbGxBY3RpdmF0aW9uU3RyYXRlZ3koc2tpbGxNYW5hZ2VyKV0sXG4gICAgICBbRWxlbWVudFR5cGUuVEVNUExBVEUsIG5ldyBUZW1wbGF0ZUFjdGl2YXRpb25TdHJhdGVneSh0ZW1wbGF0ZU1hbmFnZXIpXSxcbiAgICAgIFtFbGVtZW50VHlwZS5BR0VOVCwgbmV3IEFnZW50QWN0aXZhdGlvblN0cmF0ZWd5KGFnZW50TWFuYWdlcildLFxuICAgICAgW0VsZW1lbnRUeXBlLk1FTU9SWSwgbmV3IE1lbW9yeUFjdGl2YXRpb25TdHJhdGVneShtZW1vcnlNYW5hZ2VyKV0sXG4gICAgICBbRWxlbWVudFR5cGUuRU5TRU1CTEUsIG5ldyBFbnNlbWJsZUFjdGl2YXRpb25TdHJhdGVneShcbiAgICAgICAgZW5zZW1ibGVNYW5hZ2VyLFxuICAgICAgICBwb3J0Zm9saW9NYW5hZ2VyLFxuICAgICAgICBza2lsbE1hbmFnZXIsXG4gICAgICAgIHRlbXBsYXRlTWFuYWdlcixcbiAgICAgICAgYWdlbnRNYW5hZ2VyLFxuICAgICAgICBtZW1vcnlNYW5hZ2VyLFxuICAgICAgICBwZXJzb25hTWFuYWdlclxuICAgICAgKV1cbiAgICBdKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlSW5pdGlhbGl6ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5pbml0U2VydmljZS5lbnN1cmVJbml0aWFsaXplZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJzb25hSW5kaWNhdG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5kaWNhdG9yU2VydmljZS5nZXRQZXJzb25hSW5kaWNhdG9yKCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRleHQoKTogRWxlbWVudENydWRDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZW5zdXJlSW5pdGlhbGl6ZWQ6ICgpID0+IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKSxcbiAgICAgIGdldFBlcnNvbmFJbmRpY2F0b3I6ICgpID0+IHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpLFxuICAgICAgc2tpbGxNYW5hZ2VyOiB0aGlzLnNraWxsTWFuYWdlcixcbiAgICAgIHRlbXBsYXRlTWFuYWdlcjogdGhpcy50ZW1wbGF0ZU1hbmFnZXIsXG4gICAgICB0ZW1wbGF0ZVJlbmRlcmVyOiB0aGlzLnRlbXBsYXRlUmVuZGVyZXIsXG4gICAgICBhZ2VudE1hbmFnZXI6IHRoaXMuYWdlbnRNYW5hZ2VyLFxuICAgICAgbWVtb3J5TWFuYWdlcjogdGhpcy5tZW1vcnlNYW5hZ2VyLFxuICAgICAgZW5zZW1ibGVNYW5hZ2VyOiB0aGlzLmVuc2VtYmxlTWFuYWdlcixcbiAgICAgIHBvcnRmb2xpb01hbmFnZXI6IHRoaXMucG9ydGZvbGlvTWFuYWdlcixcbiAgICAgIHBlcnNvbmFNYW5hZ2VyOiB0aGlzLnBlcnNvbmFNYW5hZ2VyLFxuICAgICAgZmlsZU9wZXJhdGlvbnM6IHRoaXMuZmlsZU9wZXJhdGlvbnMsXG4gICAgICBlbGVtZW50UXVlcnlTZXJ2aWNlOiB0aGlzLmVsZW1lbnRRdWVyeVNlcnZpY2UsXG4gICAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IHRoaXMudmFsaWRhdGlvblJlZ2lzdHJ5LFxuICAgICAgYmFja3VwU2VydmljZTogdGhpcy5iYWNrdXBTZXJ2aWNlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbiBlbGVtZW50IGJ5IG5hbWUsIHN1cHBvcnRpbmcgYm90aCBleGFjdCBkaXNwbGF5IG5hbWUgYW5kIGZpbGVuYW1lIChzbHVnKSBtYXRjaGluZ1xuICAgKiBIZWxwZXIgbWV0aG9kIGV4dHJhY3RlZCBmcm9tIGluZGV4LnRzOjM0Ni0zNzlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZEVsZW1lbnRGbGV4aWJseShuYW1lOiBzdHJpbmcsIGVsZW1lbnRMaXN0OiBhbnlbXSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGZpbmRFbGVtZW50RmxleGlibHkobmFtZSwgZWxlbWVudExpc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbml0aXplIG1ldGFkYXRhIG9iamVjdCB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICogSGVscGVyIG1ldGhvZCBleHRyYWN0ZWQgZnJvbSBpbmRleC50czozOTAtNDEwXG4gICAqL1xuICBwcml2YXRlIHNhbml0aXplTWV0YWRhdGEobWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gc2FuaXRpemVNZXRhZGF0YVJlY29yZChtZXRhZGF0YSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUxvb2t1cFZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgPyB2YWx1ZS5ub3JtYWxpemUoJ05GQycpLnRyaW0oKVxuICAgICAgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgaGFzR2F0ZWtlZXBlclBvbGljeShtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbihtZXRhZGF0YT8uWydnYXRla2VlcGVyJ10gfHwgZ2V0R2F0ZWtlZXBlckRpYWdub3N0aWNzKG1ldGFkYXRhKSk7XG4gIH1cblxuICBwcml2YXRlIHRvUG9saWN5RWxlbWVudFR5cGUodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplTG9va3VwVmFsdWUodHlwZSkudG9Mb3dlckNhc2UoKTtcbiAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICBjYXNlICdwZXJzb25hcyc6XG4gICAgICAgIHJldHVybiAncGVyc29uYSc7XG4gICAgICBjYXNlICdza2lsbHMnOlxuICAgICAgICByZXR1cm4gJ3NraWxsJztcbiAgICAgIGNhc2UgJ2FnZW50cyc6XG4gICAgICAgIHJldHVybiAnYWdlbnQnO1xuICAgICAgY2FzZSAnbWVtb3JpZXMnOlxuICAgICAgICByZXR1cm4gJ21lbW9yeSc7XG4gICAgICBjYXNlICdlbnNlbWJsZXMnOlxuICAgICAgICByZXR1cm4gJ2Vuc2VtYmxlJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkVHlwZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MTQ5Mi0xNjMxICgxNDAgbGluZXMgLSBleGFjdCBjb3B5KVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmc7IGluc3RydWN0aW9ucz86IHN0cmluZzsgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSkge1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50Q29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogRWRpdCBhbiBleGlzdGluZyBlbGVtZW50IHVzaW5nIEdyYXBoUUwtYWxpZ25lZCBuZXN0ZWQgaW5wdXQgb2JqZWN0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgaGFuZGxlci5lZGl0RWxlbWVudCh7XG4gICAqICAgbmFtZTogJ215LXNraWxsJyxcbiAgICogICB0eXBlOiAnc2tpbGxzJyxcbiAgICogICBpbnB1dDoge1xuICAgKiAgICAgZGVzY3JpcHRpb246ICdVcGRhdGVkJyxcbiAgICogICAgIG1ldGFkYXRhOiB7IHRyaWdnZXJzOiBbJ2NvZGUnXSB9XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICovXG4gIGFzeW5jIGVkaXRFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSkge1xuICAgIHJldHVybiBlZGl0RWxlbWVudENvbW1hbmQodGhpcy5nZXRDb250ZXh0KCksIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZ3JhZGUgZWxlbWVudCBmcm9tIHYxIHNpbmdsZS1ib2R5IHRvIHYyIGR1YWwtZmllbGQgZm9ybWF0IChpbnN0cnVjdGlvbnMgKyBjb250ZW50KVxuICAgKi9cbiAgYXN5bmMgdXBncmFkZUVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBkcnlfcnVuPzogYm9vbGVhbjsgaW5zdHJ1Y3Rpb25zX292ZXJyaWRlPzogc3RyaW5nOyBjb250ZW50X292ZXJyaWRlPzogc3RyaW5nfSkge1xuICAgIHJldHVybiB1cGdyYWRlRWxlbWVudENvbW1hbmQodGhpcy5nZXRDb250ZXh0KCksIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MTk0MS0yMDU0ICgxMTQgbGluZXMgLSBleGFjdCBjb3B5KVxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgc3RyaWN0PzogYm9vbGVhbn0pIHtcbiAgICByZXR1cm4gdmFsaWRhdGVFbGVtZW50Q29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MjA1Ni0yMzEwICgyNTUgbGluZXMgLSBleGFjdCBjb3B5LCBzcGxpdCBmb3IgcmVhZGFiaWxpdHkpXG4gICAqL1xuICBhc3luYyBkZWxldGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZGVsZXRlRGF0YT86IGJvb2xlYW59KSB7XG4gICAgcmV0dXJuIGRlbGV0ZUVsZW1lbnRDb21tYW5kKHRoaXMuZ2V0Q29udGV4dCgpLCBhcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogc3RyaW5nIHtcbiAgICAvLyBJc3N1ZSAjNTAxOiBHdWFyZCBhZ2FpbnN0IG51bGwvdW5kZWZpbmVkIHRvIG1hdGNoIHNoYXJlZCB1dGlsaXR5IHBhdHRlcm5cbiAgICBpZiAodHlwZSA9PSBudWxsIHx8IHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJyB8fCB0eXBlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFscmVhZHkgYSB2YWxpZCBFbGVtZW50VHlwZSB2YWx1ZSwgcmV0dXJuIGFzLWlzXG4gICAgaWYgKE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmluY2x1ZGVzKHR5cGUgYXMgRWxlbWVudFR5cGUpKSB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugc2hhcmVkIG5vcm1hbGl6YXRpb24gbWFwIChJc3N1ZSAjNDMzKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBFTEVNRU5UX1RZUEVfTUFQW3R5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCldO1xuICAgIGlmIChub3JtYWxpemVkKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9XG5cbiAgICAvLyBVbmtub3duIHR5cGUgLSByZXR1cm4gYXMtaXMgYW5kIGxldCB2YWxpZGF0aW9uIGhhbmRsZSBpdFxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgYXN5bmMgbGlzdEVsZW1lbnRzKHR5cGU6IHN0cmluZywgb3B0aW9ucz86IGltcG9ydCgnLi4vc2VydmljZXMvcXVlcnkvdHlwZXMuanMnKS5RdWVyeU9wdGlvbnMpIHtcbiAgICByZXR1cm4gbGlzdEVsZW1lbnRzQ29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgdHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJhdyBlbGVtZW50cyBhcnJheSBmb3IgYSBnaXZlbiB0eXBlLlxuICAgKiBVbmxpa2UgbGlzdEVsZW1lbnRzIHdoaWNoIHJldHVybnMgTUNQUmVzcG9uc2UgZm9ybWF0LCB0aGlzIHJldHVybnMgcmF3IGVsZW1lbnQgb2JqZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBFbGVtZW50IHR5cGUgKHBlcnNvbmEsIHNraWxsLCB0ZW1wbGF0ZSwgYWdlbnQsIG1lbW9yeSwgZW5zZW1ibGUpXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHJhdyBlbGVtZW50IG9iamVjdHNcbiAgICovXG4gIGFzeW5jIGdldEVsZW1lbnRzKHR5cGU6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bltdPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcblxuICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uYU1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlTWFuYWdlci5saXN0KCk7XG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOlxuICAgICAgICByZXR1cm4gdGhpcy5hZ2VudE1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5NRU1PUlk6XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeU1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5FTlNFTUJMRTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5zZW1ibGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhY3RpdmF0ZUVsZW1lbnQobmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZJWDogRE1DUC1TRUMtMDA2IC0gQWRkIHNlY3VyaXR5IGF1ZGl0IGxvZ2dpbmcgZm9yIGVsZW1lbnQgYWN0aXZhdGlvblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9BQ1RJVkFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0VsZW1lbnRDUlVESGFuZGxlci5hY3RpdmF0ZUVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgRWxlbWVudCBhY3RpdmF0aW9uIHJlcXVlc3RlZDogJHt0eXBlfS8ke25hbWV9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZWxlbWVudFR5cGU6IHR5cGUsIGVsZW1lbnROYW1lOiBuYW1lLCBjb250ZXh0UHJvdmlkZWQ6ICEhY29udGV4dCB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWdpZXMuZ2V0KG5vcm1hbGl6ZWRUeXBlKTtcblxuICAgICAgaWYgKCFzdHJhdGVneSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmF0ZWd5LmFjdGl2YXRlKG5hbWUsIGNvbnRleHQpO1xuXG4gICAgICAvLyBJc3N1ZSAjNTk4OiBQZXJzaXN0IGFjdGl2YXRpb24gc3RhdGUgZm9yIHNlc3Npb24gcmVzdG9yZVxuICAgICAgaWYgKHRoaXMuYWN0aXZhdGlvblN0b3JlKSB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gbm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLlBFUlNPTkFcbiAgICAgICAgICA/IHRoaXMucGVyc29uYU1hbmFnZXIuZmluZFBlcnNvbmEobmFtZSk/LmZpbGVuYW1lXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYWN0aXZhdGlvblN0b3JlLnJlY29yZEFjdGl2YXRpb24obm9ybWFsaXplZFR5cGUsIG5hbWUsIGZpbGVuYW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzc2MjogRXhwb3J0IHBvbGljaWVzIHRvIGJyaWRnZSBhZnRlciBhY3RpdmF0aW9uXG4gICAgICB0aGlzLnBvbGljeUV4cG9ydFNlcnZpY2U/LmV4cG9ydFBvbGljaWVzKCkuY2F0Y2goKCkgPT4ge30pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBhY3RpdmF0ZSBlbGVtZW50OmAsIHsgdHlwZSwgbmFtZSwgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGFjdGl2YXRlICR7dHlwZX0gJyR7bmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0QWN0aXZlRWxlbWVudHModHlwZT86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBJc3N1ZSAjNTAxOiBXaGVuIHR5cGUgaXMgb21pdHRlZCwgYWdncmVnYXRlIGFjdGl2ZSBlbGVtZW50cyBhY3Jvc3MgYWxsIHR5cGVzXG4gICAgICBpZiAoIXR5cGUgfHwgdHlwZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFnZ3JlZ2F0ZUFjdGl2ZUVsZW1lbnRzKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVnaWVzLmdldChub3JtYWxpemVkVHlwZSk7XG5cbiAgICAgIGlmICghc3RyYXRlZ3kpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgc3RyYXRlZ3kuZ2V0QWN0aXZlRWxlbWVudHMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSBlbGVtZW50czpgLCB7IHR5cGUsIGVycm9yIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBnZXQgYWN0aXZlICR7dHlwZSB8fCAnYWxsJ306ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJhdyBhY3RpdmUgZWxlbWVudHMgZm9yIEdhdGVrZWVwZXIgcG9saWN5IGV2YWx1YXRpb24uXG4gICAqIFJldHVybnMgYWN0aXZlIHBlcnNvbmFzLCBza2lsbHMsIGFuZCBlbnNlbWJsZXMgd2l0aCB0aGVpciBtZXRhZGF0YVxuICAgKiBtYXBwZWQgdG8gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IHRoZSBHYXRla2VlcGVyJ3MgQWN0aXZlRWxlbWVudCBpbnRlcmZhY2UuXG4gICAqXG4gICAqIElzc3VlICM0NTI6IFByb3ZpZGVzIGFjdGl2ZSBlbGVtZW50IGNvbnRleHQgZm9yIGVuZm9yY2UoKSBwb2xpY3kgY2hlY2tzLlxuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlRWxlbWVudHNGb3JQb2xpY3koKTogUHJvbWlzZTxBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4+IHtcbiAgICBjb25zdCByZXN1bHQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PiA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBBY3RpdmUgcGVyc29uYXMgKHN5bmMpXG4gICAgICBjb25zdCBwZXJzb25hcyA9IHRoaXMucGVyc29uYU1hbmFnZXIuZ2V0QWN0aXZlUGVyc29uYXMoKTtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBwZXJzb25hcykge1xuICAgICAgICBjb25zdCBrZXkgPSBgcGVyc29uYToke3AubWV0YWRhdGEubmFtZX1gO1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3BlcnNvbmEnLFxuICAgICAgICAgIG5hbWU6IHAubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBtZXRhZGF0YTogcC5tZXRhZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnYXRoZXIgYWN0aXZlIHBlcnNvbmFzIGZvciBwb2xpY3kgZXZhbHVhdGlvbicsIHsgZXJyb3IgfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEFjdGl2ZSBza2lsbHMgKGFzeW5jKVxuICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIuZ2V0QWN0aXZlU2tpbGxzKCk7XG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc2tpbGxzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGBza2lsbDoke3MubWV0YWRhdGEubmFtZX1gO1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3NraWxsJyxcbiAgICAgICAgICBuYW1lOiBzLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHMubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIGFjdGl2ZSBza2lsbHMgZm9yIHBvbGljeSBldmFsdWF0aW9uJywgeyBlcnJvciB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0aXZlIGFnZW50cyAoYXN5bmMpXG4gICAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5nZXRBY3RpdmVBZ2VudHMoKTtcbiAgICAgIGZvciAoY29uc3QgYWdlbnQgb2YgYWdlbnRzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGBhZ2VudDoke2FnZW50Lm1ldGFkYXRhLm5hbWV9YDtcbiAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdhZ2VudCcsXG4gICAgICAgICAgbmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBtZXRhZGF0YTogYWdlbnQubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIGFjdGl2ZSBhZ2VudHMgZm9yIHBvbGljeSBldmFsdWF0aW9uJywgeyBlcnJvciB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0aXZlIGVuc2VtYmxlcyAoYXN5bmMpXG4gICAgICBjb25zdCBlbnNlbWJsZXMgPSBhd2FpdCB0aGlzLmVuc2VtYmxlTWFuYWdlci5nZXRBY3RpdmVFbnNlbWJsZXMoKTtcbiAgICAgIGZvciAoY29uc3QgZSBvZiBlbnNlbWJsZXMpIHtcbiAgICAgICAgY29uc3QgZW5zZW1ibGVLZXkgPSBgZW5zZW1ibGU6JHtlLm1ldGFkYXRhLm5hbWV9YDtcbiAgICAgICAgc2Vlbi5hZGQoZW5zZW1ibGVLZXkpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2Vuc2VtYmxlJyxcbiAgICAgICAgICBuYW1lOiBlLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgbWV0YWRhdGE6IGUubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSA0OiBSZXNvbHZlIGVuc2VtYmxlIG1lbWJlciBnYXRla2VlcGVyIHBvbGljaWVzXG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSAoZS5tZXRhZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8uZWxlbWVudHMgYXNcbiAgICAgICAgICBBcnJheTx7IGVsZW1lbnRfbmFtZTogc3RyaW5nOyBlbGVtZW50X3R5cGU6IHN0cmluZyB9PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWVtYmVycykpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBtZW1iZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBtZW1iZXJLZXkgPSBgJHttZW1iZXIuZWxlbWVudF90eXBlfToke21lbWJlci5lbGVtZW50X25hbWV9YDtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhtZW1iZXJLZXkpKSBjb250aW51ZTsgLy8gQWxyZWFkeSBhY3RpdmUgaW5kaXZpZHVhbGx5XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBtZW1iZXJFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudHMobWVtYmVyLmVsZW1lbnRfdHlwZSk7XG4gICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gKG1lbWJlckVsZW1lbnRzIGFzIEFycmF5PHsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KS5maW5kKFxuICAgICAgICAgICAgICAgIGVsID0+IChlbD8ubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5uYW1lID09PSBtZW1iZXIuZWxlbWVudF9uYW1lXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChmb3VuZD8ubWV0YWRhdGEgJiYgKGZvdW5kLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8uZ2F0ZWtlZXBlcikge1xuICAgICAgICAgICAgICAgIHNlZW4uYWRkKG1lbWJlcktleSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogbWVtYmVyLmVsZW1lbnRfdHlwZSxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IG1lbWJlci5lbGVtZW50X25hbWUsXG4gICAgICAgICAgICAgICAgICBtZXRhZGF0YTogZm91bmQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAvLyBOb24tZmF0YWw6IHNraXAgbWVtYmVyIGlmIGVsZW1lbnQgdHlwZSBsb29rdXAgZmFpbHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnYXRoZXIgYWN0aXZlIGVuc2VtYmxlcyBmb3IgcG9saWN5IGV2YWx1YXRpb24nLCB7IGVycm9yIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBnZXRQb2xpY3lFbGVtZW50c0ZvclJlcG9ydChzZXNzaW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBzZXNzaW9uSWRzPzogc3RyaW5nW107XG4gIH0+PiB7XG4gICAgY29uc3QgbWVyZ2VkID0gbmV3IE1hcDxzdHJpbmcsIHtcbiAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIHNlc3Npb25JZHM6IFNldDxzdHJpbmc+O1xuICAgIH0+KCk7XG5cbiAgICBjb25zdCBhZGRFbGVtZW50ID0gKFxuICAgICAgZWxlbWVudDogeyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0sXG4gICAgICBzZXNzaW9uSWRzOiBzdHJpbmdbXSA9IFtdLFxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCF0aGlzLmhhc0dhdGVrZWVwZXJQb2xpY3koZWxlbWVudC5tZXRhZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSBgJHtlbGVtZW50LnR5cGV9OiR7ZWxlbWVudC5uYW1lfWA7XG4gICAgICBjb25zdCBleGlzdGluZyA9IG1lcmdlZC5nZXQoa2V5KTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICBzZXNzaW9uSWRzLmZvckVhY2goaWQgPT4gZXhpc3Rpbmcuc2Vzc2lvbklkcy5hZGQoaWQpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBtZXJnZWQuc2V0KGtleSwge1xuICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgbWV0YWRhdGE6IGVsZW1lbnQubWV0YWRhdGEsXG4gICAgICAgIHNlc3Npb25JZHM6IG5ldyBTZXQoc2Vzc2lvbklkcyksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgY3VycmVudFNlc3Npb25JZCA9IHRoaXMuYWN0aXZhdGlvblN0b3JlPy5nZXRTZXNzaW9uSWQoKTtcbiAgICBjb25zdCBpbmNsdWRlQ3VycmVudFNlc3Npb24gPSAhc2Vzc2lvbklkIHx8ICFjdXJyZW50U2Vzc2lvbklkIHx8IGN1cnJlbnRTZXNzaW9uSWQgPT09IHNlc3Npb25JZDtcblxuICAgIGlmIChpbmNsdWRlQ3VycmVudFNlc3Npb24pIHtcbiAgICAgIGZvciAoY29uc3QgYWN0aXZlRWxlbWVudCBvZiBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzRm9yUG9saWN5KCkpIHtcbiAgICAgICAgYWRkRWxlbWVudChhY3RpdmVFbGVtZW50LCBjdXJyZW50U2Vzc2lvbklkID8gW2N1cnJlbnRTZXNzaW9uSWRdIDogW10pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2YXRpb25TdG9yZT8uaXNFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IHBlcnNpc3RlZFN0YXRlcyA9IGF3YWl0IHRoaXMuYWN0aXZhdGlvblN0b3JlLmxpc3RQZXJzaXN0ZWRBY3RpdmF0aW9uU3RhdGVzKHNlc3Npb25JZCk7XG4gICAgICBjb25zdCBjYXRhbG9ncyA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTx7IG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGZpbGVuYW1lPzogc3RyaW5nIH0+PigpO1xuXG4gICAgICBjb25zdCBnZXRDYXRhbG9nID0gYXN5bmMgKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICAgIGlmICghY2F0YWxvZ3MuaGFzKG5vcm1hbGl6ZWRUeXBlKSkge1xuICAgICAgICAgIGNhdGFsb2dzLnNldChcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRUeXBlLFxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuZ2V0RWxlbWVudHMobm9ybWFsaXplZFR5cGUpKSBhcyBBcnJheTx7IG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGZpbGVuYW1lPzogc3RyaW5nIH0+LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhdGFsb2dzLmdldChub3JtYWxpemVkVHlwZSkgPz8gW107XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5kUGVyc2lzdGVkRWxlbWVudCA9IGFzeW5jIChcbiAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICBhY3RpdmF0aW9uOiBQZXJzaXN0ZWRBY3RpdmF0aW9uLFxuICAgICAgKTogUHJvbWlzZTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSB8IG51bGw+ID0+IHtcbiAgICAgICAgY29uc3QgY2F0YWxvZyA9IGF3YWl0IGdldENhdGFsb2codHlwZSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gdGhpcy5ub3JtYWxpemVMb29rdXBWYWx1ZShhY3RpdmF0aW9uLm5hbWUpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkRmlsZW5hbWUgPSB0aGlzLm5vcm1hbGl6ZUxvb2t1cFZhbHVlKGFjdGl2YXRpb24uZmlsZW5hbWUpO1xuXG4gICAgICAgIGNvbnN0IGZvdW5kID0gY2F0YWxvZy5maW5kKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBlbGVtZW50Lm1ldGFkYXRhID8/IHt9O1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gdGhpcy5ub3JtYWxpemVMb29rdXBWYWx1ZShtZXRhZGF0YVsnbmFtZSddKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50RmlsZW5hbWUgPSB0aGlzLm5vcm1hbGl6ZUxvb2t1cFZhbHVlKFxuICAgICAgICAgICAgZWxlbWVudC5maWxlbmFtZSA/PyBtZXRhZGF0YVsnZmlsZW5hbWUnXSA/PyBtZXRhZGF0YVsnc291cmNlRmlsZSddLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gZWxlbWVudE5hbWUgPT09IG5vcm1hbGl6ZWROYW1lIHx8IChub3JtYWxpemVkRmlsZW5hbWUgIT09ICcnICYmIGVsZW1lbnRGaWxlbmFtZSA9PT0gbm9ybWFsaXplZEZpbGVuYW1lKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFmb3VuZD8ubWV0YWRhdGEgfHwgIXRoaXMuaGFzR2F0ZWtlZXBlclBvbGljeShmb3VuZC5tZXRhZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdGhpcy50b1BvbGljeUVsZW1lbnRUeXBlKHR5cGUpLFxuICAgICAgICAgIG5hbWU6IChmb3VuZC5tZXRhZGF0YVsnbmFtZSddIGFzIHN0cmluZykgPz8gYWN0aXZhdGlvbi5uYW1lLFxuICAgICAgICAgIG1ldGFkYXRhOiBmb3VuZC5tZXRhZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3Qgc3RhdGUgb2YgcGVyc2lzdGVkU3RhdGVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubWVyZ2VQZXJzaXN0ZWRQb2xpY3lTdGF0ZShzdGF0ZSwgYWRkRWxlbWVudCwgZmluZFBlcnNpc3RlZEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKG1lcmdlZC52YWx1ZXMoKSkubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIHR5cGU6IGVudHJ5LnR5cGUsXG4gICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgbWV0YWRhdGE6IGVudHJ5Lm1ldGFkYXRhLFxuICAgICAgLi4uKGVudHJ5LnNlc3Npb25JZHMuc2l6ZSA+IDBcbiAgICAgICAgPyB7IHNlc3Npb25JZHM6IEFycmF5LmZyb20oZW50cnkuc2Vzc2lvbklkcykuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSB9XG4gICAgICAgIDoge30pLFxuICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VEZWFkbG9jaygpOiBQcm9taXNlPHtcbiAgICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gICAgYWN0aXZlQmVmb3JlUmVzZXQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgZGVhY3RpdmF0ZWQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgZmFpbGVkOiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+O1xuICAgIHBlcnNpc3RlZFN0YXRlQ2xlYXJlZDogYm9vbGVhbjtcbiAgICBsaWtlbHlEZWFkbG9ja0NhdXNlOiB7XG4gICAgICBzYW5kYm94aW5nRWxlbWVudD86IHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfTtcbiAgICAgIGFkdmlzb3J5RWxlbWVudHM6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgfTtcbiAgICBzbmFwc2hvdEZpbGU/OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50cyA9IGF3YWl0IHRoaXMuY29sbGVjdEFjdGl2ZUVsZW1lbnRzRm9yRGVhZGxvY2tSZWxpZWYoKTtcbiAgICBjb25zdCBhY3RpdmVQb2xpY3lFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlRWxlbWVudHNGb3JQb2xpY3koKTtcbiAgICBjb25zdCBzYW5kYm94aW5nRWxlbWVudCA9IGZpbmRDb25maXJtRGVueWluZ0VsZW1lbnQoYWN0aXZlUG9saWN5RWxlbWVudHMpO1xuICAgIGNvbnN0IGFkdmlzb3J5RWxlbWVudHMgPSBmaW5kQ29uZmlybUFkdmlzb3J5RWxlbWVudHMoYWN0aXZlUG9saWN5RWxlbWVudHMpO1xuICAgIGNvbnN0IGRlYWN0aXZhdGVkOiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+ID0gW107XG4gICAgY29uc3QgZmFpbGVkOiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+ID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYWN0aXZlRWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVnaWVzLmdldChlbGVtZW50LnR5cGUpO1xuICAgICAgaWYgKCFzdHJhdGVneSkge1xuICAgICAgICBmYWlsZWQucHVzaCh7XG4gICAgICAgICAgdHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgICBlcnJvcjogYE5vIGFjdGl2YXRpb24gc3RyYXRlZ3kgcmVnaXN0ZXJlZCBmb3IgdHlwZSAnJHtlbGVtZW50LnR5cGV9J2AsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3RyYXRlZ3kuZGVhY3RpdmF0ZShlbGVtZW50Lm5hbWUpO1xuICAgICAgICBkZWFjdGl2YXRlZC5wdXNoKGVsZW1lbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZmFpbGVkLnB1c2goe1xuICAgICAgICAgIHR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGVyc2lzdGVkU3RhdGVDbGVhcmVkID0gQm9vbGVhbih0aGlzLmFjdGl2YXRpb25TdG9yZT8uaXNFbmFibGVkKCkpO1xuICAgIGNvbnN0IHNuYXBzaG90RmlsZSA9IGF3YWl0IHRoaXMud3JpdGVEZWFkbG9ja1JlbGllZlNuYXBzaG90KHtcbiAgICAgIHNlc3Npb25JZDogdGhpcy5hY3RpdmF0aW9uU3RvcmU/LmdldFNlc3Npb25JZCgpLFxuICAgICAgYWN0aXZlQmVmb3JlUmVzZXQ6IGFjdGl2ZUVsZW1lbnRzLFxuICAgICAgZGVhY3RpdmF0ZWQsXG4gICAgICBmYWlsZWQsXG4gICAgICBsaWtlbHlEZWFkbG9ja0NhdXNlOiB7XG4gICAgICAgIC4uLihzYW5kYm94aW5nRWxlbWVudCA/IHsgc2FuZGJveGluZ0VsZW1lbnQgfSA6IHt9KSxcbiAgICAgICAgYWR2aXNvcnlFbGVtZW50cyxcbiAgICAgIH0sXG4gICAgICBwZXJzaXN0ZWRTdGF0ZUNsZWFyZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmFjdGl2YXRpb25TdG9yZT8uY2xlYXJBbGwoKTtcbiAgICB0aGlzLnBvbGljeUV4cG9ydFNlcnZpY2U/LmV4cG9ydFBvbGljaWVzKCkuY2F0Y2goKCkgPT4ge30pO1xuXG4gICAgY29uc3QgZmFpbHVyZVN1bW1hcnkgPSBmYWlsZWQubGVuZ3RoID4gMCA/IGAgd2l0aCAke2ZhaWxlZC5sZW5ndGh9IGZhaWx1cmUocylgIDogJyc7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9ERUFDVElWQVRFRCcsXG4gICAgICBzZXZlcml0eTogZmFpbGVkLmxlbmd0aCA+IDAgPyAnTUVESVVNJyA6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRWxlbWVudENSVURIYW5kbGVyLnJlbGVhc2VEZWFkbG9jaycsXG4gICAgICBkZXRhaWxzOiBgRGVhZGxvY2sgcmVsaWVmIGRlYWN0aXZhdGVkICR7ZGVhY3RpdmF0ZWQubGVuZ3RofSBlbGVtZW50KHMpJHtmYWlsdXJlU3VtbWFyeX1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgc2Vzc2lvbklkOiB0aGlzLmFjdGl2YXRpb25TdG9yZT8uZ2V0U2Vzc2lvbklkKCksXG4gICAgICAgIGFjdGl2ZUJlZm9yZVJlc2V0OiBhY3RpdmVFbGVtZW50cyxcbiAgICAgICAgZGVhY3RpdmF0ZWQsXG4gICAgICAgIGZhaWxlZCxcbiAgICAgICAgcGVyc2lzdGVkU3RhdGVDbGVhcmVkLFxuICAgICAgICBsaWtlbHlEZWFkbG9ja0NhdXNlOiB7XG4gICAgICAgICAgLi4uKHNhbmRib3hpbmdFbGVtZW50ID8geyBzYW5kYm94aW5nRWxlbWVudCB9IDoge30pLFxuICAgICAgICAgIGFkdmlzb3J5RWxlbWVudHMsXG4gICAgICAgIH0sXG4gICAgICAgIHNuYXBzaG90RmlsZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uKHRoaXMuYWN0aXZhdGlvblN0b3JlPy5nZXRTZXNzaW9uSWQoKVxuICAgICAgICA/IHsgc2Vzc2lvbklkOiB0aGlzLmFjdGl2YXRpb25TdG9yZS5nZXRTZXNzaW9uSWQoKSB9XG4gICAgICAgIDoge30pLFxuICAgICAgYWN0aXZlQmVmb3JlUmVzZXQ6IGFjdGl2ZUVsZW1lbnRzLFxuICAgICAgZGVhY3RpdmF0ZWQsXG4gICAgICBmYWlsZWQsXG4gICAgICBwZXJzaXN0ZWRTdGF0ZUNsZWFyZWQsXG4gICAgICBsaWtlbHlEZWFkbG9ja0NhdXNlOiB7XG4gICAgICAgIC4uLihzYW5kYm94aW5nRWxlbWVudCA/IHsgc2FuZGJveGluZ0VsZW1lbnQgfSA6IHt9KSxcbiAgICAgICAgYWR2aXNvcnlFbGVtZW50cyxcbiAgICAgIH0sXG4gICAgICAuLi4oc25hcHNob3RGaWxlID8geyBzbmFwc2hvdEZpbGUgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb2xsZWN0QWN0aXZlRWxlbWVudHNGb3JEZWFkbG9ja1JlbGllZigpOiBQcm9taXNlPEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT4+IHtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50czogQXJyYXk8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PiA9IFtdO1xuXG4gICAgY29uc3QgYWN0aXZlUGVyc29uYXMgPSB0aGlzLnBlcnNvbmFNYW5hZ2VyLmdldEFjdGl2ZVBlcnNvbmFzKCk7XG4gICAgYWN0aXZlRWxlbWVudHMucHVzaCguLi5hY3RpdmVQZXJzb25hcy5tYXAoKHBlcnNvbmEpID0+ICh7XG4gICAgICB0eXBlOiBFbGVtZW50VHlwZS5QRVJTT05BLFxuICAgICAgbmFtZTogcGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgIH0pKSk7XG5cbiAgICBjb25zdCBhY3RpdmVTa2lsbHMgPSBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5nZXRBY3RpdmVTa2lsbHMoKTtcbiAgICBhY3RpdmVFbGVtZW50cy5wdXNoKC4uLmFjdGl2ZVNraWxscy5tYXAoKHNraWxsKSA9PiAoe1xuICAgICAgdHlwZTogRWxlbWVudFR5cGUuU0tJTEwsXG4gICAgICBuYW1lOiBza2lsbC5tZXRhZGF0YS5uYW1lLFxuICAgIH0pKSk7XG5cbiAgICBjb25zdCBhY3RpdmVBZ2VudHMgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5nZXRBY3RpdmVBZ2VudHMoKTtcbiAgICBhY3RpdmVFbGVtZW50cy5wdXNoKC4uLmFjdGl2ZUFnZW50cy5tYXAoKGFnZW50KSA9PiAoe1xuICAgICAgdHlwZTogRWxlbWVudFR5cGUuQUdFTlQsXG4gICAgICBuYW1lOiBhZ2VudC5tZXRhZGF0YS5uYW1lLFxuICAgIH0pKSk7XG5cbiAgICBjb25zdCBhY3RpdmVNZW1vcmllcyA9IGF3YWl0IHRoaXMubWVtb3J5TWFuYWdlci5nZXRBY3RpdmVNZW1vcmllcygpO1xuICAgIGFjdGl2ZUVsZW1lbnRzLnB1c2goLi4uYWN0aXZlTWVtb3JpZXMubWFwKChtZW1vcnkpID0+ICh7XG4gICAgICB0eXBlOiBFbGVtZW50VHlwZS5NRU1PUlksXG4gICAgICBuYW1lOiBtZW1vcnkubWV0YWRhdGEubmFtZSxcbiAgICB9KSkpO1xuXG4gICAgY29uc3QgYWN0aXZlRW5zZW1ibGVzID0gYXdhaXQgdGhpcy5lbnNlbWJsZU1hbmFnZXIuZ2V0QWN0aXZlRW5zZW1ibGVzKCk7XG4gICAgYWN0aXZlRWxlbWVudHMucHVzaCguLi5hY3RpdmVFbnNlbWJsZXMubWFwKChlbnNlbWJsZSkgPT4gKHtcbiAgICAgIHR5cGU6IEVsZW1lbnRUeXBlLkVOU0VNQkxFLFxuICAgICAgbmFtZTogZW5zZW1ibGUubWV0YWRhdGEubmFtZSxcbiAgICB9KSkpO1xuXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHJldHVybiBhY3RpdmVFbGVtZW50cy5maWx0ZXIoKGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGAke2VsZW1lbnQudHlwZX06JHtlbGVtZW50Lm5hbWV9YDtcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVEZWFkbG9ja1JlbGllZlNuYXBzaG90KHNuYXBzaG90OiB7XG4gICAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICAgIGFjdGl2ZUJlZm9yZVJlc2V0OiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+O1xuICAgIGRlYWN0aXZhdGVkOiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+O1xuICAgIGZhaWxlZDogQXJyYXk8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PjtcbiAgICBsaWtlbHlEZWFkbG9ja0NhdXNlOiB7XG4gICAgICBzYW5kYm94aW5nRWxlbWVudD86IHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfTtcbiAgICAgIGFkdmlzb3J5RWxlbWVudHM6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgfTtcbiAgICBwZXJzaXN0ZWRTdGF0ZUNsZWFyZWQ6IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHNuYXBzaG90RGlyID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAnc3RhdGUnLCAnZGVhZGxvY2stcmVsaWVmJyk7XG4gICAgY29uc3Qgc2FmZVNlc3Npb25JZCA9IChzbmFwc2hvdC5zZXNzaW9uSWQgPz8gJ3Nlc3Npb24nKVxuICAgICAgLnJlcGxhY2VBbGwoL1teYS16QS1aMC05Xy1dL2csICctJylcbiAgICAgIC5zbGljZSgwLCA2NCk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnJlcGxhY2VBbGwoL1s6Ll0vZywgJy0nKTtcbiAgICBjb25zdCBzbmFwc2hvdEZpbGUgPSBwYXRoLmpvaW4oc25hcHNob3REaXIsIGBkZWFkbG9jay1yZWxpZWYtJHtzYWZlU2Vzc2lvbklkfS0ke3RpbWVzdGFtcH0uanNvbmApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHNuYXBzaG90RGlyKTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMud3JpdGVGaWxlKFxuICAgICAgICBzbmFwc2hvdEZpbGUsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAuLi5zbmFwc2hvdCxcbiAgICAgICAgfSwgbnVsbCwgMiksXG4gICAgICAgIHsgc291cmNlOiAnRWxlbWVudENSVURIYW5kbGVyLnJlbGVhc2VEZWFkbG9jaycgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gc25hcHNob3RGaWxlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHdyaXRlIGRlYWRsb2NrIHJlbGllZiBzbmFwc2hvdCcsIHtcbiAgICAgICAgc25hcHNob3RGaWxlLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVyZ2VQZXJzaXN0ZWRQb2xpY3lTdGF0ZShcbiAgICBzdGF0ZTogUGVyc2lzdGVkQWN0aXZhdGlvblN0YXRlU25hcHNob3QsXG4gICAgYWRkRWxlbWVudDogKGVsZW1lbnQ6IHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LCBzZXNzaW9uSWRzPzogc3RyaW5nW10pID0+IHZvaWQsXG4gICAgZmluZFBlcnNpc3RlZEVsZW1lbnQ6ICh0eXBlOiBzdHJpbmcsIGFjdGl2YXRpb246IFBlcnNpc3RlZEFjdGl2YXRpb24pID0+IFByb21pc2U8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gfCBudWxsPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGVuZGluZzogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFt0eXBlLCBhY3RpdmF0aW9uc10gb2YgT2JqZWN0LmVudHJpZXMoc3RhdGUuYWN0aXZhdGlvbnMpKSB7XG4gICAgICBmb3IgKGNvbnN0IGFjdGl2YXRpb24gb2YgYWN0aXZhdGlvbnMgPz8gW10pIHtcbiAgICAgICAgcGVuZGluZy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZm91bmQgPSBhd2FpdCBmaW5kUGVyc2lzdGVkRWxlbWVudCh0eXBlLCBhY3RpdmF0aW9uKTtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIGFkZEVsZW1lbnQoZm91bmQsIFtzdGF0ZS5zZXNzaW9uSWRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwZW5kaW5nKTtcbiAgfVxuXG4gIGFzeW5jIGRlYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVBQ1RJVkFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0VsZW1lbnRDUlVESGFuZGxlci5kZWFjdGl2YXRlRWxlbWVudCcsXG4gICAgICAgIGRldGFpbHM6IGBFbGVtZW50IGRlYWN0aXZhdGlvbiByZXF1ZXN0ZWQ6ICR7dHlwZX0vJHtuYW1lfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGVsZW1lbnRUeXBlOiB0eXBlLCBlbGVtZW50TmFtZTogbmFtZSB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWdpZXMuZ2V0KG5vcm1hbGl6ZWRUeXBlKTtcblxuICAgICAgaWYgKCFzdHJhdGVneSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmF0ZWd5LmRlYWN0aXZhdGUobmFtZSk7XG5cbiAgICAgIC8vIElzc3VlICM1OTg6IFBlcnNpc3QgZGVhY3RpdmF0aW9uIHN0YXRlIGZvciBzZXNzaW9uIHJlc3RvcmVcbiAgICAgIGlmICh0aGlzLmFjdGl2YXRpb25TdG9yZSkge1xuICAgICAgICB0aGlzLmFjdGl2YXRpb25TdG9yZS5yZWNvcmREZWFjdGl2YXRpb24obm9ybWFsaXplZFR5cGUsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNzYyOiBFeHBvcnQgcG9saWNpZXMgdG8gYnJpZGdlIGFmdGVyIGRlYWN0aXZhdGlvblxuICAgICAgdGhpcy5wb2xpY3lFeHBvcnRTZXJ2aWNlPy5leHBvcnRQb2xpY2llcygpLmNhdGNoKCgpID0+IHt9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUmUtdGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgdG8gcHJvcGFnYXRlIHRvIE1DUC1BUUwgbGF5ZXJcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBvcGVyYXRpb25zIHJldHVybiBzdWNjZXNzPWZhbHNlIGluc3RlYWQgb2Ygc3VjY2Vzcz10cnVlIHdpdGggZXJyb3IgdGV4dFxuICAgICAgLy8gSXNzdWUgIzI3NTogSGFuZGxlcnMgcmV0dXJuIHN1Y2Nlc3M9dHJ1ZSBmb3IgbWlzc2luZyBlbGVtZW50c1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIEFsc28gcmUtdGhyb3cgdmFsaWRhdGlvbiBlcnJvcnMgKGUuZy4sIG1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVycylcbiAgICAgIC8vIHNvIHRoZXkgcmVzdWx0IGluIHN1Y2Nlc3M9ZmFsc2UgaW5zdGVhZCBvZiBzdWNjZXNzPXRydWUgd2l0aCBlcnJvciBjb250ZW50XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdwYXJhbWV0ZXIgaXMgcmVxdWlyZWQnKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGVhY3RpdmF0ZSBlbGVtZW50OmAsIHsgdHlwZSwgbmFtZSwgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGRlYWN0aXZhdGUgJHt0eXBlfSAnJHtuYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzcwODogR2V0IHRoZSBlbGVtZW50IG1hbmFnZXIgZm9yIGEgbm9ybWFsaXplZCB0eXBlLlxuICAgKiBVc2VkIHRvIGNoZWNrIGludmFsaWQgZWxlbWVudCByZWNvcmRzIHdoZW4gYW4gZWxlbWVudCBpcyBcIm5vdCBmb3VuZFwiLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRNYW5hZ2VyRm9yVHlwZShub3JtYWxpemVkVHlwZTogc3RyaW5nKTogQmFzZUVsZW1lbnRNYW5hZ2VyPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTogcmV0dXJuIHRoaXMucGVyc29uYU1hbmFnZXIgYXMgdW5rbm93biBhcyBCYXNlRWxlbWVudE1hbmFnZXI8YW55PjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6IHJldHVybiB0aGlzLnNraWxsTWFuYWdlcjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHJldHVybiB0aGlzLnRlbXBsYXRlTWFuYWdlcjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6IHJldHVybiB0aGlzLmFnZW50TWFuYWdlcjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuTUVNT1JZOiByZXR1cm4gdGhpcy5tZW1vcnlNYW5hZ2VyO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5FTlNFTUJMRTogcmV0dXJuIHRoaXMuZW5zZW1ibGVNYW5hZ2VyO1xuICAgICAgZGVmYXVsdDogcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRFbGVtZW50RGV0YWlscyhuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBjb25zdCBzdHJhdGVneSA9IHRoaXMuc3RyYXRlZ2llcy5nZXQobm9ybWFsaXplZFR5cGUpO1xuXG4gICAgICBpZiAoIXN0cmF0ZWd5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHN0cmF0ZWd5LmdldEVsZW1lbnREZXRhaWxzKG5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJc3N1ZSAjNzA4OiBXaGVuIGVsZW1lbnQgaXMgXCJub3QgZm91bmRcIiwgY2hlY2sgaWYgaXQgYWN0dWFsbHkgZXhpc3RzXG4gICAgICAvLyBvbiBkaXNrIGJ1dCBmYWlsZWQgdmFsaWRhdGlvbi4gUmV0dXJuIGEgZGlzdGluY3QgZXJyb3IgaW4gdGhhdCBjYXNlLlxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRNYW5hZ2VyRm9yVHlwZShub3JtYWxpemVkVHlwZSk7XG4gICAgICAgIGlmIChtYW5hZ2VyICYmIHR5cGVvZiBtYW5hZ2VyLmdldEludmFsaWRFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgaW52YWxpZFJlY29yZCA9IG1hbmFnZXIuZ2V0SW52YWxpZEVsZW1lbnQobmFtZSk7XG4gICAgICAgICAgaWYgKGludmFsaWRSZWNvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRWYWxpZGF0aW9uRmFpbGVkRXJyb3IoXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWRUeXBlIGFzIEVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBpbnZhbGlkUmVjb3JkLnJlYXNvbixcbiAgICAgICAgICAgICAgaW52YWxpZFJlY29yZC5maWxlUGF0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGdldCBlbGVtZW50IGRldGFpbHM6YCwgeyB0eXBlLCBuYW1lLCBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0ICR7dHlwZX0gZGV0YWlscyBmb3IgJyR7bmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9hZCBlbGVtZW50cyBvZiBhIHNwZWNpZmljIHR5cGUgZnJvbSB0aGUgZmlsZXN5c3RlbVxuICAgKiBFeHRyYWN0ZWQgZnJvbSBpbmRleC50czo2MDktNjc5IChleGFjdCBjb3B5LCBhZGFwdGVkIGZvciBoYW5kbGVyIHBhdHRlcm4pXG4gICAqL1xuICBhc3luYyByZWxvYWRFbGVtZW50cyh0eXBlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gTm9ybWFsaXplIHRoZSB0eXBlIHRvIGhhbmRsZSBib3RoIHBsdXJhbCBhbmQgc2luZ3VsYXIgZm9ybXNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcblxuICAgICAgc3dpdGNoIChub3JtYWxpemVkVHlwZSkge1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uYU1hbmFnZXIucmVsb2FkUGVyc29uYXMoKTtcblxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgdGhpcy5za2lsbE1hbmFnZXIuY2xlYXJDYWNoZSgpO1xuICAgICAgICAgIGNvbnN0IHNraWxscyA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7c2tpbGxzLmxlbmd0aH0gc2tpbGxzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURToge1xuICAgICAgICAgIC8vIFRlbXBsYXRlIG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IHRoaXMudGVtcGxhdGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7dGVtcGxhdGVzLmxlbmd0aH0gdGVtcGxhdGVzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDoge1xuICAgICAgICAgIC8vIEFnZW50IG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7YWdlbnRzLmxlbmd0aH0gYWdlbnRzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5NRU1PUlk6IHtcbiAgICAgICAgICAvLyBNZW1vcnkgbWFuYWdlciBkb2Vzbid0IGhhdmUgY2xlYXJDYWNoZSwganVzdCBsaXN0XG4gICAgICAgICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLm1lbW9yeU1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCflIQgUmVsb2FkZWQgJHttZW1vcmllcy5sZW5ndGh9IG1lbW9yaWVzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5FTlNFTUJMRToge1xuICAgICAgICAgIC8vIEVuc2VtYmxlIG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IGVuc2VtYmxlcyA9IGF3YWl0IHRoaXMuZW5zZW1ibGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7ZW5zZW1ibGVzLmxlbmd0aH0gZW5zZW1ibGVzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byByZWxvYWQgJHt0eXBlfTpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIHJlbG9hZCAke3R5cGV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIHRlbXBsYXRlIHdpdGggdmFyaWFibGVzXG4gICAqIEV4dHJhY3RlZCBmcm9tIGluZGV4LnRzOjY4Mi03MDEgKGV4YWN0IGNvcHkpXG4gICAqXG4gICAqIEB0aHJvd3Mge0VsZW1lbnROb3RGb3VuZEVycm9yfSBXaGVuIHRlbXBsYXRlIGRvZXMgbm90IGV4aXN0XG4gICAqIEBzZWUgSXNzdWUgIzI3NSAtIEhhbmRsZXJzIHJldHVybiBzdWNjZXNzPXRydWUgZm9yIG1pc3NpbmcgZWxlbWVudHNcbiAgICovXG4gIGFzeW5jIHJlbmRlclRlbXBsYXRlKG5hbWU6IHN0cmluZywgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgLy8gVXNlIHRoZSBuZXcgVGVtcGxhdGVSZW5kZXJlciB1dGlsaXR5IGZvciBjbGVhbmVyIGNvZGUgYW5kIGJldHRlciB2YWxpZGF0aW9uXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50ZW1wbGF0ZVJlbmRlcmVyLnJlbmRlcihuYW1lLCB2YXJpYWJsZXMpO1xuXG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5jb250ZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDwn5OEIFJlbmRlcmVkIHRlbXBsYXRlICcke25hbWV9JzpcXG5cXG4ke3Jlc3VsdC5jb250ZW50fWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElzc3VlICMyNzU6IFRocm93IGVycm9yIGZvciBtaXNzaW5nIHRlbXBsYXRlcyBpbnN0ZWFkIG9mIHJldHVybmluZyBjb250ZW50XG4gICAgICBpZiAocmVzdWx0LmVycm9yPy5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdUZW1wbGF0ZScsIG5hbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MICR7cmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gcmVuZGVyIHRlbXBsYXRlJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIGFnZW50IHdpdGggZ29hbCBwYXJhbWV0ZXJzXG4gICAqIFJldHVybnMgY29udGV4dCBmb3IgTExNIHRvIGRyaXZlIHRoZSBhZ2VudGljIGxvb3BcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudChuYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuZXhlY3V0ZUFnZW50KG5hbWUsIHBhcmFtZXRlcnMpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgYWdlbnQgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZXhlY3V0ZSBhZ2VudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSBzdGVwIGluIGFnZW50IGV4ZWN1dGlvblxuICAgKi9cbiAgYXN5bmMgcmVjb3JkQWdlbnRTdGVwKGFyZ3M6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBzdGVwRGVzY3JpcHRpb246IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgZmluZGluZ3M/OiBzdHJpbmc7XG4gICAgY29uZmlkZW5jZT86IG51bWJlcjtcbiAgICBuZXh0QWN0aW9uSGludD86IHN0cmluZztcbiAgICByaXNrU2NvcmU/OiBudW1iZXI7XG4gIH0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIucmVjb3JkQWdlbnRTdGVwKGFyZ3MpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlY29yZCBhZ2VudCBzdGVwIGZvciAnJHthcmdzLmFnZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gcmVjb3JkIHN0ZXA6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcGxldGUgYW4gYWdlbnQgZ29hbFxuICAgKi9cbiAgYXN5bmMgY29tcGxldGVBZ2VudEdvYWwoYXJnczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGdvYWxJZD86IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgc3VtbWFyeTogc3RyaW5nO1xuICB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmNvbXBsZXRlQWdlbnRHb2FsKGFyZ3MpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNvbXBsZXRlIGFnZW50IGdvYWwgZm9yICcke2FyZ3MuYWdlbnROYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBjb21wbGV0ZSBnb2FsOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhZ2VudCBzdGF0ZVxuICAgKi9cbiAgYXN5bmMgZ2V0QWdlbnRTdGF0ZShhcmdzOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgaW5jbHVkZURlY2lzaW9uSGlzdG9yeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZUNvbnRleHQ/OiBib29sZWFuO1xuICB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmdldEFnZW50U3RhdGUoYXJncyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gUmUtdGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVsZW1lbnROb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0IGFnZW50IHN0YXRlIGZvciAnJHthcmdzLmFnZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0IHN0YXRlOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRpbnVlIGFnZW50IGV4ZWN1dGlvbiBmcm9tIHByZXZpb3VzIHN0YXRlXG4gICAqL1xuICBhc3luYyBjb250aW51ZUFnZW50RXhlY3V0aW9uKGFyZ3M6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBwcmV2aW91c1N0ZXBSZXN1bHQ/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuY29udGludWVBZ2VudEV4ZWN1dGlvbihhcmdzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBSZS10aHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjb250aW51ZSBhZ2VudCBleGVjdXRpb24gZm9yICcke2FyZ3MuYWdlbnROYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBjb250aW51ZSBleGVjdXRpb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWdncmVnYXRlIGFjdGl2ZSBlbGVtZW50cyBhY3Jvc3MgYWxsIHJlZ2lzdGVyZWQgZWxlbWVudCB0eXBlcy5cbiAgICogSXNzdWUgIzUwMTogQ2FsbGVkIHdoZW4gZ2V0X2FjdGl2ZV9lbGVtZW50cyBpcyBpbnZva2VkIHdpdGhvdXQgZWxlbWVudF90eXBlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhZ2dyZWdhdGVBY3RpdmVFbGVtZW50cygpOiBQcm9taXNlPE1DUFJlc3BvbnNlPiB7XG4gICAgY29uc3Qgc2VjdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtlbGVtZW50VHlwZSwgc3RyYXRlZ3ldIG9mIHRoaXMuc3RyYXRlZ2llcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RyYXRlZ3kuZ2V0QWN0aXZlRWxlbWVudHMoKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHJlc3VsdC5jb250ZW50WzBdPy50ZXh0O1xuICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgIHNlY3Rpb25zLnB1c2goYFske2VsZW1lbnRUeXBlfV1cXG4ke3RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEZhaWxlZCB0byBnZXQgYWN0aXZlICR7ZWxlbWVudFR5cGV9IGVsZW1lbnRzYCwgeyBlcnJvcjogZXJyIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgdGV4dDogc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgID8gc2VjdGlvbnMuam9pbignXFxuXFxuJylcbiAgICAgICAgICA6ICdObyBhY3RpdmUgZWxlbWVudHMgZm91bmQuJ1xuICAgICAgfV1cbiAgICB9O1xuICB9XG5cbn1cbiJdfQ==
@@ -201,6 +201,7 @@ export declare class MCPAQLHandler {
201
201
  */
202
202
  private getActiveElements;
203
203
  private getPolicyReportElements;
204
+ private copyGatekeeperDiagnostics;
204
205
  /**
205
206
  * Handle CREATE operations (additive, non-destructive)
206
207
  *
@@ -449,6 +450,9 @@ export declare class MCPAQLHandler {
449
450
  * Dispatch Persona operations to PersonaHandler
450
451
  */
451
452
  private dispatchPersona;
453
+ private challengeIsForDeadlockRelief;
454
+ private issueDeadlockReliefChallenge;
455
+ private completeDeadlockRelief;
452
456
  /**
453
457
  * Dispatch Gatekeeper operations for confirmation management.
454
458
  *