@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
@@ -1500,7 +1500,7 @@ export class AgentManager extends BaseElementManager {
1500
1500
  // Issue #676: Sanitize gatekeeper policy on load to prevent prompt-injection attacks
1501
1501
  // Malformed policies are stripped and logged as security events (never reach enforcement)
1502
1502
  if (metadata.gatekeeper) {
1503
- metadata.gatekeeper = sanitizeGatekeeperPolicy(metadata.gatekeeper, metadata.name || 'unknown', 'agent');
1503
+ metadata.gatekeeper = sanitizeGatekeeperPolicy(metadata.gatekeeper, metadata.name || 'unknown', 'agent', metadata);
1504
1504
  }
1505
1505
  // Issue #722: Validate V2 agent fields on load — structural checks, strip malformed data.
1506
1506
  // Fail-open: corrupted fields are removed and logged, not thrown. This prevents
@@ -2468,4 +2468,4 @@ export class AgentManager extends BaseElementManager {
2468
2468
  return suggestions;
2469
2469
  }
2470
2470
  }
2471
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBR0gsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFlBQVksRUFDWixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsT0FBTyxFQUNQLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQVFMLHFCQUFxQixHQUd0QixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsZUFBZSxFQUFxQixNQUFNLG1CQUFtQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxHQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixzQkFBc0IsR0FDdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYs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QUssU0FBUyxDQUFDLENBQUM7UUFDeEMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLFdBQVcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLGNBQWMsQ0FBQyxNQUFNLG9CQUFvQixDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50TWFuYWdlciAtIFJlZmFjdG9yZWQgdG8gZXh0ZW5kIEJhc2VFbGVtZW50TWFuYWdlclxuICogTWFuYWdlcyBhZ2VudCBDUlVEIG9wZXJhdGlvbnMsIG1ldGFkYXRhIHNhbml0aXphdGlvbiwgYW5kIHN0YXRlIHBlcnNpc3RlbmNlLlxuICovXG5cbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4vQWdlbnQuanMnO1xuaW1wb3J0IHtcbiAgQ09NTUlUX1BFUlNJU1RFRF9WRVJTSU9OLFxuICBBR0VOVF9MSU1JVFMsXG4gIFJJU0tfVE9MRVJBTkNFX0xFVkVMUyxcbiAgU1RFUF9MSU1JVF9BQ1RJT05TLFxuICBFWEVDVVRJT05fRkFJTFVSRV9BQ1RJT05TLFxuICBCQUNLT0ZGX1NUUkFURUdJRVMsXG4gIGlzT25lT2YsXG4gIG5vcm1hbGl6ZUF1dG9ub215S2V5cyxcbiAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMsXG4gIG5vcm1hbGl6ZUdvYWxLZXlzLFxufSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQge1xuICBBZ2VudE1ldGFkYXRhLFxuICBBZ2VudFN0YXRlLFxuICBFeGVjdXRlQWdlbnRSZXN1bHQsXG4gIEFnZW50R29hbENvbmZpZyxcbiAgQWdlbnRHb2FsUGFyYW1ldGVyLFxuICBBZ2VudE1ldGFkYXRhVjIsXG4gIEFnZW50R29hbCxcbiAgREVGQVVMVF9TQUZFVFlfQ09ORklHLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBBdXRvbm9teURpcmVjdGl2ZSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXRHYXRoZXJlZERhdGEsIHR5cGUgR2F0aGVyZWREYXRhIH0gZnJvbSAnLi9nYXRoZXJlZERhdGEuanMnO1xuaW1wb3J0IHsgZXZhbHVhdGVBdXRvbm9teSB9IGZyb20gJy4vYXV0b25vbXlFdmFsdWF0b3IuanMnO1xuaW1wb3J0IHtcbiAgaXNWMUFnZW50LFxuICBjb252ZXJ0VjFUb1YyLFxufSBmcm9tICcuL3YxVG9WMkNvbnZlcnRlci5qcyc7XG5pbXBvcnQge1xuICBkZXRlcm1pbmVTYWZldHlUaWVyLFxuICBjcmVhdGVWZXJpZmljYXRpb25DaGFsbGVuZ2UsXG4gIGNyZWF0ZUNvbmZpcm1hdGlvblJlcXVlc3QsXG4gIGNyZWF0ZURhbmdlclpvbmVPcGVyYXRpb24sXG4gIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQsXG59IGZyb20gJy4vc2FmZXR5VGllclNlcnZpY2UuanMnO1xuaW1wb3J0IHsgQmFzZUVsZW1lbnRNYW5hZ2VyIH0gZnJvbSAnLi4vYmFzZS9CYXNlRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgdG9TaW5ndWxhckxhYmVsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQsIHZhbGlkYXRlUGF0aCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IElucHV0Tm9ybWFsaXplciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0Tm9ybWFsaXplci5qcyc7XG5pbXBvcnQgeyBTYWZlUmVnZXggfSBmcm9tICcuLi8uLi9zZWN1cml0eS9kb3NQcm90ZWN0aW9uLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL1NlcmlhbGl6YXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL01ldGFkYXRhU2VydmljZS5qcyc7XG5pbXBvcnQgeyBGaWxlV2F0Y2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZVdhdGNoU2VydmljZS5qcyc7XG5pbXBvcnQgeyBFbGVtZW50TWVzc2FnZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50TWVzc2FnZXMuanMnO1xuaW1wb3J0IHsgRWxlbWVudE5vdEZvdW5kRXJyb3IgfSBmcm9tICcuLi8uLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVHYXRla2VlcGVyUG9saWN5IH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcblxuY29uc3QgQUdFTlRfRklMRV9FWFRFTlNJT04gPSAnLm1kJztcbmNvbnN0IFNUQVRFX0RJUkVDVE9SWSA9ICcuc3RhdGUnO1xuY29uc3QgU1RBVEVfRklMRV9FWFRFTlNJT04gPSAnLnN0YXRlLnlhbWwnO1xuY29uc3QgTUFYX1lBTUxfU0laRSA9IDY0ICogMTAyNDtcbmNvbnN0IE1BWF9GSUxFX1NJWkUgPSAxMDAgKiAxMDI0O1xuXG4vLyBJc3N1ZSAjODM6IENlbnRyYWxpemVkIGFjdGl2ZSBlbGVtZW50IGxpbWl0cyAoY29uZmlndXJhYmxlIHZpYSBlbnYgdmFycylcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZywgZ2V0TWF4QWN0aXZlTGltaXQgfSBmcm9tICcuLi8uLi9jb25maWcvYWN0aXZlLWVsZW1lbnQtbGltaXRzLmpzJztcblxuaW50ZXJmYWNlIEVsZW1lbnRDcmVhdGlvblJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgZWxlbWVudD86IEFnZW50O1xufVxuXG5pbnRlcmZhY2UgUGFyc2VkQWdlbnRGaWxlIHtcbiAgbWV0YWRhdGE6IEFnZW50TWV0YWRhdGE7XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxudHlwZSBBZ2VudENyZWF0ZU1ldGFkYXRhID0gKFBhcnRpYWw8QWdlbnRNZXRhZGF0YT4gJiBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4pICYge1xuICBjb250ZW50Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIEFnZW50TWFuYWdlciBleHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlcjxBZ2VudD4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVDYWNoZTogTWFwPHN0cmluZywgQWdlbnRTdGF0ZT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgdHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlOiBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZTtcbiAgLy8gVHJhY2sgYWN0aXZlIGFnZW50cyBieSBuYW1lIChzdGFibGUgaWRlbnRpZmllcilcbiAgcHJpdmF0ZSBhY3RpdmVBZ2VudE5hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAvLyBTdGF0aWMgcmVzb2x2ZXIgZm9yIGVsZW1lbnQgbWFuYWdlciBsb29rdXAgKERJIHBhdHRlcm4pXG4gIC8vIFRoaXMgYWxsb3dzIEFnZW50IGluc3RhbmNlcyB0byByZXNvbHZlIG1hbmFnZXJzIHdpdGhvdXQgdGlnaHQgY291cGxpbmdcbiAgcHJpdmF0ZSBzdGF0aWMgZWxlbWVudE1hbmFnZXJSZXNvbHZlcj86IChtYW5hZ2VyTmFtZTogc3RyaW5nKSA9PiBhbnk7XG5cbiAgLy8gSXNzdWUgIzQwMjogU3RhdGljIHJlc29sdmVyIGZvciBEYW5nZXJab25lRW5mb3JjZXIgKERJIHBhdHRlcm4pXG4gIHByaXZhdGUgc3RhdGljIGRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyPzogKCkgPT4gaW1wb3J0KCcuL3R5cGVzLmpzJykuRGFuZ2VyWm9uZUJsb2NrZXI7XG5cbiAgLy8gSXNzdWUgIzE0MjogU3RhdGljIHJlc29sdmVyIGZvciBWZXJpZmljYXRpb25TdG9yZSAoREkgcGF0dGVybilcbiAgcHJpdmF0ZSBzdGF0aWMgdmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlcj86ICgpID0+IHsgc2V0OiAoaWQ6IHN0cmluZywgY2hhbGxlbmdlOiB7IGNvZGU6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXI7IHJlYXNvbjogc3RyaW5nIH0pID0+IHZvaWQgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyLFxuICAgIGJhc2VEaXI6IHN0cmluZyxcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2UsXG4gICAgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2UsXG4gICAgZmlsZVdhdGNoU2VydmljZT86IEZpbGVXYXRjaFNlcnZpY2UsXG4gICAgbWVtb3J5QnVkZ2V0PzogaW1wb3J0KCcuLi8uLi9jYWNoZS9DYWNoZU1lbW9yeUJ1ZGdldC5qcycpLkNhY2hlTWVtb3J5QnVkZ2V0LFxuICAgIGJhY2t1cFNlcnZpY2U/OiBpbXBvcnQoJy4uLy4uL3NlcnZpY2VzL0JhY2t1cFNlcnZpY2UuanMnKS5CYWNrdXBTZXJ2aWNlXG4gICkge1xuICAgIGNvbnN0IGVsZW1lbnREaXJPdmVycmlkZSA9IHBhdGguam9pbihiYXNlRGlyLCBFbGVtZW50VHlwZS5BR0VOVCk7XG4gICAgc3VwZXIoRWxlbWVudFR5cGUuQUdFTlQsIHBvcnRmb2xpb01hbmFnZXIsIGZpbGVMb2NrTWFuYWdlciwgeyBlbGVtZW50RGlyT3ZlcnJpZGUsIGZpbGVXYXRjaFNlcnZpY2UsIG1lbW9yeUJ1ZGdldCwgYmFja3VwU2VydmljZSB9LCBmaWxlT3BlcmF0aW9uc1NlcnZpY2UsIHZhbGlkYXRpb25SZWdpc3RyeSk7XG4gICAgdGhpcy5zdGF0ZURpciA9IHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIFNUQVRFX0RJUkVDVE9SWSk7XG4gICAgdGhpcy50cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlKCk7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UgPSBzZXJpYWxpemF0aW9uU2VydmljZTtcbiAgICB0aGlzLm1ldGFkYXRhU2VydmljZSA9IG1ldGFkYXRhU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRFbGVtZW50TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2FnZW50JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIGVsZW1lbnQgbWFuYWdlciByZXNvbHZlciBmb3IgZWxlbWVudC1hZ25vc3RpYyBhY3RpdmF0aW9uXG4gICAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uXG4gICAqIEZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBNZW1vcnkuY29uZmlndXJlTWVtb3J5TWFuYWdlclJlc29sdmVyXG4gICAqXG4gICAqIEBwYXJhbSByZXNvbHZlciBGdW5jdGlvbiB0aGF0IHRha2VzIGEgbWFuYWdlciBuYW1lIGFuZCByZXR1cm5zIHRoZSBtYW5hZ2VyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldEVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIocmVzb2x2ZXI6IChtYW5hZ2VyTmFtZTogc3RyaW5nKSA9PiBhbnkpOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIuZWxlbWVudE1hbmFnZXJSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM0MDI6IFNldCBEYW5nZXJab25lRW5mb3JjZXIgcmVzb2x2ZXIgZm9yIERJIGluamVjdGlvbi5cbiAgICogQ2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXREYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlcihyZXNvbHZlcjogKCkgPT4gaW1wb3J0KCcuL3R5cGVzLmpzJykuRGFuZ2VyWm9uZUJsb2NrZXIpOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIuZGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMTQyOiBTZXQgVmVyaWZpY2F0aW9uU3RvcmUgcmVzb2x2ZXIgZm9yIERJIGluamVjdGlvbi5cbiAgICogQ2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRWZXJpZmljYXRpb25TdG9yZVJlc29sdmVyKHJlc29sdmVyOiAoKSA9PiB7IHNldDogKGlkOiBzdHJpbmcsIGNoYWxsZW5nZTogeyBjb2RlOiBzdHJpbmc7IGV4cGlyZXNBdDogbnVtYmVyOyByZWFzb246IHN0cmluZyB9KSA9PiB2b2lkIH0pOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIudmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZWxlbWVudCBtYW5hZ2VyIHJlc29sdmVyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRFbGVtZW50TWFuYWdlclJlc29sdmVyKCk6ICgobWFuYWdlck5hbWU6IHN0cmluZykgPT4gYW55KSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIEFnZW50TWFuYWdlci5lbGVtZW50TWFuYWdlclJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHN0YXRpYyByZXNvbHZlcnMgKGZvciB0ZXN0IGNsZWFudXApXG4gICAqIENhbGwgdGhpcyBpbiBhZnRlckVhY2ggaG9va3MgdG8gcHJldmVudCB0ZXN0IGlzb2xhdGlvbiBpc3N1ZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVzZXRSZXNvbHZlcnMoKTogdm9pZCB7XG4gICAgQWdlbnRNYW5hZ2VyLmVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgQWdlbnRNYW5hZ2VyLmRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyID0gdW5kZWZpbmVkO1xuICAgIEFnZW50TWFuYWdlci52ZXJpZmljYXRpb25TdG9yZVJlc29sdmVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3IgYWdlbnRzIGFuZCBzdGF0ZSBmaWxlcy5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5lbGVtZW50RGlyKTtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLnN0YXRlRGlyKTtcbiAgICBsb2dnZXIuaW5mbygnQWdlbnRNYW5hZ2VyIGluaXRpYWxpemVkJywgeyBwYXRoOiB0aGlzLmVsZW1lbnREaXIgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGFnZW50IG9uIGRpc2suXG4gICAqL1xuICBhc3luYyBjcmVhdGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogQWdlbnRDcmVhdGVNZXRhZGF0YVxuICApOiBQcm9taXNlPEVsZW1lbnRDcmVhdGlvblJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemUoKTtcblxuICAgICAgLy8gTm9ybWFsaXplIGdvYWwgaW5wdXQgYmVmb3JlIHZhbGlkYXRpb24gLSBMTE1zIG1heSBwYXNzIHN0cmluZyBvciBvYmplY3RcbiAgICAgIC8vIFN0cmlwICdjb250ZW50JyBmcm9tIG1ldGFkYXRhIHRvIHByZXZlbnQgaXQgZnJvbSBvdmVyd3JpdGluZyB0aGUgcG9zaXRpb25hbFxuICAgICAgLy8gY29udGVudCBwYXJhbSAod2hpY2ggaXMgdGhlIGFnZW50J3MgaW5zdHJ1Y3Rpb25zIHRleHQpIGluIHRoZSB2YWxpZGF0aW9uIGNhbGwuXG4gICAgICBjb25zdCB7IGNvbnRlbnQ6IHJlZmVyZW5jZUNvbnRlbnQsIC4uLm1ldGFkYXRhV2l0aG91dENvbnRlbnQgfSA9IG1ldGFkYXRhID8/IHt9O1xuICAgICAgY29uc3Qgbm9ybWFsaXplZE1ldGFkYXRhOiBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4gPSB7XG4gICAgICAgIC4uLm1ldGFkYXRhV2l0aG91dENvbnRlbnRcbiAgICAgIH07XG4gICAgICBpZiAobWV0YWRhdGE/LmdvYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBub3JtYWxpemVkTWV0YWRhdGEuZ29hbCA9IHRoaXMubm9ybWFsaXplR29hbElucHV0KFxuICAgICAgICAgIG1ldGFkYXRhLmdvYWwgYXMgc3RyaW5nIHwgUGFydGlhbDxBZ2VudEdvYWxDb25maWc+XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIGlucHV0IHZhbGlkYXRpb24uXG4gICAgICAvLyBBZ2VudHMgc3VwcG9ydCBkdWFsLWZpZWxkIGNyZWF0aW9uOiBiZWhhdmlvcmFsIGluc3RydWN0aW9ucyBhbmQgb3B0aW9uYWxcbiAgICAgIC8vIHJlZmVyZW5jZSBjb250ZW50LiBWYWxpZGF0aW9uIHByZWZlcnMgYmVoYXZpb3JhbCBpbnN0cnVjdGlvbnMgd2hlbiBib3RoXG4gICAgICAvLyBmaWVsZHMgYXJlIHByZXNlbnQgc28gZXhpc3RpbmcgaW5zdHJ1Y3Rpb24tZmlyc3QgYWdlbnRzIGtlZXAgdGhlaXJcbiAgICAgIC8vIGN1cnJlbnQgc2VtYW50aWNzIHdoaWxlIGNvbnRlbnQtb25seSBhZ2VudHMgc3RpbGwgdmFsaWRhdGUgY29ycmVjdGx5LlxuICAgICAgY29uc3QgdmFsaWRhdGlvbklucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIC4uLm5vcm1hbGl6ZWRNZXRhZGF0YVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHByaW1hcnlUZXh0ID0gdGhpcy5nZXRQcmltYXJ5VmFsaWRhdGlvblRleHQoY29udGVudCwgcmVmZXJlbmNlQ29udGVudCk7XG4gICAgICB2YWxpZGF0aW9uSW5wdXQuY29udGVudCA9IHByaW1hcnlUZXh0ID8/ICcnO1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlQ3JlYXRlKHZhbGlkYXRpb25JbnB1dCk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYFZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmpvaW4oJywgJyl9YFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55XG4gICAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEFnZW50IGNyZWF0aW9uIHdhcm5pbmdzOiAke3ZhbGlkYXRpb25SZXN1bHQud2FybmluZ3Muam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FuaXRpemUgaW5wdXRzIGZvciBlbGVtZW50IGNyZWF0aW9uXG4gICAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShuYW1lKS5ub3JtYWxpemVkQ29udGVudCwgMTAwKTtcbiAgICAgIGNvbnN0IHNhbml0aXplZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsIDUwMCk7XG4gICAgICAvLyBVc2UgQ29udGVudFZhbGlkYXRvciBmb3IgbXVsdGktbGluZSBjb250ZW50IHRvIHByZXNlcnZlIGZvcm1hdHRpbmcgKG5ld2xpbmVzLCB0YWJzKVxuICAgICAgLy8gd2hpbGUgc3RpbGwgZGV0ZWN0aW5nIHByb21wdCBpbmplY3Rpb24gYXR0YWNrc1xuICAgICAgY29uc3QgY29udGVudFZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoY29udGVudCwgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsIGNvbnRlbnRDb250ZXh0OiAnYWdlbnQnIH0pO1xuICAgICAgY29uc3Qgc2FuaXRpemVkSW5zdHJ1Y3Rpb25zID0gY29udGVudFZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCB8fCAnJztcblxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlRWxlbWVudE5hbWUoc2FuaXRpemVkTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBhZ2VudCBuYW1lLiBVc2Ugb25seSBsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMuJ1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSk7XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudCh7XG4gICAgICAgIC4uLm5vcm1hbGl6ZWRNZXRhZGF0YSxcbiAgICAgICAgbmFtZTogc2FuaXRpemVkTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHNhbml0aXplZERlc2NyaXB0aW9uXG4gICAgICB9LCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAgIGFnZW50Lm1ldGFkYXRhLmF1dGhvciA9IG5vcm1hbGl6ZWRNZXRhZGF0YT8uYXV0aG9yID8/IHRoaXMuZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpO1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgc3BlY2lhbGl6YXRpb25zOiBub3JtYWxpemVkTWV0YWRhdGE/LnNwZWNpYWxpemF0aW9ucyA/PyBhZ2VudC5leHRlbnNpb25zPy5zcGVjaWFsaXphdGlvbnMgPz8gW10sXG4gICAgICAgIGRlY2lzaW9uRnJhbWV3b3JrOiBub3JtYWxpemVkTWV0YWRhdGE/LmRlY2lzaW9uRnJhbWV3b3JrID8/IGFnZW50LmV4dGVuc2lvbnM/LmRlY2lzaW9uRnJhbWV3b3JrLFxuICAgICAgICByaXNrVG9sZXJhbmNlOiBub3JtYWxpemVkTWV0YWRhdGE/LnJpc2tUb2xlcmFuY2UgPz8gYWdlbnQuZXh0ZW5zaW9ucz8ucmlza1RvbGVyYW5jZSxcbiAgICAgICAgbGVhcm5pbmdFbmFibGVkOiBub3JtYWxpemVkTWV0YWRhdGE/LmxlYXJuaW5nRW5hYmxlZCA/PyBhZ2VudC5leHRlbnNpb25zPy5sZWFybmluZ0VuYWJsZWQsXG4gICAgICB9O1xuICAgICAgLy8gUHJvbW90ZSBpbnN0cnVjdGlvbnMgdG8gZmlyc3QtY2xhc3MgcHJvcGVydHkgKG5vIGxvbmdlciBpbiBleHRlbnNpb25zKVxuICAgICAgYWdlbnQuaW5zdHJ1Y3Rpb25zID0gc2FuaXRpemVkSW5zdHJ1Y3Rpb25zO1xuICAgICAgLy8gQWxzbyBrZWVwIGluIGV4dGVuc2lvbnMgZm9yIGJhY2t3YXJkIGNvbXBhdCBkdXJpbmcgdHJhbnNpdGlvblxuICAgICAgYWdlbnQuZXh0ZW5zaW9ucy5pbnN0cnVjdGlvbnMgPSBzYW5pdGl6ZWRJbnN0cnVjdGlvbnM7XG5cbiAgICAgIC8vIFNldCByZWZlcmVuY2UgY29udGVudCBpZiBwcm92aWRlZCAodjIuMCBkdWFsLWZpZWxkIGFyY2hpdGVjdHVyZSlcbiAgICAgIGlmICh0eXBlb2YgcmVmZXJlbmNlQ29udGVudCA9PT0gJ3N0cmluZycgJiYgcmVmZXJlbmNlQ29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvblJlc3VsdCA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShcbiAgICAgICAgICByZWZlcmVuY2VDb250ZW50LFxuICAgICAgICAgIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RILCBjb250ZW50Q29udGV4dDogJ2FnZW50JyB9XG4gICAgICAgICk7XG4gICAgICAgIGlmICghY29udGVudFZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBWYWxpZGF0aW9uIGZhaWxlZDogJHsoY29udGVudFZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucyB8fCBbJ0NvbnRlbnQgdmFsaWRhdGlvbiBmYWlsZWQnXSkuam9pbignLCAnKX1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBhZ2VudC5jb250ZW50ID0gY29udGVudFZhbGlkYXRpb25SZXN1bHQuc2FuaXRpemVkQ29udGVudCB8fCAnJztcbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzcyNzogVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBWMiBmaWVsZHMgQkVGT1JFIGFzc2lnbm1lbnQuXG4gICAgICAvLyBUaGlzIGlzIHRoZSBTRUNPTkQgdmFsaWRhdGlvbiBsYXllciDigJQgQWdlbnRFbGVtZW50VmFsaWRhdG9yIChjYWxsZWQgYWJvdmUgdmlhXG4gICAgICAvLyB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUNyZWF0ZSkgaXMgdGhlIGZpcnN0LiBUaGUgdmFsaWRhdG9yIGNhdGNoZXMgY2FtZWxDYXNlXG4gICAgICAvLyBpbnZhbGlkIHZhbHVlczsgdGhpcyBtZXRob2QgYWxzbyBub3JtYWxpemVzIHNuYWtlX2Nhc2Uga2V5cyAod2hpY2ggdGhlIHZhbGlkYXRvclxuICAgICAgLy8gZG9lc24ndCBzZWUpIGFuZCB2YWxpZGF0ZXMgdGhlbS4gQm90aCBsYXllcnMgYXJlIG5lZWRlZC4gU2VlIElzc3VlICM3MzAuXG4gICAgICBjb25zdCBtZXRhZGF0YVYyID0gbm9ybWFsaXplZE1ldGFkYXRhIGFzIFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChtZXRhZGF0YVYyKSB7XG4gICAgICAgIGNvbnN0IHYyRXJyb3JzID0gdGhpcy52YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKG1ldGFkYXRhVjIpO1xuICAgICAgICBpZiAodjJFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBWMiBmaWVsZCB2YWxpZGF0aW9uIGZhaWxlZDogJHt2MkVycm9ycy5qb2luKCc7ICcpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFYyIEZJRUxEUzogU3RvcmUgVjItc3BlY2lmaWMgZmllbGRzIGluIGFnZW50IG1ldGFkYXRhIChub3QganVzdCBleHRlbnNpb25zKVxuICAgICAgLy8gVGhpcyBlbmFibGVzIFYyIGFnZW50IGNyZWF0aW9uIHZpYSBNQ1AtQVFMIGNyZWF0ZV9lbGVtZW50IG9wZXJhdGlvblxuICAgICAgaWYgKG1ldGFkYXRhVjI/LmdvYWwpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuZ29hbCA9IG1ldGFkYXRhVjIuZ29hbDtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5hY3RpdmF0ZXMpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuYWN0aXZhdGVzID0gbWV0YWRhdGFWMi5hY3RpdmF0ZXM7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMj8udG9vbHMpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikudG9vbHMgPSBtZXRhZGF0YVYyLnRvb2xzO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LnN5c3RlbVByb21wdCkge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5zeXN0ZW1Qcm9tcHQgPSBtZXRhZGF0YVYyLnN5c3RlbVByb21wdDtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5hdXRvbm9teSkge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5hdXRvbm9teSA9IG1ldGFkYXRhVjIuYXV0b25vbXk7XG4gICAgICB9XG4gICAgICAvLyBJc3N1ZSAjNDQ5OiBQZXJzaXN0IGdhdGVrZWVwZXIgcG9saWN5IGZvciBHYXRla2VlcGVyIGVuZm9yY2VtZW50IGR1cmluZyBleGVjdXRpb25cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5nYXRla2VlcGVyKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLmdhdGVrZWVwZXIgPSBtZXRhZGF0YVYyLmdhdGVrZWVwZXI7XG4gICAgICB9XG4gICAgICAvLyBJc3N1ZSAjNzIyOiBQZXJzaXN0IHJlc2lsaWVuY2UgcG9saWN5ICh3YXMgbWlzc2luZyBmcm9tIFYyIGZpZWxkIGFzc2lnbm1lbnRzKVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LnJlc2lsaWVuY2UpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikucmVzaWxpZW5jZSA9IG1ldGFkYXRhVjIucmVzaWxpZW5jZTtcbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzYxMzogQ2hlY2sgbWV0YWRhdGEgbmFtZSB1bmlxdWVuZXNzIChub3QganVzdCBmaWxlbmFtZSlcbiAgICAgIGNvbnN0IGV4aXN0aW5nQWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgICBjb25zdCBkdXBsaWNhdGUgPSBleGlzdGluZ0FnZW50cy5maW5kKGEgPT5cbiAgICAgICAgYS5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHNhbml0aXplZE5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBTZXJpYWxpemUgdGhlIGFnZW50IGNvbnRlbnQgZmlyc3RcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRDb250ZW50ID0gYXdhaXQgdGhpcy5zZXJpYWxpemVFbGVtZW50KGFnZW50KTtcbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlbmFtZSk7XG5cbiAgICAgIC8vIFVzZSBhdG9taWMgZmlsZSBjcmVhdGlvbiB0byBwcmV2ZW50IFRPQ1RPVSByYWNlIGNvbmRpdGlvbnNcbiAgICAgIC8vIFRoaXMgcmVwbGFjZXMgdGhlIHByZXZpb3VzIGNoZWNrLXRoZW4td3JpdGUgcGF0dGVybiB3aXRoIGEgc2luZ2xlIGF0b21pYyBvcGVyYXRpb25cbiAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZUZpbGVFeGNsdXNpdmUoYWJzb2x1dGVQYXRoLCBzZXJpYWxpemVkQ29udGVudCwge1xuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuY3JlYXRlJ1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCAnJHtzYW5pdGl6ZWROYW1lfScgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENhY2hlIHRoZSBlbGVtZW50IGFmdGVyIHN1Y2Nlc3NmdWwgY3JlYXRpb25cbiAgICAgIHRoaXMuY2FjaGVFbGVtZW50KGFnZW50LCBmaWxlbmFtZSk7XG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VMYXllci5ub3RpZnlTYXZlZChmaWxlbmFtZSwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIC8vIE5vdGU6IE5vIHJlbG9hZCgpIGhlcmUg4oCUIGNhY2hlRWxlbWVudCgpIHN0b3JlcyB0aGUgZWxlbWVudCBjb3JyZWN0bHkuXG4gICAgICAvLyBTZWUgSXNzdWUgIzQ5MSBmb3Igd2h5IFBlcnNvbmFNYW5hZ2VyJ3MgcmVsb2FkLWFmdGVyLWNyZWF0ZSB3YXMgcmVtb3ZlZC5cblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuY3JlYXRlJyxcbiAgICAgICAgZGV0YWlsczogYEFnZW50ICcke3Nhbml0aXplZE5hbWV9JyBjcmVhdGVkYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgYWdlbnRJZDogYWdlbnQuaWQgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGDwn6SWICoqJHtzYW5pdGl6ZWROYW1lfSoqIGJ5ICR7YWdlbnQubWV0YWRhdGEuYXV0aG9yIHx8ICdhbm9ueW1vdXMnfWAsXG4gICAgICAgIGVsZW1lbnQ6IGFnZW50XG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYWdlbnQnLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnRmFpbGVkIHRvIGNyZWF0ZSBhZ2VudCdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW4gYWdlbnQgYnkgbmFtZSAod2l0aG91dCBleHRlbnNpb24pLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIEFnZW50IG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKVxuICAgKiBAcmV0dXJucyBBZ2VudCBpbnN0YW5jZSBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgYXN5bmMgcmVhZChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZChmaWxlbmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAvLyBGYWxsYmFjazogZmxleGlibGUgbWF0Y2hpbmcgdmlhIGxpc3Qgc2NhbiAoIzYwNylcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEZsZXhpYmx5KG5hbWUpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZhbGxiYWNrIGZvciByZWFkKCkgd2hlbiBkaXJlY3QgZmlsZSBsb29rdXAgZmFpbHMuXG4gICAqIFNlYXJjaGVzIGxvYWRlZCBhZ2VudHMgYnkgbWV0YWRhdGEgbmFtZSB1c2luZyBjYXNlLWluc2Vuc2l0aXZlIGFuZCBzbHVnIG1hdGNoaW5nLlxuICAgKiBMb2dzIGEgd2FybmluZyB3aGVuIGEgbWF0Y2ggaXMgZm91bmQgKGluZGljYXRlcyBmaWxlbmFtZS9uYW1lIG1pc21hdGNoIG5lZWRpbmcgY2xlYW51cCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEZpbGUgb24gZGlzazogXCJsZWdhY3ktcG9zdGVyLWFnZW50Lm1kXCJcbiAgICogLy8gTWV0YWRhdGEgbmFtZTogXCJsZWdhY3ktcG9zdGVyXCJcbiAgICogLy8gRGlyZWN0IGxvb2t1cCBmb3IgXCJsZWdhY3ktcG9zdGVyLm1kXCIgZmFpbHMgKEVOT0VOVClcbiAgICogLy8gRmxleGlibGUgZmFsbGJhY2sgbWF0Y2hlcyB2aWEgbWV0YWRhdGEgbmFtZTpcbiAgICogY29uc3QgYWdlbnQgPSBhd2FpdCByZWFkKFwibGVnYWN5LXBvc3RlclwiKTsgLy8gcmVzb2x2ZXMgdmlhIGZhbGxiYWNrXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYWRGbGV4aWJseShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIGlmIChhZ2VudHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3Qgc2VhcmNoTG93ZXIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBzZWFyY2hTbHVnID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShuYW1lKTtcblxuICAgICAgLy8gUGFzcyAxOiBleGFjdCBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIG9uIG1ldGFkYXRhIG5hbWVcbiAgICAgIGxldCBtYXRjaCA9IGFnZW50cy5maW5kKFxuICAgICAgICAoYSkgPT4gYS5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHNlYXJjaExvd2VyXG4gICAgICApO1xuXG4gICAgICAvLyBQYXNzIDI6IHNsdWcgbWF0Y2ggKGhhbmRsZXMgZGFzaGVzLCB1bmRlcnNjb3JlcywgY2FzaW5nIGRpZmZlcmVuY2VzKVxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICBtYXRjaCA9IGFnZW50cy5maW5kKChhKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2x1ZyA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoYS5tZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICByZXR1cm4gc2x1ZyA9PT0gc2VhcmNoU2x1ZyB8fCBzbHVnID09PSBzZWFyY2hMb3dlcjtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgQWdlbnQgXCIke25hbWV9XCIgcmVzb2x2ZWQgdmlhIGZsZXhpYmxlIG1hdGNoaW5nIHRvIGZpbGUgd2l0aCBtZXRhZGF0YSBuYW1lIFwiJHttYXRjaC5tZXRhZGF0YS5uYW1lfVwiLiBgICtcbiAgICAgICAgICBgQ29uc2lkZXIgcmVuYW1pbmcgdGhlIGZpbGUgdG8gbWF0Y2ggdGhlIGV4cGVjdGVkIGNvbnZlbnRpb24gKCM2MDcpLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hdGNoID8/IG51bGw7XG4gICAgfSBjYXRjaCAobGlzdEVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEZsZXhpYmxlIGFnZW50IGxvb2t1cCBmYWlsZWQgZm9yIFwiJHtuYW1lfVwiOiAke2xpc3RFcnJvcn1gKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbWV0YWRhdGEvY29udGVudCBmb3IgYW4gZXhpc3RpbmcgYWdlbnQuXG4gICAqL1xuICBhc3luYyB1cGRhdGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHVwZGF0ZXM6IFBhcnRpYWw8QWdlbnRNZXRhZGF0YT4sXG4gICAgY29udGVudD86IHN0cmluZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHNhbml0aXplZE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCBub3QgZm91bmQgZm9yIHVwZGF0ZTogJHtuYW1lfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFVzZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIGVkaXQgdmFsaWRhdGlvblxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUVkaXQoYWdlbnQsIHtcbiAgICAgIC4uLnVwZGF0ZXMsXG4gICAgICBjb250ZW50XG4gICAgfSk7XG5cbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgbG9nZ2VyLmVycm9yKGBBZ2VudCB1cGRhdGUgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55XG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MgJiYgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihgQWdlbnQgdXBkYXRlIHdhcm5pbmdzOiAke3ZhbGlkYXRpb25SZXN1bHQud2FybmluZ3Muam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQoXG4gICAgICAgIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHVwZGF0ZXMuZGVzY3JpcHRpb24pLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgICA1MDBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMuc3BlY2lhbGl6YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIHNwZWNpYWxpemF0aW9uczogdXBkYXRlcy5zcGVjaWFsaXphdGlvbnMubWFwKGl0ZW0gPT4gc2FuaXRpemVJbnB1dChpdGVtLCA1MCkpXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLmRlY2lzaW9uRnJhbWV3b3JrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGRlY2lzaW9uRnJhbWV3b3JrOiB1cGRhdGVzLmRlY2lzaW9uRnJhbWV3b3JrXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLnJpc2tUb2xlcmFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgcmlza1RvbGVyYW5jZTogdXBkYXRlcy5yaXNrVG9sZXJhbmNlXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLmxlYXJuaW5nRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBsZWFybmluZ0VuYWJsZWQ6IHVwZGF0ZXMubGVhcm5pbmdFbmFibGVkXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLm1heENvbmN1cnJlbnRHb2FscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5tZXRhZGF0YS5tYXhDb25jdXJyZW50R29hbHMgPSB1cGRhdGVzLm1heENvbmN1cnJlbnRHb2FscztcbiAgICB9XG5cbiAgICBhZ2VudC5tZXRhZGF0YS5tb2RpZmllZCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgIGlmIChjb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFVzZSBDb250ZW50VmFsaWRhdG9yIGZvciBtdWx0aS1saW5lIGNvbnRlbnQgdG8gcHJlc2VydmUgZm9ybWF0dGluZyAobmV3bGluZXMsIHRhYnMpXG4gICAgICAvLyB3aGlsZSBzdGlsbCBkZXRlY3RpbmcgcHJvbXB0IGluamVjdGlvbiBhdHRhY2tzXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50LCB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCwgY29udGVudENvbnRleHQ6ICdhZ2VudCcgfSk7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBpbnN0cnVjdGlvbnM6IGNvbnRlbnRWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgJydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlKGFnZW50LCB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpKTtcbiAgICBsb2dnZXIuaW5mbyhgQWdlbnQgdXBkYXRlZDogJHtzYW5pdGl6ZWROYW1lfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgcHJvdmlkZWQgYWdlbnQgbmFtZS5cbiAgICovXG4gIHZhbGlkYXRlTmFtZShuYW1lOiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgICBpZiAoIW5hbWUgfHwgbmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnTmFtZSBjYW5ub3QgYmUgZW1wdHknIH07XG4gICAgfVxuXG4gICAgaWYgKG5hbWUubGVuZ3RoID4gMTAwKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnTmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyB9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy52YWxpZGF0ZUVsZW1lbnROYW1lKG5hbWUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiAnTmFtZSBjYW4gb25seSBjb250YWluIGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gYWdlbnQgZnJvbSBzZXJpYWxpemVkIGNvbnRlbnQuXG4gICAqL1xuICBhc3luYyBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ21hcmtkb3duJyk6IFByb21pc2U8QWdlbnQ+IHtcbiAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VKc29uKGRhdGEsIHtcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmltcG9ydEVsZW1lbnQnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHBhcnNlZC5tZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgICAgaWYgKHBhcnNlZC5zdGF0ZSkge1xuICAgICAgICBhZ2VudC5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeShwYXJzZWQpKTtcbiAgICAgIH1cbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGluc3RydWN0aW9uczogcGFyc2VkLmluc3RydWN0aW9ucyB8fCAnJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG5cbiAgICAvLyBVc2UgU2VyaWFsaXphdGlvblNlcnZpY2UgZm9yIGZyb250bWF0dGVyIHBhcnNpbmdcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoZGF0YSwge1xuICAgICAgbWF4WWFtbFNpemU6IE1BWF9ZQU1MX1NJWkUsXG4gICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmltcG9ydEVsZW1lbnQnXG4gICAgfSk7XG5cbiAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChyZXN1bHQuZGF0YSBhcyBBZ2VudE1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICBpbnN0cnVjdGlvbnM6IHJlc3VsdC5jb250ZW50LnRyaW0oKVxuICAgIH07XG4gICAgcmV0dXJuIGFnZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbiBhZ2VudCB0byBKU09OIG9yIG1hcmtkb3duIChkZWZhdWx0KS5cbiAgICovXG4gIGFzeW5jIGV4cG9ydEVsZW1lbnQoYWdlbnQ6IEFnZW50LCBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIHJldHVybiBhZ2VudC5zZXJpYWxpemVUb0pTT04oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVFbGVtZW50KGFnZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuIGFnZW50IGZpbGUsIGVuZm9yY2luZyBzaXplIGFuZCBmb3JtYXQgY2hlY2tzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgbG9hZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxBZ2VudD4ge1xuICAgIGNvbnN0IHNhbml0aXplZElucHV0ID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBzYW5pdGl6ZWRJbnB1dC5lbmRzV2l0aChBR0VOVF9GSUxFX0VYVEVOU0lPTilcbiAgICAgID8gc2FuaXRpemVkSW5wdXRcbiAgICAgIDogdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZUlucHV0KHNhbml0aXplZElucHV0LCAxMDApKTtcblxuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZVBhdGgocmVsYXRpdmVQYXRoLCB0aGlzLmVsZW1lbnREaXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEludmFsaWQgYWdlbnQgcGF0aDogJHtlcnJvcn1gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhZ2VudCBwYXRoOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ludmFsaWQgcGF0aCd9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgocmVsYXRpdmVQYXRoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZShmdWxsUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gTUFYX0ZJTEVfU0laRSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFnZW50IGZpbGUgZXhjZWVkcyBtYXhpbXVtIHNpemUgb2YgJHtNQVhfRklMRV9TSVpFfSBieXRlc2ApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlQWdlbnRGaWxlKGNvbnRlbnQpO1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnBhcnNlTWV0YWRhdGEocGFyc2VkLm1ldGFkYXRhKTtcbiAgICAgIGNvbnN0IGFnZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG5cbiAgICAgIHRoaXMuY2FjaGVFbGVtZW50KGFnZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgYXdhaXQgdGhpcy5oeWRyYXRlQWdlbnRTdGF0ZShhZ2VudCwgdGhpcy5zdHJpcEV4dGVuc2lvbihyZWxhdGl2ZVBhdGgpKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9MT0FERUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5sb2FkYCxcbiAgICAgICAgZGV0YWlsczogYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBsb2FkZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX0gdiR7YWdlbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBhZ2VudElkOiBhZ2VudC5pZCxcbiAgICAgICAgICBhZ2VudE5hbWU6IGFnZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgICBhdXRob3I6IGFnZW50Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBhZ2VudCBmcm9tICR7ZnVsbFBhdGh9OmAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBCYXNlRWxlbWVudE1hbmFnZXIuc2F2ZSB0byBwZXJzaXN0IHN0YXRlIHdoZW4gcmVxdWlyZWQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzYXZlKGFnZW50OiBBZ2VudCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBmaWxlUGF0aC5lbmRzV2l0aChBR0VOVF9GSUxFX0VYVEVOU0lPTilcbiAgICAgID8gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KVxuICAgICAgOiB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDEwMCkpO1xuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTdGF0ZURpcmVjdG9yeSgpO1xuICAgIGF3YWl0IHN1cGVyLnNhdmUoYWdlbnQsIHNhbml0aXplZFBhdGgpO1xuXG4gICAgaWYgKGFnZW50Lm5lZWRzU3RhdGVQZXJzaXN0ZW5jZSgpKSB7XG4gICAgICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgdGhpcy5zYXZlQWdlbnRTdGF0ZSh0aGlzLnN0cmlwRXh0ZW5zaW9uKHNhbml0aXplZFBhdGgpLCBhZ2VudC5nZXRTdGF0ZSgpKTtcbiAgICAgIGFnZW50W0NPTU1JVF9QRVJTSVNURURfVkVSU0lPTl0obmV3VmVyc2lvbik7ICAvLyBTeW5jIGFnZW50J3MgaW50ZXJuYWwgdmVyc2lvbiAoSXNzdWUgIzEyMyBmaXgpXG4gICAgICBhZ2VudC5tYXJrU3RhdGVQZXJzaXN0ZWQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdCBhZ2VudCBzdGF0ZSB0byBkaXNrIChwdWJsaWMgQVBJIGZvciBleHRlcm5hbCBjYWxsZXJzKS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgdGhlIHByb3BlciB3YXkgZm9yIGV4dGVybmFsIGNvZGUgKHN0cmF0ZWdpZXMsIGhhbmRsZXJzKSB0b1xuICAgKiB0cmlnZ2VyIHN0YXRlIHBlcnNpc3RlbmNlLiBJdCBpbXBsZW1lbnRzIHRoZSBPcHRpb24gQyBwYXR0ZXJuIGZyb20gSXNzdWUgIzEyMzpcbiAgICogc3RhdGVWZXJzaW9uIGlzIG9ubHkgaW5jcmVtZW50ZWQgb24gc3VjY2Vzc2Z1bCBzYXZlLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIEFnZW50IG5hbWVcbiAgICogQHJldHVybnMgUHJvbWlzZTxib29sZWFuPiAtIFRydWUgaWYgc3RhdGUgd2FzIHBlcnNpc3RlZCwgZmFsc2UgaWYgbm90IG5lZWRlZFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGFnZW50IG5vdCBmb3VuZCBvciBzYXZlIGZhaWxzXG4gICAqL1xuICBhc3luYyBwZXJzaXN0U3RhdGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQobmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZ2VudCBub3QgZm91bmQ6ICR7bmFtZX1gKTtcbiAgICB9XG5cbiAgICBpZiAoIWFnZW50Lm5lZWRzU3RhdGVQZXJzaXN0ZW5jZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3VmVyc2lvbiA9IGF3YWl0IHRoaXMuc2F2ZUFnZW50U3RhdGUobmFtZSwgYWdlbnQuZ2V0U3RhdGUoKSk7XG4gICAgYWdlbnRbQ09NTUlUX1BFUlNJU1RFRF9WRVJTSU9OXShuZXdWZXJzaW9uKTtcbiAgICBhZ2VudC5tYXJrU3RhdGVQZXJzaXN0ZWQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBkZWxldGUgdG8gcmVtb3ZlIGFzc29jaWF0ZWQgc3RhdGUgZmlsZS5cbiAgICpcbiAgICogRklYOiBVc2VzIG5vcm1hbGl6ZUZpbGVuYW1lKCkgdG8gZW5zdXJlIHN0YXRlIGZpbGUgZGVsZXRpb24gbWF0Y2hlc1xuICAgKiB0aGUgbm9ybWFsaXplZCBmaWxlbmFtZSB1c2VkIGZvciBzdGF0ZSBmaWxlIGNyZWF0aW9uL2xvYWRpbmcuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBmaWxlUGF0aC5lbmRzV2l0aChBR0VOVF9GSUxFX0VYVEVOU0lPTilcbiAgICAgID8gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KVxuICAgICAgOiB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDEwMCkpO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnN0cmlwRXh0ZW5zaW9uKHNhbml0aXplZFBhdGgpO1xuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZShzYW5pdGl6ZWRQYXRoKTtcblxuICAgIC8vIEZJWDogTm9ybWFsaXplIG5hbWUgZm9yIGNvbnNpc3RlbnQgc3RhdGUgZmlsZSBkZWxldGlvblxuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShuYW1lKTtcbiAgICBjb25zdCBzdGF0ZVBhdGggPSBwYXRoLmpvaW4odGhpcy5zdGF0ZURpciwgYCR7bm9ybWFsaXplZE5hbWV9JHtTVEFURV9GSUxFX0VYVEVOU0lPTn1gKTtcbiAgICB0cnkge1xuICAgICAgLy8gQmFjayB1cCB0aGUgc3RhdGUgZmlsZSBiZWZvcmUgZGVsZXRpbmcgaXRcbiAgICAgIGlmICh0aGlzLmJhY2t1cFNlcnZpY2UpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5iYWNrdXBTZXJ2aWNlLmJhY2t1cEJlZm9yZURlbGV0ZShzdGF0ZVBhdGgsIEVsZW1lbnRUeXBlLkFHRU5UKTtcbiAgICAgICAgaWYgKCFyZXN1bHQubW92ZWRPcmlnaW5hbCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShzdGF0ZVBhdGgsIEVsZW1lbnRUeXBlLkFHRU5ULCB7XG4gICAgICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuZGVsZXRlIChzdGF0ZSBmaWxlKSdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKHN0YXRlUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQsIHtcbiAgICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuZGVsZXRlIChzdGF0ZSBmaWxlKSdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRklYOiBVc2Ugbm9ybWFsaXplZCBuYW1lIGFzIGNhY2hlIGtleSBmb3IgY29uc2lzdGVudCBjYWNoZSBjbGVhbnVwXG4gICAgdGhpcy5zdGF0ZUNhY2hlLmRlbGV0ZShub3JtYWxpemVkTmFtZSk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBleGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBmaWxlUGF0aC5lbmRzV2l0aChBR0VOVF9GSUxFX0VYVEVOU0lPTilcbiAgICAgID8gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KVxuICAgICAgOiB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDEwMCkpO1xuICAgIHJldHVybiBzdXBlci5leGlzdHMoc2FuaXRpemVkUGF0aCk7XG4gIH1cblxuICBvdmVycmlkZSB2YWxpZGF0ZVBhdGgodGFyZ2V0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRhcmdldFBhdGguaW5jbHVkZXMoJy4uJykgfHwgdGFyZ2V0UGF0aC5pbmNsdWRlcygnficpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0YXJnZXRQYXRoLnN0YXJ0c1dpdGgoJy8nKSB8fCAvXltBLVphLXpdOi8udGVzdCh0YXJnZXRQYXRoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQUdFTlRfRklMRV9FWFRFTlNJT047XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgbGlzdCB0byBhcHBseSBhY3RpdmUgc3RhdHVzIGJhc2VkIG9uIGFjdGl2ZUFnZW50TmFtZXMgc2V0XG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsaXN0KCk6IFByb21pc2U8QWdlbnRbXT4ge1xuICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHN1cGVyLmxpc3QoKTtcblxuICAgIC8vIEFwcGx5IGFjdGl2ZSBzdGF0dXMgdG8gYWdlbnRzIHRoYXQgYXJlIGluIHRoZSBhY3RpdmUgc2V0IChieSBuYW1lKVxuICAgIGZvciAoY29uc3QgYWdlbnQgb2YgYWdlbnRzKSB7XG4gICAgICBpZiAodGhpcy5hY3RpdmVBZ2VudE5hbWVzLmhhcyhhZ2VudC5tZXRhZGF0YS5uYW1lKSkge1xuICAgICAgICAvLyBBY3RpdmF0ZSB0aGUgYWdlbnQgdG8gc2V0IHN0YXR1cyB0byBBQ1RJVkVcbiAgICAgICAgYXdhaXQgYWdlbnQuYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWdlbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGFuIGFnZW50IGJ5IG5hbWUgb3IgaWRlbnRpZmllclxuICAgKlxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB1c2luZyBmaW5kQnlOYW1lKClcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDb25zaXN0ZW50IGVycm9yIG1lc3NhZ2VzIHVzaW5nIEVsZW1lbnRNZXNzYWdlc1xuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENsZWFudXAgdHJpZ2dlciBmb3IgbWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKi9cbiAgYXN5bmMgYWN0aXZhdGVBZ2VudChpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nOyBhZ2VudD86IEFnZW50IH0+IHtcbiAgICAvLyBQRVJGT1JNQU5DRSBGSVg6IFVzZSBmaW5kQnlOYW1lKCkgaW5zdGVhZCBvZiBsaXN0KClcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgZXJyb3IgbWVzc2FnZSBmb3JtYXRcbiAgICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLm5vdEZvdW5kKEVsZW1lbnRUeXBlLkFHRU5ULCBpZGVudGlmaWVyKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBNRU1PUlkgTEVBSyBGSVg6IENoZWNrIGlmIGNsZWFudXAgaXMgbmVlZGVkIGJlZm9yZSBhZGRpbmdcbiAgICB0aGlzLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCgpO1xuXG4gICAgLy8gQWRkIHRvIGFjdGl2ZSBzZXQgKGJ5IG5hbWUsIHdoaWNoIGlzIHN0YWJsZSBhY3Jvc3MgcmVsb2FkcylcbiAgICB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuYWRkKGFnZW50Lm1ldGFkYXRhLm5hbWUpO1xuXG4gICAgLy8gVXBkYXRlIGFnZW50IHN0YXR1cyBpbiBtZW1vcnlcbiAgICBhd2FpdCBhZ2VudC5hY3RpdmF0ZSgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0FHRU5UX0FDVElWQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuYWN0aXZhdGVBZ2VudCcsXG4gICAgICBkZXRhaWxzOiBgQWdlbnQgYWN0aXZhdGVkOiAke2FnZW50Lm1ldGFkYXRhLm5hbWV9IHYke2FnZW50Lm1ldGFkYXRhLnZlcnNpb24gfHwgJ3Vua25vd24nfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBhZ2VudElkOiBhZ2VudC5pZCxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudC5tZXRhZGF0YS5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICBhdXRob3I6IGFnZW50Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgZ29hbENvdW50OiAoYWdlbnQubWV0YWRhdGEgYXMgYW55KS5nb2FsPy5wYXJhbWV0ZXJzPy5sZW5ndGggfHwgMCxcbiAgICAgICAgc3BlY2lhbGl6YXRpb25zOiBhZ2VudC5tZXRhZGF0YS5zcGVjaWFsaXphdGlvbnMsXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgQWdlbnQgYWN0aXZhdGVkOiAke2FnZW50Lm1ldGFkYXRhLm5hbWV9YCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBzdWNjZXNzIG1lc3NhZ2UgZm9ybWF0XG4gICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMuYWN0aXZhdGVkKEVsZW1lbnRUeXBlLkFHRU5ULCBhZ2VudC5tZXRhZGF0YS5uYW1lKSxcbiAgICAgIGFnZW50XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWFjdGl2YXRlIGFuIGFnZW50IGJ5IG5hbWUgb3IgaWRlbnRpZmllclxuICAgKlxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB1c2luZyBmaW5kQnlOYW1lKClcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDb25zaXN0ZW50IGVycm9yIG1lc3NhZ2VzIHVzaW5nIEVsZW1lbnRNZXNzYWdlc1xuICAgKi9cbiAgYXN5bmMgZGVhY3RpdmF0ZUFnZW50KGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlIGZvcm1hdFxuICAgICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMubm90Rm91bmQoRWxlbWVudFR5cGUuQUdFTlQsIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBmcm9tIGFjdGl2ZSBzZXRcbiAgICB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuZGVsZXRlKGFnZW50Lm1ldGFkYXRhLm5hbWUpO1xuXG4gICAgLy8gVXBkYXRlIGFnZW50IHN0YXR1cyBpbiBtZW1vcnlcbiAgICBhd2FpdCBhZ2VudC5kZWFjdGl2YXRlKCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnQUdFTlRfREVBQ1RJVkFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmRlYWN0aXZhdGVBZ2VudCcsXG4gICAgICBkZXRhaWxzOiBgQWdlbnQgZGVhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX0gdiR7YWdlbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYEFnZW50IGRlYWN0aXZhdGVkOiAke2FnZW50Lm1ldGFkYXRhLm5hbWV9YCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBzdWNjZXNzIG1lc3NhZ2UgZm9ybWF0XG4gICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMuZGVhY3RpdmF0ZWQoRWxlbWVudFR5cGUuQUdFTlQsIGFnZW50Lm1ldGFkYXRhLm5hbWUpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGFjdGl2ZSBhZ2VudHNcbiAgICovXG4gIGFzeW5jIGdldEFjdGl2ZUFnZW50cygpOiBQcm9taXNlPEFnZW50W10+IHtcbiAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gYWdlbnRzLmZpbHRlcihhID0+IHRoaXMuYWN0aXZlQWdlbnROYW1lcy5oYXMoYS5tZXRhZGF0YS5uYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhbiBhZ2VudCB3aXRoIGdvYWwgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBSZXR1cm5zIGNvbnRleHQgZm9yIExMTSB0byBkcml2ZSB0aGUgYWdlbnRpYyBsb29wLlxuICAgKiBUaGlzIG1ldGhvZDpcbiAgICogMS4gTG9hZHMgdGhlIGFnZW50IGNvbmZpZ3VyYXRpb25cbiAgICogMi4gVmFsaWRhdGVzIGFuZCByZW5kZXJzIHRoZSBnb2FsIHRlbXBsYXRlIHdpdGggcGFyYW1ldGVyc1xuICAgKiAzLiBBY3RpdmF0ZXMgY29uZmlndXJlZCBlbGVtZW50cyAoZWxlbWVudC1hZ25vc3RpYylcbiAgICogNC4gRXZhbHVhdGVzIHByb2dyYW1tYXRpYyBjb25zdHJhaW50cyBhbmQgcmlza1xuICAgKiA1LiBSZXR1cm5zIHN0cnVjdHVyZWQgY29udGV4dCBmb3IgTExNXG4gICAqXG4gICAqIFRoZSBMTE0gdGhlbiBkcml2ZXMgdGhlIGFnZW50aWMgbG9vcCB1c2luZyB0aGlzIGNvbnRleHQuXG4gICAqXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudGljIExvb3AgUmVkZXNpZ25cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTxFeGVjdXRlQWdlbnRSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gVGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgbWV0YWRhdGEgYXMgdjIgKG1heSBoYXZlIGdvYWwgY29uZmlnKVxuICAgICAgbGV0IG1ldGFkYXRhID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgdjIuMCBhZ2VudCB3aXRoIGdvYWwgY29uZmlndXJhdGlvblxuICAgICAgLy8gSWYgbm90LCBhdXRvLWNvbnZlcnQgVjEgdG8gVjIgaW4gcGxhY2UgKElzc3VlICM1ODcpXG4gICAgICBpZiAoIW1ldGFkYXRhLmdvYWwgfHwgIW1ldGFkYXRhLmdvYWwudGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKGlzVjFBZ2VudChtZXRhZGF0YSkpIHtcbiAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBhZ2VudC5leHRlbnNpb25zPy5pbnN0cnVjdGlvbnMgfHwgJyc7XG4gICAgICAgICAgY29uc3QgY29udmVyc2lvblJlc3VsdCA9IGNvbnZlcnRWMVRvVjIobWV0YWRhdGEsIGluc3RydWN0aW9ucyk7XG5cbiAgICAgICAgICBpZiAoY29udmVyc2lvblJlc3VsdC5jb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgIC8vIE1lcmdlIGNvbnZlcnRlZCBtZXRhZGF0YSBvbnRvIHRoZSBleGlzdGluZyBhZ2VudCAoaW4tcGxhY2UpXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1ldGFkYXRhLCBjb252ZXJzaW9uUmVzdWx0Lm1ldGFkYXRhKTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYWdlbnQubWV0YWRhdGEsIGNvbnZlcnNpb25SZXN1bHQubWV0YWRhdGEpO1xuXG4gICAgICAgICAgICAvLyBMb2cgY29udmVyc2lvbiB3YXJuaW5nc1xuICAgICAgICAgICAgaWYgKGNvbnZlcnNpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgJyR7bmFtZX0nIGF1dG8tY29udmVydGVkIGZyb20gVjEgdG8gVjIgaW4gcGxhY2VgLCB7XG4gICAgICAgICAgICAgICAgd2FybmluZ3M6IGNvbnZlcnNpb25SZXN1bHQud2FybmluZ3MsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTYXZlIHRoZSB1cGdyYWRlZCBhZ2VudCBiYWNrIHRvIGl0cyBvcmlnaW5hbCBmaWxlXG4gICAgICAgICAgICBjb25zdCB1cGdyYWRlZEZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCkpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlKGFnZW50LCB1cGdyYWRlZEZpbGVuYW1lKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBBZ2VudCAnJHtuYW1lfScgY29udmVydGVkIGZyb20gVjEgdG8gVjIgYW5kIHNhdmVkIGluIHBsYWNlYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEFnZW50ICcke25hbWV9JyBjYW5ub3QgYmUgZXhlY3V0ZWQ6IG1pc3NpbmcgZ29hbC50ZW1wbGF0ZSBhbmQgY29udmVyc2lvbiBmYWlsZWQuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFnZW50ICcke25hbWV9JyBpcyBub3QgYSB2Mi4wIGFnZW50LiBNaXNzaW5nIGdvYWwudGVtcGxhdGUgY29uZmlndXJhdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAyLiBDbG9uZSBwYXJhbWV0ZXJzIHRvIHByZXZlbnQgbXV0YXRpb24gb2YgY2FsbGVyJ3Mgb2JqZWN0IChJc3N1ZSAjMTE4KVxuICAgICAgY29uc3QgY2xvbmVkUGFyYW1ldGVycyA9IHN0cnVjdHVyZWRDbG9uZShwYXJhbWV0ZXJzKTtcblxuICAgICAgLy8gMmIuIFNlY3VyaXR5IHZhbGlkYXRpb24gb2YgdGVtcGxhdGUgcGFyYW1ldGVycyAoSXNzdWUgIzEwMylcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbWV0ZXJTZWN1cml0eShjbG9uZWRQYXJhbWV0ZXJzKTtcblxuICAgICAgLy8gMy4gVmFsaWRhdGUgcGFyYW1ldGVycyBhZ2FpbnN0IGdvYWwucGFyYW1ldGVycyBzY2hlbWFcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbWV0ZXJzKG1ldGFkYXRhLmdvYWwsIGNsb25lZFBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyA0LiBSZW5kZXIgZ29hbCB0ZW1wbGF0ZSBieSByZXBsYWNpbmcge3BhcmFtZXRlcn0gcGxhY2Vob2xkZXJzXG4gICAgICBjb25zdCByZW5kZXJlZEdvYWwgPSB0aGlzLnJlbmRlckdvYWxUZW1wbGF0ZShtZXRhZGF0YS5nb2FsLnRlbXBsYXRlLCBjbG9uZWRQYXJhbWV0ZXJzKTtcblxuICAgICAgLy8gNGIuIERldGVjdCB1bm1hdGNoZWQgcGxhY2Vob2xkZXJzIGFmdGVyIHJlbmRlcmluZyAoSXNzdWUgIzEyNilcbiAgICAgIGNvbnN0IHVubWF0Y2hlZFBsYWNlaG9sZGVycyA9IHRoaXMuZGV0ZWN0VW5tYXRjaGVkUGxhY2Vob2xkZXJzKHJlbmRlcmVkR29hbCk7XG4gICAgICBpZiAodW5tYXRjaGVkUGxhY2Vob2xkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1VubWF0Y2hlZCB0ZW1wbGF0ZSBwbGFjZWhvbGRlcnMgZGV0ZWN0ZWQgYWZ0ZXIgcmVuZGVyaW5nJywge1xuICAgICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgICB1bm1hdGNoZWQ6IHVubWF0Y2hlZFBsYWNlaG9sZGVycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIDUuIENyZWF0ZSBleGVjdXRpb24gY29udGV4dCBCRUZPUkUgYWN0aXZhdGluZyBlbGVtZW50cyAoSXNzdWUgIzEwOSAtIGNpcmN1bGFyIGFjdGl2YXRpb24gZGV0ZWN0aW9uKVxuICAgICAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQobmFtZSk7XG5cbiAgICAgIC8vIDViLiBTdGF0aWMgYWN0aXZhdGlvbiBjeWNsZSBkZXRlY3Rpb24gKElzc3VlICMzNzQpXG4gICAgICBpZiAobWV0YWRhdGEuYWN0aXZhdGVzPy5hZ2VudHM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjeWNsZVBhdGggPSBhd2FpdCB0aGlzLmRldGVjdEFjdGl2YXRpb25DeWNsZXMobmFtZSwgbWV0YWRhdGEuYWN0aXZhdGVzLmFnZW50cyk7XG4gICAgICAgIGlmIChjeWNsZVBhdGgpIHtcbiAgICAgICAgICBjb25zdCBjeWNsZVN0YXJ0ID0gY3ljbGVQYXRoLmluZGV4T2YoY3ljbGVQYXRoW2N5Y2xlUGF0aC5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgY29uc3QgY3ljbGUgPSBjeWNsZVBhdGguc2xpY2UoY3ljbGVTdGFydCk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEFnZW50TWFuYWdlci5mb3JtYXRDaXJjdWxhckFjdGl2YXRpb25FcnJvcihjeWNsZSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIEFjdGl2YXRlIGVsZW1lbnRzIChlbGVtZW50LWFnbm9zdGljKVxuICAgICAgY29uc3QgYWN0aXZlRWxlbWVudHM6IFJlY29yZDxzdHJpbmcsIEFycmF5PHsgbmFtZTogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfT4+ID0ge307XG4gICAgICBjb25zdCBhY3RpdmF0aW9uV2FybmluZ3M6IEFycmF5PHsgZWxlbWVudFR5cGU6IHN0cmluZzsgZWxlbWVudE5hbWU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PiA9IFtdO1xuXG4gICAgICBpZiAobWV0YWRhdGEuYWN0aXZhdGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2VsZW1lbnRUeXBlLCBlbGVtZW50TmFtZXNdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhLmFjdGl2YXRlcykpIHtcbiAgICAgICAgICBpZiAoIWVsZW1lbnROYW1lcyB8fCBlbGVtZW50TmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY3RpdmVFbGVtZW50c1tlbGVtZW50VHlwZV0gPSBbXTtcblxuICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudE5hbWUgb2YgZWxlbWVudE5hbWVzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBlbGVtZW50Q29udGVudCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudENvbnRlbnQoZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lLCBleGVjdXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgICAgYWN0aXZlRWxlbWVudHNbZWxlbWVudFR5cGVdLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGVsZW1lbnRDb250ZW50XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gSElHSC0xOiBSZS10aHJvdyBjaXJjdWxhciBhY3RpdmF0aW9uIGVycm9ycyBpbW1lZGlhdGVseSAoSXNzdWUgIzEwOSlcbiAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnQ2lyY3VsYXIgYWdlbnQgYWN0aXZhdGlvbiBkZXRlY3RlZCcpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICAgICAgICBhY3RpdmF0aW9uV2FybmluZ3MucHVzaCh7IGVsZW1lbnRUeXBlLCBlbGVtZW50TmFtZSwgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEFnZW50ICcke25hbWV9JzogZmFpbGVkIHRvIGFjdGl2YXRlICR7ZWxlbWVudFR5cGV9ICcke2VsZW1lbnROYW1lfScg4oCUICR7ZXJyb3JNZXNzYWdlfWApO1xuICAgICAgICAgICAgICAvLyBDb250aW51ZSB3aXRoIG90aGVyIGVsZW1lbnRzIHJhdGhlciB0aGFuIGZhaWxpbmcgY29tcGxldGVseVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyA3LiBCdWlsZCB0aGUgcmVzdWx0IHdpdGggYWxsIGNvbnRleHQgKGluaXRpYWxpemUgd2l0aCBkZWZhdWx0IHNhZmV0eSB0aWVyKVxuICAgICAgY29uc3QgcmVzdWx0OiBFeGVjdXRlQWdlbnRSZXN1bHQgPSB7XG4gICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgZ29hbDogcmVuZGVyZWRHb2FsLFxuICAgICAgICBhY3RpdmVFbGVtZW50cyxcbiAgICAgICAgYWN0aXZhdGlvbldhcm5pbmdzOiBhY3RpdmF0aW9uV2FybmluZ3MubGVuZ3RoID4gMCA/IGFjdGl2YXRpb25XYXJuaW5ncyA6IHVuZGVmaW5lZCxcbiAgICAgICAgLy8gSXNzdWUgIzEyNjogV2FybiBhYm91dCB1bm1hdGNoZWQgdGVtcGxhdGUgcGxhY2Vob2xkZXJzXG4gICAgICAgIHRlbXBsYXRlV2FybmluZ3M6IHVubWF0Y2hlZFBsYWNlaG9sZGVycy5sZW5ndGggPiAwXG4gICAgICAgICAgPyB1bm1hdGNoZWRQbGFjZWhvbGRlcnMubWFwKHAgPT4gYFVubWF0Y2hlZCB0ZW1wbGF0ZSBwbGFjZWhvbGRlcjogeyR7cH19YClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYXZhaWxhYmxlVG9vbHM6IG1ldGFkYXRhLnRvb2xzPy5hbGxvd2VkIHx8IFtdLFxuICAgICAgICBzdWNjZXNzQ3JpdGVyaWE6IG1ldGFkYXRhLmdvYWwuc3VjY2Vzc0NyaXRlcmlhIHx8IFtdLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IG1ldGFkYXRhLnN5c3RlbVByb21wdCxcbiAgICAgICAgc2FmZXR5VGllcjogJ2Fkdmlzb3J5JywgLy8gRGVmYXVsdCwgd2lsbCBiZSB1cGRhdGVkIGJlbG93XG4gICAgICB9O1xuXG4gICAgICAvLyA4LiBDcmVhdGUgYW5kIHBlcnNpc3QgdGhlIGdvYWwgZm9yIExMTSB0cmFja2luZ1xuICAgICAgLy8gVGhpcyBhbGxvd3MgcmVjb3JkX2FnZW50X3N0ZXAgdG8gZmluZCBhbmQgdXBkYXRlIHRoZSBnb2FsXG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgZ29hbCB1c2luZyBhZ2VudC5hZGRHb2FsKCkgd2hpY2ggaGFuZGxlcyB2YWxpZGF0aW9uIGFuZCBzYW5pdGl6YXRpb25cbiAgICAgIGNvbnN0IG5ld0dvYWwgPSBhZ2VudC5hZGRHb2FsKHtcbiAgICAgICAgZGVzY3JpcHRpb246IHJlbmRlcmVkR29hbCxcbiAgICAgICAgcHJpb3JpdHk6ICdtZWRpdW0nLFxuICAgICAgICBpbXBvcnRhbmNlOiA1LFxuICAgICAgICB1cmdlbmN5OiA1LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBnb2FsIHN0YXR1cyB0byBpbl9wcm9ncmVzcyBzaW5jZSBleGVjdXRpb24gaGFzIHN0YXJ0ZWRcbiAgICAgIG5ld0dvYWwuc3RhdHVzID0gJ2luX3Byb2dyZXNzJztcblxuICAgICAgY29uc3QgZXhlY1Nhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoZXhlY1Nhbml0aXplZE5hbWUpKTtcblxuICAgICAgLy8gU3RvcmUgZ29hbElkIGluIHJlc3VsdCBmb3IgTExNIHRvIHVzZSB3aXRoIHJlY29yZF9hZ2VudF9zdGVwXG4gICAgICByZXN1bHQuZ29hbElkID0gbmV3R29hbC5pZDtcblxuICAgICAgLy8gRml4ICM0NDU6IEluY2x1ZGUgc3RhdGVWZXJzaW9uIHNvIHN1YnNlcXVlbnQgY2FsbHMgY2FuIGRvIHZlcnNpb24tYXdhcmUgb3BlcmF0aW9uc1xuICAgICAgY29uc3QgcG9zdFNhdmVTdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgICByZXN1bHQuc3RhdGVWZXJzaW9uID0gcG9zdFNhdmVTdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMTtcblxuICAgICAgLy8gQ2FsbCB2YWxpZGF0ZUdvYWxTZWN1cml0eSBhbmQgYWRkIHdhcm5pbmdzIHRvIHJlc3VsdFxuICAgICAgY29uc3Qgc2VjdXJpdHlWYWxpZGF0aW9uID0gYWdlbnQudmFsaWRhdGVHb2FsU2VjdXJpdHkocmVuZGVyZWRHb2FsKTtcbiAgICAgIGlmIChzZWN1cml0eVZhbGlkYXRpb24ud2FybmluZ3MgJiYgc2VjdXJpdHlWYWxpZGF0aW9uLndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0LnNlY3VyaXR5V2FybmluZ3MgPSBzZWN1cml0eVZhbGlkYXRpb24ud2FybmluZ3M7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGwgZXZhbHVhdGVDb25zdHJhaW50cyBhbmQgYWRkIHRvIHJlc3VsdFxuICAgICAgcmVzdWx0LmNvbnN0cmFpbnRzID0gYWdlbnQuZXZhbHVhdGVDb25zdHJhaW50cyhuZXdHb2FsKTtcblxuICAgICAgLy8gQ2FsbCBhc3Nlc3NSaXNrIGFuZCBhZGQgdG8gcmVzdWx0XG4gICAgICByZXN1bHQucmlza0Fzc2Vzc21lbnQgPSBhZ2VudC5hc3Nlc3NSaXNrKCdleGVjdXRlJywgbmV3R29hbCwge30pO1xuXG4gICAgICAvLyBDYWxsIGNhbGN1bGF0ZVByaW9yaXR5U2NvcmUgYW5kIGFkZCB0byByZXN1bHRcbiAgICAgIHJlc3VsdC5wcmlvcml0eVNjb3JlID0gYWdlbnQuY2FsY3VsYXRlUHJpb3JpdHlTY29yZShuZXdHb2FsKTtcblxuICAgICAgLy8gOS4gRGV0ZXJtaW5lIHNhZmV0eSB0aWVyIGJhc2VkIG9uIHJpc2sgYXNzZXNzbWVudCBhbmQgc2VjdXJpdHkgd2FybmluZ3NcbiAgICAgIC8vIChOb3RlOiBleGVjdXRpb25Db250ZXh0IGFscmVhZHkgY3JlYXRlZCBlYXJsaWVyIGZvciBjaXJjdWxhciBkZXRlY3Rpb24pXG4gICAgICBjb25zdCBzYWZldHlUaWVyUmVzdWx0ID0gZGV0ZXJtaW5lU2FmZXR5VGllcihcbiAgICAgICAgcmVzdWx0LnJpc2tBc3Nlc3NtZW50Py5zY29yZSB8fCAwLFxuICAgICAgICByZXN1bHQuc2VjdXJpdHlXYXJuaW5ncyB8fCBbXSxcbiAgICAgICAgcmVuZGVyZWRHb2FsLFxuICAgICAgICBERUZBVUxUX1NBRkVUWV9DT05GSUcsXG4gICAgICAgIGV4ZWN1dGlvbkNvbnRleHRcbiAgICAgICk7XG5cbiAgICAgIC8vIDEwLiBTZXQgc2FmZXR5IHRpZXIgYW5kIHJlbGF0ZWQgZmllbGRzXG4gICAgICByZXN1bHQuc2FmZXR5VGllciA9IHNhZmV0eVRpZXJSZXN1bHQudGllcjtcbiAgICAgIHJlc3VsdC5zYWZldHlUaWVyUmVzdWx0ID0gc2FmZXR5VGllclJlc3VsdDtcbiAgICAgIHJlc3VsdC5leGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcblxuICAgICAgLy8gMTEuIEFkZCB0aWVyLXNwZWNpZmljIHJlc3BvbnNlc1xuICAgICAgc3dpdGNoIChzYWZldHlUaWVyUmVzdWx0LnRpZXIpIHtcbiAgICAgICAgY2FzZSAnY29uZmlybSc6XG4gICAgICAgICAgcmVzdWx0LmNvbmZpcm1hdGlvblJlcXVpcmVkID0gY3JlYXRlQ29uZmlybWF0aW9uUmVxdWVzdChcbiAgICAgICAgICAgICdPcGVyYXRpb24gcmVxdWlyZXMgY29uZmlybWF0aW9uJyxcbiAgICAgICAgICAgIHNhZmV0eVRpZXJSZXN1bHQuZmFjdG9yc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAndmVyaWZ5JzpcbiAgICAgICAgICByZXN1bHQudmVyaWZpY2F0aW9uUmVxdWlyZWQgPSBjcmVhdGVWZXJpZmljYXRpb25DaGFsbGVuZ2UoXG4gICAgICAgICAgICBzYWZldHlUaWVyUmVzdWx0LmZhY3RvcnMuam9pbignOyAnKSxcbiAgICAgICAgICAgICdkaXNwbGF5X2NvZGUnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdkYW5nZXJfem9uZSc6XG4gICAgICAgICAgcmVzdWx0LmRhbmdlclpvbmVCbG9ja2VkID0gY3JlYXRlRGFuZ2VyWm9uZU9wZXJhdGlvbihcbiAgICAgICAgICAgICdhZ2VudF9leGVjdXRpb24nLFxuICAgICAgICAgICAgc2FmZXR5VGllclJlc3VsdC5mYWN0b3JzLmpvaW4oJzsgJyksXG4gICAgICAgICAgICBERUZBVUxUX1NBRkVUWV9DT05GSUcuZGFuZ2VyWm9uZS5lbmFibGVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBBbHNvIGFkZCB2ZXJpZmljYXRpb24gaWYgbm90IGJsb2NrZWRcbiAgICAgICAgICBpZiAoIXJlc3VsdC5kYW5nZXJab25lQmxvY2tlZC5ibG9ja2VkKSB7XG4gICAgICAgICAgICByZXN1bHQudmVyaWZpY2F0aW9uUmVxdWlyZWQgPSByZXN1bHQuZGFuZ2VyWm9uZUJsb2NrZWQudmVyaWZpY2F0aW9uUmVxdWlyZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Fkdmlzb3J5JzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBObyBhZGRpdGlvbmFsIGFjdGlvbiBuZWVkZWQgZm9yIGFkdmlzb3J5IHRpZXJcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnQUdFTlRfRVhFQ1VURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5leGVjdXRlQWdlbnQnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgZXhlY3V0ZWQ6ICR7bmFtZX0gdiR7YWdlbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9IChzYWZldHk6ICR7c2FmZXR5VGllclJlc3VsdC50aWVyfSlgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICAgIHNhZmV0eVRpZXI6IHNhZmV0eVRpZXJSZXN1bHQudGllcixcbiAgICAgICAgICByaXNrU2NvcmU6IHNhZmV0eVRpZXJSZXN1bHQucmlza1Njb3JlLFxuICAgICAgICAgIHBhcmFtZXRlcktleXM6IE9iamVjdC5rZXlzKHBhcmFtZXRlcnMgfHwge30pLFxuICAgICAgICAgIGdvYWxDb3VudDogKG1ldGFkYXRhIGFzIGFueSkuZ29hbD8ucGFyYW1ldGVycz8ubGVuZ3RoIHx8IDAsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBleGVjdXRlIGFnZW50ICcke25hbWV9JzpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VjdXJpdHkgdmFsaWRhdGlvbiBmb3IgdGVtcGxhdGUgcGFyYW1ldGVycyAoSXNzdWUgIzEwMykuXG4gICAqIENoZWNrcyBmb3IgcHJvdG90eXBlIHBvbGx1dGlvbiwgVW5pY29kZSBpbmplY3Rpb24sIGFuZCBvdmVyc2l6ZWQgcGF5bG9hZHMuXG4gICAqIE11c3QgYmUgY2FsbGVkIEJFRk9SRSB0ZW1wbGF0ZSByZW5kZXJpbmcuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUGFyYW1ldGVyU2VjdXJpdHkocGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICAvLyAxLiBQcm90b3R5cGUgcG9sbHV0aW9uIGNoZWNrIOKAlCByZWplY3QgZGFuZ2Vyb3VzIGtleXNcbiAgICBjb25zdCBGT1JCSURERU5fS0VZUyA9IFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpKSB7XG4gICAgICBpZiAoRk9SQklEREVOX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIudmFsaWRhdGVQYXJhbWV0ZXJTZWN1cml0eScsXG4gICAgICAgICAgZGV0YWlsczogYFByb3RvdHlwZSBwb2xsdXRpb24gYXR0ZW1wdCB2aWEgcGFyYW1ldGVyIGtleTogJyR7a2V5fSdgLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3JiaWRkZW4gcGFyYW1ldGVyIGtleTogJyR7a2V5fScgKHBvdGVudGlhbCBwcm90b3R5cGUgcG9sbHV0aW9uKWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIExpbWl0IHBhcmFtZXRlciBjb3VudCB0byBwcmV2ZW50IHJlc291cmNlIGV4aGF1c3Rpb25cbiAgICBjb25zdCBNQVhfUEFSQU1FVEVSUyA9IDUwO1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKS5sZW5ndGggPiBNQVhfUEFSQU1FVEVSUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUb28gbWFueSBwYXJhbWV0ZXJzOiAke09iamVjdC5rZXlzKHBhcmFtZXRlcnMpLmxlbmd0aH0gZXhjZWVkcyBtYXhpbXVtIG9mICR7TUFYX1BBUkFNRVRFUlN9YCk7XG4gICAgfVxuXG4gICAgLy8gMy4gVW5pY29kZSBub3JtYWxpemF0aW9uIHZpYSBJbnB1dE5vcm1hbGl6ZXJcbiAgICBjb25zdCBub3JtYWxpemVkID0gSW5wdXROb3JtYWxpemVyLm5vcm1hbGl6ZShwYXJhbWV0ZXJzLCAnJC5wYXJhbWV0ZXJzJyk7XG4gICAgaWYgKG5vcm1hbGl6ZWQuaGFzSGlnaE9yQ3JpdGljYWxJc3N1ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRlbXBsYXRlIHBhcmFtZXRlciBzZWN1cml0eSB2YWxpZGF0aW9uIGZhaWxlZDogJHtub3JtYWxpemVkLmVycm9ycy5qb2luKCc7ICcpfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgbm9ybWFsaXplZCB2YWx1ZXMgYmFjayAoaW4tcGxhY2UsIHNpbmNlIHdlIGFscmVhZHkgY2xvbmVkKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRhID0gbm9ybWFsaXplZC5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG5vcm1hbGl6ZWREYXRhKSkge1xuICAgICAgcGFyYW1ldGVyc1trZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1RlbXBsYXRlIHBhcmFtZXRlciBub3JtYWxpemF0aW9uIHdhcm5pbmdzJywge1xuICAgICAgICB3YXJuaW5nczogbm9ybWFsaXplZC53YXJuaW5ncyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzIGFnYWluc3QgZ29hbCBwYXJhbWV0ZXIgc2NoZW1hXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUGFyYW1ldGVycyhcbiAgICBnb2FsQ29uZmlnOiBBZ2VudEdvYWxDb25maWcsXG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW1EZWZzID0gZ29hbENvbmZpZy5wYXJhbWV0ZXJzIHx8IFtdO1xuXG4gICAgLy8gQ2hlY2sgYWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIHByZXNlbnRcbiAgICBmb3IgKGNvbnN0IHBhcmFtRGVmIG9mIHBhcmFtRGVmcykge1xuICAgICAgaWYgKHBhcmFtRGVmLnJlcXVpcmVkICYmICEocGFyYW1EZWYubmFtZSBpbiBwYXJhbWV0ZXJzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiAke3BhcmFtRGVmLm5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHlwZSBjaGVjayBwcm92aWRlZCBwYXJhbWV0ZXJzXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykpIHtcbiAgICAgIGNvbnN0IHBhcmFtRGVmID0gcGFyYW1EZWZzLmZpbmQocCA9PiBwLm5hbWUgPT09IGtleSk7XG4gICAgICBpZiAoIXBhcmFtRGVmKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBVbmtub3duIHBhcmFtZXRlciAnJHtrZXl9JyBwcm92aWRlZCB0byBhZ2VudGApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVHlwZSB2YWxpZGF0aW9uXG4gICAgICBjb25zdCBhY3R1YWxUeXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgaWYgKHBhcmFtRGVmLnR5cGUgPT09ICdzdHJpbmcnICYmIGFjdHVhbFR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGFyYW1ldGVyICcke2tleX0nIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke2FjdHVhbFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtRGVmLnR5cGUgPT09ICdudW1iZXInICYmIGFjdHVhbFR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGFyYW1ldGVyICcke2tleX0nIG11c3QgYmUgYSBudW1iZXIsIGdvdCAke2FjdHVhbFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtRGVmLnR5cGUgPT09ICdib29sZWFuJyAmJiBhY3R1YWxUeXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgbXVzdCBiZSBhIGJvb2xlYW4sIGdvdCAke2FjdHVhbFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBBZHZpc29yeSBsZW5ndGggd2FybmluZyBmb3Igc3RyaW5nIHZhbHVlcyAoZGVmZW5zZS1pbi1kZXB0aCwgZG9lcyBub3QgdGhyb3cpXG4gICAgICBpZiAoYWN0dWFsVHlwZSA9PT0gJ3N0cmluZycgJiYgKHZhbHVlIGFzIHN0cmluZykubGVuZ3RoID4gQUdFTlRfTElNSVRTLk1BWF9HT0FMX0xFTkdUSCkge1xuICAgICAgICBsb2dnZXIud2FybignUGFyYW1ldGVyIHN0cmluZyB2YWx1ZSBleGNlZWRzIE1BWF9HT0FMX0xFTkdUSCAoYWR2aXNvcnkpJywge1xuICAgICAgICAgIHBhcmFtTmFtZToga2V5LFxuICAgICAgICAgIHZhbHVlTGVuZ3RoOiAodmFsdWUgYXMgc3RyaW5nKS5sZW5ndGgsXG4gICAgICAgICAgbWF4TGVuZ3RoOiBBR0VOVF9MSU1JVFMuTUFYX0dPQUxfTEVOR1RILFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBseSBkZWZhdWx0cyBmb3Igb3B0aW9uYWwgcGFyYW1ldGVycyBub3QgcHJvdmlkZWRcbiAgICBmb3IgKGNvbnN0IHBhcmFtRGVmIG9mIHBhcmFtRGVmcykge1xuICAgICAgaWYgKCFwYXJhbURlZi5yZXF1aXJlZCAmJiAhKHBhcmFtRGVmLm5hbWUgaW4gcGFyYW1ldGVycykgJiYgcGFyYW1EZWYuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhcmFtZXRlcnNbcGFyYW1EZWYubmFtZV0gPSBwYXJhbURlZi5kZWZhdWx0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgZ29hbCB0ZW1wbGF0ZSBieSByZXBsYWNpbmcge3BhcmFtZXRlcn0gcGxhY2Vob2xkZXJzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckdvYWxUZW1wbGF0ZShcbiAgICB0ZW1wbGF0ZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHJlbmRlcmVkID0gdGVtcGxhdGU7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykpIHtcbiAgICAgIC8vIEVzY2FwZSBrZXkgdG8gcHJldmVudCByZWdleCBtZXRhY2hhcmFjdGVycyBmcm9tIGNhdXNpbmcgUmVEb1MgKElzc3VlICMxMDMpXG4gICAgICBjb25zdCBlc2NhcGVkS2V5ID0gU2FmZVJlZ2V4LmVzY2FwZShrZXkpO1xuICAgICAgcmVuZGVyZWQgPSByZW5kZXJlZC5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFx7JHtlc2NhcGVkS2V5fVxcXFx9YCwgJ2cnKSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLy8gQ2FwIHJlbmRlcmVkIGdvYWwgbGVuZ3RoIHRvIHByZXZlbnQgb3ZlcnNpemVkIHBheWxvYWRzXG4gICAgaWYgKHJlbmRlcmVkLmxlbmd0aCA+IEFHRU5UX0xJTUlUUy5NQVhfUkVOREVSRURfR09BTF9MRU5HVEgpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZW5kZXJlZCBnb2FsIGV4Y2VlZHMgTUFYX1JFTkRFUkVEX0dPQUxfTEVOR1RILCB0cnVuY2F0aW5nJywge1xuICAgICAgICByZW5kZXJlZExlbmd0aDogcmVuZGVyZWQubGVuZ3RoLFxuICAgICAgICBtYXhMZW5ndGg6IEFHRU5UX0xJTUlUUy5NQVhfUkVOREVSRURfR09BTF9MRU5HVEgsXG4gICAgICB9KTtcbiAgICAgIHJlbmRlcmVkID0gcmVuZGVyZWQuc3Vic3RyaW5nKDAsIEFHRU5UX0xJTUlUUy5NQVhfUkVOREVSRURfR09BTF9MRU5HVEgpO1xuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3QgdW5tYXRjaGVkIHtwbGFjZWhvbGRlcn0gcGF0dGVybnMgcmVtYWluaW5nIGFmdGVyIHRlbXBsYXRlIHJlbmRlcmluZy5cbiAgICogUmV0dXJucyBhcnJheSBvZiBwbGFjZWhvbGRlciBuYW1lcyBmb3VuZCBpbiB0aGUgcmVuZGVyZWQgc3RyaW5nLlxuICAgKiBJc3N1ZSAjMTI2OiBXYXJuIHdoZW4gdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgbWlzc2luZy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0VW5tYXRjaGVkUGxhY2Vob2xkZXJzKHJlbmRlcmVkOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGxhY2Vob2xkZXJQYXR0ZXJuID0gL1xceyhbYS16QS1aX11bYS16QS1aMC05X10qKVxcfS9nO1xuICAgIGNvbnN0IHVubWF0Y2hlZDogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG4gICAgd2hpbGUgKChtYXRjaCA9IHBsYWNlaG9sZGVyUGF0dGVybi5leGVjKHJlbmRlcmVkKSkgIT09IG51bGwpIHtcbiAgICAgIHVubWF0Y2hlZC5wdXNoKG1hdGNoWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIHVubWF0Y2hlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIGEgY29uc2lzdGVudCBlcnJvciBtZXNzYWdlIGZvciBjaXJjdWxhciBhY3RpdmF0aW9uIGRldGVjdGlvbi5cbiAgICogVXNlZCBieSBib3RoIHRoZSBzdGF0aWMgcHJlLWZsaWdodCBjaGVjayBhbmQgdGhlIHJ1bnRpbWUgY2hhaW4gY2hlY2suXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmb3JtYXRDaXJjdWxhckFjdGl2YXRpb25FcnJvcihjeWNsZVBhdGg6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBhZ2VudE5hbWUgPSBjeWNsZVBhdGhbY3ljbGVQYXRoLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiAoXG4gICAgICBgQ2lyY3VsYXIgYWdlbnQgYWN0aXZhdGlvbiBkZXRlY3RlZCAoY3ljbGUgb2YgJHtjeWNsZVBhdGgubGVuZ3RoIC0gMX0pOiBgICtcbiAgICAgIGAke2N5Y2xlUGF0aC5qb2luKCcg4oaSICcpfS4gYCArXG4gICAgICBgQWdlbnQgJyR7YWdlbnROYW1lfScgY2Fubm90IGFjdGl2YXRlIGl0c2VsZiBkaXJlY3RseSBvciBpbmRpcmVjdGx5LmBcbiAgICApO1xuICB9XG5cbiAgLyoqIFNhZmV0eSBsaW1pdHMgZm9yIGFjdGl2YXRpb24gZ3JhcGggdHJhdmVyc2FsICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9BQ1RJVkFUSU9OX0RFUFRIID0gMTA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9OT0RFU19WSVNJVEVEID0gMTAwO1xuXG4gIC8qKlxuICAgKiBTdGF0aWMgYWN0aXZhdGlvbiBjeWNsZSBkZXRlY3Rpb24g4oCUIExheWVyIDEgb2YgZHVhbC1kZXRlY3Rpb24gc3RyYXRlZ3kgKElzc3VlICMzNzQpXG4gICAqXG4gICAqIFBlcmZvcm1zIGFzeW5jIERGUyBvbiB0aGUgYWN0aXZhdGlvbiBncmFwaCB0byBkZXRlY3QgY3ljbGVzIEJFRk9SRSBleGVjdXRpb24gYmVnaW5zLlxuICAgKiBUaGlzIGlzIGEgcHJlLWZsaWdodCBjaGVjayB0aGF0IHByZXZlbnRzIGNpcmN1bGFyIGFjdGl2YXRpb24gY2hhaW5zIGZyb20gYmVpbmcgYXR0ZW1wdGVkLlxuICAgKlxuICAgKiBMYXllciAxICh0aGlzIG1ldGhvZCk6IFN0YXRpYyBncmFwaCBhbmFseXNpcyDigJQgd2Fsa3MgdGhlIGFjdGl2YXRpb24gZ3JhcGggZnJvbSB0aGUgcm9vdFxuICAgKiBhZ2VudCwgbG9hZGluZyBlYWNoIGFnZW50J3MgYGFjdGl2YXRlcy5hZ2VudHNgIG1ldGFkYXRhLiBDYXRjaGVzIGFsbCBjeWNsZXMgcmVhY2hhYmxlXG4gICAqIGZyb20gdGhlIHJvb3Qgd2l0aG91dCBleGVjdXRpbmcgYW55IGFnZW50cy4gQm91bmRlZCBieSBNQVhfQUNUSVZBVElPTl9ERVBUSCBhbmRcbiAgICogTUFYX05PREVTX1ZJU0lURUQgdG8gcHJldmVudCByZXNvdXJjZSBleGhhdXN0aW9uIGZyb20gbGFyZ2UgYWN5Y2xpYyBncmFwaHMuXG4gICAqXG4gICAqIExheWVyIDIgKGdldEVsZW1lbnRDb250ZW50IHJ1bnRpbWUgY2hlY2spOiBEZWZlbnNlLWluLWRlcHRoIOKAlCBndWFyZHMgYWdhaW5zdCBlZGdlIGNhc2VzXG4gICAqIGxpa2UgZHluYW1pY2FsbHktY29uc3RydWN0ZWQgYWN0aXZhdGlvbiBjaGFpbnMgb3IgYWdlbnRzIG1vZGlmaWVkIGJldHdlZW4gdGhlIHN0YXRpY1xuICAgKiBjaGVjayBhbmQgYWN0dWFsIGV4ZWN1dGlvbi4gU2VlIGdldEVsZW1lbnRDb250ZW50IGZvciBkZXRhaWxzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9vdE5hbWUgLSBUaGUgcm9vdCBhZ2VudCBuYW1lIGluaXRpYXRpbmcgdGhlIGFjdGl2YXRpb24gY2hhaW5cbiAgICogQHBhcmFtIGFjdGl2YXRlZEFnZW50cyAtIFRoZSBpbW1lZGlhdGUgYWdlbnRzIGFjdGl2YXRlZCBieSB0aGUgcm9vdFxuICAgKiBAcmV0dXJucyBUaGUgY3ljbGUgcGF0aCBhcnJheSBpZiBhIGN5Y2xlIGV4aXN0cywgbnVsbCBvdGhlcndpc2VcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGV0ZWN0QWN0aXZhdGlvbkN5Y2xlcyhcbiAgICByb290TmFtZTogc3RyaW5nLFxuICAgIGFjdGl2YXRlZEFnZW50czogc3RyaW5nW11cbiAgKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICAvLyBDYWNoZSBsb2FkZWQgYWdlbnRzIHRvIGF2b2lkIHJlZHVuZGFudCBJL08gZHVyaW5nIERGU1xuICAgIGNvbnN0IGFnZW50Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10gfCBudWxsPigpO1xuXG4gICAgLy8gSGVscGVyOiBsb2FkIGFuIGFnZW50J3MgYWN0aXZhdGVzLmFnZW50cyBsaXN0IChjYWNoZWQpXG4gICAgY29uc3QgZ2V0QWN0aXZhdGVkQWdlbnRzID0gYXN5bmMgKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGFnZW50Q2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgICByZXR1cm4gYWdlbnRDYWNoZS5nZXQoY2FjaGVLZXkpIHx8IFtdO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQobmFtZSk7XG4gICAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgJyR7bmFtZX0nIHJlZmVyZW5jZWQgaW4gYWN0aXZhdGVzLmFnZW50cyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgZHVyaW5nIGN5Y2xlIGRldGVjdGlvbmApO1xuICAgICAgICAgIGFnZW50Q2FjaGUuc2V0KGNhY2hlS2V5LCBudWxsKTtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcbiAgICAgICAgY29uc3QgYWdlbnRzID0gbWV0YS5hY3RpdmF0ZXM/LmFnZW50cyB8fCBbXTtcbiAgICAgICAgYWdlbnRDYWNoZS5zZXQoY2FjaGVLZXksIGFnZW50cyk7XG4gICAgICAgIHJldHVybiBhZ2VudHM7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEFnZW50ICcke25hbWV9JyByZWZlcmVuY2VkIGluIGFjdGl2YXRlcy5hZ2VudHMgY291bGQgbm90IGJlIHJlc29sdmVkIGR1cmluZyBjeWNsZSBkZXRlY3Rpb25gKTtcbiAgICAgICAgYWdlbnRDYWNoZS5zZXQoY2FjaGVLZXksIG51bGwpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFRyYWNrcyBub2RlcyB3aG9zZSBlbnRpcmUgc3VidHJlZSBoYXMgYmVlbiBleHBsb3JlZCB3aXRob3V0IGZpbmRpbmcgYSBjeWNsZS5cbiAgICAvLyBQcmV2ZW50cyBleHBvbmVudGlhbCByZS1leHBsb3JhdGlvbiBpbiBkaWFtb25kL2NvbnZlcmdlbnQgZ3JhcGhzLlxuICAgIGNvbnN0IGZ1bGx5RXhwbG9yZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgbm9kZXNWaXNpdGVkID0gMDtcblxuICAgIC8vIERGUyDigJQgc3RhY2sgZW50cmllczogW2N1cnJlbnRBZ2VudCwgcGF0aFNvRmFyLCBwYXRoU2V0TG93ZXJdXG4gICAgLy8gcGF0aFNldExvd2VyIGlzIGEgU2V0PHN0cmluZz4gb2YgbG93ZXJjYXNlZCBuYW1lcyBmb3IgTygxKSBjeWNsZSBjaGVja3NcbiAgICBjb25zdCBzdGFjazogQXJyYXk8W3N0cmluZywgc3RyaW5nW10sIFNldDxzdHJpbmc+XT4gPSBbXTtcblxuICAgIGNvbnN0IHJvb3RMb3dlciA9IHJvb3ROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBhY3RpdmF0ZWRBZ2VudHMpIHtcbiAgICAgIC8vIFNlbGYtbG9vcDogYWdlbnQgZGlyZWN0bHkgYWN0aXZhdGVzIGl0c2VsZlxuICAgICAgaWYgKGNoaWxkLnRvTG93ZXJDYXNlKCkgPT09IHJvb3RMb3dlcikge1xuICAgICAgICByZXR1cm4gW3Jvb3ROYW1lLCBjaGlsZF07XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoU2V0ID0gbmV3IFNldDxzdHJpbmc+KFtyb290TG93ZXIsIGNoaWxkLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgIHN0YWNrLnB1c2goW2NoaWxkLCBbcm9vdE5hbWUsIGNoaWxkXSwgcGF0aFNldF0pO1xuICAgIH1cblxuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbY3VycmVudCwgY3VycmVudFBhdGgsIHBhdGhTZXRdID0gc3RhY2sucG9wKCkhO1xuXG4gICAgICBub2Rlc1Zpc2l0ZWQrKztcbiAgICAgIGlmIChub2Rlc1Zpc2l0ZWQgPiBBZ2VudE1hbmFnZXIuTUFYX05PREVTX1ZJU0lURUQpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEFjdGl2YXRpb24gY3ljbGUgZGV0ZWN0aW9uIGZvciAnJHtyb290TmFtZX0nIGFib3J0ZWQ6IGV4Y2VlZGVkICR7QWdlbnRNYW5hZ2VyLk1BWF9OT0RFU19WSVNJVEVEfSBub2RlcyB2aXNpdGVkLiBgICtcbiAgICAgICAgICBgVGhlIGFjdGl2YXRpb24gZ3JhcGggbWF5IGJlIHRvbyBsYXJnZS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudFBhdGgubGVuZ3RoID4gQWdlbnRNYW5hZ2VyLk1BWF9BQ1RJVkFUSU9OX0RFUFRIICsgMSkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgQWN0aXZhdGlvbiBjeWNsZSBkZXRlY3Rpb24gZm9yICcke3Jvb3ROYW1lfScgaGl0IGRlcHRoIGxpbWl0IG9mICR7QWdlbnRNYW5hZ2VyLk1BWF9BQ1RJVkFUSU9OX0RFUFRIfS4gYCArXG4gICAgICAgICAgYFNraXBwaW5nIGRlZXBlciBicmFuY2hlcy5gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50TG93ZXIgPSBjdXJyZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoZnVsbHlFeHBsb3JlZC5oYXMoY3VycmVudExvd2VyKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZCB0aGlzIGFnZW50J3MgYWN0aXZhdGlvbnNcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gYXdhaXQgZ2V0QWN0aXZhdGVkQWdlbnRzKGN1cnJlbnQpO1xuXG4gICAgICBsZXQgZm91bmRDeWNsZSA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICBjb25zdCBjaGlsZExvd2VyID0gY2hpbGQudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgY3ljbGU6IGRvZXMgdGhpcyBjaGlsZCBhcHBlYXIgZWFybGllciBpbiB0aGUgcGF0aD9cbiAgICAgICAgaWYgKHBhdGhTZXQuaGFzKGNoaWxkTG93ZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIFsuLi5jdXJyZW50UGF0aCwgY2hpbGRdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmdWxseUV4cGxvcmVkLmhhcyhjaGlsZExvd2VyKSkge1xuICAgICAgICAgIGNvbnN0IG5ld1BhdGhTZXQgPSBuZXcgU2V0KHBhdGhTZXQpO1xuICAgICAgICAgIG5ld1BhdGhTZXQuYWRkKGNoaWxkTG93ZXIpO1xuICAgICAgICAgIHN0YWNrLnB1c2goW2NoaWxkLCBbLi4uY3VycmVudFBhdGgsIGNoaWxkXSwgbmV3UGF0aFNldF0pO1xuICAgICAgICAgIGZvdW5kQ3ljbGUgPSB0cnVlOyAvLyBoYXMgY2hpbGRyZW4gdG8gZXhwbG9yZSwgbm90IGZ1bGx5IGV4cGxvcmVkIHlldFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIHVuZXhwbG9yZWQgY2hpbGRyZW4sIHRoaXMgbm9kZSdzIHN1YnRyZWUgaXMgY3ljbGUtZnJlZVxuICAgICAgaWYgKCFmb3VuZEN5Y2xlKSB7XG4gICAgICAgIGZ1bGx5RXhwbG9yZWQuYWRkKGN1cnJlbnRMb3dlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbnRlbnQgZnJvbSBhbiBlbGVtZW50IChlbGVtZW50LWFnbm9zdGljKVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRFbGVtZW50Q29udGVudChcbiAgICBlbGVtZW50VHlwZTogc3RyaW5nLFxuICAgIGVsZW1lbnROYW1lOiBzdHJpbmcsXG4gICAgZXhlY3V0aW9uQ29udGV4dD86IEV4ZWN1dGlvbkNvbnRleHRcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBHZXQgdGhlIHN0YXRpYyByZXNvbHZlclxuICAgIGNvbnN0IHJlc29sdmVyID0gQWdlbnRNYW5hZ2VyLmdldEVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIoKTtcbiAgICBpZiAoIXJlc29sdmVyKSB7XG4gICAgICBsb2dnZXIud2FybihgRWxlbWVudCBtYW5hZ2VyIHJlc29sdmVyIG5vdCBjb25maWd1cmVkIC0gY2Fubm90IGFjdGl2YXRlICR7ZWxlbWVudFR5cGV9LyR7ZWxlbWVudE5hbWV9YCk7XG4gICAgICByZXR1cm4gYFtFbGVtZW50IG1hbmFnZXIgcmVzb2x2ZXIgbm90IGNvbmZpZ3VyZWQgZm9yICR7ZWxlbWVudFR5cGV9LyR7ZWxlbWVudE5hbWV9XWA7XG4gICAgfVxuXG4gICAgLy8gTGF5ZXIgMiAoZGVmZW5zZS1pbi1kZXB0aCk6IFJ1bnRpbWUgY2lyY3VsYXIgYWN0aXZhdGlvbiBkZXRlY3Rpb24gKElzc3VlICMxMDkpXG4gICAgLy8gVGhlIHN0YXRpYyBwcmUtZmxpZ2h0IGNoZWNrIChkZXRlY3RBY3RpdmF0aW9uQ3ljbGVzLCBsYXllciAxKSBjYXRjaGVzIG1vc3QgY3ljbGVzXG4gICAgLy8gYmVmb3JlIGV4ZWN1dGlvbiBiZWdpbnMuIFRoaXMgcnVudGltZSBjaGVjayBndWFyZHMgYWdhaW5zdCBlZGdlIGNhc2VzIHN1Y2ggYXNcbiAgICAvLyBkeW5hbWljYWxseS1jb25zdHJ1Y3RlZCBhY3RpdmF0aW9uIGNoYWlucyBvciBhZ2VudHMgbW9kaWZpZWQgYmV0d2VlbiB0aGUgc3RhdGljXG4gICAgLy8gY2hlY2sgYW5kIGFjdHVhbCBleGVjdXRpb24uIFVzZXMgZXhlY3V0aW9uQ29udGV4dC5hZ2VudENoYWluIHdoaWNoIHRyYWNrcyB0aGVcbiAgICAvLyBjdXJyZW50IGV4ZWN1dGlvbiBwYXRoIOKAlCBlZmZlY3RpdmUgZm9yIGRpcmVjdCBhbmQgbXVsdGktaG9wIGNoYWlucyB3aXRoaW4gYVxuICAgIC8vIHNpbmdsZSBleGVjdXRpb24gY29udGV4dC5cbiAgICBpZiAoZWxlbWVudFR5cGUgPT09ICdhZ2VudHMnICYmIGV4ZWN1dGlvbkNvbnRleHQ/LmFnZW50Q2hhaW4pIHtcbiAgICAgIGNvbnN0IGNoYWluU2V0ID0gbmV3IFNldChleGVjdXRpb25Db250ZXh0LmFnZW50Q2hhaW4ubWFwKG5hbWUgPT4gbmFtZS50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IGVsZW1lbnROYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmIChjaGFpblNldC5oYXMobm9ybWFsaXplZE5hbWUpKSB7XG4gICAgICAgIGNvbnN0IGN5Y2xlUGF0aCA9IFsuLi5leGVjdXRpb25Db250ZXh0LmFnZW50Q2hhaW4sIGVsZW1lbnROYW1lXTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEFnZW50TWFuYWdlci5mb3JtYXRDaXJjdWxhckFjdGl2YXRpb25FcnJvcihjeWNsZVBhdGgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gTWFwIHBsdXJhbCBlbGVtZW50IHR5cGVzIHRvIG1hbmFnZXIgbmFtZXNcbiAgICAgIGNvbnN0IG1hbmFnZXJOYW1lTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICBwZXJzb25hczogJ1BlcnNvbmFNYW5hZ2VyJyxcbiAgICAgICAgc2tpbGxzOiAnU2tpbGxNYW5hZ2VyJyxcbiAgICAgICAgbWVtb3JpZXM6ICdNZW1vcnlNYW5hZ2VyJyxcbiAgICAgICAgdGVtcGxhdGVzOiAnVGVtcGxhdGVNYW5hZ2VyJyxcbiAgICAgICAgZW5zZW1ibGVzOiAnRW5zZW1ibGVNYW5hZ2VyJyxcbiAgICAgICAgYWdlbnRzOiAnQWdlbnRNYW5hZ2VyJ1xuICAgICAgfTtcblxuICAgICAgY29uc3QgbWFuYWdlck5hbWUgPSBtYW5hZ2VyTmFtZU1hcFtlbGVtZW50VHlwZV07XG4gICAgICBpZiAoIW1hbmFnZXJOYW1lKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBVbmtub3duIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gKTtcbiAgICAgICAgcmV0dXJuIGBbVW5rbm93biBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9XWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hbmFnZXIgPSByZXNvbHZlcihtYW5hZ2VyTmFtZSk7XG4gICAgICBpZiAoIW1hbmFnZXIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYE1hbmFnZXIgbm90IGZvdW5kIGZvciBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9YCk7XG4gICAgICAgIHJldHVybiBgW01hbmFnZXIgbm90IGZvdW5kOiAke21hbmFnZXJOYW1lfV1gO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgYWxsIGVsZW1lbnRzIG9mIHRoaXMgdHlwZVxuICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCBtYW5hZ2VyLmxpc3QoKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50cy5maW5kKChlOiBhbnkpID0+IGUubWV0YWRhdGEubmFtZSA9PT0gZWxlbWVudE5hbWUpO1xuXG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VsZW1lbnRUeXBlfSAnJHtlbGVtZW50TmFtZX0nIG5vdCBmb3VuZGApO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gYXBwcm9wcmlhdGUgY29udGVudCBiYXNlZCBvbiBlbGVtZW50IHR5cGVcbiAgICAgIHN3aXRjaCAoZWxlbWVudFR5cGUpIHtcbiAgICAgICAgY2FzZSAncGVyc29uYXMnOlxuICAgICAgICAgIHJldHVybiBlbGVtZW50LmNvbnRlbnQgfHwgJyc7XG5cbiAgICAgICAgY2FzZSAnc2tpbGxzJzpcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5pbnN0cnVjdGlvbnMgfHwgJyc7XG5cbiAgICAgICAgY2FzZSAnbWVtb3JpZXMnOiB7XG4gICAgICAgICAgY29uc3QgZW50cmllcyA9IGVsZW1lbnQuZ2V0RW50cmllcygpO1xuICAgICAgICAgIHJldHVybiBgTWVtb3J5ICcke2VsZW1lbnROYW1lfScgd2l0aCAke2VudHJpZXMubGVuZ3RofSBlbnRyaWVzYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3RlbXBsYXRlcyc6XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY29udGVudCB8fCAnJztcblxuICAgICAgICBjYXNlICdlbnNlbWJsZXMnOiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudExpc3QgPSBPYmplY3QuZW50cmllcyhlbGVtZW50LmVsZW1lbnRzIHx8IHt9KVxuICAgICAgICAgICAgLm1hcCgoW3R5cGUsIG5hbWVzXSkgPT4gYCR7dHlwZX06ICR7QXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcy5qb2luKCcsICcpIDogU3RyaW5nKG5hbWVzKX1gKVxuICAgICAgICAgICAgLmpvaW4oJzsgJyk7XG4gICAgICAgICAgcmV0dXJuIGBFbnNlbWJsZSAnJHtlbGVtZW50TmFtZX0nIGFjdGl2YXRlczogJHtlbGVtZW50TGlzdH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnYWdlbnRzJzoge1xuICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGVsZW1lbnQuZXh0ZW5zaW9ucz8uaW5zdHJ1Y3Rpb25zIHx8ICcnO1xuICAgICAgICAgIHJldHVybiBpbnN0cnVjdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBgW0NvbnRlbnQgbm90IGF2YWlsYWJsZSBmb3IgJHtlbGVtZW50VHlwZX1dYDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBFcnJvciBnZXR0aW5nIGNvbnRlbnQgZm9yICR7ZWxlbWVudFR5cGV9ICcke2VsZW1lbnROYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFjdGl2ZSBzZXQgY2xlYW51cCBpcyBuZWVkZWQgYW5kIHBlcmZvcm0gY2xlYW51cCBpZiBuZWNlc3NhcnlcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBNZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IG1heCwgY2xlYW51cFRocmVzaG9sZCB9ID0gZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnKCdhZ2VudHMnKTtcblxuICAgIC8vIEJlbG93IHRocmVzaG9sZCDigJQgbm8gYWN0aW9uIG5lZWRlZFxuICAgIGlmICh0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZSA8IGNsZWFudXBUaHJlc2hvbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSBtYXgg4oCUIHdhcm4gYmVmb3JlIGNsZWFudXBcbiAgICBpZiAodGhpcy5hY3RpdmVBZ2VudE5hbWVzLnNpemUgPj0gbWF4KSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYEFjdGl2ZSBhZ2VudHMgbGltaXQgcmVhY2hlZCAoJHttYXh9KS4gYCArXG4gICAgICAgIGBDb25zaWRlciBkZWFjdGl2YXRpbmcgdW51c2VkIGFnZW50cyBvciBzZXR0aW5nIERPTExIT1VTRV9NQVhfQUNUSVZFX0FHRU5UUyB0byBhIGhpZ2hlciB2YWx1ZS5gXG4gICAgICApO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9BQ1RJVkFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jaGVja0FuZENsZWFudXBBY3RpdmVTZXQnLFxuICAgICAgICBkZXRhaWxzOiBgQWN0aXZlIGFnZW50cyBsaW1pdCByZWFjaGVkICgke3RoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplfS8ke21heH0pYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBhY3RpdmVDb3VudDogdGhpcy5hY3RpdmVBZ2VudE5hbWVzLnNpemUsXG4gICAgICAgICAgbWF4QWxsb3dlZDogbWF4LFxuICAgICAgICAgIGFjdGl2ZUFnZW50TmFtZXM6IEFycmF5LmZyb20odGhpcy5hY3RpdmVBZ2VudE5hbWVzKSxcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXQgb3IgYWJvdmUgdGhyZXNob2xkIOKAlCBwcm9hY3RpdmVseSBjbGVhbiBzdGFsZSBlbnRyaWVzXG4gICAgdm9pZCB0aGlzLmNsZWFudXBTdGFsZUFjdGl2ZUFnZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHN0YWxlIGVudHJpZXMgZnJvbSBhY3RpdmUgYWdlbnRzIHNldFxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2xlYW51cFN0YWxlQWN0aXZlQWdlbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydFNpemUgPSB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZTtcbiAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgY29uc3QgZXhpc3RpbmdBZ2VudE5hbWVzID0gbmV3IFNldChhZ2VudHMubWFwKGEgPT4gYS5tZXRhZGF0YS5uYW1lKSk7XG5cbiAgICAgIGNvbnN0IHN0YWxlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGFjdGl2ZU5hbWUgb2YgdGhpcy5hY3RpdmVBZ2VudE5hbWVzKSB7XG4gICAgICAgIGlmICghZXhpc3RpbmdBZ2VudE5hbWVzLmhhcyhhY3RpdmVOYW1lKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5kZWxldGUoYWN0aXZlTmFtZSk7XG4gICAgICAgICAgc3RhbGVOYW1lcy5wdXNoKGFjdGl2ZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZFNpemUgPSB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZTtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSBzdGFydFNpemUgLSBlbmRTaXplO1xuXG4gICAgICBpZiAocmVtb3ZlZCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYENsZWFuZWQgdXAgJHtyZW1vdmVkfSBzdGFsZSBhY3RpdmUgYWdlbnQgcmVmZXJlbmNlKHMpLiBgICtcbiAgICAgICAgICBgQWN0aXZlIGFnZW50czogJHtlbmRTaXplfS8ke2dldE1heEFjdGl2ZUxpbWl0KCdhZ2VudHMnKX1gXG4gICAgICAgICk7XG5cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuY2xlYW51cFN0YWxlQWN0aXZlQWdlbnRzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgUmVtb3ZlZCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBhZ2VudCByZWZlcmVuY2VzYCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgcmVtb3ZlZENvdW50OiByZW1vdmVkLFxuICAgICAgICAgICAgYWN0aXZlQ291bnQ6IGVuZFNpemUsXG4gICAgICAgICAgICBzdGFsZU5hbWVzOiBzdGFsZU5hbWVzLmpvaW4oJywgJylcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjbGVhbnVwIHN0YWxlIGFjdGl2ZSBhZ2VudHM6JywgZXJyb3IpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMnLFxuICAgICAgICBkZXRhaWxzOiBgQ2xlYW51cCBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0IGFuIGFnZW50IHN0YXRlIGZpbGUgKFlBTUwpLlxuICAgKlxuICAgKiBJTVBST1ZFTUVOVDogT3B0aW1pc3RpYyBsb2NraW5nIHdpdGggdmVyc2lvbiBjaGVja2luZyAoSXNzdWUgIzI0KVxuICAgKiBQcmV2ZW50cyBzdGF0ZSBjb3JydXB0aW9uIGZyb20gY29uY3VycmVudCB1cGRhdGVzIGJ5IGNvbXBhcmluZyB2ZXJzaW9uc1xuICAgKlxuICAgKiBGSVg6IFVzZXMgbm9ybWFsaXplRmlsZW5hbWUoKSBmb3IgY29uc2lzdGVudCBzdGF0ZSBmaWxlIG5hbWluZ1xuICAgKiBUaGlzIGVuc3VyZXMgc3RhdGUgZmlsZXMgdXNlIGtlYmFiLWNhc2UgKGUuZy4sIFwiY3J1ZHYtYWdlbnQtZGVsdGEuc3RhdGUueWFtbFwiKVxuICAgKiByZWdhcmRsZXNzIG9mIGlucHV0IG5hbWUgZm9ybWF0IChlLmcuLCBcIkNSVURWLUFnZW50LURlbHRhXCIpXG4gICAqXG4gICAqIEZJWCAoSXNzdWUgIzEwNyAtIENSSVQtMik6IFdyYXAgcmVhZC1jb21wYXJlLXdyaXRlIHNlcXVlbmNlIGluIGZpbGUgbG9ja1xuICAgKiB0byBwcmV2ZW50IFRPQ1RPVSByYWNlIGNvbmRpdGlvbiBmcm9tIGNvbmN1cnJlbnQgYWdlbnQgZXhlY3V0aW9uc1xuICAgKlxuICAgKiBGSVggKElzc3VlICMxMjMpOiBWZXJzaW9uIGluY3JlbWVudHMgb24gc3VjY2Vzc2Z1bCBzYXZlLCBub3QgZHVyaW5nIG9wZXJhdGlvbnNcbiAgICpcbiAgICogQHJldHVybnMgVGhlIG5ldyBzdGF0ZSB2ZXJzaW9uIGFmdGVyIHN1Y2Nlc3NmdWwgc2F2ZVxuICAgKiBAcHJvdGVjdGVkIE9ubHkgYWNjZXNzaWJsZSBieSBzdWJjbGFzc2VzIChlLmcuLCBUZXN0YWJsZUFnZW50TWFuYWdlciBmb3IgdGVzdGluZylcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBzYXZlQWdlbnRTdGF0ZShuYW1lOiBzdHJpbmcsIHN0YXRlOiBBZ2VudFN0YXRlKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVN0YXRlRGlyZWN0b3J5KCk7XG5cbiAgICAvLyBGSVg6IE5vcm1hbGl6ZSBuYW1lIGZvciBjb25zaXN0ZW50IHN0YXRlIGZpbGUgbmFtaW5nXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMuc3RhdGVEaXIsIGAke25vcm1hbGl6ZWROYW1lfSR7U1RBVEVfRklMRV9FWFRFTlNJT059YCk7XG5cbiAgICAvLyBGSVggKElzc3VlICMxMDcgLSBDUklULTIpOiBBY3F1aXJlIGZpbGUgbG9jayB0byBwcmV2ZW50IFRPQ1RPVSByYWNlIGNvbmRpdGlvblxuICAgIC8vIFRoZSBsb2NrIGNvdmVycyB0aGUgZW50aXJlIHJlYWQtY29tcGFyZS13cml0ZSBzZXF1ZW5jZSB0byBlbnN1cmUgYXRvbWljaXR5XG4gICAgYXdhaXQgdGhpcy5maWxlTG9ja01hbmFnZXIud2l0aExvY2soYGFnZW50LXN0YXRlOiR7bm9ybWFsaXplZE5hbWV9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gRklYOiBPcHRpbWlzdGljIGxvY2tpbmcgY2hlY2sgKElzc3VlICMyNClcbiAgICAgIC8vIExvYWQgZXhpc3Rpbmcgc3RhdGUgdG8gY29tcGFyZSB2ZXJzaW9ucyBiZWZvcmUgb3ZlcndyaXRpbmdcbiAgICAgIGNvbnN0IGV4aXN0aW5nU3RhdGUgPSBhd2FpdCB0aGlzLmxvYWRBZ2VudFN0YXRlKG5hbWUpO1xuICAgICAgaWYgKGV4aXN0aW5nU3RhdGUgJiYgZXhpc3RpbmdTdGF0ZS5zdGF0ZVZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zdGF0ZVZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBDaGVjayBpZiBvdXIgc3RhdGUgaXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmVyc2lvblxuICAgICAgICAvLyBJZiB2ZXJzaW9ucyBkb24ndCBtYXRjaCwgaXQgbWVhbnMgYW5vdGhlciBwcm9jZXNzIHVwZGF0ZWQgdGhlIHN0YXRlXG4gICAgICAgIGlmIChleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbiA+IHN0YXRlLnN0YXRlVmVyc2lvbikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBTdGF0ZSB2ZXJzaW9uIGNvbmZsaWN0IGRldGVjdGVkIGZvciBhZ2VudCAke25hbWV9YCwge1xuICAgICAgICAgICAgZXhpc3RpbmdWZXJzaW9uOiBleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbixcbiAgICAgICAgICAgIGF0dGVtcHRlZFZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvblxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ01FTU9SWV9TQVZFX0ZBSUxFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuc2F2ZUFnZW50U3RhdGUnLFxuICAgICAgICAgICAgZGV0YWlsczogYFN0YXRlIHZlcnNpb24gY29uZmxpY3Q6IGF0dGVtcHRlZCB0byBzYXZlIHN0YWxlIHN0YXRlYCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgZXhpc3RpbmdWZXJzaW9uOiBleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbixcbiAgICAgICAgICAgICAgYXR0ZW1wdGVkVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgU3RhdGUgdmVyc2lvbiBjb25mbGljdDogY3VycmVudCB2ZXJzaW9uIGlzICR7ZXhpc3RpbmdTdGF0ZS5zdGF0ZVZlcnNpb259LCBgICtcbiAgICAgICAgICAgIGBidXQgYXR0ZW1wdGVkIHRvIHNhdmUgdmVyc2lvbiAke3N0YXRlLnN0YXRlVmVyc2lvbn0uIGAgK1xuICAgICAgICAgICAgYFN0YXRlIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgY29uY3VycmVudGx5LmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEZJWCAoSXNzdWUgIzEyMyk6IEluY3JlbWVudCB2ZXJzaW9uIEJFRk9SRSBzZXJpYWxpemF0aW9uLCBub3QgZHVyaW5nIG9wZXJhdGlvbnNcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyB2ZXJzaW9uIG9ubHkgaW5jcmVtZW50cyBvbiBzdWNjZXNzZnVsIHNhdmVcbiAgICAgIHN0YXRlLnN0YXRlVmVyc2lvbiA9IChzdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMCkgKyAxO1xuXG4gICAgICBjb25zdCBzZXJpYWxpemVkU3RhdGUgPSB0aGlzLnByZXBhcmVTdGF0ZUZvclNlcmlhbGl6YXRpb24oc3RhdGUpO1xuXG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UuZHVtcFlhbWwoc2VyaWFsaXplZFN0YXRlLCB7XG4gICAgICAgIHNjaGVtYTogJ2pzb24nLCAgLy8gRml4ICM5MTQ6IGZhaWxzYWZlIGNvcnJ1cHRzIGJvb2xlYW5zL251bWJlcnMgaW4gYWdlbnQgc3RhdGVcbiAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICBzb3J0S2V5czogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHNpemVcbiAgICAgIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UudmFsaWRhdGVTaXplKHlhbWxDb250ZW50LCBNQVhfWUFNTF9TSVpFLCAnQWdlbnQgc3RhdGUnKTtcblxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxDb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgLy8gRklYOiBVc2Ugbm9ybWFsaXplZCBuYW1lIGFzIGNhY2hlIGtleSBmb3IgY29uc2lzdGVudCBsb29rdXBzXG4gICAgICB0aGlzLnN0YXRlQ2FjaGUuc2V0KG5vcm1hbGl6ZWROYW1lLCBzdGF0ZSk7XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQWdlbnQgc3RhdGUgc2F2ZWQgc3VjY2Vzc2Z1bGx5YCwge1xuICAgICAgICBhZ2VudE5hbWU6IG5hbWUsXG4gICAgICAgIG5vcm1hbGl6ZWROYW1lLFxuICAgICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbixcbiAgICAgICAgZ29hbENvdW50OiBzdGF0ZS5nb2Fscz8ubGVuZ3RoID8/IDBcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBuZXcgdmVyc2lvbiBmb3IgY2FsbGVyIHRvIHN5bmMgYWdlbnQncyBpbnRlcm5hbCBzdGF0ZVxuICAgIC8vIHN0YXRlVmVyc2lvbiBpcyBndWFyYW50ZWVkIHRvIGJlIGEgbnVtYmVyIGFmdGVyIHRoZSBpbmNyZW1lbnQgYWJvdmVcbiAgICByZXR1cm4gc3RhdGUuc3RhdGVWZXJzaW9uITtcbiAgfVxuXG4gIC8qKlxuICAgKiBVdGlsaXR5OiBlbnN1cmUgYC5tZGAgZXh0ZW5zaW9uIG9uIHJlcXVlc3RlZCBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBzdHJpcEV4dGVuc2lvbihmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZmlsZVBhdGguZW5kc1dpdGgoQUdFTlRfRklMRV9FWFRFTlNJT04pXG4gICAgICA/IGZpbGVQYXRoLnNsaWNlKDAsIC1BR0VOVF9GSUxFX0VYVEVOU0lPTi5sZW5ndGgpXG4gICAgICA6IGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoeWRyYXRlQWdlbnRTdGF0ZShhZ2VudDogQWdlbnQsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgdGhpcy5sb2FkQWdlbnRTdGF0ZShuYW1lKTtcbiAgICBpZiAoIXN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04ucGFyc2UoYWdlbnQuc2VyaWFsaXplVG9KU09OKCkpO1xuICAgIHNlcmlhbGl6ZWQuc3RhdGUgPSBzdGF0ZTtcbiAgICBhZ2VudC5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeShzZXJpYWxpemVkKSk7XG4gICAgYWdlbnQubWFya1N0YXRlUGVyc2lzdGVkKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRBZ2VudFN0YXRlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8QWdlbnRTdGF0ZSB8IG51bGw+IHtcbiAgICAvLyBGSVg6IE5vcm1hbGl6ZSBuYW1lIGZvciBjb25zaXN0ZW50IHN0YXRlIGZpbGUgbG9va3Vwc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShuYW1lKTtcblxuICAgIGlmICh0aGlzLnN0YXRlQ2FjaGUuaGFzKG5vcm1hbGl6ZWROYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGVDYWNoZS5nZXQobm9ybWFsaXplZE5hbWUpITtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZUZpbGVuYW1lID0gYCR7bm9ybWFsaXplZE5hbWV9JHtTVEFURV9GSUxFX0VYVEVOU0lPTn1gO1xuICAgIGNvbnN0IHN0YXRlUGF0aCA9IHBhdGguam9pbih0aGlzLnN0YXRlRGlyLCBzdGF0ZUZpbGVuYW1lKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZShzdGF0ZVBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgWUFNTCBwYXJzaW5nXG4gICAgICAvLyBTdGF0ZSBmaWxlcyBhcmUgcHVyZSBZQU1MIGJ1dCBwYXJzZUZyb250bWF0dGVyIGhhbmRsZXMgYm90aCBmb3JtYXRzXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCwge1xuICAgICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIubG9hZEFnZW50U3RhdGUnXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSByZXN1bHQuZGF0YSBhcyBBZ2VudFN0YXRlO1xuICAgICAgdGhpcy5ub3JtYWxpemVMb2FkZWRTdGF0ZShzdGF0ZSk7XG4gICAgICAvLyBGSVg6IFVzZSBub3JtYWxpemVkIG5hbWUgYXMgY2FjaGUga2V5IGZvciBjb25zaXN0ZW50IGxvb2t1cHNcbiAgICAgIHRoaXMuc3RhdGVDYWNoZS5zZXQobm9ybWFsaXplZE5hbWUsIHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBhZ2VudCBzdGF0ZTogJHtuYW1lfWAsIGVycm9yKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlU3RhdGVEaXJlY3RvcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5zdGF0ZURpcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcGFyc2VNZXRhZGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPEFnZW50TWV0YWRhdGE+IHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHsgLi4uKGRhdGEgYXMgYW55KSB9O1xuXG4gICAgLy8gLS0tIFNUQVJUOiBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IEZpeCBmb3IgTGVnYWN5IEFnZW50IFR5cGVzIC0tLVxuICAgIC8vIExlZ2FjeSBhZ2VudCBkZWZpbml0aW9uIGZpbGVzIG1pZ2h0IHVzZSAnYWdlbnQnIChzaW5ndWxhcikgaW5zdGVhZCBvZlxuICAgIC8vIEVsZW1lbnRUeXBlLkFHRU5UICgnYWdlbnRzJykuIFRoaXMgY29udmVydHMgdGhlIHNpbmd1bGFyIGZvcm0gdG8gdGhlXG4gICAgLy8gY29ycmVjdCBwbHVyYWwgZW51bSB2YWx1ZSB0byBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAgICBpZiAobWV0YWRhdGEudHlwZSA9PT0gJ2FnZW50Jykge1xuICAgICAgbWV0YWRhdGEudHlwZSA9IEVsZW1lbnRUeXBlLkFHRU5UO1xuICAgIH1cbiAgICAvLyAtLS0gRU5EOiBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IEZpeCAtLS1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHR5cGUgaXMgbm93IEVsZW1lbnRUeXBlLkFHRU5UIChwbHVyYWwpXG4gICAgaWYgKG1ldGFkYXRhLnR5cGUgJiYgbWV0YWRhdGEudHlwZSAhPT0gRWxlbWVudFR5cGUuQUdFTlQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IHR5cGU6IGV4cGVjdGVkICcke0VsZW1lbnRUeXBlLkFHRU5UfScsIGdvdCAnJHttZXRhZGF0YS50eXBlfSdgKTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIG5hbWUgdmFsaWRhdGlvblxuICAgIGlmIChtZXRhZGF0YS5uYW1lKSB7XG4gICAgICBjb25zdCBuYW1lUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQobWV0YWRhdGEubmFtZSwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTkFNRV9MRU5HVEgsXG4gICAgICAgIGFsbG93U3BhY2VzOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGlmICghbmFtZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhZ2VudCBuYW1lOiAke25hbWVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgbWV0YWRhdGEubmFtZSA9IG5hbWVSZXN1bHQuc2FuaXRpemVkVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBkZXNjcmlwdGlvbiB2YWxpZGF0aW9uXG4gICAgLy8gRklYOiBNdXN0IHNwZWNpZnkgZmllbGRUeXBlOiAnZGVzY3JpcHRpb24nIHRvIGFsbG93IHB1bmN0dWF0aW9uIGxpa2UgY29sb25zLCBzZW1pY29sb25zLCBldGMuXG4gICAgaWYgKG1ldGFkYXRhLmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCBkZXNjUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQobWV0YWRhdGEuZGVzY3JpcHRpb24sIHtcbiAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCxcbiAgICAgICAgYWxsb3dTcGFjZXM6IHRydWUsXG4gICAgICAgIGZpZWxkVHlwZTogJ2Rlc2NyaXB0aW9uJ1xuICAgICAgfSk7XG4gICAgICBpZiAoIWRlc2NSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYWdlbnQgZGVzY3JpcHRpb246ICR7ZGVzY1Jlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBtZXRhZGF0YS5kZXNjcmlwdGlvbiA9IGRlc2NSZXN1bHQuc2FuaXRpemVkVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBzcGVjaWFsaXphdGlvbnMgYXJyYXlcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YS5zcGVjaWFsaXphdGlvbnMpKSB7XG4gICAgICBjb25zdCB2YWxpZGF0ZWRTcGVjaWFsaXphdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChTdHJpbmcodmFsdWUpLCB7XG4gICAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX1RBR19MRU5HVEgsXG4gICAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3BlY2lhbGl6YXRpb24gXCIke3ZhbHVlfVwiOiAke3Jlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRhdGVkU3BlY2lhbGl6YXRpb25zLnB1c2gocmVzdWx0LnNhbml0aXplZFZhbHVlISk7XG4gICAgICB9XG4gICAgICBtZXRhZGF0YS5zcGVjaWFsaXphdGlvbnMgPSB2YWxpZGF0ZWRTcGVjaWFsaXphdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gS0VFUDogVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlIChhbHJlYWR5IHVzaW5nIHNlcnZpY2UgcGF0dGVybilcbiAgICBpZiAobWV0YWRhdGEudHJpZ2dlcnMgJiYgQXJyYXkuaXNBcnJheShtZXRhZGF0YS50cmlnZ2VycykpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZVRyaWdnZXJzKFxuICAgICAgICBtZXRhZGF0YS50cmlnZ2VycyxcbiAgICAgICAgRWxlbWVudFR5cGUuQUdFTlQsXG4gICAgICAgIG1ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nXG4gICAgICApO1xuICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSB2YWxpZGF0aW9uUmVzdWx0LnZhbGlkVHJpZ2dlcnM7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzY3NjogU2FuaXRpemUgZ2F0ZWtlZXBlciBwb2xpY3kgb24gbG9hZCB0byBwcmV2ZW50IHByb21wdC1pbmplY3Rpb24gYXR0YWNrc1xuICAgIC8vIE1hbGZvcm1lZCBwb2xpY2llcyBhcmUgc3RyaXBwZWQgYW5kIGxvZ2dlZCBhcyBzZWN1cml0eSBldmVudHMgKG5ldmVyIHJlYWNoIGVuZm9yY2VtZW50KVxuICAgIGlmIChtZXRhZGF0YS5nYXRla2VlcGVyKSB7XG4gICAgICBtZXRhZGF0YS5nYXRla2VlcGVyID0gc2FuaXRpemVHYXRla2VlcGVyUG9saWN5KG1ldGFkYXRhLmdhdGVrZWVwZXIsIG1ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nLCAnYWdlbnQnKTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzIyOiBWYWxpZGF0ZSBWMiBhZ2VudCBmaWVsZHMgb24gbG9hZCDigJQgc3RydWN0dXJhbCBjaGVja3MsIHN0cmlwIG1hbGZvcm1lZCBkYXRhLlxuICAgIC8vIEZhaWwtb3BlbjogY29ycnVwdGVkIGZpZWxkcyBhcmUgcmVtb3ZlZCBhbmQgbG9nZ2VkLCBub3QgdGhyb3duLiBUaGlzIHByZXZlbnRzXG4gICAgLy8gYmFkIGRhdGEgZnJvbSByZWFjaGluZyBleGVjdXRpb24gdGltZSB3aGlsZSBrZWVwaW5nIHRoZSBhZ2VudCBsb2FkYWJsZS5cbiAgICBjb25zdCBhZ2VudE5hbWUgPSBtZXRhZGF0YS5uYW1lIHx8ICd1bmtub3duJztcblxuICAgIC8vIElzc3VlICM2OTc6IE5vcm1hbGl6ZSBgZ29hbHNgIChwbHVyYWwpIOKGkiBgZ29hbGAgKHNpbmd1bGFyKVxuICAgIGlmIChtZXRhZGF0YS5nb2FscyAhPT0gdW5kZWZpbmVkICYmIG1ldGFkYXRhLmdvYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWV0YWRhdGEuZ29hbCA9IG1ldGFkYXRhLmdvYWxzO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmdvYWxzO1xuICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogbWlncmF0ZWQgJ2dvYWxzJyAocGx1cmFsKSB0byAnZ29hbCdgKTtcbiAgICB9IGVsc2UgaWYgKG1ldGFkYXRhLmdvYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGBnb2FsYCBhbHJlYWR5IHNldCDigJQgZHJvcCB0aGUgcmVkdW5kYW50IHBsdXJhbCBmb3JtXG4gICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbHM7XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLmdvYWwpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuZ29hbCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1ldGFkYXRhLmdvYWwudGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzbmFrZV9jYXNlIGdvYWwgc3ViLWZpZWxkc1xuICAgICAgICBub3JtYWxpemVHb2FsS2V5cyhtZXRhZGF0YS5nb2FsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHBhcmFtZXRlcnMgYXJyYXkgaWYgcHJlc2VudFxuICAgICAgICBpZiAobWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzICYmICFBcnJheS5pc0FycmF5KG1ldGFkYXRhLmdvYWwucGFyYW1ldGVycykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsLnBhcmFtZXRlcnMgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFZhbGlkYXRlIHN1Y2Nlc3NDcml0ZXJpYSBhcnJheSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYSAmJiAhQXJyYXkuaXNBcnJheShtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYSkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsLnN1Y2Nlc3NDcml0ZXJpYSBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbWV0YWRhdGEuZ29hbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gZ29hbCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIG9iamVjdCB3aXRoIHRlbXBsYXRlIOKAlCBhbnl0aGluZyBlbHNlIGlzIGludmFsaWRcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogZ29hbCBpcyBtYWxmb3JtZWQgKG5vIHRlbXBsYXRlKSwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYWN0aXZhdGVzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLmFjdGl2YXRlcykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYWN0aXZhdGVzIGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWN0aXZhdGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRWFjaCBrZXkgc2hvdWxkIG1hcCB0byBhIHN0cmluZyBhcnJheVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YS5hY3RpdmF0ZXMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhY3RpdmF0ZXMuJHtrZXl9IGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWN0aXZhdGVzW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLnRvb2xzKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnRvb2xzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiB0b29scyBpcyBub3QgYW4gb2JqZWN0LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRvb2xzO1xuICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5hbGxvd2VkKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiB0b29scy5hbGxvd2VkIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nIHRvb2xzYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS50b29scztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEdhcCAzOiBWYWxpZGF0ZSB0b29scy5kZW5pZWQgaXMgYW4gYXJyYXkgaWYgcHJlc2VudFxuICAgICAgICBpZiAobWV0YWRhdGEudG9vbHMuZGVuaWVkICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuZGVuaWVkKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRvb2xzLmRlbmllZCBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS50b29scy5kZW5pZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzI1OiBOb3JtYWxpemUgc3lzdGVtX3Byb21wdCDihpIgc3lzdGVtUHJvbXB0IChMTE1zIGNvbW1vbmx5IHVzZSBzbmFrZV9jYXNlKVxuICAgIGNvbnN0IGFueU1ldGEgPSBtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoYW55TWV0YS5zeXN0ZW1fcHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFueU1ldGEuc3lzdGVtUHJvbXB0ID0gYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuICAgIH1cbiAgICBkZWxldGUgYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuXG4gICAgaWYgKG1ldGFkYXRhLnN5c3RlbVByb21wdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBzeXN0ZW1Qcm9tcHQgaXMgbm90IGEgc3RyaW5nLCBzdHJpcHBpbmdgKTtcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQ7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzY5NzogUHJvbW90ZSByb290LWxldmVsIFYxIGF1dG9ub215IGZpZWxkcyBpbnRvIHRoZSBgYXV0b25vbXlgIGJsb2NrLlxuICAgIC8vIFYxIGFnZW50cyBzdG9yZWQgcmlza1RvbGVyYW5jZSBhbmQgbWF4QXV0b25vbW91c1N0ZXBzIGF0IHRoZSBtZXRhZGF0YSByb290LlxuICAgIC8vIFYyIG5lc3RzIHRoZW0gdW5kZXIgYGF1dG9ub215YC4gVGhpcyBwcm9tb3Rpb24gZW5zdXJlcyBkb3duc3RyZWFtIGNvZGUgb25seVxuICAgIC8vIGNoZWNrcyBvbmUgbG9jYXRpb24uIFRoZSBleGlzdGluZyBhdXRvbm9teSB2YWxpZGF0aW9uIGJlbG93IHZhbGlkYXRlcyB2YWx1ZXMuXG4gICAgLy8gUHJlY2VkZW5jZTogY2FtZWxDYXNlIHZhcmlhbnRzIGFyZSBsaXN0ZWQgYmVmb3JlIHNuYWtlX2Nhc2Uvc2hvcnQgZm9ybXMsIHNvXG4gICAgLy8gZS5nLiBgcmlza1RvbGVyYW5jZWAgd2lucyBvdmVyIGByaXNrX3RvbGVyYW5jZWAgaWYgYm90aCBhcHBlYXIgYXQgcm9vdC5cbiAgICB7XG4gICAgICBjb25zdCByb290QXV0b25vbXlGaWVsZHM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgc3RyaW5nXT4gPSBbXG4gICAgICAgIFsncmlza1RvbGVyYW5jZScsICdyaXNrVG9sZXJhbmNlJ10sXG4gICAgICAgIFsncmlza190b2xlcmFuY2UnLCAncmlza1RvbGVyYW5jZSddLFxuICAgICAgICBbJ21heEF1dG9ub21vdXNTdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgICAgWydtYXhfYXV0b25vbW91c19zdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgICAgWydtYXhTdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgIF0gYXMgY29uc3Q7XG4gICAgICBsZXQgcHJvbW90ZWQgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgW3Jvb3RLZXksIGF1dG9ub215S2V5XSBvZiByb290QXV0b25vbXlGaWVsZHMpIHtcbiAgICAgICAgaWYgKGFueU1ldGFbcm9vdEtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICghbWV0YWRhdGEuYXV0b25vbXkpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLmF1dG9ub215ID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGFCbG9jayA9IG1ldGFkYXRhLmF1dG9ub215IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGlmIChhQmxvY2tbYXV0b25vbXlLZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFCbG9ja1thdXRvbm9teUtleV0gPSBhbnlNZXRhW3Jvb3RLZXldO1xuICAgICAgICAgICAgcHJvbW90ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgYW55TWV0YVtyb290S2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb21vdGVkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHByb21vdGVkIHJvb3QtbGV2ZWwgYXV0b25vbXkgZmllbGRzIGludG8gYXV0b25vbXkgYmxvY2tgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEuYXV0b25vbXkpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYXV0b25vbXkgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYXV0b25vbXkpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215IGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEuYXV0b25vbXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvbiAod2FzIGR1cGxpY2F0ZWQgaW4gcGFyc2VNZXRhZGF0YSArIHZhbGlkYXRlVjJGaWVsZHNGb3JDcmVhdGUpXG4gICAgICAgIGNvbnN0IGEgPSBtZXRhZGF0YS5hdXRvbm9teSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplQXV0b25vbXlLZXlzKGEpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHNwZWNpZmljIGZpZWxkc1xuICAgICAgICAvLyBHYXAgNDogVmFsaWRhdGUgcmlza1RvbGVyYW5jZSBlbnVtICh1c2VzIHNoYXJlZCBjb25zdGFudHMgZnJvbSBJc3N1ZSAjNzI3KVxuICAgICAgICBpZiAoYS5yaXNrVG9sZXJhbmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKGEucmlza1RvbGVyYW5jZSwgUklTS19UT0xFUkFOQ0VfTEVWRUxTKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LnJpc2tUb2xlcmFuY2UgJyR7YS5yaXNrVG9sZXJhbmNlfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEucmlza1RvbGVyYW5jZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5tYXhBdXRvbm9tb3VzU3RlcHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215Lm1heEF1dG9ub21vdXNTdGVwcyBpcyBub3QgYSBudW1iZXIsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBhLm1heEF1dG9ub21vdXNTdGVwcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5yZXF1aXJlc0FwcHJvdmFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGEucmVxdWlyZXNBcHByb3ZhbCkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhdXRvbm9teS5yZXF1aXJlc0FwcHJvdmFsIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEucmVxdWlyZXNBcHByb3ZhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5hdXRvQXBwcm92ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShhLmF1dG9BcHByb3ZlKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LmF1dG9BcHByb3ZlIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEuYXV0b0FwcHJvdmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEucmVzaWxpZW5jZSkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5yZXNpbGllbmNlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnJlc2lsaWVuY2UpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UgaXMgbm90IGFuIG9iamVjdCwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5yZXNpbGllbmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXNzdWUgIzczMDogU2hhcmVkIG5vcm1hbGl6YXRpb24gKHdhcyBkdXBsaWNhdGVkIGluIHBhcnNlTWV0YWRhdGEgKyB2YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKVxuICAgICAgICBjb25zdCByID0gbWV0YWRhdGEucmVzaWxpZW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMocik7XG5cbiAgICAgICAgLy8gSXNzdWUgIzcyNzogVXNlIHNoYXJlZCBlbnVtIGNvbnN0YW50cyBmb3IgcmVzaWxpZW5jZSB2YWxpZGF0aW9uXG4gICAgICAgIGlmIChyLm9uU3RlcExpbWl0UmVhY2hlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLm9uU3RlcExpbWl0UmVhY2hlZCwgU1RFUF9MSU1JVF9BQ1RJT05TKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2Uub25TdGVwTGltaXRSZWFjaGVkICcke3Iub25TdGVwTGltaXRSZWFjaGVkfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIub25TdGVwTGltaXRSZWFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm9uRXhlY3V0aW9uRmFpbHVyZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLm9uRXhlY3V0aW9uRmFpbHVyZSwgRVhFQ1VUSU9OX0ZBSUxVUkVfQUNUSU9OUykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLm9uRXhlY3V0aW9uRmFpbHVyZSAnJHtyLm9uRXhlY3V0aW9uRmFpbHVyZX0nIGlzIGludmFsaWQsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLm9uRXhlY3V0aW9uRmFpbHVyZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiByLm1heFJldHJpZXMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5tYXhSZXRyaWVzIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIubWF4UmV0cmllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhDb250aW51YXRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiByLm1heENvbnRpbnVhdGlvbnMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5tYXhDb250aW51YXRpb25zIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIubWF4Q29udGludWF0aW9ucztcbiAgICAgICAgfVxuICAgICAgICAvLyBHYXAgNTogVmFsaWRhdGUgcmV0cnlCYWNrb2ZmIGVudW0gYW5kIHByZXNlcnZlU3RhdGUgYm9vbGVhbiAoc2hhcmVkIGNvbnN0YW50cyBmcm9tIElzc3VlICM3MjcpXG4gICAgICAgIGlmIChyLnJldHJ5QmFja29mZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLnJldHJ5QmFja29mZiwgQkFDS09GRl9TVFJBVEVHSUVTKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UucmV0cnlCYWNrb2ZmICcke3IucmV0cnlCYWNrb2ZmfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIucmV0cnlCYWNrb2ZmO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnByZXNlcnZlU3RhdGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIHIucHJlc2VydmVTdGF0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5wcmVzZXJ2ZVN0YXRlIGlzIG5vdCBhIGJvb2xlYW4sIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLnByZXNlcnZlU3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUYWdzOiB2YWxpZGF0ZSBhcyBzdHJpbmcgYXJyYXkgKGNvbW1vbiBmaWVsZCwgYWxsIGVsZW1lbnQgdHlwZXMpXG4gICAgaWYgKG1ldGFkYXRhLnRhZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRhZ3MpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRhZ3MgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRhZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRhZGF0YS50YWdzID0gbWV0YWRhdGEudGFncy5maWx0ZXIoKHQ6IHVua25vd24pID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGE7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlRWxlbWVudChtZXRhZGF0YTogQWdlbnRNZXRhZGF0YSwgYm9keUNvbnRlbnQ6IHN0cmluZyk6IEFnZW50IHtcbiAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChtZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgIC8vIEZpeCAjOTEyOiBQcmVmZXIgZXhwbGljaXQgZm9ybWF0X3ZlcnNpb24gbWFya2VyLCBmYWxsIGJhY2sgdG8gaW5zdHJ1Y3Rpb25zLXByZXNlbmNlIGNoZWNrXG4gICAgZGVsZXRlIChtZXRhZGF0YSBhcyBhbnkpLmZvcm1hdF92ZXJzaW9uOyAgLy8gU3RyaXAgbWFya2VyIGZyb20gcnVudGltZSBtZXRhZGF0YVxuICAgIGNvbnN0IG1ldGFkYXRhSW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgIGlmIChtZXRhZGF0YUluc3RydWN0aW9ucykge1xuICAgICAgLy8gdjIgZm9ybWF0OiBpbnN0cnVjdGlvbnMgZnJvbSBZQU1MLCBib2R5IGlzIGNvbnRlbnQgKHJlZmVyZW5jZSBtYXRlcmlhbClcbiAgICAgIGFnZW50Lmluc3RydWN0aW9ucyA9IG1ldGFkYXRhSW5zdHJ1Y3Rpb25zO1xuICAgICAgYWdlbnQuY29udGVudCA9IGJvZHlDb250ZW50LnRyaW0oKTtcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHYxIGZvcm1hdDogYm9keSB0ZXh0IG1hcHMgdG8gaW5zdHJ1Y3Rpb25zXG4gICAgICBhZ2VudC5pbnN0cnVjdGlvbnMgPSBib2R5Q29udGVudC50cmltKCk7XG4gICAgICBhZ2VudC5jb250ZW50ID0gJyc7XG4gICAgfVxuICAgIC8vIEtlZXAgZXh0ZW5zaW9ucy5pbnN0cnVjdGlvbnMgZm9yIGJhY2t3YXJkIGNvbXBhdFxuICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBhZ2VudC5pbnN0cnVjdGlvbnNcbiAgICB9O1xuICAgIHJldHVybiBhZ2VudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzZXJpYWxpemVFbGVtZW50KGFnZW50OiBBZ2VudCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gU3RhcnQgd2l0aCBiYXNlIG1ldGFkYXRhIGZpZWxkcyAoYWx3YXlzIHByZXNlbnQpXG4gICAgY29uc3QgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgbmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgIHR5cGU6IHRvU2luZ3VsYXJMYWJlbChFbGVtZW50VHlwZS5BR0VOVCksXG4gICAgICB1bmlxdWVfaWQ6IGFnZW50LmlkLFxuICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogYWdlbnQubWV0YWRhdGEuY3JlYXRlZCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBtb2RpZmllZDogYWdlbnQubWV0YWRhdGEubW9kaWZpZWQgPz8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZGVzY3JpcHRpb246IGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgZm9ybWF0X3ZlcnNpb246ICd2MicsICAvLyBGaXggIzkxMjogRXhwbGljaXQgZm9ybWF0IG1hcmtlclxuICAgIH07XG5cbiAgICAvLyBDYXN0IHRvIGNoZWNrIGZvciB2MiBmaWVsZHNcbiAgICBjb25zdCBtZXRhZGF0YVYyID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuXG4gICAgLy8gQWRkIHYyIGZpZWxkcyBpZiBwcmVzZW50IChnb2FsIGlzIHJlcXVpcmVkIGluIHYyLCBvdGhlcnMgb3B0aW9uYWwpXG4gICAgaWYgKG1ldGFkYXRhVjIuZ29hbCkge1xuICAgICAgbWV0YWRhdGEuZ29hbCA9IG1ldGFkYXRhVjIuZ29hbDtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuYWN0aXZhdGVzKSB7XG4gICAgICBtZXRhZGF0YS5hY3RpdmF0ZXMgPSBtZXRhZGF0YVYyLmFjdGl2YXRlcztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIudG9vbHMpIHtcbiAgICAgIG1ldGFkYXRhLnRvb2xzID0gbWV0YWRhdGFWMi50b29scztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuc3lzdGVtUHJvbXB0KSB7XG4gICAgICBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPSBtZXRhZGF0YVYyLnN5c3RlbVByb21wdDtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuYXV0b25vbXkpIHtcbiAgICAgIG1ldGFkYXRhLmF1dG9ub215ID0gbWV0YWRhdGFWMi5hdXRvbm9teTtcbiAgICB9XG4gICAgLy8gSXNzdWUgIzQ0OTogU2VyaWFsaXplIGdhdGVrZWVwZXIgcG9saWN5IHRvIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICBpZiAobWV0YWRhdGFWMi5nYXRla2VlcGVyKSB7XG4gICAgICBtZXRhZGF0YS5nYXRla2VlcGVyID0gbWV0YWRhdGFWMi5nYXRla2VlcGVyO1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNTI2OiBTZXJpYWxpemUgcmVzaWxpZW5jZSBwb2xpY3kgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLnJlc2lsaWVuY2UpIHtcbiAgICAgIG1ldGFkYXRhLnJlc2lsaWVuY2UgPSBtZXRhZGF0YVYyLnJlc2lsaWVuY2U7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzcyMjogT25seSBzZXJpYWxpemUgdjEgZmllbGRzIGZvciBhZ2VudHMgV0lUSE9VVCBhIGdvYWwgKGxlZ2FjeSB2MSBhZ2VudHMpLlxuICAgIC8vIFYyIGFnZW50cyAod2l0aCBnb2FsKSBzaG91bGQgbm90IGNhcnJ5IGRlcHJlY2F0ZWQgdjEgYmFnZ2FnZSBsaWtlXG4gICAgLy8gZGVjaXNpb25GcmFtZXdvcmssIHJpc2tUb2xlcmFuY2UsIGxlYXJuaW5nRW5hYmxlZCwgbWF4Q29uY3VycmVudEdvYWxzLlxuICAgIC8vIFRoZSBBZ2VudCBjb25zdHJ1Y3RvciBzdGlsbCBhcHBsaWVzIHRoZXNlIGRlZmF1bHRzIGF0IHJ1bnRpbWUgZm9yIGJhY2t3YXJkXG4gICAgLy8gY29tcGF0IHdoZW4gcmVhZGluZyBvbGQgZmlsZXMg4oCUIGJ1dCB3ZSBkb24ndCB3cml0ZSB0aGVtIGludG8gbmV3IHYyIGFnZW50cy5cbiAgICBjb25zdCBpc1YyQWdlbnQgPSAhIW1ldGFkYXRhVjIuZ29hbDtcbiAgICBpZiAoIWlzVjJBZ2VudCkge1xuICAgICAgaWYgKG1ldGFkYXRhVjIuZGVjaXNpb25GcmFtZXdvcmspIHtcbiAgICAgICAgbWV0YWRhdGEuZGVjaXNpb25GcmFtZXdvcmsgPSBtZXRhZGF0YVYyLmRlY2lzaW9uRnJhbWV3b3JrO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjIucmlza1RvbGVyYW5jZSkge1xuICAgICAgICBtZXRhZGF0YS5yaXNrVG9sZXJhbmNlID0gbWV0YWRhdGFWMi5yaXNrVG9sZXJhbmNlO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjIubGVhcm5pbmdFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWV0YWRhdGEubGVhcm5pbmdFbmFibGVkID0gbWV0YWRhdGFWMi5sZWFybmluZ0VuYWJsZWQ7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMi5tYXhDb25jdXJyZW50R29hbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRhZGF0YS5tYXhDb25jdXJyZW50R29hbHMgPSBtZXRhZGF0YVYyLm1heENvbmN1cnJlbnRHb2FscztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gc3BlY2lhbGl6YXRpb25zIGlzIG5vdCBhIGRlcHJlY2F0ZWQgdjEgZmllbGQg4oCUIGFsd2F5cyBzZXJpYWxpemVcbiAgICBpZiAobWV0YWRhdGFWMi5zcGVjaWFsaXphdGlvbnMpIHtcbiAgICAgIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyA9IG1ldGFkYXRhVjIuc3BlY2lhbGl6YXRpb25zO1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNzIyOiBTZXJpYWxpemUgdGFncyBhbmQgdHJpZ2dlcnMgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLnRhZ3MgJiYgQXJyYXkuaXNBcnJheShtZXRhZGF0YVYyLnRhZ3MpICYmIG1ldGFkYXRhVjIudGFncy5sZW5ndGggPiAwKSB7XG4gICAgICBtZXRhZGF0YS50YWdzID0gbWV0YWRhdGFWMi50YWdzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi50cmlnZ2Vycykge1xuICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSBtZXRhZGF0YVYyLnRyaWdnZXJzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5ydWxlRW5naW5lQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1ldGFkYXRhLnJ1bGVFbmdpbmVDb25maWcgPSBtZXRhZGF0YVYyLnJ1bGVFbmdpbmVDb25maWc7XG4gICAgfVxuXG4gICAgLy8gdjIuMCBmb3JtYXQ6IGluc3RydWN0aW9ucyBpbiBZQU1MIGZyb250bWF0dGVyLCBjb250ZW50IGFzIGJvZHlcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBhZ2VudC5pbnN0cnVjdGlvbnMgfHxcbiAgICAgIChhZ2VudC5leHRlbnNpb25zPy5pbnN0cnVjdGlvbnMgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgdGhpcy5idWlsZERlZmF1bHRJbnN0cnVjdGlvbnMoYWdlbnQpO1xuICAgIGlmIChpbnN0cnVjdGlvbnMpIHtcbiAgICAgIG1ldGFkYXRhLmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucztcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IGFnZW50LmNvbnRlbnQgfHwgdGhpcy5idWlsZERlZmF1bHRCb2R5KGFnZW50KTtcblxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLmNyZWF0ZUZyb250bWF0dGVyKG1ldGFkYXRhLCBib2R5LCB7XG4gICAgICBtZXRob2Q6ICdtYW51YWwnLFxuICAgICAgc2NoZW1hOiAnanNvbicsICAvLyBVc2UgSlNPTiBzY2hlbWEgdG8gcHJlc2VydmUgYm9vbGVhbnMvbnVtYmVycyBpbiB2MiBtZXRhZGF0YVxuICAgICAgY2xlYW5NZXRhZGF0YTogdHJ1ZSxcbiAgICAgIGNsZWFuaW5nU3RyYXRlZ3k6ICdyZW1vdmUtYm90aCcsICAvLyBSZW1vdmUgYm90aCBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEluc3RydWN0aW9ucyhhZ2VudDogQWdlbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWVIZWFkZXIgPSBhZ2VudC5tZXRhZGF0YS5uYW1lID8gYCMgJHthZ2VudC5tZXRhZGF0YS5uYW1lfVxcblxcbmAgOiAnJztcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID8/ICcnO1xuICAgIHJldHVybiBgJHtuYW1lSGVhZGVyfSR7ZGVzY3JpcHRpb259YC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEJvZHkoYWdlbnQ6IEFnZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gKGFnZW50Lm1ldGFkYXRhLm5hbWUgPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChhZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsaW5lcy5wdXNoKGAjICR7bmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGxpbmVzLnB1c2goZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IHRoZSB0ZXh0IHRoYXQgc2hvdWxkIHNhdGlzZnkgY3JlYXRlLXRpbWUgY29udGVudCB2YWxpZGF0aW9uLlxuICAgKiBCZWhhdmlvcmFsIGluc3RydWN0aW9ucyByZW1haW4gdGhlIHByaW1hcnkgc291cmNlLCB3aGlsZSByZWZlcmVuY2UgY29udGVudFxuICAgKiBhY3RzIGFzIHRoZSBmYWxsYmFjayBmb3IgY29udGVudC1vbmx5IGFnZW50IGNyZWF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQcmltYXJ5VmFsaWRhdGlvblRleHQoY29udGVudDogc3RyaW5nLCByZWZlcmVuY2VDb250ZW50OiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlZmVyZW5jZUNvbnRlbnQgPT09ICdzdHJpbmcnICYmIHJlZmVyZW5jZUNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiByZWZlcmVuY2VDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM3Mjc6IFZhbGlkYXRlIFYyIGFnZW50IGZpZWxkcyBhdCB3cml0ZSB0aW1lLlxuICAgKlxuICAgKiBOb3JtYWxpemVzIHNuYWtlX2Nhc2Ug4oaSIGNhbWVsQ2FzZSAoc2FtZSBhcyBwYXJzZU1ldGFkYXRhKSBhbmQgdGhlbiB2YWxpZGF0ZXNcbiAgICogc3RydWN0dXJhbCBjb25zdHJhaW50cy4gVW5saWtlIHBhcnNlTWV0YWRhdGEgKHdoaWNoIHNpbGVudGx5IHN0cmlwcyBmb3JcbiAgICogYmFja3dhcmQgY29tcGF0KSwgdGhpcyByZXR1cm5zIGVycm9ycyBzbyB0aGUgY2FsbGVyIGNhbiByZWplY3QgdGhlIGNyZWF0ZS5cbiAgICpcbiAgICogTXV0YXRlcyB0aGUgbWV0YWRhdGEgaW4gcGxhY2UgKG5vcm1hbGl6YXRpb24pLCByZXR1cm5zIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKG1ldGFkYXRhOiBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gLS0tIHRvb2xzIC0tLVxuICAgIGlmIChtZXRhZGF0YS50b29scyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnRvb2xzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzKSB8fCBtZXRhZGF0YS50b29scyA9PT0gbnVsbCkge1xuICAgICAgICBlcnJvcnMucHVzaCgndG9vbHMgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBhbGxvd2VkL2RlbmllZCBhcnJheXMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5hbGxvd2VkKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCd0b29scy5hbGxvd2VkIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEudG9vbHMuZGVuaWVkICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuZGVuaWVkKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCd0b29scy5kZW5pZWQgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gc3lzdGVtUHJvbXB0IC0tLVxuICAgIGlmIChtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3JzLnB1c2goJ3N5c3RlbVByb21wdCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICAgIC8vIHNuYWtlX2Nhc2UgdmFyaWFudCAoSXNzdWUgIzcyNTogbm9ybWFsaXplZCBhdCBkaXNwYXRjaGVyIGxldmVsIGV2ZW50dWFsbHkpXG4gICAgY29uc3QgYW55TWV0YSA9IG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChhbnlNZXRhLnN5c3RlbV9wcm9tcHQgIT09IHVuZGVmaW5lZCAmJiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBhbnlNZXRhLnN5c3RlbV9wcm9tcHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLnN5c3RlbVByb21wdCA9IGFueU1ldGEuc3lzdGVtX3Byb21wdCBhcyBzdHJpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcnMucHVzaCgnc3lzdGVtX3Byb21wdCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBkZWxldGUgYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuICAgIH1cblxuICAgIC8vIC0tLSBhdXRvbm9teSAtLS1cbiAgICBpZiAobWV0YWRhdGEuYXV0b25vbXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hdXRvbm9teSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5hdXRvbm9teSkgfHwgbWV0YWRhdGEuYXV0b25vbXkgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ2F1dG9ub215IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvblxuICAgICAgICBjb25zdCBhID0gbWV0YWRhdGEuYXV0b25vbXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG5vcm1hbGl6ZUF1dG9ub215S2V5cyhhKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSBhZnRlciBub3JtYWxpemF0aW9uXG4gICAgICAgIGlmIChhLnJpc2tUb2xlcmFuY2UgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2YoYS5yaXNrVG9sZXJhbmNlLCBSSVNLX1RPTEVSQU5DRV9MRVZFTFMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYGF1dG9ub215LnJpc2tUb2xlcmFuY2UgbXVzdCBiZSBvbmUgb2Y6ICR7UklTS19UT0xFUkFOQ0VfTEVWRUxTLmpvaW4oJywgJyl9IChnb3QgJyR7YS5yaXNrVG9sZXJhbmNlfScpYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5tYXhBdXRvbm9tb3VzU3RlcHMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLnJlcXVpcmVzQXBwcm92YWwgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShhLnJlcXVpcmVzQXBwcm92YWwpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ2F1dG9ub215LnJlcXVpcmVzQXBwcm92YWwgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEuYXV0b0FwcHJvdmUgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShhLmF1dG9BcHByb3ZlKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5hdXRvQXBwcm92ZSBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLSByZXNpbGllbmNlIC0tLVxuICAgIGlmIChtZXRhZGF0YS5yZXNpbGllbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEucmVzaWxpZW5jZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5yZXNpbGllbmNlKSB8fCBtZXRhZGF0YS5yZXNpbGllbmNlID09PSBudWxsKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvblxuICAgICAgICBjb25zdCByID0gbWV0YWRhdGEucmVzaWxpZW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMocik7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgYWZ0ZXIgbm9ybWFsaXphdGlvblxuICAgICAgICBpZiAoci5vblN0ZXBMaW1pdFJlYWNoZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5vblN0ZXBMaW1pdFJlYWNoZWQsIFNURVBfTElNSVRfQUNUSU9OUykpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgcmVzaWxpZW5jZS5vblN0ZXBMaW1pdFJlYWNoZWQgbXVzdCBiZSBvbmUgb2Y6ICR7U1RFUF9MSU1JVF9BQ1RJT05TLmpvaW4oJywgJyl9IChnb3QgJyR7ci5vblN0ZXBMaW1pdFJlYWNoZWR9JylgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5vbkV4ZWN1dGlvbkZhaWx1cmUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5vbkV4ZWN1dGlvbkZhaWx1cmUsIEVYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYHJlc2lsaWVuY2Uub25FeGVjdXRpb25GYWlsdXJlIG11c3QgYmUgb25lIG9mOiAke0VYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMuam9pbignLCAnKX0gKGdvdCAnJHtyLm9uRXhlY3V0aW9uRmFpbHVyZX0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5tYXhSZXRyaWVzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlLm1heFJldHJpZXMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heENvbnRpbnVhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5tYXhDb250aW51YXRpb25zICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlLm1heENvbnRpbnVhdGlvbnMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnJldHJ5QmFja29mZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLnJldHJ5QmFja29mZiwgQkFDS09GRl9TVFJBVEVHSUVTKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGByZXNpbGllbmNlLnJldHJ5QmFja29mZiBtdXN0IGJlIG9uZSBvZjogJHtCQUNLT0ZGX1NUUkFURUdJRVMuam9pbignLCAnKX0gKGdvdCAnJHtyLnJldHJ5QmFja29mZn0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnByZXNlcnZlU3RhdGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5wcmVzZXJ2ZVN0YXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZS5wcmVzZXJ2ZVN0YXRlIG11c3QgYmUgYSBib29sZWFuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gYWN0aXZhdGVzIC0tLVxuICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hY3RpdmF0ZXMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYWN0aXZhdGVzKSB8fCBtZXRhZGF0YS5hY3RpdmF0ZXMgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ2FjdGl2YXRlcyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIHNraWxscy9wZXJzb25hcy9tZW1vcmllcy90ZW1wbGF0ZXMvZW5zZW1ibGVzIGFycmF5cycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGdvYWwgaW5wdXQgdG8gVjIgZm9ybWF0LlxuICAgKiBMTE1zIG1heSBwYXNzIGdvYWwgYXMgYSBzaW1wbGUgc3RyaW5nIG9yIGFzIGEgVjIgY29uZmlnIG9iamVjdC5cbiAgICogVGhpcyBlbnN1cmVzIHdlIGFsd2F5cyBoYXZlIGEgcHJvcGVyIFYyIHN0cnVjdHVyZSBiZWZvcmUgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGdvYWwgLSBFaXRoZXIgYSBzdHJpbmcgZ29hbCBvciBhIFYyIGdvYWwgY29uZmlnIG9iamVjdFxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIFYyIGdvYWwgY29uZmlnLCBvciB1bmRlZmluZWQgaWYgbm8gZ29hbCBwcm92aWRlZFxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVHb2FsSW5wdXQoZ29hbDogc3RyaW5nIHwgUGFydGlhbDxBZ2VudEdvYWxDb25maWc+IHwgdW5kZWZpbmVkKTogQWdlbnRHb2FsQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWdvYWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhIHN0cmluZywgY29udmVydCB0byBWMiBmb3JtYXRcbiAgICBpZiAodHlwZW9mIGdvYWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0NvbnZlcnRpbmcgc3RyaW5nIGdvYWwgdG8gVjIgZm9ybWF0JywgeyBnb2FsIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVtcGxhdGU6IGdvYWwsXG4gICAgICAgIHBhcmFtZXRlcnM6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhbiBvYmplY3Qgd2l0aCB0ZW1wbGF0ZSwgbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBpZiAodHlwZW9mIGdvYWwgPT09ICdvYmplY3QnICYmICd0ZW1wbGF0ZScgaW4gZ29hbCAmJiB0eXBlb2YgZ29hbC50ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzbmFrZV9jYXNlIGdvYWwgc3ViLWZpZWxkcyBiZWZvcmUgYWNjZXNzaW5nXG4gICAgICBub3JtYWxpemVHb2FsS2V5cyhnb2FsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgICBjb25zdCB2YWxpZFBhcmFtVHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddIGFzIGNvbnN0O1xuICAgICAgY29uc3QgdmFsaWRhdGVkUGFyYW1zOiBBZ2VudEdvYWxQYXJhbWV0ZXJbXSA9IChnb2FsLnBhcmFtZXRlcnMgfHwgW10pLm1hcCgocCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiBwLm5hbWUgPT09ICdzdHJpbmcnID8gcC5uYW1lIDogYHBhcmFtXyR7aW5kZXh9YDtcbiAgICAgICAgY29uc3QgdHlwZSA9IHZhbGlkUGFyYW1UeXBlcy5pbmNsdWRlcyhwLnR5cGUgYXMgdHlwZW9mIHZhbGlkUGFyYW1UeXBlc1tudW1iZXJdKVxuICAgICAgICAgID8gcC50eXBlIGFzICdzdHJpbmcnIHwgJ251bWJlcicgfCAnYm9vbGVhbidcbiAgICAgICAgICA6ICdzdHJpbmcnO1xuICAgICAgICBjb25zdCByZXF1aXJlZCA9IHR5cGVvZiBwLnJlcXVpcmVkID09PSAnYm9vbGVhbicgPyBwLnJlcXVpcmVkIDogZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGVkOiBBZ2VudEdvYWxQYXJhbWV0ZXIgPSB7IG5hbWUsIHR5cGUsIHJlcXVpcmVkIH07XG4gICAgICAgIGlmICh0eXBlb2YgcC5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycgJiYgcC5kZXNjcmlwdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFsaWRhdGVkLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChwLmRlc2NyaXB0aW9uLCA1MDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFNhbml0aXplIHN0cmluZyBkZWZhdWx0cyB0byBwcmV2ZW50IGluamVjdGlvbiB3aGVuIHVzZWQgaW4gZ29hbCByZW5kZXJpbmdcbiAgICAgICAgICBpZiAodHlwZW9mIHAuZGVmYXVsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlZC5kZWZhdWx0ID0gc2FuaXRpemVJbnB1dChwLmRlZmF1bHQsIDUwMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbGlkYXRlZC5kZWZhdWx0ID0gcC5kZWZhdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWRhdGVkO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRlbXBsYXRlOiBnb2FsLnRlbXBsYXRlLFxuICAgICAgICBwYXJhbWV0ZXJzOiB2YWxpZGF0ZWRQYXJhbXMsXG4gICAgICAgIHN1Y2Nlc3NDcml0ZXJpYTogZ29hbC5zdWNjZXNzQ3JpdGVyaWFcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gT2JqZWN0IHdpdGhvdXQgdGVtcGxhdGUgLSBjYW5ub3QgY29udmVydFxuICAgIGxvZ2dlci53YXJuKCdHb2FsIG9iamVjdCBtaXNzaW5nIHRlbXBsYXRlIGZpZWxkLCBjYW5ub3QgY29udmVydCB0byBWMicsIHsgZ29hbCB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUFnZW50RmlsZShjb250ZW50OiBzdHJpbmcpOiBQYXJzZWRBZ2VudEZpbGUge1xuICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgZnJvbnRtYXR0ZXIgcGFyc2luZ1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihjb250ZW50LCB7XG4gICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIucGFyc2VBZ2VudEZpbGUnXG4gICAgfSk7XG5cbiAgICAvLyBTZXJpYWxpemF0aW9uU2VydmljZSBlbnN1cmVzIGZyb250bWF0dGVyIGV4aXN0cywgb3IgdGhyb3dzIGVycm9yXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiByZXN1bHQuZGF0YSBhcyBBZ2VudE1ldGFkYXRhLFxuICAgICAgY29udGVudDogcmVzdWx0LmNvbnRlbnQudHJpbSgpXG4gICAgfTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlsZW5hbWUgZm9yIGFuIGFnZW50IGVsZW1lbnQuXG4gICAqXG4gICAqIFVzZXMgaW5oZXJpdGVkIG5vcm1hbGl6ZUZpbGVuYW1lKCkgZnJvbSBCYXNlRWxlbWVudE1hbmFnZXIgZm9yIGNvbnNpc3RlbnRcbiAgICogZmlsZW5hbWUgZm9ybWF0dGluZyBhY3Jvc3MgYWxsIGVsZW1lbnQgbWFuYWdlcnMuXG4gICAqXG4gICAqIEV4YW1wbGVzOlxuICAgKiAgIFwiQ3JlYXRpdmUgV3JpdGVyXCIgLT4gXCJjcmVhdGl2ZS13cml0ZXIubWRcIlxuICAgKiAgIFwiQ1JVRFYtQWdlbnQtRGVsdGFcIiAtPiBcImNydWR2LWFnZW50LWRlbHRhLm1kXCJcbiAgICogICBcIk11bHRpX0dvYWxfQWdlbnRcIiAtPiBcIm11bHRpLWdvYWwtYWdlbnQubWRcIlxuICAgKiAgIFwiQ2FtZWxDYXNlTmFtZVwiIC0+IFwiY2FtZWwtY2FzZS1uYW1lLm1kXCJcbiAgICovXG4gIHByaXZhdGUgZ2V0RmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgaW5oZXJpdGVkIG5vcm1hbGl6ZUZpbGVuYW1lKCkgZm9yIHVuaWZpZWQgbm9ybWFsaXphdGlvblxuICAgIHJldHVybiB0aGlzLmdldEVsZW1lbnRGaWxlbmFtZShuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVFbGVtZW50TmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL15bYS16QS1aMC05Xy1dKyQvLnRlc3QobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdXNlciBmb3IgYXR0cmlidXRpb25cbiAgICogUkVGQUNUT1JFRDogRGVsZWdhdGVzIHRvIE1ldGFkYXRhU2VydmljZSBmb3IgY29uc2lzdGVudCB1c2VyIGF0dHJpYnV0aW9uIGFjcm9zcyBhbGwgbWFuYWdlcnNcbiAgICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhU2VydmljZS5nZXRDdXJyZW50VXNlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlU3RhdGVGb3JTZXJpYWxpemF0aW9uKHN0YXRlOiBBZ2VudFN0YXRlKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxhc3RBY3RpdmU6IHN0YXRlLmxhc3RBY3RpdmUgaW5zdGFuY2VvZiBEYXRlID8gc3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpIDogc3RhdGUubGFzdEFjdGl2ZSxcbiAgICAgIHNlc3Npb25Db3VudDogU3RyaW5nKHN0YXRlLnNlc3Npb25Db3VudCA/PyAwKSxcbiAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoc3RhdGUuc3RhdGVWZXJzaW9uKSA6ICcxJywgIC8vIEluY2x1ZGUgdmVyc2lvbiBmb3Igb3B0aW1pc3RpYyBsb2NraW5nXG4gICAgICBnb2Fsczogc3RhdGUuZ29hbHMubWFwKGdvYWwgPT4gKHtcbiAgICAgICAgLi4uZ29hbCxcbiAgICAgICAgY3JlYXRlZEF0OiBnb2FsLmNyZWF0ZWRBdCBpbnN0YW5jZW9mIERhdGUgPyBnb2FsLmNyZWF0ZWRBdC50b0lTT1N0cmluZygpIDogZ29hbC5jcmVhdGVkQXQsXG4gICAgICAgIHVwZGF0ZWRBdDogZ29hbC51cGRhdGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC51cGRhdGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwudXBkYXRlZEF0LFxuICAgICAgICBjb21wbGV0ZWRBdDogZ29hbC5jb21wbGV0ZWRBdCBpbnN0YW5jZW9mIERhdGUgPyBnb2FsLmNvbXBsZXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLmNvbXBsZXRlZEF0LFxuICAgICAgICBpbXBvcnRhbmNlOiBnb2FsLmltcG9ydGFuY2UgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhnb2FsLmltcG9ydGFuY2UpIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmdlbmN5OiBnb2FsLnVyZ2VuY3kgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhnb2FsLnVyZ2VuY3kpIDogdW5kZWZpbmVkLFxuICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ6IGdvYWwuZXN0aW1hdGVkRWZmb3J0ICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC5lc3RpbWF0ZWRFZmZvcnQpIDogdW5kZWZpbmVkXG4gICAgICB9KSksXG4gICAgICBkZWNpc2lvbnM6IHN0YXRlLmRlY2lzaW9ucy5tYXAoZGVjaXNpb24gPT4gKHtcbiAgICAgICAgLi4uZGVjaXNpb24sXG4gICAgICAgIHRpbWVzdGFtcDogZGVjaXNpb24udGltZXN0YW1wIGluc3RhbmNlb2YgRGF0ZSA/IGRlY2lzaW9uLnRpbWVzdGFtcC50b0lTT1N0cmluZygpIDogZGVjaXNpb24udGltZXN0YW1wLFxuICAgICAgICBjb25maWRlbmNlOiBkZWNpc2lvbi5jb25maWRlbmNlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZGVjaXNpb24uY29uZmlkZW5jZSkgOiB1bmRlZmluZWRcbiAgICAgIH0pKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUxvYWRlZFN0YXRlKHN0YXRlOiBBZ2VudFN0YXRlKTogdm9pZCB7XG4gICAgLy8gRklYIChJc3N1ZSAjMTIzKTogRGVmYXVsdCBtaXNzaW5nIGFycmF5cyB0byBwcmV2ZW50IFR5cGVFcnJvclxuICAgIC8vIElmIHN0YXRlIGZpbGUgaXMgbWlzc2luZyBnb2Fscy9kZWNpc2lvbnMvY29udGV4dCwgZGVmYXVsdCB0byBlbXB0eSBhcnJheXMvb2JqZWN0c1xuICAgIGlmICghc3RhdGUuZ29hbHMpIHtcbiAgICAgIHN0YXRlLmdvYWxzID0gW107XG4gICAgfVxuICAgIGlmICghc3RhdGUuZGVjaXNpb25zKSB7XG4gICAgICBzdGF0ZS5kZWNpc2lvbnMgPSBbXTtcbiAgICB9XG4gICAgaWYgKCFzdGF0ZS5jb250ZXh0KSB7XG4gICAgICBzdGF0ZS5jb250ZXh0ID0ge307XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnNlc3Npb25Db3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGF0ZS5zZXNzaW9uQ291bnQgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKHN0YXRlLnNlc3Npb25Db3VudCksIDEwKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBzdGF0ZVZlcnNpb24gZm9yIG9wdGltaXN0aWMgbG9ja2luZyAoSXNzdWUgIzI0KVxuICAgIGlmIChzdGF0ZS5zdGF0ZVZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RhdGUuc3RhdGVWZXJzaW9uID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhzdGF0ZS5zdGF0ZVZlcnNpb24pLCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdmVyc2lvbiAxIGlmIG5vdCBwcmVzZW50IChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgICAgIHN0YXRlLnN0YXRlVmVyc2lvbiA9IDE7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmxhc3RBY3RpdmUpIHtcbiAgICAgIHN0YXRlLmxhc3RBY3RpdmUgPSBuZXcgRGF0ZShzdGF0ZS5sYXN0QWN0aXZlKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuZ29hbHMpIHtcbiAgICAgIHN0YXRlLmdvYWxzLmZvckVhY2goZ29hbCA9PiB7XG4gICAgICAgIGlmIChnb2FsLmltcG9ydGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGdvYWwuaW1wb3J0YW5jZSA9IE51bWJlci5wYXJzZUludChTdHJpbmcoZ29hbC5pbXBvcnRhbmNlKSwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnb2FsLnVyZ2VuY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGdvYWwudXJnZW5jeSA9IE51bWJlci5wYXJzZUludChTdHJpbmcoZ29hbC51cmdlbmN5KSwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnb2FsLmVzdGltYXRlZEVmZm9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZ29hbC5lc3RpbWF0ZWRFZmZvcnQgPSBOdW1iZXIucGFyc2VGbG9hdChTdHJpbmcoZ29hbC5lc3RpbWF0ZWRFZmZvcnQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC5jcmVhdGVkQXQpIHtcbiAgICAgICAgICBnb2FsLmNyZWF0ZWRBdCA9IG5ldyBEYXRlKGdvYWwuY3JlYXRlZEF0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC51cGRhdGVkQXQpIHtcbiAgICAgICAgICBnb2FsLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKGdvYWwudXBkYXRlZEF0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC5jb21wbGV0ZWRBdCkge1xuICAgICAgICAgIGdvYWwuY29tcGxldGVkQXQgPSBuZXcgRGF0ZShnb2FsLmNvbXBsZXRlZEF0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmRlY2lzaW9ucykge1xuICAgICAgc3RhdGUuZGVjaXNpb25zLmZvckVhY2goZGVjaXNpb24gPT4ge1xuICAgICAgICBpZiAoZGVjaXNpb24uY29uZmlkZW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZGVjaXNpb24uY29uZmlkZW5jZSA9IE51bWJlci5wYXJzZUZsb2F0KFN0cmluZyhkZWNpc2lvbi5jb25maWRlbmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlY2lzaW9uLnRpbWVzdGFtcCkge1xuICAgICAgICAgIGRlY2lzaW9uLnRpbWVzdGFtcCA9IG5ldyBEYXRlKGRlY2lzaW9uLnRpbWVzdGFtcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSBzdGVwIGluIGFnZW50IGV4ZWN1dGlvblxuICAgKiBXcmFwcyBBZ2VudC5yZWNvcmREZWNpc2lvbigpIGZvciB0aGUgTUNQIHRvb2wgaW50ZXJmYWNlXG4gICAqXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudGljIExvb3AgUmVkZXNpZ25cbiAgICovXG4gIGFzeW5jIHJlY29yZEFnZW50U3RlcChwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBzdGVwRGVzY3JpcHRpb246IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgLyoqIE9wdGlvbmFsIGZpbmRpbmdzIG9yIHJlc3VsdHMgZnJvbSB0aGlzIHN0ZXAgKi9cbiAgICBmaW5kaW5ncz86IHN0cmluZztcbiAgICBjb25maWRlbmNlPzogbnVtYmVyO1xuICAgIC8qKiBPcHRpb25hbCBoaW50IGFib3V0IHdoYXQgdGhlIExMTSBwbGFucyB0byBkbyBuZXh0IChmb3IgcHJvYWN0aXZlIHJpc2sgZXZhbHVhdGlvbikgKi9cbiAgICBuZXh0QWN0aW9uSGludD86IHN0cmluZztcbiAgICAvKiogT3B0aW9uYWwgcmlzayBzY29yZSBmb3IgdGhlIGN1cnJlbnQgc3RlcCAoMC0xMDApICovXG4gICAgcmlza1Njb3JlPzogbnVtYmVyO1xuICAgIC8qKiBSdW50aW1lIG92ZXJyaWRlIGZvciBtYXhBdXRvbm9tb3VzU3RlcHMgKElzc3VlICM0NDcpICovXG4gICAgbWF4U3RlcHNPdmVycmlkZT86IG51bWJlcjtcbiAgfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGRlY2lzaW9uOiB7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgZ29hbElkOiBzdHJpbmc7XG4gICAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAgIGRlY2lzaW9uOiBzdHJpbmc7XG4gICAgICByZWFzb25pbmc6IHN0cmluZztcbiAgICAgIGZyYW1ld29yazogc3RyaW5nO1xuICAgICAgY29uZmlkZW5jZTogbnVtYmVyO1xuICAgICAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICAgIH07XG4gICAgc3RhdGU6IHtcbiAgICAgIGdvYWxDb3VudDogbnVtYmVyO1xuICAgICAgZGVjaXNpb25Db3VudDogbnVtYmVyO1xuICAgICAgbGFzdEFjdGl2ZTogc3RyaW5nO1xuICAgICAgc3RhdGVWZXJzaW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICAvKiogQXV0b25vbXkgZGlyZWN0aXZlIGluZGljYXRpbmcgd2hldGhlciB0byBjb250aW51ZSBvciBwYXVzZSAqL1xuICAgIGF1dG9ub215OiBBdXRvbm9teURpcmVjdGl2ZTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gR2V0IGFnZW50IHN0YXRlIHRvIGZpbmQgYWN0aXZlIGdvYWxzXG4gICAgY29uc3Qgc3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGFjdGl2ZUdvYWwgPSBzdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpO1xuXG4gICAgaWYgKCFhY3RpdmVHb2FsKSB7XG4gICAgICBjb25zdCBnb2FsU3RhdHVzZXMgPSBzdGF0ZS5nb2Fscy5tYXAoZyA9PiBgJHtnLmlkfTogJHtnLnN0YXR1c31gKS5qb2luKCcsICcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm8gYWN0aXZlIGdvYWwgZm91bmQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9Jy4gYCArXG4gICAgICAgIGBBdmFpbGFibGUgZ29hbHM6ICR7Z29hbFN0YXR1c2VzIHx8ICdub25lJ30uIGAgK1xuICAgICAgICBgVXNlIGV4ZWN1dGVfYWdlbnQgdG8gc3RhcnQgYSBuZXcgZ29hbCBmaXJzdC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIENhbGwgQWdlbnQucmVjb3JkRGVjaXNpb24oKSB0byBwZXJzaXN0IHRoZSBzdGVwXG4gICAgY29uc3QgZGVjaXNpb24gPSBhZ2VudC5yZWNvcmREZWNpc2lvbih7XG4gICAgICBnb2FsSWQ6IGFjdGl2ZUdvYWwuaWQsXG4gICAgICBkZWNpc2lvbjogcGFyYW1zLnN0ZXBEZXNjcmlwdGlvbixcbiAgICAgIHJlYXNvbmluZzogcGFyYW1zLmZpbmRpbmdzID8/ICcnLFxuICAgICAgY29uZmlkZW5jZTogcGFyYW1zLmNvbmZpZGVuY2UgPz8gMC44LFxuICAgICAgb3V0Y29tZTogcGFyYW1zLm91dGNvbWVcbiAgICB9KTtcblxuICAgIC8vIDQuIFNhdmUgYWdlbnQgc3RhdGVcbiAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChwYXJhbXMuYWdlbnROYW1lLCAxMDApO1xuICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKSk7XG5cbiAgICAvLyA1LiBHZXQgdXBkYXRlZCBzdGF0ZSBmb3Igc3RlcCBjb3VudCBhbmQgYXV0b25vbXkgZXZhbHVhdGlvblxuICAgIGNvbnN0IHVwZGF0ZWRTdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG5cbiAgICAvLyA2LiBDYWxjdWxhdGUgc3RlcCBjb3VudCBmb3IgdGhpcyBnb2FsXG4gICAgLy8gc3RlcENvdW50ID0gbnVtYmVyIG9mIHN0ZXBzIGNvbXBsZXRlZCAoaW5jbHVkaW5nIHRoZSBvbmUganVzdCByZWNvcmRlZClcbiAgICAvLyBUaGUgZXZhbHVhdG9yIHVzZXMgdGhpcyB0byBjaGVjayBpZiB3ZSd2ZSBoaXQgbWF4QXV0b25vbW91c1N0ZXBzXG4gICAgLy8gYW5kIHRvIGNvbXB1dGUgc3RlcHNSZW1haW5pbmcgZm9yIHRoZSBhdXRvbm9teSBkaXJlY3RpdmUuXG4gICAgY29uc3QgZ29hbERlY2lzaW9ucyA9IHVwZGF0ZWRTdGF0ZS5kZWNpc2lvbnMuZmlsdGVyKGQgPT4gZC5nb2FsSWQgPT09IGFjdGl2ZUdvYWwuaWQpO1xuICAgIGNvbnN0IHN0ZXBDb3VudCA9IGdvYWxEZWNpc2lvbnMubGVuZ3RoO1xuXG4gICAgLy8gNy4gR2V0IGFnZW50IG1ldGFkYXRhIGZvciBhdXRvbm9teSBjb25maWdcbiAgICBjb25zdCBhZ2VudE1ldGFkYXRhID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuXG4gICAgLy8gOC4gRXZhbHVhdGUgYXV0b25vbXkgLSBzaG91bGQgd2UgY29udGludWUgb3IgcGF1c2U/XG4gICAgLy8gSXNzdWUgIzQwMjogUGFzcyBESS1pbmplY3RlZCBEYW5nZXJab25lRW5mb3JjZXIgdmlhIGNvbnRleHRcbiAgICAvLyBJc3N1ZSAjNDQ3OiBBcHBseSBydW50aW1lIG1heEF1dG9ub21vdXNTdGVwcyBvdmVycmlkZSBpZiBwcm92aWRlZFxuICAgIGNvbnN0IGF1dG9ub215Q29uZmlnID0gcGFyYW1zLm1heFN0ZXBzT3ZlcnJpZGUgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IC4uLmFnZW50TWV0YWRhdGEuYXV0b25vbXksIG1heEF1dG9ub21vdXNTdGVwczogcGFyYW1zLm1heFN0ZXBzT3ZlcnJpZGUgfVxuICAgICAgOiBhZ2VudE1ldGFkYXRhLmF1dG9ub215O1xuXG4gICAgY29uc3QgYXV0b25vbXlEaXJlY3RpdmUgPSBldmFsdWF0ZUF1dG9ub215KHtcbiAgICAgIGFnZW50TmFtZTogcGFyYW1zLmFnZW50TmFtZSxcbiAgICAgIGF1dG9ub215Q29uZmlnLFxuICAgICAgc3RlcENvdW50LFxuICAgICAgY3VycmVudFN0ZXBEZXNjcmlwdGlvbjogcGFyYW1zLnN0ZXBEZXNjcmlwdGlvbixcbiAgICAgIGN1cnJlbnRTdGVwT3V0Y29tZTogcGFyYW1zLm91dGNvbWUsXG4gICAgICBuZXh0QWN0aW9uSGludDogcGFyYW1zLm5leHRBY3Rpb25IaW50LFxuICAgICAgcmlza1Njb3JlOiBwYXJhbXMucmlza1Njb3JlLFxuICAgICAgZGFuZ2VyWm9uZUVuZm9yY2VyOiBBZ2VudE1hbmFnZXIuZGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXI/LigpLFxuICAgICAgdmVyaWZpY2F0aW9uU3RvcmU6IEFnZW50TWFuYWdlci52ZXJpZmljYXRpb25TdG9yZVJlc29sdmVyPy4oKSxcbiAgICAgIGdvYWxEZXNjcmlwdGlvbjogYWN0aXZlR29hbC5kZXNjcmlwdGlvbixcbiAgICAgIGdvYWxJZDogYWN0aXZlR29hbC5pZCxcbiAgICB9KTtcblxuICAgIC8vIDkuIFJldHVybiBkZWNpc2lvbiwgc3RhdGUgc3VtbWFyeSwgYW5kIGF1dG9ub215IGRpcmVjdGl2ZVxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgbWVzc2FnZTogYFN0ZXAgcmVjb3JkZWQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9J2AsXG4gICAgICBkZWNpc2lvbjoge1xuICAgICAgICBpZDogZGVjaXNpb24uaWQsXG4gICAgICAgIGdvYWxJZDogZGVjaXNpb24uZ29hbElkLFxuICAgICAgICB0aW1lc3RhbXA6IGRlY2lzaW9uLnRpbWVzdGFtcC50b0lTT1N0cmluZygpLFxuICAgICAgICBkZWNpc2lvbjogZGVjaXNpb24uZGVjaXNpb24sXG4gICAgICAgIHJlYXNvbmluZzogZGVjaXNpb24ucmVhc29uaW5nLFxuICAgICAgICBmcmFtZXdvcms6IGRlY2lzaW9uLmZyYW1ld29yayxcbiAgICAgICAgY29uZmlkZW5jZTogZGVjaXNpb24uY29uZmlkZW5jZSxcbiAgICAgICAgb3V0Y29tZTogcGFyYW1zLm91dGNvbWVcbiAgICAgIH0sXG4gICAgICBzdGF0ZToge1xuICAgICAgICBnb2FsQ291bnQ6IHVwZGF0ZWRTdGF0ZS5nb2Fscy5sZW5ndGgsXG4gICAgICAgIGRlY2lzaW9uQ291bnQ6IHVwZGF0ZWRTdGF0ZS5kZWNpc2lvbnMubGVuZ3RoLFxuICAgICAgICBsYXN0QWN0aXZlOiB1cGRhdGVkU3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpLFxuICAgICAgICBzdGF0ZVZlcnNpb246IHVwZGF0ZWRTdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMVxuICAgICAgfSxcbiAgICAgIGF1dG9ub215OiBhdXRvbm9teURpcmVjdGl2ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29tcGxldGUgYW4gYWdlbnQgZ29hbFxuICAgKiBXcmFwcyBBZ2VudC5jb21wbGV0ZUdvYWwoKSBmb3IgdGhlIE1DUCB0b29sIGludGVyZmFjZVxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyBjb21wbGV0ZUFnZW50R29hbChwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBnb2FsSWQ/OiBzdHJpbmc7XG4gICAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICAgIHN1bW1hcnk6IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGdvYWw6IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgc3RhdHVzOiBcImNvbXBsZXRlZFwiIHwgXCJmYWlsZWRcIjtcbiAgICAgIGNyZWF0ZWRBdDogc3RyaW5nO1xuICAgICAgY29tcGxldGVkQXQ6IHN0cmluZztcbiAgICAgIGVzdGltYXRlZEVmZm9ydD86IG51bWJlcjtcbiAgICAgIGFjdHVhbEVmZm9ydD86IG51bWJlcjtcbiAgICB9O1xuICAgIG1ldHJpY3M6IHtcbiAgICAgIHN1Y2Nlc3NSYXRlOiBudW1iZXI7XG4gICAgICBnb2Fsc0NvbXBsZXRlZDogbnVtYmVyO1xuICAgICAgZ29hbHNJblByb2dyZXNzOiBudW1iZXI7XG4gICAgICBkZWNpc2lvbkFjY3VyYWN5OiBudW1iZXI7XG4gICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG51bWJlcjtcbiAgICB9O1xuICAgIHN0YXRlOiB7XG4gICAgICBnb2FsQ291bnQ6IG51bWJlcjtcbiAgICAgIGRlY2lzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gIH0+IHtcbiAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIDIuIEZpbmQgZ29hbCB0byBjb21wbGV0ZVxuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBsZXQgZ29hbDogQWdlbnRHb2FsIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHBhcmFtcy5nb2FsSWQpIHtcbiAgICAgIGdvYWwgPSBzdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5pZCA9PT0gcGFyYW1zLmdvYWxJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbmQgbW9zdCByZWNlbnQgaW4tcHJvZ3Jlc3MgZ29hbFxuICAgICAgZ29hbCA9IHN0YXRlLmdvYWxzXG4gICAgICAgIC5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJylcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIuY3JlYXRlZEF0LmdldFRpbWUoKSAtIGEuY3JlYXRlZEF0LmdldFRpbWUoKSlbMF07XG4gICAgfVxuXG4gICAgaWYgKCFnb2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHBhcmFtcy5nb2FsSWRcbiAgICAgICAgICA/IGBHb2FsICcke3BhcmFtcy5nb2FsSWR9JyBub3QgZm91bmRgXG4gICAgICAgICAgOiBgTm8gaW4tcHJvZ3Jlc3MgZ29hbCBmb3VuZCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBSZWNvcmQgZmluYWwgZGVjaXNpb24gd2l0aCBzdW1tYXJ5XG4gICAgYWdlbnQucmVjb3JkRGVjaXNpb24oe1xuICAgICAgZ29hbElkOiBnb2FsLmlkLFxuICAgICAgZGVjaXNpb246ICdnb2FsX2NvbXBsZXRlJyxcbiAgICAgIHJlYXNvbmluZzogcGFyYW1zLnN1bW1hcnksXG4gICAgICBjb25maWRlbmNlOiAxLjAsXG4gICAgICBvdXRjb21lOiBwYXJhbXMub3V0Y29tZVxuICAgIH0pO1xuXG4gICAgLy8gNC4gQ2FsbCBBZ2VudC5jb21wbGV0ZUdvYWwoKVxuICAgIGFnZW50LmNvbXBsZXRlR29hbChnb2FsLmlkLCBwYXJhbXMub3V0Y29tZSk7XG5cbiAgICAvLyA1LiBHZXQgcGVyZm9ybWFuY2UgbWV0cmljc1xuICAgIGNvbnN0IG1ldHJpY3MgPSBhZ2VudC5nZXRQZXJmb3JtYW5jZU1ldHJpY3MoKTtcblxuICAgIC8vIDYuIFNhdmUgYWdlbnQgc3RhdGVcbiAgICBjb25zdCBjb21wbGV0ZVNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KHBhcmFtcy5hZ2VudE5hbWUsIDEwMCk7XG4gICAgYXdhaXQgdGhpcy5zYXZlKGFnZW50LCB0aGlzLmdldEZpbGVuYW1lKGNvbXBsZXRlU2FuaXRpemVkTmFtZSkpO1xuXG4gICAgLy8gNy4gUmV0dXJuIGdvYWwsIG1ldHJpY3MsIGFuZCBzdGF0ZVxuICAgIGNvbnN0IHVwZGF0ZWRTdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgY29uc3QgY29tcGxldGVkR29hbCA9IHVwZGF0ZWRTdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5pZCA9PT0gZ29hbC5pZCkhO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtZXNzYWdlOiBgR29hbCBjb21wbGV0ZWQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9JyB3aXRoIG91dGNvbWU6ICR7cGFyYW1zLm91dGNvbWV9YCxcbiAgICAgIGdvYWw6IHtcbiAgICAgICAgaWQ6IGNvbXBsZXRlZEdvYWwuaWQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBjb21wbGV0ZWRHb2FsLmRlc2NyaXB0aW9uLFxuICAgICAgICBzdGF0dXM6IGNvbXBsZXRlZEdvYWwuc3RhdHVzIGFzIFwiY29tcGxldGVkXCIgfCBcImZhaWxlZFwiLFxuICAgICAgICBjcmVhdGVkQXQ6IGNvbXBsZXRlZEdvYWwuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGNvbXBsZXRlZEF0OiBjb21wbGV0ZWRHb2FsLmNvbXBsZXRlZEF0IS50b0lTT1N0cmluZygpLFxuICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ6IGNvbXBsZXRlZEdvYWwuZXN0aW1hdGVkRWZmb3J0LFxuICAgICAgICBhY3R1YWxFZmZvcnQ6IGNvbXBsZXRlZEdvYWwuYWN0dWFsRWZmb3J0XG4gICAgICB9LFxuICAgICAgbWV0cmljczoge1xuICAgICAgICBzdWNjZXNzUmF0ZTogbWV0cmljcy5zdWNjZXNzUmF0ZSxcbiAgICAgICAgZ29hbHNDb21wbGV0ZWQ6IG1ldHJpY3MuZ29hbHNDb21wbGV0ZWQsXG4gICAgICAgIGdvYWxzSW5Qcm9ncmVzczogbWV0cmljcy5nb2Fsc0luUHJvZ3Jlc3MsXG4gICAgICAgIGRlY2lzaW9uQWNjdXJhY3k6IG1ldHJpY3MuZGVjaXNpb25BY2N1cmFjeSxcbiAgICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBtZXRyaWNzLmF2ZXJhZ2VDb21wbGV0aW9uVGltZVxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIGdvYWxDb3VudDogdXBkYXRlZFN0YXRlLmdvYWxzLmxlbmd0aCxcbiAgICAgICAgZGVjaXNpb25Db3VudDogdXBkYXRlZFN0YXRlLmRlY2lzaW9ucy5sZW5ndGgsXG4gICAgICAgIGxhc3RBY3RpdmU6IHVwZGF0ZWRTdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXRlVmVyc2lvbjogdXBkYXRlZFN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWdlbnQgc3RhdGVcbiAgICogV3JhcHMgQWdlbnQuZ2V0U3RhdGUoKSBmb3IgdGhlIE1DUCB0b29sIGludGVyZmFjZVxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyBnZXRBZ2VudFN0YXRlKHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGluY2x1ZGVEZWNpc2lvbkhpc3Rvcnk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVDb250ZXh0PzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgc3RhdGU6IHtcbiAgICAgIGdvYWxzOiBBcnJheTx7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIHByaW9yaXR5OiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgICBpbXBvcnRhbmNlOiBudW1iZXI7XG4gICAgICAgIHVyZ2VuY3k6IG51bWJlcjtcbiAgICAgICAgZWlzZW5ob3dlclF1YWRyYW50Pzogc3RyaW5nO1xuICAgICAgICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgICAgICAgdXBkYXRlZEF0OiBzdHJpbmc7XG4gICAgICAgIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICAgICAgICBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXTtcbiAgICAgICAgcmlza0xldmVsPzogc3RyaW5nO1xuICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ/OiBudW1iZXI7XG4gICAgICAgIGFjdHVhbEVmZm9ydD86IG51bWJlcjtcbiAgICAgICAgbm90ZXM/OiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIGRlY2lzaW9uczogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBnb2FsSWQ6IHN0cmluZztcbiAgICAgICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgICAgIGRlY2lzaW9uOiBzdHJpbmc7XG4gICAgICAgIHJlYXNvbmluZzogc3RyaW5nO1xuICAgICAgICBmcmFtZXdvcms6IHN0cmluZztcbiAgICAgICAgY29uZmlkZW5jZTogbnVtYmVyO1xuICAgICAgICBvdXRjb21lPzogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIGNvbnRleHRTdW1tYXJ5OiB7XG4gICAgICAgIGtleXM6IHN0cmluZ1tdO1xuICAgICAgICBzaXplOiBudW1iZXI7XG4gICAgICB9O1xuICAgICAgbGFzdEFjdGl2ZTogc3RyaW5nO1xuICAgICAgc2Vzc2lvbkNvdW50OiBudW1iZXI7XG4gICAgICBzdGF0ZVZlcnNpb246IG51bWJlcjtcbiAgICB9O1xuICAgIG1ldHJpY3M6IHtcbiAgICAgIHN1Y2Nlc3NSYXRlOiBudW1iZXI7XG4gICAgICBnb2Fsc0NvbXBsZXRlZDogbnVtYmVyO1xuICAgICAgZ29hbHNJblByb2dyZXNzOiBudW1iZXI7XG4gICAgICBkZWNpc2lvbkFjY3VyYWN5OiBudW1iZXI7XG4gICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG51bWJlcjtcbiAgICB9O1xuICB9PiB7XG4gICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gVGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyAyLiBHZXQgYWdlbnQgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG5cbiAgICAvLyAzLiBHZXQgcGVyZm9ybWFuY2UgbWV0cmljc1xuICAgIGNvbnN0IG1ldHJpY3MgPSBhZ2VudC5nZXRQZXJmb3JtYW5jZU1ldHJpY3MoKTtcblxuICAgIC8vIDQuIEZpbHRlciBkZWNpc2lvbnMgYmFzZWQgb24gaW5jbHVkZURlY2lzaW9uSGlzdG9yeVxuICAgIGNvbnN0IGRlY2lzaW9ucyA9IHBhcmFtcy5pbmNsdWRlRGVjaXNpb25IaXN0b3J5XG4gICAgICA/IHN0YXRlLmRlY2lzaW9uc1xuICAgICAgOiBzdGF0ZS5kZWNpc2lvbnMuc2xpY2UoLTEwKTsgLy8gTGFzdCAxMCBkZWNpc2lvbnNcblxuICAgIC8vIDUuIEJ1aWxkIGNvbnRleHQgc3VtbWFyeVxuICAgIGNvbnN0IGNvbnRleHRLZXlzID0gT2JqZWN0LmtleXMoc3RhdGUuY29udGV4dCk7XG4gICAgY29uc3QgY29udGV4dFNpemUgPSBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb250ZXh0KS5sZW5ndGg7XG5cbiAgICAvLyA2LiBSZXR1cm4gc3RhdGUgYW5kIG1ldHJpY3NcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGFnZW50TmFtZTogcGFyYW1zLmFnZW50TmFtZSxcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIGdvYWxzOiBzdGF0ZS5nb2Fscy5tYXAoZyA9PiAoe1xuICAgICAgICAgIGlkOiBnLmlkLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBnLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHByaW9yaXR5OiBnLnByaW9yaXR5LFxuICAgICAgICAgIHN0YXR1czogZy5zdGF0dXMsXG4gICAgICAgICAgaW1wb3J0YW5jZTogZy5pbXBvcnRhbmNlLFxuICAgICAgICAgIHVyZ2VuY3k6IGcudXJnZW5jeSxcbiAgICAgICAgICBlaXNlbmhvd2VyUXVhZHJhbnQ6IGcuZWlzZW5ob3dlclF1YWRyYW50LFxuICAgICAgICAgIGNyZWF0ZWRBdDogZy5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IGcudXBkYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgY29tcGxldGVkQXQ6IGcuY29tcGxldGVkQXQ/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgZGVwZW5kZW5jaWVzOiBnLmRlcGVuZGVuY2llcyxcbiAgICAgICAgICByaXNrTGV2ZWw6IGcucmlza0xldmVsLFxuICAgICAgICAgIGVzdGltYXRlZEVmZm9ydDogZy5lc3RpbWF0ZWRFZmZvcnQsXG4gICAgICAgICAgYWN0dWFsRWZmb3J0OiBnLmFjdHVhbEVmZm9ydCxcbiAgICAgICAgICBub3RlczogZy5ub3Rlc1xuICAgICAgICB9KSksXG4gICAgICAgIGRlY2lzaW9uczogZGVjaXNpb25zLm1hcChkID0+ICh7XG4gICAgICAgICAgaWQ6IGQuaWQsXG4gICAgICAgICAgZ29hbElkOiBkLmdvYWxJZCxcbiAgICAgICAgICB0aW1lc3RhbXA6IGQudGltZXN0YW1wLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgZGVjaXNpb246IGQuZGVjaXNpb24sXG4gICAgICAgICAgcmVhc29uaW5nOiBkLnJlYXNvbmluZyxcbiAgICAgICAgICBmcmFtZXdvcms6IGQuZnJhbWV3b3JrLFxuICAgICAgICAgIGNvbmZpZGVuY2U6IGQuY29uZmlkZW5jZSxcbiAgICAgICAgICBvdXRjb21lOiBkLm91dGNvbWVcbiAgICAgICAgfSkpLFxuICAgICAgICBjb250ZXh0OiBwYXJhbXMuaW5jbHVkZUNvbnRleHQgPyBzdGF0ZS5jb250ZXh0IDogdW5kZWZpbmVkLFxuICAgICAgICBjb250ZXh0U3VtbWFyeToge1xuICAgICAgICAgIGtleXM6IGNvbnRleHRLZXlzLFxuICAgICAgICAgIHNpemU6IGNvbnRleHRTaXplXG4gICAgICAgIH0sXG4gICAgICAgIGxhc3RBY3RpdmU6IHN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc2Vzc2lvbkNvdW50OiBzdGF0ZS5zZXNzaW9uQ291bnQsXG4gICAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH0sXG4gICAgICBtZXRyaWNzOiB7XG4gICAgICAgIHN1Y2Nlc3NSYXRlOiBtZXRyaWNzLnN1Y2Nlc3NSYXRlLFxuICAgICAgICBnb2Fsc0NvbXBsZXRlZDogbWV0cmljcy5nb2Fsc0NvbXBsZXRlZCxcbiAgICAgICAgZ29hbHNJblByb2dyZXNzOiBtZXRyaWNzLmdvYWxzSW5Qcm9ncmVzcyxcbiAgICAgICAgZGVjaXNpb25BY2N1cmFjeTogbWV0cmljcy5kZWNpc2lvbkFjY3VyYWN5LFxuICAgICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG1ldHJpY3MuYXZlcmFnZUNvbXBsZXRpb25UaW1lXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZ2F0aGVyZWQgZGF0YSBmb3IgYSBzcGVjaWZpYyBnb2FsIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQWdncmVnYXRlcyBkZWNpc2lvbiBoaXN0b3J5LCBnb2FsIHN0YXRlLCBhbmQgc3VtbWFyeSBzdGF0aXN0aWNzXG4gICAqIGludG8gYSBzdHJ1Y3R1cmVkIEdhdGhlcmVkRGF0YSBvYmplY3QuIFRoaXMgaXMgYSByZWFkLXNpZGUgdmlld1xuICAgKiBvdmVyIGV4aXN0aW5nIGFnZW50IHN0YXRlIGRhdGEuXG4gICAqXG4gICAqIElzc3VlICM2ODogR2F0aGVyZWREYXRhRW50cnkgZm9yIHN0YXRlIHJlY29yZGluZ1xuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIENvbXBsZXRpb24gKEVwaWMgIzM4MClcbiAgICovXG4gIGFzeW5jIGdldEdhdGhlcmVkRGF0YShwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBnb2FsSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8R2F0aGVyZWREYXRhPiB7XG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBnYXRoZXJlZCA9IGdldEdhdGhlcmVkRGF0YShwYXJhbXMuYWdlbnROYW1lLCBwYXJhbXMuZ29hbElkLCBzdGF0ZSk7XG5cbiAgICBpZiAoIWdhdGhlcmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBHb2FsICcke3BhcmFtcy5nb2FsSWR9JyBub3QgZm91bmQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9Jy4gYCArXG4gICAgICAgIGBBdmFpbGFibGUgZ29hbHM6ICR7c3RhdGUuZ29hbHMubWFwKGcgPT4gZy5pZCkuam9pbignLCAnKSB8fCAnbm9uZSd9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2F0aGVyZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udGludWUgYWdlbnQgZXhlY3V0aW9uIGZyb20gcHJldmlvdXMgc3RhdGVcbiAgICogQ29tYmluZXMgZXhlY3V0ZUFnZW50IHdpdGggc3RhdGUgY29udGV4dFxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyBjb250aW51ZUFnZW50RXhlY3V0aW9uKHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBwcmV2aW91c1N0ZXBSZXN1bHQ/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPEV4ZWN1dGVBZ2VudFJlc3VsdCAmIHtcbiAgICBwcmV2aW91c1N0YXRlOiB7XG4gICAgICBnb2FsczogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgICAgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gICAgICB9PjtcbiAgICAgIHJlY2VudERlY2lzaW9uczogQXJyYXk8e1xuICAgICAgICBkZWNpc2lvbjogc3RyaW5nO1xuICAgICAgICByZWFzb25pbmc6IHN0cmluZztcbiAgICAgICAgb3V0Y29tZT86IHN0cmluZztcbiAgICAgICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHNlc3Npb25Db3VudDogbnVtYmVyO1xuICAgICAgbGFzdEFjdGl2ZTogc3RyaW5nO1xuICAgICAgc3RhdGVWZXJzaW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBjb250aW51YXRpb246IHtcbiAgICAgIGlzUmVzdW1pbmc6IGJvb2xlYW47XG4gICAgICBwcmV2aW91c1N0ZXBSZXN1bHQ/OiBzdHJpbmc7XG4gICAgICBzdWdnZXN0ZWROZXh0U3RlcHM/OiBzdHJpbmdbXTtcbiAgICB9O1xuICB9PiB7XG4gICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gVGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyAyLiBHZXQgY3VycmVudCBzdGF0ZVxuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcblxuICAgIC8vIDMuIENoZWNrIGlmIGFnZW50IGhhcyBiZWVuIGV4ZWN1dGVkIGJlZm9yZVxuICAgIGNvbnN0IGlzUmVzdW1pbmcgPSBzdGF0ZS5zZXNzaW9uQ291bnQgPiAwIHx8IHN0YXRlLmRlY2lzaW9ucy5sZW5ndGggPiAwO1xuXG4gICAgLy8gNC4gRXhlY3V0ZSBhZ2VudCBub3JtYWxseSAodGhpcyBhY3RpdmF0ZXMgZWxlbWVudHMgYW5kIGdldHMgY29udGV4dClcbiAgICBjb25zdCBleGVjdXRpb25QYXJhbXMgPSBwYXJhbXMucGFyYW1ldGVycyB8fCB7fTtcblxuICAgIGNvbnN0IGV4ZWN1dGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUFnZW50KFxuICAgICAgcGFyYW1zLmFnZW50TmFtZSxcbiAgICAgIGV4ZWN1dGlvblBhcmFtc1xuICAgICk7XG5cbiAgICAvLyA1LiBCdWlsZCBwcmV2aW91cyBzdGF0ZSBzdW1tYXJ5XG4gICAgY29uc3QgcmVjZW50RGVjaXNpb25zID0gc3RhdGUuZGVjaXNpb25zLnNsaWNlKC01KS5tYXAoZCA9PiAoe1xuICAgICAgZGVjaXNpb246IGQuZGVjaXNpb24sXG4gICAgICByZWFzb25pbmc6IGQucmVhc29uaW5nLFxuICAgICAgb3V0Y29tZTogZC5vdXRjb21lLFxuICAgICAgdGltZXN0YW1wOiBkLnRpbWVzdGFtcC50b0lTT1N0cmluZygpXG4gICAgfSkpO1xuXG4gICAgY29uc3QgZ29hbFN1bW1hcnkgPSBzdGF0ZS5nb2Fscy5tYXAoZyA9PiAoe1xuICAgICAgaWQ6IGcuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogZy5kZXNjcmlwdGlvbixcbiAgICAgIHN0YXR1czogZy5zdGF0dXMsXG4gICAgICBwcm9ncmVzczogdW5kZWZpbmVkIC8vIENvdWxkIGFkZCBwcm9ncmVzcyB0cmFja2luZyBpbiBmdXR1cmVcbiAgICB9KSk7XG5cbiAgICAvLyA2LiBHZW5lcmF0ZSBzdWdnZXN0ZWQgbmV4dCBzdGVwcyBiYXNlZCBvbiBzdGF0ZVxuICAgIGNvbnN0IHN1Z2dlc3RlZE5leHRTdGVwcyA9IHRoaXMuZ2VuZXJhdGVOZXh0U3RlcHMoc3RhdGUpO1xuXG4gICAgLy8gNy4gTWVyZ2UgZXhlY3V0aW9uIHJlc3VsdCB3aXRoIGNvbnRpbnVhdGlvbiBjb250ZXh0XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIEluY2x1ZGUgYWxsIGZpZWxkcyBmcm9tIGV4ZWN1dGVfYWdlbnQgcmVzdWx0XG4gICAgICAuLi5leGVjdXRpb25SZXN1bHQsXG5cbiAgICAgIC8vIEFkZCBwcmV2aW91cyBzdGF0ZSBpbmZvcm1hdGlvblxuICAgICAgcHJldmlvdXNTdGF0ZToge1xuICAgICAgICBnb2FsczogZ29hbFN1bW1hcnksXG4gICAgICAgIHJlY2VudERlY2lzaW9ucyxcbiAgICAgICAgc2Vzc2lvbkNvdW50OiBzdGF0ZS5zZXNzaW9uQ291bnQsXG4gICAgICAgIGxhc3RBY3RpdmU6IHN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMVxuICAgICAgfSxcblxuICAgICAgLy8gQWRkIGNvbnRpbnVhdGlvbiBjb250ZXh0XG4gICAgICBjb250aW51YXRpb246IHtcbiAgICAgICAgaXNSZXN1bWluZyxcbiAgICAgICAgcHJldmlvdXNTdGVwUmVzdWx0OiBwYXJhbXMucHJldmlvdXNTdGVwUmVzdWx0LFxuICAgICAgICBzdWdnZXN0ZWROZXh0U3RlcHNcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHN1Z2dlc3RlZCBuZXh0IHN0ZXBzIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVOZXh0U3RlcHMoc3RhdGU6IEFnZW50U3RhdGUpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc3VnZ2VzdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBDaGVjayBmb3IgcGVuZGluZyBnb2Fsc1xuICAgIGNvbnN0IHBlbmRpbmdHb2FscyA9IHN0YXRlLmdvYWxzLmZpbHRlcihnID0+IGcuc3RhdHVzID09PSAncGVuZGluZycpO1xuICAgIGlmIChwZW5kaW5nR29hbHMubGVuZ3RoID4gMCkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaChgU3RhcnQgd29yayBvbiAke3BlbmRpbmdHb2Fscy5sZW5ndGh9IHBlbmRpbmcgZ29hbChzKWApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBpbi1wcm9ncmVzcyBnb2Fsc1xuICAgIGNvbnN0IGluUHJvZ3Jlc3NHb2FscyA9IHN0YXRlLmdvYWxzLmZpbHRlcihnID0+IGcuc3RhdHVzID09PSAnaW5fcHJvZ3Jlc3MnKTtcbiAgICBpZiAoaW5Qcm9ncmVzc0dvYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYENvbnRpbnVlICR7aW5Qcm9ncmVzc0dvYWxzLmxlbmd0aH0gaW4tcHJvZ3Jlc3MgZ29hbChzKWApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBibG9ja2VkIGdvYWxzIChkZXBlbmRlbmNpZXMpXG4gICAgY29uc3QgYmxvY2tlZEdvYWxzID0gc3RhdGUuZ29hbHMuZmlsdGVyKGcgPT5cbiAgICAgIGcuZGVwZW5kZW5jaWVzICYmIGcuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDAgJiYgZy5zdGF0dXMgPT09ICdwZW5kaW5nJ1xuICAgICk7XG4gICAgaWYgKGJsb2NrZWRHb2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKGBSZXNvbHZlIGRlcGVuZGVuY2llcyBmb3IgJHtibG9ja2VkR29hbHMubGVuZ3RofSBibG9ja2VkIGdvYWwocylgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBkZWNpc2lvbiBoaXN0b3J5IGZvciBmYWlsdXJlc1xuICAgIGNvbnN0IHJlY2VudEZhaWx1cmVzID0gc3RhdGUuZGVjaXNpb25zXG4gICAgICAuc2xpY2UoLTEwKVxuICAgICAgLmZpbHRlcihkID0+IGQub3V0Y29tZSA9PT0gJ2ZhaWx1cmUnKTtcbiAgICBpZiAocmVjZW50RmFpbHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaChgUmV2aWV3IGFuZCBhZGRyZXNzICR7cmVjZW50RmFpbHVyZXMubGVuZ3RofSByZWNlbnQgZmFpbHVyZShzKWApO1xuICAgIH1cblxuICAgIHJldHVybiBzdWdnZXN0aW9ucztcbiAgfVxufVxuIl19
2471
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBR0gsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFlBQVksRUFDWixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsT0FBTyxFQUNQLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQVFMLHFCQUFxQixHQUd0QixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsZUFBZSxFQUFxQixNQUFNLG1CQUFtQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxHQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixzQkFBc0IsR0FDdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYs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QUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQztRQUN4QyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsV0FBVyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsY0FBYyxDQUFDLE1BQU0sb0JBQW9CLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWdlbnRNYW5hZ2VyIC0gUmVmYWN0b3JlZCB0byBleHRlbmQgQmFzZUVsZW1lbnRNYW5hZ2VyXG4gKiBNYW5hZ2VzIGFnZW50IENSVUQgb3BlcmF0aW9ucywgbWV0YWRhdGEgc2FuaXRpemF0aW9uLCBhbmQgc3RhdGUgcGVyc2lzdGVuY2UuXG4gKi9cblxuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi9BZ2VudC5qcyc7XG5pbXBvcnQge1xuICBDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT04sXG4gIEFHRU5UX0xJTUlUUyxcbiAgUklTS19UT0xFUkFOQ0VfTEVWRUxTLFxuICBTVEVQX0xJTUlUX0FDVElPTlMsXG4gIEVYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMsXG4gIEJBQ0tPRkZfU1RSQVRFR0lFUyxcbiAgaXNPbmVPZixcbiAgbm9ybWFsaXplQXV0b25vbXlLZXlzLFxuICBub3JtYWxpemVSZXNpbGllbmNlS2V5cyxcbiAgbm9ybWFsaXplR29hbEtleXMsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7XG4gIEFnZW50TWV0YWRhdGEsXG4gIEFnZW50U3RhdGUsXG4gIEV4ZWN1dGVBZ2VudFJlc3VsdCxcbiAgQWdlbnRHb2FsQ29uZmlnLFxuICBBZ2VudEdvYWxQYXJhbWV0ZXIsXG4gIEFnZW50TWV0YWRhdGFWMixcbiAgQWdlbnRHb2FsLFxuICBERUZBVUxUX1NBRkVUWV9DT05GSUcsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEF1dG9ub215RGlyZWN0aXZlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEdhdGhlcmVkRGF0YSwgdHlwZSBHYXRoZXJlZERhdGEgfSBmcm9tICcuL2dhdGhlcmVkRGF0YS5qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZUF1dG9ub215IH0gZnJvbSAnLi9hdXRvbm9teUV2YWx1YXRvci5qcyc7XG5pbXBvcnQge1xuICBpc1YxQWdlbnQsXG4gIGNvbnZlcnRWMVRvVjIsXG59IGZyb20gJy4vdjFUb1YyQ29udmVydGVyLmpzJztcbmltcG9ydCB7XG4gIGRldGVybWluZVNhZmV0eVRpZXIsXG4gIGNyZWF0ZVZlcmlmaWNhdGlvbkNoYWxsZW5nZSxcbiAgY3JlYXRlQ29uZmlybWF0aW9uUmVxdWVzdCxcbiAgY3JlYXRlRGFuZ2VyWm9uZU9wZXJhdGlvbixcbiAgY3JlYXRlRXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSAnLi9zYWZldHlUaWVyU2VydmljZS5qcyc7XG5pbXBvcnQgeyBCYXNlRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi9iYXNlL0Jhc2VFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyB0b1Npbmd1bGFyTGFiZWwgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZU5vcm1hbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVQYXRoIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgSW5wdXROb3JtYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXROb3JtYWxpemVyLmpzJztcbmltcG9ydCB7IFNhZmVSZWdleCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2Rvc1Byb3RlY3Rpb24uanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9UcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvU2VyaWFsaXphdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEVsZW1lbnRNZXNzYWdlcyB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRNZXNzYWdlcy5qcyc7XG5pbXBvcnQgeyBFbGVtZW50Tm90Rm91bmRFcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL3BvbGljaWVzL0VsZW1lbnRQb2xpY2llcy5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuXG5jb25zdCBBR0VOVF9GSUxFX0VYVEVOU0lPTiA9ICcubWQnO1xuY29uc3QgU1RBVEVfRElSRUNUT1JZID0gJy5zdGF0ZSc7XG5jb25zdCBTVEFURV9GSUxFX0VYVEVOU0lPTiA9ICcuc3RhdGUueWFtbCc7XG5jb25zdCBNQVhfWUFNTF9TSVpFID0gNjQgKiAxMDI0O1xuY29uc3QgTUFYX0ZJTEVfU0laRSA9IDEwMCAqIDEwMjQ7XG5cbi8vIElzc3VlICM4MzogQ2VudHJhbGl6ZWQgYWN0aXZlIGVsZW1lbnQgbGltaXRzIChjb25maWd1cmFibGUgdmlhIGVudiB2YXJzKVxuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnLCBnZXRNYXhBY3RpdmVMaW1pdCB9IGZyb20gJy4uLy4uL2NvbmZpZy9hY3RpdmUtZWxlbWVudC1saW1pdHMuanMnO1xuXG5pbnRlcmZhY2UgRWxlbWVudENyZWF0aW9uUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBlbGVtZW50PzogQWdlbnQ7XG59XG5cbmludGVyZmFjZSBQYXJzZWRBZ2VudEZpbGUge1xuICBtZXRhZGF0YTogQWdlbnRNZXRhZGF0YTtcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG50eXBlIEFnZW50Q3JlYXRlTWV0YWRhdGEgPSAoUGFydGlhbDxBZ2VudE1ldGFkYXRhPiAmIFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPikgJiB7XG4gIGNvbnRlbnQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgQWdlbnRNYW5hZ2VyIGV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyPEFnZW50PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZUNhY2hlOiBNYXA8c3RyaW5nLCBBZ2VudFN0YXRlPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSB0cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U6IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSB2YWxpZGF0aW9uU2VydmljZTogVmFsaWRhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgc2VyaWFsaXphdGlvblNlcnZpY2U6IFNlcmlhbGl6YXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlO1xuICAvLyBUcmFjayBhY3RpdmUgYWdlbnRzIGJ5IG5hbWUgKHN0YWJsZSBpZGVudGlmaWVyKVxuICBwcml2YXRlIGFjdGl2ZUFnZW50TmFtZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIC8vIFN0YXRpYyByZXNvbHZlciBmb3IgZWxlbWVudCBtYW5hZ2VyIGxvb2t1cCAoREkgcGF0dGVybilcbiAgLy8gVGhpcyBhbGxvd3MgQWdlbnQgaW5zdGFuY2VzIHRvIHJlc29sdmUgbWFuYWdlcnMgd2l0aG91dCB0aWdodCBjb3VwbGluZ1xuICBwcml2YXRlIHN0YXRpYyBlbGVtZW50TWFuYWdlclJlc29sdmVyPzogKG1hbmFnZXJOYW1lOiBzdHJpbmcpID0+IGFueTtcblxuICAvLyBJc3N1ZSAjNDAyOiBTdGF0aWMgcmVzb2x2ZXIgZm9yIERhbmdlclpvbmVFbmZvcmNlciAoREkgcGF0dGVybilcbiAgcHJpdmF0ZSBzdGF0aWMgZGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXI/OiAoKSA9PiBpbXBvcnQoJy4vdHlwZXMuanMnKS5EYW5nZXJab25lQmxvY2tlcjtcblxuICAvLyBJc3N1ZSAjMTQyOiBTdGF0aWMgcmVzb2x2ZXIgZm9yIFZlcmlmaWNhdGlvblN0b3JlIChESSBwYXR0ZXJuKVxuICBwcml2YXRlIHN0YXRpYyB2ZXJpZmljYXRpb25TdG9yZVJlc29sdmVyPzogKCkgPT4geyBzZXQ6IChpZDogc3RyaW5nLCBjaGFsbGVuZ2U6IHsgY29kZTogc3RyaW5nOyBleHBpcmVzQXQ6IG51bWJlcjsgcmVhc29uOiBzdHJpbmcgfSkgPT4gdm9pZCB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXIsXG4gICAgYmFzZURpcjogc3RyaW5nLFxuICAgIGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHZhbGlkYXRpb25SZWdpc3RyeTogVmFsaWRhdGlvblJlZ2lzdHJ5LFxuICAgIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZSxcbiAgICBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZSxcbiAgICBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZSxcbiAgICBtZW1vcnlCdWRnZXQ/OiBpbXBvcnQoJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJykuQ2FjaGVNZW1vcnlCdWRnZXQsXG4gICAgYmFja3VwU2VydmljZT86IGltcG9ydCgnLi4vLi4vc2VydmljZXMvQmFja3VwU2VydmljZS5qcycpLkJhY2t1cFNlcnZpY2VcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudERpck92ZXJyaWRlID0gcGF0aC5qb2luKGJhc2VEaXIsIEVsZW1lbnRUeXBlLkFHRU5UKTtcbiAgICBzdXBlcihFbGVtZW50VHlwZS5BR0VOVCwgcG9ydGZvbGlvTWFuYWdlciwgZmlsZUxvY2tNYW5hZ2VyLCB7IGVsZW1lbnREaXJPdmVycmlkZSwgZmlsZVdhdGNoU2VydmljZSwgbWVtb3J5QnVkZ2V0LCBiYWNrdXBTZXJ2aWNlIH0sIGZpbGVPcGVyYXRpb25zU2VydmljZSwgdmFsaWRhdGlvblJlZ2lzdHJ5KTtcbiAgICB0aGlzLnN0YXRlRGlyID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgU1RBVEVfRElSRUNUT1JZKTtcbiAgICB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFZhbGlkYXRpb25TZXJ2aWNlKCk7XG4gICAgdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZSA9IHNlcmlhbGl6YXRpb25TZXJ2aWNlO1xuICAgIHRoaXMubWV0YWRhdGFTZXJ2aWNlID0gbWV0YWRhdGFTZXJ2aWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldEVsZW1lbnRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYWdlbnQnO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB0aGUgZWxlbWVudCBtYW5hZ2VyIHJlc29sdmVyIGZvciBlbGVtZW50LWFnbm9zdGljIGFjdGl2YXRpb25cbiAgICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIERJIGNvbnRhaW5lciBkdXJpbmcgaW5pdGlhbGl6YXRpb25cbiAgICogRm9sbG93cyB0aGUgc2FtZSBwYXR0ZXJuIGFzIE1lbW9yeS5jb25maWd1cmVNZW1vcnlNYW5hZ2VyUmVzb2x2ZXJcbiAgICpcbiAgICogQHBhcmFtIHJlc29sdmVyIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBtYW5hZ2VyIG5hbWUgYW5kIHJldHVybnMgdGhlIG1hbmFnZXIgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0RWxlbWVudE1hbmFnZXJSZXNvbHZlcihyZXNvbHZlcjogKG1hbmFnZXJOYW1lOiBzdHJpbmcpID0+IGFueSk6IHZvaWQge1xuICAgIEFnZW50TWFuYWdlci5lbGVtZW50TWFuYWdlclJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzQwMjogU2V0IERhbmdlclpvbmVFbmZvcmNlciByZXNvbHZlciBmb3IgREkgaW5qZWN0aW9uLlxuICAgKiBDYWxsZWQgYnkgdGhlIERJIGNvbnRhaW5lciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldERhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyKHJlc29sdmVyOiAoKSA9PiBpbXBvcnQoJy4vdHlwZXMuanMnKS5EYW5nZXJab25lQmxvY2tlcik6IHZvaWQge1xuICAgIEFnZW50TWFuYWdlci5kYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICMxNDI6IFNldCBWZXJpZmljYXRpb25TdG9yZSByZXNvbHZlciBmb3IgREkgaW5qZWN0aW9uLlxuICAgKiBDYWxsZWQgYnkgdGhlIERJIGNvbnRhaW5lciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldFZlcmlmaWNhdGlvblN0b3JlUmVzb2x2ZXIocmVzb2x2ZXI6ICgpID0+IHsgc2V0OiAoaWQ6IHN0cmluZywgY2hhbGxlbmdlOiB7IGNvZGU6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXI7IHJlYXNvbjogc3RyaW5nIH0pID0+IHZvaWQgfSk6IHZvaWQge1xuICAgIEFnZW50TWFuYWdlci52ZXJpZmljYXRpb25TdG9yZVJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlbGVtZW50IG1hbmFnZXIgcmVzb2x2ZXJcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldEVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIoKTogKChtYW5hZ2VyTmFtZTogc3RyaW5nKSA9PiBhbnkpIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gQWdlbnRNYW5hZ2VyLmVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgc3RhdGljIHJlc29sdmVycyAoZm9yIHRlc3QgY2xlYW51cClcbiAgICogQ2FsbCB0aGlzIGluIGFmdGVyRWFjaCBob29rcyB0byBwcmV2ZW50IHRlc3QgaXNvbGF0aW9uIGlzc3Vlc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXNldFJlc29sdmVycygpOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIuZWxlbWVudE1hbmFnZXJSZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgICBBZ2VudE1hbmFnZXIuZGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgQWdlbnRNYW5hZ2VyLnZlcmlmaWNhdGlvblN0b3JlUmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBhZ2VudHMgYW5kIHN0YXRlIGZpbGVzLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLmVsZW1lbnREaXIpO1xuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuc3RhdGVEaXIpO1xuICAgIGxvZ2dlci5pbmZvKCdBZ2VudE1hbmFnZXIgaW5pdGlhbGl6ZWQnLCB7IHBhdGg6IHRoaXMuZWxlbWVudERpciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYWdlbnQgb24gZGlzay5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBBZ2VudENyZWF0ZU1ldGFkYXRhXG4gICk6IFByb21pc2U8RWxlbWVudENyZWF0aW9uUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAvLyBOb3JtYWxpemUgZ29hbCBpbnB1dCBiZWZvcmUgdmFsaWRhdGlvbiAtIExMTXMgbWF5IHBhc3Mgc3RyaW5nIG9yIG9iamVjdFxuICAgICAgLy8gU3RyaXAgJ2NvbnRlbnQnIGZyb20gbWV0YWRhdGEgdG8gcHJldmVudCBpdCBmcm9tIG92ZXJ3cml0aW5nIHRoZSBwb3NpdGlvbmFsXG4gICAgICAvLyBjb250ZW50IHBhcmFtICh3aGljaCBpcyB0aGUgYWdlbnQncyBpbnN0cnVjdGlvbnMgdGV4dCkgaW4gdGhlIHZhbGlkYXRpb24gY2FsbC5cbiAgICAgIGNvbnN0IHsgY29udGVudDogcmVmZXJlbmNlQ29udGVudCwgLi4ubWV0YWRhdGFXaXRob3V0Q29udGVudCB9ID0gbWV0YWRhdGEgPz8ge307XG4gICAgICBjb25zdCBub3JtYWxpemVkTWV0YWRhdGE6IFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPiA9IHtcbiAgICAgICAgLi4ubWV0YWRhdGFXaXRob3V0Q29udGVudFxuICAgICAgfTtcbiAgICAgIGlmIChtZXRhZGF0YT8uZ29hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vcm1hbGl6ZWRNZXRhZGF0YS5nb2FsID0gdGhpcy5ub3JtYWxpemVHb2FsSW5wdXQoXG4gICAgICAgICAgbWV0YWRhdGEuZ29hbCBhcyBzdHJpbmcgfCBQYXJ0aWFsPEFnZW50R29hbENvbmZpZz5cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgaW5wdXQgdmFsaWRhdGlvbi5cbiAgICAgIC8vIEFnZW50cyBzdXBwb3J0IGR1YWwtZmllbGQgY3JlYXRpb246IGJlaGF2aW9yYWwgaW5zdHJ1Y3Rpb25zIGFuZCBvcHRpb25hbFxuICAgICAgLy8gcmVmZXJlbmNlIGNvbnRlbnQuIFZhbGlkYXRpb24gcHJlZmVycyBiZWhhdmlvcmFsIGluc3RydWN0aW9ucyB3aGVuIGJvdGhcbiAgICAgIC8vIGZpZWxkcyBhcmUgcHJlc2VudCBzbyBleGlzdGluZyBpbnN0cnVjdGlvbi1maXJzdCBhZ2VudHMga2VlcCB0aGVpclxuICAgICAgLy8gY3VycmVudCBzZW1hbnRpY3Mgd2hpbGUgY29udGVudC1vbmx5IGFnZW50cyBzdGlsbCB2YWxpZGF0ZSBjb3JyZWN0bHkuXG4gICAgICBjb25zdCB2YWxpZGF0aW9uSW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgLi4ubm9ybWFsaXplZE1ldGFkYXRhXG4gICAgICB9O1xuICAgICAgY29uc3QgcHJpbWFyeVRleHQgPSB0aGlzLmdldFByaW1hcnlWYWxpZGF0aW9uVGV4dChjb250ZW50LCByZWZlcmVuY2VDb250ZW50KTtcbiAgICAgIHZhbGlkYXRpb25JbnB1dC5jb250ZW50ID0gcHJpbWFyeVRleHQgPz8gJyc7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVDcmVhdGUodmFsaWRhdGlvbklucHV0KTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzICYmIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgY3JlYXRpb24gd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdGl6ZSBpbnB1dHMgZm9yIGVsZW1lbnQgY3JlYXRpb25cbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LCAxMDApO1xuICAgICAgY29uc3Qgc2FuaXRpemVkRGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgNTAwKTtcbiAgICAgIC8vIFVzZSBDb250ZW50VmFsaWRhdG9yIGZvciBtdWx0aS1saW5lIGNvbnRlbnQgdG8gcHJlc2VydmUgZm9ybWF0dGluZyAobmV3bGluZXMsIHRhYnMpXG4gICAgICAvLyB3aGlsZSBzdGlsbCBkZXRlY3RpbmcgcHJvbXB0IGluamVjdGlvbiBhdHRhY2tzXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50LCB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCwgY29udGVudENvbnRleHQ6ICdhZ2VudCcgfSk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRJbnN0cnVjdGlvbnMgPSBjb250ZW50VmFsaWRhdGlvbi5zYW5pdGl6ZWRDb250ZW50IHx8ICcnO1xuXG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVFbGVtZW50TmFtZShzYW5pdGl6ZWROYW1lKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGFnZW50IG5hbWUuIFVzZSBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3Jlcy4nXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHtcbiAgICAgICAgLi4ubm9ybWFsaXplZE1ldGFkYXRhLFxuICAgICAgICBuYW1lOiBzYW5pdGl6ZWROYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogc2FuaXRpemVkRGVzY3JpcHRpb25cbiAgICAgIH0sIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgICAgYWdlbnQubWV0YWRhdGEuYXV0aG9yID0gbm9ybWFsaXplZE1ldGFkYXRhPy5hdXRob3IgPz8gdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBzcGVjaWFsaXphdGlvbnM6IG5vcm1hbGl6ZWRNZXRhZGF0YT8uc3BlY2lhbGl6YXRpb25zID8/IGFnZW50LmV4dGVuc2lvbnM/LnNwZWNpYWxpemF0aW9ucyA/PyBbXSxcbiAgICAgICAgZGVjaXNpb25GcmFtZXdvcms6IG5vcm1hbGl6ZWRNZXRhZGF0YT8uZGVjaXNpb25GcmFtZXdvcmsgPz8gYWdlbnQuZXh0ZW5zaW9ucz8uZGVjaXNpb25GcmFtZXdvcmssXG4gICAgICAgIHJpc2tUb2xlcmFuY2U6IG5vcm1hbGl6ZWRNZXRhZGF0YT8ucmlza1RvbGVyYW5jZSA/PyBhZ2VudC5leHRlbnNpb25zPy5yaXNrVG9sZXJhbmNlLFxuICAgICAgICBsZWFybmluZ0VuYWJsZWQ6IG5vcm1hbGl6ZWRNZXRhZGF0YT8ubGVhcm5pbmdFbmFibGVkID8/IGFnZW50LmV4dGVuc2lvbnM/LmxlYXJuaW5nRW5hYmxlZCxcbiAgICAgIH07XG4gICAgICAvLyBQcm9tb3RlIGluc3RydWN0aW9ucyB0byBmaXJzdC1jbGFzcyBwcm9wZXJ0eSAobm8gbG9uZ2VyIGluIGV4dGVuc2lvbnMpXG4gICAgICBhZ2VudC5pbnN0cnVjdGlvbnMgPSBzYW5pdGl6ZWRJbnN0cnVjdGlvbnM7XG4gICAgICAvLyBBbHNvIGtlZXAgaW4gZXh0ZW5zaW9ucyBmb3IgYmFja3dhcmQgY29tcGF0IGR1cmluZyB0cmFuc2l0aW9uXG4gICAgICBhZ2VudC5leHRlbnNpb25zLmluc3RydWN0aW9ucyA9IHNhbml0aXplZEluc3RydWN0aW9ucztcblxuICAgICAgLy8gU2V0IHJlZmVyZW5jZSBjb250ZW50IGlmIHByb3ZpZGVkICh2Mi4wIGR1YWwtZmllbGQgYXJjaGl0ZWN0dXJlKVxuICAgICAgaWYgKHR5cGVvZiByZWZlcmVuY2VDb250ZW50ID09PSAnc3RyaW5nJyAmJiByZWZlcmVuY2VDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uUmVzdWx0ID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKFxuICAgICAgICAgIHJlZmVyZW5jZUNvbnRlbnQsXG4gICAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsIGNvbnRlbnRDb250ZXh0OiAnYWdlbnQnIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjb250ZW50VmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYFZhbGlkYXRpb24gZmFpbGVkOiAkeyhjb250ZW50VmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zIHx8IFsnQ29udGVudCB2YWxpZGF0aW9uIGZhaWxlZCddKS5qb2luKCcsICcpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGFnZW50LmNvbnRlbnQgPSBjb250ZW50VmFsaWRhdGlvblJlc3VsdC5zYW5pdGl6ZWRDb250ZW50IHx8ICcnO1xuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNzI3OiBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIFYyIGZpZWxkcyBCRUZPUkUgYXNzaWdubWVudC5cbiAgICAgIC8vIFRoaXMgaXMgdGhlIFNFQ09ORCB2YWxpZGF0aW9uIGxheWVyIOKAlCBBZ2VudEVsZW1lbnRWYWxpZGF0b3IgKGNhbGxlZCBhYm92ZSB2aWFcbiAgICAgIC8vIHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlQ3JlYXRlKSBpcyB0aGUgZmlyc3QuIFRoZSB2YWxpZGF0b3IgY2F0Y2hlcyBjYW1lbENhc2VcbiAgICAgIC8vIGludmFsaWQgdmFsdWVzOyB0aGlzIG1ldGhvZCBhbHNvIG5vcm1hbGl6ZXMgc25ha2VfY2FzZSBrZXlzICh3aGljaCB0aGUgdmFsaWRhdG9yXG4gICAgICAvLyBkb2Vzbid0IHNlZSkgYW5kIHZhbGlkYXRlcyB0aGVtLiBCb3RoIGxheWVycyBhcmUgbmVlZGVkLiBTZWUgSXNzdWUgIzczMC5cbiAgICAgIGNvbnN0IG1ldGFkYXRhVjIgPSBub3JtYWxpemVkTWV0YWRhdGEgYXMgUGFydGlhbDxBZ2VudE1ldGFkYXRhVjI+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG1ldGFkYXRhVjIpIHtcbiAgICAgICAgY29uc3QgdjJFcnJvcnMgPSB0aGlzLnZhbGlkYXRlVjJGaWVsZHNGb3JDcmVhdGUobWV0YWRhdGFWMik7XG4gICAgICAgIGlmICh2MkVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYFYyIGZpZWxkIHZhbGlkYXRpb24gZmFpbGVkOiAke3YyRXJyb3JzLmpvaW4oJzsgJyl9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVjIgRklFTERTOiBTdG9yZSBWMi1zcGVjaWZpYyBmaWVsZHMgaW4gYWdlbnQgbWV0YWRhdGEgKG5vdCBqdXN0IGV4dGVuc2lvbnMpXG4gICAgICAvLyBUaGlzIGVuYWJsZXMgVjIgYWdlbnQgY3JlYXRpb24gdmlhIE1DUC1BUUwgY3JlYXRlX2VsZW1lbnQgb3BlcmF0aW9uXG4gICAgICBpZiAobWV0YWRhdGFWMj8uZ29hbCkge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5nb2FsID0gbWV0YWRhdGFWMi5nb2FsO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LmFjdGl2YXRlcykge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5hY3RpdmF0ZXMgPSBtZXRhZGF0YVYyLmFjdGl2YXRlcztcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyPy50b29scykge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS50b29scyA9IG1ldGFkYXRhVjIudG9vbHM7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMj8uc3lzdGVtUHJvbXB0KSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLnN5c3RlbVByb21wdCA9IG1ldGFkYXRhVjIuc3lzdGVtUHJvbXB0O1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LmF1dG9ub215KSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLmF1dG9ub215ID0gbWV0YWRhdGFWMi5hdXRvbm9teTtcbiAgICAgIH1cbiAgICAgIC8vIElzc3VlICM0NDk6IFBlcnNpc3QgZ2F0ZWtlZXBlciBwb2xpY3kgZm9yIEdhdGVrZWVwZXIgZW5mb3JjZW1lbnQgZHVyaW5nIGV4ZWN1dGlvblxuICAgICAgaWYgKG1ldGFkYXRhVjI/LmdhdGVrZWVwZXIpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuZ2F0ZWtlZXBlciA9IG1ldGFkYXRhVjIuZ2F0ZWtlZXBlcjtcbiAgICAgIH1cbiAgICAgIC8vIElzc3VlICM3MjI6IFBlcnNpc3QgcmVzaWxpZW5jZSBwb2xpY3kgKHdhcyBtaXNzaW5nIGZyb20gVjIgZmllbGQgYXNzaWdubWVudHMpXG4gICAgICBpZiAobWV0YWRhdGFWMj8ucmVzaWxpZW5jZSkge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5yZXNpbGllbmNlID0gbWV0YWRhdGFWMi5yZXNpbGllbmNlO1xuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNjEzOiBDaGVjayBtZXRhZGF0YSBuYW1lIHVuaXF1ZW5lc3MgKG5vdCBqdXN0IGZpbGVuYW1lKVxuICAgICAgY29uc3QgZXhpc3RpbmdBZ2VudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IGV4aXN0aW5nQWdlbnRzLmZpbmQoYSA9PlxuICAgICAgICBhLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gc2FuaXRpemVkTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCAnJHtzYW5pdGl6ZWROYW1lfScgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgYWdlbnQgY29udGVudCBmaXJzdFxuICAgICAgY29uc3Qgc2VyaWFsaXplZENvbnRlbnQgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoYWdlbnQpO1xuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVuYW1lKTtcblxuICAgICAgLy8gVXNlIGF0b21pYyBmaWxlIGNyZWF0aW9uIHRvIHByZXZlbnQgVE9DVE9VIHJhY2UgY29uZGl0aW9uc1xuICAgICAgLy8gVGhpcyByZXBsYWNlcyB0aGUgcHJldmlvdXMgY2hlY2stdGhlbi13cml0ZSBwYXR0ZXJuIHdpdGggYSBzaW5nbGUgYXRvbWljIG9wZXJhdGlvblxuICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRmlsZUV4Y2x1c2l2ZShhYnNvbHV0ZVBhdGgsIHNlcmlhbGl6ZWRDb250ZW50LCB7XG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jcmVhdGUnXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFjcmVhdGVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYEFnZW50ICcke3Nhbml0aXplZE5hbWV9JyBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FjaGUgdGhlIGVsZW1lbnQgYWZ0ZXIgc3VjY2Vzc2Z1bCBjcmVhdGlvblxuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoYWdlbnQsIGZpbGVuYW1lKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLm5vdGlmeVNhdmVkKGZpbGVuYW1lLCBhYnNvbHV0ZVBhdGgpO1xuICAgICAgLy8gTm90ZTogTm8gcmVsb2FkKCkgaGVyZSDigJQgY2FjaGVFbGVtZW50KCkgc3RvcmVzIHRoZSBlbGVtZW50IGNvcnJlY3RseS5cbiAgICAgIC8vIFNlZSBJc3N1ZSAjNDkxIGZvciB3aHkgUGVyc29uYU1hbmFnZXIncyByZWxvYWQtYWZ0ZXItY3JlYXRlIHdhcyByZW1vdmVkLlxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jcmVhdGUnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGNyZWF0ZWRgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBhZ2VudElkOiBhZ2VudC5pZCB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYPCfpJYgKioke3Nhbml0aXplZE5hbWV9KiogYnkgJHthZ2VudC5tZXRhZGF0YS5hdXRob3IgfHwgJ2Fub255bW91cyd9YCxcbiAgICAgICAgZWxlbWVudDogYWdlbnRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBhZ2VudCcsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdGYWlsZWQgdG8gY3JlYXRlIGFnZW50J1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhbiBhZ2VudCBieSBuYW1lICh3aXRob3V0IGV4dGVuc2lvbikuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQWdlbnQgbmFtZSAod2l0aG91dCBleHRlbnNpb24pXG4gICAqIEByZXR1cm5zIEFnZW50IGluc3RhbmNlIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICBhc3luYyByZWFkKG5hbWU6IHN0cmluZyk6IFByb21pc2U8QWdlbnQgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkKGZpbGVuYW1lKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiBmbGV4aWJsZSBtYXRjaGluZyB2aWEgbGlzdCBzY2FuICgjNjA3KVxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmxleGlibHkobmFtZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2sgZm9yIHJlYWQoKSB3aGVuIGRpcmVjdCBmaWxlIGxvb2t1cCBmYWlscy5cbiAgICogU2VhcmNoZXMgbG9hZGVkIGFnZW50cyBieSBtZXRhZGF0YSBuYW1lIHVzaW5nIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHNsdWcgbWF0Y2hpbmcuXG4gICAqIExvZ3MgYSB3YXJuaW5nIHdoZW4gYSBtYXRjaCBpcyBmb3VuZCAoaW5kaWNhdGVzIGZpbGVuYW1lL25hbWUgbWlzbWF0Y2ggbmVlZGluZyBjbGVhbnVwKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gRmlsZSBvbiBkaXNrOiBcImxlZ2FjeS1wb3N0ZXItYWdlbnQubWRcIlxuICAgKiAvLyBNZXRhZGF0YSBuYW1lOiBcImxlZ2FjeS1wb3N0ZXJcIlxuICAgKiAvLyBEaXJlY3QgbG9va3VwIGZvciBcImxlZ2FjeS1wb3N0ZXIubWRcIiBmYWlscyAoRU5PRU5UKVxuICAgKiAvLyBGbGV4aWJsZSBmYWxsYmFjayBtYXRjaGVzIHZpYSBtZXRhZGF0YSBuYW1lOlxuICAgKiBjb25zdCBhZ2VudCA9IGF3YWl0IHJlYWQoXCJsZWdhY3ktcG9zdGVyXCIpOyAvLyByZXNvbHZlcyB2aWEgZmFsbGJhY2tcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZEZsZXhpYmx5KG5hbWU6IHN0cmluZyk6IFByb21pc2U8QWdlbnQgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgaWYgKGFnZW50cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCBzZWFyY2hMb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHNlYXJjaFNsdWcgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuXG4gICAgICAvLyBQYXNzIDE6IGV4YWN0IGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggb24gbWV0YWRhdGEgbmFtZVxuICAgICAgbGV0IG1hdGNoID0gYWdlbnRzLmZpbmQoXG4gICAgICAgIChhKSA9PiBhLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gc2VhcmNoTG93ZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIFBhc3MgMjogc2x1ZyBtYXRjaCAoaGFuZGxlcyBkYXNoZXMsIHVuZGVyc2NvcmVzLCBjYXNpbmcgZGlmZmVyZW5jZXMpXG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIG1hdGNoID0gYWdlbnRzLmZpbmQoKGEpID0+IHtcbiAgICAgICAgICBjb25zdCBzbHVnID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShhLm1ldGFkYXRhLm5hbWUpO1xuICAgICAgICAgIHJldHVybiBzbHVnID09PSBzZWFyY2hTbHVnIHx8IHNsdWcgPT09IHNlYXJjaExvd2VyO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBZ2VudCBcIiR7bmFtZX1cIiByZXNvbHZlZCB2aWEgZmxleGlibGUgbWF0Y2hpbmcgdG8gZmlsZSB3aXRoIG1ldGFkYXRhIG5hbWUgXCIke21hdGNoLm1ldGFkYXRhLm5hbWV9XCIuIGAgK1xuICAgICAgICAgIGBDb25zaWRlciByZW5hbWluZyB0aGUgZmlsZSB0byBtYXRjaCB0aGUgZXhwZWN0ZWQgY29udmVudGlvbiAoIzYwNykuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWF0Y2ggPz8gbnVsbDtcbiAgICB9IGNhdGNoIChsaXN0RXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRmxleGlibGUgYWdlbnQgbG9va3VwIGZhaWxlZCBmb3IgXCIke25hbWV9XCI6ICR7bGlzdEVycm9yfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtZXRhZGF0YS9jb250ZW50IGZvciBhbiBleGlzdGluZyBhZ2VudC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdXBkYXRlczogUGFydGlhbDxBZ2VudE1ldGFkYXRhPixcbiAgICBjb250ZW50Pzogc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQoc2FuaXRpemVkTmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgbG9nZ2VyLndhcm4oYEFnZW50IG5vdCBmb3VuZCBmb3IgdXBkYXRlOiAke25hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVXNlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgZWRpdCB2YWxpZGF0aW9uXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlRWRpdChhZ2VudCwge1xuICAgICAgLi4udXBkYXRlcyxcbiAgICAgIGNvbnRlbnRcbiAgICB9KTtcblxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEFnZW50IHVwZGF0ZSB2YWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCB1cGRhdGUgd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChcbiAgICAgICAgVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodXBkYXRlcy5kZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICAgIDUwMFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5zcGVjaWFsaXphdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgc3BlY2lhbGl6YXRpb25zOiB1cGRhdGVzLnNwZWNpYWxpemF0aW9ucy5tYXAoaXRlbSA9PiBzYW5pdGl6ZUlucHV0KGl0ZW0sIDUwKSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMuZGVjaXNpb25GcmFtZXdvcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgZGVjaXNpb25GcmFtZXdvcms6IHVwZGF0ZXMuZGVjaXNpb25GcmFtZXdvcmtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMucmlza1RvbGVyYW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICByaXNrVG9sZXJhbmNlOiB1cGRhdGVzLnJpc2tUb2xlcmFuY2VcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMubGVhcm5pbmdFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGxlYXJuaW5nRW5hYmxlZDogdXBkYXRlcy5sZWFybmluZ0VuYWJsZWRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMubWF4Q29uY3VycmVudEdvYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50Lm1ldGFkYXRhLm1heENvbmN1cnJlbnRHb2FscyA9IHVwZGF0ZXMubWF4Q29uY3VycmVudEdvYWxzO1xuICAgIH1cblxuICAgIGFnZW50Lm1ldGFkYXRhLm1vZGlmaWVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgaWYgKGNvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVXNlIENvbnRlbnRWYWxpZGF0b3IgZm9yIG11bHRpLWxpbmUgY29udGVudCB0byBwcmVzZXJ2ZSBmb3JtYXR0aW5nIChuZXdsaW5lcywgdGFicylcbiAgICAgIC8vIHdoaWxlIHN0aWxsIGRldGVjdGluZyBwcm9tcHQgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGNvbnRlbnQsIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RILCBjb250ZW50Q29udGV4dDogJ2FnZW50JyB9KTtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGluc3RydWN0aW9uczogY29udGVudFZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCB8fCAnJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSkpO1xuICAgIGxvZ2dlci5pbmZvKGBBZ2VudCB1cGRhdGVkOiAke3Nhbml0aXplZE5hbWV9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBwcm92aWRlZCBhZ2VudCBuYW1lLlxuICAgKi9cbiAgdmFsaWRhdGVOYW1lKG5hbWU6IHN0cmluZyk6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0ge1xuICAgIGlmICghbmFtZSB8fCBuYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdOYW1lIGNhbm5vdCBiZSBlbXB0eScgfTtcbiAgICB9XG5cbiAgICBpZiAobmFtZS5sZW5ndGggPiAxMDApIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdOYW1lIGNhbm5vdCBleGNlZWQgMTAwIGNoYXJhY3RlcnMnIH07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRWxlbWVudE5hbWUobmFtZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6ICdOYW1lIGNhbiBvbmx5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBhZ2VudCBmcm9tIHNlcmlhbGl6ZWQgY29udGVudC5cbiAgICovXG4gIGFzeW5jIGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nKTogUHJvbWlzZTxBZ2VudD4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUpzb24oZGF0YSwge1xuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuaW1wb3J0RWxlbWVudCdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQocGFyc2VkLm1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgICBpZiAocGFyc2VkLnN0YXRlKSB7XG4gICAgICAgIGFnZW50LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHBhcnNlZCkpO1xuICAgICAgfVxuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBwYXJzZWQuaW5zdHJ1Y3Rpb25zIHx8ICcnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH1cblxuICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgZnJvbnRtYXR0ZXIgcGFyc2luZ1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihkYXRhLCB7XG4gICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuaW1wb3J0RWxlbWVudCdcbiAgICB9KTtcblxuICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHJlc3VsdC5kYXRhIGFzIEFnZW50TWV0YWRhdGEsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgIGluc3RydWN0aW9uczogcmVzdWx0LmNvbnRlbnQudHJpbSgpXG4gICAgfTtcbiAgICByZXR1cm4gYWdlbnQ7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGFuIGFnZW50IHRvIEpTT04gb3IgbWFya2Rvd24gKGRlZmF1bHQpLlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RWxlbWVudChhZ2VudDogQWdlbnQsIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyA9ICdtYXJrZG93bicpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgcmV0dXJuIGFnZW50LnNlcmlhbGl6ZVRvSlNPTigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoYWdlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYW4gYWdlbnQgZmlsZSwgZW5mb3JjaW5nIHNpemUgYW5kIGZvcm1hdCBjaGVja3MuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50PiB7XG4gICAgY29uc3Qgc2FuaXRpemVkSW5wdXQgPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHNhbml0aXplZElucHV0LmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZWRJbnB1dFxuICAgICAgOiB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQoc2FuaXRpemVkSW5wdXQsIDEwMCkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUGF0aChyZWxhdGl2ZVBhdGgsIHRoaXMuZWxlbWVudERpcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgSW52YWxpZCBhZ2VudCBwYXRoOiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IHBhdGg6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXRoJ31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKGZ1bGxQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBNQVhfRklMRV9TSVpFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWdlbnQgZmlsZSBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiAke01BWF9GSUxFX1NJWkV9IGJ5dGVzYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VBZ2VudEZpbGUoY29udGVudCk7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQubWV0YWRhdGEpO1xuICAgICAgY29uc3QgYWdlbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQobWV0YWRhdGEsIHBhcnNlZC5jb250ZW50KTtcblxuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoYWdlbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmh5ZHJhdGVBZ2VudFN0YXRlKGFnZW50LCB0aGlzLnN0cmlwRXh0ZW5zaW9uKHJlbGF0aXZlUGF0aCkpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0xPQURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmxvYWRgLFxuICAgICAgICBkZXRhaWxzOiBgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IGxvYWRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICAgIGFnZW50TmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIGFnZW50IGZyb20gJHtmdWxsUGF0aH06YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIEJhc2VFbGVtZW50TWFuYWdlci5zYXZlIHRvIHBlcnNpc3Qgc3RhdGUgd2hlbiByZXF1aXJlZC5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNhdmUoYWdlbnQ6IEFnZW50LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVN0YXRlRGlyZWN0b3J5KCk7XG4gICAgYXdhaXQgc3VwZXIuc2F2ZShhZ2VudCwgc2FuaXRpemVkUGF0aCk7XG5cbiAgICBpZiAoYWdlbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCB0aGlzLnNhdmVBZ2VudFN0YXRlKHRoaXMuc3RyaXBFeHRlbnNpb24oc2FuaXRpemVkUGF0aCksIGFnZW50LmdldFN0YXRlKCkpO1xuICAgICAgYWdlbnRbQ09NTUlUX1BFUlNJU1RFRF9WRVJTSU9OXShuZXdWZXJzaW9uKTsgIC8vIFN5bmMgYWdlbnQncyBpbnRlcm5hbCB2ZXJzaW9uIChJc3N1ZSAjMTIzIGZpeClcbiAgICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0IGFnZW50IHN0YXRlIHRvIGRpc2sgKHB1YmxpYyBBUEkgZm9yIGV4dGVybmFsIGNhbGxlcnMpLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgcHJvcGVyIHdheSBmb3IgZXh0ZXJuYWwgY29kZSAoc3RyYXRlZ2llcywgaGFuZGxlcnMpIHRvXG4gICAqIHRyaWdnZXIgc3RhdGUgcGVyc2lzdGVuY2UuIEl0IGltcGxlbWVudHMgdGhlIE9wdGlvbiBDIHBhdHRlcm4gZnJvbSBJc3N1ZSAjMTIzOlxuICAgKiBzdGF0ZVZlcnNpb24gaXMgb25seSBpbmNyZW1lbnRlZCBvbiBzdWNjZXNzZnVsIHNhdmUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQWdlbnQgbmFtZVxuICAgKiBAcmV0dXJucyBQcm9taXNlPGJvb2xlYW4+IC0gVHJ1ZSBpZiBzdGF0ZSB3YXMgcGVyc2lzdGVkLCBmYWxzZSBpZiBub3QgbmVlZGVkXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYWdlbnQgbm90IGZvdW5kIG9yIHNhdmUgZmFpbHNcbiAgICovXG4gIGFzeW5jIHBlcnNpc3RTdGF0ZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFnZW50IG5vdCBmb3VuZDogJHtuYW1lfWApO1xuICAgIH1cblxuICAgIGlmICghYWdlbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgdGhpcy5zYXZlQWdlbnRTdGF0ZShuYW1lLCBhZ2VudC5nZXRTdGF0ZSgpKTtcbiAgICBhZ2VudFtDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT05dKG5ld1ZlcnNpb24pO1xuICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlbGV0ZSB0byByZW1vdmUgYXNzb2NpYXRlZCBzdGF0ZSBmaWxlLlxuICAgKlxuICAgKiBGSVg6IFVzZXMgbm9ybWFsaXplRmlsZW5hbWUoKSB0byBlbnN1cmUgc3RhdGUgZmlsZSBkZWxldGlvbiBtYXRjaGVzXG4gICAqIHRoZSBub3JtYWxpemVkIGZpbGVuYW1lIHVzZWQgZm9yIHN0YXRlIGZpbGUgY3JlYXRpb24vbG9hZGluZy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuc3RyaXBFeHRlbnNpb24oc2FuaXRpemVkUGF0aCk7XG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlKHNhbml0aXplZFBhdGgpO1xuXG4gICAgLy8gRklYOiBOb3JtYWxpemUgbmFtZSBmb3IgY29uc2lzdGVudCBzdGF0ZSBmaWxlIGRlbGV0aW9uXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuICAgIGNvbnN0IHN0YXRlUGF0aCA9IHBhdGguam9pbih0aGlzLnN0YXRlRGlyLCBgJHtub3JtYWxpemVkTmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWApO1xuICAgIHRyeSB7XG4gICAgICAvLyBCYWNrIHVwIHRoZSBzdGF0ZSBmaWxlIGJlZm9yZSBkZWxldGluZyBpdFxuICAgICAgaWYgKHRoaXMuYmFja3VwU2VydmljZSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlRGVsZXRlKHN0YXRlUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQpO1xuICAgICAgICBpZiAoIXJlc3VsdC5tb3ZlZE9yaWdpbmFsKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKHN0YXRlUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQsIHtcbiAgICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWxldGUgKHN0YXRlIGZpbGUpJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoc3RhdGVQYXRoLCBFbGVtZW50VHlwZS5BR0VOVCwge1xuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWxldGUgKHN0YXRlIGZpbGUpJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGSVg6IFVzZSBub3JtYWxpemVkIG5hbWUgYXMgY2FjaGUga2V5IGZvciBjb25zaXN0ZW50IGNhY2hlIGNsZWFudXBcbiAgICB0aGlzLnN0YXRlQ2FjaGUuZGVsZXRlKG5vcm1hbGl6ZWROYW1lKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG4gICAgcmV0dXJuIHN1cGVyLmV4aXN0cyhzYW5pdGl6ZWRQYXRoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZhbGlkYXRlUGF0aCh0YXJnZXRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGFyZ2V0UGF0aC5pbmNsdWRlcygnLi4nKSB8fCB0YXJnZXRQYXRoLmluY2x1ZGVzKCd+JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRhcmdldFBhdGguc3RhcnRzV2l0aCgnLycpIHx8IC9eW0EtWmEtel06Ly50ZXN0KHRhcmdldFBhdGgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBBR0VOVF9GSUxFX0VYVEVOU0lPTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBsaXN0IHRvIGFwcGx5IGFjdGl2ZSBzdGF0dXMgYmFzZWQgb24gYWN0aXZlQWdlbnROYW1lcyBzZXRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgYWdlbnRzID0gYXdhaXQgc3VwZXIubGlzdCgpO1xuXG4gICAgLy8gQXBwbHkgYWN0aXZlIHN0YXR1cyB0byBhZ2VudHMgdGhhdCBhcmUgaW4gdGhlIGFjdGl2ZSBzZXQgKGJ5IG5hbWUpXG4gICAgZm9yIChjb25zdCBhZ2VudCBvZiBhZ2VudHMpIHtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZUFnZW50TmFtZXMuaGFzKGFnZW50Lm1ldGFkYXRhLm5hbWUpKSB7XG4gICAgICAgIC8vIEFjdGl2YXRlIHRoZSBhZ2VudCB0byBzZXQgc3RhdHVzIHRvIEFDVElWRVxuICAgICAgICBhd2FpdCBhZ2VudC5hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhZ2VudHM7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgYW4gYWdlbnQgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ2xlYW51cCB0cmlnZ2VyIGZvciBtZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZUFnZW50KGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmc7IGFnZW50PzogQWdlbnQgfT4ge1xuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlIGZvcm1hdFxuICAgICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMubm90Rm91bmQoRWxlbWVudFR5cGUuQUdFTlQsIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE1FTU9SWSBMRUFLIEZJWDogQ2hlY2sgaWYgY2xlYW51cCBpcyBuZWVkZWQgYmVmb3JlIGFkZGluZ1xuICAgIHRoaXMuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk7XG5cbiAgICAvLyBBZGQgdG8gYWN0aXZlIHNldCAoYnkgbmFtZSwgd2hpY2ggaXMgc3RhYmxlIGFjcm9zcyByZWxvYWRzKVxuICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5hZGQoYWdlbnQubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBVcGRhdGUgYWdlbnQgc3RhdHVzIGluIG1lbW9yeVxuICAgIGF3YWl0IGFnZW50LmFjdGl2YXRlKCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnQUdFTlRfQUNUSVZBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5hY3RpdmF0ZUFnZW50JyxcbiAgICAgIGRldGFpbHM6IGBBZ2VudCBhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX0gdiR7YWdlbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICBnb2FsQ291bnQ6IChhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLmdvYWw/LnBhcmFtZXRlcnM/Lmxlbmd0aCB8fCAwLFxuICAgICAgICBzcGVjaWFsaXphdGlvbnM6IGFnZW50Lm1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyxcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGBBZ2VudCBhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5hY3RpdmF0ZWQoRWxlbWVudFR5cGUuQUdFTlQsIGFnZW50Lm1ldGFkYXRhLm5hbWUpLFxuICAgICAgYWdlbnRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgYW4gYWdlbnQgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlQWdlbnQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUoaWRlbnRpZmllcik7XG5cbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5BR0VOVCwgaWRlbnRpZmllcilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gYWN0aXZlIHNldFxuICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5kZWxldGUoYWdlbnQubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBVcGRhdGUgYWdlbnQgc3RhdHVzIGluIG1lbW9yeVxuICAgIGF3YWl0IGFnZW50LmRlYWN0aXZhdGUoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdBR0VOVF9ERUFDVElWQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuZGVhY3RpdmF0ZUFnZW50JyxcbiAgICAgIGRldGFpbHM6IGBBZ2VudCBkZWFjdGl2YXRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgIGFnZW50TmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgQWdlbnQgZGVhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5kZWFjdGl2YXRlZChFbGVtZW50VHlwZS5BR0VOVCwgYWdlbnQubWV0YWRhdGEubmFtZSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgYWN0aXZlIGFnZW50c1xuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlQWdlbnRzKCk6IFByb21pc2U8QWdlbnRbXT4ge1xuICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBhZ2VudHMuZmlsdGVyKGEgPT4gdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmhhcyhhLm1ldGFkYXRhLm5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIGFnZW50IHdpdGggZ29hbCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIFJldHVybnMgY29udGV4dCBmb3IgTExNIHRvIGRyaXZlIHRoZSBhZ2VudGljIGxvb3AuXG4gICAqIFRoaXMgbWV0aG9kOlxuICAgKiAxLiBMb2FkcyB0aGUgYWdlbnQgY29uZmlndXJhdGlvblxuICAgKiAyLiBWYWxpZGF0ZXMgYW5kIHJlbmRlcnMgdGhlIGdvYWwgdGVtcGxhdGUgd2l0aCBwYXJhbWV0ZXJzXG4gICAqIDMuIEFjdGl2YXRlcyBjb25maWd1cmVkIGVsZW1lbnRzIChlbGVtZW50LWFnbm9zdGljKVxuICAgKiA0LiBFdmFsdWF0ZXMgcHJvZ3JhbW1hdGljIGNvbnN0cmFpbnRzIGFuZCByaXNrXG4gICAqIDUuIFJldHVybnMgc3RydWN0dXJlZCBjb250ZXh0IGZvciBMTE1cbiAgICpcbiAgICogVGhlIExMTSB0aGVuIGRyaXZlcyB0aGUgYWdlbnRpYyBsb29wIHVzaW5nIHRoaXMgY29udGV4dC5cbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUFnZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPEV4ZWN1dGVBZ2VudFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBtZXRhZGF0YSBhcyB2MiAobWF5IGhhdmUgZ29hbCBjb25maWcpXG4gICAgICBsZXQgbWV0YWRhdGEgPSBhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSB2Mi4wIGFnZW50IHdpdGggZ29hbCBjb25maWd1cmF0aW9uXG4gICAgICAvLyBJZiBub3QsIGF1dG8tY29udmVydCBWMSB0byBWMiBpbiBwbGFjZSAoSXNzdWUgIzU4NylcbiAgICAgIGlmICghbWV0YWRhdGEuZ29hbCB8fCAhbWV0YWRhdGEuZ29hbC50ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoaXNWMUFnZW50KG1ldGFkYXRhKSkge1xuICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGFnZW50LmV4dGVuc2lvbnM/Lmluc3RydWN0aW9ucyB8fCAnJztcbiAgICAgICAgICBjb25zdCBjb252ZXJzaW9uUmVzdWx0ID0gY29udmVydFYxVG9WMihtZXRhZGF0YSwgaW5zdHJ1Y3Rpb25zKTtcblxuICAgICAgICAgIGlmIChjb252ZXJzaW9uUmVzdWx0LmNvbnZlcnRlZCkge1xuICAgICAgICAgICAgLy8gTWVyZ2UgY29udmVydGVkIG1ldGFkYXRhIG9udG8gdGhlIGV4aXN0aW5nIGFnZW50IChpbi1wbGFjZSlcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWV0YWRhdGEsIGNvbnZlcnNpb25SZXN1bHQubWV0YWRhdGEpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihhZ2VudC5tZXRhZGF0YSwgY29udmVyc2lvblJlc3VsdC5tZXRhZGF0YSk7XG5cbiAgICAgICAgICAgIC8vIExvZyBjb252ZXJzaW9uIHdhcm5pbmdzXG4gICAgICAgICAgICBpZiAoY29udmVyc2lvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfScgYXV0by1jb252ZXJ0ZWQgZnJvbSBWMSB0byBWMiBpbiBwbGFjZWAsIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5nczogY29udmVyc2lvblJlc3VsdC53YXJuaW5ncyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVwZ3JhZGVkIGFnZW50IGJhY2sgdG8gaXRzIG9yaWdpbmFsIGZpbGVcbiAgICAgICAgICAgIGNvbnN0IHVwZ3JhZGVkRmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQobmFtZSwgMTAwKSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHVwZ3JhZGVkRmlsZW5hbWUpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEFnZW50ICcke25hbWV9JyBjb252ZXJ0ZWQgZnJvbSBWMSB0byBWMiBhbmQgc2F2ZWQgaW4gcGxhY2VgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQWdlbnQgJyR7bmFtZX0nIGNhbm5vdCBiZSBleGVjdXRlZDogbWlzc2luZyBnb2FsLnRlbXBsYXRlIGFuZCBjb252ZXJzaW9uIGZhaWxlZC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWdlbnQgJyR7bmFtZX0nIGlzIG5vdCBhIHYyLjAgYWdlbnQuIE1pc3NpbmcgZ29hbC50ZW1wbGF0ZSBjb25maWd1cmF0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIENsb25lIHBhcmFtZXRlcnMgdG8gcHJldmVudCBtdXRhdGlvbiBvZiBjYWxsZXIncyBvYmplY3QgKElzc3VlICMxMTgpXG4gICAgICBjb25zdCBjbG9uZWRQYXJhbWV0ZXJzID0gc3RydWN0dXJlZENsb25lKHBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyAyYi4gU2VjdXJpdHkgdmFsaWRhdGlvbiBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChJc3N1ZSAjMTAzKVxuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtZXRlclNlY3VyaXR5KGNsb25lZFBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyAzLiBWYWxpZGF0ZSBwYXJhbWV0ZXJzIGFnYWluc3QgZ29hbC5wYXJhbWV0ZXJzIHNjaGVtYVxuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtZXRlcnMobWV0YWRhdGEuZ29hbCwgY2xvbmVkUGFyYW1ldGVycyk7XG5cbiAgICAgIC8vIDQuIFJlbmRlciBnb2FsIHRlbXBsYXRlIGJ5IHJlcGxhY2luZyB7cGFyYW1ldGVyfSBwbGFjZWhvbGRlcnNcbiAgICAgIGNvbnN0IHJlbmRlcmVkR29hbCA9IHRoaXMucmVuZGVyR29hbFRlbXBsYXRlKG1ldGFkYXRhLmdvYWwudGVtcGxhdGUsIGNsb25lZFBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyA0Yi4gRGV0ZWN0IHVubWF0Y2hlZCBwbGFjZWhvbGRlcnMgYWZ0ZXIgcmVuZGVyaW5nIChJc3N1ZSAjMTI2KVxuICAgICAgY29uc3QgdW5tYXRjaGVkUGxhY2Vob2xkZXJzID0gdGhpcy5kZXRlY3RVbm1hdGNoZWRQbGFjZWhvbGRlcnMocmVuZGVyZWRHb2FsKTtcbiAgICAgIGlmICh1bm1hdGNoZWRQbGFjZWhvbGRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybignVW5tYXRjaGVkIHRlbXBsYXRlIHBsYWNlaG9sZGVycyBkZXRlY3RlZCBhZnRlciByZW5kZXJpbmcnLCB7XG4gICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgIHVubWF0Y2hlZDogdW5tYXRjaGVkUGxhY2Vob2xkZXJzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gNS4gQ3JlYXRlIGV4ZWN1dGlvbiBjb250ZXh0IEJFRk9SRSBhY3RpdmF0aW5nIGVsZW1lbnRzIChJc3N1ZSAjMTA5IC0gY2lyY3VsYXIgYWN0aXZhdGlvbiBkZXRlY3Rpb24pXG4gICAgICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChuYW1lKTtcblxuICAgICAgLy8gNWIuIFN0YXRpYyBhY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiAoSXNzdWUgIzM3NClcbiAgICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXM/LmFnZW50cz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN5Y2xlUGF0aCA9IGF3YWl0IHRoaXMuZGV0ZWN0QWN0aXZhdGlvbkN5Y2xlcyhuYW1lLCBtZXRhZGF0YS5hY3RpdmF0ZXMuYWdlbnRzKTtcbiAgICAgICAgaWYgKGN5Y2xlUGF0aCkge1xuICAgICAgICAgIGNvbnN0IGN5Y2xlU3RhcnQgPSBjeWNsZVBhdGguaW5kZXhPZihjeWNsZVBhdGhbY3ljbGVQYXRoLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICBjb25zdCBjeWNsZSA9IGN5Y2xlUGF0aC5zbGljZShjeWNsZVN0YXJ0KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoQWdlbnRNYW5hZ2VyLmZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gNi4gQWN0aXZhdGUgZWxlbWVudHMgKGVsZW1lbnQtYWdub3N0aWMpXG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50czogUmVjb3JkPHN0cmluZywgQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9Pj4gPSB7fTtcbiAgICAgIGNvbnN0IGFjdGl2YXRpb25XYXJuaW5nczogQXJyYXk8eyBlbGVtZW50VHlwZTogc3RyaW5nOyBlbGVtZW50TmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+ID0gW107XG5cbiAgICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBbZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lc10gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEuYWN0aXZhdGVzKSkge1xuICAgICAgICAgIGlmICghZWxlbWVudE5hbWVzIHx8IGVsZW1lbnROYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzW2VsZW1lbnRUeXBlXSA9IFtdO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50TmFtZSBvZiBlbGVtZW50TmFtZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50Q29udGVudChlbGVtZW50VHlwZSwgZWxlbWVudE5hbWUsIGV4ZWN1dGlvbkNvbnRleHQpO1xuICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50c1tlbGVtZW50VHlwZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgICAgY29udGVudDogZWxlbWVudENvbnRlbnRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBISUdILTE6IFJlLXRocm93IGNpcmN1bGFyIGFjdGl2YXRpb24gZXJyb3JzIGltbWVkaWF0ZWx5IChJc3N1ZSAjMTA5KVxuICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdDaXJjdWxhciBhZ2VudCBhY3RpdmF0aW9uIGRldGVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgICAgICAgIGFjdGl2YXRpb25XYXJuaW5ncy5wdXNoKHsgZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lLCBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgJyR7bmFtZX0nOiBmYWlsZWQgdG8gYWN0aXZhdGUgJHtlbGVtZW50VHlwZX0gJyR7ZWxlbWVudE5hbWV9JyDigJQgJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggb3RoZXIgZWxlbWVudHMgcmF0aGVyIHRoYW4gZmFpbGluZyBjb21wbGV0ZWx5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDcuIEJ1aWxkIHRoZSByZXN1bHQgd2l0aCBhbGwgY29udGV4dCAoaW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgc2FmZXR5IHRpZXIpXG4gICAgICBjb25zdCByZXN1bHQ6IEV4ZWN1dGVBZ2VudFJlc3VsdCA9IHtcbiAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICBnb2FsOiByZW5kZXJlZEdvYWwsXG4gICAgICAgIGFjdGl2ZUVsZW1lbnRzLFxuICAgICAgICBhY3RpdmF0aW9uV2FybmluZ3M6IGFjdGl2YXRpb25XYXJuaW5ncy5sZW5ndGggPiAwID8gYWN0aXZhdGlvbldhcm5pbmdzIDogdW5kZWZpbmVkLFxuICAgICAgICAvLyBJc3N1ZSAjMTI2OiBXYXJuIGFib3V0IHVubWF0Y2hlZCB0ZW1wbGF0ZSBwbGFjZWhvbGRlcnNcbiAgICAgICAgdGVtcGxhdGVXYXJuaW5nczogdW5tYXRjaGVkUGxhY2Vob2xkZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHVubWF0Y2hlZFBsYWNlaG9sZGVycy5tYXAocCA9PiBgVW5tYXRjaGVkIHRlbXBsYXRlIHBsYWNlaG9sZGVyOiB7JHtwfX1gKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhdmFpbGFibGVUb29sczogbWV0YWRhdGEudG9vbHM/LmFsbG93ZWQgfHwgW10sXG4gICAgICAgIHN1Y2Nlc3NDcml0ZXJpYTogbWV0YWRhdGEuZ29hbC5zdWNjZXNzQ3JpdGVyaWEgfHwgW10sXG4gICAgICAgIHN5c3RlbVByb21wdDogbWV0YWRhdGEuc3lzdGVtUHJvbXB0LFxuICAgICAgICBzYWZldHlUaWVyOiAnYWR2aXNvcnknLCAvLyBEZWZhdWx0LCB3aWxsIGJlIHVwZGF0ZWQgYmVsb3dcbiAgICAgIH07XG5cbiAgICAgIC8vIDguIENyZWF0ZSBhbmQgcGVyc2lzdCB0aGUgZ29hbCBmb3IgTExNIHRyYWNraW5nXG4gICAgICAvLyBUaGlzIGFsbG93cyByZWNvcmRfYWdlbnRfc3RlcCB0byBmaW5kIGFuZCB1cGRhdGUgdGhlIGdvYWxcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBnb2FsIHVzaW5nIGFnZW50LmFkZEdvYWwoKSB3aGljaCBoYW5kbGVzIHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvblxuICAgICAgY29uc3QgbmV3R29hbCA9IGFnZW50LmFkZEdvYWwoe1xuICAgICAgICBkZXNjcmlwdGlvbjogcmVuZGVyZWRHb2FsLFxuICAgICAgICBwcmlvcml0eTogJ21lZGl1bScsXG4gICAgICAgIGltcG9ydGFuY2U6IDUsXG4gICAgICAgIHVyZ2VuY3k6IDUsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IGdvYWwgc3RhdHVzIHRvIGluX3Byb2dyZXNzIHNpbmNlIGV4ZWN1dGlvbiBoYXMgc3RhcnRlZFxuICAgICAgbmV3R29hbC5zdGF0dXMgPSAnaW5fcHJvZ3Jlc3MnO1xuXG4gICAgICBjb25zdCBleGVjU2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShleGVjU2FuaXRpemVkTmFtZSkpO1xuXG4gICAgICAvLyBTdG9yZSBnb2FsSWQgaW4gcmVzdWx0IGZvciBMTE0gdG8gdXNlIHdpdGggcmVjb3JkX2FnZW50X3N0ZXBcbiAgICAgIHJlc3VsdC5nb2FsSWQgPSBuZXdHb2FsLmlkO1xuXG4gICAgICAvLyBGaXggIzQ0NTogSW5jbHVkZSBzdGF0ZVZlcnNpb24gc28gc3Vic2VxdWVudCBjYWxscyBjYW4gZG8gdmVyc2lvbi1hd2FyZSBvcGVyYXRpb25zXG4gICAgICBjb25zdCBwb3N0U2F2ZVN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICAgIHJlc3VsdC5zdGF0ZVZlcnNpb24gPSBwb3N0U2F2ZVN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxO1xuXG4gICAgICAvLyBDYWxsIHZhbGlkYXRlR29hbFNlY3VyaXR5IGFuZCBhZGQgd2FybmluZ3MgdG8gcmVzdWx0XG4gICAgICBjb25zdCBzZWN1cml0eVZhbGlkYXRpb24gPSBhZ2VudC52YWxpZGF0ZUdvYWxTZWN1cml0eShyZW5kZXJlZEdvYWwpO1xuICAgICAgaWYgKHNlY3VyaXR5VmFsaWRhdGlvbi53YXJuaW5ncyAmJiBzZWN1cml0eVZhbGlkYXRpb24ud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQuc2VjdXJpdHlXYXJuaW5ncyA9IHNlY3VyaXR5VmFsaWRhdGlvbi53YXJuaW5ncztcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsbCBldmFsdWF0ZUNvbnN0cmFpbnRzIGFuZCBhZGQgdG8gcmVzdWx0XG4gICAgICByZXN1bHQuY29uc3RyYWludHMgPSBhZ2VudC5ldmFsdWF0ZUNvbnN0cmFpbnRzKG5ld0dvYWwpO1xuXG4gICAgICAvLyBDYWxsIGFzc2Vzc1Jpc2sgYW5kIGFkZCB0byByZXN1bHRcbiAgICAgIHJlc3VsdC5yaXNrQXNzZXNzbWVudCA9IGFnZW50LmFzc2Vzc1Jpc2soJ2V4ZWN1dGUnLCBuZXdHb2FsLCB7fSk7XG5cbiAgICAgIC8vIENhbGwgY2FsY3VsYXRlUHJpb3JpdHlTY29yZSBhbmQgYWRkIHRvIHJlc3VsdFxuICAgICAgcmVzdWx0LnByaW9yaXR5U2NvcmUgPSBhZ2VudC5jYWxjdWxhdGVQcmlvcml0eVNjb3JlKG5ld0dvYWwpO1xuXG4gICAgICAvLyA5LiBEZXRlcm1pbmUgc2FmZXR5IHRpZXIgYmFzZWQgb24gcmlzayBhc3Nlc3NtZW50IGFuZCBzZWN1cml0eSB3YXJuaW5nc1xuICAgICAgLy8gKE5vdGU6IGV4ZWN1dGlvbkNvbnRleHQgYWxyZWFkeSBjcmVhdGVkIGVhcmxpZXIgZm9yIGNpcmN1bGFyIGRldGVjdGlvbilcbiAgICAgIGNvbnN0IHNhZmV0eVRpZXJSZXN1bHQgPSBkZXRlcm1pbmVTYWZldHlUaWVyKFxuICAgICAgICByZXN1bHQucmlza0Fzc2Vzc21lbnQ/LnNjb3JlIHx8IDAsXG4gICAgICAgIHJlc3VsdC5zZWN1cml0eVdhcm5pbmdzIHx8IFtdLFxuICAgICAgICByZW5kZXJlZEdvYWwsXG4gICAgICAgIERFRkFVTFRfU0FGRVRZX0NPTkZJRyxcbiAgICAgICAgZXhlY3V0aW9uQ29udGV4dFxuICAgICAgKTtcblxuICAgICAgLy8gMTAuIFNldCBzYWZldHkgdGllciBhbmQgcmVsYXRlZCBmaWVsZHNcbiAgICAgIHJlc3VsdC5zYWZldHlUaWVyID0gc2FmZXR5VGllclJlc3VsdC50aWVyO1xuICAgICAgcmVzdWx0LnNhZmV0eVRpZXJSZXN1bHQgPSBzYWZldHlUaWVyUmVzdWx0O1xuICAgICAgcmVzdWx0LmV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuXG4gICAgICAvLyAxMS4gQWRkIHRpZXItc3BlY2lmaWMgcmVzcG9uc2VzXG4gICAgICBzd2l0Y2ggKHNhZmV0eVRpZXJSZXN1bHQudGllcikge1xuICAgICAgICBjYXNlICdjb25maXJtJzpcbiAgICAgICAgICByZXN1bHQuY29uZmlybWF0aW9uUmVxdWlyZWQgPSBjcmVhdGVDb25maXJtYXRpb25SZXF1ZXN0KFxuICAgICAgICAgICAgJ09wZXJhdGlvbiByZXF1aXJlcyBjb25maXJtYXRpb24nLFxuICAgICAgICAgICAgc2FmZXR5VGllclJlc3VsdC5mYWN0b3JzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd2ZXJpZnknOlxuICAgICAgICAgIHJlc3VsdC52ZXJpZmljYXRpb25SZXF1aXJlZCA9IGNyZWF0ZVZlcmlmaWNhdGlvbkNoYWxsZW5nZShcbiAgICAgICAgICAgIHNhZmV0eVRpZXJSZXN1bHQuZmFjdG9ycy5qb2luKCc7ICcpLFxuICAgICAgICAgICAgJ2Rpc3BsYXlfY29kZSdcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Rhbmdlcl96b25lJzpcbiAgICAgICAgICByZXN1bHQuZGFuZ2VyWm9uZUJsb2NrZWQgPSBjcmVhdGVEYW5nZXJab25lT3BlcmF0aW9uKFxuICAgICAgICAgICAgJ2FnZW50X2V4ZWN1dGlvbicsXG4gICAgICAgICAgICBzYWZldHlUaWVyUmVzdWx0LmZhY3RvcnMuam9pbignOyAnKSxcbiAgICAgICAgICAgIERFRkFVTFRfU0FGRVRZX0NPTkZJRy5kYW5nZXJab25lLmVuYWJsZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIEFsc28gYWRkIHZlcmlmaWNhdGlvbiBpZiBub3QgYmxvY2tlZFxuICAgICAgICAgIGlmICghcmVzdWx0LmRhbmdlclpvbmVCbG9ja2VkLmJsb2NrZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC52ZXJpZmljYXRpb25SZXF1aXJlZCA9IHJlc3VsdC5kYW5nZXJab25lQmxvY2tlZC52ZXJpZmljYXRpb25SZXF1aXJlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnYWR2aXNvcnknOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIE5vIGFkZGl0aW9uYWwgYWN0aW9uIG5lZWRlZCBmb3IgYWR2aXNvcnkgdGllclxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9FWEVDVVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmV4ZWN1dGVBZ2VudCcsXG4gICAgICAgIGRldGFpbHM6IGBBZ2VudCBleGVjdXRlZDogJHtuYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ30gKHNhZmV0eTogJHtzYWZldHlUaWVyUmVzdWx0LnRpZXJ9KWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgICAgc2FmZXR5VGllcjogc2FmZXR5VGllclJlc3VsdC50aWVyLFxuICAgICAgICAgIHJpc2tTY29yZTogc2FmZXR5VGllclJlc3VsdC5yaXNrU2NvcmUsXG4gICAgICAgICAgcGFyYW1ldGVyS2V5czogT2JqZWN0LmtleXMocGFyYW1ldGVycyB8fCB7fSksXG4gICAgICAgICAgZ29hbENvdW50OiAobWV0YWRhdGEgYXMgYW55KS5nb2FsPy5wYXJhbWV0ZXJzPy5sZW5ndGggfHwgMCxcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgYWdlbnQgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWN1cml0eSB2YWxpZGF0aW9uIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChJc3N1ZSAjMTAzKS5cbiAgICogQ2hlY2tzIGZvciBwcm90b3R5cGUgcG9sbHV0aW9uLCBVbmljb2RlIGluamVjdGlvbiwgYW5kIG92ZXJzaXplZCBwYXlsb2Fkcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgQkVGT1JFIHRlbXBsYXRlIHJlbmRlcmluZy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJTZWN1cml0eShwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIC8vIDEuIFByb3RvdHlwZSBwb2xsdXRpb24gY2hlY2sg4oCUIHJlamVjdCBkYW5nZXJvdXMga2V5c1xuICAgIGNvbnN0IEZPUkJJRERFTl9LRVlTID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyYW1ldGVycykpIHtcbiAgICAgIGlmIChGT1JCSURERU5fS0VZUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci52YWxpZGF0ZVBhcmFtZXRlclNlY3VyaXR5JyxcbiAgICAgICAgICBkZXRhaWxzOiBgUHJvdG90eXBlIHBvbGx1dGlvbiBhdHRlbXB0IHZpYSBwYXJhbWV0ZXIga2V5OiAnJHtrZXl9J2AsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvcmJpZGRlbiBwYXJhbWV0ZXIga2V5OiAnJHtrZXl9JyAocG90ZW50aWFsIHByb3RvdHlwZSBwb2xsdXRpb24pYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gTGltaXQgcGFyYW1ldGVyIGNvdW50IHRvIHByZXZlbnQgcmVzb3VyY2UgZXhoYXVzdGlvblxuICAgIGNvbnN0IE1BWF9QQVJBTUVURVJTID0gNTA7XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLmxlbmd0aCA+IE1BWF9QQVJBTUVURVJTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvbyBtYW55IHBhcmFtZXRlcnM6ICR7T2JqZWN0LmtleXMocGFyYW1ldGVycykubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgJHtNQVhfUEFSQU1FVEVSU31gKTtcbiAgICB9XG5cbiAgICAvLyAzLiBVbmljb2RlIG5vcm1hbGl6YXRpb24gdmlhIElucHV0Tm9ybWFsaXplclxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBJbnB1dE5vcm1hbGl6ZXIubm9ybWFsaXplKHBhcmFtZXRlcnMsICckLnBhcmFtZXRlcnMnKTtcbiAgICBpZiAobm9ybWFsaXplZC5oYXNIaWdoT3JDcml0aWNhbElzc3Vlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGVtcGxhdGUgcGFyYW1ldGVyIHNlY3VyaXR5IHZhbGlkYXRpb24gZmFpbGVkOiAke25vcm1hbGl6ZWQuZXJyb3JzLmpvaW4oJzsgJyl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBub3JtYWxpemVkIHZhbHVlcyBiYWNrIChpbi1wbGFjZSwgc2luY2Ugd2UgYWxyZWFkeSBjbG9uZWQpXG4gICAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBub3JtYWxpemVkLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9ybWFsaXplZERhdGEpKSB7XG4gICAgICBwYXJhbWV0ZXJzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybignVGVtcGxhdGUgcGFyYW1ldGVyIG5vcm1hbGl6YXRpb24gd2FybmluZ3MnLCB7XG4gICAgICAgIHdhcm5pbmdzOiBub3JtYWxpemVkLndhcm5pbmdzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBhcmFtZXRlcnMgYWdhaW5zdCBnb2FsIHBhcmFtZXRlciBzY2hlbWFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJzKFxuICAgIGdvYWxDb25maWc6IEFnZW50R29hbENvbmZpZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbURlZnMgPSBnb2FsQ29uZmlnLnBhcmFtZXRlcnMgfHwgW107XG5cbiAgICAvLyBDaGVjayBhbGwgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUgcHJlc2VudFxuICAgIGZvciAoY29uc3QgcGFyYW1EZWYgb2YgcGFyYW1EZWZzKSB7XG4gICAgICBpZiAocGFyYW1EZWYucmVxdWlyZWQgJiYgIShwYXJhbURlZi5uYW1lIGluIHBhcmFtZXRlcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6ICR7cGFyYW1EZWYubmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUeXBlIGNoZWNrIHByb3ZpZGVkIHBhcmFtZXRlcnNcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKSkge1xuICAgICAgY29uc3QgcGFyYW1EZWYgPSBwYXJhbURlZnMuZmluZChwID0+IHAubmFtZSA9PT0ga2V5KTtcbiAgICAgIGlmICghcGFyYW1EZWYpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVua25vd24gcGFyYW1ldGVyICcke2tleX0nIHByb3ZpZGVkIHRvIGFnZW50YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUeXBlIHZhbGlkYXRpb25cbiAgICAgIGNvbnN0IGFjdHVhbFR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ3N0cmluZycgJiYgYWN0dWFsVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ251bWJlcicgJiYgYWN0dWFsVHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgbXVzdCBiZSBhIG51bWJlciwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ2Jvb2xlYW4nICYmIGFjdHVhbFR5cGUgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkdmlzb3J5IGxlbmd0aCB3YXJuaW5nIGZvciBzdHJpbmcgdmFsdWVzIChkZWZlbnNlLWluLWRlcHRoLCBkb2VzIG5vdCB0aHJvdylcbiAgICAgIGlmIChhY3R1YWxUeXBlID09PSAnc3RyaW5nJyAmJiAodmFsdWUgYXMgc3RyaW5nKS5sZW5ndGggPiBBR0VOVF9MSU1JVFMuTUFYX0dPQUxfTEVOR1RIKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdQYXJhbWV0ZXIgc3RyaW5nIHZhbHVlIGV4Y2VlZHMgTUFYX0dPQUxfTEVOR1RIIChhZHZpc29yeSknLCB7XG4gICAgICAgICAgcGFyYW1OYW1lOiBrZXksXG4gICAgICAgICAgdmFsdWVMZW5ndGg6ICh2YWx1ZSBhcyBzdHJpbmcpLmxlbmd0aCxcbiAgICAgICAgICBtYXhMZW5ndGg6IEFHRU5UX0xJTUlUUy5NQVhfR09BTF9MRU5HVEgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlZmF1bHRzIGZvciBvcHRpb25hbCBwYXJhbWV0ZXJzIG5vdCBwcm92aWRlZFxuICAgIGZvciAoY29uc3QgcGFyYW1EZWYgb2YgcGFyYW1EZWZzKSB7XG4gICAgICBpZiAoIXBhcmFtRGVmLnJlcXVpcmVkICYmICEocGFyYW1EZWYubmFtZSBpbiBwYXJhbWV0ZXJzKSAmJiBwYXJhbURlZi5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFyYW1ldGVyc1twYXJhbURlZi5uYW1lXSA9IHBhcmFtRGVmLmRlZmF1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBnb2FsIHRlbXBsYXRlIGJ5IHJlcGxhY2luZyB7cGFyYW1ldGVyfSBwbGFjZWhvbGRlcnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyR29hbFRlbXBsYXRlKFxuICAgIHRlbXBsYXRlOiBzdHJpbmcsXG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogc3RyaW5nIHtcbiAgICBsZXQgcmVuZGVyZWQgPSB0ZW1wbGF0ZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKSkge1xuICAgICAgLy8gRXNjYXBlIGtleSB0byBwcmV2ZW50IHJlZ2V4IG1ldGFjaGFyYWN0ZXJzIGZyb20gY2F1c2luZyBSZURvUyAoSXNzdWUgIzEwMylcbiAgICAgIGNvbnN0IGVzY2FwZWRLZXkgPSBTYWZlUmVnZXguZXNjYXBlKGtleSk7XG4gICAgICByZW5kZXJlZCA9IHJlbmRlcmVkLnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXHske2VzY2FwZWRLZXl9XFxcXH1gLCAnZycpLCBTdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBDYXAgcmVuZGVyZWQgZ29hbCBsZW5ndGggdG8gcHJldmVudCBvdmVyc2l6ZWQgcGF5bG9hZHNcbiAgICBpZiAocmVuZGVyZWQubGVuZ3RoID4gQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlbmRlcmVkIGdvYWwgZXhjZWVkcyBNQVhfUkVOREVSRURfR09BTF9MRU5HVEgsIHRydW5jYXRpbmcnLCB7XG4gICAgICAgIHJlbmRlcmVkTGVuZ3RoOiByZW5kZXJlZC5sZW5ndGgsXG4gICAgICAgIG1heExlbmd0aDogQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCxcbiAgICAgIH0pO1xuICAgICAgcmVuZGVyZWQgPSByZW5kZXJlZC5zdWJzdHJpbmcoMCwgQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbmRlcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCB1bm1hdGNoZWQge3BsYWNlaG9sZGVyfSBwYXR0ZXJucyByZW1haW5pbmcgYWZ0ZXIgdGVtcGxhdGUgcmVuZGVyaW5nLlxuICAgKiBSZXR1cm5zIGFycmF5IG9mIHBsYWNlaG9sZGVyIG5hbWVzIGZvdW5kIGluIHRoZSByZW5kZXJlZCBzdHJpbmcuXG4gICAqIElzc3VlICMxMjY6IFdhcm4gd2hlbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RVbm1hdGNoZWRQbGFjZWhvbGRlcnMocmVuZGVyZWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwbGFjZWhvbGRlclBhdHRlcm4gPSAvXFx7KFthLXpBLVpfXVthLXpBLVowLTlfXSopXFx9L2c7XG4gICAgY29uc3QgdW5tYXRjaGVkOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICB3aGlsZSAoKG1hdGNoID0gcGxhY2Vob2xkZXJQYXR0ZXJuLmV4ZWMocmVuZGVyZWQpKSAhPT0gbnVsbCkge1xuICAgICAgdW5tYXRjaGVkLnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gdW5tYXRjaGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYSBjb25zaXN0ZW50IGVycm9yIG1lc3NhZ2UgZm9yIGNpcmN1bGFyIGFjdGl2YXRpb24gZGV0ZWN0aW9uLlxuICAgKiBVc2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBwcmUtZmxpZ2h0IGNoZWNrIGFuZCB0aGUgcnVudGltZSBjaGFpbiBjaGVjay5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlUGF0aDogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGFnZW50TmFtZSA9IGN5Y2xlUGF0aFtjeWNsZVBhdGgubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIChcbiAgICAgIGBDaXJjdWxhciBhZ2VudCBhY3RpdmF0aW9uIGRldGVjdGVkIChjeWNsZSBvZiAke2N5Y2xlUGF0aC5sZW5ndGggLSAxfSk6IGAgK1xuICAgICAgYCR7Y3ljbGVQYXRoLmpvaW4oJyDihpIgJyl9LiBgICtcbiAgICAgIGBBZ2VudCAnJHthZ2VudE5hbWV9JyBjYW5ub3QgYWN0aXZhdGUgaXRzZWxmIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuYFxuICAgICk7XG4gIH1cblxuICAvKiogU2FmZXR5IGxpbWl0cyBmb3IgYWN0aXZhdGlvbiBncmFwaCB0cmF2ZXJzYWwgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0FDVElWQVRJT05fREVQVEggPSAxMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX05PREVTX1ZJU0lURUQgPSAxMDA7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBhY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiDigJQgTGF5ZXIgMSBvZiBkdWFsLWRldGVjdGlvbiBzdHJhdGVneSAoSXNzdWUgIzM3NClcbiAgICpcbiAgICogUGVyZm9ybXMgYXN5bmMgREZTIG9uIHRoZSBhY3RpdmF0aW9uIGdyYXBoIHRvIGRldGVjdCBjeWNsZXMgQkVGT1JFIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAqIFRoaXMgaXMgYSBwcmUtZmxpZ2h0IGNoZWNrIHRoYXQgcHJldmVudHMgY2lyY3VsYXIgYWN0aXZhdGlvbiBjaGFpbnMgZnJvbSBiZWluZyBhdHRlbXB0ZWQuXG4gICAqXG4gICAqIExheWVyIDEgKHRoaXMgbWV0aG9kKTogU3RhdGljIGdyYXBoIGFuYWx5c2lzIOKAlCB3YWxrcyB0aGUgYWN0aXZhdGlvbiBncmFwaCBmcm9tIHRoZSByb290XG4gICAqIGFnZW50LCBsb2FkaW5nIGVhY2ggYWdlbnQncyBgYWN0aXZhdGVzLmFnZW50c2AgbWV0YWRhdGEuIENhdGNoZXMgYWxsIGN5Y2xlcyByZWFjaGFibGVcbiAgICogZnJvbSB0aGUgcm9vdCB3aXRob3V0IGV4ZWN1dGluZyBhbnkgYWdlbnRzLiBCb3VuZGVkIGJ5IE1BWF9BQ1RJVkFUSU9OX0RFUFRIIGFuZFxuICAgKiBNQVhfTk9ERVNfVklTSVRFRCB0byBwcmV2ZW50IHJlc291cmNlIGV4aGF1c3Rpb24gZnJvbSBsYXJnZSBhY3ljbGljIGdyYXBocy5cbiAgICpcbiAgICogTGF5ZXIgMiAoZ2V0RWxlbWVudENvbnRlbnQgcnVudGltZSBjaGVjayk6IERlZmVuc2UtaW4tZGVwdGgg4oCUIGd1YXJkcyBhZ2FpbnN0IGVkZ2UgY2FzZXNcbiAgICogbGlrZSBkeW5hbWljYWxseS1jb25zdHJ1Y3RlZCBhY3RpdmF0aW9uIGNoYWlucyBvciBhZ2VudHMgbW9kaWZpZWQgYmV0d2VlbiB0aGUgc3RhdGljXG4gICAqIGNoZWNrIGFuZCBhY3R1YWwgZXhlY3V0aW9uLiBTZWUgZ2V0RWxlbWVudENvbnRlbnQgZm9yIGRldGFpbHMuXG4gICAqXG4gICAqIEBwYXJhbSByb290TmFtZSAtIFRoZSByb290IGFnZW50IG5hbWUgaW5pdGlhdGluZyB0aGUgYWN0aXZhdGlvbiBjaGFpblxuICAgKiBAcGFyYW0gYWN0aXZhdGVkQWdlbnRzIC0gVGhlIGltbWVkaWF0ZSBhZ2VudHMgYWN0aXZhdGVkIGJ5IHRoZSByb290XG4gICAqIEByZXR1cm5zIFRoZSBjeWNsZSBwYXRoIGFycmF5IGlmIGEgY3ljbGUgZXhpc3RzLCBudWxsIG90aGVyd2lzZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZXRlY3RBY3RpdmF0aW9uQ3ljbGVzKFxuICAgIHJvb3ROYW1lOiBzdHJpbmcsXG4gICAgYWN0aXZhdGVkQWdlbnRzOiBzdHJpbmdbXVxuICApOiBQcm9taXNlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICAgIC8vIENhY2hlIGxvYWRlZCBhZ2VudHMgdG8gYXZvaWQgcmVkdW5kYW50IEkvTyBkdXJpbmcgREZTXG4gICAgY29uc3QgYWdlbnRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXSB8IG51bGw+KCk7XG5cbiAgICAvLyBIZWxwZXI6IGxvYWQgYW4gYWdlbnQncyBhY3RpdmF0ZXMuYWdlbnRzIGxpc3QgKGNhY2hlZClcbiAgICBjb25zdCBnZXRBY3RpdmF0ZWRBZ2VudHMgPSBhc3luYyAobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoYWdlbnRDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICAgIHJldHVybiBhZ2VudENhY2hlLmdldChjYWNoZUtleSkgfHwgW107XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfScgcmVmZXJlbmNlZCBpbiBhY3RpdmF0ZXMuYWdlbnRzIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBkdXJpbmcgY3ljbGUgZGV0ZWN0aW9uYCk7XG4gICAgICAgICAgYWdlbnRDYWNoZS5zZXQoY2FjaGVLZXksIG51bGwpO1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuICAgICAgICBjb25zdCBhZ2VudHMgPSBtZXRhLmFjdGl2YXRlcz8uYWdlbnRzIHx8IFtdO1xuICAgICAgICBhZ2VudENhY2hlLnNldChjYWNoZUtleSwgYWdlbnRzKTtcbiAgICAgICAgcmV0dXJuIGFnZW50cztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgJyR7bmFtZX0nIHJlZmVyZW5jZWQgaW4gYWN0aXZhdGVzLmFnZW50cyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgZHVyaW5nIGN5Y2xlIGRldGVjdGlvbmApO1xuICAgICAgICBhZ2VudENhY2hlLnNldChjYWNoZUtleSwgbnVsbCk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVHJhY2tzIG5vZGVzIHdob3NlIGVudGlyZSBzdWJ0cmVlIGhhcyBiZWVuIGV4cGxvcmVkIHdpdGhvdXQgZmluZGluZyBhIGN5Y2xlLlxuICAgIC8vIFByZXZlbnRzIGV4cG9uZW50aWFsIHJlLWV4cGxvcmF0aW9uIGluIGRpYW1vbmQvY29udmVyZ2VudCBncmFwaHMuXG4gICAgY29uc3QgZnVsbHlFeHBsb3JlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCBub2Rlc1Zpc2l0ZWQgPSAwO1xuXG4gICAgLy8gREZTIOKAlCBzdGFjayBlbnRyaWVzOiBbY3VycmVudEFnZW50LCBwYXRoU29GYXIsIHBhdGhTZXRMb3dlcl1cbiAgICAvLyBwYXRoU2V0TG93ZXIgaXMgYSBTZXQ8c3RyaW5nPiBvZiBsb3dlcmNhc2VkIG5hbWVzIGZvciBPKDEpIGN5Y2xlIGNoZWNrc1xuICAgIGNvbnN0IHN0YWNrOiBBcnJheTxbc3RyaW5nLCBzdHJpbmdbXSwgU2V0PHN0cmluZz5dPiA9IFtdO1xuXG4gICAgY29uc3Qgcm9vdExvd2VyID0gcm9vdE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGFjdGl2YXRlZEFnZW50cykge1xuICAgICAgLy8gU2VsZi1sb29wOiBhZ2VudCBkaXJlY3RseSBhY3RpdmF0ZXMgaXRzZWxmXG4gICAgICBpZiAoY2hpbGQudG9Mb3dlckNhc2UoKSA9PT0gcm9vdExvd2VyKSB7XG4gICAgICAgIHJldHVybiBbcm9vdE5hbWUsIGNoaWxkXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGhTZXQgPSBuZXcgU2V0PHN0cmluZz4oW3Jvb3RMb3dlciwgY2hpbGQudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgc3RhY2sucHVzaChbY2hpbGQsIFtyb290TmFtZSwgY2hpbGRdLCBwYXRoU2V0XSk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IFtjdXJyZW50LCBjdXJyZW50UGF0aCwgcGF0aFNldF0gPSBzdGFjay5wb3AoKSE7XG5cbiAgICAgIG5vZGVzVmlzaXRlZCsrO1xuICAgICAgaWYgKG5vZGVzVmlzaXRlZCA+IEFnZW50TWFuYWdlci5NQVhfTk9ERVNfVklTSVRFRCkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgQWN0aXZhdGlvbiBjeWNsZSBkZXRlY3Rpb24gZm9yICcke3Jvb3ROYW1lfScgYWJvcnRlZDogZXhjZWVkZWQgJHtBZ2VudE1hbmFnZXIuTUFYX05PREVTX1ZJU0lURUR9IG5vZGVzIHZpc2l0ZWQuIGAgK1xuICAgICAgICAgIGBUaGUgYWN0aXZhdGlvbiBncmFwaCBtYXkgYmUgdG9vIGxhcmdlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50UGF0aC5sZW5ndGggPiBBZ2VudE1hbmFnZXIuTUFYX0FDVElWQVRJT05fREVQVEggKyAxKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiBmb3IgJyR7cm9vdE5hbWV9JyBoaXQgZGVwdGggbGltaXQgb2YgJHtBZ2VudE1hbmFnZXIuTUFYX0FDVElWQVRJT05fREVQVEh9LiBgICtcbiAgICAgICAgICBgU2tpcHBpbmcgZGVlcGVyIGJyYW5jaGVzLmBcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRMb3dlciA9IGN1cnJlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChmdWxseUV4cGxvcmVkLmhhcyhjdXJyZW50TG93ZXIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2FkIHRoaXMgYWdlbnQncyBhY3RpdmF0aW9uc1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCBnZXRBY3RpdmF0ZWRBZ2VudHMoY3VycmVudCk7XG5cbiAgICAgIGxldCBmb3VuZEN5Y2xlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTG93ZXIgPSBjaGlsZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBjeWNsZTogZG9lcyB0aGlzIGNoaWxkIGFwcGVhciBlYXJsaWVyIGluIHRoZSBwYXRoP1xuICAgICAgICBpZiAocGF0aFNldC5oYXMoY2hpbGRMb3dlcikpIHtcbiAgICAgICAgICByZXR1cm4gWy4uLmN1cnJlbnRQYXRoLCBjaGlsZF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZ1bGx5RXhwbG9yZWQuaGFzKGNoaWxkTG93ZXIpKSB7XG4gICAgICAgICAgY29uc3QgbmV3UGF0aFNldCA9IG5ldyBTZXQocGF0aFNldCk7XG4gICAgICAgICAgbmV3UGF0aFNldC5hZGQoY2hpbGRMb3dlcik7XG4gICAgICAgICAgc3RhY2sucHVzaChbY2hpbGQsIFsuLi5jdXJyZW50UGF0aCwgY2hpbGRdLCBuZXdQYXRoU2V0XSk7XG4gICAgICAgICAgZm91bmRDeWNsZSA9IHRydWU7IC8vIGhhcyBjaGlsZHJlbiB0byBleHBsb3JlLCBub3QgZnVsbHkgZXhwbG9yZWQgeWV0XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gdW5leHBsb3JlZCBjaGlsZHJlbiwgdGhpcyBub2RlJ3Mgc3VidHJlZSBpcyBjeWNsZS1mcmVlXG4gICAgICBpZiAoIWZvdW5kQ3ljbGUpIHtcbiAgICAgICAgZnVsbHlFeHBsb3JlZC5hZGQoY3VycmVudExvd2VyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29udGVudCBmcm9tIGFuIGVsZW1lbnQgKGVsZW1lbnQtYWdub3N0aWMpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEVsZW1lbnRDb250ZW50KFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmcsXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICBleGVjdXRpb25Db250ZXh0PzogRXhlY3V0aW9uQ29udGV4dFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIEdldCB0aGUgc3RhdGljIHJlc29sdmVyXG4gICAgY29uc3QgcmVzb2x2ZXIgPSBBZ2VudE1hbmFnZXIuZ2V0RWxlbWVudE1hbmFnZXJSZXNvbHZlcigpO1xuICAgIGlmICghcmVzb2x2ZXIpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBFbGVtZW50IG1hbmFnZXIgcmVzb2x2ZXIgbm90IGNvbmZpZ3VyZWQgLSBjYW5ub3QgYWN0aXZhdGUgJHtlbGVtZW50VHlwZX0vJHtlbGVtZW50TmFtZX1gKTtcbiAgICAgIHJldHVybiBgW0VsZW1lbnQgbWFuYWdlciByZXNvbHZlciBub3QgY29uZmlndXJlZCBmb3IgJHtlbGVtZW50VHlwZX0vJHtlbGVtZW50TmFtZX1dYDtcbiAgICB9XG5cbiAgICAvLyBMYXllciAyIChkZWZlbnNlLWluLWRlcHRoKTogUnVudGltZSBjaXJjdWxhciBhY3RpdmF0aW9uIGRldGVjdGlvbiAoSXNzdWUgIzEwOSlcbiAgICAvLyBUaGUgc3RhdGljIHByZS1mbGlnaHQgY2hlY2sgKGRldGVjdEFjdGl2YXRpb25DeWNsZXMsIGxheWVyIDEpIGNhdGNoZXMgbW9zdCBjeWNsZXNcbiAgICAvLyBiZWZvcmUgZXhlY3V0aW9uIGJlZ2lucy4gVGhpcyBydW50aW1lIGNoZWNrIGd1YXJkcyBhZ2FpbnN0IGVkZ2UgY2FzZXMgc3VjaCBhc1xuICAgIC8vIGR5bmFtaWNhbGx5LWNvbnN0cnVjdGVkIGFjdGl2YXRpb24gY2hhaW5zIG9yIGFnZW50cyBtb2RpZmllZCBiZXR3ZWVuIHRoZSBzdGF0aWNcbiAgICAvLyBjaGVjayBhbmQgYWN0dWFsIGV4ZWN1dGlvbi4gVXNlcyBleGVjdXRpb25Db250ZXh0LmFnZW50Q2hhaW4gd2hpY2ggdHJhY2tzIHRoZVxuICAgIC8vIGN1cnJlbnQgZXhlY3V0aW9uIHBhdGgg4oCUIGVmZmVjdGl2ZSBmb3IgZGlyZWN0IGFuZCBtdWx0aS1ob3AgY2hhaW5zIHdpdGhpbiBhXG4gICAgLy8gc2luZ2xlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gJ2FnZW50cycgJiYgZXhlY3V0aW9uQ29udGV4dD8uYWdlbnRDaGFpbikge1xuICAgICAgY29uc3QgY2hhaW5TZXQgPSBuZXcgU2V0KGV4ZWN1dGlvbkNvbnRleHQuYWdlbnRDaGFpbi5tYXAobmFtZSA9PiBuYW1lLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gZWxlbWVudE5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKGNoYWluU2V0Lmhhcyhub3JtYWxpemVkTmFtZSkpIHtcbiAgICAgICAgY29uc3QgY3ljbGVQYXRoID0gWy4uLmV4ZWN1dGlvbkNvbnRleHQuYWdlbnRDaGFpbiwgZWxlbWVudE5hbWVdO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoQWdlbnRNYW5hZ2VyLmZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlUGF0aCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBNYXAgcGx1cmFsIGVsZW1lbnQgdHlwZXMgdG8gbWFuYWdlciBuYW1lc1xuICAgICAgY29uc3QgbWFuYWdlck5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIHBlcnNvbmFzOiAnUGVyc29uYU1hbmFnZXInLFxuICAgICAgICBza2lsbHM6ICdTa2lsbE1hbmFnZXInLFxuICAgICAgICBtZW1vcmllczogJ01lbW9yeU1hbmFnZXInLFxuICAgICAgICB0ZW1wbGF0ZXM6ICdUZW1wbGF0ZU1hbmFnZXInLFxuICAgICAgICBlbnNlbWJsZXM6ICdFbnNlbWJsZU1hbmFnZXInLFxuICAgICAgICBhZ2VudHM6ICdBZ2VudE1hbmFnZXInXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtYW5hZ2VyTmFtZSA9IG1hbmFnZXJOYW1lTWFwW2VsZW1lbnRUeXBlXTtcbiAgICAgIGlmICghbWFuYWdlck5hbWUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVua25vd24gZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfWApO1xuICAgICAgICByZXR1cm4gYFtVbmtub3duIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1dYDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFuYWdlciA9IHJlc29sdmVyKG1hbmFnZXJOYW1lKTtcbiAgICAgIGlmICghbWFuYWdlcikge1xuICAgICAgICBsb2dnZXIud2FybihgTWFuYWdlciBub3QgZm91bmQgZm9yIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gKTtcbiAgICAgICAgcmV0dXJuIGBbTWFuYWdlciBub3QgZm91bmQ6ICR7bWFuYWdlck5hbWV9XWA7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBhbGwgZWxlbWVudHMgb2YgdGhpcyB0eXBlXG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IG1hbmFnZXIubGlzdCgpO1xuICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzLmZpbmQoKGU6IGFueSkgPT4gZS5tZXRhZGF0YS5uYW1lID09PSBlbGVtZW50TmFtZSk7XG5cbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZWxlbWVudFR5cGV9ICcke2VsZW1lbnROYW1lfScgbm90IGZvdW5kYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHVybiBhcHByb3ByaWF0ZSBjb250ZW50IGJhc2VkIG9uIGVsZW1lbnQgdHlwZVxuICAgICAgc3dpdGNoIChlbGVtZW50VHlwZSkge1xuICAgICAgICBjYXNlICdwZXJzb25hcyc6XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY29udGVudCB8fCAnJztcblxuICAgICAgICBjYXNlICdza2lsbHMnOlxuICAgICAgICAgIHJldHVybiBlbGVtZW50Lmluc3RydWN0aW9ucyB8fCAnJztcblxuICAgICAgICBjYXNlICdtZW1vcmllcyc6IHtcbiAgICAgICAgICBjb25zdCBlbnRyaWVzID0gZWxlbWVudC5nZXRFbnRyaWVzKCk7XG4gICAgICAgICAgcmV0dXJuIGBNZW1vcnkgJyR7ZWxlbWVudE5hbWV9JyB3aXRoICR7ZW50cmllcy5sZW5ndGh9IGVudHJpZXNgO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAndGVtcGxhdGVzJzpcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5jb250ZW50IHx8ICcnO1xuXG4gICAgICAgIGNhc2UgJ2Vuc2VtYmxlcyc6IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50TGlzdCA9IE9iamVjdC5lbnRyaWVzKGVsZW1lbnQuZWxlbWVudHMgfHwge30pXG4gICAgICAgICAgICAubWFwKChbdHlwZSwgbmFtZXNdKSA9PiBgJHt0eXBlfTogJHtBcnJheS5pc0FycmF5KG5hbWVzKSA/IG5hbWVzLmpvaW4oJywgJykgOiBTdHJpbmcobmFtZXMpfWApXG4gICAgICAgICAgICAuam9pbignOyAnKTtcbiAgICAgICAgICByZXR1cm4gYEVuc2VtYmxlICcke2VsZW1lbnROYW1lfScgYWN0aXZhdGVzOiAke2VsZW1lbnRMaXN0fWA7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdhZ2VudHMnOiB7XG4gICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gZWxlbWVudC5leHRlbnNpb25zPy5pbnN0cnVjdGlvbnMgfHwgJyc7XG4gICAgICAgICAgcmV0dXJuIGluc3RydWN0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGBbQ29udGVudCBub3QgYXZhaWxhYmxlIGZvciAke2VsZW1lbnRUeXBlfV1gO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGdldHRpbmcgY29udGVudCBmb3IgJHtlbGVtZW50VHlwZX0gJyR7ZWxlbWVudE5hbWV9JzpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWN0aXZlIHNldCBjbGVhbnVwIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBjbGVhbnVwIGlmIG5lY2Vzc2FyeVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgbWF4LCBjbGVhbnVwVGhyZXNob2xkIH0gPSBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcoJ2FnZW50cycpO1xuXG4gICAgLy8gQmVsb3cgdGhyZXNob2xkIOKAlCBubyBhY3Rpb24gbmVlZGVkXG4gICAgaWYgKHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplIDwgY2xlYW51cFRocmVzaG9sZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIG1heCDigJQgd2FybiBiZWZvcmUgY2xlYW51cFxuICAgIGlmICh0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZSA+PSBtYXgpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgQWN0aXZlIGFnZW50cyBsaW1pdCByZWFjaGVkICgke21heH0pLiBgICtcbiAgICAgICAgYENvbnNpZGVyIGRlYWN0aXZhdGluZyB1bnVzZWQgYWdlbnRzIG9yIHNldHRpbmcgRE9MTEhPVVNFX01BWF9BQ1RJVkVfQUdFTlRTIHRvIGEgaGlnaGVyIHZhbHVlLmBcbiAgICAgICk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0FHRU5UX0FDVElWQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCcsXG4gICAgICAgIGRldGFpbHM6IGBBY3RpdmUgYWdlbnRzIGxpbWl0IHJlYWNoZWQgKCR7dGhpcy5hY3RpdmVBZ2VudE5hbWVzLnNpemV9LyR7bWF4fSlgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFjdGl2ZUNvdW50OiB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZSxcbiAgICAgICAgICBtYXhBbGxvd2VkOiBtYXgsXG4gICAgICAgICAgYWN0aXZlQWdlbnROYW1lczogQXJyYXkuZnJvbSh0aGlzLmFjdGl2ZUFnZW50TmFtZXMpLFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSB0aHJlc2hvbGQg4oCUIHByb2FjdGl2ZWx5IGNsZWFuIHN0YWxlIGVudHJpZXNcbiAgICB2b2lkIHRoaXMuY2xlYW51cFN0YWxlQWN0aXZlQWdlbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgc3RhbGUgZW50cmllcyBmcm9tIGFjdGl2ZSBhZ2VudHMgc2V0XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0U2l6ZSA9IHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplO1xuICAgICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgICBjb25zdCBleGlzdGluZ0FnZW50TmFtZXMgPSBuZXcgU2V0KGFnZW50cy5tYXAoYSA9PiBhLm1ldGFkYXRhLm5hbWUpKTtcblxuICAgICAgY29uc3Qgc3RhbGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWN0aXZlTmFtZSBvZiB0aGlzLmFjdGl2ZUFnZW50TmFtZXMpIHtcbiAgICAgICAgaWYgKCFleGlzdGluZ0FnZW50TmFtZXMuaGFzKGFjdGl2ZU5hbWUpKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmRlbGV0ZShhY3RpdmVOYW1lKTtcbiAgICAgICAgICBzdGFsZU5hbWVzLnB1c2goYWN0aXZlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kU2l6ZSA9IHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9IHN0YXJ0U2l6ZSAtIGVuZFNpemU7XG5cbiAgICAgIGlmIChyZW1vdmVkID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgQ2xlYW5lZCB1cCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBhZ2VudCByZWZlcmVuY2UocykuIGAgK1xuICAgICAgICAgIGBBY3RpdmUgYWdlbnRzOiAke2VuZFNpemV9LyR7Z2V0TWF4QWN0aXZlTGltaXQoJ2FnZW50cycpfWBcbiAgICAgICAgKTtcblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMnLFxuICAgICAgICAgIGRldGFpbHM6IGBSZW1vdmVkICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIGFnZW50IHJlZmVyZW5jZXNgLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICByZW1vdmVkQ291bnQ6IHJlbW92ZWQsXG4gICAgICAgICAgICBhY3RpdmVDb3VudDogZW5kU2l6ZSxcbiAgICAgICAgICAgIHN0YWxlTmFtZXM6IHN0YWxlTmFtZXMuam9pbignLCAnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNsZWFudXAgc3RhbGUgYWN0aXZlIGFnZW50czonLCBlcnJvcik7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZUFnZW50cycsXG4gICAgICAgIGRldGFpbHM6IGBDbGVhbnVwIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3QgYW4gYWdlbnQgc3RhdGUgZmlsZSAoWUFNTCkuXG4gICAqXG4gICAqIElNUFJPVkVNRU5UOiBPcHRpbWlzdGljIGxvY2tpbmcgd2l0aCB2ZXJzaW9uIGNoZWNraW5nIChJc3N1ZSAjMjQpXG4gICAqIFByZXZlbnRzIHN0YXRlIGNvcnJ1cHRpb24gZnJvbSBjb25jdXJyZW50IHVwZGF0ZXMgYnkgY29tcGFyaW5nIHZlcnNpb25zXG4gICAqXG4gICAqIEZJWDogVXNlcyBub3JtYWxpemVGaWxlbmFtZSgpIGZvciBjb25zaXN0ZW50IHN0YXRlIGZpbGUgbmFtaW5nXG4gICAqIFRoaXMgZW5zdXJlcyBzdGF0ZSBmaWxlcyB1c2Uga2ViYWItY2FzZSAoZS5nLiwgXCJjcnVkdi1hZ2VudC1kZWx0YS5zdGF0ZS55YW1sXCIpXG4gICAqIHJlZ2FyZGxlc3Mgb2YgaW5wdXQgbmFtZSBmb3JtYXQgKGUuZy4sIFwiQ1JVRFYtQWdlbnQtRGVsdGFcIilcbiAgICpcbiAgICogRklYIChJc3N1ZSAjMTA3IC0gQ1JJVC0yKTogV3JhcCByZWFkLWNvbXBhcmUtd3JpdGUgc2VxdWVuY2UgaW4gZmlsZSBsb2NrXG4gICAqIHRvIHByZXZlbnQgVE9DVE9VIHJhY2UgY29uZGl0aW9uIGZyb20gY29uY3VycmVudCBhZ2VudCBleGVjdXRpb25zXG4gICAqXG4gICAqIEZJWCAoSXNzdWUgIzEyMyk6IFZlcnNpb24gaW5jcmVtZW50cyBvbiBzdWNjZXNzZnVsIHNhdmUsIG5vdCBkdXJpbmcgb3BlcmF0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbmV3IHN0YXRlIHZlcnNpb24gYWZ0ZXIgc3VjY2Vzc2Z1bCBzYXZlXG4gICAqIEBwcm90ZWN0ZWQgT25seSBhY2Nlc3NpYmxlIGJ5IHN1YmNsYXNzZXMgKGUuZy4sIFRlc3RhYmxlQWdlbnRNYW5hZ2VyIGZvciB0ZXN0aW5nKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVBZ2VudFN0YXRlKG5hbWU6IHN0cmluZywgc3RhdGU6IEFnZW50U3RhdGUpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3RhdGVEaXJlY3RvcnkoKTtcblxuICAgIC8vIEZJWDogTm9ybWFsaXplIG5hbWUgZm9yIGNvbnNpc3RlbnQgc3RhdGUgZmlsZSBuYW1pbmdcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5zdGF0ZURpciwgYCR7bm9ybWFsaXplZE5hbWV9JHtTVEFURV9GSUxFX0VYVEVOU0lPTn1gKTtcblxuICAgIC8vIEZJWCAoSXNzdWUgIzEwNyAtIENSSVQtMik6IEFjcXVpcmUgZmlsZSBsb2NrIHRvIHByZXZlbnQgVE9DVE9VIHJhY2UgY29uZGl0aW9uXG4gICAgLy8gVGhlIGxvY2sgY292ZXJzIHRoZSBlbnRpcmUgcmVhZC1jb21wYXJlLXdyaXRlIHNlcXVlbmNlIHRvIGVuc3VyZSBhdG9taWNpdHlcbiAgICBhd2FpdCB0aGlzLmZpbGVMb2NrTWFuYWdlci53aXRoTG9jayhgYWdlbnQtc3RhdGU6JHtub3JtYWxpemVkTmFtZX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBGSVg6IE9wdGltaXN0aWMgbG9ja2luZyBjaGVjayAoSXNzdWUgIzI0KVxuICAgICAgLy8gTG9hZCBleGlzdGluZyBzdGF0ZSB0byBjb21wYXJlIHZlcnNpb25zIGJlZm9yZSBvdmVyd3JpdGluZ1xuICAgICAgY29uc3QgZXhpc3RpbmdTdGF0ZSA9IGF3YWl0IHRoaXMubG9hZEFnZW50U3RhdGUobmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmdTdGF0ZSAmJiBleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIG91ciBzdGF0ZSBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCB2ZXJzaW9uXG4gICAgICAgIC8vIElmIHZlcnNpb25zIGRvbid0IG1hdGNoLCBpdCBtZWFucyBhbm90aGVyIHByb2Nlc3MgdXBkYXRlZCB0aGUgc3RhdGVcbiAgICAgICAgaWYgKGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uID4gc3RhdGUuc3RhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFN0YXRlIHZlcnNpb24gY29uZmxpY3QgZGV0ZWN0ZWQgZm9yIGFnZW50ICR7bmFtZX1gLCB7XG4gICAgICAgICAgICBleGlzdGluZ1ZlcnNpb246IGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICAgICAgYXR0ZW1wdGVkVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnTUVNT1JZX1NBVkVfRkFJTEVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5zYXZlQWdlbnRTdGF0ZScsXG4gICAgICAgICAgICBkZXRhaWxzOiBgU3RhdGUgdmVyc2lvbiBjb25mbGljdDogYXR0ZW1wdGVkIHRvIHNhdmUgc3RhbGUgc3RhdGVgLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBleGlzdGluZ1ZlcnNpb246IGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICAgICAgICBhdHRlbXB0ZWRWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBTdGF0ZSB2ZXJzaW9uIGNvbmZsaWN0OiBjdXJyZW50IHZlcnNpb24gaXMgJHtleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbn0sIGAgK1xuICAgICAgICAgICAgYGJ1dCBhdHRlbXB0ZWQgdG8gc2F2ZSB2ZXJzaW9uICR7c3RhdGUuc3RhdGVWZXJzaW9ufS4gYCArXG4gICAgICAgICAgICBgU3RhdGUgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBjb25jdXJyZW50bHkuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRklYIChJc3N1ZSAjMTIzKTogSW5jcmVtZW50IHZlcnNpb24gQkVGT1JFIHNlcmlhbGl6YXRpb24sIG5vdCBkdXJpbmcgb3BlcmF0aW9uc1xuICAgICAgLy8gVGhpcyBlbnN1cmVzIHZlcnNpb24gb25seSBpbmNyZW1lbnRzIG9uIHN1Y2Nlc3NmdWwgc2F2ZVxuICAgICAgc3RhdGUuc3RhdGVWZXJzaW9uID0gKHN0YXRlLnN0YXRlVmVyc2lvbiB8fCAwKSArIDE7XG5cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRTdGF0ZSA9IHRoaXMucHJlcGFyZVN0YXRlRm9yU2VyaWFsaXphdGlvbihzdGF0ZSk7XG5cbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5kdW1wWWFtbChzZXJpYWxpemVkU3RhdGUsIHtcbiAgICAgICAgc2NoZW1hOiAnanNvbicsICAvLyBGaXggIzkxNDogZmFpbHNhZmUgY29ycnVwdHMgYm9vbGVhbnMvbnVtYmVycyBpbiBhZ2VudCBzdGF0ZVxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUgc2l6ZVxuICAgICAgdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS52YWxpZGF0ZVNpemUoeWFtbENvbnRlbnQsIE1BWF9ZQU1MX1NJWkUsICdBZ2VudCBzdGF0ZScpO1xuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbENvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICAvLyBGSVg6IFVzZSBub3JtYWxpemVkIG5hbWUgYXMgY2FjaGUga2V5IGZvciBjb25zaXN0ZW50IGxvb2t1cHNcbiAgICAgIHRoaXMuc3RhdGVDYWNoZS5zZXQobm9ybWFsaXplZE5hbWUsIHN0YXRlKTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKGBBZ2VudCBzdGF0ZSBzYXZlZCBzdWNjZXNzZnVsbHlgLCB7XG4gICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgbm9ybWFsaXplZE5hbWUsXG4gICAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICBnb2FsQ291bnQ6IHN0YXRlLmdvYWxzPy5sZW5ndGggPz8gMFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIG5ldyB2ZXJzaW9uIGZvciBjYWxsZXIgdG8gc3luYyBhZ2VudCdzIGludGVybmFsIHN0YXRlXG4gICAgLy8gc3RhdGVWZXJzaW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBudW1iZXIgYWZ0ZXIgdGhlIGluY3JlbWVudCBhYm92ZVxuICAgIHJldHVybiBzdGF0ZS5zdGF0ZVZlcnNpb24hO1xuICB9XG5cbiAgLyoqXG4gICAqIFV0aWxpdHk6IGVuc3VyZSBgLm1kYCBleHRlbnNpb24gb24gcmVxdWVzdGVkIHBhdGguXG4gICAqL1xuICBwcml2YXRlIHN0cmlwRXh0ZW5zaW9uKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aChBR0VOVF9GSUxFX0VYVEVOU0lPTilcbiAgICAgID8gZmlsZVBhdGguc2xpY2UoMCwgLUFHRU5UX0ZJTEVfRVhURU5TSU9OLmxlbmd0aClcbiAgICAgIDogZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGh5ZHJhdGVBZ2VudFN0YXRlKGFnZW50OiBBZ2VudCwgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmxvYWRBZ2VudFN0YXRlKG5hbWUpO1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5wYXJzZShhZ2VudC5zZXJpYWxpemVUb0pTT04oKSk7XG4gICAgc2VyaWFsaXplZC5zdGF0ZSA9IHN0YXRlO1xuICAgIGFnZW50LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpKTtcbiAgICBhZ2VudC5tYXJrU3RhdGVQZXJzaXN0ZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFnZW50U3RhdGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudFN0YXRlIHwgbnVsbD4ge1xuICAgIC8vIEZJWDogTm9ybWFsaXplIG5hbWUgZm9yIGNvbnNpc3RlbnQgc3RhdGUgZmlsZSBsb29rdXBzXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuXG4gICAgaWYgKHRoaXMuc3RhdGVDYWNoZS5oYXMobm9ybWFsaXplZE5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZUNhY2hlLmdldChub3JtYWxpemVkTmFtZSkhO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlRmlsZW5hbWUgPSBgJHtub3JtYWxpemVkTmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWA7XG4gICAgY29uc3Qgc3RhdGVQYXRoID0gcGF0aC5qb2luKHRoaXMuc3RhdGVEaXIsIHN0YXRlRmlsZW5hbWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKHN0YXRlUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgICAgLy8gVXNlIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGZvciBZQU1MIHBhcnNpbmdcbiAgICAgIC8vIFN0YXRlIGZpbGVzIGFyZSBwdXJlIFlBTUwgYnV0IHBhcnNlRnJvbnRtYXR0ZXIgaGFuZGxlcyBib3RoIGZvcm1hdHNcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihjb250ZW50LCB7XG4gICAgICAgIG1heFlhbWxTaXplOiBNQVhfWUFNTF9TSVpFLFxuICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5sb2FkQWdlbnRTdGF0ZSdcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IHJlc3VsdC5kYXRhIGFzIEFnZW50U3RhdGU7XG4gICAgICB0aGlzLm5vcm1hbGl6ZUxvYWRlZFN0YXRlKHN0YXRlKTtcbiAgICAgIC8vIEZJWDogVXNlIG5vcm1hbGl6ZWQgbmFtZSBhcyBjYWNoZSBrZXkgZm9yIGNvbnNpc3RlbnQgbG9va3Vwc1xuICAgICAgdGhpcy5zdGF0ZUNhY2hlLnNldChub3JtYWxpemVkTmFtZSwgc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIGFnZW50IHN0YXRlOiAke25hbWV9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVTdGF0ZURpcmVjdG9yeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLnN0YXRlRGlyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8QWdlbnRNZXRhZGF0YT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0geyAuLi4oZGF0YSBhcyBhbnkpIH07XG5cbiAgICAvLyAtLS0gU1RBUlQ6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgRml4IGZvciBMZWdhY3kgQWdlbnQgVHlwZXMgLS0tXG4gICAgLy8gTGVnYWN5IGFnZW50IGRlZmluaXRpb24gZmlsZXMgbWlnaHQgdXNlICdhZ2VudCcgKHNpbmd1bGFyKSBpbnN0ZWFkIG9mXG4gICAgLy8gRWxlbWVudFR5cGUuQUdFTlQgKCdhZ2VudHMnKS4gVGhpcyBjb252ZXJ0cyB0aGUgc2luZ3VsYXIgZm9ybSB0byB0aGVcbiAgICAvLyBjb3JyZWN0IHBsdXJhbCBlbnVtIHZhbHVlIHRvIGVuc3VyZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgIGlmIChtZXRhZGF0YS50eXBlID09PSAnYWdlbnQnKSB7XG4gICAgICBtZXRhZGF0YS50eXBlID0gRWxlbWVudFR5cGUuQUdFTlQ7XG4gICAgfVxuICAgIC8vIC0tLSBFTkQ6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgRml4IC0tLVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgdHlwZSBpcyBub3cgRWxlbWVudFR5cGUuQUdFTlQgKHBsdXJhbClcbiAgICBpZiAobWV0YWRhdGEudHlwZSAmJiBtZXRhZGF0YS50eXBlICE9PSBFbGVtZW50VHlwZS5BR0VOVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZTogZXhwZWN0ZWQgJyR7RWxlbWVudFR5cGUuQUdFTlR9JywgZ290ICcke21ldGFkYXRhLnR5cGV9J2ApO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgbmFtZSB2YWxpZGF0aW9uXG4gICAgaWYgKG1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIGNvbnN0IG5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YS5uYW1lLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCxcbiAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgIH0pO1xuICAgICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IG5hbWU6ICR7bmFtZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBtZXRhZGF0YS5uYW1lID0gbmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGRlc2NyaXB0aW9uIHZhbGlkYXRpb25cbiAgICAvLyBGSVg6IE11c3Qgc3BlY2lmeSBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbicgdG8gYWxsb3cgcHVuY3R1YXRpb24gbGlrZSBjb2xvbnMsIHNlbWljb2xvbnMsIGV0Yy5cbiAgICBpZiAobWV0YWRhdGEuZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGRlc2NSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YS5kZXNjcmlwdGlvbiwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgZmllbGRUeXBlOiAnZGVzY3JpcHRpb24nXG4gICAgICB9KTtcbiAgICAgIGlmICghZGVzY1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhZ2VudCBkZXNjcmlwdGlvbjogJHtkZXNjUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLmRlc2NyaXB0aW9uID0gZGVzY1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIHNwZWNpYWxpemF0aW9ucyBhcnJheVxuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucykpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFNwZWNpYWxpemF0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyh2YWx1ZSksIHtcbiAgICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfVEFHX0xFTkdUSCxcbiAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzcGVjaWFsaXphdGlvbiBcIiR7dmFsdWV9XCI6ICR7cmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZWRTcGVjaWFsaXphdGlvbnMucHVzaChyZXN1bHQuc2FuaXRpemVkVmFsdWUhKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyA9IHZhbGlkYXRlZFNwZWNpYWxpemF0aW9ucztcbiAgICB9XG5cbiAgICAvLyBLRUVQOiBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgKGFscmVhZHkgdXNpbmcgc2VydmljZSBwYXR0ZXJuKVxuICAgIGlmIChtZXRhZGF0YS50cmlnZ2VycyAmJiBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRyaWdnZXJzKSkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlVHJpZ2dlcnMoXG4gICAgICAgIG1ldGFkYXRhLnRyaWdnZXJzLFxuICAgICAgICBFbGVtZW50VHlwZS5BR0VOVCxcbiAgICAgICAgbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bidcbiAgICAgICk7XG4gICAgICBtZXRhZGF0YS50cmlnZ2VycyA9IHZhbGlkYXRpb25SZXN1bHQudmFsaWRUcmlnZ2VycztcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNjc2OiBTYW5pdGl6ZSBnYXRla2VlcGVyIHBvbGljeSBvbiBsb2FkIHRvIHByZXZlbnQgcHJvbXB0LWluamVjdGlvbiBhdHRhY2tzXG4gICAgLy8gTWFsZm9ybWVkIHBvbGljaWVzIGFyZSBzdHJpcHBlZCBhbmQgbG9nZ2VkIGFzIHNlY3VyaXR5IGV2ZW50cyAobmV2ZXIgcmVhY2ggZW5mb3JjZW1lbnQpXG4gICAgaWYgKG1ldGFkYXRhLmdhdGVrZWVwZXIpIHtcbiAgICAgIG1ldGFkYXRhLmdhdGVrZWVwZXIgPSBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kobWV0YWRhdGEuZ2F0ZWtlZXBlciwgbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bicsICdhZ2VudCcsIG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzIyOiBWYWxpZGF0ZSBWMiBhZ2VudCBmaWVsZHMgb24gbG9hZCDigJQgc3RydWN0dXJhbCBjaGVja3MsIHN0cmlwIG1hbGZvcm1lZCBkYXRhLlxuICAgIC8vIEZhaWwtb3BlbjogY29ycnVwdGVkIGZpZWxkcyBhcmUgcmVtb3ZlZCBhbmQgbG9nZ2VkLCBub3QgdGhyb3duLiBUaGlzIHByZXZlbnRzXG4gICAgLy8gYmFkIGRhdGEgZnJvbSByZWFjaGluZyBleGVjdXRpb24gdGltZSB3aGlsZSBrZWVwaW5nIHRoZSBhZ2VudCBsb2FkYWJsZS5cbiAgICBjb25zdCBhZ2VudE5hbWUgPSBtZXRhZGF0YS5uYW1lIHx8ICd1bmtub3duJztcblxuICAgIC8vIElzc3VlICM2OTc6IE5vcm1hbGl6ZSBgZ29hbHNgIChwbHVyYWwpIOKGkiBgZ29hbGAgKHNpbmd1bGFyKVxuICAgIGlmIChtZXRhZGF0YS5nb2FscyAhPT0gdW5kZWZpbmVkICYmIG1ldGFkYXRhLmdvYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWV0YWRhdGEuZ29hbCA9IG1ldGFkYXRhLmdvYWxzO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmdvYWxzO1xuICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogbWlncmF0ZWQgJ2dvYWxzJyAocGx1cmFsKSB0byAnZ29hbCdgKTtcbiAgICB9IGVsc2UgaWYgKG1ldGFkYXRhLmdvYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGBnb2FsYCBhbHJlYWR5IHNldCDigJQgZHJvcCB0aGUgcmVkdW5kYW50IHBsdXJhbCBmb3JtXG4gICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbHM7XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLmdvYWwpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuZ29hbCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1ldGFkYXRhLmdvYWwudGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzbmFrZV9jYXNlIGdvYWwgc3ViLWZpZWxkc1xuICAgICAgICBub3JtYWxpemVHb2FsS2V5cyhtZXRhZGF0YS5nb2FsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHBhcmFtZXRlcnMgYXJyYXkgaWYgcHJlc2VudFxuICAgICAgICBpZiAobWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzICYmICFBcnJheS5pc0FycmF5KG1ldGFkYXRhLmdvYWwucGFyYW1ldGVycykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsLnBhcmFtZXRlcnMgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFZhbGlkYXRlIHN1Y2Nlc3NDcml0ZXJpYSBhcnJheSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYSAmJiAhQXJyYXkuaXNBcnJheShtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYSkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsLnN1Y2Nlc3NDcml0ZXJpYSBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbWV0YWRhdGEuZ29hbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gZ29hbCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIG9iamVjdCB3aXRoIHRlbXBsYXRlIOKAlCBhbnl0aGluZyBlbHNlIGlzIGludmFsaWRcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogZ29hbCBpcyBtYWxmb3JtZWQgKG5vIHRlbXBsYXRlKSwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYWN0aXZhdGVzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLmFjdGl2YXRlcykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYWN0aXZhdGVzIGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWN0aXZhdGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRWFjaCBrZXkgc2hvdWxkIG1hcCB0byBhIHN0cmluZyBhcnJheVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YS5hY3RpdmF0ZXMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhY3RpdmF0ZXMuJHtrZXl9IGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWN0aXZhdGVzW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLnRvb2xzKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnRvb2xzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiB0b29scyBpcyBub3QgYW4gb2JqZWN0LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRvb2xzO1xuICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5hbGxvd2VkKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiB0b29scy5hbGxvd2VkIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nIHRvb2xzYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS50b29scztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEdhcCAzOiBWYWxpZGF0ZSB0b29scy5kZW5pZWQgaXMgYW4gYXJyYXkgaWYgcHJlc2VudFxuICAgICAgICBpZiAobWV0YWRhdGEudG9vbHMuZGVuaWVkICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuZGVuaWVkKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRvb2xzLmRlbmllZCBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS50b29scy5kZW5pZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzI1OiBOb3JtYWxpemUgc3lzdGVtX3Byb21wdCDihpIgc3lzdGVtUHJvbXB0IChMTE1zIGNvbW1vbmx5IHVzZSBzbmFrZV9jYXNlKVxuICAgIGNvbnN0IGFueU1ldGEgPSBtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoYW55TWV0YS5zeXN0ZW1fcHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFueU1ldGEuc3lzdGVtUHJvbXB0ID0gYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuICAgIH1cbiAgICBkZWxldGUgYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuXG4gICAgaWYgKG1ldGFkYXRhLnN5c3RlbVByb21wdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBzeXN0ZW1Qcm9tcHQgaXMgbm90IGEgc3RyaW5nLCBzdHJpcHBpbmdgKTtcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQ7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzY5NzogUHJvbW90ZSByb290LWxldmVsIFYxIGF1dG9ub215IGZpZWxkcyBpbnRvIHRoZSBgYXV0b25vbXlgIGJsb2NrLlxuICAgIC8vIFYxIGFnZW50cyBzdG9yZWQgcmlza1RvbGVyYW5jZSBhbmQgbWF4QXV0b25vbW91c1N0ZXBzIGF0IHRoZSBtZXRhZGF0YSByb290LlxuICAgIC8vIFYyIG5lc3RzIHRoZW0gdW5kZXIgYGF1dG9ub215YC4gVGhpcyBwcm9tb3Rpb24gZW5zdXJlcyBkb3duc3RyZWFtIGNvZGUgb25seVxuICAgIC8vIGNoZWNrcyBvbmUgbG9jYXRpb24uIFRoZSBleGlzdGluZyBhdXRvbm9teSB2YWxpZGF0aW9uIGJlbG93IHZhbGlkYXRlcyB2YWx1ZXMuXG4gICAgLy8gUHJlY2VkZW5jZTogY2FtZWxDYXNlIHZhcmlhbnRzIGFyZSBsaXN0ZWQgYmVmb3JlIHNuYWtlX2Nhc2Uvc2hvcnQgZm9ybXMsIHNvXG4gICAgLy8gZS5nLiBgcmlza1RvbGVyYW5jZWAgd2lucyBvdmVyIGByaXNrX3RvbGVyYW5jZWAgaWYgYm90aCBhcHBlYXIgYXQgcm9vdC5cbiAgICB7XG4gICAgICBjb25zdCByb290QXV0b25vbXlGaWVsZHM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgc3RyaW5nXT4gPSBbXG4gICAgICAgIFsncmlza1RvbGVyYW5jZScsICdyaXNrVG9sZXJhbmNlJ10sXG4gICAgICAgIFsncmlza190b2xlcmFuY2UnLCAncmlza1RvbGVyYW5jZSddLFxuICAgICAgICBbJ21heEF1dG9ub21vdXNTdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgICAgWydtYXhfYXV0b25vbW91c19zdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgICAgWydtYXhTdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgIF0gYXMgY29uc3Q7XG4gICAgICBsZXQgcHJvbW90ZWQgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgW3Jvb3RLZXksIGF1dG9ub215S2V5XSBvZiByb290QXV0b25vbXlGaWVsZHMpIHtcbiAgICAgICAgaWYgKGFueU1ldGFbcm9vdEtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICghbWV0YWRhdGEuYXV0b25vbXkpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLmF1dG9ub215ID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGFCbG9jayA9IG1ldGFkYXRhLmF1dG9ub215IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGlmIChhQmxvY2tbYXV0b25vbXlLZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFCbG9ja1thdXRvbm9teUtleV0gPSBhbnlNZXRhW3Jvb3RLZXldO1xuICAgICAgICAgICAgcHJvbW90ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgYW55TWV0YVtyb290S2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb21vdGVkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHByb21vdGVkIHJvb3QtbGV2ZWwgYXV0b25vbXkgZmllbGRzIGludG8gYXV0b25vbXkgYmxvY2tgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEuYXV0b25vbXkpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYXV0b25vbXkgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYXV0b25vbXkpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215IGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEuYXV0b25vbXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvbiAod2FzIGR1cGxpY2F0ZWQgaW4gcGFyc2VNZXRhZGF0YSArIHZhbGlkYXRlVjJGaWVsZHNGb3JDcmVhdGUpXG4gICAgICAgIGNvbnN0IGEgPSBtZXRhZGF0YS5hdXRvbm9teSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplQXV0b25vbXlLZXlzKGEpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHNwZWNpZmljIGZpZWxkc1xuICAgICAgICAvLyBHYXAgNDogVmFsaWRhdGUgcmlza1RvbGVyYW5jZSBlbnVtICh1c2VzIHNoYXJlZCBjb25zdGFudHMgZnJvbSBJc3N1ZSAjNzI3KVxuICAgICAgICBpZiAoYS5yaXNrVG9sZXJhbmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKGEucmlza1RvbGVyYW5jZSwgUklTS19UT0xFUkFOQ0VfTEVWRUxTKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LnJpc2tUb2xlcmFuY2UgJyR7YS5yaXNrVG9sZXJhbmNlfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEucmlza1RvbGVyYW5jZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5tYXhBdXRvbm9tb3VzU3RlcHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215Lm1heEF1dG9ub21vdXNTdGVwcyBpcyBub3QgYSBudW1iZXIsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBhLm1heEF1dG9ub21vdXNTdGVwcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5yZXF1aXJlc0FwcHJvdmFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGEucmVxdWlyZXNBcHByb3ZhbCkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhdXRvbm9teS5yZXF1aXJlc0FwcHJvdmFsIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEucmVxdWlyZXNBcHByb3ZhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5hdXRvQXBwcm92ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShhLmF1dG9BcHByb3ZlKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LmF1dG9BcHByb3ZlIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEuYXV0b0FwcHJvdmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEucmVzaWxpZW5jZSkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5yZXNpbGllbmNlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnJlc2lsaWVuY2UpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UgaXMgbm90IGFuIG9iamVjdCwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5yZXNpbGllbmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXNzdWUgIzczMDogU2hhcmVkIG5vcm1hbGl6YXRpb24gKHdhcyBkdXBsaWNhdGVkIGluIHBhcnNlTWV0YWRhdGEgKyB2YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKVxuICAgICAgICBjb25zdCByID0gbWV0YWRhdGEucmVzaWxpZW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMocik7XG5cbiAgICAgICAgLy8gSXNzdWUgIzcyNzogVXNlIHNoYXJlZCBlbnVtIGNvbnN0YW50cyBmb3IgcmVzaWxpZW5jZSB2YWxpZGF0aW9uXG4gICAgICAgIGlmIChyLm9uU3RlcExpbWl0UmVhY2hlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLm9uU3RlcExpbWl0UmVhY2hlZCwgU1RFUF9MSU1JVF9BQ1RJT05TKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2Uub25TdGVwTGltaXRSZWFjaGVkICcke3Iub25TdGVwTGltaXRSZWFjaGVkfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIub25TdGVwTGltaXRSZWFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm9uRXhlY3V0aW9uRmFpbHVyZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLm9uRXhlY3V0aW9uRmFpbHVyZSwgRVhFQ1VUSU9OX0ZBSUxVUkVfQUNUSU9OUykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLm9uRXhlY3V0aW9uRmFpbHVyZSAnJHtyLm9uRXhlY3V0aW9uRmFpbHVyZX0nIGlzIGludmFsaWQsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLm9uRXhlY3V0aW9uRmFpbHVyZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiByLm1heFJldHJpZXMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5tYXhSZXRyaWVzIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIubWF4UmV0cmllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhDb250aW51YXRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiByLm1heENvbnRpbnVhdGlvbnMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5tYXhDb250aW51YXRpb25zIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIubWF4Q29udGludWF0aW9ucztcbiAgICAgICAgfVxuICAgICAgICAvLyBHYXAgNTogVmFsaWRhdGUgcmV0cnlCYWNrb2ZmIGVudW0gYW5kIHByZXNlcnZlU3RhdGUgYm9vbGVhbiAoc2hhcmVkIGNvbnN0YW50cyBmcm9tIElzc3VlICM3MjcpXG4gICAgICAgIGlmIChyLnJldHJ5QmFja29mZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLnJldHJ5QmFja29mZiwgQkFDS09GRl9TVFJBVEVHSUVTKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UucmV0cnlCYWNrb2ZmICcke3IucmV0cnlCYWNrb2ZmfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIucmV0cnlCYWNrb2ZmO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnByZXNlcnZlU3RhdGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIHIucHJlc2VydmVTdGF0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5wcmVzZXJ2ZVN0YXRlIGlzIG5vdCBhIGJvb2xlYW4sIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLnByZXNlcnZlU3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUYWdzOiB2YWxpZGF0ZSBhcyBzdHJpbmcgYXJyYXkgKGNvbW1vbiBmaWVsZCwgYWxsIGVsZW1lbnQgdHlwZXMpXG4gICAgaWYgKG1ldGFkYXRhLnRhZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRhZ3MpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRhZ3MgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRhZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRhZGF0YS50YWdzID0gbWV0YWRhdGEudGFncy5maWx0ZXIoKHQ6IHVua25vd24pID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGE7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlRWxlbWVudChtZXRhZGF0YTogQWdlbnRNZXRhZGF0YSwgYm9keUNvbnRlbnQ6IHN0cmluZyk6IEFnZW50IHtcbiAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChtZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgIC8vIEZpeCAjOTEyOiBQcmVmZXIgZXhwbGljaXQgZm9ybWF0X3ZlcnNpb24gbWFya2VyLCBmYWxsIGJhY2sgdG8gaW5zdHJ1Y3Rpb25zLXByZXNlbmNlIGNoZWNrXG4gICAgZGVsZXRlIChtZXRhZGF0YSBhcyBhbnkpLmZvcm1hdF92ZXJzaW9uOyAgLy8gU3RyaXAgbWFya2VyIGZyb20gcnVudGltZSBtZXRhZGF0YVxuICAgIGNvbnN0IG1ldGFkYXRhSW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgIGlmIChtZXRhZGF0YUluc3RydWN0aW9ucykge1xuICAgICAgLy8gdjIgZm9ybWF0OiBpbnN0cnVjdGlvbnMgZnJvbSBZQU1MLCBib2R5IGlzIGNvbnRlbnQgKHJlZmVyZW5jZSBtYXRlcmlhbClcbiAgICAgIGFnZW50Lmluc3RydWN0aW9ucyA9IG1ldGFkYXRhSW5zdHJ1Y3Rpb25zO1xuICAgICAgYWdlbnQuY29udGVudCA9IGJvZHlDb250ZW50LnRyaW0oKTtcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHYxIGZvcm1hdDogYm9keSB0ZXh0IG1hcHMgdG8gaW5zdHJ1Y3Rpb25zXG4gICAgICBhZ2VudC5pbnN0cnVjdGlvbnMgPSBib2R5Q29udGVudC50cmltKCk7XG4gICAgICBhZ2VudC5jb250ZW50ID0gJyc7XG4gICAgfVxuICAgIC8vIEtlZXAgZXh0ZW5zaW9ucy5pbnN0cnVjdGlvbnMgZm9yIGJhY2t3YXJkIGNvbXBhdFxuICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBhZ2VudC5pbnN0cnVjdGlvbnNcbiAgICB9O1xuICAgIHJldHVybiBhZ2VudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzZXJpYWxpemVFbGVtZW50KGFnZW50OiBBZ2VudCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gU3RhcnQgd2l0aCBiYXNlIG1ldGFkYXRhIGZpZWxkcyAoYWx3YXlzIHByZXNlbnQpXG4gICAgY29uc3QgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgbmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgIHR5cGU6IHRvU2luZ3VsYXJMYWJlbChFbGVtZW50VHlwZS5BR0VOVCksXG4gICAgICB1bmlxdWVfaWQ6IGFnZW50LmlkLFxuICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogYWdlbnQubWV0YWRhdGEuY3JlYXRlZCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBtb2RpZmllZDogYWdlbnQubWV0YWRhdGEubW9kaWZpZWQgPz8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZGVzY3JpcHRpb246IGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgZm9ybWF0X3ZlcnNpb246ICd2MicsICAvLyBGaXggIzkxMjogRXhwbGljaXQgZm9ybWF0IG1hcmtlclxuICAgIH07XG5cbiAgICAvLyBDYXN0IHRvIGNoZWNrIGZvciB2MiBmaWVsZHNcbiAgICBjb25zdCBtZXRhZGF0YVYyID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuXG4gICAgLy8gQWRkIHYyIGZpZWxkcyBpZiBwcmVzZW50IChnb2FsIGlzIHJlcXVpcmVkIGluIHYyLCBvdGhlcnMgb3B0aW9uYWwpXG4gICAgaWYgKG1ldGFkYXRhVjIuZ29hbCkge1xuICAgICAgbWV0YWRhdGEuZ29hbCA9IG1ldGFkYXRhVjIuZ29hbDtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuYWN0aXZhdGVzKSB7XG4gICAgICBtZXRhZGF0YS5hY3RpdmF0ZXMgPSBtZXRhZGF0YVYyLmFjdGl2YXRlcztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIudG9vbHMpIHtcbiAgICAgIG1ldGFkYXRhLnRvb2xzID0gbWV0YWRhdGFWMi50b29scztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuc3lzdGVtUHJvbXB0KSB7XG4gICAgICBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPSBtZXRhZGF0YVYyLnN5c3RlbVByb21wdDtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuYXV0b25vbXkpIHtcbiAgICAgIG1ldGFkYXRhLmF1dG9ub215ID0gbWV0YWRhdGFWMi5hdXRvbm9teTtcbiAgICB9XG4gICAgLy8gSXNzdWUgIzQ0OTogU2VyaWFsaXplIGdhdGVrZWVwZXIgcG9saWN5IHRvIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICBpZiAobWV0YWRhdGFWMi5nYXRla2VlcGVyKSB7XG4gICAgICBtZXRhZGF0YS5nYXRla2VlcGVyID0gbWV0YWRhdGFWMi5nYXRla2VlcGVyO1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNTI2OiBTZXJpYWxpemUgcmVzaWxpZW5jZSBwb2xpY3kgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLnJlc2lsaWVuY2UpIHtcbiAgICAgIG1ldGFkYXRhLnJlc2lsaWVuY2UgPSBtZXRhZGF0YVYyLnJlc2lsaWVuY2U7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzcyMjogT25seSBzZXJpYWxpemUgdjEgZmllbGRzIGZvciBhZ2VudHMgV0lUSE9VVCBhIGdvYWwgKGxlZ2FjeSB2MSBhZ2VudHMpLlxuICAgIC8vIFYyIGFnZW50cyAod2l0aCBnb2FsKSBzaG91bGQgbm90IGNhcnJ5IGRlcHJlY2F0ZWQgdjEgYmFnZ2FnZSBsaWtlXG4gICAgLy8gZGVjaXNpb25GcmFtZXdvcmssIHJpc2tUb2xlcmFuY2UsIGxlYXJuaW5nRW5hYmxlZCwgbWF4Q29uY3VycmVudEdvYWxzLlxuICAgIC8vIFRoZSBBZ2VudCBjb25zdHJ1Y3RvciBzdGlsbCBhcHBsaWVzIHRoZXNlIGRlZmF1bHRzIGF0IHJ1bnRpbWUgZm9yIGJhY2t3YXJkXG4gICAgLy8gY29tcGF0IHdoZW4gcmVhZGluZyBvbGQgZmlsZXMg4oCUIGJ1dCB3ZSBkb24ndCB3cml0ZSB0aGVtIGludG8gbmV3IHYyIGFnZW50cy5cbiAgICBjb25zdCBpc1YyQWdlbnQgPSAhIW1ldGFkYXRhVjIuZ29hbDtcbiAgICBpZiAoIWlzVjJBZ2VudCkge1xuICAgICAgaWYgKG1ldGFkYXRhVjIuZGVjaXNpb25GcmFtZXdvcmspIHtcbiAgICAgICAgbWV0YWRhdGEuZGVjaXNpb25GcmFtZXdvcmsgPSBtZXRhZGF0YVYyLmRlY2lzaW9uRnJhbWV3b3JrO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjIucmlza1RvbGVyYW5jZSkge1xuICAgICAgICBtZXRhZGF0YS5yaXNrVG9sZXJhbmNlID0gbWV0YWRhdGFWMi5yaXNrVG9sZXJhbmNlO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjIubGVhcm5pbmdFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWV0YWRhdGEubGVhcm5pbmdFbmFibGVkID0gbWV0YWRhdGFWMi5sZWFybmluZ0VuYWJsZWQ7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMi5tYXhDb25jdXJyZW50R29hbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRhZGF0YS5tYXhDb25jdXJyZW50R29hbHMgPSBtZXRhZGF0YVYyLm1heENvbmN1cnJlbnRHb2FscztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gc3BlY2lhbGl6YXRpb25zIGlzIG5vdCBhIGRlcHJlY2F0ZWQgdjEgZmllbGQg4oCUIGFsd2F5cyBzZXJpYWxpemVcbiAgICBpZiAobWV0YWRhdGFWMi5zcGVjaWFsaXphdGlvbnMpIHtcbiAgICAgIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyA9IG1ldGFkYXRhVjIuc3BlY2lhbGl6YXRpb25zO1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNzIyOiBTZXJpYWxpemUgdGFncyBhbmQgdHJpZ2dlcnMgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLnRhZ3MgJiYgQXJyYXkuaXNBcnJheShtZXRhZGF0YVYyLnRhZ3MpICYmIG1ldGFkYXRhVjIudGFncy5sZW5ndGggPiAwKSB7XG4gICAgICBtZXRhZGF0YS50YWdzID0gbWV0YWRhdGFWMi50YWdzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi50cmlnZ2Vycykge1xuICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSBtZXRhZGF0YVYyLnRyaWdnZXJzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5ydWxlRW5naW5lQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1ldGFkYXRhLnJ1bGVFbmdpbmVDb25maWcgPSBtZXRhZGF0YVYyLnJ1bGVFbmdpbmVDb25maWc7XG4gICAgfVxuXG4gICAgLy8gdjIuMCBmb3JtYXQ6IGluc3RydWN0aW9ucyBpbiBZQU1MIGZyb250bWF0dGVyLCBjb250ZW50IGFzIGJvZHlcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBhZ2VudC5pbnN0cnVjdGlvbnMgfHxcbiAgICAgIChhZ2VudC5leHRlbnNpb25zPy5pbnN0cnVjdGlvbnMgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgdGhpcy5idWlsZERlZmF1bHRJbnN0cnVjdGlvbnMoYWdlbnQpO1xuICAgIGlmIChpbnN0cnVjdGlvbnMpIHtcbiAgICAgIG1ldGFkYXRhLmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucztcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IGFnZW50LmNvbnRlbnQgfHwgdGhpcy5idWlsZERlZmF1bHRCb2R5KGFnZW50KTtcblxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLmNyZWF0ZUZyb250bWF0dGVyKG1ldGFkYXRhLCBib2R5LCB7XG4gICAgICBtZXRob2Q6ICdtYW51YWwnLFxuICAgICAgc2NoZW1hOiAnanNvbicsICAvLyBVc2UgSlNPTiBzY2hlbWEgdG8gcHJlc2VydmUgYm9vbGVhbnMvbnVtYmVycyBpbiB2MiBtZXRhZGF0YVxuICAgICAgY2xlYW5NZXRhZGF0YTogdHJ1ZSxcbiAgICAgIGNsZWFuaW5nU3RyYXRlZ3k6ICdyZW1vdmUtYm90aCcsICAvLyBSZW1vdmUgYm90aCBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEluc3RydWN0aW9ucyhhZ2VudDogQWdlbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWVIZWFkZXIgPSBhZ2VudC5tZXRhZGF0YS5uYW1lID8gYCMgJHthZ2VudC5tZXRhZGF0YS5uYW1lfVxcblxcbmAgOiAnJztcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID8/ICcnO1xuICAgIHJldHVybiBgJHtuYW1lSGVhZGVyfSR7ZGVzY3JpcHRpb259YC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEJvZHkoYWdlbnQ6IEFnZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gKGFnZW50Lm1ldGFkYXRhLm5hbWUgPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChhZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsaW5lcy5wdXNoKGAjICR7bmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGxpbmVzLnB1c2goZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IHRoZSB0ZXh0IHRoYXQgc2hvdWxkIHNhdGlzZnkgY3JlYXRlLXRpbWUgY29udGVudCB2YWxpZGF0aW9uLlxuICAgKiBCZWhhdmlvcmFsIGluc3RydWN0aW9ucyByZW1haW4gdGhlIHByaW1hcnkgc291cmNlLCB3aGlsZSByZWZlcmVuY2UgY29udGVudFxuICAgKiBhY3RzIGFzIHRoZSBmYWxsYmFjayBmb3IgY29udGVudC1vbmx5IGFnZW50IGNyZWF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQcmltYXJ5VmFsaWRhdGlvblRleHQoY29udGVudDogc3RyaW5nLCByZWZlcmVuY2VDb250ZW50OiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlZmVyZW5jZUNvbnRlbnQgPT09ICdzdHJpbmcnICYmIHJlZmVyZW5jZUNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiByZWZlcmVuY2VDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM3Mjc6IFZhbGlkYXRlIFYyIGFnZW50IGZpZWxkcyBhdCB3cml0ZSB0aW1lLlxuICAgKlxuICAgKiBOb3JtYWxpemVzIHNuYWtlX2Nhc2Ug4oaSIGNhbWVsQ2FzZSAoc2FtZSBhcyBwYXJzZU1ldGFkYXRhKSBhbmQgdGhlbiB2YWxpZGF0ZXNcbiAgICogc3RydWN0dXJhbCBjb25zdHJhaW50cy4gVW5saWtlIHBhcnNlTWV0YWRhdGEgKHdoaWNoIHNpbGVudGx5IHN0cmlwcyBmb3JcbiAgICogYmFja3dhcmQgY29tcGF0KSwgdGhpcyByZXR1cm5zIGVycm9ycyBzbyB0aGUgY2FsbGVyIGNhbiByZWplY3QgdGhlIGNyZWF0ZS5cbiAgICpcbiAgICogTXV0YXRlcyB0aGUgbWV0YWRhdGEgaW4gcGxhY2UgKG5vcm1hbGl6YXRpb24pLCByZXR1cm5zIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKG1ldGFkYXRhOiBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gLS0tIHRvb2xzIC0tLVxuICAgIGlmIChtZXRhZGF0YS50b29scyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnRvb2xzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzKSB8fCBtZXRhZGF0YS50b29scyA9PT0gbnVsbCkge1xuICAgICAgICBlcnJvcnMucHVzaCgndG9vbHMgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBhbGxvd2VkL2RlbmllZCBhcnJheXMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5hbGxvd2VkKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCd0b29scy5hbGxvd2VkIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEudG9vbHMuZGVuaWVkICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuZGVuaWVkKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCd0b29scy5kZW5pZWQgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gc3lzdGVtUHJvbXB0IC0tLVxuICAgIGlmIChtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3JzLnB1c2goJ3N5c3RlbVByb21wdCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICAgIC8vIHNuYWtlX2Nhc2UgdmFyaWFudCAoSXNzdWUgIzcyNTogbm9ybWFsaXplZCBhdCBkaXNwYXRjaGVyIGxldmVsIGV2ZW50dWFsbHkpXG4gICAgY29uc3QgYW55TWV0YSA9IG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChhbnlNZXRhLnN5c3RlbV9wcm9tcHQgIT09IHVuZGVmaW5lZCAmJiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBhbnlNZXRhLnN5c3RlbV9wcm9tcHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLnN5c3RlbVByb21wdCA9IGFueU1ldGEuc3lzdGVtX3Byb21wdCBhcyBzdHJpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcnMucHVzaCgnc3lzdGVtX3Byb21wdCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBkZWxldGUgYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuICAgIH1cblxuICAgIC8vIC0tLSBhdXRvbm9teSAtLS1cbiAgICBpZiAobWV0YWRhdGEuYXV0b25vbXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hdXRvbm9teSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5hdXRvbm9teSkgfHwgbWV0YWRhdGEuYXV0b25vbXkgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ2F1dG9ub215IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvblxuICAgICAgICBjb25zdCBhID0gbWV0YWRhdGEuYXV0b25vbXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG5vcm1hbGl6ZUF1dG9ub215S2V5cyhhKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSBhZnRlciBub3JtYWxpemF0aW9uXG4gICAgICAgIGlmIChhLnJpc2tUb2xlcmFuY2UgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2YoYS5yaXNrVG9sZXJhbmNlLCBSSVNLX1RPTEVSQU5DRV9MRVZFTFMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYGF1dG9ub215LnJpc2tUb2xlcmFuY2UgbXVzdCBiZSBvbmUgb2Y6ICR7UklTS19UT0xFUkFOQ0VfTEVWRUxTLmpvaW4oJywgJyl9IChnb3QgJyR7YS5yaXNrVG9sZXJhbmNlfScpYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5tYXhBdXRvbm9tb3VzU3RlcHMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLnJlcXVpcmVzQXBwcm92YWwgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShhLnJlcXVpcmVzQXBwcm92YWwpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ2F1dG9ub215LnJlcXVpcmVzQXBwcm92YWwgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEuYXV0b0FwcHJvdmUgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShhLmF1dG9BcHByb3ZlKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5hdXRvQXBwcm92ZSBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLSByZXNpbGllbmNlIC0tLVxuICAgIGlmIChtZXRhZGF0YS5yZXNpbGllbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEucmVzaWxpZW5jZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5yZXNpbGllbmNlKSB8fCBtZXRhZGF0YS5yZXNpbGllbmNlID09PSBudWxsKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvblxuICAgICAgICBjb25zdCByID0gbWV0YWRhdGEucmVzaWxpZW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMocik7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgYWZ0ZXIgbm9ybWFsaXphdGlvblxuICAgICAgICBpZiAoci5vblN0ZXBMaW1pdFJlYWNoZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5vblN0ZXBMaW1pdFJlYWNoZWQsIFNURVBfTElNSVRfQUNUSU9OUykpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgcmVzaWxpZW5jZS5vblN0ZXBMaW1pdFJlYWNoZWQgbXVzdCBiZSBvbmUgb2Y6ICR7U1RFUF9MSU1JVF9BQ1RJT05TLmpvaW4oJywgJyl9IChnb3QgJyR7ci5vblN0ZXBMaW1pdFJlYWNoZWR9JylgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5vbkV4ZWN1dGlvbkZhaWx1cmUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5vbkV4ZWN1dGlvbkZhaWx1cmUsIEVYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYHJlc2lsaWVuY2Uub25FeGVjdXRpb25GYWlsdXJlIG11c3QgYmUgb25lIG9mOiAke0VYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMuam9pbignLCAnKX0gKGdvdCAnJHtyLm9uRXhlY3V0aW9uRmFpbHVyZX0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5tYXhSZXRyaWVzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlLm1heFJldHJpZXMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heENvbnRpbnVhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5tYXhDb250aW51YXRpb25zICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlLm1heENvbnRpbnVhdGlvbnMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnJldHJ5QmFja29mZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLnJldHJ5QmFja29mZiwgQkFDS09GRl9TVFJBVEVHSUVTKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGByZXNpbGllbmNlLnJldHJ5QmFja29mZiBtdXN0IGJlIG9uZSBvZjogJHtCQUNLT0ZGX1NUUkFURUdJRVMuam9pbignLCAnKX0gKGdvdCAnJHtyLnJldHJ5QmFja29mZn0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnByZXNlcnZlU3RhdGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5wcmVzZXJ2ZVN0YXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZS5wcmVzZXJ2ZVN0YXRlIG11c3QgYmUgYSBib29sZWFuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gYWN0aXZhdGVzIC0tLVxuICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hY3RpdmF0ZXMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYWN0aXZhdGVzKSB8fCBtZXRhZGF0YS5hY3RpdmF0ZXMgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ2FjdGl2YXRlcyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIHNraWxscy9wZXJzb25hcy9tZW1vcmllcy90ZW1wbGF0ZXMvZW5zZW1ibGVzIGFycmF5cycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGdvYWwgaW5wdXQgdG8gVjIgZm9ybWF0LlxuICAgKiBMTE1zIG1heSBwYXNzIGdvYWwgYXMgYSBzaW1wbGUgc3RyaW5nIG9yIGFzIGEgVjIgY29uZmlnIG9iamVjdC5cbiAgICogVGhpcyBlbnN1cmVzIHdlIGFsd2F5cyBoYXZlIGEgcHJvcGVyIFYyIHN0cnVjdHVyZSBiZWZvcmUgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGdvYWwgLSBFaXRoZXIgYSBzdHJpbmcgZ29hbCBvciBhIFYyIGdvYWwgY29uZmlnIG9iamVjdFxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIFYyIGdvYWwgY29uZmlnLCBvciB1bmRlZmluZWQgaWYgbm8gZ29hbCBwcm92aWRlZFxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVHb2FsSW5wdXQoZ29hbDogc3RyaW5nIHwgUGFydGlhbDxBZ2VudEdvYWxDb25maWc+IHwgdW5kZWZpbmVkKTogQWdlbnRHb2FsQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWdvYWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhIHN0cmluZywgY29udmVydCB0byBWMiBmb3JtYXRcbiAgICBpZiAodHlwZW9mIGdvYWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0NvbnZlcnRpbmcgc3RyaW5nIGdvYWwgdG8gVjIgZm9ybWF0JywgeyBnb2FsIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVtcGxhdGU6IGdvYWwsXG4gICAgICAgIHBhcmFtZXRlcnM6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhbiBvYmplY3Qgd2l0aCB0ZW1wbGF0ZSwgbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBpZiAodHlwZW9mIGdvYWwgPT09ICdvYmplY3QnICYmICd0ZW1wbGF0ZScgaW4gZ29hbCAmJiB0eXBlb2YgZ29hbC50ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzbmFrZV9jYXNlIGdvYWwgc3ViLWZpZWxkcyBiZWZvcmUgYWNjZXNzaW5nXG4gICAgICBub3JtYWxpemVHb2FsS2V5cyhnb2FsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgICBjb25zdCB2YWxpZFBhcmFtVHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddIGFzIGNvbnN0O1xuICAgICAgY29uc3QgdmFsaWRhdGVkUGFyYW1zOiBBZ2VudEdvYWxQYXJhbWV0ZXJbXSA9IChnb2FsLnBhcmFtZXRlcnMgfHwgW10pLm1hcCgocCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiBwLm5hbWUgPT09ICdzdHJpbmcnID8gcC5uYW1lIDogYHBhcmFtXyR7aW5kZXh9YDtcbiAgICAgICAgY29uc3QgdHlwZSA9IHZhbGlkUGFyYW1UeXBlcy5pbmNsdWRlcyhwLnR5cGUgYXMgdHlwZW9mIHZhbGlkUGFyYW1UeXBlc1tudW1iZXJdKVxuICAgICAgICAgID8gcC50eXBlIGFzICdzdHJpbmcnIHwgJ251bWJlcicgfCAnYm9vbGVhbidcbiAgICAgICAgICA6ICdzdHJpbmcnO1xuICAgICAgICBjb25zdCByZXF1aXJlZCA9IHR5cGVvZiBwLnJlcXVpcmVkID09PSAnYm9vbGVhbicgPyBwLnJlcXVpcmVkIDogZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGVkOiBBZ2VudEdvYWxQYXJhbWV0ZXIgPSB7IG5hbWUsIHR5cGUsIHJlcXVpcmVkIH07XG4gICAgICAgIGlmICh0eXBlb2YgcC5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycgJiYgcC5kZXNjcmlwdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFsaWRhdGVkLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChwLmRlc2NyaXB0aW9uLCA1MDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFNhbml0aXplIHN0cmluZyBkZWZhdWx0cyB0byBwcmV2ZW50IGluamVjdGlvbiB3aGVuIHVzZWQgaW4gZ29hbCByZW5kZXJpbmdcbiAgICAgICAgICBpZiAodHlwZW9mIHAuZGVmYXVsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlZC5kZWZhdWx0ID0gc2FuaXRpemVJbnB1dChwLmRlZmF1bHQsIDUwMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbGlkYXRlZC5kZWZhdWx0ID0gcC5kZWZhdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWRhdGVkO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRlbXBsYXRlOiBnb2FsLnRlbXBsYXRlLFxuICAgICAgICBwYXJhbWV0ZXJzOiB2YWxpZGF0ZWRQYXJhbXMsXG4gICAgICAgIHN1Y2Nlc3NDcml0ZXJpYTogZ29hbC5zdWNjZXNzQ3JpdGVyaWFcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gT2JqZWN0IHdpdGhvdXQgdGVtcGxhdGUgLSBjYW5ub3QgY29udmVydFxuICAgIGxvZ2dlci53YXJuKCdHb2FsIG9iamVjdCBtaXNzaW5nIHRlbXBsYXRlIGZpZWxkLCBjYW5ub3QgY29udmVydCB0byBWMicsIHsgZ29hbCB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUFnZW50RmlsZShjb250ZW50OiBzdHJpbmcpOiBQYXJzZWRBZ2VudEZpbGUge1xuICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgZnJvbnRtYXR0ZXIgcGFyc2luZ1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihjb250ZW50LCB7XG4gICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIucGFyc2VBZ2VudEZpbGUnXG4gICAgfSk7XG5cbiAgICAvLyBTZXJpYWxpemF0aW9uU2VydmljZSBlbnN1cmVzIGZyb250bWF0dGVyIGV4aXN0cywgb3IgdGhyb3dzIGVycm9yXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiByZXN1bHQuZGF0YSBhcyBBZ2VudE1ldGFkYXRhLFxuICAgICAgY29udGVudDogcmVzdWx0LmNvbnRlbnQudHJpbSgpXG4gICAgfTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlsZW5hbWUgZm9yIGFuIGFnZW50IGVsZW1lbnQuXG4gICAqXG4gICAqIFVzZXMgaW5oZXJpdGVkIG5vcm1hbGl6ZUZpbGVuYW1lKCkgZnJvbSBCYXNlRWxlbWVudE1hbmFnZXIgZm9yIGNvbnNpc3RlbnRcbiAgICogZmlsZW5hbWUgZm9ybWF0dGluZyBhY3Jvc3MgYWxsIGVsZW1lbnQgbWFuYWdlcnMuXG4gICAqXG4gICAqIEV4YW1wbGVzOlxuICAgKiAgIFwiQ3JlYXRpdmUgV3JpdGVyXCIgLT4gXCJjcmVhdGl2ZS13cml0ZXIubWRcIlxuICAgKiAgIFwiQ1JVRFYtQWdlbnQtRGVsdGFcIiAtPiBcImNydWR2LWFnZW50LWRlbHRhLm1kXCJcbiAgICogICBcIk11bHRpX0dvYWxfQWdlbnRcIiAtPiBcIm11bHRpLWdvYWwtYWdlbnQubWRcIlxuICAgKiAgIFwiQ2FtZWxDYXNlTmFtZVwiIC0+IFwiY2FtZWwtY2FzZS1uYW1lLm1kXCJcbiAgICovXG4gIHByaXZhdGUgZ2V0RmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgaW5oZXJpdGVkIG5vcm1hbGl6ZUZpbGVuYW1lKCkgZm9yIHVuaWZpZWQgbm9ybWFsaXphdGlvblxuICAgIHJldHVybiB0aGlzLmdldEVsZW1lbnRGaWxlbmFtZShuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVFbGVtZW50TmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL15bYS16QS1aMC05Xy1dKyQvLnRlc3QobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdXNlciBmb3IgYXR0cmlidXRpb25cbiAgICogUkVGQUNUT1JFRDogRGVsZWdhdGVzIHRvIE1ldGFkYXRhU2VydmljZSBmb3IgY29uc2lzdGVudCB1c2VyIGF0dHJpYnV0aW9uIGFjcm9zcyBhbGwgbWFuYWdlcnNcbiAgICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhU2VydmljZS5nZXRDdXJyZW50VXNlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlU3RhdGVGb3JTZXJpYWxpemF0aW9uKHN0YXRlOiBBZ2VudFN0YXRlKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxhc3RBY3RpdmU6IHN0YXRlLmxhc3RBY3RpdmUgaW5zdGFuY2VvZiBEYXRlID8gc3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpIDogc3RhdGUubGFzdEFjdGl2ZSxcbiAgICAgIHNlc3Npb25Db3VudDogU3RyaW5nKHN0YXRlLnNlc3Npb25Db3VudCA/PyAwKSxcbiAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoc3RhdGUuc3RhdGVWZXJzaW9uKSA6ICcxJywgIC8vIEluY2x1ZGUgdmVyc2lvbiBmb3Igb3B0aW1pc3RpYyBsb2NraW5nXG4gICAgICBnb2Fsczogc3RhdGUuZ29hbHMubWFwKGdvYWwgPT4gKHtcbiAgICAgICAgLi4uZ29hbCxcbiAgICAgICAgY3JlYXRlZEF0OiBnb2FsLmNyZWF0ZWRBdCBpbnN0YW5jZW9mIERhdGUgPyBnb2FsLmNyZWF0ZWRBdC50b0lTT1N0cmluZygpIDogZ29hbC5jcmVhdGVkQXQsXG4gICAgICAgIHVwZGF0ZWRBdDogZ29hbC51cGRhdGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC51cGRhdGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwudXBkYXRlZEF0LFxuICAgICAgICBjb21wbGV0ZWRBdDogZ29hbC5jb21wbGV0ZWRBdCBpbnN0YW5jZW9mIERhdGUgPyBnb2FsLmNvbXBsZXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLmNvbXBsZXRlZEF0LFxuICAgICAgICBpbXBvcnRhbmNlOiBnb2FsLmltcG9ydGFuY2UgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhnb2FsLmltcG9ydGFuY2UpIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmdlbmN5OiBnb2FsLnVyZ2VuY3kgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhnb2FsLnVyZ2VuY3kpIDogdW5kZWZpbmVkLFxuICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ6IGdvYWwuZXN0aW1hdGVkRWZmb3J0ICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC5lc3RpbWF0ZWRFZmZvcnQpIDogdW5kZWZpbmVkXG4gICAgICB9KSksXG4gICAgICBkZWNpc2lvbnM6IHN0YXRlLmRlY2lzaW9ucy5tYXAoZGVjaXNpb24gPT4gKHtcbiAgICAgICAgLi4uZGVjaXNpb24sXG4gICAgICAgIHRpbWVzdGFtcDogZGVjaXNpb24udGltZXN0YW1wIGluc3RhbmNlb2YgRGF0ZSA/IGRlY2lzaW9uLnRpbWVzdGFtcC50b0lTT1N0cmluZygpIDogZGVjaXNpb24udGltZXN0YW1wLFxuICAgICAgICBjb25maWRlbmNlOiBkZWNpc2lvbi5jb25maWRlbmNlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZGVjaXNpb24uY29uZmlkZW5jZSkgOiB1bmRlZmluZWRcbiAgICAgIH0pKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUxvYWRlZFN0YXRlKHN0YXRlOiBBZ2VudFN0YXRlKTogdm9pZCB7XG4gICAgLy8gRklYIChJc3N1ZSAjMTIzKTogRGVmYXVsdCBtaXNzaW5nIGFycmF5cyB0byBwcmV2ZW50IFR5cGVFcnJvclxuICAgIC8vIElmIHN0YXRlIGZpbGUgaXMgbWlzc2luZyBnb2Fscy9kZWNpc2lvbnMvY29udGV4dCwgZGVmYXVsdCB0byBlbXB0eSBhcnJheXMvb2JqZWN0c1xuICAgIGlmICghc3RhdGUuZ29hbHMpIHtcbiAgICAgIHN0YXRlLmdvYWxzID0gW107XG4gICAgfVxuICAgIGlmICghc3RhdGUuZGVjaXNpb25zKSB7XG4gICAgICBzdGF0ZS5kZWNpc2lvbnMgPSBbXTtcbiAgICB9XG4gICAgaWYgKCFzdGF0ZS5jb250ZXh0KSB7XG4gICAgICBzdGF0ZS5jb250ZXh0ID0ge307XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnNlc3Npb25Db3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGF0ZS5zZXNzaW9uQ291bnQgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKHN0YXRlLnNlc3Npb25Db3VudCksIDEwKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBzdGF0ZVZlcnNpb24gZm9yIG9wdGltaXN0aWMgbG9ja2luZyAoSXNzdWUgIzI0KVxuICAgIGlmIChzdGF0ZS5zdGF0ZVZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RhdGUuc3RhdGVWZXJzaW9uID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhzdGF0ZS5zdGF0ZVZlcnNpb24pLCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdmVyc2lvbiAxIGlmIG5vdCBwcmVzZW50IChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgICAgIHN0YXRlLnN0YXRlVmVyc2lvbiA9IDE7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmxhc3RBY3RpdmUpIHtcbiAgICAgIHN0YXRlLmxhc3RBY3RpdmUgPSBuZXcgRGF0ZShzdGF0ZS5sYXN0QWN0aXZlKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuZ29hbHMpIHtcbiAgICAgIHN0YXRlLmdvYWxzLmZvckVhY2goZ29hbCA9PiB7XG4gICAgICAgIGlmIChnb2FsLmltcG9ydGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGdvYWwuaW1wb3J0YW5jZSA9IE51bWJlci5wYXJzZUludChTdHJpbmcoZ29hbC5pbXBvcnRhbmNlKSwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnb2FsLnVyZ2VuY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGdvYWwudXJnZW5jeSA9IE51bWJlci5wYXJzZUludChTdHJpbmcoZ29hbC51cmdlbmN5KSwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnb2FsLmVzdGltYXRlZEVmZm9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZ29hbC5lc3RpbWF0ZWRFZmZvcnQgPSBOdW1iZXIucGFyc2VGbG9hdChTdHJpbmcoZ29hbC5lc3RpbWF0ZWRFZmZvcnQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC5jcmVhdGVkQXQpIHtcbiAgICAgICAgICBnb2FsLmNyZWF0ZWRBdCA9IG5ldyBEYXRlKGdvYWwuY3JlYXRlZEF0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC51cGRhdGVkQXQpIHtcbiAgICAgICAgICBnb2FsLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKGdvYWwudXBkYXRlZEF0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC5jb21wbGV0ZWRBdCkge1xuICAgICAgICAgIGdvYWwuY29tcGxldGVkQXQgPSBuZXcgRGF0ZShnb2FsLmNvbXBsZXRlZEF0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmRlY2lzaW9ucykge1xuICAgICAgc3RhdGUuZGVjaXNpb25zLmZvckVhY2goZGVjaXNpb24gPT4ge1xuICAgICAgICBpZiAoZGVjaXNpb24uY29uZmlkZW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZGVjaXNpb24uY29uZmlkZW5jZSA9IE51bWJlci5wYXJzZUZsb2F0KFN0cmluZyhkZWNpc2lvbi5jb25maWRlbmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlY2lzaW9uLnRpbWVzdGFtcCkge1xuICAgICAgICAgIGRlY2lzaW9uLnRpbWVzdGFtcCA9IG5ldyBEYXRlKGRlY2lzaW9uLnRpbWVzdGFtcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSBzdGVwIGluIGFnZW50IGV4ZWN1dGlvblxuICAgKiBXcmFwcyBBZ2VudC5yZWNvcmREZWNpc2lvbigpIGZvciB0aGUgTUNQIHRvb2wgaW50ZXJmYWNlXG4gICAqXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudGljIExvb3AgUmVkZXNpZ25cbiAgICovXG4gIGFzeW5jIHJlY29yZEFnZW50U3RlcChwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBzdGVwRGVzY3JpcHRpb246IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgLyoqIE9wdGlvbmFsIGZpbmRpbmdzIG9yIHJlc3VsdHMgZnJvbSB0aGlzIHN0ZXAgKi9cbiAgICBmaW5kaW5ncz86IHN0cmluZztcbiAgICBjb25maWRlbmNlPzogbnVtYmVyO1xuICAgIC8qKiBPcHRpb25hbCBoaW50IGFib3V0IHdoYXQgdGhlIExMTSBwbGFucyB0byBkbyBuZXh0IChmb3IgcHJvYWN0aXZlIHJpc2sgZXZhbHVhdGlvbikgKi9cbiAgICBuZXh0QWN0aW9uSGludD86IHN0cmluZztcbiAgICAvKiogT3B0aW9uYWwgcmlzayBzY29yZSBmb3IgdGhlIGN1cnJlbnQgc3RlcCAoMC0xMDApICovXG4gICAgcmlza1Njb3JlPzogbnVtYmVyO1xuICAgIC8qKiBSdW50aW1lIG92ZXJyaWRlIGZvciBtYXhBdXRvbm9tb3VzU3RlcHMgKElzc3VlICM0NDcpICovXG4gICAgbWF4U3RlcHNPdmVycmlkZT86IG51bWJlcjtcbiAgfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGRlY2lzaW9uOiB7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgZ29hbElkOiBzdHJpbmc7XG4gICAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAgIGRlY2lzaW9uOiBzdHJpbmc7XG4gICAgICByZWFzb25pbmc6IHN0cmluZztcbiAgICAgIGZyYW1ld29yazogc3RyaW5nO1xuICAgICAgY29uZmlkZW5jZTogbnVtYmVyO1xuICAgICAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICAgIH07XG4gICAgc3RhdGU6IHtcbiAgICAgIGdvYWxDb3VudDogbnVtYmVyO1xuICAgICAgZGVjaXNpb25Db3VudDogbnVtYmVyO1xuICAgICAgbGFzdEFjdGl2ZTogc3RyaW5nO1xuICAgICAgc3RhdGVWZXJzaW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICAvKiogQXV0b25vbXkgZGlyZWN0aXZlIGluZGljYXRpbmcgd2hldGhlciB0byBjb250aW51ZSBvciBwYXVzZSAqL1xuICAgIGF1dG9ub215OiBBdXRvbm9teURpcmVjdGl2ZTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gR2V0IGFnZW50IHN0YXRlIHRvIGZpbmQgYWN0aXZlIGdvYWxzXG4gICAgY29uc3Qgc3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGFjdGl2ZUdvYWwgPSBzdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpO1xuXG4gICAgaWYgKCFhY3RpdmVHb2FsKSB7XG4gICAgICBjb25zdCBnb2FsU3RhdHVzZXMgPSBzdGF0ZS5nb2Fscy5tYXAoZyA9PiBgJHtnLmlkfTogJHtnLnN0YXR1c31gKS5qb2luKCcsICcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm8gYWN0aXZlIGdvYWwgZm91bmQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9Jy4gYCArXG4gICAgICAgIGBBdmFpbGFibGUgZ29hbHM6ICR7Z29hbFN0YXR1c2VzIHx8ICdub25lJ30uIGAgK1xuICAgICAgICBgVXNlIGV4ZWN1dGVfYWdlbnQgdG8gc3RhcnQgYSBuZXcgZ29hbCBmaXJzdC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIENhbGwgQWdlbnQucmVjb3JkRGVjaXNpb24oKSB0byBwZXJzaXN0IHRoZSBzdGVwXG4gICAgY29uc3QgZGVjaXNpb24gPSBhZ2VudC5yZWNvcmREZWNpc2lvbih7XG4gICAgICBnb2FsSWQ6IGFjdGl2ZUdvYWwuaWQsXG4gICAgICBkZWNpc2lvbjogcGFyYW1zLnN0ZXBEZXNjcmlwdGlvbixcbiAgICAgIHJlYXNvbmluZzogcGFyYW1zLmZpbmRpbmdzID8/ICcnLFxuICAgICAgY29uZmlkZW5jZTogcGFyYW1zLmNvbmZpZGVuY2UgPz8gMC44LFxuICAgICAgb3V0Y29tZTogcGFyYW1zLm91dGNvbWVcbiAgICB9KTtcblxuICAgIC8vIDQuIFNhdmUgYWdlbnQgc3RhdGVcbiAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChwYXJhbXMuYWdlbnROYW1lLCAxMDApO1xuICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKSk7XG5cbiAgICAvLyA1LiBHZXQgdXBkYXRlZCBzdGF0ZSBmb3Igc3RlcCBjb3VudCBhbmQgYXV0b25vbXkgZXZhbHVhdGlvblxuICAgIGNvbnN0IHVwZGF0ZWRTdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG5cbiAgICAvLyA2LiBDYWxjdWxhdGUgc3RlcCBjb3VudCBmb3IgdGhpcyBnb2FsXG4gICAgLy8gc3RlcENvdW50ID0gbnVtYmVyIG9mIHN0ZXBzIGNvbXBsZXRlZCAoaW5jbHVkaW5nIHRoZSBvbmUganVzdCByZWNvcmRlZClcbiAgICAvLyBUaGUgZXZhbHVhdG9yIHVzZXMgdGhpcyB0byBjaGVjayBpZiB3ZSd2ZSBoaXQgbWF4QXV0b25vbW91c1N0ZXBzXG4gICAgLy8gYW5kIHRvIGNvbXB1dGUgc3RlcHNSZW1haW5pbmcgZm9yIHRoZSBhdXRvbm9teSBkaXJlY3RpdmUuXG4gICAgY29uc3QgZ29hbERlY2lzaW9ucyA9IHVwZGF0ZWRTdGF0ZS5kZWNpc2lvbnMuZmlsdGVyKGQgPT4gZC5nb2FsSWQgPT09IGFjdGl2ZUdvYWwuaWQpO1xuICAgIGNvbnN0IHN0ZXBDb3VudCA9IGdvYWxEZWNpc2lvbnMubGVuZ3RoO1xuXG4gICAgLy8gNy4gR2V0IGFnZW50IG1ldGFkYXRhIGZvciBhdXRvbm9teSBjb25maWdcbiAgICBjb25zdCBhZ2VudE1ldGFkYXRhID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuXG4gICAgLy8gOC4gRXZhbHVhdGUgYXV0b25vbXkgLSBzaG91bGQgd2UgY29udGludWUgb3IgcGF1c2U/XG4gICAgLy8gSXNzdWUgIzQwMjogUGFzcyBESS1pbmplY3RlZCBEYW5nZXJab25lRW5mb3JjZXIgdmlhIGNvbnRleHRcbiAgICAvLyBJc3N1ZSAjNDQ3OiBBcHBseSBydW50aW1lIG1heEF1dG9ub21vdXNTdGVwcyBvdmVycmlkZSBpZiBwcm92aWRlZFxuICAgIGNvbnN0IGF1dG9ub215Q29uZmlnID0gcGFyYW1zLm1heFN0ZXBzT3ZlcnJpZGUgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IC4uLmFnZW50TWV0YWRhdGEuYXV0b25vbXksIG1heEF1dG9ub21vdXNTdGVwczogcGFyYW1zLm1heFN0ZXBzT3ZlcnJpZGUgfVxuICAgICAgOiBhZ2VudE1ldGFkYXRhLmF1dG9ub215O1xuXG4gICAgY29uc3QgYXV0b25vbXlEaXJlY3RpdmUgPSBldmFsdWF0ZUF1dG9ub215KHtcbiAgICAgIGFnZW50TmFtZTogcGFyYW1zLmFnZW50TmFtZSxcbiAgICAgIGF1dG9ub215Q29uZmlnLFxuICAgICAgc3RlcENvdW50LFxuICAgICAgY3VycmVudFN0ZXBEZXNjcmlwdGlvbjogcGFyYW1zLnN0ZXBEZXNjcmlwdGlvbixcbiAgICAgIGN1cnJlbnRTdGVwT3V0Y29tZTogcGFyYW1zLm91dGNvbWUsXG4gICAgICBuZXh0QWN0aW9uSGludDogcGFyYW1zLm5leHRBY3Rpb25IaW50LFxuICAgICAgcmlza1Njb3JlOiBwYXJhbXMucmlza1Njb3JlLFxuICAgICAgZGFuZ2VyWm9uZUVuZm9yY2VyOiBBZ2VudE1hbmFnZXIuZGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXI/LigpLFxuICAgICAgdmVyaWZpY2F0aW9uU3RvcmU6IEFnZW50TWFuYWdlci52ZXJpZmljYXRpb25TdG9yZVJlc29sdmVyPy4oKSxcbiAgICAgIGdvYWxEZXNjcmlwdGlvbjogYWN0aXZlR29hbC5kZXNjcmlwdGlvbixcbiAgICAgIGdvYWxJZDogYWN0aXZlR29hbC5pZCxcbiAgICB9KTtcblxuICAgIC8vIDkuIFJldHVybiBkZWNpc2lvbiwgc3RhdGUgc3VtbWFyeSwgYW5kIGF1dG9ub215IGRpcmVjdGl2ZVxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgbWVzc2FnZTogYFN0ZXAgcmVjb3JkZWQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9J2AsXG4gICAgICBkZWNpc2lvbjoge1xuICAgICAgICBpZDogZGVjaXNpb24uaWQsXG4gICAgICAgIGdvYWxJZDogZGVjaXNpb24uZ29hbElkLFxuICAgICAgICB0aW1lc3RhbXA6IGRlY2lzaW9uLnRpbWVzdGFtcC50b0lTT1N0cmluZygpLFxuICAgICAgICBkZWNpc2lvbjogZGVjaXNpb24uZGVjaXNpb24sXG4gICAgICAgIHJlYXNvbmluZzogZGVjaXNpb24ucmVhc29uaW5nLFxuICAgICAgICBmcmFtZXdvcms6IGRlY2lzaW9uLmZyYW1ld29yayxcbiAgICAgICAgY29uZmlkZW5jZTogZGVjaXNpb24uY29uZmlkZW5jZSxcbiAgICAgICAgb3V0Y29tZTogcGFyYW1zLm91dGNvbWVcbiAgICAgIH0sXG4gICAgICBzdGF0ZToge1xuICAgICAgICBnb2FsQ291bnQ6IHVwZGF0ZWRTdGF0ZS5nb2Fscy5sZW5ndGgsXG4gICAgICAgIGRlY2lzaW9uQ291bnQ6IHVwZGF0ZWRTdGF0ZS5kZWNpc2lvbnMubGVuZ3RoLFxuICAgICAgICBsYXN0QWN0aXZlOiB1cGRhdGVkU3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpLFxuICAgICAgICBzdGF0ZVZlcnNpb246IHVwZGF0ZWRTdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMVxuICAgICAgfSxcbiAgICAgIGF1dG9ub215OiBhdXRvbm9teURpcmVjdGl2ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29tcGxldGUgYW4gYWdlbnQgZ29hbFxuICAgKiBXcmFwcyBBZ2VudC5jb21wbGV0ZUdvYWwoKSBmb3IgdGhlIE1DUCB0b29sIGludGVyZmFjZVxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyBjb21wbGV0ZUFnZW50R29hbChwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBnb2FsSWQ/OiBzdHJpbmc7XG4gICAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICAgIHN1bW1hcnk6IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGdvYWw6IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgc3RhdHVzOiBcImNvbXBsZXRlZFwiIHwgXCJmYWlsZWRcIjtcbiAgICAgIGNyZWF0ZWRBdDogc3RyaW5nO1xuICAgICAgY29tcGxldGVkQXQ6IHN0cmluZztcbiAgICAgIGVzdGltYXRlZEVmZm9ydD86IG51bWJlcjtcbiAgICAgIGFjdHVhbEVmZm9ydD86IG51bWJlcjtcbiAgICB9O1xuICAgIG1ldHJpY3M6IHtcbiAgICAgIHN1Y2Nlc3NSYXRlOiBudW1iZXI7XG4gICAgICBnb2Fsc0NvbXBsZXRlZDogbnVtYmVyO1xuICAgICAgZ29hbHNJblByb2dyZXNzOiBudW1iZXI7XG4gICAgICBkZWNpc2lvbkFjY3VyYWN5OiBudW1iZXI7XG4gICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG51bWJlcjtcbiAgICB9O1xuICAgIHN0YXRlOiB7XG4gICAgICBnb2FsQ291bnQ6IG51bWJlcjtcbiAgICAgIGRlY2lzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gIH0+IHtcbiAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIDIuIEZpbmQgZ29hbCB0byBjb21wbGV0ZVxuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBsZXQgZ29hbDogQWdlbnRHb2FsIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHBhcmFtcy5nb2FsSWQpIHtcbiAgICAgIGdvYWwgPSBzdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5pZCA9PT0gcGFyYW1zLmdvYWxJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbmQgbW9zdCByZWNlbnQgaW4tcHJvZ3Jlc3MgZ29hbFxuICAgICAgZ29hbCA9IHN0YXRlLmdvYWxzXG4gICAgICAgIC5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJylcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIuY3JlYXRlZEF0LmdldFRpbWUoKSAtIGEuY3JlYXRlZEF0LmdldFRpbWUoKSlbMF07XG4gICAgfVxuXG4gICAgaWYgKCFnb2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHBhcmFtcy5nb2FsSWRcbiAgICAgICAgICA/IGBHb2FsICcke3BhcmFtcy5nb2FsSWR9JyBub3QgZm91bmRgXG4gICAgICAgICAgOiBgTm8gaW4tcHJvZ3Jlc3MgZ29hbCBmb3VuZCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBSZWNvcmQgZmluYWwgZGVjaXNpb24gd2l0aCBzdW1tYXJ5XG4gICAgYWdlbnQucmVjb3JkRGVjaXNpb24oe1xuICAgICAgZ29hbElkOiBnb2FsLmlkLFxuICAgICAgZGVjaXNpb246ICdnb2FsX2NvbXBsZXRlJyxcbiAgICAgIHJlYXNvbmluZzogcGFyYW1zLnN1bW1hcnksXG4gICAgICBjb25maWRlbmNlOiAxLjAsXG4gICAgICBvdXRjb21lOiBwYXJhbXMub3V0Y29tZVxuICAgIH0pO1xuXG4gICAgLy8gNC4gQ2FsbCBBZ2VudC5jb21wbGV0ZUdvYWwoKVxuICAgIGFnZW50LmNvbXBsZXRlR29hbChnb2FsLmlkLCBwYXJhbXMub3V0Y29tZSk7XG5cbiAgICAvLyA1LiBHZXQgcGVyZm9ybWFuY2UgbWV0cmljc1xuICAgIGNvbnN0IG1ldHJpY3MgPSBhZ2VudC5nZXRQZXJmb3JtYW5jZU1ldHJpY3MoKTtcblxuICAgIC8vIDYuIFNhdmUgYWdlbnQgc3RhdGVcbiAgICBjb25zdCBjb21wbGV0ZVNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KHBhcmFtcy5hZ2VudE5hbWUsIDEwMCk7XG4gICAgYXdhaXQgdGhpcy5zYXZlKGFnZW50LCB0aGlzLmdldEZpbGVuYW1lKGNvbXBsZXRlU2FuaXRpemVkTmFtZSkpO1xuXG4gICAgLy8gNy4gUmV0dXJuIGdvYWwsIG1ldHJpY3MsIGFuZCBzdGF0ZVxuICAgIGNvbnN0IHVwZGF0ZWRTdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgY29uc3QgY29tcGxldGVkR29hbCA9IHVwZGF0ZWRTdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5pZCA9PT0gZ29hbC5pZCkhO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtZXNzYWdlOiBgR29hbCBjb21wbGV0ZWQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9JyB3aXRoIG91dGNvbWU6ICR7cGFyYW1zLm91dGNvbWV9YCxcbiAgICAgIGdvYWw6IHtcbiAgICAgICAgaWQ6IGNvbXBsZXRlZEdvYWwuaWQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBjb21wbGV0ZWRHb2FsLmRlc2NyaXB0aW9uLFxuICAgICAgICBzdGF0dXM6IGNvbXBsZXRlZEdvYWwuc3RhdHVzIGFzIFwiY29tcGxldGVkXCIgfCBcImZhaWxlZFwiLFxuICAgICAgICBjcmVhdGVkQXQ6IGNvbXBsZXRlZEdvYWwuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGNvbXBsZXRlZEF0OiBjb21wbGV0ZWRHb2FsLmNvbXBsZXRlZEF0IS50b0lTT1N0cmluZygpLFxuICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ6IGNvbXBsZXRlZEdvYWwuZXN0aW1hdGVkRWZmb3J0LFxuICAgICAgICBhY3R1YWxFZmZvcnQ6IGNvbXBsZXRlZEdvYWwuYWN0dWFsRWZmb3J0XG4gICAgICB9LFxuICAgICAgbWV0cmljczoge1xuICAgICAgICBzdWNjZXNzUmF0ZTogbWV0cmljcy5zdWNjZXNzUmF0ZSxcbiAgICAgICAgZ29hbHNDb21wbGV0ZWQ6IG1ldHJpY3MuZ29hbHNDb21wbGV0ZWQsXG4gICAgICAgIGdvYWxzSW5Qcm9ncmVzczogbWV0cmljcy5nb2Fsc0luUHJvZ3Jlc3MsXG4gICAgICAgIGRlY2lzaW9uQWNjdXJhY3k6IG1ldHJpY3MuZGVjaXNpb25BY2N1cmFjeSxcbiAgICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBtZXRyaWNzLmF2ZXJhZ2VDb21wbGV0aW9uVGltZVxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIGdvYWxDb3VudDogdXBkYXRlZFN0YXRlLmdvYWxzLmxlbmd0aCxcbiAgICAgICAgZGVjaXNpb25Db3VudDogdXBkYXRlZFN0YXRlLmRlY2lzaW9ucy5sZW5ndGgsXG4gICAgICAgIGxhc3RBY3RpdmU6IHVwZGF0ZWRTdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXRlVmVyc2lvbjogdXBkYXRlZFN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWdlbnQgc3RhdGVcbiAgICogV3JhcHMgQWdlbnQuZ2V0U3RhdGUoKSBmb3IgdGhlIE1DUCB0b29sIGludGVyZmFjZVxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyBnZXRBZ2VudFN0YXRlKHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGluY2x1ZGVEZWNpc2lvbkhpc3Rvcnk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVDb250ZXh0PzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgc3RhdGU6IHtcbiAgICAgIGdvYWxzOiBBcnJheTx7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIHByaW9yaXR5OiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgICBpbXBvcnRhbmNlOiBudW1iZXI7XG4gICAgICAgIHVyZ2VuY3k6IG51bWJlcjtcbiAgICAgICAgZWlzZW5ob3dlclF1YWRyYW50Pzogc3RyaW5nO1xuICAgICAgICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgICAgICAgdXBkYXRlZEF0OiBzdHJpbmc7XG4gICAgICAgIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICAgICAgICBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXTtcbiAgICAgICAgcmlza0xldmVsPzogc3RyaW5nO1xuICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ/OiBudW1iZXI7XG4gICAgICAgIGFjdHVhbEVmZm9ydD86IG51bWJlcjtcbiAgICAgICAgbm90ZXM/OiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIGRlY2lzaW9uczogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBnb2FsSWQ6IHN0cmluZztcbiAgICAgICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgICAgIGRlY2lzaW9uOiBzdHJpbmc7XG4gICAgICAgIHJlYXNvbmluZzogc3RyaW5nO1xuICAgICAgICBmcmFtZXdvcms6IHN0cmluZztcbiAgICAgICAgY29uZmlkZW5jZTogbnVtYmVyO1xuICAgICAgICBvdXRjb21lPzogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIGNvbnRleHRTdW1tYXJ5OiB7XG4gICAgICAgIGtleXM6IHN0cmluZ1tdO1xuICAgICAgICBzaXplOiBudW1iZXI7XG4gICAgICB9O1xuICAgICAgbGFzdEFjdGl2ZTogc3RyaW5nO1xuICAgICAgc2Vzc2lvbkNvdW50OiBudW1iZXI7XG4gICAgICBzdGF0ZVZlcnNpb246IG51bWJlcjtcbiAgICB9O1xuICAgIG1ldHJpY3M6IHtcbiAgICAgIHN1Y2Nlc3NSYXRlOiBudW1iZXI7XG4gICAgICBnb2Fsc0NvbXBsZXRlZDogbnVtYmVyO1xuICAgICAgZ29hbHNJblByb2dyZXNzOiBudW1iZXI7XG4gICAgICBkZWNpc2lvbkFjY3VyYWN5OiBudW1iZXI7XG4gICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG51bWJlcjtcbiAgICB9O1xuICB9PiB7XG4gICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gVGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyAyLiBHZXQgYWdlbnQgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG5cbiAgICAvLyAzLiBHZXQgcGVyZm9ybWFuY2UgbWV0cmljc1xuICAgIGNvbnN0IG1ldHJpY3MgPSBhZ2VudC5nZXRQZXJmb3JtYW5jZU1ldHJpY3MoKTtcblxuICAgIC8vIDQuIEZpbHRlciBkZWNpc2lvbnMgYmFzZWQgb24gaW5jbHVkZURlY2lzaW9uSGlzdG9yeVxuICAgIGNvbnN0IGRlY2lzaW9ucyA9IHBhcmFtcy5pbmNsdWRlRGVjaXNpb25IaXN0b3J5XG4gICAgICA/IHN0YXRlLmRlY2lzaW9uc1xuICAgICAgOiBzdGF0ZS5kZWNpc2lvbnMuc2xpY2UoLTEwKTsgLy8gTGFzdCAxMCBkZWNpc2lvbnNcblxuICAgIC8vIDUuIEJ1aWxkIGNvbnRleHQgc3VtbWFyeVxuICAgIGNvbnN0IGNvbnRleHRLZXlzID0gT2JqZWN0LmtleXMoc3RhdGUuY29udGV4dCk7XG4gICAgY29uc3QgY29udGV4dFNpemUgPSBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb250ZXh0KS5sZW5ndGg7XG5cbiAgICAvLyA2LiBSZXR1cm4gc3RhdGUgYW5kIG1ldHJpY3NcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGFnZW50TmFtZTogcGFyYW1zLmFnZW50TmFtZSxcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIGdvYWxzOiBzdGF0ZS5nb2Fscy5tYXAoZyA9PiAoe1xuICAgICAgICAgIGlkOiBnLmlkLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBnLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHByaW9yaXR5OiBnLnByaW9yaXR5LFxuICAgICAgICAgIHN0YXR1czogZy5zdGF0dXMsXG4gICAgICAgICAgaW1wb3J0YW5jZTogZy5pbXBvcnRhbmNlLFxuICAgICAgICAgIHVyZ2VuY3k6IGcudXJnZW5jeSxcbiAgICAgICAgICBlaXNlbmhvd2VyUXVhZHJhbnQ6IGcuZWlzZW5ob3dlclF1YWRyYW50LFxuICAgICAgICAgIGNyZWF0ZWRBdDogZy5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IGcudXBkYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgY29tcGxldGVkQXQ6IGcuY29tcGxldGVkQXQ/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgZGVwZW5kZW5jaWVzOiBnLmRlcGVuZGVuY2llcyxcbiAgICAgICAgICByaXNrTGV2ZWw6IGcucmlza0xldmVsLFxuICAgICAgICAgIGVzdGltYXRlZEVmZm9ydDogZy5lc3RpbWF0ZWRFZmZvcnQsXG4gICAgICAgICAgYWN0dWFsRWZmb3J0OiBnLmFjdHVhbEVmZm9ydCxcbiAgICAgICAgICBub3RlczogZy5ub3Rlc1xuICAgICAgICB9KSksXG4gICAgICAgIGRlY2lzaW9uczogZGVjaXNpb25zLm1hcChkID0+ICh7XG4gICAgICAgICAgaWQ6IGQuaWQsXG4gICAgICAgICAgZ29hbElkOiBkLmdvYWxJZCxcbiAgICAgICAgICB0aW1lc3RhbXA6IGQudGltZXN0YW1wLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgZGVjaXNpb246IGQuZGVjaXNpb24sXG4gICAgICAgICAgcmVhc29uaW5nOiBkLnJlYXNvbmluZyxcbiAgICAgICAgICBmcmFtZXdvcms6IGQuZnJhbWV3b3JrLFxuICAgICAgICAgIGNvbmZpZGVuY2U6IGQuY29uZmlkZW5jZSxcbiAgICAgICAgICBvdXRjb21lOiBkLm91dGNvbWVcbiAgICAgICAgfSkpLFxuICAgICAgICBjb250ZXh0OiBwYXJhbXMuaW5jbHVkZUNvbnRleHQgPyBzdGF0ZS5jb250ZXh0IDogdW5kZWZpbmVkLFxuICAgICAgICBjb250ZXh0U3VtbWFyeToge1xuICAgICAgICAgIGtleXM6IGNvbnRleHRLZXlzLFxuICAgICAgICAgIHNpemU6IGNvbnRleHRTaXplXG4gICAgICAgIH0sXG4gICAgICAgIGxhc3RBY3RpdmU6IHN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc2Vzc2lvbkNvdW50OiBzdGF0ZS5zZXNzaW9uQ291bnQsXG4gICAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH0sXG4gICAgICBtZXRyaWNzOiB7XG4gICAgICAgIHN1Y2Nlc3NSYXRlOiBtZXRyaWNzLnN1Y2Nlc3NSYXRlLFxuICAgICAgICBnb2Fsc0NvbXBsZXRlZDogbWV0cmljcy5nb2Fsc0NvbXBsZXRlZCxcbiAgICAgICAgZ29hbHNJblByb2dyZXNzOiBtZXRyaWNzLmdvYWxzSW5Qcm9ncmVzcyxcbiAgICAgICAgZGVjaXNpb25BY2N1cmFjeTogbWV0cmljcy5kZWNpc2lvbkFjY3VyYWN5LFxuICAgICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG1ldHJpY3MuYXZlcmFnZUNvbXBsZXRpb25UaW1lXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZ2F0aGVyZWQgZGF0YSBmb3IgYSBzcGVjaWZpYyBnb2FsIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQWdncmVnYXRlcyBkZWNpc2lvbiBoaXN0b3J5LCBnb2FsIHN0YXRlLCBhbmQgc3VtbWFyeSBzdGF0aXN0aWNzXG4gICAqIGludG8gYSBzdHJ1Y3R1cmVkIEdhdGhlcmVkRGF0YSBvYmplY3QuIFRoaXMgaXMgYSByZWFkLXNpZGUgdmlld1xuICAgKiBvdmVyIGV4aXN0aW5nIGFnZW50IHN0YXRlIGRhdGEuXG4gICAqXG4gICAqIElzc3VlICM2ODogR2F0aGVyZWREYXRhRW50cnkgZm9yIHN0YXRlIHJlY29yZGluZ1xuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIENvbXBsZXRpb24gKEVwaWMgIzM4MClcbiAgICovXG4gIGFzeW5jIGdldEdhdGhlcmVkRGF0YShwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBnb2FsSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8R2F0aGVyZWREYXRhPiB7XG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBnYXRoZXJlZCA9IGdldEdhdGhlcmVkRGF0YShwYXJhbXMuYWdlbnROYW1lLCBwYXJhbXMuZ29hbElkLCBzdGF0ZSk7XG5cbiAgICBpZiAoIWdhdGhlcmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBHb2FsICcke3BhcmFtcy5nb2FsSWR9JyBub3QgZm91bmQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9Jy4gYCArXG4gICAgICAgIGBBdmFpbGFibGUgZ29hbHM6ICR7c3RhdGUuZ29hbHMubWFwKGcgPT4gZy5pZCkuam9pbignLCAnKSB8fCAnbm9uZSd9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2F0aGVyZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udGludWUgYWdlbnQgZXhlY3V0aW9uIGZyb20gcHJldmlvdXMgc3RhdGVcbiAgICogQ29tYmluZXMgZXhlY3V0ZUFnZW50IHdpdGggc3RhdGUgY29udGV4dFxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyBjb250aW51ZUFnZW50RXhlY3V0aW9uKHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBwcmV2aW91c1N0ZXBSZXN1bHQ/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPEV4ZWN1dGVBZ2VudFJlc3VsdCAmIHtcbiAgICBwcmV2aW91c1N0YXRlOiB7XG4gICAgICBnb2FsczogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgICAgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gICAgICB9PjtcbiAgICAgIHJlY2VudERlY2lzaW9uczogQXJyYXk8e1xuICAgICAgICBkZWNpc2lvbjogc3RyaW5nO1xuICAgICAgICByZWFzb25pbmc6IHN0cmluZztcbiAgICAgICAgb3V0Y29tZT86IHN0cmluZztcbiAgICAgICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHNlc3Npb25Db3VudDogbnVtYmVyO1xuICAgICAgbGFzdEFjdGl2ZTogc3RyaW5nO1xuICAgICAgc3RhdGVWZXJzaW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBjb250aW51YXRpb246IHtcbiAgICAgIGlzUmVzdW1pbmc6IGJvb2xlYW47XG4gICAgICBwcmV2aW91c1N0ZXBSZXN1bHQ/OiBzdHJpbmc7XG4gICAgICBzdWdnZXN0ZWROZXh0U3RlcHM/OiBzdHJpbmdbXTtcbiAgICB9O1xuICB9PiB7XG4gICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gVGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyAyLiBHZXQgY3VycmVudCBzdGF0ZVxuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcblxuICAgIC8vIDMuIENoZWNrIGlmIGFnZW50IGhhcyBiZWVuIGV4ZWN1dGVkIGJlZm9yZVxuICAgIGNvbnN0IGlzUmVzdW1pbmcgPSBzdGF0ZS5zZXNzaW9uQ291bnQgPiAwIHx8IHN0YXRlLmRlY2lzaW9ucy5sZW5ndGggPiAwO1xuXG4gICAgLy8gNC4gRXhlY3V0ZSBhZ2VudCBub3JtYWxseSAodGhpcyBhY3RpdmF0ZXMgZWxlbWVudHMgYW5kIGdldHMgY29udGV4dClcbiAgICBjb25zdCBleGVjdXRpb25QYXJhbXMgPSBwYXJhbXMucGFyYW1ldGVycyB8fCB7fTtcblxuICAgIGNvbnN0IGV4ZWN1dGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUFnZW50KFxuICAgICAgcGFyYW1zLmFnZW50TmFtZSxcbiAgICAgIGV4ZWN1dGlvblBhcmFtc1xuICAgICk7XG5cbiAgICAvLyA1LiBCdWlsZCBwcmV2aW91cyBzdGF0ZSBzdW1tYXJ5XG4gICAgY29uc3QgcmVjZW50RGVjaXNpb25zID0gc3RhdGUuZGVjaXNpb25zLnNsaWNlKC01KS5tYXAoZCA9PiAoe1xuICAgICAgZGVjaXNpb246IGQuZGVjaXNpb24sXG4gICAgICByZWFzb25pbmc6IGQucmVhc29uaW5nLFxuICAgICAgb3V0Y29tZTogZC5vdXRjb21lLFxuICAgICAgdGltZXN0YW1wOiBkLnRpbWVzdGFtcC50b0lTT1N0cmluZygpXG4gICAgfSkpO1xuXG4gICAgY29uc3QgZ29hbFN1bW1hcnkgPSBzdGF0ZS5nb2Fscy5tYXAoZyA9PiAoe1xuICAgICAgaWQ6IGcuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogZy5kZXNjcmlwdGlvbixcbiAgICAgIHN0YXR1czogZy5zdGF0dXMsXG4gICAgICBwcm9ncmVzczogdW5kZWZpbmVkIC8vIENvdWxkIGFkZCBwcm9ncmVzcyB0cmFja2luZyBpbiBmdXR1cmVcbiAgICB9KSk7XG5cbiAgICAvLyA2LiBHZW5lcmF0ZSBzdWdnZXN0ZWQgbmV4dCBzdGVwcyBiYXNlZCBvbiBzdGF0ZVxuICAgIGNvbnN0IHN1Z2dlc3RlZE5leHRTdGVwcyA9IHRoaXMuZ2VuZXJhdGVOZXh0U3RlcHMoc3RhdGUpO1xuXG4gICAgLy8gNy4gTWVyZ2UgZXhlY3V0aW9uIHJlc3VsdCB3aXRoIGNvbnRpbnVhdGlvbiBjb250ZXh0XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIEluY2x1ZGUgYWxsIGZpZWxkcyBmcm9tIGV4ZWN1dGVfYWdlbnQgcmVzdWx0XG4gICAgICAuLi5leGVjdXRpb25SZXN1bHQsXG5cbiAgICAgIC8vIEFkZCBwcmV2aW91cyBzdGF0ZSBpbmZvcm1hdGlvblxuICAgICAgcHJldmlvdXNTdGF0ZToge1xuICAgICAgICBnb2FsczogZ29hbFN1bW1hcnksXG4gICAgICAgIHJlY2VudERlY2lzaW9ucyxcbiAgICAgICAgc2Vzc2lvbkNvdW50OiBzdGF0ZS5zZXNzaW9uQ291bnQsXG4gICAgICAgIGxhc3RBY3RpdmU6IHN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMVxuICAgICAgfSxcblxuICAgICAgLy8gQWRkIGNvbnRpbnVhdGlvbiBjb250ZXh0XG4gICAgICBjb250aW51YXRpb246IHtcbiAgICAgICAgaXNSZXN1bWluZyxcbiAgICAgICAgcHJldmlvdXNTdGVwUmVzdWx0OiBwYXJhbXMucHJldmlvdXNTdGVwUmVzdWx0LFxuICAgICAgICBzdWdnZXN0ZWROZXh0U3RlcHNcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHN1Z2dlc3RlZCBuZXh0IHN0ZXBzIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVOZXh0U3RlcHMoc3RhdGU6IEFnZW50U3RhdGUpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc3VnZ2VzdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBDaGVjayBmb3IgcGVuZGluZyBnb2Fsc1xuICAgIGNvbnN0IHBlbmRpbmdHb2FscyA9IHN0YXRlLmdvYWxzLmZpbHRlcihnID0+IGcuc3RhdHVzID09PSAncGVuZGluZycpO1xuICAgIGlmIChwZW5kaW5nR29hbHMubGVuZ3RoID4gMCkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaChgU3RhcnQgd29yayBvbiAke3BlbmRpbmdHb2Fscy5sZW5ndGh9IHBlbmRpbmcgZ29hbChzKWApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBpbi1wcm9ncmVzcyBnb2Fsc1xuICAgIGNvbnN0IGluUHJvZ3Jlc3NHb2FscyA9IHN0YXRlLmdvYWxzLmZpbHRlcihnID0+IGcuc3RhdHVzID09PSAnaW5fcHJvZ3Jlc3MnKTtcbiAgICBpZiAoaW5Qcm9ncmVzc0dvYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYENvbnRpbnVlICR7aW5Qcm9ncmVzc0dvYWxzLmxlbmd0aH0gaW4tcHJvZ3Jlc3MgZ29hbChzKWApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBibG9ja2VkIGdvYWxzIChkZXBlbmRlbmNpZXMpXG4gICAgY29uc3QgYmxvY2tlZEdvYWxzID0gc3RhdGUuZ29hbHMuZmlsdGVyKGcgPT5cbiAgICAgIGcuZGVwZW5kZW5jaWVzICYmIGcuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDAgJiYgZy5zdGF0dXMgPT09ICdwZW5kaW5nJ1xuICAgICk7XG4gICAgaWYgKGJsb2NrZWRHb2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKGBSZXNvbHZlIGRlcGVuZGVuY2llcyBmb3IgJHtibG9ja2VkR29hbHMubGVuZ3RofSBibG9ja2VkIGdvYWwocylgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBkZWNpc2lvbiBoaXN0b3J5IGZvciBmYWlsdXJlc1xuICAgIGNvbnN0IHJlY2VudEZhaWx1cmVzID0gc3RhdGUuZGVjaXNpb25zXG4gICAgICAuc2xpY2UoLTEwKVxuICAgICAgLmZpbHRlcihkID0+IGQub3V0Y29tZSA9PT0gJ2ZhaWx1cmUnKTtcbiAgICBpZiAocmVjZW50RmFpbHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaChgUmV2aWV3IGFuZCBhZGRyZXNzICR7cmVjZW50RmFpbHVyZXMubGVuZ3RofSByZWNlbnQgZmFpbHVyZShzKWApO1xuICAgIH1cblxuICAgIHJldHVybiBzdWdnZXN0aW9ucztcbiAgfVxufVxuIl19