@wdio/browserstack-service 9.33.1 → 9.33.2

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/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.33.1",
73
+ version: "9.33.2",
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",
@@ -4112,4 +4112,4 @@ void BStackCleanup.startCleanup();
4112
4112
  export {
4113
4113
  BStackCleanup as default
4114
4114
  };
4115
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWwudHMiLCAiLi4vc3JjL2xvZ1BhdGNoZXIudHMiLCAiLi4vc3JjL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIudHMiLCAiLi4vc3JjL2JzdGFja0xvZ2dlci50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vc3JjL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2FwaVV0aWxzLnRzIiwgIi4uL3NyYy9jbGkvY2xpVXRpbHMudHMiLCAiLi4vc3JjL2ZldGNoV3JhcHBlci50cyIsICIuLi9zcmMvaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2NsaUxvZ2dlci50cyIsICIuLi9zcmMvY2xpL2ZyYW1ld29ya3MvY29uc3RhbnRzL3Rlc3RGcmFtZXdvcmtDb25zdGFudHMudHMiLCAiLi4vc3JjL3Rlc3RIdWIvdXRpbHMudHMiLCAiLi4vc3JjL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLnRzIiwgIi4uL3NyYy9jcmFzaC1yZXBvcnRlci50cyIsICIuLi9zcmMvdGVzdE9wcy9mZWF0dXJlU3RhdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvZmVhdHVyZVVzYWdlLnRzIiwgIi4uL3NyYy90ZXN0T3BzL3Rlc3RPcHNDb25maWcudHMiLCAiLi4vc3JjL3Rlc3RPcHMvdXNhZ2VTdGF0cy50cyIsICIuLi9zcmMvc2NyaXB0cy9hY2Nlc3NpYmlsaXR5LXNjcmlwdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvb3BlblJ1bnNKb3VybmFsLnRzIiwgIi4uL3NyYy9jbGVhbnVwLnRzIiwgIi4uL3NyYy9pbnN0cnVtZW50YXRpb24vZnVubmVsSW5zdHJ1bWVudGF0aW9uLnRzIiwgIi4uL3NyYy9kYXRhLXN0b3JlLnRzIl0sCiAgInNvdXJjZVJvb3QiOiAiL2hvbWUvcnVubmVyL3dvcmsvd2Rpby1icm93c2Vyc3RhY2stc2VydmljZS93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlL3BhY2thZ2VzL2Jyb3dzZXJzdGFjay1zZXJ2aWNlIiwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGhvc3RuYW1lLCBwbGF0Zm9ybSwgdHlwZSwgdmVyc2lvbiwgYXJjaCwgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCB6bGliIGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB7IGZvcm1hdCwgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHV0aWwgZnJvbSAnbm9kZTp1dGlsJ1xuXG5pbXBvcnQgdHlwZSB7IENhcGFiaWxpdGllcywgRnJhbWV3b3JrcywgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBCZWZvcmVDb21tYW5kQXJncywgQWZ0ZXJDb21tYW5kQXJncyB9IGZyb20gJ0B3ZGlvL3JlcG9ydGVyJ1xuXG5pbXBvcnQgdHlwZSB7IEdpdFJlcG9JbmZvIH0gZnJvbSAnZ2l0LXJlcG8taW5mbydcbmltcG9ydCBnaXRSZXBvSW5mbyBmcm9tICdnaXQtcmVwby1pbmZvJ1xuaW1wb3J0IGdpdGNvbmZpZyBmcm9tICdnaXRjb25maWdsb2NhbCdcbmltcG9ydCB0eXBlIHsgQ29sb3JOYW1lIH0gZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBwZXJmb3JtYW5jZSB9IGZyb20gJ25vZGU6cGVyZl9ob29rcydcbmltcG9ydCBsb2dQYXRjaGVyIGZyb20gJy4vbG9nUGF0Y2hlci5qcydcbmltcG9ydCBQZXJmb3JtYW5jZVRlc3RlciBmcm9tICcuL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgKiBhcyBQRVJGT1JNQU5DRV9TREtfRVZFTlRTIGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IGxvZ0J1aWxkRXJyb3IsIGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eSwgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5LCBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSBCcm93c2VyU3RhY2tDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5pbXBvcnQgeyBPcmNoZXN0cmF0aW9uVXRpbHMgfSBmcm9tICcuL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLmpzJ1xuaW1wb3J0IHR5cGUgeyBFcnJvcnMgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSB7IFVzZXJDb25maWcsIFVwbG9hZFR5cGUsIEJyb3dzZXJzdGFja0NvbmZpZywgQnJvd3NlcnN0YWNrT3B0aW9ucywgTGF1bmNoUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHR5cGUgeyBJVGVzdENhc2VIb29rUGFyYW1ldGVyIH0gZnJvbSAnLi9jdWN1bWJlci10eXBlcy5qcydcbmltcG9ydCB7XG4gICAgQlJPV1NFUl9ERVNDUklQVElPTixcbiAgICBVUExPQURfTE9HU19FTkRQT0lOVCxcbiAgICBjb25zb2xlSG9sZGVyLFxuICAgIFRFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsXG4gICAgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0xUUyxcbiAgICBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQsXG4gICAgVEVTVE9QU19TQ1JFRU5TSE9UX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELFxuICAgIEJST1dTRVJTVEFDS19LSUxMX1NJR05BTCxcbiAgICBQRVJGX01FQVNVUkVNRU5UX0VOVixcbiAgICBSRVJVTl9FTlYsXG4gICAgQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRCxcbiAgICBNQVhfR0lUX01FVEFfREFUQV9TSVpFX0lOX0JZVEVTLFxuICAgIEdJVF9NRVRBX0RBVEFfVFJVTkNBVEVELFxuICAgIEFQUF9BTExZX0lTU1VFU19TVU1NQVJZX0VORFBPSU5ULFxuICAgIEFQUF9BTExZX0lTU1VFU19FTkRQT0lOVCxcbiAgICBDTElfREVCVUdfTE9HU19GSUxFLFxuICAgIFdESU9fTkFNSU5HX1BSRUZJWFxufSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCBDcmFzaFJlcG9ydGVyIGZyb20gJy4vY3Jhc2gtcmVwb3J0ZXIuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCBVc2FnZVN0YXRzIGZyb20gJy4vdGVzdE9wcy91c2FnZVN0YXRzLmpzJ1xuaW1wb3J0IFRlc3RPcHNDb25maWcgZnJvbSAnLi90ZXN0T3BzL3Rlc3RPcHNDb25maWcuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXJ0QmluU2Vzc2lvblJlc3BvbnNlIH0gZnJvbSAnLi9ncnBjL2luZGV4LmpzJ1xuaW1wb3J0IEFQSVV0aWxzIGZyb20gJy4vY2xpL2FwaVV0aWxzLmpzJ1xuaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAndGFyJ1xuXG5pbXBvcnQgQWNjZXNzaWJpbGl0eVNjcmlwdHMgZnJvbSAnLi9zY3JpcHRzL2FjY2Vzc2liaWxpdHktc2NyaXB0cy5qcydcblxuaW1wb3J0IHsgX2ZldGNoIGFzIGZldGNoIH0gZnJvbSAnLi9mZXRjaFdyYXBwZXIuanMnXG5cbmNvbnN0IHBHaXRjb25maWcgPSBwcm9taXNpZnkoZ2l0Y29uZmlnKVxuXG5leHBvcnQgdHlwZSBHaXRNZXRhRGF0YSA9IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgc2hhOiBzdHJpbmc7XG4gICAgc2hvcnRfc2hhOiBzdHJpbmc7XG4gICAgYnJhbmNoOiBzdHJpbmc7XG4gICAgdGFnOiBzdHJpbmcgfCBudWxsO1xuICAgIGNvbW1pdHRlcjogc3RyaW5nO1xuICAgIGNvbW1pdHRlcl9kYXRlOiBzdHJpbmc7XG4gICAgYXV0aG9yOiBzdHJpbmc7XG4gICAgYXV0aG9yX2RhdGU6IHN0cmluZztcbiAgICBjb21taXRfbWVzc2FnZTogc3RyaW5nO1xuICAgIHJvb3Q6IHN0cmluZztcbiAgICBjb21tb25fZ2l0X2Rpcjogc3RyaW5nO1xuICAgIHdvcmt0cmVlX2dpdF9kaXI6IHN0cmluZztcbiAgICBsYXN0X3RhZzogc3RyaW5nIHwgbnVsbDtcbiAgICBjb21taXRzX3NpbmNlX2xhc3RfdGFnOiBudW1iZXI7XG4gICAgcmVtb3RlczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHVybDogc3RyaW5nIH0+O1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRVFVRVNUX0NPTkZJRyA9IHtcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdYLUJTVEFDSy1PQlMnOiAndHJ1ZSdcbiAgICB9LFxufVxuXG5leHBvcnQgY29uc3QgQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCBDb2xvck5hbWU+ID0ge1xuICAgIGVycm9yOiAncmVkJyxcbiAgICB3YXJuOiAneWVsbG93JyxcbiAgICBpbmZvOiAnY3lhbkJyaWdodCcsXG4gICAgZGVidWc6ICdncmVlbicsXG4gICAgdHJhY2U6ICdjeWFuJyxcbiAgICBwcm9ncmVzczogJ21hZ2VudGEnXG59XG5cbi8qKlxuICogZ2V0IGJyb3dzZXIgZGVzY3JpcHRpb24gZm9yIEJyb3dzZXJzdGFjayBzZXJ2aWNlXG4gKiBAcGFyYW0gY2FwIGJyb3dzZXIgY2FwYWJsaXRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJEZXNjcmlwdGlvbihjYXA6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcykge1xuICAgIGNhcCA9IGNhcCB8fCB7fVxuICAgIGlmIChjYXBbJ2JzdGFjazpvcHRpb25zJ10pIHtcbiAgICAgICAgY2FwID0geyAuLi5jYXAsIC4uLmNhcFsnYnN0YWNrOm9wdGlvbnMnXSB9IGFzIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZXNlIGtleXMgZGVzY3JpYmUgdGhlIGJyb3dzZXIgdGhlIHRlc3Qgd2FzIHJ1biBvblxuICAgICAqL1xuICAgIHJldHVybiBCUk9XU0VSX0RFU0NSSVBUSU9OXG4gICAgICAgIC5tYXAoKGspID0+IChjYXApW2sgYXMga2V5b2YgdHlwZW9mIGNhcF0pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmpvaW4oJyAnKVxufVxuXG4vKipcbiAqIGdldCBjb3JyZWN0IGJyb3dzZXIgY2FwYWJpbGl0aWVzIG9iamVjdCBpbiBib3RoIG11bHRpcmVtb3RlIGFuZCBub3JtYWwgc2V0dXBzXG4gKiBAcGFyYW0gYnJvd3NlciBicm93c2VyIG9iamVjdFxuICogQHBhcmFtIGNhcHMgYnJvd3NlciBjYXBiaWxpdGllcyBvYmplY3QuIEluIGNhc2Ugb2YgbXVsdGlyZW1vdGUsIHRoZSBvYmplY3QgaXRzZWxmIHNob3VsZCBoYXZlIGEgcHJvcGVydHkgbmFtZWQgJ2NhcGFiaWxpdGllcydcbiAqIEBwYXJhbSBicm93c2VyTmFtZSBicm93c2VyIG5hbWUgaW4gY2FzZSBvZiBtdWx0aXJlbW90ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJvd3NlckNhcGFiaWxpdGllcyhicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyIHwgV2ViZHJpdmVySU8uTXVsdGlSZW1vdGVCcm93c2VyLCBjYXBzPzogQ2FwYWJpbGl0aWVzLlJlc29sdmVkVGVzdHJ1bm5lckNhcGFiaWxpdGllcywgYnJvd3Nlck5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWJyb3dzZXIuaXNNdWx0aXJlbW90ZSkge1xuICAgICAgICByZXR1cm4geyAuLi5icm93c2VyLmNhcGFiaWxpdGllcywgLi4uY2FwcyB9IGFzIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc1xuICAgIH1cblxuICAgIGNvbnN0IG11bHRpQ2FwcyA9IGNhcHMgYXMgQ2FwYWJpbGl0aWVzLlJlcXVlc3RlZE11bHRpcmVtb3RlQ2FwYWJpbGl0aWVzXG4gICAgY29uc3QgZ2xvYmFsQ2FwID0gYnJvd3Nlck5hbWUgJiYgYnJvd3Nlci5nZXRJbnN0YW5jZShicm93c2VyTmFtZSkgPyBicm93c2VyLmdldEluc3RhbmNlKGJyb3dzZXJOYW1lKS5jYXBhYmlsaXRpZXMgOiB7fVxuICAgIGNvbnN0IGNhcCA9IGJyb3dzZXJOYW1lICYmIG11bHRpQ2Fwc1ticm93c2VyTmFtZV0gPyBtdWx0aUNhcHNbYnJvd3Nlck5hbWVdLmNhcGFiaWxpdGllcyA6IHt9XG4gICAgcmV0dXJuIHsgLi4uZ2xvYmFsQ2FwLCAuLi5jYXAgfSBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNcbn1cblxuLyoqXG4gKiBjaGVjayBmb3IgYnJvd3NlcnN0YWNrIFczQyBjYXBhYmlsaXRpZXMuIERvZXMgbm90IHN1cHBvcnQgbGVnYWN5IGNhcGFiaWxpdGllc1xuICogQHBhcmFtIGNhcCBicm93c2VyIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2Vyc3RhY2tDYXBhYmlsaXR5KGNhcD86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcykge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgICBjYXAgJiZcbiAgICAgICAgICAgIGNhcFsnYnN0YWNrOm9wdGlvbnMnXSAmJlxuICAgICAgICAgICAgLy8gcmV0dXJuIGZhbHNlIGlmIHRoZSBvbmx5IGNhcCBpbiBic3RhY2s6b3B0aW9ucyBpcyB3ZGlvU2VydmljZSxcbiAgICAgICAgICAgIC8vIGFzIHRoYXQgaXMgYWRkZWQgYnkgdGhlIHNlcnZpY2UgYW5kIG5vdCBwcmVzZW50IGluIHVzZXIgcGFzc2VkIGNhcHNcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY2FwWydic3RhY2s6b3B0aW9ucyddKS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICBjYXBbJ2JzdGFjazpvcHRpb25zJ10ud2Rpb1NlcnZpY2VcbiAgICAgICAgICAgIClcbiAgICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJlbnRTdWl0ZU5hbWUoZnVsbFRpdGxlOiBzdHJpbmcsIHRlc3RTdWl0ZVRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZ1bGxUaXRsZVdvcmRzID0gZnVsbFRpdGxlLnNwbGl0KCcgJylcbiAgICBjb25zdCB0ZXN0U3VpdGVUaXRsZVdvcmRzID0gdGVzdFN1aXRlVGl0bGUuc3BsaXQoJyAnKVxuICAgIGNvbnN0IHNob3J0ZXN0TGVuZ3RoID0gTWF0aC5taW4oZnVsbFRpdGxlV29yZHMubGVuZ3RoLCB0ZXN0U3VpdGVUaXRsZVdvcmRzLmxlbmd0aClcbiAgICBsZXQgYyA9IDBcbiAgICBsZXQgcGFyZW50U3VpdGVOYW1lID0gJydcbiAgICB3aGlsZSAoYyA8IHNob3J0ZXN0TGVuZ3RoICYmIGZ1bGxUaXRsZVdvcmRzW2NdID09PSB0ZXN0U3VpdGVUaXRsZVdvcmRzW2NdKSB7XG4gICAgICAgIHBhcmVudFN1aXRlTmFtZSArPSBmdWxsVGl0bGVXb3Jkc1tjKytdICsgJyAnXG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRTdWl0ZU5hbWUudHJpbSgpXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NFcnJvcihlcnJvcjogRXJyb3IsIGZuOiBGdW5jdGlvbiwgYXJnczogdW5rbm93bltdKSB7XG4gICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiBleGVjdXRpbmcgJHtmbi5uYW1lfSB3aXRoIGFyZ3MgJHthcmdzfTogJHtlcnJvcn1gKVxuICAgIGxldCBhcmdzU3RyaW5nOiBzdHJpbmdcbiAgICB0cnkge1xuICAgICAgICBhcmdzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoYXJncylcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgYXJnc1N0cmluZyA9IHV0aWwuaW5zcGVjdChhcmdzLCB7IGRlcHRoOiAyIH0pXG4gICAgfVxuICAgIENyYXNoUmVwb3J0ZXIudXBsb2FkQ3Jhc2hSZXBvcnQoYEVycm9yIGluIGV4ZWN1dGluZyAke2ZuLm5hbWV9IHdpdGggYXJncyAke2FyZ3NTdHJpbmd9IDogJHtlcnJvcn1gLCBlcnJvciAmJiBlcnJvci5zdGFjayB8fCAndW5rbm93biBlcnJvcicpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvMTF5RXJyb3JIYW5kbGVyKGZuOiBGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgZnVuY3Rpb25Ub0hhbmRsZSA9IGZuXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnZbUEVSRl9NRUFTVVJFTUVOVF9FTlZdKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICBmdW5jdGlvblRvSGFuZGxlID0gcGVyZm9ybWFuY2UudGltZXJpZnkoZnVuY3Rpb25Ub0hhbmRsZSBhcyBhbnkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmdW5jdGlvblRvSGFuZGxlKC4uLmFyZ3MpXG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2F0Y2goZXJyb3IgPT4gcHJvY2Vzc0Vycm9yKGVycm9yLCBmbiwgYXJncykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBwcm9jZXNzRXJyb3IoZXJyb3IgYXMgRXJyb3IsIGZuLCBhcmdzKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JIYW5kbGVyKGZuOiBGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmdW5jdGlvblRvSGFuZGxlID0gZm5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZ1bmN0aW9uVG9IYW5kbGUoLi4uYXJncylcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5jYXRjaChlcnJvciA9PiBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIGluIGV4ZWN1dGluZyAke2ZuLm5hbWV9IHdpdGggYXJncyAke2FyZ3N9OiAke2Vycm9yfWApKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiBleGVjdXRpbmcgJHtmbi5uYW1lfSB3aXRoIGFyZ3MgJHthcmdzfTogJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbm9kZVJlcXVlc3QocmVxdWVzdFR5cGU6IHN0cmluZywgYXBpRW5kcG9pbnQ6IHN0cmluZywgb3B0aW9uczogUmVxdWVzdEluaXQsIGFwaVVybDogc3RyaW5nLCB0aW1lb3V0OiBudW1iZXIgPSAxMjAwMDApIHtcbiAgICB0cnkge1xuXG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXQpXG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9LyR7YXBpRW5kcG9pbnR9YCwge1xuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0VHlwZSxcbiAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIHRpbWVvdXQgYXMgdGhlIHJlcXVlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuXG4gICAgICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBpbiBmaXJpbmcgcmVxdWVzdCAke2FwaVVybH0vJHthcGlFbmRwb2ludH06ICR7Zm9ybWF0KGVycm9yKX1gKVxuICAgICAgICBjb25zdCBpc0xvZ1VwbG9hZCA9IGFwaUVuZHBvaW50ID09PSBVUExPQURfTE9HU19FTkRQT0lOVFxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZUpzb24gPSBlcnJvci5yZXNwb25zZS5ib2R5ID8gSlNPTi5wYXJzZShlcnJvci5yZXNwb25zZS5ib2R5LnRvU3RyaW5nKCkpIDogbnVsbFxuICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlSnNvbiA/IGVycm9yTWVzc2FnZUpzb24ubWVzc2FnZSA6IG51bGxcbiAgICAgICAgICAgIGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYCR7ZXJyb3JNZXNzYWdlfSAtICR7ZXJyb3Iuc3RhY2t9YFxuICAgICAgICAgICAgICAgIGlmIChpc0xvZ1VwbG9hZCkge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcobWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IobWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0xvZ1VwbG9hZCkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc0xvZ1VwbG9hZCkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGZpcmUgYXBpIHJlcXVlc3QgZHVlIHRvICR7ZXJyb3J9IC0gJHtlcnJvci5zdGFja31gKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBGYWlsZWQgdG8gZmlyZSBhcGkgcmVxdWVzdCBkdWUgdG8gJHtlcnJvcn0gLSAke2Vycm9yLnN0YWNrfWApXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBodHRwczovL3R1Z2F5aWxpay5tZWRpdW0uY29tL2Vycm9yLWhhbmRsaW5nLXZpYS10cnktY2F0Y2gtcHJveHktaW4tamF2YXNjcmlwdC01NDExNmRiZjc4M2Zcbi8qXG4gICAgQSBjbGFzcyB3cmFwcGVyIGZvciBlcnJvciBoYW5kbGluZy4gVGhlIHdyYXBwZXIgd3JhcHMgYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBjbGFzcyB3aXRoIGEgZXJyb3IgaGFuZGxlciBmdW5jdGlvbi5cbiAgICBJZiBhbnkgZXhjZXB0aW9uIG9jY3VycyBpbiBhbnkgb2YgdGhlIGNsYXNzIG1ldGhvZCwgdGhhdCB3aWxsIGdldCBjYXVnaHQgaW4gdGhlIHdyYXBwZXIgd2hpY2ggbG9ncyBhbmQgcmVwb3J0cyB0aGUgZXJyb3IuXG4gKi9cbnR5cGUgQ2xhc3NUeXBlID0geyBuZXcoLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93bjsgfSAvLyBBIGdlbmVyaWMgdHlwZSBmb3IgYSBjbGFzc1xuZXhwb3J0IGZ1bmN0aW9uIG8xMXlDbGFzc0Vycm9ySGFuZGxlcjxUIGV4dGVuZHMgQ2xhc3NUeXBlPihlcnJvckNsYXNzOiBUKTogVCB7XG4gICAgY29uc3QgcHJvdG90eXBlID0gZXJyb3JDbGFzcy5wcm90b3R5cGVcblxuICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90b3R5cGUpLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yQ2xhc3NcbiAgICB9XG5cbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90b3R5cGUpLmZvckVhY2goKG1ldGhvZE5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgbWV0aG9kID0gcHJvdG90eXBlW21ldGhvZE5hbWVdXG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nICYmIG1ldGhvZE5hbWUgIT09ICdjb25zdHJ1Y3RvcicgJiYgbWV0aG9kTmFtZSAhPT0gJ2NvbW1hbmRXcmFwcGVyJykge1xuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gcHJlc2VydmUgdGhpcyBjb250ZXh0LCBuZWVkIHRvIGRlZmluZSBsaWtlIHRoaXNcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90b3R5cGUsIG1ldGhvZE5hbWUsIHtcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSAocHJvY2Vzcy5lbnZbUEVSRl9NRUFTVVJFTUVOVF9FTlZdID8gcGVyZm9ybWFuY2UudGltZXJpZnkobWV0aG9kKSA6IG1ldGhvZCkuY2FsbCh0aGlzLCAuLi5hcmdzKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNhdGNoKGVycm9yID0+IHByb2Nlc3NFcnJvcihlcnJvciwgbWV0aG9kLCBhcmdzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcblxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcihlcnIgYXMgRXJyb3IsIG1ldGhvZCwgYXJncylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIGVycm9yQ2xhc3Ncbn1cblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NUZXN0T2JzZXJ2YWJpbGl0eVJlc3BvbnNlID0gKHJlc3BvbnNlOiBMYXVuY2hSZXNwb25zZSkgPT4ge1xuICAgIGlmICghcmVzcG9uc2Uub2JzZXJ2YWJpbGl0eSkge1xuICAgICAgICBoYW5kbGVFcnJvckZvck9ic2VydmFiaWxpdHkobnVsbClcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghcmVzcG9uc2Uub2JzZXJ2YWJpbGl0eS5zdWNjZXNzKSB7XG4gICAgICAgIGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eShyZXNwb25zZS5vYnNlcnZhYmlsaXR5IGFzIEVycm9ycylcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSA9ICd0cnVlJ1xuICAgIGlmIChyZXNwb25zZS5vYnNlcnZhYmlsaXR5Lm9wdGlvbnMuYWxsb3dfc2NyZWVuc2hvdHMpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnZbVEVTVE9QU19TQ1JFRU5TSE9UX0VOVl0gPSByZXNwb25zZS5vYnNlcnZhYmlsaXR5Lm9wdGlvbnMuYWxsb3dfc2NyZWVuc2hvdHMudG9TdHJpbmcoKVxuICAgIH1cbn1cblxuaW50ZXJmYWNlIERhdGFFbGVtZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBjb25zdCBqc29uaWZ5QWNjZXNzaWJpbGl0eUFycmF5ID0gKFxuICAgIGRhdGFBcnJheTogRGF0YUVsZW1lbnRbXSxcbiAgICBrZXlOYW1lOiBrZXlvZiBEYXRhRWxlbWVudCxcbiAgICB2YWx1ZU5hbWU6IGtleW9mIERhdGFFbGVtZW50XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICAgZGF0YUFycmF5LmZvckVhY2goKGVsZW1lbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIHJlc3VsdFtlbGVtZW50W2tleU5hbWVdIGFzIHN0cmluZ10gPSBlbGVtZW50W3ZhbHVlTmFtZV1cbiAgICB9KVxuICAgIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NBY2Nlc3NpYmlsaXR5UmVzcG9uc2UgPSAocmVzcG9uc2U6IExhdW5jaFJlc3BvbnNlIHwgU3RhcnRCaW5TZXNzaW9uUmVzcG9uc2UsIG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lcikgPT4ge1xuICAgIGlmICghcmVzcG9uc2UuYWNjZXNzaWJpbGl0eSkge1xuICAgICAgICBpZiAob3B0aW9ucy5hY2Nlc3NpYmlsaXR5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBoYW5kbGVFcnJvckZvckFjY2Vzc2liaWxpdHkobnVsbClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5hY2Nlc3NpYmlsaXR5LnN1Y2Nlc3MpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5KHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkgYXMgRXJyb3JzKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5vcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgYWNjZXNzaWJpbGl0eVRva2VuLCBwb2xsaW5nVGltZW91dCwgc2Nhbm5lclZlcnNpb24gfSA9IGpzb25pZnlBY2Nlc3NpYmlsaXR5QXJyYXkocmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5vcHRpb25zLmNhcGFiaWxpdGllcyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sICduYW1lJywgJ3ZhbHVlJylcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ganNvbmlmeUFjY2Vzc2liaWxpdHlBcnJheShyZXNwb25zZS5hY2Nlc3NpYmlsaXR5Lm9wdGlvbnMuY2FwYWJpbGl0aWVzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiwgJ25hbWUnLCAndmFsdWUnKVxuICAgICAgICBjb25zdCBzY3JpcHRzSnNvbiA9IHtcbiAgICAgICAgICAgICdzY3JpcHRzJzoganNvbmlmeUFjY2Vzc2liaWxpdHlBcnJheShyZXNwb25zZS5hY2Nlc3NpYmlsaXR5Lm9wdGlvbnMuc2NyaXB0cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sICduYW1lJywgJ2NvbW1hbmQnKSxcbiAgICAgICAgICAgICdjb21tYW5kcyc6IHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkub3B0aW9ucy5jb21tYW5kc1RvV3JhcD8uY29tbWFuZHMgPz8gW10sXG4gICAgICAgICAgICAnbm9uQlN0YWNrSW5mcmFBMTF5Q2hyb21lT3B0aW9ucyc6IHJlc3VsdFsnZ29vZzpjaHJvbWVPcHRpb25zJ11cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Nhbm5lclZlcnNpb24pIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1NDQU5ORVJfVkVSU0lPTiA9IHNjYW5uZXJWZXJzaW9uIGFzIHN0cmluZ1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBBY2Nlc3NpYmlsaXR5IHNjYW5uZXJWZXJzaW9uICR7c2Nhbm5lclZlcnNpb259YClcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWNjZXNzaWJpbGl0eVRva2VuKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1QgPSBhY2Nlc3NpYmlsaXR5VG9rZW4gYXMgc3RyaW5nXG4gICAgICAgICAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfQUNDRVNTSUJJTElUWV0gPSAndHJ1ZSdcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9sbGluZ1RpbWVvdXQpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1BPTExJTkdfVElNRU9VVCA9IHBvbGxpbmdUaW1lb3V0IGFzIHN0cmluZ1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY3JpcHRzSnNvbikge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBmaXggdHlwZVxuICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNjcmlwdHMudXBkYXRlKHNjcmlwdHNKc29uKVxuICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNjcmlwdHMuc3RvcmUoKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc0xhdW5jaEJ1aWxkUmVzcG9uc2UgPSAocmVzcG9uc2U6IExhdW5jaFJlc3BvbnNlLCBvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIpID0+IHtcbiAgICBpZiAob3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eSkge1xuICAgICAgICBwcm9jZXNzVGVzdE9ic2VydmFiaWxpdHlSZXNwb25zZShyZXNwb25zZSlcbiAgICB9XG4gICAgcHJvY2Vzc0FjY2Vzc2liaWxpdHlSZXNwb25zZShyZXNwb25zZSwgb3B0aW9ucylcbn1cblxuZXhwb3J0IGNvbnN0IGxhdW5jaFRlc3RTZXNzaW9uID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5URVNUSFVCX0VWRU5UUy5TVEFSVCwgbzExeUVycm9ySGFuZGxlcihhc3luYyBmdW5jdGlvbiBsYXVuY2hUZXN0U2Vzc2lvbihvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLCBic0NvbmZpZzogVXNlckNvbmZpZywgYlN0YWNrQ29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uPzogYm9vbGVhbikge1xuICAgIGNvbnN0IGxhdW5jaEJ1aWxkVXNhZ2UgPSBVc2FnZVN0YXRzLmdldEluc3RhbmNlKCkubGF1bmNoQnVpbGRVc2FnZVxuICAgIGxhdW5jaEJ1aWxkVXNhZ2UudHJpZ2dlcmVkKClcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIGZvcm1hdDogJ2pzb24nLFxuICAgICAgICBwcm9qZWN0X25hbWU6IGdldE9ic2VydmFiaWxpdHlQcm9qZWN0KG9wdGlvbnMsIGJzQ29uZmlnLnByb2plY3ROYW1lKSxcbiAgICAgICAgbmFtZTogZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkKG9wdGlvbnMsIGJzQ29uZmlnLmJ1aWxkTmFtZSksXG4gICAgICAgIGJ1aWxkX2lkZW50aWZpZXI6IGJzQ29uZmlnLmJ1aWxkSWRlbnRpZmllcixcbiAgICAgICAgc3RhcnRlZF9hdDogKG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHRhZ3M6IGdldE9ic2VydmFiaWxpdHlCdWlsZFRhZ3Mob3B0aW9ucywgYnNDb25maWcuYnVpbGRUYWcpLFxuICAgICAgICBob3N0X2luZm86IHtcbiAgICAgICAgICAgIGhvc3RuYW1lOiBob3N0bmFtZSgpLFxuICAgICAgICAgICAgcGxhdGZvcm06IHBsYXRmb3JtKCksXG4gICAgICAgICAgICB0eXBlOiB0eXBlKCksXG4gICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uKCksXG4gICAgICAgICAgICBhcmNoOiBhcmNoKClcbiAgICAgICAgfSxcbiAgICAgICAgY2lfaW5mbzogZ2V0Q2lJbmZvKCksXG4gICAgICAgIGJ1aWxkX3J1bl9pZGVudGlmaWVyOiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQlVJTERfUlVOX0lERU5USUZJRVIsXG4gICAgICAgIGZhaWxlZF90ZXN0c19yZXJ1bjogcHJvY2Vzcy5lbnZbUkVSVU5fRU5WXSB8fCBmYWxzZSxcbiAgICAgICAgdmVyc2lvbl9jb250cm9sOiBhd2FpdCBnZXRHaXRNZXRhRGF0YSgpLFxuICAgICAgICBhY2Nlc3NpYmlsaXR5OiB7XG4gICAgICAgICAgICBzZXR0aW5nczogb3B0aW9ucy5hY2Nlc3NpYmlsaXR5T3B0aW9uc1xuICAgICAgICB9LFxuICAgICAgICBicm93c2Vyc3RhY2tBdXRvbWF0aW9uOiBzaG91bGRBZGRTZXJ2aWNlVmVyc2lvbihjb25maWcsIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHkpLFxuICAgICAgICBmcmFtZXdvcmtfZGV0YWlsczoge1xuICAgICAgICAgICAgZnJhbWV3b3JrTmFtZTogV0RJT19OQU1JTkdfUFJFRklYICsgY29uZmlnLmZyYW1ld29yayxcbiAgICAgICAgICAgIGZyYW1ld29ya1ZlcnNpb246IGJzQ29uZmlnLmJzdGFja1NlcnZpY2VWZXJzaW9uLFxuICAgICAgICAgICAgc2RrVmVyc2lvbjogYnNDb25maWcuYnN0YWNrU2VydmljZVZlcnNpb24sXG4gICAgICAgICAgICBsYW5ndWFnZTogJ0VDTUFTY3JpcHQnLFxuICAgICAgICAgICAgdGVzdEZyYW1ld29yazoge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdXZWJkcml2ZXJJTycsXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogYnNDb25maWcuYnN0YWNrU2VydmljZVZlcnNpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJvZHVjdF9tYXA6IGdldFByb2R1Y3RNYXBGb3JCdWlsZFN0YXJ0Q2FsbChiU3RhY2tDb25maWcsIGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uKSxcbiAgICAgICAgY29uZmlnOiB7fSxcbiAgICAgICAgdGVzdF9vcmNoZXN0cmF0aW9uOiBPcmNoZXN0cmF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoY29uZmlnKT8uZ2V0QnVpbGRTdGFydERhdGEoKSB8fCB7fSxcbiAgICAgICAgdGVzdF9tYW5hZ2VtZW50OiB7XG4gICAgICAgICAgICB0ZXN0X3BsYW5faWQ6IGdldFRlc3RQbGFuSWQob3B0aW9ucylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbiAmJiAoaXNUdXJib1NjYWxlKG9wdGlvbnMpIHx8IGRhdGEuYnJvd3NlcnN0YWNrQXV0b21hdGlvbiA9PT0gZmFsc2UpKXtcbiAgICAgICAgZGF0YS5hY2Nlc3NpYmlsaXR5LnNldHRpbmdzID8/PSB7fVxuICAgICAgICBkYXRhLmFjY2Vzc2liaWxpdHkuc2V0dGluZ3MuaW5jbHVkZUVuY29kZWRFeHRlbnNpb24gPSB0cnVlXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKENyYXNoUmVwb3J0ZXIudXNlckNvbmZpZ0ZvclJlcG9ydGluZykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBDcmFzaFJlcG9ydGVyLnVzZXJDb25maWdGb3JSZXBvcnRpbmcgPSBwcm9jZXNzLmVudi5VU0VSX0NPTkZJR19GT1JfUkVQT1JUSU5HICE9PSB1bmRlZmluZWQgPyBKU09OLnBhcnNlKHByb2Nlc3MuZW52LlVTRVJfQ09ORklHX0ZPUl9SRVBPUlRJTkcpIDoge31cbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBCU3RhY2tMb2dnZXIuZXJyb3IoYFtDcmFzaF9SZXBvcnRfVXBsb2FkXSBGYWlsZWQgdG8gcGFyc2UgdXNlciBjb25maWcgd2hpbGUgc2VuZGluZyBidWlsZCBzdGFydCBldmVudCBkdWUgdG8gJHtlcnJvcn1gKVxuICAgIH1cbiAgICBkYXRhLmNvbmZpZyA9IENyYXNoUmVwb3J0ZXIudXNlckNvbmZpZ0ZvclJlcG9ydGluZ1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJVXRpbHMuREFUQV9FTkRQT0lOVH0vYXBpL3YyL2J1aWxkc2BcbiAgICAgICAgY29uc3QgZW5jb2RlZEF1dGggPSBCdWZmZXIuZnJvbShgJHtnZXRPYnNlcnZhYmlsaXR5VXNlcihvcHRpb25zLCBjb25maWcpfToke2dldE9ic2VydmFiaWxpdHlLZXkob3B0aW9ucywgY29uZmlnKX1gLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgLi4uREVGQVVMVF9SRVFVRVNUX0NPTkZJRy5oZWFkZXJzLFxuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7ZW5jb2RlZEF1dGh9YCxcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QganNvblJlc3BvbnNlOiBMYXVuY2hSZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgICBkZWxldGUgZGF0YT8uYWNjZXNzaWJpbGl0eT8uc2V0dGluZ3M/LmluY2x1ZGVFbmNvZGVkRXh0ZW5zaW9uXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1N0YXJ0X0J1aWxkXSBTdWNjZXNzIHJlc3BvbnNlOiAke0pTT04uc3RyaW5naWZ5KGpzb25SZXNwb25zZSl9YClcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUZXN0IFBsYW4gSWQgc2VudCBpbiByZXF1ZXN0OiAke2dldFRlc3RQbGFuSWQob3B0aW9ucyl9YClcbiAgICAgICAgcHJvY2Vzcy5lbnZbVEVTVE9QU19CVUlMRF9DT01QTEVURURfRU5WXSA9ICd0cnVlJ1xuICAgICAgICBpZiAoanNvblJlc3BvbnNlLmp3dCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXSA9IGpzb25SZXNwb25zZS5qd3RcbiAgICAgICAgfVxuICAgICAgICBpZiAoanNvblJlc3BvbnNlLmJ1aWxkX2hhc2hlZF9pZCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF0gPSBqc29uUmVzcG9uc2UuYnVpbGRfaGFzaGVkX2lkXG4gICAgICAgICAgICBUZXN0T3BzQ29uZmlnLmdldEluc3RhbmNlKCkuYnVpbGRIYXNoZWRJZCA9IGpzb25SZXNwb25zZS5idWlsZF9oYXNoZWRfaWRcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGBUZXN0aHViIHN0YXJ0ZWQgd2l0aCBpZDogJHtUZXN0T3BzQ29uZmlnLmdldEluc3RhbmNlKCk/LmJ1aWxkSGFzaGVkSWR9YClcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzTGF1bmNoQnVpbGRSZXNwb25zZShqc29uUmVzcG9uc2UsIG9wdGlvbnMpXG4gICAgICAgIGxhdW5jaEJ1aWxkVXNhZ2Uuc3VjY2VzcygpXG4gICAgICAgIHJldHVybiBqc29uUmVzcG9uc2VcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFRlc3RIdWIgYnVpbGQgc3RhcnQgZmFpbGVkOiAke2Zvcm1hdChlcnJvcil9YClcbiAgICAgICAgaWYgKCEoZXJyb3IgYXMgRXJyb3IgJiB7IHN1Y2Nlc3M6IGJvb2xlYW4gfSkuc3VjY2Vzcykge1xuICAgICAgICAgICAgbGF1bmNoQnVpbGRVc2FnZS5mYWlsZWQoZXJyb3IpXG4gICAgICAgICAgICBsb2dCdWlsZEVycm9yKGVycm9yIGFzIEVycm9ycylcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICB9XG59KSlcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUNhcHNXaXRoQXBwQTExeSA9IChwbGF0Zm9ybU1ldGE/OiB7IFtrZXk6IHN0cmluZ106IGFueTsgfSkgPT4ge1xuICAgIC8qIENoZWNrIGlmIHRoZSBjdXJyZW50IGRyaXZlciBwbGF0Zm9ybSBpcyBlbGlnaWJsZSBmb3IgQXBwQWNjZXNzaWJpbGl0eSBzY2FuICovXG4gICAgaWYgKFxuICAgICAgICAocGxhdGZvcm1NZXRhPy5wbGF0Zm9ybV9uYW1lICYmIFN0cmluZyhwbGF0Zm9ybU1ldGE/LnBsYXRmb3JtX25hbWUpLnRvTG93ZXJDYXNlKCkgPT09ICdhbmRyb2lkJykgJiZcbiAgICAgICAgKHBsYXRmb3JtTWV0YT8ucGxhdGZvcm1fdmVyc2lvbiAmJiBwYXJzZUludChwbGF0Zm9ybU1ldGE/LnBsYXRmb3JtX3ZlcnNpb24/LnRvU3RyaW5nKCkpIDwgMTEpXG4gICAgKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBcHAgQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHRlc3RzIGFyZSBzdXBwb3J0ZWQgb24gT1MgdmVyc2lvbiAxMSBhbmQgYWJvdmUgZm9yIEFuZHJvaWQgZGV2aWNlcy4nKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUNhcHNXaXRoQTExeSA9IChkZXZpY2VOYW1lPzogYW55LCBwbGF0Zm9ybU1ldGE/OiB7IFtrZXk6IHN0cmluZ106IGFueTsgfSwgY2hyb21lT3B0aW9ucz86IGFueSkgPT4ge1xuICAgIC8qIENoZWNrIGlmIHRoZSBjdXJyZW50IGRyaXZlciBwbGF0Zm9ybSBpcyBlbGlnaWJsZSBmb3IgQWNjZXNzaWJpbGl0eSBzY2FuICovXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGRldmljZU5hbWUpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gd2lsbCBydW4gb25seSBvbiBEZXNrdG9wIGJyb3dzZXJzLicpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwbGF0Zm9ybU1ldGE/LmJyb3dzZXJfbmFtZT8udG9Mb3dlckNhc2UoKSAhPT0gJ2Nocm9tZScpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gd2lsbCBydW4gb25seSBvbiBDaHJvbWUgYnJvd3NlcnMuJylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJyb3dzZXJWZXJzaW9uID0gcGxhdGZvcm1NZXRhPy5icm93c2VyX3ZlcnNpb25cbiAgICAgICAgaWYgKCAhaXNVbmRlZmluZWQoYnJvd3NlclZlcnNpb24pICYmICEoYnJvd3NlclZlcnNpb24gPT09ICdsYXRlc3QnIHx8IHBhcnNlRmxvYXQoYnJvd3NlclZlcnNpb24gKyAnJykgPiA5NCkpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gd2lsbCBydW4gb25seSBvbiBDaHJvbWUgYnJvd3NlciB2ZXJzaW9uIGdyZWF0ZXIgdGhhbiA5NC4nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hyb21lT3B0aW9ucz8uYXJncz8uaW5jbHVkZXMoJy0taGVhZGxlc3MnKSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0FjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB3aWxsIG5vdCBydW4gb24gbGVnYWN5IGhlYWRsZXNzIG1vZGUuIFN3aXRjaCB0byBuZXcgaGVhZGxlc3MgbW9kZSBvciBhdm9pZCB1c2luZyBoZWFkbGVzcyBtb2RlLicpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXhjZXB0aW9uIGluIGNoZWNraW5nIGNhcGFiaWxpdGllcyBjb21wYXRpYmlsaXR5IHdpdGggQWNjZXNzaWJpbGl0eS4gRXJyb3I6ICR7ZXJyb3J9YClcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUNhcHNXaXRoTm9uQnN0YWNrQTExeSA9IChicm93c2VyTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZCwgYnJvd3NlclZlcnNpb24/OnN0cmluZyB8IHVuZGVmaW5lZCApICA9PiB7XG5cbiAgICBpZiAoYnJvd3Nlck5hbWU/LnRvTG93ZXJDYXNlKCkgIT09ICdjaHJvbWUnKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gd2lsbCBydW4gb25seSBvbiBDaHJvbWUgYnJvd3NlcnMuJylcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICghaXNVbmRlZmluZWQoYnJvd3NlclZlcnNpb24pICYmICEoYnJvd3NlclZlcnNpb24gPT09ICdsYXRlc3QnIHx8IHBhcnNlRmxvYXQoYnJvd3NlclZlcnNpb24gKyAnJykgPiAxMDApKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gd2lsbCBydW4gb25seSBvbiBDaHJvbWUgYnJvd3NlciB2ZXJzaW9uIGdyZWF0ZXIgdGhhbiAxMDAuJylcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG5cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFNjYW5UZXN0Rm9yQWNjZXNzaWJpbGl0eSA9IChzdWl0ZVRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlc3RUaXRsZTogc3RyaW5nLCBhY2Nlc3NpYmlsaXR5T3B0aW9ucz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9LCB3b3JsZD86IHsgW2tleTogc3RyaW5nXTogdW5rbm93bjsgfSwgaXNDdWN1bWJlcj86IGJvb2xlYW4gKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaW5jbHVkZVRhZ3MgPSBBcnJheS5pc0FycmF5KGFjY2Vzc2liaWxpdHlPcHRpb25zPy5pbmNsdWRlVGFnc0luVGVzdGluZ1Njb3BlKSA/IGFjY2Vzc2liaWxpdHlPcHRpb25zPy5pbmNsdWRlVGFnc0luVGVzdGluZ1Njb3BlIDogW11cbiAgICAgICAgY29uc3QgZXhjbHVkZVRhZ3MgPSBBcnJheS5pc0FycmF5KGFjY2Vzc2liaWxpdHlPcHRpb25zPy5leGNsdWRlVGFnc0luVGVzdGluZ1Njb3BlKSA/IGFjY2Vzc2liaWxpdHlPcHRpb25zPy5leGNsdWRlVGFnc0luVGVzdGluZ1Njb3BlIDogW11cblxuICAgICAgICBpZiAoaXNDdWN1bWJlcikge1xuICAgICAgICAgICAgY29uc3QgdGFnc0xpc3Q6IHN0cmluZ1tdID0gW11cbiAgICAgICAgICAgIDsod29ybGQ/LnBpY2tsZSBhcyB7IHRhZ3M6IHsgbmFtZTogc3RyaW5nIH1bXSB9KT8udGFncy5tYXAoKHRhZzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0pID0+IHRhZ3NMaXN0LnB1c2godGFnLm5hbWUpKVxuICAgICAgICAgICAgY29uc3QgZXhjbHVkZWQgPSBleGNsdWRlVGFncz8uc29tZSgoZXhjbHVkZSkgPT4gdGFnc0xpc3QuaW5jbHVkZXMoZXhjbHVkZSkpXG4gICAgICAgICAgICBjb25zdCBpbmNsdWRlZCA9IGluY2x1ZGVUYWdzPy5sZW5ndGggPT09IDAgfHwgaW5jbHVkZVRhZ3M/LnNvbWUoKGluY2x1ZGUpID0+IHRhZ3NMaXN0LmluY2x1ZGVzKGluY2x1ZGUpKVxuXG4gICAgICAgICAgICByZXR1cm4gIWV4Y2x1ZGVkICYmIGluY2x1ZGVkXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmdWxsVGVzdE5hbWUgPSBzdWl0ZVRpdGxlICsgJyAnICsgdGVzdFRpdGxlXG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVkID0gZXhjbHVkZVRhZ3M/LnNvbWUoKGV4Y2x1ZGUpID0+IGZ1bGxUZXN0TmFtZS5pbmNsdWRlcyhleGNsdWRlKSlcbiAgICAgICAgY29uc3QgaW5jbHVkZWQgPSBpbmNsdWRlVGFncz8ubGVuZ3RoID09PSAwIHx8IGluY2x1ZGVUYWdzPy5zb21lKChpbmNsdWRlKSA9PiBmdWxsVGVzdE5hbWUuaW5jbHVkZXMoaW5jbHVkZSkpXG5cbiAgICAgICAgcmV0dXJuICFleGNsdWRlZCAmJiBpbmNsdWRlZFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3Igd2hpbGUgdmFsaWRhdGluZyB0ZXN0IGNhc2UgZm9yIGFjY2Vzc2liaWxpdHkgYmVmb3JlIHNjYW5uaW5nLiBFcnJvciA6ICR7ZXJyb3J9YClcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBpc0FjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbiA9IChhY2Nlc3NpYmlsaXR5RmxhZz86IGJvb2xlYW4gfCBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGFzQTExeUp3dFRva2VuID0gdHlwZW9mIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCA9PT0gJ3N0cmluZycgJiYgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldULmxlbmd0aCA+IDAgJiYgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldUICE9PSAnbnVsbCcgJiYgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldUICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICByZXR1cm4gYWNjZXNzaWJpbGl0eUZsYWcgJiYgaGFzQTExeUp3dFRva2VuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFeGNlcHRpb24gaW4gdmVyaWZ5aW5nIHRoZSBBY2Nlc3NpYmlsaXR5IHNlc3Npb24gd2l0aCBlcnJvciA6ICR7ZXJyb3J9YClcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBBUFBfQVVUT01BVEVfQ0FQX0tFWVMgPSBbJ2FwcGl1bTphcHAnLCAnYXBwaXVtOmJ1bmRsZUlkJywgJ2FwcGl1bTphcHBQYWNrYWdlJywgJ2FwcGl1bTphcHBBY3Rpdml0eSddIGFzIGNvbnN0XG5cbi8vIEFuIEFwcCBBdXRvbWF0ZSBzZXNzaW9uIGlzIGlkZW50aWZpZWQgYnkgYW4gYXBwIGNhcGFiaWxpdHkgb24gdGhlIGRyaXZlciBjYXBzXG4vLyAoYXBwaXVtOmFwcCAvIGFwcGl1bTpidW5kbGVJZCAvIGFwcGl1bTphcHBQYWNrYWdlIC8gYXBwaXVtOmFwcEFjdGl2aXR5IC8gYXBwaXVtOm9wdGlvbnMuYXBwKS5cbi8vIFNoYXJlZCBieSBjb25maWctdGltZSBkZXRlY3Rpb24gYW5kIHRoZSBDTEkgQXV0b21hdGUvUGVyY3kgbW9kdWxlcyBzbyBBcHAtQXV0b21hdGVcbi8vIGVuZHBvaW50IHJvdXRpbmcgc3RheXMgY29uc2lzdGVudCBhY3Jvc3MgZXZlcnkgcGxhY2UgdGhhdCByZXNvbHZlcyBpdCBmcm9tIGNhcGFiaWxpdGllcy5cbmV4cG9ydCBmdW5jdGlvbiBoYXNBcHBDYXAoY2FwPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjYXAgfHwgdHlwZW9mIGNhcCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IHJlY29yZCA9IGNhcCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIGlmIChBUFBfQVVUT01BVEVfQ0FQX0tFWVMuc29tZShrZXkgPT4gIWlzVW5kZWZpbmVkKHJlY29yZFtrZXldKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgY29uc3QgYXBwaXVtT3B0aW9ucyA9IHJlY29yZFsnYXBwaXVtOm9wdGlvbnMnXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZFxuICAgIHJldHVybiAhIShhcHBpdW1PcHRpb25zICYmICFpc1VuZGVmaW5lZChhcHBpdW1PcHRpb25zLmFwcCkpXG59XG5cbmV4cG9ydCBjb25zdCBpc0FwcEFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbiA9IChhY2Nlc3NpYmlsaXR5RmxhZz86IGJvb2xlYW4gfCBzdHJpbmcsIGlzQXBwQXV0b21hdGU/OiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgYWNjZXNzaWJpbGl0eUF1dG9tYXRpb24gPSBpc0FjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihhY2Nlc3NpYmlsaXR5RmxhZylcbiAgICByZXR1cm4gYWNjZXNzaWJpbGl0eUF1dG9tYXRpb24gJiYgaXNBcHBBdXRvbWF0ZVxufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0U3RyaW5nID0gKHRlbXBsYXRlOiAoc3RyaW5nIHwgbnVsbCksIC4uLnZhbHVlczogKHN0cmluZyB8IG51bGwpW10pOiBzdHJpbmcgPT4ge1xuICAgIGxldCBpID0gMFxuICAgIGlmICh0ZW1wbGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJydcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoLyVzL2csICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaSsrXVxuICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogJydcbiAgICB9KVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNvbnN0IF9nZXRQYXJhbXNGb3JBcHBBY2Nlc3NpYmlsaXR5ID0gKCBjb21tYW5kTmFtZT86IHN0cmluZywgdGVzdE5hbWU/OiBzdHJpbmcsIGhvb2tSdW5VdWlkPzogc3RyaW5nIHwgbnVsbCApOiB7IHRoVGVzdFJ1blV1aWQ6IGFueSwgdGhIb29rUnVuVXVpZDogYW55LCB0aEJ1aWxkVXVpZDogYW55LCB0aEp3dFRva2VuOiBhbnksIGF1dGhIZWFkZXI6IGFueSwgc2NhblRpbWVzdGFtcDogbnVtYmVyLCBtZXRob2Q6IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVzdE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCAgfSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3RoVGVzdFJ1blV1aWQnOiBwcm9jZXNzLmVudi5URVNUX0FOQUxZVElDU19JRCxcbiAgICAgICAgLy8gUHJlc2VudCBvbmx5IHdoZW4gdGhlIHNjYW4gZmlyZXMgaW5zaWRlIGEgaG9vayAoZHJvcHBlZCBieSBKU09OLnN0cmluZ2lmeSB3aGVuIHVuZGVmaW5lZCxcbiAgICAgICAgLy8gc28gaW4tdGVzdCBzY2FucyBhcmUgdW5jaGFuZ2VkKS4gU2VsZW5pdW1IdWIgYXBwQWxseUhhbmRsZXIgcmVsYXlzIHRoaXMgYXMgYGhvb2tfcnVuX3V1aWRgLlxuICAgICAgICAndGhIb29rUnVuVXVpZCc6IGhvb2tSdW5VdWlkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgJ3RoQnVpbGRVdWlkJzogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRCxcbiAgICAgICAgJ3RoSnd0VG9rZW4nOiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsXG4gICAgICAgICdhdXRoSGVhZGVyJzogcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldULFxuICAgICAgICAnc2NhblRpbWVzdGFtcCc6IERhdGUubm93KCksXG4gICAgICAgICdtZXRob2QnOiBjb21tYW5kTmFtZSxcbiAgICAgICAgJ3Rlc3ROYW1lJzogdGVzdE5hbWVcbiAgICB9XG59XG5cbi8qIGVzbGludC1kaXNhYmxlICBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5leHBvcnQgY29uc3QgcGVyZm9ybUExMXlTY2FuID0gYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIgfCBXZWJkcml2ZXJJTy5NdWx0aVJlbW90ZUJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcsICBjb21tYW5kTmFtZT86IHN0cmluZywgdGVzdE5hbWU/OiBzdHJpbmcsIGhvb2tSdW5VdWlkPzogc3RyaW5nIHwgbnVsbCwpIDogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IGFueTsgfSB8IHVuZGVmaW5lZD4gPT4ge1xuXG4gICAgaWYgKCFpc0FjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHkpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCBwZXJmb3JtIEFjY2Vzc2liaWxpdHkgc2Nhbi4nKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBpZiAoaXNBcHBBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5LCBpc0FwcEF1dG9tYXRlKSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0czogdW5rbm93biA9IGF3YWl0IChicm93c2VyIGFzIFdlYmRyaXZlcklPLkJyb3dzZXIpLmV4ZWN1dGUoZm9ybWF0U3RyaW5nKEFjY2Vzc2liaWxpdHlTY3JpcHRzLnBlcmZvcm1TY2FuLCBKU09OLnN0cmluZ2lmeShfZ2V0UGFyYW1zRm9yQXBwQWNjZXNzaWJpbGl0eShjb21tYW5kTmFtZSwgdGVzdE5hbWUsIGhvb2tSdW5VdWlkKSkpIGFzIHN0cmluZywge30pXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcodXRpbC5mb3JtYXQocmVzdWx0cyBhcyBzdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuICggcmVzdWx0cyBhcyB7IFtrZXk6IHN0cmluZ106IGFueTsgfSB8IHVuZGVmaW5lZCApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlTY3JpcHRzLnBlcmZvcm1TY2FuKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZXhlY3V0ZUFjY2Vzc2liaWxpdHlTY3JpcHQoYnJvd3NlciwgQWNjZXNzaWJpbGl0eVNjcmlwdHMucGVyZm9ybVNjYW4sIHsgbWV0aG9kOiBjb21tYW5kTmFtZSB8fCAnJyB9KVxuICAgICAgICAgICAgcmV0dXJuICggcmVzdWx0cyBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd247IH0gfCB1bmRlZmluZWQgKVxuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignQWNjZXNzaWJpbGl0eVNjcmlwdHMucGVyZm9ybVNjYW4gaXMgbnVsbCcpXG4gICAgICAgIHJldHVyblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0FjY2Vzc2liaWxpdHkgU2NhbiBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIDogJyArIGVycilcbiAgICAgICAgcmV0dXJuXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0QTExeVJlc3VsdHMgPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLkExMVlfRVZFTlRTLkdFVF9SRVNVTFRTLCBhc3luYyAoaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgaXNCcm93c2VyU3RhY2tTZXNzaW9uPzogYm9vbGVhbiwgaXNBY2Nlc3NpYmlsaXR5PzogYm9vbGVhbiB8IHN0cmluZykgOiBQcm9taXNlPEFycmF5PHsgW2tleTogc3RyaW5nXTogYW55OyB9Pj4gPT4ge1xuXG4gICAgaWYgKCFpc0FjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHkpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMuJylcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdQZXJmb3JtaW5nIHNjYW4gYmVmb3JlIGdldHRpbmcgcmVzdWx0cycpXG4gICAgICAgIGF3YWl0IHBlcmZvcm1BMTF5U2Nhbihpc0FwcEF1dG9tYXRlLCBicm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24sIGlzQWNjZXNzaWJpbGl0eSlcbiAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHM6IEFycmF5PHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9PiA9IGF3YWl0IGV4ZWN1dGVBY2Nlc3NpYmlsaXR5U2NyaXB0KGJyb3dzZXIsIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHMpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignQWNjZXNzaWJpbGl0eVNjcmlwdHMuZ2V0UmVzdWx0cyBpcyBudWxsJylcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ05vIGFjY2Vzc2liaWxpdHkgcmVzdWx0cyB3ZXJlIGZvdW5kLicpXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgZ2V0QTExeVJlc3VsdHMgRmFpbGVkLiBFcnJvcjogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG59KVxuXG5leHBvcnQgY29uc3QgZ2V0QXBwQTExeVJlc3VsdHMgPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLkExMVlfRVZFTlRTLkdFVF9SRVNVTFRTLCBhc3luYyAoaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgIHRlc3ROYW1lOiBzdHJpbmcsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcsIHNlc3Npb25JZD86IHN0cmluZyB8IG51bGwpIDogUHJvbWlzZTxBcnJheTx7IFtrZXk6IHN0cmluZ106IGFueTsgfT4+ID0+IHtcbiAgICBpZiAoIWlzQnJvd3NlclN0YWNrU2Vzc2lvbikge1xuICAgICAgICByZXR1cm4gW10gLy8gc2luY2Ugd2UgYXJlIHJ1bm5pbmcgb25seSBvbiBBdXRvbWF0ZSBhcyBvZiBub3dcbiAgICB9XG5cbiAgICBpZiAoIWlzQXBwQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGlzQWNjZXNzaWJpbGl0eSwgaXNBcHBBdXRvbWF0ZSkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ05vdCBhbiBBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gc2Vzc2lvbiwgY2Fubm90IHJldHJpZXZlIEFjY2Vzc2liaWxpdHkgcmVzdWx0cyBzdW1tYXJ5LicpXG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke0FQSVV0aWxzLkFQUF9BTExZX0VORFBPSU5UfS8ke0FQUF9BTExZX0lTU1VFU19FTkRQT0lOVH1gXG4gICAgICAgIGNvbnN0IGFwaVJlc3BvbmUgPSBhd2FpdCBnZXRBcHBBMTF5UmVzdWx0UmVzcG9uc2UoYXBpVXJsLCBpc0FwcEF1dG9tYXRlLCBicm93c2VyLCB0ZXN0TmFtZSwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHksIHNlc3Npb25JZClcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBpUmVzcG9uZT8uZGF0YT8uZGF0YT8uaXNzdWVzXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgUG9sbGluZyBSZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkgIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdObyBhY2Nlc3NpYmlsaXR5IHN1bW1hcnkgd2FzIGZvdW5kLicpXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgZ2V0QXBwQTExeVJlc3VsdHMgRmFpbGVkLiBFcnJvcjogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG59KVxuXG5leHBvcnQgY29uc3QgZ2V0QXBwQTExeVJlc3VsdHNTdW1tYXJ5ID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5BMTFZX0VWRU5UUy5HRVRfUkVTVUxUU19TVU1NQVJZLCBhc3luYyAoaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgdGVzdE5hbWU6IHN0cmluZywgaXNCcm93c2VyU3RhY2tTZXNzaW9uPzogYm9vbGVhbiwgaXNBY2Nlc3NpYmlsaXR5PzogYm9vbGVhbiB8IHN0cmluZywgc2Vzc2lvbklkPzogc3RyaW5nIHwgbnVsbCkgOiBQcm9taXNlPHsgW2tleTogc3RyaW5nXTogYW55OyB9PiA9PiB7XG4gICAgaWYgKCFpc0Jyb3dzZXJTdGFja1Nlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHt9IC8vIHNpbmNlIHdlIGFyZSBydW5uaW5nIG9ubHkgb24gQXV0b21hdGUgYXMgb2Ygbm93XG4gICAgfVxuXG4gICAgaWYgKCFpc0FwcEFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHksIGlzQXBwQXV0b21hdGUpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMgc3VtbWFyeS4nKVxuICAgICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHtBUElVdGlscy5BUFBfQUxMWV9FTkRQT0lOVH0vJHtBUFBfQUxMWV9JU1NVRVNfU1VNTUFSWV9FTkRQT0lOVH1gXG4gICAgICAgIGNvbnN0IGFwaVJlc3BvbmUgPSBhd2FpdCBnZXRBcHBBMTF5UmVzdWx0UmVzcG9uc2UoYXBpVXJsLCBpc0FwcEF1dG9tYXRlLCBicm93c2VyLCB0ZXN0TmFtZSwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHksIHNlc3Npb25JZClcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBpUmVzcG9uZT8uZGF0YT8uZGF0YT8uc3VtbWFyeVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFBvbGxpbmcgUmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0gY2F0Y2gge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ05vIGFjY2Vzc2liaWxpdHkgc3VtbWFyeSB3YXMgZm91bmQuJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxufSlcblxuY29uc3QgZ2V0QXBwQTExeVJlc3VsdFJlc3BvbnNlID0gYXN5bmMgKGFwaVVybDogc3RyaW5nLCBpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyLCB0ZXN0TmFtZTogc3RyaW5nLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nLCBzZXNzaW9uSWQ/OiBzdHJpbmcgfCBudWxsKSA6IFByb21pc2U8UG9sbGluZ1Jlc3VsdD4gPT4ge1xuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnUGVyZm9ybWluZyBzY2FuIGJlZm9yZSBnZXR0aW5nIHJlc3VsdHMgc3VtbWFyeScpXG4gICAgYXdhaXQgcGVyZm9ybUExMXlTY2FuKGlzQXBwQXV0b21hdGUsIGJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbiwgaXNBY2Nlc3NpYmlsaXR5LCB1bmRlZmluZWQsIHRlc3ROYW1lKVxuICAgIGNvbnN0IHVwcGVyVGltZUxpbWl0ID0gcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfUE9MTElOR19USU1FT1VUID8gRGF0ZS5ub3coKSArIHBhcnNlSW50KHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1BPTExJTkdfVElNRU9VVCkgKiAxMDAwIDogRGF0ZS5ub3coKSArIDMwMDAwXG4gICAgY29uc3QgcGFyYW1zID0geyB0ZXN0X3J1bl91dWlkOiBwcm9jZXNzLmVudi5URVNUX0FOQUxZVElDU19JRCwgc2Vzc2lvbl9pZDogc2Vzc2lvbklkLCB0aW1lc3RhbXA6IERhdGUubm93KCkgfSAvLyBRdWVyeSBwYXJhbXMgdG8gcGFzc1xuICAgIGNvbnN0IGhlYWRlciA9IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Byb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVH1gIH1cbiAgICBjb25zdCBhcGlSZXNwb25lID0gYXdhaXQgcG9sbEFwaShhcGlVcmwsIHBhcmFtcywgaGVhZGVyLCB1cHBlclRpbWVMaW1pdClcbiAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFBvbGxpbmcgUmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KGFwaVJlc3BvbmUpfWApXG4gICAgcmV0dXJuIGFwaVJlc3BvbmVcbn1cblxuZXhwb3J0IGNvbnN0IGdldEExMXlSZXN1bHRzU3VtbWFyeSA9IFBlcmZvcm1hbmNlVGVzdGVyLm1lYXN1cmVXcmFwcGVyKFBFUkZPUk1BTkNFX1NES19FVkVOVFMuQTExWV9FVkVOVFMuR0VUX1JFU1VMVFNfU1VNTUFSWSwgYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcpIDogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IGFueTsgfT4gPT4ge1xuXG4gICAgaWYgKCFpc0FjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHkpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMgc3VtbWFyeS4nKVxuICAgICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1BlcmZvcm1pbmcgc2NhbiBiZWZvcmUgZ2V0dGluZyByZXN1bHRzIHN1bW1hcnknKVxuICAgICAgICBhd2FpdCBwZXJmb3JtQTExeVNjYW4oaXNBcHBBdXRvbWF0ZSwgYnJvd3NlciwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHkpXG4gICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzU3VtbWFyeSkge1xuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeVJlc3VsdHM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93bjsgfSA9IGF3YWl0IGV4ZWN1dGVBY2Nlc3NpYmlsaXR5U2NyaXB0KGJyb3dzZXIsIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHNTdW1tYXJ5KVxuICAgICAgICAgICAgcmV0dXJuIHN1bW1hcnlSZXN1bHRzXG4gICAgICAgIH1cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzU3VtbWFyeSBpcyBudWxsJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignTm8gYWNjZXNzaWJpbGl0eSBzdW1tYXJ5IHdhcyBmb3VuZC4nKVxuICAgICAgICByZXR1cm4ge31cbiAgICB9XG59KVxuXG5leHBvcnQgY29uc3Qgc3RvcEJ1aWxkVXBzdHJlYW0gPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLlRFU1RIVUJfRVZFTlRTLlNUT1AsIG8xMXlFcnJvckhhbmRsZXIoYXN5bmMgZnVuY3Rpb24gc3RvcEJ1aWxkVXBzdHJlYW0oKSB7XG4gICAgY29uc3Qgc3RvcEJ1aWxkVXNhZ2UgPSBVc2FnZVN0YXRzLmdldEluc3RhbmNlKCkuc3RvcEJ1aWxkVXNhZ2VcbiAgICBzdG9wQnVpbGRVc2FnZS50cmlnZ2VyZWQoKVxuICAgIGlmICghcHJvY2Vzcy5lbnZbVEVTVE9QU19CVUlMRF9DT01QTEVURURfRU5WXSkge1xuICAgICAgICBzdG9wQnVpbGRVc2FnZS5mYWlsZWQoJ0J1aWxkIGlzIG5vdCBjb21wbGV0ZWQgeWV0JylcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdCdWlsZCBpcyBub3QgY29tcGxldGVkIHlldCdcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXSkge1xuICAgICAgICBzdG9wQnVpbGRVc2FnZS5mYWlsZWQoJ1Rva2VuL2J1aWxkSUQgaXMgdW5kZWZpbmVkLCBidWlsZCBjcmVhdGlvbiBtaWdodCBoYXZlIGZhaWxlZCcpXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnW1NUT1BfQlVJTERdIE1pc3NpbmcgQXV0aGVudGljYXRpb24gVG9rZW4vIEJ1aWxkIElEJylcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUb2tlbi9idWlsZElEIGlzIHVuZGVmaW5lZCwgYnVpbGQgY3JlYXRpb24gbWlnaHQgaGF2ZSBmYWlsZWQnXG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgICdzdG9wX3RpbWUnOiAobmV3IERhdGUoKSkudG9JU09TdHJpbmcoKVxuICAgIH1cbiAgICAvLyBTdGFtcCB0aGUga2lsbCByZWFzb24gb250byB0aGUgYnVpbGQgcmVjb3JkIHNvIHRlcm1pbmF0ZWQgcnVucyBhcmVcbiAgICAvLyBpZGVudGlmaWFibGUgc2VydmVyLXNpZGUsIG5vdCBvbmx5IHZpYSB0aGUgYW5hbHl0aWNzIGZ1bm5lbC5cbiAgICBjb25zdCBraWxsU2lnbmFsID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0tJTExfU0lHTkFMXVxuICAgIGlmIChraWxsU2lnbmFsKSB7XG4gICAgICAgIGRhdGEuZmluaXNoZWRfbWV0YWRhdGEgPSBbeyByZWFzb246ICd1c2VyX2tpbGxlZCcsIHNpZ25hbDoga2lsbFNpZ25hbCB9XVxuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke0FQSVV0aWxzLkRBVEFfRU5EUE9JTlR9L2FwaS92MS9idWlsZHMvJHtwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXX0vc3RvcGBcbiAgICAvLyBTREstNzA2MTogdGhlIGJ1aWxkLXN0b3AgUFVUIGlzIHRoZSBzaWduYWwgdGhhdCBjbG9zZXMgdGhlIFRSQSBidWlsZC4gQSBzaW5nbGVcbiAgICAvLyBiZXN0LWVmZm9ydCByZXF1ZXN0IG1lYW5zIGEgdHJhbnNpZW50IGZhaWx1cmUvdGltZW91dCBsZWF2ZXMgdGhlIGJ1aWxkIHJ1bm5pbmdcbiAgICAvLyB1bnRpbCB0aGUgfjYwLW1pbiBzZXJ2ZXItc2lkZSBpbmFjdGl2aXR5IHRpbWVvdXQuIFJldHJ5IHdpdGggYmFja29mZiBhbmQgdHJlYXQgYVxuICAgIC8vIG5vbi0yeHggcmVzcG9uc2UgYXMgYSBmYWlsdXJlIHNvIHRoZSBidWlsZCByZWxpYWJseSByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUuXG4gICAgY29uc3QgbWF4QXR0ZW1wdHMgPSAzXG4gICAgbGV0IGxhc3RFcnJvcjogdW5rbm93blxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7cHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXX1gXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbU1RPUF9CVUlMRF0gU3VjY2VzcyByZXNwb25zZTogJHthd2FpdCByZXNwb25zZS50ZXh0KCl9YClcbiAgICAgICAgICAgIHN0b3BCdWlsZFVzYWdlLnN1Y2Nlc3MoKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgbGFzdEVycm9yID0gZXJyb3JcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1NUT1BfQlVJTERdIEF0dGVtcHQgJHthdHRlbXB0fS8ke21heEF0dGVtcHRzfSBmYWlsZWQuIEVycm9yOiAke2Vycm9yfWApXG4gICAgICAgICAgICBpZiAoYXR0ZW1wdCA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwICogYXR0ZW1wdCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RvcEJ1aWxkVXNhZ2UuZmFpbGVkKGxhc3RFcnJvcilcbiAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtTVE9QX0JVSUxEXSBGYWlsZWQgYWZ0ZXIgJHttYXhBdHRlbXB0c30gYXR0ZW1wdHMuIEVycm9yOiAke2xhc3RFcnJvcn1gKVxuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgbWVzc2FnZTogKGxhc3RFcnJvciBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gJ3N0b3AgYnVpbGQgZmFpbGVkJ1xuICAgIH1cbn0pKVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2lJbmZvICgpIHtcbiAgICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudlxuICAgIC8vIEplbmtpbnNcbiAgICBpZiAoKHR5cGVvZiBlbnYuSkVOS0lOU19VUkwgPT09ICdzdHJpbmcnICYmIGVudi5KRU5LSU5TX1VSTC5sZW5ndGggPiAwKSB8fCAodHlwZW9mIGVudi5KRU5LSU5TX0hPTUUgPT09ICdzdHJpbmcnICYmIGVudi5KRU5LSU5TX0hPTUUubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdKZW5raW5zJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkJVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9OVU1CRVJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDaXJjbGVDSVxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LkNJUkNMRUNJKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0NpcmNsZUNJJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkNJUkNMRV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkNJUkNMRV9KT0IsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5DSVJDTEVfQlVJTERfTlVNXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVHJhdmlzIENJXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuVFJBVklTKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1RyYXZpcyBDSScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5UUkFWSVNfQlVJTERfV0VCX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuVFJBVklTX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuVFJBVklTX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvZGVzaGlwXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQ29kZXNoaXAnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBudWxsLFxuICAgICAgICAgICAgam9iX25hbWU6IG51bGwsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IG51bGxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCaXRidWNrZXRcbiAgICBpZiAoZW52LkJJVEJVQ0tFVF9CUkFOQ0ggJiYgZW52LkJJVEJVQ0tFVF9DT01NSVQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdCaXRidWNrZXQnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQklUQlVDS0VUX0dJVF9IVFRQX09SSUdJTixcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQklUQlVDS0VUX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIERyb25lXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuRFJPTkUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnRHJvbmUnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuRFJPTkVfQlVJTERfTElOSyxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuRFJPTkVfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2VtYXBob3JlXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuU0VNQVBIT1JFKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1NlbWFwaG9yZScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5TRU1BUEhPUkVfT1JHQU5JWkFUSU9OX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU0VNQVBIT1JFX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuU0VNQVBIT1JFX0pPQl9JRFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEdpdExhYlxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LkdJVExBQl9DSSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdHaXRMYWInLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQ0lfSk9CX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQ0lfSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5DSV9KT0JfSURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCdWlsZGtpdGVcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgaXNUcnVlKGVudi5CVUlMREtJVEUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQnVpbGRraXRlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkJVSUxES0lURV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkJVSUxES0lURV9MQUJFTCB8fCBlbnYuQlVJTERLSVRFX1BJUEVMSU5FX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMREtJVEVfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVmlzdWFsIFN0dWRpbyBUZWFtIFNlcnZpY2VzXG4gICAgaWYgKGlzVHJ1ZShlbnYuVEZfQlVJTEQpICYmIGVudi5URl9CVUlMRF9CVUlMRE5VTUJFUikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1Zpc3VhbCBTdHVkaW8gVGVhbSBTZXJ2aWNlcycsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5TWVNURU1fVEVBTUZPVU5EQVRJT05TRVJWRVJVUkl9JHtlbnYuU1lTVEVNX1RFQU1QUk9KRUNUSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU1lTVEVNX0RFRklOSVRJT05JRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0JVSUxESURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBcHB2ZXlvclxuICAgIGlmIChpc1RydWUoZW52LkFQUFZFWU9SKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0FwcHZleW9yJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYCR7ZW52LkFQUFZFWU9SX1VSTH0vcHJvamVjdC8ke2Vudi5BUFBWRVlPUl9BQ0NPVU5UX05BTUV9LyR7ZW52LkFQUFZFWU9SX1BST0pFQ1RfU0xVR30vYnVpbGRzLyR7ZW52LkFQUFZFWU9SX0JVSUxEX0lEfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkFQUFZFWU9SX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQVBQVkVZT1JfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQXp1cmUgQ0lcbiAgICBpZiAoZW52LkFaVVJFX0hUVFBfVVNFUl9BR0VOVCAmJiBlbnYuVEZfQlVJTEQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdBenVyZSBDSScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5TWVNURU1fVEVBTUZPVU5EQVRJT05TRVJWRVJVUkl9JHtlbnYuU1lTVEVNX1RFQU1QUk9KRUNUSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQlVJTERfQlVJTERJRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0JVSUxESURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBV1MgQ29kZUJ1aWxkXG4gICAgaWYgKGVudi5DT0RFQlVJTERfQlVJTERfSUQgfHwgZW52LkNPREVCVUlMRF9SRVNPTFZFRF9TT1VSQ0VfVkVSU0lPTiB8fCBlbnYuQ09ERUJVSUxEX1NPVVJDRV9WRVJTSU9OKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQVdTIENvZGVCdWlsZCcsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5DT0RFQlVJTERfUFVCTElDX0JVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQ09ERUJVSUxEX0JVSUxEX0lELFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ09ERUJVSUxEX0JVSUxEX0lEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQmFtYm9vXG4gICAgaWYgKGVudi5iYW1ib29fYnVpbGROdW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdCYW1ib28nLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuYmFtYm9vX2J1aWxkUmVzdWx0c1VybCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuYmFtYm9vX3Nob3J0Sm9iTmFtZSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LmJhbWJvb19idWlsZE51bWJlclxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFdlcmNrZXJcbiAgICBpZiAoZW52LldFUkNLRVIgfHwgZW52LldFUkNLRVJfTUFJTl9QSVBFTElORV9TVEFSVEVEKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnV2VyY2tlcicsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5XRVJDS0VSX0JVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuV0VSQ0tFUl9NQUlOX1BJUEVMSU5FX1NUQVJURUQgPyAnTWFpbiBQaXBlbGluZScgOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuV0VSQ0tFUl9HSVRfQ09NTUlUXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR29vZ2xlIENsb3VkXG4gICAgaWYgKGVudi5HQ1BfUFJPSkVDVCB8fCBlbnYuR0NMT1VEX1BST0pFQ1QgfHwgZW52LkdPT0dMRV9DTE9VRF9QUk9KRUNUKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnR29vZ2xlIENsb3VkJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuUFJPSkVDVF9JRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0lELFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNoaXBwYWJsZVxuICAgIGlmIChlbnYuU0hJUFBBQkxFKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnU2hpcHBhYmxlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LlNISVBQQUJMRV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlNISVBQQUJMRV9KT0JfSUQgPyBgSm9iICMke2Vudi5TSElQUEFCTEVfSk9CX0lEfWAgOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuU0hJUFBBQkxFX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE5ldGxpZnlcbiAgICBpZiAoaXNUcnVlKGVudi5ORVRMSUZZKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ05ldGxpZnknLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuREVQTE9ZX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU0lURV9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERfSURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBHaXRodWIgQWN0aW9uc1xuICAgIGlmIChpc1RydWUoZW52LkdJVEhVQl9BQ1RJT05TKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0dpdEh1YiBBY3Rpb25zJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYCR7ZW52LkdJVEhVQl9TRVJWRVJfVVJMfS8ke2Vudi5HSVRIVUJfUkVQT1NJVE9SWX0vYWN0aW9ucy9ydW5zLyR7ZW52LkdJVEhVQl9SVU5fSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuR0lUSFVCX1dPUktGTE9XLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuR0lUSFVCX1JVTl9JRCxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBWZXJjZWxcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgZW52LlZFUkNFTCA9PT0gJzEnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnVmVyY2VsJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYGh0dHA6Ly8ke2Vudi5WRVJDRUxfVVJMfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogbnVsbCxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUZWFtY2l0eVxuICAgIGlmIChlbnYuVEVBTUNJVFlfVkVSU0lPTikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1RlYW1jaXR5JyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERfTlVNQkVSLFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvbmNvdXJzZVxuICAgIGlmIChlbnYuQ09OQ09VUlNFIHx8IGVudi5DT05DT1VSU0VfVVJMIHx8IGVudi5DT05DT1VSU0VfVVNFUk5BTUUgfHwgZW52LkNPTkNPVVJTRV9URUFNKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQ29uY291cnNlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQlVJTERfSk9CX05BTUUgfHwgbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0lEIHx8IG51bGwsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR29DRFxuICAgIGlmIChlbnYuR09fSk9CX05BTUUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdHb0NEJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuR09fSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5HT19QSVBFTElORV9DT1VOVEVSLFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvZGVGcmVzaFxuICAgIGlmIChlbnYuQ0ZfQlVJTERfSUQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdDb2RlRnJlc2gnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQ0ZfQlVJTERfVVJMLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5DRl9QSVBFTElORV9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ0ZfQlVJTERfSUQsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgbm8gbWF0Y2hlcywgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0R2l0TWV0YURhdGEgKCkge1xuICAgIGNvbnN0IGluZm86IEdpdFJlcG9JbmZvID0gZ2l0UmVwb0luZm8oKVxuICAgIGlmICghaW5mby5jb21tb25HaXREaXIpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHsgcmVtb3RlIH0gPSBhd2FpdCBwR2l0Y29uZmlnKGluZm8uY29tbW9uR2l0RGlyKVxuICAgIGNvbnN0IHJlbW90ZXMgPSByZW1vdGUgPyBPYmplY3Qua2V5cyhyZW1vdGUpLm1hcChyZW1vdGVOYW1lID0+ICAoeyBuYW1lOiByZW1vdGVOYW1lLCB1cmw6IHJlbW90ZVtyZW1vdGVOYW1lXS51cmwgfSkpIDogW11cblxuICAgIGxldCBnaXRNZXRhRGF0YSA6IEdpdE1ldGFEYXRhID0ge1xuICAgICAgICBuYW1lOiAnZ2l0JyxcbiAgICAgICAgc2hhOiBpbmZvLnNoYSxcbiAgICAgICAgc2hvcnRfc2hhOiBpbmZvLmFiYnJldmlhdGVkU2hhLFxuICAgICAgICBicmFuY2g6IGluZm8uYnJhbmNoLFxuICAgICAgICB0YWc6IGluZm8udGFnLFxuICAgICAgICBjb21taXR0ZXI6IGluZm8uY29tbWl0dGVyLFxuICAgICAgICBjb21taXR0ZXJfZGF0ZTogaW5mby5jb21taXR0ZXJEYXRlLFxuICAgICAgICBhdXRob3I6IGluZm8uYXV0aG9yLFxuICAgICAgICBhdXRob3JfZGF0ZTogaW5mby5hdXRob3JEYXRlLFxuICAgICAgICBjb21taXRfbWVzc2FnZTogaW5mby5jb21taXRNZXNzYWdlLFxuICAgICAgICByb290OiBpbmZvLnJvb3QsXG4gICAgICAgIGNvbW1vbl9naXRfZGlyOiBpbmZvLmNvbW1vbkdpdERpcixcbiAgICAgICAgd29ya3RyZWVfZ2l0X2RpcjogaW5mby53b3JrdHJlZUdpdERpcixcbiAgICAgICAgbGFzdF90YWc6IGluZm8ubGFzdFRhZyxcbiAgICAgICAgY29tbWl0c19zaW5jZV9sYXN0X3RhZzogaW5mby5jb21taXRzU2luY2VMYXN0VGFnLFxuICAgICAgICByZW1vdGVzOiByZW1vdGVzXG4gICAgfVxuXG4gICAgZ2l0TWV0YURhdGEgPSBjaGVja0FuZFRydW5jYXRlVkNTSW5mbyhnaXRNZXRhRGF0YSlcblxuICAgIHJldHVybiBnaXRNZXRhRGF0YVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pcXVlSWRlbnRpZmllcih0ZXN0OiBGcmFtZXdvcmtzLlRlc3QsIGZyYW1ld29yaz86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGZyYW1ld29yayA9PT0gJ2phc21pbmUnKSB7XG4gICAgICAgIHJldHVybiB0ZXN0LmZ1bGxOYW1lXG4gICAgfVxuXG4gICAgbGV0IHBhcmVudFRpdGxlID0gdGVzdC5wYXJlbnRcbiAgICAvLyBTb21ldGltZXMgcGFyZW50IHdpbGwgYmUgYW4gb2JqZWN0IGluc3RlYWQgb2YgYSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIHBhcmVudFRpdGxlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBwYXJlbnRUaXRsZSA9IChwYXJlbnRUaXRsZSBhcyB7IHRpdGxlOiBzdHJpbmcgfSkudGl0bGVcbiAgICB9XG4gICAgcmV0dXJuIGAke3BhcmVudFRpdGxlfSAtICR7dGVzdC50aXRsZX1gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmlxdWVJZGVudGlmaWVyRm9yQ3VjdW1iZXIod29ybGQ6IElUZXN0Q2FzZUhvb2tQYXJhbWV0ZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB3b3JsZC5waWNrbGUudXJpICsgJ18nICsgd29ybGQucGlja2xlLmFzdE5vZGVJZHMuam9pbignLCcpXG59XG5cbi8vIExvYWQgVGVzdGluZyBTZXJ2aWNlIChMVFMpIGdhdGluZyBoZWxwZXJzIFx1MjAxNCBtaXJyb3Igb2YgYnN0YWNrX3V0aWxzL2hlbHBlci5weVxuLy8gaXNfbG9hZF90ZXN0aW5nX3Nlc3Npb24oKSAvIGdldF9sdHNfc2Vzc2lvbl9pZCgpIGluIGJyb3dzZXJzdGFjay1weXRob24tc2RrXG4vLyAoYnJhbmNoIExUUy10cmEtcHl0aG9uLXN1cHBvcnQpLiBMVFMgcG9kLWl0ZXJhdGlvbnMgZXhwb3J0XG4vLyBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQgYmVmb3JlIGludm9raW5nIHRoZSB0ZXN0IHJ1bm5lcjsgcHJlc2VuY2Ugb2Zcbi8vIHRoYXQgZW52IHZhciBpcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgXCJ0aGlzIHJ1biBpcyBhbiBMVFMgcG9kXG4vLyBpdGVyYXRpb25cIi4gT3B0aW9uYWwgQlJPV1NFUlNUQUNLX0xUUz10cnVlfDEgbGV0cyB0aGUgcnVubmVyIG9wdC1pbiB3aXRob3V0XG4vLyBzdXBwbHlpbmcgYSBzZXNzaW9uIGlkICh1c2VmdWwgZm9yIGxvY2FsIHJlcHJvKS5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpOiBib29sZWFuIHtcbiAgICBpZiAocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBjb25zdCBmbGFnID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0xUU11cbiAgICByZXR1cm4gZmxhZyA9PT0gJ3RydWUnIHx8IGZsYWcgPT09ICcxJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0THRzU2Vzc2lvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRF0gfHwgJydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsb3VkUHJvdmlkZXIoYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciB8IFdlYmRyaXZlcklPLk11bHRpUmVtb3RlQnJvd3Nlcik6IHN0cmluZyB7XG4gICAgLy8gTk9URTogZG8gTk9UIGJyYW5jaCBvbiBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpIGhlcmUuIGdldENsb3VkUHJvdmlkZXIgaXNcbiAgICAvLyBzaGFyZWQgd2l0aCBBdXRvbWF0ZS1zaWRlIGd1YXJkcyAoYXV0b21hdGVNb2R1bGUgb25CZWZvcmUvb25BZnRlclRlc3QsXG4gICAgLy8gd2ViZHJpdmVySU9Nb2R1bGUgS0VZX0lTX0JST1dTRVJTVEFDS19IVUIsIGFjY2Vzc2liaWxpdHktaGFuZGxlcixcbiAgICAvLyBzZXJ2aWNlLnRzKSBcdTIwMTQgZmxpcHBpbmcgaXQgdG8gJ2Jyb3dzZXJzdGFjaycgdW5kZXIgTFRTIHdvdWxkIG1ha2VcbiAgICAvLyBpc0Jyb3dzZXJzdGFja1Nlc3Npb24oKSByZXR1cm4gdHJ1ZSBmb3IgbG9jYWwtU2VsZW5pdW0gcG9kIHNlc3Npb25zLFxuICAgIC8vIGNhdXNpbmcgbWFya1Nlc3Npb25OYW1lIC8gbWFya1Nlc3Npb25TdGF0dXMgdG8gUFVUIGFnYWluc3QgQXV0b21hdGVcbiAgICAvLyBSRVNUIEFQSXMgd2l0aCBzZXNzaW9uIGlkcyB0aGF0IGRvbid0IGV4aXN0IHRoZXJlLiBUZXN0SHViLXJlcG9ydGluZ1xuICAgIC8vIGNhbGxlcnMgdGhhdCBuZWVkICdicm93c2Vyc3RhY2snIHVuZGVyIExUUyBkZXJpdmUgaXQgbG9jYWxseSB3aXRoXG4gICAgLy8gYGlzTG9hZFRlc3RpbmdTZXNzaW9uKCkgPyAnYnJvd3NlcnN0YWNrJyA6IGdldENsb3VkUHJvdmlkZXIoYnJvd3NlcilgXG4gICAgLy8gKHNlZSByZXBvcnRlci50cywgaW5zaWdodHMtaGFuZGxlci50cykuXG4gICAgaWYgKGJyb3dzZXIgJiYgJ2luc3RhbmNlcycgaW4gYnJvd3Nlcikge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGluc3RhbmNlc1xuICAgICAgICBmb3IgKGNvbnN0IGluc3RhbmNlTmFtZSBvZiBicm93c2VyLmluc3RhbmNlcykge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSAoYnJvd3NlciBhcyBhbnkpW2luc3RhbmNlTmFtZV0gYXMgV2ViZHJpdmVySU8uQnJvd3NlclxuICAgICAgICAgICAgaWYgKGluc3RhbmNlLm9wdGlvbnMgJiYgaW5zdGFuY2Uub3B0aW9ucy5ob3N0bmFtZSAmJiBpbnN0YW5jZS5vcHRpb25zLmhvc3RuYW1lLmluY2x1ZGVzKCdicm93c2Vyc3RhY2snKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnYnJvd3NlcnN0YWNrJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChicm93c2VyLm9wdGlvbnMgJiYgYnJvd3Nlci5vcHRpb25zLmhvc3RuYW1lICYmIGJyb3dzZXIub3B0aW9ucy5ob3N0bmFtZS5pbmNsdWRlcygnYnJvd3NlcnN0YWNrJykpIHsgLy8gU2luZ2xlIGJyb3dzZXIgaW5zdGFuY2VcbiAgICAgICAgcmV0dXJuICdicm93c2Vyc3RhY2snXG4gICAgfVxuICAgIHJldHVybiAndW5rbm93bl9ncmlkJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2Vyc3RhY2tTZXNzaW9uKGJyb3dzZXI/OiBXZWJkcml2ZXJJTy5Ccm93c2VyIHwgV2ViZHJpdmVySU8uTXVsdGlSZW1vdGVCcm93c2VyKSB7XG4gICAgcmV0dXJuIGJyb3dzZXIgJiYgZ2V0Q2xvdWRQcm92aWRlcihicm93c2VyKS50b0xvd2VyQ2FzZSgpID09PSAnYnJvd3NlcnN0YWNrJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NlbmFyaW9FeGFtcGxlcyh3b3JsZDogSVRlc3RDYXNlSG9va1BhcmFtZXRlcikge1xuICAgIGNvbnN0IHNjZW5hcmlvID0gd29ybGQucGlja2xlXG5cbiAgICAvLyBubyBleGFtcGxlcyBwcmVzZW50XG4gICAgaWYgKChzY2VuYXJpby5hc3ROb2RlSWRzICYmIHNjZW5hcmlvLmFzdE5vZGVJZHMubGVuZ3RoIDw9IDEpIHx8IHNjZW5hcmlvLmFzdE5vZGVJZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwaWNrbGVJZDogc3RyaW5nID0gc2NlbmFyaW8uYXN0Tm9kZUlkc1swXVxuICAgIGNvbnN0IGV4YW1wbGVzSWQ6IHN0cmluZyA9IHNjZW5hcmlvLmFzdE5vZGVJZHNbMV1cbiAgICBjb25zdCBnaGVya2luRG9jdW1lbnRDaGlsZHJlbiA9IHdvcmxkLmdoZXJraW5Eb2N1bWVudC5mZWF0dXJlPy5jaGlsZHJlblxuXG4gICAgbGV0IGV4YW1wbGVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBnaGVya2luRG9jdW1lbnRDaGlsZHJlbj8uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5ydWxlKSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgaWYgcnVsZSBpcyBwcmVzZW50XG4gICAgICAgICAgICBjaGlsZC5ydWxlLmNoaWxkcmVuLmZvckVhY2goY2hpbGRMZXZlbDIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZExldmVsMi5zY2VuYXJpbyAmJiBjaGlsZExldmVsMi5zY2VuYXJpby5pZCA9PT0gcGlja2xlSWQgJiYgY2hpbGRMZXZlbDIuc2NlbmFyaW8uZXhhbXBsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzc2VkRXhhbXBsZXMgPSBjaGlsZExldmVsMi5zY2VuYXJpby5leGFtcGxlcy5mbGF0TWFwKCh2YWwpID0+ICh2YWwudGFibGVCb2R5KSkuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZXhhbXBsZXNJZCk/LmNlbGxzLm1hcCgodmFsKSA9PiAodmFsLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZEV4YW1wbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlcyA9IHBhc3NlZEV4YW1wbGVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLnNjZW5hcmlvICYmIGNoaWxkLnNjZW5hcmlvLmlkID09PSBwaWNrbGVJZCAmJiBjaGlsZC5zY2VuYXJpby5leGFtcGxlcykge1xuICAgICAgICAgICAgLy8gaGFuZGxlIGlmIHNjZW5hcmlvIG91dHNpZGUgcnVsZVxuICAgICAgICAgICAgY29uc3QgcGFzc2VkRXhhbXBsZXMgPSBjaGlsZC5zY2VuYXJpby5leGFtcGxlcy5mbGF0TWFwKCh2YWwpID0+ICh2YWwudGFibGVCb2R5KSkuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZXhhbXBsZXNJZCk/LmNlbGxzLm1hcCgodmFsKSA9PiAodmFsLnZhbHVlKSlcbiAgICAgICAgICAgIGlmIChwYXNzZWRFeGFtcGxlcykge1xuICAgICAgICAgICAgICAgIGV4YW1wbGVzID0gcGFzc2VkRXhhbXBsZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAoZXhhbXBsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBleGFtcGxlc1xuICAgIH1cbiAgICByZXR1cm5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFuc2lDb2xvcnMobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yOTQ5NzY4MFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvW1xcdTAwMWJcXHUwMDliXVtbKCkjOz9dKig/OlswLTldezEsNH0oPzo7WzAtOV17MCw0fSkqKT9bMC05QS1PUlpjZi1ucXJ5PT48XS9nLCAnJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ1RhZyhldmVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gJ1Rlc3RSdW5TdGFydGVkJyB8fCBldmVudFR5cGUgPT09ICdUZXN0UnVuRmluaXNoZWQnKSB7XG4gICAgICAgIHJldHVybiAnVGVzdF9VcGxvYWQnXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdIb29rUnVuU3RhcnRlZCcgfHwgZXZlbnRUeXBlID09PSAnSG9va1J1bkZpbmlzaGVkJykge1xuICAgICAgICByZXR1cm4gJ0hvb2tfVXBsb2FkJ1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnU2NyZWVuc2hvdENyZWF0ZWQnKSB7XG4gICAgICAgIHJldHVybiAnU2NyZWVuc2hvdF9VcGxvYWQnXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdMb2dDcmVhdGVkJykge1xuICAgICAgICByZXR1cm4gJ0xvZ19VcGxvYWQnXG4gICAgfVxuICAgIHJldHVybiAndW5kZWZpbmVkJ1xufVxuXG4vLyBnZXQgaGllcmFyY2h5IGZvciBhIHBhcnRpY3VsYXIgdGVzdCAoY2FsbGVkIGJ5IHJlcG9ydGVyIGZvciBza2lwcGVkIHRlc3RzKVxuZXhwb3J0IGZ1bmN0aW9uIGdldEhpZXJhcmNoeShmdWxsVGl0bGU/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWZ1bGxUaXRsZSkge1xuICAgICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgcmV0dXJuIGZ1bGxUaXRsZS5zcGxpdCgnLicpLnNsaWNlKDAsIC0xKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SG9va1R5cGUgKGhvb2tOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChob29rTmFtZS5zdGFydHNXaXRoKCdcImJlZm9yZSBlYWNoXCInKSkge1xuICAgICAgICByZXR1cm4gJ0JFRk9SRV9FQUNIJ1xuICAgIH0gZWxzZSBpZiAoaG9va05hbWUuc3RhcnRzV2l0aCgnXCJiZWZvcmUgYWxsXCInKSkge1xuICAgICAgICByZXR1cm4gJ0JFRk9SRV9BTEwnXG4gICAgfSBlbHNlIGlmIChob29rTmFtZS5zdGFydHNXaXRoKCdcImFmdGVyIGVhY2hcIicpKSB7XG4gICAgICAgIHJldHVybiAnQUZURVJfRUFDSCdcbiAgICB9IGVsc2UgaWYgKGhvb2tOYW1lLnN0YXJ0c1dpdGgoJ1wiYWZ0ZXIgYWxsXCInKSkge1xuICAgICAgICByZXR1cm4gJ0FGVEVSX0FMTCdcbiAgICB9XG4gICAgcmV0dXJuICd1bmtub3duJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY3JlZW5zaG90Q29tbWFuZCAoYXJnczogQmVmb3JlQ29tbWFuZEFyZ3MgfCBBZnRlckNvbW1hbmRBcmdzKSB7XG4gICAgcmV0dXJuIGFyZ3MuZW5kcG9pbnQgJiYgYXJncy5lbmRwb2ludC5pbmNsdWRlcygnL3NjcmVlbnNob3QnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCU3RhY2tTZXNzaW9uKGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcudXNlciA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGNvbmZpZy5rZXkgPT09ICdzdHJpbmcnICYmIGNvbmZpZy5rZXkubGVuZ3RoID09PSAyMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcnN0YWNrSW5mcmEoY29uZmlnOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNhcHM/OiBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzKTogYm9vbGVhbiB7XG4gICAgLy8gdGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGJhc2ljIHNlc3Npb24gb3IgbXVsdGkgcmVtb3RlIHNlc3Npb24gaXMgcnVubmluZyBvbiBCcm93c2Vyc3RhY2ssIG1haW5seSBieSBjaGVja2luZyB0aGUgaG9zdG5hbWUgcGFyYW1ldGVyIGluIHRoZSBnaXZlbiBjb25maWdcbiAgICAvLyBJbiBjYXNlIGhvc3RuYW1lIGlzIG5vdCBwcmVzZW50IGFueXdoZXJlIGluIHRoZSBjb25maWcsIGl0IHJldHVybnMgdHJ1ZSBieSBkZWZhdWx0IGFzIGhvc3RuYW1lIGlzIG5vdCBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgaW4gdGhlIGNvbmZpZ1xuXG4gICAgY29uc3QgaXNCcm93c2Vyc3RhY2sgPSAoc3RyOiBzdHJpbmcgKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIHJldHVybiBzdHIgPT09ICdicm93c2Vyc3RhY2suY29tJyB8fCBzdHIuZW5kc1dpdGgoJy5icm93c2Vyc3RhY2suY29tJylcbiAgICB9XG5cbiAgICBpZiAoKGNvbmZpZy5ob3N0bmFtZSkgJiYgIWlzQnJvd3NlcnN0YWNrKGNvbmZpZy5ob3N0bmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGNhcHMgJiYgdHlwZW9mIGNhcHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNhcHMpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgY2Fwcykge1xuICAgICAgICAgICAgICAgIGlmICgoKGNhcGFiaWxpdHkgYXMgT3B0aW9ucy5UZXN0cnVubmVyKS5ob3N0bmFtZSkgJiYgIWlzQnJvd3NlcnN0YWNrKChjYXBhYmlsaXR5IGFzIE9wdGlvbnMuVGVzdHJ1bm5lcikuaG9zdG5hbWUgYXMgc3RyaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjYXBzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IGNhcHNba2V5IGFzIGtleW9mIENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXNdXG4gICAgICAgICAgICAgICAgaWYgKCgoY2FwYWJpbGl0eSBhcyBPcHRpb25zLlRlc3RydW5uZXIpLmhvc3RuYW1lKSAmJiAhaXNCcm93c2Vyc3RhY2soKGNhcGFiaWxpdHkgYXMgT3B0aW9ucy5UZXN0cnVubmVyKS5ob3N0bmFtZSBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNCU3RhY2tTZXNzaW9uKGNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja1VzZXJBbmRLZXkoY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsIG9wdGlvbnM6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuXG4gICAgLy8gRmFsbGJhY2sgMTogRW52IHZhcmlhYmxlc1xuICAgIC8vIEZhbGxiYWNrIDI6IFNlcnZpY2UgdmFyaWFibGVzIGluIHdkaW8uY29uZi5qcyAodGhhdCBhcmUgcmVjZWl2ZWQgaW5zaWRlIG9wdGlvbnMgb2JqZWN0KVxuICAgIGNvbnN0IGVudk9yU2VydmljZVZhcmlhYmxlcyA9IHtcbiAgICAgICAgdXNlcjogZ2V0QnJvd3NlclN0YWNrVXNlcihvcHRpb25zKSxcbiAgICAgICAga2V5OiBnZXRCcm93c2VyU3RhY2tLZXkob3B0aW9ucylcbiAgICB9XG4gICAgaWYgKGVudk9yU2VydmljZVZhcmlhYmxlcy51c2VyICYmIGVudk9yU2VydmljZVZhcmlhYmxlcy5rZXkpIHtcbiAgICAgICAgcmV0dXJuIGVudk9yU2VydmljZVZhcmlhYmxlc1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIDM6IFNlcnZpY2UgdmFyaWFibGVzIGluIHRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyBvYmplY3RcbiAgICAvLyBGYWxsYmFjayA0OiBTZXJ2aWNlIHZhcmlhYmxlcyBpbiB0aGUgdG9wIGxldmVsIGNvbmZpZyBvYmplY3RcbiAgICBjb25zdCBvMTF5VmFyaWFibGVzID0ge1xuICAgICAgICB1c2VyOiBnZXRPYnNlcnZhYmlsaXR5VXNlcihvcHRpb25zLCBjb25maWcpLFxuICAgICAgICBrZXk6IGdldE9ic2VydmFiaWxpdHlLZXkob3B0aW9ucywgY29uZmlnKVxuICAgIH1cbiAgICByZXR1cm4gbzExeVZhcmlhYmxlc1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRBZGRTZXJ2aWNlVmVyc2lvbihjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lciwgdGVzdE9ic2VydmFiaWxpdHk/OiBib29sZWFuLCBjYXBzPzogQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIGlmICgoY29uZmlnLnNlcnZpY2VzICYmIGNvbmZpZy5zZXJ2aWNlcy50b1N0cmluZygpLmluY2x1ZGVzKCdjaHJvbWVkcml2ZXInKSAmJiB0ZXN0T2JzZXJ2YWJpbGl0eSAhPT0gZmFsc2UpIHx8ICFpc0Jyb3dzZXJzdGFja0luZnJhKGNvbmZpZywgY2FwcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiYXRjaEFuZFBvc3RFdmVudHMgKGV2ZW50VXJsOiBzdHJpbmcsIGtpbmQ6IHN0cmluZywgZGF0YTogVXBsb2FkVHlwZVtdKSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudltURVNUT1BTX0JVSUxEX0NPTVBMRVRFRF9FTlZdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQnVpbGQgbm90IGNvbXBsZXRlZCB5ZXQnKVxuICAgIH1cblxuICAgIGNvbnN0IGp3dFRva2VuID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXVxuICAgIGlmICghand0VG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGF1dGhlbnRpY2F0aW9uIFRva2VuJylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElVdGlscy5EQVRBX0VORFBPSU5UfS8ke2V2ZW50VXJsfWBcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHtqd3RUb2tlbn1gXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgfSlcbiAgICAgICAgLy8gcmVhZCBhcyB0ZXh0IGZpcnN0OiBlcnJvciByZXNwb25zZXMgKDQwMS81eHgpIGFuZCBlbXB0eSBib2RpZXMgYXJlIG5vdCBKU09OLCBhbmQgYSBibGluZFxuICAgICAgICAvLyByZXNwb25zZS5qc29uKCkgc3VyZmFjZWQgdGhlbSBhcyBhIG1pc2xlYWRpbmcgXCJVbmV4cGVjdGVkIGVuZCBvZiBKU09OIGlucHV0XCJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fSR7cmVzcG9uc2VCb2R5ID8gYCBcdTIwMTQgJHtyZXNwb25zZUJvZHkuc2xpY2UoMCwgMzAwKX1gIDogJyAoZW1wdHkgYm9keSknfWApXG4gICAgICAgIH1cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbJHtraW5kfV0gU3VjY2VzcyByZXNwb25zZTogJHtyZXNwb25zZUJvZHl9YClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFske2tpbmR9XSBFWENFUFRJT04gSU4gJHtraW5kfSBSRVFVRVNUIFRPIFRFU1QgUkVQT1JUSU5HIEFORCBBTkFMWVRJQ1MgOiAke2Vycm9yfWApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhjZXB0aW9uIGluIHJlcXVlc3QgJyArIGVycm9yKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2VydmFiaWxpdHlVc2VyKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVVNFUk5BTUVcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zICYmIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXJcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy51c2VyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FDQ0VTU19LRVkpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BQ0NFU1NfS0VZXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5rZXkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmtleVxuICAgIH1cbiAgICByZXR1cm4gY29uZmlnLmtleVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eVByb2plY3Qob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBic3RhY2tQcm9qZWN0TmFtZT86IHN0cmluZykge1xuICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfUFJPSkVDVF9OQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfUFJPSkVDVF9OQU1FXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5wcm9qZWN0TmFtZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMucHJvamVjdE5hbWVcbiAgICB9XG4gICAgcmV0dXJuIGJzdGFja1Byb2plY3ROYW1lXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5QnVpbGQob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBic3RhY2tCdWlsZE5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX05BTUUpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LlRFU1RfT0JTRVJWQUJJTElUWV9CVUlMRF9OQU1FXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkTmFtZVxuICAgIH1cbiAgICByZXR1cm4gYnN0YWNrQnVpbGROYW1lIHx8IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGJzdGFja0J1aWxkVGFnPzogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHLnNwbGl0KCcsJylcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zICYmIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkVGFnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZFRhZ1xuICAgIH1cbiAgICBpZiAoYnN0YWNrQnVpbGRUYWcpIHtcbiAgICAgICAgcmV0dXJuIFtic3RhY2tCdWlsZFRhZ11cbiAgICB9XG4gICAgcmV0dXJuIFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXN0UGxhbklkKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUX1BMQU5fSURdKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVF9QTEFOX0lEXVxuICAgIH1cbiAgICBjb25zdCBDTElfQVJHID0gJy0tYnJvd3NlcnN0YWNrLnRlc3RNYW5hZ2VtZW50T3B0aW9ucy50ZXN0UGxhbklkJ1xuICAgIGNvbnN0IGFyZ0luZGV4ID0gcHJvY2Vzcy5hcmd2LmluZGV4T2YoQ0xJX0FSRylcbiAgICBpZiAoYXJnSW5kZXggIT09IC0xICYmIHByb2Nlc3MuYXJndlthcmdJbmRleCArIDFdKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmFyZ3ZbYXJnSW5kZXggKyAxXVxuICAgIH1cbiAgICBjb25zdCBhcmdXaXRoRXF1YWxzID0gcHJvY2Vzcy5hcmd2LmZpbmQoKGFyZykgPT4gYXJnLnN0YXJ0c1dpdGgoYCR7Q0xJX0FSR309YCkpXG4gICAgaWYgKGFyZ1dpdGhFcXVhbHMpIHtcbiAgICAgICAgcmV0dXJuIGFyZ1dpdGhFcXVhbHMuc3BsaXQoJz0nKVsxXVxuICAgIH1cbiAgICBjb25zdCB0ZXN0UGxhbklkID0gb3B0aW9ucy50ZXN0TWFuYWdlbWVudE9wdGlvbnM/LnRlc3RQbGFuSWRcbiAgICBpZiAodHlwZW9mIHRlc3RQbGFuSWQgPT09ICdzdHJpbmcnICYmIHRlc3RQbGFuSWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHRlc3RQbGFuSWQudHJpbSgpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja1VzZXIoY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVVNFUk5BTUUgYXMgc3RyaW5nXG4gICAgfVxuICAgIHJldHVybiBjb25maWcudXNlciBhcyBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja0tleShjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgIGlmIChwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQUNDRVNTX0tFWSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FDQ0VTU19LRVlcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy5rZXlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlOiB1bmtub3duKSB7XG4gICAgbGV0IHJlcyA9ICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlcyA9IHJlcyB8fCB2YWx1ZSA9PT0gJydcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUcnVlKHZhbHVlPzogdW5rbm93bikge1xuICAgIHJldHVybiAodmFsdWUgKyAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZhbHNlKHZhbHVlPzogdW5rbm93bikge1xuICAgIHJldHVybiAodmFsdWUgKyAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJ1xufVxuXG4vKipcbiAqIHNraXBBcHBPdmVycmlkZSB2YWxpZGF0aW9uIGNob2tlcG9pbnQgXHUyMDE0IHBvcnRlZCBmcm9tIHRoZSBOb2RlIFNESydzXG4gKiB2YWxpZGF0ZVNraXBBcHBPdmVycmlkZSAoaGVscGVyLmpzKSAvIEphdmEgQnJvd3NlclN0YWNrSmF2YUFnZW50LnByb2Nlc3NBcHBPcHRpb25zLlxuICogQ2FsbGVkIE9OQ0UgZnJvbSB0aGUgbGF1bmNoZXIgKG1haW4gcHJvY2VzcywgcHJlLXNlc3Npb24pLiBFbWl0cyB0aGUgZml4ZWQgd2FybmluZyxcbiAqIGhhbmRsZXMgdGhlIHRocmVlIGVkZ2UgY2FzZXMsIGFuZCBjbGVhcnMgdGhlIGFwcCBvbiBjb25mbGljdCBzbyBpdCBpcyBuZWl0aGVyIHVwbG9hZGVkXG4gKiBub3IgaW5qZWN0ZWQuIFRoZXJlIGlzIE5PIFRpZXItMiBicmFuY2g6IGV2ZXJ5IFdlYmRyaXZlcklPIHRlc3QgZnJhbWV3b3JrXG4gKiAobW9jaGEvamFzbWluZS9jdWN1bWJlcikgc3VwcG9ydHMgQXBwIEF1dG9tYXRlLlxuICpcbiAqIFRoZSBzdGFuZGFyZCB3YXJuaW5nIGFuZCB0aGUgZWRnZS0yIGVycm9yIGFyZSB2ZXJiYXRpbSB3aXRoIHRoZSBvdGhlciBCcm93c2VyU3RhY2sgU0RLc1xuICogKEJyb3dzZXJTdGFja0phdmFBZ2VudCNwcm9jZXNzQXBwT3B0aW9ucykuIFRoZSBlZGdlLTEgY29uZmxpY3Qgd2FybmluZyBpcyBJTlRFTlRJT05BTExZIGFkYXB0ZWQgZm9yXG4gKiBXZWJkcml2ZXJJTyBcdTIwMTQgaXQgc2F5cyBcImJyb3dzZXJzdGFjayBzZXJ2aWNlIG9wdGlvbnNcIiAod2hlcmUgV0RJTyByZWFkcyBgYXBwYCksIG5vdCBcImJyb3dzZXJzdGFjay55bWxcIiBcdTIwMTRcbiAqIHNvIHBsZWFzZSBkbyBOT1QgXCJmaXhcIiBpdCBiYWNrIHRvIHRoZSB5bWwgd29yZGluZyB0byBtYXRjaCB0aGUgb3RoZXIgU0RLcy5cbiAqIEdyYWNlZnVsOiBuZXZlciB0aHJvd3MgZXhjZXB0IHRoZSBkZWxpYmVyYXRlIGVkZ2UtMiBjb25maWcgZXJyb3IgKGV4cGxpY2l0IGZhbHNlICsgbm8gYXBwKSxcbiAqIHdoaWNoIGZpcmVzIHByZS1zZXNzaW9uIHNvIHRoZSBydW4gYWJvcnRzIGNsZWFubHkuXG4gKlxuICogTXV0YXRlcyBgb3B0aW9ucy5hcHBgIChlZGdlLTEpLiAzLXN0YXRlIHZpYSBpc1RydWUvaXNGYWxzZSBcdTIwMTQgbmV2ZXIgYCFvcHRpb25zLnNraXBBcHBPdmVycmlkZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNraXBBcHBPdmVycmlkZShvcHRpb25zPzogQnJvd3NlcnN0YWNrQ29uZmlnICYgQnJvd3NlcnN0YWNrT3B0aW9ucykge1xuICAgIGlmIChpc1VuZGVmaW5lZChvcHRpb25zKSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBza2lwQXBwT3ZlcnJpZGUgPSAob3B0aW9ucyBhcyBCcm93c2Vyc3RhY2tDb25maWcpLnNraXBBcHBPdmVycmlkZVxuICAgIGNvbnN0IGFscmVhZHlXYXJuZWQgPSBpc1RydWUocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1NLSVBfQVBQX09WRVJSSURFX1dBUk5FRClcblxuICAgIC8vIFN0YW5kYXJkIHdhcm5pbmcgXHUyMDE0IGZpcmVzIHdoZW5ldmVyIHNraXBBcHBPdmVycmlkZSBpcyB0cnVlLCBiZWZvcmUgYW55IGVkZ2UgcmV0dXJuLlxuICAgIGlmIChpc1RydWUoc2tpcEFwcE92ZXJyaWRlKSAmJiAhYWxyZWFkeVdhcm5lZCkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignW0Jyb3dzZXJTdGFja10gXFwnc2tpcEFwcE92ZXJyaWRlOiB0cnVlXFwnIGlzIHNldC4gVGhlIFNESyB3aWxsIHRyZWF0IHRoaXMgc2Vzc2lvbiBhcyBBcHAgQXV0b21hdGUgYW5kIHdpbGwgTk9UIG1hbmFnZSBhcHAgdXBsb2FkIG9yIGluamVjdCBhcHAgY2FwYWJpbGl0aWVzLiBJZiB5b3UgaW50ZW5kZWQgdG8gcnVuIGFuIEF1dG9tYXRlIChicm93c2VyL3dlYnNpdGUpIHNlc3Npb24sIHJlbW92ZSBcXCdza2lwQXBwT3ZlcnJpZGVcXCcgXHUyMDE0IGxlYXZpbmcgaXQgc2V0IHdpbGwgY2F1c2UgQXV0b21hdGUgc2Vzc2lvbnMgdG8gYmVoYXZlIGluY29ycmVjdGx5LicpXG4gICAgICAgIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19TS0lQX0FQUF9PVkVSUklERV9XQVJORUQgPSAndHJ1ZSdcbiAgICB9XG5cbiAgICAvLyBFZGdlIDE6IGFwcCBzcGVjaWZpZWQgKyBza2lwQXBwT3ZlcnJpZGU6dHJ1ZSBcdTIxOTIgd2FybiwgY2xlYXIgdGhlIGFwcCBzbyBpdCBpcyBub3RcbiAgICAvLyB1cGxvYWRlZC9pbmplY3RlZCwgcHJvY2VlZCBBcHAgQXV0b21hdGUuXG4gICAgaWYgKGlzVHJ1ZShza2lwQXBwT3ZlcnJpZGUpICYmICFpc1VuZGVmaW5lZCgob3B0aW9ucyBhcyBCcm93c2Vyc3RhY2tDb25maWcpLmFwcCkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0NvbmZsaWN0IGRldGVjdGVkLiBza2lwQXBwT3ZlcnJpZGU6IHRydWUgaXMgYWN0aXZlOyBpZ25vcmluZyB0aGUgYXBwIHByb3ZpZGVkIGluIHRoZSBicm93c2Vyc3RhY2sgc2VydmljZSBvcHRpb25zLicpXG4gICAgICAgIDsob3B0aW9ucyBhcyBCcm93c2Vyc3RhY2tDb25maWcpLmFwcCA9IHVuZGVmaW5lZFxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBFZGdlIDI6IGFwcCBub3Qgc3BlY2lmaWVkICsgc2tpcEFwcE92ZXJyaWRlIGV4cGxpY2l0bHkgZmFsc2UgXHUyMTkyIHByZS1zZXNzaW9uIGNvbmZpZyBlcnJvci5cbiAgICBpZiAoaXNGYWxzZShza2lwQXBwT3ZlcnJpZGUpICYmIGlzVW5kZWZpbmVkKChvcHRpb25zIGFzIEJyb3dzZXJzdGFja0NvbmZpZykuYXBwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FwcCBjYXBhYmlsaXR5IGlzIG1pc3NpbmcuIFdoZW4gc2tpcEFwcE92ZXJyaWRlIGlzIHNldCB0byBcXCdmYWxzZVxcJywgYSB2YWxpZCBhcHAgY2FwYWJpbGl0eSAoaGFzaC9zaGFyZWFibGUgaWQvcGF0aC9jdXN0b21faWQpIG11c3QgYmUgcHJvdmlkZWQuJylcbiAgICB9XG5cbiAgICAvLyBFZGdlIDMgKGFuZCBkZWZhdWx0KTogdW5zZXQgKyBubyBhcHAgXHUyMTkyIHVuY2hhbmdlZCBiZWhhdmlvciAobm8tb3ApLlxufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJhbWV3b3JrU3VwcG9ydHNIb29rKGhvb2s6IHN0cmluZywgZnJhbWV3b3JrPzogc3RyaW5nKSB7XG4gICAgaWYgKGZyYW1ld29yayA9PT0gJ21vY2hhJyAmJiAoaG9vayA9PT0gJ2JlZm9yZScgfHwgaG9vayA9PT0gJ2FmdGVyJyB8fCBob29rID09PSAnYmVmb3JlRWFjaCcgfHwgaG9vayA9PT0gJ2FmdGVyRWFjaCcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKGZyYW1ld29yayA9PT0gJ2N1Y3VtYmVyJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgcGF0Y2hDb25zb2xlTG9ncyA9IG8xMXlFcnJvckhhbmRsZXIoKCkgPT4ge1xuICAgIGNvbnN0IEJTVGVzdE9wc1BhdGNoZXIgPSBuZXcgbG9nUGF0Y2hlcih7fSlcblxuICAgIE9iamVjdC5rZXlzKGNvbnNvbGVIb2xkZXIpLmZvckVhY2goKG1ldGhvZDoga2V5b2YgdHlwZW9mIGNvbnNvbGUpID0+IHtcbiAgICAgICAgaWYgKCEobWV0aG9kIGluIGNvbnNvbGUpIHx8IG1ldGhvZCA9PT0gJ0NvbnNvbGUnIHx8IHR5cGVvZiBjb25zb2xlW21ldGhvZF0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgU2tpcHBpbmcgbWV0aG9kOiAke21ldGhvZH0sIGV4aXN0czogJHttZXRob2QgaW4gY29uc29sZX0sIHR5cGU6ICR7dHlwZW9mIGNvbnNvbGVbbWV0aG9kXX1gKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JpZ01ldGhvZDogRnVuY3Rpb24gPSBjb25zb2xlW21ldGhvZF0uYmluZChjb25zb2xlKVxuXG4gICAgICAgIGNvbnNvbGVbbWV0aG9kXSA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhCU1Rlc3RPcHNQYXRjaGVyKS5pbmNsdWRlcyhtZXRob2QpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdNZXRob2QoLi4uYXJncylcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcmlnTWV0aG9kKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAoQlNUZXN0T3BzUGF0Y2hlciBhcyBhbnkpW21ldGhvZF0oLi4uYXJncylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3Igd2hpbGUgcGF0Y2hpbmcgY29uc29sZSBsb2dzIDogJHtlcnJvcn1gKVxuICAgICAgICAgICAgICAgIG9yaWdNZXRob2QoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG59KVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmFpbHVyZU9iamVjdChlcnJvcjogc3RyaW5nfEVycm9yKSB7XG4gICAgY29uc3Qgc3RhY2sgPSAoZXJyb3IgYXMgRXJyb3IpLnN0YWNrXG4gICAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycgPyBlcnJvciA6IGVycm9yLm1lc3NhZ2VcbiAgICBjb25zdCBiYWNrdHJhY2UgPSBzdGFjayA/IHJlbW92ZUFuc2lDb2xvcnMoc3RhY2sudG9TdHJpbmcoKSkgOiAnJ1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmFpbHVyZTogW3sgYmFja3RyYWNlOiBbYmFja3RyYWNlXSB9XSxcbiAgICAgICAgZmFpbHVyZV9yZWFzb246IHJlbW92ZUFuc2lDb2xvcnMobWVzc2FnZS50b1N0cmluZygpKSxcbiAgICAgICAgZmFpbHVyZV90eXBlOiBtZXNzYWdlID8gKG1lc3NhZ2UudG9TdHJpbmcoKS5tYXRjaCgvQXNzZXJ0aW9uRXJyb3IvKSA/ICdBc3NlcnRpb25FcnJvcicgOiAnVW5oYW5kbGVkRXJyb3InKSA6IG51bGxcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBzbGVlcCA9IChtcyA9IDEwMCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBsb2FkTG9ncyh1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQsIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjbGllbnRCdWlsZFV1aWQ6IHN0cmluZykge1xuICAgIC8vIE1hbnVhbCBpbnN0cnVtZW50YXRpb246IHRhZyBldmVyeSByZXR1cm4gcGF0aCBvbiB0aGUgU0RLX1VQTE9BRF9MT0dTIGV2ZW50IHNvXG4gICAgLy8gdGhlIG1ldHJpYyBpZGVudGlmaWVzIHRoZSBzcGVjaWZpYyByZWFzb24gbG9ncyB3ZXJlIG5vdCB1cGxvYWRlZCAobm8gY3JlZHMsXG4gICAgLy8gcGVyLWZpbGUgY29weSBmYWlsdXJlLCB1cGxvYWQgbm8tcmVzcG9uc2UsIGV4Y2VwdGlvbikuIG1lYXN1cmVXcmFwcGVyIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIG1hcmsgYWxsIG5vbi10aHJvd2luZyBwYXRocyBhcyBzdWNjZXNzLlxuICAgIGNvbnN0IGV2ZW50TmFtZSA9IFBFUkZPUk1BTkNFX1NES19FVkVOVFMuRVZFTlRTLlNES19VUExPQURfTE9HU1xuICAgIGxldCBzdWNjZXNzID0gdHJ1ZVxuICAgIGxldCBmYWlsdXJlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICBQZXJmb3JtYW5jZVRlc3Rlci5zdGFydChldmVudE5hbWUpXG5cbiAgICB0cnkge1xuICAgICAgICBpZiAoIXVzZXIgfHwgIWtleSkge1xuICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlXG4gICAgICAgICAgICBmYWlsdXJlID0gJ3NraXBwZWQ6IG1pc3NpbmdfY3JlZGVudGlhbHMnXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1VwbG9hZGluZyBsb2dzIGZhaWxlZCBkdWUgdG8gbm8gY3JlZGVudGlhbHMnKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0bXBEaXIgPSB0bXBkaXIoKVxuICAgICAgICBjb25zdCB0YXJQYXRoID0gcGF0aC5qb2luKHRtcERpciwgJ2xvZ3MudGFyJylcbiAgICAgICAgY29uc3QgdGFyR3pQYXRoID0gcGF0aC5qb2luKHRtcERpciwgJ2xvZ3MudGFyLmd6JylcblxuICAgICAgICBjb25zdCBmaWxlc1RvQXJjaGl2ZSA9IFtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5sb2dGaWxlUGF0aCxcbiAgICAgICAgICAgIENMSV9ERUJVR19MT0dTX0ZJTEUsXG4gICAgICAgIF0uZmlsdGVyKGYgPT4gZnMuZXhpc3RzU3luYyhmKSlcblxuICAgICAgICBjb25zdCBjb3BpZWRGaWxlTmFtZXM6IHN0cmluZ1tdID0gW11cbiAgICAgICAgY29uc3QgYXJjaGl2ZUFkZEZhaWx1cmVzOiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWxlc1RvQXJjaGl2ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXN0ID0gcGF0aC5qb2luKHRtcERpciwgcGF0aC5iYXNlbmFtZShmKSlcbiAgICAgICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoZiwgZGVzdClcbiAgICAgICAgICAgICAgICBjb3BpZWRGaWxlTmFtZXMucHVzaChwYXRoLmJhc2VuYW1lKGYpKVxuICAgICAgICAgICAgfSBjYXRjaCAoY29weUVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IChjb3B5RXJyIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBTdHJpbmcoY29weUVycilcbiAgICAgICAgICAgICAgICBhcmNoaXZlQWRkRmFpbHVyZXMucHVzaChgJHtwYXRoLmJhc2VuYW1lKGYpfTogJHttc2d9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmNoaXZlQWRkRmFpbHVyZXMubGVuZ3RoID4gMCAmJiBmYWlsdXJlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICAgICAgZmFpbHVyZSA9IGBhcmNoaXZlX2FkZF9mYWlsZWQgWyR7YXJjaGl2ZUFkZEZhaWx1cmVzLmxlbmd0aH1dOiAke2FyY2hpdmVBZGRGYWlsdXJlcy5qb2luKCc7ICcpfWAuc3Vic3RyaW5nKDAsIDMwMClcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGNyZWF0ZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmaWxlOiB0YXJQYXRoLFxuICAgICAgICAgICAgICAgIGN3ZDogdG1wRGlyLFxuICAgICAgICAgICAgICAgIHBvcnRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIG5vRGlyUmVjdXJzZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcGllZEZpbGVOYW1lc1xuICAgICAgICApXG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0YXJQYXRoKVxuICAgICAgICAgICAgY29uc3QgZGVzdCA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRhckd6UGF0aClcbiAgICAgICAgICAgIGNvbnN0IGd6aXAgPSB6bGliLmNyZWF0ZUd6aXAoeyBsZXZlbDogMSB9KVxuXG4gICAgICAgICAgICBzb3VyY2UucGlwZShnemlwKS5waXBlKGRlc3QpXG4gICAgICAgICAgICBkZXN0Lm9uKCdmaW5pc2gnLCByZXNvbHZlKVxuICAgICAgICAgICAgZGVzdC5vbignZXJyb3InLCByZWplY3QpXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICAvLyBvcGVuQXNCbG9iIChOb2RlID49MjApIHJldHVybnMgYSBCbG9iIGJhY2tlZCBieSBhIGZpbGUgZGVzY3JpcHRvciBcdTIwMTQgdW5kaWNpXG4gICAgICAgIC8vIHN0cmVhbXMgZnJvbSBkaXNrIGR1cmluZyB0aGUgdXBsb2FkIGluc3RlYWQgb2YgbWF0ZXJpYWxpc2luZyB0aGUgZnVsbCBhcmNoaXZlXG4gICAgICAgIC8vIGluIFY4IGhlYXAgKHdoaWNoIHJlYWRGaWxlU3luYyArIG5ldyBCbG9iKFtCdWZmZXJdKSB3b3VsZCBkbyB0d2ljZSkuXG4gICAgICAgIC8vIE5vZGUgMTguMjAgKHN0aWxsIHN1cHBvcnRlZCBwZXIgYGVuZ2luZXNgKSBsYWNrcyBmcy5vcGVuQXNCbG9iLCBzbyBmYWxsIGJhY2tcbiAgICAgICAgLy8gdG8gcmVhZGluZyB0aGUgKHNtYWxsKSBsb2cgYXJjaGl2ZSBpbnRvIGEgQmxvYiB0aGVyZS5cbiAgICAgICAgY29uc3QgZmlsZSA9IHR5cGVvZiBmcy5vcGVuQXNCbG9iID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGF3YWl0IGZzLm9wZW5Bc0Jsb2IodGFyR3pQYXRoLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi94LWd6aXAnIH0pXG4gICAgICAgICAgICA6IG5ldyBCbG9iKFtmcy5yZWFkRmlsZVN5bmModGFyR3pQYXRoKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3gtZ3ppcCcgfSlcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdkYXRhJywgZmlsZSwgJ2xvZ3MudGFyLmd6JylcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdjbGllbnRCdWlsZFV1aWQnLCBjbGllbnRCdWlsZFV1aWQpXG5cbiAgICAgICAgY29uc3QgYXV0aCA9IEJ1ZmZlci5mcm9tKGAke3VzZXJ9OiR7a2V5fWApLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgICAgICBib2R5OiBmb3JtRGF0YSBhcyBCb2R5SW5pdCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCYXNpYyAke2F1dGh9YFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBub2RlUmVxdWVzdChcbiAgICAgICAgICAgICdQT1NUJywgVVBMT0FEX0xPR1NfRU5EUE9JTlQsIHJlcXVlc3RPcHRpb25zLCBBUElVdGlscy5VUExPQURfTE9HU19BRERSRVNTXG4gICAgICAgIClcblxuICAgICAgICBmcy51bmxpbmtTeW5jKHRhclBhdGgpXG4gICAgICAgIGZzLnVubGlua1N5bmModGFyR3pQYXRoKVxuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgY29waWVkRmlsZU5hbWVzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0bXBEaXIsIGYpXG4gICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKGZpbGVQYXRoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVsZXRlIHRoZSBTREsgQ0xJIGxvZyBmaWxlIGFmdGVyIHVwbG9hZFxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhDTElfREVCVUdfTE9HU19GSUxFKSkge1xuICAgICAgICAgICAgZnMudW5saW5rU3luYyhDTElfREVCVUdfTE9HU19GSUxFKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gbm9kZVJlcXVlc3Qgc3dhbGxvd3MgZXJyb3JzIGZvciB0aGUgbG9nLXVwbG9hZCBwYXRoIGFuZCByZXR1cm5zIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8vIHJlY29yZCB0aGUgc2lsZW50IHVwbG9hZCBmYWlsdXJlIG9uIHRoZSBtZXRyaWMuXG4gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgICAgICAgIGZhaWx1cmUgPSAndXBsb2FkX25vX3Jlc3BvbnNlJ1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyAmJiByZXNwb25zZS5zdGF0dXMgIT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgLy8gU2VydmVyLXNpZGUgcmVqZWN0aW9uIChlLmcuIFwiRmlsZSBub3QgYXR0YWNoZWRcIikgXHUyMDE0IHJlc3BvbnNlIGlzIHRydXRoeVxuICAgICAgICAgICAgLy8gYnV0IHRoZSB1cGxvYWQgZGlkbid0IGFjdHVhbGx5IGxhbmQuXG4gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgICAgICAgIGZhaWx1cmUgPSBgdXBsb2FkX3N0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9JHtyZXNwb25zZS5tZXNzYWdlID8gJyAtICcgKyBTdHJpbmcocmVzcG9uc2UubWVzc2FnZSkuc2xpY2UoMCwgMjAwKSA6ICcnfWBcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICBmYWlsdXJlID0gYHVwbG9hZExvZ3MgZXhjZXB0aW9uOiAke2dldEVycm9yU3RyaW5nKGVycm9yKX1gXG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3Igd2hpbGUgdXBsb2FkaW5nIGxvZ3M6ICR7Z2V0RXJyb3JTdHJpbmcoZXJyb3IpfWApXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKGV2ZW50TmFtZSwgc3VjY2VzcywgZmFpbHVyZSlcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBpc09iamVjdCA9IChvYmplY3Q6IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gb2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9iamVjdClcbn1cblxuZXhwb3J0IGNvbnN0IE9iamVjdHNBcmVFcXVhbCA9IChvYmplY3QxOiBvYmplY3QsIG9iamVjdDI6IG9iamVjdCkgPT4ge1xuICAgIGNvbnN0IG9iamVjdEtleXMxID0gT2JqZWN0LmtleXMob2JqZWN0MSlcbiAgICBjb25zdCBvYmplY3RLZXlzMiA9IE9iamVjdC5rZXlzKG9iamVjdDIpXG4gICAgaWYgKG9iamVjdEtleXMxLmxlbmd0aCAhPT0gb2JqZWN0S2V5czIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBvYmplY3RLZXlzMSkge1xuICAgICAgICBjb25zdCB2YWx1ZTEgPSBvYmplY3QxW2tleSBhcyBrZXlvZiB0eXBlb2Ygb2JqZWN0MV1cbiAgICAgICAgY29uc3QgdmFsdWUyID0gb2JqZWN0MltrZXkgYXMga2V5b2YgdHlwZW9mIG9iamVjdDFdXG4gICAgICAgIGNvbnN0IGlzQm90aEFyZU9iamVjdHMgPSBpc09iamVjdCh2YWx1ZTEpICYmIGlzT2JqZWN0KHZhbHVlMilcbiAgICAgICAgaWYgKChpc0JvdGhBcmVPYmplY3RzICYmICFPYmplY3RzQXJlRXF1YWwodmFsdWUxLCB2YWx1ZTIpKSB8fCAoIWlzQm90aEFyZU9iamVjdHMgJiYgdmFsdWUxICE9PSB2YWx1ZTIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1WZXJzaW9uID0gbzExeUVycm9ySGFuZGxlcihmdW5jdGlvbiBnZXRQbGF0Zm9ybVZlcnNpb24oY2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzLCB1c2VyQ2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzKSB7XG4gICAgaWYgKCFjYXBzICYmICF1c2VyQ2Fwcykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgYnN0YWNrT3B0aW9ucyA9ICh1c2VyQ2Fwcyk/LlsnYnN0YWNrOm9wdGlvbnMnXVxuICAgIGNvbnN0IGtleXMgPSBbJ3BsYXRmb3JtVmVyc2lvbicsICdwbGF0Zm9ybV92ZXJzaW9uJywgJ29zVmVyc2lvbicsICdvc192ZXJzaW9uJ11cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgaWYgKGNhcHM/LltrZXkgYXMga2V5b2YgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBHb3QgJHtrZXl9IGZyb20gZHJpdmVyIGNhcHNgKVxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhjYXBzPy5ba2V5IGFzIGtleW9mIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc10pXG4gICAgICAgIH0gZWxzZSBpZiAoYnN0YWNrT3B0aW9ucyAmJiBic3RhY2tPcHRpb25zPy5ba2V5IGFzIGtleW9mIENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXNdKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEdvdCAke2tleX0gZnJvbSB1c2VyIGJzdGFjayBvcHRpb25zYClcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoYnN0YWNrT3B0aW9ucz8uW2tleSBhcyBrZXlvZiBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzXSlcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyQ2Fwc1trZXkgYXMga2V5b2YgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBHb3QgJHtrZXl9IGZyb20gdXNlciBjYXBzYClcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodXNlckNhcHNba2V5IGFzIGtleW9mIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc10pXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxufSlcblxuLyoqXG4gKiBSZXNvbHZlIGEgc3RhYmxlLCBodW1hbi1yZWFkYWJsZSBkZXZpY2UgaWRlbnRpZmllciBmb3IgdGhlXG4gKiBgZGV2aWNlYCBmaWVsZCBvbiB0ZXN0X3J1biBpbnRlZ3JhdGlvbnMgcGF5bG9hZHMuXG4gKlxuICogVGVzdEh1YiBkZWR1cGVzIHRlc3RfcnVucyBieSBhIGhhc2ggdGhhdCBpbmNsdWRlcyBgZGV2aWNlYC4gRm9yXG4gKiBBcHAtQXV0b21hdGUgZmxvd3MgdGhhdCBwYXNzIGEgcmVnZXggZGV2aWNlIHJlcXVlc3QgKGUuZy4gYC4qUGl4ZWwuKmApXG4gKiBhY3Jvc3MgbXVsdGlwbGUgcGxhdGZvcm1zLCB0aGUgU0RLIHByZXZpb3VzbHkgc2VudCB0aGUgaW5wdXQgcmVnZXhcbiAqIHN0cmluZywgY2F1c2luZyB0d28gcGFyYWxsZWwgc2Vzc2lvbnMgb24gcGh5c2ljYWxseSBkaWZmZXJlbnQgZGV2aWNlc1xuICogdG8gY29sbGlkZSBvbiB0aGUgaGFzaCBhbmQgbWVyZ2UuIFRoaXMgaGVscGVyIHByZWZlcnMgdGhlIEFwcGl1bVxuICogc2VydmVyLXJlc29sdmVkIGZpZWxkcyAoYGRldmljZU1vZGVsYCAvIGBhcHBpdW06ZGV2aWNlTW9kZWxgKSBiZWZvcmVcbiAqIGZhbGxpbmcgYmFjayB0byB0aGUgcmVxdWVzdGVkIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBNdWx0aXJlbW90ZTogYGRyaXZlckNhcHNgIGZvciBhIGBNdWx0aVJlbW90ZUJyb3dzZXJgIGlzIGEgbWFwIG9mXG4gKiBge2luc3RhbmNlTmFtZTogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzLCBcdTIwMjZ9YCByYXRoZXIgdGhhbiBmbGF0IGNhcHM7XG4gKiB0aGUgaGVscGVyIGRldGVjdHMgdGhhdCBzaGFwZSBhbmQgd2Fsa3MgZWFjaCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gZHJpdmVyQ2FwcyAtIGxpdmUgZHJpdmVyIGNhcGFiaWxpdGllcyAoYGJyb3dzZXIuY2FwYWJpbGl0aWVzYClcbiAqICAgICAgICAgICAgICAgICAgICAgd2hlcmUgQXBwaXVtIHNlcnZlci1yZXNvbHZlZCBmaWVsZHMgYXJlIHBvcHVsYXRlZFxuICogQHBhcmFtIHJlcXVlc3RlZENhcHMgLSB1c2VyLXJlcXVlc3RlZCBjYXBhYmlsaXRpZXMgKHJ1bm5lciBjYXBzIC8geW1sKVxuICogICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGFzIGEgZmFsbGJhY2tcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJlc29sdmVkRGV2aWNlTmFtZSA9IG8xMXlFcnJvckhhbmRsZXIoZnVuY3Rpb24gZ2V0UmVzb2x2ZWREZXZpY2VOYW1lKFxuICAgIGRyaXZlckNhcHM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfCBSZWNvcmQ8c3RyaW5nLCB7IGNhcGFiaWxpdGllcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9PixcbiAgICByZXF1ZXN0ZWRDYXBzPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIHwgUmVjb3JkPHN0cmluZywgeyBjYXBhYmlsaXRpZXM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfT4sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZsYXR0ZW5NdWx0aXJlbW90ZSA9IChcbiAgICAgICAgY2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIHwgUmVjb3JkPHN0cmluZywgeyBjYXBhYmlsaXRpZXM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfT4gfCB1bmRlZmluZWQsXG4gICAgKTogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzW10gPT4ge1xuICAgICAgICBpZiAoIWNhcHMpIHtyZXR1cm4gW119XG4gICAgICAgIGNvbnN0IG9iaiA9IGNhcHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgaWYgKG9iai5kZXZpY2VNb2RlbCB8fCBvYmpbJ2FwcGl1bTpkZXZpY2VNb2RlbCddIHx8IG9iai5kZXZpY2VOYW1lIHx8IG9ialsnYnN0YWNrOm9wdGlvbnMnXSkge1xuICAgICAgICAgICAgLy8gbG9va3MgbGlrZSBmbGF0IGNhcHNcbiAgICAgICAgICAgIHJldHVybiBbY2FwcyBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNdXG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9va3MgbGlrZSBhIG11bHRpcmVtb3RlIG1hcDoge2luc3RhbmNlTmFtZToge2NhcGFiaWxpdGllczogey4uLn19fVxuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhvYmopXG4gICAgICAgICAgICAuZmlsdGVyKCh2KTogdiBpcyB7IGNhcGFiaWxpdGllcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9ID0+XG4gICAgICAgICAgICAgICAgdiAhPT0gbnVsbCAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgJ2NhcGFiaWxpdGllcycgaW4gKHYgYXMgb2JqZWN0KSlcbiAgICAgICAgICAgIC5tYXAodiA9PiB2LmNhcGFiaWxpdGllcyBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzW10gPSBbXG4gICAgICAgIC4uLmZsYXR0ZW5NdWx0aXJlbW90ZShkcml2ZXJDYXBzKSxcbiAgICAgICAgLi4uZmxhdHRlbk11bHRpcmVtb3RlKHJlcXVlc3RlZENhcHMpLFxuICAgIF1cbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7cmV0dXJuIHVuZGVmaW5lZH1cblxuICAgIGNvbnN0IHBpY2tTdHJpbmcgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICBjb25zdCB2ID0gb2JqPy5ba2V5XVxuICAgICAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoID4gMCA/IHYgOiB1bmRlZmluZWRcbiAgICB9XG4gICAgLy8gUHJlY2VkZW5jZTogcHJlZmVyIEFwcGl1bSBzZXJ2ZXItcmVzb2x2ZWQgZGV2aWNlTW9kZWw7IGZhbGwgYmFjayB0aHJvdWdoXG4gICAgLy8gcmVxdWVzdGVkIGNhcCB2YXJpYW50cy4gYGJzdGFjazpvcHRpb25zLmRldmljZU5hbWVgIGlzIHRoZSB1c2VyJ3MgcmVnZXhcbiAgICAvLyBmb3IgQXBwLUF1dG9tYXRlIHJ1bnMsIGtlcHQgYXMgYSBmYWxsYmFjayBmb3IgdGhlIG5vbi1yZXNvbHZlZCBjYXNlLlxuICAgIGNvbnN0IHBhdGhzOiBBcnJheTwoYzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHN0cmluZyB8IHVuZGVmaW5lZD4gPSBbXG4gICAgICAgIGMgPT4gcGlja1N0cmluZyhjLCAnZGV2aWNlTW9kZWwnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGMsICdhcHBpdW06ZGV2aWNlTW9kZWwnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGNbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsICdkZXZpY2VOYW1lJyksXG4gICAgICAgIGMgPT4gcGlja1N0cmluZyhjLCAnYXBwaXVtOmRldmljZU5hbWUnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGMsICdkZXZpY2VOYW1lJyksXG4gICAgXVxuICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgICAgICBmb3IgKGNvbnN0IHNyYyBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gcGF0aChzcmMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICAgIGlmICh2KSB7cmV0dXJuIHZ9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxufSlcblxuZXhwb3J0IGNvbnN0IGdldEJhc2ljQXV0aEhlYWRlciA9ICh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZW5jb2RlZEF1dGggPSBCdWZmZXIuZnJvbShgJHt1c2VybmFtZX06JHtwYXNzd29yZH1gLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIHJldHVybiBgQmFzaWMgJHtlbmNvZGVkQXV0aH1gXG59XG5cbmV4cG9ydCBjb25zdCBpc09iamVjdEVtcHR5ID0gKG9iamVjdE5hbWU6IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgICBvYmplY3ROYW1lICYmXG4gICAgICAgIE9iamVjdC5rZXlzKG9iamVjdE5hbWUpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICBvYmplY3ROYW1lLmNvbnN0cnVjdG9yID09PSBPYmplY3RcbiAgICApXG59XG5cbmV4cG9ydCBjb25zdCBnZXRFcnJvclN0cmluZyA9IChlcnI6IHVua25vd24pID0+IHtcbiAgICBpZiAoIWVycikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gIGVyciAvLyB3b3JrcywgYGVgIG5hcnJvd2VkIHRvIHN0cmluZ1xuICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVyci5tZXNzYWdlIC8vIHdvcmtzLCBgZWAgbmFycm93ZWQgdG8gRXJyb3JcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnVuY2F0ZVN0cmluZyhmaWVsZDogc3RyaW5nLCB0cnVuY2F0ZVNpemVJbkJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlclNpemVJbkJ5dGVzID0gQnVmZmVyLmZyb20oR0lUX01FVEFfREFUQV9UUlVOQ0FURUQpLmxlbmd0aFxuXG4gICAgICAgIGNvbnN0IGZpZWxkQnVmZmVyT2JqID0gQnVmZmVyLmZyb20oZmllbGQpXG4gICAgICAgIGNvbnN0IGxlbk9mRmllbGRCdWZmZXJPYmogPSBmaWVsZEJ1ZmZlck9iai5sZW5ndGhcbiAgICAgICAgY29uc3QgZmluYWxMZW4gPSBNYXRoLmNlaWwobGVuT2ZGaWVsZEJ1ZmZlck9iaiAtIHRydW5jYXRlU2l6ZUluQnl0ZXMgLSBidWZmZXJTaXplSW5CeXRlcylcbiAgICAgICAgaWYgKGZpbmFsTGVuID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdHJ1bmNhdGVkU3RyaW5nID0gZmllbGRCdWZmZXJPYmouc3ViYXJyYXkoMCwgZmluYWxMZW4pLnRvU3RyaW5nKCkgKyBHSVRfTUVUQV9EQVRBX1RSVU5DQVRFRFxuICAgICAgICAgICAgcmV0dXJuIHRydW5jYXRlZFN0cmluZ1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciB3aGlsZSB0cnVuY2F0aW5nIGZpZWxkLCBub3RoaW5nIHdhcyB0cnVuY2F0ZWQgaGVyZTogJHtlcnJvcn1gKVxuICAgIH1cbiAgICByZXR1cm4gZmllbGRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpemVPZkpzb25PYmplY3RJbkJ5dGVzKGpzb25EYXRhOiBHaXRNZXRhRGF0YSk6IG51bWJlciB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoanNvbkRhdGEpKVxuXG4gICAgICAgIHJldHVybiBidWZmZXIubGVuZ3RoXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTb21ldGhpbmcgd2VudCB3cm9uZyB3aGlsZSBjYWxjdWxhdGluZyBzaXplIG9mIEpTT04gb2JqZWN0OiAke2Vycm9yfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIC0xXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0FuZFRydW5jYXRlVkNTSW5mbyhnaXRNZXRhRGF0YTogR2l0TWV0YURhdGEpOiBHaXRNZXRhRGF0YSB7XG4gICAgY29uc3QgZ2l0TWV0YURhdGFTaXplSW5CeXRlcyA9IGdldFNpemVPZkpzb25PYmplY3RJbkJ5dGVzKGdpdE1ldGFEYXRhKVxuXG4gICAgaWYgKGdpdE1ldGFEYXRhU2l6ZUluQnl0ZXMgJiYgZ2l0TWV0YURhdGFTaXplSW5CeXRlcyA+IE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVMpIHtcbiAgICAgICAgY29uc3QgdHJ1bmNhdGVTaXplID0gZ2l0TWV0YURhdGFTaXplSW5CeXRlcyAtIE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVNcbiAgICAgICAgY29uc3QgdHJ1bmNhdGVkQ29tbWl0TWVzc2FnZSA9IHRydW5jYXRlU3RyaW5nKGdpdE1ldGFEYXRhLmNvbW1pdF9tZXNzYWdlLCB0cnVuY2F0ZVNpemUpXG4gICAgICAgIGdpdE1ldGFEYXRhLmNvbW1pdF9tZXNzYWdlID0gdHJ1bmNhdGVkQ29tbWl0TWVzc2FnZVxuICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhgVGhlIGNvbW1pdCBoYXMgYmVlbiB0cnVuY2F0ZWQuIFNpemUgb2YgY29tbWl0IGFmdGVyIHRydW5jYXRpb24gaXMgJHsgZ2V0U2l6ZU9mSnNvbk9iamVjdEluQnl0ZXMoZ2l0TWV0YURhdGEpIC8gMTAyNCB9IEtCYClcbiAgICB9XG5cbiAgICByZXR1cm4gZ2l0TWV0YURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGhhc0Jyb3dzZXJOYW1lID0gKGNhcDogQ2FwYWJpbGl0aWVzLldlYmRyaXZlcklPQ29uZmlnKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFjYXAgfHwgIWNhcC5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGJyb3dzZXJTdGFja0NhcGFiaWxpdGllcyA9IGNhcC5jYXBhYmlsaXRpZXMgYXMgQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllc1xuICAgIHJldHVybiBicm93c2VyU3RhY2tDYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgIT09IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgaXNWYWxpZENhcHNGb3JIZWFsaW5nID0gKGNhcHM6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyk6IGJvb2xlYW4gPT4ge1xuXG4gICAgLy8gR2V0IGFsbCBjYXBhYmlsaXR5IHZhbHVlc1xuICAgIGNvbnN0IGNhcFZhbHVlcyA9IE9iamVjdC52YWx1ZXMoY2FwcylcblxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgY2FwYWJpbGl0aWVzIGFuZCBpZiBhdCBsZWFzdCBvbmUgaGFzIGEgYnJvd3NlciBuYW1lXG4gICAgcmV0dXJuIGNhcFZhbHVlcy5sZW5ndGggPiAwICYmIGNhcFZhbHVlcy5zb21lKGhhc0Jyb3dzZXJOYW1lKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUdXJib1NjYWxlKG9wdGlvbnM6IChCcm93c2Vyc3RhY2tDb25maWcgJiBCcm93c2Vyc3RhY2tPcHRpb25zKSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKG9wdGlvbnM/LnR1cmJvU2NhbGUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5UHJvZHVjdChvcHRpb25zOiAoQnJvd3NlcnN0YWNrQ29uZmlnICYgQnJvd3NlcnN0YWNrT3B0aW9ucykgfCB1bmRlZmluZWQsIGlzQXBwQXV0b21hdGU6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBpc0FwcEF1dG9tYXRlXG4gICAgICAgID8gJ2FwcC1hdXRvbWF0ZSdcbiAgICAgICAgOiAoaXNUdXJib1NjYWxlKG9wdGlvbnMpID8gJ3R1cmJvc2NhbGUnIDogJ2F1dG9tYXRlJylcbn1cblxudHlwZSBQb2xsaW5nUmVzdWx0ID0ge1xuICAgIGRhdGE6IGFueTtcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7IC8vIE9wdGlvbmFsIG1lc3NhZ2UgZm9yIHRpbWVvdXQgY2FzZXNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBvbGxBcGkoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgdXBwZXJMaW1pdDogbnVtYmVyLFxuICAgIHN0YXJ0VGltZSA9IERhdGUubm93KClcbik6IFByb21pc2U8UG9sbGluZ1Jlc3VsdD4ge1xuICAgIHBhcmFtcy50aW1lc3RhbXAgPSBNYXRoLnJvdW5kKERhdGUubm93KCkgLyAxMDAwKVxuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgY3VycmVudCB0aW1lc3RhbXAgJHtwYXJhbXMudGltZXN0YW1wfWApXG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2VHZXRSZXF1ZXN0KHVybCwgcGFyYW1zLCBoZWFkZXJzKVxuICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICBtZXNzYWdlOiAnUG9sbGluZyBzdWNjZWVkZWQuJyxcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlICYmIGVycm9yLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0UG9sbFRpbWUgPSBwYXJzZUludChlcnJvci5yZXNwb25zZS5oZWFkZXJzLmdldCgnbmV4dF9wb2xsX3RpbWUnKSwgMTApICogMTAwMFxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGB0aW1lSW5NaWxsaXMgJHtuZXh0UG9sbFRpbWV9YClcblxuICAgICAgICAgICAgaWYgKGlzTmFOKG5leHRQb2xsVGltZSkpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignSW52YWxpZCBvciBtaXNzaW5nIGBuZXh0UG9sbFRpbWVgIGhlYWRlci4gU3RvcHBpbmcgcG9sbGluZy4nKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBlcnJvci5yZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBuZXh0UG9sbFRpbWUgaGVhZGVyIHZhbHVlLiBQb2xsaW5nIHN0b3BwZWQuJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gbmV4dFBvbGxUaW1lIC0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBlbGFwc2VkVGltZSAke2VsYXBzZWRUaW1lfSB0aW1lSW5NaWxsaXMgJHtuZXh0UG9sbFRpbWV9IHVwcGVyTGltaXQgJHt1cHBlckxpbWl0fWBcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKG5leHRQb2xsVGltZSA+IHVwcGVyTGltaXQpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignUG9sbGluZyBzdG9wcGVkIGR1ZSB0byB1cHBlciB0aW1lIGxpbWl0LicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGVycm9yLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQb2xsaW5nIHN0b3BwZWQgZHVlIHRvIHVwcGVyIHRpbWUgbGltaXQuJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgUG9sbGluZyBhZ2FpbiBpbiAke2VsYXBzZWRUaW1lfW1zIHdpdGggcGFyYW1zOmAsIHBhcmFtcylcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGVsYXBzZWRUaW1lKSlcbiAgICAgICAgICAgIHJldHVybiBwb2xsQXBpKHVybCwgcGFyYW1zLCBoZWFkZXJzLCB1cHBlckxpbWl0LCBzdGFydFRpbWUpXG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBlcnJvci5yZXNwb25zZS5zdGF0dXNUZXh0XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEVycm9yID0gSlNPTi5wYXJzZShlcnJvci5yZXNwb25zZS5qc29uKCkpXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gcGFyc2VkRXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBwYXJzaW5nIHBvbGxBcGkgcmVxdWVzdCBib2R5ICR7ZXJyb3IucmVzcG9uc2UuYm9keX1gKVxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICdVbmtub3duIGVycm9yJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgVW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZDogJHtlcnJvcn1gKVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YToge30sIGhlYWRlcnM6IHt9LCBtZXNzYWdlOiAnVW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZC4nIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFrZUdldFJlcXVlc3QodXJsOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiwgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybClcbiAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGtleSkgPT4gdXJsT2JqLnNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBwYXJhbXNba2V5XSkpXG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybE9iai50b1N0cmluZygpLCB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgfSlcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ1JlcXVlc3QgZmFpbGVkJylcbiAgICAgICAgZXJyb3IucmVzcG9uc2UgPSByZXNwb25zZVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjY2Vzc2liaWxpdHlTY3JpcHQ8UmV0dXJuVHlwZT4oXG4gICAgYnJvd3NlcjogYW55LFxuICAgIGZuQm9keTogc3RyaW5nLFxuICAgIGFyZz86IHVua25vd25cbik6IFByb21pc2U8UmV0dXJuVHlwZT4ge1xuICAgIHJldHVybiBicm93c2VyLmV4ZWN1dGUoXG4gICAgICAgIGByZXR1cm4gKGZ1bmN0aW9uICguLi5ic3RhY2tTZGtBcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBic3RhY2tTZGtBcmdzWzBdO1xuICAgICAgICAgICAgICAgIGJzdGFja1Nka0FyZ3MucHVzaChyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICAke2ZuQm9keS5yZXBsYWNlKC9hcmd1bWVudHMvZywgJ2JzdGFja1Nka0FyZ3MnKX1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSgke2FyZyA/IEpTT04uc3RyaW5naWZ5KGFyZykgOiAnJ30pYFxuICAgIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSGFzaENvZGVGcm9tRmllbGRzKGZpZWxkczogQXJyYXk8c3RyaW5nIHwgb2JqZWN0Pikge1xuICAgIGNvbnN0IHNlcmlhbGl6ZSA9ICh2YWx1ZToge30pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBmaWVsZHMubWFwKHNlcmlhbGl6ZSkuam9pbignfCcpXG4gICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoc2VyaWFsaXplZCkuZGlnZXN0KCdoZXgnKVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEJvb2xlYW5WYWx1ZUZyb21TdHJpbmcodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiBbJ3RydWUnXS5pbmNsdWRlcyh2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKSlcbn1cblxuLyoqXG4gKiBTREstMzczNzogQ29lcmNlIHN0cmluZ2lmaWVkIGJvb2xlYW5zICgndHJ1ZScvJ2ZhbHNlJywgYW55IGNhc2UpIGluIGEgZmxhdFxuICogb3B0aW9ucyBvYmplY3QgdG8gcmVhbCBib29sZWFucywgbGVhdmluZyBldmVyeSBvdGhlciB2YWx1ZSB1bnRvdWNoZWQuIEJvb2xlYW4tXG4gKiB0eXBlZCBhY2Nlc3NpYmlsaXR5IG9wdGlvbnMgKGUuZy4gYXV0b1NjYW5uaW5nKSBhcmUgY29tbW9ubHkgc3VwcGxpZWQgYXNcbiAqIHN0cmluZ3MgZnJvbSBKUyBjb25maWcgLyBlbnY7IHdpdGhvdXQgY29lcmNpb24gdGhleSBmYWlsIFczQyBjYXBzIHZhbGlkYXRpb25cbiAqIGFuZCBhcmUgc2lsZW50bHkgZHJvcHBlZC4gT25seSB0aGUgZXhhY3Qgc3RyaW5ncyAndHJ1ZScvJ2ZhbHNlJyBhcmUgY29udmVydGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29lcmNlU3RyaW5nQm9vbGVhbnM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9ialxuICAgIH1cbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpc2VkID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIGlmIChub3JtYWxpc2VkID09PSAndHJ1ZScgfHwgbm9ybWFsaXNlZCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgIG91dFtrZXldID0gbm9ybWFsaXNlZCA9PT0gJ3RydWUnXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXRba2V5XSA9IHZhbHVlXG4gICAgfVxuICAgIHJldHVybiBvdXQgYXMgVFxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGtleSBpcyBzYWZlIHRvIHVzZSBmb3Igb2JqZWN0IHByb3BlcnR5IGFzc2lnbm1lbnQgdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUga2V5IGlzIHNhZmUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5mdW5jdGlvbiBpc1NhZmVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYW5nZXJvdXNLZXlzID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ11cbiAgICByZXR1cm4gIWRhbmdlcm91c0tleXMuaW5jbHVkZXMoa2V5KVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGJvb2xlYW4gdmFsdWUgZnJvbSBtaXhlZCB0eXBlcyAoYm9vbGVhbiBvciBzdHJpbmcpXG4gKiBPbmx5IGFjY2VwdHMgdHJ1ZSBib29sZWFuIG9yIHN0cmluZyBcInRydWVcIiAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRFbmFibGVkVmFsdWUodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblZhbHVlRnJvbVN0cmluZyh2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXAodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5zb3VyY2VzOiBhbnlbXSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGlmICghc291cmNlcy5sZW5ndGgpIHtyZXR1cm4gdGFyZ2V0fVxuICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKVxuXG4gICAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIFNraXAgZGFuZ2Vyb3VzIGtleXMgdGhhdCBjb3VsZCBsZWFkIHRvIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICAgICAgICAgIGlmICghaXNTYWZlS2V5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHRhcmdldFtrZXldXG5cbiAgICAgICAgICAgIGlmIChpc09iamVjdChzb3VyY2VWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFZhbHVlIHx8ICFpc09iamVjdCh0YXJnZXRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVZhbHVlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ2hyb21lT3B0aW9ucyhiYXNlOiBDYXBhYmlsaXRpZXMuQ2hyb21lT3B0aW9ucywgb3ZlcnJpZGU6IFBhcnRpYWw8Q2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnM+KTogQ2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnMge1xuICAgIGNvbnN0IG1lcmdlZDogQ2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnMgPSB7IC4uLmJhc2UgfVxuXG4gICAgaWYgKG92ZXJyaWRlLmFyZ3MpIHtcbiAgICAgICAgbWVyZ2VkLmFyZ3MgPSBbLi4uKGJhc2UuYXJncyB8fCBbXSksIC4uLm92ZXJyaWRlLmFyZ3NdXG4gICAgfVxuXG4gICAgaWYgKG92ZXJyaWRlLmV4dGVuc2lvbnMpIHtcbiAgICAgICAgbWVyZ2VkLmV4dGVuc2lvbnMgPSBbLi4uKGJhc2UuZXh0ZW5zaW9ucyB8fCBbXSksIC4uLm92ZXJyaWRlLmV4dGVuc2lvbnNdXG4gICAgfVxuXG4gICAgaWYgKG92ZXJyaWRlLnByZWZzKSB7XG4gICAgICAgIG1lcmdlZC5wcmVmcyA9IG1lcmdlRGVlcCh7IC4uLihiYXNlLnByZWZzIHx8IHt9KSB9LCBvdmVycmlkZS5wcmVmcylcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsT3JFbXB0eShzdHJpbmc6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhc3RyaW5nIHx8IHN0cmluZy50cmltKCkgPT09ICcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hhc2goZW50aXR5OiBhbnkpIHtcbiAgICByZXR1cm4gQm9vbGVhbihlbnRpdHkgJiYgdHlwZW9mKGVudGl0eSkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGVudGl0eSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXN0ZWRLZXlWYWx1ZShoYXNoOiBhbnksIGtleXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICByZXR1cm4ga2V5cy5yZWR1Y2UoKGhhc2gsIGtleSkgPT4gKGlzSGFzaChoYXNoKSA/IGhhc2hba2V5XSA6IHVuZGVmaW5lZCksIGhhc2gpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBsaXN0ID0gZnMucmVhZGRpclN5bmMoZGlyKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbihkaXIsIGxpc3RbaV0pXG4gICAgICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmaWxlbmFtZSlcblxuICAgICAgICBpZiAoZmlsZW5hbWUgPT09ICcuJyB8fCBmaWxlbmFtZSA9PT0gJy4uJykge1xuICAgICAgICAgICAgLy8gcGFzcyB0aGVzZSBmaWxlc1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgLy8gcm1kaXIgcmVjdXJzaXZlbHlcbiAgICAgICAgICAgIHJlbW92ZURpcihmaWxlbmFtZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJtIGZpbGVuYW1lXG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKGZpbGVuYW1lKVxuICAgICAgICB9XG4gICAgfVxuICAgIGZzLnJtZGlyU3luYyhkaXIpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXIpKXtcbiAgICAgICAgcmVtb3ZlRGlyKGRpcilcbiAgICB9XG4gICAgZnMubWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzV3JpdGFibGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgICAgZnMuYWNjZXNzU3luYyhkaXJQYXRoLCBmcy5jb25zdGFudHMuV19PSylcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVhZFdyaXRlQWNjZXNzKGRpclBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGZzLmNobW9kU3luYyhkaXJQYXRoLCAwbzY2NilcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBEaXJlY3RvcnkgJHtkaXJQYXRofSBpcyBub3cgcmVhZC93cml0ZSBhY2Nlc3NpYmxlLmApXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gc2V0IGRpcmVjdG9yeSBhY2Nlc3M6ICR7ZXJyLnN0YWNrfWApXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9jaGFUZXN0SGllcmFyY2h5KHRlc3Q6IEZyYW1ld29ya3MuVGVzdCkge1xuICAgIGNvbnN0IHZhbHVlOiBzdHJpbmdbXSA9IFtdXG4gICAgaWYgKHRlc3QuY3R4ICYmIHRlc3QuY3R4LnRlc3QpIHtcbiAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBwYXJlbnQgb2JqZWN0LCB1dGlsaXplIGl0IGVsc2UgZ2V0IGZyb20gY29udGV4dFxuICAgICAgICBsZXQgcGFyZW50ID0gdHlwZW9mIHRlc3QucGFyZW50ID09PSAnb2JqZWN0JyA/IHRlc3QucGFyZW50IDogdGVzdC5jdHgudGVzdC5wYXJlbnRcbiAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQudGl0bGUgIT09ICcnKSB7XG4gICAgICAgICAgICB2YWx1ZS5wdXNoKHBhcmVudC50aXRsZSlcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGVzdC5kZXNjcmlwdGlvbiAmJiB0ZXN0LmZ1bGxOYW1lKSB7XG4gICAgICAgIC8vIGZvciBKYXNtaW5lXG4gICAgICAgIHZhbHVlLnB1c2godGVzdC5kZXNjcmlwdGlvbilcbiAgICAgICAgLy8gU3RyaXAgdGhlIHRyYWlsaW5nIFwiIDxkZXNjcmlwdGlvbj5cIiBzdWZmaXggd2l0aG91dCBidWlsZGluZyBhIHJlZ2V4IGZyb21cbiAgICAgICAgLy8gYSB2YXJpYWJsZSAoYXZvaWRzIFJlRG9TIGFuZCByZWdleC1tZXRhY2hhcmFjdGVyIG1pc21hdGNoZXMgaW4gZGVzY3JpcHRpb25zKS5cbiAgICAgICAgY29uc3QgZGVzY1N1ZmZpeCA9IGAgJHt0ZXN0LmRlc2NyaXB0aW9ufWBcbiAgICAgICAgdmFsdWUucHVzaCh0ZXN0LmZ1bGxOYW1lLmVuZHNXaXRoKGRlc2NTdWZmaXgpID8gdGVzdC5mdWxsTmFtZS5zbGljZSgwLCAtZGVzY1N1ZmZpeC5sZW5ndGgpIDogdGVzdC5mdWxsTmFtZSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJldmVyc2UoKVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybU8xMXlTeW5jID0gYXN5bmMgKGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIpID0+IHtcbiAgICBpZiAoaXNCcm93c2Vyc3RhY2tTZXNzaW9uKGJyb3dzZXIpKSB7XG4gICAgICAgIGF3YWl0IGJyb3dzZXIuZXhlY3V0ZShgYnJvd3NlcnN0YWNrX2V4ZWN1dG9yOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2Fubm90YXRlJyxcbiAgICAgICAgICAgIGFyZ3VtZW50czoge1xuICAgICAgICAgICAgICAgIGRhdGE6IGBPYnNlcnZhYmlsaXR5U3luYzoke0RhdGUubm93KCl9YCxcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2RlYnVnJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KX1gKVxuICAgIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGNhcGFiaWxpdGllcyByZXByZXNlbnQgYSBtdWx0aXJlbW90ZSBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gY2FwYWJpbGl0aWVzIC0gVGhlIGNhcGFiaWxpdGllcyB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiBjYXBhYmlsaXRpZXMgcmVwcmVzZW50IGFueSBtdWx0aXJlbW90ZSBjb25maWd1cmF0aW9uIChyZWd1bGFyIG9yIHBhcmFsbGVsKVxuICpcbiAqIEBleGFtcGxlXG4gKiBSZWd1bGFyIG11bHRpcmVtb3RlIChvYmplY3QpOlxuICogeyBicm93c2VyQTogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0sIGJyb3dzZXJCOiB7IGNhcGFiaWxpdGllczogey4uLn0gfSB9XG4gKlxuICogUGFyYWxsZWwgbXVsdGlyZW1vdGUgKGFycmF5IHdpdGggbmVzdGVkIHN0cnVjdHVyZSk6XG4gKiBbeyBicm93c2VyQTogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0sIGJyb3dzZXJCOiB7IGNhcGFiaWxpdGllczogey4uLn0gfSB9XVxuICpcbiAqIFJlZ3VsYXIgY2FwYWJpbGl0aWVzIChhcnJheSk6XG4gKiBbeyBicm93c2VyTmFtZTogJ2Nocm9tZScsIC4uLiB9XVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNdWx0aVJlbW90ZUNhcHMoY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXRpZXMuVGVzdHJ1bm5lckNhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIC8vIFJlZ3VsYXIgbXVsdGlyZW1vdGUgaXMgYW4gb2JqZWN0IChub3QgYXJyYXkpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBFbXB0eSBhcnJheSBpcyBub3QgbXVsdGlyZW1vdGVcbiAgICBpZiAoY2FwYWJpbGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBQYXJhbGxlbCBtdWx0aXJlbW90ZSBpcyBhbiBhcnJheSB3aXRoIG5lc3RlZCBjYXBhYmlsaXRpZXMgc3RydWN0dXJlXG4gICAgcmV0dXJuIGNhcGFiaWxpdGllcy5ldmVyeShjYXAgPT5cbiAgICAgICAgT2JqZWN0LnZhbHVlcyhjYXApLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhjYXApLmV2ZXJ5KGMgPT4gYyAhPT0gbnVsbCAmJiB0eXBlb2YgYyA9PT0gJ29iamVjdCcgJiYgKGMgYXMgeyBjYXBhYmlsaXRpZXM6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9KS5jYXBhYmlsaXRpZXMpXG4gICAgKVxufVxuIiwgImltcG9ydCBUcmFuc3BvcnQgZnJvbSAnd2luc3Rvbi10cmFuc3BvcnQnXG5cbmNvbnN0IExPR19MRVZFTFMgPSB7XG4gICAgSU5GTzogJ0lORk8nLCBFUlJPUjogJ0VSUk9SJywgREVCVUc6ICdERUJVRycsIFRSQUNFOiAnVFJBQ0UnLCBXQVJOOiAnV0FSTicsXG59XG5cbmNsYXNzIGxvZ1BhdGNoZXIgZXh0ZW5kcyBUcmFuc3BvcnQge1xuICAgIGxvZ1RvVGVzdE9wcyA9IChsZXZlbCA9IExPR19MRVZFTFMuSU5GTywgbWVzc2FnZSA9IFsnJ10gYXMgdW5rbm93bltdKSA9PiB7XG4gICAgICAgIChwcm9jZXNzLmVtaXQgYXMgRnVuY3Rpb24pKGBiczphZGRMb2c6JHtwcm9jZXNzLnBpZH1gLCB7XG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIGxldmVsOiBsZXZlbC50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgICAgbWVzc2FnZTogYFwiJHttZXNzYWdlLmpvaW4oJywgJyl9XCJgLFxuICAgICAgICAgICAga2luZDogJ1RFU1RfTE9HJyxcbiAgICAgICAgICAgIGh0dHBfcmVzcG9uc2U6IHt9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyogUGF0Y2hpbmcgdGhpcyB3b3VsZCBzaG93IHVzZXIgYW4gZXh0ZW5kZWQgdHJhY2Ugb24gdGhlaXIgY2xpICovXG4gICAgdHJhY2UgPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuVFJBQ0UsIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgZGVidWcgPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuREVCVUcsIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgaW5mbyA9ICguLi5tZXNzYWdlOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgdGhpcy5sb2dUb1Rlc3RPcHMoTE9HX0xFVkVMUy5JTkZPLCBtZXNzYWdlKVxuICAgIH1cblxuICAgIHdhcm4gPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuV0FSTiwgbWVzc2FnZSlcbiAgICB9XG5cbiAgICBlcnJvciA9ICguLi5tZXNzYWdlOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgdGhpcy5sb2dUb1Rlc3RPcHMoTE9HX0xFVkVMUy5FUlJPUiwgbWVzc2FnZSlcbiAgICB9XG5cbiAgICBsb2cgPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuSU5GTywgbWVzc2FnZSlcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBsb2dQYXRjaGVyXG4iLCAiaW1wb3J0IHsgY3JlYXRlT2JqZWN0Q3N2V3JpdGVyIH0gZnJvbSAnY3N2LXdyaXRlcidcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IGZzUHJvbWlzZSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHR5cGUgeyBFbnRyeVR5cGUgfSBmcm9tICdub2RlOnBlcmZfaG9va3MnXG5pbXBvcnQgeyBwZXJmb3JtYW5jZSwgUGVyZm9ybWFuY2VPYnNlcnZlciB9IGZyb20gJ25vZGU6cGVyZl9ob29rcydcbmltcG9ydCB1dGlsIGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB3b3JrZXIgZnJvbSAnbm9kZTp3b3JrZXJfdGhyZWFkcydcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB7IGFyY2gsIGhvc3RuYW1lLCBwbGF0Zm9ybSwgdHlwZSwgdmVyc2lvbiB9IGZyb20gJ25vZGU6b3MnXG5cbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uLy4uL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB7IFBFUkZfTUVBU1VSRU1FTlRfRU5WIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IEFQSVV0aWxzIGZyb20gJy4uLy4uL2NsaS9hcGlVdGlscy5qcydcbmltcG9ydCB7IENMSVV0aWxzIH0gZnJvbSAnLi4vLi4vY2xpL2NsaVV0aWxzLmpzJ1xuaW1wb3J0IHsgRVZFTlRTIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgZmV0Y2hXcmFwIGZyb20gJy4uLy4uL2ZldGNoV3JhcHBlci5qcydcbmltcG9ydCB0eXBlIHsgQ3N2V3JpdGVyIH0gZnJvbSAnY3N2LXdyaXRlci9zcmMvbGliL2Nzdi13cml0ZXIuanMnXG5pbXBvcnQgdHlwZSB7IE9iamVjdE1hcCB9IGZyb20gJ2Nzdi13cml0ZXIvc3JjL2xpYi9sYW5nL29iamVjdC5qcydcbmltcG9ydCB0eXBlIHsgQnJvd3NlciB9IGZyb20gJ3dlYmRyaXZlcmlvJ1xuXG4vLyBUZWxlbWV0cnkgbXVzdCBuZXZlciB0aHJvdyBpbnRvIGJ1c2luZXNzIGxvZ2ljLiBOb2RlIDE4J3MgcGVyZl9ob29rcyByZWplY3RzXG4vLyBuZWdhdGl2ZSB0aW1lc3RhbXBzIChlLmcuIHBlcmZvcm1hbmNlLm5vdygpIHVuZGVyIGZha2VkIHRpbWVycywgb3IgYW55IG90aGVyXG4vLyBlZGdlKSB3aXRoIEVSUl9QRVJGT1JNQU5DRV9JTlZBTElEX1RJTUVTVEFNUDsgTm9kZSAyMCsgdG9sZXJhdGVzIHRoZW0uIFdyYXBwaW5nXG4vLyBtYXJrL21lYXN1cmUga2VlcHMgYW4gaW5zdHJ1bWVudGF0aW9uIGZhaWx1cmUgZnJvbSBicmVha2luZyBhIGNhbGxlcidzIGhvb2tcbi8vIChlLmcuIGEgc2VydmljZSBiZWZvcmUoKSksIGFuZCBpcyBhIG5vLW9wIG9uIHRoZSBoYXBweSBwYXRoLlxuZnVuY3Rpb24gc2FmZU1hcmsobWFya05hbWU6IHN0cmluZykge1xuICAgIHRyeSB7IHBlcmZvcm1hbmNlLm1hcmsobWFya05hbWUpIH0gY2F0Y2ggeyAvKiBpbnN0cnVtZW50YXRpb24gbXVzdCBub3QgdGhyb3cgKi8gfVxufVxuZnVuY3Rpb24gc2FmZU1lYXN1cmUobWVhc3VyZU5hbWU6IHN0cmluZywgc3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcpIHtcbiAgICB0cnkgeyBwZXJmb3JtYW5jZS5tZWFzdXJlKG1lYXN1cmVOYW1lLCBzdGFydCwgZW5kKSB9IGNhdGNoIHsgLyogaW5zdHJ1bWVudGF0aW9uIG11c3Qgbm90IHRocm93ICovIH1cbn1cblxudHlwZSBQZXJmb3JtYW5jZURldGFpbHMgPSB7XG4gICAgc3VjY2Vzcz86IHRydWUsXG4gICAgZmFpbHVyZT86IHN0cmluZyxcbiAgICB0ZXN0TmFtZT86IHN0cmluZyxcbiAgICB3b3JrZXI/OiBzdHJpbmcgfCBudW1iZXIsXG4gICAgY2xpZW50V29ya2VySWQ/OiBzdHJpbmcsXG4gICAgY29tbWFuZD86IHN0cmluZyxcbiAgICBob29rVHlwZT86IHN0cmluZyxcbiAgICBwbGF0Zm9ybT86IHN0cmluZyB8IG51bWJlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZXJmb3JtYW5jZVRlc3RlciB7XG4gICAgc3RhdGljIF9vYnNlcnZlcjogUGVyZm9ybWFuY2VPYnNlcnZlclxuICAgIHN0YXRpYyBfY3N2V3JpdGVyOiBDc3ZXcml0ZXI8T2JqZWN0TWFwPHt9Pj5cbiAgICBwcml2YXRlIHN0YXRpYyBfZXZlbnRzOiBQZXJmb3JtYW5jZUVudHJ5W10gPSBbXVxuICAgIHByaXZhdGUgc3RhdGljIF9tZWFzdXJlZEV2ZW50czogQXJyYXk8UGVyZm9ybWFuY2VFbnRyeSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IFtdXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2hhc1N0b3BwZWRHZW5lcmF0aW9uID0gZmFsc2VcbiAgICBwcml2YXRlIHN0YXRpYyBfc3RvcEdlbmVyYXRlQ2FsbENvdW50ID0gMFxuICAgIHN0YXRpYyBzdGFydGVkID0gZmFsc2VcbiAgICBzdGF0aWMgZGV0YWlsczogeyBba2V5OiBzdHJpbmddOiBQZXJmb3JtYW5jZURldGFpbHMgfSA9IHt9XG4gICAgc3RhdGljIGV2ZW50c01hcDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgc3RhdGljIGJyb3dzZXI/OiBCcm93c2VyXG4gICAgc3RhdGljIHNjZW5hcmlvVGhhdFJhbjogc3RyaW5nW11cbiAgICBzdGF0aWMganNvblJlcG9ydERpck5hbWUgPSAncGVyZm9ybWFuY2UtcmVwb3J0J1xuICAgIHN0YXRpYyBqc29uUmVwb3J0RGlyUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycsIHRoaXMuanNvblJlcG9ydERpck5hbWUpXG4gICAgc3RhdGljIGpzb25SZXBvcnRGaWxlTmFtZSA9IGAke3RoaXMuanNvblJlcG9ydERpclBhdGh9L3BlcmZvcm1hbmNlLXJlcG9ydC0ke1BlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpfS5qc29uYFxuXG4gICAgc3RhdGljIHN0YXJ0TW9uaXRvcmluZyhjc3ZOYW1lOiBzdHJpbmcgPSAncGVyZm9ybWFuY2UtcmVwb3J0LmNzdicpIHtcblxuICAgICAgICAvLyBDcmVhdGUgcGVyZm9ybWFuY2UtcmVwb3J0IGRpciBpZiBub3QgZXhpc3RzIGFscmVhZHlcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuanNvblJlcG9ydERpclBhdGgpKSB7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5qc29uUmVwb3J0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBQZXJmb3JtYW5jZU9ic2VydmVyKGxpc3QgPT4ge1xuICAgICAgICAgICAgbGlzdC5nZXRFbnRyaWVzKClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuZW50cnlUeXBlID09PSAnbWVhc3VyZScpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goZW50cnkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmluYWxFbnRyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBlbnRyeS50b0pTT04oKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbmFsRW50cnkuc3RhcnRUaW1lID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UudGltZU9yaWdpbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFN0YXJ0VGltZSA9IGZpbmFsRW50cnkuc3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxFbnRyeS5zdGFydFRpbWUgPSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgZmluYWxFbnRyeS5zdGFydFRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFRpbWVzdGFtcCBjb252ZXJzaW9uIGZvciAke2VudHJ5Lm5hbWV9OiAke29yaWdpbmFsU3RhcnRUaW1lfSAtPiAke2ZpbmFsRW50cnkuc3RhcnRUaW1lfSAodGltZU9yaWdpbjogJHtwZXJmb3JtYW5jZS50aW1lT3JpZ2lufSlgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIGNvbnZlcnRpbmcgc3RhcnRUaW1lIHRvIGVwb2NoOiAke3V0aWwuZm9ybWF0KGUpfWApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXRhaWxzW2VudHJ5Lm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbEVudHJ5ID0gT2JqZWN0LmFzc2lnbihmaW5hbEVudHJ5LCB0aGlzLmRldGFpbHNbZW50cnkubmFtZV0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZGV0YWlsc1tlbnRyeS5uYW1lXVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlZEV2ZW50cy5wdXNoKGZpbmFsRW50cnkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgICAgIGxpc3QuZ2V0RW50cmllcygpLmZvckVhY2goKGVudHJ5KSA9PiB0aGlzLl9ldmVudHMucHVzaChlbnRyeSkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGVudHJ5VHlwZXM6IEVudHJ5VHlwZVtdID0gWydtZWFzdXJlJ11cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgZW50cnlUeXBlcy5wdXNoKCdmdW5jdGlvbicpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXIub2JzZXJ2ZSh7IGJ1ZmZlcmVkOiB0cnVlLCBlbnRyeVR5cGVzOiBlbnRyeVR5cGVzIH0pXG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWVcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgdGhpcy5fY3N2V3JpdGVyID0gY3JlYXRlT2JqZWN0Q3N2V3JpdGVyKHtcbiAgICAgICAgICAgICAgICBwYXRoOiBjc3ZOYW1lLFxuICAgICAgICAgICAgICAgIGhlYWRlcjogW1xuICAgICAgICAgICAgICAgICAgICB7IGlkOiAnbmFtZScsIHRpdGxlOiAnRnVuY3Rpb24gTmFtZScgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBpZDogJ3RpbWUnLCB0aXRsZTogJ0V4ZWN1dGlvbiBUaW1lIChtcyknIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGNhbGN1bGF0ZVRpbWVzKG1ldGhvZHM6IHN0cmluZ1tdKSA6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRpbWVzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge31cbiAgICAgICAgdGhpcy5fZXZlbnRzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGlmICghdGltZXNbZW50cnkubmFtZV0pIHtcbiAgICAgICAgICAgICAgICB0aW1lc1tlbnRyeS5uYW1lXSA9IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRpbWVzW2VudHJ5Lm5hbWVdICs9IGVudHJ5LmR1cmF0aW9uXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHRpbWVUYWtlbiA9IG1ldGhvZHMucmVkdWNlKChhLCBjKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGltZXNbY10gKyAoYSB8fCAwKVxuICAgICAgICB9LCAwKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFRpbWUgZm9yICR7bWV0aG9kc30gaXMgJHt0aW1lVGFrZW59YClcbiAgICAgICAgcmV0dXJuIHRpbWVUYWtlblxuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBzdG9wQW5kR2VuZXJhdGUoZmlsZW5hbWU6IHN0cmluZyA9ICdwZXJmb3JtYW5jZS1vd24uaHRtbCcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBldmVudHNKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5fbWVhc3VyZWRFdmVudHMpXG4gICAgICAgICAgICAvLyByZW1vdmUgZW5jbG9zaW5nIGFycmF5IGFuZCBhZGQgYSB0cmFpbGluZyBjb21tYSBzbyB0aGF0IHdlXG4gICAgICAgICAgICAvLyBkb250IG5lZWQgdG8gYm90aCByZWFkIGFuZCB0aGVuIHdyaXRlIHRoZSBmaWxlLCB3ZSBjYW4gdXNlIGFwcGVuZCBpbnN0ZWFkXG4gICAgICAgICAgICBjb25zdCBmaW5hbEpTT05TdHIgPSBldmVudHNKc29uLnNsaWNlKDEsIC0xKSArICcsJ1xuICAgICAgICAgICAgYXdhaXQgZnNQcm9taXNlLmFwcGVuZEZpbGUodGhpcy5qc29uUmVwb3J0RmlsZU5hbWUsIGZpbmFsSlNPTlN0cilcbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIHdyaXRlIGV2ZW50cyBvZiB0aGUgd29ya2VyIHRvICR7dGhpcy5qc29uUmVwb3J0RmlsZU5hbWV9OiAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKVxuXG4gICAgICAgIGlmICghcHJvY2Vzcy5lbnZbUEVSRl9NRUFTVVJFTUVOVF9FTlZdKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlXG5cbiAgICAgICAgLy8gR2VuZXJhdGUgQ1NWIGFuZCBIVE1MIHJlcG9ydHMgdXNpbmcgZGlyZWN0bHkgY29sbGVjdGVkIGV2ZW50c1xuICAgICAgICB0aGlzLmdlbmVyYXRlQ1NWKHRoaXMuX2V2ZW50cylcblxuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZW5lcmF0ZVJlcG9ydCh0aGlzLl9ldmVudHMpXG4gICAgICAgIGNvbnN0IGRpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBmaWxlbmFtZSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzUHJvbWlzZS53cml0ZUZpbGUoZGlyLCBjb250ZW50KVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oYFBlcmZvcm1hbmNlIHJlcG9ydCBpcyBhdCAke3BhdGh9YClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIGluIHdyaXRpbmcgaHRtbCAke3V0aWwuZm9ybWF0KGVycil9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZW5lcmF0ZVJlcG9ydChlbnRyaWVzOiBQZXJmb3JtYW5jZUVudHJ5W10pIHtcbiAgICAgICAgbGV0IGh0bWwgPSAnPCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+PHRpdGxlPlBlcmZvcm1hbmNlIFJlcG9ydDwvdGl0bGU+PC9oZWFkPjxib2R5PidcbiAgICAgICAgaHRtbCArPSAnPGgxPlBlcmZvcm1hbmNlIFJlcG9ydDwvaDE+J1xuICAgICAgICBodG1sICs9ICc8dGFibGU+PHRoZWFkPjx0cj48dGg+RnVuY3Rpb24gTmFtZTwvdGg+PHRoPkR1cmF0aW9uIChtcyk8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+J1xuICAgICAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBodG1sICs9IGA8dHI+PHRkPiR7ZW50cnkubmFtZX08L3RkPjx0ZD4ke2VudHJ5LmR1cmF0aW9ufTwvdGQ+PC90cj5gXG4gICAgICAgIH0pXG4gICAgICAgIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT48L2JvZHk+PC9odG1sPidcbiAgICAgICAgcmV0dXJuIGh0bWxcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2VuZXJhdGVDU1YoZW50cmllczogUGVyZm9ybWFuY2VFbnRyeVtdKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge31cbiAgICAgICAgZW50cmllcy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRpbWVzW2VudHJ5Lm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgdGltZXNbZW50cnkubmFtZV0gPSAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lc1tlbnRyeS5uYW1lXSArPSBlbnRyeS5kdXJhdGlvblxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgICAgICAgdGltZTogZW50cnkuZHVyYXRpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZGF0ID0gT2JqZWN0LmVudHJpZXModGltZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICB0aW1lOiB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLl9jc3ZXcml0ZXIud3JpdGVSZWNvcmRzKGRhdClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IEJTdGFja0xvZ2dlci5pbmZvKCdQZXJmb3JtYW5jZSBDU1YgcmVwb3J0IGdlbmVyYXRlZCBzdWNjZXNzZnVsbHknKSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGVycm9yKSlcbiAgICB9XG5cbiAgICBzdGF0aWMgTWVhc3VyZShsYWJlbDogc3RyaW5nLCBkZXRhaWxzOiBQZXJmb3JtYW5jZURldGFpbHMgPSB7fSkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgICAgICAgICBrZXk6IHN0cmluZyB8IHN5bWJvbCxcbiAgICAgICAgICAgIGRlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPEZ1bmN0aW9uPikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2Q6IEZ1bmN0aW9ufHVuZGVmaW5lZCA9IGRlc2NyaXB0b3IudmFsdWVcbiAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uKC4uLmFyZ3M6IG9iamVjdFtdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlLmFwcGx5KHNlbGYsIFtsYWJlbCwgb3JpZ2luYWxNZXRob2QgYXMgRnVuY3Rpb24sIHsgbWV0aG9kTmFtZToga2V5LnRvU3RyaW5nKCksIC4uLmRldGFpbHMgfSwgYXJncywgdGhpc10pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIG1lYXN1cmVXcmFwcGVyKG5hbWU6IHN0cmluZywgZm46IEZ1bmN0aW9uLCBkZXRhaWxzOiBQZXJmb3JtYW5jZURldGFpbHMgPSB7fSkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpc1xuXG4gICAgICAgIGRldGFpbHMud29ya2VyID0gUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKClcbiAgICAgICAgZGV0YWlscy50ZXN0TmFtZSA9IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbiAmJiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW5bUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuLmxlbmd0aCAtIDFdXG4gICAgICAgIGRldGFpbHMucGxhdGZvcm0gPSBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWRcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IChvYmplY3R8Ym9vbGVhbnx1bmRlZmluZWR8bnVsbHxzdHJpbmcpW10pIHtcblxuICAgICAgICAgICAgcmV0dXJuIHNlbGYubWVhc3VyZShuYW1lLCBmbiwgZGV0YWlscywgYXJncylcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgc3RhdGljIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICEocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1NES19JTlNUUlVNRU5UQVRJT04gPT09ICdmYWxzZScpXG4gICAgfVxuXG4gICAgc3RhdGljIG1lYXN1cmUobGFiZWw6IHN0cmluZywgZm46IEZ1bmN0aW9uLCBkZXRhaWxzID0ge30sIGFyZ3M/OiAob2JqZWN0fGJvb2xlYW58dW5kZWZpbmVkfG51bGx8c3RyaW5nKVtdLCB0aGlzQXJnOiBvYmplY3R8bnVsbCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQgfHwgIXRoaXMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQXJnLCBhcmdzKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgdW5pcXVlIG1hcmsgbmFtZXMgZm9yIHRoaXMgc3BlY2lmaWMgY2FsbCB0byBhdm9pZCB0aW1pbmcgY29uZmxpY3RzXG4gICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gYCR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNyl9YFxuICAgICAgICBjb25zdCBzdGFydE1hcmsgPSBgJHtsYWJlbH0tc3RhcnQtJHt1bmlxdWVJZH1gXG4gICAgICAgIGNvbnN0IGVuZE1hcmsgPSBgJHtsYWJlbH0tZW5kLSR7dW5pcXVlSWR9YFxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgc3RhcnQgbWFyayB3aXRoIHVuaXF1ZSBJRFxuICAgICAgICBzYWZlTWFyayhzdGFydE1hcmspXG5cbiAgICAgICAgLy8gU3RvcmUgZGV0YWlscyB3aXRoIG1lYXN1cmVtZW50IGNvbnRleHRcbiAgICAgICAgY29uc3QgZGV0YWlsc1dpdGhDb250ZXh0ID0ge1xuICAgICAgICAgICAgLi4uZGV0YWlscyxcbiAgICAgICAgICAgIG1lYXN1cmVtZW50SWQ6IHVuaXF1ZUlkXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gZm4uYXBwbHkodGhpc0FyZywgYXJncylcblxuICAgICAgICAgICAgaWYgKHJldHVyblZhbCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHYgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBzcGVjaWZpYyBtYXJrcyBmb3IgdGhpcyBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZU1hcmsoZW5kTWFyaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlTWVhc3VyZShsYWJlbCwgc3RhcnRNYXJrLCBlbmRNYXJrKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXRhaWxzW2xhYmVsXSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRQcm9jZXNzSWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm06IFBlcmZvcm1hbmNlVGVzdGVyLmJyb3dzZXI/LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbj8ucG9wKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBkZXRhaWxzV2l0aENvbnRleHQpLCB0aGlzLmRldGFpbHNbbGFiZWxdIHx8IHt9KSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVNYXJrKGVuZE1hcmspXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWlsc1tsYWJlbF0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmU6IHV0aWwuZm9ybWF0KGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50V29ya2VySWQ6IFBlcmZvcm1hbmNlVGVzdGVyLmdldENsaWVudFdvcmtlcklkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3ROYW1lOiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4/LnBvcCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZGV0YWlsc1dpdGhDb250ZXh0KSwgdGhpcy5kZXRhaWxzW2xhYmVsXSB8fCB7fSkpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3luY2hyb25vdXMgZXhlY3V0aW9uXG4gICAgICAgICAgICBzYWZlTWFyayhlbmRNYXJrKVxuICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgdGhpcy5kZXRhaWxzW2xhYmVsXSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgZmFpbHVyZTogdW5kZWZpbmVkXG4gICAgICAgICAgICB9LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIGNsaWVudFdvcmtlcklkOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRDbGllbnRXb3JrZXJJZCgpLFxuICAgICAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICAgICAgcGxhdGZvcm06IFBlcmZvcm1hbmNlVGVzdGVyLmJyb3dzZXI/LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICB0ZXN0TmFtZTogUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuPy5wb3AoKVxuICAgICAgICAgICAgfSwgZGV0YWlsc1dpdGhDb250ZXh0KSwgdGhpcy5kZXRhaWxzW2xhYmVsXSB8fCB7fSkpXG5cbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWxcbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIHNhZmVNYXJrKGVuZE1hcmspXG4gICAgICAgICAgICBzYWZlTWVhc3VyZShsYWJlbCwgc3RhcnRNYXJrLCBlbmRNYXJrKVxuXG4gICAgICAgICAgICB0aGlzLmRldGFpbHNbbGFiZWxdID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbHVyZTogdXRpbC5mb3JtYXQoZXIpXG4gICAgICAgICAgICB9LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIGNsaWVudFdvcmtlcklkOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRDbGllbnRXb3JrZXJJZCgpLFxuICAgICAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICAgICAgcGxhdGZvcm06IFBlcmZvcm1hbmNlVGVzdGVyLmJyb3dzZXI/LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICB0ZXN0TmFtZTogUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuPy5wb3AoKVxuICAgICAgICAgICAgfSwgZGV0YWlsc1dpdGhDb250ZXh0KSwgdGhpcy5kZXRhaWxzW2xhYmVsXSB8fCB7fSkpXG5cbiAgICAgICAgICAgIHRocm93IGVyXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgc3RhcnQoZXZlbnQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBmaW5hbEV2ZW50ID0gZXZlbnQgKyAnLXN0YXJ0J1xuICAgICAgICBpZiAodGhpcy5ldmVudHNNYXBbZmluYWxFdmVudF0pIHtyZXR1cm59XG4gICAgICAgIHNhZmVNYXJrKGZpbmFsRXZlbnQpXG4gICAgICAgIHRoaXMuZXZlbnRzTWFwW2ZpbmFsRXZlbnRdID0gMVxuICAgIH1cblxuICAgIHN0YXRpYyBlbmQoZXZlbnQ6IHN0cmluZywgc3VjY2VzcyA9IHRydWUsIGZhaWx1cmU/OiBzdHJpbmcgfCB1bmtub3duLCBkZXRhaWxzID0ge30pIHtcbiAgICAgICAgc2FmZU1hcmsoZXZlbnQgKyAnLWVuZCcpXG4gICAgICAgIHNhZmVNZWFzdXJlKGV2ZW50LCBldmVudCArICctc3RhcnQnLCBldmVudCArICctZW5kJylcbiAgICAgICAgLy8gQ2xlYXIgdGhlIHN0YXJ0LW1hcmsgZ3VhcmQgc28gYSBzdWJzZXF1ZW50IHN0YXJ0KGV2ZW50KSBmb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gZXZlbnQgYWN0dWFsbHkgbWFya3MgYSBuZXcgc3RhcnQuIFdpdGhvdXQgdGhpcywgc3RhcnQoKSBzaG9ydC1jaXJjdWl0c1xuICAgICAgICAvLyBhbmQgdGhlIG5leHQgZW5kKCkgbWVhc3VyZXMgZnJvbSB0aGUgb3JpZ2luYWwgc3RhcnQgbWFyayBcdTIwMTQgaW5mbGF0ZWRcbiAgICAgICAgLy8gZHVyYXRpb25zIGluIHRlbGVtZXRyeSBvbiBldmVyeSBjYWxsIGFmdGVyIHRoZSBmaXJzdC5cbiAgICAgICAgZGVsZXRlIHRoaXMuZXZlbnRzTWFwW2V2ZW50ICsgJy1zdGFydCddXG4gICAgICAgIHRoaXMuZGV0YWlsc1tldmVudF0gPSBPYmplY3QuYXNzaWduKHsgc3VjY2VzcywgZmFpbHVyZTogdXRpbC5mb3JtYXQoZmFpbHVyZSkgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIGNsaWVudFdvcmtlcklkOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRDbGllbnRXb3JrZXJJZCgpLFxuICAgICAgICAgICAgd29ya2VyOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRQcm9jZXNzSWQoKSxcbiAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICB0ZXN0TmFtZTogUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuICYmIFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbltQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4ubGVuZ3RoIC0gMV1cbiAgICAgICAgfSwgZGV0YWlscyksIHRoaXMuZGV0YWlsc1tldmVudF0gfHwge30pKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBjbGllbnQgd29ya2VyIElEIGluIGZvcm1hdCBcInRocmVhZElkLXByb2Nlc3NJZFwiLlxuICAgICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgY29uc2lzdGVudCBpZGVudGlmaWVyIGFjcm9zcyB0aGUgU0RLIGZvciB0cmFja2luZ1xuICAgICAqIHdvcmtlci1zcGVjaWZpYyBldmVudHMgYW5kIHBlcmZvcm1hbmNlIG1ldHJpY3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXb3JrZXIgSUQgc3RyaW5nIGluIGZvcm1hdCBcInRocmVhZElkLXByb2Nlc3NJZFwiXG4gICAgICovXG4gICAgc3RhdGljIGdldENsaWVudFdvcmtlcklkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBDTElVdGlscy5nZXRDbGllbnRXb3JrZXJJZCgpXG4gICAgfVxuXG4gICAgc3RhdGljIGdldFByb2Nlc3NJZCgpIHtcbiAgICAgICAgcmV0dXJuIGAke3Byb2Nlc3MucGlkfS0ke3dvcmtlci50aHJlYWRJZH1gXG4gICAgfVxuXG4gICAgc3RhdGljIHNsZWVwID0gKG1zID0gMTAwKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG5cbiAgICBzdGF0aWMgYXN5bmMgdXBsb2FkRXZlbnRzRGF0YSgpIHtcbiAgICAgICAgLy8gVHJhY2sgb3ZlcmFsbCBrZXkgbWV0cmljcyBvcGVyYXRpb25cbiAgICAgICAgdGhpcy5zdGFydChFVkVOVFMuU0RLX1NFTkRfS0VZX01FVFJJQ1MpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlcklkID0gYCR7cHJvY2Vzcy5waWR9YFxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbUGVyZm9ybWFuY2UgVXBsb2FkXSBTdGFydGluZyB1cGxvYWQgZm9yIHdvcmtlciAke3dvcmtlcklkfWApXG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHByZXBhcmF0aW9uIHBoYXNlIChjb2xsZWN0aW9uIGFuZCBkZWR1cGxpY2F0aW9uKVxuICAgICAgICAgICAgdGhpcy5zdGFydChFVkVOVFMuU0RLX0tFWV9NRVRSSUNTX1BSRVBBUkFUSU9OKVxuXG4gICAgICAgICAgICAvLyBDb2xsZWN0IGFsbCBtZWFzdXJlcyBmcm9tIHBlcmZvcm1hbmNlIHJlcG9ydCBmaWxlcyBhbmQgaW4tbWVtb3J5IGV2ZW50c1xuICAgICAgICAgICAgbGV0IG1lYXN1cmVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW11cbiAgICAgICAgICAgIGlmIChhd2FpdCBmc1Byb21pc2UuYWNjZXNzKHRoaXMuanNvblJlcG9ydERpclBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSkuY2F0Y2goKCkgPT4gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZXMgPSAoYXdhaXQgZnNQcm9taXNlLnJlYWRkaXIodGhpcy5qc29uUmVwb3J0RGlyUGF0aCkpLm1hcChmaWxlID0+IHBhdGgucmVzb2x2ZSh0aGlzLmpzb25SZXBvcnREaXJQYXRoLCBmaWxlKSlcbiAgICAgICAgICAgICAgICBtZWFzdXJlcyA9IChhd2FpdCBQcm9taXNlLmFsbChmaWxlcy5tYXAoKGZpbGUpID0+IGZzUHJvbWlzZS5yZWFkRmlsZShmaWxlLCAndXRmLTgnKSkpKS5tYXAoZWwgPT4gYFske2VsLnNsaWNlKDAsIC0xKX1dYCkubWFwKGVsID0+IEpTT04ucGFyc2UoZWwpKS5mbGF0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gVG90YWwgZXZlbnRzIGZyb20gZmlsZXM6ICR7bWVhc3VyZXMubGVuZ3RofWApXG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9tZWFzdXJlZEV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbUGVyZm9ybWFuY2UgVXBsb2FkXSBBZGRpbmcgJHt0aGlzLl9tZWFzdXJlZEV2ZW50cy5sZW5ndGh9IGluLW1lbW9yeSBldmVudHNgKVxuICAgICAgICAgICAgICAgIG1lYXN1cmVzID0gbWVhc3VyZXMuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlZEV2ZW50cy5tYXAoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IFBlcmZvcm1hbmNlRW50cnkgdG8gcGxhaW4gb2JqZWN0IGlmIGl0IGhhcyB0b0pTT05cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGUgYXMgUGVyZm9ybWFuY2VFbnRyeSkudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlIGFzIFBlcmZvcm1hbmNlRW50cnkpLnRvSlNPTigpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVuc3VyZUVwb2NoVGltZXMgPSAoYXJyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1dG9mZiA9IDFlMTIgLy8gfnllYXIgMjAwMSwgbXMgZXBvY2hcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lT3JpZ2luID0gKFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwZXJmb3JtYW5jZS50aW1lT3JpZ2luID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgPyBwZXJmb3JtYW5jZS50aW1lT3JpZ2luXG4gICAgICAgICAgICAgICAgICAgIDogKG5vdyAtIHByb2Nlc3MudXB0aW1lKCkgKiAxMDAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBhcnIubWFwKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnRyeS5zdGFydFRpbWUgPT09ICdudW1iZXInICYmIGVudHJ5LnN0YXJ0VGltZSA8IGN1dG9mZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3RhcnRUaW1lID0gdGltZU9yaWdpbiArIGVudHJ5LnN0YXJ0VGltZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtZWFzdXJlcyA9IGVuc3VyZUVwb2NoVGltZXMobWVhc3VyZXMpXG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKVxuICAgICAgICAgICAgLy8geXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1NTUyBaXG4gICAgICAgICAgICBjb25zdCBvcHRpb25zOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB0aW1lWm9uZTogJ1VUQycsXG4gICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICAgICAgICAgICAgaG91cjogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIHNlY29uZDogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIGZyYWN0aW9uYWxTZWNvbmREaWdpdHM6IDMsIC8vIFRvIGluY2x1ZGUgbWljcm9zZWNvbmRzXG4gICAgICAgICAgICAgICAgaG91cjEyOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRm9ybWF0IHRoZSBkYXRlIGFuZCByZXBsYWNlIHRoZSBkZWZhdWx0IHNlcGFyYXRvciBmb3IgdGltZSB6b25lXG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuLUdCJywgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAuZm9ybWF0VG9QYXJ0cyhkYXRlKVxuICAgICAgICAgICAgICAgIC5tYXAoKHsgdHlwZSwgdmFsdWUgfSkgPT4gdHlwZSA9PT0gJ3RpbWVab25lTmFtZScgPyAnWicgOiB2YWx1ZSlcbiAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnLCcsICdUJylcblxuICAgICAgICAgICAgdGhpcy5lbmQoRVZFTlRTLlNES19LRVlfTUVUUklDU19QUkVQQVJBVElPTiwgdHJ1ZSlcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ3Nka19ldmVudHMnLFxuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGh1Yl91dWlkOiBwcm9jZXNzLmVudi5QRVJGX1RFU1RIVUJfVVVJRCB8fCBwcm9jZXNzLmVudi5TREtfUlVOX0lELFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkX2RheTogZm9ybWF0dGVkRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRfbmFtZTogJ1NES0ZlYXR1cmVQZXJmb3JtYW5jZScsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YTogcHJvY2Vzcy5lbnYuUEVSRl9VU0VSX05BTUUsXG4gICAgICAgICAgICAgICAgICAgIGhvc3RfaW5mbzogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3RuYW1lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybTogcGxhdGZvcm0oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IHZlcnNpb24oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyY2g6IGFyY2goKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRfanNvbjogeyBtZWFzdXJlczogbWVhc3VyZXMsIHNka1J1bklkOiBwcm9jZXNzLmVudi5TREtfUlVOX0lEIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaFdyYXAoYCR7QVBJVXRpbHMuRURTX1VSTH0vc2VuZF9zZGtfZXZlbnRzYCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gU3VjY2Vzc2Z1bGx5IHVwbG9hZGVkIHRvIEVEUzogJHt1dGlsLmZvcm1hdChhd2FpdCByZXN1bHQudGV4dCgpKX1gKVxuXG4gICAgICAgICAgICB0aGlzLmVuZChFVkVOVFMuU0RLX1NFTkRfS0VZX01FVFJJQ1MsIHRydWUpXG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIEZhaWxlZCB0byB1cGxvYWQgZXZlbnRzOiAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICAgICAgdGhpcy5lbmQoRVZFTlRTLlNES19LRVlfTUVUUklDU19QUkVQQVJBVElPTiwgZmFsc2UsIGVyKVxuICAgICAgICAgICAgdGhpcy5lbmQoRVZFTlRTLlNES19TRU5EX0tFWV9NRVRSSUNTLCBmYWxzZSwgZXIpXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IGZzUHJvbWlzZS5hY2Nlc3ModGhpcy5qc29uUmVwb3J0RGlyUGF0aCkudGhlbigoKSA9PiB0cnVlLCAoKSA9PiBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzUHJvbWlzZS5yZWFkZGlyKHRoaXMuanNvblJlcG9ydERpclBhdGgpXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnNQcm9taXNlLnVubGluayhwYXRoLmpvaW4odGhpcy5qc29uUmVwb3J0RGlyUGF0aCwgZmlsZSkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbUGVyZm9ybWFuY2UgVXBsb2FkXSBDbGVhbmVkIHVwICR7ZmlsZXMubGVuZ3RofSB0ZW1wb3JhcnkgcmVwb3J0IGZpbGVzYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gRmFpbGVkIHRvIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXM6ICR7dXRpbC5mb3JtYXQoZXIpfWApXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5cbmltcG9ydCBsb2dnZXIgZnJvbSAnQHdkaW8vbG9nZ2VyJ1xuXG5pbXBvcnQgeyBMT0dTX0ZJTEUgfSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IENPTE9SUyB9IGZyb20gJy4vdXRpbC5qcydcblxuY29uc3QgbG9nID0gbG9nZ2VyKCdAd2Rpby9icm93c2Vyc3RhY2stc2VydmljZScpXG5cbmV4cG9ydCBjbGFzcyBCU3RhY2tMb2dnZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgTE9HU19GSUxFKVxuICAgIHB1YmxpYyBzdGF0aWMgbG9nRm9sZGVyUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycpXG4gICAgcHJpdmF0ZSBzdGF0aWMgbG9nRmlsZVN0cmVhbTogZnMuV3JpdGVTdHJlYW0gfCBudWxsXG5cbiAgICBwcml2YXRlIHN0YXRpYyByZWRhY3RDcmVkZW50aWFscyhsb2dNZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbG9nTWVzc2FnZVxuICAgICAgICAgICAgLnJlcGxhY2UoLyhbXCInXT8oPzp1c2VybmFtZXx1c2VyTmFtZXxhY2Nlc3NrZXl8YWNjZXNzS2V5fHVzZXJ8a2V5KVtcIiddP1xccypbOj1dXFxzKltcIiddPykoW15cIidcXHMsfV0rKS9naSwgJyQxJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oWz8mXSg/OnVzZXJuYW1lfHVzZXJOYW1lfGFjY2Vzc19rZXl8YWNjZXNza2V5fGFjY2Vzc0tleXx1c2VyfGtleSk9KShbXiYjXFxzXSspL2dpLCAnJDEnKVxuICAgIH1cblxuICAgIHN0YXRpYyBsb2dUb0ZpbGUobG9nTWVzc2FnZTogc3RyaW5nLCBsb2dMZXZlbDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKGxvZ01lc3NhZ2UpXG4gICAgICAgICAgICBpZiAoIXRoaXMubG9nRmlsZVN0cmVhbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5zdXJlTG9nc0ZvbGRlcigpXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odGhpcy5sb2dGaWxlUGF0aCwgeyBmbGFnczogJ2EnIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dGaWxlU3RyZWFtICYmIHRoaXMubG9nRmlsZVN0cmVhbS53cml0YWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbS53cml0ZSh0aGlzLmZvcm1hdExvZyhyZWRhY3RlZE1lc3NhZ2UsIGxvZ0xldmVsKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgRmFpbGVkIHRvIGxvZyB0byBmaWxlLiBFcnJvciAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmb3JtYXRMb2cobG9nTWVzc2FnZTogc3RyaW5nLCBsZXZlbDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBgJHtjaGFsay5ncmF5KG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSl9ICR7Y2hhbGtbQ09MT1JTW2xldmVsXV0obGV2ZWwudG9VcHBlckNhc2UoKSl9ICR7Y2hhbGsud2hpdGVCcmlnaHQoJ0B3ZGlvL2Jyb3dzZXJzdGFjay1zZXJ2aWNlJyl9ICR7bG9nTWVzc2FnZX1cXG5gXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpbmZvKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubG9nVG9GaWxlKHJlZGFjdGVkTWVzc2FnZSwgJ2luZm8nKVxuICAgICAgICBsb2cuaW5mbyhyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICdlcnJvcicpXG4gICAgICAgIGxvZy5lcnJvcihyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIHBhcmFtPzogdW5rbm93bikge1xuICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubG9nVG9GaWxlKHJlZGFjdGVkTWVzc2FnZSwgJ2RlYnVnJylcbiAgICAgICAgaWYgKHBhcmFtKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcocmVkYWN0ZWRNZXNzYWdlLCBwYXJhbSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhyZWRhY3RlZE1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHdhcm4obWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHJlZGFjdGVkTWVzc2FnZSA9IHRoaXMucmVkYWN0Q3JlZGVudGlhbHMobWVzc2FnZSlcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUocmVkYWN0ZWRNZXNzYWdlLCAnd2FybicpXG4gICAgICAgIGxvZy53YXJuKHJlZGFjdGVkTWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRyYWNlKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubG9nVG9GaWxlKHJlZGFjdGVkTWVzc2FnZSwgJ3RyYWNlJylcbiAgICAgICAgbG9nLnRyYWNlKHJlZGFjdGVkTWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyTG9nZ2VyKCkge1xuICAgICAgICBpZiAodGhpcy5sb2dGaWxlU3RyZWFtKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0uZW5kKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0gPSBudWxsXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckxvZ0ZpbGUoKSB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMubG9nRmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBmcy50cnVuY2F0ZVN5bmModGhpcy5sb2dGaWxlUGF0aClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW5zdXJlTG9nc0ZvbGRlcigpIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMubG9nRm9sZGVyUGF0aCkpe1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMubG9nRm9sZGVyUGF0aClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJ7XG4gIFwibmFtZVwiOiBcIkB3ZGlvL2Jyb3dzZXJzdGFjay1zZXJ2aWNlXCIsXG4gIFwidmVyc2lvblwiOiBcIjkuMzMuMVwiLFxuICBcImRlc2NyaXB0aW9uXCI6IFwiV2ViZHJpdmVySU8gc2VydmljZSBmb3IgYmV0dGVyIEJyb3dzZXJzdGFjayBpbnRlZ3JhdGlvblwiLFxuICBcImF1dGhvclwiOiBcIkJyb3dzZXJTdGFjayA8c3VwcG9ydEBicm93c2Vyc3RhY2suY29tPlwiLFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJzdGFjay93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlXCIsXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcImVuZ2luZXNcIjoge1xuICAgIFwibm9kZVwiOiBcIj49MTguMjAuMFwiXG4gIH0sXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXQraHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJzdGFjay93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlLmdpdFwiLFxuICAgIFwiZGlyZWN0b3J5XCI6IFwicGFja2FnZXMvYnJvd3NlcnN0YWNrLXNlcnZpY2VcIlxuICB9LFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcIndlYmRyaXZlcmlvXCIsXG4gICAgXCJ3ZGlvXCIsXG4gICAgXCJicm93c2Vyc3RhY2tcIixcbiAgICBcIndkaW8tc2VydmljZVwiXG4gIF0sXG4gIFwiYnVnc1wiOiB7XG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcnN0YWNrL3dkaW8tYnJvd3NlcnN0YWNrLXNlcnZpY2UvaXNzdWVzXCJcbiAgfSxcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwidHlwZXNcIjogXCIuL2J1aWxkL2luZGV4LmQudHNcIixcbiAgXCJleHBvcnRzXCI6IHtcbiAgICBcIi5cIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vYnVpbGQvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2J1aWxkL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9jbGVhbnVwXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2J1aWxkL2NsZWFudXAuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2J1aWxkL2NsZWFudXAuanNcIixcbiAgICAgIFwic291cmNlXCI6IFwiLi9zcmMvY2xlYW51cC50c1wiXG4gICAgfVxuICB9LFxuICBcInR5cGVTY3JpcHRWZXJzaW9uXCI6IFwiMy44LjNcIixcbiAgXCJmaWxlc1wiOiBbXG4gICAgXCJidWlsZFwiLFxuICAgIFwic3JjL3Byb3RvLyoqLyoucHJvdG9cIixcbiAgICBcImJyb3dzZXJzdGFjay1zZXJ2aWNlLmQudHNcIixcbiAgICBcIlJFQURNRS5tZFwiLFxuICAgIFwiTElDRU5TRVwiXG4gIF0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJjbGVhblwiOiBcInJpbXJhZiAuL2J1aWxkIHNyYy9ncnBjL2dlbmVyYXRlZFwiLFxuICAgIFwiZ2VuZXJhdGVcIjogXCJidWYgZ2VuZXJhdGVcIixcbiAgICBcImJ1aWxkXCI6IFwicmltcmFmIC4vYnVpbGQgc3JjL2dycGMvZ2VuZXJhdGVkICYmIGJ1ZiBnZW5lcmF0ZSAmJiBub2RlIC4vc2NyaXB0cy9idWlsZC5tanMgJiYgdHNjIC1wIHRzY29uZmlnLnByb2QuanNvblwiLFxuICAgIFwiYnVpbGQ6d2F0Y2hcIjogXCJub2RlIC4vc2NyaXB0cy9idWlsZC5tanMgLS13YXRjaFwiLFxuICAgIFwidGVzdFwiOiBcInZpdGVzdCAtLXJ1blwiLFxuICAgIFwidGVzdDp3YXRjaFwiOiBcInZpdGVzdFwiLFxuICAgIFwicHJlcGFja1wiOiBcIm5wbSBydW4gYnVpbGRcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYnJvd3NlcnN0YWNrL2FpLXNkay1ub2RlXCI6IFwiMS41LjE3XCIsXG4gICAgXCJAYnVmYnVpbGQvcHJvdG9idWZcIjogXCJeMi41LjJcIixcbiAgICBcIkBncnBjL2dycGMtanNcIjogXCIxLjEzLjNcIixcbiAgICBcIkBwZXJjeS9hcHBpdW0tYXBwXCI6IFwiXjIuMC45XCIsXG4gICAgXCJAcGVyY3kvc2VsZW5pdW0td2ViZHJpdmVyXCI6IFwiXjIuMi4yXCIsXG4gICAgXCJAdHlwZXMvZ2l0Y29uZmlnbG9jYWxcIjogXCJeMi4wLjFcIixcbiAgICBcImJyb3dzZXJzdGFjay1sb2NhbFwiOiBcIl4xLjUuMVwiLFxuICAgIFwiY2hhbGtcIjogXCJeNS4zLjBcIixcbiAgICBcImNzdi13cml0ZXJcIjogXCJeMS42LjBcIixcbiAgICBcImdpdC1yZXBvLWluZm9cIjogXCJeMi4xLjFcIixcbiAgICBcImdpdGNvbmZpZ2xvY2FsXCI6IFwiXjIuMS4wXCIsXG4gICAgXCJnbG9iXCI6IFwiXjExLjAuMFwiLFxuICAgIFwidGFyXCI6IFwiXjcuNS4xMVwiLFxuICAgIFwidW5kaWNpXCI6IFwiXjYuMjQuMFwiLFxuICAgIFwidXVpZFwiOiBcIl4xMS4xLjBcIixcbiAgICBcIndpbnN0b24tdHJhbnNwb3J0XCI6IFwiXjQuNS4wXCIsXG4gICAgXCJ5YXV6bFwiOiBcIl4zLjQuMFwiLFxuICAgIFwiQHdkaW8vbG9nZ2VyXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby9yZXBvcnRlclwiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vdHlwZXNcIjogXCJeOS4wLjBcIixcbiAgICBcIndlYmRyaXZlcmlvXCI6IFwiXjkuMC4wXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB3ZGlvL2NsaVwiOiBcIl41LjAuMCB8fCBeNi4wLjAgfHwgXjcuMC4wIHx8IF44LjAuMCB8fCBeOS4wLjBcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYnVmYnVpbGQvYnVmXCI6IFwiXjEuNTUuMVwiLFxuICAgIFwiQGNoYW5nZXNldHMvY2xpXCI6IFwiXjIuMjcuOVwiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMjAuMS4wXCIsXG4gICAgXCJAdHlwZXMvdGFyXCI6IFwiXjcuMC44N1wiLFxuICAgIFwiQHR5cGVzL3lhdXpsXCI6IFwiXjIuMTAuM1wiLFxuICAgIFwiQHdkaW8vZ2xvYmFsc1wiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vbG9nZ2VyXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby9yZXBvcnRlclwiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vdHlwZXNcIjogXCJeOS4wLjBcIixcbiAgICBcImVzYnVpbGRcIjogXCJeMC4yNy4yXCIsXG4gICAgXCJyaW1yYWZcIjogXCJeNi4wLjFcIixcbiAgICBcInRzLXByb3RvXCI6IFwiXjIuNy41XCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuOC4zXCIsXG4gICAgXCJ2aXRlc3RcIjogXCJeMy4yLjRcIixcbiAgICBcIndlYmRyaXZlcmlvXCI6IFwiXjkuMC4wXCJcbiAgfSxcbiAgXCJwdWJsaXNoQ29uZmlnXCI6IHtcbiAgICBcImFjY2Vzc1wiOiBcInB1YmxpY1wiXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJyb3dzZXJzdGFja0NvbmZpZyB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgcGtnIGZyb20gJy4uL3BhY2thZ2UuanNvbicgd2l0aCB7IHR5cGU6ICdqc29uJyB9XG5cbmNvbnN0IGJzdGFja1NlcnZpY2VWZXJzaW9uID0gcGtnLnZlcnNpb25cblxuZXhwb3J0IGNvbnN0IEJST1dTRVJfREVTQ1JJUFRJT04gPSBbXG4gICAgJ2RldmljZScsXG4gICAgJ29zJyxcbiAgICAnb3NWZXJzaW9uJyxcbiAgICAnb3NfdmVyc2lvbicsXG4gICAgJ2Jyb3dzZXJOYW1lJyxcbiAgICAnYnJvd3NlcicsXG4gICAgJ2Jyb3dzZXJWZXJzaW9uJyxcbiAgICAnYnJvd3Nlcl92ZXJzaW9uJ1xuXSBhcyBjb25zdFxuXG5leHBvcnQgY29uc3QgVkFMSURfQVBQX0VYVEVOU0lPTiA9IFtcbiAgICAnLmFwaycsXG4gICAgJy5hYWInLFxuICAgICcuaXBhJ1xuXVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9PUFRJT05TOiBQYXJ0aWFsPEJyb3dzZXJzdGFja0NvbmZpZz4gPSB7XG4gICAgc2V0U2Vzc2lvbk5hbWU6IHRydWUsXG4gICAgc2V0U2Vzc2lvblN0YXR1czogdHJ1ZSxcbiAgICB0ZXN0T2JzZXJ2YWJpbGl0eTogdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgY29uc29sZUhvbGRlcjogdHlwZW9mIGNvbnNvbGUgPSBPYmplY3QuYXNzaWduKHt9LCBjb25zb2xlKVxuXG5leHBvcnQgY29uc3QgREFUQV9FTkRQT0lOVCA9ICdodHRwczovL2NvbGxlY3Rvci1vYnNlcnZhYmlsaXR5LmJyb3dzZXJzdGFjay5jb20nXG5leHBvcnQgY29uc3QgQVBQX0FMTFlfRU5EUE9JTlQgPSAnaHR0cHM6Ly9hcHAtYWNjZXNzaWJpbGl0eS5icm93c2Vyc3RhY2suY29tL2F1dG9tYXRlJ1xuZXhwb3J0IGNvbnN0IEFQUF9BTExZX0lTU1VFU19FTkRQT0lOVCA9ICdhcGkvdjEvaXNzdWVzJ1xuZXhwb3J0IGNvbnN0IEFQUF9BTExZX0lTU1VFU19TVU1NQVJZX0VORFBPSU5UID0gJ2FwaS92MS9pc3N1ZXMtc3VtbWFyeSdcbmV4cG9ydCBjb25zdCBEQVRBX0VWRU5UX0VORFBPSU5UID0gJ2FwaS92MS9ldmVudCdcbmV4cG9ydCBjb25zdCBEQVRBX0JBVENIX0VORFBPSU5UID0gJ2FwaS92MS9iYXRjaCdcbmV4cG9ydCBjb25zdCBEQVRBX1NDUkVFTlNIT1RfRU5EUE9JTlQgPSAnYXBpL3YxL3NjcmVlbnNob3RzJ1xuZXhwb3J0IGNvbnN0IERBVEFfQkFUQ0hfU0laRSA9IDEwMDBcbmV4cG9ydCBjb25zdCBEQVRBX0JBVENIX0lOVEVSVkFMID0gMjAwMFxuZXhwb3J0IGNvbnN0IEJBVENIX0VWRU5UX1RZUEVTID0gWydMb2dDcmVhdGVkJywgJ1Rlc3RSdW5TdGFydGVkJywgJ1Rlc3RSdW5GaW5pc2hlZCcsICdIb29rUnVuRmluaXNoZWQnLCAnSG9va1J1blN0YXJ0ZWQnLCAnU2NyZWVuc2hvdENyZWF0ZWQnXVxuZXhwb3J0IGNvbnN0IERFRkFVTFRfV0FJVF9USU1FT1VUX0ZPUl9QRU5ESU5HX1VQTE9BRFMgPSA1MDAwIC8vIDVzXG5leHBvcnQgY29uc3QgREVGQVVMVF9XQUlUX0lOVEVSVkFMX0ZPUl9QRU5ESU5HX1VQTE9BRFMgPSAxMDAgLy8gMTAwbXNcbmV4cG9ydCBjb25zdCBCU1RBQ0tfU0VSVklDRV9WRVJTSU9OID0gYnN0YWNrU2VydmljZVZlcnNpb25cblxuZXhwb3J0IGNvbnN0IE5PVF9BTExPV0VEX0tFWVNfSU5fQ0FQUyA9IFsnaW5jbHVkZVRhZ3NJblRlc3RpbmdTY29wZScsICdleGNsdWRlVGFnc0luVGVzdGluZ1Njb3BlJywgJ3Rlc3RNYW5hZ2VtZW50T3B0aW9ucycsICdza2lwQXBwT3ZlcnJpZGUnXVxuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUX1BMQU5fSUQgPSAnQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRCdcblxuZXhwb3J0IGNvbnN0IExPR1NfRklMRSA9ICdsb2dzL2JzdGFjay13ZGlvLXNlcnZpY2UubG9nJ1xuZXhwb3J0IGNvbnN0IENMSV9ERUJVR19MT0dTX0ZJTEUgPSAnbG9nL3Nkay1jbGktZGVidWcubG9nJ1xuZXhwb3J0IGNvbnN0IFVQTE9BRF9MT0dTX0FERFJFU1MgPSAnaHR0cHM6Ly91cGxvYWQtb2JzZXJ2YWJpbGl0eS5icm93c2Vyc3RhY2suY29tJ1xuZXhwb3J0IGNvbnN0IFVQTE9BRF9MT0dTX0VORFBPSU5UID0gJ2NsaWVudC1sb2dzL3VwbG9hZCdcblxuZXhwb3J0IGNvbnN0IFBFUkNZX0xPR1NfRklMRSA9ICdsb2dzL3BlcmN5LmxvZydcblxuZXhwb3J0IGNvbnN0IFBFUkNZX0RPTV9DSEFOR0lOR19DT01NQU5EU19FTkRQT0lOVFMgPSBbXG4gICAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvdXJsJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9mb3J3YXJkJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9iYWNrJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9yZWZyZXNoJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9zY3JlZW5zaG90JyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hY3Rpb25zJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL3NoYWtlJ1xuXVxuXG5leHBvcnQgY29uc3QgQ0FQVFVSRV9NT0RFUyA9IFsnY2xpY2snLCAnYXV0bycsICdzY3JlZW5zaG90JywgJ21hbnVhbCcsICd0ZXN0Y2FzZSddXG5leHBvcnQgY29uc3QgTE9HX0tJTkRfVVNBR0VfTUFQID0ge1xuICAgICdURVNUX0xPRyc6ICdsb2cnLFxuICAgICdURVNUX1NDUkVFTlNIT1QnOiAnc2NyZWVuc2hvdCcsXG4gICAgJ1RFU1RfU1RFUCc6ICdzdGVwJyxcbiAgICAnSFRUUCc6ICdodHRwJ1xufVxuXG5leHBvcnQgY29uc3QgRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwgPSAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9zZGsvdjEvZXZlbnQnXG5cbmV4cG9ydCBjb25zdCBFRFNfVVJMID0gJ2h0dHBzOi8vZWRzLmJyb3dzZXJzdGFjay5jb20nXG5cbmV4cG9ydCBjb25zdCBTVVBQT1JURURfQlJPV1NFUlNfRk9SX0FJID0gWydjaHJvbWUnLCAnbWljcm9zb2Z0ZWRnZScsICdmaXJlZm94J11cblxuZXhwb3J0IGNvbnN0IFRDR19VUkwgPSAnaHR0cHM6Ly90Y2cuYnJvd3NlcnN0YWNrLmNvbSdcblxuZXhwb3J0IGNvbnN0IFRDR19JTkZPID0ge1xuICAgIHRjZ1JlZ2lvbjogJ3VzZScsXG4gICAgdGNnVXJsOiBUQ0dfVVJMLFxufVxuXG4vLyBTbWFydCBTZWxlY3Rpb24gTW9kZSBDb25zdGFudHNcbmV4cG9ydCBjb25zdCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCA9ICdyZWxldmFudEZpcnN0J1xuZXhwb3J0IGNvbnN0IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX09OTFkgPSAncmVsZXZhbnRPbmx5J1xuXG4vLyBFbnYgdmFyaWFibGVzIC0gRGVmaW5lIGFsbCB0aGUgZW52IHZhcmlhYmxlIGNvbnN0YW50cyBvdmVyIGhlcmVcblxuLy8gVG8gc3RvcmUgdGhlIEpXVCB0b2tlbiByZXR1cm5lZCB0aGUgc2Vzc2lvbiBsYXVuY2hcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QgPSAnQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUJ1xuXG4vLyBUbyBzdG9yZSB0Y2cgYXV0aCByZXN1bHQgZm9yIHNlbGZIZWFsaW5nIGZlYXR1cmU6XG5leHBvcnQgY29uc3QgQlNUQUNLX1RDR19BVVRIX1JFU1VMVCA9ICdCU1RBQ0tfVENHX0FVVEhfUkVTVUxUJ1xuXG4vLyBUbyBzdG9yZSB0aGUgc2V0dGluZyBvZiB3aGV0aGVyIHRvIHNlbmQgc2NyZWVuc2hvdHMgb3Igbm90XG5leHBvcnQgY29uc3QgVEVTVE9QU19TQ1JFRU5TSE9UX0VOViA9ICdCU19URVNUT1BTX0FMTE9XX1NDUkVFTlNIT1RTJ1xuXG4vLyBUbyBzdG9yZSBidWlsZCBoYXNoZWQgaWRcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEID0gJ0JST1dTRVJTVEFDS19URVNUSFVCX1VVSUQnXG4vLyBJbnRlcnJ1cHQgc2lnbmFsLCBwcm9wYWdhdGVkIHZpYSBlbnYgc28gdGhlIGRldGFjaGVkIGNsZWFudXAgY2hpbGQgYW5kIGdSUENcbi8vIHN0b3AgcGF0aCBjYW4gc3RhbXAgdGhlIGtpbGwgcmVhc29uIG9udG8gdGhlIGJ1aWxkIHN0b3AuXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0tJTExfU0lHTkFMID0gJ0JST1dTRVJTVEFDS19TREtfS0lMTF9TSUdOQUwnXG5cbi8vIFRvIHN0b3JlIHRlc3QgcnVuIHV1aWRcbmV4cG9ydCBjb25zdCBURVNUX0FOQUxZVElDU19JRCA9ICdURVNUX0FOQUxZVElDU19JRCdcblxuLy8gV2hldGhlciB0byBjb2xsZWN0IHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbiBvciBub3RcbmV4cG9ydCBjb25zdCBQRVJGX01FQVNVUkVNRU5UX0VOViA9ICdCUk9XU0VSU1RBQ0tfTzExWV9QRVJGX01FQVNVUkVNRU5UJ1xuXG4vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHJ1biBpcyByZXJ1biBvciBub3RcbmV4cG9ydCBjb25zdCBSRVJVTl9URVNUU19FTlYgPSAnQlJPV1NFUlNUQUNLX1JFUlVOX1RFU1RTJ1xuXG4vLyBUaGUgdGVzdHMgdGhhdCBuZWVkcyB0byBiZSByZXJ1blxuZXhwb3J0IGNvbnN0IFJFUlVOX0VOViA9ICdCUk9XU0VSU1RBQ0tfUkVSVU4nXG5cbi8vIFRvIHN0b3JlIHdoZXRoZXIgdGhlIGJ1aWxkIGxhdW5jaCBoYXMgY29tcGxldGVkIG9yIG5vdFxuZXhwb3J0IGNvbnN0IFRFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOViA9ICdCU19URVNUT1BTX0JVSUxEX0NPTVBMRVRFRCdcblxuLy8gV2hldGhlciBwZXJjeSBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkgb3Igbm90XG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1BFUkNZID0gJ0JST1dTRVJTVEFDS19QRVJDWSdcblxuLy8gV2hldGhlciBzZXNzaW9uIGlzIGEgYWNjZXNzaWJpbGl0eSBzZXNzaW9uXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFkgPSAnQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFknXG5cbi8vIFdoZXRoZXIgc2Vzc2lvbiBpcyBhIHRlc3QgcmVwb3J0aW5nIHNlc3Npb25cbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSA9ICdCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSdcblxuLy8gTG9hZCBUZXN0aW5nIFNlcnZpY2UgKExUUykgZW52IHZhcnM6IHRoZSBwb2QtaXRlcmF0aW9uIHNlc3Npb24gaWQgKGl0c1xuLy8gcHJlc2VuY2UgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIFwidGhpcyBydW4gaXMgYW4gTFRTIHBvZFxuLy8gaXRlcmF0aW9uXCIpIGFuZCBhbiBvcHRpb25hbCBvcHQtaW4gZmxhZyBmb3IgbG9jYWwgcmVwcm8gLyBDSSBydW5zIHRoYXRcbi8vIGRvbid0IGhhdmUgYSByZWFsIHNlc3Npb24gaWQuXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEID0gJ0JST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRCdcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfTFRTID0gJ0JST1dTRVJTVEFDS19MVFMnXG5cbi8vIE5ldyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGVudmlyb25tZW50IHZhcmlhYmxlc1xuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUX1JFUE9SVElORyA9ICdCUk9XU0VSU1RBQ0tfVEVTVF9SRVBPUlRJTkcnXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1RFU1RfUkVQT1JUSU5HX0RFQlVHID0gJ0JST1dTRVJTVEFDS19URVNUX1JFUE9SVElOR19ERUJVRydcbmV4cG9ydCBjb25zdCBURVNUX1JFUE9SVElOR19CVUlMRF9UQUcgPSAnVEVTVF9SRVBPUlRJTkdfQlVJTERfVEFHJ1xuZXhwb3J0IGNvbnN0IFRFU1RfUkVQT1JUSU5HX1BST0pFQ1RfTkFNRSA9ICdURVNUX1JFUE9SVElOR19QUk9KRUNUX05BTUUnXG5leHBvcnQgY29uc3QgVEVTVF9SRVBPUlRJTkdfQlVJTERfTkFNRSA9ICdURVNUX1JFUE9SVElOR19CVUlMRF9OQU1FJ1xuXG4vLyBNYXhpbXVtIHNpemUgb2YgVkNTIGluZm8gd2hpY2ggaXMgYWxsb3dlZFxuZXhwb3J0IGNvbnN0IE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVMgPSA2NCAqIDEwMjRcblxuLyogVGhlIHZhbHVlIHRvIGJlIGFwcGVuZGVkIGF0IHRoZSBlbmQgaWYgZ2l0IG1ldGFkYXRhIGlzIGxhcmdlciB0aGFuIE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVNcbiovXG5leHBvcnQgY29uc3QgR0lUX01FVEFfREFUQV9UUlVOQ0FURUQgPSAnLi4uW1RSVU5DQVRFRF0nXG5cbi8vIENMSSByZWxhdGVkIGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IENMSV9TVE9QX1RJTUVPVVQgPSA1MDAwIC8vIDUgc2Vjb25kc1xuZXhwb3J0IGNvbnN0IEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTID0gWydFVFhUQlNZJywgJ0VCVVNZJ11cbmV4cG9ydCBjb25zdCBNQVhfU1BBV05fUkVUUklFUyA9IDNcbmV4cG9ydCBjb25zdCBTUEFXTl9SRVRSWV9ERUxBWV9NUyA9IDEwMDBcbmV4cG9ydCBjb25zdCBXRElPX05BTUlOR19QUkVGSVggPSAnV2ViZHJpdmVySU8tJ1xuZXhwb3J0IGNvbnN0IFBFUkZfTUVUUklDU19XQUlUX1RJTUUgPSAyMDAwXG5cbi8vIEFQSSBFbmRwb2ludCBjb25zdGFudHNcbmV4cG9ydCBjb25zdCBVUERBVEVEX0NMSV9FTkRQT0lOVCA9ICdzZGsvdjEvdXBkYXRlX2NsaSdcblxuLyoqXG4gKiBNb2R1bGUgSG9vayBFdmVudHMgLSBQZXJmb3JtYW5jZSBldmVudCBuYW1lcyBmb3IgbW9kdWxlIGxpZmVjeWNsZSB0cmFja2luZ1xuICogVXNlZCBieSBtb2R1bGUtaG9vay10cmFja2VyLnRzIHRvIGluc3RydW1lbnQgbW9kdWxlIGluaXRpYWxpemF0aW9uIGFuZCBjbGVhbnVwXG4gKi9cbmV4cG9ydCBjb25zdCBNT0RVTEVfSE9PS19FVkVOVFMgPSB7XG4gICAgLy8gSW5zdHJ1bWVudGF0aW9uIG1vZHVsZVxuICAgIElOU1RSVU1FTlRBVElPTl9PTl9TVEFSVDogJ01PRFVMRV9JTlNUUlVNRU5UQVRJT05fT05fU1RBUlQnLFxuICAgIElOU1RSVU1FTlRBVElPTl9PTl9TVE9QOiAnTU9EVUxFX0lOU1RSVU1FTlRBVElPTl9PTl9TVE9QJyxcblxuICAgIC8vIFRlc3RIdWIgbW9kdWxlXG4gICAgVEVTVEhVQl9PTl9TVEFSVDogJ01PRFVMRV9URVNUSFVCX09OX1NUQVJUJyxcbiAgICBURVNUSFVCX09OX1NUT1A6ICdNT0RVTEVfVEVTVEhVQl9PTl9TVE9QJyxcblxuICAgIC8vIE9ic2VydmFiaWxpdHkgbW9kdWxlXG4gICAgT0JTRVJWQUJJTElUWV9PTl9TVEFSVDogJ01PRFVMRV9PQlNFUlZBQklMSVRZX09OX1NUQVJUJyxcbiAgICBPQlNFUlZBQklMSVRZX09OX1NUT1A6ICdNT0RVTEVfT0JTRVJWQUJJTElUWV9PTl9TVE9QJyxcblxuICAgIC8vIFBlcmN5IG1vZHVsZVxuICAgIFBFUkNZX09OX1NUQVJUOiAnTU9EVUxFX1BFUkNZX09OX1NUQVJUJyxcbiAgICBQRVJDWV9PTl9TVE9QOiAnTU9EVUxFX1BFUkNZX09OX1NUT1AnLFxuXG4gICAgLy8gQWNjZXNzaWJpbGl0eSBtb2R1bGVcbiAgICBBQ0NFU1NJQklMSVRZX09OX1NUQVJUOiAnTU9EVUxFX0FDQ0VTU0lCSUxJVFlfT05fU1RBUlQnLFxuICAgIEFDQ0VTU0lCSUxJVFlfT05fU1RPUDogJ01PRFVMRV9BQ0NFU1NJQklMSVRZX09OX1NUT1AnLFxuICAgIEFDQ0VTU0lCSUxJVFlfT05fRFJJVkVSX0lOSVQ6ICdNT0RVTEVfQUNDRVNTSUJJTElUWV9PTl9EUklWRVJfSU5JVCcsXG5cbiAgICAvLyBBSSBtb2R1bGVcbiAgICBBSV9PTl9TVEFSVDogJ01PRFVMRV9BSV9PTl9TVEFSVCcsXG4gICAgQUlfT05fU1RPUDogJ01PRFVMRV9BSV9PTl9TVE9QJyxcbiAgICBBSV9CRUZPUkVfU0VTU0lPTjogJ01PRFVMRV9BSV9CRUZPUkVfU0VTU0lPTicsXG4gICAgQUlfT05fRFJJVkVSX0lOSVQ6ICdNT0RVTEVfQUlfT05fRFJJVkVSX0lOSVQnLFxuXG4gICAgLy8gTG9jYWwgdGVzdGluZyBtb2R1bGVcbiAgICBMT0NBTF9PTl9TVEFSVDogJ01PRFVMRV9MT0NBTF9PTl9TVEFSVCcsXG4gICAgTE9DQUxfT05fU1RPUDogJ01PRFVMRV9MT0NBTF9PTl9TVE9QJyxcbiAgICBMT0NBTF9JTklUX1NFU1NJT046ICdNT0RVTEVfTE9DQUxfSU5JVF9TRVNTSU9OJyxcbiAgICBMT0NBTF9PTl9EUklWRVJfSU5JVDogJ01PRFVMRV9MT0NBTF9PTl9EUklWRVJfSU5JVCcsXG5cbiAgICAvLyBBcHAgQXV0b21hdGUgbW9kdWxlXG4gICAgQVBQQVVUT01BVEVfT05fU1RBUlQ6ICdNT0RVTEVfQVBQQVVUT01BVEVfT05fU1RBUlQnLFxuICAgIEFQUEFVVE9NQVRFX09OX0RSSVZFUl9JTklUOiAnTU9EVUxFX0FQUEFVVE9NQVRFX09OX0RSSVZFUl9JTklUJyxcbn0gYXMgY29uc3RcbiIsICJleHBvcnQgZGVmYXVsdCBjbGFzcyBBUElVdGlscyB7XG4gICAgc3RhdGljIEZVTk5FTF9JTlNUUlVNRU5UQVRJT05fVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20vc2RrL3YxL2V2ZW50J1xuICAgIHN0YXRpYyBCUk9XU0VSU1RBQ0tfQVVUT01BVEVfQVBJX1VSTCA9ICdodHRwczovL2FwaS5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBCUk9XU0VSU1RBQ0tfQUFfQVBJX1VSTCA9ICdodHRwczovL2FwaS5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBCUk9XU0VSU1RBQ0tfUEVSQ1lfQVBJX1VSTCA9ICdodHRwczovL2FwaS5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBCUk9XU0VSU1RBQ0tfQVVUT01BVEVfQVBJX0NMT1VEX1VSTCA9ICdodHRwczovL2FwaS1jbG91ZC5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBCUk9XU0VSU1RBQ0tfQUFfQVBJX0NMT1VEX1VSTCA9ICdodHRwczovL2FwaS1jbG91ZC5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBBUFBfQUxMWV9FTkRQT0lOVCA9ICdodHRwczovL2FwcC1hY2Nlc3NpYmlsaXR5LmJyb3dzZXJzdGFjay5jb20vYXV0b21hdGUnXG4gICAgc3RhdGljIERBVEFfRU5EUE9JTlQgPSAnaHR0cHM6Ly9jb2xsZWN0b3Itb2JzZXJ2YWJpbGl0eS5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBVUExPQURfTE9HU19BRERSRVNTID0gJ2h0dHBzOi8vdXBsb2FkLW9ic2VydmFiaWxpdHkuYnJvd3NlcnN0YWNrLmNvbSdcbiAgICBzdGF0aWMgRURTX1VSTCA9ICdodHRwczovL2Vkcy5icm93c2Vyc3RhY2suY29tJ1xuXG4gICAgc3RhdGljIHVwZGF0ZVVSTFNGb3JHUlIoYXBpczogR1JSVXJscykge1xuICAgICAgICB0aGlzLkZVTk5FTF9JTlNUUlVNRU5UQVRJT05fVVJMID0gYCR7YXBpcy5hdXRvbWF0ZS5hcGl9L3Nkay92MS9ldmVudGBcbiAgICAgICAgdGhpcy5CUk9XU0VSU1RBQ0tfQVVUT01BVEVfQVBJX1VSTCA9IGFwaXMuYXV0b21hdGUuYXBpXG4gICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX0FBX0FQSV9VUkwgPSBhcGlzLmFwcEF1dG9tYXRlLmFwaVxuICAgICAgICB0aGlzLkJST1dTRVJTVEFDS19QRVJDWV9BUElfVVJMID0gYXBpcy5wZXJjeS5hcGlcbiAgICAgICAgdGhpcy5CUk9XU0VSU1RBQ0tfQVVUT01BVEVfQVBJX0NMT1VEX1VSTCA9IGFwaXMuYXV0b21hdGUudXBsb2FkXG4gICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX0FBX0FQSV9DTE9VRF9VUkwgPSBhcGlzLmFwcEF1dG9tYXRlLnVwbG9hZFxuICAgICAgICB0aGlzLkFQUF9BTExZX0VORFBPSU5UID0gYCR7YXBpcy5hcHBBY2Nlc3NpYmlsaXR5LmFwaX0vYXV0b21hdGVgXG4gICAgICAgIHRoaXMuREFUQV9FTkRQT0lOVCA9IGFwaXMub2JzZXJ2YWJpbGl0eS5hcGlcbiAgICAgICAgdGhpcy5VUExPQURfTE9HU19BRERSRVNTID0gYXBpcy5vYnNlcnZhYmlsaXR5LnVwbG9hZFxuICAgICAgICB0aGlzLkVEU19VUkwgPSBhcGlzLmVkc0luc3RydW1lbnRhdGlvbi5hcGlcbiAgICB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyBwbGF0Zm9ybSwgYXJjaCwgaG9tZWRpciB9IGZyb20gJ25vZGU6b3MnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgdXRpbCwgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdub2RlOnN0cmVhbSdcbmltcG9ydCB0eXBlIHsgWmlwRmlsZSwgT3B0aW9ucyBhcyB5YXV6bE9wdGlvbnMgfSBmcm9tICd5YXV6bCdcbmltcG9ydCB5YXV6bCBmcm9tICd5YXV6bCdcbmltcG9ydCB7IHRocmVhZElkIH0gZnJvbSAnbm9kZTp3b3JrZXJfdGhyZWFkcydcblxuaW1wb3J0IHsgX2ZldGNoIGFzIGZldGNoIH0gZnJvbSAnLi4vZmV0Y2hXcmFwcGVyLmpzJ1xuXG5pbXBvcnQge1xuICAgIGlzTnVsbE9yRW1wdHksXG4gICAgbmVzdGVkS2V5VmFsdWUsXG4gICAgY3JlYXRlRGlyLFxuICAgIGlzV3JpdGFibGUsXG4gICAgc2V0UmVhZFdyaXRlQWNjZXNzLFxuICAgIGlzVHJ1ZSxcbiAgICBnZXRCcm93c2VyU3RhY2tVc2VyLFxuICAgIGdldEJyb3dzZXJTdGFja0tleSxcbiAgICBpc0ZhbHNlLFxuICAgIGlzVHVyYm9TY2FsZSxcbiAgICBzaG91bGRBZGRTZXJ2aWNlVmVyc2lvbixcbn0gZnJvbSAnLi4vdXRpbC5qcydcbmltcG9ydCBQZXJmb3JtYW5jZVRlc3RlciBmcm9tICcuLi9pbnN0cnVtZW50YXRpb24vcGVyZm9ybWFuY2UvcGVyZm9ybWFuY2UtdGVzdGVyLmpzJ1xuaW1wb3J0IHsgRVZFTlRTIGFzIFBlcmZvcm1hbmNlRXZlbnRzIH0gZnJvbSAnLi4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciBhcyBsb2dnZXIgfSBmcm9tICcuL2NsaUxvZ2dlci5qcydcbmltcG9ydCB7IFVQREFURURfQ0xJX0VORFBPSU5ULCBCU1RBQ0tfU0VSVklDRV9WRVJTSU9OLCBCSU5BUllfQlVTWV9FUlJPUl9DT0RFUyB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCB0eXBlIHsgT3B0aW9ucywgQ2FwYWJpbGl0aWVzIH0gZnJvbSAnQHdkaW8vdHlwZXMnXG5pbXBvcnQgdHlwZSB7XG4gICAgQnJvd3NlcnN0YWNrQ29uZmlnLFxuICAgIEJyb3dzZXJzdGFja09wdGlvbnMsXG4gICAgVGVzdE1hbmFnZW1lbnRPcHRpb25zLFxuICAgIFRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyxcbn0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBUZXN0RnJhbWV3b3JrQ29uc3RhbnRzIH0gZnJvbSAnLi9mcmFtZXdvcmtzL2NvbnN0YW50cy90ZXN0RnJhbWV3b3JrQ29uc3RhbnRzLmpzJ1xuaW1wb3J0IEFQSVV0aWxzIGZyb20gJy4vYXBpVXRpbHMuanMnXG5cbmNvbnN0IENMSV9MT0NLX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwXG5jb25zdCBDTElfTE9DS19QT0xMX01TID0gMTAwMFxuY29uc3QgQ0xJX0RPV05MT0FEX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwXG5jb25zdCBDTElfRE9XTkxPQURfVE1QX1BSRUZJWCA9ICdkb3dubG9hZGVkX2ZpbGVfJ1xuY29uc3QgQ0xJX0RPV05MT0FEX1RNUF9TVUZGSVggPSAnLnppcCdcblxuZXhwb3J0IGNsYXNzIENMSVV0aWxzIHtcbiAgICBzdGF0aWMgYXV0b21hdGlvbkZyYW1ld29ya0RldGFpbCA9IHt9XG4gICAgc3RhdGljIHRlc3RGcmFtZXdvcmtEZXRhaWwgPSB7fVxuICAgIHN0YXRpYyBDTElTdXBwb3J0ZWRGcmFtZXdvcmtzID0gWydtb2NoYSddXG5cbiAgICBzdGF0aWMgaXNEZXZlbG9wbWVudEVudigpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19DTElfRU5WID09PSAnZGV2ZWxvcG1lbnQnXG4gICAgfVxuXG4gICAgc3RhdGljIGdldENMSVBhcmFtc0ZvckRldkVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQ0xJX0VOViB8fCAnJyxcbiAgICAgICAgICAgIGxpc3RlbjogYHVuaXg6L3RtcC9zZGstcGxhdGZvcm0tJHtwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQ0xJX0VOVn0uc29ja2AsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZCBjb25maWcgb2JqZWN0IGZvciBiaW5hcnkgc2Vzc2lvbiByZXF1ZXN0XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0QmluQ29uZmlnKFxuICAgICAgICBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICAgICAgY2FwYWJpbGl0aWVzOlxuICAgICAgICAgICAgfCBDYXBhYmlsaXRpZXMuUmVxdWVzdGVkU3RhbmRhbG9uZUNhcGFiaWxpdGllc1xuICAgICAgICAgICAgfCBDYXBhYmlsaXRpZXMuUmVxdWVzdGVkU3RhbmRhbG9uZUNhcGFiaWxpdGllc1tdLFxuICAgICAgICBvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBCcm93c2Vyc3RhY2tPcHRpb25zLFxuICAgICAgICBidWlsZFRhZz86IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgY29uc3QgbW9kaWZpZWRPcHRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4ub3B0aW9ucyB9XG4gICAgICAgIGlmIChtb2RpZmllZE9wdHMub3B0cykge1xuICAgICAgICAgICAgbW9kaWZpZWRPcHRzLmJyb3dzZXJTdGFja0xvY2FsT3B0aW9ucyA9IG1vZGlmaWVkT3B0cy5vcHRzXG4gICAgICAgICAgICBkZWxldGUgbW9kaWZpZWRPcHRzLm9wdHNcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgbW9kaWZpZWRPcHRzLnRlc3RNYW5hZ2VtZW50T3B0aW9uc1xuXG4gICAgICAgIG1vZGlmaWVkT3B0cy50ZXN0Q29udGV4dE9wdGlvbnMgPSB7XG4gICAgICAgICAgICBza2lwU2Vzc2lvbk5hbWU6IGlzRmFsc2UobW9kaWZpZWRPcHRzLnNldFNlc3Npb25OYW1lKSxcbiAgICAgICAgICAgIHNraXBTZXNzaW9uU3RhdHVzOiBpc0ZhbHNlKG1vZGlmaWVkT3B0cy5zZXRTZXNzaW9uU3RhdHVzKSxcbiAgICAgICAgICAgIHNlc3Npb25OYW1lT21pdFRlc3RUaXRsZTogbW9kaWZpZWRPcHRzLnNlc3Npb25OYW1lT21pdFRlc3RUaXRsZSB8fCBmYWxzZSxcbiAgICAgICAgICAgIHNlc3Npb25OYW1lUHJlcGVuZFRvcExldmVsU3VpdGVUaXRsZTpcbiAgICAgICAgICAgICAgICBtb2RpZmllZE9wdHMuc2Vzc2lvbk5hbWVQcmVwZW5kVG9wTGV2ZWxTdWl0ZVRpdGxlIHx8IGZhbHNlLFxuICAgICAgICAgICAgc2Vzc2lvbk5hbWVGb3JtYXQ6IG1vZGlmaWVkT3B0cy5zZXNzaW9uTmFtZUZvcm1hdCB8fCAnJyxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbW1vbkJzdGFja09wdGlvbnMgPSAoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcyAmJlxuICAgICAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgY2FwYWJpbGl0aWVzID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICdic3RhY2s6b3B0aW9ucycgaW4gKGNhcGFiaWxpdGllcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIENhc3QgYWZ0ZXIgZ3VhcmQgdG8gc2F0aXNmeSBUeXBlU2NyaXB0XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzIGFzIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2JzdGFjazpvcHRpb25zJ10/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKVsnYnN0YWNrOm9wdGlvbnMnXSB8fCB7fVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9KSgpXG5cbiAgICAgICAgY29uc3QgaXNOb25Cc3RhY2tBMTF5ID1cbiAgICAgICAgICAgIGlzVHVyYm9TY2FsZShvcHRpb25zKSB8fFxuICAgICAgICAgICAgIXNob3VsZEFkZFNlcnZpY2VWZXJzaW9uKFxuICAgICAgICAgICAgICAgIGNvbmZpZyBhcyBPcHRpb25zLlRlc3RydW5uZXIsXG4gICAgICAgICAgICAgICAgb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eSxcbiAgICAgICAgICAgIClcbiAgICAgICAgY29uc3Qgb2JzZXJ2YWJpbGl0eU9wdGlvbnM6IFRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyA9XG4gICAgICAgICAgICBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyB8fCB7fVxuICAgICAgICBjb25zdCB0ZXN0TWFuYWdlbWVudE9wdGlvbnM6IFRlc3RNYW5hZ2VtZW50T3B0aW9ucyA9XG4gICAgICAgICAgICBvcHRpb25zLnRlc3RNYW5hZ2VtZW50T3B0aW9ucyB8fCB7fVxuICAgICAgICBjb25zdCB0ZXN0UGxhbklkID0gdHlwZW9mIHRlc3RNYW5hZ2VtZW50T3B0aW9ucy50ZXN0UGxhbklkID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyB0ZXN0TWFuYWdlbWVudE9wdGlvbnMudGVzdFBsYW5JZC50cmltKClcbiAgICAgICAgICAgIDogJydcbiAgICAgICAgY29uc3QgYmluY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgICAgIHVzZXJOYW1lOiBvYnNlcnZhYmlsaXR5T3B0aW9ucy51c2VyIHx8IGNvbmZpZy51c2VyLFxuICAgICAgICAgICAgYWNjZXNzS2V5OiBvYnNlcnZhYmlsaXR5T3B0aW9ucy5rZXkgfHwgY29uZmlnLmtleSxcbiAgICAgICAgICAgIHBsYXRmb3JtczogW10sXG4gICAgICAgICAgICBpc05vbkJzdGFja0ExMXlXRElPOiBpc05vbkJzdGFja0ExMXksXG4gICAgICAgICAgICAuLi5tb2RpZmllZE9wdHMsXG4gICAgICAgICAgICAuLi5jb21tb25Cc3RhY2tPcHRpb25zLFxuICAgICAgICB9XG5cbiAgICAgICAgYmluY29uZmlnLmJ1aWxkTmFtZSA9IG9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkTmFtZSB8fCBiaW5jb25maWcuYnVpbGROYW1lXG4gICAgICAgIGJpbmNvbmZpZy5wcm9qZWN0TmFtZSA9IG9ic2VydmFiaWxpdHlPcHRpb25zLnByb2plY3ROYW1lIHx8IGJpbmNvbmZpZy5wcm9qZWN0TmFtZVxuICAgICAgICBiaW5jb25maWcuYnVpbGRUYWcgPSB0aGlzLmdldE9ic2VydmFiaWxpdHlCdWlsZFRhZ3Mob2JzZXJ2YWJpbGl0eU9wdGlvbnMsIGJ1aWxkVGFnKSB8fCBbXVxuICAgICAgICBpZiAodGVzdFBsYW5JZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBiaW5jb25maWcudGVzdE1hbmFnZW1lbnRPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHRlc3RQbGFuSWQsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYXBzID0gQXJyYXkuaXNBcnJheShjYXBhYmlsaXRpZXMpID8gY2FwYWJpbGl0aWVzIDogW2NhcGFiaWxpdGllc11cbiAgICAgICAgZm9yIChjb25zdCBjYXAgb2YgY2Fwcykge1xuICAgICAgICAgICAgY29uc3QgcGxhdGZvcm06IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICAgICAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBjYXAgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICAgICAgICAgICAgT2JqZWN0LmtleXMoY2FwYWJpbGl0eSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gJ2JzdGFjazpvcHRpb25zJylcbiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtW2tleV0gPSBjYXBhYmlsaXR5W2tleV1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpZiAoY2FwYWJpbGl0eVsnYnN0YWNrOm9wdGlvbnMnXSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKFxuICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5Wydic3RhY2s6b3B0aW9ucyddIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgICAgICkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtW2tleV0gPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5Wydic3RhY2s6b3B0aW9ucyddIGFzIFJlY29yZDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93blxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICApW2tleV1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKGJpbmNvbmZpZy5wbGF0Zm9ybXMgYXMgQXJyYXk8dW5rbm93bj4pLnB1c2gocGxhdGZvcm0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGJpbmNvbmZpZylcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0U2RrVmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIEJTVEFDS19TRVJWSUNFX1ZFUlNJT05cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0U2RrTGFuZ3VhZ2UoKSB7XG4gICAgICAgIHJldHVybiAnRUNNQVNjcmlwdCdcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgc2V0dXBDbGlQYXRoKFxuICAgICAgICBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdDb25maWd1cmluZyBDbGkgcGF0aC4nKVxuICAgICAgICBjb25zdCBkZXZlbG9wbWVudEJpbmFyeVBhdGggPSBwcm9jZXNzLmVudi5TREtfQ0xJX0JJTl9QQVRIIHx8IG51bGxcbiAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KGRldmVsb3BtZW50QmluYXJ5UGF0aCkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRGV2ZWxvcG1lbnQgQ2xpIFBhdGg6ICR7ZGV2ZWxvcG1lbnRCaW5hcnlQYXRofWApXG4gICAgICAgICAgICByZXR1cm4gZGV2ZWxvcG1lbnRCaW5hcnlQYXRoXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY2xpRGlyID0gdGhpcy5nZXRDbGlEaXIoKVxuICAgICAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkoY2xpRGlyKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gd3JpdGFibGUgZGlyZWN0b3J5IGF2YWlsYWJsZSBmb3IgdGhlIENMSScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0NsaVBhdGggPSB0aGlzLmdldEV4aXN0aW5nQ2xpUGF0aChjbGlEaXIpXG4gICAgICAgICAgICBjb25zdCBmaW5hbEJpbmFyeVBhdGggPSBhd2FpdCB0aGlzLmNoZWNrQW5kVXBkYXRlQ2xpKFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nQ2xpUGF0aCxcbiAgICAgICAgICAgICAgICBjbGlEaXIsXG4gICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXNvbHZlZCBiaW5hcnkgcGF0aDogJHtmaW5hbEJpbmFyeVBhdGh9YClcbiAgICAgICAgICAgIHJldHVybiBmaW5hbEJpbmFyeVBhdGhcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgYEVycm9yIGluIHNldHRpbmcgdXAgY2xpIHBhdGggZGlyZWN0b3J5LCBFeGNlcHRpb246ICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGNoZWNrQW5kVXBkYXRlQ2xpKFxuICAgICAgICBleGlzdGluZ0NsaVBhdGg6IHN0cmluZyxcbiAgICAgICAgY2xpRGlyOiBzdHJpbmcsXG4gICAgICAgIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICAvLyBTa2lwIENMSSB1cGRhdGUgaW4gd29ya2VyIHByb2Nlc3NlcyAtIG9ubHkgbGF1bmNoZXIgc2hvdWxkIHVwZGF0ZVxuICAgICAgICAvLyBXb3JrZXJzIGFyZSBpZGVudGlmaWVkIGJ5IGhhdmluZyBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1Qgc2V0IChidWlsZCBhbHJlYWR5IHN0YXJ0ZWQpXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgV29ya2VyIHByb2Nlc3MgZGV0ZWN0ZWQsIHNraXBwaW5nIENMSSB1cGRhdGUuIFVzaW5nIGV4aXN0aW5nOiAke2V4aXN0aW5nQ2xpUGF0aH1gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ2xpUGF0aCAmJiBmcy5leGlzdHNTeW5jKGV4aXN0aW5nQ2xpUGF0aCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdDbGlQYXRoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAnV29ya2VyIHByb2Nlc3MgaGFzIG5vIGV4aXN0aW5nIENMSSBiaW5hcnksIGF0dGVtcHRpbmcgZG93bmxvYWQgYXMgZmFsbGJhY2suJyxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLnN0YXJ0KFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfQ0hFQ0tfVVBEQVRFKVxuICAgICAgICBsb2dnZXIuaW5mbyhgQ3VycmVudCBDTEkgUGF0aCBGb3VuZDogJHtleGlzdGluZ0NsaVBhdGh9YClcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICBzZGtfdmVyc2lvbjogQ0xJVXRpbHMuZ2V0U2RrVmVyc2lvbigpLFxuICAgICAgICAgICAgb3M6IHBsYXRmb3JtKCksXG4gICAgICAgICAgICBvc19hcmNoOiBhcmNoKCksXG4gICAgICAgICAgICBjbGlfdmVyc2lvbjogJzAnLFxuICAgICAgICAgICAgc2RrX2xhbmd1YWdlOiB0aGlzLmdldFNka0xhbmd1YWdlKCksXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KGV4aXN0aW5nQ2xpUGF0aCkpIHtcbiAgICAgICAgICAgIC8vIElmIGJpbmFyeSBpcyBidXN5IChiZWluZyBleGVjdXRlZCBieSBhbm90aGVyIHByb2Nlc3MpLCBza2lwIHZlcnNpb24gY2hlY2tcbiAgICAgICAgICAgIC8vIGFuZCBBUEkgY2FsbCBlbnRpcmVseSBcdTIwMTQgdXNlIGV4aXN0aW5nIGJpbmFyeSBhcy1pc1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNCaW5hcnlCdXN5KGV4aXN0aW5nQ2xpUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgRXhpc3RpbmcgYmluYXJ5IGlzIGN1cnJlbnRseSBpbiB1c2UsIHNraXBwaW5nIHVwZGF0ZTogJHtleGlzdGluZ0NsaVBhdGh9YClcbiAgICAgICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ2xpUGF0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IHRoaXMucnVuU2hlbGxDb21tYW5kKFxuICAgICAgICAgICAgICAgIGAke2V4aXN0aW5nQ2xpUGF0aH0gdmVyc2lvbmAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAodmVyc2lvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd0ZXh0IGZpbGUgYnVzeScpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEJpbmFyeSBidXN5IGR1cmluZyB2ZXJzaW9uIGNoZWNrLCBza2lwcGluZyB1cGRhdGU6ICR7ZXhpc3RpbmdDbGlQYXRofWApXG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfQ0hFQ0tfVVBEQVRFKVxuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0NsaVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmNsaV92ZXJzaW9uID0gdmVyc2lvblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0VG9VcGRhdGVDTEkocXVlcnlQYXJhbXMsIGNvbmZpZylcbiAgICAgICAgaWYgKG5lc3RlZEtleVZhbHVlKHJlc3BvbnNlLCBbJ3VwZGF0ZWRfY2xpX3ZlcnNpb24nXSkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgTmVlZCB0byB1cGRhdGUgYmluYXJ5LCBjdXJyZW50IGJpbmFyeSB2ZXJzaW9uOiAke3F1ZXJ5UGFyYW1zLmNsaV92ZXJzaW9ufWAsXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGNvbnN0IGJyb3dzZXJTdGFja0JpbmFyeVVybCA9XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0JJTkFSWV9VUkwgfHwgbnVsbFxuICAgICAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KGJyb3dzZXJTdGFja0JpbmFyeVVybCkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBVc2luZyBCUk9XU0VSU1RBQ0tfQklOQVJZX1VSTDogJHticm93c2VyU3RhY2tCaW5hcnlVcmx9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UudXJsID0gYnJvd3NlclN0YWNrQmluYXJ5VXJsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbmFsQmluYXJ5UGF0aCA9IGF3YWl0IHRoaXMuZG93bmxvYWRMYXRlc3RCaW5hcnkoXG4gICAgICAgICAgICAgICAgbmVzdGVkS2V5VmFsdWUocmVzcG9uc2UsIFsndXJsJ10pLFxuICAgICAgICAgICAgICAgIGNsaURpcixcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChQZXJmb3JtYW5jZUV2ZW50cy5TREtfQ0xJX0NIRUNLX1VQREFURSlcbiAgICAgICAgICAgIHJldHVybiBmaW5hbEJpbmFyeVBhdGhcbiAgICAgICAgfVxuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgIHJldHVybiBleGlzdGluZ0NsaVBhdGhcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0Q2xpRGlyKCkge1xuICAgICAgICBjb25zdCB3cml0YWJsZURpciA9IHRoaXMuZ2V0V3JpdGFibGVEaXIoKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkod3JpdGFibGVEaXIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB3cml0YWJsZSBkaXJlY3RvcnkgYXZhaWxhYmxlIGZvciB0aGUgQ0xJJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNsaURpclBhdGggPSBwYXRoLmpvaW4od3JpdGFibGVEaXIhLCAnY2xpJylcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhjbGlEaXJQYXRoKSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZURpcihjbGlEaXJQYXRoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNsaURpclBhdGhcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgYEVycm9yIGluIGdldHRpbmcgd3JpdGFibGUgZGlyZWN0b3J5LCB3cml0YWJsZURpcj0ke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiAnJ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFdyaXRhYmxlRGlyKCkge1xuICAgICAgICBjb25zdCB3cml0YWJsZURpck9wdGlvbnMgPSBbXG4gICAgICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfRklMRVNfRElSLFxuICAgICAgICAgICAgcGF0aC5qb2luKGhvbWVkaXIoKSwgJy5icm93c2Vyc3RhY2snKSxcbiAgICAgICAgICAgIHBhdGguam9pbigndG1wJywgJy5icm93c2Vyc3RhY2snKSxcbiAgICAgICAgXVxuXG4gICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiB3cml0YWJsZURpck9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KHBhdGgpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aCEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmlsZSAke3BhdGh9IGFscmVhZHkgZXhpc3RgKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzV3JpdGFibGUocGF0aCEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEdpdmluZyB3cml0ZSBwZXJtaXNzaW9uIHRvICR7cGF0aH1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHNldFJlYWRXcml0ZUFjY2VzcyhwYXRoISlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNUcnVlKHN1Y2Nlc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gcHJvdmlkZSB3cml0ZSBwZXJtaXNzaW9uIHRvICR7cGF0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmlsZSBkb2VzIG5vdCBleGlzdDogJHtwYXRofWApXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZURpcihwYXRoISlcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBHaXZpbmcgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YClcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHNldFJlYWRXcml0ZUFjY2VzcyhwYXRoISlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RydWUoc3VjY2VzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gcHJvdmlkZSB3cml0ZSBwZXJtaXNzaW9uIHRvICR7cGF0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gZ2V0IHdyaXRhYmxlIGRpcmVjdG9yeSwgZXhjZXB0aW9uICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRFeGlzdGluZ0NsaVBhdGgoY2xpRGlyOiBzdHJpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXRoIGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnlcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhjbGlEaXIpIHx8ICFmcy5zdGF0U3luYyhjbGlEaXIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTGlzdCBhbGwgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSB0aGF0IHN0YXJ0IHdpdGggXCJiaW5hcnktXCJcbiAgICAgICAgICAgIGNvbnN0IGFsbEJpbmFyaWVzID0gZnNcbiAgICAgICAgICAgICAgICAucmVhZGRpclN5bmMoY2xpRGlyKVxuICAgICAgICAgICAgICAgIC5tYXAoKGZpbGU6IHN0cmluZykgPT4gcGF0aC5qb2luKGNsaURpciwgZmlsZSkpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKGZpbGVQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBmcy5zdGF0U3luYyhmaWxlUGF0aCkuaXNGaWxlKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpLnN0YXJ0c1dpdGgoJ2JpbmFyeS0nKSxcbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmIChhbGxCaW5hcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBsYXRlc3QgYmluYXJ5IGJ5IGNvbXBhcmluZyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmluYXJ5ID0gYWxsQmluYXJpZXNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoZmlsZVBhdGg6IHN0cmluZykgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXRpbWU6IGZzLnN0YXRTeW5jKGZpbGVQYXRoKS5tdGltZSxcbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0OiB7IGZpbGVQYXRoOiBzdHJpbmc7IG10aW1lOiBEYXRlIH0gfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQ6IHsgZmlsZVBhdGg6IHN0cmluZzsgbXRpbWU6IERhdGUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGF0ZXN0IHx8ICFsYXRlc3QubXRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5tdGltZSA+IGxhdGVzdC5tdGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXRlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhdGVzdEJpbmFyeSA/IGxhdGVzdEJpbmFyeS5maWxlUGF0aCA6ICcnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAnJyAvLyBObyBiaW5hcnkgcHJlc2VudFxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgRXJyb3Igd2hpbGUgcmVhZGluZyBDTEkgcGF0aDogJHt1dGlsLmZvcm1hdChlcnIpfWApXG4gICAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBpc0JpbmFyeUJ1c3koYmluYXJ5UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpc051bGxPckVtcHR5KGJpbmFyeVBhdGgpKSB7cmV0dXJuIGZhbHNlfVxuICAgICAgICBpZiAocGxhdGZvcm0oKSA9PT0gJ2RhcndpbicpIHtyZXR1cm4gZmFsc2V9XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhiaW5hcnlQYXRoKSkge3JldHVybiBmYWxzZX1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhiaW5hcnlQYXRoLCAncisnKVxuICAgICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICBpZiAoQklOQVJZX0JVU1lfRVJST1JfQ09ERVMuaW5jbHVkZXMoZXJyLmNvZGUpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBCaW5hcnkgaXMgYnVzeTogJHtiaW5hcnlQYXRofWApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRXJyb3IgY2hlY2tpbmcgaWYgYmluYXJ5IGlzIGJ1c3k6ICR7ZXJyLm1lc3NhZ2V9YClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHJlcXVlc3RUb1VwZGF0ZUNMSSA9IGFzeW5jIChcbiAgICAgICAgcXVlcnlQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgICAgIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICkgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5UGFyYW1zKVxuICAgICAgICBjb25zdCByZXF1ZXN0SW5pdDogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke2dldEJyb3dzZXJTdGFja1VzZXIoY29uZmlnKX06JHtnZXRCcm93c2VyU3RhY2tLZXkoY29uZmlnKX1gKS50b1N0cmluZygnYmFzZTY0Jyl9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgIGAke0FQSVV0aWxzLkJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfVVJMfS8ke1VQREFURURfQ0xJX0VORFBPSU5UfT8ke3BhcmFtcy50b1N0cmluZygpfWAsXG4gICAgICAgICAgICByZXF1ZXN0SW5pdCxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBqc29uUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGByZXNwb25zZSAke0pTT04uc3RyaW5naWZ5KGpzb25SZXNwb25zZSl9YClcbiAgICAgICAgcmV0dXJuIGpzb25SZXNwb25zZVxuICAgIH1cblxuICAgIHN0YXRpYyBydW5TaGVsbENvbW1hbmQoXG4gICAgICAgIGNtZENvbW1hbmQ6IHN0cmluZyxcbiAgICAgICAgd29ya2luZ0RpciA9ICcnLFxuICAgICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvY2VzcyA9IGV4ZWMoXG4gICAgICAgICAgICAgICAgY21kQ29tbWFuZCxcbiAgICAgICAgICAgICAgICB7IGN3ZDogd29ya2luZ0RpciwgdGltZW91dDogNTAwMCB9LFxuICAgICAgICAgICAgICAgIChlcnJvcjogRXJyb3IsIHN0ZG91dDogc3RyaW5nLCBzdGRlcnI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3RkZXJyLnRyaW0oKSB8fCAnU0hFTExfRVhFQ1VURV9FUlJPUicpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0ZG91dC50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhlIHByb2Nlc3MgaXMga2lsbGVkIGlmIGl0IGV4Y2VlZHMgdGhlIHRpbWVvdXRcbiAgICAgICAgICAgIHByb2Nlc3Mub24oJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoJ1NIRUxMX0VYRUNVVEVfRVJST1InKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzdGF0aWMgZG93bmxvYWRMYXRlc3RCaW5hcnkgPSBhc3luYyAoXG4gICAgICAgIGJpbkRvd25sb2FkVXJsOiBzdHJpbmcsXG4gICAgICAgIGNsaURpcjogc3RyaW5nLFxuICAgICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4gPT4ge1xuICAgICAgICBjb25zdCBsb2NrUGF0aCA9IHBhdGguam9pbihjbGlEaXIsICdkb3dubG9hZC5sb2NrJylcblxuICAgICAgICBjb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpXG5cbiAgICAgICAgY29uc3QgcGFyc2VMb2NrRmlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhsb2NrUGF0aCwgJ3V0ZjgnKS50cmltKClcbiAgICAgICAgICAgICAgICBjb25zdCBbcGlkTGluZSwgdGltZXN0YW1wTGluZV0gPSBjb250ZW50LnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChwaWRMaW5lLCAxMClcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBOdW1iZXIucGFyc2VJbnQodGltZXN0YW1wTGluZSwgMTApXG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGlkKSB8fCAhTnVtYmVyLmlzRmluaXRlKHRpbWVzdGFtcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcGlkLCB0aW1lc3RhbXAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUHJvY2Vzc1J1bm5pbmcgPSAocGlkOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3F1aXJlTG9jayA9IGFzeW5jIChcbiAgICAgICAgICAgIHRpbWVvdXRNcyA9IENMSV9MT0NLX1RJTUVPVVRfTVMsXG4gICAgICAgICAgICBwb2xsTXMgPSBDTElfTE9DS19QT0xMX01TLFxuICAgICAgICApOiBQcm9taXNlPCgoKSA9PiB2b2lkKSB8IHsgYWxyZWFkeUV4aXN0czogc3RyaW5nIH0+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvbiAtLSBpbnRlbnRpb25hbCBwb2xsIGxvb3A7IGV4aXRzIHZpYSByZXR1cm4vdGhyb3cgYmVsb3dcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhsb2NrUGF0aCwgJ3d4JylcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmQsIGAke3Byb2Nlc3MucGlkfVxcbiR7RGF0ZS5ub3coKX1cXG5gKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsbHkgaWdub3JlIHdyaXRlIGVycm9yczsgdGhlIG9wZW4gZmQgc3RpbGwgaG9sZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGNsdXNpdmUgbG9jayBhbmQgd2lsbCBiZSBjbG9zZWQgaW4gY2xlYW51cFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKGxvY2tQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGNsZWFudXAgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZSBhcyB7IGNvZGU/OiBzdHJpbmcgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VFWElTVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2tNZXRhID0gcGFyc2VMb2NrRmlsZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9ja01ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NrQWdlID0gRGF0ZS5ub3coKSAtIGxvY2tNZXRhLnRpbWVzdGFtcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bm5pbmcgPSBpc1Byb2Nlc3NSdW5uaW5nKGxvY2tNZXRhLnBpZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bm5pbmcgfHwgbG9ja0FnZSA+IHRpbWVvdXRNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTdGFsZSBDTEkgZG93bmxvYWQgbG9jayBkZXRlY3RlZCAocGlkPSR7bG9ja01ldGEucGlkfSwgYWdlPSR7bG9ja0FnZX1tcykuIFJlbW92aW5nIGxvY2suYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhsb2NrUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGV4aXN0aW5nIGJpbmFyeSBhcHBlYXJlZCB3aGlsZSB3YWl0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0JpbmFyeSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xJVXRpbHMuZ2V0RXhpc3RpbmdDbGlQYXRoKGNsaURpcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0JpbmFyeSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmV4aXN0c1N5bmMoZXhpc3RpbmdCaW5hcnkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuc3RhdFN5bmMoZXhpc3RpbmdCaW5hcnkpLnNpemUgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCaW5hcnkgYXBwZWFyZWQgd2hpbGUgd2FpdGluZyBmb3IgbG9jazogJHtleGlzdGluZ0JpbmFyeX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBhbHJlYWR5RXhpc3RzOiBleGlzdGluZ0JpbmFyeSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID4gdGltZW91dE1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGltZW91dCB3YWl0aW5nIGZvciBsb2NrOiAke2xvY2tQYXRofWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAocG9sbE1zKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xlYW51cFRlbXBvcmFyeURvd25sb2FkcyA9IChtYXhBZ2VNcyA9IENMSV9MT0NLX1RJTUVPVVRfTVMpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgICAgIC8vIE1hdGNoIGJvdGggZG93bmxvYWQgemlwcyAoZG93bmxvYWRlZF9maWxlXyouemlwKSBhbmQgb3JwaGFuIGV4dHJhY3RcbiAgICAgICAgICAgICAgICAvLyB0ZW1wIGZpbGVzICg8bmFtZT4udG1wLjxwaWQ+KSBsZWZ0IGJ5IGNyYXNoZWQgcGVlciB3b3JrZXJzLlxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEV4dHJhY3RSZSA9IC9cXC50bXBcXC5cXGQrJC9cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZzLnJlYWRkaXJTeW5jKGNsaURpcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNEb3dubG9hZFppcCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zdGFydHNXaXRoKENMSV9ET1dOTE9BRF9UTVBfUFJFRklYKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZW5kc1dpdGgoQ0xJX0RPV05MT0FEX1RNUF9TVUZGSVgpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRXh0cmFjdFRtcCA9IHRtcEV4dHJhY3RSZS50ZXN0KGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRG93bmxvYWRaaXAgJiYgIWlzRXh0cmFjdFRtcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjbGlEaXIsIGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhdHM6IGZzLlN0YXRzXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVQYXRoKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyAtIHN0YXRzLm10aW1lTXMgPCBtYXhBZ2VNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhmaWxlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBkZWxldGUgdGVtcCBDTEkgZmlsZSAke2ZpbGVQYXRofTogJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gc2NhbiB0ZW1wIENMSSBmaWxlcyBpbiAke2NsaURpcn06ICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLnN0YXJ0KFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfRE9XTkxPQUQpXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRG93bmxvYWRpbmcgU0RLIGJpbmFyeSBmcm9tOiAke2JpbkRvd25sb2FkVXJsfWApXG5cbiAgICAgICAgbGV0IGRvd25sb2FkRW5kZWQgPSBmYWxzZVxuICAgICAgICBjb25zdCBlbmREb3dubG9hZCA9IChzdWNjZXNzID0gdHJ1ZSwgZXJyTXNnPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoZG93bmxvYWRFbmRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG93bmxvYWRFbmRlZCA9IHRydWVcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfRE9XTkxPQUQpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoXG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9ET1dOTE9BRCxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJNc2csXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVsZWFzZUxvY2s6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbG9ja1Jlc3VsdCA9IGF3YWl0IGFjcXVpcmVMb2NrKClcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYmluYXJ5IGFscmVhZHkgZXhpc3RzIChhbm90aGVyIHByb2Nlc3MgZG93bmxvYWRlZCBpdClcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbG9ja1Jlc3VsdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGVuZERvd25sb2FkKClcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9ja1Jlc3VsdC5hbHJlYWR5RXhpc3RzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbGVhc2VMb2NrID0gbG9ja1Jlc3VsdFxuXG4gICAgICAgICAgICAvLyBSZS1jaGVjayBhZnRlciBhY3F1aXJpbmcgbG9ja1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdCaW5hcnkgPSBDTElVdGlscy5nZXRFeGlzdGluZ0NsaVBhdGgoY2xpRGlyKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nQmluYXJ5ICYmXG4gICAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhleGlzdGluZ0JpbmFyeSkgJiZcbiAgICAgICAgICAgICAgICBmcy5zdGF0U3luYyhleGlzdGluZ0JpbmFyeSkuc2l6ZSA+IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgYEJpbmFyeSBhbHJlYWR5IGV4aXN0cyBhZnRlciBhY3F1aXJpbmcgbG9jazogJHtleGlzdGluZ0JpbmFyeX1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBlbmREb3dubG9hZCgpXG4gICAgICAgICAgICAgICAgcmVsZWFzZUxvY2soKVxuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0JpbmFyeVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbGVhbnVwVGVtcG9yYXJ5RG93bmxvYWRzKClcblxuICAgICAgICAgICAgY29uc3QgemlwRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgIGAke0NMSV9ET1dOTE9BRF9UTVBfUFJFRklYfSR7cHJvY2Vzcy5waWR9XyR7RGF0ZS5ub3coKX0ke0NMSV9ET1dOTE9BRF9UTVBfU1VGRklYfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBkb3dubG9hZGVkRmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHppcEZpbGVQYXRoKVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nIHwgbnVsbD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NEb3dubG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBDTElfRE9XTkxPQURfVElNRU9VVF9NUyxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKGJpbkRvd25sb2FkVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZXNwb25zZSBib2R5IHJlY2VpdmVkJylcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGRvd25sb2FkZWRGaWxlU3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnI6IEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEdvdCBFcnJvciB3aGlsZSBkb3dubG9hZGluZyBjbGkgYmluYXJ5IGZpbGU6ICR7ZXJyfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlU3RyZWFtID0gUmVhZGFibGUuZnJvbShbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVN0cmVhbS5waXBlKGRvd25sb2FkZWRGaWxlU3RyZWFtKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdXAgdGhlIGRvd25sb2FkRmlsZVN0cmVhbSBoYW5kbGVyIGJlZm9yZSBwaXBlbGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgQ0xJVXRpbHMuZG93bmxvYWRGaWxlU3RyZWFtKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkZWRGaWxlU3RyZWFtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaURpcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzdWx0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kRG93bmxvYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTG9jaz8uKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyPzogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kRG93bmxvYWQoZmFsc2UsIHV0aWwuZm9ybWF0KGVycikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBHb3QgRXJyb3IgaW4gY2xpIGJpbmFyeSBkb3dubG9hZGluZyByZXF1ZXN0ICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kRG93bmxvYWQoZmFsc2UsIHV0aWwuZm9ybWF0KGVycikpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTG9jaz8uKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwcm9jZXNzRG93bmxvYWQoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZWxlYXNlTG9jaz8uKClcbiAgICAgICAgICAgIGVuZERvd25sb2FkKGZhbHNlLCB1dGlsLmZvcm1hdChlcnIpKVxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gZG93bmxvYWQgYmluYXJ5LCBFeGNlcHRpb246ICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBkb3dubG9hZEZpbGVTdHJlYW0oXG4gICAgICAgIGRvd25sb2FkZWRGaWxlU3RyZWFtOiBmcy5Xcml0ZVN0cmVhbSxcbiAgICAgICAgemlwRmlsZVBhdGg6IHN0cmluZyxcbiAgICAgICAgY2xpRGlyOiBzdHJpbmcsXG4gICAgICAgIHJlc29sdmU6IChwYXRoOiBzdHJpbmcpID0+IHZvaWQsXG4gICAgICAgIHJlamVjdDogKHJlYXNvbj86IEVycm9yKSA9PiB2b2lkLFxuICAgICkge1xuICAgICAgICBkb3dubG9hZGVkRmlsZVN0cmVhbS5vbignY2xvc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCB5YXV6bE9wZW5Qcm9taXNlID0gcHJvbWlzaWZ5KHlhdXpsLm9wZW4pIGFzIChcbiAgICAgICAgICAgICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogeWF1emxPcHRpb25zLFxuICAgICAgICAgICAgKSA9PiBQcm9taXNlPFppcEZpbGU+XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHppcGZpbGUgPSBhd2FpdCB5YXV6bE9wZW5Qcm9taXNlKHppcEZpbGVQYXRoLCB7XG4gICAgICAgICAgICAgICAgICAgIGxhenlFbnRyaWVzOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgbGV0IHJlc29sdmVkQmluYXJ5UGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAgICAgICAgICAgICAgIHppcGZpbGUucmVhZEVudHJ5KClcbiAgICAgICAgICAgICAgICB6aXBmaWxlLm9uKCdlbnRyeScsIGFzeW5jIChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoL1xcLyQvLnRlc3QoZW50cnkuZmlsZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLnJlYWRFbnRyeSgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFppcC1zbGlwIGd1YXJkOiByZWplY3QgZW50cmllcyB3aG9zZSByZXNvbHZlZCBwYXRoIGVzY2FwZXMgY2xpRGlyXG4gICAgICAgICAgICAgICAgICAgIC8vIChCUk9XU0VSU1RBQ0tfQklOQVJZX1VSTCBsZXRzIHVzZXJzIHN1cHBseSBhcmJpdHJhcnkgemlwcykuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZVBhdGggPSBwYXRoLmpvaW4oY2xpRGlyLCBlbnRyeS5maWxlTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRDYW5kaWRhdGUgPSBwYXRoLnJlc29sdmUoY2FuZGlkYXRlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWREaXIgPSBwYXRoLnJlc29sdmUoY2xpRGlyKSArIHBhdGguc2VwXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWRDYW5kaWRhdGUuc3RhcnRzV2l0aChyZXNvbHZlZERpcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgWmlwLXNsaXAgZGV0ZWN0ZWQ6IGVudHJ5IFwiJHtlbnRyeS5maWxlTmFtZX1cIiByZXNvbHZlcyBvdXRzaWRlICR7Y2xpRGlyfWApKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0JpbmFyeUVudHJ5ID0gcGF0aC5iYXNlbmFtZShlbnRyeS5maWxlTmFtZSkuc3RhcnRzV2l0aCgnYmluYXJ5LScpXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0JpbmFyeUVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShjYW5kaWRhdGVQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0U3RyZWFtLm9uKCdlcnJvcicsICh3cml0ZUVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh3cml0ZUVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGVuUmVhZFN0cmVhbVByb21pc2UgPSBwcm9taXNpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5vcGVuUmVhZFN0cmVhbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICkuYmluZCh6aXBmaWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFkU3RyZWFtID0gYXdhaXQgb3BlblJlYWRTdHJlYW1Qcm9taXNlKGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0U3RyZWFtLmVuZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdFN0cmVhbS5vbignY2xvc2UnLCAoKSA9PiB6aXBmaWxlLnJlYWRFbnRyeSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN0cmVhbS5waXBlKGRpcmVjdFN0cmVhbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHppcEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh6aXBFcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJpbmFyeSBlbnRyeTogZXh0cmFjdCB0byBQSUQtc2NvcGVkIHRlbXAgZmlsZSwgY2htb2QsIGF0b21pYyByZW5hbWUgaW5saW5lLlxuICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50cyBFVFhUQlNZL0VCVVNZOiB0aGUgZmlsZSBiZWluZyBleGVjdXRlZCBpcyBuZXZlciB0aGUgZmlsZSBiZWluZyB3cml0dGVuLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5hbFBhdGggPSBjYW5kaWRhdGVQYXRoXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcGF0aC5qb2luKGNsaURpciwgYCR7ZW50cnkuZmlsZU5hbWV9LnRtcC4ke3Byb2Nlc3MucGlkfWApXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3JpdGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbSh0ZW1wUGF0aClcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd3JpdGVTdHJlYW1FcnJvcmVkID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW0ub24oJ2Vycm9yJywgKHdyaXRlRXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbUVycm9yZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICBmc3AudW5saW5rKHRlbXBQYXRoKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHdyaXRlRXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIC8vICdjbG9zZScgZmlyZXMgYWZ0ZXIgdGhlIGZkIGlzIGNsb3NlZDsgc2FmZSBmb3IgZnNwLnJlbmFtZSBvbiBXaW5kb3dzICh3aGVyZSAnZmluaXNoJyBtYXkgZmlyZSBiZWZvcmUgZmQgcmVsZWFzZSkuXG4gICAgICAgICAgICAgICAgICAgIC8vIGF1dG9DbG9zZT10cnVlIGFsc28gbWFrZXMgJ2Nsb3NlJyBmaXJlIGFmdGVyICdlcnJvcicgXHUyMDE0IGJhaWwgb3V0IGlmIHRoZSBlcnJvciBwYXRoIGFscmVhZHkgcmVqZWN0ZWQuXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtLm9uKCdjbG9zZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZVN0cmVhbUVycm9yZWQpIHsgcmV0dXJuIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnNwLmNobW9kKHRlbXBQYXRoLCAnMDc1NScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnNwLnJlbmFtZSh0ZW1wUGF0aCwgZmluYWxQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocmVuYW1lRXJyOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmFycm93IGZhbGxiYWNrIHRvIGNyb3NzLWRldmljZSAoRVhERVYpIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbmFtZUVyci5jb2RlICE9PSAnRVhERVYnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZW5hbWVFcnJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgQXRvbWljIHJlbmFtZSBmYWlsZWQgKGNyb3NzLWRldmljZSksIGZhbGxpbmcgYmFjayB0byBjb3B5OiAke3JlbmFtZUVyci5tZXNzYWdlfWApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC5jb3B5RmlsZSh0ZW1wUGF0aCwgZmluYWxQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmc3AudW5saW5rKHRlbXBQYXRoKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlZEJpbmFyeVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRCaW5hcnlQYXRoID0gZmluYWxQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUucmVhZEVudHJ5KClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC51bmxpbmsodGVtcFBhdGgpLmNhdGNoKCgpID0+IHt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlblJlYWRTdHJlYW1Qcm9taXNlID0gcHJvbWlzaWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5vcGVuUmVhZFN0cmVhbSxcbiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKHppcGZpbGUpXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFkU3RyZWFtID0gYXdhaXQgb3BlblJlYWRTdHJlYW1Qcm9taXNlKGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtLmVuZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN0cmVhbS5waXBlKHdyaXRlU3RyZWFtKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh6aXBFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzcC51bmxpbmsodGVtcFBhdGgpLmNhdGNoKCgpID0+IHt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5jbG9zZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoemlwRXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHppcGZpbGUub24oJ2Vycm9yJywgKHppcEVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoemlwRXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICB6aXBmaWxlLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZnNwLnVubGluayh6aXBGaWxlUGF0aCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBkZWxldGUgemlwIGZpbGU6ICR7emlwRmlsZVBhdGh9YClcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkQmluYXJ5UGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5jbG9zZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdObyBiaW5hcnktKiBlbnRyeSBmb3VuZCBpbiB6aXA7IGNhbm5vdCBjb21wbGV0ZSBDTEkgYmluYXJ5IGV4dHJhY3Rpb24nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkQmluYXJ5UGF0aClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVyciBhcyBFcnJvcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0VGVzdEZyYW1ld29ya0RldGFpbCgpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUX0ZSQU1FV09SS19ERVRBSUwpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUX0ZSQU1FV09SS19ERVRBSUwpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGVzdEZyYW1ld29ya0RldGFpbFxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRBdXRvbWF0aW9uRnJhbWV3b3JrRGV0YWlsKCkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FVVE9NQVRJT05fRlJBTUVXT1JLX0RFVEFJTCkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FVVE9NQVRJT05fRlJBTUVXT1JLX0RFVEFJTCxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5hdXRvbWF0aW9uRnJhbWV3b3JrRGV0YWlsXG4gICAgfVxuXG4gICAgc3RhdGljIHNldEZyYW1ld29ya0RldGFpbChcbiAgICAgICAgdGVzdEZyYW1ld29yazogc3RyaW5nLFxuICAgICAgICBhdXRvbWF0aW9uRnJhbWV3b3JrOiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGlmICghdGVzdEZyYW1ld29yayB8fCAhYXV0b21hdGlvbkZyYW1ld29yaykge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBUZXN0IG9yIEF1dG9tYXRpb24gZnJhbWV3b3JrIG5vdCBwcm92aWRlZCB0ZXN0RnJhbWV3b3JrPSR7dGVzdEZyYW1ld29ya30sIGF1dG9tYXRpb25GcmFtZXdvcms9JHthdXRvbWF0aW9uRnJhbWV3b3JrfWAsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRlc3RGcmFtZXdvcmtEZXRhaWwgPSB7XG4gICAgICAgICAgICBuYW1lOiB0ZXN0RnJhbWV3b3JrLFxuICAgICAgICAgICAgdmVyc2lvbjogeyBbdGVzdEZyYW1ld29ya106IENMSVV0aWxzLmdldFNka1ZlcnNpb24oKSB9LFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hdXRvbWF0aW9uRnJhbWV3b3JrRGV0YWlsID0ge1xuICAgICAgICAgICAgbmFtZTogYXV0b21hdGlvbkZyYW1ld29yayxcbiAgICAgICAgICAgIHZlcnNpb246IHsgW2F1dG9tYXRpb25GcmFtZXdvcmtdOiBDTElVdGlscy5nZXRTZGtWZXJzaW9uKCkgfSxcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BVVRPTUFUSU9OX0ZSQU1FV09SS19ERVRBSUwgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHRoaXMuYXV0b21hdGlvbkZyYW1ld29ya0RldGFpbCxcbiAgICAgICAgKVxuICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVF9GUkFNRVdPUktfREVUQUlMID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB0aGlzLnRlc3RGcmFtZXdvcmtEZXRhaWwsXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgaW5zdGFuY2UgbmFtZSB1c2luZyB0aHJlYWQgaWQgYW5kIHByb2Nlc3NJZFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldEN1cnJlbnRJbnN0YW5jZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiBgJHtwcm9jZXNzLnBpZH06JHt0aHJlYWRJZH1gXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSB1bmlxdWUgY2xpZW50IHdvcmtlciBpZGVudGlmaWVyIGNvbWJpbmluZyB0aHJlYWQgSUQgYW5kIHByb2Nlc3MgSUQuXG4gICAgICogVGhpcyBpZGVudGlmaWVyIGlzIHVzZWQgdG8gdHJhY2sgd29ya2VyLXNwZWNpZmljIGV2ZW50cyBhbmQgcGVyZm9ybWFuY2UgbWV0cmljc1xuICAgICAqIGFjcm9zcyBkaXN0cmlidXRlZCB0ZXN0IGV4ZWN1dGlvbi4gRm9ybWF0IG1hdGNoZXMgdGhlIFB5dGhvbiBTREsgaW1wbGVtZW50YXRpb25cbiAgICAgKiBmb3IgY29uc2lzdGVuY3kgYWNyb3NzIFNES3MuXG4gICAgICpcbiAgICAgKiBGb3JtYXQ6IFwidGhyZWFkSWQtcHJvY2Vzc0lkXCJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IC0gT3B0aW9uYWwgZXhlY3V0aW9uIGNvbnRleHQgd2l0aCB0aHJlYWRJZCBhbmQgcHJvY2Vzc0lkXG4gICAgICogQHJldHVybnMgV29ya2VyIElEIHN0cmluZyBpbiBmb3JtYXQgXCJ0aHJlYWRJZC1wcm9jZXNzSWRcIlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgd29ya2VySWQgPSBDTElVdGlscy5nZXRDbGllbnRXb3JrZXJJZCgpIC8vIFJldHVybnMgXCIxLTEyMzQ1XCJcbiAgICAgKiBjb25zdCB3b3JrZXJJZCA9IENMSVV0aWxzLmdldENsaWVudFdvcmtlcklkKHsgdGhyZWFkSWQ6IDEyMywgcHJvY2Vzc0lkOiA0NTYgfSkgLy8gUmV0dXJucyBcIjEyMy00NTZcIlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDbGllbnRXb3JrZXJJZChjb250ZXh0PzogeyB0aHJlYWRJZD86IHN0cmluZyB8IG51bWJlcjsgcHJvY2Vzc0lkPzogc3RyaW5nIHwgbnVtYmVyIH0pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB3b3JrZXJUaHJlYWRJZCA9IGNvbnRleHQ/LnRocmVhZElkPy50b1N0cmluZygpIHx8IHRocmVhZElkLnRvU3RyaW5nKClcbiAgICAgICAgY29uc3Qgd29ya2VyUHJvY2Vzc0lkID0gY29udGV4dD8ucHJvY2Vzc0lkPy50b1N0cmluZygpIHx8IHByb2Nlc3MucGlkLnRvU3RyaW5nKClcbiAgICAgICAgcmV0dXJuIGAke3dvcmtlclRocmVhZElkfS0ke3dvcmtlclByb2Nlc3NJZH1gXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Rlc3RGcmFtZXdvcmtTdGF0ZSB8IEF1dG9tYXRpb25GcmFtZXdvcmtTdGF0ZX0gZnJhbWV3b3JrU3RhdGVcbiAgICAgKiBAcGFyYW0ge0hvb2tTdGF0ZX0gaG9va1N0YXRlXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0SG9va1JlZ2lzdHJ5S2V5KGZyYW1ld29ya1N0YXRlOiBTdGF0ZSwgaG9va1N0YXRlOiBTdGF0ZSkge1xuICAgICAgICByZXR1cm4gYCR7ZnJhbWV3b3JrU3RhdGV9OiR7aG9va1N0YXRlfWBcbiAgICB9XG5cbiAgICBzdGF0aWMgbWF0Y2hIb29rUmVnZXgoaG9va1N0YXRlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoVGVzdEZyYW1ld29ya0NvbnN0YW50cy5IT09LX1JFR0VYKVxuXG4gICAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QoaG9va1N0YXRlKVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRPYnNlcnZhYmlsaXR5QnVpbGRUYWdzKFxuICAgICAgICBvYnNlcnZhYmlsaXR5T3B0aW9uczogVGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLFxuICAgICAgICBic3RhY2tCdWlsZFRhZz86IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LlRFU1RfT0JTRVJWQUJJTElUWV9CVUlMRF9UQUcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHLnNwbGl0KCcsJylcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGRUYWcpIHtcbiAgICAgICAgICAgIHJldHVybiBvYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZFRhZ1xuICAgICAgICB9XG4gICAgICAgIGlmIChic3RhY2tCdWlsZFRhZykge1xuICAgICAgICAgICAgcmV0dXJuIFtic3RhY2tCdWlsZFRhZ11cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICBzdGF0aWMgY2hlY2tDTElTdXBwb3J0ZWRGcmFtZXdvcmtzKGZyYW1ld29yazogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChmcmFtZXdvcmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuQ0xJU3VwcG9ydGVkRnJhbWV3b3Jrcy5pbmNsdWRlcyhmcmFtZXdvcmspXG4gICAgfVxufVxuIiwgImltcG9ydCB7IGZldGNoIGFzIHVuZGljaUZldGNoLCB0eXBlIFJlcXVlc3RJbml0IGFzIFVuZGljaVJlcXVlc3RJbml0LCBQcm94eUFnZW50IH0gZnJvbSAndW5kaWNpJ1xuXG5leHBvcnQgY2xhc3MgUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgcmVzcG9uc2U6IFJlc3BvbnNlXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCByZXM6IFJlc3BvbnNlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGZldGNoV3JhcChpbnB1dDogUmVxdWVzdEluZm8gfCBVUkwsIGluaXQ/OiBSZXF1ZXN0SW5pdCkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IF9mZXRjaChpbnB1dCwgaW5pdClcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgUmVzcG9uc2VFcnJvcihgRXJyb3IgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgJHtyZXMuc3RhdHVzfTogICR7YXdhaXQgcmVzLnRleHQoKX1gLCByZXMpXG4gICAgfVxuICAgIHJldHVybiByZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9mZXRjaChpbnB1dDogUmVxdWVzdEluZm8gfCBVUkwsIGluaXQ/OiBSZXF1ZXN0SW5pdCkge1xuICAgIGNvbnN0IHByb3h5VXJsID0gcHJvY2Vzcy5lbnYuSFRUUF9QUk9YWSB8fCBwcm9jZXNzLmVudi5IVFRQU19QUk9YWVxuICAgIGlmIChwcm94eVVybCkge1xuICAgICAgICBjb25zdCBub1Byb3h5ID0gcHJvY2Vzcy5lbnYuTk9fUFJPWFkgJiYgcHJvY2Vzcy5lbnYuTk9fUFJPWFkudHJpbSgpXG4gICAgICAgICAgICA/IHByb2Nlc3MuZW52Lk5PX1BST1hZLnRyaW0oKS5zcGxpdCgvW1xccyw7XSsvKVxuICAgICAgICAgICAgOiBbXVxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQpXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG4gICAgICAgIGlmICghbm9Qcm94eS5zb21lKChzdHIpID0+IHVybC5ob3N0bmFtZS5lbmRzV2l0aChzdHIpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGljaUZldGNoKFxuICAgICAgICAgICAgICAgIHJlcXVlc3QudXJsLFxuICAgICAgICAgICAgICAgIHsgLi4uKGluaXQgYXMgVW5kaWNpUmVxdWVzdEluaXQpLCBkaXNwYXRjaGVyOiBuZXcgUHJveHlBZ2VudChwcm94eVVybCkgfSxcbiAgICAgICAgICAgICkgYXMgdW5rbm93biBhcyBQcm9taXNlPFJlc3BvbnNlPlxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmZXRjaChpbnB1dCwgaW5pdClcbn1cbiIsICJleHBvcnQgY29uc3QgRVZFTlRTID0ge1xuICAgIFNES19TRVRVUDogJ3NkazpzZXR1cCcsXG4gICAgU0RLX0NMRUFOVVA6ICdzZGs6Y2xlYW51cCcsXG4gICAgU0RLX1BSRV9URVNUOiAnc2RrOnByZS10ZXN0JyxcbiAgICBTREtfVEVTVDogJ3Nkazp0ZXN0JyxcbiAgICBTREtfUE9TVF9URVNUOiAnc2RrOnBvc3QtdGVzdCcsXG4gICAgU0RLX0hPT0s6ICdzZGs6aG9vaycsXG4gICAgU0RLX0RSSVZFUjogJ3Nkazpkcml2ZXInLFxuICAgIFNES19BMTFZOiAnc2RrOmExMXknLFxuICAgIFNES19PMTFZOiAnc2RrOm8xMXknLFxuICAgIFNES19BVVRPX0NBUFRVUkU6ICdzZGs6YXV0by1jYXB0dXJlJyxcbiAgICBTREtfUFJPWFlfU0VUVVA6ICdzZGs6cHJveHktc2V0dXAnLFxuICAgIFNES19URVNUSFVCOiAnc2RrOnRlc3RodWInLFxuICAgIFNES19BVVRPTUFURTogJ3NkazphdXRvbWF0ZScsXG4gICAgU0RLX0FQUF9BVVRPTUFURTogJ3NkazphcHAtYXV0b21hdGUnLFxuICAgIFNES19UVVJCT1NDQUxFOiAnc2RrOnR1cmJvc2NhbGUnLFxuICAgIFNES19QRVJDWTogJ3NkazpwZXJjeScsXG4gICAgU0RLX1BSRV9JTklUSUFMSVpFOiAnc2RrOmRyaXZlcjpwcmUtaW5pdGlhbGl6YXRpb24nLFxuICAgIFNES19QT1NUX0lOSVRJQUxJWkU6ICdzZGs6ZHJpdmVyOnBvc3QtaW5pdGlhbGl6YXRpb24nLFxuICAgIFNES19DTElfQ0hFQ0tfVVBEQVRFOiAnc2RrOmNsaTpjaGVjay11cGRhdGUnLFxuICAgIFNES19DTElfRE9XTkxPQUQ6ICdzZGs6Y2xpOmRvd25sb2FkJyxcbiAgICBTREtfQ0xJX09OX0JPT1RTVFJBUDogJ3NkazpjbGk6b24tYm9vdHN0cmFwJyxcbiAgICBTREtfQ0xJX09OX0NPTk5FQ1Q6ICdzZGs6Y2xpOm9uLWNvbm5lY3QnLFxuICAgIFNES19DTElfU1RBUlQ6ICdzZGs6Y2xpOnN0YXJ0JyxcbiAgICBTREtfQ0xJX09OX1NUT1A6ICdzZGs6Y2xpOm9uLXN0b3AnLFxuICAgIFNES19DT05ORUNUX0JJTl9TRVNTSU9OOiAnc2RrOmNvbm5lY3RCaW5TZXNzaW9uJyxcbiAgICBTREtfU1RBUlRfQklOX1NFU1NJT046ICdzZGs6c3RhcnRCaW5TZXNzaW9uJyxcbiAgICAvLyBOZXcgZXZlbnRzIGZyb20gUHl0aG9uIFNES1xuICAgIFNES19EUklWRVJfSU5JVDogJ3Nkazpkcml2ZXJJbml0JyxcbiAgICBTREtfRklORF9ORUFSRVNUX0hVQjogJ3NkazpmaW5kTmVhcmVzdEh1YicsXG4gICAgU0RLX0FVVE9NQVRJT05fRlJBTUVXT1JLX0lOSVQ6ICdzZGs6YXV0b21hdGlvbkZyYW1ld29ya0luaXQnLFxuICAgIFNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19TVEFSVDogJ3NkazphdXRvbWF0aW9uRnJhbWV3b3JrU3RhcnQnLFxuICAgIFNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19TVE9QOiAnc2RrOmF1dG9tYXRpb25GcmFtZXdvcmtTdG9wJyxcbiAgICBTREtfQUNDRVNTSUJJTElUWV9DT05GSUc6ICdzZGs6YWNjZXNzaWJpbGl0eUNvbmZpZycsXG4gICAgU0RLX09CU0VSVkFCSUxJVFlfQ09ORklHOiAnc2RrOm9ic2VydmFiaWxpdHlDb25maWcnLFxuICAgIFNES19BSV9TRUxGX0hFQUxfU1RFUDogJ3NkazphaVNlbGZIZWFsU3RlcCcsXG4gICAgU0RLX0FJX1NFTEZfSEVBTF9HRVRfUkVTVUxUOiAnc2RrOmFpU2VsZkhlYWxHZXRSZXN1bHQnLFxuICAgIFNES19URVNUX0ZSQU1FV09SS19FVkVOVDogJ3Nkazp0ZXN0RnJhbWV3b3JrRXZlbnQnLFxuICAgIFNES19URVNUX1NFU1NJT05fRVZFTlQ6ICdzZGs6dGVzdFNlc3Npb25FdmVudCcsXG4gICAgU0RLX0NMSV9MT0dfQ1JFQVRFRF9FVkVOVDogJ3NkazpjbGk6bG9nQ3JlYXRlZEV2ZW50JyxcbiAgICBTREtfQ0xJX0VOUVVFVUVfVEVTVF9FVkVOVDogJ3NkazpjbGk6ZW5xdWV1ZVRlc3RFdmVudCcsXG4gICAgU0RLX09OX1NUT1A6ICdzZGs6b25TdG9wJyxcbiAgICBTREtfU0VORF9MT0dTOiAnc2RrOnNlbmRsb2dzJyxcbiAgICAvLyBGdW5uZWwgRXZlbnRzXG4gICAgU0RLX0ZVTk5FTF9URVNUX0FUVEVNUFRFRDogJ3NkazpmdW5uZWw6dGVzdC1hdHRlbXB0ZWQnLFxuICAgIFNES19GVU5ORUxfVEVTVF9TVUNDRVNTRlVMOiAnc2RrOmZ1bm5lbDp0ZXN0LXN1Y2Nlc3NmdWwnLFxuICAgIC8vIExvZyBVcGxvYWQgRXZlbnRzXG4gICAgU0RLX1VQTE9BRF9MT0dTOiAnc2RrOnVwbG9hZC1sb2dzJyxcbiAgICAvLyBLZXkgTWV0cmljcyBFdmVudHNcbiAgICBTREtfU0VORF9LRVlfTUVUUklDUzogJ3NkazpzZW5kLWtleS1tZXRyaWNzJyxcbiAgICBTREtfS0VZX01FVFJJQ1NfUFJFUEFSQVRJT046ICdzZGs6a2V5LW1ldHJpY3M6cHJlcGFyYXRpb24nLFxuICAgIFNES19LRVlfTUVUUklDU19VUExPQUQ6ICdzZGs6a2V5LW1ldHJpY3M6dXBsb2FkJyxcbiAgICAvLyBDTEkgQmluYXJ5IEV2ZW50c1xuICAgIFNES19DTElfRE9XTkxPQURfQklOQVJZOiAnc2RrOmNsaTpkb3dubG9hZC1iaW5hcnknLFxuICAgIFNES19DTElfQklOQVJZX1ZFUklGSUNBVElPTjogJ3NkazpjbGk6YmluYXJ5LXZlcmlmaWNhdGlvbicsXG4gICAgLy8gQ2xlYW51cCAmIFNodXRkb3duIEV2ZW50cyAodHJhY2tpbmcgZ2FwIGJldHdlZW4gZHJpdmVyOnF1aXQgYW5kIGZ1bm5lbDp0ZXN0LXN1Y2Nlc3NmdWwpXG4gICAgU0RLX0xJU1RFTkVSX1dPUktFUl9FTkQ6ICdzZGs6bGlzdGVuZXI6d29ya2VyLWVuZCcsXG4gICAgU0RLX1BFUkNZX1RFQVJET1dOOiAnc2RrOnBlcmN5OnRlYXJkb3duJyxcbiAgICBTREtfV09SS0VSX1NBVkVfREFUQTogJ3Nkazp3b3JrZXI6c2F2ZS1kYXRhJyxcbiAgICBTREtfUEVSRk9STUFOQ0VfUkVQT1JUX0dFTjogJ3NkazpwZXJmb3JtYW5jZTpyZXBvcnQtZ2VuZXJhdGlvbicsXG4gICAgU0RLX1BFUkZPUk1BTkNFX0pTT05fV1JJVEU6ICdzZGs6cGVyZm9ybWFuY2U6anNvbi13cml0ZScsXG4gICAgU0RLX1BFUkZPUk1BTkNFX0hUTUxfR0VOOiAnc2RrOnBlcmZvcm1hbmNlOmh0bWwtZ2VuZXJhdGlvbicsXG4gICAgLy8gRGV2aWNlIEFsbG9jYXRpb24gRXZlbnQgKHRyYWNraW5nIGdhcCBiZXR3ZWVuIGJlZm9yZVNlc3Npb24gYW5kIGJlZm9yZSBob29rcylcbiAgICBTREtfREVWSUNFX0FMTE9DQVRJT046ICdzZGs6ZGV2aWNlLWFsbG9jYXRpb24nXG59XG5cbmV4cG9ydCBjb25zdCBURVNUSFVCX0VWRU5UUyA9IHtcbiAgICBTVEFSVDogYCR7RVZFTlRTLlNES19URVNUSFVCfTpzdGFydGAsXG4gICAgU1RPUDogYCR7RVZFTlRTLlNES19URVNUSFVCfTpzdG9wYFxufVxuXG5leHBvcnQgY29uc3QgQVVUT01BVEVfRVZFTlRTID0ge1xuICAgIEtFRVBfQUxJVkU6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OmtlZXAtYWxpdmVgLFxuICAgIEhVQl9NQU5BR0VNRU5UOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpodWItbWFuYWdlbWVudGAsXG4gICAgTE9DQUxfU1RBUlQ6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OmxvY2FsLXN0YXJ0YCxcbiAgICBMT0NBTF9TVE9QOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpsb2NhbC1zdG9wYCxcbiAgICBEUklWRVJfTUFOQUdFOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpkcml2ZXItbWFuYWdlYCxcbiAgICBTRVNTSU9OX05BTUU6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OnNlc3Npb24tbmFtZWAsXG4gICAgU0VTU0lPTl9TVEFUVVM6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OnNlc3Npb24tc3RhdHVzYCxcbiAgICBTRVNTSU9OX0FOTk9UQVRJT046IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OnNlc3Npb24tYW5ub3RhdGlvbmAsXG4gICAgSURMRV9USU1FT1VUOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTppZGxlLXRpbWVvdXRgLFxuICAgIEdFTkVSQVRFX0NJX0FSVElGQUNUOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpjaS1hcnRpZmFjdHNgLFxuICAgIFBSSU5UX0JVSUxETElOSzogYCR7RVZFTlRTLlNES19BVVRPTUFURX06cHJpbnQtYnVpbGRsaW5rYFxufVxuXG5leHBvcnQgY29uc3QgQTExWV9FVkVOVFMgPSB7XG4gICAgUEVSRk9STV9TQ0FOOiBgJHtFVkVOVFMuU0RLX0ExMVl9OmRyaXZlci1wZXJmb3Jtc2NhbmAsXG4gICAgU0FWRV9SRVNVTFRTOiBgJHtFVkVOVFMuU0RLX0ExMVl9OnNhdmUtcmVzdWx0c2AsXG4gICAgR0VUX1JFU1VMVFM6IGAke0VWRU5UUy5TREtfQTExWX06Z2V0LWFjY2Vzc2liaWxpdHktcmVzdWx0c2AsXG4gICAgR0VUX1JFU1VMVFNfU1VNTUFSWTogYCR7RVZFTlRTLlNES19BMTFZfTpnZXQtYWNjZXNzaWJpbGl0eS1yZXN1bHRzLXN1bW1hcnlgXG59XG5cbmV4cG9ydCBjb25zdCBQRVJDWV9FVkVOVFMgPSB7XG4gICAgRE9XTkxPQUQ6IGAke0VWRU5UUy5TREtfUEVSQ1l9OmRvd25sb2FkYCxcbiAgICBTQ1JFRU5TSE9UOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpzY3JlZW5zaG90YCxcbiAgICBTVEFSVDogYCR7RVZFTlRTLlNES19QRVJDWX06c3RhcnRgLFxuICAgIFNUT1A6IGAke0VWRU5UUy5TREtfUEVSQ1l9OnN0b3BgLFxuICAgIEFVVE9fQ0FQVFVSRTogYCR7RVZFTlRTLlNES19QRVJDWX06YXV0by1jYXB0dXJlYCxcbiAgICBTTkFQU0hPVDogYCR7RVZFTlRTLlNES19QRVJDWX06c25hcHNob3RgLFxuICAgIFNDUkVFTlNIT1RfQVBQOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpzY3JlZW5zaG90LWFwcGBcbn1cblxuZXhwb3J0IGNvbnN0IE8xMVlfRVZFTlRTID0ge1xuICAgIFNZTkM6IGAke0VWRU5UUy5TREtfTzExWX06c3luY2AsXG4gICAgVEFLRV9TQ1JFRU5TSE9UOiBgJHtFVkVOVFMuU0RLX08xMVl9OmRyaXZlci10YWtlU2NyZWVuU2hvdGAsXG4gICAgUFJJTlRfQlVJTERMSU5LOiBgJHtFVkVOVFMuU0RLX08xMVl9OnByaW50LWJ1aWxkbGlua2Bcbn1cblxuZXhwb3J0IGNvbnN0IEhPT0tfRVZFTlRTID0ge1xuICAgIEJFRk9SRV9FQUNIOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmJlZm9yZS1lYWNoYCxcbiAgICBBRlRFUl9FQUNIOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmFmdGVyLWVhY2hgLFxuICAgIEFGVEVSX0FMTDogYCR7RVZFTlRTLlNES19IT09LfTphZnRlci1hbGxgLFxuICAgIEJFRk9SRV9BTEw6IGAke0VWRU5UUy5TREtfSE9PS306YmVmb3JlLWFsbGAsXG4gICAgQkVGT1JFOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmJlZm9yZWAsXG4gICAgQUZURVI6IGAke0VWRU5UUy5TREtfSE9PS306YWZ0ZXJgXG59XG5cbmV4cG9ydCBjb25zdCBUVVJCT1NDQUxFX0VWRU5UUyA9IHtcbiAgICBIVUJfTUFOQUdFTUVOVDogYCR7RVZFTlRTLlNES19UVVJCT1NDQUxFfTpodWItbWFuYWdlbWVudGAsXG4gICAgUFJJTlRfQlVJTERMSU5LOiBgJHtFVkVOVFMuU0RLX1RVUkJPU0NBTEV9OnByaW50LWJ1aWxkbGlua2Bcbn1cblxuZXhwb3J0IGNvbnN0IEFQUF9BVVRPTUFURV9FVkVOVFMgPSB7XG4gICAgQVBQX1VQTE9BRDogYCR7RVZFTlRTLlNES19BUFBfQVVUT01BVEV9OmFwcC11cGxvYWRgXG59XG5cbmV4cG9ydCBjb25zdCBEUklWRVJfRVZFTlQgPSB7XG4gICAgUVVJVDogYCR7RVZFTlRTLlNES19EUklWRVJ9OnF1aXRgLFxuICAgIEdFVDogYCR7RVZFTlRTLlNES19EUklWRVJ9OmdldGAsXG4gICAgUFJFX0VYRUNVVEU6IGAke0VWRU5UUy5TREtfRFJJVkVSfTpwcmUtZXhlY3V0ZWAsXG4gICAgUE9TVF9FWEVDVVRFOiBgJHtFVkVOVFMuU0RLX0RSSVZFUn06cG9zdC1leGVjdXRlYCxcbiAgICBJTklUOiBFVkVOVFMuU0RLX0RSSVZFUl9JTklULFxuICAgIFBSRV9JTklUSUFMSVpFOiBFVkVOVFMuU0RLX1BSRV9JTklUSUFMSVpFLFxuICAgIFBPU1RfSU5JVElBTElaRTogRVZFTlRTLlNES19QT1NUX0lOSVRJQUxJWkVcbn1cblxuLyoqXG4gKiBGcmFtZXdvcmsgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgYXV0b21hdGlvbiBmcmFtZXdvcmsgdHJhY2tpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IEZSQU1FV09SS19FVkVOVFMgPSB7XG4gICAgSU5JVDogRVZFTlRTLlNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19JTklULFxuICAgIFNUQVJUOiBFVkVOVFMuU0RLX0FVVE9NQVRJT05fRlJBTUVXT1JLX1NUQVJULFxuICAgIFNUT1A6IEVWRU5UUy5TREtfQVVUT01BVElPTl9GUkFNRVdPUktfU1RPUFxufVxuXG4vKipcbiAqIE1vZHVsZSBjb25maWd1cmF0aW9uIGV2ZW50c1xuICovXG5leHBvcnQgY29uc3QgQ09ORklHX0VWRU5UUyA9IHtcbiAgICBBQ0NFU1NJQklMSVRZOiBFVkVOVFMuU0RLX0FDQ0VTU0lCSUxJVFlfQ09ORklHLFxuICAgIE9CU0VSVkFCSUxJVFk6IEVWRU5UUy5TREtfT0JTRVJWQUJJTElUWV9DT05GSUdcbn1cblxuLyoqXG4gKiBBSSBzZWxmLWhlYWxpbmcgZXZlbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBBSV9FVkVOVFMgPSB7XG4gICAgU0VMRl9IRUFMX1NURVA6IEVWRU5UUy5TREtfQUlfU0VMRl9IRUFMX1NURVAsXG4gICAgU0VMRl9IRUFMX0dFVF9SRVNVTFQ6IEVWRU5UUy5TREtfQUlfU0VMRl9IRUFMX0dFVF9SRVNVTFRcbn1cblxuLyoqXG4gKiBFdmVudCBkaXNwYXRjaGVyIGV2ZW50cyBmb3IgdGVzdCBmcmFtZXdvcmsgYW5kIHNlc3Npb24gdHJhY2tpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IERJU1BBVENIRVJfRVZFTlRTID0ge1xuICAgIFRFU1RfRlJBTUVXT1JLOiBFVkVOVFMuU0RLX1RFU1RfRlJBTUVXT1JLX0VWRU5ULFxuICAgIFRFU1RfU0VTU0lPTjogRVZFTlRTLlNES19URVNUX1NFU1NJT05fRVZFTlQsXG4gICAgTE9HX0NSRUFURUQ6IEVWRU5UUy5TREtfQ0xJX0xPR19DUkVBVEVEX0VWRU5ULFxuICAgIEVOUVVFVUVfVEVTVDogRVZFTlRTLlNES19DTElfRU5RVUVVRV9URVNUX0VWRU5UXG59XG5cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcblxuaW1wb3J0IGxvZ2dlciBmcm9tICdAd2Rpby9sb2dnZXInXG5cbmltcG9ydCB7IExPR1NfRklMRSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IENPTE9SUyB9IGZyb20gJy4uL3V0aWwuanMnXG5cbmNvbnN0IGxvZyA9IGxvZ2dlcignQHdkaW8vYnJvd3NlcnN0YWNrLXNlcnZpY2UvY2xpJylcblxuZXhwb3J0IGNsYXNzIEJTdGFja0xvZ2dlciB7XG4gICAgcHVibGljIHN0YXRpYyBsb2dGaWxlUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBMT0dTX0ZJTEUpXG4gICAgcHVibGljIHN0YXRpYyBsb2dGb2xkZXJQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdsb2dzJylcbiAgICBwcml2YXRlIHN0YXRpYyBsb2dGaWxlU3RyZWFtOiBmcy5Xcml0ZVN0cmVhbSB8IG51bGxcblxuICAgIHN0YXRpYyBsb2dUb0ZpbGUobG9nTWVzc2FnZTogc3RyaW5nLCBsb2dMZXZlbDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubG9nRmlsZVN0cmVhbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5zdXJlTG9nc0ZvbGRlcigpXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odGhpcy5sb2dGaWxlUGF0aCwgeyBmbGFnczogJ2EnIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dGaWxlU3RyZWFtICYmIHRoaXMubG9nRmlsZVN0cmVhbS53cml0YWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbS53cml0ZSh0aGlzLmZvcm1hdExvZyhsb2dNZXNzYWdlLCBsb2dMZXZlbCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYEZhaWxlZCB0byBsb2cgdG8gZmlsZS4gRXJyb3IgJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZm9ybWF0TG9nKGxvZ01lc3NhZ2U6IHN0cmluZywgbGV2ZWw6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYCR7Y2hhbGsuZ3JheShuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpfSAke2NoYWxrW0NPTE9SU1tsZXZlbF1dKGxldmVsLnRvVXBwZXJDYXNlKCkpfSAke2NoYWxrLndoaXRlQnJpZ2h0KCdAd2Rpby9icm93c2Vyc3RhY2stc2VydmljZScpfSAke2xvZ01lc3NhZ2V9XFxuYFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUobWVzc2FnZSwgJ2luZm8nKVxuICAgICAgICBsb2cuaW5mbyhtZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9nVG9GaWxlKG1lc3NhZ2UsICdlcnJvcicpXG4gICAgICAgIGxvZy5lcnJvcihtZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBwYXJhbT86IHVua25vd24pIHtcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUobWVzc2FnZSwgJ2RlYnVnJylcbiAgICAgICAgaWYgKHBhcmFtKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcobWVzc2FnZSwgcGFyYW0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cuZGVidWcobWVzc2FnZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgd2FybihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUobWVzc2FnZSwgJ3dhcm4nKVxuICAgICAgICBsb2cud2FybihtZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdHJhY2UobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9nVG9GaWxlKG1lc3NhZ2UsICd0cmFjZScpXG4gICAgICAgIGxvZy50cmFjZShtZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJMb2dnZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ0ZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbS5lbmQoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbSA9IG51bGxcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyTG9nRmlsZSgpIHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5sb2dGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIGZzLnRydW5jYXRlU3luYyh0aGlzLmxvZ0ZpbGVQYXRoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbnN1cmVMb2dzRm9sZGVyKCkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5sb2dGb2xkZXJQYXRoKSl7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5sb2dGb2xkZXJQYXRoKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBUZXN0RnJhbWV3b3JrQ29uc3RhbnRzID0ge1xuICAgIEtFWV9URVNUX1VVSUQ6ICd0ZXN0X3V1aWQnLFxuICAgIEtFWV9URVNUX0lEIDogJ3Rlc3RfaWQnLFxuICAgIEtFWV9URVNUX05BTUUgOiAndGVzdF9uYW1lJyxcbiAgICBLRVlfVEVTVF9GSUxFX1BBVEggOiAndGVzdF9maWxlX3BhdGgnLFxuICAgIEtFWV9URVNUX1RBR1MgOiAndGVzdF90YWdzJyxcbiAgICBLRVlfVEVTVF9SRVNVTFQgOiAndGVzdF9yZXN1bHQnLFxuICAgIEtFWV9URVNUX1JFU1VMVF9BVCA6ICd0ZXN0X3Jlc3VsdF9hdCcsXG4gICAgS0VZX1RFU1RfU1RBUlRFRF9BVCA6ICd0ZXN0X3N0YXJ0ZWRfYXQnLFxuICAgIEtFWV9URVNUX0VOREVEX0FUIDogJ3Rlc3RfZW5kZWRfYXQnLFxuICAgIEtFWV9URVNUX0xPQ0FUSU9OIDogJ3Rlc3RfbG9jYXRpb24nLFxuICAgIEtFWV9URVNUX1NDT1BFIDogJ3Rlc3Rfc2NvcGUnLFxuICAgIEtFWV9URVNUX1NDT1BFUyA6ICd0ZXN0X3Njb3BlcycsXG4gICAgS0VZX1RFU1RfRlJBTUVXT1JLX05BTUUgOiAndGVzdF9mcmFtZXdvcmtfbmFtZScsXG4gICAgS0VZX1RFU1RfRlJBTUVXT1JLX1ZFUlNJT04gOiAndGVzdF9mcmFtZXdvcmtfdmVyc2lvbicsXG4gICAgS0VZX1RFU1RfQ09ERSA6ICd0ZXN0X2NvZGUnLFxuICAgIEtFWV9URVNUX1JFUlVOX05BTUUgOiAndGVzdF9yZXJ1bl9uYW1lJyxcbiAgICBLRVlfUExBVEZPUk1fSU5ERVggOiAncGxhdGZvcm1faW5kZXgnLFxuICAgIEtFWV9URVNUX0ZBSUxVUkUgOiAndGVzdF9mYWlsdXJlJyxcbiAgICBLRVlfVEVTVF9GQUlMVVJFX1RZUEUgOiAndGVzdF9mYWlsdXJlX3R5cGUnLFxuICAgIEtFWV9URVNUX0ZBSUxVUkVfUkVBU09OIDogJ3Rlc3RfZmFpbHVyZV9yZWFzb24nLFxuICAgIEtFWV9URVNUX0xPR1MgOiAndGVzdF9sb2dzJyxcbiAgICBLRVlfVEVTVF9NRVRBIDogJ3Rlc3RfbWV0YScsXG4gICAgS0VZX0NVU1RPTV9UQUdTIDogJ2N1c3RvbV9tZXRhZGF0YScsXG4gICAgS0VZX1RFU1RfREVGRVJSRUQgOiAndGVzdF9kZWZlcnJlZCcsXG4gICAgS0VZX1NFU1NJT05fTkFNRSA6ICd0ZXN0X3Nlc3Npb25fbmFtZScsXG4gICAgS0VZX0FVVE9NQVRFX1NFU1NJT05fTkFNRSA6ICdhdXRvbWF0ZV9zZXNzaW9uX25hbWUnLFxuICAgIEtFWV9BVVRPTUFURV9TRVNTSU9OX1NUQVRVUzogJ2F1dG9tYXRlX3Nlc3Npb25fc3RhdHVzJyxcbiAgICBLRVlfQVVUT01BVEVfU0VTU0lPTl9SRUFTT046ICdhdXRvbWF0ZV9zZXNzaW9uX3JlYXNvbicsXG4gICAgS0VZX0VWRU5UX1NUQVJURURfQVQgOiAnZXZlbnRfc3RhcnRlZF9hdCcsXG4gICAgS0VZX0VWRU5UX0VOREVEX0FUIDogJ2V2ZW50X2VuZGVkX2F0JyxcbiAgICBLRVlfSE9PS19JRCA6ICdob29rX2lkJyxcbiAgICBLRVlfSE9PS19SRVNVTFQgOiAnaG9va19yZXN1bHQnLFxuICAgIEtFWV9IT09LX0xPR1MgOiAnaG9va19sb2dzJyxcbiAgICBLRVlfSE9PS19OQU1FIDogJ2hvb2tfbmFtZScsXG4gICAgS0VZX0hPT0tTX1NUQVJURUQ6ICd0ZXN0X2hvb2tzX3N0YXJ0ZWQnLFxuICAgIEtFWV9IT09LU19GSU5JU0hFRDogJ3Rlc3RfaG9va3NfZmluaXNoZWQnLFxuICAgIERFRkFVTFRfVEVTVF9SRVNVTFQgOiAncGVuZGluZycsXG4gICAgREVGQVVMVF9IT09LX1JFU1VMVCA6ICdwZW5kaW5nJyxcbiAgICBLSU5EX1NDUkVFTlNIT1QgOiAnVEVTVF9TQ1JFRU5TSE9UJyxcbiAgICBLSU5EX0xPRyA6ICdURVNUX0xPRycsXG4gICAgSE9PS19SRUdFWCA6ICdeKEJFRk9SRV98QUZURVJfKScsXG59XG4iLCAiXG5pbXBvcnQgeyBCUk9XU0VSU1RBQ0tfUEVSQ1ksIEJST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZLCBCUk9XU0VSU1RBQ0tfQUNDRVNTSUJJTElUWSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCB0eXBlIEJyb3dzZXJTdGFja0NvbmZpZyBmcm9tICcuLi9jb25maWcuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgeyBpc1RydWUsIGlzTG9hZFRlc3RpbmdTZXNzaW9uIH0gZnJvbSAnLi4vdXRpbC5qcydcblxuaW50ZXJmYWNlIEVycm9yVHlwZSB7XG4gICAga2V5OiBzdHJpbmdcbiAgICBtZXNzYWdlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvcnMge1xuICAgIGVycm9yczogRXJyb3JUeXBlW11cbn1cblxuZXhwb3J0IGNvbnN0IGdldFByb2R1Y3RNYXAgPSAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9PiB7XG4gICAgLy8gTFRTIGdhdGluZzogdW5kZXIgTFRTLCBhdXRvbWF0ZSBpcyBmb3JjZWQgZmFsc2UgKExUUyBidWlsZHMgcm91dGUgdG9cbiAgICAvLyB0aGUgTFRTIGludGVybmFsIGh1Yjsga2VlcGluZyBhdXRvbWF0ZT10cnVlIHRhZ3MgVGVzdEh1YiBzb3VyY2UgYXNcbiAgICAvLyBUTyxBVVQsTFRTIGluc3RlYWQgb2YgVE8sTFRTIFx1MjAxNCBzZWUgcHktc2RrIGVhNTNkOTE0KS4gVGhlIGBsdHNgIGtleVxuICAgIC8vIGl0c2VsZiBpcyBvbmx5IGVtaXR0ZWQgdW5kZXIgTFRTIHNvIG5vbi1MVFMgcGF5bG9hZHMgc3RheSBieXRlLVxuICAgIC8vIGlkZW50aWNhbCB0byB0aGUgcHJlLUxUUy1QUiBzaGFwZSAoYXZvaWRzIHN1cnByaXNpbmcgYW55IGJhY2tlbmQgd2l0aFxuICAgIC8vIHN0cmljdCB1bmtub3duLWtleSB2YWxpZGF0aW9uKS5cbiAgICBjb25zdCBsdHMgPSBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpXG4gICAgY29uc3QgZW50cmllczogW3N0cmluZywgYm9vbGVhbiB8IHVuZGVmaW5lZF1bXSA9IFtcbiAgICAgICAgWydvYnNlcnZhYmlsaXR5JywgY29uZmlnLnRlc3RPYnNlcnZhYmlsaXR5LmVuYWJsZWRdLFxuICAgICAgICBbJ2FjY2Vzc2liaWxpdHknLCAhIWNvbmZpZy5hY2Nlc3NpYmlsaXR5XSxcbiAgICAgICAgWydwZXJjeScsIGNvbmZpZy5wZXJjeV0sXG4gICAgICAgIFsnYXV0b21hdGUnLCBsdHMgPyBmYWxzZSA6IGNvbmZpZy5hdXRvbWF0ZV0sXG4gICAgICAgIFsnYXBwX2F1dG9tYXRlJywgY29uZmlnLmFwcEF1dG9tYXRlXSxcbiAgICBdXG4gICAgaWYgKGx0cykge1xuICAgICAgICBlbnRyaWVzLnB1c2goWydsdHMnLCB0cnVlXSlcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzLmZpbHRlcigoWywgdl0pID0+IHYgIT09IG51bGwpKSBhcyB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUHJvY2Vzc0V2ZW50Rm9yVGVzdGh1YiA9IChldmVudFR5cGU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIC8vIExUUyBzaG9ydC1jaXJjdWl0OiB3aGVuIHJ1bm5pbmcgYXMgYW4gTFRTIGxvYWQgdGVzdCAoQlJPV1NFUlNUQUNLX0xUUz10cnVlXG4gICAgLy8gZm9yIGxvY2FsIHJlcHJvLCBvciBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQgc2V0IGJ5IHRoZSBwb2QpLCBUZXN0SHViXG4gICAgLy8gZXZlbnQgZW1pc3Npb24gbXVzdCBhbHdheXMgZmxvdyByZWdhcmRsZXNzIG9mIHRoZSBvYnNlcnZhYmlsaXR5IC9cbiAgICAvLyBhY2Nlc3NpYmlsaXR5IC8gcGVyY3kgZW52IGZsYWdzLiBQb2QgcnVucyBkbyBleHBvcnRcbiAgICAvLyBCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSwgYnV0IHRoZSBsb2NhbC1yZXBybyBmbGFnIHBhdGggZG9lc24ndFxuICAgIC8vIGd1YXJhbnRlZSBpdCBcdTIwMTQgd2l0aG91dCB0aGlzIHNob3J0LWNpcmN1aXQsIGdldFByb2R1Y3RNYXAgY29ycmVjdGx5XG4gICAgLy8gZW1pdHMgbHRzOiB0cnVlIHdoaWxlIGV2ZXJ5IG9uVGVzdFN0YXJ0IC8gb25UZXN0RW5kIC8gb25Ib29rU3RhcnRcbiAgICAvLyBzaWxlbnRseSBuby1vcHMuIE1pcnJvciBvZiB0aGUgdW5jb25kaXRpb25hbCBMVFMgZXZlbnQgZmxvdyBpbiBweS1zZGsnc1xuICAgIC8vIHNob3VsZF9zZW5kX2V2ZW50X2Zvcl90ZXN0aHViKCkgKFBSICM5OTMpLlxuICAgIGlmIChpc0xvYWRUZXN0aW5nU2Vzc2lvbigpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChpc1RydWUocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAoaXNUcnVlKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19BQ0NFU1NJQklMSVRZXSkpIHtcbiAgICAgICAgcmV0dXJuICEoWydIb29rUnVuU3RhcnRlZCcsICdIb29rUnVuRmluaXNoZWQnLCAnTG9nQ3JlYXRlZCddLmluY2x1ZGVzKGV2ZW50VHlwZSkpXG4gICAgfVxuICAgIGlmIChpc1RydWUocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1BFUkNZXSkgJiYgZXZlbnRUeXBlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBFdmFsdWF0ZSB3aXRoIGlzVHJ1ZSBzbyBhIHByb2R1Y3QgZmxhZyBleHBsaWNpdGx5IHNldCB0byB0aGUgc3RyaW5nICdmYWxzZSdcbiAgICAvLyAoZS5nLiBvYnNlcnZhYmlsaXR5IHR1cm5lZCBvZmYgYWZ0ZXIgYSBmYWlsZWQvYmxvY2tlZCBidWlsZC1zdGFydCkgcmVhZHMgYXNcbiAgICAvLyBvZmYuIFJhdyBCb29sZWFuKCdmYWxzZScpIGlzIHRydXRoeSwgd2hpY2gga2VwdCBldmVudHMgZmxvd2luZyBmb3IgYW5cbiAgICAvLyBvYnNlcnZhYmlsaXR5LW9ubHkgc2Vzc2lvbiBldmVuIGFmdGVyIHRoZSBmbGFnIHdhcyBkaXNhYmxlZC5cbiAgICByZXR1cm4gaXNUcnVlKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19BQ0NFU1NJQklMSVRZXSkgfHwgaXNUcnVlKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSkgfHwgaXNUcnVlKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19QRVJDWV0pXG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVFcnJvckZvck9ic2VydmFiaWxpdHkgPSAoZXJyb3I6IEVycm9ycyB8IG51bGwpOiB2b2lkID0+IHtcbiAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWV0gPSAnZmFsc2UnXG4gICAgbG9nQnVpbGRFcnJvcihlcnJvciwgJ1Rlc3QgUmVwb3J0aW5nIGFuZCBBbmFseXRpY3MnKVxufVxuXG5leHBvcnQgY29uc3QgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5ID0gKGVycm9yOiBFcnJvcnMgfCBudWxsKTogdm9pZCA9PiB7XG4gICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFldID0gJ2ZhbHNlJ1xuICAgIGxvZ0J1aWxkRXJyb3IoZXJyb3IsICdhY2Nlc3NpYmlsaXR5Jylcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ0J1aWxkRXJyb3IgPSAoZXJyb3I6IEVycm9ycyB8IG51bGwsIHByb2R1Y3Q6IHN0cmluZyA9ICcnKTogdm9pZCA9PiB7XG4gICAgaWYgKCFlcnJvciB8fCAhZXJyb3IuZXJyb3JzKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgJHtwcm9kdWN0LnRvVXBwZXJDYXNlKCl9IEJ1aWxkIGNyZWF0aW9uIGZhaWxlZCAke2Vycm9yIX1gKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVycm9ySnNvbiBvZiBlcnJvci5lcnJvcnMpIHtcbiAgICAgICAgY29uc3QgZXJyb3JUeXBlID0gZXJyb3JKc29uLmtleVxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvckpzb24ubWVzc2FnZVxuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVycm9yVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnRVJST1JfSU5WQUxJRF9DUkVERU5USUFMUyc6XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSAnRVJST1JfQUNDRVNTX0RFTklFRCc6XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlICdFUlJPUl9TREtfREVQUkVDQVRFRCc6XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UHJvZHVjdE1hcEZvckJ1aWxkU3RhcnRDYWxsID0gKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbj86IGJvb2xlYW4gfCBudWxsKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPT4ge1xuICAgIC8vIExUUyBnYXRpbmc6IHVuZGVyIExUUywgYXV0b21hdGUgaXMgZm9yY2VkIGZhbHNlIChMVFMgYnVpbGRzIHJvdXRlIHRvXG4gICAgLy8gdGhlIExUUyBpbnRlcm5hbCBodWI7IGtlZXBpbmcgYXV0b21hdGU9dHJ1ZSB0YWdzIFRlc3RIdWIgc291cmNlIGFzXG4gICAgLy8gVE8sQVVULExUUyBpbnN0ZWFkIG9mIFRPLExUUyBcdTIwMTQgc2VlIHB5LXNkayBlYTUzZDkxNCkuIFRoZSBgbHRzYCBrZXlcbiAgICAvLyBpdHNlbGYgaXMgb25seSBlbWl0dGVkIHVuZGVyIExUUyB0byBrZWVwIG5vbi1MVFMgcGF5bG9hZHMgYnl0ZS1cbiAgICAvLyBpZGVudGljYWwgdG8gdGhlIHByZS1MVFMtUFIgc2hhcGUuXG4gICAgY29uc3QgbHRzID0gaXNMb2FkVGVzdGluZ1Nlc3Npb24oKVxuICAgIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsXVtdID0gW1xuICAgICAgICBbJ29ic2VydmFiaWxpdHknLCBjb25maWcudGVzdE9ic2VydmFiaWxpdHkuZW5hYmxlZF0sXG4gICAgICAgIFsnYWNjZXNzaWJpbGl0eScsIGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uXSxcbiAgICAgICAgWydwZXJjeScsIGNvbmZpZy5wZXJjeV0sXG4gICAgICAgIFsnYXV0b21hdGUnLCBsdHMgPyBmYWxzZSA6IGNvbmZpZy5hdXRvbWF0ZV0sXG4gICAgICAgIFsnYXBwX2F1dG9tYXRlJywgY29uZmlnLmFwcEF1dG9tYXRlXSxcbiAgICBdXG4gICAgaWYgKGx0cykge1xuICAgICAgICBlbnRyaWVzLnB1c2goWydsdHMnLCB0cnVlXSlcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzLmZpbHRlcigoWywgdl0pID0+IHYgIT09IG51bGwpKSBhcyB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfVxufVxuIiwgImltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuXG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tICdAd2Rpby90eXBlcydcblxuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHsgaXNWYWxpZEVuYWJsZWRWYWx1ZSB9IGZyb20gJy4uL3V0aWwuanMnXG5pbXBvcnQgeyBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCwgU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfT05MWSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcblxuY29uc3QgUlVOX1NNQVJUX1NFTEVDVElPTiA9ICdydW5TbWFydFNlbGVjdGlvbidcblxuY29uc3QgQUxMT1dFRF9PUkNIRVNUUkFUSU9OX0tFWVMgPSBbXG4gICAgUlVOX1NNQVJUX1NFTEVDVElPTlxuXVxuXG50eXBlIFNtYXJ0U2VsZWN0aW9uUmVwb0luZm8gPSB7XG4gICAgdXJsPzogc3RyaW5nXG4gICAgZmVhdHVyZUJyYW5jaD86IHN0cmluZ1xuICAgIGJhc2VCcmFuY2g/OiBzdHJpbmdcbiAgICBuYW1lPzogc3RyaW5nXG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG50eXBlIFNtYXJ0U2VsZWN0aW9uU291cmNlID0gc3RyaW5nW10gfCBTbWFydFNlbGVjdGlvblJlcG9JbmZvW10gfCBudWxsXG5cbnR5cGUgUnVuU21hcnRTZWxlY3Rpb25Db25maWcgPSB7XG4gICAgZW5hYmxlZD86IGJvb2xlYW4gfCBzdHJpbmdcbiAgICBtb2RlPzogc3RyaW5nXG4gICAgc291cmNlPzogc3RyaW5nIHwgc3RyaW5nW10gfCBTbWFydFNlbGVjdGlvblJlcG9JbmZvW10gfCBudWxsXG59XG5cbmNvbnN0IGlzUGxhaW5PYmplY3QgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbilcblxuY29uc3QgYXNTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQ2xhc3MgdG8gaGFuZGxlIHRlc3Qgb3JkZXJpbmcgZnVuY3Rpb25hbGl0eVxuICovXG5jbGFzcyBUZXN0T3JkZXJpbmcge1xuICAgIHByaXZhdGUgZW5hYmxlZDogYm9vbGVhblxuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nIHwgbnVsbFxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMubmFtZSA9IG51bGxcbiAgICB9XG5cbiAgICBlbmFibGUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIH1cblxuICAgIGRpc2FibGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMubmFtZSA9IG51bGxcbiAgICB9XG5cbiAgICBnZXRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVkXG4gICAgfVxuXG4gICAgZ2V0TmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZVxuICAgIH1cbn1cblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIGZvciB0ZXN0IG9yY2hlc3RyYXRpb25cbiAqL1xudHlwZSBPcmNoZXN0cmF0aW9uQ29uZmlnID0gT3B0aW9ucy5UZXN0cnVubmVyIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuZXhwb3J0IGNsYXNzIE9yY2hlc3RyYXRpb25VdGlscyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBPcmNoZXN0cmF0aW9uVXRpbHMgfCBudWxsID0gbnVsbFxuICAgIHByaXZhdGUgcnVuU21hcnRTZWxlY3Rpb246IGJvb2xlYW5cbiAgICBwcml2YXRlIHNtYXJ0U2VsZWN0aW9uTW9kZTogc3RyaW5nXG4gICAgcHJpdmF0ZSB0ZXN0T3JkZXJpbmc6IFRlc3RPcmRlcmluZ1xuICAgIHByaXZhdGUgc21hcnRTZWxlY3Rpb25Tb3VyY2U6IFNtYXJ0U2VsZWN0aW9uU291cmNlXG4gICAgcHJpdmF0ZSBwcm9qZWN0TmFtZT86IHN0cmluZ1xuICAgIHByaXZhdGUgYnVpbGROYW1lPzogc3RyaW5nXG4gICAgcHJpdmF0ZSBidWlsZElkZW50aWZpZXI/OiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb25maWcgQ29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IE9yY2hlc3RyYXRpb25Db25maWcpIHtcbiAgICAgICAgdGhpcy5ydW5TbWFydFNlbGVjdGlvbiA9IGZhbHNlXG4gICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Nb2RlID0gU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1RcbiAgICAgICAgdGhpcy50ZXN0T3JkZXJpbmcgPSBuZXcgVGVzdE9yZGVyaW5nKClcbiAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IG51bGwgLy8gU3RvcmUgc291cmNlIHBhdGhzIGlmIHByb3ZpZGVkXG5cbiAgICAgICAgLy8gQ2hlY2sgYm90aCBwb3NzaWJsZSBjb25maWd1cmF0aW9uIHBhdGhzOiBkaXJlY3Qgb3IgbmVzdGVkIGluIHNlcnZpY2VzXG4gICAgICAgIGNvbnN0IGNvbmZpZ1JlY29yZCA9IGlzUGxhaW5PYmplY3QoY29uZmlnKSA/IGNvbmZpZyA6IHt9XG4gICAgICAgIGxldCB0ZXN0T3JjaE9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gaXNQbGFpbk9iamVjdChjb25maWdSZWNvcmQudGVzdE9yY2hlc3RyYXRpb25PcHRpb25zKVxuICAgICAgICAgICAgPyBjb25maWdSZWNvcmQudGVzdE9yY2hlc3RyYXRpb25PcHRpb25zXG4gICAgICAgICAgICA6IHt9XG5cbiAgICAgICAgLy8gSWYgbm90IGZvdW5kIGF0IHRvcCBsZXZlbCwgY2hlY2sgaWYgaXQncyBpbiB0aGUgYnJvd3NlcnN0YWNrIHNlcnZpY2UgY29uZmlnXG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gQXJyYXkuaXNBcnJheShjb25maWdSZWNvcmQuc2VydmljZXMpID8gY29uZmlnUmVjb3JkLnNlcnZpY2VzIDogdW5kZWZpbmVkXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0ZXN0T3JjaE9wdGlvbnMpLmxlbmd0aCA9PT0gMCAmJiBBcnJheS5pc0FycmF5KHNlcnZpY2VzKSkge1xuICAgICAgICAgICAgLy8gTG9vayBmb3IgYnJvd3NlcnN0YWNrIHNlcnZpY2UgY29uZmlndXJhdGlvblxuICAgICAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHNlcnZpY2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHNlcnZpY2UpICYmXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VbMF0gPT09ICdicm93c2Vyc3RhY2snICYmXG4gICAgICAgICAgICAgICAgICAgIGlzUGxhaW5PYmplY3Qoc2VydmljZVsxXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNQbGFpbk9iamVjdChzZXJ2aWNlWzFdLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9ucylcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdE9yY2hPcHRpb25zID0gc2VydmljZVsxXS50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdbY29uc3RydWN0b3JdIEZvdW5kIHRlc3RPcmNoZXN0cmF0aW9uT3B0aW9ucyBpbiBicm93c2Vyc3RhY2sgc2VydmljZSBjb25maWcnKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyeSB0byBnZXQgcnVuU21hcnRTZWxlY3Rpb24gb3B0aW9uc1xuICAgICAgICBjb25zdCBydW5TbWFydFNlbGVjdGlvbk9wdHM6IFJ1blNtYXJ0U2VsZWN0aW9uQ29uZmlnID0gaXNQbGFpbk9iamVjdCh0ZXN0T3JjaE9wdGlvbnNbUlVOX1NNQVJUX1NFTEVDVElPTl0pXG4gICAgICAgICAgICA/IHRlc3RPcmNoT3B0aW9uc1tSVU5fU01BUlRfU0VMRUNUSU9OXSBhcyBSdW5TbWFydFNlbGVjdGlvbkNvbmZpZ1xuICAgICAgICAgICAgOiB7fVxuXG4gICAgICAgIHRoaXMuX3NldFJ1blNtYXJ0U2VsZWN0aW9uKFxuICAgICAgICAgICAgcnVuU21hcnRTZWxlY3Rpb25PcHRzLmVuYWJsZWQgPz8gZmFsc2UsXG4gICAgICAgICAgICBydW5TbWFydFNlbGVjdGlvbk9wdHMubW9kZSB8fCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCxcbiAgICAgICAgICAgIHJ1blNtYXJ0U2VsZWN0aW9uT3B0cy5zb3VyY2UgPz8gbnVsbFxuICAgICAgICApXG4gICAgICAgIC8vIEV4dHJhY3QgYnVpbGQgZGV0YWlscyBmcm9tIGNhcGFiaWxpdGllc1xuICAgICAgICB0aGlzLl9leHRyYWN0QnVpbGREZXRhaWxzKGNvbmZpZylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IGJ1aWxkIGRldGFpbHMgZnJvbSBjYXBhYmlsaXRpZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIF9leHRyYWN0QnVpbGREZXRhaWxzKGNvbmZpZzogT3JjaGVzdHJhdGlvbkNvbmZpZyk6IHZvaWQge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnUmVjb3JkID0gaXNQbGFpbk9iamVjdChjb25maWcpID8gY29uZmlnIDoge31cbiAgICAgICAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IChjb25maWdSZWNvcmQgYXMgeyBjYXBhYmlsaXRpZXM/OiB1bmtub3duIH0pLmNhcGFiaWxpdGllc1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmZvckVhY2goY2FwYWJpbGl0eSA9PiB0aGlzLl9wYXJzZUNhcGFiaWxpdHkoY2FwYWJpbGl0eSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoY2FwYWJpbGl0aWVzKSkge1xuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBtdWx0aXJlbW90ZSBjYXBhYmlsaXRpZXNcbiAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKGNhcGFiaWxpdGllcykuZm9yRWFjaCgoY2FwcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNQbGFpbk9iamVjdChjYXBzKSAmJiAnY2FwYWJpbGl0aWVzJyBpbiBjYXBzICYmIGlzUGxhaW5PYmplY3QoY2Fwcy5jYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZUNhcGFiaWxpdHkoY2Fwcy5jYXBhYmlsaXRpZXMpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtfZXh0cmFjdEJ1aWxkRGV0YWlsc10gRXh0cmFjdGVkIC0gcHJvamVjdE5hbWU6ICR7dGhpcy5wcm9qZWN0TmFtZX0sIGJ1aWxkTmFtZTogJHt0aGlzLmJ1aWxkTmFtZX0sIGJ1aWxkSWRlbnRpZmllcjogJHt0aGlzLmJ1aWxkSWRlbnRpZmllcn1gKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBbX2V4dHJhY3RCdWlsZERldGFpbHNdICR7ZXJyb3J9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQ2FwYWJpbGl0eShjYXBhYmlsaXR5OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGlmICghaXNQbGFpbk9iamVjdChjYXBhYmlsaXR5KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBic3RhY2tPcHRpb25zUmF3ID0gY2FwYWJpbGl0eVsnYnN0YWNrOm9wdGlvbnMnXVxuXG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KGJzdGFja09wdGlvbnNSYXcpKSB7XG4gICAgICAgICAgICBjb25zdCBidWlsZE5hbWUgPSBhc1N0cmluZyhic3RhY2tPcHRpb25zUmF3LmJ1aWxkTmFtZSlcbiAgICAgICAgICAgIGNvbnN0IHByb2plY3ROYW1lID0gYXNTdHJpbmcoYnN0YWNrT3B0aW9uc1Jhdy5wcm9qZWN0TmFtZSlcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkSWRlbnRpZmllciA9IGFzU3RyaW5nKGJzdGFja09wdGlvbnNSYXcuYnVpbGRJZGVudGlmaWVyKVxuXG4gICAgICAgICAgICBpZiAoYnVpbGROYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZE5hbWUgPSBidWlsZE5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9qZWN0TmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ1aWxkSWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRJZGVudGlmaWVyID0gYnVpbGRJZGVudGlmaWVyXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBsZWdhY3lCdWlsZElkZW50aWZpZXIgPSBhc1N0cmluZyhjYXBhYmlsaXR5Wydicm93c2Vyc3RhY2suYnVpbGRJZGVudGlmaWVyJ10pXG4gICAgICAgICAgICBjb25zdCBsZWdhY3lCdWlsZE5hbWUgPSBhc1N0cmluZyhjYXBhYmlsaXR5LmJ1aWxkKVxuXG4gICAgICAgICAgICBpZiAobGVnYWN5QnVpbGRJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZElkZW50aWZpZXIgPSBsZWdhY3lCdWlsZElkZW50aWZpZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZWdhY3lCdWlsZE5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkTmFtZSA9IGxlZ2FjeUJ1aWxkTmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IG9yIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBPcmNoZXN0cmF0aW9uVXRpbHNcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoY29uZmlnPzogT3JjaGVzdHJhdGlvbkNvbmZpZyk6IE9yY2hlc3RyYXRpb25VdGlscyB8IG51bGwge1xuICAgICAgICBpZiAoIU9yY2hlc3RyYXRpb25VdGlscy5faW5zdGFuY2UgJiYgY29uZmlnKSB7XG4gICAgICAgICAgICBPcmNoZXN0cmF0aW9uVXRpbHMuX2luc3RhbmNlID0gbmV3IE9yY2hlc3RyYXRpb25VdGlscyhjb25maWcpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9yY2hlc3RyYXRpb25VdGlscy5faW5zdGFuY2VcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgb3JjaGVzdHJhdGlvbiBkYXRhIGZyb20gY29uZmlnXG4gICAgICovXG4gICAgc3RhdGljIGdldE9yY2hlc3RyYXRpb25EYXRhKGNvbmZpZzogT3JjaGVzdHJhdGlvbkNvbmZpZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICAgICAgY29uc3QgY29uZmlnUmVjb3JkID0gaXNQbGFpbk9iamVjdChjb25maWcpID8gY29uZmlnIDoge31cbiAgICAgICAgY29uc3Qgb3JjaGVzdHJhdGlvbkRhdGEgPSBpc1BsYWluT2JqZWN0KGNvbmZpZ1JlY29yZC50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnMpXG4gICAgICAgICAgICA/IGNvbmZpZ1JlY29yZC50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnNcbiAgICAgICAgICAgIDoge31cbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMob3JjaGVzdHJhdGlvbkRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgaWYgKEFMTE9XRURfT1JDSEVTVFJBVElPTl9LRVlTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBydW4gc21hcnQgc2VsZWN0aW9uIHNldHRpbmdcbiAgICAgKi9cbiAgICBnZXRSdW5TbWFydFNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuU21hcnRTZWxlY3Rpb25cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc21hcnQgc2VsZWN0aW9uIG1vZGVcbiAgICAgKi9cbiAgICBnZXRTbWFydFNlbGVjdGlvbk1vZGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc21hcnRTZWxlY3Rpb25Nb2RlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNtYXJ0IHNlbGVjdGlvbiBzb3VyY2VcbiAgICAgKi9cbiAgICBnZXRTbWFydFNlbGVjdGlvblNvdXJjZSgpOiBTbWFydFNlbGVjdGlvblNvdXJjZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHByb2plY3QgbmFtZVxuICAgICAqL1xuICAgIGdldFByb2plY3ROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2plY3ROYW1lXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJ1aWxkIG5hbWVcbiAgICAgKi9cbiAgICBnZXRCdWlsZE5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGROYW1lXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJ1aWxkIGlkZW50aWZpZXJcbiAgICAgKi9cbiAgICBnZXRCdWlsZElkZW50aWZpZXIoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRJZGVudGlmaWVyXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGJ1aWxkIGRldGFpbHNcbiAgICAgKi9cbiAgICBzZXRCdWlsZERldGFpbHMocHJvamVjdE5hbWU/OiBzdHJpbmcsIGJ1aWxkTmFtZT86IHN0cmluZywgYnVpbGRJZGVudGlmaWVyPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZVxuICAgICAgICB0aGlzLmJ1aWxkTmFtZSA9IGJ1aWxkTmFtZVxuICAgICAgICB0aGlzLmJ1aWxkSWRlbnRpZmllciA9IGJ1aWxkSWRlbnRpZmllclxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtzZXRCdWlsZERldGFpbHNdIFNldCAtIHByb2plY3ROYW1lOiAke3RoaXMucHJvamVjdE5hbWV9LCBidWlsZE5hbWU6ICR7dGhpcy5idWlsZE5hbWV9LCBidWlsZElkZW50aWZpZXI6ICR7dGhpcy5idWlsZElkZW50aWZpZXJ9YClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcnVuIHNtYXJ0IHNlbGVjdGlvblxuICAgICAqL1xuICAgIHByaXZhdGUgX3NldFJ1blNtYXJ0U2VsZWN0aW9uKGVuYWJsZWQ6IGJvb2xlYW4gfCBzdHJpbmcsIG1vZGU6IHN0cmluZywgc291cmNlOiBzdHJpbmdbXSB8IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXSB8IHN0cmluZyB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBQcm9wZXJseSB2YWxpZGF0ZSBlbmFibGVkIHZhbHVlIC0gb25seSBhY2NlcHQgdHJ1ZSBib29sZWFuIG9yIHN0cmluZyBcInRydWVcIlxuICAgICAgICAgICAgdGhpcy5ydW5TbWFydFNlbGVjdGlvbiA9IGlzVmFsaWRFbmFibGVkVmFsdWUoZW5hYmxlZClcbiAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Nb2RlID0gbW9kZVxuICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IFtdXG5cbiAgICAgICAgICAgIC8vIExvZyB0aGUgY29uZmlndXJhdGlvbiBmb3IgZGVidWdnaW5nXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFNldHRpbmcgcnVuU21hcnRTZWxlY3Rpb246IGVuYWJsZWQ9JHt0aGlzLnJ1blNtYXJ0U2VsZWN0aW9ufSwgbW9kZT0ke3RoaXMuc21hcnRTZWxlY3Rpb25Nb2RlfWApXG4gICAgICAgICAgICBpZiAodGhpcy5ydW5TbWFydFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIE1vZGUgdmFsaWRhdGlvbiAtIG9ubHkgd2hlbiBzbWFydCBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkTW9kZXMgPSBbU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1QsIFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX09OTFldXG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZE1vZGVzLmluY2x1ZGVzKHRoaXMuc21hcnRTZWxlY3Rpb25Nb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgSW52YWxpZCBzbWFydCBzZWxlY3Rpb24gbW9kZSAnJHt0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZX0nIHByb3ZpZGVkLiBEZWZhdWx0aW5nIHRvICcke1NNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNUfScuYClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvbk1vZGUgPSBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2UgPSBudWxsXG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnTm8gc291cmNlIHByb3ZpZGVkIGZvciBzbWFydCBzZWxlY3Rpb247IGRlZmF1bHRpbmcgdG8gbnVsbC4nKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2UgPSBzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTbWFydCBzZWxlY3Rpb24gc291cmNlIHNldCB0byBhcnJheTogJHtKU09OLnN0cmluZ2lmeShzb3VyY2UpfWApXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJyAmJiBzb3VyY2UuZW5kc1dpdGgoJy5qc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IHRoaXMuX2xvYWRTb3VyY2VGcm9tRmlsZShzb3VyY2UpIHx8IFtdXG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgU21hcnQgc2VsZWN0aW9uIHNvdXJjZSBsb2FkZWQgZnJvbSBmaWxlOiAke3NvdXJjZX1gKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRUZXN0T3JkZXJpbmcoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFtfc2V0UnVuU21hcnRTZWxlY3Rpb25dICR7ZX1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgSlNPTiBzb3VyY2UgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBmb3JtYXQgaXQgZm9yIHNtYXJ0IHNlbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlUGF0aCAtIFBhdGggdG8gdGhlIEpTT04gY29uZmlndXJhdGlvbiBmaWxlXG4gICAgICogQHJldHVybnMgRm9ybWF0dGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uc1xuICAgICAqL1xuICAgIHByaXZhdGUgX2xvYWRTb3VyY2VGcm9tRmlsZShmaWxlUGF0aDogc3RyaW5nKTogU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBTb3VyY2UgZmlsZSAnJHtmaWxlUGF0aH0nIGRvZXMgbm90IGV4aXN0LmApXG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXRhOiB1bmtub3duID0gbnVsbFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JylcbiAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBwYXJzaW5nIEpTT04gZnJvbSBzb3VyY2UgZmlsZSAnJHtmaWxlUGF0aH0nOiAke21lc3NhZ2V9YClcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FjaGUgZmVhdHVyZSBicmFuY2ggbWFwcGluZ3MgZnJvbSBlbnYgdG8gYXZvaWQgcmVwZWF0ZWQgcGFyc2luZ1xuICAgICAgICBsZXQgZmVhdHVyZUJyYW5jaEVudk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgY29uc3QgbG9hZEZlYXR1cmVCcmFuY2hNYXBzID0gKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4ge1xuICAgICAgICAgICAgY29uc3QgZW52VmFyID0gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX09SQ0hFU1RSQVRJT05fU01BUlRfU0VMRUNUSU9OX0ZFQVRVUkVfQlJBTkNIRVMgfHwgJydcbiAgICAgICAgICAgIGxldCBlbnZNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGVudk1hcCA9IGVudlZhci5zdGFydHNXaXRoKCd7JykgJiYgZW52VmFyLmVuZHNXaXRoKCd9JylcbiAgICAgICAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKGVudlZhcilcbiAgICAgICAgICAgICAgICAgICAgOiBlbnZWYXIuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0uaW5jbHVkZXMoJzonKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKGFjYzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgaXRlbTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gaXRlbS5zcGxpdCgnOicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nba2V5LnRyaW0oKV0gPSB2YWx1ZS50cmltKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgcGFyc2luZyBmZWF0dXJlIGJyYW5jaCBtYXBwaW5nczogJHtlcnJvcn1gKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEZlYXR1cmUgYnJhbmNoIG1hcHBpbmdzIGZyb20gZW52OiAke0pTT04uc3RyaW5naWZ5KGVudk1hcCl9YClcbiAgICAgICAgICAgIHJldHVybiBlbnZNYXBcbiAgICAgICAgfVxuXG4gICAgICAgIGZlYXR1cmVCcmFuY2hFbnZNYXAgPSBsb2FkRmVhdHVyZUJyYW5jaE1hcHMoKVxuXG4gICAgICAgIGNvbnN0IGdldEZlYXR1cmVCcmFuY2ggPSAobmFtZTogc3RyaW5nLCByZXBvSW5mbzogU21hcnRTZWxlY3Rpb25SZXBvSW5mbyk6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgICAgICAgICAgLy8gMS4gQ2hlY2sgaW4gZW52aXJvbm1lbnQgdmFyaWFibGUgbWFwXG4gICAgICAgICAgICBpZiAoZmVhdHVyZUJyYW5jaEVudk1hcCAmJiBmZWF0dXJlQnJhbmNoRW52TWFwW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVCcmFuY2hFbnZNYXBbbmFtZV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDIuIENoZWNrIGluIHJlcG9faW5mb1xuICAgICAgICAgICAgaWYgKHJlcG9JbmZvLmZlYXR1cmVCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwb0luZm8uZmVhdHVyZUJyYW5jaFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgZGF0YSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0YTogU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdID0gW11cbiAgICAgICAgICAgIGNvbnN0IG5hbWVQYXR0ZXJuID0gL15bQS1aMC05X10rJC9cblxuICAgICAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgcmVwb0luZm9dIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KHJlcG9JbmZvKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUmVwb0luZm8gPSByZXBvSW5mbyBhcyBTbWFydFNlbGVjdGlvblJlcG9JbmZvXG5cbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHVybCBpcyBhIHN0cmluZyBhbmQgaXMgcHJlc2VudFxuICAgICAgICAgICAgICAgIGlmICghdHlwZWRSZXBvSW5mby51cmwgfHwgdHlwZW9mIHR5cGVkUmVwb0luZm8udXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgUmVwb3NpdG9yeSBVUkwgaXMgbWlzc2luZyBvciBpbnZhbGlkIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgYmFzZUJyYW5jaCwgaWYgcHJvdmlkZWQsIGlzIGEgc3RyaW5nXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVkUmVwb0luZm8uYmFzZUJyYW5jaCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0eXBlZFJlcG9JbmZvLmJhc2VCcmFuY2ggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBCYXNlIGJyYW5jaCBtdXN0IGJlIGEgc3RyaW5nIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgZmVhdHVyZUJyYW5jaCwgaWYgcHJvdmlkZWQsIGlzIGEgc3RyaW5nXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVkUmVwb0luZm8uZmVhdHVyZUJyYW5jaCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0eXBlZFJlcG9JbmZvLmZlYXR1cmVCcmFuY2ggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBGZWF0dXJlIGJyYW5jaCBtdXN0IGJlIGEgc3RyaW5nIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIG5hbWVcbiAgICAgICAgICAgICAgICBpZiAoIW5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEludmFsaWQgc291cmNlIGlkZW50aWZpZXIgZm9ybWF0IGZvciAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgbGVuZ3RoXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUubGVuZ3RoID4gMzAgfHwgbmFtZS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBTb3VyY2UgaWRlbnRpZmllciAnJHtuYW1lfScgbXVzdCBoYXZlIGEgbGVuZ3RoIGJldHdlZW4gMSBhbmQgMzAgY2hhcmFjdGVycy5gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgdXJsLCBiYXNlQnJhbmNoLCBhbmQgZmVhdHVyZUJyYW5jaCAtIGlnbm9yZSBhbGwgb3RoZXIga2V5c1xuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVCcmFuY2ggPSBnZXRGZWF0dXJlQnJhbmNoKG5hbWUsIHR5cGVkUmVwb0luZm8pXG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFJlcG9JbmZvOiBTbWFydFNlbGVjdGlvblJlcG9JbmZvID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHR5cGVkUmVwb0luZm8udXJsLFxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlQnJhbmNoOiBmZWF0dXJlQnJhbmNoID8/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE9ubHkgYWRkIGJhc2VCcmFuY2ggaWYgaXQncyBwcm92aWRlZFxuICAgICAgICAgICAgICAgIGlmICh0eXBlZFJlcG9JbmZvLmJhc2VCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRSZXBvSW5mby5iYXNlQnJhbmNoID0gdHlwZWRSZXBvSW5mby5iYXNlQnJhbmNoXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJlZFJlcG9JbmZvLmZlYXR1cmVCcmFuY2ggfHwgZmlsdGVyZWRSZXBvSW5mby5mZWF0dXJlQnJhbmNoID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgRmVhdHVyZSBicmFuY2ggbm90IHNwZWNpZmllZCBmb3Igc291cmNlICcke25hbWV9JzogJHtKU09OLnN0cmluZ2lmeShyZXBvSW5mbyl9YClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRSZXBvSW5mby5iYXNlQnJhbmNoICYmIGZpbHRlcmVkUmVwb0luZm8uYmFzZUJyYW5jaCA9PT0gZmlsdGVyZWRSZXBvSW5mby5mZWF0dXJlQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBGZWF0dXJlIGJyYW5jaCBhbmQgYmFzZSBicmFuY2ggY2Fubm90IGJlIHRoZSBzYW1lIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvcm1hdHRlZERhdGEucHVzaChmaWx0ZXJlZFJlcG9JbmZvKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0dGVkRGF0YVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLmZpbHRlcihpc1BsYWluT2JqZWN0KSBhcyBTbWFydFNlbGVjdGlvblJlcG9JbmZvW11cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0ZXN0IG9yZGVyaW5nIGJhc2VkIG9uIHByaW9yaXRpZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXRUZXN0T3JkZXJpbmcoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnJ1blNtYXJ0U2VsZWN0aW9uKSB7IC8vIEhpZ2hlc3QgcHJpb3JpdHlcbiAgICAgICAgICAgIHRoaXMudGVzdE9yZGVyaW5nLmVuYWJsZShSVU5fU01BUlRfU0VMRUNUSU9OKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50ZXN0T3JkZXJpbmcuZGlzYWJsZSgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0ZXN0IG9yZGVyaW5nIGlzIGVuYWJsZWRcbiAgICAgKi9cbiAgICB0ZXN0T3JkZXJpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXN0T3JkZXJpbmcuZ2V0RW5hYmxlZCgpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRlc3Qgb3JkZXJpbmcgbmFtZVxuICAgICAqL1xuICAgIGdldFRlc3RPcmRlcmluZ05hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RPcmRlcmluZy5nZXRFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlc3RPcmRlcmluZy5nZXROYW1lKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0ZXN0IG9yY2hlc3RyYXRpb24gbWV0YWRhdGFcbiAgICAgKi9cbiAgICBnZXRUZXN0T3JjaGVzdHJhdGlvbk1ldGFkYXRhKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgICdydW5fc21hcnRfc2VsZWN0aW9uJzoge1xuICAgICAgICAgICAgICAgICdlbmFibGVkJzogdGhpcy5nZXRSdW5TbWFydFNlbGVjdGlvbigpLFxuICAgICAgICAgICAgICAgICdtb2RlJzogdGhpcy5nZXRTbWFydFNlbGVjdGlvbk1vZGUoKSxcbiAgICAgICAgICAgICAgICAnc291cmNlJzogdGhpcy5nZXRTbWFydFNlbGVjdGlvblNvdXJjZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYnVpbGQgc3RhcnQgZGF0YVxuICAgICAqL1xuICAgIGdldEJ1aWxkU3RhcnREYXRhKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJ1bl9zbWFydF9zZWxlY3Rpb246IHtcbiAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLmdldFJ1blNtYXJ0U2VsZWN0aW9uKCksXG4gICAgICAgICAgICAgICAgbW9kZTogdGhpcy5nZXRTbWFydFNlbGVjdGlvbk1vZGUoKVxuICAgICAgICAgICAgICAgIC8vIE5vdCBzZW5kaW5nIFwic291cmNlXCIgdG8gVEggYnVpbGRzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE9yY2hlc3RyYXRpb25VdGlsc1xuIiwgImltcG9ydCB0eXBlIHsgQ2FwYWJpbGl0aWVzLCBPcHRpb25zIH0gZnJvbSAnQHdkaW8vdHlwZXMnXG5cbmltcG9ydCB7IEJTVEFDS19TRVJWSUNFX1ZFUlNJT04sIEJST1dTRVJTVEFDS19URVNUSFVCX1VVSUQsIFdESU9fTkFNSU5HX1BSRUZJWCB9IGZyb20gJy4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHR5cGUgeyBCcm93c2Vyc3RhY2tDb25maWcsIENyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQsIFVzZXJDb25maWdmb3JSZXBvcnRpbmcgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgREVGQVVMVF9SRVFVRVNUX0NPTkZJRywgZ2V0T2JzZXJ2YWJpbGl0eUtleSwgZ2V0T2JzZXJ2YWJpbGl0eVVzZXIgfSBmcm9tICcuL3V0aWwuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuL2NsaS9hcGlVdGlscy5qcydcblxuaW1wb3J0IHsgX2ZldGNoIGFzIGZldGNoIH0gZnJvbSAnLi9mZXRjaFdyYXBwZXIuanMnXG5cbnR5cGUgRGljdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENyYXNoUmVwb3J0ZXIge1xuICAgIC8qIFVzZXIgdGVzdCBjb25maWcgZm9yIGJ1aWxkIHJ1biBtaW51cyBQSUkgKi9cbiAgICBwdWJsaWMgc3RhdGljIHVzZXJDb25maWdGb3JSZXBvcnRpbmc6IFVzZXJDb25maWdmb3JSZXBvcnRpbmcgPSB7fVxuICAgIC8qIFVzZXIgY3JlZGVudGlhbHMgdXNlZCBmb3IgcmVwb3J0aW5nIGNyYXNoZXMgaW4gYnJvd3NlcnN0YWNrIHNlcnZpY2UgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBjcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkOiBDcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkID0ge31cblxuICAgIHN0YXRpYyBzZXRDcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkID0ge1xuICAgICAgICAgICAgdXNlcm5hbWU6IGdldE9ic2VydmFiaWxpdHlVc2VyKG9wdGlvbnMsIGNvbmZpZyksXG4gICAgICAgICAgICBwYXNzd29yZDogZ2V0T2JzZXJ2YWJpbGl0eUtleShvcHRpb25zLCBjb25maWcpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzcy5lbnYuQ1JFREVOVElBTFNfRk9SX0NSQVNIX1JFUE9SVElORyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZClcbiAgICB9XG5cbiAgICBzdGF0aWMgc2V0Q29uZmlnRGV0YWlscyh1c2VyQ29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsIGNhcGFiaWxpdGllczogQ2FwYWJpbGl0aWVzLlRlc3RydW5uZXJDYXBhYmlsaXRpZXMsIG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgICAgICBjb25zdCBjb25maWdXaXRob3V0UElJID0gdGhpcy5maWx0ZXJQSUkodXNlckNvbmZpZylcbiAgICAgICAgY29uc3QgZmlsdGVyZWRDYXBhYmlsaXRpZXMgPSB0aGlzLmZpbHRlckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMpXG4gICAgICAgIHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZyA9IHtcbiAgICAgICAgICAgIGZyYW1ld29yazogdXNlckNvbmZpZy5mcmFtZXdvcmssXG4gICAgICAgICAgICBzZXJ2aWNlczogY29uZmlnV2l0aG91dFBJSS5zZXJ2aWNlcyxcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogZmlsdGVyZWRDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgICAnQlJPV1NFUlNUQUNLX0JVSUxEJzogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0JVSUxELFxuICAgICAgICAgICAgICAgICdCUk9XU0VSU1RBQ0tfQlVJTERfTkFNRSc6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19CVUlMRF9OQU1FLFxuICAgICAgICAgICAgICAgICdCVUlMRF9UQUcnOiBwcm9jZXNzLmVudi5CVUlMRF9UQUdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzLmVudi5VU0VSX0NPTkZJR19GT1JfUkVQT1JUSU5HID0gSlNPTi5zdHJpbmdpZnkodGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nKVxuICAgICAgICB0aGlzLnNldENyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQob3B0aW9ucywgdXNlckNvbmZpZylcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgdXBsb2FkQ3Jhc2hSZXBvcnQoZXhjZXB0aW9uOiBzdHJpbmcsIHN0YWNrVHJhY2U6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQudXNlcm5hbWUgfHwgIXRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC5wYXNzd29yZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZCA9IHByb2Nlc3MuZW52LkNSRURFTlRJQUxTX0ZPUl9DUkFTSF9SRVBPUlRJTkcgIT09IHVuZGVmaW5lZCA/IEpTT04ucGFyc2UocHJvY2Vzcy5lbnYuQ1JFREVOVElBTFNfRk9SX0NSQVNIX1JFUE9SVElORykgOiB0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBCU3RhY2tMb2dnZXIuZXJyb3IoYFtDcmFzaF9SZXBvcnRfVXBsb2FkXSBGYWlsZWQgdG8gcGFyc2UgdXNlciBjcmVkZW50aWFscyB3aGlsZSByZXBvcnRpbmcgY3Jhc2ggZHVlIHRvICR7ZXJyb3J9YClcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC51c2VybmFtZSB8fCAhdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnBhc3N3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gQlN0YWNrTG9nZ2VyLmVycm9yKCdbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIHRvIHBhcnNlIHVzZXIgY3JlZGVudGlhbHMgd2hpbGUgcmVwb3J0aW5nIGNyYXNoJylcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcgPSBwcm9jZXNzLmVudi5VU0VSX0NPTkZJR19GT1JfUkVQT1JUSU5HICE9PSB1bmRlZmluZWQgPyBKU09OLnBhcnNlKHByb2Nlc3MuZW52LlVTRVJfQ09ORklHX0ZPUl9SRVBPUlRJTkcpIDoge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgW0NyYXNoX1JlcG9ydF9VcGxvYWRdIEZhaWxlZCB0byBwYXJzZSB1c2VyIGNvbmZpZyB3aGlsZSByZXBvcnRpbmcgY3Jhc2ggZHVlIHRvICR7ZXJyb3J9YClcbiAgICAgICAgICAgIHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZyA9IHt9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgaGFzaGVkX2lkOiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXSxcbiAgICAgICAgICAgIG9ic2VydmFiaWxpdHlfdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIGZyYW1ld29ya05hbWU6IFdESU9fTkFNSU5HX1BSRUZJWCArICh0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcuZnJhbWV3b3JrIHx8ICdudWxsJyksXG4gICAgICAgICAgICAgICAgc2RrVmVyc2lvbjogQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4Y2VwdGlvbjoge1xuICAgICAgICAgICAgICAgIGVycm9yOiBleGNlcHRpb24udG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBzdGFja1RyYWNlOiBzdGFja1RyYWNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlnOiB0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmdcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElVdGlscy5EQVRBX0VORFBPSU5UfS9hcGkvdjEvYW5hbHl0aWNzYFxuXG4gICAgICAgIGNvbnN0IGVuY29kZWRBdXRoID0gQnVmZmVyLmZyb20oYCR7dGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnVzZXJuYW1lfToke3RoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC5wYXNzd29yZH1gLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgLi4uREVGQVVMVF9SRVFVRVNUX0NPTkZJRy5oZWFkZXJzLFxuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7ZW5jb2RlZEF1dGh9YCxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgbGV0IGJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KClcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UoYm9keSkpXG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBSZXNwb25zZSBpcyBub3QgSlNPTiwgdXNlIHRleHQgYXMtaXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW0NyYXNoX1JlcG9ydF9VcGxvYWRdIFN1Y2Nlc3MgcmVzcG9uc2U6ICR7Ym9keX1gKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIGR1ZSB0byAke3Jlc3BvbnNlLmJvZHl9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyByZWN1cnNpdmVseVJlZGFjdEtleXNGcm9tT2JqZWN0KG9iajogRGljdCB8IEFycmF5PERpY3Q+LCBrZXlzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgb2JqLm1hcChlbGUgPT4gdGhpcy5yZWN1cnNpdmVseVJlZGFjdEtleXNGcm9tT2JqZWN0KGVsZSwga2V5cykpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleXMuaW5jbHVkZXMocHJvcC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICBvYmpbcHJvcF0gPSAnW1JFREFDVEVEXSdcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpbcHJvcF0gPT09ICdvYmplY3QnICYmIG9ialtwcm9wXSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3Qob2JqW3Byb3BdIGFzIERpY3QgfCBBcnJheTxEaWN0Piwga2V5cylcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpbcHJvcF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKG9ialtwcm9wXSBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcgJiYgcGFyc2VkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN1cnNpdmVseVJlZGFjdEtleXNGcm9tT2JqZWN0KHBhcnNlZCBhcyBEaWN0IHwgQXJyYXk8RGljdD4sIGtleXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqW3Byb3BdID0gSlNPTi5zdHJpbmdpZnkocGFyc2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCB2YWxpZCBKU09OLCBsZWF2ZSBhcy1pc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGRlbGV0ZVBJSUtleXNGcm9tT2JqZWN0KG9iajogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pIHtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIFsndXNlcicsICd1c2VybmFtZScsICdrZXknLCAnYWNjZXNzS2V5J10uZm9yRWFjaChrZXkgPT4gZGVsZXRlIG9ialtrZXldKVxuICAgIH1cblxuICAgIHN0YXRpYyBmaWx0ZXJDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXRpZXMuVGVzdHJ1bm5lckNhcGFiaWxpdGllcykge1xuICAgICAgICBjb25zdCBjYXBzQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY2FwYWJpbGl0aWVzKSlcbiAgICAgICAgdGhpcy5yZWN1cnNpdmVseVJlZGFjdEtleXNGcm9tT2JqZWN0KGNhcHNDb3B5LCBbJ2V4dGVuc2lvbnMnXSlcbiAgICAgICAgcmV0dXJuIGNhcHNDb3B5XG4gICAgfVxuXG4gICAgc3RhdGljIGZpbHRlclBJSSh1c2VyQ29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICAgICAgY29uc3QgY29uZmlnV2l0aG91dFBJSSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodXNlckNvbmZpZykpXG4gICAgICAgIHRoaXMuZGVsZXRlUElJS2V5c0Zyb21PYmplY3QoY29uZmlnV2l0aG91dFBJSSlcbiAgICAgICAgY29uc3QgZmluYWxTZXJ2aWNlcyA9IFtdXG4gICAgICAgIGNvbnN0IGluaXRpYWxTZXJ2aWNlcyA9IGNvbmZpZ1dpdGhvdXRQSUkuc2VydmljZXNcbiAgICAgICAgZGVsZXRlIGNvbmZpZ1dpdGhvdXRQSUkuc2VydmljZXNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VydmljZUFycmF5IG9mIGluaXRpYWxTZXJ2aWNlcykge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlcnZpY2VBcnJheSkgJiYgc2VydmljZUFycmF5Lmxlbmd0aCA+PSAyICYmIHNlcnZpY2VBcnJheVswXSA9PT0gJ2Jyb3dzZXJzdGFjaycpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMTsgaWR4IDwgc2VydmljZUFycmF5Lmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlUElJS2V5c0Zyb21PYmplY3Qoc2VydmljZUFycmF5W2lkeF0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZUFycmF5W2lkeF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYm90aCBuZXcgdGVzdFJlcG9ydGluZ09wdGlvbnMgYW5kIGxlZ2FjeSB0ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVBJSUtleXNGcm9tT2JqZWN0KHNlcnZpY2VBcnJheVtpZHhdLnRlc3RSZXBvcnRpbmdPcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlUElJS2V5c0Zyb21PYmplY3Qoc2VydmljZUFycmF5W2lkeF0udGVzdE9ic2VydmFiaWxpdHlPcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsU2VydmljZXMucHVzaChzZXJ2aWNlQXJyYXkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8qIFdyb25nIGNvbmZpZ3VyYXRpb24gbGlrZSBzdHJpbmdzIGluc3RlYWQgb2YganNvbiBvYmplY3RzIGNvdWxkIGJyZWFrIHRoaXMgbWV0aG9kLCBuZWVkcyBubyBhY3Rpb24gKi9cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGFyc2luZyB1c2VyIGNvbmZpZyBQSUkgd2l0aCBlcnJvciAke2VyciA/ICgoZXJyIGFzIEVycm9yKS5zdGFjayB8fCBlcnIpIDogZXJyfWApXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnV2l0aG91dFBJSVxuICAgICAgICB9XG4gICAgICAgIGNvbmZpZ1dpdGhvdXRQSUkuc2VydmljZXMgPSBmaW5hbFNlcnZpY2VzXG4gICAgICAgIHJldHVybiBjb25maWdXaXRob3V0UElJXG4gICAgfVxufVxuIiwgImltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB0eXBlIHsgRmVhdHVyZVN0YXRzT3ZlcnZpZXcgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGlzT2JqZWN0RW1wdHkgfSBmcm9tICcuLi91dGlsLmpzJ1xuXG5pbnRlcmZhY2UgRmVhdHVyZVN0YXRzTWFwIHtcbiAgICBbZ3JvdXBJZDogc3RyaW5nXTogRmVhdHVyZVN0YXRzO1xufVxuXG5pbnRlcmZhY2UgSlNPTkNvbnZlcnNpb25TZXR0aW5ncyB7XG4gICAgb21pdEdyb3Vwcz86IGJvb2xlYW5cbiAgICBvbmx5R3JvdXBzPzogYm9vbGVhblxuICAgIG5lc3RlZEdyb3Vwcz86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlIHtcbiAgICB0cmlnZ2VyZWRDb3VudDogbnVtYmVyXG4gICAgc2VudENvdW50OiBudW1iZXJcbiAgICBmYWlsZWRDb3VudDogbnVtYmVyXG4gICAgZ3JvdXBzOiBGZWF0dXJlW11cbn1cblxuY2xhc3MgRmVhdHVyZVN0YXRzIHtcbiAgICBwcml2YXRlIHRyaWdnZXJlZENvdW50OiBudW1iZXIgPSAwXG4gICAgcHJpdmF0ZSBzZW50Q291bnQ6IG51bWJlciA9IDBcbiAgICBwcml2YXRlIGZhaWxlZENvdW50OiBudW1iZXIgPSAwXG4gICAgcHJpdmF0ZSBncm91cHM6IEZlYXR1cmVTdGF0c01hcCA9IHt9XG5cbiAgICBwdWJsaWMgbWFyayhzdGF0dXM6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgJ3RyaWdnZXJlZCc6XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJlZChncm91cElkKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgIGNhc2UgJ3NlbnQnOlxuICAgICAgICAgICAgdGhpcy5zZW50KGdyb3VwSWQpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdmYWlsZWQnOlxuICAgICAgICAgICAgdGhpcy5mYWlsZWQoZ3JvdXBJZClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1JlcXVlc3QgdG8gbWFyayB1c2FnZSBmb3IgdW5rbm93biBzdGF0dXMgLSAnICsgc3RhdHVzKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0cmlnZ2VyZWQoZ3JvdXBJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnRyaWdnZXJlZENvdW50ICs9IDFcbiAgICAgICAgaWYgKGdyb3VwSWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoZ3JvdXBJZCkudHJpZ2dlcmVkKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZW50KGdyb3VwSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZW50Q291bnQgKz0gMVxuICAgICAgICBpZiAoZ3JvdXBJZCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVHcm91cChncm91cElkKS5zZW50KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBmYWlsZWQoZ3JvdXBJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmZhaWxlZENvdW50ICs9IDFcbiAgICAgICAgaWYgKGdyb3VwSWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoZ3JvdXBJZCkuZmFpbGVkKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdWNjZXNzKGdyb3VwSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZW50KGdyb3VwSWQpXG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUdyb3VwKGdyb3VwSWQ6IHN0cmluZyk6IEZlYXR1cmVTdGF0cyB7XG4gICAgICAgIGlmICghdGhpcy5ncm91cHNbZ3JvdXBJZF0pIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzW2dyb3VwSWRdID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzW2dyb3VwSWRdXG4gICAgfVxuXG4gICAgcHVibGljIGdldFRyaWdnZXJlZENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyaWdnZXJlZENvdW50XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNlbnRDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW50Q291bnRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmFpbGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbGVkQ291bnRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VXNhZ2VGb3JHcm91cChncm91cElkOiBzdHJpbmcpOiBGZWF0dXJlU3RhdHMge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNbZ3JvdXBJZF0gfHwgbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgfVxuXG4gICAgcHVibGljIGdldE92ZXJ2aWV3KCk6IEZlYXR1cmVTdGF0c092ZXJ2aWV3IHtcbiAgICAgICAgcmV0dXJuIHsgdHJpZ2dlcmVkQ291bnQ6IHRoaXMudHJpZ2dlcmVkQ291bnQsIHNlbnRDb3VudDogdGhpcy5zZW50Q291bnQsIGZhaWxlZENvdW50OiB0aGlzLmZhaWxlZENvdW50IH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0R3JvdXBzKCk6IEZlYXR1cmVTdGF0c01hcCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwc1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGQoZmVhdHVyZVN0YXRzOiBGZWF0dXJlU3RhdHMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyZWRDb3VudCArPSBmZWF0dXJlU3RhdHMuZ2V0VHJpZ2dlcmVkQ291bnQoKVxuICAgICAgICB0aGlzLnNlbnRDb3VudCArPSBmZWF0dXJlU3RhdHMuZ2V0U2VudENvdW50KClcbiAgICAgICAgdGhpcy5mYWlsZWRDb3VudCArPSBmZWF0dXJlU3RhdHMuZ2V0RmFpbGVkQ291bnQoKVxuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGZlYXR1cmVTdGF0cy5nZXRHcm91cHMoKSkuZm9yRWFjaCgoW2dyb3VwSWQsIGdyb3VwXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVHcm91cChncm91cElkKS5hZGQoZ3JvdXApXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gb21pdEdyb3VwczogdHJ1ZS9mYWxzZSAtPiBJbmNsdWRlIGdyb3VwcyBvciBub3RcbiAgICAvLyBvbmx5R3JvdXBzOiB0cnVlL2ZhbHNlIC0+IGRhdGEgaW5jbHVkZXMgb25seSBncm91cHNcbiAgICAvLyBuZXN0ZWRHcm91cHM6IHRydWUvZmFsc2UgLT4gZ3JvdXBzIHdpbGwgYmUgbmVzdGVkIGluIGdyb3VwcyBpZiB0cnVlXG4gICAgcHVibGljIHRvSlNPTihjb25maWc6IEpTT05Db252ZXJzaW9uU2V0dGluZ3MgPSB7fSkge1xuICAgICAgICBjb25zdCBvdmVydmlld0RhdGE6IEZlYXR1cmVTdGF0c092ZXJ2aWV3fFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9ICFjb25maWcub25seUdyb3VwcyA/IHtcbiAgICAgICAgICAgIHRyaWdnZXJlZENvdW50OiB0aGlzLnRyaWdnZXJlZENvdW50LFxuICAgICAgICAgICAgc2VudENvdW50OiB0aGlzLnNlbnRDb3VudCxcbiAgICAgICAgICAgIGZhaWxlZENvdW50OiB0aGlzLmZhaWxlZENvdW50XG4gICAgICAgIH0gOiB7fVxuXG4gICAgICAgIGNvbnN0IGdyb3Vwc0RhdGE6IFJlY29yZDxzdHJpbmcsIEZlYXR1cmVTdGF0c092ZXJ2aWV3PiA9IHt9XG4gICAgICAgIGlmICghY29uZmlnLm9taXRHcm91cHMpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZ3JvdXBzKS5mb3JFYWNoKChbZ3JvdXBJZCwgZ3JvdXBdKSA9PiB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzRGF0YVtncm91cElkXSA9IChncm91cC50b0pTT04oKSBhcyBGZWF0dXJlU3RhdHNPdmVydmlldykgLy8gQ3VycmVudGx5IE5lc3RlZCBncm91cHMgYXJlIG9ubHkgb3ZlcnZpZXdzXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdyb3VwID0gY29uZmlnLm5lc3RlZEdyb3VwcyA/IHsgZ3JvdXBzOiBncm91cHNEYXRhIH0gOiBncm91cHNEYXRhXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLm92ZXJ2aWV3RGF0YSxcbiAgICAgICAgICAgIC4uLmdyb3VwXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21KU09OKGpzb246IEZlYXR1cmUpOiBGZWF0dXJlU3RhdHMge1xuICAgICAgICBjb25zdCBzdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuXG4gICAgICAgIGlmICghanNvbiB8fCBpc09iamVjdEVtcHR5KGpzb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdHNcbiAgICAgICAgfVxuICAgICAgICBzdGF0cy50cmlnZ2VyZWRDb3VudCA9IGpzb24udHJpZ2dlcmVkQ291bnRcbiAgICAgICAgc3RhdHMuc2VudENvdW50ID0ganNvbi5zZW50Q291bnRcbiAgICAgICAgc3RhdHMuZmFpbGVkQ291bnQgPSBqc29uLmZhaWxlZENvdW50XG5cbiAgICAgICAgaWYgKCFqc29uLmdyb3Vwcykge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRzXG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoanNvbi5ncm91cHMpLmZvckVhY2goKFtncm91cElkLCBncm91cF0pID0+IHtcbiAgICAgICAgICAgIHN0YXRzLmdyb3Vwc1tncm91cElkXSA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihncm91cClcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHN0YXRzXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGZWF0dXJlU3RhdHNcbiIsICJpbXBvcnQgeyBnZXRFcnJvclN0cmluZyB9IGZyb20gJy4uL3V0aWwuanMnXG5cbmNsYXNzIEZlYXR1cmVVc2FnZSB7XG4gICAgcHJpdmF0ZSBpc1RyaWdnZXJlZD86IGJvb2xlYW5cbiAgICBwcml2YXRlIHN0YXR1cz86IHN0cmluZ1xuICAgIHByaXZhdGUgZXJyb3I/OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKGlzVHJpZ2dlcmVkPzogYm9vbGVhbikge1xuICAgICAgICBpZiAoaXNUcmlnZ2VyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5pc1RyaWdnZXJlZCA9IGlzVHJpZ2dlcmVkXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJpZ2dlcmVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1RyaWdnZXJlZFxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUcmlnZ2VyZWQodHJpZ2dlcmVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNUcmlnZ2VyZWQgPSB0cmlnZ2VyZWRcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U3RhdHVzKHN0YXR1czogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzXG4gICAgfVxuXG4gICAgcHVibGljIHNldEVycm9yKGVycm9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHRyaWdnZXJlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1RyaWdnZXJlZCA9IHRydWVcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFpbGVkKGU6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICB0aGlzLmVycm9yID0gZ2V0RXJyb3JTdHJpbmcoZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3VjY2VzcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSAnc3VjY2VzcydcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3RhdHVzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXR1c1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFcnJvcigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1RyaWdnZXJlZDogdGhpcy5pc1RyaWdnZXJlZCxcbiAgICAgICAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICBlcnJvcjogdGhpcy5lcnJvclxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGZWF0dXJlVXNhZ2VcbiIsICJjbGFzcyBUZXN0T3BzQ29uZmlnIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFRlc3RPcHNDb25maWdcbiAgICBwdWJsaWMgYnVpbGRTdG9wcGVkOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgYnVpbGRIYXNoZWRJZD86IHN0cmluZ1xuXG4gICAgc3RhdGljIGdldEluc3RhbmNlKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhc3NpbmcgYXJncyB0byBjb25zdHJ1Y3RvclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgVGVzdE9wc0NvbmZpZyguLi5hcmdzKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIHB1YmxpYyBtYW51YWxseVNldDogYm9vbGVhbiA9IGZhbHNlLFxuICAgICl7XG4gICAgICAgIFRlc3RPcHNDb25maWcuX2luc3RhbmNlID0gdGhpc1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGVzdE9wc0NvbmZpZ1xuIiwgImltcG9ydCBGZWF0dXJlU3RhdHMsIHsgdHlwZSBGZWF0dXJlIH0gZnJvbSAnLi9mZWF0dXJlU3RhdHMuanMnXG5pbXBvcnQgRmVhdHVyZVVzYWdlIGZyb20gJy4vZmVhdHVyZVVzYWdlLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IFRlc3RPcHNDb25maWcgZnJvbSAnLi90ZXN0T3BzQ29uZmlnLmpzJ1xuaW1wb3J0IHR5cGUgeyBUT1VzYWdlU3RhdHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZXhwb3J0IGludGVyZmFjZSBVc2FnZVN0YXQge1xuICAgIHRlc3RFdmVudHM6IHtcbiAgICAgICAgc3RhcnRlZDogRmVhdHVyZVxuICAgICAgICBmaW5pc2hlZDogRmVhdHVyZVxuICAgIH1cbiAgICBob29rRXZlbnRzOiB7XG4gICAgICAgIHN0YXJ0ZWQ6IEZlYXR1cmVcbiAgICAgICAgZmluaXNoZWQ6IEZlYXR1cmVcbiAgICB9XG4gICAgbG9nRXZlbnRzOiBGZWF0dXJlXG4gICAgY2J0U2Vzc2lvbkV2ZW50czogRmVhdHVyZVxuICAgIGNidFNlc3Npb25TdGF0czogRmVhdHVyZVxufVxuXG5jbGFzcyBVc2FnZVN0YXRzIHtcbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlOiBVc2FnZVN0YXRzXG4gICAgcHVibGljIHRlc3RTdGFydGVkU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyB0ZXN0RmluaXNoZWRTdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIGhvb2tTdGFydGVkU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyBob29rRmluaXNoZWRTdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIGNidFNlc3Npb25TdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIGxvZ1N0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgbGF1bmNoQnVpbGRVc2FnZTogRmVhdHVyZVVzYWdlXG4gICAgcHVibGljIHN0b3BCdWlsZFVzYWdlOiBGZWF0dXJlVXNhZ2VcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVXNhZ2VTdGF0cyB7XG4gICAgICAgIGlmICghVXNhZ2VTdGF0cy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgVXNhZ2VTdGF0cy5pbnN0YW5jZSA9IG5ldyBVc2FnZVN0YXRzKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVXNhZ2VTdGF0cy5pbnN0YW5jZVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRlc3RTdGFydGVkU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy50ZXN0RmluaXNoZWRTdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLmhvb2tTdGFydGVkU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy5ob29rRmluaXNoZWRTdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLmNidFNlc3Npb25TdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLmxvZ1N0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMubGF1bmNoQnVpbGRVc2FnZSA9IG5ldyBGZWF0dXJlVXNhZ2UoKVxuICAgICAgICB0aGlzLnN0b3BCdWlsZFVzYWdlID0gbmV3IEZlYXR1cmVVc2FnZSgpXG4gICAgfVxuXG4gICAgcHVibGljIGFkZCh1c2FnZVN0YXRzOiBVc2FnZVN0YXRzKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGVzdFN0YXJ0ZWRTdGF0cy5hZGQodXNhZ2VTdGF0cy50ZXN0U3RhcnRlZFN0YXRzKVxuICAgICAgICB0aGlzLnRlc3RGaW5pc2hlZFN0YXRzLmFkZCh1c2FnZVN0YXRzLnRlc3RGaW5pc2hlZFN0YXRzKVxuICAgICAgICB0aGlzLmhvb2tTdGFydGVkU3RhdHMuYWRkKHVzYWdlU3RhdHMuaG9va1N0YXJ0ZWRTdGF0cylcbiAgICAgICAgdGhpcy5ob29rRmluaXNoZWRTdGF0cy5hZGQodXNhZ2VTdGF0cy5ob29rRmluaXNoZWRTdGF0cylcbiAgICAgICAgdGhpcy5jYnRTZXNzaW9uU3RhdHMuYWRkKHVzYWdlU3RhdHMuY2J0U2Vzc2lvblN0YXRzKVxuICAgICAgICB0aGlzLmxvZ1N0YXRzLmFkZCh1c2FnZVN0YXRzLmxvZ1N0YXRzKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZWREYXRhKHdvcmtlcnNEYXRhOiB7IHVzYWdlU3RhdHM6IFVzYWdlU3RhdCB9W10pIHtcbiAgICAgICAgdGhpcy5hZGREYXRhRnJvbVdvcmtlcnMod29ya2Vyc0RhdGEpXG4gICAgICAgIGNvbnN0IHRlc3RPcHNDb25maWcgPSBUZXN0T3BzQ29uZmlnLmdldEluc3RhbmNlKClcbiAgICAgICAgY29uc3QgdXNhZ2U6IFRPVXNhZ2VTdGF0cyA9IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRlc3RPcHNDb25maWcuZW5hYmxlZCxcbiAgICAgICAgICAgIG1hbnVhbGx5U2V0OiB0ZXN0T3BzQ29uZmlnLm1hbnVhbGx5U2V0LFxuICAgICAgICAgICAgYnVpbGRIYXNoZWRJZDogdGVzdE9wc0NvbmZpZy5idWlsZEhhc2hlZElkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXVzYWdlLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1c2FnZVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHVzYWdlLmV2ZW50cyA9IHRoaXMuZ2V0RXZlbnRzRGF0YSgpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnZXhjZXB0aW9uIGluIGdldEZvcm1hdHRlZERhdGE6ICcgKyBlKVxuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVzYWdlXG4gICAgfVxuXG4gICAgcHVibGljIGFkZERhdGFGcm9tV29ya2Vycyh3b3JrZXJzRGF0YTogeyB1c2FnZVN0YXRzOiBVc2FnZVN0YXQgfVtdKSB7XG4gICAgICAgIHdvcmtlcnNEYXRhLm1hcCh3b3JrZXJEYXRhID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXNhZ2VTdGF0c0ZvcldvcmtlciA9IFVzYWdlU3RhdHMuZnJvbUpTT04od29ya2VyRGF0YS51c2FnZVN0YXRzKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkKHVzYWdlU3RhdHNGb3JXb3JrZXIpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdFeGNlcHRpb24gaW4gYWRkaW5nIHdvcmtlckRhdGE6ICcgKyBlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFdmVudHNEYXRhKCl7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBidWlsZEV2ZW50czoge1xuICAgICAgICAgICAgICAgIHN0YXJ0ZWQ6IHRoaXMubGF1bmNoQnVpbGRVc2FnZS50b0pTT04oKSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZDogdGhpcy5zdG9wQnVpbGRVc2FnZS50b0pTT04oKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRlc3RFdmVudHM6IHtcbiAgICAgICAgICAgICAgICBzdGFydGVkOiB0aGlzLnRlc3RTdGFydGVkU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMudGVzdEZpbmlzaGVkU3RhdHMudG9KU09OKHsgb21pdEdyb3VwczogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICAuLi50aGlzLnRlc3RGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG9ubHlHcm91cHM6IHRydWUgfSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBob29rRXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRlZDogdGhpcy5ob29rU3RhcnRlZFN0YXRzLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0aGlzLmhvb2tGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG9taXRHcm91cHM6IHRydWUgfSksXG4gICAgICAgICAgICAgICAgLi4udGhpcy5ob29rRmluaXNoZWRTdGF0cy50b0pTT04oeyBvbmx5R3JvdXBzOiB0cnVlIH0pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbG9nRXZlbnRzOiB0aGlzLmxvZ1N0YXRzLnRvSlNPTigpLFxuICAgICAgICAgICAgY2J0U2Vzc2lvbkV2ZW50czogdGhpcy5jYnRTZXNzaW9uU3RhdHMudG9KU09OKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXREYXRhVG9TYXZlKCl7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXN0RXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRlZDogdGhpcy50ZXN0U3RhcnRlZFN0YXRzLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0aGlzLnRlc3RGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG5lc3RlZEdyb3VwczogdHJ1ZSB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBob29rRXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRlZDogdGhpcy5ob29rU3RhcnRlZFN0YXRzLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0aGlzLmhvb2tGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG5lc3RlZEdyb3VwczogdHJ1ZSB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2dFdmVudHM6IHRoaXMubG9nU3RhdHMudG9KU09OKHsgbmVzdGVkR3JvdXBzOiB0cnVlIH0pLFxuICAgICAgICAgICAgY2J0U2Vzc2lvbkV2ZW50czogdGhpcy5jYnRTZXNzaW9uU3RhdHMudG9KU09OKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUpTT04oZGF0YTogVXNhZ2VTdGF0KSB7XG4gICAgICAgIGNvbnN0IHVzYWdlU3RhdHMgPSBuZXcgVXNhZ2VTdGF0cygpXG4gICAgICAgIHVzYWdlU3RhdHMudGVzdFN0YXJ0ZWRTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLnRlc3RFdmVudHMuc3RhcnRlZClcbiAgICAgICAgdXNhZ2VTdGF0cy50ZXN0RmluaXNoZWRTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLnRlc3RFdmVudHMuZmluaXNoZWQpXG4gICAgICAgIHVzYWdlU3RhdHMuaG9va1N0YXJ0ZWRTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLmhvb2tFdmVudHMuc3RhcnRlZClcbiAgICAgICAgdXNhZ2VTdGF0cy5ob29rRmluaXNoZWRTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLmhvb2tFdmVudHMuZmluaXNoZWQpXG4gICAgICAgIHVzYWdlU3RhdHMubG9nU3RhdHMgPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZGF0YS5sb2dFdmVudHMpXG4gICAgICAgIHVzYWdlU3RhdHMuY2J0U2Vzc2lvblN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEuY2J0U2Vzc2lvblN0YXRzKVxuICAgICAgICByZXR1cm4gdXNhZ2VTdGF0c1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVXNhZ2VTdGF0c1xuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnXG5cbmludGVyZmFjZSBTY3JpcHRzIHtcbiAgICBzY2FuOiBzdHJpbmdcbiAgICBnZXRSZXN1bHRzOiBzdHJpbmdcbiAgICBnZXRSZXN1bHRzU3VtbWFyeTogc3RyaW5nXG4gICAgc2F2ZVJlc3VsdHM6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgQ29tbWFuZCB7XG4gICAgbmFtZTogc3RyaW5nXG4gICAgY2xhc3M6IHN0cmluZ1xufVxuXG5jbGFzcyBBY2Nlc3NpYmlsaXR5U2NyaXB0cyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEFjY2Vzc2liaWxpdHlTY3JpcHRzIHwgbnVsbCA9IG51bGxcblxuICAgIHB1YmxpYyBwZXJmb3JtU2Nhbjogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgZ2V0UmVzdWx0czogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgZ2V0UmVzdWx0c1N1bW1hcnk6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIHNhdmVUZXN0UmVzdWx0czogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgY29tbWFuZHNUb1dyYXA6IEFycmF5PENvbW1hbmQ+IHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgQ2hyb21lRXh0ZW5zaW9uOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSA9IHt9XG5cbiAgICBwdWJsaWMgYnJvd3NlcnN0YWNrRm9sZGVyUGF0aCA9ICcnXG4gICAgcHVibGljIGNvbW1hbmRzUGF0aCA9ICcnXG5cbiAgICAvLyBkb24ndCBhbGxvdyB0byBjcmVhdGUgaW5zdGFuY2VzIGZyb20gaXQgb3RoZXIgdGhhbiB0aHJvdWdoIGBjaGVja0FuZEdldEluc3RhbmNlYFxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYnJvd3NlcnN0YWNrRm9sZGVyUGF0aCA9IHRoaXMuZ2V0V3JpdGFibGVEaXIoKVxuICAgICAgICB0aGlzLmNvbW1hbmRzUGF0aCA9IHBhdGguam9pbih0aGlzLmJyb3dzZXJzdGFja0ZvbGRlclBhdGgsICdjb21tYW5kcy5qc29uJylcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrQW5kR2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghQWNjZXNzaWJpbGl0eVNjcmlwdHMuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmluc3RhbmNlID0gbmV3IEFjY2Vzc2liaWxpdHlTY3JpcHRzKClcbiAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmluc3RhbmNlLnJlYWRGcm9tRXhpc3RpbmdGaWxlKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQWNjZXNzaWJpbGl0eVNjcmlwdHMuaW5zdGFuY2VcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbiAgICBwdWJsaWMgZ2V0V3JpdGFibGVEaXIoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgb3JkZXJlZFBhdGhzID0gW1xuICAgICAgICAgICAgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5icm93c2Vyc3RhY2snKSxcbiAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICBvcy50bXBkaXIoKVxuICAgICAgICBdXG4gICAgICAgIGZvciAoY29uc3Qgb3JkZXJlZFBhdGggb2Ygb3JkZXJlZFBhdGhzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKG9yZGVyZWRQYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICBmcy5hY2Nlc3NTeW5jKG9yZGVyZWRQYXRoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JkZXJlZFBhdGhcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmcy5ta2RpclN5bmMob3JkZXJlZFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yZGVyZWRQYXRoXG5cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLyogbm8tZW1wdHkgKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJydcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZyb21FeGlzdGluZ0ZpbGUoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLmNvbW1hbmRzUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuY29tbWFuZHNQYXRoLCAndXRmOCcpXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoSlNPTi5wYXJzZShkYXRhKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogRG8gbm90aGluZyAqL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZShkYXRhOiB7IGNvbW1hbmRzOiBbXSwgc2NyaXB0czogU2NyaXB0cywgbm9uQlN0YWNrSW5mcmFBMTF5Q2hyb21lT3B0aW9uczoge30gfSkge1xuICAgICAgICBpZiAoZGF0YS5zY3JpcHRzKSB7XG4gICAgICAgICAgICB0aGlzLnBlcmZvcm1TY2FuID0gZGF0YS5zY3JpcHRzLnNjYW5cbiAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cyA9IGRhdGEuc2NyaXB0cy5nZXRSZXN1bHRzXG4gICAgICAgICAgICB0aGlzLmdldFJlc3VsdHNTdW1tYXJ5ID0gZGF0YS5zY3JpcHRzLmdldFJlc3VsdHNTdW1tYXJ5XG4gICAgICAgICAgICB0aGlzLnNhdmVUZXN0UmVzdWx0cyA9IGRhdGEuc2NyaXB0cy5zYXZlUmVzdWx0c1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmNvbW1hbmRzICYmIGRhdGEuY29tbWFuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1hbmRzVG9XcmFwID0gZGF0YS5jb21tYW5kc1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLm5vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnMpe1xuICAgICAgICAgICAgdGhpcy5DaHJvbWVFeHRlbnNpb24gPSBkYXRhLm5vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnNcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHVibGljIHN0b3JlKCkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5icm93c2Vyc3RhY2tGb2xkZXJQYXRoKSl7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5icm93c2Vyc3RhY2tGb2xkZXJQYXRoKVxuICAgICAgICB9XG5cbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmNvbW1hbmRzUGF0aCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgY29tbWFuZHM6IHRoaXMuY29tbWFuZHNUb1dyYXAsXG4gICAgICAgICAgICBzY3JpcHRzOiB7XG4gICAgICAgICAgICAgICAgc2NhbjogdGhpcy5wZXJmb3JtU2NhbixcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzOiB0aGlzLmdldFJlc3VsdHMsXG4gICAgICAgICAgICAgICAgZ2V0UmVzdWx0c1N1bW1hcnk6IHRoaXMuZ2V0UmVzdWx0c1N1bW1hcnksXG4gICAgICAgICAgICAgICAgc2F2ZVJlc3VsdHM6IHRoaXMuc2F2ZVRlc3RSZXN1bHRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnM6IHRoaXMuQ2hyb21lRXh0ZW5zaW9uLFxuICAgICAgICB9KSlcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFjY2Vzc2liaWxpdHlTY3JpcHRzLmNoZWNrQW5kR2V0SW5zdGFuY2UoKVxuZXhwb3J0IHsgQ29tbWFuZCB9XG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5cbmltcG9ydCB0eXBlIHsgVGVzdERhdGEsIFVwbG9hZFR5cGUgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGJhdGNoQW5kUG9zdEV2ZW50cyB9IGZyb20gJy4uL3V0aWwuanMnXG5pbXBvcnQgeyBEQVRBX0JBVENIX0VORFBPSU5UIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuXG4vKipcbiAqIENyYXNoLXJlc2lsaWVudCBqb3VybmFsIG9mIHRlc3QgcnVucyB0aGF0IGhhdmUgc2VudCBUZXN0UnVuU3RhcnRlZCBidXQgbm90IHlldFxuICogVGVzdFJ1bkZpbmlzaGVkLiBFYWNoIG9wZW4gcnVuIGlzIHBlcnNpc3RlZCBhcyBhIHNtYWxsIGZpbGUgc28gdGhhdCBpZiB0aGUgd29ya2VyXG4gKiAob3IgdGhlIHdob2xlIHdkaW8gcHJvY2VzcyB0cmVlKSBpcyBraWxsZWQgbWlkLXRlc3QsIHRoZSBsYXVuY2hlcidzIHNodXRkb3duIHBhdGhcbiAqIG9yIHRoZSBkZXRhY2hlZCBleGl0IGNsZWFudXAgY2FuIHN0aWxsIHNlbmQgYSBzeW50aGV0aWMgVGVzdFJ1bkZpbmlzaGVkIFx1MjAxNCBvdGhlcndpc2VcbiAqIHRoZSB0ZXN0IGNhc2Ugc3RheXMgXCJpbiBwcm9ncmVzc1wiIG9uIHRoZSBUZXN0IFJlcG9ydGluZyAmIEFuYWx5dGljcyBkYXNoYm9hcmQgZm9yZXZlci5cbiAqL1xuXG5jb25zdCBPUEVOX1JVTlNfRElSID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdsb2dzJywgJ2JzdGFja19vcGVuX3J1bnMnKVxuXG5leHBvcnQgY29uc3QgT1JQSEFOX0ZBSUxVUkVfUkVBU09OID0gJ1Rlc3QgcnVuIGRpZCBub3QgY29tcGxldGU6IHRoZSBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBvciB0ZXJtaW5hdGVkIGJlZm9yZSB0aGUgdGVzdCBmaW5pc2hlZCAoZmluYWxpemVkIGJ5IEJyb3dzZXJTdGFjayBTREsgZXhpdCBjbGVhbnVwKSdcblxuZnVuY3Rpb24gb3BlblJ1bkZpbGVQYXRoKHV1aWQ6IHN0cmluZykge1xuICAgIHJldHVybiBwYXRoLmpvaW4oT1BFTl9SVU5TX0RJUiwgYG9wZW4tcnVuLSR7dXVpZH0uanNvbmApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRPcGVuUnVuKHRlc3REYXRhOiBUZXN0RGF0YSkge1xuICAgIGlmICghdGVzdERhdGEgfHwgIXRlc3REYXRhLnV1aWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGZzLm1rZGlyU3luYyhPUEVOX1JVTlNfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG9wZW5SdW5GaWxlUGF0aCh0ZXN0RGF0YS51dWlkKSwgSlNPTi5zdHJpbmdpZnkodGVzdERhdGEpKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdvcGVuUnVuc0pvdXJuYWw6IGZhaWxlZCB0byByZWNvcmQgb3BlbiBydW46ICcgKyBlKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyT3BlblJ1bih1dWlkPzogc3RyaW5nKSB7XG4gICAgaWYgKCF1dWlkKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBmcy5ybVN5bmMob3BlblJ1bkZpbGVQYXRoKHV1aWQpLCB7IGZvcmNlOiB0cnVlIH0pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ29wZW5SdW5zSm91cm5hbDogZmFpbGVkIHRvIGNsZWFyIG9wZW4gcnVuOiAnICsgZSlcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0T3JwaGFuZWRSdW5zKCk6IFRlc3REYXRhW10ge1xuICAgIGNvbnN0IG9ycGhhbnM6IFRlc3REYXRhW10gPSBbXVxuICAgIHRyeSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhPUEVOX1JVTlNfRElSKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9ycGhhbnNcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoT1BFTl9SVU5TX0RJUikpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgb3JwaGFucy5wdXNoKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihPUEVOX1JVTlNfRElSLCBmaWxlKSwgJ3V0ZjgnKSkpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBvcGVuUnVuc0pvdXJuYWw6IHNraXBwaW5nIHVucmVhZGFibGUgam91cm5hbCBmaWxlICR7ZmlsZX06ICR7ZX1gKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhPUEVOX1JVTlNfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1Zygnb3BlblJ1bnNKb3VybmFsOiBmYWlsZWQgdG8gY29sbGVjdCBvcnBoYW5lZCBydW5zOiAnICsgZSlcbiAgICB9XG4gICAgcmV0dXJuIG9ycGhhbnNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmFsaXplT3JwaGFuZWRSdW5zKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3JwaGFucyA9IGNvbGxlY3RPcnBoYW5lZFJ1bnMoKVxuICAgICAgICBpZiAoIW9ycGhhbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgY29uc3QgZXZlbnRzOiBVcGxvYWRUeXBlW10gPSBvcnBoYW5zLm1hcCgodGVzdERhdGEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRBdE1zID0gdGVzdERhdGEuc3RhcnRlZF9hdCA/IG5ldyBEYXRlKHRlc3REYXRhLnN0YXJ0ZWRfYXQpLmdldFRpbWUoKSA6IE5hTlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBldmVudF90eXBlOiAnVGVzdFJ1bkZpbmlzaGVkJyxcbiAgICAgICAgICAgICAgICB0ZXN0X3J1bjoge1xuICAgICAgICAgICAgICAgICAgICAuLi50ZXN0RGF0YSxcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRfYXQ6IGZpbmlzaGVkQXQsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX2luX21zOiBOdW1iZXIuaXNOYU4oc3RhcnRlZEF0TXMpID8gdW5kZWZpbmVkIDogTWF0aC5tYXgoMCwgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdE1zKSxcbiAgICAgICAgICAgICAgICAgICAgZmFpbHVyZTogW3sgYmFja3RyYWNlOiBbT1JQSEFOX0ZBSUxVUkVfUkVBU09OXSB9XSxcbiAgICAgICAgICAgICAgICAgICAgZmFpbHVyZV9yZWFzb246IE9SUEhBTl9GQUlMVVJFX1JFQVNPTixcbiAgICAgICAgICAgICAgICAgICAgZmFpbHVyZV90eXBlOiAnVW5oYW5kbGVkRXJyb3InXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBhd2FpdCBiYXRjaEFuZFBvc3RFdmVudHMoREFUQV9CQVRDSF9FTkRQT0lOVCwgJ09SUEhBTkVEX1RFU1RfUlVOX0ZJTkFMSVpBVElPTicsIGV2ZW50cylcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oYEZpbmFsaXplZCAke2V2ZW50cy5sZW5ndGh9IG9ycGhhbmVkIHRlc3QgcnVuKHMpIGxlZnQgYmVoaW5kIGJ5IGFuIGludGVycnVwdGVkIHJ1bmApXG4gICAgICAgIHJldHVybiBldmVudHMubGVuZ3RoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ29wZW5SdW5zSm91cm5hbDogZmFpbGVkIHRvIGZpbmFsaXplIG9ycGhhbmVkIHJ1bnM6ICcgKyBlKVxuICAgICAgICByZXR1cm4gMFxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRFcnJvclN0cmluZywgc3RvcEJ1aWxkVXBzdHJlYW0sIHVwbG9hZExvZ3MgfSBmcm9tICcuL3V0aWwuanMnXG5pbXBvcnQgeyBmaW5hbGl6ZU9ycGhhbmVkUnVucyB9IGZyb20gJy4vdGVzdE9wcy9vcGVuUnVuc0pvdXJuYWwuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHV0aWwgZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHsgZmlyZUZ1bm5lbFJlcXVlc3QgfSBmcm9tICcuL2luc3RydW1lbnRhdGlvbi9mdW5uZWxJbnN0cnVtZW50YXRpb24uanMnXG5pbXBvcnQgeyBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsIEJST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgdHlwZSB7IEZ1bm5lbERhdGEgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IFBlcmZvcm1hbmNlVGVzdGVyIGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL3BlcmZvcm1hbmNlLXRlc3Rlci5qcydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQlN0YWNrQ2xlYW51cCB7XG4gICAgc3RhdGljIGFzeW5jIHN0YXJ0Q2xlYW51cCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEdldCBmdW5uZWwgZGF0YSBvYmplY3QgZnJvbSBzYXZlZCBmaWxlXG4gICAgICAgICAgICBjb25zdCBmdW5uZWxEYXRhQ2xlYW51cCA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1mdW5uZWxEYXRhJylcbiAgICAgICAgICAgIGxldCBmdW5uZWxEYXRhOiBGdW5uZWxEYXRhIHwgbnVsbCA9IG51bGxcbiAgICAgICAgICAgIGlmIChmdW5uZWxEYXRhQ2xlYW51cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcHJvY2Vzcy5hcmd2LmluZGV4T2YoJy0tZnVubmVsRGF0YScpXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmFyZ3ZbaW5kZXggKyAxXVxuICAgICAgICAgICAgICAgIGZ1bm5lbERhdGEgPSBCU3RhY2tDbGVhbnVwLmdldEZ1bm5lbERhdGFGcm9tRmlsZShmaWxlUGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNuYXBzaG90IGJlZm9yZSBzZW5kRnVubmVsRGF0YSBcdTIwMTQgZmlyZUZ1bm5lbFJlcXVlc3QgcmVkYWN0cyB0aGVcbiAgICAgICAgICAgIC8vIGNyZWRlbnRpYWxzIGluIHBsYWNlLlxuICAgICAgICAgICAgY29uc3QgZnVubmVsVXNlciA9IGZ1bm5lbERhdGE/LnVzZXJOYW1lXG4gICAgICAgICAgICBjb25zdCBmdW5uZWxLZXkgPSBmdW5uZWxEYXRhPy5hY2Nlc3NLZXlcblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1vYnNlcnZhYmlsaXR5JykgJiYgZnVubmVsRGF0YSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZU9ic2VydmFiaWxpdHlDbGVhbnVwKGZ1bm5lbERhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmdW5uZWxEYXRhQ2xlYW51cCAmJiBmdW5uZWxEYXRhKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kRnVubmVsRGF0YShmdW5uZWxEYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZXNjdWUgdGhlIFNESy1sb2cgdXBsb2FkIGZvciBydW5zIHdob3NlIGxhdW5jaGVyIG5ldmVyIHJlYWNoZWRcbiAgICAgICAgICAgIC8vIG9uQ29tcGxldGUgKHNpZ25hbCB0ZXJtaW5hdGlvbikgXHUyMDE0IGFmdGVyIGV2ZW50cywgYmVmb3JlIGV4aXQuXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXVwbG9hZExvZ3MnKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUxvZ3NVcGxvYWQoZnVubmVsVXNlciwgZnVubmVsS2V5KVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZXJyIGFzIHN0cmluZ1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGVycm9yKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tcGVyZm9ybWFuY2VEYXRhJykpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBQZXJmb3JtYW5jZVRlc3Rlci51cGxvYWRFdmVudHNEYXRhKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3IgaW4gc2VuZGluZyBldmVudHMgZGF0YSAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGV4ZWN1dGVMb2dzVXBsb2FkKGZ1bm5lbFVzZXI/OiBzdHJpbmcsIGZ1bm5lbEtleT86IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwcm9jZXNzLmFyZ3YuaW5kZXhPZignLS11cGxvYWRMb2dzJylcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudEJ1aWxkVXVpZCA9IHByb2Nlc3MuYXJndltpbmRleCArIDFdXG4gICAgICAgICAgICBjb25zdCB1c2VyID0gZnVubmVsVXNlciB8fCBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVVNFUk5BTUVcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGZ1bm5lbEtleSB8fCBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQUNDRVNTX0tFWVxuICAgICAgICAgICAgaWYgKCFjbGllbnRCdWlsZFV1aWQgfHwgIXVzZXIgfHwgIWtleSkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgbG9ncyB1cGxvYWQgaW4gY2xlYW51cDogbWlzc2luZyB1dWlkIG9yIGNyZWRlbnRpYWxzJylcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgVXBsb2FkaW5nIFNESyBsb2dzIGZyb20gY2xlYW51cCBmb3IgJHtjbGllbnRCdWlsZFV1aWR9YClcbiAgICAgICAgICAgIGF3YWl0IHVwbG9hZExvZ3ModXNlciwga2V5LCBjbGllbnRCdWlsZFV1aWQpXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignRXJyb3IgdXBsb2FkaW5nIFNESyBsb2dzIGluIGNsZWFudXA6ICcgKyBnZXRFcnJvclN0cmluZyhlKSlcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZXhlY3V0ZU9ic2VydmFiaWxpdHlDbGVhbnVwKGZ1bm5lbERhdGE6IEZ1bm5lbERhdGEpIHtcbiAgICAgICAgaWYgKCFwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1RdKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0V4ZWN1dGluZyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGNsZWFudXAnKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gU0RLLTQ2NzE6IGZpbmFsaXplIGFueSB0ZXN0IHJ1bnMgb3JwaGFuZWQgYnkgdGhlIGludGVycnVwdGVkIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgYnVpbGQgaXRzZWxmIGlzIHN0b3BwZWQuXG4gICAgICAgICAgICBhd2FpdCBmaW5hbGl6ZU9ycGhhbmVkUnVucygpXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9wQnVpbGRVcHN0cmVhbSgpXG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSkgJiYgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF0pIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhgXFxuVmlzaXQgaHR0cHM6Ly9hdXRvbWF0aW9uLmJyb3dzZXJzdGFjay5jb20vYnVpbGRzLyR7cHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF19IHRvIHZpZXcgYnVpbGQgcmVwb3J0LCBpbnNpZ2h0cywgYW5kIG1hbnkgbW9yZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYWxsIGF0IG9uZSBwbGFjZSFcXG5gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gKHJlc3VsdCAmJiByZXN1bHQuc3RhdHVzKSB8fCAnZmFpbGVkJ1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IChyZXN1bHQgJiYgcmVzdWx0Lm1lc3NhZ2UpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU8xMXlTdG9wRGF0YShmdW5uZWxEYXRhLCBzdGF0dXMsIHN0YXR1cyA9PT0gJ2ZhaWxlZCcgPyBtZXNzYWdlIDogdW5kZWZpbmVkKVxuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0Vycm9yIGluIHN0b3BwaW5nIFRlc3QgUmVwb3J0aW5nIGFuZCBBbmFseXRpY3MgYnVpbGQ6ICcgKyBlKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVPMTF5U3RvcERhdGEoZnVubmVsRGF0YSwgJ2ZhaWxlZCcsIGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgdXBkYXRlTzExeVN0b3BEYXRhKGZ1bm5lbERhdGE6IEZ1bm5lbERhdGEsIHN0YXR1czogc3RyaW5nLCBlcnJvcjogdW5rbm93biA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB0b0RhdGEgPSBmdW5uZWxEYXRhPy5ldmVudF9wcm9wZXJ0aWVzPy5wcm9kdWN0VXNhZ2U/LnRlc3RPYnNlcnZhYmlsaXR5XG4gICAgICAgIC8vIFJldHVybiBpZiBubyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGRhdGEgaW4gZnVubmVsIGRhdGFcbiAgICAgICAgaWYgKCF0b0RhdGEpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGxldCBleGlzdGluZ1N0b3BEYXRhID0gdG9EYXRhLmV2ZW50cy5idWlsZEV2ZW50cy5maW5pc2hlZFxuICAgICAgICBleGlzdGluZ1N0b3BEYXRhID0gZXhpc3RpbmdTdG9wRGF0YSB8fCB7fVxuXG4gICAgICAgIGV4aXN0aW5nU3RvcERhdGEgPSB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ1N0b3BEYXRhLFxuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgZXJyb3I6IGdldEVycm9yU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgIHN0b3BwZWRGcm9tOiAnZXhpdEhvb2snXG4gICAgICAgIH1cbiAgICAgICAgdG9EYXRhLmV2ZW50cy5idWlsZEV2ZW50cy5maW5pc2hlZCA9IGV4aXN0aW5nU3RvcERhdGFcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgc2VuZEZ1bm5lbERhdGEoZnVubmVsRGF0YTogRnVubmVsRGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZmlyZUZ1bm5lbFJlcXVlc3QoZnVubmVsRGF0YSlcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRnVubmVsIGRhdGEgc2VudCBzdWNjZXNzZnVsbHkgZnJvbSBjbGVhbnVwJylcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdFcnJvciBpbiBzZW5kaW5nIGZ1bm5lbCBkYXRhOiAnICsgZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRGdW5uZWxEYXRhRnJvbUZpbGUoZmlsZVBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGNvbnRlbnQpXG4gICAgICAgIHRoaXMucmVtb3ZlRnVubmVsRGF0YUZpbGUoZmlsZVBhdGgpXG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgc3RhdGljIHJlbW92ZUZ1bm5lbERhdGFGaWxlKGZpbGVQYXRoPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxuICAgIH1cbn1cblxudm9pZCBCU3RhY2tDbGVhbnVwLnN0YXJ0Q2xlYW51cCgpXG4iLCAiaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnXG5pbXBvcnQgdXRpbCwgeyBmb3JtYXQgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBVc2FnZVN0YXRzLCB7IHR5cGUgVXNhZ2VTdGF0IH0gZnJvbSAnLi4vdGVzdE9wcy91c2FnZVN0YXRzLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHR5cGUgQnJvd3NlclN0YWNrQ29uZmlnIGZyb20gJy4uL2NvbmZpZy5qcydcbmltcG9ydCB7IEJTVEFDS19TRVJWSUNFX1ZFUlNJT04sIFdESU9fTkFNSU5HX1BSRUZJWCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IGdldERhdGFGcm9tV29ya2VycyB9IGZyb20gJy4uL2RhdGEtc3RvcmUuanMnXG5pbXBvcnQgeyBnZXRQcm9kdWN0TWFwIH0gZnJvbSAnLi4vdGVzdEh1Yi91dGlscy5qcydcbmltcG9ydCBmZXRjaFdyYXAgZnJvbSAnLi4vZmV0Y2hXcmFwcGVyLmpzJ1xuaW1wb3J0IHR5cGUgeyBCcm93c2Vyc3RhY2tIZWFsaW5nIH0gZnJvbSAnQGJyb3dzZXJzdGFjay9haS1zZGstbm9kZSdcbmltcG9ydCB0eXBlIHsgRnVubmVsRGF0YSwgRXZlbnRQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgVGVzdE9wc0NvbmZpZyBmcm9tICcuLi90ZXN0T3BzL3Rlc3RPcHNDb25maWcuanMnXG5pbXBvcnQgQVBJVXRpbHMgZnJvbSAnLi4vY2xpL2FwaVV0aWxzLmpzJ1xuaW1wb3J0IFBlcmZvcm1hbmNlVGVzdGVyIGZyb20gJy4vcGVyZm9ybWFuY2UvcGVyZm9ybWFuY2UtdGVzdGVyLmpzJ1xuaW1wb3J0IHsgRVZFTlRTIH0gZnJvbSAnLi9wZXJmb3JtYW5jZS9jb25zdGFudHMuanMnXG5cbmFzeW5jIGZ1bmN0aW9uIGZpcmVGdW5uZWxUZXN0RXZlbnQoZXZlbnRUeXBlOiBzdHJpbmcsIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc0NMSUVuYWJsZWQgPSBmYWxzZSkge1xuICAgIGlmICghY29uZmlnLnVzZXJOYW1lIHx8ICFjb25maWcuYWNjZXNzS2V5KSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygndXNlcm5hbWUvYWNjZXNza2V5IG5vdCBwYXNzZWQnKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gYnVpbGRFdmVudERhdGEoZXZlbnRUeXBlLCBjb25maWcsIGlzQ0xJRW5hYmxlZClcbiAgICAgICAgYXdhaXQgZmlyZUZ1bm5lbFJlcXVlc3QoZGF0YSlcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdGdW5uZWwgZXZlbnQgc3VjY2VzcycpXG4gICAgICAgIC8vIE9ubHkgdGhlIGZpbmlzaCBldmVudCBkaXNhcm1zIHRoZSBleGl0LXRpbWUgY2xlYW51cCByZXNlbmQgXHUyMDE0IG1hcmtpbmcgaXRcbiAgICAgICAgLy8gb24gU0RLVGVzdEF0dGVtcHRlZCBsZWZ0IGtpbGxlZCBydW5zIHdpdGggbm8gU0RLVGVzdFN1Y2Nlc3NmdWwgYXQgYWxsLlxuICAgICAgICBpZiAoZXZlbnRUeXBlID09PSAnU0RLVGVzdFN1Y2Nlc3NmdWwnKSB7XG4gICAgICAgICAgICBjb25maWcuc2VudEZ1bm5lbERhdGEoKVxuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFeGNlcHRpb24gaW4gc2VuZGluZyBmdW5uZWwgZGF0YTogJHtmb3JtYXQoZXJyb3IpfWApXG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZFN0YXJ0KGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSB7XG5cbiAgICAvLyBUcmFjayBmdW5uZWwgdGVzdCBhdHRlbXB0ZWQgZXZlbnRcbiAgICBQZXJmb3JtYW5jZVRlc3Rlci5zdGFydChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX0FUVEVNUFRFRClcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0QXR0ZW1wdGVkJywgY29uZmlnKVxuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9BVFRFTVBURUQsIHRydWUpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfQVRURU1QVEVELCBmYWxzZSwgZXJyb3IpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZEZpbmlzaChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNDTElFbmFibGVkID0gZmFsc2UpIHtcbiAgICAvLyBUcmFjayBmdW5uZWwgdGVzdCBzdWNjZXNzZnVsIGV2ZW50XG4gICAgUGVyZm9ybWFuY2VUZXN0ZXIuc3RhcnQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9TVUNDRVNTRlVMKVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RTdWNjZXNzZnVsJywgY29uZmlnLCBpc0NMSUVuYWJsZWQpXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX1NVQ0NFU1NGVUwsIHRydWUpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfU1VDQ0VTU0ZVTCwgZmFsc2UsIGVycm9yKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVGdW5uZWxEYXRhKGV2ZW50VHlwZTogc3RyaW5nLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNDTElFbmFibGVkID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSBidWlsZEV2ZW50RGF0YShldmVudFR5cGUsIGNvbmZpZywgaXNDTElFbmFibGVkKVxuXG4gICAgQlN0YWNrTG9nZ2VyLmVuc3VyZUxvZ3NGb2xkZXIoKVxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKEJTdGFja0xvZ2dlci5sb2dGb2xkZXJQYXRoLCAnZnVubmVsRGF0YS5qc29uJylcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICByZXR1cm4gZmlsZVBhdGhcbn1cblxuZnVuY3Rpb24gcmVkYWN0Q3JlZGVudGlhbHNGcm9tRnVubmVsRGF0YShkYXRhOiBGdW5uZWxEYXRhKSB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEudXNlck5hbWUpIHtcbiAgICAgICAgICAgIGRhdGEudXNlck5hbWUgPSAnW1JFREFDVEVEXSdcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5hY2Nlc3NLZXkpIHtcbiAgICAgICAgICAgIGRhdGEuYWNjZXNzS2V5ID0gJ1tSRURBQ1RFRF0nXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbn1cblxuLy8gQ2FsbGVkIGZyb20gdHdvIGRpZmZlcmVudCBwcm9jZXNzXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlyZUZ1bm5lbFJlcXVlc3QoZGF0YTogRnVubmVsRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgdXNlck5hbWUsIGFjY2Vzc0tleSB9ID0gZGF0YVxuICAgIHJlZGFjdENyZWRlbnRpYWxzRnJvbUZ1bm5lbERhdGEoZGF0YSlcblxuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnU2VuZGluZyBTREsgZXZlbnQgd2l0aCBkYXRhICcgKyB1dGlsLmluc3BlY3QoZGF0YSwgeyBkZXB0aDogNiB9KSlcblxuICAgIGNvbnN0IGVuY29kZWRBdXRoID0gQnVmZmVyLmZyb20oYCR7dXNlck5hbWV9OiR7YWNjZXNzS2V5fWAsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdyYXAoQVBJVXRpbHMuRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtlbmNvZGVkQXV0aH1gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKVxuICAgIH0pXG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdGdW5uZWwgRXZlbnQgUmVzcG9uc2U6ICcgKyBKU09OLnN0cmluZ2lmeShhd2FpdCByZXNwb25zZS50ZXh0KCkpKVxufVxuXG5mdW5jdGlvbiBnZXRQcm9kdWN0TGlzdChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZykge1xuICAgIGNvbnN0IHByb2R1Y3RzOiBzdHJpbmdbXSA9IFtdXG4gICAgaWYgKGNvbmZpZy50ZXN0T2JzZXJ2YWJpbGl0eS5lbmFibGVkKSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ29ic2VydmFiaWxpdHknKVxuICAgIH1cblxuICAgIGlmIChjb25maWcuYWNjZXNzaWJpbGl0eSkge1xuICAgICAgICBwcm9kdWN0cy5wdXNoKCdhY2Nlc3NpYmlsaXR5JylcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnBlcmN5KSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ3BlcmN5JylcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmF1dG9tYXRlKSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ2F1dG9tYXRlJylcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmFwcEF1dG9tYXRlKSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ2FwcC1hdXRvbWF0ZScpXG4gICAgfVxuICAgIHJldHVybiBwcm9kdWN0c1xufVxuXG5mdW5jdGlvbiBidWlsZEV2ZW50RGF0YShldmVudFR5cGU6IHN0cmluZywgY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzQ0xJRW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgY29uc3QgZXZlbnRQcm9wZXJ0aWVzOiBFdmVudFByb3BlcnRpZXMgPSB7XG4gICAgICAgIC8vIEZyYW1ld29yayBEZXRhaWxzXG4gICAgICAgIHNka1J1bklkOiBjb25maWc/LnNka1J1bklELFxuICAgICAgICB0ZXN0aHViX3V1aWQ6IFRlc3RPcHNDb25maWcuZ2V0SW5zdGFuY2UoKS5idWlsZEhhc2hlZElkLFxuICAgICAgICBsYW5ndWFnZV9mcmFtZXdvcms6IGdldExhbmd1YWdlRnJhbWV3b3JrKGNvbmZpZy5mcmFtZXdvcmspLFxuICAgICAgICByZWZlcnJlcjogZ2V0UmVmZXJyZXIoY29uZmlnLmZyYW1ld29yayksXG4gICAgICAgIGxhbmd1YWdlOiAnV2ViZHJpdmVySU8nLFxuICAgICAgICBsYW5ndWFnZVZlcnNpb246IHByb2Nlc3MudmVyc2lvbixcblxuICAgICAgICAvLyBCdWlsZCBEZXRhaWxzXG4gICAgICAgIGJ1aWxkTmFtZTogY29uZmlnLmJ1aWxkTmFtZSB8fCAndW5kZWZpbmVkJyxcbiAgICAgICAgYnVpbGRJZGVudGlmaWVyOiBTdHJpbmcoY29uZmlnLmJ1aWxkSWRlbnRpZmllciksXG5cbiAgICAgICAgLy8gSG9zdCBkZXRhaWxzXG4gICAgICAgIG9zOiBvcy50eXBlKCkgfHwgJ3Vua25vd24nLFxuICAgICAgICBob3N0bmFtZTogb3MuaG9zdG5hbWUoKSB8fCAndW5rbm93bicsXG5cbiAgICAgICAgLy8gUHJvZHVjdCBEZXRhaWxzXG4gICAgICAgIHByb2R1Y3RNYXA6IGdldFByb2R1Y3RNYXAoY29uZmlnKSxcbiAgICAgICAgcHJvZHVjdDogZ2V0UHJvZHVjdExpc3QoY29uZmlnKSxcblxuICAgICAgICAvLyBmcmFtZXdvcmsgZGV0YWlsc1xuICAgICAgICBmcmFtZXdvcms6IGNvbmZpZy5mcmFtZXdvcmssXG5cbiAgICAgICAgLy8gQ0xJIERldGFpbHNcbiAgICAgICAgaXNDTElFbmFibGVkOiBpc0NMSUVuYWJsZWRcbiAgICB9XG5cbiAgICBpZiAoZXZlbnRUeXBlID09PSAnU0RLVGVzdFN1Y2Nlc3NmdWwnKSB7XG4gICAgICAgIGNvbnN0IHdvcmtlckRhdGEgPSBnZXREYXRhRnJvbVdvcmtlcnMoKVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGV2ZW50UHJvcGVydGllcy5wcm9kdWN0VXNhZ2UgPSBnZXRQcm9kdWN0VXNhZ2Uod29ya2VyRGF0YSlcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1BPTExJTkdfVElNRU9VVCkge1xuICAgICAgICAgICAgZXZlbnRQcm9wZXJ0aWVzLnBvbGxpbmdUaW1lb3V0ID0gcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfUE9MTElOR19USU1FT1VUIGFzIHN0cmluZ1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGFueSB3b3JrZXIgY2FsbGVkIGJyb3dzZXIucmVsb2FkU2Vzc2lvbigpLCBtYXJrIHRoZSBidWlsZCBzbyB0aGVcbiAgICAgICAgLy8gc2Vzc2lvbi1saW5raW5nIGRhc2hib2FyZCBjYW4gZXhjbHVkZSBpdHMgKGV4cGVjdGVkKSByZWxvYWQtb3JwaGFuZWQgc2Vzc2lvbnMuXG4gICAgICAgIHR5cGUgV29ya2VyUmVjb3JkID0geyByZWxvYWRIYXBwZW5lZD86IGJvb2xlYW47IHVzYWdlU3RhdHM/OiB1bmtub3duIH1cbiAgICAgICAgY29uc3QgcmVsb2FkSGFwcGVuZWQgPSB3b3JrZXJEYXRhLnNvbWUoKHdvcmtlcikgPT4gKHdvcmtlciBhcyBXb3JrZXJSZWNvcmQpLnJlbG9hZEhhcHBlbmVkID09PSB0cnVlKVxuICAgICAgICBpZiAocmVsb2FkSGFwcGVuZWQpIHtcbiAgICAgICAgICAgIGV2ZW50UHJvcGVydGllcy5maW5pc2hlZE1ldGFkYXRhID0geyByZWFzb246ICdzZXNzaW9uX3JlbG9hZGVkJyB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBzaWduYWwtdGVybWluYXRlZCBydW4gbXVzdCBiZSBxdWVyeS1kZXRlY3RhYmxlIFx1MjAxNCBraWxsIHdpbnMgb3ZlclxuICAgICAgICAvLyByZWxvYWQgYXMgdGhlIGZpbmlzaCByZWFzb24uXG4gICAgICAgIGlmIChjb25maWcua2lsbFNpZ25hbCkge1xuICAgICAgICAgICAgZXZlbnRQcm9wZXJ0aWVzLmZpbmlzaGVkTWV0YWRhdGEgPSB7IHJlYXNvbjogJ3VzZXJfa2lsbGVkJywgc2lnbmFsOiBjb25maWcua2lsbFNpZ25hbCB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB1c2VyTmFtZTogY29uZmlnLnVzZXJOYW1lLFxuICAgICAgICBhY2Nlc3NLZXk6IGNvbmZpZy5hY2Nlc3NLZXksXG4gICAgICAgIGV2ZW50X3R5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgZGV0ZWN0ZWRGcmFtZXdvcms6IFdESU9fTkFNSU5HX1BSRUZJWCArIGNvbmZpZy5mcmFtZXdvcmssXG4gICAgICAgIGV2ZW50X3Byb3BlcnRpZXM6IGV2ZW50UHJvcGVydGllc1xuICAgIH0gYXMgdW5rbm93biBhcyBGdW5uZWxEYXRhXG5cbn1cblxuZnVuY3Rpb24gZ2V0UHJvZHVjdFVzYWdlKHdvcmtlcnNEYXRhOiB7IHVzYWdlU3RhdHM6IFVzYWdlU3RhdCB9W10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0ZXN0T2JzZXJ2YWJpbGl0eTogVXNhZ2VTdGF0cy5nZXRJbnN0YW5jZSgpLmdldEZvcm1hdHRlZERhdGEod29ya2Vyc0RhdGEpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRMYW5ndWFnZUZyYW1ld29yayhmcmFtZXdvcms/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gJ1dlYmRyaXZlcklPXycgKyBmcmFtZXdvcmtcbn1cblxuZnVuY3Rpb24gZ2V0UmVmZXJyZXIoZnJhbWV3b3JrPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZnVsbE5hbWUgPSBmcmFtZXdvcmsgPyBXRElPX05BTUlOR19QUkVGSVggKyBmcmFtZXdvcmsgOiAnV2ViZHJpdmVySU8nXG4gICAgcmV0dXJuIGAke2Z1bGxOYW1lfS8ke0JTVEFDS19TRVJWSUNFX1ZFUlNJT059YFxufVxuXG5jb25zdCBzZW5kRXZlbnQgPSB7XG4gICAgdGNnRG93bjogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNnRG93blJlc3BvbnNlJywgY29uZmlnKSxcbiAgICBpbnZhbGlkVGNnQXV0aDogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0SW52YWxpZFRjZ0F1dGhSZXNwb25zZVdpdGhVc2VySW1wYWN0JywgY29uZmlnKSxcbiAgICB0Y2dBdXRoRmFpbHVyZTogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNnQXV0aEZhaWx1cmUnLCBjb25maWcpLFxuICAgIHRjZ3RJbml0U3VjY2Vzc2Z1bDogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNndEluaXRTdWNjZXNzZnVsJywgY29uZmlnKSxcbiAgICBpbml0RmFpbGVkOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RJbml0RmFpbGVkUmVzcG9uc2UnLCBjb25maWcpLFxuICAgIHRjZ1Byb3h5RmFpbHVyZTogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNnUHJveHlGYWlsdXJlJywgY29uZmlnKSxcbn1cblxuZnVuY3Rpb24gaXNQcm94eUVycm9yKGF1dGhSZXN1bHQ6IHsgc3RhdHVzPzogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGF1dGhSZXN1bHQgYXMgQnJvd3NlcnN0YWNrSGVhbGluZy5Jbml0RXJyb3JSZXNwb25zZSk/LnN0YXR1cyA9PT0gNTAyXG59XG5cbmZ1bmN0aW9uIGhhbmRsZVByb3h5RXJyb3IoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgc2VuZEV2ZW50LnRjZ1Byb3h5RmFpbHVyZShjb25maWcpXG4gICAgaWYgKGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdQcm94eSBFcnJvci4gRGlzYWJsaW5nIEhlYWxpbmcgZm9yIHRoaXMgc2Vzc2lvbi4nKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlVXBncmFkZVJlcXVpcmVkKGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdQbGVhc2UgdXBncmFkZSBCcm93c2Vyc3RhY2sgU2VydmljZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gdG8gdXNlIHRoZSBzZWxmLWhlYWxpbmcgZmVhdHVyZS4nKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQXV0aGVudGljYXRpb25GYWlsdXJlKHN0YXR1czogbnVtYmVyLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgICAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdTb21ldGhpbmcgd2VudCB3cm9uZy4gRGlzYWJsaW5nIGhlYWxpbmcgZm9yIHRoaXMgc2Vzc2lvbi4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nKVxuICAgICAgICB9XG4gICAgICAgIHNlbmRFdmVudC50Y2dEb3duKGNvbmZpZylcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBdXRoZW50aWNhdGlvbiBGYWlsZWQuIERpc2FibGluZyBIZWFsaW5nIGZvciB0aGlzIHNlc3Npb24uJylcbiAgICAgICAgfVxuICAgICAgICBzZW5kRXZlbnQudGNnQXV0aEZhaWx1cmUoY29uZmlnKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQXV0aGVudGljYXRpb25TdWNjZXNzKFxuICAgIGlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyOiBib29sZWFuLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLFxuICAgIGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkXG4pIHtcbiAgICBpZiAoIWlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyICYmIGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdIZWFsaW5nIGlzIG5vdCBlbmFibGVkIGZvciB5b3VyIGdyb3VwLCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW4nKVxuICAgIH0gZWxzZSBpZiAodXNlcklkICYmIGlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyKSB7XG4gICAgICAgIHNlbmRFdmVudC50Y2d0SW5pdFN1Y2Nlc3NmdWwoY29uZmlnKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlSW5pdGlhbGl6YXRpb25GYWlsdXJlKHN0YXR1czogbnVtYmVyLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICBzZW5kRXZlbnQuaW5pdEZhaWxlZChjb25maWcpXG4gICAgfSBlbHNlIGlmICghc3RhdHVzICYmIGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIHNlbmRFdmVudC5pbnZhbGlkVGNnQXV0aChjb25maWcpXG4gICAgfVxuXG4gICAgaWYgKGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBdXRoZW50aWNhdGlvbiBGYWlsZWQuIEhlYWxpbmcgd2lsbCBiZSBkaXNhYmxlZCBmb3IgdGhpcyBzZXNzaW9uLicpXG4gICAgfVxufVxuXG5pbnRlcmZhY2UgQXV0aFJlc3VsdCB7XG4gICAgbWVzc2FnZTogc3RyaW5nXG4gICAgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuXG4gICAgc3RhdHVzOiBudW1iZXJcbiAgICB1c2VySWQ6IHN0cmluZ1xuICAgIGdyb3VwSWQ6IHN0cmluZ1xuICAgIGlzSGVhbGluZ0VuYWJsZWQ6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUhlYWxpbmdJbnN0cnVtZW50YXRpb24oXG4gICAgYXV0aFJlc3VsdDogQXV0aFJlc3VsdCxcbiAgICBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZyxcbiAgICBpc1NlbGZIZWFsRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbikge1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChpc1Byb3h5RXJyb3IoYXV0aFJlc3VsdCkpIHtcbiAgICAgICAgICAgIGhhbmRsZVByb3h5RXJyb3IoY29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBpc0F1dGhlbnRpY2F0ZWQsIHN0YXR1cywgdXNlcklkLCBncm91cElkLCBpc0hlYWxpbmdFbmFibGVkOiBpc0hlYWxpbmdFbmFibGVkRm9yVXNlciB9ID0gYXV0aFJlc3VsdFxuXG4gICAgICAgIGlmIChtZXNzYWdlID09PSAnVXBncmFkZSByZXF1aXJlZCcpIHtcbiAgICAgICAgICAgIGhhbmRsZVVwZ3JhZGVSZXF1aXJlZChpc1NlbGZIZWFsRW5hYmxlZClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uRmFpbHVyZShzdGF0dXMsIGNvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0F1dGhlbnRpY2F0ZWQgJiYgdXNlcklkICYmIGdyb3VwSWQpIHtcbiAgICAgICAgICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uU3VjY2Vzcyhpc0hlYWxpbmdFbmFibGVkRm9yVXNlciwgdXNlcklkLCBjb25maWcsIGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdHVzID49IDQwMCB8fCAhc3RhdHVzKSB7XG4gICAgICAgICAgICBoYW5kbGVJbml0aWFsaXphdGlvbkZhaWx1cmUoc3RhdHVzLCBjb25maWcsIGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0Vycm9yIGluIGhhbmRsaW5nIGhlYWxpbmcgaW5zdHJ1bWVudGF0aW9uOiAnICsgZXJyKVxuICAgIH1cbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcblxuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi9ic3RhY2tMb2dnZXIuanMnXG5cbmNvbnN0IHdvcmtlcnNEYXRhRGlyUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycsICd3b3JrZXJfZGF0YScpXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhRnJvbVdvcmtlcnMoKXtcbiAgICBjb25zdCB3b3JrZXJzRGF0YTogUmVjb3JkPHN0cmluZywgb2JqZWN0PltdID0gW11cblxuICAgIGlmICghZnMuZXhpc3RzU3luYyh3b3JrZXJzRGF0YURpclBhdGgpKSB7XG4gICAgICAgIHJldHVybiB3b3JrZXJzRGF0YVxuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMod29ya2Vyc0RhdGFEaXJQYXRoKVxuICAgIGZpbGVzLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdSZWFkaW5nIHdvcmtlciBmaWxlICcgKyBmaWxlKVxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZXJzRGF0YURpclBhdGgsIGZpbGUpXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpXG4gICAgICAgIGNvbnN0IHdvcmtlckRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgICB3b3JrZXJzRGF0YS5wdXNoKHdvcmtlckRhdGEpXG4gICAgfSlcblxuICAgIC8vIFJlbW92ZSB3b3JrZXIgZGF0YSBhZnRlciBhbGwgcmVhZGluZ1xuICAgIHJlbW92ZVdvcmtlcnNEYXRhRGlyKClcblxuICAgIHJldHVybiB3b3JrZXJzRGF0YVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZVdvcmtlckRhdGEoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZXJzRGF0YURpclBhdGgsICd3b3JrZXItZGF0YS0nICsgcHJvY2Vzcy5waWQgKyAnLmpzb24nKVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY3JlYXRlV29ya2Vyc0RhdGFEaXIoKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRXhjZXB0aW9uIGluIHNhdmluZyB3b3JrZXIgZGF0YTogJyArIGUpXG4gICAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVXb3JrZXJzRGF0YURpcigpOiBib29sZWFuIHtcbiAgICBmcy5ybVN5bmMod29ya2Vyc0RhdGFEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVXb3JrZXJzRGF0YURpcigpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMod29ya2Vyc0RhdGFEaXJQYXRoKSkge1xuICAgICAgICBmcy5ta2RpclN5bmMod29ya2Vyc0RhdGFEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMsWUFBQUEsV0FBVSxZQUFBQyxXQUFVLFFBQUFDLE9BQU0sV0FBQUMsVUFBUyxRQUFBQyxPQUFNLGNBQWM7QUFDaEUsT0FBTyxZQUFZO0FBQ25CLE9BQU9DLFNBQVE7QUFDZixPQUFPLFVBQVU7QUFDakIsU0FBUyxRQUFRLGFBQUFDLGtCQUFpQjtBQUNsQyxPQUFPQyxXQUFVO0FBQ2pCLE9BQU9DLFdBQVU7QUFNakIsT0FBTyxpQkFBaUI7QUFDeEIsT0FBTyxlQUFlO0FBRXRCLFNBQVMsZUFBQUMsb0JBQW1COzs7QUNmNUIsT0FBTyxlQUFlO0FBRXRCLElBQU0sYUFBYTtBQUFBLEVBQ2YsTUFBTTtBQUFBLEVBQVEsT0FBTztBQUFBLEVBQVMsT0FBTztBQUFBLEVBQVMsT0FBTztBQUFBLEVBQVMsTUFBTTtBQUN4RTtBQUVBLElBQU0sYUFBTixjQUF5QixVQUFVO0FBQUEsRUFDL0IsZUFBZSxDQUFDLFFBQVEsV0FBVyxNQUFNLFVBQVUsQ0FBQyxFQUFFLE1BQW1CO0FBQ3JFLElBQUMsUUFBUSxLQUFrQixhQUFhLFFBQVEsR0FBRyxJQUFJO0FBQUEsTUFDbkQsWUFBVyxvQkFBSSxLQUFLLEdBQUUsWUFBWTtBQUFBLE1BQ2xDLE9BQU8sTUFBTSxZQUFZO0FBQUEsTUFDekIsU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUM7QUFBQSxNQUMvQixNQUFNO0FBQUEsTUFDTixlQUFlLENBQUM7QUFBQSxJQUNwQixDQUFDO0FBQUEsRUFDTDtBQUFBO0FBQUEsRUFHQSxRQUFRLElBQUksWUFBdUI7QUFDL0IsU0FB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QUEsSUFDSjtBQUNBLElBQUFBLEtBQUcsT0FBTyxVQUFVLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFBQSxFQUN2QztBQUNKO0FBRUEsS0FBSyxjQUFjLGFBQWE7IiwKICAibmFtZXMiOiBbImhvc3RuYW1lIiwgInBsYXRmb3JtIiwgInR5cGUiLCAidmVyc2lvbiIsICJhcmNoIiwgImZzIiwgInByb21pc2lmeSIsICJwYXRoIiwgInV0aWwiLCAicGVyZm9ybWFuY2UiLCAiZnMiLCAidXRpbCIsICJwYXRoIiwgImFyY2giLCAicGxhdGZvcm0iLCAiZnMiLCAicGF0aCIsICJwYXRoIiwgImZzIiwgImNoYWxrIiwgImxvZ2dlciIsICJsb2ciLCAibG9nZ2VyIiwgIkJTdGFja0xvZ2dlciIsICJwYXRoIiwgImZzIiwgImNoYWxrIiwgInBsYXRmb3JtIiwgIkJTdGFja0xvZ2dlciIsICJmcyIsICJ2ZXJzaW9uIiwgInBhdGgiLCAicHJvY2VzcyIsICJvcGVuUmVhZFN0cmVhbVByb21pc2UiLCAicGF0aCIsICJmcyIsICJ1dGlsIiwgInR5cGUiLCAicGxhdGZvcm0iLCAiYXJjaCIsICJmcyIsICJmcyIsICJncm91cCIsICJwYXRoIiwgImZzIiwgInByb21pc2lmeSIsICJ1dGlsIiwgInBlcmZvcm1hbmNlIiwgImxhdW5jaFRlc3RTZXNzaW9uIiwgImhvc3RuYW1lIiwgInBsYXRmb3JtIiwgInR5cGUiLCAidmVyc2lvbiIsICJhcmNoIiwgInV0aWwiLCAic3RvcEJ1aWxkVXBzdHJlYW0iLCAicGF0aCIsICJwYXRoIiwgImZzIiwgImdldFBsYXRmb3JtVmVyc2lvbiIsICJnZXRSZXNvbHZlZERldmljZU5hbWUiLCAicGF0aCIsICJoYXNoIiwgImZzIiwgInBhdGgiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAiZnMiLCAidXRpbCIsICJvcyIsICJ1dGlsIiwgImZvcm1hdCIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJ1dGlsIiwgInV0aWwiLCAiZnMiXQp9Cg==
4115
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWwudHMiLCAiLi4vc3JjL2xvZ1BhdGNoZXIudHMiLCAiLi4vc3JjL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIudHMiLCAiLi4vc3JjL2JzdGFja0xvZ2dlci50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vc3JjL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2FwaVV0aWxzLnRzIiwgIi4uL3NyYy9jbGkvY2xpVXRpbHMudHMiLCAiLi4vc3JjL2ZldGNoV3JhcHBlci50cyIsICIuLi9zcmMvaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2NsaUxvZ2dlci50cyIsICIuLi9zcmMvY2xpL2ZyYW1ld29ya3MvY29uc3RhbnRzL3Rlc3RGcmFtZXdvcmtDb25zdGFudHMudHMiLCAiLi4vc3JjL3Rlc3RIdWIvdXRpbHMudHMiLCAiLi4vc3JjL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLnRzIiwgIi4uL3NyYy9jcmFzaC1yZXBvcnRlci50cyIsICIuLi9zcmMvdGVzdE9wcy9mZWF0dXJlU3RhdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvZmVhdHVyZVVzYWdlLnRzIiwgIi4uL3NyYy90ZXN0T3BzL3Rlc3RPcHNDb25maWcudHMiLCAiLi4vc3JjL3Rlc3RPcHMvdXNhZ2VTdGF0cy50cyIsICIuLi9zcmMvc2NyaXB0cy9hY2Nlc3NpYmlsaXR5LXNjcmlwdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvb3BlblJ1bnNKb3VybmFsLnRzIiwgIi4uL3NyYy9jbGVhbnVwLnRzIiwgIi4uL3NyYy9pbnN0cnVtZW50YXRpb24vZnVubmVsSW5zdHJ1bWVudGF0aW9uLnRzIiwgIi4uL3NyYy9kYXRhLXN0b3JlLnRzIl0sCiAgInNvdXJjZVJvb3QiOiAiL2hvbWUvcnVubmVyL3dvcmsvd2Rpby1icm93c2Vyc3RhY2stc2VydmljZS93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlL3BhY2thZ2VzL2Jyb3dzZXJzdGFjay1zZXJ2aWNlIiwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGhvc3RuYW1lLCBwbGF0Zm9ybSwgdHlwZSwgdmVyc2lvbiwgYXJjaCwgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCB6bGliIGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB7IGZvcm1hdCwgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHV0aWwgZnJvbSAnbm9kZTp1dGlsJ1xuXG5pbXBvcnQgdHlwZSB7IENhcGFiaWxpdGllcywgRnJhbWV3b3JrcywgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBCZWZvcmVDb21tYW5kQXJncywgQWZ0ZXJDb21tYW5kQXJncyB9IGZyb20gJ0B3ZGlvL3JlcG9ydGVyJ1xuXG5pbXBvcnQgdHlwZSB7IEdpdFJlcG9JbmZvIH0gZnJvbSAnZ2l0LXJlcG8taW5mbydcbmltcG9ydCBnaXRSZXBvSW5mbyBmcm9tICdnaXQtcmVwby1pbmZvJ1xuaW1wb3J0IGdpdGNvbmZpZyBmcm9tICdnaXRjb25maWdsb2NhbCdcbmltcG9ydCB0eXBlIHsgQ29sb3JOYW1lIH0gZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBwZXJmb3JtYW5jZSB9IGZyb20gJ25vZGU6cGVyZl9ob29rcydcbmltcG9ydCBsb2dQYXRjaGVyIGZyb20gJy4vbG9nUGF0Y2hlci5qcydcbmltcG9ydCBQZXJmb3JtYW5jZVRlc3RlciBmcm9tICcuL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgKiBhcyBQRVJGT1JNQU5DRV9TREtfRVZFTlRTIGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IGxvZ0J1aWxkRXJyb3IsIGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eSwgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5LCBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSBCcm93c2VyU3RhY2tDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5pbXBvcnQgeyBPcmNoZXN0cmF0aW9uVXRpbHMgfSBmcm9tICcuL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLmpzJ1xuaW1wb3J0IHR5cGUgeyBFcnJvcnMgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSB7IFVzZXJDb25maWcsIFVwbG9hZFR5cGUsIEJyb3dzZXJzdGFja0NvbmZpZywgQnJvd3NlcnN0YWNrT3B0aW9ucywgTGF1bmNoUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHR5cGUgeyBJVGVzdENhc2VIb29rUGFyYW1ldGVyIH0gZnJvbSAnLi9jdWN1bWJlci10eXBlcy5qcydcbmltcG9ydCB7XG4gICAgQlJPV1NFUl9ERVNDUklQVElPTixcbiAgICBVUExPQURfTE9HU19FTkRQT0lOVCxcbiAgICBjb25zb2xlSG9sZGVyLFxuICAgIFRFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsXG4gICAgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0xUUyxcbiAgICBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQsXG4gICAgVEVTVE9QU19TQ1JFRU5TSE9UX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELFxuICAgIEJST1dTRVJTVEFDS19LSUxMX1NJR05BTCxcbiAgICBQRVJGX01FQVNVUkVNRU5UX0VOVixcbiAgICBSRVJVTl9FTlYsXG4gICAgQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRCxcbiAgICBNQVhfR0lUX01FVEFfREFUQV9TSVpFX0lOX0JZVEVTLFxuICAgIEdJVF9NRVRBX0RBVEFfVFJVTkNBVEVELFxuICAgIEFQUF9BTExZX0lTU1VFU19TVU1NQVJZX0VORFBPSU5ULFxuICAgIEFQUF9BTExZX0lTU1VFU19FTkRQT0lOVCxcbiAgICBDTElfREVCVUdfTE9HU19GSUxFLFxuICAgIFdESU9fTkFNSU5HX1BSRUZJWFxufSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCBDcmFzaFJlcG9ydGVyIGZyb20gJy4vY3Jhc2gtcmVwb3J0ZXIuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCBVc2FnZVN0YXRzIGZyb20gJy4vdGVzdE9wcy91c2FnZVN0YXRzLmpzJ1xuaW1wb3J0IFRlc3RPcHNDb25maWcgZnJvbSAnLi90ZXN0T3BzL3Rlc3RPcHNDb25maWcuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXJ0QmluU2Vzc2lvblJlc3BvbnNlIH0gZnJvbSAnLi9ncnBjL2luZGV4LmpzJ1xuaW1wb3J0IEFQSVV0aWxzIGZyb20gJy4vY2xpL2FwaVV0aWxzLmpzJ1xuaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAndGFyJ1xuXG5pbXBvcnQgQWNjZXNzaWJpbGl0eVNjcmlwdHMgZnJvbSAnLi9zY3JpcHRzL2FjY2Vzc2liaWxpdHktc2NyaXB0cy5qcydcblxuaW1wb3J0IHsgX2ZldGNoIGFzIGZldGNoIH0gZnJvbSAnLi9mZXRjaFdyYXBwZXIuanMnXG5cbmNvbnN0IHBHaXRjb25maWcgPSBwcm9taXNpZnkoZ2l0Y29uZmlnKVxuXG5leHBvcnQgdHlwZSBHaXRNZXRhRGF0YSA9IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgc2hhOiBzdHJpbmc7XG4gICAgc2hvcnRfc2hhOiBzdHJpbmc7XG4gICAgYnJhbmNoOiBzdHJpbmc7XG4gICAgdGFnOiBzdHJpbmcgfCBudWxsO1xuICAgIGNvbW1pdHRlcjogc3RyaW5nO1xuICAgIGNvbW1pdHRlcl9kYXRlOiBzdHJpbmc7XG4gICAgYXV0aG9yOiBzdHJpbmc7XG4gICAgYXV0aG9yX2RhdGU6IHN0cmluZztcbiAgICBjb21taXRfbWVzc2FnZTogc3RyaW5nO1xuICAgIHJvb3Q6IHN0cmluZztcbiAgICBjb21tb25fZ2l0X2Rpcjogc3RyaW5nO1xuICAgIHdvcmt0cmVlX2dpdF9kaXI6IHN0cmluZztcbiAgICBsYXN0X3RhZzogc3RyaW5nIHwgbnVsbDtcbiAgICBjb21taXRzX3NpbmNlX2xhc3RfdGFnOiBudW1iZXI7XG4gICAgcmVtb3RlczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHVybDogc3RyaW5nIH0+O1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRVFVRVNUX0NPTkZJRyA9IHtcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdYLUJTVEFDSy1PQlMnOiAndHJ1ZSdcbiAgICB9LFxufVxuXG5leHBvcnQgY29uc3QgQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCBDb2xvck5hbWU+ID0ge1xuICAgIGVycm9yOiAncmVkJyxcbiAgICB3YXJuOiAneWVsbG93JyxcbiAgICBpbmZvOiAnY3lhbkJyaWdodCcsXG4gICAgZGVidWc6ICdncmVlbicsXG4gICAgdHJhY2U6ICdjeWFuJyxcbiAgICBwcm9ncmVzczogJ21hZ2VudGEnXG59XG5cbi8qKlxuICogZ2V0IGJyb3dzZXIgZGVzY3JpcHRpb24gZm9yIEJyb3dzZXJzdGFjayBzZXJ2aWNlXG4gKiBAcGFyYW0gY2FwIGJyb3dzZXIgY2FwYWJsaXRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJEZXNjcmlwdGlvbihjYXA6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcykge1xuICAgIGNhcCA9IGNhcCB8fCB7fVxuICAgIGlmIChjYXBbJ2JzdGFjazpvcHRpb25zJ10pIHtcbiAgICAgICAgY2FwID0geyAuLi5jYXAsIC4uLmNhcFsnYnN0YWNrOm9wdGlvbnMnXSB9IGFzIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZXNlIGtleXMgZGVzY3JpYmUgdGhlIGJyb3dzZXIgdGhlIHRlc3Qgd2FzIHJ1biBvblxuICAgICAqL1xuICAgIHJldHVybiBCUk9XU0VSX0RFU0NSSVBUSU9OXG4gICAgICAgIC5tYXAoKGspID0+IChjYXApW2sgYXMga2V5b2YgdHlwZW9mIGNhcF0pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmpvaW4oJyAnKVxufVxuXG4vKipcbiAqIGdldCBjb3JyZWN0IGJyb3dzZXIgY2FwYWJpbGl0aWVzIG9iamVjdCBpbiBib3RoIG11bHRpcmVtb3RlIGFuZCBub3JtYWwgc2V0dXBzXG4gKiBAcGFyYW0gYnJvd3NlciBicm93c2VyIG9iamVjdFxuICogQHBhcmFtIGNhcHMgYnJvd3NlciBjYXBiaWxpdGllcyBvYmplY3QuIEluIGNhc2Ugb2YgbXVsdGlyZW1vdGUsIHRoZSBvYmplY3QgaXRzZWxmIHNob3VsZCBoYXZlIGEgcHJvcGVydHkgbmFtZWQgJ2NhcGFiaWxpdGllcydcbiAqIEBwYXJhbSBicm93c2VyTmFtZSBicm93c2VyIG5hbWUgaW4gY2FzZSBvZiBtdWx0aXJlbW90ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJvd3NlckNhcGFiaWxpdGllcyhicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyIHwgV2ViZHJpdmVySU8uTXVsdGlSZW1vdGVCcm93c2VyLCBjYXBzPzogQ2FwYWJpbGl0aWVzLlJlc29sdmVkVGVzdHJ1bm5lckNhcGFiaWxpdGllcywgYnJvd3Nlck5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWJyb3dzZXIuaXNNdWx0aXJlbW90ZSkge1xuICAgICAgICByZXR1cm4geyAuLi5icm93c2VyLmNhcGFiaWxpdGllcywgLi4uY2FwcyB9IGFzIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc1xuICAgIH1cblxuICAgIGNvbnN0IG11bHRpQ2FwcyA9IGNhcHMgYXMgQ2FwYWJpbGl0aWVzLlJlcXVlc3RlZE11bHRpcmVtb3RlQ2FwYWJpbGl0aWVzXG4gICAgY29uc3QgZ2xvYmFsQ2FwID0gYnJvd3Nlck5hbWUgJiYgYnJvd3Nlci5nZXRJbnN0YW5jZShicm93c2VyTmFtZSkgPyBicm93c2VyLmdldEluc3RhbmNlKGJyb3dzZXJOYW1lKS5jYXBhYmlsaXRpZXMgOiB7fVxuICAgIGNvbnN0IGNhcCA9IGJyb3dzZXJOYW1lICYmIG11bHRpQ2Fwc1ticm93c2VyTmFtZV0gPyBtdWx0aUNhcHNbYnJvd3Nlck5hbWVdLmNhcGFiaWxpdGllcyA6IHt9XG4gICAgcmV0dXJuIHsgLi4uZ2xvYmFsQ2FwLCAuLi5jYXAgfSBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNcbn1cblxuLyoqXG4gKiBjaGVjayBmb3IgYnJvd3NlcnN0YWNrIFczQyBjYXBhYmlsaXRpZXMuIERvZXMgbm90IHN1cHBvcnQgbGVnYWN5IGNhcGFiaWxpdGllc1xuICogQHBhcmFtIGNhcCBicm93c2VyIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2Vyc3RhY2tDYXBhYmlsaXR5KGNhcD86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcykge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgICBjYXAgJiZcbiAgICAgICAgICAgIGNhcFsnYnN0YWNrOm9wdGlvbnMnXSAmJlxuICAgICAgICAgICAgLy8gcmV0dXJuIGZhbHNlIGlmIHRoZSBvbmx5IGNhcCBpbiBic3RhY2s6b3B0aW9ucyBpcyB3ZGlvU2VydmljZSxcbiAgICAgICAgICAgIC8vIGFzIHRoYXQgaXMgYWRkZWQgYnkgdGhlIHNlcnZpY2UgYW5kIG5vdCBwcmVzZW50IGluIHVzZXIgcGFzc2VkIGNhcHNcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY2FwWydic3RhY2s6b3B0aW9ucyddKS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICBjYXBbJ2JzdGFjazpvcHRpb25zJ10ud2Rpb1NlcnZpY2VcbiAgICAgICAgICAgIClcbiAgICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJlbnRTdWl0ZU5hbWUoZnVsbFRpdGxlOiBzdHJpbmcsIHRlc3RTdWl0ZVRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZ1bGxUaXRsZVdvcmRzID0gZnVsbFRpdGxlLnNwbGl0KCcgJylcbiAgICBjb25zdCB0ZXN0U3VpdGVUaXRsZVdvcmRzID0gdGVzdFN1aXRlVGl0bGUuc3BsaXQoJyAnKVxuICAgIGNvbnN0IHNob3J0ZXN0TGVuZ3RoID0gTWF0aC5taW4oZnVsbFRpdGxlV29yZHMubGVuZ3RoLCB0ZXN0U3VpdGVUaXRsZVdvcmRzLmxlbmd0aClcbiAgICBsZXQgYyA9IDBcbiAgICBsZXQgcGFyZW50U3VpdGVOYW1lID0gJydcbiAgICB3aGlsZSAoYyA8IHNob3J0ZXN0TGVuZ3RoICYmIGZ1bGxUaXRsZVdvcmRzW2NdID09PSB0ZXN0U3VpdGVUaXRsZVdvcmRzW2NdKSB7XG4gICAgICAgIHBhcmVudFN1aXRlTmFtZSArPSBmdWxsVGl0bGVXb3Jkc1tjKytdICsgJyAnXG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRTdWl0ZU5hbWUudHJpbSgpXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NFcnJvcihlcnJvcjogRXJyb3IsIGZuOiBGdW5jdGlvbiwgYXJnczogdW5rbm93bltdKSB7XG4gICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiBleGVjdXRpbmcgJHtmbi5uYW1lfSB3aXRoIGFyZ3MgJHthcmdzfTogJHtlcnJvcn1gKVxuICAgIGxldCBhcmdzU3RyaW5nOiBzdHJpbmdcbiAgICB0cnkge1xuICAgICAgICBhcmdzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoYXJncylcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgYXJnc1N0cmluZyA9IHV0aWwuaW5zcGVjdChhcmdzLCB7IGRlcHRoOiAyIH0pXG4gICAgfVxuICAgIENyYXNoUmVwb3J0ZXIudXBsb2FkQ3Jhc2hSZXBvcnQoYEVycm9yIGluIGV4ZWN1dGluZyAke2ZuLm5hbWV9IHdpdGggYXJncyAke2FyZ3NTdHJpbmd9IDogJHtlcnJvcn1gLCBlcnJvciAmJiBlcnJvci5zdGFjayB8fCAndW5rbm93biBlcnJvcicpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvMTF5RXJyb3JIYW5kbGVyKGZuOiBGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgZnVuY3Rpb25Ub0hhbmRsZSA9IGZuXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnZbUEVSRl9NRUFTVVJFTUVOVF9FTlZdKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICBmdW5jdGlvblRvSGFuZGxlID0gcGVyZm9ybWFuY2UudGltZXJpZnkoZnVuY3Rpb25Ub0hhbmRsZSBhcyBhbnkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmdW5jdGlvblRvSGFuZGxlKC4uLmFyZ3MpXG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2F0Y2goZXJyb3IgPT4gcHJvY2Vzc0Vycm9yKGVycm9yLCBmbiwgYXJncykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBwcm9jZXNzRXJyb3IoZXJyb3IgYXMgRXJyb3IsIGZuLCBhcmdzKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JIYW5kbGVyKGZuOiBGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmdW5jdGlvblRvSGFuZGxlID0gZm5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZ1bmN0aW9uVG9IYW5kbGUoLi4uYXJncylcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5jYXRjaChlcnJvciA9PiBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIGluIGV4ZWN1dGluZyAke2ZuLm5hbWV9IHdpdGggYXJncyAke2FyZ3N9OiAke2Vycm9yfWApKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiBleGVjdXRpbmcgJHtmbi5uYW1lfSB3aXRoIGFyZ3MgJHthcmdzfTogJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbm9kZVJlcXVlc3QocmVxdWVzdFR5cGU6IHN0cmluZywgYXBpRW5kcG9pbnQ6IHN0cmluZywgb3B0aW9uczogUmVxdWVzdEluaXQsIGFwaVVybDogc3RyaW5nLCB0aW1lb3V0OiBudW1iZXIgPSAxMjAwMDApIHtcbiAgICB0cnkge1xuXG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXQpXG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9LyR7YXBpRW5kcG9pbnR9YCwge1xuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0VHlwZSxcbiAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIHRpbWVvdXQgYXMgdGhlIHJlcXVlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuXG4gICAgICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBpbiBmaXJpbmcgcmVxdWVzdCAke2FwaVVybH0vJHthcGlFbmRwb2ludH06ICR7Zm9ybWF0KGVycm9yKX1gKVxuICAgICAgICBjb25zdCBpc0xvZ1VwbG9hZCA9IGFwaUVuZHBvaW50ID09PSBVUExPQURfTE9HU19FTkRQT0lOVFxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZUpzb24gPSBlcnJvci5yZXNwb25zZS5ib2R5ID8gSlNPTi5wYXJzZShlcnJvci5yZXNwb25zZS5ib2R5LnRvU3RyaW5nKCkpIDogbnVsbFxuICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlSnNvbiA/IGVycm9yTWVzc2FnZUpzb24ubWVzc2FnZSA6IG51bGxcbiAgICAgICAgICAgIGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYCR7ZXJyb3JNZXNzYWdlfSAtICR7ZXJyb3Iuc3RhY2t9YFxuICAgICAgICAgICAgICAgIGlmIChpc0xvZ1VwbG9hZCkge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcobWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IobWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0xvZ1VwbG9hZCkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc0xvZ1VwbG9hZCkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGZpcmUgYXBpIHJlcXVlc3QgZHVlIHRvICR7ZXJyb3J9IC0gJHtlcnJvci5zdGFja31gKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBGYWlsZWQgdG8gZmlyZSBhcGkgcmVxdWVzdCBkdWUgdG8gJHtlcnJvcn0gLSAke2Vycm9yLnN0YWNrfWApXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBodHRwczovL3R1Z2F5aWxpay5tZWRpdW0uY29tL2Vycm9yLWhhbmRsaW5nLXZpYS10cnktY2F0Y2gtcHJveHktaW4tamF2YXNjcmlwdC01NDExNmRiZjc4M2Zcbi8qXG4gICAgQSBjbGFzcyB3cmFwcGVyIGZvciBlcnJvciBoYW5kbGluZy4gVGhlIHdyYXBwZXIgd3JhcHMgYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBjbGFzcyB3aXRoIGEgZXJyb3IgaGFuZGxlciBmdW5jdGlvbi5cbiAgICBJZiBhbnkgZXhjZXB0aW9uIG9jY3VycyBpbiBhbnkgb2YgdGhlIGNsYXNzIG1ldGhvZCwgdGhhdCB3aWxsIGdldCBjYXVnaHQgaW4gdGhlIHdyYXBwZXIgd2hpY2ggbG9ncyBhbmQgcmVwb3J0cyB0aGUgZXJyb3IuXG4gKi9cbnR5cGUgQ2xhc3NUeXBlID0geyBuZXcoLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93bjsgfSAvLyBBIGdlbmVyaWMgdHlwZSBmb3IgYSBjbGFzc1xuZXhwb3J0IGZ1bmN0aW9uIG8xMXlDbGFzc0Vycm9ySGFuZGxlcjxUIGV4dGVuZHMgQ2xhc3NUeXBlPihlcnJvckNsYXNzOiBUKTogVCB7XG4gICAgY29uc3QgcHJvdG90eXBlID0gZXJyb3JDbGFzcy5wcm90b3R5cGVcblxuICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90b3R5cGUpLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yQ2xhc3NcbiAgICB9XG5cbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90b3R5cGUpLmZvckVhY2goKG1ldGhvZE5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgbWV0aG9kID0gcHJvdG90eXBlW21ldGhvZE5hbWVdXG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nICYmIG1ldGhvZE5hbWUgIT09ICdjb25zdHJ1Y3RvcicgJiYgbWV0aG9kTmFtZSAhPT0gJ2NvbW1hbmRXcmFwcGVyJykge1xuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gcHJlc2VydmUgdGhpcyBjb250ZXh0LCBuZWVkIHRvIGRlZmluZSBsaWtlIHRoaXNcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90b3R5cGUsIG1ldGhvZE5hbWUsIHtcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSAocHJvY2Vzcy5lbnZbUEVSRl9NRUFTVVJFTUVOVF9FTlZdID8gcGVyZm9ybWFuY2UudGltZXJpZnkobWV0aG9kKSA6IG1ldGhvZCkuY2FsbCh0aGlzLCAuLi5hcmdzKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNhdGNoKGVycm9yID0+IHByb2Nlc3NFcnJvcihlcnJvciwgbWV0aG9kLCBhcmdzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcblxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcihlcnIgYXMgRXJyb3IsIG1ldGhvZCwgYXJncylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIGVycm9yQ2xhc3Ncbn1cblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NUZXN0T2JzZXJ2YWJpbGl0eVJlc3BvbnNlID0gKHJlc3BvbnNlOiBMYXVuY2hSZXNwb25zZSkgPT4ge1xuICAgIGlmICghcmVzcG9uc2Uub2JzZXJ2YWJpbGl0eSkge1xuICAgICAgICBoYW5kbGVFcnJvckZvck9ic2VydmFiaWxpdHkobnVsbClcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghcmVzcG9uc2Uub2JzZXJ2YWJpbGl0eS5zdWNjZXNzKSB7XG4gICAgICAgIGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eShyZXNwb25zZS5vYnNlcnZhYmlsaXR5IGFzIEVycm9ycylcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSA9ICd0cnVlJ1xuICAgIGlmIChyZXNwb25zZS5vYnNlcnZhYmlsaXR5Lm9wdGlvbnMuYWxsb3dfc2NyZWVuc2hvdHMpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnZbVEVTVE9QU19TQ1JFRU5TSE9UX0VOVl0gPSByZXNwb25zZS5vYnNlcnZhYmlsaXR5Lm9wdGlvbnMuYWxsb3dfc2NyZWVuc2hvdHMudG9TdHJpbmcoKVxuICAgIH1cbn1cblxuaW50ZXJmYWNlIERhdGFFbGVtZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBjb25zdCBqc29uaWZ5QWNjZXNzaWJpbGl0eUFycmF5ID0gKFxuICAgIGRhdGFBcnJheTogRGF0YUVsZW1lbnRbXSxcbiAgICBrZXlOYW1lOiBrZXlvZiBEYXRhRWxlbWVudCxcbiAgICB2YWx1ZU5hbWU6IGtleW9mIERhdGFFbGVtZW50XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICAgZGF0YUFycmF5LmZvckVhY2goKGVsZW1lbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIHJlc3VsdFtlbGVtZW50W2tleU5hbWVdIGFzIHN0cmluZ10gPSBlbGVtZW50W3ZhbHVlTmFtZV1cbiAgICB9KVxuICAgIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NBY2Nlc3NpYmlsaXR5UmVzcG9uc2UgPSAocmVzcG9uc2U6IExhdW5jaFJlc3BvbnNlIHwgU3RhcnRCaW5TZXNzaW9uUmVzcG9uc2UsIG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lcikgPT4ge1xuICAgIGlmICghcmVzcG9uc2UuYWNjZXNzaWJpbGl0eSkge1xuICAgICAgICBpZiAob3B0aW9ucy5hY2Nlc3NpYmlsaXR5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBoYW5kbGVFcnJvckZvckFjY2Vzc2liaWxpdHkobnVsbClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5hY2Nlc3NpYmlsaXR5LnN1Y2Nlc3MpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5KHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkgYXMgRXJyb3JzKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5vcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgYWNjZXNzaWJpbGl0eVRva2VuLCBwb2xsaW5nVGltZW91dCwgc2Nhbm5lclZlcnNpb24gfSA9IGpzb25pZnlBY2Nlc3NpYmlsaXR5QXJyYXkocmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5vcHRpb25zLmNhcGFiaWxpdGllcyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sICduYW1lJywgJ3ZhbHVlJylcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ganNvbmlmeUFjY2Vzc2liaWxpdHlBcnJheShyZXNwb25zZS5hY2Nlc3NpYmlsaXR5Lm9wdGlvbnMuY2FwYWJpbGl0aWVzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiwgJ25hbWUnLCAndmFsdWUnKVxuICAgICAgICBjb25zdCBzY3JpcHRzSnNvbiA9IHtcbiAgICAgICAgICAgICdzY3JpcHRzJzoganNvbmlmeUFjY2Vzc2liaWxpdHlBcnJheShyZXNwb25zZS5hY2Nlc3NpYmlsaXR5Lm9wdGlvbnMuc2NyaXB0cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sICduYW1lJywgJ2NvbW1hbmQnKSxcbiAgICAgICAgICAgICdjb21tYW5kcyc6IHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkub3B0aW9ucy5jb21tYW5kc1RvV3JhcD8uY29tbWFuZHMgPz8gW10sXG4gICAgICAgICAgICAnbm9uQlN0YWNrSW5mcmFBMTF5Q2hyb21lT3B0aW9ucyc6IHJlc3VsdFsnZ29vZzpjaHJvbWVPcHRpb25zJ11cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Nhbm5lclZlcnNpb24pIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1NDQU5ORVJfVkVSU0lPTiA9IHNjYW5uZXJWZXJzaW9uIGFzIHN0cmluZ1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBBY2Nlc3NpYmlsaXR5IHNjYW5uZXJWZXJzaW9uICR7c2Nhbm5lclZlcnNpb259YClcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWNjZXNzaWJpbGl0eVRva2VuKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1QgPSBhY2Nlc3NpYmlsaXR5VG9rZW4gYXMgc3RyaW5nXG4gICAgICAgICAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfQUNDRVNTSUJJTElUWV0gPSAndHJ1ZSdcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9sbGluZ1RpbWVvdXQpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1BPTExJTkdfVElNRU9VVCA9IHBvbGxpbmdUaW1lb3V0IGFzIHN0cmluZ1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY3JpcHRzSnNvbikge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBmaXggdHlwZVxuICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNjcmlwdHMudXBkYXRlKHNjcmlwdHNKc29uKVxuICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNjcmlwdHMuc3RvcmUoKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc0xhdW5jaEJ1aWxkUmVzcG9uc2UgPSAocmVzcG9uc2U6IExhdW5jaFJlc3BvbnNlLCBvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIpID0+IHtcbiAgICBpZiAob3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eSkge1xuICAgICAgICBwcm9jZXNzVGVzdE9ic2VydmFiaWxpdHlSZXNwb25zZShyZXNwb25zZSlcbiAgICB9XG4gICAgcHJvY2Vzc0FjY2Vzc2liaWxpdHlSZXNwb25zZShyZXNwb25zZSwgb3B0aW9ucylcbn1cblxuZXhwb3J0IGNvbnN0IGxhdW5jaFRlc3RTZXNzaW9uID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5URVNUSFVCX0VWRU5UUy5TVEFSVCwgbzExeUVycm9ySGFuZGxlcihhc3luYyBmdW5jdGlvbiBsYXVuY2hUZXN0U2Vzc2lvbihvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLCBic0NvbmZpZzogVXNlckNvbmZpZywgYlN0YWNrQ29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uPzogYm9vbGVhbikge1xuICAgIGNvbnN0IGxhdW5jaEJ1aWxkVXNhZ2UgPSBVc2FnZVN0YXRzLmdldEluc3RhbmNlKCkubGF1bmNoQnVpbGRVc2FnZVxuICAgIGxhdW5jaEJ1aWxkVXNhZ2UudHJpZ2dlcmVkKClcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIGZvcm1hdDogJ2pzb24nLFxuICAgICAgICBwcm9qZWN0X25hbWU6IGdldE9ic2VydmFiaWxpdHlQcm9qZWN0KG9wdGlvbnMsIGJzQ29uZmlnLnByb2plY3ROYW1lKSxcbiAgICAgICAgbmFtZTogZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkKG9wdGlvbnMsIGJzQ29uZmlnLmJ1aWxkTmFtZSksXG4gICAgICAgIGJ1aWxkX2lkZW50aWZpZXI6IGJzQ29uZmlnLmJ1aWxkSWRlbnRpZmllcixcbiAgICAgICAgc3RhcnRlZF9hdDogKG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHRhZ3M6IGdldE9ic2VydmFiaWxpdHlCdWlsZFRhZ3Mob3B0aW9ucywgYnNDb25maWcuYnVpbGRUYWcpLFxuICAgICAgICBob3N0X2luZm86IHtcbiAgICAgICAgICAgIGhvc3RuYW1lOiBob3N0bmFtZSgpLFxuICAgICAgICAgICAgcGxhdGZvcm06IHBsYXRmb3JtKCksXG4gICAgICAgICAgICB0eXBlOiB0eXBlKCksXG4gICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uKCksXG4gICAgICAgICAgICBhcmNoOiBhcmNoKClcbiAgICAgICAgfSxcbiAgICAgICAgY2lfaW5mbzogZ2V0Q2lJbmZvKCksXG4gICAgICAgIGJ1aWxkX3J1bl9pZGVudGlmaWVyOiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQlVJTERfUlVOX0lERU5USUZJRVIsXG4gICAgICAgIGZhaWxlZF90ZXN0c19yZXJ1bjogcHJvY2Vzcy5lbnZbUkVSVU5fRU5WXSB8fCBmYWxzZSxcbiAgICAgICAgdmVyc2lvbl9jb250cm9sOiBhd2FpdCBnZXRHaXRNZXRhRGF0YSgpLFxuICAgICAgICBhY2Nlc3NpYmlsaXR5OiB7XG4gICAgICAgICAgICBzZXR0aW5nczogb3B0aW9ucy5hY2Nlc3NpYmlsaXR5T3B0aW9uc1xuICAgICAgICB9LFxuICAgICAgICBicm93c2Vyc3RhY2tBdXRvbWF0aW9uOiBzaG91bGRBZGRTZXJ2aWNlVmVyc2lvbihjb25maWcsIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHkpLFxuICAgICAgICBmcmFtZXdvcmtfZGV0YWlsczoge1xuICAgICAgICAgICAgZnJhbWV3b3JrTmFtZTogV0RJT19OQU1JTkdfUFJFRklYICsgY29uZmlnLmZyYW1ld29yayxcbiAgICAgICAgICAgIGZyYW1ld29ya1ZlcnNpb246IGJzQ29uZmlnLmJzdGFja1NlcnZpY2VWZXJzaW9uLFxuICAgICAgICAgICAgc2RrVmVyc2lvbjogYnNDb25maWcuYnN0YWNrU2VydmljZVZlcnNpb24sXG4gICAgICAgICAgICBsYW5ndWFnZTogJ0VDTUFTY3JpcHQnLFxuICAgICAgICAgICAgdGVzdEZyYW1ld29yazoge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdXZWJkcml2ZXJJTycsXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogYnNDb25maWcuYnN0YWNrU2VydmljZVZlcnNpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJvZHVjdF9tYXA6IGdldFByb2R1Y3RNYXBGb3JCdWlsZFN0YXJ0Q2FsbChiU3RhY2tDb25maWcsIGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uKSxcbiAgICAgICAgY29uZmlnOiB7fSxcbiAgICAgICAgdGVzdF9vcmNoZXN0cmF0aW9uOiBPcmNoZXN0cmF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoY29uZmlnKT8uZ2V0QnVpbGRTdGFydERhdGEoKSB8fCB7fSxcbiAgICAgICAgdGVzdF9tYW5hZ2VtZW50OiB7XG4gICAgICAgICAgICB0ZXN0X3BsYW5faWQ6IGdldFRlc3RQbGFuSWQob3B0aW9ucylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbiAmJiAoaXNUdXJib1NjYWxlKG9wdGlvbnMpIHx8IGRhdGEuYnJvd3NlcnN0YWNrQXV0b21hdGlvbiA9PT0gZmFsc2UpKXtcbiAgICAgICAgZGF0YS5hY2Nlc3NpYmlsaXR5LnNldHRpbmdzID8/PSB7fVxuICAgICAgICBkYXRhLmFjY2Vzc2liaWxpdHkuc2V0dGluZ3MuaW5jbHVkZUVuY29kZWRFeHRlbnNpb24gPSB0cnVlXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKENyYXNoUmVwb3J0ZXIudXNlckNvbmZpZ0ZvclJlcG9ydGluZykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBDcmFzaFJlcG9ydGVyLnVzZXJDb25maWdGb3JSZXBvcnRpbmcgPSBwcm9jZXNzLmVudi5VU0VSX0NPTkZJR19GT1JfUkVQT1JUSU5HICE9PSB1bmRlZmluZWQgPyBKU09OLnBhcnNlKHByb2Nlc3MuZW52LlVTRVJfQ09ORklHX0ZPUl9SRVBPUlRJTkcpIDoge31cbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBCU3RhY2tMb2dnZXIuZXJyb3IoYFtDcmFzaF9SZXBvcnRfVXBsb2FkXSBGYWlsZWQgdG8gcGFyc2UgdXNlciBjb25maWcgd2hpbGUgc2VuZGluZyBidWlsZCBzdGFydCBldmVudCBkdWUgdG8gJHtlcnJvcn1gKVxuICAgIH1cbiAgICBkYXRhLmNvbmZpZyA9IENyYXNoUmVwb3J0ZXIudXNlckNvbmZpZ0ZvclJlcG9ydGluZ1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJVXRpbHMuREFUQV9FTkRQT0lOVH0vYXBpL3YyL2J1aWxkc2BcbiAgICAgICAgY29uc3QgZW5jb2RlZEF1dGggPSBCdWZmZXIuZnJvbShgJHtnZXRPYnNlcnZhYmlsaXR5VXNlcihvcHRpb25zLCBjb25maWcpfToke2dldE9ic2VydmFiaWxpdHlLZXkob3B0aW9ucywgY29uZmlnKX1gLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgLi4uREVGQVVMVF9SRVFVRVNUX0NPTkZJRy5oZWFkZXJzLFxuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7ZW5jb2RlZEF1dGh9YCxcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QganNvblJlc3BvbnNlOiBMYXVuY2hSZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgICBkZWxldGUgZGF0YT8uYWNjZXNzaWJpbGl0eT8uc2V0dGluZ3M/LmluY2x1ZGVFbmNvZGVkRXh0ZW5zaW9uXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1N0YXJ0X0J1aWxkXSBTdWNjZXNzIHJlc3BvbnNlOiAke0pTT04uc3RyaW5naWZ5KGpzb25SZXNwb25zZSl9YClcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUZXN0IFBsYW4gSWQgc2VudCBpbiByZXF1ZXN0OiAke2dldFRlc3RQbGFuSWQob3B0aW9ucyl9YClcbiAgICAgICAgcHJvY2Vzcy5lbnZbVEVTVE9QU19CVUlMRF9DT01QTEVURURfRU5WXSA9ICd0cnVlJ1xuICAgICAgICBpZiAoanNvblJlc3BvbnNlLmp3dCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXSA9IGpzb25SZXNwb25zZS5qd3RcbiAgICAgICAgfVxuICAgICAgICBpZiAoanNvblJlc3BvbnNlLmJ1aWxkX2hhc2hlZF9pZCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF0gPSBqc29uUmVzcG9uc2UuYnVpbGRfaGFzaGVkX2lkXG4gICAgICAgICAgICBUZXN0T3BzQ29uZmlnLmdldEluc3RhbmNlKCkuYnVpbGRIYXNoZWRJZCA9IGpzb25SZXNwb25zZS5idWlsZF9oYXNoZWRfaWRcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGBUZXN0aHViIHN0YXJ0ZWQgd2l0aCBpZDogJHtUZXN0T3BzQ29uZmlnLmdldEluc3RhbmNlKCk/LmJ1aWxkSGFzaGVkSWR9YClcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzTGF1bmNoQnVpbGRSZXNwb25zZShqc29uUmVzcG9uc2UsIG9wdGlvbnMpXG4gICAgICAgIGxhdW5jaEJ1aWxkVXNhZ2Uuc3VjY2VzcygpXG4gICAgICAgIHJldHVybiBqc29uUmVzcG9uc2VcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFRlc3RIdWIgYnVpbGQgc3RhcnQgZmFpbGVkOiAke2Zvcm1hdChlcnJvcil9YClcbiAgICAgICAgaWYgKCEoZXJyb3IgYXMgRXJyb3IgJiB7IHN1Y2Nlc3M6IGJvb2xlYW4gfSkuc3VjY2Vzcykge1xuICAgICAgICAgICAgbGF1bmNoQnVpbGRVc2FnZS5mYWlsZWQoZXJyb3IpXG4gICAgICAgICAgICBsb2dCdWlsZEVycm9yKGVycm9yIGFzIEVycm9ycylcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICB9XG59KSlcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUNhcHNXaXRoQXBwQTExeSA9IChwbGF0Zm9ybU1ldGE/OiB7IFtrZXk6IHN0cmluZ106IGFueTsgfSkgPT4ge1xuICAgIC8qIENoZWNrIGlmIHRoZSBjdXJyZW50IGRyaXZlciBwbGF0Zm9ybSBpcyBlbGlnaWJsZSBmb3IgQXBwQWNjZXNzaWJpbGl0eSBzY2FuICovXG4gICAgaWYgKFxuICAgICAgICAocGxhdGZvcm1NZXRhPy5wbGF0Zm9ybV9uYW1lICYmIFN0cmluZyhwbGF0Zm9ybU1ldGE/LnBsYXRmb3JtX25hbWUpLnRvTG93ZXJDYXNlKCkgPT09ICdhbmRyb2lkJykgJiZcbiAgICAgICAgKHBsYXRmb3JtTWV0YT8ucGxhdGZvcm1fdmVyc2lvbiAmJiBwYXJzZUludChwbGF0Zm9ybU1ldGE/LnBsYXRmb3JtX3ZlcnNpb24/LnRvU3RyaW5nKCkpIDwgMTEpXG4gICAgKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBcHAgQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHRlc3RzIGFyZSBzdXBwb3J0ZWQgb24gT1MgdmVyc2lvbiAxMSBhbmQgYWJvdmUgZm9yIEFuZHJvaWQgZGV2aWNlcy4nKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUNhcHNXaXRoQTExeSA9IChkZXZpY2VOYW1lPzogYW55LCBwbGF0Zm9ybU1ldGE/OiB7IFtrZXk6IHN0cmluZ106IGFueTsgfSwgY2hyb21lT3B0aW9ucz86IGFueSkgPT4ge1xuICAgIC8qIENoZWNrIGlmIHRoZSBjdXJyZW50IGRyaXZlciBwbGF0Zm9ybSBpcyBlbGlnaWJsZSBmb3IgQWNjZXNzaWJpbGl0eSBzY2FuICovXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGRldmljZU5hbWUpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gd2lsbCBydW4gb25seSBvbiBEZXNrdG9wIGJyb3dzZXJzLicpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwbGF0Zm9ybU1ldGE/LmJyb3dzZXJfbmFtZT8udG9Mb3dlckNhc2UoKSAhPT0gJ2Nocm9tZScpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gd2lsbCBydW4gb25seSBvbiBDaHJvbWUgYnJvd3NlcnMuJylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJyb3dzZXJWZXJzaW9uID0gcGxhdGZvcm1NZXRhPy5icm93c2VyX3ZlcnNpb25cbiAgICAgICAgaWYgKCAhaXNVbmRlZmluZWQoYnJvd3NlclZlcnNpb24pICYmICEoYnJvd3NlclZlcnNpb24gPT09ICdsYXRlc3QnIHx8IHBhcnNlRmxvYXQoYnJvd3NlclZlcnNpb24gKyAnJykgPiA5NCkpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gd2lsbCBydW4gb25seSBvbiBDaHJvbWUgYnJvd3NlciB2ZXJzaW9uIGdyZWF0ZXIgdGhhbiA5NC4nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hyb21lT3B0aW9ucz8uYXJncz8uaW5jbHVkZXMoJy0taGVhZGxlc3MnKSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0FjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB3aWxsIG5vdCBydW4gb24gbGVnYWN5IGhlYWRsZXNzIG1vZGUuIFN3aXRjaCB0byBuZXcgaGVhZGxlc3MgbW9kZSBvciBhdm9pZCB1c2luZyBoZWFkbGVzcyBtb2RlLicpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXhjZXB0aW9uIGluIGNoZWNraW5nIGNhcGFiaWxpdGllcyBjb21wYXRpYmlsaXR5IHdpdGggQWNjZXNzaWJpbGl0eS4gRXJyb3I6ICR7ZXJyb3J9YClcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUNhcHNXaXRoTm9uQnN0YWNrQTExeSA9IChicm93c2VyTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZCwgYnJvd3NlclZlcnNpb24/OnN0cmluZyB8IHVuZGVmaW5lZCApICA9PiB7XG5cbiAgICBpZiAoYnJvd3Nlck5hbWU/LnRvTG93ZXJDYXNlKCkgIT09ICdjaHJvbWUnKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gd2lsbCBydW4gb25seSBvbiBDaHJvbWUgYnJvd3NlcnMuJylcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICghaXNVbmRlZmluZWQoYnJvd3NlclZlcnNpb24pICYmICEoYnJvd3NlclZlcnNpb24gPT09ICdsYXRlc3QnIHx8IHBhcnNlRmxvYXQoYnJvd3NlclZlcnNpb24gKyAnJykgPiAxMDApKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gd2lsbCBydW4gb25seSBvbiBDaHJvbWUgYnJvd3NlciB2ZXJzaW9uIGdyZWF0ZXIgdGhhbiAxMDAuJylcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG5cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFNjYW5UZXN0Rm9yQWNjZXNzaWJpbGl0eSA9IChzdWl0ZVRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlc3RUaXRsZTogc3RyaW5nLCBhY2Nlc3NpYmlsaXR5T3B0aW9ucz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9LCB3b3JsZD86IHsgW2tleTogc3RyaW5nXTogdW5rbm93bjsgfSwgaXNDdWN1bWJlcj86IGJvb2xlYW4gKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaW5jbHVkZVRhZ3MgPSBBcnJheS5pc0FycmF5KGFjY2Vzc2liaWxpdHlPcHRpb25zPy5pbmNsdWRlVGFnc0luVGVzdGluZ1Njb3BlKSA/IGFjY2Vzc2liaWxpdHlPcHRpb25zPy5pbmNsdWRlVGFnc0luVGVzdGluZ1Njb3BlIDogW11cbiAgICAgICAgY29uc3QgZXhjbHVkZVRhZ3MgPSBBcnJheS5pc0FycmF5KGFjY2Vzc2liaWxpdHlPcHRpb25zPy5leGNsdWRlVGFnc0luVGVzdGluZ1Njb3BlKSA/IGFjY2Vzc2liaWxpdHlPcHRpb25zPy5leGNsdWRlVGFnc0luVGVzdGluZ1Njb3BlIDogW11cblxuICAgICAgICBpZiAoaXNDdWN1bWJlcikge1xuICAgICAgICAgICAgY29uc3QgdGFnc0xpc3Q6IHN0cmluZ1tdID0gW11cbiAgICAgICAgICAgIDsod29ybGQ/LnBpY2tsZSBhcyB7IHRhZ3M6IHsgbmFtZTogc3RyaW5nIH1bXSB9KT8udGFncy5tYXAoKHRhZzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0pID0+IHRhZ3NMaXN0LnB1c2godGFnLm5hbWUpKVxuICAgICAgICAgICAgY29uc3QgZXhjbHVkZWQgPSBleGNsdWRlVGFncz8uc29tZSgoZXhjbHVkZSkgPT4gdGFnc0xpc3QuaW5jbHVkZXMoZXhjbHVkZSkpXG4gICAgICAgICAgICBjb25zdCBpbmNsdWRlZCA9IGluY2x1ZGVUYWdzPy5sZW5ndGggPT09IDAgfHwgaW5jbHVkZVRhZ3M/LnNvbWUoKGluY2x1ZGUpID0+IHRhZ3NMaXN0LmluY2x1ZGVzKGluY2x1ZGUpKVxuXG4gICAgICAgICAgICByZXR1cm4gIWV4Y2x1ZGVkICYmIGluY2x1ZGVkXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmdWxsVGVzdE5hbWUgPSBzdWl0ZVRpdGxlICsgJyAnICsgdGVzdFRpdGxlXG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVkID0gZXhjbHVkZVRhZ3M/LnNvbWUoKGV4Y2x1ZGUpID0+IGZ1bGxUZXN0TmFtZS5pbmNsdWRlcyhleGNsdWRlKSlcbiAgICAgICAgY29uc3QgaW5jbHVkZWQgPSBpbmNsdWRlVGFncz8ubGVuZ3RoID09PSAwIHx8IGluY2x1ZGVUYWdzPy5zb21lKChpbmNsdWRlKSA9PiBmdWxsVGVzdE5hbWUuaW5jbHVkZXMoaW5jbHVkZSkpXG5cbiAgICAgICAgcmV0dXJuICFleGNsdWRlZCAmJiBpbmNsdWRlZFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3Igd2hpbGUgdmFsaWRhdGluZyB0ZXN0IGNhc2UgZm9yIGFjY2Vzc2liaWxpdHkgYmVmb3JlIHNjYW5uaW5nLiBFcnJvciA6ICR7ZXJyb3J9YClcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBpc0FjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbiA9IChhY2Nlc3NpYmlsaXR5RmxhZz86IGJvb2xlYW4gfCBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGFzQTExeUp3dFRva2VuID0gdHlwZW9mIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCA9PT0gJ3N0cmluZycgJiYgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldULmxlbmd0aCA+IDAgJiYgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldUICE9PSAnbnVsbCcgJiYgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldUICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICByZXR1cm4gYWNjZXNzaWJpbGl0eUZsYWcgJiYgaGFzQTExeUp3dFRva2VuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFeGNlcHRpb24gaW4gdmVyaWZ5aW5nIHRoZSBBY2Nlc3NpYmlsaXR5IHNlc3Npb24gd2l0aCBlcnJvciA6ICR7ZXJyb3J9YClcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBBUFBfQVVUT01BVEVfQ0FQX0tFWVMgPSBbJ2FwcGl1bTphcHAnLCAnYXBwaXVtOmJ1bmRsZUlkJywgJ2FwcGl1bTphcHBQYWNrYWdlJywgJ2FwcGl1bTphcHBBY3Rpdml0eSddIGFzIGNvbnN0XG5cbi8vIEFuIEFwcCBBdXRvbWF0ZSBzZXNzaW9uIGlzIGlkZW50aWZpZWQgYnkgYW4gYXBwIGNhcGFiaWxpdHkgb24gdGhlIGRyaXZlciBjYXBzXG4vLyAoYXBwaXVtOmFwcCAvIGFwcGl1bTpidW5kbGVJZCAvIGFwcGl1bTphcHBQYWNrYWdlIC8gYXBwaXVtOmFwcEFjdGl2aXR5IC8gYXBwaXVtOm9wdGlvbnMuYXBwKS5cbi8vIFNoYXJlZCBieSBjb25maWctdGltZSBkZXRlY3Rpb24gYW5kIHRoZSBDTEkgQXV0b21hdGUvUGVyY3kgbW9kdWxlcyBzbyBBcHAtQXV0b21hdGVcbi8vIGVuZHBvaW50IHJvdXRpbmcgc3RheXMgY29uc2lzdGVudCBhY3Jvc3MgZXZlcnkgcGxhY2UgdGhhdCByZXNvbHZlcyBpdCBmcm9tIGNhcGFiaWxpdGllcy5cbmV4cG9ydCBmdW5jdGlvbiBoYXNBcHBDYXAoY2FwPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjYXAgfHwgdHlwZW9mIGNhcCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IHJlY29yZCA9IGNhcCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIGlmIChBUFBfQVVUT01BVEVfQ0FQX0tFWVMuc29tZShrZXkgPT4gIWlzVW5kZWZpbmVkKHJlY29yZFtrZXldKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgY29uc3QgYXBwaXVtT3B0aW9ucyA9IHJlY29yZFsnYXBwaXVtOm9wdGlvbnMnXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZFxuICAgIHJldHVybiAhIShhcHBpdW1PcHRpb25zICYmICFpc1VuZGVmaW5lZChhcHBpdW1PcHRpb25zLmFwcCkpXG59XG5cbmV4cG9ydCBjb25zdCBpc0FwcEFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbiA9IChhY2Nlc3NpYmlsaXR5RmxhZz86IGJvb2xlYW4gfCBzdHJpbmcsIGlzQXBwQXV0b21hdGU/OiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgYWNjZXNzaWJpbGl0eUF1dG9tYXRpb24gPSBpc0FjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihhY2Nlc3NpYmlsaXR5RmxhZylcbiAgICByZXR1cm4gYWNjZXNzaWJpbGl0eUF1dG9tYXRpb24gJiYgaXNBcHBBdXRvbWF0ZVxufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0U3RyaW5nID0gKHRlbXBsYXRlOiAoc3RyaW5nIHwgbnVsbCksIC4uLnZhbHVlczogKHN0cmluZyB8IG51bGwpW10pOiBzdHJpbmcgPT4ge1xuICAgIGxldCBpID0gMFxuICAgIGlmICh0ZW1wbGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJydcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoLyVzL2csICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaSsrXVxuICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogJydcbiAgICB9KVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNvbnN0IF9nZXRQYXJhbXNGb3JBcHBBY2Nlc3NpYmlsaXR5ID0gKCBjb21tYW5kTmFtZT86IHN0cmluZywgdGVzdE5hbWU/OiBzdHJpbmcsIGhvb2tSdW5VdWlkPzogc3RyaW5nIHwgbnVsbCApOiB7IHRoVGVzdFJ1blV1aWQ6IGFueSwgdGhIb29rUnVuVXVpZDogYW55LCB0aEJ1aWxkVXVpZDogYW55LCB0aEp3dFRva2VuOiBhbnksIGF1dGhIZWFkZXI6IGFueSwgc2NhblRpbWVzdGFtcDogbnVtYmVyLCBtZXRob2Q6IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVzdE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCAgfSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3RoVGVzdFJ1blV1aWQnOiBwcm9jZXNzLmVudi5URVNUX0FOQUxZVElDU19JRCxcbiAgICAgICAgLy8gUHJlc2VudCBvbmx5IHdoZW4gdGhlIHNjYW4gZmlyZXMgaW5zaWRlIGEgaG9vayAoZHJvcHBlZCBieSBKU09OLnN0cmluZ2lmeSB3aGVuIHVuZGVmaW5lZCxcbiAgICAgICAgLy8gc28gaW4tdGVzdCBzY2FucyBhcmUgdW5jaGFuZ2VkKS4gU2VsZW5pdW1IdWIgYXBwQWxseUhhbmRsZXIgcmVsYXlzIHRoaXMgYXMgYGhvb2tfcnVuX3V1aWRgLlxuICAgICAgICAndGhIb29rUnVuVXVpZCc6IGhvb2tSdW5VdWlkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgJ3RoQnVpbGRVdWlkJzogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRCxcbiAgICAgICAgJ3RoSnd0VG9rZW4nOiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsXG4gICAgICAgICdhdXRoSGVhZGVyJzogcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldULFxuICAgICAgICAnc2NhblRpbWVzdGFtcCc6IERhdGUubm93KCksXG4gICAgICAgICdtZXRob2QnOiBjb21tYW5kTmFtZSxcbiAgICAgICAgJ3Rlc3ROYW1lJzogdGVzdE5hbWVcbiAgICB9XG59XG5cbi8qIGVzbGludC1kaXNhYmxlICBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5leHBvcnQgY29uc3QgcGVyZm9ybUExMXlTY2FuID0gYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIgfCBXZWJkcml2ZXJJTy5NdWx0aVJlbW90ZUJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcsICBjb21tYW5kTmFtZT86IHN0cmluZywgdGVzdE5hbWU/OiBzdHJpbmcsIGhvb2tSdW5VdWlkPzogc3RyaW5nIHwgbnVsbCwpIDogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IGFueTsgfSB8IHVuZGVmaW5lZD4gPT4ge1xuXG4gICAgaWYgKCFpc0FjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHkpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCBwZXJmb3JtIEFjY2Vzc2liaWxpdHkgc2Nhbi4nKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBpZiAoaXNBcHBBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5LCBpc0FwcEF1dG9tYXRlKSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0czogdW5rbm93biA9IGF3YWl0IChicm93c2VyIGFzIFdlYmRyaXZlcklPLkJyb3dzZXIpLmV4ZWN1dGUoZm9ybWF0U3RyaW5nKEFjY2Vzc2liaWxpdHlTY3JpcHRzLnBlcmZvcm1TY2FuLCBKU09OLnN0cmluZ2lmeShfZ2V0UGFyYW1zRm9yQXBwQWNjZXNzaWJpbGl0eShjb21tYW5kTmFtZSwgdGVzdE5hbWUsIGhvb2tSdW5VdWlkKSkpIGFzIHN0cmluZywge30pXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcodXRpbC5mb3JtYXQocmVzdWx0cyBhcyBzdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuICggcmVzdWx0cyBhcyB7IFtrZXk6IHN0cmluZ106IGFueTsgfSB8IHVuZGVmaW5lZCApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlTY3JpcHRzLnBlcmZvcm1TY2FuKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZXhlY3V0ZUFjY2Vzc2liaWxpdHlTY3JpcHQoYnJvd3NlciwgQWNjZXNzaWJpbGl0eVNjcmlwdHMucGVyZm9ybVNjYW4sIHsgbWV0aG9kOiBjb21tYW5kTmFtZSB8fCAnJyB9KVxuICAgICAgICAgICAgcmV0dXJuICggcmVzdWx0cyBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd247IH0gfCB1bmRlZmluZWQgKVxuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignQWNjZXNzaWJpbGl0eVNjcmlwdHMucGVyZm9ybVNjYW4gaXMgbnVsbCcpXG4gICAgICAgIHJldHVyblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0FjY2Vzc2liaWxpdHkgU2NhbiBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIDogJyArIGVycilcbiAgICAgICAgcmV0dXJuXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0QTExeVJlc3VsdHMgPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLkExMVlfRVZFTlRTLkdFVF9SRVNVTFRTLCBhc3luYyAoaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgaXNCcm93c2VyU3RhY2tTZXNzaW9uPzogYm9vbGVhbiwgaXNBY2Nlc3NpYmlsaXR5PzogYm9vbGVhbiB8IHN0cmluZykgOiBQcm9taXNlPEFycmF5PHsgW2tleTogc3RyaW5nXTogYW55OyB9Pj4gPT4ge1xuXG4gICAgaWYgKCFpc0FjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHkpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMuJylcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdQZXJmb3JtaW5nIHNjYW4gYmVmb3JlIGdldHRpbmcgcmVzdWx0cycpXG4gICAgICAgIGF3YWl0IHBlcmZvcm1BMTF5U2Nhbihpc0FwcEF1dG9tYXRlLCBicm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24sIGlzQWNjZXNzaWJpbGl0eSlcbiAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHM6IEFycmF5PHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9PiA9IGF3YWl0IGV4ZWN1dGVBY2Nlc3NpYmlsaXR5U2NyaXB0KGJyb3dzZXIsIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHMpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignQWNjZXNzaWJpbGl0eVNjcmlwdHMuZ2V0UmVzdWx0cyBpcyBudWxsJylcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ05vIGFjY2Vzc2liaWxpdHkgcmVzdWx0cyB3ZXJlIGZvdW5kLicpXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgZ2V0QTExeVJlc3VsdHMgRmFpbGVkLiBFcnJvcjogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG59KVxuXG5leHBvcnQgY29uc3QgZ2V0QXBwQTExeVJlc3VsdHMgPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLkExMVlfRVZFTlRTLkdFVF9SRVNVTFRTLCBhc3luYyAoaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgIHRlc3ROYW1lOiBzdHJpbmcsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcsIHNlc3Npb25JZD86IHN0cmluZyB8IG51bGwpIDogUHJvbWlzZTxBcnJheTx7IFtrZXk6IHN0cmluZ106IGFueTsgfT4+ID0+IHtcbiAgICBpZiAoIWlzQnJvd3NlclN0YWNrU2Vzc2lvbikge1xuICAgICAgICByZXR1cm4gW10gLy8gc2luY2Ugd2UgYXJlIHJ1bm5pbmcgb25seSBvbiBBdXRvbWF0ZSBhcyBvZiBub3dcbiAgICB9XG5cbiAgICBpZiAoIWlzQXBwQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGlzQWNjZXNzaWJpbGl0eSwgaXNBcHBBdXRvbWF0ZSkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ05vdCBhbiBBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gc2Vzc2lvbiwgY2Fubm90IHJldHJpZXZlIEFjY2Vzc2liaWxpdHkgcmVzdWx0cyBzdW1tYXJ5LicpXG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke0FQSVV0aWxzLkFQUF9BTExZX0VORFBPSU5UfS8ke0FQUF9BTExZX0lTU1VFU19FTkRQT0lOVH1gXG4gICAgICAgIGNvbnN0IGFwaVJlc3BvbmUgPSBhd2FpdCBnZXRBcHBBMTF5UmVzdWx0UmVzcG9uc2UoYXBpVXJsLCBpc0FwcEF1dG9tYXRlLCBicm93c2VyLCB0ZXN0TmFtZSwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHksIHNlc3Npb25JZClcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBpUmVzcG9uZT8uZGF0YT8uZGF0YT8uaXNzdWVzXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgUG9sbGluZyBSZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkgIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdObyBhY2Nlc3NpYmlsaXR5IHN1bW1hcnkgd2FzIGZvdW5kLicpXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgZ2V0QXBwQTExeVJlc3VsdHMgRmFpbGVkLiBFcnJvcjogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG59KVxuXG5leHBvcnQgY29uc3QgZ2V0QXBwQTExeVJlc3VsdHNTdW1tYXJ5ID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5BMTFZX0VWRU5UUy5HRVRfUkVTVUxUU19TVU1NQVJZLCBhc3luYyAoaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgdGVzdE5hbWU6IHN0cmluZywgaXNCcm93c2VyU3RhY2tTZXNzaW9uPzogYm9vbGVhbiwgaXNBY2Nlc3NpYmlsaXR5PzogYm9vbGVhbiB8IHN0cmluZywgc2Vzc2lvbklkPzogc3RyaW5nIHwgbnVsbCkgOiBQcm9taXNlPHsgW2tleTogc3RyaW5nXTogYW55OyB9PiA9PiB7XG4gICAgaWYgKCFpc0Jyb3dzZXJTdGFja1Nlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHt9IC8vIHNpbmNlIHdlIGFyZSBydW5uaW5nIG9ubHkgb24gQXV0b21hdGUgYXMgb2Ygbm93XG4gICAgfVxuXG4gICAgaWYgKCFpc0FwcEFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHksIGlzQXBwQXV0b21hdGUpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMgc3VtbWFyeS4nKVxuICAgICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHtBUElVdGlscy5BUFBfQUxMWV9FTkRQT0lOVH0vJHtBUFBfQUxMWV9JU1NVRVNfU1VNTUFSWV9FTkRQT0lOVH1gXG4gICAgICAgIGNvbnN0IGFwaVJlc3BvbmUgPSBhd2FpdCBnZXRBcHBBMTF5UmVzdWx0UmVzcG9uc2UoYXBpVXJsLCBpc0FwcEF1dG9tYXRlLCBicm93c2VyLCB0ZXN0TmFtZSwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHksIHNlc3Npb25JZClcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBpUmVzcG9uZT8uZGF0YT8uZGF0YT8uc3VtbWFyeVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFBvbGxpbmcgUmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0gY2F0Y2gge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ05vIGFjY2Vzc2liaWxpdHkgc3VtbWFyeSB3YXMgZm91bmQuJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxufSlcblxuY29uc3QgZ2V0QXBwQTExeVJlc3VsdFJlc3BvbnNlID0gYXN5bmMgKGFwaVVybDogc3RyaW5nLCBpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyLCB0ZXN0TmFtZTogc3RyaW5nLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nLCBzZXNzaW9uSWQ/OiBzdHJpbmcgfCBudWxsKSA6IFByb21pc2U8UG9sbGluZ1Jlc3VsdD4gPT4ge1xuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnUGVyZm9ybWluZyBzY2FuIGJlZm9yZSBnZXR0aW5nIHJlc3VsdHMgc3VtbWFyeScpXG4gICAgYXdhaXQgcGVyZm9ybUExMXlTY2FuKGlzQXBwQXV0b21hdGUsIGJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbiwgaXNBY2Nlc3NpYmlsaXR5LCB1bmRlZmluZWQsIHRlc3ROYW1lKVxuICAgIGNvbnN0IHVwcGVyVGltZUxpbWl0ID0gcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfUE9MTElOR19USU1FT1VUID8gRGF0ZS5ub3coKSArIHBhcnNlSW50KHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1BPTExJTkdfVElNRU9VVCkgKiAxMDAwIDogRGF0ZS5ub3coKSArIDMwMDAwXG4gICAgY29uc3QgcGFyYW1zID0geyB0ZXN0X3J1bl91dWlkOiBwcm9jZXNzLmVudi5URVNUX0FOQUxZVElDU19JRCwgc2Vzc2lvbl9pZDogc2Vzc2lvbklkLCB0aW1lc3RhbXA6IERhdGUubm93KCkgfSAvLyBRdWVyeSBwYXJhbXMgdG8gcGFzc1xuICAgIGNvbnN0IGhlYWRlciA9IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Byb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVH1gIH1cbiAgICBjb25zdCBhcGlSZXNwb25lID0gYXdhaXQgcG9sbEFwaShhcGlVcmwsIHBhcmFtcywgaGVhZGVyLCB1cHBlclRpbWVMaW1pdClcbiAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFBvbGxpbmcgUmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KGFwaVJlc3BvbmUpfWApXG4gICAgcmV0dXJuIGFwaVJlc3BvbmVcbn1cblxuZXhwb3J0IGNvbnN0IGdldEExMXlSZXN1bHRzU3VtbWFyeSA9IFBlcmZvcm1hbmNlVGVzdGVyLm1lYXN1cmVXcmFwcGVyKFBFUkZPUk1BTkNFX1NES19FVkVOVFMuQTExWV9FVkVOVFMuR0VUX1JFU1VMVFNfU1VNTUFSWSwgYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcpIDogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IGFueTsgfT4gPT4ge1xuXG4gICAgaWYgKCFpc0FjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHkpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMgc3VtbWFyeS4nKVxuICAgICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1BlcmZvcm1pbmcgc2NhbiBiZWZvcmUgZ2V0dGluZyByZXN1bHRzIHN1bW1hcnknKVxuICAgICAgICBhd2FpdCBwZXJmb3JtQTExeVNjYW4oaXNBcHBBdXRvbWF0ZSwgYnJvd3NlciwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHkpXG4gICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzU3VtbWFyeSkge1xuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeVJlc3VsdHM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93bjsgfSA9IGF3YWl0IGV4ZWN1dGVBY2Nlc3NpYmlsaXR5U2NyaXB0KGJyb3dzZXIsIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHNTdW1tYXJ5KVxuICAgICAgICAgICAgcmV0dXJuIHN1bW1hcnlSZXN1bHRzXG4gICAgICAgIH1cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzU3VtbWFyeSBpcyBudWxsJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignTm8gYWNjZXNzaWJpbGl0eSBzdW1tYXJ5IHdhcyBmb3VuZC4nKVxuICAgICAgICByZXR1cm4ge31cbiAgICB9XG59KVxuXG5leHBvcnQgY29uc3Qgc3RvcEJ1aWxkVXBzdHJlYW0gPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLlRFU1RIVUJfRVZFTlRTLlNUT1AsIG8xMXlFcnJvckhhbmRsZXIoYXN5bmMgZnVuY3Rpb24gc3RvcEJ1aWxkVXBzdHJlYW0oKSB7XG4gICAgY29uc3Qgc3RvcEJ1aWxkVXNhZ2UgPSBVc2FnZVN0YXRzLmdldEluc3RhbmNlKCkuc3RvcEJ1aWxkVXNhZ2VcbiAgICBzdG9wQnVpbGRVc2FnZS50cmlnZ2VyZWQoKVxuICAgIGlmICghcHJvY2Vzcy5lbnZbVEVTVE9QU19CVUlMRF9DT01QTEVURURfRU5WXSkge1xuICAgICAgICBzdG9wQnVpbGRVc2FnZS5mYWlsZWQoJ0J1aWxkIGlzIG5vdCBjb21wbGV0ZWQgeWV0JylcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdCdWlsZCBpcyBub3QgY29tcGxldGVkIHlldCdcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXSkge1xuICAgICAgICBzdG9wQnVpbGRVc2FnZS5mYWlsZWQoJ1Rva2VuL2J1aWxkSUQgaXMgdW5kZWZpbmVkLCBidWlsZCBjcmVhdGlvbiBtaWdodCBoYXZlIGZhaWxlZCcpXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnW1NUT1BfQlVJTERdIE1pc3NpbmcgQXV0aGVudGljYXRpb24gVG9rZW4vIEJ1aWxkIElEJylcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUb2tlbi9idWlsZElEIGlzIHVuZGVmaW5lZCwgYnVpbGQgY3JlYXRpb24gbWlnaHQgaGF2ZSBmYWlsZWQnXG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgICdzdG9wX3RpbWUnOiAobmV3IERhdGUoKSkudG9JU09TdHJpbmcoKVxuICAgIH1cbiAgICAvLyBTdGFtcCB0aGUga2lsbCByZWFzb24gb250byB0aGUgYnVpbGQgcmVjb3JkIHNvIHRlcm1pbmF0ZWQgcnVucyBhcmVcbiAgICAvLyBpZGVudGlmaWFibGUgc2VydmVyLXNpZGUsIG5vdCBvbmx5IHZpYSB0aGUgYW5hbHl0aWNzIGZ1bm5lbC5cbiAgICBjb25zdCBraWxsU2lnbmFsID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0tJTExfU0lHTkFMXVxuICAgIGlmIChraWxsU2lnbmFsKSB7XG4gICAgICAgIGRhdGEuZmluaXNoZWRfbWV0YWRhdGEgPSBbeyByZWFzb246ICd1c2VyX2tpbGxlZCcsIHNpZ25hbDoga2lsbFNpZ25hbCB9XVxuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke0FQSVV0aWxzLkRBVEFfRU5EUE9JTlR9L2FwaS92MS9idWlsZHMvJHtwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXX0vc3RvcGBcbiAgICAvLyBTREstNzA2MTogdGhlIGJ1aWxkLXN0b3AgUFVUIGlzIHRoZSBzaWduYWwgdGhhdCBjbG9zZXMgdGhlIFRSQSBidWlsZC4gQSBzaW5nbGVcbiAgICAvLyBiZXN0LWVmZm9ydCByZXF1ZXN0IG1lYW5zIGEgdHJhbnNpZW50IGZhaWx1cmUvdGltZW91dCBsZWF2ZXMgdGhlIGJ1aWxkIHJ1bm5pbmdcbiAgICAvLyB1bnRpbCB0aGUgfjYwLW1pbiBzZXJ2ZXItc2lkZSBpbmFjdGl2aXR5IHRpbWVvdXQuIFJldHJ5IHdpdGggYmFja29mZiBhbmQgdHJlYXQgYVxuICAgIC8vIG5vbi0yeHggcmVzcG9uc2UgYXMgYSBmYWlsdXJlIHNvIHRoZSBidWlsZCByZWxpYWJseSByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUuXG4gICAgY29uc3QgbWF4QXR0ZW1wdHMgPSAzXG4gICAgbGV0IGxhc3RFcnJvcjogdW5rbm93blxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7cHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXX1gXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbU1RPUF9CVUlMRF0gU3VjY2VzcyByZXNwb25zZTogJHthd2FpdCByZXNwb25zZS50ZXh0KCl9YClcbiAgICAgICAgICAgIHN0b3BCdWlsZFVzYWdlLnN1Y2Nlc3MoKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgbGFzdEVycm9yID0gZXJyb3JcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1NUT1BfQlVJTERdIEF0dGVtcHQgJHthdHRlbXB0fS8ke21heEF0dGVtcHRzfSBmYWlsZWQuIEVycm9yOiAke2Vycm9yfWApXG4gICAgICAgICAgICBpZiAoYXR0ZW1wdCA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwICogYXR0ZW1wdCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RvcEJ1aWxkVXNhZ2UuZmFpbGVkKGxhc3RFcnJvcilcbiAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtTVE9QX0JVSUxEXSBGYWlsZWQgYWZ0ZXIgJHttYXhBdHRlbXB0c30gYXR0ZW1wdHMuIEVycm9yOiAke2xhc3RFcnJvcn1gKVxuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgbWVzc2FnZTogKGxhc3RFcnJvciBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gJ3N0b3AgYnVpbGQgZmFpbGVkJ1xuICAgIH1cbn0pKVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2lJbmZvICgpIHtcbiAgICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudlxuICAgIC8vIEplbmtpbnNcbiAgICBpZiAoKHR5cGVvZiBlbnYuSkVOS0lOU19VUkwgPT09ICdzdHJpbmcnICYmIGVudi5KRU5LSU5TX1VSTC5sZW5ndGggPiAwKSB8fCAodHlwZW9mIGVudi5KRU5LSU5TX0hPTUUgPT09ICdzdHJpbmcnICYmIGVudi5KRU5LSU5TX0hPTUUubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdKZW5raW5zJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkJVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9OVU1CRVJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDaXJjbGVDSVxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LkNJUkNMRUNJKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0NpcmNsZUNJJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkNJUkNMRV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkNJUkNMRV9KT0IsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5DSVJDTEVfQlVJTERfTlVNXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVHJhdmlzIENJXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuVFJBVklTKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1RyYXZpcyBDSScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5UUkFWSVNfQlVJTERfV0VCX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuVFJBVklTX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuVFJBVklTX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvZGVzaGlwXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQ29kZXNoaXAnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBudWxsLFxuICAgICAgICAgICAgam9iX25hbWU6IG51bGwsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IG51bGxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCaXRidWNrZXRcbiAgICBpZiAoZW52LkJJVEJVQ0tFVF9CUkFOQ0ggJiYgZW52LkJJVEJVQ0tFVF9DT01NSVQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdCaXRidWNrZXQnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQklUQlVDS0VUX0dJVF9IVFRQX09SSUdJTixcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQklUQlVDS0VUX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIERyb25lXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuRFJPTkUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnRHJvbmUnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuRFJPTkVfQlVJTERfTElOSyxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuRFJPTkVfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2VtYXBob3JlXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuU0VNQVBIT1JFKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1NlbWFwaG9yZScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5TRU1BUEhPUkVfT1JHQU5JWkFUSU9OX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU0VNQVBIT1JFX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuU0VNQVBIT1JFX0pPQl9JRFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEdpdExhYlxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LkdJVExBQl9DSSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdHaXRMYWInLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQ0lfSk9CX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQ0lfSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5DSV9KT0JfSURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCdWlsZGtpdGVcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgaXNUcnVlKGVudi5CVUlMREtJVEUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQnVpbGRraXRlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkJVSUxES0lURV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkJVSUxES0lURV9MQUJFTCB8fCBlbnYuQlVJTERLSVRFX1BJUEVMSU5FX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMREtJVEVfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVmlzdWFsIFN0dWRpbyBUZWFtIFNlcnZpY2VzXG4gICAgaWYgKGlzVHJ1ZShlbnYuVEZfQlVJTEQpICYmIGVudi5URl9CVUlMRF9CVUlMRE5VTUJFUikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1Zpc3VhbCBTdHVkaW8gVGVhbSBTZXJ2aWNlcycsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5TWVNURU1fVEVBTUZPVU5EQVRJT05TRVJWRVJVUkl9JHtlbnYuU1lTVEVNX1RFQU1QUk9KRUNUSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU1lTVEVNX0RFRklOSVRJT05JRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0JVSUxESURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBcHB2ZXlvclxuICAgIGlmIChpc1RydWUoZW52LkFQUFZFWU9SKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0FwcHZleW9yJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYCR7ZW52LkFQUFZFWU9SX1VSTH0vcHJvamVjdC8ke2Vudi5BUFBWRVlPUl9BQ0NPVU5UX05BTUV9LyR7ZW52LkFQUFZFWU9SX1BST0pFQ1RfU0xVR30vYnVpbGRzLyR7ZW52LkFQUFZFWU9SX0JVSUxEX0lEfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkFQUFZFWU9SX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQVBQVkVZT1JfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQXp1cmUgQ0lcbiAgICBpZiAoZW52LkFaVVJFX0hUVFBfVVNFUl9BR0VOVCAmJiBlbnYuVEZfQlVJTEQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdBenVyZSBDSScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5TWVNURU1fVEVBTUZPVU5EQVRJT05TRVJWRVJVUkl9JHtlbnYuU1lTVEVNX1RFQU1QUk9KRUNUSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQlVJTERfQlVJTERJRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0JVSUxESURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBV1MgQ29kZUJ1aWxkXG4gICAgaWYgKGVudi5DT0RFQlVJTERfQlVJTERfSUQgfHwgZW52LkNPREVCVUlMRF9SRVNPTFZFRF9TT1VSQ0VfVkVSU0lPTiB8fCBlbnYuQ09ERUJVSUxEX1NPVVJDRV9WRVJTSU9OKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQVdTIENvZGVCdWlsZCcsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5DT0RFQlVJTERfUFVCTElDX0JVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQ09ERUJVSUxEX0JVSUxEX0lELFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ09ERUJVSUxEX0JVSUxEX0lEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQmFtYm9vXG4gICAgaWYgKGVudi5iYW1ib29fYnVpbGROdW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdCYW1ib28nLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuYmFtYm9vX2J1aWxkUmVzdWx0c1VybCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuYmFtYm9vX3Nob3J0Sm9iTmFtZSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LmJhbWJvb19idWlsZE51bWJlclxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFdlcmNrZXJcbiAgICBpZiAoZW52LldFUkNLRVIgfHwgZW52LldFUkNLRVJfTUFJTl9QSVBFTElORV9TVEFSVEVEKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnV2VyY2tlcicsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5XRVJDS0VSX0JVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuV0VSQ0tFUl9NQUlOX1BJUEVMSU5FX1NUQVJURUQgPyAnTWFpbiBQaXBlbGluZScgOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuV0VSQ0tFUl9HSVRfQ09NTUlUXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR29vZ2xlIENsb3VkXG4gICAgaWYgKGVudi5HQ1BfUFJPSkVDVCB8fCBlbnYuR0NMT1VEX1BST0pFQ1QgfHwgZW52LkdPT0dMRV9DTE9VRF9QUk9KRUNUKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnR29vZ2xlIENsb3VkJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuUFJPSkVDVF9JRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0lELFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNoaXBwYWJsZVxuICAgIGlmIChlbnYuU0hJUFBBQkxFKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnU2hpcHBhYmxlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LlNISVBQQUJMRV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlNISVBQQUJMRV9KT0JfSUQgPyBgSm9iICMke2Vudi5TSElQUEFCTEVfSk9CX0lEfWAgOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuU0hJUFBBQkxFX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE5ldGxpZnlcbiAgICBpZiAoaXNUcnVlKGVudi5ORVRMSUZZKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ05ldGxpZnknLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuREVQTE9ZX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU0lURV9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERfSURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBHaXRodWIgQWN0aW9uc1xuICAgIGlmIChpc1RydWUoZW52LkdJVEhVQl9BQ1RJT05TKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0dpdEh1YiBBY3Rpb25zJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYCR7ZW52LkdJVEhVQl9TRVJWRVJfVVJMfS8ke2Vudi5HSVRIVUJfUkVQT1NJVE9SWX0vYWN0aW9ucy9ydW5zLyR7ZW52LkdJVEhVQl9SVU5fSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuR0lUSFVCX1dPUktGTE9XLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuR0lUSFVCX1JVTl9JRCxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBWZXJjZWxcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgZW52LlZFUkNFTCA9PT0gJzEnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnVmVyY2VsJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYGh0dHA6Ly8ke2Vudi5WRVJDRUxfVVJMfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogbnVsbCxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUZWFtY2l0eVxuICAgIGlmIChlbnYuVEVBTUNJVFlfVkVSU0lPTikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1RlYW1jaXR5JyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERfTlVNQkVSLFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvbmNvdXJzZVxuICAgIGlmIChlbnYuQ09OQ09VUlNFIHx8IGVudi5DT05DT1VSU0VfVVJMIHx8IGVudi5DT05DT1VSU0VfVVNFUk5BTUUgfHwgZW52LkNPTkNPVVJTRV9URUFNKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQ29uY291cnNlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQlVJTERfSk9CX05BTUUgfHwgbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0lEIHx8IG51bGwsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR29DRFxuICAgIGlmIChlbnYuR09fSk9CX05BTUUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdHb0NEJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuR09fSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5HT19QSVBFTElORV9DT1VOVEVSLFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvZGVGcmVzaFxuICAgIGlmIChlbnYuQ0ZfQlVJTERfSUQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdDb2RlRnJlc2gnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQ0ZfQlVJTERfVVJMLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5DRl9QSVBFTElORV9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ0ZfQlVJTERfSUQsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgbm8gbWF0Y2hlcywgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0R2l0TWV0YURhdGEgKCkge1xuICAgIGNvbnN0IGluZm86IEdpdFJlcG9JbmZvID0gZ2l0UmVwb0luZm8oKVxuICAgIGlmICghaW5mby5jb21tb25HaXREaXIpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHsgcmVtb3RlIH0gPSBhd2FpdCBwR2l0Y29uZmlnKGluZm8uY29tbW9uR2l0RGlyKVxuICAgIGNvbnN0IHJlbW90ZXMgPSByZW1vdGUgPyBPYmplY3Qua2V5cyhyZW1vdGUpLm1hcChyZW1vdGVOYW1lID0+ICAoeyBuYW1lOiByZW1vdGVOYW1lLCB1cmw6IHJlbW90ZVtyZW1vdGVOYW1lXS51cmwgfSkpIDogW11cblxuICAgIGxldCBnaXRNZXRhRGF0YSA6IEdpdE1ldGFEYXRhID0ge1xuICAgICAgICBuYW1lOiAnZ2l0JyxcbiAgICAgICAgc2hhOiBpbmZvLnNoYSxcbiAgICAgICAgc2hvcnRfc2hhOiBpbmZvLmFiYnJldmlhdGVkU2hhLFxuICAgICAgICBicmFuY2g6IGluZm8uYnJhbmNoLFxuICAgICAgICB0YWc6IGluZm8udGFnLFxuICAgICAgICBjb21taXR0ZXI6IGluZm8uY29tbWl0dGVyLFxuICAgICAgICBjb21taXR0ZXJfZGF0ZTogaW5mby5jb21taXR0ZXJEYXRlLFxuICAgICAgICBhdXRob3I6IGluZm8uYXV0aG9yLFxuICAgICAgICBhdXRob3JfZGF0ZTogaW5mby5hdXRob3JEYXRlLFxuICAgICAgICBjb21taXRfbWVzc2FnZTogaW5mby5jb21taXRNZXNzYWdlLFxuICAgICAgICByb290OiBpbmZvLnJvb3QsXG4gICAgICAgIGNvbW1vbl9naXRfZGlyOiBpbmZvLmNvbW1vbkdpdERpcixcbiAgICAgICAgd29ya3RyZWVfZ2l0X2RpcjogaW5mby53b3JrdHJlZUdpdERpcixcbiAgICAgICAgbGFzdF90YWc6IGluZm8ubGFzdFRhZyxcbiAgICAgICAgY29tbWl0c19zaW5jZV9sYXN0X3RhZzogaW5mby5jb21taXRzU2luY2VMYXN0VGFnLFxuICAgICAgICByZW1vdGVzOiByZW1vdGVzXG4gICAgfVxuXG4gICAgZ2l0TWV0YURhdGEgPSBjaGVja0FuZFRydW5jYXRlVkNTSW5mbyhnaXRNZXRhRGF0YSlcblxuICAgIHJldHVybiBnaXRNZXRhRGF0YVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pcXVlSWRlbnRpZmllcih0ZXN0OiBGcmFtZXdvcmtzLlRlc3QsIGZyYW1ld29yaz86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGZyYW1ld29yayA9PT0gJ2phc21pbmUnKSB7XG4gICAgICAgIHJldHVybiB0ZXN0LmZ1bGxOYW1lXG4gICAgfVxuXG4gICAgbGV0IHBhcmVudFRpdGxlID0gdGVzdC5wYXJlbnRcbiAgICAvLyBTb21ldGltZXMgcGFyZW50IHdpbGwgYmUgYW4gb2JqZWN0IGluc3RlYWQgb2YgYSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIHBhcmVudFRpdGxlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBwYXJlbnRUaXRsZSA9IChwYXJlbnRUaXRsZSBhcyB7IHRpdGxlOiBzdHJpbmcgfSkudGl0bGVcbiAgICB9XG4gICAgcmV0dXJuIGAke3BhcmVudFRpdGxlfSAtICR7dGVzdC50aXRsZX1gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmlxdWVJZGVudGlmaWVyRm9yQ3VjdW1iZXIod29ybGQ6IElUZXN0Q2FzZUhvb2tQYXJhbWV0ZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB3b3JsZC5waWNrbGUudXJpICsgJ18nICsgd29ybGQucGlja2xlLmFzdE5vZGVJZHMuam9pbignLCcpXG59XG5cbi8vIExvYWQgVGVzdGluZyBTZXJ2aWNlIChMVFMpIGdhdGluZyBoZWxwZXJzIFx1MjAxNCBtaXJyb3Igb2YgYnN0YWNrX3V0aWxzL2hlbHBlci5weVxuLy8gaXNfbG9hZF90ZXN0aW5nX3Nlc3Npb24oKSAvIGdldF9sdHNfc2Vzc2lvbl9pZCgpIGluIGJyb3dzZXJzdGFjay1weXRob24tc2RrXG4vLyAoYnJhbmNoIExUUy10cmEtcHl0aG9uLXN1cHBvcnQpLiBMVFMgcG9kLWl0ZXJhdGlvbnMgZXhwb3J0XG4vLyBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQgYmVmb3JlIGludm9raW5nIHRoZSB0ZXN0IHJ1bm5lcjsgcHJlc2VuY2Ugb2Zcbi8vIHRoYXQgZW52IHZhciBpcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgXCJ0aGlzIHJ1biBpcyBhbiBMVFMgcG9kXG4vLyBpdGVyYXRpb25cIi4gT3B0aW9uYWwgQlJPV1NFUlNUQUNLX0xUUz10cnVlfDEgbGV0cyB0aGUgcnVubmVyIG9wdC1pbiB3aXRob3V0XG4vLyBzdXBwbHlpbmcgYSBzZXNzaW9uIGlkICh1c2VmdWwgZm9yIGxvY2FsIHJlcHJvKS5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpOiBib29sZWFuIHtcbiAgICBpZiAocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBjb25zdCBmbGFnID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0xUU11cbiAgICByZXR1cm4gZmxhZyA9PT0gJ3RydWUnIHx8IGZsYWcgPT09ICcxJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0THRzU2Vzc2lvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRF0gfHwgJydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsb3VkUHJvdmlkZXIoYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciB8IFdlYmRyaXZlcklPLk11bHRpUmVtb3RlQnJvd3Nlcik6IHN0cmluZyB7XG4gICAgLy8gTk9URTogZG8gTk9UIGJyYW5jaCBvbiBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpIGhlcmUuIGdldENsb3VkUHJvdmlkZXIgaXNcbiAgICAvLyBzaGFyZWQgd2l0aCBBdXRvbWF0ZS1zaWRlIGd1YXJkcyAoYXV0b21hdGVNb2R1bGUgb25CZWZvcmUvb25BZnRlclRlc3QsXG4gICAgLy8gd2ViZHJpdmVySU9Nb2R1bGUgS0VZX0lTX0JST1dTRVJTVEFDS19IVUIsIGFjY2Vzc2liaWxpdHktaGFuZGxlcixcbiAgICAvLyBzZXJ2aWNlLnRzKSBcdTIwMTQgZmxpcHBpbmcgaXQgdG8gJ2Jyb3dzZXJzdGFjaycgdW5kZXIgTFRTIHdvdWxkIG1ha2VcbiAgICAvLyBpc0Jyb3dzZXJzdGFja1Nlc3Npb24oKSByZXR1cm4gdHJ1ZSBmb3IgbG9jYWwtU2VsZW5pdW0gcG9kIHNlc3Npb25zLFxuICAgIC8vIGNhdXNpbmcgbWFya1Nlc3Npb25OYW1lIC8gbWFya1Nlc3Npb25TdGF0dXMgdG8gUFVUIGFnYWluc3QgQXV0b21hdGVcbiAgICAvLyBSRVNUIEFQSXMgd2l0aCBzZXNzaW9uIGlkcyB0aGF0IGRvbid0IGV4aXN0IHRoZXJlLiBUZXN0SHViLXJlcG9ydGluZ1xuICAgIC8vIGNhbGxlcnMgdGhhdCBuZWVkICdicm93c2Vyc3RhY2snIHVuZGVyIExUUyBkZXJpdmUgaXQgbG9jYWxseSB3aXRoXG4gICAgLy8gYGlzTG9hZFRlc3RpbmdTZXNzaW9uKCkgPyAnYnJvd3NlcnN0YWNrJyA6IGdldENsb3VkUHJvdmlkZXIoYnJvd3NlcilgXG4gICAgLy8gKHNlZSByZXBvcnRlci50cywgaW5zaWdodHMtaGFuZGxlci50cykuXG4gICAgaWYgKGJyb3dzZXIgJiYgJ2luc3RhbmNlcycgaW4gYnJvd3Nlcikge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGluc3RhbmNlc1xuICAgICAgICBmb3IgKGNvbnN0IGluc3RhbmNlTmFtZSBvZiBicm93c2VyLmluc3RhbmNlcykge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSAoYnJvd3NlciBhcyBhbnkpW2luc3RhbmNlTmFtZV0gYXMgV2ViZHJpdmVySU8uQnJvd3NlclxuICAgICAgICAgICAgaWYgKGluc3RhbmNlLm9wdGlvbnMgJiYgaW5zdGFuY2Uub3B0aW9ucy5ob3N0bmFtZSAmJiBpbnN0YW5jZS5vcHRpb25zLmhvc3RuYW1lLmluY2x1ZGVzKCdicm93c2Vyc3RhY2snKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnYnJvd3NlcnN0YWNrJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChicm93c2VyLm9wdGlvbnMgJiYgYnJvd3Nlci5vcHRpb25zLmhvc3RuYW1lICYmIGJyb3dzZXIub3B0aW9ucy5ob3N0bmFtZS5pbmNsdWRlcygnYnJvd3NlcnN0YWNrJykpIHsgLy8gU2luZ2xlIGJyb3dzZXIgaW5zdGFuY2VcbiAgICAgICAgcmV0dXJuICdicm93c2Vyc3RhY2snXG4gICAgfVxuICAgIHJldHVybiAndW5rbm93bl9ncmlkJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2Vyc3RhY2tTZXNzaW9uKGJyb3dzZXI/OiBXZWJkcml2ZXJJTy5Ccm93c2VyIHwgV2ViZHJpdmVySU8uTXVsdGlSZW1vdGVCcm93c2VyKSB7XG4gICAgcmV0dXJuIGJyb3dzZXIgJiYgZ2V0Q2xvdWRQcm92aWRlcihicm93c2VyKS50b0xvd2VyQ2FzZSgpID09PSAnYnJvd3NlcnN0YWNrJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NlbmFyaW9FeGFtcGxlcyh3b3JsZDogSVRlc3RDYXNlSG9va1BhcmFtZXRlcikge1xuICAgIGNvbnN0IHNjZW5hcmlvID0gd29ybGQucGlja2xlXG5cbiAgICAvLyBubyBleGFtcGxlcyBwcmVzZW50XG4gICAgaWYgKChzY2VuYXJpby5hc3ROb2RlSWRzICYmIHNjZW5hcmlvLmFzdE5vZGVJZHMubGVuZ3RoIDw9IDEpIHx8IHNjZW5hcmlvLmFzdE5vZGVJZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwaWNrbGVJZDogc3RyaW5nID0gc2NlbmFyaW8uYXN0Tm9kZUlkc1swXVxuICAgIGNvbnN0IGV4YW1wbGVzSWQ6IHN0cmluZyA9IHNjZW5hcmlvLmFzdE5vZGVJZHNbMV1cbiAgICBjb25zdCBnaGVya2luRG9jdW1lbnRDaGlsZHJlbiA9IHdvcmxkLmdoZXJraW5Eb2N1bWVudC5mZWF0dXJlPy5jaGlsZHJlblxuXG4gICAgbGV0IGV4YW1wbGVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBnaGVya2luRG9jdW1lbnRDaGlsZHJlbj8uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5ydWxlKSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgaWYgcnVsZSBpcyBwcmVzZW50XG4gICAgICAgICAgICBjaGlsZC5ydWxlLmNoaWxkcmVuLmZvckVhY2goY2hpbGRMZXZlbDIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZExldmVsMi5zY2VuYXJpbyAmJiBjaGlsZExldmVsMi5zY2VuYXJpby5pZCA9PT0gcGlja2xlSWQgJiYgY2hpbGRMZXZlbDIuc2NlbmFyaW8uZXhhbXBsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzc2VkRXhhbXBsZXMgPSBjaGlsZExldmVsMi5zY2VuYXJpby5leGFtcGxlcy5mbGF0TWFwKCh2YWwpID0+ICh2YWwudGFibGVCb2R5KSkuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZXhhbXBsZXNJZCk/LmNlbGxzLm1hcCgodmFsKSA9PiAodmFsLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZEV4YW1wbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlcyA9IHBhc3NlZEV4YW1wbGVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLnNjZW5hcmlvICYmIGNoaWxkLnNjZW5hcmlvLmlkID09PSBwaWNrbGVJZCAmJiBjaGlsZC5zY2VuYXJpby5leGFtcGxlcykge1xuICAgICAgICAgICAgLy8gaGFuZGxlIGlmIHNjZW5hcmlvIG91dHNpZGUgcnVsZVxuICAgICAgICAgICAgY29uc3QgcGFzc2VkRXhhbXBsZXMgPSBjaGlsZC5zY2VuYXJpby5leGFtcGxlcy5mbGF0TWFwKCh2YWwpID0+ICh2YWwudGFibGVCb2R5KSkuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZXhhbXBsZXNJZCk/LmNlbGxzLm1hcCgodmFsKSA9PiAodmFsLnZhbHVlKSlcbiAgICAgICAgICAgIGlmIChwYXNzZWRFeGFtcGxlcykge1xuICAgICAgICAgICAgICAgIGV4YW1wbGVzID0gcGFzc2VkRXhhbXBsZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAoZXhhbXBsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBleGFtcGxlc1xuICAgIH1cbiAgICByZXR1cm5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFuc2lDb2xvcnMobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yOTQ5NzY4MFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvW1xcdTAwMWJcXHUwMDliXVtbKCkjOz9dKig/OlswLTldezEsNH0oPzo7WzAtOV17MCw0fSkqKT9bMC05QS1PUlpjZi1ucXJ5PT48XS9nLCAnJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ1RhZyhldmVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gJ1Rlc3RSdW5TdGFydGVkJyB8fCBldmVudFR5cGUgPT09ICdUZXN0UnVuRmluaXNoZWQnKSB7XG4gICAgICAgIHJldHVybiAnVGVzdF9VcGxvYWQnXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdIb29rUnVuU3RhcnRlZCcgfHwgZXZlbnRUeXBlID09PSAnSG9va1J1bkZpbmlzaGVkJykge1xuICAgICAgICByZXR1cm4gJ0hvb2tfVXBsb2FkJ1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnU2NyZWVuc2hvdENyZWF0ZWQnKSB7XG4gICAgICAgIHJldHVybiAnU2NyZWVuc2hvdF9VcGxvYWQnXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdMb2dDcmVhdGVkJykge1xuICAgICAgICByZXR1cm4gJ0xvZ19VcGxvYWQnXG4gICAgfVxuICAgIHJldHVybiAndW5kZWZpbmVkJ1xufVxuXG4vLyBnZXQgaGllcmFyY2h5IGZvciBhIHBhcnRpY3VsYXIgdGVzdCAoY2FsbGVkIGJ5IHJlcG9ydGVyIGZvciBza2lwcGVkIHRlc3RzKVxuZXhwb3J0IGZ1bmN0aW9uIGdldEhpZXJhcmNoeShmdWxsVGl0bGU/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWZ1bGxUaXRsZSkge1xuICAgICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgcmV0dXJuIGZ1bGxUaXRsZS5zcGxpdCgnLicpLnNsaWNlKDAsIC0xKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SG9va1R5cGUgKGhvb2tOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChob29rTmFtZS5zdGFydHNXaXRoKCdcImJlZm9yZSBlYWNoXCInKSkge1xuICAgICAgICByZXR1cm4gJ0JFRk9SRV9FQUNIJ1xuICAgIH0gZWxzZSBpZiAoaG9va05hbWUuc3RhcnRzV2l0aCgnXCJiZWZvcmUgYWxsXCInKSkge1xuICAgICAgICByZXR1cm4gJ0JFRk9SRV9BTEwnXG4gICAgfSBlbHNlIGlmIChob29rTmFtZS5zdGFydHNXaXRoKCdcImFmdGVyIGVhY2hcIicpKSB7XG4gICAgICAgIHJldHVybiAnQUZURVJfRUFDSCdcbiAgICB9IGVsc2UgaWYgKGhvb2tOYW1lLnN0YXJ0c1dpdGgoJ1wiYWZ0ZXIgYWxsXCInKSkge1xuICAgICAgICByZXR1cm4gJ0FGVEVSX0FMTCdcbiAgICB9XG4gICAgcmV0dXJuICd1bmtub3duJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY3JlZW5zaG90Q29tbWFuZCAoYXJnczogQmVmb3JlQ29tbWFuZEFyZ3MgfCBBZnRlckNvbW1hbmRBcmdzKSB7XG4gICAgcmV0dXJuIGFyZ3MuZW5kcG9pbnQgJiYgYXJncy5lbmRwb2ludC5pbmNsdWRlcygnL3NjcmVlbnNob3QnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCU3RhY2tTZXNzaW9uKGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcudXNlciA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGNvbmZpZy5rZXkgPT09ICdzdHJpbmcnICYmIGNvbmZpZy5rZXkubGVuZ3RoID09PSAyMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcnN0YWNrSW5mcmEoY29uZmlnOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNhcHM/OiBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzKTogYm9vbGVhbiB7XG4gICAgLy8gdGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGJhc2ljIHNlc3Npb24gb3IgbXVsdGkgcmVtb3RlIHNlc3Npb24gaXMgcnVubmluZyBvbiBCcm93c2Vyc3RhY2ssIG1haW5seSBieSBjaGVja2luZyB0aGUgaG9zdG5hbWUgcGFyYW1ldGVyIGluIHRoZSBnaXZlbiBjb25maWdcbiAgICAvLyBJbiBjYXNlIGhvc3RuYW1lIGlzIG5vdCBwcmVzZW50IGFueXdoZXJlIGluIHRoZSBjb25maWcsIGl0IHJldHVybnMgdHJ1ZSBieSBkZWZhdWx0IGFzIGhvc3RuYW1lIGlzIG5vdCBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgaW4gdGhlIGNvbmZpZ1xuXG4gICAgY29uc3QgaXNCcm93c2Vyc3RhY2sgPSAoc3RyOiBzdHJpbmcgKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIHJldHVybiBzdHIgPT09ICdicm93c2Vyc3RhY2suY29tJyB8fCBzdHIuZW5kc1dpdGgoJy5icm93c2Vyc3RhY2suY29tJylcbiAgICB9XG5cbiAgICBpZiAoKGNvbmZpZy5ob3N0bmFtZSkgJiYgIWlzQnJvd3NlcnN0YWNrKGNvbmZpZy5ob3N0bmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGNhcHMgJiYgdHlwZW9mIGNhcHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNhcHMpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgY2Fwcykge1xuICAgICAgICAgICAgICAgIGlmICgoKGNhcGFiaWxpdHkgYXMgT3B0aW9ucy5UZXN0cnVubmVyKS5ob3N0bmFtZSkgJiYgIWlzQnJvd3NlcnN0YWNrKChjYXBhYmlsaXR5IGFzIE9wdGlvbnMuVGVzdHJ1bm5lcikuaG9zdG5hbWUgYXMgc3RyaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjYXBzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IGNhcHNba2V5IGFzIGtleW9mIENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXNdXG4gICAgICAgICAgICAgICAgaWYgKCgoY2FwYWJpbGl0eSBhcyBPcHRpb25zLlRlc3RydW5uZXIpLmhvc3RuYW1lKSAmJiAhaXNCcm93c2Vyc3RhY2soKGNhcGFiaWxpdHkgYXMgT3B0aW9ucy5UZXN0cnVubmVyKS5ob3N0bmFtZSBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNCU3RhY2tTZXNzaW9uKGNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja1VzZXJBbmRLZXkoY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsIG9wdGlvbnM6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuXG4gICAgLy8gRmFsbGJhY2sgMTogRW52IHZhcmlhYmxlc1xuICAgIC8vIEZhbGxiYWNrIDI6IFNlcnZpY2UgdmFyaWFibGVzIGluIHdkaW8uY29uZi5qcyAodGhhdCBhcmUgcmVjZWl2ZWQgaW5zaWRlIG9wdGlvbnMgb2JqZWN0KVxuICAgIGNvbnN0IGVudk9yU2VydmljZVZhcmlhYmxlcyA9IHtcbiAgICAgICAgdXNlcjogZ2V0QnJvd3NlclN0YWNrVXNlcihvcHRpb25zKSxcbiAgICAgICAga2V5OiBnZXRCcm93c2VyU3RhY2tLZXkob3B0aW9ucylcbiAgICB9XG4gICAgaWYgKGVudk9yU2VydmljZVZhcmlhYmxlcy51c2VyICYmIGVudk9yU2VydmljZVZhcmlhYmxlcy5rZXkpIHtcbiAgICAgICAgcmV0dXJuIGVudk9yU2VydmljZVZhcmlhYmxlc1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIDM6IFNlcnZpY2UgdmFyaWFibGVzIGluIHRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyBvYmplY3RcbiAgICAvLyBGYWxsYmFjayA0OiBTZXJ2aWNlIHZhcmlhYmxlcyBpbiB0aGUgdG9wIGxldmVsIGNvbmZpZyBvYmplY3RcbiAgICBjb25zdCBvMTF5VmFyaWFibGVzID0ge1xuICAgICAgICB1c2VyOiBnZXRPYnNlcnZhYmlsaXR5VXNlcihvcHRpb25zLCBjb25maWcpLFxuICAgICAgICBrZXk6IGdldE9ic2VydmFiaWxpdHlLZXkob3B0aW9ucywgY29uZmlnKVxuICAgIH1cbiAgICByZXR1cm4gbzExeVZhcmlhYmxlc1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRBZGRTZXJ2aWNlVmVyc2lvbihjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lciwgdGVzdE9ic2VydmFiaWxpdHk/OiBib29sZWFuLCBjYXBzPzogQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIGlmICgoY29uZmlnLnNlcnZpY2VzICYmIGNvbmZpZy5zZXJ2aWNlcy50b1N0cmluZygpLmluY2x1ZGVzKCdjaHJvbWVkcml2ZXInKSAmJiB0ZXN0T2JzZXJ2YWJpbGl0eSAhPT0gZmFsc2UpIHx8ICFpc0Jyb3dzZXJzdGFja0luZnJhKGNvbmZpZywgY2FwcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiYXRjaEFuZFBvc3RFdmVudHMgKGV2ZW50VXJsOiBzdHJpbmcsIGtpbmQ6IHN0cmluZywgZGF0YTogVXBsb2FkVHlwZVtdKSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudltURVNUT1BTX0JVSUxEX0NPTVBMRVRFRF9FTlZdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQnVpbGQgbm90IGNvbXBsZXRlZCB5ZXQnKVxuICAgIH1cblxuICAgIGNvbnN0IGp3dFRva2VuID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXVxuICAgIGlmICghand0VG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGF1dGhlbnRpY2F0aW9uIFRva2VuJylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElVdGlscy5EQVRBX0VORFBPSU5UfS8ke2V2ZW50VXJsfWBcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHtqd3RUb2tlbn1gXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgfSlcbiAgICAgICAgLy8gcmVhZCBhcyB0ZXh0IGZpcnN0OiBlcnJvciByZXNwb25zZXMgKDQwMS81eHgpIGFuZCBlbXB0eSBib2RpZXMgYXJlIG5vdCBKU09OLCBhbmQgYSBibGluZFxuICAgICAgICAvLyByZXNwb25zZS5qc29uKCkgc3VyZmFjZWQgdGhlbSBhcyBhIG1pc2xlYWRpbmcgXCJVbmV4cGVjdGVkIGVuZCBvZiBKU09OIGlucHV0XCJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fSR7cmVzcG9uc2VCb2R5ID8gYCBcdTIwMTQgJHtyZXNwb25zZUJvZHkuc2xpY2UoMCwgMzAwKX1gIDogJyAoZW1wdHkgYm9keSknfWApXG4gICAgICAgIH1cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbJHtraW5kfV0gU3VjY2VzcyByZXNwb25zZTogJHtyZXNwb25zZUJvZHl9YClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFske2tpbmR9XSBFWENFUFRJT04gSU4gJHtraW5kfSBSRVFVRVNUIFRPIFRFU1QgUkVQT1JUSU5HIEFORCBBTkFMWVRJQ1MgOiAke2Vycm9yfWApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhjZXB0aW9uIGluIHJlcXVlc3QgJyArIGVycm9yKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2VydmFiaWxpdHlVc2VyKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVVNFUk5BTUVcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zICYmIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXJcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy51c2VyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FDQ0VTU19LRVkpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BQ0NFU1NfS0VZXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5rZXkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmtleVxuICAgIH1cbiAgICByZXR1cm4gY29uZmlnLmtleVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eVByb2plY3Qob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBic3RhY2tQcm9qZWN0TmFtZT86IHN0cmluZykge1xuICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfUFJPSkVDVF9OQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfUFJPSkVDVF9OQU1FXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5wcm9qZWN0TmFtZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMucHJvamVjdE5hbWVcbiAgICB9XG4gICAgcmV0dXJuIGJzdGFja1Byb2plY3ROYW1lXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5QnVpbGQob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBic3RhY2tCdWlsZE5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX05BTUUpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LlRFU1RfT0JTRVJWQUJJTElUWV9CVUlMRF9OQU1FXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkTmFtZVxuICAgIH1cbiAgICByZXR1cm4gYnN0YWNrQnVpbGROYW1lIHx8IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGJzdGFja0J1aWxkVGFnPzogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHLnNwbGl0KCcsJylcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zICYmIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkVGFnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZFRhZ1xuICAgIH1cbiAgICBpZiAoYnN0YWNrQnVpbGRUYWcpIHtcbiAgICAgICAgcmV0dXJuIFtic3RhY2tCdWlsZFRhZ11cbiAgICB9XG4gICAgcmV0dXJuIFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXN0UGxhbklkKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUX1BMQU5fSURdKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVF9QTEFOX0lEXVxuICAgIH1cbiAgICBjb25zdCBDTElfQVJHID0gJy0tYnJvd3NlcnN0YWNrLnRlc3RNYW5hZ2VtZW50T3B0aW9ucy50ZXN0UGxhbklkJ1xuICAgIGNvbnN0IGFyZ0luZGV4ID0gcHJvY2Vzcy5hcmd2LmluZGV4T2YoQ0xJX0FSRylcbiAgICBpZiAoYXJnSW5kZXggIT09IC0xICYmIHByb2Nlc3MuYXJndlthcmdJbmRleCArIDFdKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmFyZ3ZbYXJnSW5kZXggKyAxXVxuICAgIH1cbiAgICBjb25zdCBhcmdXaXRoRXF1YWxzID0gcHJvY2Vzcy5hcmd2LmZpbmQoKGFyZykgPT4gYXJnLnN0YXJ0c1dpdGgoYCR7Q0xJX0FSR309YCkpXG4gICAgaWYgKGFyZ1dpdGhFcXVhbHMpIHtcbiAgICAgICAgcmV0dXJuIGFyZ1dpdGhFcXVhbHMuc3BsaXQoJz0nKVsxXVxuICAgIH1cbiAgICBjb25zdCB0ZXN0UGxhbklkID0gb3B0aW9ucy50ZXN0TWFuYWdlbWVudE9wdGlvbnM/LnRlc3RQbGFuSWRcbiAgICBpZiAodHlwZW9mIHRlc3RQbGFuSWQgPT09ICdzdHJpbmcnICYmIHRlc3RQbGFuSWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHRlc3RQbGFuSWQudHJpbSgpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja1VzZXIoY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVVNFUk5BTUUgYXMgc3RyaW5nXG4gICAgfVxuICAgIHJldHVybiBjb25maWcudXNlciBhcyBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja0tleShjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgIGlmIChwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQUNDRVNTX0tFWSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FDQ0VTU19LRVlcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy5rZXlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlOiB1bmtub3duKSB7XG4gICAgbGV0IHJlcyA9ICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlcyA9IHJlcyB8fCB2YWx1ZSA9PT0gJydcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUcnVlKHZhbHVlPzogdW5rbm93bikge1xuICAgIHJldHVybiAodmFsdWUgKyAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZhbHNlKHZhbHVlPzogdW5rbm93bikge1xuICAgIHJldHVybiAodmFsdWUgKyAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJ1xufVxuXG4vKipcbiAqIHNraXBBcHBPdmVycmlkZSB2YWxpZGF0aW9uIGNob2tlcG9pbnQgXHUyMDE0IHBvcnRlZCBmcm9tIHRoZSBOb2RlIFNESydzXG4gKiB2YWxpZGF0ZVNraXBBcHBPdmVycmlkZSAoaGVscGVyLmpzKSAvIEphdmEgQnJvd3NlclN0YWNrSmF2YUFnZW50LnByb2Nlc3NBcHBPcHRpb25zLlxuICogQ2FsbGVkIE9OQ0UgZnJvbSB0aGUgbGF1bmNoZXIgKG1haW4gcHJvY2VzcywgcHJlLXNlc3Npb24pLiBFbWl0cyB0aGUgZml4ZWQgd2FybmluZyxcbiAqIGhhbmRsZXMgdGhlIHRocmVlIGVkZ2UgY2FzZXMsIGFuZCBjbGVhcnMgdGhlIGFwcCBvbiBjb25mbGljdCBzbyBpdCBpcyBuZWl0aGVyIHVwbG9hZGVkXG4gKiBub3IgaW5qZWN0ZWQuIFRoZXJlIGlzIE5PIFRpZXItMiBicmFuY2g6IGV2ZXJ5IFdlYmRyaXZlcklPIHRlc3QgZnJhbWV3b3JrXG4gKiAobW9jaGEvamFzbWluZS9jdWN1bWJlcikgc3VwcG9ydHMgQXBwIEF1dG9tYXRlLlxuICpcbiAqIFRoZSBzdGFuZGFyZCB3YXJuaW5nIGFuZCB0aGUgZWRnZS0yIGVycm9yIGFyZSB2ZXJiYXRpbSB3aXRoIHRoZSBvdGhlciBCcm93c2VyU3RhY2sgU0RLc1xuICogKEJyb3dzZXJTdGFja0phdmFBZ2VudCNwcm9jZXNzQXBwT3B0aW9ucykuIFRoZSBlZGdlLTEgY29uZmxpY3Qgd2FybmluZyBpcyBJTlRFTlRJT05BTExZIGFkYXB0ZWQgZm9yXG4gKiBXZWJkcml2ZXJJTyBcdTIwMTQgaXQgc2F5cyBcImJyb3dzZXJzdGFjayBzZXJ2aWNlIG9wdGlvbnNcIiAod2hlcmUgV0RJTyByZWFkcyBgYXBwYCksIG5vdCBcImJyb3dzZXJzdGFjay55bWxcIiBcdTIwMTRcbiAqIHNvIHBsZWFzZSBkbyBOT1QgXCJmaXhcIiBpdCBiYWNrIHRvIHRoZSB5bWwgd29yZGluZyB0byBtYXRjaCB0aGUgb3RoZXIgU0RLcy5cbiAqIEdyYWNlZnVsOiBuZXZlciB0aHJvd3MgZXhjZXB0IHRoZSBkZWxpYmVyYXRlIGVkZ2UtMiBjb25maWcgZXJyb3IgKGV4cGxpY2l0IGZhbHNlICsgbm8gYXBwKSxcbiAqIHdoaWNoIGZpcmVzIHByZS1zZXNzaW9uIHNvIHRoZSBydW4gYWJvcnRzIGNsZWFubHkuXG4gKlxuICogTXV0YXRlcyBgb3B0aW9ucy5hcHBgIChlZGdlLTEpLiAzLXN0YXRlIHZpYSBpc1RydWUvaXNGYWxzZSBcdTIwMTQgbmV2ZXIgYCFvcHRpb25zLnNraXBBcHBPdmVycmlkZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNraXBBcHBPdmVycmlkZShvcHRpb25zPzogQnJvd3NlcnN0YWNrQ29uZmlnICYgQnJvd3NlcnN0YWNrT3B0aW9ucykge1xuICAgIGlmIChpc1VuZGVmaW5lZChvcHRpb25zKSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBza2lwQXBwT3ZlcnJpZGUgPSAob3B0aW9ucyBhcyBCcm93c2Vyc3RhY2tDb25maWcpLnNraXBBcHBPdmVycmlkZVxuICAgIGNvbnN0IGFscmVhZHlXYXJuZWQgPSBpc1RydWUocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1NLSVBfQVBQX09WRVJSSURFX1dBUk5FRClcblxuICAgIC8vIFN0YW5kYXJkIHdhcm5pbmcgXHUyMDE0IGZpcmVzIHdoZW5ldmVyIHNraXBBcHBPdmVycmlkZSBpcyB0cnVlLCBiZWZvcmUgYW55IGVkZ2UgcmV0dXJuLlxuICAgIGlmIChpc1RydWUoc2tpcEFwcE92ZXJyaWRlKSAmJiAhYWxyZWFkeVdhcm5lZCkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignW0Jyb3dzZXJTdGFja10gXFwnc2tpcEFwcE92ZXJyaWRlOiB0cnVlXFwnIGlzIHNldC4gVGhlIFNESyB3aWxsIHRyZWF0IHRoaXMgc2Vzc2lvbiBhcyBBcHAgQXV0b21hdGUgYW5kIHdpbGwgTk9UIG1hbmFnZSBhcHAgdXBsb2FkIG9yIGluamVjdCBhcHAgY2FwYWJpbGl0aWVzLiBJZiB5b3UgaW50ZW5kZWQgdG8gcnVuIGFuIEF1dG9tYXRlIChicm93c2VyL3dlYnNpdGUpIHNlc3Npb24sIHJlbW92ZSBcXCdza2lwQXBwT3ZlcnJpZGVcXCcgXHUyMDE0IGxlYXZpbmcgaXQgc2V0IHdpbGwgY2F1c2UgQXV0b21hdGUgc2Vzc2lvbnMgdG8gYmVoYXZlIGluY29ycmVjdGx5LicpXG4gICAgICAgIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19TS0lQX0FQUF9PVkVSUklERV9XQVJORUQgPSAndHJ1ZSdcbiAgICB9XG5cbiAgICAvLyBFZGdlIDE6IGFwcCBzcGVjaWZpZWQgKyBza2lwQXBwT3ZlcnJpZGU6dHJ1ZSBcdTIxOTIgd2FybiwgY2xlYXIgdGhlIGFwcCBzbyBpdCBpcyBub3RcbiAgICAvLyB1cGxvYWRlZC9pbmplY3RlZCwgcHJvY2VlZCBBcHAgQXV0b21hdGUuXG4gICAgaWYgKGlzVHJ1ZShza2lwQXBwT3ZlcnJpZGUpICYmICFpc1VuZGVmaW5lZCgob3B0aW9ucyBhcyBCcm93c2Vyc3RhY2tDb25maWcpLmFwcCkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0NvbmZsaWN0IGRldGVjdGVkLiBza2lwQXBwT3ZlcnJpZGU6IHRydWUgaXMgYWN0aXZlOyBpZ25vcmluZyB0aGUgYXBwIHByb3ZpZGVkIGluIHRoZSBicm93c2Vyc3RhY2sgc2VydmljZSBvcHRpb25zLicpXG4gICAgICAgIDsob3B0aW9ucyBhcyBCcm93c2Vyc3RhY2tDb25maWcpLmFwcCA9IHVuZGVmaW5lZFxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBFZGdlIDI6IGFwcCBub3Qgc3BlY2lmaWVkICsgc2tpcEFwcE92ZXJyaWRlIGV4cGxpY2l0bHkgZmFsc2UgXHUyMTkyIHByZS1zZXNzaW9uIGNvbmZpZyBlcnJvci5cbiAgICBpZiAoaXNGYWxzZShza2lwQXBwT3ZlcnJpZGUpICYmIGlzVW5kZWZpbmVkKChvcHRpb25zIGFzIEJyb3dzZXJzdGFja0NvbmZpZykuYXBwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FwcCBjYXBhYmlsaXR5IGlzIG1pc3NpbmcuIFdoZW4gc2tpcEFwcE92ZXJyaWRlIGlzIHNldCB0byBcXCdmYWxzZVxcJywgYSB2YWxpZCBhcHAgY2FwYWJpbGl0eSAoaGFzaC9zaGFyZWFibGUgaWQvcGF0aC9jdXN0b21faWQpIG11c3QgYmUgcHJvdmlkZWQuJylcbiAgICB9XG5cbiAgICAvLyBFZGdlIDMgKGFuZCBkZWZhdWx0KTogdW5zZXQgKyBubyBhcHAgXHUyMTkyIHVuY2hhbmdlZCBiZWhhdmlvciAobm8tb3ApLlxufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJhbWV3b3JrU3VwcG9ydHNIb29rKGhvb2s6IHN0cmluZywgZnJhbWV3b3JrPzogc3RyaW5nKSB7XG4gICAgaWYgKGZyYW1ld29yayA9PT0gJ21vY2hhJyAmJiAoaG9vayA9PT0gJ2JlZm9yZScgfHwgaG9vayA9PT0gJ2FmdGVyJyB8fCBob29rID09PSAnYmVmb3JlRWFjaCcgfHwgaG9vayA9PT0gJ2FmdGVyRWFjaCcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKGZyYW1ld29yayA9PT0gJ2N1Y3VtYmVyJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgcGF0Y2hDb25zb2xlTG9ncyA9IG8xMXlFcnJvckhhbmRsZXIoKCkgPT4ge1xuICAgIGNvbnN0IEJTVGVzdE9wc1BhdGNoZXIgPSBuZXcgbG9nUGF0Y2hlcih7fSlcblxuICAgIE9iamVjdC5rZXlzKGNvbnNvbGVIb2xkZXIpLmZvckVhY2goKG1ldGhvZDoga2V5b2YgdHlwZW9mIGNvbnNvbGUpID0+IHtcbiAgICAgICAgaWYgKCEobWV0aG9kIGluIGNvbnNvbGUpIHx8IG1ldGhvZCA9PT0gJ0NvbnNvbGUnIHx8IHR5cGVvZiBjb25zb2xlW21ldGhvZF0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgU2tpcHBpbmcgbWV0aG9kOiAke21ldGhvZH0sIGV4aXN0czogJHttZXRob2QgaW4gY29uc29sZX0sIHR5cGU6ICR7dHlwZW9mIGNvbnNvbGVbbWV0aG9kXX1gKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JpZ01ldGhvZDogRnVuY3Rpb24gPSBjb25zb2xlW21ldGhvZF0uYmluZChjb25zb2xlKVxuXG4gICAgICAgIGNvbnNvbGVbbWV0aG9kXSA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhCU1Rlc3RPcHNQYXRjaGVyKS5pbmNsdWRlcyhtZXRob2QpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdNZXRob2QoLi4uYXJncylcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcmlnTWV0aG9kKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAoQlNUZXN0T3BzUGF0Y2hlciBhcyBhbnkpW21ldGhvZF0oLi4uYXJncylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3Igd2hpbGUgcGF0Y2hpbmcgY29uc29sZSBsb2dzIDogJHtlcnJvcn1gKVxuICAgICAgICAgICAgICAgIG9yaWdNZXRob2QoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG59KVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmFpbHVyZU9iamVjdChlcnJvcjogc3RyaW5nfEVycm9yKSB7XG4gICAgY29uc3Qgc3RhY2sgPSAoZXJyb3IgYXMgRXJyb3IpLnN0YWNrXG4gICAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycgPyBlcnJvciA6IGVycm9yLm1lc3NhZ2VcbiAgICBjb25zdCBiYWNrdHJhY2UgPSBzdGFjayA/IHJlbW92ZUFuc2lDb2xvcnMoc3RhY2sudG9TdHJpbmcoKSkgOiAnJ1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmFpbHVyZTogW3sgYmFja3RyYWNlOiBbYmFja3RyYWNlXSB9XSxcbiAgICAgICAgZmFpbHVyZV9yZWFzb246IHJlbW92ZUFuc2lDb2xvcnMobWVzc2FnZS50b1N0cmluZygpKSxcbiAgICAgICAgZmFpbHVyZV90eXBlOiBtZXNzYWdlID8gKG1lc3NhZ2UudG9TdHJpbmcoKS5tYXRjaCgvQXNzZXJ0aW9uRXJyb3IvKSA/ICdBc3NlcnRpb25FcnJvcicgOiAnVW5oYW5kbGVkRXJyb3InKSA6IG51bGxcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBzbGVlcCA9IChtcyA9IDEwMCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBsb2FkTG9ncyh1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQsIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjbGllbnRCdWlsZFV1aWQ6IHN0cmluZykge1xuICAgIC8vIE1hbnVhbCBpbnN0cnVtZW50YXRpb246IHRhZyBldmVyeSByZXR1cm4gcGF0aCBvbiB0aGUgU0RLX1VQTE9BRF9MT0dTIGV2ZW50IHNvXG4gICAgLy8gdGhlIG1ldHJpYyBpZGVudGlmaWVzIHRoZSBzcGVjaWZpYyByZWFzb24gbG9ncyB3ZXJlIG5vdCB1cGxvYWRlZCAobm8gY3JlZHMsXG4gICAgLy8gcGVyLWZpbGUgY29weSBmYWlsdXJlLCB1cGxvYWQgbm8tcmVzcG9uc2UsIGV4Y2VwdGlvbikuIG1lYXN1cmVXcmFwcGVyIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIG1hcmsgYWxsIG5vbi10aHJvd2luZyBwYXRocyBhcyBzdWNjZXNzLlxuICAgIGNvbnN0IGV2ZW50TmFtZSA9IFBFUkZPUk1BTkNFX1NES19FVkVOVFMuRVZFTlRTLlNES19VUExPQURfTE9HU1xuICAgIGxldCBzdWNjZXNzID0gdHJ1ZVxuICAgIGxldCBmYWlsdXJlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICBQZXJmb3JtYW5jZVRlc3Rlci5zdGFydChldmVudE5hbWUpXG5cbiAgICB0cnkge1xuICAgICAgICBpZiAoIXVzZXIgfHwgIWtleSkge1xuICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlXG4gICAgICAgICAgICBmYWlsdXJlID0gJ3NraXBwZWQ6IG1pc3NpbmdfY3JlZGVudGlhbHMnXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1VwbG9hZGluZyBsb2dzIGZhaWxlZCBkdWUgdG8gbm8gY3JlZGVudGlhbHMnKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0bXBEaXIgPSB0bXBkaXIoKVxuICAgICAgICBjb25zdCB0YXJQYXRoID0gcGF0aC5qb2luKHRtcERpciwgJ2xvZ3MudGFyJylcbiAgICAgICAgY29uc3QgdGFyR3pQYXRoID0gcGF0aC5qb2luKHRtcERpciwgJ2xvZ3MudGFyLmd6JylcblxuICAgICAgICBjb25zdCBmaWxlc1RvQXJjaGl2ZSA9IFtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5sb2dGaWxlUGF0aCxcbiAgICAgICAgICAgIENMSV9ERUJVR19MT0dTX0ZJTEUsXG4gICAgICAgIF0uZmlsdGVyKGYgPT4gZnMuZXhpc3RzU3luYyhmKSlcblxuICAgICAgICBjb25zdCBjb3BpZWRGaWxlTmFtZXM6IHN0cmluZ1tdID0gW11cbiAgICAgICAgY29uc3QgYXJjaGl2ZUFkZEZhaWx1cmVzOiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWxlc1RvQXJjaGl2ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXN0ID0gcGF0aC5qb2luKHRtcERpciwgcGF0aC5iYXNlbmFtZShmKSlcbiAgICAgICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoZiwgZGVzdClcbiAgICAgICAgICAgICAgICBjb3BpZWRGaWxlTmFtZXMucHVzaChwYXRoLmJhc2VuYW1lKGYpKVxuICAgICAgICAgICAgfSBjYXRjaCAoY29weUVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IChjb3B5RXJyIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBTdHJpbmcoY29weUVycilcbiAgICAgICAgICAgICAgICBhcmNoaXZlQWRkRmFpbHVyZXMucHVzaChgJHtwYXRoLmJhc2VuYW1lKGYpfTogJHttc2d9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmNoaXZlQWRkRmFpbHVyZXMubGVuZ3RoID4gMCAmJiBmYWlsdXJlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICAgICAgZmFpbHVyZSA9IGBhcmNoaXZlX2FkZF9mYWlsZWQgWyR7YXJjaGl2ZUFkZEZhaWx1cmVzLmxlbmd0aH1dOiAke2FyY2hpdmVBZGRGYWlsdXJlcy5qb2luKCc7ICcpfWAuc3Vic3RyaW5nKDAsIDMwMClcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGNyZWF0ZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmaWxlOiB0YXJQYXRoLFxuICAgICAgICAgICAgICAgIGN3ZDogdG1wRGlyLFxuICAgICAgICAgICAgICAgIHBvcnRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIG5vRGlyUmVjdXJzZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcGllZEZpbGVOYW1lc1xuICAgICAgICApXG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0YXJQYXRoKVxuICAgICAgICAgICAgY29uc3QgZGVzdCA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRhckd6UGF0aClcbiAgICAgICAgICAgIGNvbnN0IGd6aXAgPSB6bGliLmNyZWF0ZUd6aXAoeyBsZXZlbDogMSB9KVxuXG4gICAgICAgICAgICBzb3VyY2UucGlwZShnemlwKS5waXBlKGRlc3QpXG4gICAgICAgICAgICBkZXN0Lm9uKCdmaW5pc2gnLCByZXNvbHZlKVxuICAgICAgICAgICAgZGVzdC5vbignZXJyb3InLCByZWplY3QpXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICAvLyBvcGVuQXNCbG9iIChOb2RlID49MjApIHJldHVybnMgYSBCbG9iIGJhY2tlZCBieSBhIGZpbGUgZGVzY3JpcHRvciBcdTIwMTQgdW5kaWNpXG4gICAgICAgIC8vIHN0cmVhbXMgZnJvbSBkaXNrIGR1cmluZyB0aGUgdXBsb2FkIGluc3RlYWQgb2YgbWF0ZXJpYWxpc2luZyB0aGUgZnVsbCBhcmNoaXZlXG4gICAgICAgIC8vIGluIFY4IGhlYXAgKHdoaWNoIHJlYWRGaWxlU3luYyArIG5ldyBCbG9iKFtCdWZmZXJdKSB3b3VsZCBkbyB0d2ljZSkuXG4gICAgICAgIC8vIE5vZGUgMTguMjAgKHN0aWxsIHN1cHBvcnRlZCBwZXIgYGVuZ2luZXNgKSBsYWNrcyBmcy5vcGVuQXNCbG9iLCBzbyBmYWxsIGJhY2tcbiAgICAgICAgLy8gdG8gcmVhZGluZyB0aGUgKHNtYWxsKSBsb2cgYXJjaGl2ZSBpbnRvIGEgQmxvYiB0aGVyZS5cbiAgICAgICAgY29uc3QgZmlsZSA9IHR5cGVvZiBmcy5vcGVuQXNCbG9iID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGF3YWl0IGZzLm9wZW5Bc0Jsb2IodGFyR3pQYXRoLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi94LWd6aXAnIH0pXG4gICAgICAgICAgICA6IG5ldyBCbG9iKFtmcy5yZWFkRmlsZVN5bmModGFyR3pQYXRoKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3gtZ3ppcCcgfSlcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdkYXRhJywgZmlsZSwgJ2xvZ3MudGFyLmd6JylcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdjbGllbnRCdWlsZFV1aWQnLCBjbGllbnRCdWlsZFV1aWQpXG5cbiAgICAgICAgY29uc3QgYXV0aCA9IEJ1ZmZlci5mcm9tKGAke3VzZXJ9OiR7a2V5fWApLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgICAgICBib2R5OiBmb3JtRGF0YSBhcyBCb2R5SW5pdCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCYXNpYyAke2F1dGh9YFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBub2RlUmVxdWVzdChcbiAgICAgICAgICAgICdQT1NUJywgVVBMT0FEX0xPR1NfRU5EUE9JTlQsIHJlcXVlc3RPcHRpb25zLCBBUElVdGlscy5VUExPQURfTE9HU19BRERSRVNTXG4gICAgICAgIClcblxuICAgICAgICBmcy51bmxpbmtTeW5jKHRhclBhdGgpXG4gICAgICAgIGZzLnVubGlua1N5bmModGFyR3pQYXRoKVxuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgY29waWVkRmlsZU5hbWVzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0bXBEaXIsIGYpXG4gICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKGZpbGVQYXRoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVsZXRlIHRoZSBTREsgQ0xJIGxvZyBmaWxlIGFmdGVyIHVwbG9hZFxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhDTElfREVCVUdfTE9HU19GSUxFKSkge1xuICAgICAgICAgICAgZnMudW5saW5rU3luYyhDTElfREVCVUdfTE9HU19GSUxFKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gbm9kZVJlcXVlc3Qgc3dhbGxvd3MgZXJyb3JzIGZvciB0aGUgbG9nLXVwbG9hZCBwYXRoIGFuZCByZXR1cm5zIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8vIHJlY29yZCB0aGUgc2lsZW50IHVwbG9hZCBmYWlsdXJlIG9uIHRoZSBtZXRyaWMuXG4gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgICAgICAgIGZhaWx1cmUgPSAndXBsb2FkX25vX3Jlc3BvbnNlJ1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyAmJiByZXNwb25zZS5zdGF0dXMgIT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgLy8gU2VydmVyLXNpZGUgcmVqZWN0aW9uIChlLmcuIFwiRmlsZSBub3QgYXR0YWNoZWRcIikgXHUyMDE0IHJlc3BvbnNlIGlzIHRydXRoeVxuICAgICAgICAgICAgLy8gYnV0IHRoZSB1cGxvYWQgZGlkbid0IGFjdHVhbGx5IGxhbmQuXG4gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgICAgICAgIGZhaWx1cmUgPSBgdXBsb2FkX3N0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9JHtyZXNwb25zZS5tZXNzYWdlID8gJyAtICcgKyBTdHJpbmcocmVzcG9uc2UubWVzc2FnZSkuc2xpY2UoMCwgMjAwKSA6ICcnfWBcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICBmYWlsdXJlID0gYHVwbG9hZExvZ3MgZXhjZXB0aW9uOiAke2dldEVycm9yU3RyaW5nKGVycm9yKX1gXG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3Igd2hpbGUgdXBsb2FkaW5nIGxvZ3M6ICR7Z2V0RXJyb3JTdHJpbmcoZXJyb3IpfWApXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKGV2ZW50TmFtZSwgc3VjY2VzcywgZmFpbHVyZSlcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBpc09iamVjdCA9IChvYmplY3Q6IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gb2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9iamVjdClcbn1cblxuZXhwb3J0IGNvbnN0IE9iamVjdHNBcmVFcXVhbCA9IChvYmplY3QxOiBvYmplY3QsIG9iamVjdDI6IG9iamVjdCkgPT4ge1xuICAgIGNvbnN0IG9iamVjdEtleXMxID0gT2JqZWN0LmtleXMob2JqZWN0MSlcbiAgICBjb25zdCBvYmplY3RLZXlzMiA9IE9iamVjdC5rZXlzKG9iamVjdDIpXG4gICAgaWYgKG9iamVjdEtleXMxLmxlbmd0aCAhPT0gb2JqZWN0S2V5czIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBvYmplY3RLZXlzMSkge1xuICAgICAgICBjb25zdCB2YWx1ZTEgPSBvYmplY3QxW2tleSBhcyBrZXlvZiB0eXBlb2Ygb2JqZWN0MV1cbiAgICAgICAgY29uc3QgdmFsdWUyID0gb2JqZWN0MltrZXkgYXMga2V5b2YgdHlwZW9mIG9iamVjdDFdXG4gICAgICAgIGNvbnN0IGlzQm90aEFyZU9iamVjdHMgPSBpc09iamVjdCh2YWx1ZTEpICYmIGlzT2JqZWN0KHZhbHVlMilcbiAgICAgICAgaWYgKChpc0JvdGhBcmVPYmplY3RzICYmICFPYmplY3RzQXJlRXF1YWwodmFsdWUxLCB2YWx1ZTIpKSB8fCAoIWlzQm90aEFyZU9iamVjdHMgJiYgdmFsdWUxICE9PSB2YWx1ZTIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1WZXJzaW9uID0gbzExeUVycm9ySGFuZGxlcihmdW5jdGlvbiBnZXRQbGF0Zm9ybVZlcnNpb24oY2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzLCB1c2VyQ2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzKSB7XG4gICAgaWYgKCFjYXBzICYmICF1c2VyQ2Fwcykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgYnN0YWNrT3B0aW9ucyA9ICh1c2VyQ2Fwcyk/LlsnYnN0YWNrOm9wdGlvbnMnXVxuICAgIGNvbnN0IGtleXMgPSBbJ3BsYXRmb3JtVmVyc2lvbicsICdwbGF0Zm9ybV92ZXJzaW9uJywgJ29zVmVyc2lvbicsICdvc192ZXJzaW9uJ11cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgaWYgKGNhcHM/LltrZXkgYXMga2V5b2YgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBHb3QgJHtrZXl9IGZyb20gZHJpdmVyIGNhcHNgKVxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhjYXBzPy5ba2V5IGFzIGtleW9mIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc10pXG4gICAgICAgIH0gZWxzZSBpZiAoYnN0YWNrT3B0aW9ucyAmJiBic3RhY2tPcHRpb25zPy5ba2V5IGFzIGtleW9mIENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXNdKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEdvdCAke2tleX0gZnJvbSB1c2VyIGJzdGFjayBvcHRpb25zYClcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoYnN0YWNrT3B0aW9ucz8uW2tleSBhcyBrZXlvZiBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzXSlcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyQ2Fwc1trZXkgYXMga2V5b2YgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBHb3QgJHtrZXl9IGZyb20gdXNlciBjYXBzYClcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodXNlckNhcHNba2V5IGFzIGtleW9mIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc10pXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxufSlcblxuLyoqXG4gKiBSZXNvbHZlIGEgc3RhYmxlLCBodW1hbi1yZWFkYWJsZSBkZXZpY2UgaWRlbnRpZmllciBmb3IgdGhlXG4gKiBgZGV2aWNlYCBmaWVsZCBvbiB0ZXN0X3J1biBpbnRlZ3JhdGlvbnMgcGF5bG9hZHMuXG4gKlxuICogVGVzdEh1YiBkZWR1cGVzIHRlc3RfcnVucyBieSBhIGhhc2ggdGhhdCBpbmNsdWRlcyBgZGV2aWNlYC4gRm9yXG4gKiBBcHAtQXV0b21hdGUgZmxvd3MgdGhhdCBwYXNzIGEgcmVnZXggZGV2aWNlIHJlcXVlc3QgKGUuZy4gYC4qUGl4ZWwuKmApXG4gKiBhY3Jvc3MgbXVsdGlwbGUgcGxhdGZvcm1zLCB0aGUgU0RLIHByZXZpb3VzbHkgc2VudCB0aGUgaW5wdXQgcmVnZXhcbiAqIHN0cmluZywgY2F1c2luZyB0d28gcGFyYWxsZWwgc2Vzc2lvbnMgb24gcGh5c2ljYWxseSBkaWZmZXJlbnQgZGV2aWNlc1xuICogdG8gY29sbGlkZSBvbiB0aGUgaGFzaCBhbmQgbWVyZ2UuIFRoaXMgaGVscGVyIHByZWZlcnMgdGhlIEFwcGl1bVxuICogc2VydmVyLXJlc29sdmVkIGZpZWxkcyAoYGRldmljZU1vZGVsYCAvIGBhcHBpdW06ZGV2aWNlTW9kZWxgKSBiZWZvcmVcbiAqIGZhbGxpbmcgYmFjayB0byB0aGUgcmVxdWVzdGVkIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBNdWx0aXJlbW90ZTogYGRyaXZlckNhcHNgIGZvciBhIGBNdWx0aVJlbW90ZUJyb3dzZXJgIGlzIGEgbWFwIG9mXG4gKiBge2luc3RhbmNlTmFtZTogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzLCBcdTIwMjZ9YCByYXRoZXIgdGhhbiBmbGF0IGNhcHM7XG4gKiB0aGUgaGVscGVyIGRldGVjdHMgdGhhdCBzaGFwZSBhbmQgd2Fsa3MgZWFjaCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gZHJpdmVyQ2FwcyAtIGxpdmUgZHJpdmVyIGNhcGFiaWxpdGllcyAoYGJyb3dzZXIuY2FwYWJpbGl0aWVzYClcbiAqICAgICAgICAgICAgICAgICAgICAgd2hlcmUgQXBwaXVtIHNlcnZlci1yZXNvbHZlZCBmaWVsZHMgYXJlIHBvcHVsYXRlZFxuICogQHBhcmFtIHJlcXVlc3RlZENhcHMgLSB1c2VyLXJlcXVlc3RlZCBjYXBhYmlsaXRpZXMgKHJ1bm5lciBjYXBzIC8geW1sKVxuICogICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGFzIGEgZmFsbGJhY2tcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJlc29sdmVkRGV2aWNlTmFtZSA9IG8xMXlFcnJvckhhbmRsZXIoZnVuY3Rpb24gZ2V0UmVzb2x2ZWREZXZpY2VOYW1lKFxuICAgIGRyaXZlckNhcHM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfCBSZWNvcmQ8c3RyaW5nLCB7IGNhcGFiaWxpdGllcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9PixcbiAgICByZXF1ZXN0ZWRDYXBzPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIHwgUmVjb3JkPHN0cmluZywgeyBjYXBhYmlsaXRpZXM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfT4sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZsYXR0ZW5NdWx0aXJlbW90ZSA9IChcbiAgICAgICAgY2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIHwgUmVjb3JkPHN0cmluZywgeyBjYXBhYmlsaXRpZXM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfT4gfCB1bmRlZmluZWQsXG4gICAgKTogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzW10gPT4ge1xuICAgICAgICBpZiAoIWNhcHMpIHtyZXR1cm4gW119XG4gICAgICAgIGNvbnN0IG9iaiA9IGNhcHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgaWYgKG9iai5kZXZpY2VNb2RlbCB8fCBvYmpbJ2FwcGl1bTpkZXZpY2VNb2RlbCddIHx8IG9iai5kZXZpY2VOYW1lIHx8IG9ialsnYnN0YWNrOm9wdGlvbnMnXSkge1xuICAgICAgICAgICAgLy8gbG9va3MgbGlrZSBmbGF0IGNhcHNcbiAgICAgICAgICAgIHJldHVybiBbY2FwcyBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNdXG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9va3MgbGlrZSBhIG11bHRpcmVtb3RlIG1hcDoge2luc3RhbmNlTmFtZToge2NhcGFiaWxpdGllczogey4uLn19fVxuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhvYmopXG4gICAgICAgICAgICAuZmlsdGVyKCh2KTogdiBpcyB7IGNhcGFiaWxpdGllcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9ID0+XG4gICAgICAgICAgICAgICAgdiAhPT0gbnVsbCAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgJ2NhcGFiaWxpdGllcycgaW4gKHYgYXMgb2JqZWN0KSlcbiAgICAgICAgICAgIC5tYXAodiA9PiB2LmNhcGFiaWxpdGllcyBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzW10gPSBbXG4gICAgICAgIC4uLmZsYXR0ZW5NdWx0aXJlbW90ZShkcml2ZXJDYXBzKSxcbiAgICAgICAgLi4uZmxhdHRlbk11bHRpcmVtb3RlKHJlcXVlc3RlZENhcHMpLFxuICAgIF1cbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7cmV0dXJuIHVuZGVmaW5lZH1cblxuICAgIGNvbnN0IHBpY2tTdHJpbmcgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICBjb25zdCB2ID0gb2JqPy5ba2V5XVxuICAgICAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoID4gMCA/IHYgOiB1bmRlZmluZWRcbiAgICB9XG4gICAgLy8gUHJlY2VkZW5jZTogcHJlZmVyIEFwcGl1bSBzZXJ2ZXItcmVzb2x2ZWQgZGV2aWNlTW9kZWw7IGZhbGwgYmFjayB0aHJvdWdoXG4gICAgLy8gcmVxdWVzdGVkIGNhcCB2YXJpYW50cy4gYGJzdGFjazpvcHRpb25zLmRldmljZU5hbWVgIGlzIHRoZSB1c2VyJ3MgcmVnZXhcbiAgICAvLyBmb3IgQXBwLUF1dG9tYXRlIHJ1bnMsIGtlcHQgYXMgYSBmYWxsYmFjayBmb3IgdGhlIG5vbi1yZXNvbHZlZCBjYXNlLlxuICAgIGNvbnN0IHBhdGhzOiBBcnJheTwoYzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHN0cmluZyB8IHVuZGVmaW5lZD4gPSBbXG4gICAgICAgIGMgPT4gcGlja1N0cmluZyhjLCAnZGV2aWNlTW9kZWwnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGMsICdhcHBpdW06ZGV2aWNlTW9kZWwnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGNbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsICdkZXZpY2VOYW1lJyksXG4gICAgICAgIGMgPT4gcGlja1N0cmluZyhjLCAnYXBwaXVtOmRldmljZU5hbWUnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGMsICdkZXZpY2VOYW1lJyksXG4gICAgXVxuICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgICAgICBmb3IgKGNvbnN0IHNyYyBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gcGF0aChzcmMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICAgIGlmICh2KSB7cmV0dXJuIHZ9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxufSlcblxuZXhwb3J0IGNvbnN0IGdldEJhc2ljQXV0aEhlYWRlciA9ICh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZW5jb2RlZEF1dGggPSBCdWZmZXIuZnJvbShgJHt1c2VybmFtZX06JHtwYXNzd29yZH1gLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIHJldHVybiBgQmFzaWMgJHtlbmNvZGVkQXV0aH1gXG59XG5cbmV4cG9ydCBjb25zdCBpc09iamVjdEVtcHR5ID0gKG9iamVjdE5hbWU6IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgICBvYmplY3ROYW1lICYmXG4gICAgICAgIE9iamVjdC5rZXlzKG9iamVjdE5hbWUpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICBvYmplY3ROYW1lLmNvbnN0cnVjdG9yID09PSBPYmplY3RcbiAgICApXG59XG5cbmV4cG9ydCBjb25zdCBnZXRFcnJvclN0cmluZyA9IChlcnI6IHVua25vd24pID0+IHtcbiAgICBpZiAoIWVycikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gIGVyciAvLyB3b3JrcywgYGVgIG5hcnJvd2VkIHRvIHN0cmluZ1xuICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVyci5tZXNzYWdlIC8vIHdvcmtzLCBgZWAgbmFycm93ZWQgdG8gRXJyb3JcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnVuY2F0ZVN0cmluZyhmaWVsZDogc3RyaW5nLCB0cnVuY2F0ZVNpemVJbkJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlclNpemVJbkJ5dGVzID0gQnVmZmVyLmZyb20oR0lUX01FVEFfREFUQV9UUlVOQ0FURUQpLmxlbmd0aFxuXG4gICAgICAgIGNvbnN0IGZpZWxkQnVmZmVyT2JqID0gQnVmZmVyLmZyb20oZmllbGQpXG4gICAgICAgIGNvbnN0IGxlbk9mRmllbGRCdWZmZXJPYmogPSBmaWVsZEJ1ZmZlck9iai5sZW5ndGhcbiAgICAgICAgY29uc3QgZmluYWxMZW4gPSBNYXRoLmNlaWwobGVuT2ZGaWVsZEJ1ZmZlck9iaiAtIHRydW5jYXRlU2l6ZUluQnl0ZXMgLSBidWZmZXJTaXplSW5CeXRlcylcbiAgICAgICAgaWYgKGZpbmFsTGVuID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdHJ1bmNhdGVkU3RyaW5nID0gZmllbGRCdWZmZXJPYmouc3ViYXJyYXkoMCwgZmluYWxMZW4pLnRvU3RyaW5nKCkgKyBHSVRfTUVUQV9EQVRBX1RSVU5DQVRFRFxuICAgICAgICAgICAgcmV0dXJuIHRydW5jYXRlZFN0cmluZ1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciB3aGlsZSB0cnVuY2F0aW5nIGZpZWxkLCBub3RoaW5nIHdhcyB0cnVuY2F0ZWQgaGVyZTogJHtlcnJvcn1gKVxuICAgIH1cbiAgICByZXR1cm4gZmllbGRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpemVPZkpzb25PYmplY3RJbkJ5dGVzKGpzb25EYXRhOiBHaXRNZXRhRGF0YSk6IG51bWJlciB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoanNvbkRhdGEpKVxuXG4gICAgICAgIHJldHVybiBidWZmZXIubGVuZ3RoXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTb21ldGhpbmcgd2VudCB3cm9uZyB3aGlsZSBjYWxjdWxhdGluZyBzaXplIG9mIEpTT04gb2JqZWN0OiAke2Vycm9yfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIC0xXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0FuZFRydW5jYXRlVkNTSW5mbyhnaXRNZXRhRGF0YTogR2l0TWV0YURhdGEpOiBHaXRNZXRhRGF0YSB7XG4gICAgY29uc3QgZ2l0TWV0YURhdGFTaXplSW5CeXRlcyA9IGdldFNpemVPZkpzb25PYmplY3RJbkJ5dGVzKGdpdE1ldGFEYXRhKVxuXG4gICAgaWYgKGdpdE1ldGFEYXRhU2l6ZUluQnl0ZXMgJiYgZ2l0TWV0YURhdGFTaXplSW5CeXRlcyA+IE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVMpIHtcbiAgICAgICAgY29uc3QgdHJ1bmNhdGVTaXplID0gZ2l0TWV0YURhdGFTaXplSW5CeXRlcyAtIE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVNcbiAgICAgICAgY29uc3QgdHJ1bmNhdGVkQ29tbWl0TWVzc2FnZSA9IHRydW5jYXRlU3RyaW5nKGdpdE1ldGFEYXRhLmNvbW1pdF9tZXNzYWdlLCB0cnVuY2F0ZVNpemUpXG4gICAgICAgIGdpdE1ldGFEYXRhLmNvbW1pdF9tZXNzYWdlID0gdHJ1bmNhdGVkQ29tbWl0TWVzc2FnZVxuICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhgVGhlIGNvbW1pdCBoYXMgYmVlbiB0cnVuY2F0ZWQuIFNpemUgb2YgY29tbWl0IGFmdGVyIHRydW5jYXRpb24gaXMgJHsgZ2V0U2l6ZU9mSnNvbk9iamVjdEluQnl0ZXMoZ2l0TWV0YURhdGEpIC8gMTAyNCB9IEtCYClcbiAgICB9XG5cbiAgICByZXR1cm4gZ2l0TWV0YURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGhhc0Jyb3dzZXJOYW1lID0gKGNhcDogQ2FwYWJpbGl0aWVzLldlYmRyaXZlcklPQ29uZmlnKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFjYXAgfHwgIWNhcC5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGJyb3dzZXJTdGFja0NhcGFiaWxpdGllcyA9IGNhcC5jYXBhYmlsaXRpZXMgYXMgQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllc1xuICAgIHJldHVybiBicm93c2VyU3RhY2tDYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgIT09IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgaXNWYWxpZENhcHNGb3JIZWFsaW5nID0gKGNhcHM6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyk6IGJvb2xlYW4gPT4ge1xuXG4gICAgLy8gR2V0IGFsbCBjYXBhYmlsaXR5IHZhbHVlc1xuICAgIGNvbnN0IGNhcFZhbHVlcyA9IE9iamVjdC52YWx1ZXMoY2FwcylcblxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgY2FwYWJpbGl0aWVzIGFuZCBpZiBhdCBsZWFzdCBvbmUgaGFzIGEgYnJvd3NlciBuYW1lXG4gICAgcmV0dXJuIGNhcFZhbHVlcy5sZW5ndGggPiAwICYmIGNhcFZhbHVlcy5zb21lKGhhc0Jyb3dzZXJOYW1lKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUdXJib1NjYWxlKG9wdGlvbnM6IChCcm93c2Vyc3RhY2tDb25maWcgJiBCcm93c2Vyc3RhY2tPcHRpb25zKSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKG9wdGlvbnM/LnR1cmJvU2NhbGUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5UHJvZHVjdChvcHRpb25zOiAoQnJvd3NlcnN0YWNrQ29uZmlnICYgQnJvd3NlcnN0YWNrT3B0aW9ucykgfCB1bmRlZmluZWQsIGlzQXBwQXV0b21hdGU6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBpc0FwcEF1dG9tYXRlXG4gICAgICAgID8gJ2FwcC1hdXRvbWF0ZSdcbiAgICAgICAgOiAoaXNUdXJib1NjYWxlKG9wdGlvbnMpID8gJ3R1cmJvc2NhbGUnIDogJ2F1dG9tYXRlJylcbn1cblxudHlwZSBQb2xsaW5nUmVzdWx0ID0ge1xuICAgIGRhdGE6IGFueTtcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7IC8vIE9wdGlvbmFsIG1lc3NhZ2UgZm9yIHRpbWVvdXQgY2FzZXNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBvbGxBcGkoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgdXBwZXJMaW1pdDogbnVtYmVyLFxuICAgIHN0YXJ0VGltZSA9IERhdGUubm93KClcbik6IFByb21pc2U8UG9sbGluZ1Jlc3VsdD4ge1xuICAgIHBhcmFtcy50aW1lc3RhbXAgPSBNYXRoLnJvdW5kKERhdGUubm93KCkgLyAxMDAwKVxuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgY3VycmVudCB0aW1lc3RhbXAgJHtwYXJhbXMudGltZXN0YW1wfWApXG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2VHZXRSZXF1ZXN0KHVybCwgcGFyYW1zLCBoZWFkZXJzKVxuICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICBtZXNzYWdlOiAnUG9sbGluZyBzdWNjZWVkZWQuJyxcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlICYmIGVycm9yLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0UG9sbFRpbWUgPSBwYXJzZUludChlcnJvci5yZXNwb25zZS5oZWFkZXJzLmdldCgnbmV4dF9wb2xsX3RpbWUnKSwgMTApICogMTAwMFxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGB0aW1lSW5NaWxsaXMgJHtuZXh0UG9sbFRpbWV9YClcblxuICAgICAgICAgICAgaWYgKGlzTmFOKG5leHRQb2xsVGltZSkpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignSW52YWxpZCBvciBtaXNzaW5nIGBuZXh0UG9sbFRpbWVgIGhlYWRlci4gU3RvcHBpbmcgcG9sbGluZy4nKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBlcnJvci5yZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBuZXh0UG9sbFRpbWUgaGVhZGVyIHZhbHVlLiBQb2xsaW5nIHN0b3BwZWQuJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gbmV4dFBvbGxUaW1lIC0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBlbGFwc2VkVGltZSAke2VsYXBzZWRUaW1lfSB0aW1lSW5NaWxsaXMgJHtuZXh0UG9sbFRpbWV9IHVwcGVyTGltaXQgJHt1cHBlckxpbWl0fWBcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKG5leHRQb2xsVGltZSA+IHVwcGVyTGltaXQpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignUG9sbGluZyBzdG9wcGVkIGR1ZSB0byB1cHBlciB0aW1lIGxpbWl0LicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGVycm9yLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQb2xsaW5nIHN0b3BwZWQgZHVlIHRvIHVwcGVyIHRpbWUgbGltaXQuJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgUG9sbGluZyBhZ2FpbiBpbiAke2VsYXBzZWRUaW1lfW1zIHdpdGggcGFyYW1zOmAsIHBhcmFtcylcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGVsYXBzZWRUaW1lKSlcbiAgICAgICAgICAgIHJldHVybiBwb2xsQXBpKHVybCwgcGFyYW1zLCBoZWFkZXJzLCB1cHBlckxpbWl0LCBzdGFydFRpbWUpXG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBlcnJvci5yZXNwb25zZS5zdGF0dXNUZXh0XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEVycm9yID0gSlNPTi5wYXJzZShlcnJvci5yZXNwb25zZS5qc29uKCkpXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gcGFyc2VkRXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBwYXJzaW5nIHBvbGxBcGkgcmVxdWVzdCBib2R5ICR7ZXJyb3IucmVzcG9uc2UuYm9keX1gKVxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICdVbmtub3duIGVycm9yJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgVW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZDogJHtlcnJvcn1gKVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YToge30sIGhlYWRlcnM6IHt9LCBtZXNzYWdlOiAnVW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZC4nIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFrZUdldFJlcXVlc3QodXJsOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiwgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybClcbiAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGtleSkgPT4gdXJsT2JqLnNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBwYXJhbXNba2V5XSkpXG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybE9iai50b1N0cmluZygpLCB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgfSlcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ1JlcXVlc3QgZmFpbGVkJylcbiAgICAgICAgZXJyb3IucmVzcG9uc2UgPSByZXNwb25zZVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjY2Vzc2liaWxpdHlTY3JpcHQ8UmV0dXJuVHlwZT4oXG4gICAgYnJvd3NlcjogYW55LFxuICAgIGZuQm9keTogc3RyaW5nLFxuICAgIGFyZz86IHVua25vd25cbik6IFByb21pc2U8UmV0dXJuVHlwZT4ge1xuICAgIHJldHVybiBicm93c2VyLmV4ZWN1dGUoXG4gICAgICAgIGByZXR1cm4gKGZ1bmN0aW9uICguLi5ic3RhY2tTZGtBcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBic3RhY2tTZGtBcmdzWzBdO1xuICAgICAgICAgICAgICAgIGJzdGFja1Nka0FyZ3MucHVzaChyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICAke2ZuQm9keS5yZXBsYWNlKC9hcmd1bWVudHMvZywgJ2JzdGFja1Nka0FyZ3MnKX1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSgke2FyZyA/IEpTT04uc3RyaW5naWZ5KGFyZykgOiAnJ30pYFxuICAgIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSGFzaENvZGVGcm9tRmllbGRzKGZpZWxkczogQXJyYXk8c3RyaW5nIHwgb2JqZWN0Pikge1xuICAgIGNvbnN0IHNlcmlhbGl6ZSA9ICh2YWx1ZToge30pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBmaWVsZHMubWFwKHNlcmlhbGl6ZSkuam9pbignfCcpXG4gICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoc2VyaWFsaXplZCkuZGlnZXN0KCdoZXgnKVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEJvb2xlYW5WYWx1ZUZyb21TdHJpbmcodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiBbJ3RydWUnXS5pbmNsdWRlcyh2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKSlcbn1cblxuLyoqXG4gKiBTREstMzczNzogQ29lcmNlIHN0cmluZ2lmaWVkIGJvb2xlYW5zICgndHJ1ZScvJ2ZhbHNlJywgYW55IGNhc2UpIGluIGEgZmxhdFxuICogb3B0aW9ucyBvYmplY3QgdG8gcmVhbCBib29sZWFucywgbGVhdmluZyBldmVyeSBvdGhlciB2YWx1ZSB1bnRvdWNoZWQuIEJvb2xlYW4tXG4gKiB0eXBlZCBhY2Nlc3NpYmlsaXR5IG9wdGlvbnMgKGUuZy4gYXV0b1NjYW5uaW5nKSBhcmUgY29tbW9ubHkgc3VwcGxpZWQgYXNcbiAqIHN0cmluZ3MgZnJvbSBKUyBjb25maWcgLyBlbnY7IHdpdGhvdXQgY29lcmNpb24gdGhleSBmYWlsIFczQyBjYXBzIHZhbGlkYXRpb25cbiAqIGFuZCBhcmUgc2lsZW50bHkgZHJvcHBlZC4gT25seSB0aGUgZXhhY3Qgc3RyaW5ncyAndHJ1ZScvJ2ZhbHNlJyBhcmUgY29udmVydGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29lcmNlU3RyaW5nQm9vbGVhbnM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9ialxuICAgIH1cbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpc2VkID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIGlmIChub3JtYWxpc2VkID09PSAndHJ1ZScgfHwgbm9ybWFsaXNlZCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgIG91dFtrZXldID0gbm9ybWFsaXNlZCA9PT0gJ3RydWUnXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXRba2V5XSA9IHZhbHVlXG4gICAgfVxuICAgIHJldHVybiBvdXQgYXMgVFxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGtleSBpcyBzYWZlIHRvIHVzZSBmb3Igb2JqZWN0IHByb3BlcnR5IGFzc2lnbm1lbnQgdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUga2V5IGlzIHNhZmUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5mdW5jdGlvbiBpc1NhZmVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYW5nZXJvdXNLZXlzID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ11cbiAgICByZXR1cm4gIWRhbmdlcm91c0tleXMuaW5jbHVkZXMoa2V5KVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGJvb2xlYW4gdmFsdWUgZnJvbSBtaXhlZCB0eXBlcyAoYm9vbGVhbiBvciBzdHJpbmcpXG4gKiBPbmx5IGFjY2VwdHMgdHJ1ZSBib29sZWFuIG9yIHN0cmluZyBcInRydWVcIiAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRFbmFibGVkVmFsdWUodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblZhbHVlRnJvbVN0cmluZyh2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXAodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5zb3VyY2VzOiBhbnlbXSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGlmICghc291cmNlcy5sZW5ndGgpIHtyZXR1cm4gdGFyZ2V0fVxuICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKVxuXG4gICAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIFNraXAgZGFuZ2Vyb3VzIGtleXMgdGhhdCBjb3VsZCBsZWFkIHRvIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICAgICAgICAgIGlmICghaXNTYWZlS2V5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHRhcmdldFtrZXldXG5cbiAgICAgICAgICAgIGlmIChpc09iamVjdChzb3VyY2VWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFZhbHVlIHx8ICFpc09iamVjdCh0YXJnZXRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVZhbHVlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ2hyb21lT3B0aW9ucyhiYXNlOiBDYXBhYmlsaXRpZXMuQ2hyb21lT3B0aW9ucywgb3ZlcnJpZGU6IFBhcnRpYWw8Q2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnM+KTogQ2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnMge1xuICAgIGNvbnN0IG1lcmdlZDogQ2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnMgPSB7IC4uLmJhc2UgfVxuXG4gICAgaWYgKG92ZXJyaWRlLmFyZ3MpIHtcbiAgICAgICAgbWVyZ2VkLmFyZ3MgPSBbLi4uKGJhc2UuYXJncyB8fCBbXSksIC4uLm92ZXJyaWRlLmFyZ3NdXG4gICAgfVxuXG4gICAgaWYgKG92ZXJyaWRlLmV4dGVuc2lvbnMpIHtcbiAgICAgICAgbWVyZ2VkLmV4dGVuc2lvbnMgPSBbLi4uKGJhc2UuZXh0ZW5zaW9ucyB8fCBbXSksIC4uLm92ZXJyaWRlLmV4dGVuc2lvbnNdXG4gICAgfVxuXG4gICAgaWYgKG92ZXJyaWRlLnByZWZzKSB7XG4gICAgICAgIG1lcmdlZC5wcmVmcyA9IG1lcmdlRGVlcCh7IC4uLihiYXNlLnByZWZzIHx8IHt9KSB9LCBvdmVycmlkZS5wcmVmcylcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsT3JFbXB0eShzdHJpbmc6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhc3RyaW5nIHx8IHN0cmluZy50cmltKCkgPT09ICcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hhc2goZW50aXR5OiBhbnkpIHtcbiAgICByZXR1cm4gQm9vbGVhbihlbnRpdHkgJiYgdHlwZW9mKGVudGl0eSkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGVudGl0eSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXN0ZWRLZXlWYWx1ZShoYXNoOiBhbnksIGtleXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICByZXR1cm4ga2V5cy5yZWR1Y2UoKGhhc2gsIGtleSkgPT4gKGlzSGFzaChoYXNoKSA/IGhhc2hba2V5XSA6IHVuZGVmaW5lZCksIGhhc2gpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBsaXN0ID0gZnMucmVhZGRpclN5bmMoZGlyKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbihkaXIsIGxpc3RbaV0pXG4gICAgICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmaWxlbmFtZSlcblxuICAgICAgICBpZiAoZmlsZW5hbWUgPT09ICcuJyB8fCBmaWxlbmFtZSA9PT0gJy4uJykge1xuICAgICAgICAgICAgLy8gcGFzcyB0aGVzZSBmaWxlc1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgLy8gcm1kaXIgcmVjdXJzaXZlbHlcbiAgICAgICAgICAgIHJlbW92ZURpcihmaWxlbmFtZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJtIGZpbGVuYW1lXG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKGZpbGVuYW1lKVxuICAgICAgICB9XG4gICAgfVxuICAgIGZzLnJtZGlyU3luYyhkaXIpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXIpKXtcbiAgICAgICAgcmVtb3ZlRGlyKGRpcilcbiAgICB9XG4gICAgZnMubWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzV3JpdGFibGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgICAgZnMuYWNjZXNzU3luYyhkaXJQYXRoLCBmcy5jb25zdGFudHMuV19PSylcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVhZFdyaXRlQWNjZXNzKGRpclBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGZzLmNobW9kU3luYyhkaXJQYXRoLCAwbzY2NilcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBEaXJlY3RvcnkgJHtkaXJQYXRofSBpcyBub3cgcmVhZC93cml0ZSBhY2Nlc3NpYmxlLmApXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gc2V0IGRpcmVjdG9yeSBhY2Nlc3M6ICR7ZXJyLnN0YWNrfWApXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9jaGFUZXN0SGllcmFyY2h5KHRlc3Q6IEZyYW1ld29ya3MuVGVzdCkge1xuICAgIGNvbnN0IHZhbHVlOiBzdHJpbmdbXSA9IFtdXG4gICAgaWYgKHRlc3QuY3R4ICYmIHRlc3QuY3R4LnRlc3QpIHtcbiAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBwYXJlbnQgb2JqZWN0LCB1dGlsaXplIGl0IGVsc2UgZ2V0IGZyb20gY29udGV4dFxuICAgICAgICBsZXQgcGFyZW50ID0gdHlwZW9mIHRlc3QucGFyZW50ID09PSAnb2JqZWN0JyA/IHRlc3QucGFyZW50IDogdGVzdC5jdHgudGVzdC5wYXJlbnRcbiAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQudGl0bGUgIT09ICcnKSB7XG4gICAgICAgICAgICB2YWx1ZS5wdXNoKHBhcmVudC50aXRsZSlcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGVzdC5kZXNjcmlwdGlvbiAmJiB0ZXN0LmZ1bGxOYW1lKSB7XG4gICAgICAgIC8vIGZvciBKYXNtaW5lXG4gICAgICAgIHZhbHVlLnB1c2godGVzdC5kZXNjcmlwdGlvbilcbiAgICAgICAgLy8gU3RyaXAgdGhlIHRyYWlsaW5nIFwiIDxkZXNjcmlwdGlvbj5cIiBzdWZmaXggd2l0aG91dCBidWlsZGluZyBhIHJlZ2V4IGZyb21cbiAgICAgICAgLy8gYSB2YXJpYWJsZSAoYXZvaWRzIFJlRG9TIGFuZCByZWdleC1tZXRhY2hhcmFjdGVyIG1pc21hdGNoZXMgaW4gZGVzY3JpcHRpb25zKS5cbiAgICAgICAgY29uc3QgZGVzY1N1ZmZpeCA9IGAgJHt0ZXN0LmRlc2NyaXB0aW9ufWBcbiAgICAgICAgdmFsdWUucHVzaCh0ZXN0LmZ1bGxOYW1lLmVuZHNXaXRoKGRlc2NTdWZmaXgpID8gdGVzdC5mdWxsTmFtZS5zbGljZSgwLCAtZGVzY1N1ZmZpeC5sZW5ndGgpIDogdGVzdC5mdWxsTmFtZSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJldmVyc2UoKVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybU8xMXlTeW5jID0gYXN5bmMgKGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIpID0+IHtcbiAgICBpZiAoaXNCcm93c2Vyc3RhY2tTZXNzaW9uKGJyb3dzZXIpKSB7XG4gICAgICAgIGF3YWl0IGJyb3dzZXIuZXhlY3V0ZShgYnJvd3NlcnN0YWNrX2V4ZWN1dG9yOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2Fubm90YXRlJyxcbiAgICAgICAgICAgIGFyZ3VtZW50czoge1xuICAgICAgICAgICAgICAgIGRhdGE6IGBPYnNlcnZhYmlsaXR5U3luYzoke0RhdGUubm93KCl9YCxcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2RlYnVnJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KX1gKVxuICAgIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGNhcGFiaWxpdGllcyByZXByZXNlbnQgYSBtdWx0aXJlbW90ZSBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gY2FwYWJpbGl0aWVzIC0gVGhlIGNhcGFiaWxpdGllcyB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiBjYXBhYmlsaXRpZXMgcmVwcmVzZW50IGFueSBtdWx0aXJlbW90ZSBjb25maWd1cmF0aW9uIChyZWd1bGFyIG9yIHBhcmFsbGVsKVxuICpcbiAqIEBleGFtcGxlXG4gKiBSZWd1bGFyIG11bHRpcmVtb3RlIChvYmplY3QpOlxuICogeyBicm93c2VyQTogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0sIGJyb3dzZXJCOiB7IGNhcGFiaWxpdGllczogey4uLn0gfSB9XG4gKlxuICogUGFyYWxsZWwgbXVsdGlyZW1vdGUgKGFycmF5IHdpdGggbmVzdGVkIHN0cnVjdHVyZSk6XG4gKiBbeyBicm93c2VyQTogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0sIGJyb3dzZXJCOiB7IGNhcGFiaWxpdGllczogey4uLn0gfSB9XVxuICpcbiAqIFJlZ3VsYXIgY2FwYWJpbGl0aWVzIChhcnJheSk6XG4gKiBbeyBicm93c2VyTmFtZTogJ2Nocm9tZScsIC4uLiB9XVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNdWx0aVJlbW90ZUNhcHMoY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXRpZXMuVGVzdHJ1bm5lckNhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIC8vIFJlZ3VsYXIgbXVsdGlyZW1vdGUgaXMgYW4gb2JqZWN0IChub3QgYXJyYXkpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBFbXB0eSBhcnJheSBpcyBub3QgbXVsdGlyZW1vdGVcbiAgICBpZiAoY2FwYWJpbGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBQYXJhbGxlbCBtdWx0aXJlbW90ZSBpcyBhbiBhcnJheSB3aXRoIG5lc3RlZCBjYXBhYmlsaXRpZXMgc3RydWN0dXJlXG4gICAgcmV0dXJuIGNhcGFiaWxpdGllcy5ldmVyeShjYXAgPT5cbiAgICAgICAgT2JqZWN0LnZhbHVlcyhjYXApLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhjYXApLmV2ZXJ5KGMgPT4gYyAhPT0gbnVsbCAmJiB0eXBlb2YgYyA9PT0gJ29iamVjdCcgJiYgKGMgYXMgeyBjYXBhYmlsaXRpZXM6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9KS5jYXBhYmlsaXRpZXMpXG4gICAgKVxufVxuIiwgImltcG9ydCBUcmFuc3BvcnQgZnJvbSAnd2luc3Rvbi10cmFuc3BvcnQnXG5cbmNvbnN0IExPR19MRVZFTFMgPSB7XG4gICAgSU5GTzogJ0lORk8nLCBFUlJPUjogJ0VSUk9SJywgREVCVUc6ICdERUJVRycsIFRSQUNFOiAnVFJBQ0UnLCBXQVJOOiAnV0FSTicsXG59XG5cbmNsYXNzIGxvZ1BhdGNoZXIgZXh0ZW5kcyBUcmFuc3BvcnQge1xuICAgIGxvZ1RvVGVzdE9wcyA9IChsZXZlbCA9IExPR19MRVZFTFMuSU5GTywgbWVzc2FnZSA9IFsnJ10gYXMgdW5rbm93bltdKSA9PiB7XG4gICAgICAgIChwcm9jZXNzLmVtaXQgYXMgRnVuY3Rpb24pKGBiczphZGRMb2c6JHtwcm9jZXNzLnBpZH1gLCB7XG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIGxldmVsOiBsZXZlbC50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgICAgbWVzc2FnZTogYFwiJHttZXNzYWdlLmpvaW4oJywgJyl9XCJgLFxuICAgICAgICAgICAga2luZDogJ1RFU1RfTE9HJyxcbiAgICAgICAgICAgIGh0dHBfcmVzcG9uc2U6IHt9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyogUGF0Y2hpbmcgdGhpcyB3b3VsZCBzaG93IHVzZXIgYW4gZXh0ZW5kZWQgdHJhY2Ugb24gdGhlaXIgY2xpICovXG4gICAgdHJhY2UgPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuVFJBQ0UsIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgZGVidWcgPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuREVCVUcsIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgaW5mbyA9ICguLi5tZXNzYWdlOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgdGhpcy5sb2dUb1Rlc3RPcHMoTE9HX0xFVkVMUy5JTkZPLCBtZXNzYWdlKVxuICAgIH1cblxuICAgIHdhcm4gPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuV0FSTiwgbWVzc2FnZSlcbiAgICB9XG5cbiAgICBlcnJvciA9ICguLi5tZXNzYWdlOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgdGhpcy5sb2dUb1Rlc3RPcHMoTE9HX0xFVkVMUy5FUlJPUiwgbWVzc2FnZSlcbiAgICB9XG5cbiAgICBsb2cgPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuSU5GTywgbWVzc2FnZSlcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBsb2dQYXRjaGVyXG4iLCAiaW1wb3J0IHsgY3JlYXRlT2JqZWN0Q3N2V3JpdGVyIH0gZnJvbSAnY3N2LXdyaXRlcidcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IGZzUHJvbWlzZSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHR5cGUgeyBFbnRyeVR5cGUgfSBmcm9tICdub2RlOnBlcmZfaG9va3MnXG5pbXBvcnQgeyBwZXJmb3JtYW5jZSwgUGVyZm9ybWFuY2VPYnNlcnZlciB9IGZyb20gJ25vZGU6cGVyZl9ob29rcydcbmltcG9ydCB1dGlsIGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB3b3JrZXIgZnJvbSAnbm9kZTp3b3JrZXJfdGhyZWFkcydcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB7IGFyY2gsIGhvc3RuYW1lLCBwbGF0Zm9ybSwgdHlwZSwgdmVyc2lvbiB9IGZyb20gJ25vZGU6b3MnXG5cbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uLy4uL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB7IFBFUkZfTUVBU1VSRU1FTlRfRU5WIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IEFQSVV0aWxzIGZyb20gJy4uLy4uL2NsaS9hcGlVdGlscy5qcydcbmltcG9ydCB7IENMSVV0aWxzIH0gZnJvbSAnLi4vLi4vY2xpL2NsaVV0aWxzLmpzJ1xuaW1wb3J0IHsgRVZFTlRTIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgZmV0Y2hXcmFwIGZyb20gJy4uLy4uL2ZldGNoV3JhcHBlci5qcydcbmltcG9ydCB0eXBlIHsgQ3N2V3JpdGVyIH0gZnJvbSAnY3N2LXdyaXRlci9zcmMvbGliL2Nzdi13cml0ZXIuanMnXG5pbXBvcnQgdHlwZSB7IE9iamVjdE1hcCB9IGZyb20gJ2Nzdi13cml0ZXIvc3JjL2xpYi9sYW5nL29iamVjdC5qcydcbmltcG9ydCB0eXBlIHsgQnJvd3NlciB9IGZyb20gJ3dlYmRyaXZlcmlvJ1xuXG4vLyBUZWxlbWV0cnkgbXVzdCBuZXZlciB0aHJvdyBpbnRvIGJ1c2luZXNzIGxvZ2ljLiBOb2RlIDE4J3MgcGVyZl9ob29rcyByZWplY3RzXG4vLyBuZWdhdGl2ZSB0aW1lc3RhbXBzIChlLmcuIHBlcmZvcm1hbmNlLm5vdygpIHVuZGVyIGZha2VkIHRpbWVycywgb3IgYW55IG90aGVyXG4vLyBlZGdlKSB3aXRoIEVSUl9QRVJGT1JNQU5DRV9JTlZBTElEX1RJTUVTVEFNUDsgTm9kZSAyMCsgdG9sZXJhdGVzIHRoZW0uIFdyYXBwaW5nXG4vLyBtYXJrL21lYXN1cmUga2VlcHMgYW4gaW5zdHJ1bWVudGF0aW9uIGZhaWx1cmUgZnJvbSBicmVha2luZyBhIGNhbGxlcidzIGhvb2tcbi8vIChlLmcuIGEgc2VydmljZSBiZWZvcmUoKSksIGFuZCBpcyBhIG5vLW9wIG9uIHRoZSBoYXBweSBwYXRoLlxuZnVuY3Rpb24gc2FmZU1hcmsobWFya05hbWU6IHN0cmluZykge1xuICAgIHRyeSB7IHBlcmZvcm1hbmNlLm1hcmsobWFya05hbWUpIH0gY2F0Y2ggeyAvKiBpbnN0cnVtZW50YXRpb24gbXVzdCBub3QgdGhyb3cgKi8gfVxufVxuZnVuY3Rpb24gc2FmZU1lYXN1cmUobWVhc3VyZU5hbWU6IHN0cmluZywgc3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcpIHtcbiAgICB0cnkgeyBwZXJmb3JtYW5jZS5tZWFzdXJlKG1lYXN1cmVOYW1lLCBzdGFydCwgZW5kKSB9IGNhdGNoIHsgLyogaW5zdHJ1bWVudGF0aW9uIG11c3Qgbm90IHRocm93ICovIH1cbn1cblxudHlwZSBQZXJmb3JtYW5jZURldGFpbHMgPSB7XG4gICAgc3VjY2Vzcz86IHRydWUsXG4gICAgZmFpbHVyZT86IHN0cmluZyxcbiAgICB0ZXN0TmFtZT86IHN0cmluZyxcbiAgICB3b3JrZXI/OiBzdHJpbmcgfCBudW1iZXIsXG4gICAgY2xpZW50V29ya2VySWQ/OiBzdHJpbmcsXG4gICAgY29tbWFuZD86IHN0cmluZyxcbiAgICBob29rVHlwZT86IHN0cmluZyxcbiAgICBwbGF0Zm9ybT86IHN0cmluZyB8IG51bWJlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZXJmb3JtYW5jZVRlc3RlciB7XG4gICAgc3RhdGljIF9vYnNlcnZlcjogUGVyZm9ybWFuY2VPYnNlcnZlclxuICAgIHN0YXRpYyBfY3N2V3JpdGVyOiBDc3ZXcml0ZXI8T2JqZWN0TWFwPHt9Pj5cbiAgICBwcml2YXRlIHN0YXRpYyBfZXZlbnRzOiBQZXJmb3JtYW5jZUVudHJ5W10gPSBbXVxuICAgIHByaXZhdGUgc3RhdGljIF9tZWFzdXJlZEV2ZW50czogQXJyYXk8UGVyZm9ybWFuY2VFbnRyeSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IFtdXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2hhc1N0b3BwZWRHZW5lcmF0aW9uID0gZmFsc2VcbiAgICBwcml2YXRlIHN0YXRpYyBfc3RvcEdlbmVyYXRlQ2FsbENvdW50ID0gMFxuICAgIHN0YXRpYyBzdGFydGVkID0gZmFsc2VcbiAgICBzdGF0aWMgZGV0YWlsczogeyBba2V5OiBzdHJpbmddOiBQZXJmb3JtYW5jZURldGFpbHMgfSA9IHt9XG4gICAgc3RhdGljIGV2ZW50c01hcDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgc3RhdGljIGJyb3dzZXI/OiBCcm93c2VyXG4gICAgc3RhdGljIHNjZW5hcmlvVGhhdFJhbjogc3RyaW5nW11cbiAgICBzdGF0aWMganNvblJlcG9ydERpck5hbWUgPSAncGVyZm9ybWFuY2UtcmVwb3J0J1xuICAgIHN0YXRpYyBqc29uUmVwb3J0RGlyUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycsIHRoaXMuanNvblJlcG9ydERpck5hbWUpXG4gICAgc3RhdGljIGpzb25SZXBvcnRGaWxlTmFtZSA9IGAke3RoaXMuanNvblJlcG9ydERpclBhdGh9L3BlcmZvcm1hbmNlLXJlcG9ydC0ke1BlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpfS5qc29uYFxuXG4gICAgc3RhdGljIHN0YXJ0TW9uaXRvcmluZyhjc3ZOYW1lOiBzdHJpbmcgPSAncGVyZm9ybWFuY2UtcmVwb3J0LmNzdicpIHtcblxuICAgICAgICAvLyBDcmVhdGUgcGVyZm9ybWFuY2UtcmVwb3J0IGRpciBpZiBub3QgZXhpc3RzIGFscmVhZHlcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuanNvblJlcG9ydERpclBhdGgpKSB7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5qc29uUmVwb3J0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBQZXJmb3JtYW5jZU9ic2VydmVyKGxpc3QgPT4ge1xuICAgICAgICAgICAgbGlzdC5nZXRFbnRyaWVzKClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuZW50cnlUeXBlID09PSAnbWVhc3VyZScpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goZW50cnkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmluYWxFbnRyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBlbnRyeS50b0pTT04oKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbmFsRW50cnkuc3RhcnRUaW1lID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UudGltZU9yaWdpbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFN0YXJ0VGltZSA9IGZpbmFsRW50cnkuc3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxFbnRyeS5zdGFydFRpbWUgPSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgZmluYWxFbnRyeS5zdGFydFRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFRpbWVzdGFtcCBjb252ZXJzaW9uIGZvciAke2VudHJ5Lm5hbWV9OiAke29yaWdpbmFsU3RhcnRUaW1lfSAtPiAke2ZpbmFsRW50cnkuc3RhcnRUaW1lfSAodGltZU9yaWdpbjogJHtwZXJmb3JtYW5jZS50aW1lT3JpZ2lufSlgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIGNvbnZlcnRpbmcgc3RhcnRUaW1lIHRvIGVwb2NoOiAke3V0aWwuZm9ybWF0KGUpfWApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXRhaWxzW2VudHJ5Lm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbEVudHJ5ID0gT2JqZWN0LmFzc2lnbihmaW5hbEVudHJ5LCB0aGlzLmRldGFpbHNbZW50cnkubmFtZV0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZGV0YWlsc1tlbnRyeS5uYW1lXVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlZEV2ZW50cy5wdXNoKGZpbmFsRW50cnkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgICAgIGxpc3QuZ2V0RW50cmllcygpLmZvckVhY2goKGVudHJ5KSA9PiB0aGlzLl9ldmVudHMucHVzaChlbnRyeSkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGVudHJ5VHlwZXM6IEVudHJ5VHlwZVtdID0gWydtZWFzdXJlJ11cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgZW50cnlUeXBlcy5wdXNoKCdmdW5jdGlvbicpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXIub2JzZXJ2ZSh7IGJ1ZmZlcmVkOiB0cnVlLCBlbnRyeVR5cGVzOiBlbnRyeVR5cGVzIH0pXG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWVcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgdGhpcy5fY3N2V3JpdGVyID0gY3JlYXRlT2JqZWN0Q3N2V3JpdGVyKHtcbiAgICAgICAgICAgICAgICBwYXRoOiBjc3ZOYW1lLFxuICAgICAgICAgICAgICAgIGhlYWRlcjogW1xuICAgICAgICAgICAgICAgICAgICB7IGlkOiAnbmFtZScsIHRpdGxlOiAnRnVuY3Rpb24gTmFtZScgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBpZDogJ3RpbWUnLCB0aXRsZTogJ0V4ZWN1dGlvbiBUaW1lIChtcyknIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGNhbGN1bGF0ZVRpbWVzKG1ldGhvZHM6IHN0cmluZ1tdKSA6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRpbWVzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge31cbiAgICAgICAgdGhpcy5fZXZlbnRzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGlmICghdGltZXNbZW50cnkubmFtZV0pIHtcbiAgICAgICAgICAgICAgICB0aW1lc1tlbnRyeS5uYW1lXSA9IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRpbWVzW2VudHJ5Lm5hbWVdICs9IGVudHJ5LmR1cmF0aW9uXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHRpbWVUYWtlbiA9IG1ldGhvZHMucmVkdWNlKChhLCBjKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGltZXNbY10gKyAoYSB8fCAwKVxuICAgICAgICB9LCAwKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFRpbWUgZm9yICR7bWV0aG9kc30gaXMgJHt0aW1lVGFrZW59YClcbiAgICAgICAgcmV0dXJuIHRpbWVUYWtlblxuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBzdG9wQW5kR2VuZXJhdGUoZmlsZW5hbWU6IHN0cmluZyA9ICdwZXJmb3JtYW5jZS1vd24uaHRtbCcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBldmVudHNKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5fbWVhc3VyZWRFdmVudHMpXG4gICAgICAgICAgICAvLyByZW1vdmUgZW5jbG9zaW5nIGFycmF5IGFuZCBhZGQgYSB0cmFpbGluZyBjb21tYSBzbyB0aGF0IHdlXG4gICAgICAgICAgICAvLyBkb250IG5lZWQgdG8gYm90aCByZWFkIGFuZCB0aGVuIHdyaXRlIHRoZSBmaWxlLCB3ZSBjYW4gdXNlIGFwcGVuZCBpbnN0ZWFkXG4gICAgICAgICAgICBjb25zdCBmaW5hbEpTT05TdHIgPSBldmVudHNKc29uLnNsaWNlKDEsIC0xKSArICcsJ1xuICAgICAgICAgICAgYXdhaXQgZnNQcm9taXNlLmFwcGVuZEZpbGUodGhpcy5qc29uUmVwb3J0RmlsZU5hbWUsIGZpbmFsSlNPTlN0cilcbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIHdyaXRlIGV2ZW50cyBvZiB0aGUgd29ya2VyIHRvICR7dGhpcy5qc29uUmVwb3J0RmlsZU5hbWV9OiAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKVxuXG4gICAgICAgIGlmICghcHJvY2Vzcy5lbnZbUEVSRl9NRUFTVVJFTUVOVF9FTlZdKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlXG5cbiAgICAgICAgLy8gR2VuZXJhdGUgQ1NWIGFuZCBIVE1MIHJlcG9ydHMgdXNpbmcgZGlyZWN0bHkgY29sbGVjdGVkIGV2ZW50c1xuICAgICAgICB0aGlzLmdlbmVyYXRlQ1NWKHRoaXMuX2V2ZW50cylcblxuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZW5lcmF0ZVJlcG9ydCh0aGlzLl9ldmVudHMpXG4gICAgICAgIGNvbnN0IGRpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBmaWxlbmFtZSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzUHJvbWlzZS53cml0ZUZpbGUoZGlyLCBjb250ZW50KVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oYFBlcmZvcm1hbmNlIHJlcG9ydCBpcyBhdCAke3BhdGh9YClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIGluIHdyaXRpbmcgaHRtbCAke3V0aWwuZm9ybWF0KGVycil9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZW5lcmF0ZVJlcG9ydChlbnRyaWVzOiBQZXJmb3JtYW5jZUVudHJ5W10pIHtcbiAgICAgICAgbGV0IGh0bWwgPSAnPCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+PHRpdGxlPlBlcmZvcm1hbmNlIFJlcG9ydDwvdGl0bGU+PC9oZWFkPjxib2R5PidcbiAgICAgICAgaHRtbCArPSAnPGgxPlBlcmZvcm1hbmNlIFJlcG9ydDwvaDE+J1xuICAgICAgICBodG1sICs9ICc8dGFibGU+PHRoZWFkPjx0cj48dGg+RnVuY3Rpb24gTmFtZTwvdGg+PHRoPkR1cmF0aW9uIChtcyk8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+J1xuICAgICAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBodG1sICs9IGA8dHI+PHRkPiR7ZW50cnkubmFtZX08L3RkPjx0ZD4ke2VudHJ5LmR1cmF0aW9ufTwvdGQ+PC90cj5gXG4gICAgICAgIH0pXG4gICAgICAgIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT48L2JvZHk+PC9odG1sPidcbiAgICAgICAgcmV0dXJuIGh0bWxcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2VuZXJhdGVDU1YoZW50cmllczogUGVyZm9ybWFuY2VFbnRyeVtdKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge31cbiAgICAgICAgZW50cmllcy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRpbWVzW2VudHJ5Lm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgdGltZXNbZW50cnkubmFtZV0gPSAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lc1tlbnRyeS5uYW1lXSArPSBlbnRyeS5kdXJhdGlvblxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgICAgICAgdGltZTogZW50cnkuZHVyYXRpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZGF0ID0gT2JqZWN0LmVudHJpZXModGltZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICB0aW1lOiB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLl9jc3ZXcml0ZXIud3JpdGVSZWNvcmRzKGRhdClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IEJTdGFja0xvZ2dlci5pbmZvKCdQZXJmb3JtYW5jZSBDU1YgcmVwb3J0IGdlbmVyYXRlZCBzdWNjZXNzZnVsbHknKSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGVycm9yKSlcbiAgICB9XG5cbiAgICBzdGF0aWMgTWVhc3VyZShsYWJlbDogc3RyaW5nLCBkZXRhaWxzOiBQZXJmb3JtYW5jZURldGFpbHMgPSB7fSkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgICAgICAgICBrZXk6IHN0cmluZyB8IHN5bWJvbCxcbiAgICAgICAgICAgIGRlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPEZ1bmN0aW9uPikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2Q6IEZ1bmN0aW9ufHVuZGVmaW5lZCA9IGRlc2NyaXB0b3IudmFsdWVcbiAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uKC4uLmFyZ3M6IG9iamVjdFtdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlLmFwcGx5KHNlbGYsIFtsYWJlbCwgb3JpZ2luYWxNZXRob2QgYXMgRnVuY3Rpb24sIHsgbWV0aG9kTmFtZToga2V5LnRvU3RyaW5nKCksIC4uLmRldGFpbHMgfSwgYXJncywgdGhpc10pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIG1lYXN1cmVXcmFwcGVyKG5hbWU6IHN0cmluZywgZm46IEZ1bmN0aW9uLCBkZXRhaWxzOiBQZXJmb3JtYW5jZURldGFpbHMgPSB7fSkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpc1xuXG4gICAgICAgIGRldGFpbHMud29ya2VyID0gUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKClcbiAgICAgICAgZGV0YWlscy50ZXN0TmFtZSA9IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbiAmJiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW5bUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuLmxlbmd0aCAtIDFdXG4gICAgICAgIGRldGFpbHMucGxhdGZvcm0gPSBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWRcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IChvYmplY3R8Ym9vbGVhbnx1bmRlZmluZWR8bnVsbHxzdHJpbmcpW10pIHtcblxuICAgICAgICAgICAgcmV0dXJuIHNlbGYubWVhc3VyZShuYW1lLCBmbiwgZGV0YWlscywgYXJncylcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgc3RhdGljIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICEocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1NES19JTlNUUlVNRU5UQVRJT04gPT09ICdmYWxzZScpXG4gICAgfVxuXG4gICAgc3RhdGljIG1lYXN1cmUobGFiZWw6IHN0cmluZywgZm46IEZ1bmN0aW9uLCBkZXRhaWxzID0ge30sIGFyZ3M/OiAob2JqZWN0fGJvb2xlYW58dW5kZWZpbmVkfG51bGx8c3RyaW5nKVtdLCB0aGlzQXJnOiBvYmplY3R8bnVsbCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQgfHwgIXRoaXMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQXJnLCBhcmdzKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgdW5pcXVlIG1hcmsgbmFtZXMgZm9yIHRoaXMgc3BlY2lmaWMgY2FsbCB0byBhdm9pZCB0aW1pbmcgY29uZmxpY3RzXG4gICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gYCR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNyl9YFxuICAgICAgICBjb25zdCBzdGFydE1hcmsgPSBgJHtsYWJlbH0tc3RhcnQtJHt1bmlxdWVJZH1gXG4gICAgICAgIGNvbnN0IGVuZE1hcmsgPSBgJHtsYWJlbH0tZW5kLSR7dW5pcXVlSWR9YFxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgc3RhcnQgbWFyayB3aXRoIHVuaXF1ZSBJRFxuICAgICAgICBzYWZlTWFyayhzdGFydE1hcmspXG5cbiAgICAgICAgLy8gU3RvcmUgZGV0YWlscyB3aXRoIG1lYXN1cmVtZW50IGNvbnRleHRcbiAgICAgICAgY29uc3QgZGV0YWlsc1dpdGhDb250ZXh0ID0ge1xuICAgICAgICAgICAgLi4uZGV0YWlscyxcbiAgICAgICAgICAgIG1lYXN1cmVtZW50SWQ6IHVuaXF1ZUlkXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gZm4uYXBwbHkodGhpc0FyZywgYXJncylcblxuICAgICAgICAgICAgaWYgKHJldHVyblZhbCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHYgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBzcGVjaWZpYyBtYXJrcyBmb3IgdGhpcyBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZU1hcmsoZW5kTWFyaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlTWVhc3VyZShsYWJlbCwgc3RhcnRNYXJrLCBlbmRNYXJrKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXRhaWxzW2xhYmVsXSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRQcm9jZXNzSWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm06IFBlcmZvcm1hbmNlVGVzdGVyLmJyb3dzZXI/LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbj8ucG9wKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBkZXRhaWxzV2l0aENvbnRleHQpLCB0aGlzLmRldGFpbHNbbGFiZWxdIHx8IHt9KSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVNYXJrKGVuZE1hcmspXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWlsc1tsYWJlbF0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmU6IHV0aWwuZm9ybWF0KGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50V29ya2VySWQ6IFBlcmZvcm1hbmNlVGVzdGVyLmdldENsaWVudFdvcmtlcklkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3ROYW1lOiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4/LnBvcCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZGV0YWlsc1dpdGhDb250ZXh0KSwgdGhpcy5kZXRhaWxzW2xhYmVsXSB8fCB7fSkpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3luY2hyb25vdXMgZXhlY3V0aW9uXG4gICAgICAgICAgICBzYWZlTWFyayhlbmRNYXJrKVxuICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgdGhpcy5kZXRhaWxzW2xhYmVsXSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgZmFpbHVyZTogdW5kZWZpbmVkXG4gICAgICAgICAgICB9LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIGNsaWVudFdvcmtlcklkOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRDbGllbnRXb3JrZXJJZCgpLFxuICAgICAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICAgICAgcGxhdGZvcm06IFBlcmZvcm1hbmNlVGVzdGVyLmJyb3dzZXI/LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICB0ZXN0TmFtZTogUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuPy5wb3AoKVxuICAgICAgICAgICAgfSwgZGV0YWlsc1dpdGhDb250ZXh0KSwgdGhpcy5kZXRhaWxzW2xhYmVsXSB8fCB7fSkpXG5cbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWxcbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIHNhZmVNYXJrKGVuZE1hcmspXG4gICAgICAgICAgICBzYWZlTWVhc3VyZShsYWJlbCwgc3RhcnRNYXJrLCBlbmRNYXJrKVxuXG4gICAgICAgICAgICB0aGlzLmRldGFpbHNbbGFiZWxdID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbHVyZTogdXRpbC5mb3JtYXQoZXIpXG4gICAgICAgICAgICB9LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIGNsaWVudFdvcmtlcklkOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRDbGllbnRXb3JrZXJJZCgpLFxuICAgICAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICAgICAgcGxhdGZvcm06IFBlcmZvcm1hbmNlVGVzdGVyLmJyb3dzZXI/LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICB0ZXN0TmFtZTogUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuPy5wb3AoKVxuICAgICAgICAgICAgfSwgZGV0YWlsc1dpdGhDb250ZXh0KSwgdGhpcy5kZXRhaWxzW2xhYmVsXSB8fCB7fSkpXG5cbiAgICAgICAgICAgIHRocm93IGVyXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgc3RhcnQoZXZlbnQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBmaW5hbEV2ZW50ID0gZXZlbnQgKyAnLXN0YXJ0J1xuICAgICAgICBpZiAodGhpcy5ldmVudHNNYXBbZmluYWxFdmVudF0pIHtyZXR1cm59XG4gICAgICAgIHNhZmVNYXJrKGZpbmFsRXZlbnQpXG4gICAgICAgIHRoaXMuZXZlbnRzTWFwW2ZpbmFsRXZlbnRdID0gMVxuICAgIH1cblxuICAgIHN0YXRpYyBlbmQoZXZlbnQ6IHN0cmluZywgc3VjY2VzcyA9IHRydWUsIGZhaWx1cmU/OiBzdHJpbmcgfCB1bmtub3duLCBkZXRhaWxzID0ge30pIHtcbiAgICAgICAgc2FmZU1hcmsoZXZlbnQgKyAnLWVuZCcpXG4gICAgICAgIHNhZmVNZWFzdXJlKGV2ZW50LCBldmVudCArICctc3RhcnQnLCBldmVudCArICctZW5kJylcbiAgICAgICAgLy8gQ2xlYXIgdGhlIHN0YXJ0LW1hcmsgZ3VhcmQgc28gYSBzdWJzZXF1ZW50IHN0YXJ0KGV2ZW50KSBmb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gZXZlbnQgYWN0dWFsbHkgbWFya3MgYSBuZXcgc3RhcnQuIFdpdGhvdXQgdGhpcywgc3RhcnQoKSBzaG9ydC1jaXJjdWl0c1xuICAgICAgICAvLyBhbmQgdGhlIG5leHQgZW5kKCkgbWVhc3VyZXMgZnJvbSB0aGUgb3JpZ2luYWwgc3RhcnQgbWFyayBcdTIwMTQgaW5mbGF0ZWRcbiAgICAgICAgLy8gZHVyYXRpb25zIGluIHRlbGVtZXRyeSBvbiBldmVyeSBjYWxsIGFmdGVyIHRoZSBmaXJzdC5cbiAgICAgICAgZGVsZXRlIHRoaXMuZXZlbnRzTWFwW2V2ZW50ICsgJy1zdGFydCddXG4gICAgICAgIHRoaXMuZGV0YWlsc1tldmVudF0gPSBPYmplY3QuYXNzaWduKHsgc3VjY2VzcywgZmFpbHVyZTogdXRpbC5mb3JtYXQoZmFpbHVyZSkgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIGNsaWVudFdvcmtlcklkOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRDbGllbnRXb3JrZXJJZCgpLFxuICAgICAgICAgICAgd29ya2VyOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRQcm9jZXNzSWQoKSxcbiAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICB0ZXN0TmFtZTogUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuICYmIFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbltQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4ubGVuZ3RoIC0gMV1cbiAgICAgICAgfSwgZGV0YWlscyksIHRoaXMuZGV0YWlsc1tldmVudF0gfHwge30pKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBjbGllbnQgd29ya2VyIElEIGluIGZvcm1hdCBcInRocmVhZElkLXByb2Nlc3NJZFwiLlxuICAgICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgY29uc2lzdGVudCBpZGVudGlmaWVyIGFjcm9zcyB0aGUgU0RLIGZvciB0cmFja2luZ1xuICAgICAqIHdvcmtlci1zcGVjaWZpYyBldmVudHMgYW5kIHBlcmZvcm1hbmNlIG1ldHJpY3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXb3JrZXIgSUQgc3RyaW5nIGluIGZvcm1hdCBcInRocmVhZElkLXByb2Nlc3NJZFwiXG4gICAgICovXG4gICAgc3RhdGljIGdldENsaWVudFdvcmtlcklkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBDTElVdGlscy5nZXRDbGllbnRXb3JrZXJJZCgpXG4gICAgfVxuXG4gICAgc3RhdGljIGdldFByb2Nlc3NJZCgpIHtcbiAgICAgICAgcmV0dXJuIGAke3Byb2Nlc3MucGlkfS0ke3dvcmtlci50aHJlYWRJZH1gXG4gICAgfVxuXG4gICAgc3RhdGljIHNsZWVwID0gKG1zID0gMTAwKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG5cbiAgICBzdGF0aWMgYXN5bmMgdXBsb2FkRXZlbnRzRGF0YSgpIHtcbiAgICAgICAgLy8gVHJhY2sgb3ZlcmFsbCBrZXkgbWV0cmljcyBvcGVyYXRpb25cbiAgICAgICAgdGhpcy5zdGFydChFVkVOVFMuU0RLX1NFTkRfS0VZX01FVFJJQ1MpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlcklkID0gYCR7cHJvY2Vzcy5waWR9YFxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbUGVyZm9ybWFuY2UgVXBsb2FkXSBTdGFydGluZyB1cGxvYWQgZm9yIHdvcmtlciAke3dvcmtlcklkfWApXG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHByZXBhcmF0aW9uIHBoYXNlIChjb2xsZWN0aW9uIGFuZCBkZWR1cGxpY2F0aW9uKVxuICAgICAgICAgICAgdGhpcy5zdGFydChFVkVOVFMuU0RLX0tFWV9NRVRSSUNTX1BSRVBBUkFUSU9OKVxuXG4gICAgICAgICAgICAvLyBDb2xsZWN0IGFsbCBtZWFzdXJlcyBmcm9tIHBlcmZvcm1hbmNlIHJlcG9ydCBmaWxlcyBhbmQgaW4tbWVtb3J5IGV2ZW50c1xuICAgICAgICAgICAgbGV0IG1lYXN1cmVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW11cbiAgICAgICAgICAgIGlmIChhd2FpdCBmc1Byb21pc2UuYWNjZXNzKHRoaXMuanNvblJlcG9ydERpclBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSkuY2F0Y2goKCkgPT4gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZXMgPSAoYXdhaXQgZnNQcm9taXNlLnJlYWRkaXIodGhpcy5qc29uUmVwb3J0RGlyUGF0aCkpLm1hcChmaWxlID0+IHBhdGgucmVzb2x2ZSh0aGlzLmpzb25SZXBvcnREaXJQYXRoLCBmaWxlKSlcbiAgICAgICAgICAgICAgICBtZWFzdXJlcyA9IChhd2FpdCBQcm9taXNlLmFsbChmaWxlcy5tYXAoKGZpbGUpID0+IGZzUHJvbWlzZS5yZWFkRmlsZShmaWxlLCAndXRmLTgnKSkpKS5tYXAoZWwgPT4gYFske2VsLnNsaWNlKDAsIC0xKX1dYCkubWFwKGVsID0+IEpTT04ucGFyc2UoZWwpKS5mbGF0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gVG90YWwgZXZlbnRzIGZyb20gZmlsZXM6ICR7bWVhc3VyZXMubGVuZ3RofWApXG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9tZWFzdXJlZEV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbUGVyZm9ybWFuY2UgVXBsb2FkXSBBZGRpbmcgJHt0aGlzLl9tZWFzdXJlZEV2ZW50cy5sZW5ndGh9IGluLW1lbW9yeSBldmVudHNgKVxuICAgICAgICAgICAgICAgIG1lYXN1cmVzID0gbWVhc3VyZXMuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlZEV2ZW50cy5tYXAoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IFBlcmZvcm1hbmNlRW50cnkgdG8gcGxhaW4gb2JqZWN0IGlmIGl0IGhhcyB0b0pTT05cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGUgYXMgUGVyZm9ybWFuY2VFbnRyeSkudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlIGFzIFBlcmZvcm1hbmNlRW50cnkpLnRvSlNPTigpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVuc3VyZUVwb2NoVGltZXMgPSAoYXJyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1dG9mZiA9IDFlMTIgLy8gfnllYXIgMjAwMSwgbXMgZXBvY2hcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lT3JpZ2luID0gKFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwZXJmb3JtYW5jZS50aW1lT3JpZ2luID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgPyBwZXJmb3JtYW5jZS50aW1lT3JpZ2luXG4gICAgICAgICAgICAgICAgICAgIDogKG5vdyAtIHByb2Nlc3MudXB0aW1lKCkgKiAxMDAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBhcnIubWFwKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnRyeS5zdGFydFRpbWUgPT09ICdudW1iZXInICYmIGVudHJ5LnN0YXJ0VGltZSA8IGN1dG9mZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3RhcnRUaW1lID0gdGltZU9yaWdpbiArIGVudHJ5LnN0YXJ0VGltZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtZWFzdXJlcyA9IGVuc3VyZUVwb2NoVGltZXMobWVhc3VyZXMpXG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKVxuICAgICAgICAgICAgLy8geXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1NTUyBaXG4gICAgICAgICAgICBjb25zdCBvcHRpb25zOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB0aW1lWm9uZTogJ1VUQycsXG4gICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICAgICAgICAgICAgaG91cjogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIHNlY29uZDogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIGZyYWN0aW9uYWxTZWNvbmREaWdpdHM6IDMsIC8vIFRvIGluY2x1ZGUgbWljcm9zZWNvbmRzXG4gICAgICAgICAgICAgICAgaG91cjEyOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRm9ybWF0IHRoZSBkYXRlIGFuZCByZXBsYWNlIHRoZSBkZWZhdWx0IHNlcGFyYXRvciBmb3IgdGltZSB6b25lXG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuLUdCJywgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAuZm9ybWF0VG9QYXJ0cyhkYXRlKVxuICAgICAgICAgICAgICAgIC5tYXAoKHsgdHlwZSwgdmFsdWUgfSkgPT4gdHlwZSA9PT0gJ3RpbWVab25lTmFtZScgPyAnWicgOiB2YWx1ZSlcbiAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnLCcsICdUJylcblxuICAgICAgICAgICAgdGhpcy5lbmQoRVZFTlRTLlNES19LRVlfTUVUUklDU19QUkVQQVJBVElPTiwgdHJ1ZSlcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ3Nka19ldmVudHMnLFxuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGh1Yl91dWlkOiBwcm9jZXNzLmVudi5QRVJGX1RFU1RIVUJfVVVJRCB8fCBwcm9jZXNzLmVudi5TREtfUlVOX0lELFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkX2RheTogZm9ybWF0dGVkRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRfbmFtZTogJ1NES0ZlYXR1cmVQZXJmb3JtYW5jZScsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YTogcHJvY2Vzcy5lbnYuUEVSRl9VU0VSX05BTUUsXG4gICAgICAgICAgICAgICAgICAgIGhvc3RfaW5mbzogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3RuYW1lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybTogcGxhdGZvcm0oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IHZlcnNpb24oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyY2g6IGFyY2goKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRfanNvbjogeyBtZWFzdXJlczogbWVhc3VyZXMsIHNka1J1bklkOiBwcm9jZXNzLmVudi5TREtfUlVOX0lEIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaFdyYXAoYCR7QVBJVXRpbHMuRURTX1VSTH0vc2VuZF9zZGtfZXZlbnRzYCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gU3VjY2Vzc2Z1bGx5IHVwbG9hZGVkIHRvIEVEUzogJHt1dGlsLmZvcm1hdChhd2FpdCByZXN1bHQudGV4dCgpKX1gKVxuXG4gICAgICAgICAgICB0aGlzLmVuZChFVkVOVFMuU0RLX1NFTkRfS0VZX01FVFJJQ1MsIHRydWUpXG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIEZhaWxlZCB0byB1cGxvYWQgZXZlbnRzOiAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICAgICAgdGhpcy5lbmQoRVZFTlRTLlNES19LRVlfTUVUUklDU19QUkVQQVJBVElPTiwgZmFsc2UsIGVyKVxuICAgICAgICAgICAgdGhpcy5lbmQoRVZFTlRTLlNES19TRU5EX0tFWV9NRVRSSUNTLCBmYWxzZSwgZXIpXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IGZzUHJvbWlzZS5hY2Nlc3ModGhpcy5qc29uUmVwb3J0RGlyUGF0aCkudGhlbigoKSA9PiB0cnVlLCAoKSA9PiBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzUHJvbWlzZS5yZWFkZGlyKHRoaXMuanNvblJlcG9ydERpclBhdGgpXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnNQcm9taXNlLnVubGluayhwYXRoLmpvaW4odGhpcy5qc29uUmVwb3J0RGlyUGF0aCwgZmlsZSkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbUGVyZm9ybWFuY2UgVXBsb2FkXSBDbGVhbmVkIHVwICR7ZmlsZXMubGVuZ3RofSB0ZW1wb3JhcnkgcmVwb3J0IGZpbGVzYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gRmFpbGVkIHRvIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXM6ICR7dXRpbC5mb3JtYXQoZXIpfWApXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5cbmltcG9ydCBsb2dnZXIgZnJvbSAnQHdkaW8vbG9nZ2VyJ1xuXG5pbXBvcnQgeyBMT0dTX0ZJTEUgfSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IENPTE9SUyB9IGZyb20gJy4vdXRpbC5qcydcblxuY29uc3QgbG9nID0gbG9nZ2VyKCdAd2Rpby9icm93c2Vyc3RhY2stc2VydmljZScpXG5cbmV4cG9ydCBjbGFzcyBCU3RhY2tMb2dnZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgTE9HU19GSUxFKVxuICAgIHB1YmxpYyBzdGF0aWMgbG9nRm9sZGVyUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycpXG4gICAgcHJpdmF0ZSBzdGF0aWMgbG9nRmlsZVN0cmVhbTogZnMuV3JpdGVTdHJlYW0gfCBudWxsXG5cbiAgICBwcml2YXRlIHN0YXRpYyByZWRhY3RDcmVkZW50aWFscyhsb2dNZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbG9nTWVzc2FnZVxuICAgICAgICAgICAgLnJlcGxhY2UoLyhbXCInXT8oPzp1c2VybmFtZXx1c2VyTmFtZXxhY2Nlc3NrZXl8YWNjZXNzS2V5fHVzZXJ8a2V5KVtcIiddP1xccypbOj1dXFxzKltcIiddPykoW15cIidcXHMsfV0rKS9naSwgJyQxJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oWz8mXSg/OnVzZXJuYW1lfHVzZXJOYW1lfGFjY2Vzc19rZXl8YWNjZXNza2V5fGFjY2Vzc0tleXx1c2VyfGtleSk9KShbXiYjXFxzXSspL2dpLCAnJDEnKVxuICAgIH1cblxuICAgIHN0YXRpYyBsb2dUb0ZpbGUobG9nTWVzc2FnZTogc3RyaW5nLCBsb2dMZXZlbDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKGxvZ01lc3NhZ2UpXG4gICAgICAgICAgICBpZiAoIXRoaXMubG9nRmlsZVN0cmVhbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5zdXJlTG9nc0ZvbGRlcigpXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odGhpcy5sb2dGaWxlUGF0aCwgeyBmbGFnczogJ2EnIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dGaWxlU3RyZWFtICYmIHRoaXMubG9nRmlsZVN0cmVhbS53cml0YWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbS53cml0ZSh0aGlzLmZvcm1hdExvZyhyZWRhY3RlZE1lc3NhZ2UsIGxvZ0xldmVsKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgRmFpbGVkIHRvIGxvZyB0byBmaWxlLiBFcnJvciAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmb3JtYXRMb2cobG9nTWVzc2FnZTogc3RyaW5nLCBsZXZlbDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBgJHtjaGFsay5ncmF5KG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSl9ICR7Y2hhbGtbQ09MT1JTW2xldmVsXV0obGV2ZWwudG9VcHBlckNhc2UoKSl9ICR7Y2hhbGsud2hpdGVCcmlnaHQoJ0B3ZGlvL2Jyb3dzZXJzdGFjay1zZXJ2aWNlJyl9ICR7bG9nTWVzc2FnZX1cXG5gXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpbmZvKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubG9nVG9GaWxlKHJlZGFjdGVkTWVzc2FnZSwgJ2luZm8nKVxuICAgICAgICBsb2cuaW5mbyhyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICdlcnJvcicpXG4gICAgICAgIGxvZy5lcnJvcihyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIHBhcmFtPzogdW5rbm93bikge1xuICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubG9nVG9GaWxlKHJlZGFjdGVkTWVzc2FnZSwgJ2RlYnVnJylcbiAgICAgICAgaWYgKHBhcmFtKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcocmVkYWN0ZWRNZXNzYWdlLCBwYXJhbSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhyZWRhY3RlZE1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHdhcm4obWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHJlZGFjdGVkTWVzc2FnZSA9IHRoaXMucmVkYWN0Q3JlZGVudGlhbHMobWVzc2FnZSlcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUocmVkYWN0ZWRNZXNzYWdlLCAnd2FybicpXG4gICAgICAgIGxvZy53YXJuKHJlZGFjdGVkTWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRyYWNlKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubG9nVG9GaWxlKHJlZGFjdGVkTWVzc2FnZSwgJ3RyYWNlJylcbiAgICAgICAgbG9nLnRyYWNlKHJlZGFjdGVkTWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyTG9nZ2VyKCkge1xuICAgICAgICBpZiAodGhpcy5sb2dGaWxlU3RyZWFtKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0uZW5kKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0gPSBudWxsXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckxvZ0ZpbGUoKSB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMubG9nRmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBmcy50cnVuY2F0ZVN5bmModGhpcy5sb2dGaWxlUGF0aClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW5zdXJlTG9nc0ZvbGRlcigpIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMubG9nRm9sZGVyUGF0aCkpe1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMubG9nRm9sZGVyUGF0aClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJ7XG4gIFwibmFtZVwiOiBcIkB3ZGlvL2Jyb3dzZXJzdGFjay1zZXJ2aWNlXCIsXG4gIFwidmVyc2lvblwiOiBcIjkuMzMuMlwiLFxuICBcImRlc2NyaXB0aW9uXCI6IFwiV2ViZHJpdmVySU8gc2VydmljZSBmb3IgYmV0dGVyIEJyb3dzZXJzdGFjayBpbnRlZ3JhdGlvblwiLFxuICBcImF1dGhvclwiOiBcIkJyb3dzZXJTdGFjayA8c3VwcG9ydEBicm93c2Vyc3RhY2suY29tPlwiLFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJzdGFjay93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlXCIsXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcImVuZ2luZXNcIjoge1xuICAgIFwibm9kZVwiOiBcIj49MTguMjAuMFwiXG4gIH0sXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXQraHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJzdGFjay93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlLmdpdFwiLFxuICAgIFwiZGlyZWN0b3J5XCI6IFwicGFja2FnZXMvYnJvd3NlcnN0YWNrLXNlcnZpY2VcIlxuICB9LFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcIndlYmRyaXZlcmlvXCIsXG4gICAgXCJ3ZGlvXCIsXG4gICAgXCJicm93c2Vyc3RhY2tcIixcbiAgICBcIndkaW8tc2VydmljZVwiXG4gIF0sXG4gIFwiYnVnc1wiOiB7XG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcnN0YWNrL3dkaW8tYnJvd3NlcnN0YWNrLXNlcnZpY2UvaXNzdWVzXCJcbiAgfSxcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwidHlwZXNcIjogXCIuL2J1aWxkL2luZGV4LmQudHNcIixcbiAgXCJleHBvcnRzXCI6IHtcbiAgICBcIi5cIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vYnVpbGQvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2J1aWxkL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9jbGVhbnVwXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2J1aWxkL2NsZWFudXAuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2J1aWxkL2NsZWFudXAuanNcIixcbiAgICAgIFwic291cmNlXCI6IFwiLi9zcmMvY2xlYW51cC50c1wiXG4gICAgfVxuICB9LFxuICBcInR5cGVTY3JpcHRWZXJzaW9uXCI6IFwiMy44LjNcIixcbiAgXCJmaWxlc1wiOiBbXG4gICAgXCJidWlsZFwiLFxuICAgIFwic3JjL3Byb3RvLyoqLyoucHJvdG9cIixcbiAgICBcImJyb3dzZXJzdGFjay1zZXJ2aWNlLmQudHNcIixcbiAgICBcIlJFQURNRS5tZFwiLFxuICAgIFwiTElDRU5TRVwiXG4gIF0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJjbGVhblwiOiBcInJpbXJhZiAuL2J1aWxkIHNyYy9ncnBjL2dlbmVyYXRlZFwiLFxuICAgIFwiZ2VuZXJhdGVcIjogXCJidWYgZ2VuZXJhdGVcIixcbiAgICBcImJ1aWxkXCI6IFwicmltcmFmIC4vYnVpbGQgc3JjL2dycGMvZ2VuZXJhdGVkICYmIGJ1ZiBnZW5lcmF0ZSAmJiBub2RlIC4vc2NyaXB0cy9idWlsZC5tanMgJiYgdHNjIC1wIHRzY29uZmlnLnByb2QuanNvblwiLFxuICAgIFwiYnVpbGQ6d2F0Y2hcIjogXCJub2RlIC4vc2NyaXB0cy9idWlsZC5tanMgLS13YXRjaFwiLFxuICAgIFwidGVzdFwiOiBcInZpdGVzdCAtLXJ1blwiLFxuICAgIFwidGVzdDp3YXRjaFwiOiBcInZpdGVzdFwiLFxuICAgIFwicHJlcGFja1wiOiBcIm5wbSBydW4gYnVpbGRcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYnJvd3NlcnN0YWNrL2FpLXNkay1ub2RlXCI6IFwiMS41LjE3XCIsXG4gICAgXCJAYnVmYnVpbGQvcHJvdG9idWZcIjogXCJeMi41LjJcIixcbiAgICBcIkBncnBjL2dycGMtanNcIjogXCIxLjEzLjNcIixcbiAgICBcIkBwZXJjeS9hcHBpdW0tYXBwXCI6IFwiXjIuMC45XCIsXG4gICAgXCJAcGVyY3kvc2VsZW5pdW0td2ViZHJpdmVyXCI6IFwiXjIuMi4yXCIsXG4gICAgXCJAdHlwZXMvZ2l0Y29uZmlnbG9jYWxcIjogXCJeMi4wLjFcIixcbiAgICBcImJyb3dzZXJzdGFjay1sb2NhbFwiOiBcIl4xLjUuMVwiLFxuICAgIFwiY2hhbGtcIjogXCJeNS4zLjBcIixcbiAgICBcImNzdi13cml0ZXJcIjogXCJeMS42LjBcIixcbiAgICBcImdpdC1yZXBvLWluZm9cIjogXCJeMi4xLjFcIixcbiAgICBcImdpdGNvbmZpZ2xvY2FsXCI6IFwiXjIuMS4wXCIsXG4gICAgXCJnbG9iXCI6IFwiXjExLjAuMFwiLFxuICAgIFwidGFyXCI6IFwiXjcuNS4xMVwiLFxuICAgIFwidW5kaWNpXCI6IFwiXjYuMjQuMFwiLFxuICAgIFwidXVpZFwiOiBcIl4xMS4xLjBcIixcbiAgICBcIndpbnN0b24tdHJhbnNwb3J0XCI6IFwiXjQuNS4wXCIsXG4gICAgXCJ5YXV6bFwiOiBcIl4zLjQuMFwiLFxuICAgIFwiQHdkaW8vbG9nZ2VyXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby9yZXBvcnRlclwiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vdHlwZXNcIjogXCJeOS4wLjBcIixcbiAgICBcIndlYmRyaXZlcmlvXCI6IFwiXjkuMC4wXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB3ZGlvL2NsaVwiOiBcIl41LjAuMCB8fCBeNi4wLjAgfHwgXjcuMC4wIHx8IF44LjAuMCB8fCBeOS4wLjBcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYnVmYnVpbGQvYnVmXCI6IFwiXjEuNTUuMVwiLFxuICAgIFwiQGNoYW5nZXNldHMvY2xpXCI6IFwiXjIuMjcuOVwiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMjAuMS4wXCIsXG4gICAgXCJAdHlwZXMvdGFyXCI6IFwiXjcuMC44N1wiLFxuICAgIFwiQHR5cGVzL3lhdXpsXCI6IFwiXjIuMTAuM1wiLFxuICAgIFwiQHdkaW8vZ2xvYmFsc1wiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vbG9nZ2VyXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby9yZXBvcnRlclwiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vdHlwZXNcIjogXCJeOS4wLjBcIixcbiAgICBcImVzYnVpbGRcIjogXCJeMC4yNy4yXCIsXG4gICAgXCJyaW1yYWZcIjogXCJeNi4wLjFcIixcbiAgICBcInRzLXByb3RvXCI6IFwiXjIuNy41XCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuOC4zXCIsXG4gICAgXCJ2aXRlc3RcIjogXCJeMy4yLjRcIixcbiAgICBcIndlYmRyaXZlcmlvXCI6IFwiXjkuMC4wXCJcbiAgfSxcbiAgXCJwdWJsaXNoQ29uZmlnXCI6IHtcbiAgICBcImFjY2Vzc1wiOiBcInB1YmxpY1wiXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJyb3dzZXJzdGFja0NvbmZpZyB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgcGtnIGZyb20gJy4uL3BhY2thZ2UuanNvbicgd2l0aCB7IHR5cGU6ICdqc29uJyB9XG5cbmNvbnN0IGJzdGFja1NlcnZpY2VWZXJzaW9uID0gcGtnLnZlcnNpb25cblxuZXhwb3J0IGNvbnN0IEJST1dTRVJfREVTQ1JJUFRJT04gPSBbXG4gICAgJ2RldmljZScsXG4gICAgJ29zJyxcbiAgICAnb3NWZXJzaW9uJyxcbiAgICAnb3NfdmVyc2lvbicsXG4gICAgJ2Jyb3dzZXJOYW1lJyxcbiAgICAnYnJvd3NlcicsXG4gICAgJ2Jyb3dzZXJWZXJzaW9uJyxcbiAgICAnYnJvd3Nlcl92ZXJzaW9uJ1xuXSBhcyBjb25zdFxuXG5leHBvcnQgY29uc3QgVkFMSURfQVBQX0VYVEVOU0lPTiA9IFtcbiAgICAnLmFwaycsXG4gICAgJy5hYWInLFxuICAgICcuaXBhJ1xuXVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9PUFRJT05TOiBQYXJ0aWFsPEJyb3dzZXJzdGFja0NvbmZpZz4gPSB7XG4gICAgc2V0U2Vzc2lvbk5hbWU6IHRydWUsXG4gICAgc2V0U2Vzc2lvblN0YXR1czogdHJ1ZSxcbiAgICB0ZXN0T2JzZXJ2YWJpbGl0eTogdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgY29uc29sZUhvbGRlcjogdHlwZW9mIGNvbnNvbGUgPSBPYmplY3QuYXNzaWduKHt9LCBjb25zb2xlKVxuXG5leHBvcnQgY29uc3QgREFUQV9FTkRQT0lOVCA9ICdodHRwczovL2NvbGxlY3Rvci1vYnNlcnZhYmlsaXR5LmJyb3dzZXJzdGFjay5jb20nXG5leHBvcnQgY29uc3QgQVBQX0FMTFlfRU5EUE9JTlQgPSAnaHR0cHM6Ly9hcHAtYWNjZXNzaWJpbGl0eS5icm93c2Vyc3RhY2suY29tL2F1dG9tYXRlJ1xuZXhwb3J0IGNvbnN0IEFQUF9BTExZX0lTU1VFU19FTkRQT0lOVCA9ICdhcGkvdjEvaXNzdWVzJ1xuZXhwb3J0IGNvbnN0IEFQUF9BTExZX0lTU1VFU19TVU1NQVJZX0VORFBPSU5UID0gJ2FwaS92MS9pc3N1ZXMtc3VtbWFyeSdcbmV4cG9ydCBjb25zdCBEQVRBX0VWRU5UX0VORFBPSU5UID0gJ2FwaS92MS9ldmVudCdcbmV4cG9ydCBjb25zdCBEQVRBX0JBVENIX0VORFBPSU5UID0gJ2FwaS92MS9iYXRjaCdcbmV4cG9ydCBjb25zdCBEQVRBX1NDUkVFTlNIT1RfRU5EUE9JTlQgPSAnYXBpL3YxL3NjcmVlbnNob3RzJ1xuZXhwb3J0IGNvbnN0IERBVEFfQkFUQ0hfU0laRSA9IDEwMDBcbmV4cG9ydCBjb25zdCBEQVRBX0JBVENIX0lOVEVSVkFMID0gMjAwMFxuZXhwb3J0IGNvbnN0IEJBVENIX0VWRU5UX1RZUEVTID0gWydMb2dDcmVhdGVkJywgJ1Rlc3RSdW5TdGFydGVkJywgJ1Rlc3RSdW5GaW5pc2hlZCcsICdIb29rUnVuRmluaXNoZWQnLCAnSG9va1J1blN0YXJ0ZWQnLCAnU2NyZWVuc2hvdENyZWF0ZWQnXVxuZXhwb3J0IGNvbnN0IERFRkFVTFRfV0FJVF9USU1FT1VUX0ZPUl9QRU5ESU5HX1VQTE9BRFMgPSA1MDAwIC8vIDVzXG5leHBvcnQgY29uc3QgREVGQVVMVF9XQUlUX0lOVEVSVkFMX0ZPUl9QRU5ESU5HX1VQTE9BRFMgPSAxMDAgLy8gMTAwbXNcbmV4cG9ydCBjb25zdCBCU1RBQ0tfU0VSVklDRV9WRVJTSU9OID0gYnN0YWNrU2VydmljZVZlcnNpb25cblxuZXhwb3J0IGNvbnN0IE5PVF9BTExPV0VEX0tFWVNfSU5fQ0FQUyA9IFsnaW5jbHVkZVRhZ3NJblRlc3RpbmdTY29wZScsICdleGNsdWRlVGFnc0luVGVzdGluZ1Njb3BlJywgJ3Rlc3RNYW5hZ2VtZW50T3B0aW9ucycsICdza2lwQXBwT3ZlcnJpZGUnXVxuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUX1BMQU5fSUQgPSAnQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRCdcblxuZXhwb3J0IGNvbnN0IExPR1NfRklMRSA9ICdsb2dzL2JzdGFjay13ZGlvLXNlcnZpY2UubG9nJ1xuZXhwb3J0IGNvbnN0IENMSV9ERUJVR19MT0dTX0ZJTEUgPSAnbG9nL3Nkay1jbGktZGVidWcubG9nJ1xuZXhwb3J0IGNvbnN0IFVQTE9BRF9MT0dTX0FERFJFU1MgPSAnaHR0cHM6Ly91cGxvYWQtb2JzZXJ2YWJpbGl0eS5icm93c2Vyc3RhY2suY29tJ1xuZXhwb3J0IGNvbnN0IFVQTE9BRF9MT0dTX0VORFBPSU5UID0gJ2NsaWVudC1sb2dzL3VwbG9hZCdcblxuZXhwb3J0IGNvbnN0IFBFUkNZX0xPR1NfRklMRSA9ICdsb2dzL3BlcmN5LmxvZydcblxuZXhwb3J0IGNvbnN0IFBFUkNZX0RPTV9DSEFOR0lOR19DT01NQU5EU19FTkRQT0lOVFMgPSBbXG4gICAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvdXJsJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9mb3J3YXJkJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9iYWNrJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9yZWZyZXNoJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9zY3JlZW5zaG90JyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hY3Rpb25zJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL3NoYWtlJ1xuXVxuXG5leHBvcnQgY29uc3QgQ0FQVFVSRV9NT0RFUyA9IFsnY2xpY2snLCAnYXV0bycsICdzY3JlZW5zaG90JywgJ21hbnVhbCcsICd0ZXN0Y2FzZSddXG5leHBvcnQgY29uc3QgTE9HX0tJTkRfVVNBR0VfTUFQID0ge1xuICAgICdURVNUX0xPRyc6ICdsb2cnLFxuICAgICdURVNUX1NDUkVFTlNIT1QnOiAnc2NyZWVuc2hvdCcsXG4gICAgJ1RFU1RfU1RFUCc6ICdzdGVwJyxcbiAgICAnSFRUUCc6ICdodHRwJ1xufVxuXG5leHBvcnQgY29uc3QgRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwgPSAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9zZGsvdjEvZXZlbnQnXG5cbmV4cG9ydCBjb25zdCBFRFNfVVJMID0gJ2h0dHBzOi8vZWRzLmJyb3dzZXJzdGFjay5jb20nXG5cbmV4cG9ydCBjb25zdCBTVVBQT1JURURfQlJPV1NFUlNfRk9SX0FJID0gWydjaHJvbWUnLCAnbWljcm9zb2Z0ZWRnZScsICdmaXJlZm94J11cblxuZXhwb3J0IGNvbnN0IFRDR19VUkwgPSAnaHR0cHM6Ly90Y2cuYnJvd3NlcnN0YWNrLmNvbSdcblxuZXhwb3J0IGNvbnN0IFRDR19JTkZPID0ge1xuICAgIHRjZ1JlZ2lvbjogJ3VzZScsXG4gICAgdGNnVXJsOiBUQ0dfVVJMLFxufVxuXG4vLyBTbWFydCBTZWxlY3Rpb24gTW9kZSBDb25zdGFudHNcbmV4cG9ydCBjb25zdCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCA9ICdyZWxldmFudEZpcnN0J1xuZXhwb3J0IGNvbnN0IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX09OTFkgPSAncmVsZXZhbnRPbmx5J1xuXG4vLyBFbnYgdmFyaWFibGVzIC0gRGVmaW5lIGFsbCB0aGUgZW52IHZhcmlhYmxlIGNvbnN0YW50cyBvdmVyIGhlcmVcblxuLy8gVG8gc3RvcmUgdGhlIEpXVCB0b2tlbiByZXR1cm5lZCB0aGUgc2Vzc2lvbiBsYXVuY2hcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QgPSAnQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUJ1xuXG4vLyBUbyBzdG9yZSB0Y2cgYXV0aCByZXN1bHQgZm9yIHNlbGZIZWFsaW5nIGZlYXR1cmU6XG5leHBvcnQgY29uc3QgQlNUQUNLX1RDR19BVVRIX1JFU1VMVCA9ICdCU1RBQ0tfVENHX0FVVEhfUkVTVUxUJ1xuXG4vLyBUbyBzdG9yZSB0aGUgc2V0dGluZyBvZiB3aGV0aGVyIHRvIHNlbmQgc2NyZWVuc2hvdHMgb3Igbm90XG5leHBvcnQgY29uc3QgVEVTVE9QU19TQ1JFRU5TSE9UX0VOViA9ICdCU19URVNUT1BTX0FMTE9XX1NDUkVFTlNIT1RTJ1xuXG4vLyBUbyBzdG9yZSBidWlsZCBoYXNoZWQgaWRcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEID0gJ0JST1dTRVJTVEFDS19URVNUSFVCX1VVSUQnXG4vLyBJbnRlcnJ1cHQgc2lnbmFsLCBwcm9wYWdhdGVkIHZpYSBlbnYgc28gdGhlIGRldGFjaGVkIGNsZWFudXAgY2hpbGQgYW5kIGdSUENcbi8vIHN0b3AgcGF0aCBjYW4gc3RhbXAgdGhlIGtpbGwgcmVhc29uIG9udG8gdGhlIGJ1aWxkIHN0b3AuXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0tJTExfU0lHTkFMID0gJ0JST1dTRVJTVEFDS19TREtfS0lMTF9TSUdOQUwnXG5cbi8vIFRvIHN0b3JlIHRlc3QgcnVuIHV1aWRcbmV4cG9ydCBjb25zdCBURVNUX0FOQUxZVElDU19JRCA9ICdURVNUX0FOQUxZVElDU19JRCdcblxuLy8gV2hldGhlciB0byBjb2xsZWN0IHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbiBvciBub3RcbmV4cG9ydCBjb25zdCBQRVJGX01FQVNVUkVNRU5UX0VOViA9ICdCUk9XU0VSU1RBQ0tfTzExWV9QRVJGX01FQVNVUkVNRU5UJ1xuXG4vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHJ1biBpcyByZXJ1biBvciBub3RcbmV4cG9ydCBjb25zdCBSRVJVTl9URVNUU19FTlYgPSAnQlJPV1NFUlNUQUNLX1JFUlVOX1RFU1RTJ1xuXG4vLyBUaGUgdGVzdHMgdGhhdCBuZWVkcyB0byBiZSByZXJ1blxuZXhwb3J0IGNvbnN0IFJFUlVOX0VOViA9ICdCUk9XU0VSU1RBQ0tfUkVSVU4nXG5cbi8vIFRvIHN0b3JlIHdoZXRoZXIgdGhlIGJ1aWxkIGxhdW5jaCBoYXMgY29tcGxldGVkIG9yIG5vdFxuZXhwb3J0IGNvbnN0IFRFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOViA9ICdCU19URVNUT1BTX0JVSUxEX0NPTVBMRVRFRCdcblxuLy8gV2hldGhlciBwZXJjeSBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkgb3Igbm90XG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1BFUkNZID0gJ0JST1dTRVJTVEFDS19QRVJDWSdcblxuLy8gV2hldGhlciBzZXNzaW9uIGlzIGEgYWNjZXNzaWJpbGl0eSBzZXNzaW9uXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFkgPSAnQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFknXG5cbi8vIFdoZXRoZXIgc2Vzc2lvbiBpcyBhIHRlc3QgcmVwb3J0aW5nIHNlc3Npb25cbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSA9ICdCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSdcblxuLy8gTG9hZCBUZXN0aW5nIFNlcnZpY2UgKExUUykgZW52IHZhcnM6IHRoZSBwb2QtaXRlcmF0aW9uIHNlc3Npb24gaWQgKGl0c1xuLy8gcHJlc2VuY2UgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIFwidGhpcyBydW4gaXMgYW4gTFRTIHBvZFxuLy8gaXRlcmF0aW9uXCIpIGFuZCBhbiBvcHRpb25hbCBvcHQtaW4gZmxhZyBmb3IgbG9jYWwgcmVwcm8gLyBDSSBydW5zIHRoYXRcbi8vIGRvbid0IGhhdmUgYSByZWFsIHNlc3Npb24gaWQuXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEID0gJ0JST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRCdcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfTFRTID0gJ0JST1dTRVJTVEFDS19MVFMnXG5cbi8vIE5ldyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGVudmlyb25tZW50IHZhcmlhYmxlc1xuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUX1JFUE9SVElORyA9ICdCUk9XU0VSU1RBQ0tfVEVTVF9SRVBPUlRJTkcnXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1RFU1RfUkVQT1JUSU5HX0RFQlVHID0gJ0JST1dTRVJTVEFDS19URVNUX1JFUE9SVElOR19ERUJVRydcbmV4cG9ydCBjb25zdCBURVNUX1JFUE9SVElOR19CVUlMRF9UQUcgPSAnVEVTVF9SRVBPUlRJTkdfQlVJTERfVEFHJ1xuZXhwb3J0IGNvbnN0IFRFU1RfUkVQT1JUSU5HX1BST0pFQ1RfTkFNRSA9ICdURVNUX1JFUE9SVElOR19QUk9KRUNUX05BTUUnXG5leHBvcnQgY29uc3QgVEVTVF9SRVBPUlRJTkdfQlVJTERfTkFNRSA9ICdURVNUX1JFUE9SVElOR19CVUlMRF9OQU1FJ1xuXG4vLyBNYXhpbXVtIHNpemUgb2YgVkNTIGluZm8gd2hpY2ggaXMgYWxsb3dlZFxuZXhwb3J0IGNvbnN0IE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVMgPSA2NCAqIDEwMjRcblxuLyogVGhlIHZhbHVlIHRvIGJlIGFwcGVuZGVkIGF0IHRoZSBlbmQgaWYgZ2l0IG1ldGFkYXRhIGlzIGxhcmdlciB0aGFuIE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVNcbiovXG5leHBvcnQgY29uc3QgR0lUX01FVEFfREFUQV9UUlVOQ0FURUQgPSAnLi4uW1RSVU5DQVRFRF0nXG5cbi8vIENMSSByZWxhdGVkIGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IENMSV9TVE9QX1RJTUVPVVQgPSA1MDAwIC8vIDUgc2Vjb25kc1xuZXhwb3J0IGNvbnN0IEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTID0gWydFVFhUQlNZJywgJ0VCVVNZJ11cbmV4cG9ydCBjb25zdCBNQVhfU1BBV05fUkVUUklFUyA9IDNcbmV4cG9ydCBjb25zdCBTUEFXTl9SRVRSWV9ERUxBWV9NUyA9IDEwMDBcbmV4cG9ydCBjb25zdCBXRElPX05BTUlOR19QUkVGSVggPSAnV2ViZHJpdmVySU8tJ1xuZXhwb3J0IGNvbnN0IFBFUkZfTUVUUklDU19XQUlUX1RJTUUgPSAyMDAwXG5cbi8vIEFQSSBFbmRwb2ludCBjb25zdGFudHNcbmV4cG9ydCBjb25zdCBVUERBVEVEX0NMSV9FTkRQT0lOVCA9ICdzZGsvdjEvdXBkYXRlX2NsaSdcblxuLyoqXG4gKiBNb2R1bGUgSG9vayBFdmVudHMgLSBQZXJmb3JtYW5jZSBldmVudCBuYW1lcyBmb3IgbW9kdWxlIGxpZmVjeWNsZSB0cmFja2luZ1xuICogVXNlZCBieSBtb2R1bGUtaG9vay10cmFja2VyLnRzIHRvIGluc3RydW1lbnQgbW9kdWxlIGluaXRpYWxpemF0aW9uIGFuZCBjbGVhbnVwXG4gKi9cbmV4cG9ydCBjb25zdCBNT0RVTEVfSE9PS19FVkVOVFMgPSB7XG4gICAgLy8gSW5zdHJ1bWVudGF0aW9uIG1vZHVsZVxuICAgIElOU1RSVU1FTlRBVElPTl9PTl9TVEFSVDogJ01PRFVMRV9JTlNUUlVNRU5UQVRJT05fT05fU1RBUlQnLFxuICAgIElOU1RSVU1FTlRBVElPTl9PTl9TVE9QOiAnTU9EVUxFX0lOU1RSVU1FTlRBVElPTl9PTl9TVE9QJyxcblxuICAgIC8vIFRlc3RIdWIgbW9kdWxlXG4gICAgVEVTVEhVQl9PTl9TVEFSVDogJ01PRFVMRV9URVNUSFVCX09OX1NUQVJUJyxcbiAgICBURVNUSFVCX09OX1NUT1A6ICdNT0RVTEVfVEVTVEhVQl9PTl9TVE9QJyxcblxuICAgIC8vIE9ic2VydmFiaWxpdHkgbW9kdWxlXG4gICAgT0JTRVJWQUJJTElUWV9PTl9TVEFSVDogJ01PRFVMRV9PQlNFUlZBQklMSVRZX09OX1NUQVJUJyxcbiAgICBPQlNFUlZBQklMSVRZX09OX1NUT1A6ICdNT0RVTEVfT0JTRVJWQUJJTElUWV9PTl9TVE9QJyxcblxuICAgIC8vIFBlcmN5IG1vZHVsZVxuICAgIFBFUkNZX09OX1NUQVJUOiAnTU9EVUxFX1BFUkNZX09OX1NUQVJUJyxcbiAgICBQRVJDWV9PTl9TVE9QOiAnTU9EVUxFX1BFUkNZX09OX1NUT1AnLFxuXG4gICAgLy8gQWNjZXNzaWJpbGl0eSBtb2R1bGVcbiAgICBBQ0NFU1NJQklMSVRZX09OX1NUQVJUOiAnTU9EVUxFX0FDQ0VTU0lCSUxJVFlfT05fU1RBUlQnLFxuICAgIEFDQ0VTU0lCSUxJVFlfT05fU1RPUDogJ01PRFVMRV9BQ0NFU1NJQklMSVRZX09OX1NUT1AnLFxuICAgIEFDQ0VTU0lCSUxJVFlfT05fRFJJVkVSX0lOSVQ6ICdNT0RVTEVfQUNDRVNTSUJJTElUWV9PTl9EUklWRVJfSU5JVCcsXG5cbiAgICAvLyBBSSBtb2R1bGVcbiAgICBBSV9PTl9TVEFSVDogJ01PRFVMRV9BSV9PTl9TVEFSVCcsXG4gICAgQUlfT05fU1RPUDogJ01PRFVMRV9BSV9PTl9TVE9QJyxcbiAgICBBSV9CRUZPUkVfU0VTU0lPTjogJ01PRFVMRV9BSV9CRUZPUkVfU0VTU0lPTicsXG4gICAgQUlfT05fRFJJVkVSX0lOSVQ6ICdNT0RVTEVfQUlfT05fRFJJVkVSX0lOSVQnLFxuXG4gICAgLy8gTG9jYWwgdGVzdGluZyBtb2R1bGVcbiAgICBMT0NBTF9PTl9TVEFSVDogJ01PRFVMRV9MT0NBTF9PTl9TVEFSVCcsXG4gICAgTE9DQUxfT05fU1RPUDogJ01PRFVMRV9MT0NBTF9PTl9TVE9QJyxcbiAgICBMT0NBTF9JTklUX1NFU1NJT046ICdNT0RVTEVfTE9DQUxfSU5JVF9TRVNTSU9OJyxcbiAgICBMT0NBTF9PTl9EUklWRVJfSU5JVDogJ01PRFVMRV9MT0NBTF9PTl9EUklWRVJfSU5JVCcsXG5cbiAgICAvLyBBcHAgQXV0b21hdGUgbW9kdWxlXG4gICAgQVBQQVVUT01BVEVfT05fU1RBUlQ6ICdNT0RVTEVfQVBQQVVUT01BVEVfT05fU1RBUlQnLFxuICAgIEFQUEFVVE9NQVRFX09OX0RSSVZFUl9JTklUOiAnTU9EVUxFX0FQUEFVVE9NQVRFX09OX0RSSVZFUl9JTklUJyxcbn0gYXMgY29uc3RcbiIsICJleHBvcnQgZGVmYXVsdCBjbGFzcyBBUElVdGlscyB7XG4gICAgc3RhdGljIEZVTk5FTF9JTlNUUlVNRU5UQVRJT05fVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20vc2RrL3YxL2V2ZW50J1xuICAgIHN0YXRpYyBCUk9XU0VSU1RBQ0tfQVVUT01BVEVfQVBJX1VSTCA9ICdodHRwczovL2FwaS5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBCUk9XU0VSU1RBQ0tfQUFfQVBJX1VSTCA9ICdodHRwczovL2FwaS5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBCUk9XU0VSU1RBQ0tfUEVSQ1lfQVBJX1VSTCA9ICdodHRwczovL2FwaS5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBCUk9XU0VSU1RBQ0tfQVVUT01BVEVfQVBJX0NMT1VEX1VSTCA9ICdodHRwczovL2FwaS1jbG91ZC5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBCUk9XU0VSU1RBQ0tfQUFfQVBJX0NMT1VEX1VSTCA9ICdodHRwczovL2FwaS1jbG91ZC5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBBUFBfQUxMWV9FTkRQT0lOVCA9ICdodHRwczovL2FwcC1hY2Nlc3NpYmlsaXR5LmJyb3dzZXJzdGFjay5jb20vYXV0b21hdGUnXG4gICAgc3RhdGljIERBVEFfRU5EUE9JTlQgPSAnaHR0cHM6Ly9jb2xsZWN0b3Itb2JzZXJ2YWJpbGl0eS5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBVUExPQURfTE9HU19BRERSRVNTID0gJ2h0dHBzOi8vdXBsb2FkLW9ic2VydmFiaWxpdHkuYnJvd3NlcnN0YWNrLmNvbSdcbiAgICBzdGF0aWMgRURTX1VSTCA9ICdodHRwczovL2Vkcy5icm93c2Vyc3RhY2suY29tJ1xuXG4gICAgc3RhdGljIHVwZGF0ZVVSTFNGb3JHUlIoYXBpczogR1JSVXJscykge1xuICAgICAgICB0aGlzLkZVTk5FTF9JTlNUUlVNRU5UQVRJT05fVVJMID0gYCR7YXBpcy5hdXRvbWF0ZS5hcGl9L3Nkay92MS9ldmVudGBcbiAgICAgICAgdGhpcy5CUk9XU0VSU1RBQ0tfQVVUT01BVEVfQVBJX1VSTCA9IGFwaXMuYXV0b21hdGUuYXBpXG4gICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX0FBX0FQSV9VUkwgPSBhcGlzLmFwcEF1dG9tYXRlLmFwaVxuICAgICAgICB0aGlzLkJST1dTRVJTVEFDS19QRVJDWV9BUElfVVJMID0gYXBpcy5wZXJjeS5hcGlcbiAgICAgICAgdGhpcy5CUk9XU0VSU1RBQ0tfQVVUT01BVEVfQVBJX0NMT1VEX1VSTCA9IGFwaXMuYXV0b21hdGUudXBsb2FkXG4gICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX0FBX0FQSV9DTE9VRF9VUkwgPSBhcGlzLmFwcEF1dG9tYXRlLnVwbG9hZFxuICAgICAgICB0aGlzLkFQUF9BTExZX0VORFBPSU5UID0gYCR7YXBpcy5hcHBBY2Nlc3NpYmlsaXR5LmFwaX0vYXV0b21hdGVgXG4gICAgICAgIHRoaXMuREFUQV9FTkRQT0lOVCA9IGFwaXMub2JzZXJ2YWJpbGl0eS5hcGlcbiAgICAgICAgdGhpcy5VUExPQURfTE9HU19BRERSRVNTID0gYXBpcy5vYnNlcnZhYmlsaXR5LnVwbG9hZFxuICAgICAgICB0aGlzLkVEU19VUkwgPSBhcGlzLmVkc0luc3RydW1lbnRhdGlvbi5hcGlcbiAgICB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyBwbGF0Zm9ybSwgYXJjaCwgaG9tZWRpciB9IGZyb20gJ25vZGU6b3MnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgdXRpbCwgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdub2RlOnN0cmVhbSdcbmltcG9ydCB0eXBlIHsgWmlwRmlsZSwgT3B0aW9ucyBhcyB5YXV6bE9wdGlvbnMgfSBmcm9tICd5YXV6bCdcbmltcG9ydCB5YXV6bCBmcm9tICd5YXV6bCdcbmltcG9ydCB7IHRocmVhZElkIH0gZnJvbSAnbm9kZTp3b3JrZXJfdGhyZWFkcydcblxuaW1wb3J0IHsgX2ZldGNoIGFzIGZldGNoIH0gZnJvbSAnLi4vZmV0Y2hXcmFwcGVyLmpzJ1xuXG5pbXBvcnQge1xuICAgIGlzTnVsbE9yRW1wdHksXG4gICAgbmVzdGVkS2V5VmFsdWUsXG4gICAgY3JlYXRlRGlyLFxuICAgIGlzV3JpdGFibGUsXG4gICAgc2V0UmVhZFdyaXRlQWNjZXNzLFxuICAgIGlzVHJ1ZSxcbiAgICBnZXRCcm93c2VyU3RhY2tVc2VyLFxuICAgIGdldEJyb3dzZXJTdGFja0tleSxcbiAgICBpc0ZhbHNlLFxuICAgIGlzVHVyYm9TY2FsZSxcbiAgICBzaG91bGRBZGRTZXJ2aWNlVmVyc2lvbixcbn0gZnJvbSAnLi4vdXRpbC5qcydcbmltcG9ydCBQZXJmb3JtYW5jZVRlc3RlciBmcm9tICcuLi9pbnN0cnVtZW50YXRpb24vcGVyZm9ybWFuY2UvcGVyZm9ybWFuY2UtdGVzdGVyLmpzJ1xuaW1wb3J0IHsgRVZFTlRTIGFzIFBlcmZvcm1hbmNlRXZlbnRzIH0gZnJvbSAnLi4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciBhcyBsb2dnZXIgfSBmcm9tICcuL2NsaUxvZ2dlci5qcydcbmltcG9ydCB7IFVQREFURURfQ0xJX0VORFBPSU5ULCBCU1RBQ0tfU0VSVklDRV9WRVJTSU9OLCBCSU5BUllfQlVTWV9FUlJPUl9DT0RFUyB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCB0eXBlIHsgT3B0aW9ucywgQ2FwYWJpbGl0aWVzIH0gZnJvbSAnQHdkaW8vdHlwZXMnXG5pbXBvcnQgdHlwZSB7XG4gICAgQnJvd3NlcnN0YWNrQ29uZmlnLFxuICAgIEJyb3dzZXJzdGFja09wdGlvbnMsXG4gICAgVGVzdE1hbmFnZW1lbnRPcHRpb25zLFxuICAgIFRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyxcbn0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBUZXN0RnJhbWV3b3JrQ29uc3RhbnRzIH0gZnJvbSAnLi9mcmFtZXdvcmtzL2NvbnN0YW50cy90ZXN0RnJhbWV3b3JrQ29uc3RhbnRzLmpzJ1xuaW1wb3J0IEFQSVV0aWxzIGZyb20gJy4vYXBpVXRpbHMuanMnXG5cbmNvbnN0IENMSV9MT0NLX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwXG5jb25zdCBDTElfTE9DS19QT0xMX01TID0gMTAwMFxuY29uc3QgQ0xJX0RPV05MT0FEX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwXG5jb25zdCBDTElfRE9XTkxPQURfVE1QX1BSRUZJWCA9ICdkb3dubG9hZGVkX2ZpbGVfJ1xuY29uc3QgQ0xJX0RPV05MT0FEX1RNUF9TVUZGSVggPSAnLnppcCdcblxuZXhwb3J0IGNsYXNzIENMSVV0aWxzIHtcbiAgICBzdGF0aWMgYXV0b21hdGlvbkZyYW1ld29ya0RldGFpbCA9IHt9XG4gICAgc3RhdGljIHRlc3RGcmFtZXdvcmtEZXRhaWwgPSB7fVxuICAgIHN0YXRpYyBDTElTdXBwb3J0ZWRGcmFtZXdvcmtzID0gWydtb2NoYSddXG5cbiAgICBzdGF0aWMgaXNEZXZlbG9wbWVudEVudigpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19DTElfRU5WID09PSAnZGV2ZWxvcG1lbnQnXG4gICAgfVxuXG4gICAgc3RhdGljIGdldENMSVBhcmFtc0ZvckRldkVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQ0xJX0VOViB8fCAnJyxcbiAgICAgICAgICAgIGxpc3RlbjogYHVuaXg6L3RtcC9zZGstcGxhdGZvcm0tJHtwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQ0xJX0VOVn0uc29ja2AsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZCBjb25maWcgb2JqZWN0IGZvciBiaW5hcnkgc2Vzc2lvbiByZXF1ZXN0XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0QmluQ29uZmlnKFxuICAgICAgICBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICAgICAgY2FwYWJpbGl0aWVzOlxuICAgICAgICAgICAgfCBDYXBhYmlsaXRpZXMuUmVxdWVzdGVkU3RhbmRhbG9uZUNhcGFiaWxpdGllc1xuICAgICAgICAgICAgfCBDYXBhYmlsaXRpZXMuUmVxdWVzdGVkU3RhbmRhbG9uZUNhcGFiaWxpdGllc1tdLFxuICAgICAgICBvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBCcm93c2Vyc3RhY2tPcHRpb25zLFxuICAgICAgICBidWlsZFRhZz86IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgY29uc3QgbW9kaWZpZWRPcHRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4ub3B0aW9ucyB9XG4gICAgICAgIGlmIChtb2RpZmllZE9wdHMub3B0cykge1xuICAgICAgICAgICAgbW9kaWZpZWRPcHRzLmJyb3dzZXJTdGFja0xvY2FsT3B0aW9ucyA9IG1vZGlmaWVkT3B0cy5vcHRzXG4gICAgICAgICAgICBkZWxldGUgbW9kaWZpZWRPcHRzLm9wdHNcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgbW9kaWZpZWRPcHRzLnRlc3RNYW5hZ2VtZW50T3B0aW9uc1xuXG4gICAgICAgIG1vZGlmaWVkT3B0cy50ZXN0Q29udGV4dE9wdGlvbnMgPSB7XG4gICAgICAgICAgICBza2lwU2Vzc2lvbk5hbWU6IGlzRmFsc2UobW9kaWZpZWRPcHRzLnNldFNlc3Npb25OYW1lKSxcbiAgICAgICAgICAgIHNraXBTZXNzaW9uU3RhdHVzOiBpc0ZhbHNlKG1vZGlmaWVkT3B0cy5zZXRTZXNzaW9uU3RhdHVzKSxcbiAgICAgICAgICAgIHNlc3Npb25OYW1lT21pdFRlc3RUaXRsZTogbW9kaWZpZWRPcHRzLnNlc3Npb25OYW1lT21pdFRlc3RUaXRsZSB8fCBmYWxzZSxcbiAgICAgICAgICAgIHNlc3Npb25OYW1lUHJlcGVuZFRvcExldmVsU3VpdGVUaXRsZTpcbiAgICAgICAgICAgICAgICBtb2RpZmllZE9wdHMuc2Vzc2lvbk5hbWVQcmVwZW5kVG9wTGV2ZWxTdWl0ZVRpdGxlIHx8IGZhbHNlLFxuICAgICAgICAgICAgc2Vzc2lvbk5hbWVGb3JtYXQ6IG1vZGlmaWVkT3B0cy5zZXNzaW9uTmFtZUZvcm1hdCB8fCAnJyxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbW1vbkJzdGFja09wdGlvbnMgPSAoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcyAmJlxuICAgICAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgY2FwYWJpbGl0aWVzID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICdic3RhY2s6b3B0aW9ucycgaW4gKGNhcGFiaWxpdGllcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIENhc3QgYWZ0ZXIgZ3VhcmQgdG8gc2F0aXNmeSBUeXBlU2NyaXB0XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzIGFzIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2JzdGFjazpvcHRpb25zJ10/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKVsnYnN0YWNrOm9wdGlvbnMnXSB8fCB7fVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9KSgpXG5cbiAgICAgICAgY29uc3QgaXNOb25Cc3RhY2tBMTF5ID1cbiAgICAgICAgICAgIGlzVHVyYm9TY2FsZShvcHRpb25zKSB8fFxuICAgICAgICAgICAgIXNob3VsZEFkZFNlcnZpY2VWZXJzaW9uKFxuICAgICAgICAgICAgICAgIGNvbmZpZyBhcyBPcHRpb25zLlRlc3RydW5uZXIsXG4gICAgICAgICAgICAgICAgb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eSxcbiAgICAgICAgICAgIClcbiAgICAgICAgY29uc3Qgb2JzZXJ2YWJpbGl0eU9wdGlvbnM6IFRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyA9XG4gICAgICAgICAgICBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyB8fCB7fVxuICAgICAgICBjb25zdCB0ZXN0TWFuYWdlbWVudE9wdGlvbnM6IFRlc3RNYW5hZ2VtZW50T3B0aW9ucyA9XG4gICAgICAgICAgICBvcHRpb25zLnRlc3RNYW5hZ2VtZW50T3B0aW9ucyB8fCB7fVxuICAgICAgICBjb25zdCB0ZXN0UGxhbklkID0gdHlwZW9mIHRlc3RNYW5hZ2VtZW50T3B0aW9ucy50ZXN0UGxhbklkID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyB0ZXN0TWFuYWdlbWVudE9wdGlvbnMudGVzdFBsYW5JZC50cmltKClcbiAgICAgICAgICAgIDogJydcbiAgICAgICAgY29uc3QgYmluY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgICAgIHVzZXJOYW1lOiBvYnNlcnZhYmlsaXR5T3B0aW9ucy51c2VyIHx8IGNvbmZpZy51c2VyLFxuICAgICAgICAgICAgYWNjZXNzS2V5OiBvYnNlcnZhYmlsaXR5T3B0aW9ucy5rZXkgfHwgY29uZmlnLmtleSxcbiAgICAgICAgICAgIHBsYXRmb3JtczogW10sXG4gICAgICAgICAgICBpc05vbkJzdGFja0ExMXlXRElPOiBpc05vbkJzdGFja0ExMXksXG4gICAgICAgICAgICAuLi5tb2RpZmllZE9wdHMsXG4gICAgICAgICAgICAuLi5jb21tb25Cc3RhY2tPcHRpb25zLFxuICAgICAgICB9XG5cbiAgICAgICAgYmluY29uZmlnLmJ1aWxkTmFtZSA9IG9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkTmFtZSB8fCBiaW5jb25maWcuYnVpbGROYW1lXG4gICAgICAgIGJpbmNvbmZpZy5wcm9qZWN0TmFtZSA9IG9ic2VydmFiaWxpdHlPcHRpb25zLnByb2plY3ROYW1lIHx8IGJpbmNvbmZpZy5wcm9qZWN0TmFtZVxuICAgICAgICBiaW5jb25maWcuYnVpbGRUYWcgPSB0aGlzLmdldE9ic2VydmFiaWxpdHlCdWlsZFRhZ3Mob2JzZXJ2YWJpbGl0eU9wdGlvbnMsIGJ1aWxkVGFnKSB8fCBbXVxuICAgICAgICBpZiAodGVzdFBsYW5JZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBiaW5jb25maWcudGVzdE1hbmFnZW1lbnRPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHRlc3RQbGFuSWQsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYXBzID0gQXJyYXkuaXNBcnJheShjYXBhYmlsaXRpZXMpID8gY2FwYWJpbGl0aWVzIDogW2NhcGFiaWxpdGllc11cbiAgICAgICAgZm9yIChjb25zdCBjYXAgb2YgY2Fwcykge1xuICAgICAgICAgICAgY29uc3QgcGxhdGZvcm06IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICAgICAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBjYXAgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICAgICAgICAgICAgT2JqZWN0LmtleXMoY2FwYWJpbGl0eSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gJ2JzdGFjazpvcHRpb25zJylcbiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtW2tleV0gPSBjYXBhYmlsaXR5W2tleV1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpZiAoY2FwYWJpbGl0eVsnYnN0YWNrOm9wdGlvbnMnXSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKFxuICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5Wydic3RhY2s6b3B0aW9ucyddIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgICAgICkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtW2tleV0gPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5Wydic3RhY2s6b3B0aW9ucyddIGFzIFJlY29yZDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93blxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICApW2tleV1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKGJpbmNvbmZpZy5wbGF0Zm9ybXMgYXMgQXJyYXk8dW5rbm93bj4pLnB1c2gocGxhdGZvcm0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGJpbmNvbmZpZylcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0U2RrVmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIEJTVEFDS19TRVJWSUNFX1ZFUlNJT05cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0U2RrTGFuZ3VhZ2UoKSB7XG4gICAgICAgIHJldHVybiAnRUNNQVNjcmlwdCdcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgc2V0dXBDbGlQYXRoKFxuICAgICAgICBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdDb25maWd1cmluZyBDbGkgcGF0aC4nKVxuICAgICAgICBjb25zdCBkZXZlbG9wbWVudEJpbmFyeVBhdGggPSBwcm9jZXNzLmVudi5TREtfQ0xJX0JJTl9QQVRIIHx8IG51bGxcbiAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KGRldmVsb3BtZW50QmluYXJ5UGF0aCkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRGV2ZWxvcG1lbnQgQ2xpIFBhdGg6ICR7ZGV2ZWxvcG1lbnRCaW5hcnlQYXRofWApXG4gICAgICAgICAgICByZXR1cm4gZGV2ZWxvcG1lbnRCaW5hcnlQYXRoXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY2xpRGlyID0gdGhpcy5nZXRDbGlEaXIoKVxuICAgICAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkoY2xpRGlyKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gd3JpdGFibGUgZGlyZWN0b3J5IGF2YWlsYWJsZSBmb3IgdGhlIENMSScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0NsaVBhdGggPSB0aGlzLmdldEV4aXN0aW5nQ2xpUGF0aChjbGlEaXIpXG4gICAgICAgICAgICBjb25zdCBmaW5hbEJpbmFyeVBhdGggPSBhd2FpdCB0aGlzLmNoZWNrQW5kVXBkYXRlQ2xpKFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nQ2xpUGF0aCxcbiAgICAgICAgICAgICAgICBjbGlEaXIsXG4gICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXNvbHZlZCBiaW5hcnkgcGF0aDogJHtmaW5hbEJpbmFyeVBhdGh9YClcbiAgICAgICAgICAgIHJldHVybiBmaW5hbEJpbmFyeVBhdGhcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgYEVycm9yIGluIHNldHRpbmcgdXAgY2xpIHBhdGggZGlyZWN0b3J5LCBFeGNlcHRpb246ICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGNoZWNrQW5kVXBkYXRlQ2xpKFxuICAgICAgICBleGlzdGluZ0NsaVBhdGg6IHN0cmluZyxcbiAgICAgICAgY2xpRGlyOiBzdHJpbmcsXG4gICAgICAgIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICAvLyBTa2lwIENMSSB1cGRhdGUgaW4gd29ya2VyIHByb2Nlc3NlcyAtIG9ubHkgbGF1bmNoZXIgc2hvdWxkIHVwZGF0ZVxuICAgICAgICAvLyBXb3JrZXJzIGFyZSBpZGVudGlmaWVkIGJ5IGhhdmluZyBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1Qgc2V0IChidWlsZCBhbHJlYWR5IHN0YXJ0ZWQpXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgV29ya2VyIHByb2Nlc3MgZGV0ZWN0ZWQsIHNraXBwaW5nIENMSSB1cGRhdGUuIFVzaW5nIGV4aXN0aW5nOiAke2V4aXN0aW5nQ2xpUGF0aH1gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ2xpUGF0aCAmJiBmcy5leGlzdHNTeW5jKGV4aXN0aW5nQ2xpUGF0aCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdDbGlQYXRoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAnV29ya2VyIHByb2Nlc3MgaGFzIG5vIGV4aXN0aW5nIENMSSBiaW5hcnksIGF0dGVtcHRpbmcgZG93bmxvYWQgYXMgZmFsbGJhY2suJyxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLnN0YXJ0KFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfQ0hFQ0tfVVBEQVRFKVxuICAgICAgICBsb2dnZXIuaW5mbyhgQ3VycmVudCBDTEkgUGF0aCBGb3VuZDogJHtleGlzdGluZ0NsaVBhdGh9YClcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICBzZGtfdmVyc2lvbjogQ0xJVXRpbHMuZ2V0U2RrVmVyc2lvbigpLFxuICAgICAgICAgICAgb3M6IHBsYXRmb3JtKCksXG4gICAgICAgICAgICBvc19hcmNoOiBhcmNoKCksXG4gICAgICAgICAgICBjbGlfdmVyc2lvbjogJzAnLFxuICAgICAgICAgICAgc2RrX2xhbmd1YWdlOiB0aGlzLmdldFNka0xhbmd1YWdlKCksXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KGV4aXN0aW5nQ2xpUGF0aCkpIHtcbiAgICAgICAgICAgIC8vIElmIGJpbmFyeSBpcyBidXN5IChiZWluZyBleGVjdXRlZCBieSBhbm90aGVyIHByb2Nlc3MpLCBza2lwIHZlcnNpb24gY2hlY2tcbiAgICAgICAgICAgIC8vIGFuZCBBUEkgY2FsbCBlbnRpcmVseSBcdTIwMTQgdXNlIGV4aXN0aW5nIGJpbmFyeSBhcy1pc1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNCaW5hcnlCdXN5KGV4aXN0aW5nQ2xpUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgRXhpc3RpbmcgYmluYXJ5IGlzIGN1cnJlbnRseSBpbiB1c2UsIHNraXBwaW5nIHVwZGF0ZTogJHtleGlzdGluZ0NsaVBhdGh9YClcbiAgICAgICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ2xpUGF0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IHRoaXMucnVuU2hlbGxDb21tYW5kKFxuICAgICAgICAgICAgICAgIGAke2V4aXN0aW5nQ2xpUGF0aH0gdmVyc2lvbmAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAodmVyc2lvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd0ZXh0IGZpbGUgYnVzeScpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEJpbmFyeSBidXN5IGR1cmluZyB2ZXJzaW9uIGNoZWNrLCBza2lwcGluZyB1cGRhdGU6ICR7ZXhpc3RpbmdDbGlQYXRofWApXG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfQ0hFQ0tfVVBEQVRFKVxuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0NsaVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmNsaV92ZXJzaW9uID0gdmVyc2lvblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0VG9VcGRhdGVDTEkocXVlcnlQYXJhbXMsIGNvbmZpZylcbiAgICAgICAgaWYgKG5lc3RlZEtleVZhbHVlKHJlc3BvbnNlLCBbJ3VwZGF0ZWRfY2xpX3ZlcnNpb24nXSkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgTmVlZCB0byB1cGRhdGUgYmluYXJ5LCBjdXJyZW50IGJpbmFyeSB2ZXJzaW9uOiAke3F1ZXJ5UGFyYW1zLmNsaV92ZXJzaW9ufWAsXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGNvbnN0IGJyb3dzZXJTdGFja0JpbmFyeVVybCA9XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0JJTkFSWV9VUkwgfHwgbnVsbFxuICAgICAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KGJyb3dzZXJTdGFja0JpbmFyeVVybCkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBVc2luZyBCUk9XU0VSU1RBQ0tfQklOQVJZX1VSTDogJHticm93c2VyU3RhY2tCaW5hcnlVcmx9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UudXJsID0gYnJvd3NlclN0YWNrQmluYXJ5VXJsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbmFsQmluYXJ5UGF0aCA9IGF3YWl0IHRoaXMuZG93bmxvYWRMYXRlc3RCaW5hcnkoXG4gICAgICAgICAgICAgICAgbmVzdGVkS2V5VmFsdWUocmVzcG9uc2UsIFsndXJsJ10pLFxuICAgICAgICAgICAgICAgIGNsaURpcixcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChQZXJmb3JtYW5jZUV2ZW50cy5TREtfQ0xJX0NIRUNLX1VQREFURSlcbiAgICAgICAgICAgIHJldHVybiBmaW5hbEJpbmFyeVBhdGhcbiAgICAgICAgfVxuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgIHJldHVybiBleGlzdGluZ0NsaVBhdGhcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0Q2xpRGlyKCkge1xuICAgICAgICBjb25zdCB3cml0YWJsZURpciA9IHRoaXMuZ2V0V3JpdGFibGVEaXIoKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkod3JpdGFibGVEaXIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB3cml0YWJsZSBkaXJlY3RvcnkgYXZhaWxhYmxlIGZvciB0aGUgQ0xJJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNsaURpclBhdGggPSBwYXRoLmpvaW4od3JpdGFibGVEaXIhLCAnY2xpJylcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhjbGlEaXJQYXRoKSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZURpcihjbGlEaXJQYXRoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNsaURpclBhdGhcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgYEVycm9yIGluIGdldHRpbmcgd3JpdGFibGUgZGlyZWN0b3J5LCB3cml0YWJsZURpcj0ke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiAnJ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFdyaXRhYmxlRGlyKCkge1xuICAgICAgICBjb25zdCB3cml0YWJsZURpck9wdGlvbnMgPSBbXG4gICAgICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfRklMRVNfRElSLFxuICAgICAgICAgICAgcGF0aC5qb2luKGhvbWVkaXIoKSwgJy5icm93c2Vyc3RhY2snKSxcbiAgICAgICAgICAgIHBhdGguam9pbigndG1wJywgJy5icm93c2Vyc3RhY2snKSxcbiAgICAgICAgXVxuXG4gICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiB3cml0YWJsZURpck9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KHBhdGgpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aCEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmlsZSAke3BhdGh9IGFscmVhZHkgZXhpc3RgKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzV3JpdGFibGUocGF0aCEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEdpdmluZyB3cml0ZSBwZXJtaXNzaW9uIHRvICR7cGF0aH1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHNldFJlYWRXcml0ZUFjY2VzcyhwYXRoISlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNUcnVlKHN1Y2Nlc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gcHJvdmlkZSB3cml0ZSBwZXJtaXNzaW9uIHRvICR7cGF0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmlsZSBkb2VzIG5vdCBleGlzdDogJHtwYXRofWApXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZURpcihwYXRoISlcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBHaXZpbmcgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YClcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHNldFJlYWRXcml0ZUFjY2VzcyhwYXRoISlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RydWUoc3VjY2VzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gcHJvdmlkZSB3cml0ZSBwZXJtaXNzaW9uIHRvICR7cGF0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gZ2V0IHdyaXRhYmxlIGRpcmVjdG9yeSwgZXhjZXB0aW9uICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRFeGlzdGluZ0NsaVBhdGgoY2xpRGlyOiBzdHJpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXRoIGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnlcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhjbGlEaXIpIHx8ICFmcy5zdGF0U3luYyhjbGlEaXIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTGlzdCBhbGwgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSB0aGF0IHN0YXJ0IHdpdGggXCJiaW5hcnktXCJcbiAgICAgICAgICAgIGNvbnN0IGFsbEJpbmFyaWVzID0gZnNcbiAgICAgICAgICAgICAgICAucmVhZGRpclN5bmMoY2xpRGlyKVxuICAgICAgICAgICAgICAgIC5tYXAoKGZpbGU6IHN0cmluZykgPT4gcGF0aC5qb2luKGNsaURpciwgZmlsZSkpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKGZpbGVQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBmcy5zdGF0U3luYyhmaWxlUGF0aCkuaXNGaWxlKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpLnN0YXJ0c1dpdGgoJ2JpbmFyeS0nKSxcbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmIChhbGxCaW5hcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBsYXRlc3QgYmluYXJ5IGJ5IGNvbXBhcmluZyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmluYXJ5ID0gYWxsQmluYXJpZXNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoZmlsZVBhdGg6IHN0cmluZykgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXRpbWU6IGZzLnN0YXRTeW5jKGZpbGVQYXRoKS5tdGltZSxcbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0OiB7IGZpbGVQYXRoOiBzdHJpbmc7IG10aW1lOiBEYXRlIH0gfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQ6IHsgZmlsZVBhdGg6IHN0cmluZzsgbXRpbWU6IERhdGUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGF0ZXN0IHx8ICFsYXRlc3QubXRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5tdGltZSA+IGxhdGVzdC5tdGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXRlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhdGVzdEJpbmFyeSA/IGxhdGVzdEJpbmFyeS5maWxlUGF0aCA6ICcnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAnJyAvLyBObyBiaW5hcnkgcHJlc2VudFxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgRXJyb3Igd2hpbGUgcmVhZGluZyBDTEkgcGF0aDogJHt1dGlsLmZvcm1hdChlcnIpfWApXG4gICAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBpc0JpbmFyeUJ1c3koYmluYXJ5UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpc051bGxPckVtcHR5KGJpbmFyeVBhdGgpKSB7cmV0dXJuIGZhbHNlfVxuICAgICAgICBpZiAocGxhdGZvcm0oKSA9PT0gJ2RhcndpbicpIHtyZXR1cm4gZmFsc2V9XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhiaW5hcnlQYXRoKSkge3JldHVybiBmYWxzZX1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhiaW5hcnlQYXRoLCAncisnKVxuICAgICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICBpZiAoQklOQVJZX0JVU1lfRVJST1JfQ09ERVMuaW5jbHVkZXMoZXJyLmNvZGUpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBCaW5hcnkgaXMgYnVzeTogJHtiaW5hcnlQYXRofWApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRXJyb3IgY2hlY2tpbmcgaWYgYmluYXJ5IGlzIGJ1c3k6ICR7ZXJyLm1lc3NhZ2V9YClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHJlcXVlc3RUb1VwZGF0ZUNMSSA9IGFzeW5jIChcbiAgICAgICAgcXVlcnlQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgICAgIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICkgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5UGFyYW1zKVxuICAgICAgICBjb25zdCByZXF1ZXN0SW5pdDogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke2dldEJyb3dzZXJTdGFja1VzZXIoY29uZmlnKX06JHtnZXRCcm93c2VyU3RhY2tLZXkoY29uZmlnKX1gKS50b1N0cmluZygnYmFzZTY0Jyl9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgIGAke0FQSVV0aWxzLkJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfVVJMfS8ke1VQREFURURfQ0xJX0VORFBPSU5UfT8ke3BhcmFtcy50b1N0cmluZygpfWAsXG4gICAgICAgICAgICByZXF1ZXN0SW5pdCxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBqc29uUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGByZXNwb25zZSAke0pTT04uc3RyaW5naWZ5KGpzb25SZXNwb25zZSl9YClcbiAgICAgICAgcmV0dXJuIGpzb25SZXNwb25zZVxuICAgIH1cblxuICAgIHN0YXRpYyBydW5TaGVsbENvbW1hbmQoXG4gICAgICAgIGNtZENvbW1hbmQ6IHN0cmluZyxcbiAgICAgICAgd29ya2luZ0RpciA9ICcnLFxuICAgICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvY2VzcyA9IGV4ZWMoXG4gICAgICAgICAgICAgICAgY21kQ29tbWFuZCxcbiAgICAgICAgICAgICAgICB7IGN3ZDogd29ya2luZ0RpciwgdGltZW91dDogNTAwMCB9LFxuICAgICAgICAgICAgICAgIChlcnJvcjogRXJyb3IsIHN0ZG91dDogc3RyaW5nLCBzdGRlcnI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3RkZXJyLnRyaW0oKSB8fCAnU0hFTExfRVhFQ1VURV9FUlJPUicpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0ZG91dC50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhlIHByb2Nlc3MgaXMga2lsbGVkIGlmIGl0IGV4Y2VlZHMgdGhlIHRpbWVvdXRcbiAgICAgICAgICAgIHByb2Nlc3Mub24oJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoJ1NIRUxMX0VYRUNVVEVfRVJST1InKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzdGF0aWMgZG93bmxvYWRMYXRlc3RCaW5hcnkgPSBhc3luYyAoXG4gICAgICAgIGJpbkRvd25sb2FkVXJsOiBzdHJpbmcsXG4gICAgICAgIGNsaURpcjogc3RyaW5nLFxuICAgICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4gPT4ge1xuICAgICAgICBjb25zdCBsb2NrUGF0aCA9IHBhdGguam9pbihjbGlEaXIsICdkb3dubG9hZC5sb2NrJylcblxuICAgICAgICBjb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpXG5cbiAgICAgICAgY29uc3QgcGFyc2VMb2NrRmlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhsb2NrUGF0aCwgJ3V0ZjgnKS50cmltKClcbiAgICAgICAgICAgICAgICBjb25zdCBbcGlkTGluZSwgdGltZXN0YW1wTGluZV0gPSBjb250ZW50LnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChwaWRMaW5lLCAxMClcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBOdW1iZXIucGFyc2VJbnQodGltZXN0YW1wTGluZSwgMTApXG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGlkKSB8fCAhTnVtYmVyLmlzRmluaXRlKHRpbWVzdGFtcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcGlkLCB0aW1lc3RhbXAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUHJvY2Vzc1J1bm5pbmcgPSAocGlkOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3F1aXJlTG9jayA9IGFzeW5jIChcbiAgICAgICAgICAgIHRpbWVvdXRNcyA9IENMSV9MT0NLX1RJTUVPVVRfTVMsXG4gICAgICAgICAgICBwb2xsTXMgPSBDTElfTE9DS19QT0xMX01TLFxuICAgICAgICApOiBQcm9taXNlPCgoKSA9PiB2b2lkKSB8IHsgYWxyZWFkeUV4aXN0czogc3RyaW5nIH0+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvbiAtLSBpbnRlbnRpb25hbCBwb2xsIGxvb3A7IGV4aXRzIHZpYSByZXR1cm4vdGhyb3cgYmVsb3dcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhsb2NrUGF0aCwgJ3d4JylcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmQsIGAke3Byb2Nlc3MucGlkfVxcbiR7RGF0ZS5ub3coKX1cXG5gKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsbHkgaWdub3JlIHdyaXRlIGVycm9yczsgdGhlIG9wZW4gZmQgc3RpbGwgaG9sZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGNsdXNpdmUgbG9jayBhbmQgd2lsbCBiZSBjbG9zZWQgaW4gY2xlYW51cFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKGxvY2tQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGNsZWFudXAgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZSBhcyB7IGNvZGU/OiBzdHJpbmcgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VFWElTVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2tNZXRhID0gcGFyc2VMb2NrRmlsZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9ja01ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NrQWdlID0gRGF0ZS5ub3coKSAtIGxvY2tNZXRhLnRpbWVzdGFtcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bm5pbmcgPSBpc1Byb2Nlc3NSdW5uaW5nKGxvY2tNZXRhLnBpZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bm5pbmcgfHwgbG9ja0FnZSA+IHRpbWVvdXRNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTdGFsZSBDTEkgZG93bmxvYWQgbG9jayBkZXRlY3RlZCAocGlkPSR7bG9ja01ldGEucGlkfSwgYWdlPSR7bG9ja0FnZX1tcykuIFJlbW92aW5nIGxvY2suYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhsb2NrUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGV4aXN0aW5nIGJpbmFyeSBhcHBlYXJlZCB3aGlsZSB3YWl0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0JpbmFyeSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xJVXRpbHMuZ2V0RXhpc3RpbmdDbGlQYXRoKGNsaURpcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0JpbmFyeSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmV4aXN0c1N5bmMoZXhpc3RpbmdCaW5hcnkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuc3RhdFN5bmMoZXhpc3RpbmdCaW5hcnkpLnNpemUgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCaW5hcnkgYXBwZWFyZWQgd2hpbGUgd2FpdGluZyBmb3IgbG9jazogJHtleGlzdGluZ0JpbmFyeX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBhbHJlYWR5RXhpc3RzOiBleGlzdGluZ0JpbmFyeSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID4gdGltZW91dE1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGltZW91dCB3YWl0aW5nIGZvciBsb2NrOiAke2xvY2tQYXRofWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAocG9sbE1zKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xlYW51cFRlbXBvcmFyeURvd25sb2FkcyA9IChtYXhBZ2VNcyA9IENMSV9MT0NLX1RJTUVPVVRfTVMpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgICAgIC8vIE1hdGNoIGJvdGggZG93bmxvYWQgemlwcyAoZG93bmxvYWRlZF9maWxlXyouemlwKSBhbmQgb3JwaGFuIGV4dHJhY3RcbiAgICAgICAgICAgICAgICAvLyB0ZW1wIGZpbGVzICg8bmFtZT4udG1wLjxwaWQ+KSBsZWZ0IGJ5IGNyYXNoZWQgcGVlciB3b3JrZXJzLlxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEV4dHJhY3RSZSA9IC9cXC50bXBcXC5cXGQrJC9cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZzLnJlYWRkaXJTeW5jKGNsaURpcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNEb3dubG9hZFppcCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zdGFydHNXaXRoKENMSV9ET1dOTE9BRF9UTVBfUFJFRklYKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZW5kc1dpdGgoQ0xJX0RPV05MT0FEX1RNUF9TVUZGSVgpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRXh0cmFjdFRtcCA9IHRtcEV4dHJhY3RSZS50ZXN0KGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRG93bmxvYWRaaXAgJiYgIWlzRXh0cmFjdFRtcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjbGlEaXIsIGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhdHM6IGZzLlN0YXRzXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVQYXRoKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyAtIHN0YXRzLm10aW1lTXMgPCBtYXhBZ2VNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhmaWxlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBkZWxldGUgdGVtcCBDTEkgZmlsZSAke2ZpbGVQYXRofTogJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gc2NhbiB0ZW1wIENMSSBmaWxlcyBpbiAke2NsaURpcn06ICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLnN0YXJ0KFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfRE9XTkxPQUQpXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRG93bmxvYWRpbmcgU0RLIGJpbmFyeSBmcm9tOiAke2JpbkRvd25sb2FkVXJsfWApXG5cbiAgICAgICAgbGV0IGRvd25sb2FkRW5kZWQgPSBmYWxzZVxuICAgICAgICBjb25zdCBlbmREb3dubG9hZCA9IChzdWNjZXNzID0gdHJ1ZSwgZXJyTXNnPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoZG93bmxvYWRFbmRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG93bmxvYWRFbmRlZCA9IHRydWVcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfRE9XTkxPQUQpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoXG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9ET1dOTE9BRCxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJNc2csXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVsZWFzZUxvY2s6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbG9ja1Jlc3VsdCA9IGF3YWl0IGFjcXVpcmVMb2NrKClcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYmluYXJ5IGFscmVhZHkgZXhpc3RzIChhbm90aGVyIHByb2Nlc3MgZG93bmxvYWRlZCBpdClcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbG9ja1Jlc3VsdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGVuZERvd25sb2FkKClcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9ja1Jlc3VsdC5hbHJlYWR5RXhpc3RzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbGVhc2VMb2NrID0gbG9ja1Jlc3VsdFxuXG4gICAgICAgICAgICAvLyBSZS1jaGVjayBhZnRlciBhY3F1aXJpbmcgbG9ja1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdCaW5hcnkgPSBDTElVdGlscy5nZXRFeGlzdGluZ0NsaVBhdGgoY2xpRGlyKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nQmluYXJ5ICYmXG4gICAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhleGlzdGluZ0JpbmFyeSkgJiZcbiAgICAgICAgICAgICAgICBmcy5zdGF0U3luYyhleGlzdGluZ0JpbmFyeSkuc2l6ZSA+IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgYEJpbmFyeSBhbHJlYWR5IGV4aXN0cyBhZnRlciBhY3F1aXJpbmcgbG9jazogJHtleGlzdGluZ0JpbmFyeX1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBlbmREb3dubG9hZCgpXG4gICAgICAgICAgICAgICAgcmVsZWFzZUxvY2soKVxuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0JpbmFyeVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbGVhbnVwVGVtcG9yYXJ5RG93bmxvYWRzKClcblxuICAgICAgICAgICAgY29uc3QgemlwRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgIGAke0NMSV9ET1dOTE9BRF9UTVBfUFJFRklYfSR7cHJvY2Vzcy5waWR9XyR7RGF0ZS5ub3coKX0ke0NMSV9ET1dOTE9BRF9UTVBfU1VGRklYfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBkb3dubG9hZGVkRmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHppcEZpbGVQYXRoKVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nIHwgbnVsbD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NEb3dubG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBDTElfRE9XTkxPQURfVElNRU9VVF9NUyxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKGJpbkRvd25sb2FkVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZXNwb25zZSBib2R5IHJlY2VpdmVkJylcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGRvd25sb2FkZWRGaWxlU3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnI6IEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEdvdCBFcnJvciB3aGlsZSBkb3dubG9hZGluZyBjbGkgYmluYXJ5IGZpbGU6ICR7ZXJyfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlU3RyZWFtID0gUmVhZGFibGUuZnJvbShbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVN0cmVhbS5waXBlKGRvd25sb2FkZWRGaWxlU3RyZWFtKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdXAgdGhlIGRvd25sb2FkRmlsZVN0cmVhbSBoYW5kbGVyIGJlZm9yZSBwaXBlbGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgQ0xJVXRpbHMuZG93bmxvYWRGaWxlU3RyZWFtKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkZWRGaWxlU3RyZWFtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaURpcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzdWx0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kRG93bmxvYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTG9jaz8uKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyPzogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kRG93bmxvYWQoZmFsc2UsIHV0aWwuZm9ybWF0KGVycikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBHb3QgRXJyb3IgaW4gY2xpIGJpbmFyeSBkb3dubG9hZGluZyByZXF1ZXN0ICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kRG93bmxvYWQoZmFsc2UsIHV0aWwuZm9ybWF0KGVycikpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTG9jaz8uKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwcm9jZXNzRG93bmxvYWQoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZWxlYXNlTG9jaz8uKClcbiAgICAgICAgICAgIGVuZERvd25sb2FkKGZhbHNlLCB1dGlsLmZvcm1hdChlcnIpKVxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gZG93bmxvYWQgYmluYXJ5LCBFeGNlcHRpb246ICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBkb3dubG9hZEZpbGVTdHJlYW0oXG4gICAgICAgIGRvd25sb2FkZWRGaWxlU3RyZWFtOiBmcy5Xcml0ZVN0cmVhbSxcbiAgICAgICAgemlwRmlsZVBhdGg6IHN0cmluZyxcbiAgICAgICAgY2xpRGlyOiBzdHJpbmcsXG4gICAgICAgIHJlc29sdmU6IChwYXRoOiBzdHJpbmcpID0+IHZvaWQsXG4gICAgICAgIHJlamVjdDogKHJlYXNvbj86IEVycm9yKSA9PiB2b2lkLFxuICAgICkge1xuICAgICAgICBkb3dubG9hZGVkRmlsZVN0cmVhbS5vbignY2xvc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCB5YXV6bE9wZW5Qcm9taXNlID0gcHJvbWlzaWZ5KHlhdXpsLm9wZW4pIGFzIChcbiAgICAgICAgICAgICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogeWF1emxPcHRpb25zLFxuICAgICAgICAgICAgKSA9PiBQcm9taXNlPFppcEZpbGU+XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHppcGZpbGUgPSBhd2FpdCB5YXV6bE9wZW5Qcm9taXNlKHppcEZpbGVQYXRoLCB7XG4gICAgICAgICAgICAgICAgICAgIGxhenlFbnRyaWVzOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgbGV0IHJlc29sdmVkQmluYXJ5UGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAgICAgICAgICAgICAgIHppcGZpbGUucmVhZEVudHJ5KClcbiAgICAgICAgICAgICAgICB6aXBmaWxlLm9uKCdlbnRyeScsIGFzeW5jIChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoL1xcLyQvLnRlc3QoZW50cnkuZmlsZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLnJlYWRFbnRyeSgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFppcC1zbGlwIGd1YXJkOiByZWplY3QgZW50cmllcyB3aG9zZSByZXNvbHZlZCBwYXRoIGVzY2FwZXMgY2xpRGlyXG4gICAgICAgICAgICAgICAgICAgIC8vIChCUk9XU0VSU1RBQ0tfQklOQVJZX1VSTCBsZXRzIHVzZXJzIHN1cHBseSBhcmJpdHJhcnkgemlwcykuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZVBhdGggPSBwYXRoLmpvaW4oY2xpRGlyLCBlbnRyeS5maWxlTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRDYW5kaWRhdGUgPSBwYXRoLnJlc29sdmUoY2FuZGlkYXRlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWREaXIgPSBwYXRoLnJlc29sdmUoY2xpRGlyKSArIHBhdGguc2VwXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWRDYW5kaWRhdGUuc3RhcnRzV2l0aChyZXNvbHZlZERpcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgWmlwLXNsaXAgZGV0ZWN0ZWQ6IGVudHJ5IFwiJHtlbnRyeS5maWxlTmFtZX1cIiByZXNvbHZlcyBvdXRzaWRlICR7Y2xpRGlyfWApKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0JpbmFyeUVudHJ5ID0gcGF0aC5iYXNlbmFtZShlbnRyeS5maWxlTmFtZSkuc3RhcnRzV2l0aCgnYmluYXJ5LScpXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0JpbmFyeUVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShjYW5kaWRhdGVQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0U3RyZWFtLm9uKCdlcnJvcicsICh3cml0ZUVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh3cml0ZUVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGVuUmVhZFN0cmVhbVByb21pc2UgPSBwcm9taXNpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5vcGVuUmVhZFN0cmVhbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICkuYmluZCh6aXBmaWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFkU3RyZWFtID0gYXdhaXQgb3BlblJlYWRTdHJlYW1Qcm9taXNlKGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0U3RyZWFtLmVuZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdFN0cmVhbS5vbignY2xvc2UnLCAoKSA9PiB6aXBmaWxlLnJlYWRFbnRyeSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN0cmVhbS5waXBlKGRpcmVjdFN0cmVhbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHppcEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh6aXBFcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJpbmFyeSBlbnRyeTogZXh0cmFjdCB0byBQSUQtc2NvcGVkIHRlbXAgZmlsZSwgY2htb2QsIGF0b21pYyByZW5hbWUgaW5saW5lLlxuICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50cyBFVFhUQlNZL0VCVVNZOiB0aGUgZmlsZSBiZWluZyBleGVjdXRlZCBpcyBuZXZlciB0aGUgZmlsZSBiZWluZyB3cml0dGVuLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5hbFBhdGggPSBjYW5kaWRhdGVQYXRoXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcGF0aC5qb2luKGNsaURpciwgYCR7ZW50cnkuZmlsZU5hbWV9LnRtcC4ke3Byb2Nlc3MucGlkfWApXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3JpdGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbSh0ZW1wUGF0aClcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd3JpdGVTdHJlYW1FcnJvcmVkID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW0ub24oJ2Vycm9yJywgKHdyaXRlRXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbUVycm9yZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICBmc3AudW5saW5rKHRlbXBQYXRoKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHdyaXRlRXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIC8vICdjbG9zZScgZmlyZXMgYWZ0ZXIgdGhlIGZkIGlzIGNsb3NlZDsgc2FmZSBmb3IgZnNwLnJlbmFtZSBvbiBXaW5kb3dzICh3aGVyZSAnZmluaXNoJyBtYXkgZmlyZSBiZWZvcmUgZmQgcmVsZWFzZSkuXG4gICAgICAgICAgICAgICAgICAgIC8vIGF1dG9DbG9zZT10cnVlIGFsc28gbWFrZXMgJ2Nsb3NlJyBmaXJlIGFmdGVyICdlcnJvcicgXHUyMDE0IGJhaWwgb3V0IGlmIHRoZSBlcnJvciBwYXRoIGFscmVhZHkgcmVqZWN0ZWQuXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtLm9uKCdjbG9zZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZVN0cmVhbUVycm9yZWQpIHsgcmV0dXJuIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnNwLmNobW9kKHRlbXBQYXRoLCAnMDc1NScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnNwLnJlbmFtZSh0ZW1wUGF0aCwgZmluYWxQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocmVuYW1lRXJyOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmFycm93IGZhbGxiYWNrIHRvIGNyb3NzLWRldmljZSAoRVhERVYpIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbmFtZUVyci5jb2RlICE9PSAnRVhERVYnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZW5hbWVFcnJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgQXRvbWljIHJlbmFtZSBmYWlsZWQgKGNyb3NzLWRldmljZSksIGZhbGxpbmcgYmFjayB0byBjb3B5OiAke3JlbmFtZUVyci5tZXNzYWdlfWApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC5jb3B5RmlsZSh0ZW1wUGF0aCwgZmluYWxQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmc3AudW5saW5rKHRlbXBQYXRoKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlZEJpbmFyeVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRCaW5hcnlQYXRoID0gZmluYWxQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUucmVhZEVudHJ5KClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC51bmxpbmsodGVtcFBhdGgpLmNhdGNoKCgpID0+IHt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlblJlYWRTdHJlYW1Qcm9taXNlID0gcHJvbWlzaWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5vcGVuUmVhZFN0cmVhbSxcbiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKHppcGZpbGUpXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFkU3RyZWFtID0gYXdhaXQgb3BlblJlYWRTdHJlYW1Qcm9taXNlKGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtLmVuZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN0cmVhbS5waXBlKHdyaXRlU3RyZWFtKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh6aXBFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzcC51bmxpbmsodGVtcFBhdGgpLmNhdGNoKCgpID0+IHt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5jbG9zZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoemlwRXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHppcGZpbGUub24oJ2Vycm9yJywgKHppcEVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoemlwRXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICB6aXBmaWxlLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZnNwLnVubGluayh6aXBGaWxlUGF0aCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBkZWxldGUgemlwIGZpbGU6ICR7emlwRmlsZVBhdGh9YClcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkQmluYXJ5UGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5jbG9zZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdObyBiaW5hcnktKiBlbnRyeSBmb3VuZCBpbiB6aXA7IGNhbm5vdCBjb21wbGV0ZSBDTEkgYmluYXJ5IGV4dHJhY3Rpb24nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkQmluYXJ5UGF0aClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVyciBhcyBFcnJvcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0VGVzdEZyYW1ld29ya0RldGFpbCgpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUX0ZSQU1FV09SS19ERVRBSUwpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUX0ZSQU1FV09SS19ERVRBSUwpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGVzdEZyYW1ld29ya0RldGFpbFxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRBdXRvbWF0aW9uRnJhbWV3b3JrRGV0YWlsKCkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FVVE9NQVRJT05fRlJBTUVXT1JLX0RFVEFJTCkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FVVE9NQVRJT05fRlJBTUVXT1JLX0RFVEFJTCxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5hdXRvbWF0aW9uRnJhbWV3b3JrRGV0YWlsXG4gICAgfVxuXG4gICAgc3RhdGljIHNldEZyYW1ld29ya0RldGFpbChcbiAgICAgICAgdGVzdEZyYW1ld29yazogc3RyaW5nLFxuICAgICAgICBhdXRvbWF0aW9uRnJhbWV3b3JrOiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGlmICghdGVzdEZyYW1ld29yayB8fCAhYXV0b21hdGlvbkZyYW1ld29yaykge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBUZXN0IG9yIEF1dG9tYXRpb24gZnJhbWV3b3JrIG5vdCBwcm92aWRlZCB0ZXN0RnJhbWV3b3JrPSR7dGVzdEZyYW1ld29ya30sIGF1dG9tYXRpb25GcmFtZXdvcms9JHthdXRvbWF0aW9uRnJhbWV3b3JrfWAsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRlc3RGcmFtZXdvcmtEZXRhaWwgPSB7XG4gICAgICAgICAgICBuYW1lOiB0ZXN0RnJhbWV3b3JrLFxuICAgICAgICAgICAgdmVyc2lvbjogeyBbdGVzdEZyYW1ld29ya106IENMSVV0aWxzLmdldFNka1ZlcnNpb24oKSB9LFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hdXRvbWF0aW9uRnJhbWV3b3JrRGV0YWlsID0ge1xuICAgICAgICAgICAgbmFtZTogYXV0b21hdGlvbkZyYW1ld29yayxcbiAgICAgICAgICAgIHZlcnNpb246IHsgW2F1dG9tYXRpb25GcmFtZXdvcmtdOiBDTElVdGlscy5nZXRTZGtWZXJzaW9uKCkgfSxcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BVVRPTUFUSU9OX0ZSQU1FV09SS19ERVRBSUwgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHRoaXMuYXV0b21hdGlvbkZyYW1ld29ya0RldGFpbCxcbiAgICAgICAgKVxuICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVF9GUkFNRVdPUktfREVUQUlMID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB0aGlzLnRlc3RGcmFtZXdvcmtEZXRhaWwsXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgaW5zdGFuY2UgbmFtZSB1c2luZyB0aHJlYWQgaWQgYW5kIHByb2Nlc3NJZFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldEN1cnJlbnRJbnN0YW5jZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiBgJHtwcm9jZXNzLnBpZH06JHt0aHJlYWRJZH1gXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSB1bmlxdWUgY2xpZW50IHdvcmtlciBpZGVudGlmaWVyIGNvbWJpbmluZyB0aHJlYWQgSUQgYW5kIHByb2Nlc3MgSUQuXG4gICAgICogVGhpcyBpZGVudGlmaWVyIGlzIHVzZWQgdG8gdHJhY2sgd29ya2VyLXNwZWNpZmljIGV2ZW50cyBhbmQgcGVyZm9ybWFuY2UgbWV0cmljc1xuICAgICAqIGFjcm9zcyBkaXN0cmlidXRlZCB0ZXN0IGV4ZWN1dGlvbi4gRm9ybWF0IG1hdGNoZXMgdGhlIFB5dGhvbiBTREsgaW1wbGVtZW50YXRpb25cbiAgICAgKiBmb3IgY29uc2lzdGVuY3kgYWNyb3NzIFNES3MuXG4gICAgICpcbiAgICAgKiBGb3JtYXQ6IFwidGhyZWFkSWQtcHJvY2Vzc0lkXCJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IC0gT3B0aW9uYWwgZXhlY3V0aW9uIGNvbnRleHQgd2l0aCB0aHJlYWRJZCBhbmQgcHJvY2Vzc0lkXG4gICAgICogQHJldHVybnMgV29ya2VyIElEIHN0cmluZyBpbiBmb3JtYXQgXCJ0aHJlYWRJZC1wcm9jZXNzSWRcIlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgd29ya2VySWQgPSBDTElVdGlscy5nZXRDbGllbnRXb3JrZXJJZCgpIC8vIFJldHVybnMgXCIxLTEyMzQ1XCJcbiAgICAgKiBjb25zdCB3b3JrZXJJZCA9IENMSVV0aWxzLmdldENsaWVudFdvcmtlcklkKHsgdGhyZWFkSWQ6IDEyMywgcHJvY2Vzc0lkOiA0NTYgfSkgLy8gUmV0dXJucyBcIjEyMy00NTZcIlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDbGllbnRXb3JrZXJJZChjb250ZXh0PzogeyB0aHJlYWRJZD86IHN0cmluZyB8IG51bWJlcjsgcHJvY2Vzc0lkPzogc3RyaW5nIHwgbnVtYmVyIH0pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB3b3JrZXJUaHJlYWRJZCA9IGNvbnRleHQ/LnRocmVhZElkPy50b1N0cmluZygpIHx8IHRocmVhZElkLnRvU3RyaW5nKClcbiAgICAgICAgY29uc3Qgd29ya2VyUHJvY2Vzc0lkID0gY29udGV4dD8ucHJvY2Vzc0lkPy50b1N0cmluZygpIHx8IHByb2Nlc3MucGlkLnRvU3RyaW5nKClcbiAgICAgICAgcmV0dXJuIGAke3dvcmtlclRocmVhZElkfS0ke3dvcmtlclByb2Nlc3NJZH1gXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Rlc3RGcmFtZXdvcmtTdGF0ZSB8IEF1dG9tYXRpb25GcmFtZXdvcmtTdGF0ZX0gZnJhbWV3b3JrU3RhdGVcbiAgICAgKiBAcGFyYW0ge0hvb2tTdGF0ZX0gaG9va1N0YXRlXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0SG9va1JlZ2lzdHJ5S2V5KGZyYW1ld29ya1N0YXRlOiBTdGF0ZSwgaG9va1N0YXRlOiBTdGF0ZSkge1xuICAgICAgICByZXR1cm4gYCR7ZnJhbWV3b3JrU3RhdGV9OiR7aG9va1N0YXRlfWBcbiAgICB9XG5cbiAgICBzdGF0aWMgbWF0Y2hIb29rUmVnZXgoaG9va1N0YXRlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoVGVzdEZyYW1ld29ya0NvbnN0YW50cy5IT09LX1JFR0VYKVxuXG4gICAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QoaG9va1N0YXRlKVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRPYnNlcnZhYmlsaXR5QnVpbGRUYWdzKFxuICAgICAgICBvYnNlcnZhYmlsaXR5T3B0aW9uczogVGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLFxuICAgICAgICBic3RhY2tCdWlsZFRhZz86IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LlRFU1RfT0JTRVJWQUJJTElUWV9CVUlMRF9UQUcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHLnNwbGl0KCcsJylcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGRUYWcpIHtcbiAgICAgICAgICAgIHJldHVybiBvYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZFRhZ1xuICAgICAgICB9XG4gICAgICAgIGlmIChic3RhY2tCdWlsZFRhZykge1xuICAgICAgICAgICAgcmV0dXJuIFtic3RhY2tCdWlsZFRhZ11cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICBzdGF0aWMgY2hlY2tDTElTdXBwb3J0ZWRGcmFtZXdvcmtzKGZyYW1ld29yazogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChmcmFtZXdvcmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuQ0xJU3VwcG9ydGVkRnJhbWV3b3Jrcy5pbmNsdWRlcyhmcmFtZXdvcmspXG4gICAgfVxufVxuIiwgImltcG9ydCB7IGZldGNoIGFzIHVuZGljaUZldGNoLCB0eXBlIFJlcXVlc3RJbml0IGFzIFVuZGljaVJlcXVlc3RJbml0LCBQcm94eUFnZW50IH0gZnJvbSAndW5kaWNpJ1xuXG5leHBvcnQgY2xhc3MgUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgcmVzcG9uc2U6IFJlc3BvbnNlXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCByZXM6IFJlc3BvbnNlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGZldGNoV3JhcChpbnB1dDogUmVxdWVzdEluZm8gfCBVUkwsIGluaXQ/OiBSZXF1ZXN0SW5pdCkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IF9mZXRjaChpbnB1dCwgaW5pdClcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgUmVzcG9uc2VFcnJvcihgRXJyb3IgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgJHtyZXMuc3RhdHVzfTogICR7YXdhaXQgcmVzLnRleHQoKX1gLCByZXMpXG4gICAgfVxuICAgIHJldHVybiByZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9mZXRjaChpbnB1dDogUmVxdWVzdEluZm8gfCBVUkwsIGluaXQ/OiBSZXF1ZXN0SW5pdCkge1xuICAgIGNvbnN0IHByb3h5VXJsID0gcHJvY2Vzcy5lbnYuSFRUUF9QUk9YWSB8fCBwcm9jZXNzLmVudi5IVFRQU19QUk9YWVxuICAgIGlmIChwcm94eVVybCkge1xuICAgICAgICBjb25zdCBub1Byb3h5ID0gcHJvY2Vzcy5lbnYuTk9fUFJPWFkgJiYgcHJvY2Vzcy5lbnYuTk9fUFJPWFkudHJpbSgpXG4gICAgICAgICAgICA/IHByb2Nlc3MuZW52Lk5PX1BST1hZLnRyaW0oKS5zcGxpdCgvW1xccyw7XSsvKVxuICAgICAgICAgICAgOiBbXVxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQpXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG4gICAgICAgIGlmICghbm9Qcm94eS5zb21lKChzdHIpID0+IHVybC5ob3N0bmFtZS5lbmRzV2l0aChzdHIpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGljaUZldGNoKFxuICAgICAgICAgICAgICAgIHJlcXVlc3QudXJsLFxuICAgICAgICAgICAgICAgIHsgLi4uKGluaXQgYXMgVW5kaWNpUmVxdWVzdEluaXQpLCBkaXNwYXRjaGVyOiBuZXcgUHJveHlBZ2VudChwcm94eVVybCkgfSxcbiAgICAgICAgICAgICkgYXMgdW5rbm93biBhcyBQcm9taXNlPFJlc3BvbnNlPlxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmZXRjaChpbnB1dCwgaW5pdClcbn1cbiIsICJleHBvcnQgY29uc3QgRVZFTlRTID0ge1xuICAgIFNES19TRVRVUDogJ3NkazpzZXR1cCcsXG4gICAgU0RLX0NMRUFOVVA6ICdzZGs6Y2xlYW51cCcsXG4gICAgU0RLX1BSRV9URVNUOiAnc2RrOnByZS10ZXN0JyxcbiAgICBTREtfVEVTVDogJ3Nkazp0ZXN0JyxcbiAgICBTREtfUE9TVF9URVNUOiAnc2RrOnBvc3QtdGVzdCcsXG4gICAgU0RLX0hPT0s6ICdzZGs6aG9vaycsXG4gICAgU0RLX0RSSVZFUjogJ3Nkazpkcml2ZXInLFxuICAgIFNES19BMTFZOiAnc2RrOmExMXknLFxuICAgIFNES19PMTFZOiAnc2RrOm8xMXknLFxuICAgIFNES19BVVRPX0NBUFRVUkU6ICdzZGs6YXV0by1jYXB0dXJlJyxcbiAgICBTREtfUFJPWFlfU0VUVVA6ICdzZGs6cHJveHktc2V0dXAnLFxuICAgIFNES19URVNUSFVCOiAnc2RrOnRlc3RodWInLFxuICAgIFNES19BVVRPTUFURTogJ3NkazphdXRvbWF0ZScsXG4gICAgU0RLX0FQUF9BVVRPTUFURTogJ3NkazphcHAtYXV0b21hdGUnLFxuICAgIFNES19UVVJCT1NDQUxFOiAnc2RrOnR1cmJvc2NhbGUnLFxuICAgIFNES19QRVJDWTogJ3NkazpwZXJjeScsXG4gICAgU0RLX1BSRV9JTklUSUFMSVpFOiAnc2RrOmRyaXZlcjpwcmUtaW5pdGlhbGl6YXRpb24nLFxuICAgIFNES19QT1NUX0lOSVRJQUxJWkU6ICdzZGs6ZHJpdmVyOnBvc3QtaW5pdGlhbGl6YXRpb24nLFxuICAgIFNES19DTElfQ0hFQ0tfVVBEQVRFOiAnc2RrOmNsaTpjaGVjay11cGRhdGUnLFxuICAgIFNES19DTElfRE9XTkxPQUQ6ICdzZGs6Y2xpOmRvd25sb2FkJyxcbiAgICBTREtfQ0xJX09OX0JPT1RTVFJBUDogJ3NkazpjbGk6b24tYm9vdHN0cmFwJyxcbiAgICBTREtfQ0xJX09OX0NPTk5FQ1Q6ICdzZGs6Y2xpOm9uLWNvbm5lY3QnLFxuICAgIFNES19DTElfU1RBUlQ6ICdzZGs6Y2xpOnN0YXJ0JyxcbiAgICBTREtfQ0xJX09OX1NUT1A6ICdzZGs6Y2xpOm9uLXN0b3AnLFxuICAgIFNES19DT05ORUNUX0JJTl9TRVNTSU9OOiAnc2RrOmNvbm5lY3RCaW5TZXNzaW9uJyxcbiAgICBTREtfU1RBUlRfQklOX1NFU1NJT046ICdzZGs6c3RhcnRCaW5TZXNzaW9uJyxcbiAgICAvLyBOZXcgZXZlbnRzIGZyb20gUHl0aG9uIFNES1xuICAgIFNES19EUklWRVJfSU5JVDogJ3Nkazpkcml2ZXJJbml0JyxcbiAgICBTREtfRklORF9ORUFSRVNUX0hVQjogJ3NkazpmaW5kTmVhcmVzdEh1YicsXG4gICAgU0RLX0FVVE9NQVRJT05fRlJBTUVXT1JLX0lOSVQ6ICdzZGs6YXV0b21hdGlvbkZyYW1ld29ya0luaXQnLFxuICAgIFNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19TVEFSVDogJ3NkazphdXRvbWF0aW9uRnJhbWV3b3JrU3RhcnQnLFxuICAgIFNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19TVE9QOiAnc2RrOmF1dG9tYXRpb25GcmFtZXdvcmtTdG9wJyxcbiAgICBTREtfQUNDRVNTSUJJTElUWV9DT05GSUc6ICdzZGs6YWNjZXNzaWJpbGl0eUNvbmZpZycsXG4gICAgU0RLX09CU0VSVkFCSUxJVFlfQ09ORklHOiAnc2RrOm9ic2VydmFiaWxpdHlDb25maWcnLFxuICAgIFNES19BSV9TRUxGX0hFQUxfU1RFUDogJ3NkazphaVNlbGZIZWFsU3RlcCcsXG4gICAgU0RLX0FJX1NFTEZfSEVBTF9HRVRfUkVTVUxUOiAnc2RrOmFpU2VsZkhlYWxHZXRSZXN1bHQnLFxuICAgIFNES19URVNUX0ZSQU1FV09SS19FVkVOVDogJ3Nkazp0ZXN0RnJhbWV3b3JrRXZlbnQnLFxuICAgIFNES19URVNUX1NFU1NJT05fRVZFTlQ6ICdzZGs6dGVzdFNlc3Npb25FdmVudCcsXG4gICAgU0RLX0NMSV9MT0dfQ1JFQVRFRF9FVkVOVDogJ3NkazpjbGk6bG9nQ3JlYXRlZEV2ZW50JyxcbiAgICBTREtfQ0xJX0VOUVVFVUVfVEVTVF9FVkVOVDogJ3NkazpjbGk6ZW5xdWV1ZVRlc3RFdmVudCcsXG4gICAgU0RLX09OX1NUT1A6ICdzZGs6b25TdG9wJyxcbiAgICBTREtfU0VORF9MT0dTOiAnc2RrOnNlbmRsb2dzJyxcbiAgICAvLyBGdW5uZWwgRXZlbnRzXG4gICAgU0RLX0ZVTk5FTF9URVNUX0FUVEVNUFRFRDogJ3NkazpmdW5uZWw6dGVzdC1hdHRlbXB0ZWQnLFxuICAgIFNES19GVU5ORUxfVEVTVF9TVUNDRVNTRlVMOiAnc2RrOmZ1bm5lbDp0ZXN0LXN1Y2Nlc3NmdWwnLFxuICAgIC8vIExvZyBVcGxvYWQgRXZlbnRzXG4gICAgU0RLX1VQTE9BRF9MT0dTOiAnc2RrOnVwbG9hZC1sb2dzJyxcbiAgICAvLyBLZXkgTWV0cmljcyBFdmVudHNcbiAgICBTREtfU0VORF9LRVlfTUVUUklDUzogJ3NkazpzZW5kLWtleS1tZXRyaWNzJyxcbiAgICBTREtfS0VZX01FVFJJQ1NfUFJFUEFSQVRJT046ICdzZGs6a2V5LW1ldHJpY3M6cHJlcGFyYXRpb24nLFxuICAgIFNES19LRVlfTUVUUklDU19VUExPQUQ6ICdzZGs6a2V5LW1ldHJpY3M6dXBsb2FkJyxcbiAgICAvLyBDTEkgQmluYXJ5IEV2ZW50c1xuICAgIFNES19DTElfRE9XTkxPQURfQklOQVJZOiAnc2RrOmNsaTpkb3dubG9hZC1iaW5hcnknLFxuICAgIFNES19DTElfQklOQVJZX1ZFUklGSUNBVElPTjogJ3NkazpjbGk6YmluYXJ5LXZlcmlmaWNhdGlvbicsXG4gICAgLy8gQ2xlYW51cCAmIFNodXRkb3duIEV2ZW50cyAodHJhY2tpbmcgZ2FwIGJldHdlZW4gZHJpdmVyOnF1aXQgYW5kIGZ1bm5lbDp0ZXN0LXN1Y2Nlc3NmdWwpXG4gICAgU0RLX0xJU1RFTkVSX1dPUktFUl9FTkQ6ICdzZGs6bGlzdGVuZXI6d29ya2VyLWVuZCcsXG4gICAgU0RLX1BFUkNZX1RFQVJET1dOOiAnc2RrOnBlcmN5OnRlYXJkb3duJyxcbiAgICBTREtfV09SS0VSX1NBVkVfREFUQTogJ3Nkazp3b3JrZXI6c2F2ZS1kYXRhJyxcbiAgICBTREtfUEVSRk9STUFOQ0VfUkVQT1JUX0dFTjogJ3NkazpwZXJmb3JtYW5jZTpyZXBvcnQtZ2VuZXJhdGlvbicsXG4gICAgU0RLX1BFUkZPUk1BTkNFX0pTT05fV1JJVEU6ICdzZGs6cGVyZm9ybWFuY2U6anNvbi13cml0ZScsXG4gICAgU0RLX1BFUkZPUk1BTkNFX0hUTUxfR0VOOiAnc2RrOnBlcmZvcm1hbmNlOmh0bWwtZ2VuZXJhdGlvbicsXG4gICAgLy8gRGV2aWNlIEFsbG9jYXRpb24gRXZlbnQgKHRyYWNraW5nIGdhcCBiZXR3ZWVuIGJlZm9yZVNlc3Npb24gYW5kIGJlZm9yZSBob29rcylcbiAgICBTREtfREVWSUNFX0FMTE9DQVRJT046ICdzZGs6ZGV2aWNlLWFsbG9jYXRpb24nXG59XG5cbmV4cG9ydCBjb25zdCBURVNUSFVCX0VWRU5UUyA9IHtcbiAgICBTVEFSVDogYCR7RVZFTlRTLlNES19URVNUSFVCfTpzdGFydGAsXG4gICAgU1RPUDogYCR7RVZFTlRTLlNES19URVNUSFVCfTpzdG9wYFxufVxuXG5leHBvcnQgY29uc3QgQVVUT01BVEVfRVZFTlRTID0ge1xuICAgIEtFRVBfQUxJVkU6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OmtlZXAtYWxpdmVgLFxuICAgIEhVQl9NQU5BR0VNRU5UOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpodWItbWFuYWdlbWVudGAsXG4gICAgTE9DQUxfU1RBUlQ6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OmxvY2FsLXN0YXJ0YCxcbiAgICBMT0NBTF9TVE9QOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpsb2NhbC1zdG9wYCxcbiAgICBEUklWRVJfTUFOQUdFOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpkcml2ZXItbWFuYWdlYCxcbiAgICBTRVNTSU9OX05BTUU6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OnNlc3Npb24tbmFtZWAsXG4gICAgU0VTU0lPTl9TVEFUVVM6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OnNlc3Npb24tc3RhdHVzYCxcbiAgICBTRVNTSU9OX0FOTk9UQVRJT046IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OnNlc3Npb24tYW5ub3RhdGlvbmAsXG4gICAgSURMRV9USU1FT1VUOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTppZGxlLXRpbWVvdXRgLFxuICAgIEdFTkVSQVRFX0NJX0FSVElGQUNUOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpjaS1hcnRpZmFjdHNgLFxuICAgIFBSSU5UX0JVSUxETElOSzogYCR7RVZFTlRTLlNES19BVVRPTUFURX06cHJpbnQtYnVpbGRsaW5rYFxufVxuXG5leHBvcnQgY29uc3QgQTExWV9FVkVOVFMgPSB7XG4gICAgUEVSRk9STV9TQ0FOOiBgJHtFVkVOVFMuU0RLX0ExMVl9OmRyaXZlci1wZXJmb3Jtc2NhbmAsXG4gICAgU0FWRV9SRVNVTFRTOiBgJHtFVkVOVFMuU0RLX0ExMVl9OnNhdmUtcmVzdWx0c2AsXG4gICAgR0VUX1JFU1VMVFM6IGAke0VWRU5UUy5TREtfQTExWX06Z2V0LWFjY2Vzc2liaWxpdHktcmVzdWx0c2AsXG4gICAgR0VUX1JFU1VMVFNfU1VNTUFSWTogYCR7RVZFTlRTLlNES19BMTFZfTpnZXQtYWNjZXNzaWJpbGl0eS1yZXN1bHRzLXN1bW1hcnlgXG59XG5cbmV4cG9ydCBjb25zdCBQRVJDWV9FVkVOVFMgPSB7XG4gICAgRE9XTkxPQUQ6IGAke0VWRU5UUy5TREtfUEVSQ1l9OmRvd25sb2FkYCxcbiAgICBTQ1JFRU5TSE9UOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpzY3JlZW5zaG90YCxcbiAgICBTVEFSVDogYCR7RVZFTlRTLlNES19QRVJDWX06c3RhcnRgLFxuICAgIFNUT1A6IGAke0VWRU5UUy5TREtfUEVSQ1l9OnN0b3BgLFxuICAgIEFVVE9fQ0FQVFVSRTogYCR7RVZFTlRTLlNES19QRVJDWX06YXV0by1jYXB0dXJlYCxcbiAgICBTTkFQU0hPVDogYCR7RVZFTlRTLlNES19QRVJDWX06c25hcHNob3RgLFxuICAgIFNDUkVFTlNIT1RfQVBQOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpzY3JlZW5zaG90LWFwcGBcbn1cblxuZXhwb3J0IGNvbnN0IE8xMVlfRVZFTlRTID0ge1xuICAgIFNZTkM6IGAke0VWRU5UUy5TREtfTzExWX06c3luY2AsXG4gICAgVEFLRV9TQ1JFRU5TSE9UOiBgJHtFVkVOVFMuU0RLX08xMVl9OmRyaXZlci10YWtlU2NyZWVuU2hvdGAsXG4gICAgUFJJTlRfQlVJTERMSU5LOiBgJHtFVkVOVFMuU0RLX08xMVl9OnByaW50LWJ1aWxkbGlua2Bcbn1cblxuZXhwb3J0IGNvbnN0IEhPT0tfRVZFTlRTID0ge1xuICAgIEJFRk9SRV9FQUNIOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmJlZm9yZS1lYWNoYCxcbiAgICBBRlRFUl9FQUNIOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmFmdGVyLWVhY2hgLFxuICAgIEFGVEVSX0FMTDogYCR7RVZFTlRTLlNES19IT09LfTphZnRlci1hbGxgLFxuICAgIEJFRk9SRV9BTEw6IGAke0VWRU5UUy5TREtfSE9PS306YmVmb3JlLWFsbGAsXG4gICAgQkVGT1JFOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmJlZm9yZWAsXG4gICAgQUZURVI6IGAke0VWRU5UUy5TREtfSE9PS306YWZ0ZXJgXG59XG5cbmV4cG9ydCBjb25zdCBUVVJCT1NDQUxFX0VWRU5UUyA9IHtcbiAgICBIVUJfTUFOQUdFTUVOVDogYCR7RVZFTlRTLlNES19UVVJCT1NDQUxFfTpodWItbWFuYWdlbWVudGAsXG4gICAgUFJJTlRfQlVJTERMSU5LOiBgJHtFVkVOVFMuU0RLX1RVUkJPU0NBTEV9OnByaW50LWJ1aWxkbGlua2Bcbn1cblxuZXhwb3J0IGNvbnN0IEFQUF9BVVRPTUFURV9FVkVOVFMgPSB7XG4gICAgQVBQX1VQTE9BRDogYCR7RVZFTlRTLlNES19BUFBfQVVUT01BVEV9OmFwcC11cGxvYWRgXG59XG5cbmV4cG9ydCBjb25zdCBEUklWRVJfRVZFTlQgPSB7XG4gICAgUVVJVDogYCR7RVZFTlRTLlNES19EUklWRVJ9OnF1aXRgLFxuICAgIEdFVDogYCR7RVZFTlRTLlNES19EUklWRVJ9OmdldGAsXG4gICAgUFJFX0VYRUNVVEU6IGAke0VWRU5UUy5TREtfRFJJVkVSfTpwcmUtZXhlY3V0ZWAsXG4gICAgUE9TVF9FWEVDVVRFOiBgJHtFVkVOVFMuU0RLX0RSSVZFUn06cG9zdC1leGVjdXRlYCxcbiAgICBJTklUOiBFVkVOVFMuU0RLX0RSSVZFUl9JTklULFxuICAgIFBSRV9JTklUSUFMSVpFOiBFVkVOVFMuU0RLX1BSRV9JTklUSUFMSVpFLFxuICAgIFBPU1RfSU5JVElBTElaRTogRVZFTlRTLlNES19QT1NUX0lOSVRJQUxJWkVcbn1cblxuLyoqXG4gKiBGcmFtZXdvcmsgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgYXV0b21hdGlvbiBmcmFtZXdvcmsgdHJhY2tpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IEZSQU1FV09SS19FVkVOVFMgPSB7XG4gICAgSU5JVDogRVZFTlRTLlNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19JTklULFxuICAgIFNUQVJUOiBFVkVOVFMuU0RLX0FVVE9NQVRJT05fRlJBTUVXT1JLX1NUQVJULFxuICAgIFNUT1A6IEVWRU5UUy5TREtfQVVUT01BVElPTl9GUkFNRVdPUktfU1RPUFxufVxuXG4vKipcbiAqIE1vZHVsZSBjb25maWd1cmF0aW9uIGV2ZW50c1xuICovXG5leHBvcnQgY29uc3QgQ09ORklHX0VWRU5UUyA9IHtcbiAgICBBQ0NFU1NJQklMSVRZOiBFVkVOVFMuU0RLX0FDQ0VTU0lCSUxJVFlfQ09ORklHLFxuICAgIE9CU0VSVkFCSUxJVFk6IEVWRU5UUy5TREtfT0JTRVJWQUJJTElUWV9DT05GSUdcbn1cblxuLyoqXG4gKiBBSSBzZWxmLWhlYWxpbmcgZXZlbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBBSV9FVkVOVFMgPSB7XG4gICAgU0VMRl9IRUFMX1NURVA6IEVWRU5UUy5TREtfQUlfU0VMRl9IRUFMX1NURVAsXG4gICAgU0VMRl9IRUFMX0dFVF9SRVNVTFQ6IEVWRU5UUy5TREtfQUlfU0VMRl9IRUFMX0dFVF9SRVNVTFRcbn1cblxuLyoqXG4gKiBFdmVudCBkaXNwYXRjaGVyIGV2ZW50cyBmb3IgdGVzdCBmcmFtZXdvcmsgYW5kIHNlc3Npb24gdHJhY2tpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IERJU1BBVENIRVJfRVZFTlRTID0ge1xuICAgIFRFU1RfRlJBTUVXT1JLOiBFVkVOVFMuU0RLX1RFU1RfRlJBTUVXT1JLX0VWRU5ULFxuICAgIFRFU1RfU0VTU0lPTjogRVZFTlRTLlNES19URVNUX1NFU1NJT05fRVZFTlQsXG4gICAgTE9HX0NSRUFURUQ6IEVWRU5UUy5TREtfQ0xJX0xPR19DUkVBVEVEX0VWRU5ULFxuICAgIEVOUVVFVUVfVEVTVDogRVZFTlRTLlNES19DTElfRU5RVUVVRV9URVNUX0VWRU5UXG59XG5cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcblxuaW1wb3J0IGxvZ2dlciBmcm9tICdAd2Rpby9sb2dnZXInXG5cbmltcG9ydCB7IExPR1NfRklMRSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IENPTE9SUyB9IGZyb20gJy4uL3V0aWwuanMnXG5cbmNvbnN0IGxvZyA9IGxvZ2dlcignQHdkaW8vYnJvd3NlcnN0YWNrLXNlcnZpY2UvY2xpJylcblxuZXhwb3J0IGNsYXNzIEJTdGFja0xvZ2dlciB7XG4gICAgcHVibGljIHN0YXRpYyBsb2dGaWxlUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBMT0dTX0ZJTEUpXG4gICAgcHVibGljIHN0YXRpYyBsb2dGb2xkZXJQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdsb2dzJylcbiAgICBwcml2YXRlIHN0YXRpYyBsb2dGaWxlU3RyZWFtOiBmcy5Xcml0ZVN0cmVhbSB8IG51bGxcblxuICAgIHN0YXRpYyBsb2dUb0ZpbGUobG9nTWVzc2FnZTogc3RyaW5nLCBsb2dMZXZlbDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubG9nRmlsZVN0cmVhbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5zdXJlTG9nc0ZvbGRlcigpXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odGhpcy5sb2dGaWxlUGF0aCwgeyBmbGFnczogJ2EnIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dGaWxlU3RyZWFtICYmIHRoaXMubG9nRmlsZVN0cmVhbS53cml0YWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbS53cml0ZSh0aGlzLmZvcm1hdExvZyhsb2dNZXNzYWdlLCBsb2dMZXZlbCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYEZhaWxlZCB0byBsb2cgdG8gZmlsZS4gRXJyb3IgJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZm9ybWF0TG9nKGxvZ01lc3NhZ2U6IHN0cmluZywgbGV2ZWw6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYCR7Y2hhbGsuZ3JheShuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpfSAke2NoYWxrW0NPTE9SU1tsZXZlbF1dKGxldmVsLnRvVXBwZXJDYXNlKCkpfSAke2NoYWxrLndoaXRlQnJpZ2h0KCdAd2Rpby9icm93c2Vyc3RhY2stc2VydmljZScpfSAke2xvZ01lc3NhZ2V9XFxuYFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUobWVzc2FnZSwgJ2luZm8nKVxuICAgICAgICBsb2cuaW5mbyhtZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9nVG9GaWxlKG1lc3NhZ2UsICdlcnJvcicpXG4gICAgICAgIGxvZy5lcnJvcihtZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBwYXJhbT86IHVua25vd24pIHtcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUobWVzc2FnZSwgJ2RlYnVnJylcbiAgICAgICAgaWYgKHBhcmFtKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcobWVzc2FnZSwgcGFyYW0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cuZGVidWcobWVzc2FnZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgd2FybihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUobWVzc2FnZSwgJ3dhcm4nKVxuICAgICAgICBsb2cud2FybihtZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdHJhY2UobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9nVG9GaWxlKG1lc3NhZ2UsICd0cmFjZScpXG4gICAgICAgIGxvZy50cmFjZShtZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJMb2dnZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ0ZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbS5lbmQoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbSA9IG51bGxcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyTG9nRmlsZSgpIHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5sb2dGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIGZzLnRydW5jYXRlU3luYyh0aGlzLmxvZ0ZpbGVQYXRoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbnN1cmVMb2dzRm9sZGVyKCkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5sb2dGb2xkZXJQYXRoKSl7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5sb2dGb2xkZXJQYXRoKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBUZXN0RnJhbWV3b3JrQ29uc3RhbnRzID0ge1xuICAgIEtFWV9URVNUX1VVSUQ6ICd0ZXN0X3V1aWQnLFxuICAgIEtFWV9URVNUX0lEIDogJ3Rlc3RfaWQnLFxuICAgIEtFWV9URVNUX05BTUUgOiAndGVzdF9uYW1lJyxcbiAgICBLRVlfVEVTVF9GSUxFX1BBVEggOiAndGVzdF9maWxlX3BhdGgnLFxuICAgIEtFWV9URVNUX1RBR1MgOiAndGVzdF90YWdzJyxcbiAgICBLRVlfVEVTVF9SRVNVTFQgOiAndGVzdF9yZXN1bHQnLFxuICAgIEtFWV9URVNUX1JFU1VMVF9BVCA6ICd0ZXN0X3Jlc3VsdF9hdCcsXG4gICAgS0VZX1RFU1RfU1RBUlRFRF9BVCA6ICd0ZXN0X3N0YXJ0ZWRfYXQnLFxuICAgIEtFWV9URVNUX0VOREVEX0FUIDogJ3Rlc3RfZW5kZWRfYXQnLFxuICAgIEtFWV9URVNUX0xPQ0FUSU9OIDogJ3Rlc3RfbG9jYXRpb24nLFxuICAgIEtFWV9URVNUX1NDT1BFIDogJ3Rlc3Rfc2NvcGUnLFxuICAgIEtFWV9URVNUX1NDT1BFUyA6ICd0ZXN0X3Njb3BlcycsXG4gICAgS0VZX1RFU1RfRlJBTUVXT1JLX05BTUUgOiAndGVzdF9mcmFtZXdvcmtfbmFtZScsXG4gICAgS0VZX1RFU1RfRlJBTUVXT1JLX1ZFUlNJT04gOiAndGVzdF9mcmFtZXdvcmtfdmVyc2lvbicsXG4gICAgS0VZX1RFU1RfQ09ERSA6ICd0ZXN0X2NvZGUnLFxuICAgIEtFWV9URVNUX1JFUlVOX05BTUUgOiAndGVzdF9yZXJ1bl9uYW1lJyxcbiAgICBLRVlfUExBVEZPUk1fSU5ERVggOiAncGxhdGZvcm1faW5kZXgnLFxuICAgIEtFWV9URVNUX0ZBSUxVUkUgOiAndGVzdF9mYWlsdXJlJyxcbiAgICBLRVlfVEVTVF9GQUlMVVJFX1RZUEUgOiAndGVzdF9mYWlsdXJlX3R5cGUnLFxuICAgIEtFWV9URVNUX0ZBSUxVUkVfUkVBU09OIDogJ3Rlc3RfZmFpbHVyZV9yZWFzb24nLFxuICAgIEtFWV9URVNUX0xPR1MgOiAndGVzdF9sb2dzJyxcbiAgICBLRVlfVEVTVF9NRVRBIDogJ3Rlc3RfbWV0YScsXG4gICAgS0VZX0NVU1RPTV9UQUdTIDogJ2N1c3RvbV9tZXRhZGF0YScsXG4gICAgS0VZX1RFU1RfREVGRVJSRUQgOiAndGVzdF9kZWZlcnJlZCcsXG4gICAgS0VZX1NFU1NJT05fTkFNRSA6ICd0ZXN0X3Nlc3Npb25fbmFtZScsXG4gICAgS0VZX0FVVE9NQVRFX1NFU1NJT05fTkFNRSA6ICdhdXRvbWF0ZV9zZXNzaW9uX25hbWUnLFxuICAgIEtFWV9BVVRPTUFURV9TRVNTSU9OX1NUQVRVUzogJ2F1dG9tYXRlX3Nlc3Npb25fc3RhdHVzJyxcbiAgICBLRVlfQVVUT01BVEVfU0VTU0lPTl9SRUFTT046ICdhdXRvbWF0ZV9zZXNzaW9uX3JlYXNvbicsXG4gICAgS0VZX0VWRU5UX1NUQVJURURfQVQgOiAnZXZlbnRfc3RhcnRlZF9hdCcsXG4gICAgS0VZX0VWRU5UX0VOREVEX0FUIDogJ2V2ZW50X2VuZGVkX2F0JyxcbiAgICBLRVlfSE9PS19JRCA6ICdob29rX2lkJyxcbiAgICBLRVlfSE9PS19SRVNVTFQgOiAnaG9va19yZXN1bHQnLFxuICAgIEtFWV9IT09LX0xPR1MgOiAnaG9va19sb2dzJyxcbiAgICBLRVlfSE9PS19OQU1FIDogJ2hvb2tfbmFtZScsXG4gICAgS0VZX0hPT0tTX1NUQVJURUQ6ICd0ZXN0X2hvb2tzX3N0YXJ0ZWQnLFxuICAgIEtFWV9IT09LU19GSU5JU0hFRDogJ3Rlc3RfaG9va3NfZmluaXNoZWQnLFxuICAgIERFRkFVTFRfVEVTVF9SRVNVTFQgOiAncGVuZGluZycsXG4gICAgREVGQVVMVF9IT09LX1JFU1VMVCA6ICdwZW5kaW5nJyxcbiAgICBLSU5EX1NDUkVFTlNIT1QgOiAnVEVTVF9TQ1JFRU5TSE9UJyxcbiAgICBLSU5EX0xPRyA6ICdURVNUX0xPRycsXG4gICAgSE9PS19SRUdFWCA6ICdeKEJFRk9SRV98QUZURVJfKScsXG59XG4iLCAiXG5pbXBvcnQgeyBCUk9XU0VSU1RBQ0tfUEVSQ1ksIEJST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZLCBCUk9XU0VSU1RBQ0tfQUNDRVNTSUJJTElUWSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCB0eXBlIEJyb3dzZXJTdGFja0NvbmZpZyBmcm9tICcuLi9jb25maWcuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgeyBpc1RydWUsIGlzTG9hZFRlc3RpbmdTZXNzaW9uIH0gZnJvbSAnLi4vdXRpbC5qcydcblxuaW50ZXJmYWNlIEVycm9yVHlwZSB7XG4gICAga2V5OiBzdHJpbmdcbiAgICBtZXNzYWdlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvcnMge1xuICAgIGVycm9yczogRXJyb3JUeXBlW11cbn1cblxuZXhwb3J0IGNvbnN0IGdldFByb2R1Y3RNYXAgPSAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9PiB7XG4gICAgLy8gTFRTIGdhdGluZzogdW5kZXIgTFRTLCBhdXRvbWF0ZSBpcyBmb3JjZWQgZmFsc2UgKExUUyBidWlsZHMgcm91dGUgdG9cbiAgICAvLyB0aGUgTFRTIGludGVybmFsIGh1Yjsga2VlcGluZyBhdXRvbWF0ZT10cnVlIHRhZ3MgVGVzdEh1YiBzb3VyY2UgYXNcbiAgICAvLyBUTyxBVVQsTFRTIGluc3RlYWQgb2YgVE8sTFRTIFx1MjAxNCBzZWUgcHktc2RrIGVhNTNkOTE0KS4gVGhlIGBsdHNgIGtleVxuICAgIC8vIGl0c2VsZiBpcyBvbmx5IGVtaXR0ZWQgdW5kZXIgTFRTIHNvIG5vbi1MVFMgcGF5bG9hZHMgc3RheSBieXRlLVxuICAgIC8vIGlkZW50aWNhbCB0byB0aGUgcHJlLUxUUy1QUiBzaGFwZSAoYXZvaWRzIHN1cnByaXNpbmcgYW55IGJhY2tlbmQgd2l0aFxuICAgIC8vIHN0cmljdCB1bmtub3duLWtleSB2YWxpZGF0aW9uKS5cbiAgICBjb25zdCBsdHMgPSBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpXG4gICAgY29uc3QgZW50cmllczogW3N0cmluZywgYm9vbGVhbiB8IHVuZGVmaW5lZF1bXSA9IFtcbiAgICAgICAgWydvYnNlcnZhYmlsaXR5JywgY29uZmlnLnRlc3RPYnNlcnZhYmlsaXR5LmVuYWJsZWRdLFxuICAgICAgICBbJ2FjY2Vzc2liaWxpdHknLCAhIWNvbmZpZy5hY2Nlc3NpYmlsaXR5XSxcbiAgICAgICAgWydwZXJjeScsIGNvbmZpZy5wZXJjeV0sXG4gICAgICAgIFsnYXV0b21hdGUnLCBsdHMgPyBmYWxzZSA6IGNvbmZpZy5hdXRvbWF0ZV0sXG4gICAgICAgIFsnYXBwX2F1dG9tYXRlJywgY29uZmlnLmFwcEF1dG9tYXRlXSxcbiAgICBdXG4gICAgaWYgKGx0cykge1xuICAgICAgICBlbnRyaWVzLnB1c2goWydsdHMnLCB0cnVlXSlcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzLmZpbHRlcigoWywgdl0pID0+IHYgIT09IG51bGwpKSBhcyB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUHJvY2Vzc0V2ZW50Rm9yVGVzdGh1YiA9IChldmVudFR5cGU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIC8vIExUUyBzaG9ydC1jaXJjdWl0OiB3aGVuIHJ1bm5pbmcgYXMgYW4gTFRTIGxvYWQgdGVzdCAoQlJPV1NFUlNUQUNLX0xUUz10cnVlXG4gICAgLy8gZm9yIGxvY2FsIHJlcHJvLCBvciBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQgc2V0IGJ5IHRoZSBwb2QpLCBUZXN0SHViXG4gICAgLy8gZXZlbnQgZW1pc3Npb24gbXVzdCBhbHdheXMgZmxvdyByZWdhcmRsZXNzIG9mIHRoZSBvYnNlcnZhYmlsaXR5IC9cbiAgICAvLyBhY2Nlc3NpYmlsaXR5IC8gcGVyY3kgZW52IGZsYWdzLiBQb2QgcnVucyBkbyBleHBvcnRcbiAgICAvLyBCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSwgYnV0IHRoZSBsb2NhbC1yZXBybyBmbGFnIHBhdGggZG9lc24ndFxuICAgIC8vIGd1YXJhbnRlZSBpdCBcdTIwMTQgd2l0aG91dCB0aGlzIHNob3J0LWNpcmN1aXQsIGdldFByb2R1Y3RNYXAgY29ycmVjdGx5XG4gICAgLy8gZW1pdHMgbHRzOiB0cnVlIHdoaWxlIGV2ZXJ5IG9uVGVzdFN0YXJ0IC8gb25UZXN0RW5kIC8gb25Ib29rU3RhcnRcbiAgICAvLyBzaWxlbnRseSBuby1vcHMuIE1pcnJvciBvZiB0aGUgdW5jb25kaXRpb25hbCBMVFMgZXZlbnQgZmxvdyBpbiBweS1zZGsnc1xuICAgIC8vIHNob3VsZF9zZW5kX2V2ZW50X2Zvcl90ZXN0aHViKCkgKFBSICM5OTMpLlxuICAgIGlmIChpc0xvYWRUZXN0aW5nU2Vzc2lvbigpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChpc1RydWUocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAoaXNUcnVlKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19BQ0NFU1NJQklMSVRZXSkpIHtcbiAgICAgICAgcmV0dXJuICEoWydIb29rUnVuU3RhcnRlZCcsICdIb29rUnVuRmluaXNoZWQnLCAnTG9nQ3JlYXRlZCddLmluY2x1ZGVzKGV2ZW50VHlwZSkpXG4gICAgfVxuICAgIGlmIChpc1RydWUocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1BFUkNZXSkgJiYgZXZlbnRUeXBlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBFdmFsdWF0ZSB3aXRoIGlzVHJ1ZSBzbyBhIHByb2R1Y3QgZmxhZyBleHBsaWNpdGx5IHNldCB0byB0aGUgc3RyaW5nICdmYWxzZSdcbiAgICAvLyAoZS5nLiBvYnNlcnZhYmlsaXR5IHR1cm5lZCBvZmYgYWZ0ZXIgYSBmYWlsZWQvYmxvY2tlZCBidWlsZC1zdGFydCkgcmVhZHMgYXNcbiAgICAvLyBvZmYuIFJhdyBCb29sZWFuKCdmYWxzZScpIGlzIHRydXRoeSwgd2hpY2gga2VwdCBldmVudHMgZmxvd2luZyBmb3IgYW5cbiAgICAvLyBvYnNlcnZhYmlsaXR5LW9ubHkgc2Vzc2lvbiBldmVuIGFmdGVyIHRoZSBmbGFnIHdhcyBkaXNhYmxlZC5cbiAgICByZXR1cm4gaXNUcnVlKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19BQ0NFU1NJQklMSVRZXSkgfHwgaXNUcnVlKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSkgfHwgaXNUcnVlKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19QRVJDWV0pXG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVFcnJvckZvck9ic2VydmFiaWxpdHkgPSAoZXJyb3I6IEVycm9ycyB8IG51bGwpOiB2b2lkID0+IHtcbiAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWV0gPSAnZmFsc2UnXG4gICAgbG9nQnVpbGRFcnJvcihlcnJvciwgJ1Rlc3QgUmVwb3J0aW5nIGFuZCBBbmFseXRpY3MnKVxufVxuXG5leHBvcnQgY29uc3QgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5ID0gKGVycm9yOiBFcnJvcnMgfCBudWxsKTogdm9pZCA9PiB7XG4gICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFldID0gJ2ZhbHNlJ1xuICAgIGxvZ0J1aWxkRXJyb3IoZXJyb3IsICdhY2Nlc3NpYmlsaXR5Jylcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ0J1aWxkRXJyb3IgPSAoZXJyb3I6IEVycm9ycyB8IG51bGwsIHByb2R1Y3Q6IHN0cmluZyA9ICcnKTogdm9pZCA9PiB7XG4gICAgaWYgKCFlcnJvciB8fCAhZXJyb3IuZXJyb3JzKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgJHtwcm9kdWN0LnRvVXBwZXJDYXNlKCl9IEJ1aWxkIGNyZWF0aW9uIGZhaWxlZCAke2Vycm9yIX1gKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVycm9ySnNvbiBvZiBlcnJvci5lcnJvcnMpIHtcbiAgICAgICAgY29uc3QgZXJyb3JUeXBlID0gZXJyb3JKc29uLmtleVxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvckpzb24ubWVzc2FnZVxuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVycm9yVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnRVJST1JfSU5WQUxJRF9DUkVERU5USUFMUyc6XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSAnRVJST1JfQUNDRVNTX0RFTklFRCc6XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlICdFUlJPUl9TREtfREVQUkVDQVRFRCc6XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UHJvZHVjdE1hcEZvckJ1aWxkU3RhcnRDYWxsID0gKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbj86IGJvb2xlYW4gfCBudWxsKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPT4ge1xuICAgIC8vIExUUyBnYXRpbmc6IHVuZGVyIExUUywgYXV0b21hdGUgaXMgZm9yY2VkIGZhbHNlIChMVFMgYnVpbGRzIHJvdXRlIHRvXG4gICAgLy8gdGhlIExUUyBpbnRlcm5hbCBodWI7IGtlZXBpbmcgYXV0b21hdGU9dHJ1ZSB0YWdzIFRlc3RIdWIgc291cmNlIGFzXG4gICAgLy8gVE8sQVVULExUUyBpbnN0ZWFkIG9mIFRPLExUUyBcdTIwMTQgc2VlIHB5LXNkayBlYTUzZDkxNCkuIFRoZSBgbHRzYCBrZXlcbiAgICAvLyBpdHNlbGYgaXMgb25seSBlbWl0dGVkIHVuZGVyIExUUyB0byBrZWVwIG5vbi1MVFMgcGF5bG9hZHMgYnl0ZS1cbiAgICAvLyBpZGVudGljYWwgdG8gdGhlIHByZS1MVFMtUFIgc2hhcGUuXG4gICAgY29uc3QgbHRzID0gaXNMb2FkVGVzdGluZ1Nlc3Npb24oKVxuICAgIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsXVtdID0gW1xuICAgICAgICBbJ29ic2VydmFiaWxpdHknLCBjb25maWcudGVzdE9ic2VydmFiaWxpdHkuZW5hYmxlZF0sXG4gICAgICAgIFsnYWNjZXNzaWJpbGl0eScsIGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uXSxcbiAgICAgICAgWydwZXJjeScsIGNvbmZpZy5wZXJjeV0sXG4gICAgICAgIFsnYXV0b21hdGUnLCBsdHMgPyBmYWxzZSA6IGNvbmZpZy5hdXRvbWF0ZV0sXG4gICAgICAgIFsnYXBwX2F1dG9tYXRlJywgY29uZmlnLmFwcEF1dG9tYXRlXSxcbiAgICBdXG4gICAgaWYgKGx0cykge1xuICAgICAgICBlbnRyaWVzLnB1c2goWydsdHMnLCB0cnVlXSlcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzLmZpbHRlcigoWywgdl0pID0+IHYgIT09IG51bGwpKSBhcyB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfVxufVxuIiwgImltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuXG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tICdAd2Rpby90eXBlcydcblxuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHsgaXNWYWxpZEVuYWJsZWRWYWx1ZSB9IGZyb20gJy4uL3V0aWwuanMnXG5pbXBvcnQgeyBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCwgU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfT05MWSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcblxuY29uc3QgUlVOX1NNQVJUX1NFTEVDVElPTiA9ICdydW5TbWFydFNlbGVjdGlvbidcblxuY29uc3QgQUxMT1dFRF9PUkNIRVNUUkFUSU9OX0tFWVMgPSBbXG4gICAgUlVOX1NNQVJUX1NFTEVDVElPTlxuXVxuXG50eXBlIFNtYXJ0U2VsZWN0aW9uUmVwb0luZm8gPSB7XG4gICAgdXJsPzogc3RyaW5nXG4gICAgZmVhdHVyZUJyYW5jaD86IHN0cmluZ1xuICAgIGJhc2VCcmFuY2g/OiBzdHJpbmdcbiAgICBuYW1lPzogc3RyaW5nXG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG50eXBlIFNtYXJ0U2VsZWN0aW9uU291cmNlID0gc3RyaW5nW10gfCBTbWFydFNlbGVjdGlvblJlcG9JbmZvW10gfCBudWxsXG5cbnR5cGUgUnVuU21hcnRTZWxlY3Rpb25Db25maWcgPSB7XG4gICAgZW5hYmxlZD86IGJvb2xlYW4gfCBzdHJpbmdcbiAgICBtb2RlPzogc3RyaW5nXG4gICAgc291cmNlPzogc3RyaW5nIHwgc3RyaW5nW10gfCBTbWFydFNlbGVjdGlvblJlcG9JbmZvW10gfCBudWxsXG59XG5cbmNvbnN0IGlzUGxhaW5PYmplY3QgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbilcblxuY29uc3QgYXNTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQ2xhc3MgdG8gaGFuZGxlIHRlc3Qgb3JkZXJpbmcgZnVuY3Rpb25hbGl0eVxuICovXG5jbGFzcyBUZXN0T3JkZXJpbmcge1xuICAgIHByaXZhdGUgZW5hYmxlZDogYm9vbGVhblxuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nIHwgbnVsbFxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMubmFtZSA9IG51bGxcbiAgICB9XG5cbiAgICBlbmFibGUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIH1cblxuICAgIGRpc2FibGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMubmFtZSA9IG51bGxcbiAgICB9XG5cbiAgICBnZXRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVkXG4gICAgfVxuXG4gICAgZ2V0TmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZVxuICAgIH1cbn1cblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIGZvciB0ZXN0IG9yY2hlc3RyYXRpb25cbiAqL1xudHlwZSBPcmNoZXN0cmF0aW9uQ29uZmlnID0gT3B0aW9ucy5UZXN0cnVubmVyIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuZXhwb3J0IGNsYXNzIE9yY2hlc3RyYXRpb25VdGlscyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBPcmNoZXN0cmF0aW9uVXRpbHMgfCBudWxsID0gbnVsbFxuICAgIHByaXZhdGUgcnVuU21hcnRTZWxlY3Rpb246IGJvb2xlYW5cbiAgICBwcml2YXRlIHNtYXJ0U2VsZWN0aW9uTW9kZTogc3RyaW5nXG4gICAgcHJpdmF0ZSB0ZXN0T3JkZXJpbmc6IFRlc3RPcmRlcmluZ1xuICAgIHByaXZhdGUgc21hcnRTZWxlY3Rpb25Tb3VyY2U6IFNtYXJ0U2VsZWN0aW9uU291cmNlXG4gICAgcHJpdmF0ZSBwcm9qZWN0TmFtZT86IHN0cmluZ1xuICAgIHByaXZhdGUgYnVpbGROYW1lPzogc3RyaW5nXG4gICAgcHJpdmF0ZSBidWlsZElkZW50aWZpZXI/OiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb25maWcgQ29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IE9yY2hlc3RyYXRpb25Db25maWcpIHtcbiAgICAgICAgdGhpcy5ydW5TbWFydFNlbGVjdGlvbiA9IGZhbHNlXG4gICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Nb2RlID0gU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1RcbiAgICAgICAgdGhpcy50ZXN0T3JkZXJpbmcgPSBuZXcgVGVzdE9yZGVyaW5nKClcbiAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IG51bGwgLy8gU3RvcmUgc291cmNlIHBhdGhzIGlmIHByb3ZpZGVkXG5cbiAgICAgICAgLy8gQ2hlY2sgYm90aCBwb3NzaWJsZSBjb25maWd1cmF0aW9uIHBhdGhzOiBkaXJlY3Qgb3IgbmVzdGVkIGluIHNlcnZpY2VzXG4gICAgICAgIGNvbnN0IGNvbmZpZ1JlY29yZCA9IGlzUGxhaW5PYmplY3QoY29uZmlnKSA/IGNvbmZpZyA6IHt9XG4gICAgICAgIGxldCB0ZXN0T3JjaE9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gaXNQbGFpbk9iamVjdChjb25maWdSZWNvcmQudGVzdE9yY2hlc3RyYXRpb25PcHRpb25zKVxuICAgICAgICAgICAgPyBjb25maWdSZWNvcmQudGVzdE9yY2hlc3RyYXRpb25PcHRpb25zXG4gICAgICAgICAgICA6IHt9XG5cbiAgICAgICAgLy8gSWYgbm90IGZvdW5kIGF0IHRvcCBsZXZlbCwgY2hlY2sgaWYgaXQncyBpbiB0aGUgYnJvd3NlcnN0YWNrIHNlcnZpY2UgY29uZmlnXG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gQXJyYXkuaXNBcnJheShjb25maWdSZWNvcmQuc2VydmljZXMpID8gY29uZmlnUmVjb3JkLnNlcnZpY2VzIDogdW5kZWZpbmVkXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0ZXN0T3JjaE9wdGlvbnMpLmxlbmd0aCA9PT0gMCAmJiBBcnJheS5pc0FycmF5KHNlcnZpY2VzKSkge1xuICAgICAgICAgICAgLy8gTG9vayBmb3IgYnJvd3NlcnN0YWNrIHNlcnZpY2UgY29uZmlndXJhdGlvblxuICAgICAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHNlcnZpY2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHNlcnZpY2UpICYmXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VbMF0gPT09ICdicm93c2Vyc3RhY2snICYmXG4gICAgICAgICAgICAgICAgICAgIGlzUGxhaW5PYmplY3Qoc2VydmljZVsxXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNQbGFpbk9iamVjdChzZXJ2aWNlWzFdLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9ucylcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdE9yY2hPcHRpb25zID0gc2VydmljZVsxXS50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdbY29uc3RydWN0b3JdIEZvdW5kIHRlc3RPcmNoZXN0cmF0aW9uT3B0aW9ucyBpbiBicm93c2Vyc3RhY2sgc2VydmljZSBjb25maWcnKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyeSB0byBnZXQgcnVuU21hcnRTZWxlY3Rpb24gb3B0aW9uc1xuICAgICAgICBjb25zdCBydW5TbWFydFNlbGVjdGlvbk9wdHM6IFJ1blNtYXJ0U2VsZWN0aW9uQ29uZmlnID0gaXNQbGFpbk9iamVjdCh0ZXN0T3JjaE9wdGlvbnNbUlVOX1NNQVJUX1NFTEVDVElPTl0pXG4gICAgICAgICAgICA/IHRlc3RPcmNoT3B0aW9uc1tSVU5fU01BUlRfU0VMRUNUSU9OXSBhcyBSdW5TbWFydFNlbGVjdGlvbkNvbmZpZ1xuICAgICAgICAgICAgOiB7fVxuXG4gICAgICAgIHRoaXMuX3NldFJ1blNtYXJ0U2VsZWN0aW9uKFxuICAgICAgICAgICAgcnVuU21hcnRTZWxlY3Rpb25PcHRzLmVuYWJsZWQgPz8gZmFsc2UsXG4gICAgICAgICAgICBydW5TbWFydFNlbGVjdGlvbk9wdHMubW9kZSB8fCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCxcbiAgICAgICAgICAgIHJ1blNtYXJ0U2VsZWN0aW9uT3B0cy5zb3VyY2UgPz8gbnVsbFxuICAgICAgICApXG4gICAgICAgIC8vIEV4dHJhY3QgYnVpbGQgZGV0YWlscyBmcm9tIGNhcGFiaWxpdGllc1xuICAgICAgICB0aGlzLl9leHRyYWN0QnVpbGREZXRhaWxzKGNvbmZpZylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IGJ1aWxkIGRldGFpbHMgZnJvbSBjYXBhYmlsaXRpZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIF9leHRyYWN0QnVpbGREZXRhaWxzKGNvbmZpZzogT3JjaGVzdHJhdGlvbkNvbmZpZyk6IHZvaWQge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnUmVjb3JkID0gaXNQbGFpbk9iamVjdChjb25maWcpID8gY29uZmlnIDoge31cbiAgICAgICAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IChjb25maWdSZWNvcmQgYXMgeyBjYXBhYmlsaXRpZXM/OiB1bmtub3duIH0pLmNhcGFiaWxpdGllc1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmZvckVhY2goY2FwYWJpbGl0eSA9PiB0aGlzLl9wYXJzZUNhcGFiaWxpdHkoY2FwYWJpbGl0eSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoY2FwYWJpbGl0aWVzKSkge1xuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBtdWx0aXJlbW90ZSBjYXBhYmlsaXRpZXNcbiAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKGNhcGFiaWxpdGllcykuZm9yRWFjaCgoY2FwcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNQbGFpbk9iamVjdChjYXBzKSAmJiAnY2FwYWJpbGl0aWVzJyBpbiBjYXBzICYmIGlzUGxhaW5PYmplY3QoY2Fwcy5jYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZUNhcGFiaWxpdHkoY2Fwcy5jYXBhYmlsaXRpZXMpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtfZXh0cmFjdEJ1aWxkRGV0YWlsc10gRXh0cmFjdGVkIC0gcHJvamVjdE5hbWU6ICR7dGhpcy5wcm9qZWN0TmFtZX0sIGJ1aWxkTmFtZTogJHt0aGlzLmJ1aWxkTmFtZX0sIGJ1aWxkSWRlbnRpZmllcjogJHt0aGlzLmJ1aWxkSWRlbnRpZmllcn1gKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBbX2V4dHJhY3RCdWlsZERldGFpbHNdICR7ZXJyb3J9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQ2FwYWJpbGl0eShjYXBhYmlsaXR5OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGlmICghaXNQbGFpbk9iamVjdChjYXBhYmlsaXR5KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBic3RhY2tPcHRpb25zUmF3ID0gY2FwYWJpbGl0eVsnYnN0YWNrOm9wdGlvbnMnXVxuXG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KGJzdGFja09wdGlvbnNSYXcpKSB7XG4gICAgICAgICAgICBjb25zdCBidWlsZE5hbWUgPSBhc1N0cmluZyhic3RhY2tPcHRpb25zUmF3LmJ1aWxkTmFtZSlcbiAgICAgICAgICAgIGNvbnN0IHByb2plY3ROYW1lID0gYXNTdHJpbmcoYnN0YWNrT3B0aW9uc1Jhdy5wcm9qZWN0TmFtZSlcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkSWRlbnRpZmllciA9IGFzU3RyaW5nKGJzdGFja09wdGlvbnNSYXcuYnVpbGRJZGVudGlmaWVyKVxuXG4gICAgICAgICAgICBpZiAoYnVpbGROYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZE5hbWUgPSBidWlsZE5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9qZWN0TmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ1aWxkSWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRJZGVudGlmaWVyID0gYnVpbGRJZGVudGlmaWVyXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBsZWdhY3lCdWlsZElkZW50aWZpZXIgPSBhc1N0cmluZyhjYXBhYmlsaXR5Wydicm93c2Vyc3RhY2suYnVpbGRJZGVudGlmaWVyJ10pXG4gICAgICAgICAgICBjb25zdCBsZWdhY3lCdWlsZE5hbWUgPSBhc1N0cmluZyhjYXBhYmlsaXR5LmJ1aWxkKVxuXG4gICAgICAgICAgICBpZiAobGVnYWN5QnVpbGRJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZElkZW50aWZpZXIgPSBsZWdhY3lCdWlsZElkZW50aWZpZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZWdhY3lCdWlsZE5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkTmFtZSA9IGxlZ2FjeUJ1aWxkTmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IG9yIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBPcmNoZXN0cmF0aW9uVXRpbHNcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoY29uZmlnPzogT3JjaGVzdHJhdGlvbkNvbmZpZyk6IE9yY2hlc3RyYXRpb25VdGlscyB8IG51bGwge1xuICAgICAgICBpZiAoIU9yY2hlc3RyYXRpb25VdGlscy5faW5zdGFuY2UgJiYgY29uZmlnKSB7XG4gICAgICAgICAgICBPcmNoZXN0cmF0aW9uVXRpbHMuX2luc3RhbmNlID0gbmV3IE9yY2hlc3RyYXRpb25VdGlscyhjb25maWcpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9yY2hlc3RyYXRpb25VdGlscy5faW5zdGFuY2VcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgb3JjaGVzdHJhdGlvbiBkYXRhIGZyb20gY29uZmlnXG4gICAgICovXG4gICAgc3RhdGljIGdldE9yY2hlc3RyYXRpb25EYXRhKGNvbmZpZzogT3JjaGVzdHJhdGlvbkNvbmZpZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICAgICAgY29uc3QgY29uZmlnUmVjb3JkID0gaXNQbGFpbk9iamVjdChjb25maWcpID8gY29uZmlnIDoge31cbiAgICAgICAgY29uc3Qgb3JjaGVzdHJhdGlvbkRhdGEgPSBpc1BsYWluT2JqZWN0KGNvbmZpZ1JlY29yZC50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnMpXG4gICAgICAgICAgICA/IGNvbmZpZ1JlY29yZC50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnNcbiAgICAgICAgICAgIDoge31cbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMob3JjaGVzdHJhdGlvbkRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgaWYgKEFMTE9XRURfT1JDSEVTVFJBVElPTl9LRVlTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBydW4gc21hcnQgc2VsZWN0aW9uIHNldHRpbmdcbiAgICAgKi9cbiAgICBnZXRSdW5TbWFydFNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuU21hcnRTZWxlY3Rpb25cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc21hcnQgc2VsZWN0aW9uIG1vZGVcbiAgICAgKi9cbiAgICBnZXRTbWFydFNlbGVjdGlvbk1vZGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc21hcnRTZWxlY3Rpb25Nb2RlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNtYXJ0IHNlbGVjdGlvbiBzb3VyY2VcbiAgICAgKi9cbiAgICBnZXRTbWFydFNlbGVjdGlvblNvdXJjZSgpOiBTbWFydFNlbGVjdGlvblNvdXJjZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHByb2plY3QgbmFtZVxuICAgICAqL1xuICAgIGdldFByb2plY3ROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2plY3ROYW1lXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJ1aWxkIG5hbWVcbiAgICAgKi9cbiAgICBnZXRCdWlsZE5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGROYW1lXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJ1aWxkIGlkZW50aWZpZXJcbiAgICAgKi9cbiAgICBnZXRCdWlsZElkZW50aWZpZXIoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRJZGVudGlmaWVyXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGJ1aWxkIGRldGFpbHNcbiAgICAgKi9cbiAgICBzZXRCdWlsZERldGFpbHMocHJvamVjdE5hbWU/OiBzdHJpbmcsIGJ1aWxkTmFtZT86IHN0cmluZywgYnVpbGRJZGVudGlmaWVyPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZVxuICAgICAgICB0aGlzLmJ1aWxkTmFtZSA9IGJ1aWxkTmFtZVxuICAgICAgICB0aGlzLmJ1aWxkSWRlbnRpZmllciA9IGJ1aWxkSWRlbnRpZmllclxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtzZXRCdWlsZERldGFpbHNdIFNldCAtIHByb2plY3ROYW1lOiAke3RoaXMucHJvamVjdE5hbWV9LCBidWlsZE5hbWU6ICR7dGhpcy5idWlsZE5hbWV9LCBidWlsZElkZW50aWZpZXI6ICR7dGhpcy5idWlsZElkZW50aWZpZXJ9YClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcnVuIHNtYXJ0IHNlbGVjdGlvblxuICAgICAqL1xuICAgIHByaXZhdGUgX3NldFJ1blNtYXJ0U2VsZWN0aW9uKGVuYWJsZWQ6IGJvb2xlYW4gfCBzdHJpbmcsIG1vZGU6IHN0cmluZywgc291cmNlOiBzdHJpbmdbXSB8IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXSB8IHN0cmluZyB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBQcm9wZXJseSB2YWxpZGF0ZSBlbmFibGVkIHZhbHVlIC0gb25seSBhY2NlcHQgdHJ1ZSBib29sZWFuIG9yIHN0cmluZyBcInRydWVcIlxuICAgICAgICAgICAgdGhpcy5ydW5TbWFydFNlbGVjdGlvbiA9IGlzVmFsaWRFbmFibGVkVmFsdWUoZW5hYmxlZClcbiAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Nb2RlID0gbW9kZVxuICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IFtdXG5cbiAgICAgICAgICAgIC8vIExvZyB0aGUgY29uZmlndXJhdGlvbiBmb3IgZGVidWdnaW5nXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFNldHRpbmcgcnVuU21hcnRTZWxlY3Rpb246IGVuYWJsZWQ9JHt0aGlzLnJ1blNtYXJ0U2VsZWN0aW9ufSwgbW9kZT0ke3RoaXMuc21hcnRTZWxlY3Rpb25Nb2RlfWApXG4gICAgICAgICAgICBpZiAodGhpcy5ydW5TbWFydFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIE1vZGUgdmFsaWRhdGlvbiAtIG9ubHkgd2hlbiBzbWFydCBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkTW9kZXMgPSBbU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1QsIFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX09OTFldXG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZE1vZGVzLmluY2x1ZGVzKHRoaXMuc21hcnRTZWxlY3Rpb25Nb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgSW52YWxpZCBzbWFydCBzZWxlY3Rpb24gbW9kZSAnJHt0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZX0nIHByb3ZpZGVkLiBEZWZhdWx0aW5nIHRvICcke1NNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNUfScuYClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvbk1vZGUgPSBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2UgPSBudWxsXG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnTm8gc291cmNlIHByb3ZpZGVkIGZvciBzbWFydCBzZWxlY3Rpb247IGRlZmF1bHRpbmcgdG8gbnVsbC4nKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2UgPSBzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTbWFydCBzZWxlY3Rpb24gc291cmNlIHNldCB0byBhcnJheTogJHtKU09OLnN0cmluZ2lmeShzb3VyY2UpfWApXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJyAmJiBzb3VyY2UuZW5kc1dpdGgoJy5qc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IHRoaXMuX2xvYWRTb3VyY2VGcm9tRmlsZShzb3VyY2UpIHx8IFtdXG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgU21hcnQgc2VsZWN0aW9uIHNvdXJjZSBsb2FkZWQgZnJvbSBmaWxlOiAke3NvdXJjZX1gKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRUZXN0T3JkZXJpbmcoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFtfc2V0UnVuU21hcnRTZWxlY3Rpb25dICR7ZX1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgSlNPTiBzb3VyY2UgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBmb3JtYXQgaXQgZm9yIHNtYXJ0IHNlbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlUGF0aCAtIFBhdGggdG8gdGhlIEpTT04gY29uZmlndXJhdGlvbiBmaWxlXG4gICAgICogQHJldHVybnMgRm9ybWF0dGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uc1xuICAgICAqL1xuICAgIHByaXZhdGUgX2xvYWRTb3VyY2VGcm9tRmlsZShmaWxlUGF0aDogc3RyaW5nKTogU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBTb3VyY2UgZmlsZSAnJHtmaWxlUGF0aH0nIGRvZXMgbm90IGV4aXN0LmApXG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXRhOiB1bmtub3duID0gbnVsbFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JylcbiAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBwYXJzaW5nIEpTT04gZnJvbSBzb3VyY2UgZmlsZSAnJHtmaWxlUGF0aH0nOiAke21lc3NhZ2V9YClcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FjaGUgZmVhdHVyZSBicmFuY2ggbWFwcGluZ3MgZnJvbSBlbnYgdG8gYXZvaWQgcmVwZWF0ZWQgcGFyc2luZ1xuICAgICAgICBsZXQgZmVhdHVyZUJyYW5jaEVudk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgY29uc3QgbG9hZEZlYXR1cmVCcmFuY2hNYXBzID0gKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4ge1xuICAgICAgICAgICAgY29uc3QgZW52VmFyID0gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX09SQ0hFU1RSQVRJT05fU01BUlRfU0VMRUNUSU9OX0ZFQVRVUkVfQlJBTkNIRVMgfHwgJydcbiAgICAgICAgICAgIGxldCBlbnZNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGVudk1hcCA9IGVudlZhci5zdGFydHNXaXRoKCd7JykgJiYgZW52VmFyLmVuZHNXaXRoKCd9JylcbiAgICAgICAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKGVudlZhcilcbiAgICAgICAgICAgICAgICAgICAgOiBlbnZWYXIuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0uaW5jbHVkZXMoJzonKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKGFjYzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgaXRlbTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gaXRlbS5zcGxpdCgnOicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nba2V5LnRyaW0oKV0gPSB2YWx1ZS50cmltKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgcGFyc2luZyBmZWF0dXJlIGJyYW5jaCBtYXBwaW5nczogJHtlcnJvcn1gKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEZlYXR1cmUgYnJhbmNoIG1hcHBpbmdzIGZyb20gZW52OiAke0pTT04uc3RyaW5naWZ5KGVudk1hcCl9YClcbiAgICAgICAgICAgIHJldHVybiBlbnZNYXBcbiAgICAgICAgfVxuXG4gICAgICAgIGZlYXR1cmVCcmFuY2hFbnZNYXAgPSBsb2FkRmVhdHVyZUJyYW5jaE1hcHMoKVxuXG4gICAgICAgIGNvbnN0IGdldEZlYXR1cmVCcmFuY2ggPSAobmFtZTogc3RyaW5nLCByZXBvSW5mbzogU21hcnRTZWxlY3Rpb25SZXBvSW5mbyk6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgICAgICAgICAgLy8gMS4gQ2hlY2sgaW4gZW52aXJvbm1lbnQgdmFyaWFibGUgbWFwXG4gICAgICAgICAgICBpZiAoZmVhdHVyZUJyYW5jaEVudk1hcCAmJiBmZWF0dXJlQnJhbmNoRW52TWFwW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVCcmFuY2hFbnZNYXBbbmFtZV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDIuIENoZWNrIGluIHJlcG9faW5mb1xuICAgICAgICAgICAgaWYgKHJlcG9JbmZvLmZlYXR1cmVCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwb0luZm8uZmVhdHVyZUJyYW5jaFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgZGF0YSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0YTogU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdID0gW11cbiAgICAgICAgICAgIGNvbnN0IG5hbWVQYXR0ZXJuID0gL15bQS1aMC05X10rJC9cblxuICAgICAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgcmVwb0luZm9dIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KHJlcG9JbmZvKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUmVwb0luZm8gPSByZXBvSW5mbyBhcyBTbWFydFNlbGVjdGlvblJlcG9JbmZvXG5cbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHVybCBpcyBhIHN0cmluZyBhbmQgaXMgcHJlc2VudFxuICAgICAgICAgICAgICAgIGlmICghdHlwZWRSZXBvSW5mby51cmwgfHwgdHlwZW9mIHR5cGVkUmVwb0luZm8udXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgUmVwb3NpdG9yeSBVUkwgaXMgbWlzc2luZyBvciBpbnZhbGlkIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgYmFzZUJyYW5jaCwgaWYgcHJvdmlkZWQsIGlzIGEgc3RyaW5nXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVkUmVwb0luZm8uYmFzZUJyYW5jaCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0eXBlZFJlcG9JbmZvLmJhc2VCcmFuY2ggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBCYXNlIGJyYW5jaCBtdXN0IGJlIGEgc3RyaW5nIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgZmVhdHVyZUJyYW5jaCwgaWYgcHJvdmlkZWQsIGlzIGEgc3RyaW5nXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVkUmVwb0luZm8uZmVhdHVyZUJyYW5jaCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0eXBlZFJlcG9JbmZvLmZlYXR1cmVCcmFuY2ggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBGZWF0dXJlIGJyYW5jaCBtdXN0IGJlIGEgc3RyaW5nIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIG5hbWVcbiAgICAgICAgICAgICAgICBpZiAoIW5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEludmFsaWQgc291cmNlIGlkZW50aWZpZXIgZm9ybWF0IGZvciAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgbGVuZ3RoXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUubGVuZ3RoID4gMzAgfHwgbmFtZS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBTb3VyY2UgaWRlbnRpZmllciAnJHtuYW1lfScgbXVzdCBoYXZlIGEgbGVuZ3RoIGJldHdlZW4gMSBhbmQgMzAgY2hhcmFjdGVycy5gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgdXJsLCBiYXNlQnJhbmNoLCBhbmQgZmVhdHVyZUJyYW5jaCAtIGlnbm9yZSBhbGwgb3RoZXIga2V5c1xuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVCcmFuY2ggPSBnZXRGZWF0dXJlQnJhbmNoKG5hbWUsIHR5cGVkUmVwb0luZm8pXG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFJlcG9JbmZvOiBTbWFydFNlbGVjdGlvblJlcG9JbmZvID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHR5cGVkUmVwb0luZm8udXJsLFxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlQnJhbmNoOiBmZWF0dXJlQnJhbmNoID8/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE9ubHkgYWRkIGJhc2VCcmFuY2ggaWYgaXQncyBwcm92aWRlZFxuICAgICAgICAgICAgICAgIGlmICh0eXBlZFJlcG9JbmZvLmJhc2VCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRSZXBvSW5mby5iYXNlQnJhbmNoID0gdHlwZWRSZXBvSW5mby5iYXNlQnJhbmNoXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJlZFJlcG9JbmZvLmZlYXR1cmVCcmFuY2ggfHwgZmlsdGVyZWRSZXBvSW5mby5mZWF0dXJlQnJhbmNoID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgRmVhdHVyZSBicmFuY2ggbm90IHNwZWNpZmllZCBmb3Igc291cmNlICcke25hbWV9JzogJHtKU09OLnN0cmluZ2lmeShyZXBvSW5mbyl9YClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRSZXBvSW5mby5iYXNlQnJhbmNoICYmIGZpbHRlcmVkUmVwb0luZm8uYmFzZUJyYW5jaCA9PT0gZmlsdGVyZWRSZXBvSW5mby5mZWF0dXJlQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBGZWF0dXJlIGJyYW5jaCBhbmQgYmFzZSBicmFuY2ggY2Fubm90IGJlIHRoZSBzYW1lIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvcm1hdHRlZERhdGEucHVzaChmaWx0ZXJlZFJlcG9JbmZvKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0dGVkRGF0YVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLmZpbHRlcihpc1BsYWluT2JqZWN0KSBhcyBTbWFydFNlbGVjdGlvblJlcG9JbmZvW11cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0ZXN0IG9yZGVyaW5nIGJhc2VkIG9uIHByaW9yaXRpZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXRUZXN0T3JkZXJpbmcoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnJ1blNtYXJ0U2VsZWN0aW9uKSB7IC8vIEhpZ2hlc3QgcHJpb3JpdHlcbiAgICAgICAgICAgIHRoaXMudGVzdE9yZGVyaW5nLmVuYWJsZShSVU5fU01BUlRfU0VMRUNUSU9OKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50ZXN0T3JkZXJpbmcuZGlzYWJsZSgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0ZXN0IG9yZGVyaW5nIGlzIGVuYWJsZWRcbiAgICAgKi9cbiAgICB0ZXN0T3JkZXJpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXN0T3JkZXJpbmcuZ2V0RW5hYmxlZCgpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRlc3Qgb3JkZXJpbmcgbmFtZVxuICAgICAqL1xuICAgIGdldFRlc3RPcmRlcmluZ05hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RPcmRlcmluZy5nZXRFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlc3RPcmRlcmluZy5nZXROYW1lKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0ZXN0IG9yY2hlc3RyYXRpb24gbWV0YWRhdGFcbiAgICAgKi9cbiAgICBnZXRUZXN0T3JjaGVzdHJhdGlvbk1ldGFkYXRhKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgICdydW5fc21hcnRfc2VsZWN0aW9uJzoge1xuICAgICAgICAgICAgICAgICdlbmFibGVkJzogdGhpcy5nZXRSdW5TbWFydFNlbGVjdGlvbigpLFxuICAgICAgICAgICAgICAgICdtb2RlJzogdGhpcy5nZXRTbWFydFNlbGVjdGlvbk1vZGUoKSxcbiAgICAgICAgICAgICAgICAnc291cmNlJzogdGhpcy5nZXRTbWFydFNlbGVjdGlvblNvdXJjZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYnVpbGQgc3RhcnQgZGF0YVxuICAgICAqL1xuICAgIGdldEJ1aWxkU3RhcnREYXRhKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJ1bl9zbWFydF9zZWxlY3Rpb246IHtcbiAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLmdldFJ1blNtYXJ0U2VsZWN0aW9uKCksXG4gICAgICAgICAgICAgICAgbW9kZTogdGhpcy5nZXRTbWFydFNlbGVjdGlvbk1vZGUoKVxuICAgICAgICAgICAgICAgIC8vIE5vdCBzZW5kaW5nIFwic291cmNlXCIgdG8gVEggYnVpbGRzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE9yY2hlc3RyYXRpb25VdGlsc1xuIiwgImltcG9ydCB0eXBlIHsgQ2FwYWJpbGl0aWVzLCBPcHRpb25zIH0gZnJvbSAnQHdkaW8vdHlwZXMnXG5cbmltcG9ydCB7IEJTVEFDS19TRVJWSUNFX1ZFUlNJT04sIEJST1dTRVJTVEFDS19URVNUSFVCX1VVSUQsIFdESU9fTkFNSU5HX1BSRUZJWCB9IGZyb20gJy4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHR5cGUgeyBCcm93c2Vyc3RhY2tDb25maWcsIENyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQsIFVzZXJDb25maWdmb3JSZXBvcnRpbmcgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgREVGQVVMVF9SRVFVRVNUX0NPTkZJRywgZ2V0T2JzZXJ2YWJpbGl0eUtleSwgZ2V0T2JzZXJ2YWJpbGl0eVVzZXIgfSBmcm9tICcuL3V0aWwuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuL2NsaS9hcGlVdGlscy5qcydcblxuaW1wb3J0IHsgX2ZldGNoIGFzIGZldGNoIH0gZnJvbSAnLi9mZXRjaFdyYXBwZXIuanMnXG5cbnR5cGUgRGljdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENyYXNoUmVwb3J0ZXIge1xuICAgIC8qIFVzZXIgdGVzdCBjb25maWcgZm9yIGJ1aWxkIHJ1biBtaW51cyBQSUkgKi9cbiAgICBwdWJsaWMgc3RhdGljIHVzZXJDb25maWdGb3JSZXBvcnRpbmc6IFVzZXJDb25maWdmb3JSZXBvcnRpbmcgPSB7fVxuICAgIC8qIFVzZXIgY3JlZGVudGlhbHMgdXNlZCBmb3IgcmVwb3J0aW5nIGNyYXNoZXMgaW4gYnJvd3NlcnN0YWNrIHNlcnZpY2UgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBjcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkOiBDcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkID0ge31cblxuICAgIHN0YXRpYyBzZXRDcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkID0ge1xuICAgICAgICAgICAgdXNlcm5hbWU6IGdldE9ic2VydmFiaWxpdHlVc2VyKG9wdGlvbnMsIGNvbmZpZyksXG4gICAgICAgICAgICBwYXNzd29yZDogZ2V0T2JzZXJ2YWJpbGl0eUtleShvcHRpb25zLCBjb25maWcpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzcy5lbnYuQ1JFREVOVElBTFNfRk9SX0NSQVNIX1JFUE9SVElORyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZClcbiAgICB9XG5cbiAgICBzdGF0aWMgc2V0Q29uZmlnRGV0YWlscyh1c2VyQ29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsIGNhcGFiaWxpdGllczogQ2FwYWJpbGl0aWVzLlRlc3RydW5uZXJDYXBhYmlsaXRpZXMsIG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgICAgICBjb25zdCBjb25maWdXaXRob3V0UElJID0gdGhpcy5maWx0ZXJQSUkodXNlckNvbmZpZylcbiAgICAgICAgY29uc3QgZmlsdGVyZWRDYXBhYmlsaXRpZXMgPSB0aGlzLmZpbHRlckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMpXG4gICAgICAgIHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZyA9IHtcbiAgICAgICAgICAgIGZyYW1ld29yazogdXNlckNvbmZpZy5mcmFtZXdvcmssXG4gICAgICAgICAgICBzZXJ2aWNlczogY29uZmlnV2l0aG91dFBJSS5zZXJ2aWNlcyxcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogZmlsdGVyZWRDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgICAnQlJPV1NFUlNUQUNLX0JVSUxEJzogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0JVSUxELFxuICAgICAgICAgICAgICAgICdCUk9XU0VSU1RBQ0tfQlVJTERfTkFNRSc6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19CVUlMRF9OQU1FLFxuICAgICAgICAgICAgICAgICdCVUlMRF9UQUcnOiBwcm9jZXNzLmVudi5CVUlMRF9UQUdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzLmVudi5VU0VSX0NPTkZJR19GT1JfUkVQT1JUSU5HID0gSlNPTi5zdHJpbmdpZnkodGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nKVxuICAgICAgICB0aGlzLnNldENyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQob3B0aW9ucywgdXNlckNvbmZpZylcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgdXBsb2FkQ3Jhc2hSZXBvcnQoZXhjZXB0aW9uOiBzdHJpbmcsIHN0YWNrVHJhY2U6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQudXNlcm5hbWUgfHwgIXRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC5wYXNzd29yZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZCA9IHByb2Nlc3MuZW52LkNSRURFTlRJQUxTX0ZPUl9DUkFTSF9SRVBPUlRJTkcgIT09IHVuZGVmaW5lZCA/IEpTT04ucGFyc2UocHJvY2Vzcy5lbnYuQ1JFREVOVElBTFNfRk9SX0NSQVNIX1JFUE9SVElORykgOiB0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBCU3RhY2tMb2dnZXIuZXJyb3IoYFtDcmFzaF9SZXBvcnRfVXBsb2FkXSBGYWlsZWQgdG8gcGFyc2UgdXNlciBjcmVkZW50aWFscyB3aGlsZSByZXBvcnRpbmcgY3Jhc2ggZHVlIHRvICR7ZXJyb3J9YClcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC51c2VybmFtZSB8fCAhdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnBhc3N3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gQlN0YWNrTG9nZ2VyLmVycm9yKCdbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIHRvIHBhcnNlIHVzZXIgY3JlZGVudGlhbHMgd2hpbGUgcmVwb3J0aW5nIGNyYXNoJylcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcgPSBwcm9jZXNzLmVudi5VU0VSX0NPTkZJR19GT1JfUkVQT1JUSU5HICE9PSB1bmRlZmluZWQgPyBKU09OLnBhcnNlKHByb2Nlc3MuZW52LlVTRVJfQ09ORklHX0ZPUl9SRVBPUlRJTkcpIDoge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgW0NyYXNoX1JlcG9ydF9VcGxvYWRdIEZhaWxlZCB0byBwYXJzZSB1c2VyIGNvbmZpZyB3aGlsZSByZXBvcnRpbmcgY3Jhc2ggZHVlIHRvICR7ZXJyb3J9YClcbiAgICAgICAgICAgIHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZyA9IHt9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgaGFzaGVkX2lkOiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXSxcbiAgICAgICAgICAgIG9ic2VydmFiaWxpdHlfdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIGZyYW1ld29ya05hbWU6IFdESU9fTkFNSU5HX1BSRUZJWCArICh0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcuZnJhbWV3b3JrIHx8ICdudWxsJyksXG4gICAgICAgICAgICAgICAgc2RrVmVyc2lvbjogQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4Y2VwdGlvbjoge1xuICAgICAgICAgICAgICAgIGVycm9yOiBleGNlcHRpb24udG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBzdGFja1RyYWNlOiBzdGFja1RyYWNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlnOiB0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmdcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElVdGlscy5EQVRBX0VORFBPSU5UfS9hcGkvdjEvYW5hbHl0aWNzYFxuXG4gICAgICAgIGNvbnN0IGVuY29kZWRBdXRoID0gQnVmZmVyLmZyb20oYCR7dGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnVzZXJuYW1lfToke3RoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC5wYXNzd29yZH1gLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgLi4uREVGQVVMVF9SRVFVRVNUX0NPTkZJRy5oZWFkZXJzLFxuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7ZW5jb2RlZEF1dGh9YCxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgbGV0IGJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KClcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UoYm9keSkpXG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBSZXNwb25zZSBpcyBub3QgSlNPTiwgdXNlIHRleHQgYXMtaXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW0NyYXNoX1JlcG9ydF9VcGxvYWRdIFN1Y2Nlc3MgcmVzcG9uc2U6ICR7Ym9keX1gKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIGR1ZSB0byAke3Jlc3BvbnNlLmJvZHl9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyByZWN1cnNpdmVseVJlZGFjdEtleXNGcm9tT2JqZWN0KG9iajogRGljdCB8IEFycmF5PERpY3Q+LCBrZXlzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgb2JqLm1hcChlbGUgPT4gdGhpcy5yZWN1cnNpdmVseVJlZGFjdEtleXNGcm9tT2JqZWN0KGVsZSwga2V5cykpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleXMuaW5jbHVkZXMocHJvcC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICBvYmpbcHJvcF0gPSAnW1JFREFDVEVEXSdcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpbcHJvcF0gPT09ICdvYmplY3QnICYmIG9ialtwcm9wXSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3Qob2JqW3Byb3BdIGFzIERpY3QgfCBBcnJheTxEaWN0Piwga2V5cylcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpbcHJvcF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKG9ialtwcm9wXSBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcgJiYgcGFyc2VkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN1cnNpdmVseVJlZGFjdEtleXNGcm9tT2JqZWN0KHBhcnNlZCBhcyBEaWN0IHwgQXJyYXk8RGljdD4sIGtleXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqW3Byb3BdID0gSlNPTi5zdHJpbmdpZnkocGFyc2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCB2YWxpZCBKU09OLCBsZWF2ZSBhcy1pc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGRlbGV0ZVBJSUtleXNGcm9tT2JqZWN0KG9iajogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pIHtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIFsndXNlcicsICd1c2VybmFtZScsICdrZXknLCAnYWNjZXNzS2V5J10uZm9yRWFjaChrZXkgPT4gZGVsZXRlIG9ialtrZXldKVxuICAgIH1cblxuICAgIHN0YXRpYyBmaWx0ZXJDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXRpZXMuVGVzdHJ1bm5lckNhcGFiaWxpdGllcykge1xuICAgICAgICBjb25zdCBjYXBzQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY2FwYWJpbGl0aWVzKSlcbiAgICAgICAgdGhpcy5yZWN1cnNpdmVseVJlZGFjdEtleXNGcm9tT2JqZWN0KGNhcHNDb3B5LCBbJ2V4dGVuc2lvbnMnXSlcbiAgICAgICAgcmV0dXJuIGNhcHNDb3B5XG4gICAgfVxuXG4gICAgc3RhdGljIGZpbHRlclBJSSh1c2VyQ29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICAgICAgY29uc3QgY29uZmlnV2l0aG91dFBJSSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodXNlckNvbmZpZykpXG4gICAgICAgIHRoaXMuZGVsZXRlUElJS2V5c0Zyb21PYmplY3QoY29uZmlnV2l0aG91dFBJSSlcbiAgICAgICAgY29uc3QgZmluYWxTZXJ2aWNlcyA9IFtdXG4gICAgICAgIGNvbnN0IGluaXRpYWxTZXJ2aWNlcyA9IGNvbmZpZ1dpdGhvdXRQSUkuc2VydmljZXNcbiAgICAgICAgZGVsZXRlIGNvbmZpZ1dpdGhvdXRQSUkuc2VydmljZXNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VydmljZUFycmF5IG9mIGluaXRpYWxTZXJ2aWNlcykge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlcnZpY2VBcnJheSkgJiYgc2VydmljZUFycmF5Lmxlbmd0aCA+PSAyICYmIHNlcnZpY2VBcnJheVswXSA9PT0gJ2Jyb3dzZXJzdGFjaycpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMTsgaWR4IDwgc2VydmljZUFycmF5Lmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlUElJS2V5c0Zyb21PYmplY3Qoc2VydmljZUFycmF5W2lkeF0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZUFycmF5W2lkeF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYm90aCBuZXcgdGVzdFJlcG9ydGluZ09wdGlvbnMgYW5kIGxlZ2FjeSB0ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVBJSUtleXNGcm9tT2JqZWN0KHNlcnZpY2VBcnJheVtpZHhdLnRlc3RSZXBvcnRpbmdPcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlUElJS2V5c0Zyb21PYmplY3Qoc2VydmljZUFycmF5W2lkeF0udGVzdE9ic2VydmFiaWxpdHlPcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsU2VydmljZXMucHVzaChzZXJ2aWNlQXJyYXkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8qIFdyb25nIGNvbmZpZ3VyYXRpb24gbGlrZSBzdHJpbmdzIGluc3RlYWQgb2YganNvbiBvYmplY3RzIGNvdWxkIGJyZWFrIHRoaXMgbWV0aG9kLCBuZWVkcyBubyBhY3Rpb24gKi9cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGFyc2luZyB1c2VyIGNvbmZpZyBQSUkgd2l0aCBlcnJvciAke2VyciA/ICgoZXJyIGFzIEVycm9yKS5zdGFjayB8fCBlcnIpIDogZXJyfWApXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnV2l0aG91dFBJSVxuICAgICAgICB9XG4gICAgICAgIGNvbmZpZ1dpdGhvdXRQSUkuc2VydmljZXMgPSBmaW5hbFNlcnZpY2VzXG4gICAgICAgIHJldHVybiBjb25maWdXaXRob3V0UElJXG4gICAgfVxufVxuIiwgImltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB0eXBlIHsgRmVhdHVyZVN0YXRzT3ZlcnZpZXcgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGlzT2JqZWN0RW1wdHkgfSBmcm9tICcuLi91dGlsLmpzJ1xuXG5pbnRlcmZhY2UgRmVhdHVyZVN0YXRzTWFwIHtcbiAgICBbZ3JvdXBJZDogc3RyaW5nXTogRmVhdHVyZVN0YXRzO1xufVxuXG5pbnRlcmZhY2UgSlNPTkNvbnZlcnNpb25TZXR0aW5ncyB7XG4gICAgb21pdEdyb3Vwcz86IGJvb2xlYW5cbiAgICBvbmx5R3JvdXBzPzogYm9vbGVhblxuICAgIG5lc3RlZEdyb3Vwcz86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlIHtcbiAgICB0cmlnZ2VyZWRDb3VudDogbnVtYmVyXG4gICAgc2VudENvdW50OiBudW1iZXJcbiAgICBmYWlsZWRDb3VudDogbnVtYmVyXG4gICAgZ3JvdXBzOiBGZWF0dXJlW11cbn1cblxuY2xhc3MgRmVhdHVyZVN0YXRzIHtcbiAgICBwcml2YXRlIHRyaWdnZXJlZENvdW50OiBudW1iZXIgPSAwXG4gICAgcHJpdmF0ZSBzZW50Q291bnQ6IG51bWJlciA9IDBcbiAgICBwcml2YXRlIGZhaWxlZENvdW50OiBudW1iZXIgPSAwXG4gICAgcHJpdmF0ZSBncm91cHM6IEZlYXR1cmVTdGF0c01hcCA9IHt9XG5cbiAgICBwdWJsaWMgbWFyayhzdGF0dXM6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgJ3RyaWdnZXJlZCc6XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJlZChncm91cElkKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgIGNhc2UgJ3NlbnQnOlxuICAgICAgICAgICAgdGhpcy5zZW50KGdyb3VwSWQpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdmYWlsZWQnOlxuICAgICAgICAgICAgdGhpcy5mYWlsZWQoZ3JvdXBJZClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1JlcXVlc3QgdG8gbWFyayB1c2FnZSBmb3IgdW5rbm93biBzdGF0dXMgLSAnICsgc3RhdHVzKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0cmlnZ2VyZWQoZ3JvdXBJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnRyaWdnZXJlZENvdW50ICs9IDFcbiAgICAgICAgaWYgKGdyb3VwSWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoZ3JvdXBJZCkudHJpZ2dlcmVkKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZW50KGdyb3VwSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZW50Q291bnQgKz0gMVxuICAgICAgICBpZiAoZ3JvdXBJZCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVHcm91cChncm91cElkKS5zZW50KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBmYWlsZWQoZ3JvdXBJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmZhaWxlZENvdW50ICs9IDFcbiAgICAgICAgaWYgKGdyb3VwSWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoZ3JvdXBJZCkuZmFpbGVkKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdWNjZXNzKGdyb3VwSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZW50KGdyb3VwSWQpXG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUdyb3VwKGdyb3VwSWQ6IHN0cmluZyk6IEZlYXR1cmVTdGF0cyB7XG4gICAgICAgIGlmICghdGhpcy5ncm91cHNbZ3JvdXBJZF0pIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzW2dyb3VwSWRdID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzW2dyb3VwSWRdXG4gICAgfVxuXG4gICAgcHVibGljIGdldFRyaWdnZXJlZENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyaWdnZXJlZENvdW50XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNlbnRDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW50Q291bnRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmFpbGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbGVkQ291bnRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VXNhZ2VGb3JHcm91cChncm91cElkOiBzdHJpbmcpOiBGZWF0dXJlU3RhdHMge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNbZ3JvdXBJZF0gfHwgbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgfVxuXG4gICAgcHVibGljIGdldE92ZXJ2aWV3KCk6IEZlYXR1cmVTdGF0c092ZXJ2aWV3IHtcbiAgICAgICAgcmV0dXJuIHsgdHJpZ2dlcmVkQ291bnQ6IHRoaXMudHJpZ2dlcmVkQ291bnQsIHNlbnRDb3VudDogdGhpcy5zZW50Q291bnQsIGZhaWxlZENvdW50OiB0aGlzLmZhaWxlZENvdW50IH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0R3JvdXBzKCk6IEZlYXR1cmVTdGF0c01hcCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwc1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGQoZmVhdHVyZVN0YXRzOiBGZWF0dXJlU3RhdHMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyZWRDb3VudCArPSBmZWF0dXJlU3RhdHMuZ2V0VHJpZ2dlcmVkQ291bnQoKVxuICAgICAgICB0aGlzLnNlbnRDb3VudCArPSBmZWF0dXJlU3RhdHMuZ2V0U2VudENvdW50KClcbiAgICAgICAgdGhpcy5mYWlsZWRDb3VudCArPSBmZWF0dXJlU3RhdHMuZ2V0RmFpbGVkQ291bnQoKVxuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGZlYXR1cmVTdGF0cy5nZXRHcm91cHMoKSkuZm9yRWFjaCgoW2dyb3VwSWQsIGdyb3VwXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVHcm91cChncm91cElkKS5hZGQoZ3JvdXApXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gb21pdEdyb3VwczogdHJ1ZS9mYWxzZSAtPiBJbmNsdWRlIGdyb3VwcyBvciBub3RcbiAgICAvLyBvbmx5R3JvdXBzOiB0cnVlL2ZhbHNlIC0+IGRhdGEgaW5jbHVkZXMgb25seSBncm91cHNcbiAgICAvLyBuZXN0ZWRHcm91cHM6IHRydWUvZmFsc2UgLT4gZ3JvdXBzIHdpbGwgYmUgbmVzdGVkIGluIGdyb3VwcyBpZiB0cnVlXG4gICAgcHVibGljIHRvSlNPTihjb25maWc6IEpTT05Db252ZXJzaW9uU2V0dGluZ3MgPSB7fSkge1xuICAgICAgICBjb25zdCBvdmVydmlld0RhdGE6IEZlYXR1cmVTdGF0c092ZXJ2aWV3fFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9ICFjb25maWcub25seUdyb3VwcyA/IHtcbiAgICAgICAgICAgIHRyaWdnZXJlZENvdW50OiB0aGlzLnRyaWdnZXJlZENvdW50LFxuICAgICAgICAgICAgc2VudENvdW50OiB0aGlzLnNlbnRDb3VudCxcbiAgICAgICAgICAgIGZhaWxlZENvdW50OiB0aGlzLmZhaWxlZENvdW50XG4gICAgICAgIH0gOiB7fVxuXG4gICAgICAgIGNvbnN0IGdyb3Vwc0RhdGE6IFJlY29yZDxzdHJpbmcsIEZlYXR1cmVTdGF0c092ZXJ2aWV3PiA9IHt9XG4gICAgICAgIGlmICghY29uZmlnLm9taXRHcm91cHMpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZ3JvdXBzKS5mb3JFYWNoKChbZ3JvdXBJZCwgZ3JvdXBdKSA9PiB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzRGF0YVtncm91cElkXSA9IChncm91cC50b0pTT04oKSBhcyBGZWF0dXJlU3RhdHNPdmVydmlldykgLy8gQ3VycmVudGx5IE5lc3RlZCBncm91cHMgYXJlIG9ubHkgb3ZlcnZpZXdzXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdyb3VwID0gY29uZmlnLm5lc3RlZEdyb3VwcyA/IHsgZ3JvdXBzOiBncm91cHNEYXRhIH0gOiBncm91cHNEYXRhXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLm92ZXJ2aWV3RGF0YSxcbiAgICAgICAgICAgIC4uLmdyb3VwXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21KU09OKGpzb246IEZlYXR1cmUpOiBGZWF0dXJlU3RhdHMge1xuICAgICAgICBjb25zdCBzdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuXG4gICAgICAgIGlmICghanNvbiB8fCBpc09iamVjdEVtcHR5KGpzb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdHNcbiAgICAgICAgfVxuICAgICAgICBzdGF0cy50cmlnZ2VyZWRDb3VudCA9IGpzb24udHJpZ2dlcmVkQ291bnRcbiAgICAgICAgc3RhdHMuc2VudENvdW50ID0ganNvbi5zZW50Q291bnRcbiAgICAgICAgc3RhdHMuZmFpbGVkQ291bnQgPSBqc29uLmZhaWxlZENvdW50XG5cbiAgICAgICAgaWYgKCFqc29uLmdyb3Vwcykge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRzXG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoanNvbi5ncm91cHMpLmZvckVhY2goKFtncm91cElkLCBncm91cF0pID0+IHtcbiAgICAgICAgICAgIHN0YXRzLmdyb3Vwc1tncm91cElkXSA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihncm91cClcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHN0YXRzXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGZWF0dXJlU3RhdHNcbiIsICJpbXBvcnQgeyBnZXRFcnJvclN0cmluZyB9IGZyb20gJy4uL3V0aWwuanMnXG5cbmNsYXNzIEZlYXR1cmVVc2FnZSB7XG4gICAgcHJpdmF0ZSBpc1RyaWdnZXJlZD86IGJvb2xlYW5cbiAgICBwcml2YXRlIHN0YXR1cz86IHN0cmluZ1xuICAgIHByaXZhdGUgZXJyb3I/OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKGlzVHJpZ2dlcmVkPzogYm9vbGVhbikge1xuICAgICAgICBpZiAoaXNUcmlnZ2VyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5pc1RyaWdnZXJlZCA9IGlzVHJpZ2dlcmVkXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJpZ2dlcmVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1RyaWdnZXJlZFxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUcmlnZ2VyZWQodHJpZ2dlcmVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNUcmlnZ2VyZWQgPSB0cmlnZ2VyZWRcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U3RhdHVzKHN0YXR1czogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzXG4gICAgfVxuXG4gICAgcHVibGljIHNldEVycm9yKGVycm9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHRyaWdnZXJlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1RyaWdnZXJlZCA9IHRydWVcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFpbGVkKGU6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICB0aGlzLmVycm9yID0gZ2V0RXJyb3JTdHJpbmcoZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3VjY2VzcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSAnc3VjY2VzcydcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3RhdHVzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXR1c1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFcnJvcigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1RyaWdnZXJlZDogdGhpcy5pc1RyaWdnZXJlZCxcbiAgICAgICAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICBlcnJvcjogdGhpcy5lcnJvclxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGZWF0dXJlVXNhZ2VcbiIsICJjbGFzcyBUZXN0T3BzQ29uZmlnIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFRlc3RPcHNDb25maWdcbiAgICBwdWJsaWMgYnVpbGRTdG9wcGVkOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgYnVpbGRIYXNoZWRJZD86IHN0cmluZ1xuXG4gICAgc3RhdGljIGdldEluc3RhbmNlKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhc3NpbmcgYXJncyB0byBjb25zdHJ1Y3RvclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgVGVzdE9wc0NvbmZpZyguLi5hcmdzKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIHB1YmxpYyBtYW51YWxseVNldDogYm9vbGVhbiA9IGZhbHNlLFxuICAgICl7XG4gICAgICAgIFRlc3RPcHNDb25maWcuX2luc3RhbmNlID0gdGhpc1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGVzdE9wc0NvbmZpZ1xuIiwgImltcG9ydCBGZWF0dXJlU3RhdHMsIHsgdHlwZSBGZWF0dXJlIH0gZnJvbSAnLi9mZWF0dXJlU3RhdHMuanMnXG5pbXBvcnQgRmVhdHVyZVVzYWdlIGZyb20gJy4vZmVhdHVyZVVzYWdlLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IFRlc3RPcHNDb25maWcgZnJvbSAnLi90ZXN0T3BzQ29uZmlnLmpzJ1xuaW1wb3J0IHR5cGUgeyBUT1VzYWdlU3RhdHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZXhwb3J0IGludGVyZmFjZSBVc2FnZVN0YXQge1xuICAgIHRlc3RFdmVudHM6IHtcbiAgICAgICAgc3RhcnRlZDogRmVhdHVyZVxuICAgICAgICBmaW5pc2hlZDogRmVhdHVyZVxuICAgIH1cbiAgICBob29rRXZlbnRzOiB7XG4gICAgICAgIHN0YXJ0ZWQ6IEZlYXR1cmVcbiAgICAgICAgZmluaXNoZWQ6IEZlYXR1cmVcbiAgICB9XG4gICAgbG9nRXZlbnRzOiBGZWF0dXJlXG4gICAgY2J0U2Vzc2lvbkV2ZW50czogRmVhdHVyZVxuICAgIGNidFNlc3Npb25TdGF0czogRmVhdHVyZVxufVxuXG5jbGFzcyBVc2FnZVN0YXRzIHtcbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlOiBVc2FnZVN0YXRzXG4gICAgcHVibGljIHRlc3RTdGFydGVkU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyB0ZXN0RmluaXNoZWRTdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIGhvb2tTdGFydGVkU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyBob29rRmluaXNoZWRTdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIGNidFNlc3Npb25TdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIGxvZ1N0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgbGF1bmNoQnVpbGRVc2FnZTogRmVhdHVyZVVzYWdlXG4gICAgcHVibGljIHN0b3BCdWlsZFVzYWdlOiBGZWF0dXJlVXNhZ2VcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVXNhZ2VTdGF0cyB7XG4gICAgICAgIGlmICghVXNhZ2VTdGF0cy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgVXNhZ2VTdGF0cy5pbnN0YW5jZSA9IG5ldyBVc2FnZVN0YXRzKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVXNhZ2VTdGF0cy5pbnN0YW5jZVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRlc3RTdGFydGVkU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy50ZXN0RmluaXNoZWRTdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLmhvb2tTdGFydGVkU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy5ob29rRmluaXNoZWRTdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLmNidFNlc3Npb25TdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLmxvZ1N0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMubGF1bmNoQnVpbGRVc2FnZSA9IG5ldyBGZWF0dXJlVXNhZ2UoKVxuICAgICAgICB0aGlzLnN0b3BCdWlsZFVzYWdlID0gbmV3IEZlYXR1cmVVc2FnZSgpXG4gICAgfVxuXG4gICAgcHVibGljIGFkZCh1c2FnZVN0YXRzOiBVc2FnZVN0YXRzKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGVzdFN0YXJ0ZWRTdGF0cy5hZGQodXNhZ2VTdGF0cy50ZXN0U3RhcnRlZFN0YXRzKVxuICAgICAgICB0aGlzLnRlc3RGaW5pc2hlZFN0YXRzLmFkZCh1c2FnZVN0YXRzLnRlc3RGaW5pc2hlZFN0YXRzKVxuICAgICAgICB0aGlzLmhvb2tTdGFydGVkU3RhdHMuYWRkKHVzYWdlU3RhdHMuaG9va1N0YXJ0ZWRTdGF0cylcbiAgICAgICAgdGhpcy5ob29rRmluaXNoZWRTdGF0cy5hZGQodXNhZ2VTdGF0cy5ob29rRmluaXNoZWRTdGF0cylcbiAgICAgICAgdGhpcy5jYnRTZXNzaW9uU3RhdHMuYWRkKHVzYWdlU3RhdHMuY2J0U2Vzc2lvblN0YXRzKVxuICAgICAgICB0aGlzLmxvZ1N0YXRzLmFkZCh1c2FnZVN0YXRzLmxvZ1N0YXRzKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZWREYXRhKHdvcmtlcnNEYXRhOiB7IHVzYWdlU3RhdHM6IFVzYWdlU3RhdCB9W10pIHtcbiAgICAgICAgdGhpcy5hZGREYXRhRnJvbVdvcmtlcnMod29ya2Vyc0RhdGEpXG4gICAgICAgIGNvbnN0IHRlc3RPcHNDb25maWcgPSBUZXN0T3BzQ29uZmlnLmdldEluc3RhbmNlKClcbiAgICAgICAgY29uc3QgdXNhZ2U6IFRPVXNhZ2VTdGF0cyA9IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRlc3RPcHNDb25maWcuZW5hYmxlZCxcbiAgICAgICAgICAgIG1hbnVhbGx5U2V0OiB0ZXN0T3BzQ29uZmlnLm1hbnVhbGx5U2V0LFxuICAgICAgICAgICAgYnVpbGRIYXNoZWRJZDogdGVzdE9wc0NvbmZpZy5idWlsZEhhc2hlZElkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXVzYWdlLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1c2FnZVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHVzYWdlLmV2ZW50cyA9IHRoaXMuZ2V0RXZlbnRzRGF0YSgpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnZXhjZXB0aW9uIGluIGdldEZvcm1hdHRlZERhdGE6ICcgKyBlKVxuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVzYWdlXG4gICAgfVxuXG4gICAgcHVibGljIGFkZERhdGFGcm9tV29ya2Vycyh3b3JrZXJzRGF0YTogeyB1c2FnZVN0YXRzOiBVc2FnZVN0YXQgfVtdKSB7XG4gICAgICAgIHdvcmtlcnNEYXRhLm1hcCh3b3JrZXJEYXRhID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXNhZ2VTdGF0c0ZvcldvcmtlciA9IFVzYWdlU3RhdHMuZnJvbUpTT04od29ya2VyRGF0YS51c2FnZVN0YXRzKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkKHVzYWdlU3RhdHNGb3JXb3JrZXIpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdFeGNlcHRpb24gaW4gYWRkaW5nIHdvcmtlckRhdGE6ICcgKyBlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFdmVudHNEYXRhKCl7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBidWlsZEV2ZW50czoge1xuICAgICAgICAgICAgICAgIHN0YXJ0ZWQ6IHRoaXMubGF1bmNoQnVpbGRVc2FnZS50b0pTT04oKSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZDogdGhpcy5zdG9wQnVpbGRVc2FnZS50b0pTT04oKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRlc3RFdmVudHM6IHtcbiAgICAgICAgICAgICAgICBzdGFydGVkOiB0aGlzLnRlc3RTdGFydGVkU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMudGVzdEZpbmlzaGVkU3RhdHMudG9KU09OKHsgb21pdEdyb3VwczogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICAuLi50aGlzLnRlc3RGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG9ubHlHcm91cHM6IHRydWUgfSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBob29rRXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRlZDogdGhpcy5ob29rU3RhcnRlZFN0YXRzLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0aGlzLmhvb2tGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG9taXRHcm91cHM6IHRydWUgfSksXG4gICAgICAgICAgICAgICAgLi4udGhpcy5ob29rRmluaXNoZWRTdGF0cy50b0pTT04oeyBvbmx5R3JvdXBzOiB0cnVlIH0pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbG9nRXZlbnRzOiB0aGlzLmxvZ1N0YXRzLnRvSlNPTigpLFxuICAgICAgICAgICAgY2J0U2Vzc2lvbkV2ZW50czogdGhpcy5jYnRTZXNzaW9uU3RhdHMudG9KU09OKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXREYXRhVG9TYXZlKCl7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXN0RXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRlZDogdGhpcy50ZXN0U3RhcnRlZFN0YXRzLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0aGlzLnRlc3RGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG5lc3RlZEdyb3VwczogdHJ1ZSB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBob29rRXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRlZDogdGhpcy5ob29rU3RhcnRlZFN0YXRzLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0aGlzLmhvb2tGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG5lc3RlZEdyb3VwczogdHJ1ZSB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2dFdmVudHM6IHRoaXMubG9nU3RhdHMudG9KU09OKHsgbmVzdGVkR3JvdXBzOiB0cnVlIH0pLFxuICAgICAgICAgICAgY2J0U2Vzc2lvbkV2ZW50czogdGhpcy5jYnRTZXNzaW9uU3RhdHMudG9KU09OKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUpTT04oZGF0YTogVXNhZ2VTdGF0KSB7XG4gICAgICAgIGNvbnN0IHVzYWdlU3RhdHMgPSBuZXcgVXNhZ2VTdGF0cygpXG4gICAgICAgIHVzYWdlU3RhdHMudGVzdFN0YXJ0ZWRTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLnRlc3RFdmVudHMuc3RhcnRlZClcbiAgICAgICAgdXNhZ2VTdGF0cy50ZXN0RmluaXNoZWRTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLnRlc3RFdmVudHMuZmluaXNoZWQpXG4gICAgICAgIHVzYWdlU3RhdHMuaG9va1N0YXJ0ZWRTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLmhvb2tFdmVudHMuc3RhcnRlZClcbiAgICAgICAgdXNhZ2VTdGF0cy5ob29rRmluaXNoZWRTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLmhvb2tFdmVudHMuZmluaXNoZWQpXG4gICAgICAgIHVzYWdlU3RhdHMubG9nU3RhdHMgPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZGF0YS5sb2dFdmVudHMpXG4gICAgICAgIHVzYWdlU3RhdHMuY2J0U2Vzc2lvblN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEuY2J0U2Vzc2lvblN0YXRzKVxuICAgICAgICByZXR1cm4gdXNhZ2VTdGF0c1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVXNhZ2VTdGF0c1xuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnXG5cbmludGVyZmFjZSBTY3JpcHRzIHtcbiAgICBzY2FuOiBzdHJpbmdcbiAgICBnZXRSZXN1bHRzOiBzdHJpbmdcbiAgICBnZXRSZXN1bHRzU3VtbWFyeTogc3RyaW5nXG4gICAgc2F2ZVJlc3VsdHM6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgQ29tbWFuZCB7XG4gICAgbmFtZTogc3RyaW5nXG4gICAgY2xhc3M6IHN0cmluZ1xufVxuXG5jbGFzcyBBY2Nlc3NpYmlsaXR5U2NyaXB0cyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEFjY2Vzc2liaWxpdHlTY3JpcHRzIHwgbnVsbCA9IG51bGxcblxuICAgIHB1YmxpYyBwZXJmb3JtU2Nhbjogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgZ2V0UmVzdWx0czogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgZ2V0UmVzdWx0c1N1bW1hcnk6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIHNhdmVUZXN0UmVzdWx0czogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgY29tbWFuZHNUb1dyYXA6IEFycmF5PENvbW1hbmQ+IHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgQ2hyb21lRXh0ZW5zaW9uOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSA9IHt9XG5cbiAgICBwdWJsaWMgYnJvd3NlcnN0YWNrRm9sZGVyUGF0aCA9ICcnXG4gICAgcHVibGljIGNvbW1hbmRzUGF0aCA9ICcnXG5cbiAgICAvLyBkb24ndCBhbGxvdyB0byBjcmVhdGUgaW5zdGFuY2VzIGZyb20gaXQgb3RoZXIgdGhhbiB0aHJvdWdoIGBjaGVja0FuZEdldEluc3RhbmNlYFxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYnJvd3NlcnN0YWNrRm9sZGVyUGF0aCA9IHRoaXMuZ2V0V3JpdGFibGVEaXIoKVxuICAgICAgICB0aGlzLmNvbW1hbmRzUGF0aCA9IHBhdGguam9pbih0aGlzLmJyb3dzZXJzdGFja0ZvbGRlclBhdGgsICdjb21tYW5kcy5qc29uJylcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrQW5kR2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghQWNjZXNzaWJpbGl0eVNjcmlwdHMuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmluc3RhbmNlID0gbmV3IEFjY2Vzc2liaWxpdHlTY3JpcHRzKClcbiAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmluc3RhbmNlLnJlYWRGcm9tRXhpc3RpbmdGaWxlKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQWNjZXNzaWJpbGl0eVNjcmlwdHMuaW5zdGFuY2VcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbiAgICBwdWJsaWMgZ2V0V3JpdGFibGVEaXIoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgb3JkZXJlZFBhdGhzID0gW1xuICAgICAgICAgICAgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5icm93c2Vyc3RhY2snKSxcbiAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICBvcy50bXBkaXIoKVxuICAgICAgICBdXG4gICAgICAgIGZvciAoY29uc3Qgb3JkZXJlZFBhdGggb2Ygb3JkZXJlZFBhdGhzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKG9yZGVyZWRQYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICBmcy5hY2Nlc3NTeW5jKG9yZGVyZWRQYXRoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JkZXJlZFBhdGhcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmcy5ta2RpclN5bmMob3JkZXJlZFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yZGVyZWRQYXRoXG5cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLyogbm8tZW1wdHkgKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJydcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZyb21FeGlzdGluZ0ZpbGUoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLmNvbW1hbmRzUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuY29tbWFuZHNQYXRoLCAndXRmOCcpXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoSlNPTi5wYXJzZShkYXRhKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogRG8gbm90aGluZyAqL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZShkYXRhOiB7IGNvbW1hbmRzOiBbXSwgc2NyaXB0czogU2NyaXB0cywgbm9uQlN0YWNrSW5mcmFBMTF5Q2hyb21lT3B0aW9uczoge30gfSkge1xuICAgICAgICBpZiAoZGF0YS5zY3JpcHRzKSB7XG4gICAgICAgICAgICB0aGlzLnBlcmZvcm1TY2FuID0gZGF0YS5zY3JpcHRzLnNjYW5cbiAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cyA9IGRhdGEuc2NyaXB0cy5nZXRSZXN1bHRzXG4gICAgICAgICAgICB0aGlzLmdldFJlc3VsdHNTdW1tYXJ5ID0gZGF0YS5zY3JpcHRzLmdldFJlc3VsdHNTdW1tYXJ5XG4gICAgICAgICAgICB0aGlzLnNhdmVUZXN0UmVzdWx0cyA9IGRhdGEuc2NyaXB0cy5zYXZlUmVzdWx0c1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmNvbW1hbmRzICYmIGRhdGEuY29tbWFuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1hbmRzVG9XcmFwID0gZGF0YS5jb21tYW5kc1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLm5vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnMpe1xuICAgICAgICAgICAgdGhpcy5DaHJvbWVFeHRlbnNpb24gPSBkYXRhLm5vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnNcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHVibGljIHN0b3JlKCkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5icm93c2Vyc3RhY2tGb2xkZXJQYXRoKSl7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5icm93c2Vyc3RhY2tGb2xkZXJQYXRoKVxuICAgICAgICB9XG5cbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmNvbW1hbmRzUGF0aCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgY29tbWFuZHM6IHRoaXMuY29tbWFuZHNUb1dyYXAsXG4gICAgICAgICAgICBzY3JpcHRzOiB7XG4gICAgICAgICAgICAgICAgc2NhbjogdGhpcy5wZXJmb3JtU2NhbixcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzOiB0aGlzLmdldFJlc3VsdHMsXG4gICAgICAgICAgICAgICAgZ2V0UmVzdWx0c1N1bW1hcnk6IHRoaXMuZ2V0UmVzdWx0c1N1bW1hcnksXG4gICAgICAgICAgICAgICAgc2F2ZVJlc3VsdHM6IHRoaXMuc2F2ZVRlc3RSZXN1bHRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnM6IHRoaXMuQ2hyb21lRXh0ZW5zaW9uLFxuICAgICAgICB9KSlcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFjY2Vzc2liaWxpdHlTY3JpcHRzLmNoZWNrQW5kR2V0SW5zdGFuY2UoKVxuZXhwb3J0IHsgQ29tbWFuZCB9XG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5cbmltcG9ydCB0eXBlIHsgVGVzdERhdGEsIFVwbG9hZFR5cGUgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGJhdGNoQW5kUG9zdEV2ZW50cyB9IGZyb20gJy4uL3V0aWwuanMnXG5pbXBvcnQgeyBEQVRBX0JBVENIX0VORFBPSU5UIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuXG4vKipcbiAqIENyYXNoLXJlc2lsaWVudCBqb3VybmFsIG9mIHRlc3QgcnVucyB0aGF0IGhhdmUgc2VudCBUZXN0UnVuU3RhcnRlZCBidXQgbm90IHlldFxuICogVGVzdFJ1bkZpbmlzaGVkLiBFYWNoIG9wZW4gcnVuIGlzIHBlcnNpc3RlZCBhcyBhIHNtYWxsIGZpbGUgc28gdGhhdCBpZiB0aGUgd29ya2VyXG4gKiAob3IgdGhlIHdob2xlIHdkaW8gcHJvY2VzcyB0cmVlKSBpcyBraWxsZWQgbWlkLXRlc3QsIHRoZSBsYXVuY2hlcidzIHNodXRkb3duIHBhdGhcbiAqIG9yIHRoZSBkZXRhY2hlZCBleGl0IGNsZWFudXAgY2FuIHN0aWxsIHNlbmQgYSBzeW50aGV0aWMgVGVzdFJ1bkZpbmlzaGVkIFx1MjAxNCBvdGhlcndpc2VcbiAqIHRoZSB0ZXN0IGNhc2Ugc3RheXMgXCJpbiBwcm9ncmVzc1wiIG9uIHRoZSBUZXN0IFJlcG9ydGluZyAmIEFuYWx5dGljcyBkYXNoYm9hcmQgZm9yZXZlci5cbiAqL1xuXG5jb25zdCBPUEVOX1JVTlNfRElSID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdsb2dzJywgJ2JzdGFja19vcGVuX3J1bnMnKVxuXG5leHBvcnQgY29uc3QgT1JQSEFOX0ZBSUxVUkVfUkVBU09OID0gJ1Rlc3QgcnVuIGRpZCBub3QgY29tcGxldGU6IHRoZSBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBvciB0ZXJtaW5hdGVkIGJlZm9yZSB0aGUgdGVzdCBmaW5pc2hlZCAoZmluYWxpemVkIGJ5IEJyb3dzZXJTdGFjayBTREsgZXhpdCBjbGVhbnVwKSdcblxuZnVuY3Rpb24gb3BlblJ1bkZpbGVQYXRoKHV1aWQ6IHN0cmluZykge1xuICAgIHJldHVybiBwYXRoLmpvaW4oT1BFTl9SVU5TX0RJUiwgYG9wZW4tcnVuLSR7dXVpZH0uanNvbmApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRPcGVuUnVuKHRlc3REYXRhOiBUZXN0RGF0YSkge1xuICAgIGlmICghdGVzdERhdGEgfHwgIXRlc3REYXRhLnV1aWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGZzLm1rZGlyU3luYyhPUEVOX1JVTlNfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG9wZW5SdW5GaWxlUGF0aCh0ZXN0RGF0YS51dWlkKSwgSlNPTi5zdHJpbmdpZnkodGVzdERhdGEpKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdvcGVuUnVuc0pvdXJuYWw6IGZhaWxlZCB0byByZWNvcmQgb3BlbiBydW46ICcgKyBlKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyT3BlblJ1bih1dWlkPzogc3RyaW5nKSB7XG4gICAgaWYgKCF1dWlkKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBmcy5ybVN5bmMob3BlblJ1bkZpbGVQYXRoKHV1aWQpLCB7IGZvcmNlOiB0cnVlIH0pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ29wZW5SdW5zSm91cm5hbDogZmFpbGVkIHRvIGNsZWFyIG9wZW4gcnVuOiAnICsgZSlcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0T3JwaGFuZWRSdW5zKCk6IFRlc3REYXRhW10ge1xuICAgIGNvbnN0IG9ycGhhbnM6IFRlc3REYXRhW10gPSBbXVxuICAgIHRyeSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhPUEVOX1JVTlNfRElSKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9ycGhhbnNcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoT1BFTl9SVU5TX0RJUikpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgb3JwaGFucy5wdXNoKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihPUEVOX1JVTlNfRElSLCBmaWxlKSwgJ3V0ZjgnKSkpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBvcGVuUnVuc0pvdXJuYWw6IHNraXBwaW5nIHVucmVhZGFibGUgam91cm5hbCBmaWxlICR7ZmlsZX06ICR7ZX1gKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhPUEVOX1JVTlNfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1Zygnb3BlblJ1bnNKb3VybmFsOiBmYWlsZWQgdG8gY29sbGVjdCBvcnBoYW5lZCBydW5zOiAnICsgZSlcbiAgICB9XG4gICAgcmV0dXJuIG9ycGhhbnNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmFsaXplT3JwaGFuZWRSdW5zKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3JwaGFucyA9IGNvbGxlY3RPcnBoYW5lZFJ1bnMoKVxuICAgICAgICBpZiAoIW9ycGhhbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgY29uc3QgZXZlbnRzOiBVcGxvYWRUeXBlW10gPSBvcnBoYW5zLm1hcCgodGVzdERhdGEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRBdE1zID0gdGVzdERhdGEuc3RhcnRlZF9hdCA/IG5ldyBEYXRlKHRlc3REYXRhLnN0YXJ0ZWRfYXQpLmdldFRpbWUoKSA6IE5hTlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBldmVudF90eXBlOiAnVGVzdFJ1bkZpbmlzaGVkJyxcbiAgICAgICAgICAgICAgICB0ZXN0X3J1bjoge1xuICAgICAgICAgICAgICAgICAgICAuLi50ZXN0RGF0YSxcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRfYXQ6IGZpbmlzaGVkQXQsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX2luX21zOiBOdW1iZXIuaXNOYU4oc3RhcnRlZEF0TXMpID8gdW5kZWZpbmVkIDogTWF0aC5tYXgoMCwgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdE1zKSxcbiAgICAgICAgICAgICAgICAgICAgZmFpbHVyZTogW3sgYmFja3RyYWNlOiBbT1JQSEFOX0ZBSUxVUkVfUkVBU09OXSB9XSxcbiAgICAgICAgICAgICAgICAgICAgZmFpbHVyZV9yZWFzb246IE9SUEhBTl9GQUlMVVJFX1JFQVNPTixcbiAgICAgICAgICAgICAgICAgICAgZmFpbHVyZV90eXBlOiAnVW5oYW5kbGVkRXJyb3InXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBhd2FpdCBiYXRjaEFuZFBvc3RFdmVudHMoREFUQV9CQVRDSF9FTkRQT0lOVCwgJ09SUEhBTkVEX1RFU1RfUlVOX0ZJTkFMSVpBVElPTicsIGV2ZW50cylcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oYEZpbmFsaXplZCAke2V2ZW50cy5sZW5ndGh9IG9ycGhhbmVkIHRlc3QgcnVuKHMpIGxlZnQgYmVoaW5kIGJ5IGFuIGludGVycnVwdGVkIHJ1bmApXG4gICAgICAgIHJldHVybiBldmVudHMubGVuZ3RoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ29wZW5SdW5zSm91cm5hbDogZmFpbGVkIHRvIGZpbmFsaXplIG9ycGhhbmVkIHJ1bnM6ICcgKyBlKVxuICAgICAgICByZXR1cm4gMFxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRFcnJvclN0cmluZywgc3RvcEJ1aWxkVXBzdHJlYW0sIHVwbG9hZExvZ3MgfSBmcm9tICcuL3V0aWwuanMnXG5pbXBvcnQgeyBmaW5hbGl6ZU9ycGhhbmVkUnVucyB9IGZyb20gJy4vdGVzdE9wcy9vcGVuUnVuc0pvdXJuYWwuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHV0aWwgZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHsgZmlyZUZ1bm5lbFJlcXVlc3QgfSBmcm9tICcuL2luc3RydW1lbnRhdGlvbi9mdW5uZWxJbnN0cnVtZW50YXRpb24uanMnXG5pbXBvcnQgeyBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsIEJST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgdHlwZSB7IEZ1bm5lbERhdGEgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IFBlcmZvcm1hbmNlVGVzdGVyIGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL3BlcmZvcm1hbmNlLXRlc3Rlci5qcydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQlN0YWNrQ2xlYW51cCB7XG4gICAgc3RhdGljIGFzeW5jIHN0YXJ0Q2xlYW51cCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEdldCBmdW5uZWwgZGF0YSBvYmplY3QgZnJvbSBzYXZlZCBmaWxlXG4gICAgICAgICAgICBjb25zdCBmdW5uZWxEYXRhQ2xlYW51cCA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1mdW5uZWxEYXRhJylcbiAgICAgICAgICAgIGxldCBmdW5uZWxEYXRhOiBGdW5uZWxEYXRhIHwgbnVsbCA9IG51bGxcbiAgICAgICAgICAgIGlmIChmdW5uZWxEYXRhQ2xlYW51cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcHJvY2Vzcy5hcmd2LmluZGV4T2YoJy0tZnVubmVsRGF0YScpXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmFyZ3ZbaW5kZXggKyAxXVxuICAgICAgICAgICAgICAgIGZ1bm5lbERhdGEgPSBCU3RhY2tDbGVhbnVwLmdldEZ1bm5lbERhdGFGcm9tRmlsZShmaWxlUGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNuYXBzaG90IGJlZm9yZSBzZW5kRnVubmVsRGF0YSBcdTIwMTQgZmlyZUZ1bm5lbFJlcXVlc3QgcmVkYWN0cyB0aGVcbiAgICAgICAgICAgIC8vIGNyZWRlbnRpYWxzIGluIHBsYWNlLlxuICAgICAgICAgICAgY29uc3QgZnVubmVsVXNlciA9IGZ1bm5lbERhdGE/LnVzZXJOYW1lXG4gICAgICAgICAgICBjb25zdCBmdW5uZWxLZXkgPSBmdW5uZWxEYXRhPy5hY2Nlc3NLZXlcblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1vYnNlcnZhYmlsaXR5JykgJiYgZnVubmVsRGF0YSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZU9ic2VydmFiaWxpdHlDbGVhbnVwKGZ1bm5lbERhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmdW5uZWxEYXRhQ2xlYW51cCAmJiBmdW5uZWxEYXRhKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kRnVubmVsRGF0YShmdW5uZWxEYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZXNjdWUgdGhlIFNESy1sb2cgdXBsb2FkIGZvciBydW5zIHdob3NlIGxhdW5jaGVyIG5ldmVyIHJlYWNoZWRcbiAgICAgICAgICAgIC8vIG9uQ29tcGxldGUgKHNpZ25hbCB0ZXJtaW5hdGlvbikgXHUyMDE0IGFmdGVyIGV2ZW50cywgYmVmb3JlIGV4aXQuXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXVwbG9hZExvZ3MnKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUxvZ3NVcGxvYWQoZnVubmVsVXNlciwgZnVubmVsS2V5KVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZXJyIGFzIHN0cmluZ1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGVycm9yKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tcGVyZm9ybWFuY2VEYXRhJykpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBQZXJmb3JtYW5jZVRlc3Rlci51cGxvYWRFdmVudHNEYXRhKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3IgaW4gc2VuZGluZyBldmVudHMgZGF0YSAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGV4ZWN1dGVMb2dzVXBsb2FkKGZ1bm5lbFVzZXI/OiBzdHJpbmcsIGZ1bm5lbEtleT86IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwcm9jZXNzLmFyZ3YuaW5kZXhPZignLS11cGxvYWRMb2dzJylcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudEJ1aWxkVXVpZCA9IHByb2Nlc3MuYXJndltpbmRleCArIDFdXG4gICAgICAgICAgICBjb25zdCB1c2VyID0gZnVubmVsVXNlciB8fCBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVVNFUk5BTUVcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGZ1bm5lbEtleSB8fCBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQUNDRVNTX0tFWVxuICAgICAgICAgICAgaWYgKCFjbGllbnRCdWlsZFV1aWQgfHwgIXVzZXIgfHwgIWtleSkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgbG9ncyB1cGxvYWQgaW4gY2xlYW51cDogbWlzc2luZyB1dWlkIG9yIGNyZWRlbnRpYWxzJylcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgVXBsb2FkaW5nIFNESyBsb2dzIGZyb20gY2xlYW51cCBmb3IgJHtjbGllbnRCdWlsZFV1aWR9YClcbiAgICAgICAgICAgIGF3YWl0IHVwbG9hZExvZ3ModXNlciwga2V5LCBjbGllbnRCdWlsZFV1aWQpXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignRXJyb3IgdXBsb2FkaW5nIFNESyBsb2dzIGluIGNsZWFudXA6ICcgKyBnZXRFcnJvclN0cmluZyhlKSlcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZXhlY3V0ZU9ic2VydmFiaWxpdHlDbGVhbnVwKGZ1bm5lbERhdGE6IEZ1bm5lbERhdGEpIHtcbiAgICAgICAgaWYgKCFwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1RdKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0V4ZWN1dGluZyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGNsZWFudXAnKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gU0RLLTQ2NzE6IGZpbmFsaXplIGFueSB0ZXN0IHJ1bnMgb3JwaGFuZWQgYnkgdGhlIGludGVycnVwdGVkIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgYnVpbGQgaXRzZWxmIGlzIHN0b3BwZWQuXG4gICAgICAgICAgICBhd2FpdCBmaW5hbGl6ZU9ycGhhbmVkUnVucygpXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9wQnVpbGRVcHN0cmVhbSgpXG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSkgJiYgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF0pIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhgXFxuVmlzaXQgaHR0cHM6Ly9hdXRvbWF0aW9uLmJyb3dzZXJzdGFjay5jb20vYnVpbGRzLyR7cHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF19IHRvIHZpZXcgYnVpbGQgcmVwb3J0LCBpbnNpZ2h0cywgYW5kIG1hbnkgbW9yZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYWxsIGF0IG9uZSBwbGFjZSFcXG5gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gKHJlc3VsdCAmJiByZXN1bHQuc3RhdHVzKSB8fCAnZmFpbGVkJ1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IChyZXN1bHQgJiYgcmVzdWx0Lm1lc3NhZ2UpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU8xMXlTdG9wRGF0YShmdW5uZWxEYXRhLCBzdGF0dXMsIHN0YXR1cyA9PT0gJ2ZhaWxlZCcgPyBtZXNzYWdlIDogdW5kZWZpbmVkKVxuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0Vycm9yIGluIHN0b3BwaW5nIFRlc3QgUmVwb3J0aW5nIGFuZCBBbmFseXRpY3MgYnVpbGQ6ICcgKyBlKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVPMTF5U3RvcERhdGEoZnVubmVsRGF0YSwgJ2ZhaWxlZCcsIGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgdXBkYXRlTzExeVN0b3BEYXRhKGZ1bm5lbERhdGE6IEZ1bm5lbERhdGEsIHN0YXR1czogc3RyaW5nLCBlcnJvcjogdW5rbm93biA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB0b0RhdGEgPSBmdW5uZWxEYXRhPy5ldmVudF9wcm9wZXJ0aWVzPy5wcm9kdWN0VXNhZ2U/LnRlc3RPYnNlcnZhYmlsaXR5XG4gICAgICAgIC8vIFJldHVybiBpZiBubyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGRhdGEgaW4gZnVubmVsIGRhdGFcbiAgICAgICAgaWYgKCF0b0RhdGEpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGxldCBleGlzdGluZ1N0b3BEYXRhID0gdG9EYXRhLmV2ZW50cy5idWlsZEV2ZW50cy5maW5pc2hlZFxuICAgICAgICBleGlzdGluZ1N0b3BEYXRhID0gZXhpc3RpbmdTdG9wRGF0YSB8fCB7fVxuXG4gICAgICAgIGV4aXN0aW5nU3RvcERhdGEgPSB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ1N0b3BEYXRhLFxuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgZXJyb3I6IGdldEVycm9yU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgIHN0b3BwZWRGcm9tOiAnZXhpdEhvb2snXG4gICAgICAgIH1cbiAgICAgICAgdG9EYXRhLmV2ZW50cy5idWlsZEV2ZW50cy5maW5pc2hlZCA9IGV4aXN0aW5nU3RvcERhdGFcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgc2VuZEZ1bm5lbERhdGEoZnVubmVsRGF0YTogRnVubmVsRGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZmlyZUZ1bm5lbFJlcXVlc3QoZnVubmVsRGF0YSlcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRnVubmVsIGRhdGEgc2VudCBzdWNjZXNzZnVsbHkgZnJvbSBjbGVhbnVwJylcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdFcnJvciBpbiBzZW5kaW5nIGZ1bm5lbCBkYXRhOiAnICsgZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRGdW5uZWxEYXRhRnJvbUZpbGUoZmlsZVBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGNvbnRlbnQpXG4gICAgICAgIHRoaXMucmVtb3ZlRnVubmVsRGF0YUZpbGUoZmlsZVBhdGgpXG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgc3RhdGljIHJlbW92ZUZ1bm5lbERhdGFGaWxlKGZpbGVQYXRoPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxuICAgIH1cbn1cblxudm9pZCBCU3RhY2tDbGVhbnVwLnN0YXJ0Q2xlYW51cCgpXG4iLCAiaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnXG5pbXBvcnQgdXRpbCwgeyBmb3JtYXQgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBVc2FnZVN0YXRzLCB7IHR5cGUgVXNhZ2VTdGF0IH0gZnJvbSAnLi4vdGVzdE9wcy91c2FnZVN0YXRzLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHR5cGUgQnJvd3NlclN0YWNrQ29uZmlnIGZyb20gJy4uL2NvbmZpZy5qcydcbmltcG9ydCB7IEJTVEFDS19TRVJWSUNFX1ZFUlNJT04sIFdESU9fTkFNSU5HX1BSRUZJWCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IGdldERhdGFGcm9tV29ya2VycyB9IGZyb20gJy4uL2RhdGEtc3RvcmUuanMnXG5pbXBvcnQgeyBnZXRQcm9kdWN0TWFwIH0gZnJvbSAnLi4vdGVzdEh1Yi91dGlscy5qcydcbmltcG9ydCBmZXRjaFdyYXAgZnJvbSAnLi4vZmV0Y2hXcmFwcGVyLmpzJ1xuaW1wb3J0IHR5cGUgeyBCcm93c2Vyc3RhY2tIZWFsaW5nIH0gZnJvbSAnQGJyb3dzZXJzdGFjay9haS1zZGstbm9kZSdcbmltcG9ydCB0eXBlIHsgRnVubmVsRGF0YSwgRXZlbnRQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgVGVzdE9wc0NvbmZpZyBmcm9tICcuLi90ZXN0T3BzL3Rlc3RPcHNDb25maWcuanMnXG5pbXBvcnQgQVBJVXRpbHMgZnJvbSAnLi4vY2xpL2FwaVV0aWxzLmpzJ1xuaW1wb3J0IFBlcmZvcm1hbmNlVGVzdGVyIGZyb20gJy4vcGVyZm9ybWFuY2UvcGVyZm9ybWFuY2UtdGVzdGVyLmpzJ1xuaW1wb3J0IHsgRVZFTlRTIH0gZnJvbSAnLi9wZXJmb3JtYW5jZS9jb25zdGFudHMuanMnXG5cbmFzeW5jIGZ1bmN0aW9uIGZpcmVGdW5uZWxUZXN0RXZlbnQoZXZlbnRUeXBlOiBzdHJpbmcsIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc0NMSUVuYWJsZWQgPSBmYWxzZSkge1xuICAgIGlmICghY29uZmlnLnVzZXJOYW1lIHx8ICFjb25maWcuYWNjZXNzS2V5KSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygndXNlcm5hbWUvYWNjZXNza2V5IG5vdCBwYXNzZWQnKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gYnVpbGRFdmVudERhdGEoZXZlbnRUeXBlLCBjb25maWcsIGlzQ0xJRW5hYmxlZClcbiAgICAgICAgYXdhaXQgZmlyZUZ1bm5lbFJlcXVlc3QoZGF0YSlcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdGdW5uZWwgZXZlbnQgc3VjY2VzcycpXG4gICAgICAgIC8vIE9ubHkgdGhlIGZpbmlzaCBldmVudCBkaXNhcm1zIHRoZSBleGl0LXRpbWUgY2xlYW51cCByZXNlbmQgXHUyMDE0IG1hcmtpbmcgaXRcbiAgICAgICAgLy8gb24gU0RLVGVzdEF0dGVtcHRlZCBsZWZ0IGtpbGxlZCBydW5zIHdpdGggbm8gU0RLVGVzdFN1Y2Nlc3NmdWwgYXQgYWxsLlxuICAgICAgICBpZiAoZXZlbnRUeXBlID09PSAnU0RLVGVzdFN1Y2Nlc3NmdWwnKSB7XG4gICAgICAgICAgICBjb25maWcuc2VudEZ1bm5lbERhdGEoKVxuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFeGNlcHRpb24gaW4gc2VuZGluZyBmdW5uZWwgZGF0YTogJHtmb3JtYXQoZXJyb3IpfWApXG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZFN0YXJ0KGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSB7XG5cbiAgICAvLyBUcmFjayBmdW5uZWwgdGVzdCBhdHRlbXB0ZWQgZXZlbnRcbiAgICBQZXJmb3JtYW5jZVRlc3Rlci5zdGFydChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX0FUVEVNUFRFRClcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0QXR0ZW1wdGVkJywgY29uZmlnKVxuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9BVFRFTVBURUQsIHRydWUpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfQVRURU1QVEVELCBmYWxzZSwgZXJyb3IpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZEZpbmlzaChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNDTElFbmFibGVkID0gZmFsc2UpIHtcbiAgICAvLyBUcmFjayBmdW5uZWwgdGVzdCBzdWNjZXNzZnVsIGV2ZW50XG4gICAgUGVyZm9ybWFuY2VUZXN0ZXIuc3RhcnQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9TVUNDRVNTRlVMKVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RTdWNjZXNzZnVsJywgY29uZmlnLCBpc0NMSUVuYWJsZWQpXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX1NVQ0NFU1NGVUwsIHRydWUpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfU1VDQ0VTU0ZVTCwgZmFsc2UsIGVycm9yKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVGdW5uZWxEYXRhKGV2ZW50VHlwZTogc3RyaW5nLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNDTElFbmFibGVkID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSBidWlsZEV2ZW50RGF0YShldmVudFR5cGUsIGNvbmZpZywgaXNDTElFbmFibGVkKVxuXG4gICAgQlN0YWNrTG9nZ2VyLmVuc3VyZUxvZ3NGb2xkZXIoKVxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKEJTdGFja0xvZ2dlci5sb2dGb2xkZXJQYXRoLCAnZnVubmVsRGF0YS5qc29uJylcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICByZXR1cm4gZmlsZVBhdGhcbn1cblxuZnVuY3Rpb24gcmVkYWN0Q3JlZGVudGlhbHNGcm9tRnVubmVsRGF0YShkYXRhOiBGdW5uZWxEYXRhKSB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEudXNlck5hbWUpIHtcbiAgICAgICAgICAgIGRhdGEudXNlck5hbWUgPSAnW1JFREFDVEVEXSdcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5hY2Nlc3NLZXkpIHtcbiAgICAgICAgICAgIGRhdGEuYWNjZXNzS2V5ID0gJ1tSRURBQ1RFRF0nXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbn1cblxuLy8gQ2FsbGVkIGZyb20gdHdvIGRpZmZlcmVudCBwcm9jZXNzXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlyZUZ1bm5lbFJlcXVlc3QoZGF0YTogRnVubmVsRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgdXNlck5hbWUsIGFjY2Vzc0tleSB9ID0gZGF0YVxuICAgIHJlZGFjdENyZWRlbnRpYWxzRnJvbUZ1bm5lbERhdGEoZGF0YSlcblxuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnU2VuZGluZyBTREsgZXZlbnQgd2l0aCBkYXRhICcgKyB1dGlsLmluc3BlY3QoZGF0YSwgeyBkZXB0aDogNiB9KSlcblxuICAgIGNvbnN0IGVuY29kZWRBdXRoID0gQnVmZmVyLmZyb20oYCR7dXNlck5hbWV9OiR7YWNjZXNzS2V5fWAsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdyYXAoQVBJVXRpbHMuRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtlbmNvZGVkQXV0aH1gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKVxuICAgIH0pXG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdGdW5uZWwgRXZlbnQgUmVzcG9uc2U6ICcgKyBKU09OLnN0cmluZ2lmeShhd2FpdCByZXNwb25zZS50ZXh0KCkpKVxufVxuXG5mdW5jdGlvbiBnZXRQcm9kdWN0TGlzdChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZykge1xuICAgIGNvbnN0IHByb2R1Y3RzOiBzdHJpbmdbXSA9IFtdXG4gICAgaWYgKGNvbmZpZy50ZXN0T2JzZXJ2YWJpbGl0eS5lbmFibGVkKSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ29ic2VydmFiaWxpdHknKVxuICAgIH1cblxuICAgIGlmIChjb25maWcuYWNjZXNzaWJpbGl0eSkge1xuICAgICAgICBwcm9kdWN0cy5wdXNoKCdhY2Nlc3NpYmlsaXR5JylcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnBlcmN5KSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ3BlcmN5JylcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmF1dG9tYXRlKSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ2F1dG9tYXRlJylcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmFwcEF1dG9tYXRlKSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ2FwcC1hdXRvbWF0ZScpXG4gICAgfVxuICAgIHJldHVybiBwcm9kdWN0c1xufVxuXG5mdW5jdGlvbiBidWlsZEV2ZW50RGF0YShldmVudFR5cGU6IHN0cmluZywgY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzQ0xJRW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgY29uc3QgZXZlbnRQcm9wZXJ0aWVzOiBFdmVudFByb3BlcnRpZXMgPSB7XG4gICAgICAgIC8vIEZyYW1ld29yayBEZXRhaWxzXG4gICAgICAgIHNka1J1bklkOiBjb25maWc/LnNka1J1bklELFxuICAgICAgICB0ZXN0aHViX3V1aWQ6IFRlc3RPcHNDb25maWcuZ2V0SW5zdGFuY2UoKS5idWlsZEhhc2hlZElkLFxuICAgICAgICBsYW5ndWFnZV9mcmFtZXdvcms6IGdldExhbmd1YWdlRnJhbWV3b3JrKGNvbmZpZy5mcmFtZXdvcmspLFxuICAgICAgICByZWZlcnJlcjogZ2V0UmVmZXJyZXIoY29uZmlnLmZyYW1ld29yayksXG4gICAgICAgIGxhbmd1YWdlOiAnV2ViZHJpdmVySU8nLFxuICAgICAgICBsYW5ndWFnZVZlcnNpb246IHByb2Nlc3MudmVyc2lvbixcblxuICAgICAgICAvLyBCdWlsZCBEZXRhaWxzXG4gICAgICAgIGJ1aWxkTmFtZTogY29uZmlnLmJ1aWxkTmFtZSB8fCAndW5kZWZpbmVkJyxcbiAgICAgICAgYnVpbGRJZGVudGlmaWVyOiBTdHJpbmcoY29uZmlnLmJ1aWxkSWRlbnRpZmllciksXG5cbiAgICAgICAgLy8gSG9zdCBkZXRhaWxzXG4gICAgICAgIG9zOiBvcy50eXBlKCkgfHwgJ3Vua25vd24nLFxuICAgICAgICBob3N0bmFtZTogb3MuaG9zdG5hbWUoKSB8fCAndW5rbm93bicsXG5cbiAgICAgICAgLy8gUHJvZHVjdCBEZXRhaWxzXG4gICAgICAgIHByb2R1Y3RNYXA6IGdldFByb2R1Y3RNYXAoY29uZmlnKSxcbiAgICAgICAgcHJvZHVjdDogZ2V0UHJvZHVjdExpc3QoY29uZmlnKSxcblxuICAgICAgICAvLyBmcmFtZXdvcmsgZGV0YWlsc1xuICAgICAgICBmcmFtZXdvcms6IGNvbmZpZy5mcmFtZXdvcmssXG5cbiAgICAgICAgLy8gQ0xJIERldGFpbHNcbiAgICAgICAgaXNDTElFbmFibGVkOiBpc0NMSUVuYWJsZWRcbiAgICB9XG5cbiAgICBpZiAoZXZlbnRUeXBlID09PSAnU0RLVGVzdFN1Y2Nlc3NmdWwnKSB7XG4gICAgICAgIGNvbnN0IHdvcmtlckRhdGEgPSBnZXREYXRhRnJvbVdvcmtlcnMoKVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGV2ZW50UHJvcGVydGllcy5wcm9kdWN0VXNhZ2UgPSBnZXRQcm9kdWN0VXNhZ2Uod29ya2VyRGF0YSlcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1BPTExJTkdfVElNRU9VVCkge1xuICAgICAgICAgICAgZXZlbnRQcm9wZXJ0aWVzLnBvbGxpbmdUaW1lb3V0ID0gcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfUE9MTElOR19USU1FT1VUIGFzIHN0cmluZ1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGFueSB3b3JrZXIgY2FsbGVkIGJyb3dzZXIucmVsb2FkU2Vzc2lvbigpLCBtYXJrIHRoZSBidWlsZCBzbyB0aGVcbiAgICAgICAgLy8gc2Vzc2lvbi1saW5raW5nIGRhc2hib2FyZCBjYW4gZXhjbHVkZSBpdHMgKGV4cGVjdGVkKSByZWxvYWQtb3JwaGFuZWQgc2Vzc2lvbnMuXG4gICAgICAgIHR5cGUgV29ya2VyUmVjb3JkID0geyByZWxvYWRIYXBwZW5lZD86IGJvb2xlYW47IHVzYWdlU3RhdHM/OiB1bmtub3duIH1cbiAgICAgICAgY29uc3QgcmVsb2FkSGFwcGVuZWQgPSB3b3JrZXJEYXRhLnNvbWUoKHdvcmtlcikgPT4gKHdvcmtlciBhcyBXb3JrZXJSZWNvcmQpLnJlbG9hZEhhcHBlbmVkID09PSB0cnVlKVxuICAgICAgICBpZiAocmVsb2FkSGFwcGVuZWQpIHtcbiAgICAgICAgICAgIGV2ZW50UHJvcGVydGllcy5maW5pc2hlZE1ldGFkYXRhID0geyByZWFzb246ICdzZXNzaW9uX3JlbG9hZGVkJyB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBzaWduYWwtdGVybWluYXRlZCBydW4gbXVzdCBiZSBxdWVyeS1kZXRlY3RhYmxlIFx1MjAxNCBraWxsIHdpbnMgb3ZlclxuICAgICAgICAvLyByZWxvYWQgYXMgdGhlIGZpbmlzaCByZWFzb24uXG4gICAgICAgIGlmIChjb25maWcua2lsbFNpZ25hbCkge1xuICAgICAgICAgICAgZXZlbnRQcm9wZXJ0aWVzLmZpbmlzaGVkTWV0YWRhdGEgPSB7IHJlYXNvbjogJ3VzZXJfa2lsbGVkJywgc2lnbmFsOiBjb25maWcua2lsbFNpZ25hbCB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB1c2VyTmFtZTogY29uZmlnLnVzZXJOYW1lLFxuICAgICAgICBhY2Nlc3NLZXk6IGNvbmZpZy5hY2Nlc3NLZXksXG4gICAgICAgIGV2ZW50X3R5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgZGV0ZWN0ZWRGcmFtZXdvcms6IFdESU9fTkFNSU5HX1BSRUZJWCArIGNvbmZpZy5mcmFtZXdvcmssXG4gICAgICAgIGV2ZW50X3Byb3BlcnRpZXM6IGV2ZW50UHJvcGVydGllc1xuICAgIH0gYXMgdW5rbm93biBhcyBGdW5uZWxEYXRhXG5cbn1cblxuZnVuY3Rpb24gZ2V0UHJvZHVjdFVzYWdlKHdvcmtlcnNEYXRhOiB7IHVzYWdlU3RhdHM6IFVzYWdlU3RhdCB9W10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0ZXN0T2JzZXJ2YWJpbGl0eTogVXNhZ2VTdGF0cy5nZXRJbnN0YW5jZSgpLmdldEZvcm1hdHRlZERhdGEod29ya2Vyc0RhdGEpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRMYW5ndWFnZUZyYW1ld29yayhmcmFtZXdvcms/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gJ1dlYmRyaXZlcklPXycgKyBmcmFtZXdvcmtcbn1cblxuZnVuY3Rpb24gZ2V0UmVmZXJyZXIoZnJhbWV3b3JrPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZnVsbE5hbWUgPSBmcmFtZXdvcmsgPyBXRElPX05BTUlOR19QUkVGSVggKyBmcmFtZXdvcmsgOiAnV2ViZHJpdmVySU8nXG4gICAgcmV0dXJuIGAke2Z1bGxOYW1lfS8ke0JTVEFDS19TRVJWSUNFX1ZFUlNJT059YFxufVxuXG5jb25zdCBzZW5kRXZlbnQgPSB7XG4gICAgdGNnRG93bjogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNnRG93blJlc3BvbnNlJywgY29uZmlnKSxcbiAgICBpbnZhbGlkVGNnQXV0aDogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0SW52YWxpZFRjZ0F1dGhSZXNwb25zZVdpdGhVc2VySW1wYWN0JywgY29uZmlnKSxcbiAgICB0Y2dBdXRoRmFpbHVyZTogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNnQXV0aEZhaWx1cmUnLCBjb25maWcpLFxuICAgIHRjZ3RJbml0U3VjY2Vzc2Z1bDogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNndEluaXRTdWNjZXNzZnVsJywgY29uZmlnKSxcbiAgICBpbml0RmFpbGVkOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RJbml0RmFpbGVkUmVzcG9uc2UnLCBjb25maWcpLFxuICAgIHRjZ1Byb3h5RmFpbHVyZTogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNnUHJveHlGYWlsdXJlJywgY29uZmlnKSxcbn1cblxuZnVuY3Rpb24gaXNQcm94eUVycm9yKGF1dGhSZXN1bHQ6IHsgc3RhdHVzPzogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGF1dGhSZXN1bHQgYXMgQnJvd3NlcnN0YWNrSGVhbGluZy5Jbml0RXJyb3JSZXNwb25zZSk/LnN0YXR1cyA9PT0gNTAyXG59XG5cbmZ1bmN0aW9uIGhhbmRsZVByb3h5RXJyb3IoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgc2VuZEV2ZW50LnRjZ1Byb3h5RmFpbHVyZShjb25maWcpXG4gICAgaWYgKGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdQcm94eSBFcnJvci4gRGlzYWJsaW5nIEhlYWxpbmcgZm9yIHRoaXMgc2Vzc2lvbi4nKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlVXBncmFkZVJlcXVpcmVkKGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdQbGVhc2UgdXBncmFkZSBCcm93c2Vyc3RhY2sgU2VydmljZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gdG8gdXNlIHRoZSBzZWxmLWhlYWxpbmcgZmVhdHVyZS4nKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQXV0aGVudGljYXRpb25GYWlsdXJlKHN0YXR1czogbnVtYmVyLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgICAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdTb21ldGhpbmcgd2VudCB3cm9uZy4gRGlzYWJsaW5nIGhlYWxpbmcgZm9yIHRoaXMgc2Vzc2lvbi4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nKVxuICAgICAgICB9XG4gICAgICAgIHNlbmRFdmVudC50Y2dEb3duKGNvbmZpZylcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBdXRoZW50aWNhdGlvbiBGYWlsZWQuIERpc2FibGluZyBIZWFsaW5nIGZvciB0aGlzIHNlc3Npb24uJylcbiAgICAgICAgfVxuICAgICAgICBzZW5kRXZlbnQudGNnQXV0aEZhaWx1cmUoY29uZmlnKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQXV0aGVudGljYXRpb25TdWNjZXNzKFxuICAgIGlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyOiBib29sZWFuLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLFxuICAgIGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkXG4pIHtcbiAgICBpZiAoIWlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyICYmIGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdIZWFsaW5nIGlzIG5vdCBlbmFibGVkIGZvciB5b3VyIGdyb3VwLCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW4nKVxuICAgIH0gZWxzZSBpZiAodXNlcklkICYmIGlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyKSB7XG4gICAgICAgIHNlbmRFdmVudC50Y2d0SW5pdFN1Y2Nlc3NmdWwoY29uZmlnKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlSW5pdGlhbGl6YXRpb25GYWlsdXJlKHN0YXR1czogbnVtYmVyLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICBzZW5kRXZlbnQuaW5pdEZhaWxlZChjb25maWcpXG4gICAgfSBlbHNlIGlmICghc3RhdHVzICYmIGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIHNlbmRFdmVudC5pbnZhbGlkVGNnQXV0aChjb25maWcpXG4gICAgfVxuXG4gICAgaWYgKGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBdXRoZW50aWNhdGlvbiBGYWlsZWQuIEhlYWxpbmcgd2lsbCBiZSBkaXNhYmxlZCBmb3IgdGhpcyBzZXNzaW9uLicpXG4gICAgfVxufVxuXG5pbnRlcmZhY2UgQXV0aFJlc3VsdCB7XG4gICAgbWVzc2FnZTogc3RyaW5nXG4gICAgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuXG4gICAgc3RhdHVzOiBudW1iZXJcbiAgICB1c2VySWQ6IHN0cmluZ1xuICAgIGdyb3VwSWQ6IHN0cmluZ1xuICAgIGlzSGVhbGluZ0VuYWJsZWQ6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUhlYWxpbmdJbnN0cnVtZW50YXRpb24oXG4gICAgYXV0aFJlc3VsdDogQXV0aFJlc3VsdCxcbiAgICBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZyxcbiAgICBpc1NlbGZIZWFsRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbikge1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChpc1Byb3h5RXJyb3IoYXV0aFJlc3VsdCkpIHtcbiAgICAgICAgICAgIGhhbmRsZVByb3h5RXJyb3IoY29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBpc0F1dGhlbnRpY2F0ZWQsIHN0YXR1cywgdXNlcklkLCBncm91cElkLCBpc0hlYWxpbmdFbmFibGVkOiBpc0hlYWxpbmdFbmFibGVkRm9yVXNlciB9ID0gYXV0aFJlc3VsdFxuXG4gICAgICAgIGlmIChtZXNzYWdlID09PSAnVXBncmFkZSByZXF1aXJlZCcpIHtcbiAgICAgICAgICAgIGhhbmRsZVVwZ3JhZGVSZXF1aXJlZChpc1NlbGZIZWFsRW5hYmxlZClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uRmFpbHVyZShzdGF0dXMsIGNvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0F1dGhlbnRpY2F0ZWQgJiYgdXNlcklkICYmIGdyb3VwSWQpIHtcbiAgICAgICAgICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uU3VjY2Vzcyhpc0hlYWxpbmdFbmFibGVkRm9yVXNlciwgdXNlcklkLCBjb25maWcsIGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdHVzID49IDQwMCB8fCAhc3RhdHVzKSB7XG4gICAgICAgICAgICBoYW5kbGVJbml0aWFsaXphdGlvbkZhaWx1cmUoc3RhdHVzLCBjb25maWcsIGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0Vycm9yIGluIGhhbmRsaW5nIGhlYWxpbmcgaW5zdHJ1bWVudGF0aW9uOiAnICsgZXJyKVxuICAgIH1cbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcblxuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi9ic3RhY2tMb2dnZXIuanMnXG5cbmNvbnN0IHdvcmtlcnNEYXRhRGlyUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycsICd3b3JrZXJfZGF0YScpXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhRnJvbVdvcmtlcnMoKXtcbiAgICBjb25zdCB3b3JrZXJzRGF0YTogUmVjb3JkPHN0cmluZywgb2JqZWN0PltdID0gW11cblxuICAgIGlmICghZnMuZXhpc3RzU3luYyh3b3JrZXJzRGF0YURpclBhdGgpKSB7XG4gICAgICAgIHJldHVybiB3b3JrZXJzRGF0YVxuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMod29ya2Vyc0RhdGFEaXJQYXRoKVxuICAgIGZpbGVzLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdSZWFkaW5nIHdvcmtlciBmaWxlICcgKyBmaWxlKVxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZXJzRGF0YURpclBhdGgsIGZpbGUpXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpXG4gICAgICAgIGNvbnN0IHdvcmtlckRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgICB3b3JrZXJzRGF0YS5wdXNoKHdvcmtlckRhdGEpXG4gICAgfSlcblxuICAgIC8vIFJlbW92ZSB3b3JrZXIgZGF0YSBhZnRlciBhbGwgcmVhZGluZ1xuICAgIHJlbW92ZVdvcmtlcnNEYXRhRGlyKClcblxuICAgIHJldHVybiB3b3JrZXJzRGF0YVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZVdvcmtlckRhdGEoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZXJzRGF0YURpclBhdGgsICd3b3JrZXItZGF0YS0nICsgcHJvY2Vzcy5waWQgKyAnLmpzb24nKVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY3JlYXRlV29ya2Vyc0RhdGFEaXIoKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRXhjZXB0aW9uIGluIHNhdmluZyB3b3JrZXIgZGF0YTogJyArIGUpXG4gICAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVXb3JrZXJzRGF0YURpcigpOiBib29sZWFuIHtcbiAgICBmcy5ybVN5bmMod29ya2Vyc0RhdGFEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVXb3JrZXJzRGF0YURpcigpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMod29ya2Vyc0RhdGFEaXJQYXRoKSkge1xuICAgICAgICBmcy5ta2RpclN5bmMod29ya2Vyc0RhdGFEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMsWUFBQUEsV0FBVSxZQUFBQyxXQUFVLFFBQUFDLE9BQU0sV0FBQUMsVUFBUyxRQUFBQyxPQUFNLGNBQWM7QUFDaEUsT0FBTyxZQUFZO0FBQ25CLE9BQU9DLFNBQVE7QUFDZixPQUFPLFVBQVU7QUFDakIsU0FBUyxRQUFRLGFBQUFDLGtCQUFpQjtBQUNsQyxPQUFPQyxXQUFVO0FBQ2pCLE9BQU9DLFdBQVU7QUFNakIsT0FBTyxpQkFBaUI7QUFDeEIsT0FBTyxlQUFlO0FBRXRCLFNBQVMsZUFBQUMsb0JBQW1COzs7QUNmNUIsT0FBTyxlQUFlO0FBRXRCLElBQU0sYUFBYTtBQUFBLEVBQ2YsTUFBTTtBQUFBLEVBQVEsT0FBTztBQUFBLEVBQVMsT0FBTztBQUFBLEVBQVMsT0FBTztBQUFBLEVBQVMsTUFBTTtBQUN4RTtBQUVBLElBQU0sYUFBTixjQUF5QixVQUFVO0FBQUEsRUFDL0IsZUFBZSxDQUFDLFFBQVEsV0FBVyxNQUFNLFVBQVUsQ0FBQyxFQUFFLE1BQW1CO0FBQ3JFLElBQUMsUUFBUSxLQUFrQixhQUFhLFFBQVEsR0FBRyxJQUFJO0FBQUEsTUFDbkQsWUFBVyxvQkFBSSxLQUFLLEdBQUUsWUFBWTtBQUFBLE1BQ2xDLE9BQU8sTUFBTSxZQUFZO0FBQUEsTUFDekIsU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUM7QUFBQSxNQUMvQixNQUFNO0FBQUEsTUFDTixlQUFlLENBQUM7QUFBQSxJQUNwQixDQUFDO0FBQUEsRUFDTDtBQUFBO0FBQUEsRUFHQSxRQUFRLElBQUksWUFBdUI7QUFDL0IsU0FB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QUEsSUFDSjtBQUNBLElBQUFBLEtBQUcsT0FBTyxVQUFVLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFBQSxFQUN2QztBQUNKO0FBRUEsS0FBSyxjQUFjLGFBQWE7IiwKICAibmFtZXMiOiBbImhvc3RuYW1lIiwgInBsYXRmb3JtIiwgInR5cGUiLCAidmVyc2lvbiIsICJhcmNoIiwgImZzIiwgInByb21pc2lmeSIsICJwYXRoIiwgInV0aWwiLCAicGVyZm9ybWFuY2UiLCAiZnMiLCAidXRpbCIsICJwYXRoIiwgImFyY2giLCAicGxhdGZvcm0iLCAiZnMiLCAicGF0aCIsICJwYXRoIiwgImZzIiwgImNoYWxrIiwgImxvZ2dlciIsICJsb2ciLCAibG9nZ2VyIiwgIkJTdGFja0xvZ2dlciIsICJwYXRoIiwgImZzIiwgImNoYWxrIiwgInBsYXRmb3JtIiwgIkJTdGFja0xvZ2dlciIsICJmcyIsICJ2ZXJzaW9uIiwgInBhdGgiLCAicHJvY2VzcyIsICJvcGVuUmVhZFN0cmVhbVByb21pc2UiLCAicGF0aCIsICJmcyIsICJ1dGlsIiwgInR5cGUiLCAicGxhdGZvcm0iLCAiYXJjaCIsICJmcyIsICJmcyIsICJncm91cCIsICJwYXRoIiwgImZzIiwgInByb21pc2lmeSIsICJ1dGlsIiwgInBlcmZvcm1hbmNlIiwgImxhdW5jaFRlc3RTZXNzaW9uIiwgImhvc3RuYW1lIiwgInBsYXRmb3JtIiwgInR5cGUiLCAidmVyc2lvbiIsICJhcmNoIiwgInV0aWwiLCAic3RvcEJ1aWxkVXBzdHJlYW0iLCAicGF0aCIsICJwYXRoIiwgImZzIiwgImdldFBsYXRmb3JtVmVyc2lvbiIsICJnZXRSZXNvbHZlZERldmljZU5hbWUiLCAicGF0aCIsICJoYXNoIiwgImZzIiwgInBhdGgiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAiZnMiLCAidXRpbCIsICJvcyIsICJ1dGlsIiwgImZvcm1hdCIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJ1dGlsIiwgInV0aWwiLCAiZnMiXQp9Cg==