schema-shield 0.0.3 → 0.0.4
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/README.md +68 -45
- package/dist/formats.d.ts +1 -1
- package/dist/formats.d.ts.map +1 -1
- package/dist/index.d.ts +10 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +197 -176
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +197 -189
- package/dist/keywords/string-keywords.d.ts.map +1 -1
- package/lib/formats.ts +191 -49
- package/lib/index.ts +49 -29
- package/lib/keywords/array-keywords.ts +1 -1
- package/lib/keywords/string-keywords.ts +6 -12
- package/package.json +3 -3
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1aXJlX2lzX215X2lwX3ZhbGlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsInJlSXB2NEZpcnN0UGFzcyIsInJlU3VibmV0U3RyaW5nIiwicmVGb3J3YXJkU2xhc2giLCJyZVpvbmUiLCJyZUJhZENoYXJhY3RlcnMiLCJyZUJhZEFkZHJlc3MiLCJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwicGF0aCIsImRhdGEiLCJzY2hlbWEiLCJfZ2V0Q2F1c2UiLCJwb2ludGVyIiwidGhpcyIsImdldENhdXNlIiwiZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkiLCJrZXkiLCJLZXl3b3JkRXJyb3IiLCJnZXROYW1lZEZ1bmN0aW9uIiwib3B0aW9ucyIsImRlZXBFcXVhbCIsIm9iaiIsIm90aGVyIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiaSIsImtleXMiLCJPYmplY3QiLCJpc09iamVjdCIsImRlZXBDbG9uZSIsInJlc3VsdCIsImNvbnN0cnVjdG9yIiwibmFtZSIsImlzQ29tcGlsZWRTY2hlbWEiLCJzdWJTY2hlbWEiLCJmbiIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJpbXBvcnRfaXNfbXlfaXBfdmFsaWQiLCJfX3RvRVNNIiwiUmVnRXhwcyIsInRpbWUiLCJ1cmkiLCJlbWFpbCIsImhvc3RuYW1lIiwiZGF0ZSIsIkZvcm1hdHMiLCJ1cHBlckNhc2VEYXRhIiwidG9VcHBlckNhc2UiLCJ0ZXN0IiwiRGF0ZSIsImlzTmFOIiwiZ2V0VGltZSIsImxvY2FsIiwiZG9tYWluIiwic3BsaXQiLCJpbmRleE9mIiwiaXB2NCIsImlzTXlJcFZhbGlkIiwidmVyc2lvbiIsImlwdjYiLCJyZWdleCIsIlJlZ0V4cCIsImUiLCJkdXJhdGlvbiIsInV1aWQiLCJpcmkiLCJUeXBlcyIsIm9iamVjdCIsImFycmF5Iiwic3RyaW5nIiwibnVtYmVyIiwiaW50ZWdlciIsImJvb2xlYW4iLCJudWxsIiwidGltZXN0YW1wIiwiaW50OCIsInVuaXQ4IiwiaW50MTYiLCJ1bml0MTYiLCJpbnQzMiIsInVuaXQzMiIsImZsb2F0MzIiLCJmbG9hdDY0Iiwia2V5d29yZHMiLCJyZXF1aXJlZCIsImRlZmluZUVycm9yIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wZXJ0aWVzIiwiZXJyb3IiLCIkdmFsaWRhdGUiLCJzY2hlbWFQcm9wIiwiZGVmYXVsdCIsInZhbHVlcyIsIm1heFByb3BlcnRpZXMiLCJtaW5Qcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJpc0NvbXBpbGVkIiwicGF0dGVyblByb3BlcnRpZXMiLCJtYXRjaCIsInBhdHRlcm4iLCJwYXR0ZXJucyIsInByb3BlcnR5TmFtZXMiLCJkZXBlbmRlbmNpZXMiLCJkZXBlbmRlbmN5IiwidGhlbiIsImVsc2UiLCIkcmVmIiwiZGVmaW5pdGlvbnMiLCIkaWQiLCIkc2NoZW1hIiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIiRjb21tZW50IiwiZXhhbXBsZXMiLCJjb250ZW50TWVkaWFUeXBlIiwiY29udGVudEVuY29kaW5nIiwiZGlzY3JpbWluYXRvciIsIm51bGxhYmxlIiwiaXRlbXMiLCJzY2hlbWFJdGVtcyIsImRhdGFMZW5ndGgiLCJzY2hlbWFJdGVtc0xlbmd0aCIsIml0ZW1zTGVuZ3RoIiwiTWF0aCIsIm1pbiIsInNjaGVtYUl0ZW0iLCJlbGVtZW50cyIsIm1pbkl0ZW1zIiwibWF4SXRlbXMiLCJhZGRpdGlvbmFsSXRlbXMiLCJ1bmlxdWVJdGVtcyIsInVuaXF1ZSIsIlNldCIsIml0ZW1TdHIiLCJKU09OIiwic3RyaW5naWZ5IiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsIlN0cmluZyIsImhhcyIsImFkZCIsImNvbnRhaW5zIiwibWluTGVuZ3RoIiwibWF4TGVuZ3RoIiwicGF0dGVyblJlZ2V4cCIsImZvcm1hdCIsImZvcm1hdEluc3RhbmNlIiwiZm9ybWF0VmFsaWRhdGUiLCJmb3JtYXRzIiwiZ2V0IiwibWluaW11bSIsImluc3RhbmNlIiwiZXhjbHVzaXZlTWluaW11bSIsIm1heGltdW0iLCJtYXgiLCJleGNsdXNpdmVNYXhpbXVtIiwibXVsdGlwbGVPZiIsInF1b3RpZW50IiwiaXNGaW5pdGUiLCJlcHNpbG9uIiwiYWJzIiwiYXJlQ2xvc2VFbm91Z2giLCJyb3VuZCIsImVudW0iLCJlbnVtSXRlbSIsImFsbE9mIiwiQm9vbGVhbiIsImFueU9mIiwib25lT2YiLCJ2YWxpZENvdW50IiwiY29uc3QiLCJpZiIsIm5vdCIsInR5cGVzIiwiTWFwIiwiaW1tdXRhYmxlIiwidHlwZSIsInZhbGlkYXRvciIsImFkZFR5cGUiLCJhZGRLZXl3b3JkIiwiYWRkRm9ybWF0Iiwic2V0IiwiY29tcGlsZSIsImNvbXBpbGVkU2NoZW1hIiwiY29tcGlsZVNjaGVtYSIsImlzU2NoZW1hTGlrZSIsInZhbGlkYXRlIiwiY2xvbmVkRGF0YSIsInZhbGlkIiwiZGVmaW5lVHlwZUVycm9yIiwidHlwZVZhbGlkYXRpb25zIiwibWV0aG9kTmFtZSIsIm1hcCIsInQiLCJ0cmltIiwicHVzaCIsInR5cGVWYWxpZGF0aW9uc0xlbmd0aCIsInR5cGVWYWxpZGF0aW9uIiwia2V5d29yZFZhbGlkYXRvciIsImV4ZWN1dGVLZXl3b3JkVmFsaWRhdG9yIiwicHJldlZhbGlkYXRvciIsImtleXdvcmRFcnJvciIsImluZGV4Iiwic3ViS2V5Il0sInNvdXJjZXMiOlsiLi4vbm9kZV9tb2R1bGVzL2lzLW15LWlwLXZhbGlkL2luZGV4LmpzIiwiLi4vbGliL3V0aWxzLnRzIiwiLi4vbGliL2Zvcm1hdHMudHMiLCIuLi9saWIvdHlwZXMudHMiLCIuLi9saWIva2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb2JqZWN0LWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL2FycmF5LWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL3N0cmluZy1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9udW1iZXIta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb3RoZXIta2V5d29yZHMudHMiLCIuLi9saWIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHJlSXB2NEZpcnN0UGFzcyA9IC9eXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM30kL1xuXG52YXIgcmVTdWJuZXRTdHJpbmcgPSAvXFwvXFxkezEsM30oPz0lfCQpL1xudmFyIHJlRm9yd2FyZFNsYXNoID0gL1xcLy9cbnZhciByZVpvbmUgPSAvJS4qJC9cbnZhciByZUJhZENoYXJhY3RlcnMgPSAvKFteMC05YS1mOi8lXSkvaVxudmFyIHJlQmFkQWRkcmVzcyA9IC8oWzAtOWEtZl17NSx9fDp7Myx9fFteOl06JHxeOlteOl18XFwvJCkvaVxuXG5mdW5jdGlvbiB2YWxpZGF0ZTQgKGlucHV0KSB7XG4gIGlmICghKHJlSXB2NEZpcnN0UGFzcy50ZXN0KGlucHV0KSkpIHJldHVybiBmYWxzZVxuXG4gIHZhciBwYXJ0cyA9IGlucHV0LnNwbGl0KCcuJylcblxuICBpZiAocGFydHMubGVuZ3RoICE9PSA0KSByZXR1cm4gZmFsc2VcblxuICBpZiAocGFydHNbMF1bMF0gPT09ICcwJyAmJiBwYXJ0c1swXS5sZW5ndGggPiAxKSByZXR1cm4gZmFsc2VcbiAgaWYgKHBhcnRzWzFdWzBdID09PSAnMCcgJiYgcGFydHNbMV0ubGVuZ3RoID4gMSkgcmV0dXJuIGZhbHNlXG4gIGlmIChwYXJ0c1syXVswXSA9PT0gJzAnICYmIHBhcnRzWzJdLmxlbmd0aCA+IDEpIHJldHVybiBmYWxzZVxuICBpZiAocGFydHNbM11bMF0gPT09ICcwJyAmJiBwYXJ0c1szXS5sZW5ndGggPiAxKSByZXR1cm4gZmFsc2VcblxuICB2YXIgbjAgPSBOdW1iZXIocGFydHNbMF0pXG4gIHZhciBuMSA9IE51bWJlcihwYXJ0c1sxXSlcbiAgdmFyIG4yID0gTnVtYmVyKHBhcnRzWzJdKVxuICB2YXIgbjMgPSBOdW1iZXIocGFydHNbM10pXG5cbiAgcmV0dXJuIChuMCA+PSAwICYmIG4wIDwgMjU2ICYmIG4xID49IDAgJiYgbjEgPCAyNTYgJiYgbjIgPj0gMCAmJiBuMiA8IDI1NiAmJiBuMyA+PSAwICYmIG4zIDwgMjU2KVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZTYgKGlucHV0KSB7XG4gIHZhciB3aXRob3V0U3VibmV0ID0gaW5wdXQucmVwbGFjZShyZVN1Ym5ldFN0cmluZywgJycpXG4gIHZhciBoYXNTdWJuZXQgPSAoaW5wdXQubGVuZ3RoICE9PSB3aXRob3V0U3VibmV0Lmxlbmd0aClcblxuICAvLyBGSVhNRTogdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgYW4gb3B0aW9uIGluIHRoZSBmdXR1cmVcbiAgaWYgKGhhc1N1Ym5ldCkgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKCFoYXNTdWJuZXQpIHtcbiAgICBpZiAocmVGb3J3YXJkU2xhc2gudGVzdChpbnB1dCkpIHJldHVybiBmYWxzZVxuICB9XG5cbiAgdmFyIHdpdGhvdXRab25lID0gd2l0aG91dFN1Ym5ldC5yZXBsYWNlKHJlWm9uZSwgJycpXG4gIHZhciBsYXN0UGFydFNlcGFyYXRvciA9IHdpdGhvdXRab25lLmxhc3RJbmRleE9mKCc6JylcblxuICBpZiAobGFzdFBhcnRTZXBhcmF0b3IgPT09IC0xKSByZXR1cm4gZmFsc2VcblxuICB2YXIgbGFzdFBhcnQgPSB3aXRob3V0Wm9uZS5zdWJzdHJpbmcobGFzdFBhcnRTZXBhcmF0b3IgKyAxKVxuICB2YXIgaGFzVjRQYXJ0ID0gdmFsaWRhdGU0KGxhc3RQYXJ0KVxuICB2YXIgYWRkcmVzcyA9IChoYXNWNFBhcnQgPyB3aXRob3V0Wm9uZS5zdWJzdHJpbmcoMCwgbGFzdFBhcnRTZXBhcmF0b3IgKyAxKSArICcxMjM0OjU2NzgnIDogd2l0aG91dFpvbmUpXG5cbiAgaWYgKHJlQmFkQ2hhcmFjdGVycy50ZXN0KGFkZHJlc3MpKSByZXR1cm4gZmFsc2VcbiAgaWYgKHJlQmFkQWRkcmVzcy50ZXN0KGFkZHJlc3MpKSByZXR1cm4gZmFsc2VcblxuICB2YXIgaGFsdmVzID0gYWRkcmVzcy5zcGxpdCgnOjonKVxuXG4gIGlmIChoYWx2ZXMubGVuZ3RoID4gMikgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKGhhbHZlcy5sZW5ndGggPT09IDIpIHtcbiAgICB2YXIgZmlyc3QgPSAoaGFsdmVzWzBdID09PSAnJyA/IFtdIDogaGFsdmVzWzBdLnNwbGl0KCc6JykpXG4gICAgdmFyIGxhc3QgPSAoaGFsdmVzWzFdID09PSAnJyA/IFtdIDogaGFsdmVzWzFdLnNwbGl0KCc6JykpXG4gICAgdmFyIHJlbWFpbmluZ0xlbmd0aCA9IDggLSAoZmlyc3QubGVuZ3RoICsgbGFzdC5sZW5ndGgpXG5cbiAgICBpZiAocmVtYWluaW5nTGVuZ3RoIDw9IDApIHJldHVybiBmYWxzZVxuICB9IGVsc2Uge1xuICAgIGlmIChhZGRyZXNzLnNwbGl0KCc6JykubGVuZ3RoICE9PSA4KSByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlIChpbnB1dCkge1xuICByZXR1cm4gdmFsaWRhdGU0KGlucHV0KSB8fCB2YWxpZGF0ZTYoaW5wdXQpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsaWRhdG9yIChvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9XG5cbiAgaWYgKG9wdGlvbnMudmVyc2lvbiA9PT0gNCkgcmV0dXJuIHZhbGlkYXRlNFxuICBpZiAob3B0aW9ucy52ZXJzaW9uID09PSA2KSByZXR1cm4gdmFsaWRhdGU2XG4gIGlmIChvcHRpb25zLnZlcnNpb24gPT0gbnVsbCkgcmV0dXJuIHZhbGlkYXRlXG5cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHZlcnNpb246ICcgKyBvcHRpb25zLnZlcnNpb24pXG59XG5cbm1vZHVsZS5leHBvcnRzWydfX2FsbF9yZWdleGVzX18nXSA9IFtcbiAgcmVJcHY0Rmlyc3RQYXNzLFxuICByZVN1Ym5ldFN0cmluZyxcbiAgcmVGb3J3YXJkU2xhc2gsXG4gIHJlWm9uZSxcbiAgcmVCYWRDaGFyYWN0ZXJzLFxuICByZUJhZEFkZHJlc3Ncbl1cbiIsImltcG9ydCB7IENvbXBpbGVkU2NoZW1hIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBpdGVtOiBzdHJpbmcgfCBudW1iZXI7XG4gIGtleXdvcmQ6IHN0cmluZztcbiAgY2F1c2U6IFZhbGlkYXRpb25FcnJvcjtcbiAgcGF0aDogc3RyaW5nID0gXCJcIjtcbiAgZGF0YT86IGFueTtcbiAgc2NoZW1hPzogQ29tcGlsZWRTY2hlbWE7XG5cbiAgcHJpdmF0ZSBfZ2V0Q2F1c2UocG9pbnRlciA9IFwiI1wiKSB7XG4gICAgY29uc3QgcGF0aCA9XG4gICAgICBwb2ludGVyICtcbiAgICAgIFwiL1wiICtcbiAgICAgIHRoaXMua2V5d29yZCArXG4gICAgICAodHlwZW9mIHRoaXMuaXRlbSAhPT0gXCJ1bmRlZmluZWRcIiA/IFwiL1wiICsgdGhpcy5pdGVtIDogXCJcIik7XG5cbiAgICBpZiAoIXRoaXMuY2F1c2UpIHtcbiAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYXVzZS5fZ2V0Q2F1c2UocGF0aCk7XG4gIH1cblxuICBnZXRDYXVzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2F1c2UoKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlZmluZUVycm9yT3B0aW9ucyB7XG4gIGl0ZW0/OiBhbnk7IC8vIEZpbmFsIGl0ZW0gaW4gdGhlIHBhdGhcbiAgY2F1c2U/OiBWYWxpZGF0aW9uRXJyb3I7IC8vIENhdXNlIG9mIHRoZSBlcnJvclxuICBkYXRhPzogYW55OyAvLyBEYXRhIHRoYXQgY2F1c2VkIHRoZSBlcnJvclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlZmluZUVycm9yRnVuY3Rpb24ge1xuICAobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogRGVmaW5lRXJyb3JPcHRpb25zKTogVmFsaWRhdGlvbkVycm9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXG4gIGtleTogc3RyaW5nLFxuICBzY2hlbWE6IENvbXBpbGVkU2NoZW1hXG4pIHtcbiAgY29uc3QgS2V5d29yZEVycm9yID0gbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCAke2tleX1gKTtcbiAgS2V5d29yZEVycm9yLmtleXdvcmQgPSBrZXk7XG4gIEtleXdvcmRFcnJvci5zY2hlbWEgPSBzY2hlbWE7XG5cbiAgY29uc3QgZGVmaW5lRXJyb3I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAobWVzc2FnZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgS2V5d29yZEVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIEtleXdvcmRFcnJvci5pdGVtID0gb3B0aW9ucy5pdGVtO1xuICAgIEtleXdvcmRFcnJvci5jYXVzZSA9IG9wdGlvbnMuY2F1c2U7XG4gICAgS2V5d29yZEVycm9yLmRhdGEgPSBvcHRpb25zLmRhdGE7XG4gICAgcmV0dXJuIEtleXdvcmRFcnJvcjtcbiAgfTtcblxuICByZXR1cm4gZ2V0TmFtZWRGdW5jdGlvbjxEZWZpbmVFcnJvckZ1bmN0aW9uPihcbiAgICBgZGVmaW5lRXJyb3JfJHtrZXl9YCxcbiAgICBkZWZpbmVFcnJvclxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKFxuICBvYmo6IEFycmF5PGFueT4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBvdGhlcjogQXJyYXk8YW55PiB8IFJlY29yZDxzdHJpbmcsIGFueT5cbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopICYmIEFycmF5LmlzQXJyYXkob3RoZXIpKSB7XG4gICAgaWYgKG9iai5sZW5ndGggIT09IG90aGVyLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChvYmpbaV0sIG90aGVyW2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb3RoZXIgPT09IFwib2JqZWN0XCIpIHtcbiAgICBpZiAob2JqID09PSBudWxsIHx8IG90aGVyID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gb2JqID09PSBvdGhlcjtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKG90aGVyKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChvYmpba2V5XSwgb3RoZXJba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIG9iaiA9PT0gb3RoZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdChkYXRhKSB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBkYXRhICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KGRhdGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJlQ2xvc2VFbm91Z2goYSwgYiwgZXBzaWxvbiA9IDFlLTE1KSB7XG4gIHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gZXBzaWxvbiAqIE1hdGgubWF4KE1hdGguYWJzKGEpLCBNYXRoLmFicyhiKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVVEYxNkxlbmd0aChzdHIpIHtcbiAgbGV0IGxlbmd0aCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY29kZVBvaW50ID0gc3RyLmNvZGVQb2ludEF0KGkpO1xuICAgIGlmIChjb2RlUG9pbnQgPiAweGZmZmYpIHtcbiAgICAgIGkrKztcbiAgICB9XG4gICAgbGVuZ3RoKys7XG4gIH1cbiAgcmV0dXJuIGxlbmd0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBDbG9uZShvYmo6IGFueSk6IGFueSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0W2ldID0gZGVlcENsb25lKG9ialtpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBJcyBjbGFzcyBpbnN0YW5jZSBvZiBhbnkga2luZFxuICBpZiAob2JqICYmIG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPT0gXCJPYmplY3RcIikge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAoaXNPYmplY3Qob2JqKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIC4uLm9ialxuICAgIH07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICByZXN1bHRba2V5XSA9IGRlZXBDbG9uZShvYmpba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21waWxlZFNjaGVtYShzdWJTY2hlbWE6IGFueSk6IHN1YlNjaGVtYSBpcyBDb21waWxlZFNjaGVtYSB7XG4gIHJldHVybiBpc09iamVjdChzdWJTY2hlbWEpICYmIFwiJHZhbGlkYXRlXCIgaW4gc3ViU2NoZW1hO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZWRGdW5jdGlvbjxUPihuYW1lOiBzdHJpbmcsIGZuOiBUKTogVCB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIFwibmFtZVwiLCB7IHZhbHVlOiBuYW1lIH0pO1xufVxuIiwiaW1wb3J0IGlzTXlJcFZhbGlkIGZyb20gJ2lzLW15LWlwLXZhbGlkJztcbmltcG9ydCB7IEZvcm1hdEZ1bmN0aW9uIH0gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuL3V0aWxzJztcblxuLy8gVGhlIGRhdGV0aW1lIDE5OTAtMDItMzFUMTU6NTk6NjAuMTIzLTA4OjAwIG11c3QgYmUgcmVqZWN0ZWQuXG5jb25zdCBSZWdFeHBzID0ge1xuICAnZGF0ZS10aW1lJzogL14oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KVQoXFxkezJ9KTooXFxkezJ9KTooXFxkezJ9KShcXC5cXGQrKT8oWnwoWystXSkoXFxkezJ9KTooXFxkezJ9KSkkLyxcbiAgdGltZTogL14oXFxkezJ9KTooXFxkezJ9KTooXFxkezJ9KShcXC5cXGQrKT8oWnwoWystXSkoXFxkezJ9KTooXFxkezJ9KSkkLyxcbiAgdXJpOiAvXlthLXpBLVpdW2EtekEtWjAtOStcXC0uXSo6W15cXHNdKiQvLFxuICBlbWFpbDpcbiAgICAvXlthLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC8sXG4gIGhvc3RuYW1lOiAvXlthLXpBLVowLTldW2EtekEtWjAtOS1dezAsNjJ9KFxcLlthLXpBLVowLTldW2EtekEtWjAtOS1dezAsNjJ9KSpbYS16QS1aMC05XSQvLFxuICBkYXRlOiAvXihcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pJC8sXG4gICdqc29uLXBvaW50ZXInOiAvXlxcLyg/Oltefl18fjB8fjEpKiQvLFxuICAncmVsYXRpdmUtanNvbi1wb2ludGVyJzogL14oWzAtOV0rKSgjfFxcLyg/Oltefl18fjB8fjEpKik/JC8sXG59O1xuXG5leHBvcnQgY29uc3QgRm9ybWF0czogUmVjb3JkPHN0cmluZywgRm9ybWF0RnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIFsnZGF0ZS10aW1lJ10oZGF0YSkge1xuICAgIGNvbnN0IHVwcGVyQ2FzZURhdGEgPSBkYXRhLnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKCFSZWdFeHBzWydkYXRlLXRpbWUnXS50ZXN0KHVwcGVyQ2FzZURhdGEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHVwcGVyQ2FzZURhdGEpO1xuICAgIHJldHVybiAhaXNOYU4oZGF0ZS5nZXRUaW1lKCkpO1xuICB9LFxuICB1cmkoZGF0YSkge1xuICAgIHJldHVybiBSZWdFeHBzLnVyaS50ZXN0KGRhdGEpO1xuICB9LFxuICBlbWFpbChkYXRhKSB7XG4gICAgaWYgKCFSZWdFeHBzLmVtYWlsLnRlc3QoZGF0YSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBbbG9jYWwsIGRvbWFpbl0gPSBkYXRhLnNwbGl0KCdAJyk7XG5cbiAgICBpZiAobG9jYWwubGVuZ3RoID4gNjQgfHwgbG9jYWwuaW5kZXhPZignLi4nKSAhPT0gLTEgfHwgbG9jYWxbMF0gPT09ICcuJyB8fCBsb2NhbFtsb2NhbC5sZW5ndGggLSAxXSA9PT0gJy4nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGRvbWFpbi5sZW5ndGggPiAyNTUgfHwgZG9tYWluLmluZGV4T2YoJy4uJykgIT09IC0xIHx8IGRvbWFpblswXSA9PT0gJy4nIHx8IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV0gPT09ICcuJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBpcHY0OiBpc015SXBWYWxpZCh7IHZlcnNpb246IDQgfSksXG4gIGlwdjY6IGlzTXlJcFZhbGlkKHsgdmVyc2lvbjogNiB9KSxcblxuICBob3N0bmFtZShkYXRhKSB7XG4gICAgcmV0dXJuIFJlZ0V4cHMuaG9zdG5hbWUudGVzdChkYXRhKTtcbiAgfSxcbiAgZGF0ZShkYXRhKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChSZWdFeHBzLmRhdGUudGVzdChkYXRhKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gIWlzTmFOKG5ldyBEYXRlKGRhdGEpLmdldFRpbWUoKSk7XG4gIH0sXG4gIHJlZ2V4KGRhdGEpIHtcbiAgICB0cnkge1xuICAgICAgbmV3IFJlZ0V4cChkYXRhKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gICdqc29uLXBvaW50ZXInKGRhdGEpIHtcbiAgICBpZiAoZGF0YSA9PT0gJycpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBSZWdFeHBzWydqc29uLXBvaW50ZXInXS50ZXN0KGRhdGEpO1xuICB9LFxuICAncmVsYXRpdmUtanNvbi1wb2ludGVyJyhkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09ICcnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gUmVnRXhwc1sncmVsYXRpdmUtanNvbi1wb2ludGVyJ10udGVzdChkYXRhKTtcbiAgfSxcbiAgdGltZShkYXRhKSB7XG4gICAgcmV0dXJuIFJlZ0V4cHMudGltZS50ZXN0KGRhdGEpO1xuICB9LFxuXG4gIC8vIE5vdCBzdXBwb3J0ZWQgeWV0XG4gIGR1cmF0aW9uOiBmYWxzZSxcbiAgJ2lkbi1lbWFpbCc6IGZhbHNlLFxuICAnaWRuLWhvc3RuYW1lJzogZmFsc2UsXG4gIHV1aWQ6IGZhbHNlLFxuICAndXJpLXJlZmVyZW5jZSc6IGZhbHNlLFxuICBpcmk6IGZhbHNlLFxuICAnaXJpLXJlZmVyZW5jZSc6IGZhbHNlLFxuICAndXJpLXRlbXBsYXRlJzogZmFsc2UsXG59O1xuIiwiaW1wb3J0IHsgVHlwZUZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGNvbnN0IFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIG9iamVjdChkYXRhKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGRhdGEpO1xuICB9LFxuICBhcnJheShkYXRhKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgZGF0YSAhPT0gbnVsbCAmJlxuICAgICAgXCJsZW5ndGhcIiBpbiBkYXRhICYmXG4gICAgICBcIjBcIiBpbiBkYXRhICYmXG4gICAgICBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggLSAxID09PSBkYXRhLmxlbmd0aFxuICAgICk7XG4gIH0sXG4gIHN0cmluZyhkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiO1xuICB9LFxuICBudW1iZXIoZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJudW1iZXJcIjtcbiAgfSxcbiAgaW50ZWdlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiICYmIGRhdGEgJSAxID09PSAwO1xuICB9LFxuICBib29sZWFuKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwiYm9vbGVhblwiO1xuICB9LFxuICBudWxsKGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YSA9PT0gbnVsbDtcbiAgfSxcblxuICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0XG4gIHRpbWVzdGFtcDogZmFsc2UsXG4gIGludDg6IGZhbHNlLFxuICB1bml0ODogZmFsc2UsXG4gIGludDE2OiBmYWxzZSxcbiAgdW5pdDE2OiBmYWxzZSxcbiAgaW50MzI6IGZhbHNlLFxuICB1bml0MzI6IGZhbHNlLFxuICBmbG9hdDMyOiBmYWxzZSxcbiAgZmxvYXQ2NDogZmFsc2VcblxuXG59O1xuIiwiaW1wb3J0IHsgQXJyYXlLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL2FycmF5LWtleXdvcmRzXCI7XG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHsgTnVtYmVyS2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9udW1iZXIta2V5d29yZHNcIjtcbmltcG9ydCB7IE9iamVjdEtleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvb2JqZWN0LWtleXdvcmRzXCI7XG5pbXBvcnQgeyBPdGhlcktleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvb3RoZXIta2V5d29yZHNcIjtcbmltcG9ydCB7IFN0cmluZ0tleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvc3RyaW5nLWtleXdvcmRzXCI7XG5cbmV4cG9ydCBjb25zdCBrZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICAuLi5PYmplY3RLZXl3b3JkcyxcbiAgLi4uQXJyYXlLZXl3b3JkcyxcbiAgLi4uU3RyaW5nS2V5d29yZHMsXG4gIC4uLk51bWJlcktleXdvcmRzLFxuICAuLi5PdGhlcktleXdvcmRzXG59O1xuIiwiaW1wb3J0IHsgaXNDb21waWxlZFNjaGVtYSwgaXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBPYmplY3RLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICAvLyBPYmplY3RcbiAgcmVxdWlyZWQoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5yZXF1aXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gc2NoZW1hLnJlcXVpcmVkW2ldO1xuICAgICAgaWYgKCFkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUmVxdWlyZWQgcHJvcGVydHkgaXMgbWlzc2luZ1wiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgcHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYS5wcm9wZXJ0aWVzKSkge1xuICAgICAgaWYgKCFkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hUHJvcCA9IHNjaGVtYS5wcm9wZXJ0aWVzW2tleV07XG4gICAgICAgIGlmIChpc09iamVjdChzY2hlbWFQcm9wKSAmJiBcImRlZmF1bHRcIiBpbiBzY2hlbWFQcm9wKSB7XG4gICAgICAgICAgZGF0YVtrZXldID0gc2NoZW1hUHJvcC5kZWZhdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGlmIChzY2hlbWEucHJvcGVydGllc1trZXldID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IGlzIG5vdCBhbGxvd2VkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEucHJvcGVydGllc1trZXldKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLnByb3BlcnRpZXNba2V5XS4kdmFsaWRhdGUoZGF0YVtrZXldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICB2YWx1ZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkgfHwgIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLnZhbHVlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEudmFsdWVzLiR2YWxpZGF0ZShkYXRhW2tleV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IGlzIGludmFsaWRcIiwge1xuICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtYXhQcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpIHx8IE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA8PSBzY2hlbWEubWF4UHJvcGVydGllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlRvbyBtYW55IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1pblByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkgfHwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID49IHNjaGVtYS5taW5Qcm9wZXJ0aWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVG9vIGZldyBwcm9wZXJ0aWVzXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBhZGRpdGlvbmFsUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICBjb25zdCBpc0NvbXBpbGVkID0gaXNDb21waWxlZFNjaGVtYShzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcyAmJiBzY2hlbWEucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gaW4gc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgaWYgKG5ldyBSZWdFeHAocGF0dGVybiwgXCJ1XCIpLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0NvbXBpbGVkKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiR2YWxpZGF0ZShkYXRhW2tleV0pO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBZGRpdGlvbmFsIHByb3BlcnRpZXMgYXJlIGludmFsaWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgcGF0dGVyblByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXR0ZXJucyA9IE9iamVjdC5rZXlzKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyk7XG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgXCJ1XCIpO1xuICAgICAgaWYgKHR5cGVvZiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXNbcGF0dGVybl0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGlmIChzY2hlbWEucGF0dGVyblByb3BlcnRpZXNbcGF0dGVybl0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgaWYgKHJlZ2V4LnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgaWYgKHJlZ2V4LnRlc3Qoa2V5KSkge1xuICAgICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEucGF0dGVyblByb3BlcnRpZXNbcGF0dGVybl0uJHZhbGlkYXRlKFxuICAgICAgICAgICAgICBkYXRhW2tleV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHByb3BlcnR5TmFtZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEucHJvcGVydHlOYW1lcyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWEucHJvcGVydHlOYW1lcyA9PT0gZmFsc2UgJiYgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5wcm9wZXJ0eU5hbWVzKSkge1xuICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEucHJvcGVydHlOYW1lcy4kdmFsaWRhdGUoa2V5KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgbmFtZSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGRlcGVuZGVuY2llcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgIGlmIChrZXkgaW4gZGF0YSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlcGVuZGVuY3kgPSBzY2hlbWEuZGVwZW5kZW5jaWVzW2tleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkZXBlbmRlbmN5KSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcGVuZGVuY3kubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIShkZXBlbmRlbmN5W2ldIGluIGRhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZXBlbmRlbmN5IGlzIG5vdCBzYXRpc2ZpZWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBkYXRhOiBkZXBlbmRlbmN5W2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRlcGVuZGVuY3kgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGlmIChkZXBlbmRlbmN5KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHsgZGF0YTogZGVwZW5kZW5jeSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkZXBlbmRlbmN5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmIChkZXBlbmRlbmN5IGluIGRhdGEpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZXBlbmRlbmN5IGlzIG5vdCBzYXRpc2ZpZWRcIiwgeyBkYXRhOiBkZXBlbmRlbmN5IH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3IgPSBkZXBlbmRlbmN5LiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZXBlbmRlbmN5IGlzIG5vdCBzYXRpc2ZpZWRcIiwge1xuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICAvLyBSZXF1aXJlZCBieSBvdGhlciBrZXl3b3JkcyBidXQgbm90IHVzZWQgYXMgYSBmdW5jdGlvbiBpdHNlbGZcbiAgdGhlbjogZmFsc2UsXG4gIGVsc2U6IGZhbHNlLFxuICBkZWZhdWx0OiBmYWxzZSxcblxuICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0XG4gICRyZWY6IGZhbHNlLFxuICBkZWZpbml0aW9uczogZmFsc2UsXG4gICRpZDogZmFsc2UsXG4gICRzY2hlbWE6IGZhbHNlLFxuXG4gIC8vIE1ldGFkYXRhIGtleXdvcmRzIChub3QgdXNlZCBhcyBhIGZ1bmN0aW9uKVxuICB0aXRsZTogZmFsc2UsXG4gIGRlc2NyaXB0aW9uOiBmYWxzZSxcbiAgJGNvbW1lbnQ6IGZhbHNlLFxuICBleGFtcGxlczogZmFsc2UsXG4gIGNvbnRlbnRNZWRpYVR5cGU6IGZhbHNlLFxuICBjb250ZW50RW5jb2Rpbmc6IGZhbHNlLFxuXG4gIC8vIE5vdCBzdXBwb3J0ZWQgT3BlbiBBUEkga2V5d29yZHNcbiAgZGlzY3JpbWluYXRvcjogZmFsc2UsXG4gIG51bGxhYmxlOiBmYWxzZVxufTtcbiIsImltcG9ydCB7IGlzQ29tcGlsZWRTY2hlbWEsIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuXG5leHBvcnQgY29uc3QgQXJyYXlLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgaXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYUl0ZW1zID0gc2NoZW1hLml0ZW1zO1xuICAgIGNvbnN0IGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAgIGlmICh0eXBlb2Ygc2NoZW1hSXRlbXMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hSXRlbXMgPT09IGZhbHNlICYmIGRhdGFMZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgYWxsb3dlZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFJdGVtcykpIHtcbiAgICAgIGNvbnN0IHNjaGVtYUl0ZW1zTGVuZ3RoID0gc2NoZW1hSXRlbXMubGVuZ3RoO1xuICAgICAgY29uc3QgaXRlbXNMZW5ndGggPSBNYXRoLm1pbihzY2hlbWFJdGVtc0xlbmd0aCwgZGF0YUxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hSXRlbSA9IHNjaGVtYUl0ZW1zW2ldO1xuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYUl0ZW0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYUl0ZW0gPT09IGZhbHNlICYmIHR5cGVvZiBkYXRhW2ldICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIG5vdCBhbGxvd2VkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hSXRlbSkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYUl0ZW0uJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYUl0ZW1zKSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWFJdGVtcy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGVsZW1lbnRzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsZW1lbnRzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEuZWxlbWVudHMuJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgbWluSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA+PSBzY2hlbWEubWluSXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gc2hvcnRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPD0gc2NoZW1hLm1heEl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXMgdG9vIGxvbmdcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxJdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8ICFzY2hlbWEuaXRlbXMgfHwgIUFycmF5LmlzQXJyYXkoc2NoZW1hLml0ZW1zKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzY2hlbWEuYWRkaXRpb25hbEl0ZW1zID09PSBmYWxzZSkge1xuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gc2NoZW1hLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gbG9uZ1wiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0KHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuYWRkaXRpb25hbEl0ZW1zKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gc2NoZW1hLml0ZW1zLmxlbmd0aDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMuJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHVuaXF1ZUl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgIXNjaGVtYS51bmlxdWVJdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVuaXF1ZSA9IG5ldyBTZXQoKTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgICBsZXQgaXRlbVN0cjtcblxuICAgICAgLy8gQ2hhbmdlIHN0cmluZyB0byBcInN0cmluZ1wiIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlc1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGl0ZW1TdHIgPSBgczoke2l0ZW19YDtcbiAgICAgICAgLy8gU29ydCBvYmplY3Qga2V5cyB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXNcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgICAgaXRlbVN0ciA9IGBvOiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaXRlbSkuc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICAgICAgICApXG4gICAgICAgICl9YDtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICBpdGVtU3RyID0gSlNPTi5zdHJpbmdpZnkoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtU3RyID0gU3RyaW5nKGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodW5pcXVlLmhhcyhpdGVtU3RyKSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtcyBhcmUgbm90IHVuaXF1ZVwiLCB7IGRhdGE6IGl0ZW0gfSk7XG4gICAgICB9XG4gICAgICB1bmlxdWUuYWRkKGl0ZW1TdHIpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBjb250YWlucyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmNvbnRhaW5zID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5jb250YWlucykge1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGl0ZW1cIiwgeyBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgbXVzdCBub3QgY29udGFpbiBhbnkgaXRlbXNcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEuY29udGFpbnMuJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGl0ZW1cIiwgeyBkYXRhIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBTdHJpbmdLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgbWluTGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPj0gc2NoZW1hLm1pbkxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIHNob3J0ZXIgdGhhbiB0aGUgbWluaW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heExlbmd0aChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiIHx8IGRhdGEubGVuZ3RoIDw9IHNjaGVtYS5tYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIHBhdHRlcm4oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdHRlcm5SZWdleHAgPSBuZXcgUmVnRXhwKHNjaGVtYS5wYXR0ZXJuLCBcInVcIik7XG5cbiAgICBpZiAocGF0dGVyblJlZ2V4cCBpbnN0YW5jZW9mIFJlZ0V4cCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBpZiAocGF0dGVyblJlZ2V4cC50ZXN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm5cIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGZvcm1hdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yLCBmb3JtYXRJbnN0YW5jZSkge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdFZhbGlkYXRlID0gZm9ybWF0SW5zdGFuY2UuZm9ybWF0cy5nZXQoc2NoZW1hLmZvcm1hdCk7XG4gICAgaWYgKGZvcm1hdFZhbGlkYXRlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm9ybWF0VmFsaWRhdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgaWYgKGZvcm1hdFZhbGlkYXRlKGRhdGEpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIGZvcm1hdFwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWRcIiwgeyBkYXRhIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBhcmVDbG9zZUVub3VnaCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgTnVtYmVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIG1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWluID0gc2NoZW1hLm1pbmltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWluID0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtID09PSB0cnVlKSB7XG4gICAgICBtaW4gKz0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPCBtaW4pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWF4ID0gc2NoZW1hLm1heGltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWF4ID0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gLSAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtID09PSB0cnVlKSB7XG4gICAgICBtYXggLT0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPiBtYXgpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG11bHRpcGxlT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBxdW90aWVudCA9IGRhdGEgLyBzY2hlbWEubXVsdGlwbGVPZjtcblxuICAgIGlmICghaXNGaW5pdGUocXVvdGllbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhcmVDbG9zZUVub3VnaChxdW90aWVudCwgTWF0aC5yb3VuZChxdW90aWVudCkpKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgbXVsdGlwbGVPZlwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1pbmltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA8PSBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSArIDFlLTE1KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1pbmltdW1cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1heGltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA+PSBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFxuICAgICAgICBcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZXhjbHVzaXZlTWF4aW11bVwiLFxuICAgICAgICB7IGRhdGEgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBkZWVwRXF1YWwsIGlzQ29tcGlsZWRTY2hlbWEsIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuXG5leHBvcnQgY29uc3QgT3RoZXJLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgZW51bShzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhbiBhcnJheSBvciBhbiBvYmplY3RcbiAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgICBjb25zdCBpc09iamVjdCA9IHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5lbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbnVtSXRlbSA9IHNjaGVtYS5lbnVtW2ldO1xuXG4gICAgICAvLyBTaW1wbGUgZXF1YWxpdHkgY2hlY2tcbiAgICAgIGlmIChlbnVtSXRlbSA9PT0gZGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGRhdGEgaXMgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LCBjaGVjayBmb3IgZGVlcCBlcXVhbGl0eVxuICAgICAgaWYgKFxuICAgICAgICAoaXNBcnJheSAmJiBBcnJheS5pc0FycmF5KGVudW1JdGVtKSkgfHxcbiAgICAgICAgKGlzT2JqZWN0ICYmIHR5cGVvZiBlbnVtSXRlbSA9PT0gXCJvYmplY3RcIiAmJiBlbnVtSXRlbSAhPT0gbnVsbClcbiAgICAgICkge1xuICAgICAgICBpZiAoZGVlcEVxdWFsKGVudW1JdGVtLCBkYXRhKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBhbGxPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuYWxsT2YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc09iamVjdChzY2hlbWEuYWxsT2ZbaV0pKSB7XG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFsbE9mW2ldLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGNhdXNlOiBlcnJvciwgZGF0YSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLmFsbE9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoQm9vbGVhbihkYXRhKSAhPT0gc2NoZW1hLmFsbE9mW2ldKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgIT09IHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBhbnlPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuYW55T2YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc09iamVjdChzY2hlbWEuYW55T2ZbaV0pKSB7XG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5hbnlPZltpXSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFueU9mW2ldLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLmFueU9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChCb29sZWFuKGRhdGEpID09PSBzY2hlbWEuYW55T2ZbaV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YSA9PT0gc2NoZW1hLmFueU9mW2ldKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBvbmVPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgbGV0IHZhbGlkQ291bnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLm9uZU9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLm9uZU9mW2ldKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5vbmVPZltpXS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWEub25lT2ZbaV0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKEJvb2xlYW4oZGF0YSkgPT09IHNjaGVtYS5vbmVPZltpXSkge1xuICAgICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhID09PSBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRDb3VudCA9PT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgY29uc3Qoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmIChcbiAgICAgIGRhdGEgPT09IHNjaGVtYS5jb25zdCB8fFxuICAgICAgKGlzT2JqZWN0KGRhdGEpICYmXG4gICAgICAgIGlzT2JqZWN0KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgZGVlcEVxdWFsKGRhdGEsIHNjaGVtYS5jb25zdCkpIHx8XG4gICAgICAoQXJyYXkuaXNBcnJheShkYXRhKSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgZGVlcEVxdWFsKGRhdGEsIHNjaGVtYS5jb25zdCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgaWYoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmIChcInRoZW5cIiBpbiBzY2hlbWEgPT09IGZhbHNlICYmIFwiZWxzZVwiIGluIHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuaWYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmlmKSB7XG4gICAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS50aGVuKSkge1xuICAgICAgICAgIHJldHVybiBzY2hlbWEudGhlbi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5lbHNlLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmlmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmlmLiR2YWxpZGF0ZShkYXRhKTtcbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEudGhlbikpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS50aGVuLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsc2UpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuZWxzZS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9LFxuXG4gIG5vdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEubm90ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5ub3QpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLm5vdCkpIHtcbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5ub3QpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEubm90LiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGNhdXNlOiBlcnJvciwgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQge1xuICBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIGRlZXBDbG9uZSxcbiAgZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXksXG4gIGdldE5hbWVkRnVuY3Rpb24sXG4gIGlzT2JqZWN0XG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCB7IEZvcm1hdHMgfSBmcm9tIFwiLi9mb3JtYXRzXCI7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBrZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzXCI7XG5cbmV4cG9ydCB0eXBlIFJlc3VsdCA9IHZvaWQgfCBWYWxpZGF0aW9uRXJyb3I7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5d29yZEZ1bmN0aW9uIHtcbiAgKFxuICAgIHNjaGVtYTogQ29tcGlsZWRTY2hlbWEsXG4gICAgZGF0YTogYW55LFxuICAgIGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICAgIGluc3RhbmNlOiBTY2hlbWFTaGllbGRcbiAgKTogUmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdEZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRTY2hlbWEge1xuICAkdmFsaWRhdGU/OiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yIHtcbiAgKGRhdGE6IGFueSk6IHsgZGF0YTogYW55OyBlcnJvcjogVmFsaWRhdGlvbkVycm9yIHwgbnVsbDsgdmFsaWQ6IGJvb2xlYW4gfTtcbiAgY29tcGlsZWRTY2hlbWE6IENvbXBpbGVkU2NoZW1hO1xufVxuXG5leHBvcnQgY2xhc3MgU2NoZW1hU2hpZWxkIHtcbiAgdHlwZXMgPSBuZXcgTWFwPHN0cmluZywgVHlwZUZ1bmN0aW9uIHwgZmFsc2U+KCk7XG4gIGZvcm1hdHMgPSBuZXcgTWFwPHN0cmluZywgRm9ybWF0RnVuY3Rpb24gfCBmYWxzZT4oKTtcbiAga2V5d29yZHMgPSBuZXcgTWFwPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+KCk7XG4gIGltbXV0YWJsZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBpbW11dGFibGUgPSBmYWxzZVxuICB9OiB7XG4gICAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7XG5cbiAgICBmb3IgKGNvbnN0IFt0eXBlLCB2YWxpZGF0b3JdIG9mIE9iamVjdC5lbnRyaWVzKFR5cGVzKSkge1xuICAgICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgICB0aGlzLmFkZFR5cGUodHlwZSwgdmFsaWRhdG9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXl3b3JkLCB2YWxpZGF0b3JdIG9mIE9iamVjdC5lbnRyaWVzKGtleXdvcmRzKSkge1xuICAgICAgdGhpcy5hZGRLZXl3b3JkKGtleXdvcmQsIHZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2Zvcm1hdCwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhGb3JtYXRzKSkge1xuICAgICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgICB0aGlzLmFkZEZvcm1hdChmb3JtYXQsIHZhbGlkYXRvciBhcyBGb3JtYXRGdW5jdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkVHlwZShuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogVHlwZUZ1bmN0aW9uKSB7XG4gICAgdGhpcy50eXBlcy5zZXQobmFtZSwgdmFsaWRhdG9yKTtcbiAgfVxuXG4gIGFkZEZvcm1hdChuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogRm9ybWF0RnVuY3Rpb24pIHtcbiAgICB0aGlzLmZvcm1hdHMuc2V0KG5hbWUsIHZhbGlkYXRvcik7XG4gIH1cblxuICBhZGRLZXl3b3JkKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBLZXl3b3JkRnVuY3Rpb24pIHtcbiAgICB0aGlzLmtleXdvcmRzLnNldChuYW1lLCB2YWxpZGF0b3IpO1xuICB9XG5cbiAgY29tcGlsZShzY2hlbWE6IGFueSk6IFZhbGlkYXRvciB7XG4gICAgY29uc3QgY29tcGlsZWRTY2hlbWEgPSB0aGlzLmNvbXBpbGVTY2hlbWEoc2NoZW1hKTtcbiAgICBpZiAoIWNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSkge1xuICAgICAgaWYgKHRoaXMuaXNTY2hlbWFMaWtlKHNjaGVtYSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJJbnZhbGlkIHNjaGVtYVwiKTtcbiAgICAgIH1cblxuICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgXCJhbnlcIixcbiAgICAgICAgKCkgPT4ge31cbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGU6IFZhbGlkYXRvciA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGNsb25lZERhdGEgPSB0aGlzLmltbXV0YWJsZSA/IGRlZXBDbG9uZShkYXRhKSA6IGRhdGE7XG4gICAgICBjb25zdCBlcnJvciA9IGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZShjbG9uZWREYXRhKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogY2xvbmVkRGF0YSxcbiAgICAgICAgZXJyb3I6IGVycm9yID8gZXJyb3IgOiBudWxsLFxuICAgICAgICB2YWxpZDogIWVycm9yXG4gICAgICB9O1xuICAgIH07XG5cbiAgICB2YWxpZGF0ZS5jb21waWxlZFNjaGVtYSA9IGNvbXBpbGVkU2NoZW1hO1xuXG4gICAgcmV0dXJuIHZhbGlkYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21waWxlU2NoZW1hKHNjaGVtYTogUGFydGlhbDxDb21waWxlZFNjaGVtYT4gfCBhbnkpOiBDb21waWxlZFNjaGVtYSB7XG4gICAgaWYgKCFpc09iamVjdChzY2hlbWEpKSB7XG4gICAgICBpZiAoc2NoZW1hID09PSB0cnVlKSB7XG4gICAgICAgIHNjaGVtYSA9IHtcbiAgICAgICAgICBhbnlPZjogW3t9XVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChzY2hlbWEgPT09IGZhbHNlKSB7XG4gICAgICAgIHNjaGVtYSA9IHtcbiAgICAgICAgICBvbmVPZjogW11cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjaGVtYSA9IHtcbiAgICAgICAgICBvbmVPZjogW3NjaGVtYV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21waWxlZFNjaGVtYTogQ29tcGlsZWRTY2hlbWEgPSB7IC4uLnNjaGVtYSB9IGFzIENvbXBpbGVkU2NoZW1hO1xuICAgIGNvbnN0IGRlZmluZVR5cGVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFwidHlwZVwiLCBzY2hlbWEpO1xuICAgIGNvbnN0IHR5cGVWYWxpZGF0aW9uczogVHlwZUZ1bmN0aW9uW10gPSBbXTtcblxuICAgIGxldCBtZXRob2ROYW1lID0gXCJcIjtcblxuICAgIGlmIChcInR5cGVcIiBpbiBzY2hlbWEpIHtcbiAgICAgIGNvbnN0IHR5cGVzID0gQXJyYXkuaXNBcnJheShzY2hlbWEudHlwZSlcbiAgICAgICAgPyBzY2hlbWEudHlwZVxuICAgICAgICA6IHNjaGVtYS50eXBlLnNwbGl0KFwiLFwiKS5tYXAoKHQpID0+IHQudHJpbSgpKTtcblxuICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHR5cGVzKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHRoaXMudHlwZXMuZ2V0KHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZVZhbGlkYXRpb25zLnB1c2godmFsaWRhdG9yKTtcbiAgICAgICAgICBtZXRob2ROYW1lICs9IChtZXRob2ROYW1lID8gXCJfT1JfXCIgOiBcIlwiKSArIHZhbGlkYXRvci5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9IHR5cGVWYWxpZGF0aW9ucy5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlVmFsaWRhdGlvbnNMZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlIGZvciBzY2hlbWFcIiwgeyBkYXRhOiBzY2hlbWEudHlwZSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB0eXBlVmFsaWRhdGlvbiA9IHR5cGVWYWxpZGF0aW9uc1swXTtcbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZVZhbGlkYXRpb24oZGF0YSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh0eXBlVmFsaWRhdGlvbnNMZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlVmFsaWRhdGlvbnNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAodHlwZVZhbGlkYXRpb25zW2ldKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hKSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJ0eXBlXCIpIHtcbiAgICAgICAgY29tcGlsZWRTY2hlbWEudHlwZSA9IHNjaGVtYS50eXBlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5d29yZFZhbGlkYXRvciA9IHRoaXMua2V5d29yZHMuZ2V0KGtleSk7XG4gICAgICBpZiAoa2V5d29yZFZhbGlkYXRvcikge1xuICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KGtleSwgc2NoZW1hW2tleV0pO1xuICAgICAgICBjb25zdCBleGVjdXRlS2V5d29yZFZhbGlkYXRvciA9IChkYXRhOiBhbnkpID0+XG4gICAgICAgICAgKGtleXdvcmRWYWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKShcbiAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIGRlZmluZUVycm9yLFxuICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICk7XG5cbiAgICAgICAgaWYgKGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSkge1xuICAgICAgICAgIGNvbnN0IHByZXZWYWxpZGF0b3IgPSBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGU7XG4gICAgICAgICAgbWV0aG9kTmFtZSArPSBgX0FORF8ke2tleXdvcmRWYWxpZGF0b3IubmFtZX1gO1xuICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBwcmV2VmFsaWRhdG9yKGRhdGEpO1xuICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3Qga2V5d29yZEVycm9yID0gZXhlY3V0ZUtleXdvcmRWYWxpZGF0b3IoZGF0YSk7XG4gICAgICAgICAgICAgIGlmIChrZXl3b3JkRXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5d29yZEVycm9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZXRob2ROYW1lID0ga2V5d29yZFZhbGlkYXRvci5uYW1lO1xuICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgICAgZXhlY3V0ZUtleXdvcmRWYWxpZGF0b3JcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc09iamVjdChzY2hlbWFba2V5XSkpIHtcbiAgICAgICAgY29tcGlsZWRTY2hlbWFba2V5XSA9IHRoaXMuY29tcGlsZVNjaGVtYShzY2hlbWFba2V5XSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFba2V5XSkpIHtcbiAgICAgICAgY29tcGlsZWRTY2hlbWFba2V5XSA9IHNjaGVtYVtrZXldLm1hcCgoc3ViU2NoZW1hLCBpbmRleCkgPT5cbiAgICAgICAgICB0aGlzLmlzU2NoZW1hTGlrZShzdWJTY2hlbWEpXG4gICAgICAgICAgICA/IHRoaXMuY29tcGlsZVNjaGVtYShzdWJTY2hlbWEpXG4gICAgICAgICAgICA6IHN1YlNjaGVtYVxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29tcGlsZWRTY2hlbWFba2V5XSA9IHNjaGVtYVtrZXldO1xuICAgIH1cblxuICAgIHJldHVybiBjb21waWxlZFNjaGVtYSBhcyBDb21waWxlZFNjaGVtYTtcbiAgfVxuXG4gIGlzU2NoZW1hTGlrZShzdWJTY2hlbWE6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmIChpc09iamVjdChzdWJTY2hlbWEpKSB7XG4gICAgICBpZiAoXCJ0eXBlXCIgaW4gc3ViU2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBzdWJLZXkgaW4gc3ViU2NoZW1hKSB7XG4gICAgICAgIGlmICh0aGlzLmtleXdvcmRzLmhhcyhzdWJLZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiIrS0FBQUEsRyxFQUFBLHdDQUFBQyxFQUFBQyxHQUFBLElBQUlDLEVBQWtCLHVDQUVsQkMsRUFBaUIsbUJBQ2pCQyxFQUFpQixLQUNqQkMsRUFBUyxPQUNUQyxFQUFrQixrQkFDbEJDLEVBQWUsMENBNEVuQk4sRUFBT0QsUUFBeUIsZ0JBQUksQ0FDbENFLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0YsRyw0RUN2RmFDLEVBQU4sY0FBOEJDLE1BQ25DQyxRQUNBQyxLQUNBQyxRQUNBQyxNQUNBQyxLQUFlLEdBQ2ZDLEtBQ0FDLE9BRVFDLFVBQVVDLEVBQVUsS0FDMUIsTUFBTUosRUFDSkksRUFDQSxJQUNBQyxLQUFLUCxjQUNpQixJQUFkTyxLQUFLUixLQUF1QixJQUFNUSxLQUFLUixLQUFPLElBRXhELE9BQUtRLEtBQUtOLE1BS0hNLEtBQUtOLE1BQU1JLFVBQVVILElBSjFCSyxLQUFLTCxLQUFPQSxFQUNMSyxLQUlYLENBRUFDLFdBQ0UsT0FBT0QsS0FBS0YsV0FDZCxHQWFLLFNBQVNJLEVBQ2RDLEVBQ0FOLEdBRUEsTUFBTU8sRUFBZSxJQUFJZixFQUFnQixXQUFXYyxLQUNwREMsRUFBYVgsUUFBVVUsRUFDdkJDLEVBQWFQLE9BQVNBLEVBVXRCLE9BQU9RLEVBQ0wsZUFBZUYsSUFUd0IsQ0FBQ1osRUFBU2UsRUFBVSxDQUFDLEtBQzVERixFQUFhYixRQUFVQSxFQUN2QmEsRUFBYVosS0FBT2MsRUFBUWQsS0FDNUJZLEVBQWFWLE1BQVFZ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
|
|
1
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwicGF0aCIsImRhdGEiLCJzY2hlbWEiLCJfZ2V0Q2F1c2UiLCJwb2ludGVyIiwidGhpcyIsImdldENhdXNlIiwiZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkiLCJrZXkiLCJLZXl3b3JkRXJyb3IiLCJnZXROYW1lZEZ1bmN0aW9uIiwib3B0aW9ucyIsImRlZXBFcXVhbCIsIm9iaiIsIm90aGVyIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiaSIsImtleXMiLCJPYmplY3QiLCJpc09iamVjdCIsImRlZXBDbG9uZSIsInJlc3VsdCIsImNvbnN0cnVjdG9yIiwibmFtZSIsImlzQ29tcGlsZWRTY2hlbWEiLCJzdWJTY2hlbWEiLCJmbiIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJGb3JtYXRzIiwibWF0Y2giLCJkYXkiLCJOdW1iZXIiLCJ5ZWFyU3RyIiwibW9udGhTdHIiLCJob3VyU3RyIiwibWludXRlU3RyIiwic2Vjb25kU3RyIiwidGltZXpvbmVTaWduIiwidGltZXpvbmVIb3VyU3RyIiwidGltZXpvbmVNaW51dGVTdHIiLCJ5ZWFyIiwibW9udGgiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwidGltZXpvbmVIb3VyIiwidGltZXpvbmVNaW51dGUiLCJ1cmkiLCJ0ZXN0IiwiZW1haWwiLCJpcHY0IiwiaXB2NiIsImluZGV4T2YiLCJoYXNJcHY0IiwiYWRkcmVzc1BhcnRzIiwic3BsaXQiLCJpcHY0UGFydCIsInBvcCIsImlzU2hvcnRlbmVkIiwiaXB2NlBhcnQiLCJqb2luIiwiaXNJcHY2VmFsaWQiLCJoYXNJbnZhbGlkQ2hhciIsImhvc3RuYW1lIiwiZGF0ZSIsImlzTmFOIiwiRGF0ZSIsImdldFRpbWUiLCJyZWdleCIsIlJlZ0V4cCIsImUiLCJ0aW1lIiwiZHVyYXRpb24iLCJ1dWlkIiwiaXJpIiwiVHlwZXMiLCJvYmplY3QiLCJhcnJheSIsInN0cmluZyIsIm51bWJlciIsImludGVnZXIiLCJib29sZWFuIiwibnVsbCIsInRpbWVzdGFtcCIsImludDgiLCJ1bml0OCIsImludDE2IiwidW5pdDE2IiwiaW50MzIiLCJ1bml0MzIiLCJmbG9hdDMyIiwiZmxvYXQ2NCIsImtleXdvcmRzIiwicmVxdWlyZWQiLCJkZWZpbmVFcnJvciIsImhhc093blByb3BlcnR5IiwicHJvcGVydGllcyIsImVycm9yIiwiJHZhbGlkYXRlIiwic2NoZW1hUHJvcCIsImRlZmF1bHQiLCJ2YWx1ZXMiLCJtYXhQcm9wZXJ0aWVzIiwibWluUHJvcGVydGllcyIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiaXNDb21waWxlZCIsInBhdHRlcm5Qcm9wZXJ0aWVzIiwicGF0dGVybiIsInBhdHRlcm5zIiwicHJvcGVydHlOYW1lcyIsImRlcGVuZGVuY2llcyIsImRlcGVuZGVuY3kiLCJ0aGVuIiwiZWxzZSIsIiRyZWYiLCJkZWZpbml0aW9ucyIsIiRpZCIsIiRzY2hlbWEiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiJGNvbW1lbnQiLCJleGFtcGxlcyIsImNvbnRlbnRNZWRpYVR5cGUiLCJjb250ZW50RW5jb2RpbmciLCJkaXNjcmltaW5hdG9yIiwibnVsbGFibGUiLCJpdGVtcyIsInNjaGVtYUl0ZW1zIiwiZGF0YUxlbmd0aCIsInNjaGVtYUl0ZW1zTGVuZ3RoIiwiaXRlbXNMZW5ndGgiLCJNYXRoIiwibWluIiwic2NoZW1hSXRlbSIsImVsZW1lbnRzIiwibWluSXRlbXMiLCJtYXhJdGVtcyIsImFkZGl0aW9uYWxJdGVtcyIsInVuaXF1ZUl0ZW1zIiwidW5pcXVlIiwiU2V0IiwiaXRlbVN0ciIsIkpTT04iLCJzdHJpbmdpZnkiLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwiU3RyaW5nIiwiaGFzIiwiYWRkIiwiY29udGFpbnMiLCJtaW5MZW5ndGgiLCJtYXhMZW5ndGgiLCJwYXR0ZXJuUmVnZXhwIiwiZm9ybWF0IiwiaW5zdGFuY2UiLCJmb3JtYXRWYWxpZGF0ZSIsImdldEZvcm1hdCIsIm1pbmltdW0iLCJleGNsdXNpdmVNaW5pbXVtIiwibWF4aW11bSIsIm1heCIsImV4Y2x1c2l2ZU1heGltdW0iLCJtdWx0aXBsZU9mIiwicXVvdGllbnQiLCJpc0Zpbml0ZSIsImVwc2lsb24iLCJhYnMiLCJhcmVDbG9zZUVub3VnaCIsInJvdW5kIiwiZW51bSIsImVudW1JdGVtIiwiYWxsT2YiLCJCb29sZWFuIiwiYW55T2YiLCJvbmVPZiIsInZhbGlkQ291bnQiLCJjb25zdCIsImlmIiwibm90IiwidHlwZXMiLCJmb3JtYXRzIiwiaW1tdXRhYmxlIiwidHlwZSIsInZhbGlkYXRvciIsImFkZFR5cGUiLCJhZGRLZXl3b3JkIiwiYWRkRm9ybWF0Iiwib3ZlcndyaXRlIiwiZ2V0VHlwZSIsImdldEtleXdvcmQiLCJjb21waWxlIiwiY29tcGlsZWRTY2hlbWEiLCJjb21waWxlU2NoZW1hIiwiaXNTY2hlbWFMaWtlIiwidmFsaWRhdGUiLCJjbG9uZWREYXRhIiwidmFsaWQiLCJkZWZpbmVUeXBlRXJyb3IiLCJ0eXBlVmFsaWRhdGlvbnMiLCJtZXRob2ROYW1lIiwibWFwIiwidCIsInRyaW0iLCJwdXNoIiwidHlwZVZhbGlkYXRpb25zTGVuZ3RoIiwidHlwZVZhbGlkYXRpb24iLCJrZXl3b3JkVmFsaWRhdG9yIiwicHJldlZhbGlkYXRvciIsImluZGV4Iiwic3ViS2V5Il0sInNvdXJjZXMiOlsiLi4vbGliL3V0aWxzLnRzIiwiLi4vbGliL2Zvcm1hdHMudHMiLCIuLi9saWIvdHlwZXMudHMiLCIuLi9saWIva2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb2JqZWN0LWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL2FycmF5LWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL3N0cmluZy1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9udW1iZXIta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb3RoZXIta2V5d29yZHMudHMiLCIuLi9saWIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcGlsZWRTY2hlbWEgfSBmcm9tIFwiLi9pbmRleFwiO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGl0ZW06IHN0cmluZyB8IG51bWJlcjtcbiAga2V5d29yZDogc3RyaW5nO1xuICBjYXVzZTogVmFsaWRhdGlvbkVycm9yO1xuICBwYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBkYXRhPzogYW55O1xuICBzY2hlbWE/OiBDb21waWxlZFNjaGVtYTtcblxuICBwcml2YXRlIF9nZXRDYXVzZShwb2ludGVyID0gXCIjXCIpIHtcbiAgICBjb25zdCBwYXRoID1cbiAgICAgIHBvaW50ZXIgK1xuICAgICAgXCIvXCIgK1xuICAgICAgdGhpcy5rZXl3b3JkICtcbiAgICAgICh0eXBlb2YgdGhpcy5pdGVtICE9PSBcInVuZGVmaW5lZFwiID8gXCIvXCIgKyB0aGlzLml0ZW0gOiBcIlwiKTtcblxuICAgIGlmICghdGhpcy5jYXVzZSkge1xuICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNhdXNlLl9nZXRDYXVzZShwYXRoKTtcbiAgfVxuXG4gIGdldENhdXNlKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRDYXVzZSgpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmaW5lRXJyb3JPcHRpb25zIHtcbiAgaXRlbT86IGFueTsgLy8gRmluYWwgaXRlbSBpbiB0aGUgcGF0aFxuICBjYXVzZT86IFZhbGlkYXRpb25FcnJvcjsgLy8gQ2F1c2Ugb2YgdGhlIGVycm9yXG4gIGRhdGE/OiBhbnk7IC8vIERhdGEgdGhhdCBjYXVzZWQgdGhlIGVycm9yXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmaW5lRXJyb3JGdW5jdGlvbiB7XG4gIChtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBEZWZpbmVFcnJvck9wdGlvbnMpOiBWYWxpZGF0aW9uRXJyb3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAga2V5OiBzdHJpbmcsXG4gIHNjaGVtYTogQ29tcGlsZWRTY2hlbWFcbikge1xuICBjb25zdCBLZXl3b3JkRXJyb3IgPSBuZXcgVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkICR7a2V5fWApO1xuICBLZXl3b3JkRXJyb3Iua2V5d29yZCA9IGtleTtcbiAgS2V5d29yZEVycm9yLnNjaGVtYSA9IHNjaGVtYTtcblxuICBjb25zdCBkZWZpbmVFcnJvcjogRGVmaW5lRXJyb3JGdW5jdGlvbiA9IChtZXNzYWdlLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBLZXl3b3JkRXJyb3IubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgS2V5d29yZEVycm9yLml0ZW0gPSBvcHRpb25zLml0ZW07XG4gICAgS2V5d29yZEVycm9yLmNhdXNlID0gb3B0aW9ucy5jYXVzZTtcbiAgICBLZXl3b3JkRXJyb3IuZGF0YSA9IG9wdGlvbnMuZGF0YTtcbiAgICByZXR1cm4gS2V5d29yZEVycm9yO1xuICB9O1xuXG4gIHJldHVybiBnZXROYW1lZEZ1bmN0aW9uPERlZmluZUVycm9yRnVuY3Rpb24+KFxuICAgIGBkZWZpbmVFcnJvcl8ke2tleX1gLFxuICAgIGRlZmluZUVycm9yXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWwoXG4gIG9iajogQXJyYXk8YW55PiB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG90aGVyOiBBcnJheTxhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PlxuKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikgJiYgQXJyYXkuaXNBcnJheShvdGhlcikpIHtcbiAgICBpZiAob2JqLmxlbmd0aCAhPT0gb3RoZXIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghZGVlcEVxdWFsKG9ialtpXSwgb3RoZXJbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvdGhlciA9PT0gXCJvYmplY3RcIikge1xuICAgIGlmIChvYmogPT09IG51bGwgfHwgb3RoZXIgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBvYmogPT09IG90aGVyO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMob3RoZXIpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmICghZGVlcEVxdWFsKG9ialtrZXldLCBvdGhlcltrZXldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gb2JqID09PSBvdGhlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmVDbG9zZUVub3VnaChhLCBiLCBlcHNpbG9uID0gMWUtMTUpIHtcbiAgcmV0dXJuIE1hdGguYWJzKGEgLSBiKSA8PSBlcHNpbG9uICogTWF0aC5tYXgoTWF0aC5hYnMoYSksIE1hdGguYWJzKGIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVURjE2TGVuZ3RoKHN0cikge1xuICBsZXQgbGVuZ3RoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2RlUG9pbnQgPSBzdHIuY29kZVBvaW50QXQoaSk7XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4ZmZmZikge1xuICAgICAgaSsrO1xuICAgIH1cbiAgICBsZW5ndGgrKztcbiAgfVxuICByZXR1cm4gbGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcENsb25lKG9iajogYW55KTogYW55IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbaV0gPSBkZWVwQ2xvbmUob2JqW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIElzIGNsYXNzIGluc3RhbmNlIG9mIGFueSBraW5kXG4gIGlmIChvYmogJiYgb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5uYW1lICE9PSBcIk9iamVjdFwiKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmIChpc09iamVjdChvYmopKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgLi4ub2JqXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIHJlc3VsdFtrZXldID0gZGVlcENsb25lKG9ialtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBpbGVkU2NoZW1hKHN1YlNjaGVtYTogYW55KTogc3ViU2NoZW1hIGlzIENvbXBpbGVkU2NoZW1hIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHN1YlNjaGVtYSkgJiYgXCIkdmFsaWRhdGVcIiBpbiBzdWJTY2hlbWE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lZEZ1bmN0aW9uPFQ+KG5hbWU6IHN0cmluZywgZm46IFQpOiBUIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgXCJuYW1lXCIsIHsgdmFsdWU6IG5hbWUgfSk7XG59XG4iLCJpbXBvcnQgeyBGb3JtYXRGdW5jdGlvbiB9IGZyb20gXCIuL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBGb3JtYXRzOiBSZWNvcmQ8c3RyaW5nLCBGb3JtYXRGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgW1wiZGF0ZS10aW1lXCJdKGRhdGEpIHtcbiAgICBjb25zdCBtYXRjaCA9IGRhdGEubWF0Y2goXG4gICAgICAvXihcXGR7NH0pLSgwWzAtOV18MVswLTJdKS0oXFxkezJ9KVQoMFswLTldfDFcXGR8MlswLTNdKTooWzAtNV1cXGQpOigoPzpbMC01XVxcZHw2MCkpKD86LlxcZCspPyg/OihbKy1dKSgwWzAtOV18MVxcZHwyWzAtM10pOihbMC01XVxcZCl8Wik/JC9pXG4gICAgKTtcblxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgZGF5ID0gTnVtYmVyKG1hdGNoWzNdKTtcblxuICAgIGlmIChtYXRjaFsyXSA9PT0gXCIwMlwiICYmIGRheSA+IDI5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgW1xuICAgICAgLFxuICAgICAgeWVhclN0cixcbiAgICAgIG1vbnRoU3RyLFxuICAgICAgLFxuICAgICAgaG91clN0cixcbiAgICAgIG1pbnV0ZVN0cixcbiAgICAgIHNlY29uZFN0cixcbiAgICAgIHRpbWV6b25lU2lnbixcbiAgICAgIHRpbWV6b25lSG91clN0cixcbiAgICAgIHRpbWV6b25lTWludXRlU3RyXG4gICAgXSA9IG1hdGNoO1xuXG4gICAgbGV0IHllYXIgPSBOdW1iZXIoeWVhclN0cik7XG4gICAgbGV0IG1vbnRoID0gTnVtYmVyKG1vbnRoU3RyKTtcbiAgICBsZXQgaG91ciA9IE51bWJlcihob3VyU3RyKTtcbiAgICBsZXQgbWludXRlID0gTnVtYmVyKG1pbnV0ZVN0cik7XG4gICAgbGV0IHNlY29uZCA9IE51bWJlcihzZWNvbmRTdHIpO1xuXG4gICAgaWYgKHRpbWV6b25lU2lnbiA9PT0gXCItXCIgfHwgdGltZXpvbmVTaWduID09PSBcIitcIikge1xuICAgICAgY29uc3QgdGltZXpvbmVIb3VyID0gTnVtYmVyKHRpbWV6b25lSG91clN0cik7XG4gICAgICBjb25zdCB0aW1lem9uZU1pbnV0ZSA9IE51bWJlcih0aW1lem9uZU1pbnV0ZVN0cik7XG5cbiAgICAgIGlmICh0aW1lem9uZVNpZ24gPT09IFwiLVwiKSB7XG4gICAgICAgIGhvdXIgKz0gdGltZXpvbmVIb3VyO1xuICAgICAgICBtaW51dGUgKz0gdGltZXpvbmVNaW51dGU7XG4gICAgICB9IGVsc2UgaWYgKHRpbWV6b25lU2lnbiA9PT0gXCIrXCIpIHtcbiAgICAgICAgaG91ciAtPSB0aW1lem9uZUhvdXI7XG4gICAgICAgIG1pbnV0ZSAtPSB0aW1lem9uZU1pbnV0ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1pbnV0ZSA+IDU5KSB7XG4gICAgICAgIGhvdXIgKz0gMTtcbiAgICAgICAgbWludXRlIC09IDYwO1xuICAgICAgfSBlbHNlIGlmIChtaW51dGUgPCAwKSB7XG4gICAgICAgIGhvdXIgLT0gMTtcbiAgICAgICAgbWludXRlICs9IDYwO1xuICAgICAgfVxuXG4gICAgICBpZiAoaG91ciA+IDIzKSB7XG4gICAgICAgIGRheSArPSAxO1xuICAgICAgICBob3VyIC09IDI0O1xuICAgICAgfSBlbHNlIGlmIChob3VyIDwgMCkge1xuICAgICAgICBkYXkgLT0gMTtcbiAgICAgICAgaG91ciArPSAyNDtcbiAgICAgIH1cblxuICAgICAgaWYgKGRheSA+IDMxKSB7XG4gICAgICAgIG1vbnRoICs9IDE7XG4gICAgICAgIGRheSAtPSAzMTtcbiAgICAgIH0gZWxzZSBpZiAoZGF5IDwgMSkge1xuICAgICAgICBtb250aCAtPSAxO1xuICAgICAgICBkYXkgKz0gMzE7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb250aCA+IDEyKSB7XG4gICAgICAgIHllYXIgKz0gMTtcbiAgICAgICAgbW9udGggLT0gMTI7XG4gICAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMSkge1xuICAgICAgICB5ZWFyIC09IDE7XG4gICAgICAgIG1vbnRoICs9IDEyO1xuICAgICAgfVxuXG4gICAgICBpZiAoeWVhciA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gWzMxLCAsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IGRheXNJbk1vbnRoW21vbnRoIC0gMV07XG5cbiAgICBpZiAoZGF5ID4gbWF4RGF5cykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIExlYXAgc2Vjb25kc1xuICAgIGlmIChzZWNvbmQgPT09IDYwICYmIChtaW51dGUgIT09IDU5IHx8IGhvdXIgIT09IDIzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICB1cmkoZGF0YSkge1xuICAgIHJldHVybiAvXlthLXpBLVpdW2EtekEtWjAtOStcXC0uXSo6W15cXHNdKiQvLnRlc3QoZGF0YSk7XG4gIH0sXG4gIGVtYWlsKGRhdGEpIHtcbiAgICByZXR1cm4gL14oPyFcXC4pKD8hLipcXC4kKVthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXXsxLDIwfSg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXXsxLDIxfSl7MCwyfUBbYS16MC05XSg/OlthLXowLTktXXswLDYxfVthLXowLTldKT8oPzpcXC5bYS16MC05XSg/OlthLXowLTktXXswLDYwfVthLXowLTldKT8pezAsM30kL2kudGVzdChcbiAgICAgIGRhdGFcbiAgICApO1xuICB9LFxuICBpcHY0KGRhdGEpIHtcbiAgICAvLyBNYXRjaGVzIGEgc3RyaW5nIGZvcm1lZCBieSA0IG51bWJlcnMgYmV0d2VlbiAwIGFuZCAyNTUgc2VwYXJhdGVkIGJ5IGRvdHMgd2l0aG91dCBsZWFkaW5nIHplcm9zXG4gICAgLy8gL14oKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSgyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKSQvXG4gICAgcmV0dXJuIC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSkkLy50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG5cbiAgLy8gaXB2NjogaXNNeUlwVmFsaWQoeyB2ZXJzaW9uOiA2IH0pLFxuICBpcHY2KGRhdGEpIHtcbiAgICBpZiAoZGF0YSA9PT0gXCI6OlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBkYXRhLmluZGV4T2YoXCI6XCIpID09PSAtMSB8fFxuICAgICAgLyg/Olxccyt8Ojo6K3xeXFx3ezUsfXxcXHd7NX0kfF46ezF9XFx3fFxcdzp7MX0kKS8udGVzdChkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0lwdjQgPSBkYXRhLmluZGV4T2YoXCIuXCIpICE9PSAtMTtcbiAgICBsZXQgYWRkcmVzc1BhcnRzID0gZGF0YTtcblxuICAgIGlmIChoYXNJcHY0KSB7XG4gICAgICBhZGRyZXNzUGFydHMgPSBkYXRhLnNwbGl0KFwiOlwiKTtcbiAgICAgIGNvbnN0IGlwdjRQYXJ0ID0gYWRkcmVzc1BhcnRzLnBvcCgpO1xuICAgICAgaWYgKFxuICAgICAgICAhL14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKSQvLnRlc3QoXG4gICAgICAgICAgaXB2NFBhcnRcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc1Nob3J0ZW5lZCA9IGRhdGEuaW5kZXhPZihcIjo6XCIpICE9PSAtMTtcbiAgICBjb25zdCBpcHY2UGFydCA9IGhhc0lwdjQgPyBhZGRyZXNzUGFydHMuam9pbihcIjpcIikgOiBkYXRhO1xuXG4gICAgaWYgKGlzU2hvcnRlbmVkKSB7XG4gICAgICBpZiAoaXB2NlBhcnQuc3BsaXQoXCI6OlwiKS5sZW5ndGggLSAxID4gMSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghL15bMC05YS1mQS1GOi5dKiQvLnRlc3QoaXB2NlBhcnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC9eKD86KD86KD86WzAtOWEtZkEtRl17MSw0fSg/Ojp8JCkpezEsNn0pKXwoPzo6Oig/OlswLTlhLWZBLUZdezEsNH0pKXswLDV9JC8udGVzdChcbiAgICAgICAgaXB2NlBhcnRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNJcHY2VmFsaWQgPVxuICAgICAgL14oPzooPzpbMC05YS1mQS1GXXsxLDR9Oil7N30oPzpbMC05YS1mQS1GXXsxLDR9fDopKSQvLnRlc3QoaXB2NlBhcnQpO1xuXG4gICAgY29uc3QgaGFzSW52YWxpZENoYXIgPSAvKD86WzAtOWEtZkEtRl17NSx9fFxcRFswLTlhLWZBLUZdezN9OikvLnRlc3QoXG4gICAgICBpcHY2UGFydFxuICAgICk7XG5cbiAgICBpZiAoaGFzSXB2NCkge1xuICAgICAgcmV0dXJuIGlzSXB2NlZhbGlkIHx8ICFoYXNJbnZhbGlkQ2hhcjtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNJcHY2VmFsaWQgJiYgIWhhc0ludmFsaWRDaGFyO1xuICB9LFxuXG4gIGhvc3RuYW1lKGRhdGEpIHtcbiAgICByZXR1cm4gL15bYS16MC05XVthLXowLTktXXswLDYyfSg/OlxcLlthLXowLTldW2EtejAtOS1dezAsNjJ9KSpbYS16MC05XSQvaS50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG4gIGRhdGUoZGF0YSkge1xuICAgIGlmICgvXihcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pJC8udGVzdChkYXRhKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gIWlzTmFOKG5ldyBEYXRlKGRhdGEpLmdldFRpbWUoKSk7XG4gIH0sXG4gIHJlZ2V4KGRhdGEpIHtcbiAgICB0cnkge1xuICAgICAgbmV3IFJlZ0V4cChkYXRhKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIFwianNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gL15cXC8oPzpbXn5dfH4wfH4xKSokLy50ZXN0KGRhdGEpO1xuICB9LFxuICBcInJlbGF0aXZlLWpzb24tcG9pbnRlclwiKGRhdGEpIHtcbiAgICBpZiAoZGF0YSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIC9eKFswLTldKykoI3xcXC8oPzpbXn5dfH4wfH4xKSopPyQvLnRlc3QoZGF0YSk7XG4gIH0sXG4gIHRpbWUoZGF0YSkge1xuICAgIHJldHVybiAvXihcXGR7Mn0pOihcXGR7Mn0pOihcXGR7Mn0pKFxcLlxcZCspPyhafChbKy1dKShcXGR7Mn0pOihcXGR7Mn0pKSQvLnRlc3QoXG4gICAgICBkYXRhXG4gICAgKTtcbiAgfSxcbiAgXCJ1cmktcmVmZXJlbmNlXCIoZGF0YSkge1xuICAgIGlmICgvXFxcXC8udGVzdChkYXRhKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAvXigoW146Lz8jXSspOik/KFxcL1xcLyhbXi8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoKD8hW14jXSpcXFxcKVteI10qKSk/L2kudGVzdChcbiAgICAgIGRhdGFcbiAgICApO1xuICB9LFxuICBcInVyaS10ZW1wbGF0ZVwiKGRhdGEpIHtcbiAgICByZXR1cm4gL14oPzooPzpodHRwcz86XFwvXFwvW1xcdy4tXSspP1xcLz8pP1tcXHctIDssLlxcLz8lJj1dKig/Olxce1tcXHctXSsoPzo6XFxkKyk/XFx9W1xcdy0gOywuXFwvPyUmPV0qKSpcXC8/JC8udGVzdChcbiAgICAgIGRhdGFcbiAgICApO1xuICB9LFxuXG4gIC8vIE5vdCBzdXBwb3J0ZWQgeWV0XG4gIGR1cmF0aW9uOiBmYWxzZSxcbiAgdXVpZDogZmFsc2UsXG4gIFwiaWRuLWVtYWlsXCI6IGZhbHNlLFxuICBcImlkbi1ob3N0bmFtZVwiOiBmYWxzZSxcbiAgaXJpOiBmYWxzZSxcbiAgXCJpcmktcmVmZXJlbmNlXCI6IGZhbHNlXG59O1xuIiwiaW1wb3J0IHsgVHlwZUZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGNvbnN0IFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIG9iamVjdChkYXRhKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGRhdGEpO1xuICB9LFxuICBhcnJheShkYXRhKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgZGF0YSAhPT0gbnVsbCAmJlxuICAgICAgXCJsZW5ndGhcIiBpbiBkYXRhICYmXG4gICAgICBcIjBcIiBpbiBkYXRhICYmXG4gICAgICBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggLSAxID09PSBkYXRhLmxlbmd0aFxuICAgICk7XG4gIH0sXG4gIHN0cmluZyhkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiO1xuICB9LFxuICBudW1iZXIoZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJudW1iZXJcIjtcbiAgfSxcbiAgaW50ZWdlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiICYmIGRhdGEgJSAxID09PSAwO1xuICB9LFxuICBib29sZWFuKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwiYm9vbGVhblwiO1xuICB9LFxuICBudWxsKGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YSA9PT0gbnVsbDtcbiAgfSxcblxuICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0XG4gIHRpbWVzdGFtcDogZmFsc2UsXG4gIGludDg6IGZhbHNlLFxuICB1bml0ODogZmFsc2UsXG4gIGludDE2OiBmYWxzZSxcbiAgdW5pdDE2OiBmYWxzZSxcbiAgaW50MzI6IGZhbHNlLFxuICB1bml0MzI6IGZhbHNlLFxuICBmbG9hdDMyOiBmYWxzZSxcbiAgZmxvYXQ2NDogZmFsc2VcblxuXG59O1xuIiwiaW1wb3J0IHsgQXJyYXlLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL2FycmF5LWtleXdvcmRzXCI7XG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHsgTnVtYmVyS2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9udW1iZXIta2V5d29yZHNcIjtcbmltcG9ydCB7IE9iamVjdEtleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvb2JqZWN0LWtleXdvcmRzXCI7XG5pbXBvcnQgeyBPdGhlcktleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvb3RoZXIta2V5d29yZHNcIjtcbmltcG9ydCB7IFN0cmluZ0tleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvc3RyaW5nLWtleXdvcmRzXCI7XG5cbmV4cG9ydCBjb25zdCBrZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICAuLi5PYmplY3RLZXl3b3JkcyxcbiAgLi4uQXJyYXlLZXl3b3JkcyxcbiAgLi4uU3RyaW5nS2V5d29yZHMsXG4gIC4uLk51bWJlcktleXdvcmRzLFxuICAuLi5PdGhlcktleXdvcmRzXG59O1xuIiwiaW1wb3J0IHsgaXNDb21waWxlZFNjaGVtYSwgaXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBPYmplY3RLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICAvLyBPYmplY3RcbiAgcmVxdWlyZWQoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5yZXF1aXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gc2NoZW1hLnJlcXVpcmVkW2ldO1xuICAgICAgaWYgKCFkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUmVxdWlyZWQgcHJvcGVydHkgaXMgbWlzc2luZ1wiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgcHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYS5wcm9wZXJ0aWVzKSkge1xuICAgICAgaWYgKCFkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hUHJvcCA9IHNjaGVtYS5wcm9wZXJ0aWVzW2tleV07XG4gICAgICAgIGlmIChpc09iamVjdChzY2hlbWFQcm9wKSAmJiBcImRlZmF1bHRcIiBpbiBzY2hlbWFQcm9wKSB7XG4gICAgICAgICAgZGF0YVtrZXldID0gc2NoZW1hUHJvcC5kZWZhdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGlmIChzY2hlbWEucHJvcGVydGllc1trZXldID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IGlzIG5vdCBhbGxvd2VkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEucHJvcGVydGllc1trZXldKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLnByb3BlcnRpZXNba2V5XS4kdmFsaWRhdGUoZGF0YVtrZXldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICB2YWx1ZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkgfHwgIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLnZhbHVlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEudmFsdWVzLiR2YWxpZGF0ZShkYXRhW2tleV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IGlzIGludmFsaWRcIiwge1xuICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtYXhQcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpIHx8IE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA8PSBzY2hlbWEubWF4UHJvcGVydGllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlRvbyBtYW55IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1pblByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkgfHwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID49IHNjaGVtYS5taW5Qcm9wZXJ0aWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVG9vIGZldyBwcm9wZXJ0aWVzXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBhZGRpdGlvbmFsUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICBjb25zdCBpc0NvbXBpbGVkID0gaXNDb21waWxlZFNjaGVtYShzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcyAmJiBzY2hlbWEucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gaW4gc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgaWYgKG5ldyBSZWdFeHAocGF0dGVybiwgXCJ1XCIpLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0NvbXBpbGVkKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiR2YWxpZGF0ZShkYXRhW2tleV0pO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBZGRpdGlvbmFsIHByb3BlcnRpZXMgYXJlIGludmFsaWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgcGF0dGVyblByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXR0ZXJucyA9IE9iamVjdC5rZXlzKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyk7XG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgXCJ1XCIpO1xuICAgICAgaWYgKHR5cGVvZiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXNbcGF0dGVybl0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGlmIChzY2hlbWEucGF0dGVyblByb3BlcnRpZXNbcGF0dGVybl0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgaWYgKHJlZ2V4LnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgaWYgKHJlZ2V4LnRlc3Qoa2V5KSkge1xuICAgICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEucGF0dGVyblByb3BlcnRpZXNbcGF0dGVybl0uJHZhbGlkYXRlKFxuICAgICAgICAgICAgICBkYXRhW2tleV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHByb3BlcnR5TmFtZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEucHJvcGVydHlOYW1lcyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWEucHJvcGVydHlOYW1lcyA9PT0gZmFsc2UgJiYgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5wcm9wZXJ0eU5hbWVzKSkge1xuICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEucHJvcGVydHlOYW1lcy4kdmFsaWRhdGUoa2V5KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgbmFtZSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGRlcGVuZGVuY2llcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgIGlmIChrZXkgaW4gZGF0YSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlcGVuZGVuY3kgPSBzY2hlbWEuZGVwZW5kZW5jaWVzW2tleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkZXBlbmRlbmN5KSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcGVuZGVuY3kubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIShkZXBlbmRlbmN5W2ldIGluIGRhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZXBlbmRlbmN5IGlzIG5vdCBzYXRpc2ZpZWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBkYXRhOiBkZXBlbmRlbmN5W2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRlcGVuZGVuY3kgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGlmIChkZXBlbmRlbmN5KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHsgZGF0YTogZGVwZW5kZW5jeSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkZXBlbmRlbmN5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmIChkZXBlbmRlbmN5IGluIGRhdGEpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZXBlbmRlbmN5IGlzIG5vdCBzYXRpc2ZpZWRcIiwgeyBkYXRhOiBkZXBlbmRlbmN5IH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3IgPSBkZXBlbmRlbmN5LiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZXBlbmRlbmN5IGlzIG5vdCBzYXRpc2ZpZWRcIiwge1xuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICAvLyBSZXF1aXJlZCBieSBvdGhlciBrZXl3b3JkcyBidXQgbm90IHVzZWQgYXMgYSBmdW5jdGlvbiBpdHNlbGZcbiAgdGhlbjogZmFsc2UsXG4gIGVsc2U6IGZhbHNlLFxuICBkZWZhdWx0OiBmYWxzZSxcblxuICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0XG4gICRyZWY6IGZhbHNlLFxuICBkZWZpbml0aW9uczogZmFsc2UsXG4gICRpZDogZmFsc2UsXG4gICRzY2hlbWE6IGZhbHNlLFxuXG4gIC8vIE1ldGFkYXRhIGtleXdvcmRzIChub3QgdXNlZCBhcyBhIGZ1bmN0aW9uKVxuICB0aXRsZTogZmFsc2UsXG4gIGRlc2NyaXB0aW9uOiBmYWxzZSxcbiAgJGNvbW1lbnQ6IGZhbHNlLFxuICBleGFtcGxlczogZmFsc2UsXG4gIGNvbnRlbnRNZWRpYVR5cGU6IGZhbHNlLFxuICBjb250ZW50RW5jb2Rpbmc6IGZhbHNlLFxuXG4gIC8vIE5vdCBzdXBwb3J0ZWQgT3BlbiBBUEkga2V5d29yZHNcbiAgZGlzY3JpbWluYXRvcjogZmFsc2UsXG4gIG51bGxhYmxlOiBmYWxzZVxufTtcbiIsImltcG9ydCB7IGlzQ29tcGlsZWRTY2hlbWEsIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuXG5leHBvcnQgY29uc3QgQXJyYXlLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgaXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYUl0ZW1zID0gc2NoZW1hLml0ZW1zO1xuICAgIGNvbnN0IGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAgIGlmICh0eXBlb2Ygc2NoZW1hSXRlbXMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hSXRlbXMgPT09IGZhbHNlICYmIGRhdGFMZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgYWxsb3dlZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFJdGVtcykpIHtcbiAgICAgIGNvbnN0IHNjaGVtYUl0ZW1zTGVuZ3RoID0gc2NoZW1hSXRlbXMubGVuZ3RoO1xuICAgICAgY29uc3QgaXRlbXNMZW5ndGggPSBNYXRoLm1pbihzY2hlbWFJdGVtc0xlbmd0aCwgZGF0YUxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hSXRlbSA9IHNjaGVtYUl0ZW1zW2ldO1xuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYUl0ZW0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYUl0ZW0gPT09IGZhbHNlICYmIHR5cGVvZiBkYXRhW2ldICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIG5vdCBhbGxvd2VkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hSXRlbSkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYUl0ZW0uJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYUl0ZW1zKSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWFJdGVtcy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGVsZW1lbnRzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsZW1lbnRzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEuZWxlbWVudHMuJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgbWluSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA+PSBzY2hlbWEubWluSXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gc2hvcnRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPD0gc2NoZW1hLm1heEl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXMgdG9vIGxvbmdcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxJdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFzY2hlbWEuaXRlbXMgfHwgaXNPYmplY3Qoc2NoZW1hLml0ZW1zKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzY2hlbWEuYWRkaXRpb25hbEl0ZW1zID09PSBmYWxzZSkge1xuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gc2NoZW1hLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gbG9uZ1wiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0KHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuYWRkaXRpb25hbEl0ZW1zKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gc2NoZW1hLml0ZW1zLmxlbmd0aDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMuJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHVuaXF1ZUl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgIXNjaGVtYS51bmlxdWVJdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVuaXF1ZSA9IG5ldyBTZXQoKTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgICBsZXQgaXRlbVN0cjtcblxuICAgICAgLy8gQ2hhbmdlIHN0cmluZyB0byBcInN0cmluZ1wiIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlc1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGl0ZW1TdHIgPSBgczoke2l0ZW19YDtcbiAgICAgICAgLy8gU29ydCBvYmplY3Qga2V5cyB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXNcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgICAgaXRlbVN0ciA9IGBvOiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaXRlbSkuc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICAgICAgICApXG4gICAgICAgICl9YDtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICBpdGVtU3RyID0gSlNPTi5zdHJpbmdpZnkoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtU3RyID0gU3RyaW5nKGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodW5pcXVlLmhhcyhpdGVtU3RyKSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtcyBhcmUgbm90IHVuaXF1ZVwiLCB7IGRhdGE6IGl0ZW0gfSk7XG4gICAgICB9XG4gICAgICB1bmlxdWUuYWRkKGl0ZW1TdHIpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBjb250YWlucyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmNvbnRhaW5zID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5jb250YWlucykge1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGl0ZW1cIiwgeyBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgbXVzdCBub3QgY29udGFpbiBhbnkgaXRlbXNcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEuY29udGFpbnMuJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGl0ZW1cIiwgeyBkYXRhIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBTdHJpbmdLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgbWluTGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPj0gc2NoZW1hLm1pbkxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIHNob3J0ZXIgdGhhbiB0aGUgbWluaW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heExlbmd0aChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiIHx8IGRhdGEubGVuZ3RoIDw9IHNjaGVtYS5tYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIHBhdHRlcm4oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdHRlcm5SZWdleHAgPSBuZXcgUmVnRXhwKHNjaGVtYS5wYXR0ZXJuLCBcInVcIik7XG5cbiAgICBpZiAocGF0dGVyblJlZ2V4cCBpbnN0YW5jZW9mIFJlZ0V4cCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBpZiAocGF0dGVyblJlZ2V4cC50ZXN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm5cIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIC8vIFRha2UgaW50byBhY2NvdW50IHRoYXQgaWYgd2UgcmVjZWl2ZSBhIGZvcm1hdCB0aGF0IGlzIG5vdCBkZWZpbmVkLCB3ZVxuICAvLyB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvciwgd2UganVzdCBpZ25vcmUgaXQuXG4gIGZvcm1hdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yLCBpbnN0YW5jZSkge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdFZhbGlkYXRlID0gaW5zdGFuY2UuZ2V0Rm9ybWF0KHNjaGVtYS5mb3JtYXQpO1xuICAgIGlmICghZm9ybWF0VmFsaWRhdGUgfHwgZm9ybWF0VmFsaWRhdGUoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0XCIsIHsgZGF0YSB9KTtcbiAgfVxufTtcbiIsImltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHsgYXJlQ2xvc2VFbm91Z2ggfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNvbnN0IE51bWJlcktleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBtaW5pbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1pbiA9IHNjaGVtYS5taW5pbXVtO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1pbiA9IHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICsgMWUtMTU7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gdHJ1ZSkge1xuICAgICAgbWluICs9IDFlLTE1O1xuICAgIH1cblxuICAgIGlmIChkYXRhIDwgbWluKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW1cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtYXhpbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1heCA9IHNjaGVtYS5tYXhpbXVtO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1heCA9IHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtIC0gMWUtMTU7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gdHJ1ZSkge1xuICAgICAgbWF4IC09IDFlLTE1O1xuICAgIH1cblxuICAgIGlmIChkYXRhID4gbWF4KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW1cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtdWx0aXBsZU9mKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcXVvdGllbnQgPSBkYXRhIC8gc2NoZW1hLm11bHRpcGxlT2Y7XG5cbiAgICBpZiAoIWlzRmluaXRlKHF1b3RpZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghYXJlQ2xvc2VFbm91Z2gocXVvdGllbnQsIE1hdGgucm91bmQocXVvdGllbnQpKSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIG11bHRpcGxlT2ZcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBleGNsdXNpdmVNaW5pbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgXCJtaW5pbXVtXCIgaW4gc2NoZW1hXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPD0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBleGNsdXNpdmVNaW5pbXVtXCIpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBleGNsdXNpdmVNYXhpbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgXCJtYXhpbXVtXCIgaW4gc2NoZW1hXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPj0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcbiAgICAgICAgXCJWYWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1heGltdW1cIixcbiAgICAgICAgeyBkYXRhIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgZGVlcEVxdWFsLCBpc0NvbXBpbGVkU2NoZW1hLCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE90aGVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIGVudW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIC8vIENoZWNrIGlmIGRhdGEgaXMgYW4gYXJyYXkgb3IgYW4gb2JqZWN0XG4gICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoZGF0YSk7XG4gICAgY29uc3QgaXNPYmplY3QgPSB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBkYXRhICE9PSBudWxsO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuZW51bS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZW51bUl0ZW0gPSBzY2hlbWEuZW51bVtpXTtcblxuICAgICAgLy8gU2ltcGxlIGVxdWFsaXR5IGNoZWNrXG4gICAgICBpZiAoZW51bUl0ZW0gPT09IGRhdGEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBkYXRhIGlzIGFuIGFycmF5IG9yIGFuIG9iamVjdCwgY2hlY2sgZm9yIGRlZXAgZXF1YWxpdHlcbiAgICAgIGlmIChcbiAgICAgICAgKGlzQXJyYXkgJiYgQXJyYXkuaXNBcnJheShlbnVtSXRlbSkpIHx8XG4gICAgICAgIChpc09iamVjdCAmJiB0eXBlb2YgZW51bUl0ZW0gPT09IFwib2JqZWN0XCIgJiYgZW51bUl0ZW0gIT09IG51bGwpXG4gICAgICApIHtcbiAgICAgICAgaWYgKGRlZXBFcXVhbChlbnVtSXRlbSwgZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3Qgb25lIG9mIHRoZSBhbGxvd2VkIHZhbHVlc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWxsT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmFsbE9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFsbE9mW2ldKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEuYWxsT2ZbaV0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hbGxPZltpXS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBjYXVzZTogZXJyb3IsIGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNjaGVtYS5hbGxPZltpXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKEJvb2xlYW4oZGF0YSkgIT09IHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhICE9PSBzY2hlbWEuYWxsT2ZbaV0pIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgYW55T2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmFueU9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFueU9mW2ldKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEuYW55T2ZbaV0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hbnlPZltpXS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYS5hbnlPZltpXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBpZiAoQm9vbGVhbihkYXRhKSA9PT0gc2NoZW1hLmFueU9mW2ldKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEgPT09IHNjaGVtYS5hbnlPZltpXSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgb25lT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGxldCB2YWxpZENvdW50ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5vbmVPZi5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlzT2JqZWN0KHNjaGVtYS5vbmVPZltpXSkpIHtcbiAgICAgICAgaWYgKFwiJHZhbGlkYXRlXCIgaW4gc2NoZW1hLm9uZU9mW2ldKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEub25lT2ZbaV0uJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIHZhbGlkQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLm9uZU9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChCb29sZWFuKGRhdGEpID09PSBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICAgIHZhbGlkQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YSA9PT0gc2NoZW1hLm9uZU9mW2ldKSB7XG4gICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkQ291bnQgPT09IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGNvbnN0KHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoXG4gICAgICBkYXRhID09PSBzY2hlbWEuY29uc3QgfHxcbiAgICAgIChpc09iamVjdChkYXRhKSAmJlxuICAgICAgICBpc09iamVjdChzY2hlbWEuY29uc3QpICYmXG4gICAgICAgIGRlZXBFcXVhbChkYXRhLCBzY2hlbWEuY29uc3QpKSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkoZGF0YSkgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShzY2hlbWEuY29uc3QpICYmXG4gICAgICAgIGRlZXBFcXVhbChkYXRhLCBzY2hlbWEuY29uc3QpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGlmKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoXCJ0aGVuXCIgaW4gc2NoZW1hID09PSBmYWxzZSAmJiBcImVsc2VcIiBpbiBzY2hlbWEgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmlmID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5pZikge1xuICAgICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEudGhlbikpIHtcbiAgICAgICAgICByZXR1cm4gc2NoZW1hLnRoZW4uJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsc2UpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuZWxzZS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5pZikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5pZi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgaWYgKCFlcnJvcikge1xuICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLnRoZW4pKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEudGhlbi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5lbHNlKSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLmVsc2UuJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSxcblxuICBub3Qoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLm5vdCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWEubm90KSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0KHNjaGVtYS5ub3QpKSB7XG4gICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEubm90KSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLm5vdC4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBjYXVzZTogZXJyb3IsIGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IHtcbiAgRGVmaW5lRXJyb3JGdW5jdGlvbixcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBkZWVwQ2xvbmUsXG4gIGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5LFxuICBnZXROYW1lZEZ1bmN0aW9uLFxuICBpc09iamVjdFxufSBmcm9tIFwiLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBGb3JtYXRzIH0gZnJvbSBcIi4vZm9ybWF0c1wiO1xuaW1wb3J0IHsgVHlwZXMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsga2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkc1wiO1xuXG5leHBvcnQgdHlwZSBSZXN1bHQgPSB2b2lkIHwgVmFsaWRhdGlvbkVycm9yO1xuXG5leHBvcnQgaW50ZXJmYWNlIEtleXdvcmRGdW5jdGlvbiB7XG4gIChcbiAgICBzY2hlbWE6IENvbXBpbGVkU2NoZW1hLFxuICAgIGRhdGE6IGFueSxcbiAgICBkZWZpbmVFcnJvcjogRGVmaW5lRXJyb3JGdW5jdGlvbixcbiAgICBpbnN0YW5jZTogU2NoZW1hU2hpZWxkXG4gICk6IFJlc3VsdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlRnVuY3Rpb24ge1xuICAoZGF0YTogYW55KTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXRGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRlRnVuY3Rpb24ge1xuICAoZGF0YTogYW55KTogUmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkU2NoZW1hIHtcbiAgJHZhbGlkYXRlPzogVmFsaWRhdGVGdW5jdGlvbjtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvciB7XG4gIChkYXRhOiBhbnkpOiB7IGRhdGE6IGFueTsgZXJyb3I6IFZhbGlkYXRpb25FcnJvciB8IG51bGw7IHZhbGlkOiBib29sZWFuIH07XG4gIGNvbXBpbGVkU2NoZW1hOiBDb21waWxlZFNjaGVtYTtcbn1cblxuZXhwb3J0IGNsYXNzIFNjaGVtYVNoaWVsZCB7XG4gIHByaXZhdGUgdHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGltbXV0YWJsZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBpbW11dGFibGUgPSBmYWxzZVxuICB9OiB7XG4gICAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7XG5cbiAgICBmb3IgKGNvbnN0IFt0eXBlLCB2YWxpZGF0b3JdIG9mIE9iamVjdC5lbnRyaWVzKFR5cGVzKSkge1xuICAgICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgICB0aGlzLmFkZFR5cGUodHlwZSwgdmFsaWRhdG9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXl3b3JkLCB2YWxpZGF0b3JdIG9mIE9iamVjdC5lbnRyaWVzKGtleXdvcmRzKSkge1xuICAgICAgdGhpcy5hZGRLZXl3b3JkKGtleXdvcmQsIHZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2Zvcm1hdCwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhGb3JtYXRzKSkge1xuICAgICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgICB0aGlzLmFkZEZvcm1hdChmb3JtYXQsIHZhbGlkYXRvciBhcyBGb3JtYXRGdW5jdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkVHlwZShuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogVHlwZUZ1bmN0aW9uLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLnR5cGVzW25hbWVdICYmICFvdmVyd3JpdGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYFR5cGUgXCIke25hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgdGhpcy50eXBlc1tuYW1lXSA9IHZhbGlkYXRvcjtcbiAgfVxuXG4gIGdldFR5cGUodHlwZTogc3RyaW5nKTogVHlwZUZ1bmN0aW9uIHwgZmFsc2Uge1xuICAgIHJldHVybiB0aGlzLnR5cGVzW3R5cGVdO1xuICB9XG5cbiAgYWRkRm9ybWF0KG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBGb3JtYXRGdW5jdGlvbiwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5mb3JtYXRzW25hbWVdICYmICFvdmVyd3JpdGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYEZvcm1hdCBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgICB0aGlzLmZvcm1hdHNbbmFtZV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBnZXRGb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiBGb3JtYXRGdW5jdGlvbiB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRzW2Zvcm1hdF07XG4gIH1cblxuICBhZGRLZXl3b3JkKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBLZXl3b3JkRnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMua2V5d29yZHNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgS2V5d29yZCBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgICB0aGlzLmtleXdvcmRzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0S2V5d29yZChrZXl3b3JkOiBzdHJpbmcpOiBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMua2V5d29yZHNba2V5d29yZF07XG4gIH1cblxuICBjb21waWxlKHNjaGVtYTogYW55KTogVmFsaWRhdG9yIHtcbiAgICBjb25zdCBjb21waWxlZFNjaGVtYSA9IHRoaXMuY29tcGlsZVNjaGVtYShzY2hlbWEpO1xuICAgIGlmICghY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlKSB7XG4gICAgICBpZiAodGhpcy5pc1NjaGVtYUxpa2Uoc2NoZW1hKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcIkludmFsaWQgc2NoZW1hXCIpO1xuICAgICAgfVxuXG4gICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICBcImFueVwiLFxuICAgICAgICAoKSA9PiB7fVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZTogVmFsaWRhdG9yID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgY29uc3QgY2xvbmVkRGF0YSA9IHRoaXMuaW1tdXRhYmxlID8gZGVlcENsb25lKGRhdGEpIDogZGF0YTtcbiAgICAgIGNvbnN0IGVycm9yID0gY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlKGNsb25lZERhdGEpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBjbG9uZWREYXRhLFxuICAgICAgICBlcnJvcjogZXJyb3IgPyBlcnJvciA6IG51bGwsXG4gICAgICAgIHZhbGlkOiAhZXJyb3JcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLmNvbXBpbGVkU2NoZW1hID0gY29tcGlsZWRTY2hlbWE7XG5cbiAgICByZXR1cm4gdmFsaWRhdGU7XG4gIH1cblxuICBwcml2YXRlIGNvbXBpbGVTY2hlbWEoc2NoZW1hOiBQYXJ0aWFsPENvbXBpbGVkU2NoZW1hPiB8IGFueSk6IENvbXBpbGVkU2NoZW1hIHtcbiAgICBpZiAoIWlzT2JqZWN0KHNjaGVtYSkpIHtcbiAgICAgIGlmIChzY2hlbWEgPT09IHRydWUpIHtcbiAgICAgICAgc2NoZW1hID0ge1xuICAgICAgICAgIGFueU9mOiBbe31dXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgICAgc2NoZW1hID0ge1xuICAgICAgICAgIG9uZU9mOiBbXVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZW1hID0ge1xuICAgICAgICAgIG9uZU9mOiBbc2NoZW1hXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hOiBDb21waWxlZFNjaGVtYSA9IHsgLi4uc2NoZW1hIH0gYXMgQ29tcGlsZWRTY2hlbWE7XG4gICAgY29uc3QgZGVmaW5lVHlwZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXCJ0eXBlXCIsIHNjaGVtYSk7XG4gICAgY29uc3QgdHlwZVZhbGlkYXRpb25zOiBUeXBlRnVuY3Rpb25bXSA9IFtdO1xuXG4gICAgbGV0IG1ldGhvZE5hbWUgPSBcIlwiO1xuXG4gICAgaWYgKFwidHlwZVwiIGluIHNjaGVtYSkge1xuICAgICAgY29uc3QgdHlwZXMgPSBBcnJheS5pc0FycmF5KHNjaGVtYS50eXBlKVxuICAgICAgICA/IHNjaGVtYS50eXBlXG4gICAgICAgIDogc2NoZW1hLnR5cGUuc3BsaXQoXCIsXCIpLm1hcCgodCkgPT4gdC50cmltKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZVZhbGlkYXRpb25zLnB1c2godmFsaWRhdG9yKTtcbiAgICAgICAgICBtZXRob2ROYW1lICs9IChtZXRob2ROYW1lID8gXCJfT1JfXCIgOiBcIlwiKSArIHZhbGlkYXRvci5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9IHR5cGVWYWxpZGF0aW9ucy5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlVmFsaWRhdGlvbnNMZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlIGZvciBzY2hlbWFcIiwgeyBkYXRhOiBzY2hlbWEudHlwZSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB0eXBlVmFsaWRhdGlvbiA9IHR5cGVWYWxpZGF0aW9uc1swXTtcbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXR5cGVWYWxpZGF0aW9uKGRhdGEpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZVZhbGlkYXRpb25zTGVuZ3RoID4gMSkge1xuICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZVZhbGlkYXRpb25zTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc1tpXShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYSkpIHtcbiAgICAgIGlmIChrZXkgPT09IFwidHlwZVwiKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLnR5cGUgPSBzY2hlbWEudHlwZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleXdvcmRWYWxpZGF0b3IgPSB0aGlzLmdldEtleXdvcmQoa2V5KTtcbiAgICAgIGlmIChrZXl3b3JkVmFsaWRhdG9yKSB7XG4gICAgICAgIGNvbnN0IGRlZmluZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoa2V5LCBzY2hlbWFba2V5XSk7XG4gICAgICAgIGlmIChjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgICAgICBjb25zdCBwcmV2VmFsaWRhdG9yID0gY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlO1xuICAgICAgICAgIG1ldGhvZE5hbWUgKz0gYF9BTkRfJHtrZXl3b3JkVmFsaWRhdG9yLm5hbWV9YDtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcHJldlZhbGlkYXRvcihkYXRhKTtcbiAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAoa2V5d29yZFZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pKFxuICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgZGVmaW5lRXJyb3IsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWV0aG9kTmFtZSA9IGtleXdvcmRWYWxpZGF0b3IubmFtZTtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIChkYXRhKSA9PlxuICAgICAgICAgICAgICAoa2V5d29yZFZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pKFxuICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgZGVmaW5lRXJyb3IsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSB0aGlzLmNvbXBpbGVTY2hlbWEoc2NoZW1hW2tleV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XS5tYXAoKHN1YlNjaGVtYSwgaW5kZXgpID0+XG4gICAgICAgICAgdGhpcy5pc1NjaGVtYUxpa2Uoc3ViU2NoZW1hKVxuICAgICAgICAgICAgPyB0aGlzLmNvbXBpbGVTY2hlbWEoc3ViU2NoZW1hKVxuICAgICAgICAgICAgOiBzdWJTY2hlbWFcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGlsZWRTY2hlbWEgYXMgQ29tcGlsZWRTY2hlbWE7XG4gIH1cblxuICBpc1NjaGVtYUxpa2Uoc3ViU2NoZW1hOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoaXNPYmplY3Qoc3ViU2NoZW1hKSkge1xuICAgICAgaWYgKFwidHlwZVwiIGluIHN1YlNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgc3ViS2V5IGluIHN1YlNjaGVtYSkge1xuICAgICAgICBpZiAoc3ViS2V5IGluIHRoaXMua2V5d29yZHMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ik1BRU8sSUFBTUEsRUFBTixjQUE4QkMsTUFDbkNDLFFBQ0FDLEtBQ0FDLFFBQ0FDLE1BQ0FDLEtBQWUsR0FDZkMsS0FDQUMsT0FFUUMsVUFBVUMsRUFBVSxLQUMxQixNQUFNSixFQUNKSSxFQUNBLElBQ0FDLEtBQUtQLGNBQ2lCLElBQWRPLEtBQUtSLEtBQXVCLElBQU1RLEtBQUtSLEtBQU8sSUFFeEQsT0FBS1EsS0FBS04sTUFLSE0sS0FBS04sTUFBTUksVUFBVUgsSUFKMUJLLEtBQUtMLEtBQU9BLEVBQ0xLLEtBSVgsQ0FFQUMsV0FDRSxPQUFPRCxLQUFLRixXQUNkLEdBYUssU0FBU0ksRUFDZEMsRUFDQU4sR0FFQSxNQUFNTyxFQUFlLElBQUlmLEVBQWdCLFdBQVdjLEtBQ3BEQyxFQUFhWCxRQUFVVSxFQUN2QkMsRUFBYVAsT0FBU0EsRUFVdEIsT0FBT1EsRUFDTCxlQUFlRixJQVR3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
|