@wdio/browserstack-service 9.35.0 → 9.35.1
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.
- package/build/accessibility-handler.d.ts +6 -0
- package/build/cleanup.js +2 -2
- package/build/cli/modules/accessibilityModule.d.ts +23 -2
- package/build/index.js +114 -16
- package/build/service.d.ts +17 -0
- package/package.json +1 -1
package/build/cleanup.js
CHANGED
|
@@ -70,7 +70,7 @@ import logger from "@wdio/logger";
|
|
|
70
70
|
// package.json
|
|
71
71
|
var package_default = {
|
|
72
72
|
name: "@wdio/browserstack-service",
|
|
73
|
-
version: "9.35.
|
|
73
|
+
version: "9.35.1",
|
|
74
74
|
description: "WebdriverIO service for better Browserstack integration",
|
|
75
75
|
author: "BrowserStack <support@browserstack.com>",
|
|
76
76
|
homepage: "https://github.com/browserstack/wdio-browserstack-service",
|
|
@@ -4545,4 +4545,4 @@ void BStackCleanup.startCleanup();
|
|
|
4545
4545
|
export {
|
|
4546
4546
|
BStackCleanup as default
|
|
4547
4547
|
};
|
|
4548
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWwudHMiLCAiLi4vc3JjL2xvZ1BhdGNoZXIudHMiLCAiLi4vc3JjL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIudHMiLCAiLi4vc3JjL2JzdGFja0xvZ2dlci50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vc3JjL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2FwaVV0aWxzLnRzIiwgIi4uL3NyYy9jbGkvY2xpVXRpbHMudHMiLCAiLi4vc3JjL2ZldGNoV3JhcHBlci50cyIsICIuLi9zcmMvaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2NsaUxvZ2dlci50cyIsICIuLi9zcmMvY2xpL2ZyYW1ld29ya3MvY29uc3RhbnRzL3Rlc3RGcmFtZXdvcmtDb25zdGFudHMudHMiLCAiLi4vc3JjL3Rlc3RIdWIvdXRpbHMudHMiLCAiLi4vc3JjL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLnRzIiwgIi4uL3NyYy9jcmFzaC1yZXBvcnRlci50cyIsICIuLi9zcmMvY29uZmlnQ2FwdHVyZS50cyIsICIuLi9zcmMvdGVzdE9wcy9mZWF0dXJlU3RhdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvZmVhdHVyZVVzYWdlLnRzIiwgIi4uL3NyYy90ZXN0T3BzL3Rlc3RPcHNDb25maWcudHMiLCAiLi4vc3JjL3Rlc3RPcHMvdXNhZ2VTdGF0cy50cyIsICIuLi9zcmMvc2NyaXB0cy9hY2Nlc3NpYmlsaXR5LXNjcmlwdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvb3BlblJ1bnNKb3VybmFsLnRzIiwgIi4uL3NyYy9jbGVhbnVwLnRzIiwgIi4uL3NyYy9pbnN0cnVtZW50YXRpb24vZnVubmVsSW5zdHJ1bWVudGF0aW9uLnRzIiwgIi4uL3NyYy9kYXRhLXN0b3JlLnRzIl0sCiAgInNvdXJjZVJvb3QiOiAiL2hvbWUvcnVubmVyL3dvcmsvd2Rpby1icm93c2Vyc3RhY2stc2VydmljZS93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlL3BhY2thZ2VzL2Jyb3dzZXJzdGFjay1zZXJ2aWNlIiwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGhvc3RuYW1lLCBwbGF0Zm9ybSwgdHlwZSwgdmVyc2lvbiwgYXJjaCwgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCB6bGliIGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB7IGZvcm1hdCwgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHV0aWwgZnJvbSAnbm9kZTp1dGlsJ1xuXG5pbXBvcnQgdHlwZSB7IENhcGFiaWxpdGllcywgRnJhbWV3b3JrcywgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBCZWZvcmVDb21tYW5kQXJncywgQWZ0ZXJDb21tYW5kQXJncyB9IGZyb20gJ0B3ZGlvL3JlcG9ydGVyJ1xuXG5pbXBvcnQgdHlwZSB7IEdpdFJlcG9JbmZvIH0gZnJvbSAnZ2l0LXJlcG8taW5mbydcbmltcG9ydCBnaXRSZXBvSW5mbyBmcm9tICdnaXQtcmVwby1pbmZvJ1xuaW1wb3J0IGdpdGNvbmZpZyBmcm9tICdnaXRjb25maWdsb2NhbCdcbmltcG9ydCB0eXBlIHsgQ29sb3JOYW1lIH0gZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBwZXJmb3JtYW5jZSB9IGZyb20gJ25vZGU6cGVyZl9ob29rcydcbmltcG9ydCBsb2dQYXRjaGVyIGZyb20gJy4vbG9nUGF0Y2hlci5qcydcbmltcG9ydCBQZXJmb3JtYW5jZVRlc3RlciBmcm9tICcuL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgKiBhcyBQRVJGT1JNQU5DRV9TREtfRVZFTlRTIGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IGxvZ0J1aWxkRXJyb3IsIGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eSwgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5LCBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSBCcm93c2VyU3RhY2tDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5pbXBvcnQgeyBPcmNoZXN0cmF0aW9uVXRpbHMgfSBmcm9tICcuL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLmpzJ1xuaW1wb3J0IHR5cGUgeyBFcnJvcnMgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSB7IFVzZXJDb25maWcsIFVwbG9hZFR5cGUsIEJyb3dzZXJzdGFja0NvbmZpZywgQnJvd3NlcnN0YWNrT3B0aW9ucywgTGF1bmNoUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHR5cGUgeyBJVGVzdENhc2VIb29rUGFyYW1ldGVyIH0gZnJvbSAnLi9jdWN1bWJlci10eXBlcy5qcydcbmltcG9ydCB7XG4gICAgQlJPV1NFUl9ERVNDUklQVElPTixcbiAgICBVUExPQURfTE9HU19FTkRQT0lOVCxcbiAgICBjb25zb2xlSG9sZGVyLFxuICAgIFRFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsXG4gICAgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0xUUyxcbiAgICBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQsXG4gICAgVEVTVE9QU19TQ1JFRU5TSE9UX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELFxuICAgIEJST1dTRVJTVEFDS19LSUxMX1NJR05BTCxcbiAgICBQRVJGX01FQVNVUkVNRU5UX0VOVixcbiAgICBSRVJVTl9FTlYsXG4gICAgQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRCxcbiAgICBNQVhfR0lUX01FVEFfREFUQV9TSVpFX0lOX0JZVEVTLFxuICAgIEdJVF9NRVRBX0RBVEFfVFJVTkNBVEVELFxuICAgIEFQUF9BTExZX0lTU1VFU19TVU1NQVJZX0VORFBPSU5ULFxuICAgIEFQUF9BTExZX0lTU1VFU19FTkRQT0lOVCxcbiAgICBDTElfREVCVUdfTE9HU19GSUxFLFxuICAgIFdESU9fTkFNSU5HX1BSRUZJWCxcbiAgICBTVE9QX0JVSUxEX01BWF9BVFRFTVBUUyxcbiAgICBTVE9QX0JVSUxEX0FUVEVNUFRfVElNRU9VVF9NUyxcbiAgICBTVE9QX0JVSUxEX1RPVEFMX0JVREdFVF9NUyxcbiAgICBTVE9QX0JVSUxEX0JBQ0tPRkZfQkFTRV9NU1xufSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCBDcmFzaFJlcG9ydGVyIGZyb20gJy4vY3Jhc2gtcmVwb3J0ZXIuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB7IGNvbGxlY3RDb25maWdGaWxlc0ZvclVwbG9hZCwgZGVkdXBlRW50cnlOYW1lLCBmaW5kUGFja2FnZUpzb25Gb3JVcGxvYWQsIGlzQXV0b0NhcHR1cmVMb2dzRGlzYWJsZWQsIHJlZGFjdFNlbnNpdGl2ZUNvbnRlbnQsIHJlbGF0aXZlRGlyVG9Dd2QgfSBmcm9tICcuL2NvbmZpZ0NhcHR1cmUuanMnXG5pbXBvcnQgVXNhZ2VTdGF0cyBmcm9tICcuL3Rlc3RPcHMvdXNhZ2VTdGF0cy5qcydcbmltcG9ydCBUZXN0T3BzQ29uZmlnIGZyb20gJy4vdGVzdE9wcy90ZXN0T3BzQ29uZmlnLmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGFydEJpblNlc3Npb25SZXNwb25zZSB9IGZyb20gJy4vZ3JwYy9pbmRleC5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuL2NsaS9hcGlVdGlscy5qcydcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3RhcidcblxuaW1wb3J0IEFjY2Vzc2liaWxpdHlTY3JpcHRzIGZyb20gJy4vc2NyaXB0cy9hY2Nlc3NpYmlsaXR5LXNjcmlwdHMuanMnXG5cbmltcG9ydCB7IF9mZXRjaCBhcyBmZXRjaCB9IGZyb20gJy4vZmV0Y2hXcmFwcGVyLmpzJ1xuXG5jb25zdCBwR2l0Y29uZmlnID0gcHJvbWlzaWZ5KGdpdGNvbmZpZylcblxuZXhwb3J0IHR5cGUgR2l0TWV0YURhdGEgPSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNoYTogc3RyaW5nO1xuICAgIHNob3J0X3NoYTogc3RyaW5nO1xuICAgIGJyYW5jaDogc3RyaW5nO1xuICAgIHRhZzogc3RyaW5nIHwgbnVsbDtcbiAgICBjb21taXR0ZXI6IHN0cmluZztcbiAgICBjb21taXR0ZXJfZGF0ZTogc3RyaW5nO1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIGF1dGhvcl9kYXRlOiBzdHJpbmc7XG4gICAgY29tbWl0X21lc3NhZ2U6IHN0cmluZztcbiAgICByb290OiBzdHJpbmc7XG4gICAgY29tbW9uX2dpdF9kaXI6IHN0cmluZztcbiAgICB3b3JrdHJlZV9naXRfZGlyOiBzdHJpbmc7XG4gICAgbGFzdF90YWc6IHN0cmluZyB8IG51bGw7XG4gICAgY29tbWl0c19zaW5jZV9sYXN0X3RhZzogbnVtYmVyO1xuICAgIHJlbW90ZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB1cmw6IHN0cmluZyB9Pjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVRVUVTVF9DT05GSUcgPSB7XG4gICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnWC1CU1RBQ0stT0JTJzogJ3RydWUnXG4gICAgfSxcbn1cblxuZXhwb3J0IGNvbnN0IENPTE9SUzogUmVjb3JkPHN0cmluZywgQ29sb3JOYW1lPiA9IHtcbiAgICBlcnJvcjogJ3JlZCcsXG4gICAgd2FybjogJ3llbGxvdycsXG4gICAgaW5mbzogJ2N5YW5CcmlnaHQnLFxuICAgIGRlYnVnOiAnZ3JlZW4nLFxuICAgIHRyYWNlOiAnY3lhbicsXG4gICAgcHJvZ3Jlc3M6ICdtYWdlbnRhJ1xufVxuXG4vKipcbiAqIGdldCBicm93c2VyIGRlc2NyaXB0aW9uIGZvciBCcm93c2Vyc3RhY2sgc2VydmljZVxuICogQHBhcmFtIGNhcCBicm93c2VyIGNhcGFibGl0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyRGVzY3JpcHRpb24oY2FwOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpIHtcbiAgICBjYXAgPSBjYXAgfHwge31cbiAgICBpZiAoY2FwWydic3RhY2s6b3B0aW9ucyddKSB7XG4gICAgICAgIGNhcCA9IHsgLi4uY2FwLCAuLi5jYXBbJ2JzdGFjazpvcHRpb25zJ10gfSBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGVzZSBrZXlzIGRlc2NyaWJlIHRoZSBicm93c2VyIHRoZSB0ZXN0IHdhcyBydW4gb25cbiAgICAgKi9cbiAgICByZXR1cm4gQlJPV1NFUl9ERVNDUklQVElPTlxuICAgICAgICAubWFwKChrKSA9PiAoY2FwKVtrIGFzIGtleW9mIHR5cGVvZiBjYXBdKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5qb2luKCcgJylcbn1cblxuLyoqXG4gKiBnZXQgY29ycmVjdCBicm93c2VyIGNhcGFiaWxpdGllcyBvYmplY3QgaW4gYm90aCBtdWx0aXJlbW90ZSBhbmQgbm9ybWFsIHNldHVwc1xuICogQHBhcmFtIGJyb3dzZXIgYnJvd3NlciBvYmplY3RcbiAqIEBwYXJhbSBjYXBzIGJyb3dzZXIgY2FwYmlsaXRpZXMgb2JqZWN0LiBJbiBjYXNlIG9mIG11bHRpcmVtb3RlLCB0aGUgb2JqZWN0IGl0c2VsZiBzaG91bGQgaGF2ZSBhIHByb3BlcnR5IG5hbWVkICdjYXBhYmlsaXRpZXMnXG4gKiBAcGFyYW0gYnJvd3Nlck5hbWUgYnJvd3NlciBuYW1lIGluIGNhc2Ugb2YgbXVsdGlyZW1vdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJDYXBhYmlsaXRpZXMoYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciB8IFdlYmRyaXZlcklPLk11bHRpUmVtb3RlQnJvd3NlciwgY2Fwcz86IENhcGFiaWxpdGllcy5SZXNvbHZlZFRlc3RydW5uZXJDYXBhYmlsaXRpZXMsIGJyb3dzZXJOYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKCFicm93c2VyLmlzTXVsdGlyZW1vdGUpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uYnJvd3Nlci5jYXBhYmlsaXRpZXMsIC4uLmNhcHMgfSBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNcbiAgICB9XG5cbiAgICBjb25zdCBtdWx0aUNhcHMgPSBjYXBzIGFzIENhcGFiaWxpdGllcy5SZXF1ZXN0ZWRNdWx0aXJlbW90ZUNhcGFiaWxpdGllc1xuICAgIGNvbnN0IGdsb2JhbENhcCA9IGJyb3dzZXJOYW1lICYmIGJyb3dzZXIuZ2V0SW5zdGFuY2UoYnJvd3Nlck5hbWUpID8gYnJvd3Nlci5nZXRJbnN0YW5jZShicm93c2VyTmFtZSkuY2FwYWJpbGl0aWVzIDoge31cbiAgICBjb25zdCBjYXAgPSBicm93c2VyTmFtZSAmJiBtdWx0aUNhcHNbYnJvd3Nlck5hbWVdID8gbXVsdGlDYXBzW2Jyb3dzZXJOYW1lXS5jYXBhYmlsaXRpZXMgOiB7fVxuICAgIHJldHVybiB7IC4uLmdsb2JhbENhcCwgLi4uY2FwIH0gYXMgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXG59XG5cbi8qKlxuICogY2hlY2sgZm9yIGJyb3dzZXJzdGFjayBXM0MgY2FwYWJpbGl0aWVzLiBEb2VzIG5vdCBzdXBwb3J0IGxlZ2FjeSBjYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSBjYXAgYnJvd3NlciBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcnN0YWNrQ2FwYWJpbGl0eShjYXA/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpIHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgICAgY2FwICYmXG4gICAgICAgICAgICBjYXBbJ2JzdGFjazpvcHRpb25zJ10gJiZcbiAgICAgICAgICAgIC8vIHJldHVybiBmYWxzZSBpZiB0aGUgb25seSBjYXAgaW4gYnN0YWNrOm9wdGlvbnMgaXMgd2Rpb1NlcnZpY2UsXG4gICAgICAgICAgICAvLyBhcyB0aGF0IGlzIGFkZGVkIGJ5IHRoZSBzZXJ2aWNlIGFuZCBub3QgcHJlc2VudCBpbiB1c2VyIHBhc3NlZCBjYXBzXG4gICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGNhcFsnYnN0YWNrOm9wdGlvbnMnXSkubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgY2FwWydic3RhY2s6b3B0aW9ucyddLndkaW9TZXJ2aWNlXG4gICAgICAgICAgICApXG4gICAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50U3VpdGVOYW1lKGZ1bGxUaXRsZTogc3RyaW5nLCB0ZXN0U3VpdGVUaXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmdWxsVGl0bGVXb3JkcyA9IGZ1bGxUaXRsZS5zcGxpdCgnICcpXG4gICAgY29uc3QgdGVzdFN1aXRlVGl0bGVXb3JkcyA9IHRlc3RTdWl0ZVRpdGxlLnNwbGl0KCcgJylcbiAgICBjb25zdCBzaG9ydGVzdExlbmd0aCA9IE1hdGgubWluKGZ1bGxUaXRsZVdvcmRzLmxlbmd0aCwgdGVzdFN1aXRlVGl0bGVXb3Jkcy5sZW5ndGgpXG4gICAgbGV0IGMgPSAwXG4gICAgbGV0IHBhcmVudFN1aXRlTmFtZSA9ICcnXG4gICAgd2hpbGUgKGMgPCBzaG9ydGVzdExlbmd0aCAmJiBmdWxsVGl0bGVXb3Jkc1tjXSA9PT0gdGVzdFN1aXRlVGl0bGVXb3Jkc1tjXSkge1xuICAgICAgICBwYXJlbnRTdWl0ZU5hbWUgKz0gZnVsbFRpdGxlV29yZHNbYysrXSArICcgJ1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50U3VpdGVOYW1lLnRyaW0oKVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRXJyb3IoZXJyb3I6IEVycm9yLCBmbjogRnVuY3Rpb24sIGFyZ3M6IHVua25vd25bXSkge1xuICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgaW4gZXhlY3V0aW5nICR7Zm4ubmFtZX0gd2l0aCBhcmdzICR7YXJnc306ICR7ZXJyb3J9YClcbiAgICBsZXQgYXJnc1N0cmluZzogc3RyaW5nXG4gICAgdHJ5IHtcbiAgICAgICAgYXJnc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KGFyZ3MpXG4gICAgfSBjYXRjaCB7XG4gICAgICAgIGFyZ3NTdHJpbmcgPSB1dGlsLmluc3BlY3QoYXJncywgeyBkZXB0aDogMiB9KVxuICAgIH1cbiAgICBDcmFzaFJlcG9ydGVyLnVwbG9hZENyYXNoUmVwb3J0KGBFcnJvciBpbiBleGVjdXRpbmcgJHtmbi5uYW1lfSB3aXRoIGFyZ3MgJHthcmdzU3RyaW5nfSA6ICR7ZXJyb3J9YCwgZXJyb3IgJiYgZXJyb3Iuc3RhY2sgfHwgJ3Vua25vd24gZXJyb3InKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbzExeUVycm9ySGFuZGxlcihmbjogRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGZ1bmN0aW9uVG9IYW5kbGUgPSBmblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25Ub0hhbmRsZSA9IHBlcmZvcm1hbmNlLnRpbWVyaWZ5KGZ1bmN0aW9uVG9IYW5kbGUgYXMgYW55KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZnVuY3Rpb25Ub0hhbmRsZSguLi5hcmdzKVxuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNhdGNoKGVycm9yID0+IHByb2Nlc3NFcnJvcihlcnJvciwgZm4sIGFyZ3MpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGVycm9yIGFzIEVycm9yLCBmbiwgYXJncylcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9ySGFuZGxlcihmbjogRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZnVuY3Rpb25Ub0hhbmRsZSA9IGZuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmdW5jdGlvblRvSGFuZGxlKC4uLmFyZ3MpXG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2F0Y2goZXJyb3IgPT4gQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiBleGVjdXRpbmcgJHtmbi5uYW1lfSB3aXRoIGFyZ3MgJHthcmdzfTogJHtlcnJvcn1gKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgaW4gZXhlY3V0aW5nICR7Zm4ubmFtZX0gd2l0aCBhcmdzICR7YXJnc306ICR7ZXJyb3J9YClcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5vZGVSZXF1ZXN0KHJlcXVlc3RUeXBlOiBzdHJpbmcsIGFwaUVuZHBvaW50OiBzdHJpbmcsIG9wdGlvbnM6IFJlcXVlc3RJbml0LCBhcGlVcmw6IHN0cmluZywgdGltZW91dDogbnVtYmVyID0gMTIwMDAwKSB7XG4gICAgdHJ5IHtcblxuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YXBpVXJsfS8ke2FwaUVuZHBvaW50fWAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdFR5cGUsXG4gICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9KVxuXG4gICAgICAgIC8vIENsZWFyIHRoZSB0aW1lb3V0IGFzIHRoZSByZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcblxuICAgICAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3IgaW4gZmlyaW5nIHJlcXVlc3QgJHthcGlVcmx9LyR7YXBpRW5kcG9pbnR9OiAke2Zvcm1hdChlcnJvcil9YClcbiAgICAgICAgY29uc3QgaXNMb2dVcGxvYWQgPSBhcGlFbmRwb2ludCA9PT0gVVBMT0FEX0xPR1NfRU5EUE9JTlRcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2VKc29uID0gZXJyb3IucmVzcG9uc2UuYm9keSA/IEpTT04ucGFyc2UoZXJyb3IucmVzcG9uc2UuYm9keS50b1N0cmluZygpKSA6IG51bGxcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZUpzb24gPyBlcnJvck1lc3NhZ2VKc29uLm1lc3NhZ2UgOiBudWxsXG4gICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGAke2Vycm9yTWVzc2FnZX0gLSAke2Vycm9yLnN0YWNrfWBcbiAgICAgICAgICAgICAgICBpZiAoaXNMb2dVcGxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNMb2dVcGxvYWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNMb2dVcGxvYWQpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEZhaWxlZCB0byBmaXJlIGFwaSByZXF1ZXN0IGR1ZSB0byAke2Vycm9yfSAtICR7ZXJyb3Iuc3RhY2t9YClcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGZpcmUgYXBpIHJlcXVlc3QgZHVlIHRvICR7ZXJyb3J9IC0gJHtlcnJvci5zdGFja31gKVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gaHR0cHM6Ly90dWdheWlsaWsubWVkaXVtLmNvbS9lcnJvci1oYW5kbGluZy12aWEtdHJ5LWNhdGNoLXByb3h5LWluLWphdmFzY3JpcHQtNTQxMTZkYmY3ODNmXG4vKlxuICAgIEEgY2xhc3Mgd3JhcHBlciBmb3IgZXJyb3IgaGFuZGxpbmcuIFRoZSB3cmFwcGVyIHdyYXBzIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgY2xhc3Mgd2l0aCBhIGVycm9yIGhhbmRsZXIgZnVuY3Rpb24uXG4gICAgSWYgYW55IGV4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGFzcyBtZXRob2QsIHRoYXQgd2lsbCBnZXQgY2F1Z2h0IGluIHRoZSB3cmFwcGVyIHdoaWNoIGxvZ3MgYW5kIHJlcG9ydHMgdGhlIGVycm9yLlxuICovXG50eXBlIENsYXNzVHlwZSA9IHsgbmV3KC4uLmFyZ3M6IHVua25vd25bXSk6IHVua25vd247IH0gLy8gQSBnZW5lcmljIHR5cGUgZm9yIGEgY2xhc3NcbmV4cG9ydCBmdW5jdGlvbiBvMTF5Q2xhc3NFcnJvckhhbmRsZXI8VCBleHRlbmRzIENsYXNzVHlwZT4oZXJyb3JDbGFzczogVCk6IFQge1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IGVycm9yQ2xhc3MucHJvdG90eXBlXG5cbiAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlKS5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBlcnJvckNsYXNzXG4gICAgfVxuXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlKS5mb3JFYWNoKChtZXRob2ROYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IHByb3RvdHlwZVttZXRob2ROYW1lXVxuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJyAmJiBtZXRob2ROYW1lICE9PSAnY29uc3RydWN0b3InICYmIG1ldGhvZE5hbWUgIT09ICdjb21tYW5kV3JhcHBlcicpIHtcbiAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIHByZXNlcnZlIHRoaXMgY29udGV4dCwgbmVlZCB0byBkZWZpbmUgbGlrZSB0aGlzXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSA/IHBlcmZvcm1hbmNlLnRpbWVyaWZ5KG1ldGhvZCkgOiBtZXRob2QpLmNhbGwodGhpcywgLi4uYXJncylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5jYXRjaChlcnJvciA9PiBwcm9jZXNzRXJyb3IoZXJyb3IsIG1ldGhvZCwgYXJncykpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG5cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3IoZXJyIGFzIEVycm9yLCBtZXRob2QsIGFyZ3MpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBlcnJvckNsYXNzXG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzVGVzdE9ic2VydmFiaWxpdHlSZXNwb25zZSA9IChyZXNwb25zZTogTGF1bmNoUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlLm9ic2VydmFiaWxpdHkpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGb3JPYnNlcnZhYmlsaXR5KG51bGwpXG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLm9ic2VydmFiaWxpdHkuc3VjY2Vzcykge1xuICAgICAgICBoYW5kbGVFcnJvckZvck9ic2VydmFiaWxpdHkocmVzcG9uc2Uub2JzZXJ2YWJpbGl0eSBhcyBFcnJvcnMpXG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWV0gPSAndHJ1ZSdcbiAgICBpZiAocmVzcG9uc2Uub2JzZXJ2YWJpbGl0eS5vcHRpb25zLmFsbG93X3NjcmVlbnNob3RzKSB7XG4gICAgICAgIHByb2Nlc3MuZW52W1RFU1RPUFNfU0NSRUVOU0hPVF9FTlZdID0gcmVzcG9uc2Uub2JzZXJ2YWJpbGl0eS5vcHRpb25zLmFsbG93X3NjcmVlbnNob3RzLnRvU3RyaW5nKClcbiAgICB9XG59XG5cbmludGVyZmFjZSBEYXRhRWxlbWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5leHBvcnQgY29uc3QganNvbmlmeUFjY2Vzc2liaWxpdHlBcnJheSA9IChcbiAgICBkYXRhQXJyYXk6IERhdGFFbGVtZW50W10sXG4gICAga2V5TmFtZToga2V5b2YgRGF0YUVsZW1lbnQsXG4gICAgdmFsdWVOYW1lOiBrZXlvZiBEYXRhRWxlbWVudFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgIGRhdGFBcnJheS5mb3JFYWNoKChlbGVtZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICByZXN1bHRbZWxlbWVudFtrZXlOYW1lXSBhcyBzdHJpbmddID0gZWxlbWVudFt2YWx1ZU5hbWVdXG4gICAgfSlcbiAgICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzQWNjZXNzaWJpbGl0eVJlc3BvbnNlID0gKHJlc3BvbnNlOiBMYXVuY2hSZXNwb25zZSB8IFN0YXJ0QmluU2Vzc2lvblJlc3BvbnNlLCBvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlLmFjY2Vzc2liaWxpdHkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYWNjZXNzaWJpbGl0eSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5KG51bGwpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5zdWNjZXNzKSB7XG4gICAgICAgIGhhbmRsZUVycm9yRm9yQWNjZXNzaWJpbGl0eShyZXNwb25zZS5hY2Nlc3NpYmlsaXR5IGFzIEVycm9ycylcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkub3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IGFjY2Vzc2liaWxpdHlUb2tlbiwgcG9sbGluZ1RpbWVvdXQsIHNjYW5uZXJWZXJzaW9uIH0gPSBqc29uaWZ5QWNjZXNzaWJpbGl0eUFycmF5KHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkub3B0aW9ucy5jYXBhYmlsaXRpZXMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCAnbmFtZScsICd2YWx1ZScpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGpzb25pZnlBY2Nlc3NpYmlsaXR5QXJyYXkocmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5vcHRpb25zLmNhcGFiaWxpdGllcyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sICduYW1lJywgJ3ZhbHVlJylcbiAgICAgICAgY29uc3Qgc2NyaXB0c0pzb24gPSB7XG4gICAgICAgICAgICAnc2NyaXB0cyc6IGpzb25pZnlBY2Nlc3NpYmlsaXR5QXJyYXkocmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5vcHRpb25zLnNjcmlwdHMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCAnbmFtZScsICdjb21tYW5kJyksXG4gICAgICAgICAgICAnY29tbWFuZHMnOiByZXNwb25zZS5hY2Nlc3NpYmlsaXR5Lm9wdGlvbnMuY29tbWFuZHNUb1dyYXA/LmNvbW1hbmRzID8/IFtdLFxuICAgICAgICAgICAgJ25vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnMnOiByZXN1bHRbJ2dvb2c6Y2hyb21lT3B0aW9ucyddXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjYW5uZXJWZXJzaW9uKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9TQ0FOTkVSX1ZFUlNJT04gPSBzY2FubmVyVmVyc2lvbiBhcyBzdHJpbmdcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgQWNjZXNzaWJpbGl0eSBzY2FubmVyVmVyc2lvbiAke3NjYW5uZXJWZXJzaW9ufWApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjY2Vzc2liaWxpdHlUb2tlbikge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldUID0gYWNjZXNzaWJpbGl0eVRva2VuIGFzIHN0cmluZ1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFldID0gJ3RydWUnXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvbGxpbmdUaW1lb3V0KSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9QT0xMSU5HX1RJTUVPVVQgPSBwb2xsaW5nVGltZW91dCBhcyBzdHJpbmdcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NyaXB0c0pzb24pIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZml4IHR5cGVcbiAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTY3JpcHRzLnVwZGF0ZShzY3JpcHRzSnNvbilcbiAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTY3JpcHRzLnN0b3JlKClcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NMYXVuY2hCdWlsZFJlc3BvbnNlID0gKHJlc3BvbnNlOiBMYXVuY2hSZXNwb25zZSwgb3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyKSA9PiB7XG4gICAgaWYgKG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHkpIHtcbiAgICAgICAgcHJvY2Vzc1Rlc3RPYnNlcnZhYmlsaXR5UmVzcG9uc2UocmVzcG9uc2UpXG4gICAgfVxuICAgIHByb2Nlc3NBY2Nlc3NpYmlsaXR5UmVzcG9uc2UocmVzcG9uc2UsIG9wdGlvbnMpXG59XG5cbmV4cG9ydCBjb25zdCBsYXVuY2hUZXN0U2Vzc2lvbiA9IFBlcmZvcm1hbmNlVGVzdGVyLm1lYXN1cmVXcmFwcGVyKFBFUkZPUk1BTkNFX1NES19FVkVOVFMuVEVTVEhVQl9FVkVOVFMuU1RBUlQsIG8xMXlFcnJvckhhbmRsZXIoYXN5bmMgZnVuY3Rpb24gbGF1bmNoVGVzdFNlc3Npb24ob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lciwgYnNDb25maWc6IFVzZXJDb25maWcsIGJTdGFja0NvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbj86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBsYXVuY2hCdWlsZFVzYWdlID0gVXNhZ2VTdGF0cy5nZXRJbnN0YW5jZSgpLmxhdW5jaEJ1aWxkVXNhZ2VcbiAgICBsYXVuY2hCdWlsZFVzYWdlLnRyaWdnZXJlZCgpXG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBmb3JtYXQ6ICdqc29uJyxcbiAgICAgICAgcHJvamVjdF9uYW1lOiBnZXRPYnNlcnZhYmlsaXR5UHJvamVjdChvcHRpb25zLCBic0NvbmZpZy5wcm9qZWN0TmFtZSksXG4gICAgICAgIG5hbWU6IGdldE9ic2VydmFiaWxpdHlCdWlsZChvcHRpb25zLCBic0NvbmZpZy5idWlsZE5hbWUpLFxuICAgICAgICBidWlsZF9pZGVudGlmaWVyOiBic0NvbmZpZy5idWlsZElkZW50aWZpZXIsXG4gICAgICAgIHN0YXJ0ZWRfYXQ6IChuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpLFxuICAgICAgICB0YWdzOiBnZXRPYnNlcnZhYmlsaXR5QnVpbGRUYWdzKG9wdGlvbnMsIGJzQ29uZmlnLmJ1aWxkVGFnKSxcbiAgICAgICAgaG9zdF9pbmZvOiB7XG4gICAgICAgICAgICBob3N0bmFtZTogaG9zdG5hbWUoKSxcbiAgICAgICAgICAgIHBsYXRmb3JtOiBwbGF0Zm9ybSgpLFxuICAgICAgICAgICAgdHlwZTogdHlwZSgpLFxuICAgICAgICAgICAgdmVyc2lvbjogdmVyc2lvbigpLFxuICAgICAgICAgICAgYXJjaDogYXJjaCgpXG4gICAgICAgIH0sXG4gICAgICAgIGNpX2luZm86IGdldENpSW5mbygpLFxuICAgICAgICBidWlsZF9ydW5faWRlbnRpZmllcjogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0JVSUxEX1JVTl9JREVOVElGSUVSLFxuICAgICAgICBmYWlsZWRfdGVzdHNfcmVydW46IHByb2Nlc3MuZW52W1JFUlVOX0VOVl0gfHwgZmFsc2UsXG4gICAgICAgIHZlcnNpb25fY29udHJvbDogYXdhaXQgZ2V0R2l0TWV0YURhdGEoKSxcbiAgICAgICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgICAgICAgc2V0dGluZ3M6IG9wdGlvbnMuYWNjZXNzaWJpbGl0eU9wdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAgYnJvd3NlcnN0YWNrQXV0b21hdGlvbjogc2hvdWxkQWRkU2VydmljZVZlcnNpb24oY29uZmlnLCBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5KSxcbiAgICAgICAgZnJhbWV3b3JrX2RldGFpbHM6IHtcbiAgICAgICAgICAgIGZyYW1ld29ya05hbWU6IFdESU9fTkFNSU5HX1BSRUZJWCArIGNvbmZpZy5mcmFtZXdvcmssXG4gICAgICAgICAgICBmcmFtZXdvcmtWZXJzaW9uOiBic0NvbmZpZy5ic3RhY2tTZXJ2aWNlVmVyc2lvbixcbiAgICAgICAgICAgIHNka1ZlcnNpb246IGJzQ29uZmlnLmJzdGFja1NlcnZpY2VWZXJzaW9uLFxuICAgICAgICAgICAgbGFuZ3VhZ2U6ICdFQ01BU2NyaXB0JyxcbiAgICAgICAgICAgIHRlc3RGcmFtZXdvcms6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnV2ViZHJpdmVySU8nLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IGJzQ29uZmlnLmJzdGFja1NlcnZpY2VWZXJzaW9uXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHByb2R1Y3RfbWFwOiBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwoYlN0YWNrQ29uZmlnLCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbiksXG4gICAgICAgIGNvbmZpZzoge30sXG4gICAgICAgIHRlc3Rfb3JjaGVzdHJhdGlvbjogT3JjaGVzdHJhdGlvblV0aWxzLmdldEluc3RhbmNlKGNvbmZpZyk/LmdldEJ1aWxkU3RhcnREYXRhKCkgfHwge30sXG4gICAgICAgIHRlc3RfbWFuYWdlbWVudDoge1xuICAgICAgICAgICAgdGVzdF9wbGFuX2lkOiBnZXRUZXN0UGxhbklkKG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWNjZXNzaWJpbGl0eUF1dG9tYXRpb24gJiYgKGlzVHVyYm9TY2FsZShvcHRpb25zKSB8fCBkYXRhLmJyb3dzZXJzdGFja0F1dG9tYXRpb24gPT09IGZhbHNlKSl7XG4gICAgICAgIGRhdGEuYWNjZXNzaWJpbGl0eS5zZXR0aW5ncyA/Pz0ge31cbiAgICAgICAgZGF0YS5hY2Nlc3NpYmlsaXR5LnNldHRpbmdzLmluY2x1ZGVFbmNvZGVkRXh0ZW5zaW9uID0gdHJ1ZVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhDcmFzaFJlcG9ydGVyLnVzZXJDb25maWdGb3JSZXBvcnRpbmcpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgQ3Jhc2hSZXBvcnRlci51c2VyQ29uZmlnRm9yUmVwb3J0aW5nID0gcHJvY2Vzcy5lbnYuVVNFUl9DT05GSUdfRk9SX1JFUE9SVElORyAhPT0gdW5kZWZpbmVkID8gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5VU0VSX0NPTkZJR19GT1JfUkVQT1JUSU5HKSA6IHt9XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gQlN0YWNrTG9nZ2VyLmVycm9yKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIHRvIHBhcnNlIHVzZXIgY29uZmlnIHdoaWxlIHNlbmRpbmcgYnVpbGQgc3RhcnQgZXZlbnQgZHVlIHRvICR7ZXJyb3J9YClcbiAgICB9XG4gICAgZGF0YS5jb25maWcgPSBDcmFzaFJlcG9ydGVyLnVzZXJDb25maWdGb3JSZXBvcnRpbmdcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSVV0aWxzLkRBVEFfRU5EUE9JTlR9L2FwaS92Mi9idWlsZHNgXG4gICAgICAgIGNvbnN0IGVuY29kZWRBdXRoID0gQnVmZmVyLmZyb20oYCR7Z2V0T2JzZXJ2YWJpbGl0eVVzZXIob3B0aW9ucywgY29uZmlnKX06JHtnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnMsIGNvbmZpZyl9YCwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCYXNpYyAke2VuY29kZWRBdXRofWAsXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGpzb25SZXNwb25zZTogTGF1bmNoUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgZGVsZXRlIGRhdGE/LmFjY2Vzc2liaWxpdHk/LnNldHRpbmdzPy5pbmNsdWRlRW5jb2RlZEV4dGVuc2lvblxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtTdGFydF9CdWlsZF0gU3VjY2VzcyByZXNwb25zZTogJHtKU09OLnN0cmluZ2lmeShqc29uUmVzcG9uc2UpfWApXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgVGVzdCBQbGFuIElkIHNlbnQgaW4gcmVxdWVzdDogJHtnZXRUZXN0UGxhbklkKG9wdGlvbnMpfWApXG4gICAgICAgIHByb2Nlc3MuZW52W1RFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVl0gPSAndHJ1ZSdcbiAgICAgICAgaWYgKGpzb25SZXNwb25zZS5qd3QpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX0pXVF0gPSBqc29uUmVzcG9uc2Uuand0XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGpzb25SZXNwb25zZS5idWlsZF9oYXNoZWRfaWQpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX1VVSURdID0ganNvblJlc3BvbnNlLmJ1aWxkX2hhc2hlZF9pZFxuICAgICAgICAgICAgVGVzdE9wc0NvbmZpZy5nZXRJbnN0YW5jZSgpLmJ1aWxkSGFzaGVkSWQgPSBqc29uUmVzcG9uc2UuYnVpbGRfaGFzaGVkX2lkXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhgVGVzdGh1YiBzdGFydGVkIHdpdGggaWQ6ICR7VGVzdE9wc0NvbmZpZy5nZXRJbnN0YW5jZSgpPy5idWlsZEhhc2hlZElkfWApXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc0xhdW5jaEJ1aWxkUmVzcG9uc2UoanNvblJlc3BvbnNlLCBvcHRpb25zKVxuICAgICAgICBsYXVuY2hCdWlsZFVzYWdlLnN1Y2Nlc3MoKVxuICAgICAgICByZXR1cm4ganNvblJlc3BvbnNlXG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUZXN0SHViIGJ1aWxkIHN0YXJ0IGZhaWxlZDogJHtmb3JtYXQoZXJyb3IpfWApXG4gICAgICAgIGlmICghKGVycm9yIGFzIEVycm9yICYgeyBzdWNjZXNzOiBib29sZWFuIH0pLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGxhdW5jaEJ1aWxkVXNhZ2UuZmFpbGVkKGVycm9yKVxuICAgICAgICAgICAgbG9nQnVpbGRFcnJvcihlcnJvciBhcyBFcnJvcnMpXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgfVxufSkpXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYXBzV2l0aEFwcEExMXkgPSAocGxhdGZvcm1NZXRhPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0pID0+IHtcbiAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCBkcml2ZXIgcGxhdGZvcm0gaXMgZWxpZ2libGUgZm9yIEFwcEFjY2Vzc2liaWxpdHkgc2NhbiAqL1xuICAgIGlmIChcbiAgICAgICAgKHBsYXRmb3JtTWV0YT8ucGxhdGZvcm1fbmFtZSAmJiBTdHJpbmcocGxhdGZvcm1NZXRhPy5wbGF0Zm9ybV9uYW1lKS50b0xvd2VyQ2FzZSgpID09PSAnYW5kcm9pZCcpICYmXG4gICAgICAgIChwbGF0Zm9ybU1ldGE/LnBsYXRmb3JtX3ZlcnNpb24gJiYgcGFyc2VJbnQocGxhdGZvcm1NZXRhPy5wbGF0Zm9ybV92ZXJzaW9uPy50b1N0cmluZygpKSA8IDExKVxuICAgICkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQXBwIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB0ZXN0cyBhcmUgc3VwcG9ydGVkIG9uIE9TIHZlcnNpb24gMTEgYW5kIGFib3ZlIGZvciBBbmRyb2lkIGRldmljZXMuJylcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYXBzV2l0aEExMXkgPSAoZGV2aWNlTmFtZT86IGFueSwgcGxhdGZvcm1NZXRhPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sIGNocm9tZU9wdGlvbnM/OiBhbnkpID0+IHtcbiAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCBkcml2ZXIgcGxhdGZvcm0gaXMgZWxpZ2libGUgZm9yIEFjY2Vzc2liaWxpdHkgc2NhbiAqL1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChkZXZpY2VOYW1lKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gRGVza3RvcCBicm93c2Vycy4nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxhdGZvcm1NZXRhPy5icm93c2VyX25hbWU/LnRvTG93ZXJDYXNlKCkgIT09ICdjaHJvbWUnKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXJzLicpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBicm93c2VyVmVyc2lvbiA9IHBsYXRmb3JtTWV0YT8uYnJvd3Nlcl92ZXJzaW9uXG4gICAgICAgIGlmICggIWlzVW5kZWZpbmVkKGJyb3dzZXJWZXJzaW9uKSAmJiAhKGJyb3dzZXJWZXJzaW9uID09PSAnbGF0ZXN0JyB8fCBwYXJzZUZsb2F0KGJyb3dzZXJWZXJzaW9uICsgJycpID4gOTQpKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXIgdmVyc2lvbiBncmVhdGVyIHRoYW4gOTQuJylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNocm9tZU9wdGlvbnM/LmFyZ3M/LmluY2x1ZGVzKCctLWhlYWRsZXNzJykpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gd2lsbCBub3QgcnVuIG9uIGxlZ2FjeSBoZWFkbGVzcyBtb2RlLiBTd2l0Y2ggdG8gbmV3IGhlYWRsZXNzIG1vZGUgb3IgYXZvaWQgdXNpbmcgaGVhZGxlc3MgbW9kZS4nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEV4Y2VwdGlvbiBpbiBjaGVja2luZyBjYXBhYmlsaXRpZXMgY29tcGF0aWJpbGl0eSB3aXRoIEFjY2Vzc2liaWxpdHkuIEVycm9yOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYXBzV2l0aE5vbkJzdGFja0ExMXkgPSAoYnJvd3Nlck5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQsIGJyb3dzZXJWZXJzaW9uPzpzdHJpbmcgfCB1bmRlZmluZWQgKSAgPT4ge1xuXG4gICAgaWYgKGJyb3dzZXJOYW1lPy50b0xvd2VyQ2FzZSgpICE9PSAnY2hyb21lJykge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXJzLicpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKGJyb3dzZXJWZXJzaW9uKSAmJiAhKGJyb3dzZXJWZXJzaW9uID09PSAnbGF0ZXN0JyB8fCBwYXJzZUZsb2F0KGJyb3dzZXJWZXJzaW9uICsgJycpID4gMTAwKSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXIgdmVyc2lvbiBncmVhdGVyIHRoYW4gMTAwLicpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuXG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRTY2FuVGVzdEZvckFjY2Vzc2liaWxpdHkgPSAoc3VpdGVUaXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZXN0VGl0bGU6IHN0cmluZywgYWNjZXNzaWJpbGl0eU9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSwgd29ybGQ/OiB7IFtrZXk6IHN0cmluZ106IHVua25vd247IH0sIGlzQ3VjdW1iZXI/OiBib29sZWFuICkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVUYWdzID0gQXJyYXkuaXNBcnJheShhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uaW5jbHVkZVRhZ3NJblRlc3RpbmdTY29wZSkgPyBhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uaW5jbHVkZVRhZ3NJblRlc3RpbmdTY29wZSA6IFtdXG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVUYWdzID0gQXJyYXkuaXNBcnJheShhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uZXhjbHVkZVRhZ3NJblRlc3RpbmdTY29wZSkgPyBhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uZXhjbHVkZVRhZ3NJblRlc3RpbmdTY29wZSA6IFtdXG5cbiAgICAgICAgaWYgKGlzQ3VjdW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3NMaXN0OiBzdHJpbmdbXSA9IFtdXG4gICAgICAgICAgICA7KHdvcmxkPy5waWNrbGUgYXMgeyB0YWdzOiB7IG5hbWU6IHN0cmluZyB9W10gfSk/LnRhZ3MubWFwKCh0YWc6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9KSA9PiB0YWdzTGlzdC5wdXNoKHRhZy5uYW1lKSlcbiAgICAgICAgICAgIGNvbnN0IGV4Y2x1ZGVkID0gZXhjbHVkZVRhZ3M/LnNvbWUoKGV4Y2x1ZGUpID0+IHRhZ3NMaXN0LmluY2x1ZGVzKGV4Y2x1ZGUpKVxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZWQgPSBpbmNsdWRlVGFncz8ubGVuZ3RoID09PSAwIHx8IGluY2x1ZGVUYWdzPy5zb21lKChpbmNsdWRlKSA9PiB0YWdzTGlzdC5pbmNsdWRlcyhpbmNsdWRlKSlcblxuICAgICAgICAgICAgcmV0dXJuICFleGNsdWRlZCAmJiBpbmNsdWRlZFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVsbFRlc3ROYW1lID0gc3VpdGVUaXRsZSArICcgJyArIHRlc3RUaXRsZVxuICAgICAgICBjb25zdCBleGNsdWRlZCA9IGV4Y2x1ZGVUYWdzPy5zb21lKChleGNsdWRlKSA9PiBmdWxsVGVzdE5hbWUuaW5jbHVkZXMoZXhjbHVkZSkpXG4gICAgICAgIGNvbnN0IGluY2x1ZGVkID0gaW5jbHVkZVRhZ3M/Lmxlbmd0aCA9PT0gMCB8fCBpbmNsdWRlVGFncz8uc29tZSgoaW5jbHVkZSkgPT4gZnVsbFRlc3ROYW1lLmluY2x1ZGVzKGluY2x1ZGUpKVxuXG4gICAgICAgIHJldHVybiAhZXhjbHVkZWQgJiYgaW5jbHVkZWRcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIHdoaWxlIHZhbGlkYXRpbmcgdGVzdCBjYXNlIGZvciBhY2Nlc3NpYmlsaXR5IGJlZm9yZSBzY2FubmluZy4gRXJyb3IgOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24gPSAoYWNjZXNzaWJpbGl0eUZsYWc/OiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhhc0ExMXlKd3RUb2tlbiA9IHR5cGVvZiBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1QgPT09ICdzdHJpbmcnICYmIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVC5sZW5ndGggPiAwICYmIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCAhPT0gJ251bGwnICYmIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgcmV0dXJuIGFjY2Vzc2liaWxpdHlGbGFnICYmIGhhc0ExMXlKd3RUb2tlblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXhjZXB0aW9uIGluIHZlcmlmeWluZyB0aGUgQWNjZXNzaWJpbGl0eSBzZXNzaW9uIHdpdGggZXJyb3IgOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgQVBQX0FVVE9NQVRFX0NBUF9LRVlTID0gWydhcHBpdW06YXBwJywgJ2FwcGl1bTpidW5kbGVJZCcsICdhcHBpdW06YXBwUGFja2FnZScsICdhcHBpdW06YXBwQWN0aXZpdHknXSBhcyBjb25zdFxuXG4vLyBBbiBBcHAgQXV0b21hdGUgc2Vzc2lvbiBpcyBpZGVudGlmaWVkIGJ5IGFuIGFwcCBjYXBhYmlsaXR5IG9uIHRoZSBkcml2ZXIgY2Fwc1xuLy8gKGFwcGl1bTphcHAgLyBhcHBpdW06YnVuZGxlSWQgLyBhcHBpdW06YXBwUGFja2FnZSAvIGFwcGl1bTphcHBBY3Rpdml0eSAvIGFwcGl1bTpvcHRpb25zLmFwcCkuXG4vLyBTaGFyZWQgYnkgY29uZmlnLXRpbWUgZGV0ZWN0aW9uIGFuZCB0aGUgQ0xJIEF1dG9tYXRlL1BlcmN5IG1vZHVsZXMgc28gQXBwLUF1dG9tYXRlXG4vLyBlbmRwb2ludCByb3V0aW5nIHN0YXlzIGNvbnNpc3RlbnQgYWNyb3NzIGV2ZXJ5IHBsYWNlIHRoYXQgcmVzb2x2ZXMgaXQgZnJvbSBjYXBhYmlsaXRpZXMuXG5leHBvcnQgZnVuY3Rpb24gaGFzQXBwQ2FwKGNhcD86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIGlmICghY2FwIHx8IHR5cGVvZiBjYXAgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCByZWNvcmQgPSBjYXAgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICBpZiAoQVBQX0FVVE9NQVRFX0NBUF9LRVlTLnNvbWUoa2V5ID0+ICFpc1VuZGVmaW5lZChyZWNvcmRba2V5XSkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGNvbnN0IGFwcGl1bU9wdGlvbnMgPSByZWNvcmRbJ2FwcGl1bTpvcHRpb25zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWRcbiAgICByZXR1cm4gISEoYXBwaXVtT3B0aW9ucyAmJiAhaXNVbmRlZmluZWQoYXBwaXVtT3B0aW9ucy5hcHApKVxufVxuXG5leHBvcnQgY29uc3QgaXNBcHBBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24gPSAoYWNjZXNzaWJpbGl0eUZsYWc/OiBib29sZWFuIHwgc3RyaW5nLCBpc0FwcEF1dG9tYXRlPzogYm9vbGVhbikgPT4ge1xuICAgIGNvbnN0IGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uID0gaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oYWNjZXNzaWJpbGl0eUZsYWcpXG4gICAgcmV0dXJuIGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uICYmIGlzQXBwQXV0b21hdGVcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdFN0cmluZyA9ICh0ZW1wbGF0ZTogKHN0cmluZyB8IG51bGwpLCAuLi52YWx1ZXM6IChzdHJpbmcgfCBudWxsKVtdKTogc3RyaW5nID0+IHtcbiAgICBsZXQgaSA9IDBcbiAgICBpZiAodGVtcGxhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC8lcy9nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2krK11cbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6ICcnXG4gICAgfSlcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCBfZ2V0UGFyYW1zRm9yQXBwQWNjZXNzaWJpbGl0eSA9ICggY29tbWFuZE5hbWU/OiBzdHJpbmcsIHRlc3ROYW1lPzogc3RyaW5nLCBob29rUnVuVXVpZD86IHN0cmluZyB8IG51bGwgKTogeyB0aFRlc3RSdW5VdWlkOiBhbnksIHRoSG9va1J1blV1aWQ6IGFueSwgdGhCdWlsZFV1aWQ6IGFueSwgdGhKd3RUb2tlbjogYW55LCBhdXRoSGVhZGVyOiBhbnksIHNjYW5UaW1lc3RhbXA6IG51bWJlciwgbWV0aG9kOiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlc3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgIH0gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgICd0aFRlc3RSdW5VdWlkJzogcHJvY2Vzcy5lbnYuVEVTVF9BTkFMWVRJQ1NfSUQsXG4gICAgICAgIC8vIFByZXNlbnQgb25seSB3aGVuIHRoZSBzY2FuIGZpcmVzIGluc2lkZSBhIGhvb2sgKGRyb3BwZWQgYnkgSlNPTi5zdHJpbmdpZnkgd2hlbiB1bmRlZmluZWQsXG4gICAgICAgIC8vIHNvIGluLXRlc3Qgc2NhbnMgYXJlIHVuY2hhbmdlZCkuIFNlbGVuaXVtSHViIGFwcEFsbHlIYW5kbGVyIHJlbGF5cyB0aGlzIGFzIGBob29rX3J1bl91dWlkYC5cbiAgICAgICAgJ3RoSG9va1J1blV1aWQnOiBob29rUnVuVXVpZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICd0aEJ1aWxkVXVpZCc6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUSFVCX1VVSUQsXG4gICAgICAgICd0aEp3dFRva2VuJzogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldULFxuICAgICAgICAnYXV0aEhlYWRlcic6IHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCxcbiAgICAgICAgJ3NjYW5UaW1lc3RhbXAnOiBEYXRlLm5vdygpLFxuICAgICAgICAnbWV0aG9kJzogY29tbWFuZE5hbWUsXG4gICAgICAgICd0ZXN0TmFtZSc6IHRlc3ROYW1lXG4gICAgfVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSAgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGNvbnN0IHBlcmZvcm1BMTF5U2NhbiA9IGFzeW5jIChpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyIHwgV2ViZHJpdmVySU8uTXVsdGlSZW1vdGVCcm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nLCAgY29tbWFuZE5hbWU/OiBzdHJpbmcsIHRlc3ROYW1lPzogc3RyaW5nLCBob29rUnVuVXVpZD86IHN0cmluZyB8IG51bGwsKSA6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBhbnk7IH0gfCB1bmRlZmluZWQ+ID0+IHtcblxuICAgIGlmICghaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5KSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignTm90IGFuIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiBzZXNzaW9uLCBjYW5ub3QgcGVyZm9ybSBBY2Nlc3NpYmlsaXR5IHNjYW4uJylcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGlzQXBwQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGlzQWNjZXNzaWJpbGl0eSwgaXNBcHBBdXRvbWF0ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHM6IHVua25vd24gPSBhd2FpdCAoYnJvd3NlciBhcyBXZWJkcml2ZXJJTy5Ccm93c2VyKS5leGVjdXRlKGZvcm1hdFN0cmluZyhBY2Nlc3NpYmlsaXR5U2NyaXB0cy5wZXJmb3JtU2NhbiwgSlNPTi5zdHJpbmdpZnkoX2dldFBhcmFtc0ZvckFwcEFjY2Vzc2liaWxpdHkoY29tbWFuZE5hbWUsIHRlc3ROYW1lLCBob29rUnVuVXVpZCkpKSBhcyBzdHJpbmcsIHt9KVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKHV0aWwuZm9ybWF0KHJlc3VsdHMgYXMgc3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiAoIHJlc3VsdHMgYXMgeyBba2V5OiBzdHJpbmddOiBhbnk7IH0gfCB1bmRlZmluZWQgKVxuICAgICAgICB9XG4gICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5U2NyaXB0cy5wZXJmb3JtU2Nhbikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGV4ZWN1dGVBY2Nlc3NpYmlsaXR5U2NyaXB0KGJyb3dzZXIsIEFjY2Vzc2liaWxpdHlTY3JpcHRzLnBlcmZvcm1TY2FuLCB7IG1ldGhvZDogY29tbWFuZE5hbWUgfHwgJycgfSlcbiAgICAgICAgICAgIHJldHVybiAoIHJlc3VsdHMgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duOyB9IHwgdW5kZWZpbmVkIClcbiAgICAgICAgfVxuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0FjY2Vzc2liaWxpdHlTY3JpcHRzLnBlcmZvcm1TY2FuIGlzIG51bGwnKVxuICAgICAgICByZXR1cm5cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdBY2Nlc3NpYmlsaXR5IFNjYW4gY291bGQgbm90IGJlIHBlcmZvcm1lZCA6ICcgKyBlcnIpXG4gICAgICAgIHJldHVyblxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEExMXlSZXN1bHRzID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5BMTFZX0VWRU5UUy5HRVRfUkVTVUxUUywgYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcpIDogUHJvbWlzZTxBcnJheTx7IFtrZXk6IHN0cmluZ106IGFueTsgfT4+ID0+IHtcblxuICAgIGlmICghaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5KSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignTm90IGFuIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiBzZXNzaW9uLCBjYW5ub3QgcmV0cmlldmUgQWNjZXNzaWJpbGl0eSByZXN1bHRzLicpXG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnUGVyZm9ybWluZyBzY2FuIGJlZm9yZSBnZXR0aW5nIHJlc3VsdHMnKVxuICAgICAgICBhd2FpdCBwZXJmb3JtQTExeVNjYW4oaXNBcHBBdXRvbWF0ZSwgYnJvd3NlciwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHkpXG4gICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHVua25vd24gfT4gPSBhd2FpdCBleGVjdXRlQWNjZXNzaWJpbGl0eVNjcmlwdChicm93c2VyLCBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgfVxuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0FjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHMgaXMgbnVsbCcpXG4gICAgICAgIHJldHVybiBbXVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdObyBhY2Nlc3NpYmlsaXR5IHJlc3VsdHMgd2VyZSBmb3VuZC4nKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYGdldEExMXlSZXN1bHRzIEZhaWxlZC4gRXJyb3I6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxufSlcblxuZXhwb3J0IGNvbnN0IGdldEFwcEExMXlSZXN1bHRzID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5BMTFZX0VWRU5UUy5HRVRfUkVTVUxUUywgYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIsICB0ZXN0TmFtZTogc3RyaW5nLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nLCBzZXNzaW9uSWQ/OiBzdHJpbmcgfCBudWxsKSA6IFByb21pc2U8QXJyYXk8eyBba2V5OiBzdHJpbmddOiBhbnk7IH0+PiA9PiB7XG4gICAgaWYgKCFpc0Jyb3dzZXJTdGFja1Nlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIFtdIC8vIHNpbmNlIHdlIGFyZSBydW5uaW5nIG9ubHkgb24gQXV0b21hdGUgYXMgb2Ygbm93XG4gICAgfVxuXG4gICAgaWYgKCFpc0FwcEFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHksIGlzQXBwQXV0b21hdGUpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMgc3VtbWFyeS4nKVxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHtBUElVdGlscy5BUFBfQUxMWV9FTkRQT0lOVH0vJHtBUFBfQUxMWV9JU1NVRVNfRU5EUE9JTlR9YFxuICAgICAgICBjb25zdCBhcGlSZXNwb25lID0gYXdhaXQgZ2V0QXBwQTExeVJlc3VsdFJlc3BvbnNlKGFwaVVybCwgaXNBcHBBdXRvbWF0ZSwgYnJvd3NlciwgdGVzdE5hbWUsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbiwgaXNBY2Nlc3NpYmlsaXR5LCBzZXNzaW9uSWQpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFwaVJlc3BvbmU/LmRhdGE/LmRhdGE/Lmlzc3Vlc1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFBvbGxpbmcgUmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpICB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignTm8gYWNjZXNzaWJpbGl0eSBzdW1tYXJ5IHdhcyBmb3VuZC4nKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYGdldEFwcEExMXlSZXN1bHRzIEZhaWxlZC4gRXJyb3I6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxufSlcblxuZXhwb3J0IGNvbnN0IGdldEFwcEExMXlSZXN1bHRzU3VtbWFyeSA9IFBlcmZvcm1hbmNlVGVzdGVyLm1lYXN1cmVXcmFwcGVyKFBFUkZPUk1BTkNFX1NES19FVkVOVFMuQTExWV9FVkVOVFMuR0VUX1JFU1VMVFNfU1VNTUFSWSwgYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIsIHRlc3ROYW1lOiBzdHJpbmcsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcsIHNlc3Npb25JZD86IHN0cmluZyB8IG51bGwpIDogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IGFueTsgfT4gPT4ge1xuICAgIGlmICghaXNCcm93c2VyU3RhY2tTZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiB7fSAvLyBzaW5jZSB3ZSBhcmUgcnVubmluZyBvbmx5IG9uIEF1dG9tYXRlIGFzIG9mIG5vd1xuICAgIH1cblxuICAgIGlmICghaXNBcHBBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5LCBpc0FwcEF1dG9tYXRlKSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignTm90IGFuIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiBzZXNzaW9uLCBjYW5ub3QgcmV0cmlldmUgQWNjZXNzaWJpbGl0eSByZXN1bHRzIHN1bW1hcnkuJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7QVBJVXRpbHMuQVBQX0FMTFlfRU5EUE9JTlR9LyR7QVBQX0FMTFlfSVNTVUVTX1NVTU1BUllfRU5EUE9JTlR9YFxuICAgICAgICBjb25zdCBhcGlSZXNwb25lID0gYXdhaXQgZ2V0QXBwQTExeVJlc3VsdFJlc3BvbnNlKGFwaVVybCwgaXNBcHBBdXRvbWF0ZSwgYnJvd3NlciwgdGVzdE5hbWUsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbiwgaXNBY2Nlc3NpYmlsaXR5LCBzZXNzaW9uSWQpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFwaVJlc3BvbmU/LmRhdGE/LmRhdGE/LnN1bW1hcnlcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBQb2xsaW5nIFJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdObyBhY2Nlc3NpYmlsaXR5IHN1bW1hcnkgd2FzIGZvdW5kLicpXG4gICAgICAgIHJldHVybiB7fVxuICAgIH1cbn0pXG5cbmNvbnN0IGdldEFwcEExMXlSZXN1bHRSZXNwb25zZSA9IGFzeW5jIChhcGlVcmw6IHN0cmluZywgaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgdGVzdE5hbWU6IHN0cmluZywgaXNCcm93c2VyU3RhY2tTZXNzaW9uPzogYm9vbGVhbiwgaXNBY2Nlc3NpYmlsaXR5PzogYm9vbGVhbiB8IHN0cmluZywgc2Vzc2lvbklkPzogc3RyaW5nIHwgbnVsbCkgOiBQcm9taXNlPFBvbGxpbmdSZXN1bHQ+ID0+IHtcbiAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1BlcmZvcm1pbmcgc2NhbiBiZWZvcmUgZ2V0dGluZyByZXN1bHRzIHN1bW1hcnknKVxuICAgIGF3YWl0IHBlcmZvcm1BMTF5U2Nhbihpc0FwcEF1dG9tYXRlLCBicm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24sIGlzQWNjZXNzaWJpbGl0eSwgdW5kZWZpbmVkLCB0ZXN0TmFtZSlcbiAgICBjb25zdCB1cHBlclRpbWVMaW1pdCA9IHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1BPTExJTkdfVElNRU9VVCA/IERhdGUubm93KCkgKyBwYXJzZUludChwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9QT0xMSU5HX1RJTUVPVVQpICogMTAwMCA6IERhdGUubm93KCkgKyAzMDAwMFxuICAgIGNvbnN0IHBhcmFtcyA9IHsgdGVzdF9ydW5fdXVpZDogcHJvY2Vzcy5lbnYuVEVTVF9BTkFMWVRJQ1NfSUQsIHNlc3Npb25faWQ6IHNlc3Npb25JZCwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0gLy8gUXVlcnkgcGFyYW1zIHRvIHBhc3NcbiAgICBjb25zdCBoZWFkZXIgPSB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1R9YCB9XG4gICAgY29uc3QgYXBpUmVzcG9uZSA9IGF3YWl0IHBvbGxBcGkoYXBpVXJsLCBwYXJhbXMsIGhlYWRlciwgdXBwZXJUaW1lTGltaXQpXG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBQb2xsaW5nIFJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShhcGlSZXNwb25lKX1gKVxuICAgIHJldHVybiBhcGlSZXNwb25lXG59XG5cbmV4cG9ydCBjb25zdCBnZXRBMTF5UmVzdWx0c1N1bW1hcnkgPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLkExMVlfRVZFTlRTLkdFVF9SRVNVTFRTX1NVTU1BUlksIGFzeW5jIChpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nKSA6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBhbnk7IH0+ID0+IHtcblxuICAgIGlmICghaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5KSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignTm90IGFuIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiBzZXNzaW9uLCBjYW5ub3QgcmV0cmlldmUgQWNjZXNzaWJpbGl0eSByZXN1bHRzIHN1bW1hcnkuJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdQZXJmb3JtaW5nIHNjYW4gYmVmb3JlIGdldHRpbmcgcmVzdWx0cyBzdW1tYXJ5JylcbiAgICAgICAgYXdhaXQgcGVyZm9ybUExMXlTY2FuKGlzQXBwQXV0b21hdGUsIGJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbiwgaXNBY2Nlc3NpYmlsaXR5KVxuICAgICAgICBpZiAoQWNjZXNzaWJpbGl0eVNjcmlwdHMuZ2V0UmVzdWx0c1N1bW1hcnkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlSZXN1bHRzOiB7IFtrZXk6IHN0cmluZ106IHVua25vd247IH0gPSBhd2FpdCBleGVjdXRlQWNjZXNzaWJpbGl0eVNjcmlwdChicm93c2VyLCBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzU3VtbWFyeSlcbiAgICAgICAgICAgIHJldHVybiBzdW1tYXJ5UmVzdWx0c1xuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignQWNjZXNzaWJpbGl0eVNjcmlwdHMuZ2V0UmVzdWx0c1N1bW1hcnkgaXMgbnVsbCcpXG4gICAgICAgIHJldHVybiB7fVxuICAgIH0gY2F0Y2gge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ05vIGFjY2Vzc2liaWxpdHkgc3VtbWFyeSB3YXMgZm91bmQuJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxufSlcblxuLyoqXG4gKiBSZW5kZXIgYW4gZXJyb3IgdG9nZXRoZXIgd2l0aCBpdHMgYGNhdXNlYCBjaGFpbi5cbiAqXG4gKiBOb2RlJ3MgbmF0aXZlIGZldGNoIHJlcG9ydHMgZXZlcnkgdHJhbnNwb3J0IGZhaWx1cmUgYXMgdGhlIHNhbWUgb3BhcXVlXG4gKiBgVHlwZUVycm9yOiBmZXRjaCBmYWlsZWRgOyB0aGUgYWN0aW9uYWJsZSBkZXRhaWwgKEVOT1RGT1VORCwgRUNPTk5SRVNFVCwgYSBwcm94eVxuICogcmVmdXNhbCkgb25seSBsaXZlcyBvbiBgZXJyb3IuY2F1c2VgLCB3aGljaCBwbGFpbiBpbnRlcnBvbGF0aW9uIGRyb3BzLiBXaXRob3V0IHRoaXNcbiAqIGEgZmFpbGVkIGJ1aWxkLXN0b3AgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbnkgb3RoZXIgbmV0d29yayBmYXVsdCBpbiB0aGUgbG9ncy5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlc2NyaWJlRXJyb3JXaXRoQ2F1c2UgPSAoZXJyb3I6IHVua25vd24sIGRlcHRoID0gMyk6IHN0cmluZyA9PiB7XG4gICAgaWYgKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhlcnJvcilcbiAgICB9XG4gICAgY29uc3QgZGVzY3JpYmVkID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCA6IFN0cmluZyhlcnJvcilcbiAgICBjb25zdCBjYXVzZSA9IChlcnJvciBhcyB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZVxuICAgIGlmIChjYXVzZSA9PT0gbnVsbCB8fCBjYXVzZSA9PT0gdW5kZWZpbmVkIHx8IGRlcHRoIDw9IDEpIHtcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlZFxuICAgIH1cbiAgICByZXR1cm4gYCR7ZGVzY3JpYmVkfSA8LSBjYXVzZWQgYnkgJHtkZXNjcmliZUVycm9yV2l0aENhdXNlKGNhdXNlLCBkZXB0aCAtIDEpfWBcbn1cblxuZXhwb3J0IGNvbnN0IHN0b3BCdWlsZFVwc3RyZWFtID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5URVNUSFVCX0VWRU5UUy5TVE9QLCBvMTF5RXJyb3JIYW5kbGVyKGFzeW5jIGZ1bmN0aW9uIHN0b3BCdWlsZFVwc3RyZWFtKCkge1xuICAgIGNvbnN0IHN0b3BCdWlsZFVzYWdlID0gVXNhZ2VTdGF0cy5nZXRJbnN0YW5jZSgpLnN0b3BCdWlsZFVzYWdlXG4gICAgc3RvcEJ1aWxkVXNhZ2UudHJpZ2dlcmVkKClcbiAgICBpZiAoIXByb2Nlc3MuZW52W1RFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVl0pIHtcbiAgICAgICAgc3RvcEJ1aWxkVXNhZ2UuZmFpbGVkKCdCdWlsZCBpcyBub3QgY29tcGxldGVkIHlldCcpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiAnQnVpbGQgaXMgbm90IGNvbXBsZXRlZCB5ZXQnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX0pXVF0pIHtcbiAgICAgICAgc3RvcEJ1aWxkVXNhZ2UuZmFpbGVkKCdUb2tlbi9idWlsZElEIGlzIHVuZGVmaW5lZCwgYnVpbGQgY3JlYXRpb24gbWlnaHQgaGF2ZSBmYWlsZWQnKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1tTVE9QX0JVSUxEXSBNaXNzaW5nIEF1dGhlbnRpY2F0aW9uIFRva2VuLyBCdWlsZCBJRCcpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiAnVG9rZW4vYnVpbGRJRCBpcyB1bmRlZmluZWQsIGJ1aWxkIGNyZWF0aW9uIG1pZ2h0IGhhdmUgZmFpbGVkJ1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICAnc3RvcF90aW1lJzogKG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKClcbiAgICB9XG4gICAgLy8gU3RhbXAgdGhlIGtpbGwgcmVhc29uIG9udG8gdGhlIGJ1aWxkIHJlY29yZCBzbyB0ZXJtaW5hdGVkIHJ1bnMgYXJlXG4gICAgLy8gaWRlbnRpZmlhYmxlIHNlcnZlci1zaWRlLCBub3Qgb25seSB2aWEgdGhlIGFuYWx5dGljcyBmdW5uZWwuXG4gICAgY29uc3Qga2lsbFNpZ25hbCA9IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19LSUxMX1NJR05BTF1cbiAgICBpZiAoa2lsbFNpZ25hbCkge1xuICAgICAgICBkYXRhLmZpbmlzaGVkX21ldGFkYXRhID0gW3sgcmVhc29uOiAndXNlcl9raWxsZWQnLCBzaWduYWw6IGtpbGxTaWduYWwgfV1cbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHtBUElVdGlscy5EQVRBX0VORFBPSU5UfS9hcGkvdjEvYnVpbGRzLyR7cHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF19L3N0b3BgXG4gICAgLy8gU0RLLTcwNjE6IHRoZSBidWlsZC1zdG9wIFBVVCBpcyB0aGUgc2lnbmFsIHRoYXQgY2xvc2VzIHRoZSBUUkEgYnVpbGQuIEEgc2luZ2xlXG4gICAgLy8gYmVzdC1lZmZvcnQgcmVxdWVzdCBtZWFucyBhIHRyYW5zaWVudCBmYWlsdXJlL3RpbWVvdXQgbGVhdmVzIHRoZSBidWlsZCBydW5uaW5nXG4gICAgLy8gdW50aWwgdGhlIH42MC1taW4gc2VydmVyLXNpZGUgaW5hY3Rpdml0eSB0aW1lb3V0LiBSZXRyeSB3aXRoIGJhY2tvZmYgYW5kIHRyZWF0IGFcbiAgICAvLyBub24tMnh4IHJlc3BvbnNlIGFzIGEgZmFpbHVyZSBzbyB0aGUgYnVpbGQgcmVsaWFibHkgcmVhY2hlcyBhIHRlcm1pbmFsIHN0YXRlLlxuICAgIC8vIFNESy03MjI5OiBhIGNvcnBvcmF0ZSBETlMvcHJveHkgYmxpcCByb3V0aW5lbHkgb3V0bGFzdHMgYSBzdWItc2Vjb25kIHJldHJ5IHdpbmRvdyxcbiAgICAvLyBhbmQgdGhlIHJlcXVlc3QgaGFkIG5vIHRpbWVvdXQgYXQgYWxsLCBzbyBhIGh1bmcgY29ubmVjdGlvbiBjb3VsZCBzdGFsbCBzaHV0ZG93blxuICAgIC8vIGluZGVmaW5pdGVseS4gRWFjaCBhdHRlbXB0IGlzIG5vdyBpbmRpdmlkdWFsbHkgYm91bmRlZCwgYW5kIHRoZSByZXRyeSBsb29wIGFzIGFcbiAgICAvLyB3aG9sZSBpcyBjYXBwZWQgYnkgYSB3YWxsLWNsb2NrIGRlYWRsaW5lICh0aGlzIHJ1bnMgZHVyaW5nIHNodXRkb3duKS5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBTVE9QX0JVSUxEX1RPVEFMX0JVREdFVF9NU1xuICAgIGxldCBsYXN0RXJyb3I6IHVua25vd25cbiAgICBsZXQgYXR0ZW1wdHMgPSAwXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gU1RPUF9CVUlMRF9NQVhfQVRURU1QVFM7IGF0dGVtcHQrKykge1xuICAgICAgICBjb25zdCBidWRnZXRMZWZ0ID0gZGVhZGxpbmUgLSBEYXRlLm5vdygpXG4gICAgICAgIGlmIChidWRnZXRMZWZ0IDw9IDApIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgYXR0ZW1wdHMgPSBhdHRlbXB0XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIE1hdGgubWluKFNUT1BfQlVJTERfQVRURU1QVF9USU1FT1VUX01TLCBidWRnZXRMZWZ0KSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7cHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXX1gXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtTVE9QX0JVSUxEXSBTdWNjZXNzIHJlc3BvbnNlOiAke2F3YWl0IHJlc3BvbnNlLnRleHQoKX1gKVxuICAgICAgICAgICAgc3RvcEJ1aWxkVXNhZ2Uuc3VjY2VzcygpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAvLyBBbiBhYm9ydGVkIGF0dGVtcHQgc3VyZmFjZXMgYXMgYSBnZW5lcmljIEFib3J0RXJyb3I7IG5hbWUgdGhlIHJlYWwgcmVhc29uIHNvXG4gICAgICAgICAgICAvLyBhIHNsb3cgZW5kcG9pbnQgaXMgbm90IG1pc3Rha2VuIGZvciBhbiBvdXRyaWdodCB0cmFuc3BvcnQgZmFpbHVyZS5cbiAgICAgICAgICAgIGxhc3RFcnJvciA9IGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWRcbiAgICAgICAgICAgICAgICA/IG5ldyBFcnJvcihgYnVpbGQgc3RvcCByZXF1ZXN0IHRpbWVkIG91dCBhZnRlciAke01hdGgubWluKFNUT1BfQlVJTERfQVRURU1QVF9USU1FT1VUX01TLCBidWRnZXRMZWZ0KX1tc2ApXG4gICAgICAgICAgICAgICAgOiBlcnJvclxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbU1RPUF9CVUlMRF0gQXR0ZW1wdCAke2F0dGVtcHR9LyR7U1RPUF9CVUlMRF9NQVhfQVRURU1QVFN9IGZhaWxlZC4gRXJyb3I6ICR7ZGVzY3JpYmVFcnJvcldpdGhDYXVzZShsYXN0RXJyb3IpfWApXG4gICAgICAgICAgICBjb25zdCBiYWNrb2ZmID0gU1RPUF9CVUlMRF9CQUNLT0ZGX0JBU0VfTVMgKiBNYXRoLnBvdygyLCBhdHRlbXB0IC0gMSlcbiAgICAgICAgICAgIGlmIChhdHRlbXB0ID49IFNUT1BfQlVJTERfTUFYX0FUVEVNUFRTIHx8IERhdGUubm93KCkgKyBiYWNrb2ZmID49IGRlYWRsaW5lKSB7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGJhY2tvZmYpKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wQnVpbGRVc2FnZS5mYWlsZWQobGFzdEVycm9yKVxuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1NUT1BfQlVJTERdIEZhaWxlZCBhZnRlciAke2F0dGVtcHRzfSBhdHRlbXB0KHMpLiBFcnJvcjogJHtkZXNjcmliZUVycm9yV2l0aENhdXNlKGxhc3RFcnJvcil9YClcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6IChsYXN0RXJyb3IgYXMgRXJyb3IpPy5tZXNzYWdlID8/ICdzdG9wIGJ1aWxkIGZhaWxlZCdcbiAgICB9XG59KSlcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENpSW5mbyAoKSB7XG4gICAgY29uc3QgZW52ID0gcHJvY2Vzcy5lbnZcbiAgICAvLyBKZW5raW5zXG4gICAgaWYgKCh0eXBlb2YgZW52LkpFTktJTlNfVVJMID09PSAnc3RyaW5nJyAmJiBlbnYuSkVOS0lOU19VUkwubGVuZ3RoID4gMCkgfHwgKHR5cGVvZiBlbnYuSkVOS0lOU19IT01FID09PSAnc3RyaW5nJyAmJiBlbnYuSkVOS0lOU19IT01FLmxlbmd0aCA+IDApKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnSmVua2lucycsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkpPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2lyY2xlQ0lcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgaXNUcnVlKGVudi5DSVJDTEVDSSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdDaXJjbGVDSScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5DSVJDTEVfQlVJTERfVVJMLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5DSVJDTEVfSk9CLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ0lSQ0xFX0JVSUxEX05VTVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyYXZpcyBDSVxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LlRSQVZJUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdUcmF2aXMgQ0knLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuVFJBVklTX0JVSUxEX1dFQl9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlRSQVZJU19KT0JfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LlRSQVZJU19CVUlMRF9OVU1CRVJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb2Rlc2hpcFxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBlbnYuQ0lfTkFNRSA9PT0gJ2NvZGVzaGlwJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0NvZGVzaGlwJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBudWxsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQml0YnVja2V0XG4gICAgaWYgKGVudi5CSVRCVUNLRVRfQlJBTkNIICYmIGVudi5CSVRCVUNLRVRfQ09NTUlUKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQml0YnVja2V0JyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkJJVEJVQ0tFVF9HSVRfSFRUUF9PUklHSU4sXG4gICAgICAgICAgICBqb2JfbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJJVEJVQ0tFVF9CVUlMRF9OVU1CRVJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBEcm9uZVxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LkRST05FKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0Ryb25lJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkRST05FX0JVSUxEX0xJTkssXG4gICAgICAgICAgICBqb2JfbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkRST05FX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNlbWFwaG9yZVxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LlNFTUFQSE9SRSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdTZW1hcGhvcmUnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuU0VNQVBIT1JFX09SR0FOSVpBVElPTl9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlNFTUFQSE9SRV9KT0JfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LlNFTUFQSE9SRV9KT0JfSURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBHaXRMYWJcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgaXNUcnVlKGVudi5HSVRMQUJfQ0kpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnR2l0TGFiJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkNJX0pPQl9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkNJX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ0lfSk9CX0lEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQnVpbGRraXRlXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuQlVJTERLSVRFKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0J1aWxka2l0ZScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5CVUlMREtJVEVfQlVJTERfVVJMLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5CVUlMREtJVEVfTEFCRUwgfHwgZW52LkJVSUxES0lURV9QSVBFTElORV9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERLSVRFX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFZpc3VhbCBTdHVkaW8gVGVhbSBTZXJ2aWNlc1xuICAgIGlmIChpc1RydWUoZW52LlRGX0JVSUxEKSAmJiBlbnYuVEZfQlVJTERfQlVJTEROVU1CRVIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdWaXN1YWwgU3R1ZGlvIFRlYW0gU2VydmljZXMnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBgJHtlbnYuU1lTVEVNX1RFQU1GT1VOREFUSU9OU0VSVkVSVVJJfSR7ZW52LlNZU1RFTV9URUFNUFJPSkVDVElEfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlNZU1RFTV9ERUZJTklUSU9OSUQsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9CVUlMRElEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQXBwdmV5b3JcbiAgICBpZiAoaXNUcnVlKGVudi5BUFBWRVlPUikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdBcHB2ZXlvcicsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5BUFBWRVlPUl9VUkx9L3Byb2plY3QvJHtlbnYuQVBQVkVZT1JfQUNDT1VOVF9OQU1FfS8ke2Vudi5BUFBWRVlPUl9QUk9KRUNUX1NMVUd9L2J1aWxkcy8ke2Vudi5BUFBWRVlPUl9CVUlMRF9JRH1gLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5BUFBWRVlPUl9KT0JfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkFQUFZFWU9SX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEF6dXJlIENJXG4gICAgaWYgKGVudi5BWlVSRV9IVFRQX1VTRVJfQUdFTlQgJiYgZW52LlRGX0JVSUxEKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQXp1cmUgQ0knLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBgJHtlbnYuU1lTVEVNX1RFQU1GT1VOREFUSU9OU0VSVkVSVVJJfSR7ZW52LlNZU1RFTV9URUFNUFJPSkVDVElEfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkJVSUxEX0JVSUxESUQsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9CVUlMRElEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQVdTIENvZGVCdWlsZFxuICAgIGlmIChlbnYuQ09ERUJVSUxEX0JVSUxEX0lEIHx8IGVudi5DT0RFQlVJTERfUkVTT0xWRURfU09VUkNFX1ZFUlNJT04gfHwgZW52LkNPREVCVUlMRF9TT1VSQ0VfVkVSU0lPTikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0FXUyBDb2RlQnVpbGQnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQ09ERUJVSUxEX1BVQkxJQ19CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkNPREVCVUlMRF9CVUlMRF9JRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkNPREVCVUlMRF9CVUlMRF9JRFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEJhbWJvb1xuICAgIGlmIChlbnYuYmFtYm9vX2J1aWxkTnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQmFtYm9vJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LmJhbWJvb19idWlsZFJlc3VsdHNVcmwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LmJhbWJvb19zaG9ydEpvYk5hbWUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5iYW1ib29fYnVpbGROdW1iZXJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBXZXJja2VyXG4gICAgaWYgKGVudi5XRVJDS0VSIHx8IGVudi5XRVJDS0VSX01BSU5fUElQRUxJTkVfU1RBUlRFRCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1dlcmNrZXInLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuV0VSQ0tFUl9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LldFUkNLRVJfTUFJTl9QSVBFTElORV9TVEFSVEVEID8gJ01haW4gUGlwZWxpbmUnIDogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LldFUkNLRVJfR0lUX0NPTU1JVFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEdvb2dsZSBDbG91ZFxuICAgIGlmIChlbnYuR0NQX1BST0pFQ1QgfHwgZW52LkdDTE9VRF9QUk9KRUNUIHx8IGVudi5HT09HTEVfQ0xPVURfUFJPSkVDVCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0dvb2dsZSBDbG91ZCcsXG4gICAgICAgICAgICBidWlsZF91cmw6IG51bGwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlBST0pFQ1RfSUQsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9JRCxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTaGlwcGFibGVcbiAgICBpZiAoZW52LlNISVBQQUJMRSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1NoaXBwYWJsZScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5TSElQUEFCTEVfQlVJTERfVVJMLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5TSElQUEFCTEVfSk9CX0lEID8gYEpvYiAjJHtlbnYuU0hJUFBBQkxFX0pPQl9JRH1gIDogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LlNISVBQQUJMRV9CVUlMRF9OVU1CRVJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBOZXRsaWZ5XG4gICAgaWYgKGlzVHJ1ZShlbnYuTkVUTElGWSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdOZXRsaWZ5JyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkRFUExPWV9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlNJVEVfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0lEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR2l0aHViIEFjdGlvbnNcbiAgICBpZiAoaXNUcnVlKGVudi5HSVRIVUJfQUNUSU9OUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdHaXRIdWIgQWN0aW9ucycsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5HSVRIVUJfU0VSVkVSX1VSTH0vJHtlbnYuR0lUSFVCX1JFUE9TSVRPUll9L2FjdGlvbnMvcnVucy8ke2Vudi5HSVRIVUJfUlVOX0lEfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkdJVEhVQl9XT1JLRkxPVyxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkdJVEhVQl9SVU5fSUQsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVmVyY2VsXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGVudi5WRVJDRUwgPT09ICcxJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1ZlcmNlbCcsXG4gICAgICAgICAgICBidWlsZF91cmw6IGBodHRwOi8vJHtlbnYuVkVSQ0VMX1VSTH1gLFxuICAgICAgICAgICAgam9iX25hbWU6IG51bGwsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IG51bGwsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVGVhbWNpdHlcbiAgICBpZiAoZW52LlRFQU1DSVRZX1ZFUlNJT04pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdUZWFtY2l0eScsXG4gICAgICAgICAgICBidWlsZF91cmw6IG51bGwsXG4gICAgICAgICAgICBqb2JfbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX05VTUJFUixcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb25jb3Vyc2VcbiAgICBpZiAoZW52LkNPTkNPVVJTRSB8fCBlbnYuQ09OQ09VUlNFX1VSTCB8fCBlbnYuQ09OQ09VUlNFX1VTRVJOQU1FIHx8IGVudi5DT05DT1VSU0VfVEVBTSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0NvbmNvdXJzZScsXG4gICAgICAgICAgICBidWlsZF91cmw6IG51bGwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkJVSUxEX0pPQl9OQU1FIHx8IG51bGwsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9JRCB8fCBudWxsLFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEdvQ0RcbiAgICBpZiAoZW52LkdPX0pPQl9OQU1FKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnR29DRCcsXG4gICAgICAgICAgICBidWlsZF91cmw6IG51bGwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkdPX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuR09fUElQRUxJTkVfQ09VTlRFUixcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb2RlRnJlc2hcbiAgICBpZiAoZW52LkNGX0JVSUxEX0lEKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQ29kZUZyZXNoJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkNGX0JVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQ0ZfUElQRUxJTkVfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkNGX0JVSUxEX0lELFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGlmIG5vIG1hdGNoZXMsIHJldHVybiBudWxsXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEdpdE1ldGFEYXRhICgpIHtcbiAgICBjb25zdCBpbmZvOiBHaXRSZXBvSW5mbyA9IGdpdFJlcG9JbmZvKClcbiAgICBpZiAoIWluZm8uY29tbW9uR2l0RGlyKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCB7IHJlbW90ZSB9ID0gYXdhaXQgcEdpdGNvbmZpZyhpbmZvLmNvbW1vbkdpdERpcilcbiAgICBjb25zdCByZW1vdGVzID0gcmVtb3RlID8gT2JqZWN0LmtleXMocmVtb3RlKS5tYXAocmVtb3RlTmFtZSA9PiAgKHsgbmFtZTogcmVtb3RlTmFtZSwgdXJsOiByZW1vdGVbcmVtb3RlTmFtZV0udXJsIH0pKSA6IFtdXG5cbiAgICBsZXQgZ2l0TWV0YURhdGEgOiBHaXRNZXRhRGF0YSA9IHtcbiAgICAgICAgbmFtZTogJ2dpdCcsXG4gICAgICAgIHNoYTogaW5mby5zaGEsXG4gICAgICAgIHNob3J0X3NoYTogaW5mby5hYmJyZXZpYXRlZFNoYSxcbiAgICAgICAgYnJhbmNoOiBpbmZvLmJyYW5jaCxcbiAgICAgICAgdGFnOiBpbmZvLnRhZyxcbiAgICAgICAgY29tbWl0dGVyOiBpbmZvLmNvbW1pdHRlcixcbiAgICAgICAgY29tbWl0dGVyX2RhdGU6IGluZm8uY29tbWl0dGVyRGF0ZSxcbiAgICAgICAgYXV0aG9yOiBpbmZvLmF1dGhvcixcbiAgICAgICAgYXV0aG9yX2RhdGU6IGluZm8uYXV0aG9yRGF0ZSxcbiAgICAgICAgY29tbWl0X21lc3NhZ2U6IGluZm8uY29tbWl0TWVzc2FnZSxcbiAgICAgICAgcm9vdDogaW5mby5yb290LFxuICAgICAgICBjb21tb25fZ2l0X2RpcjogaW5mby5jb21tb25HaXREaXIsXG4gICAgICAgIHdvcmt0cmVlX2dpdF9kaXI6IGluZm8ud29ya3RyZWVHaXREaXIsXG4gICAgICAgIGxhc3RfdGFnOiBpbmZvLmxhc3RUYWcsXG4gICAgICAgIGNvbW1pdHNfc2luY2VfbGFzdF90YWc6IGluZm8uY29tbWl0c1NpbmNlTGFzdFRhZyxcbiAgICAgICAgcmVtb3RlczogcmVtb3Rlc1xuICAgIH1cblxuICAgIGdpdE1ldGFEYXRhID0gY2hlY2tBbmRUcnVuY2F0ZVZDU0luZm8oZ2l0TWV0YURhdGEpXG5cbiAgICByZXR1cm4gZ2l0TWV0YURhdGFcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXF1ZUlkZW50aWZpZXIodGVzdDogRnJhbWV3b3Jrcy5UZXN0LCBmcmFtZXdvcms/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChmcmFtZXdvcmsgPT09ICdqYXNtaW5lJykge1xuICAgICAgICByZXR1cm4gdGVzdC5mdWxsTmFtZVxuICAgIH1cblxuICAgIGxldCBwYXJlbnRUaXRsZSA9IHRlc3QucGFyZW50XG4gICAgLy8gU29tZXRpbWVzIHBhcmVudCB3aWxsIGJlIGFuIG9iamVjdCBpbnN0ZWFkIG9mIGEgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBwYXJlbnRUaXRsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcGFyZW50VGl0bGUgPSAocGFyZW50VGl0bGUgYXMgeyB0aXRsZTogc3RyaW5nIH0pLnRpdGxlXG4gICAgfVxuICAgIHJldHVybiBgJHtwYXJlbnRUaXRsZX0gLSAke3Rlc3QudGl0bGV9YFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pcXVlSWRlbnRpZmllckZvckN1Y3VtYmVyKHdvcmxkOiBJVGVzdENhc2VIb29rUGFyYW1ldGVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gd29ybGQucGlja2xlLnVyaSArICdfJyArIHdvcmxkLnBpY2tsZS5hc3ROb2RlSWRzLmpvaW4oJywnKVxufVxuXG4vLyBMb2FkIFRlc3RpbmcgU2VydmljZSAoTFRTKSBnYXRpbmcgaGVscGVycyBcdTIwMTQgbWlycm9yIG9mIGJzdGFja191dGlscy9oZWxwZXIucHlcbi8vIGlzX2xvYWRfdGVzdGluZ19zZXNzaW9uKCkgLyBnZXRfbHRzX3Nlc3Npb25faWQoKSBpbiBicm93c2Vyc3RhY2stcHl0aG9uLXNka1xuLy8gKGJyYW5jaCBMVFMtdHJhLXB5dGhvbi1zdXBwb3J0KS4gTFRTIHBvZC1pdGVyYXRpb25zIGV4cG9ydFxuLy8gQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEIGJlZm9yZSBpbnZva2luZyB0aGUgdGVzdCBydW5uZXI7IHByZXNlbmNlIG9mXG4vLyB0aGF0IGVudiB2YXIgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIFwidGhpcyBydW4gaXMgYW4gTFRTIHBvZFxuLy8gaXRlcmF0aW9uXCIuIE9wdGlvbmFsIEJST1dTRVJTVEFDS19MVFM9dHJ1ZXwxIGxldHMgdGhlIHJ1bm5lciBvcHQtaW4gd2l0aG91dFxuLy8gc3VwcGx5aW5nIGEgc2Vzc2lvbiBpZCAodXNlZnVsIGZvciBsb2NhbCByZXBybykuXG5leHBvcnQgZnVuY3Rpb24gaXNMb2FkVGVzdGluZ1Nlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRF0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgY29uc3QgZmxhZyA9IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19MVFNdXG4gICAgcmV0dXJuIGZsYWcgPT09ICd0cnVlJyB8fCBmbGFnID09PSAnMSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEx0c1Nlc3Npb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSURdIHx8ICcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbG91ZFByb3ZpZGVyKGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIgfCBXZWJkcml2ZXJJTy5NdWx0aVJlbW90ZUJyb3dzZXIpOiBzdHJpbmcge1xuICAgIC8vIE5PVEU6IGRvIE5PVCBicmFuY2ggb24gaXNMb2FkVGVzdGluZ1Nlc3Npb24oKSBoZXJlLiBnZXRDbG91ZFByb3ZpZGVyIGlzXG4gICAgLy8gc2hhcmVkIHdpdGggQXV0b21hdGUtc2lkZSBndWFyZHMgKGF1dG9tYXRlTW9kdWxlIG9uQmVmb3JlL29uQWZ0ZXJUZXN0LFxuICAgIC8vIHdlYmRyaXZlcklPTW9kdWxlIEtFWV9JU19CUk9XU0VSU1RBQ0tfSFVCLCBhY2Nlc3NpYmlsaXR5LWhhbmRsZXIsXG4gICAgLy8gc2VydmljZS50cykgXHUyMDE0IGZsaXBwaW5nIGl0IHRvICdicm93c2Vyc3RhY2snIHVuZGVyIExUUyB3b3VsZCBtYWtlXG4gICAgLy8gaXNCcm93c2Vyc3RhY2tTZXNzaW9uKCkgcmV0dXJuIHRydWUgZm9yIGxvY2FsLVNlbGVuaXVtIHBvZCBzZXNzaW9ucyxcbiAgICAvLyBjYXVzaW5nIG1hcmtTZXNzaW9uTmFtZSAvIG1hcmtTZXNzaW9uU3RhdHVzIHRvIFBVVCBhZ2FpbnN0IEF1dG9tYXRlXG4gICAgLy8gUkVTVCBBUElzIHdpdGggc2Vzc2lvbiBpZHMgdGhhdCBkb24ndCBleGlzdCB0aGVyZS4gVGVzdEh1Yi1yZXBvcnRpbmdcbiAgICAvLyBjYWxsZXJzIHRoYXQgbmVlZCAnYnJvd3NlcnN0YWNrJyB1bmRlciBMVFMgZGVyaXZlIGl0IGxvY2FsbHkgd2l0aFxuICAgIC8vIGBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpID8gJ2Jyb3dzZXJzdGFjaycgOiBnZXRDbG91ZFByb3ZpZGVyKGJyb3dzZXIpYFxuICAgIC8vIChzZWUgcmVwb3J0ZXIudHMsIGluc2lnaHRzLWhhbmRsZXIudHMpLlxuICAgIGlmIChicm93c2VyICYmICdpbnN0YW5jZXMnIGluIGJyb3dzZXIpIHtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBpbnN0YW5jZXNcbiAgICAgICAgZm9yIChjb25zdCBpbnN0YW5jZU5hbWUgb2YgYnJvd3Nlci5pbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gKGJyb3dzZXIgYXMgYW55KVtpbnN0YW5jZU5hbWVdIGFzIFdlYmRyaXZlcklPLkJyb3dzZXJcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZS5vcHRpb25zICYmIGluc3RhbmNlLm9wdGlvbnMuaG9zdG5hbWUgJiYgaW5zdGFuY2Uub3B0aW9ucy5ob3N0bmFtZS5pbmNsdWRlcygnYnJvd3NlcnN0YWNrJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Jyb3dzZXJzdGFjaydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYnJvd3Nlci5vcHRpb25zICYmIGJyb3dzZXIub3B0aW9ucy5ob3N0bmFtZSAmJiBicm93c2VyLm9wdGlvbnMuaG9zdG5hbWUuaW5jbHVkZXMoJ2Jyb3dzZXJzdGFjaycpKSB7IC8vIFNpbmdsZSBicm93c2VyIGluc3RhbmNlXG4gICAgICAgIHJldHVybiAnYnJvd3NlcnN0YWNrJ1xuICAgIH1cbiAgICByZXR1cm4gJ3Vua25vd25fZ3JpZCdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcnN0YWNrU2Vzc2lvbihicm93c2VyPzogV2ViZHJpdmVySU8uQnJvd3NlciB8IFdlYmRyaXZlcklPLk11bHRpUmVtb3RlQnJvd3Nlcikge1xuICAgIHJldHVybiBicm93c2VyICYmIGdldENsb3VkUHJvdmlkZXIoYnJvd3NlcikudG9Mb3dlckNhc2UoKSA9PT0gJ2Jyb3dzZXJzdGFjaydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjZW5hcmlvRXhhbXBsZXMod29ybGQ6IElUZXN0Q2FzZUhvb2tQYXJhbWV0ZXIpIHtcbiAgICBjb25zdCBzY2VuYXJpbyA9IHdvcmxkLnBpY2tsZVxuXG4gICAgLy8gbm8gZXhhbXBsZXMgcHJlc2VudFxuICAgIGlmICgoc2NlbmFyaW8uYXN0Tm9kZUlkcyAmJiBzY2VuYXJpby5hc3ROb2RlSWRzLmxlbmd0aCA8PSAxKSB8fCBzY2VuYXJpby5hc3ROb2RlSWRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGlja2xlSWQ6IHN0cmluZyA9IHNjZW5hcmlvLmFzdE5vZGVJZHNbMF1cbiAgICBjb25zdCBleGFtcGxlc0lkOiBzdHJpbmcgPSBzY2VuYXJpby5hc3ROb2RlSWRzWzFdXG4gICAgY29uc3QgZ2hlcmtpbkRvY3VtZW50Q2hpbGRyZW4gPSB3b3JsZC5naGVya2luRG9jdW1lbnQuZmVhdHVyZT8uY2hpbGRyZW5cblxuICAgIGxldCBleGFtcGxlczogc3RyaW5nW10gPSBbXVxuXG4gICAgZ2hlcmtpbkRvY3VtZW50Q2hpbGRyZW4/LmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICBpZiAoY2hpbGQucnVsZSkge1xuICAgICAgICAgICAgLy8gaGFuZGxlIGlmIHJ1bGUgaXMgcHJlc2VudFxuICAgICAgICAgICAgY2hpbGQucnVsZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkTGV2ZWwyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRMZXZlbDIuc2NlbmFyaW8gJiYgY2hpbGRMZXZlbDIuc2NlbmFyaW8uaWQgPT09IHBpY2tsZUlkICYmIGNoaWxkTGV2ZWwyLnNjZW5hcmlvLmV4YW1wbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3NlZEV4YW1wbGVzID0gY2hpbGRMZXZlbDIuc2NlbmFyaW8uZXhhbXBsZXMuZmxhdE1hcCgodmFsKSA9PiAodmFsLnRhYmxlQm9keSkpLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGV4YW1wbGVzSWQpPy5jZWxscy5tYXAoKHZhbCkgPT4gKHZhbC52YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWRFeGFtcGxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZXMgPSBwYXNzZWRFeGFtcGxlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5zY2VuYXJpbyAmJiBjaGlsZC5zY2VuYXJpby5pZCA9PT0gcGlja2xlSWQgJiYgY2hpbGQuc2NlbmFyaW8uZXhhbXBsZXMpIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBpZiBzY2VuYXJpbyBvdXRzaWRlIHJ1bGVcbiAgICAgICAgICAgIGNvbnN0IHBhc3NlZEV4YW1wbGVzID0gY2hpbGQuc2NlbmFyaW8uZXhhbXBsZXMuZmxhdE1hcCgodmFsKSA9PiAodmFsLnRhYmxlQm9keSkpLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGV4YW1wbGVzSWQpPy5jZWxscy5tYXAoKHZhbCkgPT4gKHZhbC52YWx1ZSkpXG4gICAgICAgICAgICBpZiAocGFzc2VkRXhhbXBsZXMpIHtcbiAgICAgICAgICAgICAgICBleGFtcGxlcyA9IHBhc3NlZEV4YW1wbGVzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKGV4YW1wbGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZXhhbXBsZXNcbiAgICB9XG4gICAgcmV0dXJuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBbnNpQ29sb3JzKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjk0OTc2ODBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuICAgIHJldHVybiBtZXNzYWdlLnJlcGxhY2UoL1tcXHUwMDFiXFx1MDA5Yl1bWygpIzs/XSooPzpbMC05XXsxLDR9KD86O1swLTldezAsNH0pKik/WzAtOUEtT1JaY2YtbnFyeT0+PF0vZywgJycpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2dUYWcoZXZlbnRUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChldmVudFR5cGUgPT09ICdUZXN0UnVuU3RhcnRlZCcgfHwgZXZlbnRUeXBlID09PSAnVGVzdFJ1bkZpbmlzaGVkJykge1xuICAgICAgICByZXR1cm4gJ1Rlc3RfVXBsb2FkJ1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnSG9va1J1blN0YXJ0ZWQnIHx8IGV2ZW50VHlwZSA9PT0gJ0hvb2tSdW5GaW5pc2hlZCcpIHtcbiAgICAgICAgcmV0dXJuICdIb29rX1VwbG9hZCdcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ1NjcmVlbnNob3RDcmVhdGVkJykge1xuICAgICAgICByZXR1cm4gJ1NjcmVlbnNob3RfVXBsb2FkJ1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnTG9nQ3JlYXRlZCcpIHtcbiAgICAgICAgcmV0dXJuICdMb2dfVXBsb2FkJ1xuICAgIH1cbiAgICByZXR1cm4gJ3VuZGVmaW5lZCdcbn1cblxuLy8gZ2V0IGhpZXJhcmNoeSBmb3IgYSBwYXJ0aWN1bGFyIHRlc3QgKGNhbGxlZCBieSByZXBvcnRlciBmb3Igc2tpcHBlZCB0ZXN0cylcbmV4cG9ydCBmdW5jdGlvbiBnZXRIaWVyYXJjaHkoZnVsbFRpdGxlPzogc3RyaW5nKSB7XG4gICAgaWYgKCFmdWxsVGl0bGUpIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICAgIHJldHVybiBmdWxsVGl0bGUuc3BsaXQoJy4nKS5zbGljZSgwLCAtMSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhvb2tUeXBlIChob29rTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoaG9va05hbWUuc3RhcnRzV2l0aCgnXCJiZWZvcmUgZWFjaFwiJykpIHtcbiAgICAgICAgcmV0dXJuICdCRUZPUkVfRUFDSCdcbiAgICB9IGVsc2UgaWYgKGhvb2tOYW1lLnN0YXJ0c1dpdGgoJ1wiYmVmb3JlIGFsbFwiJykpIHtcbiAgICAgICAgcmV0dXJuICdCRUZPUkVfQUxMJ1xuICAgIH0gZWxzZSBpZiAoaG9va05hbWUuc3RhcnRzV2l0aCgnXCJhZnRlciBlYWNoXCInKSkge1xuICAgICAgICByZXR1cm4gJ0FGVEVSX0VBQ0gnXG4gICAgfSBlbHNlIGlmIChob29rTmFtZS5zdGFydHNXaXRoKCdcImFmdGVyIGFsbFwiJykpIHtcbiAgICAgICAgcmV0dXJuICdBRlRFUl9BTEwnXG4gICAgfVxuICAgIHJldHVybiAndW5rbm93bidcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NyZWVuc2hvdENvbW1hbmQgKGFyZ3M6IEJlZm9yZUNvbW1hbmRBcmdzIHwgQWZ0ZXJDb21tYW5kQXJncykge1xuICAgIHJldHVybiBhcmdzLmVuZHBvaW50ICYmIGFyZ3MuZW5kcG9pbnQuaW5jbHVkZXMoJy9zY3JlZW5zaG90Jylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQlN0YWNrU2Vzc2lvbihjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnVzZXIgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBjb25maWcua2V5ID09PSAnc3RyaW5nJyAmJiBjb25maWcua2V5Lmxlbmd0aCA9PT0gMjApIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Jyb3dzZXJzdGFja0luZnJhKGNvbmZpZzogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBjYXBzPzogQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIC8vIHRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBiYXNpYyBzZXNzaW9uIG9yIG11bHRpIHJlbW90ZSBzZXNzaW9uIGlzIHJ1bm5pbmcgb24gQnJvd3NlcnN0YWNrLCBtYWlubHkgYnkgY2hlY2tpbmcgdGhlIGhvc3RuYW1lIHBhcmFtZXRlciBpbiB0aGUgZ2l2ZW4gY29uZmlnXG4gICAgLy8gSW4gY2FzZSBob3N0bmFtZSBpcyBub3QgcHJlc2VudCBhbnl3aGVyZSBpbiB0aGUgY29uZmlnLCBpdCByZXR1cm5zIHRydWUgYnkgZGVmYXVsdCBhcyBob3N0bmFtZSBpcyBub3QgYSBtYW5kYXRvcnkgcGFyYW1ldGVyIGluIHRoZSBjb25maWdcblxuICAgIGNvbnN0IGlzQnJvd3NlcnN0YWNrID0gKHN0cjogc3RyaW5nICk6IGJvb2xlYW4gPT4ge1xuICAgICAgICByZXR1cm4gc3RyID09PSAnYnJvd3NlcnN0YWNrLmNvbScgfHwgc3RyLmVuZHNXaXRoKCcuYnJvd3NlcnN0YWNrLmNvbScpXG4gICAgfVxuXG4gICAgaWYgKChjb25maWcuaG9zdG5hbWUpICYmICFpc0Jyb3dzZXJzdGFjayhjb25maWcuaG9zdG5hbWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChjYXBzICYmIHR5cGVvZiBjYXBzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjYXBzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIGNhcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoKChjYXBhYmlsaXR5IGFzIE9wdGlvbnMuVGVzdHJ1bm5lcikuaG9zdG5hbWUpICYmICFpc0Jyb3dzZXJzdGFjaygoY2FwYWJpbGl0eSBhcyBPcHRpb25zLlRlc3RydW5uZXIpLmhvc3RuYW1lIGFzIHN0cmluZykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY2Fwcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBjYXBzW2tleSBhcyBrZXlvZiBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzXVxuICAgICAgICAgICAgICAgIGlmICgoKGNhcGFiaWxpdHkgYXMgT3B0aW9ucy5UZXN0cnVubmVyKS5ob3N0bmFtZSkgJiYgIWlzQnJvd3NlcnN0YWNrKChjYXBhYmlsaXR5IGFzIE9wdGlvbnMuVGVzdHJ1bm5lcikuaG9zdG5hbWUgYXMgc3RyaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWlzQlN0YWNrU2Vzc2lvbihjb25maWcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyU3RhY2tVc2VyQW5kS2V5KGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLCBvcHRpb25zOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcblxuICAgIC8vIEZhbGxiYWNrIDE6IEVudiB2YXJpYWJsZXNcbiAgICAvLyBGYWxsYmFjayAyOiBTZXJ2aWNlIHZhcmlhYmxlcyBpbiB3ZGlvLmNvbmYuanMgKHRoYXQgYXJlIHJlY2VpdmVkIGluc2lkZSBvcHRpb25zIG9iamVjdClcbiAgICBjb25zdCBlbnZPclNlcnZpY2VWYXJpYWJsZXMgPSB7XG4gICAgICAgIHVzZXI6IGdldEJyb3dzZXJTdGFja1VzZXIob3B0aW9ucyksXG4gICAgICAgIGtleTogZ2V0QnJvd3NlclN0YWNrS2V5KG9wdGlvbnMpXG4gICAgfVxuICAgIGlmIChlbnZPclNlcnZpY2VWYXJpYWJsZXMudXNlciAmJiBlbnZPclNlcnZpY2VWYXJpYWJsZXMua2V5KSB7XG4gICAgICAgIHJldHVybiBlbnZPclNlcnZpY2VWYXJpYWJsZXNcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAzOiBTZXJ2aWNlIHZhcmlhYmxlcyBpbiB0ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMgb2JqZWN0XG4gICAgLy8gRmFsbGJhY2sgNDogU2VydmljZSB2YXJpYWJsZXMgaW4gdGhlIHRvcCBsZXZlbCBjb25maWcgb2JqZWN0XG4gICAgY29uc3QgbzExeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgdXNlcjogZ2V0T2JzZXJ2YWJpbGl0eVVzZXIob3B0aW9ucywgY29uZmlnKSxcbiAgICAgICAga2V5OiBnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnMsIGNvbmZpZylcbiAgICB9XG4gICAgcmV0dXJuIG8xMXlWYXJpYWJsZXNcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkQWRkU2VydmljZVZlcnNpb24oY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsIHRlc3RPYnNlcnZhYmlsaXR5PzogYm9vbGVhbiwgY2Fwcz86IENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXMpOiBib29sZWFuIHtcbiAgICBpZiAoKGNvbmZpZy5zZXJ2aWNlcyAmJiBjb25maWcuc2VydmljZXMudG9TdHJpbmcoKS5pbmNsdWRlcygnY2hyb21lZHJpdmVyJykgJiYgdGVzdE9ic2VydmFiaWxpdHkgIT09IGZhbHNlKSB8fCAhaXNCcm93c2Vyc3RhY2tJbmZyYShjb25maWcsIGNhcHMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmF0Y2hBbmRQb3N0RXZlbnRzIChldmVudFVybDogc3RyaW5nLCBraW5kOiBzdHJpbmcsIGRhdGE6IFVwbG9hZFR5cGVbXSkge1xuICAgIGlmICghcHJvY2Vzcy5lbnZbVEVTVE9QU19CVUlMRF9DT01QTEVURURfRU5WXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1aWxkIG5vdCBjb21wbGV0ZWQgeWV0JylcbiAgICB9XG5cbiAgICBjb25zdCBqd3RUb2tlbiA9IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX0pXVF1cbiAgICBpZiAoIWp3dFRva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBhdXRoZW50aWNhdGlvbiBUb2tlbicpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJVXRpbHMuREFUQV9FTkRQT0lOVH0vJHtldmVudFVybH1gXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAuLi5ERUZBVUxUX1JFUVVFU1RfQ09ORklHLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7and0VG9rZW59YFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gICAgICAgIH0pXG4gICAgICAgIC8vIHJlYWQgYXMgdGV4dCBmaXJzdDogZXJyb3IgcmVzcG9uc2VzICg0MDEvNXh4KSBhbmQgZW1wdHkgYm9kaWVzIGFyZSBub3QgSlNPTiwgYW5kIGEgYmxpbmRcbiAgICAgICAgLy8gcmVzcG9uc2UuanNvbigpIHN1cmZhY2VkIHRoZW0gYXMgYSBtaXNsZWFkaW5nIFwiVW5leHBlY3RlZCBlbmQgb2YgSlNPTiBpbnB1dFwiXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0ke3Jlc3BvbnNlQm9keSA/IGAgXHUyMDE0ICR7cmVzcG9uc2VCb2R5LnNsaWNlKDAsIDMwMCl9YCA6ICcgKGVtcHR5IGJvZHkpJ31gKVxuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgWyR7a2luZH1dIFN1Y2Nlc3MgcmVzcG9uc2U6ICR7cmVzcG9uc2VCb2R5fWApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbJHtraW5kfV0gRVhDRVBUSU9OIElOICR7a2luZH0gUkVRVUVTVCBUTyBURVNUIFJFUE9SVElORyBBTkQgQU5BTFlUSUNTIDogJHtlcnJvcn1gKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4Y2VwdGlvbiBpbiByZXF1ZXN0ICcgKyBlcnJvcilcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5VXNlcihvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19VU0VSTkFNRSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy51c2VyKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy51c2VyXG4gICAgfVxuICAgIHJldHVybiBjb25maWcudXNlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eUtleShvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BQ0NFU1NfS0VZKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQUNDRVNTX0tFWVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMgJiYgb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMua2V5KSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5rZXlcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy5rZXlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2VydmFiaWxpdHlQcm9qZWN0KG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgYnN0YWNrUHJvamVjdE5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX1BST0pFQ1RfTkFNRSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX1BST0pFQ1RfTkFNRVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMgJiYgb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMucHJvamVjdE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnByb2plY3ROYW1lXG4gICAgfVxuICAgIHJldHVybiBic3RhY2tQcm9qZWN0TmFtZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgYnN0YWNrQnVpbGROYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LlRFU1RfT0JTRVJWQUJJTElUWV9CVUlMRF9OQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfTkFNRVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMgJiYgb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGROYW1lKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZE5hbWVcbiAgICB9XG4gICAgcmV0dXJuIGJzdGFja0J1aWxkTmFtZSB8fCBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2VydmFiaWxpdHlCdWlsZFRhZ3Mob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBic3RhY2tCdWlsZFRhZz86IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX1RBRykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX1RBRy5zcGxpdCgnLCcpXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZFRhZykge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGRUYWdcbiAgICB9XG4gICAgaWYgKGJzdGFja0J1aWxkVGFnKSB7XG4gICAgICAgIHJldHVybiBbYnN0YWNrQnVpbGRUYWddXG4gICAgfVxuICAgIHJldHVybiBbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVzdFBsYW5JZChvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVF9QTEFOX0lEXSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRF1cbiAgICB9XG4gICAgY29uc3QgQ0xJX0FSRyA9ICctLWJyb3dzZXJzdGFjay50ZXN0TWFuYWdlbWVudE9wdGlvbnMudGVzdFBsYW5JZCdcbiAgICBjb25zdCBhcmdJbmRleCA9IHByb2Nlc3MuYXJndi5pbmRleE9mKENMSV9BUkcpXG4gICAgaWYgKGFyZ0luZGV4ICE9PSAtMSAmJiBwcm9jZXNzLmFyZ3ZbYXJnSW5kZXggKyAxXSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5hcmd2W2FyZ0luZGV4ICsgMV1cbiAgICB9XG4gICAgY29uc3QgYXJnV2l0aEVxdWFscyA9IHByb2Nlc3MuYXJndi5maW5kKChhcmcpID0+IGFyZy5zdGFydHNXaXRoKGAke0NMSV9BUkd9PWApKVxuICAgIGlmIChhcmdXaXRoRXF1YWxzKSB7XG4gICAgICAgIHJldHVybiBhcmdXaXRoRXF1YWxzLnNwbGl0KCc9JylbMV1cbiAgICB9XG4gICAgY29uc3QgdGVzdFBsYW5JZCA9IG9wdGlvbnMudGVzdE1hbmFnZW1lbnRPcHRpb25zPy50ZXN0UGxhbklkXG4gICAgaWYgKHR5cGVvZiB0ZXN0UGxhbklkID09PSAnc3RyaW5nJyAmJiB0ZXN0UGxhbklkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB0ZXN0UGxhbklkLnRyaW0oKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyU3RhY2tVc2VyKGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19VU0VSTkFNRSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FIGFzIHN0cmluZ1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnLnVzZXIgYXMgc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyU3RhY2tLZXkoY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FDQ0VTU19LRVkpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BQ0NFU1NfS0VZXG4gICAgfVxuICAgIHJldHVybiBjb25maWcua2V5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZTogdW5rbm93bikge1xuICAgIGxldCByZXMgPSAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbClcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXMgPSByZXMgfHwgdmFsdWUgPT09ICcnXG4gICAgfVxuICAgIHJldHVybiByZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVHJ1ZSh2YWx1ZT86IHVua25vd24pIHtcbiAgICByZXR1cm4gKHZhbHVlICsgJycpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGYWxzZSh2YWx1ZT86IHVua25vd24pIHtcbiAgICByZXR1cm4gKHZhbHVlICsgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZSdcbn1cblxuLyoqXG4gKiBza2lwQXBwT3ZlcnJpZGUgdmFsaWRhdGlvbiBjaG9rZXBvaW50IFx1MjAxNCBwb3J0ZWQgZnJvbSB0aGUgTm9kZSBTREsnc1xuICogdmFsaWRhdGVTa2lwQXBwT3ZlcnJpZGUgKGhlbHBlci5qcykgLyBKYXZhIEJyb3dzZXJTdGFja0phdmFBZ2VudC5wcm9jZXNzQXBwT3B0aW9ucy5cbiAqIENhbGxlZCBPTkNFIGZyb20gdGhlIGxhdW5jaGVyIChtYWluIHByb2Nlc3MsIHByZS1zZXNzaW9uKS4gRW1pdHMgdGhlIGZpeGVkIHdhcm5pbmcsXG4gKiBoYW5kbGVzIHRoZSB0aHJlZSBlZGdlIGNhc2VzLCBhbmQgY2xlYXJzIHRoZSBhcHAgb24gY29uZmxpY3Qgc28gaXQgaXMgbmVpdGhlciB1cGxvYWRlZFxuICogbm9yIGluamVjdGVkLiBUaGVyZSBpcyBOTyBUaWVyLTIgYnJhbmNoOiBldmVyeSBXZWJkcml2ZXJJTyB0ZXN0IGZyYW1ld29ya1xuICogKG1vY2hhL2phc21pbmUvY3VjdW1iZXIpIHN1cHBvcnRzIEFwcCBBdXRvbWF0ZS5cbiAqXG4gKiBUaGUgc3RhbmRhcmQgd2FybmluZyBhbmQgdGhlIGVkZ2UtMiBlcnJvciBhcmUgdmVyYmF0aW0gd2l0aCB0aGUgb3RoZXIgQnJvd3NlclN0YWNrIFNES3NcbiAqIChCcm93c2VyU3RhY2tKYXZhQWdlbnQjcHJvY2Vzc0FwcE9wdGlvbnMpLiBUaGUgZWRnZS0xIGNvbmZsaWN0IHdhcm5pbmcgaXMgSU5URU5USU9OQUxMWSBhZGFwdGVkIGZvclxuICogV2ViZHJpdmVySU8gXHUyMDE0IGl0IHNheXMgXCJicm93c2Vyc3RhY2sgc2VydmljZSBvcHRpb25zXCIgKHdoZXJlIFdESU8gcmVhZHMgYGFwcGApLCBub3QgXCJicm93c2Vyc3RhY2sueW1sXCIgXHUyMDE0XG4gKiBzbyBwbGVhc2UgZG8gTk9UIFwiZml4XCIgaXQgYmFjayB0byB0aGUgeW1sIHdvcmRpbmcgdG8gbWF0Y2ggdGhlIG90aGVyIFNES3MuXG4gKiBHcmFjZWZ1bDogbmV2ZXIgdGhyb3dzIGV4Y2VwdCB0aGUgZGVsaWJlcmF0ZSBlZGdlLTIgY29uZmlnIGVycm9yIChleHBsaWNpdCBmYWxzZSArIG5vIGFwcCksXG4gKiB3aGljaCBmaXJlcyBwcmUtc2Vzc2lvbiBzbyB0aGUgcnVuIGFib3J0cyBjbGVhbmx5LlxuICpcbiAqIE11dGF0ZXMgYG9wdGlvbnMuYXBwYCAoZWRnZS0xKS4gMy1zdGF0ZSB2aWEgaXNUcnVlL2lzRmFsc2UgXHUyMDE0IG5ldmVyIGAhb3B0aW9ucy5za2lwQXBwT3ZlcnJpZGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTa2lwQXBwT3ZlcnJpZGUob3B0aW9ucz86IEJyb3dzZXJzdGFja0NvbmZpZyAmIEJyb3dzZXJzdGFja09wdGlvbnMpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQob3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2tpcEFwcE92ZXJyaWRlID0gKG9wdGlvbnMgYXMgQnJvd3NlcnN0YWNrQ29uZmlnKS5za2lwQXBwT3ZlcnJpZGVcbiAgICBjb25zdCBhbHJlYWR5V2FybmVkID0gaXNUcnVlKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19TS0lQX0FQUF9PVkVSUklERV9XQVJORUQpXG5cbiAgICAvLyBTdGFuZGFyZCB3YXJuaW5nIFx1MjAxNCBmaXJlcyB3aGVuZXZlciBza2lwQXBwT3ZlcnJpZGUgaXMgdHJ1ZSwgYmVmb3JlIGFueSBlZGdlIHJldHVybi5cbiAgICBpZiAoaXNUcnVlKHNraXBBcHBPdmVycmlkZSkgJiYgIWFscmVhZHlXYXJuZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ1tCcm93c2VyU3RhY2tdIFxcJ3NraXBBcHBPdmVycmlkZTogdHJ1ZVxcJyBpcyBzZXQuIFRoZSBTREsgd2lsbCB0cmVhdCB0aGlzIHNlc3Npb24gYXMgQXBwIEF1dG9tYXRlIGFuZCB3aWxsIE5PVCBtYW5hZ2UgYXBwIHVwbG9hZCBvciBpbmplY3QgYXBwIGNhcGFiaWxpdGllcy4gSWYgeW91IGludGVuZGVkIHRvIHJ1biBhbiBBdXRvbWF0ZSAoYnJvd3Nlci93ZWJzaXRlKSBzZXNzaW9uLCByZW1vdmUgXFwnc2tpcEFwcE92ZXJyaWRlXFwnIFx1MjAxNCBsZWF2aW5nIGl0IHNldCB3aWxsIGNhdXNlIEF1dG9tYXRlIHNlc3Npb25zIHRvIGJlaGF2ZSBpbmNvcnJlY3RseS4nKVxuICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfU0tJUF9BUFBfT1ZFUlJJREVfV0FSTkVEID0gJ3RydWUnXG4gICAgfVxuXG4gICAgLy8gRWRnZSAxOiBhcHAgc3BlY2lmaWVkICsgc2tpcEFwcE92ZXJyaWRlOnRydWUgXHUyMTkyIHdhcm4sIGNsZWFyIHRoZSBhcHAgc28gaXQgaXMgbm90XG4gICAgLy8gdXBsb2FkZWQvaW5qZWN0ZWQsIHByb2NlZWQgQXBwIEF1dG9tYXRlLlxuICAgIGlmIChpc1RydWUoc2tpcEFwcE92ZXJyaWRlKSAmJiAhaXNVbmRlZmluZWQoKG9wdGlvbnMgYXMgQnJvd3NlcnN0YWNrQ29uZmlnKS5hcHApKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdDb25mbGljdCBkZXRlY3RlZC4gc2tpcEFwcE92ZXJyaWRlOiB0cnVlIGlzIGFjdGl2ZTsgaWdub3JpbmcgdGhlIGFwcCBwcm92aWRlZCBpbiB0aGUgYnJvd3NlcnN0YWNrIHNlcnZpY2Ugb3B0aW9ucy4nKVxuICAgICAgICA7KG9wdGlvbnMgYXMgQnJvd3NlcnN0YWNrQ29uZmlnKS5hcHAgPSB1bmRlZmluZWRcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gRWRnZSAyOiBhcHAgbm90IHNwZWNpZmllZCArIHNraXBBcHBPdmVycmlkZSBleHBsaWNpdGx5IGZhbHNlIFx1MjE5MiBwcmUtc2Vzc2lvbiBjb25maWcgZXJyb3IuXG4gICAgaWYgKGlzRmFsc2Uoc2tpcEFwcE92ZXJyaWRlKSAmJiBpc1VuZGVmaW5lZCgob3B0aW9ucyBhcyBCcm93c2Vyc3RhY2tDb25maWcpLmFwcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHAgY2FwYWJpbGl0eSBpcyBtaXNzaW5nLiBXaGVuIHNraXBBcHBPdmVycmlkZSBpcyBzZXQgdG8gXFwnZmFsc2VcXCcsIGEgdmFsaWQgYXBwIGNhcGFiaWxpdHkgKGhhc2gvc2hhcmVhYmxlIGlkL3BhdGgvY3VzdG9tX2lkKSBtdXN0IGJlIHByb3ZpZGVkLicpXG4gICAgfVxuXG4gICAgLy8gRWRnZSAzIChhbmQgZGVmYXVsdCk6IHVuc2V0ICsgbm8gYXBwIFx1MjE5MiB1bmNoYW5nZWQgYmVoYXZpb3IgKG5vLW9wKS5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZyYW1ld29ya1N1cHBvcnRzSG9vayhob29rOiBzdHJpbmcsIGZyYW1ld29yaz86IHN0cmluZykge1xuICAgIGlmIChmcmFtZXdvcmsgPT09ICdtb2NoYScgJiYgKGhvb2sgPT09ICdiZWZvcmUnIHx8IGhvb2sgPT09ICdhZnRlcicgfHwgaG9vayA9PT0gJ2JlZm9yZUVhY2gnIHx8IGhvb2sgPT09ICdhZnRlckVhY2gnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmIChmcmFtZXdvcmsgPT09ICdjdWN1bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IHBhdGNoQ29uc29sZUxvZ3MgPSBvMTF5RXJyb3JIYW5kbGVyKCgpID0+IHtcbiAgICBjb25zdCBCU1Rlc3RPcHNQYXRjaGVyID0gbmV3IGxvZ1BhdGNoZXIoe30pXG5cbiAgICBPYmplY3Qua2V5cyhjb25zb2xlSG9sZGVyKS5mb3JFYWNoKChtZXRob2Q6IGtleW9mIHR5cGVvZiBjb25zb2xlKSA9PiB7XG4gICAgICAgIGlmICghKG1ldGhvZCBpbiBjb25zb2xlKSB8fCBtZXRob2QgPT09ICdDb25zb2xlJyB8fCB0eXBlb2YgY29uc29sZVttZXRob2RdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFNraXBwaW5nIG1ldGhvZDogJHttZXRob2R9LCBleGlzdHM6ICR7bWV0aG9kIGluIGNvbnNvbGV9LCB0eXBlOiAke3R5cGVvZiBjb25zb2xlW21ldGhvZF19YClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yaWdNZXRob2Q6IEZ1bmN0aW9uID0gY29uc29sZVttZXRob2RdLmJpbmQoY29uc29sZSlcblxuICAgICAgICBjb25zb2xlW21ldGhvZF0gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LmtleXMoQlNUZXN0T3BzUGF0Y2hlcikuaW5jbHVkZXMobWV0aG9kKSkge1xuICAgICAgICAgICAgICAgICAgICBvcmlnTWV0aG9kKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ01ldGhvZCguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgKEJTVGVzdE9wc1BhdGNoZXIgYXMgYW55KVttZXRob2RdKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIHdoaWxlIHBhdGNoaW5nIGNvbnNvbGUgbG9ncyA6ICR7ZXJyb3J9YClcbiAgICAgICAgICAgICAgICBvcmlnTWV0aG9kKC4uLmFyZ3MpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxufSlcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZhaWx1cmVPYmplY3QoZXJyb3I6IHN0cmluZ3xFcnJvcikge1xuICAgIGNvbnN0IHN0YWNrID0gKGVycm9yIGFzIEVycm9yKS5zdGFja1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnID8gZXJyb3IgOiBlcnJvci5tZXNzYWdlXG4gICAgY29uc3QgYmFja3RyYWNlID0gc3RhY2sgPyByZW1vdmVBbnNpQ29sb3JzKHN0YWNrLnRvU3RyaW5nKCkpIDogJydcblxuICAgIHJldHVybiB7XG4gICAgICAgIGZhaWx1cmU6IFt7IGJhY2t0cmFjZTogW2JhY2t0cmFjZV0gfV0sXG4gICAgICAgIGZhaWx1cmVfcmVhc29uOiByZW1vdmVBbnNpQ29sb3JzKG1lc3NhZ2UudG9TdHJpbmcoKSksXG4gICAgICAgIGZhaWx1cmVfdHlwZTogbWVzc2FnZSA/IChtZXNzYWdlLnRvU3RyaW5nKCkubWF0Y2goL0Fzc2VydGlvbkVycm9yLykgPyAnQXNzZXJ0aW9uRXJyb3InIDogJ1VuaGFuZGxlZEVycm9yJykgOiBudWxsXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAobXMgPSAxMDApID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSlcblxuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRMb2dzT3B0aW9ucyB7XG4gICAgLyogb3B0LW91dCwgbWlycm9yaW5nIHRoZSBOb2RlIFNESydzIGBkaXNhYmxlQXV0b0NhcHR1cmVMb2dzYCAqL1xuICAgIGRpc2FibGVBdXRvQ2FwdHVyZUxvZ3M/OiBib29sZWFuXG4gICAgLyogcGFyc2VkIHdkaW8gY29uZmlnLCB1c2VkIHRvIGxvY2F0ZSB0aGUgdXNlcidzIGNvbmZpZyBmaWxlICovXG4gICAgY29uZmlnPzogT3B0aW9ucy5UZXN0cnVubmVyXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGxvYWRMb2dzKHVzZXI6IHN0cmluZyB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsIGNsaWVudEJ1aWxkVXVpZDogc3RyaW5nLCBvcHRpb25zOiBVcGxvYWRMb2dzT3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gTWFudWFsIGluc3RydW1lbnRhdGlvbjogdGFnIGV2ZXJ5IHJldHVybiBwYXRoIG9uIHRoZSBTREtfVVBMT0FEX0xPR1MgZXZlbnQgc29cbiAgICAvLyB0aGUgbWV0cmljIGlkZW50aWZpZXMgdGhlIHNwZWNpZmljIHJlYXNvbiBsb2dzIHdlcmUgbm90IHVwbG9hZGVkIChubyBjcmVkcyxcbiAgICAvLyBwZXItZmlsZSBjb3B5IGZhaWx1cmUsIHVwbG9hZCBuby1yZXNwb25zZSwgZXhjZXB0aW9uKS4gbWVhc3VyZVdyYXBwZXIgd291bGRcbiAgICAvLyBvdGhlcndpc2UgbWFyayBhbGwgbm9uLXRocm93aW5nIHBhdGhzIGFzIHN1Y2Nlc3MuXG4gICAgY29uc3QgZXZlbnROYW1lID0gUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5FVkVOVFMuU0RLX1VQTE9BRF9MT0dTXG4gICAgbGV0IHN1Y2Nlc3MgPSB0cnVlXG4gICAgbGV0IGZhaWx1cmU6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgIC8vIFN0YWdpbmcgZGlyIGZvciB0aGUgYXJjaGl2ZS4gQ3JlYXRlZCBwZXIgcnVuOiB0aGUgcHJldmlvdXMgZml4ZWQgYHRtcGRpcigpL2xvZ3MudGFyYFxuICAgIC8vIG5hbWVzIG1lYW50IHR3byBjb25jdXJyZW50IHdkaW8gcnVucyBvbiBvbmUgQ0kgaG9zdCBjbG9iYmVyZWQgYW5kIHVubGlua2VkIGVhY2hcbiAgICAvLyBvdGhlcidzIGFyY2hpdmVzLCBhbmQgYSBzb3VyY2UgZmlsZSB0aGF0IGFscmVhZHkgbGl2ZWQgaW4gdG1wZGlyIHdhcyBjb3BpZWQgb250b1xuICAgIC8vIGl0c2VsZiBhbmQgdGhlbiBkZWxldGVkIGJ5IGNsZWFudXAuXG4gICAgbGV0IHN0YWdpbmdEaXI6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgIFBlcmZvcm1hbmNlVGVzdGVyLnN0YXJ0KGV2ZW50TmFtZSlcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIGlzQXV0b0NhcHR1cmVMb2dzRGlzYWJsZWQgKG5vdCBvcHRpb25zLmRpc2FibGVBdXRvQ2FwdHVyZUxvZ3MpIHNvIHRoZSBkZXRhY2hlZFxuICAgICAgICAvLyBjbGVhbnVwIHByb2Nlc3MgXHUyMDE0IHdoaWNoIGNhbGxzIHRoaXMgd2l0aCBubyBvcHRpb25zIFx1MjAxNCBzdGlsbCBob25vdXJzIHRoZSBvcHQtb3V0XG4gICAgICAgIC8vIHZpYSB0aGUgZW52IHZhciB0aGUgbGF1bmNoZXIgcHVibGlzaGVzLlxuICAgICAgICBpZiAoaXNBdXRvQ2FwdHVyZUxvZ3NEaXNhYmxlZChvcHRpb25zKSkge1xuICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlXG4gICAgICAgICAgICBmYWlsdXJlID0gJ3NraXBwZWQ6IGRpc2FibGVBdXRvQ2FwdHVyZUxvZ3M9dHJ1ZSdcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgbG9nIHVwbG9hZCwgYXV0by1jYXB0dXJlIGlzIGRpc2FibGVkJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF1c2VyIHx8ICFrZXkpIHtcbiAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICAgICAgZmFpbHVyZSA9ICdza2lwcGVkOiBtaXNzaW5nX2NyZWRlbnRpYWxzJ1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdVcGxvYWRpbmcgbG9ncyBmYWlsZWQgZHVlIHRvIG5vIGNyZWRlbnRpYWxzJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgc3RhZ2luZ0RpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbih0bXBkaXIoKSwgJ2JzdGFjay13ZGlvLWxvZ3MtJykpXG4gICAgICAgIGNvbnN0IHRtcERpciA9IHN0YWdpbmdEaXJcbiAgICAgICAgY29uc3QgdGFyUGF0aCA9IHBhdGguam9pbih0bXBEaXIsICdsb2dzLnRhcicpXG4gICAgICAgIGNvbnN0IHRhckd6UGF0aCA9IHBhdGguam9pbih0bXBEaXIsICdsb2dzLnRhci5neicpXG5cbiAgICAgICAgLy8gQXJjaGl2ZSBlbnRyaWVzIGFyZSBrZXllZCBieSBiYXNlbmFtZSwgc28gdHdvIHNvdXJjZXMgc2hhcmluZyBvbmUgYmFzZW5hbWUgd291bGRcbiAgICAgICAgLy8gc2lsZW50bHkgb3ZlcndyaXRlIGVhY2ggb3RoZXIgXHUyMDE0IHJlYWNoYWJsZSBub3cgdGhhdCB1c2VyLXN1cHBsaWVkIGNvbmZpZyBwYXRoc1xuICAgICAgICAvLyAoZS5nLiBjb25maWdzL3dkaW8uY29uZi50cyArIHNoYXJlZC93ZGlvLmNvbmYudHMpIGpvaW4gdGhlIGFyY2hpdmUuXG4gICAgICAgIC8vIFNhbWUgaGVscGVyIGNvbGxlY3RDb25maWdGaWxlc0ZvclVwbG9hZCB1c2VzLCBzbyB0aGUgdHdvIGNhbm5vdCBkaXNhZ3JlZS5cbiAgICAgICAgY29uc3QgdGFrZW5OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPihbJ2xvZ3MudGFyJywgJ2xvZ3MudGFyLmd6J10pXG4gICAgICAgIGNvbnN0IGNvcGllZEZpbGVOYW1lczogc3RyaW5nW10gPSBbXVxuICAgICAgICBjb25zdCBhcmNoaXZlQWRkRmFpbHVyZXM6IHN0cmluZ1tdID0gW11cbiAgICAgICAgY29uc3QgdW5pcXVlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nID0+IGRlZHVwZUVudHJ5TmFtZShmaWxlUGF0aCwgdGFrZW5OYW1lcylcblxuICAgICAgICAvLyBTREstNzI1MDogdGhlIHVzZXIncyB3ZGlvIGNvbmZpZyAoYW5kIHRoZSBsb2NhbCBmaWxlcyBpdCBpbXBvcnRzKSwgY3JlZGVudGlhbC1zY3J1YmJlZC5cbiAgICAgICAgLy8gU29mdC1mYWlsdXJlIGJ5IGRlc2lnbiBcdTIwMTQgYSBjb25maWcgd2UgY2Fubm90IHJlYWQgb3IgbG9jYXRlIG11c3QgbmV2ZXIgc3RvcCB0aGVcbiAgICAgICAgLy8gbG9nIHVwbG9hZDsgdGhlIHJlYXNvbiBpcyByZWNvcmRlZCBvbiB0aGUgZXZlbnQgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgeyBmaWxlczogY29uZmlnRmlsZXMsIGZhaWx1cmVzOiBjb25maWdGYWlsdXJlcywgc3RyYXRlZ3kgfSA9IGNvbGxlY3RDb25maWdGaWxlc0ZvclVwbG9hZChvcHRpb25zLmNvbmZpZylcblxuICAgICAgICAvLyBwYWNrYWdlLmpzb24gZ2l2ZXMgdHJpYWdlIHRoZSBmcmFtZXdvcmsvc2VydmljZSB2ZXJzaW9ucywgd2hpY2ggdGhlIGFyY2hpdmUgY2FycmllZFxuICAgICAgICAvLyBiZWZvcmUgdGhpcyBjaGFuZ2UuIEl0IGdvZXMgdGhyb3VnaCB0aGUgc2FtZSByZWRhY3Rpb24gYXMgdGhlIGNvbmZpZ3MgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gYmVpbmcgY29waWVkIHZlcmJhdGltOiBgc2NyaXB0c2Agcm91dGluZWx5IGVtYmVkIHRva2VucyAoYC0tdG9rZW49Z2hwXy4uLmApLCBhbmQgdGhlXG4gICAgICAgIC8vIHdhbGstdXAgY2FuIHNlbGVjdCBhIG1vbm9yZXBvLXJvb3QgbWFuaWZlc3QgYnJvYWRlciB0aGFuIHRoZSB0ZXN0IHByb2plY3QuIE9yZGluYXJ5XG4gICAgICAgIC8vIGRlcGVuZGVuY3kvdmVyc2lvbiBsaW5lcyBhcmUgdW5hZmZlY3RlZCBieSB0aGUgc2NydWIuXG4gICAgICAgIC8vIHNuYXBzaG90IGJlZm9yZSBwYWNrYWdlLmpzb24gam9pbnMgdGhlIGxpc3QsIHNvIGNvdW50cyBhbmQgbmFtZXMgc3RheSBob25lc3RcbiAgICAgICAgY29uc3QgY2FwdHVyZWRDb25maWdOYW1lcyA9IGNvbmZpZ0ZpbGVzLm1hcChmID0+IGYubmFtZSlcblxuICAgICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBmaW5kUGFja2FnZUpzb25Gb3JVcGxvYWQoKVxuICAgICAgICBpZiAocGFja2FnZUpzb25QYXRoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYXRoLmJhc2VuYW1lKHBhY2thZ2VKc29uUGF0aCksXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVBhdGg6IHBhY2thZ2VKc29uUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogcmVkYWN0U2Vuc2l0aXZlQ29udGVudChmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGNhdGNoIChwa2dFcnIpIHtcbiAgICAgICAgICAgICAgICBjb25maWdGYWlsdXJlcy5wdXNoKGBwYWNrYWdlLmpzb246ICR7KHBrZ0VyciBhcyBFcnJvcik/Lm1lc3NhZ2UgfHwgU3RyaW5nKHBrZ0Vycil9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNvbmZpZ0ZpbGUgb2YgY29uZmlnRmlsZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlOYW1lID0gdW5pcXVlTmFtZShjb25maWdGaWxlLm5hbWUpXG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4odG1wRGlyLCBlbnRyeU5hbWUpLCBjb25maWdGaWxlLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgY29waWVkRmlsZU5hbWVzLnB1c2goZW50cnlOYW1lKVxuICAgICAgICAgICAgfSBjYXRjaCAod3JpdGVFcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSAod3JpdGVFcnIgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IFN0cmluZyh3cml0ZUVycilcbiAgICAgICAgICAgICAgICBjb25maWdGYWlsdXJlcy5wdXNoKGAke2NvbmZpZ0ZpbGUubmFtZX06ICR7bXNnfWApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTG9nZ2VkIHNlcGFyYXRlbHkgZnJvbSBwYWNrYWdlLmpzb246IGBjb25maWdGaWxlc2AgaGFzIHRoZSBtYW5pZmVzdCBhcHBlbmRlZCB0byBpdCxcbiAgICAgICAgLy8gYW5kIGBzdHJhdGVneWAgaXMgdW5kZWZpbmVkIG9uIGV2ZXJ5IGZhaWx1cmUgcGF0aCwgc28gYSBjb21iaW5lZCBsaW5lIHJlYWRzXG4gICAgICAgIC8vIFwiQXV0by1jYXB0dXJlZCAxIGNvbmZpZyBmaWxlKHMpIHZpYSB1bmRlZmluZWQ6IHBhY2thZ2UuanNvblwiIFx1MjAxNCBpLmUuIGl0IGNsYWltcyBhXG4gICAgICAgIC8vIGNhcHR1cmUgc3VjY2VlZGVkIGluIGV4YWN0bHkgdGhlIGNhc2Ugd2hlcmUgbm9uZSBkaWQuXG4gICAgICAgIGlmIChjYXB0dXJlZENvbmZpZ05hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgQXV0by1jYXB0dXJlZCAke2NhcHR1cmVkQ29uZmlnTmFtZXMubGVuZ3RofSBjb25maWcgZmlsZShzKSB2aWEgJHtzdHJhdGVneX06ICR7Y2FwdHVyZWRDb25maWdOYW1lcy5qb2luKCcsICcpfWApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYE5vIHdkaW8gY29uZmlnIGNhcHR1cmVkJHtzdHJhdGVneSA/IGAgKHN0cmF0ZWd5ICR7c3RyYXRlZ3l9KWAgOiAnJ31gKVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrYWdlSnNvblBhdGgpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgQXV0by1jYXB0dXJlZCBwYWNrYWdlLmpzb24gZnJvbSAke3JlbGF0aXZlRGlyVG9Dd2QocGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpfWApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ0ZhaWx1cmVzLmxlbmd0aCA+IDAgJiYgZmFpbHVyZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBXYXJuaW5nIG9ubHkgXHUyMDE0IGBzdWNjZXNzYCBzdGF5cyB0cnVlIHNvIGEgbWlzc2luZyBjb25maWcgbmV2ZXIgcmVhZHMgYXMgYVxuICAgICAgICAgICAgLy8gZmFpbGVkIGxvZyB1cGxvYWQgKHNhbWUgY29udHJhY3QgYXMgdGhlIE5vZGUgU0RLJ3MgYHJlZGFjdGlvbl9mYWlsZWRgKS5cbiAgICAgICAgICAgIGZhaWx1cmUgPSBgY29uZmlnX2NhcHR1cmU6ICR7Y29uZmlnRmFpbHVyZXMuam9pbignOyAnKX1gLnN1YnN0cmluZygwLCAzMDApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgc2VydmljZSBsb2cgaXMgc25hcHNob3R0ZWQgTEFTVCwgZGVsaWJlcmF0ZWx5LiBFdmVyeXRoaW5nIGFib3ZlIC0tIHRoZSByZXNvbHV0aW9uXG4gICAgICAgIC8vIHN0cmF0ZWd5LCB3aGF0IHdhcyBjYXB0dXJlZCwgYW5kIGFueSBjYXB0dXJlIGZhaWx1cmVzIC0tIGlzIHdyaXR0ZW4gdG8gdGhhdCBsb2dcbiAgICAgICAgLy8gZmlyc3QsIHNvIGl0IGlzIGluc2lkZSB0aGUgY29weSB0aGF0IHNoaXBzLiBDb3B5aW5nIGVhcmxpZXIgaXMgd2h5IHRob3NlIGxpbmVzIHVzZWRcbiAgICAgICAgLy8gdG8gZXhpc3Qgb25seSBpbiB0aGUgZGV2ZWxvcGVyJ3MgbG9jYWwgZmlsZSBhbmQgbmV2ZXIgaW4gdGhlIGRvd25sb2FkZWQgYnVuZGxlLlxuICAgICAgICAvL1xuICAgICAgICAvLyBPcmRlcmluZyBhbG9uZSBpcyBub3QgZW5vdWdoOiBCU3RhY2tMb2dnZXIgd3JpdGVzIHRocm91Z2ggYW4gYXN5bmMgV3JpdGVTdHJlYW0sIHNvXG4gICAgICAgIC8vIHRob3NlIGxpbmVzIGFyZSBzdGlsbCBidWZmZXJlZCBhdCB0aGlzIHBvaW50LiBGbHVzaCBiZWZvcmUgY29weWluZyBvciB0aGUgc2hpcHBlZFxuICAgICAgICAvLyBjb3B5IGlzIHNpbGVudGx5IG1pc3NpbmcgaXRzIHRhaWwgKHZlcmlmaWVkIGFnYWluc3QgYSBkb3dubG9hZGVkIGJ1bmRsZSkuXG4gICAgICAgIGF3YWl0IEJTdGFja0xvZ2dlci5mbHVzaExvZ0ZpbGUoKVxuXG4gICAgICAgIGNvbnN0IGZpbGVzVG9BcmNoaXZlID0gW1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmxvZ0ZpbGVQYXRoLFxuICAgICAgICAgICAgQ0xJX0RFQlVHX0xPR1NfRklMRSxcbiAgICAgICAgXS5maWx0ZXIoKGYpOiBmIGlzIHN0cmluZyA9PiBCb29sZWFuKGYpICYmIGZzLmV4aXN0c1N5bmMoZiBhcyBzdHJpbmcpKVxuXG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWxlc1RvQXJjaGl2ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeU5hbWUgPSB1bmlxdWVOYW1lKGYpXG4gICAgICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKGYsIHBhdGguam9pbih0bXBEaXIsIGVudHJ5TmFtZSkpXG4gICAgICAgICAgICAgICAgY29waWVkRmlsZU5hbWVzLnB1c2goZW50cnlOYW1lKVxuICAgICAgICAgICAgfSBjYXRjaCAoY29weUVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IChjb3B5RXJyIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBTdHJpbmcoY29weUVycilcbiAgICAgICAgICAgICAgICBhcmNoaXZlQWRkRmFpbHVyZXMucHVzaChgJHtwYXRoLmJhc2VuYW1lKGYpfTogJHttc2d9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmNoaXZlQWRkRmFpbHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlXG4gICAgICAgICAgICBmYWlsdXJlID0gYGFyY2hpdmVfYWRkX2ZhaWxlZCBbJHthcmNoaXZlQWRkRmFpbHVyZXMubGVuZ3RofV06ICR7YXJjaGl2ZUFkZEZhaWx1cmVzLmpvaW4oJzsgJyl9YC5zdWJzdHJpbmcoMCwgMzAwKVxuICAgICAgICB9XG5cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBBdXRvLWNhcHR1cmUgYXJjaGl2ZSBlbnRyaWVzOiAke2NvcGllZEZpbGVOYW1lcy5qb2luKCcsICcpfWApXG5cbiAgICAgICAgYXdhaXQgY3JlYXRlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZpbGU6IHRhclBhdGgsXG4gICAgICAgICAgICAgICAgY3dkOiB0bXBEaXIsXG4gICAgICAgICAgICAgICAgcG9ydGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgbm9EaXJSZWN1cnNlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29waWVkRmlsZU5hbWVzXG4gICAgICAgIClcblxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHRhclBhdGgpXG4gICAgICAgICAgICBjb25zdCBkZXN0ID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odGFyR3pQYXRoKVxuICAgICAgICAgICAgY29uc3QgZ3ppcCA9IHpsaWIuY3JlYXRlR3ppcCh7IGxldmVsOiAxIH0pXG5cbiAgICAgICAgICAgIHNvdXJjZS5waXBlKGd6aXApLnBpcGUoZGVzdClcbiAgICAgICAgICAgIGRlc3Qub24oJ2ZpbmlzaCcsIHJlc29sdmUpXG4gICAgICAgICAgICBkZXN0Lm9uKCdlcnJvcicsIHJlamVjdClcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIC8vIG9wZW5Bc0Jsb2IgKE5vZGUgPj0yMCkgcmV0dXJucyBhIEJsb2IgYmFja2VkIGJ5IGEgZmlsZSBkZXNjcmlwdG9yIFx1MjAxNCB1bmRpY2lcbiAgICAgICAgLy8gc3RyZWFtcyBmcm9tIGRpc2sgZHVyaW5nIHRoZSB1cGxvYWQgaW5zdGVhZCBvZiBtYXRlcmlhbGlzaW5nIHRoZSBmdWxsIGFyY2hpdmVcbiAgICAgICAgLy8gaW4gVjggaGVhcCAod2hpY2ggcmVhZEZpbGVTeW5jICsgbmV3IEJsb2IoW0J1ZmZlcl0pIHdvdWxkIGRvIHR3aWNlKS5cbiAgICAgICAgLy8gTm9kZSAxOC4yMCAoc3RpbGwgc3VwcG9ydGVkIHBlciBgZW5naW5lc2ApIGxhY2tzIGZzLm9wZW5Bc0Jsb2IsIHNvIGZhbGwgYmFja1xuICAgICAgICAvLyB0byByZWFkaW5nIHRoZSAoc21hbGwpIGxvZyBhcmNoaXZlIGludG8gYSBCbG9iIHRoZXJlLlxuICAgICAgICBjb25zdCBmaWxlID0gdHlwZW9mIGZzLm9wZW5Bc0Jsb2IgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgZnMub3BlbkFzQmxvYih0YXJHelBhdGgsIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3gtZ3ppcCcgfSlcbiAgICAgICAgICAgIDogbmV3IEJsb2IoW2ZzLnJlYWRGaWxlU3luYyh0YXJHelBhdGgpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24veC1nemlwJyB9KVxuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2RhdGEnLCBmaWxlLCAnbG9ncy50YXIuZ3onKVxuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2NsaWVudEJ1aWxkVXVpZCcsIGNsaWVudEJ1aWxkVXVpZClcblxuICAgICAgICBjb25zdCBhdXRoID0gQnVmZmVyLmZyb20oYCR7dXNlcn06JHtrZXl9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgICAgICAgIGJvZHk6IGZvcm1EYXRhIGFzIEJvZHlJbml0LFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJhc2ljICR7YXV0aH1gXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG5vZGVSZXF1ZXN0KFxuICAgICAgICAgICAgJ1BPU1QnLCBVUExPQURfTE9HU19FTkRQT0lOVCwgcmVxdWVzdE9wdGlvbnMsIEFQSVV0aWxzLlVQTE9BRF9MT0dTX0FERFJFU1NcbiAgICAgICAgKVxuXG4gICAgICAgIC8vIFN0YWdpbmcgZGlyIChhcmNoaXZlICsgZXZlcnkgY29waWVkL3JlZGFjdGVkIGVudHJ5KSBpcyByZW1vdmVkIGluIGBmaW5hbGx5YC5cblxuICAgICAgICAvLyBEZWxldGUgdGhlIFNESyBDTEkgbG9nIGZpbGUgYWZ0ZXIgdXBsb2FkXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKENMSV9ERUJVR19MT0dTX0ZJTEUpKSB7XG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKENMSV9ERUJVR19MT0dTX0ZJTEUpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgICAvLyBub2RlUmVxdWVzdCBzd2FsbG93cyBlcnJvcnMgZm9yIHRoZSBsb2ctdXBsb2FkIHBhdGggYW5kIHJldHVybnMgdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gcmVjb3JkIHRoZSBzaWxlbnQgdXBsb2FkIGZhaWx1cmUgb24gdGhlIG1ldHJpYy5cbiAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICAgICAgZmFpbHVyZSA9ICd1cGxvYWRfbm9fcmVzcG9uc2UnXG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzICYmIHJlc3BvbnNlLnN0YXR1cyAhPT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAvLyBTZXJ2ZXItc2lkZSByZWplY3Rpb24gKGUuZy4gXCJGaWxlIG5vdCBhdHRhY2hlZFwiKSBcdTIwMTQgcmVzcG9uc2UgaXMgdHJ1dGh5XG4gICAgICAgICAgICAvLyBidXQgdGhlIHVwbG9hZCBkaWRuJ3QgYWN0dWFsbHkgbGFuZC5cbiAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICAgICAgZmFpbHVyZSA9IGB1cGxvYWRfc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c30ke3Jlc3BvbnNlLm1lc3NhZ2UgPyAnIC0gJyArIFN0cmluZyhyZXNwb25zZS5tZXNzYWdlKS5zbGljZSgwLCAyMDApIDogJyd9YFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc3VjY2VzcyA9IGZhbHNlXG4gICAgICAgIGZhaWx1cmUgPSBgdXBsb2FkTG9ncyBleGNlcHRpb246ICR7Z2V0RXJyb3JTdHJpbmcoZXJyb3IpfWBcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciB3aGlsZSB1cGxvYWRpbmcgbG9nczogJHtnZXRFcnJvclN0cmluZyhlcnJvcil9YClcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoc3RhZ2luZ0Rpcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmcy5ybVN5bmMoc3RhZ2luZ0RpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgICAgICAgICB9IGNhdGNoIChjbGVhbnVwRXJyKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBGYWlsZWQgdG8gY2xlYW4gdXAgbG9nIHN0YWdpbmcgZGlyICR7c3RhZ2luZ0Rpcn06ICR7Z2V0RXJyb3JTdHJpbmcoY2xlYW51cEVycil9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoZXZlbnROYW1lLCBzdWNjZXNzLCBmYWlsdXJlKVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0ID0gKG9iamVjdDogdW5rbm93bikgPT4ge1xuICAgIHJldHVybiBvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2JqZWN0KVxufVxuXG5leHBvcnQgY29uc3QgT2JqZWN0c0FyZUVxdWFsID0gKG9iamVjdDE6IG9iamVjdCwgb2JqZWN0Mjogb2JqZWN0KSA9PiB7XG4gICAgY29uc3Qgb2JqZWN0S2V5czEgPSBPYmplY3Qua2V5cyhvYmplY3QxKVxuICAgIGNvbnN0IG9iamVjdEtleXMyID0gT2JqZWN0LmtleXMob2JqZWN0MilcbiAgICBpZiAob2JqZWN0S2V5czEubGVuZ3RoICE9PSBvYmplY3RLZXlzMi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIG9iamVjdEtleXMxKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlMSA9IG9iamVjdDFba2V5IGFzIGtleW9mIHR5cGVvZiBvYmplY3QxXVxuICAgICAgICBjb25zdCB2YWx1ZTIgPSBvYmplY3QyW2tleSBhcyBrZXlvZiB0eXBlb2Ygb2JqZWN0MV1cbiAgICAgICAgY29uc3QgaXNCb3RoQXJlT2JqZWN0cyA9IGlzT2JqZWN0KHZhbHVlMSkgJiYgaXNPYmplY3QodmFsdWUyKVxuICAgICAgICBpZiAoKGlzQm90aEFyZU9iamVjdHMgJiYgIU9iamVjdHNBcmVFcXVhbCh2YWx1ZTEsIHZhbHVlMikpIHx8ICghaXNCb3RoQXJlT2JqZWN0cyAmJiB2YWx1ZTEgIT09IHZhbHVlMikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBnZXRQbGF0Zm9ybVZlcnNpb24gPSBvMTF5RXJyb3JIYW5kbGVyKGZ1bmN0aW9uIGdldFBsYXRmb3JtVmVyc2lvbihjYXBzOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMsIHVzZXJDYXBzOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpIHtcbiAgICBpZiAoIWNhcHMgJiYgIXVzZXJDYXBzKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCBic3RhY2tPcHRpb25zID0gKHVzZXJDYXBzKT8uWydic3RhY2s6b3B0aW9ucyddXG4gICAgY29uc3Qga2V5cyA9IFsncGxhdGZvcm1WZXJzaW9uJywgJ3BsYXRmb3JtX3ZlcnNpb24nLCAnb3NWZXJzaW9uJywgJ29zX3ZlcnNpb24nXVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAoY2Fwcz8uW2tleSBhcyBrZXlvZiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNdKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEdvdCAke2tleX0gZnJvbSBkcml2ZXIgY2Fwc2ApXG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKGNhcHM/LltrZXkgYXMga2V5b2YgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXSlcbiAgICAgICAgfSBlbHNlIGlmIChic3RhY2tPcHRpb25zICYmIGJzdGFja09wdGlvbnM/LltrZXkgYXMga2V5b2YgQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllc10pIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgR290ICR7a2V5fSBmcm9tIHVzZXIgYnN0YWNrIG9wdGlvbnNgKVxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhic3RhY2tPcHRpb25zPy5ba2V5IGFzIGtleW9mIENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXNdKVxuICAgICAgICB9IGVsc2UgaWYgKHVzZXJDYXBzW2tleSBhcyBrZXlvZiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNdKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEdvdCAke2tleX0gZnJvbSB1c2VyIGNhcHNgKVxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh1c2VyQ2Fwc1trZXkgYXMga2V5b2YgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXSlcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG59KVxuXG4vKipcbiAqIFJlc29sdmUgYSBzdGFibGUsIGh1bWFuLXJlYWRhYmxlIGRldmljZSBpZGVudGlmaWVyIGZvciB0aGVcbiAqIGBkZXZpY2VgIGZpZWxkIG9uIHRlc3RfcnVuIGludGVncmF0aW9ucyBwYXlsb2Fkcy5cbiAqXG4gKiBUZXN0SHViIGRlZHVwZXMgdGVzdF9ydW5zIGJ5IGEgaGFzaCB0aGF0IGluY2x1ZGVzIGBkZXZpY2VgLiBGb3JcbiAqIEFwcC1BdXRvbWF0ZSBmbG93cyB0aGF0IHBhc3MgYSByZWdleCBkZXZpY2UgcmVxdWVzdCAoZS5nLiBgLipQaXhlbC4qYClcbiAqIGFjcm9zcyBtdWx0aXBsZSBwbGF0Zm9ybXMsIHRoZSBTREsgcHJldmlvdXNseSBzZW50IHRoZSBpbnB1dCByZWdleFxuICogc3RyaW5nLCBjYXVzaW5nIHR3byBwYXJhbGxlbCBzZXNzaW9ucyBvbiBwaHlzaWNhbGx5IGRpZmZlcmVudCBkZXZpY2VzXG4gKiB0byBjb2xsaWRlIG9uIHRoZSBoYXNoIGFuZCBtZXJnZS4gVGhpcyBoZWxwZXIgcHJlZmVycyB0aGUgQXBwaXVtXG4gKiBzZXJ2ZXItcmVzb2x2ZWQgZmllbGRzIChgZGV2aWNlTW9kZWxgIC8gYGFwcGl1bTpkZXZpY2VNb2RlbGApIGJlZm9yZVxuICogZmFsbGluZyBiYWNrIHRvIHRoZSByZXF1ZXN0ZWQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIE11bHRpcmVtb3RlOiBgZHJpdmVyQ2Fwc2AgZm9yIGEgYE11bHRpUmVtb3RlQnJvd3NlcmAgaXMgYSBtYXAgb2ZcbiAqIGB7aW5zdGFuY2VOYW1lOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMsIFx1MjAyNn1gIHJhdGhlciB0aGFuIGZsYXQgY2FwcztcbiAqIHRoZSBoZWxwZXIgZGV0ZWN0cyB0aGF0IHNoYXBlIGFuZCB3YWxrcyBlYWNoIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBkcml2ZXJDYXBzIC0gbGl2ZSBkcml2ZXIgY2FwYWJpbGl0aWVzIChgYnJvd3Nlci5jYXBhYmlsaXRpZXNgKVxuICogICAgICAgICAgICAgICAgICAgICB3aGVyZSBBcHBpdW0gc2VydmVyLXJlc29sdmVkIGZpZWxkcyBhcmUgcG9wdWxhdGVkXG4gKiBAcGFyYW0gcmVxdWVzdGVkQ2FwcyAtIHVzZXItcmVxdWVzdGVkIGNhcGFiaWxpdGllcyAocnVubmVyIGNhcHMgLyB5bWwpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYXMgYSBmYWxsYmFja1xuICovXG5leHBvcnQgY29uc3QgZ2V0UmVzb2x2ZWREZXZpY2VOYW1lID0gbzExeUVycm9ySGFuZGxlcihmdW5jdGlvbiBnZXRSZXNvbHZlZERldmljZU5hbWUoXG4gICAgZHJpdmVyQ2Fwcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB8IFJlY29yZDxzdHJpbmcsIHsgY2FwYWJpbGl0aWVzPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIH0+LFxuICAgIHJlcXVlc3RlZENhcHM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfCBSZWNvcmQ8c3RyaW5nLCB7IGNhcGFiaWxpdGllcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9Pixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmxhdHRlbk11bHRpcmVtb3RlID0gKFxuICAgICAgICBjYXBzOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfCBSZWNvcmQ8c3RyaW5nLCB7IGNhcGFiaWxpdGllcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9PiB8IHVuZGVmaW5lZCxcbiAgICApOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNbXSA9PiB7XG4gICAgICAgIGlmICghY2Fwcykge3JldHVybiBbXX1cbiAgICAgICAgY29uc3Qgb2JqID0gY2FwcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICBpZiAob2JqLmRldmljZU1vZGVsIHx8IG9ialsnYXBwaXVtOmRldmljZU1vZGVsJ10gfHwgb2JqLmRldmljZU5hbWUgfHwgb2JqWydic3RhY2s6b3B0aW9ucyddKSB7XG4gICAgICAgICAgICAvLyBsb29rcyBsaWtlIGZsYXQgY2Fwc1xuICAgICAgICAgICAgcmV0dXJuIFtjYXBzIGFzIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc11cbiAgICAgICAgfVxuICAgICAgICAvLyBsb29rcyBsaWtlIGEgbXVsdGlyZW1vdGUgbWFwOiB7aW5zdGFuY2VOYW1lOiB7Y2FwYWJpbGl0aWVzOiB7Li4ufX19XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKG9iailcbiAgICAgICAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHsgY2FwYWJpbGl0aWVzPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIH0gPT5cbiAgICAgICAgICAgICAgICB2ICE9PSBudWxsICYmIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiAnY2FwYWJpbGl0aWVzJyBpbiAodiBhcyBvYmplY3QpKVxuICAgICAgICAgICAgLm1hcCh2ID0+IHYuY2FwYWJpbGl0aWVzIGFzIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcylcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VzOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNbXSA9IFtcbiAgICAgICAgLi4uZmxhdHRlbk11bHRpcmVtb3RlKGRyaXZlckNhcHMpLFxuICAgICAgICAuLi5mbGF0dGVuTXVsdGlyZW1vdGUocmVxdWVzdGVkQ2FwcyksXG4gICAgXVxuICAgIGlmICghc291cmNlcy5sZW5ndGgpIHtyZXR1cm4gdW5kZWZpbmVkfVxuXG4gICAgY29uc3QgcGlja1N0cmluZyA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSBvYmo/LltrZXldXG4gICAgICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi5sZW5ndGggPiAwID8gdiA6IHVuZGVmaW5lZFxuICAgIH1cbiAgICAvLyBQcmVjZWRlbmNlOiBwcmVmZXIgQXBwaXVtIHNlcnZlci1yZXNvbHZlZCBkZXZpY2VNb2RlbDsgZmFsbCBiYWNrIHRocm91Z2hcbiAgICAvLyByZXF1ZXN0ZWQgY2FwIHZhcmlhbnRzLiBgYnN0YWNrOm9wdGlvbnMuZGV2aWNlTmFtZWAgaXMgdGhlIHVzZXIncyByZWdleFxuICAgIC8vIGZvciBBcHAtQXV0b21hdGUgcnVucywga2VwdCBhcyBhIGZhbGxiYWNrIGZvciB0aGUgbm9uLXJlc29sdmVkIGNhc2UuXG4gICAgY29uc3QgcGF0aHM6IEFycmF5PChjOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gc3RyaW5nIHwgdW5kZWZpbmVkPiA9IFtcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGMsICdkZXZpY2VNb2RlbCcpLFxuICAgICAgICBjID0+IHBpY2tTdHJpbmcoYywgJ2FwcGl1bTpkZXZpY2VNb2RlbCcpLFxuICAgICAgICBjID0+IHBpY2tTdHJpbmcoY1snYnN0YWNrOm9wdGlvbnMnXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCwgJ2RldmljZU5hbWUnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGMsICdhcHBpdW06ZGV2aWNlTmFtZScpLFxuICAgICAgICBjID0+IHBpY2tTdHJpbmcoYywgJ2RldmljZU5hbWUnKSxcbiAgICBdXG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc3JjIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBwYXRoKHNyYyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgICAgaWYgKHYpIHtyZXR1cm4gdn1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG59KVxuXG5leHBvcnQgY29uc3QgZ2V0QmFzaWNBdXRoSGVhZGVyID0gKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBlbmNvZGVkQXV0aCA9IEJ1ZmZlci5mcm9tKGAke3VzZXJuYW1lfToke3Bhc3N3b3JkfWAsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgcmV0dXJuIGBCYXNpYyAke2VuY29kZWRBdXRofWBcbn1cblxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0RW1wdHkgPSAob2JqZWN0TmFtZTogdW5rbm93bikgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICAgIG9iamVjdE5hbWUgJiZcbiAgICAgICAgT2JqZWN0LmtleXMob2JqZWN0TmFtZSkubGVuZ3RoID09PSAwICYmXG4gICAgICAgIG9iamVjdE5hbWUuY29uc3RydWN0b3IgPT09IE9iamVjdFxuICAgIClcbn1cblxuZXhwb3J0IGNvbnN0IGdldEVycm9yU3RyaW5nID0gKGVycjogdW5rbm93bikgPT4ge1xuICAgIGlmICghZXJyKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAgZXJyIC8vIHdvcmtzLCBgZWAgbmFycm93ZWQgdG8gc3RyaW5nXG4gICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyLm1lc3NhZ2UgLy8gd29ya3MsIGBlYCBuYXJyb3dlZCB0byBFcnJvclxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlU3RyaW5nKGZpZWxkOiBzdHJpbmcsIHRydW5jYXRlU2l6ZUluQnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYnVmZmVyU2l6ZUluQnl0ZXMgPSBCdWZmZXIuZnJvbShHSVRfTUVUQV9EQVRBX1RSVU5DQVRFRCkubGVuZ3RoXG5cbiAgICAgICAgY29uc3QgZmllbGRCdWZmZXJPYmogPSBCdWZmZXIuZnJvbShmaWVsZClcbiAgICAgICAgY29uc3QgbGVuT2ZGaWVsZEJ1ZmZlck9iaiA9IGZpZWxkQnVmZmVyT2JqLmxlbmd0aFxuICAgICAgICBjb25zdCBmaW5hbExlbiA9IE1hdGguY2VpbChsZW5PZkZpZWxkQnVmZmVyT2JqIC0gdHJ1bmNhdGVTaXplSW5CeXRlcyAtIGJ1ZmZlclNpemVJbkJ5dGVzKVxuICAgICAgICBpZiAoZmluYWxMZW4gPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB0cnVuY2F0ZWRTdHJpbmcgPSBmaWVsZEJ1ZmZlck9iai5zdWJhcnJheSgwLCBmaW5hbExlbikudG9TdHJpbmcoKSArIEdJVF9NRVRBX0RBVEFfVFJVTkNBVEVEXG4gICAgICAgICAgICByZXR1cm4gdHJ1bmNhdGVkU3RyaW5nXG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIHdoaWxlIHRydW5jYXRpbmcgZmllbGQsIG5vdGhpbmcgd2FzIHRydW5jYXRlZCBoZXJlOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiBmaWVsZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2l6ZU9mSnNvbk9iamVjdEluQnl0ZXMoanNvbkRhdGE6IEdpdE1ldGFEYXRhKTogbnVtYmVyIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShqc29uRGF0YSkpXG5cbiAgICAgICAgcmV0dXJuIGJ1ZmZlci5sZW5ndGhcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFNvbWV0aGluZyB3ZW50IHdyb25nIHdoaWxlIGNhbGN1bGF0aW5nIHNpemUgb2YgSlNPTiBvYmplY3Q6ICR7ZXJyb3J9YClcbiAgICB9XG5cbiAgICByZXR1cm4gLTFcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQW5kVHJ1bmNhdGVWQ1NJbmZvKGdpdE1ldGFEYXRhOiBHaXRNZXRhRGF0YSk6IEdpdE1ldGFEYXRhIHtcbiAgICBjb25zdCBnaXRNZXRhRGF0YVNpemVJbkJ5dGVzID0gZ2V0U2l6ZU9mSnNvbk9iamVjdEluQnl0ZXMoZ2l0TWV0YURhdGEpXG5cbiAgICBpZiAoZ2l0TWV0YURhdGFTaXplSW5CeXRlcyAmJiBnaXRNZXRhRGF0YVNpemVJbkJ5dGVzID4gTUFYX0dJVF9NRVRBX0RBVEFfU0laRV9JTl9CWVRFUykge1xuICAgICAgICBjb25zdCB0cnVuY2F0ZVNpemUgPSBnaXRNZXRhRGF0YVNpemVJbkJ5dGVzIC0gTUFYX0dJVF9NRVRBX0RBVEFfU0laRV9JTl9CWVRFU1xuICAgICAgICBjb25zdCB0cnVuY2F0ZWRDb21taXRNZXNzYWdlID0gdHJ1bmNhdGVTdHJpbmcoZ2l0TWV0YURhdGEuY29tbWl0X21lc3NhZ2UsIHRydW5jYXRlU2l6ZSlcbiAgICAgICAgZ2l0TWV0YURhdGEuY29tbWl0X21lc3NhZ2UgPSB0cnVuY2F0ZWRDb21taXRNZXNzYWdlXG4gICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGBUaGUgY29tbWl0IGhhcyBiZWVuIHRydW5jYXRlZC4gU2l6ZSBvZiBjb21taXQgYWZ0ZXIgdHJ1bmNhdGlvbiBpcyAkeyBnZXRTaXplT2ZKc29uT2JqZWN0SW5CeXRlcyhnaXRNZXRhRGF0YSkgLyAxMDI0IH0gS0JgKVxuICAgIH1cblxuICAgIHJldHVybiBnaXRNZXRhRGF0YVxufVxuXG5leHBvcnQgY29uc3QgaGFzQnJvd3Nlck5hbWUgPSAoY2FwOiBDYXBhYmlsaXRpZXMuV2ViZHJpdmVySU9Db25maWcpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIWNhcCB8fCAhY2FwLmNhcGFiaWxpdGllcykge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgYnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzID0gY2FwLmNhcGFiaWxpdGllcyBhcyBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzXG4gICAgcmV0dXJuIGJyb3dzZXJTdGFja0NhcGFiaWxpdGllcy5icm93c2VyTmFtZSAhPT0gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBpc1ZhbGlkQ2Fwc0ZvckhlYWxpbmcgPSAoY2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzKTogYm9vbGVhbiA9PiB7XG5cbiAgICAvLyBHZXQgYWxsIGNhcGFiaWxpdHkgdmFsdWVzXG4gICAgY29uc3QgY2FwVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhjYXBzKVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBjYXBhYmlsaXRpZXMgYW5kIGlmIGF0IGxlYXN0IG9uZSBoYXMgYSBicm93c2VyIG5hbWVcbiAgICByZXR1cm4gY2FwVmFsdWVzLmxlbmd0aCA+IDAgJiYgY2FwVmFsdWVzLnNvbWUoaGFzQnJvd3Nlck5hbWUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1R1cmJvU2NhbGUob3B0aW9uczogKEJyb3dzZXJzdGFja0NvbmZpZyAmIEJyb3dzZXJzdGFja09wdGlvbnMpIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4ob3B0aW9ucz8udHVyYm9TY2FsZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2VydmFiaWxpdHlQcm9kdWN0KG9wdGlvbnM6IChCcm93c2Vyc3RhY2tDb25maWcgJiBCcm93c2Vyc3RhY2tPcHRpb25zKSB8IHVuZGVmaW5lZCwgaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGlzQXBwQXV0b21hdGVcbiAgICAgICAgPyAnYXBwLWF1dG9tYXRlJ1xuICAgICAgICA6IChpc1R1cmJvU2NhbGUob3B0aW9ucykgPyAndHVyYm9zY2FsZScgOiAnYXV0b21hdGUnKVxufVxuXG50eXBlIFBvbGxpbmdSZXN1bHQgPSB7XG4gICAgZGF0YTogYW55O1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgbWVzc2FnZT86IHN0cmluZzsgLy8gT3B0aW9uYWwgbWVzc2FnZSBmb3IgdGltZW91dCBjYXNlc1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9sbEFwaShcbiAgICB1cmw6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICB1cHBlckxpbWl0OiBudW1iZXIsXG4gICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuKTogUHJvbWlzZTxQb2xsaW5nUmVzdWx0PiB7XG4gICAgcGFyYW1zLnRpbWVzdGFtcCA9IE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDEwMDApXG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBjdXJyZW50IHRpbWVzdGFtcCAke3BhcmFtcy50aW1lc3RhbXB9YClcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZUdldFJlcXVlc3QodXJsLCBwYXJhbXMsIGhlYWRlcnMpXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdQb2xsaW5nIHN1Y2NlZWRlZC4nLFxuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2UgJiYgZXJyb3IucmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRQb2xsVGltZSA9IHBhcnNlSW50KGVycm9yLnJlc3BvbnNlLmhlYWRlcnMuZ2V0KCduZXh0X3BvbGxfdGltZScpLCAxMCkgKiAxMDAwXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYHRpbWVJbk1pbGxpcyAke25leHRQb2xsVGltZX1gKVxuXG4gICAgICAgICAgICBpZiAoaXNOYU4obmV4dFBvbGxUaW1lKSkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdJbnZhbGlkIG9yIG1pc3NpbmcgYG5leHRQb2xsVGltZWAgaGVhZGVyLiBTdG9wcGluZyBwb2xsaW5nLicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGVycm9yLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIG5leHRQb2xsVGltZSBoZWFkZXIgdmFsdWUuIFBvbGxpbmcgc3RvcHBlZC4nLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZWxhcHNlZFRpbWUgPSBuZXh0UG9sbFRpbWUgLSBEYXRlLm5vdygpXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgYGVsYXBzZWRUaW1lICR7ZWxhcHNlZFRpbWV9IHRpbWVJbk1pbGxpcyAke25leHRQb2xsVGltZX0gdXBwZXJMaW1pdCAke3VwcGVyTGltaXR9YFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBpZiAobmV4dFBvbGxUaW1lID4gdXBwZXJMaW1pdCkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdQb2xsaW5nIHN0b3BwZWQgZHVlIHRvIHVwcGVyIHRpbWUgbGltaXQuJylcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogZXJyb3IucmVzcG9uc2UuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1BvbGxpbmcgc3RvcHBlZCBkdWUgdG8gdXBwZXIgdGltZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBQb2xsaW5nIGFnYWluIGluICR7ZWxhcHNlZFRpbWV9bXMgd2l0aCBwYXJhbXM6YCwgcGFyYW1zKVxuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZWxhcHNlZFRpbWUpKVxuICAgICAgICAgICAgcmV0dXJuIHBvbGxBcGkodXJsLCBwYXJhbXMsIGhlYWRlcnMsIHVwcGVyTGltaXQsIHN0YXJ0VGltZSlcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvci5yZXNwb25zZSkge1xuICAgICAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGVycm9yLnJlc3BvbnNlLnN0YXR1c1RleHRcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRXJyb3IgPSBKU09OLnBhcnNlKGVycm9yLnJlc3BvbnNlLmpzb24oKSlcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBwYXJzZWRFcnJvci5tZXNzYWdlXG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIHBhcnNpbmcgcG9sbEFwaSByZXF1ZXN0IGJvZHkgJHtlcnJvci5yZXNwb25zZS5ib2R5fWApXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ1Vua25vd24gZXJyb3InXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyB7XG4gICAgICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlLFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkOiAke2Vycm9yfWApXG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgaGVhZGVyczoge30sIG1lc3NhZ2U6ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLicgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBtYWtlR2V0UmVxdWVzdCh1cmw6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKVxuICAgIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaCgoa2V5KSA9PiB1cmxPYmouc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIHBhcmFtc1trZXldKSlcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsT2JqLnRvU3RyaW5nKCksIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgaGVhZGVycyxcbiAgICB9KVxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignUmVxdWVzdCBmYWlsZWQnKVxuICAgICAgICBlcnJvci5yZXNwb25zZSA9IHJlc3BvbnNlXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQWNjZXNzaWJpbGl0eVNjcmlwdDxSZXR1cm5UeXBlPihcbiAgICBicm93c2VyOiBhbnksXG4gICAgZm5Cb2R5OiBzdHJpbmcsXG4gICAgYXJnPzogdW5rbm93blxuKTogUHJvbWlzZTxSZXR1cm5UeXBlPiB7XG4gICAgcmV0dXJuIGJyb3dzZXIuZXhlY3V0ZShcbiAgICAgICAgYHJldHVybiAoZnVuY3Rpb24gKC4uLmJzdGFja1Nka0FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGJzdGFja1Nka0FyZ3NbMF07XG4gICAgICAgICAgICAgICAgYnN0YWNrU2RrQXJncy5wdXNoKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgICR7Zm5Cb2R5LnJlcGxhY2UoL2FyZ3VtZW50cy9nLCAnYnN0YWNrU2RrQXJncycpfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKCR7YXJnID8gSlNPTi5zdHJpbmdpZnkoYXJnKSA6ICcnfSlgXG4gICAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVIYXNoQ29kZUZyb21GaWVsZHMoZmllbGRzOiBBcnJheTxzdHJpbmcgfCBvYmplY3Q+KSB7XG4gICAgY29uc3Qgc2VyaWFsaXplID0gKHZhbHVlOiB7fSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgfVxuXG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IGZpZWxkcy5tYXAoc2VyaWFsaXplKS5qb2luKCd8JylcbiAgICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShzZXJpYWxpemVkKS5kaWdlc3QoJ2hleCcpXG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Qm9vbGVhblZhbHVlRnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIFsndHJ1ZSddLmluY2x1ZGVzKHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpKVxufVxuXG4vKipcbiAqIFNESy0zNzM3OiBDb2VyY2Ugc3RyaW5naWZpZWQgYm9vbGVhbnMgKCd0cnVlJy8nZmFsc2UnLCBhbnkgY2FzZSkgaW4gYSBmbGF0XG4gKiBvcHRpb25zIG9iamVjdCB0byByZWFsIGJvb2xlYW5zLCBsZWF2aW5nIGV2ZXJ5IG90aGVyIHZhbHVlIHVudG91Y2hlZC4gQm9vbGVhbi1cbiAqIHR5cGVkIGFjY2Vzc2liaWxpdHkgb3B0aW9ucyAoZS5nLiBhdXRvU2Nhbm5pbmcpIGFyZSBjb21tb25seSBzdXBwbGllZCBhc1xuICogc3RyaW5ncyBmcm9tIEpTIGNvbmZpZyAvIGVudjsgd2l0aG91dCBjb2VyY2lvbiB0aGV5IGZhaWwgVzNDIGNhcHMgdmFsaWRhdGlvblxuICogYW5kIGFyZSBzaWxlbnRseSBkcm9wcGVkLiBPbmx5IHRoZSBleGFjdCBzdHJpbmdzICd0cnVlJy8nZmFsc2UnIGFyZSBjb252ZXJ0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2VyY2VTdHJpbmdCb29sZWFuczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqXG4gICAgfVxuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGlzZWQgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgaWYgKG5vcm1hbGlzZWQgPT09ICd0cnVlJyB8fCBub3JtYWxpc2VkID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICAgICAgb3V0W2tleV0gPSBub3JtYWxpc2VkID09PSAndHJ1ZSdcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG91dFtrZXldID0gdmFsdWVcbiAgICB9XG4gICAgcmV0dXJuIG91dCBhcyBUXG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEga2V5IGlzIHNhZmUgdG8gdXNlIGZvciBvYmplY3QgcHJvcGVydHkgYXNzaWdubWVudCB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb25cbiAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIGNoZWNrXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgaXMgc2FmZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmZ1bmN0aW9uIGlzU2FmZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhbmdlcm91c0tleXMgPSBbJ19fcHJvdG9fXycsICdjb25zdHJ1Y3RvcicsICdwcm90b3R5cGUnXVxuICAgIHJldHVybiAhZGFuZ2Vyb3VzS2V5cy5pbmNsdWRlcyhrZXkpXG59XG5cbi8qKlxuICogVmFsaWRhdGUgYm9vbGVhbiB2YWx1ZSBmcm9tIG1peGVkIHR5cGVzIChib29sZWFuIG9yIHN0cmluZylcbiAqIE9ubHkgYWNjZXB0cyB0cnVlIGJvb2xlYW4gb3Igc3RyaW5nIFwidHJ1ZVwiIChjYXNlIGluc2Vuc2l0aXZlKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEVuYWJsZWRWYWx1ZSh2YWx1ZTogYm9vbGVhbiB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBnZXRCb29sZWFuVmFsdWVGcm9tU3RyaW5nKHZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVlcCh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLnNvdXJjZXM6IGFueVtdKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgaWYgKCFzb3VyY2VzLmxlbmd0aCkge3JldHVybiB0YXJnZXR9XG4gICAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpXG5cbiAgICBpZiAoaXNPYmplY3QodGFyZ2V0KSAmJiBpc09iamVjdChzb3VyY2UpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgLy8gU2tpcCBkYW5nZXJvdXMga2V5cyB0aGF0IGNvdWxkIGxlYWQgdG8gcHJvdG90eXBlIHBvbGx1dGlvblxuICAgICAgICAgICAgaWYgKCFpc1NhZmVLZXkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gc291cmNlW2tleV1cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFZhbHVlID0gdGFyZ2V0W2tleV1cblxuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHNvdXJjZVZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0VmFsdWUgfHwgIWlzT2JqZWN0KHRhcmdldFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1lcmdlRGVlcCh0YXJnZXRba2V5XSwgc291cmNlVmFsdWUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlVmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZURlZXAodGFyZ2V0LCAuLi5zb3VyY2VzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDaHJvbWVPcHRpb25zKGJhc2U6IENhcGFiaWxpdGllcy5DaHJvbWVPcHRpb25zLCBvdmVycmlkZTogUGFydGlhbDxDYXBhYmlsaXRpZXMuQ2hyb21lT3B0aW9ucz4pOiBDYXBhYmlsaXRpZXMuQ2hyb21lT3B0aW9ucyB7XG4gICAgY29uc3QgbWVyZ2VkOiBDYXBhYmlsaXRpZXMuQ2hyb21lT3B0aW9ucyA9IHsgLi4uYmFzZSB9XG5cbiAgICBpZiAob3ZlcnJpZGUuYXJncykge1xuICAgICAgICBtZXJnZWQuYXJncyA9IFsuLi4oYmFzZS5hcmdzIHx8IFtdKSwgLi4ub3ZlcnJpZGUuYXJnc11cbiAgICB9XG5cbiAgICBpZiAob3ZlcnJpZGUuZXh0ZW5zaW9ucykge1xuICAgICAgICBtZXJnZWQuZXh0ZW5zaW9ucyA9IFsuLi4oYmFzZS5leHRlbnNpb25zIHx8IFtdKSwgLi4ub3ZlcnJpZGUuZXh0ZW5zaW9uc11cbiAgICB9XG5cbiAgICBpZiAob3ZlcnJpZGUucHJlZnMpIHtcbiAgICAgICAgbWVyZ2VkLnByZWZzID0gbWVyZ2VEZWVwKHsgLi4uKGJhc2UucHJlZnMgfHwge30pIH0sIG92ZXJyaWRlLnByZWZzKVxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bGxPckVtcHR5KHN0cmluZzogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFzdHJpbmcgfHwgc3RyaW5nLnRyaW0oKSA9PT0gJydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSGFzaChlbnRpdHk6IGFueSkge1xuICAgIHJldHVybiBCb29sZWFuKGVudGl0eSAmJiB0eXBlb2YoZW50aXR5KSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZW50aXR5KSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5lc3RlZEtleVZhbHVlKGhhc2g6IGFueSwga2V5czogQXJyYXk8c3RyaW5nPikge1xuICAgIHJldHVybiBrZXlzLnJlZHVjZSgoaGFzaCwga2V5KSA9PiAoaXNIYXNoKGhhc2gpID8gaGFzaFtrZXldIDogdW5kZWZpbmVkKSwgaGFzaClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURpcihkaXI6IHN0cmluZykge1xuICAgIGNvbnN0IGxpc3QgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5qb2luKGRpciwgbGlzdFtpXSlcbiAgICAgICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZpbGVuYW1lKVxuXG4gICAgICAgIGlmIChmaWxlbmFtZSA9PT0gJy4nIHx8IGZpbGVuYW1lID09PSAnLi4nKSB7XG4gICAgICAgICAgICAvLyBwYXNzIHRoZXNlIGZpbGVzXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAvLyBybWRpciByZWN1cnNpdmVseVxuICAgICAgICAgICAgcmVtb3ZlRGlyKGZpbGVuYW1lKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcm0gZmlsZW5hbWVcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmMoZmlsZW5hbWUpXG4gICAgICAgIH1cbiAgICB9XG4gICAgZnMucm1kaXJTeW5jKGRpcilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpcihkaXI6IHN0cmluZykge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpcikpe1xuICAgICAgICByZW1vdmVEaXIoZGlyKVxuICAgIH1cbiAgICBmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXcml0YWJsZShkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICBmcy5hY2Nlc3NTeW5jKGRpclBhdGgsIGZzLmNvbnN0YW50cy5XX09LKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRSZWFkV3JpdGVBY2Nlc3MoZGlyUGF0aDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgZnMuY2htb2RTeW5jKGRpclBhdGgsIDBvNjY2KVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYERpcmVjdG9yeSAke2RpclBhdGh9IGlzIG5vdyByZWFkL3dyaXRlIGFjY2Vzc2libGUuYClcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBzZXQgZGlyZWN0b3J5IGFjY2VzczogJHtlcnIuc3RhY2t9YClcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2NoYVRlc3RIaWVyYXJjaHkodGVzdDogRnJhbWV3b3Jrcy5UZXN0KSB7XG4gICAgY29uc3QgdmFsdWU6IHN0cmluZ1tdID0gW11cbiAgICBpZiAodGVzdC5jdHggJiYgdGVzdC5jdHgudGVzdCkge1xuICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHBhcmVudCBvYmplY3QsIHV0aWxpemUgaXQgZWxzZSBnZXQgZnJvbSBjb250ZXh0XG4gICAgICAgIGxldCBwYXJlbnQgPSB0eXBlb2YgdGVzdC5wYXJlbnQgPT09ICdvYmplY3QnID8gdGVzdC5wYXJlbnQgOiB0ZXN0LmN0eC50ZXN0LnBhcmVudFxuICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC50aXRsZSAhPT0gJycpIHtcbiAgICAgICAgICAgIHZhbHVlLnB1c2gocGFyZW50LnRpdGxlKVxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudFxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0ZXN0LmRlc2NyaXB0aW9uICYmIHRlc3QuZnVsbE5hbWUpIHtcbiAgICAgICAgLy8gZm9yIEphc21pbmVcbiAgICAgICAgdmFsdWUucHVzaCh0ZXN0LmRlc2NyaXB0aW9uKVxuICAgICAgICAvLyBTdHJpcCB0aGUgdHJhaWxpbmcgXCIgPGRlc2NyaXB0aW9uPlwiIHN1ZmZpeCB3aXRob3V0IGJ1aWxkaW5nIGEgcmVnZXggZnJvbVxuICAgICAgICAvLyBhIHZhcmlhYmxlIChhdm9pZHMgUmVEb1MgYW5kIHJlZ2V4LW1ldGFjaGFyYWN0ZXIgbWlzbWF0Y2hlcyBpbiBkZXNjcmlwdGlvbnMpLlxuICAgICAgICBjb25zdCBkZXNjU3VmZml4ID0gYCAke3Rlc3QuZGVzY3JpcHRpb259YFxuICAgICAgICB2YWx1ZS5wdXNoKHRlc3QuZnVsbE5hbWUuZW5kc1dpdGgoZGVzY1N1ZmZpeCkgPyB0ZXN0LmZ1bGxOYW1lLnNsaWNlKDAsIC1kZXNjU3VmZml4Lmxlbmd0aCkgOiB0ZXN0LmZ1bGxOYW1lKVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWUucmV2ZXJzZSgpXG59XG5cbi8qKlxuICogVHJ1ZSBvbmx5IGZvciB0aGUgaHViLWludGVycHJldGVkIGBicm93c2Vyc3RhY2tfZXhlY3V0b3I6IHtcdTIwMjZ9YCBtYWdpYyBzdHJpbmcuXG4gKiBBbmNob3JlZCB0byB0aGUgc3RhcnQgKGxlYWRpbmcgd2hpdGVzcGFjZSB0b2xlcmF0ZWQpIGFuZCBjYXNlLXNlbnNpdGl2ZSwgbWF0Y2hpbmdcbiAqIGhvdyB0aGUgaHViIHJlYWRzIHRoZSBwYXlsb2FkIFx1MjAxNCBhIHBsYWluIHNjcmlwdCBtZXJlbHkgbWVudGlvbmluZyB0aGUgdG9rZW4gbXVzdCBub3RcbiAqIGJlIHJlcm91dGVkIG9mZiBpdHMgbm9ybWFsIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQnJvd3NlcnN0YWNrRXhlY3V0b3JTY3JpcHQgPSAoc2NyaXB0OiB1bmtub3duKTogc2NyaXB0IGlzIHN0cmluZyA9PlxuICAgIHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC50cmltU3RhcnQoKS5zdGFydHNXaXRoKCdicm93c2Vyc3RhY2tfZXhlY3V0b3I6JylcblxuZXhwb3J0IGNvbnN0IHBlcmZvcm1PMTF5U3luYyA9IGFzeW5jIChicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyKSA9PiB7XG4gICAgaWYgKGlzQnJvd3NlcnN0YWNrU2Vzc2lvbihicm93c2VyKSkge1xuICAgICAgICBhd2FpdCBicm93c2VyLmV4ZWN1dGUoYGJyb3dzZXJzdGFja19leGVjdXRvcjogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBhY3Rpb246ICdhbm5vdGF0ZScsXG4gICAgICAgICAgICBhcmd1bWVudHM6IHtcbiAgICAgICAgICAgICAgICBkYXRhOiBgT2JzZXJ2YWJpbGl0eVN5bmM6JHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdkZWJ1ZydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSl9YClcbiAgICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjYXBhYmlsaXRpZXMgcmVwcmVzZW50IGEgbXVsdGlyZW1vdGUgY29uZmlndXJhdGlvblxuICogQHBhcmFtIGNhcGFiaWxpdGllcyAtIFRoZSBjYXBhYmlsaXRpZXMgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHRydWUgaWYgY2FwYWJpbGl0aWVzIHJlcHJlc2VudCBhbnkgbXVsdGlyZW1vdGUgY29uZmlndXJhdGlvbiAocmVndWxhciBvciBwYXJhbGxlbClcbiAqXG4gKiBAZXhhbXBsZVxuICogUmVndWxhciBtdWx0aXJlbW90ZSAob2JqZWN0KTpcbiAqIHsgYnJvd3NlckE6IHsgY2FwYWJpbGl0aWVzOiB7Li4ufSB9LCBicm93c2VyQjogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0gfVxuICpcbiAqIFBhcmFsbGVsIG11bHRpcmVtb3RlIChhcnJheSB3aXRoIG5lc3RlZCBzdHJ1Y3R1cmUpOlxuICogW3sgYnJvd3NlckE6IHsgY2FwYWJpbGl0aWVzOiB7Li4ufSB9LCBicm93c2VyQjogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0gfV1cbiAqXG4gKiBSZWd1bGFyIGNhcGFiaWxpdGllcyAoYXJyYXkpOlxuICogW3sgYnJvd3Nlck5hbWU6ICdjaHJvbWUnLCAuLi4gfV1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlSZW1vdGVDYXBzKGNhcGFiaWxpdGllczogQ2FwYWJpbGl0aWVzLlRlc3RydW5uZXJDYXBhYmlsaXRpZXMpOiBib29sZWFuIHtcbiAgICAvLyBSZWd1bGFyIG11bHRpcmVtb3RlIGlzIGFuIG9iamVjdCAobm90IGFycmF5KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShjYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gRW1wdHkgYXJyYXkgaXMgbm90IG11bHRpcmVtb3RlXG4gICAgaWYgKGNhcGFiaWxpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gUGFyYWxsZWwgbXVsdGlyZW1vdGUgaXMgYW4gYXJyYXkgd2l0aCBuZXN0ZWQgY2FwYWJpbGl0aWVzIHN0cnVjdHVyZVxuICAgIHJldHVybiBjYXBhYmlsaXRpZXMuZXZlcnkoY2FwID0+XG4gICAgICAgIE9iamVjdC52YWx1ZXMoY2FwKS5sZW5ndGggPiAwICYmXG4gICAgICAgIE9iamVjdC52YWx1ZXMoY2FwKS5ldmVyeShjID0+IGMgIT09IG51bGwgJiYgdHlwZW9mIGMgPT09ICdvYmplY3QnICYmIChjIGFzIHsgY2FwYWJpbGl0aWVzOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfSkuY2FwYWJpbGl0aWVzKVxuICAgIClcbn1cbiIsICJpbXBvcnQgVHJhbnNwb3J0IGZyb20gJ3dpbnN0b24tdHJhbnNwb3J0J1xuXG5jb25zdCBMT0dfTEVWRUxTID0ge1xuICAgIElORk86ICdJTkZPJywgRVJST1I6ICdFUlJPUicsIERFQlVHOiAnREVCVUcnLCBUUkFDRTogJ1RSQUNFJywgV0FSTjogJ1dBUk4nLFxufVxuXG5jbGFzcyBsb2dQYXRjaGVyIGV4dGVuZHMgVHJhbnNwb3J0IHtcbiAgICBsb2dUb1Rlc3RPcHMgPSAobGV2ZWwgPSBMT0dfTEVWRUxTLklORk8sIG1lc3NhZ2UgPSBbJyddIGFzIHVua25vd25bXSkgPT4ge1xuICAgICAgICAocHJvY2Vzcy5lbWl0IGFzIEZ1bmN0aW9uKShgYnM6YWRkTG9nOiR7cHJvY2Vzcy5waWR9YCwge1xuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICBsZXZlbDogbGV2ZWwudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBcIiR7bWVzc2FnZS5qb2luKCcsICcpfVwiYCxcbiAgICAgICAgICAgIGtpbmQ6ICdURVNUX0xPRycsXG4gICAgICAgICAgICBodHRwX3Jlc3BvbnNlOiB7fVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qIFBhdGNoaW5nIHRoaXMgd291bGQgc2hvdyB1c2VyIGFuIGV4dGVuZGVkIHRyYWNlIG9uIHRoZWlyIGNsaSAqL1xuICAgIHRyYWNlID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLlRSQUNFLCBtZXNzYWdlKVxuICAgIH1cblxuICAgIGRlYnVnID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLkRFQlVHLCBtZXNzYWdlKVxuICAgIH1cblxuICAgIGluZm8gPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuSU5GTywgbWVzc2FnZSlcbiAgICB9XG5cbiAgICB3YXJuID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLldBUk4sIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgZXJyb3IgPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuRVJST1IsIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgbG9nID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLklORk8sIG1lc3NhZ2UpXG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgbG9nUGF0Y2hlclxuIiwgImltcG9ydCB7IGNyZWF0ZU9iamVjdENzdldyaXRlciB9IGZyb20gJ2Nzdi13cml0ZXInXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBmc1Byb21pc2UgZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB0eXBlIHsgRW50cnlUeXBlIH0gZnJvbSAnbm9kZTpwZXJmX2hvb2tzJ1xuaW1wb3J0IHsgcGVyZm9ybWFuY2UsIFBlcmZvcm1hbmNlT2JzZXJ2ZXIgfSBmcm9tICdub2RlOnBlcmZfaG9va3MnXG5pbXBvcnQgdXRpbCBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgd29ya2VyIGZyb20gJ25vZGU6d29ya2VyX3RocmVhZHMnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgeyBhcmNoLCBob3N0bmFtZSwgcGxhdGZvcm0sIHR5cGUsIHZlcnNpb24gfSBmcm9tICdub2RlOm9zJ1xuXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi8uLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgeyBQRVJGX01FQVNVUkVNRU5UX0VOViB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuLi8uLi9jbGkvYXBpVXRpbHMuanMnXG5pbXBvcnQgeyBDTElVdGlscyB9IGZyb20gJy4uLy4uL2NsaS9jbGlVdGlscy5qcydcbmltcG9ydCB7IEVWRU5UUyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IGZldGNoV3JhcCBmcm9tICcuLi8uLi9mZXRjaFdyYXBwZXIuanMnXG5pbXBvcnQgdHlwZSB7IENzdldyaXRlciB9IGZyb20gJ2Nzdi13cml0ZXIvc3JjL2xpYi9jc3Ytd3JpdGVyLmpzJ1xuaW1wb3J0IHR5cGUgeyBPYmplY3RNYXAgfSBmcm9tICdjc3Ytd3JpdGVyL3NyYy9saWIvbGFuZy9vYmplY3QuanMnXG5pbXBvcnQgdHlwZSB7IEJyb3dzZXIgfSBmcm9tICd3ZWJkcml2ZXJpbydcblxuLy8gVGVsZW1ldHJ5IG11c3QgbmV2ZXIgdGhyb3cgaW50byBidXNpbmVzcyBsb2dpYy4gTm9kZSAxOCdzIHBlcmZfaG9va3MgcmVqZWN0c1xuLy8gbmVnYXRpdmUgdGltZXN0YW1wcyAoZS5nLiBwZXJmb3JtYW5jZS5ub3coKSB1bmRlciBmYWtlZCB0aW1lcnMsIG9yIGFueSBvdGhlclxuLy8gZWRnZSkgd2l0aCBFUlJfUEVSRk9STUFOQ0VfSU5WQUxJRF9USU1FU1RBTVA7IE5vZGUgMjArIHRvbGVyYXRlcyB0aGVtLiBXcmFwcGluZ1xuLy8gbWFyay9tZWFzdXJlIGtlZXBzIGFuIGluc3RydW1lbnRhdGlvbiBmYWlsdXJlIGZyb20gYnJlYWtpbmcgYSBjYWxsZXIncyBob29rXG4vLyAoZS5nLiBhIHNlcnZpY2UgYmVmb3JlKCkpLCBhbmQgaXMgYSBuby1vcCBvbiB0aGUgaGFwcHkgcGF0aC5cbmZ1bmN0aW9uIHNhZmVNYXJrKG1hcmtOYW1lOiBzdHJpbmcpIHtcbiAgICB0cnkgeyBwZXJmb3JtYW5jZS5tYXJrKG1hcmtOYW1lKSB9IGNhdGNoIHsgLyogaW5zdHJ1bWVudGF0aW9uIG11c3Qgbm90IHRocm93ICovIH1cbn1cbmZ1bmN0aW9uIHNhZmVNZWFzdXJlKG1lYXN1cmVOYW1lOiBzdHJpbmcsIHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nKSB7XG4gICAgdHJ5IHsgcGVyZm9ybWFuY2UubWVhc3VyZShtZWFzdXJlTmFtZSwgc3RhcnQsIGVuZCkgfSBjYXRjaCB7IC8qIGluc3RydW1lbnRhdGlvbiBtdXN0IG5vdCB0aHJvdyAqLyB9XG59XG5cbnR5cGUgUGVyZm9ybWFuY2VEZXRhaWxzID0ge1xuICAgIHN1Y2Nlc3M/OiB0cnVlLFxuICAgIGZhaWx1cmU/OiBzdHJpbmcsXG4gICAgdGVzdE5hbWU/OiBzdHJpbmcsXG4gICAgd29ya2VyPzogc3RyaW5nIHwgbnVtYmVyLFxuICAgIGNsaWVudFdvcmtlcklkPzogc3RyaW5nLFxuICAgIGNvbW1hbmQ/OiBzdHJpbmcsXG4gICAgaG9va1R5cGU/OiBzdHJpbmcsXG4gICAgcGxhdGZvcm0/OiBzdHJpbmcgfCBudW1iZXJcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVyZm9ybWFuY2VUZXN0ZXIge1xuICAgIHN0YXRpYyBfb2JzZXJ2ZXI6IFBlcmZvcm1hbmNlT2JzZXJ2ZXJcbiAgICBzdGF0aWMgX2NzdldyaXRlcjogQ3N2V3JpdGVyPE9iamVjdE1hcDx7fT4+XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2V2ZW50czogUGVyZm9ybWFuY2VFbnRyeVtdID0gW11cbiAgICBwcml2YXRlIHN0YXRpYyBfbWVhc3VyZWRFdmVudHM6IEFycmF5PFBlcmZvcm1hbmNlRW50cnkgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSBbXVxuICAgIHByaXZhdGUgc3RhdGljIF9oYXNTdG9wcGVkR2VuZXJhdGlvbiA9IGZhbHNlXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3N0b3BHZW5lcmF0ZUNhbGxDb3VudCA9IDBcbiAgICBzdGF0aWMgc3RhcnRlZCA9IGZhbHNlXG4gICAgc3RhdGljIGRldGFpbHM6IHsgW2tleTogc3RyaW5nXTogUGVyZm9ybWFuY2VEZXRhaWxzIH0gPSB7fVxuICAgIHN0YXRpYyBldmVudHNNYXA6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fVxuICAgIHN0YXRpYyBicm93c2VyPzogQnJvd3NlclxuICAgIHN0YXRpYyBzY2VuYXJpb1RoYXRSYW46IHN0cmluZ1tdXG4gICAgc3RhdGljIGpzb25SZXBvcnREaXJOYW1lID0gJ3BlcmZvcm1hbmNlLXJlcG9ydCdcbiAgICBzdGF0aWMganNvblJlcG9ydERpclBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnLCB0aGlzLmpzb25SZXBvcnREaXJOYW1lKVxuICAgIHN0YXRpYyBqc29uUmVwb3J0RmlsZU5hbWUgPSBgJHt0aGlzLmpzb25SZXBvcnREaXJQYXRofS9wZXJmb3JtYW5jZS1yZXBvcnQtJHtQZXJmb3JtYW5jZVRlc3Rlci5nZXRQcm9jZXNzSWQoKX0uanNvbmBcblxuICAgIHN0YXRpYyBzdGFydE1vbml0b3JpbmcoY3N2TmFtZTogc3RyaW5nID0gJ3BlcmZvcm1hbmNlLXJlcG9ydC5jc3YnKSB7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHBlcmZvcm1hbmNlLXJlcG9ydCBkaXIgaWYgbm90IGV4aXN0cyBhbHJlYWR5XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmpzb25SZXBvcnREaXJQYXRoKSkge1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuanNvblJlcG9ydERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXIgPSBuZXcgUGVyZm9ybWFuY2VPYnNlcnZlcihsaXN0ID0+IHtcbiAgICAgICAgICAgIGxpc3QuZ2V0RW50cmllcygpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmVudHJ5VHlwZSA9PT0gJ21lYXN1cmUnKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsRW50cnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gZW50cnkudG9KU09OKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaW5hbEVudHJ5LnN0YXJ0VGltZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydFRpbWUgPSBmaW5hbEVudHJ5LnN0YXJ0VGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsRW50cnkuc3RhcnRUaW1lID0gcGVyZm9ybWFuY2UudGltZU9yaWdpbiArIGZpbmFsRW50cnkuc3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUaW1lc3RhbXAgY29udmVyc2lvbiBmb3IgJHtlbnRyeS5uYW1lfTogJHtvcmlnaW5hbFN0YXJ0VGltZX0gLT4gJHtmaW5hbEVudHJ5LnN0YXJ0VGltZX0gKHRpbWVPcmlnaW46ICR7cGVyZm9ybWFuY2UudGltZU9yaWdpbn0pYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBjb252ZXJ0aW5nIHN0YXJ0VGltZSB0byBlcG9jaDogJHt1dGlsLmZvcm1hdChlKX1gKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV0YWlsc1tlbnRyeS5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxFbnRyeSA9IE9iamVjdC5hc3NpZ24oZmluYWxFbnRyeSwgdGhpcy5kZXRhaWxzW2VudHJ5Lm5hbWVdKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRldGFpbHNbZW50cnkubmFtZV1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZWRFdmVudHMucHVzaChmaW5hbEVudHJ5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgICAgICBsaXN0LmdldEVudHJpZXMoKS5mb3JFYWNoKChlbnRyeSkgPT4gdGhpcy5fZXZlbnRzLnB1c2goZW50cnkpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBlbnRyeVR5cGVzOiBFbnRyeVR5cGVbXSA9IFsnbWVhc3VyZSddXG4gICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZXMucHVzaCgnZnVuY3Rpb24nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUoeyBidWZmZXJlZDogdHJ1ZSwgZW50cnlUeXBlczogZW50cnlUeXBlcyB9KVxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlXG4gICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgIHRoaXMuX2NzdldyaXRlciA9IGNyZWF0ZU9iamVjdENzdldyaXRlcih7XG4gICAgICAgICAgICAgICAgcGF0aDogY3N2TmFtZSxcbiAgICAgICAgICAgICAgICBoZWFkZXI6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBpZDogJ25hbWUnLCB0aXRsZTogJ0Z1bmN0aW9uIE5hbWUnIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6ICd0aW1lJywgdGl0bGU6ICdFeGVjdXRpb24gVGltZSAobXMpJyB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBjYWxjdWxhdGVUaW1lcyhtZXRob2RzOiBzdHJpbmdbXSkgOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0aW1lczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgICAgIHRoaXMuX2V2ZW50cy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRpbWVzW2VudHJ5Lm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgdGltZXNbZW50cnkubmFtZV0gPSAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lc1tlbnRyeS5uYW1lXSArPSBlbnRyeS5kdXJhdGlvblxuICAgICAgICB9KVxuICAgICAgICBjb25zdCB0aW1lVGFrZW4gPSBtZXRob2RzLnJlZHVjZSgoYSwgYykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRpbWVzW2NdICsgKGEgfHwgMClcbiAgICAgICAgfSwgMClcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUaW1lIGZvciAke21ldGhvZHN9IGlzICR7dGltZVRha2VufWApXG4gICAgICAgIHJldHVybiB0aW1lVGFrZW5cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgc3RvcEFuZEdlbmVyYXRlKGZpbGVuYW1lOiBzdHJpbmcgPSAncGVyZm9ybWFuY2Utb3duLmh0bWwnKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnRzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHRoaXMuX21lYXN1cmVkRXZlbnRzKVxuICAgICAgICAgICAgLy8gcmVtb3ZlIGVuY2xvc2luZyBhcnJheSBhbmQgYWRkIGEgdHJhaWxpbmcgY29tbWEgc28gdGhhdCB3ZVxuICAgICAgICAgICAgLy8gZG9udCBuZWVkIHRvIGJvdGggcmVhZCBhbmQgdGhlbiB3cml0ZSB0aGUgZmlsZSwgd2UgY2FuIHVzZSBhcHBlbmQgaW5zdGVhZFxuICAgICAgICAgICAgY29uc3QgZmluYWxKU09OU3RyID0gZXZlbnRzSnNvbi5zbGljZSgxLCAtMSkgKyAnLCdcbiAgICAgICAgICAgIGF3YWl0IGZzUHJvbWlzZS5hcHBlbmRGaWxlKHRoaXMuanNvblJlcG9ydEZpbGVOYW1lLCBmaW5hbEpTT05TdHIpXG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEZhaWxlZCB0byB3cml0ZSBldmVudHMgb2YgdGhlIHdvcmtlciB0byAke3RoaXMuanNvblJlcG9ydEZpbGVOYW1lfTogJHt1dGlsLmZvcm1hdChlcil9YClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KClcblxuICAgICAgICBpZiAoIXByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIENTViBhbmQgSFRNTCByZXBvcnRzIHVzaW5nIGRpcmVjdGx5IGNvbGxlY3RlZCBldmVudHNcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNTVih0aGlzLl9ldmVudHMpXG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2VuZXJhdGVSZXBvcnQodGhpcy5fZXZlbnRzKVxuICAgICAgICBjb25zdCBkaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgZmlsZW5hbWUpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmc1Byb21pc2Uud3JpdGVGaWxlKGRpciwgY29udGVudClcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGBQZXJmb3JtYW5jZSByZXBvcnQgaXMgYXQgJHtwYXRofWApXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiB3cml0aW5nIGh0bWwgJHt1dGlsLmZvcm1hdChlcnIpfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2VuZXJhdGVSZXBvcnQoZW50cmllczogUGVyZm9ybWFuY2VFbnRyeVtdKSB7XG4gICAgICAgIGxldCBodG1sID0gJzwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPjx0aXRsZT5QZXJmb3JtYW5jZSBSZXBvcnQ8L3RpdGxlPjwvaGVhZD48Ym9keT4nXG4gICAgICAgIGh0bWwgKz0gJzxoMT5QZXJmb3JtYW5jZSBSZXBvcnQ8L2gxPidcbiAgICAgICAgaHRtbCArPSAnPHRhYmxlPjx0aGVhZD48dHI+PHRoPkZ1bmN0aW9uIE5hbWU8L3RoPjx0aD5EdXJhdGlvbiAobXMpPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PidcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaHRtbCArPSBgPHRyPjx0ZD4ke2VudHJ5Lm5hbWV9PC90ZD48dGQ+JHtlbnRyeS5kdXJhdGlvbn08L3RkPjwvdHI+YFxuICAgICAgICB9KVxuICAgICAgICBodG1sICs9ICc8L3Rib2R5PjwvdGFibGU+PC9ib2R5PjwvaHRtbD4nXG4gICAgICAgIHJldHVybiBodG1sXG4gICAgfVxuXG4gICAgc3RhdGljIGdlbmVyYXRlQ1NWKGVudHJpZXM6IFBlcmZvcm1hbmNlRW50cnlbXSkge1xuICAgICAgICBjb25zdCB0aW1lczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgICAgIGVudHJpZXMubWFwKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aW1lc1tlbnRyeS5uYW1lXSkge1xuICAgICAgICAgICAgICAgIHRpbWVzW2VudHJ5Lm5hbWVdID0gMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGltZXNbZW50cnkubmFtZV0gKz0gZW50cnkuZHVyYXRpb25cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICAgICAgICAgIHRpbWU6IGVudHJ5LmR1cmF0aW9uXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGRhdCA9IE9iamVjdC5lbnRyaWVzKHRpbWVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgdGltZTogdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5fY3N2V3JpdGVyLndyaXRlUmVjb3JkcyhkYXQpXG4gICAgICAgICAgICAudGhlbigoKSA9PiBCU3RhY2tMb2dnZXIuaW5mbygnUGVyZm9ybWFuY2UgQ1NWIHJlcG9ydCBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5JykpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihlcnJvcikpXG4gICAgfVxuXG4gICAgc3RhdGljIE1lYXN1cmUobGFiZWw6IHN0cmluZywgZGV0YWlsczogUGVyZm9ybWFuY2VEZXRhaWxzID0ge30pIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgICAgICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgICAgICAgICBkZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxGdW5jdGlvbj4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kOiBGdW5jdGlvbnx1bmRlZmluZWQgPSBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiguLi5hcmdzOiBvYmplY3RbXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZS5hcHBseShzZWxmLCBbbGFiZWwsIG9yaWdpbmFsTWV0aG9kIGFzIEZ1bmN0aW9uLCB7IG1ldGhvZE5hbWU6IGtleS50b1N0cmluZygpLCAuLi5kZXRhaWxzIH0sIGFyZ3MsIHRoaXNdKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBtZWFzdXJlV3JhcHBlcihuYW1lOiBzdHJpbmcsIGZuOiBGdW5jdGlvbiwgZGV0YWlsczogUGVyZm9ybWFuY2VEZXRhaWxzID0ge30pIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcblxuICAgICAgICBkZXRhaWxzLndvcmtlciA9IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpXG4gICAgICAgIGRldGFpbHMudGVzdE5hbWUgPSBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4gJiYgUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuW1BlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbi5sZW5ndGggLSAxXVxuICAgICAgICBkZXRhaWxzLnBsYXRmb3JtID0gUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkXG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzOiAob2JqZWN0fGJvb2xlYW58dW5kZWZpbmVkfG51bGx8c3RyaW5nKVtdKSB7XG5cbiAgICAgICAgICAgIHJldHVybiBzZWxmLm1lYXN1cmUobmFtZSwgZm4sIGRldGFpbHMsIGFyZ3MpXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHN0YXRpYyBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19TREtfSU5TVFJVTUVOVEFUSU9OID09PSAnZmFsc2UnKVxuICAgIH1cblxuICAgIHN0YXRpYyBtZWFzdXJlKGxhYmVsOiBzdHJpbmcsIGZuOiBGdW5jdGlvbiwgZGV0YWlscyA9IHt9LCBhcmdzPzogKG9iamVjdHxib29sZWFufHVuZGVmaW5lZHxudWxsfHN0cmluZylbXSwgdGhpc0FyZzogb2JqZWN0fG51bGwgPSBudWxsKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkIHx8ICF0aGlzLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIHVuaXF1ZSBtYXJrIG5hbWVzIGZvciB0aGlzIHNwZWNpZmljIGNhbGwgdG8gYXZvaWQgdGltaW5nIGNvbmZsaWN0c1xuICAgICAgICBjb25zdCB1bmlxdWVJZCA9IGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpfWBcbiAgICAgICAgY29uc3Qgc3RhcnRNYXJrID0gYCR7bGFiZWx9LXN0YXJ0LSR7dW5pcXVlSWR9YFxuICAgICAgICBjb25zdCBlbmRNYXJrID0gYCR7bGFiZWx9LWVuZC0ke3VuaXF1ZUlkfWBcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIHN0YXJ0IG1hcmsgd2l0aCB1bmlxdWUgSURcbiAgICAgICAgc2FmZU1hcmsoc3RhcnRNYXJrKVxuXG4gICAgICAgIC8vIFN0b3JlIGRldGFpbHMgd2l0aCBtZWFzdXJlbWVudCBjb250ZXh0XG4gICAgICAgIGNvbnN0IGRldGFpbHNXaXRoQ29udGV4dCA9IHtcbiAgICAgICAgICAgIC4uLmRldGFpbHMsXG4gICAgICAgICAgICBtZWFzdXJlbWVudElkOiB1bmlxdWVJZFxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbCA9IGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpXG5cbiAgICAgICAgICAgIGlmIChyZXR1cm5WYWwgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugc3BlY2lmaWMgbWFya3MgZm9yIHRoaXMgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVNYXJrKGVuZE1hcmspXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWlsc1tsYWJlbF0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZTogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50V29ya2VySWQ6IFBlcmZvcm1hbmNlVGVzdGVyLmdldENsaWVudFdvcmtlcklkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3ROYW1lOiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4/LnBvcCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZGV0YWlsc1dpdGhDb250ZXh0KSwgdGhpcy5kZXRhaWxzW2xhYmVsXSB8fCB7fSkpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHYpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlTWFyayhlbmRNYXJrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVNZWFzdXJlKGxhYmVsLCBzdGFydE1hcmssIGVuZE1hcmspXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldGFpbHNbbGFiZWxdID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlOiB1dGlsLmZvcm1hdChlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFdvcmtlcklkOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRDbGllbnRXb3JrZXJJZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybTogUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TmFtZTogUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuPy5wb3AoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN5bmNocm9ub3VzIGV4ZWN1dGlvblxuICAgICAgICAgICAgc2FmZU1hcmsoZW5kTWFyaylcbiAgICAgICAgICAgIHNhZmVNZWFzdXJlKGxhYmVsLCBzdGFydE1hcmssIGVuZE1hcmspXG5cbiAgICAgICAgICAgIHRoaXMuZGV0YWlsc1tsYWJlbF0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGZhaWx1cmU6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbj8ucG9wKClcbiAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsXG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBzYWZlTWFyayhlbmRNYXJrKVxuICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgdGhpcy5kZXRhaWxzW2xhYmVsXSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWx1cmU6IHV0aWwuZm9ybWF0KGVyKVxuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbj8ucG9wKClcbiAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICB0aHJvdyBlclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHN0YXJ0KGV2ZW50OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmluYWxFdmVudCA9IGV2ZW50ICsgJy1zdGFydCdcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRzTWFwW2ZpbmFsRXZlbnRdKSB7cmV0dXJufVxuICAgICAgICBzYWZlTWFyayhmaW5hbEV2ZW50KVxuICAgICAgICB0aGlzLmV2ZW50c01hcFtmaW5hbEV2ZW50XSA9IDFcbiAgICB9XG5cbiAgICBzdGF0aWMgZW5kKGV2ZW50OiBzdHJpbmcsIHN1Y2Nlc3MgPSB0cnVlLCBmYWlsdXJlPzogc3RyaW5nIHwgdW5rbm93biwgZGV0YWlscyA9IHt9KSB7XG4gICAgICAgIHNhZmVNYXJrKGV2ZW50ICsgJy1lbmQnKVxuICAgICAgICBzYWZlTWVhc3VyZShldmVudCwgZXZlbnQgKyAnLXN0YXJ0JywgZXZlbnQgKyAnLWVuZCcpXG4gICAgICAgIC8vIENsZWFyIHRoZSBzdGFydC1tYXJrIGd1YXJkIHNvIGEgc3Vic2VxdWVudCBzdGFydChldmVudCkgZm9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGV2ZW50IGFjdHVhbGx5IG1hcmtzIGEgbmV3IHN0YXJ0LiBXaXRob3V0IHRoaXMsIHN0YXJ0KCkgc2hvcnQtY2lyY3VpdHNcbiAgICAgICAgLy8gYW5kIHRoZSBuZXh0IGVuZCgpIG1lYXN1cmVzIGZyb20gdGhlIG9yaWdpbmFsIHN0YXJ0IG1hcmsgXHUyMDE0IGluZmxhdGVkXG4gICAgICAgIC8vIGR1cmF0aW9ucyBpbiB0ZWxlbWV0cnkgb24gZXZlcnkgY2FsbCBhZnRlciB0aGUgZmlyc3QuXG4gICAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50c01hcFtldmVudCArICctc3RhcnQnXVxuICAgICAgICB0aGlzLmRldGFpbHNbZXZlbnRdID0gT2JqZWN0LmFzc2lnbih7IHN1Y2Nlc3MsIGZhaWx1cmU6IHV0aWwuZm9ybWF0KGZhaWx1cmUpIH0sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICBwbGF0Zm9ybTogUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkLFxuICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbiAmJiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW5bUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuLmxlbmd0aCAtIDFdXG4gICAgICAgIH0sIGRldGFpbHMpLCB0aGlzLmRldGFpbHNbZXZlbnRdIHx8IHt9KSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY2xpZW50IHdvcmtlciBJRCBpbiBmb3JtYXQgXCJ0aHJlYWRJZC1wcm9jZXNzSWRcIi5cbiAgICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgaWRlbnRpZmllciBhY3Jvc3MgdGhlIFNESyBmb3IgdHJhY2tpbmdcbiAgICAgKiB3b3JrZXItc3BlY2lmaWMgZXZlbnRzIGFuZCBwZXJmb3JtYW5jZSBtZXRyaWNzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV29ya2VyIElEIHN0cmluZyBpbiBmb3JtYXQgXCJ0aHJlYWRJZC1wcm9jZXNzSWRcIlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDbGllbnRXb3JrZXJJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gQ0xJVXRpbHMuZ2V0Q2xpZW50V29ya2VySWQoKVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRQcm9jZXNzSWQoKSB7XG4gICAgICAgIHJldHVybiBgJHtwcm9jZXNzLnBpZH0tJHt3b3JrZXIudGhyZWFkSWR9YFxuICAgIH1cblxuICAgIHN0YXRpYyBzbGVlcCA9IChtcyA9IDEwMCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuXG4gICAgc3RhdGljIGFzeW5jIHVwbG9hZEV2ZW50c0RhdGEoKSB7XG4gICAgICAgIC8vIFRyYWNrIG92ZXJhbGwga2V5IG1ldHJpY3Mgb3BlcmF0aW9uXG4gICAgICAgIHRoaXMuc3RhcnQoRVZFTlRTLlNES19TRU5EX0tFWV9NRVRSSUNTKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJJZCA9IGAke3Byb2Nlc3MucGlkfWBcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gU3RhcnRpbmcgdXBsb2FkIGZvciB3b3JrZXIgJHt3b3JrZXJJZH1gKVxuXG4gICAgICAgICAgICAvLyBUcmFjayBwcmVwYXJhdGlvbiBwaGFzZSAoY29sbGVjdGlvbiBhbmQgZGVkdXBsaWNhdGlvbilcbiAgICAgICAgICAgIHRoaXMuc3RhcnQoRVZFTlRTLlNES19LRVlfTUVUUklDU19QUkVQQVJBVElPTilcblxuICAgICAgICAgICAgLy8gQ29sbGVjdCBhbGwgbWVhc3VyZXMgZnJvbSBwZXJmb3JtYW5jZSByZXBvcnQgZmlsZXMgYW5kIGluLW1lbW9yeSBldmVudHNcbiAgICAgICAgICAgIGxldCBtZWFzdXJlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdXG4gICAgICAgICAgICBpZiAoYXdhaXQgZnNQcm9taXNlLmFjY2Vzcyh0aGlzLmpzb25SZXBvcnREaXJQYXRoKS50aGVuKCgpID0+IHRydWUpLmNhdGNoKCgpID0+IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gKGF3YWl0IGZzUHJvbWlzZS5yZWFkZGlyKHRoaXMuanNvblJlcG9ydERpclBhdGgpKS5tYXAoZmlsZSA9PiBwYXRoLnJlc29sdmUodGhpcy5qc29uUmVwb3J0RGlyUGF0aCwgZmlsZSkpXG4gICAgICAgICAgICAgICAgbWVhc3VyZXMgPSAoYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXMubWFwKChmaWxlKSA9PiBmc1Byb21pc2UucmVhZEZpbGUoZmlsZSwgJ3V0Zi04JykpKSkubWFwKGVsID0+IGBbJHtlbC5zbGljZSgwLCAtMSl9XWApLm1hcChlbCA9PiBKU09OLnBhcnNlKGVsKSkuZmxhdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIFRvdGFsIGV2ZW50cyBmcm9tIGZpbGVzOiAke21lYXN1cmVzLmxlbmd0aH1gKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fbWVhc3VyZWRFdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gQWRkaW5nICR7dGhpcy5fbWVhc3VyZWRFdmVudHMubGVuZ3RofSBpbi1tZW1vcnkgZXZlbnRzYClcbiAgICAgICAgICAgICAgICBtZWFzdXJlcyA9IG1lYXN1cmVzLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZWRFdmVudHMubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBQZXJmb3JtYW5jZUVudHJ5IHRvIHBsYWluIG9iamVjdCBpZiBpdCBoYXMgdG9KU09OXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChlIGFzIFBlcmZvcm1hbmNlRW50cnkpLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSBhcyBQZXJmb3JtYW5jZUVudHJ5KS50b0pTT04oKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbnN1cmVFcG9jaFRpbWVzID0gKGFycjogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICAgICAgICAgICAgICBjb25zdCBjdXRvZmYgPSAxZTEyIC8vIH55ZWFyIDIwMDEsIG1zIGVwb2NoXG4gICAgICAgICAgICAgICAgY29uc3QgdGltZU9yaWdpbiA9IChcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UudGltZU9yaWdpbiA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgID8gcGVyZm9ybWFuY2UudGltZU9yaWdpblxuICAgICAgICAgICAgICAgICAgICA6IChub3cgLSBwcm9jZXNzLnVwdGltZSgpICogMTAwMClcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyLm1hcChlbnRyeSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkuc3RhcnRUaW1lID09PSAnbnVtYmVyJyAmJiBlbnRyeS5zdGFydFRpbWUgPCBjdXRvZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0VGltZSA9IHRpbWVPcmlnaW4gKyBlbnRyeS5zdGFydFRpbWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWVhc3VyZXMgPSBlbnN1cmVFcG9jaFRpbWVzKG1lYXN1cmVzKVxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcbiAgICAgICAgICAgIC8vIHl5eXktTU0tZGQnVCdISDptbTpzcy5TU1NTU1MgWlxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdGltZVpvbmU6ICdVVEMnLFxuICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIGRheTogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBmcmFjdGlvbmFsU2Vjb25kRGlnaXRzOiAzLCAvLyBUbyBpbmNsdWRlIG1pY3Jvc2Vjb25kc1xuICAgICAgICAgICAgICAgIGhvdXIxMjogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZvcm1hdCB0aGUgZGF0ZSBhbmQgcmVwbGFjZSB0aGUgZGVmYXVsdCBzZXBhcmF0b3IgZm9yIHRpbWUgem9uZVxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbi1HQicsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgLmZvcm1hdFRvUGFydHMoZGF0ZSlcbiAgICAgICAgICAgICAgICAubWFwKCh7IHR5cGUsIHZhbHVlIH0pID0+IHR5cGUgPT09ICd0aW1lWm9uZU5hbWUnID8gJ1onIDogdmFsdWUpXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJywnLCAnVCcpXG5cbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfS0VZX01FVFJJQ1NfUFJFUEFSQVRJT04sIHRydWUpXG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdzZGtfZXZlbnRzJyxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RodWJfdXVpZDogcHJvY2Vzcy5lbnYuUEVSRl9URVNUSFVCX1VVSUQgfHwgcHJvY2Vzcy5lbnYuU0RLX1JVTl9JRCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZF9kYXk6IGZvcm1hdHRlZERhdGUsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X25hbWU6ICdTREtGZWF0dXJlUGVyZm9ybWFuY2UnLFxuICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGE6IHByb2Nlc3MuZW52LlBFUkZfVVNFUl9OQU1FLFxuICAgICAgICAgICAgICAgICAgICBob3N0X2luZm86IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lOiBob3N0bmFtZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm06IHBsYXRmb3JtKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmNoOiBhcmNoKClcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X2pzb246IHsgbWVhc3VyZXM6IG1lYXN1cmVzLCBzZGtSdW5JZDogcHJvY2Vzcy5lbnYuU0RLX1JVTl9JRCB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hXcmFwKGAke0FQSVV0aWxzLkVEU19VUkx9L3NlbmRfc2RrX2V2ZW50c2AsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIFN1Y2Nlc3NmdWxseSB1cGxvYWRlZCB0byBFRFM6ICR7dXRpbC5mb3JtYXQoYXdhaXQgcmVzdWx0LnRleHQoKSl9YClcblxuICAgICAgICAgICAgdGhpcy5lbmQoRVZFTlRTLlNES19TRU5EX0tFWV9NRVRSSUNTLCB0cnVlKVxuICAgICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbUGVyZm9ybWFuY2UgVXBsb2FkXSBGYWlsZWQgdG8gdXBsb2FkIGV2ZW50czogJHt1dGlsLmZvcm1hdChlcil9YClcbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfS0VZX01FVFJJQ1NfUFJFUEFSQVRJT04sIGZhbHNlLCBlcilcbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfU0VORF9LRVlfTUVUUklDUywgZmFsc2UsIGVyKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhd2FpdCBmc1Byb21pc2UuYWNjZXNzKHRoaXMuanNvblJlcG9ydERpclBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSwgKCkgPT4gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmc1Byb21pc2UucmVhZGRpcih0aGlzLmpzb25SZXBvcnREaXJQYXRoKVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzUHJvbWlzZS51bmxpbmsocGF0aC5qb2luKHRoaXMuanNvblJlcG9ydERpclBhdGgsIGZpbGUpKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gQ2xlYW5lZCB1cCAke2ZpbGVzLmxlbmd0aH0gdGVtcG9yYXJ5IHJlcG9ydCBmaWxlc2ApXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIEZhaWxlZCB0byBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzOiAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQgbG9nZ2VyIGZyb20gJ0B3ZGlvL2xvZ2dlcidcblxuaW1wb3J0IHsgTE9HU19GSUxFIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tICcuL3V0aWwuanMnXG5cbmNvbnN0IGxvZyA9IGxvZ2dlcignQHdkaW8vYnJvd3NlcnN0YWNrLXNlcnZpY2UnKVxuXG5leHBvcnQgY2xhc3MgQlN0YWNrTG9nZ2VyIHtcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZpbGVQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIExPR1NfRklMRSlcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZvbGRlclBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnKVxuICAgIHByaXZhdGUgc3RhdGljIGxvZ0ZpbGVTdHJlYW06IGZzLldyaXRlU3RyZWFtIHwgbnVsbFxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVkYWN0Q3JlZGVudGlhbHMobG9nTWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGxvZ01lc3NhZ2VcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oW1wiJ10/KD86dXNlcm5hbWV8dXNlck5hbWV8YWNjZXNza2V5fGFjY2Vzc0tleXx1c2VyfGtleSlbXCInXT9cXHMqWzo9XVxccypbXCInXT8pKFteXCInXFxzLH1dKykvZ2ksICckMScpXG4gICAgICAgICAgICAucmVwbGFjZSgvKFs/Jl0oPzp1c2VybmFtZXx1c2VyTmFtZXxhY2Nlc3Nfa2V5fGFjY2Vzc2tleXxhY2Nlc3NLZXl8dXNlcnxrZXkpPSkoW14mI1xcc10rKS9naSwgJyQxJylcbiAgICB9XG5cbiAgICBzdGF0aWMgbG9nVG9GaWxlKGxvZ01lc3NhZ2U6IHN0cmluZywgbG9nTGV2ZWw6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhsb2dNZXNzYWdlKVxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvZ0ZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuc3VyZUxvZ3NGb2xkZXIoKVxuICAgICAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRoaXMubG9nRmlsZVBhdGgsIHsgZmxhZ3M6ICdhJyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubG9nRmlsZVN0cmVhbSAmJiB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGUodGhpcy5mb3JtYXRMb2cocmVkYWN0ZWRNZXNzYWdlLCBsb2dMZXZlbCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYEZhaWxlZCB0byBsb2cgdG8gZmlsZS4gRXJyb3IgJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZm9ybWF0TG9nKGxvZ01lc3NhZ2U6IHN0cmluZywgbGV2ZWw6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYCR7Y2hhbGsuZ3JheShuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpfSAke2NoYWxrW0NPTE9SU1tsZXZlbF1dKGxldmVsLnRvVXBwZXJDYXNlKCkpfSAke2NoYWxrLndoaXRlQnJpZ2h0KCdAd2Rpby9icm93c2Vyc3RhY2stc2VydmljZScpfSAke2xvZ01lc3NhZ2V9XFxuYFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICdpbmZvJylcbiAgICAgICAgbG9nLmluZm8ocmVkYWN0ZWRNZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHJlZGFjdGVkTWVzc2FnZSA9IHRoaXMucmVkYWN0Q3JlZGVudGlhbHMobWVzc2FnZSlcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUocmVkYWN0ZWRNZXNzYWdlLCAnZXJyb3InKVxuICAgICAgICBsb2cuZXJyb3IocmVkYWN0ZWRNZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBwYXJhbT86IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICdkZWJ1ZycpXG4gICAgICAgIGlmIChwYXJhbSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKHJlZGFjdGVkTWVzc2FnZSwgcGFyYW0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cuZGVidWcocmVkYWN0ZWRNZXNzYWdlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubG9nVG9GaWxlKHJlZGFjdGVkTWVzc2FnZSwgJ3dhcm4nKVxuICAgICAgICBsb2cud2FybihyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0cmFjZShtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICd0cmFjZScpXG4gICAgICAgIGxvZy50cmFjZShyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhaW4gd2hhdGV2ZXIgaXMgc3RpbGwgc2l0dGluZyBpbiB0aGUgbG9nIHN0cmVhbSdzIGJ1ZmZlciBvbnRvIGRpc2suXG4gICAgICpcbiAgICAgKiBgbG9nVG9GaWxlYCB3cml0ZXMgdG8gYW4gYXN5bmMgYGZzLldyaXRlU3RyZWFtYCwgc28gYSBsaW5lIGxvZ2dlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlXG4gICAgICogYXJjaGl2ZSBpcyBidWlsdCBpcyB2ZXJ5IGxpa2VseSBOT1QgaW4gdGhlIGZpbGUgeWV0IFx1MjAxNCB0aGUgc3RyZWFtJ3MgYG9wZW5gIGlzIGFzeW5jIHRvbyxcbiAgICAgKiBzbyBlYXJseSBvbiB0aGUgZmlsZSBtYXkgbm90IGV4aXN0IGF0IGFsbC4gQW55dGhpbmcgdGhhdCBzbmFwc2hvdHMgdGhlIGxvZyAodGhlIGRlYnVnLWxvZ1xuICAgICAqIHVwbG9hZCkgbXVzdCBmbHVzaCBmaXJzdCBvciBpdCBzaGlwcyBhIHRydW5jYXRlZCBjb3B5LlxuICAgICAqXG4gICAgICogQSB6ZXJvLWxlbmd0aCB3cml0ZSdzIGNhbGxiYWNrIGZpcmVzIG9ubHkgYWZ0ZXIgZXZlcnkgY2h1bmsgcXVldWVkIGFoZWFkIG9mIGl0IGhhcyBiZWVuXG4gICAgICogaGFuZGVkIHRvIHRoZSBmcyBsYXllciwgd2hpY2ggZHJhaW5zIHRoZSBidWZmZXIgd2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSBcdTIwMTQgdW5saWtlXG4gICAgICogYGNsZWFyTG9nZ2VyKClgLCBsb2dnaW5nIGNvbnRpbnVlcyB0byB3b3JrIGFmdGVyd2FyZHMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBmbHVzaExvZ0ZpbGUodGltZW91dE1zID0gMjAwMCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLmxvZ0ZpbGVTdHJlYW1cbiAgICAgICAgaWYgKCFzdHJlYW0gfHwgIXN0cmVhbS53cml0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgLy8gTmV2ZXIgbGV0IGEgc3R1Y2sgc3RyZWFtIGhvbGQgdXAgdGhlIHVwbG9hZDsgYSB0cnVuY2F0ZWQgbG9nIGJlYXRzIG5vIGxvZyBhdCBhbGwuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dE1zKVxuICAgICAgICAgICAgdGltZXIudW5yZWY/LigpXG4gICAgICAgICAgICBzdHJlYW0ud3JpdGUoJycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJMb2dnZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ0ZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbS5lbmQoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbSA9IG51bGxcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyTG9nRmlsZSgpIHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5sb2dGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIGZzLnRydW5jYXRlU3luYyh0aGlzLmxvZ0ZpbGVQYXRoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbnN1cmVMb2dzRm9sZGVyKCkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5sb2dGb2xkZXJQYXRoKSl7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5sb2dGb2xkZXJQYXRoKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgIntcbiAgXCJuYW1lXCI6IFwiQHdkaW8vYnJvd3NlcnN0YWNrLXNlcnZpY2VcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiOS4zNS4wXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJXZWJkcml2ZXJJTyBzZXJ2aWNlIGZvciBiZXR0ZXIgQnJvd3NlcnN0YWNrIGludGVncmF0aW9uXCIsXG4gIFwiYXV0aG9yXCI6IFwiQnJvd3NlclN0YWNrIDxzdXBwb3J0QGJyb3dzZXJzdGFjay5jb20+XCIsXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcnN0YWNrL3dkaW8tYnJvd3NlcnN0YWNrLXNlcnZpY2VcIixcbiAgXCJsaWNlbnNlXCI6IFwiTUlUXCIsXG4gIFwiZW5naW5lc1wiOiB7XG4gICAgXCJub2RlXCI6IFwiPj0xOC4yMC4wXCJcbiAgfSxcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcnN0YWNrL3dkaW8tYnJvd3NlcnN0YWNrLXNlcnZpY2UuZ2l0XCIsXG4gICAgXCJkaXJlY3RvcnlcIjogXCJwYWNrYWdlcy9icm93c2Vyc3RhY2stc2VydmljZVwiXG4gIH0sXG4gIFwia2V5d29yZHNcIjogW1xuICAgIFwid2ViZHJpdmVyaW9cIixcbiAgICBcIndkaW9cIixcbiAgICBcImJyb3dzZXJzdGFja1wiLFxuICAgIFwid2Rpby1zZXJ2aWNlXCJcbiAgXSxcbiAgXCJidWdzXCI6IHtcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9icm93c2Vyc3RhY2svd2Rpby1icm93c2Vyc3RhY2stc2VydmljZS9pc3N1ZXNcIlxuICB9LFxuICBcInR5cGVcIjogXCJtb2R1bGVcIixcbiAgXCJ0eXBlc1wiOiBcIi4vYnVpbGQvaW5kZXguZC50c1wiLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9idWlsZC9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vYnVpbGQvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2NsZWFudXBcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vYnVpbGQvY2xlYW51cC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vYnVpbGQvY2xlYW51cC5qc1wiLFxuICAgICAgXCJzb3VyY2VcIjogXCIuL3NyYy9jbGVhbnVwLnRzXCJcbiAgICB9XG4gIH0sXG4gIFwidHlwZVNjcmlwdFZlcnNpb25cIjogXCIzLjguM1wiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImJ1aWxkXCIsXG4gICAgXCJzcmMvcHJvdG8vKiovKi5wcm90b1wiLFxuICAgIFwiYnJvd3NlcnN0YWNrLXNlcnZpY2UuZC50c1wiLFxuICAgIFwiUkVBRE1FLm1kXCIsXG4gICAgXCJMSUNFTlNFXCJcbiAgXSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcImNsZWFuXCI6IFwicmltcmFmIC4vYnVpbGQgc3JjL2dycGMvZ2VuZXJhdGVkXCIsXG4gICAgXCJnZW5lcmF0ZVwiOiBcImJ1ZiBnZW5lcmF0ZVwiLFxuICAgIFwiYnVpbGRcIjogXCJyaW1yYWYgLi9idWlsZCBzcmMvZ3JwYy9nZW5lcmF0ZWQgJiYgYnVmIGdlbmVyYXRlICYmIG5vZGUgLi9zY3JpcHRzL2J1aWxkLm1qcyAmJiB0c2MgLXAgdHNjb25maWcucHJvZC5qc29uXCIsXG4gICAgXCJidWlsZDp3YXRjaFwiOiBcIm5vZGUgLi9zY3JpcHRzL2J1aWxkLm1qcyAtLXdhdGNoXCIsXG4gICAgXCJ0ZXN0XCI6IFwidml0ZXN0IC0tcnVuXCIsXG4gICAgXCJ0ZXN0OndhdGNoXCI6IFwidml0ZXN0XCIsXG4gICAgXCJwcmVwYWNrXCI6IFwibnBtIHJ1biBidWlsZFwiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBicm93c2Vyc3RhY2svYWktc2RrLW5vZGVcIjogXCIxLjUuMTdcIixcbiAgICBcIkBidWZidWlsZC9wcm90b2J1ZlwiOiBcIl4yLjUuMlwiLFxuICAgIFwiQGdycGMvZ3JwYy1qc1wiOiBcIn4xLjEzLjVcIixcbiAgICBcIkBwZXJjeS9hcHBpdW0tYXBwXCI6IFwiXjIuMC45XCIsXG4gICAgXCJAcGVyY3kvc2VsZW5pdW0td2ViZHJpdmVyXCI6IFwiXjIuMi4yXCIsXG4gICAgXCJAdHlwZXMvZ2l0Y29uZmlnbG9jYWxcIjogXCJeMi4wLjFcIixcbiAgICBcImJyb3dzZXJzdGFjay1sb2NhbFwiOiBcIl4xLjUuMVwiLFxuICAgIFwiY2hhbGtcIjogXCJeNS4zLjBcIixcbiAgICBcImNzdi13cml0ZXJcIjogXCJeMS42LjBcIixcbiAgICBcImdpdC1yZXBvLWluZm9cIjogXCJeMi4xLjFcIixcbiAgICBcImdpdGNvbmZpZ2xvY2FsXCI6IFwiXjIuMS4wXCIsXG4gICAgXCJnbG9iXCI6IFwiXjExLjAuMFwiLFxuICAgIFwidGFyXCI6IFwiXjcuNS4xMVwiLFxuICAgIFwidW5kaWNpXCI6IFwiXjYuMjQuMFwiLFxuICAgIFwidXVpZFwiOiBcIl4xMS4xLjBcIixcbiAgICBcIndpbnN0b24tdHJhbnNwb3J0XCI6IFwiXjQuNS4wXCIsXG4gICAgXCJ5YXV6bFwiOiBcIl4zLjQuMFwiLFxuICAgIFwiQHdkaW8vbG9nZ2VyXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby9yZXBvcnRlclwiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vdHlwZXNcIjogXCJeOS4wLjBcIixcbiAgICBcIndlYmRyaXZlcmlvXCI6IFwiXjkuMC4wXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB3ZGlvL2NsaVwiOiBcIl41LjAuMCB8fCBeNi4wLjAgfHwgXjcuMC4wIHx8IF44LjAuMCB8fCBeOS4wLjBcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYnVmYnVpbGQvYnVmXCI6IFwiXjEuNTUuMVwiLFxuICAgIFwiQGNoYW5nZXNldHMvY2xpXCI6IFwiXjIuMjcuOVwiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMjAuMS4wXCIsXG4gICAgXCJAdHlwZXMvdGFyXCI6IFwiXjcuMC44N1wiLFxuICAgIFwiQHR5cGVzL3lhdXpsXCI6IFwiXjIuMTAuM1wiLFxuICAgIFwiQHdkaW8vZ2xvYmFsc1wiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vbG9nZ2VyXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby9yZXBvcnRlclwiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vdHlwZXNcIjogXCJeOS4wLjBcIixcbiAgICBcImVzYnVpbGRcIjogXCJeMC4yNy4yXCIsXG4gICAgXCJyaW1yYWZcIjogXCJeNi4wLjFcIixcbiAgICBcInRzLXByb3RvXCI6IFwiXjIuNy41XCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuOC4zXCIsXG4gICAgXCJ2aXRlc3RcIjogXCJeMy4yLjRcIixcbiAgICBcIndlYmRyaXZlcmlvXCI6IFwiXjkuMC4wXCJcbiAgfSxcbiAgXCJwdWJsaXNoQ29uZmlnXCI6IHtcbiAgICBcImFjY2Vzc1wiOiBcInB1YmxpY1wiXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJyb3dzZXJzdGFja0NvbmZpZyB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgcGtnIGZyb20gJy4uL3BhY2thZ2UuanNvbicgd2l0aCB7IHR5cGU6ICdqc29uJyB9XG5cbmNvbnN0IGJzdGFja1NlcnZpY2VWZXJzaW9uID0gcGtnLnZlcnNpb25cblxuZXhwb3J0IGNvbnN0IEJST1dTRVJfREVTQ1JJUFRJT04gPSBbXG4gICAgJ2RldmljZScsXG4gICAgJ29zJyxcbiAgICAnb3NWZXJzaW9uJyxcbiAgICAnb3NfdmVyc2lvbicsXG4gICAgJ2Jyb3dzZXJOYW1lJyxcbiAgICAnYnJvd3NlcicsXG4gICAgJ2Jyb3dzZXJWZXJzaW9uJyxcbiAgICAnYnJvd3Nlcl92ZXJzaW9uJ1xuXSBhcyBjb25zdFxuXG5leHBvcnQgY29uc3QgVkFMSURfQVBQX0VYVEVOU0lPTiA9IFtcbiAgICAnLmFwaycsXG4gICAgJy5hYWInLFxuICAgICcuaXBhJ1xuXVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9PUFRJT05TOiBQYXJ0aWFsPEJyb3dzZXJzdGFja0NvbmZpZz4gPSB7XG4gICAgc2V0U2Vzc2lvbk5hbWU6IHRydWUsXG4gICAgc2V0U2Vzc2lvblN0YXR1czogdHJ1ZSxcbiAgICB0ZXN0T2JzZXJ2YWJpbGl0eTogdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgY29uc29sZUhvbGRlcjogdHlwZW9mIGNvbnNvbGUgPSBPYmplY3QuYXNzaWduKHt9LCBjb25zb2xlKVxuXG5leHBvcnQgY29uc3QgREFUQV9FTkRQT0lOVCA9ICdodHRwczovL2NvbGxlY3Rvci1vYnNlcnZhYmlsaXR5LmJyb3dzZXJzdGFjay5jb20nXG5leHBvcnQgY29uc3QgQVBQX0FMTFlfRU5EUE9JTlQgPSAnaHR0cHM6Ly9hcHAtYWNjZXNzaWJpbGl0eS5icm93c2Vyc3RhY2suY29tL2F1dG9tYXRlJ1xuZXhwb3J0IGNvbnN0IEFQUF9BTExZX0lTU1VFU19FTkRQT0lOVCA9ICdhcGkvdjEvaXNzdWVzJ1xuZXhwb3J0IGNvbnN0IEFQUF9BTExZX0lTU1VFU19TVU1NQVJZX0VORFBPSU5UID0gJ2FwaS92MS9pc3N1ZXMtc3VtbWFyeSdcbmV4cG9ydCBjb25zdCBEQVRBX0VWRU5UX0VORFBPSU5UID0gJ2FwaS92MS9ldmVudCdcbmV4cG9ydCBjb25zdCBEQVRBX0JBVENIX0VORFBPSU5UID0gJ2FwaS92MS9iYXRjaCdcbmV4cG9ydCBjb25zdCBEQVRBX1NDUkVFTlNIT1RfRU5EUE9JTlQgPSAnYXBpL3YxL3NjcmVlbnNob3RzJ1xuZXhwb3J0IGNvbnN0IERBVEFfQkFUQ0hfU0laRSA9IDEwMDBcbmV4cG9ydCBjb25zdCBEQVRBX0JBVENIX0lOVEVSVkFMID0gMjAwMFxuZXhwb3J0IGNvbnN0IEJBVENIX0VWRU5UX1RZUEVTID0gWydMb2dDcmVhdGVkJywgJ1Rlc3RSdW5TdGFydGVkJywgJ1Rlc3RSdW5GaW5pc2hlZCcsICdIb29rUnVuRmluaXNoZWQnLCAnSG9va1J1blN0YXJ0ZWQnLCAnU2NyZWVuc2hvdENyZWF0ZWQnXVxuZXhwb3J0IGNvbnN0IERFRkFVTFRfV0FJVF9USU1FT1VUX0ZPUl9QRU5ESU5HX1VQTE9BRFMgPSA1MDAwIC8vIDVzXG5leHBvcnQgY29uc3QgREVGQVVMVF9XQUlUX0lOVEVSVkFMX0ZPUl9QRU5ESU5HX1VQTE9BRFMgPSAxMDAgLy8gMTAwbXNcbmV4cG9ydCBjb25zdCBCU1RBQ0tfU0VSVklDRV9WRVJTSU9OID0gYnN0YWNrU2VydmljZVZlcnNpb25cblxuZXhwb3J0IGNvbnN0IE5PVF9BTExPV0VEX0tFWVNfSU5fQ0FQUyA9IFsnaW5jbHVkZVRhZ3NJblRlc3RpbmdTY29wZScsICdleGNsdWRlVGFnc0luVGVzdGluZ1Njb3BlJywgJ3Rlc3RNYW5hZ2VtZW50T3B0aW9ucycsICdza2lwQXBwT3ZlcnJpZGUnXVxuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUX1BMQU5fSUQgPSAnQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRCdcblxuZXhwb3J0IGNvbnN0IExPR1NfRklMRSA9ICdsb2dzL2JzdGFjay13ZGlvLXNlcnZpY2UubG9nJ1xuZXhwb3J0IGNvbnN0IENMSV9ERUJVR19MT0dTX0ZJTEUgPSAnbG9nL3Nkay1jbGktZGVidWcubG9nJ1xuZXhwb3J0IGNvbnN0IFVQTE9BRF9MT0dTX0FERFJFU1MgPSAnaHR0cHM6Ly91cGxvYWQtb2JzZXJ2YWJpbGl0eS5icm93c2Vyc3RhY2suY29tJ1xuZXhwb3J0IGNvbnN0IFVQTE9BRF9MT0dTX0VORFBPSU5UID0gJ2NsaWVudC1sb2dzL3VwbG9hZCdcblxuZXhwb3J0IGNvbnN0IFBFUkNZX0xPR1NfRklMRSA9ICdsb2dzL3BlcmN5LmxvZydcblxuLyoqXG4gKiBBdXRvLWNhcHR1cmUgb2YgdGhlIHVzZXIncyB3ZGlvIGNvbmZpZyBmaWxlIChTREstNzI1MCkuXG4gKi9cblxuLypcbiAqIFNob3duIG9uY2UgcGVyIHJ1biB3aGVuIGF1dG8tY2FwdHVyZSBpcyBhY3RpdmUuIFRoZSBOb2RlIFNESyBkb2VzIHRoZSBzYW1lXG4gKiAoQnJvd3NlclN0YWNrU2V0dXAuanMgLT4gQVVUT0xPR0NBUFRVUkVfTk9USUZJQ0FUSU9OKTsgd2l0aG91dCBpdCBhIHdkaW8gY3VzdG9tZXIgZ2V0cyBub1xuICogcnVudGltZSBkaXNjbG9zdXJlIHRoYXQgdGhlaXIgY29uZmlnIGZpbGUgaXMgY29sbGVjdGVkLCBvbmx5IGEgY2hhbmdlc2V0IGVudHJ5IGFuZCBhIEpTRG9jXG4gKiBjb21tZW50LiBTaW5jZSB0aGUgcmVkYWN0aW9uIGlzIGtleS1uYW1lIGRyaXZlbiBhbmQgYmVzdC1lZmZvcnQsIHRoZSBub3RpY2UgaXMgcGFydCBvZiB0aGVcbiAqIGNvbnRyb2wgcmF0aGVyIHRoYW4gZGVjb3JhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9MT0dDQVBUVVJFX05PVElGSUNBVElPTiA9ICdZb3VyIHdkaW8gY29uZmlnIGZpbGUsIHRoZSBsb2NhbCBjb25maWcgZmlsZXMgaXQgaW1wb3J0cyBhbmQgcGFja2FnZS5qc29uIGFyZSBjYXB0dXJlZCB3aXRoIHRoZSBkZWJ1ZyBsb2dzIGF0IHRoZSBlbmQgb2YgdGhlIHJ1biwgd2l0aCB2YWx1ZXMgdW5kZXIga25vd24gY3JlZGVudGlhbCBrZXlzIHJlbW92ZWQuIFRvIGRpc2FibGUsIHNldCBkaXNhYmxlQXV0b0NhcHR1cmVMb2dzOiB0cnVlIGluIHRoZSBicm93c2Vyc3RhY2sgc2VydmljZSBvcHRpb25zLidcblxuLyogQWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVzb2x2ZWQgd2RpbyBjb25maWcsIHB1Ymxpc2hlZCBvbmNlIHNvIHRoZSB1cGxvYWQgcGF0aCBuZXZlciByZS1kZXJpdmVzIGl0ICovXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX0ZJTEVfUEFUSCA9ICdCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfRklMRV9QQVRIJ1xuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19ESVNBQkxFX0FVVE9fQ0FQVFVSRV9MT0dTID0gJ0JST1dTRVJTVEFDS19ESVNBQkxFX0FVVE9fQ0FQVFVSRV9MT0dTJ1xuLyogV2hpY2ggbGFkZGVyIHJ1bmcgcmVzb2x2ZWQgdGhlIGNvbmZpZywga2VwdCBzbyB0aGUgdXBsb2FkIHBhdGggcmVwb3J0cyB0aGUgVFJVRSBydW5nXG4gICBpbnN0ZWFkIG9mIHJlLXJlYWRpbmcgaXRzIG93biBlbnYgdmFyIGFuZCBhbHdheXMgc2F5aW5nICdlbnZfb3ZlcnJpZGUnICovXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX1NUUkFURUdZID0gJ0JST1dTRVJTVEFDS19XRElPX0NPTkZJR19TVFJBVEVHWSdcblxuLyogTWlycm9ycyBjcmVhdGUtd2RpbydzIFNVUFBPUlRFRF9DT05GSUdfRklMRV9FWFRFTlNJT04gKGlkZW50aWNhbCBpbiB3ZGlvIHY4IGFuZCB2OSkgKi9cbmV4cG9ydCBjb25zdCBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUyA9IFsnLmpzJywgJy50cycsICcubWpzJywgJy5tdHMnLCAnLmNqcycsICcuY3RzJ11cbmV4cG9ydCBjb25zdCBERUZBVUxUX1dESU9fQ09ORklHX0JBU0VOQU1FID0gJ3dkaW8uY29uZidcbi8qIGB3ZGlvIDxjbWQ+YCB2ZXJicyB0aGF0IG11c3QgbmV2ZXIgYmUgbWlzdGFrZW4gZm9yIHRoZSBjb25maWcgcG9zaXRpb25hbCAqL1xuZXhwb3J0IGNvbnN0IFdESU9fQ0xJX1NVQkNPTU1BTkRTID0gWydydW4nLCAnaW5zdGFsbCcsICdyZXBsJywgJ2NvbmZpZyddXG5cbi8qIENvbmZpZ3MgYXJlIGtpbG9ieXRlczsgdGhlIGNhcCBvbmx5IGV4aXN0cyBzbyBhIG1pc2xhYmVsbGVkIHBhdGggY2Fubm90IGJsb2F0IHRoZSBhcmNoaXZlICovXG5leHBvcnQgY29uc3QgTUFYX0NBUFRVUkVEX0NPTkZJR19GSUxFX0JZVEVTID0gMTAyNCAqIDEwMjRcbmV4cG9ydCBjb25zdCBNQVhfQ0FQVFVSRURfQ09ORklHX0ZJTEVTID0gNlxuLyogSG93IGZhciB0byBmb2xsb3cgcmVsYXRpdmUgaW1wb3J0cyBvdXQgb2YgdGhlIGVudHJ5IGNvbmZpZyAoMSA9IGRpcmVjdCBpbXBvcnRzIG9ubHkpICovXG5leHBvcnQgY29uc3QgQ0FQVFVSRV9DT05GSUdfSU1QT1JUX0RFUFRIID0gMVxuLyogSG93IGZhciB0byB3YWxrIHVwIGZyb20gdGhlIGNvbmZpZyBkaXIgbG9va2luZyBmb3IgdGhlIHByb2plY3QncyBwYWNrYWdlLmpzb24gKi9cbmV4cG9ydCBjb25zdCBNQVhfUEFDS0FHRV9KU09OX1dBTEtfVVAgPSA1XG5cbi8qKlxuICogS2V5cyB3aG9zZSBsaW5lIGlzIHNjcnViYmVkIGJlZm9yZSBhIGNvbmZpZyBmaWxlIGVudGVycyB0aGUgYXJjaGl2ZS5cbiAqIGB1c2VyYCAvIGBrZXlgIGFyZSBXRElPJ3Mgb3duIHRvcC1sZXZlbCBjcmVkZW50aWFsIG9wdGlvbnMsIGhlbmNlIHRoZSBiYXJlIGVudHJpZXMuXG4gKi9cbi8qKlxuICogV29yZCBmYW1pbGllcyB0aGF0IG1ha2UgYW4gaWRlbnRpZmllciBzZW5zaXRpdmUgd2hlbiB0aGV5IGFwcGVhciBhcyBpdHMgU1VGRklYIFx1MjAxNFxuICogYGNsaWVudFNlY3JldGAsIGByZWZyZXNoVG9rZW5gLCBgcHJpdmF0ZUtleWAsIGBjbGllbnRfc2VjcmV0YC4gU3BsaXQgYnkgY2FzZSBzbyB0aGVcbiAqIGNhbWVsQ2FzZSBmb3JtIHJlcXVpcmVzIGEgY2FwaXRhbCAoZGlzdGluZ3Vpc2hpbmcgYHByaXZhdGVLZXlgIGZyb20gYGhvdGtleWApIGFuZCB0aGVcbiAqIHNuYWtlX2Nhc2UgZm9ybSByZXF1aXJlcyBhbiBleHBsaWNpdCBgX2AgKGRpc3Rpbmd1aXNoaW5nIGBjbGllbnRfc2VjcmV0YCBmcm9tIGBrZXl3b3JkYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBDT01QT1VORF9TRUNSRVRfU1VGRklYRVNfQ0FNRUwgPSAnS2V5fFRva2VufFNlY3JldHxQYXNzd29yZHxQYXNzd2R8Q3JlZGVudGlhbCdcbmV4cG9ydCBjb25zdCBDT01QT1VORF9TRUNSRVRfU1VGRklYRVNfU05BS0UgPSAna2V5fHRva2VufHNlY3JldHxwYXNzd29yZHxwYXNzd2R8Y3JlZGVudGlhbCdcblxuLyoqXG4gKiBTZWNyZXRzIHRoYXQgc3BhbiBsaW5lcyBvciBoaWRlIGluc2lkZSBhIHZhbHVlLCB3aGljaCBhIGxpbmUva2V5LWFuY2hvcmVkIHNjcnViIGNhbm5vdFxuICogcmVhY2guIEFwcGxpZWQgYXMgd2hvbGUtYmxvY2sgcGFzc2VzIGJlZm9yZSB0aGUgbGluZSBwYXNzZXMuXG4gKi9cbi8qIGFuIGlubGluZSBQRU06IHRoZSBrZXkgYnl0ZXMgc2l0IG9uIGxpbmVzIHRoYXQgY2Fycnkgbm8ga2V5IG5hbWUgYXQgYWxsICovXG4vKlxuICogVGhlIGJvZHkgaXMgVEVNUEVSRUQgc28gaXQgY2Fubm90IGNyb3NzIGEgc2Vjb25kIGAtLS0tLUJFR0lOYDogd2l0aCBhIHBsYWluIGBbXFxzXFxTXSo/YCxcbiAqIGFuIFVOVEVSTUlOQVRFRCBibG9jayBlYXJsaWVyIGluIHRoZSBmaWxlIG1hdGNoZXMgdGhyb3VnaCB0byBhIGxhdGVyLCB1bnJlbGF0ZWQgYmxvY2snc1xuICogRU5EIG1hcmtlciBhbmQgZXZlcnl0aGluZyBpbiBiZXR3ZWVuIGlzIHJlcGxhY2VkIFx1MjAxNCBzaWxlbnRseSBkZXN0cm95aW5nIHVucmVsYXRlZCBjb25maWcuXG4gKiBCb3VuZGVkIGFzIHdlbGwsIHNvIHRoZSBzY2FuIHN0YXlzIGxpbmVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFTV9CTE9DS19SRUdFWCA9IC8oLS0tLS1CRUdJTiBbXi1cXHJcXG5dKy0tLS0tKSg/Oig/IS0tLS0tQkVHSU4pW1xcc1xcU10pezAsNjU1MzZ9PygtLS0tLUVORCBbXi1cXHJcXG5dKy0tLS0tKS9nXG4vKlxuICogQSBQRU0gb3BlbmVkIGJ1dCBuZXZlciBjbG9zZWQuIFRoZSBibG9jayByZWdleCBhYm92ZSBuZWVkcyB0aGUgRU5EIG1hcmtlciwgc28gd2l0aG91dCBpdFxuICogdGhlIGtleSBieXRlcyBzdXJ2aXZlIGV2ZXJ5IHBhc3MuIE1hdGNoZWQgYXMgQkVHSU4gKyB0aGUgcnVuIG9mIGJhc2U2NC1vbmx5IGxpbmVzIHRoYXRcbiAqIGZvbGxvd3MuIEEgcnVuIG11c3QgYmUgYXQgbGVhc3QgMjAgY2hhcmFjdGVycyBhbmQgZW5kIGF0IGEgbm9uLWJhc2U2NCBjaGFyYWN0ZXI6IGxldHRlcnNcbiAqIGFyZSB2YWxpZCBiYXNlNjQsIHNvIGEgc2hvcnRlci91bmJvdW5kZWQgcnVsZSBtYXRjaGVzIHBhcnQgb2YgYW4gb3JkaW5hcnkgbGluZSBzdWNoIGFzXG4gKiBgbmV4dE9wdGlvbjogMWAgYW5kIGVhdHMgaXQuIFN0b3BzIGF0IHRoZSBmaXJzdCBsaW5lIHRoYXQgZG9lcyBub3QgcXVhbGlmeSwgc28gYSBtYWxmb3JtZWRcbiAqIGJsb2NrIGNhbm5vdCBzd2FsbG93IHRoZSByZXN0IG9mIHRoZSBmaWxlLiBUaGUgdXBwZXIgYm91bmQgaXMgZ2VuZXJvdXMgKDggS0IpIGJlY2F1c2UgYVxuICoga2V5IHdyaXR0ZW4gdW53cmFwcGVkIG9uIE9ORSBsaW5lIHdvdWxkIG90aGVyd2lzZSBleGNlZWQgaXQgYW5kIGZhaWwgT1BFTiwgbGVhdmluZyB0aGUgYm9keVxuICogaW4gdGhlIGJ1bmRsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFTV9VTlRFUk1JTkFURURfUkVHRVggPSAvKC0tLS0tQkVHSU4gW14tXFxyXFxuXSstLS0tLSkoPzpcXHI/XFxuW0EtWmEtejAtOSsvPV17MjAsODE5Mn0oPz1bXkEtWmEtejAtOSsvPV18JCkpKy9nXG4vKlxuICogVXNlcmluZm8gaW4gQU5ZIHVybCB2YWx1ZSwgbm90IGp1c3QgdGhlIGBwcm94eVVybGAga2V5LiBUaGUgcGFzc3dvcmQgaGFsZiBpcyBvcHRpb25hbCBzb1xuICogc2luZ2xlLXRva2VuIGZvcm1zIChgaHR0cHM6Ly9naHBfeHh4QGdpdGh1Yi5jb21gLCBjb21tb24gaW4gQ0kgZ2l0L25wbSByZW1vdGVzKSBhcmUgY2F1Z2h0XG4gKiB0b28uIFF1YW50aWZpZXJzIGFyZSBCT1VOREVEOiB0aGUgdW5ib3VuZGVkIGZvcm0gd2FzIG1lYXN1cmFibHkgcXVhZHJhdGljICgxMDAgS0Igb2ZcbiAqIHdvcmQgY2hhcmFjdGVycyB0b29rIDYuMSBzLCA0eCBwZXIgZG91YmxpbmcpIGJlY2F1c2UgYm90aCBoYWx2ZXMgc2NhbiBmb3J3YXJkIGZvciBhbiBgQGBcbiAqIHRoYXQgbmV2ZXIgYXJyaXZlcy4gUmVhbCB1c2VyaW5mbyBpcyBzaG9ydCwgc28gdGhlIGJvdW5kcyBjaGFuZ2Ugbm8gcmVhbC13b3JsZCBtYXRjaC5cbiAqL1xuZXhwb3J0IGNvbnN0IFVSTF9VU0VSSU5GT19SRUdFWCA9IC8oW2EtekEtWl1bYS16QS1aMC05Ky4tXXswLDY0fTpcXC9cXC8pW15cXHMvQDpdezEsMjU2fSg/OjpbXlxccy9AXXswLDI1Nn0pP0AvZ1xuXG5leHBvcnQgY29uc3QgUkVEQUNURURfS0VZUyA9IFtcbiAgICAndXNlcicsICdrZXknLFxuICAgICd1c2VyTmFtZScsICdhY2Nlc3NLZXknLFxuICAgICdicm93c2Vyc3RhY2sudXNlcicsICdicm93c2Vyc3RhY2sua2V5JyxcbiAgICAnYnJvd3NlcnN0YWNrLnVzZXJOYW1lJywgJ2Jyb3dzZXJzdGFjay5hY2Nlc3NLZXknLFxuICAgICdwYXNzd29yZCcsICdwcm94eVBhc3N3b3JkJywgJ3Byb3h5VXNlcicsICdwcm94eVBhc3MnLFxuICAgICdsb2NhbFByb3h5VXNlcicsICdsb2NhbFByb3h5UGFzcycsICdwcm94eVVybCcsXG4gICAgJ2F1dGhUb2tlbicsICdhcGlLZXknLCAnYWNjZXNzVG9rZW4nLCAnc2VjcmV0JywgJ3Rva2VuJyxcbiAgICAnY3VzdG9tVmFyaWFibGVzJywgJ3VzZXJfZGF0YScsICdodHRwUHJveHknLCAnaHR0cHNQcm94eSdcbl1cblxuZXhwb3J0IGNvbnN0IFBFUkNZX0RPTV9DSEFOR0lOR19DT01NQU5EU19FTkRQT0lOVFMgPSBbXG4gICAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvdXJsJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9mb3J3YXJkJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9iYWNrJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9yZWZyZXNoJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9zY3JlZW5zaG90JyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hY3Rpb25zJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL3NoYWtlJ1xuXVxuXG5leHBvcnQgY29uc3QgQ0FQVFVSRV9NT0RFUyA9IFsnY2xpY2snLCAnYXV0bycsICdzY3JlZW5zaG90JywgJ21hbnVhbCcsICd0ZXN0Y2FzZSddXG5leHBvcnQgY29uc3QgTE9HX0tJTkRfVVNBR0VfTUFQID0ge1xuICAgICdURVNUX0xPRyc6ICdsb2cnLFxuICAgICdURVNUX1NDUkVFTlNIT1QnOiAnc2NyZWVuc2hvdCcsXG4gICAgJ1RFU1RfU1RFUCc6ICdzdGVwJyxcbiAgICAnSFRUUCc6ICdodHRwJ1xufVxuXG5leHBvcnQgY29uc3QgRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwgPSAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9zZGsvdjEvZXZlbnQnXG5cbmV4cG9ydCBjb25zdCBFRFNfVVJMID0gJ2h0dHBzOi8vZWRzLmJyb3dzZXJzdGFjay5jb20nXG5cbmV4cG9ydCBjb25zdCBTVVBQT1JURURfQlJPV1NFUlNfRk9SX0FJID0gWydjaHJvbWUnLCAnbWljcm9zb2Z0ZWRnZScsICdmaXJlZm94J11cblxuZXhwb3J0IGNvbnN0IFRDR19VUkwgPSAnaHR0cHM6Ly90Y2cuYnJvd3NlcnN0YWNrLmNvbSdcblxuZXhwb3J0IGNvbnN0IFRDR19JTkZPID0ge1xuICAgIHRjZ1JlZ2lvbjogJ3VzZScsXG4gICAgdGNnVXJsOiBUQ0dfVVJMLFxufVxuXG4vLyBTbWFydCBTZWxlY3Rpb24gTW9kZSBDb25zdGFudHNcbmV4cG9ydCBjb25zdCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCA9ICdyZWxldmFudEZpcnN0J1xuZXhwb3J0IGNvbnN0IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX09OTFkgPSAncmVsZXZhbnRPbmx5J1xuXG4vLyBFbnYgdmFyaWFibGVzIC0gRGVmaW5lIGFsbCB0aGUgZW52IHZhcmlhYmxlIGNvbnN0YW50cyBvdmVyIGhlcmVcblxuLy8gVG8gc3RvcmUgdGhlIEpXVCB0b2tlbiByZXR1cm5lZCB0aGUgc2Vzc2lvbiBsYXVuY2hcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QgPSAnQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUJ1xuXG4vLyBUbyBzdG9yZSB0Y2cgYXV0aCByZXN1bHQgZm9yIHNlbGZIZWFsaW5nIGZlYXR1cmU6XG5leHBvcnQgY29uc3QgQlNUQUNLX1RDR19BVVRIX1JFU1VMVCA9ICdCU1RBQ0tfVENHX0FVVEhfUkVTVUxUJ1xuXG4vLyBUbyBzdG9yZSB0aGUgc2V0dGluZyBvZiB3aGV0aGVyIHRvIHNlbmQgc2NyZWVuc2hvdHMgb3Igbm90XG5leHBvcnQgY29uc3QgVEVTVE9QU19TQ1JFRU5TSE9UX0VOViA9ICdCU19URVNUT1BTX0FMTE9XX1NDUkVFTlNIT1RTJ1xuXG4vLyBUbyBzdG9yZSBidWlsZCBoYXNoZWQgaWRcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEID0gJ0JST1dTRVJTVEFDS19URVNUSFVCX1VVSUQnXG4vLyBJbnRlcnJ1cHQgc2lnbmFsLCBwcm9wYWdhdGVkIHZpYSBlbnYgc28gdGhlIGRldGFjaGVkIGNsZWFudXAgY2hpbGQgYW5kIGdSUENcbi8vIHN0b3AgcGF0aCBjYW4gc3RhbXAgdGhlIGtpbGwgcmVhc29uIG9udG8gdGhlIGJ1aWxkIHN0b3AuXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0tJTExfU0lHTkFMID0gJ0JST1dTRVJTVEFDS19TREtfS0lMTF9TSUdOQUwnXG5cbi8vIFRvIHN0b3JlIHRlc3QgcnVuIHV1aWRcbmV4cG9ydCBjb25zdCBURVNUX0FOQUxZVElDU19JRCA9ICdURVNUX0FOQUxZVElDU19JRCdcblxuLy8gV2hldGhlciB0byBjb2xsZWN0IHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbiBvciBub3RcbmV4cG9ydCBjb25zdCBQRVJGX01FQVNVUkVNRU5UX0VOViA9ICdCUk9XU0VSU1RBQ0tfTzExWV9QRVJGX01FQVNVUkVNRU5UJ1xuXG4vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHJ1biBpcyByZXJ1biBvciBub3RcbmV4cG9ydCBjb25zdCBSRVJVTl9URVNUU19FTlYgPSAnQlJPV1NFUlNUQUNLX1JFUlVOX1RFU1RTJ1xuXG4vLyBUaGUgdGVzdHMgdGhhdCBuZWVkcyB0byBiZSByZXJ1blxuZXhwb3J0IGNvbnN0IFJFUlVOX0VOViA9ICdCUk9XU0VSU1RBQ0tfUkVSVU4nXG5cbi8vIFRvIHN0b3JlIHdoZXRoZXIgdGhlIGJ1aWxkIGxhdW5jaCBoYXMgY29tcGxldGVkIG9yIG5vdFxuZXhwb3J0IGNvbnN0IFRFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOViA9ICdCU19URVNUT1BTX0JVSUxEX0NPTVBMRVRFRCdcblxuLy8gV2hldGhlciBwZXJjeSBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkgb3Igbm90XG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1BFUkNZID0gJ0JST1dTRVJTVEFDS19QRVJDWSdcblxuLy8gV2hldGhlciBzZXNzaW9uIGlzIGEgYWNjZXNzaWJpbGl0eSBzZXNzaW9uXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFkgPSAnQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFknXG5cbi8vIFdoZXRoZXIgc2Vzc2lvbiBpcyBhIHRlc3QgcmVwb3J0aW5nIHNlc3Npb25cbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSA9ICdCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSdcblxuLy8gTG9hZCBUZXN0aW5nIFNlcnZpY2UgKExUUykgZW52IHZhcnM6IHRoZSBwb2QtaXRlcmF0aW9uIHNlc3Npb24gaWQgKGl0c1xuLy8gcHJlc2VuY2UgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIFwidGhpcyBydW4gaXMgYW4gTFRTIHBvZFxuLy8gaXRlcmF0aW9uXCIpIGFuZCBhbiBvcHRpb25hbCBvcHQtaW4gZmxhZyBmb3IgbG9jYWwgcmVwcm8gLyBDSSBydW5zIHRoYXRcbi8vIGRvbid0IGhhdmUgYSByZWFsIHNlc3Npb24gaWQuXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEID0gJ0JST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRCdcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfTFRTID0gJ0JST1dTRVJTVEFDS19MVFMnXG5cbi8vIE5ldyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGVudmlyb25tZW50IHZhcmlhYmxlc1xuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUX1JFUE9SVElORyA9ICdCUk9XU0VSU1RBQ0tfVEVTVF9SRVBPUlRJTkcnXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1RFU1RfUkVQT1JUSU5HX0RFQlVHID0gJ0JST1dTRVJTVEFDS19URVNUX1JFUE9SVElOR19ERUJVRydcbmV4cG9ydCBjb25zdCBURVNUX1JFUE9SVElOR19CVUlMRF9UQUcgPSAnVEVTVF9SRVBPUlRJTkdfQlVJTERfVEFHJ1xuZXhwb3J0IGNvbnN0IFRFU1RfUkVQT1JUSU5HX1BST0pFQ1RfTkFNRSA9ICdURVNUX1JFUE9SVElOR19QUk9KRUNUX05BTUUnXG5leHBvcnQgY29uc3QgVEVTVF9SRVBPUlRJTkdfQlVJTERfTkFNRSA9ICdURVNUX1JFUE9SVElOR19CVUlMRF9OQU1FJ1xuXG4vLyBNYXhpbXVtIHNpemUgb2YgVkNTIGluZm8gd2hpY2ggaXMgYWxsb3dlZFxuZXhwb3J0IGNvbnN0IE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVMgPSA2NCAqIDEwMjRcblxuLyogVGhlIHZhbHVlIHRvIGJlIGFwcGVuZGVkIGF0IHRoZSBlbmQgaWYgZ2l0IG1ldGFkYXRhIGlzIGxhcmdlciB0aGFuIE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVNcbiovXG5leHBvcnQgY29uc3QgR0lUX01FVEFfREFUQV9UUlVOQ0FURUQgPSAnLi4uW1RSVU5DQVRFRF0nXG5cbi8vIENMSSByZWxhdGVkIGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IENMSV9TVE9QX1RJTUVPVVQgPSA1MDAwIC8vIDUgc2Vjb25kc1xuZXhwb3J0IGNvbnN0IEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTID0gWydFVFhUQlNZJywgJ0VCVVNZJ11cbmV4cG9ydCBjb25zdCBNQVhfU1BBV05fUkVUUklFUyA9IDNcbmV4cG9ydCBjb25zdCBTUEFXTl9SRVRSWV9ERUxBWV9NUyA9IDEwMDBcbmV4cG9ydCBjb25zdCBXRElPX05BTUlOR19QUkVGSVggPSAnV2ViZHJpdmVySU8tJ1xuZXhwb3J0IGNvbnN0IFBFUkZfTUVUUklDU19XQUlUX1RJTUUgPSAyMDAwXG5cbi8vIEJ1aWxkLXN0b3AgZGVsaXZlcnkgYnVkZ2V0LiBUaGUgc3RvcCBQVVQgaXMgdGhlIG9ubHkgc2lnbmFsIHRoYXQgY2xvc2VzIGEgVFJBIGJ1aWxkLFxuLy8gc28gYSB0cmFuc2llbnQgdHJhbnNwb3J0IGZhaWx1cmUgaXMgd29ydGggcmV0cnlpbmcgcGFzdCBhIHNob3J0IG5ldHdvcmsgYmxpcCBcdTIwMTQgYnV0IHRoZVxuLy8gd2hvbGUgdGhpbmcgcnVucyBkdXJpbmcgc2h1dGRvd24sIHNvIHRoZSB0b3RhbCBjb3N0IGlzIGNhcHBlZCBieSBhIHdhbGwtY2xvY2sgZGVhZGxpbmVcbi8vIHJhdGhlciB0aGFuIGJ5IGF0dGVtcHQgY291bnQgYWxvbmUuXG5leHBvcnQgY29uc3QgU1RPUF9CVUlMRF9NQVhfQVRURU1QVFMgPSA0XG5leHBvcnQgY29uc3QgU1RPUF9CVUlMRF9BVFRFTVBUX1RJTUVPVVRfTVMgPSAxMDAwMFxuZXhwb3J0IGNvbnN0IFNUT1BfQlVJTERfVE9UQUxfQlVER0VUX01TID0gMzAwMDBcbmV4cG9ydCBjb25zdCBTVE9QX0JVSUxEX0JBQ0tPRkZfQkFTRV9NUyA9IDEwMDBcblxuLy8gQVBJIEVuZHBvaW50IGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IFVQREFURURfQ0xJX0VORFBPSU5UID0gJ3Nkay92MS91cGRhdGVfY2xpJ1xuXG4vKipcbiAqIE1vZHVsZSBIb29rIEV2ZW50cyAtIFBlcmZvcm1hbmNlIGV2ZW50IG5hbWVzIGZvciBtb2R1bGUgbGlmZWN5Y2xlIHRyYWNraW5nXG4gKiBVc2VkIGJ5IG1vZHVsZS1ob29rLXRyYWNrZXIudHMgdG8gaW5zdHJ1bWVudCBtb2R1bGUgaW5pdGlhbGl6YXRpb24gYW5kIGNsZWFudXBcbiAqL1xuZXhwb3J0IGNvbnN0IE1PRFVMRV9IT09LX0VWRU5UUyA9IHtcbiAgICAvLyBJbnN0cnVtZW50YXRpb24gbW9kdWxlXG4gICAgSU5TVFJVTUVOVEFUSU9OX09OX1NUQVJUOiAnTU9EVUxFX0lOU1RSVU1FTlRBVElPTl9PTl9TVEFSVCcsXG4gICAgSU5TVFJVTUVOVEFUSU9OX09OX1NUT1A6ICdNT0RVTEVfSU5TVFJVTUVOVEFUSU9OX09OX1NUT1AnLFxuXG4gICAgLy8gVGVzdEh1YiBtb2R1bGVcbiAgICBURVNUSFVCX09OX1NUQVJUOiAnTU9EVUxFX1RFU1RIVUJfT05fU1RBUlQnLFxuICAgIFRFU1RIVUJfT05fU1RPUDogJ01PRFVMRV9URVNUSFVCX09OX1NUT1AnLFxuXG4gICAgLy8gT2JzZXJ2YWJpbGl0eSBtb2R1bGVcbiAgICBPQlNFUlZBQklMSVRZX09OX1NUQVJUOiAnTU9EVUxFX09CU0VSVkFCSUxJVFlfT05fU1RBUlQnLFxuICAgIE9CU0VSVkFCSUxJVFlfT05fU1RPUDogJ01PRFVMRV9PQlNFUlZBQklMSVRZX09OX1NUT1AnLFxuXG4gICAgLy8gUGVyY3kgbW9kdWxlXG4gICAgUEVSQ1lfT05fU1RBUlQ6ICdNT0RVTEVfUEVSQ1lfT05fU1RBUlQnLFxuICAgIFBFUkNZX09OX1NUT1A6ICdNT0RVTEVfUEVSQ1lfT05fU1RPUCcsXG5cbiAgICAvLyBBY2Nlc3NpYmlsaXR5IG1vZHVsZVxuICAgIEFDQ0VTU0lCSUxJVFlfT05fU1RBUlQ6ICdNT0RVTEVfQUNDRVNTSUJJTElUWV9PTl9TVEFSVCcsXG4gICAgQUNDRVNTSUJJTElUWV9PTl9TVE9QOiAnTU9EVUxFX0FDQ0VTU0lCSUxJVFlfT05fU1RPUCcsXG4gICAgQUNDRVNTSUJJTElUWV9PTl9EUklWRVJfSU5JVDogJ01PRFVMRV9BQ0NFU1NJQklMSVRZX09OX0RSSVZFUl9JTklUJyxcblxuICAgIC8vIEFJIG1vZHVsZVxuICAgIEFJX09OX1NUQVJUOiAnTU9EVUxFX0FJX09OX1NUQVJUJyxcbiAgICBBSV9PTl9TVE9QOiAnTU9EVUxFX0FJX09OX1NUT1AnLFxuICAgIEFJX0JFRk9SRV9TRVNTSU9OOiAnTU9EVUxFX0FJX0JFRk9SRV9TRVNTSU9OJyxcbiAgICBBSV9PTl9EUklWRVJfSU5JVDogJ01PRFVMRV9BSV9PTl9EUklWRVJfSU5JVCcsXG5cbiAgICAvLyBMb2NhbCB0ZXN0aW5nIG1vZHVsZVxuICAgIExPQ0FMX09OX1NUQVJUOiAnTU9EVUxFX0xPQ0FMX09OX1NUQVJUJyxcbiAgICBMT0NBTF9PTl9TVE9QOiAnTU9EVUxFX0xPQ0FMX09OX1NUT1AnLFxuICAgIExPQ0FMX0lOSVRfU0VTU0lPTjogJ01PRFVMRV9MT0NBTF9JTklUX1NFU1NJT04nLFxuICAgIExPQ0FMX09OX0RSSVZFUl9JTklUOiAnTU9EVUxFX0xPQ0FMX09OX0RSSVZFUl9JTklUJyxcblxuICAgIC8vIEFwcCBBdXRvbWF0ZSBtb2R1bGVcbiAgICBBUFBBVVRPTUFURV9PTl9TVEFSVDogJ01PRFVMRV9BUFBBVVRPTUFURV9PTl9TVEFSVCcsXG4gICAgQVBQQVVUT01BVEVfT05fRFJJVkVSX0lOSVQ6ICdNT0RVTEVfQVBQQVVUT01BVEVfT05fRFJJVkVSX0lOSVQnLFxufSBhcyBjb25zdFxuIiwgImV4cG9ydCBkZWZhdWx0IGNsYXNzIEFQSVV0aWxzIHtcbiAgICBzdGF0aWMgRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwgPSAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9zZGsvdjEvZXZlbnQnXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BQV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19QRVJDWV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfQ0xPVURfVVJMID0gJ2h0dHBzOi8vYXBpLWNsb3VkLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BQV9BUElfQ0xPVURfVVJMID0gJ2h0dHBzOi8vYXBpLWNsb3VkLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEFQUF9BTExZX0VORFBPSU5UID0gJ2h0dHBzOi8vYXBwLWFjY2Vzc2liaWxpdHkuYnJvd3NlcnN0YWNrLmNvbS9hdXRvbWF0ZSdcbiAgICBzdGF0aWMgREFUQV9FTkRQT0lOVCA9ICdodHRwczovL2NvbGxlY3Rvci1vYnNlcnZhYmlsaXR5LmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIFVQTE9BRF9MT0dTX0FERFJFU1MgPSAnaHR0cHM6Ly91cGxvYWQtb2JzZXJ2YWJpbGl0eS5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBFRFNfVVJMID0gJ2h0dHBzOi8vZWRzLmJyb3dzZXJzdGFjay5jb20nXG5cbiAgICBzdGF0aWMgdXBkYXRlVVJMU0ZvckdSUihhcGlzOiBHUlJVcmxzKSB7XG4gICAgICAgIHRoaXMuRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwgPSBgJHthcGlzLmF1dG9tYXRlLmFwaX0vc2RrL3YxL2V2ZW50YFxuICAgICAgICB0aGlzLkJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfVVJMID0gYXBpcy5hdXRvbWF0ZS5hcGlcbiAgICAgICAgdGhpcy5CUk9XU0VSU1RBQ0tfQUFfQVBJX1VSTCA9IGFwaXMuYXBwQXV0b21hdGUuYXBpXG4gICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX1BFUkNZX0FQSV9VUkwgPSBhcGlzLnBlcmN5LmFwaVxuICAgICAgICB0aGlzLkJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfQ0xPVURfVVJMID0gYXBpcy5hdXRvbWF0ZS51cGxvYWRcbiAgICAgICAgdGhpcy5CUk9XU0VSU1RBQ0tfQUFfQVBJX0NMT1VEX1VSTCA9IGFwaXMuYXBwQXV0b21hdGUudXBsb2FkXG4gICAgICAgIHRoaXMuQVBQX0FMTFlfRU5EUE9JTlQgPSBgJHthcGlzLmFwcEFjY2Vzc2liaWxpdHkuYXBpfS9hdXRvbWF0ZWBcbiAgICAgICAgdGhpcy5EQVRBX0VORFBPSU5UID0gYXBpcy5vYnNlcnZhYmlsaXR5LmFwaVxuICAgICAgICB0aGlzLlVQTE9BRF9MT0dTX0FERFJFU1MgPSBhcGlzLm9ic2VydmFiaWxpdHkudXBsb2FkXG4gICAgICAgIHRoaXMuRURTX1VSTCA9IGFwaXMuZWRzSW5zdHJ1bWVudGF0aW9uLmFwaVxuICAgIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IHBsYXRmb3JtLCBhcmNoLCBob21lZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB1dGlsLCB7IHByb21pc2lmeSB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ25vZGU6c3RyZWFtJ1xuaW1wb3J0IHR5cGUgeyBaaXBGaWxlLCBPcHRpb25zIGFzIHlhdXpsT3B0aW9ucyB9IGZyb20gJ3lhdXpsJ1xuaW1wb3J0IHlhdXpsIGZyb20gJ3lhdXpsJ1xuaW1wb3J0IHsgdGhyZWFkSWQgfSBmcm9tICdub2RlOndvcmtlcl90aHJlYWRzJ1xuXG5pbXBvcnQgeyBfZmV0Y2ggYXMgZmV0Y2ggfSBmcm9tICcuLi9mZXRjaFdyYXBwZXIuanMnXG5cbmltcG9ydCB7XG4gICAgaXNOdWxsT3JFbXB0eSxcbiAgICBuZXN0ZWRLZXlWYWx1ZSxcbiAgICBjcmVhdGVEaXIsXG4gICAgaXNXcml0YWJsZSxcbiAgICBzZXRSZWFkV3JpdGVBY2Nlc3MsXG4gICAgaXNUcnVlLFxuICAgIGdldEJyb3dzZXJTdGFja1VzZXIsXG4gICAgZ2V0QnJvd3NlclN0YWNrS2V5LFxuICAgIGlzRmFsc2UsXG4gICAgaXNUdXJib1NjYWxlLFxuICAgIHNob3VsZEFkZFNlcnZpY2VWZXJzaW9uLFxufSBmcm9tICcuLi91dGlsLmpzJ1xuaW1wb3J0IFBlcmZvcm1hbmNlVGVzdGVyIGZyb20gJy4uL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgeyBFVkVOVFMgYXMgUGVyZm9ybWFuY2VFdmVudHMgfSBmcm9tICcuLi9pbnN0cnVtZW50YXRpb24vcGVyZm9ybWFuY2UvY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIGFzIGxvZ2dlciB9IGZyb20gJy4vY2xpTG9nZ2VyLmpzJ1xuaW1wb3J0IHsgVVBEQVRFRF9DTElfRU5EUE9JTlQsIEJTVEFDS19TRVJWSUNFX1ZFUlNJT04sIEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zLCBDYXBhYmlsaXRpZXMgfSBmcm9tICdAd2Rpby90eXBlcydcbmltcG9ydCB0eXBlIHtcbiAgICBCcm93c2Vyc3RhY2tDb25maWcsXG4gICAgQnJvd3NlcnN0YWNrT3B0aW9ucyxcbiAgICBUZXN0TWFuYWdlbWVudE9wdGlvbnMsXG4gICAgVGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLFxufSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IFRlc3RGcmFtZXdvcmtDb25zdGFudHMgfSBmcm9tICcuL2ZyYW1ld29ya3MvY29uc3RhbnRzL3Rlc3RGcmFtZXdvcmtDb25zdGFudHMuanMnXG5pbXBvcnQgQVBJVXRpbHMgZnJvbSAnLi9hcGlVdGlscy5qcydcblxuY29uc3QgQ0xJX0xPQ0tfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDBcbmNvbnN0IENMSV9MT0NLX1BPTExfTVMgPSAxMDAwXG5jb25zdCBDTElfRE9XTkxPQURfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDBcbmNvbnN0IENMSV9ET1dOTE9BRF9UTVBfUFJFRklYID0gJ2Rvd25sb2FkZWRfZmlsZV8nXG5jb25zdCBDTElfRE9XTkxPQURfVE1QX1NVRkZJWCA9ICcuemlwJ1xuXG5leHBvcnQgY2xhc3MgQ0xJVXRpbHMge1xuICAgIHN0YXRpYyBhdXRvbWF0aW9uRnJhbWV3b3JrRGV0YWlsID0ge31cbiAgICBzdGF0aWMgdGVzdEZyYW1ld29ya0RldGFpbCA9IHt9XG4gICAgc3RhdGljIENMSVN1cHBvcnRlZEZyYW1ld29ya3MgPSBbJ21vY2hhJ11cblxuICAgIHN0YXRpYyBpc0RldmVsb3BtZW50RW52KCkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0NMSV9FTlYgPT09ICdkZXZlbG9wbWVudCdcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0Q0xJUGFyYW1zRm9yRGV2RW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19DTElfRU5WIHx8ICcnLFxuICAgICAgICAgICAgbGlzdGVuOiBgdW5peDovdG1wL3Nkay1wbGF0Zm9ybS0ke3Byb2Nlc3MuZW52LkJST1dTRVJTVEFDS19DTElfRU5WfS5zb2NrYCxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGNvbmZpZyBvYmplY3QgZm9yIGJpbmFyeSBzZXNzaW9uIHJlcXVlc3RcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRCaW5Db25maWcoXG4gICAgICAgIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICAgICBjYXBhYmlsaXRpZXM6XG4gICAgICAgICAgICB8IENhcGFiaWxpdGllcy5SZXF1ZXN0ZWRTdGFuZGFsb25lQ2FwYWJpbGl0aWVzXG4gICAgICAgICAgICB8IENhcGFiaWxpdGllcy5SZXF1ZXN0ZWRTdGFuZGFsb25lQ2FwYWJpbGl0aWVzW10sXG4gICAgICAgIG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIEJyb3dzZXJzdGFja09wdGlvbnMsXG4gICAgICAgIGJ1aWxkVGFnPzogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBjb25zdCBtb2RpZmllZE9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5vcHRpb25zIH1cbiAgICAgICAgaWYgKG1vZGlmaWVkT3B0cy5vcHRzKSB7XG4gICAgICAgICAgICBtb2RpZmllZE9wdHMuYnJvd3NlclN0YWNrTG9jYWxPcHRpb25zID0gbW9kaWZpZWRPcHRzLm9wdHNcbiAgICAgICAgICAgIGRlbGV0ZSBtb2RpZmllZE9wdHMub3B0c1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBtb2RpZmllZE9wdHMudGVzdE1hbmFnZW1lbnRPcHRpb25zXG5cbiAgICAgICAgbW9kaWZpZWRPcHRzLnRlc3RDb250ZXh0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHNraXBTZXNzaW9uTmFtZTogaXNGYWxzZShtb2RpZmllZE9wdHMuc2V0U2Vzc2lvbk5hbWUpLFxuICAgICAgICAgICAgc2tpcFNlc3Npb25TdGF0dXM6IGlzRmFsc2UobW9kaWZpZWRPcHRzLnNldFNlc3Npb25TdGF0dXMpLFxuICAgICAgICAgICAgc2Vzc2lvbk5hbWVPbWl0VGVzdFRpdGxlOiBtb2RpZmllZE9wdHMuc2Vzc2lvbk5hbWVPbWl0VGVzdFRpdGxlIHx8IGZhbHNlLFxuICAgICAgICAgICAgc2Vzc2lvbk5hbWVQcmVwZW5kVG9wTGV2ZWxTdWl0ZVRpdGxlOlxuICAgICAgICAgICAgICAgIG1vZGlmaWVkT3B0cy5zZXNzaW9uTmFtZVByZXBlbmRUb3BMZXZlbFN1aXRlVGl0bGUgfHwgZmFsc2UsXG4gICAgICAgICAgICBzZXNzaW9uTmFtZUZvcm1hdDogbW9kaWZpZWRPcHRzLnNlc3Npb25OYW1lRm9ybWF0IHx8ICcnLFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tbW9uQnN0YWNrT3B0aW9ucyA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzICYmXG4gICAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoY2FwYWJpbGl0aWVzKSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBjYXBhYmlsaXRpZXMgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgJ2JzdGFjazpvcHRpb25zJyBpbiAoY2FwYWJpbGl0aWVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FzdCBhZnRlciBndWFyZCB0byBzYXRpc2Z5IFR5cGVTY3JpcHRcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMgYXMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnYnN0YWNrOm9wdGlvbnMnXT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApWydic3RhY2s6b3B0aW9ucyddIHx8IHt9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgIH0pKClcblxuICAgICAgICBjb25zdCBpc05vbkJzdGFja0ExMXkgPVxuICAgICAgICAgICAgaXNUdXJib1NjYWxlKG9wdGlvbnMpIHx8XG4gICAgICAgICAgICAhc2hvdWxkQWRkU2VydmljZVZlcnNpb24oXG4gICAgICAgICAgICAgICAgY29uZmlnIGFzIE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICAgICAgICAgICAgICBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgICAgKVxuICAgICAgICBjb25zdCBvYnNlcnZhYmlsaXR5T3B0aW9uczogVGVzdE9ic2VydmFiaWxpdHlPcHRpb25zID1cbiAgICAgICAgICAgIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zIHx8IHt9XG4gICAgICAgIGNvbnN0IHRlc3RNYW5hZ2VtZW50T3B0aW9uczogVGVzdE1hbmFnZW1lbnRPcHRpb25zID1cbiAgICAgICAgICAgIG9wdGlvbnMudGVzdE1hbmFnZW1lbnRPcHRpb25zIHx8IHt9XG4gICAgICAgIGNvbnN0IHRlc3RQbGFuSWQgPSB0eXBlb2YgdGVzdE1hbmFnZW1lbnRPcHRpb25zLnRlc3RQbGFuSWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IHRlc3RNYW5hZ2VtZW50T3B0aW9ucy50ZXN0UGxhbklkLnRyaW0oKVxuICAgICAgICAgICAgOiAnJ1xuICAgICAgICBjb25zdCBiaW5jb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICAgICAgdXNlck5hbWU6IG9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXIgfHwgY29uZmlnLnVzZXIsXG4gICAgICAgICAgICBhY2Nlc3NLZXk6IG9ic2VydmFiaWxpdHlPcHRpb25zLmtleSB8fCBjb25maWcua2V5LFxuICAgICAgICAgICAgcGxhdGZvcm1zOiBbXSxcbiAgICAgICAgICAgIGlzTm9uQnN0YWNrQTExeVdESU86IGlzTm9uQnN0YWNrQTExeSxcbiAgICAgICAgICAgIC4uLm1vZGlmaWVkT3B0cyxcbiAgICAgICAgICAgIC4uLmNvbW1vbkJzdGFja09wdGlvbnMsXG4gICAgICAgIH1cblxuICAgICAgICBiaW5jb25maWcuYnVpbGROYW1lID0gb2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGROYW1lIHx8IGJpbmNvbmZpZy5idWlsZE5hbWVcbiAgICAgICAgYmluY29uZmlnLnByb2plY3ROYW1lID0gb2JzZXJ2YWJpbGl0eU9wdGlvbnMucHJvamVjdE5hbWUgfHwgYmluY29uZmlnLnByb2plY3ROYW1lXG4gICAgICAgIGJpbmNvbmZpZy5idWlsZFRhZyA9IHRoaXMuZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhvYnNlcnZhYmlsaXR5T3B0aW9ucywgYnVpbGRUYWcpIHx8IFtdXG4gICAgICAgIGlmICh0ZXN0UGxhbklkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGJpbmNvbmZpZy50ZXN0TWFuYWdlbWVudE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdGVzdFBsYW5JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhcHMgPSBBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykgPyBjYXBhYmlsaXRpZXMgOiBbY2FwYWJpbGl0aWVzXVxuICAgICAgICBmb3IgKGNvbnN0IGNhcCBvZiBjYXBzKSB7XG4gICAgICAgICAgICBjb25zdCBwbGF0Zm9ybTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgICAgICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IGNhcCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjYXBhYmlsaXR5KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSAnYnN0YWNrOm9wdGlvbnMnKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1ba2V5XSA9IGNhcGFiaWxpdHlba2V5XVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGlmIChjYXBhYmlsaXR5Wydic3RhY2s6b3B0aW9ucyddKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoXG4gICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1ba2V5XSA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIClba2V5XVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoYmluY29uZmlnLnBsYXRmb3JtcyBhcyBBcnJheTx1bmtub3duPikucHVzaChwbGF0Zm9ybSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYmluY29uZmlnKVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRTZGtWZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTlxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRTZGtMYW5ndWFnZSgpIHtcbiAgICAgICAgcmV0dXJuICdFQ01BU2NyaXB0J1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBzZXR1cENsaVBhdGgoXG4gICAgICAgIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0NvbmZpZ3VyaW5nIENsaSBwYXRoLicpXG4gICAgICAgIGNvbnN0IGRldmVsb3BtZW50QmluYXJ5UGF0aCA9IHByb2Nlc3MuZW52LlNES19DTElfQklOX1BBVEggfHwgbnVsbFxuICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoZGV2ZWxvcG1lbnRCaW5hcnlQYXRoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBEZXZlbG9wbWVudCBDbGkgUGF0aDogJHtkZXZlbG9wbWVudEJpbmFyeVBhdGh9YClcbiAgICAgICAgICAgIHJldHVybiBkZXZlbG9wbWVudEJpbmFyeVBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjbGlEaXIgPSB0aGlzLmdldENsaURpcigpXG4gICAgICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShjbGlEaXIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB3cml0YWJsZSBkaXJlY3RvcnkgYXZhaWxhYmxlIGZvciB0aGUgQ0xJJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xpUGF0aCA9IHRoaXMuZ2V0RXhpc3RpbmdDbGlQYXRoKGNsaURpcilcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsQmluYXJ5UGF0aCA9IGF3YWl0IHRoaXMuY2hlY2tBbmRVcGRhdGVDbGkoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdDbGlQYXRoLFxuICAgICAgICAgICAgICAgIGNsaURpcixcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYFJlc29sdmVkIGJpbmFyeSBwYXRoOiAke2ZpbmFsQmluYXJ5UGF0aH1gKVxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsQmluYXJ5UGF0aFxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgRXJyb3IgaW4gc2V0dGluZyB1cCBjbGkgcGF0aCBkaXJlY3RvcnksIEV4Y2VwdGlvbjogJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgY2hlY2tBbmRVcGRhdGVDbGkoXG4gICAgICAgIGV4aXN0aW5nQ2xpUGF0aDogc3RyaW5nLFxuICAgICAgICBjbGlEaXI6IHN0cmluZyxcbiAgICAgICAgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsXG4gICAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIC8vIFNraXAgQ0xJIHVwZGF0ZSBpbiB3b3JrZXIgcHJvY2Vzc2VzIC0gb25seSBsYXVuY2hlciBzaG91bGQgdXBkYXRlXG4gICAgICAgIC8vIFdvcmtlcnMgYXJlIGlkZW50aWZpZWQgYnkgaGF2aW5nIEJST1dTRVJTVEFDS19URVNUSFVCX0pXVCBzZXQgKGJ1aWxkIGFscmVhZHkgc3RhcnRlZClcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUSFVCX0pXVCkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBXb3JrZXIgcHJvY2VzcyBkZXRlY3RlZCwgc2tpcHBpbmcgQ0xJIHVwZGF0ZS4gVXNpbmcgZXhpc3Rpbmc6ICR7ZXhpc3RpbmdDbGlQYXRofWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdDbGlQYXRoICYmIGZzLmV4aXN0c1N5bmMoZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0NsaVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICdXb3JrZXIgcHJvY2VzcyBoYXMgbm8gZXhpc3RpbmcgQ0xJIGJpbmFyeSwgYXR0ZW1wdGluZyBkb3dubG9hZCBhcyBmYWxsYmFjay4nLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuc3RhcnQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgIGxvZ2dlci5pbmZvKGBDdXJyZW50IENMSSBQYXRoIEZvdW5kOiAke2V4aXN0aW5nQ2xpUGF0aH1gKVxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIHNka192ZXJzaW9uOiBDTElVdGlscy5nZXRTZGtWZXJzaW9uKCksXG4gICAgICAgICAgICBvczogcGxhdGZvcm0oKSxcbiAgICAgICAgICAgIG9zX2FyY2g6IGFyY2goKSxcbiAgICAgICAgICAgIGNsaV92ZXJzaW9uOiAnMCcsXG4gICAgICAgICAgICBzZGtfbGFuZ3VhZ2U6IHRoaXMuZ2V0U2RrTGFuZ3VhZ2UoKSxcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgLy8gSWYgYmluYXJ5IGlzIGJ1c3kgKGJlaW5nIGV4ZWN1dGVkIGJ5IGFub3RoZXIgcHJvY2VzcyksIHNraXAgdmVyc2lvbiBjaGVja1xuICAgICAgICAgICAgLy8gYW5kIEFQSSBjYWxsIGVudGlyZWx5IFx1MjAxNCB1c2UgZXhpc3RpbmcgYmluYXJ5IGFzLWlzXG4gICAgICAgICAgICBpZiAodGhpcy5pc0JpbmFyeUJ1c3koZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBFeGlzdGluZyBiaW5hcnkgaXMgY3VycmVudGx5IGluIHVzZSwgc2tpcHBpbmcgdXBkYXRlOiAke2V4aXN0aW5nQ2xpUGF0aH1gKVxuICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChQZXJmb3JtYW5jZUV2ZW50cy5TREtfQ0xJX0NIRUNLX1VQREFURSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdDbGlQYXRoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgdGhpcy5ydW5TaGVsbENvbW1hbmQoXG4gICAgICAgICAgICAgICAgYCR7ZXhpc3RpbmdDbGlQYXRofSB2ZXJzaW9uYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmICh2ZXJzaW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3RleHQgZmlsZSBidXN5JykpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgQmluYXJ5IGJ1c3kgZHVyaW5nIHZlcnNpb24gY2hlY2ssIHNraXBwaW5nIHVwZGF0ZTogJHtleGlzdGluZ0NsaVBhdGh9YClcbiAgICAgICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ2xpUGF0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcnlQYXJhbXMuY2xpX3ZlcnNpb24gPSB2ZXJzaW9uXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3RUb1VwZGF0ZUNMSShxdWVyeVBhcmFtcywgY29uZmlnKVxuICAgICAgICBpZiAobmVzdGVkS2V5VmFsdWUocmVzcG9uc2UsIFsndXBkYXRlZF9jbGlfdmVyc2lvbiddKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBOZWVkIHRvIHVwZGF0ZSBiaW5hcnksIGN1cnJlbnQgYmluYXJ5IHZlcnNpb246ICR7cXVlcnlQYXJhbXMuY2xpX3ZlcnNpb259YCxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgY29uc3QgYnJvd3NlclN0YWNrQmluYXJ5VXJsID1cbiAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQklOQVJZX1VSTCB8fCBudWxsXG4gICAgICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoYnJvd3NlclN0YWNrQmluYXJ5VXJsKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgYFVzaW5nIEJST1dTRVJTVEFDS19CSU5BUllfVVJMOiAke2Jyb3dzZXJTdGFja0JpbmFyeVVybH1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXNwb25zZS51cmwgPSBicm93c2VyU3RhY2tCaW5hcnlVcmxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmluYWxCaW5hcnlQYXRoID0gYXdhaXQgdGhpcy5kb3dubG9hZExhdGVzdEJpbmFyeShcbiAgICAgICAgICAgICAgICBuZXN0ZWRLZXlWYWx1ZShyZXNwb25zZSwgWyd1cmwnXSksXG4gICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgIG5lc3RlZEtleVZhbHVlKHJlc3BvbnNlLCBbJ3VwZGF0ZWRfY2xpX3ZlcnNpb24nXSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgICAgICByZXR1cm4gZmluYWxCaW5hcnlQYXRoXG4gICAgICAgIH1cbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfQ0hFQ0tfVVBEQVRFKVxuICAgICAgICByZXR1cm4gZXhpc3RpbmdDbGlQYXRoXG4gICAgfVxuXG4gICAgc3RhdGljIGdldENsaURpcigpIHtcbiAgICAgICAgY29uc3Qgd3JpdGFibGVEaXIgPSB0aGlzLmdldFdyaXRhYmxlRGlyKClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KHdyaXRhYmxlRGlyKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gd3JpdGFibGUgZGlyZWN0b3J5IGF2YWlsYWJsZSBmb3IgdGhlIENMSScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjbGlEaXJQYXRoID0gcGF0aC5qb2luKHdyaXRhYmxlRGlyISwgJ2NsaScpXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xpRGlyUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVEaXIoY2xpRGlyUGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbGlEaXJQYXRoXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgIGBFcnJvciBpbiBnZXR0aW5nIHdyaXRhYmxlIGRpcmVjdG9yeSwgd3JpdGFibGVEaXI9JHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRXcml0YWJsZURpcigpIHtcbiAgICAgICAgY29uc3Qgd3JpdGFibGVEaXJPcHRpb25zID0gW1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0ZJTEVTX0RJUixcbiAgICAgICAgICAgIHBhdGguam9pbihob21lZGlyKCksICcuYnJvd3NlcnN0YWNrJyksXG4gICAgICAgICAgICBwYXRoLmpvaW4oJ3RtcCcsICcuYnJvd3NlcnN0YWNrJyksXG4gICAgICAgIF1cblxuICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2Ygd3JpdGFibGVEaXJPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShwYXRoKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGghKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZpbGUgJHtwYXRofSBhbHJlYWR5IGV4aXN0YClcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1dyaXRhYmxlKHBhdGghKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBHaXZpbmcgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBzZXRSZWFkV3JpdGVBY2Nlc3MocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVHJ1ZShzdWNjZXNzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHByb3ZpZGUgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZpbGUgZG9lcyBub3QgZXhpc3Q6ICR7cGF0aH1gKVxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVEaXIocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgR2l2aW5nIHdyaXRlIHBlcm1pc3Npb24gdG8gJHtwYXRofWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBzZXRSZWFkV3JpdGVBY2Nlc3MocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNUcnVlKHN1Y2Nlc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHByb3ZpZGUgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aFxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIGdldCB3cml0YWJsZSBkaXJlY3RvcnksIGV4Y2VwdGlvbiAke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RXhpc3RpbmdDbGlQYXRoKGNsaURpcjogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGF0aCBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5XG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xpRGlyKSB8fCAhZnMuc3RhdFN5bmMoY2xpRGlyKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIExpc3QgYWxsIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgdGhhdCBzdGFydCB3aXRoIFwiYmluYXJ5LVwiXG4gICAgICAgICAgICBjb25zdCBhbGxCaW5hcmllcyA9IGZzXG4gICAgICAgICAgICAgICAgLnJlYWRkaXJTeW5jKGNsaURpcilcbiAgICAgICAgICAgICAgICAubWFwKChmaWxlOiBzdHJpbmcpID0+IHBhdGguam9pbihjbGlEaXIsIGZpbGUpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChmaWxlUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZnMuc3RhdFN5bmMoZmlsZVBhdGgpLmlzRmlsZSgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKS5zdGFydHNXaXRoKCdiaW5hcnktJyksXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBpZiAoYWxsQmluYXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGF0ZXN0IGJpbmFyeSBieSBjb21wYXJpbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZVxuICAgICAgICAgICAgICAgIGNvbnN0IGxhdGVzdEJpbmFyeSA9IGFsbEJpbmFyaWVzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGZpbGVQYXRoOiBzdHJpbmcpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG10aW1lOiBmcy5zdGF0U3luYyhmaWxlUGF0aCkubXRpbWUsXG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdDogeyBmaWxlUGF0aDogc3RyaW5nOyBtdGltZTogRGF0ZSB9IHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiB7IGZpbGVQYXRoOiBzdHJpbmc7IG10aW1lOiBEYXRlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhdGVzdCB8fCAhbGF0ZXN0Lm10aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQubXRpbWUgPiBsYXRlc3QubXRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGF0ZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiBsYXRlc3RCaW5hcnkgPyBsYXRlc3RCaW5hcnkuZmlsZVBhdGggOiAnJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gJycgLy8gTm8gYmluYXJ5IHByZXNlbnRcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIHdoaWxlIHJlYWRpbmcgQ0xJIHBhdGg6ICR7dXRpbC5mb3JtYXQoZXJyKX1gKVxuICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgaXNCaW5hcnlCdXN5KGJpbmFyeVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShiaW5hcnlQYXRoKSkge3JldHVybiBmYWxzZX1cbiAgICAgICAgaWYgKHBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7cmV0dXJuIGZhbHNlfVxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYmluYXJ5UGF0aCkpIHtyZXR1cm4gZmFsc2V9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZkID0gZnMub3BlblN5bmMoYmluYXJ5UGF0aCwgJ3IrJylcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgaWYgKEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTLmluY2x1ZGVzKGVyci5jb2RlKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQmluYXJ5IGlzIGJ1c3k6ICR7YmluYXJ5UGF0aH1gKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEVycm9yIGNoZWNraW5nIGlmIGJpbmFyeSBpcyBidXN5OiAke2Vyci5tZXNzYWdlfWApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyByZXF1ZXN0VG9VcGRhdGVDTEkgPSBhc3luYyAoXG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgICAgICBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICApID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxdWVyeVBhcmFtcylcbiAgICAgICAgY29uc3QgcmVxdWVzdEluaXQ6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtnZXRCcm93c2VyU3RhY2tVc2VyKGNvbmZpZyl9OiR7Z2V0QnJvd3NlclN0YWNrS2V5KGNvbmZpZyl9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICBgJHtBUElVdGlscy5CUk9XU0VSU1RBQ0tfQVVUT01BVEVfQVBJX1VSTH0vJHtVUERBVEVEX0NMSV9FTkRQT0lOVH0/JHtwYXJhbXMudG9TdHJpbmcoKX1gLFxuICAgICAgICAgICAgcmVxdWVzdEluaXQsXG4gICAgICAgIClcbiAgICAgICAgY29uc3QganNvblJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgcmVzcG9uc2UgJHtKU09OLnN0cmluZ2lmeShqc29uUmVzcG9uc2UpfWApXG4gICAgICAgIHJldHVybiBqc29uUmVzcG9uc2VcbiAgICB9XG5cbiAgICBzdGF0aWMgcnVuU2hlbGxDb21tYW5kKFxuICAgICAgICBjbWRDb21tYW5kOiBzdHJpbmcsXG4gICAgICAgIHdvcmtpbmdEaXIgPSAnJyxcbiAgICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3MgPSBleGVjKFxuICAgICAgICAgICAgICAgIGNtZENvbW1hbmQsXG4gICAgICAgICAgICAgICAgeyBjd2Q6IHdvcmtpbmdEaXIsIHRpbWVvdXQ6IDUwMDAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3I6IEVycm9yLCBzdGRvdXQ6IHN0cmluZywgc3RkZXJyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0ZGVyci50cmltKCkgfHwgJ1NIRUxMX0VYRUNVVEVfRVJST1InKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBwcm9jZXNzIGlzIGtpbGxlZCBpZiBpdCBleGNlZWRzIHRoZSB0aW1lb3V0XG4gICAgICAgICAgICBwcm9jZXNzLm9uKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCdTSEVMTF9FWEVDVVRFX0VSUk9SJylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyc2lvbiBlbmNvZGVkIGluIGEgYmluYXJ5IGRvd25sb2FkIFVSTCwgZS5nLlxuICAgICAqIGAuLi4vYmluYXJ5LW1hY29zLWFybTY0LTEuNDguMC56aXBgIC0+IGAxLjQ4LjBgLiBOdWxsIHdoZW4gdGhlIFVSTCBkb2VzXG4gICAgICogbm90IGNhcnJ5IG9uZSAoY3VzdG9tIEJST1dTRVJTVEFDS19CSU5BUllfVVJMKS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VmVyc2lvbkZyb21CaW5hcnlVcmwoYmluRG93bmxvYWRVcmw6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gLy0oXFxkK1xcLlxcZCtcXC5cXGQrKVxcLnppcCg/OlxcP3wkKS8uZXhlYyhiaW5Eb3dubG9hZFVybCB8fCAnJyk/LlsxXSA/PyBudWxsXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYmluYXJ5IG9uIGRpc2sgaXMgYWxyZWFkeSB0aGUgdmVyc2lvbiB3ZSB3ZXJlIGFza2VkIHRvIGZldGNoLlxuICAgICAqIEEgcGVlciB3b3JrZXIgd2lubmluZyB0aGUgZG93bmxvYWQgcmFjZSBsZWF2ZXMgdGhlICp0YXJnZXQqIHZlcnNpb24gaGVyZTtcbiAgICAgKiBhIG1lcmVseS1wcmUtZXhpc3RpbmcgYmluYXJ5IGlzIHN0YWxlLiBPbmx5IHRoZSBmb3JtZXIgbWF5IHNob3J0LWNpcmN1aXRcbiAgICAgKiB0aGUgZG93bmxvYWQgXHUyMDE0IHNlZSBgZG93bmxvYWRMYXRlc3RCaW5hcnlgLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBpc0JpbmFyeUF0VmVyc2lvbihcbiAgICAgICAgYmluYXJ5UGF0aDogc3RyaW5nLFxuICAgICAgICBleHBlY3RlZFZlcnNpb246IHN0cmluZyB8IG51bGwsXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghZXhwZWN0ZWRWZXJzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYWN0dWFsID0gYXdhaXQgQ0xJVXRpbHMucnVuU2hlbGxDb21tYW5kKGAke2JpbmFyeVBhdGh9IHZlcnNpb25gKVxuICAgICAgICAgICAgcmV0dXJuIGFjdHVhbC50cmltKCkgPT09IGV4cGVjdGVkVmVyc2lvblxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGRvd25sb2FkTGF0ZXN0QmluYXJ5ID0gYXN5bmMgKFxuICAgICAgICBiaW5Eb3dubG9hZFVybDogc3RyaW5nLFxuICAgICAgICBjbGlEaXI6IHN0cmluZyxcbiAgICAgICAgZXhwZWN0ZWRWZXJzaW9uPzogc3RyaW5nIHwgbnVsbCxcbiAgICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+ID0+IHtcbiAgICAgICAgY29uc3QgbG9ja1BhdGggPSBwYXRoLmpvaW4oY2xpRGlyLCAnZG93bmxvYWQubG9jaycpXG4gICAgICAgIC8vIFByZWZlciB0aGUgdmVyc2lvbiB0aGUgc2VydmVyIHJlcG9ydGVkOyB0aGUgVVJMIGlzIG9ubHkgYSBmYWxsYmFjayBhbmRcbiAgICAgICAgLy8gY2FycmllcyBubyB2ZXJzaW9uIHdoZW4gQlJPV1NFUlNUQUNLX0JJTkFSWV9VUkwgb3ZlcnJpZGVzIGl0LlxuICAgICAgICBjb25zdCB0YXJnZXRWZXJzaW9uID1cbiAgICAgICAgICAgIGV4cGVjdGVkVmVyc2lvbiB8fCBDTElVdGlscy5nZXRWZXJzaW9uRnJvbUJpbmFyeVVybChiaW5Eb3dubG9hZFVybClcblxuICAgICAgICBjb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpXG5cbiAgICAgICAgY29uc3QgcGFyc2VMb2NrRmlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhsb2NrUGF0aCwgJ3V0ZjgnKS50cmltKClcbiAgICAgICAgICAgICAgICBjb25zdCBbcGlkTGluZSwgdGltZXN0YW1wTGluZV0gPSBjb250ZW50LnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChwaWRMaW5lLCAxMClcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBOdW1iZXIucGFyc2VJbnQodGltZXN0YW1wTGluZSwgMTApXG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGlkKSB8fCAhTnVtYmVyLmlzRmluaXRlKHRpbWVzdGFtcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcGlkLCB0aW1lc3RhbXAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUHJvY2Vzc1J1bm5pbmcgPSAocGlkOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3F1aXJlTG9jayA9IGFzeW5jIChcbiAgICAgICAgICAgIHRpbWVvdXRNcyA9IENMSV9MT0NLX1RJTUVPVVRfTVMsXG4gICAgICAgICAgICBwb2xsTXMgPSBDTElfTE9DS19QT0xMX01TLFxuICAgICAgICApOiBQcm9taXNlPCgoKSA9PiB2b2lkKSB8IHsgYWxyZWFkeUV4aXN0czogc3RyaW5nIH0+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvbiAtLSBpbnRlbnRpb25hbCBwb2xsIGxvb3A7IGV4aXRzIHZpYSByZXR1cm4vdGhyb3cgYmVsb3dcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhsb2NrUGF0aCwgJ3d4JylcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmQsIGAke3Byb2Nlc3MucGlkfVxcbiR7RGF0ZS5ub3coKX1cXG5gKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsbHkgaWdub3JlIHdyaXRlIGVycm9yczsgdGhlIG9wZW4gZmQgc3RpbGwgaG9sZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGNsdXNpdmUgbG9jayBhbmQgd2lsbCBiZSBjbG9zZWQgaW4gY2xlYW51cFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKGxvY2tQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGNsZWFudXAgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZSBhcyB7IGNvZGU/OiBzdHJpbmcgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VFWElTVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2tNZXRhID0gcGFyc2VMb2NrRmlsZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9ja01ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NrQWdlID0gRGF0ZS5ub3coKSAtIGxvY2tNZXRhLnRpbWVzdGFtcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bm5pbmcgPSBpc1Byb2Nlc3NSdW5uaW5nKGxvY2tNZXRhLnBpZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bm5pbmcgfHwgbG9ja0FnZSA+IHRpbWVvdXRNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTdGFsZSBDTEkgZG93bmxvYWQgbG9jayBkZXRlY3RlZCAocGlkPSR7bG9ja01ldGEucGlkfSwgYWdlPSR7bG9ja0FnZX1tcykuIFJlbW92aW5nIGxvY2suYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhsb2NrUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgYmluYXJ5IGFwcGVhcmVkIHdoaWxlIHdhaXRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQmluYXJ5ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTElVdGlscy5nZXRFeGlzdGluZ0NsaVBhdGgoY2xpRGlyKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQmluYXJ5ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhleGlzdGluZ0JpbmFyeSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5zdGF0U3luYyhleGlzdGluZ0JpbmFyeSkuc2l6ZSA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXdhaXQgQ0xJVXRpbHMuaXNCaW5hcnlBdFZlcnNpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQmluYXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCaW5hcnkgdiR7dGFyZ2V0VmVyc2lvbn0gYXBwZWFyZWQgd2hpbGUgd2FpdGluZyBmb3IgbG9jazogJHtleGlzdGluZ0JpbmFyeX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBhbHJlYWR5RXhpc3RzOiBleGlzdGluZ0JpbmFyeSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID4gdGltZW91dE1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGltZW91dCB3YWl0aW5nIGZvciBsb2NrOiAke2xvY2tQYXRofWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAocG9sbE1zKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xlYW51cFRlbXBvcmFyeURvd25sb2FkcyA9IChtYXhBZ2VNcyA9IENMSV9MT0NLX1RJTUVPVVRfTVMpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgICAgIC8vIE1hdGNoIGJvdGggZG93bmxvYWQgemlwcyAoZG93bmxvYWRlZF9maWxlXyouemlwKSBhbmQgb3JwaGFuIGV4dHJhY3RcbiAgICAgICAgICAgICAgICAvLyB0ZW1wIGZpbGVzICg8bmFtZT4udG1wLjxwaWQ+KSBsZWZ0IGJ5IGNyYXNoZWQgcGVlciB3b3JrZXJzLlxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEV4dHJhY3RSZSA9IC9cXC50bXBcXC5cXGQrJC9cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZzLnJlYWRkaXJTeW5jKGNsaURpcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNEb3dubG9hZFppcCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zdGFydHNXaXRoKENMSV9ET1dOTE9BRF9UTVBfUFJFRklYKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZW5kc1dpdGgoQ0xJX0RPV05MT0FEX1RNUF9TVUZGSVgpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRXh0cmFjdFRtcCA9IHRtcEV4dHJhY3RSZS50ZXN0KGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRG93bmxvYWRaaXAgJiYgIWlzRXh0cmFjdFRtcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjbGlEaXIsIGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhdHM6IGZzLlN0YXRzXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVQYXRoKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyAtIHN0YXRzLm10aW1lTXMgPCBtYXhBZ2VNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhmaWxlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBkZWxldGUgdGVtcCBDTEkgZmlsZSAke2ZpbGVQYXRofTogJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gc2NhbiB0ZW1wIENMSSBmaWxlcyBpbiAke2NsaURpcn06ICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLnN0YXJ0KFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfRE9XTkxPQUQpXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRG93bmxvYWRpbmcgU0RLIGJpbmFyeSBmcm9tOiAke2JpbkRvd25sb2FkVXJsfWApXG5cbiAgICAgICAgbGV0IGRvd25sb2FkRW5kZWQgPSBmYWxzZVxuICAgICAgICBjb25zdCBlbmREb3dubG9hZCA9IChzdWNjZXNzID0gdHJ1ZSwgZXJyTXNnPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoZG93bmxvYWRFbmRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG93bmxvYWRFbmRlZCA9IHRydWVcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfRE9XTkxPQUQpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoXG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9ET1dOTE9BRCxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJNc2csXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVsZWFzZUxvY2s6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbG9ja1Jlc3VsdCA9IGF3YWl0IGFjcXVpcmVMb2NrKClcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYmluYXJ5IGFscmVhZHkgZXhpc3RzIChhbm90aGVyIHByb2Nlc3MgZG93bmxvYWRlZCBpdClcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbG9ja1Jlc3VsdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGVuZERvd25sb2FkKClcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9ja1Jlc3VsdC5hbHJlYWR5RXhpc3RzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbGVhc2VMb2NrID0gbG9ja1Jlc3VsdFxuXG4gICAgICAgICAgICAvLyBSZS1jaGVjayBhZnRlciBhY3F1aXJpbmcgbG9jay4gT25seSBhIGJpbmFyeSBhbHJlYWR5IGF0IHRoZSB0YXJnZXRcbiAgICAgICAgICAgIC8vIHZlcnNpb24gbWVhbnMgYSBwZWVyIHdvbiB0aGUgcmFjZTsgYW55IG90aGVyIGJpbmFyeSBoZXJlIGlzIHRoZVxuICAgICAgICAgICAgLy8gc3RhbGUgb25lIHdlIHdlcmUgc2VudCB0byByZXBsYWNlLCBzbyBpdCBtdXN0IG5vdCBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgICAvLyB0aGUgZG93bmxvYWQuXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0JpbmFyeSA9IENMSVV0aWxzLmdldEV4aXN0aW5nQ2xpUGF0aChjbGlEaXIpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdCaW5hcnkgJiZcbiAgICAgICAgICAgICAgICBmcy5leGlzdHNTeW5jKGV4aXN0aW5nQmluYXJ5KSAmJlxuICAgICAgICAgICAgICAgIGZzLnN0YXRTeW5jKGV4aXN0aW5nQmluYXJ5KS5zaXplID4gMCAmJlxuICAgICAgICAgICAgICAgIChhd2FpdCBDTElVdGlscy5pc0JpbmFyeUF0VmVyc2lvbihleGlzdGluZ0JpbmFyeSwgdGFyZ2V0VmVyc2lvbikpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBCaW5hcnkgYWxyZWFkeSBhdCB2JHt0YXJnZXRWZXJzaW9ufSBhZnRlciBhY3F1aXJpbmcgbG9jazogJHtleGlzdGluZ0JpbmFyeX1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBlbmREb3dubG9hZCgpXG4gICAgICAgICAgICAgICAgcmVsZWFzZUxvY2soKVxuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0JpbmFyeVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbGVhbnVwVGVtcG9yYXJ5RG93bmxvYWRzKClcblxuICAgICAgICAgICAgY29uc3QgemlwRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgIGAke0NMSV9ET1dOTE9BRF9UTVBfUFJFRklYfSR7cHJvY2Vzcy5waWR9XyR7RGF0ZS5ub3coKX0ke0NMSV9ET1dOTE9BRF9UTVBfU1VGRklYfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBkb3dubG9hZGVkRmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHppcEZpbGVQYXRoKVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nIHwgbnVsbD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdDogY3JlYXRlV3JpdGVTdHJlYW0gb3BlbnNcbiAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSwgc28gYW4gZXJyb3IgY2FuIGxhbmQgYmVmb3JlIHByb2Nlc3NEb3dubG9hZFxuICAgICAgICAgICAgICAgIC8vIGdldHMgZmFyIGVub3VnaCB0byBhdHRhY2ggaXRzIG93biBoYW5kbGVyIFx1MjAxNCB3aXRoIG5vIGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBiZWNvbWVzIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpbiB0aGUgdXNlcidzIHRlc3QgcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICBkb3dubG9hZGVkRmlsZVN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyOiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgR290IEVycm9yIHdoaWxlIGRvd25sb2FkaW5nIGNsaSBiaW5hcnkgZmlsZTogJHtlcnJ9YCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NEb3dubG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBDTElfRE9XTkxPQURfVElNRU9VVF9NUyxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKGJpbkRvd25sb2FkVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZXNwb25zZSBib2R5IHJlY2VpdmVkJylcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVTdHJlYW0gPSBSZWFkYWJsZS5mcm9tKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciksXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlU3RyZWFtLnBpcGUoZG93bmxvYWRlZEZpbGVTdHJlYW0pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB1cCB0aGUgZG93bmxvYWRGaWxlU3RyZWFtIGhhbmRsZXIgYmVmb3JlIHBpcGVsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBDTElVdGlscy5kb3dubG9hZEZpbGVTdHJlYW0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRlZEZpbGVTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnI/OiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEdvdCBFcnJvciBpbiBjbGkgYmluYXJ5IGRvd25sb2FkaW5nIHJlcXVlc3QgJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEEgcmVqZWN0aW9uIGJlZm9yZSB0aGUgc3RyZWFtIGhhbmRsZXJzIGFyZSB3aXJlZCAoZS5nLiBmZXRjaFxuICAgICAgICAgICAgICAgIC8vIGl0c2VsZiBmYWlsaW5nKSB3b3VsZCBvdGhlcndpc2UgbGVhdmUgdGhpcyBwcm9taXNlIHBlbmRpbmdcbiAgICAgICAgICAgICAgICAvLyBmb3JldmVyIGFuZCBoYW5nIHRoZSBsYXVuY2hlci5cbiAgICAgICAgICAgICAgICBwcm9jZXNzRG93bmxvYWQoKS5jYXRjaCgoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGlzIHBpcGVkIGludG8gdGhlIHN0cmVhbSBvbiB0aGlzIHBhdGgsIHNvIGNsb3NlIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgXHUyMDE0IG90aGVyd2lzZSB0aGUgZmQgYW5kIHRoZSB0ZW1wIHppcCBib3RoIGxlYWsuXG4gICAgICAgICAgICAgICAgICAgIGRvd25sb2FkZWRGaWxlU3RyZWFtLmRlc3Ryb3koKVxuICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGRvd25sb2FkIGJpbmFyeSwgRXhjZXB0aW9uOiAke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZG93bmxvYWRGaWxlU3RyZWFtKFxuICAgICAgICBkb3dubG9hZGVkRmlsZVN0cmVhbTogZnMuV3JpdGVTdHJlYW0sXG4gICAgICAgIHppcEZpbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgIGNsaURpcjogc3RyaW5nLFxuICAgICAgICByZXNvbHZlOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkLFxuICAgICAgICByZWplY3Q6IChyZWFzb24/OiBFcnJvcikgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgZG93bmxvYWRlZEZpbGVTdHJlYW0ub24oJ2Nsb3NlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgeWF1emxPcGVuUHJvbWlzZSA9IHByb21pc2lmeSh5YXV6bC5vcGVuKSBhcyAoXG4gICAgICAgICAgICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHlhdXpsT3B0aW9ucyxcbiAgICAgICAgICAgICkgPT4gUHJvbWlzZTxaaXBGaWxlPlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB6aXBmaWxlID0gYXdhaXQgeWF1emxPcGVuUHJvbWlzZSh6aXBGaWxlUGF0aCwge1xuICAgICAgICAgICAgICAgICAgICBsYXp5RW50cmllczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGxldCByZXNvbHZlZEJpbmFyeVBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgICAgICAgICB6aXBmaWxlLnJlYWRFbnRyeSgpXG4gICAgICAgICAgICAgICAgemlwZmlsZS5vbignZW50cnknLCBhc3luYyAoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9cXC8kLy50ZXN0KGVudHJ5LmZpbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5yZWFkRW50cnkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBaaXAtc2xpcCBndWFyZDogcmVqZWN0IGVudHJpZXMgd2hvc2UgcmVzb2x2ZWQgcGF0aCBlc2NhcGVzIGNsaURpclxuICAgICAgICAgICAgICAgICAgICAvLyAoQlJPV1NFUlNUQUNLX0JJTkFSWV9VUkwgbGV0cyB1c2VycyBzdXBwbHkgYXJiaXRyYXJ5IHppcHMpLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVQYXRoID0gcGF0aC5qb2luKGNsaURpciwgZW50cnkuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ2FuZGlkYXRlID0gcGF0aC5yZXNvbHZlKGNhbmRpZGF0ZVBhdGgpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRGlyID0gcGF0aC5yZXNvbHZlKGNsaURpcikgKyBwYXRoLnNlcFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkQ2FuZGlkYXRlLnN0YXJ0c1dpdGgocmVzb2x2ZWREaXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFppcC1zbGlwIGRldGVjdGVkOiBlbnRyeSBcIiR7ZW50cnkuZmlsZU5hbWV9XCIgcmVzb2x2ZXMgb3V0c2lkZSAke2NsaURpcn1gKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNCaW5hcnlFbnRyeSA9IHBhdGguYmFzZW5hbWUoZW50cnkuZmlsZU5hbWUpLnN0YXJ0c1dpdGgoJ2JpbmFyeS0nKVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNCaW5hcnlFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0U3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0oY2FuZGlkYXRlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdFN0cmVhbS5vbignZXJyb3InLCAod3JpdGVFcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3Qod3JpdGVFcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlblJlYWRTdHJlYW1Qcm9taXNlID0gcHJvbWlzaWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUub3BlblJlYWRTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICAgICApLmJpbmQoemlwZmlsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZFN0cmVhbSA9IGF3YWl0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZShlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkU3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdFN0cmVhbS5lbmQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RTdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4gemlwZmlsZS5yZWFkRW50cnkoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ucGlwZShkaXJlY3RTdHJlYW0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh6aXBFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoemlwRXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBCaW5hcnkgZW50cnk6IGV4dHJhY3QgdG8gUElELXNjb3BlZCB0ZW1wIGZpbGUsIGNobW9kLCBhdG9taWMgcmVuYW1lIGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudHMgRVRYVEJTWS9FQlVTWTogdGhlIGZpbGUgYmVpbmcgZXhlY3V0ZWQgaXMgbmV2ZXIgdGhlIGZpbGUgYmVpbmcgd3JpdHRlbi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluYWxQYXRoID0gY2FuZGlkYXRlUGF0aFxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHBhdGguam9pbihjbGlEaXIsIGAke2VudHJ5LmZpbGVOYW1lfS50bXAuJHtwcm9jZXNzLnBpZH1gKVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odGVtcFBhdGgpXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHdyaXRlU3RyZWFtRXJyb3JlZCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtLm9uKCdlcnJvcicsICh3cml0ZUVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1FcnJvcmVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgZnNwLnVubGluayh0ZW1wUGF0aCkuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh3cml0ZUVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgICAgICAvLyAnY2xvc2UnIGZpcmVzIGFmdGVyIHRoZSBmZCBpcyBjbG9zZWQ7IHNhZmUgZm9yIGZzcC5yZW5hbWUgb24gV2luZG93cyAod2hlcmUgJ2ZpbmlzaCcgbWF5IGZpcmUgYmVmb3JlIGZkIHJlbGVhc2UpLlxuICAgICAgICAgICAgICAgICAgICAvLyBhdXRvQ2xvc2U9dHJ1ZSBhbHNvIG1ha2VzICdjbG9zZScgZmlyZSBhZnRlciAnZXJyb3InIFx1MjAxNCBiYWlsIG91dCBpZiB0aGUgZXJyb3IgcGF0aCBhbHJlYWR5IHJlamVjdGVkLlxuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbS5vbignY2xvc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVTdHJlYW1FcnJvcmVkKSB7IHJldHVybiB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC5jaG1vZCh0ZW1wUGF0aCwgJzA3NTUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC5yZW5hbWUodGVtcFBhdGgsIGZpbmFsUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHJlbmFtZUVycjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hcnJvdyBmYWxsYmFjayB0byBjcm9zcy1kZXZpY2UgKEVYREVWKSBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW5hbWVFcnIuY29kZSAhPT0gJ0VYREVWJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVuYW1lRXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEF0b21pYyByZW5hbWUgZmFpbGVkIChjcm9zcy1kZXZpY2UpLCBmYWxsaW5nIGJhY2sgdG8gY29weTogJHtyZW5hbWVFcnIubWVzc2FnZX1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmc3AuY29weUZpbGUodGVtcFBhdGgsIGZpbmFsUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnNwLnVubGluayh0ZW1wUGF0aCkuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWRCaW5hcnlQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkQmluYXJ5UGF0aCA9IGZpbmFsUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLnJlYWRFbnRyeSgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmc3AudW5saW5rKHRlbXBQYXRoKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZSA9IHByb21pc2lmeShcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUub3BlblJlYWRTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICkuYmluZCh6aXBmaWxlKVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZFN0cmVhbSA9IGF3YWl0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZShlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbS5lbmQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSlcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoemlwRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmc3AudW5saW5rKHRlbXBQYXRoKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHppcEVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICB6aXBmaWxlLm9uKCdlcnJvcicsICh6aXBFcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHppcEVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgemlwZmlsZS5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZzcC51bmxpbmsoemlwRmlsZVBhdGgpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gZGVsZXRlIHppcCBmaWxlOiAke3ppcEZpbGVQYXRofWApXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlZEJpbmFyeVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignTm8gYmluYXJ5LSogZW50cnkgZm91bmQgaW4gemlwOyBjYW5ub3QgY29tcGxldGUgQ0xJIGJpbmFyeSBleHRyYWN0aW9uJykpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZEJpbmFyeVBhdGgpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgc3RhdGljIGdldFRlc3RGcmFtZXdvcmtEZXRhaWwoKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVF9GUkFNRVdPUktfREVUQUlMKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVF9GUkFNRVdPUktfREVUQUlMKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRlc3RGcmFtZXdvcmtEZXRhaWxcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0QXV0b21hdGlvbkZyYW1ld29ya0RldGFpbCgpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BVVRPTUFUSU9OX0ZSQU1FV09SS19ERVRBSUwpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BVVRPTUFUSU9OX0ZSQU1FV09SS19ERVRBSUwsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYXV0b21hdGlvbkZyYW1ld29ya0RldGFpbFxuICAgIH1cblxuICAgIHN0YXRpYyBzZXRGcmFtZXdvcmtEZXRhaWwoXG4gICAgICAgIHRlc3RGcmFtZXdvcms6IHN0cmluZyxcbiAgICAgICAgYXV0b21hdGlvbkZyYW1ld29yazogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBpZiAoIXRlc3RGcmFtZXdvcmsgfHwgIWF1dG9tYXRpb25GcmFtZXdvcmspIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgVGVzdCBvciBBdXRvbWF0aW9uIGZyYW1ld29yayBub3QgcHJvdmlkZWQgdGVzdEZyYW1ld29yaz0ke3Rlc3RGcmFtZXdvcmt9LCBhdXRvbWF0aW9uRnJhbWV3b3JrPSR7YXV0b21hdGlvbkZyYW1ld29ya31gLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50ZXN0RnJhbWV3b3JrRGV0YWlsID0ge1xuICAgICAgICAgICAgbmFtZTogdGVzdEZyYW1ld29yayxcbiAgICAgICAgICAgIHZlcnNpb246IHsgW3Rlc3RGcmFtZXdvcmtdOiBDTElVdGlscy5nZXRTZGtWZXJzaW9uKCkgfSxcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXV0b21hdGlvbkZyYW1ld29ya0RldGFpbCA9IHtcbiAgICAgICAgICAgIG5hbWU6IGF1dG9tYXRpb25GcmFtZXdvcmssXG4gICAgICAgICAgICB2ZXJzaW9uOiB7IFthdXRvbWF0aW9uRnJhbWV3b3JrXTogQ0xJVXRpbHMuZ2V0U2RrVmVyc2lvbigpIH0sXG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQVVUT01BVElPTl9GUkFNRVdPUktfREVUQUlMID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB0aGlzLmF1dG9tYXRpb25GcmFtZXdvcmtEZXRhaWwsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RfRlJBTUVXT1JLX0RFVEFJTCA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgdGhpcy50ZXN0RnJhbWV3b3JrRGV0YWlsLFxuICAgICAgICApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGluc3RhbmNlIG5hbWUgdXNpbmcgdGhyZWFkIGlkIGFuZCBwcm9jZXNzSWRcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDdXJyZW50SW5zdGFuY2VOYW1lKCkge1xuICAgICAgICByZXR1cm4gYCR7cHJvY2Vzcy5waWR9OiR7dGhyZWFkSWR9YFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGEgdW5pcXVlIGNsaWVudCB3b3JrZXIgaWRlbnRpZmllciBjb21iaW5pbmcgdGhyZWFkIElEIGFuZCBwcm9jZXNzIElELlxuICAgICAqIFRoaXMgaWRlbnRpZmllciBpcyB1c2VkIHRvIHRyYWNrIHdvcmtlci1zcGVjaWZpYyBldmVudHMgYW5kIHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICAgKiBhY3Jvc3MgZGlzdHJpYnV0ZWQgdGVzdCBleGVjdXRpb24uIEZvcm1hdCBtYXRjaGVzIHRoZSBQeXRob24gU0RLIGltcGxlbWVudGF0aW9uXG4gICAgICogZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBTREtzLlxuICAgICAqXG4gICAgICogRm9ybWF0OiBcInRocmVhZElkLXByb2Nlc3NJZFwiXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udGV4dCAtIE9wdGlvbmFsIGV4ZWN1dGlvbiBjb250ZXh0IHdpdGggdGhyZWFkSWQgYW5kIHByb2Nlc3NJZFxuICAgICAqIEByZXR1cm5zIFdvcmtlciBJRCBzdHJpbmcgaW4gZm9ybWF0IFwidGhyZWFkSWQtcHJvY2Vzc0lkXCJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHdvcmtlcklkID0gQ0xJVXRpbHMuZ2V0Q2xpZW50V29ya2VySWQoKSAvLyBSZXR1cm5zIFwiMS0xMjM0NVwiXG4gICAgICogY29uc3Qgd29ya2VySWQgPSBDTElVdGlscy5nZXRDbGllbnRXb3JrZXJJZCh7IHRocmVhZElkOiAxMjMsIHByb2Nlc3NJZDogNDU2IH0pIC8vIFJldHVybnMgXCIxMjMtNDU2XCJcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0Q2xpZW50V29ya2VySWQoY29udGV4dD86IHsgdGhyZWFkSWQ/OiBzdHJpbmcgfCBudW1iZXI7IHByb2Nlc3NJZD86IHN0cmluZyB8IG51bWJlciB9KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgd29ya2VyVGhyZWFkSWQgPSBjb250ZXh0Py50aHJlYWRJZD8udG9TdHJpbmcoKSB8fCB0aHJlYWRJZC50b1N0cmluZygpXG4gICAgICAgIGNvbnN0IHdvcmtlclByb2Nlc3NJZCA9IGNvbnRleHQ/LnByb2Nlc3NJZD8udG9TdHJpbmcoKSB8fCBwcm9jZXNzLnBpZC50b1N0cmluZygpXG4gICAgICAgIHJldHVybiBgJHt3b3JrZXJUaHJlYWRJZH0tJHt3b3JrZXJQcm9jZXNzSWR9YFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUZXN0RnJhbWV3b3JrU3RhdGUgfCBBdXRvbWF0aW9uRnJhbWV3b3JrU3RhdGV9IGZyYW1ld29ya1N0YXRlXG4gICAgICogQHBhcmFtIHtIb29rU3RhdGV9IGhvb2tTdGF0ZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldEhvb2tSZWdpc3RyeUtleShmcmFtZXdvcmtTdGF0ZTogU3RhdGUsIGhvb2tTdGF0ZTogU3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGAke2ZyYW1ld29ya1N0YXRlfToke2hvb2tTdGF0ZX1gXG4gICAgfVxuXG4gICAgc3RhdGljIG1hdGNoSG9va1JlZ2V4KGhvb2tTdGF0ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKFRlc3RGcmFtZXdvcmtDb25zdGFudHMuSE9PS19SRUdFWClcblxuICAgICAgICByZXR1cm4gcGF0dGVybi50ZXN0KGhvb2tTdGF0ZSlcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhcbiAgICAgICAgb2JzZXJ2YWJpbGl0eU9wdGlvbnM6IFRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyxcbiAgICAgICAgYnN0YWNrQnVpbGRUYWc/OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX1RBRy5zcGxpdCgnLCcpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkVGFnKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGRUYWdcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnN0YWNrQnVpbGRUYWcpIHtcbiAgICAgICAgICAgIHJldHVybiBbYnN0YWNrQnVpbGRUYWddXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgc3RhdGljIGNoZWNrQ0xJU3VwcG9ydGVkRnJhbWV3b3JrcyhmcmFtZXdvcms6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZnJhbWV3b3JrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLkNMSVN1cHBvcnRlZEZyYW1ld29ya3MuaW5jbHVkZXMoZnJhbWV3b3JrKVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBmZXRjaCBhcyB1bmRpY2lGZXRjaCwgdHlwZSBSZXF1ZXN0SW5pdCBhcyBVbmRpY2lSZXF1ZXN0SW5pdCwgUHJveHlBZ2VudCB9IGZyb20gJ3VuZGljaSdcblxuZXhwb3J0IGNsYXNzIFJlc3BvbnNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgcHVibGljIHJlc3BvbnNlOiBSZXNwb25zZVxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcmVzOiBSZXNwb25zZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKVxuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBmZXRjaFdyYXAoaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLCBpbml0PzogUmVxdWVzdEluaXQpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBfZmV0Y2goaW5wdXQsIGluaXQpXG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlRXJyb3IoYEVycm9yIHJlc3BvbnNlIGZyb20gc2VydmVyICR7cmVzLnN0YXR1c306ICAke2F3YWl0IHJlcy50ZXh0KCl9YCwgcmVzKVxuICAgIH1cbiAgICByZXR1cm4gcmVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZmV0Y2goaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLCBpbml0PzogUmVxdWVzdEluaXQpIHtcbiAgICBjb25zdCBwcm94eVVybCA9IHByb2Nlc3MuZW52LkhUVFBfUFJPWFkgfHwgcHJvY2Vzcy5lbnYuSFRUUFNfUFJPWFlcbiAgICBpZiAocHJveHlVcmwpIHtcbiAgICAgICAgY29uc3Qgbm9Qcm94eSA9IHByb2Nlc3MuZW52Lk5PX1BST1hZICYmIHByb2Nlc3MuZW52Lk5PX1BST1hZLnRyaW0oKVxuICAgICAgICAgICAgPyBwcm9jZXNzLmVudi5OT19QUk9YWS50cmltKCkuc3BsaXQoL1tcXHMsO10rLylcbiAgICAgICAgICAgIDogW11cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0KVxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgICAgICBpZiAoIW5vUHJveHkuc29tZSgoc3RyKSA9PiB1cmwuaG9zdG5hbWUuZW5kc1dpdGgoc3RyKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRpY2lGZXRjaChcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnVybCxcbiAgICAgICAgICAgICAgICB7IC4uLihpbml0IGFzIFVuZGljaVJlcXVlc3RJbml0KSwgZGlzcGF0Y2hlcjogbmV3IFByb3h5QWdlbnQocHJveHlVcmwpIH0sXG4gICAgICAgICAgICApIGFzIHVua25vd24gYXMgUHJvbWlzZTxSZXNwb25zZT5cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpXG59XG4iLCAiZXhwb3J0IGNvbnN0IEVWRU5UUyA9IHtcbiAgICBTREtfU0VUVVA6ICdzZGs6c2V0dXAnLFxuICAgIFNES19DTEVBTlVQOiAnc2RrOmNsZWFudXAnLFxuICAgIFNES19QUkVfVEVTVDogJ3NkazpwcmUtdGVzdCcsXG4gICAgU0RLX1RFU1Q6ICdzZGs6dGVzdCcsXG4gICAgU0RLX1BPU1RfVEVTVDogJ3Nkazpwb3N0LXRlc3QnLFxuICAgIFNES19IT09LOiAnc2RrOmhvb2snLFxuICAgIFNES19EUklWRVI6ICdzZGs6ZHJpdmVyJyxcbiAgICBTREtfQTExWTogJ3NkazphMTF5JyxcbiAgICBTREtfTzExWTogJ3NkazpvMTF5JyxcbiAgICBTREtfQVVUT19DQVBUVVJFOiAnc2RrOmF1dG8tY2FwdHVyZScsXG4gICAgU0RLX1BST1hZX1NFVFVQOiAnc2RrOnByb3h5LXNldHVwJyxcbiAgICBTREtfVEVTVEhVQjogJ3Nkazp0ZXN0aHViJyxcbiAgICBTREtfQVVUT01BVEU6ICdzZGs6YXV0b21hdGUnLFxuICAgIFNES19BUFBfQVVUT01BVEU6ICdzZGs6YXBwLWF1dG9tYXRlJyxcbiAgICBTREtfVFVSQk9TQ0FMRTogJ3Nkazp0dXJib3NjYWxlJyxcbiAgICBTREtfUEVSQ1k6ICdzZGs6cGVyY3knLFxuICAgIFNES19QUkVfSU5JVElBTElaRTogJ3Nkazpkcml2ZXI6cHJlLWluaXRpYWxpemF0aW9uJyxcbiAgICBTREtfUE9TVF9JTklUSUFMSVpFOiAnc2RrOmRyaXZlcjpwb3N0LWluaXRpYWxpemF0aW9uJyxcbiAgICBTREtfQ0xJX0NIRUNLX1VQREFURTogJ3NkazpjbGk6Y2hlY2stdXBkYXRlJyxcbiAgICBTREtfQ0xJX0RPV05MT0FEOiAnc2RrOmNsaTpkb3dubG9hZCcsXG4gICAgU0RLX0NMSV9PTl9CT09UU1RSQVA6ICdzZGs6Y2xpOm9uLWJvb3RzdHJhcCcsXG4gICAgU0RLX0NMSV9PTl9DT05ORUNUOiAnc2RrOmNsaTpvbi1jb25uZWN0JyxcbiAgICBTREtfQ0xJX1NUQVJUOiAnc2RrOmNsaTpzdGFydCcsXG4gICAgU0RLX0NMSV9PTl9TVE9QOiAnc2RrOmNsaTpvbi1zdG9wJyxcbiAgICBTREtfQ09OTkVDVF9CSU5fU0VTU0lPTjogJ3Nkazpjb25uZWN0QmluU2Vzc2lvbicsXG4gICAgU0RLX1NUQVJUX0JJTl9TRVNTSU9OOiAnc2RrOnN0YXJ0QmluU2Vzc2lvbicsXG4gICAgLy8gTmV3IGV2ZW50cyBmcm9tIFB5dGhvbiBTREtcbiAgICBTREtfRFJJVkVSX0lOSVQ6ICdzZGs6ZHJpdmVySW5pdCcsXG4gICAgU0RLX0ZJTkRfTkVBUkVTVF9IVUI6ICdzZGs6ZmluZE5lYXJlc3RIdWInLFxuICAgIFNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19JTklUOiAnc2RrOmF1dG9tYXRpb25GcmFtZXdvcmtJbml0JyxcbiAgICBTREtfQVVUT01BVElPTl9GUkFNRVdPUktfU1RBUlQ6ICdzZGs6YXV0b21hdGlvbkZyYW1ld29ya1N0YXJ0JyxcbiAgICBTREtfQVVUT01BVElPTl9GUkFNRVdPUktfU1RPUDogJ3NkazphdXRvbWF0aW9uRnJhbWV3b3JrU3RvcCcsXG4gICAgU0RLX0FDQ0VTU0lCSUxJVFlfQ09ORklHOiAnc2RrOmFjY2Vzc2liaWxpdHlDb25maWcnLFxuICAgIFNES19PQlNFUlZBQklMSVRZX0NPTkZJRzogJ3NkazpvYnNlcnZhYmlsaXR5Q29uZmlnJyxcbiAgICBTREtfQUlfU0VMRl9IRUFMX1NURVA6ICdzZGs6YWlTZWxmSGVhbFN0ZXAnLFxuICAgIFNES19BSV9TRUxGX0hFQUxfR0VUX1JFU1VMVDogJ3NkazphaVNlbGZIZWFsR2V0UmVzdWx0JyxcbiAgICBTREtfVEVTVF9GUkFNRVdPUktfRVZFTlQ6ICdzZGs6dGVzdEZyYW1ld29ya0V2ZW50JyxcbiAgICBTREtfVEVTVF9TRVNTSU9OX0VWRU5UOiAnc2RrOnRlc3RTZXNzaW9uRXZlbnQnLFxuICAgIFNES19DTElfTE9HX0NSRUFURURfRVZFTlQ6ICdzZGs6Y2xpOmxvZ0NyZWF0ZWRFdmVudCcsXG4gICAgU0RLX0NMSV9FTlFVRVVFX1RFU1RfRVZFTlQ6ICdzZGs6Y2xpOmVucXVldWVUZXN0RXZlbnQnLFxuICAgIFNES19PTl9TVE9QOiAnc2RrOm9uU3RvcCcsXG4gICAgU0RLX1NFTkRfTE9HUzogJ3NkazpzZW5kbG9ncycsXG4gICAgLy8gRnVubmVsIEV2ZW50c1xuICAgIFNES19GVU5ORUxfVEVTVF9BVFRFTVBURUQ6ICdzZGs6ZnVubmVsOnRlc3QtYXR0ZW1wdGVkJyxcbiAgICBTREtfRlVOTkVMX1RFU1RfU1VDQ0VTU0ZVTDogJ3NkazpmdW5uZWw6dGVzdC1zdWNjZXNzZnVsJyxcbiAgICAvLyBMb2cgVXBsb2FkIEV2ZW50c1xuICAgIFNES19VUExPQURfTE9HUzogJ3Nkazp1cGxvYWQtbG9ncycsXG4gICAgLy8gS2V5IE1ldHJpY3MgRXZlbnRzXG4gICAgU0RLX1NFTkRfS0VZX01FVFJJQ1M6ICdzZGs6c2VuZC1rZXktbWV0cmljcycsXG4gICAgU0RLX0tFWV9NRVRSSUNTX1BSRVBBUkFUSU9OOiAnc2RrOmtleS1tZXRyaWNzOnByZXBhcmF0aW9uJyxcbiAgICBTREtfS0VZX01FVFJJQ1NfVVBMT0FEOiAnc2RrOmtleS1tZXRyaWNzOnVwbG9hZCcsXG4gICAgLy8gQ0xJIEJpbmFyeSBFdmVudHNcbiAgICBTREtfQ0xJX0RPV05MT0FEX0JJTkFSWTogJ3NkazpjbGk6ZG93bmxvYWQtYmluYXJ5JyxcbiAgICBTREtfQ0xJX0JJTkFSWV9WRVJJRklDQVRJT046ICdzZGs6Y2xpOmJpbmFyeS12ZXJpZmljYXRpb24nLFxuICAgIC8vIENsZWFudXAgJiBTaHV0ZG93biBFdmVudHMgKHRyYWNraW5nIGdhcCBiZXR3ZWVuIGRyaXZlcjpxdWl0IGFuZCBmdW5uZWw6dGVzdC1zdWNjZXNzZnVsKVxuICAgIFNES19MSVNURU5FUl9XT1JLRVJfRU5EOiAnc2RrOmxpc3RlbmVyOndvcmtlci1lbmQnLFxuICAgIFNES19QRVJDWV9URUFSRE9XTjogJ3NkazpwZXJjeTp0ZWFyZG93bicsXG4gICAgU0RLX1dPUktFUl9TQVZFX0RBVEE6ICdzZGs6d29ya2VyOnNhdmUtZGF0YScsXG4gICAgU0RLX1BFUkZPUk1BTkNFX1JFUE9SVF9HRU46ICdzZGs6cGVyZm9ybWFuY2U6cmVwb3J0LWdlbmVyYXRpb24nLFxuICAgIFNES19QRVJGT1JNQU5DRV9KU09OX1dSSVRFOiAnc2RrOnBlcmZvcm1hbmNlOmpzb24td3JpdGUnLFxuICAgIFNES19QRVJGT1JNQU5DRV9IVE1MX0dFTjogJ3NkazpwZXJmb3JtYW5jZTpodG1sLWdlbmVyYXRpb24nLFxuICAgIC8vIERldmljZSBBbGxvY2F0aW9uIEV2ZW50ICh0cmFja2luZyBnYXAgYmV0d2VlbiBiZWZvcmVTZXNzaW9uIGFuZCBiZWZvcmUgaG9va3MpXG4gICAgU0RLX0RFVklDRV9BTExPQ0FUSU9OOiAnc2RrOmRldmljZS1hbGxvY2F0aW9uJ1xufVxuXG5leHBvcnQgY29uc3QgVEVTVEhVQl9FVkVOVFMgPSB7XG4gICAgU1RBUlQ6IGAke0VWRU5UUy5TREtfVEVTVEhVQn06c3RhcnRgLFxuICAgIFNUT1A6IGAke0VWRU5UUy5TREtfVEVTVEhVQn06c3RvcGBcbn1cblxuZXhwb3J0IGNvbnN0IEFVVE9NQVRFX0VWRU5UUyA9IHtcbiAgICBLRUVQX0FMSVZFOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTprZWVwLWFsaXZlYCxcbiAgICBIVUJfTUFOQUdFTUVOVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06aHViLW1hbmFnZW1lbnRgLFxuICAgIExPQ0FMX1NUQVJUOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpsb2NhbC1zdGFydGAsXG4gICAgTE9DQUxfU1RPUDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06bG9jYWwtc3RvcGAsXG4gICAgRFJJVkVSX01BTkFHRTogYCR7RVZFTlRTLlNES19BVVRPTUFURX06ZHJpdmVyLW1hbmFnZWAsXG4gICAgU0VTU0lPTl9OQU1FOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLW5hbWVgLFxuICAgIFNFU1NJT05fU1RBVFVTOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLXN0YXR1c2AsXG4gICAgU0VTU0lPTl9BTk5PVEFUSU9OOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLWFubm90YXRpb25gLFxuICAgIElETEVfVElNRU9VVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06aWRsZS10aW1lb3V0YCxcbiAgICBHRU5FUkFURV9DSV9BUlRJRkFDVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06Y2ktYXJ0aWZhY3RzYCxcbiAgICBQUklOVF9CVUlMRExJTks6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OnByaW50LWJ1aWxkbGlua2Bcbn1cblxuZXhwb3J0IGNvbnN0IEExMVlfRVZFTlRTID0ge1xuICAgIFBFUkZPUk1fU0NBTjogYCR7RVZFTlRTLlNES19BMTFZfTpkcml2ZXItcGVyZm9ybXNjYW5gLFxuICAgIFNBVkVfUkVTVUxUUzogYCR7RVZFTlRTLlNES19BMTFZfTpzYXZlLXJlc3VsdHNgLFxuICAgIEdFVF9SRVNVTFRTOiBgJHtFVkVOVFMuU0RLX0ExMVl9OmdldC1hY2Nlc3NpYmlsaXR5LXJlc3VsdHNgLFxuICAgIEdFVF9SRVNVTFRTX1NVTU1BUlk6IGAke0VWRU5UUy5TREtfQTExWX06Z2V0LWFjY2Vzc2liaWxpdHktcmVzdWx0cy1zdW1tYXJ5YFxufVxuXG5leHBvcnQgY29uc3QgUEVSQ1lfRVZFTlRTID0ge1xuICAgIERPV05MT0FEOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpkb3dubG9hZGAsXG4gICAgU0NSRUVOU0hPVDogYCR7RVZFTlRTLlNES19QRVJDWX06c2NyZWVuc2hvdGAsXG4gICAgU1RBUlQ6IGAke0VWRU5UUy5TREtfUEVSQ1l9OnN0YXJ0YCxcbiAgICBTVE9QOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpzdG9wYCxcbiAgICBBVVRPX0NBUFRVUkU6IGAke0VWRU5UUy5TREtfUEVSQ1l9OmF1dG8tY2FwdHVyZWAsXG4gICAgU05BUFNIT1Q6IGAke0VWRU5UUy5TREtfUEVSQ1l9OnNuYXBzaG90YCxcbiAgICBTQ1JFRU5TSE9UX0FQUDogYCR7RVZFTlRTLlNES19QRVJDWX06c2NyZWVuc2hvdC1hcHBgXG59XG5cbmV4cG9ydCBjb25zdCBPMTFZX0VWRU5UUyA9IHtcbiAgICBTWU5DOiBgJHtFVkVOVFMuU0RLX08xMVl9OnN5bmNgLFxuICAgIFRBS0VfU0NSRUVOU0hPVDogYCR7RVZFTlRTLlNES19PMTFZfTpkcml2ZXItdGFrZVNjcmVlblNob3RgLFxuICAgIFBSSU5UX0JVSUxETElOSzogYCR7RVZFTlRTLlNES19PMTFZfTpwcmludC1idWlsZGxpbmtgXG59XG5cbmV4cG9ydCBjb25zdCBIT09LX0VWRU5UUyA9IHtcbiAgICBCRUZPUkVfRUFDSDogYCR7RVZFTlRTLlNES19IT09LfTpiZWZvcmUtZWFjaGAsXG4gICAgQUZURVJfRUFDSDogYCR7RVZFTlRTLlNES19IT09LfTphZnRlci1lYWNoYCxcbiAgICBBRlRFUl9BTEw6IGAke0VWRU5UUy5TREtfSE9PS306YWZ0ZXItYWxsYCxcbiAgICBCRUZPUkVfQUxMOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmJlZm9yZS1hbGxgLFxuICAgIEJFRk9SRTogYCR7RVZFTlRTLlNES19IT09LfTpiZWZvcmVgLFxuICAgIEFGVEVSOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmFmdGVyYFxufVxuXG5leHBvcnQgY29uc3QgVFVSQk9TQ0FMRV9FVkVOVFMgPSB7XG4gICAgSFVCX01BTkFHRU1FTlQ6IGAke0VWRU5UUy5TREtfVFVSQk9TQ0FMRX06aHViLW1hbmFnZW1lbnRgLFxuICAgIFBSSU5UX0JVSUxETElOSzogYCR7RVZFTlRTLlNES19UVVJCT1NDQUxFfTpwcmludC1idWlsZGxpbmtgXG59XG5cbmV4cG9ydCBjb25zdCBBUFBfQVVUT01BVEVfRVZFTlRTID0ge1xuICAgIEFQUF9VUExPQUQ6IGAke0VWRU5UUy5TREtfQVBQX0FVVE9NQVRFfTphcHAtdXBsb2FkYFxufVxuXG5leHBvcnQgY29uc3QgRFJJVkVSX0VWRU5UID0ge1xuICAgIFFVSVQ6IGAke0VWRU5UUy5TREtfRFJJVkVSfTpxdWl0YCxcbiAgICBHRVQ6IGAke0VWRU5UUy5TREtfRFJJVkVSfTpnZXRgLFxuICAgIFBSRV9FWEVDVVRFOiBgJHtFVkVOVFMuU0RLX0RSSVZFUn06cHJlLWV4ZWN1dGVgLFxuICAgIFBPU1RfRVhFQ1VURTogYCR7RVZFTlRTLlNES19EUklWRVJ9OnBvc3QtZXhlY3V0ZWAsXG4gICAgSU5JVDogRVZFTlRTLlNES19EUklWRVJfSU5JVCxcbiAgICBQUkVfSU5JVElBTElaRTogRVZFTlRTLlNES19QUkVfSU5JVElBTElaRSxcbiAgICBQT1NUX0lOSVRJQUxJWkU6IEVWRU5UUy5TREtfUE9TVF9JTklUSUFMSVpFXG59XG5cbi8qKlxuICogRnJhbWV3b3JrIGxpZmVjeWNsZSBldmVudHMgZm9yIGF1dG9tYXRpb24gZnJhbWV3b3JrIHRyYWNraW5nXG4gKi9cbmV4cG9ydCBjb25zdCBGUkFNRVdPUktfRVZFTlRTID0ge1xuICAgIElOSVQ6IEVWRU5UUy5TREtfQVVUT01BVElPTl9GUkFNRVdPUktfSU5JVCxcbiAgICBTVEFSVDogRVZFTlRTLlNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19TVEFSVCxcbiAgICBTVE9QOiBFVkVOVFMuU0RLX0FVVE9NQVRJT05fRlJBTUVXT1JLX1NUT1Bcbn1cblxuLyoqXG4gKiBNb2R1bGUgY29uZmlndXJhdGlvbiBldmVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IENPTkZJR19FVkVOVFMgPSB7XG4gICAgQUNDRVNTSUJJTElUWTogRVZFTlRTLlNES19BQ0NFU1NJQklMSVRZX0NPTkZJRyxcbiAgICBPQlNFUlZBQklMSVRZOiBFVkVOVFMuU0RLX09CU0VSVkFCSUxJVFlfQ09ORklHXG59XG5cbi8qKlxuICogQUkgc2VsZi1oZWFsaW5nIGV2ZW50c1xuICovXG5leHBvcnQgY29uc3QgQUlfRVZFTlRTID0ge1xuICAgIFNFTEZfSEVBTF9TVEVQOiBFVkVOVFMuU0RLX0FJX1NFTEZfSEVBTF9TVEVQLFxuICAgIFNFTEZfSEVBTF9HRVRfUkVTVUxUOiBFVkVOVFMuU0RLX0FJX1NFTEZfSEVBTF9HRVRfUkVTVUxUXG59XG5cbi8qKlxuICogRXZlbnQgZGlzcGF0Y2hlciBldmVudHMgZm9yIHRlc3QgZnJhbWV3b3JrIGFuZCBzZXNzaW9uIHRyYWNraW5nXG4gKi9cbmV4cG9ydCBjb25zdCBESVNQQVRDSEVSX0VWRU5UUyA9IHtcbiAgICBURVNUX0ZSQU1FV09SSzogRVZFTlRTLlNES19URVNUX0ZSQU1FV09SS19FVkVOVCxcbiAgICBURVNUX1NFU1NJT046IEVWRU5UUy5TREtfVEVTVF9TRVNTSU9OX0VWRU5ULFxuICAgIExPR19DUkVBVEVEOiBFVkVOVFMuU0RLX0NMSV9MT0dfQ1JFQVRFRF9FVkVOVCxcbiAgICBFTlFVRVVFX1RFU1Q6IEVWRU5UUy5TREtfQ0xJX0VOUVVFVUVfVEVTVF9FVkVOVFxufVxuXG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5cbmltcG9ydCBsb2dnZXIgZnJvbSAnQHdkaW8vbG9nZ2VyJ1xuXG5pbXBvcnQgeyBMT0dTX0ZJTEUgfSBmcm9tICcuLi9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tICcuLi91dGlsLmpzJ1xuXG5jb25zdCBsb2cgPSBsb2dnZXIoJ0B3ZGlvL2Jyb3dzZXJzdGFjay1zZXJ2aWNlL2NsaScpXG5cbmV4cG9ydCBjbGFzcyBCU3RhY2tMb2dnZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgTE9HU19GSUxFKVxuICAgIHB1YmxpYyBzdGF0aWMgbG9nRm9sZGVyUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycpXG4gICAgcHJpdmF0ZSBzdGF0aWMgbG9nRmlsZVN0cmVhbTogZnMuV3JpdGVTdHJlYW0gfCBudWxsXG5cbiAgICBzdGF0aWMgbG9nVG9GaWxlKGxvZ01lc3NhZ2U6IHN0cmluZywgbG9nTGV2ZWw6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmxvZ0ZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuc3VyZUxvZ3NGb2xkZXIoKVxuICAgICAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRoaXMubG9nRmlsZVBhdGgsIHsgZmxhZ3M6ICdhJyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubG9nRmlsZVN0cmVhbSAmJiB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGUodGhpcy5mb3JtYXRMb2cobG9nTWVzc2FnZSwgbG9nTGV2ZWwpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nLmRlYnVnKGBGYWlsZWQgdG8gbG9nIHRvIGZpbGUuIEVycm9yICR7ZXJyb3J9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGZvcm1hdExvZyhsb2dNZXNzYWdlOiBzdHJpbmcsIGxldmVsOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGAke2NoYWxrLmdyYXkobmV3IERhdGUoKS50b0lTT1N0cmluZygpKX0gJHtjaGFsa1tDT0xPUlNbbGV2ZWxdXShsZXZlbC50b1VwcGVyQ2FzZSgpKX0gJHtjaGFsay53aGl0ZUJyaWdodCgnQHdkaW8vYnJvd3NlcnN0YWNrLXNlcnZpY2UnKX0gJHtsb2dNZXNzYWdlfVxcbmBcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGluZm8obWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9nVG9GaWxlKG1lc3NhZ2UsICdpbmZvJylcbiAgICAgICAgbG9nLmluZm8obWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAnZXJyb3InKVxuICAgICAgICBsb2cuZXJyb3IobWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgcGFyYW0/OiB1bmtub3duKSB7XG4gICAgICAgIHRoaXMubG9nVG9GaWxlKG1lc3NhZ2UsICdkZWJ1ZycpXG4gICAgICAgIGlmIChwYXJhbSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UsIHBhcmFtKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHdhcm4obWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9nVG9GaWxlKG1lc3NhZ2UsICd3YXJuJylcbiAgICAgICAgbG9nLndhcm4obWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRyYWNlKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAndHJhY2UnKVxuICAgICAgICBsb2cudHJhY2UobWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyTG9nZ2VyKCkge1xuICAgICAgICBpZiAodGhpcy5sb2dGaWxlU3RyZWFtKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0uZW5kKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0gPSBudWxsXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckxvZ0ZpbGUoKSB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMubG9nRmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBmcy50cnVuY2F0ZVN5bmModGhpcy5sb2dGaWxlUGF0aClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW5zdXJlTG9nc0ZvbGRlcigpIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMubG9nRm9sZGVyUGF0aCkpe1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMubG9nRm9sZGVyUGF0aClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgVGVzdEZyYW1ld29ya0NvbnN0YW50cyA9IHtcbiAgICBLRVlfVEVTVF9VVUlEOiAndGVzdF91dWlkJyxcbiAgICBLRVlfVEVTVF9JRCA6ICd0ZXN0X2lkJyxcbiAgICBLRVlfVEVTVF9OQU1FIDogJ3Rlc3RfbmFtZScsXG4gICAgS0VZX1RFU1RfRklMRV9QQVRIIDogJ3Rlc3RfZmlsZV9wYXRoJyxcbiAgICBLRVlfVEVTVF9UQUdTIDogJ3Rlc3RfdGFncycsXG4gICAgS0VZX1RFU1RfUkVTVUxUIDogJ3Rlc3RfcmVzdWx0JyxcbiAgICBLRVlfVEVTVF9SRVNVTFRfQVQgOiAndGVzdF9yZXN1bHRfYXQnLFxuICAgIEtFWV9URVNUX1NUQVJURURfQVQgOiAndGVzdF9zdGFydGVkX2F0JyxcbiAgICBLRVlfVEVTVF9FTkRFRF9BVCA6ICd0ZXN0X2VuZGVkX2F0JyxcbiAgICBLRVlfVEVTVF9MT0NBVElPTiA6ICd0ZXN0X2xvY2F0aW9uJyxcbiAgICBLRVlfVEVTVF9TQ09QRSA6ICd0ZXN0X3Njb3BlJyxcbiAgICBLRVlfVEVTVF9TQ09QRVMgOiAndGVzdF9zY29wZXMnLFxuICAgIEtFWV9URVNUX0ZSQU1FV09SS19OQU1FIDogJ3Rlc3RfZnJhbWV3b3JrX25hbWUnLFxuICAgIEtFWV9URVNUX0ZSQU1FV09SS19WRVJTSU9OIDogJ3Rlc3RfZnJhbWV3b3JrX3ZlcnNpb24nLFxuICAgIEtFWV9URVNUX0NPREUgOiAndGVzdF9jb2RlJyxcbiAgICBLRVlfVEVTVF9SRVJVTl9OQU1FIDogJ3Rlc3RfcmVydW5fbmFtZScsXG4gICAgS0VZX1BMQVRGT1JNX0lOREVYIDogJ3BsYXRmb3JtX2luZGV4JyxcbiAgICBLRVlfVEVTVF9GQUlMVVJFIDogJ3Rlc3RfZmFpbHVyZScsXG4gICAgS0VZX1RFU1RfRkFJTFVSRV9UWVBFIDogJ3Rlc3RfZmFpbHVyZV90eXBlJyxcbiAgICBLRVlfVEVTVF9GQUlMVVJFX1JFQVNPTiA6ICd0ZXN0X2ZhaWx1cmVfcmVhc29uJyxcbiAgICBLRVlfVEVTVF9MT0dTIDogJ3Rlc3RfbG9ncycsXG4gICAgS0VZX1RFU1RfTUVUQSA6ICd0ZXN0X21ldGEnLFxuICAgIEtFWV9DVVNUT01fVEFHUyA6ICdjdXN0b21fbWV0YWRhdGEnLFxuICAgIEtFWV9URVNUX0RFRkVSUkVEIDogJ3Rlc3RfZGVmZXJyZWQnLFxuICAgIEtFWV9TRVNTSU9OX05BTUUgOiAndGVzdF9zZXNzaW9uX25hbWUnLFxuICAgIEtFWV9BVVRPTUFURV9TRVNTSU9OX05BTUUgOiAnYXV0b21hdGVfc2Vzc2lvbl9uYW1lJyxcbiAgICBLRVlfQVVUT01BVEVfU0VTU0lPTl9TVEFUVVM6ICdhdXRvbWF0ZV9zZXNzaW9uX3N0YXR1cycsXG4gICAgS0VZX0FVVE9NQVRFX1NFU1NJT05fUkVBU09OOiAnYXV0b21hdGVfc2Vzc2lvbl9yZWFzb24nLFxuICAgIEtFWV9FVkVOVF9TVEFSVEVEX0FUIDogJ2V2ZW50X3N0YXJ0ZWRfYXQnLFxuICAgIEtFWV9FVkVOVF9FTkRFRF9BVCA6ICdldmVudF9lbmRlZF9hdCcsXG4gICAgS0VZX0hPT0tfSUQgOiAnaG9va19pZCcsXG4gICAgS0VZX0hPT0tfUkVTVUxUIDogJ2hvb2tfcmVzdWx0JyxcbiAgICBLRVlfSE9PS19MT0dTIDogJ2hvb2tfbG9ncycsXG4gICAgS0VZX0hPT0tfTkFNRSA6ICdob29rX25hbWUnLFxuICAgIEtFWV9IT09LU19TVEFSVEVEOiAndGVzdF9ob29rc19zdGFydGVkJyxcbiAgICBLRVlfSE9PS1NfRklOSVNIRUQ6ICd0ZXN0X2hvb2tzX2ZpbmlzaGVkJyxcbiAgICBERUZBVUxUX1RFU1RfUkVTVUxUIDogJ3BlbmRpbmcnLFxuICAgIERFRkFVTFRfSE9PS19SRVNVTFQgOiAncGVuZGluZycsXG4gICAgS0lORF9TQ1JFRU5TSE9UIDogJ1RFU1RfU0NSRUVOU0hPVCcsXG4gICAgS0lORF9MT0cgOiAnVEVTVF9MT0cnLFxuICAgIEhPT0tfUkVHRVggOiAnXihCRUZPUkVffEFGVEVSXyknLFxufVxuIiwgIlxuaW1wb3J0IHsgQlJPV1NFUlNUQUNLX1BFUkNZLCBCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSwgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFkgfSBmcm9tICcuLi9jb25zdGFudHMuanMnXG5pbXBvcnQgdHlwZSBCcm93c2VyU3RhY2tDb25maWcgZnJvbSAnLi4vY29uZmlnLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHsgaXNUcnVlLCBpc0xvYWRUZXN0aW5nU2Vzc2lvbiB9IGZyb20gJy4uL3V0aWwuanMnXG5cbmludGVyZmFjZSBFcnJvclR5cGUge1xuICAgIGtleTogc3RyaW5nXG4gICAgbWVzc2FnZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JzIHtcbiAgICBlcnJvcnM6IEVycm9yVHlwZVtdXG59XG5cbmV4cG9ydCBjb25zdCBnZXRQcm9kdWN0TWFwID0gKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPT4ge1xuICAgIC8vIExUUyBnYXRpbmc6IHVuZGVyIExUUywgYXV0b21hdGUgaXMgZm9yY2VkIGZhbHNlIChMVFMgYnVpbGRzIHJvdXRlIHRvXG4gICAgLy8gdGhlIExUUyBpbnRlcm5hbCBodWI7IGtlZXBpbmcgYXV0b21hdGU9dHJ1ZSB0YWdzIFRlc3RIdWIgc291cmNlIGFzXG4gICAgLy8gVE8sQVVULExUUyBpbnN0ZWFkIG9mIFRPLExUUyBcdTIwMTQgc2VlIHB5LXNkayBlYTUzZDkxNCkuIFRoZSBgbHRzYCBrZXlcbiAgICAvLyBpdHNlbGYgaXMgb25seSBlbWl0dGVkIHVuZGVyIExUUyBzbyBub24tTFRTIHBheWxvYWRzIHN0YXkgYnl0ZS1cbiAgICAvLyBpZGVudGljYWwgdG8gdGhlIHByZS1MVFMtUFIgc2hhcGUgKGF2b2lkcyBzdXJwcmlzaW5nIGFueSBiYWNrZW5kIHdpdGhcbiAgICAvLyBzdHJpY3QgdW5rbm93bi1rZXkgdmFsaWRhdGlvbikuXG4gICAgY29uc3QgbHRzID0gaXNMb2FkVGVzdGluZ1Nlc3Npb24oKVxuICAgIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIGJvb2xlYW4gfCB1bmRlZmluZWRdW10gPSBbXG4gICAgICAgIFsnb2JzZXJ2YWJpbGl0eScsIGNvbmZpZy50ZXN0T2JzZXJ2YWJpbGl0eS5lbmFibGVkXSxcbiAgICAgICAgWydhY2Nlc3NpYmlsaXR5JywgISFjb25maWcuYWNjZXNzaWJpbGl0eV0sXG4gICAgICAgIFsncGVyY3knLCBjb25maWcucGVyY3ldLFxuICAgICAgICBbJ2F1dG9tYXRlJywgbHRzID8gZmFsc2UgOiBjb25maWcuYXV0b21hdGVdLFxuICAgICAgICBbJ2FwcF9hdXRvbWF0ZScsIGNvbmZpZy5hcHBBdXRvbWF0ZV0sXG4gICAgXVxuICAgIGlmIChsdHMpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKFsnbHRzJywgdHJ1ZV0pXG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcy5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSBudWxsKSkgYXMgeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFByb2Nlc3NFdmVudEZvclRlc3RodWIgPSAoZXZlbnRUeXBlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAvLyBMVFMgc2hvcnQtY2lyY3VpdDogd2hlbiBydW5uaW5nIGFzIGFuIExUUyBsb2FkIHRlc3QgKEJST1dTRVJTVEFDS19MVFM9dHJ1ZVxuICAgIC8vIGZvciBsb2NhbCByZXBybywgb3IgQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEIHNldCBieSB0aGUgcG9kKSwgVGVzdEh1YlxuICAgIC8vIGV2ZW50IGVtaXNzaW9uIG11c3QgYWx3YXlzIGZsb3cgcmVnYXJkbGVzcyBvZiB0aGUgb2JzZXJ2YWJpbGl0eSAvXG4gICAgLy8gYWNjZXNzaWJpbGl0eSAvIHBlcmN5IGVudiBmbGFncy4gUG9kIHJ1bnMgZG8gZXhwb3J0XG4gICAgLy8gQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFksIGJ1dCB0aGUgbG9jYWwtcmVwcm8gZmxhZyBwYXRoIGRvZXNuJ3RcbiAgICAvLyBndWFyYW50ZWUgaXQgXHUyMDE0IHdpdGhvdXQgdGhpcyBzaG9ydC1jaXJjdWl0LCBnZXRQcm9kdWN0TWFwIGNvcnJlY3RseVxuICAgIC8vIGVtaXRzIGx0czogdHJ1ZSB3aGlsZSBldmVyeSBvblRlc3RTdGFydCAvIG9uVGVzdEVuZCAvIG9uSG9va1N0YXJ0XG4gICAgLy8gc2lsZW50bHkgbm8tb3BzLiBNaXJyb3Igb2YgdGhlIHVuY29uZGl0aW9uYWwgTFRTIGV2ZW50IGZsb3cgaW4gcHktc2RrJ3NcbiAgICAvLyBzaG91bGRfc2VuZF9ldmVudF9mb3JfdGVzdGh1YigpIChQUiAjOTkzKS5cbiAgICBpZiAoaXNMb2FkVGVzdGluZ1Nlc3Npb24oKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAoaXNUcnVlKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgaWYgKGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfQUNDRVNTSUJJTElUWV0pKSB7XG4gICAgICAgIHJldHVybiAhKFsnSG9va1J1blN0YXJ0ZWQnLCAnSG9va1J1bkZpbmlzaGVkJywgJ0xvZ0NyZWF0ZWQnXS5pbmNsdWRlcyhldmVudFR5cGUpKVxuICAgIH1cbiAgICBpZiAoaXNUcnVlKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19QRVJDWV0pICYmIGV2ZW50VHlwZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgLy8gRXZhbHVhdGUgd2l0aCBpc1RydWUgc28gYSBwcm9kdWN0IGZsYWcgZXhwbGljaXRseSBzZXQgdG8gdGhlIHN0cmluZyAnZmFsc2UnXG4gICAgLy8gKGUuZy4gb2JzZXJ2YWJpbGl0eSB0dXJuZWQgb2ZmIGFmdGVyIGEgZmFpbGVkL2Jsb2NrZWQgYnVpbGQtc3RhcnQpIHJlYWRzIGFzXG4gICAgLy8gb2ZmLiBSYXcgQm9vbGVhbignZmFsc2UnKSBpcyB0cnV0aHksIHdoaWNoIGtlcHQgZXZlbnRzIGZsb3dpbmcgZm9yIGFuXG4gICAgLy8gb2JzZXJ2YWJpbGl0eS1vbmx5IHNlc3Npb24gZXZlbiBhZnRlciB0aGUgZmxhZyB3YXMgZGlzYWJsZWQuXG4gICAgcmV0dXJuIGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfQUNDRVNTSUJJTElUWV0pIHx8IGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWV0pIHx8IGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfUEVSQ1ldKVxufVxuXG5leHBvcnQgY29uc3QgaGFuZGxlRXJyb3JGb3JPYnNlcnZhYmlsaXR5ID0gKGVycm9yOiBFcnJvcnMgfCBudWxsKTogdm9pZCA9PiB7XG4gICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFldID0gJ2ZhbHNlJ1xuICAgIGxvZ0J1aWxkRXJyb3IoZXJyb3IsICdUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzJylcbn1cblxuZXhwb3J0IGNvbnN0IGhhbmRsZUVycm9yRm9yQWNjZXNzaWJpbGl0eSA9IChlcnJvcjogRXJyb3JzIHwgbnVsbCk6IHZvaWQgPT4ge1xuICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19BQ0NFU1NJQklMSVRZXSA9ICdmYWxzZSdcbiAgICBsb2dCdWlsZEVycm9yKGVycm9yLCAnYWNjZXNzaWJpbGl0eScpXG59XG5cbmV4cG9ydCBjb25zdCBsb2dCdWlsZEVycm9yID0gKGVycm9yOiBFcnJvcnMgfCBudWxsLCBwcm9kdWN0OiBzdHJpbmcgPSAnJyk6IHZvaWQgPT4ge1xuICAgIGlmICghZXJyb3IgfHwgIWVycm9yLmVycm9ycykge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYCR7cHJvZHVjdC50b1VwcGVyQ2FzZSgpfSBCdWlsZCBjcmVhdGlvbiBmYWlsZWQgJHtlcnJvciF9YClcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlcnJvckpzb24gb2YgZXJyb3IuZXJyb3JzKSB7XG4gICAgICAgIGNvbnN0IGVycm9yVHlwZSA9IGVycm9ySnNvbi5rZXlcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3JKc29uLm1lc3NhZ2VcbiAgICAgICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0VSUk9SX0lOVkFMSURfQ1JFREVOVElBTFMnOlxuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ0VSUk9SX0FDQ0VTU19ERU5JRUQnOlxuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSAnRVJST1JfU0RLX0RFUFJFQ0FURUQnOlxuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFByb2R1Y3RNYXBGb3JCdWlsZFN0YXJ0Q2FsbCA9IChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgYWNjZXNzaWJpbGl0eUF1dG9tYXRpb24/OiBib29sZWFuIHwgbnVsbCk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0+IHtcbiAgICAvLyBMVFMgZ2F0aW5nOiB1bmRlciBMVFMsIGF1dG9tYXRlIGlzIGZvcmNlZCBmYWxzZSAoTFRTIGJ1aWxkcyByb3V0ZSB0b1xuICAgIC8vIHRoZSBMVFMgaW50ZXJuYWwgaHViOyBrZWVwaW5nIGF1dG9tYXRlPXRydWUgdGFncyBUZXN0SHViIHNvdXJjZSBhc1xuICAgIC8vIFRPLEFVVCxMVFMgaW5zdGVhZCBvZiBUTyxMVFMgXHUyMDE0IHNlZSBweS1zZGsgZWE1M2Q5MTQpLiBUaGUgYGx0c2Aga2V5XG4gICAgLy8gaXRzZWxmIGlzIG9ubHkgZW1pdHRlZCB1bmRlciBMVFMgdG8ga2VlcCBub24tTFRTIHBheWxvYWRzIGJ5dGUtXG4gICAgLy8gaWRlbnRpY2FsIHRvIHRoZSBwcmUtTFRTLVBSIHNoYXBlLlxuICAgIGNvbnN0IGx0cyA9IGlzTG9hZFRlc3RpbmdTZXNzaW9uKClcbiAgICBjb25zdCBlbnRyaWVzOiBbc3RyaW5nLCBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbF1bXSA9IFtcbiAgICAgICAgWydvYnNlcnZhYmlsaXR5JywgY29uZmlnLnRlc3RPYnNlcnZhYmlsaXR5LmVuYWJsZWRdLFxuICAgICAgICBbJ2FjY2Vzc2liaWxpdHknLCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbl0sXG4gICAgICAgIFsncGVyY3knLCBjb25maWcucGVyY3ldLFxuICAgICAgICBbJ2F1dG9tYXRlJywgbHRzID8gZmFsc2UgOiBjb25maWcuYXV0b21hdGVdLFxuICAgICAgICBbJ2FwcF9hdXRvbWF0ZScsIGNvbmZpZy5hcHBBdXRvbWF0ZV0sXG4gICAgXVxuICAgIGlmIChsdHMpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKFsnbHRzJywgdHJ1ZV0pXG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcy5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSBudWxsKSkgYXMgeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcblxuaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSAnQHdkaW8vdHlwZXMnXG5cbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB7IGlzVmFsaWRFbmFibGVkVmFsdWUgfSBmcm9tICcuLi91dGlsLmpzJ1xuaW1wb3J0IHsgU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1QsIFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX09OTFkgfSBmcm9tICcuLi9jb25zdGFudHMuanMnXG5cbmNvbnN0IFJVTl9TTUFSVF9TRUxFQ1RJT04gPSAncnVuU21hcnRTZWxlY3Rpb24nXG5cbmNvbnN0IEFMTE9XRURfT1JDSEVTVFJBVElPTl9LRVlTID0gW1xuICAgIFJVTl9TTUFSVF9TRUxFQ1RJT05cbl1cblxudHlwZSBTbWFydFNlbGVjdGlvblJlcG9JbmZvID0ge1xuICAgIHVybD86IHN0cmluZ1xuICAgIGZlYXR1cmVCcmFuY2g/OiBzdHJpbmdcbiAgICBiYXNlQnJhbmNoPzogc3RyaW5nXG4gICAgbmFtZT86IHN0cmluZ1xuICAgIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxudHlwZSBTbWFydFNlbGVjdGlvblNvdXJjZSA9IHN0cmluZ1tdIHwgU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdIHwgbnVsbFxuXG50eXBlIFJ1blNtYXJ0U2VsZWN0aW9uQ29uZmlnID0ge1xuICAgIGVuYWJsZWQ/OiBib29sZWFuIHwgc3RyaW5nXG4gICAgbW9kZT86IHN0cmluZ1xuICAgIHNvdXJjZT86IHN0cmluZyB8IHN0cmluZ1tdIHwgU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdIHwgbnVsbFxufVxuXG5jb25zdCBpc1BsYWluT2JqZWN0ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4pXG5cbmNvbnN0IGFzU3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKClcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIENsYXNzIHRvIGhhbmRsZSB0ZXN0IG9yZGVyaW5nIGZ1bmN0aW9uYWxpdHlcbiAqL1xuY2xhc3MgVGVzdE9yZGVyaW5nIHtcbiAgICBwcml2YXRlIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZyB8IG51bGxcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxuICAgICAgICB0aGlzLm5hbWUgPSBudWxsXG4gICAgfVxuXG4gICAgZW5hYmxlKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICB9XG5cbiAgICBkaXNhYmxlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxuICAgICAgICB0aGlzLm5hbWUgPSBudWxsXG4gICAgfVxuXG4gICAgZ2V0RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlZFxuICAgIH1cblxuICAgIGdldE5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVcbiAgICB9XG59XG5cbi8qKlxuICogVXRpbGl0eSBjbGFzcyBmb3IgdGVzdCBvcmNoZXN0cmF0aW9uXG4gKi9cbnR5cGUgT3JjaGVzdHJhdGlvbkNvbmZpZyA9IE9wdGlvbnMuVGVzdHJ1bm5lciB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbmV4cG9ydCBjbGFzcyBPcmNoZXN0cmF0aW9uVXRpbHMge1xuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogT3JjaGVzdHJhdGlvblV0aWxzIHwgbnVsbCA9IG51bGxcbiAgICBwcml2YXRlIHJ1blNtYXJ0U2VsZWN0aW9uOiBib29sZWFuXG4gICAgcHJpdmF0ZSBzbWFydFNlbGVjdGlvbk1vZGU6IHN0cmluZ1xuICAgIHByaXZhdGUgdGVzdE9yZGVyaW5nOiBUZXN0T3JkZXJpbmdcbiAgICBwcml2YXRlIHNtYXJ0U2VsZWN0aW9uU291cmNlOiBTbWFydFNlbGVjdGlvblNvdXJjZVxuICAgIHByaXZhdGUgcHJvamVjdE5hbWU/OiBzdHJpbmdcbiAgICBwcml2YXRlIGJ1aWxkTmFtZT86IHN0cmluZ1xuICAgIHByaXZhdGUgYnVpbGRJZGVudGlmaWVyPzogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBPcmNoZXN0cmF0aW9uQ29uZmlnKSB7XG4gICAgICAgIHRoaXMucnVuU21hcnRTZWxlY3Rpb24gPSBmYWxzZVxuICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZSA9IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNUXG4gICAgICAgIHRoaXMudGVzdE9yZGVyaW5nID0gbmV3IFRlc3RPcmRlcmluZygpXG4gICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2UgPSBudWxsIC8vIFN0b3JlIHNvdXJjZSBwYXRocyBpZiBwcm92aWRlZFxuXG4gICAgICAgIC8vIENoZWNrIGJvdGggcG9zc2libGUgY29uZmlndXJhdGlvbiBwYXRoczogZGlyZWN0IG9yIG5lc3RlZCBpbiBzZXJ2aWNlc1xuICAgICAgICBjb25zdCBjb25maWdSZWNvcmQgPSBpc1BsYWluT2JqZWN0KGNvbmZpZykgPyBjb25maWcgOiB7fVxuICAgICAgICBsZXQgdGVzdE9yY2hPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGlzUGxhaW5PYmplY3QoY29uZmlnUmVjb3JkLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9ucylcbiAgICAgICAgICAgID8gY29uZmlnUmVjb3JkLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9uc1xuICAgICAgICAgICAgOiB7fVxuXG4gICAgICAgIC8vIElmIG5vdCBmb3VuZCBhdCB0b3AgbGV2ZWwsIGNoZWNrIGlmIGl0J3MgaW4gdGhlIGJyb3dzZXJzdGFjayBzZXJ2aWNlIGNvbmZpZ1xuICAgICAgICBjb25zdCBzZXJ2aWNlcyA9IEFycmF5LmlzQXJyYXkoY29uZmlnUmVjb3JkLnNlcnZpY2VzKSA/IGNvbmZpZ1JlY29yZC5zZXJ2aWNlcyA6IHVuZGVmaW5lZFxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGVzdE9yY2hPcHRpb25zKS5sZW5ndGggPT09IDAgJiYgQXJyYXkuaXNBcnJheShzZXJ2aWNlcykpIHtcbiAgICAgICAgICAgIC8vIExvb2sgZm9yIGJyb3dzZXJzdGFjayBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiBzZXJ2aWNlcykge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShzZXJ2aWNlKSAmJlxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlWzBdID09PSAnYnJvd3NlcnN0YWNrJyAmJlxuICAgICAgICAgICAgICAgICAgICBpc1BsYWluT2JqZWN0KHNlcnZpY2VbMV0pICYmXG4gICAgICAgICAgICAgICAgICAgIGlzUGxhaW5PYmplY3Qoc2VydmljZVsxXS50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnMpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RPcmNoT3B0aW9ucyA9IHNlcnZpY2VbMV0udGVzdE9yY2hlc3RyYXRpb25PcHRpb25zXG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnW2NvbnN0cnVjdG9yXSBGb3VuZCB0ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnMgaW4gYnJvd3NlcnN0YWNrIHNlcnZpY2UgY29uZmlnJylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcnkgdG8gZ2V0IHJ1blNtYXJ0U2VsZWN0aW9uIG9wdGlvbnNcbiAgICAgICAgY29uc3QgcnVuU21hcnRTZWxlY3Rpb25PcHRzOiBSdW5TbWFydFNlbGVjdGlvbkNvbmZpZyA9IGlzUGxhaW5PYmplY3QodGVzdE9yY2hPcHRpb25zW1JVTl9TTUFSVF9TRUxFQ1RJT05dKVxuICAgICAgICAgICAgPyB0ZXN0T3JjaE9wdGlvbnNbUlVOX1NNQVJUX1NFTEVDVElPTl0gYXMgUnVuU21hcnRTZWxlY3Rpb25Db25maWdcbiAgICAgICAgICAgIDoge31cblxuICAgICAgICB0aGlzLl9zZXRSdW5TbWFydFNlbGVjdGlvbihcbiAgICAgICAgICAgIHJ1blNtYXJ0U2VsZWN0aW9uT3B0cy5lbmFibGVkID8/IGZhbHNlLFxuICAgICAgICAgICAgcnVuU21hcnRTZWxlY3Rpb25PcHRzLm1vZGUgfHwgU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1QsXG4gICAgICAgICAgICBydW5TbWFydFNlbGVjdGlvbk9wdHMuc291cmNlID8/IG51bGxcbiAgICAgICAgKVxuICAgICAgICAvLyBFeHRyYWN0IGJ1aWxkIGRldGFpbHMgZnJvbSBjYXBhYmlsaXRpZXNcbiAgICAgICAgdGhpcy5fZXh0cmFjdEJ1aWxkRGV0YWlscyhjb25maWcpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCBidWlsZCBkZXRhaWxzIGZyb20gY2FwYWJpbGl0aWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZXh0cmFjdEJ1aWxkRGV0YWlscyhjb25maWc6IE9yY2hlc3RyYXRpb25Db25maWcpOiB2b2lkIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ1JlY29yZCA9IGlzUGxhaW5PYmplY3QoY29uZmlnKSA/IGNvbmZpZyA6IHt9XG4gICAgICAgICAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSAoY29uZmlnUmVjb3JkIGFzIHsgY2FwYWJpbGl0aWVzPzogdW5rbm93biB9KS5jYXBhYmlsaXRpZXNcblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2FwYWJpbGl0aWVzKSkge1xuICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5mb3JFYWNoKGNhcGFiaWxpdHkgPT4gdGhpcy5fcGFyc2VDYXBhYmlsaXR5KGNhcGFiaWxpdHkpKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGNhcGFiaWxpdGllcykpIHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbXVsdGlyZW1vdGUgY2FwYWJpbGl0aWVzXG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhjYXBhYmlsaXRpZXMpLmZvckVhY2goKGNhcHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QoY2FwcykgJiYgJ2NhcGFiaWxpdGllcycgaW4gY2FwcyAmJiBpc1BsYWluT2JqZWN0KGNhcHMuY2FwYWJpbGl0aWVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VDYXBhYmlsaXR5KGNhcHMuY2FwYWJpbGl0aWVzKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbX2V4dHJhY3RCdWlsZERldGFpbHNdIEV4dHJhY3RlZCAtIHByb2plY3ROYW1lOiAke3RoaXMucHJvamVjdE5hbWV9LCBidWlsZE5hbWU6ICR7dGhpcy5idWlsZE5hbWV9LCBidWlsZElkZW50aWZpZXI6ICR7dGhpcy5idWlsZElkZW50aWZpZXJ9YClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgW19leHRyYWN0QnVpbGREZXRhaWxzXSAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUNhcGFiaWxpdHkoY2FwYWJpbGl0eTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBpZiAoIWlzUGxhaW5PYmplY3QoY2FwYWJpbGl0eSkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnN0YWNrT3B0aW9uc1JhdyA9IGNhcGFiaWxpdHlbJ2JzdGFjazpvcHRpb25zJ11cblxuICAgICAgICBpZiAoaXNQbGFpbk9iamVjdChic3RhY2tPcHRpb25zUmF3KSkge1xuICAgICAgICAgICAgY29uc3QgYnVpbGROYW1lID0gYXNTdHJpbmcoYnN0YWNrT3B0aW9uc1Jhdy5idWlsZE5hbWUpXG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0TmFtZSA9IGFzU3RyaW5nKGJzdGFja09wdGlvbnNSYXcucHJvamVjdE5hbWUpXG4gICAgICAgICAgICBjb25zdCBidWlsZElkZW50aWZpZXIgPSBhc1N0cmluZyhic3RhY2tPcHRpb25zUmF3LmJ1aWxkSWRlbnRpZmllcilcblxuICAgICAgICAgICAgaWYgKGJ1aWxkTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGROYW1lID0gYnVpbGROYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvamVjdE5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidWlsZElkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkSWRlbnRpZmllciA9IGJ1aWxkSWRlbnRpZmllclxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbGVnYWN5QnVpbGRJZGVudGlmaWVyID0gYXNTdHJpbmcoY2FwYWJpbGl0eVsnYnJvd3NlcnN0YWNrLmJ1aWxkSWRlbnRpZmllciddKVxuICAgICAgICAgICAgY29uc3QgbGVnYWN5QnVpbGROYW1lID0gYXNTdHJpbmcoY2FwYWJpbGl0eS5idWlsZClcblxuICAgICAgICAgICAgaWYgKGxlZ2FjeUJ1aWxkSWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRJZGVudGlmaWVyID0gbGVnYWN5QnVpbGRJZGVudGlmaWVyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGVnYWN5QnVpbGROYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZE5hbWUgPSBsZWdhY3lCdWlsZE5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBvciBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgT3JjaGVzdHJhdGlvblV0aWxzXG4gICAgICovXG4gICAgc3RhdGljIGdldEluc3RhbmNlKGNvbmZpZz86IE9yY2hlc3RyYXRpb25Db25maWcpOiBPcmNoZXN0cmF0aW9uVXRpbHMgfCBudWxsIHtcbiAgICAgICAgaWYgKCFPcmNoZXN0cmF0aW9uVXRpbHMuX2luc3RhbmNlICYmIGNvbmZpZykge1xuICAgICAgICAgICAgT3JjaGVzdHJhdGlvblV0aWxzLl9pbnN0YW5jZSA9IG5ldyBPcmNoZXN0cmF0aW9uVXRpbHMoY29uZmlnKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPcmNoZXN0cmF0aW9uVXRpbHMuX2luc3RhbmNlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IG9yY2hlc3RyYXRpb24gZGF0YSBmcm9tIGNvbmZpZ1xuICAgICAqL1xuICAgIHN0YXRpYyBnZXRPcmNoZXN0cmF0aW9uRGF0YShjb25maWc6IE9yY2hlc3RyYXRpb25Db25maWcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ1JlY29yZCA9IGlzUGxhaW5PYmplY3QoY29uZmlnKSA/IGNvbmZpZyA6IHt9XG4gICAgICAgIGNvbnN0IG9yY2hlc3RyYXRpb25EYXRhID0gaXNQbGFpbk9iamVjdChjb25maWdSZWNvcmQudGVzdE9yY2hlc3RyYXRpb25PcHRpb25zKVxuICAgICAgICAgICAgPyBjb25maWdSZWNvcmQudGVzdE9yY2hlc3RyYXRpb25PcHRpb25zXG4gICAgICAgICAgICA6IHt9XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9yY2hlc3RyYXRpb25EYXRhKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIGlmIChBTExPV0VEX09SQ0hFU1RSQVRJT05fS0VZUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcnVuIHNtYXJ0IHNlbGVjdGlvbiBzZXR0aW5nXG4gICAgICovXG4gICAgZ2V0UnVuU21hcnRTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ1blNtYXJ0U2VsZWN0aW9uXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNtYXJ0IHNlbGVjdGlvbiBtb2RlXG4gICAgICovXG4gICAgZ2V0U21hcnRTZWxlY3Rpb25Nb2RlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzbWFydCBzZWxlY3Rpb24gc291cmNlXG4gICAgICovXG4gICAgZ2V0U21hcnRTZWxlY3Rpb25Tb3VyY2UoKTogU21hcnRTZWxlY3Rpb25Tb3VyY2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBwcm9qZWN0IG5hbWVcbiAgICAgKi9cbiAgICBnZXRQcm9qZWN0TmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0TmFtZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBidWlsZCBuYW1lXG4gICAgICovXG4gICAgZ2V0QnVpbGROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkTmFtZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBidWlsZCBpZGVudGlmaWVyXG4gICAgICovXG4gICAgZ2V0QnVpbGRJZGVudGlmaWVyKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkSWRlbnRpZmllclxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBidWlsZCBkZXRhaWxzXG4gICAgICovXG4gICAgc2V0QnVpbGREZXRhaWxzKHByb2plY3ROYW1lPzogc3RyaW5nLCBidWlsZE5hbWU/OiBzdHJpbmcsIGJ1aWxkSWRlbnRpZmllcj86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWVcbiAgICAgICAgdGhpcy5idWlsZE5hbWUgPSBidWlsZE5hbWVcbiAgICAgICAgdGhpcy5idWlsZElkZW50aWZpZXIgPSBidWlsZElkZW50aWZpZXJcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbc2V0QnVpbGREZXRhaWxzXSBTZXQgLSBwcm9qZWN0TmFtZTogJHt0aGlzLnByb2plY3ROYW1lfSwgYnVpbGROYW1lOiAke3RoaXMuYnVpbGROYW1lfSwgYnVpbGRJZGVudGlmaWVyOiAke3RoaXMuYnVpbGRJZGVudGlmaWVyfWApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHJ1biBzbWFydCBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXRSdW5TbWFydFNlbGVjdGlvbihlbmFibGVkOiBib29sZWFuIHwgc3RyaW5nLCBtb2RlOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nW10gfCBTbWFydFNlbGVjdGlvblJlcG9JbmZvW10gfCBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHZvaWQge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gUHJvcGVybHkgdmFsaWRhdGUgZW5hYmxlZCB2YWx1ZSAtIG9ubHkgYWNjZXB0IHRydWUgYm9vbGVhbiBvciBzdHJpbmcgXCJ0cnVlXCJcbiAgICAgICAgICAgIHRoaXMucnVuU21hcnRTZWxlY3Rpb24gPSBpc1ZhbGlkRW5hYmxlZFZhbHVlKGVuYWJsZWQpXG4gICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZSA9IG1vZGVcbiAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2UgPSBbXVxuXG4gICAgICAgICAgICAvLyBMb2cgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGRlYnVnZ2luZ1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTZXR0aW5nIHJ1blNtYXJ0U2VsZWN0aW9uOiBlbmFibGVkPSR7dGhpcy5ydW5TbWFydFNlbGVjdGlvbn0sIG1vZGU9JHt0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZX1gKVxuICAgICAgICAgICAgaWYgKHRoaXMucnVuU21hcnRTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBNb2RlIHZhbGlkYXRpb24gLSBvbmx5IHdoZW4gc21hcnQgc2VsZWN0aW9uIGlzIGVuYWJsZWRcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZE1vZGVzID0gW1NNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNULCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9PTkxZXVxuICAgICAgICAgICAgICAgIGlmICghdmFsaWRNb2Rlcy5pbmNsdWRlcyh0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEludmFsaWQgc21hcnQgc2VsZWN0aW9uIG1vZGUgJyR7dGhpcy5zbWFydFNlbGVjdGlvbk1vZGV9JyBwcm92aWRlZC4gRGVmYXVsdGluZyB0byAnJHtTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVH0nLmApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Nb2RlID0gU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1RcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ05vIHNvdXJjZSBwcm92aWRlZCBmb3Igc21hcnQgc2VsZWN0aW9uOyBkZWZhdWx0aW5nIHRvIG51bGwuJylcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlID0gc291cmNlXG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgU21hcnQgc2VsZWN0aW9uIHNvdXJjZSBzZXQgdG8gYXJyYXk6ICR7SlNPTi5zdHJpbmdpZnkoc291cmNlKX1gKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgJiYgc291cmNlLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2UgPSB0aGlzLl9sb2FkU291cmNlRnJvbUZpbGUoc291cmNlKSB8fCBbXVxuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFNtYXJ0IHNlbGVjdGlvbiBzb3VyY2UgbG9hZGVkIGZyb20gZmlsZTogJHtzb3VyY2V9YClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0VGVzdE9yZGVyaW5nKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBbX3NldFJ1blNtYXJ0U2VsZWN0aW9uXSAke2V9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIEpTT04gc291cmNlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgZm9ybWF0IGl0IGZvciBzbWFydCBzZWxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsZVBhdGggLSBQYXRoIHRvIHRoZSBKU09OIGNvbmZpZ3VyYXRpb24gZmlsZVxuICAgICAqIEByZXR1cm5zIEZvcm1hdHRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbnNcbiAgICAgKi9cbiAgICBwcml2YXRlIF9sb2FkU291cmNlRnJvbUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgU291cmNlIGZpbGUgJyR7ZmlsZVBhdGh9JyBkb2VzIG5vdCBleGlzdC5gKVxuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGF0YTogdW5rbm93biA9IG51bGxcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpXG4gICAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShmaWxlQ29udGVudClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgcGFyc2luZyBKU09OIGZyb20gc291cmNlIGZpbGUgJyR7ZmlsZVBhdGh9JzogJHttZXNzYWdlfWApXG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhY2hlIGZlYXR1cmUgYnJhbmNoIG1hcHBpbmdzIGZyb20gZW52IHRvIGF2b2lkIHJlcGVhdGVkIHBhcnNpbmdcbiAgICAgICAgbGV0IGZlYXR1cmVCcmFuY2hFbnZNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBudWxsID0gbnVsbFxuXG4gICAgICAgIGNvbnN0IGxvYWRGZWF0dXJlQnJhbmNoTWFwcyA9ICgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudlZhciA9IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19PUkNIRVNUUkFUSU9OX1NNQVJUX1NFTEVDVElPTl9GRUFUVVJFX0JSQU5DSEVTIHx8ICcnXG4gICAgICAgICAgICBsZXQgZW52TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlbnZNYXAgPSBlbnZWYXIuc3RhcnRzV2l0aCgneycpICYmIGVudlZhci5lbmRzV2l0aCgnfScpXG4gICAgICAgICAgICAgICAgICAgID8gSlNPTi5wYXJzZShlbnZWYXIpXG4gICAgICAgICAgICAgICAgICAgIDogZW52VmFyLnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtLmluY2x1ZGVzKCc6JykpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGl0ZW06IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGl0ZW0uc3BsaXQoJzonKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjW2tleS50cmltKCldID0gdmFsdWUudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIHBhcnNpbmcgZmVhdHVyZSBicmFuY2ggbWFwcGluZ3M6ICR7ZXJyb3J9YClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBGZWF0dXJlIGJyYW5jaCBtYXBwaW5ncyBmcm9tIGVudjogJHtKU09OLnN0cmluZ2lmeShlbnZNYXApfWApXG4gICAgICAgICAgICByZXR1cm4gZW52TWFwXG4gICAgICAgIH1cblxuICAgICAgICBmZWF0dXJlQnJhbmNoRW52TWFwID0gbG9hZEZlYXR1cmVCcmFuY2hNYXBzKClcblxuICAgICAgICBjb25zdCBnZXRGZWF0dXJlQnJhbmNoID0gKG5hbWU6IHN0cmluZywgcmVwb0luZm86IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm8pOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICAgICAgICAgIC8vIDEuIENoZWNrIGluIGVudmlyb25tZW50IHZhcmlhYmxlIG1hcFxuICAgICAgICAgICAgaWYgKGZlYXR1cmVCcmFuY2hFbnZNYXAgJiYgZmVhdHVyZUJyYW5jaEVudk1hcFtuYW1lXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmZWF0dXJlQnJhbmNoRW52TWFwW25hbWVdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAyLiBDaGVjayBpbiByZXBvX2luZm9cbiAgICAgICAgICAgIGlmIChyZXBvSW5mby5mZWF0dXJlQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcG9JbmZvLmZlYXR1cmVCcmFuY2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmIGRhdGEgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGE6IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXSA9IFtdXG4gICAgICAgICAgICBjb25zdCBuYW1lUGF0dGVybiA9IC9eW0EtWjAtOV9dKyQvXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW25hbWUsIHJlcG9JbmZvXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNQbGFpbk9iamVjdChyZXBvSW5mbykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFJlcG9JbmZvID0gcmVwb0luZm8gYXMgU21hcnRTZWxlY3Rpb25SZXBvSW5mb1xuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB1cmwgaXMgYSBzdHJpbmcgYW5kIGlzIHByZXNlbnRcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGVkUmVwb0luZm8udXJsIHx8IHR5cGVvZiB0eXBlZFJlcG9JbmZvLnVybCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYFJlcG9zaXRvcnkgVVJMIGlzIG1pc3Npbmcgb3IgaW52YWxpZCBmb3Igc291cmNlICcke25hbWV9JzogJHtKU09OLnN0cmluZ2lmeShyZXBvSW5mbyl9YClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IGJhc2VCcmFuY2gsIGlmIHByb3ZpZGVkLCBpcyBhIHN0cmluZ1xuICAgICAgICAgICAgICAgIGlmICh0eXBlZFJlcG9JbmZvLmJhc2VCcmFuY2ggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdHlwZWRSZXBvSW5mby5iYXNlQnJhbmNoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgQmFzZSBicmFuY2ggbXVzdCBiZSBhIHN0cmluZyBmb3Igc291cmNlICcke25hbWV9JzogJHtKU09OLnN0cmluZ2lmeShyZXBvSW5mbyl9YClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IGZlYXR1cmVCcmFuY2gsIGlmIHByb3ZpZGVkLCBpcyBhIHN0cmluZ1xuICAgICAgICAgICAgICAgIGlmICh0eXBlZFJlcG9JbmZvLmZlYXR1cmVCcmFuY2ggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdHlwZWRSZXBvSW5mby5mZWF0dXJlQnJhbmNoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgRmVhdHVyZSBicmFuY2ggbXVzdCBiZSBhIHN0cmluZyBmb3Igc291cmNlICcke25hbWV9JzogJHtKU09OLnN0cmluZ2lmeShyZXBvSW5mbyl9YClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBuYW1lXG4gICAgICAgICAgICAgICAgaWYgKCFuYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBJbnZhbGlkIHNvdXJjZSBpZGVudGlmaWVyIGZvcm1hdCBmb3IgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIGxlbmd0aFxuICAgICAgICAgICAgICAgIGlmIChuYW1lLmxlbmd0aCA+IDMwIHx8IG5hbWUubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgU291cmNlIGlkZW50aWZpZXIgJyR7bmFtZX0nIG11c3QgaGF2ZSBhIGxlbmd0aCBiZXR3ZWVuIDEgYW5kIDMwIGNoYXJhY3RlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIHVybCwgYmFzZUJyYW5jaCwgYW5kIGZlYXR1cmVCcmFuY2ggLSBpZ25vcmUgYWxsIG90aGVyIGtleXNcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlQnJhbmNoID0gZ2V0RmVhdHVyZUJyYW5jaChuYW1lLCB0eXBlZFJlcG9JbmZvKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRSZXBvSW5mbzogU21hcnRTZWxlY3Rpb25SZXBvSW5mbyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB0eXBlZFJlcG9JbmZvLnVybCxcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUJyYW5jaDogZmVhdHVyZUJyYW5jaCA/PyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IGFkZCBiYXNlQnJhbmNoIGlmIGl0J3MgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICBpZiAodHlwZWRSZXBvSW5mby5iYXNlQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkUmVwb0luZm8uYmFzZUJyYW5jaCA9IHR5cGVkUmVwb0luZm8uYmFzZUJyYW5jaFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghZmlsdGVyZWRSZXBvSW5mby5mZWF0dXJlQnJhbmNoIHx8IGZpbHRlcmVkUmVwb0luZm8uZmVhdHVyZUJyYW5jaCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEZlYXR1cmUgYnJhbmNoIG5vdCBzcGVjaWZpZWQgZm9yIHNvdXJjZSAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkUmVwb0luZm8uYmFzZUJyYW5jaCAmJiBmaWx0ZXJlZFJlcG9JbmZvLmJhc2VCcmFuY2ggPT09IGZpbHRlcmVkUmVwb0luZm8uZmVhdHVyZUJyYW5jaCkge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgRmVhdHVyZSBicmFuY2ggYW5kIGJhc2UgYnJhbmNoIGNhbm5vdCBiZSB0aGUgc2FtZSBmb3Igc291cmNlICcke25hbWV9JzogJHtKU09OLnN0cmluZ2lmeShyZXBvSW5mbyl9YClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWREYXRhLnB1c2goZmlsdGVyZWRSZXBvSW5mbylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlZERhdGFcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5maWx0ZXIoaXNQbGFpbk9iamVjdCkgYXMgU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGVzdCBvcmRlcmluZyBiYXNlZCBvbiBwcmlvcml0aWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0VGVzdE9yZGVyaW5nKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5ydW5TbWFydFNlbGVjdGlvbikgeyAvLyBIaWdoZXN0IHByaW9yaXR5XG4gICAgICAgICAgICB0aGlzLnRlc3RPcmRlcmluZy5lbmFibGUoUlVOX1NNQVJUX1NFTEVDVElPTilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGVzdE9yZGVyaW5nLmRpc2FibGUoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGVzdCBvcmRlcmluZyBpcyBlbmFibGVkXG4gICAgICovXG4gICAgdGVzdE9yZGVyaW5nRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVzdE9yZGVyaW5nLmdldEVuYWJsZWQoKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0ZXN0IG9yZGVyaW5nIG5hbWVcbiAgICAgKi9cbiAgICBnZXRUZXN0T3JkZXJpbmdOYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy50ZXN0T3JkZXJpbmcuZ2V0RW5hYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZXN0T3JkZXJpbmcuZ2V0TmFtZSgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGVzdCBvcmNoZXN0cmF0aW9uIG1ldGFkYXRhXG4gICAgICovXG4gICAgZ2V0VGVzdE9yY2hlc3RyYXRpb25NZXRhZGF0YSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAncnVuX3NtYXJ0X3NlbGVjdGlvbic6IHtcbiAgICAgICAgICAgICAgICAnZW5hYmxlZCc6IHRoaXMuZ2V0UnVuU21hcnRTZWxlY3Rpb24oKSxcbiAgICAgICAgICAgICAgICAnbW9kZSc6IHRoaXMuZ2V0U21hcnRTZWxlY3Rpb25Nb2RlKCksXG4gICAgICAgICAgICAgICAgJ3NvdXJjZSc6IHRoaXMuZ2V0U21hcnRTZWxlY3Rpb25Tb3VyY2UoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJ1aWxkIHN0YXJ0IGRhdGFcbiAgICAgKi9cbiAgICBnZXRCdWlsZFN0YXJ0RGF0YSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBydW5fc21hcnRfc2VsZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5nZXRSdW5TbWFydFNlbGVjdGlvbigpLFxuICAgICAgICAgICAgICAgIG1vZGU6IHRoaXMuZ2V0U21hcnRTZWxlY3Rpb25Nb2RlKClcbiAgICAgICAgICAgICAgICAvLyBOb3Qgc2VuZGluZyBcInNvdXJjZVwiIHRvIFRIIGJ1aWxkc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBPcmNoZXN0cmF0aW9uVXRpbHNcbiIsICJpbXBvcnQgdHlwZSB7IENhcGFiaWxpdGllcywgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuXG5pbXBvcnQgeyBCU1RBQ0tfU0VSVklDRV9WRVJTSU9OLCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELCBXRElPX05BTUlOR19QUkVGSVggfSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCB0eXBlIHsgQnJvd3NlcnN0YWNrQ29uZmlnLCBDcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLCBVc2VyQ29uZmlnZm9yUmVwb3J0aW5nIH0gZnJvbSAnLi90eXBlcy5qcydcbmltcG9ydCB7IERFRkFVTFRfUkVRVUVTVF9DT05GSUcsIGdldE9ic2VydmFiaWxpdHlLZXksIGdldE9ic2VydmFiaWxpdHlVc2VyIH0gZnJvbSAnLi91dGlsLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgQVBJVXRpbHMgZnJvbSAnLi9jbGkvYXBpVXRpbHMuanMnXG5cbmltcG9ydCB7IF9mZXRjaCBhcyBmZXRjaCB9IGZyb20gJy4vZmV0Y2hXcmFwcGVyLmpzJ1xuXG50eXBlIERpY3QgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDcmFzaFJlcG9ydGVyIHtcbiAgICAvKiBVc2VyIHRlc3QgY29uZmlnIGZvciBidWlsZCBydW4gbWludXMgUElJICovXG4gICAgcHVibGljIHN0YXRpYyB1c2VyQ29uZmlnRm9yUmVwb3J0aW5nOiBVc2VyQ29uZmlnZm9yUmVwb3J0aW5nID0ge31cbiAgICAvKiBVc2VyIGNyZWRlbnRpYWxzIHVzZWQgZm9yIHJlcG9ydGluZyBjcmFzaGVzIGluIGJyb3dzZXJzdGFjayBzZXJ2aWNlICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZDogQ3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZCA9IHt9XG5cbiAgICBzdGF0aWMgc2V0Q3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZChvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgICAgIHRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZCA9IHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiBnZXRPYnNlcnZhYmlsaXR5VXNlcihvcHRpb25zLCBjb25maWcpLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IGdldE9ic2VydmFiaWxpdHlLZXkob3B0aW9ucywgY29uZmlnKVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MuZW52LkNSRURFTlRJQUxTX0ZPUl9DUkFTSF9SRVBPUlRJTkcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQpXG4gICAgfVxuXG4gICAgc3RhdGljIHNldENvbmZpZ0RldGFpbHModXNlckNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLCBjYXBhYmlsaXRpZXM6IENhcGFiaWxpdGllcy5UZXN0cnVubmVyQ2FwYWJpbGl0aWVzLCBvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICAgICAgY29uc3QgY29uZmlnV2l0aG91dFBJSSA9IHRoaXMuZmlsdGVyUElJKHVzZXJDb25maWcpXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkQ2FwYWJpbGl0aWVzID0gdGhpcy5maWx0ZXJDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzKVxuICAgICAgICB0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcgPSB7XG4gICAgICAgICAgICBmcmFtZXdvcms6IHVzZXJDb25maWcuZnJhbWV3b3JrLFxuICAgICAgICAgICAgc2VydmljZXM6IGNvbmZpZ1dpdGhvdXRQSUkuc2VydmljZXMsXG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IGZpbHRlcmVkQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgICAgJ0JST1dTRVJTVEFDS19CVUlMRCc6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19CVUlMRCxcbiAgICAgICAgICAgICAgICAnQlJPV1NFUlNUQUNLX0JVSUxEX05BTUUnOiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQlVJTERfTkFNRSxcbiAgICAgICAgICAgICAgICAnQlVJTERfVEFHJzogcHJvY2Vzcy5lbnYuQlVJTERfVEFHXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzcy5lbnYuVVNFUl9DT05GSUdfRk9SX1JFUE9SVElORyA9IEpTT04uc3RyaW5naWZ5KHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZylcbiAgICAgICAgdGhpcy5zZXRDcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkKG9wdGlvbnMsIHVzZXJDb25maWcpXG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIHVwbG9hZENyYXNoUmVwb3J0KGV4Y2VwdGlvbjogc3RyaW5nLCBzdGFja1RyYWNlOiBzdHJpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnVzZXJuYW1lIHx8ICF0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQucGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQgPSBwcm9jZXNzLmVudi5DUkVERU5USUFMU19GT1JfQ1JBU0hfUkVQT1JUSU5HICE9PSB1bmRlZmluZWQgPyBKU09OLnBhcnNlKHByb2Nlc3MuZW52LkNSRURFTlRJQUxTX0ZPUl9DUkFTSF9SRVBPUlRJTkcpIDogdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gQlN0YWNrTG9nZ2VyLmVycm9yKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIHRvIHBhcnNlIHVzZXIgY3JlZGVudGlhbHMgd2hpbGUgcmVwb3J0aW5nIGNyYXNoIGR1ZSB0byAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQudXNlcm5hbWUgfHwgIXRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC5wYXNzd29yZCkge1xuICAgICAgICAgICAgcmV0dXJuIEJTdGFja0xvZ2dlci5lcnJvcignW0NyYXNoX1JlcG9ydF9VcGxvYWRdIEZhaWxlZCB0byBwYXJzZSB1c2VyIGNyZWRlbnRpYWxzIHdoaWxlIHJlcG9ydGluZyBjcmFzaCcpXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nID0gcHJvY2Vzcy5lbnYuVVNFUl9DT05GSUdfRk9SX1JFUE9SVElORyAhPT0gdW5kZWZpbmVkID8gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5VU0VSX0NPTkZJR19GT1JfUkVQT1JUSU5HKSA6IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFtDcmFzaF9SZXBvcnRfVXBsb2FkXSBGYWlsZWQgdG8gcGFyc2UgdXNlciBjb25maWcgd2hpbGUgcmVwb3J0aW5nIGNyYXNoIGR1ZSB0byAke2Vycm9yfWApXG4gICAgICAgICAgICB0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcgPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIGhhc2hlZF9pZDogcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF0sXG4gICAgICAgICAgICBvYnNlcnZhYmlsaXR5X3ZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBmcmFtZXdvcmtOYW1lOiBXRElPX05BTUlOR19QUkVGSVggKyAodGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nLmZyYW1ld29yayB8fCAnbnVsbCcpLFxuICAgICAgICAgICAgICAgIHNka1ZlcnNpb246IEJTVEFDS19TRVJWSUNFX1ZFUlNJT05cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBleGNlcHRpb246IHtcbiAgICAgICAgICAgICAgICBlcnJvcjogZXhjZXB0aW9uLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgc3RhY2tUcmFjZTogc3RhY2tUcmFjZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZzogdGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJVXRpbHMuREFUQV9FTkRQT0lOVH0vYXBpL3YxL2FuYWx5dGljc2BcblxuICAgICAgICBjb25zdCBlbmNvZGVkQXV0aCA9IEJ1ZmZlci5mcm9tKGAke3RoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC51c2VybmFtZX06JHt0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQucGFzc3dvcmR9YCwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCYXNpYyAke2VuY29kZWRBdXRofWAsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGxldCBib2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShKU09OLnBhcnNlKGJvZHkpKVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gUmVzcG9uc2UgaXMgbm90IEpTT04sIHVzZSB0ZXh0IGFzLWlzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtDcmFzaF9SZXBvcnRfVXBsb2FkXSBTdWNjZXNzIHJlc3BvbnNlOiAke2JvZHl9YClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgW0NyYXNoX1JlcG9ydF9VcGxvYWRdIEZhaWxlZCBkdWUgdG8gJHtyZXNwb25zZS5ib2R5fWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcmVjdXJzaXZlbHlSZWRhY3RLZXlzRnJvbU9iamVjdChvYmo6IERpY3QgfCBBcnJheTxEaWN0Piwga2V5czogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIG9iai5tYXAoZWxlID0+IHRoaXMucmVjdXJzaXZlbHlSZWRhY3RLZXlzRnJvbU9iamVjdChlbGUsIGtleXMpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmluY2x1ZGVzKHByb3AudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqW3Byb3BdID0gJ1tSRURBQ1RFRF0nXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW3Byb3BdID09PSAnb2JqZWN0JyAmJiBvYmpbcHJvcF0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN1cnNpdmVseVJlZGFjdEtleXNGcm9tT2JqZWN0KG9ialtwcm9wXSBhcyBEaWN0IHwgQXJyYXk8RGljdD4sIGtleXMpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW3Byb3BdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShvYmpbcHJvcF0gYXMgc3RyaW5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWQgPT09ICdvYmplY3QnICYmIHBhcnNlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdXJzaXZlbHlSZWRhY3RLZXlzRnJvbU9iamVjdChwYXJzZWQgYXMgRGljdCB8IEFycmF5PERpY3Q+LCBrZXlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialtwcm9wXSA9IEpTT04uc3RyaW5naWZ5KHBhcnNlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgdmFsaWQgSlNPTiwgbGVhdmUgYXMtaXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBkZWxldGVQSUlLZXlzRnJvbU9iamVjdChvYmo6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KSB7XG4gICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBbJ3VzZXInLCAndXNlcm5hbWUnLCAna2V5JywgJ2FjY2Vzc0tleSddLmZvckVhY2goa2V5ID0+IGRlbGV0ZSBvYmpba2V5XSlcbiAgICB9XG5cbiAgICBzdGF0aWMgZmlsdGVyQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllczogQ2FwYWJpbGl0aWVzLlRlc3RydW5uZXJDYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgY29uc3QgY2Fwc0NvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNhcGFiaWxpdGllcykpXG4gICAgICAgIHRoaXMucmVjdXJzaXZlbHlSZWRhY3RLZXlzRnJvbU9iamVjdChjYXBzQ29weSwgWydleHRlbnNpb25zJ10pXG4gICAgICAgIHJldHVybiBjYXBzQ29weVxuICAgIH1cblxuICAgIHN0YXRpYyBmaWx0ZXJQSUkodXNlckNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ1dpdGhvdXRQSUkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHVzZXJDb25maWcpKVxuICAgICAgICB0aGlzLmRlbGV0ZVBJSUtleXNGcm9tT2JqZWN0KGNvbmZpZ1dpdGhvdXRQSUkpXG4gICAgICAgIGNvbnN0IGZpbmFsU2VydmljZXMgPSBbXVxuICAgICAgICBjb25zdCBpbml0aWFsU2VydmljZXMgPSBjb25maWdXaXRob3V0UElJLnNlcnZpY2VzXG4gICAgICAgIGRlbGV0ZSBjb25maWdXaXRob3V0UElJLnNlcnZpY2VzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlcnZpY2VBcnJheSBvZiBpbml0aWFsU2VydmljZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZXJ2aWNlQXJyYXkpICYmIHNlcnZpY2VBcnJheS5sZW5ndGggPj0gMiAmJiBzZXJ2aWNlQXJyYXlbMF0gPT09ICdicm93c2Vyc3RhY2snKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDE7IGlkeCA8IHNlcnZpY2VBcnJheS5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVBJSUtleXNGcm9tT2JqZWN0KHNlcnZpY2VBcnJheVtpZHhdKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VBcnJheVtpZHhdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGJvdGggbmV3IHRlc3RSZXBvcnRpbmdPcHRpb25zIGFuZCBsZWdhY3kgdGVzdE9ic2VydmFiaWxpdHlPcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVQSUlLZXlzRnJvbU9iamVjdChzZXJ2aWNlQXJyYXlbaWR4XS50ZXN0UmVwb3J0aW5nT3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVBJSUtleXNGcm9tT2JqZWN0KHNlcnZpY2VBcnJheVtpZHhdLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbFNlcnZpY2VzLnB1c2goc2VydmljZUFycmF5KVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvKiBXcm9uZyBjb25maWd1cmF0aW9uIGxpa2Ugc3RyaW5ncyBpbnN0ZWFkIG9mIGpzb24gb2JqZWN0cyBjb3VsZCBicmVhayB0aGlzIG1ldGhvZCwgbmVlZHMgbm8gYWN0aW9uICovXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIGluIHBhcnNpbmcgdXNlciBjb25maWcgUElJIHdpdGggZXJyb3IgJHtlcnIgPyAoKGVyciBhcyBFcnJvcikuc3RhY2sgfHwgZXJyKSA6IGVycn1gKVxuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1dpdGhvdXRQSUlcbiAgICAgICAgfVxuICAgICAgICBjb25maWdXaXRob3V0UElJLnNlcnZpY2VzID0gZmluYWxTZXJ2aWNlc1xuICAgICAgICByZXR1cm4gY29uZmlnV2l0aG91dFBJSVxuICAgIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSAnQHdkaW8vdHlwZXMnXG5cbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHtcbiAgICBCUk9XU0VSU1RBQ0tfRElTQUJMRV9BVVRPX0NBUFRVUkVfTE9HUyxcbiAgICBDT01QT1VORF9TRUNSRVRfU1VGRklYRVNfQ0FNRUwsXG4gICAgQ09NUE9VTkRfU0VDUkVUX1NVRkZJWEVTX1NOQUtFLFxuICAgIFBFTV9CTE9DS19SRUdFWCxcbiAgICBQRU1fVU5URVJNSU5BVEVEX1JFR0VYLFxuICAgIFVSTF9VU0VSSU5GT19SRUdFWCxcbiAgICBCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfRklMRV9QQVRILFxuICAgIEJST1dTRVJTVEFDS19XRElPX0NPTkZJR19TVFJBVEVHWSxcbiAgICBDQVBUVVJFX0NPTkZJR19JTVBPUlRfREVQVEgsXG4gICAgREVGQVVMVF9XRElPX0NPTkZJR19CQVNFTkFNRSxcbiAgICBNQVhfQ0FQVFVSRURfQ09ORklHX0ZJTEVTLFxuICAgIE1BWF9DQVBUVVJFRF9DT05GSUdfRklMRV9CWVRFUyxcbiAgICBNQVhfUEFDS0FHRV9KU09OX1dBTEtfVVAsXG4gICAgUkVEQUNURURfS0VZUyxcbiAgICBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUyxcbiAgICBXRElPX0NMSV9TVUJDT01NQU5EU1xufSBmcm9tICcuL2NvbnN0YW50cy5qcydcblxuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlZEZpbGUge1xuICAgIC8qIGFyY2hpdmUgZW50cnkgbmFtZSAoYmFzZW5hbWUsIGRlLWR1cGxpY2F0ZWQpICovXG4gICAgbmFtZTogc3RyaW5nXG4gICAgLyogYWJzb2x1dGUgcGF0aCB0aGUgY29udGVudCBjYW1lIGZyb20gKi9cbiAgICBzb3VyY2VQYXRoOiBzdHJpbmdcbiAgICBjb250ZW50OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWdQYXRoUmVzb2x1dGlvbiB7XG4gICAgY29uZmlnUGF0aD86IHN0cmluZ1xuICAgIC8qIHdoaWNoIGxhZGRlciBydW5nIGFuc3dlcmVkIFx1MjAxNCByZWNvcmRlZCBvbiB0aGUgU0RLX1VQTE9BRF9MT0dTIGV2ZW50ICovXG4gICAgc3RyYXRlZ3k/OiBzdHJpbmdcbiAgICAvKiB3aHkgbm90aGluZyB3YXMgZm91bmQsIHdoZW4gY29uZmlnUGF0aCBpcyB1bmRlZmluZWQgKi9cbiAgICByZWFzb24/OiBzdHJpbmdcbn1cblxuY29uc3QgaXNSZWFkYWJsZUZpbGUgPSAoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSAmJiBmcy5zdGF0U3luYyhmaWxlUGF0aCkuaXNGaWxlKClcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxufVxuXG4vKipcbiAqIEFjY2VwdCBhIGNvbmZpZyBwYXRoIHRoZSB3YXkgYEB3ZGlvL2NsaWAgZG9lczogdGhlIHZhbHVlIGFzIHNwZWxsZWQsIGVsc2UgdGhlIHNhbWUgc3RlbVxuICogcHJvYmVkIGFjcm9zcyB0aGUgc3VwcG9ydGVkIGV4dGVuc2lvbnMuXG4gKlxuICogVGhlIHByb2JlIGlzIG5vdCBkZWZlbnNpdmUgcGFkZGluZyBcdTIwMTQgaXQgaXMgcmVxdWlyZWQuIGBjb21tYW5kcy9ydW4udHNgIGhhbmRzIGBMYXVuY2hlcmAgdGhlXG4gKiBwYXRoIHRoYXQgYGNhbkFjY2Vzc0NvbmZpZ1BhdGhgIGZvdW5kLCBidXQgbGVhdmVzIGBjb25maWctcGF0aGAgc2V0IHRvIHdoYXQgdGhlIFVTRVIgdHlwZWQsXG4gKiBhbmQgYSBUeXBlU2NyaXB0IHByb2plY3QgbGVnYWxseSBzcGVsbHMgYSBgLnRzYCBjb25maWcgd2l0aCBgLmpzYC4gVmVyaWZpZWQgYWdhaW5zdCBhIHJlYWxcbiAqIHdkaW8gcnVuOiBgd2RpbyBydW4gLi9jb25maWdzL2EuY29uZi5qc2Agd2l0aCBvbmx5IGBjb25maWdzL2EuY29uZi50c2Agb24gZGlzayBzdGFydHMgZmluZVxuICogYW5kIHJlcG9ydHMgYGNvbmZpZy1wYXRoOiAnLi9jb25maWdzL2EuY29uZi5qcydgLCBhIHBhdGggdGhhdCBkb2VzIG5vdCBleGlzdC5cbiAqL1xuY29uc3QgcmVzb2x2ZUNhbmRpZGF0ZSA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgIXZhbHVlLnRyaW0oKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZ1bGwgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgdmFsdWUudHJpbSgpKVxuICAgICAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoZnVsbClcbiAgICAgICAgY29uc3Qgc3RlbSA9IFNVUFBPUlRFRF9XRElPX0NPTkZJR19FWFRFTlNJT05TLmluY2x1ZGVzKGV4dCkgPyBmdWxsLnNsaWNlKDAsIC1leHQubGVuZ3RoKSA6IGZ1bGxcbiAgICAgICAgcmV0dXJuIFtmdWxsLCAuLi5TVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUy5tYXAoKGUpID0+IGAke3N0ZW19JHtlfWApXVxuICAgICAgICAgICAgLmZpbmQoaXNSZWFkYWJsZUZpbGUpXG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG59XG5cbi8qKlxuICogY3dkLXJlbGF0aXZlIGZvcm0gb2YgYSBGSUxFIHBhdGgsIGZvciBhbnl0aGluZyB0aGF0IGdldHMgdXBsb2FkZWQuXG4gKlxuICogVGhlIGJhc2VuYW1lIGZhbGxiYWNrIGlzIHNhZmUgaGVyZSBvbmx5IGJlY2F1c2UgYHBhdGgucmVsYXRpdmVgIGlzIG5ldmVyIGVtcHR5IGZvciBhIGZpbGUgXHUyMDE0XG4gKiBhIGZpbGUgaXMgbmV2ZXIgZXF1YWwgdG8gY3dkLiBEbyBOT1QgcGFzcyBhIGRpcmVjdG9yeTogc2VlIGByZWxhdGl2ZURpclRvQ3dkYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbGF0aXZlVG9Dd2QgPSAoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZmlsZVBhdGgpIHx8IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpXG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKVxuICAgIH1cbn1cblxuLyoqXG4gKiBjd2QtcmVsYXRpdmUgZm9ybSBvZiBhIERJUkVDVE9SWSBwYXRoLlxuICpcbiAqIGBwYXRoLnJlbGF0aXZlKGN3ZCwgY3dkKWAgaXMgYCcnYCwgd2hpY2ggaXMgdGhlIENPTU1PTiBjYXNlIGhlcmUgKGEgbWFuaWZlc3QgYXQgdGhlIHByb2plY3RcbiAqIHJvb3QpLCBzbyBhIGJhc2VuYW1lIGZhbGxiYWNrIHdvdWxkIHJlcG9ydCB0aGUgZm9sZGVyIG5hbWUgXHUyMDE0IGFuZCBmb3IgYSBwcm9qZWN0IGNoZWNrZWQgb3V0XG4gKiBkaXJlY3RseSBpbiBgJEhPTUVgIHRoYXQgZm9sZGVyIG5hbWUgaXMgdGhlIE9TIHVzZXJuYW1lLCB3aGljaCBpcyB0aGUgZXhhY3QgZXhwb3N1cmUgdGhlXG4gKiByZWxhdGl2ZS1wYXRoIGhhbmRsaW5nIGV4aXN0cyB0byBwcmV2ZW50LiBFbXB0eSBtZWFucyBcImN3ZFwiLCBzbyByZW5kZXIgaXQgYXMgYC5gLlxuICovXG5leHBvcnQgY29uc3QgcmVsYXRpdmVEaXJUb0N3ZCA9IChkaXI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZGlyKSB8fCAnLidcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuICcuJ1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSB1c2VyJ3Mgd2RpbyBjb25maWcgZmlsZS5cbiAqXG4gKiBXRElPIGtlZXBzIHRoZSByZWFsIHBhdGggaW4gYENvbmZpZ1BhcnNlcmAncyBwcml2YXRlIGAjY29uZmlnRmlsZVBhdGhgLCB3aGljaCBubyBzZXJ2aWNlIGNhblxuICogcmVhY2gsIHNvIHRoaXMgcmVjb25zdHJ1Y3RzIGl0IGZyb20gdGhlIHZhbHVlcyB0aGUgQ0xJIGRvZXMgbGVhdmUgb24gdGhlIG1lcmdlZCBjb25maWcgXHUyMDE0XG4gKiBtaXJyb3JpbmcgaG93IGBAd2Rpby9jbGlgIGl0c2VsZiByZXNvbHZlcyBpdC4gVGhlIENMSSBuZXZlciBzZWFyY2hlczogaXQgdGFrZXMgb25lIGNhbmRpZGF0ZVxuICogYW5kIHByb2JlcyBvbmUgc3RlbSBhY3Jvc3MgdGhlIHN1cHBvcnRlZCBleHRlbnNpb25zLCBzbyBuZWl0aGVyIGRvZXMgdGhpcy5cbiAqXG4gKiAgIDEuIEJST1dTRVJTVEFDS19XRElPX0NPTkZJR19GSUxFX1BBVEggIFx1MjAxNCBleHBsaWNpdCBvdmVycmlkZSAvIHN1cHBvcnQgZXNjYXBlIGhhdGNoXG4gKiAgIDIuIGNvbmZpZ1snY29uZmlnLXBhdGgnXSAgICAgICAgICAgICAgIFx1MjAxNCB5YXJncycga2ViYWIgYWxpYXMgb2YgdGhlIGBydW4gPGNvbmZpZ1BhdGg+YFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uYWwgKHY4IGFuZCB2OSBhbGlrZSlcbiAqICAgMy4gY29uZmlnLl9bMF0gICAgICAgICAgICAgICAgICAgICAgICAgXHUyMDE0IHRoZSBiYXJlIGB3ZGlvIDxjb25maWc+YCBmb3JtLCB3aGljaCBgcnVuLnRzYFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZiByZXNvbHZlcyBmcm9tIGBwYXJhbXMuX1swXWBcbiAqICAgNC4gcm9vdERpciArIHdkaW8uY29uZi48ZXh0PiAgICAgICAgICAgXHUyMDE0IG5vLWFyZyBgd2Rpb2AsIGFuZCBwcm9ncmFtbWF0aWMgYG5ldyBMYXVuY2hlcigpYFxuICogICA1LiBjd2QgKyB3ZGlvLmNvbmYuPGV4dD4gICAgICAgICAgICAgICBcdTIwMTQgd2hlbiB0aGUgdXNlciBvdmVycmlkZXMgYHJvb3REaXJgIGluIHRoZWlyIGNvbmZpZ1xuICpcbiAqIGBjb25maWcuX2AgaXMgcmVhZCByYXRoZXIgdGhhbiByYXcgYHByb2Nlc3MuYXJndmA6IGl0IGlzIHRoZSBzYW1lIHBvc2l0aW9uYWwgQUZURVIgeWFyZ3MgaGFzXG4gKiBhcHBsaWVkIHdkaW8ncyBvd24gb3B0aW9uIGRlY2xhcmF0aW9ucy4gU2Nhbm5pbmcgYXJndiBtZWFucyByZS1pbXBsZW1lbnRpbmcgdGhhdCB3aXRoIGFcbiAqIGhldXJpc3RpYyB0aGF0IGNhbm5vdCBrbm93IHdoaWNoIGZsYWdzIGFyZSBib29sZWFuIFx1MjAxNCBhbmQgYHdkaW8gLS13YXRjaCAuL2EuY29uZi50c2AgcHV0cyB0aGVcbiAqIHJlYWwgY29uZmlnIGluIGBfWzBdYCB3aGlsZSBhbnkgXCJza2lwIGEgZmxhZydzIHZhbHVlXCIgcnVsZSB0aHJvd3MgaXQgYXdheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXZGlvQ29uZmlnUGF0aChjb25maWc/OiBPcHRpb25zLlRlc3RydW5uZXIpOiBDb25maWdQYXRoUmVzb2x1dGlvbiB7XG4gICAgY29uc3QgcmVjb3JkID0gKGNvbmZpZyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uYWxzID0gQXJyYXkuaXNBcnJheShyZWNvcmQuXykgPyByZWNvcmQuXyBhcyB1bmtub3duW10gOiBbXVxuICAgICAgICBjb25zdCBwb3NpdGlvbmFsID0gcG9zaXRpb25hbHMuZmlsdGVyKFxuICAgICAgICAgICAgKGVudHJ5KTogZW50cnkgaXMgc3RyaW5nID0+IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycgJiYgIVdESU9fQ0xJX1NVQkNPTU1BTkRTLmluY2x1ZGVzKGVudHJ5KVxuICAgICAgICApWzBdXG4gICAgICAgIGNvbnN0IHJvb3REaXIgPSB0eXBlb2YgcmVjb3JkLnJvb3REaXIgPT09ICdzdHJpbmcnID8gcmVjb3JkLnJvb3REaXIgOiB1bmRlZmluZWRcblxuICAgICAgICBjb25zdCBydW5nczogQXJyYXk8W3N0cmluZywgdW5rbm93bl0+ID0gW1xuICAgICAgICAgICAgWydlbnZfb3ZlcnJpZGUnLCBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfRklMRV9QQVRIXV0sXG4gICAgICAgICAgICBbJ2NsaV9jb25maWdfcGF0aCcsIHJlY29yZFsnY29uZmlnLXBhdGgnXV0sXG4gICAgICAgICAgICBbJ2NvbmZpZ19wb3NpdGlvbmFsJywgcG9zaXRpb25hbF0sXG4gICAgICAgICAgICBbJ3Jvb3RfZGlyX2RlZmF1bHQnLCByb290RGlyICYmIHBhdGguam9pbihyb290RGlyLCBERUZBVUxUX1dESU9fQ09ORklHX0JBU0VOQU1FKV0sXG4gICAgICAgICAgICBbJ2N3ZF9kZWZhdWx0JywgREVGQVVMVF9XRElPX0NPTkZJR19CQVNFTkFNRV1cbiAgICAgICAgXVxuXG4gICAgICAgIGZvciAoY29uc3QgW3N0cmF0ZWd5LCB2YWx1ZV0gb2YgcnVuZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSByZXNvbHZlQ2FuZGlkYXRlKHZhbHVlKVxuICAgICAgICAgICAgaWYgKGNvbmZpZ1BhdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBjb25maWdQYXRoLCBzdHJhdGVneSB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyByZWFzb246ICdjb25maWdfbm90X2ZvdW5kJyB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB7IHJlYXNvbjogJ2NvbmZpZ19yZXNvbHZlX2V4Y2VwdGlvbicgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIG9uY2UsIGFzIGVhcmx5IGFzIHBvc3NpYmxlLCBhbmQgcHVibGlzaCB0aGUgYW5zd2VyIG9uIHRoZSBlbnZpcm9ubWVudCBzbyB0aGVcbiAqIHVwbG9hZCBwYXRoIChhbmQgYW55IHdvcmtlcikgcmVhZHMgdGhlIFNBTUUgdmFsdWUgaW5zdGVhZCBvZiByZS1kZXJpdmluZyBpdCBmcm9tIGN3ZC5cbiAqXG4gKiBSZS1yZXNvbHZpbmcgYXQgYXJjaGl2ZSB0aW1lIGlzIHByZWNpc2VseSB0aGUgYnVnIFNESy01OTkzIGZpeGVkIGluIHRoZSBOb2RlIFNESzogdGhlXG4gKiBhcmNoaXZlIHN0ZXAgcmVhZCBgY3dkL2Jyb3dzZXJzdGFjay55bWxgIHdoaWxlIHN0YXJ0dXAgaGFkIHJlc29sdmVkIGEgZGlmZmVyZW50IHBhdGgsXG4gKiBzaWxlbnRseSBkcm9wcGluZyB0aGUgY29uZmlnIGZvciBldmVyeSBtb25vcmVwbyAvIHN1YmRpciBDSSBydW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0V2Rpb0NvbmZpZ1BhdGgoY29uZmlnPzogT3B0aW9ucy5UZXN0cnVubmVyKTogQ29uZmlnUGF0aFJlc29sdXRpb24ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGFscmVhZHlSZXNvbHZlZCA9IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19XRElPX0NPTkZJR19GSUxFX1BBVEhdXG4gICAgICAgIGlmIChhbHJlYWR5UmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIC8vIFJlcG9ydCB0aGUgcnVuZyB0aGF0IE9SSUdJTkFMTFkgYW5zd2VyZWQsIG5vdCB0aGUgZW52IHZhciB0aGlzIGZ1bmN0aW9uXG4gICAgICAgICAgICAvLyBpdHNlbGYgd3JvdGUgXHUyMDE0IG90aGVyd2lzZSBldmVyeSBydW4gcmVwb3J0cyBgZW52X292ZXJyaWRlYCBhbmQgdGhlIG1ldHJpY1xuICAgICAgICAgICAgLy8gY2FuIG5ldmVyIHRlbGwgdXMgaG93IG9mdGVuIHRoZSBmYWxsYmFja3MgYXJlIGNhcnJ5aW5nIGN1c3RvbWVycy5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29uZmlnUGF0aDogYWxyZWFkeVJlc29sdmVkLFxuICAgICAgICAgICAgICAgIHN0cmF0ZWd5OiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfU1RSQVRFR1ldIHx8ICdlbnZfb3ZlcnJpZGUnXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gcmVzb2x2ZVdkaW9Db25maWdQYXRoKGNvbmZpZylcbiAgICAgICAgaWYgKHJlc29sdXRpb24uY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX0ZJTEVfUEFUSF0gPSByZXNvbHV0aW9uLmNvbmZpZ1BhdGhcbiAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uLnN0cmF0ZWd5KSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX1NUUkFURUdZXSA9IHJlc29sdXRpb24uc3RyYXRlZ3lcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlbGF0aXZlIHRvIGN3ZDogdGhpcyBsb2cgZmlsZSBpcyBpdHNlbGYgdXBsb2FkZWQsIGFuZCBhbiBhYnNvbHV0ZSBwYXRoIGxlYWtzXG4gICAgICAgICAgICAvLyB0aGUgT1MgdXNlcm5hbWUgYW5kIGRpcmVjdG9yeSBsYXlvdXQgKGAvVXNlcnMvamFuZS5kb2UvLi4uYCkuIGBwYXRoLnJlbGF0aXZlYFxuICAgICAgICAgICAgLy8gc3RpbGwgeWllbGRzIGAuLi8uLi9zaGFyZWQvd2Rpby5jb25mLnRzYCBmb3IgYSBjb25maWcgb3V0c2lkZSBjd2QsIHNvIHRoZVxuICAgICAgICAgICAgLy8gbW9ub3JlcG8vc3ViZGlyIGRpYWdub3N0aWMgXHUyMDE0IHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBvZiBsb2dnaW5nIGl0IFx1MjAxNCBzdXJ2aXZlcy5cbiAgICAgICAgICAgIC8vIFBhdGggYmVmb3JlIHN0cmF0ZWd5OiBCU3RhY2tMb2dnZXIgc2NydWJzIGFueSBgPC4uLj5rZXk6YC9gPC4uLj51c2VyOmAgcHJlZml4ZWRcbiAgICAgICAgICAgIC8vIHZhbHVlLCBzbyBhIHN0cmF0ZWd5IG5hbWUgZW5kaW5nIGluIGBrZXlgL2B1c2VyYCBoZXJlIHdvdWxkIHJlZGFjdCB0aGUgcGF0aC5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgUmVzb2x2ZWQgd2RpbyBjb25maWcgZmlsZSAke3JlbGF0aXZlVG9Dd2QocmVzb2x1dGlvbi5jb25maWdQYXRoKX0gZm9yIGF1dG8tY2FwdHVyZSAoc3RyYXRlZ3kgJHtyZXNvbHV0aW9uLnN0cmF0ZWd5fSlgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBDb3VsZCBub3QgcmVzb2x2ZSB3ZGlvIGNvbmZpZyBmaWxlIGZvciBhdXRvLWNhcHR1cmU6ICR7cmVzb2x1dGlvbi5yZWFzb259YClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x1dGlvblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3Igd2hpbGUgcmVzb2x2aW5nIHdkaW8gY29uZmlnIGZpbGU6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIHsgcmVhc29uOiAnY29uZmlnX3Jlc29sdmVfZXhjZXB0aW9uJyB9XG4gICAgfVxufVxuXG4vKipcbiAqIE9wdC1vdXQgZm9yIGF1dG8tY2FwdHVyZWQgbG9ncy4gU2VydmljZSBvcHRpb24gZmlyc3QsIGVudiB2YXIgYXMgdGhlIENJIGVzY2FwZSBoYXRjaFxuICogKGN1c3RvbWVycyBjYW5ub3QgYWx3YXlzIGVkaXQgYSBjb21taXR0ZWQgY29uZmlnKS4gTmFtZSBtYXRjaGVzIHRoZSBOb2RlIFNESydzXG4gKiBgZGlzYWJsZUF1dG9DYXB0dXJlTG9nc2Agc28gdGhlIGZsYWcgbWVhbnMgdGhlIHNhbWUgdGhpbmcgYWNyb3NzIEJyb3dzZXJTdGFjayBTREtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBdXRvQ2FwdHVyZUxvZ3NEaXNhYmxlZChvcHRpb25zPzogeyBkaXNhYmxlQXV0b0NhcHR1cmVMb2dzPzogYm9vbGVhbiB9KTogYm9vbGVhbiB7XG4gICAgaWYgKG9wdGlvbnM/LmRpc2FibGVBdXRvQ2FwdHVyZUxvZ3MgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfRElTQUJMRV9BVVRPX0NBUFRVUkVfTE9HU10gfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJ1xufVxuXG4vKipcbiAqIE1pcnJvciB0aGUgc2VydmljZSBvcHRpb24gb250byB0aGUgZW52aXJvbm1lbnQgc28gdGhlIG9wdC1vdXQgc3Vydml2ZXMgaW50byB0aGVcbiAqIERFVEFDSEVEIGNsZWFudXAgcHJvY2Vzcywgd2hpY2ggZ2V0cyBubyBvcHRpb25zIG9iamVjdC5cbiAqXG4gKiBXaXRob3V0IHRoaXMgdGhlIG9wdC1vdXQgaXMgd29yc2UgdGhhbiB1c2VsZXNzOiBza2lwcGluZyB0aGUgdXBsb2FkIGxlYXZlc1xuICogYGxvZ3NVcGxvYWRlZGAgZmFsc2UsIHdoaWNoIGlzIGV4YWN0bHkgdGhlIGNvbmRpdGlvbiB0aGF0IGFybXMgdGhlIGV4aXQtdGltZVxuICogYC0tdXBsb2FkTG9nc2AgcmVzY3VlIFx1MjAxNCBzbyBldmVyeSBvcHRlZC1vdXQgcnVuIGhhZCBpdHMgY29uZmlnIHJlYWQgYW5kIFBPU1RlZCBieSB0aGVcbiAqIGNsZWFudXAgY2hpbGQuIFJldHVybnMgd2hldGhlciBhdXRvLWNhcHR1cmUgaXMgZGlzYWJsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaXNoQXV0b0NhcHR1cmVEaXNhYmxlZChvcHRpb25zPzogeyBkaXNhYmxlQXV0b0NhcHR1cmVMb2dzPzogYm9vbGVhbiB9KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGlzYWJsZWQgPSBpc0F1dG9DYXB0dXJlTG9nc0Rpc2FibGVkKG9wdGlvbnMpXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19ESVNBQkxFX0FVVE9fQ0FQVFVSRV9MT0dTXSA9ICd0cnVlJ1xuICAgIH1cbiAgICByZXR1cm4gZGlzYWJsZWRcbn1cblxuLyoqXG4gKiBMaW5lLWxldmVsIGNyZWRlbnRpYWwgc2NydWIsIHBvcnRlZCBmcm9tIHRoZSBOb2RlIFNESydzIGByZWRhY3RTZW5zaXRpdmVDb250ZW50YC5cbiAqXG4gKiBBbnkgbGluZSBtZW50aW9uaW5nIGEgc2Vuc2l0aXZlIGtleSBjb2xsYXBzZXMgdG8gYDxrZXk+OiBbUkVEQUNURURdYC4gV29yZCBib3VuZGFyaWVzXG4gKiBrZWVwIGBob3RrZXlgIC8gYGtleXdvcmRgIGZyb20gdHJpcHBpbmcgdGhlIGJhcmUgYGtleWAgZW50cnkgdGhhdCBXRElPJ3MgdG9wLWxldmVsXG4gKiBjcmVkZW50aWFsIG9wdGlvbnMgZm9yY2UgdXMgdG8gY2FycnkuIGAuYCBpcyBpbnRlbnRpb25hbGx5IE5PVCBwYXJ0IG9mIHRoZSBib3VuZGFyeVxuICogY2xhc3Mgc28gYGJzdGFja09wdGlvbnMuYWNjZXNzS2V5ID0gJy4uLidgIHN0aWxsIG1hdGNoZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWRhY3RTZW5zaXRpdmVDb250ZW50KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0ZXh0XG4gICAgfVxuXG4gICAgY29uc3QgZXNjYXBlUmVnZXggPSAodmFsdWU6IHN0cmluZykgPT4gdmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKVxuICAgIC8vIGxvbmdlc3QgZmlyc3Q6IGFsdGVybmF0aW9uIHJldHVybnMgdGhlIGZpcnN0IG1hdGNoLCBub3QgdGhlIGxvbmdlc3Qgb25lXG4gICAgY29uc3Qga2V5cyA9IFsuLi5SRURBQ1RFRF9LRVlTXVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aClcbiAgICAgICAgLm1hcChlc2NhcGVSZWdleClcbiAgICAgICAgLmpvaW4oJ3wnKVxuICAgIGNvbnN0IHJlZGFjdFJlZ2V4ID0gbmV3IFJlZ0V4cChgXi4qPyg/PCFbQS1aYS16MC05XyRdKSgke2tleXN9KSg/IVtBLVphLXowLTlfJF0pLiokYCwgJ2dtaScpXG5cbiAgICAvLyBDb21wb3VuZCBpZGVudGlmaWVycyBlbmRpbmcgaW4gYSBzZW5zaXRpdmUgd29yZCwgd2hpY2ggdGhlIHdob2xlLXdvcmQgcGFzcyBhYm92ZVxuICAgIC8vIGNhbm5vdCBzZWU6IGl0cyBsb29rYmVoaW5kIHJlamVjdHMgdGhlIHByZWNlZGluZyBsZXR0ZXIgaW4gYGNsaWVudFNlY3JldGAgL1xuICAgIC8vIGByZWZyZXNoVG9rZW5gIC8gYHByaXZhdGVLZXlgLCBhbmQgdGhlIHByZWNlZGluZyBgX2AgaW4gYGNsaWVudF9zZWNyZXRgLlxuICAgIC8vXG4gICAgLy8gY2FtZWxDYXNlIHN0YXlzIGNhc2UtU0VOU0lUSVZFOiByZXF1aXJpbmcgYSBjYXBpdGFsaXNlZCBzdWZmaXggaXMgd2hhdCBzZXBhcmF0ZXNcbiAgICAvLyBgcHJpdmF0ZUtleWAgZnJvbSBgaG90a2V5YCwgc28gdGhpcyBjbG9zZXMgdGhlIGxlYWsgd2l0aG91dCB0aGUgZmFsc2UgcG9zaXRpdmVzIGFcbiAgICAvLyBiYXJlIC9rZXl8dG9rZW58c2VjcmV0LyBwYXNzIHdvdWxkIHByb2R1Y2UuIFRoZSBjb3JlIGRvZXMgTk9UIHJlcXVpcmUgYSBsb3dlcmNhc2VcbiAgICAvLyBjaGFyIGJlZm9yZSB0aGUgc3VmZml4IFx1MjAxNCB0aGF0IGd1YXJkIG9ubHkgZXZlciBkdXBsaWNhdGVkIHRoZSBjYXNlLXNlbnNpdGl2aXR5LCB3aGlsZVxuICAgIC8vIHJlamVjdGluZyBhY3JvbnltIHByZWZpeGVzIChgQVBJVG9rZW5gLCBgSldUU2VjcmV0YCwgYFNTSEtleWAsIGBBV1NTZWNyZXRgKS5cbiAgICAvLyBJZGVudGlmaWVyIHNjYW5zIGFyZSBib3VuZGVkIGF0IDY0IGNoYXJzLiBSZWFsIGNvbmZpZyBrZXlzIGFyZSBmYXIgc2hvcnRlciwgc28gdGhpc1xuICAgIC8vIGNoYW5nZXMgbm8gbWF0Y2g7IGl0IGlzIGRlZmVuY2UtaW4tZGVwdGggYWdhaW5zdCBiYWNrdHJhY2tpbmcgb24gYSBwYXRob2xvZ2ljYWwgbGluZVxuICAgIC8vIChhIG1pbmlmaWVkL2Jhc2U2NCBydW4pLCBrZWVwaW5nIGV2ZXJ5IHN0YXJ0IHBvc2l0aW9uIE8oMSkgaW5zdGVhZCBvZiBPKG4pLlxuICAgIGNvbnN0IGNvbXBvdW5kQ2FtZWxSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeLio/KD88IVtBLVphLXowLTlfJF0pKFtBLVphLXowLTlfJF17MSw2NH0oPzoke0NPTVBPVU5EX1NFQ1JFVF9TVUZGSVhFU19DQU1FTH0pKVxcXFxzKls6PV0uKiRgLFxuICAgICAgICAnZ20nXG4gICAgKVxuICAgIC8vIHNuYWtlX2Nhc2UgaXMgbWF0Y2hlZCBjYXNlLUlOU0VOU0lUSVZFTFksIHdoaWNoIGlzIHNhZmUgcHJlY2lzZWx5IGJlY2F1c2UgaXQgcmVxdWlyZXNcbiAgICAvLyBhbiBleHBsaWNpdCBgX2AgYmVmb3JlIHRoZSBzdWZmaXguIFRoYXQgY292ZXJzIFNDUkVBTUlOR19TTkFLRV9DQVNFIFx1MjAxNCB0aGUgZG9taW5hbnRcbiAgICAvLyBjb252ZW50aW9uIGZvciBzZWNyZXRzIGluIGNvbmZpZy9lbnYgZmlsZXMgKGBBV1NfU0VDUkVUX0FDQ0VTU19LRVlgLCBgR0lUSFVCX1RPS0VOYCkgXHUyMDE0XG4gICAgLy8gd2hpbGUgYGtleXdvcmRgIGFuZCBgbXlfc2VjcmV0YXJ5YCBzdGlsbCBmYWxsIG91dCwgc2luY2UgbmVpdGhlciBoYXMgYF88c3VmZml4PmBcbiAgICAvLyBpbW1lZGlhdGVseSBiZWZvcmUgYW4gYXNzaWdubWVudC5cbiAgICBjb25zdCBjb21wb3VuZFNuYWtlUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICBgXi4qPyg/PCFbQS1aYS16MC05XyRdKShbQS1aYS16MC05XyRdezAsNjR9Xyg/OiR7Q09NUE9VTkRfU0VDUkVUX1NVRkZJWEVTX1NOQUtFfSkpXFxcXHMqWzo9XS4qJGAsXG4gICAgICAgICdnbWknXG4gICAgKVxuXG4gICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKVxuICAgICAgICAvLyBCbG9jay1sZXZlbCBwYXNzZXMgcnVuIEZJUlNUOiB0aGV5IHNwYW4gbGluZXMsIGFuZCB0aGUgbGluZS1hbmNob3JlZCBwYXNzZXMgYmVsb3dcbiAgICAgICAgLy8gY2FuIG9ubHkgZXZlciBzZWUgdGhlIG9uZSBsaW5lIHRoYXQgY2FycmllcyB0aGUga2V5IG5hbWUuXG4gICAgICAgIC5yZXBsYWNlKFBFTV9CTE9DS19SRUdFWCwgJyQxW1JFREFDVEVEXSQyJylcbiAgICAgICAgLnJlcGxhY2UoUEVNX1VOVEVSTUlOQVRFRF9SRUdFWCwgJyQxW1JFREFDVEVEXScpXG4gICAgICAgIC5yZXBsYWNlKFVSTF9VU0VSSU5GT19SRUdFWCwgJyQxW1JFREFDVEVEXUAnKVxuICAgICAgICAucmVwbGFjZShyZWRhY3RSZWdleCwgJyQxOiBbUkVEQUNURURdJylcbiAgICAgICAgLnJlcGxhY2UoY29tcG91bmRDYW1lbFJlZ2V4LCAnJDE6IFtSRURBQ1RFRF0nKVxuICAgICAgICAucmVwbGFjZShjb21wb3VuZFNuYWtlUmVnZXgsICckMTogW1JFREFDVEVEXScpXG59XG5cbmNvbnN0IHJlYWRDYXBwZWRGaWxlID0gKGZpbGVQYXRoOiBzdHJpbmcpOiB7IGNvbnRlbnQ/OiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyB9ID0+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzaXplID0gZnMuc3RhdFN5bmMoZmlsZVBhdGgpLnNpemVcbiAgICAgICAgaWYgKHNpemUgPiBNQVhfQ0FQVFVSRURfQ09ORklHX0ZJTEVfQllURVMpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJlYXNvbjogYCR7cGF0aC5iYXNlbmFtZShmaWxlUGF0aCl9OiB0b29fbGFyZ2UgKCR7c2l6ZX0gYnl0ZXMpYCB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY29udGVudDogZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4geyByZWFzb246IGAke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfTogJHsoZXJyb3IgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IFN0cmluZyhlcnJvcil9YCB9XG4gICAgfVxufVxuXG4vKipcbiAqIFJlc29sdmUgYSByZWxhdGl2ZSBpbXBvcnQgc3BlY2lmaWVyIGFnYWluc3QgdGhlIGltcG9ydGluZyBmaWxlLlxuICpcbiAqIEhhbmRsZXMgdGhlIFR5cGVTY3JpcHQtRVNNIGNvbnZlbnRpb24gd2hlcmUgYC4vc2hhcmVkLmNvbmYuanNgIG9uIGRpc2sgaXMgYWN0dWFsbHlcbiAqIGAuL3NoYXJlZC5jb25mLnRzYCwgcGx1cyBleHRlbnNpb24tbGVzcyBhbmQgZGlyZWN0b3J5IChgL2luZGV4LipgKSBzcGVjaWZpZXJzLlxuICovXG4vKipcbiAqIE9ubHkgZmlsZXMgdGhhdCBhcmUgdGhlbXNlbHZlcyBjb25maWdzIGFyZSBmb2xsb3dlZC5cbiAqXG4gKiBBIHJlbGF0aXZlIHNwZWNpZmllciByZXNvbHZlcyB0byB3aGF0ZXZlciB0aGUgY29uZmlnIGhhcHBlbnMgdG8gaW1wb3J0LCB3aGljaCBpcyBmcmVxdWVudGx5XG4gKiBvcmRpbmFyeSBhcHBsaWNhdGlvbiBzb3VyY2UgKGAuL2hlbHBlcnMvdXRpbHMuanNgKSByYXRoZXIgdGhhbiBjb25maWd1cmF0aW9uLiBDYXB0dXJpbmcgdGhlXG4gKiBzcGxpdC1jb25maWcgY2FzZSAoYGJhc2UuY29uZi5qc2AsIGB3ZGlvLnNoYXJlZC5jb25mLnRzYCkgaXMgdGhlIHBvaW50OyBzaGlwcGluZyBhXG4gKiBjdXN0b21lcidzIGFwcGxpY2F0aW9uIG1vZHVsZXMgaXMgbm90LlxuICovXG5jb25zdCBpc0NvbmZpZ0ZpbGVOYW1lID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IC9cXC5jb25mKGlnKT9cXC5bXi5dKyQvaS50ZXN0KHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpKVxuXG5jb25zdCByZXNvbHZlUmVsYXRpdmVJbXBvcnQgPSAoc3BlY2lmaWVyOiBzdHJpbmcsIGZyb21GaWxlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGJhc2UgPSBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKGZyb21GaWxlKSwgc3BlY2lmaWVyKVxuXG4gICAgaWYgKGlzUmVhZGFibGVGaWxlKGJhc2UpICYmIFNVUFBPUlRFRF9XRElPX0NPTkZJR19FWFRFTlNJT05TLmluY2x1ZGVzKHBhdGguZXh0bmFtZShiYXNlKSkpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29uZmlnRmlsZU5hbWUoYmFzZSkgPyBiYXNlIDogdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3Qgd2l0aG91dEV4dCA9IFNVUFBPUlRFRF9XRElPX0NPTkZJR19FWFRFTlNJT05TLmluY2x1ZGVzKHBhdGguZXh0bmFtZShiYXNlKSlcbiAgICAgICAgPyBiYXNlLnNsaWNlKDAsIC1wYXRoLmV4dG5hbWUoYmFzZSkubGVuZ3RoKVxuICAgICAgICA6IGJhc2VcblxuICAgIGZvciAoY29uc3QgZXh0IG9mIFNVUFBPUlRFRF9XRElPX0NPTkZJR19FWFRFTlNJT05TKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGAke3dpdGhvdXRFeHR9JHtleHR9YFxuICAgICAgICBpZiAoaXNSZWFkYWJsZUZpbGUoY2FuZGlkYXRlKSAmJiBpc0NvbmZpZ0ZpbGVOYW1lKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGVcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUykge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLmpvaW4oYmFzZSwgYGluZGV4JHtleHR9YClcbiAgICAgICAgaWYgKGlzUmVhZGFibGVGaWxlKGNhbmRpZGF0ZSkgJiYgaXNDb25maWdGaWxlTmFtZShjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIENvbGxlY3QgbG9jYWwgZmlsZXMgYSBjb25maWcgcHVsbHMgaW4gKGB3ZGlvLnNoYXJlZC5jb25mLnRzYCBzdHlsZSBzcGxpdHMpLCBzbyBhXG4gKiBjYXB0dXJlZCBjb25maWcgaXMgbm90IGp1c3QgYSB0d28tbGluZSBmaWxlIHRoYXQgc3ByZWFkcyBhIGJhc2UgY29uZmlnIHdlIG5ldmVyIHNlZS5cbiAqXG4gKiBPbmx5IFJFTEFUSVZFIHNwZWNpZmllcnMgYXJlIGZvbGxvd2VkIFx1MjAxNCBiYXJlIHNwZWNpZmllcnMgYXJlIG5wbSBwYWNrYWdlcywgbmV2ZXIgdGhlXG4gKiBjdXN0b21lcidzIG93biBjb25maWcuIERlcHRoIGFuZCBjb3VudCBhcmUgY2FwcGVkIHNvIHRoaXMgY2FuIG5ldmVyIHdhbGsgYSBzb3VyY2UgdHJlZS5cbiAqL1xuY29uc3QgY29sbGVjdExvY2FsSW1wb3J0cyA9IChlbnRyeVBhdGg6IHN0cmluZywgZW50cnlDb250ZW50OiBzdHJpbmcsIGJ1ZGdldDogbnVtYmVyKTogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfT4gPT4ge1xuICAgIGNvbnN0IGZvdW5kOiBBcnJheTx7IGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyB9PiA9IFtdXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoW2VudHJ5UGF0aF0pXG4gICAgbGV0IGZyb250aWVyOiBBcnJheTx7IGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyB9PiA9IFt7IGZpbGVQYXRoOiBlbnRyeVBhdGgsIGNvbnRlbnQ6IGVudHJ5Q29udGVudCB9XVxuXG4gICAgZm9yIChsZXQgZGVwdGggPSAwOyBkZXB0aCA8IENBUFRVUkVfQ09ORklHX0lNUE9SVF9ERVBUSCAmJiBmb3VuZC5sZW5ndGggPCBidWRnZXQ7IGRlcHRoKyspIHtcbiAgICAgICAgY29uc3QgbmV4dDogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfT4gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgeyBmaWxlUGF0aCwgY29udGVudCB9IG9mIGZyb250aWVyKSB7XG4gICAgICAgICAgICAvLyBgZnJvbSAnLi94J2AsIGBpbXBvcnQgJy4veCdgLCBgaW1wb3J0KCcuL3gnKWAsIGByZXF1aXJlKCcuL3gnKWBcbiAgICAgICAgICAgIGNvbnN0IGltcG9ydFJlZ2V4ID0gLyg/OmZyb218aW1wb3J0fHJlcXVpcmUpXFxzKlxcKD9cXHMqWydcIl0oXFwuW14nXCJdKilbJ1wiXS9nXG4gICAgICAgICAgICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcblxuICAgICAgICAgICAgd2hpbGUgKChtYXRjaCA9IGltcG9ydFJlZ2V4LmV4ZWMoY29udGVudCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kLmxlbmd0aCA+PSBidWRnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlUmVsYXRpdmVJbXBvcnQobWF0Y2hbMV0sIGZpbGVQYXRoKVxuICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWQgfHwgc2Vlbi5oYXMocmVzb2x2ZWQpIHx8IHJlc29sdmVkLmluY2x1ZGVzKGAke3BhdGguc2VwfW5vZGVfbW9kdWxlcyR7cGF0aC5zZXB9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2Vlbi5hZGQocmVzb2x2ZWQpXG5cbiAgICAgICAgICAgICAgICBjb25zdCB7IGNvbnRlbnQ6IGltcG9ydGVkQ29udGVudCB9ID0gcmVhZENhcHBlZEZpbGUocmVzb2x2ZWQpXG4gICAgICAgICAgICAgICAgaWYgKGltcG9ydGVkQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvdW5kLnB1c2goeyBmaWxlUGF0aDogcmVzb2x2ZWQsIGNvbnRlbnQ6IGltcG9ydGVkQ29udGVudCB9KVxuICAgICAgICAgICAgICAgIG5leHQucHVzaCh7IGZpbGVQYXRoOiByZXNvbHZlZCwgY29udGVudDogaW1wb3J0ZWRDb250ZW50IH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZnJvbnRpZXIgPSBuZXh0XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kXG59XG5cbi8qKlxuICogR2l2ZSBldmVyeSBhcmNoaXZlIGVudHJ5IGEgdW5pcXVlIG5hbWUuIFR3byBjb25maWdzIGNhbiBzaGFyZSBhIGJhc2VuYW1lXG4gKiAoYGNvbmZpZ3Mvd2Rpby5jb25mLnRzYCArIGBzaGFyZWQvd2Rpby5jb25mLnRzYCk7IHdpdGhvdXQgdGhpcyB0aGUgc2Vjb25kIHNpbGVudGx5XG4gKiBvdmVyd3JpdGVzIHRoZSBmaXJzdCwgc2luY2UgYXJjaGl2ZSBlbnRyaWVzIGFyZSBrZXllZCBieSBiYXNlbmFtZS5cbiAqXG4gKiBTaGFyZWQgd2l0aCBgdXBsb2FkTG9nc2AsIHdoaWNoIGRlLWR1cGVzIHRoZSBjb3BpZWQgbG9nIGZpbGVzIGFnYWluc3QgdGhlc2UgZW50cmllcyBcdTIwMTRcbiAqIG9uZSBpbXBsZW1lbnRhdGlvbiBzbyB0aGUgdHdvIGNhbiBuZXZlciBkaXNhZ3JlZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZHVwZUVudHJ5TmFtZShmaWxlUGF0aDogc3RyaW5nLCB0YWtlbjogU2V0PHN0cmluZz4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2UgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKVxuICAgIGlmICghdGFrZW4uaGFzKGJhc2UpKSB7XG4gICAgICAgIHRha2VuLmFkZChiYXNlKVxuICAgICAgICByZXR1cm4gYmFzZVxuICAgIH1cblxuICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShiYXNlKVxuICAgIGNvbnN0IHN0ZW0gPSBleHQgPyBiYXNlLnNsaWNlKDAsIC1leHQubGVuZ3RoKSA6IGJhc2VcbiAgICBsZXQgaW5kZXggPSAxXG4gICAgbGV0IGNhbmRpZGF0ZSA9IGAke3N0ZW19LiR7aW5kZXh9JHtleHR9YFxuICAgIHdoaWxlICh0YWtlbi5oYXMoY2FuZGlkYXRlKSkge1xuICAgICAgICBpbmRleCsrXG4gICAgICAgIGNhbmRpZGF0ZSA9IGAke3N0ZW19LiR7aW5kZXh9JHtleHR9YFxuICAgIH1cbiAgICB0YWtlbi5hZGQoY2FuZGlkYXRlKVxuICAgIHJldHVybiBjYW5kaWRhdGVcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgcmVkYWN0ZWQgY29uZmlnIGVudHJpZXMgYWRkZWQgdG8gdGhlIGF1dG8tY2FwdHVyZWQgbG9nIGFyY2hpdmUuXG4gKlxuICogQmVzdCBlZmZvcnQgYnkgY29udHJhY3Q6IGFueSBmYWlsdXJlIHJldHVybnMgd2hhdCB3YXMgZ2F0aGVyZWQgc28gZmFyIGFuZCBhIHJlYXNvblxuICogc3RyaW5nIGZvciB0aGUgU0RLX1VQTE9BRF9MT0dTIGV2ZW50LiBJdCBtdXN0IG5ldmVyIHRocm93IFx1MjAxNCBhIGRlYnVnIGFydGlmYWN0IGlzIG5ldmVyXG4gKiB3b3J0aCBmYWlsaW5nIGEgY3VzdG9tZXIncyB0ZXN0IHJ1biBvdmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdENvbmZpZ0ZpbGVzRm9yVXBsb2FkKGNvbmZpZz86IE9wdGlvbnMuVGVzdHJ1bm5lcik6IHsgZmlsZXM6IENhcHR1cmVkRmlsZVtdLCBmYWlsdXJlczogc3RyaW5nW10sIHN0cmF0ZWd5Pzogc3RyaW5nIH0ge1xuICAgIGNvbnN0IGZhaWx1cmVzOiBzdHJpbmdbXSA9IFtdXG4gICAgY29uc3QgZmlsZXM6IENhcHR1cmVkRmlsZVtdID0gW11cbiAgICBjb25zdCB0YWtlbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSBpbml0V2Rpb0NvbmZpZ1BhdGgoY29uZmlnKVxuICAgICAgICBpZiAoIXJlc29sdXRpb24uY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgZmFpbHVyZXMucHVzaChyZXNvbHV0aW9uLnJlYXNvbiB8fCAnY29uZmlnX25vdF9mb3VuZCcpXG4gICAgICAgICAgICByZXR1cm4geyBmaWxlcywgZmFpbHVyZXMgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBjb250ZW50LCByZWFzb24gfSA9IHJlYWRDYXBwZWRGaWxlKHJlc29sdXRpb24uY29uZmlnUGF0aClcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZmFpbHVyZXMucHVzaChyZWFzb24gfHwgJ2NvbmZpZ19yZWFkX2ZhaWxlZCcpXG4gICAgICAgICAgICByZXR1cm4geyBmaWxlcywgZmFpbHVyZXMsIHN0cmF0ZWd5OiByZXNvbHV0aW9uLnN0cmF0ZWd5IH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogZGVkdXBlRW50cnlOYW1lKHJlc29sdXRpb24uY29uZmlnUGF0aCwgdGFrZW5OYW1lcyksXG4gICAgICAgICAgICBzb3VyY2VQYXRoOiByZXNvbHV0aW9uLmNvbmZpZ1BhdGgsXG4gICAgICAgICAgICBjb250ZW50OiByZWRhY3RTZW5zaXRpdmVDb250ZW50KGNvbnRlbnQpXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgcmVtYWluaW5nID0gTUFYX0NBUFRVUkVEX0NPTkZJR19GSUxFUyAtIGZpbGVzLmxlbmd0aFxuICAgICAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgICAgICAgLy8gY29udGVudCBjb21lcyBiYWNrIGZyb20gdGhlIGRpc2NvdmVyeSBwYXNzIFx1MjAxNCByZS1yZWFkaW5nIGhlcmUgd291bGQgYmUgYSBzZWNvbmRcbiAgICAgICAgICAgIC8vIGRpc2sgcmVhZCBwZXIgZmlsZSBhbmQgY291bGQgYXJjaGl2ZSBkaWZmZXJlbnQgYnl0ZXMgdGhhbiB3ZXJlIHNjYW5uZWQuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGltcG9ydGVkIG9mIGNvbGxlY3RMb2NhbEltcG9ydHMocmVzb2x1dGlvbi5jb25maWdQYXRoLCBjb250ZW50LCByZW1haW5pbmcpKSB7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGRlZHVwZUVudHJ5TmFtZShpbXBvcnRlZC5maWxlUGF0aCwgdGFrZW5OYW1lcyksXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVBhdGg6IGltcG9ydGVkLmZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiByZWRhY3RTZW5zaXRpdmVDb250ZW50KGltcG9ydGVkLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGZpbGVzLCBmYWlsdXJlcywgc3RyYXRlZ3k6IHJlc29sdXRpb24uc3RyYXRlZ3kgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goYGNvbmZpZ19jYXB0dXJlX2V4Y2VwdGlvbjogJHsoZXJyb3IgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IFN0cmluZyhlcnJvcil9YClcbiAgICAgICAgcmV0dXJuIHsgZmlsZXMsIGZhaWx1cmVzIH1cbiAgICB9XG59XG5cbi8qKlxuICogV2FsayB1cCBmcm9tIGBzdGFydERpcmAgbG9va2luZyBmb3IgYGZpbGVOYW1lYCwgc3RvcHBpbmcgYXQgdGhlIGZpbGVzeXN0ZW0gcm9vdCBvclxuICogYWZ0ZXIgTUFYX1BBQ0tBR0VfSlNPTl9XQUxLX1VQIGxldmVscy5cbiAqL1xuY29uc3QgZmluZFVwd2FyZHMgPSAoc3RhcnREaXI6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgbGV0IGN1cnJlbnQgPSBzdGFydERpclxuICAgIGZvciAobGV0IGRlcHRoID0gMDsgZGVwdGggPD0gTUFYX1BBQ0tBR0VfSlNPTl9XQUxLX1VQOyBkZXB0aCsrKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGguam9pbihjdXJyZW50LCBmaWxlTmFtZSlcbiAgICAgICAgaWYgKGlzUmVhZGFibGVGaWxlKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoY3VycmVudClcbiAgICAgICAgaWYgKHBhcmVudCA9PT0gY3VycmVudCkge1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gcGFyZW50XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBgcGFja2FnZS5qc29uYCBmb3IgdGhlIHByb2plY3QgdGhlIGNvbmZpZyBiZWxvbmdzIHRvIFx1MjAxNCBmcmFtZXdvcmsgYW5kIHNlcnZpY2UgdmVyc2lvbnNcbiAqIGFyZSB0aGUgZmlyc3QgdGhpbmcgdHJpYWdlIG5lZWRzLCBhbmQgdGhlIGFyY2hpdmUgY2FycmllZCBuZWl0aGVyIGJlZm9yZS5cbiAqXG4gKiBXYWxrcyBVUCBmcm9tIHRoZSBjb25maWcncyBkaXJlY3RvcnksIGJlY2F1c2UgYGNvbmZpZ3Mvd2Rpby5jb25mLnRzYCAoYSB2ZXJ5IGNvbW1vblxuICogbGF5b3V0KSBwdXRzIHRoZSBtYW5pZmVzdCBvbmUgb3IgbW9yZSBsZXZlbHMgYWJvdmUgdGhlIGNvbmZpZywgbm90IGJlc2lkZSBpdC5cbiAqIEFyY2hpdmVkIHZlcmJhdGltOiBpdCBpcyBhIG1hbmlmZXN0LCBub3QgYSBzZWNyZXQgc3RvcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUGFja2FnZUpzb25Gb3JVcGxvYWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX0ZJTEVfUEFUSF1cbiAgICBjb25zdCBzdGFydERpcnMgPSBbY29uZmlnUGF0aCA/IHBhdGguZGlybmFtZShjb25maWdQYXRoKSA6IHVuZGVmaW5lZCwgcHJvY2Vzcy5jd2QoKV1cbiAgICAgICAgLmZpbHRlcigoZGlyKTogZGlyIGlzIHN0cmluZyA9PiBCb29sZWFuKGRpcikpXG5cbiAgICBmb3IgKGNvbnN0IGRpciBvZiBBcnJheS5mcm9tKG5ldyBTZXQoc3RhcnREaXJzKSkpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSBmaW5kVXB3YXJkcyhkaXIsICdwYWNrYWdlLmpzb24nKVxuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3VuZFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cbiIsICJpbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVTdGF0c092ZXJ2aWV3IH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBpc09iamVjdEVtcHR5IH0gZnJvbSAnLi4vdXRpbC5qcydcblxuaW50ZXJmYWNlIEZlYXR1cmVTdGF0c01hcCB7XG4gICAgW2dyb3VwSWQ6IHN0cmluZ106IEZlYXR1cmVTdGF0cztcbn1cblxuaW50ZXJmYWNlIEpTT05Db252ZXJzaW9uU2V0dGluZ3Mge1xuICAgIG9taXRHcm91cHM/OiBib29sZWFuXG4gICAgb25seUdyb3Vwcz86IGJvb2xlYW5cbiAgICBuZXN0ZWRHcm91cHM/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZSB7XG4gICAgdHJpZ2dlcmVkQ291bnQ6IG51bWJlclxuICAgIHNlbnRDb3VudDogbnVtYmVyXG4gICAgZmFpbGVkQ291bnQ6IG51bWJlclxuICAgIGdyb3VwczogRmVhdHVyZVtdXG59XG5cbmNsYXNzIEZlYXR1cmVTdGF0cyB7XG4gICAgcHJpdmF0ZSB0cmlnZ2VyZWRDb3VudDogbnVtYmVyID0gMFxuICAgIHByaXZhdGUgc2VudENvdW50OiBudW1iZXIgPSAwXG4gICAgcHJpdmF0ZSBmYWlsZWRDb3VudDogbnVtYmVyID0gMFxuICAgIHByaXZhdGUgZ3JvdXBzOiBGZWF0dXJlU3RhdHNNYXAgPSB7fVxuXG4gICAgcHVibGljIG1hcmsoc3RhdHVzOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgICBjYXNlICd0cmlnZ2VyZWQnOlxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyZWQoZ3JvdXBJZClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3N1Y2Nlc3MnOlxuICAgICAgICBjYXNlICdzZW50JzpcbiAgICAgICAgICAgIHRoaXMuc2VudChncm91cElkKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkKGdyb3VwSWQpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdSZXF1ZXN0IHRvIG1hcmsgdXNhZ2UgZm9yIHVua25vd24gc3RhdHVzIC0gJyArIHN0YXR1cylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlcmVkKGdyb3VwSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyZWRDb3VudCArPSAxXG4gICAgICAgIGlmIChncm91cElkKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUdyb3VwKGdyb3VwSWQpLnRyaWdnZXJlZCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2VudChncm91cElkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VudENvdW50ICs9IDFcbiAgICAgICAgaWYgKGdyb3VwSWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoZ3JvdXBJZCkuc2VudCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZmFpbGVkKGdyb3VwSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mYWlsZWRDb3VudCArPSAxXG4gICAgICAgIGlmIChncm91cElkKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUdyb3VwKGdyb3VwSWQpLmZhaWxlZCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3VjY2Vzcyhncm91cElkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VudChncm91cElkKVxuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVHcm91cChncm91cElkOiBzdHJpbmcpOiBGZWF0dXJlU3RhdHMge1xuICAgICAgICBpZiAoIXRoaXMuZ3JvdXBzW2dyb3VwSWRdKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3Vwc1tncm91cElkXSA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwc1tncm91cElkXVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUcmlnZ2VyZWRDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50cmlnZ2VyZWRDb3VudFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZW50Q291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VudENvdW50XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZhaWxlZENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmZhaWxlZENvdW50XG4gICAgfVxuXG4gICAgcHVibGljIGdldFVzYWdlRm9yR3JvdXAoZ3JvdXBJZDogc3RyaW5nKTogRmVhdHVyZVN0YXRzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzW2dyb3VwSWRdIHx8IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPdmVydmlldygpOiBGZWF0dXJlU3RhdHNPdmVydmlldyB7XG4gICAgICAgIHJldHVybiB7IHRyaWdnZXJlZENvdW50OiB0aGlzLnRyaWdnZXJlZENvdW50LCBzZW50Q291bnQ6IHRoaXMuc2VudENvdW50LCBmYWlsZWRDb3VudDogdGhpcy5mYWlsZWRDb3VudCB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEdyb3VwcygpOiBGZWF0dXJlU3RhdHNNYXAge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKGZlYXR1cmVTdGF0czogRmVhdHVyZVN0YXRzKTogdm9pZCB7XG4gICAgICAgIHRoaXMudHJpZ2dlcmVkQ291bnQgKz0gZmVhdHVyZVN0YXRzLmdldFRyaWdnZXJlZENvdW50KClcbiAgICAgICAgdGhpcy5zZW50Q291bnQgKz0gZmVhdHVyZVN0YXRzLmdldFNlbnRDb3VudCgpXG4gICAgICAgIHRoaXMuZmFpbGVkQ291bnQgKz0gZmVhdHVyZVN0YXRzLmdldEZhaWxlZENvdW50KClcblxuICAgICAgICBPYmplY3QuZW50cmllcyhmZWF0dXJlU3RhdHMuZ2V0R3JvdXBzKCkpLmZvckVhY2goKFtncm91cElkLCBncm91cF0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoZ3JvdXBJZCkuYWRkKGdyb3VwKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8vIG9taXRHcm91cHM6IHRydWUvZmFsc2UgLT4gSW5jbHVkZSBncm91cHMgb3Igbm90XG4gICAgLy8gb25seUdyb3VwczogdHJ1ZS9mYWxzZSAtPiBkYXRhIGluY2x1ZGVzIG9ubHkgZ3JvdXBzXG4gICAgLy8gbmVzdGVkR3JvdXBzOiB0cnVlL2ZhbHNlIC0+IGdyb3VwcyB3aWxsIGJlIG5lc3RlZCBpbiBncm91cHMgaWYgdHJ1ZVxuICAgIHB1YmxpYyB0b0pTT04oY29uZmlnOiBKU09OQ29udmVyc2lvblNldHRpbmdzID0ge30pIHtcbiAgICAgICAgY29uc3Qgb3ZlcnZpZXdEYXRhOiBGZWF0dXJlU3RhdHNPdmVydmlld3xSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSAhY29uZmlnLm9ubHlHcm91cHMgPyB7XG4gICAgICAgICAgICB0cmlnZ2VyZWRDb3VudDogdGhpcy50cmlnZ2VyZWRDb3VudCxcbiAgICAgICAgICAgIHNlbnRDb3VudDogdGhpcy5zZW50Q291bnQsXG4gICAgICAgICAgICBmYWlsZWRDb3VudDogdGhpcy5mYWlsZWRDb3VudFxuICAgICAgICB9IDoge31cblxuICAgICAgICBjb25zdCBncm91cHNEYXRhOiBSZWNvcmQ8c3RyaW5nLCBGZWF0dXJlU3RhdHNPdmVydmlldz4gPSB7fVxuICAgICAgICBpZiAoIWNvbmZpZy5vbWl0R3JvdXBzKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmdyb3VwcykuZm9yRWFjaCgoW2dyb3VwSWQsIGdyb3VwXSkgPT4ge1xuICAgICAgICAgICAgICAgIGdyb3Vwc0RhdGFbZ3JvdXBJZF0gPSAoZ3JvdXAudG9KU09OKCkgYXMgRmVhdHVyZVN0YXRzT3ZlcnZpZXcpIC8vIEN1cnJlbnRseSBOZXN0ZWQgZ3JvdXBzIGFyZSBvbmx5IG92ZXJ2aWV3c1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBncm91cCA9IGNvbmZpZy5uZXN0ZWRHcm91cHMgPyB7IGdyb3VwczogZ3JvdXBzRGF0YSB9IDogZ3JvdXBzRGF0YVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5vdmVydmlld0RhdGEsXG4gICAgICAgICAgICAuLi5ncm91cFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSlNPTihqc29uOiBGZWF0dXJlKTogRmVhdHVyZVN0YXRzIHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcblxuICAgICAgICBpZiAoIWpzb24gfHwgaXNPYmplY3RFbXB0eShqc29uKSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRzXG4gICAgICAgIH1cbiAgICAgICAgc3RhdHMudHJpZ2dlcmVkQ291bnQgPSBqc29uLnRyaWdnZXJlZENvdW50XG4gICAgICAgIHN0YXRzLnNlbnRDb3VudCA9IGpzb24uc2VudENvdW50XG4gICAgICAgIHN0YXRzLmZhaWxlZENvdW50ID0ganNvbi5mYWlsZWRDb3VudFxuXG4gICAgICAgIGlmICghanNvbi5ncm91cHMpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0c1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGpzb24uZ3JvdXBzKS5mb3JFYWNoKChbZ3JvdXBJZCwgZ3JvdXBdKSA9PiB7XG4gICAgICAgICAgICBzdGF0cy5ncm91cHNbZ3JvdXBJZF0gPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZ3JvdXApXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBzdGF0c1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmVhdHVyZVN0YXRzXG4iLCAiaW1wb3J0IHsgZ2V0RXJyb3JTdHJpbmcgfSBmcm9tICcuLi91dGlsLmpzJ1xuXG5jbGFzcyBGZWF0dXJlVXNhZ2Uge1xuICAgIHByaXZhdGUgaXNUcmlnZ2VyZWQ/OiBib29sZWFuXG4gICAgcHJpdmF0ZSBzdGF0dXM/OiBzdHJpbmdcbiAgICBwcml2YXRlIGVycm9yPzogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3Rvcihpc1RyaWdnZXJlZD86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGlzVHJpZ2dlcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNUcmlnZ2VyZWQgPSBpc1RyaWdnZXJlZFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRyaWdnZXJlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNUcmlnZ2VyZWRcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VHJpZ2dlcmVkKHRyaWdnZXJlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmlzVHJpZ2dlcmVkID0gdHJpZ2dlcmVkXG4gICAgfVxuXG4gICAgcHVibGljIHNldFN0YXR1cyhzdGF0dXM6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1c1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFcnJvcihlcnJvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyB0cmlnZ2VyZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNUcmlnZ2VyZWQgPSB0cnVlXG4gICAgfVxuXG4gICAgcHVibGljIGZhaWxlZChlOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgdGhpcy5lcnJvciA9IGdldEVycm9yU3RyaW5nKGUpXG4gICAgfVxuXG4gICAgcHVibGljIHN1Y2Nlc3MoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ3N1Y2Nlc3MnXG4gICAgfVxuXG4gICAgcHVibGljIGdldFN0YXR1cygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXNcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RXJyb3IoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXNUcmlnZ2VyZWQ6IHRoaXMuaXNUcmlnZ2VyZWQsXG4gICAgICAgICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgICAgICAgICAgZXJyb3I6IHRoaXMuZXJyb3JcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmVhdHVyZVVzYWdlXG4iLCAiY2xhc3MgVGVzdE9wc0NvbmZpZyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBUZXN0T3BzQ29uZmlnXG4gICAgcHVibGljIGJ1aWxkU3RvcHBlZDogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGJ1aWxkSGFzaGVkSWQ/OiBzdHJpbmdcblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXNzaW5nIGFyZ3MgdG8gY29uc3RydWN0b3JcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IFRlc3RPcHNDb25maWcoLi4uYXJncylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2VcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBwdWJsaWMgbWFudWFsbHlTZXQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICApe1xuICAgICAgICBUZXN0T3BzQ29uZmlnLl9pbnN0YW5jZSA9IHRoaXNcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRlc3RPcHNDb25maWdcbiIsICJpbXBvcnQgRmVhdHVyZVN0YXRzLCB7IHR5cGUgRmVhdHVyZSB9IGZyb20gJy4vZmVhdHVyZVN0YXRzLmpzJ1xuaW1wb3J0IEZlYXR1cmVVc2FnZSBmcm9tICcuL2ZlYXR1cmVVc2FnZS5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCBUZXN0T3BzQ29uZmlnIGZyb20gJy4vdGVzdE9wc0NvbmZpZy5qcydcbmltcG9ydCB0eXBlIHsgVE9Vc2FnZVN0YXRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNhZ2VTdGF0IHtcbiAgICB0ZXN0RXZlbnRzOiB7XG4gICAgICAgIHN0YXJ0ZWQ6IEZlYXR1cmVcbiAgICAgICAgZmluaXNoZWQ6IEZlYXR1cmVcbiAgICB9XG4gICAgaG9va0V2ZW50czoge1xuICAgICAgICBzdGFydGVkOiBGZWF0dXJlXG4gICAgICAgIGZpbmlzaGVkOiBGZWF0dXJlXG4gICAgfVxuICAgIGxvZ0V2ZW50czogRmVhdHVyZVxuICAgIGNidFNlc3Npb25FdmVudHM6IEZlYXR1cmVcbiAgICBjYnRTZXNzaW9uU3RhdHM6IEZlYXR1cmVcbn1cblxuY2xhc3MgVXNhZ2VTdGF0cyB7XG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZTogVXNhZ2VTdGF0c1xuICAgIHB1YmxpYyB0ZXN0U3RhcnRlZFN0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgdGVzdEZpbmlzaGVkU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyBob29rU3RhcnRlZFN0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgaG9va0ZpbmlzaGVkU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyBjYnRTZXNzaW9uU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyBsb2dTdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIGxhdW5jaEJ1aWxkVXNhZ2U6IEZlYXR1cmVVc2FnZVxuICAgIHB1YmxpYyBzdG9wQnVpbGRVc2FnZTogRmVhdHVyZVVzYWdlXG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IFVzYWdlU3RhdHMge1xuICAgICAgICBpZiAoIVVzYWdlU3RhdHMuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIFVzYWdlU3RhdHMuaW5zdGFuY2UgPSBuZXcgVXNhZ2VTdGF0cygpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFVzYWdlU3RhdHMuaW5zdGFuY2VcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy50ZXN0U3RhcnRlZFN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMudGVzdEZpbmlzaGVkU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy5ob29rU3RhcnRlZFN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMuaG9va0ZpbmlzaGVkU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy5jYnRTZXNzaW9uU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy5sb2dTdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLmxhdW5jaEJ1aWxkVXNhZ2UgPSBuZXcgRmVhdHVyZVVzYWdlKClcbiAgICAgICAgdGhpcy5zdG9wQnVpbGRVc2FnZSA9IG5ldyBGZWF0dXJlVXNhZ2UoKVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGQodXNhZ2VTdGF0czogVXNhZ2VTdGF0cyk6IHZvaWQge1xuICAgICAgICB0aGlzLnRlc3RTdGFydGVkU3RhdHMuYWRkKHVzYWdlU3RhdHMudGVzdFN0YXJ0ZWRTdGF0cylcbiAgICAgICAgdGhpcy50ZXN0RmluaXNoZWRTdGF0cy5hZGQodXNhZ2VTdGF0cy50ZXN0RmluaXNoZWRTdGF0cylcbiAgICAgICAgdGhpcy5ob29rU3RhcnRlZFN0YXRzLmFkZCh1c2FnZVN0YXRzLmhvb2tTdGFydGVkU3RhdHMpXG4gICAgICAgIHRoaXMuaG9va0ZpbmlzaGVkU3RhdHMuYWRkKHVzYWdlU3RhdHMuaG9va0ZpbmlzaGVkU3RhdHMpXG4gICAgICAgIHRoaXMuY2J0U2Vzc2lvblN0YXRzLmFkZCh1c2FnZVN0YXRzLmNidFNlc3Npb25TdGF0cylcbiAgICAgICAgdGhpcy5sb2dTdGF0cy5hZGQodXNhZ2VTdGF0cy5sb2dTdGF0cylcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Rm9ybWF0dGVkRGF0YSh3b3JrZXJzRGF0YTogeyB1c2FnZVN0YXRzOiBVc2FnZVN0YXQgfVtdKSB7XG4gICAgICAgIHRoaXMuYWRkRGF0YUZyb21Xb3JrZXJzKHdvcmtlcnNEYXRhKVxuICAgICAgICBjb25zdCB0ZXN0T3BzQ29uZmlnID0gVGVzdE9wc0NvbmZpZy5nZXRJbnN0YW5jZSgpXG4gICAgICAgIGNvbnN0IHVzYWdlOiBUT1VzYWdlU3RhdHMgPSB7XG4gICAgICAgICAgICBlbmFibGVkOiB0ZXN0T3BzQ29uZmlnLmVuYWJsZWQsXG4gICAgICAgICAgICBtYW51YWxseVNldDogdGVzdE9wc0NvbmZpZy5tYW51YWxseVNldCxcbiAgICAgICAgICAgIGJ1aWxkSGFzaGVkSWQ6IHRlc3RPcHNDb25maWcuYnVpbGRIYXNoZWRJZFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF1c2FnZS5lbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdXNhZ2VcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB1c2FnZS5ldmVudHMgPSB0aGlzLmdldEV2ZW50c0RhdGEoKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ2V4Y2VwdGlvbiBpbiBnZXRGb3JtYXR0ZWREYXRhOiAnICsgZSlcblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1c2FnZVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGREYXRhRnJvbVdvcmtlcnMod29ya2Vyc0RhdGE6IHsgdXNhZ2VTdGF0czogVXNhZ2VTdGF0IH1bXSkge1xuICAgICAgICB3b3JrZXJzRGF0YS5tYXAod29ya2VyRGF0YSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzYWdlU3RhdHNGb3JXb3JrZXIgPSBVc2FnZVN0YXRzLmZyb21KU09OKHdvcmtlckRhdGEudXNhZ2VTdGF0cylcbiAgICAgICAgICAgICAgICB0aGlzLmFkZCh1c2FnZVN0YXRzRm9yV29ya2VyKVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRXhjZXB0aW9uIGluIGFkZGluZyB3b3JrZXJEYXRhOiAnICsgZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RXZlbnRzRGF0YSgpe1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYnVpbGRFdmVudHM6IHtcbiAgICAgICAgICAgICAgICBzdGFydGVkOiB0aGlzLmxhdW5jaEJ1aWxkVXNhZ2UudG9KU09OKCksXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMuc3RvcEJ1aWxkVXNhZ2UudG9KU09OKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZXN0RXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRlZDogdGhpcy50ZXN0U3RhcnRlZFN0YXRzLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0aGlzLnRlc3RGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG9taXRHcm91cHM6IHRydWUgfSksXG4gICAgICAgICAgICAgICAgLi4udGhpcy50ZXN0RmluaXNoZWRTdGF0cy50b0pTT04oeyBvbmx5R3JvdXBzOiB0cnVlIH0pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaG9va0V2ZW50czoge1xuICAgICAgICAgICAgICAgIHN0YXJ0ZWQ6IHRoaXMuaG9va1N0YXJ0ZWRTdGF0cy50b0pTT04oKSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZDogdGhpcy5ob29rRmluaXNoZWRTdGF0cy50b0pTT04oeyBvbWl0R3JvdXBzOiB0cnVlIH0pLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuaG9va0ZpbmlzaGVkU3RhdHMudG9KU09OKHsgb25seUdyb3VwczogdHJ1ZSB9KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvZ0V2ZW50czogdGhpcy5sb2dTdGF0cy50b0pTT04oKSxcbiAgICAgICAgICAgIGNidFNlc3Npb25FdmVudHM6IHRoaXMuY2J0U2Vzc2lvblN0YXRzLnRvSlNPTigpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGF0YVRvU2F2ZSgpe1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGVzdEV2ZW50czoge1xuICAgICAgICAgICAgICAgIHN0YXJ0ZWQ6IHRoaXMudGVzdFN0YXJ0ZWRTdGF0cy50b0pTT04oKSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZDogdGhpcy50ZXN0RmluaXNoZWRTdGF0cy50b0pTT04oeyBuZXN0ZWRHcm91cHM6IHRydWUgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaG9va0V2ZW50czoge1xuICAgICAgICAgICAgICAgIHN0YXJ0ZWQ6IHRoaXMuaG9va1N0YXJ0ZWRTdGF0cy50b0pTT04oKSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZDogdGhpcy5ob29rRmluaXNoZWRTdGF0cy50b0pTT04oeyBuZXN0ZWRHcm91cHM6IHRydWUgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbG9nRXZlbnRzOiB0aGlzLmxvZ1N0YXRzLnRvSlNPTih7IG5lc3RlZEdyb3VwczogdHJ1ZSB9KSxcbiAgICAgICAgICAgIGNidFNlc3Npb25FdmVudHM6IHRoaXMuY2J0U2Vzc2lvblN0YXRzLnRvSlNPTigpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21KU09OKGRhdGE6IFVzYWdlU3RhdCkge1xuICAgICAgICBjb25zdCB1c2FnZVN0YXRzID0gbmV3IFVzYWdlU3RhdHMoKVxuICAgICAgICB1c2FnZVN0YXRzLnRlc3RTdGFydGVkU3RhdHMgPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZGF0YS50ZXN0RXZlbnRzLnN0YXJ0ZWQpXG4gICAgICAgIHVzYWdlU3RhdHMudGVzdEZpbmlzaGVkU3RhdHMgPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZGF0YS50ZXN0RXZlbnRzLmZpbmlzaGVkKVxuICAgICAgICB1c2FnZVN0YXRzLmhvb2tTdGFydGVkU3RhdHMgPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZGF0YS5ob29rRXZlbnRzLnN0YXJ0ZWQpXG4gICAgICAgIHVzYWdlU3RhdHMuaG9va0ZpbmlzaGVkU3RhdHMgPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZGF0YS5ob29rRXZlbnRzLmZpbmlzaGVkKVxuICAgICAgICB1c2FnZVN0YXRzLmxvZ1N0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEubG9nRXZlbnRzKVxuICAgICAgICB1c2FnZVN0YXRzLmNidFNlc3Npb25TdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLmNidFNlc3Npb25TdGF0cylcbiAgICAgICAgcmV0dXJuIHVzYWdlU3RhdHNcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVzYWdlU3RhdHNcbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJ1xuXG5pbnRlcmZhY2UgU2NyaXB0cyB7XG4gICAgc2Nhbjogc3RyaW5nXG4gICAgZ2V0UmVzdWx0czogc3RyaW5nXG4gICAgZ2V0UmVzdWx0c1N1bW1hcnk6IHN0cmluZ1xuICAgIHNhdmVSZXN1bHRzOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIENvbW1hbmQge1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGNsYXNzOiBzdHJpbmdcbn1cblxuY2xhc3MgQWNjZXNzaWJpbGl0eVNjcmlwdHMge1xuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBBY2Nlc3NpYmlsaXR5U2NyaXB0cyB8IG51bGwgPSBudWxsXG5cbiAgICBwdWJsaWMgcGVyZm9ybVNjYW46IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIGdldFJlc3VsdHM6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIGdldFJlc3VsdHNTdW1tYXJ5OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBzYXZlVGVzdFJlc3VsdHM6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIGNvbW1hbmRzVG9XcmFwOiBBcnJheTxDb21tYW5kPiB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIENocm9tZUV4dGVuc2lvbjogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7fVxuXG4gICAgcHVibGljIGJyb3dzZXJzdGFja0ZvbGRlclBhdGggPSAnJ1xuICAgIHB1YmxpYyBjb21tYW5kc1BhdGggPSAnJ1xuXG4gICAgLy8gZG9uJ3QgYWxsb3cgdG8gY3JlYXRlIGluc3RhbmNlcyBmcm9tIGl0IG90aGVyIHRoYW4gdGhyb3VnaCBgY2hlY2tBbmRHZXRJbnN0YW5jZWBcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJyb3dzZXJzdGFja0ZvbGRlclBhdGggPSB0aGlzLmdldFdyaXRhYmxlRGlyKClcbiAgICAgICAgdGhpcy5jb21tYW5kc1BhdGggPSBwYXRoLmpvaW4odGhpcy5icm93c2Vyc3RhY2tGb2xkZXJQYXRoLCAnY29tbWFuZHMuanNvbicpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjaGVja0FuZEdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIUFjY2Vzc2liaWxpdHlTY3JpcHRzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5pbnN0YW5jZSA9IG5ldyBBY2Nlc3NpYmlsaXR5U2NyaXB0cygpXG4gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5pbnN0YW5jZS5yZWFkRnJvbUV4aXN0aW5nRmlsZSgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmluc3RhbmNlXG4gICAgfVxuXG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4gICAgcHVibGljIGdldFdyaXRhYmxlRGlyKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG9yZGVyZWRQYXRocyA9IFtcbiAgICAgICAgICAgIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuYnJvd3NlcnN0YWNrJyksXG4gICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgb3MudG1wZGlyKClcbiAgICAgICAgXVxuICAgICAgICBmb3IgKGNvbnN0IG9yZGVyZWRQYXRoIG9mIG9yZGVyZWRQYXRocykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhvcmRlcmVkUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZnMuYWNjZXNzU3luYyhvcmRlcmVkUGF0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yZGVyZWRQYXRoXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnMubWtkaXJTeW5jKG9yZGVyZWRQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmRlcmVkUGF0aFxuXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8qIG5vLWVtcHR5ICovXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGcm9tRXhpc3RpbmdGaWxlKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5jb21tYW5kc1BhdGgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLmNvbW1hbmRzUGF0aCwgJ3V0ZjgnKVxuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKEpTT04ucGFyc2UoZGF0YSkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIERvIG5vdGhpbmcgKi9cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGUoZGF0YTogeyBjb21tYW5kczogW10sIHNjcmlwdHM6IFNjcmlwdHMsIG5vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnM6IHt9IH0pIHtcbiAgICAgICAgaWYgKGRhdGEuc2NyaXB0cykge1xuICAgICAgICAgICAgdGhpcy5wZXJmb3JtU2NhbiA9IGRhdGEuc2NyaXB0cy5zY2FuXG4gICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMgPSBkYXRhLnNjcmlwdHMuZ2V0UmVzdWx0c1xuICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzU3VtbWFyeSA9IGRhdGEuc2NyaXB0cy5nZXRSZXN1bHRzU3VtbWFyeVxuICAgICAgICAgICAgdGhpcy5zYXZlVGVzdFJlc3VsdHMgPSBkYXRhLnNjcmlwdHMuc2F2ZVJlc3VsdHNcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5jb21tYW5kcyAmJiBkYXRhLmNvbW1hbmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jb21tYW5kc1RvV3JhcCA9IGRhdGEuY29tbWFuZHNcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5ub25CU3RhY2tJbmZyYUExMXlDaHJvbWVPcHRpb25zKXtcbiAgICAgICAgICAgIHRoaXMuQ2hyb21lRXh0ZW5zaW9uID0gZGF0YS5ub25CU3RhY2tJbmZyYUExMXlDaHJvbWVPcHRpb25zXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHB1YmxpYyBzdG9yZSgpIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuYnJvd3NlcnN0YWNrRm9sZGVyUGF0aCkpe1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuYnJvd3NlcnN0YWNrRm9sZGVyUGF0aClcbiAgICAgICAgfVxuXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5jb21tYW5kc1BhdGgsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGNvbW1hbmRzOiB0aGlzLmNvbW1hbmRzVG9XcmFwLFxuICAgICAgICAgICAgc2NyaXB0czoge1xuICAgICAgICAgICAgICAgIHNjYW46IHRoaXMucGVyZm9ybVNjYW4sXG4gICAgICAgICAgICAgICAgZ2V0UmVzdWx0czogdGhpcy5nZXRSZXN1bHRzLFxuICAgICAgICAgICAgICAgIGdldFJlc3VsdHNTdW1tYXJ5OiB0aGlzLmdldFJlc3VsdHNTdW1tYXJ5LFxuICAgICAgICAgICAgICAgIHNhdmVSZXN1bHRzOiB0aGlzLnNhdmVUZXN0UmVzdWx0cyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBub25CU3RhY2tJbmZyYUExMXlDaHJvbWVPcHRpb25zOiB0aGlzLkNocm9tZUV4dGVuc2lvbixcbiAgICAgICAgfSkpXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5jaGVja0FuZEdldEluc3RhbmNlKClcbmV4cG9ydCB7IENvbW1hbmQgfVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuXG5pbXBvcnQgdHlwZSB7IFRlc3REYXRhLCBVcGxvYWRUeXBlIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBiYXRjaEFuZFBvc3RFdmVudHMgfSBmcm9tICcuLi91dGlsLmpzJ1xuaW1wb3J0IHsgREFUQV9CQVRDSF9FTkRQT0lOVCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcblxuLyoqXG4gKiBDcmFzaC1yZXNpbGllbnQgam91cm5hbCBvZiB0ZXN0IGFuZCBob29rIHJ1bnMgdGhhdCBoYXZlIHNlbnQgVGVzdFJ1blN0YXJ0ZWQgL1xuICogSG9va1J1blN0YXJ0ZWQgYnV0IG5vdCB5ZXQgdGhlIG1hdGNoaW5nIGZpbmlzaC4gRWFjaCBvcGVuIHJ1biBpcyBwZXJzaXN0ZWQgYXMgYSBzbWFsbFxuICogZmlsZSBzbyB0aGF0IGlmIHRoZSB3b3JrZXIgKG9yIHRoZSB3aG9sZSB3ZGlvIHByb2Nlc3MgdHJlZSkgaXMga2lsbGVkIG1pZC10ZXN0IG9yXG4gKiBtaWQtaG9vaywgdGhlIGxhdW5jaGVyJ3Mgc2h1dGRvd24gcGF0aCBvciB0aGUgZGV0YWNoZWQgZXhpdCBjbGVhbnVwIGNhbiBzdGlsbCBzZW5kIGFcbiAqIHN5bnRoZXRpYyBUZXN0UnVuRmluaXNoZWQgLyBIb29rUnVuRmluaXNoZWQgXHUyMDE0IG90aGVyd2lzZSB0aGUgZW50aXR5IHN0YXlzIFwiaW4gcHJvZ3Jlc3NcIlxuICogb24gdGhlIFRlc3QgUmVwb3J0aW5nICYgQW5hbHl0aWNzIGRhc2hib2FyZCB1bnRpbCB0aGUgYmFja2VuZCB3YXRjaGRvZyB0aW1lcyBpdCBvdXQsXG4gKiBpbmZsYXRpbmcgdGhlIHJlcG9ydGVkIGJ1aWxkIGR1cmF0aW9uIChTREstNzE2NzogYW4gb3JwaGFuZWQgQUZURVJfRUFDSCBjdWN1bWJlciBob29rXG4gKiBhZGRlZCBpdHMgMmggaG9vayB0aW1lb3V0IHRvIHRoZSBidWlsZCdzIGR1cmF0aW9uIG9uIHRoZSBuZXcgZGFzaGJvYXJkKS5cbiAqL1xuXG5jb25zdCBPUEVOX1JVTlNfRElSID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdsb2dzJywgJ2JzdGFja19vcGVuX3J1bnMnKVxuXG5leHBvcnQgY29uc3QgT1JQSEFOX0ZBSUxVUkVfUkVBU09OID0gJ1Rlc3QgcnVuIGRpZCBub3QgY29tcGxldGU6IHRoZSBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBvciB0ZXJtaW5hdGVkIGJlZm9yZSB0aGUgdGVzdCBmaW5pc2hlZCAoZmluYWxpemVkIGJ5IEJyb3dzZXJTdGFjayBTREsgZXhpdCBjbGVhbnVwKSdcblxuZnVuY3Rpb24gb3BlblJ1bkZpbGVQYXRoKHV1aWQ6IHN0cmluZykge1xuICAgIHJldHVybiBwYXRoLmpvaW4oT1BFTl9SVU5TX0RJUiwgYG9wZW4tcnVuLSR7dXVpZH0uanNvbmApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRPcGVuUnVuKHRlc3REYXRhOiBUZXN0RGF0YSkge1xuICAgIGlmICghdGVzdERhdGEgfHwgIXRlc3REYXRhLnV1aWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGZzLm1rZGlyU3luYyhPUEVOX1JVTlNfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG9wZW5SdW5GaWxlUGF0aCh0ZXN0RGF0YS51dWlkKSwgSlNPTi5zdHJpbmdpZnkodGVzdERhdGEpKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdvcGVuUnVuc0pvdXJuYWw6IGZhaWxlZCB0byByZWNvcmQgb3BlbiBydW46ICcgKyBlKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyT3BlblJ1bih1dWlkPzogc3RyaW5nKSB7XG4gICAgaWYgKCF1dWlkKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBmcy5ybVN5bmMob3BlblJ1bkZpbGVQYXRoKHV1aWQpLCB7IGZvcmNlOiB0cnVlIH0pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ29wZW5SdW5zSm91cm5hbDogZmFpbGVkIHRvIGNsZWFyIG9wZW4gcnVuOiAnICsgZSlcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0T3JwaGFuZWRSdW5zKCk6IFRlc3REYXRhW10ge1xuICAgIGNvbnN0IG9ycGhhbnM6IFRlc3REYXRhW10gPSBbXVxuICAgIHRyeSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhPUEVOX1JVTlNfRElSKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9ycGhhbnNcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoT1BFTl9SVU5TX0RJUikpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgb3JwaGFucy5wdXNoKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihPUEVOX1JVTlNfRElSLCBmaWxlKSwgJ3V0ZjgnKSkpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBvcGVuUnVuc0pvdXJuYWw6IHNraXBwaW5nIHVucmVhZGFibGUgam91cm5hbCBmaWxlICR7ZmlsZX06ICR7ZX1gKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhPUEVOX1JVTlNfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1Zygnb3BlblJ1bnNKb3VybmFsOiBmYWlsZWQgdG8gY29sbGVjdCBvcnBoYW5lZCBydW5zOiAnICsgZSlcbiAgICB9XG4gICAgcmV0dXJuIG9ycGhhbnNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmFsaXplT3JwaGFuZWRSdW5zKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3JwaGFucyA9IGNvbGxlY3RPcnBoYW5lZFJ1bnMoKVxuICAgICAgICBpZiAoIW9ycGhhbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgY29uc3QgZXZlbnRzOiBVcGxvYWRUeXBlW10gPSBvcnBoYW5zLm1hcCgocnVuRGF0YSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRlZEF0TXMgPSBydW5EYXRhLnN0YXJ0ZWRfYXQgPyBuZXcgRGF0ZShydW5EYXRhLnN0YXJ0ZWRfYXQpLmdldFRpbWUoKSA6IE5hTlxuICAgICAgICAgICAgY29uc3QgZmluaXNoZWRSdW4gPSB7XG4gICAgICAgICAgICAgICAgLi4ucnVuRGF0YSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZF9hdDogZmluaXNoZWRBdCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uX2luX21zOiBOdW1iZXIuaXNOYU4oc3RhcnRlZEF0TXMpID8gdW5kZWZpbmVkIDogTWF0aC5tYXgoMCwgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdE1zKSxcbiAgICAgICAgICAgICAgICBmYWlsdXJlOiBbeyBiYWNrdHJhY2U6IFtPUlBIQU5fRkFJTFVSRV9SRUFTT05dIH1dLFxuICAgICAgICAgICAgICAgIGZhaWx1cmVfcmVhc29uOiBPUlBIQU5fRkFJTFVSRV9SRUFTT04sXG4gICAgICAgICAgICAgICAgZmFpbHVyZV90eXBlOiAnVW5oYW5kbGVkRXJyb3InXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIb29rIHBheWxvYWRzIGNhcnJ5IHR5cGUgJ2hvb2snIChzYW1lIGRpc2NyaW1pbmF0b3IgdGhlIGxpc3RlbmVyIHVzZXMgdG8gcGlja1xuICAgICAgICAgICAgLy8gdGhlIGhvb2tfcnVuL3Rlc3RfcnVuIGVudmVsb3BlIGtleSkgXHUyMDE0IGZpbmFsaXplIHRoZW0gYXMgSG9va1J1bkZpbmlzaGVkIHNvIHRoZVxuICAgICAgICAgICAgLy8gYmFja2VuZCBjbG9zZXMgdGhlIGhvb2sgaW5zdGVhZCBvZiBkcm9wcGluZyBhbiB1bmtub3duIHRlc3RfcnVuIHV1aWQuXG4gICAgICAgICAgICBpZiAocnVuRGF0YS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBldmVudF90eXBlOiAnSG9va1J1bkZpbmlzaGVkJywgaG9va19ydW46IGZpbmlzaGVkUnVuIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGV2ZW50X3R5cGU6ICdUZXN0UnVuRmluaXNoZWQnLCB0ZXN0X3J1bjogZmluaXNoZWRSdW4gfVxuICAgICAgICB9KVxuICAgICAgICBhd2FpdCBiYXRjaEFuZFBvc3RFdmVudHMoREFUQV9CQVRDSF9FTkRQT0lOVCwgJ09SUEhBTkVEX1RFU1RfUlVOX0ZJTkFMSVpBVElPTicsIGV2ZW50cylcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oYEZpbmFsaXplZCAke2V2ZW50cy5sZW5ndGh9IG9ycGhhbmVkIHRlc3QvaG9vayBydW4ocykgbGVmdCBiZWhpbmQgYnkgYW4gaW50ZXJydXB0ZWQgcnVuYClcbiAgICAgICAgcmV0dXJuIGV2ZW50cy5sZW5ndGhcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1Zygnb3BlblJ1bnNKb3VybmFsOiBmYWlsZWQgdG8gZmluYWxpemUgb3JwaGFuZWQgcnVuczogJyArIGUpXG4gICAgICAgIHJldHVybiAwXG4gICAgfVxufVxuIiwgImltcG9ydCB7IGdldEVycm9yU3RyaW5nLCBzdG9wQnVpbGRVcHN0cmVhbSwgdXBsb2FkTG9ncyB9IGZyb20gJy4vdXRpbC5qcydcbmltcG9ydCB7IGZpbmFsaXplT3JwaGFuZWRSdW5zIH0gZnJvbSAnLi90ZXN0T3BzL29wZW5SdW5zSm91cm5hbC5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgdXRpbCBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBmaXJlRnVubmVsUmVxdWVzdCB9IGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL2Z1bm5lbEluc3RydW1lbnRhdGlvbi5qcydcbmltcG9ydCB7IEJST1dTRVJTVEFDS19URVNUSFVCX1VVSUQsIEJST1dTRVJTVEFDS19URVNUSFVCX0pXVCwgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFkgfSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCB0eXBlIHsgRnVubmVsRGF0YSB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgUGVyZm9ybWFuY2VUZXN0ZXIgZnJvbSAnLi9pbnN0cnVtZW50YXRpb24vcGVyZm9ybWFuY2UvcGVyZm9ybWFuY2UtdGVzdGVyLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCU3RhY2tDbGVhbnVwIHtcbiAgICBzdGF0aWMgYXN5bmMgc3RhcnRDbGVhbnVwKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gR2V0IGZ1bm5lbCBkYXRhIG9iamVjdCBmcm9tIHNhdmVkIGZpbGVcbiAgICAgICAgICAgIGNvbnN0IGZ1bm5lbERhdGFDbGVhbnVwID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWZ1bm5lbERhdGEnKVxuICAgICAgICAgICAgbGV0IGZ1bm5lbERhdGE6IEZ1bm5lbERhdGEgfCBudWxsID0gbnVsbFxuICAgICAgICAgICAgaWYgKGZ1bm5lbERhdGFDbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwcm9jZXNzLmFyZ3YuaW5kZXhPZignLS1mdW5uZWxEYXRhJylcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHByb2Nlc3MuYXJndltpbmRleCArIDFdXG4gICAgICAgICAgICAgICAgZnVubmVsRGF0YSA9IEJTdGFja0NsZWFudXAuZ2V0RnVubmVsRGF0YUZyb21GaWxlKGZpbGVQYXRoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU25hcHNob3QgYmVmb3JlIHNlbmRGdW5uZWxEYXRhIFx1MjAxNCBmaXJlRnVubmVsUmVxdWVzdCByZWRhY3RzIHRoZVxuICAgICAgICAgICAgLy8gY3JlZGVudGlhbHMgaW4gcGxhY2UuXG4gICAgICAgICAgICBjb25zdCBmdW5uZWxVc2VyID0gZnVubmVsRGF0YT8udXNlck5hbWVcbiAgICAgICAgICAgIGNvbnN0IGZ1bm5lbEtleSA9IGZ1bm5lbERhdGE/LmFjY2Vzc0tleVxuXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLW9ic2VydmFiaWxpdHknKSAmJiBmdW5uZWxEYXRhKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlT2JzZXJ2YWJpbGl0eUNsZWFudXAoZnVubmVsRGF0YSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZ1bm5lbERhdGFDbGVhbnVwICYmIGZ1bm5lbERhdGEpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRGdW5uZWxEYXRhKGZ1bm5lbERhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlc2N1ZSB0aGUgU0RLLWxvZyB1cGxvYWQgZm9yIHJ1bnMgd2hvc2UgbGF1bmNoZXIgbmV2ZXIgcmVhY2hlZFxuICAgICAgICAgICAgLy8gb25Db21wbGV0ZSAoc2lnbmFsIHRlcm1pbmF0aW9uKSBcdTIwMTQgYWZ0ZXIgZXZlbnRzLCBiZWZvcmUgZXhpdC5cbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tdXBsb2FkTG9ncycpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlTG9nc1VwbG9hZChmdW5uZWxVc2VyLCBmdW5uZWxLZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlcnIgYXMgc3RyaW5nXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1wZXJmb3JtYW5jZURhdGEnKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFBlcmZvcm1hbmNlVGVzdGVyLnVwbG9hZEV2ZW50c0RhdGEoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBpbiBzZW5kaW5nIGV2ZW50cyBkYXRhICR7dXRpbC5mb3JtYXQoZXIpfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgZXhlY3V0ZUxvZ3NVcGxvYWQoZnVubmVsVXNlcj86IHN0cmluZywgZnVubmVsS2V5Pzogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHByb2Nlc3MuYXJndi5pbmRleE9mKCctLXVwbG9hZExvZ3MnKVxuICAgICAgICAgICAgY29uc3QgY2xpZW50QnVpbGRVdWlkID0gcHJvY2Vzcy5hcmd2W2luZGV4ICsgMV1cbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBmdW5uZWxVc2VyIHx8IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19VU0VSTkFNRVxuICAgICAgICAgICAgY29uc3Qga2V5ID0gZnVubmVsS2V5IHx8IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BQ0NFU1NfS0VZXG4gICAgICAgICAgICBpZiAoIWNsaWVudEJ1aWxkVXVpZCB8fCAhdXNlciB8fCAha2V5KSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBsb2dzIHVwbG9hZCBpbiBjbGVhbnVwOiBtaXNzaW5nIHV1aWQgb3IgY3JlZGVudGlhbHMnKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBVcGxvYWRpbmcgU0RLIGxvZ3MgZnJvbSBjbGVhbnVwIGZvciAke2NsaWVudEJ1aWxkVXVpZH1gKVxuICAgICAgICAgICAgYXdhaXQgdXBsb2FkTG9ncyh1c2VyLCBrZXksIGNsaWVudEJ1aWxkVXVpZClcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdFcnJvciB1cGxvYWRpbmcgU0RLIGxvZ3MgaW4gY2xlYW51cDogJyArIGdldEVycm9yU3RyaW5nKGUpKVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBleGVjdXRlT2JzZXJ2YWJpbGl0eUNsZWFudXAoZnVubmVsRGF0YTogRnVubmVsRGF0YSkge1xuICAgICAgICBpZiAoIXByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX0pXVF0pIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRXhlY3V0aW5nIFRlc3QgUmVwb3J0aW5nIGFuZCBBbmFseXRpY3MgY2xlYW51cCcpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBTREstNDY3MTogZmluYWxpemUgYW55IHRlc3QgcnVucyBvcnBoYW5lZCBieSB0aGUgaW50ZXJydXB0ZWQgcHJvY2Vzc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBidWlsZCBpdHNlbGYgaXMgc3RvcHBlZC5cbiAgICAgICAgICAgIGF3YWl0IGZpbmFsaXplT3JwaGFuZWRSdW5zKClcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3BCdWlsZFVwc3RyZWFtKClcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFldKSAmJiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXSkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGBcXG5WaXNpdCBodHRwczovL2F1dG9tYXRpb24uYnJvd3NlcnN0YWNrLmNvbS9idWlsZHMvJHtwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXX0gdG8gdmlldyBidWlsZCByZXBvcnQsIGluc2lnaHRzLCBhbmQgbWFueSBtb3JlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhbGwgYXQgb25lIHBsYWNlIVxcbmApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSAocmVzdWx0ICYmIHJlc3VsdC5zdGF0dXMpIHx8ICdmYWlsZWQnXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gKHJlc3VsdCAmJiByZXN1bHQubWVzc2FnZSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTzExeVN0b3BEYXRhKGZ1bm5lbERhdGEsIHN0YXR1cywgc3RhdHVzID09PSAnZmFpbGVkJyA/IG1lc3NhZ2UgOiB1bmRlZmluZWQpXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignRXJyb3IgaW4gc3RvcHBpbmcgVGVzdCBSZXBvcnRpbmcgYW5kIEFuYWx5dGljcyBidWlsZDogJyArIGUpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU8xMXlTdG9wRGF0YShmdW5uZWxEYXRhLCAnZmFpbGVkJywgZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB1cGRhdGVPMTF5U3RvcERhdGEoZnVubmVsRGF0YTogRnVubmVsRGF0YSwgc3RhdHVzOiBzdHJpbmcsIGVycm9yOiB1bmtub3duID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHRvRGF0YSA9IGZ1bm5lbERhdGE/LmV2ZW50X3Byb3BlcnRpZXM/LnByb2R1Y3RVc2FnZT8udGVzdE9ic2VydmFiaWxpdHlcbiAgICAgICAgLy8gUmV0dXJuIGlmIG5vIFRlc3QgUmVwb3J0aW5nIGFuZCBBbmFseXRpY3MgZGF0YSBpbiBmdW5uZWwgZGF0YVxuICAgICAgICBpZiAoIXRvRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV4aXN0aW5nU3RvcERhdGEgPSB0b0RhdGEuZXZlbnRzLmJ1aWxkRXZlbnRzLmZpbmlzaGVkXG4gICAgICAgIGV4aXN0aW5nU3RvcERhdGEgPSBleGlzdGluZ1N0b3BEYXRhIHx8IHt9XG5cbiAgICAgICAgZXhpc3RpbmdTdG9wRGF0YSA9IHtcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nU3RvcERhdGEsXG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBlcnJvcjogZ2V0RXJyb3JTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgc3RvcHBlZEZyb206ICdleGl0SG9vaydcbiAgICAgICAgfVxuICAgICAgICB0b0RhdGEuZXZlbnRzLmJ1aWxkRXZlbnRzLmZpbmlzaGVkID0gZXhpc3RpbmdTdG9wRGF0YVxuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBzZW5kRnVubmVsRGF0YShmdW5uZWxEYXRhOiBGdW5uZWxEYXRhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmaXJlRnVubmVsUmVxdWVzdChmdW5uZWxEYXRhKVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdGdW5uZWwgZGF0YSBzZW50IHN1Y2Nlc3NmdWxseSBmcm9tIGNsZWFudXAnKVxuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0Vycm9yIGluIHNlbmRpbmcgZnVubmVsIGRhdGE6ICcgKyBlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEZ1bm5lbERhdGFGcm9tRmlsZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpXG5cbiAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoY29udGVudClcbiAgICAgICAgdGhpcy5yZW1vdmVGdW5uZWxEYXRhRmlsZShmaWxlUGF0aClcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVtb3ZlRnVubmVsRGF0YUZpbGUoZmlsZVBhdGg/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgZnMucm1TeW5jKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pXG4gICAgfVxufVxuXG52b2lkIEJTdGFja0NsZWFudXAuc3RhcnRDbGVhbnVwKClcbiIsICJpbXBvcnQgb3MgZnJvbSAnbm9kZTpvcydcbmltcG9ydCB1dGlsLCB7IGZvcm1hdCB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IFVzYWdlU3RhdHMsIHsgdHlwZSBVc2FnZVN0YXQgfSBmcm9tICcuLi90ZXN0T3BzL3VzYWdlU3RhdHMuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgdHlwZSBCcm93c2VyU3RhY2tDb25maWcgZnJvbSAnLi4vY29uZmlnLmpzJ1xuaW1wb3J0IHsgQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTiwgV0RJT19OQU1JTkdfUFJFRklYIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgZ2V0RGF0YUZyb21Xb3JrZXJzIH0gZnJvbSAnLi4vZGF0YS1zdG9yZS5qcydcbmltcG9ydCB7IGdldFByb2R1Y3RNYXAgfSBmcm9tICcuLi90ZXN0SHViL3V0aWxzLmpzJ1xuaW1wb3J0IGZldGNoV3JhcCBmcm9tICcuLi9mZXRjaFdyYXBwZXIuanMnXG5pbXBvcnQgdHlwZSB7IEJyb3dzZXJzdGFja0hlYWxpbmcgfSBmcm9tICdAYnJvd3NlcnN0YWNrL2FpLXNkay1ub2RlJ1xuaW1wb3J0IHR5cGUgeyBGdW5uZWxEYXRhLCBFdmVudFByb3BlcnRpZXMgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCBUZXN0T3BzQ29uZmlnIGZyb20gJy4uL3Rlc3RPcHMvdGVzdE9wc0NvbmZpZy5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuLi9jbGkvYXBpVXRpbHMuanMnXG5pbXBvcnQgUGVyZm9ybWFuY2VUZXN0ZXIgZnJvbSAnLi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgeyBFVkVOVFMgfSBmcm9tICcuL3BlcmZvcm1hbmNlL2NvbnN0YW50cy5qcydcblxuYXN5bmMgZnVuY3Rpb24gZmlyZUZ1bm5lbFRlc3RFdmVudChldmVudFR5cGU6IHN0cmluZywgY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzQ0xJRW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgaWYgKCFjb25maWcudXNlck5hbWUgfHwgIWNvbmZpZy5hY2Nlc3NLZXkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCd1c2VybmFtZS9hY2Nlc3NrZXkgbm90IHBhc3NlZCcpXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBidWlsZEV2ZW50RGF0YShldmVudFR5cGUsIGNvbmZpZywgaXNDTElFbmFibGVkKVxuICAgICAgICBhd2FpdCBmaXJlRnVubmVsUmVxdWVzdChkYXRhKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0Z1bm5lbCBldmVudCBzdWNjZXNzJylcbiAgICAgICAgLy8gT25seSB0aGUgZmluaXNoIGV2ZW50IGRpc2FybXMgdGhlIGV4aXQtdGltZSBjbGVhbnVwIHJlc2VuZCBcdTIwMTQgbWFya2luZyBpdFxuICAgICAgICAvLyBvbiBTREtUZXN0QXR0ZW1wdGVkIGxlZnQga2lsbGVkIHJ1bnMgd2l0aCBubyBTREtUZXN0U3VjY2Vzc2Z1bCBhdCBhbGwuXG4gICAgICAgIGlmIChldmVudFR5cGUgPT09ICdTREtUZXN0U3VjY2Vzc2Z1bCcpIHtcbiAgICAgICAgICAgIGNvbmZpZy5zZW50RnVubmVsRGF0YSgpXG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEV4Y2VwdGlvbiBpbiBzZW5kaW5nIGZ1bm5lbCBkYXRhOiAke2Zvcm1hdChlcnJvcil9YClcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kU3RhcnQoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpIHtcblxuICAgIC8vIFRyYWNrIGZ1bm5lbCB0ZXN0IGF0dGVtcHRlZCBldmVudFxuICAgIFBlcmZvcm1hbmNlVGVzdGVyLnN0YXJ0KEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfQVRURU1QVEVEKVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RBdHRlbXB0ZWQnLCBjb25maWcpXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX0FUVEVNUFRFRCwgdHJ1ZSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9BVFRFTVBURUQsIGZhbHNlLCBlcnJvcilcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kRmluaXNoKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc0NMSUVuYWJsZWQgPSBmYWxzZSkge1xuICAgIC8vIFRyYWNrIGZ1bm5lbCB0ZXN0IHN1Y2Nlc3NmdWwgZXZlbnRcbiAgICBQZXJmb3JtYW5jZVRlc3Rlci5zdGFydChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX1NVQ0NFU1NGVUwpXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZmlyZUZ1bm5lbFRlc3RFdmVudCgnU0RLVGVzdFN1Y2Nlc3NmdWwnLCBjb25maWcsIGlzQ0xJRW5hYmxlZClcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfU1VDQ0VTU0ZVTCwgdHJ1ZSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9TVUNDRVNTRlVMLCBmYWxzZSwgZXJyb3IpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZUZ1bm5lbERhdGEoZXZlbnRUeXBlOiBzdHJpbmcsIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc0NMSUVuYWJsZWQgPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0YSA9IGJ1aWxkRXZlbnREYXRhKGV2ZW50VHlwZSwgY29uZmlnLCBpc0NMSUVuYWJsZWQpXG5cbiAgICBCU3RhY2tMb2dnZXIuZW5zdXJlTG9nc0ZvbGRlcigpXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oQlN0YWNrTG9nZ2VyLmxvZ0ZvbGRlclBhdGgsICdmdW5uZWxEYXRhLmpzb24nKVxuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEpKVxuICAgIHJldHVybiBmaWxlUGF0aFxufVxuXG5mdW5jdGlvbiByZWRhY3RDcmVkZW50aWFsc0Zyb21GdW5uZWxEYXRhKGRhdGE6IEZ1bm5lbERhdGEpIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS51c2VyTmFtZSkge1xuICAgICAgICAgICAgZGF0YS51c2VyTmFtZSA9ICdbUkVEQUNURURdJ1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmFjY2Vzc0tleSkge1xuICAgICAgICAgICAgZGF0YS5hY2Nlc3NLZXkgPSAnW1JFREFDVEVEXSdcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxufVxuXG4vLyBDYWxsZWQgZnJvbSB0d28gZGlmZmVyZW50IHByb2Nlc3NcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXJlRnVubmVsUmVxdWVzdChkYXRhOiBGdW5uZWxEYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB1c2VyTmFtZSwgYWNjZXNzS2V5IH0gPSBkYXRhXG4gICAgcmVkYWN0Q3JlZGVudGlhbHNGcm9tRnVubmVsRGF0YShkYXRhKVxuXG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdTZW5kaW5nIFNESyBldmVudCB3aXRoIGRhdGEgJyArIHV0aWwuaW5zcGVjdChkYXRhLCB7IGRlcHRoOiA2IH0pKVxuXG4gICAgY29uc3QgZW5jb2RlZEF1dGggPSBCdWZmZXIuZnJvbShgJHt1c2VyTmFtZX06JHthY2Nlc3NLZXl9YCwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0JylcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoV3JhcChBUElVdGlscy5GVU5ORUxfSU5TVFJVTUVOVEFUSU9OX1VSTCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCYXNpYyAke2VuY29kZWRBdXRofWAsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gICAgfSlcbiAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0Z1bm5lbCBFdmVudCBSZXNwb25zZTogJyArIEpTT04uc3RyaW5naWZ5KGF3YWl0IHJlc3BvbnNlLnRleHQoKSkpXG59XG5cbmZ1bmN0aW9uIGdldFByb2R1Y3RMaXN0KGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSB7XG4gICAgY29uc3QgcHJvZHVjdHM6IHN0cmluZ1tdID0gW11cbiAgICBpZiAoY29uZmlnLnRlc3RPYnNlcnZhYmlsaXR5LmVuYWJsZWQpIHtcbiAgICAgICAgcHJvZHVjdHMucHVzaCgnb2JzZXJ2YWJpbGl0eScpXG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5hY2Nlc3NpYmlsaXR5KSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ2FjY2Vzc2liaWxpdHknKVxuICAgIH1cblxuICAgIGlmIChjb25maWcucGVyY3kpIHtcbiAgICAgICAgcHJvZHVjdHMucHVzaCgncGVyY3knKVxuICAgIH1cblxuICAgIGlmIChjb25maWcuYXV0b21hdGUpIHtcbiAgICAgICAgcHJvZHVjdHMucHVzaCgnYXV0b21hdGUnKVxuICAgIH1cblxuICAgIGlmIChjb25maWcuYXBwQXV0b21hdGUpIHtcbiAgICAgICAgcHJvZHVjdHMucHVzaCgnYXBwLWF1dG9tYXRlJylcbiAgICB9XG4gICAgcmV0dXJuIHByb2R1Y3RzXG59XG5cbmZ1bmN0aW9uIGJ1aWxkRXZlbnREYXRhKGV2ZW50VHlwZTogc3RyaW5nLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNDTElFbmFibGVkID0gZmFsc2UpIHtcbiAgICBjb25zdCBldmVudFByb3BlcnRpZXM6IEV2ZW50UHJvcGVydGllcyA9IHtcbiAgICAgICAgLy8gRnJhbWV3b3JrIERldGFpbHNcbiAgICAgICAgc2RrUnVuSWQ6IGNvbmZpZz8uc2RrUnVuSUQsXG4gICAgICAgIHRlc3RodWJfdXVpZDogVGVzdE9wc0NvbmZpZy5nZXRJbnN0YW5jZSgpLmJ1aWxkSGFzaGVkSWQsXG4gICAgICAgIGxhbmd1YWdlX2ZyYW1ld29yazogZ2V0TGFuZ3VhZ2VGcmFtZXdvcmsoY29uZmlnLmZyYW1ld29yayksXG4gICAgICAgIHJlZmVycmVyOiBnZXRSZWZlcnJlcihjb25maWcuZnJhbWV3b3JrKSxcbiAgICAgICAgbGFuZ3VhZ2U6ICdXZWJkcml2ZXJJTycsXG4gICAgICAgIGxhbmd1YWdlVmVyc2lvbjogcHJvY2Vzcy52ZXJzaW9uLFxuXG4gICAgICAgIC8vIEJ1aWxkIERldGFpbHNcbiAgICAgICAgYnVpbGROYW1lOiBjb25maWcuYnVpbGROYW1lIHx8ICd1bmRlZmluZWQnLFxuICAgICAgICBidWlsZElkZW50aWZpZXI6IFN0cmluZyhjb25maWcuYnVpbGRJZGVudGlmaWVyKSxcblxuICAgICAgICAvLyBIb3N0IGRldGFpbHNcbiAgICAgICAgb3M6IG9zLnR5cGUoKSB8fCAndW5rbm93bicsXG4gICAgICAgIGhvc3RuYW1lOiBvcy5ob3N0bmFtZSgpIHx8ICd1bmtub3duJyxcblxuICAgICAgICAvLyBQcm9kdWN0IERldGFpbHNcbiAgICAgICAgcHJvZHVjdE1hcDogZ2V0UHJvZHVjdE1hcChjb25maWcpLFxuICAgICAgICBwcm9kdWN0OiBnZXRQcm9kdWN0TGlzdChjb25maWcpLFxuXG4gICAgICAgIC8vIGZyYW1ld29yayBkZXRhaWxzXG4gICAgICAgIGZyYW1ld29yazogY29uZmlnLmZyYW1ld29yayxcblxuICAgICAgICAvLyBDTEkgRGV0YWlsc1xuICAgICAgICBpc0NMSUVuYWJsZWQ6IGlzQ0xJRW5hYmxlZFxuICAgIH1cblxuICAgIGlmIChldmVudFR5cGUgPT09ICdTREtUZXN0U3VjY2Vzc2Z1bCcpIHtcbiAgICAgICAgY29uc3Qgd29ya2VyRGF0YSA9IGdldERhdGFGcm9tV29ya2VycygpXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgZXZlbnRQcm9wZXJ0aWVzLnByb2R1Y3RVc2FnZSA9IGdldFByb2R1Y3RVc2FnZSh3b3JrZXJEYXRhKVxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfUE9MTElOR19USU1FT1VUKSB7XG4gICAgICAgICAgICBldmVudFByb3BlcnRpZXMucG9sbGluZ1RpbWVvdXQgPSBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9QT0xMSU5HX1RJTUVPVVQgYXMgc3RyaW5nXG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgYW55IHdvcmtlciBjYWxsZWQgYnJvd3Nlci5yZWxvYWRTZXNzaW9uKCksIG1hcmsgdGhlIGJ1aWxkIHNvIHRoZVxuICAgICAgICAvLyBzZXNzaW9uLWxpbmtpbmcgZGFzaGJvYXJkIGNhbiBleGNsdWRlIGl0cyAoZXhwZWN0ZWQpIHJlbG9hZC1vcnBoYW5lZCBzZXNzaW9ucy5cbiAgICAgICAgdHlwZSBXb3JrZXJSZWNvcmQgPSB7IHJlbG9hZEhhcHBlbmVkPzogYm9vbGVhbjsgdXNhZ2VTdGF0cz86IHVua25vd24gfVxuICAgICAgICBjb25zdCByZWxvYWRIYXBwZW5lZCA9IHdvcmtlckRhdGEuc29tZSgod29ya2VyKSA9PiAod29ya2VyIGFzIFdvcmtlclJlY29yZCkucmVsb2FkSGFwcGVuZWQgPT09IHRydWUpXG4gICAgICAgIGlmIChyZWxvYWRIYXBwZW5lZCkge1xuICAgICAgICAgICAgZXZlbnRQcm9wZXJ0aWVzLmZpbmlzaGVkTWV0YWRhdGEgPSB7IHJlYXNvbjogJ3Nlc3Npb25fcmVsb2FkZWQnIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBIHNpZ25hbC10ZXJtaW5hdGVkIHJ1biBtdXN0IGJlIHF1ZXJ5LWRldGVjdGFibGUgXHUyMDE0IGtpbGwgd2lucyBvdmVyXG4gICAgICAgIC8vIHJlbG9hZCBhcyB0aGUgZmluaXNoIHJlYXNvbi5cbiAgICAgICAgaWYgKGNvbmZpZy5raWxsU2lnbmFsKSB7XG4gICAgICAgICAgICBldmVudFByb3BlcnRpZXMuZmluaXNoZWRNZXRhZGF0YSA9IHsgcmVhc29uOiAndXNlcl9raWxsZWQnLCBzaWduYWw6IGNvbmZpZy5raWxsU2lnbmFsIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHVzZXJOYW1lOiBjb25maWcudXNlck5hbWUsXG4gICAgICAgIGFjY2Vzc0tleTogY29uZmlnLmFjY2Vzc0tleSxcbiAgICAgICAgZXZlbnRfdHlwZTogZXZlbnRUeXBlLFxuICAgICAgICBkZXRlY3RlZEZyYW1ld29yazogV0RJT19OQU1JTkdfUFJFRklYICsgY29uZmlnLmZyYW1ld29yayxcbiAgICAgICAgZXZlbnRfcHJvcGVydGllczogZXZlbnRQcm9wZXJ0aWVzXG4gICAgfSBhcyB1bmtub3duIGFzIEZ1bm5lbERhdGFcblxufVxuXG5mdW5jdGlvbiBnZXRQcm9kdWN0VXNhZ2Uod29ya2Vyc0RhdGE6IHsgdXNhZ2VTdGF0czogVXNhZ2VTdGF0IH1bXSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHRlc3RPYnNlcnZhYmlsaXR5OiBVc2FnZVN0YXRzLmdldEluc3RhbmNlKCkuZ2V0Rm9ybWF0dGVkRGF0YSh3b3JrZXJzRGF0YSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldExhbmd1YWdlRnJhbWV3b3JrKGZyYW1ld29yaz86IHN0cmluZykge1xuICAgIHJldHVybiAnV2ViZHJpdmVySU9fJyArIGZyYW1ld29ya1xufVxuXG5mdW5jdGlvbiBnZXRSZWZlcnJlcihmcmFtZXdvcms/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBmdWxsTmFtZSA9IGZyYW1ld29yayA/IFdESU9fTkFNSU5HX1BSRUZJWCArIGZyYW1ld29yayA6ICdXZWJkcml2ZXJJTydcbiAgICByZXR1cm4gYCR7ZnVsbE5hbWV9LyR7QlNUQUNLX1NFUlZJQ0VfVkVSU0lPTn1gXG59XG5cbmNvbnN0IHNlbmRFdmVudCA9IHtcbiAgICB0Y2dEb3duOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RUY2dEb3duUmVzcG9uc2UnLCBjb25maWcpLFxuICAgIGludmFsaWRUY2dBdXRoOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RJbnZhbGlkVGNnQXV0aFJlc3BvbnNlV2l0aFVzZXJJbXBhY3QnLCBjb25maWcpLFxuICAgIHRjZ0F1dGhGYWlsdXJlOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RUY2dBdXRoRmFpbHVyZScsIGNvbmZpZyksXG4gICAgdGNndEluaXRTdWNjZXNzZnVsOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RUY2d0SW5pdFN1Y2Nlc3NmdWwnLCBjb25maWcpLFxuICAgIGluaXRGYWlsZWQ6IChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZykgPT4gZmlyZUZ1bm5lbFRlc3RFdmVudCgnU0RLVGVzdEluaXRGYWlsZWRSZXNwb25zZScsIGNvbmZpZyksXG4gICAgdGNnUHJveHlGYWlsdXJlOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RUY2dQcm94eUZhaWx1cmUnLCBjb25maWcpLFxufVxuXG5mdW5jdGlvbiBpc1Byb3h5RXJyb3IoYXV0aFJlc3VsdDogeyBzdGF0dXM/OiBudW1iZXIgfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoYXV0aFJlc3VsdCBhcyBCcm93c2Vyc3RhY2tIZWFsaW5nLkluaXRFcnJvclJlc3BvbnNlKT8uc3RhdHVzID09PSA1MDJcbn1cblxuZnVuY3Rpb24gaGFuZGxlUHJveHlFcnJvcihjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBzZW5kRXZlbnQudGNnUHJveHlGYWlsdXJlKGNvbmZpZylcbiAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ1Byb3h5IEVycm9yLiBEaXNhYmxpbmcgSGVhbGluZyBmb3IgdGhpcyBzZXNzaW9uLicpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVVcGdyYWRlUmVxdWlyZWQoaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ1BsZWFzZSB1cGdyYWRlIEJyb3dzZXJzdGFjayBTZXJ2aWNlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiB0byB1c2UgdGhlIHNlbGYtaGVhbGluZyBmZWF0dXJlLicpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVBdXRoZW50aWNhdGlvbkZhaWx1cmUoc3RhdHVzOiBudW1iZXIsIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgIGlmIChpc1NlbGZIZWFsRW5hYmxlZCkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ1NvbWV0aGluZyB3ZW50IHdyb25nLiBEaXNhYmxpbmcgaGVhbGluZyBmb3IgdGhpcyBzZXNzaW9uLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicpXG4gICAgICAgIH1cbiAgICAgICAgc2VuZEV2ZW50LnRjZ0Rvd24oY29uZmlnKVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1NlbGZIZWFsRW5hYmxlZCkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0F1dGhlbnRpY2F0aW9uIEZhaWxlZC4gRGlzYWJsaW5nIEhlYWxpbmcgZm9yIHRoaXMgc2Vzc2lvbi4nKVxuICAgICAgICB9XG4gICAgICAgIHNlbmRFdmVudC50Y2dBdXRoRmFpbHVyZShjb25maWcpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVBdXRoZW50aWNhdGlvblN1Y2Nlc3MoXG4gICAgaXNIZWFsaW5nRW5hYmxlZEZvclVzZXI6IGJvb2xlYW4sXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsXG4gICAgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWRcbikge1xuICAgIGlmICghaXNIZWFsaW5nRW5hYmxlZEZvclVzZXIgJiYgaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0hlYWxpbmcgaXMgbm90IGVuYWJsZWQgZm9yIHlvdXIgZ3JvdXAsIHBsZWFzZSBjb250YWN0IHRoZSBhZG1pbicpXG4gICAgfSBlbHNlIGlmICh1c2VySWQgJiYgaXNIZWFsaW5nRW5hYmxlZEZvclVzZXIpIHtcbiAgICAgICAgc2VuZEV2ZW50LnRjZ3RJbml0U3VjY2Vzc2Z1bChjb25maWcpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVJbml0aWFsaXphdGlvbkZhaWx1cmUoc3RhdHVzOiBudW1iZXIsIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIHNlbmRFdmVudC5pbml0RmFpbGVkKGNvbmZpZylcbiAgICB9IGVsc2UgaWYgKCFzdGF0dXMgJiYgaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgc2VuZEV2ZW50LmludmFsaWRUY2dBdXRoKGNvbmZpZylcbiAgICB9XG5cbiAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0F1dGhlbnRpY2F0aW9uIEZhaWxlZC4gSGVhbGluZyB3aWxsIGJlIGRpc2FibGVkIGZvciB0aGlzIHNlc3Npb24uJylcbiAgICB9XG59XG5cbmludGVyZmFjZSBBdXRoUmVzdWx0IHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBpc0F1dGhlbnRpY2F0ZWQ6IGJvb2xlYW5cbiAgICBzdGF0dXM6IG51bWJlclxuICAgIHVzZXJJZDogc3RyaW5nXG4gICAgZ3JvdXBJZDogc3RyaW5nXG4gICAgaXNIZWFsaW5nRW5hYmxlZDogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlSGVhbGluZ0luc3RydW1lbnRhdGlvbihcbiAgICBhdXRoUmVzdWx0OiBBdXRoUmVzdWx0LFxuICAgIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLFxuICAgIGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGlzUHJveHlFcnJvcihhdXRoUmVzdWx0KSkge1xuICAgICAgICAgICAgaGFuZGxlUHJveHlFcnJvcihjb25maWcsIGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIGlzQXV0aGVudGljYXRlZCwgc3RhdHVzLCB1c2VySWQsIGdyb3VwSWQsIGlzSGVhbGluZ0VuYWJsZWQ6IGlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyIH0gPSBhdXRoUmVzdWx0XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UgPT09ICdVcGdyYWRlIHJlcXVpcmVkJykge1xuICAgICAgICAgICAgaGFuZGxlVXBncmFkZVJlcXVpcmVkKGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQXV0aGVudGljYXRlZCkge1xuICAgICAgICAgICAgaGFuZGxlQXV0aGVudGljYXRpb25GYWlsdXJlKHN0YXR1cywgY29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXV0aGVudGljYXRlZCAmJiB1c2VySWQgJiYgZ3JvdXBJZCkge1xuICAgICAgICAgICAgaGFuZGxlQXV0aGVudGljYXRpb25TdWNjZXNzKGlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyLCB1c2VySWQsIGNvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNDAwIHx8ICFzdGF0dXMpIHtcbiAgICAgICAgICAgIGhhbmRsZUluaXRpYWxpemF0aW9uRmFpbHVyZShzdGF0dXMsIGNvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRXJyb3IgaW4gaGFuZGxpbmcgaGVhbGluZyBpbnN0cnVtZW50YXRpb246ICcgKyBlcnIpXG4gICAgfVxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcblxuY29uc3Qgd29ya2Vyc0RhdGFEaXJQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdsb2dzJywgJ3dvcmtlcl9kYXRhJylcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFGcm9tV29ya2Vycygpe1xuICAgIGNvbnN0IHdvcmtlcnNEYXRhOiBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+W10gPSBbXVxuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHdvcmtlcnNEYXRhRGlyUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHdvcmtlcnNEYXRhXG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyh3b3JrZXJzRGF0YURpclBhdGgpXG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1JlYWRpbmcgd29ya2VyIGZpbGUgJyArIGZpbGUpXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtlcnNEYXRhRGlyUGF0aCwgZmlsZSlcbiAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JylcbiAgICAgICAgY29uc3Qgd29ya2VyRGF0YSA9IEpTT04ucGFyc2UoZmlsZUNvbnRlbnQpXG4gICAgICAgIHdvcmtlcnNEYXRhLnB1c2god29ya2VyRGF0YSlcbiAgICB9KVxuXG4gICAgLy8gUmVtb3ZlIHdvcmtlciBkYXRhIGFmdGVyIGFsbCByZWFkaW5nXG4gICAgcmVtb3ZlV29ya2Vyc0RhdGFEaXIoKVxuXG4gICAgcmV0dXJuIHdvcmtlcnNEYXRhXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYXZlV29ya2VyRGF0YShkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtlcnNEYXRhRGlyUGF0aCwgJ3dvcmtlci1kYXRhLScgKyBwcm9jZXNzLnBpZCArICcuanNvbicpXG5cbiAgICB0cnkge1xuICAgICAgICBjcmVhdGVXb3JrZXJzRGF0YURpcigpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEpKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdFeGNlcHRpb24gaW4gc2F2aW5nIHdvcmtlciBkYXRhOiAnICsgZSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVdvcmtlcnNEYXRhRGlyKCk6IGJvb2xlYW4ge1xuICAgIGZzLnJtU3luYyh3b3JrZXJzRGF0YURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtlcnNEYXRhRGlyKCkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh3b3JrZXJzRGF0YURpclBhdGgpKSB7XG4gICAgICAgIGZzLm1rZGlyU3luYyh3b3JrZXJzRGF0YURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxZQUFBQSxXQUFVLFlBQUFDLFdBQVUsUUFBQUMsT0FBTSxXQUFBQyxVQUFTLFFBQUFDLE9BQU0sY0FBYztBQUNoRSxPQUFPLFlBQVk7QUFDbkIsT0FBT0MsU0FBUTtBQUNmLE9BQU8sVUFBVTtBQUNqQixTQUFTLFFBQVEsYUFBQUMsa0JBQWlCO0FBQ2xDLE9BQU9DLFdBQVU7QUFDakIsT0FBT0MsV0FBVTtBQU1qQixPQUFPLGlCQUFpQjtBQUN4QixPQUFPLGVBQWU7QUFFdEIsU0FBUyxlQUFBQyxvQkFBbUI7OztBQ2Y1QixPQUFPLGVBQWU7QUFFdEIsSUFBTSxhQUFhO0FBQUEsRUFDZixNQUFNO0FBQUEsRUFBUSxPQUFPO0FBQUEsRUFBUyxPQUFPO0FBQUEsRUFBUyxPQUFPO0FBQUEsRUFBUyxNQUFNO0FBQ3hFO0FBRUEsSUFBTSxhQUFOLGNBQXlCLFVBQVU7QUFBQSxFQUMvQixlQUFlLENBQUMsUUFBUSxXQUFXLE1BQU0sVUFBVSxDQUFDLEVBQUUsTUFBbUI7QUFDckUsSUFBQyxRQUFRLEtBQWtCLGFBQWEsUUFBUSxHQUFHLElBQUk7QUFBQSxNQUNuRCxZQUFXLG9CQUFJLEtBQUssR0FBRSxZQUFZO0FBQUEsTUFDbEMsT0FBTyxNQUFNLFlBQVk7QUFBQSxNQUN6QixTQUFTLElBQUksUUFBUSxLQUFLLElBQUksQ0FBQztBQUFBLE1BQy9CLE1BQU07QUFBQSxNQUNOLGVBQWUsQ0FBQztBQUFBLElBQ3BCLENBQUM7QUFBQSxFQUNMO0FBQUE7QUFBQSxFQUdBLFFBQVEsSUFBSSxZQUF1QjtBQUMvQixTQUFLLGFBQWEsV0FBVyxPQUFPLE9BQU87QUFBQSxFQUMvQztBQUFBLEVBRUEsUUFBUSxJQUFJLFlBQXVCO0FBQy9CLFNBQUssYUFBYSxXQUFX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UUFBSTtBQUNBLFlBQU0sa0JBQWtCLFVBQVU7QUFDbEMsbUJBQWEsTUFBTSw0Q0FBNEM7QUFBQSxJQUNuRSxTQUFTLEdBQVk7QUFDakIsbUJBQWEsTUFBTSxtQ0FBbUMsQ0FBQztBQUFBLElBQzNEO0FBQUEsRUFDSjtBQUFBLEVBRUEsT0FBTyxzQkFBc0IsVUFBa0I7QUFDM0MsUUFBSSxDQUFDLFVBQVU7QUFDWCxhQUFPO0FBQUEsSUFDWDtBQUVBLFVBQU0sVUFBVUMsS0FBRyxhQUFhLFVBQVUsTUFBTTtBQUVoRCxVQUFNLE9BQU8sS0FBSyxNQUFNLE9BQU87QUFDL0IsU0FBSyxxQkFBcUIsUUFBUTtBQUNsQyxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsT0FBTyxxQkFBcUIsVUFBbUI7QUFDM0MsUUFBSSxDQUFDLFVBQVU7QUFDWDtBQUFBLElBQ0o7QUFDQSxJQUFBQSxLQUFHLE9BQU8sVUFBVSxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQUEsRUFDdkM7QUFDSjtBQUVBLEtBQUssY0FBYyxhQUFhOyIsCiAgIm5hbWVzIjogWyJob3N0bmFtZSIsICJwbGF0Zm9ybSIsICJ0eXBlIiwgInZlcnNpb24iLCAiYXJjaCIsICJmcyIsICJwcm9taXNpZnkiLCAicGF0aCIsICJ1dGlsIiwgInBlcmZvcm1hbmNlIiwgImZzIiwgInV0aWwiLCAicGF0aCIsICJhcmNoIiwgInBsYXRmb3JtIiwgImZzIiwgInBhdGgiLCAicGF0aCIsICJmcyIsICJjaGFsayIsICJsb2dnZXIiLCAibG9nIiwgImxvZ2dlciIsICJCU3RhY2tMb2dnZXIiLCAicGF0aCIsICJmcyIsICJjaGFsayIsICJwbGF0Zm9ybSIsICJCU3RhY2tMb2dnZXIiLCAiZnMiLCAidmVyc2lvbiIsICJwYXRoIiwgInByb2Nlc3MiLCAib3BlblJlYWRTdHJlYW1Qcm9taXNlIiwgInBhdGgiLCAiZnMiLCAidXRpbCIsICJ0eXBlIiwgInBsYXRmb3JtIiwgImFyY2giLCAiZnMiLCAiZnMiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAiZ3JvdXAiLCAicGF0aCIsICJmcyIsICJwcm9taXNpZnkiLCAidXRpbCIsICJwZXJmb3JtYW5jZSIsICJsYXVuY2hUZXN0U2Vzc2lvbiIsICJob3N0bmFtZSIsICJwbGF0Zm9ybSIsICJ0eXBlIiwgInZlcnNpb24iLCAiYXJjaCIsICJ1dGlsIiwgInN0b3BCdWlsZFVwc3RyZWFtIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJnZXRQbGF0Zm9ybVZlcnNpb24iLCAiZ2V0UmVzb2x2ZWREZXZpY2VOYW1lIiwgInBhdGgiLCAiaGFzaCIsICJmcyIsICJwYXRoIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInV0aWwiLCAib3MiLCAidXRpbCIsICJmb3JtYXQiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAidXRpbCIsICJ1dGlsIiwgImZzIl0KfQo=
|
|
4548
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWwudHMiLCAiLi4vc3JjL2xvZ1BhdGNoZXIudHMiLCAiLi4vc3JjL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIudHMiLCAiLi4vc3JjL2JzdGFja0xvZ2dlci50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vc3JjL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2FwaVV0aWxzLnRzIiwgIi4uL3NyYy9jbGkvY2xpVXRpbHMudHMiLCAiLi4vc3JjL2ZldGNoV3JhcHBlci50cyIsICIuLi9zcmMvaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2NsaUxvZ2dlci50cyIsICIuLi9zcmMvY2xpL2ZyYW1ld29ya3MvY29uc3RhbnRzL3Rlc3RGcmFtZXdvcmtDb25zdGFudHMudHMiLCAiLi4vc3JjL3Rlc3RIdWIvdXRpbHMudHMiLCAiLi4vc3JjL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLnRzIiwgIi4uL3NyYy9jcmFzaC1yZXBvcnRlci50cyIsICIuLi9zcmMvY29uZmlnQ2FwdHVyZS50cyIsICIuLi9zcmMvdGVzdE9wcy9mZWF0dXJlU3RhdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvZmVhdHVyZVVzYWdlLnRzIiwgIi4uL3NyYy90ZXN0T3BzL3Rlc3RPcHNDb25maWcudHMiLCAiLi4vc3JjL3Rlc3RPcHMvdXNhZ2VTdGF0cy50cyIsICIuLi9zcmMvc2NyaXB0cy9hY2Nlc3NpYmlsaXR5LXNjcmlwdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvb3BlblJ1bnNKb3VybmFsLnRzIiwgIi4uL3NyYy9jbGVhbnVwLnRzIiwgIi4uL3NyYy9pbnN0cnVtZW50YXRpb24vZnVubmVsSW5zdHJ1bWVudGF0aW9uLnRzIiwgIi4uL3NyYy9kYXRhLXN0b3JlLnRzIl0sCiAgInNvdXJjZVJvb3QiOiAiL2hvbWUvcnVubmVyL3dvcmsvd2Rpby1icm93c2Vyc3RhY2stc2VydmljZS93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlL3BhY2thZ2VzL2Jyb3dzZXJzdGFjay1zZXJ2aWNlIiwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGhvc3RuYW1lLCBwbGF0Zm9ybSwgdHlwZSwgdmVyc2lvbiwgYXJjaCwgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCB6bGliIGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB7IGZvcm1hdCwgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHV0aWwgZnJvbSAnbm9kZTp1dGlsJ1xuXG5pbXBvcnQgdHlwZSB7IENhcGFiaWxpdGllcywgRnJhbWV3b3JrcywgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBCZWZvcmVDb21tYW5kQXJncywgQWZ0ZXJDb21tYW5kQXJncyB9IGZyb20gJ0B3ZGlvL3JlcG9ydGVyJ1xuXG5pbXBvcnQgdHlwZSB7IEdpdFJlcG9JbmZvIH0gZnJvbSAnZ2l0LXJlcG8taW5mbydcbmltcG9ydCBnaXRSZXBvSW5mbyBmcm9tICdnaXQtcmVwby1pbmZvJ1xuaW1wb3J0IGdpdGNvbmZpZyBmcm9tICdnaXRjb25maWdsb2NhbCdcbmltcG9ydCB0eXBlIHsgQ29sb3JOYW1lIH0gZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBwZXJmb3JtYW5jZSB9IGZyb20gJ25vZGU6cGVyZl9ob29rcydcbmltcG9ydCBsb2dQYXRjaGVyIGZyb20gJy4vbG9nUGF0Y2hlci5qcydcbmltcG9ydCBQZXJmb3JtYW5jZVRlc3RlciBmcm9tICcuL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgKiBhcyBQRVJGT1JNQU5DRV9TREtfRVZFTlRTIGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IGxvZ0J1aWxkRXJyb3IsIGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eSwgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5LCBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSBCcm93c2VyU3RhY2tDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5pbXBvcnQgeyBPcmNoZXN0cmF0aW9uVXRpbHMgfSBmcm9tICcuL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLmpzJ1xuaW1wb3J0IHR5cGUgeyBFcnJvcnMgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSB7IFVzZXJDb25maWcsIFVwbG9hZFR5cGUsIEJyb3dzZXJzdGFja0NvbmZpZywgQnJvd3NlcnN0YWNrT3B0aW9ucywgTGF1bmNoUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHR5cGUgeyBJVGVzdENhc2VIb29rUGFyYW1ldGVyIH0gZnJvbSAnLi9jdWN1bWJlci10eXBlcy5qcydcbmltcG9ydCB7XG4gICAgQlJPV1NFUl9ERVNDUklQVElPTixcbiAgICBVUExPQURfTE9HU19FTkRQT0lOVCxcbiAgICBjb25zb2xlSG9sZGVyLFxuICAgIFRFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsXG4gICAgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0xUUyxcbiAgICBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQsXG4gICAgVEVTVE9QU19TQ1JFRU5TSE9UX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELFxuICAgIEJST1dTRVJTVEFDS19LSUxMX1NJR05BTCxcbiAgICBQRVJGX01FQVNVUkVNRU5UX0VOVixcbiAgICBSRVJVTl9FTlYsXG4gICAgQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRCxcbiAgICBNQVhfR0lUX01FVEFfREFUQV9TSVpFX0lOX0JZVEVTLFxuICAgIEdJVF9NRVRBX0RBVEFfVFJVTkNBVEVELFxuICAgIEFQUF9BTExZX0lTU1VFU19TVU1NQVJZX0VORFBPSU5ULFxuICAgIEFQUF9BTExZX0lTU1VFU19FTkRQT0lOVCxcbiAgICBDTElfREVCVUdfTE9HU19GSUxFLFxuICAgIFdESU9fTkFNSU5HX1BSRUZJWCxcbiAgICBTVE9QX0JVSUxEX01BWF9BVFRFTVBUUyxcbiAgICBTVE9QX0JVSUxEX0FUVEVNUFRfVElNRU9VVF9NUyxcbiAgICBTVE9QX0JVSUxEX1RPVEFMX0JVREdFVF9NUyxcbiAgICBTVE9QX0JVSUxEX0JBQ0tPRkZfQkFTRV9NU1xufSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCBDcmFzaFJlcG9ydGVyIGZyb20gJy4vY3Jhc2gtcmVwb3J0ZXIuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB7IGNvbGxlY3RDb25maWdGaWxlc0ZvclVwbG9hZCwgZGVkdXBlRW50cnlOYW1lLCBmaW5kUGFja2FnZUpzb25Gb3JVcGxvYWQsIGlzQXV0b0NhcHR1cmVMb2dzRGlzYWJsZWQsIHJlZGFjdFNlbnNpdGl2ZUNvbnRlbnQsIHJlbGF0aXZlRGlyVG9Dd2QgfSBmcm9tICcuL2NvbmZpZ0NhcHR1cmUuanMnXG5pbXBvcnQgVXNhZ2VTdGF0cyBmcm9tICcuL3Rlc3RPcHMvdXNhZ2VTdGF0cy5qcydcbmltcG9ydCBUZXN0T3BzQ29uZmlnIGZyb20gJy4vdGVzdE9wcy90ZXN0T3BzQ29uZmlnLmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGFydEJpblNlc3Npb25SZXNwb25zZSB9IGZyb20gJy4vZ3JwYy9pbmRleC5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuL2NsaS9hcGlVdGlscy5qcydcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3RhcidcblxuaW1wb3J0IEFjY2Vzc2liaWxpdHlTY3JpcHRzIGZyb20gJy4vc2NyaXB0cy9hY2Nlc3NpYmlsaXR5LXNjcmlwdHMuanMnXG5cbmltcG9ydCB7IF9mZXRjaCBhcyBmZXRjaCB9IGZyb20gJy4vZmV0Y2hXcmFwcGVyLmpzJ1xuXG5jb25zdCBwR2l0Y29uZmlnID0gcHJvbWlzaWZ5KGdpdGNvbmZpZylcblxuZXhwb3J0IHR5cGUgR2l0TWV0YURhdGEgPSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNoYTogc3RyaW5nO1xuICAgIHNob3J0X3NoYTogc3RyaW5nO1xuICAgIGJyYW5jaDogc3RyaW5nO1xuICAgIHRhZzogc3RyaW5nIHwgbnVsbDtcbiAgICBjb21taXR0ZXI6IHN0cmluZztcbiAgICBjb21taXR0ZXJfZGF0ZTogc3RyaW5nO1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIGF1dGhvcl9kYXRlOiBzdHJpbmc7XG4gICAgY29tbWl0X21lc3NhZ2U6IHN0cmluZztcbiAgICByb290OiBzdHJpbmc7XG4gICAgY29tbW9uX2dpdF9kaXI6IHN0cmluZztcbiAgICB3b3JrdHJlZV9naXRfZGlyOiBzdHJpbmc7XG4gICAgbGFzdF90YWc6IHN0cmluZyB8IG51bGw7XG4gICAgY29tbWl0c19zaW5jZV9sYXN0X3RhZzogbnVtYmVyO1xuICAgIHJlbW90ZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB1cmw6IHN0cmluZyB9Pjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVRVUVTVF9DT05GSUcgPSB7XG4gICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnWC1CU1RBQ0stT0JTJzogJ3RydWUnXG4gICAgfSxcbn1cblxuZXhwb3J0IGNvbnN0IENPTE9SUzogUmVjb3JkPHN0cmluZywgQ29sb3JOYW1lPiA9IHtcbiAgICBlcnJvcjogJ3JlZCcsXG4gICAgd2FybjogJ3llbGxvdycsXG4gICAgaW5mbzogJ2N5YW5CcmlnaHQnLFxuICAgIGRlYnVnOiAnZ3JlZW4nLFxuICAgIHRyYWNlOiAnY3lhbicsXG4gICAgcHJvZ3Jlc3M6ICdtYWdlbnRhJ1xufVxuXG4vKipcbiAqIGdldCBicm93c2VyIGRlc2NyaXB0aW9uIGZvciBCcm93c2Vyc3RhY2sgc2VydmljZVxuICogQHBhcmFtIGNhcCBicm93c2VyIGNhcGFibGl0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyRGVzY3JpcHRpb24oY2FwOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpIHtcbiAgICBjYXAgPSBjYXAgfHwge31cbiAgICBpZiAoY2FwWydic3RhY2s6b3B0aW9ucyddKSB7XG4gICAgICAgIGNhcCA9IHsgLi4uY2FwLCAuLi5jYXBbJ2JzdGFjazpvcHRpb25zJ10gfSBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGVzZSBrZXlzIGRlc2NyaWJlIHRoZSBicm93c2VyIHRoZSB0ZXN0IHdhcyBydW4gb25cbiAgICAgKi9cbiAgICByZXR1cm4gQlJPV1NFUl9ERVNDUklQVElPTlxuICAgICAgICAubWFwKChrKSA9PiAoY2FwKVtrIGFzIGtleW9mIHR5cGVvZiBjYXBdKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5qb2luKCcgJylcbn1cblxuLyoqXG4gKiBnZXQgY29ycmVjdCBicm93c2VyIGNhcGFiaWxpdGllcyBvYmplY3QgaW4gYm90aCBtdWx0aXJlbW90ZSBhbmQgbm9ybWFsIHNldHVwc1xuICogQHBhcmFtIGJyb3dzZXIgYnJvd3NlciBvYmplY3RcbiAqIEBwYXJhbSBjYXBzIGJyb3dzZXIgY2FwYmlsaXRpZXMgb2JqZWN0LiBJbiBjYXNlIG9mIG11bHRpcmVtb3RlLCB0aGUgb2JqZWN0IGl0c2VsZiBzaG91bGQgaGF2ZSBhIHByb3BlcnR5IG5hbWVkICdjYXBhYmlsaXRpZXMnXG4gKiBAcGFyYW0gYnJvd3Nlck5hbWUgYnJvd3NlciBuYW1lIGluIGNhc2Ugb2YgbXVsdGlyZW1vdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJDYXBhYmlsaXRpZXMoYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciB8IFdlYmRyaXZlcklPLk11bHRpUmVtb3RlQnJvd3NlciwgY2Fwcz86IENhcGFiaWxpdGllcy5SZXNvbHZlZFRlc3RydW5uZXJDYXBhYmlsaXRpZXMsIGJyb3dzZXJOYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKCFicm93c2VyLmlzTXVsdGlyZW1vdGUpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uYnJvd3Nlci5jYXBhYmlsaXRpZXMsIC4uLmNhcHMgfSBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNcbiAgICB9XG5cbiAgICBjb25zdCBtdWx0aUNhcHMgPSBjYXBzIGFzIENhcGFiaWxpdGllcy5SZXF1ZXN0ZWRNdWx0aXJlbW90ZUNhcGFiaWxpdGllc1xuICAgIGNvbnN0IGdsb2JhbENhcCA9IGJyb3dzZXJOYW1lICYmIGJyb3dzZXIuZ2V0SW5zdGFuY2UoYnJvd3Nlck5hbWUpID8gYnJvd3Nlci5nZXRJbnN0YW5jZShicm93c2VyTmFtZSkuY2FwYWJpbGl0aWVzIDoge31cbiAgICBjb25zdCBjYXAgPSBicm93c2VyTmFtZSAmJiBtdWx0aUNhcHNbYnJvd3Nlck5hbWVdID8gbXVsdGlDYXBzW2Jyb3dzZXJOYW1lXS5jYXBhYmlsaXRpZXMgOiB7fVxuICAgIHJldHVybiB7IC4uLmdsb2JhbENhcCwgLi4uY2FwIH0gYXMgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXG59XG5cbi8qKlxuICogY2hlY2sgZm9yIGJyb3dzZXJzdGFjayBXM0MgY2FwYWJpbGl0aWVzLiBEb2VzIG5vdCBzdXBwb3J0IGxlZ2FjeSBjYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSBjYXAgYnJvd3NlciBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcnN0YWNrQ2FwYWJpbGl0eShjYXA/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpIHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgICAgY2FwICYmXG4gICAgICAgICAgICBjYXBbJ2JzdGFjazpvcHRpb25zJ10gJiZcbiAgICAgICAgICAgIC8vIHJldHVybiBmYWxzZSBpZiB0aGUgb25seSBjYXAgaW4gYnN0YWNrOm9wdGlvbnMgaXMgd2Rpb1NlcnZpY2UsXG4gICAgICAgICAgICAvLyBhcyB0aGF0IGlzIGFkZGVkIGJ5IHRoZSBzZXJ2aWNlIGFuZCBub3QgcHJlc2VudCBpbiB1c2VyIHBhc3NlZCBjYXBzXG4gICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGNhcFsnYnN0YWNrOm9wdGlvbnMnXSkubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgY2FwWydic3RhY2s6b3B0aW9ucyddLndkaW9TZXJ2aWNlXG4gICAgICAgICAgICApXG4gICAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50U3VpdGVOYW1lKGZ1bGxUaXRsZTogc3RyaW5nLCB0ZXN0U3VpdGVUaXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmdWxsVGl0bGVXb3JkcyA9IGZ1bGxUaXRsZS5zcGxpdCgnICcpXG4gICAgY29uc3QgdGVzdFN1aXRlVGl0bGVXb3JkcyA9IHRlc3RTdWl0ZVRpdGxlLnNwbGl0KCcgJylcbiAgICBjb25zdCBzaG9ydGVzdExlbmd0aCA9IE1hdGgubWluKGZ1bGxUaXRsZVdvcmRzLmxlbmd0aCwgdGVzdFN1aXRlVGl0bGVXb3Jkcy5sZW5ndGgpXG4gICAgbGV0IGMgPSAwXG4gICAgbGV0IHBhcmVudFN1aXRlTmFtZSA9ICcnXG4gICAgd2hpbGUgKGMgPCBzaG9ydGVzdExlbmd0aCAmJiBmdWxsVGl0bGVXb3Jkc1tjXSA9PT0gdGVzdFN1aXRlVGl0bGVXb3Jkc1tjXSkge1xuICAgICAgICBwYXJlbnRTdWl0ZU5hbWUgKz0gZnVsbFRpdGxlV29yZHNbYysrXSArICcgJ1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50U3VpdGVOYW1lLnRyaW0oKVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRXJyb3IoZXJyb3I6IEVycm9yLCBmbjogRnVuY3Rpb24sIGFyZ3M6IHVua25vd25bXSkge1xuICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgaW4gZXhlY3V0aW5nICR7Zm4ubmFtZX0gd2l0aCBhcmdzICR7YXJnc306ICR7ZXJyb3J9YClcbiAgICBsZXQgYXJnc1N0cmluZzogc3RyaW5nXG4gICAgdHJ5IHtcbiAgICAgICAgYXJnc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KGFyZ3MpXG4gICAgfSBjYXRjaCB7XG4gICAgICAgIGFyZ3NTdHJpbmcgPSB1dGlsLmluc3BlY3QoYXJncywgeyBkZXB0aDogMiB9KVxuICAgIH1cbiAgICBDcmFzaFJlcG9ydGVyLnVwbG9hZENyYXNoUmVwb3J0KGBFcnJvciBpbiBleGVjdXRpbmcgJHtmbi5uYW1lfSB3aXRoIGFyZ3MgJHthcmdzU3RyaW5nfSA6ICR7ZXJyb3J9YCwgZXJyb3IgJiYgZXJyb3Iuc3RhY2sgfHwgJ3Vua25vd24gZXJyb3InKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbzExeUVycm9ySGFuZGxlcihmbjogRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGZ1bmN0aW9uVG9IYW5kbGUgPSBmblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25Ub0hhbmRsZSA9IHBlcmZvcm1hbmNlLnRpbWVyaWZ5KGZ1bmN0aW9uVG9IYW5kbGUgYXMgYW55KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZnVuY3Rpb25Ub0hhbmRsZSguLi5hcmdzKVxuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNhdGNoKGVycm9yID0+IHByb2Nlc3NFcnJvcihlcnJvciwgZm4sIGFyZ3MpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGVycm9yIGFzIEVycm9yLCBmbiwgYXJncylcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9ySGFuZGxlcihmbjogRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZnVuY3Rpb25Ub0hhbmRsZSA9IGZuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmdW5jdGlvblRvSGFuZGxlKC4uLmFyZ3MpXG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2F0Y2goZXJyb3IgPT4gQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiBleGVjdXRpbmcgJHtmbi5uYW1lfSB3aXRoIGFyZ3MgJHthcmdzfTogJHtlcnJvcn1gKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgaW4gZXhlY3V0aW5nICR7Zm4ubmFtZX0gd2l0aCBhcmdzICR7YXJnc306ICR7ZXJyb3J9YClcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5vZGVSZXF1ZXN0KHJlcXVlc3RUeXBlOiBzdHJpbmcsIGFwaUVuZHBvaW50OiBzdHJpbmcsIG9wdGlvbnM6IFJlcXVlc3RJbml0LCBhcGlVcmw6IHN0cmluZywgdGltZW91dDogbnVtYmVyID0gMTIwMDAwKSB7XG4gICAgdHJ5IHtcblxuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YXBpVXJsfS8ke2FwaUVuZHBvaW50fWAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdFR5cGUsXG4gICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9KVxuXG4gICAgICAgIC8vIENsZWFyIHRoZSB0aW1lb3V0IGFzIHRoZSByZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcblxuICAgICAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3IgaW4gZmlyaW5nIHJlcXVlc3QgJHthcGlVcmx9LyR7YXBpRW5kcG9pbnR9OiAke2Zvcm1hdChlcnJvcil9YClcbiAgICAgICAgY29uc3QgaXNMb2dVcGxvYWQgPSBhcGlFbmRwb2ludCA9PT0gVVBMT0FEX0xPR1NfRU5EUE9JTlRcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2VKc29uID0gZXJyb3IucmVzcG9uc2UuYm9keSA/IEpTT04ucGFyc2UoZXJyb3IucmVzcG9uc2UuYm9keS50b1N0cmluZygpKSA6IG51bGxcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZUpzb24gPyBlcnJvck1lc3NhZ2VKc29uLm1lc3NhZ2UgOiBudWxsXG4gICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGAke2Vycm9yTWVzc2FnZX0gLSAke2Vycm9yLnN0YWNrfWBcbiAgICAgICAgICAgICAgICBpZiAoaXNMb2dVcGxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNMb2dVcGxvYWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNMb2dVcGxvYWQpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEZhaWxlZCB0byBmaXJlIGFwaSByZXF1ZXN0IGR1ZSB0byAke2Vycm9yfSAtICR7ZXJyb3Iuc3RhY2t9YClcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGZpcmUgYXBpIHJlcXVlc3QgZHVlIHRvICR7ZXJyb3J9IC0gJHtlcnJvci5zdGFja31gKVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gaHR0cHM6Ly90dWdheWlsaWsubWVkaXVtLmNvbS9lcnJvci1oYW5kbGluZy12aWEtdHJ5LWNhdGNoLXByb3h5LWluLWphdmFzY3JpcHQtNTQxMTZkYmY3ODNmXG4vKlxuICAgIEEgY2xhc3Mgd3JhcHBlciBmb3IgZXJyb3IgaGFuZGxpbmcuIFRoZSB3cmFwcGVyIHdyYXBzIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgY2xhc3Mgd2l0aCBhIGVycm9yIGhhbmRsZXIgZnVuY3Rpb24uXG4gICAgSWYgYW55IGV4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGFzcyBtZXRob2QsIHRoYXQgd2lsbCBnZXQgY2F1Z2h0IGluIHRoZSB3cmFwcGVyIHdoaWNoIGxvZ3MgYW5kIHJlcG9ydHMgdGhlIGVycm9yLlxuICovXG50eXBlIENsYXNzVHlwZSA9IHsgbmV3KC4uLmFyZ3M6IHVua25vd25bXSk6IHVua25vd247IH0gLy8gQSBnZW5lcmljIHR5cGUgZm9yIGEgY2xhc3NcbmV4cG9ydCBmdW5jdGlvbiBvMTF5Q2xhc3NFcnJvckhhbmRsZXI8VCBleHRlbmRzIENsYXNzVHlwZT4oZXJyb3JDbGFzczogVCk6IFQge1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IGVycm9yQ2xhc3MucHJvdG90eXBlXG5cbiAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlKS5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBlcnJvckNsYXNzXG4gICAgfVxuXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlKS5mb3JFYWNoKChtZXRob2ROYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IHByb3RvdHlwZVttZXRob2ROYW1lXVxuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJyAmJiBtZXRob2ROYW1lICE9PSAnY29uc3RydWN0b3InICYmIG1ldGhvZE5hbWUgIT09ICdjb21tYW5kV3JhcHBlcicpIHtcbiAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIHByZXNlcnZlIHRoaXMgY29udGV4dCwgbmVlZCB0byBkZWZpbmUgbGlrZSB0aGlzXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSA/IHBlcmZvcm1hbmNlLnRpbWVyaWZ5KG1ldGhvZCkgOiBtZXRob2QpLmNhbGwodGhpcywgLi4uYXJncylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5jYXRjaChlcnJvciA9PiBwcm9jZXNzRXJyb3IoZXJyb3IsIG1ldGhvZCwgYXJncykpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG5cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3IoZXJyIGFzIEVycm9yLCBtZXRob2QsIGFyZ3MpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBlcnJvckNsYXNzXG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzVGVzdE9ic2VydmFiaWxpdHlSZXNwb25zZSA9IChyZXNwb25zZTogTGF1bmNoUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlLm9ic2VydmFiaWxpdHkpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGb3JPYnNlcnZhYmlsaXR5KG51bGwpXG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLm9ic2VydmFiaWxpdHkuc3VjY2Vzcykge1xuICAgICAgICBoYW5kbGVFcnJvckZvck9ic2VydmFiaWxpdHkocmVzcG9uc2Uub2JzZXJ2YWJpbGl0eSBhcyBFcnJvcnMpXG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWV0gPSAndHJ1ZSdcbiAgICBpZiAocmVzcG9uc2Uub2JzZXJ2YWJpbGl0eS5vcHRpb25zLmFsbG93X3NjcmVlbnNob3RzKSB7XG4gICAgICAgIHByb2Nlc3MuZW52W1RFU1RPUFNfU0NSRUVOU0hPVF9FTlZdID0gcmVzcG9uc2Uub2JzZXJ2YWJpbGl0eS5vcHRpb25zLmFsbG93X3NjcmVlbnNob3RzLnRvU3RyaW5nKClcbiAgICB9XG59XG5cbmludGVyZmFjZSBEYXRhRWxlbWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5leHBvcnQgY29uc3QganNvbmlmeUFjY2Vzc2liaWxpdHlBcnJheSA9IChcbiAgICBkYXRhQXJyYXk6IERhdGFFbGVtZW50W10sXG4gICAga2V5TmFtZToga2V5b2YgRGF0YUVsZW1lbnQsXG4gICAgdmFsdWVOYW1lOiBrZXlvZiBEYXRhRWxlbWVudFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgIGRhdGFBcnJheS5mb3JFYWNoKChlbGVtZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICByZXN1bHRbZWxlbWVudFtrZXlOYW1lXSBhcyBzdHJpbmddID0gZWxlbWVudFt2YWx1ZU5hbWVdXG4gICAgfSlcbiAgICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzQWNjZXNzaWJpbGl0eVJlc3BvbnNlID0gKHJlc3BvbnNlOiBMYXVuY2hSZXNwb25zZSB8IFN0YXJ0QmluU2Vzc2lvblJlc3BvbnNlLCBvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlLmFjY2Vzc2liaWxpdHkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYWNjZXNzaWJpbGl0eSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5KG51bGwpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5zdWNjZXNzKSB7XG4gICAgICAgIGhhbmRsZUVycm9yRm9yQWNjZXNzaWJpbGl0eShyZXNwb25zZS5hY2Nlc3NpYmlsaXR5IGFzIEVycm9ycylcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkub3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IGFjY2Vzc2liaWxpdHlUb2tlbiwgcG9sbGluZ1RpbWVvdXQsIHNjYW5uZXJWZXJzaW9uIH0gPSBqc29uaWZ5QWNjZXNzaWJpbGl0eUFycmF5KHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkub3B0aW9ucy5jYXBhYmlsaXRpZXMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCAnbmFtZScsICd2YWx1ZScpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGpzb25pZnlBY2Nlc3NpYmlsaXR5QXJyYXkocmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5vcHRpb25zLmNhcGFiaWxpdGllcyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sICduYW1lJywgJ3ZhbHVlJylcbiAgICAgICAgY29uc3Qgc2NyaXB0c0pzb24gPSB7XG4gICAgICAgICAgICAnc2NyaXB0cyc6IGpzb25pZnlBY2Nlc3NpYmlsaXR5QXJyYXkocmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5vcHRpb25zLnNjcmlwdHMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCAnbmFtZScsICdjb21tYW5kJyksXG4gICAgICAgICAgICAnY29tbWFuZHMnOiByZXNwb25zZS5hY2Nlc3NpYmlsaXR5Lm9wdGlvbnMuY29tbWFuZHNUb1dyYXA/LmNvbW1hbmRzID8/IFtdLFxuICAgICAgICAgICAgJ25vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnMnOiByZXN1bHRbJ2dvb2c6Y2hyb21lT3B0aW9ucyddXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjYW5uZXJWZXJzaW9uKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9TQ0FOTkVSX1ZFUlNJT04gPSBzY2FubmVyVmVyc2lvbiBhcyBzdHJpbmdcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgQWNjZXNzaWJpbGl0eSBzY2FubmVyVmVyc2lvbiAke3NjYW5uZXJWZXJzaW9ufWApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjY2Vzc2liaWxpdHlUb2tlbikge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldUID0gYWNjZXNzaWJpbGl0eVRva2VuIGFzIHN0cmluZ1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFldID0gJ3RydWUnXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvbGxpbmdUaW1lb3V0KSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9QT0xMSU5HX1RJTUVPVVQgPSBwb2xsaW5nVGltZW91dCBhcyBzdHJpbmdcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NyaXB0c0pzb24pIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZml4IHR5cGVcbiAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTY3JpcHRzLnVwZGF0ZShzY3JpcHRzSnNvbilcbiAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTY3JpcHRzLnN0b3JlKClcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NMYXVuY2hCdWlsZFJlc3BvbnNlID0gKHJlc3BvbnNlOiBMYXVuY2hSZXNwb25zZSwgb3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyKSA9PiB7XG4gICAgaWYgKG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHkpIHtcbiAgICAgICAgcHJvY2Vzc1Rlc3RPYnNlcnZhYmlsaXR5UmVzcG9uc2UocmVzcG9uc2UpXG4gICAgfVxuICAgIHByb2Nlc3NBY2Nlc3NpYmlsaXR5UmVzcG9uc2UocmVzcG9uc2UsIG9wdGlvbnMpXG59XG5cbmV4cG9ydCBjb25zdCBsYXVuY2hUZXN0U2Vzc2lvbiA9IFBlcmZvcm1hbmNlVGVzdGVyLm1lYXN1cmVXcmFwcGVyKFBFUkZPUk1BTkNFX1NES19FVkVOVFMuVEVTVEhVQl9FVkVOVFMuU1RBUlQsIG8xMXlFcnJvckhhbmRsZXIoYXN5bmMgZnVuY3Rpb24gbGF1bmNoVGVzdFNlc3Npb24ob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lciwgYnNDb25maWc6IFVzZXJDb25maWcsIGJTdGFja0NvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbj86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBsYXVuY2hCdWlsZFVzYWdlID0gVXNhZ2VTdGF0cy5nZXRJbnN0YW5jZSgpLmxhdW5jaEJ1aWxkVXNhZ2VcbiAgICBsYXVuY2hCdWlsZFVzYWdlLnRyaWdnZXJlZCgpXG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBmb3JtYXQ6ICdqc29uJyxcbiAgICAgICAgcHJvamVjdF9uYW1lOiBnZXRPYnNlcnZhYmlsaXR5UHJvamVjdChvcHRpb25zLCBic0NvbmZpZy5wcm9qZWN0TmFtZSksXG4gICAgICAgIG5hbWU6IGdldE9ic2VydmFiaWxpdHlCdWlsZChvcHRpb25zLCBic0NvbmZpZy5idWlsZE5hbWUpLFxuICAgICAgICBidWlsZF9pZGVudGlmaWVyOiBic0NvbmZpZy5idWlsZElkZW50aWZpZXIsXG4gICAgICAgIHN0YXJ0ZWRfYXQ6IChuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpLFxuICAgICAgICB0YWdzOiBnZXRPYnNlcnZhYmlsaXR5QnVpbGRUYWdzKG9wdGlvbnMsIGJzQ29uZmlnLmJ1aWxkVGFnKSxcbiAgICAgICAgaG9zdF9pbmZvOiB7XG4gICAgICAgICAgICBob3N0bmFtZTogaG9zdG5hbWUoKSxcbiAgICAgICAgICAgIHBsYXRmb3JtOiBwbGF0Zm9ybSgpLFxuICAgICAgICAgICAgdHlwZTogdHlwZSgpLFxuICAgICAgICAgICAgdmVyc2lvbjogdmVyc2lvbigpLFxuICAgICAgICAgICAgYXJjaDogYXJjaCgpXG4gICAgICAgIH0sXG4gICAgICAgIGNpX2luZm86IGdldENpSW5mbygpLFxuICAgICAgICBidWlsZF9ydW5faWRlbnRpZmllcjogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0JVSUxEX1JVTl9JREVOVElGSUVSLFxuICAgICAgICBmYWlsZWRfdGVzdHNfcmVydW46IHByb2Nlc3MuZW52W1JFUlVOX0VOVl0gfHwgZmFsc2UsXG4gICAgICAgIHZlcnNpb25fY29udHJvbDogYXdhaXQgZ2V0R2l0TWV0YURhdGEoKSxcbiAgICAgICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgICAgICAgc2V0dGluZ3M6IG9wdGlvbnMuYWNjZXNzaWJpbGl0eU9wdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAgYnJvd3NlcnN0YWNrQXV0b21hdGlvbjogc2hvdWxkQWRkU2VydmljZVZlcnNpb24oY29uZmlnLCBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5KSxcbiAgICAgICAgZnJhbWV3b3JrX2RldGFpbHM6IHtcbiAgICAgICAgICAgIGZyYW1ld29ya05hbWU6IFdESU9fTkFNSU5HX1BSRUZJWCArIGNvbmZpZy5mcmFtZXdvcmssXG4gICAgICAgICAgICBmcmFtZXdvcmtWZXJzaW9uOiBic0NvbmZpZy5ic3RhY2tTZXJ2aWNlVmVyc2lvbixcbiAgICAgICAgICAgIHNka1ZlcnNpb246IGJzQ29uZmlnLmJzdGFja1NlcnZpY2VWZXJzaW9uLFxuICAgICAgICAgICAgbGFuZ3VhZ2U6ICdFQ01BU2NyaXB0JyxcbiAgICAgICAgICAgIHRlc3RGcmFtZXdvcms6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnV2ViZHJpdmVySU8nLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IGJzQ29uZmlnLmJzdGFja1NlcnZpY2VWZXJzaW9uXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHByb2R1Y3RfbWFwOiBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwoYlN0YWNrQ29uZmlnLCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbiksXG4gICAgICAgIGNvbmZpZzoge30sXG4gICAgICAgIHRlc3Rfb3JjaGVzdHJhdGlvbjogT3JjaGVzdHJhdGlvblV0aWxzLmdldEluc3RhbmNlKGNvbmZpZyk/LmdldEJ1aWxkU3RhcnREYXRhKCkgfHwge30sXG4gICAgICAgIHRlc3RfbWFuYWdlbWVudDoge1xuICAgICAgICAgICAgdGVzdF9wbGFuX2lkOiBnZXRUZXN0UGxhbklkKG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWNjZXNzaWJpbGl0eUF1dG9tYXRpb24gJiYgKGlzVHVyYm9TY2FsZShvcHRpb25zKSB8fCBkYXRhLmJyb3dzZXJzdGFja0F1dG9tYXRpb24gPT09IGZhbHNlKSl7XG4gICAgICAgIGRhdGEuYWNjZXNzaWJpbGl0eS5zZXR0aW5ncyA/Pz0ge31cbiAgICAgICAgZGF0YS5hY2Nlc3NpYmlsaXR5LnNldHRpbmdzLmluY2x1ZGVFbmNvZGVkRXh0ZW5zaW9uID0gdHJ1ZVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhDcmFzaFJlcG9ydGVyLnVzZXJDb25maWdGb3JSZXBvcnRpbmcpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgQ3Jhc2hSZXBvcnRlci51c2VyQ29uZmlnRm9yUmVwb3J0aW5nID0gcHJvY2Vzcy5lbnYuVVNFUl9DT05GSUdfRk9SX1JFUE9SVElORyAhPT0gdW5kZWZpbmVkID8gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5VU0VSX0NPTkZJR19GT1JfUkVQT1JUSU5HKSA6IHt9XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gQlN0YWNrTG9nZ2VyLmVycm9yKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIHRvIHBhcnNlIHVzZXIgY29uZmlnIHdoaWxlIHNlbmRpbmcgYnVpbGQgc3RhcnQgZXZlbnQgZHVlIHRvICR7ZXJyb3J9YClcbiAgICB9XG4gICAgZGF0YS5jb25maWcgPSBDcmFzaFJlcG9ydGVyLnVzZXJDb25maWdGb3JSZXBvcnRpbmdcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSVV0aWxzLkRBVEFfRU5EUE9JTlR9L2FwaS92Mi9idWlsZHNgXG4gICAgICAgIGNvbnN0IGVuY29kZWRBdXRoID0gQnVmZmVyLmZyb20oYCR7Z2V0T2JzZXJ2YWJpbGl0eVVzZXIob3B0aW9ucywgY29uZmlnKX06JHtnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnMsIGNvbmZpZyl9YCwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCYXNpYyAke2VuY29kZWRBdXRofWAsXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGpzb25SZXNwb25zZTogTGF1bmNoUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgZGVsZXRlIGRhdGE/LmFjY2Vzc2liaWxpdHk/LnNldHRpbmdzPy5pbmNsdWRlRW5jb2RlZEV4dGVuc2lvblxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtTdGFydF9CdWlsZF0gU3VjY2VzcyByZXNwb25zZTogJHtKU09OLnN0cmluZ2lmeShqc29uUmVzcG9uc2UpfWApXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgVGVzdCBQbGFuIElkIHNlbnQgaW4gcmVxdWVzdDogJHtnZXRUZXN0UGxhbklkKG9wdGlvbnMpfWApXG4gICAgICAgIHByb2Nlc3MuZW52W1RFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVl0gPSAndHJ1ZSdcbiAgICAgICAgaWYgKGpzb25SZXNwb25zZS5qd3QpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX0pXVF0gPSBqc29uUmVzcG9uc2Uuand0XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGpzb25SZXNwb25zZS5idWlsZF9oYXNoZWRfaWQpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX1VVSURdID0ganNvblJlc3BvbnNlLmJ1aWxkX2hhc2hlZF9pZFxuICAgICAgICAgICAgVGVzdE9wc0NvbmZpZy5nZXRJbnN0YW5jZSgpLmJ1aWxkSGFzaGVkSWQgPSBqc29uUmVzcG9uc2UuYnVpbGRfaGFzaGVkX2lkXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhgVGVzdGh1YiBzdGFydGVkIHdpdGggaWQ6ICR7VGVzdE9wc0NvbmZpZy5nZXRJbnN0YW5jZSgpPy5idWlsZEhhc2hlZElkfWApXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc0xhdW5jaEJ1aWxkUmVzcG9uc2UoanNvblJlc3BvbnNlLCBvcHRpb25zKVxuICAgICAgICBsYXVuY2hCdWlsZFVzYWdlLnN1Y2Nlc3MoKVxuICAgICAgICByZXR1cm4ganNvblJlc3BvbnNlXG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUZXN0SHViIGJ1aWxkIHN0YXJ0IGZhaWxlZDogJHtmb3JtYXQoZXJyb3IpfWApXG4gICAgICAgIGlmICghKGVycm9yIGFzIEVycm9yICYgeyBzdWNjZXNzOiBib29sZWFuIH0pLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGxhdW5jaEJ1aWxkVXNhZ2UuZmFpbGVkKGVycm9yKVxuICAgICAgICAgICAgbG9nQnVpbGRFcnJvcihlcnJvciBhcyBFcnJvcnMpXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgfVxufSkpXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYXBzV2l0aEFwcEExMXkgPSAocGxhdGZvcm1NZXRhPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0pID0+IHtcbiAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCBkcml2ZXIgcGxhdGZvcm0gaXMgZWxpZ2libGUgZm9yIEFwcEFjY2Vzc2liaWxpdHkgc2NhbiAqL1xuICAgIGlmIChcbiAgICAgICAgKHBsYXRmb3JtTWV0YT8ucGxhdGZvcm1fbmFtZSAmJiBTdHJpbmcocGxhdGZvcm1NZXRhPy5wbGF0Zm9ybV9uYW1lKS50b0xvd2VyQ2FzZSgpID09PSAnYW5kcm9pZCcpICYmXG4gICAgICAgIChwbGF0Zm9ybU1ldGE/LnBsYXRmb3JtX3ZlcnNpb24gJiYgcGFyc2VJbnQocGxhdGZvcm1NZXRhPy5wbGF0Zm9ybV92ZXJzaW9uPy50b1N0cmluZygpKSA8IDExKVxuICAgICkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQXBwIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB0ZXN0cyBhcmUgc3VwcG9ydGVkIG9uIE9TIHZlcnNpb24gMTEgYW5kIGFib3ZlIGZvciBBbmRyb2lkIGRldmljZXMuJylcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYXBzV2l0aEExMXkgPSAoZGV2aWNlTmFtZT86IGFueSwgcGxhdGZvcm1NZXRhPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sIGNocm9tZU9wdGlvbnM/OiBhbnkpID0+IHtcbiAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCBkcml2ZXIgcGxhdGZvcm0gaXMgZWxpZ2libGUgZm9yIEFjY2Vzc2liaWxpdHkgc2NhbiAqL1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChkZXZpY2VOYW1lKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gRGVza3RvcCBicm93c2Vycy4nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxhdGZvcm1NZXRhPy5icm93c2VyX25hbWU/LnRvTG93ZXJDYXNlKCkgIT09ICdjaHJvbWUnKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXJzLicpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBicm93c2VyVmVyc2lvbiA9IHBsYXRmb3JtTWV0YT8uYnJvd3Nlcl92ZXJzaW9uXG4gICAgICAgIGlmICggIWlzVW5kZWZpbmVkKGJyb3dzZXJWZXJzaW9uKSAmJiAhKGJyb3dzZXJWZXJzaW9uID09PSAnbGF0ZXN0JyB8fCBwYXJzZUZsb2F0KGJyb3dzZXJWZXJzaW9uICsgJycpID4gOTQpKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXIgdmVyc2lvbiBncmVhdGVyIHRoYW4gOTQuJylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNocm9tZU9wdGlvbnM/LmFyZ3M/LmluY2x1ZGVzKCctLWhlYWRsZXNzJykpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gd2lsbCBub3QgcnVuIG9uIGxlZ2FjeSBoZWFkbGVzcyBtb2RlLiBTd2l0Y2ggdG8gbmV3IGhlYWRsZXNzIG1vZGUgb3IgYXZvaWQgdXNpbmcgaGVhZGxlc3MgbW9kZS4nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEV4Y2VwdGlvbiBpbiBjaGVja2luZyBjYXBhYmlsaXRpZXMgY29tcGF0aWJpbGl0eSB3aXRoIEFjY2Vzc2liaWxpdHkuIEVycm9yOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYXBzV2l0aE5vbkJzdGFja0ExMXkgPSAoYnJvd3Nlck5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQsIGJyb3dzZXJWZXJzaW9uPzpzdHJpbmcgfCB1bmRlZmluZWQgKSAgPT4ge1xuXG4gICAgaWYgKGJyb3dzZXJOYW1lPy50b0xvd2VyQ2FzZSgpICE9PSAnY2hyb21lJykge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXJzLicpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKGJyb3dzZXJWZXJzaW9uKSAmJiAhKGJyb3dzZXJWZXJzaW9uID09PSAnbGF0ZXN0JyB8fCBwYXJzZUZsb2F0KGJyb3dzZXJWZXJzaW9uICsgJycpID4gMTAwKSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXIgdmVyc2lvbiBncmVhdGVyIHRoYW4gMTAwLicpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuXG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRTY2FuVGVzdEZvckFjY2Vzc2liaWxpdHkgPSAoc3VpdGVUaXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZXN0VGl0bGU6IHN0cmluZywgYWNjZXNzaWJpbGl0eU9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSwgd29ybGQ/OiB7IFtrZXk6IHN0cmluZ106IHVua25vd247IH0sIGlzQ3VjdW1iZXI/OiBib29sZWFuICkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVUYWdzID0gQXJyYXkuaXNBcnJheShhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uaW5jbHVkZVRhZ3NJblRlc3RpbmdTY29wZSkgPyBhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uaW5jbHVkZVRhZ3NJblRlc3RpbmdTY29wZSA6IFtdXG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVUYWdzID0gQXJyYXkuaXNBcnJheShhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uZXhjbHVkZVRhZ3NJblRlc3RpbmdTY29wZSkgPyBhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uZXhjbHVkZVRhZ3NJblRlc3RpbmdTY29wZSA6IFtdXG5cbiAgICAgICAgaWYgKGlzQ3VjdW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3NMaXN0OiBzdHJpbmdbXSA9IFtdXG4gICAgICAgICAgICA7KHdvcmxkPy5waWNrbGUgYXMgeyB0YWdzOiB7IG5hbWU6IHN0cmluZyB9W10gfSk/LnRhZ3MubWFwKCh0YWc6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9KSA9PiB0YWdzTGlzdC5wdXNoKHRhZy5uYW1lKSlcbiAgICAgICAgICAgIGNvbnN0IGV4Y2x1ZGVkID0gZXhjbHVkZVRhZ3M/LnNvbWUoKGV4Y2x1ZGUpID0+IHRhZ3NMaXN0LmluY2x1ZGVzKGV4Y2x1ZGUpKVxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZWQgPSBpbmNsdWRlVGFncz8ubGVuZ3RoID09PSAwIHx8IGluY2x1ZGVUYWdzPy5zb21lKChpbmNsdWRlKSA9PiB0YWdzTGlzdC5pbmNsdWRlcyhpbmNsdWRlKSlcblxuICAgICAgICAgICAgcmV0dXJuICFleGNsdWRlZCAmJiBpbmNsdWRlZFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVsbFRlc3ROYW1lID0gc3VpdGVUaXRsZSArICcgJyArIHRlc3RUaXRsZVxuICAgICAgICBjb25zdCBleGNsdWRlZCA9IGV4Y2x1ZGVUYWdzPy5zb21lKChleGNsdWRlKSA9PiBmdWxsVGVzdE5hbWUuaW5jbHVkZXMoZXhjbHVkZSkpXG4gICAgICAgIGNvbnN0IGluY2x1ZGVkID0gaW5jbHVkZVRhZ3M/Lmxlbmd0aCA9PT0gMCB8fCBpbmNsdWRlVGFncz8uc29tZSgoaW5jbHVkZSkgPT4gZnVsbFRlc3ROYW1lLmluY2x1ZGVzKGluY2x1ZGUpKVxuXG4gICAgICAgIHJldHVybiAhZXhjbHVkZWQgJiYgaW5jbHVkZWRcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIHdoaWxlIHZhbGlkYXRpbmcgdGVzdCBjYXNlIGZvciBhY2Nlc3NpYmlsaXR5IGJlZm9yZSBzY2FubmluZy4gRXJyb3IgOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24gPSAoYWNjZXNzaWJpbGl0eUZsYWc/OiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhhc0ExMXlKd3RUb2tlbiA9IHR5cGVvZiBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1QgPT09ICdzdHJpbmcnICYmIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVC5sZW5ndGggPiAwICYmIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCAhPT0gJ251bGwnICYmIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgcmV0dXJuIGFjY2Vzc2liaWxpdHlGbGFnICYmIGhhc0ExMXlKd3RUb2tlblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXhjZXB0aW9uIGluIHZlcmlmeWluZyB0aGUgQWNjZXNzaWJpbGl0eSBzZXNzaW9uIHdpdGggZXJyb3IgOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgQVBQX0FVVE9NQVRFX0NBUF9LRVlTID0gWydhcHBpdW06YXBwJywgJ2FwcGl1bTpidW5kbGVJZCcsICdhcHBpdW06YXBwUGFja2FnZScsICdhcHBpdW06YXBwQWN0aXZpdHknXSBhcyBjb25zdFxuXG4vLyBBbiBBcHAgQXV0b21hdGUgc2Vzc2lvbiBpcyBpZGVudGlmaWVkIGJ5IGFuIGFwcCBjYXBhYmlsaXR5IG9uIHRoZSBkcml2ZXIgY2Fwc1xuLy8gKGFwcGl1bTphcHAgLyBhcHBpdW06YnVuZGxlSWQgLyBhcHBpdW06YXBwUGFja2FnZSAvIGFwcGl1bTphcHBBY3Rpdml0eSAvIGFwcGl1bTpvcHRpb25zLmFwcCkuXG4vLyBTaGFyZWQgYnkgY29uZmlnLXRpbWUgZGV0ZWN0aW9uIGFuZCB0aGUgQ0xJIEF1dG9tYXRlL1BlcmN5IG1vZHVsZXMgc28gQXBwLUF1dG9tYXRlXG4vLyBlbmRwb2ludCByb3V0aW5nIHN0YXlzIGNvbnNpc3RlbnQgYWNyb3NzIGV2ZXJ5IHBsYWNlIHRoYXQgcmVzb2x2ZXMgaXQgZnJvbSBjYXBhYmlsaXRpZXMuXG5leHBvcnQgZnVuY3Rpb24gaGFzQXBwQ2FwKGNhcD86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIGlmICghY2FwIHx8IHR5cGVvZiBjYXAgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCByZWNvcmQgPSBjYXAgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICBpZiAoQVBQX0FVVE9NQVRFX0NBUF9LRVlTLnNvbWUoa2V5ID0+ICFpc1VuZGVmaW5lZChyZWNvcmRba2V5XSkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGNvbnN0IGFwcGl1bU9wdGlvbnMgPSByZWNvcmRbJ2FwcGl1bTpvcHRpb25zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWRcbiAgICByZXR1cm4gISEoYXBwaXVtT3B0aW9ucyAmJiAhaXNVbmRlZmluZWQoYXBwaXVtT3B0aW9ucy5hcHApKVxufVxuXG5leHBvcnQgY29uc3QgaXNBcHBBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24gPSAoYWNjZXNzaWJpbGl0eUZsYWc/OiBib29sZWFuIHwgc3RyaW5nLCBpc0FwcEF1dG9tYXRlPzogYm9vbGVhbikgPT4ge1xuICAgIGNvbnN0IGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uID0gaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oYWNjZXNzaWJpbGl0eUZsYWcpXG4gICAgcmV0dXJuIGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uICYmIGlzQXBwQXV0b21hdGVcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdFN0cmluZyA9ICh0ZW1wbGF0ZTogKHN0cmluZyB8IG51bGwpLCAuLi52YWx1ZXM6IChzdHJpbmcgfCBudWxsKVtdKTogc3RyaW5nID0+IHtcbiAgICBsZXQgaSA9IDBcbiAgICBpZiAodGVtcGxhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC8lcy9nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2krK11cbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6ICcnXG4gICAgfSlcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCBfZ2V0UGFyYW1zRm9yQXBwQWNjZXNzaWJpbGl0eSA9ICggY29tbWFuZE5hbWU/OiBzdHJpbmcsIHRlc3ROYW1lPzogc3RyaW5nLCBob29rUnVuVXVpZD86IHN0cmluZyB8IG51bGwgKTogeyB0aFRlc3RSdW5VdWlkOiBhbnksIHRoSG9va1J1blV1aWQ6IGFueSwgdGhCdWlsZFV1aWQ6IGFueSwgdGhKd3RUb2tlbjogYW55LCBhdXRoSGVhZGVyOiBhbnksIHNjYW5UaW1lc3RhbXA6IG51bWJlciwgbWV0aG9kOiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlc3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgIH0gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgICd0aFRlc3RSdW5VdWlkJzogcHJvY2Vzcy5lbnYuVEVTVF9BTkFMWVRJQ1NfSUQsXG4gICAgICAgIC8vIFByZXNlbnQgb25seSB3aGVuIHRoZSBzY2FuIGZpcmVzIGluc2lkZSBhIGhvb2sgKGRyb3BwZWQgYnkgSlNPTi5zdHJpbmdpZnkgd2hlbiB1bmRlZmluZWQsXG4gICAgICAgIC8vIHNvIGluLXRlc3Qgc2NhbnMgYXJlIHVuY2hhbmdlZCkuIFNlbGVuaXVtSHViIGFwcEFsbHlIYW5kbGVyIHJlbGF5cyB0aGlzIGFzIGBob29rX3J1bl91dWlkYC5cbiAgICAgICAgJ3RoSG9va1J1blV1aWQnOiBob29rUnVuVXVpZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICd0aEJ1aWxkVXVpZCc6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUSFVCX1VVSUQsXG4gICAgICAgICd0aEp3dFRva2VuJzogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldULFxuICAgICAgICAnYXV0aEhlYWRlcic6IHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCxcbiAgICAgICAgJ3NjYW5UaW1lc3RhbXAnOiBEYXRlLm5vdygpLFxuICAgICAgICAnbWV0aG9kJzogY29tbWFuZE5hbWUsXG4gICAgICAgICd0ZXN0TmFtZSc6IHRlc3ROYW1lXG4gICAgfVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSAgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGNvbnN0IHBlcmZvcm1BMTF5U2NhbiA9IGFzeW5jIChpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyIHwgV2ViZHJpdmVySU8uTXVsdGlSZW1vdGVCcm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nLCAgY29tbWFuZE5hbWU/OiBzdHJpbmcsIHRlc3ROYW1lPzogc3RyaW5nLCBob29rUnVuVXVpZD86IHN0cmluZyB8IG51bGwsKSA6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBhbnk7IH0gfCB1bmRlZmluZWQ+ID0+IHtcblxuICAgIGlmICghaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5KSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignTm90IGFuIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiBzZXNzaW9uLCBjYW5ub3QgcGVyZm9ybSBBY2Nlc3NpYmlsaXR5IHNjYW4uJylcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGlzQXBwQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGlzQWNjZXNzaWJpbGl0eSwgaXNBcHBBdXRvbWF0ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHM6IHVua25vd24gPSBhd2FpdCAoYnJvd3NlciBhcyBXZWJkcml2ZXJJTy5Ccm93c2VyKS5leGVjdXRlKGZvcm1hdFN0cmluZyhBY2Nlc3NpYmlsaXR5U2NyaXB0cy5wZXJmb3JtU2NhbiwgSlNPTi5zdHJpbmdpZnkoX2dldFBhcmFtc0ZvckFwcEFjY2Vzc2liaWxpdHkoY29tbWFuZE5hbWUsIHRlc3ROYW1lLCBob29rUnVuVXVpZCkpKSBhcyBzdHJpbmcsIHt9KVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKHV0aWwuZm9ybWF0KHJlc3VsdHMgYXMgc3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiAoIHJlc3VsdHMgYXMgeyBba2V5OiBzdHJpbmddOiBhbnk7IH0gfCB1bmRlZmluZWQgKVxuICAgICAgICB9XG4gICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5U2NyaXB0cy5wZXJmb3JtU2Nhbikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGV4ZWN1dGVBY2Nlc3NpYmlsaXR5U2NyaXB0KGJyb3dzZXIsIEFjY2Vzc2liaWxpdHlTY3JpcHRzLnBlcmZvcm1TY2FuLCB7IG1ldGhvZDogY29tbWFuZE5hbWUgfHwgJycgfSlcbiAgICAgICAgICAgIHJldHVybiAoIHJlc3VsdHMgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duOyB9IHwgdW5kZWZpbmVkIClcbiAgICAgICAgfVxuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0FjY2Vzc2liaWxpdHlTY3JpcHRzLnBlcmZvcm1TY2FuIGlzIG51bGwnKVxuICAgICAgICByZXR1cm5cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdBY2Nlc3NpYmlsaXR5IFNjYW4gY291bGQgbm90IGJlIHBlcmZvcm1lZCA6ICcgKyBlcnIpXG4gICAgICAgIHJldHVyblxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEExMXlSZXN1bHRzID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5BMTFZX0VWRU5UUy5HRVRfUkVTVUxUUywgYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcpIDogUHJvbWlzZTxBcnJheTx7IFtrZXk6IHN0cmluZ106IGFueTsgfT4+ID0+IHtcblxuICAgIGlmICghaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5KSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignTm90IGFuIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiBzZXNzaW9uLCBjYW5ub3QgcmV0cmlldmUgQWNjZXNzaWJpbGl0eSByZXN1bHRzLicpXG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnUGVyZm9ybWluZyBzY2FuIGJlZm9yZSBnZXR0aW5nIHJlc3VsdHMnKVxuICAgICAgICBhd2FpdCBwZXJmb3JtQTExeVNjYW4oaXNBcHBBdXRvbWF0ZSwgYnJvd3NlciwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHkpXG4gICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHVua25vd24gfT4gPSBhd2FpdCBleGVjdXRlQWNjZXNzaWJpbGl0eVNjcmlwdChicm93c2VyLCBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgfVxuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0FjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHMgaXMgbnVsbCcpXG4gICAgICAgIHJldHVybiBbXVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdObyBhY2Nlc3NpYmlsaXR5IHJlc3VsdHMgd2VyZSBmb3VuZC4nKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYGdldEExMXlSZXN1bHRzIEZhaWxlZC4gRXJyb3I6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxufSlcblxuZXhwb3J0IGNvbnN0IGdldEFwcEExMXlSZXN1bHRzID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5BMTFZX0VWRU5UUy5HRVRfUkVTVUxUUywgYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIsICB0ZXN0TmFtZTogc3RyaW5nLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nLCBzZXNzaW9uSWQ/OiBzdHJpbmcgfCBudWxsKSA6IFByb21pc2U8QXJyYXk8eyBba2V5OiBzdHJpbmddOiBhbnk7IH0+PiA9PiB7XG4gICAgaWYgKCFpc0Jyb3dzZXJTdGFja1Nlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIFtdIC8vIHNpbmNlIHdlIGFyZSBydW5uaW5nIG9ubHkgb24gQXV0b21hdGUgYXMgb2Ygbm93XG4gICAgfVxuXG4gICAgaWYgKCFpc0FwcEFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHksIGlzQXBwQXV0b21hdGUpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMgc3VtbWFyeS4nKVxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHtBUElVdGlscy5BUFBfQUxMWV9FTkRQT0lOVH0vJHtBUFBfQUxMWV9JU1NVRVNfRU5EUE9JTlR9YFxuICAgICAgICBjb25zdCBhcGlSZXNwb25lID0gYXdhaXQgZ2V0QXBwQTExeVJlc3VsdFJlc3BvbnNlKGFwaVVybCwgaXNBcHBBdXRvbWF0ZSwgYnJvd3NlciwgdGVzdE5hbWUsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbiwgaXNBY2Nlc3NpYmlsaXR5LCBzZXNzaW9uSWQpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFwaVJlc3BvbmU/LmRhdGE/LmRhdGE/Lmlzc3Vlc1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFBvbGxpbmcgUmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpICB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignTm8gYWNjZXNzaWJpbGl0eSBzdW1tYXJ5IHdhcyBmb3VuZC4nKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYGdldEFwcEExMXlSZXN1bHRzIEZhaWxlZC4gRXJyb3I6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxufSlcblxuZXhwb3J0IGNvbnN0IGdldEFwcEExMXlSZXN1bHRzU3VtbWFyeSA9IFBlcmZvcm1hbmNlVGVzdGVyLm1lYXN1cmVXcmFwcGVyKFBFUkZPUk1BTkNFX1NES19FVkVOVFMuQTExWV9FVkVOVFMuR0VUX1JFU1VMVFNfU1VNTUFSWSwgYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIsIHRlc3ROYW1lOiBzdHJpbmcsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcsIHNlc3Npb25JZD86IHN0cmluZyB8IG51bGwpIDogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IGFueTsgfT4gPT4ge1xuICAgIGlmICghaXNCcm93c2VyU3RhY2tTZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiB7fSAvLyBzaW5jZSB3ZSBhcmUgcnVubmluZyBvbmx5IG9uIEF1dG9tYXRlIGFzIG9mIG5vd1xuICAgIH1cblxuICAgIGlmICghaXNBcHBBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5LCBpc0FwcEF1dG9tYXRlKSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignTm90IGFuIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiBzZXNzaW9uLCBjYW5ub3QgcmV0cmlldmUgQWNjZXNzaWJpbGl0eSByZXN1bHRzIHN1bW1hcnkuJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7QVBJVXRpbHMuQVBQX0FMTFlfRU5EUE9JTlR9LyR7QVBQX0FMTFlfSVNTVUVTX1NVTU1BUllfRU5EUE9JTlR9YFxuICAgICAgICBjb25zdCBhcGlSZXNwb25lID0gYXdhaXQgZ2V0QXBwQTExeVJlc3VsdFJlc3BvbnNlKGFwaVVybCwgaXNBcHBBdXRvbWF0ZSwgYnJvd3NlciwgdGVzdE5hbWUsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbiwgaXNBY2Nlc3NpYmlsaXR5LCBzZXNzaW9uSWQpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFwaVJlc3BvbmU/LmRhdGE/LmRhdGE/LnN1bW1hcnlcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBQb2xsaW5nIFJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdObyBhY2Nlc3NpYmlsaXR5IHN1bW1hcnkgd2FzIGZvdW5kLicpXG4gICAgICAgIHJldHVybiB7fVxuICAgIH1cbn0pXG5cbmNvbnN0IGdldEFwcEExMXlSZXN1bHRSZXNwb25zZSA9IGFzeW5jIChhcGlVcmw6IHN0cmluZywgaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgdGVzdE5hbWU6IHN0cmluZywgaXNCcm93c2VyU3RhY2tTZXNzaW9uPzogYm9vbGVhbiwgaXNBY2Nlc3NpYmlsaXR5PzogYm9vbGVhbiB8IHN0cmluZywgc2Vzc2lvbklkPzogc3RyaW5nIHwgbnVsbCkgOiBQcm9taXNlPFBvbGxpbmdSZXN1bHQ+ID0+IHtcbiAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1BlcmZvcm1pbmcgc2NhbiBiZWZvcmUgZ2V0dGluZyByZXN1bHRzIHN1bW1hcnknKVxuICAgIGF3YWl0IHBlcmZvcm1BMTF5U2Nhbihpc0FwcEF1dG9tYXRlLCBicm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24sIGlzQWNjZXNzaWJpbGl0eSwgdW5kZWZpbmVkLCB0ZXN0TmFtZSlcbiAgICBjb25zdCB1cHBlclRpbWVMaW1pdCA9IHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1BPTExJTkdfVElNRU9VVCA/IERhdGUubm93KCkgKyBwYXJzZUludChwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9QT0xMSU5HX1RJTUVPVVQpICogMTAwMCA6IERhdGUubm93KCkgKyAzMDAwMFxuICAgIGNvbnN0IHBhcmFtcyA9IHsgdGVzdF9ydW5fdXVpZDogcHJvY2Vzcy5lbnYuVEVTVF9BTkFMWVRJQ1NfSUQsIHNlc3Npb25faWQ6IHNlc3Npb25JZCwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0gLy8gUXVlcnkgcGFyYW1zIHRvIHBhc3NcbiAgICBjb25zdCBoZWFkZXIgPSB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1R9YCB9XG4gICAgY29uc3QgYXBpUmVzcG9uZSA9IGF3YWl0IHBvbGxBcGkoYXBpVXJsLCBwYXJhbXMsIGhlYWRlciwgdXBwZXJUaW1lTGltaXQpXG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBQb2xsaW5nIFJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShhcGlSZXNwb25lKX1gKVxuICAgIHJldHVybiBhcGlSZXNwb25lXG59XG5cbmV4cG9ydCBjb25zdCBnZXRBMTF5UmVzdWx0c1N1bW1hcnkgPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLkExMVlfRVZFTlRTLkdFVF9SRVNVTFRTX1NVTU1BUlksIGFzeW5jIChpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nKSA6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBhbnk7IH0+ID0+IHtcblxuICAgIGlmICghaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5KSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignTm90IGFuIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiBzZXNzaW9uLCBjYW5ub3QgcmV0cmlldmUgQWNjZXNzaWJpbGl0eSByZXN1bHRzIHN1bW1hcnkuJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdQZXJmb3JtaW5nIHNjYW4gYmVmb3JlIGdldHRpbmcgcmVzdWx0cyBzdW1tYXJ5JylcbiAgICAgICAgYXdhaXQgcGVyZm9ybUExMXlTY2FuKGlzQXBwQXV0b21hdGUsIGJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbiwgaXNBY2Nlc3NpYmlsaXR5KVxuICAgICAgICBpZiAoQWNjZXNzaWJpbGl0eVNjcmlwdHMuZ2V0UmVzdWx0c1N1bW1hcnkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlSZXN1bHRzOiB7IFtrZXk6IHN0cmluZ106IHVua25vd247IH0gPSBhd2FpdCBleGVjdXRlQWNjZXNzaWJpbGl0eVNjcmlwdChicm93c2VyLCBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzU3VtbWFyeSlcbiAgICAgICAgICAgIHJldHVybiBzdW1tYXJ5UmVzdWx0c1xuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignQWNjZXNzaWJpbGl0eVNjcmlwdHMuZ2V0UmVzdWx0c1N1bW1hcnkgaXMgbnVsbCcpXG4gICAgICAgIHJldHVybiB7fVxuICAgIH0gY2F0Y2gge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ05vIGFjY2Vzc2liaWxpdHkgc3VtbWFyeSB3YXMgZm91bmQuJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxufSlcblxuLyoqXG4gKiBSZW5kZXIgYW4gZXJyb3IgdG9nZXRoZXIgd2l0aCBpdHMgYGNhdXNlYCBjaGFpbi5cbiAqXG4gKiBOb2RlJ3MgbmF0aXZlIGZldGNoIHJlcG9ydHMgZXZlcnkgdHJhbnNwb3J0IGZhaWx1cmUgYXMgdGhlIHNhbWUgb3BhcXVlXG4gKiBgVHlwZUVycm9yOiBmZXRjaCBmYWlsZWRgOyB0aGUgYWN0aW9uYWJsZSBkZXRhaWwgKEVOT1RGT1VORCwgRUNPTk5SRVNFVCwgYSBwcm94eVxuICogcmVmdXNhbCkgb25seSBsaXZlcyBvbiBgZXJyb3IuY2F1c2VgLCB3aGljaCBwbGFpbiBpbnRlcnBvbGF0aW9uIGRyb3BzLiBXaXRob3V0IHRoaXNcbiAqIGEgZmFpbGVkIGJ1aWxkLXN0b3AgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbnkgb3RoZXIgbmV0d29yayBmYXVsdCBpbiB0aGUgbG9ncy5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlc2NyaWJlRXJyb3JXaXRoQ2F1c2UgPSAoZXJyb3I6IHVua25vd24sIGRlcHRoID0gMyk6IHN0cmluZyA9PiB7XG4gICAgaWYgKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhlcnJvcilcbiAgICB9XG4gICAgY29uc3QgZGVzY3JpYmVkID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCA6IFN0cmluZyhlcnJvcilcbiAgICBjb25zdCBjYXVzZSA9IChlcnJvciBhcyB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZVxuICAgIGlmIChjYXVzZSA9PT0gbnVsbCB8fCBjYXVzZSA9PT0gdW5kZWZpbmVkIHx8IGRlcHRoIDw9IDEpIHtcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlZFxuICAgIH1cbiAgICByZXR1cm4gYCR7ZGVzY3JpYmVkfSA8LSBjYXVzZWQgYnkgJHtkZXNjcmliZUVycm9yV2l0aENhdXNlKGNhdXNlLCBkZXB0aCAtIDEpfWBcbn1cblxuZXhwb3J0IGNvbnN0IHN0b3BCdWlsZFVwc3RyZWFtID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5URVNUSFVCX0VWRU5UUy5TVE9QLCBvMTF5RXJyb3JIYW5kbGVyKGFzeW5jIGZ1bmN0aW9uIHN0b3BCdWlsZFVwc3RyZWFtKCkge1xuICAgIGNvbnN0IHN0b3BCdWlsZFVzYWdlID0gVXNhZ2VTdGF0cy5nZXRJbnN0YW5jZSgpLnN0b3BCdWlsZFVzYWdlXG4gICAgc3RvcEJ1aWxkVXNhZ2UudHJpZ2dlcmVkKClcbiAgICBpZiAoIXByb2Nlc3MuZW52W1RFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVl0pIHtcbiAgICAgICAgc3RvcEJ1aWxkVXNhZ2UuZmFpbGVkKCdCdWlsZCBpcyBub3QgY29tcGxldGVkIHlldCcpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiAnQnVpbGQgaXMgbm90IGNvbXBsZXRlZCB5ZXQnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX0pXVF0pIHtcbiAgICAgICAgc3RvcEJ1aWxkVXNhZ2UuZmFpbGVkKCdUb2tlbi9idWlsZElEIGlzIHVuZGVmaW5lZCwgYnVpbGQgY3JlYXRpb24gbWlnaHQgaGF2ZSBmYWlsZWQnKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1tTVE9QX0JVSUxEXSBNaXNzaW5nIEF1dGhlbnRpY2F0aW9uIFRva2VuLyBCdWlsZCBJRCcpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiAnVG9rZW4vYnVpbGRJRCBpcyB1bmRlZmluZWQsIGJ1aWxkIGNyZWF0aW9uIG1pZ2h0IGhhdmUgZmFpbGVkJ1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICAnc3RvcF90aW1lJzogKG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKClcbiAgICB9XG4gICAgLy8gU3RhbXAgdGhlIGtpbGwgcmVhc29uIG9udG8gdGhlIGJ1aWxkIHJlY29yZCBzbyB0ZXJtaW5hdGVkIHJ1bnMgYXJlXG4gICAgLy8gaWRlbnRpZmlhYmxlIHNlcnZlci1zaWRlLCBub3Qgb25seSB2aWEgdGhlIGFuYWx5dGljcyBmdW5uZWwuXG4gICAgY29uc3Qga2lsbFNpZ25hbCA9IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19LSUxMX1NJR05BTF1cbiAgICBpZiAoa2lsbFNpZ25hbCkge1xuICAgICAgICBkYXRhLmZpbmlzaGVkX21ldGFkYXRhID0gW3sgcmVhc29uOiAndXNlcl9raWxsZWQnLCBzaWduYWw6IGtpbGxTaWduYWwgfV1cbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHtBUElVdGlscy5EQVRBX0VORFBPSU5UfS9hcGkvdjEvYnVpbGRzLyR7cHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF19L3N0b3BgXG4gICAgLy8gU0RLLTcwNjE6IHRoZSBidWlsZC1zdG9wIFBVVCBpcyB0aGUgc2lnbmFsIHRoYXQgY2xvc2VzIHRoZSBUUkEgYnVpbGQuIEEgc2luZ2xlXG4gICAgLy8gYmVzdC1lZmZvcnQgcmVxdWVzdCBtZWFucyBhIHRyYW5zaWVudCBmYWlsdXJlL3RpbWVvdXQgbGVhdmVzIHRoZSBidWlsZCBydW5uaW5nXG4gICAgLy8gdW50aWwgdGhlIH42MC1taW4gc2VydmVyLXNpZGUgaW5hY3Rpdml0eSB0aW1lb3V0LiBSZXRyeSB3aXRoIGJhY2tvZmYgYW5kIHRyZWF0IGFcbiAgICAvLyBub24tMnh4IHJlc3BvbnNlIGFzIGEgZmFpbHVyZSBzbyB0aGUgYnVpbGQgcmVsaWFibHkgcmVhY2hlcyBhIHRlcm1pbmFsIHN0YXRlLlxuICAgIC8vIFNESy03MjI5OiBhIGNvcnBvcmF0ZSBETlMvcHJveHkgYmxpcCByb3V0aW5lbHkgb3V0bGFzdHMgYSBzdWItc2Vjb25kIHJldHJ5IHdpbmRvdyxcbiAgICAvLyBhbmQgdGhlIHJlcXVlc3QgaGFkIG5vIHRpbWVvdXQgYXQgYWxsLCBzbyBhIGh1bmcgY29ubmVjdGlvbiBjb3VsZCBzdGFsbCBzaHV0ZG93blxuICAgIC8vIGluZGVmaW5pdGVseS4gRWFjaCBhdHRlbXB0IGlzIG5vdyBpbmRpdmlkdWFsbHkgYm91bmRlZCwgYW5kIHRoZSByZXRyeSBsb29wIGFzIGFcbiAgICAvLyB3aG9sZSBpcyBjYXBwZWQgYnkgYSB3YWxsLWNsb2NrIGRlYWRsaW5lICh0aGlzIHJ1bnMgZHVyaW5nIHNodXRkb3duKS5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBTVE9QX0JVSUxEX1RPVEFMX0JVREdFVF9NU1xuICAgIGxldCBsYXN0RXJyb3I6IHVua25vd25cbiAgICBsZXQgYXR0ZW1wdHMgPSAwXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gU1RPUF9CVUlMRF9NQVhfQVRURU1QVFM7IGF0dGVtcHQrKykge1xuICAgICAgICBjb25zdCBidWRnZXRMZWZ0ID0gZGVhZGxpbmUgLSBEYXRlLm5vdygpXG4gICAgICAgIGlmIChidWRnZXRMZWZ0IDw9IDApIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgYXR0ZW1wdHMgPSBhdHRlbXB0XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIE1hdGgubWluKFNUT1BfQlVJTERfQVRURU1QVF9USU1FT1VUX01TLCBidWRnZXRMZWZ0KSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7cHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXX1gXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtTVE9QX0JVSUxEXSBTdWNjZXNzIHJlc3BvbnNlOiAke2F3YWl0IHJlc3BvbnNlLnRleHQoKX1gKVxuICAgICAgICAgICAgc3RvcEJ1aWxkVXNhZ2Uuc3VjY2VzcygpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAvLyBBbiBhYm9ydGVkIGF0dGVtcHQgc3VyZmFjZXMgYXMgYSBnZW5lcmljIEFib3J0RXJyb3I7IG5hbWUgdGhlIHJlYWwgcmVhc29uIHNvXG4gICAgICAgICAgICAvLyBhIHNsb3cgZW5kcG9pbnQgaXMgbm90IG1pc3Rha2VuIGZvciBhbiBvdXRyaWdodCB0cmFuc3BvcnQgZmFpbHVyZS5cbiAgICAgICAgICAgIGxhc3RFcnJvciA9IGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWRcbiAgICAgICAgICAgICAgICA/IG5ldyBFcnJvcihgYnVpbGQgc3RvcCByZXF1ZXN0IHRpbWVkIG91dCBhZnRlciAke01hdGgubWluKFNUT1BfQlVJTERfQVRURU1QVF9USU1FT1VUX01TLCBidWRnZXRMZWZ0KX1tc2ApXG4gICAgICAgICAgICAgICAgOiBlcnJvclxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbU1RPUF9CVUlMRF0gQXR0ZW1wdCAke2F0dGVtcHR9LyR7U1RPUF9CVUlMRF9NQVhfQVRURU1QVFN9IGZhaWxlZC4gRXJyb3I6ICR7ZGVzY3JpYmVFcnJvcldpdGhDYXVzZShsYXN0RXJyb3IpfWApXG4gICAgICAgICAgICBjb25zdCBiYWNrb2ZmID0gU1RPUF9CVUlMRF9CQUNLT0ZGX0JBU0VfTVMgKiBNYXRoLnBvdygyLCBhdHRlbXB0IC0gMSlcbiAgICAgICAgICAgIGlmIChhdHRlbXB0ID49IFNUT1BfQlVJTERfTUFYX0FUVEVNUFRTIHx8IERhdGUubm93KCkgKyBiYWNrb2ZmID49IGRlYWRsaW5lKSB7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGJhY2tvZmYpKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wQnVpbGRVc2FnZS5mYWlsZWQobGFzdEVycm9yKVxuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1NUT1BfQlVJTERdIEZhaWxlZCBhZnRlciAke2F0dGVtcHRzfSBhdHRlbXB0KHMpLiBFcnJvcjogJHtkZXNjcmliZUVycm9yV2l0aENhdXNlKGxhc3RFcnJvcil9YClcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6IChsYXN0RXJyb3IgYXMgRXJyb3IpPy5tZXNzYWdlID8/ICdzdG9wIGJ1aWxkIGZhaWxlZCdcbiAgICB9XG59KSlcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENpSW5mbyAoKSB7XG4gICAgY29uc3QgZW52ID0gcHJvY2Vzcy5lbnZcbiAgICAvLyBKZW5raW5zXG4gICAgaWYgKCh0eXBlb2YgZW52LkpFTktJTlNfVVJMID09PSAnc3RyaW5nJyAmJiBlbnYuSkVOS0lOU19VUkwubGVuZ3RoID4gMCkgfHwgKHR5cGVvZiBlbnYuSkVOS0lOU19IT01FID09PSAnc3RyaW5nJyAmJiBlbnYuSkVOS0lOU19IT01FLmxlbmd0aCA+IDApKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnSmVua2lucycsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkpPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2lyY2xlQ0lcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgaXNUcnVlKGVudi5DSVJDTEVDSSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdDaXJjbGVDSScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5DSVJDTEVfQlVJTERfVVJMLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5DSVJDTEVfSk9CLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ0lSQ0xFX0JVSUxEX05VTVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyYXZpcyBDSVxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LlRSQVZJUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdUcmF2aXMgQ0knLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuVFJBVklTX0JVSUxEX1dFQl9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlRSQVZJU19KT0JfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LlRSQVZJU19CVUlMRF9OVU1CRVJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb2Rlc2hpcFxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBlbnYuQ0lfTkFNRSA9PT0gJ2NvZGVzaGlwJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0NvZGVzaGlwJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBudWxsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQml0YnVja2V0XG4gICAgaWYgKGVudi5CSVRCVUNLRVRfQlJBTkNIICYmIGVudi5CSVRCVUNLRVRfQ09NTUlUKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQml0YnVja2V0JyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkJJVEJVQ0tFVF9HSVRfSFRUUF9PUklHSU4sXG4gICAgICAgICAgICBqb2JfbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJJVEJVQ0tFVF9CVUlMRF9OVU1CRVJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBEcm9uZVxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LkRST05FKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0Ryb25lJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkRST05FX0JVSUxEX0xJTkssXG4gICAgICAgICAgICBqb2JfbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkRST05FX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNlbWFwaG9yZVxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LlNFTUFQSE9SRSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdTZW1hcGhvcmUnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuU0VNQVBIT1JFX09SR0FOSVpBVElPTl9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlNFTUFQSE9SRV9KT0JfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LlNFTUFQSE9SRV9KT0JfSURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBHaXRMYWJcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgaXNUcnVlKGVudi5HSVRMQUJfQ0kpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnR2l0TGFiJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkNJX0pPQl9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkNJX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ0lfSk9CX0lEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQnVpbGRraXRlXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuQlVJTERLSVRFKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0J1aWxka2l0ZScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5CVUlMREtJVEVfQlVJTERfVVJMLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5CVUlMREtJVEVfTEFCRUwgfHwgZW52LkJVSUxES0lURV9QSVBFTElORV9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERLSVRFX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFZpc3VhbCBTdHVkaW8gVGVhbSBTZXJ2aWNlc1xuICAgIGlmIChpc1RydWUoZW52LlRGX0JVSUxEKSAmJiBlbnYuVEZfQlVJTERfQlVJTEROVU1CRVIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdWaXN1YWwgU3R1ZGlvIFRlYW0gU2VydmljZXMnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBgJHtlbnYuU1lTVEVNX1RFQU1GT1VOREFUSU9OU0VSVkVSVVJJfSR7ZW52LlNZU1RFTV9URUFNUFJPSkVDVElEfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlNZU1RFTV9ERUZJTklUSU9OSUQsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9CVUlMRElEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQXBwdmV5b3JcbiAgICBpZiAoaXNUcnVlKGVudi5BUFBWRVlPUikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdBcHB2ZXlvcicsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5BUFBWRVlPUl9VUkx9L3Byb2plY3QvJHtlbnYuQVBQVkVZT1JfQUNDT1VOVF9OQU1FfS8ke2Vudi5BUFBWRVlPUl9QUk9KRUNUX1NMVUd9L2J1aWxkcy8ke2Vudi5BUFBWRVlPUl9CVUlMRF9JRH1gLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5BUFBWRVlPUl9KT0JfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkFQUFZFWU9SX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEF6dXJlIENJXG4gICAgaWYgKGVudi5BWlVSRV9IVFRQX1VTRVJfQUdFTlQgJiYgZW52LlRGX0JVSUxEKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQXp1cmUgQ0knLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBgJHtlbnYuU1lTVEVNX1RFQU1GT1VOREFUSU9OU0VSVkVSVVJJfSR7ZW52LlNZU1RFTV9URUFNUFJPSkVDVElEfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkJVSUxEX0JVSUxESUQsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9CVUlMRElEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQVdTIENvZGVCdWlsZFxuICAgIGlmIChlbnYuQ09ERUJVSUxEX0JVSUxEX0lEIHx8IGVudi5DT0RFQlVJTERfUkVTT0xWRURfU09VUkNFX1ZFUlNJT04gfHwgZW52LkNPREVCVUlMRF9TT1VSQ0VfVkVSU0lPTikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0FXUyBDb2RlQnVpbGQnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQ09ERUJVSUxEX1BVQkxJQ19CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkNPREVCVUlMRF9CVUlMRF9JRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkNPREVCVUlMRF9CVUlMRF9JRFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEJhbWJvb1xuICAgIGlmIChlbnYuYmFtYm9vX2J1aWxkTnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQmFtYm9vJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LmJhbWJvb19idWlsZFJlc3VsdHNVcmwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LmJhbWJvb19zaG9ydEpvYk5hbWUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5iYW1ib29fYnVpbGROdW1iZXJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBXZXJja2VyXG4gICAgaWYgKGVudi5XRVJDS0VSIHx8IGVudi5XRVJDS0VSX01BSU5fUElQRUxJTkVfU1RBUlRFRCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1dlcmNrZXInLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuV0VSQ0tFUl9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LldFUkNLRVJfTUFJTl9QSVBFTElORV9TVEFSVEVEID8gJ01haW4gUGlwZWxpbmUnIDogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LldFUkNLRVJfR0lUX0NPTU1JVFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEdvb2dsZSBDbG91ZFxuICAgIGlmIChlbnYuR0NQX1BST0pFQ1QgfHwgZW52LkdDTE9VRF9QUk9KRUNUIHx8IGVudi5HT09HTEVfQ0xPVURfUFJPSkVDVCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0dvb2dsZSBDbG91ZCcsXG4gICAgICAgICAgICBidWlsZF91cmw6IG51bGwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlBST0pFQ1RfSUQsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9JRCxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTaGlwcGFibGVcbiAgICBpZiAoZW52LlNISVBQQUJMRSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1NoaXBwYWJsZScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5TSElQUEFCTEVfQlVJTERfVVJMLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5TSElQUEFCTEVfSk9CX0lEID8gYEpvYiAjJHtlbnYuU0hJUFBBQkxFX0pPQl9JRH1gIDogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LlNISVBQQUJMRV9CVUlMRF9OVU1CRVJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBOZXRsaWZ5XG4gICAgaWYgKGlzVHJ1ZShlbnYuTkVUTElGWSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdOZXRsaWZ5JyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkRFUExPWV9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlNJVEVfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0lEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR2l0aHViIEFjdGlvbnNcbiAgICBpZiAoaXNUcnVlKGVudi5HSVRIVUJfQUNUSU9OUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdHaXRIdWIgQWN0aW9ucycsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5HSVRIVUJfU0VSVkVSX1VSTH0vJHtlbnYuR0lUSFVCX1JFUE9TSVRPUll9L2FjdGlvbnMvcnVucy8ke2Vudi5HSVRIVUJfUlVOX0lEfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkdJVEhVQl9XT1JLRkxPVyxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkdJVEhVQl9SVU5fSUQsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVmVyY2VsXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGVudi5WRVJDRUwgPT09ICcxJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1ZlcmNlbCcsXG4gICAgICAgICAgICBidWlsZF91cmw6IGBodHRwOi8vJHtlbnYuVkVSQ0VMX1VSTH1gLFxuICAgICAgICAgICAgam9iX25hbWU6IG51bGwsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IG51bGwsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVGVhbWNpdHlcbiAgICBpZiAoZW52LlRFQU1DSVRZX1ZFUlNJT04pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdUZWFtY2l0eScsXG4gICAgICAgICAgICBidWlsZF91cmw6IG51bGwsXG4gICAgICAgICAgICBqb2JfbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX05VTUJFUixcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb25jb3Vyc2VcbiAgICBpZiAoZW52LkNPTkNPVVJTRSB8fCBlbnYuQ09OQ09VUlNFX1VSTCB8fCBlbnYuQ09OQ09VUlNFX1VTRVJOQU1FIHx8IGVudi5DT05DT1VSU0VfVEVBTSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0NvbmNvdXJzZScsXG4gICAgICAgICAgICBidWlsZF91cmw6IG51bGwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkJVSUxEX0pPQl9OQU1FIHx8IG51bGwsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9JRCB8fCBudWxsLFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEdvQ0RcbiAgICBpZiAoZW52LkdPX0pPQl9OQU1FKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnR29DRCcsXG4gICAgICAgICAgICBidWlsZF91cmw6IG51bGwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkdPX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuR09fUElQRUxJTkVfQ09VTlRFUixcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb2RlRnJlc2hcbiAgICBpZiAoZW52LkNGX0JVSUxEX0lEKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQ29kZUZyZXNoJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkNGX0JVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQ0ZfUElQRUxJTkVfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkNGX0JVSUxEX0lELFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGlmIG5vIG1hdGNoZXMsIHJldHVybiBudWxsXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEdpdE1ldGFEYXRhICgpIHtcbiAgICBjb25zdCBpbmZvOiBHaXRSZXBvSW5mbyA9IGdpdFJlcG9JbmZvKClcbiAgICBpZiAoIWluZm8uY29tbW9uR2l0RGlyKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCB7IHJlbW90ZSB9ID0gYXdhaXQgcEdpdGNvbmZpZyhpbmZvLmNvbW1vbkdpdERpcilcbiAgICBjb25zdCByZW1vdGVzID0gcmVtb3RlID8gT2JqZWN0LmtleXMocmVtb3RlKS5tYXAocmVtb3RlTmFtZSA9PiAgKHsgbmFtZTogcmVtb3RlTmFtZSwgdXJsOiByZW1vdGVbcmVtb3RlTmFtZV0udXJsIH0pKSA6IFtdXG5cbiAgICBsZXQgZ2l0TWV0YURhdGEgOiBHaXRNZXRhRGF0YSA9IHtcbiAgICAgICAgbmFtZTogJ2dpdCcsXG4gICAgICAgIHNoYTogaW5mby5zaGEsXG4gICAgICAgIHNob3J0X3NoYTogaW5mby5hYmJyZXZpYXRlZFNoYSxcbiAgICAgICAgYnJhbmNoOiBpbmZvLmJyYW5jaCxcbiAgICAgICAgdGFnOiBpbmZvLnRhZyxcbiAgICAgICAgY29tbWl0dGVyOiBpbmZvLmNvbW1pdHRlcixcbiAgICAgICAgY29tbWl0dGVyX2RhdGU6IGluZm8uY29tbWl0dGVyRGF0ZSxcbiAgICAgICAgYXV0aG9yOiBpbmZvLmF1dGhvcixcbiAgICAgICAgYXV0aG9yX2RhdGU6IGluZm8uYXV0aG9yRGF0ZSxcbiAgICAgICAgY29tbWl0X21lc3NhZ2U6IGluZm8uY29tbWl0TWVzc2FnZSxcbiAgICAgICAgcm9vdDogaW5mby5yb290LFxuICAgICAgICBjb21tb25fZ2l0X2RpcjogaW5mby5jb21tb25HaXREaXIsXG4gICAgICAgIHdvcmt0cmVlX2dpdF9kaXI6IGluZm8ud29ya3RyZWVHaXREaXIsXG4gICAgICAgIGxhc3RfdGFnOiBpbmZvLmxhc3RUYWcsXG4gICAgICAgIGNvbW1pdHNfc2luY2VfbGFzdF90YWc6IGluZm8uY29tbWl0c1NpbmNlTGFzdFRhZyxcbiAgICAgICAgcmVtb3RlczogcmVtb3Rlc1xuICAgIH1cblxuICAgIGdpdE1ldGFEYXRhID0gY2hlY2tBbmRUcnVuY2F0ZVZDU0luZm8oZ2l0TWV0YURhdGEpXG5cbiAgICByZXR1cm4gZ2l0TWV0YURhdGFcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXF1ZUlkZW50aWZpZXIodGVzdDogRnJhbWV3b3Jrcy5UZXN0LCBmcmFtZXdvcms/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChmcmFtZXdvcmsgPT09ICdqYXNtaW5lJykge1xuICAgICAgICByZXR1cm4gdGVzdC5mdWxsTmFtZVxuICAgIH1cblxuICAgIGxldCBwYXJlbnRUaXRsZSA9IHRlc3QucGFyZW50XG4gICAgLy8gU29tZXRpbWVzIHBhcmVudCB3aWxsIGJlIGFuIG9iamVjdCBpbnN0ZWFkIG9mIGEgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBwYXJlbnRUaXRsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcGFyZW50VGl0bGUgPSAocGFyZW50VGl0bGUgYXMgeyB0aXRsZTogc3RyaW5nIH0pLnRpdGxlXG4gICAgfVxuICAgIHJldHVybiBgJHtwYXJlbnRUaXRsZX0gLSAke3Rlc3QudGl0bGV9YFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pcXVlSWRlbnRpZmllckZvckN1Y3VtYmVyKHdvcmxkOiBJVGVzdENhc2VIb29rUGFyYW1ldGVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gd29ybGQucGlja2xlLnVyaSArICdfJyArIHdvcmxkLnBpY2tsZS5hc3ROb2RlSWRzLmpvaW4oJywnKVxufVxuXG4vLyBMb2FkIFRlc3RpbmcgU2VydmljZSAoTFRTKSBnYXRpbmcgaGVscGVycyBcdTIwMTQgbWlycm9yIG9mIGJzdGFja191dGlscy9oZWxwZXIucHlcbi8vIGlzX2xvYWRfdGVzdGluZ19zZXNzaW9uKCkgLyBnZXRfbHRzX3Nlc3Npb25faWQoKSBpbiBicm93c2Vyc3RhY2stcHl0aG9uLXNka1xuLy8gKGJyYW5jaCBMVFMtdHJhLXB5dGhvbi1zdXBwb3J0KS4gTFRTIHBvZC1pdGVyYXRpb25zIGV4cG9ydFxuLy8gQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEIGJlZm9yZSBpbnZva2luZyB0aGUgdGVzdCBydW5uZXI7IHByZXNlbmNlIG9mXG4vLyB0aGF0IGVudiB2YXIgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIFwidGhpcyBydW4gaXMgYW4gTFRTIHBvZFxuLy8gaXRlcmF0aW9uXCIuIE9wdGlvbmFsIEJST1dTRVJTVEFDS19MVFM9dHJ1ZXwxIGxldHMgdGhlIHJ1bm5lciBvcHQtaW4gd2l0aG91dFxuLy8gc3VwcGx5aW5nIGEgc2Vzc2lvbiBpZCAodXNlZnVsIGZvciBsb2NhbCByZXBybykuXG5leHBvcnQgZnVuY3Rpb24gaXNMb2FkVGVzdGluZ1Nlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRF0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgY29uc3QgZmxhZyA9IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19MVFNdXG4gICAgcmV0dXJuIGZsYWcgPT09ICd0cnVlJyB8fCBmbGFnID09PSAnMSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEx0c1Nlc3Npb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSURdIHx8ICcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbG91ZFByb3ZpZGVyKGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIgfCBXZWJkcml2ZXJJTy5NdWx0aVJlbW90ZUJyb3dzZXIpOiBzdHJpbmcge1xuICAgIC8vIE5PVEU6IGRvIE5PVCBicmFuY2ggb24gaXNMb2FkVGVzdGluZ1Nlc3Npb24oKSBoZXJlLiBnZXRDbG91ZFByb3ZpZGVyIGlzXG4gICAgLy8gc2hhcmVkIHdpdGggQXV0b21hdGUtc2lkZSBndWFyZHMgKGF1dG9tYXRlTW9kdWxlIG9uQmVmb3JlL29uQWZ0ZXJUZXN0LFxuICAgIC8vIHdlYmRyaXZlcklPTW9kdWxlIEtFWV9JU19CUk9XU0VSU1RBQ0tfSFVCLCBhY2Nlc3NpYmlsaXR5LWhhbmRsZXIsXG4gICAgLy8gc2VydmljZS50cykgXHUyMDE0IGZsaXBwaW5nIGl0IHRvICdicm93c2Vyc3RhY2snIHVuZGVyIExUUyB3b3VsZCBtYWtlXG4gICAgLy8gaXNCcm93c2Vyc3RhY2tTZXNzaW9uKCkgcmV0dXJuIHRydWUgZm9yIGxvY2FsLVNlbGVuaXVtIHBvZCBzZXNzaW9ucyxcbiAgICAvLyBjYXVzaW5nIG1hcmtTZXNzaW9uTmFtZSAvIG1hcmtTZXNzaW9uU3RhdHVzIHRvIFBVVCBhZ2FpbnN0IEF1dG9tYXRlXG4gICAgLy8gUkVTVCBBUElzIHdpdGggc2Vzc2lvbiBpZHMgdGhhdCBkb24ndCBleGlzdCB0aGVyZS4gVGVzdEh1Yi1yZXBvcnRpbmdcbiAgICAvLyBjYWxsZXJzIHRoYXQgbmVlZCAnYnJvd3NlcnN0YWNrJyB1bmRlciBMVFMgZGVyaXZlIGl0IGxvY2FsbHkgd2l0aFxuICAgIC8vIGBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpID8gJ2Jyb3dzZXJzdGFjaycgOiBnZXRDbG91ZFByb3ZpZGVyKGJyb3dzZXIpYFxuICAgIC8vIChzZWUgcmVwb3J0ZXIudHMsIGluc2lnaHRzLWhhbmRsZXIudHMpLlxuICAgIGlmIChicm93c2VyICYmICdpbnN0YW5jZXMnIGluIGJyb3dzZXIpIHtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBpbnN0YW5jZXNcbiAgICAgICAgZm9yIChjb25zdCBpbnN0YW5jZU5hbWUgb2YgYnJvd3Nlci5pbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gKGJyb3dzZXIgYXMgYW55KVtpbnN0YW5jZU5hbWVdIGFzIFdlYmRyaXZlcklPLkJyb3dzZXJcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZS5vcHRpb25zICYmIGluc3RhbmNlLm9wdGlvbnMuaG9zdG5hbWUgJiYgaW5zdGFuY2Uub3B0aW9ucy5ob3N0bmFtZS5pbmNsdWRlcygnYnJvd3NlcnN0YWNrJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Jyb3dzZXJzdGFjaydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYnJvd3Nlci5vcHRpb25zICYmIGJyb3dzZXIub3B0aW9ucy5ob3N0bmFtZSAmJiBicm93c2VyLm9wdGlvbnMuaG9zdG5hbWUuaW5jbHVkZXMoJ2Jyb3dzZXJzdGFjaycpKSB7IC8vIFNpbmdsZSBicm93c2VyIGluc3RhbmNlXG4gICAgICAgIHJldHVybiAnYnJvd3NlcnN0YWNrJ1xuICAgIH1cbiAgICByZXR1cm4gJ3Vua25vd25fZ3JpZCdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcnN0YWNrU2Vzc2lvbihicm93c2VyPzogV2ViZHJpdmVySU8uQnJvd3NlciB8IFdlYmRyaXZlcklPLk11bHRpUmVtb3RlQnJvd3Nlcikge1xuICAgIHJldHVybiBicm93c2VyICYmIGdldENsb3VkUHJvdmlkZXIoYnJvd3NlcikudG9Mb3dlckNhc2UoKSA9PT0gJ2Jyb3dzZXJzdGFjaydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjZW5hcmlvRXhhbXBsZXMod29ybGQ6IElUZXN0Q2FzZUhvb2tQYXJhbWV0ZXIpIHtcbiAgICBjb25zdCBzY2VuYXJpbyA9IHdvcmxkLnBpY2tsZVxuXG4gICAgLy8gbm8gZXhhbXBsZXMgcHJlc2VudFxuICAgIGlmICgoc2NlbmFyaW8uYXN0Tm9kZUlkcyAmJiBzY2VuYXJpby5hc3ROb2RlSWRzLmxlbmd0aCA8PSAxKSB8fCBzY2VuYXJpby5hc3ROb2RlSWRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGlja2xlSWQ6IHN0cmluZyA9IHNjZW5hcmlvLmFzdE5vZGVJZHNbMF1cbiAgICBjb25zdCBleGFtcGxlc0lkOiBzdHJpbmcgPSBzY2VuYXJpby5hc3ROb2RlSWRzWzFdXG4gICAgY29uc3QgZ2hlcmtpbkRvY3VtZW50Q2hpbGRyZW4gPSB3b3JsZC5naGVya2luRG9jdW1lbnQuZmVhdHVyZT8uY2hpbGRyZW5cblxuICAgIGxldCBleGFtcGxlczogc3RyaW5nW10gPSBbXVxuXG4gICAgZ2hlcmtpbkRvY3VtZW50Q2hpbGRyZW4/LmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICBpZiAoY2hpbGQucnVsZSkge1xuICAgICAgICAgICAgLy8gaGFuZGxlIGlmIHJ1bGUgaXMgcHJlc2VudFxuICAgICAgICAgICAgY2hpbGQucnVsZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkTGV2ZWwyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRMZXZlbDIuc2NlbmFyaW8gJiYgY2hpbGRMZXZlbDIuc2NlbmFyaW8uaWQgPT09IHBpY2tsZUlkICYmIGNoaWxkTGV2ZWwyLnNjZW5hcmlvLmV4YW1wbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3NlZEV4YW1wbGVzID0gY2hpbGRMZXZlbDIuc2NlbmFyaW8uZXhhbXBsZXMuZmxhdE1hcCgodmFsKSA9PiAodmFsLnRhYmxlQm9keSkpLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGV4YW1wbGVzSWQpPy5jZWxscy5tYXAoKHZhbCkgPT4gKHZhbC52YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWRFeGFtcGxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZXMgPSBwYXNzZWRFeGFtcGxlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5zY2VuYXJpbyAmJiBjaGlsZC5zY2VuYXJpby5pZCA9PT0gcGlja2xlSWQgJiYgY2hpbGQuc2NlbmFyaW8uZXhhbXBsZXMpIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBpZiBzY2VuYXJpbyBvdXRzaWRlIHJ1bGVcbiAgICAgICAgICAgIGNvbnN0IHBhc3NlZEV4YW1wbGVzID0gY2hpbGQuc2NlbmFyaW8uZXhhbXBsZXMuZmxhdE1hcCgodmFsKSA9PiAodmFsLnRhYmxlQm9keSkpLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGV4YW1wbGVzSWQpPy5jZWxscy5tYXAoKHZhbCkgPT4gKHZhbC52YWx1ZSkpXG4gICAgICAgICAgICBpZiAocGFzc2VkRXhhbXBsZXMpIHtcbiAgICAgICAgICAgICAgICBleGFtcGxlcyA9IHBhc3NlZEV4YW1wbGVzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKGV4YW1wbGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZXhhbXBsZXNcbiAgICB9XG4gICAgcmV0dXJuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBbnNpQ29sb3JzKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjk0OTc2ODBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuICAgIHJldHVybiBtZXNzYWdlLnJlcGxhY2UoL1tcXHUwMDFiXFx1MDA5Yl1bWygpIzs/XSooPzpbMC05XXsxLDR9KD86O1swLTldezAsNH0pKik/WzAtOUEtT1JaY2YtbnFyeT0+PF0vZywgJycpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2dUYWcoZXZlbnRUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChldmVudFR5cGUgPT09ICdUZXN0UnVuU3RhcnRlZCcgfHwgZXZlbnRUeXBlID09PSAnVGVzdFJ1bkZpbmlzaGVkJykge1xuICAgICAgICByZXR1cm4gJ1Rlc3RfVXBsb2FkJ1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnSG9va1J1blN0YXJ0ZWQnIHx8IGV2ZW50VHlwZSA9PT0gJ0hvb2tSdW5GaW5pc2hlZCcpIHtcbiAgICAgICAgcmV0dXJuICdIb29rX1VwbG9hZCdcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ1NjcmVlbnNob3RDcmVhdGVkJykge1xuICAgICAgICByZXR1cm4gJ1NjcmVlbnNob3RfVXBsb2FkJ1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnTG9nQ3JlYXRlZCcpIHtcbiAgICAgICAgcmV0dXJuICdMb2dfVXBsb2FkJ1xuICAgIH1cbiAgICByZXR1cm4gJ3VuZGVmaW5lZCdcbn1cblxuLy8gZ2V0IGhpZXJhcmNoeSBmb3IgYSBwYXJ0aWN1bGFyIHRlc3QgKGNhbGxlZCBieSByZXBvcnRlciBmb3Igc2tpcHBlZCB0ZXN0cylcbmV4cG9ydCBmdW5jdGlvbiBnZXRIaWVyYXJjaHkoZnVsbFRpdGxlPzogc3RyaW5nKSB7XG4gICAgaWYgKCFmdWxsVGl0bGUpIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICAgIHJldHVybiBmdWxsVGl0bGUuc3BsaXQoJy4nKS5zbGljZSgwLCAtMSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhvb2tUeXBlIChob29rTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoaG9va05hbWUuc3RhcnRzV2l0aCgnXCJiZWZvcmUgZWFjaFwiJykpIHtcbiAgICAgICAgcmV0dXJuICdCRUZPUkVfRUFDSCdcbiAgICB9IGVsc2UgaWYgKGhvb2tOYW1lLnN0YXJ0c1dpdGgoJ1wiYmVmb3JlIGFsbFwiJykpIHtcbiAgICAgICAgcmV0dXJuICdCRUZPUkVfQUxMJ1xuICAgIH0gZWxzZSBpZiAoaG9va05hbWUuc3RhcnRzV2l0aCgnXCJhZnRlciBlYWNoXCInKSkge1xuICAgICAgICByZXR1cm4gJ0FGVEVSX0VBQ0gnXG4gICAgfSBlbHNlIGlmIChob29rTmFtZS5zdGFydHNXaXRoKCdcImFmdGVyIGFsbFwiJykpIHtcbiAgICAgICAgcmV0dXJuICdBRlRFUl9BTEwnXG4gICAgfVxuICAgIHJldHVybiAndW5rbm93bidcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NyZWVuc2hvdENvbW1hbmQgKGFyZ3M6IEJlZm9yZUNvbW1hbmRBcmdzIHwgQWZ0ZXJDb21tYW5kQXJncykge1xuICAgIHJldHVybiBhcmdzLmVuZHBvaW50ICYmIGFyZ3MuZW5kcG9pbnQuaW5jbHVkZXMoJy9zY3JlZW5zaG90Jylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQlN0YWNrU2Vzc2lvbihjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnVzZXIgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBjb25maWcua2V5ID09PSAnc3RyaW5nJyAmJiBjb25maWcua2V5Lmxlbmd0aCA9PT0gMjApIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Jyb3dzZXJzdGFja0luZnJhKGNvbmZpZzogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBjYXBzPzogQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIC8vIHRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBiYXNpYyBzZXNzaW9uIG9yIG11bHRpIHJlbW90ZSBzZXNzaW9uIGlzIHJ1bm5pbmcgb24gQnJvd3NlcnN0YWNrLCBtYWlubHkgYnkgY2hlY2tpbmcgdGhlIGhvc3RuYW1lIHBhcmFtZXRlciBpbiB0aGUgZ2l2ZW4gY29uZmlnXG4gICAgLy8gSW4gY2FzZSBob3N0bmFtZSBpcyBub3QgcHJlc2VudCBhbnl3aGVyZSBpbiB0aGUgY29uZmlnLCBpdCByZXR1cm5zIHRydWUgYnkgZGVmYXVsdCBhcyBob3N0bmFtZSBpcyBub3QgYSBtYW5kYXRvcnkgcGFyYW1ldGVyIGluIHRoZSBjb25maWdcblxuICAgIGNvbnN0IGlzQnJvd3NlcnN0YWNrID0gKHN0cjogc3RyaW5nICk6IGJvb2xlYW4gPT4ge1xuICAgICAgICByZXR1cm4gc3RyID09PSAnYnJvd3NlcnN0YWNrLmNvbScgfHwgc3RyLmVuZHNXaXRoKCcuYnJvd3NlcnN0YWNrLmNvbScpXG4gICAgfVxuXG4gICAgaWYgKChjb25maWcuaG9zdG5hbWUpICYmICFpc0Jyb3dzZXJzdGFjayhjb25maWcuaG9zdG5hbWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChjYXBzICYmIHR5cGVvZiBjYXBzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjYXBzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIGNhcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoKChjYXBhYmlsaXR5IGFzIE9wdGlvbnMuVGVzdHJ1bm5lcikuaG9zdG5hbWUpICYmICFpc0Jyb3dzZXJzdGFjaygoY2FwYWJpbGl0eSBhcyBPcHRpb25zLlRlc3RydW5uZXIpLmhvc3RuYW1lIGFzIHN0cmluZykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY2Fwcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBjYXBzW2tleSBhcyBrZXlvZiBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzXVxuICAgICAgICAgICAgICAgIGlmICgoKGNhcGFiaWxpdHkgYXMgT3B0aW9ucy5UZXN0cnVubmVyKS5ob3N0bmFtZSkgJiYgIWlzQnJvd3NlcnN0YWNrKChjYXBhYmlsaXR5IGFzIE9wdGlvbnMuVGVzdHJ1bm5lcikuaG9zdG5hbWUgYXMgc3RyaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWlzQlN0YWNrU2Vzc2lvbihjb25maWcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyU3RhY2tVc2VyQW5kS2V5KGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLCBvcHRpb25zOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcblxuICAgIC8vIEZhbGxiYWNrIDE6IEVudiB2YXJpYWJsZXNcbiAgICAvLyBGYWxsYmFjayAyOiBTZXJ2aWNlIHZhcmlhYmxlcyBpbiB3ZGlvLmNvbmYuanMgKHRoYXQgYXJlIHJlY2VpdmVkIGluc2lkZSBvcHRpb25zIG9iamVjdClcbiAgICBjb25zdCBlbnZPclNlcnZpY2VWYXJpYWJsZXMgPSB7XG4gICAgICAgIHVzZXI6IGdldEJyb3dzZXJTdGFja1VzZXIob3B0aW9ucyksXG4gICAgICAgIGtleTogZ2V0QnJvd3NlclN0YWNrS2V5KG9wdGlvbnMpXG4gICAgfVxuICAgIGlmIChlbnZPclNlcnZpY2VWYXJpYWJsZXMudXNlciAmJiBlbnZPclNlcnZpY2VWYXJpYWJsZXMua2V5KSB7XG4gICAgICAgIHJldHVybiBlbnZPclNlcnZpY2VWYXJpYWJsZXNcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAzOiBTZXJ2aWNlIHZhcmlhYmxlcyBpbiB0ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMgb2JqZWN0XG4gICAgLy8gRmFsbGJhY2sgNDogU2VydmljZSB2YXJpYWJsZXMgaW4gdGhlIHRvcCBsZXZlbCBjb25maWcgb2JqZWN0XG4gICAgY29uc3QgbzExeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgdXNlcjogZ2V0T2JzZXJ2YWJpbGl0eVVzZXIob3B0aW9ucywgY29uZmlnKSxcbiAgICAgICAga2V5OiBnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnMsIGNvbmZpZylcbiAgICB9XG4gICAgcmV0dXJuIG8xMXlWYXJpYWJsZXNcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkQWRkU2VydmljZVZlcnNpb24oY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsIHRlc3RPYnNlcnZhYmlsaXR5PzogYm9vbGVhbiwgY2Fwcz86IENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXMpOiBib29sZWFuIHtcbiAgICBpZiAoKGNvbmZpZy5zZXJ2aWNlcyAmJiBjb25maWcuc2VydmljZXMudG9TdHJpbmcoKS5pbmNsdWRlcygnY2hyb21lZHJpdmVyJykgJiYgdGVzdE9ic2VydmFiaWxpdHkgIT09IGZhbHNlKSB8fCAhaXNCcm93c2Vyc3RhY2tJbmZyYShjb25maWcsIGNhcHMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmF0Y2hBbmRQb3N0RXZlbnRzIChldmVudFVybDogc3RyaW5nLCBraW5kOiBzdHJpbmcsIGRhdGE6IFVwbG9hZFR5cGVbXSkge1xuICAgIGlmICghcHJvY2Vzcy5lbnZbVEVTVE9QU19CVUlMRF9DT01QTEVURURfRU5WXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1aWxkIG5vdCBjb21wbGV0ZWQgeWV0JylcbiAgICB9XG5cbiAgICBjb25zdCBqd3RUb2tlbiA9IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX0pXVF1cbiAgICBpZiAoIWp3dFRva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBhdXRoZW50aWNhdGlvbiBUb2tlbicpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJVXRpbHMuREFUQV9FTkRQT0lOVH0vJHtldmVudFVybH1gXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAuLi5ERUZBVUxUX1JFUVVFU1RfQ09ORklHLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7and0VG9rZW59YFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gICAgICAgIH0pXG4gICAgICAgIC8vIHJlYWQgYXMgdGV4dCBmaXJzdDogZXJyb3IgcmVzcG9uc2VzICg0MDEvNXh4KSBhbmQgZW1wdHkgYm9kaWVzIGFyZSBub3QgSlNPTiwgYW5kIGEgYmxpbmRcbiAgICAgICAgLy8gcmVzcG9uc2UuanNvbigpIHN1cmZhY2VkIHRoZW0gYXMgYSBtaXNsZWFkaW5nIFwiVW5leHBlY3RlZCBlbmQgb2YgSlNPTiBpbnB1dFwiXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0ke3Jlc3BvbnNlQm9keSA/IGAgXHUyMDE0ICR7cmVzcG9uc2VCb2R5LnNsaWNlKDAsIDMwMCl9YCA6ICcgKGVtcHR5IGJvZHkpJ31gKVxuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgWyR7a2luZH1dIFN1Y2Nlc3MgcmVzcG9uc2U6ICR7cmVzcG9uc2VCb2R5fWApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbJHtraW5kfV0gRVhDRVBUSU9OIElOICR7a2luZH0gUkVRVUVTVCBUTyBURVNUIFJFUE9SVElORyBBTkQgQU5BTFlUSUNTIDogJHtlcnJvcn1gKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4Y2VwdGlvbiBpbiByZXF1ZXN0ICcgKyBlcnJvcilcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5VXNlcihvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19VU0VSTkFNRSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy51c2VyKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy51c2VyXG4gICAgfVxuICAgIHJldHVybiBjb25maWcudXNlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eUtleShvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BQ0NFU1NfS0VZKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQUNDRVNTX0tFWVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMgJiYgb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMua2V5KSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5rZXlcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy5rZXlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2VydmFiaWxpdHlQcm9qZWN0KG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgYnN0YWNrUHJvamVjdE5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX1BST0pFQ1RfTkFNRSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX1BST0pFQ1RfTkFNRVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMgJiYgb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMucHJvamVjdE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnByb2plY3ROYW1lXG4gICAgfVxuICAgIHJldHVybiBic3RhY2tQcm9qZWN0TmFtZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgYnN0YWNrQnVpbGROYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LlRFU1RfT0JTRVJWQUJJTElUWV9CVUlMRF9OQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfTkFNRVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMgJiYgb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGROYW1lKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZE5hbWVcbiAgICB9XG4gICAgcmV0dXJuIGJzdGFja0J1aWxkTmFtZSB8fCBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2VydmFiaWxpdHlCdWlsZFRhZ3Mob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBic3RhY2tCdWlsZFRhZz86IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX1RBRykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX1RBRy5zcGxpdCgnLCcpXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZFRhZykge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGRUYWdcbiAgICB9XG4gICAgaWYgKGJzdGFja0J1aWxkVGFnKSB7XG4gICAgICAgIHJldHVybiBbYnN0YWNrQnVpbGRUYWddXG4gICAgfVxuICAgIHJldHVybiBbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVzdFBsYW5JZChvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVF9QTEFOX0lEXSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRF1cbiAgICB9XG4gICAgY29uc3QgQ0xJX0FSRyA9ICctLWJyb3dzZXJzdGFjay50ZXN0TWFuYWdlbWVudE9wdGlvbnMudGVzdFBsYW5JZCdcbiAgICBjb25zdCBhcmdJbmRleCA9IHByb2Nlc3MuYXJndi5pbmRleE9mKENMSV9BUkcpXG4gICAgaWYgKGFyZ0luZGV4ICE9PSAtMSAmJiBwcm9jZXNzLmFyZ3ZbYXJnSW5kZXggKyAxXSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5hcmd2W2FyZ0luZGV4ICsgMV1cbiAgICB9XG4gICAgY29uc3QgYXJnV2l0aEVxdWFscyA9IHByb2Nlc3MuYXJndi5maW5kKChhcmcpID0+IGFyZy5zdGFydHNXaXRoKGAke0NMSV9BUkd9PWApKVxuICAgIGlmIChhcmdXaXRoRXF1YWxzKSB7XG4gICAgICAgIHJldHVybiBhcmdXaXRoRXF1YWxzLnNwbGl0KCc9JylbMV1cbiAgICB9XG4gICAgY29uc3QgdGVzdFBsYW5JZCA9IG9wdGlvbnMudGVzdE1hbmFnZW1lbnRPcHRpb25zPy50ZXN0UGxhbklkXG4gICAgaWYgKHR5cGVvZiB0ZXN0UGxhbklkID09PSAnc3RyaW5nJyAmJiB0ZXN0UGxhbklkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB0ZXN0UGxhbklkLnRyaW0oKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyU3RhY2tVc2VyKGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19VU0VSTkFNRSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FIGFzIHN0cmluZ1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnLnVzZXIgYXMgc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyU3RhY2tLZXkoY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FDQ0VTU19LRVkpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BQ0NFU1NfS0VZXG4gICAgfVxuICAgIHJldHVybiBjb25maWcua2V5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZTogdW5rbm93bikge1xuICAgIGxldCByZXMgPSAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbClcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXMgPSByZXMgfHwgdmFsdWUgPT09ICcnXG4gICAgfVxuICAgIHJldHVybiByZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVHJ1ZSh2YWx1ZT86IHVua25vd24pIHtcbiAgICByZXR1cm4gKHZhbHVlICsgJycpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGYWxzZSh2YWx1ZT86IHVua25vd24pIHtcbiAgICByZXR1cm4gKHZhbHVlICsgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZSdcbn1cblxuLyoqXG4gKiBza2lwQXBwT3ZlcnJpZGUgdmFsaWRhdGlvbiBjaG9rZXBvaW50IFx1MjAxNCBwb3J0ZWQgZnJvbSB0aGUgTm9kZSBTREsnc1xuICogdmFsaWRhdGVTa2lwQXBwT3ZlcnJpZGUgKGhlbHBlci5qcykgLyBKYXZhIEJyb3dzZXJTdGFja0phdmFBZ2VudC5wcm9jZXNzQXBwT3B0aW9ucy5cbiAqIENhbGxlZCBPTkNFIGZyb20gdGhlIGxhdW5jaGVyIChtYWluIHByb2Nlc3MsIHByZS1zZXNzaW9uKS4gRW1pdHMgdGhlIGZpeGVkIHdhcm5pbmcsXG4gKiBoYW5kbGVzIHRoZSB0aHJlZSBlZGdlIGNhc2VzLCBhbmQgY2xlYXJzIHRoZSBhcHAgb24gY29uZmxpY3Qgc28gaXQgaXMgbmVpdGhlciB1cGxvYWRlZFxuICogbm9yIGluamVjdGVkLiBUaGVyZSBpcyBOTyBUaWVyLTIgYnJhbmNoOiBldmVyeSBXZWJkcml2ZXJJTyB0ZXN0IGZyYW1ld29ya1xuICogKG1vY2hhL2phc21pbmUvY3VjdW1iZXIpIHN1cHBvcnRzIEFwcCBBdXRvbWF0ZS5cbiAqXG4gKiBUaGUgc3RhbmRhcmQgd2FybmluZyBhbmQgdGhlIGVkZ2UtMiBlcnJvciBhcmUgdmVyYmF0aW0gd2l0aCB0aGUgb3RoZXIgQnJvd3NlclN0YWNrIFNES3NcbiAqIChCcm93c2VyU3RhY2tKYXZhQWdlbnQjcHJvY2Vzc0FwcE9wdGlvbnMpLiBUaGUgZWRnZS0xIGNvbmZsaWN0IHdhcm5pbmcgaXMgSU5URU5USU9OQUxMWSBhZGFwdGVkIGZvclxuICogV2ViZHJpdmVySU8gXHUyMDE0IGl0IHNheXMgXCJicm93c2Vyc3RhY2sgc2VydmljZSBvcHRpb25zXCIgKHdoZXJlIFdESU8gcmVhZHMgYGFwcGApLCBub3QgXCJicm93c2Vyc3RhY2sueW1sXCIgXHUyMDE0XG4gKiBzbyBwbGVhc2UgZG8gTk9UIFwiZml4XCIgaXQgYmFjayB0byB0aGUgeW1sIHdvcmRpbmcgdG8gbWF0Y2ggdGhlIG90aGVyIFNES3MuXG4gKiBHcmFjZWZ1bDogbmV2ZXIgdGhyb3dzIGV4Y2VwdCB0aGUgZGVsaWJlcmF0ZSBlZGdlLTIgY29uZmlnIGVycm9yIChleHBsaWNpdCBmYWxzZSArIG5vIGFwcCksXG4gKiB3aGljaCBmaXJlcyBwcmUtc2Vzc2lvbiBzbyB0aGUgcnVuIGFib3J0cyBjbGVhbmx5LlxuICpcbiAqIE11dGF0ZXMgYG9wdGlvbnMuYXBwYCAoZWRnZS0xKS4gMy1zdGF0ZSB2aWEgaXNUcnVlL2lzRmFsc2UgXHUyMDE0IG5ldmVyIGAhb3B0aW9ucy5za2lwQXBwT3ZlcnJpZGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTa2lwQXBwT3ZlcnJpZGUob3B0aW9ucz86IEJyb3dzZXJzdGFja0NvbmZpZyAmIEJyb3dzZXJzdGFja09wdGlvbnMpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQob3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2tpcEFwcE92ZXJyaWRlID0gKG9wdGlvbnMgYXMgQnJvd3NlcnN0YWNrQ29uZmlnKS5za2lwQXBwT3ZlcnJpZGVcbiAgICBjb25zdCBhbHJlYWR5V2FybmVkID0gaXNUcnVlKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19TS0lQX0FQUF9PVkVSUklERV9XQVJORUQpXG5cbiAgICAvLyBTdGFuZGFyZCB3YXJuaW5nIFx1MjAxNCBmaXJlcyB3aGVuZXZlciBza2lwQXBwT3ZlcnJpZGUgaXMgdHJ1ZSwgYmVmb3JlIGFueSBlZGdlIHJldHVybi5cbiAgICBpZiAoaXNUcnVlKHNraXBBcHBPdmVycmlkZSkgJiYgIWFscmVhZHlXYXJuZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ1tCcm93c2VyU3RhY2tdIFxcJ3NraXBBcHBPdmVycmlkZTogdHJ1ZVxcJyBpcyBzZXQuIFRoZSBTREsgd2lsbCB0cmVhdCB0aGlzIHNlc3Npb24gYXMgQXBwIEF1dG9tYXRlIGFuZCB3aWxsIE5PVCBtYW5hZ2UgYXBwIHVwbG9hZCBvciBpbmplY3QgYXBwIGNhcGFiaWxpdGllcy4gSWYgeW91IGludGVuZGVkIHRvIHJ1biBhbiBBdXRvbWF0ZSAoYnJvd3Nlci93ZWJzaXRlKSBzZXNzaW9uLCByZW1vdmUgXFwnc2tpcEFwcE92ZXJyaWRlXFwnIFx1MjAxNCBsZWF2aW5nIGl0IHNldCB3aWxsIGNhdXNlIEF1dG9tYXRlIHNlc3Npb25zIHRvIGJlaGF2ZSBpbmNvcnJlY3RseS4nKVxuICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfU0tJUF9BUFBfT1ZFUlJJREVfV0FSTkVEID0gJ3RydWUnXG4gICAgfVxuXG4gICAgLy8gRWRnZSAxOiBhcHAgc3BlY2lmaWVkICsgc2tpcEFwcE92ZXJyaWRlOnRydWUgXHUyMTkyIHdhcm4sIGNsZWFyIHRoZSBhcHAgc28gaXQgaXMgbm90XG4gICAgLy8gdXBsb2FkZWQvaW5qZWN0ZWQsIHByb2NlZWQgQXBwIEF1dG9tYXRlLlxuICAgIGlmIChpc1RydWUoc2tpcEFwcE92ZXJyaWRlKSAmJiAhaXNVbmRlZmluZWQoKG9wdGlvbnMgYXMgQnJvd3NlcnN0YWNrQ29uZmlnKS5hcHApKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdDb25mbGljdCBkZXRlY3RlZC4gc2tpcEFwcE92ZXJyaWRlOiB0cnVlIGlzIGFjdGl2ZTsgaWdub3JpbmcgdGhlIGFwcCBwcm92aWRlZCBpbiB0aGUgYnJvd3NlcnN0YWNrIHNlcnZpY2Ugb3B0aW9ucy4nKVxuICAgICAgICA7KG9wdGlvbnMgYXMgQnJvd3NlcnN0YWNrQ29uZmlnKS5hcHAgPSB1bmRlZmluZWRcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gRWRnZSAyOiBhcHAgbm90IHNwZWNpZmllZCArIHNraXBBcHBPdmVycmlkZSBleHBsaWNpdGx5IGZhbHNlIFx1MjE5MiBwcmUtc2Vzc2lvbiBjb25maWcgZXJyb3IuXG4gICAgaWYgKGlzRmFsc2Uoc2tpcEFwcE92ZXJyaWRlKSAmJiBpc1VuZGVmaW5lZCgob3B0aW9ucyBhcyBCcm93c2Vyc3RhY2tDb25maWcpLmFwcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHAgY2FwYWJpbGl0eSBpcyBtaXNzaW5nLiBXaGVuIHNraXBBcHBPdmVycmlkZSBpcyBzZXQgdG8gXFwnZmFsc2VcXCcsIGEgdmFsaWQgYXBwIGNhcGFiaWxpdHkgKGhhc2gvc2hhcmVhYmxlIGlkL3BhdGgvY3VzdG9tX2lkKSBtdXN0IGJlIHByb3ZpZGVkLicpXG4gICAgfVxuXG4gICAgLy8gRWRnZSAzIChhbmQgZGVmYXVsdCk6IHVuc2V0ICsgbm8gYXBwIFx1MjE5MiB1bmNoYW5nZWQgYmVoYXZpb3IgKG5vLW9wKS5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZyYW1ld29ya1N1cHBvcnRzSG9vayhob29rOiBzdHJpbmcsIGZyYW1ld29yaz86IHN0cmluZykge1xuICAgIGlmIChmcmFtZXdvcmsgPT09ICdtb2NoYScgJiYgKGhvb2sgPT09ICdiZWZvcmUnIHx8IGhvb2sgPT09ICdhZnRlcicgfHwgaG9vayA9PT0gJ2JlZm9yZUVhY2gnIHx8IGhvb2sgPT09ICdhZnRlckVhY2gnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmIChmcmFtZXdvcmsgPT09ICdjdWN1bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IHBhdGNoQ29uc29sZUxvZ3MgPSBvMTF5RXJyb3JIYW5kbGVyKCgpID0+IHtcbiAgICBjb25zdCBCU1Rlc3RPcHNQYXRjaGVyID0gbmV3IGxvZ1BhdGNoZXIoe30pXG5cbiAgICBPYmplY3Qua2V5cyhjb25zb2xlSG9sZGVyKS5mb3JFYWNoKChtZXRob2Q6IGtleW9mIHR5cGVvZiBjb25zb2xlKSA9PiB7XG4gICAgICAgIGlmICghKG1ldGhvZCBpbiBjb25zb2xlKSB8fCBtZXRob2QgPT09ICdDb25zb2xlJyB8fCB0eXBlb2YgY29uc29sZVttZXRob2RdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFNraXBwaW5nIG1ldGhvZDogJHttZXRob2R9LCBleGlzdHM6ICR7bWV0aG9kIGluIGNvbnNvbGV9LCB0eXBlOiAke3R5cGVvZiBjb25zb2xlW21ldGhvZF19YClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yaWdNZXRob2Q6IEZ1bmN0aW9uID0gY29uc29sZVttZXRob2RdLmJpbmQoY29uc29sZSlcblxuICAgICAgICBjb25zb2xlW21ldGhvZF0gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LmtleXMoQlNUZXN0T3BzUGF0Y2hlcikuaW5jbHVkZXMobWV0aG9kKSkge1xuICAgICAgICAgICAgICAgICAgICBvcmlnTWV0aG9kKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ01ldGhvZCguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgKEJTVGVzdE9wc1BhdGNoZXIgYXMgYW55KVttZXRob2RdKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIHdoaWxlIHBhdGNoaW5nIGNvbnNvbGUgbG9ncyA6ICR7ZXJyb3J9YClcbiAgICAgICAgICAgICAgICBvcmlnTWV0aG9kKC4uLmFyZ3MpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxufSlcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZhaWx1cmVPYmplY3QoZXJyb3I6IHN0cmluZ3xFcnJvcikge1xuICAgIGNvbnN0IHN0YWNrID0gKGVycm9yIGFzIEVycm9yKS5zdGFja1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnID8gZXJyb3IgOiBlcnJvci5tZXNzYWdlXG4gICAgY29uc3QgYmFja3RyYWNlID0gc3RhY2sgPyByZW1vdmVBbnNpQ29sb3JzKHN0YWNrLnRvU3RyaW5nKCkpIDogJydcblxuICAgIHJldHVybiB7XG4gICAgICAgIGZhaWx1cmU6IFt7IGJhY2t0cmFjZTogW2JhY2t0cmFjZV0gfV0sXG4gICAgICAgIGZhaWx1cmVfcmVhc29uOiByZW1vdmVBbnNpQ29sb3JzKG1lc3NhZ2UudG9TdHJpbmcoKSksXG4gICAgICAgIGZhaWx1cmVfdHlwZTogbWVzc2FnZSA/IChtZXNzYWdlLnRvU3RyaW5nKCkubWF0Y2goL0Fzc2VydGlvbkVycm9yLykgPyAnQXNzZXJ0aW9uRXJyb3InIDogJ1VuaGFuZGxlZEVycm9yJykgOiBudWxsXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAobXMgPSAxMDApID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSlcblxuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRMb2dzT3B0aW9ucyB7XG4gICAgLyogb3B0LW91dCwgbWlycm9yaW5nIHRoZSBOb2RlIFNESydzIGBkaXNhYmxlQXV0b0NhcHR1cmVMb2dzYCAqL1xuICAgIGRpc2FibGVBdXRvQ2FwdHVyZUxvZ3M/OiBib29sZWFuXG4gICAgLyogcGFyc2VkIHdkaW8gY29uZmlnLCB1c2VkIHRvIGxvY2F0ZSB0aGUgdXNlcidzIGNvbmZpZyBmaWxlICovXG4gICAgY29uZmlnPzogT3B0aW9ucy5UZXN0cnVubmVyXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGxvYWRMb2dzKHVzZXI6IHN0cmluZyB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsIGNsaWVudEJ1aWxkVXVpZDogc3RyaW5nLCBvcHRpb25zOiBVcGxvYWRMb2dzT3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gTWFudWFsIGluc3RydW1lbnRhdGlvbjogdGFnIGV2ZXJ5IHJldHVybiBwYXRoIG9uIHRoZSBTREtfVVBMT0FEX0xPR1MgZXZlbnQgc29cbiAgICAvLyB0aGUgbWV0cmljIGlkZW50aWZpZXMgdGhlIHNwZWNpZmljIHJlYXNvbiBsb2dzIHdlcmUgbm90IHVwbG9hZGVkIChubyBjcmVkcyxcbiAgICAvLyBwZXItZmlsZSBjb3B5IGZhaWx1cmUsIHVwbG9hZCBuby1yZXNwb25zZSwgZXhjZXB0aW9uKS4gbWVhc3VyZVdyYXBwZXIgd291bGRcbiAgICAvLyBvdGhlcndpc2UgbWFyayBhbGwgbm9uLXRocm93aW5nIHBhdGhzIGFzIHN1Y2Nlc3MuXG4gICAgY29uc3QgZXZlbnROYW1lID0gUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5FVkVOVFMuU0RLX1VQTE9BRF9MT0dTXG4gICAgbGV0IHN1Y2Nlc3MgPSB0cnVlXG4gICAgbGV0IGZhaWx1cmU6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgIC8vIFN0YWdpbmcgZGlyIGZvciB0aGUgYXJjaGl2ZS4gQ3JlYXRlZCBwZXIgcnVuOiB0aGUgcHJldmlvdXMgZml4ZWQgYHRtcGRpcigpL2xvZ3MudGFyYFxuICAgIC8vIG5hbWVzIG1lYW50IHR3byBjb25jdXJyZW50IHdkaW8gcnVucyBvbiBvbmUgQ0kgaG9zdCBjbG9iYmVyZWQgYW5kIHVubGlua2VkIGVhY2hcbiAgICAvLyBvdGhlcidzIGFyY2hpdmVzLCBhbmQgYSBzb3VyY2UgZmlsZSB0aGF0IGFscmVhZHkgbGl2ZWQgaW4gdG1wZGlyIHdhcyBjb3BpZWQgb250b1xuICAgIC8vIGl0c2VsZiBhbmQgdGhlbiBkZWxldGVkIGJ5IGNsZWFudXAuXG4gICAgbGV0IHN0YWdpbmdEaXI6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgIFBlcmZvcm1hbmNlVGVzdGVyLnN0YXJ0KGV2ZW50TmFtZSlcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIGlzQXV0b0NhcHR1cmVMb2dzRGlzYWJsZWQgKG5vdCBvcHRpb25zLmRpc2FibGVBdXRvQ2FwdHVyZUxvZ3MpIHNvIHRoZSBkZXRhY2hlZFxuICAgICAgICAvLyBjbGVhbnVwIHByb2Nlc3MgXHUyMDE0IHdoaWNoIGNhbGxzIHRoaXMgd2l0aCBubyBvcHRpb25zIFx1MjAxNCBzdGlsbCBob25vdXJzIHRoZSBvcHQtb3V0XG4gICAgICAgIC8vIHZpYSB0aGUgZW52IHZhciB0aGUgbGF1bmNoZXIgcHVibGlzaGVzLlxuICAgICAgICBpZiAoaXNBdXRvQ2FwdHVyZUxvZ3NEaXNhYmxlZChvcHRpb25zKSkge1xuICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlXG4gICAgICAgICAgICBmYWlsdXJlID0gJ3NraXBwZWQ6IGRpc2FibGVBdXRvQ2FwdHVyZUxvZ3M9dHJ1ZSdcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgbG9nIHVwbG9hZCwgYXV0by1jYXB0dXJlIGlzIGRpc2FibGVkJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF1c2VyIHx8ICFrZXkpIHtcbiAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICAgICAgZmFpbHVyZSA9ICdza2lwcGVkOiBtaXNzaW5nX2NyZWRlbnRpYWxzJ1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdVcGxvYWRpbmcgbG9ncyBmYWlsZWQgZHVlIHRvIG5vIGNyZWRlbnRpYWxzJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgc3RhZ2luZ0RpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbih0bXBkaXIoKSwgJ2JzdGFjay13ZGlvLWxvZ3MtJykpXG4gICAgICAgIGNvbnN0IHRtcERpciA9IHN0YWdpbmdEaXJcbiAgICAgICAgY29uc3QgdGFyUGF0aCA9IHBhdGguam9pbih0bXBEaXIsICdsb2dzLnRhcicpXG4gICAgICAgIGNvbnN0IHRhckd6UGF0aCA9IHBhdGguam9pbih0bXBEaXIsICdsb2dzLnRhci5neicpXG5cbiAgICAgICAgLy8gQXJjaGl2ZSBlbnRyaWVzIGFyZSBrZXllZCBieSBiYXNlbmFtZSwgc28gdHdvIHNvdXJjZXMgc2hhcmluZyBvbmUgYmFzZW5hbWUgd291bGRcbiAgICAgICAgLy8gc2lsZW50bHkgb3ZlcndyaXRlIGVhY2ggb3RoZXIgXHUyMDE0IHJlYWNoYWJsZSBub3cgdGhhdCB1c2VyLXN1cHBsaWVkIGNvbmZpZyBwYXRoc1xuICAgICAgICAvLyAoZS5nLiBjb25maWdzL3dkaW8uY29uZi50cyArIHNoYXJlZC93ZGlvLmNvbmYudHMpIGpvaW4gdGhlIGFyY2hpdmUuXG4gICAgICAgIC8vIFNhbWUgaGVscGVyIGNvbGxlY3RDb25maWdGaWxlc0ZvclVwbG9hZCB1c2VzLCBzbyB0aGUgdHdvIGNhbm5vdCBkaXNhZ3JlZS5cbiAgICAgICAgY29uc3QgdGFrZW5OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPihbJ2xvZ3MudGFyJywgJ2xvZ3MudGFyLmd6J10pXG4gICAgICAgIGNvbnN0IGNvcGllZEZpbGVOYW1lczogc3RyaW5nW10gPSBbXVxuICAgICAgICBjb25zdCBhcmNoaXZlQWRkRmFpbHVyZXM6IHN0cmluZ1tdID0gW11cbiAgICAgICAgY29uc3QgdW5pcXVlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nID0+IGRlZHVwZUVudHJ5TmFtZShmaWxlUGF0aCwgdGFrZW5OYW1lcylcblxuICAgICAgICAvLyBTREstNzI1MDogdGhlIHVzZXIncyB3ZGlvIGNvbmZpZyAoYW5kIHRoZSBsb2NhbCBmaWxlcyBpdCBpbXBvcnRzKSwgY3JlZGVudGlhbC1zY3J1YmJlZC5cbiAgICAgICAgLy8gU29mdC1mYWlsdXJlIGJ5IGRlc2lnbiBcdTIwMTQgYSBjb25maWcgd2UgY2Fubm90IHJlYWQgb3IgbG9jYXRlIG11c3QgbmV2ZXIgc3RvcCB0aGVcbiAgICAgICAgLy8gbG9nIHVwbG9hZDsgdGhlIHJlYXNvbiBpcyByZWNvcmRlZCBvbiB0aGUgZXZlbnQgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgeyBmaWxlczogY29uZmlnRmlsZXMsIGZhaWx1cmVzOiBjb25maWdGYWlsdXJlcywgc3RyYXRlZ3kgfSA9IGNvbGxlY3RDb25maWdGaWxlc0ZvclVwbG9hZChvcHRpb25zLmNvbmZpZylcblxuICAgICAgICAvLyBwYWNrYWdlLmpzb24gZ2l2ZXMgdHJpYWdlIHRoZSBmcmFtZXdvcmsvc2VydmljZSB2ZXJzaW9ucywgd2hpY2ggdGhlIGFyY2hpdmUgY2FycmllZFxuICAgICAgICAvLyBiZWZvcmUgdGhpcyBjaGFuZ2UuIEl0IGdvZXMgdGhyb3VnaCB0aGUgc2FtZSByZWRhY3Rpb24gYXMgdGhlIGNvbmZpZ3MgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gYmVpbmcgY29waWVkIHZlcmJhdGltOiBgc2NyaXB0c2Agcm91dGluZWx5IGVtYmVkIHRva2VucyAoYC0tdG9rZW49Z2hwXy4uLmApLCBhbmQgdGhlXG4gICAgICAgIC8vIHdhbGstdXAgY2FuIHNlbGVjdCBhIG1vbm9yZXBvLXJvb3QgbWFuaWZlc3QgYnJvYWRlciB0aGFuIHRoZSB0ZXN0IHByb2plY3QuIE9yZGluYXJ5XG4gICAgICAgIC8vIGRlcGVuZGVuY3kvdmVyc2lvbiBsaW5lcyBhcmUgdW5hZmZlY3RlZCBieSB0aGUgc2NydWIuXG4gICAgICAgIC8vIHNuYXBzaG90IGJlZm9yZSBwYWNrYWdlLmpzb24gam9pbnMgdGhlIGxpc3QsIHNvIGNvdW50cyBhbmQgbmFtZXMgc3RheSBob25lc3RcbiAgICAgICAgY29uc3QgY2FwdHVyZWRDb25maWdOYW1lcyA9IGNvbmZpZ0ZpbGVzLm1hcChmID0+IGYubmFtZSlcblxuICAgICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBmaW5kUGFja2FnZUpzb25Gb3JVcGxvYWQoKVxuICAgICAgICBpZiAocGFja2FnZUpzb25QYXRoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYXRoLmJhc2VuYW1lKHBhY2thZ2VKc29uUGF0aCksXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVBhdGg6IHBhY2thZ2VKc29uUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogcmVkYWN0U2Vuc2l0aXZlQ29udGVudChmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGNhdGNoIChwa2dFcnIpIHtcbiAgICAgICAgICAgICAgICBjb25maWdGYWlsdXJlcy5wdXNoKGBwYWNrYWdlLmpzb246ICR7KHBrZ0VyciBhcyBFcnJvcik/Lm1lc3NhZ2UgfHwgU3RyaW5nKHBrZ0Vycil9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNvbmZpZ0ZpbGUgb2YgY29uZmlnRmlsZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlOYW1lID0gdW5pcXVlTmFtZShjb25maWdGaWxlLm5hbWUpXG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4odG1wRGlyLCBlbnRyeU5hbWUpLCBjb25maWdGaWxlLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgY29waWVkRmlsZU5hbWVzLnB1c2goZW50cnlOYW1lKVxuICAgICAgICAgICAgfSBjYXRjaCAod3JpdGVFcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSAod3JpdGVFcnIgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IFN0cmluZyh3cml0ZUVycilcbiAgICAgICAgICAgICAgICBjb25maWdGYWlsdXJlcy5wdXNoKGAke2NvbmZpZ0ZpbGUubmFtZX06ICR7bXNnfWApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTG9nZ2VkIHNlcGFyYXRlbHkgZnJvbSBwYWNrYWdlLmpzb246IGBjb25maWdGaWxlc2AgaGFzIHRoZSBtYW5pZmVzdCBhcHBlbmRlZCB0byBpdCxcbiAgICAgICAgLy8gYW5kIGBzdHJhdGVneWAgaXMgdW5kZWZpbmVkIG9uIGV2ZXJ5IGZhaWx1cmUgcGF0aCwgc28gYSBjb21iaW5lZCBsaW5lIHJlYWRzXG4gICAgICAgIC8vIFwiQXV0by1jYXB0dXJlZCAxIGNvbmZpZyBmaWxlKHMpIHZpYSB1bmRlZmluZWQ6IHBhY2thZ2UuanNvblwiIFx1MjAxNCBpLmUuIGl0IGNsYWltcyBhXG4gICAgICAgIC8vIGNhcHR1cmUgc3VjY2VlZGVkIGluIGV4YWN0bHkgdGhlIGNhc2Ugd2hlcmUgbm9uZSBkaWQuXG4gICAgICAgIGlmIChjYXB0dXJlZENvbmZpZ05hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgQXV0by1jYXB0dXJlZCAke2NhcHR1cmVkQ29uZmlnTmFtZXMubGVuZ3RofSBjb25maWcgZmlsZShzKSB2aWEgJHtzdHJhdGVneX06ICR7Y2FwdHVyZWRDb25maWdOYW1lcy5qb2luKCcsICcpfWApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYE5vIHdkaW8gY29uZmlnIGNhcHR1cmVkJHtzdHJhdGVneSA/IGAgKHN0cmF0ZWd5ICR7c3RyYXRlZ3l9KWAgOiAnJ31gKVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrYWdlSnNvblBhdGgpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgQXV0by1jYXB0dXJlZCBwYWNrYWdlLmpzb24gZnJvbSAke3JlbGF0aXZlRGlyVG9Dd2QocGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpfWApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ0ZhaWx1cmVzLmxlbmd0aCA+IDAgJiYgZmFpbHVyZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBXYXJuaW5nIG9ubHkgXHUyMDE0IGBzdWNjZXNzYCBzdGF5cyB0cnVlIHNvIGEgbWlzc2luZyBjb25maWcgbmV2ZXIgcmVhZHMgYXMgYVxuICAgICAgICAgICAgLy8gZmFpbGVkIGxvZyB1cGxvYWQgKHNhbWUgY29udHJhY3QgYXMgdGhlIE5vZGUgU0RLJ3MgYHJlZGFjdGlvbl9mYWlsZWRgKS5cbiAgICAgICAgICAgIGZhaWx1cmUgPSBgY29uZmlnX2NhcHR1cmU6ICR7Y29uZmlnRmFpbHVyZXMuam9pbignOyAnKX1gLnN1YnN0cmluZygwLCAzMDApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgc2VydmljZSBsb2cgaXMgc25hcHNob3R0ZWQgTEFTVCwgZGVsaWJlcmF0ZWx5LiBFdmVyeXRoaW5nIGFib3ZlIC0tIHRoZSByZXNvbHV0aW9uXG4gICAgICAgIC8vIHN0cmF0ZWd5LCB3aGF0IHdhcyBjYXB0dXJlZCwgYW5kIGFueSBjYXB0dXJlIGZhaWx1cmVzIC0tIGlzIHdyaXR0ZW4gdG8gdGhhdCBsb2dcbiAgICAgICAgLy8gZmlyc3QsIHNvIGl0IGlzIGluc2lkZSB0aGUgY29weSB0aGF0IHNoaXBzLiBDb3B5aW5nIGVhcmxpZXIgaXMgd2h5IHRob3NlIGxpbmVzIHVzZWRcbiAgICAgICAgLy8gdG8gZXhpc3Qgb25seSBpbiB0aGUgZGV2ZWxvcGVyJ3MgbG9jYWwgZmlsZSBhbmQgbmV2ZXIgaW4gdGhlIGRvd25sb2FkZWQgYnVuZGxlLlxuICAgICAgICAvL1xuICAgICAgICAvLyBPcmRlcmluZyBhbG9uZSBpcyBub3QgZW5vdWdoOiBCU3RhY2tMb2dnZXIgd3JpdGVzIHRocm91Z2ggYW4gYXN5bmMgV3JpdGVTdHJlYW0sIHNvXG4gICAgICAgIC8vIHRob3NlIGxpbmVzIGFyZSBzdGlsbCBidWZmZXJlZCBhdCB0aGlzIHBvaW50LiBGbHVzaCBiZWZvcmUgY29weWluZyBvciB0aGUgc2hpcHBlZFxuICAgICAgICAvLyBjb3B5IGlzIHNpbGVudGx5IG1pc3NpbmcgaXRzIHRhaWwgKHZlcmlmaWVkIGFnYWluc3QgYSBkb3dubG9hZGVkIGJ1bmRsZSkuXG4gICAgICAgIGF3YWl0IEJTdGFja0xvZ2dlci5mbHVzaExvZ0ZpbGUoKVxuXG4gICAgICAgIGNvbnN0IGZpbGVzVG9BcmNoaXZlID0gW1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmxvZ0ZpbGVQYXRoLFxuICAgICAgICAgICAgQ0xJX0RFQlVHX0xPR1NfRklMRSxcbiAgICAgICAgXS5maWx0ZXIoKGYpOiBmIGlzIHN0cmluZyA9PiBCb29sZWFuKGYpICYmIGZzLmV4aXN0c1N5bmMoZiBhcyBzdHJpbmcpKVxuXG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWxlc1RvQXJjaGl2ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeU5hbWUgPSB1bmlxdWVOYW1lKGYpXG4gICAgICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKGYsIHBhdGguam9pbih0bXBEaXIsIGVudHJ5TmFtZSkpXG4gICAgICAgICAgICAgICAgY29waWVkRmlsZU5hbWVzLnB1c2goZW50cnlOYW1lKVxuICAgICAgICAgICAgfSBjYXRjaCAoY29weUVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IChjb3B5RXJyIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBTdHJpbmcoY29weUVycilcbiAgICAgICAgICAgICAgICBhcmNoaXZlQWRkRmFpbHVyZXMucHVzaChgJHtwYXRoLmJhc2VuYW1lKGYpfTogJHttc2d9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmNoaXZlQWRkRmFpbHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlXG4gICAgICAgICAgICBmYWlsdXJlID0gYGFyY2hpdmVfYWRkX2ZhaWxlZCBbJHthcmNoaXZlQWRkRmFpbHVyZXMubGVuZ3RofV06ICR7YXJjaGl2ZUFkZEZhaWx1cmVzLmpvaW4oJzsgJyl9YC5zdWJzdHJpbmcoMCwgMzAwKVxuICAgICAgICB9XG5cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBBdXRvLWNhcHR1cmUgYXJjaGl2ZSBlbnRyaWVzOiAke2NvcGllZEZpbGVOYW1lcy5qb2luKCcsICcpfWApXG5cbiAgICAgICAgYXdhaXQgY3JlYXRlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZpbGU6IHRhclBhdGgsXG4gICAgICAgICAgICAgICAgY3dkOiB0bXBEaXIsXG4gICAgICAgICAgICAgICAgcG9ydGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgbm9EaXJSZWN1cnNlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29waWVkRmlsZU5hbWVzXG4gICAgICAgIClcblxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHRhclBhdGgpXG4gICAgICAgICAgICBjb25zdCBkZXN0ID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odGFyR3pQYXRoKVxuICAgICAgICAgICAgY29uc3QgZ3ppcCA9IHpsaWIuY3JlYXRlR3ppcCh7IGxldmVsOiAxIH0pXG5cbiAgICAgICAgICAgIHNvdXJjZS5waXBlKGd6aXApLnBpcGUoZGVzdClcbiAgICAgICAgICAgIGRlc3Qub24oJ2ZpbmlzaCcsIHJlc29sdmUpXG4gICAgICAgICAgICBkZXN0Lm9uKCdlcnJvcicsIHJlamVjdClcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIC8vIG9wZW5Bc0Jsb2IgKE5vZGUgPj0yMCkgcmV0dXJucyBhIEJsb2IgYmFja2VkIGJ5IGEgZmlsZSBkZXNjcmlwdG9yIFx1MjAxNCB1bmRpY2lcbiAgICAgICAgLy8gc3RyZWFtcyBmcm9tIGRpc2sgZHVyaW5nIHRoZSB1cGxvYWQgaW5zdGVhZCBvZiBtYXRlcmlhbGlzaW5nIHRoZSBmdWxsIGFyY2hpdmVcbiAgICAgICAgLy8gaW4gVjggaGVhcCAod2hpY2ggcmVhZEZpbGVTeW5jICsgbmV3IEJsb2IoW0J1ZmZlcl0pIHdvdWxkIGRvIHR3aWNlKS5cbiAgICAgICAgLy8gTm9kZSAxOC4yMCAoc3RpbGwgc3VwcG9ydGVkIHBlciBgZW5naW5lc2ApIGxhY2tzIGZzLm9wZW5Bc0Jsb2IsIHNvIGZhbGwgYmFja1xuICAgICAgICAvLyB0byByZWFkaW5nIHRoZSAoc21hbGwpIGxvZyBhcmNoaXZlIGludG8gYSBCbG9iIHRoZXJlLlxuICAgICAgICBjb25zdCBmaWxlID0gdHlwZW9mIGZzLm9wZW5Bc0Jsb2IgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgZnMub3BlbkFzQmxvYih0YXJHelBhdGgsIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3gtZ3ppcCcgfSlcbiAgICAgICAgICAgIDogbmV3IEJsb2IoW2ZzLnJlYWRGaWxlU3luYyh0YXJHelBhdGgpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24veC1nemlwJyB9KVxuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2RhdGEnLCBmaWxlLCAnbG9ncy50YXIuZ3onKVxuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2NsaWVudEJ1aWxkVXVpZCcsIGNsaWVudEJ1aWxkVXVpZClcblxuICAgICAgICBjb25zdCBhdXRoID0gQnVmZmVyLmZyb20oYCR7dXNlcn06JHtrZXl9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgICAgICAgIGJvZHk6IGZvcm1EYXRhIGFzIEJvZHlJbml0LFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJhc2ljICR7YXV0aH1gXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG5vZGVSZXF1ZXN0KFxuICAgICAgICAgICAgJ1BPU1QnLCBVUExPQURfTE9HU19FTkRQT0lOVCwgcmVxdWVzdE9wdGlvbnMsIEFQSVV0aWxzLlVQTE9BRF9MT0dTX0FERFJFU1NcbiAgICAgICAgKVxuXG4gICAgICAgIC8vIFN0YWdpbmcgZGlyIChhcmNoaXZlICsgZXZlcnkgY29waWVkL3JlZGFjdGVkIGVudHJ5KSBpcyByZW1vdmVkIGluIGBmaW5hbGx5YC5cblxuICAgICAgICAvLyBEZWxldGUgdGhlIFNESyBDTEkgbG9nIGZpbGUgYWZ0ZXIgdXBsb2FkXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKENMSV9ERUJVR19MT0dTX0ZJTEUpKSB7XG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKENMSV9ERUJVR19MT0dTX0ZJTEUpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgICAvLyBub2RlUmVxdWVzdCBzd2FsbG93cyBlcnJvcnMgZm9yIHRoZSBsb2ctdXBsb2FkIHBhdGggYW5kIHJldHVybnMgdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gcmVjb3JkIHRoZSBzaWxlbnQgdXBsb2FkIGZhaWx1cmUgb24gdGhlIG1ldHJpYy5cbiAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICAgICAgZmFpbHVyZSA9ICd1cGxvYWRfbm9fcmVzcG9uc2UnXG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzICYmIHJlc3BvbnNlLnN0YXR1cyAhPT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAvLyBTZXJ2ZXItc2lkZSByZWplY3Rpb24gKGUuZy4gXCJGaWxlIG5vdCBhdHRhY2hlZFwiKSBcdTIwMTQgcmVzcG9uc2UgaXMgdHJ1dGh5XG4gICAgICAgICAgICAvLyBidXQgdGhlIHVwbG9hZCBkaWRuJ3QgYWN0dWFsbHkgbGFuZC5cbiAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICAgICAgZmFpbHVyZSA9IGB1cGxvYWRfc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c30ke3Jlc3BvbnNlLm1lc3NhZ2UgPyAnIC0gJyArIFN0cmluZyhyZXNwb25zZS5tZXNzYWdlKS5zbGljZSgwLCAyMDApIDogJyd9YFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc3VjY2VzcyA9IGZhbHNlXG4gICAgICAgIGZhaWx1cmUgPSBgdXBsb2FkTG9ncyBleGNlcHRpb246ICR7Z2V0RXJyb3JTdHJpbmcoZXJyb3IpfWBcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciB3aGlsZSB1cGxvYWRpbmcgbG9nczogJHtnZXRFcnJvclN0cmluZyhlcnJvcil9YClcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoc3RhZ2luZ0Rpcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmcy5ybVN5bmMoc3RhZ2luZ0RpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgICAgICAgICB9IGNhdGNoIChjbGVhbnVwRXJyKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBGYWlsZWQgdG8gY2xlYW4gdXAgbG9nIHN0YWdpbmcgZGlyICR7c3RhZ2luZ0Rpcn06ICR7Z2V0RXJyb3JTdHJpbmcoY2xlYW51cEVycil9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoZXZlbnROYW1lLCBzdWNjZXNzLCBmYWlsdXJlKVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0ID0gKG9iamVjdDogdW5rbm93bikgPT4ge1xuICAgIHJldHVybiBvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2JqZWN0KVxufVxuXG5leHBvcnQgY29uc3QgT2JqZWN0c0FyZUVxdWFsID0gKG9iamVjdDE6IG9iamVjdCwgb2JqZWN0Mjogb2JqZWN0KSA9PiB7XG4gICAgY29uc3Qgb2JqZWN0S2V5czEgPSBPYmplY3Qua2V5cyhvYmplY3QxKVxuICAgIGNvbnN0IG9iamVjdEtleXMyID0gT2JqZWN0LmtleXMob2JqZWN0MilcbiAgICBpZiAob2JqZWN0S2V5czEubGVuZ3RoICE9PSBvYmplY3RLZXlzMi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIG9iamVjdEtleXMxKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlMSA9IG9iamVjdDFba2V5IGFzIGtleW9mIHR5cGVvZiBvYmplY3QxXVxuICAgICAgICBjb25zdCB2YWx1ZTIgPSBvYmplY3QyW2tleSBhcyBrZXlvZiB0eXBlb2Ygb2JqZWN0MV1cbiAgICAgICAgY29uc3QgaXNCb3RoQXJlT2JqZWN0cyA9IGlzT2JqZWN0KHZhbHVlMSkgJiYgaXNPYmplY3QodmFsdWUyKVxuICAgICAgICBpZiAoKGlzQm90aEFyZU9iamVjdHMgJiYgIU9iamVjdHNBcmVFcXVhbCh2YWx1ZTEsIHZhbHVlMikpIHx8ICghaXNCb3RoQXJlT2JqZWN0cyAmJiB2YWx1ZTEgIT09IHZhbHVlMikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBnZXRQbGF0Zm9ybVZlcnNpb24gPSBvMTF5RXJyb3JIYW5kbGVyKGZ1bmN0aW9uIGdldFBsYXRmb3JtVmVyc2lvbihjYXBzOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMsIHVzZXJDYXBzOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpIHtcbiAgICBpZiAoIWNhcHMgJiYgIXVzZXJDYXBzKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCBic3RhY2tPcHRpb25zID0gKHVzZXJDYXBzKT8uWydic3RhY2s6b3B0aW9ucyddXG4gICAgY29uc3Qga2V5cyA9IFsncGxhdGZvcm1WZXJzaW9uJywgJ3BsYXRmb3JtX3ZlcnNpb24nLCAnb3NWZXJzaW9uJywgJ29zX3ZlcnNpb24nXVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAoY2Fwcz8uW2tleSBhcyBrZXlvZiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNdKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEdvdCAke2tleX0gZnJvbSBkcml2ZXIgY2Fwc2ApXG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKGNhcHM/LltrZXkgYXMga2V5b2YgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXSlcbiAgICAgICAgfSBlbHNlIGlmIChic3RhY2tPcHRpb25zICYmIGJzdGFja09wdGlvbnM/LltrZXkgYXMga2V5b2YgQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllc10pIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgR290ICR7a2V5fSBmcm9tIHVzZXIgYnN0YWNrIG9wdGlvbnNgKVxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhic3RhY2tPcHRpb25zPy5ba2V5IGFzIGtleW9mIENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXNdKVxuICAgICAgICB9IGVsc2UgaWYgKHVzZXJDYXBzW2tleSBhcyBrZXlvZiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNdKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEdvdCAke2tleX0gZnJvbSB1c2VyIGNhcHNgKVxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh1c2VyQ2Fwc1trZXkgYXMga2V5b2YgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXSlcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG59KVxuXG4vKipcbiAqIFJlc29sdmUgYSBzdGFibGUsIGh1bWFuLXJlYWRhYmxlIGRldmljZSBpZGVudGlmaWVyIGZvciB0aGVcbiAqIGBkZXZpY2VgIGZpZWxkIG9uIHRlc3RfcnVuIGludGVncmF0aW9ucyBwYXlsb2Fkcy5cbiAqXG4gKiBUZXN0SHViIGRlZHVwZXMgdGVzdF9ydW5zIGJ5IGEgaGFzaCB0aGF0IGluY2x1ZGVzIGBkZXZpY2VgLiBGb3JcbiAqIEFwcC1BdXRvbWF0ZSBmbG93cyB0aGF0IHBhc3MgYSByZWdleCBkZXZpY2UgcmVxdWVzdCAoZS5nLiBgLipQaXhlbC4qYClcbiAqIGFjcm9zcyBtdWx0aXBsZSBwbGF0Zm9ybXMsIHRoZSBTREsgcHJldmlvdXNseSBzZW50IHRoZSBpbnB1dCByZWdleFxuICogc3RyaW5nLCBjYXVzaW5nIHR3byBwYXJhbGxlbCBzZXNzaW9ucyBvbiBwaHlzaWNhbGx5IGRpZmZlcmVudCBkZXZpY2VzXG4gKiB0byBjb2xsaWRlIG9uIHRoZSBoYXNoIGFuZCBtZXJnZS4gVGhpcyBoZWxwZXIgcHJlZmVycyB0aGUgQXBwaXVtXG4gKiBzZXJ2ZXItcmVzb2x2ZWQgZmllbGRzIChgZGV2aWNlTW9kZWxgIC8gYGFwcGl1bTpkZXZpY2VNb2RlbGApIGJlZm9yZVxuICogZmFsbGluZyBiYWNrIHRvIHRoZSByZXF1ZXN0ZWQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIE11bHRpcmVtb3RlOiBgZHJpdmVyQ2Fwc2AgZm9yIGEgYE11bHRpUmVtb3RlQnJvd3NlcmAgaXMgYSBtYXAgb2ZcbiAqIGB7aW5zdGFuY2VOYW1lOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMsIFx1MjAyNn1gIHJhdGhlciB0aGFuIGZsYXQgY2FwcztcbiAqIHRoZSBoZWxwZXIgZGV0ZWN0cyB0aGF0IHNoYXBlIGFuZCB3YWxrcyBlYWNoIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBkcml2ZXJDYXBzIC0gbGl2ZSBkcml2ZXIgY2FwYWJpbGl0aWVzIChgYnJvd3Nlci5jYXBhYmlsaXRpZXNgKVxuICogICAgICAgICAgICAgICAgICAgICB3aGVyZSBBcHBpdW0gc2VydmVyLXJlc29sdmVkIGZpZWxkcyBhcmUgcG9wdWxhdGVkXG4gKiBAcGFyYW0gcmVxdWVzdGVkQ2FwcyAtIHVzZXItcmVxdWVzdGVkIGNhcGFiaWxpdGllcyAocnVubmVyIGNhcHMgLyB5bWwpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYXMgYSBmYWxsYmFja1xuICovXG5leHBvcnQgY29uc3QgZ2V0UmVzb2x2ZWREZXZpY2VOYW1lID0gbzExeUVycm9ySGFuZGxlcihmdW5jdGlvbiBnZXRSZXNvbHZlZERldmljZU5hbWUoXG4gICAgZHJpdmVyQ2Fwcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB8IFJlY29yZDxzdHJpbmcsIHsgY2FwYWJpbGl0aWVzPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIH0+LFxuICAgIHJlcXVlc3RlZENhcHM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfCBSZWNvcmQ8c3RyaW5nLCB7IGNhcGFiaWxpdGllcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9Pixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmxhdHRlbk11bHRpcmVtb3RlID0gKFxuICAgICAgICBjYXBzOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfCBSZWNvcmQ8c3RyaW5nLCB7IGNhcGFiaWxpdGllcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9PiB8IHVuZGVmaW5lZCxcbiAgICApOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNbXSA9PiB7XG4gICAgICAgIGlmICghY2Fwcykge3JldHVybiBbXX1cbiAgICAgICAgY29uc3Qgb2JqID0gY2FwcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICBpZiAob2JqLmRldmljZU1vZGVsIHx8IG9ialsnYXBwaXVtOmRldmljZU1vZGVsJ10gfHwgb2JqLmRldmljZU5hbWUgfHwgb2JqWydic3RhY2s6b3B0aW9ucyddKSB7XG4gICAgICAgICAgICAvLyBsb29rcyBsaWtlIGZsYXQgY2Fwc1xuICAgICAgICAgICAgcmV0dXJuIFtjYXBzIGFzIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc11cbiAgICAgICAgfVxuICAgICAgICAvLyBsb29rcyBsaWtlIGEgbXVsdGlyZW1vdGUgbWFwOiB7aW5zdGFuY2VOYW1lOiB7Y2FwYWJpbGl0aWVzOiB7Li4ufX19XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKG9iailcbiAgICAgICAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHsgY2FwYWJpbGl0aWVzPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIH0gPT5cbiAgICAgICAgICAgICAgICB2ICE9PSBudWxsICYmIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiAnY2FwYWJpbGl0aWVzJyBpbiAodiBhcyBvYmplY3QpKVxuICAgICAgICAgICAgLm1hcCh2ID0+IHYuY2FwYWJpbGl0aWVzIGFzIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcylcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VzOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNbXSA9IFtcbiAgICAgICAgLi4uZmxhdHRlbk11bHRpcmVtb3RlKGRyaXZlckNhcHMpLFxuICAgICAgICAuLi5mbGF0dGVuTXVsdGlyZW1vdGUocmVxdWVzdGVkQ2FwcyksXG4gICAgXVxuICAgIGlmICghc291cmNlcy5sZW5ndGgpIHtyZXR1cm4gdW5kZWZpbmVkfVxuXG4gICAgY29uc3QgcGlja1N0cmluZyA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSBvYmo/LltrZXldXG4gICAgICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi5sZW5ndGggPiAwID8gdiA6IHVuZGVmaW5lZFxuICAgIH1cbiAgICAvLyBQcmVjZWRlbmNlOiBwcmVmZXIgQXBwaXVtIHNlcnZlci1yZXNvbHZlZCBkZXZpY2VNb2RlbDsgZmFsbCBiYWNrIHRocm91Z2hcbiAgICAvLyByZXF1ZXN0ZWQgY2FwIHZhcmlhbnRzLiBgYnN0YWNrOm9wdGlvbnMuZGV2aWNlTmFtZWAgaXMgdGhlIHVzZXIncyByZWdleFxuICAgIC8vIGZvciBBcHAtQXV0b21hdGUgcnVucywga2VwdCBhcyBhIGZhbGxiYWNrIGZvciB0aGUgbm9uLXJlc29sdmVkIGNhc2UuXG4gICAgY29uc3QgcGF0aHM6IEFycmF5PChjOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gc3RyaW5nIHwgdW5kZWZpbmVkPiA9IFtcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGMsICdkZXZpY2VNb2RlbCcpLFxuICAgICAgICBjID0+IHBpY2tTdHJpbmcoYywgJ2FwcGl1bTpkZXZpY2VNb2RlbCcpLFxuICAgICAgICBjID0+IHBpY2tTdHJpbmcoY1snYnN0YWNrOm9wdGlvbnMnXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCwgJ2RldmljZU5hbWUnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGMsICdhcHBpdW06ZGV2aWNlTmFtZScpLFxuICAgICAgICBjID0+IHBpY2tTdHJpbmcoYywgJ2RldmljZU5hbWUnKSxcbiAgICBdXG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc3JjIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBwYXRoKHNyYyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgICAgaWYgKHYpIHtyZXR1cm4gdn1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG59KVxuXG5leHBvcnQgY29uc3QgZ2V0QmFzaWNBdXRoSGVhZGVyID0gKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBlbmNvZGVkQXV0aCA9IEJ1ZmZlci5mcm9tKGAke3VzZXJuYW1lfToke3Bhc3N3b3JkfWAsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgcmV0dXJuIGBCYXNpYyAke2VuY29kZWRBdXRofWBcbn1cblxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0RW1wdHkgPSAob2JqZWN0TmFtZTogdW5rbm93bikgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICAgIG9iamVjdE5hbWUgJiZcbiAgICAgICAgT2JqZWN0LmtleXMob2JqZWN0TmFtZSkubGVuZ3RoID09PSAwICYmXG4gICAgICAgIG9iamVjdE5hbWUuY29uc3RydWN0b3IgPT09IE9iamVjdFxuICAgIClcbn1cblxuZXhwb3J0IGNvbnN0IGdldEVycm9yU3RyaW5nID0gKGVycjogdW5rbm93bikgPT4ge1xuICAgIGlmICghZXJyKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAgZXJyIC8vIHdvcmtzLCBgZWAgbmFycm93ZWQgdG8gc3RyaW5nXG4gICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyLm1lc3NhZ2UgLy8gd29ya3MsIGBlYCBuYXJyb3dlZCB0byBFcnJvclxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlU3RyaW5nKGZpZWxkOiBzdHJpbmcsIHRydW5jYXRlU2l6ZUluQnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYnVmZmVyU2l6ZUluQnl0ZXMgPSBCdWZmZXIuZnJvbShHSVRfTUVUQV9EQVRBX1RSVU5DQVRFRCkubGVuZ3RoXG5cbiAgICAgICAgY29uc3QgZmllbGRCdWZmZXJPYmogPSBCdWZmZXIuZnJvbShmaWVsZClcbiAgICAgICAgY29uc3QgbGVuT2ZGaWVsZEJ1ZmZlck9iaiA9IGZpZWxkQnVmZmVyT2JqLmxlbmd0aFxuICAgICAgICBjb25zdCBmaW5hbExlbiA9IE1hdGguY2VpbChsZW5PZkZpZWxkQnVmZmVyT2JqIC0gdHJ1bmNhdGVTaXplSW5CeXRlcyAtIGJ1ZmZlclNpemVJbkJ5dGVzKVxuICAgICAgICBpZiAoZmluYWxMZW4gPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB0cnVuY2F0ZWRTdHJpbmcgPSBmaWVsZEJ1ZmZlck9iai5zdWJhcnJheSgwLCBmaW5hbExlbikudG9TdHJpbmcoKSArIEdJVF9NRVRBX0RBVEFfVFJVTkNBVEVEXG4gICAgICAgICAgICByZXR1cm4gdHJ1bmNhdGVkU3RyaW5nXG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIHdoaWxlIHRydW5jYXRpbmcgZmllbGQsIG5vdGhpbmcgd2FzIHRydW5jYXRlZCBoZXJlOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiBmaWVsZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2l6ZU9mSnNvbk9iamVjdEluQnl0ZXMoanNvbkRhdGE6IEdpdE1ldGFEYXRhKTogbnVtYmVyIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShqc29uRGF0YSkpXG5cbiAgICAgICAgcmV0dXJuIGJ1ZmZlci5sZW5ndGhcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFNvbWV0aGluZyB3ZW50IHdyb25nIHdoaWxlIGNhbGN1bGF0aW5nIHNpemUgb2YgSlNPTiBvYmplY3Q6ICR7ZXJyb3J9YClcbiAgICB9XG5cbiAgICByZXR1cm4gLTFcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQW5kVHJ1bmNhdGVWQ1NJbmZvKGdpdE1ldGFEYXRhOiBHaXRNZXRhRGF0YSk6IEdpdE1ldGFEYXRhIHtcbiAgICBjb25zdCBnaXRNZXRhRGF0YVNpemVJbkJ5dGVzID0gZ2V0U2l6ZU9mSnNvbk9iamVjdEluQnl0ZXMoZ2l0TWV0YURhdGEpXG5cbiAgICBpZiAoZ2l0TWV0YURhdGFTaXplSW5CeXRlcyAmJiBnaXRNZXRhRGF0YVNpemVJbkJ5dGVzID4gTUFYX0dJVF9NRVRBX0RBVEFfU0laRV9JTl9CWVRFUykge1xuICAgICAgICBjb25zdCB0cnVuY2F0ZVNpemUgPSBnaXRNZXRhRGF0YVNpemVJbkJ5dGVzIC0gTUFYX0dJVF9NRVRBX0RBVEFfU0laRV9JTl9CWVRFU1xuICAgICAgICBjb25zdCB0cnVuY2F0ZWRDb21taXRNZXNzYWdlID0gdHJ1bmNhdGVTdHJpbmcoZ2l0TWV0YURhdGEuY29tbWl0X21lc3NhZ2UsIHRydW5jYXRlU2l6ZSlcbiAgICAgICAgZ2l0TWV0YURhdGEuY29tbWl0X21lc3NhZ2UgPSB0cnVuY2F0ZWRDb21taXRNZXNzYWdlXG4gICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGBUaGUgY29tbWl0IGhhcyBiZWVuIHRydW5jYXRlZC4gU2l6ZSBvZiBjb21taXQgYWZ0ZXIgdHJ1bmNhdGlvbiBpcyAkeyBnZXRTaXplT2ZKc29uT2JqZWN0SW5CeXRlcyhnaXRNZXRhRGF0YSkgLyAxMDI0IH0gS0JgKVxuICAgIH1cblxuICAgIHJldHVybiBnaXRNZXRhRGF0YVxufVxuXG5leHBvcnQgY29uc3QgaGFzQnJvd3Nlck5hbWUgPSAoY2FwOiBDYXBhYmlsaXRpZXMuV2ViZHJpdmVySU9Db25maWcpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIWNhcCB8fCAhY2FwLmNhcGFiaWxpdGllcykge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgYnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzID0gY2FwLmNhcGFiaWxpdGllcyBhcyBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzXG4gICAgcmV0dXJuIGJyb3dzZXJTdGFja0NhcGFiaWxpdGllcy5icm93c2VyTmFtZSAhPT0gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBpc1ZhbGlkQ2Fwc0ZvckhlYWxpbmcgPSAoY2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzKTogYm9vbGVhbiA9PiB7XG5cbiAgICAvLyBHZXQgYWxsIGNhcGFiaWxpdHkgdmFsdWVzXG4gICAgY29uc3QgY2FwVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhjYXBzKVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBjYXBhYmlsaXRpZXMgYW5kIGlmIGF0IGxlYXN0IG9uZSBoYXMgYSBicm93c2VyIG5hbWVcbiAgICByZXR1cm4gY2FwVmFsdWVzLmxlbmd0aCA+IDAgJiYgY2FwVmFsdWVzLnNvbWUoaGFzQnJvd3Nlck5hbWUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1R1cmJvU2NhbGUob3B0aW9uczogKEJyb3dzZXJzdGFja0NvbmZpZyAmIEJyb3dzZXJzdGFja09wdGlvbnMpIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4ob3B0aW9ucz8udHVyYm9TY2FsZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2VydmFiaWxpdHlQcm9kdWN0KG9wdGlvbnM6IChCcm93c2Vyc3RhY2tDb25maWcgJiBCcm93c2Vyc3RhY2tPcHRpb25zKSB8IHVuZGVmaW5lZCwgaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGlzQXBwQXV0b21hdGVcbiAgICAgICAgPyAnYXBwLWF1dG9tYXRlJ1xuICAgICAgICA6IChpc1R1cmJvU2NhbGUob3B0aW9ucykgPyAndHVyYm9zY2FsZScgOiAnYXV0b21hdGUnKVxufVxuXG50eXBlIFBvbGxpbmdSZXN1bHQgPSB7XG4gICAgZGF0YTogYW55O1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgbWVzc2FnZT86IHN0cmluZzsgLy8gT3B0aW9uYWwgbWVzc2FnZSBmb3IgdGltZW91dCBjYXNlc1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9sbEFwaShcbiAgICB1cmw6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICB1cHBlckxpbWl0OiBudW1iZXIsXG4gICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuKTogUHJvbWlzZTxQb2xsaW5nUmVzdWx0PiB7XG4gICAgcGFyYW1zLnRpbWVzdGFtcCA9IE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDEwMDApXG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBjdXJyZW50IHRpbWVzdGFtcCAke3BhcmFtcy50aW1lc3RhbXB9YClcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZUdldFJlcXVlc3QodXJsLCBwYXJhbXMsIGhlYWRlcnMpXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdQb2xsaW5nIHN1Y2NlZWRlZC4nLFxuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2UgJiYgZXJyb3IucmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRQb2xsVGltZSA9IHBhcnNlSW50KGVycm9yLnJlc3BvbnNlLmhlYWRlcnMuZ2V0KCduZXh0X3BvbGxfdGltZScpLCAxMCkgKiAxMDAwXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYHRpbWVJbk1pbGxpcyAke25leHRQb2xsVGltZX1gKVxuXG4gICAgICAgICAgICBpZiAoaXNOYU4obmV4dFBvbGxUaW1lKSkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdJbnZhbGlkIG9yIG1pc3NpbmcgYG5leHRQb2xsVGltZWAgaGVhZGVyLiBTdG9wcGluZyBwb2xsaW5nLicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGVycm9yLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIG5leHRQb2xsVGltZSBoZWFkZXIgdmFsdWUuIFBvbGxpbmcgc3RvcHBlZC4nLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZWxhcHNlZFRpbWUgPSBuZXh0UG9sbFRpbWUgLSBEYXRlLm5vdygpXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgYGVsYXBzZWRUaW1lICR7ZWxhcHNlZFRpbWV9IHRpbWVJbk1pbGxpcyAke25leHRQb2xsVGltZX0gdXBwZXJMaW1pdCAke3VwcGVyTGltaXR9YFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBpZiAobmV4dFBvbGxUaW1lID4gdXBwZXJMaW1pdCkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdQb2xsaW5nIHN0b3BwZWQgZHVlIHRvIHVwcGVyIHRpbWUgbGltaXQuJylcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogZXJyb3IucmVzcG9uc2UuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1BvbGxpbmcgc3RvcHBlZCBkdWUgdG8gdXBwZXIgdGltZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBQb2xsaW5nIGFnYWluIGluICR7ZWxhcHNlZFRpbWV9bXMgd2l0aCBwYXJhbXM6YCwgcGFyYW1zKVxuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZWxhcHNlZFRpbWUpKVxuICAgICAgICAgICAgcmV0dXJuIHBvbGxBcGkodXJsLCBwYXJhbXMsIGhlYWRlcnMsIHVwcGVyTGltaXQsIHN0YXJ0VGltZSlcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvci5yZXNwb25zZSkge1xuICAgICAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGVycm9yLnJlc3BvbnNlLnN0YXR1c1RleHRcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRXJyb3IgPSBKU09OLnBhcnNlKGVycm9yLnJlc3BvbnNlLmpzb24oKSlcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBwYXJzZWRFcnJvci5tZXNzYWdlXG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIHBhcnNpbmcgcG9sbEFwaSByZXF1ZXN0IGJvZHkgJHtlcnJvci5yZXNwb25zZS5ib2R5fWApXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ1Vua25vd24gZXJyb3InXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyB7XG4gICAgICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlLFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkOiAke2Vycm9yfWApXG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgaGVhZGVyczoge30sIG1lc3NhZ2U6ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLicgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBtYWtlR2V0UmVxdWVzdCh1cmw6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKVxuICAgIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaCgoa2V5KSA9PiB1cmxPYmouc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIHBhcmFtc1trZXldKSlcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsT2JqLnRvU3RyaW5nKCksIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgaGVhZGVycyxcbiAgICB9KVxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignUmVxdWVzdCBmYWlsZWQnKVxuICAgICAgICBlcnJvci5yZXNwb25zZSA9IHJlc3BvbnNlXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQWNjZXNzaWJpbGl0eVNjcmlwdDxSZXR1cm5UeXBlPihcbiAgICBicm93c2VyOiBhbnksXG4gICAgZm5Cb2R5OiBzdHJpbmcsXG4gICAgYXJnPzogdW5rbm93blxuKTogUHJvbWlzZTxSZXR1cm5UeXBlPiB7XG4gICAgcmV0dXJuIGJyb3dzZXIuZXhlY3V0ZShcbiAgICAgICAgYHJldHVybiAoZnVuY3Rpb24gKC4uLmJzdGFja1Nka0FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGJzdGFja1Nka0FyZ3NbMF07XG4gICAgICAgICAgICAgICAgYnN0YWNrU2RrQXJncy5wdXNoKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgICR7Zm5Cb2R5LnJlcGxhY2UoL2FyZ3VtZW50cy9nLCAnYnN0YWNrU2RrQXJncycpfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKCR7YXJnID8gSlNPTi5zdHJpbmdpZnkoYXJnKSA6ICcnfSlgXG4gICAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVIYXNoQ29kZUZyb21GaWVsZHMoZmllbGRzOiBBcnJheTxzdHJpbmcgfCBvYmplY3Q+KSB7XG4gICAgY29uc3Qgc2VyaWFsaXplID0gKHZhbHVlOiB7fSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgfVxuXG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IGZpZWxkcy5tYXAoc2VyaWFsaXplKS5qb2luKCd8JylcbiAgICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShzZXJpYWxpemVkKS5kaWdlc3QoJ2hleCcpXG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Qm9vbGVhblZhbHVlRnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIFsndHJ1ZSddLmluY2x1ZGVzKHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpKVxufVxuXG4vKipcbiAqIFNESy0zNzM3OiBDb2VyY2Ugc3RyaW5naWZpZWQgYm9vbGVhbnMgKCd0cnVlJy8nZmFsc2UnLCBhbnkgY2FzZSkgaW4gYSBmbGF0XG4gKiBvcHRpb25zIG9iamVjdCB0byByZWFsIGJvb2xlYW5zLCBsZWF2aW5nIGV2ZXJ5IG90aGVyIHZhbHVlIHVudG91Y2hlZC4gQm9vbGVhbi1cbiAqIHR5cGVkIGFjY2Vzc2liaWxpdHkgb3B0aW9ucyAoZS5nLiBhdXRvU2Nhbm5pbmcpIGFyZSBjb21tb25seSBzdXBwbGllZCBhc1xuICogc3RyaW5ncyBmcm9tIEpTIGNvbmZpZyAvIGVudjsgd2l0aG91dCBjb2VyY2lvbiB0aGV5IGZhaWwgVzNDIGNhcHMgdmFsaWRhdGlvblxuICogYW5kIGFyZSBzaWxlbnRseSBkcm9wcGVkLiBPbmx5IHRoZSBleGFjdCBzdHJpbmdzICd0cnVlJy8nZmFsc2UnIGFyZSBjb252ZXJ0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2VyY2VTdHJpbmdCb29sZWFuczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqXG4gICAgfVxuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGlzZWQgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgaWYgKG5vcm1hbGlzZWQgPT09ICd0cnVlJyB8fCBub3JtYWxpc2VkID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICAgICAgb3V0W2tleV0gPSBub3JtYWxpc2VkID09PSAndHJ1ZSdcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG91dFtrZXldID0gdmFsdWVcbiAgICB9XG4gICAgcmV0dXJuIG91dCBhcyBUXG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEga2V5IGlzIHNhZmUgdG8gdXNlIGZvciBvYmplY3QgcHJvcGVydHkgYXNzaWdubWVudCB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb25cbiAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIGNoZWNrXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgaXMgc2FmZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmZ1bmN0aW9uIGlzU2FmZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhbmdlcm91c0tleXMgPSBbJ19fcHJvdG9fXycsICdjb25zdHJ1Y3RvcicsICdwcm90b3R5cGUnXVxuICAgIHJldHVybiAhZGFuZ2Vyb3VzS2V5cy5pbmNsdWRlcyhrZXkpXG59XG5cbi8qKlxuICogVmFsaWRhdGUgYm9vbGVhbiB2YWx1ZSBmcm9tIG1peGVkIHR5cGVzIChib29sZWFuIG9yIHN0cmluZylcbiAqIE9ubHkgYWNjZXB0cyB0cnVlIGJvb2xlYW4gb3Igc3RyaW5nIFwidHJ1ZVwiIChjYXNlIGluc2Vuc2l0aXZlKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEVuYWJsZWRWYWx1ZSh2YWx1ZTogYm9vbGVhbiB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBnZXRCb29sZWFuVmFsdWVGcm9tU3RyaW5nKHZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVlcCh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLnNvdXJjZXM6IGFueVtdKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgaWYgKCFzb3VyY2VzLmxlbmd0aCkge3JldHVybiB0YXJnZXR9XG4gICAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpXG5cbiAgICBpZiAoaXNPYmplY3QodGFyZ2V0KSAmJiBpc09iamVjdChzb3VyY2UpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgLy8gU2tpcCBkYW5nZXJvdXMga2V5cyB0aGF0IGNvdWxkIGxlYWQgdG8gcHJvdG90eXBlIHBvbGx1dGlvblxuICAgICAgICAgICAgaWYgKCFpc1NhZmVLZXkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gc291cmNlW2tleV1cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFZhbHVlID0gdGFyZ2V0W2tleV1cblxuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHNvdXJjZVZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0VmFsdWUgfHwgIWlzT2JqZWN0KHRhcmdldFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1lcmdlRGVlcCh0YXJnZXRba2V5XSwgc291cmNlVmFsdWUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlVmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZURlZXAodGFyZ2V0LCAuLi5zb3VyY2VzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDaHJvbWVPcHRpb25zKGJhc2U6IENhcGFiaWxpdGllcy5DaHJvbWVPcHRpb25zLCBvdmVycmlkZTogUGFydGlhbDxDYXBhYmlsaXRpZXMuQ2hyb21lT3B0aW9ucz4pOiBDYXBhYmlsaXRpZXMuQ2hyb21lT3B0aW9ucyB7XG4gICAgY29uc3QgbWVyZ2VkOiBDYXBhYmlsaXRpZXMuQ2hyb21lT3B0aW9ucyA9IHsgLi4uYmFzZSB9XG5cbiAgICBpZiAob3ZlcnJpZGUuYXJncykge1xuICAgICAgICBtZXJnZWQuYXJncyA9IFsuLi4oYmFzZS5hcmdzIHx8IFtdKSwgLi4ub3ZlcnJpZGUuYXJnc11cbiAgICB9XG5cbiAgICBpZiAob3ZlcnJpZGUuZXh0ZW5zaW9ucykge1xuICAgICAgICBtZXJnZWQuZXh0ZW5zaW9ucyA9IFsuLi4oYmFzZS5leHRlbnNpb25zIHx8IFtdKSwgLi4ub3ZlcnJpZGUuZXh0ZW5zaW9uc11cbiAgICB9XG5cbiAgICBpZiAob3ZlcnJpZGUucHJlZnMpIHtcbiAgICAgICAgbWVyZ2VkLnByZWZzID0gbWVyZ2VEZWVwKHsgLi4uKGJhc2UucHJlZnMgfHwge30pIH0sIG92ZXJyaWRlLnByZWZzKVxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bGxPckVtcHR5KHN0cmluZzogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFzdHJpbmcgfHwgc3RyaW5nLnRyaW0oKSA9PT0gJydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSGFzaChlbnRpdHk6IGFueSkge1xuICAgIHJldHVybiBCb29sZWFuKGVudGl0eSAmJiB0eXBlb2YoZW50aXR5KSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZW50aXR5KSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5lc3RlZEtleVZhbHVlKGhhc2g6IGFueSwga2V5czogQXJyYXk8c3RyaW5nPikge1xuICAgIHJldHVybiBrZXlzLnJlZHVjZSgoaGFzaCwga2V5KSA9PiAoaXNIYXNoKGhhc2gpID8gaGFzaFtrZXldIDogdW5kZWZpbmVkKSwgaGFzaClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURpcihkaXI6IHN0cmluZykge1xuICAgIGNvbnN0IGxpc3QgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5qb2luKGRpciwgbGlzdFtpXSlcbiAgICAgICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZpbGVuYW1lKVxuXG4gICAgICAgIGlmIChmaWxlbmFtZSA9PT0gJy4nIHx8IGZpbGVuYW1lID09PSAnLi4nKSB7XG4gICAgICAgICAgICAvLyBwYXNzIHRoZXNlIGZpbGVzXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAvLyBybWRpciByZWN1cnNpdmVseVxuICAgICAgICAgICAgcmVtb3ZlRGlyKGZpbGVuYW1lKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcm0gZmlsZW5hbWVcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmMoZmlsZW5hbWUpXG4gICAgICAgIH1cbiAgICB9XG4gICAgZnMucm1kaXJTeW5jKGRpcilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpcihkaXI6IHN0cmluZykge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpcikpe1xuICAgICAgICByZW1vdmVEaXIoZGlyKVxuICAgIH1cbiAgICBmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXcml0YWJsZShkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICBmcy5hY2Nlc3NTeW5jKGRpclBhdGgsIGZzLmNvbnN0YW50cy5XX09LKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRSZWFkV3JpdGVBY2Nlc3MoZGlyUGF0aDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgZnMuY2htb2RTeW5jKGRpclBhdGgsIDBvNjY2KVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYERpcmVjdG9yeSAke2RpclBhdGh9IGlzIG5vdyByZWFkL3dyaXRlIGFjY2Vzc2libGUuYClcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBzZXQgZGlyZWN0b3J5IGFjY2VzczogJHtlcnIuc3RhY2t9YClcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2NoYVRlc3RIaWVyYXJjaHkodGVzdDogRnJhbWV3b3Jrcy5UZXN0KSB7XG4gICAgY29uc3QgdmFsdWU6IHN0cmluZ1tdID0gW11cbiAgICBpZiAodGVzdC5jdHggJiYgdGVzdC5jdHgudGVzdCkge1xuICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHBhcmVudCBvYmplY3QsIHV0aWxpemUgaXQgZWxzZSBnZXQgZnJvbSBjb250ZXh0XG4gICAgICAgIGxldCBwYXJlbnQgPSB0eXBlb2YgdGVzdC5wYXJlbnQgPT09ICdvYmplY3QnID8gdGVzdC5wYXJlbnQgOiB0ZXN0LmN0eC50ZXN0LnBhcmVudFxuICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC50aXRsZSAhPT0gJycpIHtcbiAgICAgICAgICAgIHZhbHVlLnB1c2gocGFyZW50LnRpdGxlKVxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudFxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0ZXN0LmRlc2NyaXB0aW9uICYmIHRlc3QuZnVsbE5hbWUpIHtcbiAgICAgICAgLy8gZm9yIEphc21pbmVcbiAgICAgICAgdmFsdWUucHVzaCh0ZXN0LmRlc2NyaXB0aW9uKVxuICAgICAgICAvLyBTdHJpcCB0aGUgdHJhaWxpbmcgXCIgPGRlc2NyaXB0aW9uPlwiIHN1ZmZpeCB3aXRob3V0IGJ1aWxkaW5nIGEgcmVnZXggZnJvbVxuICAgICAgICAvLyBhIHZhcmlhYmxlIChhdm9pZHMgUmVEb1MgYW5kIHJlZ2V4LW1ldGFjaGFyYWN0ZXIgbWlzbWF0Y2hlcyBpbiBkZXNjcmlwdGlvbnMpLlxuICAgICAgICBjb25zdCBkZXNjU3VmZml4ID0gYCAke3Rlc3QuZGVzY3JpcHRpb259YFxuICAgICAgICB2YWx1ZS5wdXNoKHRlc3QuZnVsbE5hbWUuZW5kc1dpdGgoZGVzY1N1ZmZpeCkgPyB0ZXN0LmZ1bGxOYW1lLnNsaWNlKDAsIC1kZXNjU3VmZml4Lmxlbmd0aCkgOiB0ZXN0LmZ1bGxOYW1lKVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWUucmV2ZXJzZSgpXG59XG5cbi8qKlxuICogVHJ1ZSBvbmx5IGZvciB0aGUgaHViLWludGVycHJldGVkIGBicm93c2Vyc3RhY2tfZXhlY3V0b3I6IHtcdTIwMjZ9YCBtYWdpYyBzdHJpbmcuXG4gKiBBbmNob3JlZCB0byB0aGUgc3RhcnQgKGxlYWRpbmcgd2hpdGVzcGFjZSB0b2xlcmF0ZWQpIGFuZCBjYXNlLXNlbnNpdGl2ZSwgbWF0Y2hpbmdcbiAqIGhvdyB0aGUgaHViIHJlYWRzIHRoZSBwYXlsb2FkIFx1MjAxNCBhIHBsYWluIHNjcmlwdCBtZXJlbHkgbWVudGlvbmluZyB0aGUgdG9rZW4gbXVzdCBub3RcbiAqIGJlIHJlcm91dGVkIG9mZiBpdHMgbm9ybWFsIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQnJvd3NlcnN0YWNrRXhlY3V0b3JTY3JpcHQgPSAoc2NyaXB0OiB1bmtub3duKTogc2NyaXB0IGlzIHN0cmluZyA9PlxuICAgIHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC50cmltU3RhcnQoKS5zdGFydHNXaXRoKCdicm93c2Vyc3RhY2tfZXhlY3V0b3I6JylcblxuZXhwb3J0IGNvbnN0IHBlcmZvcm1PMTF5U3luYyA9IGFzeW5jIChicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyKSA9PiB7XG4gICAgaWYgKGlzQnJvd3NlcnN0YWNrU2Vzc2lvbihicm93c2VyKSkge1xuICAgICAgICBhd2FpdCBicm93c2VyLmV4ZWN1dGUoYGJyb3dzZXJzdGFja19leGVjdXRvcjogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBhY3Rpb246ICdhbm5vdGF0ZScsXG4gICAgICAgICAgICBhcmd1bWVudHM6IHtcbiAgICAgICAgICAgICAgICBkYXRhOiBgT2JzZXJ2YWJpbGl0eVN5bmM6JHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdkZWJ1ZydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSl9YClcbiAgICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjYXBhYmlsaXRpZXMgcmVwcmVzZW50IGEgbXVsdGlyZW1vdGUgY29uZmlndXJhdGlvblxuICogQHBhcmFtIGNhcGFiaWxpdGllcyAtIFRoZSBjYXBhYmlsaXRpZXMgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHRydWUgaWYgY2FwYWJpbGl0aWVzIHJlcHJlc2VudCBhbnkgbXVsdGlyZW1vdGUgY29uZmlndXJhdGlvbiAocmVndWxhciBvciBwYXJhbGxlbClcbiAqXG4gKiBAZXhhbXBsZVxuICogUmVndWxhciBtdWx0aXJlbW90ZSAob2JqZWN0KTpcbiAqIHsgYnJvd3NlckE6IHsgY2FwYWJpbGl0aWVzOiB7Li4ufSB9LCBicm93c2VyQjogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0gfVxuICpcbiAqIFBhcmFsbGVsIG11bHRpcmVtb3RlIChhcnJheSB3aXRoIG5lc3RlZCBzdHJ1Y3R1cmUpOlxuICogW3sgYnJvd3NlckE6IHsgY2FwYWJpbGl0aWVzOiB7Li4ufSB9LCBicm93c2VyQjogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0gfV1cbiAqXG4gKiBSZWd1bGFyIGNhcGFiaWxpdGllcyAoYXJyYXkpOlxuICogW3sgYnJvd3Nlck5hbWU6ICdjaHJvbWUnLCAuLi4gfV1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlSZW1vdGVDYXBzKGNhcGFiaWxpdGllczogQ2FwYWJpbGl0aWVzLlRlc3RydW5uZXJDYXBhYmlsaXRpZXMpOiBib29sZWFuIHtcbiAgICAvLyBSZWd1bGFyIG11bHRpcmVtb3RlIGlzIGFuIG9iamVjdCAobm90IGFycmF5KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShjYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gRW1wdHkgYXJyYXkgaXMgbm90IG11bHRpcmVtb3RlXG4gICAgaWYgKGNhcGFiaWxpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gUGFyYWxsZWwgbXVsdGlyZW1vdGUgaXMgYW4gYXJyYXkgd2l0aCBuZXN0ZWQgY2FwYWJpbGl0aWVzIHN0cnVjdHVyZVxuICAgIHJldHVybiBjYXBhYmlsaXRpZXMuZXZlcnkoY2FwID0+XG4gICAgICAgIE9iamVjdC52YWx1ZXMoY2FwKS5sZW5ndGggPiAwICYmXG4gICAgICAgIE9iamVjdC52YWx1ZXMoY2FwKS5ldmVyeShjID0+IGMgIT09IG51bGwgJiYgdHlwZW9mIGMgPT09ICdvYmplY3QnICYmIChjIGFzIHsgY2FwYWJpbGl0aWVzOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfSkuY2FwYWJpbGl0aWVzKVxuICAgIClcbn1cbiIsICJpbXBvcnQgVHJhbnNwb3J0IGZyb20gJ3dpbnN0b24tdHJhbnNwb3J0J1xuXG5jb25zdCBMT0dfTEVWRUxTID0ge1xuICAgIElORk86ICdJTkZPJywgRVJST1I6ICdFUlJPUicsIERFQlVHOiAnREVCVUcnLCBUUkFDRTogJ1RSQUNFJywgV0FSTjogJ1dBUk4nLFxufVxuXG5jbGFzcyBsb2dQYXRjaGVyIGV4dGVuZHMgVHJhbnNwb3J0IHtcbiAgICBsb2dUb1Rlc3RPcHMgPSAobGV2ZWwgPSBMT0dfTEVWRUxTLklORk8sIG1lc3NhZ2UgPSBbJyddIGFzIHVua25vd25bXSkgPT4ge1xuICAgICAgICAocHJvY2Vzcy5lbWl0IGFzIEZ1bmN0aW9uKShgYnM6YWRkTG9nOiR7cHJvY2Vzcy5waWR9YCwge1xuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICBsZXZlbDogbGV2ZWwudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBcIiR7bWVzc2FnZS5qb2luKCcsICcpfVwiYCxcbiAgICAgICAgICAgIGtpbmQ6ICdURVNUX0xPRycsXG4gICAgICAgICAgICBodHRwX3Jlc3BvbnNlOiB7fVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qIFBhdGNoaW5nIHRoaXMgd291bGQgc2hvdyB1c2VyIGFuIGV4dGVuZGVkIHRyYWNlIG9uIHRoZWlyIGNsaSAqL1xuICAgIHRyYWNlID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLlRSQUNFLCBtZXNzYWdlKVxuICAgIH1cblxuICAgIGRlYnVnID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLkRFQlVHLCBtZXNzYWdlKVxuICAgIH1cblxuICAgIGluZm8gPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuSU5GTywgbWVzc2FnZSlcbiAgICB9XG5cbiAgICB3YXJuID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLldBUk4sIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgZXJyb3IgPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuRVJST1IsIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgbG9nID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLklORk8sIG1lc3NhZ2UpXG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgbG9nUGF0Y2hlclxuIiwgImltcG9ydCB7IGNyZWF0ZU9iamVjdENzdldyaXRlciB9IGZyb20gJ2Nzdi13cml0ZXInXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBmc1Byb21pc2UgZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB0eXBlIHsgRW50cnlUeXBlIH0gZnJvbSAnbm9kZTpwZXJmX2hvb2tzJ1xuaW1wb3J0IHsgcGVyZm9ybWFuY2UsIFBlcmZvcm1hbmNlT2JzZXJ2ZXIgfSBmcm9tICdub2RlOnBlcmZfaG9va3MnXG5pbXBvcnQgdXRpbCBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgd29ya2VyIGZyb20gJ25vZGU6d29ya2VyX3RocmVhZHMnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgeyBhcmNoLCBob3N0bmFtZSwgcGxhdGZvcm0sIHR5cGUsIHZlcnNpb24gfSBmcm9tICdub2RlOm9zJ1xuXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi8uLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgeyBQRVJGX01FQVNVUkVNRU5UX0VOViB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuLi8uLi9jbGkvYXBpVXRpbHMuanMnXG5pbXBvcnQgeyBDTElVdGlscyB9IGZyb20gJy4uLy4uL2NsaS9jbGlVdGlscy5qcydcbmltcG9ydCB7IEVWRU5UUyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IGZldGNoV3JhcCBmcm9tICcuLi8uLi9mZXRjaFdyYXBwZXIuanMnXG5pbXBvcnQgdHlwZSB7IENzdldyaXRlciB9IGZyb20gJ2Nzdi13cml0ZXIvc3JjL2xpYi9jc3Ytd3JpdGVyLmpzJ1xuaW1wb3J0IHR5cGUgeyBPYmplY3RNYXAgfSBmcm9tICdjc3Ytd3JpdGVyL3NyYy9saWIvbGFuZy9vYmplY3QuanMnXG5pbXBvcnQgdHlwZSB7IEJyb3dzZXIgfSBmcm9tICd3ZWJkcml2ZXJpbydcblxuLy8gVGVsZW1ldHJ5IG11c3QgbmV2ZXIgdGhyb3cgaW50byBidXNpbmVzcyBsb2dpYy4gTm9kZSAxOCdzIHBlcmZfaG9va3MgcmVqZWN0c1xuLy8gbmVnYXRpdmUgdGltZXN0YW1wcyAoZS5nLiBwZXJmb3JtYW5jZS5ub3coKSB1bmRlciBmYWtlZCB0aW1lcnMsIG9yIGFueSBvdGhlclxuLy8gZWRnZSkgd2l0aCBFUlJfUEVSRk9STUFOQ0VfSU5WQUxJRF9USU1FU1RBTVA7IE5vZGUgMjArIHRvbGVyYXRlcyB0aGVtLiBXcmFwcGluZ1xuLy8gbWFyay9tZWFzdXJlIGtlZXBzIGFuIGluc3RydW1lbnRhdGlvbiBmYWlsdXJlIGZyb20gYnJlYWtpbmcgYSBjYWxsZXIncyBob29rXG4vLyAoZS5nLiBhIHNlcnZpY2UgYmVmb3JlKCkpLCBhbmQgaXMgYSBuby1vcCBvbiB0aGUgaGFwcHkgcGF0aC5cbmZ1bmN0aW9uIHNhZmVNYXJrKG1hcmtOYW1lOiBzdHJpbmcpIHtcbiAgICB0cnkgeyBwZXJmb3JtYW5jZS5tYXJrKG1hcmtOYW1lKSB9IGNhdGNoIHsgLyogaW5zdHJ1bWVudGF0aW9uIG11c3Qgbm90IHRocm93ICovIH1cbn1cbmZ1bmN0aW9uIHNhZmVNZWFzdXJlKG1lYXN1cmVOYW1lOiBzdHJpbmcsIHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nKSB7XG4gICAgdHJ5IHsgcGVyZm9ybWFuY2UubWVhc3VyZShtZWFzdXJlTmFtZSwgc3RhcnQsIGVuZCkgfSBjYXRjaCB7IC8qIGluc3RydW1lbnRhdGlvbiBtdXN0IG5vdCB0aHJvdyAqLyB9XG59XG5cbnR5cGUgUGVyZm9ybWFuY2VEZXRhaWxzID0ge1xuICAgIHN1Y2Nlc3M/OiB0cnVlLFxuICAgIGZhaWx1cmU/OiBzdHJpbmcsXG4gICAgdGVzdE5hbWU/OiBzdHJpbmcsXG4gICAgd29ya2VyPzogc3RyaW5nIHwgbnVtYmVyLFxuICAgIGNsaWVudFdvcmtlcklkPzogc3RyaW5nLFxuICAgIGNvbW1hbmQ/OiBzdHJpbmcsXG4gICAgaG9va1R5cGU/OiBzdHJpbmcsXG4gICAgcGxhdGZvcm0/OiBzdHJpbmcgfCBudW1iZXJcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVyZm9ybWFuY2VUZXN0ZXIge1xuICAgIHN0YXRpYyBfb2JzZXJ2ZXI6IFBlcmZvcm1hbmNlT2JzZXJ2ZXJcbiAgICBzdGF0aWMgX2NzdldyaXRlcjogQ3N2V3JpdGVyPE9iamVjdE1hcDx7fT4+XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2V2ZW50czogUGVyZm9ybWFuY2VFbnRyeVtdID0gW11cbiAgICBwcml2YXRlIHN0YXRpYyBfbWVhc3VyZWRFdmVudHM6IEFycmF5PFBlcmZvcm1hbmNlRW50cnkgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSBbXVxuICAgIHByaXZhdGUgc3RhdGljIF9oYXNTdG9wcGVkR2VuZXJhdGlvbiA9IGZhbHNlXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3N0b3BHZW5lcmF0ZUNhbGxDb3VudCA9IDBcbiAgICBzdGF0aWMgc3RhcnRlZCA9IGZhbHNlXG4gICAgc3RhdGljIGRldGFpbHM6IHsgW2tleTogc3RyaW5nXTogUGVyZm9ybWFuY2VEZXRhaWxzIH0gPSB7fVxuICAgIHN0YXRpYyBldmVudHNNYXA6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fVxuICAgIHN0YXRpYyBicm93c2VyPzogQnJvd3NlclxuICAgIHN0YXRpYyBzY2VuYXJpb1RoYXRSYW46IHN0cmluZ1tdXG4gICAgc3RhdGljIGpzb25SZXBvcnREaXJOYW1lID0gJ3BlcmZvcm1hbmNlLXJlcG9ydCdcbiAgICBzdGF0aWMganNvblJlcG9ydERpclBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnLCB0aGlzLmpzb25SZXBvcnREaXJOYW1lKVxuICAgIHN0YXRpYyBqc29uUmVwb3J0RmlsZU5hbWUgPSBgJHt0aGlzLmpzb25SZXBvcnREaXJQYXRofS9wZXJmb3JtYW5jZS1yZXBvcnQtJHtQZXJmb3JtYW5jZVRlc3Rlci5nZXRQcm9jZXNzSWQoKX0uanNvbmBcblxuICAgIHN0YXRpYyBzdGFydE1vbml0b3JpbmcoY3N2TmFtZTogc3RyaW5nID0gJ3BlcmZvcm1hbmNlLXJlcG9ydC5jc3YnKSB7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHBlcmZvcm1hbmNlLXJlcG9ydCBkaXIgaWYgbm90IGV4aXN0cyBhbHJlYWR5XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmpzb25SZXBvcnREaXJQYXRoKSkge1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuanNvblJlcG9ydERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXIgPSBuZXcgUGVyZm9ybWFuY2VPYnNlcnZlcihsaXN0ID0+IHtcbiAgICAgICAgICAgIGxpc3QuZ2V0RW50cmllcygpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmVudHJ5VHlwZSA9PT0gJ21lYXN1cmUnKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsRW50cnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gZW50cnkudG9KU09OKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaW5hbEVudHJ5LnN0YXJ0VGltZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydFRpbWUgPSBmaW5hbEVudHJ5LnN0YXJ0VGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsRW50cnkuc3RhcnRUaW1lID0gcGVyZm9ybWFuY2UudGltZU9yaWdpbiArIGZpbmFsRW50cnkuc3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUaW1lc3RhbXAgY29udmVyc2lvbiBmb3IgJHtlbnRyeS5uYW1lfTogJHtvcmlnaW5hbFN0YXJ0VGltZX0gLT4gJHtmaW5hbEVudHJ5LnN0YXJ0VGltZX0gKHRpbWVPcmlnaW46ICR7cGVyZm9ybWFuY2UudGltZU9yaWdpbn0pYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBjb252ZXJ0aW5nIHN0YXJ0VGltZSB0byBlcG9jaDogJHt1dGlsLmZvcm1hdChlKX1gKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV0YWlsc1tlbnRyeS5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxFbnRyeSA9IE9iamVjdC5hc3NpZ24oZmluYWxFbnRyeSwgdGhpcy5kZXRhaWxzW2VudHJ5Lm5hbWVdKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRldGFpbHNbZW50cnkubmFtZV1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZWRFdmVudHMucHVzaChmaW5hbEVudHJ5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgICAgICBsaXN0LmdldEVudHJpZXMoKS5mb3JFYWNoKChlbnRyeSkgPT4gdGhpcy5fZXZlbnRzLnB1c2goZW50cnkpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBlbnRyeVR5cGVzOiBFbnRyeVR5cGVbXSA9IFsnbWVhc3VyZSddXG4gICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZXMucHVzaCgnZnVuY3Rpb24nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUoeyBidWZmZXJlZDogdHJ1ZSwgZW50cnlUeXBlczogZW50cnlUeXBlcyB9KVxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlXG4gICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgIHRoaXMuX2NzdldyaXRlciA9IGNyZWF0ZU9iamVjdENzdldyaXRlcih7XG4gICAgICAgICAgICAgICAgcGF0aDogY3N2TmFtZSxcbiAgICAgICAgICAgICAgICBoZWFkZXI6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBpZDogJ25hbWUnLCB0aXRsZTogJ0Z1bmN0aW9uIE5hbWUnIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6ICd0aW1lJywgdGl0bGU6ICdFeGVjdXRpb24gVGltZSAobXMpJyB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBjYWxjdWxhdGVUaW1lcyhtZXRob2RzOiBzdHJpbmdbXSkgOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0aW1lczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgICAgIHRoaXMuX2V2ZW50cy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRpbWVzW2VudHJ5Lm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgdGltZXNbZW50cnkubmFtZV0gPSAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lc1tlbnRyeS5uYW1lXSArPSBlbnRyeS5kdXJhdGlvblxuICAgICAgICB9KVxuICAgICAgICBjb25zdCB0aW1lVGFrZW4gPSBtZXRob2RzLnJlZHVjZSgoYSwgYykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRpbWVzW2NdICsgKGEgfHwgMClcbiAgICAgICAgfSwgMClcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUaW1lIGZvciAke21ldGhvZHN9IGlzICR7dGltZVRha2VufWApXG4gICAgICAgIHJldHVybiB0aW1lVGFrZW5cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgc3RvcEFuZEdlbmVyYXRlKGZpbGVuYW1lOiBzdHJpbmcgPSAncGVyZm9ybWFuY2Utb3duLmh0bWwnKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnRzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHRoaXMuX21lYXN1cmVkRXZlbnRzKVxuICAgICAgICAgICAgLy8gcmVtb3ZlIGVuY2xvc2luZyBhcnJheSBhbmQgYWRkIGEgdHJhaWxpbmcgY29tbWEgc28gdGhhdCB3ZVxuICAgICAgICAgICAgLy8gZG9udCBuZWVkIHRvIGJvdGggcmVhZCBhbmQgdGhlbiB3cml0ZSB0aGUgZmlsZSwgd2UgY2FuIHVzZSBhcHBlbmQgaW5zdGVhZFxuICAgICAgICAgICAgY29uc3QgZmluYWxKU09OU3RyID0gZXZlbnRzSnNvbi5zbGljZSgxLCAtMSkgKyAnLCdcbiAgICAgICAgICAgIGF3YWl0IGZzUHJvbWlzZS5hcHBlbmRGaWxlKHRoaXMuanNvblJlcG9ydEZpbGVOYW1lLCBmaW5hbEpTT05TdHIpXG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEZhaWxlZCB0byB3cml0ZSBldmVudHMgb2YgdGhlIHdvcmtlciB0byAke3RoaXMuanNvblJlcG9ydEZpbGVOYW1lfTogJHt1dGlsLmZvcm1hdChlcil9YClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KClcblxuICAgICAgICBpZiAoIXByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIENTViBhbmQgSFRNTCByZXBvcnRzIHVzaW5nIGRpcmVjdGx5IGNvbGxlY3RlZCBldmVudHNcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNTVih0aGlzLl9ldmVudHMpXG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2VuZXJhdGVSZXBvcnQodGhpcy5fZXZlbnRzKVxuICAgICAgICBjb25zdCBkaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgZmlsZW5hbWUpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmc1Byb21pc2Uud3JpdGVGaWxlKGRpciwgY29udGVudClcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGBQZXJmb3JtYW5jZSByZXBvcnQgaXMgYXQgJHtwYXRofWApXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiB3cml0aW5nIGh0bWwgJHt1dGlsLmZvcm1hdChlcnIpfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2VuZXJhdGVSZXBvcnQoZW50cmllczogUGVyZm9ybWFuY2VFbnRyeVtdKSB7XG4gICAgICAgIGxldCBodG1sID0gJzwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPjx0aXRsZT5QZXJmb3JtYW5jZSBSZXBvcnQ8L3RpdGxlPjwvaGVhZD48Ym9keT4nXG4gICAgICAgIGh0bWwgKz0gJzxoMT5QZXJmb3JtYW5jZSBSZXBvcnQ8L2gxPidcbiAgICAgICAgaHRtbCArPSAnPHRhYmxlPjx0aGVhZD48dHI+PHRoPkZ1bmN0aW9uIE5hbWU8L3RoPjx0aD5EdXJhdGlvbiAobXMpPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PidcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaHRtbCArPSBgPHRyPjx0ZD4ke2VudHJ5Lm5hbWV9PC90ZD48dGQ+JHtlbnRyeS5kdXJhdGlvbn08L3RkPjwvdHI+YFxuICAgICAgICB9KVxuICAgICAgICBodG1sICs9ICc8L3Rib2R5PjwvdGFibGU+PC9ib2R5PjwvaHRtbD4nXG4gICAgICAgIHJldHVybiBodG1sXG4gICAgfVxuXG4gICAgc3RhdGljIGdlbmVyYXRlQ1NWKGVudHJpZXM6IFBlcmZvcm1hbmNlRW50cnlbXSkge1xuICAgICAgICBjb25zdCB0aW1lczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgICAgIGVudHJpZXMubWFwKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aW1lc1tlbnRyeS5uYW1lXSkge1xuICAgICAgICAgICAgICAgIHRpbWVzW2VudHJ5Lm5hbWVdID0gMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGltZXNbZW50cnkubmFtZV0gKz0gZW50cnkuZHVyYXRpb25cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICAgICAgICAgIHRpbWU6IGVudHJ5LmR1cmF0aW9uXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGRhdCA9IE9iamVjdC5lbnRyaWVzKHRpbWVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgdGltZTogdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5fY3N2V3JpdGVyLndyaXRlUmVjb3JkcyhkYXQpXG4gICAgICAgICAgICAudGhlbigoKSA9PiBCU3RhY2tMb2dnZXIuaW5mbygnUGVyZm9ybWFuY2UgQ1NWIHJlcG9ydCBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5JykpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihlcnJvcikpXG4gICAgfVxuXG4gICAgc3RhdGljIE1lYXN1cmUobGFiZWw6IHN0cmluZywgZGV0YWlsczogUGVyZm9ybWFuY2VEZXRhaWxzID0ge30pIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgICAgICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgICAgICAgICBkZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxGdW5jdGlvbj4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kOiBGdW5jdGlvbnx1bmRlZmluZWQgPSBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiguLi5hcmdzOiBvYmplY3RbXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZS5hcHBseShzZWxmLCBbbGFiZWwsIG9yaWdpbmFsTWV0aG9kIGFzIEZ1bmN0aW9uLCB7IG1ldGhvZE5hbWU6IGtleS50b1N0cmluZygpLCAuLi5kZXRhaWxzIH0sIGFyZ3MsIHRoaXNdKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBtZWFzdXJlV3JhcHBlcihuYW1lOiBzdHJpbmcsIGZuOiBGdW5jdGlvbiwgZGV0YWlsczogUGVyZm9ybWFuY2VEZXRhaWxzID0ge30pIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcblxuICAgICAgICBkZXRhaWxzLndvcmtlciA9IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpXG4gICAgICAgIGRldGFpbHMudGVzdE5hbWUgPSBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4gJiYgUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuW1BlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbi5sZW5ndGggLSAxXVxuICAgICAgICBkZXRhaWxzLnBsYXRmb3JtID0gUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkXG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzOiAob2JqZWN0fGJvb2xlYW58dW5kZWZpbmVkfG51bGx8c3RyaW5nKVtdKSB7XG5cbiAgICAgICAgICAgIHJldHVybiBzZWxmLm1lYXN1cmUobmFtZSwgZm4sIGRldGFpbHMsIGFyZ3MpXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHN0YXRpYyBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19TREtfSU5TVFJVTUVOVEFUSU9OID09PSAnZmFsc2UnKVxuICAgIH1cblxuICAgIHN0YXRpYyBtZWFzdXJlKGxhYmVsOiBzdHJpbmcsIGZuOiBGdW5jdGlvbiwgZGV0YWlscyA9IHt9LCBhcmdzPzogKG9iamVjdHxib29sZWFufHVuZGVmaW5lZHxudWxsfHN0cmluZylbXSwgdGhpc0FyZzogb2JqZWN0fG51bGwgPSBudWxsKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkIHx8ICF0aGlzLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIHVuaXF1ZSBtYXJrIG5hbWVzIGZvciB0aGlzIHNwZWNpZmljIGNhbGwgdG8gYXZvaWQgdGltaW5nIGNvbmZsaWN0c1xuICAgICAgICBjb25zdCB1bmlxdWVJZCA9IGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpfWBcbiAgICAgICAgY29uc3Qgc3RhcnRNYXJrID0gYCR7bGFiZWx9LXN0YXJ0LSR7dW5pcXVlSWR9YFxuICAgICAgICBjb25zdCBlbmRNYXJrID0gYCR7bGFiZWx9LWVuZC0ke3VuaXF1ZUlkfWBcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIHN0YXJ0IG1hcmsgd2l0aCB1bmlxdWUgSURcbiAgICAgICAgc2FmZU1hcmsoc3RhcnRNYXJrKVxuXG4gICAgICAgIC8vIFN0b3JlIGRldGFpbHMgd2l0aCBtZWFzdXJlbWVudCBjb250ZXh0XG4gICAgICAgIGNvbnN0IGRldGFpbHNXaXRoQ29udGV4dCA9IHtcbiAgICAgICAgICAgIC4uLmRldGFpbHMsXG4gICAgICAgICAgICBtZWFzdXJlbWVudElkOiB1bmlxdWVJZFxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbCA9IGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpXG5cbiAgICAgICAgICAgIGlmIChyZXR1cm5WYWwgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugc3BlY2lmaWMgbWFya3MgZm9yIHRoaXMgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVNYXJrKGVuZE1hcmspXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWlsc1tsYWJlbF0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZTogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50V29ya2VySWQ6IFBlcmZvcm1hbmNlVGVzdGVyLmdldENsaWVudFdvcmtlcklkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3ROYW1lOiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4/LnBvcCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZGV0YWlsc1dpdGhDb250ZXh0KSwgdGhpcy5kZXRhaWxzW2xhYmVsXSB8fCB7fSkpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHYpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlTWFyayhlbmRNYXJrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVNZWFzdXJlKGxhYmVsLCBzdGFydE1hcmssIGVuZE1hcmspXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldGFpbHNbbGFiZWxdID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlOiB1dGlsLmZvcm1hdChlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFdvcmtlcklkOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRDbGllbnRXb3JrZXJJZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybTogUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TmFtZTogUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuPy5wb3AoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN5bmNocm9ub3VzIGV4ZWN1dGlvblxuICAgICAgICAgICAgc2FmZU1hcmsoZW5kTWFyaylcbiAgICAgICAgICAgIHNhZmVNZWFzdXJlKGxhYmVsLCBzdGFydE1hcmssIGVuZE1hcmspXG5cbiAgICAgICAgICAgIHRoaXMuZGV0YWlsc1tsYWJlbF0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGZhaWx1cmU6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbj8ucG9wKClcbiAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsXG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBzYWZlTWFyayhlbmRNYXJrKVxuICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgdGhpcy5kZXRhaWxzW2xhYmVsXSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWx1cmU6IHV0aWwuZm9ybWF0KGVyKVxuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbj8ucG9wKClcbiAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICB0aHJvdyBlclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHN0YXJ0KGV2ZW50OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmluYWxFdmVudCA9IGV2ZW50ICsgJy1zdGFydCdcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRzTWFwW2ZpbmFsRXZlbnRdKSB7cmV0dXJufVxuICAgICAgICBzYWZlTWFyayhmaW5hbEV2ZW50KVxuICAgICAgICB0aGlzLmV2ZW50c01hcFtmaW5hbEV2ZW50XSA9IDFcbiAgICB9XG5cbiAgICBzdGF0aWMgZW5kKGV2ZW50OiBzdHJpbmcsIHN1Y2Nlc3MgPSB0cnVlLCBmYWlsdXJlPzogc3RyaW5nIHwgdW5rbm93biwgZGV0YWlscyA9IHt9KSB7XG4gICAgICAgIHNhZmVNYXJrKGV2ZW50ICsgJy1lbmQnKVxuICAgICAgICBzYWZlTWVhc3VyZShldmVudCwgZXZlbnQgKyAnLXN0YXJ0JywgZXZlbnQgKyAnLWVuZCcpXG4gICAgICAgIC8vIENsZWFyIHRoZSBzdGFydC1tYXJrIGd1YXJkIHNvIGEgc3Vic2VxdWVudCBzdGFydChldmVudCkgZm9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGV2ZW50IGFjdHVhbGx5IG1hcmtzIGEgbmV3IHN0YXJ0LiBXaXRob3V0IHRoaXMsIHN0YXJ0KCkgc2hvcnQtY2lyY3VpdHNcbiAgICAgICAgLy8gYW5kIHRoZSBuZXh0IGVuZCgpIG1lYXN1cmVzIGZyb20gdGhlIG9yaWdpbmFsIHN0YXJ0IG1hcmsgXHUyMDE0IGluZmxhdGVkXG4gICAgICAgIC8vIGR1cmF0aW9ucyBpbiB0ZWxlbWV0cnkgb24gZXZlcnkgY2FsbCBhZnRlciB0aGUgZmlyc3QuXG4gICAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50c01hcFtldmVudCArICctc3RhcnQnXVxuICAgICAgICB0aGlzLmRldGFpbHNbZXZlbnRdID0gT2JqZWN0LmFzc2lnbih7IHN1Y2Nlc3MsIGZhaWx1cmU6IHV0aWwuZm9ybWF0KGZhaWx1cmUpIH0sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICBwbGF0Zm9ybTogUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkLFxuICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbiAmJiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW5bUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuLmxlbmd0aCAtIDFdXG4gICAgICAgIH0sIGRldGFpbHMpLCB0aGlzLmRldGFpbHNbZXZlbnRdIHx8IHt9KSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY2xpZW50IHdvcmtlciBJRCBpbiBmb3JtYXQgXCJ0aHJlYWRJZC1wcm9jZXNzSWRcIi5cbiAgICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgaWRlbnRpZmllciBhY3Jvc3MgdGhlIFNESyBmb3IgdHJhY2tpbmdcbiAgICAgKiB3b3JrZXItc3BlY2lmaWMgZXZlbnRzIGFuZCBwZXJmb3JtYW5jZSBtZXRyaWNzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV29ya2VyIElEIHN0cmluZyBpbiBmb3JtYXQgXCJ0aHJlYWRJZC1wcm9jZXNzSWRcIlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDbGllbnRXb3JrZXJJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gQ0xJVXRpbHMuZ2V0Q2xpZW50V29ya2VySWQoKVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRQcm9jZXNzSWQoKSB7XG4gICAgICAgIHJldHVybiBgJHtwcm9jZXNzLnBpZH0tJHt3b3JrZXIudGhyZWFkSWR9YFxuICAgIH1cblxuICAgIHN0YXRpYyBzbGVlcCA9IChtcyA9IDEwMCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuXG4gICAgc3RhdGljIGFzeW5jIHVwbG9hZEV2ZW50c0RhdGEoKSB7XG4gICAgICAgIC8vIFRyYWNrIG92ZXJhbGwga2V5IG1ldHJpY3Mgb3BlcmF0aW9uXG4gICAgICAgIHRoaXMuc3RhcnQoRVZFTlRTLlNES19TRU5EX0tFWV9NRVRSSUNTKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJJZCA9IGAke3Byb2Nlc3MucGlkfWBcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gU3RhcnRpbmcgdXBsb2FkIGZvciB3b3JrZXIgJHt3b3JrZXJJZH1gKVxuXG4gICAgICAgICAgICAvLyBUcmFjayBwcmVwYXJhdGlvbiBwaGFzZSAoY29sbGVjdGlvbiBhbmQgZGVkdXBsaWNhdGlvbilcbiAgICAgICAgICAgIHRoaXMuc3RhcnQoRVZFTlRTLlNES19LRVlfTUVUUklDU19QUkVQQVJBVElPTilcblxuICAgICAgICAgICAgLy8gQ29sbGVjdCBhbGwgbWVhc3VyZXMgZnJvbSBwZXJmb3JtYW5jZSByZXBvcnQgZmlsZXMgYW5kIGluLW1lbW9yeSBldmVudHNcbiAgICAgICAgICAgIGxldCBtZWFzdXJlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdXG4gICAgICAgICAgICBpZiAoYXdhaXQgZnNQcm9taXNlLmFjY2Vzcyh0aGlzLmpzb25SZXBvcnREaXJQYXRoKS50aGVuKCgpID0+IHRydWUpLmNhdGNoKCgpID0+IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gKGF3YWl0IGZzUHJvbWlzZS5yZWFkZGlyKHRoaXMuanNvblJlcG9ydERpclBhdGgpKS5tYXAoZmlsZSA9PiBwYXRoLnJlc29sdmUodGhpcy5qc29uUmVwb3J0RGlyUGF0aCwgZmlsZSkpXG4gICAgICAgICAgICAgICAgbWVhc3VyZXMgPSAoYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXMubWFwKChmaWxlKSA9PiBmc1Byb21pc2UucmVhZEZpbGUoZmlsZSwgJ3V0Zi04JykpKSkubWFwKGVsID0+IGBbJHtlbC5zbGljZSgwLCAtMSl9XWApLm1hcChlbCA9PiBKU09OLnBhcnNlKGVsKSkuZmxhdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIFRvdGFsIGV2ZW50cyBmcm9tIGZpbGVzOiAke21lYXN1cmVzLmxlbmd0aH1gKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fbWVhc3VyZWRFdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gQWRkaW5nICR7dGhpcy5fbWVhc3VyZWRFdmVudHMubGVuZ3RofSBpbi1tZW1vcnkgZXZlbnRzYClcbiAgICAgICAgICAgICAgICBtZWFzdXJlcyA9IG1lYXN1cmVzLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZWRFdmVudHMubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBQZXJmb3JtYW5jZUVudHJ5IHRvIHBsYWluIG9iamVjdCBpZiBpdCBoYXMgdG9KU09OXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChlIGFzIFBlcmZvcm1hbmNlRW50cnkpLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSBhcyBQZXJmb3JtYW5jZUVudHJ5KS50b0pTT04oKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbnN1cmVFcG9jaFRpbWVzID0gKGFycjogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICAgICAgICAgICAgICBjb25zdCBjdXRvZmYgPSAxZTEyIC8vIH55ZWFyIDIwMDEsIG1zIGVwb2NoXG4gICAgICAgICAgICAgICAgY29uc3QgdGltZU9yaWdpbiA9IChcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UudGltZU9yaWdpbiA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgID8gcGVyZm9ybWFuY2UudGltZU9yaWdpblxuICAgICAgICAgICAgICAgICAgICA6IChub3cgLSBwcm9jZXNzLnVwdGltZSgpICogMTAwMClcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyLm1hcChlbnRyeSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkuc3RhcnRUaW1lID09PSAnbnVtYmVyJyAmJiBlbnRyeS5zdGFydFRpbWUgPCBjdXRvZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0VGltZSA9IHRpbWVPcmlnaW4gKyBlbnRyeS5zdGFydFRpbWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWVhc3VyZXMgPSBlbnN1cmVFcG9jaFRpbWVzKG1lYXN1cmVzKVxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcbiAgICAgICAgICAgIC8vIHl5eXktTU0tZGQnVCdISDptbTpzcy5TU1NTU1MgWlxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdGltZVpvbmU6ICdVVEMnLFxuICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIGRheTogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBmcmFjdGlvbmFsU2Vjb25kRGlnaXRzOiAzLCAvLyBUbyBpbmNsdWRlIG1pY3Jvc2Vjb25kc1xuICAgICAgICAgICAgICAgIGhvdXIxMjogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZvcm1hdCB0aGUgZGF0ZSBhbmQgcmVwbGFjZSB0aGUgZGVmYXVsdCBzZXBhcmF0b3IgZm9yIHRpbWUgem9uZVxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbi1HQicsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgLmZvcm1hdFRvUGFydHMoZGF0ZSlcbiAgICAgICAgICAgICAgICAubWFwKCh7IHR5cGUsIHZhbHVlIH0pID0+IHR5cGUgPT09ICd0aW1lWm9uZU5hbWUnID8gJ1onIDogdmFsdWUpXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJywnLCAnVCcpXG5cbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfS0VZX01FVFJJQ1NfUFJFUEFSQVRJT04sIHRydWUpXG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdzZGtfZXZlbnRzJyxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RodWJfdXVpZDogcHJvY2Vzcy5lbnYuUEVSRl9URVNUSFVCX1VVSUQgfHwgcHJvY2Vzcy5lbnYuU0RLX1JVTl9JRCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZF9kYXk6IGZvcm1hdHRlZERhdGUsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X25hbWU6ICdTREtGZWF0dXJlUGVyZm9ybWFuY2UnLFxuICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGE6IHByb2Nlc3MuZW52LlBFUkZfVVNFUl9OQU1FLFxuICAgICAgICAgICAgICAgICAgICBob3N0X2luZm86IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lOiBob3N0bmFtZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm06IHBsYXRmb3JtKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmNoOiBhcmNoKClcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X2pzb246IHsgbWVhc3VyZXM6IG1lYXN1cmVzLCBzZGtSdW5JZDogcHJvY2Vzcy5lbnYuU0RLX1JVTl9JRCB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hXcmFwKGAke0FQSVV0aWxzLkVEU19VUkx9L3NlbmRfc2RrX2V2ZW50c2AsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIFN1Y2Nlc3NmdWxseSB1cGxvYWRlZCB0byBFRFM6ICR7dXRpbC5mb3JtYXQoYXdhaXQgcmVzdWx0LnRleHQoKSl9YClcblxuICAgICAgICAgICAgdGhpcy5lbmQoRVZFTlRTLlNES19TRU5EX0tFWV9NRVRSSUNTLCB0cnVlKVxuICAgICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbUGVyZm9ybWFuY2UgVXBsb2FkXSBGYWlsZWQgdG8gdXBsb2FkIGV2ZW50czogJHt1dGlsLmZvcm1hdChlcil9YClcbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfS0VZX01FVFJJQ1NfUFJFUEFSQVRJT04sIGZhbHNlLCBlcilcbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfU0VORF9LRVlfTUVUUklDUywgZmFsc2UsIGVyKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhd2FpdCBmc1Byb21pc2UuYWNjZXNzKHRoaXMuanNvblJlcG9ydERpclBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSwgKCkgPT4gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmc1Byb21pc2UucmVhZGRpcih0aGlzLmpzb25SZXBvcnREaXJQYXRoKVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzUHJvbWlzZS51bmxpbmsocGF0aC5qb2luKHRoaXMuanNvblJlcG9ydERpclBhdGgsIGZpbGUpKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gQ2xlYW5lZCB1cCAke2ZpbGVzLmxlbmd0aH0gdGVtcG9yYXJ5IHJlcG9ydCBmaWxlc2ApXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIEZhaWxlZCB0byBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzOiAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQgbG9nZ2VyIGZyb20gJ0B3ZGlvL2xvZ2dlcidcblxuaW1wb3J0IHsgTE9HU19GSUxFIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tICcuL3V0aWwuanMnXG5cbmNvbnN0IGxvZyA9IGxvZ2dlcignQHdkaW8vYnJvd3NlcnN0YWNrLXNlcnZpY2UnKVxuXG5leHBvcnQgY2xhc3MgQlN0YWNrTG9nZ2VyIHtcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZpbGVQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIExPR1NfRklMRSlcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZvbGRlclBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnKVxuICAgIHByaXZhdGUgc3RhdGljIGxvZ0ZpbGVTdHJlYW06IGZzLldyaXRlU3RyZWFtIHwgbnVsbFxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVkYWN0Q3JlZGVudGlhbHMobG9nTWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGxvZ01lc3NhZ2VcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oW1wiJ10/KD86dXNlcm5hbWV8dXNlck5hbWV8YWNjZXNza2V5fGFjY2Vzc0tleXx1c2VyfGtleSlbXCInXT9cXHMqWzo9XVxccypbXCInXT8pKFteXCInXFxzLH1dKykvZ2ksICckMScpXG4gICAgICAgICAgICAucmVwbGFjZSgvKFs/Jl0oPzp1c2VybmFtZXx1c2VyTmFtZXxhY2Nlc3Nfa2V5fGFjY2Vzc2tleXxhY2Nlc3NLZXl8dXNlcnxrZXkpPSkoW14mI1xcc10rKS9naSwgJyQxJylcbiAgICB9XG5cbiAgICBzdGF0aWMgbG9nVG9GaWxlKGxvZ01lc3NhZ2U6IHN0cmluZywgbG9nTGV2ZWw6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhsb2dNZXNzYWdlKVxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvZ0ZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuc3VyZUxvZ3NGb2xkZXIoKVxuICAgICAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRoaXMubG9nRmlsZVBhdGgsIHsgZmxhZ3M6ICdhJyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubG9nRmlsZVN0cmVhbSAmJiB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGUodGhpcy5mb3JtYXRMb2cocmVkYWN0ZWRNZXNzYWdlLCBsb2dMZXZlbCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYEZhaWxlZCB0byBsb2cgdG8gZmlsZS4gRXJyb3IgJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZm9ybWF0TG9nKGxvZ01lc3NhZ2U6IHN0cmluZywgbGV2ZWw6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYCR7Y2hhbGsuZ3JheShuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpfSAke2NoYWxrW0NPTE9SU1tsZXZlbF1dKGxldmVsLnRvVXBwZXJDYXNlKCkpfSAke2NoYWxrLndoaXRlQnJpZ2h0KCdAd2Rpby9icm93c2Vyc3RhY2stc2VydmljZScpfSAke2xvZ01lc3NhZ2V9XFxuYFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICdpbmZvJylcbiAgICAgICAgbG9nLmluZm8ocmVkYWN0ZWRNZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHJlZGFjdGVkTWVzc2FnZSA9IHRoaXMucmVkYWN0Q3JlZGVudGlhbHMobWVzc2FnZSlcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUocmVkYWN0ZWRNZXNzYWdlLCAnZXJyb3InKVxuICAgICAgICBsb2cuZXJyb3IocmVkYWN0ZWRNZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBwYXJhbT86IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICdkZWJ1ZycpXG4gICAgICAgIGlmIChwYXJhbSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKHJlZGFjdGVkTWVzc2FnZSwgcGFyYW0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cuZGVidWcocmVkYWN0ZWRNZXNzYWdlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubG9nVG9GaWxlKHJlZGFjdGVkTWVzc2FnZSwgJ3dhcm4nKVxuICAgICAgICBsb2cud2FybihyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0cmFjZShtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICd0cmFjZScpXG4gICAgICAgIGxvZy50cmFjZShyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhaW4gd2hhdGV2ZXIgaXMgc3RpbGwgc2l0dGluZyBpbiB0aGUgbG9nIHN0cmVhbSdzIGJ1ZmZlciBvbnRvIGRpc2suXG4gICAgICpcbiAgICAgKiBgbG9nVG9GaWxlYCB3cml0ZXMgdG8gYW4gYXN5bmMgYGZzLldyaXRlU3RyZWFtYCwgc28gYSBsaW5lIGxvZ2dlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlXG4gICAgICogYXJjaGl2ZSBpcyBidWlsdCBpcyB2ZXJ5IGxpa2VseSBOT1QgaW4gdGhlIGZpbGUgeWV0IFx1MjAxNCB0aGUgc3RyZWFtJ3MgYG9wZW5gIGlzIGFzeW5jIHRvbyxcbiAgICAgKiBzbyBlYXJseSBvbiB0aGUgZmlsZSBtYXkgbm90IGV4aXN0IGF0IGFsbC4gQW55dGhpbmcgdGhhdCBzbmFwc2hvdHMgdGhlIGxvZyAodGhlIGRlYnVnLWxvZ1xuICAgICAqIHVwbG9hZCkgbXVzdCBmbHVzaCBmaXJzdCBvciBpdCBzaGlwcyBhIHRydW5jYXRlZCBjb3B5LlxuICAgICAqXG4gICAgICogQSB6ZXJvLWxlbmd0aCB3cml0ZSdzIGNhbGxiYWNrIGZpcmVzIG9ubHkgYWZ0ZXIgZXZlcnkgY2h1bmsgcXVldWVkIGFoZWFkIG9mIGl0IGhhcyBiZWVuXG4gICAgICogaGFuZGVkIHRvIHRoZSBmcyBsYXllciwgd2hpY2ggZHJhaW5zIHRoZSBidWZmZXIgd2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSBcdTIwMTQgdW5saWtlXG4gICAgICogYGNsZWFyTG9nZ2VyKClgLCBsb2dnaW5nIGNvbnRpbnVlcyB0byB3b3JrIGFmdGVyd2FyZHMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBmbHVzaExvZ0ZpbGUodGltZW91dE1zID0gMjAwMCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLmxvZ0ZpbGVTdHJlYW1cbiAgICAgICAgaWYgKCFzdHJlYW0gfHwgIXN0cmVhbS53cml0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgLy8gTmV2ZXIgbGV0IGEgc3R1Y2sgc3RyZWFtIGhvbGQgdXAgdGhlIHVwbG9hZDsgYSB0cnVuY2F0ZWQgbG9nIGJlYXRzIG5vIGxvZyBhdCBhbGwuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dE1zKVxuICAgICAgICAgICAgdGltZXIudW5yZWY/LigpXG4gICAgICAgICAgICBzdHJlYW0ud3JpdGUoJycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJMb2dnZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ0ZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbS5lbmQoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbSA9IG51bGxcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyTG9nRmlsZSgpIHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5sb2dGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIGZzLnRydW5jYXRlU3luYyh0aGlzLmxvZ0ZpbGVQYXRoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbnN1cmVMb2dzRm9sZGVyKCkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5sb2dGb2xkZXJQYXRoKSl7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5sb2dGb2xkZXJQYXRoKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgIntcbiAgXCJuYW1lXCI6IFwiQHdkaW8vYnJvd3NlcnN0YWNrLXNlcnZpY2VcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiOS4zNS4xXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJXZWJkcml2ZXJJTyBzZXJ2aWNlIGZvciBiZXR0ZXIgQnJvd3NlcnN0YWNrIGludGVncmF0aW9uXCIsXG4gIFwiYXV0aG9yXCI6IFwiQnJvd3NlclN0YWNrIDxzdXBwb3J0QGJyb3dzZXJzdGFjay5jb20+XCIsXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcnN0YWNrL3dkaW8tYnJvd3NlcnN0YWNrLXNlcnZpY2VcIixcbiAgXCJsaWNlbnNlXCI6IFwiTUlUXCIsXG4gIFwiZW5naW5lc1wiOiB7XG4gICAgXCJub2RlXCI6IFwiPj0xOC4yMC4wXCJcbiAgfSxcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcnN0YWNrL3dkaW8tYnJvd3NlcnN0YWNrLXNlcnZpY2UuZ2l0XCIsXG4gICAgXCJkaXJlY3RvcnlcIjogXCJwYWNrYWdlcy9icm93c2Vyc3RhY2stc2VydmljZVwiXG4gIH0sXG4gIFwia2V5d29yZHNcIjogW1xuICAgIFwid2ViZHJpdmVyaW9cIixcbiAgICBcIndkaW9cIixcbiAgICBcImJyb3dzZXJzdGFja1wiLFxuICAgIFwid2Rpby1zZXJ2aWNlXCJcbiAgXSxcbiAgXCJidWdzXCI6IHtcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9icm93c2Vyc3RhY2svd2Rpby1icm93c2Vyc3RhY2stc2VydmljZS9pc3N1ZXNcIlxuICB9LFxuICBcInR5cGVcIjogXCJtb2R1bGVcIixcbiAgXCJ0eXBlc1wiOiBcIi4vYnVpbGQvaW5kZXguZC50c1wiLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9idWlsZC9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vYnVpbGQvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2NsZWFudXBcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vYnVpbGQvY2xlYW51cC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vYnVpbGQvY2xlYW51cC5qc1wiLFxuICAgICAgXCJzb3VyY2VcIjogXCIuL3NyYy9jbGVhbnVwLnRzXCJcbiAgICB9XG4gIH0sXG4gIFwidHlwZVNjcmlwdFZlcnNpb25cIjogXCIzLjguM1wiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImJ1aWxkXCIsXG4gICAgXCJzcmMvcHJvdG8vKiovKi5wcm90b1wiLFxuICAgIFwiYnJvd3NlcnN0YWNrLXNlcnZpY2UuZC50c1wiLFxuICAgIFwiUkVBRE1FLm1kXCIsXG4gICAgXCJMSUNFTlNFXCJcbiAgXSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcImNsZWFuXCI6IFwicmltcmFmIC4vYnVpbGQgc3JjL2dycGMvZ2VuZXJhdGVkXCIsXG4gICAgXCJnZW5lcmF0ZVwiOiBcImJ1ZiBnZW5lcmF0ZVwiLFxuICAgIFwiYnVpbGRcIjogXCJyaW1yYWYgLi9idWlsZCBzcmMvZ3JwYy9nZW5lcmF0ZWQgJiYgYnVmIGdlbmVyYXRlICYmIG5vZGUgLi9zY3JpcHRzL2J1aWxkLm1qcyAmJiB0c2MgLXAgdHNjb25maWcucHJvZC5qc29uXCIsXG4gICAgXCJidWlsZDp3YXRjaFwiOiBcIm5vZGUgLi9zY3JpcHRzL2J1aWxkLm1qcyAtLXdhdGNoXCIsXG4gICAgXCJ0ZXN0XCI6IFwidml0ZXN0IC0tcnVuXCIsXG4gICAgXCJ0ZXN0OndhdGNoXCI6IFwidml0ZXN0XCIsXG4gICAgXCJwcmVwYWNrXCI6IFwibnBtIHJ1biBidWlsZFwiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBicm93c2Vyc3RhY2svYWktc2RrLW5vZGVcIjogXCIxLjUuMTdcIixcbiAgICBcIkBidWZidWlsZC9wcm90b2J1ZlwiOiBcIl4yLjUuMlwiLFxuICAgIFwiQGdycGMvZ3JwYy1qc1wiOiBcIn4xLjEzLjVcIixcbiAgICBcIkBwZXJjeS9hcHBpdW0tYXBwXCI6IFwiXjIuMC45XCIsXG4gICAgXCJAcGVyY3kvc2VsZW5pdW0td2ViZHJpdmVyXCI6IFwiXjIuMi4yXCIsXG4gICAgXCJAdHlwZXMvZ2l0Y29uZmlnbG9jYWxcIjogXCJeMi4wLjFcIixcbiAgICBcImJyb3dzZXJzdGFjay1sb2NhbFwiOiBcIl4xLjUuMVwiLFxuICAgIFwiY2hhbGtcIjogXCJeNS4zLjBcIixcbiAgICBcImNzdi13cml0ZXJcIjogXCJeMS42LjBcIixcbiAgICBcImdpdC1yZXBvLWluZm9cIjogXCJeMi4xLjFcIixcbiAgICBcImdpdGNvbmZpZ2xvY2FsXCI6IFwiXjIuMS4wXCIsXG4gICAgXCJnbG9iXCI6IFwiXjExLjAuMFwiLFxuICAgIFwidGFyXCI6IFwiXjcuNS4xMVwiLFxuICAgIFwidW5kaWNpXCI6IFwiXjYuMjQuMFwiLFxuICAgIFwidXVpZFwiOiBcIl4xMS4xLjBcIixcbiAgICBcIndpbnN0b24tdHJhbnNwb3J0XCI6IFwiXjQuNS4wXCIsXG4gICAgXCJ5YXV6bFwiOiBcIl4zLjQuMFwiLFxuICAgIFwiQHdkaW8vbG9nZ2VyXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby9yZXBvcnRlclwiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vdHlwZXNcIjogXCJeOS4wLjBcIixcbiAgICBcIndlYmRyaXZlcmlvXCI6IFwiXjkuMC4wXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB3ZGlvL2NsaVwiOiBcIl41LjAuMCB8fCBeNi4wLjAgfHwgXjcuMC4wIHx8IF44LjAuMCB8fCBeOS4wLjBcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYnVmYnVpbGQvYnVmXCI6IFwiXjEuNTUuMVwiLFxuICAgIFwiQGNoYW5nZXNldHMvY2xpXCI6IFwiXjIuMjcuOVwiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMjAuMS4wXCIsXG4gICAgXCJAdHlwZXMvdGFyXCI6IFwiXjcuMC44N1wiLFxuICAgIFwiQHR5cGVzL3lhdXpsXCI6IFwiXjIuMTAuM1wiLFxuICAgIFwiQHdkaW8vZ2xvYmFsc1wiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vbG9nZ2VyXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby9yZXBvcnRlclwiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vdHlwZXNcIjogXCJeOS4wLjBcIixcbiAgICBcImVzYnVpbGRcIjogXCJeMC4yNy4yXCIsXG4gICAgXCJyaW1yYWZcIjogXCJeNi4wLjFcIixcbiAgICBcInRzLXByb3RvXCI6IFwiXjIuNy41XCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuOC4zXCIsXG4gICAgXCJ2aXRlc3RcIjogXCJeMy4yLjRcIixcbiAgICBcIndlYmRyaXZlcmlvXCI6IFwiXjkuMC4wXCJcbiAgfSxcbiAgXCJwdWJsaXNoQ29uZmlnXCI6IHtcbiAgICBcImFjY2Vzc1wiOiBcInB1YmxpY1wiXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJyb3dzZXJzdGFja0NvbmZpZyB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgcGtnIGZyb20gJy4uL3BhY2thZ2UuanNvbicgd2l0aCB7IHR5cGU6ICdqc29uJyB9XG5cbmNvbnN0IGJzdGFja1NlcnZpY2VWZXJzaW9uID0gcGtnLnZlcnNpb25cblxuZXhwb3J0IGNvbnN0IEJST1dTRVJfREVTQ1JJUFRJT04gPSBbXG4gICAgJ2RldmljZScsXG4gICAgJ29zJyxcbiAgICAnb3NWZXJzaW9uJyxcbiAgICAnb3NfdmVyc2lvbicsXG4gICAgJ2Jyb3dzZXJOYW1lJyxcbiAgICAnYnJvd3NlcicsXG4gICAgJ2Jyb3dzZXJWZXJzaW9uJyxcbiAgICAnYnJvd3Nlcl92ZXJzaW9uJ1xuXSBhcyBjb25zdFxuXG5leHBvcnQgY29uc3QgVkFMSURfQVBQX0VYVEVOU0lPTiA9IFtcbiAgICAnLmFwaycsXG4gICAgJy5hYWInLFxuICAgICcuaXBhJ1xuXVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9PUFRJT05TOiBQYXJ0aWFsPEJyb3dzZXJzdGFja0NvbmZpZz4gPSB7XG4gICAgc2V0U2Vzc2lvbk5hbWU6IHRydWUsXG4gICAgc2V0U2Vzc2lvblN0YXR1czogdHJ1ZSxcbiAgICB0ZXN0T2JzZXJ2YWJpbGl0eTogdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgY29uc29sZUhvbGRlcjogdHlwZW9mIGNvbnNvbGUgPSBPYmplY3QuYXNzaWduKHt9LCBjb25zb2xlKVxuXG5leHBvcnQgY29uc3QgREFUQV9FTkRQT0lOVCA9ICdodHRwczovL2NvbGxlY3Rvci1vYnNlcnZhYmlsaXR5LmJyb3dzZXJzdGFjay5jb20nXG5leHBvcnQgY29uc3QgQVBQX0FMTFlfRU5EUE9JTlQgPSAnaHR0cHM6Ly9hcHAtYWNjZXNzaWJpbGl0eS5icm93c2Vyc3RhY2suY29tL2F1dG9tYXRlJ1xuZXhwb3J0IGNvbnN0IEFQUF9BTExZX0lTU1VFU19FTkRQT0lOVCA9ICdhcGkvdjEvaXNzdWVzJ1xuZXhwb3J0IGNvbnN0IEFQUF9BTExZX0lTU1VFU19TVU1NQVJZX0VORFBPSU5UID0gJ2FwaS92MS9pc3N1ZXMtc3VtbWFyeSdcbmV4cG9ydCBjb25zdCBEQVRBX0VWRU5UX0VORFBPSU5UID0gJ2FwaS92MS9ldmVudCdcbmV4cG9ydCBjb25zdCBEQVRBX0JBVENIX0VORFBPSU5UID0gJ2FwaS92MS9iYXRjaCdcbmV4cG9ydCBjb25zdCBEQVRBX1NDUkVFTlNIT1RfRU5EUE9JTlQgPSAnYXBpL3YxL3NjcmVlbnNob3RzJ1xuZXhwb3J0IGNvbnN0IERBVEFfQkFUQ0hfU0laRSA9IDEwMDBcbmV4cG9ydCBjb25zdCBEQVRBX0JBVENIX0lOVEVSVkFMID0gMjAwMFxuZXhwb3J0IGNvbnN0IEJBVENIX0VWRU5UX1RZUEVTID0gWydMb2dDcmVhdGVkJywgJ1Rlc3RSdW5TdGFydGVkJywgJ1Rlc3RSdW5GaW5pc2hlZCcsICdIb29rUnVuRmluaXNoZWQnLCAnSG9va1J1blN0YXJ0ZWQnLCAnU2NyZWVuc2hvdENyZWF0ZWQnXVxuZXhwb3J0IGNvbnN0IERFRkFVTFRfV0FJVF9USU1FT1VUX0ZPUl9QRU5ESU5HX1VQTE9BRFMgPSA1MDAwIC8vIDVzXG5leHBvcnQgY29uc3QgREVGQVVMVF9XQUlUX0lOVEVSVkFMX0ZPUl9QRU5ESU5HX1VQTE9BRFMgPSAxMDAgLy8gMTAwbXNcbmV4cG9ydCBjb25zdCBCU1RBQ0tfU0VSVklDRV9WRVJTSU9OID0gYnN0YWNrU2VydmljZVZlcnNpb25cblxuZXhwb3J0IGNvbnN0IE5PVF9BTExPV0VEX0tFWVNfSU5fQ0FQUyA9IFsnaW5jbHVkZVRhZ3NJblRlc3RpbmdTY29wZScsICdleGNsdWRlVGFnc0luVGVzdGluZ1Njb3BlJywgJ3Rlc3RNYW5hZ2VtZW50T3B0aW9ucycsICdza2lwQXBwT3ZlcnJpZGUnXVxuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUX1BMQU5fSUQgPSAnQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRCdcblxuZXhwb3J0IGNvbnN0IExPR1NfRklMRSA9ICdsb2dzL2JzdGFjay13ZGlvLXNlcnZpY2UubG9nJ1xuZXhwb3J0IGNvbnN0IENMSV9ERUJVR19MT0dTX0ZJTEUgPSAnbG9nL3Nkay1jbGktZGVidWcubG9nJ1xuZXhwb3J0IGNvbnN0IFVQTE9BRF9MT0dTX0FERFJFU1MgPSAnaHR0cHM6Ly91cGxvYWQtb2JzZXJ2YWJpbGl0eS5icm93c2Vyc3RhY2suY29tJ1xuZXhwb3J0IGNvbnN0IFVQTE9BRF9MT0dTX0VORFBPSU5UID0gJ2NsaWVudC1sb2dzL3VwbG9hZCdcblxuZXhwb3J0IGNvbnN0IFBFUkNZX0xPR1NfRklMRSA9ICdsb2dzL3BlcmN5LmxvZydcblxuLyoqXG4gKiBBdXRvLWNhcHR1cmUgb2YgdGhlIHVzZXIncyB3ZGlvIGNvbmZpZyBmaWxlIChTREstNzI1MCkuXG4gKi9cblxuLypcbiAqIFNob3duIG9uY2UgcGVyIHJ1biB3aGVuIGF1dG8tY2FwdHVyZSBpcyBhY3RpdmUuIFRoZSBOb2RlIFNESyBkb2VzIHRoZSBzYW1lXG4gKiAoQnJvd3NlclN0YWNrU2V0dXAuanMgLT4gQVVUT0xPR0NBUFRVUkVfTk9USUZJQ0FUSU9OKTsgd2l0aG91dCBpdCBhIHdkaW8gY3VzdG9tZXIgZ2V0cyBub1xuICogcnVudGltZSBkaXNjbG9zdXJlIHRoYXQgdGhlaXIgY29uZmlnIGZpbGUgaXMgY29sbGVjdGVkLCBvbmx5IGEgY2hhbmdlc2V0IGVudHJ5IGFuZCBhIEpTRG9jXG4gKiBjb21tZW50LiBTaW5jZSB0aGUgcmVkYWN0aW9uIGlzIGtleS1uYW1lIGRyaXZlbiBhbmQgYmVzdC1lZmZvcnQsIHRoZSBub3RpY2UgaXMgcGFydCBvZiB0aGVcbiAqIGNvbnRyb2wgcmF0aGVyIHRoYW4gZGVjb3JhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9MT0dDQVBUVVJFX05PVElGSUNBVElPTiA9ICdZb3VyIHdkaW8gY29uZmlnIGZpbGUsIHRoZSBsb2NhbCBjb25maWcgZmlsZXMgaXQgaW1wb3J0cyBhbmQgcGFja2FnZS5qc29uIGFyZSBjYXB0dXJlZCB3aXRoIHRoZSBkZWJ1ZyBsb2dzIGF0IHRoZSBlbmQgb2YgdGhlIHJ1biwgd2l0aCB2YWx1ZXMgdW5kZXIga25vd24gY3JlZGVudGlhbCBrZXlzIHJlbW92ZWQuIFRvIGRpc2FibGUsIHNldCBkaXNhYmxlQXV0b0NhcHR1cmVMb2dzOiB0cnVlIGluIHRoZSBicm93c2Vyc3RhY2sgc2VydmljZSBvcHRpb25zLidcblxuLyogQWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVzb2x2ZWQgd2RpbyBjb25maWcsIHB1Ymxpc2hlZCBvbmNlIHNvIHRoZSB1cGxvYWQgcGF0aCBuZXZlciByZS1kZXJpdmVzIGl0ICovXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX0ZJTEVfUEFUSCA9ICdCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfRklMRV9QQVRIJ1xuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19ESVNBQkxFX0FVVE9fQ0FQVFVSRV9MT0dTID0gJ0JST1dTRVJTVEFDS19ESVNBQkxFX0FVVE9fQ0FQVFVSRV9MT0dTJ1xuLyogV2hpY2ggbGFkZGVyIHJ1bmcgcmVzb2x2ZWQgdGhlIGNvbmZpZywga2VwdCBzbyB0aGUgdXBsb2FkIHBhdGggcmVwb3J0cyB0aGUgVFJVRSBydW5nXG4gICBpbnN0ZWFkIG9mIHJlLXJlYWRpbmcgaXRzIG93biBlbnYgdmFyIGFuZCBhbHdheXMgc2F5aW5nICdlbnZfb3ZlcnJpZGUnICovXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX1NUUkFURUdZID0gJ0JST1dTRVJTVEFDS19XRElPX0NPTkZJR19TVFJBVEVHWSdcblxuLyogTWlycm9ycyBjcmVhdGUtd2RpbydzIFNVUFBPUlRFRF9DT05GSUdfRklMRV9FWFRFTlNJT04gKGlkZW50aWNhbCBpbiB3ZGlvIHY4IGFuZCB2OSkgKi9cbmV4cG9ydCBjb25zdCBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUyA9IFsnLmpzJywgJy50cycsICcubWpzJywgJy5tdHMnLCAnLmNqcycsICcuY3RzJ11cbmV4cG9ydCBjb25zdCBERUZBVUxUX1dESU9fQ09ORklHX0JBU0VOQU1FID0gJ3dkaW8uY29uZidcbi8qIGB3ZGlvIDxjbWQ+YCB2ZXJicyB0aGF0IG11c3QgbmV2ZXIgYmUgbWlzdGFrZW4gZm9yIHRoZSBjb25maWcgcG9zaXRpb25hbCAqL1xuZXhwb3J0IGNvbnN0IFdESU9fQ0xJX1NVQkNPTU1BTkRTID0gWydydW4nLCAnaW5zdGFsbCcsICdyZXBsJywgJ2NvbmZpZyddXG5cbi8qIENvbmZpZ3MgYXJlIGtpbG9ieXRlczsgdGhlIGNhcCBvbmx5IGV4aXN0cyBzbyBhIG1pc2xhYmVsbGVkIHBhdGggY2Fubm90IGJsb2F0IHRoZSBhcmNoaXZlICovXG5leHBvcnQgY29uc3QgTUFYX0NBUFRVUkVEX0NPTkZJR19GSUxFX0JZVEVTID0gMTAyNCAqIDEwMjRcbmV4cG9ydCBjb25zdCBNQVhfQ0FQVFVSRURfQ09ORklHX0ZJTEVTID0gNlxuLyogSG93IGZhciB0byBmb2xsb3cgcmVsYXRpdmUgaW1wb3J0cyBvdXQgb2YgdGhlIGVudHJ5IGNvbmZpZyAoMSA9IGRpcmVjdCBpbXBvcnRzIG9ubHkpICovXG5leHBvcnQgY29uc3QgQ0FQVFVSRV9DT05GSUdfSU1QT1JUX0RFUFRIID0gMVxuLyogSG93IGZhciB0byB3YWxrIHVwIGZyb20gdGhlIGNvbmZpZyBkaXIgbG9va2luZyBmb3IgdGhlIHByb2plY3QncyBwYWNrYWdlLmpzb24gKi9cbmV4cG9ydCBjb25zdCBNQVhfUEFDS0FHRV9KU09OX1dBTEtfVVAgPSA1XG5cbi8qKlxuICogS2V5cyB3aG9zZSBsaW5lIGlzIHNjcnViYmVkIGJlZm9yZSBhIGNvbmZpZyBmaWxlIGVudGVycyB0aGUgYXJjaGl2ZS5cbiAqIGB1c2VyYCAvIGBrZXlgIGFyZSBXRElPJ3Mgb3duIHRvcC1sZXZlbCBjcmVkZW50aWFsIG9wdGlvbnMsIGhlbmNlIHRoZSBiYXJlIGVudHJpZXMuXG4gKi9cbi8qKlxuICogV29yZCBmYW1pbGllcyB0aGF0IG1ha2UgYW4gaWRlbnRpZmllciBzZW5zaXRpdmUgd2hlbiB0aGV5IGFwcGVhciBhcyBpdHMgU1VGRklYIFx1MjAxNFxuICogYGNsaWVudFNlY3JldGAsIGByZWZyZXNoVG9rZW5gLCBgcHJpdmF0ZUtleWAsIGBjbGllbnRfc2VjcmV0YC4gU3BsaXQgYnkgY2FzZSBzbyB0aGVcbiAqIGNhbWVsQ2FzZSBmb3JtIHJlcXVpcmVzIGEgY2FwaXRhbCAoZGlzdGluZ3Vpc2hpbmcgYHByaXZhdGVLZXlgIGZyb20gYGhvdGtleWApIGFuZCB0aGVcbiAqIHNuYWtlX2Nhc2UgZm9ybSByZXF1aXJlcyBhbiBleHBsaWNpdCBgX2AgKGRpc3Rpbmd1aXNoaW5nIGBjbGllbnRfc2VjcmV0YCBmcm9tIGBrZXl3b3JkYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBDT01QT1VORF9TRUNSRVRfU1VGRklYRVNfQ0FNRUwgPSAnS2V5fFRva2VufFNlY3JldHxQYXNzd29yZHxQYXNzd2R8Q3JlZGVudGlhbCdcbmV4cG9ydCBjb25zdCBDT01QT1VORF9TRUNSRVRfU1VGRklYRVNfU05BS0UgPSAna2V5fHRva2VufHNlY3JldHxwYXNzd29yZHxwYXNzd2R8Y3JlZGVudGlhbCdcblxuLyoqXG4gKiBTZWNyZXRzIHRoYXQgc3BhbiBsaW5lcyBvciBoaWRlIGluc2lkZSBhIHZhbHVlLCB3aGljaCBhIGxpbmUva2V5LWFuY2hvcmVkIHNjcnViIGNhbm5vdFxuICogcmVhY2guIEFwcGxpZWQgYXMgd2hvbGUtYmxvY2sgcGFzc2VzIGJlZm9yZSB0aGUgbGluZSBwYXNzZXMuXG4gKi9cbi8qIGFuIGlubGluZSBQRU06IHRoZSBrZXkgYnl0ZXMgc2l0IG9uIGxpbmVzIHRoYXQgY2Fycnkgbm8ga2V5IG5hbWUgYXQgYWxsICovXG4vKlxuICogVGhlIGJvZHkgaXMgVEVNUEVSRUQgc28gaXQgY2Fubm90IGNyb3NzIGEgc2Vjb25kIGAtLS0tLUJFR0lOYDogd2l0aCBhIHBsYWluIGBbXFxzXFxTXSo/YCxcbiAqIGFuIFVOVEVSTUlOQVRFRCBibG9jayBlYXJsaWVyIGluIHRoZSBmaWxlIG1hdGNoZXMgdGhyb3VnaCB0byBhIGxhdGVyLCB1bnJlbGF0ZWQgYmxvY2snc1xuICogRU5EIG1hcmtlciBhbmQgZXZlcnl0aGluZyBpbiBiZXR3ZWVuIGlzIHJlcGxhY2VkIFx1MjAxNCBzaWxlbnRseSBkZXN0cm95aW5nIHVucmVsYXRlZCBjb25maWcuXG4gKiBCb3VuZGVkIGFzIHdlbGwsIHNvIHRoZSBzY2FuIHN0YXlzIGxpbmVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFTV9CTE9DS19SRUdFWCA9IC8oLS0tLS1CRUdJTiBbXi1cXHJcXG5dKy0tLS0tKSg/Oig/IS0tLS0tQkVHSU4pW1xcc1xcU10pezAsNjU1MzZ9PygtLS0tLUVORCBbXi1cXHJcXG5dKy0tLS0tKS9nXG4vKlxuICogQSBQRU0gb3BlbmVkIGJ1dCBuZXZlciBjbG9zZWQuIFRoZSBibG9jayByZWdleCBhYm92ZSBuZWVkcyB0aGUgRU5EIG1hcmtlciwgc28gd2l0aG91dCBpdFxuICogdGhlIGtleSBieXRlcyBzdXJ2aXZlIGV2ZXJ5IHBhc3MuIE1hdGNoZWQgYXMgQkVHSU4gKyB0aGUgcnVuIG9mIGJhc2U2NC1vbmx5IGxpbmVzIHRoYXRcbiAqIGZvbGxvd3MuIEEgcnVuIG11c3QgYmUgYXQgbGVhc3QgMjAgY2hhcmFjdGVycyBhbmQgZW5kIGF0IGEgbm9uLWJhc2U2NCBjaGFyYWN0ZXI6IGxldHRlcnNcbiAqIGFyZSB2YWxpZCBiYXNlNjQsIHNvIGEgc2hvcnRlci91bmJvdW5kZWQgcnVsZSBtYXRjaGVzIHBhcnQgb2YgYW4gb3JkaW5hcnkgbGluZSBzdWNoIGFzXG4gKiBgbmV4dE9wdGlvbjogMWAgYW5kIGVhdHMgaXQuIFN0b3BzIGF0IHRoZSBmaXJzdCBsaW5lIHRoYXQgZG9lcyBub3QgcXVhbGlmeSwgc28gYSBtYWxmb3JtZWRcbiAqIGJsb2NrIGNhbm5vdCBzd2FsbG93IHRoZSByZXN0IG9mIHRoZSBmaWxlLiBUaGUgdXBwZXIgYm91bmQgaXMgZ2VuZXJvdXMgKDggS0IpIGJlY2F1c2UgYVxuICoga2V5IHdyaXR0ZW4gdW53cmFwcGVkIG9uIE9ORSBsaW5lIHdvdWxkIG90aGVyd2lzZSBleGNlZWQgaXQgYW5kIGZhaWwgT1BFTiwgbGVhdmluZyB0aGUgYm9keVxuICogaW4gdGhlIGJ1bmRsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFTV9VTlRFUk1JTkFURURfUkVHRVggPSAvKC0tLS0tQkVHSU4gW14tXFxyXFxuXSstLS0tLSkoPzpcXHI/XFxuW0EtWmEtejAtOSsvPV17MjAsODE5Mn0oPz1bXkEtWmEtejAtOSsvPV18JCkpKy9nXG4vKlxuICogVXNlcmluZm8gaW4gQU5ZIHVybCB2YWx1ZSwgbm90IGp1c3QgdGhlIGBwcm94eVVybGAga2V5LiBUaGUgcGFzc3dvcmQgaGFsZiBpcyBvcHRpb25hbCBzb1xuICogc2luZ2xlLXRva2VuIGZvcm1zIChgaHR0cHM6Ly9naHBfeHh4QGdpdGh1Yi5jb21gLCBjb21tb24gaW4gQ0kgZ2l0L25wbSByZW1vdGVzKSBhcmUgY2F1Z2h0XG4gKiB0b28uIFF1YW50aWZpZXJzIGFyZSBCT1VOREVEOiB0aGUgdW5ib3VuZGVkIGZvcm0gd2FzIG1lYXN1cmFibHkgcXVhZHJhdGljICgxMDAgS0Igb2ZcbiAqIHdvcmQgY2hhcmFjdGVycyB0b29rIDYuMSBzLCA0eCBwZXIgZG91YmxpbmcpIGJlY2F1c2UgYm90aCBoYWx2ZXMgc2NhbiBmb3J3YXJkIGZvciBhbiBgQGBcbiAqIHRoYXQgbmV2ZXIgYXJyaXZlcy4gUmVhbCB1c2VyaW5mbyBpcyBzaG9ydCwgc28gdGhlIGJvdW5kcyBjaGFuZ2Ugbm8gcmVhbC13b3JsZCBtYXRjaC5cbiAqL1xuZXhwb3J0IGNvbnN0IFVSTF9VU0VSSU5GT19SRUdFWCA9IC8oW2EtekEtWl1bYS16QS1aMC05Ky4tXXswLDY0fTpcXC9cXC8pW15cXHMvQDpdezEsMjU2fSg/OjpbXlxccy9AXXswLDI1Nn0pP0AvZ1xuXG5leHBvcnQgY29uc3QgUkVEQUNURURfS0VZUyA9IFtcbiAgICAndXNlcicsICdrZXknLFxuICAgICd1c2VyTmFtZScsICdhY2Nlc3NLZXknLFxuICAgICdicm93c2Vyc3RhY2sudXNlcicsICdicm93c2Vyc3RhY2sua2V5JyxcbiAgICAnYnJvd3NlcnN0YWNrLnVzZXJOYW1lJywgJ2Jyb3dzZXJzdGFjay5hY2Nlc3NLZXknLFxuICAgICdwYXNzd29yZCcsICdwcm94eVBhc3N3b3JkJywgJ3Byb3h5VXNlcicsICdwcm94eVBhc3MnLFxuICAgICdsb2NhbFByb3h5VXNlcicsICdsb2NhbFByb3h5UGFzcycsICdwcm94eVVybCcsXG4gICAgJ2F1dGhUb2tlbicsICdhcGlLZXknLCAnYWNjZXNzVG9rZW4nLCAnc2VjcmV0JywgJ3Rva2VuJyxcbiAgICAnY3VzdG9tVmFyaWFibGVzJywgJ3VzZXJfZGF0YScsICdodHRwUHJveHknLCAnaHR0cHNQcm94eSdcbl1cblxuZXhwb3J0IGNvbnN0IFBFUkNZX0RPTV9DSEFOR0lOR19DT01NQU5EU19FTkRQT0lOVFMgPSBbXG4gICAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvdXJsJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9mb3J3YXJkJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9iYWNrJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9yZWZyZXNoJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9zY3JlZW5zaG90JyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hY3Rpb25zJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL3NoYWtlJ1xuXVxuXG5leHBvcnQgY29uc3QgQ0FQVFVSRV9NT0RFUyA9IFsnY2xpY2snLCAnYXV0bycsICdzY3JlZW5zaG90JywgJ21hbnVhbCcsICd0ZXN0Y2FzZSddXG5leHBvcnQgY29uc3QgTE9HX0tJTkRfVVNBR0VfTUFQID0ge1xuICAgICdURVNUX0xPRyc6ICdsb2cnLFxuICAgICdURVNUX1NDUkVFTlNIT1QnOiAnc2NyZWVuc2hvdCcsXG4gICAgJ1RFU1RfU1RFUCc6ICdzdGVwJyxcbiAgICAnSFRUUCc6ICdodHRwJ1xufVxuXG5leHBvcnQgY29uc3QgRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwgPSAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9zZGsvdjEvZXZlbnQnXG5cbmV4cG9ydCBjb25zdCBFRFNfVVJMID0gJ2h0dHBzOi8vZWRzLmJyb3dzZXJzdGFjay5jb20nXG5cbmV4cG9ydCBjb25zdCBTVVBQT1JURURfQlJPV1NFUlNfRk9SX0FJID0gWydjaHJvbWUnLCAnbWljcm9zb2Z0ZWRnZScsICdmaXJlZm94J11cblxuZXhwb3J0IGNvbnN0IFRDR19VUkwgPSAnaHR0cHM6Ly90Y2cuYnJvd3NlcnN0YWNrLmNvbSdcblxuZXhwb3J0IGNvbnN0IFRDR19JTkZPID0ge1xuICAgIHRjZ1JlZ2lvbjogJ3VzZScsXG4gICAgdGNnVXJsOiBUQ0dfVVJMLFxufVxuXG4vLyBTbWFydCBTZWxlY3Rpb24gTW9kZSBDb25zdGFudHNcbmV4cG9ydCBjb25zdCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCA9ICdyZWxldmFudEZpcnN0J1xuZXhwb3J0IGNvbnN0IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX09OTFkgPSAncmVsZXZhbnRPbmx5J1xuXG4vLyBFbnYgdmFyaWFibGVzIC0gRGVmaW5lIGFsbCB0aGUgZW52IHZhcmlhYmxlIGNvbnN0YW50cyBvdmVyIGhlcmVcblxuLy8gVG8gc3RvcmUgdGhlIEpXVCB0b2tlbiByZXR1cm5lZCB0aGUgc2Vzc2lvbiBsYXVuY2hcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QgPSAnQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUJ1xuXG4vLyBUbyBzdG9yZSB0Y2cgYXV0aCByZXN1bHQgZm9yIHNlbGZIZWFsaW5nIGZlYXR1cmU6XG5leHBvcnQgY29uc3QgQlNUQUNLX1RDR19BVVRIX1JFU1VMVCA9ICdCU1RBQ0tfVENHX0FVVEhfUkVTVUxUJ1xuXG4vLyBUbyBzdG9yZSB0aGUgc2V0dGluZyBvZiB3aGV0aGVyIHRvIHNlbmQgc2NyZWVuc2hvdHMgb3Igbm90XG5leHBvcnQgY29uc3QgVEVTVE9QU19TQ1JFRU5TSE9UX0VOViA9ICdCU19URVNUT1BTX0FMTE9XX1NDUkVFTlNIT1RTJ1xuXG4vLyBUbyBzdG9yZSBidWlsZCBoYXNoZWQgaWRcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEID0gJ0JST1dTRVJTVEFDS19URVNUSFVCX1VVSUQnXG4vLyBJbnRlcnJ1cHQgc2lnbmFsLCBwcm9wYWdhdGVkIHZpYSBlbnYgc28gdGhlIGRldGFjaGVkIGNsZWFudXAgY2hpbGQgYW5kIGdSUENcbi8vIHN0b3AgcGF0aCBjYW4gc3RhbXAgdGhlIGtpbGwgcmVhc29uIG9udG8gdGhlIGJ1aWxkIHN0b3AuXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0tJTExfU0lHTkFMID0gJ0JST1dTRVJTVEFDS19TREtfS0lMTF9TSUdOQUwnXG5cbi8vIFRvIHN0b3JlIHRlc3QgcnVuIHV1aWRcbmV4cG9ydCBjb25zdCBURVNUX0FOQUxZVElDU19JRCA9ICdURVNUX0FOQUxZVElDU19JRCdcblxuLy8gV2hldGhlciB0byBjb2xsZWN0IHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbiBvciBub3RcbmV4cG9ydCBjb25zdCBQRVJGX01FQVNVUkVNRU5UX0VOViA9ICdCUk9XU0VSU1RBQ0tfTzExWV9QRVJGX01FQVNVUkVNRU5UJ1xuXG4vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHJ1biBpcyByZXJ1biBvciBub3RcbmV4cG9ydCBjb25zdCBSRVJVTl9URVNUU19FTlYgPSAnQlJPV1NFUlNUQUNLX1JFUlVOX1RFU1RTJ1xuXG4vLyBUaGUgdGVzdHMgdGhhdCBuZWVkcyB0byBiZSByZXJ1blxuZXhwb3J0IGNvbnN0IFJFUlVOX0VOViA9ICdCUk9XU0VSU1RBQ0tfUkVSVU4nXG5cbi8vIFRvIHN0b3JlIHdoZXRoZXIgdGhlIGJ1aWxkIGxhdW5jaCBoYXMgY29tcGxldGVkIG9yIG5vdFxuZXhwb3J0IGNvbnN0IFRFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOViA9ICdCU19URVNUT1BTX0JVSUxEX0NPTVBMRVRFRCdcblxuLy8gV2hldGhlciBwZXJjeSBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkgb3Igbm90XG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1BFUkNZID0gJ0JST1dTRVJTVEFDS19QRVJDWSdcblxuLy8gV2hldGhlciBzZXNzaW9uIGlzIGEgYWNjZXNzaWJpbGl0eSBzZXNzaW9uXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFkgPSAnQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFknXG5cbi8vIFdoZXRoZXIgc2Vzc2lvbiBpcyBhIHRlc3QgcmVwb3J0aW5nIHNlc3Npb25cbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSA9ICdCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSdcblxuLy8gTG9hZCBUZXN0aW5nIFNlcnZpY2UgKExUUykgZW52IHZhcnM6IHRoZSBwb2QtaXRlcmF0aW9uIHNlc3Npb24gaWQgKGl0c1xuLy8gcHJlc2VuY2UgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIFwidGhpcyBydW4gaXMgYW4gTFRTIHBvZFxuLy8gaXRlcmF0aW9uXCIpIGFuZCBhbiBvcHRpb25hbCBvcHQtaW4gZmxhZyBmb3IgbG9jYWwgcmVwcm8gLyBDSSBydW5zIHRoYXRcbi8vIGRvbid0IGhhdmUgYSByZWFsIHNlc3Npb24gaWQuXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEID0gJ0JST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRCdcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfTFRTID0gJ0JST1dTRVJTVEFDS19MVFMnXG5cbi8vIE5ldyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGVudmlyb25tZW50IHZhcmlhYmxlc1xuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUX1JFUE9SVElORyA9ICdCUk9XU0VSU1RBQ0tfVEVTVF9SRVBPUlRJTkcnXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1RFU1RfUkVQT1JUSU5HX0RFQlVHID0gJ0JST1dTRVJTVEFDS19URVNUX1JFUE9SVElOR19ERUJVRydcbmV4cG9ydCBjb25zdCBURVNUX1JFUE9SVElOR19CVUlMRF9UQUcgPSAnVEVTVF9SRVBPUlRJTkdfQlVJTERfVEFHJ1xuZXhwb3J0IGNvbnN0IFRFU1RfUkVQT1JUSU5HX1BST0pFQ1RfTkFNRSA9ICdURVNUX1JFUE9SVElOR19QUk9KRUNUX05BTUUnXG5leHBvcnQgY29uc3QgVEVTVF9SRVBPUlRJTkdfQlVJTERfTkFNRSA9ICdURVNUX1JFUE9SVElOR19CVUlMRF9OQU1FJ1xuXG4vLyBNYXhpbXVtIHNpemUgb2YgVkNTIGluZm8gd2hpY2ggaXMgYWxsb3dlZFxuZXhwb3J0IGNvbnN0IE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVMgPSA2NCAqIDEwMjRcblxuLyogVGhlIHZhbHVlIHRvIGJlIGFwcGVuZGVkIGF0IHRoZSBlbmQgaWYgZ2l0IG1ldGFkYXRhIGlzIGxhcmdlciB0aGFuIE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVNcbiovXG5leHBvcnQgY29uc3QgR0lUX01FVEFfREFUQV9UUlVOQ0FURUQgPSAnLi4uW1RSVU5DQVRFRF0nXG5cbi8vIENMSSByZWxhdGVkIGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IENMSV9TVE9QX1RJTUVPVVQgPSA1MDAwIC8vIDUgc2Vjb25kc1xuZXhwb3J0IGNvbnN0IEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTID0gWydFVFhUQlNZJywgJ0VCVVNZJ11cbmV4cG9ydCBjb25zdCBNQVhfU1BBV05fUkVUUklFUyA9IDNcbmV4cG9ydCBjb25zdCBTUEFXTl9SRVRSWV9ERUxBWV9NUyA9IDEwMDBcbmV4cG9ydCBjb25zdCBXRElPX05BTUlOR19QUkVGSVggPSAnV2ViZHJpdmVySU8tJ1xuZXhwb3J0IGNvbnN0IFBFUkZfTUVUUklDU19XQUlUX1RJTUUgPSAyMDAwXG5cbi8vIEJ1aWxkLXN0b3AgZGVsaXZlcnkgYnVkZ2V0LiBUaGUgc3RvcCBQVVQgaXMgdGhlIG9ubHkgc2lnbmFsIHRoYXQgY2xvc2VzIGEgVFJBIGJ1aWxkLFxuLy8gc28gYSB0cmFuc2llbnQgdHJhbnNwb3J0IGZhaWx1cmUgaXMgd29ydGggcmV0cnlpbmcgcGFzdCBhIHNob3J0IG5ldHdvcmsgYmxpcCBcdTIwMTQgYnV0IHRoZVxuLy8gd2hvbGUgdGhpbmcgcnVucyBkdXJpbmcgc2h1dGRvd24sIHNvIHRoZSB0b3RhbCBjb3N0IGlzIGNhcHBlZCBieSBhIHdhbGwtY2xvY2sgZGVhZGxpbmVcbi8vIHJhdGhlciB0aGFuIGJ5IGF0dGVtcHQgY291bnQgYWxvbmUuXG5leHBvcnQgY29uc3QgU1RPUF9CVUlMRF9NQVhfQVRURU1QVFMgPSA0XG5leHBvcnQgY29uc3QgU1RPUF9CVUlMRF9BVFRFTVBUX1RJTUVPVVRfTVMgPSAxMDAwMFxuZXhwb3J0IGNvbnN0IFNUT1BfQlVJTERfVE9UQUxfQlVER0VUX01TID0gMzAwMDBcbmV4cG9ydCBjb25zdCBTVE9QX0JVSUxEX0JBQ0tPRkZfQkFTRV9NUyA9IDEwMDBcblxuLy8gQVBJIEVuZHBvaW50IGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IFVQREFURURfQ0xJX0VORFBPSU5UID0gJ3Nkay92MS91cGRhdGVfY2xpJ1xuXG4vKipcbiAqIE1vZHVsZSBIb29rIEV2ZW50cyAtIFBlcmZvcm1hbmNlIGV2ZW50IG5hbWVzIGZvciBtb2R1bGUgbGlmZWN5Y2xlIHRyYWNraW5nXG4gKiBVc2VkIGJ5IG1vZHVsZS1ob29rLXRyYWNrZXIudHMgdG8gaW5zdHJ1bWVudCBtb2R1bGUgaW5pdGlhbGl6YXRpb24gYW5kIGNsZWFudXBcbiAqL1xuZXhwb3J0IGNvbnN0IE1PRFVMRV9IT09LX0VWRU5UUyA9IHtcbiAgICAvLyBJbnN0cnVtZW50YXRpb24gbW9kdWxlXG4gICAgSU5TVFJVTUVOVEFUSU9OX09OX1NUQVJUOiAnTU9EVUxFX0lOU1RSVU1FTlRBVElPTl9PTl9TVEFSVCcsXG4gICAgSU5TVFJVTUVOVEFUSU9OX09OX1NUT1A6ICdNT0RVTEVfSU5TVFJVTUVOVEFUSU9OX09OX1NUT1AnLFxuXG4gICAgLy8gVGVzdEh1YiBtb2R1bGVcbiAgICBURVNUSFVCX09OX1NUQVJUOiAnTU9EVUxFX1RFU1RIVUJfT05fU1RBUlQnLFxuICAgIFRFU1RIVUJfT05fU1RPUDogJ01PRFVMRV9URVNUSFVCX09OX1NUT1AnLFxuXG4gICAgLy8gT2JzZXJ2YWJpbGl0eSBtb2R1bGVcbiAgICBPQlNFUlZBQklMSVRZX09OX1NUQVJUOiAnTU9EVUxFX09CU0VSVkFCSUxJVFlfT05fU1RBUlQnLFxuICAgIE9CU0VSVkFCSUxJVFlfT05fU1RPUDogJ01PRFVMRV9PQlNFUlZBQklMSVRZX09OX1NUT1AnLFxuXG4gICAgLy8gUGVyY3kgbW9kdWxlXG4gICAgUEVSQ1lfT05fU1RBUlQ6ICdNT0RVTEVfUEVSQ1lfT05fU1RBUlQnLFxuICAgIFBFUkNZX09OX1NUT1A6ICdNT0RVTEVfUEVSQ1lfT05fU1RPUCcsXG5cbiAgICAvLyBBY2Nlc3NpYmlsaXR5IG1vZHVsZVxuICAgIEFDQ0VTU0lCSUxJVFlfT05fU1RBUlQ6ICdNT0RVTEVfQUNDRVNTSUJJTElUWV9PTl9TVEFSVCcsXG4gICAgQUNDRVNTSUJJTElUWV9PTl9TVE9QOiAnTU9EVUxFX0FDQ0VTU0lCSUxJVFlfT05fU1RPUCcsXG4gICAgQUNDRVNTSUJJTElUWV9PTl9EUklWRVJfSU5JVDogJ01PRFVMRV9BQ0NFU1NJQklMSVRZX09OX0RSSVZFUl9JTklUJyxcblxuICAgIC8vIEFJIG1vZHVsZVxuICAgIEFJX09OX1NUQVJUOiAnTU9EVUxFX0FJX09OX1NUQVJUJyxcbiAgICBBSV9PTl9TVE9QOiAnTU9EVUxFX0FJX09OX1NUT1AnLFxuICAgIEFJX0JFRk9SRV9TRVNTSU9OOiAnTU9EVUxFX0FJX0JFRk9SRV9TRVNTSU9OJyxcbiAgICBBSV9PTl9EUklWRVJfSU5JVDogJ01PRFVMRV9BSV9PTl9EUklWRVJfSU5JVCcsXG5cbiAgICAvLyBMb2NhbCB0ZXN0aW5nIG1vZHVsZVxuICAgIExPQ0FMX09OX1NUQVJUOiAnTU9EVUxFX0xPQ0FMX09OX1NUQVJUJyxcbiAgICBMT0NBTF9PTl9TVE9QOiAnTU9EVUxFX0xPQ0FMX09OX1NUT1AnLFxuICAgIExPQ0FMX0lOSVRfU0VTU0lPTjogJ01PRFVMRV9MT0NBTF9JTklUX1NFU1NJT04nLFxuICAgIExPQ0FMX09OX0RSSVZFUl9JTklUOiAnTU9EVUxFX0xPQ0FMX09OX0RSSVZFUl9JTklUJyxcblxuICAgIC8vIEFwcCBBdXRvbWF0ZSBtb2R1bGVcbiAgICBBUFBBVVRPTUFURV9PTl9TVEFSVDogJ01PRFVMRV9BUFBBVVRPTUFURV9PTl9TVEFSVCcsXG4gICAgQVBQQVVUT01BVEVfT05fRFJJVkVSX0lOSVQ6ICdNT0RVTEVfQVBQQVVUT01BVEVfT05fRFJJVkVSX0lOSVQnLFxufSBhcyBjb25zdFxuIiwgImV4cG9ydCBkZWZhdWx0IGNsYXNzIEFQSVV0aWxzIHtcbiAgICBzdGF0aWMgRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwgPSAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9zZGsvdjEvZXZlbnQnXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BQV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19QRVJDWV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfQ0xPVURfVVJMID0gJ2h0dHBzOi8vYXBpLWNsb3VkLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BQV9BUElfQ0xPVURfVVJMID0gJ2h0dHBzOi8vYXBpLWNsb3VkLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEFQUF9BTExZX0VORFBPSU5UID0gJ2h0dHBzOi8vYXBwLWFjY2Vzc2liaWxpdHkuYnJvd3NlcnN0YWNrLmNvbS9hdXRvbWF0ZSdcbiAgICBzdGF0aWMgREFUQV9FTkRQT0lOVCA9ICdodHRwczovL2NvbGxlY3Rvci1vYnNlcnZhYmlsaXR5LmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIFVQTE9BRF9MT0dTX0FERFJFU1MgPSAnaHR0cHM6Ly91cGxvYWQtb2JzZXJ2YWJpbGl0eS5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBFRFNfVVJMID0gJ2h0dHBzOi8vZWRzLmJyb3dzZXJzdGFjay5jb20nXG5cbiAgICBzdGF0aWMgdXBkYXRlVVJMU0ZvckdSUihhcGlzOiBHUlJVcmxzKSB7XG4gICAgICAgIHRoaXMuRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwgPSBgJHthcGlzLmF1dG9tYXRlLmFwaX0vc2RrL3YxL2V2ZW50YFxuICAgICAgICB0aGlzLkJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfVVJMID0gYXBpcy5hdXRvbWF0ZS5hcGlcbiAgICAgICAgdGhpcy5CUk9XU0VSU1RBQ0tfQUFfQVBJX1VSTCA9IGFwaXMuYXBwQXV0b21hdGUuYXBpXG4gICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX1BFUkNZX0FQSV9VUkwgPSBhcGlzLnBlcmN5LmFwaVxuICAgICAgICB0aGlzLkJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfQ0xPVURfVVJMID0gYXBpcy5hdXRvbWF0ZS51cGxvYWRcbiAgICAgICAgdGhpcy5CUk9XU0VSU1RBQ0tfQUFfQVBJX0NMT1VEX1VSTCA9IGFwaXMuYXBwQXV0b21hdGUudXBsb2FkXG4gICAgICAgIHRoaXMuQVBQX0FMTFlfRU5EUE9JTlQgPSBgJHthcGlzLmFwcEFjY2Vzc2liaWxpdHkuYXBpfS9hdXRvbWF0ZWBcbiAgICAgICAgdGhpcy5EQVRBX0VORFBPSU5UID0gYXBpcy5vYnNlcnZhYmlsaXR5LmFwaVxuICAgICAgICB0aGlzLlVQTE9BRF9MT0dTX0FERFJFU1MgPSBhcGlzLm9ic2VydmFiaWxpdHkudXBsb2FkXG4gICAgICAgIHRoaXMuRURTX1VSTCA9IGFwaXMuZWRzSW5zdHJ1bWVudGF0aW9uLmFwaVxuICAgIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IHBsYXRmb3JtLCBhcmNoLCBob21lZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB1dGlsLCB7IHByb21pc2lmeSB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ25vZGU6c3RyZWFtJ1xuaW1wb3J0IHR5cGUgeyBaaXBGaWxlLCBPcHRpb25zIGFzIHlhdXpsT3B0aW9ucyB9IGZyb20gJ3lhdXpsJ1xuaW1wb3J0IHlhdXpsIGZyb20gJ3lhdXpsJ1xuaW1wb3J0IHsgdGhyZWFkSWQgfSBmcm9tICdub2RlOndvcmtlcl90aHJlYWRzJ1xuXG5pbXBvcnQgeyBfZmV0Y2ggYXMgZmV0Y2ggfSBmcm9tICcuLi9mZXRjaFdyYXBwZXIuanMnXG5cbmltcG9ydCB7XG4gICAgaXNOdWxsT3JFbXB0eSxcbiAgICBuZXN0ZWRLZXlWYWx1ZSxcbiAgICBjcmVhdGVEaXIsXG4gICAgaXNXcml0YWJsZSxcbiAgICBzZXRSZWFkV3JpdGVBY2Nlc3MsXG4gICAgaXNUcnVlLFxuICAgIGdldEJyb3dzZXJTdGFja1VzZXIsXG4gICAgZ2V0QnJvd3NlclN0YWNrS2V5LFxuICAgIGlzRmFsc2UsXG4gICAgaXNUdXJib1NjYWxlLFxuICAgIHNob3VsZEFkZFNlcnZpY2VWZXJzaW9uLFxufSBmcm9tICcuLi91dGlsLmpzJ1xuaW1wb3J0IFBlcmZvcm1hbmNlVGVzdGVyIGZyb20gJy4uL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgeyBFVkVOVFMgYXMgUGVyZm9ybWFuY2VFdmVudHMgfSBmcm9tICcuLi9pbnN0cnVtZW50YXRpb24vcGVyZm9ybWFuY2UvY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIGFzIGxvZ2dlciB9IGZyb20gJy4vY2xpTG9nZ2VyLmpzJ1xuaW1wb3J0IHsgVVBEQVRFRF9DTElfRU5EUE9JTlQsIEJTVEFDS19TRVJWSUNFX1ZFUlNJT04sIEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zLCBDYXBhYmlsaXRpZXMgfSBmcm9tICdAd2Rpby90eXBlcydcbmltcG9ydCB0eXBlIHtcbiAgICBCcm93c2Vyc3RhY2tDb25maWcsXG4gICAgQnJvd3NlcnN0YWNrT3B0aW9ucyxcbiAgICBUZXN0TWFuYWdlbWVudE9wdGlvbnMsXG4gICAgVGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLFxufSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IFRlc3RGcmFtZXdvcmtDb25zdGFudHMgfSBmcm9tICcuL2ZyYW1ld29ya3MvY29uc3RhbnRzL3Rlc3RGcmFtZXdvcmtDb25zdGFudHMuanMnXG5pbXBvcnQgQVBJVXRpbHMgZnJvbSAnLi9hcGlVdGlscy5qcydcblxuY29uc3QgQ0xJX0xPQ0tfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDBcbmNvbnN0IENMSV9MT0NLX1BPTExfTVMgPSAxMDAwXG5jb25zdCBDTElfRE9XTkxPQURfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDBcbmNvbnN0IENMSV9ET1dOTE9BRF9UTVBfUFJFRklYID0gJ2Rvd25sb2FkZWRfZmlsZV8nXG5jb25zdCBDTElfRE9XTkxPQURfVE1QX1NVRkZJWCA9ICcuemlwJ1xuXG5leHBvcnQgY2xhc3MgQ0xJVXRpbHMge1xuICAgIHN0YXRpYyBhdXRvbWF0aW9uRnJhbWV3b3JrRGV0YWlsID0ge31cbiAgICBzdGF0aWMgdGVzdEZyYW1ld29ya0RldGFpbCA9IHt9XG4gICAgc3RhdGljIENMSVN1cHBvcnRlZEZyYW1ld29ya3MgPSBbJ21vY2hhJ11cblxuICAgIHN0YXRpYyBpc0RldmVsb3BtZW50RW52KCkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0NMSV9FTlYgPT09ICdkZXZlbG9wbWVudCdcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0Q0xJUGFyYW1zRm9yRGV2RW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19DTElfRU5WIHx8ICcnLFxuICAgICAgICAgICAgbGlzdGVuOiBgdW5peDovdG1wL3Nkay1wbGF0Zm9ybS0ke3Byb2Nlc3MuZW52LkJST1dTRVJTVEFDS19DTElfRU5WfS5zb2NrYCxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGNvbmZpZyBvYmplY3QgZm9yIGJpbmFyeSBzZXNzaW9uIHJlcXVlc3RcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRCaW5Db25maWcoXG4gICAgICAgIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICAgICBjYXBhYmlsaXRpZXM6XG4gICAgICAgICAgICB8IENhcGFiaWxpdGllcy5SZXF1ZXN0ZWRTdGFuZGFsb25lQ2FwYWJpbGl0aWVzXG4gICAgICAgICAgICB8IENhcGFiaWxpdGllcy5SZXF1ZXN0ZWRTdGFuZGFsb25lQ2FwYWJpbGl0aWVzW10sXG4gICAgICAgIG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIEJyb3dzZXJzdGFja09wdGlvbnMsXG4gICAgICAgIGJ1aWxkVGFnPzogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBjb25zdCBtb2RpZmllZE9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5vcHRpb25zIH1cbiAgICAgICAgaWYgKG1vZGlmaWVkT3B0cy5vcHRzKSB7XG4gICAgICAgICAgICBtb2RpZmllZE9wdHMuYnJvd3NlclN0YWNrTG9jYWxPcHRpb25zID0gbW9kaWZpZWRPcHRzLm9wdHNcbiAgICAgICAgICAgIGRlbGV0ZSBtb2RpZmllZE9wdHMub3B0c1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBtb2RpZmllZE9wdHMudGVzdE1hbmFnZW1lbnRPcHRpb25zXG5cbiAgICAgICAgbW9kaWZpZWRPcHRzLnRlc3RDb250ZXh0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHNraXBTZXNzaW9uTmFtZTogaXNGYWxzZShtb2RpZmllZE9wdHMuc2V0U2Vzc2lvbk5hbWUpLFxuICAgICAgICAgICAgc2tpcFNlc3Npb25TdGF0dXM6IGlzRmFsc2UobW9kaWZpZWRPcHRzLnNldFNlc3Npb25TdGF0dXMpLFxuICAgICAgICAgICAgc2Vzc2lvbk5hbWVPbWl0VGVzdFRpdGxlOiBtb2RpZmllZE9wdHMuc2Vzc2lvbk5hbWVPbWl0VGVzdFRpdGxlIHx8IGZhbHNlLFxuICAgICAgICAgICAgc2Vzc2lvbk5hbWVQcmVwZW5kVG9wTGV2ZWxTdWl0ZVRpdGxlOlxuICAgICAgICAgICAgICAgIG1vZGlmaWVkT3B0cy5zZXNzaW9uTmFtZVByZXBlbmRUb3BMZXZlbFN1aXRlVGl0bGUgfHwgZmFsc2UsXG4gICAgICAgICAgICBzZXNzaW9uTmFtZUZvcm1hdDogbW9kaWZpZWRPcHRzLnNlc3Npb25OYW1lRm9ybWF0IHx8ICcnLFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tbW9uQnN0YWNrT3B0aW9ucyA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzICYmXG4gICAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoY2FwYWJpbGl0aWVzKSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBjYXBhYmlsaXRpZXMgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgJ2JzdGFjazpvcHRpb25zJyBpbiAoY2FwYWJpbGl0aWVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FzdCBhZnRlciBndWFyZCB0byBzYXRpc2Z5IFR5cGVTY3JpcHRcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMgYXMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnYnN0YWNrOm9wdGlvbnMnXT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApWydic3RhY2s6b3B0aW9ucyddIHx8IHt9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgIH0pKClcblxuICAgICAgICBjb25zdCBpc05vbkJzdGFja0ExMXkgPVxuICAgICAgICAgICAgaXNUdXJib1NjYWxlKG9wdGlvbnMpIHx8XG4gICAgICAgICAgICAhc2hvdWxkQWRkU2VydmljZVZlcnNpb24oXG4gICAgICAgICAgICAgICAgY29uZmlnIGFzIE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICAgICAgICAgICAgICBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgICAgKVxuICAgICAgICBjb25zdCBvYnNlcnZhYmlsaXR5T3B0aW9uczogVGVzdE9ic2VydmFiaWxpdHlPcHRpb25zID1cbiAgICAgICAgICAgIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zIHx8IHt9XG4gICAgICAgIGNvbnN0IHRlc3RNYW5hZ2VtZW50T3B0aW9uczogVGVzdE1hbmFnZW1lbnRPcHRpb25zID1cbiAgICAgICAgICAgIG9wdGlvbnMudGVzdE1hbmFnZW1lbnRPcHRpb25zIHx8IHt9XG4gICAgICAgIGNvbnN0IHRlc3RQbGFuSWQgPSB0eXBlb2YgdGVzdE1hbmFnZW1lbnRPcHRpb25zLnRlc3RQbGFuSWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IHRlc3RNYW5hZ2VtZW50T3B0aW9ucy50ZXN0UGxhbklkLnRyaW0oKVxuICAgICAgICAgICAgOiAnJ1xuICAgICAgICBjb25zdCBiaW5jb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICAgICAgdXNlck5hbWU6IG9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXIgfHwgY29uZmlnLnVzZXIsXG4gICAgICAgICAgICBhY2Nlc3NLZXk6IG9ic2VydmFiaWxpdHlPcHRpb25zLmtleSB8fCBjb25maWcua2V5LFxuICAgICAgICAgICAgcGxhdGZvcm1zOiBbXSxcbiAgICAgICAgICAgIGlzTm9uQnN0YWNrQTExeVdESU86IGlzTm9uQnN0YWNrQTExeSxcbiAgICAgICAgICAgIC4uLm1vZGlmaWVkT3B0cyxcbiAgICAgICAgICAgIC4uLmNvbW1vbkJzdGFja09wdGlvbnMsXG4gICAgICAgIH1cblxuICAgICAgICBiaW5jb25maWcuYnVpbGROYW1lID0gb2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGROYW1lIHx8IGJpbmNvbmZpZy5idWlsZE5hbWVcbiAgICAgICAgYmluY29uZmlnLnByb2plY3ROYW1lID0gb2JzZXJ2YWJpbGl0eU9wdGlvbnMucHJvamVjdE5hbWUgfHwgYmluY29uZmlnLnByb2plY3ROYW1lXG4gICAgICAgIGJpbmNvbmZpZy5idWlsZFRhZyA9IHRoaXMuZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhvYnNlcnZhYmlsaXR5T3B0aW9ucywgYnVpbGRUYWcpIHx8IFtdXG4gICAgICAgIGlmICh0ZXN0UGxhbklkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGJpbmNvbmZpZy50ZXN0TWFuYWdlbWVudE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdGVzdFBsYW5JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhcHMgPSBBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykgPyBjYXBhYmlsaXRpZXMgOiBbY2FwYWJpbGl0aWVzXVxuICAgICAgICBmb3IgKGNvbnN0IGNhcCBvZiBjYXBzKSB7XG4gICAgICAgICAgICBjb25zdCBwbGF0Zm9ybTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgICAgICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IGNhcCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjYXBhYmlsaXR5KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSAnYnN0YWNrOm9wdGlvbnMnKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1ba2V5XSA9IGNhcGFiaWxpdHlba2V5XVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGlmIChjYXBhYmlsaXR5Wydic3RhY2s6b3B0aW9ucyddKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoXG4gICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1ba2V5XSA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIClba2V5XVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoYmluY29uZmlnLnBsYXRmb3JtcyBhcyBBcnJheTx1bmtub3duPikucHVzaChwbGF0Zm9ybSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYmluY29uZmlnKVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRTZGtWZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTlxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRTZGtMYW5ndWFnZSgpIHtcbiAgICAgICAgcmV0dXJuICdFQ01BU2NyaXB0J1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBzZXR1cENsaVBhdGgoXG4gICAgICAgIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0NvbmZpZ3VyaW5nIENsaSBwYXRoLicpXG4gICAgICAgIGNvbnN0IGRldmVsb3BtZW50QmluYXJ5UGF0aCA9IHByb2Nlc3MuZW52LlNES19DTElfQklOX1BBVEggfHwgbnVsbFxuICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoZGV2ZWxvcG1lbnRCaW5hcnlQYXRoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBEZXZlbG9wbWVudCBDbGkgUGF0aDogJHtkZXZlbG9wbWVudEJpbmFyeVBhdGh9YClcbiAgICAgICAgICAgIHJldHVybiBkZXZlbG9wbWVudEJpbmFyeVBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjbGlEaXIgPSB0aGlzLmdldENsaURpcigpXG4gICAgICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShjbGlEaXIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB3cml0YWJsZSBkaXJlY3RvcnkgYXZhaWxhYmxlIGZvciB0aGUgQ0xJJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xpUGF0aCA9IHRoaXMuZ2V0RXhpc3RpbmdDbGlQYXRoKGNsaURpcilcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsQmluYXJ5UGF0aCA9IGF3YWl0IHRoaXMuY2hlY2tBbmRVcGRhdGVDbGkoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdDbGlQYXRoLFxuICAgICAgICAgICAgICAgIGNsaURpcixcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYFJlc29sdmVkIGJpbmFyeSBwYXRoOiAke2ZpbmFsQmluYXJ5UGF0aH1gKVxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsQmluYXJ5UGF0aFxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgRXJyb3IgaW4gc2V0dGluZyB1cCBjbGkgcGF0aCBkaXJlY3RvcnksIEV4Y2VwdGlvbjogJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgY2hlY2tBbmRVcGRhdGVDbGkoXG4gICAgICAgIGV4aXN0aW5nQ2xpUGF0aDogc3RyaW5nLFxuICAgICAgICBjbGlEaXI6IHN0cmluZyxcbiAgICAgICAgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsXG4gICAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIC8vIFNraXAgQ0xJIHVwZGF0ZSBpbiB3b3JrZXIgcHJvY2Vzc2VzIC0gb25seSBsYXVuY2hlciBzaG91bGQgdXBkYXRlXG4gICAgICAgIC8vIFdvcmtlcnMgYXJlIGlkZW50aWZpZWQgYnkgaGF2aW5nIEJST1dTRVJTVEFDS19URVNUSFVCX0pXVCBzZXQgKGJ1aWxkIGFscmVhZHkgc3RhcnRlZClcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUSFVCX0pXVCkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBXb3JrZXIgcHJvY2VzcyBkZXRlY3RlZCwgc2tpcHBpbmcgQ0xJIHVwZGF0ZS4gVXNpbmcgZXhpc3Rpbmc6ICR7ZXhpc3RpbmdDbGlQYXRofWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdDbGlQYXRoICYmIGZzLmV4aXN0c1N5bmMoZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0NsaVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICdXb3JrZXIgcHJvY2VzcyBoYXMgbm8gZXhpc3RpbmcgQ0xJIGJpbmFyeSwgYXR0ZW1wdGluZyBkb3dubG9hZCBhcyBmYWxsYmFjay4nLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuc3RhcnQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgIGxvZ2dlci5pbmZvKGBDdXJyZW50IENMSSBQYXRoIEZvdW5kOiAke2V4aXN0aW5nQ2xpUGF0aH1gKVxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIHNka192ZXJzaW9uOiBDTElVdGlscy5nZXRTZGtWZXJzaW9uKCksXG4gICAgICAgICAgICBvczogcGxhdGZvcm0oKSxcbiAgICAgICAgICAgIG9zX2FyY2g6IGFyY2goKSxcbiAgICAgICAgICAgIGNsaV92ZXJzaW9uOiAnMCcsXG4gICAgICAgICAgICBzZGtfbGFuZ3VhZ2U6IHRoaXMuZ2V0U2RrTGFuZ3VhZ2UoKSxcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgLy8gSWYgYmluYXJ5IGlzIGJ1c3kgKGJlaW5nIGV4ZWN1dGVkIGJ5IGFub3RoZXIgcHJvY2VzcyksIHNraXAgdmVyc2lvbiBjaGVja1xuICAgICAgICAgICAgLy8gYW5kIEFQSSBjYWxsIGVudGlyZWx5IFx1MjAxNCB1c2UgZXhpc3RpbmcgYmluYXJ5IGFzLWlzXG4gICAgICAgICAgICBpZiAodGhpcy5pc0JpbmFyeUJ1c3koZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBFeGlzdGluZyBiaW5hcnkgaXMgY3VycmVudGx5IGluIHVzZSwgc2tpcHBpbmcgdXBkYXRlOiAke2V4aXN0aW5nQ2xpUGF0aH1gKVxuICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChQZXJmb3JtYW5jZUV2ZW50cy5TREtfQ0xJX0NIRUNLX1VQREFURSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdDbGlQYXRoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgdGhpcy5ydW5TaGVsbENvbW1hbmQoXG4gICAgICAgICAgICAgICAgYCR7ZXhpc3RpbmdDbGlQYXRofSB2ZXJzaW9uYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmICh2ZXJzaW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3RleHQgZmlsZSBidXN5JykpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgQmluYXJ5IGJ1c3kgZHVyaW5nIHZlcnNpb24gY2hlY2ssIHNraXBwaW5nIHVwZGF0ZTogJHtleGlzdGluZ0NsaVBhdGh9YClcbiAgICAgICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ2xpUGF0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcnlQYXJhbXMuY2xpX3ZlcnNpb24gPSB2ZXJzaW9uXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3RUb1VwZGF0ZUNMSShxdWVyeVBhcmFtcywgY29uZmlnKVxuICAgICAgICBpZiAobmVzdGVkS2V5VmFsdWUocmVzcG9uc2UsIFsndXBkYXRlZF9jbGlfdmVyc2lvbiddKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBOZWVkIHRvIHVwZGF0ZSBiaW5hcnksIGN1cnJlbnQgYmluYXJ5IHZlcnNpb246ICR7cXVlcnlQYXJhbXMuY2xpX3ZlcnNpb259YCxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgY29uc3QgYnJvd3NlclN0YWNrQmluYXJ5VXJsID1cbiAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQklOQVJZX1VSTCB8fCBudWxsXG4gICAgICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoYnJvd3NlclN0YWNrQmluYXJ5VXJsKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgYFVzaW5nIEJST1dTRVJTVEFDS19CSU5BUllfVVJMOiAke2Jyb3dzZXJTdGFja0JpbmFyeVVybH1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXNwb25zZS51cmwgPSBicm93c2VyU3RhY2tCaW5hcnlVcmxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmluYWxCaW5hcnlQYXRoID0gYXdhaXQgdGhpcy5kb3dubG9hZExhdGVzdEJpbmFyeShcbiAgICAgICAgICAgICAgICBuZXN0ZWRLZXlWYWx1ZShyZXNwb25zZSwgWyd1cmwnXSksXG4gICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgIG5lc3RlZEtleVZhbHVlKHJlc3BvbnNlLCBbJ3VwZGF0ZWRfY2xpX3ZlcnNpb24nXSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgICAgICByZXR1cm4gZmluYWxCaW5hcnlQYXRoXG4gICAgICAgIH1cbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfQ0hFQ0tfVVBEQVRFKVxuICAgICAgICByZXR1cm4gZXhpc3RpbmdDbGlQYXRoXG4gICAgfVxuXG4gICAgc3RhdGljIGdldENsaURpcigpIHtcbiAgICAgICAgY29uc3Qgd3JpdGFibGVEaXIgPSB0aGlzLmdldFdyaXRhYmxlRGlyKClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KHdyaXRhYmxlRGlyKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gd3JpdGFibGUgZGlyZWN0b3J5IGF2YWlsYWJsZSBmb3IgdGhlIENMSScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjbGlEaXJQYXRoID0gcGF0aC5qb2luKHdyaXRhYmxlRGlyISwgJ2NsaScpXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xpRGlyUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVEaXIoY2xpRGlyUGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbGlEaXJQYXRoXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgIGBFcnJvciBpbiBnZXR0aW5nIHdyaXRhYmxlIGRpcmVjdG9yeSwgd3JpdGFibGVEaXI9JHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRXcml0YWJsZURpcigpIHtcbiAgICAgICAgY29uc3Qgd3JpdGFibGVEaXJPcHRpb25zID0gW1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0ZJTEVTX0RJUixcbiAgICAgICAgICAgIHBhdGguam9pbihob21lZGlyKCksICcuYnJvd3NlcnN0YWNrJyksXG4gICAgICAgICAgICBwYXRoLmpvaW4oJ3RtcCcsICcuYnJvd3NlcnN0YWNrJyksXG4gICAgICAgIF1cblxuICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2Ygd3JpdGFibGVEaXJPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShwYXRoKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGghKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZpbGUgJHtwYXRofSBhbHJlYWR5IGV4aXN0YClcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1dyaXRhYmxlKHBhdGghKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBHaXZpbmcgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBzZXRSZWFkV3JpdGVBY2Nlc3MocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVHJ1ZShzdWNjZXNzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHByb3ZpZGUgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZpbGUgZG9lcyBub3QgZXhpc3Q6ICR7cGF0aH1gKVxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVEaXIocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgR2l2aW5nIHdyaXRlIHBlcm1pc3Npb24gdG8gJHtwYXRofWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBzZXRSZWFkV3JpdGVBY2Nlc3MocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNUcnVlKHN1Y2Nlc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHByb3ZpZGUgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aFxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIGdldCB3cml0YWJsZSBkaXJlY3RvcnksIGV4Y2VwdGlvbiAke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RXhpc3RpbmdDbGlQYXRoKGNsaURpcjogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGF0aCBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5XG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xpRGlyKSB8fCAhZnMuc3RhdFN5bmMoY2xpRGlyKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIExpc3QgYWxsIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgdGhhdCBzdGFydCB3aXRoIFwiYmluYXJ5LVwiXG4gICAgICAgICAgICBjb25zdCBhbGxCaW5hcmllcyA9IGZzXG4gICAgICAgICAgICAgICAgLnJlYWRkaXJTeW5jKGNsaURpcilcbiAgICAgICAgICAgICAgICAubWFwKChmaWxlOiBzdHJpbmcpID0+IHBhdGguam9pbihjbGlEaXIsIGZpbGUpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChmaWxlUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZnMuc3RhdFN5bmMoZmlsZVBhdGgpLmlzRmlsZSgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKS5zdGFydHNXaXRoKCdiaW5hcnktJyksXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBpZiAoYWxsQmluYXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGF0ZXN0IGJpbmFyeSBieSBjb21wYXJpbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZVxuICAgICAgICAgICAgICAgIGNvbnN0IGxhdGVzdEJpbmFyeSA9IGFsbEJpbmFyaWVzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGZpbGVQYXRoOiBzdHJpbmcpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG10aW1lOiBmcy5zdGF0U3luYyhmaWxlUGF0aCkubXRpbWUsXG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdDogeyBmaWxlUGF0aDogc3RyaW5nOyBtdGltZTogRGF0ZSB9IHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiB7IGZpbGVQYXRoOiBzdHJpbmc7IG10aW1lOiBEYXRlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhdGVzdCB8fCAhbGF0ZXN0Lm10aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQubXRpbWUgPiBsYXRlc3QubXRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGF0ZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiBsYXRlc3RCaW5hcnkgPyBsYXRlc3RCaW5hcnkuZmlsZVBhdGggOiAnJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gJycgLy8gTm8gYmluYXJ5IHByZXNlbnRcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIHdoaWxlIHJlYWRpbmcgQ0xJIHBhdGg6ICR7dXRpbC5mb3JtYXQoZXJyKX1gKVxuICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgaXNCaW5hcnlCdXN5KGJpbmFyeVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShiaW5hcnlQYXRoKSkge3JldHVybiBmYWxzZX1cbiAgICAgICAgaWYgKHBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7cmV0dXJuIGZhbHNlfVxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYmluYXJ5UGF0aCkpIHtyZXR1cm4gZmFsc2V9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZkID0gZnMub3BlblN5bmMoYmluYXJ5UGF0aCwgJ3IrJylcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgaWYgKEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTLmluY2x1ZGVzKGVyci5jb2RlKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQmluYXJ5IGlzIGJ1c3k6ICR7YmluYXJ5UGF0aH1gKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEVycm9yIGNoZWNraW5nIGlmIGJpbmFyeSBpcyBidXN5OiAke2Vyci5tZXNzYWdlfWApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyByZXF1ZXN0VG9VcGRhdGVDTEkgPSBhc3luYyAoXG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgICAgICBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICApID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxdWVyeVBhcmFtcylcbiAgICAgICAgY29uc3QgcmVxdWVzdEluaXQ6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtnZXRCcm93c2VyU3RhY2tVc2VyKGNvbmZpZyl9OiR7Z2V0QnJvd3NlclN0YWNrS2V5KGNvbmZpZyl9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICBgJHtBUElVdGlscy5CUk9XU0VSU1RBQ0tfQVVUT01BVEVfQVBJX1VSTH0vJHtVUERBVEVEX0NMSV9FTkRQT0lOVH0/JHtwYXJhbXMudG9TdHJpbmcoKX1gLFxuICAgICAgICAgICAgcmVxdWVzdEluaXQsXG4gICAgICAgIClcbiAgICAgICAgY29uc3QganNvblJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgcmVzcG9uc2UgJHtKU09OLnN0cmluZ2lmeShqc29uUmVzcG9uc2UpfWApXG4gICAgICAgIHJldHVybiBqc29uUmVzcG9uc2VcbiAgICB9XG5cbiAgICBzdGF0aWMgcnVuU2hlbGxDb21tYW5kKFxuICAgICAgICBjbWRDb21tYW5kOiBzdHJpbmcsXG4gICAgICAgIHdvcmtpbmdEaXIgPSAnJyxcbiAgICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3MgPSBleGVjKFxuICAgICAgICAgICAgICAgIGNtZENvbW1hbmQsXG4gICAgICAgICAgICAgICAgeyBjd2Q6IHdvcmtpbmdEaXIsIHRpbWVvdXQ6IDUwMDAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3I6IEVycm9yLCBzdGRvdXQ6IHN0cmluZywgc3RkZXJyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0ZGVyci50cmltKCkgfHwgJ1NIRUxMX0VYRUNVVEVfRVJST1InKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBwcm9jZXNzIGlzIGtpbGxlZCBpZiBpdCBleGNlZWRzIHRoZSB0aW1lb3V0XG4gICAgICAgICAgICBwcm9jZXNzLm9uKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCdTSEVMTF9FWEVDVVRFX0VSUk9SJylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyc2lvbiBlbmNvZGVkIGluIGEgYmluYXJ5IGRvd25sb2FkIFVSTCwgZS5nLlxuICAgICAqIGAuLi4vYmluYXJ5LW1hY29zLWFybTY0LTEuNDguMC56aXBgIC0+IGAxLjQ4LjBgLiBOdWxsIHdoZW4gdGhlIFVSTCBkb2VzXG4gICAgICogbm90IGNhcnJ5IG9uZSAoY3VzdG9tIEJST1dTRVJTVEFDS19CSU5BUllfVVJMKS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VmVyc2lvbkZyb21CaW5hcnlVcmwoYmluRG93bmxvYWRVcmw6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gLy0oXFxkK1xcLlxcZCtcXC5cXGQrKVxcLnppcCg/OlxcP3wkKS8uZXhlYyhiaW5Eb3dubG9hZFVybCB8fCAnJyk/LlsxXSA/PyBudWxsXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYmluYXJ5IG9uIGRpc2sgaXMgYWxyZWFkeSB0aGUgdmVyc2lvbiB3ZSB3ZXJlIGFza2VkIHRvIGZldGNoLlxuICAgICAqIEEgcGVlciB3b3JrZXIgd2lubmluZyB0aGUgZG93bmxvYWQgcmFjZSBsZWF2ZXMgdGhlICp0YXJnZXQqIHZlcnNpb24gaGVyZTtcbiAgICAgKiBhIG1lcmVseS1wcmUtZXhpc3RpbmcgYmluYXJ5IGlzIHN0YWxlLiBPbmx5IHRoZSBmb3JtZXIgbWF5IHNob3J0LWNpcmN1aXRcbiAgICAgKiB0aGUgZG93bmxvYWQgXHUyMDE0IHNlZSBgZG93bmxvYWRMYXRlc3RCaW5hcnlgLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBpc0JpbmFyeUF0VmVyc2lvbihcbiAgICAgICAgYmluYXJ5UGF0aDogc3RyaW5nLFxuICAgICAgICBleHBlY3RlZFZlcnNpb246IHN0cmluZyB8IG51bGwsXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghZXhwZWN0ZWRWZXJzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYWN0dWFsID0gYXdhaXQgQ0xJVXRpbHMucnVuU2hlbGxDb21tYW5kKGAke2JpbmFyeVBhdGh9IHZlcnNpb25gKVxuICAgICAgICAgICAgcmV0dXJuIGFjdHVhbC50cmltKCkgPT09IGV4cGVjdGVkVmVyc2lvblxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGRvd25sb2FkTGF0ZXN0QmluYXJ5ID0gYXN5bmMgKFxuICAgICAgICBiaW5Eb3dubG9hZFVybDogc3RyaW5nLFxuICAgICAgICBjbGlEaXI6IHN0cmluZyxcbiAgICAgICAgZXhwZWN0ZWRWZXJzaW9uPzogc3RyaW5nIHwgbnVsbCxcbiAgICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+ID0+IHtcbiAgICAgICAgY29uc3QgbG9ja1BhdGggPSBwYXRoLmpvaW4oY2xpRGlyLCAnZG93bmxvYWQubG9jaycpXG4gICAgICAgIC8vIFByZWZlciB0aGUgdmVyc2lvbiB0aGUgc2VydmVyIHJlcG9ydGVkOyB0aGUgVVJMIGlzIG9ubHkgYSBmYWxsYmFjayBhbmRcbiAgICAgICAgLy8gY2FycmllcyBubyB2ZXJzaW9uIHdoZW4gQlJPV1NFUlNUQUNLX0JJTkFSWV9VUkwgb3ZlcnJpZGVzIGl0LlxuICAgICAgICBjb25zdCB0YXJnZXRWZXJzaW9uID1cbiAgICAgICAgICAgIGV4cGVjdGVkVmVyc2lvbiB8fCBDTElVdGlscy5nZXRWZXJzaW9uRnJvbUJpbmFyeVVybChiaW5Eb3dubG9hZFVybClcblxuICAgICAgICBjb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpXG5cbiAgICAgICAgY29uc3QgcGFyc2VMb2NrRmlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhsb2NrUGF0aCwgJ3V0ZjgnKS50cmltKClcbiAgICAgICAgICAgICAgICBjb25zdCBbcGlkTGluZSwgdGltZXN0YW1wTGluZV0gPSBjb250ZW50LnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChwaWRMaW5lLCAxMClcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBOdW1iZXIucGFyc2VJbnQodGltZXN0YW1wTGluZSwgMTApXG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGlkKSB8fCAhTnVtYmVyLmlzRmluaXRlKHRpbWVzdGFtcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcGlkLCB0aW1lc3RhbXAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUHJvY2Vzc1J1bm5pbmcgPSAocGlkOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3F1aXJlTG9jayA9IGFzeW5jIChcbiAgICAgICAgICAgIHRpbWVvdXRNcyA9IENMSV9MT0NLX1RJTUVPVVRfTVMsXG4gICAgICAgICAgICBwb2xsTXMgPSBDTElfTE9DS19QT0xMX01TLFxuICAgICAgICApOiBQcm9taXNlPCgoKSA9PiB2b2lkKSB8IHsgYWxyZWFkeUV4aXN0czogc3RyaW5nIH0+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvbiAtLSBpbnRlbnRpb25hbCBwb2xsIGxvb3A7IGV4aXRzIHZpYSByZXR1cm4vdGhyb3cgYmVsb3dcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhsb2NrUGF0aCwgJ3d4JylcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmQsIGAke3Byb2Nlc3MucGlkfVxcbiR7RGF0ZS5ub3coKX1cXG5gKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsbHkgaWdub3JlIHdyaXRlIGVycm9yczsgdGhlIG9wZW4gZmQgc3RpbGwgaG9sZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGNsdXNpdmUgbG9jayBhbmQgd2lsbCBiZSBjbG9zZWQgaW4gY2xlYW51cFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKGxvY2tQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGNsZWFudXAgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZSBhcyB7IGNvZGU/OiBzdHJpbmcgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VFWElTVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2tNZXRhID0gcGFyc2VMb2NrRmlsZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9ja01ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NrQWdlID0gRGF0ZS5ub3coKSAtIGxvY2tNZXRhLnRpbWVzdGFtcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bm5pbmcgPSBpc1Byb2Nlc3NSdW5uaW5nKGxvY2tNZXRhLnBpZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bm5pbmcgfHwgbG9ja0FnZSA+IHRpbWVvdXRNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTdGFsZSBDTEkgZG93bmxvYWQgbG9jayBkZXRlY3RlZCAocGlkPSR7bG9ja01ldGEucGlkfSwgYWdlPSR7bG9ja0FnZX1tcykuIFJlbW92aW5nIGxvY2suYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhsb2NrUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgYmluYXJ5IGFwcGVhcmVkIHdoaWxlIHdhaXRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQmluYXJ5ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTElVdGlscy5nZXRFeGlzdGluZ0NsaVBhdGgoY2xpRGlyKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQmluYXJ5ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhleGlzdGluZ0JpbmFyeSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5zdGF0U3luYyhleGlzdGluZ0JpbmFyeSkuc2l6ZSA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXdhaXQgQ0xJVXRpbHMuaXNCaW5hcnlBdFZlcnNpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQmluYXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCaW5hcnkgdiR7dGFyZ2V0VmVyc2lvbn0gYXBwZWFyZWQgd2hpbGUgd2FpdGluZyBmb3IgbG9jazogJHtleGlzdGluZ0JpbmFyeX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBhbHJlYWR5RXhpc3RzOiBleGlzdGluZ0JpbmFyeSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID4gdGltZW91dE1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGltZW91dCB3YWl0aW5nIGZvciBsb2NrOiAke2xvY2tQYXRofWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAocG9sbE1zKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xlYW51cFRlbXBvcmFyeURvd25sb2FkcyA9IChtYXhBZ2VNcyA9IENMSV9MT0NLX1RJTUVPVVRfTVMpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgICAgIC8vIE1hdGNoIGJvdGggZG93bmxvYWQgemlwcyAoZG93bmxvYWRlZF9maWxlXyouemlwKSBhbmQgb3JwaGFuIGV4dHJhY3RcbiAgICAgICAgICAgICAgICAvLyB0ZW1wIGZpbGVzICg8bmFtZT4udG1wLjxwaWQ+KSBsZWZ0IGJ5IGNyYXNoZWQgcGVlciB3b3JrZXJzLlxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEV4dHJhY3RSZSA9IC9cXC50bXBcXC5cXGQrJC9cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZzLnJlYWRkaXJTeW5jKGNsaURpcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNEb3dubG9hZFppcCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zdGFydHNXaXRoKENMSV9ET1dOTE9BRF9UTVBfUFJFRklYKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZW5kc1dpdGgoQ0xJX0RPV05MT0FEX1RNUF9TVUZGSVgpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRXh0cmFjdFRtcCA9IHRtcEV4dHJhY3RSZS50ZXN0KGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRG93bmxvYWRaaXAgJiYgIWlzRXh0cmFjdFRtcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjbGlEaXIsIGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhdHM6IGZzLlN0YXRzXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVQYXRoKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyAtIHN0YXRzLm10aW1lTXMgPCBtYXhBZ2VNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhmaWxlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBkZWxldGUgdGVtcCBDTEkgZmlsZSAke2ZpbGVQYXRofTogJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gc2NhbiB0ZW1wIENMSSBmaWxlcyBpbiAke2NsaURpcn06ICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLnN0YXJ0KFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfRE9XTkxPQUQpXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRG93bmxvYWRpbmcgU0RLIGJpbmFyeSBmcm9tOiAke2JpbkRvd25sb2FkVXJsfWApXG5cbiAgICAgICAgbGV0IGRvd25sb2FkRW5kZWQgPSBmYWxzZVxuICAgICAgICBjb25zdCBlbmREb3dubG9hZCA9IChzdWNjZXNzID0gdHJ1ZSwgZXJyTXNnPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoZG93bmxvYWRFbmRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG93bmxvYWRFbmRlZCA9IHRydWVcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfRE9XTkxPQUQpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoXG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9ET1dOTE9BRCxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJNc2csXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVsZWFzZUxvY2s6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbG9ja1Jlc3VsdCA9IGF3YWl0IGFjcXVpcmVMb2NrKClcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYmluYXJ5IGFscmVhZHkgZXhpc3RzIChhbm90aGVyIHByb2Nlc3MgZG93bmxvYWRlZCBpdClcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbG9ja1Jlc3VsdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGVuZERvd25sb2FkKClcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9ja1Jlc3VsdC5hbHJlYWR5RXhpc3RzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbGVhc2VMb2NrID0gbG9ja1Jlc3VsdFxuXG4gICAgICAgICAgICAvLyBSZS1jaGVjayBhZnRlciBhY3F1aXJpbmcgbG9jay4gT25seSBhIGJpbmFyeSBhbHJlYWR5IGF0IHRoZSB0YXJnZXRcbiAgICAgICAgICAgIC8vIHZlcnNpb24gbWVhbnMgYSBwZWVyIHdvbiB0aGUgcmFjZTsgYW55IG90aGVyIGJpbmFyeSBoZXJlIGlzIHRoZVxuICAgICAgICAgICAgLy8gc3RhbGUgb25lIHdlIHdlcmUgc2VudCB0byByZXBsYWNlLCBzbyBpdCBtdXN0IG5vdCBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgICAvLyB0aGUgZG93bmxvYWQuXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0JpbmFyeSA9IENMSVV0aWxzLmdldEV4aXN0aW5nQ2xpUGF0aChjbGlEaXIpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdCaW5hcnkgJiZcbiAgICAgICAgICAgICAgICBmcy5leGlzdHNTeW5jKGV4aXN0aW5nQmluYXJ5KSAmJlxuICAgICAgICAgICAgICAgIGZzLnN0YXRTeW5jKGV4aXN0aW5nQmluYXJ5KS5zaXplID4gMCAmJlxuICAgICAgICAgICAgICAgIChhd2FpdCBDTElVdGlscy5pc0JpbmFyeUF0VmVyc2lvbihleGlzdGluZ0JpbmFyeSwgdGFyZ2V0VmVyc2lvbikpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBCaW5hcnkgYWxyZWFkeSBhdCB2JHt0YXJnZXRWZXJzaW9ufSBhZnRlciBhY3F1aXJpbmcgbG9jazogJHtleGlzdGluZ0JpbmFyeX1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBlbmREb3dubG9hZCgpXG4gICAgICAgICAgICAgICAgcmVsZWFzZUxvY2soKVxuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0JpbmFyeVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbGVhbnVwVGVtcG9yYXJ5RG93bmxvYWRzKClcblxuICAgICAgICAgICAgY29uc3QgemlwRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgIGAke0NMSV9ET1dOTE9BRF9UTVBfUFJFRklYfSR7cHJvY2Vzcy5waWR9XyR7RGF0ZS5ub3coKX0ke0NMSV9ET1dOTE9BRF9UTVBfU1VGRklYfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBkb3dubG9hZGVkRmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHppcEZpbGVQYXRoKVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nIHwgbnVsbD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdDogY3JlYXRlV3JpdGVTdHJlYW0gb3BlbnNcbiAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSwgc28gYW4gZXJyb3IgY2FuIGxhbmQgYmVmb3JlIHByb2Nlc3NEb3dubG9hZFxuICAgICAgICAgICAgICAgIC8vIGdldHMgZmFyIGVub3VnaCB0byBhdHRhY2ggaXRzIG93biBoYW5kbGVyIFx1MjAxNCB3aXRoIG5vIGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBiZWNvbWVzIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpbiB0aGUgdXNlcidzIHRlc3QgcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICBkb3dubG9hZGVkRmlsZVN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyOiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgR290IEVycm9yIHdoaWxlIGRvd25sb2FkaW5nIGNsaSBiaW5hcnkgZmlsZTogJHtlcnJ9YCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NEb3dubG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBDTElfRE9XTkxPQURfVElNRU9VVF9NUyxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKGJpbkRvd25sb2FkVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZXNwb25zZSBib2R5IHJlY2VpdmVkJylcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVTdHJlYW0gPSBSZWFkYWJsZS5mcm9tKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciksXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlU3RyZWFtLnBpcGUoZG93bmxvYWRlZEZpbGVTdHJlYW0pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB1cCB0aGUgZG93bmxvYWRGaWxlU3RyZWFtIGhhbmRsZXIgYmVmb3JlIHBpcGVsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBDTElVdGlscy5kb3dubG9hZEZpbGVTdHJlYW0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRlZEZpbGVTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnI/OiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEdvdCBFcnJvciBpbiBjbGkgYmluYXJ5IGRvd25sb2FkaW5nIHJlcXVlc3QgJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEEgcmVqZWN0aW9uIGJlZm9yZSB0aGUgc3RyZWFtIGhhbmRsZXJzIGFyZSB3aXJlZCAoZS5nLiBmZXRjaFxuICAgICAgICAgICAgICAgIC8vIGl0c2VsZiBmYWlsaW5nKSB3b3VsZCBvdGhlcndpc2UgbGVhdmUgdGhpcyBwcm9taXNlIHBlbmRpbmdcbiAgICAgICAgICAgICAgICAvLyBmb3JldmVyIGFuZCBoYW5nIHRoZSBsYXVuY2hlci5cbiAgICAgICAgICAgICAgICBwcm9jZXNzRG93bmxvYWQoKS5jYXRjaCgoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGlzIHBpcGVkIGludG8gdGhlIHN0cmVhbSBvbiB0aGlzIHBhdGgsIHNvIGNsb3NlIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgXHUyMDE0IG90aGVyd2lzZSB0aGUgZmQgYW5kIHRoZSB0ZW1wIHppcCBib3RoIGxlYWsuXG4gICAgICAgICAgICAgICAgICAgIGRvd25sb2FkZWRGaWxlU3RyZWFtLmRlc3Ryb3koKVxuICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGRvd25sb2FkIGJpbmFyeSwgRXhjZXB0aW9uOiAke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZG93bmxvYWRGaWxlU3RyZWFtKFxuICAgICAgICBkb3dubG9hZGVkRmlsZVN0cmVhbTogZnMuV3JpdGVTdHJlYW0sXG4gICAgICAgIHppcEZpbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgIGNsaURpcjogc3RyaW5nLFxuICAgICAgICByZXNvbHZlOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkLFxuICAgICAgICByZWplY3Q6IChyZWFzb24/OiBFcnJvcikgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgZG93bmxvYWRlZEZpbGVTdHJlYW0ub24oJ2Nsb3NlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgeWF1emxPcGVuUHJvbWlzZSA9IHByb21pc2lmeSh5YXV6bC5vcGVuKSBhcyAoXG4gICAgICAgICAgICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHlhdXpsT3B0aW9ucyxcbiAgICAgICAgICAgICkgPT4gUHJvbWlzZTxaaXBGaWxlPlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB6aXBmaWxlID0gYXdhaXQgeWF1emxPcGVuUHJvbWlzZSh6aXBGaWxlUGF0aCwge1xuICAgICAgICAgICAgICAgICAgICBsYXp5RW50cmllczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGxldCByZXNvbHZlZEJpbmFyeVBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgICAgICAgICB6aXBmaWxlLnJlYWRFbnRyeSgpXG4gICAgICAgICAgICAgICAgemlwZmlsZS5vbignZW50cnknLCBhc3luYyAoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9cXC8kLy50ZXN0KGVudHJ5LmZpbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5yZWFkRW50cnkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBaaXAtc2xpcCBndWFyZDogcmVqZWN0IGVudHJpZXMgd2hvc2UgcmVzb2x2ZWQgcGF0aCBlc2NhcGVzIGNsaURpclxuICAgICAgICAgICAgICAgICAgICAvLyAoQlJPV1NFUlNUQUNLX0JJTkFSWV9VUkwgbGV0cyB1c2VycyBzdXBwbHkgYXJiaXRyYXJ5IHppcHMpLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVQYXRoID0gcGF0aC5qb2luKGNsaURpciwgZW50cnkuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ2FuZGlkYXRlID0gcGF0aC5yZXNvbHZlKGNhbmRpZGF0ZVBhdGgpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRGlyID0gcGF0aC5yZXNvbHZlKGNsaURpcikgKyBwYXRoLnNlcFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkQ2FuZGlkYXRlLnN0YXJ0c1dpdGgocmVzb2x2ZWREaXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFppcC1zbGlwIGRldGVjdGVkOiBlbnRyeSBcIiR7ZW50cnkuZmlsZU5hbWV9XCIgcmVzb2x2ZXMgb3V0c2lkZSAke2NsaURpcn1gKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNCaW5hcnlFbnRyeSA9IHBhdGguYmFzZW5hbWUoZW50cnkuZmlsZU5hbWUpLnN0YXJ0c1dpdGgoJ2JpbmFyeS0nKVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNCaW5hcnlFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0U3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0oY2FuZGlkYXRlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdFN0cmVhbS5vbignZXJyb3InLCAod3JpdGVFcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3Qod3JpdGVFcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlblJlYWRTdHJlYW1Qcm9taXNlID0gcHJvbWlzaWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUub3BlblJlYWRTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICAgICApLmJpbmQoemlwZmlsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZFN0cmVhbSA9IGF3YWl0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZShlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkU3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdFN0cmVhbS5lbmQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RTdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4gemlwZmlsZS5yZWFkRW50cnkoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ucGlwZShkaXJlY3RTdHJlYW0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh6aXBFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoemlwRXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBCaW5hcnkgZW50cnk6IGV4dHJhY3QgdG8gUElELXNjb3BlZCB0ZW1wIGZpbGUsIGNobW9kLCBhdG9taWMgcmVuYW1lIGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudHMgRVRYVEJTWS9FQlVTWTogdGhlIGZpbGUgYmVpbmcgZXhlY3V0ZWQgaXMgbmV2ZXIgdGhlIGZpbGUgYmVpbmcgd3JpdHRlbi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluYWxQYXRoID0gY2FuZGlkYXRlUGF0aFxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHBhdGguam9pbihjbGlEaXIsIGAke2VudHJ5LmZpbGVOYW1lfS50bXAuJHtwcm9jZXNzLnBpZH1gKVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odGVtcFBhdGgpXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHdyaXRlU3RyZWFtRXJyb3JlZCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtLm9uKCdlcnJvcicsICh3cml0ZUVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1FcnJvcmVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgZnNwLnVubGluayh0ZW1wUGF0aCkuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh3cml0ZUVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgICAgICAvLyAnY2xvc2UnIGZpcmVzIGFmdGVyIHRoZSBmZCBpcyBjbG9zZWQ7IHNhZmUgZm9yIGZzcC5yZW5hbWUgb24gV2luZG93cyAod2hlcmUgJ2ZpbmlzaCcgbWF5IGZpcmUgYmVmb3JlIGZkIHJlbGVhc2UpLlxuICAgICAgICAgICAgICAgICAgICAvLyBhdXRvQ2xvc2U9dHJ1ZSBhbHNvIG1ha2VzICdjbG9zZScgZmlyZSBhZnRlciAnZXJyb3InIFx1MjAxNCBiYWlsIG91dCBpZiB0aGUgZXJyb3IgcGF0aCBhbHJlYWR5IHJlamVjdGVkLlxuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbS5vbignY2xvc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVTdHJlYW1FcnJvcmVkKSB7IHJldHVybiB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC5jaG1vZCh0ZW1wUGF0aCwgJzA3NTUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC5yZW5hbWUodGVtcFBhdGgsIGZpbmFsUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHJlbmFtZUVycjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hcnJvdyBmYWxsYmFjayB0byBjcm9zcy1kZXZpY2UgKEVYREVWKSBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW5hbWVFcnIuY29kZSAhPT0gJ0VYREVWJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVuYW1lRXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEF0b21pYyByZW5hbWUgZmFpbGVkIChjcm9zcy1kZXZpY2UpLCBmYWxsaW5nIGJhY2sgdG8gY29weTogJHtyZW5hbWVFcnIubWVzc2FnZX1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmc3AuY29weUZpbGUodGVtcFBhdGgsIGZpbmFsUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnNwLnVubGluayh0ZW1wUGF0aCkuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWRCaW5hcnlQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkQmluYXJ5UGF0aCA9IGZpbmFsUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLnJlYWRFbnRyeSgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmc3AudW5saW5rKHRlbXBQYXRoKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZSA9IHByb21pc2lmeShcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUub3BlblJlYWRTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICkuYmluZCh6aXBmaWxlKVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZFN0cmVhbSA9IGF3YWl0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZShlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbS5lbmQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSlcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoemlwRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmc3AudW5saW5rKHRlbXBQYXRoKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHppcEVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICB6aXBmaWxlLm9uKCdlcnJvcicsICh6aXBFcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHppcEVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgemlwZmlsZS5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZzcC51bmxpbmsoemlwRmlsZVBhdGgpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gZGVsZXRlIHppcCBmaWxlOiAke3ppcEZpbGVQYXRofWApXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlZEJpbmFyeVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignTm8gYmluYXJ5LSogZW50cnkgZm91bmQgaW4gemlwOyBjYW5ub3QgY29tcGxldGUgQ0xJIGJpbmFyeSBleHRyYWN0aW9uJykpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZEJpbmFyeVBhdGgpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgc3RhdGljIGdldFRlc3RGcmFtZXdvcmtEZXRhaWwoKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVF9GUkFNRVdPUktfREVUQUlMKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVF9GUkFNRVdPUktfREVUQUlMKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRlc3RGcmFtZXdvcmtEZXRhaWxcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0QXV0b21hdGlvbkZyYW1ld29ya0RldGFpbCgpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BVVRPTUFUSU9OX0ZSQU1FV09SS19ERVRBSUwpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BVVRPTUFUSU9OX0ZSQU1FV09SS19ERVRBSUwsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYXV0b21hdGlvbkZyYW1ld29ya0RldGFpbFxuICAgIH1cblxuICAgIHN0YXRpYyBzZXRGcmFtZXdvcmtEZXRhaWwoXG4gICAgICAgIHRlc3RGcmFtZXdvcms6IHN0cmluZyxcbiAgICAgICAgYXV0b21hdGlvbkZyYW1ld29yazogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBpZiAoIXRlc3RGcmFtZXdvcmsgfHwgIWF1dG9tYXRpb25GcmFtZXdvcmspIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgVGVzdCBvciBBdXRvbWF0aW9uIGZyYW1ld29yayBub3QgcHJvdmlkZWQgdGVzdEZyYW1ld29yaz0ke3Rlc3RGcmFtZXdvcmt9LCBhdXRvbWF0aW9uRnJhbWV3b3JrPSR7YXV0b21hdGlvbkZyYW1ld29ya31gLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50ZXN0RnJhbWV3b3JrRGV0YWlsID0ge1xuICAgICAgICAgICAgbmFtZTogdGVzdEZyYW1ld29yayxcbiAgICAgICAgICAgIHZlcnNpb246IHsgW3Rlc3RGcmFtZXdvcmtdOiBDTElVdGlscy5nZXRTZGtWZXJzaW9uKCkgfSxcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXV0b21hdGlvbkZyYW1ld29ya0RldGFpbCA9IHtcbiAgICAgICAgICAgIG5hbWU6IGF1dG9tYXRpb25GcmFtZXdvcmssXG4gICAgICAgICAgICB2ZXJzaW9uOiB7IFthdXRvbWF0aW9uRnJhbWV3b3JrXTogQ0xJVXRpbHMuZ2V0U2RrVmVyc2lvbigpIH0sXG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQVVUT01BVElPTl9GUkFNRVdPUktfREVUQUlMID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB0aGlzLmF1dG9tYXRpb25GcmFtZXdvcmtEZXRhaWwsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RfRlJBTUVXT1JLX0RFVEFJTCA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgdGhpcy50ZXN0RnJhbWV3b3JrRGV0YWlsLFxuICAgICAgICApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGluc3RhbmNlIG5hbWUgdXNpbmcgdGhyZWFkIGlkIGFuZCBwcm9jZXNzSWRcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDdXJyZW50SW5zdGFuY2VOYW1lKCkge1xuICAgICAgICByZXR1cm4gYCR7cHJvY2Vzcy5waWR9OiR7dGhyZWFkSWR9YFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGEgdW5pcXVlIGNsaWVudCB3b3JrZXIgaWRlbnRpZmllciBjb21iaW5pbmcgdGhyZWFkIElEIGFuZCBwcm9jZXNzIElELlxuICAgICAqIFRoaXMgaWRlbnRpZmllciBpcyB1c2VkIHRvIHRyYWNrIHdvcmtlci1zcGVjaWZpYyBldmVudHMgYW5kIHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICAgKiBhY3Jvc3MgZGlzdHJpYnV0ZWQgdGVzdCBleGVjdXRpb24uIEZvcm1hdCBtYXRjaGVzIHRoZSBQeXRob24gU0RLIGltcGxlbWVudGF0aW9uXG4gICAgICogZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBTREtzLlxuICAgICAqXG4gICAgICogRm9ybWF0OiBcInRocmVhZElkLXByb2Nlc3NJZFwiXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udGV4dCAtIE9wdGlvbmFsIGV4ZWN1dGlvbiBjb250ZXh0IHdpdGggdGhyZWFkSWQgYW5kIHByb2Nlc3NJZFxuICAgICAqIEByZXR1cm5zIFdvcmtlciBJRCBzdHJpbmcgaW4gZm9ybWF0IFwidGhyZWFkSWQtcHJvY2Vzc0lkXCJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHdvcmtlcklkID0gQ0xJVXRpbHMuZ2V0Q2xpZW50V29ya2VySWQoKSAvLyBSZXR1cm5zIFwiMS0xMjM0NVwiXG4gICAgICogY29uc3Qgd29ya2VySWQgPSBDTElVdGlscy5nZXRDbGllbnRXb3JrZXJJZCh7IHRocmVhZElkOiAxMjMsIHByb2Nlc3NJZDogNDU2IH0pIC8vIFJldHVybnMgXCIxMjMtNDU2XCJcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0Q2xpZW50V29ya2VySWQoY29udGV4dD86IHsgdGhyZWFkSWQ/OiBzdHJpbmcgfCBudW1iZXI7IHByb2Nlc3NJZD86IHN0cmluZyB8IG51bWJlciB9KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgd29ya2VyVGhyZWFkSWQgPSBjb250ZXh0Py50aHJlYWRJZD8udG9TdHJpbmcoKSB8fCB0aHJlYWRJZC50b1N0cmluZygpXG4gICAgICAgIGNvbnN0IHdvcmtlclByb2Nlc3NJZCA9IGNvbnRleHQ/LnByb2Nlc3NJZD8udG9TdHJpbmcoKSB8fCBwcm9jZXNzLnBpZC50b1N0cmluZygpXG4gICAgICAgIHJldHVybiBgJHt3b3JrZXJUaHJlYWRJZH0tJHt3b3JrZXJQcm9jZXNzSWR9YFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUZXN0RnJhbWV3b3JrU3RhdGUgfCBBdXRvbWF0aW9uRnJhbWV3b3JrU3RhdGV9IGZyYW1ld29ya1N0YXRlXG4gICAgICogQHBhcmFtIHtIb29rU3RhdGV9IGhvb2tTdGF0ZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldEhvb2tSZWdpc3RyeUtleShmcmFtZXdvcmtTdGF0ZTogU3RhdGUsIGhvb2tTdGF0ZTogU3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGAke2ZyYW1ld29ya1N0YXRlfToke2hvb2tTdGF0ZX1gXG4gICAgfVxuXG4gICAgc3RhdGljIG1hdGNoSG9va1JlZ2V4KGhvb2tTdGF0ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKFRlc3RGcmFtZXdvcmtDb25zdGFudHMuSE9PS19SRUdFWClcblxuICAgICAgICByZXR1cm4gcGF0dGVybi50ZXN0KGhvb2tTdGF0ZSlcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhcbiAgICAgICAgb2JzZXJ2YWJpbGl0eU9wdGlvbnM6IFRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyxcbiAgICAgICAgYnN0YWNrQnVpbGRUYWc/OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX1RBRy5zcGxpdCgnLCcpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkVGFnKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGRUYWdcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnN0YWNrQnVpbGRUYWcpIHtcbiAgICAgICAgICAgIHJldHVybiBbYnN0YWNrQnVpbGRUYWddXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgc3RhdGljIGNoZWNrQ0xJU3VwcG9ydGVkRnJhbWV3b3JrcyhmcmFtZXdvcms6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZnJhbWV3b3JrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLkNMSVN1cHBvcnRlZEZyYW1ld29ya3MuaW5jbHVkZXMoZnJhbWV3b3JrKVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBmZXRjaCBhcyB1bmRpY2lGZXRjaCwgdHlwZSBSZXF1ZXN0SW5pdCBhcyBVbmRpY2lSZXF1ZXN0SW5pdCwgUHJveHlBZ2VudCB9IGZyb20gJ3VuZGljaSdcblxuZXhwb3J0IGNsYXNzIFJlc3BvbnNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgcHVibGljIHJlc3BvbnNlOiBSZXNwb25zZVxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcmVzOiBSZXNwb25zZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKVxuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBmZXRjaFdyYXAoaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLCBpbml0PzogUmVxdWVzdEluaXQpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBfZmV0Y2goaW5wdXQsIGluaXQpXG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlRXJyb3IoYEVycm9yIHJlc3BvbnNlIGZyb20gc2VydmVyICR7cmVzLnN0YXR1c306ICAke2F3YWl0IHJlcy50ZXh0KCl9YCwgcmVzKVxuICAgIH1cbiAgICByZXR1cm4gcmVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZmV0Y2goaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLCBpbml0PzogUmVxdWVzdEluaXQpIHtcbiAgICBjb25zdCBwcm94eVVybCA9IHByb2Nlc3MuZW52LkhUVFBfUFJPWFkgfHwgcHJvY2Vzcy5lbnYuSFRUUFNfUFJPWFlcbiAgICBpZiAocHJveHlVcmwpIHtcbiAgICAgICAgY29uc3Qgbm9Qcm94eSA9IHByb2Nlc3MuZW52Lk5PX1BST1hZICYmIHByb2Nlc3MuZW52Lk5PX1BST1hZLnRyaW0oKVxuICAgICAgICAgICAgPyBwcm9jZXNzLmVudi5OT19QUk9YWS50cmltKCkuc3BsaXQoL1tcXHMsO10rLylcbiAgICAgICAgICAgIDogW11cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0KVxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgICAgICBpZiAoIW5vUHJveHkuc29tZSgoc3RyKSA9PiB1cmwuaG9zdG5hbWUuZW5kc1dpdGgoc3RyKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRpY2lGZXRjaChcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnVybCxcbiAgICAgICAgICAgICAgICB7IC4uLihpbml0IGFzIFVuZGljaVJlcXVlc3RJbml0KSwgZGlzcGF0Y2hlcjogbmV3IFByb3h5QWdlbnQocHJveHlVcmwpIH0sXG4gICAgICAgICAgICApIGFzIHVua25vd24gYXMgUHJvbWlzZTxSZXNwb25zZT5cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpXG59XG4iLCAiZXhwb3J0IGNvbnN0IEVWRU5UUyA9IHtcbiAgICBTREtfU0VUVVA6ICdzZGs6c2V0dXAnLFxuICAgIFNES19DTEVBTlVQOiAnc2RrOmNsZWFudXAnLFxuICAgIFNES19QUkVfVEVTVDogJ3NkazpwcmUtdGVzdCcsXG4gICAgU0RLX1RFU1Q6ICdzZGs6dGVzdCcsXG4gICAgU0RLX1BPU1RfVEVTVDogJ3Nkazpwb3N0LXRlc3QnLFxuICAgIFNES19IT09LOiAnc2RrOmhvb2snLFxuICAgIFNES19EUklWRVI6ICdzZGs6ZHJpdmVyJyxcbiAgICBTREtfQTExWTogJ3NkazphMTF5JyxcbiAgICBTREtfTzExWTogJ3NkazpvMTF5JyxcbiAgICBTREtfQVVUT19DQVBUVVJFOiAnc2RrOmF1dG8tY2FwdHVyZScsXG4gICAgU0RLX1BST1hZX1NFVFVQOiAnc2RrOnByb3h5LXNldHVwJyxcbiAgICBTREtfVEVTVEhVQjogJ3Nkazp0ZXN0aHViJyxcbiAgICBTREtfQVVUT01BVEU6ICdzZGs6YXV0b21hdGUnLFxuICAgIFNES19BUFBfQVVUT01BVEU6ICdzZGs6YXBwLWF1dG9tYXRlJyxcbiAgICBTREtfVFVSQk9TQ0FMRTogJ3Nkazp0dXJib3NjYWxlJyxcbiAgICBTREtfUEVSQ1k6ICdzZGs6cGVyY3knLFxuICAgIFNES19QUkVfSU5JVElBTElaRTogJ3Nkazpkcml2ZXI6cHJlLWluaXRpYWxpemF0aW9uJyxcbiAgICBTREtfUE9TVF9JTklUSUFMSVpFOiAnc2RrOmRyaXZlcjpwb3N0LWluaXRpYWxpemF0aW9uJyxcbiAgICBTREtfQ0xJX0NIRUNLX1VQREFURTogJ3NkazpjbGk6Y2hlY2stdXBkYXRlJyxcbiAgICBTREtfQ0xJX0RPV05MT0FEOiAnc2RrOmNsaTpkb3dubG9hZCcsXG4gICAgU0RLX0NMSV9PTl9CT09UU1RSQVA6ICdzZGs6Y2xpOm9uLWJvb3RzdHJhcCcsXG4gICAgU0RLX0NMSV9PTl9DT05ORUNUOiAnc2RrOmNsaTpvbi1jb25uZWN0JyxcbiAgICBTREtfQ0xJX1NUQVJUOiAnc2RrOmNsaTpzdGFydCcsXG4gICAgU0RLX0NMSV9PTl9TVE9QOiAnc2RrOmNsaTpvbi1zdG9wJyxcbiAgICBTREtfQ09OTkVDVF9CSU5fU0VTU0lPTjogJ3Nkazpjb25uZWN0QmluU2Vzc2lvbicsXG4gICAgU0RLX1NUQVJUX0JJTl9TRVNTSU9OOiAnc2RrOnN0YXJ0QmluU2Vzc2lvbicsXG4gICAgLy8gTmV3IGV2ZW50cyBmcm9tIFB5dGhvbiBTREtcbiAgICBTREtfRFJJVkVSX0lOSVQ6ICdzZGs6ZHJpdmVySW5pdCcsXG4gICAgU0RLX0ZJTkRfTkVBUkVTVF9IVUI6ICdzZGs6ZmluZE5lYXJlc3RIdWInLFxuICAgIFNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19JTklUOiAnc2RrOmF1dG9tYXRpb25GcmFtZXdvcmtJbml0JyxcbiAgICBTREtfQVVUT01BVElPTl9GUkFNRVdPUktfU1RBUlQ6ICdzZGs6YXV0b21hdGlvbkZyYW1ld29ya1N0YXJ0JyxcbiAgICBTREtfQVVUT01BVElPTl9GUkFNRVdPUktfU1RPUDogJ3NkazphdXRvbWF0aW9uRnJhbWV3b3JrU3RvcCcsXG4gICAgU0RLX0FDQ0VTU0lCSUxJVFlfQ09ORklHOiAnc2RrOmFjY2Vzc2liaWxpdHlDb25maWcnLFxuICAgIFNES19PQlNFUlZBQklMSVRZX0NPTkZJRzogJ3NkazpvYnNlcnZhYmlsaXR5Q29uZmlnJyxcbiAgICBTREtfQUlfU0VMRl9IRUFMX1NURVA6ICdzZGs6YWlTZWxmSGVhbFN0ZXAnLFxuICAgIFNES19BSV9TRUxGX0hFQUxfR0VUX1JFU1VMVDogJ3NkazphaVNlbGZIZWFsR2V0UmVzdWx0JyxcbiAgICBTREtfVEVTVF9GUkFNRVdPUktfRVZFTlQ6ICdzZGs6dGVzdEZyYW1ld29ya0V2ZW50JyxcbiAgICBTREtfVEVTVF9TRVNTSU9OX0VWRU5UOiAnc2RrOnRlc3RTZXNzaW9uRXZlbnQnLFxuICAgIFNES19DTElfTE9HX0NSRUFURURfRVZFTlQ6ICdzZGs6Y2xpOmxvZ0NyZWF0ZWRFdmVudCcsXG4gICAgU0RLX0NMSV9FTlFVRVVFX1RFU1RfRVZFTlQ6ICdzZGs6Y2xpOmVucXVldWVUZXN0RXZlbnQnLFxuICAgIFNES19PTl9TVE9QOiAnc2RrOm9uU3RvcCcsXG4gICAgU0RLX1NFTkRfTE9HUzogJ3NkazpzZW5kbG9ncycsXG4gICAgLy8gRnVubmVsIEV2ZW50c1xuICAgIFNES19GVU5ORUxfVEVTVF9BVFRFTVBURUQ6ICdzZGs6ZnVubmVsOnRlc3QtYXR0ZW1wdGVkJyxcbiAgICBTREtfRlVOTkVMX1RFU1RfU1VDQ0VTU0ZVTDogJ3NkazpmdW5uZWw6dGVzdC1zdWNjZXNzZnVsJyxcbiAgICAvLyBMb2cgVXBsb2FkIEV2ZW50c1xuICAgIFNES19VUExPQURfTE9HUzogJ3Nkazp1cGxvYWQtbG9ncycsXG4gICAgLy8gS2V5IE1ldHJpY3MgRXZlbnRzXG4gICAgU0RLX1NFTkRfS0VZX01FVFJJQ1M6ICdzZGs6c2VuZC1rZXktbWV0cmljcycsXG4gICAgU0RLX0tFWV9NRVRSSUNTX1BSRVBBUkFUSU9OOiAnc2RrOmtleS1tZXRyaWNzOnByZXBhcmF0aW9uJyxcbiAgICBTREtfS0VZX01FVFJJQ1NfVVBMT0FEOiAnc2RrOmtleS1tZXRyaWNzOnVwbG9hZCcsXG4gICAgLy8gQ0xJIEJpbmFyeSBFdmVudHNcbiAgICBTREtfQ0xJX0RPV05MT0FEX0JJTkFSWTogJ3NkazpjbGk6ZG93bmxvYWQtYmluYXJ5JyxcbiAgICBTREtfQ0xJX0JJTkFSWV9WRVJJRklDQVRJT046ICdzZGs6Y2xpOmJpbmFyeS12ZXJpZmljYXRpb24nLFxuICAgIC8vIENsZWFudXAgJiBTaHV0ZG93biBFdmVudHMgKHRyYWNraW5nIGdhcCBiZXR3ZWVuIGRyaXZlcjpxdWl0IGFuZCBmdW5uZWw6dGVzdC1zdWNjZXNzZnVsKVxuICAgIFNES19MSVNURU5FUl9XT1JLRVJfRU5EOiAnc2RrOmxpc3RlbmVyOndvcmtlci1lbmQnLFxuICAgIFNES19QRVJDWV9URUFSRE9XTjogJ3NkazpwZXJjeTp0ZWFyZG93bicsXG4gICAgU0RLX1dPUktFUl9TQVZFX0RBVEE6ICdzZGs6d29ya2VyOnNhdmUtZGF0YScsXG4gICAgU0RLX1BFUkZPUk1BTkNFX1JFUE9SVF9HRU46ICdzZGs6cGVyZm9ybWFuY2U6cmVwb3J0LWdlbmVyYXRpb24nLFxuICAgIFNES19QRVJGT1JNQU5DRV9KU09OX1dSSVRFOiAnc2RrOnBlcmZvcm1hbmNlOmpzb24td3JpdGUnLFxuICAgIFNES19QRVJGT1JNQU5DRV9IVE1MX0dFTjogJ3NkazpwZXJmb3JtYW5jZTpodG1sLWdlbmVyYXRpb24nLFxuICAgIC8vIERldmljZSBBbGxvY2F0aW9uIEV2ZW50ICh0cmFja2luZyBnYXAgYmV0d2VlbiBiZWZvcmVTZXNzaW9uIGFuZCBiZWZvcmUgaG9va3MpXG4gICAgU0RLX0RFVklDRV9BTExPQ0FUSU9OOiAnc2RrOmRldmljZS1hbGxvY2F0aW9uJ1xufVxuXG5leHBvcnQgY29uc3QgVEVTVEhVQl9FVkVOVFMgPSB7XG4gICAgU1RBUlQ6IGAke0VWRU5UUy5TREtfVEVTVEhVQn06c3RhcnRgLFxuICAgIFNUT1A6IGAke0VWRU5UUy5TREtfVEVTVEhVQn06c3RvcGBcbn1cblxuZXhwb3J0IGNvbnN0IEFVVE9NQVRFX0VWRU5UUyA9IHtcbiAgICBLRUVQX0FMSVZFOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTprZWVwLWFsaXZlYCxcbiAgICBIVUJfTUFOQUdFTUVOVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06aHViLW1hbmFnZW1lbnRgLFxuICAgIExPQ0FMX1NUQVJUOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpsb2NhbC1zdGFydGAsXG4gICAgTE9DQUxfU1RPUDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06bG9jYWwtc3RvcGAsXG4gICAgRFJJVkVSX01BTkFHRTogYCR7RVZFTlRTLlNES19BVVRPTUFURX06ZHJpdmVyLW1hbmFnZWAsXG4gICAgU0VTU0lPTl9OQU1FOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLW5hbWVgLFxuICAgIFNFU1NJT05fU1RBVFVTOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLXN0YXR1c2AsXG4gICAgU0VTU0lPTl9BTk5PVEFUSU9OOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLWFubm90YXRpb25gLFxuICAgIElETEVfVElNRU9VVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06aWRsZS10aW1lb3V0YCxcbiAgICBHRU5FUkFURV9DSV9BUlRJRkFDVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06Y2ktYXJ0aWZhY3RzYCxcbiAgICBQUklOVF9CVUlMRExJTks6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OnByaW50LWJ1aWxkbGlua2Bcbn1cblxuZXhwb3J0IGNvbnN0IEExMVlfRVZFTlRTID0ge1xuICAgIFBFUkZPUk1fU0NBTjogYCR7RVZFTlRTLlNES19BMTFZfTpkcml2ZXItcGVyZm9ybXNjYW5gLFxuICAgIFNBVkVfUkVTVUxUUzogYCR7RVZFTlRTLlNES19BMTFZfTpzYXZlLXJlc3VsdHNgLFxuICAgIEdFVF9SRVNVTFRTOiBgJHtFVkVOVFMuU0RLX0ExMVl9OmdldC1hY2Nlc3NpYmlsaXR5LXJlc3VsdHNgLFxuICAgIEdFVF9SRVNVTFRTX1NVTU1BUlk6IGAke0VWRU5UUy5TREtfQTExWX06Z2V0LWFjY2Vzc2liaWxpdHktcmVzdWx0cy1zdW1tYXJ5YFxufVxuXG5leHBvcnQgY29uc3QgUEVSQ1lfRVZFTlRTID0ge1xuICAgIERPV05MT0FEOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpkb3dubG9hZGAsXG4gICAgU0NSRUVOU0hPVDogYCR7RVZFTlRTLlNES19QRVJDWX06c2NyZWVuc2hvdGAsXG4gICAgU1RBUlQ6IGAke0VWRU5UUy5TREtfUEVSQ1l9OnN0YXJ0YCxcbiAgICBTVE9QOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpzdG9wYCxcbiAgICBBVVRPX0NBUFRVUkU6IGAke0VWRU5UUy5TREtfUEVSQ1l9OmF1dG8tY2FwdHVyZWAsXG4gICAgU05BUFNIT1Q6IGAke0VWRU5UUy5TREtfUEVSQ1l9OnNuYXBzaG90YCxcbiAgICBTQ1JFRU5TSE9UX0FQUDogYCR7RVZFTlRTLlNES19QRVJDWX06c2NyZWVuc2hvdC1hcHBgXG59XG5cbmV4cG9ydCBjb25zdCBPMTFZX0VWRU5UUyA9IHtcbiAgICBTWU5DOiBgJHtFVkVOVFMuU0RLX08xMVl9OnN5bmNgLFxuICAgIFRBS0VfU0NSRUVOU0hPVDogYCR7RVZFTlRTLlNES19PMTFZfTpkcml2ZXItdGFrZVNjcmVlblNob3RgLFxuICAgIFBSSU5UX0JVSUxETElOSzogYCR7RVZFTlRTLlNES19PMTFZfTpwcmludC1idWlsZGxpbmtgXG59XG5cbmV4cG9ydCBjb25zdCBIT09LX0VWRU5UUyA9IHtcbiAgICBCRUZPUkVfRUFDSDogYCR7RVZFTlRTLlNES19IT09LfTpiZWZvcmUtZWFjaGAsXG4gICAgQUZURVJfRUFDSDogYCR7RVZFTlRTLlNES19IT09LfTphZnRlci1lYWNoYCxcbiAgICBBRlRFUl9BTEw6IGAke0VWRU5UUy5TREtfSE9PS306YWZ0ZXItYWxsYCxcbiAgICBCRUZPUkVfQUxMOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmJlZm9yZS1hbGxgLFxuICAgIEJFRk9SRTogYCR7RVZFTlRTLlNES19IT09LfTpiZWZvcmVgLFxuICAgIEFGVEVSOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmFmdGVyYFxufVxuXG5leHBvcnQgY29uc3QgVFVSQk9TQ0FMRV9FVkVOVFMgPSB7XG4gICAgSFVCX01BTkFHRU1FTlQ6IGAke0VWRU5UUy5TREtfVFVSQk9TQ0FMRX06aHViLW1hbmFnZW1lbnRgLFxuICAgIFBSSU5UX0JVSUxETElOSzogYCR7RVZFTlRTLlNES19UVVJCT1NDQUxFfTpwcmludC1idWlsZGxpbmtgXG59XG5cbmV4cG9ydCBjb25zdCBBUFBfQVVUT01BVEVfRVZFTlRTID0ge1xuICAgIEFQUF9VUExPQUQ6IGAke0VWRU5UUy5TREtfQVBQX0FVVE9NQVRFfTphcHAtdXBsb2FkYFxufVxuXG5leHBvcnQgY29uc3QgRFJJVkVSX0VWRU5UID0ge1xuICAgIFFVSVQ6IGAke0VWRU5UUy5TREtfRFJJVkVSfTpxdWl0YCxcbiAgICBHRVQ6IGAke0VWRU5UUy5TREtfRFJJVkVSfTpnZXRgLFxuICAgIFBSRV9FWEVDVVRFOiBgJHtFVkVOVFMuU0RLX0RSSVZFUn06cHJlLWV4ZWN1dGVgLFxuICAgIFBPU1RfRVhFQ1VURTogYCR7RVZFTlRTLlNES19EUklWRVJ9OnBvc3QtZXhlY3V0ZWAsXG4gICAgSU5JVDogRVZFTlRTLlNES19EUklWRVJfSU5JVCxcbiAgICBQUkVfSU5JVElBTElaRTogRVZFTlRTLlNES19QUkVfSU5JVElBTElaRSxcbiAgICBQT1NUX0lOSVRJQUxJWkU6IEVWRU5UUy5TREtfUE9TVF9JTklUSUFMSVpFXG59XG5cbi8qKlxuICogRnJhbWV3b3JrIGxpZmVjeWNsZSBldmVudHMgZm9yIGF1dG9tYXRpb24gZnJhbWV3b3JrIHRyYWNraW5nXG4gKi9cbmV4cG9ydCBjb25zdCBGUkFNRVdPUktfRVZFTlRTID0ge1xuICAgIElOSVQ6IEVWRU5UUy5TREtfQVVUT01BVElPTl9GUkFNRVdPUktfSU5JVCxcbiAgICBTVEFSVDogRVZFTlRTLlNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19TVEFSVCxcbiAgICBTVE9QOiBFVkVOVFMuU0RLX0FVVE9NQVRJT05fRlJBTUVXT1JLX1NUT1Bcbn1cblxuLyoqXG4gKiBNb2R1bGUgY29uZmlndXJhdGlvbiBldmVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IENPTkZJR19FVkVOVFMgPSB7XG4gICAgQUNDRVNTSUJJTElUWTogRVZFTlRTLlNES19BQ0NFU1NJQklMSVRZX0NPTkZJRyxcbiAgICBPQlNFUlZBQklMSVRZOiBFVkVOVFMuU0RLX09CU0VSVkFCSUxJVFlfQ09ORklHXG59XG5cbi8qKlxuICogQUkgc2VsZi1oZWFsaW5nIGV2ZW50c1xuICovXG5leHBvcnQgY29uc3QgQUlfRVZFTlRTID0ge1xuICAgIFNFTEZfSEVBTF9TVEVQOiBFVkVOVFMuU0RLX0FJX1NFTEZfSEVBTF9TVEVQLFxuICAgIFNFTEZfSEVBTF9HRVRfUkVTVUxUOiBFVkVOVFMuU0RLX0FJX1NFTEZfSEVBTF9HRVRfUkVTVUxUXG59XG5cbi8qKlxuICogRXZlbnQgZGlzcGF0Y2hlciBldmVudHMgZm9yIHRlc3QgZnJhbWV3b3JrIGFuZCBzZXNzaW9uIHRyYWNraW5nXG4gKi9cbmV4cG9ydCBjb25zdCBESVNQQVRDSEVSX0VWRU5UUyA9IHtcbiAgICBURVNUX0ZSQU1FV09SSzogRVZFTlRTLlNES19URVNUX0ZSQU1FV09SS19FVkVOVCxcbiAgICBURVNUX1NFU1NJT046IEVWRU5UUy5TREtfVEVTVF9TRVNTSU9OX0VWRU5ULFxuICAgIExPR19DUkVBVEVEOiBFVkVOVFMuU0RLX0NMSV9MT0dfQ1JFQVRFRF9FVkVOVCxcbiAgICBFTlFVRVVFX1RFU1Q6IEVWRU5UUy5TREtfQ0xJX0VOUVVFVUVfVEVTVF9FVkVOVFxufVxuXG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5cbmltcG9ydCBsb2dnZXIgZnJvbSAnQHdkaW8vbG9nZ2VyJ1xuXG5pbXBvcnQgeyBMT0dTX0ZJTEUgfSBmcm9tICcuLi9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tICcuLi91dGlsLmpzJ1xuXG5jb25zdCBsb2cgPSBsb2dnZXIoJ0B3ZGlvL2Jyb3dzZXJzdGFjay1zZXJ2aWNlL2NsaScpXG5cbmV4cG9ydCBjbGFzcyBCU3RhY2tMb2dnZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgTE9HU19GSUxFKVxuICAgIHB1YmxpYyBzdGF0aWMgbG9nRm9sZGVyUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycpXG4gICAgcHJpdmF0ZSBzdGF0aWMgbG9nRmlsZVN0cmVhbTogZnMuV3JpdGVTdHJlYW0gfCBudWxsXG5cbiAgICBzdGF0aWMgbG9nVG9GaWxlKGxvZ01lc3NhZ2U6IHN0cmluZywgbG9nTGV2ZWw6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmxvZ0ZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuc3VyZUxvZ3NGb2xkZXIoKVxuICAgICAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRoaXMubG9nRmlsZVBhdGgsIHsgZmxhZ3M6ICdhJyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubG9nRmlsZVN0cmVhbSAmJiB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGUodGhpcy5mb3JtYXRMb2cobG9nTWVzc2FnZSwgbG9nTGV2ZWwpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nLmRlYnVnKGBGYWlsZWQgdG8gbG9nIHRvIGZpbGUuIEVycm9yICR7ZXJyb3J9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGZvcm1hdExvZyhsb2dNZXNzYWdlOiBzdHJpbmcsIGxldmVsOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGAke2NoYWxrLmdyYXkobmV3IERhdGUoKS50b0lTT1N0cmluZygpKX0gJHtjaGFsa1tDT0xPUlNbbGV2ZWxdXShsZXZlbC50b1VwcGVyQ2FzZSgpKX0gJHtjaGFsay53aGl0ZUJyaWdodCgnQHdkaW8vYnJvd3NlcnN0YWNrLXNlcnZpY2UnKX0gJHtsb2dNZXNzYWdlfVxcbmBcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGluZm8obWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9nVG9GaWxlKG1lc3NhZ2UsICdpbmZvJylcbiAgICAgICAgbG9nLmluZm8obWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAnZXJyb3InKVxuICAgICAgICBsb2cuZXJyb3IobWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgcGFyYW0/OiB1bmtub3duKSB7XG4gICAgICAgIHRoaXMubG9nVG9GaWxlKG1lc3NhZ2UsICdkZWJ1ZycpXG4gICAgICAgIGlmIChwYXJhbSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UsIHBhcmFtKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHdhcm4obWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9nVG9GaWxlKG1lc3NhZ2UsICd3YXJuJylcbiAgICAgICAgbG9nLndhcm4obWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRyYWNlKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAndHJhY2UnKVxuICAgICAgICBsb2cudHJhY2UobWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyTG9nZ2VyKCkge1xuICAgICAgICBpZiAodGhpcy5sb2dGaWxlU3RyZWFtKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0uZW5kKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0gPSBudWxsXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckxvZ0ZpbGUoKSB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMubG9nRmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBmcy50cnVuY2F0ZVN5bmModGhpcy5sb2dGaWxlUGF0aClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW5zdXJlTG9nc0ZvbGRlcigpIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMubG9nRm9sZGVyUGF0aCkpe1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMubG9nRm9sZGVyUGF0aClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgVGVzdEZyYW1ld29ya0NvbnN0YW50cyA9IHtcbiAgICBLRVlfVEVTVF9VVUlEOiAndGVzdF91dWlkJyxcbiAgICBLRVlfVEVTVF9JRCA6ICd0ZXN0X2lkJyxcbiAgICBLRVlfVEVTVF9OQU1FIDogJ3Rlc3RfbmFtZScsXG4gICAgS0VZX1RFU1RfRklMRV9QQVRIIDogJ3Rlc3RfZmlsZV9wYXRoJyxcbiAgICBLRVlfVEVTVF9UQUdTIDogJ3Rlc3RfdGFncycsXG4gICAgS0VZX1RFU1RfUkVTVUxUIDogJ3Rlc3RfcmVzdWx0JyxcbiAgICBLRVlfVEVTVF9SRVNVTFRfQVQgOiAndGVzdF9yZXN1bHRfYXQnLFxuICAgIEtFWV9URVNUX1NUQVJURURfQVQgOiAndGVzdF9zdGFydGVkX2F0JyxcbiAgICBLRVlfVEVTVF9FTkRFRF9BVCA6ICd0ZXN0X2VuZGVkX2F0JyxcbiAgICBLRVlfVEVTVF9MT0NBVElPTiA6ICd0ZXN0X2xvY2F0aW9uJyxcbiAgICBLRVlfVEVTVF9TQ09QRSA6ICd0ZXN0X3Njb3BlJyxcbiAgICBLRVlfVEVTVF9TQ09QRVMgOiAndGVzdF9zY29wZXMnLFxuICAgIEtFWV9URVNUX0ZSQU1FV09SS19OQU1FIDogJ3Rlc3RfZnJhbWV3b3JrX25hbWUnLFxuICAgIEtFWV9URVNUX0ZSQU1FV09SS19WRVJTSU9OIDogJ3Rlc3RfZnJhbWV3b3JrX3ZlcnNpb24nLFxuICAgIEtFWV9URVNUX0NPREUgOiAndGVzdF9jb2RlJyxcbiAgICBLRVlfVEVTVF9SRVJVTl9OQU1FIDogJ3Rlc3RfcmVydW5fbmFtZScsXG4gICAgS0VZX1BMQVRGT1JNX0lOREVYIDogJ3BsYXRmb3JtX2luZGV4JyxcbiAgICBLRVlfVEVTVF9GQUlMVVJFIDogJ3Rlc3RfZmFpbHVyZScsXG4gICAgS0VZX1RFU1RfRkFJTFVSRV9UWVBFIDogJ3Rlc3RfZmFpbHVyZV90eXBlJyxcbiAgICBLRVlfVEVTVF9GQUlMVVJFX1JFQVNPTiA6ICd0ZXN0X2ZhaWx1cmVfcmVhc29uJyxcbiAgICBLRVlfVEVTVF9MT0dTIDogJ3Rlc3RfbG9ncycsXG4gICAgS0VZX1RFU1RfTUVUQSA6ICd0ZXN0X21ldGEnLFxuICAgIEtFWV9DVVNUT01fVEFHUyA6ICdjdXN0b21fbWV0YWRhdGEnLFxuICAgIEtFWV9URVNUX0RFRkVSUkVEIDogJ3Rlc3RfZGVmZXJyZWQnLFxuICAgIEtFWV9TRVNTSU9OX05BTUUgOiAndGVzdF9zZXNzaW9uX25hbWUnLFxuICAgIEtFWV9BVVRPTUFURV9TRVNTSU9OX05BTUUgOiAnYXV0b21hdGVfc2Vzc2lvbl9uYW1lJyxcbiAgICBLRVlfQVVUT01BVEVfU0VTU0lPTl9TVEFUVVM6ICdhdXRvbWF0ZV9zZXNzaW9uX3N0YXR1cycsXG4gICAgS0VZX0FVVE9NQVRFX1NFU1NJT05fUkVBU09OOiAnYXV0b21hdGVfc2Vzc2lvbl9yZWFzb24nLFxuICAgIEtFWV9FVkVOVF9TVEFSVEVEX0FUIDogJ2V2ZW50X3N0YXJ0ZWRfYXQnLFxuICAgIEtFWV9FVkVOVF9FTkRFRF9BVCA6ICdldmVudF9lbmRlZF9hdCcsXG4gICAgS0VZX0hPT0tfSUQgOiAnaG9va19pZCcsXG4gICAgS0VZX0hPT0tfUkVTVUxUIDogJ2hvb2tfcmVzdWx0JyxcbiAgICBLRVlfSE9PS19MT0dTIDogJ2hvb2tfbG9ncycsXG4gICAgS0VZX0hPT0tfTkFNRSA6ICdob29rX25hbWUnLFxuICAgIEtFWV9IT09LU19TVEFSVEVEOiAndGVzdF9ob29rc19zdGFydGVkJyxcbiAgICBLRVlfSE9PS1NfRklOSVNIRUQ6ICd0ZXN0X2hvb2tzX2ZpbmlzaGVkJyxcbiAgICBERUZBVUxUX1RFU1RfUkVTVUxUIDogJ3BlbmRpbmcnLFxuICAgIERFRkFVTFRfSE9PS19SRVNVTFQgOiAncGVuZGluZycsXG4gICAgS0lORF9TQ1JFRU5TSE9UIDogJ1RFU1RfU0NSRUVOU0hPVCcsXG4gICAgS0lORF9MT0cgOiAnVEVTVF9MT0cnLFxuICAgIEhPT0tfUkVHRVggOiAnXihCRUZPUkVffEFGVEVSXyknLFxufVxuIiwgIlxuaW1wb3J0IHsgQlJPV1NFUlNUQUNLX1BFUkNZLCBCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSwgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFkgfSBmcm9tICcuLi9jb25zdGFudHMuanMnXG5pbXBvcnQgdHlwZSBCcm93c2VyU3RhY2tDb25maWcgZnJvbSAnLi4vY29uZmlnLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHsgaXNUcnVlLCBpc0xvYWRUZXN0aW5nU2Vzc2lvbiB9IGZyb20gJy4uL3V0aWwuanMnXG5cbmludGVyZmFjZSBFcnJvclR5cGUge1xuICAgIGtleTogc3RyaW5nXG4gICAgbWVzc2FnZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JzIHtcbiAgICBlcnJvcnM6IEVycm9yVHlwZVtdXG59XG5cbmV4cG9ydCBjb25zdCBnZXRQcm9kdWN0TWFwID0gKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPT4ge1xuICAgIC8vIExUUyBnYXRpbmc6IHVuZGVyIExUUywgYXV0b21hdGUgaXMgZm9yY2VkIGZhbHNlIChMVFMgYnVpbGRzIHJvdXRlIHRvXG4gICAgLy8gdGhlIExUUyBpbnRlcm5hbCBodWI7IGtlZXBpbmcgYXV0b21hdGU9dHJ1ZSB0YWdzIFRlc3RIdWIgc291cmNlIGFzXG4gICAgLy8gVE8sQVVULExUUyBpbnN0ZWFkIG9mIFRPLExUUyBcdTIwMTQgc2VlIHB5LXNkayBlYTUzZDkxNCkuIFRoZSBgbHRzYCBrZXlcbiAgICAvLyBpdHNlbGYgaXMgb25seSBlbWl0dGVkIHVuZGVyIExUUyBzbyBub24tTFRTIHBheWxvYWRzIHN0YXkgYnl0ZS1cbiAgICAvLyBpZGVudGljYWwgdG8gdGhlIHByZS1MVFMtUFIgc2hhcGUgKGF2b2lkcyBzdXJwcmlzaW5nIGFueSBiYWNrZW5kIHdpdGhcbiAgICAvLyBzdHJpY3QgdW5rbm93bi1rZXkgdmFsaWRhdGlvbikuXG4gICAgY29uc3QgbHRzID0gaXNMb2FkVGVzdGluZ1Nlc3Npb24oKVxuICAgIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIGJvb2xlYW4gfCB1bmRlZmluZWRdW10gPSBbXG4gICAgICAgIFsnb2JzZXJ2YWJpbGl0eScsIGNvbmZpZy50ZXN0T2JzZXJ2YWJpbGl0eS5lbmFibGVkXSxcbiAgICAgICAgWydhY2Nlc3NpYmlsaXR5JywgISFjb25maWcuYWNjZXNzaWJpbGl0eV0sXG4gICAgICAgIFsncGVyY3knLCBjb25maWcucGVyY3ldLFxuICAgICAgICBbJ2F1dG9tYXRlJywgbHRzID8gZmFsc2UgOiBjb25maWcuYXV0b21hdGVdLFxuICAgICAgICBbJ2FwcF9hdXRvbWF0ZScsIGNvbmZpZy5hcHBBdXRvbWF0ZV0sXG4gICAgXVxuICAgIGlmIChsdHMpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKFsnbHRzJywgdHJ1ZV0pXG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcy5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSBudWxsKSkgYXMgeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFByb2Nlc3NFdmVudEZvclRlc3RodWIgPSAoZXZlbnRUeXBlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAvLyBMVFMgc2hvcnQtY2lyY3VpdDogd2hlbiBydW5uaW5nIGFzIGFuIExUUyBsb2FkIHRlc3QgKEJST1dTRVJTVEFDS19MVFM9dHJ1ZVxuICAgIC8vIGZvciBsb2NhbCByZXBybywgb3IgQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEIHNldCBieSB0aGUgcG9kKSwgVGVzdEh1YlxuICAgIC8vIGV2ZW50IGVtaXNzaW9uIG11c3QgYWx3YXlzIGZsb3cgcmVnYXJkbGVzcyBvZiB0aGUgb2JzZXJ2YWJpbGl0eSAvXG4gICAgLy8gYWNjZXNzaWJpbGl0eSAvIHBlcmN5IGVudiBmbGFncy4gUG9kIHJ1bnMgZG8gZXhwb3J0XG4gICAgLy8gQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFksIGJ1dCB0aGUgbG9jYWwtcmVwcm8gZmxhZyBwYXRoIGRvZXNuJ3RcbiAgICAvLyBndWFyYW50ZWUgaXQgXHUyMDE0IHdpdGhvdXQgdGhpcyBzaG9ydC1jaXJjdWl0LCBnZXRQcm9kdWN0TWFwIGNvcnJlY3RseVxuICAgIC8vIGVtaXRzIGx0czogdHJ1ZSB3aGlsZSBldmVyeSBvblRlc3RTdGFydCAvIG9uVGVzdEVuZCAvIG9uSG9va1N0YXJ0XG4gICAgLy8gc2lsZW50bHkgbm8tb3BzLiBNaXJyb3Igb2YgdGhlIHVuY29uZGl0aW9uYWwgTFRTIGV2ZW50IGZsb3cgaW4gcHktc2RrJ3NcbiAgICAvLyBzaG91bGRfc2VuZF9ldmVudF9mb3JfdGVzdGh1YigpIChQUiAjOTkzKS5cbiAgICBpZiAoaXNMb2FkVGVzdGluZ1Nlc3Npb24oKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAoaXNUcnVlKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgaWYgKGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfQUNDRVNTSUJJTElUWV0pKSB7XG4gICAgICAgIHJldHVybiAhKFsnSG9va1J1blN0YXJ0ZWQnLCAnSG9va1J1bkZpbmlzaGVkJywgJ0xvZ0NyZWF0ZWQnXS5pbmNsdWRlcyhldmVudFR5cGUpKVxuICAgIH1cbiAgICBpZiAoaXNUcnVlKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19QRVJDWV0pICYmIGV2ZW50VHlwZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgLy8gRXZhbHVhdGUgd2l0aCBpc1RydWUgc28gYSBwcm9kdWN0IGZsYWcgZXhwbGljaXRseSBzZXQgdG8gdGhlIHN0cmluZyAnZmFsc2UnXG4gICAgLy8gKGUuZy4gb2JzZXJ2YWJpbGl0eSB0dXJuZWQgb2ZmIGFmdGVyIGEgZmFpbGVkL2Jsb2NrZWQgYnVpbGQtc3RhcnQpIHJlYWRzIGFzXG4gICAgLy8gb2ZmLiBSYXcgQm9vbGVhbignZmFsc2UnKSBpcyB0cnV0aHksIHdoaWNoIGtlcHQgZXZlbnRzIGZsb3dpbmcgZm9yIGFuXG4gICAgLy8gb2JzZXJ2YWJpbGl0eS1vbmx5IHNlc3Npb24gZXZlbiBhZnRlciB0aGUgZmxhZyB3YXMgZGlzYWJsZWQuXG4gICAgcmV0dXJuIGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfQUNDRVNTSUJJTElUWV0pIHx8IGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWV0pIHx8IGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfUEVSQ1ldKVxufVxuXG5leHBvcnQgY29uc3QgaGFuZGxlRXJyb3JGb3JPYnNlcnZhYmlsaXR5ID0gKGVycm9yOiBFcnJvcnMgfCBudWxsKTogdm9pZCA9PiB7XG4gICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFldID0gJ2ZhbHNlJ1xuICAgIGxvZ0J1aWxkRXJyb3IoZXJyb3IsICdUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzJylcbn1cblxuZXhwb3J0IGNvbnN0IGhhbmRsZUVycm9yRm9yQWNjZXNzaWJpbGl0eSA9IChlcnJvcjogRXJyb3JzIHwgbnVsbCk6IHZvaWQgPT4ge1xuICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19BQ0NFU1NJQklMSVRZXSA9ICdmYWxzZSdcbiAgICBsb2dCdWlsZEVycm9yKGVycm9yLCAnYWNjZXNzaWJpbGl0eScpXG59XG5cbmV4cG9ydCBjb25zdCBsb2dCdWlsZEVycm9yID0gKGVycm9yOiBFcnJvcnMgfCBudWxsLCBwcm9kdWN0OiBzdHJpbmcgPSAnJyk6IHZvaWQgPT4ge1xuICAgIGlmICghZXJyb3IgfHwgIWVycm9yLmVycm9ycykge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYCR7cHJvZHVjdC50b1VwcGVyQ2FzZSgpfSBCdWlsZCBjcmVhdGlvbiBmYWlsZWQgJHtlcnJvciF9YClcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlcnJvckpzb24gb2YgZXJyb3IuZXJyb3JzKSB7XG4gICAgICAgIGNvbnN0IGVycm9yVHlwZSA9IGVycm9ySnNvbi5rZXlcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3JKc29uLm1lc3NhZ2VcbiAgICAgICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0VSUk9SX0lOVkFMSURfQ1JFREVOVElBTFMnOlxuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ0VSUk9SX0FDQ0VTU19ERU5JRUQnOlxuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSAnRVJST1JfU0RLX0RFUFJFQ0FURUQnOlxuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFByb2R1Y3RNYXBGb3JCdWlsZFN0YXJ0Q2FsbCA9IChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgYWNjZXNzaWJpbGl0eUF1dG9tYXRpb24/OiBib29sZWFuIHwgbnVsbCk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0+IHtcbiAgICAvLyBMVFMgZ2F0aW5nOiB1bmRlciBMVFMsIGF1dG9tYXRlIGlzIGZvcmNlZCBmYWxzZSAoTFRTIGJ1aWxkcyByb3V0ZSB0b1xuICAgIC8vIHRoZSBMVFMgaW50ZXJuYWwgaHViOyBrZWVwaW5nIGF1dG9tYXRlPXRydWUgdGFncyBUZXN0SHViIHNvdXJjZSBhc1xuICAgIC8vIFRPLEFVVCxMVFMgaW5zdGVhZCBvZiBUTyxMVFMgXHUyMDE0IHNlZSBweS1zZGsgZWE1M2Q5MTQpLiBUaGUgYGx0c2Aga2V5XG4gICAgLy8gaXRzZWxmIGlzIG9ubHkgZW1pdHRlZCB1bmRlciBMVFMgdG8ga2VlcCBub24tTFRTIHBheWxvYWRzIGJ5dGUtXG4gICAgLy8gaWRlbnRpY2FsIHRvIHRoZSBwcmUtTFRTLVBSIHNoYXBlLlxuICAgIGNvbnN0IGx0cyA9IGlzTG9hZFRlc3RpbmdTZXNzaW9uKClcbiAgICBjb25zdCBlbnRyaWVzOiBbc3RyaW5nLCBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbF1bXSA9IFtcbiAgICAgICAgWydvYnNlcnZhYmlsaXR5JywgY29uZmlnLnRlc3RPYnNlcnZhYmlsaXR5LmVuYWJsZWRdLFxuICAgICAgICBbJ2FjY2Vzc2liaWxpdHknLCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbl0sXG4gICAgICAgIFsncGVyY3knLCBjb25maWcucGVyY3ldLFxuICAgICAgICBbJ2F1dG9tYXRlJywgbHRzID8gZmFsc2UgOiBjb25maWcuYXV0b21hdGVdLFxuICAgICAgICBbJ2FwcF9hdXRvbWF0ZScsIGNvbmZpZy5hcHBBdXRvbWF0ZV0sXG4gICAgXVxuICAgIGlmIChsdHMpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKFsnbHRzJywgdHJ1ZV0pXG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcy5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSBudWxsKSkgYXMgeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcblxuaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSAnQHdkaW8vdHlwZXMnXG5cbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB7IGlzVmFsaWRFbmFibGVkVmFsdWUgfSBmcm9tICcuLi91dGlsLmpzJ1xuaW1wb3J0IHsgU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1QsIFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX09OTFkgfSBmcm9tICcuLi9jb25zdGFudHMuanMnXG5cbmNvbnN0IFJVTl9TTUFSVF9TRUxFQ1RJT04gPSAncnVuU21hcnRTZWxlY3Rpb24nXG5cbmNvbnN0IEFMTE9XRURfT1JDSEVTVFJBVElPTl9LRVlTID0gW1xuICAgIFJVTl9TTUFSVF9TRUxFQ1RJT05cbl1cblxudHlwZSBTbWFydFNlbGVjdGlvblJlcG9JbmZvID0ge1xuICAgIHVybD86IHN0cmluZ1xuICAgIGZlYXR1cmVCcmFuY2g/OiBzdHJpbmdcbiAgICBiYXNlQnJhbmNoPzogc3RyaW5nXG4gICAgbmFtZT86IHN0cmluZ1xuICAgIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxudHlwZSBTbWFydFNlbGVjdGlvblNvdXJjZSA9IHN0cmluZ1tdIHwgU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdIHwgbnVsbFxuXG50eXBlIFJ1blNtYXJ0U2VsZWN0aW9uQ29uZmlnID0ge1xuICAgIGVuYWJsZWQ/OiBib29sZWFuIHwgc3RyaW5nXG4gICAgbW9kZT86IHN0cmluZ1xuICAgIHNvdXJjZT86IHN0cmluZyB8IHN0cmluZ1tdIHwgU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdIHwgbnVsbFxufVxuXG5jb25zdCBpc1BsYWluT2JqZWN0ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4pXG5cbmNvbnN0IGFzU3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKClcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIENsYXNzIHRvIGhhbmRsZSB0ZXN0IG9yZGVyaW5nIGZ1bmN0aW9uYWxpdHlcbiAqL1xuY2xhc3MgVGVzdE9yZGVyaW5nIHtcbiAgICBwcml2YXRlIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZyB8IG51bGxcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxuICAgICAgICB0aGlzLm5hbWUgPSBudWxsXG4gICAgfVxuXG4gICAgZW5hYmxlKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICB9XG5cbiAgICBkaXNhYmxlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxuICAgICAgICB0aGlzLm5hbWUgPSBudWxsXG4gICAgfVxuXG4gICAgZ2V0RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlZFxuICAgIH1cblxuICAgIGdldE5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVcbiAgICB9XG59XG5cbi8qKlxuICogVXRpbGl0eSBjbGFzcyBmb3IgdGVzdCBvcmNoZXN0cmF0aW9uXG4gKi9cbnR5cGUgT3JjaGVzdHJhdGlvbkNvbmZpZyA9IE9wdGlvbnMuVGVzdHJ1bm5lciB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbmV4cG9ydCBjbGFzcyBPcmNoZXN0cmF0aW9uVXRpbHMge1xuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogT3JjaGVzdHJhdGlvblV0aWxzIHwgbnVsbCA9IG51bGxcbiAgICBwcml2YXRlIHJ1blNtYXJ0U2VsZWN0aW9uOiBib29sZWFuXG4gICAgcHJpdmF0ZSBzbWFydFNlbGVjdGlvbk1vZGU6IHN0cmluZ1xuICAgIHByaXZhdGUgdGVzdE9yZGVyaW5nOiBUZXN0T3JkZXJpbmdcbiAgICBwcml2YXRlIHNtYXJ0U2VsZWN0aW9uU291cmNlOiBTbWFydFNlbGVjdGlvblNvdXJjZVxuICAgIHByaXZhdGUgcHJvamVjdE5hbWU/OiBzdHJpbmdcbiAgICBwcml2YXRlIGJ1aWxkTmFtZT86IHN0cmluZ1xuICAgIHByaXZhdGUgYnVpbGRJZGVudGlmaWVyPzogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBPcmNoZXN0cmF0aW9uQ29uZmlnKSB7XG4gICAgICAgIHRoaXMucnVuU21hcnRTZWxlY3Rpb24gPSBmYWxzZVxuICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZSA9IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNUXG4gICAgICAgIHRoaXMudGVzdE9yZGVyaW5nID0gbmV3IFRlc3RPcmRlcmluZygpXG4gICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2UgPSBudWxsIC8vIFN0b3JlIHNvdXJjZSBwYXRocyBpZiBwcm92aWRlZFxuXG4gICAgICAgIC8vIENoZWNrIGJvdGggcG9zc2libGUgY29uZmlndXJhdGlvbiBwYXRoczogZGlyZWN0IG9yIG5lc3RlZCBpbiBzZXJ2aWNlc1xuICAgICAgICBjb25zdCBjb25maWdSZWNvcmQgPSBpc1BsYWluT2JqZWN0KGNvbmZpZykgPyBjb25maWcgOiB7fVxuICAgICAgICBsZXQgdGVzdE9yY2hPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGlzUGxhaW5PYmplY3QoY29uZmlnUmVjb3JkLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9ucylcbiAgICAgICAgICAgID8gY29uZmlnUmVjb3JkLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9uc1xuICAgICAgICAgICAgOiB7fVxuXG4gICAgICAgIC8vIElmIG5vdCBmb3VuZCBhdCB0b3AgbGV2ZWwsIGNoZWNrIGlmIGl0J3MgaW4gdGhlIGJyb3dzZXJzdGFjayBzZXJ2aWNlIGNvbmZpZ1xuICAgICAgICBjb25zdCBzZXJ2aWNlcyA9IEFycmF5LmlzQXJyYXkoY29uZmlnUmVjb3JkLnNlcnZpY2VzKSA/IGNvbmZpZ1JlY29yZC5zZXJ2aWNlcyA6IHVuZGVmaW5lZFxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGVzdE9yY2hPcHRpb25zKS5sZW5ndGggPT09IDAgJiYgQXJyYXkuaXNBcnJheShzZXJ2aWNlcykpIHtcbiAgICAgICAgICAgIC8vIExvb2sgZm9yIGJyb3dzZXJzdGFjayBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiBzZXJ2aWNlcykge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShzZXJ2aWNlKSAmJlxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlWzBdID09PSAnYnJvd3NlcnN0YWNrJyAmJlxuICAgICAgICAgICAgICAgICAgICBpc1BsYWluT2JqZWN0KHNlcnZpY2VbMV0pICYmXG4gICAgICAgICAgICAgICAgICAgIGlzUGxhaW5PYmplY3Qoc2VydmljZVsxXS50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnMpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RPcmNoT3B0aW9ucyA9IHNlcnZpY2VbMV0udGVzdE9yY2hlc3RyYXRpb25PcHRpb25zXG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnW2NvbnN0cnVjdG9yXSBGb3VuZCB0ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnMgaW4gYnJvd3NlcnN0YWNrIHNlcnZpY2UgY29uZmlnJylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcnkgdG8gZ2V0IHJ1blNtYXJ0U2VsZWN0aW9uIG9wdGlvbnNcbiAgICAgICAgY29uc3QgcnVuU21hcnRTZWxlY3Rpb25PcHRzOiBSdW5TbWFydFNlbGVjdGlvbkNvbmZpZyA9IGlzUGxhaW5PYmplY3QodGVzdE9yY2hPcHRpb25zW1JVTl9TTUFSVF9TRUxFQ1RJT05dKVxuICAgICAgICAgICAgPyB0ZXN0T3JjaE9wdGlvbnNbUlVOX1NNQVJUX1NFTEVDVElPTl0gYXMgUnVuU21hcnRTZWxlY3Rpb25Db25maWdcbiAgICAgICAgICAgIDoge31cblxuICAgICAgICB0aGlzLl9zZXRSdW5TbWFydFNlbGVjdGlvbihcbiAgICAgICAgICAgIHJ1blNtYXJ0U2VsZWN0aW9uT3B0cy5lbmFibGVkID8/IGZhbHNlLFxuICAgICAgICAgICAgcnVuU21hcnRTZWxlY3Rpb25PcHRzLm1vZGUgfHwgU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1QsXG4gICAgICAgICAgICBydW5TbWFydFNlbGVjdGlvbk9wdHMuc291cmNlID8/IG51bGxcbiAgICAgICAgKVxuICAgICAgICAvLyBFeHRyYWN0IGJ1aWxkIGRldGFpbHMgZnJvbSBjYXBhYmlsaXRpZXNcbiAgICAgICAgdGhpcy5fZXh0cmFjdEJ1aWxkRGV0YWlscyhjb25maWcpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCBidWlsZCBkZXRhaWxzIGZyb20gY2FwYWJpbGl0aWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZXh0cmFjdEJ1aWxkRGV0YWlscyhjb25maWc6IE9yY2hlc3RyYXRpb25Db25maWcpOiB2b2lkIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ1JlY29yZCA9IGlzUGxhaW5PYmplY3QoY29uZmlnKSA/IGNvbmZpZyA6IHt9XG4gICAgICAgICAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSAoY29uZmlnUmVjb3JkIGFzIHsgY2FwYWJpbGl0aWVzPzogdW5rbm93biB9KS5jYXBhYmlsaXRpZXNcblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2FwYWJpbGl0aWVzKSkge1xuICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5mb3JFYWNoKGNhcGFiaWxpdHkgPT4gdGhpcy5fcGFyc2VDYXBhYmlsaXR5KGNhcGFiaWxpdHkpKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGNhcGFiaWxpdGllcykpIHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbXVsdGlyZW1vdGUgY2FwYWJpbGl0aWVzXG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhjYXBhYmlsaXRpZXMpLmZvckVhY2goKGNhcHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QoY2FwcykgJiYgJ2NhcGFiaWxpdGllcycgaW4gY2FwcyAmJiBpc1BsYWluT2JqZWN0KGNhcHMuY2FwYWJpbGl0aWVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VDYXBhYmlsaXR5KGNhcHMuY2FwYWJpbGl0aWVzKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbX2V4dHJhY3RCdWlsZERldGFpbHNdIEV4dHJhY3RlZCAtIHByb2plY3ROYW1lOiAke3RoaXMucHJvamVjdE5hbWV9LCBidWlsZE5hbWU6ICR7dGhpcy5idWlsZE5hbWV9LCBidWlsZElkZW50aWZpZXI6ICR7dGhpcy5idWlsZElkZW50aWZpZXJ9YClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgW19leHRyYWN0QnVpbGREZXRhaWxzXSAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUNhcGFiaWxpdHkoY2FwYWJpbGl0eTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBpZiAoIWlzUGxhaW5PYmplY3QoY2FwYWJpbGl0eSkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnN0YWNrT3B0aW9uc1JhdyA9IGNhcGFiaWxpdHlbJ2JzdGFjazpvcHRpb25zJ11cblxuICAgICAgICBpZiAoaXNQbGFpbk9iamVjdChic3RhY2tPcHRpb25zUmF3KSkge1xuICAgICAgICAgICAgY29uc3QgYnVpbGROYW1lID0gYXNTdHJpbmcoYnN0YWNrT3B0aW9uc1Jhdy5idWlsZE5hbWUpXG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0TmFtZSA9IGFzU3RyaW5nKGJzdGFja09wdGlvbnNSYXcucHJvamVjdE5hbWUpXG4gICAgICAgICAgICBjb25zdCBidWlsZElkZW50aWZpZXIgPSBhc1N0cmluZyhic3RhY2tPcHRpb25zUmF3LmJ1aWxkSWRlbnRpZmllcilcblxuICAgICAgICAgICAgaWYgKGJ1aWxkTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGROYW1lID0gYnVpbGROYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvamVjdE5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidWlsZElkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkSWRlbnRpZmllciA9IGJ1aWxkSWRlbnRpZmllclxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbGVnYWN5QnVpbGRJZGVudGlmaWVyID0gYXNTdHJpbmcoY2FwYWJpbGl0eVsnYnJvd3NlcnN0YWNrLmJ1aWxkSWRlbnRpZmllciddKVxuICAgICAgICAgICAgY29uc3QgbGVnYWN5QnVpbGROYW1lID0gYXNTdHJpbmcoY2FwYWJpbGl0eS5idWlsZClcblxuICAgICAgICAgICAgaWYgKGxlZ2FjeUJ1aWxkSWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRJZGVudGlmaWVyID0gbGVnYWN5QnVpbGRJZGVudGlmaWVyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGVnYWN5QnVpbGROYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZE5hbWUgPSBsZWdhY3lCdWlsZE5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBvciBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgT3JjaGVzdHJhdGlvblV0aWxzXG4gICAgICovXG4gICAgc3RhdGljIGdldEluc3RhbmNlKGNvbmZpZz86IE9yY2hlc3RyYXRpb25Db25maWcpOiBPcmNoZXN0cmF0aW9uVXRpbHMgfCBudWxsIHtcbiAgICAgICAgaWYgKCFPcmNoZXN0cmF0aW9uVXRpbHMuX2luc3RhbmNlICYmIGNvbmZpZykge1xuICAgICAgICAgICAgT3JjaGVzdHJhdGlvblV0aWxzLl9pbnN0YW5jZSA9IG5ldyBPcmNoZXN0cmF0aW9uVXRpbHMoY29uZmlnKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPcmNoZXN0cmF0aW9uVXRpbHMuX2luc3RhbmNlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IG9yY2hlc3RyYXRpb24gZGF0YSBmcm9tIGNvbmZpZ1xuICAgICAqL1xuICAgIHN0YXRpYyBnZXRPcmNoZXN0cmF0aW9uRGF0YShjb25maWc6IE9yY2hlc3RyYXRpb25Db25maWcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ1JlY29yZCA9IGlzUGxhaW5PYmplY3QoY29uZmlnKSA/IGNvbmZpZyA6IHt9XG4gICAgICAgIGNvbnN0IG9yY2hlc3RyYXRpb25EYXRhID0gaXNQbGFpbk9iamVjdChjb25maWdSZWNvcmQudGVzdE9yY2hlc3RyYXRpb25PcHRpb25zKVxuICAgICAgICAgICAgPyBjb25maWdSZWNvcmQudGVzdE9yY2hlc3RyYXRpb25PcHRpb25zXG4gICAgICAgICAgICA6IHt9XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9yY2hlc3RyYXRpb25EYXRhKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIGlmIChBTExPV0VEX09SQ0hFU1RSQVRJT05fS0VZUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcnVuIHNtYXJ0IHNlbGVjdGlvbiBzZXR0aW5nXG4gICAgICovXG4gICAgZ2V0UnVuU21hcnRTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ1blNtYXJ0U2VsZWN0aW9uXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNtYXJ0IHNlbGVjdGlvbiBtb2RlXG4gICAgICovXG4gICAgZ2V0U21hcnRTZWxlY3Rpb25Nb2RlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzbWFydCBzZWxlY3Rpb24gc291cmNlXG4gICAgICovXG4gICAgZ2V0U21hcnRTZWxlY3Rpb25Tb3VyY2UoKTogU21hcnRTZWxlY3Rpb25Tb3VyY2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBwcm9qZWN0IG5hbWVcbiAgICAgKi9cbiAgICBnZXRQcm9qZWN0TmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0TmFtZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBidWlsZCBuYW1lXG4gICAgICovXG4gICAgZ2V0QnVpbGROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkTmFtZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBidWlsZCBpZGVudGlmaWVyXG4gICAgICovXG4gICAgZ2V0QnVpbGRJZGVudGlmaWVyKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkSWRlbnRpZmllclxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBidWlsZCBkZXRhaWxzXG4gICAgICovXG4gICAgc2V0QnVpbGREZXRhaWxzKHByb2plY3ROYW1lPzogc3RyaW5nLCBidWlsZE5hbWU/OiBzdHJpbmcsIGJ1aWxkSWRlbnRpZmllcj86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWVcbiAgICAgICAgdGhpcy5idWlsZE5hbWUgPSBidWlsZE5hbWVcbiAgICAgICAgdGhpcy5idWlsZElkZW50aWZpZXIgPSBidWlsZElkZW50aWZpZXJcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbc2V0QnVpbGREZXRhaWxzXSBTZXQgLSBwcm9qZWN0TmFtZTogJHt0aGlzLnByb2plY3ROYW1lfSwgYnVpbGROYW1lOiAke3RoaXMuYnVpbGROYW1lfSwgYnVpbGRJZGVudGlmaWVyOiAke3RoaXMuYnVpbGRJZGVudGlmaWVyfWApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHJ1biBzbWFydCBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXRSdW5TbWFydFNlbGVjdGlvbihlbmFibGVkOiBib29sZWFuIHwgc3RyaW5nLCBtb2RlOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nW10gfCBTbWFydFNlbGVjdGlvblJlcG9JbmZvW10gfCBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHZvaWQge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gUHJvcGVybHkgdmFsaWRhdGUgZW5hYmxlZCB2YWx1ZSAtIG9ubHkgYWNjZXB0IHRydWUgYm9vbGVhbiBvciBzdHJpbmcgXCJ0cnVlXCJcbiAgICAgICAgICAgIHRoaXMucnVuU21hcnRTZWxlY3Rpb24gPSBpc1ZhbGlkRW5hYmxlZFZhbHVlKGVuYWJsZWQpXG4gICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZSA9IG1vZGVcbiAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2UgPSBbXVxuXG4gICAgICAgICAgICAvLyBMb2cgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGRlYnVnZ2luZ1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTZXR0aW5nIHJ1blNtYXJ0U2VsZWN0aW9uOiBlbmFibGVkPSR7dGhpcy5ydW5TbWFydFNlbGVjdGlvbn0sIG1vZGU9JHt0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZX1gKVxuICAgICAgICAgICAgaWYgKHRoaXMucnVuU21hcnRTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBNb2RlIHZhbGlkYXRpb24gLSBvbmx5IHdoZW4gc21hcnQgc2VsZWN0aW9uIGlzIGVuYWJsZWRcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZE1vZGVzID0gW1NNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNULCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9PTkxZXVxuICAgICAgICAgICAgICAgIGlmICghdmFsaWRNb2Rlcy5pbmNsdWRlcyh0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEludmFsaWQgc21hcnQgc2VsZWN0aW9uIG1vZGUgJyR7dGhpcy5zbWFydFNlbGVjdGlvbk1vZGV9JyBwcm92aWRlZC4gRGVmYXVsdGluZyB0byAnJHtTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVH0nLmApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Nb2RlID0gU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1RcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ05vIHNvdXJjZSBwcm92aWRlZCBmb3Igc21hcnQgc2VsZWN0aW9uOyBkZWZhdWx0aW5nIHRvIG51bGwuJylcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlID0gc291cmNlXG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgU21hcnQgc2VsZWN0aW9uIHNvdXJjZSBzZXQgdG8gYXJyYXk6ICR7SlNPTi5zdHJpbmdpZnkoc291cmNlKX1gKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgJiYgc291cmNlLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2UgPSB0aGlzLl9sb2FkU291cmNlRnJvbUZpbGUoc291cmNlKSB8fCBbXVxuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFNtYXJ0IHNlbGVjdGlvbiBzb3VyY2UgbG9hZGVkIGZyb20gZmlsZTogJHtzb3VyY2V9YClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0VGVzdE9yZGVyaW5nKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBbX3NldFJ1blNtYXJ0U2VsZWN0aW9uXSAke2V9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIEpTT04gc291cmNlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgZm9ybWF0IGl0IGZvciBzbWFydCBzZWxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsZVBhdGggLSBQYXRoIHRvIHRoZSBKU09OIGNvbmZpZ3VyYXRpb24gZmlsZVxuICAgICAqIEByZXR1cm5zIEZvcm1hdHRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbnNcbiAgICAgKi9cbiAgICBwcml2YXRlIF9sb2FkU291cmNlRnJvbUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgU291cmNlIGZpbGUgJyR7ZmlsZVBhdGh9JyBkb2VzIG5vdCBleGlzdC5gKVxuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGF0YTogdW5rbm93biA9IG51bGxcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpXG4gICAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShmaWxlQ29udGVudClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgcGFyc2luZyBKU09OIGZyb20gc291cmNlIGZpbGUgJyR7ZmlsZVBhdGh9JzogJHttZXNzYWdlfWApXG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhY2hlIGZlYXR1cmUgYnJhbmNoIG1hcHBpbmdzIGZyb20gZW52IHRvIGF2b2lkIHJlcGVhdGVkIHBhcnNpbmdcbiAgICAgICAgbGV0IGZlYXR1cmVCcmFuY2hFbnZNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBudWxsID0gbnVsbFxuXG4gICAgICAgIGNvbnN0IGxvYWRGZWF0dXJlQnJhbmNoTWFwcyA9ICgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudlZhciA9IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19PUkNIRVNUUkFUSU9OX1NNQVJUX1NFTEVDVElPTl9GRUFUVVJFX0JSQU5DSEVTIHx8ICcnXG4gICAgICAgICAgICBsZXQgZW52TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlbnZNYXAgPSBlbnZWYXIuc3RhcnRzV2l0aCgneycpICYmIGVudlZhci5lbmRzV2l0aCgnfScpXG4gICAgICAgICAgICAgICAgICAgID8gSlNPTi5wYXJzZShlbnZWYXIpXG4gICAgICAgICAgICAgICAgICAgIDogZW52VmFyLnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtLmluY2x1ZGVzKCc6JykpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGl0ZW06IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGl0ZW0uc3BsaXQoJzonKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjW2tleS50cmltKCldID0gdmFsdWUudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIHBhcnNpbmcgZmVhdHVyZSBicmFuY2ggbWFwcGluZ3M6ICR7ZXJyb3J9YClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBGZWF0dXJlIGJyYW5jaCBtYXBwaW5ncyBmcm9tIGVudjogJHtKU09OLnN0cmluZ2lmeShlbnZNYXApfWApXG4gICAgICAgICAgICByZXR1cm4gZW52TWFwXG4gICAgICAgIH1cblxuICAgICAgICBmZWF0dXJlQnJhbmNoRW52TWFwID0gbG9hZEZlYXR1cmVCcmFuY2hNYXBzKClcblxuICAgICAgICBjb25zdCBnZXRGZWF0dXJlQnJhbmNoID0gKG5hbWU6IHN0cmluZywgcmVwb0luZm86IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm8pOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICAgICAgICAgIC8vIDEuIENoZWNrIGluIGVudmlyb25tZW50IHZhcmlhYmxlIG1hcFxuICAgICAgICAgICAgaWYgKGZlYXR1cmVCcmFuY2hFbnZNYXAgJiYgZmVhdHVyZUJyYW5jaEVudk1hcFtuYW1lXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmZWF0dXJlQnJhbmNoRW52TWFwW25hbWVdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAyLiBDaGVjayBpbiByZXBvX2luZm9cbiAgICAgICAgICAgIGlmIChyZXBvSW5mby5mZWF0dXJlQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcG9JbmZvLmZlYXR1cmVCcmFuY2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmIGRhdGEgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGE6IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXSA9IFtdXG4gICAgICAgICAgICBjb25zdCBuYW1lUGF0dGVybiA9IC9eW0EtWjAtOV9dKyQvXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW25hbWUsIHJlcG9JbmZvXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNQbGFpbk9iamVjdChyZXBvSW5mbykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFJlcG9JbmZvID0gcmVwb0luZm8gYXMgU21hcnRTZWxlY3Rpb25SZXBvSW5mb1xuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB1cmwgaXMgYSBzdHJpbmcgYW5kIGlzIHByZXNlbnRcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGVkUmVwb0luZm8udXJsIHx8IHR5cGVvZiB0eXBlZFJlcG9JbmZvLnVybCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYFJlcG9zaXRvcnkgVVJMIGlzIG1pc3Npbmcgb3IgaW52YWxpZCBmb3Igc291cmNlICcke25hbWV9JzogJHtKU09OLnN0cmluZ2lmeShyZXBvSW5mbyl9YClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IGJhc2VCcmFuY2gsIGlmIHByb3ZpZGVkLCBpcyBhIHN0cmluZ1xuICAgICAgICAgICAgICAgIGlmICh0eXBlZFJlcG9JbmZvLmJhc2VCcmFuY2ggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdHlwZWRSZXBvSW5mby5iYXNlQnJhbmNoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgQmFzZSBicmFuY2ggbXVzdCBiZSBhIHN0cmluZyBmb3Igc291cmNlICcke25hbWV9JzogJHtKU09OLnN0cmluZ2lmeShyZXBvSW5mbyl9YClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IGZlYXR1cmVCcmFuY2gsIGlmIHByb3ZpZGVkLCBpcyBhIHN0cmluZ1xuICAgICAgICAgICAgICAgIGlmICh0eXBlZFJlcG9JbmZvLmZlYXR1cmVCcmFuY2ggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdHlwZWRSZXBvSW5mby5mZWF0dXJlQnJhbmNoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgRmVhdHVyZSBicmFuY2ggbXVzdCBiZSBhIHN0cmluZyBmb3Igc291cmNlICcke25hbWV9JzogJHtKU09OLnN0cmluZ2lmeShyZXBvSW5mbyl9YClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBuYW1lXG4gICAgICAgICAgICAgICAgaWYgKCFuYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBJbnZhbGlkIHNvdXJjZSBpZGVudGlmaWVyIGZvcm1hdCBmb3IgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIGxlbmd0aFxuICAgICAgICAgICAgICAgIGlmIChuYW1lLmxlbmd0aCA+IDMwIHx8IG5hbWUubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgU291cmNlIGlkZW50aWZpZXIgJyR7bmFtZX0nIG11c3QgaGF2ZSBhIGxlbmd0aCBiZXR3ZWVuIDEgYW5kIDMwIGNoYXJhY3RlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIHVybCwgYmFzZUJyYW5jaCwgYW5kIGZlYXR1cmVCcmFuY2ggLSBpZ25vcmUgYWxsIG90aGVyIGtleXNcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlQnJhbmNoID0gZ2V0RmVhdHVyZUJyYW5jaChuYW1lLCB0eXBlZFJlcG9JbmZvKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRSZXBvSW5mbzogU21hcnRTZWxlY3Rpb25SZXBvSW5mbyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB0eXBlZFJlcG9JbmZvLnVybCxcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUJyYW5jaDogZmVhdHVyZUJyYW5jaCA/PyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IGFkZCBiYXNlQnJhbmNoIGlmIGl0J3MgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICBpZiAodHlwZWRSZXBvSW5mby5iYXNlQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkUmVwb0luZm8uYmFzZUJyYW5jaCA9IHR5cGVkUmVwb0luZm8uYmFzZUJyYW5jaFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghZmlsdGVyZWRSZXBvSW5mby5mZWF0dXJlQnJhbmNoIHx8IGZpbHRlcmVkUmVwb0luZm8uZmVhdHVyZUJyYW5jaCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEZlYXR1cmUgYnJhbmNoIG5vdCBzcGVjaWZpZWQgZm9yIHNvdXJjZSAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkUmVwb0luZm8uYmFzZUJyYW5jaCAmJiBmaWx0ZXJlZFJlcG9JbmZvLmJhc2VCcmFuY2ggPT09IGZpbHRlcmVkUmVwb0luZm8uZmVhdHVyZUJyYW5jaCkge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgRmVhdHVyZSBicmFuY2ggYW5kIGJhc2UgYnJhbmNoIGNhbm5vdCBiZSB0aGUgc2FtZSBmb3Igc291cmNlICcke25hbWV9JzogJHtKU09OLnN0cmluZ2lmeShyZXBvSW5mbyl9YClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWREYXRhLnB1c2goZmlsdGVyZWRSZXBvSW5mbylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlZERhdGFcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5maWx0ZXIoaXNQbGFpbk9iamVjdCkgYXMgU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGVzdCBvcmRlcmluZyBiYXNlZCBvbiBwcmlvcml0aWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0VGVzdE9yZGVyaW5nKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5ydW5TbWFydFNlbGVjdGlvbikgeyAvLyBIaWdoZXN0IHByaW9yaXR5XG4gICAgICAgICAgICB0aGlzLnRlc3RPcmRlcmluZy5lbmFibGUoUlVOX1NNQVJUX1NFTEVDVElPTilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGVzdE9yZGVyaW5nLmRpc2FibGUoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGVzdCBvcmRlcmluZyBpcyBlbmFibGVkXG4gICAgICovXG4gICAgdGVzdE9yZGVyaW5nRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVzdE9yZGVyaW5nLmdldEVuYWJsZWQoKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0ZXN0IG9yZGVyaW5nIG5hbWVcbiAgICAgKi9cbiAgICBnZXRUZXN0T3JkZXJpbmdOYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy50ZXN0T3JkZXJpbmcuZ2V0RW5hYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZXN0T3JkZXJpbmcuZ2V0TmFtZSgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGVzdCBvcmNoZXN0cmF0aW9uIG1ldGFkYXRhXG4gICAgICovXG4gICAgZ2V0VGVzdE9yY2hlc3RyYXRpb25NZXRhZGF0YSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAncnVuX3NtYXJ0X3NlbGVjdGlvbic6IHtcbiAgICAgICAgICAgICAgICAnZW5hYmxlZCc6IHRoaXMuZ2V0UnVuU21hcnRTZWxlY3Rpb24oKSxcbiAgICAgICAgICAgICAgICAnbW9kZSc6IHRoaXMuZ2V0U21hcnRTZWxlY3Rpb25Nb2RlKCksXG4gICAgICAgICAgICAgICAgJ3NvdXJjZSc6IHRoaXMuZ2V0U21hcnRTZWxlY3Rpb25Tb3VyY2UoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJ1aWxkIHN0YXJ0IGRhdGFcbiAgICAgKi9cbiAgICBnZXRCdWlsZFN0YXJ0RGF0YSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBydW5fc21hcnRfc2VsZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5nZXRSdW5TbWFydFNlbGVjdGlvbigpLFxuICAgICAgICAgICAgICAgIG1vZGU6IHRoaXMuZ2V0U21hcnRTZWxlY3Rpb25Nb2RlKClcbiAgICAgICAgICAgICAgICAvLyBOb3Qgc2VuZGluZyBcInNvdXJjZVwiIHRvIFRIIGJ1aWxkc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBPcmNoZXN0cmF0aW9uVXRpbHNcbiIsICJpbXBvcnQgdHlwZSB7IENhcGFiaWxpdGllcywgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuXG5pbXBvcnQgeyBCU1RBQ0tfU0VSVklDRV9WRVJTSU9OLCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELCBXRElPX05BTUlOR19QUkVGSVggfSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCB0eXBlIHsgQnJvd3NlcnN0YWNrQ29uZmlnLCBDcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLCBVc2VyQ29uZmlnZm9yUmVwb3J0aW5nIH0gZnJvbSAnLi90eXBlcy5qcydcbmltcG9ydCB7IERFRkFVTFRfUkVRVUVTVF9DT05GSUcsIGdldE9ic2VydmFiaWxpdHlLZXksIGdldE9ic2VydmFiaWxpdHlVc2VyIH0gZnJvbSAnLi91dGlsLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgQVBJVXRpbHMgZnJvbSAnLi9jbGkvYXBpVXRpbHMuanMnXG5cbmltcG9ydCB7IF9mZXRjaCBhcyBmZXRjaCB9IGZyb20gJy4vZmV0Y2hXcmFwcGVyLmpzJ1xuXG50eXBlIERpY3QgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDcmFzaFJlcG9ydGVyIHtcbiAgICAvKiBVc2VyIHRlc3QgY29uZmlnIGZvciBidWlsZCBydW4gbWludXMgUElJICovXG4gICAgcHVibGljIHN0YXRpYyB1c2VyQ29uZmlnRm9yUmVwb3J0aW5nOiBVc2VyQ29uZmlnZm9yUmVwb3J0aW5nID0ge31cbiAgICAvKiBVc2VyIGNyZWRlbnRpYWxzIHVzZWQgZm9yIHJlcG9ydGluZyBjcmFzaGVzIGluIGJyb3dzZXJzdGFjayBzZXJ2aWNlICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZDogQ3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZCA9IHt9XG5cbiAgICBzdGF0aWMgc2V0Q3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZChvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgICAgIHRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZCA9IHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiBnZXRPYnNlcnZhYmlsaXR5VXNlcihvcHRpb25zLCBjb25maWcpLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IGdldE9ic2VydmFiaWxpdHlLZXkob3B0aW9ucywgY29uZmlnKVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MuZW52LkNSRURFTlRJQUxTX0ZPUl9DUkFTSF9SRVBPUlRJTkcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQpXG4gICAgfVxuXG4gICAgc3RhdGljIHNldENvbmZpZ0RldGFpbHModXNlckNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLCBjYXBhYmlsaXRpZXM6IENhcGFiaWxpdGllcy5UZXN0cnVubmVyQ2FwYWJpbGl0aWVzLCBvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICAgICAgY29uc3QgY29uZmlnV2l0aG91dFBJSSA9IHRoaXMuZmlsdGVyUElJKHVzZXJDb25maWcpXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkQ2FwYWJpbGl0aWVzID0gdGhpcy5maWx0ZXJDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzKVxuICAgICAgICB0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcgPSB7XG4gICAgICAgICAgICBmcmFtZXdvcms6IHVzZXJDb25maWcuZnJhbWV3b3JrLFxuICAgICAgICAgICAgc2VydmljZXM6IGNvbmZpZ1dpdGhvdXRQSUkuc2VydmljZXMsXG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IGZpbHRlcmVkQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgICAgJ0JST1dTRVJTVEFDS19CVUlMRCc6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19CVUlMRCxcbiAgICAgICAgICAgICAgICAnQlJPV1NFUlNUQUNLX0JVSUxEX05BTUUnOiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQlVJTERfTkFNRSxcbiAgICAgICAgICAgICAgICAnQlVJTERfVEFHJzogcHJvY2Vzcy5lbnYuQlVJTERfVEFHXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzcy5lbnYuVVNFUl9DT05GSUdfRk9SX1JFUE9SVElORyA9IEpTT04uc3RyaW5naWZ5KHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZylcbiAgICAgICAgdGhpcy5zZXRDcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkKG9wdGlvbnMsIHVzZXJDb25maWcpXG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIHVwbG9hZENyYXNoUmVwb3J0KGV4Y2VwdGlvbjogc3RyaW5nLCBzdGFja1RyYWNlOiBzdHJpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnVzZXJuYW1lIHx8ICF0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQucGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQgPSBwcm9jZXNzLmVudi5DUkVERU5USUFMU19GT1JfQ1JBU0hfUkVQT1JUSU5HICE9PSB1bmRlZmluZWQgPyBKU09OLnBhcnNlKHByb2Nlc3MuZW52LkNSRURFTlRJQUxTX0ZPUl9DUkFTSF9SRVBPUlRJTkcpIDogdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gQlN0YWNrTG9nZ2VyLmVycm9yKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIHRvIHBhcnNlIHVzZXIgY3JlZGVudGlhbHMgd2hpbGUgcmVwb3J0aW5nIGNyYXNoIGR1ZSB0byAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQudXNlcm5hbWUgfHwgIXRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC5wYXNzd29yZCkge1xuICAgICAgICAgICAgcmV0dXJuIEJTdGFja0xvZ2dlci5lcnJvcignW0NyYXNoX1JlcG9ydF9VcGxvYWRdIEZhaWxlZCB0byBwYXJzZSB1c2VyIGNyZWRlbnRpYWxzIHdoaWxlIHJlcG9ydGluZyBjcmFzaCcpXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nID0gcHJvY2Vzcy5lbnYuVVNFUl9DT05GSUdfRk9SX1JFUE9SVElORyAhPT0gdW5kZWZpbmVkID8gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5VU0VSX0NPTkZJR19GT1JfUkVQT1JUSU5HKSA6IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFtDcmFzaF9SZXBvcnRfVXBsb2FkXSBGYWlsZWQgdG8gcGFyc2UgdXNlciBjb25maWcgd2hpbGUgcmVwb3J0aW5nIGNyYXNoIGR1ZSB0byAke2Vycm9yfWApXG4gICAgICAgICAgICB0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcgPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIGhhc2hlZF9pZDogcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF0sXG4gICAgICAgICAgICBvYnNlcnZhYmlsaXR5X3ZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBmcmFtZXdvcmtOYW1lOiBXRElPX05BTUlOR19QUkVGSVggKyAodGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nLmZyYW1ld29yayB8fCAnbnVsbCcpLFxuICAgICAgICAgICAgICAgIHNka1ZlcnNpb246IEJTVEFDS19TRVJWSUNFX1ZFUlNJT05cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBleGNlcHRpb246IHtcbiAgICAgICAgICAgICAgICBlcnJvcjogZXhjZXB0aW9uLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgc3RhY2tUcmFjZTogc3RhY2tUcmFjZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZzogdGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJVXRpbHMuREFUQV9FTkRQT0lOVH0vYXBpL3YxL2FuYWx5dGljc2BcblxuICAgICAgICBjb25zdCBlbmNvZGVkQXV0aCA9IEJ1ZmZlci5mcm9tKGAke3RoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC51c2VybmFtZX06JHt0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQucGFzc3dvcmR9YCwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCYXNpYyAke2VuY29kZWRBdXRofWAsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGxldCBib2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShKU09OLnBhcnNlKGJvZHkpKVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gUmVzcG9uc2UgaXMgbm90IEpTT04sIHVzZSB0ZXh0IGFzLWlzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtDcmFzaF9SZXBvcnRfVXBsb2FkXSBTdWNjZXNzIHJlc3BvbnNlOiAke2JvZHl9YClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgW0NyYXNoX1JlcG9ydF9VcGxvYWRdIEZhaWxlZCBkdWUgdG8gJHtyZXNwb25zZS5ib2R5fWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcmVjdXJzaXZlbHlSZWRhY3RLZXlzRnJvbU9iamVjdChvYmo6IERpY3QgfCBBcnJheTxEaWN0Piwga2V5czogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIG9iai5tYXAoZWxlID0+IHRoaXMucmVjdXJzaXZlbHlSZWRhY3RLZXlzRnJvbU9iamVjdChlbGUsIGtleXMpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmluY2x1ZGVzKHByb3AudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqW3Byb3BdID0gJ1tSRURBQ1RFRF0nXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW3Byb3BdID09PSAnb2JqZWN0JyAmJiBvYmpbcHJvcF0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN1cnNpdmVseVJlZGFjdEtleXNGcm9tT2JqZWN0KG9ialtwcm9wXSBhcyBEaWN0IHwgQXJyYXk8RGljdD4sIGtleXMpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW3Byb3BdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShvYmpbcHJvcF0gYXMgc3RyaW5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWQgPT09ICdvYmplY3QnICYmIHBhcnNlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdXJzaXZlbHlSZWRhY3RLZXlzRnJvbU9iamVjdChwYXJzZWQgYXMgRGljdCB8IEFycmF5PERpY3Q+LCBrZXlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialtwcm9wXSA9IEpTT04uc3RyaW5naWZ5KHBhcnNlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgdmFsaWQgSlNPTiwgbGVhdmUgYXMtaXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBkZWxldGVQSUlLZXlzRnJvbU9iamVjdChvYmo6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KSB7XG4gICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBbJ3VzZXInLCAndXNlcm5hbWUnLCAna2V5JywgJ2FjY2Vzc0tleSddLmZvckVhY2goa2V5ID0+IGRlbGV0ZSBvYmpba2V5XSlcbiAgICB9XG5cbiAgICBzdGF0aWMgZmlsdGVyQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllczogQ2FwYWJpbGl0aWVzLlRlc3RydW5uZXJDYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgY29uc3QgY2Fwc0NvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNhcGFiaWxpdGllcykpXG4gICAgICAgIHRoaXMucmVjdXJzaXZlbHlSZWRhY3RLZXlzRnJvbU9iamVjdChjYXBzQ29weSwgWydleHRlbnNpb25zJ10pXG4gICAgICAgIHJldHVybiBjYXBzQ29weVxuICAgIH1cblxuICAgIHN0YXRpYyBmaWx0ZXJQSUkodXNlckNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ1dpdGhvdXRQSUkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHVzZXJDb25maWcpKVxuICAgICAgICB0aGlzLmRlbGV0ZVBJSUtleXNGcm9tT2JqZWN0KGNvbmZpZ1dpdGhvdXRQSUkpXG4gICAgICAgIGNvbnN0IGZpbmFsU2VydmljZXMgPSBbXVxuICAgICAgICBjb25zdCBpbml0aWFsU2VydmljZXMgPSBjb25maWdXaXRob3V0UElJLnNlcnZpY2VzXG4gICAgICAgIGRlbGV0ZSBjb25maWdXaXRob3V0UElJLnNlcnZpY2VzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlcnZpY2VBcnJheSBvZiBpbml0aWFsU2VydmljZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZXJ2aWNlQXJyYXkpICYmIHNlcnZpY2VBcnJheS5sZW5ndGggPj0gMiAmJiBzZXJ2aWNlQXJyYXlbMF0gPT09ICdicm93c2Vyc3RhY2snKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDE7IGlkeCA8IHNlcnZpY2VBcnJheS5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVBJSUtleXNGcm9tT2JqZWN0KHNlcnZpY2VBcnJheVtpZHhdKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VBcnJheVtpZHhdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGJvdGggbmV3IHRlc3RSZXBvcnRpbmdPcHRpb25zIGFuZCBsZWdhY3kgdGVzdE9ic2VydmFiaWxpdHlPcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVQSUlLZXlzRnJvbU9iamVjdChzZXJ2aWNlQXJyYXlbaWR4XS50ZXN0UmVwb3J0aW5nT3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVBJSUtleXNGcm9tT2JqZWN0KHNlcnZpY2VBcnJheVtpZHhdLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbFNlcnZpY2VzLnB1c2goc2VydmljZUFycmF5KVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvKiBXcm9uZyBjb25maWd1cmF0aW9uIGxpa2Ugc3RyaW5ncyBpbnN0ZWFkIG9mIGpzb24gb2JqZWN0cyBjb3VsZCBicmVhayB0aGlzIG1ldGhvZCwgbmVlZHMgbm8gYWN0aW9uICovXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIGluIHBhcnNpbmcgdXNlciBjb25maWcgUElJIHdpdGggZXJyb3IgJHtlcnIgPyAoKGVyciBhcyBFcnJvcikuc3RhY2sgfHwgZXJyKSA6IGVycn1gKVxuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1dpdGhvdXRQSUlcbiAgICAgICAgfVxuICAgICAgICBjb25maWdXaXRob3V0UElJLnNlcnZpY2VzID0gZmluYWxTZXJ2aWNlc1xuICAgICAgICByZXR1cm4gY29uZmlnV2l0aG91dFBJSVxuICAgIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSAnQHdkaW8vdHlwZXMnXG5cbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHtcbiAgICBCUk9XU0VSU1RBQ0tfRElTQUJMRV9BVVRPX0NBUFRVUkVfTE9HUyxcbiAgICBDT01QT1VORF9TRUNSRVRfU1VGRklYRVNfQ0FNRUwsXG4gICAgQ09NUE9VTkRfU0VDUkVUX1NVRkZJWEVTX1NOQUtFLFxuICAgIFBFTV9CTE9DS19SRUdFWCxcbiAgICBQRU1fVU5URVJNSU5BVEVEX1JFR0VYLFxuICAgIFVSTF9VU0VSSU5GT19SRUdFWCxcbiAgICBCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfRklMRV9QQVRILFxuICAgIEJST1dTRVJTVEFDS19XRElPX0NPTkZJR19TVFJBVEVHWSxcbiAgICBDQVBUVVJFX0NPTkZJR19JTVBPUlRfREVQVEgsXG4gICAgREVGQVVMVF9XRElPX0NPTkZJR19CQVNFTkFNRSxcbiAgICBNQVhfQ0FQVFVSRURfQ09ORklHX0ZJTEVTLFxuICAgIE1BWF9DQVBUVVJFRF9DT05GSUdfRklMRV9CWVRFUyxcbiAgICBNQVhfUEFDS0FHRV9KU09OX1dBTEtfVVAsXG4gICAgUkVEQUNURURfS0VZUyxcbiAgICBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUyxcbiAgICBXRElPX0NMSV9TVUJDT01NQU5EU1xufSBmcm9tICcuL2NvbnN0YW50cy5qcydcblxuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlZEZpbGUge1xuICAgIC8qIGFyY2hpdmUgZW50cnkgbmFtZSAoYmFzZW5hbWUsIGRlLWR1cGxpY2F0ZWQpICovXG4gICAgbmFtZTogc3RyaW5nXG4gICAgLyogYWJzb2x1dGUgcGF0aCB0aGUgY29udGVudCBjYW1lIGZyb20gKi9cbiAgICBzb3VyY2VQYXRoOiBzdHJpbmdcbiAgICBjb250ZW50OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWdQYXRoUmVzb2x1dGlvbiB7XG4gICAgY29uZmlnUGF0aD86IHN0cmluZ1xuICAgIC8qIHdoaWNoIGxhZGRlciBydW5nIGFuc3dlcmVkIFx1MjAxNCByZWNvcmRlZCBvbiB0aGUgU0RLX1VQTE9BRF9MT0dTIGV2ZW50ICovXG4gICAgc3RyYXRlZ3k/OiBzdHJpbmdcbiAgICAvKiB3aHkgbm90aGluZyB3YXMgZm91bmQsIHdoZW4gY29uZmlnUGF0aCBpcyB1bmRlZmluZWQgKi9cbiAgICByZWFzb24/OiBzdHJpbmdcbn1cblxuY29uc3QgaXNSZWFkYWJsZUZpbGUgPSAoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSAmJiBmcy5zdGF0U3luYyhmaWxlUGF0aCkuaXNGaWxlKClcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxufVxuXG4vKipcbiAqIEFjY2VwdCBhIGNvbmZpZyBwYXRoIHRoZSB3YXkgYEB3ZGlvL2NsaWAgZG9lczogdGhlIHZhbHVlIGFzIHNwZWxsZWQsIGVsc2UgdGhlIHNhbWUgc3RlbVxuICogcHJvYmVkIGFjcm9zcyB0aGUgc3VwcG9ydGVkIGV4dGVuc2lvbnMuXG4gKlxuICogVGhlIHByb2JlIGlzIG5vdCBkZWZlbnNpdmUgcGFkZGluZyBcdTIwMTQgaXQgaXMgcmVxdWlyZWQuIGBjb21tYW5kcy9ydW4udHNgIGhhbmRzIGBMYXVuY2hlcmAgdGhlXG4gKiBwYXRoIHRoYXQgYGNhbkFjY2Vzc0NvbmZpZ1BhdGhgIGZvdW5kLCBidXQgbGVhdmVzIGBjb25maWctcGF0aGAgc2V0IHRvIHdoYXQgdGhlIFVTRVIgdHlwZWQsXG4gKiBhbmQgYSBUeXBlU2NyaXB0IHByb2plY3QgbGVnYWxseSBzcGVsbHMgYSBgLnRzYCBjb25maWcgd2l0aCBgLmpzYC4gVmVyaWZpZWQgYWdhaW5zdCBhIHJlYWxcbiAqIHdkaW8gcnVuOiBgd2RpbyBydW4gLi9jb25maWdzL2EuY29uZi5qc2Agd2l0aCBvbmx5IGBjb25maWdzL2EuY29uZi50c2Agb24gZGlzayBzdGFydHMgZmluZVxuICogYW5kIHJlcG9ydHMgYGNvbmZpZy1wYXRoOiAnLi9jb25maWdzL2EuY29uZi5qcydgLCBhIHBhdGggdGhhdCBkb2VzIG5vdCBleGlzdC5cbiAqL1xuY29uc3QgcmVzb2x2ZUNhbmRpZGF0ZSA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgIXZhbHVlLnRyaW0oKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZ1bGwgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgdmFsdWUudHJpbSgpKVxuICAgICAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoZnVsbClcbiAgICAgICAgY29uc3Qgc3RlbSA9IFNVUFBPUlRFRF9XRElPX0NPTkZJR19FWFRFTlNJT05TLmluY2x1ZGVzKGV4dCkgPyBmdWxsLnNsaWNlKDAsIC1leHQubGVuZ3RoKSA6IGZ1bGxcbiAgICAgICAgcmV0dXJuIFtmdWxsLCAuLi5TVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUy5tYXAoKGUpID0+IGAke3N0ZW19JHtlfWApXVxuICAgICAgICAgICAgLmZpbmQoaXNSZWFkYWJsZUZpbGUpXG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG59XG5cbi8qKlxuICogY3dkLXJlbGF0aXZlIGZvcm0gb2YgYSBGSUxFIHBhdGgsIGZvciBhbnl0aGluZyB0aGF0IGdldHMgdXBsb2FkZWQuXG4gKlxuICogVGhlIGJhc2VuYW1lIGZhbGxiYWNrIGlzIHNhZmUgaGVyZSBvbmx5IGJlY2F1c2UgYHBhdGgucmVsYXRpdmVgIGlzIG5ldmVyIGVtcHR5IGZvciBhIGZpbGUgXHUyMDE0XG4gKiBhIGZpbGUgaXMgbmV2ZXIgZXF1YWwgdG8gY3dkLiBEbyBOT1QgcGFzcyBhIGRpcmVjdG9yeTogc2VlIGByZWxhdGl2ZURpclRvQ3dkYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbGF0aXZlVG9Dd2QgPSAoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZmlsZVBhdGgpIHx8IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpXG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKVxuICAgIH1cbn1cblxuLyoqXG4gKiBjd2QtcmVsYXRpdmUgZm9ybSBvZiBhIERJUkVDVE9SWSBwYXRoLlxuICpcbiAqIGBwYXRoLnJlbGF0aXZlKGN3ZCwgY3dkKWAgaXMgYCcnYCwgd2hpY2ggaXMgdGhlIENPTU1PTiBjYXNlIGhlcmUgKGEgbWFuaWZlc3QgYXQgdGhlIHByb2plY3RcbiAqIHJvb3QpLCBzbyBhIGJhc2VuYW1lIGZhbGxiYWNrIHdvdWxkIHJlcG9ydCB0aGUgZm9sZGVyIG5hbWUgXHUyMDE0IGFuZCBmb3IgYSBwcm9qZWN0IGNoZWNrZWQgb3V0XG4gKiBkaXJlY3RseSBpbiBgJEhPTUVgIHRoYXQgZm9sZGVyIG5hbWUgaXMgdGhlIE9TIHVzZXJuYW1lLCB3aGljaCBpcyB0aGUgZXhhY3QgZXhwb3N1cmUgdGhlXG4gKiByZWxhdGl2ZS1wYXRoIGhhbmRsaW5nIGV4aXN0cyB0byBwcmV2ZW50LiBFbXB0eSBtZWFucyBcImN3ZFwiLCBzbyByZW5kZXIgaXQgYXMgYC5gLlxuICovXG5leHBvcnQgY29uc3QgcmVsYXRpdmVEaXJUb0N3ZCA9IChkaXI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZGlyKSB8fCAnLidcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuICcuJ1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSB1c2VyJ3Mgd2RpbyBjb25maWcgZmlsZS5cbiAqXG4gKiBXRElPIGtlZXBzIHRoZSByZWFsIHBhdGggaW4gYENvbmZpZ1BhcnNlcmAncyBwcml2YXRlIGAjY29uZmlnRmlsZVBhdGhgLCB3aGljaCBubyBzZXJ2aWNlIGNhblxuICogcmVhY2gsIHNvIHRoaXMgcmVjb25zdHJ1Y3RzIGl0IGZyb20gdGhlIHZhbHVlcyB0aGUgQ0xJIGRvZXMgbGVhdmUgb24gdGhlIG1lcmdlZCBjb25maWcgXHUyMDE0XG4gKiBtaXJyb3JpbmcgaG93IGBAd2Rpby9jbGlgIGl0c2VsZiByZXNvbHZlcyBpdC4gVGhlIENMSSBuZXZlciBzZWFyY2hlczogaXQgdGFrZXMgb25lIGNhbmRpZGF0ZVxuICogYW5kIHByb2JlcyBvbmUgc3RlbSBhY3Jvc3MgdGhlIHN1cHBvcnRlZCBleHRlbnNpb25zLCBzbyBuZWl0aGVyIGRvZXMgdGhpcy5cbiAqXG4gKiAgIDEuIEJST1dTRVJTVEFDS19XRElPX0NPTkZJR19GSUxFX1BBVEggIFx1MjAxNCBleHBsaWNpdCBvdmVycmlkZSAvIHN1cHBvcnQgZXNjYXBlIGhhdGNoXG4gKiAgIDIuIGNvbmZpZ1snY29uZmlnLXBhdGgnXSAgICAgICAgICAgICAgIFx1MjAxNCB5YXJncycga2ViYWIgYWxpYXMgb2YgdGhlIGBydW4gPGNvbmZpZ1BhdGg+YFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uYWwgKHY4IGFuZCB2OSBhbGlrZSlcbiAqICAgMy4gY29uZmlnLl9bMF0gICAgICAgICAgICAgICAgICAgICAgICAgXHUyMDE0IHRoZSBiYXJlIGB3ZGlvIDxjb25maWc+YCBmb3JtLCB3aGljaCBgcnVuLnRzYFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZiByZXNvbHZlcyBmcm9tIGBwYXJhbXMuX1swXWBcbiAqICAgNC4gcm9vdERpciArIHdkaW8uY29uZi48ZXh0PiAgICAgICAgICAgXHUyMDE0IG5vLWFyZyBgd2Rpb2AsIGFuZCBwcm9ncmFtbWF0aWMgYG5ldyBMYXVuY2hlcigpYFxuICogICA1LiBjd2QgKyB3ZGlvLmNvbmYuPGV4dD4gICAgICAgICAgICAgICBcdTIwMTQgd2hlbiB0aGUgdXNlciBvdmVycmlkZXMgYHJvb3REaXJgIGluIHRoZWlyIGNvbmZpZ1xuICpcbiAqIGBjb25maWcuX2AgaXMgcmVhZCByYXRoZXIgdGhhbiByYXcgYHByb2Nlc3MuYXJndmA6IGl0IGlzIHRoZSBzYW1lIHBvc2l0aW9uYWwgQUZURVIgeWFyZ3MgaGFzXG4gKiBhcHBsaWVkIHdkaW8ncyBvd24gb3B0aW9uIGRlY2xhcmF0aW9ucy4gU2Nhbm5pbmcgYXJndiBtZWFucyByZS1pbXBsZW1lbnRpbmcgdGhhdCB3aXRoIGFcbiAqIGhldXJpc3RpYyB0aGF0IGNhbm5vdCBrbm93IHdoaWNoIGZsYWdzIGFyZSBib29sZWFuIFx1MjAxNCBhbmQgYHdkaW8gLS13YXRjaCAuL2EuY29uZi50c2AgcHV0cyB0aGVcbiAqIHJlYWwgY29uZmlnIGluIGBfWzBdYCB3aGlsZSBhbnkgXCJza2lwIGEgZmxhZydzIHZhbHVlXCIgcnVsZSB0aHJvd3MgaXQgYXdheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXZGlvQ29uZmlnUGF0aChjb25maWc/OiBPcHRpb25zLlRlc3RydW5uZXIpOiBDb25maWdQYXRoUmVzb2x1dGlvbiB7XG4gICAgY29uc3QgcmVjb3JkID0gKGNvbmZpZyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uYWxzID0gQXJyYXkuaXNBcnJheShyZWNvcmQuXykgPyByZWNvcmQuXyBhcyB1bmtub3duW10gOiBbXVxuICAgICAgICBjb25zdCBwb3NpdGlvbmFsID0gcG9zaXRpb25hbHMuZmlsdGVyKFxuICAgICAgICAgICAgKGVudHJ5KTogZW50cnkgaXMgc3RyaW5nID0+IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycgJiYgIVdESU9fQ0xJX1NVQkNPTU1BTkRTLmluY2x1ZGVzKGVudHJ5KVxuICAgICAgICApWzBdXG4gICAgICAgIGNvbnN0IHJvb3REaXIgPSB0eXBlb2YgcmVjb3JkLnJvb3REaXIgPT09ICdzdHJpbmcnID8gcmVjb3JkLnJvb3REaXIgOiB1bmRlZmluZWRcblxuICAgICAgICBjb25zdCBydW5nczogQXJyYXk8W3N0cmluZywgdW5rbm93bl0+ID0gW1xuICAgICAgICAgICAgWydlbnZfb3ZlcnJpZGUnLCBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfRklMRV9QQVRIXV0sXG4gICAgICAgICAgICBbJ2NsaV9jb25maWdfcGF0aCcsIHJlY29yZFsnY29uZmlnLXBhdGgnXV0sXG4gICAgICAgICAgICBbJ2NvbmZpZ19wb3NpdGlvbmFsJywgcG9zaXRpb25hbF0sXG4gICAgICAgICAgICBbJ3Jvb3RfZGlyX2RlZmF1bHQnLCByb290RGlyICYmIHBhdGguam9pbihyb290RGlyLCBERUZBVUxUX1dESU9fQ09ORklHX0JBU0VOQU1FKV0sXG4gICAgICAgICAgICBbJ2N3ZF9kZWZhdWx0JywgREVGQVVMVF9XRElPX0NPTkZJR19CQVNFTkFNRV1cbiAgICAgICAgXVxuXG4gICAgICAgIGZvciAoY29uc3QgW3N0cmF0ZWd5LCB2YWx1ZV0gb2YgcnVuZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSByZXNvbHZlQ2FuZGlkYXRlKHZhbHVlKVxuICAgICAgICAgICAgaWYgKGNvbmZpZ1BhdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBjb25maWdQYXRoLCBzdHJhdGVneSB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyByZWFzb246ICdjb25maWdfbm90X2ZvdW5kJyB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB7IHJlYXNvbjogJ2NvbmZpZ19yZXNvbHZlX2V4Y2VwdGlvbicgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIG9uY2UsIGFzIGVhcmx5IGFzIHBvc3NpYmxlLCBhbmQgcHVibGlzaCB0aGUgYW5zd2VyIG9uIHRoZSBlbnZpcm9ubWVudCBzbyB0aGVcbiAqIHVwbG9hZCBwYXRoIChhbmQgYW55IHdvcmtlcikgcmVhZHMgdGhlIFNBTUUgdmFsdWUgaW5zdGVhZCBvZiByZS1kZXJpdmluZyBpdCBmcm9tIGN3ZC5cbiAqXG4gKiBSZS1yZXNvbHZpbmcgYXQgYXJjaGl2ZSB0aW1lIGlzIHByZWNpc2VseSB0aGUgYnVnIFNESy01OTkzIGZpeGVkIGluIHRoZSBOb2RlIFNESzogdGhlXG4gKiBhcmNoaXZlIHN0ZXAgcmVhZCBgY3dkL2Jyb3dzZXJzdGFjay55bWxgIHdoaWxlIHN0YXJ0dXAgaGFkIHJlc29sdmVkIGEgZGlmZmVyZW50IHBhdGgsXG4gKiBzaWxlbnRseSBkcm9wcGluZyB0aGUgY29uZmlnIGZvciBldmVyeSBtb25vcmVwbyAvIHN1YmRpciBDSSBydW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0V2Rpb0NvbmZpZ1BhdGgoY29uZmlnPzogT3B0aW9ucy5UZXN0cnVubmVyKTogQ29uZmlnUGF0aFJlc29sdXRpb24ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGFscmVhZHlSZXNvbHZlZCA9IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19XRElPX0NPTkZJR19GSUxFX1BBVEhdXG4gICAgICAgIGlmIChhbHJlYWR5UmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIC8vIFJlcG9ydCB0aGUgcnVuZyB0aGF0IE9SSUdJTkFMTFkgYW5zd2VyZWQsIG5vdCB0aGUgZW52IHZhciB0aGlzIGZ1bmN0aW9uXG4gICAgICAgICAgICAvLyBpdHNlbGYgd3JvdGUgXHUyMDE0IG90aGVyd2lzZSBldmVyeSBydW4gcmVwb3J0cyBgZW52X292ZXJyaWRlYCBhbmQgdGhlIG1ldHJpY1xuICAgICAgICAgICAgLy8gY2FuIG5ldmVyIHRlbGwgdXMgaG93IG9mdGVuIHRoZSBmYWxsYmFja3MgYXJlIGNhcnJ5aW5nIGN1c3RvbWVycy5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29uZmlnUGF0aDogYWxyZWFkeVJlc29sdmVkLFxuICAgICAgICAgICAgICAgIHN0cmF0ZWd5OiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfU1RSQVRFR1ldIHx8ICdlbnZfb3ZlcnJpZGUnXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gcmVzb2x2ZVdkaW9Db25maWdQYXRoKGNvbmZpZylcbiAgICAgICAgaWYgKHJlc29sdXRpb24uY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX0ZJTEVfUEFUSF0gPSByZXNvbHV0aW9uLmNvbmZpZ1BhdGhcbiAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uLnN0cmF0ZWd5KSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX1NUUkFURUdZXSA9IHJlc29sdXRpb24uc3RyYXRlZ3lcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlbGF0aXZlIHRvIGN3ZDogdGhpcyBsb2cgZmlsZSBpcyBpdHNlbGYgdXBsb2FkZWQsIGFuZCBhbiBhYnNvbHV0ZSBwYXRoIGxlYWtzXG4gICAgICAgICAgICAvLyB0aGUgT1MgdXNlcm5hbWUgYW5kIGRpcmVjdG9yeSBsYXlvdXQgKGAvVXNlcnMvamFuZS5kb2UvLi4uYCkuIGBwYXRoLnJlbGF0aXZlYFxuICAgICAgICAgICAgLy8gc3RpbGwgeWllbGRzIGAuLi8uLi9zaGFyZWQvd2Rpby5jb25mLnRzYCBmb3IgYSBjb25maWcgb3V0c2lkZSBjd2QsIHNvIHRoZVxuICAgICAgICAgICAgLy8gbW9ub3JlcG8vc3ViZGlyIGRpYWdub3N0aWMgXHUyMDE0IHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBvZiBsb2dnaW5nIGl0IFx1MjAxNCBzdXJ2aXZlcy5cbiAgICAgICAgICAgIC8vIFBhdGggYmVmb3JlIHN0cmF0ZWd5OiBCU3RhY2tMb2dnZXIgc2NydWJzIGFueSBgPC4uLj5rZXk6YC9gPC4uLj51c2VyOmAgcHJlZml4ZWRcbiAgICAgICAgICAgIC8vIHZhbHVlLCBzbyBhIHN0cmF0ZWd5IG5hbWUgZW5kaW5nIGluIGBrZXlgL2B1c2VyYCBoZXJlIHdvdWxkIHJlZGFjdCB0aGUgcGF0aC5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgUmVzb2x2ZWQgd2RpbyBjb25maWcgZmlsZSAke3JlbGF0aXZlVG9Dd2QocmVzb2x1dGlvbi5jb25maWdQYXRoKX0gZm9yIGF1dG8tY2FwdHVyZSAoc3RyYXRlZ3kgJHtyZXNvbHV0aW9uLnN0cmF0ZWd5fSlgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBDb3VsZCBub3QgcmVzb2x2ZSB3ZGlvIGNvbmZpZyBmaWxlIGZvciBhdXRvLWNhcHR1cmU6ICR7cmVzb2x1dGlvbi5yZWFzb259YClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x1dGlvblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3Igd2hpbGUgcmVzb2x2aW5nIHdkaW8gY29uZmlnIGZpbGU6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIHsgcmVhc29uOiAnY29uZmlnX3Jlc29sdmVfZXhjZXB0aW9uJyB9XG4gICAgfVxufVxuXG4vKipcbiAqIE9wdC1vdXQgZm9yIGF1dG8tY2FwdHVyZWQgbG9ncy4gU2VydmljZSBvcHRpb24gZmlyc3QsIGVudiB2YXIgYXMgdGhlIENJIGVzY2FwZSBoYXRjaFxuICogKGN1c3RvbWVycyBjYW5ub3QgYWx3YXlzIGVkaXQgYSBjb21taXR0ZWQgY29uZmlnKS4gTmFtZSBtYXRjaGVzIHRoZSBOb2RlIFNESydzXG4gKiBgZGlzYWJsZUF1dG9DYXB0dXJlTG9nc2Agc28gdGhlIGZsYWcgbWVhbnMgdGhlIHNhbWUgdGhpbmcgYWNyb3NzIEJyb3dzZXJTdGFjayBTREtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBdXRvQ2FwdHVyZUxvZ3NEaXNhYmxlZChvcHRpb25zPzogeyBkaXNhYmxlQXV0b0NhcHR1cmVMb2dzPzogYm9vbGVhbiB9KTogYm9vbGVhbiB7XG4gICAgaWYgKG9wdGlvbnM/LmRpc2FibGVBdXRvQ2FwdHVyZUxvZ3MgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfRElTQUJMRV9BVVRPX0NBUFRVUkVfTE9HU10gfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJ1xufVxuXG4vKipcbiAqIE1pcnJvciB0aGUgc2VydmljZSBvcHRpb24gb250byB0aGUgZW52aXJvbm1lbnQgc28gdGhlIG9wdC1vdXQgc3Vydml2ZXMgaW50byB0aGVcbiAqIERFVEFDSEVEIGNsZWFudXAgcHJvY2Vzcywgd2hpY2ggZ2V0cyBubyBvcHRpb25zIG9iamVjdC5cbiAqXG4gKiBXaXRob3V0IHRoaXMgdGhlIG9wdC1vdXQgaXMgd29yc2UgdGhhbiB1c2VsZXNzOiBza2lwcGluZyB0aGUgdXBsb2FkIGxlYXZlc1xuICogYGxvZ3NVcGxvYWRlZGAgZmFsc2UsIHdoaWNoIGlzIGV4YWN0bHkgdGhlIGNvbmRpdGlvbiB0aGF0IGFybXMgdGhlIGV4aXQtdGltZVxuICogYC0tdXBsb2FkTG9nc2AgcmVzY3VlIFx1MjAxNCBzbyBldmVyeSBvcHRlZC1vdXQgcnVuIGhhZCBpdHMgY29uZmlnIHJlYWQgYW5kIFBPU1RlZCBieSB0aGVcbiAqIGNsZWFudXAgY2hpbGQuIFJldHVybnMgd2hldGhlciBhdXRvLWNhcHR1cmUgaXMgZGlzYWJsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaXNoQXV0b0NhcHR1cmVEaXNhYmxlZChvcHRpb25zPzogeyBkaXNhYmxlQXV0b0NhcHR1cmVMb2dzPzogYm9vbGVhbiB9KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGlzYWJsZWQgPSBpc0F1dG9DYXB0dXJlTG9nc0Rpc2FibGVkKG9wdGlvbnMpXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19ESVNBQkxFX0FVVE9fQ0FQVFVSRV9MT0dTXSA9ICd0cnVlJ1xuICAgIH1cbiAgICByZXR1cm4gZGlzYWJsZWRcbn1cblxuLyoqXG4gKiBMaW5lLWxldmVsIGNyZWRlbnRpYWwgc2NydWIsIHBvcnRlZCBmcm9tIHRoZSBOb2RlIFNESydzIGByZWRhY3RTZW5zaXRpdmVDb250ZW50YC5cbiAqXG4gKiBBbnkgbGluZSBtZW50aW9uaW5nIGEgc2Vuc2l0aXZlIGtleSBjb2xsYXBzZXMgdG8gYDxrZXk+OiBbUkVEQUNURURdYC4gV29yZCBib3VuZGFyaWVzXG4gKiBrZWVwIGBob3RrZXlgIC8gYGtleXdvcmRgIGZyb20gdHJpcHBpbmcgdGhlIGJhcmUgYGtleWAgZW50cnkgdGhhdCBXRElPJ3MgdG9wLWxldmVsXG4gKiBjcmVkZW50aWFsIG9wdGlvbnMgZm9yY2UgdXMgdG8gY2FycnkuIGAuYCBpcyBpbnRlbnRpb25hbGx5IE5PVCBwYXJ0IG9mIHRoZSBib3VuZGFyeVxuICogY2xhc3Mgc28gYGJzdGFja09wdGlvbnMuYWNjZXNzS2V5ID0gJy4uLidgIHN0aWxsIG1hdGNoZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWRhY3RTZW5zaXRpdmVDb250ZW50KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0ZXh0XG4gICAgfVxuXG4gICAgY29uc3QgZXNjYXBlUmVnZXggPSAodmFsdWU6IHN0cmluZykgPT4gdmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKVxuICAgIC8vIGxvbmdlc3QgZmlyc3Q6IGFsdGVybmF0aW9uIHJldHVybnMgdGhlIGZpcnN0IG1hdGNoLCBub3QgdGhlIGxvbmdlc3Qgb25lXG4gICAgY29uc3Qga2V5cyA9IFsuLi5SRURBQ1RFRF9LRVlTXVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aClcbiAgICAgICAgLm1hcChlc2NhcGVSZWdleClcbiAgICAgICAgLmpvaW4oJ3wnKVxuICAgIGNvbnN0IHJlZGFjdFJlZ2V4ID0gbmV3IFJlZ0V4cChgXi4qPyg/PCFbQS1aYS16MC05XyRdKSgke2tleXN9KSg/IVtBLVphLXowLTlfJF0pLiokYCwgJ2dtaScpXG5cbiAgICAvLyBDb21wb3VuZCBpZGVudGlmaWVycyBlbmRpbmcgaW4gYSBzZW5zaXRpdmUgd29yZCwgd2hpY2ggdGhlIHdob2xlLXdvcmQgcGFzcyBhYm92ZVxuICAgIC8vIGNhbm5vdCBzZWU6IGl0cyBsb29rYmVoaW5kIHJlamVjdHMgdGhlIHByZWNlZGluZyBsZXR0ZXIgaW4gYGNsaWVudFNlY3JldGAgL1xuICAgIC8vIGByZWZyZXNoVG9rZW5gIC8gYHByaXZhdGVLZXlgLCBhbmQgdGhlIHByZWNlZGluZyBgX2AgaW4gYGNsaWVudF9zZWNyZXRgLlxuICAgIC8vXG4gICAgLy8gY2FtZWxDYXNlIHN0YXlzIGNhc2UtU0VOU0lUSVZFOiByZXF1aXJpbmcgYSBjYXBpdGFsaXNlZCBzdWZmaXggaXMgd2hhdCBzZXBhcmF0ZXNcbiAgICAvLyBgcHJpdmF0ZUtleWAgZnJvbSBgaG90a2V5YCwgc28gdGhpcyBjbG9zZXMgdGhlIGxlYWsgd2l0aG91dCB0aGUgZmFsc2UgcG9zaXRpdmVzIGFcbiAgICAvLyBiYXJlIC9rZXl8dG9rZW58c2VjcmV0LyBwYXNzIHdvdWxkIHByb2R1Y2UuIFRoZSBjb3JlIGRvZXMgTk9UIHJlcXVpcmUgYSBsb3dlcmNhc2VcbiAgICAvLyBjaGFyIGJlZm9yZSB0aGUgc3VmZml4IFx1MjAxNCB0aGF0IGd1YXJkIG9ubHkgZXZlciBkdXBsaWNhdGVkIHRoZSBjYXNlLXNlbnNpdGl2aXR5LCB3aGlsZVxuICAgIC8vIHJlamVjdGluZyBhY3JvbnltIHByZWZpeGVzIChgQVBJVG9rZW5gLCBgSldUU2VjcmV0YCwgYFNTSEtleWAsIGBBV1NTZWNyZXRgKS5cbiAgICAvLyBJZGVudGlmaWVyIHNjYW5zIGFyZSBib3VuZGVkIGF0IDY0IGNoYXJzLiBSZWFsIGNvbmZpZyBrZXlzIGFyZSBmYXIgc2hvcnRlciwgc28gdGhpc1xuICAgIC8vIGNoYW5nZXMgbm8gbWF0Y2g7IGl0IGlzIGRlZmVuY2UtaW4tZGVwdGggYWdhaW5zdCBiYWNrdHJhY2tpbmcgb24gYSBwYXRob2xvZ2ljYWwgbGluZVxuICAgIC8vIChhIG1pbmlmaWVkL2Jhc2U2NCBydW4pLCBrZWVwaW5nIGV2ZXJ5IHN0YXJ0IHBvc2l0aW9uIE8oMSkgaW5zdGVhZCBvZiBPKG4pLlxuICAgIGNvbnN0IGNvbXBvdW5kQ2FtZWxSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeLio/KD88IVtBLVphLXowLTlfJF0pKFtBLVphLXowLTlfJF17MSw2NH0oPzoke0NPTVBPVU5EX1NFQ1JFVF9TVUZGSVhFU19DQU1FTH0pKVxcXFxzKls6PV0uKiRgLFxuICAgICAgICAnZ20nXG4gICAgKVxuICAgIC8vIHNuYWtlX2Nhc2UgaXMgbWF0Y2hlZCBjYXNlLUlOU0VOU0lUSVZFTFksIHdoaWNoIGlzIHNhZmUgcHJlY2lzZWx5IGJlY2F1c2UgaXQgcmVxdWlyZXNcbiAgICAvLyBhbiBleHBsaWNpdCBgX2AgYmVmb3JlIHRoZSBzdWZmaXguIFRoYXQgY292ZXJzIFNDUkVBTUlOR19TTkFLRV9DQVNFIFx1MjAxNCB0aGUgZG9taW5hbnRcbiAgICAvLyBjb252ZW50aW9uIGZvciBzZWNyZXRzIGluIGNvbmZpZy9lbnYgZmlsZXMgKGBBV1NfU0VDUkVUX0FDQ0VTU19LRVlgLCBgR0lUSFVCX1RPS0VOYCkgXHUyMDE0XG4gICAgLy8gd2hpbGUgYGtleXdvcmRgIGFuZCBgbXlfc2VjcmV0YXJ5YCBzdGlsbCBmYWxsIG91dCwgc2luY2UgbmVpdGhlciBoYXMgYF88c3VmZml4PmBcbiAgICAvLyBpbW1lZGlhdGVseSBiZWZvcmUgYW4gYXNzaWdubWVudC5cbiAgICBjb25zdCBjb21wb3VuZFNuYWtlUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICBgXi4qPyg/PCFbQS1aYS16MC05XyRdKShbQS1aYS16MC05XyRdezAsNjR9Xyg/OiR7Q09NUE9VTkRfU0VDUkVUX1NVRkZJWEVTX1NOQUtFfSkpXFxcXHMqWzo9XS4qJGAsXG4gICAgICAgICdnbWknXG4gICAgKVxuXG4gICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKVxuICAgICAgICAvLyBCbG9jay1sZXZlbCBwYXNzZXMgcnVuIEZJUlNUOiB0aGV5IHNwYW4gbGluZXMsIGFuZCB0aGUgbGluZS1hbmNob3JlZCBwYXNzZXMgYmVsb3dcbiAgICAgICAgLy8gY2FuIG9ubHkgZXZlciBzZWUgdGhlIG9uZSBsaW5lIHRoYXQgY2FycmllcyB0aGUga2V5IG5hbWUuXG4gICAgICAgIC5yZXBsYWNlKFBFTV9CTE9DS19SRUdFWCwgJyQxW1JFREFDVEVEXSQyJylcbiAgICAgICAgLnJlcGxhY2UoUEVNX1VOVEVSTUlOQVRFRF9SRUdFWCwgJyQxW1JFREFDVEVEXScpXG4gICAgICAgIC5yZXBsYWNlKFVSTF9VU0VSSU5GT19SRUdFWCwgJyQxW1JFREFDVEVEXUAnKVxuICAgICAgICAucmVwbGFjZShyZWRhY3RSZWdleCwgJyQxOiBbUkVEQUNURURdJylcbiAgICAgICAgLnJlcGxhY2UoY29tcG91bmRDYW1lbFJlZ2V4LCAnJDE6IFtSRURBQ1RFRF0nKVxuICAgICAgICAucmVwbGFjZShjb21wb3VuZFNuYWtlUmVnZXgsICckMTogW1JFREFDVEVEXScpXG59XG5cbmNvbnN0IHJlYWRDYXBwZWRGaWxlID0gKGZpbGVQYXRoOiBzdHJpbmcpOiB7IGNvbnRlbnQ/OiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyB9ID0+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzaXplID0gZnMuc3RhdFN5bmMoZmlsZVBhdGgpLnNpemVcbiAgICAgICAgaWYgKHNpemUgPiBNQVhfQ0FQVFVSRURfQ09ORklHX0ZJTEVfQllURVMpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJlYXNvbjogYCR7cGF0aC5iYXNlbmFtZShmaWxlUGF0aCl9OiB0b29fbGFyZ2UgKCR7c2l6ZX0gYnl0ZXMpYCB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY29udGVudDogZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4geyByZWFzb246IGAke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfTogJHsoZXJyb3IgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IFN0cmluZyhlcnJvcil9YCB9XG4gICAgfVxufVxuXG4vKipcbiAqIFJlc29sdmUgYSByZWxhdGl2ZSBpbXBvcnQgc3BlY2lmaWVyIGFnYWluc3QgdGhlIGltcG9ydGluZyBmaWxlLlxuICpcbiAqIEhhbmRsZXMgdGhlIFR5cGVTY3JpcHQtRVNNIGNvbnZlbnRpb24gd2hlcmUgYC4vc2hhcmVkLmNvbmYuanNgIG9uIGRpc2sgaXMgYWN0dWFsbHlcbiAqIGAuL3NoYXJlZC5jb25mLnRzYCwgcGx1cyBleHRlbnNpb24tbGVzcyBhbmQgZGlyZWN0b3J5IChgL2luZGV4LipgKSBzcGVjaWZpZXJzLlxuICovXG4vKipcbiAqIE9ubHkgZmlsZXMgdGhhdCBhcmUgdGhlbXNlbHZlcyBjb25maWdzIGFyZSBmb2xsb3dlZC5cbiAqXG4gKiBBIHJlbGF0aXZlIHNwZWNpZmllciByZXNvbHZlcyB0byB3aGF0ZXZlciB0aGUgY29uZmlnIGhhcHBlbnMgdG8gaW1wb3J0LCB3aGljaCBpcyBmcmVxdWVudGx5XG4gKiBvcmRpbmFyeSBhcHBsaWNhdGlvbiBzb3VyY2UgKGAuL2hlbHBlcnMvdXRpbHMuanNgKSByYXRoZXIgdGhhbiBjb25maWd1cmF0aW9uLiBDYXB0dXJpbmcgdGhlXG4gKiBzcGxpdC1jb25maWcgY2FzZSAoYGJhc2UuY29uZi5qc2AsIGB3ZGlvLnNoYXJlZC5jb25mLnRzYCkgaXMgdGhlIHBvaW50OyBzaGlwcGluZyBhXG4gKiBjdXN0b21lcidzIGFwcGxpY2F0aW9uIG1vZHVsZXMgaXMgbm90LlxuICovXG5jb25zdCBpc0NvbmZpZ0ZpbGVOYW1lID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IC9cXC5jb25mKGlnKT9cXC5bXi5dKyQvaS50ZXN0KHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpKVxuXG5jb25zdCByZXNvbHZlUmVsYXRpdmVJbXBvcnQgPSAoc3BlY2lmaWVyOiBzdHJpbmcsIGZyb21GaWxlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGJhc2UgPSBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKGZyb21GaWxlKSwgc3BlY2lmaWVyKVxuXG4gICAgaWYgKGlzUmVhZGFibGVGaWxlKGJhc2UpICYmIFNVUFBPUlRFRF9XRElPX0NPTkZJR19FWFRFTlNJT05TLmluY2x1ZGVzKHBhdGguZXh0bmFtZShiYXNlKSkpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29uZmlnRmlsZU5hbWUoYmFzZSkgPyBiYXNlIDogdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3Qgd2l0aG91dEV4dCA9IFNVUFBPUlRFRF9XRElPX0NPTkZJR19FWFRFTlNJT05TLmluY2x1ZGVzKHBhdGguZXh0bmFtZShiYXNlKSlcbiAgICAgICAgPyBiYXNlLnNsaWNlKDAsIC1wYXRoLmV4dG5hbWUoYmFzZSkubGVuZ3RoKVxuICAgICAgICA6IGJhc2VcblxuICAgIGZvciAoY29uc3QgZXh0IG9mIFNVUFBPUlRFRF9XRElPX0NPTkZJR19FWFRFTlNJT05TKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGAke3dpdGhvdXRFeHR9JHtleHR9YFxuICAgICAgICBpZiAoaXNSZWFkYWJsZUZpbGUoY2FuZGlkYXRlKSAmJiBpc0NvbmZpZ0ZpbGVOYW1lKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGVcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUykge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLmpvaW4oYmFzZSwgYGluZGV4JHtleHR9YClcbiAgICAgICAgaWYgKGlzUmVhZGFibGVGaWxlKGNhbmRpZGF0ZSkgJiYgaXNDb25maWdGaWxlTmFtZShjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIENvbGxlY3QgbG9jYWwgZmlsZXMgYSBjb25maWcgcHVsbHMgaW4gKGB3ZGlvLnNoYXJlZC5jb25mLnRzYCBzdHlsZSBzcGxpdHMpLCBzbyBhXG4gKiBjYXB0dXJlZCBjb25maWcgaXMgbm90IGp1c3QgYSB0d28tbGluZSBmaWxlIHRoYXQgc3ByZWFkcyBhIGJhc2UgY29uZmlnIHdlIG5ldmVyIHNlZS5cbiAqXG4gKiBPbmx5IFJFTEFUSVZFIHNwZWNpZmllcnMgYXJlIGZvbGxvd2VkIFx1MjAxNCBiYXJlIHNwZWNpZmllcnMgYXJlIG5wbSBwYWNrYWdlcywgbmV2ZXIgdGhlXG4gKiBjdXN0b21lcidzIG93biBjb25maWcuIERlcHRoIGFuZCBjb3VudCBhcmUgY2FwcGVkIHNvIHRoaXMgY2FuIG5ldmVyIHdhbGsgYSBzb3VyY2UgdHJlZS5cbiAqL1xuY29uc3QgY29sbGVjdExvY2FsSW1wb3J0cyA9IChlbnRyeVBhdGg6IHN0cmluZywgZW50cnlDb250ZW50OiBzdHJpbmcsIGJ1ZGdldDogbnVtYmVyKTogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfT4gPT4ge1xuICAgIGNvbnN0IGZvdW5kOiBBcnJheTx7IGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyB9PiA9IFtdXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoW2VudHJ5UGF0aF0pXG4gICAgbGV0IGZyb250aWVyOiBBcnJheTx7IGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyB9PiA9IFt7IGZpbGVQYXRoOiBlbnRyeVBhdGgsIGNvbnRlbnQ6IGVudHJ5Q29udGVudCB9XVxuXG4gICAgZm9yIChsZXQgZGVwdGggPSAwOyBkZXB0aCA8IENBUFRVUkVfQ09ORklHX0lNUE9SVF9ERVBUSCAmJiBmb3VuZC5sZW5ndGggPCBidWRnZXQ7IGRlcHRoKyspIHtcbiAgICAgICAgY29uc3QgbmV4dDogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfT4gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgeyBmaWxlUGF0aCwgY29udGVudCB9IG9mIGZyb250aWVyKSB7XG4gICAgICAgICAgICAvLyBgZnJvbSAnLi94J2AsIGBpbXBvcnQgJy4veCdgLCBgaW1wb3J0KCcuL3gnKWAsIGByZXF1aXJlKCcuL3gnKWBcbiAgICAgICAgICAgIGNvbnN0IGltcG9ydFJlZ2V4ID0gLyg/OmZyb218aW1wb3J0fHJlcXVpcmUpXFxzKlxcKD9cXHMqWydcIl0oXFwuW14nXCJdKilbJ1wiXS9nXG4gICAgICAgICAgICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcblxuICAgICAgICAgICAgd2hpbGUgKChtYXRjaCA9IGltcG9ydFJlZ2V4LmV4ZWMoY29udGVudCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kLmxlbmd0aCA+PSBidWRnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlUmVsYXRpdmVJbXBvcnQobWF0Y2hbMV0sIGZpbGVQYXRoKVxuICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWQgfHwgc2Vlbi5oYXMocmVzb2x2ZWQpIHx8IHJlc29sdmVkLmluY2x1ZGVzKGAke3BhdGguc2VwfW5vZGVfbW9kdWxlcyR7cGF0aC5zZXB9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2Vlbi5hZGQocmVzb2x2ZWQpXG5cbiAgICAgICAgICAgICAgICBjb25zdCB7IGNvbnRlbnQ6IGltcG9ydGVkQ29udGVudCB9ID0gcmVhZENhcHBlZEZpbGUocmVzb2x2ZWQpXG4gICAgICAgICAgICAgICAgaWYgKGltcG9ydGVkQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvdW5kLnB1c2goeyBmaWxlUGF0aDogcmVzb2x2ZWQsIGNvbnRlbnQ6IGltcG9ydGVkQ29udGVudCB9KVxuICAgICAgICAgICAgICAgIG5leHQucHVzaCh7IGZpbGVQYXRoOiByZXNvbHZlZCwgY29udGVudDogaW1wb3J0ZWRDb250ZW50IH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZnJvbnRpZXIgPSBuZXh0XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kXG59XG5cbi8qKlxuICogR2l2ZSBldmVyeSBhcmNoaXZlIGVudHJ5IGEgdW5pcXVlIG5hbWUuIFR3byBjb25maWdzIGNhbiBzaGFyZSBhIGJhc2VuYW1lXG4gKiAoYGNvbmZpZ3Mvd2Rpby5jb25mLnRzYCArIGBzaGFyZWQvd2Rpby5jb25mLnRzYCk7IHdpdGhvdXQgdGhpcyB0aGUgc2Vjb25kIHNpbGVudGx5XG4gKiBvdmVyd3JpdGVzIHRoZSBmaXJzdCwgc2luY2UgYXJjaGl2ZSBlbnRyaWVzIGFyZSBrZXllZCBieSBiYXNlbmFtZS5cbiAqXG4gKiBTaGFyZWQgd2l0aCBgdXBsb2FkTG9nc2AsIHdoaWNoIGRlLWR1cGVzIHRoZSBjb3BpZWQgbG9nIGZpbGVzIGFnYWluc3QgdGhlc2UgZW50cmllcyBcdTIwMTRcbiAqIG9uZSBpbXBsZW1lbnRhdGlvbiBzbyB0aGUgdHdvIGNhbiBuZXZlciBkaXNhZ3JlZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZHVwZUVudHJ5TmFtZShmaWxlUGF0aDogc3RyaW5nLCB0YWtlbjogU2V0PHN0cmluZz4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2UgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKVxuICAgIGlmICghdGFrZW4uaGFzKGJhc2UpKSB7XG4gICAgICAgIHRha2VuLmFkZChiYXNlKVxuICAgICAgICByZXR1cm4gYmFzZVxuICAgIH1cblxuICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShiYXNlKVxuICAgIGNvbnN0IHN0ZW0gPSBleHQgPyBiYXNlLnNsaWNlKDAsIC1leHQubGVuZ3RoKSA6IGJhc2VcbiAgICBsZXQgaW5kZXggPSAxXG4gICAgbGV0IGNhbmRpZGF0ZSA9IGAke3N0ZW19LiR7aW5kZXh9JHtleHR9YFxuICAgIHdoaWxlICh0YWtlbi5oYXMoY2FuZGlkYXRlKSkge1xuICAgICAgICBpbmRleCsrXG4gICAgICAgIGNhbmRpZGF0ZSA9IGAke3N0ZW19LiR7aW5kZXh9JHtleHR9YFxuICAgIH1cbiAgICB0YWtlbi5hZGQoY2FuZGlkYXRlKVxuICAgIHJldHVybiBjYW5kaWRhdGVcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgcmVkYWN0ZWQgY29uZmlnIGVudHJpZXMgYWRkZWQgdG8gdGhlIGF1dG8tY2FwdHVyZWQgbG9nIGFyY2hpdmUuXG4gKlxuICogQmVzdCBlZmZvcnQgYnkgY29udHJhY3Q6IGFueSBmYWlsdXJlIHJldHVybnMgd2hhdCB3YXMgZ2F0aGVyZWQgc28gZmFyIGFuZCBhIHJlYXNvblxuICogc3RyaW5nIGZvciB0aGUgU0RLX1VQTE9BRF9MT0dTIGV2ZW50LiBJdCBtdXN0IG5ldmVyIHRocm93IFx1MjAxNCBhIGRlYnVnIGFydGlmYWN0IGlzIG5ldmVyXG4gKiB3b3J0aCBmYWlsaW5nIGEgY3VzdG9tZXIncyB0ZXN0IHJ1biBvdmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdENvbmZpZ0ZpbGVzRm9yVXBsb2FkKGNvbmZpZz86IE9wdGlvbnMuVGVzdHJ1bm5lcik6IHsgZmlsZXM6IENhcHR1cmVkRmlsZVtdLCBmYWlsdXJlczogc3RyaW5nW10sIHN0cmF0ZWd5Pzogc3RyaW5nIH0ge1xuICAgIGNvbnN0IGZhaWx1cmVzOiBzdHJpbmdbXSA9IFtdXG4gICAgY29uc3QgZmlsZXM6IENhcHR1cmVkRmlsZVtdID0gW11cbiAgICBjb25zdCB0YWtlbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSBpbml0V2Rpb0NvbmZpZ1BhdGgoY29uZmlnKVxuICAgICAgICBpZiAoIXJlc29sdXRpb24uY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgZmFpbHVyZXMucHVzaChyZXNvbHV0aW9uLnJlYXNvbiB8fCAnY29uZmlnX25vdF9mb3VuZCcpXG4gICAgICAgICAgICByZXR1cm4geyBmaWxlcywgZmFpbHVyZXMgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBjb250ZW50LCByZWFzb24gfSA9IHJlYWRDYXBwZWRGaWxlKHJlc29sdXRpb24uY29uZmlnUGF0aClcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZmFpbHVyZXMucHVzaChyZWFzb24gfHwgJ2NvbmZpZ19yZWFkX2ZhaWxlZCcpXG4gICAgICAgICAgICByZXR1cm4geyBmaWxlcywgZmFpbHVyZXMsIHN0cmF0ZWd5OiByZXNvbHV0aW9uLnN0cmF0ZWd5IH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogZGVkdXBlRW50cnlOYW1lKHJlc29sdXRpb24uY29uZmlnUGF0aCwgdGFrZW5OYW1lcyksXG4gICAgICAgICAgICBzb3VyY2VQYXRoOiByZXNvbHV0aW9uLmNvbmZpZ1BhdGgsXG4gICAgICAgICAgICBjb250ZW50OiByZWRhY3RTZW5zaXRpdmVDb250ZW50KGNvbnRlbnQpXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgcmVtYWluaW5nID0gTUFYX0NBUFRVUkVEX0NPTkZJR19GSUxFUyAtIGZpbGVzLmxlbmd0aFxuICAgICAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgICAgICAgLy8gY29udGVudCBjb21lcyBiYWNrIGZyb20gdGhlIGRpc2NvdmVyeSBwYXNzIFx1MjAxNCByZS1yZWFkaW5nIGhlcmUgd291bGQgYmUgYSBzZWNvbmRcbiAgICAgICAgICAgIC8vIGRpc2sgcmVhZCBwZXIgZmlsZSBhbmQgY291bGQgYXJjaGl2ZSBkaWZmZXJlbnQgYnl0ZXMgdGhhbiB3ZXJlIHNjYW5uZWQuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGltcG9ydGVkIG9mIGNvbGxlY3RMb2NhbEltcG9ydHMocmVzb2x1dGlvbi5jb25maWdQYXRoLCBjb250ZW50LCByZW1haW5pbmcpKSB7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGRlZHVwZUVudHJ5TmFtZShpbXBvcnRlZC5maWxlUGF0aCwgdGFrZW5OYW1lcyksXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVBhdGg6IGltcG9ydGVkLmZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiByZWRhY3RTZW5zaXRpdmVDb250ZW50KGltcG9ydGVkLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGZpbGVzLCBmYWlsdXJlcywgc3RyYXRlZ3k6IHJlc29sdXRpb24uc3RyYXRlZ3kgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goYGNvbmZpZ19jYXB0dXJlX2V4Y2VwdGlvbjogJHsoZXJyb3IgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IFN0cmluZyhlcnJvcil9YClcbiAgICAgICAgcmV0dXJuIHsgZmlsZXMsIGZhaWx1cmVzIH1cbiAgICB9XG59XG5cbi8qKlxuICogV2FsayB1cCBmcm9tIGBzdGFydERpcmAgbG9va2luZyBmb3IgYGZpbGVOYW1lYCwgc3RvcHBpbmcgYXQgdGhlIGZpbGVzeXN0ZW0gcm9vdCBvclxuICogYWZ0ZXIgTUFYX1BBQ0tBR0VfSlNPTl9XQUxLX1VQIGxldmVscy5cbiAqL1xuY29uc3QgZmluZFVwd2FyZHMgPSAoc3RhcnREaXI6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgbGV0IGN1cnJlbnQgPSBzdGFydERpclxuICAgIGZvciAobGV0IGRlcHRoID0gMDsgZGVwdGggPD0gTUFYX1BBQ0tBR0VfSlNPTl9XQUxLX1VQOyBkZXB0aCsrKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGguam9pbihjdXJyZW50LCBmaWxlTmFtZSlcbiAgICAgICAgaWYgKGlzUmVhZGFibGVGaWxlKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoY3VycmVudClcbiAgICAgICAgaWYgKHBhcmVudCA9PT0gY3VycmVudCkge1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gcGFyZW50XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBgcGFja2FnZS5qc29uYCBmb3IgdGhlIHByb2plY3QgdGhlIGNvbmZpZyBiZWxvbmdzIHRvIFx1MjAxNCBmcmFtZXdvcmsgYW5kIHNlcnZpY2UgdmVyc2lvbnNcbiAqIGFyZSB0aGUgZmlyc3QgdGhpbmcgdHJpYWdlIG5lZWRzLCBhbmQgdGhlIGFyY2hpdmUgY2FycmllZCBuZWl0aGVyIGJlZm9yZS5cbiAqXG4gKiBXYWxrcyBVUCBmcm9tIHRoZSBjb25maWcncyBkaXJlY3RvcnksIGJlY2F1c2UgYGNvbmZpZ3Mvd2Rpby5jb25mLnRzYCAoYSB2ZXJ5IGNvbW1vblxuICogbGF5b3V0KSBwdXRzIHRoZSBtYW5pZmVzdCBvbmUgb3IgbW9yZSBsZXZlbHMgYWJvdmUgdGhlIGNvbmZpZywgbm90IGJlc2lkZSBpdC5cbiAqIEFyY2hpdmVkIHZlcmJhdGltOiBpdCBpcyBhIG1hbmlmZXN0LCBub3QgYSBzZWNyZXQgc3RvcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUGFja2FnZUpzb25Gb3JVcGxvYWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX0ZJTEVfUEFUSF1cbiAgICBjb25zdCBzdGFydERpcnMgPSBbY29uZmlnUGF0aCA/IHBhdGguZGlybmFtZShjb25maWdQYXRoKSA6IHVuZGVmaW5lZCwgcHJvY2Vzcy5jd2QoKV1cbiAgICAgICAgLmZpbHRlcigoZGlyKTogZGlyIGlzIHN0cmluZyA9PiBCb29sZWFuKGRpcikpXG5cbiAgICBmb3IgKGNvbnN0IGRpciBvZiBBcnJheS5mcm9tKG5ldyBTZXQoc3RhcnREaXJzKSkpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSBmaW5kVXB3YXJkcyhkaXIsICdwYWNrYWdlLmpzb24nKVxuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3VuZFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cbiIsICJpbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVTdGF0c092ZXJ2aWV3IH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBpc09iamVjdEVtcHR5IH0gZnJvbSAnLi4vdXRpbC5qcydcblxuaW50ZXJmYWNlIEZlYXR1cmVTdGF0c01hcCB7XG4gICAgW2dyb3VwSWQ6IHN0cmluZ106IEZlYXR1cmVTdGF0cztcbn1cblxuaW50ZXJmYWNlIEpTT05Db252ZXJzaW9uU2V0dGluZ3Mge1xuICAgIG9taXRHcm91cHM/OiBib29sZWFuXG4gICAgb25seUdyb3Vwcz86IGJvb2xlYW5cbiAgICBuZXN0ZWRHcm91cHM/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZSB7XG4gICAgdHJpZ2dlcmVkQ291bnQ6IG51bWJlclxuICAgIHNlbnRDb3VudDogbnVtYmVyXG4gICAgZmFpbGVkQ291bnQ6IG51bWJlclxuICAgIGdyb3VwczogRmVhdHVyZVtdXG59XG5cbmNsYXNzIEZlYXR1cmVTdGF0cyB7XG4gICAgcHJpdmF0ZSB0cmlnZ2VyZWRDb3VudDogbnVtYmVyID0gMFxuICAgIHByaXZhdGUgc2VudENvdW50OiBudW1iZXIgPSAwXG4gICAgcHJpdmF0ZSBmYWlsZWRDb3VudDogbnVtYmVyID0gMFxuICAgIHByaXZhdGUgZ3JvdXBzOiBGZWF0dXJlU3RhdHNNYXAgPSB7fVxuXG4gICAgcHVibGljIG1hcmsoc3RhdHVzOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgICBjYXNlICd0cmlnZ2VyZWQnOlxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyZWQoZ3JvdXBJZClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3N1Y2Nlc3MnOlxuICAgICAgICBjYXNlICdzZW50JzpcbiAgICAgICAgICAgIHRoaXMuc2VudChncm91cElkKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkKGdyb3VwSWQpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdSZXF1ZXN0IHRvIG1hcmsgdXNhZ2UgZm9yIHVua25vd24gc3RhdHVzIC0gJyArIHN0YXR1cylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlcmVkKGdyb3VwSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyZWRDb3VudCArPSAxXG4gICAgICAgIGlmIChncm91cElkKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUdyb3VwKGdyb3VwSWQpLnRyaWdnZXJlZCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2VudChncm91cElkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VudENvdW50ICs9IDFcbiAgICAgICAgaWYgKGdyb3VwSWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoZ3JvdXBJZCkuc2VudCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZmFpbGVkKGdyb3VwSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mYWlsZWRDb3VudCArPSAxXG4gICAgICAgIGlmIChncm91cElkKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUdyb3VwKGdyb3VwSWQpLmZhaWxlZCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3VjY2Vzcyhncm91cElkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VudChncm91cElkKVxuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVHcm91cChncm91cElkOiBzdHJpbmcpOiBGZWF0dXJlU3RhdHMge1xuICAgICAgICBpZiAoIXRoaXMuZ3JvdXBzW2dyb3VwSWRdKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3Vwc1tncm91cElkXSA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwc1tncm91cElkXVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUcmlnZ2VyZWRDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50cmlnZ2VyZWRDb3VudFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZW50Q291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VudENvdW50XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZhaWxlZENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmZhaWxlZENvdW50XG4gICAgfVxuXG4gICAgcHVibGljIGdldFVzYWdlRm9yR3JvdXAoZ3JvdXBJZDogc3RyaW5nKTogRmVhdHVyZVN0YXRzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzW2dyb3VwSWRdIHx8IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPdmVydmlldygpOiBGZWF0dXJlU3RhdHNPdmVydmlldyB7XG4gICAgICAgIHJldHVybiB7IHRyaWdnZXJlZENvdW50OiB0aGlzLnRyaWdnZXJlZENvdW50LCBzZW50Q291bnQ6IHRoaXMuc2VudENvdW50LCBmYWlsZWRDb3VudDogdGhpcy5mYWlsZWRDb3VudCB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEdyb3VwcygpOiBGZWF0dXJlU3RhdHNNYXAge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKGZlYXR1cmVTdGF0czogRmVhdHVyZVN0YXRzKTogdm9pZCB7XG4gICAgICAgIHRoaXMudHJpZ2dlcmVkQ291bnQgKz0gZmVhdHVyZVN0YXRzLmdldFRyaWdnZXJlZENvdW50KClcbiAgICAgICAgdGhpcy5zZW50Q291bnQgKz0gZmVhdHVyZVN0YXRzLmdldFNlbnRDb3VudCgpXG4gICAgICAgIHRoaXMuZmFpbGVkQ291bnQgKz0gZmVhdHVyZVN0YXRzLmdldEZhaWxlZENvdW50KClcblxuICAgICAgICBPYmplY3QuZW50cmllcyhmZWF0dXJlU3RhdHMuZ2V0R3JvdXBzKCkpLmZvckVhY2goKFtncm91cElkLCBncm91cF0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoZ3JvdXBJZCkuYWRkKGdyb3VwKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8vIG9taXRHcm91cHM6IHRydWUvZmFsc2UgLT4gSW5jbHVkZSBncm91cHMgb3Igbm90XG4gICAgLy8gb25seUdyb3VwczogdHJ1ZS9mYWxzZSAtPiBkYXRhIGluY2x1ZGVzIG9ubHkgZ3JvdXBzXG4gICAgLy8gbmVzdGVkR3JvdXBzOiB0cnVlL2ZhbHNlIC0+IGdyb3VwcyB3aWxsIGJlIG5lc3RlZCBpbiBncm91cHMgaWYgdHJ1ZVxuICAgIHB1YmxpYyB0b0pTT04oY29uZmlnOiBKU09OQ29udmVyc2lvblNldHRpbmdzID0ge30pIHtcbiAgICAgICAgY29uc3Qgb3ZlcnZpZXdEYXRhOiBGZWF0dXJlU3RhdHNPdmVydmlld3xSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSAhY29uZmlnLm9ubHlHcm91cHMgPyB7XG4gICAgICAgICAgICB0cmlnZ2VyZWRDb3VudDogdGhpcy50cmlnZ2VyZWRDb3VudCxcbiAgICAgICAgICAgIHNlbnRDb3VudDogdGhpcy5zZW50Q291bnQsXG4gICAgICAgICAgICBmYWlsZWRDb3VudDogdGhpcy5mYWlsZWRDb3VudFxuICAgICAgICB9IDoge31cblxuICAgICAgICBjb25zdCBncm91cHNEYXRhOiBSZWNvcmQ8c3RyaW5nLCBGZWF0dXJlU3RhdHNPdmVydmlldz4gPSB7fVxuICAgICAgICBpZiAoIWNvbmZpZy5vbWl0R3JvdXBzKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmdyb3VwcykuZm9yRWFjaCgoW2dyb3VwSWQsIGdyb3VwXSkgPT4ge1xuICAgICAgICAgICAgICAgIGdyb3Vwc0RhdGFbZ3JvdXBJZF0gPSAoZ3JvdXAudG9KU09OKCkgYXMgRmVhdHVyZVN0YXRzT3ZlcnZpZXcpIC8vIEN1cnJlbnRseSBOZXN0ZWQgZ3JvdXBzIGFyZSBvbmx5IG92ZXJ2aWV3c1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBncm91cCA9IGNvbmZpZy5uZXN0ZWRHcm91cHMgPyB7IGdyb3VwczogZ3JvdXBzRGF0YSB9IDogZ3JvdXBzRGF0YVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5vdmVydmlld0RhdGEsXG4gICAgICAgICAgICAuLi5ncm91cFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSlNPTihqc29uOiBGZWF0dXJlKTogRmVhdHVyZVN0YXRzIHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcblxuICAgICAgICBpZiAoIWpzb24gfHwgaXNPYmplY3RFbXB0eShqc29uKSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRzXG4gICAgICAgIH1cbiAgICAgICAgc3RhdHMudHJpZ2dlcmVkQ291bnQgPSBqc29uLnRyaWdnZXJlZENvdW50XG4gICAgICAgIHN0YXRzLnNlbnRDb3VudCA9IGpzb24uc2VudENvdW50XG4gICAgICAgIHN0YXRzLmZhaWxlZENvdW50ID0ganNvbi5mYWlsZWRDb3VudFxuXG4gICAgICAgIGlmICghanNvbi5ncm91cHMpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0c1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGpzb24uZ3JvdXBzKS5mb3JFYWNoKChbZ3JvdXBJZCwgZ3JvdXBdKSA9PiB7XG4gICAgICAgICAgICBzdGF0cy5ncm91cHNbZ3JvdXBJZF0gPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZ3JvdXApXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBzdGF0c1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmVhdHVyZVN0YXRzXG4iLCAiaW1wb3J0IHsgZ2V0RXJyb3JTdHJpbmcgfSBmcm9tICcuLi91dGlsLmpzJ1xuXG5jbGFzcyBGZWF0dXJlVXNhZ2Uge1xuICAgIHByaXZhdGUgaXNUcmlnZ2VyZWQ/OiBib29sZWFuXG4gICAgcHJpdmF0ZSBzdGF0dXM/OiBzdHJpbmdcbiAgICBwcml2YXRlIGVycm9yPzogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3Rvcihpc1RyaWdnZXJlZD86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGlzVHJpZ2dlcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNUcmlnZ2VyZWQgPSBpc1RyaWdnZXJlZFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRyaWdnZXJlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNUcmlnZ2VyZWRcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VHJpZ2dlcmVkKHRyaWdnZXJlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmlzVHJpZ2dlcmVkID0gdHJpZ2dlcmVkXG4gICAgfVxuXG4gICAgcHVibGljIHNldFN0YXR1cyhzdGF0dXM6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1c1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFcnJvcihlcnJvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyB0cmlnZ2VyZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNUcmlnZ2VyZWQgPSB0cnVlXG4gICAgfVxuXG4gICAgcHVibGljIGZhaWxlZChlOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgdGhpcy5lcnJvciA9IGdldEVycm9yU3RyaW5nKGUpXG4gICAgfVxuXG4gICAgcHVibGljIHN1Y2Nlc3MoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ3N1Y2Nlc3MnXG4gICAgfVxuXG4gICAgcHVibGljIGdldFN0YXR1cygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXNcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RXJyb3IoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXNUcmlnZ2VyZWQ6IHRoaXMuaXNUcmlnZ2VyZWQsXG4gICAgICAgICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgICAgICAgICAgZXJyb3I6IHRoaXMuZXJyb3JcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmVhdHVyZVVzYWdlXG4iLCAiY2xhc3MgVGVzdE9wc0NvbmZpZyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBUZXN0T3BzQ29uZmlnXG4gICAgcHVibGljIGJ1aWxkU3RvcHBlZDogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGJ1aWxkSGFzaGVkSWQ/OiBzdHJpbmdcblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXNzaW5nIGFyZ3MgdG8gY29uc3RydWN0b3JcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IFRlc3RPcHNDb25maWcoLi4uYXJncylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2VcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBwdWJsaWMgbWFudWFsbHlTZXQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICApe1xuICAgICAgICBUZXN0T3BzQ29uZmlnLl9pbnN0YW5jZSA9IHRoaXNcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRlc3RPcHNDb25maWdcbiIsICJpbXBvcnQgRmVhdHVyZVN0YXRzLCB7IHR5cGUgRmVhdHVyZSB9IGZyb20gJy4vZmVhdHVyZVN0YXRzLmpzJ1xuaW1wb3J0IEZlYXR1cmVVc2FnZSBmcm9tICcuL2ZlYXR1cmVVc2FnZS5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCBUZXN0T3BzQ29uZmlnIGZyb20gJy4vdGVzdE9wc0NvbmZpZy5qcydcbmltcG9ydCB0eXBlIHsgVE9Vc2FnZVN0YXRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNhZ2VTdGF0IHtcbiAgICB0ZXN0RXZlbnRzOiB7XG4gICAgICAgIHN0YXJ0ZWQ6IEZlYXR1cmVcbiAgICAgICAgZmluaXNoZWQ6IEZlYXR1cmVcbiAgICB9XG4gICAgaG9va0V2ZW50czoge1xuICAgICAgICBzdGFydGVkOiBGZWF0dXJlXG4gICAgICAgIGZpbmlzaGVkOiBGZWF0dXJlXG4gICAgfVxuICAgIGxvZ0V2ZW50czogRmVhdHVyZVxuICAgIGNidFNlc3Npb25FdmVudHM6IEZlYXR1cmVcbiAgICBjYnRTZXNzaW9uU3RhdHM6IEZlYXR1cmVcbn1cblxuY2xhc3MgVXNhZ2VTdGF0cyB7XG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZTogVXNhZ2VTdGF0c1xuICAgIHB1YmxpYyB0ZXN0U3RhcnRlZFN0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgdGVzdEZpbmlzaGVkU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyBob29rU3RhcnRlZFN0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgaG9va0ZpbmlzaGVkU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyBjYnRTZXNzaW9uU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyBsb2dTdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIGxhdW5jaEJ1aWxkVXNhZ2U6IEZlYXR1cmVVc2FnZVxuICAgIHB1YmxpYyBzdG9wQnVpbGRVc2FnZTogRmVhdHVyZVVzYWdlXG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IFVzYWdlU3RhdHMge1xuICAgICAgICBpZiAoIVVzYWdlU3RhdHMuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIFVzYWdlU3RhdHMuaW5zdGFuY2UgPSBuZXcgVXNhZ2VTdGF0cygpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFVzYWdlU3RhdHMuaW5zdGFuY2VcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy50ZXN0U3RhcnRlZFN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMudGVzdEZpbmlzaGVkU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy5ob29rU3RhcnRlZFN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMuaG9va0ZpbmlzaGVkU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy5jYnRTZXNzaW9uU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy5sb2dTdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLmxhdW5jaEJ1aWxkVXNhZ2UgPSBuZXcgRmVhdHVyZVVzYWdlKClcbiAgICAgICAgdGhpcy5zdG9wQnVpbGRVc2FnZSA9IG5ldyBGZWF0dXJlVXNhZ2UoKVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGQodXNhZ2VTdGF0czogVXNhZ2VTdGF0cyk6IHZvaWQge1xuICAgICAgICB0aGlzLnRlc3RTdGFydGVkU3RhdHMuYWRkKHVzYWdlU3RhdHMudGVzdFN0YXJ0ZWRTdGF0cylcbiAgICAgICAgdGhpcy50ZXN0RmluaXNoZWRTdGF0cy5hZGQodXNhZ2VTdGF0cy50ZXN0RmluaXNoZWRTdGF0cylcbiAgICAgICAgdGhpcy5ob29rU3RhcnRlZFN0YXRzLmFkZCh1c2FnZVN0YXRzLmhvb2tTdGFydGVkU3RhdHMpXG4gICAgICAgIHRoaXMuaG9va0ZpbmlzaGVkU3RhdHMuYWRkKHVzYWdlU3RhdHMuaG9va0ZpbmlzaGVkU3RhdHMpXG4gICAgICAgIHRoaXMuY2J0U2Vzc2lvblN0YXRzLmFkZCh1c2FnZVN0YXRzLmNidFNlc3Npb25TdGF0cylcbiAgICAgICAgdGhpcy5sb2dTdGF0cy5hZGQodXNhZ2VTdGF0cy5sb2dTdGF0cylcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Rm9ybWF0dGVkRGF0YSh3b3JrZXJzRGF0YTogeyB1c2FnZVN0YXRzOiBVc2FnZVN0YXQgfVtdKSB7XG4gICAgICAgIHRoaXMuYWRkRGF0YUZyb21Xb3JrZXJzKHdvcmtlcnNEYXRhKVxuICAgICAgICBjb25zdCB0ZXN0T3BzQ29uZmlnID0gVGVzdE9wc0NvbmZpZy5nZXRJbnN0YW5jZSgpXG4gICAgICAgIGNvbnN0IHVzYWdlOiBUT1VzYWdlU3RhdHMgPSB7XG4gICAgICAgICAgICBlbmFibGVkOiB0ZXN0T3BzQ29uZmlnLmVuYWJsZWQsXG4gICAgICAgICAgICBtYW51YWxseVNldDogdGVzdE9wc0NvbmZpZy5tYW51YWxseVNldCxcbiAgICAgICAgICAgIGJ1aWxkSGFzaGVkSWQ6IHRlc3RPcHNDb25maWcuYnVpbGRIYXNoZWRJZFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF1c2FnZS5lbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdXNhZ2VcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB1c2FnZS5ldmVudHMgPSB0aGlzLmdldEV2ZW50c0RhdGEoKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ2V4Y2VwdGlvbiBpbiBnZXRGb3JtYXR0ZWREYXRhOiAnICsgZSlcblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1c2FnZVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGREYXRhRnJvbVdvcmtlcnMod29ya2Vyc0RhdGE6IHsgdXNhZ2VTdGF0czogVXNhZ2VTdGF0IH1bXSkge1xuICAgICAgICB3b3JrZXJzRGF0YS5tYXAod29ya2VyRGF0YSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzYWdlU3RhdHNGb3JXb3JrZXIgPSBVc2FnZVN0YXRzLmZyb21KU09OKHdvcmtlckRhdGEudXNhZ2VTdGF0cylcbiAgICAgICAgICAgICAgICB0aGlzLmFkZCh1c2FnZVN0YXRzRm9yV29ya2VyKVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRXhjZXB0aW9uIGluIGFkZGluZyB3b3JrZXJEYXRhOiAnICsgZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RXZlbnRzRGF0YSgpe1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYnVpbGRFdmVudHM6IHtcbiAgICAgICAgICAgICAgICBzdGFydGVkOiB0aGlzLmxhdW5jaEJ1aWxkVXNhZ2UudG9KU09OKCksXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMuc3RvcEJ1aWxkVXNhZ2UudG9KU09OKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZXN0RXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRlZDogdGhpcy50ZXN0U3RhcnRlZFN0YXRzLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0aGlzLnRlc3RGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG9taXRHcm91cHM6IHRydWUgfSksXG4gICAgICAgICAgICAgICAgLi4udGhpcy50ZXN0RmluaXNoZWRTdGF0cy50b0pTT04oeyBvbmx5R3JvdXBzOiB0cnVlIH0pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaG9va0V2ZW50czoge1xuICAgICAgICAgICAgICAgIHN0YXJ0ZWQ6IHRoaXMuaG9va1N0YXJ0ZWRTdGF0cy50b0pTT04oKSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZDogdGhpcy5ob29rRmluaXNoZWRTdGF0cy50b0pTT04oeyBvbWl0R3JvdXBzOiB0cnVlIH0pLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuaG9va0ZpbmlzaGVkU3RhdHMudG9KU09OKHsgb25seUdyb3VwczogdHJ1ZSB9KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvZ0V2ZW50czogdGhpcy5sb2dTdGF0cy50b0pTT04oKSxcbiAgICAgICAgICAgIGNidFNlc3Npb25FdmVudHM6IHRoaXMuY2J0U2Vzc2lvblN0YXRzLnRvSlNPTigpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGF0YVRvU2F2ZSgpe1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGVzdEV2ZW50czoge1xuICAgICAgICAgICAgICAgIHN0YXJ0ZWQ6IHRoaXMudGVzdFN0YXJ0ZWRTdGF0cy50b0pTT04oKSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZDogdGhpcy50ZXN0RmluaXNoZWRTdGF0cy50b0pTT04oeyBuZXN0ZWRHcm91cHM6IHRydWUgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaG9va0V2ZW50czoge1xuICAgICAgICAgICAgICAgIHN0YXJ0ZWQ6IHRoaXMuaG9va1N0YXJ0ZWRTdGF0cy50b0pTT04oKSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZDogdGhpcy5ob29rRmluaXNoZWRTdGF0cy50b0pTT04oeyBuZXN0ZWRHcm91cHM6IHRydWUgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbG9nRXZlbnRzOiB0aGlzLmxvZ1N0YXRzLnRvSlNPTih7IG5lc3RlZEdyb3VwczogdHJ1ZSB9KSxcbiAgICAgICAgICAgIGNidFNlc3Npb25FdmVudHM6IHRoaXMuY2J0U2Vzc2lvblN0YXRzLnRvSlNPTigpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21KU09OKGRhdGE6IFVzYWdlU3RhdCkge1xuICAgICAgICBjb25zdCB1c2FnZVN0YXRzID0gbmV3IFVzYWdlU3RhdHMoKVxuICAgICAgICB1c2FnZVN0YXRzLnRlc3RTdGFydGVkU3RhdHMgPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZGF0YS50ZXN0RXZlbnRzLnN0YXJ0ZWQpXG4gICAgICAgIHVzYWdlU3RhdHMudGVzdEZpbmlzaGVkU3RhdHMgPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZGF0YS50ZXN0RXZlbnRzLmZpbmlzaGVkKVxuICAgICAgICB1c2FnZVN0YXRzLmhvb2tTdGFydGVkU3RhdHMgPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZGF0YS5ob29rRXZlbnRzLnN0YXJ0ZWQpXG4gICAgICAgIHVzYWdlU3RhdHMuaG9va0ZpbmlzaGVkU3RhdHMgPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZGF0YS5ob29rRXZlbnRzLmZpbmlzaGVkKVxuICAgICAgICB1c2FnZVN0YXRzLmxvZ1N0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEubG9nRXZlbnRzKVxuICAgICAgICB1c2FnZVN0YXRzLmNidFNlc3Npb25TdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLmNidFNlc3Npb25TdGF0cylcbiAgICAgICAgcmV0dXJuIHVzYWdlU3RhdHNcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVzYWdlU3RhdHNcbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJ1xuXG5pbnRlcmZhY2UgU2NyaXB0cyB7XG4gICAgc2Nhbjogc3RyaW5nXG4gICAgZ2V0UmVzdWx0czogc3RyaW5nXG4gICAgZ2V0UmVzdWx0c1N1bW1hcnk6IHN0cmluZ1xuICAgIHNhdmVSZXN1bHRzOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIENvbW1hbmQge1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGNsYXNzOiBzdHJpbmdcbn1cblxuY2xhc3MgQWNjZXNzaWJpbGl0eVNjcmlwdHMge1xuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBBY2Nlc3NpYmlsaXR5U2NyaXB0cyB8IG51bGwgPSBudWxsXG5cbiAgICBwdWJsaWMgcGVyZm9ybVNjYW46IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIGdldFJlc3VsdHM6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIGdldFJlc3VsdHNTdW1tYXJ5OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBzYXZlVGVzdFJlc3VsdHM6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIGNvbW1hbmRzVG9XcmFwOiBBcnJheTxDb21tYW5kPiB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIENocm9tZUV4dGVuc2lvbjogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7fVxuXG4gICAgcHVibGljIGJyb3dzZXJzdGFja0ZvbGRlclBhdGggPSAnJ1xuICAgIHB1YmxpYyBjb21tYW5kc1BhdGggPSAnJ1xuXG4gICAgLy8gZG9uJ3QgYWxsb3cgdG8gY3JlYXRlIGluc3RhbmNlcyBmcm9tIGl0IG90aGVyIHRoYW4gdGhyb3VnaCBgY2hlY2tBbmRHZXRJbnN0YW5jZWBcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJyb3dzZXJzdGFja0ZvbGRlclBhdGggPSB0aGlzLmdldFdyaXRhYmxlRGlyKClcbiAgICAgICAgdGhpcy5jb21tYW5kc1BhdGggPSBwYXRoLmpvaW4odGhpcy5icm93c2Vyc3RhY2tGb2xkZXJQYXRoLCAnY29tbWFuZHMuanNvbicpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjaGVja0FuZEdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIUFjY2Vzc2liaWxpdHlTY3JpcHRzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5pbnN0YW5jZSA9IG5ldyBBY2Nlc3NpYmlsaXR5U2NyaXB0cygpXG4gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5pbnN0YW5jZS5yZWFkRnJvbUV4aXN0aW5nRmlsZSgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmluc3RhbmNlXG4gICAgfVxuXG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4gICAgcHVibGljIGdldFdyaXRhYmxlRGlyKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG9yZGVyZWRQYXRocyA9IFtcbiAgICAgICAgICAgIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuYnJvd3NlcnN0YWNrJyksXG4gICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgb3MudG1wZGlyKClcbiAgICAgICAgXVxuICAgICAgICBmb3IgKGNvbnN0IG9yZGVyZWRQYXRoIG9mIG9yZGVyZWRQYXRocykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhvcmRlcmVkUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZnMuYWNjZXNzU3luYyhvcmRlcmVkUGF0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yZGVyZWRQYXRoXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnMubWtkaXJTeW5jKG9yZGVyZWRQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmRlcmVkUGF0aFxuXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8qIG5vLWVtcHR5ICovXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGcm9tRXhpc3RpbmdGaWxlKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5jb21tYW5kc1BhdGgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLmNvbW1hbmRzUGF0aCwgJ3V0ZjgnKVxuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKEpTT04ucGFyc2UoZGF0YSkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIERvIG5vdGhpbmcgKi9cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGUoZGF0YTogeyBjb21tYW5kczogW10sIHNjcmlwdHM6IFNjcmlwdHMsIG5vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnM6IHt9IH0pIHtcbiAgICAgICAgaWYgKGRhdGEuc2NyaXB0cykge1xuICAgICAgICAgICAgdGhpcy5wZXJmb3JtU2NhbiA9IGRhdGEuc2NyaXB0cy5zY2FuXG4gICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMgPSBkYXRhLnNjcmlwdHMuZ2V0UmVzdWx0c1xuICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzU3VtbWFyeSA9IGRhdGEuc2NyaXB0cy5nZXRSZXN1bHRzU3VtbWFyeVxuICAgICAgICAgICAgdGhpcy5zYXZlVGVzdFJlc3VsdHMgPSBkYXRhLnNjcmlwdHMuc2F2ZVJlc3VsdHNcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5jb21tYW5kcyAmJiBkYXRhLmNvbW1hbmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jb21tYW5kc1RvV3JhcCA9IGRhdGEuY29tbWFuZHNcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5ub25CU3RhY2tJbmZyYUExMXlDaHJvbWVPcHRpb25zKXtcbiAgICAgICAgICAgIHRoaXMuQ2hyb21lRXh0ZW5zaW9uID0gZGF0YS5ub25CU3RhY2tJbmZyYUExMXlDaHJvbWVPcHRpb25zXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHB1YmxpYyBzdG9yZSgpIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuYnJvd3NlcnN0YWNrRm9sZGVyUGF0aCkpe1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuYnJvd3NlcnN0YWNrRm9sZGVyUGF0aClcbiAgICAgICAgfVxuXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5jb21tYW5kc1BhdGgsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGNvbW1hbmRzOiB0aGlzLmNvbW1hbmRzVG9XcmFwLFxuICAgICAgICAgICAgc2NyaXB0czoge1xuICAgICAgICAgICAgICAgIHNjYW46IHRoaXMucGVyZm9ybVNjYW4sXG4gICAgICAgICAgICAgICAgZ2V0UmVzdWx0czogdGhpcy5nZXRSZXN1bHRzLFxuICAgICAgICAgICAgICAgIGdldFJlc3VsdHNTdW1tYXJ5OiB0aGlzLmdldFJlc3VsdHNTdW1tYXJ5LFxuICAgICAgICAgICAgICAgIHNhdmVSZXN1bHRzOiB0aGlzLnNhdmVUZXN0UmVzdWx0cyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBub25CU3RhY2tJbmZyYUExMXlDaHJvbWVPcHRpb25zOiB0aGlzLkNocm9tZUV4dGVuc2lvbixcbiAgICAgICAgfSkpXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5jaGVja0FuZEdldEluc3RhbmNlKClcbmV4cG9ydCB7IENvbW1hbmQgfVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuXG5pbXBvcnQgdHlwZSB7IFRlc3REYXRhLCBVcGxvYWRUeXBlIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBiYXRjaEFuZFBvc3RFdmVudHMgfSBmcm9tICcuLi91dGlsLmpzJ1xuaW1wb3J0IHsgREFUQV9CQVRDSF9FTkRQT0lOVCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcblxuLyoqXG4gKiBDcmFzaC1yZXNpbGllbnQgam91cm5hbCBvZiB0ZXN0IGFuZCBob29rIHJ1bnMgdGhhdCBoYXZlIHNlbnQgVGVzdFJ1blN0YXJ0ZWQgL1xuICogSG9va1J1blN0YXJ0ZWQgYnV0IG5vdCB5ZXQgdGhlIG1hdGNoaW5nIGZpbmlzaC4gRWFjaCBvcGVuIHJ1biBpcyBwZXJzaXN0ZWQgYXMgYSBzbWFsbFxuICogZmlsZSBzbyB0aGF0IGlmIHRoZSB3b3JrZXIgKG9yIHRoZSB3aG9sZSB3ZGlvIHByb2Nlc3MgdHJlZSkgaXMga2lsbGVkIG1pZC10ZXN0IG9yXG4gKiBtaWQtaG9vaywgdGhlIGxhdW5jaGVyJ3Mgc2h1dGRvd24gcGF0aCBvciB0aGUgZGV0YWNoZWQgZXhpdCBjbGVhbnVwIGNhbiBzdGlsbCBzZW5kIGFcbiAqIHN5bnRoZXRpYyBUZXN0UnVuRmluaXNoZWQgLyBIb29rUnVuRmluaXNoZWQgXHUyMDE0IG90aGVyd2lzZSB0aGUgZW50aXR5IHN0YXlzIFwiaW4gcHJvZ3Jlc3NcIlxuICogb24gdGhlIFRlc3QgUmVwb3J0aW5nICYgQW5hbHl0aWNzIGRhc2hib2FyZCB1bnRpbCB0aGUgYmFja2VuZCB3YXRjaGRvZyB0aW1lcyBpdCBvdXQsXG4gKiBpbmZsYXRpbmcgdGhlIHJlcG9ydGVkIGJ1aWxkIGR1cmF0aW9uIChTREstNzE2NzogYW4gb3JwaGFuZWQgQUZURVJfRUFDSCBjdWN1bWJlciBob29rXG4gKiBhZGRlZCBpdHMgMmggaG9vayB0aW1lb3V0IHRvIHRoZSBidWlsZCdzIGR1cmF0aW9uIG9uIHRoZSBuZXcgZGFzaGJvYXJkKS5cbiAqL1xuXG5jb25zdCBPUEVOX1JVTlNfRElSID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdsb2dzJywgJ2JzdGFja19vcGVuX3J1bnMnKVxuXG5leHBvcnQgY29uc3QgT1JQSEFOX0ZBSUxVUkVfUkVBU09OID0gJ1Rlc3QgcnVuIGRpZCBub3QgY29tcGxldGU6IHRoZSBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBvciB0ZXJtaW5hdGVkIGJlZm9yZSB0aGUgdGVzdCBmaW5pc2hlZCAoZmluYWxpemVkIGJ5IEJyb3dzZXJTdGFjayBTREsgZXhpdCBjbGVhbnVwKSdcblxuZnVuY3Rpb24gb3BlblJ1bkZpbGVQYXRoKHV1aWQ6IHN0cmluZykge1xuICAgIHJldHVybiBwYXRoLmpvaW4oT1BFTl9SVU5TX0RJUiwgYG9wZW4tcnVuLSR7dXVpZH0uanNvbmApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRPcGVuUnVuKHRlc3REYXRhOiBUZXN0RGF0YSkge1xuICAgIGlmICghdGVzdERhdGEgfHwgIXRlc3REYXRhLnV1aWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGZzLm1rZGlyU3luYyhPUEVOX1JVTlNfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG9wZW5SdW5GaWxlUGF0aCh0ZXN0RGF0YS51dWlkKSwgSlNPTi5zdHJpbmdpZnkodGVzdERhdGEpKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdvcGVuUnVuc0pvdXJuYWw6IGZhaWxlZCB0byByZWNvcmQgb3BlbiBydW46ICcgKyBlKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyT3BlblJ1bih1dWlkPzogc3RyaW5nKSB7XG4gICAgaWYgKCF1dWlkKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBmcy5ybVN5bmMob3BlblJ1bkZpbGVQYXRoKHV1aWQpLCB7IGZvcmNlOiB0cnVlIH0pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ29wZW5SdW5zSm91cm5hbDogZmFpbGVkIHRvIGNsZWFyIG9wZW4gcnVuOiAnICsgZSlcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0T3JwaGFuZWRSdW5zKCk6IFRlc3REYXRhW10ge1xuICAgIGNvbnN0IG9ycGhhbnM6IFRlc3REYXRhW10gPSBbXVxuICAgIHRyeSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhPUEVOX1JVTlNfRElSKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9ycGhhbnNcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoT1BFTl9SVU5TX0RJUikpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgb3JwaGFucy5wdXNoKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihPUEVOX1JVTlNfRElSLCBmaWxlKSwgJ3V0ZjgnKSkpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBvcGVuUnVuc0pvdXJuYWw6IHNraXBwaW5nIHVucmVhZGFibGUgam91cm5hbCBmaWxlICR7ZmlsZX06ICR7ZX1gKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhPUEVOX1JVTlNfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1Zygnb3BlblJ1bnNKb3VybmFsOiBmYWlsZWQgdG8gY29sbGVjdCBvcnBoYW5lZCBydW5zOiAnICsgZSlcbiAgICB9XG4gICAgcmV0dXJuIG9ycGhhbnNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmFsaXplT3JwaGFuZWRSdW5zKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3JwaGFucyA9IGNvbGxlY3RPcnBoYW5lZFJ1bnMoKVxuICAgICAgICBpZiAoIW9ycGhhbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgY29uc3QgZXZlbnRzOiBVcGxvYWRUeXBlW10gPSBvcnBoYW5zLm1hcCgocnVuRGF0YSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRlZEF0TXMgPSBydW5EYXRhLnN0YXJ0ZWRfYXQgPyBuZXcgRGF0ZShydW5EYXRhLnN0YXJ0ZWRfYXQpLmdldFRpbWUoKSA6IE5hTlxuICAgICAgICAgICAgY29uc3QgZmluaXNoZWRSdW4gPSB7XG4gICAgICAgICAgICAgICAgLi4ucnVuRGF0YSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZF9hdDogZmluaXNoZWRBdCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uX2luX21zOiBOdW1iZXIuaXNOYU4oc3RhcnRlZEF0TXMpID8gdW5kZWZpbmVkIDogTWF0aC5tYXgoMCwgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdE1zKSxcbiAgICAgICAgICAgICAgICBmYWlsdXJlOiBbeyBiYWNrdHJhY2U6IFtPUlBIQU5fRkFJTFVSRV9SRUFTT05dIH1dLFxuICAgICAgICAgICAgICAgIGZhaWx1cmVfcmVhc29uOiBPUlBIQU5fRkFJTFVSRV9SRUFTT04sXG4gICAgICAgICAgICAgICAgZmFpbHVyZV90eXBlOiAnVW5oYW5kbGVkRXJyb3InXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIb29rIHBheWxvYWRzIGNhcnJ5IHR5cGUgJ2hvb2snIChzYW1lIGRpc2NyaW1pbmF0b3IgdGhlIGxpc3RlbmVyIHVzZXMgdG8gcGlja1xuICAgICAgICAgICAgLy8gdGhlIGhvb2tfcnVuL3Rlc3RfcnVuIGVudmVsb3BlIGtleSkgXHUyMDE0IGZpbmFsaXplIHRoZW0gYXMgSG9va1J1bkZpbmlzaGVkIHNvIHRoZVxuICAgICAgICAgICAgLy8gYmFja2VuZCBjbG9zZXMgdGhlIGhvb2sgaW5zdGVhZCBvZiBkcm9wcGluZyBhbiB1bmtub3duIHRlc3RfcnVuIHV1aWQuXG4gICAgICAgICAgICBpZiAocnVuRGF0YS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBldmVudF90eXBlOiAnSG9va1J1bkZpbmlzaGVkJywgaG9va19ydW46IGZpbmlzaGVkUnVuIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGV2ZW50X3R5cGU6ICdUZXN0UnVuRmluaXNoZWQnLCB0ZXN0X3J1bjogZmluaXNoZWRSdW4gfVxuICAgICAgICB9KVxuICAgICAgICBhd2FpdCBiYXRjaEFuZFBvc3RFdmVudHMoREFUQV9CQVRDSF9FTkRQT0lOVCwgJ09SUEhBTkVEX1RFU1RfUlVOX0ZJTkFMSVpBVElPTicsIGV2ZW50cylcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oYEZpbmFsaXplZCAke2V2ZW50cy5sZW5ndGh9IG9ycGhhbmVkIHRlc3QvaG9vayBydW4ocykgbGVmdCBiZWhpbmQgYnkgYW4gaW50ZXJydXB0ZWQgcnVuYClcbiAgICAgICAgcmV0dXJuIGV2ZW50cy5sZW5ndGhcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1Zygnb3BlblJ1bnNKb3VybmFsOiBmYWlsZWQgdG8gZmluYWxpemUgb3JwaGFuZWQgcnVuczogJyArIGUpXG4gICAgICAgIHJldHVybiAwXG4gICAgfVxufVxuIiwgImltcG9ydCB7IGdldEVycm9yU3RyaW5nLCBzdG9wQnVpbGRVcHN0cmVhbSwgdXBsb2FkTG9ncyB9IGZyb20gJy4vdXRpbC5qcydcbmltcG9ydCB7IGZpbmFsaXplT3JwaGFuZWRSdW5zIH0gZnJvbSAnLi90ZXN0T3BzL29wZW5SdW5zSm91cm5hbC5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgdXRpbCBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBmaXJlRnVubmVsUmVxdWVzdCB9IGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL2Z1bm5lbEluc3RydW1lbnRhdGlvbi5qcydcbmltcG9ydCB7IEJST1dTRVJTVEFDS19URVNUSFVCX1VVSUQsIEJST1dTRVJTVEFDS19URVNUSFVCX0pXVCwgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFkgfSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCB0eXBlIHsgRnVubmVsRGF0YSB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgUGVyZm9ybWFuY2VUZXN0ZXIgZnJvbSAnLi9pbnN0cnVtZW50YXRpb24vcGVyZm9ybWFuY2UvcGVyZm9ybWFuY2UtdGVzdGVyLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCU3RhY2tDbGVhbnVwIHtcbiAgICBzdGF0aWMgYXN5bmMgc3RhcnRDbGVhbnVwKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gR2V0IGZ1bm5lbCBkYXRhIG9iamVjdCBmcm9tIHNhdmVkIGZpbGVcbiAgICAgICAgICAgIGNvbnN0IGZ1bm5lbERhdGFDbGVhbnVwID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWZ1bm5lbERhdGEnKVxuICAgICAgICAgICAgbGV0IGZ1bm5lbERhdGE6IEZ1bm5lbERhdGEgfCBudWxsID0gbnVsbFxuICAgICAgICAgICAgaWYgKGZ1bm5lbERhdGFDbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwcm9jZXNzLmFyZ3YuaW5kZXhPZignLS1mdW5uZWxEYXRhJylcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHByb2Nlc3MuYXJndltpbmRleCArIDFdXG4gICAgICAgICAgICAgICAgZnVubmVsRGF0YSA9IEJTdGFja0NsZWFudXAuZ2V0RnVubmVsRGF0YUZyb21GaWxlKGZpbGVQYXRoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU25hcHNob3QgYmVmb3JlIHNlbmRGdW5uZWxEYXRhIFx1MjAxNCBmaXJlRnVubmVsUmVxdWVzdCByZWRhY3RzIHRoZVxuICAgICAgICAgICAgLy8gY3JlZGVudGlhbHMgaW4gcGxhY2UuXG4gICAgICAgICAgICBjb25zdCBmdW5uZWxVc2VyID0gZnVubmVsRGF0YT8udXNlck5hbWVcbiAgICAgICAgICAgIGNvbnN0IGZ1bm5lbEtleSA9IGZ1bm5lbERhdGE/LmFjY2Vzc0tleVxuXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLW9ic2VydmFiaWxpdHknKSAmJiBmdW5uZWxEYXRhKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlT2JzZXJ2YWJpbGl0eUNsZWFudXAoZnVubmVsRGF0YSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZ1bm5lbERhdGFDbGVhbnVwICYmIGZ1bm5lbERhdGEpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRGdW5uZWxEYXRhKGZ1bm5lbERhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlc2N1ZSB0aGUgU0RLLWxvZyB1cGxvYWQgZm9yIHJ1bnMgd2hvc2UgbGF1bmNoZXIgbmV2ZXIgcmVhY2hlZFxuICAgICAgICAgICAgLy8gb25Db21wbGV0ZSAoc2lnbmFsIHRlcm1pbmF0aW9uKSBcdTIwMTQgYWZ0ZXIgZXZlbnRzLCBiZWZvcmUgZXhpdC5cbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tdXBsb2FkTG9ncycpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlTG9nc1VwbG9hZChmdW5uZWxVc2VyLCBmdW5uZWxLZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlcnIgYXMgc3RyaW5nXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1wZXJmb3JtYW5jZURhdGEnKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFBlcmZvcm1hbmNlVGVzdGVyLnVwbG9hZEV2ZW50c0RhdGEoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBpbiBzZW5kaW5nIGV2ZW50cyBkYXRhICR7dXRpbC5mb3JtYXQoZXIpfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgZXhlY3V0ZUxvZ3NVcGxvYWQoZnVubmVsVXNlcj86IHN0cmluZywgZnVubmVsS2V5Pzogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHByb2Nlc3MuYXJndi5pbmRleE9mKCctLXVwbG9hZExvZ3MnKVxuICAgICAgICAgICAgY29uc3QgY2xpZW50QnVpbGRVdWlkID0gcHJvY2Vzcy5hcmd2W2luZGV4ICsgMV1cbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBmdW5uZWxVc2VyIHx8IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19VU0VSTkFNRVxuICAgICAgICAgICAgY29uc3Qga2V5ID0gZnVubmVsS2V5IHx8IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BQ0NFU1NfS0VZXG4gICAgICAgICAgICBpZiAoIWNsaWVudEJ1aWxkVXVpZCB8fCAhdXNlciB8fCAha2V5KSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBsb2dzIHVwbG9hZCBpbiBjbGVhbnVwOiBtaXNzaW5nIHV1aWQgb3IgY3JlZGVudGlhbHMnKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBVcGxvYWRpbmcgU0RLIGxvZ3MgZnJvbSBjbGVhbnVwIGZvciAke2NsaWVudEJ1aWxkVXVpZH1gKVxuICAgICAgICAgICAgYXdhaXQgdXBsb2FkTG9ncyh1c2VyLCBrZXksIGNsaWVudEJ1aWxkVXVpZClcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdFcnJvciB1cGxvYWRpbmcgU0RLIGxvZ3MgaW4gY2xlYW51cDogJyArIGdldEVycm9yU3RyaW5nKGUpKVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBleGVjdXRlT2JzZXJ2YWJpbGl0eUNsZWFudXAoZnVubmVsRGF0YTogRnVubmVsRGF0YSkge1xuICAgICAgICBpZiAoIXByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX0pXVF0pIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRXhlY3V0aW5nIFRlc3QgUmVwb3J0aW5nIGFuZCBBbmFseXRpY3MgY2xlYW51cCcpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBTREstNDY3MTogZmluYWxpemUgYW55IHRlc3QgcnVucyBvcnBoYW5lZCBieSB0aGUgaW50ZXJydXB0ZWQgcHJvY2Vzc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBidWlsZCBpdHNlbGYgaXMgc3RvcHBlZC5cbiAgICAgICAgICAgIGF3YWl0IGZpbmFsaXplT3JwaGFuZWRSdW5zKClcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3BCdWlsZFVwc3RyZWFtKClcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFldKSAmJiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXSkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGBcXG5WaXNpdCBodHRwczovL2F1dG9tYXRpb24uYnJvd3NlcnN0YWNrLmNvbS9idWlsZHMvJHtwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXX0gdG8gdmlldyBidWlsZCByZXBvcnQsIGluc2lnaHRzLCBhbmQgbWFueSBtb3JlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhbGwgYXQgb25lIHBsYWNlIVxcbmApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSAocmVzdWx0ICYmIHJlc3VsdC5zdGF0dXMpIHx8ICdmYWlsZWQnXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gKHJlc3VsdCAmJiByZXN1bHQubWVzc2FnZSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTzExeVN0b3BEYXRhKGZ1bm5lbERhdGEsIHN0YXR1cywgc3RhdHVzID09PSAnZmFpbGVkJyA/IG1lc3NhZ2UgOiB1bmRlZmluZWQpXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignRXJyb3IgaW4gc3RvcHBpbmcgVGVzdCBSZXBvcnRpbmcgYW5kIEFuYWx5dGljcyBidWlsZDogJyArIGUpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU8xMXlTdG9wRGF0YShmdW5uZWxEYXRhLCAnZmFpbGVkJywgZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB1cGRhdGVPMTF5U3RvcERhdGEoZnVubmVsRGF0YTogRnVubmVsRGF0YSwgc3RhdHVzOiBzdHJpbmcsIGVycm9yOiB1bmtub3duID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHRvRGF0YSA9IGZ1bm5lbERhdGE/LmV2ZW50X3Byb3BlcnRpZXM/LnByb2R1Y3RVc2FnZT8udGVzdE9ic2VydmFiaWxpdHlcbiAgICAgICAgLy8gUmV0dXJuIGlmIG5vIFRlc3QgUmVwb3J0aW5nIGFuZCBBbmFseXRpY3MgZGF0YSBpbiBmdW5uZWwgZGF0YVxuICAgICAgICBpZiAoIXRvRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV4aXN0aW5nU3RvcERhdGEgPSB0b0RhdGEuZXZlbnRzLmJ1aWxkRXZlbnRzLmZpbmlzaGVkXG4gICAgICAgIGV4aXN0aW5nU3RvcERhdGEgPSBleGlzdGluZ1N0b3BEYXRhIHx8IHt9XG5cbiAgICAgICAgZXhpc3RpbmdTdG9wRGF0YSA9IHtcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nU3RvcERhdGEsXG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBlcnJvcjogZ2V0RXJyb3JTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgc3RvcHBlZEZyb206ICdleGl0SG9vaydcbiAgICAgICAgfVxuICAgICAgICB0b0RhdGEuZXZlbnRzLmJ1aWxkRXZlbnRzLmZpbmlzaGVkID0gZXhpc3RpbmdTdG9wRGF0YVxuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBzZW5kRnVubmVsRGF0YShmdW5uZWxEYXRhOiBGdW5uZWxEYXRhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmaXJlRnVubmVsUmVxdWVzdChmdW5uZWxEYXRhKVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdGdW5uZWwgZGF0YSBzZW50IHN1Y2Nlc3NmdWxseSBmcm9tIGNsZWFudXAnKVxuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0Vycm9yIGluIHNlbmRpbmcgZnVubmVsIGRhdGE6ICcgKyBlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEZ1bm5lbERhdGFGcm9tRmlsZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpXG5cbiAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoY29udGVudClcbiAgICAgICAgdGhpcy5yZW1vdmVGdW5uZWxEYXRhRmlsZShmaWxlUGF0aClcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVtb3ZlRnVubmVsRGF0YUZpbGUoZmlsZVBhdGg/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgZnMucm1TeW5jKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pXG4gICAgfVxufVxuXG52b2lkIEJTdGFja0NsZWFudXAuc3RhcnRDbGVhbnVwKClcbiIsICJpbXBvcnQgb3MgZnJvbSAnbm9kZTpvcydcbmltcG9ydCB1dGlsLCB7IGZvcm1hdCB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IFVzYWdlU3RhdHMsIHsgdHlwZSBVc2FnZVN0YXQgfSBmcm9tICcuLi90ZXN0T3BzL3VzYWdlU3RhdHMuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgdHlwZSBCcm93c2VyU3RhY2tDb25maWcgZnJvbSAnLi4vY29uZmlnLmpzJ1xuaW1wb3J0IHsgQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTiwgV0RJT19OQU1JTkdfUFJFRklYIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgZ2V0RGF0YUZyb21Xb3JrZXJzIH0gZnJvbSAnLi4vZGF0YS1zdG9yZS5qcydcbmltcG9ydCB7IGdldFByb2R1Y3RNYXAgfSBmcm9tICcuLi90ZXN0SHViL3V0aWxzLmpzJ1xuaW1wb3J0IGZldGNoV3JhcCBmcm9tICcuLi9mZXRjaFdyYXBwZXIuanMnXG5pbXBvcnQgdHlwZSB7IEJyb3dzZXJzdGFja0hlYWxpbmcgfSBmcm9tICdAYnJvd3NlcnN0YWNrL2FpLXNkay1ub2RlJ1xuaW1wb3J0IHR5cGUgeyBGdW5uZWxEYXRhLCBFdmVudFByb3BlcnRpZXMgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCBUZXN0T3BzQ29uZmlnIGZyb20gJy4uL3Rlc3RPcHMvdGVzdE9wc0NvbmZpZy5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuLi9jbGkvYXBpVXRpbHMuanMnXG5pbXBvcnQgUGVyZm9ybWFuY2VUZXN0ZXIgZnJvbSAnLi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgeyBFVkVOVFMgfSBmcm9tICcuL3BlcmZvcm1hbmNlL2NvbnN0YW50cy5qcydcblxuYXN5bmMgZnVuY3Rpb24gZmlyZUZ1bm5lbFRlc3RFdmVudChldmVudFR5cGU6IHN0cmluZywgY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzQ0xJRW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgaWYgKCFjb25maWcudXNlck5hbWUgfHwgIWNvbmZpZy5hY2Nlc3NLZXkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCd1c2VybmFtZS9hY2Nlc3NrZXkgbm90IHBhc3NlZCcpXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBidWlsZEV2ZW50RGF0YShldmVudFR5cGUsIGNvbmZpZywgaXNDTElFbmFibGVkKVxuICAgICAgICBhd2FpdCBmaXJlRnVubmVsUmVxdWVzdChkYXRhKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0Z1bm5lbCBldmVudCBzdWNjZXNzJylcbiAgICAgICAgLy8gT25seSB0aGUgZmluaXNoIGV2ZW50IGRpc2FybXMgdGhlIGV4aXQtdGltZSBjbGVhbnVwIHJlc2VuZCBcdTIwMTQgbWFya2luZyBpdFxuICAgICAgICAvLyBvbiBTREtUZXN0QXR0ZW1wdGVkIGxlZnQga2lsbGVkIHJ1bnMgd2l0aCBubyBTREtUZXN0U3VjY2Vzc2Z1bCBhdCBhbGwuXG4gICAgICAgIGlmIChldmVudFR5cGUgPT09ICdTREtUZXN0U3VjY2Vzc2Z1bCcpIHtcbiAgICAgICAgICAgIGNvbmZpZy5zZW50RnVubmVsRGF0YSgpXG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEV4Y2VwdGlvbiBpbiBzZW5kaW5nIGZ1bm5lbCBkYXRhOiAke2Zvcm1hdChlcnJvcil9YClcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kU3RhcnQoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpIHtcblxuICAgIC8vIFRyYWNrIGZ1bm5lbCB0ZXN0IGF0dGVtcHRlZCBldmVudFxuICAgIFBlcmZvcm1hbmNlVGVzdGVyLnN0YXJ0KEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfQVRURU1QVEVEKVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RBdHRlbXB0ZWQnLCBjb25maWcpXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX0FUVEVNUFRFRCwgdHJ1ZSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9BVFRFTVBURUQsIGZhbHNlLCBlcnJvcilcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kRmluaXNoKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc0NMSUVuYWJsZWQgPSBmYWxzZSkge1xuICAgIC8vIFRyYWNrIGZ1bm5lbCB0ZXN0IHN1Y2Nlc3NmdWwgZXZlbnRcbiAgICBQZXJmb3JtYW5jZVRlc3Rlci5zdGFydChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX1NVQ0NFU1NGVUwpXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZmlyZUZ1bm5lbFRlc3RFdmVudCgnU0RLVGVzdFN1Y2Nlc3NmdWwnLCBjb25maWcsIGlzQ0xJRW5hYmxlZClcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfU1VDQ0VTU0ZVTCwgdHJ1ZSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9TVUNDRVNTRlVMLCBmYWxzZSwgZXJyb3IpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZUZ1bm5lbERhdGEoZXZlbnRUeXBlOiBzdHJpbmcsIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc0NMSUVuYWJsZWQgPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0YSA9IGJ1aWxkRXZlbnREYXRhKGV2ZW50VHlwZSwgY29uZmlnLCBpc0NMSUVuYWJsZWQpXG5cbiAgICBCU3RhY2tMb2dnZXIuZW5zdXJlTG9nc0ZvbGRlcigpXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oQlN0YWNrTG9nZ2VyLmxvZ0ZvbGRlclBhdGgsICdmdW5uZWxEYXRhLmpzb24nKVxuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEpKVxuICAgIHJldHVybiBmaWxlUGF0aFxufVxuXG5mdW5jdGlvbiByZWRhY3RDcmVkZW50aWFsc0Zyb21GdW5uZWxEYXRhKGRhdGE6IEZ1bm5lbERhdGEpIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS51c2VyTmFtZSkge1xuICAgICAgICAgICAgZGF0YS51c2VyTmFtZSA9ICdbUkVEQUNURURdJ1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmFjY2Vzc0tleSkge1xuICAgICAgICAgICAgZGF0YS5hY2Nlc3NLZXkgPSAnW1JFREFDVEVEXSdcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxufVxuXG4vLyBDYWxsZWQgZnJvbSB0d28gZGlmZmVyZW50IHByb2Nlc3NcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXJlRnVubmVsUmVxdWVzdChkYXRhOiBGdW5uZWxEYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB1c2VyTmFtZSwgYWNjZXNzS2V5IH0gPSBkYXRhXG4gICAgcmVkYWN0Q3JlZGVudGlhbHNGcm9tRnVubmVsRGF0YShkYXRhKVxuXG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdTZW5kaW5nIFNESyBldmVudCB3aXRoIGRhdGEgJyArIHV0aWwuaW5zcGVjdChkYXRhLCB7IGRlcHRoOiA2IH0pKVxuXG4gICAgY29uc3QgZW5jb2RlZEF1dGggPSBCdWZmZXIuZnJvbShgJHt1c2VyTmFtZX06JHthY2Nlc3NLZXl9YCwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0JylcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoV3JhcChBUElVdGlscy5GVU5ORUxfSU5TVFJVTUVOVEFUSU9OX1VSTCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCYXNpYyAke2VuY29kZWRBdXRofWAsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gICAgfSlcbiAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0Z1bm5lbCBFdmVudCBSZXNwb25zZTogJyArIEpTT04uc3RyaW5naWZ5KGF3YWl0IHJlc3BvbnNlLnRleHQoKSkpXG59XG5cbmZ1bmN0aW9uIGdldFByb2R1Y3RMaXN0KGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSB7XG4gICAgY29uc3QgcHJvZHVjdHM6IHN0cmluZ1tdID0gW11cbiAgICBpZiAoY29uZmlnLnRlc3RPYnNlcnZhYmlsaXR5LmVuYWJsZWQpIHtcbiAgICAgICAgcHJvZHVjdHMucHVzaCgnb2JzZXJ2YWJpbGl0eScpXG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5hY2Nlc3NpYmlsaXR5KSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ2FjY2Vzc2liaWxpdHknKVxuICAgIH1cblxuICAgIGlmIChjb25maWcucGVyY3kpIHtcbiAgICAgICAgcHJvZHVjdHMucHVzaCgncGVyY3knKVxuICAgIH1cblxuICAgIGlmIChjb25maWcuYXV0b21hdGUpIHtcbiAgICAgICAgcHJvZHVjdHMucHVzaCgnYXV0b21hdGUnKVxuICAgIH1cblxuICAgIGlmIChjb25maWcuYXBwQXV0b21hdGUpIHtcbiAgICAgICAgcHJvZHVjdHMucHVzaCgnYXBwLWF1dG9tYXRlJylcbiAgICB9XG4gICAgcmV0dXJuIHByb2R1Y3RzXG59XG5cbmZ1bmN0aW9uIGJ1aWxkRXZlbnREYXRhKGV2ZW50VHlwZTogc3RyaW5nLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNDTElFbmFibGVkID0gZmFsc2UpIHtcbiAgICBjb25zdCBldmVudFByb3BlcnRpZXM6IEV2ZW50UHJvcGVydGllcyA9IHtcbiAgICAgICAgLy8gRnJhbWV3b3JrIERldGFpbHNcbiAgICAgICAgc2RrUnVuSWQ6IGNvbmZpZz8uc2RrUnVuSUQsXG4gICAgICAgIHRlc3RodWJfdXVpZDogVGVzdE9wc0NvbmZpZy5nZXRJbnN0YW5jZSgpLmJ1aWxkSGFzaGVkSWQsXG4gICAgICAgIGxhbmd1YWdlX2ZyYW1ld29yazogZ2V0TGFuZ3VhZ2VGcmFtZXdvcmsoY29uZmlnLmZyYW1ld29yayksXG4gICAgICAgIHJlZmVycmVyOiBnZXRSZWZlcnJlcihjb25maWcuZnJhbWV3b3JrKSxcbiAgICAgICAgbGFuZ3VhZ2U6ICdXZWJkcml2ZXJJTycsXG4gICAgICAgIGxhbmd1YWdlVmVyc2lvbjogcHJvY2Vzcy52ZXJzaW9uLFxuXG4gICAgICAgIC8vIEJ1aWxkIERldGFpbHNcbiAgICAgICAgYnVpbGROYW1lOiBjb25maWcuYnVpbGROYW1lIHx8ICd1bmRlZmluZWQnLFxuICAgICAgICBidWlsZElkZW50aWZpZXI6IFN0cmluZyhjb25maWcuYnVpbGRJZGVudGlmaWVyKSxcblxuICAgICAgICAvLyBIb3N0IGRldGFpbHNcbiAgICAgICAgb3M6IG9zLnR5cGUoKSB8fCAndW5rbm93bicsXG4gICAgICAgIGhvc3RuYW1lOiBvcy5ob3N0bmFtZSgpIHx8ICd1bmtub3duJyxcblxuICAgICAgICAvLyBQcm9kdWN0IERldGFpbHNcbiAgICAgICAgcHJvZHVjdE1hcDogZ2V0UHJvZHVjdE1hcChjb25maWcpLFxuICAgICAgICBwcm9kdWN0OiBnZXRQcm9kdWN0TGlzdChjb25maWcpLFxuXG4gICAgICAgIC8vIGZyYW1ld29yayBkZXRhaWxzXG4gICAgICAgIGZyYW1ld29yazogY29uZmlnLmZyYW1ld29yayxcblxuICAgICAgICAvLyBDTEkgRGV0YWlsc1xuICAgICAgICBpc0NMSUVuYWJsZWQ6IGlzQ0xJRW5hYmxlZFxuICAgIH1cblxuICAgIGlmIChldmVudFR5cGUgPT09ICdTREtUZXN0U3VjY2Vzc2Z1bCcpIHtcbiAgICAgICAgY29uc3Qgd29ya2VyRGF0YSA9IGdldERhdGFGcm9tV29ya2VycygpXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgZXZlbnRQcm9wZXJ0aWVzLnByb2R1Y3RVc2FnZSA9IGdldFByb2R1Y3RVc2FnZSh3b3JrZXJEYXRhKVxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfUE9MTElOR19USU1FT1VUKSB7XG4gICAgICAgICAgICBldmVudFByb3BlcnRpZXMucG9sbGluZ1RpbWVvdXQgPSBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9QT0xMSU5HX1RJTUVPVVQgYXMgc3RyaW5nXG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgYW55IHdvcmtlciBjYWxsZWQgYnJvd3Nlci5yZWxvYWRTZXNzaW9uKCksIG1hcmsgdGhlIGJ1aWxkIHNvIHRoZVxuICAgICAgICAvLyBzZXNzaW9uLWxpbmtpbmcgZGFzaGJvYXJkIGNhbiBleGNsdWRlIGl0cyAoZXhwZWN0ZWQpIHJlbG9hZC1vcnBoYW5lZCBzZXNzaW9ucy5cbiAgICAgICAgdHlwZSBXb3JrZXJSZWNvcmQgPSB7IHJlbG9hZEhhcHBlbmVkPzogYm9vbGVhbjsgdXNhZ2VTdGF0cz86IHVua25vd24gfVxuICAgICAgICBjb25zdCByZWxvYWRIYXBwZW5lZCA9IHdvcmtlckRhdGEuc29tZSgod29ya2VyKSA9PiAod29ya2VyIGFzIFdvcmtlclJlY29yZCkucmVsb2FkSGFwcGVuZWQgPT09IHRydWUpXG4gICAgICAgIGlmIChyZWxvYWRIYXBwZW5lZCkge1xuICAgICAgICAgICAgZXZlbnRQcm9wZXJ0aWVzLmZpbmlzaGVkTWV0YWRhdGEgPSB7IHJlYXNvbjogJ3Nlc3Npb25fcmVsb2FkZWQnIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBIHNpZ25hbC10ZXJtaW5hdGVkIHJ1biBtdXN0IGJlIHF1ZXJ5LWRldGVjdGFibGUgXHUyMDE0IGtpbGwgd2lucyBvdmVyXG4gICAgICAgIC8vIHJlbG9hZCBhcyB0aGUgZmluaXNoIHJlYXNvbi5cbiAgICAgICAgaWYgKGNvbmZpZy5raWxsU2lnbmFsKSB7XG4gICAgICAgICAgICBldmVudFByb3BlcnRpZXMuZmluaXNoZWRNZXRhZGF0YSA9IHsgcmVhc29uOiAndXNlcl9raWxsZWQnLCBzaWduYWw6IGNvbmZpZy5raWxsU2lnbmFsIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHVzZXJOYW1lOiBjb25maWcudXNlck5hbWUsXG4gICAgICAgIGFjY2Vzc0tleTogY29uZmlnLmFjY2Vzc0tleSxcbiAgICAgICAgZXZlbnRfdHlwZTogZXZlbnRUeXBlLFxuICAgICAgICBkZXRlY3RlZEZyYW1ld29yazogV0RJT19OQU1JTkdfUFJFRklYICsgY29uZmlnLmZyYW1ld29yayxcbiAgICAgICAgZXZlbnRfcHJvcGVydGllczogZXZlbnRQcm9wZXJ0aWVzXG4gICAgfSBhcyB1bmtub3duIGFzIEZ1bm5lbERhdGFcblxufVxuXG5mdW5jdGlvbiBnZXRQcm9kdWN0VXNhZ2Uod29ya2Vyc0RhdGE6IHsgdXNhZ2VTdGF0czogVXNhZ2VTdGF0IH1bXSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHRlc3RPYnNlcnZhYmlsaXR5OiBVc2FnZVN0YXRzLmdldEluc3RhbmNlKCkuZ2V0Rm9ybWF0dGVkRGF0YSh3b3JrZXJzRGF0YSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldExhbmd1YWdlRnJhbWV3b3JrKGZyYW1ld29yaz86IHN0cmluZykge1xuICAgIHJldHVybiAnV2ViZHJpdmVySU9fJyArIGZyYW1ld29ya1xufVxuXG5mdW5jdGlvbiBnZXRSZWZlcnJlcihmcmFtZXdvcms/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBmdWxsTmFtZSA9IGZyYW1ld29yayA/IFdESU9fTkFNSU5HX1BSRUZJWCArIGZyYW1ld29yayA6ICdXZWJkcml2ZXJJTydcbiAgICByZXR1cm4gYCR7ZnVsbE5hbWV9LyR7QlNUQUNLX1NFUlZJQ0VfVkVSU0lPTn1gXG59XG5cbmNvbnN0IHNlbmRFdmVudCA9IHtcbiAgICB0Y2dEb3duOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RUY2dEb3duUmVzcG9uc2UnLCBjb25maWcpLFxuICAgIGludmFsaWRUY2dBdXRoOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RJbnZhbGlkVGNnQXV0aFJlc3BvbnNlV2l0aFVzZXJJbXBhY3QnLCBjb25maWcpLFxuICAgIHRjZ0F1dGhGYWlsdXJlOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RUY2dBdXRoRmFpbHVyZScsIGNvbmZpZyksXG4gICAgdGNndEluaXRTdWNjZXNzZnVsOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RUY2d0SW5pdFN1Y2Nlc3NmdWwnLCBjb25maWcpLFxuICAgIGluaXRGYWlsZWQ6IChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZykgPT4gZmlyZUZ1bm5lbFRlc3RFdmVudCgnU0RLVGVzdEluaXRGYWlsZWRSZXNwb25zZScsIGNvbmZpZyksXG4gICAgdGNnUHJveHlGYWlsdXJlOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RUY2dQcm94eUZhaWx1cmUnLCBjb25maWcpLFxufVxuXG5mdW5jdGlvbiBpc1Byb3h5RXJyb3IoYXV0aFJlc3VsdDogeyBzdGF0dXM/OiBudW1iZXIgfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoYXV0aFJlc3VsdCBhcyBCcm93c2Vyc3RhY2tIZWFsaW5nLkluaXRFcnJvclJlc3BvbnNlKT8uc3RhdHVzID09PSA1MDJcbn1cblxuZnVuY3Rpb24gaGFuZGxlUHJveHlFcnJvcihjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBzZW5kRXZlbnQudGNnUHJveHlGYWlsdXJlKGNvbmZpZylcbiAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ1Byb3h5IEVycm9yLiBEaXNhYmxpbmcgSGVhbGluZyBmb3IgdGhpcyBzZXNzaW9uLicpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVVcGdyYWRlUmVxdWlyZWQoaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ1BsZWFzZSB1cGdyYWRlIEJyb3dzZXJzdGFjayBTZXJ2aWNlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiB0byB1c2UgdGhlIHNlbGYtaGVhbGluZyBmZWF0dXJlLicpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVBdXRoZW50aWNhdGlvbkZhaWx1cmUoc3RhdHVzOiBudW1iZXIsIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgIGlmIChpc1NlbGZIZWFsRW5hYmxlZCkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ1NvbWV0aGluZyB3ZW50IHdyb25nLiBEaXNhYmxpbmcgaGVhbGluZyBmb3IgdGhpcyBzZXNzaW9uLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicpXG4gICAgICAgIH1cbiAgICAgICAgc2VuZEV2ZW50LnRjZ0Rvd24oY29uZmlnKVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1NlbGZIZWFsRW5hYmxlZCkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0F1dGhlbnRpY2F0aW9uIEZhaWxlZC4gRGlzYWJsaW5nIEhlYWxpbmcgZm9yIHRoaXMgc2Vzc2lvbi4nKVxuICAgICAgICB9XG4gICAgICAgIHNlbmRFdmVudC50Y2dBdXRoRmFpbHVyZShjb25maWcpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVBdXRoZW50aWNhdGlvblN1Y2Nlc3MoXG4gICAgaXNIZWFsaW5nRW5hYmxlZEZvclVzZXI6IGJvb2xlYW4sXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsXG4gICAgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWRcbikge1xuICAgIGlmICghaXNIZWFsaW5nRW5hYmxlZEZvclVzZXIgJiYgaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0hlYWxpbmcgaXMgbm90IGVuYWJsZWQgZm9yIHlvdXIgZ3JvdXAsIHBsZWFzZSBjb250YWN0IHRoZSBhZG1pbicpXG4gICAgfSBlbHNlIGlmICh1c2VySWQgJiYgaXNIZWFsaW5nRW5hYmxlZEZvclVzZXIpIHtcbiAgICAgICAgc2VuZEV2ZW50LnRjZ3RJbml0U3VjY2Vzc2Z1bChjb25maWcpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVJbml0aWFsaXphdGlvbkZhaWx1cmUoc3RhdHVzOiBudW1iZXIsIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIHNlbmRFdmVudC5pbml0RmFpbGVkKGNvbmZpZylcbiAgICB9IGVsc2UgaWYgKCFzdGF0dXMgJiYgaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgc2VuZEV2ZW50LmludmFsaWRUY2dBdXRoKGNvbmZpZylcbiAgICB9XG5cbiAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0F1dGhlbnRpY2F0aW9uIEZhaWxlZC4gSGVhbGluZyB3aWxsIGJlIGRpc2FibGVkIGZvciB0aGlzIHNlc3Npb24uJylcbiAgICB9XG59XG5cbmludGVyZmFjZSBBdXRoUmVzdWx0IHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBpc0F1dGhlbnRpY2F0ZWQ6IGJvb2xlYW5cbiAgICBzdGF0dXM6IG51bWJlclxuICAgIHVzZXJJZDogc3RyaW5nXG4gICAgZ3JvdXBJZDogc3RyaW5nXG4gICAgaXNIZWFsaW5nRW5hYmxlZDogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlSGVhbGluZ0luc3RydW1lbnRhdGlvbihcbiAgICBhdXRoUmVzdWx0OiBBdXRoUmVzdWx0LFxuICAgIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLFxuICAgIGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGlzUHJveHlFcnJvcihhdXRoUmVzdWx0KSkge1xuICAgICAgICAgICAgaGFuZGxlUHJveHlFcnJvcihjb25maWcsIGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIGlzQXV0aGVudGljYXRlZCwgc3RhdHVzLCB1c2VySWQsIGdyb3VwSWQsIGlzSGVhbGluZ0VuYWJsZWQ6IGlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyIH0gPSBhdXRoUmVzdWx0XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UgPT09ICdVcGdyYWRlIHJlcXVpcmVkJykge1xuICAgICAgICAgICAgaGFuZGxlVXBncmFkZVJlcXVpcmVkKGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQXV0aGVudGljYXRlZCkge1xuICAgICAgICAgICAgaGFuZGxlQXV0aGVudGljYXRpb25GYWlsdXJlKHN0YXR1cywgY29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXV0aGVudGljYXRlZCAmJiB1c2VySWQgJiYgZ3JvdXBJZCkge1xuICAgICAgICAgICAgaGFuZGxlQXV0aGVudGljYXRpb25TdWNjZXNzKGlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyLCB1c2VySWQsIGNvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNDAwIHx8ICFzdGF0dXMpIHtcbiAgICAgICAgICAgIGhhbmRsZUluaXRpYWxpemF0aW9uRmFpbHVyZShzdGF0dXMsIGNvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRXJyb3IgaW4gaGFuZGxpbmcgaGVhbGluZyBpbnN0cnVtZW50YXRpb246ICcgKyBlcnIpXG4gICAgfVxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcblxuY29uc3Qgd29ya2Vyc0RhdGFEaXJQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdsb2dzJywgJ3dvcmtlcl9kYXRhJylcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFGcm9tV29ya2Vycygpe1xuICAgIGNvbnN0IHdvcmtlcnNEYXRhOiBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+W10gPSBbXVxuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHdvcmtlcnNEYXRhRGlyUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHdvcmtlcnNEYXRhXG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyh3b3JrZXJzRGF0YURpclBhdGgpXG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1JlYWRpbmcgd29ya2VyIGZpbGUgJyArIGZpbGUpXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtlcnNEYXRhRGlyUGF0aCwgZmlsZSlcbiAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JylcbiAgICAgICAgY29uc3Qgd29ya2VyRGF0YSA9IEpTT04ucGFyc2UoZmlsZUNvbnRlbnQpXG4gICAgICAgIHdvcmtlcnNEYXRhLnB1c2god29ya2VyRGF0YSlcbiAgICB9KVxuXG4gICAgLy8gUmVtb3ZlIHdvcmtlciBkYXRhIGFmdGVyIGFsbCByZWFkaW5nXG4gICAgcmVtb3ZlV29ya2Vyc0RhdGFEaXIoKVxuXG4gICAgcmV0dXJuIHdvcmtlcnNEYXRhXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYXZlV29ya2VyRGF0YShkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtlcnNEYXRhRGlyUGF0aCwgJ3dvcmtlci1kYXRhLScgKyBwcm9jZXNzLnBpZCArICcuanNvbicpXG5cbiAgICB0cnkge1xuICAgICAgICBjcmVhdGVXb3JrZXJzRGF0YURpcigpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEpKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdFeGNlcHRpb24gaW4gc2F2aW5nIHdvcmtlciBkYXRhOiAnICsgZSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVdvcmtlcnNEYXRhRGlyKCk6IGJvb2xlYW4ge1xuICAgIGZzLnJtU3luYyh3b3JrZXJzRGF0YURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtlcnNEYXRhRGlyKCkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh3b3JrZXJzRGF0YURpclBhdGgpKSB7XG4gICAgICAgIGZzLm1rZGlyU3luYyh3b3JrZXJzRGF0YURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxZQUFBQSxXQUFVLFlBQUFDLFdBQVUsUUFBQUMsT0FBTSxXQUFBQyxVQUFTLFFBQUFDLE9BQU0sY0FBYztBQUNoRSxPQUFPLFlBQVk7QUFDbkIsT0FBT0MsU0FBUTtBQUNmLE9BQU8sVUFBVTtBQUNqQixTQUFTLFFBQVEsYUFBQUMsa0JBQWlCO0FBQ2xDLE9BQU9DLFdBQVU7QUFDakIsT0FBT0MsV0FBVTtBQU1qQixPQUFPLGlCQUFpQjtBQUN4QixPQUFPLGVBQWU7QUFFdEIsU0FBUyxlQUFBQyxvQkFBbUI7OztBQ2Y1QixPQUFPLGVBQWU7QUFFdEIsSUFBTSxhQUFhO0FBQUEsRUFDZixNQUFNO0FBQUEsRUFBUSxPQUFPO0FBQUEsRUFBUyxPQUFPO0FBQUEsRUFBUyxPQUFPO0FBQUEsRUFBUyxNQUFNO0FBQ3hFO0FBRUEsSUFBTSxhQUFOLGNBQXlCLFVBQVU7QUFBQSxFQUMvQixlQUFlLENBQUMsUUFBUSxXQUFXLE1BQU0sVUFBVSxDQUFDLEVBQUUsTUFBbUI7QUFDckUsSUFBQyxRQUFRLEtBQWtCLGFBQWEsUUFBUSxHQUFHLElBQUk7QUFBQSxNQUNuRCxZQUFXLG9CQUFJLEtBQUssR0FBRSxZQUFZO0FBQUEsTUFDbEMsT0FBTyxNQUFNLFlBQVk7QUFBQSxNQUN6QixTQUFTLElBQUksUUFBUSxLQUFLLElBQUksQ0FBQztBQUFBLE1BQy9CLE1BQU07QUFBQSxNQUNOLGVBQWUsQ0FBQztBQUFBLElBQ3BCLENBQUM7QUFBQSxFQUNMO0FBQUE7QUFBQSxFQUdBLFFBQVEsSUFBSSxZQUF1QjtBQUMvQixTQUFLLGFBQWEsV0FBVyxPQUFPLE9BQU87QUFBQSxFQUMvQztBQUFBLEVBRUEsUUFBUSxJQUFJLFlBQXVCO0FBQy9CLFNBQUssYUFBYSxXQUFX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UUFBSTtBQUNBLFlBQU0sa0JBQWtCLFVBQVU7QUFDbEMsbUJBQWEsTUFBTSw0Q0FBNEM7QUFBQSxJQUNuRSxTQUFTLEdBQVk7QUFDakIsbUJBQWEsTUFBTSxtQ0FBbUMsQ0FBQztBQUFBLElBQzNEO0FBQUEsRUFDSjtBQUFBLEVBRUEsT0FBTyxzQkFBc0IsVUFBa0I7QUFDM0MsUUFBSSxDQUFDLFVBQVU7QUFDWCxhQUFPO0FBQUEsSUFDWDtBQUVBLFVBQU0sVUFBVUMsS0FBRyxhQUFhLFVBQVUsTUFBTTtBQUVoRCxVQUFNLE9BQU8sS0FBSyxNQUFNLE9BQU87QUFDL0IsU0FBSyxxQkFBcUIsUUFBUTtBQUNsQyxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsT0FBTyxxQkFBcUIsVUFBbUI7QUFDM0MsUUFBSSxDQUFDLFVBQVU7QUFDWDtBQUFBLElBQ0o7QUFDQSxJQUFBQSxLQUFHLE9BQU8sVUFBVSxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQUEsRUFDdkM7QUFDSjtBQUVBLEtBQUssY0FBYyxhQUFhOyIsCiAgIm5hbWVzIjogWyJob3N0bmFtZSIsICJwbGF0Zm9ybSIsICJ0eXBlIiwgInZlcnNpb24iLCAiYXJjaCIsICJmcyIsICJwcm9taXNpZnkiLCAicGF0aCIsICJ1dGlsIiwgInBlcmZvcm1hbmNlIiwgImZzIiwgInV0aWwiLCAicGF0aCIsICJhcmNoIiwgInBsYXRmb3JtIiwgImZzIiwgInBhdGgiLCAicGF0aCIsICJmcyIsICJjaGFsayIsICJsb2dnZXIiLCAibG9nIiwgImxvZ2dlciIsICJCU3RhY2tMb2dnZXIiLCAicGF0aCIsICJmcyIsICJjaGFsayIsICJwbGF0Zm9ybSIsICJCU3RhY2tMb2dnZXIiLCAiZnMiLCAidmVyc2lvbiIsICJwYXRoIiwgInByb2Nlc3MiLCAib3BlblJlYWRTdHJlYW1Qcm9taXNlIiwgInBhdGgiLCAiZnMiLCAidXRpbCIsICJ0eXBlIiwgInBsYXRmb3JtIiwgImFyY2giLCAiZnMiLCAiZnMiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAiZ3JvdXAiLCAicGF0aCIsICJmcyIsICJwcm9taXNpZnkiLCAidXRpbCIsICJwZXJmb3JtYW5jZSIsICJsYXVuY2hUZXN0U2Vzc2lvbiIsICJob3N0bmFtZSIsICJwbGF0Zm9ybSIsICJ0eXBlIiwgInZlcnNpb24iLCAiYXJjaCIsICJ1dGlsIiwgInN0b3BCdWlsZFVwc3RyZWFtIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJnZXRQbGF0Zm9ybVZlcnNpb24iLCAiZ2V0UmVzb2x2ZWREZXZpY2VOYW1lIiwgInBhdGgiLCAiaGFzaCIsICJmcyIsICJwYXRoIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInV0aWwiLCAib3MiLCAidXRpbCIsICJmb3JtYXQiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAidXRpbCIsICJ1dGlsIiwgImZzIl0KfQo=
|