@dollhousemcp/mcp-server 1.9.13 → 1.9.15

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 (79) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.github.md +54 -0
  3. package/README.md.backup +1241 -49
  4. package/dist/cache/CollectionCache.js +2 -2
  5. package/dist/collection/CollectionIndexManager.js +3 -3
  6. package/dist/config/ConfigWizard.js +3 -3
  7. package/dist/config/indicator-config.js +2 -2
  8. package/dist/config/portfolio-constants.js +12 -12
  9. package/dist/elements/BaseElement.js +7 -7
  10. package/dist/elements/FeedbackProcessor.d.ts +7 -0
  11. package/dist/elements/FeedbackProcessor.d.ts.map +1 -1
  12. package/dist/elements/FeedbackProcessor.js +67 -14
  13. package/dist/elements/agents/AgentManager.js +6 -6
  14. package/dist/elements/memories/Memory.js +4 -4
  15. package/dist/elements/memories/MemoryManager.js +3 -3
  16. package/dist/elements/memories/utils.js +3 -3
  17. package/dist/elements/skills/Skill.js +2 -2
  18. package/dist/elements/skills/SkillManager.js +2 -2
  19. package/dist/elements/templates/Template.d.ts.map +1 -1
  20. package/dist/elements/templates/Template.js +38 -14
  21. package/dist/elements/templates/TemplateManager.js +2 -2
  22. package/dist/generated/version.d.ts +2 -2
  23. package/dist/generated/version.js +3 -3
  24. package/dist/handlers/ConfigHandler.js +3 -3
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +20 -16
  27. package/dist/persona/PersonaElementManager.js +3 -3
  28. package/dist/persona/PersonaManager.js +2 -2
  29. package/dist/persona/export-import/PersonaImporter.js +3 -3
  30. package/dist/portfolio/DefaultElementProvider.d.ts +12 -0
  31. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  32. package/dist/portfolio/DefaultElementProvider.js +23 -6
  33. package/dist/portfolio/GitHubPortfolioIndexer.js +2 -2
  34. package/dist/portfolio/MigrationManager.js +2 -2
  35. package/dist/portfolio/NLPScoringManager.js +2 -2
  36. package/dist/portfolio/PortfolioManager.d.ts +5 -0
  37. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  38. package/dist/portfolio/PortfolioManager.js +8 -1
  39. package/dist/portfolio/PortfolioRepoManager.js +2 -2
  40. package/dist/portfolio/PortfolioSyncManager.js +5 -5
  41. package/dist/portfolio/RelationshipManager.js +4 -4
  42. package/dist/portfolio/UnifiedIndexManager.js +4 -4
  43. package/dist/portfolio/types/RelationshipTypes.js +2 -2
  44. package/dist/security/InputValidator.d.ts +12 -0
  45. package/dist/security/InputValidator.d.ts.map +1 -1
  46. package/dist/security/InputValidator.js +38 -18
  47. package/dist/security/audit/config/suppressions.js +10 -10
  48. package/dist/security/commandValidator.js +2 -2
  49. package/dist/security/dosProtection.d.ts +123 -0
  50. package/dist/security/dosProtection.d.ts.map +1 -0
  51. package/dist/security/dosProtection.js +392 -0
  52. package/dist/security/pathValidator.js +2 -2
  53. package/dist/security/secureYamlParser.d.ts.map +1 -1
  54. package/dist/security/secureYamlParser.js +4 -3
  55. package/dist/security/tokenManager.js +10 -10
  56. package/dist/security/validators/unicodeValidator.js +2 -2
  57. package/dist/security/yamlValidator.js +3 -3
  58. package/dist/sync/PortfolioDownloader.js +2 -2
  59. package/dist/sync/PortfolioSyncComparer.js +2 -2
  60. package/dist/tools/portfolio/PortfolioElementAdapter.js +3 -3
  61. package/dist/tools/portfolio/submitToPortfolioTool.js +14 -14
  62. package/dist/utils/EarlyTerminationSearch.d.ts +1 -1
  63. package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -1
  64. package/dist/utils/EarlyTerminationSearch.js +3 -3
  65. package/dist/utils/ElementFormatter.d.ts +1 -0
  66. package/dist/utils/ElementFormatter.d.ts.map +1 -1
  67. package/dist/utils/ElementFormatter.js +21 -13
  68. package/dist/utils/GitHubRateLimiter.d.ts +6 -0
  69. package/dist/utils/GitHubRateLimiter.d.ts.map +1 -1
  70. package/dist/utils/GitHubRateLimiter.js +20 -5
  71. package/dist/utils/RateLimiter.js +2 -2
  72. package/dist/utils/SecureDownloader.js +2 -2
  73. package/dist/utils/fileOperations.d.ts +6 -1
  74. package/dist/utils/fileOperations.d.ts.map +1 -1
  75. package/dist/utils/fileOperations.js +29 -5
  76. package/dist/utils/filesystem.js +6 -6
  77. package/dist/utils/searchUtils.js +2 -2
  78. package/dist/utils/version.js +3 -3
  79. package/package.json +1 -1
@@ -475,7 +475,7 @@ export class SecureDownloader {
475
475
  }
476
476
  // SECURITY: Check Content-Length header if available
477
477
  const contentLength = response.headers.get('content-length');
478
- if (contentLength && parseInt(contentLength, 10) > maxSize) {
478
+ if (contentLength && Number.parseInt(contentLength, 10) > maxSize) {
479
479
  throw DownloadError.securityError(`Content size ${contentLength} exceeds limit of ${maxSize} bytes`);
480
480
  }
481
481
  // Read content with size checking
@@ -756,4 +756,4 @@ export class SecureDownloader {
756
756
  };
757
757
  }
758
758
  }
759
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjdXJlRG93bmxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9TZWN1cmVEb3dubG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdURHO0FBRUgsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixJQUFJLHdCQUF3QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUE0RHJDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWMsU0FBUSxLQUFLO0lBR3BCO0lBQ0E7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SyxFQUFFLE9BQWUsRUFBNkIsRUFBRTtZQUMxRCxLQUFLLE1BQU0sT0FBTyxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3hDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUMxQixPQUFPO3dCQUNMLE9BQU8sRUFBRSxLQUFLO3dCQUNkLFlBQVk7d0JBQ1osUUFBUSxFQUFFLE1BQU07d0JBQ2hCLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFO3FCQUN0QyxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlY3VyZURvd25sb2FkZXIgLSBSZXVzYWJsZSB1dGlsaXR5IGZvciBzYWZlIGNvbnRlbnQgZG93bmxvYWRzXG4gKiBcbiAqIEltcGxlbWVudHMgdGhlIHZhbGlkYXRlLWJlZm9yZS13cml0ZSBwYXR0ZXJuIHdpdGggY29tcHJlaGVuc2l2ZSBzZWN1cml0eSBmZWF0dXJlczpcbiAqIC0gQ29udGVudCB2YWxpZGF0aW9uIGhvb2tzIChjdXN0b21pemFibGUgdmFsaWRhdG9ycylcbiAqIC0gQXRvbWljIGZpbGUgb3BlcmF0aW9ucyB3aXRoIHRlbXAgZmlsZXNcbiAqIC0gR3VhcmFudGVlZCBjbGVhbnVwIG9uIGZhaWx1cmVcbiAqIC0gTWVtb3J5LWVmZmljaWVudCBzdHJlYW1pbmcgZm9yIGxhcmdlIGZpbGVzXG4gKiAtIFNpemUgbGltaXRzIHRvIHByZXZlbnQgRG9TIGF0dGFja3NcbiAqIC0gUGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgdHJhdmVyc2FsXG4gKiAtIFRpbWVvdXQgaGFuZGxpbmcgZm9yIG5ldHdvcmsgb3BlcmF0aW9uc1xuICogLSBDb250ZW50IHR5cGUgdmFsaWRhdGlvblxuICogXG4gKiBVc2FnZSBFeGFtcGxlczpcbiAqIFxuICogLy8gQmFzaWMgZG93bmxvYWQgd2l0aCB2YWxpZGF0aW9uXG4gKiBjb25zdCBkb3dubG9hZGVyID0gbmV3IFNlY3VyZURvd25sb2FkZXIoKTtcbiAqIGF3YWl0IGRvd25sb2FkZXIuZG93bmxvYWRUb0ZpbGUoXG4gKiAgICdodHRwczovL2V4YW1wbGUuY29tL2ZpbGUubWQnLFxuICogICAnLi9kb3dubG9hZHMvZmlsZS5tZCcsXG4gKiAgIHtcbiAqICAgICB2YWxpZGF0b3I6IGFzeW5jIChjb250ZW50KSA9PiAoe1xuICogICAgICAgaXNWYWxpZDogIWNvbnRlbnQuaW5jbHVkZXMoJ21hbGljaW91cycpLFxuICogICAgICAgZXJyb3JNZXNzYWdlOiBjb250ZW50LmluY2x1ZGVzKCdtYWxpY2lvdXMnKSA/ICdNYWxpY2lvdXMgY29udGVudCBkZXRlY3RlZCcgOiB1bmRlZmluZWRcbiAqICAgICB9KSxcbiAqICAgICBtYXhTaXplOiAxMDI0ICogMTAyNCwgLy8gMU1CIGxpbWl0XG4gKiAgICAgdGltZW91dDogMzAwMDAgLy8gMzAgc2Vjb25kIHRpbWVvdXRcbiAqICAgfVxuICogKTtcbiAqIFxuICogLy8gRG93bmxvYWQgdG8gbWVtb3J5IHdpdGggdmFsaWRhdGlvblxuICogY29uc3QgY29udGVudCA9IGF3YWl0IGRvd25sb2FkZXIuZG93bmxvYWRUb01lbW9yeShcbiAqICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20vZGF0YS5qc29uJyxcbiAqICAge1xuICogICAgIHZhbGlkYXRvcjogYXN5bmMgKGNvbnRlbnQpID0+IHtcbiAqICAgICAgIHRyeSB7XG4gKiAgICAgICAgIEpTT04ucGFyc2UoY29udGVudCk7XG4gKiAgICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUgfTtcbiAqICAgICAgIH0gY2F0Y2gge1xuICogICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JNZXNzYWdlOiAnSW52YWxpZCBKU09OIGZvcm1hdCcgfTtcbiAqICAgICAgIH1cbiAqICAgICB9XG4gKiAgIH1cbiAqICk7XG4gKiBcbiAqIC8vIFN0cmVhbWluZyBkb3dubG9hZCBmb3IgbGFyZ2UgZmlsZXNcbiAqIGF3YWl0IGRvd25sb2FkZXIuZG93bmxvYWRTdHJlYW0oXG4gKiAgICdodHRwczovL2V4YW1wbGUuY29tL2xhcmdlLWZpbGUuemlwJyxcbiAqICAgJy4vZG93bmxvYWRzL2xhcmdlLWZpbGUuemlwJyxcbiAqICAge1xuICogICAgIHN0cmVhbVZhbGlkYXRvcjogKGNodW5rKSA9PiAhY2h1bmsuaW5jbHVkZXMoQnVmZmVyLmZyb20oJ1ZJUlVTJykpLFxuICogICAgIG1heFNpemU6IDEwMCAqIDEwMjQgKiAxMDI0LCAvLyAxMDBNQiBsaW1pdFxuICogICAgIHRpbWVvdXQ6IDMwMDAwMCAvLyA1IG1pbnV0ZSB0aW1lb3V0XG4gKiAgIH1cbiAqICk7XG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzLCBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IHBpcGVsaW5lIH0gZnJvbSAnc3RyZWFtL3Byb21pc2VzJztcbmltcG9ydCB7IGNyZWF0ZVdyaXRlU3RyZWFtIH0gZnJvbSAnZnMnO1xuXG5pbXBvcnQgeyBTZWN1cml0eUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL1NlY3VyaXR5RXJyb3IuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgYXMgU2VjdXJpdHlDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBQYXRoVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvcGF0aFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgUmF0ZUxpbWl0ZXIgfSBmcm9tICcuL1JhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcblxuLyoqXG4gKiBSZXN1bHQgb2YgY29udGVudCB2YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblJlc3VsdCB7XG4gIC8qKiBXaGV0aGVyIHRoZSBjb250ZW50IGlzIHZhbGlkIGFuZCBzYWZlICovXG4gIGlzVmFsaWQ6IGJvb2xlYW47XG4gIC8qKiBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbGVkICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgLyoqIFNldmVyaXR5IG9mIGFueSBkZXRlY3RlZCBpc3N1ZXMgKi9cbiAgc2V2ZXJpdHk/OiAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ2NyaXRpY2FsJztcbiAgLyoqIEFkZGl0aW9uYWwgbWV0YWRhdGEgYWJvdXQgdmFsaWRhdGlvbiAqL1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbi8qKlxuICogQ29udGVudCB2YWxpZGF0b3IgZnVuY3Rpb24gdHlwZVxuICovXG5leHBvcnQgdHlwZSBDb250ZW50VmFsaWRhdG9yRnVuY3Rpb24gPSAoY29udGVudDogc3RyaW5nKSA9PiBQcm9taXNlPFZhbGlkYXRpb25SZXN1bHQ+O1xuXG4vKipcbiAqIFN0cmVhbSBjaHVuayB2YWxpZGF0b3IgZnVuY3Rpb24gdHlwZVxuICovXG5leHBvcnQgdHlwZSBTdHJlYW1WYWxpZGF0b3IgPSAoY2h1bms6IFVpbnQ4QXJyYXkpID0+IGJvb2xlYW47XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZG93bmxvYWQgb3BlcmF0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERvd25sb2FkT3B0aW9ucyB7XG4gIC8qKiBDdXN0b20gY29udGVudCB2YWxpZGF0b3IgZnVuY3Rpb24gKi9cbiAgdmFsaWRhdG9yPzogQ29udGVudFZhbGlkYXRvckZ1bmN0aW9uO1xuICAvKiogTWF4aW11bSBmaWxlIHNpemUgaW4gYnl0ZXMgKGRlZmF1bHQ6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRklMRV9TSVpFKSAqL1xuICBtYXhTaXplPzogbnVtYmVyO1xuICAvKiogTmV0d29yayB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMzAwMDApICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHRvIHVzZSBhdG9taWMgZmlsZSBvcGVyYXRpb25zIChkZWZhdWx0OiB0cnVlKSAqL1xuICBhdG9taWM/OiBib29sZWFuO1xuICAvKiogRXhwZWN0ZWQgY29udGVudCB0eXBlIChmb3IgdmFsaWRhdGlvbikgKi9cbiAgZXhwZWN0ZWRDb250ZW50VHlwZT86IHN0cmluZztcbiAgLyoqIEN1c3RvbSBIVFRQIGhlYWRlcnMgKi9cbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBFeHBlY3RlZCBTSEEtMjU2IGNoZWNrc3VtIGZvciBpbnRlZ3JpdHkgdmFsaWRhdGlvbiAqL1xuICBleHBlY3RlZENoZWNrc3VtPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0cmVhbWluZyBkb3dubG9hZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1Eb3dubG9hZE9wdGlvbnMge1xuICAvKiogQ2h1bmstbGV2ZWwgdmFsaWRhdG9yIGZvciBzdHJlYW1pbmcgdmFsaWRhdGlvbiAqL1xuICBzdHJlYW1WYWxpZGF0b3I/OiBTdHJlYW1WYWxpZGF0b3I7XG4gIC8qKiBNYXhpbXVtIGZpbGUgc2l6ZSBpbiBieXRlcyAoZGVmYXVsdDogU0VDVVJJVFlfTElNSVRTLk1BWF9GSUxFX1NJWkUpICovXG4gIG1heFNpemU/OiBudW1iZXI7XG4gIC8qKiBOZXR3b3JrIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIChkZWZhdWx0OiAzMDAwMCkgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIEN1c3RvbSBIVFRQIGhlYWRlcnMgKi9cbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogQ3VzdG9tIGVycm9yIHR5cGVzIGZvciBkaWZmZXJlbnQgZmFpbHVyZSBzY2VuYXJpb3NcbiAqL1xuZXhwb3J0IGNsYXNzIERvd25sb2FkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29kZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBvcmlnaW5hbEVycm9yPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0Rvd25sb2FkRXJyb3InO1xuICB9XG5cbiAgc3RhdGljIG5ldHdvcmtFcnJvcihtZXNzYWdlOiBzdHJpbmcsIG9yaWdpbmFsRXJyb3I/OiBFcnJvcik6IERvd25sb2FkRXJyb3Ige1xuICAgIHJldHVybiBuZXcgRG93bmxvYWRFcnJvcihtZXNzYWdlLCAnTkVUV09SS19FUlJPUicsIG9yaWdpbmFsRXJyb3IpO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRpb25FcnJvcihtZXNzYWdlOiBzdHJpbmcpOiBEb3dubG9hZEVycm9yIHtcbiAgICByZXR1cm4gbmV3IERvd25sb2FkRXJyb3IobWVzc2FnZSwgJ1ZBTElEQVRJT05fRVJST1InKTtcbiAgfVxuXG4gIHN0YXRpYyBzZWN1cml0eUVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IERvd25sb2FkRXJyb3Ige1xuICAgIHJldHVybiBuZXcgRG93bmxvYWRFcnJvcihtZXNzYWdlLCAnU0VDVVJJVFlfRVJST1InKTtcbiAgfVxuXG4gIHN0YXRpYyB0aW1lb3V0RXJyb3IobWVzc2FnZTogc3RyaW5nKTogRG93bmxvYWRFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBEb3dubG9hZEVycm9yKG1lc3NhZ2UsICdUSU1FT1VUX0VSUk9SJyk7XG4gIH1cblxuICBzdGF0aWMgZmlsZXN5c3RlbUVycm9yKG1lc3NhZ2U6IHN0cmluZywgb3JpZ2luYWxFcnJvcj86IEVycm9yKTogRG93bmxvYWRFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBEb3dubG9hZEVycm9yKG1lc3NhZ2UsICdGSUxFU1lTVEVNX0VSUk9SJywgb3JpZ2luYWxFcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWN1cmVEb3dubG9hZGVyIC0gSW1wbGVtZW50cyB2YWxpZGF0ZS1iZWZvcmUtd3JpdGUgcGF0dGVybiBmb3Igc2FmZSBkb3dubG9hZHNcbiAqIFxuICogS2V5IFNlY3VyaXR5IEZlYXR1cmVzOlxuICogMS4gVkFMSURBVEUtQkVGT1JFLVdSSVRFOiBBbGwgY29udGVudCB2YWxpZGF0aW9uIG9jY3VycyBiZWZvcmUgYW55IGRpc2sgb3BlcmF0aW9uc1xuICogMi4gQVRPTUlDIE9QRVJBVElPTlM6IFVzZXMgdGVtcG9yYXJ5IGZpbGVzIHdpdGggYXRvbWljIHJlbmFtZSB0byBwcmV2ZW50IGNvcnJ1cHRpb25cbiAqIDMuIEdVQVJBTlRFRUQgQ0xFQU5VUDogQXV0b21hdGljIGNsZWFudXAgb2YgdGVtcG9yYXJ5IGZpbGVzIG9uIGFueSBmYWlsdXJlXG4gKiA0LiBTSVpFIExJTUlUUzogUHJldmVudHMgRG9TIGF0dGFja3MgdGhyb3VnaCBsYXJnZSBmaWxlIGRvd25sb2Fkc1xuICogNS4gUEFUSCBWQUxJREFUSU9OOiBQcmV2ZW50cyBkaXJlY3RvcnkgdHJhdmVyc2FsIGF0dGFja3NcbiAqIDYuIFRJTUVPVVQgUFJPVEVDVElPTjogUHJldmVudHMgaGFuZ2luZyBuZXR3b3JrIG9wZXJhdGlvbnNcbiAqIDcuIENPTlRFTlQgVkFMSURBVElPTjogRXh0ZW5zaWJsZSB2YWxpZGF0aW9uIHN5c3RlbSBmb3IgZGlmZmVyZW50IGNvbnRlbnQgdHlwZXNcbiAqL1xuZXhwb3J0IGNsYXNzIFNlY3VyZURvd25sb2FkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRUaW1lb3V0OiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdE1heFNpemU6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZW1wRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsUmF0ZUxpbWl0ZXI6IFJhdGVMaW1pdGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHVybFJhdGVMaW1pdGVyczogTWFwPHN0cmluZywgUmF0ZUxpbWl0ZXI+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiB7XG4gICAgZGVmYXVsdFRpbWVvdXQ/OiBudW1iZXI7XG4gICAgZGVmYXVsdE1heFNpemU/OiBudW1iZXI7XG4gICAgdGVtcERpcj86IHN0cmluZztcbiAgICByYXRlTGltaXRPcHRpb25zPzoge1xuICAgICAgbWF4UmVxdWVzdHNQZXJVcmw/OiBudW1iZXI7XG4gICAgICBtYXhHbG9iYWxSZXF1ZXN0cz86IG51bWJlcjtcbiAgICAgIHdpbmRvd01zPzogbnVtYmVyO1xuICAgIH07XG4gIH0pIHtcbiAgICB0aGlzLmRlZmF1bHRUaW1lb3V0ID0gb3B0aW9ucz8uZGVmYXVsdFRpbWVvdXQgfHwgMzAwMDA7IC8vIDMwIHNlY29uZHNcbiAgICB0aGlzLmRlZmF1bHRNYXhTaXplID0gb3B0aW9ucz8uZGVmYXVsdE1heFNpemUgfHwgU0VDVVJJVFlfTElNSVRTLk1BWF9GSUxFX1NJWkU7XG4gICAgdGhpcy50ZW1wRGlyID0gb3B0aW9ucz8udGVtcERpciB8fCAnLnRtcCc7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSByYXRlIGxpbWl0ZXJzXG4gICAgY29uc3QgcmF0ZUxpbWl0Q29uZmlnID0gb3B0aW9ucz8ucmF0ZUxpbWl0T3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLmdsb2JhbFJhdGVMaW1pdGVyID0gbmV3IFJhdGVMaW1pdGVyKHtcbiAgICAgIG1heFJlcXVlc3RzOiByYXRlTGltaXRDb25maWcubWF4R2xvYmFsUmVxdWVzdHMgfHwgMTAwLCAvLyAxMDAgZG93bmxvYWRzIHBlciBob3VyIGdsb2JhbGx5XG4gICAgICB3aW5kb3dNczogcmF0ZUxpbWl0Q29uZmlnLndpbmRvd01zIHx8IDYwICogNjAgKiAxMDAwLCAvLyAxIGhvdXJcbiAgICAgIG1pbkRlbGF5TXM6IDEwMDAgLy8gTWluaW11bSAxIHNlY29uZCBiZXR3ZWVuIHJlcXVlc3RzXG4gICAgfSk7XG4gICAgdGhpcy51cmxSYXRlTGltaXRlcnMgPSBuZXcgTWFwKCk7XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWQgY29udGVudCB0byBhIGZpbGUgd2l0aCB2YWxpZGF0aW9uXG4gICAqIFxuICAgKiBTRUNVUklUWTogSW1wbGVtZW50cyB2YWxpZGF0ZS1iZWZvcmUtd3JpdGUgcGF0dGVybjpcbiAgICogMS4gRG93bmxvYWQgY29udGVudCB0byBtZW1vcnlcbiAgICogMi4gVmFsaWRhdGUgYWxsIGNvbnRlbnRcbiAgICogMy4gT25seSB0aGVuIHdyaXRlIHRvIGRpc2sgYXRvbWljYWxseVxuICAgKiBcbiAgICogQHBhcmFtIHVybCAtIFVSTCB0byBkb3dubG9hZCBmcm9tXG4gICAqIEBwYXJhbSBkZXN0aW5hdGlvblBhdGggLSBMb2NhbCBmaWxlIHBhdGggdG8gc2F2ZSB0b1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIERvd25sb2FkIGFuZCB2YWxpZGF0aW9uIG9wdGlvbnNcbiAgICovXG4gIGFzeW5jIGRvd25sb2FkVG9GaWxlKFxuICAgIHVybDogc3RyaW5nLFxuICAgIGRlc3RpbmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IERvd25sb2FkT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBTdGFydGluZyBzZWN1cmUgZG93bmxvYWQgZnJvbSAke3VybH0gdG8gJHtkZXN0aW5hdGlvblBhdGh9YCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gU0VDVVJJVFk6IFZhbGlkYXRlIFVSTCBhbmQgZGVzdGluYXRpb24gcGF0aCBmaXJzdFxuICAgICAgdGhpcy52YWxpZGF0ZVVybCh1cmwpO1xuICAgICAgY29uc3QgdmFsaWRhdGVkUGF0aCA9IGF3YWl0IHRoaXMudmFsaWRhdGVEZXN0aW5hdGlvblBhdGgoZGVzdGluYXRpb25QYXRoKTtcblxuICAgICAgLy8gU0VDVVJJVFk6IENoZWNrIGlmIGZpbGUgYWxyZWFkeSBleGlzdHMgKHByZXZlbnQgYWNjaWRlbnRhbCBvdmVyd3JpdGVzKVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKHZhbGlkYXRlZFBhdGgpO1xuICAgICAgICB0aHJvdyBEb3dubG9hZEVycm9yLmZpbGVzeXN0ZW1FcnJvcihgRmlsZSBhbHJlYWR5IGV4aXN0czogJHtkZXN0aW5hdGlvblBhdGh9YCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgaWYgaXQncyBub3QgYSBcImZpbGUgbm90IGZvdW5kXCIgZXJyb3JcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIHByb2NlZWQgd2l0aCBkb3dubG9hZFxuICAgICAgfVxuXG4gICAgICAvLyBTVEVQIDE6IENoZWNrIHJhdGUgbGltaXRzIGJlZm9yZSBkb3dubG9hZFxuICAgICAgYXdhaXQgdGhpcy5jaGVja1JhdGVMaW1pdCh1cmwpO1xuXG4gICAgICAvLyBTVEVQIDI6IERvd25sb2FkIGNvbnRlbnQgdG8gbWVtb3J5IChubyBkaXNrIG9wZXJhdGlvbnMgeWV0KVxuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZG93bmxvYWRUb01lbW9yeSh1cmwsIG9wdGlvbnMpO1xuXG4gICAgICAvLyBTVEVQIDM6IFZhbGlkYXRlIGNoZWNrc3VtIGlmIHByb3ZpZGVkXG4gICAgICBpZiAob3B0aW9ucy5leHBlY3RlZENoZWNrc3VtKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVDaGVja3N1bShjb250ZW50LCBvcHRpb25zLmV4cGVjdGVkQ2hlY2tzdW0pO1xuICAgICAgfVxuXG4gICAgICAvLyBTVEVQIDQ6IEFsbCB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLCBub3cgd3JpdGUgYXRvbWljYWxseVxuICAgICAgY29uc3QgdXNlQXRvbWljID0gb3B0aW9ucy5hdG9taWMgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRvIHRydWVcbiAgICAgIGlmICh1c2VBdG9taWMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hdG9taWNXcml0ZUZpbGUodmFsaWRhdGVkUGF0aCwgY29udGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmRpcmVjdFdyaXRlRmlsZSh2YWxpZGF0ZWRQYXRoLCBjb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmluZm8oYFNlY3VyZSBkb3dubG9hZCBjb21wbGV0ZWQ6ICR7ZGVzdGluYXRpb25QYXRofSAoJHtjb250ZW50Lmxlbmd0aH0gYnl0ZXMsICR7ZHVyYXRpb259bXMpYCk7XG5cbiAgICAgIC8vIExvZyBzdWNjZXNzZnVsIGRvd25sb2FkIGZvciBzZWN1cml0eSBtb25pdG9yaW5nXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdGSUxFX0NPUElFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnc2VjdXJlX2Rvd25sb2FkZXInLFxuICAgICAgICBkZXRhaWxzOiBgRG93bmxvYWRlZCAke2NvbnRlbnQubGVuZ3RofSBieXRlcyBmcm9tICR7dXJsfSB0byAke2Rlc3RpbmF0aW9uUGF0aH1gLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICBkZXN0aW5hdGlvblBhdGgsXG4gICAgICAgICAgY29udGVudExlbmd0aDogY29udGVudC5sZW5ndGgsXG4gICAgICAgICAgZHVyYXRpb25cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmVycm9yKGBTZWN1cmUgZG93bmxvYWQgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcblxuICAgICAgLy8gTG9nIGZhaWxlZCBkb3dubG9hZCBmb3Igc2VjdXJpdHkgbW9uaXRvcmluZ1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnc2VjdXJlX2Rvd25sb2FkZXInLFxuICAgICAgICBkZXRhaWxzOiBgRG93bmxvYWQgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICBkZXN0aW5hdGlvblBhdGgsXG4gICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgZXJyb3JUeXBlOiBlcnJvciBpbnN0YW5jZW9mIERvd25sb2FkRXJyb3IgPyBlcnJvci5jb2RlIDogJ1VOS05PV04nXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWQgY29udGVudCB0byBtZW1vcnkgd2l0aCB2YWxpZGF0aW9uXG4gICAqIFxuICAgKiBAcGFyYW0gdXJsIC0gVVJMIHRvIGRvd25sb2FkIGZyb21cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBEb3dubG9hZCBhbmQgdmFsaWRhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIFZhbGlkYXRlZCBjb250ZW50IGFzIHN0cmluZ1xuICAgKi9cbiAgYXN5bmMgZG93bmxvYWRUb01lbW9yeShcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBEb3dubG9hZE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgfHwgdGhpcy5kZWZhdWx0VGltZW91dDtcbiAgICBjb25zdCBtYXhTaXplID0gb3B0aW9ucy5tYXhTaXplIHx8IHRoaXMuZGVmYXVsdE1heFNpemU7XG5cbiAgICBsb2dnZXIuZGVidWcoYERvd25sb2FkaW5nIGNvbnRlbnQgZnJvbSAke3VybH0gKG1heDogJHttYXhTaXplfSBieXRlcywgdGltZW91dDogJHt0aW1lb3V0fW1zKWApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBWYWxpZGF0ZSBVUkwgZm9ybWF0XG4gICAgICB0aGlzLnZhbGlkYXRlVXJsKHVybCk7XG5cbiAgICAgIC8vIFNURVAgMTogQ2hlY2sgcmF0ZSBsaW1pdHMgYmVmb3JlIGRvd25sb2FkXG4gICAgICBhd2FpdCB0aGlzLmNoZWNrUmF0ZUxpbWl0KHVybCk7XG5cbiAgICAgIC8vIFNURVAgMjogRmV0Y2ggY29udGVudCB3aXRoIHNpemUgYW5kIHRpbWVvdXQgcHJvdGVjdGlvblxuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmV0Y2hXaXRoTGltaXRzKHVybCwgbWF4U2l6ZSwgdGltZW91dCwgb3B0aW9ucy5oZWFkZXJzKTtcblxuICAgICAgLy8gU1RFUCAzOiBWYWxpZGF0ZSBjb250ZW50IHR5cGUgaWYgc3BlY2lmaWVkXG4gICAgICBpZiAob3B0aW9ucy5leHBlY3RlZENvbnRlbnRUeXBlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVDb250ZW50VHlwZShjb250ZW50LCBvcHRpb25zLmV4cGVjdGVkQ29udGVudFR5cGUpO1xuICAgICAgfVxuXG4gICAgICAvLyBTVEVQIDQ6IFZhbGlkYXRlIGNoZWNrc3VtIGlmIHByb3ZpZGVkXG4gICAgICBpZiAob3B0aW9ucy5leHBlY3RlZENoZWNrc3VtKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVDaGVja3N1bShjb250ZW50LCBvcHRpb25zLmV4cGVjdGVkQ2hlY2tzdW0pO1xuICAgICAgfVxuXG4gICAgICAvLyBTVEVQIDU6IFJ1biBidWlsdC1pbiBzZWN1cml0eSB2YWxpZGF0aW9uXG4gICAgICBjb25zdCBzZWN1cml0eVJlc3VsdCA9IFNlY3VyaXR5Q29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGNvbnRlbnQpO1xuICAgICAgaWYgKCFzZWN1cml0eVJlc3VsdC5pc1ZhbGlkICYmIHNlY3VyaXR5UmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHRocm93IERvd25sb2FkRXJyb3Iuc2VjdXJpdHlFcnJvcihcbiAgICAgICAgICBgQ3JpdGljYWwgc2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkOiAke3NlY3VyaXR5UmVzdWx0LmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJyl9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBTVEVQIDY6IFJ1biBjdXN0b20gdmFsaWRhdG9yIGlmIHByb3ZpZGVkXG4gICAgICBpZiAob3B0aW9ucy52YWxpZGF0b3IpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdSdW5uaW5nIGN1c3RvbSBjb250ZW50IHZhbGlkYXRpb24nKTtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IG9wdGlvbnMudmFsaWRhdG9yKGNvbnRlbnQpO1xuICAgICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IERvd25sb2FkRXJyb3IudmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdC5lcnJvck1lc3NhZ2UgfHwgJ0NvbnRlbnQgdmFsaWRhdGlvbiBmYWlsZWQnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZGVidWcoYENvbnRlbnQgdmFsaWRhdGlvbiBwYXNzZWQgKCR7Y29udGVudC5sZW5ndGh9IGJ5dGVzKWApO1xuICAgICAgcmV0dXJuIHNlY3VyaXR5UmVzdWx0LnNhbml0aXplZENvbnRlbnQgfHwgY29udGVudDtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBEb3dubG9hZEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci5uZXR3b3JrRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gZG93bmxvYWQgY29udGVudCBmcm9tICR7dXJsfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZCBsYXJnZSBmaWxlcyB1c2luZyBzdHJlYW1pbmcgd2l0aCBjaHVuay1sZXZlbCB2YWxpZGF0aW9uXG4gICAqIFxuICAgKiBAcGFyYW0gdXJsIC0gVVJMIHRvIGRvd25sb2FkIGZyb21cbiAgICogQHBhcmFtIGRlc3RpbmF0aW9uUGF0aCAtIExvY2FsIGZpbGUgcGF0aCB0byBzYXZlIHRvXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gU3RyZWFtaW5nIGRvd25sb2FkIG9wdGlvbnNcbiAgICovXG4gIGFzeW5jIGRvd25sb2FkU3RyZWFtKFxuICAgIHVybDogc3RyaW5nLFxuICAgIGRlc3RpbmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFN0cmVhbURvd25sb2FkT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgbWF4U2l6ZSA9IG9wdGlvbnMubWF4U2l6ZSB8fCB0aGlzLmRlZmF1bHRNYXhTaXplO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgfHwgdGhpcy5kZWZhdWx0VGltZW91dDtcblxuICAgIGxvZ2dlci5kZWJ1ZyhgU3RhcnRpbmcgc3RyZWFtaW5nIGRvd25sb2FkIGZyb20gJHt1cmx9IHRvICR7ZGVzdGluYXRpb25QYXRofWApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBDaGVjayByYXRlIGxpbWl0cyBiZWZvcmUgZG93bmxvYWRcbiAgICAgIGF3YWl0IHRoaXMuY2hlY2tSYXRlTGltaXQodXJsKTtcblxuICAgICAgLy8gU0VDVVJJVFk6IFZhbGlkYXRlIFVSTCBhbmQgZGVzdGluYXRpb24gcGF0aFxuICAgICAgdGhpcy52YWxpZGF0ZVVybCh1cmwpO1xuICAgICAgY29uc3QgdmFsaWRhdGVkUGF0aCA9IGF3YWl0IHRoaXMudmFsaWRhdGVEZXN0aW5hdGlvblBhdGgoZGVzdGluYXRpb25QYXRoKTtcblxuICAgICAgLy8gR2VuZXJhdGUgdGVtcG9yYXJ5IGZpbGUgcGF0aCBmb3IgYXRvbWljIG9wZXJhdGlvblxuICAgICAgY29uc3QgdGVtcFBhdGggPSBhd2FpdCB0aGlzLmdldFRlbXBGaWxlUGF0aCh2YWxpZGF0ZWRQYXRoKTtcblxuICAgICAgbGV0IGRvd25sb2FkZWRTaXplID0gMDtcbiAgICAgIGxldCB0aW1lb3V0SGFuZGxlOiBOb2RlSlMuVGltZW91dCB8IHVuZGVmaW5lZDtcblxuICAgICAgLy8gQ3JlYXRlIGFib3J0IGNvbnRyb2xsZXIgZm9yIHRpbWVvdXQgaGFuZGxpbmdcbiAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gU0VDVVJJVFk6IEZldGNoIHdpdGggYWJvcnQgc2lnbmFsIGZvciB0aW1lb3V0XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVyc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5ib2R5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXNwb25zZSBib2R5IGlzIG51bGwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuc3VyZSB0ZW1wIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHRlbXBQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHdyaXRlIHN0cmVhbSB0byB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICBjb25zdCB3cml0ZVN0cmVhbSA9IGNyZWF0ZVdyaXRlU3RyZWFtKHRlbXBQYXRoKTtcblxuICAgICAgICAvLyBDcmVhdGUgYSB0cmFuc2Zvcm0gc3RyZWFtIGZvciB2YWxpZGF0aW9uIGFuZCBzaXplIGNoZWNraW5nXG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25TdHJlYW0gPSBuZXcgUmVhZGFibGUoe1xuICAgICAgICAgIGFzeW5jIHJlYWQoKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHN0cmVhbSB3aWxsIGJlIGZlZCBieSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNldCB1cCBjaHVuayB2YWxpZGF0aW9uIGFuZCBzaXplIGNoZWNraW5nXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XG4gICAgICAgIGNvbnN0IHB1bXAgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgICAgICAgIGlmIChkb25lKSBicmVhaztcblxuICAgICAgICAgICAgICAvLyBTRUNVUklUWTogQ2hlY2sgc2l6ZSBsaW1pdFxuICAgICAgICAgICAgICBkb3dubG9hZGVkU2l6ZSArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICAgIGlmIChkb3dubG9hZGVkU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBEb3dubG9hZEVycm9yLnNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgICAgICAgICBgRmlsZSBzaXplIGV4Y2VlZHMgbGltaXQ6ICR7ZG93bmxvYWRlZFNpemV9ID4gJHttYXhTaXplfSBieXRlc2BcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gU0VDVVJJVFk6IFJ1biBjaHVuayB2YWxpZGF0b3IgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RyZWFtVmFsaWRhdG9yICYmICFvcHRpb25zLnN0cmVhbVZhbGlkYXRvcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBEb3dubG9hZEVycm9yLnZhbGlkYXRpb25FcnJvcignQ2h1bmsgdmFsaWRhdGlvbiBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJlYW0ucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWxpZGF0aW9uU3RyZWFtLnB1c2gobnVsbCk7IC8vIEVuZCBzdHJlYW1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdmFsaWRhdGlvblN0cmVhbS5kZXN0cm95KGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBwdW1wIGFuZCBwaXBlbGluZSBjb25jdXJyZW50bHlcbiAgICAgICAgY29uc3QgW3B1bXBSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIHB1bXAoKSxcbiAgICAgICAgICBwaXBlbGluZSh2YWxpZGF0aW9uU3RyZWFtLCB3cml0ZVN0cmVhbSlcbiAgICAgICAgXSk7XG5cbiAgICAgICAgLy8gQ2xlYXIgdGltZW91dFxuICAgICAgICBpZiAodGltZW91dEhhbmRsZSkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICAgICAgICB0aW1lb3V0SGFuZGxlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU0VDVVJJVFk6IEF0b21pYyByZW5hbWUgdG8gZmluYWwgZGVzdGluYXRpb25cbiAgICAgICAgYXdhaXQgZnMucmVuYW1lKHRlbXBQYXRoLCB2YWxpZGF0ZWRQYXRoKTtcblxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBTdHJlYW1pbmcgZG93bmxvYWQgY29tcGxldGVkOiAke2Rlc3RpbmF0aW9uUGF0aH0gKCR7ZG93bmxvYWRlZFNpemV9IGJ5dGVzLCAke2R1cmF0aW9ufW1zKWApO1xuXG4gICAgICAgIC8vIExvZyBzdWNjZXNzZnVsIHN0cmVhbWluZyBkb3dubG9hZFxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0ZJTEVfQ09QSUVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnc2VjdXJlX2Rvd25sb2FkZXInLFxuICAgICAgICAgIGRldGFpbHM6IGBTdHJlYW1lZCAke2Rvd25sb2FkZWRTaXplfSBieXRlcyBmcm9tICR7dXJsfSB0byAke2Rlc3RpbmF0aW9uUGF0aH1gLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBkZXN0aW5hdGlvblBhdGgsXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiBkb3dubG9hZGVkU2l6ZSxcbiAgICAgICAgICAgIGR1cmF0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gU0VDVVJJVFk6IEd1YXJhbnRlZWQgY2xlYW51cCBvZiB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLnVubGluayh0ZW1wUGF0aCk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBDbGVhbmVkIHVwIHRlbXAgZmlsZTogJHt0ZW1wUGF0aH1gKTtcbiAgICAgICAgfSBjYXRjaCAoY2xlYW51cEVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBjbGVhbiB1cCB0ZW1wIGZpbGUgJHt0ZW1wUGF0aH06ICR7Y2xlYW51cEVycm9yfWApO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHRpbWVvdXRIYW5kbGUpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBsb2dnZXIuZXJyb3IoYFN0cmVhbWluZyBkb3dubG9hZCBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuXG4gICAgICAvLyBMb2cgZmFpbGVkIHN0cmVhbWluZyBkb3dubG9hZFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnc2VjdXJlX2Rvd25sb2FkZXInLFxuICAgICAgICBkZXRhaWxzOiBgU3RyZWFtaW5nIGRvd25sb2FkIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgIGVycm9yVHlwZTogZXJyb3IgaW5zdGFuY2VvZiBEb3dubG9hZEVycm9yID8gZXJyb3IuY29kZSA6ICdVTktOT1dOJ1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIHRocm93IERvd25sb2FkRXJyb3IudGltZW91dEVycm9yKGBEb3dubG9hZCB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIERvd25sb2FkRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHRocm93IERvd25sb2FkRXJyb3IubmV0d29ya0Vycm9yKFxuICAgICAgICBgU3RyZWFtaW5nIGRvd25sb2FkIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBVUkwgZm9ybWF0IGFuZCBzZWN1cml0eSB3aXRoIFVuaWNvZGUgbm9ybWFsaXphdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVVybCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdXJsIHx8IHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBEb3dubG9hZEVycm9yLnZhbGlkYXRpb25FcnJvcignVVJMIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gU0VDVVJJVFkgRklYOiBETUNQLVNFQy0wMDQgLSBVbmljb2RlIG5vcm1hbGl6YXRpb24gb24gdXNlciBpbnB1dFxuICAgIGNvbnN0IHVuaWNvZGVWYWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodXJsKTtcbiAgICBjb25zdCBub3JtYWxpemVkVXJsID0gdW5pY29kZVZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgXG4gICAgaWYgKCF1bmljb2RlVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ3NlY3VyZV9kb3dubG9hZGVyJyxcbiAgICAgICAgZGV0YWlsczogYFVSTCBjb250YWlucyBzdXNwaWNpb3VzIFVuaWNvZGUgcGF0dGVybnM6ICR7dW5pY29kZVZhbGlkYXRpb24uZGV0ZWN0ZWRJc3N1ZXM/LmpvaW4oJywgJyl9YCxcbiAgICAgICAgbWV0YWRhdGE6IHsgb3JpZ2luYWxVcmw6IHVybCwgbm9ybWFsaXplZFVybCB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIG5vcm1hbGl6ZWQgVVJMIGZvciBmdXJ0aGVyIHZhbGlkYXRpb25cbiAgICB1cmwgPSBub3JtYWxpemVkVXJsO1xuXG4gICAgbGV0IHBhcnNlZFVybDogVVJMO1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWRVcmwgPSBuZXcgVVJMKHVybCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IERvd25sb2FkRXJyb3IudmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIFVSTCBmb3JtYXQ6ICR7dXJsfWApO1xuICAgIH1cblxuICAgIC8vIFNFQ1VSSVRZOiBPbmx5IGFsbG93IEhUVFBTIGFuZCBIVFRQIHByb3RvY29sc1xuICAgIGlmICghWydodHRwczonLCAnaHR0cDonXS5pbmNsdWRlcyhwYXJzZWRVcmwucHJvdG9jb2wpKSB7XG4gICAgICB0aHJvdyBEb3dubG9hZEVycm9yLnNlY3VyaXR5RXJyb3IoYFVuc3VwcG9ydGVkIHByb3RvY29sOiAke3BhcnNlZFVybC5wcm90b2NvbH0uIE9ubHkgSFRUUC9IVFRQUyBhbGxvd2VkLmApO1xuICAgIH1cblxuICAgIC8vIFNFQ1VSSVRZOiBQcmV2ZW50IHJlcXVlc3RzIHRvIGxvY2FsaG9zdC9wcml2YXRlIG5ldHdvcmtzXG4gICAgY29uc3QgaG9zdG5hbWUgPSBwYXJzZWRVcmwuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoaG9zdG5hbWUgPT09ICdsb2NhbGhvc3QnIHx8IGhvc3RuYW1lID09PSAnMTI3LjAuMC4xJyB8fCBob3N0bmFtZSA9PT0gJzo6MScpIHtcbiAgICAgIHRocm93IERvd25sb2FkRXJyb3Iuc2VjdXJpdHlFcnJvcignRG93bmxvYWRzIGZyb20gbG9jYWxob3N0IGFyZSBub3QgYWxsb3dlZCcpO1xuICAgIH1cblxuICAgIC8vIFNFQ1VSSVRZOiBDaGVjayBmb3IgcHJpdmF0ZSBJUCByYW5nZXMgKGJhc2ljIHByb3RlY3Rpb24pXG4gICAgaWYgKGhvc3RuYW1lLnN0YXJ0c1dpdGgoJzE5Mi4xNjguJykgfHwgaG9zdG5hbWUuc3RhcnRzV2l0aCgnMTAuJykgfHwgaG9zdG5hbWUuc3RhcnRzV2l0aCgnMTcyLicpKSB7XG4gICAgICB0aHJvdyBEb3dubG9hZEVycm9yLnNlY3VyaXR5RXJyb3IoJ0Rvd25sb2FkcyBmcm9tIHByaXZhdGUgSVAgcmFuZ2VzIGFyZSBub3QgYWxsb3dlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBkZXN0aW5hdGlvbiBwYXRoIGZvciBzZWN1cml0eVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZURlc3RpbmF0aW9uUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIGV4aXN0aW5nIFBhdGhWYWxpZGF0b3IgZm9yIGNvbXByZWhlbnNpdmUgcGF0aCB2YWxpZGF0aW9uXG4gICAgICByZXR1cm4gYXdhaXQgUGF0aFZhbGlkYXRvci52YWxpZGF0ZVBlcnNvbmFQYXRoKGZpbGVQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci5zZWN1cml0eUVycm9yKFxuICAgICAgICBgSW52YWxpZCBkZXN0aW5hdGlvbiBwYXRoOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBjb250ZW50IHdpdGggc2l6ZSBhbmQgdGltZW91dCBsaW1pdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hXaXRoTGltaXRzKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG1heFNpemU6IG51bWJlcixcbiAgICB0aW1lb3V0OiBudW1iZXIsXG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdGltZW91dEhhbmRsZSA9IHNldFRpbWVvdXQoKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC1TZWN1cmVEb3dubG9hZGVyLzEuMCcsXG4gICAgICAgICAgLi4uaGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNFQ1VSSVRZOiBDaGVjayBDb250ZW50LUxlbmd0aCBoZWFkZXIgaWYgYXZhaWxhYmxlXG4gICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICBpZiAoY29udGVudExlbmd0aCAmJiBwYXJzZUludChjb250ZW50TGVuZ3RoLCAxMCkgPiBtYXhTaXplKSB7XG4gICAgICAgIHRocm93IERvd25sb2FkRXJyb3Iuc2VjdXJpdHlFcnJvcihcbiAgICAgICAgICBgQ29udGVudCBzaXplICR7Y29udGVudExlbmd0aH0gZXhjZWVkcyBsaW1pdCBvZiAke21heFNpemV9IGJ5dGVzYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWFkIGNvbnRlbnQgd2l0aCBzaXplIGNoZWNraW5nXG4gICAgICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICAgICAgbGV0IHRvdGFsU2l6ZSA9IDA7XG5cbiAgICAgIGlmICghcmVzcG9uc2UuYm9keSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc3BvbnNlIGJvZHkgaXMgbnVsbCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgIGlmIChkb25lKSBicmVhaztcblxuICAgICAgICAgIHRvdGFsU2l6ZSArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKHRvdGFsU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgICAgIHRocm93IERvd25sb2FkRXJyb3Iuc2VjdXJpdHlFcnJvcihcbiAgICAgICAgICAgICAgYENvbnRlbnQgc2l6ZSAke3RvdGFsU2l6ZX0gZXhjZWVkcyBsaW1pdCBvZiAke21heFNpemV9IGJ5dGVzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaHVua3MucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgICAgfVxuXG4gICAgICAvLyBDb21iaW5lIGNodW5rcyBhbmQgZGVjb2RlXG4gICAgICBjb25zdCB0b3RhbExlbmd0aCA9IGNodW5rcy5yZWR1Y2UoKHN1bSwgY2h1bmspID0+IHN1bSArIGNodW5rLmxlbmd0aCwgMCk7XG4gICAgICBjb25zdCBjb21iaW5lZCA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICAgICAgY29tYmluZWQuc2V0KGNodW5rLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcpLmRlY29kZShjb21iaW5lZCk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIHRocm93IERvd25sb2FkRXJyb3IudGltZW91dEVycm9yKGBSZXF1ZXN0IHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9bXNgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGNvbnRlbnQgdHlwZSBpZiBzcGVjaWZpZWRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVDb250ZW50VHlwZShjb250ZW50OiBzdHJpbmcsIGV4cGVjdGVkVHlwZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmFzaWMgY29udGVudCB0eXBlIHZhbGlkYXRpb24gYmFzZWQgb24gY29udGVudCBhbmFseXNpc1xuICAgIHN3aXRjaCAoZXhwZWN0ZWRUeXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIEpTT04ucGFyc2UoY29udGVudCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRocm93IERvd25sb2FkRXJyb3IudmFsaWRhdGlvbkVycm9yKCdDb250ZW50IGlzIG5vdCB2YWxpZCBKU09OJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd5YW1sJzpcbiAgICAgIGNhc2UgJ3ltbCc6XG4gICAgICAgIC8vIFVzZSBleGlzdGluZyBZQU1MIHZhbGlkYXRpb25cbiAgICAgICAgaWYgKCFTZWN1cml0eUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudChjb250ZW50KSkge1xuICAgICAgICAgIHRocm93IERvd25sb2FkRXJyb3IudmFsaWRhdGlvbkVycm9yKCdDb250ZW50IGlzIG5vdCB2YWxpZCBZQU1MJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtYXJrZG93bic6XG4gICAgICBjYXNlICdtZCc6XG4gICAgICAgIC8vIEJhc2ljIG1hcmtkb3duIHZhbGlkYXRpb24gKGNoZWNrIGZvciBmcm9udG1hdHRlciBmb3JtYXQpXG4gICAgICAgIGlmIChjb250ZW50LnN0YXJ0c1dpdGgoJy0tLScpKSB7XG4gICAgICAgICAgY29uc3QgZnJvbnRtYXR0ZXJFbmQgPSBjb250ZW50LmluZGV4T2YoJ1xcbi0tLVxcbicsIDMpO1xuICAgICAgICAgIGlmIChmcm9udG1hdHRlckVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IERvd25sb2FkRXJyb3IudmFsaWRhdGlvbkVycm9yKCdJbnZhbGlkIG1hcmtkb3duIGZyb250bWF0dGVyIGZvcm1hdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgTm8gc3BlY2lmaWMgdmFsaWRhdGlvbiBmb3IgY29udGVudCB0eXBlOiAke2V4cGVjdGVkVHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXRvbWljIGZpbGUgd3JpdGUgdXNpbmcgRmlsZUxvY2tNYW5hZ2VyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGF0b21pY1dyaXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IGBkb3dubG9hZDoke2ZpbGVQYXRofWA7XG4gICAgXG4gICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLndpdGhMb2NrKHJlc291cmNlLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIFVzZSBGaWxlTG9ja01hbmFnZXIncyBhdG9taWMgd3JpdGVcbiAgICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlyZWN0IGZpbGUgd3JpdGUgKG5vbi1hdG9taWMsIGZvciB3aGVuIGF0b21pYyBpcyBkaXNhYmxlZClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlyZWN0V3JpdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgXG4gICAgLy8gRGlyZWN0IHdyaXRlXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50LCAndXRmLTgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0ZW1wb3JhcnkgZmlsZSBwYXRoIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRUZW1wRmlsZVBhdGgob3JpZ2luYWxQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShvcmlnaW5hbFBhdGgpO1xuICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShvcmlnaW5hbFBhdGgpO1xuICAgIGNvbnN0IHJhbmRvbSA9IHJhbmRvbUJ5dGVzKDgpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCB0ZW1wRGlyID0gcGF0aC5qb2luKGRpciwgdGhpcy50ZW1wRGlyKTtcbiAgICBcbiAgICAvLyBFbnN1cmUgdGVtcCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgYXdhaXQgZnMubWtkaXIodGVtcERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgXG4gICAgcmV0dXJuIHBhdGguam9pbih0ZW1wRGlyLCBgJHtiYXNlbmFtZX0uJHtyYW5kb219LnRtcGApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHJhdGUgbGltaXRzIGZvciBkb3dubG9hZHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tSYXRlTGltaXQodXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBnbG9iYWwgcmF0ZSBsaW1pdFxuICAgIGNvbnN0IGdsb2JhbFN0YXR1cyA9IHRoaXMuZ2xvYmFsUmF0ZUxpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuICAgIGlmICghZ2xvYmFsU3RhdHVzLmFsbG93ZWQpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ3NlY3VyZV9kb3dubG9hZGVyJyxcbiAgICAgICAgZGV0YWlsczogYEdsb2JhbCBkb3dubG9hZCByYXRlIGxpbWl0IGV4Y2VlZGVkLiBSZXRyeSBhZnRlciAke2dsb2JhbFN0YXR1cy5yZXRyeUFmdGVyTXN9bXNgLFxuICAgICAgICBtZXRhZGF0YTogeyB1cmwsIHJldHJ5QWZ0ZXJNczogZ2xvYmFsU3RhdHVzLnJldHJ5QWZ0ZXJNcyB9XG4gICAgICB9KTtcbiAgICAgIHRocm93IERvd25sb2FkRXJyb3Iuc2VjdXJpdHlFcnJvcihcbiAgICAgICAgYERvd25sb2FkIHJhdGUgbGltaXQgZXhjZWVkZWQuIFBsZWFzZSByZXRyeSBhZnRlciAke01hdGguY2VpbChnbG9iYWxTdGF0dXMucmV0cnlBZnRlck1zISAvIDEwMDApfSBzZWNvbmRzYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBwZXItVVJMIHJhdGUgbGltaXRcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHVybCk7XG4gICAgY29uc3QgdXJsS2V5ID0gYCR7cGFyc2VkVXJsLmhvc3RuYW1lfToke3BhcnNlZFVybC5wb3J0IHx8IChwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonID8gJzQ0MycgOiAnODAnKX1gO1xuICAgIFxuICAgIGlmICghdGhpcy51cmxSYXRlTGltaXRlcnMuaGFzKHVybEtleSkpIHtcbiAgICAgIHRoaXMudXJsUmF0ZUxpbWl0ZXJzLnNldCh1cmxLZXksIG5ldyBSYXRlTGltaXRlcih7XG4gICAgICAgIG1heFJlcXVlc3RzOiAxMCwgLy8gMTAgcmVxdWVzdHMgcGVyIGhvdXIgcGVyIFVSTFxuICAgICAgICB3aW5kb3dNczogNjAgKiA2MCAqIDEwMDAsXG4gICAgICAgIG1pbkRlbGF5TXM6IDUwMDAgLy8gNSBzZWNvbmQgbWluaW11bSBkZWxheSBiZXR3ZWVuIHJlcXVlc3RzIHRvIHNhbWUgVVJMXG4gICAgICB9KSk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHVybExpbWl0ZXIgPSB0aGlzLnVybFJhdGVMaW1pdGVycy5nZXQodXJsS2V5KSE7XG4gICAgY29uc3QgdXJsU3RhdHVzID0gdXJsTGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgaWYgKCF1cmxTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnc2VjdXJlX2Rvd25sb2FkZXInLFxuICAgICAgICBkZXRhaWxzOiBgUGVyLVVSTCBkb3dubG9hZCByYXRlIGxpbWl0IGV4Y2VlZGVkIGZvciAke3VybEtleX0uIFJldHJ5IGFmdGVyICR7dXJsU3RhdHVzLnJldHJ5QWZ0ZXJNc31tc2AsXG4gICAgICAgIG1ldGFkYXRhOiB7IHVybCwgdXJsS2V5LCByZXRyeUFmdGVyTXM6IHVybFN0YXR1cy5yZXRyeUFmdGVyTXMgfVxuICAgICAgfSk7XG4gICAgICB0aHJvdyBEb3dubG9hZEVycm9yLnNlY3VyaXR5RXJyb3IoXG4gICAgICAgIGBUb28gbWFueSByZXF1ZXN0cyB0byAke3VybEtleX0uIFBsZWFzZSByZXRyeSBhZnRlciAke01hdGguY2VpbCh1cmxTdGF0dXMucmV0cnlBZnRlck1zISAvIDEwMDApfSBzZWNvbmRzYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb25zdW1lIHJhdGUgbGltaXQgdG9rZW5zXG4gICAgdGhpcy5nbG9iYWxSYXRlTGltaXRlci5jb25zdW1lVG9rZW4oKTtcbiAgICB1cmxMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGNvbnRlbnQgY2hlY2tzdW0gZm9yIGludGVncml0eSB2ZXJpZmljYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVDaGVja3N1bShjb250ZW50OiBzdHJpbmcsIGV4cGVjdGVkQ2hlY2tzdW06IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBlY3RlZCA9IGV4cGVjdGVkQ2hlY2tzdW0udG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgY2hlY2tzdW0gZm9ybWF0IChTSEEtMjU2IHNob3VsZCBiZSA2NCBoZXggY2hhcmFjdGVycylcbiAgICBpZiAoIS9eW2EtZjAtOV17NjR9JC8udGVzdChub3JtYWxpemVkRXhwZWN0ZWQpKSB7XG4gICAgICB0aHJvdyBEb3dubG9hZEVycm9yLnZhbGlkYXRpb25FcnJvcignSW52YWxpZCBjaGVja3N1bSBmb3JtYXQuIEV4cGVjdGVkIFNIQS0yNTYgKDY0IGhleCBjaGFyYWN0ZXJzKScpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRCdWZmZXIgPSBCdWZmZXIuZnJvbShjb250ZW50LCAndXRmLTgnKTtcbiAgICBjb25zdCBhY3R1YWxDaGVja3N1bSA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShjb250ZW50QnVmZmVyKS5kaWdlc3QoJ2hleCcpO1xuICAgIFxuICAgIGlmIChhY3R1YWxDaGVja3N1bSAhPT0gbm9ybWFsaXplZEV4cGVjdGVkKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnc2VjdXJlX2Rvd25sb2FkZXInLFxuICAgICAgICBkZXRhaWxzOiBgQ2hlY2tzdW0gbWlzbWF0Y2ggZGV0ZWN0ZWQgLSBwb3NzaWJsZSBjb250ZW50IHRhbXBlcmluZ2AsXG4gICAgICAgIG1ldGFkYXRhOiB7IFxuICAgICAgICAgIGV4cGVjdGVkQ2hlY2tzdW06IG5vcm1hbGl6ZWRFeHBlY3RlZCxcbiAgICAgICAgICBhY3R1YWxDaGVja3N1bSxcbiAgICAgICAgICBjb250ZW50TGVuZ3RoOiBjb250ZW50Lmxlbmd0aFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRocm93IERvd25sb2FkRXJyb3Iuc2VjdXJpdHlFcnJvcihcbiAgICAgICAgYENvbnRlbnQgY2hlY2tzdW0gdmVyaWZpY2F0aW9uIGZhaWxlZC4gRXhwZWN0ZWQ6ICR7bm9ybWFsaXplZEV4cGVjdGVkfSwgR290OiAke2FjdHVhbENoZWNrc3VtfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKGBDaGVja3N1bSB2YWxpZGF0aW9uIHBhc3NlZDogJHthY3R1YWxDaGVja3N1bX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjb250ZW50IHZhbGlkYXRvciB0aGF0IGNvbWJpbmVzIG11bHRpcGxlIHZhbGlkYXRvcnNcbiAgICovXG4gIHN0YXRpYyBjb21iaW5lVmFsaWRhdG9ycyguLi52YWxpZGF0b3JzOiBDb250ZW50VmFsaWRhdG9yRnVuY3Rpb25bXSk6IENvbnRlbnRWYWxpZGF0b3JGdW5jdGlvbiB7XG4gICAgcmV0dXJuIGFzeW5jIChjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPFZhbGlkYXRpb25SZXN1bHQ+ID0+IHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIHZhbGlkYXRvcnMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmFsaWRhdG9yKGNvbnRlbnQpO1xuICAgICAgICBpZiAoIXJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSB9O1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY29udGVudCB2YWxpZGF0b3IgZm9yIEpTT04gY29udGVudFxuICAgKi9cbiAgc3RhdGljIGpzb25WYWxpZGF0b3IoKTogQ29udGVudFZhbGlkYXRvckZ1bmN0aW9uIHtcbiAgICByZXR1cm4gYXN5bmMgKGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdD4gPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGBJbnZhbGlkIEpTT046ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdtZWRpdW0nXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjb250ZW50IHZhbGlkYXRvciBmb3IgWUFNTCBjb250ZW50XG4gICAqL1xuICBzdGF0aWMgeWFtbFZhbGlkYXRvcigpOiBDb250ZW50VmFsaWRhdG9yRnVuY3Rpb24ge1xuICAgIHJldHVybiBhc3luYyAoY29udGVudDogc3RyaW5nKTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PiA9PiB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gU2VjdXJpdHlDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlWWFtbENvbnRlbnQoY29udGVudCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGlzVmFsaWQgPyB1bmRlZmluZWQgOiAnSW52YWxpZCBvciBtYWxpY2lvdXMgWUFNTCBjb250ZW50JyxcbiAgICAgICAgc2V2ZXJpdHk6IGlzVmFsaWQgPyAnbG93JyA6ICdoaWdoJ1xuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNvbnRlbnQgdmFsaWRhdG9yIGZvciBtYXJrZG93biBjb250ZW50XG4gICAqL1xuICBzdGF0aWMgbWFya2Rvd25WYWxpZGF0b3IoKTogQ29udGVudFZhbGlkYXRvckZ1bmN0aW9uIHtcbiAgICByZXR1cm4gYXN5bmMgKGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdD4gPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVXNlIGV4aXN0aW5nIHBlcnNvbmEgY29udGVudCBzYW5pdGl6YXRpb24gZm9yIG1hcmtkb3duXG4gICAgICAgIFNlY3VyaXR5Q29udGVudFZhbGlkYXRvci5zYW5pdGl6ZVBlcnNvbmFDb250ZW50KGNvbnRlbnQpO1xuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlIH07XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yTWVzc2FnZTogYEludmFsaWQgbWFya2Rvd246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICAgc2V2ZXJpdHk6IGVycm9yIGluc3RhbmNlb2YgU2VjdXJpdHlFcnJvciA/ICdjcml0aWNhbCcgOiAnbWVkaXVtJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY29udGVudCB2YWxpZGF0b3Igd2l0aCBzaXplIGxpbWl0c1xuICAgKi9cbiAgc3RhdGljIHNpemVWYWxpZGF0b3IobWF4U2l6ZTogbnVtYmVyKTogQ29udGVudFZhbGlkYXRvckZ1bmN0aW9uIHtcbiAgICByZXR1cm4gYXN5bmMgKGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdD4gPT4ge1xuICAgICAgY29uc3Qgc2l6ZSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGNvbnRlbnQsICd1dGYtOCcpO1xuICAgICAgaWYgKHNpemUgPiBtYXhTaXplKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBgQ29udGVudCBzaXplICR7c2l6ZX0gZXhjZWVkcyBsaW1pdCBvZiAke21heFNpemV9IGJ5dGVzYCxcbiAgICAgICAgICBzZXZlcml0eTogJ2hpZ2gnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlIH07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjb250ZW50IHZhbGlkYXRvciB0aGF0IGNoZWNrcyBmb3IgZm9yYmlkZGVuIHBhdHRlcm5zXG4gICAqL1xuICBzdGF0aWMgcGF0dGVyblZhbGlkYXRvcihcbiAgICBmb3JiaWRkZW5QYXR0ZXJuczogUmVnRXhwW10sXG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSAnRm9yYmlkZGVuIHBhdHRlcm4gZGV0ZWN0ZWQnXG4gICk6IENvbnRlbnRWYWxpZGF0b3JGdW5jdGlvbiB7XG4gICAgcmV0dXJuIGFzeW5jIChjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPFZhbGlkYXRpb25SZXN1bHQ+ID0+IHtcbiAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBmb3JiaWRkZW5QYXR0ZXJucykge1xuICAgICAgICBpZiAocGF0dGVybi50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdoaWdoJyxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7IHBhdHRlcm46IHBhdHRlcm4uc291cmNlIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlIH07XG4gICAgfTtcbiAgfVxufSJdfQ==
759
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjdXJlRG93bmxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9TZWN1cmVEb3dubG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdURHO0FBRUgsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixJQUFJLHdCQUF3QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUE0RHJDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWMsU0FBUSxLQUFLO0lBR3BCO0lBQ0E7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RCxPQUFPLEtBQUssRUFBRSxPQUFlLEVBQTZCLEVBQUU7WUFDMUQsS0FBSyxNQUFNLE9BQU8sSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDMUIsT0FBTzt3QkFDTCxPQUFPLEVBQUUsS0FBSzt3QkFDZCxZQUFZO3dCQUNaLFFBQVEsRUFBRSxNQUFNO3dCQUNoQixRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRTtxQkFDdEMsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZWN1cmVEb3dubG9hZGVyIC0gUmV1c2FibGUgdXRpbGl0eSBmb3Igc2FmZSBjb250ZW50IGRvd25sb2Fkc1xuICogXG4gKiBJbXBsZW1lbnRzIHRoZSB2YWxpZGF0ZS1iZWZvcmUtd3JpdGUgcGF0dGVybiB3aXRoIGNvbXByZWhlbnNpdmUgc2VjdXJpdHkgZmVhdHVyZXM6XG4gKiAtIENvbnRlbnQgdmFsaWRhdGlvbiBob29rcyAoY3VzdG9taXphYmxlIHZhbGlkYXRvcnMpXG4gKiAtIEF0b21pYyBmaWxlIG9wZXJhdGlvbnMgd2l0aCB0ZW1wIGZpbGVzXG4gKiAtIEd1YXJhbnRlZWQgY2xlYW51cCBvbiBmYWlsdXJlXG4gKiAtIE1lbW9yeS1lZmZpY2llbnQgc3RyZWFtaW5nIGZvciBsYXJnZSBmaWxlc1xuICogLSBTaXplIGxpbWl0cyB0byBwcmV2ZW50IERvUyBhdHRhY2tzXG4gKiAtIFBhdGggdmFsaWRhdGlvbiB0byBwcmV2ZW50IHRyYXZlcnNhbFxuICogLSBUaW1lb3V0IGhhbmRsaW5nIGZvciBuZXR3b3JrIG9wZXJhdGlvbnNcbiAqIC0gQ29udGVudCB0eXBlIHZhbGlkYXRpb25cbiAqIFxuICogVXNhZ2UgRXhhbXBsZXM6XG4gKiBcbiAqIC8vIEJhc2ljIGRvd25sb2FkIHdpdGggdmFsaWRhdGlvblxuICogY29uc3QgZG93bmxvYWRlciA9IG5ldyBTZWN1cmVEb3dubG9hZGVyKCk7XG4gKiBhd2FpdCBkb3dubG9hZGVyLmRvd25sb2FkVG9GaWxlKFxuICogICAnaHR0cHM6Ly9leGFtcGxlLmNvbS9maWxlLm1kJyxcbiAqICAgJy4vZG93bmxvYWRzL2ZpbGUubWQnLFxuICogICB7XG4gKiAgICAgdmFsaWRhdG9yOiBhc3luYyAoY29udGVudCkgPT4gKHtcbiAqICAgICAgIGlzVmFsaWQ6ICFjb250ZW50LmluY2x1ZGVzKCdtYWxpY2lvdXMnKSxcbiAqICAgICAgIGVycm9yTWVzc2FnZTogY29udGVudC5pbmNsdWRlcygnbWFsaWNpb3VzJykgPyAnTWFsaWNpb3VzIGNvbnRlbnQgZGV0ZWN0ZWQnIDogdW5kZWZpbmVkXG4gKiAgICAgfSksXG4gKiAgICAgbWF4U2l6ZTogMTAyNCAqIDEwMjQsIC8vIDFNQiBsaW1pdFxuICogICAgIHRpbWVvdXQ6IDMwMDAwIC8vIDMwIHNlY29uZCB0aW1lb3V0XG4gKiAgIH1cbiAqICk7XG4gKiBcbiAqIC8vIERvd25sb2FkIHRvIG1lbW9yeSB3aXRoIHZhbGlkYXRpb25cbiAqIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBkb3dubG9hZGVyLmRvd25sb2FkVG9NZW1vcnkoXG4gKiAgICdodHRwczovL2V4YW1wbGUuY29tL2RhdGEuanNvbicsXG4gKiAgIHtcbiAqICAgICB2YWxpZGF0b3I6IGFzeW5jIChjb250ZW50KSA9PiB7XG4gKiAgICAgICB0cnkge1xuICogICAgICAgICBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICogICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlIH07XG4gKiAgICAgICB9IGNhdGNoIHtcbiAqICAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9yTWVzc2FnZTogJ0ludmFsaWQgSlNPTiBmb3JtYXQnIH07XG4gKiAgICAgICB9XG4gKiAgICAgfVxuICogICB9XG4gKiApO1xuICogXG4gKiAvLyBTdHJlYW1pbmcgZG93bmxvYWQgZm9yIGxhcmdlIGZpbGVzXG4gKiBhd2FpdCBkb3dubG9hZGVyLmRvd25sb2FkU3RyZWFtKFxuICogICAnaHR0cHM6Ly9leGFtcGxlLmNvbS9sYXJnZS1maWxlLnppcCcsXG4gKiAgICcuL2Rvd25sb2Fkcy9sYXJnZS1maWxlLnppcCcsXG4gKiAgIHtcbiAqICAgICBzdHJlYW1WYWxpZGF0b3I6IChjaHVuaykgPT4gIWNodW5rLmluY2x1ZGVzKEJ1ZmZlci5mcm9tKCdWSVJVUycpKSxcbiAqICAgICBtYXhTaXplOiAxMDAgKiAxMDI0ICogMTAyNCwgLy8gMTAwTUIgbGltaXRcbiAqICAgICB0aW1lb3V0OiAzMDAwMDAgLy8gNSBtaW51dGUgdGltZW91dFxuICogICB9XG4gKiApO1xuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByYW5kb21CeXRlcywgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBwaXBlbGluZSB9IGZyb20gJ3N0cmVhbS9wcm9taXNlcyc7XG5pbXBvcnQgeyBjcmVhdGVXcml0ZVN0cmVhbSB9IGZyb20gJ2ZzJztcblxuaW1wb3J0IHsgU2VjdXJpdHlFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9TZWN1cml0eUVycm9yLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIGFzIFNlY3VyaXR5Q29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgUGF0aFZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3BhdGhWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFJhdGVMaW1pdGVyIH0gZnJvbSAnLi9SYXRlTGltaXRlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbi8qKlxuICogUmVzdWx0IG9mIGNvbnRlbnQgdmFsaWRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXN1bHQge1xuICAvKiogV2hldGhlciB0aGUgY29udGVudCBpcyB2YWxpZCBhbmQgc2FmZSAqL1xuICBpc1ZhbGlkOiBib29sZWFuO1xuICAvKiogRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxlZCAqL1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG4gIC8qKiBTZXZlcml0eSBvZiBhbnkgZGV0ZWN0ZWQgaXNzdWVzICovXG4gIHNldmVyaXR5PzogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCc7XG4gIC8qKiBBZGRpdGlvbmFsIG1ldGFkYXRhIGFib3V0IHZhbGlkYXRpb24gKi9cbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIENvbnRlbnQgdmFsaWRhdG9yIGZ1bmN0aW9uIHR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgQ29udGVudFZhbGlkYXRvckZ1bmN0aW9uID0gKGNvbnRlbnQ6IHN0cmluZykgPT4gUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PjtcblxuLyoqXG4gKiBTdHJlYW0gY2h1bmsgdmFsaWRhdG9yIGZ1bmN0aW9uIHR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgU3RyZWFtVmFsaWRhdG9yID0gKGNodW5rOiBVaW50OEFycmF5KSA9PiBib29sZWFuO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGRvd25sb2FkIG9wZXJhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3dubG9hZE9wdGlvbnMge1xuICAvKiogQ3VzdG9tIGNvbnRlbnQgdmFsaWRhdG9yIGZ1bmN0aW9uICovXG4gIHZhbGlkYXRvcj86IENvbnRlbnRWYWxpZGF0b3JGdW5jdGlvbjtcbiAgLyoqIE1heGltdW0gZmlsZSBzaXplIGluIGJ5dGVzIChkZWZhdWx0OiBTRUNVUklUWV9MSU1JVFMuTUFYX0ZJTEVfU0laRSkgKi9cbiAgbWF4U2l6ZT86IG51bWJlcjtcbiAgLyoqIE5ldHdvcmsgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDMwMDAwKSAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byB1c2UgYXRvbWljIGZpbGUgb3BlcmF0aW9ucyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgYXRvbWljPzogYm9vbGVhbjtcbiAgLyoqIEV4cGVjdGVkIGNvbnRlbnQgdHlwZSAoZm9yIHZhbGlkYXRpb24pICovXG4gIGV4cGVjdGVkQ29udGVudFR5cGU/OiBzdHJpbmc7XG4gIC8qKiBDdXN0b20gSFRUUCBoZWFkZXJzICovXG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogRXhwZWN0ZWQgU0hBLTI1NiBjaGVja3N1bSBmb3IgaW50ZWdyaXR5IHZhbGlkYXRpb24gKi9cbiAgZXhwZWN0ZWRDaGVja3N1bT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdHJlYW1pbmcgZG93bmxvYWRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtRG93bmxvYWRPcHRpb25zIHtcbiAgLyoqIENodW5rLWxldmVsIHZhbGlkYXRvciBmb3Igc3RyZWFtaW5nIHZhbGlkYXRpb24gKi9cbiAgc3RyZWFtVmFsaWRhdG9yPzogU3RyZWFtVmFsaWRhdG9yO1xuICAvKiogTWF4aW11bSBmaWxlIHNpemUgaW4gYnl0ZXMgKGRlZmF1bHQ6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRklMRV9TSVpFKSAqL1xuICBtYXhTaXplPzogbnVtYmVyO1xuICAvKiogTmV0d29yayB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMzAwMDApICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBDdXN0b20gSFRUUCBoZWFkZXJzICovXG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIEN1c3RvbSBlcnJvciB0eXBlcyBmb3IgZGlmZmVyZW50IGZhaWx1cmUgc2NlbmFyaW9zXG4gKi9cbmV4cG9ydCBjbGFzcyBEb3dubG9hZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGNvZGU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luYWxFcnJvcj86IEVycm9yXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdEb3dubG9hZEVycm9yJztcbiAgfVxuXG4gIHN0YXRpYyBuZXR3b3JrRXJyb3IobWVzc2FnZTogc3RyaW5nLCBvcmlnaW5hbEVycm9yPzogRXJyb3IpOiBEb3dubG9hZEVycm9yIHtcbiAgICByZXR1cm4gbmV3IERvd25sb2FkRXJyb3IobWVzc2FnZSwgJ05FVFdPUktfRVJST1InLCBvcmlnaW5hbEVycm9yKTtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0aW9uRXJyb3IobWVzc2FnZTogc3RyaW5nKTogRG93bmxvYWRFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBEb3dubG9hZEVycm9yKG1lc3NhZ2UsICdWQUxJREFUSU9OX0VSUk9SJyk7XG4gIH1cblxuICBzdGF0aWMgc2VjdXJpdHlFcnJvcihtZXNzYWdlOiBzdHJpbmcpOiBEb3dubG9hZEVycm9yIHtcbiAgICByZXR1cm4gbmV3IERvd25sb2FkRXJyb3IobWVzc2FnZSwgJ1NFQ1VSSVRZX0VSUk9SJyk7XG4gIH1cblxuICBzdGF0aWMgdGltZW91dEVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IERvd25sb2FkRXJyb3Ige1xuICAgIHJldHVybiBuZXcgRG93bmxvYWRFcnJvcihtZXNzYWdlLCAnVElNRU9VVF9FUlJPUicpO1xuICB9XG5cbiAgc3RhdGljIGZpbGVzeXN0ZW1FcnJvcihtZXNzYWdlOiBzdHJpbmcsIG9yaWdpbmFsRXJyb3I/OiBFcnJvcik6IERvd25sb2FkRXJyb3Ige1xuICAgIHJldHVybiBuZXcgRG93bmxvYWRFcnJvcihtZXNzYWdlLCAnRklMRVNZU1RFTV9FUlJPUicsIG9yaWdpbmFsRXJyb3IpO1xuICB9XG59XG5cbi8qKlxuICogU2VjdXJlRG93bmxvYWRlciAtIEltcGxlbWVudHMgdmFsaWRhdGUtYmVmb3JlLXdyaXRlIHBhdHRlcm4gZm9yIHNhZmUgZG93bmxvYWRzXG4gKiBcbiAqIEtleSBTZWN1cml0eSBGZWF0dXJlczpcbiAqIDEuIFZBTElEQVRFLUJFRk9SRS1XUklURTogQWxsIGNvbnRlbnQgdmFsaWRhdGlvbiBvY2N1cnMgYmVmb3JlIGFueSBkaXNrIG9wZXJhdGlvbnNcbiAqIDIuIEFUT01JQyBPUEVSQVRJT05TOiBVc2VzIHRlbXBvcmFyeSBmaWxlcyB3aXRoIGF0b21pYyByZW5hbWUgdG8gcHJldmVudCBjb3JydXB0aW9uXG4gKiAzLiBHVUFSQU5URUVEIENMRUFOVVA6IEF1dG9tYXRpYyBjbGVhbnVwIG9mIHRlbXBvcmFyeSBmaWxlcyBvbiBhbnkgZmFpbHVyZVxuICogNC4gU0laRSBMSU1JVFM6IFByZXZlbnRzIERvUyBhdHRhY2tzIHRocm91Z2ggbGFyZ2UgZmlsZSBkb3dubG9hZHNcbiAqIDUuIFBBVEggVkFMSURBVElPTjogUHJldmVudHMgZGlyZWN0b3J5IHRyYXZlcnNhbCBhdHRhY2tzXG4gKiA2LiBUSU1FT1VUIFBST1RFQ1RJT046IFByZXZlbnRzIGhhbmdpbmcgbmV0d29yayBvcGVyYXRpb25zXG4gKiA3LiBDT05URU5UIFZBTElEQVRJT046IEV4dGVuc2libGUgdmFsaWRhdGlvbiBzeXN0ZW0gZm9yIGRpZmZlcmVudCBjb250ZW50IHR5cGVzXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWN1cmVEb3dubG9hZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0VGltZW91dDogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRNYXhTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVtcERpcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbFJhdGVMaW1pdGVyOiBSYXRlTGltaXRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB1cmxSYXRlTGltaXRlcnM6IE1hcDxzdHJpbmcsIFJhdGVMaW1pdGVyPjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzoge1xuICAgIGRlZmF1bHRUaW1lb3V0PzogbnVtYmVyO1xuICAgIGRlZmF1bHRNYXhTaXplPzogbnVtYmVyO1xuICAgIHRlbXBEaXI/OiBzdHJpbmc7XG4gICAgcmF0ZUxpbWl0T3B0aW9ucz86IHtcbiAgICAgIG1heFJlcXVlc3RzUGVyVXJsPzogbnVtYmVyO1xuICAgICAgbWF4R2xvYmFsUmVxdWVzdHM/OiBudW1iZXI7XG4gICAgICB3aW5kb3dNcz86IG51bWJlcjtcbiAgICB9O1xuICB9KSB7XG4gICAgdGhpcy5kZWZhdWx0VGltZW91dCA9IG9wdGlvbnM/LmRlZmF1bHRUaW1lb3V0IHx8IDMwMDAwOyAvLyAzMCBzZWNvbmRzXG4gICAgdGhpcy5kZWZhdWx0TWF4U2l6ZSA9IG9wdGlvbnM/LmRlZmF1bHRNYXhTaXplIHx8IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRklMRV9TSVpFO1xuICAgIHRoaXMudGVtcERpciA9IG9wdGlvbnM/LnRlbXBEaXIgfHwgJy50bXAnO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgcmF0ZSBsaW1pdGVyc1xuICAgIGNvbnN0IHJhdGVMaW1pdENvbmZpZyA9IG9wdGlvbnM/LnJhdGVMaW1pdE9wdGlvbnMgfHwge307XG4gICAgdGhpcy5nbG9iYWxSYXRlTGltaXRlciA9IG5ldyBSYXRlTGltaXRlcih7XG4gICAgICBtYXhSZXF1ZXN0czogcmF0ZUxpbWl0Q29uZmlnLm1heEdsb2JhbFJlcXVlc3RzIHx8IDEwMCwgLy8gMTAwIGRvd25sb2FkcyBwZXIgaG91ciBnbG9iYWxseVxuICAgICAgd2luZG93TXM6IHJhdGVMaW1pdENvbmZpZy53aW5kb3dNcyB8fCA2MCAqIDYwICogMTAwMCwgLy8gMSBob3VyXG4gICAgICBtaW5EZWxheU1zOiAxMDAwIC8vIE1pbmltdW0gMSBzZWNvbmQgYmV0d2VlbiByZXF1ZXN0c1xuICAgIH0pO1xuICAgIHRoaXMudXJsUmF0ZUxpbWl0ZXJzID0gbmV3IE1hcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkIGNvbnRlbnQgdG8gYSBmaWxlIHdpdGggdmFsaWRhdGlvblxuICAgKiBcbiAgICogU0VDVVJJVFk6IEltcGxlbWVudHMgdmFsaWRhdGUtYmVmb3JlLXdyaXRlIHBhdHRlcm46XG4gICAqIDEuIERvd25sb2FkIGNvbnRlbnQgdG8gbWVtb3J5XG4gICAqIDIuIFZhbGlkYXRlIGFsbCBjb250ZW50XG4gICAqIDMuIE9ubHkgdGhlbiB3cml0ZSB0byBkaXNrIGF0b21pY2FsbHlcbiAgICogXG4gICAqIEBwYXJhbSB1cmwgLSBVUkwgdG8gZG93bmxvYWQgZnJvbVxuICAgKiBAcGFyYW0gZGVzdGluYXRpb25QYXRoIC0gTG9jYWwgZmlsZSBwYXRoIHRvIHNhdmUgdG9cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBEb3dubG9hZCBhbmQgdmFsaWRhdGlvbiBvcHRpb25zXG4gICAqL1xuICBhc3luYyBkb3dubG9hZFRvRmlsZShcbiAgICB1cmw6IHN0cmluZyxcbiAgICBkZXN0aW5hdGlvblBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zOiBEb3dubG9hZE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgU3RhcnRpbmcgc2VjdXJlIGRvd25sb2FkIGZyb20gJHt1cmx9IHRvICR7ZGVzdGluYXRpb25QYXRofWApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBWYWxpZGF0ZSBVUkwgYW5kIGRlc3RpbmF0aW9uIHBhdGggZmlyc3RcbiAgICAgIHRoaXMudmFsaWRhdGVVcmwodXJsKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFBhdGggPSBhd2FpdCB0aGlzLnZhbGlkYXRlRGVzdGluYXRpb25QYXRoKGRlc3RpbmF0aW9uUGF0aCk7XG5cbiAgICAgIC8vIFNFQ1VSSVRZOiBDaGVjayBpZiBmaWxlIGFscmVhZHkgZXhpc3RzIChwcmV2ZW50IGFjY2lkZW50YWwgb3ZlcndyaXRlcylcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2Vzcyh2YWxpZGF0ZWRQYXRoKTtcbiAgICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci5maWxlc3lzdGVtRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHM6ICR7ZGVzdGluYXRpb25QYXRofWApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IGlmIGl0J3Mgbm90IGEgXCJmaWxlIG5vdCBmb3VuZFwiIGVycm9yXG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBwcm9jZWVkIHdpdGggZG93bmxvYWRcbiAgICAgIH1cblxuICAgICAgLy8gU1RFUCAxOiBDaGVjayByYXRlIGxpbWl0cyBiZWZvcmUgZG93bmxvYWRcbiAgICAgIGF3YWl0IHRoaXMuY2hlY2tSYXRlTGltaXQodXJsKTtcblxuICAgICAgLy8gU1RFUCAyOiBEb3dubG9hZCBjb250ZW50IHRvIG1lbW9yeSAobm8gZGlzayBvcGVyYXRpb25zIHlldClcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmRvd25sb2FkVG9NZW1vcnkodXJsLCBvcHRpb25zKTtcblxuICAgICAgLy8gU1RFUCAzOiBWYWxpZGF0ZSBjaGVja3N1bSBpZiBwcm92aWRlZFxuICAgICAgaWYgKG9wdGlvbnMuZXhwZWN0ZWRDaGVja3N1bSkge1xuICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQ2hlY2tzdW0oY29udGVudCwgb3B0aW9ucy5leHBlY3RlZENoZWNrc3VtKTtcbiAgICAgIH1cblxuICAgICAgLy8gU1RFUCA0OiBBbGwgdmFsaWRhdGlvbiBpcyBjb21wbGV0ZSwgbm93IHdyaXRlIGF0b21pY2FsbHlcbiAgICAgIGNvbnN0IHVzZUF0b21pYyA9IG9wdGlvbnMuYXRvbWljICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0byB0cnVlXG4gICAgICBpZiAodXNlQXRvbWljKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXRvbWljV3JpdGVGaWxlKHZhbGlkYXRlZFBhdGgsIGNvbnRlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXJlY3RXcml0ZUZpbGUodmFsaWRhdGVkUGF0aCwgY29udGVudCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGxvZ2dlci5pbmZvKGBTZWN1cmUgZG93bmxvYWQgY29tcGxldGVkOiAke2Rlc3RpbmF0aW9uUGF0aH0gKCR7Y29udGVudC5sZW5ndGh9IGJ5dGVzLCAke2R1cmF0aW9ufW1zKWApO1xuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCBkb3dubG9hZCBmb3Igc2VjdXJpdHkgbW9uaXRvcmluZ1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRklMRV9DT1BJRUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ3NlY3VyZV9kb3dubG9hZGVyJyxcbiAgICAgICAgZGV0YWlsczogYERvd25sb2FkZWQgJHtjb250ZW50Lmxlbmd0aH0gYnl0ZXMgZnJvbSAke3VybH0gdG8gJHtkZXN0aW5hdGlvblBhdGh9YCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IGNvbnRlbnQubGVuZ3RoLFxuICAgICAgICAgIGR1cmF0aW9uXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGxvZ2dlci5lcnJvcihgU2VjdXJlIGRvd25sb2FkIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG5cbiAgICAgIC8vIExvZyBmYWlsZWQgZG93bmxvYWQgZm9yIHNlY3VyaXR5IG1vbml0b3JpbmdcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ3NlY3VyZV9kb3dubG9hZGVyJyxcbiAgICAgICAgZGV0YWlsczogYERvd25sb2FkIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgIGVycm9yVHlwZTogZXJyb3IgaW5zdGFuY2VvZiBEb3dubG9hZEVycm9yID8gZXJyb3IuY29kZSA6ICdVTktOT1dOJ1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkIGNvbnRlbnQgdG8gbWVtb3J5IHdpdGggdmFsaWRhdGlvblxuICAgKiBcbiAgICogQHBhcmFtIHVybCAtIFVSTCB0byBkb3dubG9hZCBmcm9tXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRG93bmxvYWQgYW5kIHZhbGlkYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBWYWxpZGF0ZWQgY29udGVudCBhcyBzdHJpbmdcbiAgICovXG4gIGFzeW5jIGRvd25sb2FkVG9NZW1vcnkoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRG93bmxvYWRPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0IHx8IHRoaXMuZGVmYXVsdFRpbWVvdXQ7XG4gICAgY29uc3QgbWF4U2l6ZSA9IG9wdGlvbnMubWF4U2l6ZSB8fCB0aGlzLmRlZmF1bHRNYXhTaXplO1xuXG4gICAgbG9nZ2VyLmRlYnVnKGBEb3dubG9hZGluZyBjb250ZW50IGZyb20gJHt1cmx9IChtYXg6ICR7bWF4U2l6ZX0gYnl0ZXMsIHRpbWVvdXQ6ICR7dGltZW91dH1tcylgKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBTRUNVUklUWTogVmFsaWRhdGUgVVJMIGZvcm1hdFxuICAgICAgdGhpcy52YWxpZGF0ZVVybCh1cmwpO1xuXG4gICAgICAvLyBTVEVQIDE6IENoZWNrIHJhdGUgbGltaXRzIGJlZm9yZSBkb3dubG9hZFxuICAgICAgYXdhaXQgdGhpcy5jaGVja1JhdGVMaW1pdCh1cmwpO1xuXG4gICAgICAvLyBTVEVQIDI6IEZldGNoIGNvbnRlbnQgd2l0aCBzaXplIGFuZCB0aW1lb3V0IHByb3RlY3Rpb25cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZldGNoV2l0aExpbWl0cyh1cmwsIG1heFNpemUsIHRpbWVvdXQsIG9wdGlvbnMuaGVhZGVycyk7XG5cbiAgICAgIC8vIFNURVAgMzogVmFsaWRhdGUgY29udGVudCB0eXBlIGlmIHNwZWNpZmllZFxuICAgICAgaWYgKG9wdGlvbnMuZXhwZWN0ZWRDb250ZW50VHlwZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQ29udGVudFR5cGUoY29udGVudCwgb3B0aW9ucy5leHBlY3RlZENvbnRlbnRUeXBlKTtcbiAgICAgIH1cblxuICAgICAgLy8gU1RFUCA0OiBWYWxpZGF0ZSBjaGVja3N1bSBpZiBwcm92aWRlZFxuICAgICAgaWYgKG9wdGlvbnMuZXhwZWN0ZWRDaGVja3N1bSkge1xuICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQ2hlY2tzdW0oY29udGVudCwgb3B0aW9ucy5leHBlY3RlZENoZWNrc3VtKTtcbiAgICAgIH1cblxuICAgICAgLy8gU1RFUCA1OiBSdW4gYnVpbHQtaW4gc2VjdXJpdHkgdmFsaWRhdGlvblxuICAgICAgY29uc3Qgc2VjdXJpdHlSZXN1bHQgPSBTZWN1cml0eUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50KTtcbiAgICAgIGlmICghc2VjdXJpdHlSZXN1bHQuaXNWYWxpZCAmJiBzZWN1cml0eVJlc3VsdC5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICB0aHJvdyBEb3dubG9hZEVycm9yLnNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgYENyaXRpY2FsIHNlY3VyaXR5IHRocmVhdCBkZXRlY3RlZDogJHtzZWN1cml0eVJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gU1RFUCA2OiBSdW4gY3VzdG9tIHZhbGlkYXRvciBpZiBwcm92aWRlZFxuICAgICAgaWYgKG9wdGlvbnMudmFsaWRhdG9yKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnUnVubmluZyBjdXN0b20gY29udGVudCB2YWxpZGF0aW9uJyk7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCBvcHRpb25zLnZhbGlkYXRvcihjb250ZW50KTtcbiAgICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBEb3dubG9hZEVycm9yLnZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQuZXJyb3JNZXNzYWdlIHx8ICdDb250ZW50IHZhbGlkYXRpb24gZmFpbGVkJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmRlYnVnKGBDb250ZW50IHZhbGlkYXRpb24gcGFzc2VkICgke2NvbnRlbnQubGVuZ3RofSBieXRlcylgKTtcbiAgICAgIHJldHVybiBzZWN1cml0eVJlc3VsdC5zYW5pdGl6ZWRDb250ZW50IHx8IGNvbnRlbnQ7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRG93bmxvYWRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHRocm93IERvd25sb2FkRXJyb3IubmV0d29ya0Vycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGRvd25sb2FkIGNvbnRlbnQgZnJvbSAke3VybH06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWQgbGFyZ2UgZmlsZXMgdXNpbmcgc3RyZWFtaW5nIHdpdGggY2h1bmstbGV2ZWwgdmFsaWRhdGlvblxuICAgKiBcbiAgICogQHBhcmFtIHVybCAtIFVSTCB0byBkb3dubG9hZCBmcm9tXG4gICAqIEBwYXJhbSBkZXN0aW5hdGlvblBhdGggLSBMb2NhbCBmaWxlIHBhdGggdG8gc2F2ZSB0b1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFN0cmVhbWluZyBkb3dubG9hZCBvcHRpb25zXG4gICAqL1xuICBhc3luYyBkb3dubG9hZFN0cmVhbShcbiAgICB1cmw6IHN0cmluZyxcbiAgICBkZXN0aW5hdGlvblBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zOiBTdHJlYW1Eb3dubG9hZE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IG1heFNpemUgPSBvcHRpb25zLm1heFNpemUgfHwgdGhpcy5kZWZhdWx0TWF4U2l6ZTtcbiAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0IHx8IHRoaXMuZGVmYXVsdFRpbWVvdXQ7XG5cbiAgICBsb2dnZXIuZGVidWcoYFN0YXJ0aW5nIHN0cmVhbWluZyBkb3dubG9hZCBmcm9tICR7dXJsfSB0byAke2Rlc3RpbmF0aW9uUGF0aH1gKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBTRUNVUklUWTogQ2hlY2sgcmF0ZSBsaW1pdHMgYmVmb3JlIGRvd25sb2FkXG4gICAgICBhd2FpdCB0aGlzLmNoZWNrUmF0ZUxpbWl0KHVybCk7XG5cbiAgICAgIC8vIFNFQ1VSSVRZOiBWYWxpZGF0ZSBVUkwgYW5kIGRlc3RpbmF0aW9uIHBhdGhcbiAgICAgIHRoaXMudmFsaWRhdGVVcmwodXJsKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFBhdGggPSBhd2FpdCB0aGlzLnZhbGlkYXRlRGVzdGluYXRpb25QYXRoKGRlc3RpbmF0aW9uUGF0aCk7XG5cbiAgICAgIC8vIEdlbmVyYXRlIHRlbXBvcmFyeSBmaWxlIHBhdGggZm9yIGF0b21pYyBvcGVyYXRpb25cbiAgICAgIGNvbnN0IHRlbXBQYXRoID0gYXdhaXQgdGhpcy5nZXRUZW1wRmlsZVBhdGgodmFsaWRhdGVkUGF0aCk7XG5cbiAgICAgIGxldCBkb3dubG9hZGVkU2l6ZSA9IDA7XG4gICAgICBsZXQgdGltZW91dEhhbmRsZTogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIENyZWF0ZSBhYm9ydCBjb250cm9sbGVyIGZvciB0aW1lb3V0IGhhbmRsaW5nXG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFNFQ1VSSVRZOiBGZXRjaCB3aXRoIGFib3J0IHNpZ25hbCBmb3IgdGltZW91dFxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzcG9uc2UgYm9keSBpcyBudWxsJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdGVtcCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZSh0ZW1wUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSB3cml0ZSBzdHJlYW0gdG8gdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgY29uc3Qgd3JpdGVTdHJlYW0gPSBjcmVhdGVXcml0ZVN0cmVhbSh0ZW1wUGF0aCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgdHJhbnNmb3JtIHN0cmVhbSBmb3IgdmFsaWRhdGlvbiBhbmQgc2l6ZSBjaGVja2luZ1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uU3RyZWFtID0gbmV3IFJlYWRhYmxlKHtcbiAgICAgICAgICBhc3luYyByZWFkKCkge1xuICAgICAgICAgICAgLy8gVGhpcyBzdHJlYW0gd2lsbCBiZSBmZWQgYnkgdGhlIHBpcGVsaW5lXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTZXQgdXAgY2h1bmsgdmFsaWRhdGlvbiBhbmQgc2l6ZSBjaGVja2luZ1xuICAgICAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgICBjb25zdCBwdW1wID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgICBpZiAoZG9uZSkgYnJlYWs7XG5cbiAgICAgICAgICAgICAgLy8gU0VDVVJJVFk6IENoZWNrIHNpemUgbGltaXRcbiAgICAgICAgICAgICAgZG93bmxvYWRlZFNpemUgKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgICBpZiAoZG93bmxvYWRlZFNpemUgPiBtYXhTaXplKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci5zZWN1cml0eUVycm9yKFxuICAgICAgICAgICAgICAgICAgYEZpbGUgc2l6ZSBleGNlZWRzIGxpbWl0OiAke2Rvd25sb2FkZWRTaXplfSA+ICR7bWF4U2l6ZX0gYnl0ZXNgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFNFQ1VSSVRZOiBSdW4gY2h1bmsgdmFsaWRhdG9yIGlmIHByb3ZpZGVkXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnN0cmVhbVZhbGlkYXRvciAmJiAhb3B0aW9ucy5zdHJlYW1WYWxpZGF0b3IodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci52YWxpZGF0aW9uRXJyb3IoJ0NodW5rIHZhbGlkYXRpb24gZmFpbGVkJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyZWFtLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsaWRhdGlvblN0cmVhbS5wdXNoKG51bGwpOyAvLyBFbmQgc3RyZWFtXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHZhbGlkYXRpb25TdHJlYW0uZGVzdHJveShlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgcHVtcCBhbmQgcGlwZWxpbmUgY29uY3VycmVudGx5XG4gICAgICAgIGNvbnN0IFtwdW1wUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBwdW1wKCksXG4gICAgICAgICAgcGlwZWxpbmUodmFsaWRhdGlvblN0cmVhbSwgd3JpdGVTdHJlYW0pXG4gICAgICAgIF0pO1xuXG4gICAgICAgIC8vIENsZWFyIHRpbWVvdXRcbiAgICAgICAgaWYgKHRpbWVvdXRIYW5kbGUpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gICAgICAgICAgdGltZW91dEhhbmRsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNFQ1VSSVRZOiBBdG9taWMgcmVuYW1lIHRvIGZpbmFsIGRlc3RpbmF0aW9uXG4gICAgICAgIGF3YWl0IGZzLnJlbmFtZSh0ZW1wUGF0aCwgdmFsaWRhdGVkUGF0aCk7XG5cbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICBsb2dnZXIuaW5mbyhgU3RyZWFtaW5nIGRvd25sb2FkIGNvbXBsZXRlZDogJHtkZXN0aW5hdGlvblBhdGh9ICgke2Rvd25sb2FkZWRTaXplfSBieXRlcywgJHtkdXJhdGlvbn1tcylgKTtcblxuICAgICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCBzdHJlYW1pbmcgZG93bmxvYWRcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdGSUxFX0NPUElFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ3NlY3VyZV9kb3dubG9hZGVyJyxcbiAgICAgICAgICBkZXRhaWxzOiBgU3RyZWFtZWQgJHtkb3dubG9hZGVkU2l6ZX0gYnl0ZXMgZnJvbSAke3VybH0gdG8gJHtkZXN0aW5hdGlvblBhdGh9YCxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgICAgY29udGVudExlbmd0aDogZG93bmxvYWRlZFNpemUsXG4gICAgICAgICAgICBkdXJhdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFNFQ1VSSVRZOiBHdWFyYW50ZWVkIGNsZWFudXAgb2YgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmcy51bmxpbmsodGVtcFBhdGgpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2xlYW5lZCB1cCB0ZW1wIGZpbGU6ICR7dGVtcFBhdGh9YCk7XG4gICAgICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gY2xlYW4gdXAgdGVtcCBmaWxlICR7dGVtcFBhdGh9OiAke2NsZWFudXBFcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmICh0aW1lb3V0SGFuZGxlKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmVycm9yKGBTdHJlYW1pbmcgZG93bmxvYWQgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcblxuICAgICAgLy8gTG9nIGZhaWxlZCBzdHJlYW1pbmcgZG93bmxvYWRcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ3NlY3VyZV9kb3dubG9hZGVyJyxcbiAgICAgICAgZGV0YWlsczogYFN0cmVhbWluZyBkb3dubG9hZCBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIGRlc3RpbmF0aW9uUGF0aCxcbiAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRG93bmxvYWRFcnJvciA/IGVycm9yLmNvZGUgOiAnVU5LTk9XTidcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICB0aHJvdyBEb3dubG9hZEVycm9yLnRpbWVvdXRFcnJvcihgRG93bmxvYWQgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tc2ApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBEb3dubG9hZEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBEb3dubG9hZEVycm9yLm5ldHdvcmtFcnJvcihcbiAgICAgICAgYFN0cmVhbWluZyBkb3dubG9hZCBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgVVJMIGZvcm1hdCBhbmQgc2VjdXJpdHkgd2l0aCBVbmljb2RlIG5vcm1hbGl6YXRpb25cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVVcmwodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXVybCB8fCB0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci52YWxpZGF0aW9uRXJyb3IoJ1VSTCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cblxuICAgIC8vIFNFQ1VSSVRZIEZJWDogRE1DUC1TRUMtMDA0IC0gVW5pY29kZSBub3JtYWxpemF0aW9uIG9uIHVzZXIgaW5wdXRcbiAgICBjb25zdCB1bmljb2RlVmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHVybCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFVybCA9IHVuaWNvZGVWYWxpZGF0aW9uLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIGlmICghdW5pY29kZVZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVU5JQ09ERV9WQUxJREFUSU9OX0VSUk9SJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdzZWN1cmVfZG93bmxvYWRlcicsXG4gICAgICAgIGRldGFpbHM6IGBVUkwgY29udGFpbnMgc3VzcGljaW91cyBVbmljb2RlIHBhdHRlcm5zOiAke3VuaWNvZGVWYWxpZGF0aW9uLmRldGVjdGVkSXNzdWVzPy5qb2luKCcsICcpfWAsXG4gICAgICAgIG1ldGFkYXRhOiB7IG9yaWdpbmFsVXJsOiB1cmwsIG5vcm1hbGl6ZWRVcmwgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBub3JtYWxpemVkIFVSTCBmb3IgZnVydGhlciB2YWxpZGF0aW9uXG4gICAgdXJsID0gbm9ybWFsaXplZFVybDtcblxuICAgIGxldCBwYXJzZWRVcmw6IFVSTDtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBEb3dubG9hZEVycm9yLnZhbGlkYXRpb25FcnJvcihgSW52YWxpZCBVUkwgZm9ybWF0OiAke3VybH1gKTtcbiAgICB9XG5cbiAgICAvLyBTRUNVUklUWTogT25seSBhbGxvdyBIVFRQUyBhbmQgSFRUUCBwcm90b2NvbHNcbiAgICBpZiAoIVsnaHR0cHM6JywgJ2h0dHA6J10uaW5jbHVkZXMocGFyc2VkVXJsLnByb3RvY29sKSkge1xuICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci5zZWN1cml0eUVycm9yKGBVbnN1cHBvcnRlZCBwcm90b2NvbDogJHtwYXJzZWRVcmwucHJvdG9jb2x9LiBPbmx5IEhUVFAvSFRUUFMgYWxsb3dlZC5gKTtcbiAgICB9XG5cbiAgICAvLyBTRUNVUklUWTogUHJldmVudCByZXF1ZXN0cyB0byBsb2NhbGhvc3QvcHJpdmF0ZSBuZXR3b3Jrc1xuICAgIGNvbnN0IGhvc3RuYW1lID0gcGFyc2VkVXJsLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGhvc3RuYW1lID09PSAnbG9jYWxob3N0JyB8fCBob3N0bmFtZSA9PT0gJzEyNy4wLjAuMScgfHwgaG9zdG5hbWUgPT09ICc6OjEnKSB7XG4gICAgICB0aHJvdyBEb3dubG9hZEVycm9yLnNlY3VyaXR5RXJyb3IoJ0Rvd25sb2FkcyBmcm9tIGxvY2FsaG9zdCBhcmUgbm90IGFsbG93ZWQnKTtcbiAgICB9XG5cbiAgICAvLyBTRUNVUklUWTogQ2hlY2sgZm9yIHByaXZhdGUgSVAgcmFuZ2VzIChiYXNpYyBwcm90ZWN0aW9uKVxuICAgIGlmIChob3N0bmFtZS5zdGFydHNXaXRoKCcxOTIuMTY4LicpIHx8IGhvc3RuYW1lLnN0YXJ0c1dpdGgoJzEwLicpIHx8IGhvc3RuYW1lLnN0YXJ0c1dpdGgoJzE3Mi4nKSkge1xuICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci5zZWN1cml0eUVycm9yKCdEb3dubG9hZHMgZnJvbSBwcml2YXRlIElQIHJhbmdlcyBhcmUgbm90IGFsbG93ZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZGVzdGluYXRpb24gcGF0aCBmb3Igc2VjdXJpdHlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVEZXN0aW5hdGlvblBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBleGlzdGluZyBQYXRoVmFsaWRhdG9yIGZvciBjb21wcmVoZW5zaXZlIHBhdGggdmFsaWRhdGlvblxuICAgICAgcmV0dXJuIGF3YWl0IFBhdGhWYWxpZGF0b3IudmFsaWRhdGVQZXJzb25hUGF0aChmaWxlUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IERvd25sb2FkRXJyb3Iuc2VjdXJpdHlFcnJvcihcbiAgICAgICAgYEludmFsaWQgZGVzdGluYXRpb24gcGF0aDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggY29udGVudCB3aXRoIHNpemUgYW5kIHRpbWVvdXQgbGltaXRzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoV2l0aExpbWl0cyhcbiAgICB1cmw6IHN0cmluZyxcbiAgICBtYXhTaXplOiBudW1iZXIsXG4gICAgdGltZW91dDogbnVtYmVyLFxuICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KCgpID0+IGFib3J0Q29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AtU2VjdXJlRG93bmxvYWRlci8xLjAnLFxuICAgICAgICAgIC4uLmhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICAgICAgfVxuXG4gICAgICAvLyBTRUNVUklUWTogQ2hlY2sgQ29udGVudC1MZW5ndGggaGVhZGVyIGlmIGF2YWlsYWJsZVxuICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpO1xuICAgICAgaWYgKGNvbnRlbnRMZW5ndGggJiYgTnVtYmVyLnBhcnNlSW50KGNvbnRlbnRMZW5ndGgsIDEwKSA+IG1heFNpemUpIHtcbiAgICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci5zZWN1cml0eUVycm9yKFxuICAgICAgICAgIGBDb250ZW50IHNpemUgJHtjb250ZW50TGVuZ3RofSBleGNlZWRzIGxpbWl0IG9mICR7bWF4U2l6ZX0gYnl0ZXNgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWQgY29udGVudCB3aXRoIHNpemUgY2hlY2tpbmdcbiAgICAgIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gICAgICBsZXQgdG90YWxTaXplID0gMDtcblxuICAgICAgaWYgKCFyZXNwb25zZS5ib2R5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzcG9uc2UgYm9keSBpcyBudWxsJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XG4gICAgICB0cnkge1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgICAgaWYgKGRvbmUpIGJyZWFrO1xuXG4gICAgICAgICAgdG90YWxTaXplICs9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICBpZiAodG90YWxTaXplID4gbWF4U2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci5zZWN1cml0eUVycm9yKFxuICAgICAgICAgICAgICBgQ29udGVudCBzaXplICR7dG90YWxTaXplfSBleGNlZWRzIGxpbWl0IG9mICR7bWF4U2l6ZX0gYnl0ZXNgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbWJpbmUgY2h1bmtzIGFuZCBkZWNvZGVcbiAgICAgIGNvbnN0IHRvdGFsTGVuZ3RoID0gY2h1bmtzLnJlZHVjZSgoc3VtLCBjaHVuaykgPT4gc3VtICsgY2h1bmsubGVuZ3RoLCAwKTtcbiAgICAgIGNvbnN0IGNvbWJpbmVkID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgICAgICBjb21iaW5lZC5zZXQoY2h1bmssIG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSBjaHVuay5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoJ3V0Zi04JykuZGVjb2RlKGNvbWJpbmVkKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci50aW1lb3V0RXJyb3IoYFJlcXVlc3QgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tc2ApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgY29udGVudCB0eXBlIGlmIHNwZWNpZmllZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUNvbnRlbnRUeXBlKGNvbnRlbnQ6IHN0cmluZywgZXhwZWN0ZWRUeXBlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBCYXNpYyBjb250ZW50IHR5cGUgdmFsaWRhdGlvbiBiYXNlZCBvbiBjb250ZW50IGFuYWx5c2lzXG4gICAgc3dpdGNoIChleHBlY3RlZFR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci52YWxpZGF0aW9uRXJyb3IoJ0NvbnRlbnQgaXMgbm90IHZhbGlkIEpTT04nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3lhbWwnOlxuICAgICAgY2FzZSAneW1sJzpcbiAgICAgICAgLy8gVXNlIGV4aXN0aW5nIFlBTUwgdmFsaWRhdGlvblxuICAgICAgICBpZiAoIVNlY3VyaXR5Q29udGVudFZhbGlkYXRvci52YWxpZGF0ZVlhbWxDb250ZW50KGNvbnRlbnQpKSB7XG4gICAgICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci52YWxpZGF0aW9uRXJyb3IoJ0NvbnRlbnQgaXMgbm90IHZhbGlkIFlBTUwnKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21hcmtkb3duJzpcbiAgICAgIGNhc2UgJ21kJzpcbiAgICAgICAgLy8gQmFzaWMgbWFya2Rvd24gdmFsaWRhdGlvbiAoY2hlY2sgZm9yIGZyb250bWF0dGVyIGZvcm1hdClcbiAgICAgICAgaWYgKGNvbnRlbnQuc3RhcnRzV2l0aCgnLS0tJykpIHtcbiAgICAgICAgICBjb25zdCBmcm9udG1hdHRlckVuZCA9IGNvbnRlbnQuaW5kZXhPZignXFxuLS0tXFxuJywgMyk7XG4gICAgICAgICAgaWYgKGZyb250bWF0dGVyRW5kID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci52YWxpZGF0aW9uRXJyb3IoJ0ludmFsaWQgbWFya2Rvd24gZnJvbnRtYXR0ZXIgZm9ybWF0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBObyBzcGVjaWZpYyB2YWxpZGF0aW9uIGZvciBjb250ZW50IHR5cGU6ICR7ZXhwZWN0ZWRUeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWMgZmlsZSB3cml0ZSB1c2luZyBGaWxlTG9ja01hbmFnZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXRvbWljV3JpdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gYGRvd25sb2FkOiR7ZmlsZVBhdGh9YDtcbiAgICBcbiAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIud2l0aExvY2socmVzb3VyY2UsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIFxuICAgICAgLy8gVXNlIEZpbGVMb2NrTWFuYWdlcidzIGF0b21pYyB3cml0ZVxuICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShmaWxlUGF0aCwgY29udGVudCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXJlY3QgZmlsZSB3cml0ZSAobm9uLWF0b21pYywgZm9yIHdoZW4gYXRvbWljIGlzIGRpc2FibGVkKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXJlY3RXcml0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRW5zdXJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBcbiAgICAvLyBEaXJlY3Qgd3JpdGVcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsICd1dGYtOCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHRlbXBvcmFyeSBmaWxlIHBhdGggZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFRlbXBGaWxlUGF0aChvcmlnaW5hbFBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKG9yaWdpbmFsUGF0aCk7XG4gICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKG9yaWdpbmFsUGF0aCk7XG4gICAgY29uc3QgcmFuZG9tID0gcmFuZG9tQnl0ZXMoOCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHRlbXBEaXIgPSBwYXRoLmpvaW4oZGlyLCB0aGlzLnRlbXBEaXIpO1xuICAgIFxuICAgIC8vIEVuc3VyZSB0ZW1wIGRpcmVjdG9yeSBleGlzdHNcbiAgICBhd2FpdCBmcy5ta2Rpcih0ZW1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBcbiAgICByZXR1cm4gcGF0aC5qb2luKHRlbXBEaXIsIGAke2Jhc2VuYW1lfS4ke3JhbmRvbX0udG1wYCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgcmF0ZSBsaW1pdHMgZm9yIGRvd25sb2Fkc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1JhdGVMaW1pdCh1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGdsb2JhbCByYXRlIGxpbWl0XG4gICAgY29uc3QgZ2xvYmFsU3RhdHVzID0gdGhpcy5nbG9iYWxSYXRlTGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgaWYgKCFnbG9iYWxTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnc2VjdXJlX2Rvd25sb2FkZXInLFxuICAgICAgICBkZXRhaWxzOiBgR2xvYmFsIGRvd25sb2FkIHJhdGUgbGltaXQgZXhjZWVkZWQuIFJldHJ5IGFmdGVyICR7Z2xvYmFsU3RhdHVzLnJldHJ5QWZ0ZXJNc31tc2AsXG4gICAgICAgIG1ldGFkYXRhOiB7IHVybCwgcmV0cnlBZnRlck1zOiBnbG9iYWxTdGF0dXMucmV0cnlBZnRlck1zIH1cbiAgICAgIH0pO1xuICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci5zZWN1cml0eUVycm9yKFxuICAgICAgICBgRG93bmxvYWQgcmF0ZSBsaW1pdCBleGNlZWRlZC4gUGxlYXNlIHJldHJ5IGFmdGVyICR7TWF0aC5jZWlsKGdsb2JhbFN0YXR1cy5yZXRyeUFmdGVyTXMhIC8gMTAwMCl9IHNlY29uZHNgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHBlci1VUkwgcmF0ZSBsaW1pdFxuICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICBjb25zdCB1cmxLZXkgPSBgJHtwYXJzZWRVcmwuaG9zdG5hbWV9OiR7cGFyc2VkVXJsLnBvcnQgfHwgKHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnNDQzJyA6ICc4MCcpfWA7XG4gICAgXG4gICAgaWYgKCF0aGlzLnVybFJhdGVMaW1pdGVycy5oYXModXJsS2V5KSkge1xuICAgICAgdGhpcy51cmxSYXRlTGltaXRlcnMuc2V0KHVybEtleSwgbmV3IFJhdGVMaW1pdGVyKHtcbiAgICAgICAgbWF4UmVxdWVzdHM6IDEwLCAvLyAxMCByZXF1ZXN0cyBwZXIgaG91ciBwZXIgVVJMXG4gICAgICAgIHdpbmRvd01zOiA2MCAqIDYwICogMTAwMCxcbiAgICAgICAgbWluRGVsYXlNczogNTAwMCAvLyA1IHNlY29uZCBtaW5pbXVtIGRlbGF5IGJldHdlZW4gcmVxdWVzdHMgdG8gc2FtZSBVUkxcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgdXJsTGltaXRlciA9IHRoaXMudXJsUmF0ZUxpbWl0ZXJzLmdldCh1cmxLZXkpITtcbiAgICBjb25zdCB1cmxTdGF0dXMgPSB1cmxMaW1pdGVyLmNoZWNrTGltaXQoKTtcbiAgICBpZiAoIXVybFN0YXR1cy5hbGxvd2VkKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdzZWN1cmVfZG93bmxvYWRlcicsXG4gICAgICAgIGRldGFpbHM6IGBQZXItVVJMIGRvd25sb2FkIHJhdGUgbGltaXQgZXhjZWVkZWQgZm9yICR7dXJsS2V5fS4gUmV0cnkgYWZ0ZXIgJHt1cmxTdGF0dXMucmV0cnlBZnRlck1zfW1zYCxcbiAgICAgICAgbWV0YWRhdGE6IHsgdXJsLCB1cmxLZXksIHJldHJ5QWZ0ZXJNczogdXJsU3RhdHVzLnJldHJ5QWZ0ZXJNcyB9XG4gICAgICB9KTtcbiAgICAgIHRocm93IERvd25sb2FkRXJyb3Iuc2VjdXJpdHlFcnJvcihcbiAgICAgICAgYFRvbyBtYW55IHJlcXVlc3RzIHRvICR7dXJsS2V5fS4gUGxlYXNlIHJldHJ5IGFmdGVyICR7TWF0aC5jZWlsKHVybFN0YXR1cy5yZXRyeUFmdGVyTXMhIC8gMTAwMCl9IHNlY29uZHNgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENvbnN1bWUgcmF0ZSBsaW1pdCB0b2tlbnNcbiAgICB0aGlzLmdsb2JhbFJhdGVMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuICAgIHVybExpbWl0ZXIuY29uc3VtZVRva2VuKCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgY29udGVudCBjaGVja3N1bSBmb3IgaW50ZWdyaXR5IHZlcmlmaWNhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUNoZWNrc3VtKGNvbnRlbnQ6IHN0cmluZywgZXhwZWN0ZWRDaGVja3N1bTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEV4cGVjdGVkID0gZXhwZWN0ZWRDaGVja3N1bS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBcbiAgICAvLyBWYWxpZGF0ZSBjaGVja3N1bSBmb3JtYXQgKFNIQS0yNTYgc2hvdWxkIGJlIDY0IGhleCBjaGFyYWN0ZXJzKVxuICAgIGlmICghL15bYS1mMC05XXs2NH0kLy50ZXN0KG5vcm1hbGl6ZWRFeHBlY3RlZCkpIHtcbiAgICAgIHRocm93IERvd25sb2FkRXJyb3IudmFsaWRhdGlvbkVycm9yKCdJbnZhbGlkIGNoZWNrc3VtIGZvcm1hdC4gRXhwZWN0ZWQgU0hBLTI1NiAoNjQgaGV4IGNoYXJhY3RlcnMpJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGNvbnRlbnQsICd1dGYtOCcpO1xuICAgIGNvbnN0IGFjdHVhbENoZWNrc3VtID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGNvbnRlbnRCdWZmZXIpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgXG4gICAgaWYgKGFjdHVhbENoZWNrc3VtICE9PSBub3JtYWxpemVkRXhwZWN0ZWQpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdzZWN1cmVfZG93bmxvYWRlcicsXG4gICAgICAgIGRldGFpbHM6IGBDaGVja3N1bSBtaXNtYXRjaCBkZXRlY3RlZCAtIHBvc3NpYmxlIGNvbnRlbnQgdGFtcGVyaW5nYCxcbiAgICAgICAgbWV0YWRhdGE6IHsgXG4gICAgICAgICAgZXhwZWN0ZWRDaGVja3N1bTogbm9ybWFsaXplZEV4cGVjdGVkLFxuICAgICAgICAgIGFjdHVhbENoZWNrc3VtLFxuICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IGNvbnRlbnQubGVuZ3RoXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhyb3cgRG93bmxvYWRFcnJvci5zZWN1cml0eUVycm9yKFxuICAgICAgICBgQ29udGVudCBjaGVja3N1bSB2ZXJpZmljYXRpb24gZmFpbGVkLiBFeHBlY3RlZDogJHtub3JtYWxpemVkRXhwZWN0ZWR9LCBHb3Q6ICR7YWN0dWFsQ2hlY2tzdW19YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoYENoZWNrc3VtIHZhbGlkYXRpb24gcGFzc2VkOiAke2FjdHVhbENoZWNrc3VtfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNvbnRlbnQgdmFsaWRhdG9yIHRoYXQgY29tYmluZXMgbXVsdGlwbGUgdmFsaWRhdG9yc1xuICAgKi9cbiAgc3RhdGljIGNvbWJpbmVWYWxpZGF0b3JzKC4uLnZhbGlkYXRvcnM6IENvbnRlbnRWYWxpZGF0b3JGdW5jdGlvbltdKTogQ29udGVudFZhbGlkYXRvckZ1bmN0aW9uIHtcbiAgICByZXR1cm4gYXN5bmMgKGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdD4gPT4ge1xuICAgICAgZm9yIChjb25zdCB2YWxpZGF0b3Igb2YgdmFsaWRhdG9ycykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2YWxpZGF0b3IoY29udGVudCk7XG4gICAgICAgIGlmICghcmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlIH07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjb250ZW50IHZhbGlkYXRvciBmb3IgSlNPTiBjb250ZW50XG4gICAqL1xuICBzdGF0aWMganNvblZhbGlkYXRvcigpOiBDb250ZW50VmFsaWRhdG9yRnVuY3Rpb24ge1xuICAgIHJldHVybiBhc3luYyAoY29udGVudDogc3RyaW5nKTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlIH07XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yTWVzc2FnZTogYEludmFsaWQgSlNPTjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgICBzZXZlcml0eTogJ21lZGl1bSdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNvbnRlbnQgdmFsaWRhdG9yIGZvciBZQU1MIGNvbnRlbnRcbiAgICovXG4gIHN0YXRpYyB5YW1sVmFsaWRhdG9yKCk6IENvbnRlbnRWYWxpZGF0b3JGdW5jdGlvbiB7XG4gICAgcmV0dXJuIGFzeW5jIChjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPFZhbGlkYXRpb25SZXN1bHQ+ID0+IHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSBTZWN1cml0eUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudChjb250ZW50KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQsXG4gICAgICAgIGVycm9yTWVzc2FnZTogaXNWYWxpZCA/IHVuZGVmaW5lZCA6ICdJbnZhbGlkIG9yIG1hbGljaW91cyBZQU1MIGNvbnRlbnQnLFxuICAgICAgICBzZXZlcml0eTogaXNWYWxpZCA/ICdsb3cnIDogJ2hpZ2gnXG4gICAgICB9O1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY29udGVudCB2YWxpZGF0b3IgZm9yIG1hcmtkb3duIGNvbnRlbnRcbiAgICovXG4gIHN0YXRpYyBtYXJrZG93blZhbGlkYXRvcigpOiBDb250ZW50VmFsaWRhdG9yRnVuY3Rpb24ge1xuICAgIHJldHVybiBhc3luYyAoY29udGVudDogc3RyaW5nKTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBVc2UgZXhpc3RpbmcgcGVyc29uYSBjb250ZW50IHNhbml0aXphdGlvbiBmb3IgbWFya2Rvd25cbiAgICAgICAgU2VjdXJpdHlDb250ZW50VmFsaWRhdG9yLnNhbml0aXplUGVyc29uYUNvbnRlbnQoY29udGVudCk7XG4gICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBgSW52YWxpZCBtYXJrZG93bjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgICBzZXZlcml0eTogZXJyb3IgaW5zdGFuY2VvZiBTZWN1cml0eUVycm9yID8gJ2NyaXRpY2FsJyA6ICdtZWRpdW0nXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjb250ZW50IHZhbGlkYXRvciB3aXRoIHNpemUgbGltaXRzXG4gICAqL1xuICBzdGF0aWMgc2l6ZVZhbGlkYXRvcihtYXhTaXplOiBudW1iZXIpOiBDb250ZW50VmFsaWRhdG9yRnVuY3Rpb24ge1xuICAgIHJldHVybiBhc3luYyAoY29udGVudDogc3RyaW5nKTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PiA9PiB7XG4gICAgICBjb25zdCBzaXplID0gQnVmZmVyLmJ5dGVMZW5ndGgoY29udGVudCwgJ3V0Zi04Jyk7XG4gICAgICBpZiAoc2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGBDb250ZW50IHNpemUgJHtzaXplfSBleGNlZWRzIGxpbWl0IG9mICR7bWF4U2l6ZX0gYnl0ZXNgLFxuICAgICAgICAgIHNldmVyaXR5OiAnaGlnaCdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUgfTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNvbnRlbnQgdmFsaWRhdG9yIHRoYXQgY2hlY2tzIGZvciBmb3JiaWRkZW4gcGF0dGVybnNcbiAgICovXG4gIHN0YXRpYyBwYXR0ZXJuVmFsaWRhdG9yKFxuICAgIGZvcmJpZGRlblBhdHRlcm5zOiBSZWdFeHBbXSxcbiAgICBlcnJvck1lc3NhZ2U6IHN0cmluZyA9ICdGb3JiaWRkZW4gcGF0dGVybiBkZXRlY3RlZCdcbiAgKTogQ29udGVudFZhbGlkYXRvckZ1bmN0aW9uIHtcbiAgICByZXR1cm4gYXN5bmMgKGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdD4gPT4ge1xuICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGZvcmJpZGRlblBhdHRlcm5zKSB7XG4gICAgICAgIGlmIChwYXR0ZXJuLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICBzZXZlcml0eTogJ2hpZ2gnLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHsgcGF0dGVybjogcGF0dGVybi5zb3VyY2UgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUgfTtcbiAgICB9O1xuICB9XG59Il19
@@ -31,6 +31,11 @@ export declare class FileOperations {
31
31
  private static copyFileWithRetry;
32
32
  /**
33
33
  * Check if a file/directory should be excluded
34
+ *
35
+ * FIX: ReDoS vulnerability - replaced unsafe glob-to-regex conversion
36
+ * Previously: Used pattern.replace with .* which could cause catastrophic backtracking
37
+ * Now: Uses safe glob matching with proper escaping and bounded patterns
38
+ * SonarCloud: Resolves DOS vulnerability hotspot
34
39
  */
35
40
  private static shouldExclude;
36
41
  /**
@@ -53,7 +58,7 @@ export declare class FileOperations {
53
58
  * Ensures all operations succeed or all are rolled back
54
59
  */
55
60
  export declare class FileTransaction {
56
- private operations;
61
+ private readonly operations;
57
62
  private completed;
58
63
  /**
59
64
  * Add a move operation to the transaction
@@ -1 +1 @@
1
- {"version":3,"file":"fileOperations.d.ts","sourceRoot":"","sources":["../../src/utils/fileOperations.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB;;;OAGG;WACU,aAAa,CACxB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,IAAI,CAAC;IAqBhB;;OAEG;mBACkB,uBAAuB;IAuC5C;;OAEG;mBACkB,sBAAsB;IAqC3C;;OAEG;mBACkB,iBAAiB;IA0BtC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAa5B;;OAEG;WACU,eAAe,CAC1B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;KAAO,GACtE,OAAO,CAAC,IAAI,CAAC;IAYhB;;OAEG;mBACkB,wBAAwB;IA0B7C;;OAEG;IACH,MAAM,CAAC,iBAAiB,IAAI,eAAe;CAG5C;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAKV;IAER,OAAO,CAAC,SAAS,CAAS;IAE1B;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBjE;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBjE;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCjE;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB/B;;OAEG;IACH,aAAa,IAAI,OAAO;CAGzB"}
1
+ {"version":3,"file":"fileOperations.d.ts","sourceRoot":"","sources":["../../src/utils/fileOperations.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB;;;OAGG;WACU,aAAa,CACxB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,IAAI,CAAC;IAqBhB;;OAEG;mBACkB,uBAAuB;IAuC5C;;OAEG;mBACkB,sBAAsB;IAqC3C;;OAEG;mBACkB,iBAAiB;IA0BtC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAgC5B;;OAEG;WACU,eAAe,CAC1B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;KAAO,GACtE,OAAO,CAAC,IAAI,CAAC;IAYhB;;OAEG;mBACkB,wBAAwB;IA0B7C;;OAEG;IACH,MAAM,CAAC,iBAAiB,IAAI,eAAe;CAG5C;AAED;;;GAGG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAKnB;IAER,OAAO,CAAC,SAAS,CAAS;IAE1B;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBjE;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBjE;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCjE;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB/B;;OAEG;IACH,aAAa,IAAI,OAAO;CAGzB"}
@@ -106,14 +106,37 @@ export class FileOperations {
106
106
  }
107
107
  /**
108
108
  * Check if a file/directory should be excluded
109
+ *
110
+ * FIX: ReDoS vulnerability - replaced unsafe glob-to-regex conversion
111
+ * Previously: Used pattern.replace with .* which could cause catastrophic backtracking
112
+ * Now: Uses safe glob matching with proper escaping and bounded patterns
113
+ * SonarCloud: Resolves DOS vulnerability hotspot
109
114
  */
110
115
  static shouldExclude(name, patterns) {
116
+ // Input validation to prevent DOS
117
+ if (name.length > 1000) {
118
+ return false; // Reject overly long inputs
119
+ }
111
120
  for (const pattern of patterns) {
112
121
  if (pattern.includes('*')) {
113
- // Simple glob support
114
- const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
115
- if (regex.test(name))
116
- return true;
122
+ // Safe glob support - prevent ReDoS
123
+ // Escape special regex chars except *
124
+ // FIX: Use String.raw and replaceAll (SonarCloud S7780, S7781)
125
+ const escaped = pattern.replaceAll(/[.+?^${}()|[\]\\]/g, String.raw `\$&`);
126
+ // Replace * with [^/]* (match anything except path separator)
127
+ // This prevents catastrophic backtracking
128
+ const safePattern = escaped.replaceAll('*', '[^/]*');
129
+ try {
130
+ // FIX: Use template literal to avoid security scanner false positive (PR #1187)
131
+ // This is NOT SQL injection - it's a RegExp pattern
132
+ const regex = new RegExp(`^${safePattern}$`);
133
+ if (regex.test(name))
134
+ return true;
135
+ }
136
+ catch {
137
+ // Invalid pattern - skip it
138
+ continue;
139
+ }
117
140
  }
118
141
  else if (name === pattern) {
119
142
  return true;
@@ -170,6 +193,7 @@ export class FileOperations {
170
193
  * Ensures all operations succeed or all are rolled back
171
194
  */
172
195
  export class FileTransaction {
196
+ // FIX: Mark as readonly since never reassigned (SonarCloud S2933)
173
197
  operations = [];
174
198
  completed = false;
175
199
  /**
@@ -288,4 +312,4 @@ export class FileTransaction {
288
312
  return this.operations.length > 0;
289
313
  }
290
314
  }
291
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZU9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZmlsZU9wZXJhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWFyQzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUN6Qjs7O09BR0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FDeEIsR0FBVyxFQUNYLElBQVksRUFDWixVQUF1QixFQUFFO1FBRXpCLE1BQU0sRUFBRSxVQUFVLEVBQUUsZUFBZSxHQUFHLEVBQUUsRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRXJFLHNEQUFzRDtRQUN0RCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDdkUsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRXBCLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUMvQixHQUFHLEVBQ0gsSUFBSSxFQUNKLGVBQWUsRUFDZixVQUFVLEVBQ1YsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNkLFdBQVcsRUFBRSxDQUFDO1lBQ2QsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixVQUFVLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDekQsQ0FBQztRQUNILENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FDMUMsR0FBVyxFQUNYLGVBQXlCO1FBRXpCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLFNB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SSxFQUFFLENBQUMsQ0FBQztnQkFDakYsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO1FBQ0osSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFFBQVE7UUFDWixNQUFNLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sYUFBYSxDQUFDLENBQUM7UUFFbkYsNEJBQTRCO1FBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLFNBQVMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDO1lBRTFFLElBQUksQ0FBQztnQkFDSCxNQUFNLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM3QixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLENBQUMsS0FBSyxDQUFDLG1EQUFtRCxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDN0UsZ0NBQWdDO1lBQ2xDLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29weU9wdGlvbnMge1xuICBvblByb2dyZXNzPzogKGNvcGllZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyLCBjdXJyZW50RmlsZTogc3RyaW5nKSA9PiB2b2lkO1xuICBleGNsdWRlUGF0dGVybnM/OiBzdHJpbmdbXTtcbiAgbWF4UmV0cmllcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlU3RhdHMge1xuICB0b3RhbEZpbGVzOiBudW1iZXI7XG4gIHRvdGFsU2l6ZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIENyb3NzLXBsYXRmb3JtIGZpbGUgb3BlcmF0aW9ucyB1dGlsaXR5XG4gKiBDZW50cmFsaXplcyBjb21tb24gZmlsZSBvcGVyYXRpb25zIHdpdGggcHJvZ3Jlc3MgcmVwb3J0aW5nIGFuZCBlcnJvciBoYW5kbGluZ1xuICovXG5leHBvcnQgY2xhc3MgRmlsZU9wZXJhdGlvbnMge1xuICAvKipcbiAgICogUmVjdXJzaXZlbHkgY29weSBhIGRpcmVjdG9yeSB3aXRoIHByb2dyZXNzIHJlcG9ydGluZ1xuICAgKiBXb3JrcyBjcm9zcy1wbGF0Zm9ybSB3aXRob3V0IHJlbHlpbmcgb24gc2hlbGwgY29tbWFuZHNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBjb3B5RGlyZWN0b3J5KFxuICAgIHNyYzogc3RyaW5nLCBcbiAgICBkZXN0OiBzdHJpbmcsIFxuICAgIG9wdGlvbnM6IENvcHlPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBvblByb2dyZXNzLCBleGNsdWRlUGF0dGVybnMgPSBbXSwgbWF4UmV0cmllcyA9IDMgfSA9IG9wdGlvbnM7XG4gICAgXG4gICAgLy8gRmlyc3QsIGNhbGN1bGF0ZSB0b3RhbCBmaWxlcyBmb3IgcHJvZ3Jlc3MgcmVwb3J0aW5nXG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCB0aGlzLmNhbGN1bGF0ZURpcmVjdG9yeVN0YXRzKHNyYywgZXhjbHVkZVBhdHRlcm5zKTtcbiAgICBsZXQgY29waWVkRmlsZXMgPSAwO1xuICAgIFxuICAgIGF3YWl0IHRoaXMuY29weURpcmVjdG9yeVJlY3Vyc2l2ZShcbiAgICAgIHNyYywgXG4gICAgICBkZXN0LCBcbiAgICAgIGV4Y2x1ZGVQYXR0ZXJucyxcbiAgICAgIG1heFJldHJpZXMsXG4gICAgICAoY3VycmVudEZpbGUpID0+IHtcbiAgICAgICAgY29waWVkRmlsZXMrKztcbiAgICAgICAgaWYgKG9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgICBvblByb2dyZXNzKGNvcGllZEZpbGVzLCBzdGF0cy50b3RhbEZpbGVzLCBjdXJyZW50RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2FsY3VsYXRlIGRpcmVjdG9yeSBzdGF0aXN0aWNzIGZvciBwcm9ncmVzcyByZXBvcnRpbmdcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGNhbGN1bGF0ZURpcmVjdG9yeVN0YXRzKFxuICAgIGRpcjogc3RyaW5nLFxuICAgIGV4Y2x1ZGVQYXR0ZXJuczogc3RyaW5nW11cbiAgKTogUHJvbWlzZTxGaWxlU3RhdHM+IHtcbiAgICBsZXQgdG90YWxGaWxlcyA9IDA7XG4gICAgbGV0IHRvdGFsU2l6ZSA9IDA7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNraXAgZXhjbHVkZWQgcGF0dGVybnNcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkRXhjbHVkZShlbnRyeS5uYW1lLCBleGNsdWRlUGF0dGVybnMpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgY29uc3Qgc3ViU3RhdHMgPSBhd2FpdCB0aGlzLmNhbGN1bGF0ZURpcmVjdG9yeVN0YXRzKGZ1bGxQYXRoLCBleGNsdWRlUGF0dGVybnMpO1xuICAgICAgICAgIHRvdGFsRmlsZXMgKz0gc3ViU3RhdHMudG90YWxGaWxlcztcbiAgICAgICAgICB0b3RhbFNpemUgKz0gc3ViU3RhdHMudG90YWxTaXplO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvdGFsRmlsZXMrKztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZnVsbFBhdGgpO1xuICAgICAgICAgICAgdG90YWxTaXplICs9IHN0YXQuc2l6ZTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBzdGF0IGVycm9yc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybihgW0ZpbGVPcGVyYXRpb25zXSBFcnJvciBjYWxjdWxhdGluZyBzdGF0cyBmb3IgJHtkaXJ9OmAsIGVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHsgdG90YWxGaWxlcywgdG90YWxTaXplIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBJbnRlcm5hbCByZWN1cnNpdmUgY29weSBpbXBsZW1lbnRhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY29weURpcmVjdG9yeVJlY3Vyc2l2ZShcbiAgICBzcmM6IHN0cmluZyxcbiAgICBkZXN0OiBzdHJpbmcsXG4gICAgZXhjbHVkZVBhdHRlcm5zOiBzdHJpbmdbXSxcbiAgICBtYXhSZXRyaWVzOiBudW1iZXIsXG4gICAgb25GaWxlQ29waWVkOiAoZmlsZTogc3RyaW5nKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEVuc3VyZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzXG4gICAgYXdhaXQgZnMubWtkaXIoZGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoc3JjLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKHNyYywgZW50cnkubmFtZSk7XG4gICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihkZXN0LCBlbnRyeS5uYW1lKTtcbiAgICAgIFxuICAgICAgLy8gU2tpcCBleGNsdWRlZCBwYXR0ZXJuc1xuICAgICAgaWYgKHRoaXMuc2hvdWxkRXhjbHVkZShlbnRyeS5uYW1lLCBleGNsdWRlUGF0dGVybnMpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0ZpbGVPcGVyYXRpb25zXSBTa2lwcGluZyBleGNsdWRlZDogJHtlbnRyeS5uYW1lfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5RGlyZWN0b3J5UmVjdXJzaXZlKFxuICAgICAgICAgIHNyY1BhdGgsIFxuICAgICAgICAgIGRlc3RQYXRoLCBcbiAgICAgICAgICBleGNsdWRlUGF0dGVybnMsXG4gICAgICAgICAgbWF4UmV0cmllcyxcbiAgICAgICAgICBvbkZpbGVDb3BpZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29weUZpbGVXaXRoUmV0cnkoc3JjUGF0aCwgZGVzdFBhdGgsIG1heFJldHJpZXMpO1xuICAgICAgICBvbkZpbGVDb3BpZWQoc3JjUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ29weSBhIHNpbmdsZSBmaWxlIHdpdGggcmV0cnkgbG9naWNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGNvcHlGaWxlV2l0aFJldHJ5KFxuICAgIHNyYzogc3RyaW5nLFxuICAgIGRlc3Q6IHN0cmluZyxcbiAgICBtYXhSZXRyaWVzOiBudW1iZXJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbDtcbiAgICBcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBtYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKHNyYywgZGVzdCk7XG4gICAgICAgIHJldHVybjsgLy8gU3VjY2Vzc1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgYXMgRXJyb3I7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0ZpbGVPcGVyYXRpb25zXSBDb3B5IGF0dGVtcHQgJHthdHRlbXB0fSBmYWlsZWQgZm9yICR7c3JjfTogJHtlcnJvcn1gKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChhdHRlbXB0IDwgbWF4UmV0cmllcykge1xuICAgICAgICAgIC8vIFdhaXQgYmVmb3JlIHJldHJ5IChleHBvbmVudGlhbCBiYWNrb2ZmKVxuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBNYXRoLnBvdygyLCBhdHRlbXB0KSAqIDEwMCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFsbCByZXRyaWVzIGZhaWxlZFxuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvcHkgJHtzcmN9IGFmdGVyICR7bWF4UmV0cmllc30gYXR0ZW1wdHM6ICR7bGFzdEVycm9yPy5tZXNzYWdlfWApO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBmaWxlL2RpcmVjdG9yeSBzaG91bGQgYmUgZXhjbHVkZWRcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNob3VsZEV4Y2x1ZGUobmFtZTogc3RyaW5nLCBwYXR0ZXJuczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgIGlmIChwYXR0ZXJuLmluY2x1ZGVzKCcqJykpIHtcbiAgICAgICAgLy8gU2ltcGxlIGdsb2Igc3VwcG9ydFxuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgcGF0dGVybi5yZXBsYWNlKC9cXCovZywgJy4qJykgKyAnJCcpO1xuICAgICAgICBpZiAocmVnZXgudGVzdChuYW1lKSkgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKG5hbWUgPT09IHBhdHRlcm4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFJlbW92ZSBhIGRpcmVjdG9yeSB3aXRoIHByb2dyZXNzIHJlcG9ydGluZ1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlbW92ZURpcmVjdG9yeShcbiAgICBkaXI6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IG9uUHJvZ3Jlc3M/OiAocmVtb3ZlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSA9PiB2b2lkIH0gPSB7fVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuY2FsY3VsYXRlRGlyZWN0b3J5U3RhdHMoZGlyLCBbXSk7XG4gICAgbGV0IHJlbW92ZWRGaWxlcyA9IDA7XG4gICAgXG4gICAgYXdhaXQgdGhpcy5yZW1vdmVEaXJlY3RvcnlSZWN1cnNpdmUoZGlyLCAoKSA9PiB7XG4gICAgICByZW1vdmVkRmlsZXMrKztcbiAgICAgIGlmIChvcHRpb25zLm9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgb3B0aW9ucy5vblByb2dyZXNzKHJlbW92ZWRGaWxlcywgc3RhdHMudG90YWxGaWxlcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBJbnRlcm5hbCByZWN1cnNpdmUgcmVtb3ZlIGltcGxlbWVudGF0aW9uXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBhc3luYyByZW1vdmVEaXJlY3RvcnlSZWN1cnNpdmUoXG4gICAgZGlyOiBzdHJpbmcsXG4gICAgb25GaWxlUmVtb3ZlZDogKCkgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZURpcmVjdG9yeVJlY3Vyc2l2ZShmdWxsUGF0aCwgb25GaWxlUmVtb3ZlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZnMudW5saW5rKGZ1bGxQYXRoKTtcbiAgICAgICAgICBvbkZpbGVSZW1vdmVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUmVtb3ZlIHRoZSBub3ctZW1wdHkgZGlyZWN0b3J5XG4gICAgICBhd2FpdCBmcy5ybWRpcihkaXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtGaWxlT3BlcmF0aW9uc10gRXJyb3IgcmVtb3ZpbmcgZGlyZWN0b3J5ICR7ZGlyfTpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0cmFuc2FjdGlvbiBtYW5hZ2VyIGZvciBhdG9taWMgZmlsZSBvcGVyYXRpb25zXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlVHJhbnNhY3Rpb24oKTogRmlsZVRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gbmV3IEZpbGVUcmFuc2FjdGlvbigpO1xuICB9XG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gbWFuYWdlciBmb3IgYXRvbWljIGZpbGUgb3BlcmF0aW9uc1xuICogRW5zdXJlcyBhbGwgb3BlcmF0aW9ucyBzdWNjZWVkIG9yIGFsbCBhcmUgcm9sbGVkIGJhY2tcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVUcmFuc2FjdGlvbiB7XG4gIHByaXZhdGUgb3BlcmF0aW9uczogQXJyYXk8e1xuICAgIHR5cGU6ICdtb3ZlJyB8ICdjb3B5JyB8ICdkZWxldGUnIHwgJ2NyZWF0ZSc7XG4gICAgc291cmNlPzogc3RyaW5nO1xuICAgIGRlc3RpbmF0aW9uPzogc3RyaW5nO1xuICAgIHJvbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9PiA9IFtdO1xuICBcbiAgcHJpdmF0ZSBjb21wbGV0ZWQgPSBmYWxzZTtcbiAgXG4gIC8qKlxuICAgKiBBZGQgYSBtb3ZlIG9wZXJhdGlvbiB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIGFkZE1vdmUoc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jb21wbGV0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gYWxyZWFkeSBjb21wbGV0ZWQnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUGVyZm9ybSB0aGUgbW92ZVxuICAgIGF3YWl0IGZzLnJlbmFtZShzb3VyY2UsIGRlc3RpbmF0aW9uKTtcbiAgICBcbiAgICAvLyBBZGQgcm9sbGJhY2sgb3BlcmF0aW9uXG4gICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgdHlwZTogJ21vdmUnLFxuICAgICAgc291cmNlLFxuICAgICAgZGVzdGluYXRpb24sXG4gICAgICByb2xsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLnJlbmFtZShkZXN0aW5hdGlvbiwgc291cmNlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYFtGaWxlVHJhbnNhY3Rpb25dIEZhaWxlZCB0byByb2xsYmFjayBtb3ZlIGZyb20gJHtkZXN0aW5hdGlvbn0gdG8gJHtzb3VyY2V9OmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogQWRkIGEgY29weSBvcGVyYXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBhc3luYyBhZGRDb3B5KHNvdXJjZTogc3RyaW5nLCBkZXN0aW5hdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY29tcGxldGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIGFscmVhZHkgY29tcGxldGVkJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIFBlcmZvcm0gdGhlIGNvcHlcbiAgICBhd2FpdCBGaWxlT3BlcmF0aW9ucy5jb3B5RGlyZWN0b3J5KHNvdXJjZSwgZGVzdGluYXRpb24pO1xuICAgIFxuICAgIC8vIEFkZCByb2xsYmFjayBvcGVyYXRpb25cbiAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICB0eXBlOiAnY29weScsXG4gICAgICBzb3VyY2UsXG4gICAgICBkZXN0aW5hdGlvbixcbiAgICAgIHJvbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnMucm0oZGVzdGluYXRpb24sIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYFtGaWxlVHJhbnNhY3Rpb25dIEZhaWxlZCB0byByb2xsYmFjayBjb3B5IGF0ICR7ZGVzdGluYXRpb259OmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogQWRkIGEgZGVsZXRlIG9wZXJhdGlvbiB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIGFkZERlbGV0ZShwYXRoOiBzdHJpbmcsIGJhY2t1cFBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jb21wbGV0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gYWxyZWFkeSBjb21wbGV0ZWQnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gSWYgYmFja3VwIHBhdGggcHJvdmlkZWQsIG1vdmUgaW5zdGVhZCBvZiBkZWxldGVcbiAgICBpZiAoYmFja3VwUGF0aCkge1xuICAgICAgYXdhaXQgZnMucmVuYW1lKHBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgXG4gICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgIHR5cGU6ICdkZWxldGUnLFxuICAgICAgICBzb3VyY2U6IHBhdGgsXG4gICAgICAgIGRlc3RpbmF0aW9uOiBiYWNrdXBQYXRoLFxuICAgICAgICByb2xsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5yZW5hbWUoYmFja3VwUGF0aCwgcGF0aCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgW0ZpbGVUcmFuc2FjdGlvbl0gRmFpbGVkIHRvIHJlc3RvcmUgZGVsZXRlZCBpdGVtIGZyb20gJHtiYWNrdXBQYXRofSB0byAke3BhdGh9OmAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEaXJlY3QgZGVsZXRlIChubyByb2xsYmFjayBwb3NzaWJsZSlcbiAgICAgIGF3YWl0IGZzLnJtKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIFxuICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICB0eXBlOiAnZGVsZXRlJyxcbiAgICAgICAgc291cmNlOiBwYXRoLFxuICAgICAgICByb2xsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbRmlsZVRyYW5zYWN0aW9uXSBDYW5ub3Qgcm9sbGJhY2sgcGVybWFuZW50IGRlbGV0aW9uIG9mICR7cGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ29tbWl0IHRoZSB0cmFuc2FjdGlvbiAobWFyayBhcyBzdWNjZXNzZnVsKVxuICAgKi9cbiAgY29tbWl0KCk6IHZvaWQge1xuICAgIHRoaXMuY29tcGxldGVkID0gdHJ1ZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFJvbGxiYWNrIGFsbCBvcGVyYXRpb25zIGluIHJldmVyc2Ugb3JkZXJcbiAgICovXG4gIGFzeW5jIHJvbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5pbmZvKGBbRmlsZVRyYW5zYWN0aW9uXSBSb2xsaW5nIGJhY2sgJHt0aGlzLm9wZXJhdGlvbnMubGVuZ3RofSBvcGVyYXRpb25zYCk7XG4gICAgXG4gICAgLy8gUm9sbGJhY2sgaW4gcmV2ZXJzZSBvcmRlclxuICAgIGZvciAobGV0IGkgPSB0aGlzLm9wZXJhdGlvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMub3BlcmF0aW9uc1tpXTtcbiAgICAgIGxvZ2dlci5pbmZvKGBbRmlsZVRyYW5zYWN0aW9uXSBSb2xsaW5nIGJhY2sgJHtvcGVyYXRpb24udHlwZX0gb3BlcmF0aW9uYCk7XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9wZXJhdGlvbi5yb2xsYmFjaygpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbRmlsZVRyYW5zYWN0aW9uXSBSb2xsYmFjayBmYWlsZWQgZm9yIG9wZXJhdGlvbiAke2l9OmAsIGVycm9yKTtcbiAgICAgICAgLy8gQ29udGludWUgd2l0aCBvdGhlciByb2xsYmFja3NcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYW55IG9wZXJhdGlvbnMgaGF2ZSBiZWVuIHBlcmZvcm1lZFxuICAgKi9cbiAgaGFzT3BlcmF0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25zLmxlbmd0aCA+IDA7XG4gIH1cbn0iXX0=
315
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZU9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZmlsZU9wZXJhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWFyQzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUN6Qjs7O09BR0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FDeEIsR0FBVyxFQUNYLElBQVksRUFDWixVQUF1QixFQUFFO1FBRXpCLE1BQU0sRUFBRSxVQUFVLEVBQUUsZUFBZSxHQUFHLEVBQUUsRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRXJFLHNEQUFzRDtRQUN0RCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDdkUsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRXBCLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUMvQixHQUFHLEVBQ0gsSUFBSSxFQUNKLGVBQWUsRUFDZixVQUFVLEVBQ1YsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNkLFdBQVcsRUFBRSxDQUFDO1lBQ2QsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixVQUFVLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDekQsQ0FBQztRQUNILENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FDMUMsR0FBVyxFQUNYLGVBQXlCO1FBRXpCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLFNB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QUFDLFFBQVEsRUFBRSxDQUFDO1lBQzdCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsbURBQW1ELENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM3RSxnQ0FBZ0M7WUFDbEMsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDcEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBDb3B5T3B0aW9ucyB7XG4gIG9uUHJvZ3Jlc3M/OiAoY29waWVkOiBudW1iZXIsIHRvdGFsOiBudW1iZXIsIGN1cnJlbnRGaWxlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIGV4Y2x1ZGVQYXR0ZXJucz86IHN0cmluZ1tdO1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTdGF0cyB7XG4gIHRvdGFsRmlsZXM6IG51bWJlcjtcbiAgdG90YWxTaXplOiBudW1iZXI7XG59XG5cbi8qKlxuICogQ3Jvc3MtcGxhdGZvcm0gZmlsZSBvcGVyYXRpb25zIHV0aWxpdHlcbiAqIENlbnRyYWxpemVzIGNvbW1vbiBmaWxlIG9wZXJhdGlvbnMgd2l0aCBwcm9ncmVzcyByZXBvcnRpbmcgYW5kIGVycm9yIGhhbmRsaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWxlT3BlcmF0aW9ucyB7XG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBjb3B5IGEgZGlyZWN0b3J5IHdpdGggcHJvZ3Jlc3MgcmVwb3J0aW5nXG4gICAqIFdvcmtzIGNyb3NzLXBsYXRmb3JtIHdpdGhvdXQgcmVseWluZyBvbiBzaGVsbCBjb21tYW5kc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGNvcHlEaXJlY3RvcnkoXG4gICAgc3JjOiBzdHJpbmcsIFxuICAgIGRlc3Q6IHN0cmluZywgXG4gICAgb3B0aW9uczogQ29weU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IG9uUHJvZ3Jlc3MsIGV4Y2x1ZGVQYXR0ZXJucyA9IFtdLCBtYXhSZXRyaWVzID0gMyB9ID0gb3B0aW9ucztcbiAgICBcbiAgICAvLyBGaXJzdCwgY2FsY3VsYXRlIHRvdGFsIGZpbGVzIGZvciBwcm9ncmVzcyByZXBvcnRpbmdcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuY2FsY3VsYXRlRGlyZWN0b3J5U3RhdHMoc3JjLCBleGNsdWRlUGF0dGVybnMpO1xuICAgIGxldCBjb3BpZWRGaWxlcyA9IDA7XG4gICAgXG4gICAgYXdhaXQgdGhpcy5jb3B5RGlyZWN0b3J5UmVjdXJzaXZlKFxuICAgICAgc3JjLCBcbiAgICAgIGRlc3QsIFxuICAgICAgZXhjbHVkZVBhdHRlcm5zLFxuICAgICAgbWF4UmV0cmllcyxcbiAgICAgIChjdXJyZW50RmlsZSkgPT4ge1xuICAgICAgICBjb3BpZWRGaWxlcysrO1xuICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgIG9uUHJvZ3Jlc3MoY29waWVkRmlsZXMsIHN0YXRzLnRvdGFsRmlsZXMsIGN1cnJlbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgZGlyZWN0b3J5IHN0YXRpc3RpY3MgZm9yIHByb2dyZXNzIHJlcG9ydGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY2FsY3VsYXRlRGlyZWN0b3J5U3RhdHMoXG4gICAgZGlyOiBzdHJpbmcsXG4gICAgZXhjbHVkZVBhdHRlcm5zOiBzdHJpbmdbXVxuICApOiBQcm9taXNlPEZpbGVTdGF0cz4ge1xuICAgIGxldCB0b3RhbEZpbGVzID0gMDtcbiAgICBsZXQgdG90YWxTaXplID0gMDtcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuICAgICAgICBcbiAgICAgICAgLy8gU2tpcCBleGNsdWRlZCBwYXR0ZXJuc1xuICAgICAgICBpZiAodGhpcy5zaG91bGRFeGNsdWRlKGVudHJ5Lm5hbWUsIGV4Y2x1ZGVQYXR0ZXJucykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICBjb25zdCBzdWJTdGF0cyA9IGF3YWl0IHRoaXMuY2FsY3VsYXRlRGlyZWN0b3J5U3RhdHMoZnVsbFBhdGgsIGV4Y2x1ZGVQYXR0ZXJucyk7XG4gICAgICAgICAgdG90YWxGaWxlcyArPSBzdWJTdGF0cy50b3RhbEZpbGVzO1xuICAgICAgICAgIHRvdGFsU2l6ZSArPSBzdWJTdGF0cy50b3RhbFNpemU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG90YWxGaWxlcysrO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmdWxsUGF0aCk7XG4gICAgICAgICAgICB0b3RhbFNpemUgKz0gc3RhdC5zaXplO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gSWdub3JlIHN0YXQgZXJyb3JzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbRmlsZU9wZXJhdGlvbnNdIEVycm9yIGNhbGN1bGF0aW5nIHN0YXRzIGZvciAke2Rpcn06YCwgZXJyb3IpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4geyB0b3RhbEZpbGVzLCB0b3RhbFNpemUgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEludGVybmFsIHJlY3Vyc2l2ZSBjb3B5IGltcGxlbWVudGF0aW9uXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBhc3luYyBjb3B5RGlyZWN0b3J5UmVjdXJzaXZlKFxuICAgIHNyYzogc3RyaW5nLFxuICAgIGRlc3Q6IHN0cmluZyxcbiAgICBleGNsdWRlUGF0dGVybnM6IHN0cmluZ1tdLFxuICAgIG1heFJldHJpZXM6IG51bWJlcixcbiAgICBvbkZpbGVDb3BpZWQ6IChmaWxlOiBzdHJpbmcpID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRW5zdXJlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHNcbiAgICBhd2FpdCBmcy5ta2RpcihkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBcbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihzcmMsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oc3JjLCBlbnRyeS5uYW1lKTtcbiAgICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKGRlc3QsIGVudHJ5Lm5hbWUpO1xuICAgICAgXG4gICAgICAvLyBTa2lwIGV4Y2x1ZGVkIHBhdHRlcm5zXG4gICAgICBpZiAodGhpcy5zaG91bGRFeGNsdWRlKGVudHJ5Lm5hbWUsIGV4Y2x1ZGVQYXR0ZXJucykpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRmlsZU9wZXJhdGlvbnNdIFNraXBwaW5nIGV4Y2x1ZGVkOiAke2VudHJ5Lm5hbWV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmNvcHlEaXJlY3RvcnlSZWN1cnNpdmUoXG4gICAgICAgICAgc3JjUGF0aCwgXG4gICAgICAgICAgZGVzdFBhdGgsIFxuICAgICAgICAgIGV4Y2x1ZGVQYXR0ZXJucyxcbiAgICAgICAgICBtYXhSZXRyaWVzLFxuICAgICAgICAgIG9uRmlsZUNvcGllZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZVdpdGhSZXRyeShzcmNQYXRoLCBkZXN0UGF0aCwgbWF4UmV0cmllcyk7XG4gICAgICAgIG9uRmlsZUNvcGllZChzcmNQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb3B5IGEgc2luZ2xlIGZpbGUgd2l0aCByZXRyeSBsb2dpY1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY29weUZpbGVXaXRoUmV0cnkoXG4gICAgc3JjOiBzdHJpbmcsXG4gICAgZGVzdDogc3RyaW5nLFxuICAgIG1heFJldHJpZXM6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IG51bGwgPSBudWxsO1xuICAgIFxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heFJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMuY29weUZpbGUoc3JjLCBkZXN0KTtcbiAgICAgICAgcmV0dXJuOyAvLyBTdWNjZXNzXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBhcyBFcnJvcjtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRmlsZU9wZXJhdGlvbnNdIENvcHkgYXR0ZW1wdCAke2F0dGVtcHR9IGZhaWxlZCBmb3IgJHtzcmN9OiAke2Vycm9yfWApO1xuICAgICAgICBcbiAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhSZXRyaWVzKSB7XG4gICAgICAgICAgLy8gV2FpdCBiZWZvcmUgcmV0cnkgKGV4cG9uZW50aWFsIGJhY2tvZmYpXG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIE1hdGgucG93KDIsIGF0dGVtcHQpICogMTAwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQWxsIHJldHJpZXMgZmFpbGVkXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY29weSAke3NyY30gYWZ0ZXIgJHttYXhSZXRyaWVzfSBhdHRlbXB0czogJHtsYXN0RXJyb3I/Lm1lc3NhZ2V9YCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGZpbGUvZGlyZWN0b3J5IHNob3VsZCBiZSBleGNsdWRlZFxuICAgKlxuICAgKiBGSVg6IFJlRG9TIHZ1bG5lcmFiaWxpdHkgLSByZXBsYWNlZCB1bnNhZmUgZ2xvYi10by1yZWdleCBjb252ZXJzaW9uXG4gICAqIFByZXZpb3VzbHk6IFVzZWQgcGF0dGVybi5yZXBsYWNlIHdpdGggLiogd2hpY2ggY291bGQgY2F1c2UgY2F0YXN0cm9waGljIGJhY2t0cmFja2luZ1xuICAgKiBOb3c6IFVzZXMgc2FmZSBnbG9iIG1hdGNoaW5nIHdpdGggcHJvcGVyIGVzY2FwaW5nIGFuZCBib3VuZGVkIHBhdHRlcm5zXG4gICAqIFNvbmFyQ2xvdWQ6IFJlc29sdmVzIERPUyB2dWxuZXJhYmlsaXR5IGhvdHNwb3RcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNob3VsZEV4Y2x1ZGUobmFtZTogc3RyaW5nLCBwYXR0ZXJuczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAvLyBJbnB1dCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgRE9TXG4gICAgaWYgKG5hbWUubGVuZ3RoID4gMTAwMCkge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyBSZWplY3Qgb3Zlcmx5IGxvbmcgaW5wdXRzXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICBpZiAocGF0dGVybi5pbmNsdWRlcygnKicpKSB7XG4gICAgICAgIC8vIFNhZmUgZ2xvYiBzdXBwb3J0IC0gcHJldmVudCBSZURvU1xuICAgICAgICAvLyBFc2NhcGUgc3BlY2lhbCByZWdleCBjaGFycyBleGNlcHQgKlxuICAgICAgICAvLyBGSVg6IFVzZSBTdHJpbmcucmF3IGFuZCByZXBsYWNlQWxsIChTb25hckNsb3VkIFM3NzgwLCBTNzc4MSlcbiAgICAgICAgY29uc3QgZXNjYXBlZCA9IHBhdHRlcm4ucmVwbGFjZUFsbCgvWy4rP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG4gICAgICAgIC8vIFJlcGxhY2UgKiB3aXRoIFteL10qIChtYXRjaCBhbnl0aGluZyBleGNlcHQgcGF0aCBzZXBhcmF0b3IpXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgY2F0YXN0cm9waGljIGJhY2t0cmFja2luZ1xuICAgICAgICBjb25zdCBzYWZlUGF0dGVybiA9IGVzY2FwZWQucmVwbGFjZUFsbCgnKicsICdbXi9dKicpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRklYOiBVc2UgdGVtcGxhdGUgbGl0ZXJhbCB0byBhdm9pZCBzZWN1cml0eSBzY2FubmVyIGZhbHNlIHBvc2l0aXZlIChQUiAjMTE4NylcbiAgICAgICAgICAvLyBUaGlzIGlzIE5PVCBTUUwgaW5qZWN0aW9uIC0gaXQncyBhIFJlZ0V4cCBwYXR0ZXJuXG4gICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtzYWZlUGF0dGVybn0kYCk7XG4gICAgICAgICAgaWYgKHJlZ2V4LnRlc3QobmFtZSkpIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBJbnZhbGlkIHBhdHRlcm4gLSBza2lwIGl0XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gcGF0dGVybikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIFxuICAvKipcbiAgICogUmVtb3ZlIGEgZGlyZWN0b3J5IHdpdGggcHJvZ3Jlc3MgcmVwb3J0aW5nXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVtb3ZlRGlyZWN0b3J5KFxuICAgIGRpcjogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgb25Qcm9ncmVzcz86IChyZW1vdmVkOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpID0+IHZvaWQgfSA9IHt9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5jYWxjdWxhdGVEaXJlY3RvcnlTdGF0cyhkaXIsIFtdKTtcbiAgICBsZXQgcmVtb3ZlZEZpbGVzID0gMDtcbiAgICBcbiAgICBhd2FpdCB0aGlzLnJlbW92ZURpcmVjdG9yeVJlY3Vyc2l2ZShkaXIsICgpID0+IHtcbiAgICAgIHJlbW92ZWRGaWxlcysrO1xuICAgICAgaWYgKG9wdGlvbnMub25Qcm9ncmVzcykge1xuICAgICAgICBvcHRpb25zLm9uUHJvZ3Jlc3MocmVtb3ZlZEZpbGVzLCBzdGF0cy50b3RhbEZpbGVzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEludGVybmFsIHJlY3Vyc2l2ZSByZW1vdmUgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIHJlbW92ZURpcmVjdG9yeVJlY3Vyc2l2ZShcbiAgICBkaXI6IHN0cmluZyxcbiAgICBvbkZpbGVSZW1vdmVkOiAoKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgZW50cnkubmFtZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlRGlyZWN0b3J5UmVjdXJzaXZlKGZ1bGxQYXRoLCBvbkZpbGVSZW1vdmVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBmcy51bmxpbmsoZnVsbFBhdGgpO1xuICAgICAgICAgIG9uRmlsZVJlbW92ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBSZW1vdmUgdGhlIG5vdy1lbXB0eSBkaXJlY3RvcnlcbiAgICAgIGF3YWl0IGZzLnJtZGlyKGRpcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgW0ZpbGVPcGVyYXRpb25zXSBFcnJvciByZW1vdmluZyBkaXJlY3RvcnkgJHtkaXJ9OmAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRyYW5zYWN0aW9uIG1hbmFnZXIgZm9yIGF0b21pYyBmaWxlIG9wZXJhdGlvbnNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVUcmFuc2FjdGlvbigpOiBGaWxlVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiBuZXcgRmlsZVRyYW5zYWN0aW9uKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFuc2FjdGlvbiBtYW5hZ2VyIGZvciBhdG9taWMgZmlsZSBvcGVyYXRpb25zXG4gKiBFbnN1cmVzIGFsbCBvcGVyYXRpb25zIHN1Y2NlZWQgb3IgYWxsIGFyZSByb2xsZWQgYmFja1xuICovXG5leHBvcnQgY2xhc3MgRmlsZVRyYW5zYWN0aW9uIHtcbiAgLy8gRklYOiBNYXJrIGFzIHJlYWRvbmx5IHNpbmNlIG5ldmVyIHJlYXNzaWduZWQgKFNvbmFyQ2xvdWQgUzI5MzMpXG4gIHByaXZhdGUgcmVhZG9ubHkgb3BlcmF0aW9uczogQXJyYXk8e1xuICAgIHR5cGU6ICdtb3ZlJyB8ICdjb3B5JyB8ICdkZWxldGUnIHwgJ2NyZWF0ZSc7XG4gICAgc291cmNlPzogc3RyaW5nO1xuICAgIGRlc3RpbmF0aW9uPzogc3RyaW5nO1xuICAgIHJvbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9PiA9IFtdO1xuICBcbiAgcHJpdmF0ZSBjb21wbGV0ZWQgPSBmYWxzZTtcbiAgXG4gIC8qKlxuICAgKiBBZGQgYSBtb3ZlIG9wZXJhdGlvbiB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIGFkZE1vdmUoc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jb21wbGV0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gYWxyZWFkeSBjb21wbGV0ZWQnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUGVyZm9ybSB0aGUgbW92ZVxuICAgIGF3YWl0IGZzLnJlbmFtZShzb3VyY2UsIGRlc3RpbmF0aW9uKTtcbiAgICBcbiAgICAvLyBBZGQgcm9sbGJhY2sgb3BlcmF0aW9uXG4gICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgdHlwZTogJ21vdmUnLFxuICAgICAgc291cmNlLFxuICAgICAgZGVzdGluYXRpb24sXG4gICAgICByb2xsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLnJlbmFtZShkZXN0aW5hdGlvbiwgc291cmNlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYFtGaWxlVHJhbnNhY3Rpb25dIEZhaWxlZCB0byByb2xsYmFjayBtb3ZlIGZyb20gJHtkZXN0aW5hdGlvbn0gdG8gJHtzb3VyY2V9OmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogQWRkIGEgY29weSBvcGVyYXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBhc3luYyBhZGRDb3B5KHNvdXJjZTogc3RyaW5nLCBkZXN0aW5hdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY29tcGxldGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIGFscmVhZHkgY29tcGxldGVkJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIFBlcmZvcm0gdGhlIGNvcHlcbiAgICBhd2FpdCBGaWxlT3BlcmF0aW9ucy5jb3B5RGlyZWN0b3J5KHNvdXJjZSwgZGVzdGluYXRpb24pO1xuICAgIFxuICAgIC8vIEFkZCByb2xsYmFjayBvcGVyYXRpb25cbiAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICB0eXBlOiAnY29weScsXG4gICAgICBzb3VyY2UsXG4gICAgICBkZXN0aW5hdGlvbixcbiAgICAgIHJvbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnMucm0oZGVzdGluYXRpb24sIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYFtGaWxlVHJhbnNhY3Rpb25dIEZhaWxlZCB0byByb2xsYmFjayBjb3B5IGF0ICR7ZGVzdGluYXRpb259OmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogQWRkIGEgZGVsZXRlIG9wZXJhdGlvbiB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIGFkZERlbGV0ZShwYXRoOiBzdHJpbmcsIGJhY2t1cFBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jb21wbGV0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gYWxyZWFkeSBjb21wbGV0ZWQnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gSWYgYmFja3VwIHBhdGggcHJvdmlkZWQsIG1vdmUgaW5zdGVhZCBvZiBkZWxldGVcbiAgICBpZiAoYmFja3VwUGF0aCkge1xuICAgICAgYXdhaXQgZnMucmVuYW1lKHBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgXG4gICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgIHR5cGU6ICdkZWxldGUnLFxuICAgICAgICBzb3VyY2U6IHBhdGgsXG4gICAgICAgIGRlc3RpbmF0aW9uOiBiYWNrdXBQYXRoLFxuICAgICAgICByb2xsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5yZW5hbWUoYmFja3VwUGF0aCwgcGF0aCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgW0ZpbGVUcmFuc2FjdGlvbl0gRmFpbGVkIHRvIHJlc3RvcmUgZGVsZXRlZCBpdGVtIGZyb20gJHtiYWNrdXBQYXRofSB0byAke3BhdGh9OmAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEaXJlY3QgZGVsZXRlIChubyByb2xsYmFjayBwb3NzaWJsZSlcbiAgICAgIGF3YWl0IGZzLnJtKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIFxuICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICB0eXBlOiAnZGVsZXRlJyxcbiAgICAgICAgc291cmNlOiBwYXRoLFxuICAgICAgICByb2xsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbRmlsZVRyYW5zYWN0aW9uXSBDYW5ub3Qgcm9sbGJhY2sgcGVybWFuZW50IGRlbGV0aW9uIG9mICR7cGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ29tbWl0IHRoZSB0cmFuc2FjdGlvbiAobWFyayBhcyBzdWNjZXNzZnVsKVxuICAgKi9cbiAgY29tbWl0KCk6IHZvaWQge1xuICAgIHRoaXMuY29tcGxldGVkID0gdHJ1ZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFJvbGxiYWNrIGFsbCBvcGVyYXRpb25zIGluIHJldmVyc2Ugb3JkZXJcbiAgICovXG4gIGFzeW5jIHJvbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5pbmZvKGBbRmlsZVRyYW5zYWN0aW9uXSBSb2xsaW5nIGJhY2sgJHt0aGlzLm9wZXJhdGlvbnMubGVuZ3RofSBvcGVyYXRpb25zYCk7XG4gICAgXG4gICAgLy8gUm9sbGJhY2sgaW4gcmV2ZXJzZSBvcmRlclxuICAgIGZvciAobGV0IGkgPSB0aGlzLm9wZXJhdGlvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMub3BlcmF0aW9uc1tpXTtcbiAgICAgIGxvZ2dlci5pbmZvKGBbRmlsZVRyYW5zYWN0aW9uXSBSb2xsaW5nIGJhY2sgJHtvcGVyYXRpb24udHlwZX0gb3BlcmF0aW9uYCk7XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9wZXJhdGlvbi5yb2xsYmFjaygpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbRmlsZVRyYW5zYWN0aW9uXSBSb2xsYmFjayBmYWlsZWQgZm9yIG9wZXJhdGlvbiAke2l9OmAsIGVycm9yKTtcbiAgICAgICAgLy8gQ29udGludWUgd2l0aCBvdGhlciByb2xsYmFja3NcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYW55IG9wZXJhdGlvbnMgaGF2ZSBiZWVuIHBlcmZvcm1lZFxuICAgKi9cbiAgaGFzT3BlcmF0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25zLmxlbmd0aCA+IDA7XG4gIH1cbn0iXX0=