survey-pdf 2.0.0-rc.0 → 2.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/survey.pdf.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * surveyjs - SurveyJS PDF library v2.0.0-rc.0
2
+ * surveyjs - SurveyJS PDF library v2.0.0-rc.2
3
3
  * Copyright (c) 2015-2025 Devsoft Baltic OÜ - http://surveyjs.io/
4
4
  * License: MIT (http://www.opensource.org/licenses/mit-license.php)
5
5
  */
@@ -3095,7 +3095,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
3095
3095
 
3096
3096
 
3097
3097
 
3098
- __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_51_survey_core__["checkLibraryVersion"])("".concat("2.0.0-rc.0"), 'survey-pdf');
3098
+ __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_51_survey_core__["checkLibraryVersion"])("".concat("2.0.0-rc.2"), 'survey-pdf');
3099
3099
 
3100
3100
 
3101
3101
  /***/ }),
@@ -12193,4 +12193,4 @@ var jspdf = __webpack_require__(18);
12193
12193
  /***/ })
12194
12194
  /******/ ]);
12195
12195
  });
12196
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBlNjcwZTZhOTBmNjdiMWZmN2E4OCIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9oZWxwZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZS50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiU3VydmV5XCIsXCJjb21tb25qczJcIjpcInN1cnZleS1jb3JlXCIsXCJjb21tb25qc1wiOlwic3VydmV5LWNvcmVcIixcImFtZFwiOlwic3VydmV5LWNvcmVcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2JyaWNrLnRzIiwid2VicGFjazovLy8uL3NyYy9kb2NfY29udHJvbGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9lbXB0eS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VudHJpZXMvcGRmLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3NlbGVjdGJhc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRib3gudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcImpzcGRmXCIsXCJjb21tb25qczJcIjpcImpzcGRmXCIsXCJjb21tb25qc1wiOlwianNwZGZcIixcImFtZFwiOlwianNwZGZcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kZWZhdWx0LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeG11bHRpcGxlLnRzIiwid2VicGFjazovLy8uL3NyYy9wYWdlX2xheW91dC9wYWdlX3BhY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfYm9vbGVhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jaGVja2JveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jb21tZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2ZpbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZXBpY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4ZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tdWx0aXBsZXRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF90ZXh0Ym94LnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9jdXN0b20udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9+L25vZGUtaW50ZXJ2YWwtdHJlZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9zaGFsbG93ZXF1YWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbG9yZWRicmljay50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZGVzY3JpcHRpb24udHMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvanNwZGZfcGx1Z2lucy9hY3JvZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvanNwZGZfcGx1Z2lucy9mcm9tX2h0bWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1EQUEyQyxjQUFjOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFB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SUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQUU7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUFFLENBQUMsQ0FBQztRQUNuRyxTQUFTLElBQUksQ0FBQyxNQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuSCxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFSyxTQUFVLFdBQVcsQ0FBQyxPQUFZLEVBQUUsSUFBUztJQUMvQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFPLEVBQUUsRUFBRSxHQUFHLEVBQU8sRUFBRSxFQUFFLEVBQUUsQ0FBTSxFQUFFLENBQU0sRUFBRSxDQUFNLEVBQUUsQ0FBTSxDQUFDO0lBQy9JLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUs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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdDQUFnQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHlCQUF5QjtBQUN4RDtBQUNBLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyx5RUFBeUU7QUFDbkg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsZ0RBQWdEOztBQUV2RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUNBQXVDLDJEQUEyRDtBQUNsRzs7QUFFQSwwQ0FBMEMsb0NBQW9DOztBQUU5RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEscUZBQXFGOztBQUVyRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsa0JBQWtCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQyx1REFBdUQ7QUFDekY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLDBDQUEwQztBQUN6Rix5QkFBeUI7QUFDekI7QUFDQTtBQUNBLCtDQUErQyx3Q0FBd0M7QUFDdkYseUJBQXlCO0FBQ3pCLCtDQUErQyx5QkFBeUI7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNB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aUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsTUFBTTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE1BQU07QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekIsa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0EsK0ZBQStGO0FBQy9GO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLHFHQUFxRztBQUNyRztBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtGQUErRjtBQUMvRjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSx5SkFBeUo7QUFDeko7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQSx5RkFBeUY7QUFDekY7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0EseUZBQXlGO0FBQ3pGO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHFHOzs7Ozs7O0FDNTJGRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztB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b0JBQW9CLGNBQWM7QUFDbEMsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEIsd0JBQXdCLE9BQU87QUFDL0IsaUJBQWlCLE9BQU87QUFDeEI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUciLCJmaWxlIjoiLi9wYWNrYWdlcy9zdXJ2ZXktcGRmL3N1cnZleS5wZGYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJzdXJ2ZXktY29yZVwiKSwgcmVxdWlyZShcImpzcGRmXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiU3VydmV5UERGXCIsIFtcInN1cnZleS1jb3JlXCIsIFwianNwZGZcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiU3VydmV5UERGXCJdID0gZmFjdG9yeShyZXF1aXJlKFwic3VydmV5LWNvcmVcIiksIHJlcXVpcmUoXCJqc3BkZlwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiU3VydmV5UERGXCJdID0gZmFjdG9yeShyb290W1wiU3VydmV5XCJdLCByb290W1wianNwZGZcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV82X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMThfXykge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxNCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZTY3MGU2YTkwZjY3YjFmZjdhODgiLCJkZWNsYXJlIHZhciBSZWZsZWN0OiBhbnk7XG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZDogYW55LCBiOiBhbnkpOiBhbnkge1xuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZDogYW55LCBiOiBhbnkpIHtcbiAgICBpZiAodHlwZW9mIGIgIT09ICdmdW5jdGlvbicgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2xhc3MgZXh0ZW5kcyB2YWx1ZSAnICsgU3RyaW5nKGIpICsgJyBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsJyk7XG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICAgIF9fYXNzaWduID0gKDxhbnk+T2JqZWN0KS5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odDogYW55KSB7XG4gICAgICAgIGZvciAodmFyIHM6IGFueSwgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzOiBhbnksIGU6IGFueSkge1xuICAgIHZhciB0OiBhbnkgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihxW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHFbaV0pKVxuICAgICAgICAgICAgICAgIHRbcVtpXV0gPSBzW3FbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnM6IGFueSwgdGFyZ2V0OiBhbnksIGtleTogYW55LCBkZXNjOiBhbnkpIHtcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09ICdmdW5jdGlvbicpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZzogYW55LCBfYXJndW1lbnRzOiBhbnksIFA6IGFueSwgZ2VuZXJhdG9yOiBhbnkpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZTogYW55KSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlOiBhbnkpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWU6IGFueSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWU6IGFueSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsndGhyb3cnXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0OiBhbnkpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZzogYW55LCBib2R5OiBhbnkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiA8YW55PltdLCBvcHM6IDxhbnk+W10gfSwgZjogYW55LCB5OiBhbnksIHQ6IGFueSwgZzogYW55O1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCAndGhyb3cnOiB2ZXJiKDEpLCAncmV0dXJuJzogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobjogYW55KSB7IHJldHVybiBmdW5jdGlvbiAodjogYW55KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wOiBhbnkpIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4nKTtcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5WydyZXR1cm4nXSA6IG9wWzBdID8geVsndGhyb3cnXSB8fCAoKHQgPSB5WydyZXR1cm4nXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7ICg8YW55Pl8pID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSAodG86IGFueSwgZnJvbTogYW55LCBwYWNrOiBhbnkpIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjogYW55OyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMvaGVscGVycy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb24sIFF1ZXN0aW9uUmF0aW5nTW9kZWwsIFF1ZXN0aW9uRmlsZU1vZGVsLCBMb2NhbGl6YWJsZVN0cmluZywgUXVlc3Rpb25TZWxlY3RCYXNlLCBRdWVzdGlvbkRyb3Bkb3duTW9kZWwsIHNldHRpbmdzIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0ICogYXMgU3VydmV5UERGTW9kdWxlIGZyb20gJy4vZW50cmllcy9wZGYnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSUZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBJSFRNTFJlbmRlclR5cGUgfSBmcm9tICcuL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbCc7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgVGV4dEJvbGRCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQnO1xuaW1wb3J0IHsgVGl0bGVQYW5lbEJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsJztcbmltcG9ydCB7IERlc2NyaXB0aW9uQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2Rlc2NyaXB0aW9uJztcbmltcG9ydCB7IENvbW1lbnRCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfY29tbWVudCc7XG5pbXBvcnQgeyBMaW5rQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2xpbmsnO1xuaW1wb3J0IHsgSFRNTEJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9odG1sJztcbmltcG9ydCB7IEltYWdlQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2ltYWdlJztcbmltcG9ydCB7IEVtcHR5QnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2VtcHR5JztcbmltcG9ydCB7IFJvd2xpbmVCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfcm93bGluZSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IEFkb3JuZXJzT3B0aW9ucyB9IGZyb20gJy4vZXZlbnRfaGFuZGxlci9hZG9ybmVycyc7XG5cbmV4cG9ydCB0eXBlIElCb3JkZXJEZXNjcmlwdGlvbiA9IElSZWN0ICYgSVNpemUgJiBQaWNrPFBkZkJyaWNrLCAnZm9ybUJvcmRlckNvbG9yJz4gJiB7IHJvdW5kZWQ/OiBib29sZWFuLCBkYXNoU3R5bGU/OiB7IGRhc2hBcnJheTogW251bWJlciwgbnVtYmVyXSB8IFtudW1iZXJdLCBkYXNoUGhhc2U6IG51bWJlciB9LCBvdXRzaWRlPzogYm9vbGVhbiB9O1xuXG5leHBvcnQgY2xhc3MgU3VydmV5SGVscGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIEVQU0lMT046IG51bWJlciA9IDIuMjIwNDQ2MDQ5MjUwMzEzMDgwODQ3MjYzMzM2MTgxNmUtMTU7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9TVVJWRVlfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjc7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9QQUdFX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4zO1xuICAgIHB1YmxpYyBzdGF0aWMgVElUTEVfUEFORUxfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjM7XG4gICAgcHVibGljIHN0YXRpYyBERVNDUklQVElPTl9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDIuMCAvIDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIE9USEVSX1JPV1NfQ09VTlQ6IG51bWJlciA9IDI7XG4gICAgcHVibGljIHN0YXRpYyBSQVRJTkdfTUlOX1dJRFRIOiBudW1iZXIgPSAzO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU5HX01JTl9IRUlHSFQ6IG51bWJlciA9IDI7XG4gICAgcHVibGljIHN0YXRpYyBSQVRJTkdfQ09MVU1OX1dJRFRIOiBudW1iZXIgPSA1O1xuICAgIHB1YmxpYyBzdGF0aWMgTUFUUklYX0NPTFVNTl9XSURUSDogbnVtYmVyID0gNTtcbiAgICBwdWJsaWMgc3RhdGljIElNQUdFUElDS0VSX0NPVU5UOiBudW1iZXIgPSA0O1xuICAgIHB1YmxpYyBzdGF0aWMgSU1BR0VQSUNLRVJfUkFUSU86IG51bWJlciA9IDQuMCAvIDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIE1VTFRJUExFVEVYVF9URVhUX1BFUlM6IG51bWJlciA9IE1hdGguRSAvIDEwLjA7XG4gICAgcHVibGljIHN0YXRpYyBIVE1MX1RBSUxfVEVYVF9TQ0FMRTogbnVtYmVyID0gMC4yNDtcbiAgICBwdWJsaWMgc3RhdGljIFNFTEVDVF9JVEVNX0ZMQVRfU0NBTEU6IG51bWJlciA9IDAuOTU7XG4gICAgcHVibGljIHN0YXRpYyBHQVBfQkVUV0VFTl9ST1dTOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fQ09MVU1OUzogbnVtYmVyID0gMS41O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fSVRFTV9URVhUOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgRk9STV9CT1JERVJfVklTSUJMRTogYm9vbGVhbiA9IHRydWU7XG4gICAgcHVibGljIHN0YXRpYyBCT1JERVJfU0NBTEU6IG51bWJlciA9IDAuMTtcbiAgICBwdWJsaWMgc3RhdGljIFZJU0lCTEVfQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjg7XG4gICAgcHVibGljIHN0YXRpYyBVTlZJU0lCTEVfQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjI7XG4gICAgcHVibGljIHN0YXRpYyBSQURJVVNfU0NBTEU6IG51bWJlciA9IDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX0ZPTlRfU0NBTEU6IG51bWJlciA9IDEuMTtcbiAgICBwdWJsaWMgc3RhdGljIFZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU6IG51bWJlciA9IDAuMztcbiAgICBwdWJsaWMgc3RhdGljIEhUTUxfVE9fSU1BR0VfUVVBTElUWTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgRk9STV9CT1JERVJfQ09MT1I6IHN0cmluZyA9ICcjOWY5ZjlmJztcbiAgICBwdWJsaWMgc3RhdGljIFRFWFRfQ09MT1I6IHN0cmluZyA9ICcjNDA0MDQwJztcbiAgICBwdWJsaWMgc3RhdGljIEJBQ0tHUk9VTkRfQ09MT1I6IHN0cmluZyA9ICcjRkZGRkZGJztcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX0xPQ0FUSU9OX01BVFJJWDogc3RyaW5nID0gJ21hdHJpeCc7XG4gICAgcHVibGljIHN0YXRpYyBTVEFOREFSRF9GT05UOiBzdHJpbmcgPSAnaGVsdmV0aWNhJztcbiAgICBwdWJsaWMgc3RhdGljIENVU1RPTV9GT05UX0VOQ09ESU5HOiBzdHJpbmcgPSAnSWRlbnRpdHktSCc7XG5cbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlV2lkdGgod2lkdGg6IHN0cmluZywgbWF4V2lkdGg6IG51bWJlcixcbiAgICAgICAgY29sdW1uc0NvdW50OiBudW1iZXIgPSAxLCBkZWZhdWx0VW5pdD86IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGlmICh3aWR0aC5pbmRleE9mKCdjYWxjJykgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBtYXhXaWR0aCAvIGNvbHVtbnNDb3VudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZTogbnVtYmVyID0gcGFyc2VGbG9hdCh3aWR0aCk7XG4gICAgICAgIGNvbnN0IHVuaXQ6IHN0cmluZyA9IHdpZHRoLnJlcGxhY2UoL1teQS1aYS16JV0vZywgJycpIHx8IGRlZmF1bHRVbml0O1xuICAgICAgICBsZXQgazogbnVtYmVyO1xuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgICAgICAgIGNhc2UgJ3B0JzpcbiAgICAgICAgICAgICAgICBrID0gMS4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wIC8gMjUuNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NtJzpcbiAgICAgICAgICAgICAgICBrID0gNzIuMCAvIDIuNTQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpbic6XG4gICAgICAgICAgICAgICAgayA9IDcyLjA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdweCc6XG4gICAgICAgICAgICAgICAgayA9IDcyLjAgLyA5Ni4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncGMnOlxuICAgICAgICAgICAgICAgIGsgPSAxMi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZW0nOlxuICAgICAgICAgICAgICAgIGsgPSAxMi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZXgnOlxuICAgICAgICAgICAgICAgIGsgPSA2LjA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICAgICAgayA9IG1heFdpZHRoIC8gMTAwLjA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHZhbHVlICogaywgbWF4V2lkdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHB4VG9QdCh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZighaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAncHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKHZhbHVlLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgKiA3Mi4wIC8gOTYuMDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBtZXJnZVJlY3RzKC4uLnJlY3RzOiBJUmVjdFtdKTogSVJlY3Qge1xuICAgICAgICBjb25zdCByZXN1bHRSZWN0OiBJUmVjdCA9IHtcbiAgICAgICAgICAgIHhMZWZ0OiByZWN0c1swXS54TGVmdCxcbiAgICAgICAgICAgIHhSaWdodDogcmVjdHNbMF0ueFJpZ2h0LFxuICAgICAgICAgICAgeVRvcDogcmVjdHNbMF0ueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHJlY3RzWzBdLnlCb3RcbiAgICAgICAgfTtcbiAgICAgICAgcmVjdHMuZm9yRWFjaCgocmVjdDogSVJlY3QpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueExlZnQgPSBNYXRoLm1pbihyZXN1bHRSZWN0LnhMZWZ0LCByZWN0LnhMZWZ0KSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueFJpZ2h0ID0gTWF0aC5tYXgocmVzdWx0UmVjdC54UmlnaHQsIHJlY3QueFJpZ2h0KSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueVRvcCA9IE1hdGgubWluKHJlc3VsdFJlY3QueVRvcCwgcmVjdC55VG9wKSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueUJvdCA9IE1hdGgubWF4KHJlc3VsdFJlY3QueUJvdCwgcmVjdC55Qm90KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHRSZWN0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVBvaW50KHJlY3Q6IElSZWN0LCBpc0xlZnQ6IGJvb2xlYW4gPSB0cnVlLCBpc1RvcDogYm9vbGVhbiA9IGZhbHNlKTogSVBvaW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiBpc0xlZnQgPyByZWN0LnhMZWZ0IDogcmVjdC54UmlnaHQsXG4gICAgICAgICAgICB5VG9wOiBpc1RvcCA/IHJlY3QueVRvcCA6IHJlY3QueUJvdFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJlY3QocG9pbnQ6IElQb2ludCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogcG9pbnQueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHBvaW50LnhMZWZ0ICsgd2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wLFxuICAgICAgICAgICAgeUJvdDogcG9pbnQueVRvcCArIGhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUhlYWRlclJlY3QoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IElSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiAwLjAsXG4gICAgICAgICAgICB4UmlnaHQ6IGNvbnRyb2xsZXIucGFwZXJXaWR0aCxcbiAgICAgICAgICAgIHlUb3A6IDAuMCxcbiAgICAgICAgICAgIHlCb3Q6IGNvbnRyb2xsZXIubWFyZ2lucy50b3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGb290ZXJSZWN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogMC4wLFxuICAgICAgICAgICAgeFJpZ2h0OiBjb250cm9sbGVyLnBhcGVyV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC0gY29udHJvbGxlci5tYXJnaW5zLmJvdCxcbiAgICAgICAgICAgIHlCb3Q6IGNvbnRyb2xsZXIucGFwZXJIZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjaG9vc2VIdG1sRm9udChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIudXNlQ3VzdG9tRm9udEluSHRtbCA/IGNvbnRyb2xsZXIuZm9udE5hbWUgOiB0aGlzLlNUQU5EQVJEX0ZPTlQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVDc3NUZXh0UnVsZShmb250U2l6ZTogbnVtYmVyLCBmb250U3R5bGU6IHN0cmluZywgZm9udE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgXCJmb250LXNpemU6ICR7Zm9udFNpemV9cHQ7IGZvbnQtd2VpZ2h0OiAke2ZvbnRTdHlsZX07IGZvbnQtZmFtaWx5OiAke2ZvbnROYW1lfTsgY29sb3I6ICR7dGhpcy5URVhUX0NPTE9SfTtcImA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlSHRtbENvbnRhaW5lckJsb2NrKGh0bWw6IHN0cmluZywgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVuZGVyQXM6IElIVE1MUmVuZGVyVHlwZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGZvbnQgPSB0aGlzLmNob29zZUh0bWxGb250KGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJfX3N1cnZleXBkZl9odG1sXCIgc3R5bGU9JHt0aGlzLmdlbmVyYXRlQ3NzVGV4dFJ1bGUoXG4gICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplLCBjb250cm9sbGVyLmZvbnRTdHlsZSwgZm9udCl9PmAgK1xuICAgICAgICAgICAgYDxzdHlsZT4uX19zdXJ2ZXlwZGZfaHRtbCBwIHsgbWFyZ2luOiAwOyBsaW5lLWhlaWdodDogJHtjb250cm9sbGVyLmZvbnRTaXplfXB0IH0gYm9keSB7IG1hcmdpbjogMDsgfTwvc3R5bGU+JHtodG1sfTwvZGl2PmA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc3BsaXRIdG1sUmVjdChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBodG1sQnJpY2s6IElQZGZCcmljayk6IElQZGZCcmljayB7XG4gICAgICAgIGNvbnN0IGJyaWNrczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgaHRtbEhlaWdodDogbnVtYmVyID0gaHRtbEJyaWNrLmhlaWdodDtcbiAgICAgICAgY29uc3QgbWluSGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLmRvYy5nZXRGb250U2l6ZSgpO1xuICAgICAgICBodG1sQnJpY2sueUJvdCA9IGh0bWxCcmljay55VG9wICsgbWluSGVpZ2h0O1xuICAgICAgICBjb25zdCBlbXB0eUJyaWNrQ291bnQ6IG51bWJlciA9IE1hdGguZmxvb3IoaHRtbEhlaWdodCAvIG1pbkhlaWdodCkgLSAxO1xuICAgICAgICBicmlja3MucHVzaChodG1sQnJpY2spO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQoaHRtbEJyaWNrKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGVtcHR5QnJpY2tDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBicmlja3MucHVzaChuZXcgRW1wdHlCcmljayh0aGlzLmNyZWF0ZVJlY3QoY3VyclBvaW50LCBodG1sQnJpY2sud2lkdGgsIG1pbkhlaWdodCkpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IG1pbkhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZW1haW5pbmdIZWlnaHQ6IG51bWJlciA9IGh0bWxIZWlnaHQgLSAoZW1wdHlCcmlja0NvdW50ICsgMSkgKiBtaW5IZWlnaHQ7XG4gICAgICAgIGlmIChyZW1haW5pbmdIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICBicmlja3MucHVzaChuZXcgRW1wdHlCcmljayh0aGlzLmNyZWF0ZVJlY3QoY3VyclBvaW50LCBodG1sQnJpY2sud2lkdGgsIHJlbWFpbmluZ0hlaWdodCkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmJyaWNrcyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUGxhaW5UZXh0RmxhdDxUIGV4dGVuZHMgSVBkZkJyaWNrPihwb2ludDogSVBvaW50LCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcsIGZhYnJpYzogbmV3IChxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykgPT4gVCk6IENvbXBvc2l0ZUJyaWNrIHtcbiAgICAgICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gY29udHJvbGxlci5kb2Muc3BsaXRUZXh0VG9TaXplKHRleHQsXG4gICAgICAgICAgICBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgLSBwb2ludC54TGVmdCk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gdGhpcy5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgbGluZXMuZm9yRWFjaCgobGluZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaXplOiBJU2l6ZSA9IGNvbnRyb2xsZXIubWVhc3VyZVRleHQobGluZSk7XG4gICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2sobmV3IGZhYnJpYyhxdWVzdGlvbiwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVJlY3QoY3VyclBvaW50LCBzaXplLndpZHRoLCBzaXplLmhlaWdodCksIGxpbmUpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IHNpemUuaGVpZ2h0O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVUZXh0RmxhdDxUIGV4dGVuZHMgSVBkZkJyaWNrPihwb2ludDogSVBvaW50LCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZywgZmFicmljOiBuZXcgKHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSA9PiBUKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyB8fCAhdGhpcy5oYXNIdG1sKHRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQbGFpblRleHRGbGF0KHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgICAgICB0ZXh0IDogdGhpcy5nZXRMb2NTdHJpbmcoPExvY2FsaXphYmxlU3RyaW5nPnRleHQpLCBmYWJyaWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXRIdG1sUmVjdChjb250cm9sbGVyLCBhd2FpdCB0aGlzLmNyZWF0ZUhUTUxGbGF0KHBvaW50LCA8UXVlc3Rpb24+cXVlc3Rpb24sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2sodGhpcy5nZXRMb2NTdHJpbmcodGV4dCksIGNvbnRyb2xsZXIsICdzdGFuZGFyZCcpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgaGFzSHRtbCh0ZXh0OiBMb2NhbGl6YWJsZVN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuOiBSZWdFeHAgPSAvPFxcLz9bYS16XVtcXHNcXFNdKj4vaTtcbiAgICAgICAgcmV0dXJuIHRleHQuaGFzSHRtbCAmJiAocGF0dGVybi50ZXN0KCg8YW55PnRleHQpLnJlbmRlcmVkVGV4dCkgfHwgcGF0dGVybi50ZXN0KHRleHQucmVuZGVyZWRIdG1sKSk7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGdldEh0bWxNYXJnaW5zKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHBvaW50OiBJUG9pbnQpOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciwgd2lkdGg6IG51bWJlciB9IHtcbiAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHBvaW50LnhMZWZ0IC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wOiBjb250cm9sbGVyLm1hcmdpbnMudG9wLFxuICAgICAgICAgICAgYm90dG9tOiBjb250cm9sbGVyLm1hcmdpbnMuYm90LFxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoID4gY29udHJvbGxlci51bml0V2lkdGggPyB3aWR0aCA6IGNvbnRyb2xsZXIudW5pdFdpZHRoXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVIVE1MUmVjdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBtYXJnaW5zOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciwgd2lkdGg6IG51bWJlciB9LCByZXN1bHRZOiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVBhZ2VIZWlnaHQ6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJIZWlnaHQgLSBjb250cm9sbGVyLm1hcmdpbnMuYm90IC0gY29udHJvbGxlci5tYXJnaW5zLnRvcDtcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSAoY29udHJvbGxlci5oZWxwZXJEb2MuZ2V0TnVtYmVyT2ZQYWdlcygpIC0gMSkgKlxuICAgICAgICAgICAgKGNvbnRyb2xsZXIuZm9udFNpemUgKiBNYXRoLmZsb29yKGF2YWlsYWJsZVBhZ2VIZWlnaHQgLyBjb250cm9sbGVyLmZvbnRTaXplKSlcbiAgICAgICAgICAgICsgcmVzdWx0WSAtIG1hcmdpbnMudG9wICsgU3VydmV5SGVscGVyLkhUTUxfVEFJTF9URVhUX1NDQUxFICogY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZQYWdlczogbnVtYmVyID0gY29udHJvbGxlci5oZWxwZXJEb2MuZ2V0TnVtYmVyT2ZQYWdlcygpO1xuICAgICAgICBjb250cm9sbGVyLmhlbHBlckRvYy5hZGRQYWdlKCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBudW1iZXJPZlBhZ2VzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuaGVscGVyRG9jLmRlbGV0ZVBhZ2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LCBtYXJnaW5zLndpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlSFRNTEZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBodG1sOiBzdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBtYXJnaW5zOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciwgd2lkdGg6IG51bWJlciB9ID0gdGhpcy5nZXRIdG1sTWFyZ2lucyhjb250cm9sbGVyLCBwb2ludCk7XG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxJUGRmQnJpY2s+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmhlbHBlckRvYy5mcm9tSFRNTChodG1sLCBwb2ludC54TGVmdCwgbWFyZ2lucy50b3AsIHtcbiAgICAgICAgICAgICAgICBwYWdlc3BsaXQ6IHRydWUsIHdpZHRoOiBtYXJnaW5zLndpZHRoXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAocmVzdWx0OiBhbnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVIVE1MUmVjdChwb2ludCwgY29udHJvbGxlciwgbWFyZ2lucywgcmVzdWx0LnkpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IEhUTUxCcmljayhxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgaHRtbCkpO1xuICAgICAgICAgICAgfSwgbWFyZ2lucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlRm9udEZhY2UoZm9udE5hbWU6IHN0cmluZywgZm9udEJhc2U2NDogc3RyaW5nLCBmb250V2VpZ2h0OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGBAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6ICR7Zm9udE5hbWV9OyBgICtcbiAgICAgICAgICAgIGBzcmM6IHVybChkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwke2ZvbnRCYXNlNjR9KSBmb3JtYXQoJ3dvZmYnKTsgYCArXG4gICAgICAgICAgICBgZm9udC13ZWlnaHQ6ICR7Zm9udFdlaWdodH07IH1gO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlRm9udEZhY2VXaXRoSXRhbGljU3R5bGUoZm9udE5hbWU6IHN0cmluZywgZm9udEJhc2U2NDogc3RyaW5nLCBmb250V2VpZ2h0OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGBAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6ICR7Zm9udE5hbWV9OyBgICtcbiAgICAgICAgICAgIGBzcmM6IHVybChkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwke2ZvbnRCYXNlNjR9KSBmb3JtYXQoJ3dvZmYnKTsgYCArXG4gICAgICAgICAgICBgZm9udC13ZWlnaHQ6ICR7Zm9udFdlaWdodH07IGZvbnQtc3R5bGU6IGl0YWxpY31gO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGh0bWxUb1htbChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBodG1sRG9jOiBEb2N1bWVudCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgnJyk7XG4gICAgICAgIGh0bWxEb2Mud3JpdGUoaHRtbC5yZXBsYWNlKC9cXCMvZywgJyUyMycpKTtcbiAgICAgICAgaHRtbERvYy5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd4bWxucycsIGh0bWxEb2MuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSk7XG4gICAgICAgIGh0bWxEb2MuYm9keS5zdHlsZS5tYXJnaW4gPSAndW5zZXQnO1xuICAgICAgICByZXR1cm4gKG5ldyBYTUxTZXJpYWxpemVyKCkpLnNlcmlhbGl6ZVRvU3RyaW5nKGh0bWxEb2MuYm9keSkucmVwbGFjZSgvJTIzL2csICcjJyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlU3ZnQ29udGVudChodG1sOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgY29uc3Qgc3R5bGU6IEhUTUxTdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZS5pbm5lckhUTUwgPSAnLl9fc3VydmV5cGRmX2h0bWwgcCB7IG1hcmdpbjogdW5zZXQ7IGxpbmUtaGVpZ2h0OiAyMnB4OyB9IGJvZHkgeyBtYXJnaW46IHVuc2V0OyB9JztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICAgIGNvbnN0IGRpdjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICdfX3N1cnZleXBkZl9odG1sJztcbiAgICAgICAgZGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgICAgICBkaXYuc3R5bGUudG9wID0gJy0xMDAwMHB4JztcbiAgICAgICAgZGl2LnN0eWxlLmxlZnQgPSAnLTEwMDAwcHgnO1xuICAgICAgICBkaXYuc3R5bGUud2lkdGggPSAod2lkdGggLyA3Mi4wICogOTYuMCkgKyAncHgnO1xuICAgICAgICBkaXYuc3R5bGUuYm94U2l6aW5nID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuc3R5bGUuY29sb3IgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5zdHlsZS5mb250RmFtaWx5ID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuc3R5bGUuZm9udCA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2LnN0eWxlLmxpbmVIZWlnaHQgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bWwpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgIGNvbnN0IGRpdldpZHRoOiBudW1iZXIgPSBkaXYub2Zmc2V0V2lkdGg7XG4gICAgICAgIGNvbnN0IGRpdkhlaWdodDogbnVtYmVyID0gZGl2Lm9mZnNldEhlaWdodDtcbiAgICAgICAgZGl2LnJlbW92ZSgpO1xuICAgICAgICBzdHlsZS5yZW1vdmUoKTtcbiAgICAgICAgbGV0IGRlZnM6IHN0cmluZyA9ICcnO1xuICAgICAgICBpZiAoY29udHJvbGxlci51c2VDdXN0b21Gb250SW5IdG1sKSB7XG4gICAgICAgICAgICBkZWZzID0gYDxkZWZzPjxzdHlsZT4ke3RoaXMuZ2VuZXJhdGVGb250RmFjZShjb250cm9sbGVyLmZvbnROYW1lLCBjb250cm9sbGVyLmJhc2U2NE5vcm1hbCwgJ25vcm1hbCcpfWAgK1xuICAgICAgICAgICAgICAgIGAgJHt0aGlzLmdlbmVyYXRlRm9udEZhY2UoY29udHJvbGxlci5mb250TmFtZSwgY29udHJvbGxlci5iYXNlNjRCb2xkLCAnYm9sZCcpfTwvc3R5bGU+PC9kZWZzPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzKS5mb3JFYWNoKGZvbnROYW1lID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb250ID0gRG9jQ29udHJvbGxlci5jdXN0b21Gb250c1tmb250TmFtZV07XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZm9udCkuZm9yRWFjaCgoZm9udFN0eWxlOiAnbm9ybWFsJyB8ICdib2xkJyB8ICdpdGFsaWMnIHwgJ2JvbGRpdGFsaWMnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb250U3R5bGUgPT09ICdub3JtYWwnIHx8IGZvbnRTdHlsZSA9PT0gJ2JvbGQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZzICs9IGAke3RoaXMuZ2VuZXJhdGVGb250RmFjZShmb250TmFtZSwgZm9udFtmb250U3R5bGVdLCBmb250U3R5bGUpfWA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZzICs9IGAke3RoaXMuZ2VuZXJhdGVGb250RmFjZVdpdGhJdGFsaWNTdHlsZShmb250TmFtZSwgZm9udFtmb250U3R5bGVdLCBmb250U3R5bGUgPT09ICdpdGFsaWMnID8gJ25vcm1hbCcgOiAnYm9sZCcpfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZWZzID0gJzxkZWZzPjxzdHlsZT4nICsgZGVmcyArICc8L3N0eWxlPjwvZGVmcz4nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3ZnOiBzdHJpbmcgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIke2RpdldpZHRofXB4XCIgaGVpZ2h0PVwiJHtkaXZIZWlnaHR9cHhcIj5gICsgZGVmcyArXG4gICAgICAgICAgICAnPHN0eWxlPi5fX3N1cnZleXBkZl9odG1sIHAgeyBtYXJnaW46IHVuc2V0OyBsaW5lLWhlaWdodDogMjJweDsgfTwvc3R5bGU+JyArXG4gICAgICAgICAgICBgPGZvcmVpZ25PYmplY3Qgd2lkdGg9XCIke2RpdldpZHRofXB4XCIgaGVpZ2h0PVwiJHtkaXZIZWlnaHR9cHhcIj5gICtcbiAgICAgICAgICAgIHRoaXMuaHRtbFRvWG1sKGh0bWwpICsgJzwvZm9yZWlnbk9iamVjdD48L3N2Zz4nO1xuICAgICAgICByZXR1cm4geyBzdmcsIGRpdldpZHRoLCBkaXZIZWlnaHQgfTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgc2V0Q2FudmFzKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGRpdldpZHRoOiBudW1iZXIsIGRpdkhlaWdodDogbnVtYmVyLCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY2FudmFzLndpZHRoID0gZGl2V2lkdGggKiBTdXJ2ZXlIZWxwZXIuSFRNTF9UT19JTUFHRV9RVUFMSVRZO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gZGl2SGVpZ2h0ICogU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWTtcbiAgICAgICAgY29uc3QgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGNvbnRleHQuc2NhbGUoU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWSwgU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWSk7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gU3VydmV5SGVscGVyLkJBQ0tHUk9VTkRfQ09MT1I7XG4gICAgICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgZGl2V2lkdGgsIGRpdkhlaWdodCk7XG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgaHRtbFRvSW1hZ2UoaHRtbDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogUHJvbWlzZTx7IHVybDogc3RyaW5nLCBhc3BlY3Q6IG51bWJlciB9PiB7XG4gICAgICAgIGNvbnN0IHsgc3ZnLCBkaXZXaWR0aCwgZGl2SGVpZ2h0IH0gPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlU3ZnQ29udGVudChodG1sLCB3aWR0aCwgY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IGRhdGE6IHN0cmluZyA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCcgKyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdmcpKSk7XG4gICAgICAgIGNvbnN0IGltZzogSFRNTEltYWdlRWxlbWVudCA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW49J2Fub255bW91cyc7XG4gICAgICAgIGltZy5zcmMgPSBkYXRhO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDYW52YXMoY2FudmFzLCBkaXZXaWR0aCwgZGl2SGVpZ2h0LCBpbWcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybDogc3RyaW5nID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIFN1cnZleUhlbHBlci5IVE1MX1RPX0lNQUdFX1FVQUxJVFkpO1xuICAgICAgICAgICAgICAgIGNhbnZhcy5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgdXJsOiB1cmwsIGFzcGVjdDogZGl2V2lkdGggLyBkaXZIZWlnaHQgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHVybDogJ2RhdGE6LCcsIGFzcGVjdDogd2lkdGggLyB0aGlzLkVQU0lMT04gfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVCb2xkVGV4dEZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRleHQsIFRleHRCb2xkQnJpY2spO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVRpdGxlRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IHRoaXMuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSAqPSB0aGlzLlRJVExFX0ZPTlRfU0NBTEU7XG4gICAgICAgIGlmIChxdWVzdGlvbi5ubykge1xuICAgICAgICAgICAgY29uc3Qgbm9UZXh0OiBzdHJpbmcgPSBxdWVzdGlvbi5ubyArICcgJztcbiAgICAgICAgICAgIGxldCBub0ZsYXQ6IElQZGZCcmljaztcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0h0bWwocXVlc3Rpb24ubG9jVGl0bGUpKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tZWFzdXJlVGV4dChub1RleHQsICdib2xkJykud2lkdGg7XG4gICAgICAgICAgICAgICAgbm9GbGF0ID0gYXdhaXQgdGhpcy5jcmVhdGVIVE1MRmxhdChjdXJyUG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhub1RleHQsIGNvbnRyb2xsZXIsICdzdGFuZGFyZCcpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9GbGF0ID0gYXdhaXQgdGhpcy5jcmVhdGVCb2xkVGV4dEZsYXQoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbiwgY29udHJvbGxlciwgbm9UZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhub0ZsYXQpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gbm9GbGF0LnhSaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gY3VyclBvaW50LnhMZWZ0O1xuICAgICAgICBjb25zdCB0ZXh0RmxhdDogQ29tcG9zaXRlQnJpY2sgPSA8Q29tcG9zaXRlQnJpY2s+YXdhaXQgdGhpcy5jcmVhdGVCb2xkVGV4dEZsYXQoXG4gICAgICAgICAgICBjdXJyUG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBxdWVzdGlvbi5sb2NUaXRsZSk7XG4gICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayh0ZXh0RmxhdCk7XG4gICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICBpZiAocXVlc3Rpb24uaXNSZXF1aXJlZCkge1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRUZXh0OiBzdHJpbmcgPSBxdWVzdGlvbi5yZXF1aXJlZFRleHQ7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNIdG1sKHF1ZXN0aW9uLmxvY1RpdGxlKSkge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQodGV4dEZsYXQudW5mb2xkKClbMF0sIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tZWFzdXJlVGV4dChyZXF1aXJlZFRleHQsICdib2xkJykud2lkdGg7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuY3JlYXRlSFRNTEZsYXQoY3VyclBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2socmVxdWlyZWRUZXh0LCBjb250cm9sbGVyLCAnc3RhbmRhcmQnKSkpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQgPSB0aGlzLmNyZWF0ZVBvaW50KHRleHRGbGF0LnVuZm9sZCgpLnBvcCgpLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuY3JlYXRlQm9sZFRleHRGbGF0KGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlcXVpcmVkVGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVTdXJ2ZXlQYW5lbEZsYXQocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcsIGZvbnRTaXplU2NhbGU6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKiBmb250U2l6ZVNjYWxlO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmNyZWF0ZVRleHRGbGF0KHBvaW50LCBudWxsLCBjb250cm9sbGVyLCB0ZXh0LCBUaXRsZVBhbmVsQnJpY2spO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIHJldHVybiB0aXRsZUZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVTdXJ2ZXlGbGF0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlVGl0bGVTdXJ2ZXlQYW5lbEZsYXQocG9pbnQsIGNvbnRyb2xsZXIsIHRleHQsIHRoaXMuVElUTEVfU1VSVkVZX0ZPTlRfU0laRV9TQ0FMRSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVQYW5lbEZsYXQocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcsIGlzUGFnZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlVGl0bGVTdXJ2ZXlQYW5lbEZsYXQocG9pbnQsIGNvbnRyb2xsZXIsIHRleHQsXG4gICAgICAgICAgICBpc1BhZ2UgPyB0aGlzLlRJVExFX1BBR0VfRk9OVF9TSVpFX1NDQUxFIDogdGhpcy5USVRMRV9QQU5FTF9GT05UX1NJWkVfU0NBTEUpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZURlc2NGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IGNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqIHRoaXMuREVTQ1JJUFRJT05fRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRleHQsIERlc2NyaXB0aW9uQnJpY2spO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVhZG9ubHlSZW5kZXJBcyhxdWVzdGlvbjogUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nIHtcbiAgICAgICAgcmV0dXJuICg8YW55PnF1ZXN0aW9uKS5yZWFkb25seVJlbmRlckFzID09PSAnYXV0bycgPyBjb250cm9sbGVyLnJlYWRvbmx5UmVuZGVyQXMgOiAoPGFueT5xdWVzdGlvbikucmVhZG9ubHlSZW5kZXJBcztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVDb21tZW50RmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGlzUXVlc3Rpb246IGJvb2xlYW4sIG9wdGlvbnM6IHsgcm93cz86IG51bWJlciwgaW5kZXg/OiBudW1iZXIsIHZhbHVlPzogc3RyaW5nLCByZWFkT25seT86IGJvb2xlYW4gfSA9IHt9KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgcmVjdDogSVJlY3QgPSB0aGlzLmNyZWF0ZVRleHRGaWVsZFJlY3QocG9pbnQsIGNvbnRyb2xsZXIsIG9wdGlvbnMucm93cyA/PyAxKTtcbiAgICAgICAgbGV0IHRleHRGbGF0O1xuICAgICAgICBpZiAob3B0aW9ucy5yZWFkT25seSA/PyBTdXJ2ZXlIZWxwZXIuc2hvdWxkUmVuZGVyUmVhZE9ubHkocXVlc3Rpb24sIGNvbnRyb2xsZXIpKSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJlZFZhbHVlID0gb3B0aW9ucy52YWx1ZSA/PyB0aGlzLmdldFF1ZXN0aW9uT3JDb21tZW50VmFsdWUocXVlc3Rpb24sIGlzUXVlc3Rpb24pO1xuICAgICAgICAgICAgdGV4dEZsYXQgPSBhd2FpdCB0aGlzLmNyZWF0ZVJlYWRPbmx5VGV4dEZpZWxkVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgcG9pbnQsIGNvbnRyb2xsZXIsIHF1ZXN0aW9uLCByZW5kZXJlZFZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHBhZGRpbmc6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIHRoaXMuVkFMVUVfUkVBRE9OTFlfUEFERElOR19TQ0FMRTtcbiAgICAgICAgICAgIGlmICh0ZXh0RmxhdC55Qm90ICsgcGFkZGluZyA+IHJlY3QueUJvdCkgcmVjdC55Qm90ID0gdGV4dEZsYXQueUJvdCArIHBhZGRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tbWVudCA9IG5ldyBDb21tZW50QnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGlzUXVlc3Rpb24sIG9wdGlvbnMuaW5kZXgpO1xuICAgICAgICBpZihvcHRpb25zLnJlYWRPbmx5ICE9PSBudWxsICYmIG9wdGlvbnMucmVhZE9ubHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tbWVudC5pc1JlYWRPbmx5ID0gb3B0aW9ucy5yZWFkT25seTtcbiAgICAgICAgfVxuICAgICAgICBpZih0ZXh0RmxhdCkge1xuICAgICAgICAgICAgY29tbWVudC50ZXh0QnJpY2sgPSB0ZXh0RmxhdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRRdWVzdGlvbk9yQ29tbWVudFZhbHVlKHF1ZXN0aW9uOiBRdWVzdGlvbiwgaXNRdWVzdGlvbjogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaXNRdWVzdGlvbiA/IChxdWVzdGlvbi52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHF1ZXN0aW9uLnZhbHVlICE9PSBudWxsID8gcXVlc3Rpb24udmFsdWUgOiAnJykgOlxuICAgICAgICAgICAgKHF1ZXN0aW9uLmNvbW1lbnQgIT09IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi5jb21tZW50ICE9PSBudWxsID8gcXVlc3Rpb24uY29tbWVudCA6ICcnKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRRdWVzdGlvbk9yQ29tbWVudERpc3BsYXlWYWx1ZShxdWVzdGlvbjogUXVlc3Rpb24sIGlzUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlzUXVlc3Rpb24gPyBxdWVzdGlvbi5kaXNwbGF5VmFsdWUgOiBTdXJ2ZXlIZWxwZXIuZ2V0UXVlc3Rpb25PckNvbW1lbnRWYWx1ZShxdWVzdGlvbiwgaXNRdWVzdGlvbik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaW5Ccm93c2VyID0gdHlwZW9mIEltYWdlID09PSAnZnVuY3Rpb24nO1xuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgaGFzRG9jdW1lbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0SW1hZ2VCYXNlNjQoaW1hZ2VMaW5rOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWFnZS5jcm9zc09yaWdpbj0nYW5vbnltb3VzJztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGltYWdlLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgICAgICAgICAgY2FudmFzLndpZHRoID0gaW1hZ2UubmF0dXJhbFdpZHRoO1xuICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFVcmwgPSBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhVXJsKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoJycpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltYWdlLnNyYyA9IGltYWdlTGluaztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2hvdWxkQ29udmVydEltYWdlVG9QbmcgPSB0cnVlO1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0SW1hZ2VMaW5rKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGltYWdlT3B0aW9uczogeyBsaW5rOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvYmplY3RGaXQ/OiBzdHJpbmcgfSwgYXBwbHlJbWFnZUZpdDogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHB0VG9QeDogbnVtYmVyID0gOTYuMCAvIDcyLjA7XG4gICAgICAgIGxldCB1cmwgPSB0aGlzLnNob3VsZENvbnZlcnRJbWFnZVRvUG5nID8gYXdhaXQgU3VydmV5SGVscGVyLmdldEltYWdlQmFzZTY0KGltYWdlT3B0aW9ucy5saW5rKSA6IGltYWdlT3B0aW9ucy5saW5rO1xuICAgICAgICBpZih0eXBlb2YgWE1MU2VyaWFsaXplciA9PT0gJ2Z1bmN0aW9uJyAmJiBhcHBseUltYWdlRml0KSB7XG4gICAgICAgICAgICBjb25zdCBjYW52YXNIdG1sOiBzdHJpbmcgPVxuICAgICAgICAgICAgICAgYDxkaXYgc3R5bGU9J292ZXJmbG93OiBoaWRkZW47IHdpZHRoOiAke2ltYWdlT3B0aW9ucy53aWR0aCAqIHB0VG9QeH1weDsgaGVpZ2h0OiAke2ltYWdlT3B0aW9ucy5oZWlnaHQgKiBwdFRvUHh9cHg7Jz5cbiAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0nJHt1cmx9JyBzdHlsZT0nb2JqZWN0LWZpdDogJHtpbWFnZU9wdGlvbnMub2JqZWN0Rml0fTsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsnLz5cbiAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgICAgICB1cmwgPSAoYXdhaXQgU3VydmV5SGVscGVyLmh0bWxUb0ltYWdlKGNhbnZhc0h0bWwsIGltYWdlT3B0aW9ucy53aWR0aCwgY29udHJvbGxlcikpLnVybDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUltYWdlRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogYW55LFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBpbWFnZU9wdGlvbnM6IHsgbGluazogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgb2JqZWN0Rml0Pzogc3RyaW5nIH0sIGFwcGx5SW1hZ2VGaXQ/OiBib29sZWFuKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgaWYgKFN1cnZleUhlbHBlci5pbkJyb3dzZXIpIHtcbiAgICAgICAgICAgIGltYWdlT3B0aW9ucy5vYmplY3RGaXQgPSAhIXF1ZXN0aW9uICYmICEhcXVlc3Rpb24uaW1hZ2VGaXQgPyBxdWVzdGlvbi5pbWFnZUZpdCA6IChpbWFnZU9wdGlvbnMub2JqZWN0Rml0IHx8ICdjb250YWluJyk7XG4gICAgICAgICAgICBpZiAoYXBwbHlJbWFnZUZpdCA/PyBjb250cm9sbGVyLmFwcGx5SW1hZ2VGaXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VPcHRpb25zLndpZHRoID4gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3V2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBpbWFnZU9wdGlvbnMuaGVpZ2h0ICo9IG5ld1dpZHRoIC8gaW1hZ2VPcHRpb25zLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICBpbWFnZU9wdGlvbnMud2lkdGggPSBuZXdXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBodG1sOiBzdHJpbmcgPSBgPGltZyBzcmM9JyR7YXdhaXQgU3VydmV5SGVscGVyLmdldEltYWdlTGluayhjb250cm9sbGVyLCBpbWFnZU9wdGlvbnMsIGFwcGx5SW1hZ2VGaXQgPz8gY29udHJvbGxlci5hcHBseUltYWdlRml0KX0nIHdpZHRoPScke2ltYWdlT3B0aW9ucy53aWR0aH0nIGhlaWdodD0nJHtpbWFnZU9wdGlvbnMuaGVpZ2h0fScvPmA7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEhUTUxCcmljayhxdWVzdGlvbiwgY29udHJvbGxlciwgdGhpcy5jcmVhdGVSZWN0KHBvaW50LCBpbWFnZU9wdGlvbnMud2lkdGgsIGltYWdlT3B0aW9ucy5oZWlnaHQpLCBodG1sLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEltYWdlQnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIGltYWdlT3B0aW9ucy5saW5rLCBwb2ludCwgaW1hZ2VPcHRpb25zLndpZHRoLCBpbWFnZU9wdGlvbnMuaGVpZ2h0KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjYW5QcmV2aWV3SW1hZ2UocXVlc3Rpb246IFF1ZXN0aW9uRmlsZU1vZGVsLCBpdGVtOiB7IG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfSwgdXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHF1ZXN0aW9uLmNhblByZXZpZXdJbWFnZShpdGVtKTtcbiAgICAgICAgLy8gICYmICBhd2FpdCB0aGlzLmdldEltYWdlU2l6ZSh1cmwpICE9PSBudWxsO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdldEltYWdlU2l6ZSh1cmw6IHN0cmluZyk6IFByb21pc2U8SVNpemU+IHtcbiAgICAgICAgaWYgKCFTdXJ2ZXlIZWxwZXIuaW5Ccm93c2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7IHdpZHRoOiB1bmRlZmluZWQsIGhlaWdodDogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZTogYW55ID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSB1cmw7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoeyB3aWR0aDogaW1hZ2Uud2lkdGgsIGhlaWdodDogaW1hZ2UuaGVpZ2h0IH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJldHVybiByZXNvbHZlKG51bGwpOyB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVSb3dsaW5lRmxhdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICB3aWR0aD86IG51bWJlciwgY29sb3I/OiBzdHJpbmcpOiBJUGRmQnJpY2sge1xuICAgICAgICBsZXQgeFJpZ2h0OiBudW1iZXIgPSB0eXBlb2Ygd2lkdGggPT09ICd1bmRlZmluZWQnID9cbiAgICAgICAgICAgIGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA6XG4gICAgICAgICAgICBwb2ludC54TGVmdCArIHdpZHRoO1xuICAgICAgICB4UmlnaHQgPSB4UmlnaHQgPiBwb2ludC54TGVmdCA/IHhSaWdodCA6IHBvaW50LnhMZWZ0ICsgdGhpcy5FUFNJTE9OO1xuICAgICAgICByZXR1cm4gbmV3IFJvd2xpbmVCcmljayhjb250cm9sbGVyLCB7XG4gICAgICAgICAgICB4TGVmdDogcG9pbnQueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHhSaWdodCxcbiAgICAgICAgICAgIHlUb3A6IHBvaW50LnlUb3AgKyB0aGlzLkVQU0lMT04sXG4gICAgICAgICAgICB5Qm90OiBwb2ludC55VG9wICsgdGhpcy5FUFNJTE9OXG4gICAgICAgIH0sIHR5cGVvZiBjb2xvciA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogY29sb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUxpbmtGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nLCBsaW5rOiBzdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVUZXh0OiBDb21wb3NpdGVCcmljayA9IDxDb21wb3NpdGVCcmljaz5hd2FpdCB0aGlzLlxuICAgICAgICAgICAgY3JlYXRlVGV4dEZsYXQocG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCB0ZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVMaW5rOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb21wb3NpdGVUZXh0LnVuZm9sZCgpLmZvckVhY2goKHRleHQ6IFRleHRCcmljaykgPT4ge1xuICAgICAgICAgICAgY29tcG9zaXRlTGluay5hZGRCcmljayhuZXcgTGlua0JyaWNrKHRleHQsIGxpbmspKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVQb2ludDogSVBvaW50ID0gdGhpcy5jcmVhdGVQb2ludChjb21wb3NpdGVMaW5rKTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUxpbmsuYWRkQnJpY2sodGhpcy5jcmVhdGVSb3dsaW5lRmxhdChsaW5lUG9pbnQsXG4gICAgICAgICAgICAgICAgY29udHJvbGxlciwgY29tcG9zaXRlTGluay53aWR0aCwgTGlua0JyaWNrLkNPTE9SKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlTGluaztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVBY3JvZm9ybVJlY3QocmVjdDogSVJlY3QpOiBudW1iZXJbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgcmVjdC55VG9wLFxuICAgICAgICAgICAgcmVjdC54UmlnaHQgLSByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgcmVjdC55Qm90IC0gcmVjdC55VG9wXG4gICAgICAgIF07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlVGV4dEZpZWxkUmVjdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBsaW5lczogbnVtYmVyID0gMSk6IElSZWN0IHtcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBwb2ludC54TGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY29udHJvbGxlci51bml0V2lkdGgpO1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIGxpbmVzO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZWN0KHBvaW50LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVSZWFkT25seVRleHRGaWVsZFRleHRGbGF0KHBvaW50OiBJUG9pbnQsXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHBhZGRpbmc6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdFdpZHRoICogdGhpcy5WQUxVRV9SRUFET05MWV9QQURESU5HX1NDQUxFO1xuICAgICAgICBwb2ludC55VG9wICs9IHBhZGRpbmc7XG4gICAgICAgIHBvaW50LnhMZWZ0ICs9IHBhZGRpbmc7XG4gICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMocG9pbnQueExlZnQsIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArIHBhZGRpbmcpO1xuICAgICAgICBjb25zdCB0ZXh0RmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdmFsdWUudG9TdHJpbmcoKSwgVGV4dEJyaWNrKTtcbiAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIHJldHVybiB0ZXh0RmxhdDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJGbGF0Qm9yZGVycyhjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBib3JkZXJPcHRpb25zOiBJQm9yZGVyRGVzY3JpcHRpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLkZPUk1fQk9SREVSX1ZJU0lCTEUpIHJldHVybjtcbiAgICAgICAgYm9yZGVyT3B0aW9ucy5yb3VuZGVkID0gYm9yZGVyT3B0aW9ucy5yb3VuZGVkID8/IHRydWU7XG4gICAgICAgIGJvcmRlck9wdGlvbnMub3V0c2lkZSA9IGJvcmRlck9wdGlvbnMub3V0c2lkZSA/PyBmYWxzZTtcbiAgICAgICAgY29uc3QgbWluU2lkZTogbnVtYmVyID0gTWF0aC5taW4oYm9yZGVyT3B0aW9ucy53aWR0aCwgYm9yZGVyT3B0aW9ucy5oZWlnaHQpO1xuICAgICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRoaXMuZ2V0Qm9yZGVyV2lkdGgoY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IHZpc2libGVXaWR0aDogbnVtYmVyID0gY29udHJvbGxlci51bml0SGVpZ2h0ICogdGhpcy5WSVNJQkxFX0JPUkRFUl9TQ0FMRSAqIHRoaXMuQk9SREVSX1NDQUxFO1xuICAgICAgICBjb25zdCB2aXNpYmxlU2NhbGU6IG51bWJlciA9IGJvcmRlck9wdGlvbnMub3V0c2lkZSA/IChtaW5TaWRlICsgYm9yZGVyV2lkdGgpIC8gbWluU2lkZSAtIHZpc2libGVXaWR0aCAvIG1pblNpZGUgOiAobWluU2lkZSAtIGJvcmRlcldpZHRoKSAvIG1pblNpZGUgKyB2aXNpYmxlV2lkdGggLyBtaW5TaWRlO1xuICAgICAgICBjb25zdCBvbGREcmF3Q29sb3I6IHN0cmluZyA9IGNvbnRyb2xsZXIuZG9jLmdldERyYXdDb2xvcigpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IoYm9yZGVyT3B0aW9ucy5mb3JtQm9yZGVyQ29sb3IpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lV2lkdGgodmlzaWJsZVdpZHRoKTtcbiAgICAgICAgY29uc3Qgc2NhbGVkUmVjdCA9IHRoaXMuc2NhbGVSZWN0KGJvcmRlck9wdGlvbnMsIHZpc2libGVTY2FsZSk7XG4gICAgICAgIGlmKGJvcmRlck9wdGlvbnMuZGFzaFN0eWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXNoU3R5bGUgPSBib3JkZXJPcHRpb25zLmRhc2hTdHlsZTtcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlckxlbmd0aCA9IChNYXRoLmFicyhzY2FsZWRSZWN0LnlUb3AgLSBzY2FsZWRSZWN0LnlCb3QpICsgTWF0aC5hYnMoc2NhbGVkUmVjdC54TGVmdCAtIHNjYWxlZFJlY3QueFJpZ2h0KSkgKiAyO1xuICAgICAgICAgICAgY29uc3QgZGFzaFdpdGhTcGFjZVNpemUgPSBkYXNoU3R5bGUuZGFzaEFycmF5WzBdICsgKGRhc2hTdHlsZS5kYXNoQXJyYXlbMV0gPz8gZGFzaFN0eWxlLmRhc2hBcnJheVswXSk7XG4gICAgICAgICAgICBjb25zdCBkYXNoU2l6ZSA9IGRhc2hTdHlsZS5kYXNoQXJyYXlbMF0gKyAoYm9yZGVyTGVuZ3RoICUgZGFzaFdpdGhTcGFjZVNpemUpIC8gTWF0aC5mbG9vcihib3JkZXJMZW5ndGggLyBkYXNoV2l0aFNwYWNlU2l6ZSk7XG5cbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldExpbmVEYXNoUGF0dGVybihcbiAgICAgICAgICAgICAgICBbZGFzaFNpemUsIGRhc2hTdHlsZS5kYXNoQXJyYXlbMV0gPz8gZGFzaFN0eWxlLmRhc2hBcnJheVswXV0sXG4gICAgICAgICAgICAgICAgZGFzaFN0eWxlLmRhc2hQaGFzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRyb2xsZXIuZG9jLnJlY3QoLi4udGhpcy5jcmVhdGVBY3JvZm9ybVJlY3Qoc2NhbGVkUmVjdCkpO1xuICAgICAgICBpZihib3JkZXJPcHRpb25zLnJvdW5kZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVudmlzaWJsZVdpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiB0aGlzLlVOVklTSUJMRV9CT1JERVJfU0NBTEUgKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICAgICAgICAgIGNvbnN0IHVudmlzaWJsZVNjYWxlOiBudW1iZXIgPSAxLjAgLSB1bnZpc2libGVXaWR0aCAvIG1pblNpZGU7XG4gICAgICAgICAgICBjb25zdCB1bnZpc2libGVSYWRpdXM6IG51bWJlciA9IHRoaXMuUkFESVVTX1NDQUxFICogdW52aXNpYmxlV2lkdGg7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IodGhpcy5CQUNLR1JPVU5EX0NPTE9SKTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldExpbmVXaWR0aCh1bnZpc2libGVXaWR0aCk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5yb3VuZGVkUmVjdCguLi50aGlzLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxlUmVjdChib3JkZXJPcHRpb25zLCB1bnZpc2libGVTY2FsZSkpLCB1bnZpc2libGVSYWRpdXMsIHVudmlzaWJsZVJhZGl1cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoYm9yZGVyT3B0aW9ucy5kYXNoU3R5bGUpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldExpbmVEYXNoUGF0dGVybihbXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKG9sZERyYXdDb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TG9jU3RyaW5nKHRleHQ6IExvY2FsaXphYmxlU3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzSHRtbCh0ZXh0KSkgcmV0dXJuIHRleHQucmVuZGVyZWRIdG1sO1xuICAgICAgICByZXR1cm4gKDxhbnk+dGV4dCkucmVuZGVyZWRUZXh0IHx8IHRleHQucmVuZGVyZWRIdG1sO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldERyb3Bkb3duUXVlc3Rpb25WYWx1ZShxdWVzdGlvbjogUXVlc3Rpb24pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBxRHJvcERvd246IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCA9IDxRdWVzdGlvbkRyb3Bkb3duTW9kZWw+cXVlc3Rpb247XG4gICAgICAgIGlmIChxRHJvcERvd24uaXNPdGhlclNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcURyb3BEb3duLm90aGVyVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghIXF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXN0aW9uLmRpc3BsYXlWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChxRHJvcERvd24uc2hvd09wdGlvbnNDYXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gcURyb3BEb3duLm9wdGlvbnNDYXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRDb250ZW50UXVlc3Rpb24ocXVlc3Rpb246IFF1ZXN0aW9uKTogUXVlc3Rpb24ge1xuICAgICAgICByZXR1cm4gISEoPGFueT5xdWVzdGlvbikuY29udGVudFF1ZXN0aW9uID8gKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRRdWVzdGlvbiA6IHF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbnRlbnRRdWVzdGlvblR5cGVSZW5kZXJBcyhxdWVzdGlvbjogUXVlc3Rpb24sIHN1cnZleTogU3VydmV5UERGKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlbmRlckFzID0gcXVlc3Rpb24ucmVuZGVyQXM7XG4gICAgICAgIGlmKHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gJ2Jvb2xlYW4nICYmIHN1cnZleS5vcHRpb25zLnVzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmcpIHtcbiAgICAgICAgICAgIHJlbmRlckFzID0gJ2NoZWNrYm94JztcbiAgICAgICAgfVxuICAgICAgICBpZihyZW5kZXJBcyAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gYCR7cXVlc3Rpb24uZ2V0VHlwZSgpfS0ke3JlbmRlckFzfWA7XG4gICAgICAgICAgICBpZihGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLmlzVHlwZVJlZ2lzdGVyZWQodHlwZSkpIHJldHVybiB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxdWVzdGlvbi5nZXRUeXBlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udGVudFF1ZXN0aW9uVHlwZShxdWVzdGlvbjogUXVlc3Rpb24sIHN1cnZleTogU3VydmV5UERGKTogc3RyaW5nIHtcbiAgICAgICAgaWYoISFxdWVzdGlvbi5jdXN0b21XaWRnZXQpIHJldHVybiBxdWVzdGlvbi5jdXN0b21XaWRnZXQucGRmUXVlc3Rpb25UeXBlO1xuICAgICAgICByZXR1cm4gISEoPGFueT5xdWVzdGlvbikuY29udGVudFF1ZXN0aW9uID8gJ2N1c3RvbV9tb2RlbCcgOiB0aGlzLmdldENvbnRlbnRRdWVzdGlvblR5cGVSZW5kZXJBcyhxdWVzdGlvbiwgc3VydmV5KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRSYXRpbmdNaW5XaWR0aChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIubWVhc3VyZVRleHQodGhpcy5SQVRJTkdfTUlOX1dJRFRIKS53aWR0aDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRSYXRpbmdJdGVtVGV4dChxdWVzdGlvbjogUXVlc3Rpb25SYXRpbmdNb2RlbCxcbiAgICAgICAgaW5kZXg6IG51bWJlciwgbG9jVGV4dDogTG9jYWxpemFibGVTdHJpbmcpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJhdGluZ0l0ZW1Mb2NUZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyhsb2NUZXh0Lm93bmVyLCBsb2NUZXh0LnVzZU1hcmtkb3duKTtcbiAgICAgICAgcmF0aW5nSXRlbUxvY1RleHQudGV4dCA9IHRoaXMuZ2V0TG9jU3RyaW5nKGxvY1RleHQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IDAgJiYgcXVlc3Rpb24ubWluUmF0ZURlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByYXRpbmdJdGVtTG9jVGV4dC50ZXh0ID0gcXVlc3Rpb24ubG9jTWluUmF0ZURlc2NyaXB0aW9uLnRleHQgKyAnICcgKyB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmRleCA9PT0gcXVlc3Rpb24udmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoIC0gMSAmJiBxdWVzdGlvbi5tYXhSYXRlRGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJhdGluZ0l0ZW1Mb2NUZXh0LnRleHQgPSB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KSArICcgJyArIHF1ZXN0aW9uLmxvY01heFJhdGVEZXNjcmlwdGlvbi50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByYXRpbmdJdGVtTG9jVGV4dDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbWFnZVBpY2tlckF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gKHRoaXMuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC1cbiAgICAgICAgICAgICh0aGlzLklNQUdFUElDS0VSX0NPVU5UIC0gMSkgKiBjb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICByZXR1cm4gd2lkdGggPiAwID8gd2lkdGggOiBjb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29sdW1uV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgY29sQ291bnQ6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gKHRoaXMuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC0gKGNvbENvdW50IC0gMSkgKlxuICAgICAgICAgICAgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpIC8gY29sQ291bnQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Q29sdW1uTWFyZ2lucyhjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBjb2xDb3VudDogbnVtYmVyLCBjb2x1bW46IG51bWJlcikge1xuICAgICAgICBjb25zdCBjZWxsV2lkdGg6IG51bWJlciA9IHRoaXMuZ2V0Q29sdW1uV2lkdGgoY29udHJvbGxlciwgY29sQ291bnQpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICsgY29sdW1uICpcbiAgICAgICAgICAgIChjZWxsV2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aCAqIHRoaXMuR0FQX0JFVFdFRU5fQ09MVU1OUyk7XG4gICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArIChjb2xDb3VudCAtIGNvbHVtbiAtIDEpICpcbiAgICAgICAgICAgIChjZWxsV2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aCAqIHRoaXMuR0FQX0JFVFdFRU5fQ09MVU1OUyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgbW92ZVJlY3QocmVjdDogSVJlY3QsIGxlZnQ6IG51bWJlciA9IHJlY3QueExlZnQsIHRvcDogbnVtYmVyID0gcmVjdC55VG9wKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IGxlZnQsXG4gICAgICAgICAgICB5VG9wOiB0b3AsXG4gICAgICAgICAgICB4UmlnaHQ6IGxlZnQgKyByZWN0LnhSaWdodCAtIHJlY3QueExlZnQsXG4gICAgICAgICAgICB5Qm90OiB0b3AgKyByZWN0LnlCb3QgLSByZWN0LnlUb3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBzY2FsZVJlY3QocmVjdDogSVJlY3QsIHNjYWxlOiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIGNvbnN0IHNjYWxlV2lkdGg6IG51bWJlciA9IE1hdGgubWluKHJlY3QueFJpZ2h0IC0gcmVjdC54TGVmdCwgcmVjdC55Qm90IC0gcmVjdC55VG9wKSAqICgxLjAgLSBzY2FsZSkgLyAyLjA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogcmVjdC54TGVmdCArIHNjYWxlV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiByZWN0LnlUb3AgKyBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeFJpZ2h0OiByZWN0LnhSaWdodCAtIHNjYWxlV2lkdGgsXG4gICAgICAgICAgICB5Qm90OiByZWN0LnlCb3QgLSBzY2FsZVdpZHRoXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Qm9yZGVyV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICByZXR1cm4gMi4wICogY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBmb3JtU2NhbGUoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZmxhdDogSVNpemUpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBtaW5TaWRlOiBudW1iZXIgPSBNYXRoLm1pbihmbGF0LndpZHRoLCBmbGF0LmhlaWdodCk7XG4gICAgICAgIHJldHVybiAobWluU2lkZSAtIHRoaXMuZ2V0Qm9yZGVyV2lkdGgoY29udHJvbGxlcikpIC8gbWluU2lkZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZW5lcmF0ZVF1ZXN0aW9uRmxhdHMoc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLmdldENvbnRlbnRRdWVzdGlvblR5cGUocXVlc3Rpb24sIHN1cnZleSk7XG4gICAgICAgIGNvbnN0IGZsYXRRdWVzdGlvbjogSUZsYXRRdWVzdGlvbiA9IEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuXG4gICAgICAgICAgICBjcmVhdGUoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlciwgcXVlc3Rpb25UeXBlKTtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25GbGF0czogSVBkZkJyaWNrW10gPSBhd2FpdCBmbGF0UXVlc3Rpb24uZ2VuZXJhdGVGbGF0cyhwb2ludCk7XG4gICAgICAgIGNvbnN0IGFkb3JuZXJzT3B0aW9uczogQWRvcm5lcnNPcHRpb25zID0gbmV3IEFkb3JuZXJzT3B0aW9ucyhwb2ludCxcbiAgICAgICAgICAgIHF1ZXN0aW9uRmxhdHMsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLCBTdXJ2ZXlQREZNb2R1bGUpO1xuICAgICAgICBpZiAocXVlc3Rpb24uY3VzdG9tV2lkZ2V0ICYmIHF1ZXN0aW9uLmN1c3RvbVdpZGdldC5pc0ZpdChxdWVzdGlvbikgJiZcbiAgICAgICAgICAgIHF1ZXN0aW9uLmN1c3RvbVdpZGdldC5wZGZSZW5kZXIpIHtcbiAgICAgICAgICAgIHN1cnZleS5vblJlbmRlclF1ZXN0aW9uLnVuc2hpZnQocXVlc3Rpb24uY3VzdG9tV2lkZ2V0LnBkZlJlbmRlcik7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgc3VydmV5Lm9uUmVuZGVyUXVlc3Rpb24uZmlyZShzdXJ2ZXksIGFkb3JuZXJzT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBbLi4uYWRvcm5lcnNPcHRpb25zLmJyaWNrc107XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNGb250RXhpc3QoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZm9udE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kb2MuaW50ZXJuYWwuZ2V0Rm9udChmb250TmFtZSkuZm9udE5hbWUgPT09IGZvbnROYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzQ3VzdG9tRm9udChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBmb250TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRvYy5pbnRlcm5hbC5nZXRGb250KGZvbnROYW1lKS5lbmNvZGluZyA9PT0gdGhpcy5DVVNUT01fRk9OVF9FTkNPRElORztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBmaXhGb250KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDdXN0b21Gb250KGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuZm9udE5hbWUpKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy50ZXh0KCdsb2FkIGZvbnQnLCAwLCAwKTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZG9jLmRlbGV0ZVBhZ2UoMSk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmFkZFBhZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNsb25lKHNyYzogYW55KTogYW55IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0OiBhbnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHNyYykge1xuICAgICAgICAgICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHNyY1twcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNob3VsZFJlbmRlclJlYWRPbmx5KHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlYWRPbmx5PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKCghIXF1ZXN0aW9uICYmIHF1ZXN0aW9uLmlzUmVhZE9ubHkgfHwgcmVhZE9ubHkpICYmIFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKFxuICAgICAgICAgICAgPFF1ZXN0aW9uPnF1ZXN0aW9uLCBjb250cm9sbGVyKSAhPT0gJ2Fjcm9mb3JtJykgfHwgY29udHJvbGxlcj8uY29tcHJlc3M7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNTaXplRW1wdHkodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF2YWwgfHwgdmFsID09PSAnYXV0byc7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNIZWlnaHRFbXB0eSh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NpemVFbXB0eSh2YWwpIHx8IHZhbCA9PSAnMTAwJSc7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0Q29ycmVjdGVkSW1hZ2VTaXplKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGltYWdlT3B0aW9uczogeyBpbWFnZVdpZHRoPzogYW55LCBpbWFnZUhlaWdodD86IGFueSwgaW1hZ2VMaW5rOiBzdHJpbmcsIGRlZmF1bHRJbWFnZVdpZHRoPzogYW55LCBkZWZhdWx0SW1hZ2VIZWlnaHQ/OiBhbnkgfSk6IFByb21pc2U8SVNpemU+IHtcbiAgICAgICAgbGV0IHsgaW1hZ2VXaWR0aCwgaW1hZ2VMaW5rLCBpbWFnZUhlaWdodCwgZGVmYXVsdEltYWdlV2lkdGgsIGRlZmF1bHRJbWFnZUhlaWdodCB9ID0gaW1hZ2VPcHRpb25zO1xuICAgICAgICBpbWFnZVdpZHRoID0gdHlwZW9mIGltYWdlV2lkdGggPT09ICdudW1iZXInID8gaW1hZ2VXaWR0aC50b1N0cmluZygpIDogaW1hZ2VXaWR0aDtcbiAgICAgICAgaW1hZ2VIZWlnaHQgPSB0eXBlb2YgaW1hZ2VIZWlnaHQgPT09ICdudW1iZXInID8gaW1hZ2VIZWlnaHQudG9TdHJpbmcoKSA6IGltYWdlSGVpZ2h0O1xuICAgICAgICBsZXQgd2lkdGhQdDogbnVtYmVyID0gaW1hZ2VXaWR0aCAmJiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChpbWFnZVdpZHRoLCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpLCAxLCAncHgnKTtcbiAgICAgICAgbGV0IGhlaWdodFB0OiBudW1iZXIgPSBpbWFnZUhlaWdodCAmJiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChpbWFnZUhlaWdodCwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSwgMSwgJ3B4Jyk7XG4gICAgICAgIGRlZmF1bHRJbWFnZVdpZHRoID0gdHlwZW9mIGRlZmF1bHRJbWFnZVdpZHRoID09PSAnbnVtYmVyJyA/IGRlZmF1bHRJbWFnZVdpZHRoLnRvU3RyaW5nKCkgOiBkZWZhdWx0SW1hZ2VXaWR0aDtcbiAgICAgICAgZGVmYXVsdEltYWdlSGVpZ2h0ID0gdHlwZW9mIGRlZmF1bHRJbWFnZUhlaWdodCA9PT0gJ251bWJlcicgPyBkZWZhdWx0SW1hZ2VIZWlnaHQudG9TdHJpbmcoKSA6IGRlZmF1bHRJbWFnZUhlaWdodDtcbiAgICAgICAgbGV0IGRlZmF1bHRXaWR0aFB0OiBudW1iZXIgPSBkZWZhdWx0SW1hZ2VXaWR0aCAmJiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChkZWZhdWx0SW1hZ2VXaWR0aCwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSwgMSwgJ3B4Jyk7XG4gICAgICAgIGxldCBkZWZhdWx0SGVpZ2h0UHQ6IG51bWJlciA9IGRlZmF1bHRJbWFnZUhlaWdodCAmJiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChkZWZhdWx0SW1hZ2VIZWlnaHQsIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlciksIDEsICdweCcpO1xuXG4gICAgICAgIGlmKFN1cnZleUhlbHBlci5pc1NpemVFbXB0eShpbWFnZVdpZHRoKSB8fCBTdXJ2ZXlIZWxwZXIuaXNIZWlnaHRFbXB0eShpbWFnZUhlaWdodCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IGF3YWl0IFN1cnZleUhlbHBlci5nZXRJbWFnZVNpemUoaW1hZ2VMaW5rKTtcbiAgICAgICAgICAgIGlmKCFTdXJ2ZXlIZWxwZXIuaXNTaXplRW1wdHkoaW1hZ2VXaWR0aCkpIHtcbiAgICAgICAgICAgICAgICBpZihpbWFnZVNpemUgJiYgaW1hZ2VTaXplLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodFB0ID0gaW1hZ2VTaXplLmhlaWdodCAqIHdpZHRoUHQgLyBpbWFnZVNpemUud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZighU3VydmV5SGVscGVyLmlzSGVpZ2h0RW1wdHkoaW1hZ2VIZWlnaHQpKSB7XG4gICAgICAgICAgICAgICAgaWYoaW1hZ2VTaXplICYmIGltYWdlU2l6ZS5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhQdCA9IGltYWdlU2l6ZS53aWR0aCAqIGhlaWdodFB0IC8gaW1hZ2VTaXplLmhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKGltYWdlU2l6ZSAmJiBpbWFnZVNpemUuaGVpZ2h0ICYmIGltYWdlU2l6ZS53aWR0aCkge1xuICAgICAgICAgICAgICAgIGhlaWdodFB0ID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoaW1hZ2VTaXplLmhlaWdodC50b1N0cmluZygpLCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpLCAxLCAncHgnKTtcbiAgICAgICAgICAgICAgICB3aWR0aFB0ID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoaW1hZ2VTaXplLndpZHRoLnRvU3RyaW5nKCksIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlciksIDEsICdweCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHdpZHRoOiB3aWR0aFB0IHx8IGRlZmF1bHRXaWR0aFB0IHx8IDAsIGhlaWdodDogaGVpZ2h0UHQgfHwgZGVmYXVsdEhlaWdodFB0IHx8IDAgfTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2hlbHBlcl9zdXJ2ZXkudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJRmxhdFF1ZXN0aW9uLCBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uRGVmYXVsdCB9IGZyb20gJy4vZmxhdF9kZWZhdWx0JztcblxuZXhwb3J0IHR5cGUgRmxhdENvbnN0cnVjdG9yID0gbmV3IChcbiAgICBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXJcbikgPT4gSUZsYXRRdWVzdGlvbjtcbmV4cG9ydCBjbGFzcyBGbGF0UmVwb3NpdG9yeSB7XG4gICAgcHJpdmF0ZSBxdWVzdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBGbGF0Q29uc3RydWN0b3IgfSA9IHt9O1xuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBGbGF0UmVwb3NpdG9yeSA9IG5ldyBGbGF0UmVwb3NpdG9yeSgpO1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogRmxhdFJlcG9zaXRvcnkge1xuICAgICAgICByZXR1cm4gRmxhdFJlcG9zaXRvcnkuaW5zdGFuY2U7XG4gICAgfVxuICAgIHB1YmxpYyByZWdpc3Rlcihtb2RlbFR5cGU6IHN0cmluZywgcmVuZGVyZXJDb25zdHJ1Y3RvcjogRmxhdENvbnN0cnVjdG9yKTogdm9pZCB7XG4gICAgICAgIHRoaXMucXVlc3Rpb25zW21vZGVsVHlwZV0gPSByZW5kZXJlckNvbnN0cnVjdG9yO1xuICAgIH1cbiAgICBwdWJsaWMgaXNUeXBlUmVnaXN0ZXJlZCh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWVzdGlvbnNbdHlwZV07XG4gICAgfVxuICAgIHB1YmxpYyBnZXRSZW5kZXJlcih0eXBlOiBzdHJpbmcpOiBGbGF0Q29uc3RydWN0b3Ige1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbnNbdHlwZV07XG4gICAgfVxuICAgIHB1YmxpYyBjcmVhdGUoc3VydmV5OiBTdXJ2ZXlQREYsIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgZG9jQ29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdHlwZT86IHN0cmluZyk6IElGbGF0UXVlc3Rpb24ge1xuICAgICAgICBjb25zdCBxdWVzdGlvblR5cGU6IHN0cmluZyA9IHR5cGVvZiB0eXBlID09PSAndW5kZWZpbmVkJyA/IHF1ZXN0aW9uLmdldFR5cGUoKSA6IHR5cGU7XG4gICAgICAgIGxldCByZW5kZXJlckNvbnN0cnVjdG9yID0gdGhpcy5nZXRSZW5kZXJlcihxdWVzdGlvblR5cGUpO1xuICAgICAgICBpZighcmVuZGVyZXJDb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgaWYoISFxdWVzdGlvbi5jdXN0b21XaWRnZXQ/LnBkZlJlbmRlcikge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyQ29uc3RydWN0b3IgPSBGbGF0UXVlc3Rpb247XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyQ29uc3RydWN0b3IgPSBGbGF0UXVlc3Rpb25EZWZhdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgcmVuZGVyZXJDb25zdHJ1Y3RvcihzdXJ2ZXksIHF1ZXN0aW9uLCBkb2NDb250cm9sbGVyKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyByZWdpc3Rlcih0eXBlOiBzdHJpbmcsIHJlbmRlcmVyQ29uc3RydWN0b3I6IEZsYXRDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgICAgICB0aGlzLmdldEluc3RhbmNlKCkucmVnaXN0ZXIodHlwZSwgcmVuZGVyZXJDb25zdHJ1Y3Rvcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVuZGVyZXIodHlwZTogc3RyaW5nKTogRmxhdENvbnN0cnVjdG9yIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW5zdGFuY2UoKS5nZXRSZW5kZXJlcih0eXBlKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmVwb3NpdG9yeS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb24sIExvY2FsaXphYmxlU3RyaW5nLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRTdXJ2ZXkgfSBmcm9tICcuL2ZsYXRfc3VydmV5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZsYXRRdWVzdGlvbiB7XG4gICAgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+O1xuICAgIGdlbmVyYXRlRmxhdHMocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+O1xufVxuZXhwb3J0IGNsYXNzIEZsYXRRdWVzdGlvbiBpbXBsZW1lbnRzIElGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRTogbnVtYmVyID0gMC41O1xuICAgIHB1YmxpYyBzdGF0aWMgQ09OVEVOVF9HQVBfSE9SX1NDQUxFOiBudW1iZXIgPSAxLjA7XG4gICAgcHVibGljIHN0YXRpYyBDT05URU5UX0lOREVOVF9TQ0FMRTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgREVTQ19HQVBfU0NBTEU6IG51bWJlciA9IDAuMDYyNTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb24+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0VGl0bGUocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGl0bGVGbGF0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXREZXNjcmlwdGlvbihwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVEZXNjRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLmxvY0Rlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRIZWFkZXIocG9pbnQ6IElQb2ludCk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKHBvaW50KTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2sodGl0bGVGbGF0KTtcbiAgICAgICAgaWYodGhpcy5xdWVzdGlvbi5oYXNEZXNjcmlwdGlvblVuZGVyVGl0bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRpdGxlRmxhdCwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgZGVzY1BvaW50LnlUb3AgKz0gRmxhdFF1ZXN0aW9uLkRFU0NfR0FQX1NDQUxFICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICBkZXNjUG9pbnQueExlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXREZXNjcmlwdGlvbihkZXNjUG9pbnQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzQ29tbWVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgdGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmxvY0NvbW1lbnRUZXh0O1xuICAgICAgICBjb25zdCBvdGhlclRleHRGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0ZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICBjb25zdCBvdGhlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQob3RoZXJUZXh0RmxhdCk7XG4gICAgICAgIG90aGVyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKG90aGVyVGV4dEZsYXQsIGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgIG90aGVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgZmFsc2UsIHsgcm93czogU3VydmV5SGVscGVyLk9USEVSX1JPV1NfQ09VTlQgfSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbXBvc2l0ZShwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjb250ZW50UGFuZWwgPSAoPGFueT50aGlzLnF1ZXN0aW9uKS5jb250ZW50UGFuZWw7XG4gICAgICAgIGlmICghIWNvbnRlbnRQYW5lbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IEZsYXRTdXJ2ZXkuZ2VuZXJhdGVGbGF0c1BhbmVsKHRoaXMuc3VydmV5LFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgY29udGVudFBhbmVsLCBwb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IFN1cnZleUhlbHBlci5nZXRDb250ZW50UXVlc3Rpb24odGhpcy5xdWVzdGlvbik7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnRXaXRoT3B0aW9uYWxFbGVtZW50cyhwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBmbGF0czogQXJyYXk8SVBkZkJyaWNrPiA9IFtdO1xuICAgICAgICBjb25zdCBjb250ZW50RmxhdHMgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb21wb3NpdGUocG9pbnQpO1xuICAgICAgICBmbGF0cy5wdXNoKC4uLmNvbnRlbnRGbGF0cyk7XG4gICAgICAgIGNvbnN0IGdldExhdGVzdFBvaW50ID0gKCk6IElQb2ludCA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICAgICAgaWYoY29udGVudEZsYXRzICE9PSBudWxsICYmIGNvbnRlbnRGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICByZXMueVRvcCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmZsYXRzKS55Qm90ICsgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc0NvbW1lbnQpIHtcbiAgICAgICAgICAgIGZsYXRzLnB1c2goYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29tbWVudChnZXRMYXRlc3RQb2ludCgpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaGFzRGVzY3JpcHRpb25VbmRlcklucHV0KSB7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24oZ2V0TGF0ZXN0UG9pbnQoKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0cyhwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQodGhpcy5xdWVzdGlvbi5pbmRlbnQpLndpZHRoO1xuICAgICAgICBjb25zdCBpbmRlbnRQb2ludDogSVBvaW50ID0ge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0ICsgdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMucXVlc3Rpb24uaW5kZW50KS53aWR0aCxcbiAgICAgICAgICAgIHlUb3A6IHBvaW50LnlUb3BcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGxldCB0aXRsZUxvY2F0aW9uOiBzdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmdldFRpdGxlTG9jYXRpb24oKTtcbiAgICAgICAgdGl0bGVMb2NhdGlvbiA9IHRoaXMucXVlc3Rpb24uaGFzVGl0bGUgPyB0aXRsZUxvY2F0aW9uIDogJ2hpZGRlbic7XG4gICAgICAgIHN3aXRjaCAodGl0bGVMb2NhdGlvbikge1xuICAgICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgIGNhc2UgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyRmxhdCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SGVhZGVyKGluZGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoaGVhZGVyRmxhdCk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgaGVhZGVyRmxhdC5hZGRCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChoZWFkZXJGbGF0KSwgdGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKlxuICAgICAgICAgICAgICAgICAgICBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50RmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudFdpdGhPcHRpb25hbEVsZW1lbnRzKGNvbnRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBpZihjb250ZW50RmxhdHMgIT09IG51bGwgJiYgY29udGVudEZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJGbGF0LmFkZEJyaWNrKGNvbnRlbnRGbGF0cy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaChoZWFkZXJGbGF0KTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmNvbnRlbnRGbGF0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdib3R0b20nOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUoaW5kZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50RmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudFdpdGhPcHRpb25hbEVsZW1lbnRzKGNvbnRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmNvbnRlbnRGbGF0cyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVQb2ludDogSVBvaW50ID0gaW5kZW50UG9pbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnlUb3AgPSBmbGF0c1tmbGF0cy5sZW5ndGggLSAxXS55Qm90O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SGVhZGVyKHRpdGxlUG9pbnQpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2xlZnQnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCAtXG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5NVUxUSVBMRVRFWFRfVEVYVF9QRVJTKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SGVhZGVyKGluZGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChoZWFkZXJGbGF0LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250ZW50UG9pbnQueExlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0dBUF9IT1JfU0NBTEU7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGNvbnRlbnRQb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50RmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudFdpdGhPcHRpb25hbEVsZW1lbnRzKGNvbnRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgaWYoY29udGVudEZsYXRzICE9PSBudWxsICYmIGNvbnRlbnRGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyRmxhdC5hZGRCcmljayhjb250ZW50RmxhdHMuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goaGVhZGVyRmxhdCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnaGlkZGVuJzpcbiAgICAgICAgICAgIGNhc2UgU3VydmV5SGVscGVyLlRJVExFX0xPQ0FUSU9OX01BVFJJWDpcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlTG9jYXRpb24gIT09IFN1cnZleUhlbHBlci5USVRMRV9MT0NBVElPTl9NQVRSSVgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb250ZW50V2l0aE9wdGlvbmFsRWxlbWVudHMoY29udGVudFBvaW50KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXQgc2hvdWxkUmVuZGVyQXNDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gU3VydmV5SGVscGVyLnNob3VsZFJlbmRlclJlYWRPbmx5KHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcik7XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdxdWVzdGlvbicsIHtcbiAgICBuYW1lOiAncmVhZG9ubHlSZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICd0ZXh0JywgJ2Fjcm9mb3JtJ10sXG4gICAgdmlzaWJsZTogZmFsc2Vcbn0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3F1ZXN0aW9uLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcblxuZXhwb3J0IGNsYXNzIFRleHRCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgYWxpZ246IGFueTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLmFsaWduID0ge1xuICAgICAgICAgICAgaXNJbnB1dFJ0bDogZmFsc2UsXG4gICAgICAgICAgICBpc091dHB1dFJ0bDogY29udHJvbGxlci5pc1JUTCxcbiAgICAgICAgICAgIGFsaWduOiBjb250cm9sbGVyLmlzUlRMID8gJ3JpZ2h0JzogJ2xlZnQnLFxuICAgICAgICAgICAgYmFzZWxpbmU6ICdtaWRkbGUnXG4gICAgICAgIH07XG4gICAgfVxuICAgIHByaXZhdGUgZXNjYXBlVGV4dCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMudGV4dC5pbmRleE9mKCdcXHQnKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnRleHQgPSB0aGlzLnRleHQucmVwbGFjZSgnXFx0JywgQXJyYXkoNSkuam9pbihTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50ZXh0O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBhbGlnblBvaW50OiBJUG9pbnQgPSB0aGlzLmFsaWduUG9pbnQodGhpcyk7XG4gICAgICAgIGxldCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSB0aGlzLmZvbnRTaXplO1xuICAgICAgICBsZXQgb2xkVGV4dENvbG9yOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLmdldFRleHRDb2xvcigpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldFRleHRDb2xvcih0aGlzLnRleHRDb2xvcik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MudGV4dCh0aGlzLmVzY2FwZVRleHQoKSwgYWxpZ25Qb2ludC54TGVmdCwgYWxpZ25Qb2ludC55VG9wLCB0aGlzLmFsaWduKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3Iob2xkVGV4dENvbG9yKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhbGlnblBvaW50KHJlY3Q6IElSZWN0KTogSVBvaW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiB0aGlzLmNvbnRyb2xsZXIuaXNSVEwgPyByZWN0LnhSaWdodCA6IHJlY3QueExlZnQsXG4gICAgICAgICAgICB5VG9wOiByZWN0LnlUb3AgKyAocmVjdC55Qm90IC0gcmVjdC55VG9wKSAvIDIuMFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dC50cyIsImltcG9ydCB7IElQZGZCcmljaywgVHJhbnNsYXRlWEZ1bmN0aW9uIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBicmlja3M6IElQZGZCcmlja1tdID0gW107XG4gICAgcHJpdmF0ZSBfeExlZnQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF94UmlnaHQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF95VG9wOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeUJvdDogbnVtYmVyO1xuICAgIHB1YmxpYyBpc1BhZ2VCcmVhazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciguLi5icmlja3M6IElQZGZCcmlja1tdKSB7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0gMC4wO1xuICAgICAgICB0aGlzLl94UmlnaHQgPSAwLjA7XG4gICAgICAgIHRoaXMuX3lUb3AgPSAwLjA7XG4gICAgICAgIHRoaXMuX3lCb3QgPSAwLjA7XG4gICAgICAgIHRoaXMuYWRkQnJpY2soLi4uYnJpY2tzKTtcbiAgICB9XG4gICAgZ2V0IHhMZWZ0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl94TGVmdDsgfVxuICAgIHNldCB4TGVmdCh4TGVmdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2hpZnQoeExlZnQgLSB0aGlzLnhMZWZ0LCAwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgdGhpcy5feExlZnQgPSB4TGVmdDtcbiAgICB9XG4gICAgZ2V0IHhSaWdodCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feFJpZ2h0OyB9XG4gICAgc2V0IHhSaWdodCh4UmlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KDAuMCwgeFJpZ2h0IC0gdGhpcy54UmlnaHQsIDAuMCwgMC4wKTtcbiAgICAgICAgdGhpcy5feFJpZ2h0ID0geFJpZ2h0O1xuICAgIH1cbiAgICBnZXQgeVRvcCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feVRvcDsgfVxuICAgIHNldCB5VG9wKHlUb3A6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KDAuMCwgMC4wLCB5VG9wIC0gdGhpcy55VG9wLCAwLjApO1xuICAgICAgICB0aGlzLl95VG9wID0geVRvcDtcbiAgICB9XG4gICAgZ2V0IHlCb3QoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3lCb3Q7IH1cbiAgICBzZXQgeUJvdCh5Qm90OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIDAuMCwgMC4wLCB5Qm90IC0gdGhpcy55Qm90KTtcbiAgICAgICAgdGhpcy5feUJvdCA9IHlCb3Q7XG4gICAgfVxuICAgIHByaXZhdGUgc2hpZnQobGVmdFNoaWZ0OiBudW1iZXIsIHJpZ2h0U2hpZnQ6IG51bWJlcixcbiAgICAgICAgdG9wU2hpZnQ6IG51bWJlciwgYm90U2hpZnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLmJyaWNrcy5mb3JFYWNoKChicmljazogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICBicmljay54TGVmdCArPSBsZWZ0U2hpZnQ7XG4gICAgICAgICAgICBicmljay54UmlnaHQgKz0gcmlnaHRTaGlmdDtcbiAgICAgICAgICAgIGJyaWNrLnlUb3AgKz0gdG9wU2hpZnQ7XG4gICAgICAgICAgICBicmljay55Qm90ICs9IGJvdFNoaWZ0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5icmlja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYnJpY2tzW2ldLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJpY2tzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgcHVibGljIGFkZEJyaWNrKC4uLmJyaWNrczogSVBkZkJyaWNrW10pIHtcbiAgICAgICAgaWYgKGJyaWNrcy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgdGhpcy5icmlja3MucHVzaCguLi5icmlja3MpO1xuICAgICAgICAgICAgbGV0IG1lcmdlUmVjdCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLnRoaXMuYnJpY2tzKTtcbiAgICAgICAgICAgIHRoaXMuX3hMZWZ0ID0gbWVyZ2VSZWN0LnhMZWZ0O1xuICAgICAgICAgICAgdGhpcy5feFJpZ2h0ID0gbWVyZ2VSZWN0LnhSaWdodDtcbiAgICAgICAgICAgIHRoaXMuX3lUb3AgPSBtZXJnZVJlY3QueVRvcDtcbiAgICAgICAgICAgIHRoaXMuX3lCb3QgPSBtZXJnZVJlY3QueUJvdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgdW5mb2xkKCk6IElQZGZCcmlja1tdIHtcbiAgICAgICAgY29uc3QgdW5mb2xkQnJpY2tzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICB0aGlzLmJyaWNrcy5mb3JFYWNoKChicmljazogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRCcmlja3MucHVzaCguLi5icmljay51bmZvbGQoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdW5mb2xkQnJpY2tzO1xuICAgIH1cbiAgICB0cmFuc2xhdGVYKGZ1bmM6IFRyYW5zbGF0ZVhGdW5jdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLmJyaWNrcy5mb3JFYWNoKGJyaWNrID0+IGJyaWNrLnRyYW5zbGF0ZVgoZnVuYykpO1xuICAgICAgICBjb25zdCByZXMgPSBmdW5jKHRoaXMueExlZnQsIHRoaXMueFJpZ2h0KTtcbiAgICAgICAgdGhpcy5feExlZnQgPSByZXMueExlZnQ7XG4gICAgICAgIHRoaXMuX3hSaWdodCA9IHJlcy54UmlnaHQ7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUudHMiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNl9fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcIlN1cnZleVwiLFwiY29tbW9uanMyXCI6XCJzdXJ2ZXktY29yZVwiLFwiY29tbW9uanNcIjpcInN1cnZleS1jb3JlXCIsXCJhbWRcIjpcInN1cnZleS1jb3JlXCJ9XG4vLyBtb2R1bGUgaWQgPSA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCB7IElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IHR5cGUgVHJhbnNsYXRlWEZ1bmN0aW9uID0gKHhMZWZ0OiBudW1iZXIsIHhSaWdodCA6IG51bWJlcikgPT4geyB4TGVmdDogbnVtYmVyLCB4UmlnaHQ6IG51bWJlcn07XG5leHBvcnQgaW50ZXJmYWNlIElQZGZCcmljayBleHRlbmRzIElSZWN0LCBJU2l6ZSB7XG4gICAgcmVuZGVyKCk6IFByb21pc2U8dm9pZD47XG4gICAgdW5mb2xkKCk6IElQZGZCcmlja1tdO1xuICAgIHRyYW5zbGF0ZVgoZnVuYzogVHJhbnNsYXRlWEZ1bmN0aW9uKTogdm9pZDtcbiAgICBpc1BhZ2VCcmVhazogYm9vbGVhbjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIGEgUERGIGJyaWNrJm1kYXNoO2Egc2ltcGxlIGVsZW1lbnQgd2l0aCBzcGVjaWZpZWQgY29udGVudCwgc2l6ZSwgYW5kIGxvY2F0aW9uLiBCcmlja3MgYXJlIGZ1bmRhbWVudGFsIGVsZW1lbnRzIHVzZWQgdG8gY29uc3RydWN0IGEgUERGIGRvY3VtZW50LlxuICpcbiAqIFlvdSBjYW4gYWNjZXNzIGBQZGZCcmlja2Agb2JqZWN0cyB3aXRoaW4gZnVuY3Rpb25zIHRoYXQgaGFuZGxlIGBTdXJ2ZXlQREZgJ3MgW2BvblJlbmRlclF1ZXN0aW9uYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9zdXJ2ZXlwZGYjb25SZW5kZXJRdWVzdGlvbiksIFtgb25SZW5kZXJQYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVyUGFuZWwpLCBhbmQgW2BvblJlbmRlclBhZ2VgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlclBhZ2UpIGV2ZW50cy5cbiAqXG4gKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvYWRkLW1hcmt1cC10by1jdXN0b21pemUtcGRmLWZvcm1zLyAobGlua1N0eWxlKSlcbiAqL1xuZXhwb3J0IGNsYXNzIFBkZkJyaWNrIGltcGxlbWVudHMgSVBkZkJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgX3hMZWZ0OiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF94UmlnaHQ6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX3lUb3A6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX3lCb3Q6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEFuIFgtY29vcmRpbmF0ZSBmb3IgdGhlIGxlZnQgYnJpY2sgZWRnZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHhMZWZ0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl94TGVmdDtcbiAgICB9XG4gICAgcHVibGljIHNldCB4TGVmdCh2YWw6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldFhMZWZ0KHZhbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIFgtY29vcmRpbmF0ZSBmb3IgdGhlIHJpZ2h0IGJyaWNrIGVkZ2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCB4UmlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3hSaWdodDtcbiAgICB9XG4gICAgcHVibGljIHNldCB4UmlnaHQodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRYUmlnaHQodmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBZLWNvb3JkaW5hdGUgZm9yIHRoZSB0b3AgYnJpY2sgZWRnZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHlUb3AoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3lUb3A7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgeVRvcCh2YWw6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldFlUb3AodmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBZLWNvb3JkaW5hdGUgZm9yIHRoZSBib3R0b20gYnJpY2sgZWRnZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHlCb3QoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3lCb3Q7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgeUJvdCh2YWw6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldFlCb3R0b20odmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRm9udCBzaXplIGluIHBvaW50cy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IDE0IChpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50IFBERiBkb2N1bWVudClcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9udFNpemU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29sb3Igb2YgdGV4dCB3aXRoaW4gdGhlIGJyaWNrLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYFwiIzQwNDA0MFwiYFxuICAgICAqL1xuICAgIHB1YmxpYyB0ZXh0Q29sb3I6IHN0cmluZyA9IFN1cnZleUhlbHBlci5URVhUX0NPTE9SO1xuICAgIHB1YmxpYyBmb3JtQm9yZGVyQ29sb3I6IHN0cmluZyA9IFN1cnZleUhlbHBlci5GT1JNX0JPUkRFUl9DT0xPUjtcbiAgICBwdWJsaWMgaXNQYWdlQnJlYWs6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWN0OiBJUmVjdCkge1xuICAgICAgICB0aGlzLnhMZWZ0ID0gcmVjdC54TGVmdDtcbiAgICAgICAgdGhpcy54UmlnaHQgPSByZWN0LnhSaWdodDtcbiAgICAgICAgdGhpcy55VG9wID0gcmVjdC55VG9wO1xuICAgICAgICB0aGlzLnlCb3QgPSByZWN0LnlCb3Q7XG4gICAgICAgIHRoaXMuZm9udFNpemUgPSAhIWNvbnRyb2xsZXIgP1xuICAgICAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA6IERvY0NvbnRyb2xsZXIuRk9OVF9TSVpFO1xuICAgIH1cbiAgICB0cmFuc2xhdGVYKGZ1bmM6IFRyYW5zbGF0ZVhGdW5jdGlvbik6IHZvaWQge1xuICAgICAgICBjb25zdCByZXMgPSBmdW5jKHRoaXMueExlZnQsIHRoaXMueFJpZ2h0KTtcbiAgICAgICAgdGhpcy54TGVmdCA9IHJlcy54TGVmdDtcbiAgICAgICAgdGhpcy54UmlnaHQgPSByZXMueFJpZ2h0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYnJpY2sncyB3aWR0aCBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYnJpY2sncyBoZWlnaHQgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnlCb3QgLSB0aGlzLnlUb3A7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRTaG91bGRSZW5kZXJSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5zaG91bGRSZW5kZXJSZWFkT25seSh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBwdWJsaWMgYWZ0ZXJSZW5kZXJDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5nZXRTaG91bGRSZW5kZXJSZWFkT25seSgpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclJlYWRPbmx5KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBhd2FpdCB0aGlzLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgICAgIHRoaXMuYWZ0ZXJSZW5kZXJDYWxsYmFjayAmJiB0aGlzLmFmdGVyUmVuZGVyQ2FsbGJhY2soKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93cyB5b3UgdG8gZ2V0IGEgZmxhdCBhcnJheSBvZiBuZXN0ZWQgUERGIGJyaWNrcy5cbiAgICAgKiBAcmV0dXJucyBBIGZsYXQgYXJyYXkgb2YgbmVzdGVkIFBERiBicmlja3MuXG4gICAgICovXG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIHJldHVybiBbdGhpc107XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRDb3JyZWN0ZWRUZXh0KHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5pc1JUTCA/ICh2YWwgfHwgJycpLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyk6IHZhbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFhMZWZ0KHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0gdmFsO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WFJpZ2h0KHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3hSaWdodCA9IHZhbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFlUb3AodmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5feVRvcCA9IHZhbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFlCb3R0b20odmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5feUJvdCA9IHZhbDtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfYnJpY2sudHMiLCJpbXBvcnQgeyBqc1BERiwganNQREZPcHRpb25zIH0gZnJvbSAnanNwZGYnO1xuaW1wb3J0IHsgSUhUTUxSZW5kZXJUeXBlIH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X2h0bWwnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuLy8gaW1wb3J0IEZvbnRzIGZyb20gJy4vZm9udHMnO1xuaW1wb3J0IHNldFJhZGlvQXBwZWFyYW5jZSBmcm9tICcuL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0nO1xuaW1wb3J0ICcuL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0uanMnO1xuaW1wb3J0ICcuL2pzcGRmX3BsdWdpbnMvZnJvbV9odG1sLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJUG9pbnQge1xuICAgIC8qKlxuICAgICAqIEFuIFgtY29vcmRpbmF0ZSBmb3IgdGhlIGxlZnQgZWxlbWVudCBlZGdlLlxuICAgICAqL1xuICAgIHhMZWZ0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBZLWNvb3JkaW5hdGUgZm9yIHRoZSB0b3AgZWxlbWVudCBlZGdlLlxuICAgICAqL1xuICAgIHlUb3A6IG51bWJlcjtcbn1cbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgZGVzY3JpYmVzIGEgcmVjdGFuZ2xlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElSZWN0IGV4dGVuZHMgSVBvaW50IHtcbiAgICAvKipcbiAgICAgKiBBbiBYLWNvb3JkaW5hdGUgZm9yIHRoZSByaWdodCBlbGVtZW50IGVkZ2UuXG4gICAgICovXG4gICAgeFJpZ2h0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBZLWNvb3JkaW5hdGUgZm9yIHRoZSBib3R0b20gZWxlbWVudCBlZGdlLlxuICAgICAqL1xuICAgIHlCb3Q6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVNpemUge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIElNYXJnaW5MUiB7XG4gICAgLyoqXG4gICAgICogQSBsZWZ0IG1hcmdpbi5cbiAgICAgKi9cbiAgICBsZWZ0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgcmlnaHQgbWFyZ2luLlxuICAgICAqL1xuICAgIHJpZ2h0PzogbnVtYmVyO1xufVxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgdGhhdCBkZXNjcmliZXMgbWFyZ2lucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTWFyZ2luIGV4dGVuZHMgSU1hcmdpbkxSIHtcbiAgICAvKipcbiAgICAgKiBBIHRvcCBtYXJnaW4uXG4gICAgICovXG4gICAgdG9wPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgYm90dG9tIG1hcmdpbi5cbiAgICAgKi9cbiAgICBib3Q/OiBudW1iZXI7XG59XG4vKipcbiAqIFBERiBkb2N1bWVudCBjb25maWd1cmF0aW9uLiBQYXNzIGl0IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIGBTdXJ2ZXlQREZgIGNvbnN0cnVjdG9yOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBzdXJ2ZXlQZGYgPSBuZXcgU3VydmV5UERGLlN1cnZleVBERihzdXJ2ZXlKc29uLCBwZGZEb2NPcHRpb25zKTtcbiAqXG4gKiAvLyBJbiBtb2R1bGFyIGFwcGxpY2F0aW9uczpcbiAqIGltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gXCJzdXJ2ZXktcGRmXCI7XG4gKiBjb25zdCBzdXJ2ZXlQZGYgPSBuZXcgU3VydmV5UERGKHN1cnZleUpzb24sIHBkZkRvY09wdGlvbnMpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURvY09wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFBhZ2Ugb3JpZW50YXRpb24uXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcInBcImAgKGRlZmF1bHQpIC0gUG9ydHJhaXQgb3JpZW50YXRpb24uXG4gICAgICogLSBgXCJsXCJgIC0gTGFuZHNjYXBlIG9yaWVudGF0aW9uLlxuICAgICAqXG4gICAgICogQHNlZSBmb3JtYXRcbiAgICAgKi9cbiAgICBvcmllbnRhdGlvbj86ICdwJyB8ICdsJztcblxuICAgIC8qKlxuICAgICAqIFBhZ2UgZm9ybWF0LlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJhMFwiYCAtIGBcImExMFwiYCAoYFwiYTRcImAgaXMgZGVmYXVsdClcbiAgICAgKiAtIGBcImIwXCJgIC0gYFwiYjEwXCJgXG4gICAgICogLSBgXCJjMFwiYCAtIGBcImMxMFwiYFxuICAgICAqIC0gYFwiZGxcImBcbiAgICAgKiAtIGBcImxldHRlclwiYFxuICAgICAqIC0gYFwiZ292ZXJubWVudC1sZXR0ZXJcImBcbiAgICAgKiAtIGBcImxlZ2FsXCJgXG4gICAgICogLSBgXCJqdW5pb3ItbGVnYWxcImBcbiAgICAgKiAtIGBcImxlZGdlclwiYFxuICAgICAqIC0gYFwidGFibG9pZFwiYFxuICAgICAqIC0gYFwiY3JlZGl0LWNhcmRcImBcbiAgICAgKiAtIEFycmF5PG51bWJlcj4gLSBjdXN0b20gcGFnZSBzaXplIGluIG1pbGxpbWV0ZXJzLCBmb3IgZXhhbXBsZSwgYFsyMTAsIDI5N11gLlxuICAgICAqXG4gICAgICogQHNlZSBvcmllbnRhdGlvblxuICAgICAqL1xuICAgIGZvcm1hdD86IHN0cmluZyB8IG51bWJlcltdO1xuXG4gICAgLyoqXG4gICAgICogRm9udCBzaXplIGluIHBvaW50cy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IDE0XG4gICAgICpcbiAgICAgKiBAc2VlIGZvbnROYW1lXG4gICAgICovXG4gICAgZm9udFNpemU/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBGb250IG5hbWUuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcIkhlbHZldGljYVwiYCAoZGVmYXVsdClcbiAgICAgKiAtIGBcIkNvdXJpZXJcImBcbiAgICAgKiAtIGBcIlRpbWVzXCJgXG4gICAgICogLSBgXCJTeW1ib2xcImBcbiAgICAgKiAtIGBcIlphcGZEaW5nYmF0c1wiYFxuICAgICAqIC0gW0N1c3RvbSBmb250IG5hbWVdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9QZGYtRXhwb3J0P2lkPUN1c3RvbWl6YXRpb24tQ2hhbmdlRm9udHMjdXNlLWN1c3RvbS1mb250KVxuICAgICAqXG4gICAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2NoYW5nZS1mb250LWluLXBkZi1mb3JtLyAobGlua1N0eWxlKSlcbiAgICAgKiBAc2VlIGZvbnRTaXplXG4gICAgICovXG4gICAgZm9udE5hbWU/OiBzdHJpbmc7XG5cbiAgICBiYXNlNjROb3JtYWw/OiBzdHJpbmc7XG4gICAgYmFzZTY0Qm9sZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBhcHBseSBhIGN1c3RvbSBmb250IHRvIFtIVE1MIHF1ZXN0aW9uc10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZXhhbXBsZXMvcXVlc3Rpb250eXBlLWh0bWwvKS5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jaGFuZ2UtZm9udC1pbi1wZGYtZm9ybS8gKGxpbmtTdHlsZSkpXG4gICAgICogQHNlZSBodG1sUmVuZGVyQXNcbiAgICAgKi9cbiAgICB1c2VDdXN0b21Gb250SW5IdG1sPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFBhZ2UgbWFyZ2lucy4gU2V0IHRoaXMgcHJvcGVydHkgdG8gYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHM6IGB0b3BgLCBgYm90YCwgYGxlZnRgLCBgcmlnaHRgLlxuICAgICAqL1xuICAgIG1hcmdpbnM/OiBJTWFyZ2luO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGhvdyB0byByZW5kZXIgW0hUTUwgcXVlc3Rpb25zXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeT9pZD1xdWVzdGlvbmh0bWxtb2RlbCkgaW50byBQREYuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcInN0YW5kYXJkXCJgIC0gUmVuZGVyIEhUTUwgcXVlc3Rpb25zIGFzIHNlbGVjdGFibGUgdGV4dC5cbiAgICAgKiAtIGBcImltYWdlXCJgIC0gUmVuZGVyIEhUTUwgcXVlc3Rpb25zIGFzIGltYWdlcy5cbiAgICAgKiAtIGBcImF1dG9cImAgKGRlZmF1bHQpIC0gU2VsZWN0IGJldHdlZW4gdGhlIGBcInN0YW5kYXJkXCJgIGFuZCBgXCJpbWFnZVwiYCBtb2RlcyBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBIVE1MIGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgcHJvcGVydHkgZm9yIGFuIGluZGl2aWR1YWwgSFRNTCBxdWVzdGlvbi4gU2V0IHRoZSBxdWVzdGlvbidzIGByZW5kZXJBc2AgcHJvcGVydHkgdG8gYFwic3RhbmRhcmRcImAgb3IgYFwiaW1hZ2VcImAgaW4gdGhlIHN1cnZleSBKU09OIHNjaGVtYS5cbiAgICAgKiBAc2VlIHVzZUN1c3RvbUZvbnRJbkh0bWxcbiAgICAgKi9cbiAgICBodG1sUmVuZGVyQXM/OiBJSFRNTFJlbmRlclR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgaG93IHRvIHJlbmRlciBbTWF0cml4XShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeT9pZD1xdWVzdGlvbm1hdHJpeG1vZGVsKSwgW01hdHJpeCBEcm9wZG93bl0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9cXVlc3Rpb25tYXRyaXhkcm9wZG93bm1vZGVsKSwgYW5kIFtNYXRyaXggRHluYW1pY10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9cXVlc3Rpb25tYXRyaXhkeW5hbWljbW9kZWwpIHF1ZXN0aW9ucyBpbnRvIFBERi5cbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKlxuICAgICAqIC0gYFwibGlzdFwiYCAtIFJlbmRlciBtYXRyaXgtbGlrZSBxdWVzdGlvbnMgYXMgbGlzdHMuXG4gICAgICogLSBgXCJhdXRvXCJgIChkZWZhdWx0KSAtIFJlbmRlciBtYXRyaXgtbGlrZSBxdWVzdGlvbnMgYXMgdGFibGVzIGlmIHRoZXkgZml0IGludG8gdGhlIGF2YWlsYWJsZSBzcGFjZS4gT3RoZXJ3aXNlLCByZW5kZXIgdGhlIHF1ZXN0aW9ucyBhcyBsaXN0cy5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBwcm9wZXJ0eSBmb3IgYW4gaW5kaXZpZHVhbCBtYXRyaXgtbGlrZSBxdWVzdGlvbi4gU2V0IHRoZSBxdWVzdGlvbidzIGByZW5kZXJBc2AgcHJvcGVydHkgdG8gYFwibGlzdFwiYCBpbiB0aGUgc3VydmV5IEpTT04gc2NoZW1hLlxuICAgICAqL1xuICAgIG1hdHJpeFJlbmRlckFzPzogJ2F1dG8nIHwgJ2xpc3QnO1xuICAgIHVzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmc/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBob3cgdG8gcmVuZGVyIHJlYWQtb25seSBxdWVzdGlvbnMuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcInRleHRcImAgLSBSZW5kZXIgcmVhZC1vbmx5IHF1ZXN0aW9ucyBhcyBwbGFpbiB0ZXh0IGFuZCBjdXN0b20gcHJpbWl0aXZlcy5cbiAgICAgKiAtIGBcImFjcm9mb3JtXCJgIC0gVXNlIEFkb2JlIEFjcm9Gb3JtcyB0byByZW5kZXIgcXVlc3Rpb25zIHRoYXQgc3VwcG9ydCB0aGVtIGFzIGludGVyYWN0aXZlIGZvcm0gZWxlbWVudHMgc3dpdGNoZWQgdG8gdGhlaXIgbmF0aXZlIHJlYWQtb25seSBzdGF0ZS4gT3RoZXIgcXVlc3Rpb25zIGFyZSByZW5kZXJlZCBpbiBgXCJ0ZXh0XCJgIG1vZGUuXG4gICAgICogLSBgXCJhdXRvXCJgIChkZWZhdWx0KSAtIFByZWZlciB0aGUgYFwidGV4dFwiYCBtb2RlIGJ1dCB1c2UgYFwiYWNyb2Zvcm1cImAgZm9yIFtGaWxlIFVwbG9hZF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2ZpbGUtbW9kZWwpIHF1ZXN0aW9ucyBhbmQgbGlua3MuXG4gICAgICovXG4gICAgcmVhZG9ubHlSZW5kZXJBcz86ICdhdXRvJyB8ICd0ZXh0JyB8ICdhY3JvZm9ybSc7XG5cbiAgICB0ZXh0RmllbGRSZW5kZXJBcz86ICdzaW5nbGVMaW5lJyB8ICdtdWx0aUxpbmUnO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gY29tcHJlc3MgdGhlIFBERiBkb2N1bWVudC4gQ29tcHJlc3NlZCBkb2N1bWVudHMgZG8gbm90IHN1cHBvcnQgW2N1c3RvbSBmb250c10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL1BkZi1FeHBvcnQ/aWQ9Q3VzdG9taXphdGlvbi1DaGFuZ2VGb250cyN1c2UtY3VzdG9tLWZvbnQpLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgICAqL1xuICAgIGNvbXByZXNzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGFwcGx5IGBpbWFnZUZpdGAgc2V0dGluZ3Mgc3BlY2lmaWVkIGluIHRoZSBzdXJ2ZXkgSlNPTiBzY2hlbWEgdG8gZXhwb3J0ZWQgaW1hZ2VzLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgICAqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBhcHBsaWVzIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3M6XG4gICAgICpcbiAgICAgKiAtIFtgaW1hZ2VGaXRgXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvYWRkLWltYWdlLXRvLXN1cnZleSNpbWFnZUZpdCkgdG8gZXhwb3J0ZWQgW0ltYWdlXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvYWRkLWltYWdlLXRvLXN1cnZleSkgcXVlc3Rpb25zXG4gICAgICogLSBbYGltYWdlRml0YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2ltYWdlLXBpY2tlci1xdWVzdGlvbi1tb2RlbCNpbWFnZUZpdCkgdG8gZXhwb3J0ZWQgW0ltYWdlIFBpY2tlcl0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2ltYWdlLXBpY2tlci1xdWVzdGlvbi1tb2RlbCkgcXVlc3Rpb25zXG4gICAgICogLSBbYGxvZ29GaXRgXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5LWRhdGEtbW9kZWwjbG9nb0ZpdCkgdG8gYW4gZXhwb3J0ZWQgbG9nbyBpbiB0aGUgc3VydmV5IGhlYWRlclxuICAgICAqXG4gICAgICogSWYgeW91IGVuYWJsZSB0aGUgYGFwcGx5SW1hZ2VGaXRgIHByb3BlcnR5LCB0aGUgcXVhbGl0eSBvZiBpbWFnZXMgbWF5IGJlIGxvd2VyIGJlY2F1c2UgdGhleSBwYXNzIHRocm91Z2ggc2V2ZXJhbCBjb252ZXJzaW9ucy4gSWYgYGFwcGx5SW1hZ2VGaXRgIGlzIGRpc2FibGVkLCBleHBvcnRlZCBpbWFnZXMgZmlsbCB0aGUgZW50aXJlIGNvbnRhaW5lciBhbmQgZG8gbm90IHByZXNlcnZlIHRoZWlyIGFzcGVjdCByYXRpbywgYnV0IHRoZWlyIHF1YWxpdHkgcmVtYWlucyB0aGUgc2FtZSBiZWNhdXNlIHRoZXkgYXJlIGV4cG9ydGVkIGFzIGlzLlxuICAgICAqL1xuICAgIGFwcGx5SW1hZ2VGaXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFBERiBkb2N1bWVudCBjb250YWlucyB0ZXh0IGluIHJpZ2h0LXRvLWxlZnQgbGFuZ3VhZ2VzLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgICAqL1xuICAgIGlzUlRMPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBpbmNsdWRlIG9ubHkgc2VsZWN0ZWQgY2hvaWNlcyB3aGVuIFBERiBHZW5lcmF0b3IgcmVuZGVycyBhIFtNdWx0aS1TZWxlY3QgRHJvcGRvd24gKFRhZyBCb3gpXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9leGFtcGxlcy9ob3ctdG8tY3JlYXRlLW11bHRpc2VsZWN0LXRhZy1ib3gvKSBxdWVzdGlvbi5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWAgKGluY2x1ZGUgYWxsIGNob2ljZXMpXG4gICAgICovXG4gICAgdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBEb2NPcHRpb25zIGltcGxlbWVudHMgSURvY09wdGlvbnMge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTU1fVE9fUFQgPSA3MiAvIDI1LjQ7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBGT05UX1NJWkUgPSAxNDtcbiAgICBwcm90ZWN0ZWQgX29yaWVudGF0aW9uOiAnbCcgfCAncCc7XG4gICAgcHJvdGVjdGVkIF9mb3JtYXQ6IHN0cmluZyB8IG51bWJlcltdO1xuICAgIHByb3RlY3RlZCBfZm9udFNpemU6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX2ZvbnROYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIHN0YXRpYyBTRUdPRV9OT1JNQUw6IHN0cmluZztcbiAgICBwdWJsaWMgc3RhdGljIFNFR09FX0JPTEQ6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2Jhc2U2NE5vcm1hbDogc3RyaW5nID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfYmFzZTY0Qm9sZDogc3RyaW5nID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfdXNlQ3VzdG9tRm9udEluSHRtbDogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgX21hcmdpbnM6IElNYXJnaW47XG4gICAgcHJvdGVjdGVkIF9odG1sUmVuZGVyQXM6IElIVE1MUmVuZGVyVHlwZTtcbiAgICBwcm90ZWN0ZWQgX21hdHJpeFJlbmRlckFzOiAnYXV0bycgfCAnbGlzdCc7XG4gICAgcHJvdGVjdGVkIF9yZWFkb25seVJlbmRlckFzOiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nO1xuICAgIHByb3RlY3RlZCBfY29tcHJlc3M6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIF9hcHBseUltYWdlRml0OiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfdXNlTGVnYWN5Qm9vbGVhblJlbmRlcmluZzogYm9vbGVhblxuICAgIHByb3RlY3RlZCBfaXNSVEw6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIF90YWdib3hTZWxlY3RlZENob2ljZXNPbmx5OiBib29sZWFuO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRG9jT3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub3JpZW50YXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZm9ybWF0ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0WzBdIDwgb3B0aW9ucy5mb3JtYXRbMV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vcmllbnRhdGlvbiA9ICdwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgdGhpcy5fb3JpZW50YXRpb24gPSAnbCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB0aGlzLl9vcmllbnRhdGlvbiA9IG9wdGlvbnMub3JpZW50YXRpb247XG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9IG9wdGlvbnMuZm9ybWF0IHx8ICdhNCc7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX2Zvcm1hdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1hdCA9IHRoaXMuX2Zvcm1hdC5tYXAoZiA9PiBmICogRG9jT3B0aW9ucy5NTV9UT19QVCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9udFNpemUgPSBvcHRpb25zLmZvbnRTaXplIHx8IERvY09wdGlvbnMuRk9OVF9TSVpFO1xuICAgICAgICBpZighb3B0aW9ucy5mb250TmFtZSkge1xuICAgICAgICAgICAgaWYoIURvY09wdGlvbnMuU0VHT0VfQk9MRCAmJiAhRG9jT3B0aW9ucy5TRUdPRV9OT1JNQUwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb250TmFtZSA9IFN1cnZleUhlbHBlci5TVEFOREFSRF9GT05UO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb250TmFtZSA9ICdzZWdvZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mb250TmFtZSA9IG9wdGlvbnMuZm9udE5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0eXBlb2Ygb3B0aW9ucy5mb250TmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucy5iYXNlNjROb3JtYWwgIT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMuYmFzZTY0Qm9sZCAhPT0gJ3VuZGVmaW5lZCcpKSkge1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Tm9ybWFsID0gb3B0aW9ucy5iYXNlNjROb3JtYWwgfHwgb3B0aW9ucy5iYXNlNjRCb2xkO1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Qm9sZCA9IG9wdGlvbnMuYmFzZTY0Qm9sZCB8fCBvcHRpb25zLmJhc2U2NE5vcm1hbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZvbnROYW1lID09PSAnc2Vnb2UnKSB7XG4gICAgICAgICAgICAvLyB0aGlzLl9iYXNlNjROb3JtYWwgPSBGb250cy5TRUdPRV9OT1JNQUw7XG4gICAgICAgICAgICAvLyB0aGlzLl9iYXNlNjRCb2xkID0gRm9udHMuU0VHT0VfQk9MRDtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2U2NE5vcm1hbCA9IERvY09wdGlvbnMuU0VHT0VfTk9STUFMO1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Qm9sZCA9IERvY09wdGlvbnMuU0VHT0VfQk9MRDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJnaW5zID0gU3VydmV5SGVscGVyLmNsb25lKG9wdGlvbnMubWFyZ2lucyk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMudG9wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy50b3AgPSAxMC4wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucy5ib3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLmJvdCA9IDEwLjA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXJnaW5zLmxlZnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLmxlZnQgPSAxMC4wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucy5yaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMucmlnaHQgPSAxMC4wO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX21hcmdpbnMpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgKDxhbnk+dGhpcy5fbWFyZ2lucylbbmFtZV0gPSAoPGFueT50aGlzLl9tYXJnaW5zKVtuYW1lXSAqIERvY09wdGlvbnMuTU1fVE9fUFQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9odG1sUmVuZGVyQXMgPSBvcHRpb25zLmh0bWxSZW5kZXJBcyB8fCAnYXV0byc7XG4gICAgICAgIHRoaXMuX21hdHJpeFJlbmRlckFzID0gb3B0aW9ucy5tYXRyaXhSZW5kZXJBcyB8fCAnYXV0byc7XG4gICAgICAgIHRoaXMuX3JlYWRvbmx5UmVuZGVyQXMgPSBvcHRpb25zLnJlYWRvbmx5UmVuZGVyQXMgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9jb21wcmVzcyA9IG9wdGlvbnMuY29tcHJlc3MgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX2FwcGx5SW1hZ2VGaXQgPSBvcHRpb25zLmFwcGx5SW1hZ2VGaXQgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX3VzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmcgPSBvcHRpb25zLnVzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmcgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzUlRMID0gb3B0aW9ucy5pc1JUTCB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5fdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seSA9IG9wdGlvbnMudGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seSB8fCBmYWxzZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBsZWZ0VG9wUG9pbnQoKTogSVBvaW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiB0aGlzLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgIHlUb3A6IHRoaXMubWFyZ2lucy50b3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIGdldCBmb250U2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udFNpemU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnROYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGJhc2U2NE5vcm1hbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmFzZTY0Tm9ybWFsO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGJhc2U2NEJvbGQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2U2NEJvbGQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdXNlQ3VzdG9tRm9udEluSHRtbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZUN1c3RvbUZvbnRJbkh0bWw7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbWFyZ2lucygpOiBJTWFyZ2luIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmdpbnM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9ybWF0KCk6IHN0cmluZyB8IG51bWJlcltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdDtcbiAgICB9XG4gICAgcHVibGljIGdldCBvcmllbnRhdGlvbigpOiAnbCcgfCAncCcge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb247XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaHRtbFJlbmRlckFzKCk6IElIVE1MUmVuZGVyVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9odG1sUmVuZGVyQXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbWF0cml4UmVuZGVyQXMoKTogJ2F1dG8nIHwgJ2xpc3QnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hdHJpeFJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHJlYWRvbmx5UmVuZGVyQXMoKTogJ2F1dG8nIHwgJ3RleHQnIHwgJ2Fjcm9mb3JtJyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkb25seVJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGNvbXByZXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29tcHJlc3M7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgYXBwbHlJbWFnZUZpdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5SW1hZ2VGaXQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdXNlTGVnYWN5Qm9vbGVhblJlbmRlcmluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmc7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaXNSVEwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1JUTDtcbiAgICB9XG4gICAgcHVibGljIGdldCB0YWdib3hTZWxlY3RlZENob2ljZXNPbmx5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seTtcbiAgICB9XG59XG5cbi8qKlxuICogVGhlIGBEb2NDb250cm9sbGVyYCBvYmplY3QgaW5jbHVkZXMgYW4gQVBJIHRoYXQgYWxsb3dzIHlvdSB0byBjb25maWd1cmUgdGhlIHJlc3VsdGluZyBQREYgZG9jdW1lbnQuIFlvdSBjYW4gYWNjZXNzIHRoaXMgb2JqZWN0IHdpdGhpbiBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdGhlIGBTdXJ2ZXlQREZgJ3MgW2BvblJlbmRlci4uLmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVyRm9vdGVyKSBldmVudHMuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2hvdy10by11c2UtYWRvcm5lcnMtaW4tcGRmLWZvcm1zLyAobGlua1N0eWxlKSlcbiAqL1xuZXhwb3J0IGNsYXNzIERvY0NvbnRyb2xsZXIgZXh0ZW5kcyBEb2NPcHRpb25zIHtcbiAgICBwcml2YXRlIF9kb2M6IGpzUERGO1xuICAgIHByaXZhdGUgX2hlbHBlckRvYzoganNQREY7XG4gICAgcHJpdmF0ZSBfZm9udFN0eWxlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBtYXJnaW5zU3RhY2s6IElNYXJnaW5MUltdO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRG9jT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBqc3BkZk9wdGlvbnM6IGpzUERGT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG9yaWVudGF0aW9uOiB0aGlzLm9yaWVudGF0aW9uLFxuICAgICAgICAgICAgdW5pdDogJ3B0JyxcbiAgICAgICAgICAgIGZvcm1hdDogdGhpcy5mb3JtYXQsXG4gICAgICAgICAgICBjb21wcmVzczogdGhpcy5jb21wcmVzc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kb2MgPSBuZXcganNQREYoanNwZGZPcHRpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJhc2U2NE5vcm1hbCAhPT0gJ3VuZGVmaW5lZCcgJiYgIVN1cnZleUhlbHBlci5pc0ZvbnRFeGlzdCh0aGlzLCB0aGlzLmZvbnROYW1lKSkge1xuICAgICAgICAgICAgRG9jQ29udHJvbGxlci5hZGRGb250KHRoaXMuZm9udE5hbWUsIHRoaXMuYmFzZTY0Tm9ybWFsLCAnbm9ybWFsJyk7XG4gICAgICAgICAgICBEb2NDb250cm9sbGVyLmFkZEZvbnQodGhpcy5mb250TmFtZSwgdGhpcy5iYXNlNjRCb2xkLCAnYm9sZCcpO1xuICAgICAgICAgICAgdGhpcy5fZG9jID0gbmV3IGpzUERGKGpzcGRmT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmFkaW9BcHBlYXJhbmNlKHRoaXMuX2RvYyk7XG4gICAgICAgIHRoaXMuX3VzZUN1c3RvbUZvbnRJbkh0bWwgPSBvcHRpb25zLnVzZUN1c3RvbUZvbnRJbkh0bWwgJiYgU3VydmV5SGVscGVyLmlzRm9udEV4aXN0KHRoaXMsIHRoaXMuZm9udE5hbWUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2MgPSBuZXcganNQREYoanNwZGZPcHRpb25zKTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnQodGhpcy5mb250TmFtZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuZm9udE5hbWUpO1xuICAgICAgICB0aGlzLl9kb2Muc2V0Rm9udFNpemUodGhpcy5mb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZSh0aGlzLmZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5fZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgIHRoaXMubWFyZ2luc1N0YWNrID0gW107XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3VzdG9tRm9udHM6IHsgW25hbWU6IHN0cmluZ106IHsgbm9ybWFsOiBzdHJpbmcsIGJvbGQ6IHN0cmluZywgaXRhbGljOiBzdHJpbmcsIGJvbGRpdGFsaWM6IHN0cmluZyB9IH0gPSB7fTtcbiAgICBwdWJsaWMgc3RhdGljIGFkZEZvbnQoZm9udE5hbWU6IHN0cmluZywgYmFzZTY0OiBzdHJpbmcsIGZvbnRTdHlsZTogJ25vcm1hbCcgfCAnYm9sZCcgfCAnaXRhbGljJyB8ICdib2xkaXRhbGljJykge1xuICAgICAgICBsZXQgZm9udCA9IERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHNbZm9udE5hbWVdO1xuICAgICAgICBpZiAoIWZvbnQpIHtcbiAgICAgICAgICAgIGZvbnQgPSA8YW55Pnt9O1xuICAgICAgICAgICAgRG9jQ29udHJvbGxlci5jdXN0b21Gb250c1tmb250TmFtZV0gPSBmb250O1xuICAgICAgICB9XG4gICAgICAgIGZvbnRbZm9udFN0eWxlXSA9IGJhc2U2NDtcbiAgICAgICAgY29uc3QgYWRkRm9udENhbGxiYWNrOiAoKSA9PiB2b2lkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tRm9udCA9IERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHNbZm9udE5hbWVdO1xuICAgICAgICAgICAgaWYgKCEhY3VzdG9tRm9udCAmJiAhIWN1c3RvbUZvbnRbZm9udFN0eWxlXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnRGaWxlOiBzdHJpbmcgPSBgJHtmb250TmFtZX0tJHtmb250U3R5bGV9LnR0ZmA7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGaWxlVG9WRlMoZm9udEZpbGUsIGN1c3RvbUZvbnRbZm9udFN0eWxlXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGb250KGZvbnRGaWxlLCBmb250TmFtZSwgZm9udFN0eWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgKDxhbnk+anNQREYpLkFQSS5ldmVudHMucHVzaChbJ2FkZEZvbnRzJywgYWRkRm9udENhbGxiYWNrXSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZG9jKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kb2M7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaGVscGVyRG9jKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWxwZXJEb2M7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnROYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGZvbnROYW1lKGZvbnROYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZm9udE5hbWUgPSBmb250TmFtZTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnQoZm9udE5hbWUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udChmb250TmFtZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udFNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnRTaXplO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGZvbnRTaXplKGZvbnRTaXplOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fZm9udFNpemUgPSBmb250U2l6ZTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBmb250U3R5bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnRTdHlsZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBmb250U3R5bGUoZm9udFN0eWxlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZm9udFN0eWxlID0gZm9udFN0eWxlO1xuICAgICAgICB0aGlzLl9kb2Muc2V0Rm9udCh0aGlzLl9mb250TmFtZSwgZm9udFN0eWxlKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQodGhpcy5fZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgfVxuICAgIHB1YmxpYyBtZWFzdXJlVGV4dCh0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZyB8IG51bWJlciA9IDEsIGZvbnRTdHlsZTogc3RyaW5nID0gdGhpcy5fZm9udFN0eWxlLFxuICAgICAgICBmb250U2l6ZTogbnVtYmVyID0gdGhpcy5fZm9udFNpemUpOiBJU2l6ZSB7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLl9oZWxwZXJEb2MuZ2V0Rm9udFNpemUoKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQodGhpcy5fZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gdGhpcy5faGVscGVyRG9jLmdldExpbmVIZWlnaHQoKSAvIHRoaXMuX2hlbHBlckRvYy5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSAwLjA7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdGV4dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRleHQgPSB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgPyB0ZXh0IDogU3VydmV5SGVscGVyLmdldExvY1N0cmluZyh0ZXh0KTtcbiAgICAgICAgICAgIHdpZHRoID0gdGV4dC5zcGxpdCgnJykucmVkdWNlKChzbTogbnVtYmVyLCBjcjogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgIHNtICsgdGhpcy5faGVscGVyRG9jLmdldFRleHRXaWR0aChjciksIDAuMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnRTaXplKG9sZEZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQodGhpcy5fZm9udE5hbWUsICdub3JtYWwnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB3aWR0aCBvZiBvbmUgY2hhcmFjdGVyIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVuaXRXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZWFzdXJlVGV4dCgpLndpZHRoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ3RoIG9mIG9uZSBjaGFyYWN0ZXIgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdW5pdEhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZWFzdXJlVGV4dCgpLmhlaWdodDtcbiAgICB9XG4gICAgcHVibGljIHB1c2hNYXJnaW5zKGxlZnQ/OiBudW1iZXIsIHJpZ2h0PzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFyZ2luc1N0YWNrLnB1c2goeyBsZWZ0OiB0aGlzLm1hcmdpbnMubGVmdCwgcmlnaHQ6IHRoaXMubWFyZ2lucy5yaWdodCB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiBsZWZ0ICE9PSAndW5kZWZpbmVkJykgdGhpcy5tYXJnaW5zLmxlZnQgPSBsZWZ0O1xuICAgICAgICBpZiAodHlwZW9mIHJpZ2h0ICE9PSAndW5kZWZpbmVkJykgdGhpcy5tYXJnaW5zLnJpZ2h0ID0gcmlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBwb3BNYXJnaW5zKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtYXJnaW5zOiBJTWFyZ2luTFIgPSB0aGlzLm1hcmdpbnNTdGFjay5wb3AoKTtcbiAgICAgICAgdGhpcy5tYXJnaW5zLmxlZnQgPSBtYXJnaW5zLmxlZnQ7XG4gICAgICAgIHRoaXMubWFyZ2lucy5yaWdodCA9IG1hcmdpbnMucmlnaHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB3aWR0aCBvZiBhIFBERiBwYWdlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcGVyV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIGEgUERGIHBhZ2UgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFwZXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodDtcbiAgICB9XG4gICAgcHVibGljIGdldE51bWJlck9mUGFnZXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmdldE51bWJlck9mUGFnZXMoKTtcbiAgICB9XG4gICAgcHVibGljIGFkZFBhZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG9jLmFkZFBhZ2UoKTtcbiAgICB9XG4gICAgcHVibGljIGdldEN1cnJlbnRQYWdlSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXIgLSAxO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0UGFnZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG9jLnNldFBhZ2UoaW5kZXggKyAxKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZG9jX2NvbnRyb2xsZXIudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFJhZGlvR3JvdXBXcmFwLCBSYWRpb0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3JhZGlvaXRlbSc7XG5pbXBvcnQgeyBGbGF0U2VsZWN0QmFzZSB9IGZyb20gJy4vZmxhdF9zZWxlY3RiYXNlJztcblxuZXhwb3J0IGNsYXNzIEZsYXRSYWRpb2dyb3VwIGV4dGVuZHMgRmxhdFNlbGVjdEJhc2Uge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWw7XG4gICAgcHJpdmF0ZSByYWRpb0dyb3VwV3JhcDogUmFkaW9Hcm91cFdyYXA7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25SYWRpb2dyb3VwTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBpc0l0ZW1TZWxlY3RlZChpdGVtOiBJdGVtVmFsdWUsIGNoZWNrZWQ/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIGNoZWNrZWQgPT09ICd1bmRlZmluZWQnKSA/XG4gICAgICAgICAgICAoaXRlbSA9PT0gdGhpcy5xdWVzdGlvbi5vdGhlckl0ZW0gPyB0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCA6XG4gICAgICAgICAgICAgICAgKGl0ZW0udmFsdWUgPT09IHRoaXMucXVlc3Rpb24udmFsdWUgfHxcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLnF1ZXN0aW9uLmlzSXRlbVNlbGVjdGVkICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pc0l0ZW1TZWxlY3RlZChpdGVtKSkpKSA6IGNoZWNrZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZW5lcmF0ZUZsYXRJdGVtKHJlY3Q6IElSZWN0LCBpdGVtOiBJdGVtVmFsdWUsXG4gICAgICAgIGluZGV4OiBudW1iZXIsIGtleT86IHN0cmluZywgY2hlY2tlZD86IGJvb2xlYW4sIGNvbnRleHQ6IGFueSA9IHt9KTogSVBkZkJyaWNrIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwID0gbmV3IFJhZGlvR3JvdXBXcmFwKHRoaXMucXVlc3Rpb24uaWQgKyAoKHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnKSA/ICcnIDoga2V5KSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHsgcmVhZE9ubHk6IHRoaXMucXVlc3Rpb24uaXNSZWFkT25seSwgcXVlc3Rpb246IHRoaXMucXVlc3Rpb24sIC4uLmNvbnRleHQgfSk7XG4gICAgICAgICAgICAoPGFueT50aGlzLnF1ZXN0aW9uKS5wZGZSYWRpb0dyb3VwV3JhcCA9IHRoaXMucmFkaW9Hcm91cFdyYXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMucmFkaW9Hcm91cFdyYXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwID0gKDxhbnk+dGhpcy5xdWVzdGlvbikucGRmUmFkaW9Hcm91cFdyYXA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNDaGVja2VkOiBib29sZWFuID0gdGhpcy5pc0l0ZW1TZWxlY3RlZChpdGVtLCBjaGVja2VkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSYWRpb0l0ZW1Ccmljayh0aGlzLmNvbnRyb2xsZXIsIHJlY3QsXG4gICAgICAgICAgICB7IHF1ZXN0aW9uOiB0aGlzLnF1ZXN0aW9uLCBpbmRleDogaW5kZXgsIGNoZWNrZWQ6IGlzQ2hlY2tlZCwgaXRlbTogaXRlbSB9LCB0aGlzLnJhZGlvR3JvdXBXcmFwKTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3JhZGlvZ3JvdXAnLCBGbGF0UmFkaW9ncm91cCk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdidXR0b25ncm91cCcsIEZsYXRSYWRpb2dyb3VwKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwiaW1wb3J0IHsgSUVsZW1lbnQsIFF1ZXN0aW9uLCBQYW5lbE1vZGVsQmFzZSwgUGFuZWxNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBSb3dsaW5lQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yb3dsaW5lJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgQWRvcm5lcnNQYW5lbE9wdGlvbnMsIEFkb3JuZXJzUGFnZU9wdGlvbnMgfSBmcm9tICcuLi9ldmVudF9oYW5kbGVyL2Fkb3JuZXJzJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi4vZW50cmllcy9wZGYnO1xuaW1wb3J0ICogYXMgU3VydmV5UERGTW9kdWxlIGZyb20gJy4uL2VudHJpZXMvcGRmJztcblxuZXhwb3J0IGNsYXNzIEZsYXRTdXJ2ZXkge1xuICAgIHB1YmxpYyBzdGF0aWMgUVVFU19HQVBfVkVSVF9TQ0FMRTogbnVtYmVyID0gMS41O1xuICAgIHB1YmxpYyBzdGF0aWMgUEFORUxfQ09OVF9HQVBfU0NBTEU6IG51bWJlciA9IDEuMDtcbiAgICBwdWJsaWMgc3RhdGljIFBBTkVMX0RFU0NfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0c1BhbmVsKHN1cnZleTogU3VydmV5UERGLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwYW5lbDogUGFuZWxNb2RlbCwgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgcGFuZWxGbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgcGFuZWxDb250ZW50UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gY29udHJvbGxlci5tZWFzdXJlVGV4dChwYW5lbC5pbm5lckluZGVudCkud2lkdGg7XG4gICAgICAgIHBhbmVsQ29udGVudFBvaW50LnhMZWZ0ICs9IGNvbnRyb2xsZXIubWVhc3VyZVRleHQocGFuZWwuaW5uZXJJbmRlbnQpLndpZHRoO1xuICAgICAgICBwYW5lbEZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUGFnZVBhbmVsKHN1cnZleSxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIsIHBhbmVsLCBwYW5lbENvbnRlbnRQb2ludCkpO1xuICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgY29uc3QgYWRvcm5lcnNPcHRpb25zOiBBZG9ybmVyc1BhbmVsT3B0aW9ucyA9IG5ldyBBZG9ybmVyc1BhbmVsT3B0aW9ucyhwb2ludCxcbiAgICAgICAgICAgIHBhbmVsRmxhdHMsIHBhbmVsLCBjb250cm9sbGVyLCBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLCBTdXJ2ZXlQREZNb2R1bGUpO1xuICAgICAgICBhd2FpdCBzdXJ2ZXkub25SZW5kZXJQYW5lbC5maXJlKHN1cnZleSwgYWRvcm5lcnNPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIFsuLi5hZG9ybmVyc09wdGlvbnMuYnJpY2tzXTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0c1BhZ2VQYW5lbChzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcGFnZVBhbmVsOiBQYW5lbE1vZGVsQmFzZSwgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgaWYgKCFwYWdlUGFuZWwuaXNWaXNpYmxlKSByZXR1cm47XG4gICAgICAgIHBhZ2VQYW5lbC5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgICAgIGNvbnN0IHBhZ2VQYW5lbEZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBsZXQgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBpZiAocGFnZVBhbmVsLmdldFR5cGUoKSAhPT0gJ3BhZ2UnIHx8IHN1cnZleS5zaG93UGFnZVRpdGxlcykge1xuICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgICAgIGlmIChwYWdlUGFuZWwudGl0bGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFnZVBhbmVsIGluc3RhbmNlb2YgUGFuZWxNb2RlbCAmJiBwYWdlUGFuZWwubm8pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGl0bGVQYW5lbEZsYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIGNvbnRyb2xsZXIsIHBhZ2VQYW5lbC5ubywgcGFnZVBhbmVsLmdldFR5cGUoKSA9PT0gJ3BhZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhub0ZsYXQpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBub0ZsYXQueFJpZ2h0ICsgY29udHJvbGxlci5tZWFzdXJlVGV4dCgnICcpLndpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlbFBhbmVsVGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGl0bGVQYW5lbEZsYXQoXG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgY29udHJvbGxlciwgcGFnZVBhbmVsLmxvY1RpdGxlLCBwYWdlUGFuZWwuZ2V0VHlwZSgpID09PSAncGFnZScpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2socGFnZWxQYW5lbFRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHBhZ2VsUGFuZWxUaXRsZUZsYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhZ2VQYW5lbC5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChwYWdlUGFuZWwudGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0U3VydmV5LlBBTkVMX0RFU0NfR0FQX1NDQUxFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlUGFuZWxEZXNjRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZURlc2NGbGF0KFxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIG51bGwsIGNvbnRyb2xsZXIsIHBhZ2VQYW5lbC5sb2NEZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhwYWdlUGFuZWxEZXNjRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHBhZ2VQYW5lbERlc2NGbGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29tcG9zaXRlRmxhdC5pc0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93TGluZVBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQocm93TGluZVBvaW50LCBjb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgcGFnZVBhbmVsRmxhdHMucHVzaChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0U3VydmV5LlBBTkVMX0NPTlRfR0FQX1NDQUxFICsgU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByb3cgb2YgcGFnZVBhbmVsLnJvd3MpIHtcbiAgICAgICAgICAgIGlmICghcm93LnZpc2libGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcik7XG4gICAgICAgICAgICBsZXQgbmV4dE1hcmdpbkxlZnQ6IG51bWJlciA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgY29uc3Qgcm93RmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlRWxlbWVudHMgPSByb3cuZWxlbWVudHMuZmlsdGVyKGVsID0+IGVsLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdmlzaWJsZUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IElFbGVtZW50ID0gdmlzaWJsZUVsZW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5pc1Zpc2libGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBlcnNXaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoZWxlbWVudC5yZW5kZXJXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggLSAodmlzaWJsZUVsZW1lbnRzLmxlbmd0aCAtIDEpICogY29udHJvbGxlci51bml0V2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGVFbGVtZW50cy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gbmV4dE1hcmdpbkxlZnQgKyAoKGkgIT09IDApID8gY29udHJvbGxlci51bml0V2lkdGggOiAwKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIHBlcnNXaWR0aDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICBuZXh0TWFyZ2luTGVmdCA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICsgcGVyc1dpZHRoO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGFuZWxNb2RlbCkge1xuICAgICAgICAgICAgICAgICAgICByb3dGbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1BhbmVsKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBlbGVtZW50LCBjdXJyUG9pbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0ZsYXRzLnB1c2goLi4uYXdhaXQgU3VydmV5SGVscGVyLmdlbmVyYXRlUXVlc3Rpb25GbGF0cyhzdXJ2ZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCA8UXVlc3Rpb24+ZWxlbWVudCwgY3VyclBvaW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGlmIChyb3dGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLnJvd0ZsYXRzKS55Qm90O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRTdXJ2ZXkuUVVFU19HQVBfVkVSVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBwYWdlUGFuZWxGbGF0cy5wdXNoKC4uLnJvd0ZsYXRzKTtcbiAgICAgICAgICAgICAgICBwYWdlUGFuZWxGbGF0cy5wdXNoKFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIGNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnZVBhbmVsRmxhdHM7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIHBvcFJvd2xpbmVzKGZsYXRzOiBJUGRmQnJpY2tbXSkge1xuICAgICAgICB3aGlsZSAoZmxhdHMubGVuZ3RoID4gMCAmJiBmbGF0c1tmbGF0cy5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIFJvd2xpbmVCcmljaykge1xuICAgICAgICAgICAgZmxhdHMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0VGl0bGUoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGlmIChzdXJ2ZXkuc2hvd1RpdGxlKSB7XG4gICAgICAgICAgICBpZiAoc3VydmV5LnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VydmV5VGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGl0bGVTdXJ2ZXlGbGF0KFxuICAgICAgICAgICAgICAgICAgICBwb2ludCwgY29udHJvbGxlciwgc3VydmV5LmxvY1RpdGxlKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHN1cnZleVRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgcG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoc3VydmV5VGl0bGVGbGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdXJ2ZXkuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoc3VydmV5LnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0U3VydmV5LlBBTkVMX0RFU0NfR0FQX1NDQUxFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVEZXNjRmxhdChcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQsIG51bGwsIGNvbnRyb2xsZXIsIHN1cnZleS5sb2NEZXNjcmlwdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUZsYXRMb2dvSW1hZ2Uoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBsb2dvVXJsID0gU3VydmV5SGVscGVyLmdldExvY1N0cmluZyhzdXJ2ZXkubG9jTG9nbyk7XG4gICAgICAgIGNvbnN0IGxvZ29TaXplID0gYXdhaXQgU3VydmV5SGVscGVyLmdldENvcnJlY3RlZEltYWdlU2l6ZShjb250cm9sbGVyLCB7IGltYWdlTGluazogbG9nb1VybCwgaW1hZ2VIZWlnaHQ6IHN1cnZleS5sb2dvSGVpZ2h0LCBpbWFnZVdpZHRoOiBzdXJ2ZXkubG9nb1dpZHRoLCBkZWZhdWx0SW1hZ2VXaWR0aDogJzMwMHB4JywgZGVmYXVsdEltYWdlSGVpZ2h0OiAnMjAwcHgnIH0pO1xuICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChcbiAgICAgICAgICAgIHBvaW50LCBudWxsLCBjb250cm9sbGVyLCB7IGxpbms6IGxvZ29VcmwsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGxvZ29TaXplLndpZHRoLCBoZWlnaHQ6IGxvZ29TaXplLmhlaWdodCB9KTtcbiAgICAgICAgbGV0IHNoaWZ0OiBudW1iZXIgPSAwO1xuICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgc2hpZnQgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC0gbG9nb0ZsYXQud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICBzaGlmdCA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcikgLyAyLjAgLSBsb2dvRmxhdC53aWR0aCAvIDIuMDtcbiAgICAgICAgfVxuICAgICAgICBsb2dvRmxhdC54TGVmdCArPSBzaGlmdDtcbiAgICAgICAgbG9nb0ZsYXQueFJpZ2h0ICs9IHNoaWZ0O1xuICAgICAgICByZXR1cm4gbG9nb0ZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0cyhzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8SVBkZkJyaWNrW11bXT4ge1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBpZiAoIXN1cnZleS5oYXNMb2dvKSB7XG4gICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgIGlmICghdGl0bGVGbGF0LmlzRW1wdHkpIGZsYXRzLnB1c2goW3RpdGxlRmxhdF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN1cnZleS5pc0xvZ29CZWZvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvZ29GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdExvZ29JbWFnZShcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgIGZsYXRzLnB1c2goW2xvZ29GbGF0XSk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZVBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQobG9nb0ZsYXQsXG4gICAgICAgICAgICAgICAgc3VydmV5LmxvZ29Qb3NpdGlvbiA9PT0gJ3RvcCcsIHN1cnZleS5sb2dvUG9zaXRpb24gIT09ICd0b3AnKTtcbiAgICAgICAgICAgIGlmIChzdXJ2ZXkubG9nb1Bvc2l0aW9uICE9PSAndG9wJykge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnhMZWZ0ICs9IGNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IGxvZ29GbGF0LndpZHRoICsgY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnhMZWZ0ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAvIDIuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKFxuICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgdGl0bGVQb2ludCk7XG4gICAgICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ3RvcCcpIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkgZmxhdHNbMF0ucHVzaCh0aXRsZUZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRMb2dvSW1hZ2UoXG4gICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgY29udHJvbGxlci5sZWZ0VG9wUG9pbnQpO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goW2xvZ29GbGF0XSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSBsb2dvRmxhdC53aWR0aCArIGNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRpdGxlRmxhdC5pc0VtcHR5KSBmbGF0c1swXS51bnNoaWZ0KHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICAgICAgbGV0IGxvZ29Qb2ludDogSVBvaW50ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKFt0aXRsZUZsYXRdKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nb1BvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ29Qb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAvIDIuMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nb0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0TG9nb0ltYWdlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGxvZ29Qb2ludCk7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXRzLmxlbmd0aCAhPT0gMCkgZmxhdHNbMF0ucHVzaChsb2dvRmxhdCk7XG4gICAgICAgICAgICAgICAgZWxzZSBmbGF0cy5wdXNoKFtsb2dvRmxhdF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwb2ludDogSVBvaW50ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQ7XG4gICAgICAgIGlmIChmbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHBvaW50LnlUb3AgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4uZmxhdHNbMF0pKS55VG9wO1xuICAgICAgICAgICAgZmxhdHNbMF0ucHVzaChTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQocG9pbnQsIGNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIHBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFN1cnZleS5QQU5FTF9DT05UX0dBUF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdXJ2ZXkudmlzaWJsZVBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzdXJ2ZXkuY3VycmVudFBhZ2UgPSBzdXJ2ZXkudmlzaWJsZVBhZ2VzW2ldO1xuICAgICAgICAgICAgbGV0IHBhZ2VGbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgICAgIHBhZ2VGbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1BhZ2VQYW5lbChcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIHN1cnZleS52aXNpYmxlUGFnZXNbaV0sIHBvaW50KSk7XG4gICAgICAgICAgICBjb25zdCBhZG9ybmVyc09wdGlvbnM6IEFkb3JuZXJzUGFnZU9wdGlvbnMgPSBuZXcgQWRvcm5lcnNQYWdlT3B0aW9ucyhwb2ludCxcbiAgICAgICAgICAgICAgICBwYWdlRmxhdHMsIHN1cnZleS52aXNpYmxlUGFnZXNbaV0sIGNvbnRyb2xsZXIsIEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCksIFN1cnZleVBERk1vZHVsZSk7XG4gICAgICAgICAgICBhd2FpdCBzdXJ2ZXkub25SZW5kZXJQYWdlLmZpcmUoc3VydmV5LCBhZG9ybmVyc09wdGlvbnMpO1xuICAgICAgICAgICAgcGFnZUZsYXRzID0gWy4uLmFkb3JuZXJzT3B0aW9ucy5icmlja3NdO1xuICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgZmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmxhdHNbMF0ucHVzaCguLi5wYWdlRmxhdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBmbGF0cy5wdXNoKHBhZ2VGbGF0cyk7XG4gICAgICAgICAgICB0aGlzLnBvcFJvd2xpbmVzKGZsYXRzW2ZsYXRzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgIHBvaW50LnlUb3AgPSBjb250cm9sbGVyLmxlZnRUb3BQb2ludC55VG9wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfc3VydmV5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciwgSVBvaW50IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDaGVja0l0ZW1Ccmlja0NvbnRleHQge1xuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb247XG4gICAgcmVhZE9ubHk6IGJvb2xlYW47XG4gICAgY2hlY2tlZDogYm9vbGVhbjtcbiAgICBpdGVtPzogSXRlbVZhbHVlO1xuICAgIGluZGV4PzogbnVtYmVyO1xufVxuZXhwb3J0IGNsYXNzIENoZWNrSXRlbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMC43O1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENIRUNLTUFSS19SRUFET05MWV9TWU1CT0w6IHN0cmluZyA9ICczJztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDSEVDS01BUktfUkVBRE9OTFlfRk9OVDogc3RyaW5nID0gJ3phcGZkaW5nYmF0cyc7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDSEVDS01BUktfUkVBRE9OTFlfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjAgLSBNYXRoLkUgLyAxMC4wO1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25DaGVja2JveE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGZpZWxkTmFtZTogc3RyaW5nLCBwcm90ZWN0ZWQgY29udGV4dDogSUNoZWNrSXRlbUJyaWNrQ29udGV4dCkge1xuICAgICAgICBzdXBlcihjb250ZXh0LnF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+dGhpcy5jb250ZXh0LnF1ZXN0aW9uO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucmVhZE9ubHkgJiYgU3VydmV5SGVscGVyLmdldFJlYWRvbmx5UmVuZGVyQXMoXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpICE9PSAnYWNyb2Zvcm0nIHx8IHRoaXMuY29udHJvbGxlci5jb21wcmVzcztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjaGVja0JveDogYW55ID0gbmV3ICg8YW55PnRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1DaGVja0JveCkoKTtcbiAgICAgICAgY29uc3QgZm9ybVNjYWxlOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZm9ybVNjYWxlKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHt9O1xuICAgICAgICBvcHRpb25zLm1heEZvbnRTaXplID0gdGhpcy5oZWlnaHQgKiBmb3JtU2NhbGUgKiBDaGVja0l0ZW1Ccmljay5GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgIG9wdGlvbnMuY2FwdGlvbiA9IENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9TWU1CT0w7XG4gICAgICAgIG9wdGlvbnMudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIG9wdGlvbnMuZmllbGROYW1lID0gdGhpcy5maWVsZE5hbWU7XG4gICAgICAgIG9wdGlvbnMucmVhZE9ubHkgPSB0aGlzLmNvbnRleHQucmVhZE9ubHk7XG4gICAgICAgIG9wdGlvbnMuY29sb3IgPSB0aGlzLmZvcm1Cb3JkZXJDb2xvcjtcbiAgICAgICAgb3B0aW9ucy52YWx1ZSA9IHRoaXMuY29udGV4dC5jaGVja2VkID8gJ09uJyA6IGZhbHNlO1xuICAgICAgICBvcHRpb25zLkFTID0gdGhpcy5jb250ZXh0LmNoZWNrZWQgPyAnL09uJyA6ICcvT2ZmJztcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuXG4gICAgICAgIG9wdGlvbnMuUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KHRoaXMsIGZvcm1TY2FsZSkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmFkZEZpZWxkKGNoZWNrQm94KTtcbiAgICAgICAgKDxTdXJ2ZXlQREY+dGhpcy5xdWVzdGlvbi5zdXJ2ZXkpPy5nZXRVcGRhdGVkQ2hlY2tJdGVtQWNyb2Zvcm1PcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgICAgIGNoZWNrQm94Lm1heEZvbnRTaXplID0gb3B0aW9ucy5tYXhGb250U2l6ZTtcbiAgICAgICAgY2hlY2tCb3guY2FwdGlvbiA9IG9wdGlvbnMuY2FwdGlvbjtcbiAgICAgICAgY2hlY2tCb3gudGV4dEFsaWduID0gb3B0aW9ucy50ZXh0QWxpZ247XG4gICAgICAgIGNoZWNrQm94LmZpZWxkTmFtZSA9IG9wdGlvbnMuZmllbGROYW1lO1xuICAgICAgICBjaGVja0JveC5yZWFkT25seSA9IG9wdGlvbnMucmVhZE9ubHk7XG4gICAgICAgIGNoZWNrQm94LmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcbiAgICAgICAgY2hlY2tCb3gudmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgICAgICBjaGVja0JveC5BUyA9IG9wdGlvbnMuQVM7XG4gICAgICAgIGNoZWNrQm94LlJlY3QgPSBvcHRpb25zLlJlY3Q7XG5cbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuY2hlY2tlZCkge1xuICAgICAgICAgICAgY29uc3QgY2hlY2ttYXJrUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aGlzLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZEZvbnROYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWUgPSBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfRk9OVDtcbiAgICAgICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqXG4gICAgICAgICAgICAgICAgQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrbWFya1NpemU6IElTaXplID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFxuICAgICAgICAgICAgICAgIENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9TWU1CT0wpO1xuICAgICAgICAgICAgY2hlY2ttYXJrUG9pbnQueExlZnQgKz0gdGhpcy53aWR0aCAvIDIuMCAtIGNoZWNrbWFya1NpemUud2lkdGggLyAyLjA7XG4gICAgICAgICAgICBjaGVja21hcmtQb2ludC55VG9wICs9IHRoaXMuaGVpZ2h0IC8gMi4wIC0gY2hlY2ttYXJrU2l6ZS5oZWlnaHQgLyAyLjA7XG4gICAgICAgICAgICBjb25zdCBjaGVja21hcmtGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgY2hlY2ttYXJrUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MLCBUZXh0QnJpY2spO1xuICAgICAgICAgICAgKDxhbnk+Y2hlY2ttYXJrRmxhdC51bmZvbGQoKVswXSkudGV4dENvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgICAgIGF3YWl0IGNoZWNrbWFya0ZsYXQucmVuZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWUgPSBvbGRGb250TmFtZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tpdGVtLnRzIiwiaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyLCBJUmVjdCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRW1wdHlCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIGlzQm9yZGVyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocmVjdDogSVJlY3QsXG4gICAgICAgIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyID0gbnVsbCxcbiAgICAgICAgaXNCb3JkZXJWaXNpYmxlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIobnVsbCwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMuaXNCb3JkZXJWaXNpYmxlID0gaXNCb3JkZXJWaXNpYmxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzaXplQm9yZGVyKGlzSW5jcmVhc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29lZjogbnVtYmVyID0gaXNJbmNyZWFzZSA/IDEgOiAtMTtcbiAgICAgICAgY29uc3QgYm9yZGVyUGFkZGluZzogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRGb250U2l6ZSgpICogU3VydmV5SGVscGVyLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgIHRoaXMueExlZnQgLT0gY29lZiAqIGJvcmRlclBhZGRpbmc7XG4gICAgICAgIHRoaXMueFJpZ2h0ICs9IGNvZWYgKiBib3JkZXJQYWRkaW5nO1xuICAgICAgICB0aGlzLnlCb3QgKz0gY29lZiAqIGJvcmRlclBhZGRpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pc0JvcmRlclZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplQm9yZGVyKHRydWUpO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZUJvcmRlcihmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2VtcHR5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcblxuZXhwb3J0IGNsYXNzIFRleHRCb2xkQnJpY2sgZXh0ZW5kcyBUZXh0QnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCB0ZXh0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICBhd2FpdCBzdXBlci5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZC50cyIsImV4cG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5leHBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmV4cG9ydCB7IElQb2ludCwgSVJlY3QsIElTaXplLCBJTWFyZ2luTFIsIElNYXJnaW4sIElEb2NPcHRpb25zLCBEb2NPcHRpb25zLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuZXhwb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnknO1xuZXhwb3J0IHsgSUZsYXRRdWVzdGlvbiwgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9xdWVzdGlvbic7XG5leHBvcnQgeyBGbGF0UXVlc3Rpb25EZWZhdWx0IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9kZWZhdWx0JztcbmV4cG9ydCB7IEZsYXRCb29sZWFuQ2hlY2tib3ggYXMgRmxhdEJvb2xlYW4gfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2Jvb2xlYW4nO1xuZXhwb3J0IHsgRmxhdENoZWNrYm94IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9jaGVja2JveCc7XG5leHBvcnQgeyBGbGF0Q3VzdG9tTW9kZWwgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbCc7XG5leHBvcnQgeyBGbGF0Q29tbWVudCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfY29tbWVudCc7XG5leHBvcnQgeyBGbGF0RHJvcGRvd24gfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2Ryb3Bkb3duJztcbmV4cG9ydCB7IEZsYXRFeHByZXNzaW9uIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uJztcbmV4cG9ydCB7IEZsYXRGaWxlIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9maWxlJztcbmV4cG9ydCB7IEZsYXRIVE1MIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9odG1sJztcbmV4cG9ydCB7IEZsYXRJbWFnZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2UnO1xuZXhwb3J0IHsgRmxhdEltYWdlUGlja2VyIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9pbWFnZXBpY2tlcic7XG5leHBvcnQgeyBGbGF0UGFuZWxEeW5hbWljIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9wYW5lbGR5bmFtaWMnO1xuZXhwb3J0IHsgRmxhdFJhZGlvZ3JvdXAgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JhZGlvZ3JvdXAnO1xuZXhwb3J0IHsgRmxhdFJhbmtpbmcgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcnO1xuZXhwb3J0IHsgRmxhdFJhdGluZyB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nJztcbmV4cG9ydCB7IEZsYXRTZWxlY3RCYXNlIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9zZWxlY3RiYXNlJztcbmV4cG9ydCB7IEZsYXRTaWduYXR1cmVQYWQgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZCc7XG5leHBvcnQgeyBGbGF0VGV4dGJveCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfdGV4dGJveCc7XG5leHBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9zdXJ2ZXknO1xuZXhwb3J0IHsgRmxhdE1hdHJpeCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4JztcbmV4cG9ydCB7IEZsYXRNYXRyaXhNdWx0aXBsZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4bXVsdGlwbGUnO1xuZXhwb3J0IHsgRmxhdE1hdHJpeER5bmFtaWMgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X21hdHJpeGR5bmFtaWMnO1xuZXhwb3J0IHsgRmxhdE11bHRpcGxlVGV4dCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfbXVsdGlwbGV0ZXh0JztcbmV4cG9ydCB7IFBhZ2VQYWNrZXIgfSBmcm9tICcuLi9wYWdlX2xheW91dC9wYWdlX3BhY2tlcic7XG5leHBvcnQgeyBFdmVudEhhbmRsZXIgfSBmcm9tICcuLi9ldmVudF9oYW5kbGVyL2V2ZW50X2hhbmRsZXInO1xuZXhwb3J0IHsgSG9yaXpvbnRhbEFsaWduLCBWZXJ0aWNhbEFsaWduLCBJRHJhd1JlY3RPcHRpb25zLCBJRHJhd1RleHRPcHRpb25zLCBJRHJhd0ltYWdlT3B0aW9ucywgRHJhd0NhbnZhcyB9IGZyb20gJy4uL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMnO1xuZXhwb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmV4cG9ydCB7IEJvb2xlYW5JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbSc7XG5leHBvcnQgeyBDaGVja2JveEl0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbSc7XG5leHBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbSc7XG5leHBvcnQgeyBDb21tZW50QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21tZW50JztcbmV4cG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmV4cG9ydCB7IEN1c3RvbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY3VzdG9tJztcbmV4cG9ydCB7IERyb3Bkb3duQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9kcm9wZG93bic7XG5leHBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZW1wdHknO1xuZXhwb3J0IHsgSFRNTEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfaHRtbCc7XG5leHBvcnQgeyBJbWFnZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfaW1hZ2UnO1xuZXhwb3J0IHsgTGlua0JyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfbGluayc7XG5leHBvcnQgeyBSYWRpb0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3JhZGlvaXRlbSc7XG5leHBvcnQgeyBSYW5raW5nSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcmFua2luZ2l0ZW0nO1xuZXhwb3J0IHsgUm93bGluZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcm93bGluZSc7XG5leHBvcnQgeyBUZXh0RmllbGRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRmaWVsZCc7XG5leHBvcnQgeyBUZXh0Qm9sZEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQnO1xuZXhwb3J0IHsgVGV4dEJveEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGJveCc7XG5leHBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmV4cG9ydCB7IFRpdGxlUGFuZWxCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwnO1xuXG5pbXBvcnQgeyBjaGVja0xpYnJhcnlWZXJzaW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuY2hlY2tMaWJyYXJ5VmVyc2lvbihgJHtwcm9jZXNzLmVudi5WRVJTSU9OfWAsICdzdXJ2ZXktcGRmJyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMvcGRmLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZsYXRTZWxlY3RCYXNlIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ2hlY2tib3hCYXNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ2hlY2tib3hCYXNlPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2VuZXJhdGVGbGF0SXRlbShyZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogSVBkZkJyaWNrO1xuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChpdGVtUmVjdCwgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLFxuICAgICAgICAgICAgcG9pbnQueExlZnQpLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBpZiAoaXRlbS5sb2NUZXh0LnJlbmRlcmVkSHRtbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubG9jVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0gPT09IHRoaXMucXVlc3Rpb24ub3RoZXJJdGVtICYmIChpdGVtLnZhbHVlID09PSB0aGlzLnF1ZXN0aW9uLnZhbHVlIHx8XG4gICAgICAgICAgICAodHlwZW9mIHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCkpKSB7XG4gICAgICAgICAgICBjb25zdCBvdGhlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICBvdGhlclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KFxuICAgICAgICAgICAgICAgIG90aGVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgZmFsc2UsIHsgaW5kZXgsIHJvd3M6IFN1cnZleUhlbHBlci5PVEhFUl9ST1dTX0NPVU5UIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldFZpc2libGVDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcztcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldENvbENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmNvbENvdW50O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29sQ291bnQgPSB0aGlzLmdldENvbENvdW50KCk7XG4gICAgICAgIGNvbnN0IHZpc2libGVDaG9pY2VzID0gdGhpcy5nZXRWaXNpYmxlQ2hvaWNlcygpO1xuICAgICAgICBsZXQgY3VycmVudENvbENvdW50OiBudW1iZXIgPSBjb2xDb3VudDtcbiAgICAgICAgaWYgKGNvbENvdW50ID09IDApIHtcbiAgICAgICAgICAgIGN1cnJlbnRDb2xDb3VudCA9IE1hdGguZmxvb3IoU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpXG4gICAgICAgICAgICAgICAgLyB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoKSB8fCAxO1xuICAgICAgICAgICAgaWYgKHZpc2libGVDaG9pY2VzLmxlbmd0aCA8IGN1cnJlbnRDb2xDb3VudCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDb2xDb3VudCA9IHZpc2libGVDaG9pY2VzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2xDb3VudCA+IDEpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDb2xDb3VudCA9IChTdXJ2ZXlIZWxwZXIuZ2V0Q29sdW1uV2lkdGgodGhpcy5jb250cm9sbGVyLCBjb2xDb3VudCkgPFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGgpID8gMSA6IGNvbENvdW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoY3VycmVudENvbENvdW50ID09IDEpID8gYXdhaXQgdGhpcy5nZW5lcmF0ZVZlcnRpY2FsbHlJdGVtcyhwb2ludCwgdmlzaWJsZUNob2ljZXMpIDpcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludCwgY3VycmVudENvbENvdW50KTtcblxuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVWZXJ0aWNhbGx5SXRlbXMocG9pbnQ6IElQb2ludCwgaXRlbVZhbHVlczogSXRlbVZhbHVlW10pOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBpdGVtVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUoY3VyclBvaW50LCBpdGVtVmFsdWVzW2ldLCBpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gaXRlbUZsYXQueUJvdCArIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKGl0ZW1GbGF0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUhvcmlzb250YWxseUl0ZW1zKHBvaW50OiBJUG9pbnQsIGNvbENvdW50OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHZpc2libGVDaG9pY2VzID0gdGhpcy5nZXRWaXNpYmxlQ2hvaWNlcygpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBsZXQgcm93OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdmlzaWJsZUNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0LCB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCk7XG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIGNvbENvdW50LCBpICUgY29sQ291bnQpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdENvbXBvc2l0ZShcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIHZpc2libGVDaG9pY2VzW2ldLCBpKTtcbiAgICAgICAgICAgIHJvdy5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgaWYgKGkgJSBjb2xDb3VudCA9PT0gY29sQ291bnQgLSAxIHx8IGkgPT09IHZpc2libGVDaG9pY2VzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dMaW5lRmxhdDogSVBkZkJyaWNrID0gU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQocm93KSwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0xpbmVGbGF0LnlCb3QgK1xuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2gocm93LCByb3dMaW5lRmxhdCk7XG4gICAgICAgICAgICAgICAgcm93ID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3NlbGVjdGJhc2UudHMiLCJpbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgVHJhbnNsYXRlWEZ1bmN0aW9uIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgUm93bGluZUJyaWNrIGltcGxlbWVudHMgSVBkZkJyaWNrIHtcbiAgICB4TGVmdDogbnVtYmVyO1xuICAgIHhSaWdodDogbnVtYmVyO1xuICAgIHlUb3A6IG51bWJlcjtcbiAgICB5Qm90OiBudW1iZXI7XG4gICAgcHVibGljIGlzUGFnZUJyZWFrOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGNvbG9yOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy54TGVmdCA9IHJlY3QueExlZnQ7XG4gICAgICAgIHRoaXMueFJpZ2h0ID0gcmVjdC54UmlnaHQ7XG4gICAgICAgIHRoaXMueVRvcCA9IHJlY3QueVRvcDtcbiAgICAgICAgdGhpcy55Qm90ID0gcmVjdC55Qm90O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnhSaWdodCAtIHRoaXMueExlZnQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnlCb3QgLSB0aGlzLnlUb3A7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmNvbG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgb2xkRHJhd0NvbG9yOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLmdldERyYXdDb2xvcigpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IodGhpcy5jb2xvcik7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmxpbmUodGhpcy54TGVmdCwgdGhpcy55VG9wLCB0aGlzLnhSaWdodCwgdGhpcy55VG9wKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKG9sZERyYXdDb2xvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIHJldHVybiBbdGhpc107XG4gICAgfVxuICAgIHRyYW5zbGF0ZVgoXzogVHJhbnNsYXRlWEZ1bmN0aW9uKTogdm9pZCB7fVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9yb3dsaW5lLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblRleHRNb2RlbCwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRGaWVsZEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dGZpZWxkJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgVGV4dEJveEJyaWNrIGV4dGVuZHMgVGV4dEZpZWxkQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGlzUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBwcm90ZWN0ZWQgaXNNdWx0aWxpbmU6IGJvb2xlYW4gPSBmYWxzZSwgaW5kZXg6IG51bWJlciA9IDApIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGlzUXVlc3Rpb24sXG4gICAgICAgICAgICAoPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uKS5pZCArIChpc1F1ZXN0aW9uID8gJycgOiAnX2NvbW1lbnQnICsgaW5kZXgpLFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFF1ZXN0aW9uT3JDb21tZW50VmFsdWUoPFF1ZXN0aW9uPnF1ZXN0aW9uLCBpc1F1ZXN0aW9uKSxcbiAgICAgICAgICAgIGlzUXVlc3Rpb24gJiYgKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikubG9jUGxhY2VIb2xkZXIgPyBTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKCg8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb24pLmxvY1BsYWNlSG9sZGVyKSA6ICcnLFxuICAgICAgICAgICAgcXVlc3Rpb24uaXNSZWFkT25seSwgaXNNdWx0aWxpbmUsXG4gICAgICAgICAgICAoPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uKS5pbnB1dFR5cGUpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJveC50cyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xOF9fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcImpzcGRmXCIsXCJjb21tb25qczJcIjpcImpzcGRmXCIsXCJjb21tb25qc1wiOlwianNwZGZcIixcImFtZFwiOlwianNwZGZcIn1cbi8vIG1vZHVsZSBpZCA9IDE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCB7IElSZWN0LCBJTWFyZ2luLCBJU2l6ZSwgRG9jT3B0aW9ucywgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuLyoqXG4gKiBIb3Jpem9udGFsIGFsaWdubWVudCB0eXBlcyBpbiBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBlbnVtIEhvcml6b250YWxBbGlnbiB7XG4gICAgTm90U2V0ID0gJ25vdHNldCcsXG4gICAgTGVmdCA9ICdsZWZ0JyxcbiAgICBDZW50ZXIgPSAnY2VudGVyJyxcbiAgICBSaWdodCA9ICdyaWdodCdcbn1cbi8qKlxuICogVmVydGljYWwgYWxpZ25tZW50IHR5cGVzIGluIG9uUmVuZGVySGVhZGVyIGFuZCBvblJlbmRlckZvb3RlciBldmVudHNcbiAqL1xuZXhwb3J0IGVudW0gVmVydGljYWxBbGlnbiB7XG4gICAgTm90U2V0ID0gJ25vdHNldCcsXG4gICAgVG9wID0gJ3RvcCcsXG4gICAgTWlkZGxlID0gJ21pZGRsZScsXG4gICAgQm90dG9tID0gJ2JvdHRvbSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRHJhd1JlY3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBIb3Jpem9udGFsIGFsaWdubWVudCB3aXRoaW4gdGhlIHJlY3RhbmdsZSB0aGF0IGxpbWl0cyB0aGUgZHJhd2luZyBhcmVhLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJjZW50ZXJcImAgKGRlZmF1bHQpXG4gICAgICogLSBgXCJsZWZ0XCJgXG4gICAgICogLSBgXCJyaWdodFwiYFxuICAgICAqL1xuICAgIGhvcml6b250YWxBbGlnbj86IEhvcml6b250YWxBbGlnbjtcbiAgICAvKipcbiAgICAgKiBWZXJ0aWNhbCBhbGlnbm1lbnQgd2l0aGluIHRoZSByZWN0YW5nbGUgdGhhdCBsaW1pdHMgdGhlIGRyYXdpbmcgYXJlYS5cbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKlxuICAgICAqIC0gYFwibWlkZGxlXCJgIChkZWZhdWx0KVxuICAgICAqIC0gYFwidG9wXCJgXG4gICAgICogLSBgXCJib3R0b21cImBcbiAgICAgKi9cbiAgICB2ZXJ0aWNhbEFsaWduPzogVmVydGljYWxBbGlnbjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY29udGVudCBhbmQgdGhlIGJvcmRlcnMgb2YgdGhlIHJlY3RhbmdsZS4gVGhpcyBwcm9wZXJ0eSBhcHBsaWVzIG9ubHkgaWYgdGhlIGNvbnRlbnQgaXMgYWxpZ25lZCB0byB0aGUgbGVmdC9yaWdodCBvciB0b3AvYm90dG9tLlxuICAgICAqL1xuICAgIG1hcmdpbnM/OiBJTWFyZ2luO1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGNvb3JkaW5hdGVzIG9mIHRoZSByZWN0YW5nbGUuXG4gICAgICovXG4gICAgcmVjdD86IElSZWN0O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjb25maWd1cmVzIHJlbmRlcmluZyBhIHBpZWNlIG9mIHRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdUZXh0T3B0aW9ucyBleHRlbmRzIElEcmF3UmVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgdGV4dCBzdHJpbmcgdG8gYmUgZHJhd24uXG4gICAgICovXG4gICAgdGV4dDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEZvbnQgc2l6ZSBpbiBwb2ludHMuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiAxNFxuICAgICAqL1xuICAgIGZvbnRTaXplPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEVuYWJsZSB0aGlzIHByb3BlcnR5IHRvIHJlbmRlciB0aGUgdGV4dCBzdHJpbmcgYm9sZC5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKi9cbiAgICBpc0JvbGQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjb25maWd1cmVzIHJlbmRlcmluZyBhbiBpbWFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRHJhd0ltYWdlT3B0aW9ucyBleHRlbmRzIElEcmF3UmVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGltYWdlIHdpZHRoIGluIHBpeGVscy4gRGVmYXVsdHMgdG8gdGhlIFtyZWN0YW5nbGUgd2lkdGhdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaWRyYXdpbWFnZW9wdGlvbnMjcmVjdCkuXG4gICAgICovXG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQW4gaW1hZ2UgaGVpZ2h0IGluIHBpeGVscy4gRGVmYXVsdHMgdG8gdGhlIFtyZWN0YW5nbGUgaGVpZ2h0XShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkcmF3aW1hZ2VvcHRpb25zI3JlY3QpLlxuICAgICAqL1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB2YWx1ZSB3aXRoIGEgYmFzZTY0LWVuY29kZWQgaW1hZ2UgdG8gYmUgZHJhd24uXG4gICAgICovXG4gICAgYmFzZTY0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGhvdyB0byByZXNpemUgdGhlIGltYWdlIHRvIGZpdCBpdCBpbnRvIGl0cyBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiBgXCJjb250YWluXCJgIGlmIFtgYXBwbHlJbWFnZUZpdGBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaWRvY29wdGlvbnMjYXBwbHlJbWFnZUZpdCkgaXMgZW5hYmxlZCBvciBgdW5kZWZpbmVkYCBpZiBub3QuXG4gICAgICpcbiAgICAgKiBSZWZlciB0byB0aGUgW2BvYmplY3QtZml0YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL29iamVjdC1maXQpIENTUyBwcm9wZXJ0eSBkZXNjcmlwdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gYWNjZXB0ZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGltYWdlRml0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyBhIGRyYXdpbmcgYXJlYSBhbmQgZW5hYmxlcyB5b3UgdG8gZHJhdyBhbiBpbWFnZSBvciBhIHBpZWNlIG9mIHRleHQgd2l0aGluIHRoZSBhcmVhLiBZb3UgY2FuIGFjY2VzcyB0aGlzIG9iamVjdCB3aXRoaW4gZnVuY3Rpb25zIHRoYXQgaGFuZGxlIGBTdXJ2ZXlQREZgJ3MgW2BvblJlbmRlckhlYWRlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVySGVhZGVyKSBhbmQgW2BvblJlbmRlckZvb3RlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVyRm9vdGVyKSBldmVudHMuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2N1c3RvbWl6ZS1oZWFkZXItYW5kLWZvb3Rlci1vZi1wZGYtZm9ybS8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBEcmF3Q2FudmFzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHBhY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcHVibGljIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHByb3RlY3RlZCBfcmVjdDogSVJlY3QsXG4gICAgICAgIHByb3RlY3RlZCBfY291bnRQYWdlczogbnVtYmVyLFxuICAgICAgICBwcm90ZWN0ZWQgX3BhZ2VOdW1iZXI6IG51bWJlcikgeyB9XG4gICAgLyoqXG4gICAgICogQSB0b3RhbCBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudFBhZ2VzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGNvdW50UGFnZXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdW50UGFnZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGhlIHBhZ2UgdGhhdCBjb250YWlucyB0aGUgZHJhd2luZyBhcmVhLiBFbnVtZXJhdGlvbiBzdGFydHMgd2l0aCAxLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFnZU51bWJlcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnZU51bWJlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgb2YgYSByZWN0YW5nbGUgdGhhdCBsaW1pdHMgdGhlIGRyYXdpbmcgYXJlYS4gVGhpcyBvYmplY3QgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczogYHhMZWZ0YCwgYHhSaWdodGAsIGB5VG9wYCwgYHlCb3RgLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVjdCgpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWN0O1xuICAgIH1cbiAgICBwcml2YXRlIGFsaWduUmVjdChyZWN0T3B0aW9uczogSURyYXdSZWN0T3B0aW9ucywgaXRlbVNpemU6IElTaXplKTogSVJlY3Qge1xuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLm1hcmdpbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zID0geyBsZWZ0OiAwLjAsIHJpZ2h0OiAwLjAsIHRvcDogMC4wLCBib3Q6IDAuMCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLmxlZnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0ID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQgPSAwLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLnJlY3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLmhvcml6b250YWxBbGlnbiA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gPT09IEhvcml6b250YWxBbGlnbi5Ob3RTZXQpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gPSBIb3Jpem9udGFsQWxpZ24uQ2VudGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy52ZXJ0aWNhbEFsaWduID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24gPT09IFZlcnRpY2FsQWxpZ24uTm90U2V0KSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiA9IFZlcnRpY2FsQWxpZ24uTWlkZGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNsb25lKHRoaXMucmVjdCk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc3dpdGNoIChyZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbi5MZWZ0OlxuICAgICAgICAgICAgICAgICAgICByZWN0LnhMZWZ0ID0gdGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICByZWN0LnhSaWdodCA9IE1hdGgubWluKHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0ICsgaXRlbVNpemUud2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbi5DZW50ZXI6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueExlZnQgPSBNYXRoLm1heCh0aGlzLnJlY3QueExlZnQgKyByZWN0T3B0aW9ucy5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnhMZWZ0ICsgdGhpcy5yZWN0LnhSaWdodCAtIGl0ZW1TaXplLndpZHRoKSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gTWF0aC5taW4odGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnhMZWZ0ICsgdGhpcy5yZWN0LnhSaWdodCArIGl0ZW1TaXplLndpZHRoKSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgSG9yaXpvbnRhbEFsaWduLlJpZ2h0OlxuICAgICAgICAgICAgICAgICAgICByZWN0LnhMZWZ0ID0gTWF0aC5tYXgodGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQgLSBpdGVtU2l6ZS53aWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gdGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVjdC54TGVmdCA9IHJlY3RPcHRpb25zLnJlY3QueExlZnQgfHwgdGhpcy5yZWN0LnhMZWZ0O1xuICAgICAgICAgICAgcmVjdC54UmlnaHQgPSByZWN0T3B0aW9ucy5yZWN0LnhSaWdodCB8fCB0aGlzLnJlY3QueFJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocmVjdE9wdGlvbnMudmVydGljYWxBbGlnbikge1xuICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbi5Ub3A6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueVRvcCA9IHRoaXMucmVjdC55VG9wICsgcmVjdE9wdGlvbnMubWFyZ2lucy50b3A7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IE1hdGgubWluKHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wICsgaXRlbVNpemUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduLk1pZGRsZTpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC55VG9wID0gTWF0aC5tYXgodGhpcy5yZWN0LnlUb3AgKyByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnJlY3QueVRvcCArIHRoaXMucmVjdC55Qm90IC0gaXRlbVNpemUuaGVpZ2h0KSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IE1hdGgubWluKHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnlUb3AgKyB0aGlzLnJlY3QueUJvdCArIGl0ZW1TaXplLmhlaWdodCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ24uQm90dG9tOlxuICAgICAgICAgICAgICAgICAgICByZWN0LnlUb3AgPSBNYXRoLm1heCh0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnlCb3QgLSByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCAtIGl0ZW1TaXplLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3Q7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVjdC55VG9wID0gcmVjdE9wdGlvbnMucmVjdC55VG9wIHx8IHRoaXMucmVjdC55VG9wO1xuICAgICAgICAgICAgcmVjdC55Qm90ID0gcmVjdE9wdGlvbnMucmVjdC55Qm90IHx8IHRoaXMucmVjdC55Qm90O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEcmF3cyBhIHBpZWNlIG9mIHRleHQgd2l0aGluIHRoZSBkcmF3aW5nIGFyZWEuXG4gICAgICogQHBhcmFtIHRleHRPcHRpb25zIEFuIFtgSURyYXdUZXh0T3B0aW9uc2BdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaWRyYXd0ZXh0b3B0aW9ucykgb2JqZWN0IHRoYXQgY29uZmlndXJlcyB0aGUgZHJhd2luZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZHJhd1RleHQodGV4dE9wdGlvbnM6IElEcmF3VGV4dE9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGV4dE9wdGlvbnMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUodGV4dE9wdGlvbnMpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRPcHRpb25zLmZvbnRTaXplID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGV4dE9wdGlvbnMuZm9udFNpemUgPSBEb2NPcHRpb25zLkZPTlRfU0laRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRleHRPcHRpb25zLmlzQm9sZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRleHRPcHRpb25zLmlzQm9sZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleHRTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0ZXh0T3B0aW9ucy50ZXh0LFxuICAgICAgICAgICAgdGV4dE9wdGlvbnMuaXNCb2xkID8gJ2JvbGQnIDogJ25vcm1hbCcsIHRleHRPcHRpb25zLmZvbnRTaXplKTtcbiAgICAgICAgY29uc3QgdGV4dFJlY3Q6IElSZWN0ID0gdGhpcy5hbGlnblJlY3QodGV4dE9wdGlvbnMsIHRleHRTaXplKTtcbiAgICAgICAgaWYgKCF0ZXh0T3B0aW9ucy5pc0JvbGQpIHtcbiAgICAgICAgICAgIHRoaXMucGFja3MucHVzaChuZXcgVGV4dEJyaWNrKG51bGwsIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0ZXh0UmVjdCwgdGV4dE9wdGlvbnMudGV4dCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYWNrcy5wdXNoKG5ldyBUZXh0Qm9sZEJyaWNrKG51bGwsIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0ZXh0UmVjdCwgdGV4dE9wdGlvbnMudGV4dCkpO1xuICAgICAgICB9XG4gICAgICAgICg8UGRmQnJpY2s+dGhpcy5wYWNrc1t0aGlzLnBhY2tzLmxlbmd0aCAtIDFdKS5mb250U2l6ZSA9IHRleHRPcHRpb25zLmZvbnRTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEcmF3cyBhbiBpbWFnZSB3aXRoaW4gdGhlIGRyYXdpbmcgYXJlYS5cbiAgICAgKiBAcGFyYW0gaW1hZ2VPcHRpb25zIEFuIFtgSURyYXdJbWFnZU9wdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkcmF3aW1hZ2VvcHRpb25zKSBvYmplY3QgdGhhdCBjb25maWd1cmVzIGRyYXdpbmcuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGRyYXdJbWFnZShpbWFnZU9wdGlvbnM6IElEcmF3SW1hZ2VPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGltYWdlT3B0aW9ucyA9IFN1cnZleUhlbHBlci5jbG9uZShpbWFnZU9wdGlvbnMpO1xuICAgICAgICBpZiAodHlwZW9mIGltYWdlT3B0aW9ucy53aWR0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltYWdlT3B0aW9ucy53aWR0aCA9IHRoaXMucmVjdC54UmlnaHQgLSB0aGlzLnJlY3QueExlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpbWFnZU9wdGlvbnMuaGVpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW1hZ2VPcHRpb25zLmhlaWdodCA9IHRoaXMucmVjdC55Qm90IC0gdGhpcy5yZWN0LnlUb3A7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW1hZ2VTaXplOiBJU2l6ZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBpbWFnZU9wdGlvbnMud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGltYWdlT3B0aW9ucy5oZWlnaHRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaW1hZ2VSZWN0OiBJUmVjdCA9IHRoaXMuYWxpZ25SZWN0KGltYWdlT3B0aW9ucywgaW1hZ2VTaXplKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKDAsIDApO1xuICAgICAgICB0aGlzLnBhY2tzLnB1c2goYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChpbWFnZVJlY3QsIHRydWUsIHRydWUpLFxuICAgICAgICAgICAgbnVsbCwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6IGltYWdlT3B0aW9ucy5iYXNlNjQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGltYWdlUmVjdC54UmlnaHQgLSBpbWFnZVJlY3QueExlZnQsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBpbWFnZVJlY3QueUJvdCAtIGltYWdlUmVjdC55VG9wLCBvYmplY3RGaXQ6IGltYWdlT3B0aW9ucy5pbWFnZUZpdCB9LCAhIWltYWdlT3B0aW9ucy5pbWFnZUZpdCB8fCB0aGlzLmNvbnRyb2xsZXIuYXBwbHlJbWFnZUZpdCkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXZlbnRfaGFuZGxlci9kcmF3X2NhbnZhcy50cyIsImltcG9ydCB7IEV2ZW50LCBFdmVudEJhc2UgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IERyYXdDYW52YXMgfSBmcm9tICcuL2RyYXdfY2FudmFzJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRXZlbnRBc3luYzxTZW5kZXIsIE9wdGlvbnM+IGV4dGVuZHMgRXZlbnRCYXNlPFNlbmRlciwgT3B0aW9ucz4ge1xuICAgIHB1YmxpYyB1bnNoaWZ0KGZ1bmM6IChzZW5kZXI6IFNlbmRlciwgb3B0aW9uczogT3B0aW9ucykgPT4gYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0Z1bmMoZnVuYykpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IEFycmF5PChzZW5kZXI6IFNlbmRlciwgb3B0aW9uczogT3B0aW9ucykgPT4gYW55PigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLnVuc2hpZnQoZnVuYyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaXJlKHNlbmRlcjogU2VuZGVyLCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FsbGJhY2tzW2ldKHNlbmRlciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRXZlbnRIYW5kbGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIHByb2Nlc3NfaGVhZGVyX2V2ZW50cyhzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcGFja3M6IElQZGZCcmlja1tdW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFzdXJ2ZXkuaGF2ZUNvbW1lcmNpYWxMaWNlbnNlKSB7XG4gICAgICAgICAgICBzdXJ2ZXkub25SZW5kZXJIZWFkZXIuYWRkKChfLCBjYW52YXMpID0+IHtcbiAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnU3VydmV5SlMgUERGIHwgUGxlYXNlIHB1cmNoYXNlIGEgU3VydmV5SlMgUERGIGRldmVsb3BlciBsaWNlbnNlIHRvIHVzZSBpdCBpbiB5b3VyIGFwcCB8IGh0dHBzOi8vc3VydmV5anMuaW8vQnV5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IDEwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlckhlYWRlci5maXJlKHN1cnZleSwgbmV3IERyYXdDYW52YXMocGFja3NbaV0sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZUhlYWRlclJlY3QoY29udHJvbGxlciksIHBhY2tzLmxlbmd0aCwgaSArIDEpKTtcbiAgICAgICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlckZvb3Rlci5maXJlKHN1cnZleSwgbmV3IERyYXdDYW52YXMocGFja3NbaV0sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZUZvb3RlclJlY3QoY29udHJvbGxlciksIHBhY2tzLmxlbmd0aCwgaSArIDEpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXZlbnRfaGFuZGxlci9ldmVudF9oYW5kbGVyLnRzIiwiaW1wb3J0IHsgSVBvaW50IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UXVlc3Rpb25EZWZhdWx0IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgdmFsdWVCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBgJHt0aGlzLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZX1gLCBUZXh0QnJpY2spO1xuICAgICAgICByZXR1cm4gW3ZhbHVlQnJpY2tdO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kZWZhdWx0LnRzIiwiaW1wb3J0IHtcbiAgICBJUXVlc3Rpb24sIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlLFxuICAgIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdywgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCwgU2VyaWFsaXplciwgUGFuZWxNb2RlbCwgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwsXG4gICAgTG9jYWxpemFibGVTdHJpbmdcbn0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJRmxhdFF1ZXN0aW9uLCBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFNlbGVjdEJhc2UgfSBmcm9tICcuL2ZsYXRfc2VsZWN0YmFzZSc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4TXVsdGlwbGUgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgR0FQX0JFVFdFRU5fUk9XUzogbnVtYmVyID0gMC41O1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLCBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwcm90ZWN0ZWQgaXNNdWx0aXBsZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZT5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSB2aXNpYmxlUm93c1ZhbHVlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3dbXTtcbiAgICBwcml2YXRlIGdldCB2aXNpYmxlUm93cygpIHtcbiAgICAgICAgaWYoIXRoaXMudmlzaWJsZVJvd3NWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlUm93c1ZhbHVlID0gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLnJvd3MuZmlsdGVyKHJvdyA9PiByb3cudmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZVJvd3NWYWx1ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzQ2VsbFRpdGxlKHBvaW50OiBJUG9pbnQsIGxvY1RpdGxlOiBMb2NhbGl6YWJsZVN0cmluZyk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBsb2NUaXRsZSwgVGV4dEJyaWNrKSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c0NlbGwocG9pbnQ6IElQb2ludCwgY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCxcbiAgICAgICAgbG9jYXRpb24/OiAnaGVhZGVyJyB8ICdmb290ZXInLCBpc1dpZGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGlmIChjZWxsLmhhc1F1ZXN0aW9uKSB7XG4gICAgICAgICAgICBpZihsb2NhdGlvbiA9PSAnZm9vdGVyJyAmJiAhY2VsbC5xdWVzdGlvbi5pc0Fuc3dlcmVkKSB7fVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNXaWRlICYmIGNlbGwuaXNDaG9pY2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmbGF0TXVsdGlwbGVDb2x1bW5zUXVlc3Rpb246IElGbGF0UXVlc3Rpb24gPSBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIGNlbGwucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgY2VsbC5xdWVzdGlvbi5nZXRUeXBlKCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5tb3ZlUmVjdChTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLCBwb2ludC54TGVmdCk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKCg8RmxhdFNlbGVjdEJhc2U+ZmxhdE11bHRpcGxlQ29sdW1uc1F1ZXN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAuZ2VuZXJhdGVGbGF0SXRlbShpdGVtUmVjdCwgY2VsbC5pdGVtLCBjZWxsLmNob2ljZUluZGV4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjZWxsLnF1ZXN0aW9uLnRpdGxlTG9jYXRpb24gPSBTdXJ2ZXlIZWxwZXIuVElUTEVfTE9DQVRJT05fTUFUUklYO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayguLi5hd2FpdCBTdXJ2ZXlIZWxwZXIuZ2VuZXJhdGVRdWVzdGlvbkZsYXRzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgdGhpcy5jb250cm9sbGVyLCBjZWxsLnF1ZXN0aW9uLCBwb2ludCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNlbGwuaGFzVGl0bGUpIHtcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQm9sZFRleHRGbGF0KHBvaW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGNlbGwubG9jVGl0bGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQocG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgY2VsbC5sb2NUaXRsZSwgVGV4dEJyaWNrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXQgaGFzRGV0YWlsUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2libGVSb3dzLnNvbWUoKHJlbmRlcmVkUm93KSA9PiByZW5kZXJlZFJvdy5yb3cgJiYgdGhpcy5xdWVzdGlvbi5oYXNEZXRhaWxQYW5lbChyZW5kZXJlZFJvdy5yb3cpKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBpZ25vcmVDZWxsKGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsIGluZGV4OiBudW1iZXIsIGxvY2F0aW9uPzogJ2hlYWRlcicgfCAnZm9vdGVyJywgaXNXaWRlOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZighaXNXaWRlICYmIGxvY2F0aW9uID09ICdmb290ZXInICYmIGNlbGwuaGFzUXVlc3Rpb24gJiYgIWNlbGwucXVlc3Rpb24uaXNBbnN3ZXJlZCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiAhKGNlbGwuaGFzUXVlc3Rpb24gfHwgY2VsbC5oYXNUaXRsZSB8fCAodGhpcy5pc011bHRpcGxlICYmICh0aGlzLmhhc0RldGFpbFBhbmVsID8gaW5kZXggPT0gMSA6IGluZGV4ID09IDApKSk7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0Um93TG9jYXRpb24ocm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cpIHtcbiAgICAgICAgcmV0dXJuIHJvdyA9PT0gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLmhlYWRlclJvdyA/ICdoZWFkZXInIDogKHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5mb290ZXJSb3cgPT09IHJvdyA/ICdmb290ZXInIDogdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzUm93SG9yaXNvbnRhbChwb2ludDogSVBvaW50LCByb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdywgY29sdW1uV2lkdGg6IG51bWJlcltdKTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgbGV0IGxhc3RSaWdodE1hcmdpbjogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIGxldCBjbnQgPSAwO1xuICAgICAgICBjb25zdCByb3dMb2NhdGlvbiA9IHRoaXMuZ2V0Um93TG9jYXRpb24ocm93KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3cuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlnbm9yZUNlbGwocm93LmNlbGxzW2ldLCBpLCByb3dMb2NhdGlvbikpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gbGFzdFJpZ2h0TWFyZ2luICtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29sdW1uV2lkdGhbY250XTtcbiAgICAgICAgICAgIGxhc3RSaWdodE1hcmdpbiA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxDb250ZW50OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NlbGwoXG4gICAgICAgICAgICAgICAgY3VyclBvaW50LCByb3cuY2VsbHNbaV0sIHJvd0xvY2F0aW9uKTtcbiAgICAgICAgICAgIGlmICghY2VsbENvbnRlbnQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhjZWxsQ29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbnQrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNSb3dWZXJ0aWNhbChwb2ludDogSVBvaW50LCByb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IHJvd0xvY2F0aW9uID0gdGhpcy5nZXRSb3dMb2NhdGlvbihyb3cpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pZ25vcmVDZWxsKHJvdy5jZWxsc1tpXSwgaSwgcm93TG9jYXRpb24sIGZhbHNlKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLnNob3dIZWFkZXIgJiYgKCF0aGlzLmlzTXVsdGlwbGUgfHwgaSA+IDApICYmIHJvdy5jZWxsc1tpXS5jZWxsPy5jb2x1bW4/LmxvY1RpdGxlKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NlbGxUaXRsZShjdXJyUG9pbnQsIHJvdy5jZWxsc1tpXS5jZWxsLmNvbHVtbi5sb2NUaXRsZSkpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gY29tcG9zaXRlLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NlbGwoY3VyclBvaW50LCByb3cuY2VsbHNbaV0sIHJvd0xvY2F0aW9uLCBmYWxzZSkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBjb21wb3NpdGUueUJvdCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRBdmFsYWJsZVdpZHRoKGNvbENvdW50OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpIC1cbiAgICAgICAgKGNvbENvdW50IC0gMSkgKiB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgfVxuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29sdW1uV2lkdGgocm93czogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93W10sIGNvbENvdW50OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoOiBudW1iZXIgPSB0aGlzLmdldEF2YWxhYmxlV2lkdGgoY29sQ291bnQpO1xuICAgICAgICBsZXQgcmVtYWluV2lkdGg6IG51bWJlciA9IGF2YWlsYWJsZVdpZHRoO1xuICAgICAgICBsZXQgcmVtYWluQ29sQ291bnQ6IG51bWJlciA9IGNvbENvdW50O1xuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aDogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgY29uc3QgdW5zZXRDZWxsczogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbFtdID0gW107XG4gICAgICAgIGxldCBjZWxscyA9IHJvd3NbMF0uY2VsbHMuZmlsdGVyKChjZWxsOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsLCBpbmRleDogbnVtYmVyKSA9PiAhdGhpcy5pZ25vcmVDZWxsKGNlbGwsIGluZGV4KSk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBjb2xDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoY2VsbHNbaV0ud2lkdGgsXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGgsIGNvbENvdW50KSB8fCAwLjA7XG4gICAgICAgICAgICByZW1haW5XaWR0aCAtPSB3aWR0aDtcbiAgICAgICAgICAgIGlmICh3aWR0aCAhPT0gMC4wKSB7XG4gICAgICAgICAgICAgICAgcmVtYWluQ29sQ291bnQtLTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdW5zZXRDZWxscy5wdXNoKGNlbGxzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbHVtbldpZHRoLnB1c2god2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZW1haW5Db2xDb3VudCA9PT0gMCkgcmV0dXJuIGNvbHVtbldpZHRoO1xuICAgICAgICBjb25zdCBoZXVyaXN0aWNXaWR0aDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5NQVRSSVhfQ09MVU1OX1dJRFRIKS53aWR0aDtcbiAgICAgICAgdW5zZXRDZWxscy5zb3J0KChjZWxsMTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCwgY2VsbDI6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwpID0+IHtcbiAgICAgICAgICAgIGxldCBtaW5XaWR0aDEgPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChjZWxsMS5taW5XaWR0aCwgYXZhaWxhYmxlV2lkdGgsIGNvbENvdW50KSB8fCAwLjA7XG4gICAgICAgICAgICBsZXQgbWluV2lkdGgyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoY2VsbDIubWluV2lkdGgsIGF2YWlsYWJsZVdpZHRoLCBjb2xDb3VudCkgfHwgMC4wO1xuICAgICAgICAgICAgcmV0dXJuIG1pbldpZHRoMiA+IG1pbldpZHRoMSA/IDEgOiAtMTtcbiAgICAgICAgfSkuZm9yRWFjaCgoY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXF1YWxXaWR0aDogbnVtYmVyID0gcmVtYWluV2lkdGggLyByZW1haW5Db2xDb3VudDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbk1pbldpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChjZWxsLm1pbldpZHRoLCBhdmFpbGFibGVXaWR0aCwgY29sQ291bnQpIHx8IDAuMDtcbiAgICAgICAgICAgIGlmKGNvbHVtbk1pbldpZHRoID4gZXF1YWxXaWR0aCAmJiBjb2x1bW5NaW5XaWR0aCA+IGhldXJpc3RpY1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgcmVtYWluV2lkdGggLT0gY29sdW1uTWluV2lkdGg7XG4gICAgICAgICAgICAgICAgcmVtYWluQ29sQ291bnQtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbHVtbldpZHRoW2NlbGxzLmluZGV4T2YoY2VsbCldID0gTWF0aC5tYXgoaGV1cmlzdGljV2lkdGgsIGNvbHVtbk1pbldpZHRoLCBlcXVhbFdpZHRoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb2x1bW5XaWR0aDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZU9uZVJvdyhwb2ludDogSVBvaW50LCByb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdywgaXNXaWRlOiBib29sZWFuLCBjb2x1bW5XaWR0aDogbnVtYmVyW10pOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGlmIChpc1dpZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNSb3dIb3Jpc29udGFsKHBvaW50LCByb3csIGNvbHVtbldpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUm93VmVydGljYWwocG9pbnQsIHJvdyk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c1Jvd3MocG9pbnQ6IElQb2ludCwgcm93czogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93W10sXG4gICAgICAgIGNvbENvdW50OiBudW1iZXIsIGlzV2lkZTogYm9vbGVhbik6IFByb21pc2U8Q29tcG9zaXRlQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJvd0ZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZU9uZVJvdyhjdXJyUG9pbnQsIHJvd3NbaV0sXG4gICAgICAgICAgICAgICAgaXNXaWRlLCB0aGlzLmNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3MsIGNvbENvdW50KSk7XG4gICAgICAgICAgICBpZiAocm93RmxhdC5pc0VtcHR5ICYmICEocm93c1tpXS5yb3cgJiYgcm93c1tpXS5yb3cuaGFzUGFuZWwpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmKCFyb3dGbGF0LmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gcm93cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gcm93RmxhdC55Qm90O1xuICAgICAgICAgICAgICAgICAgICByb3dGbGF0LmFkZEJyaWNrKFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByb3dzRmxhdHMucHVzaChyb3dGbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0ZsYXQueUJvdCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghIXJvd3NbaV0ucm93ICYmIHJvd3NbaV0ucm93Lmhhc1BhbmVsKSB7XG4gICAgICAgICAgICAgICAgcm93c1tpXS5yb3cuc2hvd0RldGFpbFBhbmVsKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudERldGFpbFBhbmVsOiBQYW5lbE1vZGVsID0gcm93c1tpXS5yb3cuZGV0YWlsUGFuZWw7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjdXJyZW50RGV0YWlsUGFuZWwucXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXRhaWxQYW5lbC5xdWVzdGlvbnNbal0uaWQgKz0gJ18nICsgaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFuZWxCcmlja3M6IElQZGZCcmlja1tdID0gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzUGFuZWwoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5LCB0aGlzLmNvbnRyb2xsZXIsIGN1cnJlbnREZXRhaWxQYW5lbCwgY3VyclBvaW50KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJDb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICAgICAgY3VyckNvbXBvc2l0ZS5hZGRCcmljayguLi5wYW5lbEJyaWNrcyk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBjdXJyQ29tcG9zaXRlLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2goY3VyckNvbXBvc2l0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IHJvd3MubGVuZ3RoIC0gMSAmJiB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGUuc2hvd0hlYWRlciAmJiBpc1dpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyOiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVPbmVSb3coY3VyclBvaW50LCByb3dzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNXaWRlLCB0aGlzLmNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3MsIGNvbENvdW50KSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyWVRvcCA9IGN1cnJDb21wb3NpdGUueUJvdDtcbiAgICAgICAgICAgICAgICAgICAgaWYoIWhlYWRlci5pc0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyWVRvcCA9IGhlYWRlci55Qm90O1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2goaGVhZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGN1cnJZVG9wICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVJc1dpZGUodGFibGU6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlLCBjb2xDb3VudDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdID0gW107XG4gICAgICAgIGlmKHRhYmxlLnNob3dIZWFkZXIpIHtcbiAgICAgICAgICAgIHJvd3MucHVzaCh0YWJsZS5oZWFkZXJSb3cpO1xuICAgICAgICB9XG4gICAgICAgIHJvd3MucHVzaCguLi50aGlzLnZpc2libGVSb3dzKTtcbiAgICAgICAgaWYocm93cy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aFN1bSA9IHRoaXMuY2FsY3VsYXRlQ29sdW1uV2lkdGgocm93cywgY29sQ291bnQpLnJlZHVjZSgod2lkdGhTdW06IG51bWJlciwgd2lkdGg6IG51bWJlcikgPT4gd2lkdGhTdW0gKz0gd2lkdGgsIDApO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5yZW5kZXJBcyAhPT0gJ2xpc3QnICYmIHRoaXMuY29udHJvbGxlci5tYXRyaXhSZW5kZXJBcyAhPT0gJ2xpc3QnICYmIE1hdGguZmxvb3IoY29sdW1uV2lkdGhTdW0pIDw9IE1hdGguZmxvb3IodGhpcy5nZXRBdmFsYWJsZVdpZHRoKGNvbENvdW50KSk7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0Um93c1RvUmVuZGVyKHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSwgaXNWZXJ0aWNhbDogYm9vbGVhbiwgaXNXaWRlOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdID0gW107XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkUm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgICAgIGlmICh0YWJsZS5zaG93SGVhZGVyICYmIGlzV2lkZSkgcm93cy5wdXNoKHRhYmxlLmhlYWRlclJvdyk7XG4gICAgICAgIHJvd3MucHVzaCguLi5yZW5kZXJlZFJvd3MpO1xuICAgICAgICBpZiAodGFibGUuaGFzUmVtb3ZlUm93cyAmJiBpc1ZlcnRpY2FsKSByb3dzLnBvcCgpO1xuICAgICAgICBpZiAodGFibGUuc2hvd0Zvb3Rlcikgcm93cy5wdXNoKHRhYmxlLmZvb3RlclJvdyk7XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgIH1cbiAgICBwcml2YXRlIGdldENvbENvdW50KHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSwgcmVuZGVyZWRSb3dzOiBBcnJheTxRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c+KTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCEhcmVuZGVyZWRSb3dzWzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyZWRSb3dzWzBdLmNlbGxzLmZpbHRlcigoY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCwgaW5kZXg6IG51bWJlcikgPT4gIXRoaXMuaWdub3JlQ2VsbChjZWxsLCBpbmRleCkpLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJsZS5zaG93SGVhZGVyICYmIHRhYmxlLmhlYWRlclJvdyA/IHRhYmxlLmhlYWRlclJvdy5jZWxscy5sZW5ndGggOlxuICAgICAgICAgICAgICAgIHRhYmxlLnNob3dGb290ZXIgJiYgdGFibGUuZm9vdGVyUm93ID8gdGFibGUuZm9vdGVyUm93LmNlbGxzLmxlbmd0aCA6IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgbGV0IHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSA9IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZTtcbiAgICAgICAgbGV0IGlzVmVydGljYWw6IGJvb2xlYW4gPSB0aGlzLnF1ZXN0aW9uLmNvbHVtbkxheW91dCA9PT0gJ3ZlcnRpY2FsJztcbiAgICAgICAgbGV0IGNvbENvdW50OiBudW1iZXIgPSB0aGlzLmdldENvbENvdW50KHRhYmxlLCB0aGlzLnZpc2libGVSb3dzKTtcbiAgICAgICAgaWYgKGNvbENvdW50ID09PSAwICYmICF0aGlzLmhhc0RldGFpbFBhbmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBDb21wb3NpdGVCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQocG9pbnQsIHRoaXMuY29udHJvbGxlcikpXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc1dpZGUgPSB0aGlzLmNhbGN1bGF0ZUlzV2lkZSh0YWJsZSwgY29sQ291bnQpO1xuICAgICAgICBpZighaXNXaWRlKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmlzTW9iaWxlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlzVmVydGljYWwgPSBmYWxzZTtcbiAgICAgICAgICAgIHRhYmxlID0gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlO1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlUm93c1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29sQ291bnQgPSB0aGlzLmdldENvbENvdW50KHRhYmxlLCB0aGlzLnZpc2libGVSb3dzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dzID0gdGhpcy5nZXRSb3dzVG9SZW5kZXIodGFibGUsIGlzVmVydGljYWwsIGlzV2lkZSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNSb3dzKHBvaW50LCByb3dzLCBjb2xDb3VudCwgaXNXaWRlKTtcbiAgICB9XG59XG5cblNlcmlhbGl6ZXIucmVtb3ZlUHJvcGVydHkoJ21hdHJpeGRyb3Bkb3duJywgJ3JlbmRlckFzJyk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdtYXRyaXhkcm9wZG93bicsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeGRyb3Bkb3duJywgRmxhdE1hdHJpeE11bHRpcGxlKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhtdWx0aXBsZS50cyIsImltcG9ydCBJbnRlcnZhbFRyZWUgZnJvbSAnbm9kZS1pbnRlcnZhbC10cmVlJztcbmltcG9ydCB7IERvY09wdGlvbnMsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuaW50ZXJmYWNlIFBhY2tJbnRlcnZhbCB7XG4gICAgcGFnZUluZGV4OiBudW1iZXI7XG4gICAgeExlZnQ6IG51bWJlcjtcbiAgICB4UmlnaHQ6IG51bWJlcjtcbiAgICB5Qm90OiBudW1iZXI7XG4gICAgYWJzQm90OiBudW1iZXI7XG59XG5leHBvcnQgY2xhc3MgUGFnZVBhY2tlciB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgZmluZEJvdEludGVydmFsKHRyZWU6IEludGVydmFsVHJlZTxQYWNrSW50ZXJ2YWw+LFxuICAgICAgICB4TGVmdDogbnVtYmVyLCB4UmlnaHQ6IG51bWJlciwgb3B0aW9uczogRG9jT3B0aW9ucyk6IFBhY2tJbnRlcnZhbCB7XG4gICAgICAgIGNvbnN0IGludGVydmFsczogUGFja0ludGVydmFsW10gPSB0cmVlLnNlYXJjaCh4TGVmdCwgeFJpZ2h0KTtcbiAgICAgICAgaW50ZXJ2YWxzLnB1c2goe1xuICAgICAgICAgICAgcGFnZUluZGV4OiAwLCB4TGVmdDpcbiAgICAgICAgICAgICAgICBvcHRpb25zLm1hcmdpbnMubGVmdCwgeFJpZ2h0OiBvcHRpb25zLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgIHlCb3Q6IG9wdGlvbnMubWFyZ2lucy50b3AsIGFic0JvdDogb3B0aW9ucy5tYXJnaW5zLnRvcFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGludGVydmFscy5yZWR1Y2UoKG14LCBjcikgPT4ge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGNyLnhSaWdodCAtIHhMZWZ0KSA8IFN1cnZleUhlbHBlci5FUFNJTE9OIHx8XG4gICAgICAgICAgICAgICAgTWF0aC5hYnMoY3IueExlZnQgLSB4UmlnaHQpIDwgU3VydmV5SGVscGVyLkVQU0lMT04pIHJldHVybiBteDtcbiAgICAgICAgICAgIGlmIChjci5wYWdlSW5kZXggPCBteC5wYWdlSW5kZXgpIHJldHVybiBteDtcbiAgICAgICAgICAgIGlmIChjci5wYWdlSW5kZXggPiBteC5wYWdlSW5kZXgpIHJldHVybiBjcjtcbiAgICAgICAgICAgIHJldHVybiBjci55Qm90ID4gbXgueUJvdCA/IGNyIDogbXg7XG4gICAgICAgIH0sIGludGVydmFsc1tpbnRlcnZhbHMubGVuZ3RoIC0gMV0pO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhZGRQYWNrKHBhY2tzOiBJUGRmQnJpY2tbXVtdLCBpbmRleDogbnVtYmVyLCBicmljazogSVBkZkJyaWNrKSB7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHBhY2tzLmxlbmd0aDsgaSA8PSBpbmRleDsgaSsrKSB7XG4gICAgICAgICAgICBwYWNrcy5wdXNoKFtdKTtcbiAgICAgICAgfVxuICAgICAgICBwYWNrc1tpbmRleF0ucHVzaChicmljayk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcGFjayhmbGF0czogSVBkZkJyaWNrW11bXSwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IElQZGZCcmlja1tdW10ge1xuICAgICAgICBjb25zdCBwYWdlSGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy50b3AgLSBjb250cm9sbGVyLm1hcmdpbnMuYm90O1xuICAgICAgICBjb25zdCB1bmZvbGRGbGF0czogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBmbGF0cy5mb3JFYWNoKChmbGF0c1BhZ2U6IElQZGZCcmlja1tdKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRGbGF0cy5wdXNoKFtdKTtcbiAgICAgICAgICAgIGZsYXRzUGFnZS5mb3JFYWNoKChmbGF0OiBJUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmxhdC5oZWlnaHQgPiBwYWdlSGVpZ2h0ICsgU3VydmV5SGVscGVyLkVQU0lMT04pIHtcbiAgICAgICAgICAgICAgICAgICAgdW5mb2xkRmxhdHNbdW5mb2xkRmxhdHMubGVuZ3RoIC0gMV0ucHVzaCguLi5mbGF0LnVuZm9sZCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB1bmZvbGRGbGF0c1t1bmZvbGRGbGF0cy5sZW5ndGggLSAxXS5wdXNoKGZsYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB1bmZvbGRGbGF0cy5mb3JFYWNoKCh1bmZvbGRGbGF0c1BhZ2U6IElQZGZCcmlja1tdKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRGbGF0c1BhZ2Uuc29ydCgoYTogSVBkZkJyaWNrLCBiOiBJUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYS55VG9wIDwgYi55VG9wKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgaWYgKGEueVRvcCA+IGIueVRvcCkgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgaWYgKGEueExlZnQgPiBiLnhMZWZ0KSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICBpZiAoYS54TGVmdCA8IGIueExlZnQpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHBhZ2VJbmRleE1vZGVsOiBudW1iZXIgPSAwO1xuICAgICAgICBjb25zdCBwYWNrczogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBjb25zdCBwYWdlQm90OiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC0gY29udHJvbGxlci5tYXJnaW5zLmJvdDtcbiAgICAgICAgdW5mb2xkRmxhdHMuZm9yRWFjaCgodW5mb2xkRmxhdHNQYWdlOiBJUGRmQnJpY2tbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHJlZTogSW50ZXJ2YWxUcmVlPFBhY2tJbnRlcnZhbD4gPSBuZXcgSW50ZXJ2YWxUcmVlKCk7XG4gICAgICAgICAgICBsZXQgcGFnZUluZGV4U2hpZnQ6IG51bWJlciA9IDA7XG4gICAgICAgICAgICB1bmZvbGRGbGF0c1BhZ2UuZm9yRWFjaCgoZmxhdDogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHsgcGFnZUluZGV4LCB5Qm90LCBhYnNCb3QgfSA9IFBhZ2VQYWNrZXIuZmluZEJvdEludGVydmFsKFxuICAgICAgICAgICAgICAgICAgICB0cmVlLCBmbGF0LnhMZWZ0LCBmbGF0LnhSaWdodCwgY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSBmbGF0LmhlaWdodDtcbiAgICAgICAgICAgICAgICBmbGF0LnlUb3AgPSB5Qm90ICsgZmxhdC55VG9wIC0gYWJzQm90O1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhmbGF0LnlUb3AgLSBjb250cm9sbGVyLm1hcmdpbnMudG9wKSA+IFN1cnZleUhlbHBlci5FUFNJTE9OICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYXQueVRvcCArIGhlaWdodCA+IHBhZ2VCb3QgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTiB8fCBmbGF0LmlzUGFnZUJyZWFrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYXQueVRvcCA9IGNvbnRyb2xsZXIubWFyZ2lucy50b3A7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXhTaGlmdCA9IE1hdGgubWF4KHBhZ2VJbmRleFNoaWZ0LCBwYWdlSW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cmVlLmluc2VydChmbGF0LnhMZWZ0LCBmbGF0LnhSaWdodCwge1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgeExlZnQ6IGZsYXQueExlZnQsIHhSaWdodDogZmxhdC54UmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHlCb3Q6IGZsYXQueVRvcCArIGhlaWdodCwgYWJzQm90OiBmbGF0LnlCb3RcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmbGF0LnlCb3QgPSBmbGF0LnlUb3AgKyBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgUGFnZVBhY2tlci5hZGRQYWNrKHBhY2tzLCBwYWdlSW5kZXhNb2RlbCArIHBhZ2VJbmRleCwgZmxhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhZ2VJbmRleE1vZGVsICs9IHBhZ2VJbmRleFNoaWZ0ICsgMTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYWNrcztcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BhZ2VfbGF5b3V0L3BhZ2VfcGFja2VyLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuL3BkZl9jaGVja2l0ZW0nO1xuXG5leHBvcnQgY2xhc3MgQm9vbGVhbkl0ZW1CcmljayBleHRlbmRzIENoZWNrSXRlbUJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgc3VwZXIoY29udHJvbGxlciwgcmVjdCxcbiAgICAgICAgICAgICg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLmlkLFxuICAgICAgICAgICAgeyBxdWVzdGlvbjogcXVlc3Rpb24sIHJlYWRPbmx5OiBxdWVzdGlvbi5pc1JlYWRPbmx5LCBjaGVja2VkOiAoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS5jaGVja2VkVmFsdWUgfSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25DaGVja2JveE1vZGVsLCBJdGVtVmFsdWUgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IENoZWNrSXRlbUJyaWNrIH0gZnJvbSAnLi9wZGZfY2hlY2tpdGVtJztcblxuZXhwb3J0IGNsYXNzIENoZWNrYm94SXRlbUJyaWNrIGV4dGVuZHMgQ2hlY2tJdGVtQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIsIHJlY3QsXG4gICAgICAgICAgICAoPFF1ZXN0aW9uQ2hlY2tib3hNb2RlbD5xdWVzdGlvbikuaWQgKyAnaW5kZXgnICsgaW5kZXgsXG4gICAgICAgICAgICB7IHF1ZXN0aW9uOiBxdWVzdGlvbiwgcmVhZE9ubHk6IHF1ZXN0aW9uLmlzUmVhZE9ubHkgfHwgIWl0ZW0uaXNFbmFibGVkLCBpdGVtOiBpdGVtLCBjaGVja2VkOiAoPFF1ZXN0aW9uQ2hlY2tib3hNb2RlbD5xdWVzdGlvbikuaXNJdGVtU2VsZWN0ZWQoaXRlbSksIGluZGV4OiBpbmRleCB9KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgc2V0dGluZ3MgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRCb3hCcmljayB9IGZyb20gJy4vcGRmX3RleHRib3gnO1xuXG5leHBvcnQgY2xhc3MgQ29tbWVudEJyaWNrIGV4dGVuZHMgVGV4dEJveEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBpc1F1ZXN0aW9uOiBib29sZWFuLCBpbmRleDogbnVtYmVyID0gMCkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgaXNRdWVzdGlvbiwgdHJ1ZSwgaW5kZXgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2hvdWxkUmVuZGVyRmxhdEJvcmRlcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmKHRoaXMuaXNRdWVzdGlvbiAmJiB0aGlzLnF1ZXN0aW9uLmdldFR5cGUoKSAhPT0gJ2NvbW1lbnQnKSByZXR1cm4gc3VwZXIuc2hvdWxkUmVuZGVyRmxhdEJvcmRlcnMoKTtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzLnJlYWRPbmx5Q29tbWVudFJlbmRlck1vZGUgPT09ICd0ZXh0YXJlYSc7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9jb21tZW50LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkRyb3Bkb3duTW9kZWwsIEl0ZW1WYWx1ZSB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIERyb3Bkb3duQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkRyb3Bkb3duTW9kZWw7XG4gICAgcHJvdGVjdGVkIGlzUXVlc3Rpb246IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIGlzTXVsdGlsaW5lOiBib29sZWFuO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjb21ib0JveCA9IG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtQ29tYm9Cb3gpKCk7XG4gICAgICAgIGNvbWJvQm94LmZpZWxkTmFtZSA9IHRoaXMucXVlc3Rpb24uaWQ7XG4gICAgICAgIGNvbWJvQm94LlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5mb3JtU2NhbGUodGhpcy5jb250cm9sbGVyLCB0aGlzKSkpO1xuICAgICAgICBjb21ib0JveC5lZGl0ID0gZmFsc2U7XG4gICAgICAgIGNvbWJvQm94LmNvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLnNob3dPcHRpb25zQ2FwdGlvbikge1xuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHRoaXMuZ2V0Q29ycmVjdGVkVGV4dCh0aGlzLnF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5mb3JFYWNoKChpdGVtOiBJdGVtVmFsdWUpID0+IHtcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaCh0aGlzLmdldENvcnJlY3RlZFRleHQoU3VydmV5SGVscGVyLmdldExvY1N0cmluZyhpdGVtLmxvY1RleHQpKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb21ib0JveC5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBjb21ib0JveC5mb250TmFtZSA9IHRoaXMuY29udHJvbGxlci5mb250TmFtZTtcbiAgICAgICAgY29tYm9Cb3guZm9udFNpemUgPSB0aGlzLmZvbnRTaXplO1xuICAgICAgICBjb21ib0JveC5yZWFkT25seSA9IHRoaXMucXVlc3Rpb24uaXNSZWFkT25seTtcbiAgICAgICAgY29tYm9Cb3guaXNVbmljb2RlID0gU3VydmV5SGVscGVyLmlzQ3VzdG9tRm9udChcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgY29tYm9Cb3guZm9udE5hbWUpO1xuICAgICAgICBjb21ib0JveC5WID0gdGhpcy5nZXRDb3JyZWN0ZWRUZXh0KFN1cnZleUhlbHBlci5nZXREcm9wZG93blF1ZXN0aW9uVmFsdWUodGhpcy5xdWVzdGlvbikpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmFkZEZpZWxkKGNvbWJvQm94KTtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9kcm9wZG93bi50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5cbmV4cG9ydCBjbGFzcyBIVE1MQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBtYXJnaW5zOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciB9O1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGh0bWw6IHN0cmluZywgaXNJbWFnZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgaWYgKGlzSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMubWFyZ2lucyA9IHtcbiAgICAgICAgICAgICAgICB0b3A6IDAuMCxcbiAgICAgICAgICAgICAgICBib3R0b206IDAuMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWFyZ2lucyA9IHtcbiAgICAgICAgICAgICAgICB0b3A6IGNvbnRyb2xsZXIubWFyZ2lucy50b3AsXG4gICAgICAgICAgICAgICAgYm90dG9tOiBjb250cm9sbGVyLm1hcmdpbnMuYm90XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IHRoaXMuZm9udFNpemU7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmZyb21IVE1MKHRoaXMuaHRtbCwgdGhpcy54TGVmdCwgdGhpcy55VG9wLCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsIHBhZ2VzcGxpdDogdHJ1ZSxcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zanMtcGRmLWhpZGRlbi1odG1sLWRpdicpKS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZWw6IEhUTUxEaXZFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSwgdGhpcy5tYXJnaW5zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfaHRtbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQb2ludCB9IGZyb20gJy4uL2VudHJpZXMvcGRmJztcblxuZXhwb3J0IGNsYXNzIEltYWdlQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHByb3RlY3RlZCBpbWFnZTogc3RyaW5nLFxuICAgICAgICBwb2ludDogSVBvaW50LCBwcm90ZWN0ZWQgb3JpZ2luYWxXaWR0aDogbnVtYmVyLCBwcm90ZWN0ZWQgb3JpZ2luYWxIZWlnaHQ6IG51bWJlcikge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgeFJpZ2h0OiBwb2ludC54TGVmdCArIChvcmlnaW5hbFdpZHRoIHx8IDApLFxuICAgICAgICAgICAgeVRvcDogcG9pbnQueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHBvaW50LnlUb3AgKyAob3JpZ2luYWxIZWlnaHQgfHwgMClcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaXNQYWdlQnJlYWsgPSB0aGlzLm9yaWdpbmFsSGVpZ2h0ID09PSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRJbWFnZSh0aGlzLmltYWdlLCAnUE5HJywgdGhpcy54TGVmdCwgdGhpcy55VG9wLCB0aGlzLm9yaWdpbmFsV2lkdGgsIHRoaXMub3JpZ2luYWxIZWlnaHQpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfaW1hZ2UudHMiLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBMaW5rQnJpY2sgZXh0ZW5kcyBUZXh0QnJpY2sge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNDQUxFX0ZBQ1RPUl9NQUdJQzogbnVtYmVyID0gMC45NTU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDT0xPUjogc3RyaW5nID0gJyMwMDAwRUUnO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXh0RmxhdDogVGV4dEJyaWNrLCBwcm90ZWN0ZWQgbGluazogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCg8TGlua0JyaWNrPnRleHRGbGF0KS5xdWVzdGlvbixcbiAgICAgICAgICAgICg8TGlua0JyaWNrPnRleHRGbGF0KS5jb250cm9sbGVyLFxuICAgICAgICAgICAgdGV4dEZsYXQsICg8TGlua0JyaWNrPnRleHRGbGF0KS50ZXh0KTtcbiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSBMaW5rQnJpY2suQ09MT1I7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IG9sZFRleHRDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRUZXh0Q29sb3IoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3IoU3VydmV5SGVscGVyLkJBQ0tHUk9VTkRfQ09MT1IpO1xuICAgICAgICBsZXQgZGVzY2VudDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKlxuICAgICAgICAgICAgKHRoaXMuY29udHJvbGxlci5kb2MuZ2V0TGluZUhlaWdodEZhY3RvcigpIC1cbiAgICAgICAgICAgICAgICBMaW5rQnJpY2suU0NBTEVfRkFDVE9SX01BR0lDKTtcbiAgICAgICAgbGV0IHlUb3BMaW5rOiBudW1iZXIgPSB0aGlzLnlUb3AgK1xuICAgICAgICAgICAgKHRoaXMueUJvdCAtIHRoaXMueVRvcCkgLSBkZXNjZW50O1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnRleHRXaXRoTGluayh0aGlzLnRleHQsIHRoaXMueExlZnQsXG4gICAgICAgICAgICB5VG9wTGluaywgeyB1cmw6IHRoaXMubGluayB9KTtcbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3Iob2xkVGV4dENvbG9yKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoU3VydmV5SGVscGVyLmdldFJlYWRvbmx5UmVuZGVyQXMoPFF1ZXN0aW9uPnRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIpICE9PSAndGV4dCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2xpbmsudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGludGVyZmFjZSBJUmFkaW9ncm91cFdyYXBDb250ZXh0IHtcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uO1xuICAgIHJlYWRPbmx5OiBib29sZWFuO1xufVxuZXhwb3J0IGNsYXNzIFJhZGlvR3JvdXBXcmFwIHtcbiAgICBwcml2YXRlIF9yYWRpb0dyb3VwOiBhbnk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcHJpdmF0ZSBjb250ZXh0OiBJUmFkaW9ncm91cFdyYXBDb250ZXh0KSB7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRUb1BkZihjb2xvcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAgPSBuZXcgdGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybVJhZGlvQnV0dG9uKCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHt9O1xuICAgICAgICBvcHRpb25zLmZpZWxkTmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgb3B0aW9ucy5yZWFkT25seSA9IHRoaXMucmVhZE9ubHk7XG4gICAgICAgIG9wdGlvbnMuY29sb3IgPSBjb2xvcjtcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICAoPFN1cnZleVBERj50aGlzLmNvbnRleHQucXVlc3Rpb24uc3VydmV5KT8uZ2V0VXBkYXRlZFJhZGlvR3JvdXBXcmFwT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fcmFkaW9Hcm91cC5maWVsZE5hbWUgPSBvcHRpb25zLmZpZWxkTmFtZTtcbiAgICAgICAgdGhpcy5fcmFkaW9Hcm91cC5yZWFkT25seSA9IG9wdGlvbnMucmVhZE9ubHk7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAuY29sb3IgPSBvcHRpb25zLmNvbG9yO1xuXG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAudmFsdWUgPSAnJztcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZCh0aGlzLl9yYWRpb0dyb3VwKTtcbiAgICB9XG4gICAgZ2V0IHJhZGlvR3JvdXAoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhZGlvR3JvdXA7XG4gICAgfVxuICAgIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5yZWFkT25seTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJhZGlvR3JvdXBJdGVtQnJpY2tDb250ZXh0IHtcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uO1xuICAgIGNoZWNrZWQ6IGJvb2xlYW47XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBpdGVtOiBJdGVtVmFsdWU7XG59XG5cbmV4cG9ydCBjbGFzcyBSYWRpb0l0ZW1CcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSQURJT01BUktFUl9SRUFET05MWV9TWU1CT0w6IHN0cmluZyA9ICdsJztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSQURJT01BUktFUl9SRUFET05MWV9GT05UOiBzdHJpbmcgPSAnemFwZmRpbmdiYXRzJztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJBRElPTUFSS0VSX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4wIC0gKCgyLjAgKyBNYXRoLkUpIC8gMTAuMCk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcml2YXRlIGNvbnRleHQ6IElSYWRpb0dyb3VwSXRlbUJyaWNrQ29udGV4dCxcbiAgICAgICAgcHJpdmF0ZSByYWRpb0dyb3VwV3JhcDogUmFkaW9Hcm91cFdyYXApIHtcbiAgICAgICAgc3VwZXIoY29udGV4dC5xdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRTaG91bGRSZW5kZXJSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFkaW9Hcm91cFdyYXAucmVhZE9ubHkgJiYgU3VydmV5SGVscGVyLmdldFJlYWRvbmx5UmVuZGVyQXMoXG4gICAgICAgICAgICA8UXVlc3Rpb24+dGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKSAhPT0gJ2Fjcm9mb3JtJyB8fCB0aGlzLmNvbnRyb2xsZXIuY29tcHJlc3M7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5pbmRleCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwLmFkZFRvUGRmKHRoaXMuZm9ybUJvcmRlckNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7fTtcbiAgICAgICAgb3B0aW9ucy5maWVsZE5hbWUgPSB0aGlzLnJhZGlvR3JvdXBXcmFwLm5hbWUgKyAnaW5kZXgnICsgdGhpcy5jb250ZXh0LmluZGV4O1xuICAgICAgICBsZXQgZm9ybVNjYWxlOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZm9ybVNjYWxlKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIG9wdGlvbnMuUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KHRoaXMsIGZvcm1TY2FsZSkpO1xuICAgICAgICBvcHRpb25zLmNvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgICAgIG9wdGlvbnMuYXBwZWFyYW5jZSA9IHRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm0uQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGU7XG4gICAgICAgIG9wdGlvbnMucmFkaW9Hcm91cCA9IHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cDtcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuXG4gICAgICAgICg8U3VydmV5UERGPnRoaXMuY29udGV4dC5xdWVzdGlvbi5zdXJ2ZXkpPy5nZXRVcGRhdGVkUmFkaW9JdGVtQWNyb2Zvcm1PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBsZXQgcmFkaW9CdXR0b246IGFueSA9IHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC5jcmVhdGVPcHRpb24ob3B0aW9ucy5maWVsZE5hbWUpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuY2hlY2tlZCkge1xuICAgICAgICAgICAgaWYoIW9wdGlvbnMuQVMpIHtcbiAgICAgICAgICAgICAgICByYWRpb0J1dHRvbi5BUyA9ICcvJyArIG9wdGlvbnMuZmllbGROYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIXRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC52YWx1ZSA9IG9wdGlvbnMuZmllbGROYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYoIW9wdGlvbnMuQVMpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLkFTID0gJy9PZmYnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJhZGlvQnV0dG9uLlJlY3QgPSBvcHRpb25zLlJlY3Q7XG4gICAgICAgIHJhZGlvQnV0dG9uLmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcblxuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcC5yYWRpb0dyb3VwLnNldEFwcGVhcmFuY2UoXG4gICAgICAgICAgICBvcHRpb25zLmFwcGVhcmFuY2VcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5jaGVja2VkKSB7XG4gICAgICAgICAgICBjb25zdCByYWRpb21hcmtlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGhpcywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICAgICAgY29uc3Qgb2xkRm9udE5hbWU6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5mb250TmFtZTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5mb250TmFtZSA9IFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX0ZPTlQ7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqXG4gICAgICAgICAgICAgICAgUmFkaW9JdGVtQnJpY2suUkFESU9NQVJLRVJfUkVBRE9OTFlfRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICAgICAgbGV0IHJhZGlvbWFya2VyU2l6ZTogSVNpemUgPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoXG4gICAgICAgICAgICAgICAgUmFkaW9JdGVtQnJpY2suUkFESU9NQVJLRVJfUkVBRE9OTFlfU1lNQk9MKTtcbiAgICAgICAgICAgIHJhZGlvbWFya2VyUG9pbnQueExlZnQgKz0gdGhpcy53aWR0aCAvIDIuMCAtIHJhZGlvbWFya2VyU2l6ZS53aWR0aCAvIDIuMDtcbiAgICAgICAgICAgIHJhZGlvbWFya2VyUG9pbnQueVRvcCArPSB0aGlzLmhlaWdodCAvIDIuMCAtIHJhZGlvbWFya2VyU2l6ZS5oZWlnaHQgLyAyLjA7XG4gICAgICAgICAgICBsZXQgcmFkaW9tYXJrZXJGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgcmFkaW9tYXJrZXJQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX1NZTUJPTCwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgICg8YW55PnJhZGlvbWFya2VyRmxhdC51bmZvbGQoKVswXSkudGV4dENvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgICAgICBhd2FpdCByYWRpb21hcmtlckZsYXQucmVuZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5mb250TmFtZSA9IG9sZEZvbnROYW1lO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uUmFua2luZ01vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyLCBJUG9pbnQgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4vcGRmX2NoZWNraXRlbSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFJhbmtpbmdJdGVtQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblJhbmtpbmdNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBtYXJrOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uUmFua2luZ01vZGVsPnF1ZXN0aW9uO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBjb25zdCBtYXJrUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aGlzLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKlxuICAgICAgICAgICAgQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgY29uc3QgbWFya1NpemU6IElTaXplID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMubWFyayk7XG4gICAgICAgIG1hcmtQb2ludC54TGVmdCArPSB0aGlzLndpZHRoIC8gMi4wIC0gbWFya1NpemUud2lkdGggLyAyLjA7XG4gICAgICAgIG1hcmtQb2ludC55VG9wICs9IHRoaXMuaGVpZ2h0IC8gMi4wIC0gbWFya1NpemUuaGVpZ2h0IC8gMi4wO1xuICAgICAgICBjb25zdCBtYXJrRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgbWFya1BvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMubWFyaywgVGV4dEJyaWNrKTtcbiAgICAgICAgKDxhbnk+bWFya0ZsYXQudW5mb2xkKClbMF0pLnRleHRDb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgYXdhaXQgbWFya0ZsYXQucmVuZGVyKCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9yYW5raW5naXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwsIHNldHRpbmdzIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrLCBUcmFuc2xhdGVYRnVuY3Rpb24gfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi9wZGZfY29tcG9zaXRlJztcblxuZXhwb3J0IGNsYXNzIFRleHRGaWVsZEJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgaXNRdWVzdGlvbjogYm9vbGVhbixcbiAgICAgICAgcHJvdGVjdGVkIGZpZWxkTmFtZTogc3RyaW5nLCBwcm90ZWN0ZWQgdmFsdWU6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHBsYWNlaG9sZGVyOiBzdHJpbmcsIHB1YmxpYyBpc1JlYWRPbmx5OiBib29sZWFuLFxuICAgICAgICBwcm90ZWN0ZWQgaXNNdWx0aWxpbmU6IGJvb2xlYW4sIHByb3RlY3RlZCBpbnB1dFR5cGU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgcmVuZGVyQ29sb3JRdWVzdGlvbigpOiB2b2lkIHtcbiAgICAgICAgbGV0IG9sZEZpbGxDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRGaWxsQ29sb3IoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRGaWxsQ29sb3IodGhpcy5xdWVzdGlvbi52YWx1ZSB8fCAnYmxhY2snKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5yZWN0KHRoaXMueExlZnQsIHRoaXMueVRvcCxcbiAgICAgICAgICAgIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAnRicpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldEZpbGxDb2xvcihvbGRGaWxsQ29sb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0VHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDb2xvclF1ZXN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5wdXRGaWVsZDogYW55ID0gdGhpcy5pbnB1dFR5cGUgPT09ICdwYXNzd29yZCcgP1xuICAgICAgICAgICAgbmV3ICg8YW55PnRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1QYXNzd29yZEZpZWxkKSgpIDpcbiAgICAgICAgICAgIG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtVGV4dEZpZWxkKSgpO1xuICAgICAgICBpbnB1dEZpZWxkLmZpZWxkTmFtZSA9IHRoaXMuZmllbGROYW1lO1xuICAgICAgICBpbnB1dEZpZWxkLmZvbnROYW1lID0gdGhpcy5jb250cm9sbGVyLmZvbnROYW1lO1xuICAgICAgICBpbnB1dEZpZWxkLmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgaW5wdXRGaWVsZC5pc1VuaWNvZGUgPSBTdXJ2ZXlIZWxwZXIuaXNDdXN0b21Gb250KFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCBpbnB1dEZpZWxkLmZvbnROYW1lKTtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRUeXBlICE9PSAncGFzc3dvcmQnKSB7XG4gICAgICAgICAgICBpbnB1dEZpZWxkLlYgPSAnICcgKyB0aGlzLmdldENvcnJlY3RlZFRleHQodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICBpbnB1dEZpZWxkLkRWID0gJyAnICsgdGhpcy5nZXRDb3JyZWN0ZWRUZXh0KHRoaXMucGxhY2Vob2xkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaW5wdXRGaWVsZC52YWx1ZSA9ICcnO1xuICAgICAgICBpbnB1dEZpZWxkLm11bHRpbGluZSA9IHRoaXMuaXNNdWx0aWxpbmU7XG4gICAgICAgIGlucHV0RmllbGQucmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHk7XG4gICAgICAgIGlucHV0RmllbGQuY29sb3IgPSB0aGlzLnRleHRDb2xvcjtcbiAgICAgICAgbGV0IGZvcm1TY2FsZTogbnVtYmVyID0gU3VydmV5SGVscGVyLmZvcm1TY2FsZSh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBpbnB1dEZpZWxkLm1heEZvbnRTaXplID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplICogZm9ybVNjYWxlO1xuICAgICAgICBpbnB1dEZpZWxkLlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLCBmb3JtU2NhbGUpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZChpbnB1dEZpZWxkKTtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzaG91bGRSZW5kZXJGbGF0Qm9yZGVycygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzLnJlYWRPbmx5VGV4dFJlbmRlck1vZGUgPT09ICdpbnB1dCc7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRTaG91bGRSZW5kZXJSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5zaG91bGRSZW5kZXJSZWFkT25seSh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMuaXNSZWFkT25seSk7XG4gICAgfVxuICAgIHByaXZhdGUgX3RleHRCcmljazogSVBkZkJyaWNrO1xuICAgIHB1YmxpYyBnZXQgdGV4dEJyaWNrKCk6IElQZGZCcmljayB7XG4gICAgICAgIHJldHVybiB0aGlzLl90ZXh0QnJpY2s7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgdGV4dEJyaWNrKHZhbDogSVBkZkJyaWNrKSB7XG4gICAgICAgIHRoaXMuX3RleHRCcmljayA9IHZhbDtcbiAgICAgICAgY29uc3QgdW5Gb2xkZWRCcmlja3MgPSB2YWwudW5mb2xkKCk7XG4gICAgICAgIGNvbnN0IGJyaWNrc0NvdW50ID0gdW5Gb2xkZWRCcmlja3MubGVuZ3RoO1xuICAgICAgICBsZXQgcmVuZGVyZWRCcmlja3NDb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IGJyaWNrc0J5UGFnZTogeyBbaW5kZXg6IG51bWJlcl06IEFycmF5PFBkZkJyaWNrPiB9ID0ge307XG4gICAgICAgIGNvbnN0IGFmdGVyUmVuZGVyVGV4dEJyaWNrQ2FsbGJhY2sgPSAoYnJpY2s6IFBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICBpZih0aGlzLnNob3VsZFJlbmRlckZsYXRCb3JkZXJzKCkpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlZEJyaWNrc0NvdW50Kys7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VOdW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZ2V0Q3VycmVudFBhZ2VJbmRleCgpO1xuICAgICAgICAgICAgICAgIGlmKCFicmlja3NCeVBhZ2VbY3VycmVudFBhZ2VOdW1iZXJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyaWNrc0J5UGFnZVtjdXJyZW50UGFnZU51bWJlcl0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJpY2tzQnlQYWdlW2N1cnJlbnRQYWdlTnVtYmVyXS5wdXNoKGJyaWNrKTtcbiAgICAgICAgICAgICAgICBpZihyZW5kZXJlZEJyaWNrc0NvdW50ID49IGJyaWNrc0NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhicmlja3NCeVBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlZE9uT25lUGFnZSA9IGtleXMubGVuZ3RoID09IDE7XG4gICAgICAgICAgICAgICAgICAgIGtleXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmlja3NCeVBhZ2Vba2V5IGFzIGFueV0uZm9yRWFjaCgoYnJpY2s6IFBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlQnJpY2suYWRkQnJpY2soYnJpY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuVkFMVUVfUkVBRE9OTFlfUEFERElOR19TQ0FMRTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvcmRlclJlY3QgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeExlZnQ6IHRoaXMueExlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFJpZ2h0OiB0aGlzLnhSaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5VG9wOiByZW5kZXJlZE9uT25lUGFnZSA/IHRoaXMueVRvcCA6IGNvbXBvc2l0ZUJyaWNrLnlUb3AgLSBwYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlCb3Q6IHJlbmRlcmVkT25PbmVQYWdlID8gdGhpcy55Qm90IDogY29tcG9zaXRlQnJpY2sueUJvdCArIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZW5kZXJlZE9uT25lUGFnZSA/IHRoaXMuaGVpZ2h0IDogY29tcG9zaXRlQnJpY2suaGVpZ2h0ICsgMiAqIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUJvcmRlckNvbG9yOiB0aGlzLmZvcm1Cb3JkZXJDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0UGFnZShOdW1iZXIoa2V5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCBib3JkZXJSZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5zZXRQYWdlKGN1cnJlbnRQYWdlTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB1bkZvbGRlZEJyaWNrcy5mb3JFYWNoKChicmljazogUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgIGJyaWNrLmFmdGVyUmVuZGVyQ2FsbGJhY2sgPSBhZnRlclJlbmRlclRleHRCcmlja0NhbGxiYWNrLmJpbmQodGhpcywgYnJpY2spO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnModGhpcy54TGVmdCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gdGhpcy54UmlnaHQpO1xuICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ29sb3JRdWVzdGlvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy50ZXh0QnJpY2sucmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICB9XG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIGlmICh0aGlzLmdldFNob3VsZFJlbmRlclJlYWRPbmx5KCkgJiYgdGhpcy5pbnB1dFR5cGUgIT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHRCcmljay51bmZvbGQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci51bmZvbGQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgdHJhbnNsYXRlWChmdW5jOiBUcmFuc2xhdGVYRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzID0gZnVuYyh0aGlzLnhMZWZ0LCB0aGlzLnhSaWdodCk7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0gcmVzLnhMZWZ0O1xuICAgICAgICB0aGlzLl94UmlnaHQgPSByZXMueFJpZ2h0O1xuICAgICAgICBpZih0aGlzLnRleHRCcmljaykge1xuICAgICAgICAgICAgdGhpcy50ZXh0QnJpY2sudHJhbnNsYXRlWChmdW5jKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WExlZnQodmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVsdGEgPSB2YWwgLSB0aGlzLl94TGVmdDtcbiAgICAgICAgc3VwZXIuc2V0WExlZnQodmFsKTtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnhMZWZ0ID0gdGhpcy50ZXh0QnJpY2sueExlZnQgKyBkZWx0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WFJpZ2h0KHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdmFsIC0gdGhpcy5feFJpZ2h0O1xuICAgICAgICBzdXBlci5zZXRYUmlnaHQodmFsKTtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnhSaWdodCA9IHRoaXMudGV4dEJyaWNrLnhSaWdodCArIGRlbHRhO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXRZVG9wKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdmFsIC0gdGhpcy5feVRvcDtcbiAgICAgICAgc3VwZXIuc2V0WVRvcCh2YWwpO1xuICAgICAgICBpZih0aGlzLnRleHRCcmljaykge1xuICAgICAgICAgICAgdGhpcy50ZXh0QnJpY2sueVRvcCA9IHRoaXMudGV4dEJyaWNrLnlUb3AgKyBkZWx0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WUJvdHRvbSh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBkZWx0YSA9IHZhbCAtIHRoaXMuX3lCb3Q7XG4gICAgICAgIHN1cGVyLnNldFlCb3R0b20odmFsKTtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnlCb3QgPSB0aGlzLnRleHRCcmljay55Qm90ICsgZGVsdGE7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRmaWVsZC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0Ym9sZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFRpdGxlUGFuZWxCcmljayBleHRlbmRzIFRleHRCb2xkQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIHRleHQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRGb250U2l6ZSA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKiBTdXJ2ZXlIZWxwZXIuVElUTEVfUEFORUxfRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBhd2FpdCBzdXBlci5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFBhbmVsTW9kZWwsIFBhZ2VNb2RlbCwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcG9pbnQ6IElQb2ludDtcbiAgICBwdWJsaWMgYnJpY2tzOiBJUGRmQnJpY2tbXTtcbiAgICBwdWJsaWMgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcjtcbiAgICBwdWJsaWMgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnk7XG4gICAgcHVibGljIG1vZHVsZTogYW55O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5LCBtb2R1bGU6IGFueSkge1xuICAgICAgICB0aGlzLnBvaW50ID0gcG9pbnQ7XG4gICAgICAgIHRoaXMuYnJpY2tzID0gYnJpY2tzO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICB0aGlzLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5O1xuICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWRvcm5lcnNPcHRpb25zIGV4dGVuZHMgQWRvcm5lcnNCYXNlT3B0aW9ucyB7XG4gICAgcHVibGljIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocG9pbnQ6IElQb2ludCwgYnJpY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcXVlc3Rpb246IFF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeSwgbW9kdWxlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocG9pbnQsIGJyaWNrcywgY29udHJvbGxlciwgcmVwb3NpdG9yeSwgbW9kdWxlKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBZG9ybmVyc1BhbmVsT3B0aW9ucyBleHRlbmRzIEFkb3JuZXJzQmFzZU9wdGlvbnMge1xuICAgIHB1YmxpYyBwYW5lbDogUGFuZWxNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocG9pbnQ6IElQb2ludCwgYnJpY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcGFuZWw6IFBhbmVsTW9kZWwsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5LCBtb2R1bGU6IGFueSkge1xuICAgICAgICBzdXBlcihwb2ludCwgYnJpY2tzLCBjb250cm9sbGVyLCByZXBvc2l0b3J5LCBtb2R1bGUpO1xuICAgICAgICB0aGlzLnBhbmVsID0gcGFuZWw7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWRvcm5lcnNQYWdlT3B0aW9ucyBleHRlbmRzIEFkb3JuZXJzQmFzZU9wdGlvbnMge1xuICAgIHB1YmxpYyBwYWdlOiBQYWdlTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHBhZ2U6IFBhZ2VNb2RlbCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnksIG1vZHVsZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHBvaW50LCBicmlja3MsIGNvbnRyb2xsZXIsIHJlcG9zaXRvcnksIG1vZHVsZSk7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxufVxuXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXZlbnRfaGFuZGxlci9hZG9ybmVycy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBMb2NhbGl6YWJsZVN0cmluZywgUXVlc3Rpb25Cb29sZWFuTW9kZWwsIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsLCBTdXJ2ZXlNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IEJvb2xlYW5JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuXG5leHBvcnQgY2xhc3MgRmxhdEJvb2xlYW5DaGVja2JveCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkJvb2xlYW5Nb2RlbDtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IG5ldyBCb29sZWFuSXRlbUJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LCBoZWlnaHQsIGhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgcG9pbnQueExlZnQpKTtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IGxvY0xhYmVsVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmlzSW5kZXRlcm1pbmF0ZSA/IG51bGwgOlxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5jaGVja2VkVmFsdWUgPyB0aGlzLnF1ZXN0aW9uLmxvY0xhYmVsVHJ1ZSA6IHRoaXMucXVlc3Rpb24ubG9jTGFiZWxGYWxzZTtcbiAgICAgICAgaWYgKGxvY0xhYmVsVGV4dCAhPT0gbnVsbCAmJiBsb2NMYWJlbFRleHQucmVuZGVyZWRIdG1sICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgICAgICB0ZXh0UG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgbG9jTGFiZWxUZXh0LCBUZXh0QnJpY2spKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUZsYXRdO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBGbGF0Qm9vbGVhbiBleHRlbmRzIEZsYXRSYWRpb2dyb3VwIHtcbiAgICBwcml2YXRlIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+O1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMuYnVpbGRJdGVtcygpO1xuICAgIH1cbiAgICBwcml2YXRlIGJ1aWxkSXRlbXMoKSB7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPig8YW55PnRoaXMucXVlc3Rpb24pO1xuICAgICAgICBjb25zdCBmYWxzZUNob2ljZSA9IG5ldyBJdGVtVmFsdWUoKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikudmFsdWVGYWxzZSAhPT0gdW5kZWZpbmVkID8gKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikudmFsdWVGYWxzZSA6IGZhbHNlKTtcbiAgICAgICAgY29uc3QgdHJ1ZUNob2ljZSA9IG5ldyBJdGVtVmFsdWUoKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikudmFsdWVUcnVlICE9PSB1bmRlZmluZWQgPyAoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS52YWx1ZVRydWUgOiB0cnVlKTtcbiAgICAgICAgZmFsc2VDaG9pY2UubG9jT3duZXIgPSBxdWVzdGlvbjtcbiAgICAgICAgZmFsc2VDaG9pY2Uuc2V0TG9jVGV4dCgoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS5sb2NMYWJlbEZhbHNlKTtcbiAgICAgICAgdHJ1ZUNob2ljZS5sb2NPd25lciA9IHF1ZXN0aW9uO1xuICAgICAgICB0cnVlQ2hvaWNlLnNldExvY1RleHQoKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikubG9jTGFiZWxUcnVlKTtcbiAgICAgICAgdGhpcy5pdGVtcyA9IFtmYWxzZUNob2ljZSwgdHJ1ZUNob2ljZV07XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRWaXNpYmxlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRDb2xDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2Jvb2xlYW4nLCBGbGF0Qm9vbGVhbik7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdib29sZWFuLWNoZWNrYm94JywgRmxhdEJvb2xlYW5DaGVja2JveCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9ib29sZWFuLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCwgUXVlc3Rpb25UYWdib3hNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRTZWxlY3RCYXNlIH0gZnJvbSAnLi9mbGF0X3NlbGVjdGJhc2UnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBDaGVja2JveEl0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0Q2hlY2tib3ggZXh0ZW5kcyBGbGF0U2VsZWN0QmFzZSB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkNoZWNrYm94TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25DaGVja2JveE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgZ2VuZXJhdGVGbGF0SXRlbShyZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogSVBkZkJyaWNrIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGVja2JveEl0ZW1Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHJlY3QsIGl0ZW0sIGluZGV4KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRmxhdFRhZ2JveCBleHRlbmRzIEZsYXRDaGVja2JveCB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblRhZ2JveE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uVGFnYm94TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRWaXNpYmxlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICAgICAgaWYodGhpcy5jb250cm9sbGVyLnRhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnNlbGVjdGVkQ2hvaWNlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRWaXNpYmxlQ2hvaWNlcygpO1xuICAgICAgICB9XG4gICAgfVxufVxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigndGFnYm94JywgRmxhdFRhZ2JveCk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdjaGVja2JveCcsIEZsYXRDaGVja2JveCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY2hlY2tib3gudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQ29tbWVudE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdENvbW1lbnQgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Db21tZW50TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25Db21tZW50TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRydWUsIHsgcm93czogdGhpcy5xdWVzdGlvbi5yb3dzIH0pXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2NvbW1lbnQnLCBGbGF0Q29tbWVudCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY29tbWVudC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25DdXN0b21Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0Q3VzdG9tTW9kZWwgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBmbGF0ID0gRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGUodGhpcy5zdXJ2ZXksIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5nZXRUeXBlKCkpO1xuICAgICAgICByZXR1cm4gZmxhdC5nZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludCk7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdjdXN0b21fbW9kZWwnLCBGbGF0Q3VzdG9tTW9kZWwpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBEcm9wZG93bkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZHJvcGRvd24nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0RHJvcGRvd24gZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Ecm9wZG93bk1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlQnJpY2sgPSAhdGhpcy5zaG91bGRSZW5kZXJBc0NvbW1lbnQgPyBuZXcgRHJvcGRvd25Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKSA6IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0cnVlLCB7IHZhbHVlOiBTdXJ2ZXlIZWxwZXIuZ2V0RHJvcGRvd25RdWVzdGlvblZhbHVlKHRoaXMucXVlc3Rpb24pIH0pO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayh2YWx1ZUJyaWNrKTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBvdGhlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICBvdGhlclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KFxuICAgICAgICAgICAgICAgIG90aGVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgZmFsc2UsIHsgcm93czogU3VydmV5SGVscGVyLk9USEVSX1JPV1NfQ09VTlQgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY29tcG9zaXRlRmxhdF07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdkcm9wZG93bicsIEZsYXREcm9wZG93bik7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZHJvcGRvd24udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0RmllbGRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRmaWVsZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRFeHByZXNzaW9uIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25FeHByZXNzaW9uTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0cnVlLCB7IHZhbHVlOiB0aGlzLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSwgcmVhZE9ubHk6IHRydWUgfSldO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignZXhwcmVzc2lvbicsIEZsYXRFeHByZXNzaW9uKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkZpbGVNb2RlbCwgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVNpemUsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdEZpbGUgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSU1BR0VfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjE5NTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRFWFRfTUlOX1NDQUxFOiBudW1iZXIgPSA1LjA7XG4gICAgcHVibGljIHN0YXRpYyBERUZBVUxUX0lNQUdFX0ZJVDogc3RyaW5nID0gJ2NvbnRhaW4nO1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25GaWxlTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkZpbGVNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRJdGVtKHBvaW50OiBJUG9pbnQsIGl0ZW06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgaW1hZ2VTaXplPzogSVNpemUsXG4gICAgfSk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVMaW5rRmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubmFtZSA9PT0gdW5kZWZpbmVkID8gJ2ltYWdlJyA6IGl0ZW0ubmFtZSwgaXRlbS5jb250ZW50KSk7XG4gICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuY2FuUHJldmlld0ltYWdlKHRoaXMucXVlc3Rpb24sIGl0ZW0sIGl0ZW0uY29udGVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgIGltYWdlUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRGaWxlLklNQUdFX0dBUF9TQ0FMRTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChpbWFnZVBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHsgbGluazogaXRlbS5jb250ZW50LCB3aWR0aDogaXRlbS5pbWFnZVNpemUud2lkdGgsIGhlaWdodDogaXRlbS5pbWFnZVNpemUuaGVpZ2h0LCBvYmplY3RGaXQ6IEZsYXRGaWxlLkRFRkFVTFRfSU1BR0VfRklUIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhZGRMaW5lKHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSwgY3VyclBvaW50OiBJUG9pbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICByb3dzRmxhdHMucHVzaChuZXcgQ29tcG9zaXRlQnJpY2soKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEltYWdlUHJldmlld0NvbnRlbnRXaWR0aChpdGVtOiB7IG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGltYWdlU2l6ZT86IElTaXplIH0pIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGl0ZW0uaW1hZ2VTaXplLndpZHRoLCBGbGF0RmlsZS5URVhUX01JTl9TQ0FMRSAqIHRoaXMuY29udHJvbGxlci51bml0V2lkdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLm5vRmlsZUNob3NlbkNhcHRpb24sIFRleHRCcmljayldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtuZXcgQ29tcG9zaXRlQnJpY2soKV07XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgbGV0IHlCb3Q6IG51bWJlciA9IGN1cnJQb2ludC55VG9wO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBpdGVtOiB7IG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGltYWdlU2l6ZT86IElTaXplIH0gPSB7IC4uLnRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlW2ldIH07XG4gICAgICAgICAgICBjb25zdCBjYW5QcmV2aWV3SW1hZ2UgPSBTdXJ2ZXlIZWxwZXIuY2FuUHJldmlld0ltYWdlKHRoaXMucXVlc3Rpb24sIGl0ZW0sIGl0ZW0uY29udGVudCk7XG4gICAgICAgICAgICBpZiAoY2FuUHJldmlld0ltYWdlKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5pbWFnZVNpemUgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuZ2V0Q29ycmVjdGVkSW1hZ2VTaXplKHRoaXMuY29udHJvbGxlciwgeyBpbWFnZVdpZHRoOiB0aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGgsIGltYWdlSGVpZ2h0OiB0aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0LCBpbWFnZUxpbms6IHRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlW2ldLmNvbnRlbnQsIGRlZmF1bHRJbWFnZVdpZHRoOiAyMDAsIGRlZmF1bHRJbWFnZUhlaWdodDogMTUwIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIGN1cnJQb2ludC54TGVmdDtcbiAgICAgICAgICAgIGlmIChjYW5QcmV2aWV3SW1hZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb3NpdGVXaWR0aCA9IGF3YWl0IHRoaXMuZ2V0SW1hZ2VQcmV2aWV3Q29udGVudFdpZHRoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVXaWR0aCA8IGNvbXBvc2l0ZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTGluZShyb3dzRmxhdHMsIGN1cnJQb2ludCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyhjdXJyUG9pbnQueExlZnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gY3VyclBvaW50LnhMZWZ0IC0gY29tcG9zaXRlV2lkdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oY3VyclBvaW50LCBpdGVtKTtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gaXRlbUZsYXQud2lkdGg7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlV2lkdGggPCB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTGluZShyb3dzRmxhdHMsIGN1cnJQb2ludCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oY3VyclBvaW50LCBpdGVtKTtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gaXRlbUZsYXQueFJpZ2h0IC0gaXRlbUZsYXQueExlZnQ7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2ZpbGUnLCBGbGF0RmlsZSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZmlsZS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25IdG1sTW9kZWwsIFNlcmlhbGl6ZXIgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZW1wdHknO1xuXG5leHBvcnQgdHlwZSBJSFRNTFJlbmRlclR5cGUgPSAnYXV0bycgfCAnc3RhbmRhcmQnIHwgJ2ltYWdlJztcbmV4cG9ydCBjbGFzcyBGbGF0SFRNTCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkh0bWxNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBwcml2YXRlIGNob29zZVJlbmRlcihodG1sOiBzdHJpbmcpOiBJSFRNTFJlbmRlclR5cGUge1xuICAgICAgICBpZiAoLzxbXj5dKnN0eWxlW148XSo+Ly50ZXN0KGh0bWwpIHx8XG4gICAgICAgICAgICAvPFtePl0qdGFibGVbXjxdKj4vLnRlc3QoaHRtbCkgfHxcbiAgICAgICAgICAgIC8mXFx3KzsvLnRlc3QoaHRtbCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnaW1hZ2UnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnc3RhbmRhcmQnO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNvcnJlY3RIdG1sUnVsZXM6IFt7IHNlYXJjaFJlZ0V4cDogUmVnRXhwLCByZXBsYWNlU3RyaW5nOiBzdHJpbmcgfV0gPSBbXG4gICAgICAgIHsgc2VhcmNoUmVnRXhwOiAvKDxcXC8/YnJcXHMqP1xcLz9cXHMqPz5cXHMqKXsyLH0vZywgcmVwbGFjZVN0cmluZzogJzxicj4nIH1cbiAgICBdXG4gICAgcHJvdGVjdGVkIGNvcnJlY3RIdG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIEZsYXRIVE1MLmNvcnJlY3RIdG1sUnVsZXMuZm9yRWFjaCgocnVsZSkgPT4ge1xuICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZShydWxlLnNlYXJjaFJlZ0V4cCwgcnVsZS5yZXBsYWNlU3RyaW5nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgbGV0IHJlbmRlckFzOiBJSFRNTFJlbmRlclR5cGUgPSA8SUhUTUxSZW5kZXJUeXBlPnRoaXMucXVlc3Rpb24ucmVuZGVyQXM7XG4gICAgICAgIGlmKCFTdXJ2ZXlIZWxwZXIuaGFzRG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IEVtcHR5QnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIDAsIDApKV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnYXV0bycpIHJlbmRlckFzID0gdGhpcy5jb250cm9sbGVyLmh0bWxSZW5kZXJBcztcbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnYXV0bycpIHJlbmRlckFzID0gdGhpcy5jaG9vc2VSZW5kZXIoU3VydmV5SGVscGVyLmdldExvY1N0cmluZyh0aGlzLnF1ZXN0aW9uLmxvY0h0bWwpKTtcbiAgICAgICAgY29uc3QgaHRtbDogc3RyaW5nID0gU3VydmV5SGVscGVyLmNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKHRoaXMucXVlc3Rpb24ubG9jSHRtbCksIHRoaXMuY29udHJvbGxlciwgcmVuZGVyQXMpO1xuICAgICAgICBpZiAocmVuZGVyQXMgPT09ICdpbWFnZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICBjb25zdCB7IHVybCwgYXNwZWN0IH06IHsgdXJsOiBzdHJpbmcsIGFzcGVjdDogbnVtYmVyIH0gPVxuICAgICAgICAgICAgYXdhaXQgU3VydmV5SGVscGVyLmh0bWxUb0ltYWdlKGh0bWwsIHdpZHRoLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB3aWR0aCAvIGFzcGVjdDtcbiAgICAgICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6IHVybCwgd2lkdGgsIGhlaWdodCB9KV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtTdXJ2ZXlIZWxwZXIuc3BsaXRIdG1sUmVjdCh0aGlzLmNvbnRyb2xsZXIsIGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVIVE1MRmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMuY29ycmVjdEh0bWwoaHRtbCkpKV07XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdodG1sJywgJ3JlbmRlckFzJyk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdodG1sJywge1xuICAgIG5hbWU6ICdyZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICdzdGFuZGFyZCcsICdpbWFnZSddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2h0bWwnLCBGbGF0SFRNTCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25JbWFnZU1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciwgSVNpemUgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRJbWFnZSBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkltYWdlTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkltYWdlTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2V0Q29ycmVjdEltYWdlU2l6ZSgpOiBQcm9taXNlPElTaXplPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBTdXJ2ZXlIZWxwZXIuZ2V0Q29ycmVjdGVkSW1hZ2VTaXplKHRoaXMuY29udHJvbGxlciwgeyBpbWFnZVdpZHRoOiB0aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGgsIGltYWdlSGVpZ2h0OiB0aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0LCBpbWFnZUxpbms6IHRoaXMucXVlc3Rpb24uaW1hZ2VMaW5rIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgaW1hZ2VTaXplID0gYXdhaXQgdGhpcy5nZXRDb3JyZWN0SW1hZ2VTaXplKCk7XG4gICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbixcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiB0aGlzLnF1ZXN0aW9uLmltYWdlTGluaywgd2lkdGg6IGltYWdlU2l6ZS53aWR0aCwgaGVpZ2h0OiBpbWFnZVNpemUuaGVpZ2h0IH0pXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2ltYWdlJywgRmxhdEltYWdlKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgRmxhdFJhZGlvZ3JvdXAgfSBmcm9tICcuL2ZsYXRfcmFkaW9ncm91cCc7XG5pbXBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRJbWFnZVBpY2tlciBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWw7XG4gICAgcHJvdGVjdGVkIHJhZGlvOiBGbGF0UmFkaW9ncm91cDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRJdGVtKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHBhZ2VBdmFpbGFibGVXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgY29uc3QgaW1hZ2VGbGF0ID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6ICg8YW55Pml0ZW0pLmltYWdlTGluaywgd2lkdGg6IHBhZ2VBdmFpbGFibGVXaWR0aCwgaGVpZ2h0OiBwYWdlQXZhaWxhYmxlV2lkdGggLyBTdXJ2ZXlIZWxwZXIuSU1BR0VQSUNLRVJfUkFUSU8gfSk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGltYWdlRmxhdCk7XG4gICAgICAgIGxldCBidXR0b25Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5zaG93TGFiZWwpIHtcbiAgICAgICAgICAgIGxldCBsYWJlbEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChidXR0b25Qb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLnRleHQgfHwgaXRlbS52YWx1ZSwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sobGFiZWxGbGF0KTtcbiAgICAgICAgICAgIGJ1dHRvblBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGxhYmVsRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgY29uc3QgYnV0dG9uUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChidXR0b25Qb2ludCwgcGFnZUF2YWlsYWJsZVdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5tdWx0aVNlbGVjdCkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhuZXcgQ2hlY2tJdGVtQnJpY2sodGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIGJ1dHRvblJlY3QsIHRoaXMucXVlc3Rpb24uaWQgKyAnaW5kZXgnICsgaW5kZXgsIHsgcmVhZE9ubHk6IHRoaXMucXVlc3Rpb24uaXNSZWFkT25seSB8fCAhaXRlbS5pc0VuYWJsZWQsIHF1ZXN0aW9uOiB0aGlzLnF1ZXN0aW9uLCBpdGVtOiBpdGVtLCBjaGVja2VkOiB0aGlzLnF1ZXN0aW9uLnZhbHVlLmluZGV4T2YoaXRlbS52YWx1ZSkgIT09IC0xLCBpbmRleDogaW5kZXggfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayh0aGlzLnJhZGlvLmdlbmVyYXRlRmxhdEl0ZW0oYnV0dG9uUmVjdCwgaXRlbSwgaW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHRoaXMucmFkaW8gPSB0aGlzLnF1ZXN0aW9uLm11bHRpU2VsZWN0ID8gbnVsbCA6XG4gICAgICAgICAgICBuZXcgRmxhdFJhZGlvZ3JvdXAodGhpcy5zdXJ2ZXksIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtuZXcgQ29tcG9zaXRlQnJpY2soKV07XG4gICAgICAgIGNvbnN0IGNvbFdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0SW1hZ2VQaWNrZXJBdmFpbGFibGVXaWR0aChcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcikgLyBTdXJ2ZXlIZWxwZXIuSU1BR0VQSUNLRVJfQ09VTlQ7XG4gICAgICAgIGxldCBjb2xzOiBudW1iZXIgPSB+fihTdXJ2ZXlIZWxwZXIuXG4gICAgICAgICAgICBnZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAvIGNvbFdpZHRoKSB8fCAxO1xuICAgICAgICBjb25zdCBjb3VudDogbnVtYmVyID0gdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7XG4gICAgICAgIGNvbHMgPSBjb2xzIDw9IGNvdW50ID8gY29scyA6IGNvdW50O1xuICAgICAgICBjb25zdCByb3dzOiBudW1iZXIgPSB+fihNYXRoLmNlaWwoY291bnQgLyBjb2xzKSk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgICAgICAgICAgbGV0IHlCb3Q6IG51bWJlciA9IGN1cnJQb2ludC55VG9wO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICBsZXQgY3Vyck1hcmdpbkxlZnQ6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgY29sczsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXg6IG51bWJlciA9IGkgKiBjb2xzICsgajtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gY291bnQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjdXJyTWFyZ2luTGVmdDtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgY3Vyck1hcmdpbkxlZnQgLSBjb2xXaWR0aDtcbiAgICAgICAgICAgICAgICBjdXJyTWFyZ2luTGVmdCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXNbaW5kZXhdLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgaWYgKGkgIT09IHJvd3MgLSAxKSB7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KGN1cnJQb2ludCwgdGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdpbWFnZXBpY2tlcicsIEZsYXRJbWFnZVBpY2tlcik7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2VwaWNrZXIudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uTWF0cml4TW9kZWwsIE1hdHJpeFJvd01vZGVsLFxuICAgIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsLCBJdGVtVmFsdWUsIFNlcmlhbGl6ZXIgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciwgSVBvaW50LCBJUmVjdCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmFkaW9ncm91cCB9IGZyb20gJy4vZmxhdF9yYWRpb2dyb3VwJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRNYXRyaXggZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgR0FQX0JFVFdFRU5fUk9XUzogbnVtYmVyID0gMC41O1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhNb2RlbDtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgPFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsPnF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbk1hdHJpeE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0c0hlYWRlcihwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBoZWFkZXJzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24uaGFzUm93cykge1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMucm93VGl0bGVXaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gY3VyclBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKz0gKFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAtIHRoaXMuY29sdW1uV2lkdGgpO1xuICAgICAgICAgICAgaGVhZGVycy5wdXNoKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVCb2xkVGV4dEZsYXQoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1uc1tpXS5sb2NUZXh0KSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gdGhpcy5jb2x1bW5XaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9zaXRlQnJpY2s6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmhlYWRlcnMpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUJyaWNrKSwgdGhpcy5jb250cm9sbGVyKV07XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzUm93cyhwb2ludDogSVBvaW50LCBpc1ZlcnRpY2FsOiBib29sZWFuKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleTogc3RyaW5nID0gJ3JvdycgKyBpO1xuICAgICAgICAgICAgY29uc3QgZmxhdHNSb3c6IElQZGZCcmlja1tdID0gYXdhaXQgbmV3IEZsYXRNYXRyaXhSb3codGhpcy5zdXJ2ZXksIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLnZpc2libGVSb3dzW2ldLCBpLCBrZXksIGkgPT0gMCwgaXNWZXJ0aWNhbCwgdGhpcy5yb3dUaXRsZVdpZHRoLCB0aGlzLmNvbHVtbldpZHRoKS5nZW5lcmF0ZUZsYXRzQ29udGVudChjdXJyUG9pbnQpO1xuICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmZsYXRzUm93KSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRNYXRyaXguR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIGNlbGxzLnB1c2goLi4uZmxhdHNSb3cpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG4gICAgcHJpdmF0ZSByb3dUaXRsZVdpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBjb2x1bW5XaWR0aDogbnVtYmVyO1xuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29sdW1uc1dpZHRoZXMoKSB7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICBpZih0aGlzLnF1ZXN0aW9uLmhhc1Jvd3MgJiYgdGhpcy5xdWVzdGlvbi5yb3dUaXRsZVdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIHRoaXMucm93VGl0bGVXaWR0aCA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKHRoaXMucXVlc3Rpb24ucm93VGl0bGVXaWR0aCwgYXZhaWxhYmxlV2lkdGgpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSAodGhpcy5yb3dUaXRsZVdpZHRoICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9DT0xVTU5TKTtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uV2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0Q29sdW1uV2lkdGgodGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zLmxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5XaWR0aCA9IHRoaXMucm93VGl0bGVXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRDb2x1bW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoICsgKHRoaXMucXVlc3Rpb24uaGFzUm93cyA/IDEgOiAwKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQ29sdW1uc1dpZHRoZXMoKTtcbiAgICAgICAgY29uc3QgaXNWZXJ0aWNhbDogYm9vbGVhbiA9IHRoaXMucXVlc3Rpb24ucmVuZGVyQXMgPT09ICdsaXN0JyB8fCB0aGlzLmNvbnRyb2xsZXIubWF0cml4UmVuZGVyQXMgPT09ICdsaXN0JyB8fFxuICAgICAgICAgICAgdGhpcy5jb2x1bW5XaWR0aCA8IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGg7XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBpZiAoIWlzVmVydGljYWwgJiYgdGhpcy5xdWVzdGlvbi5zaG93SGVhZGVyICYmIHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0hlYWRlcihjdXJyUG9pbnQpO1xuICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmhlYWRlcnMpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IEZsYXRNYXRyaXguR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgY2VsbHMucHVzaCguLi5oZWFkZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBjZWxscy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1Jvd3MoY3VyclBvaW50LCBpc1ZlcnRpY2FsKSk7XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4Um93IGV4dGVuZHMgRmxhdFJhZGlvZ3JvdXAge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbk1hdHJpeDogUXVlc3Rpb25NYXRyaXhNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcHJpdmF0ZSByb3c6IE1hdHJpeFJvd01vZGVsLCBwcml2YXRlIHJvd0luZGV4OiBudW1iZXIsXG4gICAgICAgIHByaXZhdGUga2V5OiBzdHJpbmcsIHByb3RlY3RlZCBpc0ZpcnN0OiBib29sZWFuID0gZmFsc2UsIHByb3RlY3RlZCBpc1ZlcnRpY2FsOiBib29sZWFuID0gZmFsc2UsIHByaXZhdGUgcm93VGl0bGVXaWR0aDogbnVtYmVyLCBwcml2YXRlIGNvbHVtbldpZHRoOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb25NYXRyaXggPSA8UXVlc3Rpb25NYXRyaXhNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmVydGljYWwgP1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzVmVydGljYWxseUNlbGxzKHBvaW50KSA6XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNIb3Jpem9udGFsbHlDZWxscyhwb2ludCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZVRleHRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgY29sdW1uOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQ6IGJvb2xlYW4gPSB0aGlzLnJvdy52YWx1ZSA9PSBjb2x1bW4udmFsdWU7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QoY3VyclBvaW50LFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IHJhZGlvRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKGl0ZW1SZWN0LCBjb2x1bW4sIGluZGV4LCB0aGlzLmtleSwgY2hlY2tlZCwgeyByb3c6IHRoaXMucm93LCByb3dJbmRleDogdGhpcy5yb3dJbmRleCB9KTtcbiAgICAgICAgY3VyclBvaW50LnlUb3AgPSByYWRpb0ZsYXQueUJvdCArIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgY2VsbFRleHRGbGF0ID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeCwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbk1hdHJpeC5nZXRDZWxsRGlzcGxheUxvY1RleHQodGhpcy5yb3cubmFtZSwgY29sdW1uKSwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhyYWRpb0ZsYXQsIGNlbGxUZXh0RmxhdCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUl0ZW1Db21wb2lzdGUocG9pbnQ6IElQb2ludCwgY29sdW1uOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQ6IGJvb2xlYW4gPSB0aGlzLnJvdy52YWx1ZSA9PSBjb2x1bW4udmFsdWU7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KGN1cnJQb2ludCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IHJhZGlvRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgaXRlbVJlY3QueExlZnQpLCBjb2x1bW4sIGluZGV4LCB0aGlzLmtleSwgY2hlY2tlZCwgeyByb3c6IHRoaXMucm93LCByb3dJbmRleDogdGhpcy5yb3dJbmRleCB9KTtcbiAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcmFkaW9GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCByYWRpb1RleHQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGNvbHVtbi5sb2NUZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKHJhZGlvRmxhdCwgcmFkaW9UZXh0KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdHNIb3Jpem9udGFsbHlDZWxscyhwb2ludDogSVBvaW50KSB7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc1Jvd3MpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ICs9IChTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLSB0aGlzLnJvd1RpdGxlV2lkdGgpO1xuICAgICAgICAgICAgY2VsbHMucHVzaChhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucm93LmxvY1RleHQsIFRleHRCcmljaykpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMucm93VGl0bGVXaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb25NYXRyaXgudmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbjogSXRlbVZhbHVlID0gdGhpcy5xdWVzdGlvbk1hdHJpeC52aXNpYmxlQ29sdW1uc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrZWQ6IGJvb2xlYW4gPSB0aGlzLnJvdy52YWx1ZSA9PSBjb2x1bW4udmFsdWU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjdXJyUG9pbnQueExlZnQ7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSAoU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpIC0gdGhpcy5jb2x1bW5XaWR0aCk7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNDZWxsVGV4dCkge1xuICAgICAgICAgICAgICAgIGNlbGxzLnB1c2goYXdhaXQgdGhpcy5nZW5lcmF0ZVRleHRDb21wb3NpdGUoY3VyclBvaW50LCBjb2x1bW4sIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KGN1cnJQb2ludCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBjZWxscy5wdXNoKHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgY3VyclBvaW50LnhMZWZ0KSwgY29sdW1uLCBpLCB0aGlzLmtleSwgY2hlY2tlZCwgeyByb3c6IHRoaXMucm93LCByb3dJbmRleDogdGhpcy5yb3dJbmRleCB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gdGhpcy5jb2x1bW5XaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soLi4uY2VsbHMpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUJyaWNrKSwgdGhpcy5jb250cm9sbGVyKV07XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzVmVydGljYWxseUNlbGxzKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc1Jvd3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd1RleHRGbGF0ID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeCxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucm93LmxvY1RleHQsIFRleHRCcmljayk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd1RleHRGbGF0LnlCb3QgKyBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRSAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgY2VsbHMucHVzaChyb3dUZXh0RmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUgPSAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNDZWxsVGV4dCkgPyB0aGlzLmdlbmVyYXRlVGV4dENvbXBvc2l0ZSA6IHRoaXMuZ2VuZXJhdGVJdGVtQ29tcG9pc3RlO1xuICAgICAgICBjZWxscy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVWZXJ0aWNhbGx5SXRlbXMoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LnZpc2libGVDb2x1bW5zKSk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayguLi5jZWxscyk7XG4gICAgICAgIHJldHVybiBbY29tcG9zaXRlQnJpY2ssIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlQnJpY2spLCB0aGlzLmNvbnRyb2xsZXIpXTtcbiAgICB9XG59XG5cblNlcmlhbGl6ZXIucmVtb3ZlUHJvcGVydHkoJ21hdHJpeCcsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnbWF0cml4Jywge1xuICAgIG5hbWU6ICdyZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICdsaXN0J11cbn0pO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignbWF0cml4JywgRmxhdE1hdHJpeCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IEZsYXRNYXRyaXhNdWx0aXBsZSB9IGZyb20gJy4vZmxhdF9tYXRyaXhtdWx0aXBsZSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4RHluYW1pYyBleHRlbmRzIEZsYXRNYXRyaXhNdWx0aXBsZSB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBmYWxzZSk7XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdtYXRyaXhkeW5hbWljJywgJ3JlbmRlckFzJyk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdtYXRyaXhkeW5hbWljJywge1xuICAgIG5hbWU6ICdyZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICdsaXN0J11cbn0pO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignbWF0cml4ZHluYW1pYycsIEZsYXRNYXRyaXhEeW5hbWljKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhkeW5hbWljLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsLCBNdWx0aXBsZVRleHRJdGVtTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uLCBJRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0VGV4dGJveCB9IGZyb20gJy4vZmxhdF90ZXh0Ym94JztcblxuZXhwb3J0IGNsYXNzIEZsYXRNdWx0aXBsZVRleHQgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUk9XU19HQVBfU0NBTEU6IG51bWJlciA9IDAuMTk1O1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFZpc2libGVSb3dzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5nZXRSb3dzKCkuZmlsdGVyKHJvdyA9PiByb3cuaXNWaXNpYmxlKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRJdGVtKHBvaW50OiBJUG9pbnQsIHJvd19pbmRleDogbnVtYmVyLCBjb2xfaW5kZXg6IG51bWJlcixcbiAgICAgICAgaXRlbTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29sV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbFdpZHRoICogU3VydmV5SGVscGVyLk1VTFRJUExFVEVYVF9URVhUX1BFUlM7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5cbiAgICAgICAgICAgIGNyZWF0ZUJvbGRUZXh0RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmxvY1RpdGxlKSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG5cbiAgICAgICAgY29uc3QgZmxhdE11bHRpcGxlVGV4dEl0ZW1RdWVzdGlvbjogSUZsYXRRdWVzdGlvbiA9IEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlKFxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIGl0ZW0uZWRpdG9yLCB0aGlzLmNvbnRyb2xsZXIsICd0ZXh0Jyk7XG4gICAgICAgIGNvbnN0IGl0ZW1Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGaWVsZFJlY3Qoe1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0ICsgY29sV2lkdGggKiBTdXJ2ZXlIZWxwZXIuTVVMVElQTEVURVhUX1RFWFRfUEVSUywgeVRvcDogcG9pbnQueVRvcCB9LFxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKC4uLmF3YWl0ICg8RmxhdFRleHRib3g+ZmxhdE11bHRpcGxlVGV4dEl0ZW1RdWVzdGlvbikuZ2VuZXJhdGVGbGF0c0NvbnRlbnQoaXRlbVBvaW50KSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCByb3dzID0gdGhpcy5nZXRWaXNpYmxlUm93cygpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICAgICAgbGV0IHlCb3Q6IG51bWJlciA9IGN1cnJQb2ludC55VG9wO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgcm93c1tpXS5jZWxscy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDb2x1bW5NYXJnaW5zKHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5jb2xDb3VudCwgaik7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIGksIGosIHJvd3NbaV0uY2VsbHNbal0uaXRlbSk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRNdWx0aXBsZVRleHQuUk9XU19HQVBfU0NBTEU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ211bHRpcGxldGV4dCcsIEZsYXRNdWx0aXBsZVRleHQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X211bHRpcGxldGV4dC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRQYW5lbER5bmFtaWMgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdBUF9CRVRXRUVOX1BBTkVMUzogbnVtYmVyID0gMC43NTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChjb25zdCBwYW5lbCBvZiB0aGlzLnF1ZXN0aW9uLnBhbmVscykge1xuICAgICAgICAgICAgY29uc3QgcGFuZWxGbGF0czogSVBkZkJyaWNrW10gPSBhd2FpdCBGbGF0U3VydmV5LmdlbmVyYXRlRmxhdHNQYW5lbChcbiAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgdGhpcy5jb250cm9sbGVyLCBwYW5lbCwgY3VyclBvaW50KTtcbiAgICAgICAgICAgIGlmIChwYW5lbEZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4ucGFuZWxGbGF0cykueUJvdDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRQYW5lbER5bmFtaWMuR0FQX0JFVFdFRU5fUEFORUxTO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4ucGFuZWxGbGF0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncGFuZWxkeW5hbWljJywgRmxhdFBhbmVsRHluYW1pYyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uUmFua2luZ01vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFJhbmtpbmdJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYW5raW5naXRlbSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IENvbG9yZWRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbG9yZWRicmljayc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UmFua2luZyBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblJhbmtpbmdNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblJhbmtpbmdNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdENvbXBvc2l0ZShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIsIHVucmFua2VkSXRlbTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IGl0ZW1TY2FsZWRSZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5tb3ZlUmVjdChTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KFxuICAgICAgICAgICAgaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgcG9pbnQueExlZnQpO1xuICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gbmV3IFJhbmtpbmdJdGVtQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgaXRlbVNjYWxlZFJlY3QsIHVucmFua2VkSXRlbSA/ICctJyA6IHRoaXMucXVlc3Rpb24uZ2V0TnVtYmVyQnlJbmRleChpbmRleCkpO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCB0ZXh0RmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubG9jVGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhpdGVtRmxhdCwgdGV4dEZsYXQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVDaG9pY2VzQ29sdW1uKHBvaW50OiBJUG9pbnQsIGNob2ljZXM6IEl0ZW1WYWx1ZVtdLCB1bnJhbmtlZENob2ljZXM6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdENvbXBvc2l0ZShjdXJyUG9pbnQsIGNob2ljZXNbaV0sIGksIHVucmFua2VkQ2hvaWNlcyk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGl0ZW1GbGF0LnlCb3QgKyBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgZmxhdHMucHVzaChpdGVtRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVTZWxlY3RUb1JhbmtJdGVtc1ZlcnRpY2FsbHkocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVDaG9pY2VzQ29sdW1uKGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbi5yYW5raW5nQ2hvaWNlcykpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBmbGF0c1tmbGF0cy5sZW5ndGggLSAxXS55Qm90ICsgMiAqIChTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXBhcmF0b3JSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3Qoe1xuICAgICAgICAgICAgeExlZnQ6IGN1cnJQb2ludC54TGVmdCxcbiAgICAgICAgICAgIHlUb3A6IGN1cnJQb2ludC55VG9wIC0gKFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpIC0gMC41LFxuICAgICAgICB9LCB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IC0gY3VyclBvaW50LnhMZWZ0LCAxKTtcbiAgICAgICAgZmxhdHMucHVzaChuZXcgQ29sb3JlZEJyaWNrKHRoaXMuY29udHJvbGxlciwgc2VwYXJhdG9yUmVjdCwgU3VydmV5SGVscGVyLkZPUk1fQk9SREVSX0NPTE9SKSk7XG5cbiAgICAgICAgZmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlQ2hvaWNlc0NvbHVtbihjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb24udW5SYW5raW5nQ2hvaWNlcywgdHJ1ZSkpO1xuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZVNlbGVjdFRvUmFua0l0ZW1zSG9yaXpvbnRhbGx5KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbENvdW50ID0gMjtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3Qgcm93c0NvdW50ID0gTWF0aC5tYXgodGhpcy5xdWVzdGlvbi51blJhbmtpbmdDaG9pY2VzLmxlbmd0aCwgdGhpcy5xdWVzdGlvbi5yYW5raW5nQ2hvaWNlcy5sZW5ndGgpO1xuICAgICAgICBsZXQgcm93OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93c0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjb2xJbmRleCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIFt0aGlzLnF1ZXN0aW9uLnVuUmFua2luZ0Nob2ljZXNbaV0sIHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXNbaV1dKSB7XG4gICAgICAgICAgICAgICAgaWYoISFpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0LCB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDb2x1bW5NYXJnaW5zKHRoaXMuY29udHJvbGxlciwgY29sQ291bnQsIGNvbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBpdGVtLCBpLCBjb2xJbmRleCA9PSAwKTtcbiAgICAgICAgICAgICAgICAgICAgcm93LmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJvd0xpbmVGbGF0OiBJUGRmQnJpY2sgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHJvdyksIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKHJvdywgcm93TGluZUZsYXQpO1xuICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9yUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHtcbiAgICAgICAgICAgICAgICB4TGVmdDogdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAvIDIgLSAwLjUsXG4gICAgICAgICAgICAgICAgeVRvcDogY3VyclBvaW50LnlUb3AsXG4gICAgICAgICAgICB9LCAwLCAwKTtcbiAgICAgICAgICAgIHJvdy5hZGRCcmljayhuZXcgQ29sb3JlZEJyaWNrKHRoaXMuY29udHJvbGxlciwgc2VwYXJhdG9yUmVjdCwgU3VydmV5SGVscGVyLkZPUk1fQk9SREVSX0NPTE9SLCAxLCByb3dMaW5lRmxhdC55Qm90IC0gY3VyclBvaW50LnlUb3AgKyAoaSAhPT0gcm93c0NvdW50IC0gMSA/XG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCA6IDApKSk7XG5cbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gcm93TGluZUZsYXQueUJvdCArXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIHJvdyA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmKCF0aGlzLnF1ZXN0aW9uLnNlbGVjdFRvUmFua0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ2hvaWNlc0NvbHVtbihwb2ludCwgdGhpcy5xdWVzdGlvbi5yYW5raW5nQ2hvaWNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZih0aGlzLnF1ZXN0aW9uLnNlbGVjdFRvUmFua0FyZWFzTGF5b3V0ID09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2VsZWN0VG9SYW5rSXRlbXNWZXJ0aWNhbGx5KHBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2VsZWN0VG9SYW5rSXRlbXNIb3Jpem9udGFsbHkocG9pbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdyYW5raW5nJywgRmxhdFJhbmtpbmcpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25SYXRpbmdNb2RlbCwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdFJhdGluZyBleHRlbmRzIEZsYXRSYWRpb2dyb3VwIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb25SYXRpbmc6IFF1ZXN0aW9uUmF0aW5nTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcgPSA8UXVlc3Rpb25SYXRpbmdNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdEhvcmlzb250YWxDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgaXRlbVRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gU3VydmV5SGVscGVyLmdldFJhdGluZ0l0ZW1UZXh0KFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZywgaW5kZXgsIGl0ZW0ubG9jVGV4dCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICBjb25zdCBoYWxmV2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggLyAyLjA7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gaGFsZldpZHRoO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSBoYWxmV2lkdGg7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ICs9IGhhbGZXaWR0aDtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLlxuICAgICAgICAgICAgY3JlYXRlQm9sZFRleHRGbGF0KHRleHRQb2ludCwgdGhpcy5xdWVzdGlvblJhdGluZywgdGhpcy5jb250cm9sbGVyLCBpdGVtVGV4dCkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICBsZXQgdGV4dFdpZHRoOiBudW1iZXIgPSBjb21wb3NpdGVGbGF0LndpZHRoO1xuICAgICAgICBpZiAodGV4dFdpZHRoIDwgU3VydmV5SGVscGVyLmdldFJhdGluZ01pbldpZHRoKHRoaXMuY29udHJvbGxlcikpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQueExlZnQgKz0gKFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aChcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIpIC0gdGV4dFdpZHRoKSAvIDIuMCAtIGhhbGZXaWR0aDtcbiAgICAgICAgICAgIHRleHRXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGV4dFdpZHRoICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmFkaW9Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICByYWRpb1BvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sodGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KFxuICAgICAgICAgICAgcmFkaW9Qb2ludCwgdGV4dFdpZHRoLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCksIGl0ZW0sIGluZGV4LCB1bmRlZmluZWQsIHRoaXMucXVlc3Rpb24udmFsdWUgPT0gaXRlbS52YWx1ZSkpO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdENvbXBvc2l0ZShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChpdGVtUmVjdCwgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLFxuICAgICAgICAgICAgcG9pbnQueExlZnQpLCBpdGVtLCBpbmRleCwgdW5kZWZpbmVkLCB0aGlzLnF1ZXN0aW9uLnZhbHVlID09IGl0ZW0udmFsdWUpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgaXRlbVRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gU3VydmV5SGVscGVyLmdldFJhdGluZ0l0ZW1UZXh0KHRoaXMucXVlc3Rpb25SYXRpbmcsIGluZGV4LCBpdGVtLmxvY1RleHQpO1xuICAgICAgICBpdGVtVGV4dCA9PSBudWxsIHx8IGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW1UZXh0LCBUZXh0QnJpY2spKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUhvcmlzb250YWxseUl0ZW1zKHBvaW50OiBJUG9pbnQpIHtcbiAgICAgICAgY29uc3Qgcm93c0ZsYXRzOiBDb21wb3NpdGVCcmlja1tdID0gW25ldyBDb21wb3NpdGVCcmljaygpXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SG9yaXNvbnRhbENvbXBvc2l0ZShjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlc1tpXSwgaSk7XG4gICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRXaWR0aDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IC0gaXRlbUZsYXQueFJpZ2h0O1xuICAgICAgICAgICAgaWYgKFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIpIDw9IGxlZnRXaWR0aCArIFN1cnZleUhlbHBlci5FUFNJTE9OKSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBpdGVtRmxhdC55Qm90O1xuICAgICAgICAgICAgICAgIGlmIChpICE9PSB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93c0ZsYXRzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgbGV0IGlzVmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1UZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdJdGVtVGV4dChcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uUmF0aW5nLCBpLCB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzW2ldLmxvY1RleHQpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChpdGVtVGV4dCkud2lkdGggPiB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLlJBVElOR19DT0xVTU5fV0lEVEgpLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgaXNWZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzVmVydGljYWwgPyB0aGlzLmdlbmVyYXRlVmVydGljYWxseUl0ZW1zKHBvaW50LCB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzKSA6IHRoaXMuZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludCk7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdyYXRpbmcnLCBGbGF0UmF0aW5nKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYXRpbmcudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyLCBJUmVjdCwgSVNpemUgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgSUJvcmRlckRlc2NyaXB0aW9uLCBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IEVtcHR5QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9lbXB0eSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0U2lnbmF0dXJlUGFkIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWw7XG4gICAgcHVibGljIHN0YXRpYyBCT1JERVJfU1RZTEU6ICdkYXNoZWQnIHwgJ3NvbGlkJyB8ICdub25lJyA9ICdkYXNoZWQnO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVCYWNrZ3JvdW5kSW1hZ2UocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHsgbGluazogdGhpcy5xdWVzdGlvbi5iYWNrZ3JvdW5kSW1hZ2UsIHdpZHRoOiBTdXJ2ZXlIZWxwZXIucHhUb1B0KDxhbnk+dGhpcy5xdWVzdGlvbi5zaWduYXR1cmVXaWR0aCksIGhlaWdodDogU3VydmV5SGVscGVyLnB4VG9QdCg8YW55PnRoaXMucXVlc3Rpb24uc2lnbmF0dXJlSGVpZ2h0KSwgb2JqZWN0Rml0OiAnY292ZXInIH0sIHRydWUpO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFNpZ25JbWFnZVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uc3RvcmVEYXRhQXNUZXh0IHx8ICF0aGlzLnF1ZXN0aW9uLmxvYWRlZERhdGEgPyB0aGlzLnF1ZXN0aW9uLnZhbHVlIDogdGhpcy5xdWVzdGlvbi5sb2FkZWREYXRhO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVTaWduKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCB3aWR0aCA9IFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLnNpZ25hdHVyZVdpZHRoKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gU3VydmV5SGVscGVyLnB4VG9QdCg8YW55PnRoaXMucXVlc3Rpb24uc2lnbmF0dXJlSGVpZ2h0KTtcbiAgICAgICAgbGV0IGJyaWNrOiBQZGZCcmljaztcbiAgICAgICAgaWYodGhpcy5xdWVzdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgYnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KHBvaW50LFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiB0aGlzLmdldFNpZ25JbWFnZVVybCgpLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0IH0sIGZhbHNlXG4gICAgICAgICAgICApIGFzIFBkZkJyaWNrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJpY2sgPSBuZXcgRW1wdHlCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCwgd2lkdGgsIGhlaWdodCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmKEZsYXRTaWduYXR1cmVQYWQuQk9SREVSX1NUWUxFICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGJyaWNrLmFmdGVyUmVuZGVyQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9yZGVyT3B0aW9uczogSUJvcmRlckRlc2NyaXB0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGJyaWNrLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogYnJpY2sud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHlUb3A6IGJyaWNrLnlUb3AsXG4gICAgICAgICAgICAgICAgICAgIHlCb3Q6IGJyaWNrLnlCb3QsXG4gICAgICAgICAgICAgICAgICAgIHhMZWZ0OiBicmljay54TGVmdCxcbiAgICAgICAgICAgICAgICAgICAgeFJpZ2h0OiBicmljay54UmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Cb3JkZXJDb2xvcjogYnJpY2suZm9ybUJvcmRlckNvbG9yLFxuICAgICAgICAgICAgICAgICAgICByb3VuZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgb3V0c2lkZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZGFzaFN0eWxlOiBGbGF0U2lnbmF0dXJlUGFkLkJPUkRFUl9TVFlMRSA9PSAnZGFzaGVkJyA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hBcnJheTogWzVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGFzaFBoYXNlOiAwXG4gICAgICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIGJvcmRlck9wdGlvbnMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBicmljaztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgaWYodGhpcy5xdWVzdGlvbi5iYWNrZ3JvdW5kSW1hZ2UpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUJyaWNrLmFkZEJyaWNrKGF3YWl0IHRoaXMuZ2VuZXJhdGVCYWNrZ3JvdW5kSW1hZ2UocG9pbnQpKTtcbiAgICAgICAgfVxuICAgICAgICBjb21wb3NpdGVCcmljay5hZGRCcmljayhhd2FpdCB0aGlzLmdlbmVyYXRlU2lnbihwb2ludCkpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3NpZ25hdHVyZXBhZCcsIEZsYXRTaWduYXR1cmVQYWQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCb3hCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRib3gnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0VGV4dGJveCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBNVUxUSUxJTkVfVEVYVF9ST1dTX0NPVU5UOiBudW1iZXIgPSAxO1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICghdGhpcy5zaG91bGRSZW5kZXJBc0NvbW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGaWVsZFJlY3QocG9pbnQsIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBUZXh0Qm94QnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCByZWN0KV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHRydWUsIHsgcm93czogRmxhdFRleHRib3guTVVMVElMSU5FX1RFWFRfUk9XU19DT1VOVCB9KV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCd0ZXh0JywgRmxhdFRleHRib3gpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3RleHRib3gudHMiLCJpbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIsIElSZWN0IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG5cbiAgICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBwcml2YXRlIHJlbmRlckZ1bmM6IChkb2M6IGFueSwgcXVlc3Rpb246IGFueSwgeExlZnQ6IG51bWJlciwgeVRvcDogbnVtYmVyKSA9PiBJUmVjdCkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVuZGVyRnVuYyhjb250cm9sbGVyLmhlbHBlckRvYywgcXVlc3Rpb24sIDAsIDApKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJGdW5jKHRoaXMuY29udHJvbGxlci5kb2MsIHRoaXMucXVlc3Rpb24sIHRoaXMueExlZnQsIHRoaXMueVRvcCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY3VzdG9tLnRzIiwiaW1wb3J0IHsgU3VydmV5TW9kZWwsIFF1ZXN0aW9uLCBFdmVudEJhc2UgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgKiBhcyBTdXJ2ZXlDb3JlIGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElEb2NPcHRpb25zLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X3N1cnZleSc7XG5pbXBvcnQgeyBQYWdlUGFja2VyIH0gZnJvbSAnLi9wYWdlX2xheW91dC9wYWdlX3BhY2tlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IEV2ZW50QXN5bmMsIEV2ZW50SGFuZGxlciB9IGZyb20gJy4vZXZlbnRfaGFuZGxlci9ldmVudF9oYW5kbGVyJztcbmltcG9ydCB7IERyYXdDYW52YXMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMnO1xuaW1wb3J0IHsgQWRvcm5lcnNPcHRpb25zLCBBZG9ybmVyc1BhbmVsT3B0aW9ucywgQWRvcm5lcnNQYWdlT3B0aW9ucyB9IGZyb20gJy4vZXZlbnRfaGFuZGxlci9hZG9ybmVycyc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuL2hlbHBlcl9zdXJ2ZXknO1xuXG4vKipcbiAqIFRoZSBgU3VydmV5UERGYCBvYmplY3QgZW5hYmxlcyB5b3UgdG8gZXhwb3J0IHlvdXIgc3VydmV5cyBhbmQgZm9ybXMgdG8gUERGIGRvY3VtZW50cy5cbiAqXG4gKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvIChsaW5rU3R5bGUpKVxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5UERGIGV4dGVuZHMgU3VydmV5TW9kZWwge1xuICAgIHByaXZhdGUgc3RhdGljIGN1cnJlbnRseVNhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgc3RhdGljIHNhdmVRdWV1ZTogYW55W10gPSBbXTtcbiAgICBwdWJsaWMgb3B0aW9uczogSURvY09wdGlvbnM7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGpzb25PYmplY3Q6IGFueSwgb3B0aW9ucz86IElEb2NPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGpzb25PYmplY3QpO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zID0gU3VydmV5SGVscGVyLmNsb25lKG9wdGlvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhhdmVDb21tZXJjaWFsTGljZW5zZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZiA9IFN1cnZleUNvcmUuaGFzTGljZW5zZTtcbiAgICAgICAgcmV0dXJuICEhZiAmJiBmKDIpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGhhdmVDb21tZXJjaWFsTGljZW5zZSh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5lcnJvcignQXMgb2YgdjEuOS4xMDEsIHRoZSBoYXZlQ29tbWVyY2lhbExpY2Vuc2UgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZC4gVG8gYWN0aXZhdGUgeW91ciBsaWNlbnNlLCB1c2UgdGhlIHNldExpY2Vuc2VLZXkoa2V5KSBtZXRob2QgYXMgc2hvd24gb24gdGhlIGZvbGxvd2luZyBwYWdlOiBodHRwczovL3N1cnZleWpzLmlvL3JlbW92ZS1hbGVydC1iYW5uZXInKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBTdXJ2ZXlKUyBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBwYWdlIGhlYWRlci4gSGFuZGxlIHRoaXMgZXZlbnQgdG8gY3VzdG9taXplIHRoZSBoZWFkZXIuXG4gICAgICpcbiAgICAgKiBQYXJhbWV0ZXJzOlxuICAgICAqXG4gICAgICogLSBgc2VuZGVyYDogYFN1cnZleVBERmBcXFxuICAgICAqIEEgU3VydmV5UERGIGluc3RhbmNlIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICAgKlxuICAgICAqIC0gYGNhbnZhc2A6IFtgRHJhd0NhbnZhc2BdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvZHJhd2NhbnZhcylcXFxuICAgICAqIEFuIG9iamVjdCB0aGF0IHlvdSBjYW4gdXNlIHRvIGRyYXcgdGV4dCBhbmQgaW1hZ2VzIGluIHRoZSBwYWdlIGhlYWRlci5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jdXN0b21pemUtaGVhZGVyLWFuZC1mb290ZXItb2YtcGRmLWZvcm0vIChsaW5rU3R5bGUpKVxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbmRlckhlYWRlcjogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIERyYXdDYW52YXM+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBEcmF3Q2FudmFzPigpO1xuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gU3VydmV5SlMgUERGIEdlbmVyYXRvciByZW5kZXJzIGEgcGFnZSBmb290ZXIuIEhhbmRsZSB0aGlzIGV2ZW50IHRvIGN1c3RvbWl6ZSB0aGUgZm9vdGVyLlxuICAgICAqXG4gICAgICogUGFyYW1ldGVyczpcbiAgICAgKlxuICAgICAqIC0gYHNlbmRlcmA6IGBTdXJ2ZXlQREZgXFxcbiAgICAgKiBBIFN1cnZleVBERiBpbnN0YW5jZSB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICpcbiAgICAgKiAtIGBjYW52YXNgOiBbYERyYXdDYW52YXNgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2RyYXdjYW52YXMpXFxcbiAgICAgKiBBbiBvYmplY3QgdGhhdCB5b3UgY2FuIHVzZSB0byBkcmF3IHRleHQgYW5kIGltYWdlcyBpbiB0aGUgcGFnZSBmb290ZXIuXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvY3VzdG9taXplLWhlYWRlci1hbmQtZm9vdGVyLW9mLXBkZi1mb3JtLyAobGlua1N0eWxlKSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJGb290ZXI6IEV2ZW50QXN5bmM8U3VydmV5UERGLCBEcmF3Q2FudmFzPiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgRHJhd0NhbnZhcz4oKTtcbiAgICAvKipcbiAgICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIFN1cnZleUpTIFBERiBHZW5lcmF0b3IgcmVuZGVycyBhIHN1cnZleSBxdWVzdGlvbi4gSGFuZGxlIHRoaXMgZXZlbnQgdG8gY3VzdG9taXplIHF1ZXN0aW9uIHJlbmRlcmluZy5cbiAgICAgKlxuICAgICAqIFBhcmFtZXRlcnM6XG4gICAgICpcbiAgICAgKiAtIGBzZW5kZXJgOiBgU3VydmV5UERGYFxcXG4gICAgICogQSBTdXJ2ZXlQREYgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5xdWVzdGlvbmA6IFtgUXVlc3Rpb25gXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24pXFxcbiAgICAgKiBBIHN1cnZleSBxdWVzdGlvbiB0aGF0IGlzIGJlaW5nIHJlbmRlcmVkLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5wb2ludGA6IGBJUG9pbnRgXFxcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50IGJlaW5nIHJlbmRlcmVkLiBUaGlzIG9iamVjdCBjb250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6IGB7IHhMZWZ0OiBudW1iZXIsIHlUb3A6IG51bWJlciB9YC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuYnJpY2tzYDogW2BQZGZCcmlja1tdYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9wZGZicmljaylcXFxuICAgICAqIEFuIGFycmF5IG9mIFticmlja3NdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2N1c3RvbWl6ZS1zdXJ2ZXktcXVlc3Rpb24tcmVuZGVyaW5nLWluLXBkZi1mb3JtI2N1c3RvbS1yZW5kZXJpbmcpIHVzZWQgdG8gcmVuZGVyIHRoZSBlbGVtZW50LlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5jb250cm9sbGVyYDogW2BEb2NDb250cm9sbGVyYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9kb2Njb250cm9sbGVyKVxcXG4gICAgICogQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIG1haW4gUERGIGRvY3VtZW50IHByb3BlcnRpZXMgKGZvbnQsIG1hcmdpbnMsIHBhZ2Ugd2lkdGggYW5kIGhlaWdodCkgYW5kIGFsbG93cyB5b3UgdG8gbW9kaWZ5IHRoZW0uXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnJlcG9zaXRvcnlgOiBgRmxhdFJlcG9zaXRvcnlgXFxcbiAgICAgKiBBIHJlcG9zaXRvcnkgd2l0aCBjbGFzc2VzIHRoYXQgcmVuZGVyIGVsZW1lbnRzIHRvIFBERi4gVXNlIGl0cyBgY3JlYXRlYCBtZXRob2QgaWYgeW91IG5lZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgcmVuZGVyaW5nIGNsYXNzLlxuICAgICAqXG4gICAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2hvdy10by11c2UtYWRvcm5lcnMtaW4tcGRmLWZvcm1zLyAobGlua1N0eWxlKSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJRdWVzdGlvbjogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzT3B0aW9ucz4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzT3B0aW9ucz4oKTtcbiAgICAvKipcbiAgICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIFN1cnZleUpTIFBERiBHZW5lcmF0b3IgcmVuZGVycyBhIHBhbmVsLiBIYW5kbGUgdGhpcyBldmVudCB0byBjdXN0b21pemUgcGFuZWwgcmVuZGVyaW5nLlxuICAgICAqXG4gICAgICogUGFyYW1ldGVyczpcbiAgICAgKlxuICAgICAqIC0gYHNlbmRlcmA6IGBTdXJ2ZXlQREZgXFxcbiAgICAgKiBBIFN1cnZleVBERiBpbnN0YW5jZSB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnBhbmVsYDogW2BQYW5lbE1vZGVsYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3BhbmVsLW1vZGVsKVxcXG4gICAgICogQSBwYW5lbCB0aGF0IGlzIGJlaW5nIHJlbmRlcmVkLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5wb2ludGA6IGBJUG9pbnRgXFxcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50IGJlaW5nIHJlbmRlcmVkLiBUaGlzIG9iamVjdCBjb250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6IGB7IHhMZWZ0OiBudW1iZXIsIHlUb3A6IG51bWJlciB9YC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuYnJpY2tzYDogW2BQZGZCcmlja1tdYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9wZGZicmljaylcXFxuICAgICAqIEFuIGFycmF5IG9mIFticmlja3NdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2N1c3RvbWl6ZS1zdXJ2ZXktcXVlc3Rpb24tcmVuZGVyaW5nLWluLXBkZi1mb3JtI2N1c3RvbS1yZW5kZXJpbmcpIHVzZWQgdG8gcmVuZGVyIHRoZSBlbGVtZW50LlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5jb250cm9sbGVyYDogW2BEb2NDb250cm9sbGVyYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9kb2Njb250cm9sbGVyKVxcXG4gICAgICogQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIG1haW4gUERGIGRvY3VtZW50IHByb3BlcnRpZXMgKGZvbnQsIG1hcmdpbnMsIHBhZ2Ugd2lkdGggYW5kIGhlaWdodCkgYW5kIGFsbG93cyB5b3UgdG8gbW9kaWZ5IHRoZW0uXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnJlcG9zaXRvcnlgOiBgRmxhdFJlcG9zaXRvcnlgXFxcbiAgICAgKiBBIHJlcG9zaXRvcnkgd2l0aCBjbGFzc2VzIHRoYXQgcmVuZGVyIGVsZW1lbnRzIHRvIFBERi4gVXNlIGl0cyBgY3JlYXRlYCBtZXRob2QgaWYgeW91IG5lZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgcmVuZGVyaW5nIGNsYXNzLlxuICAgICAqXG4gICAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2hvdy10by11c2UtYWRvcm5lcnMtaW4tcGRmLWZvcm1zLyAobGlua1N0eWxlKSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJQYW5lbDogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzUGFuZWxPcHRpb25zPiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgQWRvcm5lcnNQYW5lbE9wdGlvbnM+KCk7XG4gICAgLyoqXG4gICAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBTdXJ2ZXlKUyBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBwYWdlLiBIYW5kbGUgdGhpcyBldmVudCB0byBjdXN0b21pemUgcGFnZSByZW5kZXJpbmcuXG4gICAgICpcbiAgICAgKiBQYXJhbWV0ZXJzOlxuICAgICAqXG4gICAgICogLSBgc2VuZGVyYDogYFN1cnZleVBERmBcXFxuICAgICAqIEEgU3VydmV5UERGIGluc3RhbmNlIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucGFnZWA6IFtgUGFnZU1vZGVsYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3BhZ2UtbW9kZWwpXFxcbiAgICAgKiBBIHBhZ2UgdGhhdCBpcyBiZWluZyByZW5kZXJlZC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucG9pbnRgOiBgSVBvaW50YFxcXG4gICAgICogQW4gb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudCBiZWluZyByZW5kZXJlZC4gVGhpcyBvYmplY3QgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOiBgeyB4TGVmdDogbnVtYmVyLCB5VG9wOiBudW1iZXIgfWAuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLmJyaWNrc2A6IFtgUGRmQnJpY2tbXWBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcGRmYnJpY2spXFxcbiAgICAgKiBBbiBhcnJheSBvZiBbYnJpY2tzXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9jdXN0b21pemUtc3VydmV5LXF1ZXN0aW9uLXJlbmRlcmluZy1pbi1wZGYtZm9ybSNjdXN0b20tcmVuZGVyaW5nKSB1c2VkIHRvIHJlbmRlciB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuY29udHJvbGxlcmA6IFtgRG9jQ29udHJvbGxlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvZG9jY29udHJvbGxlcilcXFxuICAgICAqIEFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBtYWluIFBERiBkb2N1bWVudCBwcm9wZXJ0aWVzIChmb250LCBtYXJnaW5zLCBwYWdlIHdpZHRoIGFuZCBoZWlnaHQpIGFuZCBhbGxvd3MgeW91IHRvIG1vZGlmeSB0aGVtLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5yZXBvc2l0b3J5YDogYEZsYXRSZXBvc2l0b3J5YFxcXG4gICAgICogQSByZXBvc2l0b3J5IHdpdGggY2xhc3NlcyB0aGF0IHJlbmRlciBlbGVtZW50cyB0byBQREYuIFVzZSBpdHMgYGNyZWF0ZWAgbWV0aG9kIGlmIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIHJlbmRlcmluZyBjbGFzcy5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9ob3ctdG8tdXNlLWFkb3JuZXJzLWluLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyUGFnZTogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzUGFnZU9wdGlvbnM+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc1BhZ2VPcHRpb25zPigpO1xuXG4gICAgcHVibGljIG9uRG9jQ29udHJvbGxlckNyZWF0ZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlQREYsIHsgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciB9PiA9IG5ldyBFdmVudEJhc2U8U3VydmV5UERGLCB7Y29udHJvbGxlcjogRG9jQ29udHJvbGxlcn0+KCk7XG5cbiAgICBwdWJsaWMgb25SZW5kZXJDaGVja0l0ZW1BY3JvZm9ybTogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIGFueT4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIGFueT4oKTtcblxuICAgIHB1YmxpYyBvblJlbmRlclJhZGlvR3JvdXBXcmFwQWNyb2Zvcm06IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+ID1cbiAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIGFueT4oKTtcblxuICAgIHB1YmxpYyBvblJlbmRlclJhZGlvSXRlbUFjcm9mb3JtOiBFdmVudEFzeW5jPFN1cnZleVBERiwgYW55PiA9XG4gICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+KCk7XG5cbiAgICBwcml2YXRlIHdhaXRGb3JRdWVzdGlvbklzUmVhZHkocXVlc3Rpb246IFF1ZXN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocXVlc3Rpb24uaXNSZWFkeSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWR5Q2FsbGJhY2s6IChzZW5kZXI6IFF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpID0+IHZvaWQgPVxuICAgICAgICAgICAgICAgIChfLCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaXNSZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24ub25SZWFkeUNoYW5nZWQucmVtb3ZlKHJlYWR5Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi5vblJlYWR5Q2hhbmdlZC5hZGQocmVhZHlDYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIHdhaXRGb3JDb3JlSXNSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiB0aGlzLmdldEFsbFF1ZXN0aW9ucygpKSB7XG4gICAgICAgICAgICBpZiAoISEoPGFueT5xdWVzdGlvbikuY29udGVudFBhbmVsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdDogUXVlc3Rpb25bXSA9IFtdO1xuICAgICAgICAgICAgICAgICg8YW55PnF1ZXN0aW9uKS5jb250ZW50UGFuZWwuYWRkUXVlc3Rpb25zVG9MaXN0KGxpc3QpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW5uZXJRdWVzdGlvbiBvZiBsaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclF1ZXN0aW9uSXNSZWFkeShpbm5lclF1ZXN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGF3YWl0IHRoaXMud2FpdEZvclF1ZXN0aW9uSXNSZWFkeShcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZ2V0Q29udGVudFF1ZXN0aW9uKDxRdWVzdGlvbj5xdWVzdGlvbikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBnZXRVcGRhdGVkQ2hlY2tJdGVtQWNyb2Zvcm1PcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uUmVuZGVyQ2hlY2tJdGVtQWNyb2Zvcm0uZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcHVibGljIGdldFVwZGF0ZWRSYWRpb0dyb3VwV3JhcE9wdGlvbnMob3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25SZW5kZXJSYWRpb0dyb3VwV3JhcEFjcm9mb3JtLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRVcGRhdGVkUmFkaW9JdGVtQWNyb2Zvcm1PcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uUmVuZGVyUmFkaW9JdGVtQWNyb2Zvcm0uZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBjb3JyZWN0QnJpY2tzUG9zaXRpb24oY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZmxhdHM6IElQZGZCcmlja1tdW10pIHtcbiAgICAgICAgaWYoY29udHJvbGxlci5pc1JUTCkge1xuICAgICAgICAgICAgZmxhdHMuZm9yRWFjaChmbGF0c0FyciA9PiB7XG4gICAgICAgICAgICAgICAgZmxhdHNBcnIuZm9yRWFjaChmbGF0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmxhdC50cmFuc2xhdGVYKCh4TGVmdDogbnVtYmVyLCB4UmlnaHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hpZnRXaWR0aCA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHhMZWZ0IC0geFJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgeExlZnQ6IHhMZWZ0ICsgc2hpZnRXaWR0aCwgeFJpZ2h0OiB4UmlnaHQgKyBzaGlmdFdpZHRoIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIHJlbmRlclN1cnZleShjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMudmlzaWJsZVBhZ2VzLmZvckVhY2gocGFnZSA9PiBwYWdlLm9uRmlyc3RSZW5kZXJpbmcoKSk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckNvcmVJc1JlYWR5KCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXVtdID0gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzKHRoaXMsIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLmNvcnJlY3RCcmlja3NQb3NpdGlvbihjb250cm9sbGVyLCBmbGF0cyk7XG4gICAgICAgIGNvbnN0IHBhY2tzOiBJUGRmQnJpY2tbXVtdID0gUGFnZVBhY2tlci5wYWNrKGZsYXRzLCBjb250cm9sbGVyKTtcbiAgICAgICAgYXdhaXQgRXZlbnRIYW5kbGVyLnByb2Nlc3NfaGVhZGVyX2V2ZW50cyh0aGlzLCBjb250cm9sbGVyLCBwYWNrcyk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHBhY2tzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuZ2V0TnVtYmVyT2ZQYWdlcygpID09PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnNldFBhZ2UoaSk7XG4gICAgICAgICAgICAgICAgLy9naXptb3MgYnJpY2tzIGJvcmRlcnMgZm9yIGRlYnVnXG4gICAgICAgICAgICAgICAgLy8gcGFja3NbaV1bal0udW5mb2xkKCkuZm9yRWFjaCgocmVjdDogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcignZ3JlZW4nKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29udHJvbGxlci5kb2MucmVjdCguLi5TdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KHJlY3QpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKCdibGFjaycpO1xuICAgICAgICAgICAgICAgIC8vICAgfVxuICAgICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFja3NbaV1bal0ucmVuZGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYXN5bmNocm9ub3VzIG1ldGhvZCB0aGF0IHN0YXJ0cyBkb3dubG9hZCBvZiB0aGUgZ2VuZXJhdGVkIFBERiBmaWxlIGluIHRoZSB3ZWIgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlTmFtZSAqKE9wdGlvbmFsKSogQSBmaWxlIG5hbWUgd2l0aCB0aGUgXCIucGRmXCIgZXh0ZW5zaW9uLiBEZWZhdWx0IHZhbHVlOiBgXCJzdXJ2ZXlfcmVzdWx0LnBkZlwiYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2F2ZShmaWxlTmFtZTogc3RyaW5nID0gJ3N1cnZleV9yZXN1bHQucGRmJyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGlmKCFTdXJ2ZXlQREYuY3VycmVudGx5U2F2aW5nKSB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyID0gbmV3IERvY0NvbnRyb2xsZXIodGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMub25Eb2NDb250cm9sbGVyQ3JlYXRlZC5maXJlKHRoaXMsIHsgY29udHJvbGxlcjogY29udHJvbGxlciB9KTtcbiAgICAgICAgICAgIFN1cnZleVBERi5jdXJyZW50bHlTYXZpbmcgPSB0cnVlO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLmZpeEZvbnQoY29udHJvbGxlcik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclN1cnZleShjb250cm9sbGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSBjb250cm9sbGVyLmRvYy5zYXZlKGZpbGVOYW1lLCB7IHJldHVyblByb21pc2U6IHRydWUgfSk7XG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIFN1cnZleVBERi5jdXJyZW50bHlTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBzYXZlRnVuYyA9IFN1cnZleVBERi5zYXZlUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZighIXNhdmVGdW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhdmVGdW5jKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFN1cnZleVBERi5zYXZlUXVldWUucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlKGZpbGVOYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGFzeW5jaHJvbm91cyBtZXRob2QgdGhhdCBhbGxvd3MgeW91IHRvIGdldCBQREYgY29udGVudCBpbiBkaWZmZXJlbnQgZm9ybWF0cy5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jb252ZXJ0LXBkZi1mb3JtLWJsb2ItYmFzZTY0LXJhdy1wZGYtamF2YXNjcmlwdC8gKGxpbmtTdHlsZSkpXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSAqKE9wdGlvbmFsKSogT25lIG9mIGBcImJsb2JcImAsIGBcImJsb2J1cmxcImAsIGBcImRhdGF1cmxzdHJpbmdcImAuIERvIG5vdCBzcGVjaWZ5IHRoaXMgcGFyYW1ldGVyIGlmIHlvdSB3YW50IHRvIGdldCByYXcgUERGIGNvbnRlbnQgYXMgYSBzdHJpbmcgdmFsdWUuXG4gICAgICpcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmF3KHR5cGU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyID0gbmV3IERvY0NvbnRyb2xsZXIodGhpcy5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5vbkRvY0NvbnRyb2xsZXJDcmVhdGVkLmZpcmUodGhpcywgeyBjb250cm9sbGVyOiBjb250cm9sbGVyIH0pO1xuICAgICAgICBTdXJ2ZXlIZWxwZXIuZml4Rm9udChjb250cm9sbGVyKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJTdXJ2ZXkoY29udHJvbGxlcik7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRvYy5vdXRwdXQodHlwZSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N1cnZleS50cyIsIlwidXNlIHN0cmljdFwiO1xyXG4vLyBBbiBhdWdtZW50ZWQgQVZMIFRyZWUgd2hlcmUgZWFjaCBub2RlIG1haW50YWlucyBhIGxpc3Qgb2YgcmVjb3JkcyBhbmQgdGhlaXIgc2VhcmNoIGludGVydmFscy5cclxuLy8gUmVjb3JkIGlzIGNvbXBvc2VkIG9mIGFuIGludGVydmFsIGFuZCBpdHMgdW5kZXJseWluZyBkYXRhLCBzZW50IGJ5IGEgY2xpZW50LiBUaGlzIGFsbG93cyB0aGVcclxuLy8gaW50ZXJ2YWwgdHJlZSB0byBoYXZlIHRoZSBzYW1lIGludGVydmFsIGluc2VydGVkIG11bHRpcGxlIHRpbWVzLCBhcyBsb25nIGl0cyBkYXRhIGlzIGRpZmZlcmVudC5cclxuLy8gQm90aCBpbnNlcnRpb24gYW5kIGRlbGV0aW9uIHJlcXVpcmUgTyhsb2cgbikgdGltZS4gU2VhcmNoaW5nIHJlcXVpcmVzIE8oaypsb2duKSB0aW1lLCB3aGVyZSBga2BcclxuLy8gaXMgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMgaW4gdGhlIG91dHB1dCBsaXN0LlxyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciBpc1NhbWUgPSByZXF1aXJlKFwic2hhbGxvd2VxdWFsXCIpO1xyXG5mdW5jdGlvbiBoZWlnaHQobm9kZSkge1xyXG4gICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBub2RlLmhlaWdodDtcclxuICAgIH1cclxufVxyXG52YXIgTm9kZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIE5vZGUoaW50ZXJ2YWxUcmVlLCByZWNvcmQpIHtcclxuICAgICAgICB0aGlzLmludGVydmFsVHJlZSA9IGludGVydmFsVHJlZTtcclxuICAgICAgICB0aGlzLnJlY29yZHMgPSBbXTtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XHJcbiAgICAgICAgdGhpcy5rZXkgPSByZWNvcmQubG93O1xyXG4gICAgICAgIHRoaXMubWF4ID0gcmVjb3JkLmhpZ2g7XHJcbiAgICAgICAgLy8gU2F2ZSB0aGUgYXJyYXkgb2YgYWxsIHJlY29yZHMgd2l0aCB0aGUgc2FtZSBrZXkgZm9yIHRoaXMgbm9kZVxyXG4gICAgICAgIHRoaXMucmVjb3Jkcy5wdXNoKHJlY29yZCk7XHJcbiAgICB9XHJcbiAgICAvLyBHZXRzIHRoZSBoaWdoZXN0IHJlY29yZC5oaWdoIHZhbHVlIGZvciB0aGlzIG5vZGVcclxuICAgIE5vZGUucHJvdG90eXBlLmdldE5vZGVIaWdoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBoaWdoID0gdGhpcy5yZWNvcmRzWzBdLmhpZ2g7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLnJlY29yZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmVjb3Jkc1tpXS5oaWdoID4gaGlnaCkge1xyXG4gICAgICAgICAgICAgICAgaGlnaCA9IHRoaXMucmVjb3Jkc1tpXS5oaWdoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoaWdoO1xyXG4gICAgfTtcclxuICAgIC8vIFVwZGF0ZXMgaGVpZ2h0IHZhbHVlIG9mIHRoZSBub2RlLiBDYWxsZWQgZHVyaW5nIGluc2VydGlvbiwgcmViYWxhbmNlLCByZW1vdmFsXHJcbiAgICBOb2RlLnByb3RvdHlwZS51cGRhdGVIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBNYXRoLm1heChoZWlnaHQodGhpcy5sZWZ0KSwgaGVpZ2h0KHRoaXMucmlnaHQpKSArIDE7XHJcbiAgICB9O1xyXG4gICAgLy8gVXBkYXRlcyB0aGUgbWF4IHZhbHVlIG9mIGFsbCB0aGUgcGFyZW50cyBhZnRlciBpbnNlcnRpbmcgaW50byBhbHJlYWR5IGV4aXN0aW5nIG5vZGUsIGFzIHdlbGwgYXNcclxuICAgIC8vIHJlbW92aW5nIHRoZSBub2RlIGNvbXBsZXRlbHkgb3IgcmVtb3ZpbmcgdGhlIHJlY29yZCBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIG5vZGUuIFN0YXJ0cyB3aXRoXHJcbiAgICAvLyB0aGUgcGFyZW50IG9mIGFuIGFmZmVjdGVkIG5vZGUgYW5kIGJ1YmJsZXMgdXAgdG8gcm9vdFxyXG4gICAgTm9kZS5wcm90b3R5cGUudXBkYXRlTWF4T2ZQYXJlbnRzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdGhpc0hpZ2ggPSB0aGlzLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXMucmlnaHQubWF4KSwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzLmxlZnQubWF4LCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXMucmlnaHQubWF4LCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IHRoaXNIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQudXBkYXRlTWF4T2ZQYXJlbnRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qXHJcbiAgICBMZWZ0LUxlZnQgY2FzZTpcclxuICBcclxuICAgICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5XHJcbiAgICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgXFxcclxuICAgICAgICAgeSAgIFQ0ICAgICAgUmlnaHQgUm90YXRlICh6KSAgICAgICAgICB4ICAgICB6XHJcbiAgICAgICAgLyBcXCAgICAgICAgICAtIC0gLSAtIC0gLSAtIC0gLT4gICAgICAgLyBcXCAgIC8gXFxcclxuICAgICAgIHggICBUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgLyBcXFxyXG4gICAgVDEgICBUMlxyXG4gIFxyXG4gICAgTGVmdC1SaWdodCBjYXNlOlxyXG4gIFxyXG4gICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICB4XHJcbiAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgICAgeSAgIFQ0ICBMZWZ0IFJvdGF0ZSAoeSkgICAgICAgICB4ICBUNCAgUmlnaHQgUm90YXRlKHopICAgICB5ICAgICB6XHJcbiAgICAgIC8gXFwgICAgICAtIC0gLSAtIC0gLSAtIC0gLT4gICAgIC8gXFwgICAgICAtIC0gLSAtIC0gLSAtIC0+ICAvIFxcICAgLyBcXFxyXG4gICAgVDEgICB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAgVDMgICAgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFxcclxuICAgICAgVDIgICBUMyAgICAgICAgICAgICAgICAgICAgICBUMSBUMlxyXG4gICAgKi9cclxuICAgIC8vIEhhbmRsZXMgTGVmdC1MZWZ0IGNhc2UgYW5kIExlZnQtUmlnaHQgY2FzZSBhZnRlciByZWJhbGFuY2luZyBBVkwgdHJlZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX3VwZGF0ZU1heEFmdGVyUmlnaHRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIHZhciBsZWZ0ID0gcGFyZW50LmxlZnQ7XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBsZWZ0IHNpYmxpbmcgKHggaW4gZmlyc3QgY2FzZSwgeSBpbiBzZWNvbmQpXHJcbiAgICAgICAgdmFyIHRoaXNQYXJlbnRMZWZ0SGlnaCA9IGxlZnQuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAobGVmdC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgbGVmdC5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxlZnQubWF4ID0gTWF0aC5tYXgodGhpc1BhcmVudExlZnRIaWdoLCBsZWZ0LnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxlZnQubGVmdCAhPT0gdW5kZWZpbmVkICYmIGxlZnQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IE1hdGgubWF4KHRoaXNQYXJlbnRMZWZ0SGlnaCwgbGVmdC5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxlZnQubGVmdCA9PT0gdW5kZWZpbmVkICYmIGxlZnQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IHRoaXNQYXJlbnRMZWZ0SGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxlZnQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgobGVmdC5sZWZ0Lm1heCwgbGVmdC5yaWdodC5tYXgpLCB0aGlzUGFyZW50TGVmdEhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIGl0c2VsZiAoeilcclxuICAgICAgICB2YXIgdGhpc0hpZ2ggPSB0aGlzLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLmxlZnQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpc0hpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXMucmlnaHQubWF4KSwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHBhcmVudCAoeSBpbiBmaXJzdCBjYXNlLCB4IGluIHNlY29uZClcclxuICAgICAgICBwYXJlbnQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgocGFyZW50LmxlZnQubWF4LCBwYXJlbnQucmlnaHQubWF4KSwgcGFyZW50LmdldE5vZGVIaWdoKCkpO1xyXG4gICAgfTtcclxuICAgIC8qXHJcbiAgICBSaWdodC1SaWdodCBjYXNlOlxyXG4gIFxyXG4gICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlcclxuICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgVDEgIHkgICAgIExlZnQgUm90YXRlKHopICAgICAgIHogICAgIHhcclxuICAgICAgIC8gXFwgICAtIC0gLSAtIC0gLSAtIC0+ICAgICAvIFxcICAgLyBcXFxyXG4gICAgICBUMiAgeCAgICAgICAgICAgICAgICAgICAgICBUMSBUMiBUMyBUNFxyXG4gICAgICAgICAvIFxcXHJcbiAgICAgICAgVDMgVDRcclxuICBcclxuICAgIFJpZ2h0LUxlZnQgY2FzZTpcclxuICBcclxuICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4XHJcbiAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgLyAgIFxcXHJcbiAgICAgVDEgIHkgICBSaWdodCBSb3RhdGUgKHkpICAgICBUMSAgeCAgICAgIExlZnQgUm90YXRlKHopICAgeiAgICAgeVxyXG4gICAgICAgIC8gXFwgIC0gLSAtIC0gLSAtIC0gLSAtPiAgICAgIC8gXFwgICAtIC0gLSAtIC0gLSAtIC0+ICAvIFxcICAgLyBcXFxyXG4gICAgICAgeCAgVDQgICAgICAgICAgICAgICAgICAgICAgICBUMiAgeSAgICAgICAgICAgICAgICAgICBUMSBUMiBUMyBUNFxyXG4gICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBcXFxyXG4gICAgVDIgICBUMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQzIFQ0XHJcbiAgICAqL1xyXG4gICAgLy8gSGFuZGxlcyBSaWdodC1SaWdodCBjYXNlIGFuZCBSaWdodC1MZWZ0IGNhc2UgaW4gcmViYWxhbmNpbmcgQVZMIHRyZWVcclxuICAgIE5vZGUucHJvdG90eXBlLl91cGRhdGVNYXhBZnRlckxlZnRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIHZhciByaWdodCA9IHBhcmVudC5yaWdodDtcclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHJpZ2h0IHNpYmxpbmcgKHggaW4gZmlyc3QgY2FzZSwgeSBpbiBzZWNvbmQpXHJcbiAgICAgICAgdmFyIHRoaXNQYXJlbnRSaWdodEhpZ2ggPSByaWdodC5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmIChyaWdodC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgcmlnaHQucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50UmlnaHRIaWdoLCByaWdodC5yaWdodC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyaWdodC5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgcmlnaHQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50UmlnaHRIaWdoLCByaWdodC5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJpZ2h0LmxlZnQgPT09IHVuZGVmaW5lZCAmJiByaWdodC5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJpZ2h0Lm1heCA9IHRoaXNQYXJlbnRSaWdodEhpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heChNYXRoLm1heChyaWdodC5sZWZ0Lm1heCwgcmlnaHQucmlnaHQubWF4KSwgdGhpc1BhcmVudFJpZ2h0SGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgaXRzZWxmICh6KVxyXG4gICAgICAgIHZhciB0aGlzSGlnaCA9IHRoaXMuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpc0hpZ2gsIHRoaXMucmlnaHQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpc0hpZ2gsIHRoaXMubGVmdC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzSGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgodGhpcy5sZWZ0Lm1heCwgdGhpcy5yaWdodC5tYXgpLCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgcGFyZW50ICh5IGluIGZpcnN0IGNhc2UsIHggaW4gc2Vjb25kKVxyXG4gICAgICAgIHBhcmVudC5tYXggPSBNYXRoLm1heChNYXRoLm1heChwYXJlbnQubGVmdC5tYXgsIHJpZ2h0Lm1heCksIHBhcmVudC5nZXROb2RlSGlnaCgpKTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5fbGVmdFJvdGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgcmlnaHRDaGlsZCA9IHRoaXMucmlnaHQ7XHJcbiAgICAgICAgcmlnaHRDaGlsZC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICBpZiAocmlnaHRDaGlsZC5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVydmFsVHJlZS5yb290ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChyaWdodENoaWxkLnBhcmVudC5sZWZ0ID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICByaWdodENoaWxkLnBhcmVudC5sZWZ0ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyaWdodENoaWxkLnBhcmVudC5yaWdodCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgcmlnaHRDaGlsZC5wYXJlbnQucmlnaHQgPSByaWdodENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodENoaWxkLmxlZnQ7XHJcbiAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJpZ2h0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJpZ2h0Q2hpbGQubGVmdCA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSByaWdodENoaWxkO1xyXG4gICAgICAgIHRoaXMudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICAgICAgcmlnaHRDaGlsZC51cGRhdGVIZWlnaHQoKTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5fcmlnaHRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGxlZnRDaGlsZCA9IHRoaXMubGVmdDtcclxuICAgICAgICBsZWZ0Q2hpbGQucGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcbiAgICAgICAgaWYgKGxlZnRDaGlsZC5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVydmFsVHJlZS5yb290ID0gbGVmdENoaWxkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGxlZnRDaGlsZC5wYXJlbnQubGVmdCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgbGVmdENoaWxkLnBhcmVudC5sZWZ0ID0gbGVmdENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxlZnRDaGlsZC5wYXJlbnQucmlnaHQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGxlZnRDaGlsZC5wYXJlbnQucmlnaHQgPSBsZWZ0Q2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdENoaWxkLnJpZ2h0O1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxlZnQucGFyZW50ID0gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGVmdENoaWxkLnJpZ2h0ID0gdGhpcztcclxuICAgICAgICB0aGlzLnBhcmVudCA9IGxlZnRDaGlsZDtcclxuICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgIGxlZnRDaGlsZC51cGRhdGVIZWlnaHQoKTtcclxuICAgIH07XHJcbiAgICAvLyBSZWJhbGFuY2VzIHRoZSB0cmVlIGlmIHRoZSBoZWlnaHQgdmFsdWUgYmV0d2VlbiB0d28gbm9kZXMgb2YgdGhlIHNhbWUgcGFyZW50IGlzIGdyZWF0ZXIgdGhhblxyXG4gICAgLy8gdHdvLiBUaGVyZSBhcmUgNCBjYXNlcyB0aGF0IGNhbiBoYXBwZW4gd2hpY2ggYXJlIG91dGxpbmVkIGluIHRoZSBncmFwaGljcyBhYm92ZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX3JlYmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoaGVpZ2h0KHRoaXMubGVmdCkgPj0gMiArIGhlaWdodCh0aGlzLnJpZ2h0KSkge1xyXG4gICAgICAgICAgICB2YXIgbGVmdCA9IHRoaXMubGVmdDtcclxuICAgICAgICAgICAgaWYgKGhlaWdodChsZWZ0LmxlZnQpID49IGhlaWdodChsZWZ0LnJpZ2h0KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gTGVmdC1MZWZ0IGNhc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlclJpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBMZWZ0LVJpZ2h0IGNhc2VcclxuICAgICAgICAgICAgICAgIGxlZnQuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlclJpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaGVpZ2h0KHRoaXMucmlnaHQpID49IDIgKyBoZWlnaHQodGhpcy5sZWZ0KSkge1xyXG4gICAgICAgICAgICB2YXIgcmlnaHQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0KHJpZ2h0LnJpZ2h0KSA+PSBoZWlnaHQocmlnaHQubGVmdCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFJpZ2h0LVJpZ2h0IGNhc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1heEFmdGVyTGVmdFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUmlnaHQtTGVmdCBjYXNlXHJcbiAgICAgICAgICAgICAgICByaWdodC5fcmlnaHRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1heEFmdGVyTGVmdFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcclxuICAgICAgICBpZiAocmVjb3JkLmxvdyA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIC8vIEluc2VydCBpbnRvIGxlZnQgc3VidHJlZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGVmdCA9IG5ldyBOb2RlKHRoaXMuaW50ZXJ2YWxUcmVlLCByZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnQuaW5zZXJ0KHJlY29yZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEluc2VydCBpbnRvIHJpZ2h0IHN1YnRyZWVcclxuICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodCA9IG5ldyBOb2RlKHRoaXMuaW50ZXJ2YWxUcmVlLCByZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodC5pbnNlcnQocmVjb3JkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIG1heCB2YWx1ZSBvZiB0aGlzIGFuY2VzdG9yIGlmIG5lZWRlZFxyXG4gICAgICAgIGlmICh0aGlzLm1heCA8IHJlY29yZC5oaWdoKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gcmVjb3JkLmhpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBoZWlnaHQgb2YgZWFjaCBub2RlXHJcbiAgICAgICAgdGhpcy51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICAvLyBSZWJhbGFuY2UgdGhlIHRyZWUgdG8gZW5zdXJlIGFsbCBvcGVyYXRpb25zIGFyZSBleGVjdXRlZCBpbiBPKGxvZ24pIHRpbWUuIFRoaXMgaXMgZXNwZWNpYWxseVxyXG4gICAgICAgIC8vIGltcG9ydGFudCBpbiBzZWFyY2hpbmcsIGFzIHRoZSB0cmVlIGhhcyBhIGhpZ2ggY2hhbmNlIG9mIGRlZ2VuZXJhdGluZyB3aXRob3V0IHRoZSByZWJhbGFuY2luZ1xyXG4gICAgICAgIHRoaXMuX3JlYmFsYW5jZSgpO1xyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLl9nZXRPdmVybGFwcGluZ1JlY29yZHMgPSBmdW5jdGlvbiAoY3VycmVudE5vZGUsIGxvdywgaGlnaCkge1xyXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS5rZXkgPD0gaGlnaCAmJiBsb3cgPD0gY3VycmVudE5vZGUuZ2V0Tm9kZUhpZ2goKSkge1xyXG4gICAgICAgICAgICAvLyBOb2RlcyBhcmUgb3ZlcmxhcHBpbmcsIGNoZWNrIGlmIGluZGl2aWR1YWwgcmVjb3JkcyBpbiB0aGUgbm9kZSBhcmUgb3ZlcmxhcHBpbmdcclxuICAgICAgICAgICAgdmFyIHRlbXBSZXN1bHRzID0gW107XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VycmVudE5vZGUucmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLnJlY29yZHNbaV0uaGlnaCA+PSBsb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wUmVzdWx0cy5wdXNoKGN1cnJlbnROb2RlLnJlY29yZHNbaV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0ZW1wUmVzdWx0cztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICAvLyBEb24ndCBzZWFyY2ggbm9kZXMgdGhhdCBkb24ndCBleGlzdFxyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbGVmdFNlYXJjaCA9IFtdO1xyXG4gICAgICAgIHZhciBvd25TZWFyY2ggPSBbXTtcclxuICAgICAgICB2YXIgcmlnaHRTZWFyY2ggPSBbXTtcclxuICAgICAgICAvLyBJZiBpbnRlcnZhbCBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIHJpZ2h0bW9zdCBwb2ludCBvZiBhbnkgaW50ZXJ2YWwgaW4gdGhpcyBub2RlIGFuZCBhbGwgaXRzXHJcbiAgICAgICAgLy8gY2hpbGRyZW4sIHRoZXJlIHdvbid0IGJlIGFueSBtYXRjaGVzXHJcbiAgICAgICAgaWYgKGxvdyA+IHRoaXMubWF4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU2VhcmNoIGxlZnQgY2hpbGRyZW5cclxuICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5sZWZ0Lm1heCA+PSBsb3cpIHtcclxuICAgICAgICAgICAgbGVmdFNlYXJjaCA9IHRoaXMubGVmdC5zZWFyY2gobG93LCBoaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ2hlY2sgdGhpcyBub2RlXHJcbiAgICAgICAgb3duU2VhcmNoID0gdGhpcy5fZ2V0T3ZlcmxhcHBpbmdSZWNvcmRzKHRoaXMsIGxvdywgaGlnaCk7XHJcbiAgICAgICAgLy8gSWYgaW50ZXJ2YWwgaXMgdG8gdGhlIGxlZnQgb2YgdGhlIHN0YXJ0IG9mIHRoaXMgaW50ZXJ2YWwsIHRoZW4gaXQgY2FuJ3QgYmUgaW4gYW55IGNoaWxkIHRvXHJcbiAgICAgICAgLy8gdGhlIHJpZ2h0XHJcbiAgICAgICAgaWYgKGhpZ2ggPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbGVmdFNlYXJjaC5jb25jYXQob3duU2VhcmNoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZWFyY2ggcmlnaHQgY2hpbGRyZW5cclxuICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJpZ2h0U2VhcmNoID0gdGhpcy5yaWdodC5zZWFyY2gobG93LCBoaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUmV0dXJuIGFjY3VtdWxhdGVkIHJlc3VsdHMsIGlmIGFueVxyXG4gICAgICAgIHJldHVybiBsZWZ0U2VhcmNoLmNvbmNhdChvd25TZWFyY2gsIHJpZ2h0U2VhcmNoKTtcclxuICAgIH07XHJcbiAgICAvLyBTZWFyY2hlcyBmb3IgYSBub2RlIGJ5IGEgYGtleWAgdmFsdWVcclxuICAgIE5vZGUucHJvdG90eXBlLnNlYXJjaEV4aXN0aW5nID0gZnVuY3Rpb24gKGxvdykge1xyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMua2V5ID09PSBsb3cpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxvdyA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5zZWFyY2hFeGlzdGluZyhsb3cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5zZWFyY2hFeGlzdGluZyhsb3cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9O1xyXG4gICAgLy8gUmV0dXJucyB0aGUgc21hbGxlc3Qgbm9kZSBvZiB0aGUgc3VidHJlZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX21pblZhbHVlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQuX21pblZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIGlmIChub2RlLmtleSA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIC8vIE5vZGUgdG8gYmUgcmVtb3ZlZCBpcyBvbiB0aGUgbGVmdCBzaWRlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5vZGUua2V5ID4gdGhpcy5rZXkpIHtcclxuICAgICAgICAgICAgLy8gTm9kZSB0byBiZSByZW1vdmVkIGlzIG9uIHRoZSByaWdodCBzaWRlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnJlbW92ZShub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgaGFzIHR3byBjaGlsZHJlblxyXG4gICAgICAgICAgICAgICAgdmFyIG1pblZhbHVlID0gdGhpcy5yaWdodC5fbWluVmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMua2V5ID0gbWluVmFsdWUua2V5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvcmRzID0gbWluVmFsdWUucmVjb3JkcztcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnJlbW92ZSh0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChwYXJlbnQubGVmdCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgLy8gT25lIGNoaWxkIG9yIG5vIGNoaWxkIGNhc2Ugb24gbGVmdCBzaWRlXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmxlZnQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmxlZnQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Ll9yZWJhbGFuY2UoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmVudC5yaWdodCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgLy8gT25lIGNoaWxkIG9yIG5vIGNoaWxkIGNhc2Ugb24gcmlnaHQgc2lkZVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5yaWdodCA9IHRoaXMucmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmlnaHQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Ll9yZWJhbGFuY2UoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBOb2RlO1xyXG59KCkpO1xyXG5leHBvcnRzLk5vZGUgPSBOb2RlO1xyXG52YXIgSW50ZXJ2YWxUcmVlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gSW50ZXJ2YWxUcmVlKCkge1xyXG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xyXG4gICAgfVxyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAocmVjb3JkKSB7XHJcbiAgICAgICAgaWYgKHJlY29yZC5sb3cgPiByZWNvcmQuaGlnaCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bsb3dgIHZhbHVlIG11c3QgYmUgbG93ZXIgb3IgZXF1YWwgdG8gYGhpZ2hgIHZhbHVlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBCYXNlIGNhc2U6IFRyZWUgaXMgZW1wdHksIG5ldyBub2RlIGJlY29tZXMgcm9vdFxyXG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBuZXcgTm9kZSh0aGlzLCByZWNvcmQpO1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjaGVjayBpZiBub2RlIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNhbWUga2V5XHJcbiAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5yb290LnNlYXJjaEV4aXN0aW5nKHJlY29yZC5sb3cpO1xyXG4gICAgICAgICAgICBpZiAobm9kZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgcmVjb3JkcyBpbiB0aGlzIG5vZGUgaWYgdGhlcmUgYWxyZWFkeSBpcyB0aGUgb25lIHdpdGggc2FtZSBsb3csIGhpZ2gsIGRhdGFcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbaV0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZWNvcmQgaXMgc2FtZSBhcyB0aGUgb25lIHdlJ3JlIHRyeWluZyB0byBpbnNlcnQ7IHJldHVybiBmYWxzZSB0byBpbmRpY2F0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGhhcyBiZWVuIGluc2VydGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHJlY29yZCB0byB0aGUgbm9kZVxyXG4gICAgICAgICAgICAgICAgbm9kZS5yZWNvcmRzLnB1c2gocmVjb3JkKTtcclxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnRzIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5oaWdoID4gbm9kZS5tYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLm1heCA9IHJlY29yZC5oaWdoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgd2l0aCB0aGlzIGtleSBkb2Vzbid0IGFscmVhZHkgZXhpc3QuIENhbGwgaW5zZXJ0IGZ1bmN0aW9uIG9uIHJvb3QncyBub2RlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QuaW5zZXJ0KHJlY29yZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICBpZiAodGhpcy5yb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gVHJlZSBpcyBlbXB0eTsgcmV0dXJuIGVtcHR5IGFycmF5XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Quc2VhcmNoKGxvdywgaGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHJlY29yZCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBUcmVlIGlzIGVtcHR5OyBub3RoaW5nIHRvIHJlbW92ZVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMucm9vdC5zZWFyY2hFeGlzdGluZyhyZWNvcmQubG93KTtcclxuICAgICAgICAgICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUucmVjb3Jkcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZFJlY29yZCA9IHZvaWQgMDtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgd2l0aCB0aGlzIGtleSBoYXMgMiBvciBtb3JlIHJlY29yZHMuIEZpbmQgdGhlIG9uZSB3ZSBuZWVkIGFuZCByZW1vdmUgaXRcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbaV0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFJlY29yZCA9IG5vZGUucmVjb3Jkc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZWNvcmRzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZWRSZWNvcmQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVkUmVjb3JkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgdGhhdCBub2RlIGFuZCBpdHMgcGFyZW50cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmhpZ2ggPT09IG5vZGUubWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlSGlnaCA9IG5vZGUuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGVmdCAhPT0gdW5kZWZpbmVkICYmIG5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBNYXRoLm1heChNYXRoLm1heChub2RlLmxlZnQubWF4LCBub2RlLnJpZ2h0Lm1heCksIG5vZGVIaWdoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmxlZnQgIT09IHVuZGVmaW5lZCAmJiBub2RlLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gTWF0aC5tYXgobm9kZS5sZWZ0Lm1heCwgbm9kZUhpZ2gpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUubGVmdCA9PT0gdW5kZWZpbmVkICYmIG5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBNYXRoLm1heChub2RlLnJpZ2h0Lm1heCwgbm9kZUhpZ2gpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBub2RlSGlnaDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQtLTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLnJlY29yZHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIHdpdGggdGhpcyBrZXkgaGFzIG9ubHkgMSByZWNvcmQuIENoZWNrIGlmIHRoZSByZW1haW5pbmcgcmVjb3JkIGluIHRoaXMgbm9kZSBpc1xyXG4gICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbMF0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIHJlY29yZCBpcyB0aGUgb25lIHdlIHdhbnQgdG8gcmVtb3ZlLiBSZW1vdmUgdGhlIHdob2xlIG5vZGUgZnJvbSB0aGUgdHJlZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3Qua2V5ID09PSBub2RlLmtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSByZW1vdmluZyB0aGUgcm9vdCBlbGVtZW50LiBDcmVhdGUgYSBkdW1teSBub2RlIHRoYXQgd2lsbCB0ZW1wb3JhcmlseSB0YWtlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvb3QncyBwYXJlbnQgcm9sZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdFBhcmVudCA9IG5ldyBOb2RlKHRoaXMsIHsgbG93OiByZWNvcmQubG93LCBoaWdoOiByZWNvcmQubG93IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb290UGFyZW50LmxlZnQgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdC5wYXJlbnQgPSByb290UGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZE5vZGUgPSB0aGlzLnJvb3QucmVtb3ZlKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSByb290UGFyZW50LmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3QgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290LnBhcmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWROb2RlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudC0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZW1vdmVkTm9kZSA9IHRoaXMucm9vdC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZE5vZGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50LS07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZW1haW5pbmcgcmVjb3JkIGlzIG5vdCB0aGUgb25lIHdlIHdhbnQgdG8gcmVtb3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gTm8gcmVjb3JkcyBhdCBhbGwgaW4gdGhpcyBub2RlPyEgU2hvdWxkbid0IGhhcHBlblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUuaW5PcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IEluT3JkZXIodGhpcy5yb290KTtcclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLnByZU9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJlT3JkZXIodGhpcy5yb290KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gSW50ZXJ2YWxUcmVlO1xyXG59KCkpO1xyXG5leHBvcnRzLkludGVydmFsVHJlZSA9IEludGVydmFsVHJlZTtcclxudmFyIERhdGFJbnRlcnZhbFRyZWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBEYXRhSW50ZXJ2YWxUcmVlKCkge1xyXG4gICAgICAgIHRoaXMudHJlZSA9IG5ldyBJbnRlcnZhbFRyZWUoKTtcclxuICAgIH1cclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gsIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLmluc2VydCh7IGxvdzogbG93LCBoaWdoOiBoaWdoLCBkYXRhOiBkYXRhIH0pO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChsb3csIGhpZ2gsIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnJlbW92ZSh7IGxvdzogbG93LCBoaWdoOiBoaWdoLCBkYXRhOiBkYXRhIH0pO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnNlYXJjaChsb3csIGhpZ2gpLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdi5kYXRhOyB9KTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbk9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWUuaW5PcmRlcigpO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnByZU9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWUucHJlT3JkZXIoKTtcclxuICAgIH07XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGF0YUludGVydmFsVHJlZS5wcm90b3R5cGUsIFwiY291bnRcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmVlLmNvdW50O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIERhdGFJbnRlcnZhbFRyZWU7XHJcbn0oKSk7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IERhdGFJbnRlcnZhbFRyZWU7XHJcbnZhciBJbk9yZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gSW5PcmRlcihzdGFydE5vZGUpIHtcclxuICAgICAgICB0aGlzLnN0YWNrID0gW107XHJcbiAgICAgICAgaWYgKHN0YXJ0Tm9kZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaChzdGFydE5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIEluT3JkZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gV2lsbCBvbmx5IGhhcHBlbiBpZiBzdGFjayBpcyBlbXB0eSBhbmQgcG9wIGlzIGNhbGxlZFxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRvbmU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQcm9jZXNzIHRoaXMgbm9kZVxyXG4gICAgICAgIGlmICh0aGlzLmkgPCB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHNbdGhpcy5pKytdLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLnJpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE1pZ2h0IHBvcCB0aGUgbGFzdCBhbmQgc2V0IHRoaXMuY3VycmVudE5vZGUgPSB1bmRlZmluZWRcclxuICAgICAgICAgICAgdGhpcy5wb3AoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpO1xyXG4gICAgfTtcclxuICAgIEluT3JkZXIucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSBub2RlO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VycmVudE5vZGUubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh0aGlzLmN1cnJlbnROb2RlKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUubGVmdDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSW5PcmRlci5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLnN0YWNrLnBvcCgpO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEluT3JkZXI7XHJcbn0oKSk7XHJcbmV4cG9ydHMuSW5PcmRlciA9IEluT3JkZXI7XHJcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICBJbk9yZGVyLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcclxufVxyXG52YXIgUHJlT3JkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBQcmVPcmRlcihzdGFydE5vZGUpIHtcclxuICAgICAgICB0aGlzLnN0YWNrID0gW107XHJcbiAgICAgICAgdGhpcy5pID0gMDtcclxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gc3RhcnROb2RlO1xyXG4gICAgfVxyXG4gICAgUHJlT3JkZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gV2lsbCBvbmx5IGhhcHBlbiBpZiBzdGFjayBpcyBlbXB0eSBhbmQgcG9wIGlzIGNhbGxlZCxcclxuICAgICAgICAvLyB3aGljaCBvbmx5IGhhcHBlbnMgaWYgdGhlcmUgaXMgbm8gcmlnaHQgbm9kZSAoaS5lIHdlIGFyZSBkb25lKVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRvbmU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQcm9jZXNzIHRoaXMgbm9kZVxyXG4gICAgICAgIGlmICh0aGlzLmkgPCB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHNbdGhpcy5pKytdLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLnJpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLmxlZnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvcCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQoKTtcclxuICAgIH07XHJcbiAgICBQcmVPcmRlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKG5vZGUpO1xyXG4gICAgfTtcclxuICAgIFByZU9yZGVyLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuc3RhY2sucG9wKCk7XHJcbiAgICAgICAgdGhpcy5pID0gMDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gUHJlT3JkZXI7XHJcbn0oKSk7XHJcbmV4cG9ydHMuUHJlT3JkZXIgPSBQcmVPcmRlcjtcclxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcclxuICAgIFByZU9yZGVyLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcclxufVxyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbm9kZS1pbnRlcnZhbC10cmVlL2xpYi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQiwgY29tcGFyZSwgY29tcGFyZUNvbnRleHQpIHtcbiAgdmFyIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIG9iakEsIG9iakIpIDogdm9pZCAwO1xuXG4gIGlmIChyZXQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiAhIXJldDtcbiAgfVxuXG4gIGlmIChvYmpBID09PSBvYmpCKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09IFwib2JqZWN0XCIgfHwgIW9iakEgfHwgdHlwZW9mIG9iakIgIT09IFwib2JqZWN0XCIgfHwgIW9iakIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGJIYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuYmluZChvYmpCKTtcblxuICAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBrZXlzQS5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNBW2lkeF07XG5cbiAgICBpZiAoIWJIYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlQSA9IG9iakFba2V5XTtcbiAgICB2YXIgdmFsdWVCID0gb2JqQltrZXldO1xuXG4gICAgcmV0ID0gY29tcGFyZSA/IGNvbXBhcmUuY2FsbChjb21wYXJlQ29udGV4dCwgdmFsdWVBLCB2YWx1ZUIsIGtleSkgOiB2b2lkIDA7XG5cbiAgICBpZiAocmV0ID09PSBmYWxzZSB8fCAocmV0ID09PSB2b2lkIDAgJiYgdmFsdWVBICE9PSB2YWx1ZUIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NoYWxsb3dlcXVhbC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0UmFkaW9BcHBlYXJhbmNlKGRvYzogYW55KTogYW55IHtcbiAgICBjb25zdCBvbGRBcHBlYXJhbmNlRnVuY2l0aW9uOiBGdW5jdGlvbiA9IGRvYy5BY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLlllc05vcm1hbDtcbiAgICBkb2MuQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNOb3JtYWwgPSBmdW5jdGlvbihmb3JtT2JqZWN0OiBhbnkpIHtcbiAgICAgICAgY29uc3QgeG9iajogYW55ID0gb2xkQXBwZWFyYW5jZUZ1bmNpdGlvbihmb3JtT2JqZWN0KTtcbiAgICAgICAgY29uc3Qgc3RyZWFtOiBzdHJpbmdbXSA9IHhvYmouc3RyZWFtLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgY29uc3QgZW5jb2RlQ29sb3I6IHN0cmluZyA9IGRvYy5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKTtcbiAgICAgICAgc3RyZWFtWzBdID0gc3RyZWFtWzBdICsgJ1xcbicgKyBlbmNvZGVDb2xvciArICdcXG4nICsgZW5jb2RlQ29sb3IudG9VcHBlckNhc2UoKTtcbiAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbignXFxuJyk7XG4gICAgICAgIHJldHVybiB4b2JqO1xuICAgIH07XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0udHMiLCJpbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgQ29sb3JlZEJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJpdmF0ZSBjb2xvcjogc3RyaW5nLCBwcml2YXRlIHJlbmRlcldpZHRoPzogbnVtYmVyLCBwcml2YXRlIHJlbmRlckhlaWdodD86IG51bWJlcikge1xuICAgICAgICBzdXBlcih1bmRlZmluZWQsIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRGaWxsQ29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0RmlsbENvbG9yKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RmlsbENvbG9yKHRoaXMuY29sb3IgfHwgJ2JsYWNrJyk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MucmVjdCh0aGlzLnhMZWZ0LCB0aGlzLnlUb3AsXG4gICAgICAgICAgICB0aGlzLnJlbmRlcldpZHRoID8/IHRoaXMud2lkdGgsIHRoaXMucmVuZGVySGVpZ2h0ID8/IHRoaXMuaGVpZ2h0LCAnRicpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldEZpbGxDb2xvcihvbGRGaWxsQ29sb3IpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY29sb3JlZGJyaWNrLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcblxuZXhwb3J0IGNsYXNzIERlc2NyaXB0aW9uQnJpY2sgZXh0ZW5kcyBUZXh0QnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCB0ZXh0KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2Rlc2NyaXB0aW9uLnRzIiwidmFyIGc7XHJcblxyXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxyXG5nID0gKGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzO1xyXG59KSgpO1xyXG5cclxudHJ5IHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcclxuXHRnID0gZyB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCkgfHwgKDEsZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoKGUpIHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxyXG5cdGlmKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpXHJcblx0XHRnID0gd2luZG93O1xyXG59XHJcblxyXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXHJcbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXHJcbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZztcclxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzXG4vLyBtb2R1bGUgaWQgPSA2MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiBnbG9iYWwganNQREYgKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiBBbGV4YW5kZXIgV2VpZHQsXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQmlnZ0E5NFxuICogXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5cbi8qKiBcbioganNQREYgQWNyb0Zvcm0gUGx1Z2luXG4qIEBtb2R1bGUgQWNyb0Zvcm1cbiovXG52YXIganNwZGYgPSByZXF1aXJlKCdqc3BkZicpO1xuKGZ1bmN0aW9uIChqc1BERiwgZ2xvYmFsT2JqKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGpzUERGQVBJID0ganNQREYuQVBJO1xuICAgIHZhciBzY29wZTtcbiAgICB2YXIgc2NhbGVGYWN0b3IgPSAxO1xuICAgIGZ1bmN0aW9uIHRvVW5pY29kZShzdHIpIHtcbiAgICAgICAgdmFyIHVuaWNvZGVTdHJpbmcgPSAnJztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0aGVVbmljb2RlID0gc3RyLmNoYXJDb2RlQXQoaSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB3aGlsZSAodGhlVW5pY29kZS5sZW5ndGggPCA0KSB7XG4gICAgICAgICAgICAgICAgdGhlVW5pY29kZSA9ICcwJyArIHRoZVVuaWNvZGU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdW5pY29kZVN0cmluZyArPSB0aGVVbmljb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnPEZFRkYnICsgdW5pY29kZVN0cmluZyArICc+JztcbiAgICB9XG4gICAgdmFyIHBkZkVzY2FwZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9cXCgvZywgJ1xcXFwoJykucmVwbGFjZSgvXFwpL2csICdcXFxcKScpIH07XG4gICAgdmFyIHBkZlVuZXNjYXBlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZS5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpLnJlcGxhY2UoL1xcXFxcXCgvZywgJygnKS5yZXBsYWNlKC9cXFxcXFwpL2csICcpJyk7IH07XG4gICAgZnVuY3Rpb24gYXJyYXlUb1BkZlVuaWNvZGVBcnJheSh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gJ1sgJztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRvVW5pY29kZSh2YWx1ZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ICs9ICcgXSdcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdmFyIGYyID0gZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICByZXR1cm4gbnVtYmVyLnRvRml4ZWQoMik7IC8vIEllLCAlLjJmXG4gICAgfTtcblxuICAgIHZhciBmNSA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlci50b0ZpeGVkKDUpOyAvLyBJZSwgJS4yZlxuICAgIH07XG5cbiAgICBqc1BERkFQSS5fX2Fjcm9mb3JtX18gPSB7fTtcbiAgICB2YXIgaW5oZXJpdCA9IGZ1bmN0aW9uIChjaGlsZCwgcGFyZW50KSB7XG4gICAgICAgIGNoaWxkLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7XG4gICAgICAgIGNoaWxkLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNoaWxkO1xuICAgIH07XG5cbiAgICB2YXIgc2NhbGUgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gKHggKiBzY2FsZUZhY3Rvcik7XG4gICAgfTtcbiAgICB2YXIgYW50aVNjYWxlID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuICh4IC8gc2NhbGVGYWN0b3IpO1xuICAgIH07XG5cbiAgICB2YXIgY3JlYXRlRm9ybVhPYmplY3QgPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICB2YXIgeG9iaiA9IG5ldyBBY3JvRm9ybVhPYmplY3QoKTtcbiAgICAgICAgdmFyIGhlaWdodCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgfHwgMDtcbiAgICAgICAgdmFyIHdpZHRoID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIHhvYmouQkJveCA9IFswLCAwLCBOdW1iZXIoZjIod2lkdGgpKSwgTnVtYmVyKGYyKGhlaWdodCkpXTtcbiAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQml0LU9wZXJhdGlvbnNcbiAgICAqL1xuICAgIHZhciBzZXRCaXQgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0ID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgbnVtYmVyID0gbnVtYmVyIHx8IDA7XG4gICAgICAgIGJpdFBvc2l0aW9uID0gYml0UG9zaXRpb24gfHwgMDtcblxuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJpdE1hc2sgPSAxIDw8IGJpdFBvc2l0aW9uO1xuXG4gICAgICAgIG51bWJlciB8PSBiaXRNYXNrO1xuXG4gICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfTtcblxuICAgIHZhciBjbGVhckJpdCA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5jbGVhckJpdCA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIG51bWJlciA9IG51bWJlciB8fCAwO1xuICAgICAgICBiaXRQb3NpdGlvbiA9IGJpdFBvc2l0aW9uIHx8IDA7XG5cbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJpdE1hc2sgPSAxIDw8IGJpdFBvc2l0aW9uO1xuXG4gICAgICAgIG51bWJlciAmPSB+Yml0TWFzaztcblxuICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH07XG5cbiAgICB2YXIgZ2V0Qml0ID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmdldEJpdCA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5nZXRCaXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKG51bWJlciAmICgxIDw8IGJpdFBvc2l0aW9uKSkgPT09IDAgPyAwIDogMTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAqIEZmIHN0YXJ0cyBjb3VudGluZyB0aGUgYml0IHBvc2l0aW9uIGF0IDEgYW5kIG5vdCBsaWtlIGphdmFzY3JpcHQgYXQgMFxuICAgICovXG4gICAgdmFyIGdldEJpdEZvclBkZiA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5nZXRCaXRGb3JQZGYgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0Rm9yUGRmJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldEJpdChudW1iZXIsIGJpdFBvc2l0aW9uIC0gMSk7XG4gICAgfTtcblxuICAgIHZhciBzZXRCaXRGb3JQZGYgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0Rm9yUGRmID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLnNldEJpdEZvclBkZicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRCaXQobnVtYmVyLCBiaXRQb3NpdGlvbiAtIDEpO1xuICAgIH07XG5cbiAgICB2YXIgY2xlYXJCaXRGb3JQZGYgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uY2xlYXJCaXRGb3JQZGYgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uY2xlYXJCaXRGb3JQZGYnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xlYXJCaXQobnVtYmVyLCBiaXRQb3NpdGlvbiAtIDEpO1xuICAgIH07XG5cbiAgICB2YXIgY2FsY3VsYXRlQ29vcmRpbmF0ZXMgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uY2FsY3VsYXRlQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICB2YXIgZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGUgPSB0aGlzLmludGVybmFsLmdldEhvcml6b250YWxDb29yZGluYXRlO1xuICAgICAgICB2YXIgZ2V0VmVydGljYWxDb29yZGluYXRlID0gdGhpcy5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGU7XG4gICAgICAgIHZhciB4ID0gYXJnc1swXTtcbiAgICAgICAgdmFyIHkgPSBhcmdzWzFdO1xuICAgICAgICB2YXIgdyA9IGFyZ3NbMl07XG4gICAgICAgIHZhciBoID0gYXJnc1szXTtcblxuICAgICAgICB2YXIgY29vcmRpbmF0ZXMgPSB7fTtcblxuICAgICAgICBjb29yZGluYXRlcy5sb3dlckxlZnRfWCA9IGdldEhvcml6b250YWxDb29yZGluYXRlKHgpIHx8IDA7XG4gICAgICAgIGNvb3JkaW5hdGVzLmxvd2VyTGVmdF9ZID0gZ2V0VmVydGljYWxDb29yZGluYXRlKHkgKyBoKSB8fCAwO1xuICAgICAgICBjb29yZGluYXRlcy51cHBlclJpZ2h0X1ggPSBnZXRIb3Jpem9udGFsQ29vcmRpbmF0ZSh4ICsgdykgfHwgMDtcbiAgICAgICAgY29vcmRpbmF0ZXMudXBwZXJSaWdodF9ZID0gZ2V0VmVydGljYWxDb29yZGluYXRlKHkpIHx8IDA7XG5cbiAgICAgICAgcmV0dXJuIFtOdW1iZXIoZjIoY29vcmRpbmF0ZXMubG93ZXJMZWZ0X1gpKSwgTnVtYmVyKGYyKGNvb3JkaW5hdGVzLmxvd2VyTGVmdF9ZKSksIE51bWJlcihmMihjb29yZGluYXRlcy51cHBlclJpZ2h0X1gpKSwgTnVtYmVyKGYyKGNvb3JkaW5hdGVzLnVwcGVyUmlnaHRfWSkpXTtcbiAgICB9O1xuXG4gICAgdmFyIGNhbGN1bGF0ZUFwcGVhcmFuY2VTdHJlYW0gPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICBpZiAoZm9ybU9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1PYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZvcm1PYmplY3QuViAmJiAhZm9ybU9iamVjdC5EVikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZWxzZSBjYWxjdWxhdGUgaXRcblxuICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgIHZhciB0ZXh0ID0gZm9ybU9iamVjdC5WIHx8IGZvcm1PYmplY3QuRFY7XG4gICAgICAgIHZhciBjYWxjUmVzID0gY2FsY3VsYXRlWChmb3JtT2JqZWN0LCB0ZXh0KTtcbiAgICAgICAgdmFyIGZvbnRLZXkgPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KGZvcm1PYmplY3QuZm9udE5hbWUsIGZvcm1PYmplY3QuZm9udFN0eWxlKS5pZDtcblxuICAgICAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgNDQ0XG4gICAgICAgIHN0cmVhbS5wdXNoKCcvVHggQk1DJyk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCdxJyk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCdCVCcpOyAvLyBCZWdpbiBUZXh0XG4gICAgICAgIHN0cmVhbS5wdXNoKHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJy8nICsgZm9udEtleSArICcgJyArIGYyKGNhbGNSZXMuZm9udFNpemUpICsgJyBUZicpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnMSAwIDAgMSAwIDAgVG0nKTsvLyBUcmFuc2Zvcm1hdGlvbiBNYXRyaXhcbiAgICAgICAgc3RyZWFtLnB1c2goY2FsY1Jlcy50ZXh0KTtcbiAgICAgICAgc3RyZWFtLnB1c2goJ0VUJyk7IC8vIEVuZCBUZXh0ICAgIFxuICAgICAgICBzdHJlYW0ucHVzaCgnUScpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnRU1DJyk7XG5cbiAgICAgICAgdmFyIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgcmV0dXJuIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50O1xuICAgIH07XG5cbiAgICB2YXIgY2FsY3VsYXRlWCA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0LCB0ZXh0KSB7XG4gICAgICAgIGlmIChmb3JtT2JqZWN0LmlzVW5pY29kZSkgdGV4dCA9IGZvcm1PYmplY3QudHJ1ZVZhbHVlO1xuICAgICAgICAgdmFyIG1heEZvbnRTaXplID1cbiAgICAgICAgICAgIGZvcm1PYmplY3QuZm9udFNpemUgPT09IDAgPyBmb3JtT2JqZWN0Lm1heEZvbnRTaXplIDogZm9ybU9iamVjdC5mb250U2l6ZTtcbiAgICAgICAgdmFyIHJldHVyblZhbHVlID0ge1xuICAgICAgICAgICAgdGV4dDogXCJcIixcbiAgICAgICAgICAgIGZvbnRTaXplOiBcIlwiXG4gICAgICAgIH07XG4gICAgICAgIC8vIFJlbW92ZSBCcmFja2V0c1xuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHIoMCwgMSkgPT0gXCIoXCIgPyB0ZXh0LnN1YnN0cigxKSA6IHRleHQ7XG4gICAgICAgIHRleHQgPVxuICAgICAgICAgICAgdGV4dC5zdWJzdHIodGV4dC5sZW5ndGggLSAxKSA9PSBcIilcIlxuICAgICAgICAgICAgPyB0ZXh0LnN1YnN0cigwLCB0ZXh0Lmxlbmd0aCAtIDEpXG4gICAgICAgICAgICA6IHRleHQ7XG4gICAgICAgIC8vIHNwbGl0IGludG8gYXJyYXkgb2Ygd29yZHNcbiAgICAgICAgdmFyIHRleHRTcGxpdCA9IHRleHQuc3BsaXQoXCIgXCIpO1xuICAgICAgICB0ZXh0U3BsaXQgPSB0ZXh0U3BsaXQubWFwKGZ1bmN0aW9uICh3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gd29yZC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZm9ybU9iamVjdC5tdWx0aWxpbmUpIHtcbiAgICAgICAgICAgIHRleHRTcGxpdCA9IHRleHRTcGxpdC5tYXAoZnVuY3Rpb24gKGFycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBbYXJyLmpvaW4oXCIgXCIpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZm9udFNpemUgPSBtYXhGb250U2l6ZTsgLy8gVGhlIFN0YXJ0aW5nIGZvbnRTaXplIChUaGUgTWF4aW11bSlcbiAgICAgICAgdmFyIGxpbmVTcGFjaW5nID0gMjtcbiAgICAgICAgdmFyIGJvcmRlclBhZGRpbmcgPSAyO1xuXG4gICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIGhlaWdodCA9IGhlaWdodCA8IDAgPyAtaGVpZ2h0IDogaGVpZ2h0O1xuICAgICAgICB2YXIgd2lkdGggPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgfHwgMDtcbiAgICAgICAgd2lkdGggPSB3aWR0aCA8IDAgPyAtd2lkdGggOiB3aWR0aDtcblxuICAgICAgICB2YXIgaXNTbWFsbGVyVGhhbldpZHRoID0gZnVuY3Rpb24oaSwgbGFzdExpbmUsIGZvbnRTaXplKSB7XG4gICAgICAgICAgICBpZiAoaSArIDEgPCB0ZXh0U3BsaXQubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gbGFzdExpbmUgKyBcIiBcIiArIHRleHRTcGxpdFtpICsgMV1bMF07XG4gICAgICAgICAgICB2YXIgVGV4dFdpZHRoID0gY2FsY3VsYXRlRm9udFNwYWNlKHRtcCwgZm9ybU9iamVjdCwgZm9udFNpemUpLndpZHRoO1xuICAgICAgICAgICAgdmFyIEZpZWxkV2lkdGggPSB3aWR0aCAtIDIgKiBib3JkZXJQYWRkaW5nO1xuICAgICAgICAgICAgcmV0dXJuIFRleHRXaWR0aCA8PSBGaWVsZFdpZHRoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBmb250U2l6ZSsrO1xuICAgICAgICBGb250U2l6ZTogd2hpbGUgKGZvbnRTaXplID4gMCkge1xuICAgICAgICAgICAgdGV4dCA9IFwiXCI7XG4gICAgICAgICAgICBmb250U2l6ZS0tO1xuICAgICAgICAgICAgdmFyIHRleHRIZWlnaHQgPSBjYWxjdWxhdGVGb250U3BhY2UoXCIzXCIsIGZvcm1PYmplY3QsIGZvbnRTaXplKS5oZWlnaHQ7XG4gICAgICAgICAgICB2YXIgc3RhcnRZID0gZm9ybU9iamVjdC5tdWx0aWxpbmVcbiAgICAgICAgICAgID8gaGVpZ2h0IC0gZm9udFNpemVcbiAgICAgICAgICAgIDogKGhlaWdodCAtIHRleHRIZWlnaHQpIC8gMjtcbiAgICAgICAgICAgIHN0YXJ0WSArPSBsaW5lU3BhY2luZztcbiAgICAgICAgICAgIHZhciBzdGFydFg7XG5cbiAgICAgICAgICAgIHZhciBsYXN0WSA9IHN0YXJ0WTtcbiAgICAgICAgICAgIHZhciBmaXJzdFdvcmRJbkxpbmUgPSAwLFxuICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSAwO1xuICAgICAgICAgICAgdmFyIGxhc3RMZW5ndGg7XG4gICAgICAgICAgICB2YXIgY3VycldvcmQgPSAwO1xuXG4gICAgICAgICAgICBpZiAoZm9udFNpemUgPD0gMCkge1xuICAgICAgICAgICAgLy8gSW4gY2FzZSwgdGhlIFRleHQgZG9lc24ndCBmaXQgYXQgYWxsXG4gICAgICAgICAgICBmb250U2l6ZSA9IDEyO1xuICAgICAgICAgICAgdGV4dCA9IFwiKC4uLikgVGpcXG5cIjtcbiAgICAgICAgICAgIHRleHQgKz1cbiAgICAgICAgICAgICAgICBcIiUgV2lkdGggb2YgVGV4dDogXCIgK1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUZvbnRTcGFjZSh0ZXh0LCBmb3JtT2JqZWN0LCBmb250U2l6ZSkud2lkdGggK1xuICAgICAgICAgICAgICAgIFwiLCBGaWVsZFdpZHRoOlwiICtcbiAgICAgICAgICAgICAgICB3aWR0aCArXG4gICAgICAgICAgICAgICAgXCJcXG5cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbGFzdExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgdmFyIGxpbmVDb3VudCA9IDA7XG4gICAgICAgICAgICBMaW5lOiBmb3IgKHZhciBpID0gMDsgaSA8IHRleHRTcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRleHRTcGxpdC5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBpc1dpdGhOZXdMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRTcGxpdFtpXS5sZW5ndGggIT09IDEgJiYgY3VycldvcmQgIT09IHRleHRTcGxpdFtpXS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAodGV4dEhlaWdodCArIGxpbmVTcGFjaW5nKSAqIChsaW5lQ291bnQgKyAyKSArIGxpbmVTcGFjaW5nID5cbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxhc3RMaW5lICs9IHRleHRTcGxpdFtpXVtjdXJyV29yZF07XG4gICAgICAgICAgICAgICAgaXNXaXRoTmV3TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSBpO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxhc3RMaW5lICs9IHRleHRTcGxpdFtpXVtjdXJyV29yZF0gKyBcIiBcIjtcbiAgICAgICAgICAgICAgICBsYXN0TGluZSA9XG4gICAgICAgICAgICAgICAgICAgIGxhc3RMaW5lLnN1YnN0cihsYXN0TGluZS5sZW5ndGggLSAxKSA9PSBcIiBcIlxuICAgICAgICAgICAgICAgICAgICA/IGxhc3RMaW5lLnN1YnN0cigwLCBsYXN0TGluZS5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICA6IGxhc3RMaW5lO1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBwYXJzZUludChpKTtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dExpbmVJc1NtYWxsZXIgPSBpc1NtYWxsZXJUaGFuV2lkdGgoa2V5LCBsYXN0TGluZSwgZm9udFNpemUpO1xuICAgICAgICAgICAgICAgIHZhciBpc0xhc3RXb3JkID0gaSA+PSB0ZXh0U3BsaXQubGVuZ3RoIC0gMTtcblxuICAgICAgICAgICAgICAgIGlmIChuZXh0TGluZUlzU21hbGxlciAmJiAhaXNMYXN0V29yZCkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0TGluZSArPSBcIiBcIjtcbiAgICAgICAgICAgICAgICAgICAgY3VycldvcmQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTGluZVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5leHRMaW5lSXNTbWFsbGVyICYmICFpc0xhc3RXb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZm9ybU9iamVjdC5tdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgRm9udFNpemU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICh0ZXh0SGVpZ2h0ICsgbGluZVNwYWNpbmcpICogKGxpbmVDb3VudCArIDIpICsgbGluZVNwYWNpbmcgPlxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFRleHQgaXMgaGlnaGVyIHRoYW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWVsZE9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgRm9udFNpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdvIG9uXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTGFzdFdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSBrZXk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBmb3JtT2JqZWN0Lm11bHRpbGluZSAmJlxuICAgICAgICAgICAgICAgICAgICAodGV4dEhlaWdodCArIGxpbmVTcGFjaW5nKSAqIChsaW5lQ291bnQgKyAyKSArIGxpbmVTcGFjaW5nID5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFRleHQgaXMgaGlnaGVyIHRoYW4gdGhlIEZpZWxkT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbGFzdCBibGFua1xuXG4gICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBcIlwiO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IGZpcnN0V29yZEluTGluZTsgeCA8PSBsYXN0V29yZEluTGluZTsgeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjdXJyTGluZSA9IHRleHRTcGxpdFt4XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1PYmplY3QubXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PT0gbGFzdFdvcmRJbkxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gY3VyckxpbmVbY3VycldvcmRdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyV29yZCA9IChjdXJyV29yZCArIDEpICUgY3VyckxpbmUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PT0gZmlyc3RXb3JkSW5MaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lICs9IGN1cnJMaW5lW2N1cnJMaW5lLmxlbmd0aCAtIDFdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsaW5lICs9IGN1cnJMaW5lWzBdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGxhc3QgYmxhbmtcbiAgICAgICAgICAgICAgICBsaW5lID1cbiAgICAgICAgICAgICAgICBsaW5lLnN1YnN0cihsaW5lLmxlbmd0aCAtIDEpID09IFwiIFwiXG4gICAgICAgICAgICAgICAgICAgID8gbGluZS5zdWJzdHIoMCwgbGluZS5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICA6IGxpbmU7XG4gICAgICAgICAgICAgICAgLy8gbGFzdExlbmd0aCAtPSBibGFua1NwYWNlLndpZHRoO1xuICAgICAgICAgICAgICAgIGxhc3RMZW5ndGggPSBjYWxjdWxhdGVGb250U3BhY2UobGluZSwgZm9ybU9iamVjdCwgZm9udFNpemUpLndpZHRoO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHN0YXJ0WFxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZm9ybU9iamVjdC50ZXh0QWxpZ24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwicmlnaHRcIjpcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYID0gd2lkdGggLSBsYXN0TGVuZ3RoIC0gYm9yZGVyUGFkZGluZztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgICAgICAgICAgICBzdGFydFggPSAod2lkdGggLSBsYXN0TGVuZ3RoKSAvIDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYID0gYm9yZGVyUGFkZGluZztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRleHQgKz0gZjIoc3RhcnRYKSArIFwiIFwiICsgZjIobGFzdFkpICsgXCIgVGRcXG5cIjtcblxuICAgICAgICAgICAgICAgIGlmIChmb3JtT2JqZWN0LmlzVW5pY29kZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZm9udExpc3QgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZm9udExpc3Rbc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udCgpLmlkXSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBsaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgeDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZzogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRXNjYXBlOiBwZGZFc2NhcGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRm9udEtleTogc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udCgpLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzOiBmb250TGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVGb250U2l6ZTogZm9ybU9iamVjdC5mb250U2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMucHVibGlzaCgncG9zdFByb2Nlc3NUZXh0JywgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gJzwnICsgcGF5bG9hZC50ZXh0ICsgJz4gVGpcXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnKCcgKyBwZGZFc2NhcGUobGluZSkgKyAnKSBUalxcbic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHJlc2V0IFggaW4gUERGXG4gICAgICAgICAgICAgICAgdGV4dCArPSAtZjIoc3RhcnRYKSArIFwiIDAgVGRcXG5cIjtcblxuICAgICAgICAgICAgICAgIC8vIEFmdGVyIGEgTGluZSwgYWRqdXN0IHkgcG9zaXRpb25cbiAgICAgICAgICAgICAgICBsYXN0WSA9IC0oZm9udFNpemUgKyBsaW5lU3BhY2luZyk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZXNldCBmb3IgbmV4dCBpdGVyYXRpb24gc3RlcFxuICAgICAgICAgICAgICAgIGxhc3RMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGZpcnN0V29yZEluTGluZSA9IGlzV2l0aE5ld0xpbmUgPyBsYXN0V29yZEluTGluZSA6IGxhc3RXb3JkSW5MaW5lICsgMTtcbiAgICAgICAgICAgICAgICBsaW5lQ291bnQrKztcblxuICAgICAgICAgICAgICAgIGxhc3RMaW5lID0gXCJcIjtcbiAgICAgICAgICAgICAgICBjb250aW51ZSBMaW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm5WYWx1ZS50ZXh0ID0gdGV4dDtcbiAgICAgICAgcmV0dXJuVmFsdWUuZm9udFNpemUgPSBmb250U2l6ZTtcblxuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogU21hbGwgd29ya2Fyb3VuZCBmb3IgY2FsY3VsYXRpbmcgdGhlIFRleHRNZXRyaWMgYXBwcm94aW1hdGVseS5cbiAgICAqIFxuICAgICogQHBhcmFtIHRleHRcbiAgICAqIEBwYXJhbSBmb250c2l6ZVxuICAgICogQHJldHVybnMge1RleHRNZXRyaWNzfSAoSGFzIEhlaWdodCBhbmQgV2lkdGgpXG4gICAgKi9cbiAgICB2YXIgY2FsY3VsYXRlRm9udFNwYWNlID0gZnVuY3Rpb24gKHRleHQsIGZvcm1PYmplY3QsIGZvbnRTaXplKSB7XG4gICAgICAgIHZhciBmb250ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSk7XG4gICAgICAgIHZhciB3aWR0aCA9IHNjb3BlLmdldFN0cmluZ1VuaXRXaWR0aCh0ZXh0LCB7IGZvbnQ6IGZvbnQsIGZvbnRTaXplOiBwYXJzZUZsb2F0KGZvbnRTaXplKSwgY2hhclNwYWNlOiAwIH0pICogcGFyc2VGbG9hdChmb250U2l6ZSk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBzY29wZS5nZXRTdHJpbmdVbml0V2lkdGgoXCIzXCIsIHsgZm9udDogZm9udCwgZm9udFNpemU6IHBhcnNlRmxvYXQoZm9udFNpemUpLCBjaGFyU3BhY2U6IDAgfSkgKiBwYXJzZUZsb2F0KGZvbnRTaXplKSAqIDEuNTtcbiAgICAgICAgcmV0dXJuIHsgaGVpZ2h0OiBoZWlnaHQsIHdpZHRoOiB3aWR0aCB9O1xuICAgIH07XG5cbiAgICB2YXIgYWNyb2Zvcm1QbHVnaW5UZW1wbGF0ZSA9IHtcbiAgICAgICAgZmllbGRzOiBbXSxcbiAgICAgICAgeEZvcm1zOiBbXSxcbiAgICAgICAgLyoqXG4gICAgICAgICogYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQWNyb0Zvcm1cbiAgICAgICAgKiBEaWN0aW9uYXJ5IDA6IFRoZSBFdmVudC1Ub2tlbiwgdGhlIEFjcm9Gb3JtRGljdGlvbmFyeUNhbGxiYWNrIGhhc1xuICAgICAgICAqIDE6IFRoZSBPYmplY3QgSUQgb2YgdGhlIFJvb3RcbiAgICAgICAgKi9cbiAgICAgICAgYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdDogbnVsbCxcbiAgICAgICAgLyoqXG4gICAgICAgICogQWZ0ZXIgdGhlIFBERiBnZXRzIGV2YWx1YXRlZCwgdGhlIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBoYXMgdG8gYmVcbiAgICAgICAgKiByZXNldCwgdGhpcyBpbmRpY2F0ZXMsIHdoZXRoZXIgdGhlIHJvb3QgaGFzIGFscmVhZHkgYmVlbiBwcmludGVkXG4gICAgICAgICogb3V0XG4gICAgICAgICovXG4gICAgICAgIHByaW50ZWRPdXQ6IGZhbHNlLFxuICAgICAgICBpbnRlcm5hbDogbnVsbCxcbiAgICAgICAgaXNJbml0aWFsaXplZDogZmFsc2VcbiAgICB9O1xuXG4gICAgdmFyIGFubm90UmVmZXJlbmNlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vc2V0IG9iaklkIHRvIHVuZGVmaW5lZCBhbmQgZm9yY2UgaXQgdG8gZ2V0IGEgbmV3IG9iaklkIG9uIGJ1aWxkRG9jdW1lbnRcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGZpZWxkcyA9IHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuRmllbGRzO1xuICAgICAgICBmb3IgKHZhciBpIGluIGZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGZpZWxkcy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBmb3JtT2JqZWN0ID0gZmllbGRzW2ldO1xuICAgICAgICAgICAgICAgIC8vc2V0IG9iaklkIHRvIHVuZGVmaW5lZCBhbmQgZm9yY2UgaXQgdG8gZ2V0IGEgbmV3IG9iaklkIG9uIGJ1aWxkRG9jdW1lbnRcbiAgICAgICAgICAgICAgICBmb3JtT2JqZWN0Lm9iaklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIC8vIGFkZCBBbm5vdCBSZWZlcmVuY2UhXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1PYmplY3QuaGFzQW5ub3RhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZXMgYW4gQW5ub3RhdGlvbiBXaWRnZXQgaW4gdGhlIEZvcm0gT2JqZWN0LCBwdXQgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBpbiB0aGUgL0Fubm90IGFycmF5XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFubm90YXRpb25SZWZlcmVuY2UuY2FsbChzY29wZSwgZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBwdXRGb3JtID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgaWYgKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnByaW50ZWRPdXQpIHtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnByaW50ZWRPdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCkge1xuICAgICAgICAgICAgaW5pdGlhbGl6ZUFjcm9Gb3JtLmNhbGwoc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuRmllbGRzLnB1c2goZm9ybU9iamVjdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAqIENyZWF0ZSB0aGUgUmVmZXJlbmNlIHRvIHRoZSB3aWRnZXRBbm5vdGF0aW9uLCBzbyB0aGF0IGl0IGdldHMgcmVmZXJlbmNlZFxuICAgICogaW4gdGhlIEFubm90W10gaW50IHRoZSsgKFJlcXVpcmVzIHRoZSBBbm5vdGF0aW9uIFBsdWdpbilcbiAgICAqL1xuICAgIHZhciBjcmVhdGVBbm5vdGF0aW9uUmVmZXJlbmNlID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdyZWZlcmVuY2UnLFxuICAgICAgICAgICAgb2JqZWN0OiBvYmplY3RcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGZpbmRFbnRyeSA9IGZ1bmN0aW9uIChlbnRyeSkgeyByZXR1cm4gKGVudHJ5LnR5cGUgPT09IG9wdGlvbnMudHlwZSAmJiBlbnRyeS5vYmplY3QgPT09IG9wdGlvbnMub2JqZWN0KTsgfTtcbiAgICAgICAgaWYgKHNjb3BlLmludGVybmFsLmdldFBhZ2VJbmZvKG9iamVjdC5wYWdlKS5wYWdlQ29udGV4dC5hbm5vdGF0aW9ucy5maW5kKGZpbmRFbnRyeSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZ2V0UGFnZUluZm8ob2JqZWN0LnBhZ2UpLnBhZ2VDb250ZXh0LmFubm90YXRpb25zLnB1c2gob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2FsbGJhY2tzXG5cbiAgICB2YXIgcHV0Q2F0YWxvZ0NhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBQdXQgcmVmZXJlbmNlIHRvIEFjcm9Gb3JtIHRvIERvY3VtZW50Q2F0YWxvZ1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGZvciBzYWZldHksIHNob3VsZG4ndCBub3JtYWxseSBiZSB0aGUgY2FzZVxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwud3JpdGUoJy9BY3JvRm9ybSAnICsgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZCArICcgJyArIDAgKyAnIFInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHV0Q2F0YWxvZ0NhbGxiYWNrOiBSb290IG1pc3NpbmcuJyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBBZGRzIC9BY3JvZm9ybSBYIDAgUiB0byBEb2N1bWVudCBDYXRhbG9nLCBhbmQgY3JlYXRlcyB0aGUgQWNyb0Zvcm1cbiAgICAqIERpY3Rpb25hcnlcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybURpY3Rpb25hcnlDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGV2ZW50XG4gICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy51bnN1YnNjcmliZShzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Ll9ldmVudElEKTtcbiAgICAgICAgZGVsZXRlIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuX2V2ZW50SUQ7XG4gICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnByaW50ZWRPdXQgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIENyZWF0ZXMgdGhlIHNpbmdsZSBGaWVsZHMgYW5kIHdyaXRlcyB0aGVtIGludG8gdGhlIERvY3VtZW50XG4gICAgKiBcbiAgICAqIElmIGZpZWxkQXJyYXkgaXMgc2V0LCB1c2UgdGhlIGZpZWxkcyB0aGF0IGFyZSBpbnNpZGUgaXQgaW5zdGVhZCBvZiB0aGVcbiAgICAqIGZpZWxkcyBmcm9tIHRoZSBBY3JvUm9vdCAoZm9yIHRoZSBGb3JtWE9iamVjdHMuLi4pXG4gICAgKi9cbiAgICB2YXIgY3JlYXRlRmllbGRDYWxsYmFjayA9IGZ1bmN0aW9uIChmaWVsZEFycmF5KSB7XG4gICAgICAgIHZhciBzdGFuZGFyZEZpZWxkcyA9ICghZmllbGRBcnJheSk7XG5cbiAgICAgICAgaWYgKCFmaWVsZEFycmF5KSB7XG4gICAgICAgICAgICAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGZpZWxkQXJyYXkgc3BlY2lmaWVkLCB3ZSB3YW50IHRvIHByaW50IG91dFxuICAgICAgICAgICAgLy8gdGhlIEZpZWxkcyBvZiB0aGUgQWNyb0Zvcm1cbiAgICAgICAgICAgIC8vIFByaW50IG91dCBSb290XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5uZXdPYmplY3REZWZlcnJlZEJlZ2luKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Qub2JqSWQsIHRydWUpO1xuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5wdXRTdHJlYW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkQXJyYXkgPSBmaWVsZEFycmF5IHx8IHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuS2lkcztcblxuICAgICAgICBmb3IgKHZhciBpIGluIGZpZWxkQXJyYXkpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZEFycmF5Lmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkT2JqZWN0ID0gZmllbGRBcnJheVtpXTtcbiAgICAgICAgICAgICAgICB2YXIga2V5VmFsdWVMaXN0ID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG9sZFJlY3QgPSBmaWVsZE9iamVjdC5SZWN0O1xuXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkT2JqZWN0LlJlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRPYmplY3QuUmVjdCA9IGNhbGN1bGF0ZUNvb3JkaW5hdGVzLmNhbGwodGhpcywgZmllbGRPYmplY3QuUmVjdCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgV3JpdGluZyB0aGUgT2JqZWN0XG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihmaWVsZE9iamVjdC5vYmpJZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBmaWVsZE9iamVjdC5EQSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5jcmVhdGVEZWZhdWx0QXBwZWFyYW5jZVN0cmVhbShmaWVsZE9iamVjdCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkT2JqZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBmaWVsZE9iamVjdC5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QgPSBmaWVsZE9iamVjdC5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmaWVsZE9iamVjdC5SZWN0ID0gb2xkUmVjdDtcblxuICAgICAgICAgICAgICAgIGlmIChmaWVsZE9iamVjdC5oYXNBcHBlYXJhbmNlU3RyZWFtICYmICFmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgQXBwZWFyYW5jZVxuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZSA9IGNhbGN1bGF0ZUFwcGVhcmFuY2VTdHJlYW0uY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiAnQVAnLCB2YWx1ZTogXCI8PC9OIFwiICsgYXBwZWFyYW5jZSArIFwiPj5cIiB9KTtcblxuICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMucHVzaChhcHBlYXJhbmNlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBc3N1bWUgQXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgaXMgYSBBcnJheSB3aXRoIE4sUixEIChhdCBsZWFzdFxuICAgICAgICAgICAgICAgIC8vIG9uZSBvZiB0aGVtISlcbiAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgTixSIGFuZCBEXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudC5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50W2tdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKz0gKFwiL1wiICsgayArIFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IFwiPDxcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA+PSAxIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGVhcmFuY2VTdHJlYW0gaXMgYW4gQXJyYXkgb3IgT2JqZWN0IVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gdmFsdWVbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgRnVuY3Rpb24gaXMgcmVmZXJlbmNlZCwgY2FsbCBpdCBpbiBvcmRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBnZXQgdGhlIEZvcm1YT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IG9iai5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSAoXCIvXCIgKyBpICsgXCIgXCIgKyBvYmogKyBcIiBcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBYRm9ybSBpcyBhbHJlYWR5IHVzZWQsIGUuZy4gT2ZmU3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBDaGVja0JveGVzLCBkb24ndCBhZGQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMuaW5kZXhPZihvYmopID49IDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMucHVzaChvYmopO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIEZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQsIGNhbGwgaXQgaW4gb3JkZXIgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgRm9ybVhPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IG9iai5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IChcIi9cIiArIGkgKyBcIiBcIiArIG9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5pbmRleE9mKG9iaikgPj0gMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMucHVzaChvYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IFwiPj5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFwcGVhcmFuY2Ugc3RyZWFtIGlzIGEgbm9ybWFsIE9iamVjdC4uXG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiAnQVAnLCB2YWx1ZTogXCI8PFxcblwiICsgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArIFwiPj5cIiB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5wdXRTdHJlYW0oeyBhZGRpdGlvbmFsS2V5VmFsdWVzOiBrZXlWYWx1ZUxpc3QgfSk7XG5cbiAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5vdXQoXCJlbmRvYmpcIik7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhbmRhcmRGaWVsZHMpIHtcbiAgICAgICAgICAgIGNyZWF0ZVhGb3JtT2JqZWN0Q2FsbGJhY2suY2FsbCh0aGlzLCBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBjcmVhdGVYRm9ybU9iamVjdENhbGxiYWNrID0gZnVuY3Rpb24gKGZpZWxkQXJyYXkpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBmaWVsZEFycmF5KSB7XG4gICAgICAgICAgICBpZiAoZmllbGRBcnJheS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBpO1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZE9iamVjdCA9IGZpZWxkQXJyYXlbaV07XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgV3JpdGluZyB0aGUgT2JqZWN0XG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihmaWVsZE9iamVjdCAmJiBmaWVsZE9iamVjdC5vYmpJZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkT2JqZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBmaWVsZE9iamVjdC5wdXRTdHJlYW0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZE9iamVjdC5wdXRTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGZpZWxkQXJyYXlba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgaW5pdGlhbGl6ZUFjcm9Gb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbCAhPT0gdW5kZWZpbmVkICYmICh0aGlzLmludGVybmFsLmFjcm9mb3JtUGx1Z2luID09PSB1bmRlZmluZWQgfHwgdGhpcy5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5pc0luaXRpYWxpemVkID09PSBmYWxzZSkpIHtcblxuICAgICAgICAgICAgc2NvcGUgPSB0aGlzO1xuXG4gICAgICAgICAgICBBY3JvRm9ybUZpZWxkLkZpZWxkTnVtID0gMDtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFjcm9mb3JtUGx1Z2luVGVtcGxhdGUpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeGNlcHRpb24gd2hpbGUgY3JlYXRpbmcgQWNyb2Zvcm1EaWN0aW9uYXJ5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NhbGVGYWN0b3IgPSBzY29wZS5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgICAgIC8vIFRoZSBPYmplY3QgTnVtYmVyIG9mIHRoZSBBY3JvRm9ybSBEaWN0aW9uYXJ5XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290ID0gbmV3IEFjcm9Gb3JtRGljdGlvbmFyeSgpO1xuXG4gICAgICAgICAgICAvLyBhZGQgQ2FsbGJhY2sgZm9yIGNyZWF0aW5nIHRoZSBBY3JvRm9ybSBEaWN0aW9uYXJ5XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Ll9ldmVudElEID0gc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgncG9zdFB1dFJlc291cmNlcycsIEFjcm9Gb3JtRGljdGlvbmFyeUNhbGxiYWNrKTtcblxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnYnVpbGREb2N1bWVudCcsIGFubm90UmVmZXJlbmNlQ2FsbGJhY2spOyAvLyBidWlsZERvY3VtZW50XG5cbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGV2ZW50LCB0aGF0IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBEb2N1bWVudENhdGFsb2cgaXNcbiAgICAgICAgICAgIC8vIHdyaXR0ZW4sIGluIG9yZGVyIHRvIGFkZCAvQWNyb0Zvcm1cbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ3B1dENhdGFsb2cnLCBwdXRDYXRhbG9nQ2FsbGJhY2spO1xuXG4gICAgICAgICAgICAvLyBSZWdpc3RlciBldmVudCwgdGhhdCBjcmVhdGVzIGFsbCBGaWVsZHNcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ3Bvc3RQdXRQYWdlcycsIGNyZWF0ZUZpZWxkQ2FsbGJhY2spO1xuXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgMjYsIDcuMy42XG4gICAgdmFyIGFycmF5VG9QZGZBcnJheSA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5hcnJheVRvUGRmQXJyYXkgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9ICdbJztcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9ICcgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgYXJyYXlbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGFycmF5W2ldLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXS5zdWJzdHIoMCwgMSkgIT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gJygnICsgcGRmRXNjYXBlKGFycmF5W2ldLnRvU3RyaW5nKCkpICsgJyknO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGFycmF5W2ldLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZW50ICs9ICddJztcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuX19hY3JvZm9ybV9fLmFycmF5VG9QZGZBcnJheScpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gZ2V0TWF0Y2hlcyhzdHJpbmcsIHJlZ2V4LCBpbmRleCkge1xuICAgICAgICBpbmRleCB8fCAoaW5kZXggPSAxKTsgLy8gZGVmYXVsdCB0byB0aGUgZmlyc3QgY2FwdHVyaW5nIGdyb3VwXG4gICAgICAgIHZhciBtYXRjaGVzID0gW107XG4gICAgICAgIHZhciBtYXRjaDtcbiAgICAgICAgd2hpbGUgKG1hdGNoID0gcmVnZXguZXhlYyhzdHJpbmcpKSB7XG4gICAgICAgICAgICBtYXRjaGVzLnB1c2gobWF0Y2hbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICB9XG4gICAgdmFyIHBkZkFycmF5VG9TdHJpbmdBcnJheSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgYXJyYXkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGdldE1hdGNoZXMoYXJyYXksIC9cXCgoLio/KVxcKS9nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICB2YXIgdG9QZGZTdHJpbmcgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHN0cmluZyB8fCBcIlwiO1xuICAgICAgICBzdHJpbmcudG9TdHJpbmcoKTtcbiAgICAgICAgc3RyaW5nID0gJygnICsgcGRmRXNjYXBlKHN0cmluZykgKyAnKSc7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgfTtcblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gICAgLy8gQ2xhc3Nlc1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVBERk9iamVjdFxuICAgICogQGNsYXNzZGVzYyBBIEFjcm9Gb3JtUERGT2JqZWN0XG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1QREZPYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfb2JqSWQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1QREZPYmplY3Qjb2JqSWRcbiAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ29iaklkJywge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfb2JqSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX29iaklkID0gc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vYmpJZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX29iaklkID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBmdW5jdGlvbiBBY3JvRm9ybVBERk9iamVjdC50b1N0cmluZ1xuICAgICovXG4gICAgQWNyb0Zvcm1QREZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYmpJZCArIFwiIDAgUlwiO1xuICAgIH07XG5cbiAgICBBY3JvRm9ybVBERk9iamVjdC5wcm90b3R5cGUucHV0U3RyZWFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIga2V5VmFsdWVMaXN0ID0gdGhpcy5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0oKTtcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwucHV0U3RyZWFtKHsgZGF0YTogdGhpcy5zdHJlYW0sIGFkZGl0aW9uYWxLZXlWYWx1ZXM6IGtleVZhbHVlTGlzdCB9KTtcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwub3V0KFwiZW5kb2JqXCIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgYW4ga2V5LXZhbHVlLUxpc3Qgb2YgYWxsIG5vbi1jb25maWd1cmFibGUgVmFyaWFibGVzIGZyb20gdGhlIE9iamVjdFxuICAgICogXG4gICAgKiBAbmFtZSBnZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW1cbiAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgKi9cbiAgICBBY3JvRm9ybVBERk9iamVjdC5wcm90b3R5cGUuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY3JlYXRlS2V5VmFsdWVMaXN0RnJvbUZpZWxkT2JqZWN0ID0gZnVuY3Rpb24gKGZpZWxkT2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIga2V5VmFsdWVMaXN0ID0gW107XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGZpZWxkT2JqZWN0KS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoa2V5ICE9ICdjb250ZW50JyAmJiBrZXkgIT0gJ2FwcGVhcmFuY2VTdHJlYW1Db250ZW50JyAmJiBrZXkuc3Vic3RyaW5nKDAsIDEpICE9IFwiX1wiKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIGtleXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmaWVsZE9iamVjdCwga2V5c1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5RGVzY3JpcHRvciAmJiBwcm9wZXJ0eURlc2NyaXB0b3IuY29uZmlndXJhYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZmllbGRPYmplY3Rba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleToga2V5LCB2YWx1ZTogYXJyYXlUb1BkZkFycmF5KHZhbHVlKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBBY3JvRm9ybVBERk9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgaXQgaXMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBQREZPYmplY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSB0aGUgcmVmZXJlbmNlIG51bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZS5vYmpJZCArIFwiIDAgUlwiIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlWYWx1ZUxpc3Q7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUtleVZhbHVlTGlzdEZyb21GaWVsZE9iamVjdCh0aGlzKTtcbiAgICB9O1xuXG4gICAgdmFyIEFjcm9Gb3JtWE9iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1QREZPYmplY3QuY2FsbCh0aGlzKTtcblxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVHlwZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiBcIi9YT2JqZWN0XCIsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnU3VidHlwZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiBcIi9Gb3JtXCIsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRm9ybVR5cGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9CQm94ID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnQkJveCcsIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0JCb3g7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQkJveCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1Jlc291cmNlcycsIHtcbiAgICAgICAgICAgIHZhbHVlOiBcIjIgMCBSXCIsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfc3RyZWFtO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3N0cmVhbScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfc3RyZWFtID0gdmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3RyZWFtO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGluaGVyaXQoQWNyb0Zvcm1YT2JqZWN0LCBBY3JvRm9ybVBERk9iamVjdCk7XG5cbiAgICB2YXIgQWNyb0Zvcm1EaWN0aW9uYXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybVBERk9iamVjdC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHZhciBfS2lkcyA9IFtdO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnS2lkcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9LaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9LaWRzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGaWVsZHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0tpZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERlZmF1bHQgQXBwZWFyYW5jZVxuICAgICAgICB2YXIgX0RBO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0RBJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfREEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICcoJyArIF9EQSArICcpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0RBID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpbmhlcml0KEFjcm9Gb3JtRGljdGlvbmFyeSwgQWNyb0Zvcm1QREZPYmplY3QpO1xuXG4gICAgLyoqXG4gICAgKiBUaGUgRmllbGQgT2JqZWN0IGNvbnRhaW5zIHRoZSBWYXJpYWJsZXMsIHRoYXQgZXZlcnkgRmllbGQgbmVlZHNcbiAgICAqIFxuICAgICogQGNsYXNzIEFjcm9Gb3JtRmllbGRcbiAgICAqIEBjbGFzc2Rlc2MgQW4gQWNyb0Zvcm0gRmllbGRPYmplY3RcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybVBERk9iamVjdC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8vQW5ub3RhdGlvbi1GbGFnIFNlZSBUYWJsZSAxNjVcbiAgICAgICAgdmFyIF9GID0gNDtcbiAgICAgICAgdGhpcy5pc1VuaWNvZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50cnVlVmFsdWUgPSAnJztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9GO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX0YgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgZm9yIGF0dHJpYnV0ZSBGIHN1cHBsaWVkLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjIpIElmIHNldCwgcHJpbnQgdGhlIGFubm90YXRpb24gd2hlbiB0aGUgcGFnZSBpcyBwcmludGVkLiBJZiBjbGVhciwgbmV2ZXIgcHJpbnQgdGhlIGFubm90YXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2V0aGVyIGlzIGlzIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuLiBcbiAgICAgICAgKiBOT1RFIDIgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBhbm5vdGF0aW9ucyByZXByZXNlbnRpbmcgaW50ZXJhY3RpdmUgcHVzaGJ1dHRvbnMsIHdoaWNoIHdvdWxkIHNlcnZlIG5vIG1lYW5pbmdmdWwgcHVycG9zZSBvbiB0aGUgcHJpbnRlZCBwYWdlLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNzaG93V2hlblByaW50ZWRcbiAgICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2hvd1doZW5QcmludGVkJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZihfRiwgMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRiA9IHNldEJpdEZvclBkZihfRiwgMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GID0gY2xlYXJCaXRGb3JQZGYoX0YsIDMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9GZiA9IDA7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRmYnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0ZmO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX0ZmID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhdHRyaWJ1dGUgRmYgc3VwcGxpZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX1JlY3QgPSBbXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdSZWN0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9SZWN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX1JlY3Q7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9SZWN0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX1JlY3QgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSB4LXBvc2l0aW9uIG9mIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjeFxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3gnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbMF0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbMF0gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSB5LXBvc2l0aW9uIG9mIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjeVxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3knLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbMV0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbMV0gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3dpZHRoXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnd2lkdGgnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFsyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbMl0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbMl0gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNoZWlnaHRcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoZWlnaHQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbM10pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbM10gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfRlQgPSBcIlwiO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0ZUJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0ZUXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJy9CdG4nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcvVHgnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcvQ2gnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcvU2lnJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9GVCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgZm9yIGF0dHJpYnV0ZSBGVCBzdXBwbGllZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfVCA9IG51bGw7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdUJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9UIHx8IF9ULmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBhIENoaWxkIGZyb20gYSBSYWRpb8K0R3JvdXAsIHlvdSBkb24ndCBuZWVkIGEgRmllbGROYW1lXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1DaGlsZENsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF9UID0gXCJGaWVsZE9iamVjdFwiICsgKEFjcm9Gb3JtRmllbGQuRmllbGROdW0rKyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnKCcgKyBwZGZFc2NhcGUoX1QpICsgJyknO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1QgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBwYXJ0aWFsIGZpZWxkIG5hbWUgKHNlZSAxMi43LjMuMiwg4oCcRmllbGQgTmFtZXPigJ0pLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNmaWVsZE5hbWVcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmaWVsZE5hbWUnLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9UO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1QgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9mb250TmFtZSA9ICdoZWx2ZXRpY2EnO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgZm9udE5hbWUgb2YgdGhlIGZvbnQgdG8gYmUgdXNlZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZm9udE5hbWVcbiAgICAgICAgKiBAZGVmYXVsdCAnaGVsdmV0aWNhJ1xuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZm9udE5hbWUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mb250TmFtZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9mb250TmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2ZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgZm9udFN0eWxlIG9mIHRoZSBmb250IHRvIGJlIHVzZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2ZvbnRTdHlsZVxuICAgICAgICAqIEBkZWZhdWx0ICdub3JtYWwnXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmb250U3R5bGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mb250U3R5bGU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfZm9udFN0eWxlID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfZm9udFNpemUgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgZm9udFNpemUgb2YgdGhlIGZvbnQgdG8gYmUgdXNlZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZm9udFNpemVcbiAgICAgICAgKiBAZGVmYXVsdCAwIChmb3IgYXV0bylcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZvbnRTaXplJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX2ZvbnRTaXplKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9mb250U2l6ZSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9tYXhGb250U2l6ZSA9IDUwO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgbWF4aW11bSBmb250U2l6ZSBvZiB0aGUgZm9udCB0byBiZSB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNtYXhGb250U2l6ZVxuICAgICAgICAqIEBkZWZhdWx0IDAgKGZvciBhdXRvKVxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbWF4Rm9udFNpemUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFudGlTY2FsZShfbWF4Rm9udFNpemUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX21heEZvbnRTaXplID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2NvbG9yID0gJ2JsYWNrJztcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGNvbG9yIG9mIHRoZSB0ZXh0XG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2NvbG9yXG4gICAgICAgICogQGRlZmF1bHQgJ2JsYWNrJ1xuICAgICAgICAqIEB0eXBlIHtzdHJpbmd8cmdiYX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb2xvcicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX2NvbG9yID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfREEgPSAnL0YxIDAgVGYgMCBnJztcbiAgICAgICAgLy8gRGVmaW5lcyB0aGUgZGVmYXVsdCBhcHBlYXJhbmNlIChOZWVkZWQgZm9yIHZhcmlhYmxlIFRleHQpXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnREEnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX0RBXG4gICAgICAgICAgICAgICAgICAgIHx8IHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUNoaWxkQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgfHwgdGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtVGV4dEZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0b1BkZlN0cmluZyhfREEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIF9EQSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIHZhciBfRFYgPSBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0RWJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfRFYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9QZGZTdHJpbmcoX0RWKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9EVjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdWJzdHIoMCwgMSkgPT09ICcoJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgX0RWID0gcGRmVW5lc2NhcGUodmFsdWUuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCAtIDIpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9EViA9IHBkZlVuZXNjYXBlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9EViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsOyBpbmhlcml0YWJsZSkgVGhlIGRlZmF1bHQgdmFsdWUgdG8gd2hpY2ggdGhlIGZpZWxkIHJldmVydHMgd2hlbiBhIHJlc2V0LWZvcm0gYWN0aW9uIGlzIGV4ZWN1dGVkIChzZWUgMTIuNy41LjMsIOKAnFJlc2V0LUZvcm0gQWN0aW9u4oCdKS4gVGhlIGZvcm1hdCBvZiB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdmFsdWUuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNkZWZhdWx0VmFsdWVcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkZWZhdWx0VmFsdWUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwZGZVbmVzY2FwZShfRFYuc3Vic3RyKDEsIF9EVi5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9EVjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9EViA9ICcvJyArIHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9EViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9WID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdWJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbmljb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfVjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFfVikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b1BkZlN0cmluZyhfVik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfVjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1VuaWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX1YgPSB0b1VuaWNvZGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRydWVWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN1YnN0cigwLCAxKSA9PT0gJygnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX1YgPSBwZGZVbmVzY2FwZSh2YWx1ZS5zdWJzdHIoMSwgdmFsdWUubGVuZ3RoIC0gMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfViA9IHBkZlVuZXNjYXBlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9WID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbDsgaW5oZXJpdGFibGUpIFRoZSBmaWVsZOKAmXMgdmFsdWUsIHdob3NlIGZvcm1hdCB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlLiBTZWUgdGhlIGRlc2NyaXB0aW9ucyBvZiBpbmRpdmlkdWFsIGZpZWxkIHR5cGVzIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjdmFsdWVcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd2YWx1ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBkZlVuZXNjYXBlKF9WLnN1YnN0cigxLCBfVi5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9WO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX1YgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ2hlY2sgaWYgZmllbGQgaGFzIGFubm90YXRpb25zXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2hhc0Fubm90YXRpb25cbiAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoYXNBbm5vdGF0aW9uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5SZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdUeXBlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuaGFzQW5ub3RhdGlvbikgPyBcIi9Bbm5vdFwiIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdTdWJ0eXBlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuaGFzQW5ub3RhdGlvbikgPyBcIi9XaWRnZXRcIiA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfaGFzQXBwZWFyYW5jZVN0cmVhbSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgKiB0cnVlIGlmIGZpZWxkIGhhcyBhbiBhcHBlYXJhbmNlU3RyZWFtXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2hhc0FwcGVhcmFuY2VTdHJlYW1cbiAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoYXNBcHBlYXJhbmNlU3RyZWFtJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfaGFzQXBwZWFyYW5jZVN0cmVhbTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgX2hhc0FwcGVhcmFuY2VTdHJlYW0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIHBhZ2Ugb24gd2hpY2ggdGhlIEFjcm9Gb3JtRmllbGQgaXMgcGxhY2VkXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3BhZ2VcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICB2YXIgX3BhZ2U7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncGFnZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9wYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfcGFnZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX3BhZ2UgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgdXNlciBtYXkgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLiBBbnkgYXNzb2NpYXRlZCB3aWRnZXQgYW5ub3RhdGlvbnMgd2lsbCBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgdXNlcjsgdGhhdCBpcywgdGhleSB3aWxsIG5vdCByZXNwb25kIHRvIG1vdXNlIGNsaWNrcyBvciBjaGFuZ2UgdGhlaXIgYXBwZWFyYW5jZSBpbiByZXNwb25zZSB0byBtb3VzZSBtb3Rpb25zLiBUaGlzIGZsYWcgaXMgdXNlZnVsIGZvciBmaWVsZHMgd2hvc2UgdmFsdWVzIGFyZSBjb21wdXRlZCBvciBpbXBvcnRlZCBmcm9tIGEgZGF0YWJhc2UuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNyZWFkT25seVxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmVhZE9ubHknLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIGhhdmUgYSB2YWx1ZSBhdCB0aGUgdGltZSBpdCBpcyBleHBvcnRlZCBieSBhIHN1Ym1pdGZvcm0gYWN0aW9uIChzZWUgMTIuNy41LjIsIOKAnFN1Ym1pdC1Gb3JtIEFjdGlvbuKAnSkuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNyZXF1aXJlZFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmVxdWlyZWQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIG5vdCBiZSBleHBvcnRlZCBieSBhIHN1Ym1pdC1mb3JtIGFjdGlvbiAoc2VlIDEyLjcuNS4yLCDigJxTdWJtaXQtRm9ybSBBY3Rpb27igJ0pXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI25vRXhwb3J0XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdub0V4cG9ydCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICB2YXIgX1EgPSBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1EnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfUSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX1E7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoWzAsIDEsIDJdLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBfUSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBmb3IgYXR0cmlidXRlIFEgc3VwcGxpZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWw7IGluaGVyaXRhYmxlKSBBIGNvZGUgc3BlY2lmeWluZyB0aGUgZm9ybSBvZiBxdWFkZGluZyAoanVzdGlmaWNhdGlvbikgdGhhdCBzaGFsbCBiZSB1c2VkIGluIGRpc3BsYXlpbmcgdGhlIHRleHQ6XG4gICAgICAgICogJ2xlZnQnLCAnY2VudGVyJywgJ3JpZ2h0J1xuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCN0ZXh0QWxpZ25cbiAgICAgICAgKiBAZGVmYXVsdCAnbGVmdCdcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RleHRBbGlnbicsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfUSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAnbGVmdCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJ2NlbnRlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJ3JpZ2h0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfUSA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX1EgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfUSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH07XG5cbiAgICBpbmhlcml0KEFjcm9Gb3JtRmllbGQsIEFjcm9Gb3JtUERGT2JqZWN0KTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUNob2ljZUZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIC8vIEZpZWxkIFR5cGUgPSBDaG9pY2UgRmllbGRcbiAgICAgICAgdGhpcy5GVCA9IFwiL0NoXCI7XG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5WID0gJygpJztcblxuICAgICAgICB0aGlzLmZvbnROYW1lID0gJ3phcGZkaW5nYmF0cyc7XG4gICAgICAgIC8vIFRvcCBJbmRleFxuICAgICAgICB2YXIgX1RJID0gMDtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1RJJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX1RJO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1RJID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE1LIGZpeCBmb3IgQWNyb2JhdFxuICAgICAgICB2YXIgX01LID0gJzw8IC9CRyBbIDAuOTc1IDAuOTc1IDAuOTc1IF0gID4+JztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdNSycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NSztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9NSyA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBzY3JvbGxhYmxlIGxpc3QgYm94ZXMsIHRoZSB0b3AgaW5kZXggKHRoZSBpbmRleCBpbiB0aGUgT3B0IGFycmF5IG9mIHRoZSBmaXJzdCBvcHRpb24gdmlzaWJsZSBpbiB0aGUgbGlzdCkuIERlZmF1bHQgdmFsdWU6IDAuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCN0b3BJbmRleFxuICAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RvcEluZGV4Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfVEk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfVEkgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9PcHQgPSBbXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdPcHQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW5pY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlUb1BkZlVuaWNvZGVBcnJheShfT3B0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9QZGZBcnJheShfT3B0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9PcHQgPSBwZGZBcnJheVRvU3RyaW5nQXJyYXkodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBtZW1iZXJvZiBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgICAgICogQG5hbWUgZ2V0T3B0aW9uc1xuICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAqIEByZXR1cm5zIHthcnJheX0gYXJyYXkgb2YgT3B0aW9uc1xuICAgICAgICAqL1xuICAgICAgICB0aGlzLmdldE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX09wdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBtZW1iZXJvZiBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgICAgICogQG5hbWUgc2V0T3B0aW9uc1xuICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IHZhbHVlXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgX09wdCA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ydCkge1xuICAgICAgICAgICAgICAgIF9PcHQuc29ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG1lbWJlcm9mIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAgICAgKiBAbmFtZSBhZGRPcHRpb25cbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hZGRPcHRpb24gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIF9PcHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3J0KSB7XG4gICAgICAgICAgICAgICAgX09wdC5zb3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbWVtYmVyb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICAgICAqIEBuYW1lIHJlbW92ZU9wdGlvblxuICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsRW50cmllcyAoZGVmYXVsdDogZmFsc2UpXG4gICAgICAgICovXG4gICAgICAgIHRoaXMucmVtb3ZlT3B0aW9uID0gZnVuY3Rpb24gKHZhbHVlLCBhbGxFbnRyaWVzKSB7XG4gICAgICAgICAgICBhbGxFbnRyaWVzID0gYWxsRW50cmllcyB8fCBmYWxzZVxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSB8fCBcIlwiO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICB3aGlsZSAoX09wdC5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBfT3B0LnNwbGljZShfT3B0LmluZGV4T2YodmFsdWUpLCAxKTtcbiAgICAgICAgICAgICAgICBpZiAoYWxsRW50cmllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGEgY29tYm8gYm94OyBpZiBjbGVhciwgdGhlIGZpZWxkIGlzIGEgbGlzdCBib3guIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNjb21ib1xuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29tYm8nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE4KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxOCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGNvbWJvIGJveCBzaGFsbCBpbmNsdWRlIGFuIGVkaXRhYmxlIHRleHQgYm94IGFzIHdlbGwgYXMgYSBkcm9wLWRvd24gbGlzdDsgaWYgY2xlYXIsIGl0IHNoYWxsIGluY2x1ZGUgb25seSBhIGRyb3AtZG93biBsaXN0LiBUaGlzIGZsYWcgc2hhbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBDb21ibyBmbGFnIGlzIHNldC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI2VkaXRcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2VkaXQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE5KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgNDQ0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tYm8gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE5KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxOSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxk4oCZcyBvcHRpb24gaXRlbXMgc2hhbGwgYmUgc29ydGVkIGFscGhhYmV0aWNhbGx5LiBUaGlzIGZsYWcgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSB3cml0ZXJzLCBub3QgYnkgcmVhZGVycy4gQ29uZm9ybWluZyByZWFkZXJzIHNoYWxsIGRpc3BsYXkgdGhlIG9wdGlvbnMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXIgaW4gdGhlIE9wdCBhcnJheSAoc2VlIFRhYmxlIDIzMSkuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNzb3J0XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzb3J0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjApO1xuICAgICAgICAgICAgICAgICAgICBfT3B0LnNvcnQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgbW9yZSB0aGFuIG9uZSBvZiB0aGUgZmllbGTigJlzIG9wdGlvbiBpdGVtcyBtYXkgYmUgc2VsZWN0ZWQgc2ltdWx0YW5lb3VzbHk7IGlmIGNsZWFyLCBhdCBtb3N0IG9uZSBpdGVtIHNoYWxsIGJlIHNlbGVjdGVkIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNtdWx0aVNlbGVjdFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbXVsdGlTZWxlY3QnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIyKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMik7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgc3BlbGxjaGVja2VkLiBUaGlzIGZsYWcgc2hhbGwgbm90IGJlIHVzZWQgdW5sZXNzIHRoZSBDb21ibyBhbmQgRWRpdCBmbGFncyBhcmUgYm90aCBzZXQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNkb05vdFNwZWxsQ2hlY2tcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2RvTm90U3BlbGxDaGVjaycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjUpIElmIHNldCwgdGhlIG5ldyB2YWx1ZSBzaGFsbCBiZSBjb21taXR0ZWQgYXMgc29vbiBhcyBhIHNlbGVjdGlvbiBpcyBtYWRlIChjb21tb25seSB3aXRoIHRoZSBwb2ludGluZyBkZXZpY2UpLiBJbiB0aGlzIGNhc2UsIHN1cHBseWluZyBhIHZhbHVlIGZvciBhIGZpZWxkIGludm9sdmVzIHRocmVlIGFjdGlvbnM6IHNlbGVjdGluZyB0aGUgZmllbGQgZm9yIGZpbGwtaW4sIHNlbGVjdGluZyBhIGNob2ljZSBmb3IgdGhlIGZpbGwtaW4gdmFsdWUsIGFuZCBsZWF2aW5nIHRoYXQgZmllbGQsIHdoaWNoIGZpbmFsaXplcyBvciDigJxjb21taXRz4oCdIHRoZSBkYXRhIGNob2ljZSBhbmQgdHJpZ2dlcnMgYW55IGFjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRyeSBvciBjaGFuZ2luZyBvZiB0aGlzIGRhdGEuIElmIHRoaXMgZmxhZyBpcyBvbiwgdGhlbiBwcm9jZXNzaW5nIGRvZXMgbm90IHdhaXQgZm9yIGxlYXZpbmcgdGhlIGZpZWxkIGFjdGlvbiB0byBvY2N1ciwgYnV0IGltbWVkaWF0ZWx5IHByb2NlZWRzIHRvIHRoZSB0aGlyZCBzdGVwLlxuICAgICAgICAqIFRoaXMgb3B0aW9uIGVuYWJsZXMgYXBwbGljYXRpb25zIHRvIHBlcmZvcm0gYW4gYWN0aW9uIG9uY2UgYSBzZWxlY3Rpb24gaXMgbWFkZSwgd2l0aG91dCByZXF1aXJpbmcgdGhlIHVzZXIgdG8gZXhpdCB0aGUgZmllbGQuIElmIGNsZWFyLCB0aGUgbmV3IHZhbHVlIGlzIG5vdCBjb21taXR0ZWQgdW50aWwgdGhlIHVzZXIgZXhpdHMgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNjb21taXRPblNlbENoYW5nZVxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29tbWl0T25TZWxDaGFuZ2UnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI3KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyNyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDI3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgdGhpcy5oYXNBcHBlYXJhbmNlU3RyZWFtID0gZmFsc2U7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQ2hvaWNlRmllbGQsIEFjcm9Gb3JtRmllbGQpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1MaXN0Qm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1MaXN0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUNob2ljZUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuZm9udE5hbWUgPSAnaGVsdmV0aWNhJztcblxuICAgICAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgNDQ0XG4gICAgICAgIHRoaXMuY29tYm8gPSBmYWxzZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1MaXN0Qm94LCBBY3JvRm9ybUNob2ljZUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtQ29tYm9Cb3ggXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUxpc3RCb3hcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUNvbWJvQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUxpc3RCb3guY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb21ibyA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQ29tYm9Cb3gsIEFjcm9Gb3JtTGlzdEJveCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUVkaXRCb3ggXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNvbWJvQm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUxpc3RCb3hcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUVkaXRCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQ29tYm9Cb3guY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5lZGl0ID0gdHJ1ZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1FZGl0Qm94LCBBY3JvRm9ybUNvbWJvQm94KTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1CdXR0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtRmllbGQuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5GVCA9IFwiL0J0blwiO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChSYWRpbyBidXR0b25zIG9ubHkpIElmIHNldCwgZXhhY3RseSBvbmUgcmFkaW8gYnV0dG9uIHNoYWxsIGJlIHNlbGVjdGVkIGF0IGFsbCB0aW1lczsgc2VsZWN0aW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYnV0dG9uIGhhcyBubyBlZmZlY3QuIElmIGNsZWFyLCBjbGlja2luZyB0aGUgc2VsZWN0ZWQgYnV0dG9uIGRlc2VsZWN0cyBpdCwgbGVhdmluZyBubyBidXR0b24gc2VsZWN0ZWQuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jbm9Ub2dnbGVUb09mZlxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ25vVG9nZ2xlVG9PZmYnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE1KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxNSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE1KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGEgc2V0IG9mIHJhZGlvIGJ1dHRvbnM7IGlmIGNsZWFyLCB0aGUgZmllbGQgaXMgYSBjaGVja2JveC4gVGhpcyBmbGFnIG1heSBiZSBzZXQgb25seSBpZiB0aGUgUHVzaGJ1dHRvbiBmbGFnIGlzIGNsZWFyLiBcbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNyYWRpb1xuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JhZGlvJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIHB1c2hidXR0b24gdGhhdCBkb2VzIG5vdCByZXRhaW4gYSBwZXJtYW5lbnQgdmFsdWUuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jcHVzaEJ1dHRvblxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3B1c2hCdXR0b24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE3KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxNyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS41KSBJZiBzZXQsIGEgZ3JvdXAgb2YgcmFkaW8gYnV0dG9ucyB3aXRoaW4gYSByYWRpbyBidXR0b24gZmllbGQgdGhhdCB1c2UgdGhlIHNhbWUgdmFsdWUgZm9yIHRoZSBvbiBzdGF0ZSB3aWxsIHR1cm4gb24gYW5kIG9mZiBpbiB1bmlzb247IHRoYXQgaXMgaWYgb25lIGlzIGNoZWNrZWQsIHRoZXkgYXJlIGFsbCBjaGVja2VkLiBJZiBjbGVhciwgdGhlIGJ1dHRvbnMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAodGhlIHNhbWUgYmVoYXZpb3IgYXMgSFRNTCByYWRpbyBidXR0b25zKS5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI3JhZGlvSXNVbmlzb25cbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyYWRpb0lzVW5pc29uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX01LID0ge307XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTUsnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoX01LKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPDwnKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gX01LKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLycgKyBrZXkgKyAnICgnICsgX01LW2tleV0gKyAnKScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc+PicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICBfTUsgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogRnJvbSB0aGUgUERGIHJlZmVyZW5jZTpcbiAgICAgICAgKiAoT3B0aW9uYWwsIGJ1dHRvbiBmaWVsZHMgb25seSkgVGhlIHdpZGdldCBhbm5vdGF0aW9uJ3Mgbm9ybWFsIGNhcHRpb24gd2hpY2ggc2hhbGwgYmUgZGlzcGxheWVkIHdoZW4gaXQgaXMgbm90IGludGVyYWN0aW5nIHdpdGggdGhlIHVzZXIuIFxuICAgICAgICAqIFVubGlrZSB0aGUgcmVtYWluaW5nIGVudHJpZXMgbGlzdGVkIGluIHRoaXMgVGFibGUgd2hpY2ggYXBwbHkgb25seSB0byB3aWRnZXQgYW5ub3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHB1c2hidXR0b24gZmllbGRzIChzZWUgUHVzaGJ1dHRvbnMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKSwgdGhlIENBIGVudHJ5IG1heSBiZSB1c2VkIHdpdGggYW55IHR5cGUgb2YgYnV0dG9uIGZpZWxkLCBpbmNsdWRpbmcgY2hlY2sgYm94ZXMgKHNlZSBDaGVjayBCb3hlcyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpIGFuZCByYWRpbyBidXR0b25zIChSYWRpbyBCdXR0b25zIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIikuXG4gICAgICAgICpcbiAgICAgICAgKiAtICc4JyA9IENyb3NzLCBcbiAgICAgICAgKiAtICdsJyA9ICBDaXJjbGUsXG4gICAgICAgICogLSAnJyA9IG5vdGhpbmdcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNjYXB0aW9uXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjYXB0aW9uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfTUsuQ0EgfHwgJyc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9NSy5DQSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9BUztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdBUycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfQVM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQVMgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUmVxdWlyZWQgaWYgdGhlIGFwcGVhcmFuY2UgZGljdGlvbmFyeSBBUCBjb250YWlucyBvbmUgb3IgbW9yZSBzdWJkaWN0aW9uYXJpZXM7IFBERiAxLjIpIFRoZSBhbm5vdGF0aW9uJ3MgYXBwZWFyYW5jZSBzdGF0ZSwgd2hpY2ggc2VsZWN0cyB0aGUgYXBwbGljYWJsZSBhcHBlYXJhbmNlIHN0cmVhbSBmcm9tIGFuIGFwcGVhcmFuY2Ugc3ViZGljdGlvbmFyeSAoc2VlIFNlY3Rpb24gMTIuNS41LCBcIkFwcGVhcmFuY2UgU3RyZWFtc1wiKVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jYXBwZWFyYW5jZVN0YXRlXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdhcHBlYXJhbmNlU3RhdGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9BUy5zdWJzdHIoMSwgX0FTLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gJy8nICsgdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQnV0dG9uLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtUHVzaEJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVB1c2hCdXR0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQnV0dG9uLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMucHVzaEJ1dHRvbiA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtUHVzaEJ1dHRvbiwgQWNyb0Zvcm1CdXR0b24pO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1SYWRpb0J1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVJhZGlvQnV0dG9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUJ1dHRvbi5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLnJhZGlvID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wdXNoQnV0dG9uID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIF9LaWRzID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnS2lkcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9LaWRzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBfS2lkcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9LaWRzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1SYWRpb0J1dHRvbiwgQWNyb0Zvcm1CdXR0b24pO1xuXG4gICAgLyoqXG4gICAgKiBUaGUgQ2hpbGQgY2xhc3Mgb2YgYSBSYWRpb0J1dHRvbiAodGhlIHJhZGlvR3JvdXApIC0+IFRoZSBzaW5nbGUgQnV0dG9uc1xuICAgICogXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1DaGlsZENsYXNzXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKiBAaWdub3JlXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1DaGlsZENsYXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG5cbiAgICAgICAgdmFyIF9wYXJlbnQ7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnUGFyZW50Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9wYXJlbnQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfcGFyZW50ID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfb3B0aW9uTmFtZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdvcHRpb25OYW1lJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX29wdGlvbk5hbWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfb3B0aW9uTmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX01LID0ge307XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTUsnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzw8Jyk7XG4gICAgICAgICAgICAgICAgdmFyIGtleTtcbiAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiBfTUspIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJy8nICsga2V5ICsgJyAoJyArIF9NS1trZXldICsgJyknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJz4+Jyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX01LID0gdmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEZyb20gdGhlIFBERiByZWZlcmVuY2U6XG4gICAgICAgICogKE9wdGlvbmFsLCBidXR0b24gZmllbGRzIG9ubHkpIFRoZSB3aWRnZXQgYW5ub3RhdGlvbidzIG5vcm1hbCBjYXB0aW9uIHdoaWNoIHNoYWxsIGJlIGRpc3BsYXllZCB3aGVuIGl0IGlzIG5vdCBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyLiBcbiAgICAgICAgKiBVbmxpa2UgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGxpc3RlZCBpbiB0aGlzIFRhYmxlIHdoaWNoIGFwcGx5IG9ubHkgdG8gd2lkZ2V0IGFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCBwdXNoYnV0dG9uIGZpZWxkcyAoc2VlIFB1c2hidXR0b25zIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIiksIHRoZSBDQSBlbnRyeSBtYXkgYmUgdXNlZCB3aXRoIGFueSB0eXBlIG9mIGJ1dHRvbiBmaWVsZCwgaW5jbHVkaW5nIGNoZWNrIGJveGVzIChzZWUgQ2hlY2sgQm94ZXMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKSBhbmQgcmFkaW8gYnV0dG9ucyAoUmFkaW8gQnV0dG9ucyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpLlxuICAgICAgICAqXG4gICAgICAgICogLSAnOCcgPSBDcm9zcywgXG4gICAgICAgICogLSAnbCcgPSAgQ2lyY2xlLFxuICAgICAgICAqIC0gJycgPSBub3RoaW5nXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jY2FwdGlvblxuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY2FwdGlvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01LLkNBIHx8ICcnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBfTUsuQ0EgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfQVM7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnQVMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0FTO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChSZXF1aXJlZCBpZiB0aGUgYXBwZWFyYW5jZSBkaWN0aW9uYXJ5IEFQIGNvbnRhaW5zIG9uZSBvciBtb3JlIHN1YmRpY3Rpb25hcmllczsgUERGIDEuMikgVGhlIGFubm90YXRpb24ncyBhcHBlYXJhbmNlIHN0YXRlLCB3aGljaCBzZWxlY3RzIHRoZSBhcHBsaWNhYmxlIGFwcGVhcmFuY2Ugc3RyZWFtIGZyb20gYW4gYXBwZWFyYW5jZSBzdWJkaWN0aW9uYXJ5IChzZWUgU2VjdGlvbiAxMi41LjUsIFwiQXBwZWFyYW5jZSBTdHJlYW1zXCIpXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNhcHBlYXJhbmNlU3RhdGVcbiAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2FwcGVhcmFuY2VTdGF0ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0FTLnN1YnN0cigxLCBfQVMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQVMgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2FwdGlvbiA9ICdsJztcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlU3RhdGUgPSAnT2ZmJztcbiAgICAgICAgLy8gdG9kbzogc2V0IEFwcGVhcmFuY2VUeXBlIGFzIHZhcmlhYmxlIHRoYXQgY2FuIGJlIHNldCBmcm9tIHRoZVxuICAgICAgICAvLyBvdXRzaWRlLi4uXG4gICAgICAgIHRoaXMuX0FwcGVhcmFuY2VUeXBlID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZTtcbiAgICAgICAgLy8gVGhlIERlZmF1bHQgYXBwZWFyYW5jZVR5cGUgaXMgdGhlIENpcmNsZVxuICAgICAgICB0aGlzLmFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0gdGhpcy5fQXBwZWFyYW5jZVR5cGUuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSh0aGlzLm9wdGlvbk5hbWUpO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNoaWxkQ2xhc3MsIEFjcm9Gb3JtRmllbGQpO1xuXG4gICAgQWNyb0Zvcm1SYWRpb0J1dHRvbi5wcm90b3R5cGUuc2V0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlKSB7XG4gICAgICAgIGlmICghKCdjcmVhdGVBcHBlYXJhbmNlU3RyZWFtJyBpbiBhcHBlYXJhbmNlICYmICdnZXRDQScgaW4gYXBwZWFyYW5jZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGFzc2lnbiBBcHBlYXJhbmNlIHRvIFJhZGlvQnV0dG9uLiBBcHBlYXJhbmNlIHdhcyBJbnZhbGlkIVwiKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBvYmpJZCBpbiB0aGlzLktpZHMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLktpZHMuaGFzT3duUHJvcGVydHkob2JqSWQpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5LaWRzW29iaklkXTtcbiAgICAgICAgICAgICAgICBjaGlsZC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IGFwcGVhcmFuY2UuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbShjaGlsZC5vcHRpb25OYW1lKTtcbiAgICAgICAgICAgICAgICBjaGlsZC5jYXB0aW9uID0gYXBwZWFyYW5jZS5nZXRDQSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIEFjcm9Gb3JtUmFkaW9CdXR0b24ucHJvdG90eXBlLmNyZWF0ZU9wdGlvbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIC8vIENyZWF0ZSBuZXcgQ2hpbGQgZm9yIFJhZGlvR3JvdXBcbiAgICAgICAgdmFyIGNoaWxkID0gbmV3IEFjcm9Gb3JtQ2hpbGRDbGFzcygpO1xuICAgICAgICBjaGlsZC5QYXJlbnQgPSB0aGlzO1xuICAgICAgICBjaGlsZC5vcHRpb25OYW1lID0gbmFtZTtcbiAgICAgICAgLy8gQWRkIHRvIFBhcmVudFxuICAgICAgICB0aGlzLktpZHMucHVzaChjaGlsZCk7XG5cbiAgICAgICAgYWRkRmllbGQuY2FsbCh0aGlzLCBjaGlsZCk7XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUNoZWNrQm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQ2hlY2tCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQnV0dG9uLmNhbGwodGhpcyk7XG5cbiAgICAgICAgdGhpcy5mb250TmFtZSA9ICd6YXBmZGluZ2JhdHMnO1xuICAgICAgICB0aGlzLmNhcHRpb24gPSAnMyc7XG4gICAgICAgIHRoaXMuYXBwZWFyYW5jZVN0YXRlID0gJ09uJztcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwiT25cIjtcbiAgICAgICAgdGhpcy50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5DaGVja0JveC5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKCk7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQ2hlY2tCb3gsIEFjcm9Gb3JtQnV0dG9uKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtVGV4dEZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1UZXh0RmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtRmllbGQuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5GVCA9ICcvVHgnO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIG1heSBjb250YWluIG11bHRpcGxlIGxpbmVzIG9mIHRleHQ7IGlmIGNsZWFyLCB0aGUgZmllbGTigJlzIHRleHQgc2hhbGwgYmUgcmVzdHJpY3RlZCB0byBhIHNpbmdsZSBsaW5lLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI211bHRpbGluZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ211bHRpbGluZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgcmVwcmVzZW50cyB0aGUgcGF0aG5hbWUgb2YgYSBmaWxlIHdob3NlIGNvbnRlbnRzIHNoYWxsIGJlIHN1Ym1pdHRlZCBhcyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLiBcbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNmaWxlU2VsZWN0XG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmlsZVNlbGVjdCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjEpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgc3BlbGwtY2hlY2tlZC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNkb05vdFNwZWxsQ2hlY2tcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkb05vdFNwZWxsQ2hlY2snLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBub3Qgc2Nyb2xsIChob3Jpem9udGFsbHkgZm9yIHNpbmdsZS1saW5lIGZpZWxkcywgdmVydGljYWxseSBmb3IgbXVsdGlwbGUtbGluZSBmaWVsZHMpIHRvIGFjY29tbW9kYXRlIG1vcmUgdGV4dCB0aGFuIGZpdHMgd2l0aGluIGl0cyBhbm5vdGF0aW9uIHJlY3RhbmdsZS4gT25jZSB0aGUgZmllbGQgaXMgZnVsbCwgbm8gZnVydGhlciB0ZXh0IHNoYWxsIGJlIGFjY2VwdGVkIGZvciBpbnRlcmFjdGl2ZSBmb3JtIGZpbGxpbmc7IGZvciBub25pbnRlcmFjdGl2ZSBmb3JtIGZpbGxpbmcsIHRoZSBmaWxsZXIgc2hvdWxkIHRha2UgY2FyZSBub3QgdG8gYWRkIG1vcmUgY2hhcmFjdGVyIHRoYW4gd2lsbCB2aXNpYmx5IGZpdCBpbiB0aGUgZGVmaW5lZCBhcmVhLiBcbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNkb05vdFNjcm9sbFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2RvTm90U2Nyb2xsJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNSkgTWF5IGJlIHNldCBvbmx5IGlmIHRoZSBNYXhMZW4gZW50cnkgaXMgcHJlc2VudCBpbiB0aGUgdGV4dCBmaWVsZCBkaWN0aW9uYXJ5IChzZWUgVGFibGUgMjI5KSBhbmQgaWYgdGhlIE11bHRpbGluZSwgUGFzc3dvcmQsIGFuZCBGaWxlU2VsZWN0IGZsYWdzIGFyZSBjbGVhci4gSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgYmUgYXV0b21hdGljYWxseSBkaXZpZGVkIGludG8gYXMgbWFueSBlcXVhbGx5IHNwYWNlZCBwb3NpdGlvbnMsIG9yIGNvbWJzLCBhcyB0aGUgdmFsdWUgb2YgTWF4TGVuLCBhbmQgdGhlIHRleHQgaXMgbGFpZCBvdXQgaW50byB0aG9zZSBjb21icy5cbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNjb21iXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29tYicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjUpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI1KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjUpIElmIHNldCwgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgc2hhbGwgYmUgYSByaWNoIHRleHQgc3RyaW5nIChzZWUgMTIuNy4zLjQsIOKAnFJpY2ggVGV4dCBTdHJpbmdz4oCdKS4gSWYgdGhlIGZpZWxkIGhhcyBhIHZhbHVlLCB0aGUgUlYgZW50cnkgb2YgdGhlIGZpZWxkIGRpY3Rpb25hcnkgKFRhYmxlIDIyMikgc2hhbGwgc3BlY2lmeSB0aGUgcmljaCB0ZXh0IHN0cmluZy5cbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNyaWNoVGV4dFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JpY2hUZXh0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX01heExlbiA9IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTWF4TGVuJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01heExlbjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9NYXhMZW4gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsOyBpbmhlcml0YWJsZSkgVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBmaWVsZOKAmXMgdGV4dCwgaW4gY2hhcmFjdGVycy4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNtYXhMZW5ndGhcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ21heExlbmd0aCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01heExlbjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBfTWF4TGVuID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFzQXBwZWFyYW5jZVN0cmVhbScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuViB8fCB0aGlzLkRWKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1UZXh0RmllbGQsIEFjcm9Gb3JtRmllbGQpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1QYXNzd29yZEZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybVRleHRGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1UZXh0RmllbGQuY2FsbCh0aGlzKTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBpbnRlbmRlZCBmb3IgZW50ZXJpbmcgYSBzZWN1cmUgcGFzc3dvcmQgdGhhdCBzaG91bGQgbm90IGJlIGVjaG9lZCB2aXNpYmx5IHRvIHRoZSBzY3JlZW4uIENoYXJhY3RlcnMgdHlwZWQgZnJvbSB0aGUga2V5Ym9hcmQgc2hhbGwgaW5zdGVhZCBiZSBlY2hvZWQgaW4gc29tZSB1bnJlYWRhYmxlIGZvcm0sIHN1Y2ggYXMgYXN0ZXJpc2tzIG9yIGJ1bGxldCBjaGFyYWN0ZXJzLlxuICAgICAgICAqIE5PVEUgVG8gcHJvdGVjdCBwYXNzd29yZCBjb25maWRlbnRpYWxpdHksIHJlYWRlcnMgc2hvdWxkIG5ldmVyIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBmaWVsZCBpbiB0aGUgUERGIGZpbGUgaWYgdGhpcyBmbGFnIGlzIHNldC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNwYXNzd29yZFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3Bhc3N3b3JkJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCwgQWNyb0Zvcm1UZXh0RmllbGQpO1xuXG5cbiAgICAvLyBDb250YWlucyBNZXRob2RzIGZvciBjcmVhdGluZyBzdGFuZGFyZCBhcHBlYXJhbmNlc1xuICAgIHZhciBBY3JvRm9ybUFwcGVhcmFuY2UgPSB7XG4gICAgICAgIENoZWNrQm94OiB7XG4gICAgICAgICAgICBjcmVhdGVBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIE46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9uOiBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guWWVzTm9ybWFsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIEQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9uOiBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guWWVzUHVzaERvd24sXG4gICAgICAgICAgICAgICAgICAgICAgICBPZmY6IEFjcm9Gb3JtQXBwZWFyYW5jZS5DaGVja0JveC5PZmZQdXNoRG93blxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBhcHBlYXJhbmNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIE9uIEFwcGVhcmFuY2UgZm9yIGEgQ2hlY2tCb3hcbiAgICAgICAgICAgICAgKiBcbiAgICAgICAgICAgICAgKiBAcmV0dXJucyB7QWNyb0Zvcm1YT2JqZWN0fVxuICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgWWVzUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIGVuY29kZWRDb2xvciA9IHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpO1xuICAgICAgICAgICAgICAgIHZhciBjYWxjUmVzID0gY2FsY3VsYXRlWChmb3JtT2JqZWN0LCBmb3JtT2JqZWN0LmNhcHRpb24pO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSkgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiQk1DXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCAxIHJnXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiL1wiICsgZm9udEtleSArIFwiIFwiICsgZjIoY2FsY1Jlcy5mb250U2l6ZSkgKyBcIiBUZiBcIiArIGVuY29kZWRDb2xvcik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJCVFwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChjYWxjUmVzLnRleHQpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiRVRcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiRU1DXCIpO1xuICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBZZXNOb3JtYWw6IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIGZvbnRLZXkgPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KGZvcm1PYmplY3QuZm9udE5hbWUsIGZvcm1PYmplY3QuZm9udFN0eWxlKS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgZW5jb2RlZENvbG9yID0gc2NvcGUuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcik7XG4gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgY2FsY1JlcyA9IGNhbGN1bGF0ZVgoZm9ybU9iamVjdCwgZm9ybU9iamVjdC5jYXB0aW9uKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKHdpZHRoKSArIFwiIFwiICsgZjIoaGVpZ2h0KSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgMSByZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKHdpZHRoIC0gMSkgKyBcIiBcIiArIGYyKGhlaWdodCAtIDEpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJXXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiblwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkJUXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiL1wiICsgZm9udEtleSArIFwiIFwiICsgZjIoY2FsY1Jlcy5mb250U2l6ZSkgKyBcIiBUZiBcIiArIGVuY29kZWRDb2xvcik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goY2FsY1Jlcy50ZXh0KTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkVUXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICogUmV0dXJucyB0aGUgc3RhbmRhcmQgT2ZmIEFwcGVhcmFuY2UgZm9yIGEgQ2hlY2tCb3hcbiAgICAgICAgICAgICAgKiBcbiAgICAgICAgICAgICAgKiBAcmV0dXJucyB7QWNyb0Zvcm1YT2JqZWN0fVxuICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgT2ZmUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSkgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgUmFkaW9CdXR0b246IHtcbiAgICAgICAgICAgIENpcmNsZToge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUFwcGVhcmFuY2VTdHJlYW06IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2ZmJzogQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5PZmZQdXNoRG93blxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE46IHt9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50Lk5bbmFtZV0gPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLlllc05vcm1hbDtcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuRFtuYW1lXSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuWWVzUHVzaERvd247XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHBlYXJhbmNlU3RyZWFtQ29udGVudDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldENBOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnbCc7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIFllc05vcm1hbDogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSB0aGUgUmFkaXVzIG9mIHRoZSBDaXJjbGUgcmVsYXRpdmUgdG8gbWluKGhlaWdodCwgd2lkdGgpIG9mIGZvcm1PYmplY3RcbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1cyA9IChBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgPD0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgPyBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyA0IDogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCb3JkZXJwYWRkaW5nLi4uXG4gICAgICAgICAgICAgICAgICAgIERvdFJhZGl1cyA9IE51bWJlcigoRG90UmFkaXVzICogMC45KS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0M7XG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXNCZXppZXIgPSBOdW1iZXIoKERvdFJhZGl1cyAqIGMpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgICogVGhlIEZvbGxvd2luZyBpcyBhIENpcmNsZSBjcmVhdGVkIHdpdGggQmV6aWVyLUN1cnZlcy5cbiAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAwIDAgMSBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDIpICsgXCIgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gMikgKyBcIiBjbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzICsgXCIgMCBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChEb3RSYWRpdXMgKyBcIiBcIiArIERvdFJhZGl1c0JlemllciArIFwiIFwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAwIFwiICsgRG90UmFkaXVzICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIFwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIERvdFJhZGl1cyArIFwiIC1cIiArIERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIDAgLVwiICsgRG90UmFkaXVzICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzQmV6aWVyICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgWWVzUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXMgPSAoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIDw9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpID9cbiAgICAgICAgICAgICAgICAgICAgICAgIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDQgOiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gNDtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEJvcmRlcnBhZGRpbmcuLi5cbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1cyA9IE51bWJlcigoRG90UmFkaXVzICogMC45KS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSByZXN1bHRzIGZvciBsYXRlciB1c2U7IG5vIG5lZWQgdG8gd2FzdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc29yIHRpY2tzIG9uIGRvaW5nIG1hdGhcbiAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDIpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIga2MgPSBOdW1iZXIoKGsgKiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0MpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5CZXppZXJfQykudG9GaXhlZCg1KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAwIDAgMSBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDIpICsgXCIgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gMikgKyBcIiBjbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goayArIFwiIDAgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goayArIFwiIFwiICsga2MgKyBcIiBcIiArIGtjICsgXCIgXCIgKyBrICsgXCIgMCBcIiArIGsgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGtjICsgXCIgXCIgKyBrICsgXCIgLVwiICsgayArIFwiIFwiICsga2MgKyBcIiAtXCIgKyBrICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGsgKyBcIiAtXCIgKyBrYyArIFwiIC1cIiArIGtjICsgXCIgLVwiICsgayArIFwiIDAgLVwiICsgayArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGtjICsgXCIgLVwiICsgayArIFwiIFwiICsgayArIFwiIC1cIiArIGtjICsgXCIgXCIgKyBrICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDAgMCAxIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gMikgKyBcIiBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyAyKSArIFwiIGNtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChEb3RSYWRpdXMgKyBcIiAwIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIGRjICsgXCIgXCIgKyBkYyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgMCBcIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgZGMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIFwiICsgZGMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgZGMgKyBcIiAtXCIgKyBkYyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIDAgLVwiICsgRG90UmFkaXVzICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZGMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIC1cIiArIGRjICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9mZlB1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzID0gKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSA8PSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyA0IDogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCb3JkZXJwYWRkaW5nLi4uXG4gICAgICAgICAgICAgICAgICAgIERvdFJhZGl1cyA9IE51bWJlcigoRG90UmFkaXVzICogMC45KS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSByZXN1bHRzIGZvciBsYXRlciB1c2U7IG5vIG5lZWQgdG8gd2FzdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc29yIHRpY2tzIG9uIGRvaW5nIG1hdGhcbiAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDIpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIga2MgPSBOdW1iZXIoKGsgKiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0MpLnRvRml4ZWQoNSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMCAwIDEgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyAyKSArIFwiIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDIpICsgXCIgY21cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiAwIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiBcIiArIGtjICsgXCIgXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgXCIgKyBrICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrYyArIFwiIFwiICsgayArIFwiIC1cIiArIGsgKyBcIiBcIiArIGtjICsgXCIgLVwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrICsgXCIgLVwiICsga2MgKyBcIiAtXCIgKyBrYyArIFwiIC1cIiArIGsgKyBcIiAwIC1cIiArIGsgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrYyArIFwiIC1cIiArIGsgKyBcIiBcIiArIGsgKyBcIiAtXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBDcm9zczoge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgKiBDcmVhdGVzIHRoZSBBY3R1YWwgQXBwZWFyYW5jZURpY3Rpb25hcnktUmVmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgKiBcbiAgICAgICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgICAgICAgICAgICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgICAgICAgICAgICAgICogQGlnbm9yZVxuICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjcmVhdGVBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09mZic6IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5Dcm9zcy5PZmZQdXNoRG93blxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE46IHt9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50Lk5bbmFtZV0gPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ3Jvc3MuWWVzTm9ybWFsO1xuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5EW25hbWVdID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNyb3NzLlllc1B1c2hEb3duO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRDQTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzgnXG4gICAgICAgICAgICAgICAgfSxcblxuXG4gICAgICAgICAgICAgICAgWWVzTm9ybWFsOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3Jvc3MgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuY2FsY3VsYXRlQ3Jvc3MoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDEgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLSAyKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAtIDIpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiV1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJuXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54MS54KSArIFwiIFwiICsgZjIoY3Jvc3MueDEueSkgKyBcIiBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54Mi54KSArIFwiIFwiICsgZjIoY3Jvc3MueDIueSkgKyBcIiBsXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54NC54KSArIFwiIFwiICsgZjIoY3Jvc3MueDQueSkgKyBcIiBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54My54KSArIFwiIFwiICsgZjIoY3Jvc3MueDMueSkgKyBcIiBsXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBZZXNQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjcm9zcyA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5jYWxjdWxhdGVDcm9zcyhmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAxIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC0gMikgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLSAyKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIldcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiblwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDEueCkgKyBcIiBcIiArIGYyKGNyb3NzLngxLnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDIueCkgKyBcIiBcIiArIGYyKGNyb3NzLngyLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDQueCkgKyBcIiBcIiArIGYyKGNyb3NzLng0LnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDMueCkgKyBcIiBcIiArIGYyKGNyb3NzLngzLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJzXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT2ZmUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBBcHBlYXJhbmNlXG4gICAgICAgICAgKiBcbiAgICAgICAgICAqIEByZXR1cm5zIHtBY3JvRm9ybVhPYmplY3R9XG4gICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlRGVmYXVsdEFwcGVhcmFuY2VTdHJlYW06IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyBTZXQgSGVsdmV0aWNhIHRvIFN0YW5kYXJkIEZvbnQgKHNpemU6IGF1dG8pXG4gICAgICAgICAgICAvLyBDb2xvcjogQmxhY2tcbiAgICAgICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG4gICAgICAgICAgICB2YXIgZW5jb2RlZENvbG9yID0gc2NvcGUuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcik7XG4gICAgICAgICAgICB2YXIgZm9udFNpemUgPSBmb3JtT2JqZWN0LmZvbnRTaXplO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICcvJyArIGZvbnRLZXkgKyAnICcgKyBmb250U2l6ZSArICcgVGYgJyArIGVuY29kZWRDb2xvcjtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsID0ge1xuICAgICAgICBCZXppZXJfQzogMC41NTE5MTUwMjQ0OTQsXG5cbiAgICAgICAgY2FsY3VsYXRlQ3Jvc3M6IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG5cbiAgICAgICAgICAgIHZhciB3aWR0aCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgdmFyIGEgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICAgICAgdmFyIGNyb3NzID0ge1xuICAgICAgICAgICAgICAgIHgxOiB7IC8vIHVwcGVyTGVmdFxuICAgICAgICAgICAgICAgICAgICB4OiAod2lkdGggLSBhKSAvIDIsXG4gICAgICAgICAgICAgICAgICAgIHk6ICgoaGVpZ2h0IC0gYSkgLyAyKSArIGEsLy8gaGVpZ2h0IC0gYm9yZGVyUGFkZGluZ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeDI6IHsgLy8gbG93ZXJSaWdodFxuICAgICAgICAgICAgICAgICAgICB4OiAoKHdpZHRoIC0gYSkgLyAyKSArIGEsXG4gICAgICAgICAgICAgICAgICAgIHk6ICgoaGVpZ2h0IC0gYSkgLyAyKS8vIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHgzOiB7IC8vIGxvd2VyTGVmdFxuICAgICAgICAgICAgICAgICAgICB4OiAod2lkdGggLSBhKSAvIDIsXG4gICAgICAgICAgICAgICAgICAgIHk6ICgoaGVpZ2h0IC0gYSkgLyAyKS8vIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHg0OiB7IC8vIHVwcGVyUmlnaHRcbiAgICAgICAgICAgICAgICAgICAgeDogKCh3aWR0aCAtIGEpIC8gMikgKyBhLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikgKyBhLC8vIGhlaWdodCAtIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gY3Jvc3M7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGggPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICAgICAgaWYgKHR5cGVvZiBmb3JtT2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzY2FsZShmb3JtT2JqZWN0LlJlY3RbMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgICAgIGlmICh0eXBlb2YgZm9ybU9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmVzdWx0ID0gc2NhbGUoZm9ybU9iamVjdC5SZWN0WzNdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBQdWJsaWM6XG5cbiAgICAvKipcbiAgICAqIEFkZCBhbiBBY3JvRm9ybS1GaWVsZCB0byB0aGUganNQREYtaW5zdGFuY2VcbiAgICAqXG4gICAgKiBAbmFtZSBhZGRGaWVsZFxuICAgICogQGZ1bmN0aW9uIFxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRPYmplY3RcbiAgICAqIEByZXR1cm5zIHtqc1BERn1cbiAgICAqL1xuICAgIHZhciBhZGRGaWVsZCA9IGpzUERGQVBJLmFkZEZpZWxkID0gZnVuY3Rpb24gKGZpZWxkT2JqZWN0KSB7XG4gICAgICAgIGluaXRpYWxpemVBY3JvRm9ybS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIGlmIChmaWVsZE9iamVjdCBpbnN0YW5jZW9mIEFjcm9Gb3JtRmllbGQpIHtcbiAgICAgICAgICAgIHB1dEZvcm0uY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmFkZEZpZWxkLicpO1xuICAgICAgICB9XG4gICAgICAgIGZpZWxkT2JqZWN0LnBhZ2UgPSBzY29wZS5pbnRlcm5hbC5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAbmFtZSBhZGRCdXR0b25cbiAgICAqIEBmdW5jdGlvblxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge0Fjcm9Gb3JtQnV0dG9ufSBvcHRpb25zXG4gICAgKiBAcmV0dXJucyB7anNQREZ9XG4gICAgKiBAZGVwcmVjYXRlZFxuICAgICovXG4gICAganNQREZBUEkuYWRkQnV0dG9uID0gZnVuY3Rpb24gKGJ1dHRvbikge1xuICAgICAgICBpZiAoYnV0dG9uIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmFkZEJ1dHRvbi4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkRmllbGQuY2FsbCh0aGlzLCBidXR0b24pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBuYW1lIGFkZFRleHRGaWVsZFxuICAgICogQGZ1bmN0aW9uXG4gICAgKiBAaW5zdGFuY2VcbiAgICAqIEBwYXJhbSB7QWNyb0Zvcm1UZXh0RmllbGR9IHRleHRGaWVsZFxuICAgICogQHJldHVybnMge2pzUERGfVxuICAgICogQGRlcHJlY2F0ZWRcbiAgICAqL1xuICAgIGpzUERGQVBJLmFkZFRleHRGaWVsZCA9IGZ1bmN0aW9uICh0ZXh0RmllbGQpIHtcbiAgICAgICAgaWYgKHRleHRGaWVsZCBpbnN0YW5jZW9mIEFjcm9Gb3JtVGV4dEZpZWxkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRUZXh0RmllbGQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkLmNhbGwodGhpcywgdGV4dEZpZWxkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAbmFtZSBhZGRDaG9pY2VGaWVsZFxuICAgICogQGZ1bmN0aW9uXG4gICAgKiBAaW5zdGFuY2VcbiAgICAqIEBwYXJhbSB7QWNyb0Zvcm1DaG9pY2VGaWVsZH0gXG4gICAgKiBAcmV0dXJucyB7anNQREZ9XG4gICAgKiBAZGVwcmVjYXRlZFxuICAgICovXG4gICAganNQREZBUEkuYWRkQ2hvaWNlRmllbGQgPSBmdW5jdGlvbiAoY2hvaWNlRmllbGQpIHtcbiAgICAgICAgaWYgKGNob2ljZUZpZWxkIGluc3RhbmNlb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuYWRkQ2hvaWNlRmllbGQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkLmNhbGwodGhpcywgY2hvaWNlRmllbGQpO1xuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIGdsb2JhbE9iaiA9PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiQ2hvaWNlRmllbGRcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiTGlzdEJveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJDb21ib0JveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJFZGl0Qm94XCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkJ1dHRvblwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJQdXNoQnV0dG9uXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIlJhZGlvQnV0dG9uXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkNoZWNrQm94XCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIlRleHRGaWVsZFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJQYXNzd29yZEZpZWxkXCJdKSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICkge1xuICAgICAgICBnbG9iYWxPYmpbXCJDaG9pY2VGaWVsZFwiXSA9IEFjcm9Gb3JtQ2hvaWNlRmllbGQ7XG4gICAgICAgIGdsb2JhbE9ialtcIkxpc3RCb3hcIl0gPSBBY3JvRm9ybUxpc3RCb3g7XG4gICAgICAgIGdsb2JhbE9ialtcIkNvbWJvQm94XCJdID0gQWNyb0Zvcm1Db21ib0JveDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiRWRpdEJveFwiXSA9IEFjcm9Gb3JtRWRpdEJveDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiQnV0dG9uXCJdID0gQWNyb0Zvcm1CdXR0b247XG4gICAgICAgIGdsb2JhbE9ialtcIlB1c2hCdXR0b25cIl0gPSBBY3JvRm9ybVB1c2hCdXR0b247XG4gICAgICAgIGdsb2JhbE9ialtcIlJhZGlvQnV0dG9uXCJdID0gQWNyb0Zvcm1SYWRpb0J1dHRvbjtcbiAgICAgICAgZ2xvYmFsT2JqW1wiQ2hlY2tCb3hcIl0gPSBBY3JvRm9ybUNoZWNrQm94O1xuICAgICAgICBnbG9iYWxPYmpbXCJUZXh0RmllbGRcIl0gPSBBY3JvRm9ybVRleHRGaWVsZDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiUGFzc3dvcmRGaWVsZFwiXSA9IEFjcm9Gb3JtUGFzc3dvcmRGaWVsZDtcblxuICAgICAgICAvLyBiYWNrd2FyZHNDb21wYXRpYmlsaXR5XG4gICAgICAgIGdsb2JhbE9ialtcIkFjcm9Gb3JtXCJdID0geyBBcHBlYXJhbmNlOiBBY3JvRm9ybUFwcGVhcmFuY2UgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJBY3JvRm9ybS1DbGFzc2VzIGFyZSBub3QgcG9wdWxhdGVkIGludG8gZ2xvYmFsLW5hbWVzcGFjZSwgYmVjYXVzZSB0aGUgY2xhc3MtTmFtZXMgZXhpc3QgYWxyZWFkeS4gVGhpcyBhdm9pZHMgY29uZmxpY3RzIHdpdGggdGhlIGFscmVhZHkgdXNlZCBmcmFtZXdvcmsuXCIpO1xuICAgIH1cblxuICAgIGpzUERGQVBJLkFjcm9Gb3JtQ2hvaWNlRmllbGQgPSBBY3JvRm9ybUNob2ljZUZpZWxkO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtTGlzdEJveCA9IEFjcm9Gb3JtTGlzdEJveDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUNvbWJvQm94ID0gQWNyb0Zvcm1Db21ib0JveDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUVkaXRCb3ggPSBBY3JvRm9ybUVkaXRCb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1CdXR0b24gPSBBY3JvRm9ybUJ1dHRvbjtcbiAgICBqc1BERkFQSS5BY3JvRm9ybVB1c2hCdXR0b24gPSBBY3JvRm9ybVB1c2hCdXR0b247XG4gICAganNQREZBUEkuQWNyb0Zvcm1SYWRpb0J1dHRvbiA9IEFjcm9Gb3JtUmFkaW9CdXR0b247XG4gICAganNQREZBUEkuQWNyb0Zvcm1DaGVja0JveCA9IEFjcm9Gb3JtQ2hlY2tCb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1UZXh0RmllbGQgPSBBY3JvRm9ybVRleHRGaWVsZDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybVBhc3N3b3JkRmllbGQgPSBBY3JvRm9ybVBhc3N3b3JkRmllbGQ7XG4gICAganNQREZBUEkuQWNyb0Zvcm1BcHBlYXJhbmNlID0gQWNyb0Zvcm1BcHBlYXJhbmNlO1xuXG4gICAganNQREZBUEkuQWNyb0Zvcm0gPSB7XG4gICAgICAgIENob2ljZUZpZWxkOiBBY3JvRm9ybUNob2ljZUZpZWxkLFxuICAgICAgICBMaXN0Qm94OiBBY3JvRm9ybUxpc3RCb3gsXG4gICAgICAgIENvbWJvQm94OiBBY3JvRm9ybUNvbWJvQm94LFxuICAgICAgICBFZGl0Qm94OiBBY3JvRm9ybUVkaXRCb3gsXG4gICAgICAgIEJ1dHRvbjogQWNyb0Zvcm1CdXR0b24sXG4gICAgICAgIFB1c2hCdXR0b246IEFjcm9Gb3JtUHVzaEJ1dHRvbixcbiAgICAgICAgUmFkaW9CdXR0b246IEFjcm9Gb3JtUmFkaW9CdXR0b24sXG4gICAgICAgIENoZWNrQm94OiBBY3JvRm9ybUNoZWNrQm94LFxuICAgICAgICBUZXh0RmllbGQ6IEFjcm9Gb3JtVGV4dEZpZWxkLFxuICAgICAgICBQYXNzd29yZEZpZWxkOiBBY3JvRm9ybVBhc3N3b3JkRmllbGQsXG4gICAgICAgIEFwcGVhcmFuY2U6IEFjcm9Gb3JtQXBwZWFyYW5jZVxuICAgIH07XG5cbiAgICBqc1BERi5BY3JvRm9ybSA9IHtcbiAgICAgICAgQ2hvaWNlRmllbGQ6IEFjcm9Gb3JtQ2hvaWNlRmllbGQsXG4gICAgICAgIExpc3RCb3g6IEFjcm9Gb3JtTGlzdEJveCxcbiAgICAgICAgQ29tYm9Cb3g6IEFjcm9Gb3JtQ29tYm9Cb3gsXG4gICAgICAgIEVkaXRCb3g6IEFjcm9Gb3JtRWRpdEJveCxcbiAgICAgICAgQnV0dG9uOiBBY3JvRm9ybUJ1dHRvbixcbiAgICAgICAgUHVzaEJ1dHRvbjogQWNyb0Zvcm1QdXNoQnV0dG9uLFxuICAgICAgICBSYWRpb0J1dHRvbjogQWNyb0Zvcm1SYWRpb0J1dHRvbixcbiAgICAgICAgQ2hlY2tCb3g6IEFjcm9Gb3JtQ2hlY2tCb3gsXG4gICAgICAgIFRleHRGaWVsZDogQWNyb0Zvcm1UZXh0RmllbGQsXG4gICAgICAgIFBhc3N3b3JkRmllbGQ6IEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCxcbiAgICAgICAgQXBwZWFyYW5jZTogQWNyb0Zvcm1BcHBlYXJhbmNlXG4gICAgfTtcbn0pKGpzcGRmLmpzUERGLCAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93IHx8IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbCkpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0uanNcbi8vIG1vZHVsZSBpZCA9IDYyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIiAgLyoqXG4gICAqIGpzUERGIGZyb21IVE1MIHBsdWdpbi4gQkVUQSBzdGFnZS4gQVBJIHN1YmplY3QgdG8gY2hhbmdlLiBOZWVkcyBicm93c2VyXG4gICAqIENvcHlyaWdodCAoYykgMjAxMiBXaWxsb3cgU3lzdGVtcyBDb3Jwb3JhdGlvbiwgd2lsbG93LXN5c3RlbXMuY29tXG4gICAqICAgICAgICAgICAgICAgMjAxNCBKdWFuIFBhYmxvIEdhdmlyaWEsIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWFucGdhdmlyaWFcbiAgICogICAgICAgICAgICAgICAyMDE0IERpZWdvIENhc29ycmFuLCBodHRwczovL2dpdGh1Yi5jb20vZGllZ29jclxuICAgKiAgICAgICAgICAgICAgIDIwMTQgRGFuaWVsIEh1c2FyLCBodHRwczovL2dpdGh1Yi5jb20vZGFuaWVsaHVzYXJcbiAgICogICAgICAgICAgICAgICAyMDE0IFdvbGZnYW5nIEdhc3NsZXIsIGh0dHBzOi8vZ2l0aHViLmNvbS93b29sZmdcbiAgICogICAgICAgICAgICAgICAyMDE0IFN0ZXZlbiBTcHVuZ2luLCBodHRwczovL2dpdGh1Yi5jb20vZmxhbWVuY29cbiAgICpcbiAgICogQGxpY2Vuc2VcbiAgICogXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuICB2YXIganNwZGYgPSByZXF1aXJlKFwianNwZGZcIik7XG5cbiAgKGZ1bmN0aW9uIChqc1BERkFQSSkge1xuICAgIHZhciBjbG9uZSwgX0RyaWxsRm9yQ29udGVudCwgRm9udE5hbWVEQiwgRm9udFN0eWxlTWFwLCBUZXh0QWxpZ25NYXAsIEZvbnRXZWlnaHRNYXAsIEZsb2F0TWFwLCBDbGVhck1hcCwgR2V0Q1NTLCBQdXJnZVdoaXRlU3BhY2UsIFJlbmRlcmVyLCBSZXNvbHZlRm9udCwgUmVzb2x2ZVVuaXRlZE51bWJlciwgVW5pdGVkTnVtYmVyTWFwLCBlbGVtZW50SGFuZGxlZEVsc2V3aGVyZSwgaW1hZ2VzLCBsb2FkSW1ncywgY2hlY2tGb3JGb290ZXIsIHByb2Nlc3MsIHRhYmxlVG9Kc29uO1xuXG4gICAgY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICBDbG9uZS5wcm90b3R5cGUgPSBvYmo7XG4gICAgICAgIHJldHVybiBuZXcgQ2xvbmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGZ1bmN0aW9uIENsb25lKCkge31cbiAgICB9KCk7XG5cbiAgICBQdXJnZVdoaXRlU3BhY2UgPSBmdW5jdGlvbiBQdXJnZVdoaXRlU3BhY2UoYXJyYXkpIHtcbiAgICAgIHZhciBmcmFnbWVudCwgaSwgbCwgbFRyaW1tZWQsIHIsIHJUcmltbWVkLCB0cmFpbGluZ1NwYWNlO1xuICAgICAgaSA9IDA7XG4gICAgICBsID0gYXJyYXkubGVuZ3RoO1xuICAgICAgZnJhZ21lbnQgPSB2b2lkIDA7XG4gICAgICBsVHJpbW1lZCA9IGZhbHNlO1xuICAgICAgclRyaW1tZWQgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKCFsVHJpbW1lZCAmJiBpICE9PSBsKSB7XG4gICAgICAgIGZyYWdtZW50ID0gYXJyYXlbaV0gPSBhcnJheVtpXS50cmltTGVmdCgpO1xuXG4gICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgIGxUcmltbWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgaSA9IGwgLSAxO1xuXG4gICAgICB3aGlsZSAobCAmJiAhclRyaW1tZWQgJiYgaSAhPT0gLTEpIHtcbiAgICAgICAgZnJhZ21lbnQgPSBhcnJheVtpXSA9IGFycmF5W2ldLnRyaW1SaWdodCgpO1xuXG4gICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgIHJUcmltbWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGktLTtcbiAgICAgIH1cblxuICAgICAgciA9IC9cXHMrJC9nO1xuICAgICAgdHJhaWxpbmdTcGFjZSA9IHRydWU7XG4gICAgICBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgIT09IGwpIHtcbiAgICAgICAgLy8gTGVhdmUgdGhlIGxpbmUgYnJlYWtzIGludGFjdFxuICAgICAgICBpZiAoYXJyYXlbaV0gIT0gXCJcXHUyMDI4XCIpIHtcbiAgICAgICAgICBmcmFnbWVudCA9IGFycmF5W2ldLnJlcGxhY2UoL1xccysvZywgXCIgXCIpO1xuXG4gICAgICAgICAgaWYgKHRyYWlsaW5nU3BhY2UpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnQudHJpbUxlZnQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICAgIHRyYWlsaW5nU3BhY2UgPSByLnRlc3QoZnJhZ21lbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFycmF5W2ldID0gZnJhZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIgPSBmdW5jdGlvbiBSZW5kZXJlcihwZGYsIHgsIHksIHNldHRpbmdzKSB7XG4gICAgICB0aGlzLnBkZiA9IHBkZjtcbiAgICAgIHRoaXMueCA9IHg7XG4gICAgICB0aGlzLnkgPSB5O1xuICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzOyAvL2xpc3Qgb2YgZnVuY3Rpb25zIHdoaWNoIGFyZSBjYWxsZWQgYWZ0ZXIgZWFjaCBlbGVtZW50LXJlbmRlcmluZyBwcm9jZXNzXG5cbiAgICAgIHRoaXMud2F0Y2hGdW5jdGlvbnMgPSBbXTtcbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFJlc29sdmVGb250ID0gZnVuY3Rpb24gUmVzb2x2ZUZvbnQoY3NzX2ZvbnRfZmFtaWx5X3N0cmluZykge1xuICAgICAgdmFyIG5hbWUsIHBhcnQsIHBhcnRzO1xuICAgICAgbmFtZSA9IHZvaWQgMDtcbiAgICAgIHBhcnRzID0gY3NzX2ZvbnRfZmFtaWx5X3N0cmluZy5zcGxpdChcIixcIik7XG4gICAgICBwYXJ0ID0gcGFydHMuc2hpZnQoKTtcblxuICAgICAgd2hpbGUgKCFuYW1lICYmIHBhcnQpIHtcbiAgICAgICAgbmFtZSA9IEZvbnROYW1lREJbcGFydC50cmltKCkudG9Mb3dlckNhc2UoKV07XG4gICAgICAgIHBhcnQgPSBwYXJ0cy5zaGlmdCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9O1xuXG4gICAgUmVzb2x2ZVVuaXRlZE51bWJlciA9IGZ1bmN0aW9uIFJlc29sdmVVbml0ZWROdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZykge1xuICAgICAgLy9JRTggaXNzdWVzXG4gICAgICBjc3NfbGluZV9oZWlnaHRfc3RyaW5nID0gY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyA9PT0gXCJhdXRvXCIgPyBcIjBweFwiIDogY3NzX2xpbmVfaGVpZ2h0X3N0cmluZztcblxuICAgICAgaWYgKGNzc19saW5lX2hlaWdodF9zdHJpbmcuaW5kZXhPZihcImVtXCIpID4gLTEgJiYgIWlzTmFOKE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nLnJlcGxhY2UoXCJlbVwiLCBcIlwiKSkpKSB7XG4gICAgICAgIGNzc19saW5lX2hlaWdodF9zdHJpbmcgPSBOdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5yZXBsYWNlKFwiZW1cIiwgXCJcIikpICogMTguNzE5ICsgXCJweFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5pbmRleE9mKFwicHRcIikgPiAtMSAmJiAhaXNOYU4oTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcucmVwbGFjZShcInB0XCIsIFwiXCIpKSkpIHtcbiAgICAgICAgY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyA9IE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nLnJlcGxhY2UoXCJwdFwiLCBcIlwiKSkgKiAxLjMzMyArIFwicHhcIjtcbiAgICAgIH1cblxuICAgICAgdmFyIG5vcm1hbCwgdW5kZWYsIHZhbHVlO1xuICAgICAgdW5kZWYgPSB2b2lkIDA7XG4gICAgICBub3JtYWwgPSAxNi4wMDtcbiAgICAgIHZhbHVlID0gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IHtcbiAgICAgICAgXCJ4eC1zbWFsbFwiOiA5LFxuICAgICAgICBcIngtc21hbGxcIjogMTEsXG4gICAgICAgIHNtYWxsOiAxMyxcbiAgICAgICAgbWVkaXVtOiAxNixcbiAgICAgICAgbGFyZ2U6IDE5LFxuICAgICAgICBcIngtbGFyZ2VcIjogMjMsXG4gICAgICAgIFwieHgtbGFyZ2VcIjogMjgsXG4gICAgICAgIGF1dG86IDBcbiAgICAgIH1bY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ107XG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWYpIHtcbiAgICAgICAgcmV0dXJuIFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXSA9IHZhbHVlIC8gbm9ybWFsO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPSBwYXJzZUZsb2F0KGNzc19saW5lX2hlaWdodF9zdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSB2YWx1ZSAvIG5vcm1hbDtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSBjc3NfbGluZV9oZWlnaHRfc3RyaW5nLm1hdGNoKC8oW1xcZFxcLl0rKShweCkvKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gcGFyc2VGbG9hdCh2YWx1ZVsxXSkgLyBub3JtYWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSAxO1xuICAgIH07XG5cbiAgICBHZXRDU1MgPSBmdW5jdGlvbiBHZXRDU1MoZWxlbWVudCkge1xuICAgICAgdmFyIGNzcywgdG1wLCBjb21wdXRlZENTU0VsZW1lbnQ7XG5cbiAgICAgIGNvbXB1dGVkQ1NTRWxlbWVudCA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICB2YXIgY29tcENTUztcblxuICAgICAgICBjb21wQ1NTID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVsLmN1cnJlbnRTdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsLmN1cnJlbnRTdHlsZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVsLnN0eWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfShlbCk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgcHJvcCA9IHByb3AucmVwbGFjZSgvLVxcRC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaC5jaGFyQXQoMSkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gY29tcENTU1twcm9wXTtcbiAgICAgICAgfTtcbiAgICAgIH0oZWxlbWVudCk7XG5cbiAgICAgIGNzcyA9IHt9O1xuICAgICAgdG1wID0gdm9pZCAwO1xuICAgICAgY3NzW1wiZm9udC1mYW1pbHlcIl0gPSBSZXNvbHZlRm9udChjb21wdXRlZENTU0VsZW1lbnQoXCJmb250LWZhbWlseVwiKSkgfHwgXCJ0aW1lc1wiO1xuICAgICAgY3NzW1wiZm9udC1zdHlsZVwiXSA9IEZvbnRTdHlsZU1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJmb250LXN0eWxlXCIpXSB8fCBcIm5vcm1hbFwiO1xuICAgICAgY3NzW1widGV4dC1hbGlnblwiXSA9IFRleHRBbGlnbk1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJ0ZXh0LWFsaWduXCIpXSB8fCBcImxlZnRcIjtcbiAgICAgIHRtcCA9IEZvbnRXZWlnaHRNYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwiZm9udC13ZWlnaHRcIildIHx8IFwibm9ybWFsXCI7XG5cbiAgICAgIGlmICh0bXAgPT09IFwiYm9sZFwiKSB7XG4gICAgICAgIGlmIChjc3NbXCJmb250LXN0eWxlXCJdID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgY3NzW1wiZm9udC1zdHlsZVwiXSA9IHRtcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjc3NbXCJmb250LXN0eWxlXCJdID0gdG1wICsgY3NzW1wiZm9udC1zdHlsZVwiXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjc3NbXCJmb250LXNpemVcIl0gPSBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcImZvbnQtc2l6ZVwiKSkgfHwgMTtcbiAgICAgIGNzc1tcImxpbmUtaGVpZ2h0XCJdID0gUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJsaW5lLWhlaWdodFwiKSkgfHwgMTtcbiAgICAgIGNzc1tcImRpc3BsYXlcIl0gPSBjb21wdXRlZENTU0VsZW1lbnQoXCJkaXNwbGF5XCIpID09PSBcImlubGluZVwiID8gXCJpbmxpbmVcIiA6IFwiYmxvY2tcIjtcbiAgICAgIHRtcCA9IGNzc1tcImRpc3BsYXlcIl0gPT09IFwiYmxvY2tcIjtcbiAgICAgIGNzc1tcIm1hcmdpbi10b3BcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJtYXJnaW4tdG9wXCIpKSB8fCAwO1xuICAgICAgY3NzW1wibWFyZ2luLWJvdHRvbVwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcIm1hcmdpbi1ib3R0b21cIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWRkaW5nLXRvcFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZGRpbmctdG9wXCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy1ib3R0b21cIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJwYWRkaW5nLWJvdHRvbVwiKSkgfHwgMDtcbiAgICAgIGNzc1tcIm1hcmdpbi1sZWZ0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibWFyZ2luLWxlZnRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJtYXJnaW4tcmlnaHRcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJtYXJnaW4tcmlnaHRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWRkaW5nLWxlZnRcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJwYWRkaW5nLWxlZnRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWRkaW5nLXJpZ2h0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwicGFkZGluZy1yaWdodFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcInBhZ2UtYnJlYWstYmVmb3JlXCJdID0gY29tcHV0ZWRDU1NFbGVtZW50KFwicGFnZS1icmVhay1iZWZvcmVcIikgfHwgXCJhdXRvXCI7IC8vZmxvYXQgYW5kIGNsZWFyaW5nIG9mIGZsb2F0c1xuXG4gICAgICBjc3NbXCJmbG9hdFwiXSA9IEZsb2F0TWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcImNzc0Zsb2F0XCIpXSB8fCBcIm5vbmVcIjtcbiAgICAgIGNzc1tcImNsZWFyXCJdID0gQ2xlYXJNYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwiY2xlYXJcIildIHx8IFwibm9uZVwiO1xuICAgICAgY3NzW1wiY29sb3JcIl0gPSBjb21wdXRlZENTU0VsZW1lbnQoXCJjb2xvclwiKTtcbiAgICAgIHJldHVybiBjc3M7XG4gICAgfTtcblxuICAgIGVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlID0gZnVuY3Rpb24gZWxlbWVudEhhbmRsZWRFbHNld2hlcmUoZWxlbWVudCwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykge1xuICAgICAgdmFyIGhhbmRsZXJzLCBpLCBpc0hhbmRsZWRFbHNld2hlcmUsIGwsIGNsYXNzTmFtZXM7XG4gICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBmYWxzZTtcbiAgICAgIGkgPSB2b2lkIDA7XG4gICAgICBsID0gdm9pZCAwO1xuICAgICAgaGFuZGxlcnMgPSBlbGVtZW50SGFuZGxlcnNbXCIjXCIgKyBlbGVtZW50LmlkXTtcblxuICAgICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgICBsID0gaGFuZGxlcnMubGVuZ3RoO1xuXG4gICAgICAgICAgd2hpbGUgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaSAhPT0gbCkge1xuICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnNbaV0oZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBoYW5kbGVycyA9IGVsZW1lbnRIYW5kbGVyc1tlbGVtZW50Lm5vZGVOYW1lXTtcblxuICAgICAgaWYgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaGFuZGxlcnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnMoZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgIGwgPSBoYW5kbGVycy5sZW5ndGg7XG5cbiAgICAgICAgICB3aGlsZSAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBpICE9PSBsKSB7XG4gICAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVyc1tpXShlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIFRyeSBjbGFzcyBuYW1lc1xuXG5cbiAgICAgIGNsYXNzTmFtZXMgPSB0eXBlb2YgZWxlbWVudC5jbGFzc05hbWUgPT09ICdzdHJpbmcnID8gZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoJyAnKSA6IFtdO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBoYW5kbGVycyA9IGVsZW1lbnRIYW5kbGVyc1snLicgKyBjbGFzc05hbWVzW2ldXTtcblxuICAgICAgICBpZiAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBoYW5kbGVycykge1xuICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnMoZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgIGwgPSBoYW5kbGVycy5sZW5ndGg7XG5cbiAgICAgICAgICAgIHdoaWxlICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGkgIT09IGwpIHtcbiAgICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnNbaV0oZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc0hhbmRsZWRFbHNld2hlcmU7XG4gICAgfTtcblxuICAgIHRhYmxlVG9Kc29uID0gZnVuY3Rpb24gdGFibGVUb0pzb24odGFibGUsIHJlbmRlcmVyKSB7XG4gICAgICB2YXIgZGF0YSwgaGVhZGVycywgaSwgaiwgcm93RGF0YSwgdGFibGVSb3csIHRhYmxlX29iaiwgdGFibGVfd2l0aCwgY2VsbCwgbDtcbiAgICAgIGRhdGEgPSBbXTtcbiAgICAgIGhlYWRlcnMgPSBbXTtcbiAgICAgIGkgPSAwO1xuICAgICAgbCA9IDA7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgbCArPSB0YWJsZS5yb3dzWzBdLmNlbGxzW2pdLmNvbFNwYW47XG4gICAgICB9XG4gICAgICB0YWJsZV93aXRoID0gdGFibGUuY2xpZW50V2lkdGg7XG5cbiAgICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgICBjZWxsID0gdGFibGUucm93c1swXS5jZWxsc1tpXTtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNlbGwuY29sU3BhbjsgaisrKSB7XG4gICAgICAgICAgaGVhZGVyc1tpICsgal0gPSB7XG4gICAgICAgICAgICBuYW1lOiBjZWxsLnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnJykgKyAnXycgKyBqLFxuICAgICAgICAgICAgcHJvbXB0OiBjZWxsLnRleHRDb250ZW50LnJlcGxhY2UoL1xccj9cXG4vZywgJycpLFxuICAgICAgICAgICAgd2lkdGg6IGNlbGwuY2xpZW50V2lkdGggLyB0YWJsZV93aXRoICogcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggLyBjZWxsLmNvbFNwYW5cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaSArPSBqO1xuICAgICAgfVxuXG4gICAgICBpID0gMTtcblxuICAgICAgd2hpbGUgKGkgPCB0YWJsZS5yb3dzLmxlbmd0aCkge1xuICAgICAgICB0YWJsZVJvdyA9IHRhYmxlLnJvd3NbaV07XG4gICAgICAgIHJvd0RhdGEgPSB7fTtcbiAgICAgICAgaiA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGogPCB0YWJsZVJvdy5jZWxscy5sZW5ndGgpIHtcbiAgICAgICAgICByb3dEYXRhW2hlYWRlcnNbal0ubmFtZV0gPSB0YWJsZVJvdy5jZWxsc1tqXS50ZXh0Q29udGVudC5yZXBsYWNlKC9cXHI/XFxuL2csICcnKTtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLnB1c2gocm93RGF0YSk7XG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlX29iaiA9IHtcbiAgICAgICAgcm93czogZGF0YSxcbiAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFyIFNraXBOb2RlID0ge1xuICAgICAgU0NSSVBUOiAxLFxuICAgICAgU1RZTEU6IDEsXG4gICAgICBOT1NDUklQVDogMSxcbiAgICAgIE9CSkVDVDogMSxcbiAgICAgIEVNQkVEOiAxLFxuICAgICAgU0VMRUNUOiAxXG4gICAgfTtcbiAgICB2YXIgbGlzdENvdW50ID0gMTtcblxuICAgIF9EcmlsbEZvckNvbnRlbnQgPSBmdW5jdGlvbiBEcmlsbEZvckNvbnRlbnQoZWxlbWVudCwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykge1xuICAgICAgdmFyIGNuLCBjbnMsIGZyYWdtZW50Q1NTLCBpLCBpc0Jsb2NrLCBsLCB0YWJsZTJqc29uLCBjYjtcbiAgICAgIGNucyA9IGVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgIGNuID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnRDU1MgPSBHZXRDU1MoZWxlbWVudCk7XG4gICAgICBpc0Jsb2NrID0gZnJhZ21lbnRDU1MuZGlzcGxheSA9PT0gXCJibG9ja1wiO1xuXG4gICAgICBpZiAoaXNCbG9jaykge1xuICAgICAgICByZW5kZXJlci5zZXRCbG9ja0JvdW5kYXJ5KCk7XG4gICAgICAgIHJlbmRlcmVyLnNldEJsb2NrU3R5bGUoZnJhZ21lbnRDU1MpO1xuICAgICAgfVxuICAgICAgaSA9IDA7XG4gICAgICBsID0gY25zLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGkgPCBsKSB7XG4gICAgICAgIGNuID0gY25zW2ldO1xuXG4gICAgICAgIGlmICh0eXBlb2YoY24pID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy9leGVjdXRlIGFsbCB3YXRjaGVyIGZ1bmN0aW9ucyB0byBlLmcuIHJlc2V0IGZsb2F0aW5nXG4gICAgICAgICAgcmVuZGVyZXIuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zKGNuKTtcbiAgICAgICAgICAvKioqIEhFQURFUiByZW5kZXJpbmcgKiovXG5cbiAgICAgICAgICBpZiAoY24ubm9kZVR5cGUgPT09IDEgJiYgY24ubm9kZU5hbWUgPT09ICdIRUFERVInKSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gY247IC8vc3RvcmUgb2xkIHRvcCBtYXJnaW5cblxuICAgICAgICAgICAgdmFyIG9sZE1hcmdpblRvcCA9IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3A7IC8vc3Vic2NyaWJlIGZvciBuZXcgcGFnZSBldmVudCBhbmQgcmVuZGVyIGhlYWRlciBmaXJzdCBvbiBldmVyeSBwYWdlXG5cbiAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdhZGRQYWdlJywgZnVuY3Rpb24gKHBhZ2VJbmZvKSB7XG4gICAgICAgICAgICAgIC8vc2V0IGN1cnJlbnQgeSBwb3NpdGlvbiB0byBvbGQgbWFyZ2luXG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSBvbGRNYXJnaW5Ub3A7IC8vcmVuZGVyIGFsbCBjaGlsZCBub2RlcyBvZiB0aGUgaGVhZGVyIGVsZW1lbnRcblxuICAgICAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGhlYWRlciwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7IC8vc2V0IG1hcmdpbiB0byBvbGQgbWFyZ2luICsgcmVuZGVyZWQgaGVhZGVyICsgMTAgc3BhY2UgdG8gcHJldmVudCBvdmVybGFwcGluZ1xuICAgICAgICAgICAgICAvL2ltcG9ydGFudCBmb3Igb3RoZXIgcGx1Z2lucyAoZS5nLiB0YWJsZSkgdG8gc3RhcnQgcmVuZGVyaW5nIGF0IGNvcnJlY3QgcG9zaXRpb24gYWZ0ZXIgaGVhZGVyXG5cblxuICAgICAgICAgICAgICByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wID0gcmVuZGVyZXIueSArIDEwO1xuICAgICAgICAgICAgICByZW5kZXJlci55ICs9IDEwO1xuICAgICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjbi5ub2RlVHlwZSA9PT0gOCAmJiBjbi5ub2RlTmFtZSA9PT0gXCIjY29tbWVudFwiKSB7XG4gICAgICAgICAgICBpZiAofmNuLnRleHRDb250ZW50LmluZGV4T2YoXCJBRERfUEFHRVwiKSkge1xuICAgICAgICAgICAgICByZW5kZXJlci5wZGYuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICByZW5kZXJlci55ID0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVUeXBlID09PSAxICYmICFTa2lwTm9kZVtjbi5ub2RlTmFtZV0pIHtcbiAgICAgICAgICAgIC8qKiogSU1BR0UgUkVOREVSSU5HICoqKi9cbiAgICAgICAgICAgIHZhciBjYWNoZWRfaW1hZ2U7XG5cbiAgICAgICAgICAgIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJJTUdcIikge1xuICAgICAgICAgICAgICB2YXIgdXJsID0gY24uZ2V0QXR0cmlidXRlKFwic3JjXCIpO1xuICAgICAgICAgICAgICBjYWNoZWRfaW1hZ2UgPSBpbWFnZXNbKHJlbmRlcmVyLnBkZi5zSGFzaENvZGUgJiYgcmVuZGVyZXIucGRmLnNIYXNoQ29kZSh1cmwpKSB8fCB1cmxdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2FjaGVkX2ltYWdlKSB7XG4gICAgICAgICAgICAgIGlmIChyZW5kZXJlci5wZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkgLSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tIDwgcmVuZGVyZXIueSArIGNuLmhlaWdodCAmJiByZW5kZXJlci55ID4gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcCkge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5hZGRQYWdlKCk7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3A7IC8vY2hlY2sgaWYgd2UgaGF2ZSB0byBzZXQgYmFjayBzb21lIHZhbHVlcyBkdWUgdG8gZS5nLiBoZWFkZXIgcmVuZGVyaW5nIGZvciBuZXcgcGFnZVxuXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zKGNuKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBpbWFnZXNDU1MgPSBHZXRDU1MoY24pO1xuICAgICAgICAgICAgICB2YXIgaW1hZ2VYID0gcmVuZGVyZXIueDtcbiAgICAgICAgICAgICAgdmFyIGZvbnRUb1VuaXRSYXRpbyA9IDEyIC8gcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yOyAvL2RlZmluZSBhZGRpdGlvbmFsIHBhZGRpbmdzLCBtYXJnaW5zIHdoaWNoIGhhdmUgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50IGZvciBtYXJnaW4gY2FsY3VsYXRpb25zXG5cbiAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxTcGFjZUxlZnQgPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLWxlZnRcIl0gKyBpbWFnZXNDU1NbXCJwYWRkaW5nLWxlZnRcIl0pICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbFNwYWNlUmlnaHQgPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLXJpZ2h0XCJdICsgaW1hZ2VzQ1NTW1wicGFkZGluZy1yaWdodFwiXSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VUb3AgPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLXRvcFwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctdG9wXCJdKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxTcGFjZUJvdHRvbSA9IChpbWFnZXNDU1NbXCJtYXJnaW4tYm90dG9tXCJdICsgaW1hZ2VzQ1NTW1wicGFkZGluZy1ib3R0b21cIl0pICogZm9udFRvVW5pdFJhdGlvOyAvL2lmIGZsb2F0IGlzIHNldCB0byByaWdodCwgbW92ZSB0aGUgaW1hZ2UgdG8gdGhlIHJpZ2h0IGJvcmRlclxuICAgICAgICAgICAgICAvL2FkZCBzcGFjZSBpZiBtYXJnaW4gaXMgc2V0XG5cbiAgICAgICAgICAgICAgaWYgKGltYWdlc0NTU1snZmxvYXQnXSAhPT0gdW5kZWZpbmVkICYmIGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIGltYWdlWCArPSByZW5kZXJlci5zZXR0aW5ncy53aWR0aCAtIGNuLndpZHRoIC0gYWRkaXRpb25hbFNwYWNlUmlnaHQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW1hZ2VYICs9IGFkZGl0aW9uYWxTcGFjZUxlZnQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZW5kZXJlci5wZGYuYWRkSW1hZ2UoY2FjaGVkX2ltYWdlLCBpbWFnZVgsIHJlbmRlcmVyLnkgKyBhZGRpdGlvbmFsU3BhY2VUb3AsIGNuLndpZHRoLCBjbi5oZWlnaHQpO1xuICAgICAgICAgICAgICBjYWNoZWRfaW1hZ2UgPSB1bmRlZmluZWQ7IC8vaWYgdGhlIGZsb2F0IHByb3AgaXMgc3BlY2lmaWVkIHdlIGhhdmUgdG8gZmxvYXQgdGhlIHRleHQgYXJvdW5kIHRoZSBpbWFnZVxuXG4gICAgICAgICAgICAgIGlmIChpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdyaWdodCcgfHwgaW1hZ2VzQ1NTWydmbG9hdCddID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICAvL2FkZCBmdW5jdGlvbnQgdG8gc2V0IGJhY2sgY29vcmRpbmF0ZXMgYWZ0ZXIgaW1hZ2UgcmVuZGVyaW5nXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIud2F0Y2hGdW5jdGlvbnMucHVzaChmdW5jdGlvbiAoZGlmZlgsIHRocmVzaG9sZFksIGRpZmZXaWR0aCwgZWwpIHtcbiAgICAgICAgICAgICAgICAgIC8vdW5kbyBkcmF3aW5nIGJveCBhZGFwdGlvbnMgd2hpY2ggd2VyZSBzZXQgYnkgZmxvYXRpbmdcbiAgICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci55ID49IHRocmVzaG9sZFkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSBkaWZmWDtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggKz0gZGlmZldpZHRoO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwgJiYgZWwubm9kZVR5cGUgPT09IDEgJiYgIVNraXBOb2RlW2VsLm5vZGVOYW1lXSAmJiByZW5kZXJlci54ICsgZWwud2lkdGggPiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MubGVmdCArIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy53aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlci54ICs9IGRpZmZYO1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlci55ID0gdGhyZXNob2xkWTtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggKz0gZGlmZldpZHRoO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgaW1hZ2VzQ1NTWydmbG9hdCddID09PSAnbGVmdCcgPyAtY24ud2lkdGggLSBhZGRpdGlvbmFsU3BhY2VMZWZ0IC0gYWRkaXRpb25hbFNwYWNlUmlnaHQgOiAwLCByZW5kZXJlci55ICsgY24uaGVpZ2h0ICsgYWRkaXRpb25hbFNwYWNlVG9wICsgYWRkaXRpb25hbFNwYWNlQm90dG9tLCBjbi53aWR0aCkpOyAvL3Jlc2V0IGZsb2F0aW5nIGJ5IGNsZWFyOmJvdGggZGl2c1xuICAgICAgICAgICAgICAgIC8vanVzdCBzZXQgY3Vyc29yWSBhZnRlciB0aGUgZmxvYXRpbmcgZWxlbWVudFxuXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIud2F0Y2hGdW5jdGlvbnMucHVzaChmdW5jdGlvbiAoeVBvc2l0aW9uQWZ0ZXJGbG9hdGluZywgcGFnZXMsIGVsKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIueSA8IHlQb3NpdGlvbkFmdGVyRmxvYXRpbmcgJiYgcGFnZXMgPT09IHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5nZXROdW1iZXJPZlBhZ2VzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsLm5vZGVUeXBlID09PSAxICYmIEdldENTUyhlbCkuY2xlYXIgPT09ICdib3RoJykge1xuICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSB5UG9zaXRpb25BZnRlckZsb2F0aW5nO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsIHJlbmRlcmVyLnkgKyBjbi5oZWlnaHQsIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5nZXROdW1iZXJPZlBhZ2VzKCkpKTsgLy9pZiBmbG9hdGluZyBpcyBzZXQgd2UgZGVjcmVhc2UgdGhlIGF2YWlsYWJsZSB3aWR0aCBieSB0aGUgaW1hZ2Ugd2lkdGhcblxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoIC09IGNuLndpZHRoICsgYWRkaXRpb25hbFNwYWNlTGVmdCArIGFkZGl0aW9uYWxTcGFjZVJpZ2h0OyAvL2lmIGxlZnQganVzdCBhZGQgdGhlIGltYWdlIHdpZHRoIHRvIHRoZSBYIGNvb3JkaW5hdGVcblxuICAgICAgICAgICAgICAgIGlmIChpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSBjbi53aWR0aCArIGFkZGl0aW9uYWxTcGFjZUxlZnQgKyBhZGRpdGlvbmFsU3BhY2VSaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9pZiBubyBmbG9hdGluZyBpcyBzZXQsIG1vdmUgdGhlIHJlbmRlcmluZyBjdXJzb3IgYWZ0ZXIgdGhlIGltYWdlIGhlaWdodFxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gY24uaGVpZ2h0ICsgYWRkaXRpb25hbFNwYWNlVG9wICsgYWRkaXRpb25hbFNwYWNlQm90dG9tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8qKiogVEFCTEUgUkVOREVSSU5HICoqKi9cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJUQUJMRVwiKSB7XG4gICAgICAgICAgICAgIGlmKCFyZW5kZXJlci5wZGYuYXV0b1RhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGFibGUyanNvbiA9IHRhYmxlVG9Kc29uKGNuLCByZW5kZXJlcik7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAxMDtcbiAgICAgICAgICAgICAgICByZW5kZXJlci5wZGYudGFibGUocmVuZGVyZXIueCwgcmVuZGVyZXIueSwgdGFibGUyanNvbi5yb3dzLCB0YWJsZTJqc29uLmhlYWRlcnMsIHtcbiAgICAgICAgICAgICAgICAgIGF1dG9TaXplOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIHByaW50SGVhZGVyczogZWxlbWVudEhhbmRsZXJzLnByaW50SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgIG1hcmdpbnM6IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYyxcbiAgICAgICAgICAgICAgICAgIGNzczogR2V0Q1NTKGNuKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYuaW50ZXJuYWwuX19jZWxsX18ubGFzdENlbGwueSArXG4gICAgICAgICAgICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuX19jZWxsX18ubGFzdENlbGwuaGVpZ2h0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMTA7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmF1dG9UYWJsZSh7IHRoZW1lOiBcImdyaWRcIiwgaHRtbDogY24sIHN0YXJ0WTogcmVuZGVyZXIueSxcbiAgICAgICAgICAgICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICAgICAgICAgICBmb250OiByZW5kZXJlci5wZGYuZ2V0Rm9udCgpLmZvbnROYW1lLFxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogcmVuZGVyZXIucGRmLmdldEZvbnRTaXplKCksXG4gICAgICAgICAgICAgICAgICAgIHRleHRDb2xvcjogcmVuZGVyZXIucGRmLmdldFRleHRDb2xvcigpXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgbWFyZ2luOiB7IFxuICAgICAgICAgICAgICAgICAgICB0b3A6IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3AsIFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiByZW5kZXJlci54LCBcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpIC0gKHJlbmRlcmVyLnggICsgcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGgpLCBcbiAgICAgICAgICAgICAgICAgICAgYm90dG9tOiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5sYXN0QXV0b1RhYmxlLmZpbmFsWTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJPTFwiIHx8IGNuLm5vZGVOYW1lID09PSBcIlVMXCIpIHtcbiAgICAgICAgICAgICAgbGlzdENvdW50ID0gMTtcblxuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAxMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiTElcIikge1xuICAgICAgICAgICAgICB2YXIgdGVtcCA9IHJlbmRlcmVyLng7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gMjAgLyByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMztcblxuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIueCA9IHRlbXA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVOYW1lID09PSBcIkJSXCIpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSBmcmFnbWVudENTU1tcImZvbnQtc2l6ZVwiXSAqIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgICAgICAgcmVuZGVyZXIuYWRkVGV4dChcIlxcdTIwMjhcIiwgY2xvbmUoZnJhZ21lbnRDU1MpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICghZWxlbWVudEhhbmRsZWRFbHNld2hlcmUoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpKSB7XG4gICAgICAgICAgICAgICAgX0RyaWxsRm9yQ29udGVudChjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBjbi5ub2RlVmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChjbi5ub2RlVmFsdWUgJiYgY24ucGFyZW50Tm9kZS5ub2RlTmFtZSA9PT0gXCJMSVwiKSB7XG4gICAgICAgICAgICAgIGlmIChjbi5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUgPT09IFwiT0xcIikge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gbGlzdENvdW50KysgKyAnLiAnICsgdmFsdWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gZnJhZ21lbnRDU1NbXCJmb250LXNpemVcIl07XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldFggPSAoMyAtIGZvbnRTaXplICogMC43NSkgKiByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldFkgPSBmb250U2l6ZSAqIDAuNzUgKiByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgICAgdmFyIHJhZGl1cyA9IGZvbnRTaXplICogMS43NCAvIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcblxuICAgICAgICAgICAgICAgIGNiID0gZnVuY3Rpb24gY2IoeCwgeSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5wZGYuY2lyY2xlKHggKyBvZmZzZXRYLCB5ICsgb2Zmc2V0WSwgcmFkaXVzLCAnRkQnKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIE9ubHkgYWRkIHRoZSB0ZXh0IGlmIHRoZSB0ZXh0IG5vZGUgaXMgaW4gdGhlIGJvZHkgZWxlbWVudFxuICAgICAgICAgICAgLy8gQWRkIGNvbXBhdGliaWxpdHkgd2l0aCBJRTExXG5cblxuICAgICAgICAgICAgaWYgKCEhKGNuLm93bmVyRG9jdW1lbnQuYm9keS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihjbikgJiAxNikpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZXIuYWRkVGV4dCh2YWx1ZSwgZnJhZ21lbnRDU1MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNuID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZW5kZXJlci5hZGRUZXh0KGNuLCBmcmFnbWVudENTUyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50SGFuZGxlcnMub3V0WSA9IHJlbmRlcmVyLnk7XG5cbiAgICAgIGlmIChpc0Jsb2NrKSB7XG4gICAgICAgIHJldHVybiByZW5kZXJlci5zZXRCbG9ja0JvdW5kYXJ5KGNiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaW1hZ2VzID0ge307XG5cbiAgICBsb2FkSW1ncyA9IGZ1bmN0aW9uIGxvYWRJbWdzKGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMsIGNiKSB7XG4gICAgICB2YXIgaW1ncyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpLFxuICAgICAgICAgIGwgPSBpbWdzLmxlbmd0aCxcbiAgICAgICAgICBmb3VuZF9pbWFnZXMsXG4gICAgICAgICAgeCA9IDA7XG5cbiAgICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5ldmVudHMucHVibGlzaCgnaW1hZ2VzTG9hZGVkJyk7XG4gICAgICAgIGNiKGZvdW5kX2ltYWdlcyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGxvYWRJbWFnZSh1cmwsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKCF1cmwpIHJldHVybjtcbiAgICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBmb3VuZF9pbWFnZXMgPSArK3g7XG4gICAgICAgIGltZy5jcm9zc09yaWdpbiA9ICcnO1xuXG4gICAgICAgIGltZy5vbmVycm9yID0gaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoaW1nLmNvbXBsZXRlKSB7XG4gICAgICAgICAgICAvL3RvIHN1cHBvcnQgZGF0YSB1cmxzIGluIGltYWdlcywgc2V0IHdpZHRoIGFuZCBoZWlnaHRcbiAgICAgICAgICAgIC8vYXMgdGhvc2UgdmFsdWVzIGFyZSBub3QgcmVjb2duaXplZCBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAgICBpZiAoaW1nLnNyYy5pbmRleE9mKCdkYXRhOmltYWdlLycpID09PSAwKSB7XG4gICAgICAgICAgICAgIGltZy53aWR0aCA9IHdpZHRoIHx8IGltZy53aWR0aCB8fCAwO1xuICAgICAgICAgICAgICBpbWcuaGVpZ2h0ID0gaGVpZ2h0IHx8IGltZy5oZWlnaHQgfHwgMDtcbiAgICAgICAgICAgIH0gLy9pZiB2YWxpZCBpbWFnZSBhZGQgdG8ga25vd24gaW1hZ2VzIGFycmF5XG5cblxuICAgICAgICAgICAgaWYgKGltZy53aWR0aCArIGltZy5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgdmFyIGhhc2ggPSAocmVuZGVyZXIucGRmLnNIYXNoQ29kZSAmJiByZW5kZXJlci5wZGYuc0hhc2hDb2RlKHVybCkpIHx8IHVybDtcbiAgICAgICAgICAgICAgaW1hZ2VzW2hhc2hdID0gaW1hZ2VzW2hhc2hdIHx8IGltZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoISAtLXgpIHtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaW1nLnNyYyA9IHVybDtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGwtLSkge1xuICAgICAgICBsb2FkSW1hZ2UoaW1nc1tsXS5nZXRBdHRyaWJ1dGUoXCJzcmNcIiksIGltZ3NbbF0ud2lkdGgsIGltZ3NbbF0uaGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHggfHwgZG9uZSgpO1xuICAgIH07XG5cbiAgICBjaGVja0ZvckZvb3RlciA9IGZ1bmN0aW9uIGNoZWNrRm9yRm9vdGVyKGVsZW0sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpIHtcbiAgICAgIC8vY2hlY2sgaWYgd2UgY2FuIGZvdW5kIGEgPGZvb3Rlcj4gZWxlbWVudFxuICAgICAgdmFyIGZvb3RlciA9IGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJmb290ZXJcIik7XG5cbiAgICAgIGlmIChmb290ZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBmb290ZXIgPSBmb290ZXJbMF07IC8vYmFkIGhhY2sgdG8gZ2V0IGhlaWdodCBvZiBmb290ZXJcbiAgICAgICAgLy9jcmVhdCBkdW1teSBvdXQgYW5kIGNoZWNrIG5ldyB5IGFmdGVyIGZha2UgcmVuZGVyaW5nXG5cbiAgICAgICAgdmFyIG9sZE91dCA9IHJlbmRlcmVyLnBkZi5pbnRlcm5hbC53cml0ZTtcbiAgICAgICAgdmFyIG9sZFkgPSByZW5kZXJlci55O1xuXG4gICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC53cml0ZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgICAgIF9EcmlsbEZvckNvbnRlbnQoZm9vdGVyLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTtcblxuICAgICAgICB2YXIgZm9vdGVySGVpZ2h0ID0gTWF0aC5jZWlsKHJlbmRlcmVyLnkgLSBvbGRZKSArIDU7XG4gICAgICAgIHJlbmRlcmVyLnkgPSBvbGRZO1xuICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwud3JpdGUgPSBvbGRPdXQ7IC8vYWRkIDIwJSB0byBwcmV2ZW50IG92ZXJsYXBwaW5nXG5cbiAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSArPSBmb290ZXJIZWlnaHQ7IC8vQ3JlYXRlIGZ1bmN0aW9uIHJlbmRlciBoZWFkZXIgb24gZXZlcnkgcGFnZVxuXG4gICAgICAgIHZhciByZW5kZXJGb290ZXIgPSBmdW5jdGlvbiByZW5kZXJGb290ZXIocGFnZUluZm8pIHtcbiAgICAgICAgICB2YXIgcGFnZU51bWJlciA9IHBhZ2VJbmZvICE9PSB1bmRlZmluZWQgPyBwYWdlSW5mby5wYWdlTnVtYmVyIDogMTsgLy9zZXQgY3VycmVudCB5IHBvc2l0aW9uIHRvIG9sZCBtYXJnaW5cblxuICAgICAgICAgIHZhciBvbGRQb3NpdGlvbiA9IHJlbmRlcmVyLnk7IC8vcmVuZGVyIGFsbCBjaGlsZCBub2RlcyBvZiB0aGUgaGVhZGVyIGVsZW1lbnRcblxuICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkgLSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tO1xuICAgICAgICAgIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy5ib3R0b20gLT0gZm9vdGVySGVpZ2h0OyAvL2NoZWNrIGlmIHdlIGhhdmUgdG8gYWRkIHBhZ2UgbnVtYmVyc1xuXG4gICAgICAgICAgdmFyIHNwYW5zID0gZm9vdGVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzcGFuJyk7XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAvL2lmIHdlIGZpbmQgc29tZSBzcGFuIGVsZW1lbnQgd2l0aCBjbGFzcyBwYWdlQ291bnRlciwgc2V0IHRoZSBwYWdlXG4gICAgICAgICAgICBpZiAoKFwiIFwiICsgc3BhbnNbaV0uY2xhc3NOYW1lICsgXCIgXCIpLnJlcGxhY2UoL1tcXG5cXHRdL2csIFwiIFwiKS5pbmRleE9mKFwiIHBhZ2VDb3VudGVyIFwiKSA+IC0xKSB7XG4gICAgICAgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9IHBhZ2VOdW1iZXI7XG4gICAgICAgICAgICB9IC8vaWYgd2UgZmluZCBzb21lIHNwYW4gZWxlbWVudCB3aXRoIGNsYXNzIHRvdGFsUGFnZXMsIHNldCBhIHZhcmlhYmxlIHdoaWNoIGlzIHJlcGxhY2VkIGFmdGVyIHJlbmRlcmluZyBvZiBhbGwgcGFnZXNcblxuXG4gICAgICAgICAgICBpZiAoKFwiIFwiICsgc3BhbnNbaV0uY2xhc3NOYW1lICsgXCIgXCIpLnJlcGxhY2UoL1tcXG5cXHRdL2csIFwiIFwiKS5pbmRleE9mKFwiIHRvdGFsUGFnZXMgXCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgc3BhbnNbaV0uaW5uZXJIVE1MID0gJyMjI2pzUERGVmFyVG90YWxQYWdlcyMjIyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvL3JlbmRlciBmb290ZXIgY29udGVudFxuXG5cbiAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGZvb3RlciwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7IC8vc2V0IGJvdHRvbSBtYXJnaW4gdG8gcHJldmlvdXMgaGVpZ2h0IGluY2x1ZGluZyB0aGUgZm9vdGVyIGhlaWdodFxuXG5cbiAgICAgICAgICByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tICs9IGZvb3RlckhlaWdodDsgLy9pbXBvcnRhbnQgZm9yIG90aGVyIHBsdWdpbnMgKGUuZy4gdGFibGUpIHRvIHN0YXJ0IHJlbmRlcmluZyBhdCBjb3JyZWN0IHBvc2l0aW9uIGFmdGVyIGhlYWRlclxuXG4gICAgICAgICAgcmVuZGVyZXIueSA9IG9sZFBvc2l0aW9uO1xuICAgICAgICB9OyAvL2NoZWNrIGlmIGZvb3RlciBjb250YWlucyB0b3RhbFBhZ2VzIHdoaWNoIHNob3VsZCBiZSByZXBsYWNlIGF0IHRoZSBkaXNvcG9zYWwgb2YgdGhlIGRvY3VtZW50XG5cblxuICAgICAgICB2YXIgc3BhbnMgPSBmb290ZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NwYW4nKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKChcIiBcIiArIHNwYW5zW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKC9bXFxuXFx0XS9nLCBcIiBcIikuaW5kZXhPZihcIiB0b3RhbFBhZ2VzIFwiKSA+IC0xKSB7XG4gICAgICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnaHRtbFJlbmRlcmluZ0ZpbmlzaGVkJywgcmVuZGVyZXIucGRmLnB1dFRvdGFsUGFnZXMuYmluZChyZW5kZXJlci5wZGYsICcjIyNqc1BERlZhclRvdGFsUGFnZXMjIyMnKSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vcmVnaXN0ZXIgZXZlbnQgdG8gcmVuZGVyIGZvb3RlciBvbiBldmVyeSBuZXcgcGFnZVxuXG5cbiAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ2FkZFBhZ2UnLCByZW5kZXJGb290ZXIsIGZhbHNlKTsgLy9yZW5kZXIgZm9vdGVyIG9uIGZpcnN0IHBhZ2VcblxuICAgICAgICByZW5kZXJGb290ZXIoKTsgLy9wcmV2ZW50IGZvb3RlciByZW5kZXJpbmdcblxuICAgICAgICBTa2lwTm9kZVsnRk9PVEVSJ10gPSAxO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwcm9jZXNzID0gZnVuY3Rpb24gcHJvY2VzcyhwZGYsIGVsZW1lbnQsIHgsIHksIHNldHRpbmdzLCBjYWxsYmFjaykge1xuICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQgIT09IFwic3RyaW5nXCIgJiYgIWVsZW1lbnQucGFyZW50Tm9kZSkgZWxlbWVudCA9ICcnICsgZWxlbWVudC5pbm5lckhUTUw7XG5cbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBlbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgJGZyYW1lLCAkaGlkZGVuZGl2LCBmcmFtZW5hbWUsIHZpc3VhbGx5aGlkZGVuO1xuICAgICAgICAgIGZyYW1lbmFtZSA9IFwianNQREZodG1sVGV4dFwiICsgRGF0ZS5ub3coKS50b1N0cmluZygpICsgKE1hdGgucmFuZG9tKCkgKiAxMDAwKS50b0ZpeGVkKDApO1xuICAgICAgICAgIHZpc3VhbGx5aGlkZGVuID0gXCJwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcIiArIFwiY2xpcDogcmVjdCgxcHggMXB4IDFweCAxcHgpOyAvKiBJRTYsIElFNyAqL1wiICsgXCJjbGlwOiByZWN0KDFweCwgMXB4LCAxcHgsIDFweCk7XCIgKyBcInBhZGRpbmc6MCAhaW1wb3J0YW50O1wiICsgXCJib3JkZXI6MCAhaW1wb3J0YW50O1wiICsgXCJoZWlnaHQ6IDFweCAhaW1wb3J0YW50O1wiICsgXCJ3aWR0aDogMXB4ICFpbXBvcnRhbnQ7IFwiICsgXCJ0b3A6YXV0bztcIiArIFwibGVmdDotMTAwcHg7XCIgKyBcIm92ZXJmbG93OiBoaWRkZW47XCI7XG4gICAgICAgICAgJGhpZGRlbmRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICRoaWRkZW5kaXYuY2xhc3NOYW1lID0gXCJzanMtcGRmLWhpZGRlbi1odG1sLWRpdlwiO1xuICAgICAgICAgICRoaWRkZW5kaXYuc3R5bGUuY3NzVGV4dCA9IHZpc3VhbGx5aGlkZGVuO1xuICAgICAgICAgICRoaWRkZW5kaXYuaW5uZXJIVE1MID0gXCI8aWZyYW1lIHN0eWxlPVxcXCJoZWlnaHQ6MXB4O3dpZHRoOjFweFxcXCIgbmFtZT1cXFwiXCIgKyBmcmFtZW5hbWUgKyBcIlxcXCIgLz5cIjtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCRoaWRkZW5kaXYpO1xuICAgICAgICAgICRmcmFtZSA9IHdpbmRvdy5mcmFtZXNbZnJhbWVuYW1lXTtcbiAgICAgICAgICAkZnJhbWUuZG9jdW1lbnQub3BlbigpO1xuICAgICAgICAgICRmcmFtZS5kb2N1bWVudC53cml0ZWxuKGVsZW1lbnQpO1xuICAgICAgICAgICRmcmFtZS5kb2N1bWVudC5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybiAkZnJhbWUuZG9jdW1lbnQuYm9keTtcbiAgICAgICAgfShlbGVtZW50LnJlcGxhY2UoLzxcXC8/c2NyaXB0W14+XSo/Pi9naSwgJycpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGF2YWlsYWJsZUZvbnRzID0gT2JqZWN0LmtleXMocGRmLmdldEZvbnRMaXN0KCkpO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGF2YWlsYWJsZUZvbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBmb250TmFtZSA9IGF2YWlsYWJsZUZvbnRzW2ldO1xuICAgICAgICB2YXIgZm9udEZhbWlseSA9IGZvbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmKCFGb250TmFtZURCW2ZvbnRGYW1pbHldKSB7XG4gICAgICAgICAgRm9udE5hbWVEQltmb250RmFtaWx5XSA9IGZvbnROYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciByID0gbmV3IFJlbmRlcmVyKHBkZiwgeCwgeSwgc2V0dGluZ3MpLFxuICAgICAgICAgIG91dDsgLy8gMS4gbG9hZCBpbWFnZXNcbiAgICAgIC8vIDIuIHByZXBhcmUgb3B0aW9uYWwgZm9vdGVyIGVsZW1lbnRzXG4gICAgICAvLyAzLiByZW5kZXIgY29udGVudFxuXG4gICAgICBsb2FkSW1ncy5jYWxsKHRoaXMsIGVsZW1lbnQsIHIsIHNldHRpbmdzLmVsZW1lbnRIYW5kbGVycywgZnVuY3Rpb24gKGZvdW5kX2ltYWdlcykge1xuICAgICAgICBjaGVja0ZvckZvb3RlcihlbGVtZW50LCByLCBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMpO1xuXG4gICAgICAgIF9EcmlsbEZvckNvbnRlbnQoZWxlbWVudCwgciwgc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzKTsgLy9zZW5kIGV2ZW50IGRpc3Bvc2UgZm9yIGZpbmFsIHRha3MgKGUuZy4gZm9vdGVyIHRvdGFscGFnZSByZXBsYWNlbWVudClcblxuXG4gICAgICAgIHIucGRmLmludGVybmFsLmV2ZW50cy5wdWJsaXNoKCdodG1sUmVuZGVyaW5nRmluaXNoZWQnKTtcbiAgICAgICAgb3V0ID0gci5kaXNwb3NlKCk7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIGNhbGxiYWNrKG91dCk7ZWxzZSBpZiAoZm91bmRfaW1hZ2VzKSBjb25zb2xlLmVycm9yKCdqc1BERiBXYXJuaW5nOiByZW5kZXJpbmcgaXNzdWVzPyBwcm92aWRlIGEgY2FsbGJhY2sgdG8gZnJvbUhUTUwhJyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvdXQgfHwge1xuICAgICAgICB4OiByLngsXG4gICAgICAgIHk6IHIueVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnBhcmFncmFwaCA9IHtcbiAgICAgICAgdGV4dDogW10sXG4gICAgICAgIHN0eWxlOiBbXVxuICAgICAgfTtcbiAgICAgIHJldHVybiB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcInFcIik7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJRXCIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogdGhpcy54LFxuICAgICAgICB5OiB0aGlzLnksXG4gICAgICAgIHJlYWR5OiB0cnVlXG4gICAgICB9O1xuICAgIH07IC8vQ2hlY2tzIGlmIHdlIGhhdmUgdG8gZXhlY3V0ZSBzb21lIHdhdGNoZXIgZnVuY3Rpb25zXG4gICAgLy9lLmcuIHRvIGVuZCB0ZXh0IGZsb2F0aW5nIGFyb3VuZCBhbiBpbWFnZVxuXG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICB2YXIgcmV0ID0gZmFsc2U7XG4gICAgICB2YXIgbmFycmF5ID0gW107XG5cbiAgICAgIGlmICh0aGlzLndhdGNoRnVuY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndhdGNoRnVuY3Rpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKHRoaXMud2F0Y2hGdW5jdGlvbnNbaV0oZWwpID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuYXJyYXkucHVzaCh0aGlzLndhdGNoRnVuY3Rpb25zW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndhdGNoRnVuY3Rpb25zID0gbmFycmF5O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuc3BsaXRGcmFnbWVudHNJbnRvTGluZXMgPSBmdW5jdGlvbiAoZnJhZ21lbnRzLCBzdHlsZXMpIHtcbiAgICAgIHZhciBjdXJyZW50TGluZUxlbmd0aCwgZGVmYXVsdEZvbnRTaXplLCBmZiwgZm9udE1ldHJpY3MsIGZvbnRNZXRyaWNzQ2FjaGUsIGZyYWdtZW50LCBmcmFnbWVudENob3BwZWQsIGZyYWdtZW50TGVuZ3RoLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcywgZnMsIGssIGxpbmUsIGxpbmVzLCBtYXhMaW5lTGVuZ3RoLCBzdHlsZTtcbiAgICAgIGRlZmF1bHRGb250U2l6ZSA9IDEyO1xuICAgICAgayA9IHRoaXMucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgZm9udE1ldHJpY3NDYWNoZSA9IHt9O1xuICAgICAgZmYgPSB2b2lkIDA7XG4gICAgICBmcyA9IHZvaWQgMDtcbiAgICAgIGZvbnRNZXRyaWNzID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnQgPSB2b2lkIDA7XG4gICAgICBzdHlsZSA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnRMZW5ndGggPSB2b2lkIDA7XG4gICAgICBmcmFnbWVudENob3BwZWQgPSB2b2lkIDA7XG4gICAgICBsaW5lID0gW107XG4gICAgICBsaW5lcyA9IFtsaW5lXTtcbiAgICAgIGN1cnJlbnRMaW5lTGVuZ3RoID0gMDtcbiAgICAgIG1heExpbmVMZW5ndGggPSB0aGlzLnNldHRpbmdzLndpZHRoO1xuXG4gICAgICB3aGlsZSAoZnJhZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50cy5zaGlmdCgpO1xuICAgICAgICBzdHlsZSA9IHN0eWxlcy5zaGlmdCgpO1xuXG4gICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgIGZmID0gc3R5bGVbXCJmb250LWZhbWlseVwiXTtcbiAgICAgICAgICBmcyA9IHN0eWxlW1wiZm9udC1zdHlsZVwiXTtcbiAgICAgICAgICBmb250TWV0cmljcyA9IGZvbnRNZXRyaWNzQ2FjaGVbZmYgKyBmc107XG5cbiAgICAgICAgICBpZiAoIWZvbnRNZXRyaWNzKSB7XG4gICAgICAgICAgICBmb250TWV0cmljcyA9IHRoaXMucGRmLmludGVybmFsLmdldEZvbnQoZmYsIGZzKS5tZXRhZGF0YS5Vbmljb2RlO1xuICAgICAgICAgICAgZm9udE1ldHJpY3NDYWNoZVtmZiArIGZzXSA9IGZvbnRNZXRyaWNzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzID0ge1xuICAgICAgICAgICAgd2lkdGhzOiBmb250TWV0cmljcy53aWR0aHMsXG4gICAgICAgICAgICBrZXJuaW5nOiBmb250TWV0cmljcy5rZXJuaW5nLFxuICAgICAgICAgICAgZm9udFNpemU6IHN0eWxlW1wiZm9udC1zaXplXCJdICogZGVmYXVsdEZvbnRTaXplLFxuICAgICAgICAgICAgdGV4dEluZGVudDogY3VycmVudExpbmVMZW5ndGhcbiAgICAgICAgICB9O1xuICAgICAgICAgIGZyYWdtZW50TGVuZ3RoID0gdGhpcy5wZGYuZ2V0U3RyaW5nVW5pdFdpZHRoKGZyYWdtZW50LCBmcmFnbWVudFNwZWNpZmljTWV0cmljcykgKiBmcmFnbWVudFNwZWNpZmljTWV0cmljcy5mb250U2l6ZSAvIGs7XG5cbiAgICAgICAgICBpZiAoZnJhZ21lbnQgPT0gXCJcXHUyMDI4XCIpIHtcbiAgICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50TGluZUxlbmd0aCArIGZyYWdtZW50TGVuZ3RoID4gbWF4TGluZUxlbmd0aCkge1xuICAgICAgICAgICAgZnJhZ21lbnRDaG9wcGVkID0gdGhpcy5wZGYuc3BsaXRUZXh0VG9TaXplKGZyYWdtZW50LCBtYXhMaW5lTGVuZ3RoLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcyk7XG4gICAgICAgICAgICBsaW5lLnB1c2goW2ZyYWdtZW50Q2hvcHBlZC5zaGlmdCgpLCBzdHlsZV0pO1xuXG4gICAgICAgICAgICB3aGlsZSAoZnJhZ21lbnRDaG9wcGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICBsaW5lID0gW1tmcmFnbWVudENob3BwZWQuc2hpZnQoKSwgc3R5bGVdXTtcbiAgICAgICAgICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3VycmVudExpbmVMZW5ndGggPSB0aGlzLnBkZi5nZXRTdHJpbmdVbml0V2lkdGgobGluZVswXVswXSwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpICogZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MuZm9udFNpemUgLyBrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaW5lLnB1c2goW2ZyYWdtZW50LCBzdHlsZV0pO1xuICAgICAgICAgICAgY3VycmVudExpbmVMZW5ndGggKz0gZnJhZ21lbnRMZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vaWYgdGV4dCBhbGlnbm1lbnQgd2FzIHNldCwgc2V0IG1hcmdpbi9pbmRlbnQgb2YgZWFjaCBsaW5lXG5cblxuICAgICAgaWYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gIT09IHVuZGVmaW5lZCAmJiAoc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ2NlbnRlcicgfHwgc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ3JpZ2h0JyB8fCBzdHlsZVsndGV4dC1hbGlnbiddID09PSAnanVzdGlmeScpKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5wZGYuZ2V0U3RyaW5nVW5pdFdpZHRoKGxpbmVzW2ldWzBdWzBdLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcykgKiBmcmFnbWVudFNwZWNpZmljTWV0cmljcy5mb250U2l6ZSAvIGs7IC8vaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uIGxpbmUgd2UgaGF2ZSB0byBjbG9uZSB0aGUgc3R5bGUgb2JqZWN0IGFzIGFsbCBsaW5lcyBob2xkIGEgcmVmZXJlbmNlIG9uIHRoaXMgb2JqZWN0XG5cbiAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdID0gY2xvbmUobGluZXNbaV1bMF1bMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBzcGFjZSA9IG1heExpbmVMZW5ndGggLSBsZW5ndGg7XG5cbiAgICAgICAgICBpZiAoc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ21hcmdpbi1sZWZ0J10gPSBzcGFjZTsgLy9pZiBhbGlnbm1lbnQgaXMgbm90IHJpZ2h0LCBpdCBoYXMgdG8gYmUgY2VudGVyIHNvIHNwbGl0IHRoZSBzcGFjZSB0byB0aGUgbGVmdCBhbmQgdGhlIHJpZ2h0XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHlsZVsndGV4dC1hbGlnbiddID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ21hcmdpbi1sZWZ0J10gPSBzcGFjZSAvIDI7IC8vaWYganVzdGlmeSB3YXMgc2V0LCBjYWxjdWxhdGUgdGhlIHdvcmQgc3BhY2luZyBhbmQgZGVmaW5lIGluIGJ5IHVzaW5nIHRoZSBjc3MgcHJvcGVydHlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdqdXN0aWZ5Jykge1xuICAgICAgICAgICAgdmFyIGNvdW50U3BhY2VzID0gbGluZXNbaV1bMF1bMF0uc3BsaXQoJyAnKS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ3dvcmQtc3BhY2luZyddID0gc3BhY2UgLyBjb3VudFNwYWNlczsgLy9pZ25vcmUgdGhlIGxhc3QgbGluZSBpbiBqdXN0aWZ5IG1vZGVcblxuICAgICAgICAgICAgaWYgKGkgPT09IGxpbmVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ3dvcmQtc3BhY2luZyddID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuUmVuZGVyVGV4dEZyYWdtZW50ID0gZnVuY3Rpb24gKHRleHQsIHN0eWxlKSB7XG4gICAgICB2YXIgZGVmYXVsdEZvbnRTaXplLCBmb250LCBtYXhMaW5lSGVpZ2h0O1xuICAgICAgbWF4TGluZUhlaWdodCA9IDA7XG4gICAgICBkZWZhdWx0Rm9udFNpemUgPSAxMjtcblxuICAgICAgaWYgKHRoaXMucGRmLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gdGhpcy5wZGYubWFyZ2luc19kb2MuYm90dG9tIDwgdGhpcy55ICsgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Rm9udFNpemUoKSkge1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcIkVUXCIsIFwiUVwiLCBcIlFcIik7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlTnVtYmVyID0gdGhpcy5wZGYuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcjtcbiAgICAgICAgaWYgKHRoaXMucGRmLmdldE51bWJlck9mUGFnZXMoKSA9PT0gY3VycmVudFBhZ2VOdW1iZXIpIHRoaXMucGRmLmFkZFBhZ2UoKTtcbiAgICAgICAgZWxzZSB0aGlzLnBkZi5zZXRQYWdlKGN1cnJlbnRQYWdlTnVtYmVyICsgMSk7XG4gICAgICAgIHRoaXMueSA9IHRoaXMucGRmLm1hcmdpbnNfZG9jLnRvcDtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJxXCIsIFwicVwiLCBcIkJUXCIsIHRoaXMuZ2V0UGRmQ29sb3Ioc3R5bGUuY29sb3IpLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKHRoaXMueCksIHRoaXMucGRmLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyh0aGlzLnkpLCBcIlRkXCIpOyAvL21vdmUgY3Vyc29yIGJ5IG9uZSBsaW5lIG9uIG5ldyBwYWdlXG5cbiAgICAgICAgbWF4TGluZUhlaWdodCA9IE1hdGgubWF4KG1heExpbmVIZWlnaHQsIHN0eWxlW1wibGluZS1oZWlnaHRcIl0sIHN0eWxlW1wiZm9udC1zaXplXCJdKTtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoMCwgKC0xICogZGVmYXVsdEZvbnRTaXplICogbWF4TGluZUhlaWdodCkudG9GaXhlZCgyKSwgXCJUZFwiKTtcbiAgICAgIH1cblxuICAgICAgZm9udCA9IHRoaXMucGRmLmludGVybmFsLmdldEZvbnQoc3R5bGVbXCJmb250LWZhbWlseVwiXSwgc3R5bGVbXCJmb250LXN0eWxlXCJdKTsgLy8gdGV4dCBjb2xvclxuXG4gICAgICB2YXIgcGRmVGV4dENvbG9yID0gdGhpcy5nZXRQZGZDb2xvcihzdHlsZVtcImNvbG9yXCJdKTtcblxuICAgICAgaWYgKHBkZlRleHRDb2xvciAhPT0gdGhpcy5sYXN0VGV4dENvbG9yKSB7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKHBkZlRleHRDb2xvcik7XG4gICAgICAgIHRoaXMubGFzdFRleHRDb2xvciA9IHBkZlRleHRDb2xvcjtcbiAgICAgIH0gLy9zZXQgdGhlIHdvcmQgc3BhY2luZyBmb3IgZS5nLiBqdXN0aWZ5IHN0eWxlXG5cblxuICAgICAgaWYgKHN0eWxlWyd3b3JkLXNwYWNpbmcnXSAhPT0gdW5kZWZpbmVkICYmIHN0eWxlWyd3b3JkLXNwYWNpbmcnXSA+IDApIHtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoc3R5bGVbJ3dvcmQtc3BhY2luZyddLnRvRml4ZWQoMiksIFwiVHdcIik7XG4gICAgICB9XG5cblxuICAgICAgdmFyIHBkZkVzY2FwZTE2ID0gZnVuY3Rpb24odGV4dCwgZm9udCkge1xuICAgICAgICB2YXIgd2lkdGhzID0gZm9udC5tZXRhZGF0YS5Vbmljb2RlLndpZHRocztcbiAgICAgICAgdmFyIHBhZHogPSBbXCJcIiwgXCIwXCIsIFwiMDBcIiwgXCIwMDBcIiwgXCIwMDAwXCJdO1xuICAgICAgICB2YXIgYXIgPSBbXCJcIl07XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGV4dC5sZW5ndGgsIHQ7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICB0ID0gZm9udC5tZXRhZGF0YS5jaGFyYWN0ZXJUb0dseXBoKHRleHQuY2hhckNvZGVBdChpKSk7XG4gICAgICAgICAgZm9udC5tZXRhZGF0YS5nbHlJZHNVc2VkLnB1c2godCk7XG4gICAgICAgICAgZm9udC5tZXRhZGF0YS50b1VuaWNvZGVbdF0gPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgaWYgKHdpZHRocy5pbmRleE9mKHQpID09IC0xKSB7XG4gICAgICAgICAgICB3aWR0aHMucHVzaCh0KTtcbiAgICAgICAgICAgIHdpZHRocy5wdXNoKFtwYXJzZUludChmb250Lm1ldGFkYXRhLndpZHRoT2ZHbHlwaCh0KSwgMTApXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0ID09IFwiMFwiKSB7XG4gICAgICAgICAgICAvL1NwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gY21hcC5cbiAgICAgICAgICAgIHJldHVybiBhci5qb2luKFwiXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ID0gdC50b1N0cmluZygxNik7XG4gICAgICAgICAgICBhci5wdXNoKHBhZHpbNCAtIHQubGVuZ3RoXSwgdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhci5qb2luKFwiXCIpO1xuICAgICAgfTtcblxuICAgICAgdmFyIHV0ZjhUZXh0RnVuY3Rpb24gPSBmdW5jdGlvbih0ZXh0LCBmb250KSB7XG4gICAgICAgIHZhciB0ZXh0ID0gdGV4dCB8fCBcIlwiO1xuICAgIFxuICAgICAgICB2YXIgc3RyID0gXCJcIixcbiAgICAgICAgICBzID0gMCxcbiAgICAgICAgICBjbWFwQ29uZmlybTtcbiAgICAgICAgdmFyIHN0clRleHQgPSBcIlwiO1xuICAgICAgICB2YXIgZW5jb2RpbmcgPSBmb250LmVuY29kaW5nO1xuICAgIFxuICAgICAgICBpZiAoZm9udC5lbmNvZGluZyAhPT0gXCJJZGVudGl0eS1IXCIpIHtcbiAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfVxuICAgICAgICBzdHJUZXh0ID0gdGV4dDtcbiAgICBcbiAgICAgICAgZm9yIChzID0gMDsgcyA8IHN0clRleHQubGVuZ3RoOyBzICs9IDEpIHtcbiAgICAgICAgICBpZiAoZm9udC5tZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShcImNtYXBcIikpIHtcbiAgICAgICAgICAgIGNtYXBDb25maXJtID0gZm9udC5tZXRhZGF0YS5jbWFwLnVuaWNvZGUuY29kZU1hcFtzdHJUZXh0W3NdLmNoYXJDb2RlQXQoMCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWNtYXBDb25maXJtKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHN0clRleHRbc10uY2hhckNvZGVBdCgwKSA8IDI1NiAmJlxuICAgICAgICAgICAgICBmb250Lm1ldGFkYXRhLmhhc093blByb3BlcnR5KFwiVW5pY29kZVwiKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHN0ciArPSBzdHJUZXh0W3NdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RyICs9IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciArPSBzdHJUZXh0W3NdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgaWYgKHBhcnNlSW50KGZvbnQuaWQuc2xpY2UoMSkpIDwgMTQgfHwgZW5jb2RpbmcgPT09IFwiV2luQW5zaUVuY29kaW5nXCIpIHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLnBkZi5pbnRlcm5hbC5wZGZFc2NhcGUoc3RyLCBrZXkpXG4gICAgICAgICAgICAuc3BsaXQoXCJcIilcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24oY3YpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGN2LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGVuY29kaW5nID09PSBcIklkZW50aXR5LUhcIikge1xuICAgICAgICAgIHJlc3VsdCA9IHBkZkVzY2FwZTE2KHN0ciwgZm9udCk7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07ICAgICAgXG5cbiAgICAgIC8vIHZhciBlc2NhcGVkVGV4dCA9IHRoaXMucGRmLmludGVybmFsLnBkZkVzY2FwZSh0ZXh0KTtcbiAgICAgIC8vIHZhciBlc2NhcGVkVGV4dCA9IHV0ZjhUZXh0RnVuY3Rpb24odGV4dCwgZm9udCk7XG4gICAgICAvLyBpZihlc2NhcGVkVGV4dCAhPSB0ZXh0KSB7XG4gICAgICAvLyAgIGVzY2FwZWRUZXh0ID0gXCI8XCIgKyBlc2NhcGVkVGV4dCArIFwiPlwiO1xuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgZXNjYXBlZFRleHQgPSBcIihcIiArIGVzY2FwZWRUZXh0ICsgXCIpXCI7XG4gICAgICAvLyB9XG5cbiAgICAgIHZhciBlc2NhcGVkVGV4dCA9IFwiXCI7XG4gICAgICBpZihmb250LmVuY29kaW5nICE9PSBcIklkZW50aXR5LUhcIikge1xuICAgICAgICBlc2NhcGVkVGV4dCA9IFwiKFwiICsgdGhpcy5wZGYuaW50ZXJuYWwucGRmRXNjYXBlKHRleHQpICsgXCIpXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlc2NhcGVkVGV4dCA9IFwiPFwiICsgdXRmOFRleHRGdW5jdGlvbih0ZXh0LCBmb250KSArIFwiPlwiO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcIi9cIiArIGZvbnQuaWQsIChkZWZhdWx0Rm9udFNpemUgKiBzdHlsZVtcImZvbnQtc2l6ZVwiXSkudG9GaXhlZCgyKSwgXCJUZlwiLCBlc2NhcGVkVGV4dCArIFwiIFRqXCIpOyAvL3NldCB0aGUgd29yZCBzcGFjaW5nIGJhY2sgdG8gbmV1dHJhbCA9PiAwXG5cbiAgICAgIGlmIChzdHlsZVsnd29yZC1zcGFjaW5nJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZSgwLCBcIlR3XCIpO1xuICAgICAgfVxuICAgIH07IC8vIEFjY2VwdHMgI0ZGRkZGRiwgcmdiKGludCxpbnQsaW50KSwgb3IgQ1NTIENvbG9yIE5hbWVcblxuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmdldFBkZkNvbG9yID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICB2YXIgdGV4dENvbG9yO1xuICAgICAgdmFyIHIsIGcsIGI7XG4gICAgICB2YXIgcnggPSAvcmdiXFxzKlxcKFxccyooXFxkKyksXFxzKihcXGQrKSxcXHMqKFxcZCtcXHMqKVxcKS87XG4gICAgICB2YXIgbSA9IHJ4LmV4ZWMoc3R5bGUpO1xuXG4gICAgICBpZiAobSAhPSBudWxsKSB7XG4gICAgICAgIHIgPSBwYXJzZUludChtWzFdKTtcbiAgICAgICAgZyA9IHBhcnNlSW50KG1bMl0pO1xuICAgICAgICBiID0gcGFyc2VJbnQobVszXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHN0eWxlID09PSBcInN0cmluZ1wiICYmIHN0eWxlLmNoYXJBdCgwKSAhPSAnIycpIHtcbiAgICAgICAgICB2YXIgcmdiQ29sb3IgPSBuZXcgUkdCQ29sb3Ioc3R5bGUpO1xuXG4gICAgICAgICAgaWYgKHJnYkNvbG9yLm9rKSB7XG4gICAgICAgICAgICBzdHlsZSA9IHJnYkNvbG9yLnRvSGV4KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlID0gJyMwMDAwMDAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHIgPSBzdHlsZS5zdWJzdHJpbmcoMSwgMyk7XG4gICAgICAgIHIgPSBwYXJzZUludChyLCAxNik7XG4gICAgICAgIGcgPSBzdHlsZS5zdWJzdHJpbmcoMywgNSk7XG4gICAgICAgIGcgPSBwYXJzZUludChnLCAxNik7XG4gICAgICAgIGIgPSBzdHlsZS5zdWJzdHJpbmcoNSwgNyk7XG4gICAgICAgIGIgPSBwYXJzZUludChiLCAxNik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgciA9PT0gJ3N0cmluZycgJiYgL14jWzAtOUEtRmEtZl17Nn0kLy50ZXN0KHIpKSB7XG4gICAgICAgIHZhciBoZXggPSBwYXJzZUludChyLnN1YnN0cigxKSwgMTYpO1xuICAgICAgICByID0gaGV4ID4+IDE2ICYgMjU1O1xuICAgICAgICBnID0gaGV4ID4+IDggJiAyNTU7XG4gICAgICAgIGIgPSBoZXggJiAyNTU7XG4gICAgICB9XG5cbiAgICAgIHZhciBmMyA9IHRoaXMuZjM7XG5cbiAgICAgIGlmIChyID09PSAwICYmIGcgPT09IDAgJiYgYiA9PT0gMCB8fCB0eXBlb2YgZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGV4dENvbG9yID0gZjMociAvIDI1NSkgKyAnIGcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dENvbG9yID0gW2YzKHIgLyAyNTUpLCBmMyhnIC8gMjU1KSwgZjMoYiAvIDI1NSksICdyZyddLmpvaW4oJyAnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRleHRDb2xvcjtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmYzID0gZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgcmV0dXJuIG51bWJlci50b0ZpeGVkKDMpOyAvLyBJZSwgJS4zZlxuICAgIH0sIFJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXJQYXJhZ3JhcGggPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHZhciBibG9ja3N0eWxlLCBkZWZhdWx0Rm9udFNpemUsIGZvbnRUb1VuaXRSYXRpbywgZnJhZ21lbnRzLCBpLCBsLCBsaW5lLCBsaW5lcywgbWF4TGluZUhlaWdodCwgb3V0LCBwYXJhZ3JhcGhzcGFjaW5nX2FmdGVyLCBwYXJhZ3JhcGhzcGFjaW5nX2JlZm9yZSwgcHJpb3JibG9ja3N0eWxlLCBzdHlsZXMsIGZvbnRTaXplO1xuICAgICAgZnJhZ21lbnRzID0gUHVyZ2VXaGl0ZVNwYWNlKHRoaXMucGFyYWdyYXBoLnRleHQpO1xuICAgICAgc3R5bGVzID0gdGhpcy5wYXJhZ3JhcGguc3R5bGU7XG4gICAgICBibG9ja3N0eWxlID0gdGhpcy5wYXJhZ3JhcGguYmxvY2tzdHlsZTtcbiAgICAgIHByaW9yYmxvY2tzdHlsZSA9IHRoaXMucGFyYWdyYXBoLnByaW9yYmxvY2tzdHlsZSB8fCB7fTtcbiAgICAgIHRoaXMucGFyYWdyYXBoID0ge1xuICAgICAgICB0ZXh0OiBbXSxcbiAgICAgICAgc3R5bGU6IFtdLFxuICAgICAgICBibG9ja3N0eWxlOiB7fSxcbiAgICAgICAgcHJpb3JibG9ja3N0eWxlOiBibG9ja3N0eWxlXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWZyYWdtZW50cy5qb2luKFwiXCIpLnRyaW0oKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxpbmVzID0gdGhpcy5zcGxpdEZyYWdtZW50c0ludG9MaW5lcyhmcmFnbWVudHMsIHN0eWxlcyk7XG4gICAgICBsaW5lID0gdm9pZCAwO1xuICAgICAgbWF4TGluZUhlaWdodCA9IHZvaWQgMDtcbiAgICAgIGRlZmF1bHRGb250U2l6ZSA9IDEyO1xuICAgICAgZm9udFRvVW5pdFJhdGlvID0gZGVmYXVsdEZvbnRTaXplIC8gdGhpcy5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICB0aGlzLnByaW9yTWFyZ2luQm90dG9tID0gdGhpcy5wcmlvck1hcmdpbkJvdHRvbSB8fCAwO1xuICAgICAgcGFyYWdyYXBoc3BhY2luZ19iZWZvcmUgPSAoTWF0aC5tYXgoKGJsb2Nrc3R5bGVbXCJtYXJnaW4tdG9wXCJdIHx8IDApIC0gdGhpcy5wcmlvck1hcmdpbkJvdHRvbSwgMCkgKyAoYmxvY2tzdHlsZVtcInBhZGRpbmctdG9wXCJdIHx8IDApKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgIHBhcmFncmFwaHNwYWNpbmdfYWZ0ZXIgPSAoKGJsb2Nrc3R5bGVbXCJtYXJnaW4tYm90dG9tXCJdIHx8IDApICsgKGJsb2Nrc3R5bGVbXCJwYWRkaW5nLWJvdHRvbVwiXSB8fCAwKSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICB0aGlzLnByaW9yTWFyZ2luQm90dG9tID0gYmxvY2tzdHlsZVtcIm1hcmdpbi1ib3R0b21cIl0gfHwgMDtcblxuICAgICAgaWYgKGJsb2Nrc3R5bGVbJ3BhZ2UtYnJlYWstYmVmb3JlJ10gPT09ICdhbHdheXMnKSB7XG4gICAgICAgIHRoaXMucGRmLmFkZFBhZ2UoKTtcbiAgICAgICAgdGhpcy55ID0gMDtcbiAgICAgICAgcGFyYWdyYXBoc3BhY2luZ19iZWZvcmUgPSAoKGJsb2Nrc3R5bGVbXCJtYXJnaW4tdG9wXCJdIHx8IDApICsgKGJsb2Nrc3R5bGVbXCJwYWRkaW5nLXRvcFwiXSB8fCAwKSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICB9XG5cbiAgICAgIG91dCA9IHRoaXMucGRmLmludGVybmFsLndyaXRlO1xuICAgICAgaSA9IHZvaWQgMDtcbiAgICAgIGwgPSB2b2lkIDA7XG4gICAgICB0aGlzLnkgKz0gcGFyYWdyYXBoc3BhY2luZ19iZWZvcmU7XG4gICAgICBvdXQoXCJxXCIsIFwiQlQgMCBnXCIsIHRoaXMucGRmLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcodGhpcy54KSwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlU3RyaW5nKHRoaXMueSksIFwiVGRcIik7IC8vc3RvcmVzIHRoZSBjdXJyZW50IGluZGVudCBvZiBjdXJzb3IgcG9zaXRpb25cblxuICAgICAgdmFyIGN1cnJlbnRJbmRlbnQgPSAwO1xuXG4gICAgICB3aGlsZSAobGluZXMubGVuZ3RoKSB7XG4gICAgICAgIGxpbmUgPSBsaW5lcy5zaGlmdCgpO1xuICAgICAgICBtYXhMaW5lSGVpZ2h0ID0gMDtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIGwgPSBsaW5lLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaSAhPT0gbCkge1xuICAgICAgICAgIGlmIChsaW5lW2ldWzBdLnRyaW0oKSkge1xuICAgICAgICAgICAgbWF4TGluZUhlaWdodCA9IE1hdGgubWF4KG1heExpbmVIZWlnaHQsIGxpbmVbaV1bMV1bXCJsaW5lLWhlaWdodFwiXSwgbGluZVtpXVsxXVtcImZvbnQtc2l6ZVwiXSk7XG4gICAgICAgICAgICBmb250U2l6ZSA9IGxpbmVbaV1bMV1bXCJmb250LXNpemVcIl0gKiA3O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGkrKztcbiAgICAgICAgfSAvL2lmIHdlIGhhdmUgdG8gbW92ZSB0aGUgY3Vyc29yIHRvIGFkYXB0IHRoZSBpbmRlbnRcblxuXG4gICAgICAgIHZhciBpbmRlbnRNb3ZlID0gMDtcbiAgICAgICAgdmFyIHdhbnRlZEluZGVudCA9IDA7IC8vaWYgYSBtYXJnaW4gd2FzIGFkZGVkIChieSBlLmcuIGEgdGV4dC1hbGlnbm1lbnQpLCBtb3ZlIHRoZSBjdXJzb3JcblxuICAgICAgICBpZiAobGluZVswXVsxXVtcIm1hcmdpbi1sZWZ0XCJdICE9PSB1bmRlZmluZWQgJiYgbGluZVswXVsxXVtcIm1hcmdpbi1sZWZ0XCJdID4gMCkge1xuICAgICAgICAgIHdhbnRlZEluZGVudCA9IHRoaXMucGRmLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcobGluZVswXVsxXVtcIm1hcmdpbi1sZWZ0XCJdKTtcbiAgICAgICAgICBpbmRlbnRNb3ZlID0gd2FudGVkSW5kZW50IC0gY3VycmVudEluZGVudDtcbiAgICAgICAgICBjdXJyZW50SW5kZW50ID0gd2FudGVkSW5kZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGluZGVudE1vcmUgPSBNYXRoLm1heChibG9ja3N0eWxlW1wibWFyZ2luLWxlZnRcIl0gfHwgMCwgMCkgKiBmb250VG9Vbml0UmF0aW87IC8vbW92ZSB0aGUgY3Vyc29yXG5cbiAgICAgICAgb3V0KGluZGVudE1vdmUgKyBpbmRlbnRNb3JlLCAoLTEgKiBkZWZhdWx0Rm9udFNpemUgKiBtYXhMaW5lSGVpZ2h0KS50b0ZpeGVkKDIpLCBcIlRkXCIpO1xuICAgICAgICBpID0gMDtcbiAgICAgICAgbCA9IGxpbmUubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChpICE9PSBsKSB7XG4gICAgICAgICAgaWYgKGxpbmVbaV1bMF0pIHtcbiAgICAgICAgICAgIHRoaXMuUmVuZGVyVGV4dEZyYWdtZW50KGxpbmVbaV1bMF0sIGxpbmVbaV1bMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMueSArPSBtYXhMaW5lSGVpZ2h0ICogZm9udFRvVW5pdFJhdGlvOyAvL2lmIHNvbWUgd2F0Y2hlciBmdW5jdGlvbiB3YXMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bCwgc28gZS5nLiBtYXJnaW4gYW5kIHdpZHRocyB3ZXJlIGNoYW5nZWQsXG4gICAgICAgIC8vcmVzZXQgbGluZSBkcmF3aW5nIGFuZCBjYWxjdWxhdGUgcG9zaXRpb24gYW5kIGxpbmVzIGFnYWluXG4gICAgICAgIC8vZS5nLiB0byBzdG9wIHRleHQgZmxvYXRpbmcgYXJvdW5kIGFuIGltYWdlXG5cbiAgICAgICAgaWYgKHRoaXMuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zKGxpbmVbMF1bMV0pICYmIGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgbG9jYWxGcmFnbWVudHMgPSBbXTtcbiAgICAgICAgICB2YXIgbG9jYWxTdHlsZXMgPSBbXTsgLy9jcmVhdGUgZnJhZ21lbnQgYXJyYXkgb2ZcblxuICAgICAgICAgIGxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxvY2FsTGluZSkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgdmFyIGwgPSBsb2NhbExpbmUubGVuZ3RoO1xuXG4gICAgICAgICAgICB3aGlsZSAoaSAhPT0gbCkge1xuICAgICAgICAgICAgICBpZiAobG9jYWxMaW5lW2ldWzBdKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxGcmFnbWVudHMucHVzaChsb2NhbExpbmVbaV1bMF0gKyAnICcpO1xuICAgICAgICAgICAgICAgIGxvY2FsU3R5bGVzLnB1c2gobG9jYWxMaW5lW2ldWzFdKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTsgLy9zcGxpdCBsaW5lcyBhZ2FpbiBkdWUgdG8gcG9zc2libGUgY29vcmRpbmF0ZSBjaGFuZ2VzXG5cbiAgICAgICAgICBsaW5lcyA9IHRoaXMuc3BsaXRGcmFnbWVudHNJbnRvTGluZXMoUHVyZ2VXaGl0ZVNwYWNlKGxvY2FsRnJhZ21lbnRzKSwgbG9jYWxTdHlsZXMpOyAvL3JlcG9zaXRpb24gdGhlIGN1cnJlbnQgY3Vyc29yXG5cbiAgICAgICAgICBvdXQoXCJFVFwiLCBcIlFcIik7XG4gICAgICAgICAgb3V0KFwicVwiLCBcIkJUIDAgZ1wiLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKHRoaXMueCksIHRoaXMucGRmLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyh0aGlzLnkpLCBcIlRkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjYiAmJiB0eXBlb2YgY2IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYi5jYWxsKHRoaXMsIHRoaXMueCAtIDksIHRoaXMueSAtIGZvbnRTaXplIC8gMik7XG4gICAgICB9XG5cbiAgICAgIG91dChcIkVUXCIsIFwiUVwiKTtcbiAgICAgIHJldHVybiB0aGlzLnkgKz0gcGFyYWdyYXBoc3BhY2luZ19hZnRlcjtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLnNldEJsb2NrQm91bmRhcnkgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclBhcmFncmFwaChjYik7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5zZXRCbG9ja1N0eWxlID0gZnVuY3Rpb24gKGNzcykge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYWdyYXBoLmJsb2Nrc3R5bGUgPSBjc3M7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5hZGRUZXh0ID0gZnVuY3Rpb24gKHRleHQsIGNzcykge1xuICAgICAgdGhpcy5wYXJhZ3JhcGgudGV4dC5wdXNoKHRleHQpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyYWdyYXBoLnN0eWxlLnB1c2goY3NzKTtcbiAgICB9O1xuXG4gICAgRm9udE5hbWVEQiA9IHtcbiAgICAgIGhlbHZldGljYTogXCJoZWx2ZXRpY2FcIixcbiAgICAgIFwic2Fucy1zZXJpZlwiOiBcImhlbHZldGljYVwiLFxuICAgICAgXCJ0aW1lcyBuZXcgcm9tYW5cIjogXCJ0aW1lc1wiLFxuICAgICAgc2VyaWY6IFwidGltZXNcIixcbiAgICAgIHRpbWVzOiBcInRpbWVzXCIsXG4gICAgICBtb25vc3BhY2U6IFwiY291cmllclwiLFxuICAgICAgY291cmllcjogXCJjb3VyaWVyXCJcbiAgICB9O1xuICAgIEZvbnRXZWlnaHRNYXAgPSB7XG4gICAgICAxMDA6IFwibm9ybWFsXCIsXG4gICAgICAyMDA6IFwibm9ybWFsXCIsXG4gICAgICAzMDA6IFwibm9ybWFsXCIsXG4gICAgICA0MDA6IFwibm9ybWFsXCIsXG4gICAgICA1MDA6IFwiYm9sZFwiLFxuICAgICAgNjAwOiBcImJvbGRcIixcbiAgICAgIDcwMDogXCJib2xkXCIsXG4gICAgICA4MDA6IFwiYm9sZFwiLFxuICAgICAgOTAwOiBcImJvbGRcIixcbiAgICAgIG5vcm1hbDogXCJub3JtYWxcIixcbiAgICAgIGJvbGQ6IFwiYm9sZFwiLFxuICAgICAgYm9sZGVyOiBcImJvbGRcIixcbiAgICAgIGxpZ2h0ZXI6IFwibm9ybWFsXCJcbiAgICB9O1xuICAgIEZvbnRTdHlsZU1hcCA9IHtcbiAgICAgIG5vcm1hbDogXCJub3JtYWxcIixcbiAgICAgIGl0YWxpYzogXCJpdGFsaWNcIixcbiAgICAgIG9ibGlxdWU6IFwiaXRhbGljXCJcbiAgICB9O1xuICAgIFRleHRBbGlnbk1hcCA9IHtcbiAgICAgIGxlZnQ6IFwibGVmdFwiLFxuICAgICAgcmlnaHQ6IFwicmlnaHRcIixcbiAgICAgIGNlbnRlcjogXCJjZW50ZXJcIixcbiAgICAgIGp1c3RpZnk6IFwianVzdGlmeVwiXG4gICAgfTtcbiAgICBGbG9hdE1hcCA9IHtcbiAgICAgIG5vbmU6ICdub25lJyxcbiAgICAgIHJpZ2h0OiAncmlnaHQnLFxuICAgICAgbGVmdDogJ2xlZnQnXG4gICAgfTtcbiAgICBDbGVhck1hcCA9IHtcbiAgICAgIG5vbmU6ICdub25lJyxcbiAgICAgIGJvdGg6ICdib3RoJ1xuICAgIH07XG4gICAgVW5pdGVkTnVtYmVyTWFwID0ge1xuICAgICAgbm9ybWFsOiAxXG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBIVE1MLWZvcm1hdHRlZCB0ZXh0IGludG8gZm9ybWF0dGVkIFBERiB0ZXh0LlxuICAgICAqXG4gICAgICogTm90ZXM6XG4gICAgICogMjAxMi0wNy0xOFxuICAgICAqIFBsdWdpbiByZWxpZXMgb24gaGF2aW5nIGJyb3dzZXIsIERPTSBhcm91bmQuIFRoZSBIVE1MIGlzIHB1c2hlZCBpbnRvIGRvbSBhbmQgdHJhdmVyc2VkLlxuICAgICAqIFBsdWdpbiByZWxpZXMgb24galF1ZXJ5IGZvciBDU1MgZXh0cmFjdGlvbi5cbiAgICAgKiBUYXJnZXRpbmcgSFRNTCBvdXRwdXQgZnJvbSBNYXJrZG93biB0ZW1wbGF0aW5nLCB3aGljaCBpcyBhIHZlcnkgc2ltcGxlXG4gICAgICogbWFya3VwIC0gZGl2LCBzcGFuLCBlbSwgc3Ryb25nLCBwLiBObyBici1iYXNlZCBwYXJhZ3JhcGggc2VwYXJhdGlvbiBzdXBwb3J0ZWQgZXhwbGljaXRseSAoYnV0IHN0aWxsIG1heSB3b3JrLilcbiAgICAgKiBJbWFnZXMsIHRhYmxlcyBhcmUgTk9UIHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gSFRNTCB7U3RyaW5nfE9iamVjdH0gSFRNTC1mb3JtYXR0ZWQgdGV4dCwgb3IgcG9pbnRlciB0byBET00gZWxlbWVudCB0aGF0IGlzIHRvIGJlIHJlbmRlcmVkIGludG8gUERGLlxuICAgICAqIEBwYXJhbSB4IHtOdW1iZXJ9IHN0YXJ0aW5nIFggY29vcmRpbmF0ZSBpbiBqc1BERiBpbnN0YW5jZSdzIGRlY2xhcmVkIHVuaXRzLlxuICAgICAqIEBwYXJhbSB5IHtOdW1iZXJ9IHN0YXJ0aW5nIFkgY29vcmRpbmF0ZSBpbiBqc1BERiBpbnN0YW5jZSdzIGRlY2xhcmVkIHVuaXRzLlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyB7T2JqZWN0fSBBZGRpdGlvbmFsIC8gb3B0aW9uYWwgdmFyaWFibGVzIGNvbnRyb2xsaW5nIHBhcnNpbmcsIHJlbmRlcmluZy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBqc1BERiBpbnN0YW5jZVxuICAgICAqL1xuXG4gICAganNQREZBUEkuZnJvbUhUTUwgPSBmdW5jdGlvbiAoSFRNTCwgeCwgeSwgc2V0dGluZ3MsIGNhbGxiYWNrLCBtYXJnaW5zKSB7XG5cbiAgICAgIHRoaXMubWFyZ2luc19kb2MgPSBtYXJnaW5zIHx8IHtcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBib3R0b206IDBcbiAgICAgIH07XG4gICAgICBpZiAoIXNldHRpbmdzKSBzZXR0aW5ncyA9IHt9O1xuICAgICAgaWYgKCFzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMpIHNldHRpbmdzLmVsZW1lbnRIYW5kbGVycyA9IHt9O1xuICAgICAgcmV0dXJuIHByb2Nlc3ModGhpcywgSFRNTCwgaXNOYU4oeCkgPyA0IDogeCwgaXNOYU4oeSkgPyA0IDogeSwgc2V0dGluZ3MsIGNhbGxiYWNrKTtcbiAgICB9O1xuICB9KShqc3BkZi5qc1BERi5BUEkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvanNwZGZfcGx1Z2lucy9mcm9tX2h0bWwuanNcbi8vIG1vZHVsZSBpZCA9IDYzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=
12196
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA4MzdlNDVlNTg3N2QzMDMzOWRlMyIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9oZWxwZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZS50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiU3VydmV5XCIsXCJjb21tb25qczJcIjpcInN1cnZleS1jb3JlXCIsXCJjb21tb25qc1wiOlwic3VydmV5LWNvcmVcIixcImFtZFwiOlwic3VydmV5LWNvcmVcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2JyaWNrLnRzIiwid2VicGFjazovLy8uL3NyYy9kb2NfY29udHJvbGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9lbXB0eS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VudHJpZXMvcGRmLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3NlbGVjdGJhc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRib3gudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcImpzcGRmXCIsXCJjb21tb25qczJcIjpcImpzcGRmXCIsXCJjb21tb25qc1wiOlwianNwZGZcIixcImFtZFwiOlwianNwZGZcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kZWZhdWx0LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeG11bHRpcGxlLnRzIiwid2VicGFjazovLy8uL3NyYy9wYWdlX2xheW91dC9wYWdlX3BhY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfYm9vbGVhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jaGVja2JveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jb21tZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2ZpbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZXBpY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4ZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tdWx0aXBsZXRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF90ZXh0Ym94LnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9jdXN0b20udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9+L25vZGUtaW50ZXJ2YWwtdHJlZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9zaGFsbG93ZXF1YWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbG9yZWRicmljay50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZGVzY3JpcHRpb24udHMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvanNwZGZfcGx1Z2lucy9hY3JvZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvanNwZGZfcGx1Z2lucy9mcm9tX2h0bWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1EQUEyQyxjQUFjOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFB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SUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQUU7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUFFLENBQUMsQ0FBQztRQUNuRyxTQUFTLElBQUksQ0FBQyxNQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuSCxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFSyxTQUFVLFdBQVcsQ0FBQyxPQUFZLEVBQUUsSUFBUztJQUMvQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFPLEVBQUUsRUFBRSxHQUFHLEVBQU8sRUFBRSxFQUFFLEVBQUUsQ0FBTSxFQUFFLENBQU0sRUFBRSxDQUFNLEVBQUUsQ0FBTSxDQUFDO0lBQy9JLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUs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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdDQUFnQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHlCQUF5QjtBQUN4RDtBQUNBLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyx5RUFBeUU7QUFDbkg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsZ0RBQWdEOztBQUV2RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUNBQXVDLDJEQUEyRDtBQUNsRzs7QUFFQSwwQ0FBMEMsb0NBQW9DOztBQUU5RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEscUZBQXFGOztBQUVyRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsa0JBQWtCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQyx1REFBdUQ7QUFDekY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLDBDQUEwQztBQUN6Rix5QkFBeUI7QUFDekI7QUFDQTtBQUNBLCtDQUErQyx3Q0FBd0M7QUFDdkYseUJBQXlCO0FBQ3pCLCtDQUErQyx5QkFBeUI7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNB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aUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsTUFBTTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE1BQU07QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekIsa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0EsK0ZBQStGO0FBQy9GO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLHFHQUFxRztBQUNyRztBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtGQUErRjtBQUMvRjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSx5SkFBeUo7QUFDeko7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQSx5RkFBeUY7QUFDekY7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0EseUZBQXlGO0FBQ3pGO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHFHOzs7Ozs7O0FDNTJGRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztB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b0JBQW9CLGNBQWM7QUFDbEMsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEIsd0JBQXdCLE9BQU87QUFDL0IsaUJBQWlCLE9BQU87QUFDeEI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUciLCJmaWxlIjoiLi9wYWNrYWdlcy9zdXJ2ZXktcGRmL3N1cnZleS5wZGYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJzdXJ2ZXktY29yZVwiKSwgcmVxdWlyZShcImpzcGRmXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiU3VydmV5UERGXCIsIFtcInN1cnZleS1jb3JlXCIsIFwianNwZGZcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiU3VydmV5UERGXCJdID0gZmFjdG9yeShyZXF1aXJlKFwic3VydmV5LWNvcmVcIiksIHJlcXVpcmUoXCJqc3BkZlwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiU3VydmV5UERGXCJdID0gZmFjdG9yeShyb290W1wiU3VydmV5XCJdLCByb290W1wianNwZGZcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV82X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMThfXykge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxNCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgODM3ZTQ1ZTU4NzdkMzAzMzlkZTMiLCJkZWNsYXJlIHZhciBSZWZsZWN0OiBhbnk7XG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZDogYW55LCBiOiBhbnkpOiBhbnkge1xuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZDogYW55LCBiOiBhbnkpIHtcbiAgICBpZiAodHlwZW9mIGIgIT09ICdmdW5jdGlvbicgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2xhc3MgZXh0ZW5kcyB2YWx1ZSAnICsgU3RyaW5nKGIpICsgJyBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsJyk7XG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICAgIF9fYXNzaWduID0gKDxhbnk+T2JqZWN0KS5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odDogYW55KSB7XG4gICAgICAgIGZvciAodmFyIHM6IGFueSwgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzOiBhbnksIGU6IGFueSkge1xuICAgIHZhciB0OiBhbnkgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihxW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHFbaV0pKVxuICAgICAgICAgICAgICAgIHRbcVtpXV0gPSBzW3FbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnM6IGFueSwgdGFyZ2V0OiBhbnksIGtleTogYW55LCBkZXNjOiBhbnkpIHtcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09ICdmdW5jdGlvbicpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZzogYW55LCBfYXJndW1lbnRzOiBhbnksIFA6IGFueSwgZ2VuZXJhdG9yOiBhbnkpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZTogYW55KSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlOiBhbnkpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWU6IGFueSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWU6IGFueSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsndGhyb3cnXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0OiBhbnkpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZzogYW55LCBib2R5OiBhbnkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiA8YW55PltdLCBvcHM6IDxhbnk+W10gfSwgZjogYW55LCB5OiBhbnksIHQ6IGFueSwgZzogYW55O1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCAndGhyb3cnOiB2ZXJiKDEpLCAncmV0dXJuJzogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobjogYW55KSB7IHJldHVybiBmdW5jdGlvbiAodjogYW55KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wOiBhbnkpIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4nKTtcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5WydyZXR1cm4nXSA6IG9wWzBdID8geVsndGhyb3cnXSB8fCAoKHQgPSB5WydyZXR1cm4nXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7ICg8YW55Pl8pID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSAodG86IGFueSwgZnJvbTogYW55LCBwYWNrOiBhbnkpIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjogYW55OyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMvaGVscGVycy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb24sIFF1ZXN0aW9uUmF0aW5nTW9kZWwsIFF1ZXN0aW9uRmlsZU1vZGVsLCBMb2NhbGl6YWJsZVN0cmluZywgUXVlc3Rpb25TZWxlY3RCYXNlLCBRdWVzdGlvbkRyb3Bkb3duTW9kZWwsIHNldHRpbmdzIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0ICogYXMgU3VydmV5UERGTW9kdWxlIGZyb20gJy4vZW50cmllcy9wZGYnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSUZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBJSFRNTFJlbmRlclR5cGUgfSBmcm9tICcuL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbCc7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgVGV4dEJvbGRCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQnO1xuaW1wb3J0IHsgVGl0bGVQYW5lbEJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsJztcbmltcG9ydCB7IERlc2NyaXB0aW9uQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2Rlc2NyaXB0aW9uJztcbmltcG9ydCB7IENvbW1lbnRCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfY29tbWVudCc7XG5pbXBvcnQgeyBMaW5rQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2xpbmsnO1xuaW1wb3J0IHsgSFRNTEJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9odG1sJztcbmltcG9ydCB7IEltYWdlQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2ltYWdlJztcbmltcG9ydCB7IEVtcHR5QnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2VtcHR5JztcbmltcG9ydCB7IFJvd2xpbmVCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfcm93bGluZSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IEFkb3JuZXJzT3B0aW9ucyB9IGZyb20gJy4vZXZlbnRfaGFuZGxlci9hZG9ybmVycyc7XG5cbmV4cG9ydCB0eXBlIElCb3JkZXJEZXNjcmlwdGlvbiA9IElSZWN0ICYgSVNpemUgJiBQaWNrPFBkZkJyaWNrLCAnZm9ybUJvcmRlckNvbG9yJz4gJiB7IHJvdW5kZWQ/OiBib29sZWFuLCBkYXNoU3R5bGU/OiB7IGRhc2hBcnJheTogW251bWJlciwgbnVtYmVyXSB8IFtudW1iZXJdLCBkYXNoUGhhc2U6IG51bWJlciB9LCBvdXRzaWRlPzogYm9vbGVhbiB9O1xuXG5leHBvcnQgY2xhc3MgU3VydmV5SGVscGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIEVQU0lMT046IG51bWJlciA9IDIuMjIwNDQ2MDQ5MjUwMzEzMDgwODQ3MjYzMzM2MTgxNmUtMTU7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9TVVJWRVlfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjc7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9QQUdFX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4zO1xuICAgIHB1YmxpYyBzdGF0aWMgVElUTEVfUEFORUxfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjM7XG4gICAgcHVibGljIHN0YXRpYyBERVNDUklQVElPTl9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDIuMCAvIDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIE9USEVSX1JPV1NfQ09VTlQ6IG51bWJlciA9IDI7XG4gICAgcHVibGljIHN0YXRpYyBSQVRJTkdfTUlOX1dJRFRIOiBudW1iZXIgPSAzO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU5HX01JTl9IRUlHSFQ6IG51bWJlciA9IDI7XG4gICAgcHVibGljIHN0YXRpYyBSQVRJTkdfQ09MVU1OX1dJRFRIOiBudW1iZXIgPSA1O1xuICAgIHB1YmxpYyBzdGF0aWMgTUFUUklYX0NPTFVNTl9XSURUSDogbnVtYmVyID0gNTtcbiAgICBwdWJsaWMgc3RhdGljIElNQUdFUElDS0VSX0NPVU5UOiBudW1iZXIgPSA0O1xuICAgIHB1YmxpYyBzdGF0aWMgSU1BR0VQSUNLRVJfUkFUSU86IG51bWJlciA9IDQuMCAvIDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIE1VTFRJUExFVEVYVF9URVhUX1BFUlM6IG51bWJlciA9IE1hdGguRSAvIDEwLjA7XG4gICAgcHVibGljIHN0YXRpYyBIVE1MX1RBSUxfVEVYVF9TQ0FMRTogbnVtYmVyID0gMC4yNDtcbiAgICBwdWJsaWMgc3RhdGljIFNFTEVDVF9JVEVNX0ZMQVRfU0NBTEU6IG51bWJlciA9IDAuOTU7XG4gICAgcHVibGljIHN0YXRpYyBHQVBfQkVUV0VFTl9ST1dTOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fQ09MVU1OUzogbnVtYmVyID0gMS41O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fSVRFTV9URVhUOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgRk9STV9CT1JERVJfVklTSUJMRTogYm9vbGVhbiA9IHRydWU7XG4gICAgcHVibGljIHN0YXRpYyBCT1JERVJfU0NBTEU6IG51bWJlciA9IDAuMTtcbiAgICBwdWJsaWMgc3RhdGljIFZJU0lCTEVfQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjg7XG4gICAgcHVibGljIHN0YXRpYyBVTlZJU0lCTEVfQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjI7XG4gICAgcHVibGljIHN0YXRpYyBSQURJVVNfU0NBTEU6IG51bWJlciA9IDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX0ZPTlRfU0NBTEU6IG51bWJlciA9IDEuMTtcbiAgICBwdWJsaWMgc3RhdGljIFZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU6IG51bWJlciA9IDAuMztcbiAgICBwdWJsaWMgc3RhdGljIEhUTUxfVE9fSU1BR0VfUVVBTElUWTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgRk9STV9CT1JERVJfQ09MT1I6IHN0cmluZyA9ICcjOWY5ZjlmJztcbiAgICBwdWJsaWMgc3RhdGljIFRFWFRfQ09MT1I6IHN0cmluZyA9ICcjNDA0MDQwJztcbiAgICBwdWJsaWMgc3RhdGljIEJBQ0tHUk9VTkRfQ09MT1I6IHN0cmluZyA9ICcjRkZGRkZGJztcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX0xPQ0FUSU9OX01BVFJJWDogc3RyaW5nID0gJ21hdHJpeCc7XG4gICAgcHVibGljIHN0YXRpYyBTVEFOREFSRF9GT05UOiBzdHJpbmcgPSAnaGVsdmV0aWNhJztcbiAgICBwdWJsaWMgc3RhdGljIENVU1RPTV9GT05UX0VOQ09ESU5HOiBzdHJpbmcgPSAnSWRlbnRpdHktSCc7XG5cbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlV2lkdGgod2lkdGg6IHN0cmluZywgbWF4V2lkdGg6IG51bWJlcixcbiAgICAgICAgY29sdW1uc0NvdW50OiBudW1iZXIgPSAxLCBkZWZhdWx0VW5pdD86IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGlmICh3aWR0aC5pbmRleE9mKCdjYWxjJykgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBtYXhXaWR0aCAvIGNvbHVtbnNDb3VudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZTogbnVtYmVyID0gcGFyc2VGbG9hdCh3aWR0aCk7XG4gICAgICAgIGNvbnN0IHVuaXQ6IHN0cmluZyA9IHdpZHRoLnJlcGxhY2UoL1teQS1aYS16JV0vZywgJycpIHx8IGRlZmF1bHRVbml0O1xuICAgICAgICBsZXQgazogbnVtYmVyO1xuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgICAgICAgIGNhc2UgJ3B0JzpcbiAgICAgICAgICAgICAgICBrID0gMS4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wIC8gMjUuNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NtJzpcbiAgICAgICAgICAgICAgICBrID0gNzIuMCAvIDIuNTQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpbic6XG4gICAgICAgICAgICAgICAgayA9IDcyLjA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdweCc6XG4gICAgICAgICAgICAgICAgayA9IDcyLjAgLyA5Ni4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncGMnOlxuICAgICAgICAgICAgICAgIGsgPSAxMi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZW0nOlxuICAgICAgICAgICAgICAgIGsgPSAxMi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZXgnOlxuICAgICAgICAgICAgICAgIGsgPSA2LjA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICAgICAgayA9IG1heFdpZHRoIC8gMTAwLjA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHZhbHVlICogaywgbWF4V2lkdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHB4VG9QdCh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZighaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAncHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKHZhbHVlLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgKiA3Mi4wIC8gOTYuMDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBtZXJnZVJlY3RzKC4uLnJlY3RzOiBJUmVjdFtdKTogSVJlY3Qge1xuICAgICAgICBjb25zdCByZXN1bHRSZWN0OiBJUmVjdCA9IHtcbiAgICAgICAgICAgIHhMZWZ0OiByZWN0c1swXS54TGVmdCxcbiAgICAgICAgICAgIHhSaWdodDogcmVjdHNbMF0ueFJpZ2h0LFxuICAgICAgICAgICAgeVRvcDogcmVjdHNbMF0ueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHJlY3RzWzBdLnlCb3RcbiAgICAgICAgfTtcbiAgICAgICAgcmVjdHMuZm9yRWFjaCgocmVjdDogSVJlY3QpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueExlZnQgPSBNYXRoLm1pbihyZXN1bHRSZWN0LnhMZWZ0LCByZWN0LnhMZWZ0KSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueFJpZ2h0ID0gTWF0aC5tYXgocmVzdWx0UmVjdC54UmlnaHQsIHJlY3QueFJpZ2h0KSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueVRvcCA9IE1hdGgubWluKHJlc3VsdFJlY3QueVRvcCwgcmVjdC55VG9wKSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueUJvdCA9IE1hdGgubWF4KHJlc3VsdFJlY3QueUJvdCwgcmVjdC55Qm90KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHRSZWN0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVBvaW50KHJlY3Q6IElSZWN0LCBpc0xlZnQ6IGJvb2xlYW4gPSB0cnVlLCBpc1RvcDogYm9vbGVhbiA9IGZhbHNlKTogSVBvaW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiBpc0xlZnQgPyByZWN0LnhMZWZ0IDogcmVjdC54UmlnaHQsXG4gICAgICAgICAgICB5VG9wOiBpc1RvcCA/IHJlY3QueVRvcCA6IHJlY3QueUJvdFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJlY3QocG9pbnQ6IElQb2ludCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogcG9pbnQueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHBvaW50LnhMZWZ0ICsgd2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wLFxuICAgICAgICAgICAgeUJvdDogcG9pbnQueVRvcCArIGhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUhlYWRlclJlY3QoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IElSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiAwLjAsXG4gICAgICAgICAgICB4UmlnaHQ6IGNvbnRyb2xsZXIucGFwZXJXaWR0aCxcbiAgICAgICAgICAgIHlUb3A6IDAuMCxcbiAgICAgICAgICAgIHlCb3Q6IGNvbnRyb2xsZXIubWFyZ2lucy50b3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGb290ZXJSZWN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogMC4wLFxuICAgICAgICAgICAgeFJpZ2h0OiBjb250cm9sbGVyLnBhcGVyV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC0gY29udHJvbGxlci5tYXJnaW5zLmJvdCxcbiAgICAgICAgICAgIHlCb3Q6IGNvbnRyb2xsZXIucGFwZXJIZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjaG9vc2VIdG1sRm9udChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIudXNlQ3VzdG9tRm9udEluSHRtbCA/IGNvbnRyb2xsZXIuZm9udE5hbWUgOiB0aGlzLlNUQU5EQVJEX0ZPTlQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVDc3NUZXh0UnVsZShmb250U2l6ZTogbnVtYmVyLCBmb250U3R5bGU6IHN0cmluZywgZm9udE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgXCJmb250LXNpemU6ICR7Zm9udFNpemV9cHQ7IGZvbnQtd2VpZ2h0OiAke2ZvbnRTdHlsZX07IGZvbnQtZmFtaWx5OiAke2ZvbnROYW1lfTsgY29sb3I6ICR7dGhpcy5URVhUX0NPTE9SfTtcImA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlSHRtbENvbnRhaW5lckJsb2NrKGh0bWw6IHN0cmluZywgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVuZGVyQXM6IElIVE1MUmVuZGVyVHlwZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGZvbnQgPSB0aGlzLmNob29zZUh0bWxGb250KGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJfX3N1cnZleXBkZl9odG1sXCIgc3R5bGU9JHt0aGlzLmdlbmVyYXRlQ3NzVGV4dFJ1bGUoXG4gICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplLCBjb250cm9sbGVyLmZvbnRTdHlsZSwgZm9udCl9PmAgK1xuICAgICAgICAgICAgYDxzdHlsZT4uX19zdXJ2ZXlwZGZfaHRtbCBwIHsgbWFyZ2luOiAwOyBsaW5lLWhlaWdodDogJHtjb250cm9sbGVyLmZvbnRTaXplfXB0IH0gYm9keSB7IG1hcmdpbjogMDsgfTwvc3R5bGU+JHtodG1sfTwvZGl2PmA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc3BsaXRIdG1sUmVjdChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBodG1sQnJpY2s6IElQZGZCcmljayk6IElQZGZCcmljayB7XG4gICAgICAgIGNvbnN0IGJyaWNrczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgaHRtbEhlaWdodDogbnVtYmVyID0gaHRtbEJyaWNrLmhlaWdodDtcbiAgICAgICAgY29uc3QgbWluSGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLmRvYy5nZXRGb250U2l6ZSgpO1xuICAgICAgICBodG1sQnJpY2sueUJvdCA9IGh0bWxCcmljay55VG9wICsgbWluSGVpZ2h0O1xuICAgICAgICBjb25zdCBlbXB0eUJyaWNrQ291bnQ6IG51bWJlciA9IE1hdGguZmxvb3IoaHRtbEhlaWdodCAvIG1pbkhlaWdodCkgLSAxO1xuICAgICAgICBicmlja3MucHVzaChodG1sQnJpY2spO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQoaHRtbEJyaWNrKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGVtcHR5QnJpY2tDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBicmlja3MucHVzaChuZXcgRW1wdHlCcmljayh0aGlzLmNyZWF0ZVJlY3QoY3VyclBvaW50LCBodG1sQnJpY2sud2lkdGgsIG1pbkhlaWdodCkpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IG1pbkhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZW1haW5pbmdIZWlnaHQ6IG51bWJlciA9IGh0bWxIZWlnaHQgLSAoZW1wdHlCcmlja0NvdW50ICsgMSkgKiBtaW5IZWlnaHQ7XG4gICAgICAgIGlmIChyZW1haW5pbmdIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICBicmlja3MucHVzaChuZXcgRW1wdHlCcmljayh0aGlzLmNyZWF0ZVJlY3QoY3VyclBvaW50LCBodG1sQnJpY2sud2lkdGgsIHJlbWFpbmluZ0hlaWdodCkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmJyaWNrcyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUGxhaW5UZXh0RmxhdDxUIGV4dGVuZHMgSVBkZkJyaWNrPihwb2ludDogSVBvaW50LCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcsIGZhYnJpYzogbmV3IChxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykgPT4gVCk6IENvbXBvc2l0ZUJyaWNrIHtcbiAgICAgICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gY29udHJvbGxlci5kb2Muc3BsaXRUZXh0VG9TaXplKHRleHQsXG4gICAgICAgICAgICBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgLSBwb2ludC54TGVmdCk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gdGhpcy5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgbGluZXMuZm9yRWFjaCgobGluZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaXplOiBJU2l6ZSA9IGNvbnRyb2xsZXIubWVhc3VyZVRleHQobGluZSk7XG4gICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2sobmV3IGZhYnJpYyhxdWVzdGlvbiwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVJlY3QoY3VyclBvaW50LCBzaXplLndpZHRoLCBzaXplLmhlaWdodCksIGxpbmUpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IHNpemUuaGVpZ2h0O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVUZXh0RmxhdDxUIGV4dGVuZHMgSVBkZkJyaWNrPihwb2ludDogSVBvaW50LCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZywgZmFicmljOiBuZXcgKHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSA9PiBUKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyB8fCAhdGhpcy5oYXNIdG1sKHRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQbGFpblRleHRGbGF0KHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgICAgICB0ZXh0IDogdGhpcy5nZXRMb2NTdHJpbmcoPExvY2FsaXphYmxlU3RyaW5nPnRleHQpLCBmYWJyaWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXRIdG1sUmVjdChjb250cm9sbGVyLCBhd2FpdCB0aGlzLmNyZWF0ZUhUTUxGbGF0KHBvaW50LCA8UXVlc3Rpb24+cXVlc3Rpb24sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2sodGhpcy5nZXRMb2NTdHJpbmcodGV4dCksIGNvbnRyb2xsZXIsICdzdGFuZGFyZCcpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgaGFzSHRtbCh0ZXh0OiBMb2NhbGl6YWJsZVN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuOiBSZWdFeHAgPSAvPFxcLz9bYS16XVtcXHNcXFNdKj4vaTtcbiAgICAgICAgcmV0dXJuIHRleHQuaGFzSHRtbCAmJiAocGF0dGVybi50ZXN0KCg8YW55PnRleHQpLnJlbmRlcmVkVGV4dCkgfHwgcGF0dGVybi50ZXN0KHRleHQucmVuZGVyZWRIdG1sKSk7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGdldEh0bWxNYXJnaW5zKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHBvaW50OiBJUG9pbnQpOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciwgd2lkdGg6IG51bWJlciB9IHtcbiAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHBvaW50LnhMZWZ0IC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wOiBjb250cm9sbGVyLm1hcmdpbnMudG9wLFxuICAgICAgICAgICAgYm90dG9tOiBjb250cm9sbGVyLm1hcmdpbnMuYm90LFxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoID4gY29udHJvbGxlci51bml0V2lkdGggPyB3aWR0aCA6IGNvbnRyb2xsZXIudW5pdFdpZHRoXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVIVE1MUmVjdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBtYXJnaW5zOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciwgd2lkdGg6IG51bWJlciB9LCByZXN1bHRZOiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVBhZ2VIZWlnaHQ6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJIZWlnaHQgLSBjb250cm9sbGVyLm1hcmdpbnMuYm90IC0gY29udHJvbGxlci5tYXJnaW5zLnRvcDtcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSAoY29udHJvbGxlci5oZWxwZXJEb2MuZ2V0TnVtYmVyT2ZQYWdlcygpIC0gMSkgKlxuICAgICAgICAgICAgKGNvbnRyb2xsZXIuZm9udFNpemUgKiBNYXRoLmZsb29yKGF2YWlsYWJsZVBhZ2VIZWlnaHQgLyBjb250cm9sbGVyLmZvbnRTaXplKSlcbiAgICAgICAgICAgICsgcmVzdWx0WSAtIG1hcmdpbnMudG9wICsgU3VydmV5SGVscGVyLkhUTUxfVEFJTF9URVhUX1NDQUxFICogY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZQYWdlczogbnVtYmVyID0gY29udHJvbGxlci5oZWxwZXJEb2MuZ2V0TnVtYmVyT2ZQYWdlcygpO1xuICAgICAgICBjb250cm9sbGVyLmhlbHBlckRvYy5hZGRQYWdlKCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBudW1iZXJPZlBhZ2VzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuaGVscGVyRG9jLmRlbGV0ZVBhZ2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LCBtYXJnaW5zLndpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlSFRNTEZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBodG1sOiBzdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBtYXJnaW5zOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciwgd2lkdGg6IG51bWJlciB9ID0gdGhpcy5nZXRIdG1sTWFyZ2lucyhjb250cm9sbGVyLCBwb2ludCk7XG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxJUGRmQnJpY2s+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmhlbHBlckRvYy5mcm9tSFRNTChodG1sLCBwb2ludC54TGVmdCwgbWFyZ2lucy50b3AsIHtcbiAgICAgICAgICAgICAgICBwYWdlc3BsaXQ6IHRydWUsIHdpZHRoOiBtYXJnaW5zLndpZHRoXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAocmVzdWx0OiBhbnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVIVE1MUmVjdChwb2ludCwgY29udHJvbGxlciwgbWFyZ2lucywgcmVzdWx0LnkpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IEhUTUxCcmljayhxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgaHRtbCkpO1xuICAgICAgICAgICAgfSwgbWFyZ2lucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlRm9udEZhY2UoZm9udE5hbWU6IHN0cmluZywgZm9udEJhc2U2NDogc3RyaW5nLCBmb250V2VpZ2h0OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGBAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6ICR7Zm9udE5hbWV9OyBgICtcbiAgICAgICAgICAgIGBzcmM6IHVybChkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwke2ZvbnRCYXNlNjR9KSBmb3JtYXQoJ3dvZmYnKTsgYCArXG4gICAgICAgICAgICBgZm9udC13ZWlnaHQ6ICR7Zm9udFdlaWdodH07IH1gO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlRm9udEZhY2VXaXRoSXRhbGljU3R5bGUoZm9udE5hbWU6IHN0cmluZywgZm9udEJhc2U2NDogc3RyaW5nLCBmb250V2VpZ2h0OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGBAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6ICR7Zm9udE5hbWV9OyBgICtcbiAgICAgICAgICAgIGBzcmM6IHVybChkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwke2ZvbnRCYXNlNjR9KSBmb3JtYXQoJ3dvZmYnKTsgYCArXG4gICAgICAgICAgICBgZm9udC13ZWlnaHQ6ICR7Zm9udFdlaWdodH07IGZvbnQtc3R5bGU6IGl0YWxpY31gO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGh0bWxUb1htbChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBodG1sRG9jOiBEb2N1bWVudCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgnJyk7XG4gICAgICAgIGh0bWxEb2Mud3JpdGUoaHRtbC5yZXBsYWNlKC9cXCMvZywgJyUyMycpKTtcbiAgICAgICAgaHRtbERvYy5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd4bWxucycsIGh0bWxEb2MuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSk7XG4gICAgICAgIGh0bWxEb2MuYm9keS5zdHlsZS5tYXJnaW4gPSAndW5zZXQnO1xuICAgICAgICByZXR1cm4gKG5ldyBYTUxTZXJpYWxpemVyKCkpLnNlcmlhbGl6ZVRvU3RyaW5nKGh0bWxEb2MuYm9keSkucmVwbGFjZSgvJTIzL2csICcjJyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlU3ZnQ29udGVudChodG1sOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgY29uc3Qgc3R5bGU6IEhUTUxTdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZS5pbm5lckhUTUwgPSAnLl9fc3VydmV5cGRmX2h0bWwgcCB7IG1hcmdpbjogdW5zZXQ7IGxpbmUtaGVpZ2h0OiAyMnB4OyB9IGJvZHkgeyBtYXJnaW46IHVuc2V0OyB9JztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICAgIGNvbnN0IGRpdjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICdfX3N1cnZleXBkZl9odG1sJztcbiAgICAgICAgZGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgICAgICBkaXYuc3R5bGUudG9wID0gJy0xMDAwMHB4JztcbiAgICAgICAgZGl2LnN0eWxlLmxlZnQgPSAnLTEwMDAwcHgnO1xuICAgICAgICBkaXYuc3R5bGUud2lkdGggPSAod2lkdGggLyA3Mi4wICogOTYuMCkgKyAncHgnO1xuICAgICAgICBkaXYuc3R5bGUuYm94U2l6aW5nID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuc3R5bGUuY29sb3IgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5zdHlsZS5mb250RmFtaWx5ID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuc3R5bGUuZm9udCA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2LnN0eWxlLmxpbmVIZWlnaHQgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bWwpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgIGNvbnN0IGRpdldpZHRoOiBudW1iZXIgPSBkaXYub2Zmc2V0V2lkdGg7XG4gICAgICAgIGNvbnN0IGRpdkhlaWdodDogbnVtYmVyID0gZGl2Lm9mZnNldEhlaWdodDtcbiAgICAgICAgZGl2LnJlbW92ZSgpO1xuICAgICAgICBzdHlsZS5yZW1vdmUoKTtcbiAgICAgICAgbGV0IGRlZnM6IHN0cmluZyA9ICcnO1xuICAgICAgICBpZiAoY29udHJvbGxlci51c2VDdXN0b21Gb250SW5IdG1sKSB7XG4gICAgICAgICAgICBkZWZzID0gYDxkZWZzPjxzdHlsZT4ke3RoaXMuZ2VuZXJhdGVGb250RmFjZShjb250cm9sbGVyLmZvbnROYW1lLCBjb250cm9sbGVyLmJhc2U2NE5vcm1hbCwgJ25vcm1hbCcpfWAgK1xuICAgICAgICAgICAgICAgIGAgJHt0aGlzLmdlbmVyYXRlRm9udEZhY2UoY29udHJvbGxlci5mb250TmFtZSwgY29udHJvbGxlci5iYXNlNjRCb2xkLCAnYm9sZCcpfTwvc3R5bGU+PC9kZWZzPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzKS5mb3JFYWNoKGZvbnROYW1lID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb250ID0gRG9jQ29udHJvbGxlci5jdXN0b21Gb250c1tmb250TmFtZV07XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZm9udCkuZm9yRWFjaCgoZm9udFN0eWxlOiAnbm9ybWFsJyB8ICdib2xkJyB8ICdpdGFsaWMnIHwgJ2JvbGRpdGFsaWMnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb250U3R5bGUgPT09ICdub3JtYWwnIHx8IGZvbnRTdHlsZSA9PT0gJ2JvbGQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZzICs9IGAke3RoaXMuZ2VuZXJhdGVGb250RmFjZShmb250TmFtZSwgZm9udFtmb250U3R5bGVdLCBmb250U3R5bGUpfWA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZzICs9IGAke3RoaXMuZ2VuZXJhdGVGb250RmFjZVdpdGhJdGFsaWNTdHlsZShmb250TmFtZSwgZm9udFtmb250U3R5bGVdLCBmb250U3R5bGUgPT09ICdpdGFsaWMnID8gJ25vcm1hbCcgOiAnYm9sZCcpfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZWZzID0gJzxkZWZzPjxzdHlsZT4nICsgZGVmcyArICc8L3N0eWxlPjwvZGVmcz4nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3ZnOiBzdHJpbmcgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIke2RpdldpZHRofXB4XCIgaGVpZ2h0PVwiJHtkaXZIZWlnaHR9cHhcIj5gICsgZGVmcyArXG4gICAgICAgICAgICAnPHN0eWxlPi5fX3N1cnZleXBkZl9odG1sIHAgeyBtYXJnaW46IHVuc2V0OyBsaW5lLWhlaWdodDogMjJweDsgfTwvc3R5bGU+JyArXG4gICAgICAgICAgICBgPGZvcmVpZ25PYmplY3Qgd2lkdGg9XCIke2RpdldpZHRofXB4XCIgaGVpZ2h0PVwiJHtkaXZIZWlnaHR9cHhcIj5gICtcbiAgICAgICAgICAgIHRoaXMuaHRtbFRvWG1sKGh0bWwpICsgJzwvZm9yZWlnbk9iamVjdD48L3N2Zz4nO1xuICAgICAgICByZXR1cm4geyBzdmcsIGRpdldpZHRoLCBkaXZIZWlnaHQgfTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgc2V0Q2FudmFzKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGRpdldpZHRoOiBudW1iZXIsIGRpdkhlaWdodDogbnVtYmVyLCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY2FudmFzLndpZHRoID0gZGl2V2lkdGggKiBTdXJ2ZXlIZWxwZXIuSFRNTF9UT19JTUFHRV9RVUFMSVRZO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gZGl2SGVpZ2h0ICogU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWTtcbiAgICAgICAgY29uc3QgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGNvbnRleHQuc2NhbGUoU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWSwgU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWSk7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gU3VydmV5SGVscGVyLkJBQ0tHUk9VTkRfQ09MT1I7XG4gICAgICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgZGl2V2lkdGgsIGRpdkhlaWdodCk7XG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgaHRtbFRvSW1hZ2UoaHRtbDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogUHJvbWlzZTx7IHVybDogc3RyaW5nLCBhc3BlY3Q6IG51bWJlciB9PiB7XG4gICAgICAgIGNvbnN0IHsgc3ZnLCBkaXZXaWR0aCwgZGl2SGVpZ2h0IH0gPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlU3ZnQ29udGVudChodG1sLCB3aWR0aCwgY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IGRhdGE6IHN0cmluZyA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCcgKyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdmcpKSk7XG4gICAgICAgIGNvbnN0IGltZzogSFRNTEltYWdlRWxlbWVudCA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW49J2Fub255bW91cyc7XG4gICAgICAgIGltZy5zcmMgPSBkYXRhO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDYW52YXMoY2FudmFzLCBkaXZXaWR0aCwgZGl2SGVpZ2h0LCBpbWcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybDogc3RyaW5nID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIFN1cnZleUhlbHBlci5IVE1MX1RPX0lNQUdFX1FVQUxJVFkpO1xuICAgICAgICAgICAgICAgIGNhbnZhcy5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgdXJsOiB1cmwsIGFzcGVjdDogZGl2V2lkdGggLyBkaXZIZWlnaHQgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHVybDogJ2RhdGE6LCcsIGFzcGVjdDogd2lkdGggLyB0aGlzLkVQU0lMT04gfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVCb2xkVGV4dEZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRleHQsIFRleHRCb2xkQnJpY2spO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVRpdGxlRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IHRoaXMuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSAqPSB0aGlzLlRJVExFX0ZPTlRfU0NBTEU7XG4gICAgICAgIGlmIChxdWVzdGlvbi5ubykge1xuICAgICAgICAgICAgY29uc3Qgbm9UZXh0OiBzdHJpbmcgPSBxdWVzdGlvbi5ubyArICcgJztcbiAgICAgICAgICAgIGxldCBub0ZsYXQ6IElQZGZCcmljaztcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0h0bWwocXVlc3Rpb24ubG9jVGl0bGUpKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tZWFzdXJlVGV4dChub1RleHQsICdib2xkJykud2lkdGg7XG4gICAgICAgICAgICAgICAgbm9GbGF0ID0gYXdhaXQgdGhpcy5jcmVhdGVIVE1MRmxhdChjdXJyUG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhub1RleHQsIGNvbnRyb2xsZXIsICdzdGFuZGFyZCcpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9GbGF0ID0gYXdhaXQgdGhpcy5jcmVhdGVCb2xkVGV4dEZsYXQoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbiwgY29udHJvbGxlciwgbm9UZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhub0ZsYXQpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gbm9GbGF0LnhSaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gY3VyclBvaW50LnhMZWZ0O1xuICAgICAgICBjb25zdCB0ZXh0RmxhdDogQ29tcG9zaXRlQnJpY2sgPSA8Q29tcG9zaXRlQnJpY2s+YXdhaXQgdGhpcy5jcmVhdGVCb2xkVGV4dEZsYXQoXG4gICAgICAgICAgICBjdXJyUG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBxdWVzdGlvbi5sb2NUaXRsZSk7XG4gICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayh0ZXh0RmxhdCk7XG4gICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICBpZiAocXVlc3Rpb24uaXNSZXF1aXJlZCkge1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRUZXh0OiBzdHJpbmcgPSBxdWVzdGlvbi5yZXF1aXJlZFRleHQ7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNIdG1sKHF1ZXN0aW9uLmxvY1RpdGxlKSkge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQodGV4dEZsYXQudW5mb2xkKClbMF0sIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tZWFzdXJlVGV4dChyZXF1aXJlZFRleHQsICdib2xkJykud2lkdGg7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuY3JlYXRlSFRNTEZsYXQoY3VyclBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2socmVxdWlyZWRUZXh0LCBjb250cm9sbGVyLCAnc3RhbmRhcmQnKSkpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQgPSB0aGlzLmNyZWF0ZVBvaW50KHRleHRGbGF0LnVuZm9sZCgpLnBvcCgpLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuY3JlYXRlQm9sZFRleHRGbGF0KGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlcXVpcmVkVGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVTdXJ2ZXlQYW5lbEZsYXQocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcsIGZvbnRTaXplU2NhbGU6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKiBmb250U2l6ZVNjYWxlO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmNyZWF0ZVRleHRGbGF0KHBvaW50LCBudWxsLCBjb250cm9sbGVyLCB0ZXh0LCBUaXRsZVBhbmVsQnJpY2spO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIHJldHVybiB0aXRsZUZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVTdXJ2ZXlGbGF0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlVGl0bGVTdXJ2ZXlQYW5lbEZsYXQocG9pbnQsIGNvbnRyb2xsZXIsIHRleHQsIHRoaXMuVElUTEVfU1VSVkVZX0ZPTlRfU0laRV9TQ0FMRSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVQYW5lbEZsYXQocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcsIGlzUGFnZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlVGl0bGVTdXJ2ZXlQYW5lbEZsYXQocG9pbnQsIGNvbnRyb2xsZXIsIHRleHQsXG4gICAgICAgICAgICBpc1BhZ2UgPyB0aGlzLlRJVExFX1BBR0VfRk9OVF9TSVpFX1NDQUxFIDogdGhpcy5USVRMRV9QQU5FTF9GT05UX1NJWkVfU0NBTEUpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZURlc2NGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IGNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqIHRoaXMuREVTQ1JJUFRJT05fRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRleHQsIERlc2NyaXB0aW9uQnJpY2spO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVhZG9ubHlSZW5kZXJBcyhxdWVzdGlvbjogUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nIHtcbiAgICAgICAgcmV0dXJuICg8YW55PnF1ZXN0aW9uKS5yZWFkb25seVJlbmRlckFzID09PSAnYXV0bycgPyBjb250cm9sbGVyLnJlYWRvbmx5UmVuZGVyQXMgOiAoPGFueT5xdWVzdGlvbikucmVhZG9ubHlSZW5kZXJBcztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVDb21tZW50RmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGlzUXVlc3Rpb246IGJvb2xlYW4sIG9wdGlvbnM6IHsgcm93cz86IG51bWJlciwgaW5kZXg/OiBudW1iZXIsIHZhbHVlPzogc3RyaW5nLCByZWFkT25seT86IGJvb2xlYW4gfSA9IHt9KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgcmVjdDogSVJlY3QgPSB0aGlzLmNyZWF0ZVRleHRGaWVsZFJlY3QocG9pbnQsIGNvbnRyb2xsZXIsIG9wdGlvbnMucm93cyA/PyAxKTtcbiAgICAgICAgbGV0IHRleHRGbGF0O1xuICAgICAgICBpZiAob3B0aW9ucy5yZWFkT25seSA/PyBTdXJ2ZXlIZWxwZXIuc2hvdWxkUmVuZGVyUmVhZE9ubHkocXVlc3Rpb24sIGNvbnRyb2xsZXIpKSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJlZFZhbHVlID0gb3B0aW9ucy52YWx1ZSA/PyB0aGlzLmdldFF1ZXN0aW9uT3JDb21tZW50VmFsdWUocXVlc3Rpb24sIGlzUXVlc3Rpb24pO1xuICAgICAgICAgICAgdGV4dEZsYXQgPSBhd2FpdCB0aGlzLmNyZWF0ZVJlYWRPbmx5VGV4dEZpZWxkVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgcG9pbnQsIGNvbnRyb2xsZXIsIHF1ZXN0aW9uLCByZW5kZXJlZFZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHBhZGRpbmc6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIHRoaXMuVkFMVUVfUkVBRE9OTFlfUEFERElOR19TQ0FMRTtcbiAgICAgICAgICAgIGlmICh0ZXh0RmxhdC55Qm90ICsgcGFkZGluZyA+IHJlY3QueUJvdCkgcmVjdC55Qm90ID0gdGV4dEZsYXQueUJvdCArIHBhZGRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tbWVudCA9IG5ldyBDb21tZW50QnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGlzUXVlc3Rpb24sIG9wdGlvbnMuaW5kZXgpO1xuICAgICAgICBpZihvcHRpb25zLnJlYWRPbmx5ICE9PSBudWxsICYmIG9wdGlvbnMucmVhZE9ubHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tbWVudC5pc1JlYWRPbmx5ID0gb3B0aW9ucy5yZWFkT25seTtcbiAgICAgICAgfVxuICAgICAgICBpZih0ZXh0RmxhdCkge1xuICAgICAgICAgICAgY29tbWVudC50ZXh0QnJpY2sgPSB0ZXh0RmxhdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRRdWVzdGlvbk9yQ29tbWVudFZhbHVlKHF1ZXN0aW9uOiBRdWVzdGlvbiwgaXNRdWVzdGlvbjogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaXNRdWVzdGlvbiA/IChxdWVzdGlvbi52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHF1ZXN0aW9uLnZhbHVlICE9PSBudWxsID8gcXVlc3Rpb24udmFsdWUgOiAnJykgOlxuICAgICAgICAgICAgKHF1ZXN0aW9uLmNvbW1lbnQgIT09IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi5jb21tZW50ICE9PSBudWxsID8gcXVlc3Rpb24uY29tbWVudCA6ICcnKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRRdWVzdGlvbk9yQ29tbWVudERpc3BsYXlWYWx1ZShxdWVzdGlvbjogUXVlc3Rpb24sIGlzUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlzUXVlc3Rpb24gPyBxdWVzdGlvbi5kaXNwbGF5VmFsdWUgOiBTdXJ2ZXlIZWxwZXIuZ2V0UXVlc3Rpb25PckNvbW1lbnRWYWx1ZShxdWVzdGlvbiwgaXNRdWVzdGlvbik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaW5Ccm93c2VyID0gdHlwZW9mIEltYWdlID09PSAnZnVuY3Rpb24nO1xuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgaGFzRG9jdW1lbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0SW1hZ2VCYXNlNjQoaW1hZ2VMaW5rOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWFnZS5jcm9zc09yaWdpbj0nYW5vbnltb3VzJztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGltYWdlLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgICAgICAgICAgY2FudmFzLndpZHRoID0gaW1hZ2UubmF0dXJhbFdpZHRoO1xuICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFVcmwgPSBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhVXJsKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoJycpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltYWdlLnNyYyA9IGltYWdlTGluaztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2hvdWxkQ29udmVydEltYWdlVG9QbmcgPSB0cnVlO1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0SW1hZ2VMaW5rKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGltYWdlT3B0aW9uczogeyBsaW5rOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvYmplY3RGaXQ/OiBzdHJpbmcgfSwgYXBwbHlJbWFnZUZpdDogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHB0VG9QeDogbnVtYmVyID0gOTYuMCAvIDcyLjA7XG4gICAgICAgIGxldCB1cmwgPSB0aGlzLnNob3VsZENvbnZlcnRJbWFnZVRvUG5nID8gYXdhaXQgU3VydmV5SGVscGVyLmdldEltYWdlQmFzZTY0KGltYWdlT3B0aW9ucy5saW5rKSA6IGltYWdlT3B0aW9ucy5saW5rO1xuICAgICAgICBpZih0eXBlb2YgWE1MU2VyaWFsaXplciA9PT0gJ2Z1bmN0aW9uJyAmJiBhcHBseUltYWdlRml0KSB7XG4gICAgICAgICAgICBjb25zdCBjYW52YXNIdG1sOiBzdHJpbmcgPVxuICAgICAgICAgICAgICAgYDxkaXYgc3R5bGU9J292ZXJmbG93OiBoaWRkZW47IHdpZHRoOiAke2ltYWdlT3B0aW9ucy53aWR0aCAqIHB0VG9QeH1weDsgaGVpZ2h0OiAke2ltYWdlT3B0aW9ucy5oZWlnaHQgKiBwdFRvUHh9cHg7Jz5cbiAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0nJHt1cmx9JyBzdHlsZT0nb2JqZWN0LWZpdDogJHtpbWFnZU9wdGlvbnMub2JqZWN0Rml0fTsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsnLz5cbiAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgICAgICB1cmwgPSAoYXdhaXQgU3VydmV5SGVscGVyLmh0bWxUb0ltYWdlKGNhbnZhc0h0bWwsIGltYWdlT3B0aW9ucy53aWR0aCwgY29udHJvbGxlcikpLnVybDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUltYWdlRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogYW55LFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBpbWFnZU9wdGlvbnM6IHsgbGluazogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgb2JqZWN0Rml0Pzogc3RyaW5nIH0sIGFwcGx5SW1hZ2VGaXQ/OiBib29sZWFuKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgaWYgKFN1cnZleUhlbHBlci5pbkJyb3dzZXIpIHtcbiAgICAgICAgICAgIGltYWdlT3B0aW9ucy5vYmplY3RGaXQgPSAhIXF1ZXN0aW9uICYmICEhcXVlc3Rpb24uaW1hZ2VGaXQgPyBxdWVzdGlvbi5pbWFnZUZpdCA6IChpbWFnZU9wdGlvbnMub2JqZWN0Rml0IHx8ICdjb250YWluJyk7XG4gICAgICAgICAgICBpZiAoYXBwbHlJbWFnZUZpdCA/PyBjb250cm9sbGVyLmFwcGx5SW1hZ2VGaXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VPcHRpb25zLndpZHRoID4gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3V2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBpbWFnZU9wdGlvbnMuaGVpZ2h0ICo9IG5ld1dpZHRoIC8gaW1hZ2VPcHRpb25zLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICBpbWFnZU9wdGlvbnMud2lkdGggPSBuZXdXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBodG1sOiBzdHJpbmcgPSBgPGltZyBzcmM9JyR7YXdhaXQgU3VydmV5SGVscGVyLmdldEltYWdlTGluayhjb250cm9sbGVyLCBpbWFnZU9wdGlvbnMsIGFwcGx5SW1hZ2VGaXQgPz8gY29udHJvbGxlci5hcHBseUltYWdlRml0KX0nIHdpZHRoPScke2ltYWdlT3B0aW9ucy53aWR0aH0nIGhlaWdodD0nJHtpbWFnZU9wdGlvbnMuaGVpZ2h0fScvPmA7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEhUTUxCcmljayhxdWVzdGlvbiwgY29udHJvbGxlciwgdGhpcy5jcmVhdGVSZWN0KHBvaW50LCBpbWFnZU9wdGlvbnMud2lkdGgsIGltYWdlT3B0aW9ucy5oZWlnaHQpLCBodG1sLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEltYWdlQnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIGltYWdlT3B0aW9ucy5saW5rLCBwb2ludCwgaW1hZ2VPcHRpb25zLndpZHRoLCBpbWFnZU9wdGlvbnMuaGVpZ2h0KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjYW5QcmV2aWV3SW1hZ2UocXVlc3Rpb246IFF1ZXN0aW9uRmlsZU1vZGVsLCBpdGVtOiB7IG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfSwgdXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHF1ZXN0aW9uLmNhblByZXZpZXdJbWFnZShpdGVtKTtcbiAgICAgICAgLy8gICYmICBhd2FpdCB0aGlzLmdldEltYWdlU2l6ZSh1cmwpICE9PSBudWxsO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdldEltYWdlU2l6ZSh1cmw6IHN0cmluZyk6IFByb21pc2U8SVNpemU+IHtcbiAgICAgICAgaWYgKCFTdXJ2ZXlIZWxwZXIuaW5Ccm93c2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7IHdpZHRoOiB1bmRlZmluZWQsIGhlaWdodDogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZTogYW55ID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSB1cmw7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoeyB3aWR0aDogaW1hZ2Uud2lkdGgsIGhlaWdodDogaW1hZ2UuaGVpZ2h0IH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJldHVybiByZXNvbHZlKG51bGwpOyB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVSb3dsaW5lRmxhdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICB3aWR0aD86IG51bWJlciwgY29sb3I/OiBzdHJpbmcpOiBJUGRmQnJpY2sge1xuICAgICAgICBsZXQgeFJpZ2h0OiBudW1iZXIgPSB0eXBlb2Ygd2lkdGggPT09ICd1bmRlZmluZWQnID9cbiAgICAgICAgICAgIGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA6XG4gICAgICAgICAgICBwb2ludC54TGVmdCArIHdpZHRoO1xuICAgICAgICB4UmlnaHQgPSB4UmlnaHQgPiBwb2ludC54TGVmdCA/IHhSaWdodCA6IHBvaW50LnhMZWZ0ICsgdGhpcy5FUFNJTE9OO1xuICAgICAgICByZXR1cm4gbmV3IFJvd2xpbmVCcmljayhjb250cm9sbGVyLCB7XG4gICAgICAgICAgICB4TGVmdDogcG9pbnQueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHhSaWdodCxcbiAgICAgICAgICAgIHlUb3A6IHBvaW50LnlUb3AgKyB0aGlzLkVQU0lMT04sXG4gICAgICAgICAgICB5Qm90OiBwb2ludC55VG9wICsgdGhpcy5FUFNJTE9OXG4gICAgICAgIH0sIHR5cGVvZiBjb2xvciA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogY29sb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUxpbmtGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nLCBsaW5rOiBzdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVUZXh0OiBDb21wb3NpdGVCcmljayA9IDxDb21wb3NpdGVCcmljaz5hd2FpdCB0aGlzLlxuICAgICAgICAgICAgY3JlYXRlVGV4dEZsYXQocG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCB0ZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVMaW5rOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb21wb3NpdGVUZXh0LnVuZm9sZCgpLmZvckVhY2goKHRleHQ6IFRleHRCcmljaykgPT4ge1xuICAgICAgICAgICAgY29tcG9zaXRlTGluay5hZGRCcmljayhuZXcgTGlua0JyaWNrKHRleHQsIGxpbmspKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVQb2ludDogSVBvaW50ID0gdGhpcy5jcmVhdGVQb2ludChjb21wb3NpdGVMaW5rKTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUxpbmsuYWRkQnJpY2sodGhpcy5jcmVhdGVSb3dsaW5lRmxhdChsaW5lUG9pbnQsXG4gICAgICAgICAgICAgICAgY29udHJvbGxlciwgY29tcG9zaXRlTGluay53aWR0aCwgTGlua0JyaWNrLkNPTE9SKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlTGluaztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVBY3JvZm9ybVJlY3QocmVjdDogSVJlY3QpOiBudW1iZXJbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgcmVjdC55VG9wLFxuICAgICAgICAgICAgcmVjdC54UmlnaHQgLSByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgcmVjdC55Qm90IC0gcmVjdC55VG9wXG4gICAgICAgIF07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlVGV4dEZpZWxkUmVjdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBsaW5lczogbnVtYmVyID0gMSk6IElSZWN0IHtcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBwb2ludC54TGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY29udHJvbGxlci51bml0V2lkdGgpO1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIGxpbmVzO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZWN0KHBvaW50LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVSZWFkT25seVRleHRGaWVsZFRleHRGbGF0KHBvaW50OiBJUG9pbnQsXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHBhZGRpbmc6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdFdpZHRoICogdGhpcy5WQUxVRV9SRUFET05MWV9QQURESU5HX1NDQUxFO1xuICAgICAgICBwb2ludC55VG9wICs9IHBhZGRpbmc7XG4gICAgICAgIHBvaW50LnhMZWZ0ICs9IHBhZGRpbmc7XG4gICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMocG9pbnQueExlZnQsIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArIHBhZGRpbmcpO1xuICAgICAgICBjb25zdCB0ZXh0RmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdmFsdWUudG9TdHJpbmcoKSwgVGV4dEJyaWNrKTtcbiAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIHJldHVybiB0ZXh0RmxhdDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJGbGF0Qm9yZGVycyhjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBib3JkZXJPcHRpb25zOiBJQm9yZGVyRGVzY3JpcHRpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLkZPUk1fQk9SREVSX1ZJU0lCTEUpIHJldHVybjtcbiAgICAgICAgYm9yZGVyT3B0aW9ucy5yb3VuZGVkID0gYm9yZGVyT3B0aW9ucy5yb3VuZGVkID8/IHRydWU7XG4gICAgICAgIGJvcmRlck9wdGlvbnMub3V0c2lkZSA9IGJvcmRlck9wdGlvbnMub3V0c2lkZSA/PyBmYWxzZTtcbiAgICAgICAgY29uc3QgbWluU2lkZTogbnVtYmVyID0gTWF0aC5taW4oYm9yZGVyT3B0aW9ucy53aWR0aCwgYm9yZGVyT3B0aW9ucy5oZWlnaHQpO1xuICAgICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRoaXMuZ2V0Qm9yZGVyV2lkdGgoY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IHZpc2libGVXaWR0aDogbnVtYmVyID0gY29udHJvbGxlci51bml0SGVpZ2h0ICogdGhpcy5WSVNJQkxFX0JPUkRFUl9TQ0FMRSAqIHRoaXMuQk9SREVSX1NDQUxFO1xuICAgICAgICBjb25zdCB2aXNpYmxlU2NhbGU6IG51bWJlciA9IGJvcmRlck9wdGlvbnMub3V0c2lkZSA/IChtaW5TaWRlICsgYm9yZGVyV2lkdGgpIC8gbWluU2lkZSAtIHZpc2libGVXaWR0aCAvIG1pblNpZGUgOiAobWluU2lkZSAtIGJvcmRlcldpZHRoKSAvIG1pblNpZGUgKyB2aXNpYmxlV2lkdGggLyBtaW5TaWRlO1xuICAgICAgICBjb25zdCBvbGREcmF3Q29sb3I6IHN0cmluZyA9IGNvbnRyb2xsZXIuZG9jLmdldERyYXdDb2xvcigpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IoYm9yZGVyT3B0aW9ucy5mb3JtQm9yZGVyQ29sb3IpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lV2lkdGgodmlzaWJsZVdpZHRoKTtcbiAgICAgICAgY29uc3Qgc2NhbGVkUmVjdCA9IHRoaXMuc2NhbGVSZWN0KGJvcmRlck9wdGlvbnMsIHZpc2libGVTY2FsZSk7XG4gICAgICAgIGlmKGJvcmRlck9wdGlvbnMuZGFzaFN0eWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXNoU3R5bGUgPSBib3JkZXJPcHRpb25zLmRhc2hTdHlsZTtcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlckxlbmd0aCA9IChNYXRoLmFicyhzY2FsZWRSZWN0LnlUb3AgLSBzY2FsZWRSZWN0LnlCb3QpICsgTWF0aC5hYnMoc2NhbGVkUmVjdC54TGVmdCAtIHNjYWxlZFJlY3QueFJpZ2h0KSkgKiAyO1xuICAgICAgICAgICAgY29uc3QgZGFzaFdpdGhTcGFjZVNpemUgPSBkYXNoU3R5bGUuZGFzaEFycmF5WzBdICsgKGRhc2hTdHlsZS5kYXNoQXJyYXlbMV0gPz8gZGFzaFN0eWxlLmRhc2hBcnJheVswXSk7XG4gICAgICAgICAgICBjb25zdCBkYXNoU2l6ZSA9IGRhc2hTdHlsZS5kYXNoQXJyYXlbMF0gKyAoYm9yZGVyTGVuZ3RoICUgZGFzaFdpdGhTcGFjZVNpemUpIC8gTWF0aC5mbG9vcihib3JkZXJMZW5ndGggLyBkYXNoV2l0aFNwYWNlU2l6ZSk7XG5cbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldExpbmVEYXNoUGF0dGVybihcbiAgICAgICAgICAgICAgICBbZGFzaFNpemUsIGRhc2hTdHlsZS5kYXNoQXJyYXlbMV0gPz8gZGFzaFN0eWxlLmRhc2hBcnJheVswXV0sXG4gICAgICAgICAgICAgICAgZGFzaFN0eWxlLmRhc2hQaGFzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRyb2xsZXIuZG9jLnJlY3QoLi4udGhpcy5jcmVhdGVBY3JvZm9ybVJlY3Qoc2NhbGVkUmVjdCkpO1xuICAgICAgICBpZihib3JkZXJPcHRpb25zLnJvdW5kZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVudmlzaWJsZVdpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiB0aGlzLlVOVklTSUJMRV9CT1JERVJfU0NBTEUgKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICAgICAgICAgIGNvbnN0IHVudmlzaWJsZVNjYWxlOiBudW1iZXIgPSAxLjAgLSB1bnZpc2libGVXaWR0aCAvIG1pblNpZGU7XG4gICAgICAgICAgICBjb25zdCB1bnZpc2libGVSYWRpdXM6IG51bWJlciA9IHRoaXMuUkFESVVTX1NDQUxFICogdW52aXNpYmxlV2lkdGg7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IodGhpcy5CQUNLR1JPVU5EX0NPTE9SKTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldExpbmVXaWR0aCh1bnZpc2libGVXaWR0aCk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5yb3VuZGVkUmVjdCguLi50aGlzLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxlUmVjdChib3JkZXJPcHRpb25zLCB1bnZpc2libGVTY2FsZSkpLCB1bnZpc2libGVSYWRpdXMsIHVudmlzaWJsZVJhZGl1cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoYm9yZGVyT3B0aW9ucy5kYXNoU3R5bGUpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldExpbmVEYXNoUGF0dGVybihbXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKG9sZERyYXdDb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TG9jU3RyaW5nKHRleHQ6IExvY2FsaXphYmxlU3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzSHRtbCh0ZXh0KSkgcmV0dXJuIHRleHQucmVuZGVyZWRIdG1sO1xuICAgICAgICByZXR1cm4gKDxhbnk+dGV4dCkucmVuZGVyZWRUZXh0IHx8IHRleHQucmVuZGVyZWRIdG1sO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldERyb3Bkb3duUXVlc3Rpb25WYWx1ZShxdWVzdGlvbjogUXVlc3Rpb24pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBxRHJvcERvd246IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCA9IDxRdWVzdGlvbkRyb3Bkb3duTW9kZWw+cXVlc3Rpb247XG4gICAgICAgIGlmIChxRHJvcERvd24uaXNPdGhlclNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcURyb3BEb3duLm90aGVyVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghIXF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXN0aW9uLmRpc3BsYXlWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChxRHJvcERvd24uc2hvd09wdGlvbnNDYXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gcURyb3BEb3duLm9wdGlvbnNDYXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRDb250ZW50UXVlc3Rpb24ocXVlc3Rpb246IFF1ZXN0aW9uKTogUXVlc3Rpb24ge1xuICAgICAgICByZXR1cm4gISEoPGFueT5xdWVzdGlvbikuY29udGVudFF1ZXN0aW9uID8gKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRRdWVzdGlvbiA6IHF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbnRlbnRRdWVzdGlvblR5cGVSZW5kZXJBcyhxdWVzdGlvbjogUXVlc3Rpb24sIHN1cnZleTogU3VydmV5UERGKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlbmRlckFzID0gcXVlc3Rpb24ucmVuZGVyQXM7XG4gICAgICAgIGlmKHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gJ2Jvb2xlYW4nICYmIHN1cnZleS5vcHRpb25zLnVzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmcpIHtcbiAgICAgICAgICAgIHJlbmRlckFzID0gJ2NoZWNrYm94JztcbiAgICAgICAgfVxuICAgICAgICBpZihyZW5kZXJBcyAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gYCR7cXVlc3Rpb24uZ2V0VHlwZSgpfS0ke3JlbmRlckFzfWA7XG4gICAgICAgICAgICBpZihGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLmlzVHlwZVJlZ2lzdGVyZWQodHlwZSkpIHJldHVybiB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxdWVzdGlvbi5nZXRUeXBlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udGVudFF1ZXN0aW9uVHlwZShxdWVzdGlvbjogUXVlc3Rpb24sIHN1cnZleTogU3VydmV5UERGKTogc3RyaW5nIHtcbiAgICAgICAgaWYoISFxdWVzdGlvbi5jdXN0b21XaWRnZXQpIHJldHVybiBxdWVzdGlvbi5jdXN0b21XaWRnZXQucGRmUXVlc3Rpb25UeXBlO1xuICAgICAgICByZXR1cm4gISEoPGFueT5xdWVzdGlvbikuY29udGVudFF1ZXN0aW9uID8gJ2N1c3RvbV9tb2RlbCcgOiB0aGlzLmdldENvbnRlbnRRdWVzdGlvblR5cGVSZW5kZXJBcyhxdWVzdGlvbiwgc3VydmV5KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRSYXRpbmdNaW5XaWR0aChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIubWVhc3VyZVRleHQodGhpcy5SQVRJTkdfTUlOX1dJRFRIKS53aWR0aDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRSYXRpbmdJdGVtVGV4dChxdWVzdGlvbjogUXVlc3Rpb25SYXRpbmdNb2RlbCxcbiAgICAgICAgaW5kZXg6IG51bWJlciwgbG9jVGV4dDogTG9jYWxpemFibGVTdHJpbmcpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJhdGluZ0l0ZW1Mb2NUZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyhsb2NUZXh0Lm93bmVyLCBsb2NUZXh0LnVzZU1hcmtkb3duKTtcbiAgICAgICAgcmF0aW5nSXRlbUxvY1RleHQudGV4dCA9IHRoaXMuZ2V0TG9jU3RyaW5nKGxvY1RleHQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IDAgJiYgcXVlc3Rpb24ubWluUmF0ZURlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByYXRpbmdJdGVtTG9jVGV4dC50ZXh0ID0gcXVlc3Rpb24ubG9jTWluUmF0ZURlc2NyaXB0aW9uLnRleHQgKyAnICcgKyB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmRleCA9PT0gcXVlc3Rpb24udmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoIC0gMSAmJiBxdWVzdGlvbi5tYXhSYXRlRGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJhdGluZ0l0ZW1Mb2NUZXh0LnRleHQgPSB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KSArICcgJyArIHF1ZXN0aW9uLmxvY01heFJhdGVEZXNjcmlwdGlvbi50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByYXRpbmdJdGVtTG9jVGV4dDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbWFnZVBpY2tlckF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gKHRoaXMuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC1cbiAgICAgICAgICAgICh0aGlzLklNQUdFUElDS0VSX0NPVU5UIC0gMSkgKiBjb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICByZXR1cm4gd2lkdGggPiAwID8gd2lkdGggOiBjb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29sdW1uV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgY29sQ291bnQ6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gKHRoaXMuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC0gKGNvbENvdW50IC0gMSkgKlxuICAgICAgICAgICAgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpIC8gY29sQ291bnQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Q29sdW1uTWFyZ2lucyhjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBjb2xDb3VudDogbnVtYmVyLCBjb2x1bW46IG51bWJlcikge1xuICAgICAgICBjb25zdCBjZWxsV2lkdGg6IG51bWJlciA9IHRoaXMuZ2V0Q29sdW1uV2lkdGgoY29udHJvbGxlciwgY29sQ291bnQpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICsgY29sdW1uICpcbiAgICAgICAgICAgIChjZWxsV2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aCAqIHRoaXMuR0FQX0JFVFdFRU5fQ09MVU1OUyk7XG4gICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArIChjb2xDb3VudCAtIGNvbHVtbiAtIDEpICpcbiAgICAgICAgICAgIChjZWxsV2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aCAqIHRoaXMuR0FQX0JFVFdFRU5fQ09MVU1OUyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgbW92ZVJlY3QocmVjdDogSVJlY3QsIGxlZnQ6IG51bWJlciA9IHJlY3QueExlZnQsIHRvcDogbnVtYmVyID0gcmVjdC55VG9wKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IGxlZnQsXG4gICAgICAgICAgICB5VG9wOiB0b3AsXG4gICAgICAgICAgICB4UmlnaHQ6IGxlZnQgKyByZWN0LnhSaWdodCAtIHJlY3QueExlZnQsXG4gICAgICAgICAgICB5Qm90OiB0b3AgKyByZWN0LnlCb3QgLSByZWN0LnlUb3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBzY2FsZVJlY3QocmVjdDogSVJlY3QsIHNjYWxlOiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIGNvbnN0IHNjYWxlV2lkdGg6IG51bWJlciA9IE1hdGgubWluKHJlY3QueFJpZ2h0IC0gcmVjdC54TGVmdCwgcmVjdC55Qm90IC0gcmVjdC55VG9wKSAqICgxLjAgLSBzY2FsZSkgLyAyLjA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogcmVjdC54TGVmdCArIHNjYWxlV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiByZWN0LnlUb3AgKyBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeFJpZ2h0OiByZWN0LnhSaWdodCAtIHNjYWxlV2lkdGgsXG4gICAgICAgICAgICB5Qm90OiByZWN0LnlCb3QgLSBzY2FsZVdpZHRoXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Qm9yZGVyV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICByZXR1cm4gMi4wICogY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBmb3JtU2NhbGUoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZmxhdDogSVNpemUpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBtaW5TaWRlOiBudW1iZXIgPSBNYXRoLm1pbihmbGF0LndpZHRoLCBmbGF0LmhlaWdodCk7XG4gICAgICAgIHJldHVybiAobWluU2lkZSAtIHRoaXMuZ2V0Qm9yZGVyV2lkdGgoY29udHJvbGxlcikpIC8gbWluU2lkZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZW5lcmF0ZVF1ZXN0aW9uRmxhdHMoc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLmdldENvbnRlbnRRdWVzdGlvblR5cGUocXVlc3Rpb24sIHN1cnZleSk7XG4gICAgICAgIGNvbnN0IGZsYXRRdWVzdGlvbjogSUZsYXRRdWVzdGlvbiA9IEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuXG4gICAgICAgICAgICBjcmVhdGUoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlciwgcXVlc3Rpb25UeXBlKTtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25GbGF0czogSVBkZkJyaWNrW10gPSBhd2FpdCBmbGF0UXVlc3Rpb24uZ2VuZXJhdGVGbGF0cyhwb2ludCk7XG4gICAgICAgIGNvbnN0IGFkb3JuZXJzT3B0aW9uczogQWRvcm5lcnNPcHRpb25zID0gbmV3IEFkb3JuZXJzT3B0aW9ucyhwb2ludCxcbiAgICAgICAgICAgIHF1ZXN0aW9uRmxhdHMsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLCBTdXJ2ZXlQREZNb2R1bGUpO1xuICAgICAgICBpZiAocXVlc3Rpb24uY3VzdG9tV2lkZ2V0ICYmIHF1ZXN0aW9uLmN1c3RvbVdpZGdldC5pc0ZpdChxdWVzdGlvbikgJiZcbiAgICAgICAgICAgIHF1ZXN0aW9uLmN1c3RvbVdpZGdldC5wZGZSZW5kZXIpIHtcbiAgICAgICAgICAgIHN1cnZleS5vblJlbmRlclF1ZXN0aW9uLnVuc2hpZnQocXVlc3Rpb24uY3VzdG9tV2lkZ2V0LnBkZlJlbmRlcik7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgc3VydmV5Lm9uUmVuZGVyUXVlc3Rpb24uZmlyZShzdXJ2ZXksIGFkb3JuZXJzT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBbLi4uYWRvcm5lcnNPcHRpb25zLmJyaWNrc107XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNGb250RXhpc3QoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZm9udE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kb2MuaW50ZXJuYWwuZ2V0Rm9udChmb250TmFtZSkuZm9udE5hbWUgPT09IGZvbnROYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzQ3VzdG9tRm9udChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBmb250TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRvYy5pbnRlcm5hbC5nZXRGb250KGZvbnROYW1lKS5lbmNvZGluZyA9PT0gdGhpcy5DVVNUT01fRk9OVF9FTkNPRElORztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBmaXhGb250KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDdXN0b21Gb250KGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuZm9udE5hbWUpKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy50ZXh0KCdsb2FkIGZvbnQnLCAwLCAwKTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZG9jLmRlbGV0ZVBhZ2UoMSk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmFkZFBhZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNsb25lKHNyYzogYW55KTogYW55IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0OiBhbnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHNyYykge1xuICAgICAgICAgICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHNyY1twcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNob3VsZFJlbmRlclJlYWRPbmx5KHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlYWRPbmx5PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKCghIXF1ZXN0aW9uICYmIHF1ZXN0aW9uLmlzUmVhZE9ubHkgfHwgcmVhZE9ubHkpICYmIFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKFxuICAgICAgICAgICAgPFF1ZXN0aW9uPnF1ZXN0aW9uLCBjb250cm9sbGVyKSAhPT0gJ2Fjcm9mb3JtJykgfHwgY29udHJvbGxlcj8uY29tcHJlc3M7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNTaXplRW1wdHkodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF2YWwgfHwgdmFsID09PSAnYXV0byc7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNIZWlnaHRFbXB0eSh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NpemVFbXB0eSh2YWwpIHx8IHZhbCA9PSAnMTAwJSc7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0Q29ycmVjdGVkSW1hZ2VTaXplKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGltYWdlT3B0aW9uczogeyBpbWFnZVdpZHRoPzogYW55LCBpbWFnZUhlaWdodD86IGFueSwgaW1hZ2VMaW5rOiBzdHJpbmcsIGRlZmF1bHRJbWFnZVdpZHRoPzogYW55LCBkZWZhdWx0SW1hZ2VIZWlnaHQ/OiBhbnkgfSk6IFByb21pc2U8SVNpemU+IHtcbiAgICAgICAgbGV0IHsgaW1hZ2VXaWR0aCwgaW1hZ2VMaW5rLCBpbWFnZUhlaWdodCwgZGVmYXVsdEltYWdlV2lkdGgsIGRlZmF1bHRJbWFnZUhlaWdodCB9ID0gaW1hZ2VPcHRpb25zO1xuICAgICAgICBpbWFnZVdpZHRoID0gdHlwZW9mIGltYWdlV2lkdGggPT09ICdudW1iZXInID8gaW1hZ2VXaWR0aC50b1N0cmluZygpIDogaW1hZ2VXaWR0aDtcbiAgICAgICAgaW1hZ2VIZWlnaHQgPSB0eXBlb2YgaW1hZ2VIZWlnaHQgPT09ICdudW1iZXInID8gaW1hZ2VIZWlnaHQudG9TdHJpbmcoKSA6IGltYWdlSGVpZ2h0O1xuICAgICAgICBsZXQgd2lkdGhQdDogbnVtYmVyID0gaW1hZ2VXaWR0aCAmJiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChpbWFnZVdpZHRoLCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpLCAxLCAncHgnKTtcbiAgICAgICAgbGV0IGhlaWdodFB0OiBudW1iZXIgPSBpbWFnZUhlaWdodCAmJiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChpbWFnZUhlaWdodCwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSwgMSwgJ3B4Jyk7XG4gICAgICAgIGRlZmF1bHRJbWFnZVdpZHRoID0gdHlwZW9mIGRlZmF1bHRJbWFnZVdpZHRoID09PSAnbnVtYmVyJyA/IGRlZmF1bHRJbWFnZVdpZHRoLnRvU3RyaW5nKCkgOiBkZWZhdWx0SW1hZ2VXaWR0aDtcbiAgICAgICAgZGVmYXVsdEltYWdlSGVpZ2h0ID0gdHlwZW9mIGRlZmF1bHRJbWFnZUhlaWdodCA9PT0gJ251bWJlcicgPyBkZWZhdWx0SW1hZ2VIZWlnaHQudG9TdHJpbmcoKSA6IGRlZmF1bHRJbWFnZUhlaWdodDtcbiAgICAgICAgbGV0IGRlZmF1bHRXaWR0aFB0OiBudW1iZXIgPSBkZWZhdWx0SW1hZ2VXaWR0aCAmJiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChkZWZhdWx0SW1hZ2VXaWR0aCwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSwgMSwgJ3B4Jyk7XG4gICAgICAgIGxldCBkZWZhdWx0SGVpZ2h0UHQ6IG51bWJlciA9IGRlZmF1bHRJbWFnZUhlaWdodCAmJiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChkZWZhdWx0SW1hZ2VIZWlnaHQsIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlciksIDEsICdweCcpO1xuXG4gICAgICAgIGlmKFN1cnZleUhlbHBlci5pc1NpemVFbXB0eShpbWFnZVdpZHRoKSB8fCBTdXJ2ZXlIZWxwZXIuaXNIZWlnaHRFbXB0eShpbWFnZUhlaWdodCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IGF3YWl0IFN1cnZleUhlbHBlci5nZXRJbWFnZVNpemUoaW1hZ2VMaW5rKTtcbiAgICAgICAgICAgIGlmKCFTdXJ2ZXlIZWxwZXIuaXNTaXplRW1wdHkoaW1hZ2VXaWR0aCkpIHtcbiAgICAgICAgICAgICAgICBpZihpbWFnZVNpemUgJiYgaW1hZ2VTaXplLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodFB0ID0gaW1hZ2VTaXplLmhlaWdodCAqIHdpZHRoUHQgLyBpbWFnZVNpemUud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZighU3VydmV5SGVscGVyLmlzSGVpZ2h0RW1wdHkoaW1hZ2VIZWlnaHQpKSB7XG4gICAgICAgICAgICAgICAgaWYoaW1hZ2VTaXplICYmIGltYWdlU2l6ZS5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhQdCA9IGltYWdlU2l6ZS53aWR0aCAqIGhlaWdodFB0IC8gaW1hZ2VTaXplLmhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKGltYWdlU2l6ZSAmJiBpbWFnZVNpemUuaGVpZ2h0ICYmIGltYWdlU2l6ZS53aWR0aCkge1xuICAgICAgICAgICAgICAgIGhlaWdodFB0ID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoaW1hZ2VTaXplLmhlaWdodC50b1N0cmluZygpLCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpLCAxLCAncHgnKTtcbiAgICAgICAgICAgICAgICB3aWR0aFB0ID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoaW1hZ2VTaXplLndpZHRoLnRvU3RyaW5nKCksIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlciksIDEsICdweCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHdpZHRoOiB3aWR0aFB0IHx8IGRlZmF1bHRXaWR0aFB0IHx8IDAsIGhlaWdodDogaGVpZ2h0UHQgfHwgZGVmYXVsdEhlaWdodFB0IHx8IDAgfTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2hlbHBlcl9zdXJ2ZXkudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJRmxhdFF1ZXN0aW9uLCBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uRGVmYXVsdCB9IGZyb20gJy4vZmxhdF9kZWZhdWx0JztcblxuZXhwb3J0IHR5cGUgRmxhdENvbnN0cnVjdG9yID0gbmV3IChcbiAgICBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXJcbikgPT4gSUZsYXRRdWVzdGlvbjtcbmV4cG9ydCBjbGFzcyBGbGF0UmVwb3NpdG9yeSB7XG4gICAgcHJpdmF0ZSBxdWVzdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBGbGF0Q29uc3RydWN0b3IgfSA9IHt9O1xuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBGbGF0UmVwb3NpdG9yeSA9IG5ldyBGbGF0UmVwb3NpdG9yeSgpO1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogRmxhdFJlcG9zaXRvcnkge1xuICAgICAgICByZXR1cm4gRmxhdFJlcG9zaXRvcnkuaW5zdGFuY2U7XG4gICAgfVxuICAgIHB1YmxpYyByZWdpc3Rlcihtb2RlbFR5cGU6IHN0cmluZywgcmVuZGVyZXJDb25zdHJ1Y3RvcjogRmxhdENvbnN0cnVjdG9yKTogdm9pZCB7XG4gICAgICAgIHRoaXMucXVlc3Rpb25zW21vZGVsVHlwZV0gPSByZW5kZXJlckNvbnN0cnVjdG9yO1xuICAgIH1cbiAgICBwdWJsaWMgaXNUeXBlUmVnaXN0ZXJlZCh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWVzdGlvbnNbdHlwZV07XG4gICAgfVxuICAgIHB1YmxpYyBnZXRSZW5kZXJlcih0eXBlOiBzdHJpbmcpOiBGbGF0Q29uc3RydWN0b3Ige1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbnNbdHlwZV07XG4gICAgfVxuICAgIHB1YmxpYyBjcmVhdGUoc3VydmV5OiBTdXJ2ZXlQREYsIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgZG9jQ29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdHlwZT86IHN0cmluZyk6IElGbGF0UXVlc3Rpb24ge1xuICAgICAgICBjb25zdCBxdWVzdGlvblR5cGU6IHN0cmluZyA9IHR5cGVvZiB0eXBlID09PSAndW5kZWZpbmVkJyA/IHF1ZXN0aW9uLmdldFR5cGUoKSA6IHR5cGU7XG4gICAgICAgIGxldCByZW5kZXJlckNvbnN0cnVjdG9yID0gdGhpcy5nZXRSZW5kZXJlcihxdWVzdGlvblR5cGUpO1xuICAgICAgICBpZighcmVuZGVyZXJDb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgaWYoISFxdWVzdGlvbi5jdXN0b21XaWRnZXQ/LnBkZlJlbmRlcikge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyQ29uc3RydWN0b3IgPSBGbGF0UXVlc3Rpb247XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyQ29uc3RydWN0b3IgPSBGbGF0UXVlc3Rpb25EZWZhdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgcmVuZGVyZXJDb25zdHJ1Y3RvcihzdXJ2ZXksIHF1ZXN0aW9uLCBkb2NDb250cm9sbGVyKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyByZWdpc3Rlcih0eXBlOiBzdHJpbmcsIHJlbmRlcmVyQ29uc3RydWN0b3I6IEZsYXRDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgICAgICB0aGlzLmdldEluc3RhbmNlKCkucmVnaXN0ZXIodHlwZSwgcmVuZGVyZXJDb25zdHJ1Y3Rvcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVuZGVyZXIodHlwZTogc3RyaW5nKTogRmxhdENvbnN0cnVjdG9yIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW5zdGFuY2UoKS5nZXRSZW5kZXJlcih0eXBlKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmVwb3NpdG9yeS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb24sIExvY2FsaXphYmxlU3RyaW5nLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRTdXJ2ZXkgfSBmcm9tICcuL2ZsYXRfc3VydmV5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZsYXRRdWVzdGlvbiB7XG4gICAgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+O1xuICAgIGdlbmVyYXRlRmxhdHMocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+O1xufVxuZXhwb3J0IGNsYXNzIEZsYXRRdWVzdGlvbiBpbXBsZW1lbnRzIElGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRTogbnVtYmVyID0gMC41O1xuICAgIHB1YmxpYyBzdGF0aWMgQ09OVEVOVF9HQVBfSE9SX1NDQUxFOiBudW1iZXIgPSAxLjA7XG4gICAgcHVibGljIHN0YXRpYyBDT05URU5UX0lOREVOVF9TQ0FMRTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgREVTQ19HQVBfU0NBTEU6IG51bWJlciA9IDAuMDYyNTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb24+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0VGl0bGUocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGl0bGVGbGF0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXREZXNjcmlwdGlvbihwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVEZXNjRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLmxvY0Rlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRIZWFkZXIocG9pbnQ6IElQb2ludCk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKHBvaW50KTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2sodGl0bGVGbGF0KTtcbiAgICAgICAgaWYodGhpcy5xdWVzdGlvbi5oYXNEZXNjcmlwdGlvblVuZGVyVGl0bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRpdGxlRmxhdCwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgZGVzY1BvaW50LnlUb3AgKz0gRmxhdFF1ZXN0aW9uLkRFU0NfR0FQX1NDQUxFICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICBkZXNjUG9pbnQueExlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXREZXNjcmlwdGlvbihkZXNjUG9pbnQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzQ29tbWVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgdGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmxvY0NvbW1lbnRUZXh0O1xuICAgICAgICBjb25zdCBvdGhlclRleHRGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0ZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICBjb25zdCBvdGhlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQob3RoZXJUZXh0RmxhdCk7XG4gICAgICAgIG90aGVyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKG90aGVyVGV4dEZsYXQsIGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgIG90aGVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgZmFsc2UsIHsgcm93czogU3VydmV5SGVscGVyLk9USEVSX1JPV1NfQ09VTlQgfSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbXBvc2l0ZShwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjb250ZW50UGFuZWwgPSAoPGFueT50aGlzLnF1ZXN0aW9uKS5jb250ZW50UGFuZWw7XG4gICAgICAgIGlmICghIWNvbnRlbnRQYW5lbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IEZsYXRTdXJ2ZXkuZ2VuZXJhdGVGbGF0c1BhbmVsKHRoaXMuc3VydmV5LFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgY29udGVudFBhbmVsLCBwb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IFN1cnZleUhlbHBlci5nZXRDb250ZW50UXVlc3Rpb24odGhpcy5xdWVzdGlvbik7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnRXaXRoT3B0aW9uYWxFbGVtZW50cyhwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBmbGF0czogQXJyYXk8SVBkZkJyaWNrPiA9IFtdO1xuICAgICAgICBjb25zdCBjb250ZW50RmxhdHMgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb21wb3NpdGUocG9pbnQpO1xuICAgICAgICBmbGF0cy5wdXNoKC4uLmNvbnRlbnRGbGF0cyk7XG4gICAgICAgIGNvbnN0IGdldExhdGVzdFBvaW50ID0gKCk6IElQb2ludCA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICAgICAgaWYoY29udGVudEZsYXRzICE9PSBudWxsICYmIGNvbnRlbnRGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICByZXMueVRvcCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmZsYXRzKS55Qm90ICsgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc0NvbW1lbnQpIHtcbiAgICAgICAgICAgIGZsYXRzLnB1c2goYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29tbWVudChnZXRMYXRlc3RQb2ludCgpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaGFzRGVzY3JpcHRpb25VbmRlcklucHV0KSB7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24oZ2V0TGF0ZXN0UG9pbnQoKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0cyhwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQodGhpcy5xdWVzdGlvbi5pbmRlbnQpLndpZHRoO1xuICAgICAgICBjb25zdCBpbmRlbnRQb2ludDogSVBvaW50ID0ge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0ICsgdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMucXVlc3Rpb24uaW5kZW50KS53aWR0aCxcbiAgICAgICAgICAgIHlUb3A6IHBvaW50LnlUb3BcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGxldCB0aXRsZUxvY2F0aW9uOiBzdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmdldFRpdGxlTG9jYXRpb24oKTtcbiAgICAgICAgdGl0bGVMb2NhdGlvbiA9IHRoaXMucXVlc3Rpb24uaGFzVGl0bGUgPyB0aXRsZUxvY2F0aW9uIDogJ2hpZGRlbic7XG4gICAgICAgIHN3aXRjaCAodGl0bGVMb2NhdGlvbikge1xuICAgICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgIGNhc2UgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyRmxhdCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SGVhZGVyKGluZGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoaGVhZGVyRmxhdCk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgaGVhZGVyRmxhdC5hZGRCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChoZWFkZXJGbGF0KSwgdGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKlxuICAgICAgICAgICAgICAgICAgICBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50RmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudFdpdGhPcHRpb25hbEVsZW1lbnRzKGNvbnRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBpZihjb250ZW50RmxhdHMgIT09IG51bGwgJiYgY29udGVudEZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJGbGF0LmFkZEJyaWNrKGNvbnRlbnRGbGF0cy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaChoZWFkZXJGbGF0KTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmNvbnRlbnRGbGF0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdib3R0b20nOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUoaW5kZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50RmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudFdpdGhPcHRpb25hbEVsZW1lbnRzKGNvbnRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmNvbnRlbnRGbGF0cyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVQb2ludDogSVBvaW50ID0gaW5kZW50UG9pbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnlUb3AgPSBmbGF0c1tmbGF0cy5sZW5ndGggLSAxXS55Qm90O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SGVhZGVyKHRpdGxlUG9pbnQpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2xlZnQnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCAtXG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5NVUxUSVBMRVRFWFRfVEVYVF9QRVJTKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SGVhZGVyKGluZGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChoZWFkZXJGbGF0LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250ZW50UG9pbnQueExlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0dBUF9IT1JfU0NBTEU7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGNvbnRlbnRQb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50RmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudFdpdGhPcHRpb25hbEVsZW1lbnRzKGNvbnRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgaWYoY29udGVudEZsYXRzICE9PSBudWxsICYmIGNvbnRlbnRGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyRmxhdC5hZGRCcmljayhjb250ZW50RmxhdHMuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goaGVhZGVyRmxhdCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnaGlkZGVuJzpcbiAgICAgICAgICAgIGNhc2UgU3VydmV5SGVscGVyLlRJVExFX0xPQ0FUSU9OX01BVFJJWDpcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlTG9jYXRpb24gIT09IFN1cnZleUhlbHBlci5USVRMRV9MT0NBVElPTl9NQVRSSVgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb250ZW50V2l0aE9wdGlvbmFsRWxlbWVudHMoY29udGVudFBvaW50KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXQgc2hvdWxkUmVuZGVyQXNDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gU3VydmV5SGVscGVyLnNob3VsZFJlbmRlclJlYWRPbmx5KHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcik7XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdxdWVzdGlvbicsIHtcbiAgICBuYW1lOiAncmVhZG9ubHlSZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICd0ZXh0JywgJ2Fjcm9mb3JtJ10sXG4gICAgdmlzaWJsZTogZmFsc2Vcbn0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3F1ZXN0aW9uLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcblxuZXhwb3J0IGNsYXNzIFRleHRCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgYWxpZ246IGFueTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLmFsaWduID0ge1xuICAgICAgICAgICAgaXNJbnB1dFJ0bDogZmFsc2UsXG4gICAgICAgICAgICBpc091dHB1dFJ0bDogY29udHJvbGxlci5pc1JUTCxcbiAgICAgICAgICAgIGFsaWduOiBjb250cm9sbGVyLmlzUlRMID8gJ3JpZ2h0JzogJ2xlZnQnLFxuICAgICAgICAgICAgYmFzZWxpbmU6ICdtaWRkbGUnXG4gICAgICAgIH07XG4gICAgfVxuICAgIHByaXZhdGUgZXNjYXBlVGV4dCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMudGV4dC5pbmRleE9mKCdcXHQnKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnRleHQgPSB0aGlzLnRleHQucmVwbGFjZSgnXFx0JywgQXJyYXkoNSkuam9pbihTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50ZXh0O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBhbGlnblBvaW50OiBJUG9pbnQgPSB0aGlzLmFsaWduUG9pbnQodGhpcyk7XG4gICAgICAgIGxldCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSB0aGlzLmZvbnRTaXplO1xuICAgICAgICBsZXQgb2xkVGV4dENvbG9yOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLmdldFRleHRDb2xvcigpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldFRleHRDb2xvcih0aGlzLnRleHRDb2xvcik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MudGV4dCh0aGlzLmVzY2FwZVRleHQoKSwgYWxpZ25Qb2ludC54TGVmdCwgYWxpZ25Qb2ludC55VG9wLCB0aGlzLmFsaWduKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3Iob2xkVGV4dENvbG9yKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhbGlnblBvaW50KHJlY3Q6IElSZWN0KTogSVBvaW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiB0aGlzLmNvbnRyb2xsZXIuaXNSVEwgPyByZWN0LnhSaWdodCA6IHJlY3QueExlZnQsXG4gICAgICAgICAgICB5VG9wOiByZWN0LnlUb3AgKyAocmVjdC55Qm90IC0gcmVjdC55VG9wKSAvIDIuMFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dC50cyIsImltcG9ydCB7IElQZGZCcmljaywgVHJhbnNsYXRlWEZ1bmN0aW9uIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBicmlja3M6IElQZGZCcmlja1tdID0gW107XG4gICAgcHJpdmF0ZSBfeExlZnQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF94UmlnaHQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF95VG9wOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeUJvdDogbnVtYmVyO1xuICAgIHB1YmxpYyBpc1BhZ2VCcmVhazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciguLi5icmlja3M6IElQZGZCcmlja1tdKSB7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0gMC4wO1xuICAgICAgICB0aGlzLl94UmlnaHQgPSAwLjA7XG4gICAgICAgIHRoaXMuX3lUb3AgPSAwLjA7XG4gICAgICAgIHRoaXMuX3lCb3QgPSAwLjA7XG4gICAgICAgIHRoaXMuYWRkQnJpY2soLi4uYnJpY2tzKTtcbiAgICB9XG4gICAgZ2V0IHhMZWZ0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl94TGVmdDsgfVxuICAgIHNldCB4TGVmdCh4TGVmdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2hpZnQoeExlZnQgLSB0aGlzLnhMZWZ0LCAwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgdGhpcy5feExlZnQgPSB4TGVmdDtcbiAgICB9XG4gICAgZ2V0IHhSaWdodCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feFJpZ2h0OyB9XG4gICAgc2V0IHhSaWdodCh4UmlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KDAuMCwgeFJpZ2h0IC0gdGhpcy54UmlnaHQsIDAuMCwgMC4wKTtcbiAgICAgICAgdGhpcy5feFJpZ2h0ID0geFJpZ2h0O1xuICAgIH1cbiAgICBnZXQgeVRvcCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feVRvcDsgfVxuICAgIHNldCB5VG9wKHlUb3A6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KDAuMCwgMC4wLCB5VG9wIC0gdGhpcy55VG9wLCAwLjApO1xuICAgICAgICB0aGlzLl95VG9wID0geVRvcDtcbiAgICB9XG4gICAgZ2V0IHlCb3QoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3lCb3Q7IH1cbiAgICBzZXQgeUJvdCh5Qm90OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIDAuMCwgMC4wLCB5Qm90IC0gdGhpcy55Qm90KTtcbiAgICAgICAgdGhpcy5feUJvdCA9IHlCb3Q7XG4gICAgfVxuICAgIHByaXZhdGUgc2hpZnQobGVmdFNoaWZ0OiBudW1iZXIsIHJpZ2h0U2hpZnQ6IG51bWJlcixcbiAgICAgICAgdG9wU2hpZnQ6IG51bWJlciwgYm90U2hpZnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLmJyaWNrcy5mb3JFYWNoKChicmljazogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICBicmljay54TGVmdCArPSBsZWZ0U2hpZnQ7XG4gICAgICAgICAgICBicmljay54UmlnaHQgKz0gcmlnaHRTaGlmdDtcbiAgICAgICAgICAgIGJyaWNrLnlUb3AgKz0gdG9wU2hpZnQ7XG4gICAgICAgICAgICBicmljay55Qm90ICs9IGJvdFNoaWZ0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5icmlja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYnJpY2tzW2ldLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJpY2tzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgcHVibGljIGFkZEJyaWNrKC4uLmJyaWNrczogSVBkZkJyaWNrW10pIHtcbiAgICAgICAgaWYgKGJyaWNrcy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgdGhpcy5icmlja3MucHVzaCguLi5icmlja3MpO1xuICAgICAgICAgICAgbGV0IG1lcmdlUmVjdCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLnRoaXMuYnJpY2tzKTtcbiAgICAgICAgICAgIHRoaXMuX3hMZWZ0ID0gbWVyZ2VSZWN0LnhMZWZ0O1xuICAgICAgICAgICAgdGhpcy5feFJpZ2h0ID0gbWVyZ2VSZWN0LnhSaWdodDtcbiAgICAgICAgICAgIHRoaXMuX3lUb3AgPSBtZXJnZVJlY3QueVRvcDtcbiAgICAgICAgICAgIHRoaXMuX3lCb3QgPSBtZXJnZVJlY3QueUJvdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgdW5mb2xkKCk6IElQZGZCcmlja1tdIHtcbiAgICAgICAgY29uc3QgdW5mb2xkQnJpY2tzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICB0aGlzLmJyaWNrcy5mb3JFYWNoKChicmljazogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRCcmlja3MucHVzaCguLi5icmljay51bmZvbGQoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdW5mb2xkQnJpY2tzO1xuICAgIH1cbiAgICB0cmFuc2xhdGVYKGZ1bmM6IFRyYW5zbGF0ZVhGdW5jdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLmJyaWNrcy5mb3JFYWNoKGJyaWNrID0+IGJyaWNrLnRyYW5zbGF0ZVgoZnVuYykpO1xuICAgICAgICBjb25zdCByZXMgPSBmdW5jKHRoaXMueExlZnQsIHRoaXMueFJpZ2h0KTtcbiAgICAgICAgdGhpcy5feExlZnQgPSByZXMueExlZnQ7XG4gICAgICAgIHRoaXMuX3hSaWdodCA9IHJlcy54UmlnaHQ7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUudHMiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNl9fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcIlN1cnZleVwiLFwiY29tbW9uanMyXCI6XCJzdXJ2ZXktY29yZVwiLFwiY29tbW9uanNcIjpcInN1cnZleS1jb3JlXCIsXCJhbWRcIjpcInN1cnZleS1jb3JlXCJ9XG4vLyBtb2R1bGUgaWQgPSA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCB7IElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IHR5cGUgVHJhbnNsYXRlWEZ1bmN0aW9uID0gKHhMZWZ0OiBudW1iZXIsIHhSaWdodCA6IG51bWJlcikgPT4geyB4TGVmdDogbnVtYmVyLCB4UmlnaHQ6IG51bWJlcn07XG5leHBvcnQgaW50ZXJmYWNlIElQZGZCcmljayBleHRlbmRzIElSZWN0LCBJU2l6ZSB7XG4gICAgcmVuZGVyKCk6IFByb21pc2U8dm9pZD47XG4gICAgdW5mb2xkKCk6IElQZGZCcmlja1tdO1xuICAgIHRyYW5zbGF0ZVgoZnVuYzogVHJhbnNsYXRlWEZ1bmN0aW9uKTogdm9pZDtcbiAgICBpc1BhZ2VCcmVhazogYm9vbGVhbjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIGEgUERGIGJyaWNrJm1kYXNoO2Egc2ltcGxlIGVsZW1lbnQgd2l0aCBzcGVjaWZpZWQgY29udGVudCwgc2l6ZSwgYW5kIGxvY2F0aW9uLiBCcmlja3MgYXJlIGZ1bmRhbWVudGFsIGVsZW1lbnRzIHVzZWQgdG8gY29uc3RydWN0IGEgUERGIGRvY3VtZW50LlxuICpcbiAqIFlvdSBjYW4gYWNjZXNzIGBQZGZCcmlja2Agb2JqZWN0cyB3aXRoaW4gZnVuY3Rpb25zIHRoYXQgaGFuZGxlIGBTdXJ2ZXlQREZgJ3MgW2BvblJlbmRlclF1ZXN0aW9uYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9zdXJ2ZXlwZGYjb25SZW5kZXJRdWVzdGlvbiksIFtgb25SZW5kZXJQYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVyUGFuZWwpLCBhbmQgW2BvblJlbmRlclBhZ2VgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlclBhZ2UpIGV2ZW50cy5cbiAqXG4gKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvYWRkLW1hcmt1cC10by1jdXN0b21pemUtcGRmLWZvcm1zLyAobGlua1N0eWxlKSlcbiAqL1xuZXhwb3J0IGNsYXNzIFBkZkJyaWNrIGltcGxlbWVudHMgSVBkZkJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgX3hMZWZ0OiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF94UmlnaHQ6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX3lUb3A6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX3lCb3Q6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEFuIFgtY29vcmRpbmF0ZSBmb3IgdGhlIGxlZnQgYnJpY2sgZWRnZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHhMZWZ0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl94TGVmdDtcbiAgICB9XG4gICAgcHVibGljIHNldCB4TGVmdCh2YWw6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldFhMZWZ0KHZhbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIFgtY29vcmRpbmF0ZSBmb3IgdGhlIHJpZ2h0IGJyaWNrIGVkZ2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCB4UmlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3hSaWdodDtcbiAgICB9XG4gICAgcHVibGljIHNldCB4UmlnaHQodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRYUmlnaHQodmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBZLWNvb3JkaW5hdGUgZm9yIHRoZSB0b3AgYnJpY2sgZWRnZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHlUb3AoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3lUb3A7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgeVRvcCh2YWw6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldFlUb3AodmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBZLWNvb3JkaW5hdGUgZm9yIHRoZSBib3R0b20gYnJpY2sgZWRnZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHlCb3QoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3lCb3Q7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgeUJvdCh2YWw6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldFlCb3R0b20odmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRm9udCBzaXplIGluIHBvaW50cy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IDE0IChpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50IFBERiBkb2N1bWVudClcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9udFNpemU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29sb3Igb2YgdGV4dCB3aXRoaW4gdGhlIGJyaWNrLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYFwiIzQwNDA0MFwiYFxuICAgICAqL1xuICAgIHB1YmxpYyB0ZXh0Q29sb3I6IHN0cmluZyA9IFN1cnZleUhlbHBlci5URVhUX0NPTE9SO1xuICAgIHB1YmxpYyBmb3JtQm9yZGVyQ29sb3I6IHN0cmluZyA9IFN1cnZleUhlbHBlci5GT1JNX0JPUkRFUl9DT0xPUjtcbiAgICBwdWJsaWMgaXNQYWdlQnJlYWs6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWN0OiBJUmVjdCkge1xuICAgICAgICB0aGlzLnhMZWZ0ID0gcmVjdC54TGVmdDtcbiAgICAgICAgdGhpcy54UmlnaHQgPSByZWN0LnhSaWdodDtcbiAgICAgICAgdGhpcy55VG9wID0gcmVjdC55VG9wO1xuICAgICAgICB0aGlzLnlCb3QgPSByZWN0LnlCb3Q7XG4gICAgICAgIHRoaXMuZm9udFNpemUgPSAhIWNvbnRyb2xsZXIgP1xuICAgICAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA6IERvY0NvbnRyb2xsZXIuRk9OVF9TSVpFO1xuICAgIH1cbiAgICB0cmFuc2xhdGVYKGZ1bmM6IFRyYW5zbGF0ZVhGdW5jdGlvbik6IHZvaWQge1xuICAgICAgICBjb25zdCByZXMgPSBmdW5jKHRoaXMueExlZnQsIHRoaXMueFJpZ2h0KTtcbiAgICAgICAgdGhpcy54TGVmdCA9IHJlcy54TGVmdDtcbiAgICAgICAgdGhpcy54UmlnaHQgPSByZXMueFJpZ2h0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYnJpY2sncyB3aWR0aCBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYnJpY2sncyBoZWlnaHQgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnlCb3QgLSB0aGlzLnlUb3A7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRTaG91bGRSZW5kZXJSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5zaG91bGRSZW5kZXJSZWFkT25seSh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBwdWJsaWMgYWZ0ZXJSZW5kZXJDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5nZXRTaG91bGRSZW5kZXJSZWFkT25seSgpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclJlYWRPbmx5KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBhd2FpdCB0aGlzLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgICAgIHRoaXMuYWZ0ZXJSZW5kZXJDYWxsYmFjayAmJiB0aGlzLmFmdGVyUmVuZGVyQ2FsbGJhY2soKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93cyB5b3UgdG8gZ2V0IGEgZmxhdCBhcnJheSBvZiBuZXN0ZWQgUERGIGJyaWNrcy5cbiAgICAgKiBAcmV0dXJucyBBIGZsYXQgYXJyYXkgb2YgbmVzdGVkIFBERiBicmlja3MuXG4gICAgICovXG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIHJldHVybiBbdGhpc107XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRDb3JyZWN0ZWRUZXh0KHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5pc1JUTCA/ICh2YWwgfHwgJycpLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyk6IHZhbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFhMZWZ0KHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0gdmFsO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WFJpZ2h0KHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3hSaWdodCA9IHZhbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFlUb3AodmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5feVRvcCA9IHZhbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFlCb3R0b20odmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5feUJvdCA9IHZhbDtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfYnJpY2sudHMiLCJpbXBvcnQgeyBqc1BERiwganNQREZPcHRpb25zIH0gZnJvbSAnanNwZGYnO1xuaW1wb3J0IHsgSUhUTUxSZW5kZXJUeXBlIH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X2h0bWwnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuLy8gaW1wb3J0IEZvbnRzIGZyb20gJy4vZm9udHMnO1xuaW1wb3J0IHNldFJhZGlvQXBwZWFyYW5jZSBmcm9tICcuL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0nO1xuaW1wb3J0ICcuL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0uanMnO1xuaW1wb3J0ICcuL2pzcGRmX3BsdWdpbnMvZnJvbV9odG1sLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJUG9pbnQge1xuICAgIC8qKlxuICAgICAqIEFuIFgtY29vcmRpbmF0ZSBmb3IgdGhlIGxlZnQgZWxlbWVudCBlZGdlLlxuICAgICAqL1xuICAgIHhMZWZ0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBZLWNvb3JkaW5hdGUgZm9yIHRoZSB0b3AgZWxlbWVudCBlZGdlLlxuICAgICAqL1xuICAgIHlUb3A6IG51bWJlcjtcbn1cbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgZGVzY3JpYmVzIGEgcmVjdGFuZ2xlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElSZWN0IGV4dGVuZHMgSVBvaW50IHtcbiAgICAvKipcbiAgICAgKiBBbiBYLWNvb3JkaW5hdGUgZm9yIHRoZSByaWdodCBlbGVtZW50IGVkZ2UuXG4gICAgICovXG4gICAgeFJpZ2h0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBZLWNvb3JkaW5hdGUgZm9yIHRoZSBib3R0b20gZWxlbWVudCBlZGdlLlxuICAgICAqL1xuICAgIHlCb3Q6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVNpemUge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIElNYXJnaW5MUiB7XG4gICAgLyoqXG4gICAgICogQSBsZWZ0IG1hcmdpbi5cbiAgICAgKi9cbiAgICBsZWZ0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgcmlnaHQgbWFyZ2luLlxuICAgICAqL1xuICAgIHJpZ2h0PzogbnVtYmVyO1xufVxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgdGhhdCBkZXNjcmliZXMgbWFyZ2lucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTWFyZ2luIGV4dGVuZHMgSU1hcmdpbkxSIHtcbiAgICAvKipcbiAgICAgKiBBIHRvcCBtYXJnaW4uXG4gICAgICovXG4gICAgdG9wPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgYm90dG9tIG1hcmdpbi5cbiAgICAgKi9cbiAgICBib3Q/OiBudW1iZXI7XG59XG4vKipcbiAqIFBERiBkb2N1bWVudCBjb25maWd1cmF0aW9uLiBQYXNzIGl0IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIGBTdXJ2ZXlQREZgIGNvbnN0cnVjdG9yOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBzdXJ2ZXlQZGYgPSBuZXcgU3VydmV5UERGLlN1cnZleVBERihzdXJ2ZXlKc29uLCBwZGZEb2NPcHRpb25zKTtcbiAqXG4gKiAvLyBJbiBtb2R1bGFyIGFwcGxpY2F0aW9uczpcbiAqIGltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gXCJzdXJ2ZXktcGRmXCI7XG4gKiBjb25zdCBzdXJ2ZXlQZGYgPSBuZXcgU3VydmV5UERGKHN1cnZleUpzb24sIHBkZkRvY09wdGlvbnMpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURvY09wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFBhZ2Ugb3JpZW50YXRpb24uXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcInBcImAgKGRlZmF1bHQpIC0gUG9ydHJhaXQgb3JpZW50YXRpb24uXG4gICAgICogLSBgXCJsXCJgIC0gTGFuZHNjYXBlIG9yaWVudGF0aW9uLlxuICAgICAqXG4gICAgICogQHNlZSBmb3JtYXRcbiAgICAgKi9cbiAgICBvcmllbnRhdGlvbj86ICdwJyB8ICdsJztcblxuICAgIC8qKlxuICAgICAqIFBhZ2UgZm9ybWF0LlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJhMFwiYCAtIGBcImExMFwiYCAoYFwiYTRcImAgaXMgZGVmYXVsdClcbiAgICAgKiAtIGBcImIwXCJgIC0gYFwiYjEwXCJgXG4gICAgICogLSBgXCJjMFwiYCAtIGBcImMxMFwiYFxuICAgICAqIC0gYFwiZGxcImBcbiAgICAgKiAtIGBcImxldHRlclwiYFxuICAgICAqIC0gYFwiZ292ZXJubWVudC1sZXR0ZXJcImBcbiAgICAgKiAtIGBcImxlZ2FsXCJgXG4gICAgICogLSBgXCJqdW5pb3ItbGVnYWxcImBcbiAgICAgKiAtIGBcImxlZGdlclwiYFxuICAgICAqIC0gYFwidGFibG9pZFwiYFxuICAgICAqIC0gYFwiY3JlZGl0LWNhcmRcImBcbiAgICAgKiAtIEFycmF5PG51bWJlcj4gLSBjdXN0b20gcGFnZSBzaXplIGluIG1pbGxpbWV0ZXJzLCBmb3IgZXhhbXBsZSwgYFsyMTAsIDI5N11gLlxuICAgICAqXG4gICAgICogQHNlZSBvcmllbnRhdGlvblxuICAgICAqL1xuICAgIGZvcm1hdD86IHN0cmluZyB8IG51bWJlcltdO1xuXG4gICAgLyoqXG4gICAgICogRm9udCBzaXplIGluIHBvaW50cy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IDE0XG4gICAgICpcbiAgICAgKiBAc2VlIGZvbnROYW1lXG4gICAgICovXG4gICAgZm9udFNpemU/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBGb250IG5hbWUuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcIkhlbHZldGljYVwiYCAoZGVmYXVsdClcbiAgICAgKiAtIGBcIkNvdXJpZXJcImBcbiAgICAgKiAtIGBcIlRpbWVzXCJgXG4gICAgICogLSBgXCJTeW1ib2xcImBcbiAgICAgKiAtIGBcIlphcGZEaW5nYmF0c1wiYFxuICAgICAqIC0gW0N1c3RvbSBmb250IG5hbWVdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9QZGYtRXhwb3J0P2lkPUN1c3RvbWl6YXRpb24tQ2hhbmdlRm9udHMjdXNlLWN1c3RvbS1mb250KVxuICAgICAqXG4gICAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2NoYW5nZS1mb250LWluLXBkZi1mb3JtLyAobGlua1N0eWxlKSlcbiAgICAgKiBAc2VlIGZvbnRTaXplXG4gICAgICovXG4gICAgZm9udE5hbWU/OiBzdHJpbmc7XG5cbiAgICBiYXNlNjROb3JtYWw/OiBzdHJpbmc7XG4gICAgYmFzZTY0Qm9sZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBhcHBseSBhIGN1c3RvbSBmb250IHRvIFtIVE1MIHF1ZXN0aW9uc10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZXhhbXBsZXMvcXVlc3Rpb250eXBlLWh0bWwvKS5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jaGFuZ2UtZm9udC1pbi1wZGYtZm9ybS8gKGxpbmtTdHlsZSkpXG4gICAgICogQHNlZSBodG1sUmVuZGVyQXNcbiAgICAgKi9cbiAgICB1c2VDdXN0b21Gb250SW5IdG1sPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFBhZ2UgbWFyZ2lucy4gU2V0IHRoaXMgcHJvcGVydHkgdG8gYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHM6IGB0b3BgLCBgYm90YCwgYGxlZnRgLCBgcmlnaHRgLlxuICAgICAqL1xuICAgIG1hcmdpbnM/OiBJTWFyZ2luO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGhvdyB0byByZW5kZXIgW0hUTUwgcXVlc3Rpb25zXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeT9pZD1xdWVzdGlvbmh0bWxtb2RlbCkgaW50byBQREYuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcInN0YW5kYXJkXCJgIC0gUmVuZGVyIEhUTUwgcXVlc3Rpb25zIGFzIHNlbGVjdGFibGUgdGV4dC5cbiAgICAgKiAtIGBcImltYWdlXCJgIC0gUmVuZGVyIEhUTUwgcXVlc3Rpb25zIGFzIGltYWdlcy5cbiAgICAgKiAtIGBcImF1dG9cImAgKGRlZmF1bHQpIC0gU2VsZWN0IGJldHdlZW4gdGhlIGBcInN0YW5kYXJkXCJgIGFuZCBgXCJpbWFnZVwiYCBtb2RlcyBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBIVE1MIGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgcHJvcGVydHkgZm9yIGFuIGluZGl2aWR1YWwgSFRNTCBxdWVzdGlvbi4gU2V0IHRoZSBxdWVzdGlvbidzIGByZW5kZXJBc2AgcHJvcGVydHkgdG8gYFwic3RhbmRhcmRcImAgb3IgYFwiaW1hZ2VcImAgaW4gdGhlIHN1cnZleSBKU09OIHNjaGVtYS5cbiAgICAgKiBAc2VlIHVzZUN1c3RvbUZvbnRJbkh0bWxcbiAgICAgKi9cbiAgICBodG1sUmVuZGVyQXM/OiBJSFRNTFJlbmRlclR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgaG93IHRvIHJlbmRlciBbTWF0cml4XShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeT9pZD1xdWVzdGlvbm1hdHJpeG1vZGVsKSwgW01hdHJpeCBEcm9wZG93bl0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9cXVlc3Rpb25tYXRyaXhkcm9wZG93bm1vZGVsKSwgYW5kIFtNYXRyaXggRHluYW1pY10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9cXVlc3Rpb25tYXRyaXhkeW5hbWljbW9kZWwpIHF1ZXN0aW9ucyBpbnRvIFBERi5cbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKlxuICAgICAqIC0gYFwibGlzdFwiYCAtIFJlbmRlciBtYXRyaXgtbGlrZSBxdWVzdGlvbnMgYXMgbGlzdHMuXG4gICAgICogLSBgXCJhdXRvXCJgIChkZWZhdWx0KSAtIFJlbmRlciBtYXRyaXgtbGlrZSBxdWVzdGlvbnMgYXMgdGFibGVzIGlmIHRoZXkgZml0IGludG8gdGhlIGF2YWlsYWJsZSBzcGFjZS4gT3RoZXJ3aXNlLCByZW5kZXIgdGhlIHF1ZXN0aW9ucyBhcyBsaXN0cy5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBwcm9wZXJ0eSBmb3IgYW4gaW5kaXZpZHVhbCBtYXRyaXgtbGlrZSBxdWVzdGlvbi4gU2V0IHRoZSBxdWVzdGlvbidzIGByZW5kZXJBc2AgcHJvcGVydHkgdG8gYFwibGlzdFwiYCBpbiB0aGUgc3VydmV5IEpTT04gc2NoZW1hLlxuICAgICAqL1xuICAgIG1hdHJpeFJlbmRlckFzPzogJ2F1dG8nIHwgJ2xpc3QnO1xuICAgIHVzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmc/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBob3cgdG8gcmVuZGVyIHJlYWQtb25seSBxdWVzdGlvbnMuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcInRleHRcImAgLSBSZW5kZXIgcmVhZC1vbmx5IHF1ZXN0aW9ucyBhcyBwbGFpbiB0ZXh0IGFuZCBjdXN0b20gcHJpbWl0aXZlcy5cbiAgICAgKiAtIGBcImFjcm9mb3JtXCJgIC0gVXNlIEFkb2JlIEFjcm9Gb3JtcyB0byByZW5kZXIgcXVlc3Rpb25zIHRoYXQgc3VwcG9ydCB0aGVtIGFzIGludGVyYWN0aXZlIGZvcm0gZWxlbWVudHMgc3dpdGNoZWQgdG8gdGhlaXIgbmF0aXZlIHJlYWQtb25seSBzdGF0ZS4gT3RoZXIgcXVlc3Rpb25zIGFyZSByZW5kZXJlZCBpbiBgXCJ0ZXh0XCJgIG1vZGUuXG4gICAgICogLSBgXCJhdXRvXCJgIChkZWZhdWx0KSAtIFByZWZlciB0aGUgYFwidGV4dFwiYCBtb2RlIGJ1dCB1c2UgYFwiYWNyb2Zvcm1cImAgZm9yIFtGaWxlIFVwbG9hZF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2ZpbGUtbW9kZWwpIHF1ZXN0aW9ucyBhbmQgbGlua3MuXG4gICAgICovXG4gICAgcmVhZG9ubHlSZW5kZXJBcz86ICdhdXRvJyB8ICd0ZXh0JyB8ICdhY3JvZm9ybSc7XG5cbiAgICB0ZXh0RmllbGRSZW5kZXJBcz86ICdzaW5nbGVMaW5lJyB8ICdtdWx0aUxpbmUnO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gY29tcHJlc3MgdGhlIFBERiBkb2N1bWVudC4gQ29tcHJlc3NlZCBkb2N1bWVudHMgZG8gbm90IHN1cHBvcnQgW2N1c3RvbSBmb250c10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL1BkZi1FeHBvcnQ/aWQ9Q3VzdG9taXphdGlvbi1DaGFuZ2VGb250cyN1c2UtY3VzdG9tLWZvbnQpLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgICAqL1xuICAgIGNvbXByZXNzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGFwcGx5IGBpbWFnZUZpdGAgc2V0dGluZ3Mgc3BlY2lmaWVkIGluIHRoZSBzdXJ2ZXkgSlNPTiBzY2hlbWEgdG8gZXhwb3J0ZWQgaW1hZ2VzLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgICAqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBhcHBsaWVzIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3M6XG4gICAgICpcbiAgICAgKiAtIFtgaW1hZ2VGaXRgXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvYWRkLWltYWdlLXRvLXN1cnZleSNpbWFnZUZpdCkgdG8gZXhwb3J0ZWQgW0ltYWdlXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvYWRkLWltYWdlLXRvLXN1cnZleSkgcXVlc3Rpb25zXG4gICAgICogLSBbYGltYWdlRml0YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2ltYWdlLXBpY2tlci1xdWVzdGlvbi1tb2RlbCNpbWFnZUZpdCkgdG8gZXhwb3J0ZWQgW0ltYWdlIFBpY2tlcl0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2ltYWdlLXBpY2tlci1xdWVzdGlvbi1tb2RlbCkgcXVlc3Rpb25zXG4gICAgICogLSBbYGxvZ29GaXRgXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5LWRhdGEtbW9kZWwjbG9nb0ZpdCkgdG8gYW4gZXhwb3J0ZWQgbG9nbyBpbiB0aGUgc3VydmV5IGhlYWRlclxuICAgICAqXG4gICAgICogSWYgeW91IGVuYWJsZSB0aGUgYGFwcGx5SW1hZ2VGaXRgIHByb3BlcnR5LCB0aGUgcXVhbGl0eSBvZiBpbWFnZXMgbWF5IGJlIGxvd2VyIGJlY2F1c2UgdGhleSBwYXNzIHRocm91Z2ggc2V2ZXJhbCBjb252ZXJzaW9ucy4gSWYgYGFwcGx5SW1hZ2VGaXRgIGlzIGRpc2FibGVkLCBleHBvcnRlZCBpbWFnZXMgZmlsbCB0aGUgZW50aXJlIGNvbnRhaW5lciBhbmQgZG8gbm90IHByZXNlcnZlIHRoZWlyIGFzcGVjdCByYXRpbywgYnV0IHRoZWlyIHF1YWxpdHkgcmVtYWlucyB0aGUgc2FtZSBiZWNhdXNlIHRoZXkgYXJlIGV4cG9ydGVkIGFzIGlzLlxuICAgICAqL1xuICAgIGFwcGx5SW1hZ2VGaXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFBERiBkb2N1bWVudCBjb250YWlucyB0ZXh0IGluIHJpZ2h0LXRvLWxlZnQgbGFuZ3VhZ2VzLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgICAqL1xuICAgIGlzUlRMPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBpbmNsdWRlIG9ubHkgc2VsZWN0ZWQgY2hvaWNlcyB3aGVuIFBERiBHZW5lcmF0b3IgcmVuZGVycyBhIFtNdWx0aS1TZWxlY3QgRHJvcGRvd24gKFRhZyBCb3gpXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9leGFtcGxlcy9ob3ctdG8tY3JlYXRlLW11bHRpc2VsZWN0LXRhZy1ib3gvKSBxdWVzdGlvbi5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWAgKGluY2x1ZGUgYWxsIGNob2ljZXMpXG4gICAgICovXG4gICAgdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBEb2NPcHRpb25zIGltcGxlbWVudHMgSURvY09wdGlvbnMge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTU1fVE9fUFQgPSA3MiAvIDI1LjQ7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBGT05UX1NJWkUgPSAxNDtcbiAgICBwcm90ZWN0ZWQgX29yaWVudGF0aW9uOiAnbCcgfCAncCc7XG4gICAgcHJvdGVjdGVkIF9mb3JtYXQ6IHN0cmluZyB8IG51bWJlcltdO1xuICAgIHByb3RlY3RlZCBfZm9udFNpemU6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX2ZvbnROYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIHN0YXRpYyBTRUdPRV9OT1JNQUw6IHN0cmluZztcbiAgICBwdWJsaWMgc3RhdGljIFNFR09FX0JPTEQ6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2Jhc2U2NE5vcm1hbDogc3RyaW5nID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfYmFzZTY0Qm9sZDogc3RyaW5nID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfdXNlQ3VzdG9tRm9udEluSHRtbDogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgX21hcmdpbnM6IElNYXJnaW47XG4gICAgcHJvdGVjdGVkIF9odG1sUmVuZGVyQXM6IElIVE1MUmVuZGVyVHlwZTtcbiAgICBwcm90ZWN0ZWQgX21hdHJpeFJlbmRlckFzOiAnYXV0bycgfCAnbGlzdCc7XG4gICAgcHJvdGVjdGVkIF9yZWFkb25seVJlbmRlckFzOiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nO1xuICAgIHByb3RlY3RlZCBfY29tcHJlc3M6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIF9hcHBseUltYWdlRml0OiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfdXNlTGVnYWN5Qm9vbGVhblJlbmRlcmluZzogYm9vbGVhblxuICAgIHByb3RlY3RlZCBfaXNSVEw6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIF90YWdib3hTZWxlY3RlZENob2ljZXNPbmx5OiBib29sZWFuO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRG9jT3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub3JpZW50YXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZm9ybWF0ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0WzBdIDwgb3B0aW9ucy5mb3JtYXRbMV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vcmllbnRhdGlvbiA9ICdwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgdGhpcy5fb3JpZW50YXRpb24gPSAnbCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB0aGlzLl9vcmllbnRhdGlvbiA9IG9wdGlvbnMub3JpZW50YXRpb247XG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9IG9wdGlvbnMuZm9ybWF0IHx8ICdhNCc7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX2Zvcm1hdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1hdCA9IHRoaXMuX2Zvcm1hdC5tYXAoZiA9PiBmICogRG9jT3B0aW9ucy5NTV9UT19QVCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9udFNpemUgPSBvcHRpb25zLmZvbnRTaXplIHx8IERvY09wdGlvbnMuRk9OVF9TSVpFO1xuICAgICAgICBpZighb3B0aW9ucy5mb250TmFtZSkge1xuICAgICAgICAgICAgaWYoIURvY09wdGlvbnMuU0VHT0VfQk9MRCAmJiAhRG9jT3B0aW9ucy5TRUdPRV9OT1JNQUwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb250TmFtZSA9IFN1cnZleUhlbHBlci5TVEFOREFSRF9GT05UO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb250TmFtZSA9ICdzZWdvZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mb250TmFtZSA9IG9wdGlvbnMuZm9udE5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0eXBlb2Ygb3B0aW9ucy5mb250TmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucy5iYXNlNjROb3JtYWwgIT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMuYmFzZTY0Qm9sZCAhPT0gJ3VuZGVmaW5lZCcpKSkge1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Tm9ybWFsID0gb3B0aW9ucy5iYXNlNjROb3JtYWwgfHwgb3B0aW9ucy5iYXNlNjRCb2xkO1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Qm9sZCA9IG9wdGlvbnMuYmFzZTY0Qm9sZCB8fCBvcHRpb25zLmJhc2U2NE5vcm1hbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZvbnROYW1lID09PSAnc2Vnb2UnKSB7XG4gICAgICAgICAgICAvLyB0aGlzLl9iYXNlNjROb3JtYWwgPSBGb250cy5TRUdPRV9OT1JNQUw7XG4gICAgICAgICAgICAvLyB0aGlzLl9iYXNlNjRCb2xkID0gRm9udHMuU0VHT0VfQk9MRDtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2U2NE5vcm1hbCA9IERvY09wdGlvbnMuU0VHT0VfTk9STUFMO1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Qm9sZCA9IERvY09wdGlvbnMuU0VHT0VfQk9MRDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJnaW5zID0gU3VydmV5SGVscGVyLmNsb25lKG9wdGlvbnMubWFyZ2lucyk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMudG9wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy50b3AgPSAxMC4wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucy5ib3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLmJvdCA9IDEwLjA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXJnaW5zLmxlZnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLmxlZnQgPSAxMC4wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucy5yaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMucmlnaHQgPSAxMC4wO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX21hcmdpbnMpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgKDxhbnk+dGhpcy5fbWFyZ2lucylbbmFtZV0gPSAoPGFueT50aGlzLl9tYXJnaW5zKVtuYW1lXSAqIERvY09wdGlvbnMuTU1fVE9fUFQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9odG1sUmVuZGVyQXMgPSBvcHRpb25zLmh0bWxSZW5kZXJBcyB8fCAnYXV0byc7XG4gICAgICAgIHRoaXMuX21hdHJpeFJlbmRlckFzID0gb3B0aW9ucy5tYXRyaXhSZW5kZXJBcyB8fCAnYXV0byc7XG4gICAgICAgIHRoaXMuX3JlYWRvbmx5UmVuZGVyQXMgPSBvcHRpb25zLnJlYWRvbmx5UmVuZGVyQXMgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9jb21wcmVzcyA9IG9wdGlvbnMuY29tcHJlc3MgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX2FwcGx5SW1hZ2VGaXQgPSBvcHRpb25zLmFwcGx5SW1hZ2VGaXQgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX3VzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmcgPSBvcHRpb25zLnVzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmcgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzUlRMID0gb3B0aW9ucy5pc1JUTCB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5fdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seSA9IG9wdGlvbnMudGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seSB8fCBmYWxzZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBsZWZ0VG9wUG9pbnQoKTogSVBvaW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiB0aGlzLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgIHlUb3A6IHRoaXMubWFyZ2lucy50b3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIGdldCBmb250U2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udFNpemU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnROYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGJhc2U2NE5vcm1hbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmFzZTY0Tm9ybWFsO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGJhc2U2NEJvbGQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2U2NEJvbGQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdXNlQ3VzdG9tRm9udEluSHRtbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZUN1c3RvbUZvbnRJbkh0bWw7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbWFyZ2lucygpOiBJTWFyZ2luIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmdpbnM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9ybWF0KCk6IHN0cmluZyB8IG51bWJlcltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdDtcbiAgICB9XG4gICAgcHVibGljIGdldCBvcmllbnRhdGlvbigpOiAnbCcgfCAncCcge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb247XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaHRtbFJlbmRlckFzKCk6IElIVE1MUmVuZGVyVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9odG1sUmVuZGVyQXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbWF0cml4UmVuZGVyQXMoKTogJ2F1dG8nIHwgJ2xpc3QnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hdHJpeFJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHJlYWRvbmx5UmVuZGVyQXMoKTogJ2F1dG8nIHwgJ3RleHQnIHwgJ2Fjcm9mb3JtJyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkb25seVJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGNvbXByZXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29tcHJlc3M7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgYXBwbHlJbWFnZUZpdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5SW1hZ2VGaXQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdXNlTGVnYWN5Qm9vbGVhblJlbmRlcmluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmc7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaXNSVEwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1JUTDtcbiAgICB9XG4gICAgcHVibGljIGdldCB0YWdib3hTZWxlY3RlZENob2ljZXNPbmx5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seTtcbiAgICB9XG59XG5cbi8qKlxuICogVGhlIGBEb2NDb250cm9sbGVyYCBvYmplY3QgaW5jbHVkZXMgYW4gQVBJIHRoYXQgYWxsb3dzIHlvdSB0byBjb25maWd1cmUgdGhlIHJlc3VsdGluZyBQREYgZG9jdW1lbnQuIFlvdSBjYW4gYWNjZXNzIHRoaXMgb2JqZWN0IHdpdGhpbiBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdGhlIGBTdXJ2ZXlQREZgJ3MgW2BvblJlbmRlci4uLmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVyRm9vdGVyKSBldmVudHMuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2hvdy10by11c2UtYWRvcm5lcnMtaW4tcGRmLWZvcm1zLyAobGlua1N0eWxlKSlcbiAqL1xuZXhwb3J0IGNsYXNzIERvY0NvbnRyb2xsZXIgZXh0ZW5kcyBEb2NPcHRpb25zIHtcbiAgICBwcml2YXRlIF9kb2M6IGpzUERGO1xuICAgIHByaXZhdGUgX2hlbHBlckRvYzoganNQREY7XG4gICAgcHJpdmF0ZSBfZm9udFN0eWxlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBtYXJnaW5zU3RhY2s6IElNYXJnaW5MUltdO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRG9jT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBqc3BkZk9wdGlvbnM6IGpzUERGT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG9yaWVudGF0aW9uOiB0aGlzLm9yaWVudGF0aW9uLFxuICAgICAgICAgICAgdW5pdDogJ3B0JyxcbiAgICAgICAgICAgIGZvcm1hdDogdGhpcy5mb3JtYXQsXG4gICAgICAgICAgICBjb21wcmVzczogdGhpcy5jb21wcmVzc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kb2MgPSBuZXcganNQREYoanNwZGZPcHRpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJhc2U2NE5vcm1hbCAhPT0gJ3VuZGVmaW5lZCcgJiYgIVN1cnZleUhlbHBlci5pc0ZvbnRFeGlzdCh0aGlzLCB0aGlzLmZvbnROYW1lKSkge1xuICAgICAgICAgICAgRG9jQ29udHJvbGxlci5hZGRGb250KHRoaXMuZm9udE5hbWUsIHRoaXMuYmFzZTY0Tm9ybWFsLCAnbm9ybWFsJyk7XG4gICAgICAgICAgICBEb2NDb250cm9sbGVyLmFkZEZvbnQodGhpcy5mb250TmFtZSwgdGhpcy5iYXNlNjRCb2xkLCAnYm9sZCcpO1xuICAgICAgICAgICAgdGhpcy5fZG9jID0gbmV3IGpzUERGKGpzcGRmT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmFkaW9BcHBlYXJhbmNlKHRoaXMuX2RvYyk7XG4gICAgICAgIHRoaXMuX3VzZUN1c3RvbUZvbnRJbkh0bWwgPSBvcHRpb25zLnVzZUN1c3RvbUZvbnRJbkh0bWwgJiYgU3VydmV5SGVscGVyLmlzRm9udEV4aXN0KHRoaXMsIHRoaXMuZm9udE5hbWUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2MgPSBuZXcganNQREYoanNwZGZPcHRpb25zKTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnQodGhpcy5mb250TmFtZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuZm9udE5hbWUpO1xuICAgICAgICB0aGlzLl9kb2Muc2V0Rm9udFNpemUodGhpcy5mb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZSh0aGlzLmZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5fZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgIHRoaXMubWFyZ2luc1N0YWNrID0gW107XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3VzdG9tRm9udHM6IHsgW25hbWU6IHN0cmluZ106IHsgbm9ybWFsOiBzdHJpbmcsIGJvbGQ6IHN0cmluZywgaXRhbGljOiBzdHJpbmcsIGJvbGRpdGFsaWM6IHN0cmluZyB9IH0gPSB7fTtcbiAgICBwdWJsaWMgc3RhdGljIGFkZEZvbnQoZm9udE5hbWU6IHN0cmluZywgYmFzZTY0OiBzdHJpbmcsIGZvbnRTdHlsZTogJ25vcm1hbCcgfCAnYm9sZCcgfCAnaXRhbGljJyB8ICdib2xkaXRhbGljJykge1xuICAgICAgICBsZXQgZm9udCA9IERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHNbZm9udE5hbWVdO1xuICAgICAgICBpZiAoIWZvbnQpIHtcbiAgICAgICAgICAgIGZvbnQgPSA8YW55Pnt9O1xuICAgICAgICAgICAgRG9jQ29udHJvbGxlci5jdXN0b21Gb250c1tmb250TmFtZV0gPSBmb250O1xuICAgICAgICB9XG4gICAgICAgIGZvbnRbZm9udFN0eWxlXSA9IGJhc2U2NDtcbiAgICAgICAgY29uc3QgYWRkRm9udENhbGxiYWNrOiAoKSA9PiB2b2lkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tRm9udCA9IERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHNbZm9udE5hbWVdO1xuICAgICAgICAgICAgaWYgKCEhY3VzdG9tRm9udCAmJiAhIWN1c3RvbUZvbnRbZm9udFN0eWxlXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnRGaWxlOiBzdHJpbmcgPSBgJHtmb250TmFtZX0tJHtmb250U3R5bGV9LnR0ZmA7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGaWxlVG9WRlMoZm9udEZpbGUsIGN1c3RvbUZvbnRbZm9udFN0eWxlXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGb250KGZvbnRGaWxlLCBmb250TmFtZSwgZm9udFN0eWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgKDxhbnk+anNQREYpLkFQSS5ldmVudHMucHVzaChbJ2FkZEZvbnRzJywgYWRkRm9udENhbGxiYWNrXSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZG9jKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kb2M7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaGVscGVyRG9jKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWxwZXJEb2M7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnROYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGZvbnROYW1lKGZvbnROYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZm9udE5hbWUgPSBmb250TmFtZTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnQoZm9udE5hbWUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udChmb250TmFtZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udFNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnRTaXplO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGZvbnRTaXplKGZvbnRTaXplOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fZm9udFNpemUgPSBmb250U2l6ZTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBmb250U3R5bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnRTdHlsZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBmb250U3R5bGUoZm9udFN0eWxlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZm9udFN0eWxlID0gZm9udFN0eWxlO1xuICAgICAgICB0aGlzLl9kb2Muc2V0Rm9udCh0aGlzLl9mb250TmFtZSwgZm9udFN0eWxlKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQodGhpcy5fZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgfVxuICAgIHB1YmxpYyBtZWFzdXJlVGV4dCh0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZyB8IG51bWJlciA9IDEsIGZvbnRTdHlsZTogc3RyaW5nID0gdGhpcy5fZm9udFN0eWxlLFxuICAgICAgICBmb250U2l6ZTogbnVtYmVyID0gdGhpcy5fZm9udFNpemUpOiBJU2l6ZSB7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLl9oZWxwZXJEb2MuZ2V0Rm9udFNpemUoKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQodGhpcy5fZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gdGhpcy5faGVscGVyRG9jLmdldExpbmVIZWlnaHQoKSAvIHRoaXMuX2hlbHBlckRvYy5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSAwLjA7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdGV4dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRleHQgPSB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgPyB0ZXh0IDogU3VydmV5SGVscGVyLmdldExvY1N0cmluZyh0ZXh0KTtcbiAgICAgICAgICAgIHdpZHRoID0gdGV4dC5zcGxpdCgnJykucmVkdWNlKChzbTogbnVtYmVyLCBjcjogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgIHNtICsgdGhpcy5faGVscGVyRG9jLmdldFRleHRXaWR0aChjciksIDAuMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnRTaXplKG9sZEZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQodGhpcy5fZm9udE5hbWUsICdub3JtYWwnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB3aWR0aCBvZiBvbmUgY2hhcmFjdGVyIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVuaXRXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZWFzdXJlVGV4dCgpLndpZHRoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ3RoIG9mIG9uZSBjaGFyYWN0ZXIgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdW5pdEhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZWFzdXJlVGV4dCgpLmhlaWdodDtcbiAgICB9XG4gICAgcHVibGljIHB1c2hNYXJnaW5zKGxlZnQ/OiBudW1iZXIsIHJpZ2h0PzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFyZ2luc1N0YWNrLnB1c2goeyBsZWZ0OiB0aGlzLm1hcmdpbnMubGVmdCwgcmlnaHQ6IHRoaXMubWFyZ2lucy5yaWdodCB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiBsZWZ0ICE9PSAndW5kZWZpbmVkJykgdGhpcy5tYXJnaW5zLmxlZnQgPSBsZWZ0O1xuICAgICAgICBpZiAodHlwZW9mIHJpZ2h0ICE9PSAndW5kZWZpbmVkJykgdGhpcy5tYXJnaW5zLnJpZ2h0ID0gcmlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBwb3BNYXJnaW5zKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtYXJnaW5zOiBJTWFyZ2luTFIgPSB0aGlzLm1hcmdpbnNTdGFjay5wb3AoKTtcbiAgICAgICAgdGhpcy5tYXJnaW5zLmxlZnQgPSBtYXJnaW5zLmxlZnQ7XG4gICAgICAgIHRoaXMubWFyZ2lucy5yaWdodCA9IG1hcmdpbnMucmlnaHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB3aWR0aCBvZiBhIFBERiBwYWdlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcGVyV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIGEgUERGIHBhZ2UgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFwZXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodDtcbiAgICB9XG4gICAgcHVibGljIGdldE51bWJlck9mUGFnZXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmdldE51bWJlck9mUGFnZXMoKTtcbiAgICB9XG4gICAgcHVibGljIGFkZFBhZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG9jLmFkZFBhZ2UoKTtcbiAgICB9XG4gICAgcHVibGljIGdldEN1cnJlbnRQYWdlSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXIgLSAxO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0UGFnZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG9jLnNldFBhZ2UoaW5kZXggKyAxKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZG9jX2NvbnRyb2xsZXIudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFJhZGlvR3JvdXBXcmFwLCBSYWRpb0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3JhZGlvaXRlbSc7XG5pbXBvcnQgeyBGbGF0U2VsZWN0QmFzZSB9IGZyb20gJy4vZmxhdF9zZWxlY3RiYXNlJztcblxuZXhwb3J0IGNsYXNzIEZsYXRSYWRpb2dyb3VwIGV4dGVuZHMgRmxhdFNlbGVjdEJhc2Uge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWw7XG4gICAgcHJpdmF0ZSByYWRpb0dyb3VwV3JhcDogUmFkaW9Hcm91cFdyYXA7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25SYWRpb2dyb3VwTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBpc0l0ZW1TZWxlY3RlZChpdGVtOiBJdGVtVmFsdWUsIGNoZWNrZWQ/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIGNoZWNrZWQgPT09ICd1bmRlZmluZWQnKSA/XG4gICAgICAgICAgICAoaXRlbSA9PT0gdGhpcy5xdWVzdGlvbi5vdGhlckl0ZW0gPyB0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCA6XG4gICAgICAgICAgICAgICAgKGl0ZW0udmFsdWUgPT09IHRoaXMucXVlc3Rpb24udmFsdWUgfHxcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLnF1ZXN0aW9uLmlzSXRlbVNlbGVjdGVkICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pc0l0ZW1TZWxlY3RlZChpdGVtKSkpKSA6IGNoZWNrZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZW5lcmF0ZUZsYXRJdGVtKHJlY3Q6IElSZWN0LCBpdGVtOiBJdGVtVmFsdWUsXG4gICAgICAgIGluZGV4OiBudW1iZXIsIGtleT86IHN0cmluZywgY2hlY2tlZD86IGJvb2xlYW4sIGNvbnRleHQ6IGFueSA9IHt9KTogSVBkZkJyaWNrIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwID0gbmV3IFJhZGlvR3JvdXBXcmFwKHRoaXMucXVlc3Rpb24uaWQgKyAoKHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnKSA/ICcnIDoga2V5KSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHsgcmVhZE9ubHk6IHRoaXMucXVlc3Rpb24uaXNSZWFkT25seSwgcXVlc3Rpb246IHRoaXMucXVlc3Rpb24sIC4uLmNvbnRleHQgfSk7XG4gICAgICAgICAgICAoPGFueT50aGlzLnF1ZXN0aW9uKS5wZGZSYWRpb0dyb3VwV3JhcCA9IHRoaXMucmFkaW9Hcm91cFdyYXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMucmFkaW9Hcm91cFdyYXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwID0gKDxhbnk+dGhpcy5xdWVzdGlvbikucGRmUmFkaW9Hcm91cFdyYXA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNDaGVja2VkOiBib29sZWFuID0gdGhpcy5pc0l0ZW1TZWxlY3RlZChpdGVtLCBjaGVja2VkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSYWRpb0l0ZW1Ccmljayh0aGlzLmNvbnRyb2xsZXIsIHJlY3QsXG4gICAgICAgICAgICB7IHF1ZXN0aW9uOiB0aGlzLnF1ZXN0aW9uLCBpbmRleDogaW5kZXgsIGNoZWNrZWQ6IGlzQ2hlY2tlZCwgaXRlbTogaXRlbSB9LCB0aGlzLnJhZGlvR3JvdXBXcmFwKTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3JhZGlvZ3JvdXAnLCBGbGF0UmFkaW9ncm91cCk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdidXR0b25ncm91cCcsIEZsYXRSYWRpb2dyb3VwKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwiaW1wb3J0IHsgSUVsZW1lbnQsIFF1ZXN0aW9uLCBQYW5lbE1vZGVsQmFzZSwgUGFuZWxNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBSb3dsaW5lQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yb3dsaW5lJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgQWRvcm5lcnNQYW5lbE9wdGlvbnMsIEFkb3JuZXJzUGFnZU9wdGlvbnMgfSBmcm9tICcuLi9ldmVudF9oYW5kbGVyL2Fkb3JuZXJzJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi4vZW50cmllcy9wZGYnO1xuaW1wb3J0ICogYXMgU3VydmV5UERGTW9kdWxlIGZyb20gJy4uL2VudHJpZXMvcGRmJztcblxuZXhwb3J0IGNsYXNzIEZsYXRTdXJ2ZXkge1xuICAgIHB1YmxpYyBzdGF0aWMgUVVFU19HQVBfVkVSVF9TQ0FMRTogbnVtYmVyID0gMS41O1xuICAgIHB1YmxpYyBzdGF0aWMgUEFORUxfQ09OVF9HQVBfU0NBTEU6IG51bWJlciA9IDEuMDtcbiAgICBwdWJsaWMgc3RhdGljIFBBTkVMX0RFU0NfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0c1BhbmVsKHN1cnZleTogU3VydmV5UERGLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwYW5lbDogUGFuZWxNb2RlbCwgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgcGFuZWxGbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgcGFuZWxDb250ZW50UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gY29udHJvbGxlci5tZWFzdXJlVGV4dChwYW5lbC5pbm5lckluZGVudCkud2lkdGg7XG4gICAgICAgIHBhbmVsQ29udGVudFBvaW50LnhMZWZ0ICs9IGNvbnRyb2xsZXIubWVhc3VyZVRleHQocGFuZWwuaW5uZXJJbmRlbnQpLndpZHRoO1xuICAgICAgICBwYW5lbEZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUGFnZVBhbmVsKHN1cnZleSxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIsIHBhbmVsLCBwYW5lbENvbnRlbnRQb2ludCkpO1xuICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgY29uc3QgYWRvcm5lcnNPcHRpb25zOiBBZG9ybmVyc1BhbmVsT3B0aW9ucyA9IG5ldyBBZG9ybmVyc1BhbmVsT3B0aW9ucyhwb2ludCxcbiAgICAgICAgICAgIHBhbmVsRmxhdHMsIHBhbmVsLCBjb250cm9sbGVyLCBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLCBTdXJ2ZXlQREZNb2R1bGUpO1xuICAgICAgICBhd2FpdCBzdXJ2ZXkub25SZW5kZXJQYW5lbC5maXJlKHN1cnZleSwgYWRvcm5lcnNPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIFsuLi5hZG9ybmVyc09wdGlvbnMuYnJpY2tzXTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0c1BhZ2VQYW5lbChzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcGFnZVBhbmVsOiBQYW5lbE1vZGVsQmFzZSwgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgaWYgKCFwYWdlUGFuZWwuaXNWaXNpYmxlKSByZXR1cm47XG4gICAgICAgIHBhZ2VQYW5lbC5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgICAgIGNvbnN0IHBhZ2VQYW5lbEZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBsZXQgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBpZiAocGFnZVBhbmVsLmdldFR5cGUoKSAhPT0gJ3BhZ2UnIHx8IHN1cnZleS5zaG93UGFnZVRpdGxlcykge1xuICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgICAgIGlmIChwYWdlUGFuZWwudGl0bGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFnZVBhbmVsIGluc3RhbmNlb2YgUGFuZWxNb2RlbCAmJiBwYWdlUGFuZWwubm8pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGl0bGVQYW5lbEZsYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIGNvbnRyb2xsZXIsIHBhZ2VQYW5lbC5ubywgcGFnZVBhbmVsLmdldFR5cGUoKSA9PT0gJ3BhZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhub0ZsYXQpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBub0ZsYXQueFJpZ2h0ICsgY29udHJvbGxlci5tZWFzdXJlVGV4dCgnICcpLndpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlbFBhbmVsVGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGl0bGVQYW5lbEZsYXQoXG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgY29udHJvbGxlciwgcGFnZVBhbmVsLmxvY1RpdGxlLCBwYWdlUGFuZWwuZ2V0VHlwZSgpID09PSAncGFnZScpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2socGFnZWxQYW5lbFRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHBhZ2VsUGFuZWxUaXRsZUZsYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhZ2VQYW5lbC5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChwYWdlUGFuZWwudGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0U3VydmV5LlBBTkVMX0RFU0NfR0FQX1NDQUxFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlUGFuZWxEZXNjRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZURlc2NGbGF0KFxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIG51bGwsIGNvbnRyb2xsZXIsIHBhZ2VQYW5lbC5sb2NEZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhwYWdlUGFuZWxEZXNjRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHBhZ2VQYW5lbERlc2NGbGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29tcG9zaXRlRmxhdC5pc0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93TGluZVBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQocm93TGluZVBvaW50LCBjb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgcGFnZVBhbmVsRmxhdHMucHVzaChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0U3VydmV5LlBBTkVMX0NPTlRfR0FQX1NDQUxFICsgU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByb3cgb2YgcGFnZVBhbmVsLnJvd3MpIHtcbiAgICAgICAgICAgIGlmICghcm93LnZpc2libGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcik7XG4gICAgICAgICAgICBsZXQgbmV4dE1hcmdpbkxlZnQ6IG51bWJlciA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgY29uc3Qgcm93RmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlRWxlbWVudHMgPSByb3cuZWxlbWVudHMuZmlsdGVyKGVsID0+IGVsLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdmlzaWJsZUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IElFbGVtZW50ID0gdmlzaWJsZUVsZW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5pc1Zpc2libGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBlcnNXaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoZWxlbWVudC5yZW5kZXJXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggLSAodmlzaWJsZUVsZW1lbnRzLmxlbmd0aCAtIDEpICogY29udHJvbGxlci51bml0V2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGVFbGVtZW50cy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gbmV4dE1hcmdpbkxlZnQgKyAoKGkgIT09IDApID8gY29udHJvbGxlci51bml0V2lkdGggOiAwKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIHBlcnNXaWR0aDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICBuZXh0TWFyZ2luTGVmdCA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICsgcGVyc1dpZHRoO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGFuZWxNb2RlbCkge1xuICAgICAgICAgICAgICAgICAgICByb3dGbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1BhbmVsKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBlbGVtZW50LCBjdXJyUG9pbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0ZsYXRzLnB1c2goLi4uYXdhaXQgU3VydmV5SGVscGVyLmdlbmVyYXRlUXVlc3Rpb25GbGF0cyhzdXJ2ZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCA8UXVlc3Rpb24+ZWxlbWVudCwgY3VyclBvaW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGlmIChyb3dGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLnJvd0ZsYXRzKS55Qm90O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRTdXJ2ZXkuUVVFU19HQVBfVkVSVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBwYWdlUGFuZWxGbGF0cy5wdXNoKC4uLnJvd0ZsYXRzKTtcbiAgICAgICAgICAgICAgICBwYWdlUGFuZWxGbGF0cy5wdXNoKFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIGNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnZVBhbmVsRmxhdHM7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIHBvcFJvd2xpbmVzKGZsYXRzOiBJUGRmQnJpY2tbXSkge1xuICAgICAgICB3aGlsZSAoZmxhdHMubGVuZ3RoID4gMCAmJiBmbGF0c1tmbGF0cy5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIFJvd2xpbmVCcmljaykge1xuICAgICAgICAgICAgZmxhdHMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0VGl0bGUoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGlmIChzdXJ2ZXkuc2hvd1RpdGxlKSB7XG4gICAgICAgICAgICBpZiAoc3VydmV5LnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VydmV5VGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGl0bGVTdXJ2ZXlGbGF0KFxuICAgICAgICAgICAgICAgICAgICBwb2ludCwgY29udHJvbGxlciwgc3VydmV5LmxvY1RpdGxlKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHN1cnZleVRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgcG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoc3VydmV5VGl0bGVGbGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdXJ2ZXkuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoc3VydmV5LnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0U3VydmV5LlBBTkVMX0RFU0NfR0FQX1NDQUxFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVEZXNjRmxhdChcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQsIG51bGwsIGNvbnRyb2xsZXIsIHN1cnZleS5sb2NEZXNjcmlwdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUZsYXRMb2dvSW1hZ2Uoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBsb2dvVXJsID0gU3VydmV5SGVscGVyLmdldExvY1N0cmluZyhzdXJ2ZXkubG9jTG9nbyk7XG4gICAgICAgIGNvbnN0IGxvZ29TaXplID0gYXdhaXQgU3VydmV5SGVscGVyLmdldENvcnJlY3RlZEltYWdlU2l6ZShjb250cm9sbGVyLCB7IGltYWdlTGluazogbG9nb1VybCwgaW1hZ2VIZWlnaHQ6IHN1cnZleS5sb2dvSGVpZ2h0LCBpbWFnZVdpZHRoOiBzdXJ2ZXkubG9nb1dpZHRoLCBkZWZhdWx0SW1hZ2VXaWR0aDogJzMwMHB4JywgZGVmYXVsdEltYWdlSGVpZ2h0OiAnMjAwcHgnIH0pO1xuICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChcbiAgICAgICAgICAgIHBvaW50LCBudWxsLCBjb250cm9sbGVyLCB7IGxpbms6IGxvZ29VcmwsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGxvZ29TaXplLndpZHRoLCBoZWlnaHQ6IGxvZ29TaXplLmhlaWdodCB9KTtcbiAgICAgICAgbGV0IHNoaWZ0OiBudW1iZXIgPSAwO1xuICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgc2hpZnQgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC0gbG9nb0ZsYXQud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICBzaGlmdCA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcikgLyAyLjAgLSBsb2dvRmxhdC53aWR0aCAvIDIuMDtcbiAgICAgICAgfVxuICAgICAgICBsb2dvRmxhdC54TGVmdCArPSBzaGlmdDtcbiAgICAgICAgbG9nb0ZsYXQueFJpZ2h0ICs9IHNoaWZ0O1xuICAgICAgICByZXR1cm4gbG9nb0ZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0cyhzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8SVBkZkJyaWNrW11bXT4ge1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBpZiAoIXN1cnZleS5oYXNMb2dvKSB7XG4gICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgIGlmICghdGl0bGVGbGF0LmlzRW1wdHkpIGZsYXRzLnB1c2goW3RpdGxlRmxhdF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN1cnZleS5pc0xvZ29CZWZvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvZ29GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdExvZ29JbWFnZShcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgIGZsYXRzLnB1c2goW2xvZ29GbGF0XSk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZVBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQobG9nb0ZsYXQsXG4gICAgICAgICAgICAgICAgc3VydmV5LmxvZ29Qb3NpdGlvbiA9PT0gJ3RvcCcsIHN1cnZleS5sb2dvUG9zaXRpb24gIT09ICd0b3AnKTtcbiAgICAgICAgICAgIGlmIChzdXJ2ZXkubG9nb1Bvc2l0aW9uICE9PSAndG9wJykge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnhMZWZ0ICs9IGNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IGxvZ29GbGF0LndpZHRoICsgY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnhMZWZ0ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAvIDIuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKFxuICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgdGl0bGVQb2ludCk7XG4gICAgICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ3RvcCcpIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkgZmxhdHNbMF0ucHVzaCh0aXRsZUZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRMb2dvSW1hZ2UoXG4gICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgY29udHJvbGxlci5sZWZ0VG9wUG9pbnQpO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goW2xvZ29GbGF0XSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSBsb2dvRmxhdC53aWR0aCArIGNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRpdGxlRmxhdC5pc0VtcHR5KSBmbGF0c1swXS51bnNoaWZ0KHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICAgICAgbGV0IGxvZ29Qb2ludDogSVBvaW50ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKFt0aXRsZUZsYXRdKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nb1BvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ29Qb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAvIDIuMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nb0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0TG9nb0ltYWdlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGxvZ29Qb2ludCk7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXRzLmxlbmd0aCAhPT0gMCkgZmxhdHNbMF0ucHVzaChsb2dvRmxhdCk7XG4gICAgICAgICAgICAgICAgZWxzZSBmbGF0cy5wdXNoKFtsb2dvRmxhdF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwb2ludDogSVBvaW50ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQ7XG4gICAgICAgIGlmIChmbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHBvaW50LnlUb3AgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4uZmxhdHNbMF0pKS55VG9wO1xuICAgICAgICAgICAgZmxhdHNbMF0ucHVzaChTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQocG9pbnQsIGNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIHBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFN1cnZleS5QQU5FTF9DT05UX0dBUF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdXJ2ZXkudmlzaWJsZVBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzdXJ2ZXkuY3VycmVudFBhZ2UgPSBzdXJ2ZXkudmlzaWJsZVBhZ2VzW2ldO1xuICAgICAgICAgICAgbGV0IHBhZ2VGbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgICAgIHBhZ2VGbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1BhZ2VQYW5lbChcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIHN1cnZleS52aXNpYmxlUGFnZXNbaV0sIHBvaW50KSk7XG4gICAgICAgICAgICBjb25zdCBhZG9ybmVyc09wdGlvbnM6IEFkb3JuZXJzUGFnZU9wdGlvbnMgPSBuZXcgQWRvcm5lcnNQYWdlT3B0aW9ucyhwb2ludCxcbiAgICAgICAgICAgICAgICBwYWdlRmxhdHMsIHN1cnZleS52aXNpYmxlUGFnZXNbaV0sIGNvbnRyb2xsZXIsIEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCksIFN1cnZleVBERk1vZHVsZSk7XG4gICAgICAgICAgICBhd2FpdCBzdXJ2ZXkub25SZW5kZXJQYWdlLmZpcmUoc3VydmV5LCBhZG9ybmVyc09wdGlvbnMpO1xuICAgICAgICAgICAgcGFnZUZsYXRzID0gWy4uLmFkb3JuZXJzT3B0aW9ucy5icmlja3NdO1xuICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgZmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmxhdHNbMF0ucHVzaCguLi5wYWdlRmxhdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBmbGF0cy5wdXNoKHBhZ2VGbGF0cyk7XG4gICAgICAgICAgICB0aGlzLnBvcFJvd2xpbmVzKGZsYXRzW2ZsYXRzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgIHBvaW50LnlUb3AgPSBjb250cm9sbGVyLmxlZnRUb3BQb2ludC55VG9wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfc3VydmV5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciwgSVBvaW50IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDaGVja0l0ZW1Ccmlja0NvbnRleHQge1xuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb247XG4gICAgcmVhZE9ubHk6IGJvb2xlYW47XG4gICAgY2hlY2tlZDogYm9vbGVhbjtcbiAgICBpdGVtPzogSXRlbVZhbHVlO1xuICAgIGluZGV4PzogbnVtYmVyO1xufVxuZXhwb3J0IGNsYXNzIENoZWNrSXRlbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMC43O1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENIRUNLTUFSS19SRUFET05MWV9TWU1CT0w6IHN0cmluZyA9ICczJztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDSEVDS01BUktfUkVBRE9OTFlfRk9OVDogc3RyaW5nID0gJ3phcGZkaW5nYmF0cyc7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDSEVDS01BUktfUkVBRE9OTFlfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjAgLSBNYXRoLkUgLyAxMC4wO1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25DaGVja2JveE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGZpZWxkTmFtZTogc3RyaW5nLCBwcm90ZWN0ZWQgY29udGV4dDogSUNoZWNrSXRlbUJyaWNrQ29udGV4dCkge1xuICAgICAgICBzdXBlcihjb250ZXh0LnF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+dGhpcy5jb250ZXh0LnF1ZXN0aW9uO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucmVhZE9ubHkgJiYgU3VydmV5SGVscGVyLmdldFJlYWRvbmx5UmVuZGVyQXMoXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpICE9PSAnYWNyb2Zvcm0nIHx8IHRoaXMuY29udHJvbGxlci5jb21wcmVzcztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjaGVja0JveDogYW55ID0gbmV3ICg8YW55PnRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1DaGVja0JveCkoKTtcbiAgICAgICAgY29uc3QgZm9ybVNjYWxlOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZm9ybVNjYWxlKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHt9O1xuICAgICAgICBvcHRpb25zLm1heEZvbnRTaXplID0gdGhpcy5oZWlnaHQgKiBmb3JtU2NhbGUgKiBDaGVja0l0ZW1Ccmljay5GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgIG9wdGlvbnMuY2FwdGlvbiA9IENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9TWU1CT0w7XG4gICAgICAgIG9wdGlvbnMudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIG9wdGlvbnMuZmllbGROYW1lID0gdGhpcy5maWVsZE5hbWU7XG4gICAgICAgIG9wdGlvbnMucmVhZE9ubHkgPSB0aGlzLmNvbnRleHQucmVhZE9ubHk7XG4gICAgICAgIG9wdGlvbnMuY29sb3IgPSB0aGlzLmZvcm1Cb3JkZXJDb2xvcjtcbiAgICAgICAgb3B0aW9ucy52YWx1ZSA9IHRoaXMuY29udGV4dC5jaGVja2VkID8gJ09uJyA6IGZhbHNlO1xuICAgICAgICBvcHRpb25zLkFTID0gdGhpcy5jb250ZXh0LmNoZWNrZWQgPyAnL09uJyA6ICcvT2ZmJztcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuXG4gICAgICAgIG9wdGlvbnMuUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KHRoaXMsIGZvcm1TY2FsZSkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmFkZEZpZWxkKGNoZWNrQm94KTtcbiAgICAgICAgKDxTdXJ2ZXlQREY+dGhpcy5xdWVzdGlvbi5zdXJ2ZXkpPy5nZXRVcGRhdGVkQ2hlY2tJdGVtQWNyb2Zvcm1PcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgICAgIGNoZWNrQm94Lm1heEZvbnRTaXplID0gb3B0aW9ucy5tYXhGb250U2l6ZTtcbiAgICAgICAgY2hlY2tCb3guY2FwdGlvbiA9IG9wdGlvbnMuY2FwdGlvbjtcbiAgICAgICAgY2hlY2tCb3gudGV4dEFsaWduID0gb3B0aW9ucy50ZXh0QWxpZ247XG4gICAgICAgIGNoZWNrQm94LmZpZWxkTmFtZSA9IG9wdGlvbnMuZmllbGROYW1lO1xuICAgICAgICBjaGVja0JveC5yZWFkT25seSA9IG9wdGlvbnMucmVhZE9ubHk7XG4gICAgICAgIGNoZWNrQm94LmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcbiAgICAgICAgY2hlY2tCb3gudmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgICAgICBjaGVja0JveC5BUyA9IG9wdGlvbnMuQVM7XG4gICAgICAgIGNoZWNrQm94LlJlY3QgPSBvcHRpb25zLlJlY3Q7XG5cbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuY2hlY2tlZCkge1xuICAgICAgICAgICAgY29uc3QgY2hlY2ttYXJrUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aGlzLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZEZvbnROYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWUgPSBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfRk9OVDtcbiAgICAgICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqXG4gICAgICAgICAgICAgICAgQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrbWFya1NpemU6IElTaXplID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFxuICAgICAgICAgICAgICAgIENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9TWU1CT0wpO1xuICAgICAgICAgICAgY2hlY2ttYXJrUG9pbnQueExlZnQgKz0gdGhpcy53aWR0aCAvIDIuMCAtIGNoZWNrbWFya1NpemUud2lkdGggLyAyLjA7XG4gICAgICAgICAgICBjaGVja21hcmtQb2ludC55VG9wICs9IHRoaXMuaGVpZ2h0IC8gMi4wIC0gY2hlY2ttYXJrU2l6ZS5oZWlnaHQgLyAyLjA7XG4gICAgICAgICAgICBjb25zdCBjaGVja21hcmtGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgY2hlY2ttYXJrUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MLCBUZXh0QnJpY2spO1xuICAgICAgICAgICAgKDxhbnk+Y2hlY2ttYXJrRmxhdC51bmZvbGQoKVswXSkudGV4dENvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgICAgIGF3YWl0IGNoZWNrbWFya0ZsYXQucmVuZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWUgPSBvbGRGb250TmFtZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tpdGVtLnRzIiwiaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyLCBJUmVjdCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRW1wdHlCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIGlzQm9yZGVyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocmVjdDogSVJlY3QsXG4gICAgICAgIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyID0gbnVsbCxcbiAgICAgICAgaXNCb3JkZXJWaXNpYmxlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIobnVsbCwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMuaXNCb3JkZXJWaXNpYmxlID0gaXNCb3JkZXJWaXNpYmxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzaXplQm9yZGVyKGlzSW5jcmVhc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29lZjogbnVtYmVyID0gaXNJbmNyZWFzZSA/IDEgOiAtMTtcbiAgICAgICAgY29uc3QgYm9yZGVyUGFkZGluZzogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRGb250U2l6ZSgpICogU3VydmV5SGVscGVyLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgIHRoaXMueExlZnQgLT0gY29lZiAqIGJvcmRlclBhZGRpbmc7XG4gICAgICAgIHRoaXMueFJpZ2h0ICs9IGNvZWYgKiBib3JkZXJQYWRkaW5nO1xuICAgICAgICB0aGlzLnlCb3QgKz0gY29lZiAqIGJvcmRlclBhZGRpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pc0JvcmRlclZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplQm9yZGVyKHRydWUpO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZUJvcmRlcihmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2VtcHR5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcblxuZXhwb3J0IGNsYXNzIFRleHRCb2xkQnJpY2sgZXh0ZW5kcyBUZXh0QnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCB0ZXh0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICBhd2FpdCBzdXBlci5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZC50cyIsImV4cG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5leHBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmV4cG9ydCB7IElQb2ludCwgSVJlY3QsIElTaXplLCBJTWFyZ2luTFIsIElNYXJnaW4sIElEb2NPcHRpb25zLCBEb2NPcHRpb25zLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuZXhwb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnknO1xuZXhwb3J0IHsgSUZsYXRRdWVzdGlvbiwgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9xdWVzdGlvbic7XG5leHBvcnQgeyBGbGF0UXVlc3Rpb25EZWZhdWx0IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9kZWZhdWx0JztcbmV4cG9ydCB7IEZsYXRCb29sZWFuQ2hlY2tib3ggYXMgRmxhdEJvb2xlYW4gfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2Jvb2xlYW4nO1xuZXhwb3J0IHsgRmxhdENoZWNrYm94IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9jaGVja2JveCc7XG5leHBvcnQgeyBGbGF0Q3VzdG9tTW9kZWwgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbCc7XG5leHBvcnQgeyBGbGF0Q29tbWVudCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfY29tbWVudCc7XG5leHBvcnQgeyBGbGF0RHJvcGRvd24gfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2Ryb3Bkb3duJztcbmV4cG9ydCB7IEZsYXRFeHByZXNzaW9uIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uJztcbmV4cG9ydCB7IEZsYXRGaWxlIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9maWxlJztcbmV4cG9ydCB7IEZsYXRIVE1MIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9odG1sJztcbmV4cG9ydCB7IEZsYXRJbWFnZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2UnO1xuZXhwb3J0IHsgRmxhdEltYWdlUGlja2VyIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9pbWFnZXBpY2tlcic7XG5leHBvcnQgeyBGbGF0UGFuZWxEeW5hbWljIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9wYW5lbGR5bmFtaWMnO1xuZXhwb3J0IHsgRmxhdFJhZGlvZ3JvdXAgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JhZGlvZ3JvdXAnO1xuZXhwb3J0IHsgRmxhdFJhbmtpbmcgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcnO1xuZXhwb3J0IHsgRmxhdFJhdGluZyB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nJztcbmV4cG9ydCB7IEZsYXRTZWxlY3RCYXNlIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9zZWxlY3RiYXNlJztcbmV4cG9ydCB7IEZsYXRTaWduYXR1cmVQYWQgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZCc7XG5leHBvcnQgeyBGbGF0VGV4dGJveCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfdGV4dGJveCc7XG5leHBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9zdXJ2ZXknO1xuZXhwb3J0IHsgRmxhdE1hdHJpeCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4JztcbmV4cG9ydCB7IEZsYXRNYXRyaXhNdWx0aXBsZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4bXVsdGlwbGUnO1xuZXhwb3J0IHsgRmxhdE1hdHJpeER5bmFtaWMgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X21hdHJpeGR5bmFtaWMnO1xuZXhwb3J0IHsgRmxhdE11bHRpcGxlVGV4dCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfbXVsdGlwbGV0ZXh0JztcbmV4cG9ydCB7IFBhZ2VQYWNrZXIgfSBmcm9tICcuLi9wYWdlX2xheW91dC9wYWdlX3BhY2tlcic7XG5leHBvcnQgeyBFdmVudEhhbmRsZXIgfSBmcm9tICcuLi9ldmVudF9oYW5kbGVyL2V2ZW50X2hhbmRsZXInO1xuZXhwb3J0IHsgSG9yaXpvbnRhbEFsaWduLCBWZXJ0aWNhbEFsaWduLCBJRHJhd1JlY3RPcHRpb25zLCBJRHJhd1RleHRPcHRpb25zLCBJRHJhd0ltYWdlT3B0aW9ucywgRHJhd0NhbnZhcyB9IGZyb20gJy4uL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMnO1xuZXhwb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmV4cG9ydCB7IEJvb2xlYW5JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbSc7XG5leHBvcnQgeyBDaGVja2JveEl0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbSc7XG5leHBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbSc7XG5leHBvcnQgeyBDb21tZW50QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21tZW50JztcbmV4cG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmV4cG9ydCB7IEN1c3RvbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY3VzdG9tJztcbmV4cG9ydCB7IERyb3Bkb3duQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9kcm9wZG93bic7XG5leHBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZW1wdHknO1xuZXhwb3J0IHsgSFRNTEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfaHRtbCc7XG5leHBvcnQgeyBJbWFnZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfaW1hZ2UnO1xuZXhwb3J0IHsgTGlua0JyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfbGluayc7XG5leHBvcnQgeyBSYWRpb0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3JhZGlvaXRlbSc7XG5leHBvcnQgeyBSYW5raW5nSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcmFua2luZ2l0ZW0nO1xuZXhwb3J0IHsgUm93bGluZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcm93bGluZSc7XG5leHBvcnQgeyBUZXh0RmllbGRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRmaWVsZCc7XG5leHBvcnQgeyBUZXh0Qm9sZEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQnO1xuZXhwb3J0IHsgVGV4dEJveEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGJveCc7XG5leHBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmV4cG9ydCB7IFRpdGxlUGFuZWxCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwnO1xuXG5pbXBvcnQgeyBjaGVja0xpYnJhcnlWZXJzaW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuY2hlY2tMaWJyYXJ5VmVyc2lvbihgJHtwcm9jZXNzLmVudi5WRVJTSU9OfWAsICdzdXJ2ZXktcGRmJyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMvcGRmLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZsYXRTZWxlY3RCYXNlIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ2hlY2tib3hCYXNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ2hlY2tib3hCYXNlPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2VuZXJhdGVGbGF0SXRlbShyZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogSVBkZkJyaWNrO1xuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChpdGVtUmVjdCwgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLFxuICAgICAgICAgICAgcG9pbnQueExlZnQpLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBpZiAoaXRlbS5sb2NUZXh0LnJlbmRlcmVkSHRtbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubG9jVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0gPT09IHRoaXMucXVlc3Rpb24ub3RoZXJJdGVtICYmIChpdGVtLnZhbHVlID09PSB0aGlzLnF1ZXN0aW9uLnZhbHVlIHx8XG4gICAgICAgICAgICAodHlwZW9mIHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCkpKSB7XG4gICAgICAgICAgICBjb25zdCBvdGhlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICBvdGhlclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KFxuICAgICAgICAgICAgICAgIG90aGVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgZmFsc2UsIHsgaW5kZXgsIHJvd3M6IFN1cnZleUhlbHBlci5PVEhFUl9ST1dTX0NPVU5UIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldFZpc2libGVDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcztcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldENvbENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmNvbENvdW50O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29sQ291bnQgPSB0aGlzLmdldENvbENvdW50KCk7XG4gICAgICAgIGNvbnN0IHZpc2libGVDaG9pY2VzID0gdGhpcy5nZXRWaXNpYmxlQ2hvaWNlcygpO1xuICAgICAgICBsZXQgY3VycmVudENvbENvdW50OiBudW1iZXIgPSBjb2xDb3VudDtcbiAgICAgICAgaWYgKGNvbENvdW50ID09IDApIHtcbiAgICAgICAgICAgIGN1cnJlbnRDb2xDb3VudCA9IE1hdGguZmxvb3IoU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpXG4gICAgICAgICAgICAgICAgLyB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoKSB8fCAxO1xuICAgICAgICAgICAgaWYgKHZpc2libGVDaG9pY2VzLmxlbmd0aCA8IGN1cnJlbnRDb2xDb3VudCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDb2xDb3VudCA9IHZpc2libGVDaG9pY2VzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2xDb3VudCA+IDEpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDb2xDb3VudCA9IChTdXJ2ZXlIZWxwZXIuZ2V0Q29sdW1uV2lkdGgodGhpcy5jb250cm9sbGVyLCBjb2xDb3VudCkgPFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGgpID8gMSA6IGNvbENvdW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoY3VycmVudENvbENvdW50ID09IDEpID8gYXdhaXQgdGhpcy5nZW5lcmF0ZVZlcnRpY2FsbHlJdGVtcyhwb2ludCwgdmlzaWJsZUNob2ljZXMpIDpcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludCwgY3VycmVudENvbENvdW50KTtcblxuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVWZXJ0aWNhbGx5SXRlbXMocG9pbnQ6IElQb2ludCwgaXRlbVZhbHVlczogSXRlbVZhbHVlW10pOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBpdGVtVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUoY3VyclBvaW50LCBpdGVtVmFsdWVzW2ldLCBpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gaXRlbUZsYXQueUJvdCArIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKGl0ZW1GbGF0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUhvcmlzb250YWxseUl0ZW1zKHBvaW50OiBJUG9pbnQsIGNvbENvdW50OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHZpc2libGVDaG9pY2VzID0gdGhpcy5nZXRWaXNpYmxlQ2hvaWNlcygpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBsZXQgcm93OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdmlzaWJsZUNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0LCB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCk7XG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIGNvbENvdW50LCBpICUgY29sQ291bnQpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdENvbXBvc2l0ZShcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIHZpc2libGVDaG9pY2VzW2ldLCBpKTtcbiAgICAgICAgICAgIHJvdy5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgaWYgKGkgJSBjb2xDb3VudCA9PT0gY29sQ291bnQgLSAxIHx8IGkgPT09IHZpc2libGVDaG9pY2VzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dMaW5lRmxhdDogSVBkZkJyaWNrID0gU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQocm93KSwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0xpbmVGbGF0LnlCb3QgK1xuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2gocm93LCByb3dMaW5lRmxhdCk7XG4gICAgICAgICAgICAgICAgcm93ID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3NlbGVjdGJhc2UudHMiLCJpbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgVHJhbnNsYXRlWEZ1bmN0aW9uIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgUm93bGluZUJyaWNrIGltcGxlbWVudHMgSVBkZkJyaWNrIHtcbiAgICB4TGVmdDogbnVtYmVyO1xuICAgIHhSaWdodDogbnVtYmVyO1xuICAgIHlUb3A6IG51bWJlcjtcbiAgICB5Qm90OiBudW1iZXI7XG4gICAgcHVibGljIGlzUGFnZUJyZWFrOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGNvbG9yOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy54TGVmdCA9IHJlY3QueExlZnQ7XG4gICAgICAgIHRoaXMueFJpZ2h0ID0gcmVjdC54UmlnaHQ7XG4gICAgICAgIHRoaXMueVRvcCA9IHJlY3QueVRvcDtcbiAgICAgICAgdGhpcy55Qm90ID0gcmVjdC55Qm90O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnhSaWdodCAtIHRoaXMueExlZnQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnlCb3QgLSB0aGlzLnlUb3A7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmNvbG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgb2xkRHJhd0NvbG9yOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLmdldERyYXdDb2xvcigpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IodGhpcy5jb2xvcik7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmxpbmUodGhpcy54TGVmdCwgdGhpcy55VG9wLCB0aGlzLnhSaWdodCwgdGhpcy55VG9wKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKG9sZERyYXdDb2xvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIHJldHVybiBbdGhpc107XG4gICAgfVxuICAgIHRyYW5zbGF0ZVgoXzogVHJhbnNsYXRlWEZ1bmN0aW9uKTogdm9pZCB7fVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9yb3dsaW5lLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblRleHRNb2RlbCwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRGaWVsZEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dGZpZWxkJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgVGV4dEJveEJyaWNrIGV4dGVuZHMgVGV4dEZpZWxkQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGlzUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBwcm90ZWN0ZWQgaXNNdWx0aWxpbmU6IGJvb2xlYW4gPSBmYWxzZSwgaW5kZXg6IG51bWJlciA9IDApIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGlzUXVlc3Rpb24sXG4gICAgICAgICAgICAoPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uKS5pZCArIChpc1F1ZXN0aW9uID8gJycgOiAnX2NvbW1lbnQnICsgaW5kZXgpLFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFF1ZXN0aW9uT3JDb21tZW50VmFsdWUoPFF1ZXN0aW9uPnF1ZXN0aW9uLCBpc1F1ZXN0aW9uKSxcbiAgICAgICAgICAgIGlzUXVlc3Rpb24gJiYgKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikubG9jUGxhY2VIb2xkZXIgPyBTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKCg8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb24pLmxvY1BsYWNlSG9sZGVyKSA6ICcnLFxuICAgICAgICAgICAgcXVlc3Rpb24uaXNSZWFkT25seSwgaXNNdWx0aWxpbmUsXG4gICAgICAgICAgICAoPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uKS5pbnB1dFR5cGUpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJveC50cyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xOF9fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcImpzcGRmXCIsXCJjb21tb25qczJcIjpcImpzcGRmXCIsXCJjb21tb25qc1wiOlwianNwZGZcIixcImFtZFwiOlwianNwZGZcIn1cbi8vIG1vZHVsZSBpZCA9IDE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCB7IElSZWN0LCBJTWFyZ2luLCBJU2l6ZSwgRG9jT3B0aW9ucywgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuLyoqXG4gKiBIb3Jpem9udGFsIGFsaWdubWVudCB0eXBlcyBpbiBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBlbnVtIEhvcml6b250YWxBbGlnbiB7XG4gICAgTm90U2V0ID0gJ25vdHNldCcsXG4gICAgTGVmdCA9ICdsZWZ0JyxcbiAgICBDZW50ZXIgPSAnY2VudGVyJyxcbiAgICBSaWdodCA9ICdyaWdodCdcbn1cbi8qKlxuICogVmVydGljYWwgYWxpZ25tZW50IHR5cGVzIGluIG9uUmVuZGVySGVhZGVyIGFuZCBvblJlbmRlckZvb3RlciBldmVudHNcbiAqL1xuZXhwb3J0IGVudW0gVmVydGljYWxBbGlnbiB7XG4gICAgTm90U2V0ID0gJ25vdHNldCcsXG4gICAgVG9wID0gJ3RvcCcsXG4gICAgTWlkZGxlID0gJ21pZGRsZScsXG4gICAgQm90dG9tID0gJ2JvdHRvbSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRHJhd1JlY3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBIb3Jpem9udGFsIGFsaWdubWVudCB3aXRoaW4gdGhlIHJlY3RhbmdsZSB0aGF0IGxpbWl0cyB0aGUgZHJhd2luZyBhcmVhLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJjZW50ZXJcImAgKGRlZmF1bHQpXG4gICAgICogLSBgXCJsZWZ0XCJgXG4gICAgICogLSBgXCJyaWdodFwiYFxuICAgICAqL1xuICAgIGhvcml6b250YWxBbGlnbj86IEhvcml6b250YWxBbGlnbjtcbiAgICAvKipcbiAgICAgKiBWZXJ0aWNhbCBhbGlnbm1lbnQgd2l0aGluIHRoZSByZWN0YW5nbGUgdGhhdCBsaW1pdHMgdGhlIGRyYXdpbmcgYXJlYS5cbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKlxuICAgICAqIC0gYFwibWlkZGxlXCJgIChkZWZhdWx0KVxuICAgICAqIC0gYFwidG9wXCJgXG4gICAgICogLSBgXCJib3R0b21cImBcbiAgICAgKi9cbiAgICB2ZXJ0aWNhbEFsaWduPzogVmVydGljYWxBbGlnbjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY29udGVudCBhbmQgdGhlIGJvcmRlcnMgb2YgdGhlIHJlY3RhbmdsZS4gVGhpcyBwcm9wZXJ0eSBhcHBsaWVzIG9ubHkgaWYgdGhlIGNvbnRlbnQgaXMgYWxpZ25lZCB0byB0aGUgbGVmdC9yaWdodCBvciB0b3AvYm90dG9tLlxuICAgICAqL1xuICAgIG1hcmdpbnM/OiBJTWFyZ2luO1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGNvb3JkaW5hdGVzIG9mIHRoZSByZWN0YW5nbGUuXG4gICAgICovXG4gICAgcmVjdD86IElSZWN0O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjb25maWd1cmVzIHJlbmRlcmluZyBhIHBpZWNlIG9mIHRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdUZXh0T3B0aW9ucyBleHRlbmRzIElEcmF3UmVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgdGV4dCBzdHJpbmcgdG8gYmUgZHJhd24uXG4gICAgICovXG4gICAgdGV4dDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEZvbnQgc2l6ZSBpbiBwb2ludHMuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiAxNFxuICAgICAqL1xuICAgIGZvbnRTaXplPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEVuYWJsZSB0aGlzIHByb3BlcnR5IHRvIHJlbmRlciB0aGUgdGV4dCBzdHJpbmcgYm9sZC5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKi9cbiAgICBpc0JvbGQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjb25maWd1cmVzIHJlbmRlcmluZyBhbiBpbWFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRHJhd0ltYWdlT3B0aW9ucyBleHRlbmRzIElEcmF3UmVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGltYWdlIHdpZHRoIGluIHBpeGVscy4gRGVmYXVsdHMgdG8gdGhlIFtyZWN0YW5nbGUgd2lkdGhdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaWRyYXdpbWFnZW9wdGlvbnMjcmVjdCkuXG4gICAgICovXG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQW4gaW1hZ2UgaGVpZ2h0IGluIHBpeGVscy4gRGVmYXVsdHMgdG8gdGhlIFtyZWN0YW5nbGUgaGVpZ2h0XShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkcmF3aW1hZ2VvcHRpb25zI3JlY3QpLlxuICAgICAqL1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB2YWx1ZSB3aXRoIGEgYmFzZTY0LWVuY29kZWQgaW1hZ2UgdG8gYmUgZHJhd24uXG4gICAgICovXG4gICAgYmFzZTY0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGhvdyB0byByZXNpemUgdGhlIGltYWdlIHRvIGZpdCBpdCBpbnRvIGl0cyBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiBgXCJjb250YWluXCJgIGlmIFtgYXBwbHlJbWFnZUZpdGBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaWRvY29wdGlvbnMjYXBwbHlJbWFnZUZpdCkgaXMgZW5hYmxlZCBvciBgdW5kZWZpbmVkYCBpZiBub3QuXG4gICAgICpcbiAgICAgKiBSZWZlciB0byB0aGUgW2BvYmplY3QtZml0YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL29iamVjdC1maXQpIENTUyBwcm9wZXJ0eSBkZXNjcmlwdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gYWNjZXB0ZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGltYWdlRml0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyBhIGRyYXdpbmcgYXJlYSBhbmQgZW5hYmxlcyB5b3UgdG8gZHJhdyBhbiBpbWFnZSBvciBhIHBpZWNlIG9mIHRleHQgd2l0aGluIHRoZSBhcmVhLiBZb3UgY2FuIGFjY2VzcyB0aGlzIG9iamVjdCB3aXRoaW4gZnVuY3Rpb25zIHRoYXQgaGFuZGxlIGBTdXJ2ZXlQREZgJ3MgW2BvblJlbmRlckhlYWRlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVySGVhZGVyKSBhbmQgW2BvblJlbmRlckZvb3RlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVyRm9vdGVyKSBldmVudHMuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2N1c3RvbWl6ZS1oZWFkZXItYW5kLWZvb3Rlci1vZi1wZGYtZm9ybS8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBEcmF3Q2FudmFzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHBhY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcHVibGljIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHByb3RlY3RlZCBfcmVjdDogSVJlY3QsXG4gICAgICAgIHByb3RlY3RlZCBfY291bnRQYWdlczogbnVtYmVyLFxuICAgICAgICBwcm90ZWN0ZWQgX3BhZ2VOdW1iZXI6IG51bWJlcikgeyB9XG4gICAgLyoqXG4gICAgICogQSB0b3RhbCBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudFBhZ2VzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGNvdW50UGFnZXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdW50UGFnZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGhlIHBhZ2UgdGhhdCBjb250YWlucyB0aGUgZHJhd2luZyBhcmVhLiBFbnVtZXJhdGlvbiBzdGFydHMgd2l0aCAxLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFnZU51bWJlcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnZU51bWJlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgb2YgYSByZWN0YW5nbGUgdGhhdCBsaW1pdHMgdGhlIGRyYXdpbmcgYXJlYS4gVGhpcyBvYmplY3QgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczogYHhMZWZ0YCwgYHhSaWdodGAsIGB5VG9wYCwgYHlCb3RgLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVjdCgpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWN0O1xuICAgIH1cbiAgICBwcml2YXRlIGFsaWduUmVjdChyZWN0T3B0aW9uczogSURyYXdSZWN0T3B0aW9ucywgaXRlbVNpemU6IElTaXplKTogSVJlY3Qge1xuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLm1hcmdpbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zID0geyBsZWZ0OiAwLjAsIHJpZ2h0OiAwLjAsIHRvcDogMC4wLCBib3Q6IDAuMCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLmxlZnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0ID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQgPSAwLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLnJlY3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLmhvcml6b250YWxBbGlnbiA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gPT09IEhvcml6b250YWxBbGlnbi5Ob3RTZXQpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gPSBIb3Jpem9udGFsQWxpZ24uQ2VudGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy52ZXJ0aWNhbEFsaWduID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24gPT09IFZlcnRpY2FsQWxpZ24uTm90U2V0KSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiA9IFZlcnRpY2FsQWxpZ24uTWlkZGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNsb25lKHRoaXMucmVjdCk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc3dpdGNoIChyZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbi5MZWZ0OlxuICAgICAgICAgICAgICAgICAgICByZWN0LnhMZWZ0ID0gdGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICByZWN0LnhSaWdodCA9IE1hdGgubWluKHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0ICsgaXRlbVNpemUud2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbi5DZW50ZXI6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueExlZnQgPSBNYXRoLm1heCh0aGlzLnJlY3QueExlZnQgKyByZWN0T3B0aW9ucy5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnhMZWZ0ICsgdGhpcy5yZWN0LnhSaWdodCAtIGl0ZW1TaXplLndpZHRoKSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gTWF0aC5taW4odGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnhMZWZ0ICsgdGhpcy5yZWN0LnhSaWdodCArIGl0ZW1TaXplLndpZHRoKSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgSG9yaXpvbnRhbEFsaWduLlJpZ2h0OlxuICAgICAgICAgICAgICAgICAgICByZWN0LnhMZWZ0ID0gTWF0aC5tYXgodGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQgLSBpdGVtU2l6ZS53aWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gdGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVjdC54TGVmdCA9IHJlY3RPcHRpb25zLnJlY3QueExlZnQgfHwgdGhpcy5yZWN0LnhMZWZ0O1xuICAgICAgICAgICAgcmVjdC54UmlnaHQgPSByZWN0T3B0aW9ucy5yZWN0LnhSaWdodCB8fCB0aGlzLnJlY3QueFJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocmVjdE9wdGlvbnMudmVydGljYWxBbGlnbikge1xuICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbi5Ub3A6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueVRvcCA9IHRoaXMucmVjdC55VG9wICsgcmVjdE9wdGlvbnMubWFyZ2lucy50b3A7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IE1hdGgubWluKHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wICsgaXRlbVNpemUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduLk1pZGRsZTpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC55VG9wID0gTWF0aC5tYXgodGhpcy5yZWN0LnlUb3AgKyByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnJlY3QueVRvcCArIHRoaXMucmVjdC55Qm90IC0gaXRlbVNpemUuaGVpZ2h0KSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IE1hdGgubWluKHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnlUb3AgKyB0aGlzLnJlY3QueUJvdCArIGl0ZW1TaXplLmhlaWdodCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ24uQm90dG9tOlxuICAgICAgICAgICAgICAgICAgICByZWN0LnlUb3AgPSBNYXRoLm1heCh0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnlCb3QgLSByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCAtIGl0ZW1TaXplLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3Q7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVjdC55VG9wID0gcmVjdE9wdGlvbnMucmVjdC55VG9wIHx8IHRoaXMucmVjdC55VG9wO1xuICAgICAgICAgICAgcmVjdC55Qm90ID0gcmVjdE9wdGlvbnMucmVjdC55Qm90IHx8IHRoaXMucmVjdC55Qm90O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEcmF3cyBhIHBpZWNlIG9mIHRleHQgd2l0aGluIHRoZSBkcmF3aW5nIGFyZWEuXG4gICAgICogQHBhcmFtIHRleHRPcHRpb25zIEFuIFtgSURyYXdUZXh0T3B0aW9uc2BdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaWRyYXd0ZXh0b3B0aW9ucykgb2JqZWN0IHRoYXQgY29uZmlndXJlcyB0aGUgZHJhd2luZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZHJhd1RleHQodGV4dE9wdGlvbnM6IElEcmF3VGV4dE9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGV4dE9wdGlvbnMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUodGV4dE9wdGlvbnMpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRPcHRpb25zLmZvbnRTaXplID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGV4dE9wdGlvbnMuZm9udFNpemUgPSBEb2NPcHRpb25zLkZPTlRfU0laRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRleHRPcHRpb25zLmlzQm9sZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRleHRPcHRpb25zLmlzQm9sZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleHRTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0ZXh0T3B0aW9ucy50ZXh0LFxuICAgICAgICAgICAgdGV4dE9wdGlvbnMuaXNCb2xkID8gJ2JvbGQnIDogJ25vcm1hbCcsIHRleHRPcHRpb25zLmZvbnRTaXplKTtcbiAgICAgICAgY29uc3QgdGV4dFJlY3Q6IElSZWN0ID0gdGhpcy5hbGlnblJlY3QodGV4dE9wdGlvbnMsIHRleHRTaXplKTtcbiAgICAgICAgaWYgKCF0ZXh0T3B0aW9ucy5pc0JvbGQpIHtcbiAgICAgICAgICAgIHRoaXMucGFja3MucHVzaChuZXcgVGV4dEJyaWNrKG51bGwsIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0ZXh0UmVjdCwgdGV4dE9wdGlvbnMudGV4dCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYWNrcy5wdXNoKG5ldyBUZXh0Qm9sZEJyaWNrKG51bGwsIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0ZXh0UmVjdCwgdGV4dE9wdGlvbnMudGV4dCkpO1xuICAgICAgICB9XG4gICAgICAgICg8UGRmQnJpY2s+dGhpcy5wYWNrc1t0aGlzLnBhY2tzLmxlbmd0aCAtIDFdKS5mb250U2l6ZSA9IHRleHRPcHRpb25zLmZvbnRTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEcmF3cyBhbiBpbWFnZSB3aXRoaW4gdGhlIGRyYXdpbmcgYXJlYS5cbiAgICAgKiBAcGFyYW0gaW1hZ2VPcHRpb25zIEFuIFtgSURyYXdJbWFnZU9wdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkcmF3aW1hZ2VvcHRpb25zKSBvYmplY3QgdGhhdCBjb25maWd1cmVzIGRyYXdpbmcuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGRyYXdJbWFnZShpbWFnZU9wdGlvbnM6IElEcmF3SW1hZ2VPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGltYWdlT3B0aW9ucyA9IFN1cnZleUhlbHBlci5jbG9uZShpbWFnZU9wdGlvbnMpO1xuICAgICAgICBpZiAodHlwZW9mIGltYWdlT3B0aW9ucy53aWR0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltYWdlT3B0aW9ucy53aWR0aCA9IHRoaXMucmVjdC54UmlnaHQgLSB0aGlzLnJlY3QueExlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpbWFnZU9wdGlvbnMuaGVpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW1hZ2VPcHRpb25zLmhlaWdodCA9IHRoaXMucmVjdC55Qm90IC0gdGhpcy5yZWN0LnlUb3A7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW1hZ2VTaXplOiBJU2l6ZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBpbWFnZU9wdGlvbnMud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGltYWdlT3B0aW9ucy5oZWlnaHRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaW1hZ2VSZWN0OiBJUmVjdCA9IHRoaXMuYWxpZ25SZWN0KGltYWdlT3B0aW9ucywgaW1hZ2VTaXplKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKDAsIDApO1xuICAgICAgICB0aGlzLnBhY2tzLnB1c2goYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChpbWFnZVJlY3QsIHRydWUsIHRydWUpLFxuICAgICAgICAgICAgbnVsbCwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6IGltYWdlT3B0aW9ucy5iYXNlNjQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGltYWdlUmVjdC54UmlnaHQgLSBpbWFnZVJlY3QueExlZnQsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBpbWFnZVJlY3QueUJvdCAtIGltYWdlUmVjdC55VG9wLCBvYmplY3RGaXQ6IGltYWdlT3B0aW9ucy5pbWFnZUZpdCB9LCAhIWltYWdlT3B0aW9ucy5pbWFnZUZpdCB8fCB0aGlzLmNvbnRyb2xsZXIuYXBwbHlJbWFnZUZpdCkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXZlbnRfaGFuZGxlci9kcmF3X2NhbnZhcy50cyIsImltcG9ydCB7IEV2ZW50LCBFdmVudEJhc2UgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IERyYXdDYW52YXMgfSBmcm9tICcuL2RyYXdfY2FudmFzJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRXZlbnRBc3luYzxTZW5kZXIsIE9wdGlvbnM+IGV4dGVuZHMgRXZlbnRCYXNlPFNlbmRlciwgT3B0aW9ucz4ge1xuICAgIHB1YmxpYyB1bnNoaWZ0KGZ1bmM6IChzZW5kZXI6IFNlbmRlciwgb3B0aW9uczogT3B0aW9ucykgPT4gYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0Z1bmMoZnVuYykpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IEFycmF5PChzZW5kZXI6IFNlbmRlciwgb3B0aW9uczogT3B0aW9ucykgPT4gYW55PigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLnVuc2hpZnQoZnVuYyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaXJlKHNlbmRlcjogU2VuZGVyLCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FsbGJhY2tzW2ldKHNlbmRlciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRXZlbnRIYW5kbGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIHByb2Nlc3NfaGVhZGVyX2V2ZW50cyhzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcGFja3M6IElQZGZCcmlja1tdW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFzdXJ2ZXkuaGF2ZUNvbW1lcmNpYWxMaWNlbnNlKSB7XG4gICAgICAgICAgICBzdXJ2ZXkub25SZW5kZXJIZWFkZXIuYWRkKChfLCBjYW52YXMpID0+IHtcbiAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnU3VydmV5SlMgUERGIHwgUGxlYXNlIHB1cmNoYXNlIGEgU3VydmV5SlMgUERGIGRldmVsb3BlciBsaWNlbnNlIHRvIHVzZSBpdCBpbiB5b3VyIGFwcCB8IGh0dHBzOi8vc3VydmV5anMuaW8vQnV5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IDEwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlckhlYWRlci5maXJlKHN1cnZleSwgbmV3IERyYXdDYW52YXMocGFja3NbaV0sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZUhlYWRlclJlY3QoY29udHJvbGxlciksIHBhY2tzLmxlbmd0aCwgaSArIDEpKTtcbiAgICAgICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlckZvb3Rlci5maXJlKHN1cnZleSwgbmV3IERyYXdDYW52YXMocGFja3NbaV0sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZUZvb3RlclJlY3QoY29udHJvbGxlciksIHBhY2tzLmxlbmd0aCwgaSArIDEpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXZlbnRfaGFuZGxlci9ldmVudF9oYW5kbGVyLnRzIiwiaW1wb3J0IHsgSVBvaW50IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UXVlc3Rpb25EZWZhdWx0IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgdmFsdWVCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBgJHt0aGlzLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZX1gLCBUZXh0QnJpY2spO1xuICAgICAgICByZXR1cm4gW3ZhbHVlQnJpY2tdO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kZWZhdWx0LnRzIiwiaW1wb3J0IHtcbiAgICBJUXVlc3Rpb24sIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlLFxuICAgIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdywgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCwgU2VyaWFsaXplciwgUGFuZWxNb2RlbCwgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwsXG4gICAgTG9jYWxpemFibGVTdHJpbmdcbn0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJRmxhdFF1ZXN0aW9uLCBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFNlbGVjdEJhc2UgfSBmcm9tICcuL2ZsYXRfc2VsZWN0YmFzZSc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4TXVsdGlwbGUgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgR0FQX0JFVFdFRU5fUk9XUzogbnVtYmVyID0gMC41O1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLCBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwcm90ZWN0ZWQgaXNNdWx0aXBsZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZT5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSB2aXNpYmxlUm93c1ZhbHVlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3dbXTtcbiAgICBwcml2YXRlIGdldCB2aXNpYmxlUm93cygpIHtcbiAgICAgICAgaWYoIXRoaXMudmlzaWJsZVJvd3NWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlUm93c1ZhbHVlID0gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLnJvd3MuZmlsdGVyKHJvdyA9PiByb3cudmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZVJvd3NWYWx1ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzQ2VsbFRpdGxlKHBvaW50OiBJUG9pbnQsIGxvY1RpdGxlOiBMb2NhbGl6YWJsZVN0cmluZyk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBsb2NUaXRsZSwgVGV4dEJyaWNrKSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c0NlbGwocG9pbnQ6IElQb2ludCwgY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCxcbiAgICAgICAgbG9jYXRpb24/OiAnaGVhZGVyJyB8ICdmb290ZXInLCBpc1dpZGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGlmIChjZWxsLmhhc1F1ZXN0aW9uKSB7XG4gICAgICAgICAgICBpZihsb2NhdGlvbiA9PSAnZm9vdGVyJyAmJiAhY2VsbC5xdWVzdGlvbi5pc0Fuc3dlcmVkKSB7fVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNXaWRlICYmIGNlbGwuaXNDaG9pY2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmbGF0TXVsdGlwbGVDb2x1bW5zUXVlc3Rpb246IElGbGF0UXVlc3Rpb24gPSBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIGNlbGwucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgY2VsbC5xdWVzdGlvbi5nZXRUeXBlKCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5tb3ZlUmVjdChTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLCBwb2ludC54TGVmdCk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKCg8RmxhdFNlbGVjdEJhc2U+ZmxhdE11bHRpcGxlQ29sdW1uc1F1ZXN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAuZ2VuZXJhdGVGbGF0SXRlbShpdGVtUmVjdCwgY2VsbC5pdGVtLCBjZWxsLmNob2ljZUluZGV4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjZWxsLnF1ZXN0aW9uLnRpdGxlTG9jYXRpb24gPSBTdXJ2ZXlIZWxwZXIuVElUTEVfTE9DQVRJT05fTUFUUklYO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayguLi5hd2FpdCBTdXJ2ZXlIZWxwZXIuZ2VuZXJhdGVRdWVzdGlvbkZsYXRzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgdGhpcy5jb250cm9sbGVyLCBjZWxsLnF1ZXN0aW9uLCBwb2ludCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNlbGwuaGFzVGl0bGUpIHtcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQm9sZFRleHRGbGF0KHBvaW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGNlbGwubG9jVGl0bGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQocG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgY2VsbC5sb2NUaXRsZSwgVGV4dEJyaWNrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXQgaGFzRGV0YWlsUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2libGVSb3dzLnNvbWUoKHJlbmRlcmVkUm93KSA9PiByZW5kZXJlZFJvdy5yb3cgJiYgdGhpcy5xdWVzdGlvbi5oYXNEZXRhaWxQYW5lbChyZW5kZXJlZFJvdy5yb3cpKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBpZ25vcmVDZWxsKGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsIGluZGV4OiBudW1iZXIsIGxvY2F0aW9uPzogJ2hlYWRlcicgfCAnZm9vdGVyJywgaXNXaWRlOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZighaXNXaWRlICYmIGxvY2F0aW9uID09ICdmb290ZXInICYmIGNlbGwuaGFzUXVlc3Rpb24gJiYgIWNlbGwucXVlc3Rpb24uaXNBbnN3ZXJlZCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiAhKGNlbGwuaGFzUXVlc3Rpb24gfHwgY2VsbC5oYXNUaXRsZSB8fCAodGhpcy5pc011bHRpcGxlICYmICh0aGlzLmhhc0RldGFpbFBhbmVsID8gaW5kZXggPT0gMSA6IGluZGV4ID09IDApKSk7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0Um93TG9jYXRpb24ocm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cpIHtcbiAgICAgICAgcmV0dXJuIHJvdyA9PT0gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLmhlYWRlclJvdyA/ICdoZWFkZXInIDogKHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5mb290ZXJSb3cgPT09IHJvdyA/ICdmb290ZXInIDogdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzUm93SG9yaXNvbnRhbChwb2ludDogSVBvaW50LCByb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdywgY29sdW1uV2lkdGg6IG51bWJlcltdKTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgbGV0IGxhc3RSaWdodE1hcmdpbjogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIGxldCBjbnQgPSAwO1xuICAgICAgICBjb25zdCByb3dMb2NhdGlvbiA9IHRoaXMuZ2V0Um93TG9jYXRpb24ocm93KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3cuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlnbm9yZUNlbGwocm93LmNlbGxzW2ldLCBpLCByb3dMb2NhdGlvbikpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gbGFzdFJpZ2h0TWFyZ2luICtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29sdW1uV2lkdGhbY250XTtcbiAgICAgICAgICAgIGxhc3RSaWdodE1hcmdpbiA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxDb250ZW50OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NlbGwoXG4gICAgICAgICAgICAgICAgY3VyclBvaW50LCByb3cuY2VsbHNbaV0sIHJvd0xvY2F0aW9uKTtcbiAgICAgICAgICAgIGlmICghY2VsbENvbnRlbnQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhjZWxsQ29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbnQrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNSb3dWZXJ0aWNhbChwb2ludDogSVBvaW50LCByb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IHJvd0xvY2F0aW9uID0gdGhpcy5nZXRSb3dMb2NhdGlvbihyb3cpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pZ25vcmVDZWxsKHJvdy5jZWxsc1tpXSwgaSwgcm93TG9jYXRpb24sIGZhbHNlKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLnNob3dIZWFkZXIgJiYgKCF0aGlzLmlzTXVsdGlwbGUgfHwgaSA+IDApICYmIHJvdy5jZWxsc1tpXS5jZWxsPy5jb2x1bW4/LmxvY1RpdGxlKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NlbGxUaXRsZShjdXJyUG9pbnQsIHJvdy5jZWxsc1tpXS5jZWxsLmNvbHVtbi5sb2NUaXRsZSkpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gY29tcG9zaXRlLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NlbGwoY3VyclBvaW50LCByb3cuY2VsbHNbaV0sIHJvd0xvY2F0aW9uLCBmYWxzZSkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBjb21wb3NpdGUueUJvdCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRBdmFsYWJsZVdpZHRoKGNvbENvdW50OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpIC1cbiAgICAgICAgKGNvbENvdW50IC0gMSkgKiB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgfVxuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29sdW1uV2lkdGgocm93czogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93W10sIGNvbENvdW50OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoOiBudW1iZXIgPSB0aGlzLmdldEF2YWxhYmxlV2lkdGgoY29sQ291bnQpO1xuICAgICAgICBsZXQgcmVtYWluV2lkdGg6IG51bWJlciA9IGF2YWlsYWJsZVdpZHRoO1xuICAgICAgICBsZXQgcmVtYWluQ29sQ291bnQ6IG51bWJlciA9IGNvbENvdW50O1xuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aDogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgY29uc3QgdW5zZXRDZWxsczogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbFtdID0gW107XG4gICAgICAgIGxldCBjZWxscyA9IHJvd3NbMF0uY2VsbHMuZmlsdGVyKChjZWxsOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsLCBpbmRleDogbnVtYmVyKSA9PiAhdGhpcy5pZ25vcmVDZWxsKGNlbGwsIGluZGV4KSk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBjb2xDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoY2VsbHNbaV0ud2lkdGgsXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGgsIGNvbENvdW50KSB8fCAwLjA7XG4gICAgICAgICAgICByZW1haW5XaWR0aCAtPSB3aWR0aDtcbiAgICAgICAgICAgIGlmICh3aWR0aCAhPT0gMC4wKSB7XG4gICAgICAgICAgICAgICAgcmVtYWluQ29sQ291bnQtLTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdW5zZXRDZWxscy5wdXNoKGNlbGxzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbHVtbldpZHRoLnB1c2god2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZW1haW5Db2xDb3VudCA9PT0gMCkgcmV0dXJuIGNvbHVtbldpZHRoO1xuICAgICAgICBjb25zdCBoZXVyaXN0aWNXaWR0aDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5NQVRSSVhfQ09MVU1OX1dJRFRIKS53aWR0aDtcbiAgICAgICAgdW5zZXRDZWxscy5zb3J0KChjZWxsMTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCwgY2VsbDI6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwpID0+IHtcbiAgICAgICAgICAgIGxldCBtaW5XaWR0aDEgPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChjZWxsMS5taW5XaWR0aCwgYXZhaWxhYmxlV2lkdGgsIGNvbENvdW50KSB8fCAwLjA7XG4gICAgICAgICAgICBsZXQgbWluV2lkdGgyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoY2VsbDIubWluV2lkdGgsIGF2YWlsYWJsZVdpZHRoLCBjb2xDb3VudCkgfHwgMC4wO1xuICAgICAgICAgICAgcmV0dXJuIG1pbldpZHRoMiA+IG1pbldpZHRoMSA/IDEgOiAtMTtcbiAgICAgICAgfSkuZm9yRWFjaCgoY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXF1YWxXaWR0aDogbnVtYmVyID0gcmVtYWluV2lkdGggLyByZW1haW5Db2xDb3VudDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbk1pbldpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChjZWxsLm1pbldpZHRoLCBhdmFpbGFibGVXaWR0aCwgY29sQ291bnQpIHx8IDAuMDtcbiAgICAgICAgICAgIGlmKGNvbHVtbk1pbldpZHRoID4gZXF1YWxXaWR0aCAmJiBjb2x1bW5NaW5XaWR0aCA+IGhldXJpc3RpY1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgcmVtYWluV2lkdGggLT0gY29sdW1uTWluV2lkdGg7XG4gICAgICAgICAgICAgICAgcmVtYWluQ29sQ291bnQtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbHVtbldpZHRoW2NlbGxzLmluZGV4T2YoY2VsbCldID0gTWF0aC5tYXgoaGV1cmlzdGljV2lkdGgsIGNvbHVtbk1pbldpZHRoLCBlcXVhbFdpZHRoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb2x1bW5XaWR0aDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZU9uZVJvdyhwb2ludDogSVBvaW50LCByb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdywgaXNXaWRlOiBib29sZWFuLCBjb2x1bW5XaWR0aDogbnVtYmVyW10pOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGlmIChpc1dpZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNSb3dIb3Jpc29udGFsKHBvaW50LCByb3csIGNvbHVtbldpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUm93VmVydGljYWwocG9pbnQsIHJvdyk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c1Jvd3MocG9pbnQ6IElQb2ludCwgcm93czogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93W10sXG4gICAgICAgIGNvbENvdW50OiBudW1iZXIsIGlzV2lkZTogYm9vbGVhbik6IFByb21pc2U8Q29tcG9zaXRlQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJvd0ZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZU9uZVJvdyhjdXJyUG9pbnQsIHJvd3NbaV0sXG4gICAgICAgICAgICAgICAgaXNXaWRlLCB0aGlzLmNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3MsIGNvbENvdW50KSk7XG4gICAgICAgICAgICBpZiAocm93RmxhdC5pc0VtcHR5ICYmICEocm93c1tpXS5yb3cgJiYgcm93c1tpXS5yb3cuaGFzUGFuZWwpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmKCFyb3dGbGF0LmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gcm93cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gcm93RmxhdC55Qm90O1xuICAgICAgICAgICAgICAgICAgICByb3dGbGF0LmFkZEJyaWNrKFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByb3dzRmxhdHMucHVzaChyb3dGbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0ZsYXQueUJvdCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghIXJvd3NbaV0ucm93ICYmIHJvd3NbaV0ucm93Lmhhc1BhbmVsKSB7XG4gICAgICAgICAgICAgICAgcm93c1tpXS5yb3cuc2hvd0RldGFpbFBhbmVsKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudERldGFpbFBhbmVsOiBQYW5lbE1vZGVsID0gcm93c1tpXS5yb3cuZGV0YWlsUGFuZWw7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjdXJyZW50RGV0YWlsUGFuZWwucXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXRhaWxQYW5lbC5xdWVzdGlvbnNbal0uaWQgKz0gJ18nICsgaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFuZWxCcmlja3M6IElQZGZCcmlja1tdID0gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzUGFuZWwoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5LCB0aGlzLmNvbnRyb2xsZXIsIGN1cnJlbnREZXRhaWxQYW5lbCwgY3VyclBvaW50KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJDb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICAgICAgY3VyckNvbXBvc2l0ZS5hZGRCcmljayguLi5wYW5lbEJyaWNrcyk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBjdXJyQ29tcG9zaXRlLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2goY3VyckNvbXBvc2l0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IHJvd3MubGVuZ3RoIC0gMSAmJiB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGUuc2hvd0hlYWRlciAmJiBpc1dpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyOiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVPbmVSb3coY3VyclBvaW50LCByb3dzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNXaWRlLCB0aGlzLmNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3MsIGNvbENvdW50KSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyWVRvcCA9IGN1cnJDb21wb3NpdGUueUJvdDtcbiAgICAgICAgICAgICAgICAgICAgaWYoIWhlYWRlci5pc0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyWVRvcCA9IGhlYWRlci55Qm90O1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2goaGVhZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGN1cnJZVG9wICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVJc1dpZGUodGFibGU6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlLCBjb2xDb3VudDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdID0gW107XG4gICAgICAgIGlmKHRhYmxlLnNob3dIZWFkZXIpIHtcbiAgICAgICAgICAgIHJvd3MucHVzaCh0YWJsZS5oZWFkZXJSb3cpO1xuICAgICAgICB9XG4gICAgICAgIHJvd3MucHVzaCguLi50aGlzLnZpc2libGVSb3dzKTtcbiAgICAgICAgaWYocm93cy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aFN1bSA9IHRoaXMuY2FsY3VsYXRlQ29sdW1uV2lkdGgocm93cywgY29sQ291bnQpLnJlZHVjZSgod2lkdGhTdW06IG51bWJlciwgd2lkdGg6IG51bWJlcikgPT4gd2lkdGhTdW0gKz0gd2lkdGgsIDApO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5yZW5kZXJBcyAhPT0gJ2xpc3QnICYmIHRoaXMuY29udHJvbGxlci5tYXRyaXhSZW5kZXJBcyAhPT0gJ2xpc3QnICYmIE1hdGguZmxvb3IoY29sdW1uV2lkdGhTdW0pIDw9IE1hdGguZmxvb3IodGhpcy5nZXRBdmFsYWJsZVdpZHRoKGNvbENvdW50KSk7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0Um93c1RvUmVuZGVyKHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSwgaXNWZXJ0aWNhbDogYm9vbGVhbiwgaXNXaWRlOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdID0gW107XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkUm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgICAgIGlmICh0YWJsZS5zaG93SGVhZGVyICYmIGlzV2lkZSkgcm93cy5wdXNoKHRhYmxlLmhlYWRlclJvdyk7XG4gICAgICAgIHJvd3MucHVzaCguLi5yZW5kZXJlZFJvd3MpO1xuICAgICAgICBpZiAodGFibGUuaGFzUmVtb3ZlUm93cyAmJiBpc1ZlcnRpY2FsKSByb3dzLnBvcCgpO1xuICAgICAgICBpZiAodGFibGUuc2hvd0Zvb3Rlcikgcm93cy5wdXNoKHRhYmxlLmZvb3RlclJvdyk7XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgIH1cbiAgICBwcml2YXRlIGdldENvbENvdW50KHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSwgcmVuZGVyZWRSb3dzOiBBcnJheTxRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c+KTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCEhcmVuZGVyZWRSb3dzWzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyZWRSb3dzWzBdLmNlbGxzLmZpbHRlcigoY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCwgaW5kZXg6IG51bWJlcikgPT4gIXRoaXMuaWdub3JlQ2VsbChjZWxsLCBpbmRleCkpLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJsZS5zaG93SGVhZGVyICYmIHRhYmxlLmhlYWRlclJvdyA/IHRhYmxlLmhlYWRlclJvdy5jZWxscy5sZW5ndGggOlxuICAgICAgICAgICAgICAgIHRhYmxlLnNob3dGb290ZXIgJiYgdGFibGUuZm9vdGVyUm93ID8gdGFibGUuZm9vdGVyUm93LmNlbGxzLmxlbmd0aCA6IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgbGV0IHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSA9IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZTtcbiAgICAgICAgbGV0IGlzVmVydGljYWw6IGJvb2xlYW4gPSB0aGlzLnF1ZXN0aW9uLmNvbHVtbkxheW91dCA9PT0gJ3ZlcnRpY2FsJztcbiAgICAgICAgbGV0IGNvbENvdW50OiBudW1iZXIgPSB0aGlzLmdldENvbENvdW50KHRhYmxlLCB0aGlzLnZpc2libGVSb3dzKTtcbiAgICAgICAgaWYgKGNvbENvdW50ID09PSAwICYmICF0aGlzLmhhc0RldGFpbFBhbmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBDb21wb3NpdGVCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQocG9pbnQsIHRoaXMuY29udHJvbGxlcikpXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc1dpZGUgPSB0aGlzLmNhbGN1bGF0ZUlzV2lkZSh0YWJsZSwgY29sQ291bnQpO1xuICAgICAgICBpZighaXNXaWRlKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmlzTW9iaWxlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlzVmVydGljYWwgPSBmYWxzZTtcbiAgICAgICAgICAgIHRhYmxlID0gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlO1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlUm93c1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29sQ291bnQgPSB0aGlzLmdldENvbENvdW50KHRhYmxlLCB0aGlzLnZpc2libGVSb3dzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dzID0gdGhpcy5nZXRSb3dzVG9SZW5kZXIodGFibGUsIGlzVmVydGljYWwsIGlzV2lkZSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNSb3dzKHBvaW50LCByb3dzLCBjb2xDb3VudCwgaXNXaWRlKTtcbiAgICB9XG59XG5cblNlcmlhbGl6ZXIucmVtb3ZlUHJvcGVydHkoJ21hdHJpeGRyb3Bkb3duJywgJ3JlbmRlckFzJyk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdtYXRyaXhkcm9wZG93bicsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeGRyb3Bkb3duJywgRmxhdE1hdHJpeE11bHRpcGxlKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhtdWx0aXBsZS50cyIsImltcG9ydCBJbnRlcnZhbFRyZWUgZnJvbSAnbm9kZS1pbnRlcnZhbC10cmVlJztcbmltcG9ydCB7IERvY09wdGlvbnMsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuaW50ZXJmYWNlIFBhY2tJbnRlcnZhbCB7XG4gICAgcGFnZUluZGV4OiBudW1iZXI7XG4gICAgeExlZnQ6IG51bWJlcjtcbiAgICB4UmlnaHQ6IG51bWJlcjtcbiAgICB5Qm90OiBudW1iZXI7XG4gICAgYWJzQm90OiBudW1iZXI7XG59XG5leHBvcnQgY2xhc3MgUGFnZVBhY2tlciB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgZmluZEJvdEludGVydmFsKHRyZWU6IEludGVydmFsVHJlZTxQYWNrSW50ZXJ2YWw+LFxuICAgICAgICB4TGVmdDogbnVtYmVyLCB4UmlnaHQ6IG51bWJlciwgb3B0aW9uczogRG9jT3B0aW9ucyk6IFBhY2tJbnRlcnZhbCB7XG4gICAgICAgIGNvbnN0IGludGVydmFsczogUGFja0ludGVydmFsW10gPSB0cmVlLnNlYXJjaCh4TGVmdCwgeFJpZ2h0KTtcbiAgICAgICAgaW50ZXJ2YWxzLnB1c2goe1xuICAgICAgICAgICAgcGFnZUluZGV4OiAwLCB4TGVmdDpcbiAgICAgICAgICAgICAgICBvcHRpb25zLm1hcmdpbnMubGVmdCwgeFJpZ2h0OiBvcHRpb25zLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgIHlCb3Q6IG9wdGlvbnMubWFyZ2lucy50b3AsIGFic0JvdDogb3B0aW9ucy5tYXJnaW5zLnRvcFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGludGVydmFscy5yZWR1Y2UoKG14LCBjcikgPT4ge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGNyLnhSaWdodCAtIHhMZWZ0KSA8IFN1cnZleUhlbHBlci5FUFNJTE9OIHx8XG4gICAgICAgICAgICAgICAgTWF0aC5hYnMoY3IueExlZnQgLSB4UmlnaHQpIDwgU3VydmV5SGVscGVyLkVQU0lMT04pIHJldHVybiBteDtcbiAgICAgICAgICAgIGlmIChjci5wYWdlSW5kZXggPCBteC5wYWdlSW5kZXgpIHJldHVybiBteDtcbiAgICAgICAgICAgIGlmIChjci5wYWdlSW5kZXggPiBteC5wYWdlSW5kZXgpIHJldHVybiBjcjtcbiAgICAgICAgICAgIHJldHVybiBjci55Qm90ID4gbXgueUJvdCA/IGNyIDogbXg7XG4gICAgICAgIH0sIGludGVydmFsc1tpbnRlcnZhbHMubGVuZ3RoIC0gMV0pO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhZGRQYWNrKHBhY2tzOiBJUGRmQnJpY2tbXVtdLCBpbmRleDogbnVtYmVyLCBicmljazogSVBkZkJyaWNrKSB7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHBhY2tzLmxlbmd0aDsgaSA8PSBpbmRleDsgaSsrKSB7XG4gICAgICAgICAgICBwYWNrcy5wdXNoKFtdKTtcbiAgICAgICAgfVxuICAgICAgICBwYWNrc1tpbmRleF0ucHVzaChicmljayk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcGFjayhmbGF0czogSVBkZkJyaWNrW11bXSwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IElQZGZCcmlja1tdW10ge1xuICAgICAgICBjb25zdCBwYWdlSGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy50b3AgLSBjb250cm9sbGVyLm1hcmdpbnMuYm90O1xuICAgICAgICBjb25zdCB1bmZvbGRGbGF0czogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBmbGF0cy5mb3JFYWNoKChmbGF0c1BhZ2U6IElQZGZCcmlja1tdKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRGbGF0cy5wdXNoKFtdKTtcbiAgICAgICAgICAgIGZsYXRzUGFnZS5mb3JFYWNoKChmbGF0OiBJUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmxhdC5oZWlnaHQgPiBwYWdlSGVpZ2h0ICsgU3VydmV5SGVscGVyLkVQU0lMT04pIHtcbiAgICAgICAgICAgICAgICAgICAgdW5mb2xkRmxhdHNbdW5mb2xkRmxhdHMubGVuZ3RoIC0gMV0ucHVzaCguLi5mbGF0LnVuZm9sZCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB1bmZvbGRGbGF0c1t1bmZvbGRGbGF0cy5sZW5ndGggLSAxXS5wdXNoKGZsYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB1bmZvbGRGbGF0cy5mb3JFYWNoKCh1bmZvbGRGbGF0c1BhZ2U6IElQZGZCcmlja1tdKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRGbGF0c1BhZ2Uuc29ydCgoYTogSVBkZkJyaWNrLCBiOiBJUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYS55VG9wIDwgYi55VG9wKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgaWYgKGEueVRvcCA+IGIueVRvcCkgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgaWYgKGEueExlZnQgPiBiLnhMZWZ0KSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICBpZiAoYS54TGVmdCA8IGIueExlZnQpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHBhZ2VJbmRleE1vZGVsOiBudW1iZXIgPSAwO1xuICAgICAgICBjb25zdCBwYWNrczogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBjb25zdCBwYWdlQm90OiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC0gY29udHJvbGxlci5tYXJnaW5zLmJvdDtcbiAgICAgICAgdW5mb2xkRmxhdHMuZm9yRWFjaCgodW5mb2xkRmxhdHNQYWdlOiBJUGRmQnJpY2tbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHJlZTogSW50ZXJ2YWxUcmVlPFBhY2tJbnRlcnZhbD4gPSBuZXcgSW50ZXJ2YWxUcmVlKCk7XG4gICAgICAgICAgICBsZXQgcGFnZUluZGV4U2hpZnQ6IG51bWJlciA9IDA7XG4gICAgICAgICAgICB1bmZvbGRGbGF0c1BhZ2UuZm9yRWFjaCgoZmxhdDogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHsgcGFnZUluZGV4LCB5Qm90LCBhYnNCb3QgfSA9IFBhZ2VQYWNrZXIuZmluZEJvdEludGVydmFsKFxuICAgICAgICAgICAgICAgICAgICB0cmVlLCBmbGF0LnhMZWZ0LCBmbGF0LnhSaWdodCwgY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSBmbGF0LmhlaWdodDtcbiAgICAgICAgICAgICAgICBmbGF0LnlUb3AgPSB5Qm90ICsgZmxhdC55VG9wIC0gYWJzQm90O1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhmbGF0LnlUb3AgLSBjb250cm9sbGVyLm1hcmdpbnMudG9wKSA+IFN1cnZleUhlbHBlci5FUFNJTE9OICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYXQueVRvcCArIGhlaWdodCA+IHBhZ2VCb3QgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTiB8fCBmbGF0LmlzUGFnZUJyZWFrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYXQueVRvcCA9IGNvbnRyb2xsZXIubWFyZ2lucy50b3A7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXhTaGlmdCA9IE1hdGgubWF4KHBhZ2VJbmRleFNoaWZ0LCBwYWdlSW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cmVlLmluc2VydChmbGF0LnhMZWZ0LCBmbGF0LnhSaWdodCwge1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgeExlZnQ6IGZsYXQueExlZnQsIHhSaWdodDogZmxhdC54UmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHlCb3Q6IGZsYXQueVRvcCArIGhlaWdodCwgYWJzQm90OiBmbGF0LnlCb3RcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmbGF0LnlCb3QgPSBmbGF0LnlUb3AgKyBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgUGFnZVBhY2tlci5hZGRQYWNrKHBhY2tzLCBwYWdlSW5kZXhNb2RlbCArIHBhZ2VJbmRleCwgZmxhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhZ2VJbmRleE1vZGVsICs9IHBhZ2VJbmRleFNoaWZ0ICsgMTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYWNrcztcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BhZ2VfbGF5b3V0L3BhZ2VfcGFja2VyLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuL3BkZl9jaGVja2l0ZW0nO1xuXG5leHBvcnQgY2xhc3MgQm9vbGVhbkl0ZW1CcmljayBleHRlbmRzIENoZWNrSXRlbUJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgc3VwZXIoY29udHJvbGxlciwgcmVjdCxcbiAgICAgICAgICAgICg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLmlkLFxuICAgICAgICAgICAgeyBxdWVzdGlvbjogcXVlc3Rpb24sIHJlYWRPbmx5OiBxdWVzdGlvbi5pc1JlYWRPbmx5LCBjaGVja2VkOiAoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS5jaGVja2VkVmFsdWUgfSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25DaGVja2JveE1vZGVsLCBJdGVtVmFsdWUgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IENoZWNrSXRlbUJyaWNrIH0gZnJvbSAnLi9wZGZfY2hlY2tpdGVtJztcblxuZXhwb3J0IGNsYXNzIENoZWNrYm94SXRlbUJyaWNrIGV4dGVuZHMgQ2hlY2tJdGVtQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIsIHJlY3QsXG4gICAgICAgICAgICAoPFF1ZXN0aW9uQ2hlY2tib3hNb2RlbD5xdWVzdGlvbikuaWQgKyAnaW5kZXgnICsgaW5kZXgsXG4gICAgICAgICAgICB7IHF1ZXN0aW9uOiBxdWVzdGlvbiwgcmVhZE9ubHk6IHF1ZXN0aW9uLmlzUmVhZE9ubHkgfHwgIWl0ZW0uaXNFbmFibGVkLCBpdGVtOiBpdGVtLCBjaGVja2VkOiAoPFF1ZXN0aW9uQ2hlY2tib3hNb2RlbD5xdWVzdGlvbikuaXNJdGVtU2VsZWN0ZWQoaXRlbSksIGluZGV4OiBpbmRleCB9KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgc2V0dGluZ3MgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRCb3hCcmljayB9IGZyb20gJy4vcGRmX3RleHRib3gnO1xuXG5leHBvcnQgY2xhc3MgQ29tbWVudEJyaWNrIGV4dGVuZHMgVGV4dEJveEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBpc1F1ZXN0aW9uOiBib29sZWFuLCBpbmRleDogbnVtYmVyID0gMCkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgaXNRdWVzdGlvbiwgdHJ1ZSwgaW5kZXgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2hvdWxkUmVuZGVyRmxhdEJvcmRlcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmKHRoaXMuaXNRdWVzdGlvbiAmJiB0aGlzLnF1ZXN0aW9uLmdldFR5cGUoKSAhPT0gJ2NvbW1lbnQnKSByZXR1cm4gc3VwZXIuc2hvdWxkUmVuZGVyRmxhdEJvcmRlcnMoKTtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzLnJlYWRPbmx5Q29tbWVudFJlbmRlck1vZGUgPT09ICd0ZXh0YXJlYSc7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9jb21tZW50LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkRyb3Bkb3duTW9kZWwsIEl0ZW1WYWx1ZSB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIERyb3Bkb3duQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkRyb3Bkb3duTW9kZWw7XG4gICAgcHJvdGVjdGVkIGlzUXVlc3Rpb246IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIGlzTXVsdGlsaW5lOiBib29sZWFuO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjb21ib0JveCA9IG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtQ29tYm9Cb3gpKCk7XG4gICAgICAgIGNvbWJvQm94LmZpZWxkTmFtZSA9IHRoaXMucXVlc3Rpb24uaWQ7XG4gICAgICAgIGNvbWJvQm94LlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5mb3JtU2NhbGUodGhpcy5jb250cm9sbGVyLCB0aGlzKSkpO1xuICAgICAgICBjb21ib0JveC5lZGl0ID0gZmFsc2U7XG4gICAgICAgIGNvbWJvQm94LmNvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLnNob3dPcHRpb25zQ2FwdGlvbikge1xuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHRoaXMuZ2V0Q29ycmVjdGVkVGV4dCh0aGlzLnF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5mb3JFYWNoKChpdGVtOiBJdGVtVmFsdWUpID0+IHtcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaCh0aGlzLmdldENvcnJlY3RlZFRleHQoU3VydmV5SGVscGVyLmdldExvY1N0cmluZyhpdGVtLmxvY1RleHQpKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb21ib0JveC5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBjb21ib0JveC5mb250TmFtZSA9IHRoaXMuY29udHJvbGxlci5mb250TmFtZTtcbiAgICAgICAgY29tYm9Cb3guZm9udFNpemUgPSB0aGlzLmZvbnRTaXplO1xuICAgICAgICBjb21ib0JveC5yZWFkT25seSA9IHRoaXMucXVlc3Rpb24uaXNSZWFkT25seTtcbiAgICAgICAgY29tYm9Cb3guaXNVbmljb2RlID0gU3VydmV5SGVscGVyLmlzQ3VzdG9tRm9udChcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgY29tYm9Cb3guZm9udE5hbWUpO1xuICAgICAgICBjb21ib0JveC5WID0gdGhpcy5nZXRDb3JyZWN0ZWRUZXh0KFN1cnZleUhlbHBlci5nZXREcm9wZG93blF1ZXN0aW9uVmFsdWUodGhpcy5xdWVzdGlvbikpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmFkZEZpZWxkKGNvbWJvQm94KTtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9kcm9wZG93bi50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5cbmV4cG9ydCBjbGFzcyBIVE1MQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBtYXJnaW5zOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciB9O1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGh0bWw6IHN0cmluZywgaXNJbWFnZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgaWYgKGlzSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMubWFyZ2lucyA9IHtcbiAgICAgICAgICAgICAgICB0b3A6IDAuMCxcbiAgICAgICAgICAgICAgICBib3R0b206IDAuMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWFyZ2lucyA9IHtcbiAgICAgICAgICAgICAgICB0b3A6IGNvbnRyb2xsZXIubWFyZ2lucy50b3AsXG4gICAgICAgICAgICAgICAgYm90dG9tOiBjb250cm9sbGVyLm1hcmdpbnMuYm90XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IHRoaXMuZm9udFNpemU7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmZyb21IVE1MKHRoaXMuaHRtbCwgdGhpcy54TGVmdCwgdGhpcy55VG9wLCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsIHBhZ2VzcGxpdDogdHJ1ZSxcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zanMtcGRmLWhpZGRlbi1odG1sLWRpdicpKS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZWw6IEhUTUxEaXZFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSwgdGhpcy5tYXJnaW5zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfaHRtbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQb2ludCB9IGZyb20gJy4uL2VudHJpZXMvcGRmJztcblxuZXhwb3J0IGNsYXNzIEltYWdlQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHByb3RlY3RlZCBpbWFnZTogc3RyaW5nLFxuICAgICAgICBwb2ludDogSVBvaW50LCBwcm90ZWN0ZWQgb3JpZ2luYWxXaWR0aDogbnVtYmVyLCBwcm90ZWN0ZWQgb3JpZ2luYWxIZWlnaHQ6IG51bWJlcikge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgeFJpZ2h0OiBwb2ludC54TGVmdCArIChvcmlnaW5hbFdpZHRoIHx8IDApLFxuICAgICAgICAgICAgeVRvcDogcG9pbnQueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHBvaW50LnlUb3AgKyAob3JpZ2luYWxIZWlnaHQgfHwgMClcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaXNQYWdlQnJlYWsgPSB0aGlzLm9yaWdpbmFsSGVpZ2h0ID09PSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRJbWFnZSh0aGlzLmltYWdlLCAnUE5HJywgdGhpcy54TGVmdCwgdGhpcy55VG9wLCB0aGlzLm9yaWdpbmFsV2lkdGgsIHRoaXMub3JpZ2luYWxIZWlnaHQpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfaW1hZ2UudHMiLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBMaW5rQnJpY2sgZXh0ZW5kcyBUZXh0QnJpY2sge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNDQUxFX0ZBQ1RPUl9NQUdJQzogbnVtYmVyID0gMC45NTU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDT0xPUjogc3RyaW5nID0gJyMwMDAwRUUnO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXh0RmxhdDogVGV4dEJyaWNrLCBwcm90ZWN0ZWQgbGluazogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCg8TGlua0JyaWNrPnRleHRGbGF0KS5xdWVzdGlvbixcbiAgICAgICAgICAgICg8TGlua0JyaWNrPnRleHRGbGF0KS5jb250cm9sbGVyLFxuICAgICAgICAgICAgdGV4dEZsYXQsICg8TGlua0JyaWNrPnRleHRGbGF0KS50ZXh0KTtcbiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSBMaW5rQnJpY2suQ09MT1I7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IG9sZFRleHRDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRUZXh0Q29sb3IoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3IoU3VydmV5SGVscGVyLkJBQ0tHUk9VTkRfQ09MT1IpO1xuICAgICAgICBsZXQgZGVzY2VudDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKlxuICAgICAgICAgICAgKHRoaXMuY29udHJvbGxlci5kb2MuZ2V0TGluZUhlaWdodEZhY3RvcigpIC1cbiAgICAgICAgICAgICAgICBMaW5rQnJpY2suU0NBTEVfRkFDVE9SX01BR0lDKTtcbiAgICAgICAgbGV0IHlUb3BMaW5rOiBudW1iZXIgPSB0aGlzLnlUb3AgK1xuICAgICAgICAgICAgKHRoaXMueUJvdCAtIHRoaXMueVRvcCkgLSBkZXNjZW50O1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnRleHRXaXRoTGluayh0aGlzLnRleHQsIHRoaXMueExlZnQsXG4gICAgICAgICAgICB5VG9wTGluaywgeyB1cmw6IHRoaXMubGluayB9KTtcbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3Iob2xkVGV4dENvbG9yKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoU3VydmV5SGVscGVyLmdldFJlYWRvbmx5UmVuZGVyQXMoPFF1ZXN0aW9uPnRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIpICE9PSAndGV4dCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2xpbmsudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGludGVyZmFjZSBJUmFkaW9ncm91cFdyYXBDb250ZXh0IHtcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uO1xuICAgIHJlYWRPbmx5OiBib29sZWFuO1xufVxuZXhwb3J0IGNsYXNzIFJhZGlvR3JvdXBXcmFwIHtcbiAgICBwcml2YXRlIF9yYWRpb0dyb3VwOiBhbnk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcHJpdmF0ZSBjb250ZXh0OiBJUmFkaW9ncm91cFdyYXBDb250ZXh0KSB7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRUb1BkZihjb2xvcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAgPSBuZXcgdGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybVJhZGlvQnV0dG9uKCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHt9O1xuICAgICAgICBvcHRpb25zLmZpZWxkTmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgb3B0aW9ucy5yZWFkT25seSA9IHRoaXMucmVhZE9ubHk7XG4gICAgICAgIG9wdGlvbnMuY29sb3IgPSBjb2xvcjtcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICAoPFN1cnZleVBERj50aGlzLmNvbnRleHQucXVlc3Rpb24uc3VydmV5KT8uZ2V0VXBkYXRlZFJhZGlvR3JvdXBXcmFwT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fcmFkaW9Hcm91cC5maWVsZE5hbWUgPSBvcHRpb25zLmZpZWxkTmFtZTtcbiAgICAgICAgdGhpcy5fcmFkaW9Hcm91cC5yZWFkT25seSA9IG9wdGlvbnMucmVhZE9ubHk7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAuY29sb3IgPSBvcHRpb25zLmNvbG9yO1xuXG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAudmFsdWUgPSAnJztcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZCh0aGlzLl9yYWRpb0dyb3VwKTtcbiAgICB9XG4gICAgZ2V0IHJhZGlvR3JvdXAoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhZGlvR3JvdXA7XG4gICAgfVxuICAgIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5yZWFkT25seTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJhZGlvR3JvdXBJdGVtQnJpY2tDb250ZXh0IHtcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uO1xuICAgIGNoZWNrZWQ6IGJvb2xlYW47XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBpdGVtOiBJdGVtVmFsdWU7XG59XG5cbmV4cG9ydCBjbGFzcyBSYWRpb0l0ZW1CcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSQURJT01BUktFUl9SRUFET05MWV9TWU1CT0w6IHN0cmluZyA9ICdsJztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSQURJT01BUktFUl9SRUFET05MWV9GT05UOiBzdHJpbmcgPSAnemFwZmRpbmdiYXRzJztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJBRElPTUFSS0VSX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4wIC0gKCgyLjAgKyBNYXRoLkUpIC8gMTAuMCk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcml2YXRlIGNvbnRleHQ6IElSYWRpb0dyb3VwSXRlbUJyaWNrQ29udGV4dCxcbiAgICAgICAgcHJpdmF0ZSByYWRpb0dyb3VwV3JhcDogUmFkaW9Hcm91cFdyYXApIHtcbiAgICAgICAgc3VwZXIoY29udGV4dC5xdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRTaG91bGRSZW5kZXJSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFkaW9Hcm91cFdyYXAucmVhZE9ubHkgJiYgU3VydmV5SGVscGVyLmdldFJlYWRvbmx5UmVuZGVyQXMoXG4gICAgICAgICAgICA8UXVlc3Rpb24+dGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKSAhPT0gJ2Fjcm9mb3JtJyB8fCB0aGlzLmNvbnRyb2xsZXIuY29tcHJlc3M7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5pbmRleCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwLmFkZFRvUGRmKHRoaXMuZm9ybUJvcmRlckNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7fTtcbiAgICAgICAgb3B0aW9ucy5maWVsZE5hbWUgPSB0aGlzLnJhZGlvR3JvdXBXcmFwLm5hbWUgKyAnaW5kZXgnICsgdGhpcy5jb250ZXh0LmluZGV4O1xuICAgICAgICBsZXQgZm9ybVNjYWxlOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZm9ybVNjYWxlKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIG9wdGlvbnMuUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KHRoaXMsIGZvcm1TY2FsZSkpO1xuICAgICAgICBvcHRpb25zLmNvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgICAgIG9wdGlvbnMuYXBwZWFyYW5jZSA9IHRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm0uQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGU7XG4gICAgICAgIG9wdGlvbnMucmFkaW9Hcm91cCA9IHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cDtcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuXG4gICAgICAgICg8U3VydmV5UERGPnRoaXMuY29udGV4dC5xdWVzdGlvbi5zdXJ2ZXkpPy5nZXRVcGRhdGVkUmFkaW9JdGVtQWNyb2Zvcm1PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBsZXQgcmFkaW9CdXR0b246IGFueSA9IHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC5jcmVhdGVPcHRpb24ob3B0aW9ucy5maWVsZE5hbWUpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuY2hlY2tlZCkge1xuICAgICAgICAgICAgaWYoIW9wdGlvbnMuQVMpIHtcbiAgICAgICAgICAgICAgICByYWRpb0J1dHRvbi5BUyA9ICcvJyArIG9wdGlvbnMuZmllbGROYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIXRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC52YWx1ZSA9IG9wdGlvbnMuZmllbGROYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYoIW9wdGlvbnMuQVMpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLkFTID0gJy9PZmYnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJhZGlvQnV0dG9uLlJlY3QgPSBvcHRpb25zLlJlY3Q7XG4gICAgICAgIHJhZGlvQnV0dG9uLmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcblxuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcC5yYWRpb0dyb3VwLnNldEFwcGVhcmFuY2UoXG4gICAgICAgICAgICBvcHRpb25zLmFwcGVhcmFuY2VcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5jaGVja2VkKSB7XG4gICAgICAgICAgICBjb25zdCByYWRpb21hcmtlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGhpcywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICAgICAgY29uc3Qgb2xkRm9udE5hbWU6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5mb250TmFtZTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5mb250TmFtZSA9IFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX0ZPTlQ7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqXG4gICAgICAgICAgICAgICAgUmFkaW9JdGVtQnJpY2suUkFESU9NQVJLRVJfUkVBRE9OTFlfRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICAgICAgbGV0IHJhZGlvbWFya2VyU2l6ZTogSVNpemUgPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoXG4gICAgICAgICAgICAgICAgUmFkaW9JdGVtQnJpY2suUkFESU9NQVJLRVJfUkVBRE9OTFlfU1lNQk9MKTtcbiAgICAgICAgICAgIHJhZGlvbWFya2VyUG9pbnQueExlZnQgKz0gdGhpcy53aWR0aCAvIDIuMCAtIHJhZGlvbWFya2VyU2l6ZS53aWR0aCAvIDIuMDtcbiAgICAgICAgICAgIHJhZGlvbWFya2VyUG9pbnQueVRvcCArPSB0aGlzLmhlaWdodCAvIDIuMCAtIHJhZGlvbWFya2VyU2l6ZS5oZWlnaHQgLyAyLjA7XG4gICAgICAgICAgICBsZXQgcmFkaW9tYXJrZXJGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgcmFkaW9tYXJrZXJQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX1NZTUJPTCwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgICg8YW55PnJhZGlvbWFya2VyRmxhdC51bmZvbGQoKVswXSkudGV4dENvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgICAgICBhd2FpdCByYWRpb21hcmtlckZsYXQucmVuZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5mb250TmFtZSA9IG9sZEZvbnROYW1lO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uUmFua2luZ01vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyLCBJUG9pbnQgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4vcGRmX2NoZWNraXRlbSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFJhbmtpbmdJdGVtQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblJhbmtpbmdNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBtYXJrOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uUmFua2luZ01vZGVsPnF1ZXN0aW9uO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBjb25zdCBtYXJrUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aGlzLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKlxuICAgICAgICAgICAgQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgY29uc3QgbWFya1NpemU6IElTaXplID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMubWFyayk7XG4gICAgICAgIG1hcmtQb2ludC54TGVmdCArPSB0aGlzLndpZHRoIC8gMi4wIC0gbWFya1NpemUud2lkdGggLyAyLjA7XG4gICAgICAgIG1hcmtQb2ludC55VG9wICs9IHRoaXMuaGVpZ2h0IC8gMi4wIC0gbWFya1NpemUuaGVpZ2h0IC8gMi4wO1xuICAgICAgICBjb25zdCBtYXJrRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgbWFya1BvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMubWFyaywgVGV4dEJyaWNrKTtcbiAgICAgICAgKDxhbnk+bWFya0ZsYXQudW5mb2xkKClbMF0pLnRleHRDb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgYXdhaXQgbWFya0ZsYXQucmVuZGVyKCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9yYW5raW5naXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwsIHNldHRpbmdzIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrLCBUcmFuc2xhdGVYRnVuY3Rpb24gfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi9wZGZfY29tcG9zaXRlJztcblxuZXhwb3J0IGNsYXNzIFRleHRGaWVsZEJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgaXNRdWVzdGlvbjogYm9vbGVhbixcbiAgICAgICAgcHJvdGVjdGVkIGZpZWxkTmFtZTogc3RyaW5nLCBwcm90ZWN0ZWQgdmFsdWU6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHBsYWNlaG9sZGVyOiBzdHJpbmcsIHB1YmxpYyBpc1JlYWRPbmx5OiBib29sZWFuLFxuICAgICAgICBwcm90ZWN0ZWQgaXNNdWx0aWxpbmU6IGJvb2xlYW4sIHByb3RlY3RlZCBpbnB1dFR5cGU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgcmVuZGVyQ29sb3JRdWVzdGlvbigpOiB2b2lkIHtcbiAgICAgICAgbGV0IG9sZEZpbGxDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRGaWxsQ29sb3IoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRGaWxsQ29sb3IodGhpcy5xdWVzdGlvbi52YWx1ZSB8fCAnYmxhY2snKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5yZWN0KHRoaXMueExlZnQsIHRoaXMueVRvcCxcbiAgICAgICAgICAgIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAnRicpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldEZpbGxDb2xvcihvbGRGaWxsQ29sb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0VHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDb2xvclF1ZXN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5wdXRGaWVsZDogYW55ID0gdGhpcy5pbnB1dFR5cGUgPT09ICdwYXNzd29yZCcgP1xuICAgICAgICAgICAgbmV3ICg8YW55PnRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1QYXNzd29yZEZpZWxkKSgpIDpcbiAgICAgICAgICAgIG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtVGV4dEZpZWxkKSgpO1xuICAgICAgICBpbnB1dEZpZWxkLmZpZWxkTmFtZSA9IHRoaXMuZmllbGROYW1lO1xuICAgICAgICBpbnB1dEZpZWxkLmZvbnROYW1lID0gdGhpcy5jb250cm9sbGVyLmZvbnROYW1lO1xuICAgICAgICBpbnB1dEZpZWxkLmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgaW5wdXRGaWVsZC5pc1VuaWNvZGUgPSBTdXJ2ZXlIZWxwZXIuaXNDdXN0b21Gb250KFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCBpbnB1dEZpZWxkLmZvbnROYW1lKTtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRUeXBlICE9PSAncGFzc3dvcmQnKSB7XG4gICAgICAgICAgICBpbnB1dEZpZWxkLlYgPSAnICcgKyB0aGlzLmdldENvcnJlY3RlZFRleHQodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICBpbnB1dEZpZWxkLkRWID0gJyAnICsgdGhpcy5nZXRDb3JyZWN0ZWRUZXh0KHRoaXMucGxhY2Vob2xkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaW5wdXRGaWVsZC52YWx1ZSA9ICcnO1xuICAgICAgICBpbnB1dEZpZWxkLm11bHRpbGluZSA9IHRoaXMuaXNNdWx0aWxpbmU7XG4gICAgICAgIGlucHV0RmllbGQucmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHk7XG4gICAgICAgIGlucHV0RmllbGQuY29sb3IgPSB0aGlzLnRleHRDb2xvcjtcbiAgICAgICAgbGV0IGZvcm1TY2FsZTogbnVtYmVyID0gU3VydmV5SGVscGVyLmZvcm1TY2FsZSh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBpbnB1dEZpZWxkLm1heEZvbnRTaXplID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplICogZm9ybVNjYWxlO1xuICAgICAgICBpbnB1dEZpZWxkLlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLCBmb3JtU2NhbGUpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZChpbnB1dEZpZWxkKTtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzaG91bGRSZW5kZXJGbGF0Qm9yZGVycygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzLnJlYWRPbmx5VGV4dFJlbmRlck1vZGUgPT09ICdpbnB1dCc7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRTaG91bGRSZW5kZXJSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5zaG91bGRSZW5kZXJSZWFkT25seSh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMuaXNSZWFkT25seSk7XG4gICAgfVxuICAgIHByaXZhdGUgX3RleHRCcmljazogSVBkZkJyaWNrO1xuICAgIHB1YmxpYyBnZXQgdGV4dEJyaWNrKCk6IElQZGZCcmljayB7XG4gICAgICAgIHJldHVybiB0aGlzLl90ZXh0QnJpY2s7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgdGV4dEJyaWNrKHZhbDogSVBkZkJyaWNrKSB7XG4gICAgICAgIHRoaXMuX3RleHRCcmljayA9IHZhbDtcbiAgICAgICAgY29uc3QgdW5Gb2xkZWRCcmlja3MgPSB2YWwudW5mb2xkKCk7XG4gICAgICAgIGNvbnN0IGJyaWNrc0NvdW50ID0gdW5Gb2xkZWRCcmlja3MubGVuZ3RoO1xuICAgICAgICBsZXQgcmVuZGVyZWRCcmlja3NDb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IGJyaWNrc0J5UGFnZTogeyBbaW5kZXg6IG51bWJlcl06IEFycmF5PFBkZkJyaWNrPiB9ID0ge307XG4gICAgICAgIGNvbnN0IGFmdGVyUmVuZGVyVGV4dEJyaWNrQ2FsbGJhY2sgPSAoYnJpY2s6IFBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICBpZih0aGlzLnNob3VsZFJlbmRlckZsYXRCb3JkZXJzKCkpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlZEJyaWNrc0NvdW50Kys7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VOdW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZ2V0Q3VycmVudFBhZ2VJbmRleCgpO1xuICAgICAgICAgICAgICAgIGlmKCFicmlja3NCeVBhZ2VbY3VycmVudFBhZ2VOdW1iZXJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyaWNrc0J5UGFnZVtjdXJyZW50UGFnZU51bWJlcl0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJpY2tzQnlQYWdlW2N1cnJlbnRQYWdlTnVtYmVyXS5wdXNoKGJyaWNrKTtcbiAgICAgICAgICAgICAgICBpZihyZW5kZXJlZEJyaWNrc0NvdW50ID49IGJyaWNrc0NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhicmlja3NCeVBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlZE9uT25lUGFnZSA9IGtleXMubGVuZ3RoID09IDE7XG4gICAgICAgICAgICAgICAgICAgIGtleXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmlja3NCeVBhZ2Vba2V5IGFzIGFueV0uZm9yRWFjaCgoYnJpY2s6IFBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlQnJpY2suYWRkQnJpY2soYnJpY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuVkFMVUVfUkVBRE9OTFlfUEFERElOR19TQ0FMRTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvcmRlclJlY3QgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeExlZnQ6IHRoaXMueExlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFJpZ2h0OiB0aGlzLnhSaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5VG9wOiByZW5kZXJlZE9uT25lUGFnZSA/IHRoaXMueVRvcCA6IGNvbXBvc2l0ZUJyaWNrLnlUb3AgLSBwYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlCb3Q6IHJlbmRlcmVkT25PbmVQYWdlID8gdGhpcy55Qm90IDogY29tcG9zaXRlQnJpY2sueUJvdCArIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZW5kZXJlZE9uT25lUGFnZSA/IHRoaXMuaGVpZ2h0IDogY29tcG9zaXRlQnJpY2suaGVpZ2h0ICsgMiAqIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUJvcmRlckNvbG9yOiB0aGlzLmZvcm1Cb3JkZXJDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0UGFnZShOdW1iZXIoa2V5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCBib3JkZXJSZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5zZXRQYWdlKGN1cnJlbnRQYWdlTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB1bkZvbGRlZEJyaWNrcy5mb3JFYWNoKChicmljazogUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgIGJyaWNrLmFmdGVyUmVuZGVyQ2FsbGJhY2sgPSBhZnRlclJlbmRlclRleHRCcmlja0NhbGxiYWNrLmJpbmQodGhpcywgYnJpY2spO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnModGhpcy54TGVmdCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gdGhpcy54UmlnaHQpO1xuICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ29sb3JRdWVzdGlvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy50ZXh0QnJpY2sucmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICB9XG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIGlmICh0aGlzLmdldFNob3VsZFJlbmRlclJlYWRPbmx5KCkgJiYgdGhpcy5pbnB1dFR5cGUgIT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHRCcmljay51bmZvbGQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci51bmZvbGQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgdHJhbnNsYXRlWChmdW5jOiBUcmFuc2xhdGVYRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzID0gZnVuYyh0aGlzLnhMZWZ0LCB0aGlzLnhSaWdodCk7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0gcmVzLnhMZWZ0O1xuICAgICAgICB0aGlzLl94UmlnaHQgPSByZXMueFJpZ2h0O1xuICAgICAgICBpZih0aGlzLnRleHRCcmljaykge1xuICAgICAgICAgICAgdGhpcy50ZXh0QnJpY2sudHJhbnNsYXRlWChmdW5jKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WExlZnQodmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVsdGEgPSB2YWwgLSB0aGlzLl94TGVmdDtcbiAgICAgICAgc3VwZXIuc2V0WExlZnQodmFsKTtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnhMZWZ0ID0gdGhpcy50ZXh0QnJpY2sueExlZnQgKyBkZWx0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WFJpZ2h0KHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdmFsIC0gdGhpcy5feFJpZ2h0O1xuICAgICAgICBzdXBlci5zZXRYUmlnaHQodmFsKTtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnhSaWdodCA9IHRoaXMudGV4dEJyaWNrLnhSaWdodCArIGRlbHRhO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXRZVG9wKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdmFsIC0gdGhpcy5feVRvcDtcbiAgICAgICAgc3VwZXIuc2V0WVRvcCh2YWwpO1xuICAgICAgICBpZih0aGlzLnRleHRCcmljaykge1xuICAgICAgICAgICAgdGhpcy50ZXh0QnJpY2sueVRvcCA9IHRoaXMudGV4dEJyaWNrLnlUb3AgKyBkZWx0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WUJvdHRvbSh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBkZWx0YSA9IHZhbCAtIHRoaXMuX3lCb3Q7XG4gICAgICAgIHN1cGVyLnNldFlCb3R0b20odmFsKTtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnlCb3QgPSB0aGlzLnRleHRCcmljay55Qm90ICsgZGVsdGE7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRmaWVsZC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0Ym9sZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFRpdGxlUGFuZWxCcmljayBleHRlbmRzIFRleHRCb2xkQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIHRleHQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRGb250U2l6ZSA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKiBTdXJ2ZXlIZWxwZXIuVElUTEVfUEFORUxfRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBhd2FpdCBzdXBlci5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFBhbmVsTW9kZWwsIFBhZ2VNb2RlbCwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcG9pbnQ6IElQb2ludDtcbiAgICBwdWJsaWMgYnJpY2tzOiBJUGRmQnJpY2tbXTtcbiAgICBwdWJsaWMgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcjtcbiAgICBwdWJsaWMgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnk7XG4gICAgcHVibGljIG1vZHVsZTogYW55O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5LCBtb2R1bGU6IGFueSkge1xuICAgICAgICB0aGlzLnBvaW50ID0gcG9pbnQ7XG4gICAgICAgIHRoaXMuYnJpY2tzID0gYnJpY2tzO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICB0aGlzLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5O1xuICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWRvcm5lcnNPcHRpb25zIGV4dGVuZHMgQWRvcm5lcnNCYXNlT3B0aW9ucyB7XG4gICAgcHVibGljIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocG9pbnQ6IElQb2ludCwgYnJpY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcXVlc3Rpb246IFF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeSwgbW9kdWxlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocG9pbnQsIGJyaWNrcywgY29udHJvbGxlciwgcmVwb3NpdG9yeSwgbW9kdWxlKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBZG9ybmVyc1BhbmVsT3B0aW9ucyBleHRlbmRzIEFkb3JuZXJzQmFzZU9wdGlvbnMge1xuICAgIHB1YmxpYyBwYW5lbDogUGFuZWxNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocG9pbnQ6IElQb2ludCwgYnJpY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcGFuZWw6IFBhbmVsTW9kZWwsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5LCBtb2R1bGU6IGFueSkge1xuICAgICAgICBzdXBlcihwb2ludCwgYnJpY2tzLCBjb250cm9sbGVyLCByZXBvc2l0b3J5LCBtb2R1bGUpO1xuICAgICAgICB0aGlzLnBhbmVsID0gcGFuZWw7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWRvcm5lcnNQYWdlT3B0aW9ucyBleHRlbmRzIEFkb3JuZXJzQmFzZU9wdGlvbnMge1xuICAgIHB1YmxpYyBwYWdlOiBQYWdlTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHBhZ2U6IFBhZ2VNb2RlbCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnksIG1vZHVsZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHBvaW50LCBicmlja3MsIGNvbnRyb2xsZXIsIHJlcG9zaXRvcnksIG1vZHVsZSk7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxufVxuXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXZlbnRfaGFuZGxlci9hZG9ybmVycy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBMb2NhbGl6YWJsZVN0cmluZywgUXVlc3Rpb25Cb29sZWFuTW9kZWwsIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsLCBTdXJ2ZXlNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IEJvb2xlYW5JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuXG5leHBvcnQgY2xhc3MgRmxhdEJvb2xlYW5DaGVja2JveCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkJvb2xlYW5Nb2RlbDtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IG5ldyBCb29sZWFuSXRlbUJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LCBoZWlnaHQsIGhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgcG9pbnQueExlZnQpKTtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IGxvY0xhYmVsVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmlzSW5kZXRlcm1pbmF0ZSA/IG51bGwgOlxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5jaGVja2VkVmFsdWUgPyB0aGlzLnF1ZXN0aW9uLmxvY0xhYmVsVHJ1ZSA6IHRoaXMucXVlc3Rpb24ubG9jTGFiZWxGYWxzZTtcbiAgICAgICAgaWYgKGxvY0xhYmVsVGV4dCAhPT0gbnVsbCAmJiBsb2NMYWJlbFRleHQucmVuZGVyZWRIdG1sICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgICAgICB0ZXh0UG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgbG9jTGFiZWxUZXh0LCBUZXh0QnJpY2spKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUZsYXRdO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBGbGF0Qm9vbGVhbiBleHRlbmRzIEZsYXRSYWRpb2dyb3VwIHtcbiAgICBwcml2YXRlIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+O1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMuYnVpbGRJdGVtcygpO1xuICAgIH1cbiAgICBwcml2YXRlIGJ1aWxkSXRlbXMoKSB7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPig8YW55PnRoaXMucXVlc3Rpb24pO1xuICAgICAgICBjb25zdCBmYWxzZUNob2ljZSA9IG5ldyBJdGVtVmFsdWUoKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikudmFsdWVGYWxzZSAhPT0gdW5kZWZpbmVkID8gKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikudmFsdWVGYWxzZSA6IGZhbHNlKTtcbiAgICAgICAgY29uc3QgdHJ1ZUNob2ljZSA9IG5ldyBJdGVtVmFsdWUoKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikudmFsdWVUcnVlICE9PSB1bmRlZmluZWQgPyAoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS52YWx1ZVRydWUgOiB0cnVlKTtcbiAgICAgICAgZmFsc2VDaG9pY2UubG9jT3duZXIgPSBxdWVzdGlvbjtcbiAgICAgICAgZmFsc2VDaG9pY2Uuc2V0TG9jVGV4dCgoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS5sb2NMYWJlbEZhbHNlKTtcbiAgICAgICAgdHJ1ZUNob2ljZS5sb2NPd25lciA9IHF1ZXN0aW9uO1xuICAgICAgICB0cnVlQ2hvaWNlLnNldExvY1RleHQoKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikubG9jTGFiZWxUcnVlKTtcbiAgICAgICAgdGhpcy5pdGVtcyA9IFtmYWxzZUNob2ljZSwgdHJ1ZUNob2ljZV07XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRWaXNpYmxlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRDb2xDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2Jvb2xlYW4nLCBGbGF0Qm9vbGVhbik7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdib29sZWFuLWNoZWNrYm94JywgRmxhdEJvb2xlYW5DaGVja2JveCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9ib29sZWFuLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCwgUXVlc3Rpb25UYWdib3hNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRTZWxlY3RCYXNlIH0gZnJvbSAnLi9mbGF0X3NlbGVjdGJhc2UnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBDaGVja2JveEl0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0Q2hlY2tib3ggZXh0ZW5kcyBGbGF0U2VsZWN0QmFzZSB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkNoZWNrYm94TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25DaGVja2JveE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgZ2VuZXJhdGVGbGF0SXRlbShyZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogSVBkZkJyaWNrIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGVja2JveEl0ZW1Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHJlY3QsIGl0ZW0sIGluZGV4KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRmxhdFRhZ2JveCBleHRlbmRzIEZsYXRDaGVja2JveCB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblRhZ2JveE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uVGFnYm94TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRWaXNpYmxlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICAgICAgaWYodGhpcy5jb250cm9sbGVyLnRhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnNlbGVjdGVkQ2hvaWNlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRWaXNpYmxlQ2hvaWNlcygpO1xuICAgICAgICB9XG4gICAgfVxufVxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigndGFnYm94JywgRmxhdFRhZ2JveCk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdjaGVja2JveCcsIEZsYXRDaGVja2JveCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY2hlY2tib3gudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQ29tbWVudE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdENvbW1lbnQgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Db21tZW50TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25Db21tZW50TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRydWUsIHsgcm93czogdGhpcy5xdWVzdGlvbi5yb3dzIH0pXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2NvbW1lbnQnLCBGbGF0Q29tbWVudCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY29tbWVudC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25DdXN0b21Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0Q3VzdG9tTW9kZWwgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBmbGF0ID0gRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGUodGhpcy5zdXJ2ZXksIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5nZXRUeXBlKCkpO1xuICAgICAgICByZXR1cm4gZmxhdC5nZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludCk7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdjdXN0b21fbW9kZWwnLCBGbGF0Q3VzdG9tTW9kZWwpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBEcm9wZG93bkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZHJvcGRvd24nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0RHJvcGRvd24gZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Ecm9wZG93bk1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlQnJpY2sgPSAhdGhpcy5zaG91bGRSZW5kZXJBc0NvbW1lbnQgPyBuZXcgRHJvcGRvd25Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKSA6IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0cnVlLCB7IHZhbHVlOiBTdXJ2ZXlIZWxwZXIuZ2V0RHJvcGRvd25RdWVzdGlvblZhbHVlKHRoaXMucXVlc3Rpb24pIH0pO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayh2YWx1ZUJyaWNrKTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBvdGhlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICBvdGhlclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KFxuICAgICAgICAgICAgICAgIG90aGVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgZmFsc2UsIHsgcm93czogU3VydmV5SGVscGVyLk9USEVSX1JPV1NfQ09VTlQgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY29tcG9zaXRlRmxhdF07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdkcm9wZG93bicsIEZsYXREcm9wZG93bik7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZHJvcGRvd24udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0RmllbGRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRmaWVsZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRFeHByZXNzaW9uIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25FeHByZXNzaW9uTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0cnVlLCB7IHZhbHVlOiB0aGlzLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSwgcmVhZE9ubHk6IHRydWUgfSldO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignZXhwcmVzc2lvbicsIEZsYXRFeHByZXNzaW9uKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkZpbGVNb2RlbCwgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVNpemUsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdEZpbGUgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSU1BR0VfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjE5NTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRFWFRfTUlOX1NDQUxFOiBudW1iZXIgPSA1LjA7XG4gICAgcHVibGljIHN0YXRpYyBERUZBVUxUX0lNQUdFX0ZJVDogc3RyaW5nID0gJ2NvbnRhaW4nO1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25GaWxlTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkZpbGVNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRJdGVtKHBvaW50OiBJUG9pbnQsIGl0ZW06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgaW1hZ2VTaXplPzogSVNpemUsXG4gICAgfSk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVMaW5rRmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubmFtZSA9PT0gdW5kZWZpbmVkID8gJ2ltYWdlJyA6IGl0ZW0ubmFtZSwgaXRlbS5jb250ZW50KSk7XG4gICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuY2FuUHJldmlld0ltYWdlKHRoaXMucXVlc3Rpb24sIGl0ZW0sIGl0ZW0uY29udGVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgIGltYWdlUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRGaWxlLklNQUdFX0dBUF9TQ0FMRTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChpbWFnZVBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHsgbGluazogaXRlbS5jb250ZW50LCB3aWR0aDogaXRlbS5pbWFnZVNpemUud2lkdGgsIGhlaWdodDogaXRlbS5pbWFnZVNpemUuaGVpZ2h0LCBvYmplY3RGaXQ6IEZsYXRGaWxlLkRFRkFVTFRfSU1BR0VfRklUIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhZGRMaW5lKHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSwgY3VyclBvaW50OiBJUG9pbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICByb3dzRmxhdHMucHVzaChuZXcgQ29tcG9zaXRlQnJpY2soKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEltYWdlUHJldmlld0NvbnRlbnRXaWR0aChpdGVtOiB7IG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGltYWdlU2l6ZT86IElTaXplIH0pIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGl0ZW0uaW1hZ2VTaXplLndpZHRoLCBGbGF0RmlsZS5URVhUX01JTl9TQ0FMRSAqIHRoaXMuY29udHJvbGxlci51bml0V2lkdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLm5vRmlsZUNob3NlbkNhcHRpb24sIFRleHRCcmljayldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtuZXcgQ29tcG9zaXRlQnJpY2soKV07XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgbGV0IHlCb3Q6IG51bWJlciA9IGN1cnJQb2ludC55VG9wO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBpdGVtOiB7IG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGltYWdlU2l6ZT86IElTaXplIH0gPSB7IC4uLnRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlW2ldIH07XG4gICAgICAgICAgICBjb25zdCBjYW5QcmV2aWV3SW1hZ2UgPSBTdXJ2ZXlIZWxwZXIuY2FuUHJldmlld0ltYWdlKHRoaXMucXVlc3Rpb24sIGl0ZW0sIGl0ZW0uY29udGVudCk7XG4gICAgICAgICAgICBpZiAoY2FuUHJldmlld0ltYWdlKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5pbWFnZVNpemUgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuZ2V0Q29ycmVjdGVkSW1hZ2VTaXplKHRoaXMuY29udHJvbGxlciwgeyBpbWFnZVdpZHRoOiB0aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGgsIGltYWdlSGVpZ2h0OiB0aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0LCBpbWFnZUxpbms6IHRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlW2ldLmNvbnRlbnQsIGRlZmF1bHRJbWFnZVdpZHRoOiAyMDAsIGRlZmF1bHRJbWFnZUhlaWdodDogMTUwIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIGN1cnJQb2ludC54TGVmdDtcbiAgICAgICAgICAgIGlmIChjYW5QcmV2aWV3SW1hZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb3NpdGVXaWR0aCA9IGF3YWl0IHRoaXMuZ2V0SW1hZ2VQcmV2aWV3Q29udGVudFdpZHRoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVXaWR0aCA8IGNvbXBvc2l0ZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTGluZShyb3dzRmxhdHMsIGN1cnJQb2ludCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyhjdXJyUG9pbnQueExlZnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gY3VyclBvaW50LnhMZWZ0IC0gY29tcG9zaXRlV2lkdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oY3VyclBvaW50LCBpdGVtKTtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gaXRlbUZsYXQud2lkdGg7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlV2lkdGggPCB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTGluZShyb3dzRmxhdHMsIGN1cnJQb2ludCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oY3VyclBvaW50LCBpdGVtKTtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gaXRlbUZsYXQueFJpZ2h0IC0gaXRlbUZsYXQueExlZnQ7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2ZpbGUnLCBGbGF0RmlsZSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZmlsZS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25IdG1sTW9kZWwsIFNlcmlhbGl6ZXIgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZW1wdHknO1xuXG5leHBvcnQgdHlwZSBJSFRNTFJlbmRlclR5cGUgPSAnYXV0bycgfCAnc3RhbmRhcmQnIHwgJ2ltYWdlJztcbmV4cG9ydCBjbGFzcyBGbGF0SFRNTCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkh0bWxNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBwcml2YXRlIGNob29zZVJlbmRlcihodG1sOiBzdHJpbmcpOiBJSFRNTFJlbmRlclR5cGUge1xuICAgICAgICBpZiAoLzxbXj5dKnN0eWxlW148XSo+Ly50ZXN0KGh0bWwpIHx8XG4gICAgICAgICAgICAvPFtePl0qdGFibGVbXjxdKj4vLnRlc3QoaHRtbCkgfHxcbiAgICAgICAgICAgIC8mXFx3KzsvLnRlc3QoaHRtbCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnaW1hZ2UnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnc3RhbmRhcmQnO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNvcnJlY3RIdG1sUnVsZXM6IFt7IHNlYXJjaFJlZ0V4cDogUmVnRXhwLCByZXBsYWNlU3RyaW5nOiBzdHJpbmcgfV0gPSBbXG4gICAgICAgIHsgc2VhcmNoUmVnRXhwOiAvKDxcXC8/YnJcXHMqP1xcLz9cXHMqPz5cXHMqKXsyLH0vZywgcmVwbGFjZVN0cmluZzogJzxicj4nIH1cbiAgICBdXG4gICAgcHJvdGVjdGVkIGNvcnJlY3RIdG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIEZsYXRIVE1MLmNvcnJlY3RIdG1sUnVsZXMuZm9yRWFjaCgocnVsZSkgPT4ge1xuICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZShydWxlLnNlYXJjaFJlZ0V4cCwgcnVsZS5yZXBsYWNlU3RyaW5nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgbGV0IHJlbmRlckFzOiBJSFRNTFJlbmRlclR5cGUgPSA8SUhUTUxSZW5kZXJUeXBlPnRoaXMucXVlc3Rpb24ucmVuZGVyQXM7XG4gICAgICAgIGlmKCFTdXJ2ZXlIZWxwZXIuaGFzRG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IEVtcHR5QnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIDAsIDApKV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnYXV0bycpIHJlbmRlckFzID0gdGhpcy5jb250cm9sbGVyLmh0bWxSZW5kZXJBcztcbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnYXV0bycpIHJlbmRlckFzID0gdGhpcy5jaG9vc2VSZW5kZXIoU3VydmV5SGVscGVyLmdldExvY1N0cmluZyh0aGlzLnF1ZXN0aW9uLmxvY0h0bWwpKTtcbiAgICAgICAgY29uc3QgaHRtbDogc3RyaW5nID0gU3VydmV5SGVscGVyLmNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKHRoaXMucXVlc3Rpb24ubG9jSHRtbCksIHRoaXMuY29udHJvbGxlciwgcmVuZGVyQXMpO1xuICAgICAgICBpZiAocmVuZGVyQXMgPT09ICdpbWFnZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICBjb25zdCB7IHVybCwgYXNwZWN0IH06IHsgdXJsOiBzdHJpbmcsIGFzcGVjdDogbnVtYmVyIH0gPVxuICAgICAgICAgICAgYXdhaXQgU3VydmV5SGVscGVyLmh0bWxUb0ltYWdlKGh0bWwsIHdpZHRoLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB3aWR0aCAvIGFzcGVjdDtcbiAgICAgICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6IHVybCwgd2lkdGgsIGhlaWdodCB9KV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtTdXJ2ZXlIZWxwZXIuc3BsaXRIdG1sUmVjdCh0aGlzLmNvbnRyb2xsZXIsIGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVIVE1MRmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMuY29ycmVjdEh0bWwoaHRtbCkpKV07XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdodG1sJywgJ3JlbmRlckFzJyk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdodG1sJywge1xuICAgIG5hbWU6ICdyZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICdzdGFuZGFyZCcsICdpbWFnZSddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2h0bWwnLCBGbGF0SFRNTCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25JbWFnZU1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciwgSVNpemUgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRJbWFnZSBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkltYWdlTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkltYWdlTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2V0Q29ycmVjdEltYWdlU2l6ZSgpOiBQcm9taXNlPElTaXplPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBTdXJ2ZXlIZWxwZXIuZ2V0Q29ycmVjdGVkSW1hZ2VTaXplKHRoaXMuY29udHJvbGxlciwgeyBpbWFnZVdpZHRoOiB0aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGgsIGltYWdlSGVpZ2h0OiB0aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0LCBpbWFnZUxpbms6IHRoaXMucXVlc3Rpb24uaW1hZ2VMaW5rIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgaW1hZ2VTaXplID0gYXdhaXQgdGhpcy5nZXRDb3JyZWN0SW1hZ2VTaXplKCk7XG4gICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbixcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiB0aGlzLnF1ZXN0aW9uLmltYWdlTGluaywgd2lkdGg6IGltYWdlU2l6ZS53aWR0aCwgaGVpZ2h0OiBpbWFnZVNpemUuaGVpZ2h0IH0pXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2ltYWdlJywgRmxhdEltYWdlKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgRmxhdFJhZGlvZ3JvdXAgfSBmcm9tICcuL2ZsYXRfcmFkaW9ncm91cCc7XG5pbXBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRJbWFnZVBpY2tlciBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWw7XG4gICAgcHJvdGVjdGVkIHJhZGlvOiBGbGF0UmFkaW9ncm91cDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRJdGVtKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHBhZ2VBdmFpbGFibGVXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgY29uc3QgaW1hZ2VGbGF0ID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6ICg8YW55Pml0ZW0pLmltYWdlTGluaywgd2lkdGg6IHBhZ2VBdmFpbGFibGVXaWR0aCwgaGVpZ2h0OiBwYWdlQXZhaWxhYmxlV2lkdGggLyBTdXJ2ZXlIZWxwZXIuSU1BR0VQSUNLRVJfUkFUSU8gfSk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGltYWdlRmxhdCk7XG4gICAgICAgIGxldCBidXR0b25Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5zaG93TGFiZWwpIHtcbiAgICAgICAgICAgIGxldCBsYWJlbEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChidXR0b25Qb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLnRleHQgfHwgaXRlbS52YWx1ZSwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sobGFiZWxGbGF0KTtcbiAgICAgICAgICAgIGJ1dHRvblBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGxhYmVsRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgY29uc3QgYnV0dG9uUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChidXR0b25Qb2ludCwgcGFnZUF2YWlsYWJsZVdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5tdWx0aVNlbGVjdCkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhuZXcgQ2hlY2tJdGVtQnJpY2sodGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIGJ1dHRvblJlY3QsIHRoaXMucXVlc3Rpb24uaWQgKyAnaW5kZXgnICsgaW5kZXgsIHsgcmVhZE9ubHk6IHRoaXMucXVlc3Rpb24uaXNSZWFkT25seSB8fCAhaXRlbS5pc0VuYWJsZWQsIHF1ZXN0aW9uOiB0aGlzLnF1ZXN0aW9uLCBpdGVtOiBpdGVtLCBjaGVja2VkOiB0aGlzLnF1ZXN0aW9uLnZhbHVlLmluZGV4T2YoaXRlbS52YWx1ZSkgIT09IC0xLCBpbmRleDogaW5kZXggfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayh0aGlzLnJhZGlvLmdlbmVyYXRlRmxhdEl0ZW0oYnV0dG9uUmVjdCwgaXRlbSwgaW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHRoaXMucmFkaW8gPSB0aGlzLnF1ZXN0aW9uLm11bHRpU2VsZWN0ID8gbnVsbCA6XG4gICAgICAgICAgICBuZXcgRmxhdFJhZGlvZ3JvdXAodGhpcy5zdXJ2ZXksIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtuZXcgQ29tcG9zaXRlQnJpY2soKV07XG4gICAgICAgIGNvbnN0IGNvbFdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0SW1hZ2VQaWNrZXJBdmFpbGFibGVXaWR0aChcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcikgLyBTdXJ2ZXlIZWxwZXIuSU1BR0VQSUNLRVJfQ09VTlQ7XG4gICAgICAgIGxldCBjb2xzOiBudW1iZXIgPSB+fihTdXJ2ZXlIZWxwZXIuXG4gICAgICAgICAgICBnZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAvIGNvbFdpZHRoKSB8fCAxO1xuICAgICAgICBjb25zdCBjb3VudDogbnVtYmVyID0gdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7XG4gICAgICAgIGNvbHMgPSBjb2xzIDw9IGNvdW50ID8gY29scyA6IGNvdW50O1xuICAgICAgICBjb25zdCByb3dzOiBudW1iZXIgPSB+fihNYXRoLmNlaWwoY291bnQgLyBjb2xzKSk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgICAgICAgICAgbGV0IHlCb3Q6IG51bWJlciA9IGN1cnJQb2ludC55VG9wO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICBsZXQgY3Vyck1hcmdpbkxlZnQ6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgY29sczsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXg6IG51bWJlciA9IGkgKiBjb2xzICsgajtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gY291bnQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjdXJyTWFyZ2luTGVmdDtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgY3Vyck1hcmdpbkxlZnQgLSBjb2xXaWR0aDtcbiAgICAgICAgICAgICAgICBjdXJyTWFyZ2luTGVmdCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXNbaW5kZXhdLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgaWYgKGkgIT09IHJvd3MgLSAxKSB7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KGN1cnJQb2ludCwgdGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdpbWFnZXBpY2tlcicsIEZsYXRJbWFnZVBpY2tlcik7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2VwaWNrZXIudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uTWF0cml4TW9kZWwsIE1hdHJpeFJvd01vZGVsLFxuICAgIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsLCBJdGVtVmFsdWUsIFNlcmlhbGl6ZXIgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciwgSVBvaW50LCBJUmVjdCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmFkaW9ncm91cCB9IGZyb20gJy4vZmxhdF9yYWRpb2dyb3VwJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRNYXRyaXggZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgR0FQX0JFVFdFRU5fUk9XUzogbnVtYmVyID0gMC41O1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhNb2RlbDtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgPFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsPnF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbk1hdHJpeE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0c0hlYWRlcihwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBoZWFkZXJzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24uaGFzUm93cykge1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMucm93VGl0bGVXaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gY3VyclBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKz0gKFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAtIHRoaXMuY29sdW1uV2lkdGgpO1xuICAgICAgICAgICAgaGVhZGVycy5wdXNoKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVCb2xkVGV4dEZsYXQoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1uc1tpXS5sb2NUZXh0KSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gdGhpcy5jb2x1bW5XaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9zaXRlQnJpY2s6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmhlYWRlcnMpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUJyaWNrKSwgdGhpcy5jb250cm9sbGVyKV07XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzUm93cyhwb2ludDogSVBvaW50LCBpc1ZlcnRpY2FsOiBib29sZWFuKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleTogc3RyaW5nID0gJ3JvdycgKyBpO1xuICAgICAgICAgICAgY29uc3QgZmxhdHNSb3c6IElQZGZCcmlja1tdID0gYXdhaXQgbmV3IEZsYXRNYXRyaXhSb3codGhpcy5zdXJ2ZXksIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLnZpc2libGVSb3dzW2ldLCBpLCBrZXksIGkgPT0gMCwgaXNWZXJ0aWNhbCwgdGhpcy5yb3dUaXRsZVdpZHRoLCB0aGlzLmNvbHVtbldpZHRoKS5nZW5lcmF0ZUZsYXRzQ29udGVudChjdXJyUG9pbnQpO1xuICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmZsYXRzUm93KSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRNYXRyaXguR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIGNlbGxzLnB1c2goLi4uZmxhdHNSb3cpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG4gICAgcHJpdmF0ZSByb3dUaXRsZVdpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBjb2x1bW5XaWR0aDogbnVtYmVyO1xuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29sdW1uc1dpZHRoZXMoKSB7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICBpZih0aGlzLnF1ZXN0aW9uLmhhc1Jvd3MgJiYgdGhpcy5xdWVzdGlvbi5yb3dUaXRsZVdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIHRoaXMucm93VGl0bGVXaWR0aCA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKHRoaXMucXVlc3Rpb24ucm93VGl0bGVXaWR0aCwgYXZhaWxhYmxlV2lkdGgpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSAodGhpcy5yb3dUaXRsZVdpZHRoICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9DT0xVTU5TKTtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uV2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0Q29sdW1uV2lkdGgodGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zLmxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5XaWR0aCA9IHRoaXMucm93VGl0bGVXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRDb2x1bW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoICsgKHRoaXMucXVlc3Rpb24uaGFzUm93cyA/IDEgOiAwKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQ29sdW1uc1dpZHRoZXMoKTtcbiAgICAgICAgY29uc3QgaXNWZXJ0aWNhbDogYm9vbGVhbiA9IHRoaXMucXVlc3Rpb24ucmVuZGVyQXMgPT09ICdsaXN0JyB8fCB0aGlzLmNvbnRyb2xsZXIubWF0cml4UmVuZGVyQXMgPT09ICdsaXN0JyB8fFxuICAgICAgICAgICAgdGhpcy5jb2x1bW5XaWR0aCA8IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGg7XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBpZiAoIWlzVmVydGljYWwgJiYgdGhpcy5xdWVzdGlvbi5zaG93SGVhZGVyICYmIHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0hlYWRlcihjdXJyUG9pbnQpO1xuICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmhlYWRlcnMpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IEZsYXRNYXRyaXguR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgY2VsbHMucHVzaCguLi5oZWFkZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBjZWxscy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1Jvd3MoY3VyclBvaW50LCBpc1ZlcnRpY2FsKSk7XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4Um93IGV4dGVuZHMgRmxhdFJhZGlvZ3JvdXAge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbk1hdHJpeDogUXVlc3Rpb25NYXRyaXhNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcHJpdmF0ZSByb3c6IE1hdHJpeFJvd01vZGVsLCBwcml2YXRlIHJvd0luZGV4OiBudW1iZXIsXG4gICAgICAgIHByaXZhdGUga2V5OiBzdHJpbmcsIHByb3RlY3RlZCBpc0ZpcnN0OiBib29sZWFuID0gZmFsc2UsIHByb3RlY3RlZCBpc1ZlcnRpY2FsOiBib29sZWFuID0gZmFsc2UsIHByaXZhdGUgcm93VGl0bGVXaWR0aDogbnVtYmVyLCBwcml2YXRlIGNvbHVtbldpZHRoOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb25NYXRyaXggPSA8UXVlc3Rpb25NYXRyaXhNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmVydGljYWwgP1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzVmVydGljYWxseUNlbGxzKHBvaW50KSA6XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNIb3Jpem9udGFsbHlDZWxscyhwb2ludCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZVRleHRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgY29sdW1uOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQ6IGJvb2xlYW4gPSB0aGlzLnJvdy52YWx1ZSA9PSBjb2x1bW4udmFsdWU7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QoY3VyclBvaW50LFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IHJhZGlvRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKGl0ZW1SZWN0LCBjb2x1bW4sIGluZGV4LCB0aGlzLmtleSwgY2hlY2tlZCwgeyByb3c6IHRoaXMucm93LCByb3dJbmRleDogdGhpcy5yb3dJbmRleCB9KTtcbiAgICAgICAgY3VyclBvaW50LnlUb3AgPSByYWRpb0ZsYXQueUJvdCArIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgY2VsbFRleHRGbGF0ID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeCwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbk1hdHJpeC5nZXRDZWxsRGlzcGxheUxvY1RleHQodGhpcy5yb3cubmFtZSwgY29sdW1uKSwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhyYWRpb0ZsYXQsIGNlbGxUZXh0RmxhdCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUl0ZW1Db21wb2lzdGUocG9pbnQ6IElQb2ludCwgY29sdW1uOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQ6IGJvb2xlYW4gPSB0aGlzLnJvdy52YWx1ZSA9PSBjb2x1bW4udmFsdWU7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KGN1cnJQb2ludCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IHJhZGlvRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgaXRlbVJlY3QueExlZnQpLCBjb2x1bW4sIGluZGV4LCB0aGlzLmtleSwgY2hlY2tlZCwgeyByb3c6IHRoaXMucm93LCByb3dJbmRleDogdGhpcy5yb3dJbmRleCB9KTtcbiAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcmFkaW9GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCByYWRpb1RleHQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGNvbHVtbi5sb2NUZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKHJhZGlvRmxhdCwgcmFkaW9UZXh0KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdHNIb3Jpem9udGFsbHlDZWxscyhwb2ludDogSVBvaW50KSB7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc1Jvd3MpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ICs9IChTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLSB0aGlzLnJvd1RpdGxlV2lkdGgpO1xuICAgICAgICAgICAgY2VsbHMucHVzaChhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucm93LmxvY1RleHQsIFRleHRCcmljaykpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMucm93VGl0bGVXaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb25NYXRyaXgudmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbjogSXRlbVZhbHVlID0gdGhpcy5xdWVzdGlvbk1hdHJpeC52aXNpYmxlQ29sdW1uc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrZWQ6IGJvb2xlYW4gPSB0aGlzLnJvdy52YWx1ZSA9PSBjb2x1bW4udmFsdWU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjdXJyUG9pbnQueExlZnQ7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSAoU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpIC0gdGhpcy5jb2x1bW5XaWR0aCk7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNDZWxsVGV4dCkge1xuICAgICAgICAgICAgICAgIGNlbGxzLnB1c2goYXdhaXQgdGhpcy5nZW5lcmF0ZVRleHRDb21wb3NpdGUoY3VyclBvaW50LCBjb2x1bW4sIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KGN1cnJQb2ludCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBjZWxscy5wdXNoKHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgY3VyclBvaW50LnhMZWZ0KSwgY29sdW1uLCBpLCB0aGlzLmtleSwgY2hlY2tlZCwgeyByb3c6IHRoaXMucm93LCByb3dJbmRleDogdGhpcy5yb3dJbmRleCB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gdGhpcy5jb2x1bW5XaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soLi4uY2VsbHMpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUJyaWNrKSwgdGhpcy5jb250cm9sbGVyKV07XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzVmVydGljYWxseUNlbGxzKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc1Jvd3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd1RleHRGbGF0ID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeCxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucm93LmxvY1RleHQsIFRleHRCcmljayk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd1RleHRGbGF0LnlCb3QgKyBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRSAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgY2VsbHMucHVzaChyb3dUZXh0RmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUgPSAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNDZWxsVGV4dCkgPyB0aGlzLmdlbmVyYXRlVGV4dENvbXBvc2l0ZSA6IHRoaXMuZ2VuZXJhdGVJdGVtQ29tcG9pc3RlO1xuICAgICAgICBjZWxscy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVWZXJ0aWNhbGx5SXRlbXMoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LnZpc2libGVDb2x1bW5zKSk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayguLi5jZWxscyk7XG4gICAgICAgIHJldHVybiBbY29tcG9zaXRlQnJpY2ssIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlQnJpY2spLCB0aGlzLmNvbnRyb2xsZXIpXTtcbiAgICB9XG59XG5cblNlcmlhbGl6ZXIucmVtb3ZlUHJvcGVydHkoJ21hdHJpeCcsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnbWF0cml4Jywge1xuICAgIG5hbWU6ICdyZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICdsaXN0J11cbn0pO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignbWF0cml4JywgRmxhdE1hdHJpeCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IEZsYXRNYXRyaXhNdWx0aXBsZSB9IGZyb20gJy4vZmxhdF9tYXRyaXhtdWx0aXBsZSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4RHluYW1pYyBleHRlbmRzIEZsYXRNYXRyaXhNdWx0aXBsZSB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBmYWxzZSk7XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdtYXRyaXhkeW5hbWljJywgJ3JlbmRlckFzJyk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdtYXRyaXhkeW5hbWljJywge1xuICAgIG5hbWU6ICdyZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICdsaXN0J11cbn0pO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignbWF0cml4ZHluYW1pYycsIEZsYXRNYXRyaXhEeW5hbWljKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhkeW5hbWljLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsLCBNdWx0aXBsZVRleHRJdGVtTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uLCBJRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0VGV4dGJveCB9IGZyb20gJy4vZmxhdF90ZXh0Ym94JztcblxuZXhwb3J0IGNsYXNzIEZsYXRNdWx0aXBsZVRleHQgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUk9XU19HQVBfU0NBTEU6IG51bWJlciA9IDAuMTk1O1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFZpc2libGVSb3dzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5nZXRSb3dzKCkuZmlsdGVyKHJvdyA9PiByb3cuaXNWaXNpYmxlKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRJdGVtKHBvaW50OiBJUG9pbnQsIHJvd19pbmRleDogbnVtYmVyLCBjb2xfaW5kZXg6IG51bWJlcixcbiAgICAgICAgaXRlbTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29sV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbFdpZHRoICogU3VydmV5SGVscGVyLk1VTFRJUExFVEVYVF9URVhUX1BFUlM7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5cbiAgICAgICAgICAgIGNyZWF0ZUJvbGRUZXh0RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmxvY1RpdGxlKSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG5cbiAgICAgICAgY29uc3QgZmxhdE11bHRpcGxlVGV4dEl0ZW1RdWVzdGlvbjogSUZsYXRRdWVzdGlvbiA9IEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlKFxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIGl0ZW0uZWRpdG9yLCB0aGlzLmNvbnRyb2xsZXIsICd0ZXh0Jyk7XG4gICAgICAgIGNvbnN0IGl0ZW1Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGaWVsZFJlY3Qoe1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0ICsgY29sV2lkdGggKiBTdXJ2ZXlIZWxwZXIuTVVMVElQTEVURVhUX1RFWFRfUEVSUywgeVRvcDogcG9pbnQueVRvcCB9LFxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKC4uLmF3YWl0ICg8RmxhdFRleHRib3g+ZmxhdE11bHRpcGxlVGV4dEl0ZW1RdWVzdGlvbikuZ2VuZXJhdGVGbGF0c0NvbnRlbnQoaXRlbVBvaW50KSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCByb3dzID0gdGhpcy5nZXRWaXNpYmxlUm93cygpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICAgICAgbGV0IHlCb3Q6IG51bWJlciA9IGN1cnJQb2ludC55VG9wO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgcm93c1tpXS5jZWxscy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDb2x1bW5NYXJnaW5zKHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5jb2xDb3VudCwgaik7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIGksIGosIHJvd3NbaV0uY2VsbHNbal0uaXRlbSk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRNdWx0aXBsZVRleHQuUk9XU19HQVBfU0NBTEU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ211bHRpcGxldGV4dCcsIEZsYXRNdWx0aXBsZVRleHQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X211bHRpcGxldGV4dC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRQYW5lbER5bmFtaWMgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdBUF9CRVRXRUVOX1BBTkVMUzogbnVtYmVyID0gMC43NTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChjb25zdCBwYW5lbCBvZiB0aGlzLnF1ZXN0aW9uLnBhbmVscykge1xuICAgICAgICAgICAgY29uc3QgcGFuZWxGbGF0czogSVBkZkJyaWNrW10gPSBhd2FpdCBGbGF0U3VydmV5LmdlbmVyYXRlRmxhdHNQYW5lbChcbiAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgdGhpcy5jb250cm9sbGVyLCBwYW5lbCwgY3VyclBvaW50KTtcbiAgICAgICAgICAgIGlmIChwYW5lbEZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4ucGFuZWxGbGF0cykueUJvdDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRQYW5lbER5bmFtaWMuR0FQX0JFVFdFRU5fUEFORUxTO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4ucGFuZWxGbGF0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncGFuZWxkeW5hbWljJywgRmxhdFBhbmVsRHluYW1pYyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uUmFua2luZ01vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFJhbmtpbmdJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYW5raW5naXRlbSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IENvbG9yZWRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbG9yZWRicmljayc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UmFua2luZyBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblJhbmtpbmdNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblJhbmtpbmdNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdENvbXBvc2l0ZShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIsIHVucmFua2VkSXRlbTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IGl0ZW1TY2FsZWRSZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5tb3ZlUmVjdChTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KFxuICAgICAgICAgICAgaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgcG9pbnQueExlZnQpO1xuICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gbmV3IFJhbmtpbmdJdGVtQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgaXRlbVNjYWxlZFJlY3QsIHVucmFua2VkSXRlbSA/ICctJyA6IHRoaXMucXVlc3Rpb24uZ2V0TnVtYmVyQnlJbmRleChpbmRleCkpO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCB0ZXh0RmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubG9jVGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhpdGVtRmxhdCwgdGV4dEZsYXQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVDaG9pY2VzQ29sdW1uKHBvaW50OiBJUG9pbnQsIGNob2ljZXM6IEl0ZW1WYWx1ZVtdLCB1bnJhbmtlZENob2ljZXM6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdENvbXBvc2l0ZShjdXJyUG9pbnQsIGNob2ljZXNbaV0sIGksIHVucmFua2VkQ2hvaWNlcyk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGl0ZW1GbGF0LnlCb3QgKyBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgZmxhdHMucHVzaChpdGVtRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVTZWxlY3RUb1JhbmtJdGVtc1ZlcnRpY2FsbHkocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVDaG9pY2VzQ29sdW1uKGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbi5yYW5raW5nQ2hvaWNlcykpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBmbGF0c1tmbGF0cy5sZW5ndGggLSAxXS55Qm90ICsgMiAqIChTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXBhcmF0b3JSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3Qoe1xuICAgICAgICAgICAgeExlZnQ6IGN1cnJQb2ludC54TGVmdCxcbiAgICAgICAgICAgIHlUb3A6IGN1cnJQb2ludC55VG9wIC0gKFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpIC0gMC41LFxuICAgICAgICB9LCB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IC0gY3VyclBvaW50LnhMZWZ0LCAxKTtcbiAgICAgICAgZmxhdHMucHVzaChuZXcgQ29sb3JlZEJyaWNrKHRoaXMuY29udHJvbGxlciwgc2VwYXJhdG9yUmVjdCwgU3VydmV5SGVscGVyLkZPUk1fQk9SREVSX0NPTE9SKSk7XG5cbiAgICAgICAgZmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlQ2hvaWNlc0NvbHVtbihjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb24udW5SYW5raW5nQ2hvaWNlcywgdHJ1ZSkpO1xuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZVNlbGVjdFRvUmFua0l0ZW1zSG9yaXpvbnRhbGx5KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbENvdW50ID0gMjtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3Qgcm93c0NvdW50ID0gTWF0aC5tYXgodGhpcy5xdWVzdGlvbi51blJhbmtpbmdDaG9pY2VzLmxlbmd0aCwgdGhpcy5xdWVzdGlvbi5yYW5raW5nQ2hvaWNlcy5sZW5ndGgpO1xuICAgICAgICBsZXQgcm93OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93c0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjb2xJbmRleCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIFt0aGlzLnF1ZXN0aW9uLnVuUmFua2luZ0Nob2ljZXNbaV0sIHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXNbaV1dKSB7XG4gICAgICAgICAgICAgICAgaWYoISFpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0LCB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDb2x1bW5NYXJnaW5zKHRoaXMuY29udHJvbGxlciwgY29sQ291bnQsIGNvbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBpdGVtLCBpLCBjb2xJbmRleCA9PSAwKTtcbiAgICAgICAgICAgICAgICAgICAgcm93LmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJvd0xpbmVGbGF0OiBJUGRmQnJpY2sgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHJvdyksIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKHJvdywgcm93TGluZUZsYXQpO1xuICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9yUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHtcbiAgICAgICAgICAgICAgICB4TGVmdDogdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAvIDIgLSAwLjUsXG4gICAgICAgICAgICAgICAgeVRvcDogY3VyclBvaW50LnlUb3AsXG4gICAgICAgICAgICB9LCAwLCAwKTtcbiAgICAgICAgICAgIHJvdy5hZGRCcmljayhuZXcgQ29sb3JlZEJyaWNrKHRoaXMuY29udHJvbGxlciwgc2VwYXJhdG9yUmVjdCwgU3VydmV5SGVscGVyLkZPUk1fQk9SREVSX0NPTE9SLCAxLCByb3dMaW5lRmxhdC55Qm90IC0gY3VyclBvaW50LnlUb3AgKyAoaSAhPT0gcm93c0NvdW50IC0gMSA/XG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCA6IDApKSk7XG5cbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gcm93TGluZUZsYXQueUJvdCArXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIHJvdyA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmKCF0aGlzLnF1ZXN0aW9uLnNlbGVjdFRvUmFua0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ2hvaWNlc0NvbHVtbihwb2ludCwgdGhpcy5xdWVzdGlvbi5yYW5raW5nQ2hvaWNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZih0aGlzLnF1ZXN0aW9uLnNlbGVjdFRvUmFua0FyZWFzTGF5b3V0ID09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2VsZWN0VG9SYW5rSXRlbXNWZXJ0aWNhbGx5KHBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2VsZWN0VG9SYW5rSXRlbXNIb3Jpem9udGFsbHkocG9pbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdyYW5raW5nJywgRmxhdFJhbmtpbmcpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25SYXRpbmdNb2RlbCwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdFJhdGluZyBleHRlbmRzIEZsYXRSYWRpb2dyb3VwIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb25SYXRpbmc6IFF1ZXN0aW9uUmF0aW5nTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcgPSA8UXVlc3Rpb25SYXRpbmdNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdEhvcmlzb250YWxDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgaXRlbVRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gU3VydmV5SGVscGVyLmdldFJhdGluZ0l0ZW1UZXh0KFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZywgaW5kZXgsIGl0ZW0ubG9jVGV4dCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICBjb25zdCBoYWxmV2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggLyAyLjA7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gaGFsZldpZHRoO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSBoYWxmV2lkdGg7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ICs9IGhhbGZXaWR0aDtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLlxuICAgICAgICAgICAgY3JlYXRlQm9sZFRleHRGbGF0KHRleHRQb2ludCwgdGhpcy5xdWVzdGlvblJhdGluZywgdGhpcy5jb250cm9sbGVyLCBpdGVtVGV4dCkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICBsZXQgdGV4dFdpZHRoOiBudW1iZXIgPSBjb21wb3NpdGVGbGF0LndpZHRoO1xuICAgICAgICBpZiAodGV4dFdpZHRoIDwgU3VydmV5SGVscGVyLmdldFJhdGluZ01pbldpZHRoKHRoaXMuY29udHJvbGxlcikpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQueExlZnQgKz0gKFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aChcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIpIC0gdGV4dFdpZHRoKSAvIDIuMCAtIGhhbGZXaWR0aDtcbiAgICAgICAgICAgIHRleHRXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGV4dFdpZHRoICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmFkaW9Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICByYWRpb1BvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sodGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KFxuICAgICAgICAgICAgcmFkaW9Qb2ludCwgdGV4dFdpZHRoLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCksIGl0ZW0sIGluZGV4LCB1bmRlZmluZWQsIHRoaXMucXVlc3Rpb24udmFsdWUgPT0gaXRlbS52YWx1ZSkpO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdENvbXBvc2l0ZShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChpdGVtUmVjdCwgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLFxuICAgICAgICAgICAgcG9pbnQueExlZnQpLCBpdGVtLCBpbmRleCwgdW5kZWZpbmVkLCB0aGlzLnF1ZXN0aW9uLnZhbHVlID09IGl0ZW0udmFsdWUpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgaXRlbVRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gU3VydmV5SGVscGVyLmdldFJhdGluZ0l0ZW1UZXh0KHRoaXMucXVlc3Rpb25SYXRpbmcsIGluZGV4LCBpdGVtLmxvY1RleHQpO1xuICAgICAgICBpdGVtVGV4dCA9PSBudWxsIHx8IGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW1UZXh0LCBUZXh0QnJpY2spKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUhvcmlzb250YWxseUl0ZW1zKHBvaW50OiBJUG9pbnQpIHtcbiAgICAgICAgY29uc3Qgcm93c0ZsYXRzOiBDb21wb3NpdGVCcmlja1tdID0gW25ldyBDb21wb3NpdGVCcmljaygpXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SG9yaXNvbnRhbENvbXBvc2l0ZShjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlc1tpXSwgaSk7XG4gICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRXaWR0aDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IC0gaXRlbUZsYXQueFJpZ2h0O1xuICAgICAgICAgICAgaWYgKFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIpIDw9IGxlZnRXaWR0aCArIFN1cnZleUhlbHBlci5FUFNJTE9OKSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBpdGVtRmxhdC55Qm90O1xuICAgICAgICAgICAgICAgIGlmIChpICE9PSB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93c0ZsYXRzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgbGV0IGlzVmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1UZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdJdGVtVGV4dChcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uUmF0aW5nLCBpLCB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzW2ldLmxvY1RleHQpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChpdGVtVGV4dCkud2lkdGggPiB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLlJBVElOR19DT0xVTU5fV0lEVEgpLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgaXNWZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzVmVydGljYWwgPyB0aGlzLmdlbmVyYXRlVmVydGljYWxseUl0ZW1zKHBvaW50LCB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzKSA6IHRoaXMuZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludCk7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdyYXRpbmcnLCBGbGF0UmF0aW5nKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYXRpbmcudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyLCBJUmVjdCwgSVNpemUgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgSUJvcmRlckRlc2NyaXB0aW9uLCBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IEVtcHR5QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9lbXB0eSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0U2lnbmF0dXJlUGFkIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWw7XG4gICAgcHVibGljIHN0YXRpYyBCT1JERVJfU1RZTEU6ICdkYXNoZWQnIHwgJ3NvbGlkJyB8ICdub25lJyA9ICdkYXNoZWQnO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVCYWNrZ3JvdW5kSW1hZ2UocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHsgbGluazogdGhpcy5xdWVzdGlvbi5iYWNrZ3JvdW5kSW1hZ2UsIHdpZHRoOiBTdXJ2ZXlIZWxwZXIucHhUb1B0KDxhbnk+dGhpcy5xdWVzdGlvbi5zaWduYXR1cmVXaWR0aCksIGhlaWdodDogU3VydmV5SGVscGVyLnB4VG9QdCg8YW55PnRoaXMucXVlc3Rpb24uc2lnbmF0dXJlSGVpZ2h0KSwgb2JqZWN0Rml0OiAnY292ZXInIH0sIHRydWUpO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFNpZ25JbWFnZVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uc3RvcmVEYXRhQXNUZXh0IHx8ICF0aGlzLnF1ZXN0aW9uLmxvYWRlZERhdGEgPyB0aGlzLnF1ZXN0aW9uLnZhbHVlIDogdGhpcy5xdWVzdGlvbi5sb2FkZWREYXRhO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVTaWduKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCB3aWR0aCA9IFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLnNpZ25hdHVyZVdpZHRoKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gU3VydmV5SGVscGVyLnB4VG9QdCg8YW55PnRoaXMucXVlc3Rpb24uc2lnbmF0dXJlSGVpZ2h0KTtcbiAgICAgICAgbGV0IGJyaWNrOiBQZGZCcmljaztcbiAgICAgICAgaWYodGhpcy5xdWVzdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgYnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KHBvaW50LFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiB0aGlzLmdldFNpZ25JbWFnZVVybCgpLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0IH0sIGZhbHNlXG4gICAgICAgICAgICApIGFzIFBkZkJyaWNrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJpY2sgPSBuZXcgRW1wdHlCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCwgd2lkdGgsIGhlaWdodCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmKEZsYXRTaWduYXR1cmVQYWQuQk9SREVSX1NUWUxFICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGJyaWNrLmFmdGVyUmVuZGVyQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9yZGVyT3B0aW9uczogSUJvcmRlckRlc2NyaXB0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGJyaWNrLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogYnJpY2sud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHlUb3A6IGJyaWNrLnlUb3AsXG4gICAgICAgICAgICAgICAgICAgIHlCb3Q6IGJyaWNrLnlCb3QsXG4gICAgICAgICAgICAgICAgICAgIHhMZWZ0OiBicmljay54TGVmdCxcbiAgICAgICAgICAgICAgICAgICAgeFJpZ2h0OiBicmljay54UmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Cb3JkZXJDb2xvcjogYnJpY2suZm9ybUJvcmRlckNvbG9yLFxuICAgICAgICAgICAgICAgICAgICByb3VuZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgb3V0c2lkZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZGFzaFN0eWxlOiBGbGF0U2lnbmF0dXJlUGFkLkJPUkRFUl9TVFlMRSA9PSAnZGFzaGVkJyA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hBcnJheTogWzVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGFzaFBoYXNlOiAwXG4gICAgICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIGJvcmRlck9wdGlvbnMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBicmljaztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgaWYodGhpcy5xdWVzdGlvbi5iYWNrZ3JvdW5kSW1hZ2UpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUJyaWNrLmFkZEJyaWNrKGF3YWl0IHRoaXMuZ2VuZXJhdGVCYWNrZ3JvdW5kSW1hZ2UocG9pbnQpKTtcbiAgICAgICAgfVxuICAgICAgICBjb21wb3NpdGVCcmljay5hZGRCcmljayhhd2FpdCB0aGlzLmdlbmVyYXRlU2lnbihwb2ludCkpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3NpZ25hdHVyZXBhZCcsIEZsYXRTaWduYXR1cmVQYWQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCb3hCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRib3gnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0VGV4dGJveCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBNVUxUSUxJTkVfVEVYVF9ST1dTX0NPVU5UOiBudW1iZXIgPSAxO1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICghdGhpcy5zaG91bGRSZW5kZXJBc0NvbW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGaWVsZFJlY3QocG9pbnQsIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBUZXh0Qm94QnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCByZWN0KV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHRydWUsIHsgcm93czogRmxhdFRleHRib3guTVVMVElMSU5FX1RFWFRfUk9XU19DT1VOVCB9KV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCd0ZXh0JywgRmxhdFRleHRib3gpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3RleHRib3gudHMiLCJpbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIsIElSZWN0IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG5cbiAgICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBwcml2YXRlIHJlbmRlckZ1bmM6IChkb2M6IGFueSwgcXVlc3Rpb246IGFueSwgeExlZnQ6IG51bWJlciwgeVRvcDogbnVtYmVyKSA9PiBJUmVjdCkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVuZGVyRnVuYyhjb250cm9sbGVyLmhlbHBlckRvYywgcXVlc3Rpb24sIDAsIDApKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJGdW5jKHRoaXMuY29udHJvbGxlci5kb2MsIHRoaXMucXVlc3Rpb24sIHRoaXMueExlZnQsIHRoaXMueVRvcCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY3VzdG9tLnRzIiwiaW1wb3J0IHsgU3VydmV5TW9kZWwsIFF1ZXN0aW9uLCBFdmVudEJhc2UgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgKiBhcyBTdXJ2ZXlDb3JlIGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElEb2NPcHRpb25zLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X3N1cnZleSc7XG5pbXBvcnQgeyBQYWdlUGFja2VyIH0gZnJvbSAnLi9wYWdlX2xheW91dC9wYWdlX3BhY2tlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IEV2ZW50QXN5bmMsIEV2ZW50SGFuZGxlciB9IGZyb20gJy4vZXZlbnRfaGFuZGxlci9ldmVudF9oYW5kbGVyJztcbmltcG9ydCB7IERyYXdDYW52YXMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMnO1xuaW1wb3J0IHsgQWRvcm5lcnNPcHRpb25zLCBBZG9ybmVyc1BhbmVsT3B0aW9ucywgQWRvcm5lcnNQYWdlT3B0aW9ucyB9IGZyb20gJy4vZXZlbnRfaGFuZGxlci9hZG9ybmVycyc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuL2hlbHBlcl9zdXJ2ZXknO1xuXG4vKipcbiAqIFRoZSBgU3VydmV5UERGYCBvYmplY3QgZW5hYmxlcyB5b3UgdG8gZXhwb3J0IHlvdXIgc3VydmV5cyBhbmQgZm9ybXMgdG8gUERGIGRvY3VtZW50cy5cbiAqXG4gKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvIChsaW5rU3R5bGUpKVxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5UERGIGV4dGVuZHMgU3VydmV5TW9kZWwge1xuICAgIHByaXZhdGUgc3RhdGljIGN1cnJlbnRseVNhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgc3RhdGljIHNhdmVRdWV1ZTogYW55W10gPSBbXTtcbiAgICBwdWJsaWMgb3B0aW9uczogSURvY09wdGlvbnM7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGpzb25PYmplY3Q6IGFueSwgb3B0aW9ucz86IElEb2NPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGpzb25PYmplY3QpO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zID0gU3VydmV5SGVscGVyLmNsb25lKG9wdGlvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhhdmVDb21tZXJjaWFsTGljZW5zZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZiA9IFN1cnZleUNvcmUuaGFzTGljZW5zZTtcbiAgICAgICAgcmV0dXJuICEhZiAmJiBmKDIpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGhhdmVDb21tZXJjaWFsTGljZW5zZSh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5lcnJvcignQXMgb2YgdjEuOS4xMDEsIHRoZSBoYXZlQ29tbWVyY2lhbExpY2Vuc2UgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZC4gVG8gYWN0aXZhdGUgeW91ciBsaWNlbnNlLCB1c2UgdGhlIHNldExpY2Vuc2VLZXkoa2V5KSBtZXRob2QgYXMgc2hvd24gb24gdGhlIGZvbGxvd2luZyBwYWdlOiBodHRwczovL3N1cnZleWpzLmlvL3JlbW92ZS1hbGVydC1iYW5uZXInKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBTdXJ2ZXlKUyBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBwYWdlIGhlYWRlci4gSGFuZGxlIHRoaXMgZXZlbnQgdG8gY3VzdG9taXplIHRoZSBoZWFkZXIuXG4gICAgICpcbiAgICAgKiBQYXJhbWV0ZXJzOlxuICAgICAqXG4gICAgICogLSBgc2VuZGVyYDogYFN1cnZleVBERmBcXFxuICAgICAqIEEgU3VydmV5UERGIGluc3RhbmNlIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICAgKlxuICAgICAqIC0gYGNhbnZhc2A6IFtgRHJhd0NhbnZhc2BdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvZHJhd2NhbnZhcylcXFxuICAgICAqIEFuIG9iamVjdCB0aGF0IHlvdSBjYW4gdXNlIHRvIGRyYXcgdGV4dCBhbmQgaW1hZ2VzIGluIHRoZSBwYWdlIGhlYWRlci5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jdXN0b21pemUtaGVhZGVyLWFuZC1mb290ZXItb2YtcGRmLWZvcm0vIChsaW5rU3R5bGUpKVxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbmRlckhlYWRlcjogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIERyYXdDYW52YXM+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBEcmF3Q2FudmFzPigpO1xuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gU3VydmV5SlMgUERGIEdlbmVyYXRvciByZW5kZXJzIGEgcGFnZSBmb290ZXIuIEhhbmRsZSB0aGlzIGV2ZW50IHRvIGN1c3RvbWl6ZSB0aGUgZm9vdGVyLlxuICAgICAqXG4gICAgICogUGFyYW1ldGVyczpcbiAgICAgKlxuICAgICAqIC0gYHNlbmRlcmA6IGBTdXJ2ZXlQREZgXFxcbiAgICAgKiBBIFN1cnZleVBERiBpbnN0YW5jZSB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICpcbiAgICAgKiAtIGBjYW52YXNgOiBbYERyYXdDYW52YXNgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2RyYXdjYW52YXMpXFxcbiAgICAgKiBBbiBvYmplY3QgdGhhdCB5b3UgY2FuIHVzZSB0byBkcmF3IHRleHQgYW5kIGltYWdlcyBpbiB0aGUgcGFnZSBmb290ZXIuXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvY3VzdG9taXplLWhlYWRlci1hbmQtZm9vdGVyLW9mLXBkZi1mb3JtLyAobGlua1N0eWxlKSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJGb290ZXI6IEV2ZW50QXN5bmM8U3VydmV5UERGLCBEcmF3Q2FudmFzPiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgRHJhd0NhbnZhcz4oKTtcbiAgICAvKipcbiAgICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIFN1cnZleUpTIFBERiBHZW5lcmF0b3IgcmVuZGVycyBhIHN1cnZleSBxdWVzdGlvbi4gSGFuZGxlIHRoaXMgZXZlbnQgdG8gY3VzdG9taXplIHF1ZXN0aW9uIHJlbmRlcmluZy5cbiAgICAgKlxuICAgICAqIFBhcmFtZXRlcnM6XG4gICAgICpcbiAgICAgKiAtIGBzZW5kZXJgOiBgU3VydmV5UERGYFxcXG4gICAgICogQSBTdXJ2ZXlQREYgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5xdWVzdGlvbmA6IFtgUXVlc3Rpb25gXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24pXFxcbiAgICAgKiBBIHN1cnZleSBxdWVzdGlvbiB0aGF0IGlzIGJlaW5nIHJlbmRlcmVkLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5wb2ludGA6IGBJUG9pbnRgXFxcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50IGJlaW5nIHJlbmRlcmVkLiBUaGlzIG9iamVjdCBjb250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6IGB7IHhMZWZ0OiBudW1iZXIsIHlUb3A6IG51bWJlciB9YC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuYnJpY2tzYDogW2BQZGZCcmlja1tdYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9wZGZicmljaylcXFxuICAgICAqIEFuIGFycmF5IG9mIFticmlja3NdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2N1c3RvbWl6ZS1zdXJ2ZXktcXVlc3Rpb24tcmVuZGVyaW5nLWluLXBkZi1mb3JtI2N1c3RvbS1yZW5kZXJpbmcpIHVzZWQgdG8gcmVuZGVyIHRoZSBlbGVtZW50LlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5jb250cm9sbGVyYDogW2BEb2NDb250cm9sbGVyYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9kb2Njb250cm9sbGVyKVxcXG4gICAgICogQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIG1haW4gUERGIGRvY3VtZW50IHByb3BlcnRpZXMgKGZvbnQsIG1hcmdpbnMsIHBhZ2Ugd2lkdGggYW5kIGhlaWdodCkgYW5kIGFsbG93cyB5b3UgdG8gbW9kaWZ5IHRoZW0uXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnJlcG9zaXRvcnlgOiBgRmxhdFJlcG9zaXRvcnlgXFxcbiAgICAgKiBBIHJlcG9zaXRvcnkgd2l0aCBjbGFzc2VzIHRoYXQgcmVuZGVyIGVsZW1lbnRzIHRvIFBERi4gVXNlIGl0cyBgY3JlYXRlYCBtZXRob2QgaWYgeW91IG5lZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgcmVuZGVyaW5nIGNsYXNzLlxuICAgICAqXG4gICAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2hvdy10by11c2UtYWRvcm5lcnMtaW4tcGRmLWZvcm1zLyAobGlua1N0eWxlKSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJRdWVzdGlvbjogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzT3B0aW9ucz4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzT3B0aW9ucz4oKTtcbiAgICAvKipcbiAgICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIFN1cnZleUpTIFBERiBHZW5lcmF0b3IgcmVuZGVycyBhIHBhbmVsLiBIYW5kbGUgdGhpcyBldmVudCB0byBjdXN0b21pemUgcGFuZWwgcmVuZGVyaW5nLlxuICAgICAqXG4gICAgICogUGFyYW1ldGVyczpcbiAgICAgKlxuICAgICAqIC0gYHNlbmRlcmA6IGBTdXJ2ZXlQREZgXFxcbiAgICAgKiBBIFN1cnZleVBERiBpbnN0YW5jZSB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnBhbmVsYDogW2BQYW5lbE1vZGVsYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3BhbmVsLW1vZGVsKVxcXG4gICAgICogQSBwYW5lbCB0aGF0IGlzIGJlaW5nIHJlbmRlcmVkLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5wb2ludGA6IGBJUG9pbnRgXFxcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50IGJlaW5nIHJlbmRlcmVkLiBUaGlzIG9iamVjdCBjb250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6IGB7IHhMZWZ0OiBudW1iZXIsIHlUb3A6IG51bWJlciB9YC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuYnJpY2tzYDogW2BQZGZCcmlja1tdYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9wZGZicmljaylcXFxuICAgICAqIEFuIGFycmF5IG9mIFticmlja3NdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2N1c3RvbWl6ZS1zdXJ2ZXktcXVlc3Rpb24tcmVuZGVyaW5nLWluLXBkZi1mb3JtI2N1c3RvbS1yZW5kZXJpbmcpIHVzZWQgdG8gcmVuZGVyIHRoZSBlbGVtZW50LlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5jb250cm9sbGVyYDogW2BEb2NDb250cm9sbGVyYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9kb2Njb250cm9sbGVyKVxcXG4gICAgICogQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIG1haW4gUERGIGRvY3VtZW50IHByb3BlcnRpZXMgKGZvbnQsIG1hcmdpbnMsIHBhZ2Ugd2lkdGggYW5kIGhlaWdodCkgYW5kIGFsbG93cyB5b3UgdG8gbW9kaWZ5IHRoZW0uXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnJlcG9zaXRvcnlgOiBgRmxhdFJlcG9zaXRvcnlgXFxcbiAgICAgKiBBIHJlcG9zaXRvcnkgd2l0aCBjbGFzc2VzIHRoYXQgcmVuZGVyIGVsZW1lbnRzIHRvIFBERi4gVXNlIGl0cyBgY3JlYXRlYCBtZXRob2QgaWYgeW91IG5lZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgcmVuZGVyaW5nIGNsYXNzLlxuICAgICAqXG4gICAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2hvdy10by11c2UtYWRvcm5lcnMtaW4tcGRmLWZvcm1zLyAobGlua1N0eWxlKSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJQYW5lbDogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzUGFuZWxPcHRpb25zPiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgQWRvcm5lcnNQYW5lbE9wdGlvbnM+KCk7XG4gICAgLyoqXG4gICAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBTdXJ2ZXlKUyBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBwYWdlLiBIYW5kbGUgdGhpcyBldmVudCB0byBjdXN0b21pemUgcGFnZSByZW5kZXJpbmcuXG4gICAgICpcbiAgICAgKiBQYXJhbWV0ZXJzOlxuICAgICAqXG4gICAgICogLSBgc2VuZGVyYDogYFN1cnZleVBERmBcXFxuICAgICAqIEEgU3VydmV5UERGIGluc3RhbmNlIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucGFnZWA6IFtgUGFnZU1vZGVsYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3BhZ2UtbW9kZWwpXFxcbiAgICAgKiBBIHBhZ2UgdGhhdCBpcyBiZWluZyByZW5kZXJlZC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucG9pbnRgOiBgSVBvaW50YFxcXG4gICAgICogQW4gb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudCBiZWluZyByZW5kZXJlZC4gVGhpcyBvYmplY3QgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOiBgeyB4TGVmdDogbnVtYmVyLCB5VG9wOiBudW1iZXIgfWAuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLmJyaWNrc2A6IFtgUGRmQnJpY2tbXWBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcGRmYnJpY2spXFxcbiAgICAgKiBBbiBhcnJheSBvZiBbYnJpY2tzXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9jdXN0b21pemUtc3VydmV5LXF1ZXN0aW9uLXJlbmRlcmluZy1pbi1wZGYtZm9ybSNjdXN0b20tcmVuZGVyaW5nKSB1c2VkIHRvIHJlbmRlciB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuY29udHJvbGxlcmA6IFtgRG9jQ29udHJvbGxlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvZG9jY29udHJvbGxlcilcXFxuICAgICAqIEFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBtYWluIFBERiBkb2N1bWVudCBwcm9wZXJ0aWVzIChmb250LCBtYXJnaW5zLCBwYWdlIHdpZHRoIGFuZCBoZWlnaHQpIGFuZCBhbGxvd3MgeW91IHRvIG1vZGlmeSB0aGVtLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5yZXBvc2l0b3J5YDogYEZsYXRSZXBvc2l0b3J5YFxcXG4gICAgICogQSByZXBvc2l0b3J5IHdpdGggY2xhc3NlcyB0aGF0IHJlbmRlciBlbGVtZW50cyB0byBQREYuIFVzZSBpdHMgYGNyZWF0ZWAgbWV0aG9kIGlmIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIHJlbmRlcmluZyBjbGFzcy5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9ob3ctdG8tdXNlLWFkb3JuZXJzLWluLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyUGFnZTogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzUGFnZU9wdGlvbnM+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc1BhZ2VPcHRpb25zPigpO1xuXG4gICAgcHVibGljIG9uRG9jQ29udHJvbGxlckNyZWF0ZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlQREYsIHsgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciB9PiA9IG5ldyBFdmVudEJhc2U8U3VydmV5UERGLCB7Y29udHJvbGxlcjogRG9jQ29udHJvbGxlcn0+KCk7XG5cbiAgICBwdWJsaWMgb25SZW5kZXJDaGVja0l0ZW1BY3JvZm9ybTogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIGFueT4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIGFueT4oKTtcblxuICAgIHB1YmxpYyBvblJlbmRlclJhZGlvR3JvdXBXcmFwQWNyb2Zvcm06IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+ID1cbiAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIGFueT4oKTtcblxuICAgIHB1YmxpYyBvblJlbmRlclJhZGlvSXRlbUFjcm9mb3JtOiBFdmVudEFzeW5jPFN1cnZleVBERiwgYW55PiA9XG4gICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+KCk7XG5cbiAgICBwcml2YXRlIHdhaXRGb3JRdWVzdGlvbklzUmVhZHkocXVlc3Rpb246IFF1ZXN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocXVlc3Rpb24uaXNSZWFkeSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWR5Q2FsbGJhY2s6IChzZW5kZXI6IFF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpID0+IHZvaWQgPVxuICAgICAgICAgICAgICAgIChfLCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaXNSZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24ub25SZWFkeUNoYW5nZWQucmVtb3ZlKHJlYWR5Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi5vblJlYWR5Q2hhbmdlZC5hZGQocmVhZHlDYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIHdhaXRGb3JDb3JlSXNSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiB0aGlzLmdldEFsbFF1ZXN0aW9ucygpKSB7XG4gICAgICAgICAgICBpZiAoISEoPGFueT5xdWVzdGlvbikuY29udGVudFBhbmVsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdDogUXVlc3Rpb25bXSA9IFtdO1xuICAgICAgICAgICAgICAgICg8YW55PnF1ZXN0aW9uKS5jb250ZW50UGFuZWwuYWRkUXVlc3Rpb25zVG9MaXN0KGxpc3QpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW5uZXJRdWVzdGlvbiBvZiBsaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclF1ZXN0aW9uSXNSZWFkeShpbm5lclF1ZXN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGF3YWl0IHRoaXMud2FpdEZvclF1ZXN0aW9uSXNSZWFkeShcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZ2V0Q29udGVudFF1ZXN0aW9uKDxRdWVzdGlvbj5xdWVzdGlvbikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBnZXRVcGRhdGVkQ2hlY2tJdGVtQWNyb2Zvcm1PcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uUmVuZGVyQ2hlY2tJdGVtQWNyb2Zvcm0uZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcHVibGljIGdldFVwZGF0ZWRSYWRpb0dyb3VwV3JhcE9wdGlvbnMob3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25SZW5kZXJSYWRpb0dyb3VwV3JhcEFjcm9mb3JtLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRVcGRhdGVkUmFkaW9JdGVtQWNyb2Zvcm1PcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uUmVuZGVyUmFkaW9JdGVtQWNyb2Zvcm0uZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBjb3JyZWN0QnJpY2tzUG9zaXRpb24oY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZmxhdHM6IElQZGZCcmlja1tdW10pIHtcbiAgICAgICAgaWYoY29udHJvbGxlci5pc1JUTCkge1xuICAgICAgICAgICAgZmxhdHMuZm9yRWFjaChmbGF0c0FyciA9PiB7XG4gICAgICAgICAgICAgICAgZmxhdHNBcnIuZm9yRWFjaChmbGF0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmxhdC50cmFuc2xhdGVYKCh4TGVmdDogbnVtYmVyLCB4UmlnaHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hpZnRXaWR0aCA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHhMZWZ0IC0geFJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgeExlZnQ6IHhMZWZ0ICsgc2hpZnRXaWR0aCwgeFJpZ2h0OiB4UmlnaHQgKyBzaGlmdFdpZHRoIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIHJlbmRlclN1cnZleShjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMudmlzaWJsZVBhZ2VzLmZvckVhY2gocGFnZSA9PiBwYWdlLm9uRmlyc3RSZW5kZXJpbmcoKSk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckNvcmVJc1JlYWR5KCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXVtdID0gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzKHRoaXMsIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLmNvcnJlY3RCcmlja3NQb3NpdGlvbihjb250cm9sbGVyLCBmbGF0cyk7XG4gICAgICAgIGNvbnN0IHBhY2tzOiBJUGRmQnJpY2tbXVtdID0gUGFnZVBhY2tlci5wYWNrKGZsYXRzLCBjb250cm9sbGVyKTtcbiAgICAgICAgYXdhaXQgRXZlbnRIYW5kbGVyLnByb2Nlc3NfaGVhZGVyX2V2ZW50cyh0aGlzLCBjb250cm9sbGVyLCBwYWNrcyk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHBhY2tzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuZ2V0TnVtYmVyT2ZQYWdlcygpID09PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnNldFBhZ2UoaSk7XG4gICAgICAgICAgICAgICAgLy9naXptb3MgYnJpY2tzIGJvcmRlcnMgZm9yIGRlYnVnXG4gICAgICAgICAgICAgICAgLy8gcGFja3NbaV1bal0udW5mb2xkKCkuZm9yRWFjaCgocmVjdDogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcignZ3JlZW4nKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29udHJvbGxlci5kb2MucmVjdCguLi5TdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KHJlY3QpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKCdibGFjaycpO1xuICAgICAgICAgICAgICAgIC8vICAgfVxuICAgICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFja3NbaV1bal0ucmVuZGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYXN5bmNocm9ub3VzIG1ldGhvZCB0aGF0IHN0YXJ0cyBkb3dubG9hZCBvZiB0aGUgZ2VuZXJhdGVkIFBERiBmaWxlIGluIHRoZSB3ZWIgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlTmFtZSAqKE9wdGlvbmFsKSogQSBmaWxlIG5hbWUgd2l0aCB0aGUgXCIucGRmXCIgZXh0ZW5zaW9uLiBEZWZhdWx0IHZhbHVlOiBgXCJzdXJ2ZXlfcmVzdWx0LnBkZlwiYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2F2ZShmaWxlTmFtZTogc3RyaW5nID0gJ3N1cnZleV9yZXN1bHQucGRmJyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGlmKCFTdXJ2ZXlQREYuY3VycmVudGx5U2F2aW5nKSB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyID0gbmV3IERvY0NvbnRyb2xsZXIodGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMub25Eb2NDb250cm9sbGVyQ3JlYXRlZC5maXJlKHRoaXMsIHsgY29udHJvbGxlcjogY29udHJvbGxlciB9KTtcbiAgICAgICAgICAgIFN1cnZleVBERi5jdXJyZW50bHlTYXZpbmcgPSB0cnVlO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLmZpeEZvbnQoY29udHJvbGxlcik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclN1cnZleShjb250cm9sbGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSBjb250cm9sbGVyLmRvYy5zYXZlKGZpbGVOYW1lLCB7IHJldHVyblByb21pc2U6IHRydWUgfSk7XG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIFN1cnZleVBERi5jdXJyZW50bHlTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBzYXZlRnVuYyA9IFN1cnZleVBERi5zYXZlUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZighIXNhdmVGdW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhdmVGdW5jKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFN1cnZleVBERi5zYXZlUXVldWUucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlKGZpbGVOYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGFzeW5jaHJvbm91cyBtZXRob2QgdGhhdCBhbGxvd3MgeW91IHRvIGdldCBQREYgY29udGVudCBpbiBkaWZmZXJlbnQgZm9ybWF0cy5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jb252ZXJ0LXBkZi1mb3JtLWJsb2ItYmFzZTY0LXJhdy1wZGYtamF2YXNjcmlwdC8gKGxpbmtTdHlsZSkpXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSAqKE9wdGlvbmFsKSogT25lIG9mIGBcImJsb2JcImAsIGBcImJsb2J1cmxcImAsIGBcImRhdGF1cmxzdHJpbmdcImAuIERvIG5vdCBzcGVjaWZ5IHRoaXMgcGFyYW1ldGVyIGlmIHlvdSB3YW50IHRvIGdldCByYXcgUERGIGNvbnRlbnQgYXMgYSBzdHJpbmcgdmFsdWUuXG4gICAgICpcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmF3KHR5cGU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyID0gbmV3IERvY0NvbnRyb2xsZXIodGhpcy5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5vbkRvY0NvbnRyb2xsZXJDcmVhdGVkLmZpcmUodGhpcywgeyBjb250cm9sbGVyOiBjb250cm9sbGVyIH0pO1xuICAgICAgICBTdXJ2ZXlIZWxwZXIuZml4Rm9udChjb250cm9sbGVyKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJTdXJ2ZXkoY29udHJvbGxlcik7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRvYy5vdXRwdXQodHlwZSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N1cnZleS50cyIsIlwidXNlIHN0cmljdFwiO1xyXG4vLyBBbiBhdWdtZW50ZWQgQVZMIFRyZWUgd2hlcmUgZWFjaCBub2RlIG1haW50YWlucyBhIGxpc3Qgb2YgcmVjb3JkcyBhbmQgdGhlaXIgc2VhcmNoIGludGVydmFscy5cclxuLy8gUmVjb3JkIGlzIGNvbXBvc2VkIG9mIGFuIGludGVydmFsIGFuZCBpdHMgdW5kZXJseWluZyBkYXRhLCBzZW50IGJ5IGEgY2xpZW50LiBUaGlzIGFsbG93cyB0aGVcclxuLy8gaW50ZXJ2YWwgdHJlZSB0byBoYXZlIHRoZSBzYW1lIGludGVydmFsIGluc2VydGVkIG11bHRpcGxlIHRpbWVzLCBhcyBsb25nIGl0cyBkYXRhIGlzIGRpZmZlcmVudC5cclxuLy8gQm90aCBpbnNlcnRpb24gYW5kIGRlbGV0aW9uIHJlcXVpcmUgTyhsb2cgbikgdGltZS4gU2VhcmNoaW5nIHJlcXVpcmVzIE8oaypsb2duKSB0aW1lLCB3aGVyZSBga2BcclxuLy8gaXMgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMgaW4gdGhlIG91dHB1dCBsaXN0LlxyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciBpc1NhbWUgPSByZXF1aXJlKFwic2hhbGxvd2VxdWFsXCIpO1xyXG5mdW5jdGlvbiBoZWlnaHQobm9kZSkge1xyXG4gICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBub2RlLmhlaWdodDtcclxuICAgIH1cclxufVxyXG52YXIgTm9kZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIE5vZGUoaW50ZXJ2YWxUcmVlLCByZWNvcmQpIHtcclxuICAgICAgICB0aGlzLmludGVydmFsVHJlZSA9IGludGVydmFsVHJlZTtcclxuICAgICAgICB0aGlzLnJlY29yZHMgPSBbXTtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XHJcbiAgICAgICAgdGhpcy5rZXkgPSByZWNvcmQubG93O1xyXG4gICAgICAgIHRoaXMubWF4ID0gcmVjb3JkLmhpZ2g7XHJcbiAgICAgICAgLy8gU2F2ZSB0aGUgYXJyYXkgb2YgYWxsIHJlY29yZHMgd2l0aCB0aGUgc2FtZSBrZXkgZm9yIHRoaXMgbm9kZVxyXG4gICAgICAgIHRoaXMucmVjb3Jkcy5wdXNoKHJlY29yZCk7XHJcbiAgICB9XHJcbiAgICAvLyBHZXRzIHRoZSBoaWdoZXN0IHJlY29yZC5oaWdoIHZhbHVlIGZvciB0aGlzIG5vZGVcclxuICAgIE5vZGUucHJvdG90eXBlLmdldE5vZGVIaWdoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBoaWdoID0gdGhpcy5yZWNvcmRzWzBdLmhpZ2g7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLnJlY29yZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmVjb3Jkc1tpXS5oaWdoID4gaGlnaCkge1xyXG4gICAgICAgICAgICAgICAgaGlnaCA9IHRoaXMucmVjb3Jkc1tpXS5oaWdoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoaWdoO1xyXG4gICAgfTtcclxuICAgIC8vIFVwZGF0ZXMgaGVpZ2h0IHZhbHVlIG9mIHRoZSBub2RlLiBDYWxsZWQgZHVyaW5nIGluc2VydGlvbiwgcmViYWxhbmNlLCByZW1vdmFsXHJcbiAgICBOb2RlLnByb3RvdHlwZS51cGRhdGVIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBNYXRoLm1heChoZWlnaHQodGhpcy5sZWZ0KSwgaGVpZ2h0KHRoaXMucmlnaHQpKSArIDE7XHJcbiAgICB9O1xyXG4gICAgLy8gVXBkYXRlcyB0aGUgbWF4IHZhbHVlIG9mIGFsbCB0aGUgcGFyZW50cyBhZnRlciBpbnNlcnRpbmcgaW50byBhbHJlYWR5IGV4aXN0aW5nIG5vZGUsIGFzIHdlbGwgYXNcclxuICAgIC8vIHJlbW92aW5nIHRoZSBub2RlIGNvbXBsZXRlbHkgb3IgcmVtb3ZpbmcgdGhlIHJlY29yZCBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIG5vZGUuIFN0YXJ0cyB3aXRoXHJcbiAgICAvLyB0aGUgcGFyZW50IG9mIGFuIGFmZmVjdGVkIG5vZGUgYW5kIGJ1YmJsZXMgdXAgdG8gcm9vdFxyXG4gICAgTm9kZS5wcm90b3R5cGUudXBkYXRlTWF4T2ZQYXJlbnRzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdGhpc0hpZ2ggPSB0aGlzLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXMucmlnaHQubWF4KSwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzLmxlZnQubWF4LCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXMucmlnaHQubWF4LCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IHRoaXNIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQudXBkYXRlTWF4T2ZQYXJlbnRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qXHJcbiAgICBMZWZ0LUxlZnQgY2FzZTpcclxuICBcclxuICAgICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5XHJcbiAgICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgXFxcclxuICAgICAgICAgeSAgIFQ0ICAgICAgUmlnaHQgUm90YXRlICh6KSAgICAgICAgICB4ICAgICB6XHJcbiAgICAgICAgLyBcXCAgICAgICAgICAtIC0gLSAtIC0gLSAtIC0gLT4gICAgICAgLyBcXCAgIC8gXFxcclxuICAgICAgIHggICBUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgLyBcXFxyXG4gICAgVDEgICBUMlxyXG4gIFxyXG4gICAgTGVmdC1SaWdodCBjYXNlOlxyXG4gIFxyXG4gICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICB4XHJcbiAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgICAgeSAgIFQ0ICBMZWZ0IFJvdGF0ZSAoeSkgICAgICAgICB4ICBUNCAgUmlnaHQgUm90YXRlKHopICAgICB5ICAgICB6XHJcbiAgICAgIC8gXFwgICAgICAtIC0gLSAtIC0gLSAtIC0gLT4gICAgIC8gXFwgICAgICAtIC0gLSAtIC0gLSAtIC0+ICAvIFxcICAgLyBcXFxyXG4gICAgVDEgICB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAgVDMgICAgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFxcclxuICAgICAgVDIgICBUMyAgICAgICAgICAgICAgICAgICAgICBUMSBUMlxyXG4gICAgKi9cclxuICAgIC8vIEhhbmRsZXMgTGVmdC1MZWZ0IGNhc2UgYW5kIExlZnQtUmlnaHQgY2FzZSBhZnRlciByZWJhbGFuY2luZyBBVkwgdHJlZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX3VwZGF0ZU1heEFmdGVyUmlnaHRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIHZhciBsZWZ0ID0gcGFyZW50LmxlZnQ7XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBsZWZ0IHNpYmxpbmcgKHggaW4gZmlyc3QgY2FzZSwgeSBpbiBzZWNvbmQpXHJcbiAgICAgICAgdmFyIHRoaXNQYXJlbnRMZWZ0SGlnaCA9IGxlZnQuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAobGVmdC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgbGVmdC5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxlZnQubWF4ID0gTWF0aC5tYXgodGhpc1BhcmVudExlZnRIaWdoLCBsZWZ0LnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxlZnQubGVmdCAhPT0gdW5kZWZpbmVkICYmIGxlZnQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IE1hdGgubWF4KHRoaXNQYXJlbnRMZWZ0SGlnaCwgbGVmdC5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxlZnQubGVmdCA9PT0gdW5kZWZpbmVkICYmIGxlZnQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IHRoaXNQYXJlbnRMZWZ0SGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxlZnQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgobGVmdC5sZWZ0Lm1heCwgbGVmdC5yaWdodC5tYXgpLCB0aGlzUGFyZW50TGVmdEhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIGl0c2VsZiAoeilcclxuICAgICAgICB2YXIgdGhpc0hpZ2ggPSB0aGlzLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLmxlZnQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpc0hpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXMucmlnaHQubWF4KSwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHBhcmVudCAoeSBpbiBmaXJzdCBjYXNlLCB4IGluIHNlY29uZClcclxuICAgICAgICBwYXJlbnQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgocGFyZW50LmxlZnQubWF4LCBwYXJlbnQucmlnaHQubWF4KSwgcGFyZW50LmdldE5vZGVIaWdoKCkpO1xyXG4gICAgfTtcclxuICAgIC8qXHJcbiAgICBSaWdodC1SaWdodCBjYXNlOlxyXG4gIFxyXG4gICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlcclxuICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgVDEgIHkgICAgIExlZnQgUm90YXRlKHopICAgICAgIHogICAgIHhcclxuICAgICAgIC8gXFwgICAtIC0gLSAtIC0gLSAtIC0+ICAgICAvIFxcICAgLyBcXFxyXG4gICAgICBUMiAgeCAgICAgICAgICAgICAgICAgICAgICBUMSBUMiBUMyBUNFxyXG4gICAgICAgICAvIFxcXHJcbiAgICAgICAgVDMgVDRcclxuICBcclxuICAgIFJpZ2h0LUxlZnQgY2FzZTpcclxuICBcclxuICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4XHJcbiAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgLyAgIFxcXHJcbiAgICAgVDEgIHkgICBSaWdodCBSb3RhdGUgKHkpICAgICBUMSAgeCAgICAgIExlZnQgUm90YXRlKHopICAgeiAgICAgeVxyXG4gICAgICAgIC8gXFwgIC0gLSAtIC0gLSAtIC0gLSAtPiAgICAgIC8gXFwgICAtIC0gLSAtIC0gLSAtIC0+ICAvIFxcICAgLyBcXFxyXG4gICAgICAgeCAgVDQgICAgICAgICAgICAgICAgICAgICAgICBUMiAgeSAgICAgICAgICAgICAgICAgICBUMSBUMiBUMyBUNFxyXG4gICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBcXFxyXG4gICAgVDIgICBUMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQzIFQ0XHJcbiAgICAqL1xyXG4gICAgLy8gSGFuZGxlcyBSaWdodC1SaWdodCBjYXNlIGFuZCBSaWdodC1MZWZ0IGNhc2UgaW4gcmViYWxhbmNpbmcgQVZMIHRyZWVcclxuICAgIE5vZGUucHJvdG90eXBlLl91cGRhdGVNYXhBZnRlckxlZnRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIHZhciByaWdodCA9IHBhcmVudC5yaWdodDtcclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHJpZ2h0IHNpYmxpbmcgKHggaW4gZmlyc3QgY2FzZSwgeSBpbiBzZWNvbmQpXHJcbiAgICAgICAgdmFyIHRoaXNQYXJlbnRSaWdodEhpZ2ggPSByaWdodC5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmIChyaWdodC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgcmlnaHQucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50UmlnaHRIaWdoLCByaWdodC5yaWdodC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyaWdodC5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgcmlnaHQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50UmlnaHRIaWdoLCByaWdodC5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJpZ2h0LmxlZnQgPT09IHVuZGVmaW5lZCAmJiByaWdodC5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJpZ2h0Lm1heCA9IHRoaXNQYXJlbnRSaWdodEhpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heChNYXRoLm1heChyaWdodC5sZWZ0Lm1heCwgcmlnaHQucmlnaHQubWF4KSwgdGhpc1BhcmVudFJpZ2h0SGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgaXRzZWxmICh6KVxyXG4gICAgICAgIHZhciB0aGlzSGlnaCA9IHRoaXMuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpc0hpZ2gsIHRoaXMucmlnaHQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpc0hpZ2gsIHRoaXMubGVmdC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzSGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgodGhpcy5sZWZ0Lm1heCwgdGhpcy5yaWdodC5tYXgpLCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgcGFyZW50ICh5IGluIGZpcnN0IGNhc2UsIHggaW4gc2Vjb25kKVxyXG4gICAgICAgIHBhcmVudC5tYXggPSBNYXRoLm1heChNYXRoLm1heChwYXJlbnQubGVmdC5tYXgsIHJpZ2h0Lm1heCksIHBhcmVudC5nZXROb2RlSGlnaCgpKTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5fbGVmdFJvdGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgcmlnaHRDaGlsZCA9IHRoaXMucmlnaHQ7XHJcbiAgICAgICAgcmlnaHRDaGlsZC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICBpZiAocmlnaHRDaGlsZC5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVydmFsVHJlZS5yb290ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChyaWdodENoaWxkLnBhcmVudC5sZWZ0ID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICByaWdodENoaWxkLnBhcmVudC5sZWZ0ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyaWdodENoaWxkLnBhcmVudC5yaWdodCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgcmlnaHRDaGlsZC5wYXJlbnQucmlnaHQgPSByaWdodENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodENoaWxkLmxlZnQ7XHJcbiAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJpZ2h0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJpZ2h0Q2hpbGQubGVmdCA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSByaWdodENoaWxkO1xyXG4gICAgICAgIHRoaXMudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICAgICAgcmlnaHRDaGlsZC51cGRhdGVIZWlnaHQoKTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5fcmlnaHRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGxlZnRDaGlsZCA9IHRoaXMubGVmdDtcclxuICAgICAgICBsZWZ0Q2hpbGQucGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcbiAgICAgICAgaWYgKGxlZnRDaGlsZC5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVydmFsVHJlZS5yb290ID0gbGVmdENoaWxkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGxlZnRDaGlsZC5wYXJlbnQubGVmdCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgbGVmdENoaWxkLnBhcmVudC5sZWZ0ID0gbGVmdENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxlZnRDaGlsZC5wYXJlbnQucmlnaHQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGxlZnRDaGlsZC5wYXJlbnQucmlnaHQgPSBsZWZ0Q2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdENoaWxkLnJpZ2h0O1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxlZnQucGFyZW50ID0gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGVmdENoaWxkLnJpZ2h0ID0gdGhpcztcclxuICAgICAgICB0aGlzLnBhcmVudCA9IGxlZnRDaGlsZDtcclxuICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgIGxlZnRDaGlsZC51cGRhdGVIZWlnaHQoKTtcclxuICAgIH07XHJcbiAgICAvLyBSZWJhbGFuY2VzIHRoZSB0cmVlIGlmIHRoZSBoZWlnaHQgdmFsdWUgYmV0d2VlbiB0d28gbm9kZXMgb2YgdGhlIHNhbWUgcGFyZW50IGlzIGdyZWF0ZXIgdGhhblxyXG4gICAgLy8gdHdvLiBUaGVyZSBhcmUgNCBjYXNlcyB0aGF0IGNhbiBoYXBwZW4gd2hpY2ggYXJlIG91dGxpbmVkIGluIHRoZSBncmFwaGljcyBhYm92ZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX3JlYmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoaGVpZ2h0KHRoaXMubGVmdCkgPj0gMiArIGhlaWdodCh0aGlzLnJpZ2h0KSkge1xyXG4gICAgICAgICAgICB2YXIgbGVmdCA9IHRoaXMubGVmdDtcclxuICAgICAgICAgICAgaWYgKGhlaWdodChsZWZ0LmxlZnQpID49IGhlaWdodChsZWZ0LnJpZ2h0KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gTGVmdC1MZWZ0IGNhc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlclJpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBMZWZ0LVJpZ2h0IGNhc2VcclxuICAgICAgICAgICAgICAgIGxlZnQuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlclJpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaGVpZ2h0KHRoaXMucmlnaHQpID49IDIgKyBoZWlnaHQodGhpcy5sZWZ0KSkge1xyXG4gICAgICAgICAgICB2YXIgcmlnaHQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0KHJpZ2h0LnJpZ2h0KSA+PSBoZWlnaHQocmlnaHQubGVmdCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFJpZ2h0LVJpZ2h0IGNhc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1heEFmdGVyTGVmdFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUmlnaHQtTGVmdCBjYXNlXHJcbiAgICAgICAgICAgICAgICByaWdodC5fcmlnaHRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1heEFmdGVyTGVmdFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcclxuICAgICAgICBpZiAocmVjb3JkLmxvdyA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIC8vIEluc2VydCBpbnRvIGxlZnQgc3VidHJlZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGVmdCA9IG5ldyBOb2RlKHRoaXMuaW50ZXJ2YWxUcmVlLCByZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnQuaW5zZXJ0KHJlY29yZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEluc2VydCBpbnRvIHJpZ2h0IHN1YnRyZWVcclxuICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodCA9IG5ldyBOb2RlKHRoaXMuaW50ZXJ2YWxUcmVlLCByZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodC5pbnNlcnQocmVjb3JkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIG1heCB2YWx1ZSBvZiB0aGlzIGFuY2VzdG9yIGlmIG5lZWRlZFxyXG4gICAgICAgIGlmICh0aGlzLm1heCA8IHJlY29yZC5oaWdoKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gcmVjb3JkLmhpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBoZWlnaHQgb2YgZWFjaCBub2RlXHJcbiAgICAgICAgdGhpcy51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICAvLyBSZWJhbGFuY2UgdGhlIHRyZWUgdG8gZW5zdXJlIGFsbCBvcGVyYXRpb25zIGFyZSBleGVjdXRlZCBpbiBPKGxvZ24pIHRpbWUuIFRoaXMgaXMgZXNwZWNpYWxseVxyXG4gICAgICAgIC8vIGltcG9ydGFudCBpbiBzZWFyY2hpbmcsIGFzIHRoZSB0cmVlIGhhcyBhIGhpZ2ggY2hhbmNlIG9mIGRlZ2VuZXJhdGluZyB3aXRob3V0IHRoZSByZWJhbGFuY2luZ1xyXG4gICAgICAgIHRoaXMuX3JlYmFsYW5jZSgpO1xyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLl9nZXRPdmVybGFwcGluZ1JlY29yZHMgPSBmdW5jdGlvbiAoY3VycmVudE5vZGUsIGxvdywgaGlnaCkge1xyXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS5rZXkgPD0gaGlnaCAmJiBsb3cgPD0gY3VycmVudE5vZGUuZ2V0Tm9kZUhpZ2goKSkge1xyXG4gICAgICAgICAgICAvLyBOb2RlcyBhcmUgb3ZlcmxhcHBpbmcsIGNoZWNrIGlmIGluZGl2aWR1YWwgcmVjb3JkcyBpbiB0aGUgbm9kZSBhcmUgb3ZlcmxhcHBpbmdcclxuICAgICAgICAgICAgdmFyIHRlbXBSZXN1bHRzID0gW107XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VycmVudE5vZGUucmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLnJlY29yZHNbaV0uaGlnaCA+PSBsb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wUmVzdWx0cy5wdXNoKGN1cnJlbnROb2RlLnJlY29yZHNbaV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0ZW1wUmVzdWx0cztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICAvLyBEb24ndCBzZWFyY2ggbm9kZXMgdGhhdCBkb24ndCBleGlzdFxyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbGVmdFNlYXJjaCA9IFtdO1xyXG4gICAgICAgIHZhciBvd25TZWFyY2ggPSBbXTtcclxuICAgICAgICB2YXIgcmlnaHRTZWFyY2ggPSBbXTtcclxuICAgICAgICAvLyBJZiBpbnRlcnZhbCBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIHJpZ2h0bW9zdCBwb2ludCBvZiBhbnkgaW50ZXJ2YWwgaW4gdGhpcyBub2RlIGFuZCBhbGwgaXRzXHJcbiAgICAgICAgLy8gY2hpbGRyZW4sIHRoZXJlIHdvbid0IGJlIGFueSBtYXRjaGVzXHJcbiAgICAgICAgaWYgKGxvdyA+IHRoaXMubWF4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU2VhcmNoIGxlZnQgY2hpbGRyZW5cclxuICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5sZWZ0Lm1heCA+PSBsb3cpIHtcclxuICAgICAgICAgICAgbGVmdFNlYXJjaCA9IHRoaXMubGVmdC5zZWFyY2gobG93LCBoaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ2hlY2sgdGhpcyBub2RlXHJcbiAgICAgICAgb3duU2VhcmNoID0gdGhpcy5fZ2V0T3ZlcmxhcHBpbmdSZWNvcmRzKHRoaXMsIGxvdywgaGlnaCk7XHJcbiAgICAgICAgLy8gSWYgaW50ZXJ2YWwgaXMgdG8gdGhlIGxlZnQgb2YgdGhlIHN0YXJ0IG9mIHRoaXMgaW50ZXJ2YWwsIHRoZW4gaXQgY2FuJ3QgYmUgaW4gYW55IGNoaWxkIHRvXHJcbiAgICAgICAgLy8gdGhlIHJpZ2h0XHJcbiAgICAgICAgaWYgKGhpZ2ggPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbGVmdFNlYXJjaC5jb25jYXQob3duU2VhcmNoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZWFyY2ggcmlnaHQgY2hpbGRyZW5cclxuICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJpZ2h0U2VhcmNoID0gdGhpcy5yaWdodC5zZWFyY2gobG93LCBoaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUmV0dXJuIGFjY3VtdWxhdGVkIHJlc3VsdHMsIGlmIGFueVxyXG4gICAgICAgIHJldHVybiBsZWZ0U2VhcmNoLmNvbmNhdChvd25TZWFyY2gsIHJpZ2h0U2VhcmNoKTtcclxuICAgIH07XHJcbiAgICAvLyBTZWFyY2hlcyBmb3IgYSBub2RlIGJ5IGEgYGtleWAgdmFsdWVcclxuICAgIE5vZGUucHJvdG90eXBlLnNlYXJjaEV4aXN0aW5nID0gZnVuY3Rpb24gKGxvdykge1xyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMua2V5ID09PSBsb3cpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxvdyA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5zZWFyY2hFeGlzdGluZyhsb3cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5zZWFyY2hFeGlzdGluZyhsb3cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9O1xyXG4gICAgLy8gUmV0dXJucyB0aGUgc21hbGxlc3Qgbm9kZSBvZiB0aGUgc3VidHJlZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX21pblZhbHVlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQuX21pblZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIGlmIChub2RlLmtleSA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIC8vIE5vZGUgdG8gYmUgcmVtb3ZlZCBpcyBvbiB0aGUgbGVmdCBzaWRlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5vZGUua2V5ID4gdGhpcy5rZXkpIHtcclxuICAgICAgICAgICAgLy8gTm9kZSB0byBiZSByZW1vdmVkIGlzIG9uIHRoZSByaWdodCBzaWRlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnJlbW92ZShub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgaGFzIHR3byBjaGlsZHJlblxyXG4gICAgICAgICAgICAgICAgdmFyIG1pblZhbHVlID0gdGhpcy5yaWdodC5fbWluVmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMua2V5ID0gbWluVmFsdWUua2V5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvcmRzID0gbWluVmFsdWUucmVjb3JkcztcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnJlbW92ZSh0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChwYXJlbnQubGVmdCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgLy8gT25lIGNoaWxkIG9yIG5vIGNoaWxkIGNhc2Ugb24gbGVmdCBzaWRlXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmxlZnQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmxlZnQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Ll9yZWJhbGFuY2UoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmVudC5yaWdodCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgLy8gT25lIGNoaWxkIG9yIG5vIGNoaWxkIGNhc2Ugb24gcmlnaHQgc2lkZVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5yaWdodCA9IHRoaXMucmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmlnaHQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Ll9yZWJhbGFuY2UoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBOb2RlO1xyXG59KCkpO1xyXG5leHBvcnRzLk5vZGUgPSBOb2RlO1xyXG52YXIgSW50ZXJ2YWxUcmVlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gSW50ZXJ2YWxUcmVlKCkge1xyXG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xyXG4gICAgfVxyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAocmVjb3JkKSB7XHJcbiAgICAgICAgaWYgKHJlY29yZC5sb3cgPiByZWNvcmQuaGlnaCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bsb3dgIHZhbHVlIG11c3QgYmUgbG93ZXIgb3IgZXF1YWwgdG8gYGhpZ2hgIHZhbHVlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBCYXNlIGNhc2U6IFRyZWUgaXMgZW1wdHksIG5ldyBub2RlIGJlY29tZXMgcm9vdFxyXG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBuZXcgTm9kZSh0aGlzLCByZWNvcmQpO1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjaGVjayBpZiBub2RlIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNhbWUga2V5XHJcbiAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5yb290LnNlYXJjaEV4aXN0aW5nKHJlY29yZC5sb3cpO1xyXG4gICAgICAgICAgICBpZiAobm9kZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgcmVjb3JkcyBpbiB0aGlzIG5vZGUgaWYgdGhlcmUgYWxyZWFkeSBpcyB0aGUgb25lIHdpdGggc2FtZSBsb3csIGhpZ2gsIGRhdGFcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbaV0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZWNvcmQgaXMgc2FtZSBhcyB0aGUgb25lIHdlJ3JlIHRyeWluZyB0byBpbnNlcnQ7IHJldHVybiBmYWxzZSB0byBpbmRpY2F0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGhhcyBiZWVuIGluc2VydGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHJlY29yZCB0byB0aGUgbm9kZVxyXG4gICAgICAgICAgICAgICAgbm9kZS5yZWNvcmRzLnB1c2gocmVjb3JkKTtcclxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnRzIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5oaWdoID4gbm9kZS5tYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLm1heCA9IHJlY29yZC5oaWdoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgd2l0aCB0aGlzIGtleSBkb2Vzbid0IGFscmVhZHkgZXhpc3QuIENhbGwgaW5zZXJ0IGZ1bmN0aW9uIG9uIHJvb3QncyBub2RlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QuaW5zZXJ0KHJlY29yZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICBpZiAodGhpcy5yb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gVHJlZSBpcyBlbXB0eTsgcmV0dXJuIGVtcHR5IGFycmF5XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Quc2VhcmNoKGxvdywgaGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHJlY29yZCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBUcmVlIGlzIGVtcHR5OyBub3RoaW5nIHRvIHJlbW92ZVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMucm9vdC5zZWFyY2hFeGlzdGluZyhyZWNvcmQubG93KTtcclxuICAgICAgICAgICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUucmVjb3Jkcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZFJlY29yZCA9IHZvaWQgMDtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgd2l0aCB0aGlzIGtleSBoYXMgMiBvciBtb3JlIHJlY29yZHMuIEZpbmQgdGhlIG9uZSB3ZSBuZWVkIGFuZCByZW1vdmUgaXRcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbaV0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFJlY29yZCA9IG5vZGUucmVjb3Jkc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZWNvcmRzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZWRSZWNvcmQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVkUmVjb3JkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgdGhhdCBub2RlIGFuZCBpdHMgcGFyZW50cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmhpZ2ggPT09IG5vZGUubWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlSGlnaCA9IG5vZGUuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGVmdCAhPT0gdW5kZWZpbmVkICYmIG5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBNYXRoLm1heChNYXRoLm1heChub2RlLmxlZnQubWF4LCBub2RlLnJpZ2h0Lm1heCksIG5vZGVIaWdoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmxlZnQgIT09IHVuZGVmaW5lZCAmJiBub2RlLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gTWF0aC5tYXgobm9kZS5sZWZ0Lm1heCwgbm9kZUhpZ2gpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUubGVmdCA9PT0gdW5kZWZpbmVkICYmIG5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBNYXRoLm1heChub2RlLnJpZ2h0Lm1heCwgbm9kZUhpZ2gpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBub2RlSGlnaDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQtLTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLnJlY29yZHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIHdpdGggdGhpcyBrZXkgaGFzIG9ubHkgMSByZWNvcmQuIENoZWNrIGlmIHRoZSByZW1haW5pbmcgcmVjb3JkIGluIHRoaXMgbm9kZSBpc1xyXG4gICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbMF0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIHJlY29yZCBpcyB0aGUgb25lIHdlIHdhbnQgdG8gcmVtb3ZlLiBSZW1vdmUgdGhlIHdob2xlIG5vZGUgZnJvbSB0aGUgdHJlZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3Qua2V5ID09PSBub2RlLmtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSByZW1vdmluZyB0aGUgcm9vdCBlbGVtZW50LiBDcmVhdGUgYSBkdW1teSBub2RlIHRoYXQgd2lsbCB0ZW1wb3JhcmlseSB0YWtlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvb3QncyBwYXJlbnQgcm9sZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdFBhcmVudCA9IG5ldyBOb2RlKHRoaXMsIHsgbG93OiByZWNvcmQubG93LCBoaWdoOiByZWNvcmQubG93IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb290UGFyZW50LmxlZnQgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdC5wYXJlbnQgPSByb290UGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZE5vZGUgPSB0aGlzLnJvb3QucmVtb3ZlKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSByb290UGFyZW50LmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3QgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290LnBhcmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWROb2RlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudC0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZW1vdmVkTm9kZSA9IHRoaXMucm9vdC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZE5vZGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50LS07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZW1haW5pbmcgcmVjb3JkIGlzIG5vdCB0aGUgb25lIHdlIHdhbnQgdG8gcmVtb3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gTm8gcmVjb3JkcyBhdCBhbGwgaW4gdGhpcyBub2RlPyEgU2hvdWxkbid0IGhhcHBlblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUuaW5PcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IEluT3JkZXIodGhpcy5yb290KTtcclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLnByZU9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJlT3JkZXIodGhpcy5yb290KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gSW50ZXJ2YWxUcmVlO1xyXG59KCkpO1xyXG5leHBvcnRzLkludGVydmFsVHJlZSA9IEludGVydmFsVHJlZTtcclxudmFyIERhdGFJbnRlcnZhbFRyZWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBEYXRhSW50ZXJ2YWxUcmVlKCkge1xyXG4gICAgICAgIHRoaXMudHJlZSA9IG5ldyBJbnRlcnZhbFRyZWUoKTtcclxuICAgIH1cclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gsIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLmluc2VydCh7IGxvdzogbG93LCBoaWdoOiBoaWdoLCBkYXRhOiBkYXRhIH0pO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChsb3csIGhpZ2gsIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnJlbW92ZSh7IGxvdzogbG93LCBoaWdoOiBoaWdoLCBkYXRhOiBkYXRhIH0pO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnNlYXJjaChsb3csIGhpZ2gpLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdi5kYXRhOyB9KTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbk9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWUuaW5PcmRlcigpO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnByZU9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWUucHJlT3JkZXIoKTtcclxuICAgIH07XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGF0YUludGVydmFsVHJlZS5wcm90b3R5cGUsIFwiY291bnRcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmVlLmNvdW50O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIERhdGFJbnRlcnZhbFRyZWU7XHJcbn0oKSk7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IERhdGFJbnRlcnZhbFRyZWU7XHJcbnZhciBJbk9yZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gSW5PcmRlcihzdGFydE5vZGUpIHtcclxuICAgICAgICB0aGlzLnN0YWNrID0gW107XHJcbiAgICAgICAgaWYgKHN0YXJ0Tm9kZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaChzdGFydE5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIEluT3JkZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gV2lsbCBvbmx5IGhhcHBlbiBpZiBzdGFjayBpcyBlbXB0eSBhbmQgcG9wIGlzIGNhbGxlZFxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRvbmU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQcm9jZXNzIHRoaXMgbm9kZVxyXG4gICAgICAgIGlmICh0aGlzLmkgPCB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHNbdGhpcy5pKytdLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLnJpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE1pZ2h0IHBvcCB0aGUgbGFzdCBhbmQgc2V0IHRoaXMuY3VycmVudE5vZGUgPSB1bmRlZmluZWRcclxuICAgICAgICAgICAgdGhpcy5wb3AoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpO1xyXG4gICAgfTtcclxuICAgIEluT3JkZXIucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSBub2RlO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VycmVudE5vZGUubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh0aGlzLmN1cnJlbnROb2RlKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUubGVmdDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSW5PcmRlci5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLnN0YWNrLnBvcCgpO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEluT3JkZXI7XHJcbn0oKSk7XHJcbmV4cG9ydHMuSW5PcmRlciA9IEluT3JkZXI7XHJcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICBJbk9yZGVyLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcclxufVxyXG52YXIgUHJlT3JkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBQcmVPcmRlcihzdGFydE5vZGUpIHtcclxuICAgICAgICB0aGlzLnN0YWNrID0gW107XHJcbiAgICAgICAgdGhpcy5pID0gMDtcclxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gc3RhcnROb2RlO1xyXG4gICAgfVxyXG4gICAgUHJlT3JkZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gV2lsbCBvbmx5IGhhcHBlbiBpZiBzdGFjayBpcyBlbXB0eSBhbmQgcG9wIGlzIGNhbGxlZCxcclxuICAgICAgICAvLyB3aGljaCBvbmx5IGhhcHBlbnMgaWYgdGhlcmUgaXMgbm8gcmlnaHQgbm9kZSAoaS5lIHdlIGFyZSBkb25lKVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRvbmU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQcm9jZXNzIHRoaXMgbm9kZVxyXG4gICAgICAgIGlmICh0aGlzLmkgPCB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHNbdGhpcy5pKytdLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLnJpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLmxlZnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvcCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQoKTtcclxuICAgIH07XHJcbiAgICBQcmVPcmRlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKG5vZGUpO1xyXG4gICAgfTtcclxuICAgIFByZU9yZGVyLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuc3RhY2sucG9wKCk7XHJcbiAgICAgICAgdGhpcy5pID0gMDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gUHJlT3JkZXI7XHJcbn0oKSk7XHJcbmV4cG9ydHMuUHJlT3JkZXIgPSBQcmVPcmRlcjtcclxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcclxuICAgIFByZU9yZGVyLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcclxufVxyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbm9kZS1pbnRlcnZhbC10cmVlL2xpYi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQiwgY29tcGFyZSwgY29tcGFyZUNvbnRleHQpIHtcbiAgdmFyIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIG9iakEsIG9iakIpIDogdm9pZCAwO1xuXG4gIGlmIChyZXQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiAhIXJldDtcbiAgfVxuXG4gIGlmIChvYmpBID09PSBvYmpCKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09IFwib2JqZWN0XCIgfHwgIW9iakEgfHwgdHlwZW9mIG9iakIgIT09IFwib2JqZWN0XCIgfHwgIW9iakIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGJIYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuYmluZChvYmpCKTtcblxuICAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBrZXlzQS5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNBW2lkeF07XG5cbiAgICBpZiAoIWJIYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlQSA9IG9iakFba2V5XTtcbiAgICB2YXIgdmFsdWVCID0gb2JqQltrZXldO1xuXG4gICAgcmV0ID0gY29tcGFyZSA/IGNvbXBhcmUuY2FsbChjb21wYXJlQ29udGV4dCwgdmFsdWVBLCB2YWx1ZUIsIGtleSkgOiB2b2lkIDA7XG5cbiAgICBpZiAocmV0ID09PSBmYWxzZSB8fCAocmV0ID09PSB2b2lkIDAgJiYgdmFsdWVBICE9PSB2YWx1ZUIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NoYWxsb3dlcXVhbC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0UmFkaW9BcHBlYXJhbmNlKGRvYzogYW55KTogYW55IHtcbiAgICBjb25zdCBvbGRBcHBlYXJhbmNlRnVuY2l0aW9uOiBGdW5jdGlvbiA9IGRvYy5BY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLlllc05vcm1hbDtcbiAgICBkb2MuQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNOb3JtYWwgPSBmdW5jdGlvbihmb3JtT2JqZWN0OiBhbnkpIHtcbiAgICAgICAgY29uc3QgeG9iajogYW55ID0gb2xkQXBwZWFyYW5jZUZ1bmNpdGlvbihmb3JtT2JqZWN0KTtcbiAgICAgICAgY29uc3Qgc3RyZWFtOiBzdHJpbmdbXSA9IHhvYmouc3RyZWFtLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgY29uc3QgZW5jb2RlQ29sb3I6IHN0cmluZyA9IGRvYy5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKTtcbiAgICAgICAgc3RyZWFtWzBdID0gc3RyZWFtWzBdICsgJ1xcbicgKyBlbmNvZGVDb2xvciArICdcXG4nICsgZW5jb2RlQ29sb3IudG9VcHBlckNhc2UoKTtcbiAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbignXFxuJyk7XG4gICAgICAgIHJldHVybiB4b2JqO1xuICAgIH07XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0udHMiLCJpbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgQ29sb3JlZEJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJpdmF0ZSBjb2xvcjogc3RyaW5nLCBwcml2YXRlIHJlbmRlcldpZHRoPzogbnVtYmVyLCBwcml2YXRlIHJlbmRlckhlaWdodD86IG51bWJlcikge1xuICAgICAgICBzdXBlcih1bmRlZmluZWQsIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRGaWxsQ29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0RmlsbENvbG9yKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RmlsbENvbG9yKHRoaXMuY29sb3IgfHwgJ2JsYWNrJyk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MucmVjdCh0aGlzLnhMZWZ0LCB0aGlzLnlUb3AsXG4gICAgICAgICAgICB0aGlzLnJlbmRlcldpZHRoID8/IHRoaXMud2lkdGgsIHRoaXMucmVuZGVySGVpZ2h0ID8/IHRoaXMuaGVpZ2h0LCAnRicpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldEZpbGxDb2xvcihvbGRGaWxsQ29sb3IpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY29sb3JlZGJyaWNrLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcblxuZXhwb3J0IGNsYXNzIERlc2NyaXB0aW9uQnJpY2sgZXh0ZW5kcyBUZXh0QnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCB0ZXh0KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2Rlc2NyaXB0aW9uLnRzIiwidmFyIGc7XHJcblxyXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxyXG5nID0gKGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzO1xyXG59KSgpO1xyXG5cclxudHJ5IHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcclxuXHRnID0gZyB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCkgfHwgKDEsZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoKGUpIHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxyXG5cdGlmKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpXHJcblx0XHRnID0gd2luZG93O1xyXG59XHJcblxyXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXHJcbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXHJcbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZztcclxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzXG4vLyBtb2R1bGUgaWQgPSA2MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiBnbG9iYWwganNQREYgKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiBBbGV4YW5kZXIgV2VpZHQsXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQmlnZ0E5NFxuICogXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5cbi8qKiBcbioganNQREYgQWNyb0Zvcm0gUGx1Z2luXG4qIEBtb2R1bGUgQWNyb0Zvcm1cbiovXG52YXIganNwZGYgPSByZXF1aXJlKCdqc3BkZicpO1xuKGZ1bmN0aW9uIChqc1BERiwgZ2xvYmFsT2JqKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGpzUERGQVBJID0ganNQREYuQVBJO1xuICAgIHZhciBzY29wZTtcbiAgICB2YXIgc2NhbGVGYWN0b3IgPSAxO1xuICAgIGZ1bmN0aW9uIHRvVW5pY29kZShzdHIpIHtcbiAgICAgICAgdmFyIHVuaWNvZGVTdHJpbmcgPSAnJztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0aGVVbmljb2RlID0gc3RyLmNoYXJDb2RlQXQoaSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB3aGlsZSAodGhlVW5pY29kZS5sZW5ndGggPCA0KSB7XG4gICAgICAgICAgICAgICAgdGhlVW5pY29kZSA9ICcwJyArIHRoZVVuaWNvZGU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdW5pY29kZVN0cmluZyArPSB0aGVVbmljb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnPEZFRkYnICsgdW5pY29kZVN0cmluZyArICc+JztcbiAgICB9XG4gICAgdmFyIHBkZkVzY2FwZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9cXCgvZywgJ1xcXFwoJykucmVwbGFjZSgvXFwpL2csICdcXFxcKScpIH07XG4gICAgdmFyIHBkZlVuZXNjYXBlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZS5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpLnJlcGxhY2UoL1xcXFxcXCgvZywgJygnKS5yZXBsYWNlKC9cXFxcXFwpL2csICcpJyk7IH07XG4gICAgZnVuY3Rpb24gYXJyYXlUb1BkZlVuaWNvZGVBcnJheSh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gJ1sgJztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRvVW5pY29kZSh2YWx1ZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ICs9ICcgXSdcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdmFyIGYyID0gZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICByZXR1cm4gbnVtYmVyLnRvRml4ZWQoMik7IC8vIEllLCAlLjJmXG4gICAgfTtcblxuICAgIHZhciBmNSA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlci50b0ZpeGVkKDUpOyAvLyBJZSwgJS4yZlxuICAgIH07XG5cbiAgICBqc1BERkFQSS5fX2Fjcm9mb3JtX18gPSB7fTtcbiAgICB2YXIgaW5oZXJpdCA9IGZ1bmN0aW9uIChjaGlsZCwgcGFyZW50KSB7XG4gICAgICAgIGNoaWxkLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7XG4gICAgICAgIGNoaWxkLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNoaWxkO1xuICAgIH07XG5cbiAgICB2YXIgc2NhbGUgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gKHggKiBzY2FsZUZhY3Rvcik7XG4gICAgfTtcbiAgICB2YXIgYW50aVNjYWxlID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuICh4IC8gc2NhbGVGYWN0b3IpO1xuICAgIH07XG5cbiAgICB2YXIgY3JlYXRlRm9ybVhPYmplY3QgPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICB2YXIgeG9iaiA9IG5ldyBBY3JvRm9ybVhPYmplY3QoKTtcbiAgICAgICAgdmFyIGhlaWdodCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgfHwgMDtcbiAgICAgICAgdmFyIHdpZHRoID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIHhvYmouQkJveCA9IFswLCAwLCBOdW1iZXIoZjIod2lkdGgpKSwgTnVtYmVyKGYyKGhlaWdodCkpXTtcbiAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQml0LU9wZXJhdGlvbnNcbiAgICAqL1xuICAgIHZhciBzZXRCaXQgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0ID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgbnVtYmVyID0gbnVtYmVyIHx8IDA7XG4gICAgICAgIGJpdFBvc2l0aW9uID0gYml0UG9zaXRpb24gfHwgMDtcblxuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJpdE1hc2sgPSAxIDw8IGJpdFBvc2l0aW9uO1xuXG4gICAgICAgIG51bWJlciB8PSBiaXRNYXNrO1xuXG4gICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfTtcblxuICAgIHZhciBjbGVhckJpdCA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5jbGVhckJpdCA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIG51bWJlciA9IG51bWJlciB8fCAwO1xuICAgICAgICBiaXRQb3NpdGlvbiA9IGJpdFBvc2l0aW9uIHx8IDA7XG5cbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJpdE1hc2sgPSAxIDw8IGJpdFBvc2l0aW9uO1xuXG4gICAgICAgIG51bWJlciAmPSB+Yml0TWFzaztcblxuICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH07XG5cbiAgICB2YXIgZ2V0Qml0ID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmdldEJpdCA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5nZXRCaXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKG51bWJlciAmICgxIDw8IGJpdFBvc2l0aW9uKSkgPT09IDAgPyAwIDogMTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAqIEZmIHN0YXJ0cyBjb3VudGluZyB0aGUgYml0IHBvc2l0aW9uIGF0IDEgYW5kIG5vdCBsaWtlIGphdmFzY3JpcHQgYXQgMFxuICAgICovXG4gICAgdmFyIGdldEJpdEZvclBkZiA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5nZXRCaXRGb3JQZGYgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0Rm9yUGRmJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldEJpdChudW1iZXIsIGJpdFBvc2l0aW9uIC0gMSk7XG4gICAgfTtcblxuICAgIHZhciBzZXRCaXRGb3JQZGYgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0Rm9yUGRmID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLnNldEJpdEZvclBkZicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRCaXQobnVtYmVyLCBiaXRQb3NpdGlvbiAtIDEpO1xuICAgIH07XG5cbiAgICB2YXIgY2xlYXJCaXRGb3JQZGYgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uY2xlYXJCaXRGb3JQZGYgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uY2xlYXJCaXRGb3JQZGYnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xlYXJCaXQobnVtYmVyLCBiaXRQb3NpdGlvbiAtIDEpO1xuICAgIH07XG5cbiAgICB2YXIgY2FsY3VsYXRlQ29vcmRpbmF0ZXMgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uY2FsY3VsYXRlQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICB2YXIgZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGUgPSB0aGlzLmludGVybmFsLmdldEhvcml6b250YWxDb29yZGluYXRlO1xuICAgICAgICB2YXIgZ2V0VmVydGljYWxDb29yZGluYXRlID0gdGhpcy5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGU7XG4gICAgICAgIHZhciB4ID0gYXJnc1swXTtcbiAgICAgICAgdmFyIHkgPSBhcmdzWzFdO1xuICAgICAgICB2YXIgdyA9IGFyZ3NbMl07XG4gICAgICAgIHZhciBoID0gYXJnc1szXTtcblxuICAgICAgICB2YXIgY29vcmRpbmF0ZXMgPSB7fTtcblxuICAgICAgICBjb29yZGluYXRlcy5sb3dlckxlZnRfWCA9IGdldEhvcml6b250YWxDb29yZGluYXRlKHgpIHx8IDA7XG4gICAgICAgIGNvb3JkaW5hdGVzLmxvd2VyTGVmdF9ZID0gZ2V0VmVydGljYWxDb29yZGluYXRlKHkgKyBoKSB8fCAwO1xuICAgICAgICBjb29yZGluYXRlcy51cHBlclJpZ2h0X1ggPSBnZXRIb3Jpem9udGFsQ29vcmRpbmF0ZSh4ICsgdykgfHwgMDtcbiAgICAgICAgY29vcmRpbmF0ZXMudXBwZXJSaWdodF9ZID0gZ2V0VmVydGljYWxDb29yZGluYXRlKHkpIHx8IDA7XG5cbiAgICAgICAgcmV0dXJuIFtOdW1iZXIoZjIoY29vcmRpbmF0ZXMubG93ZXJMZWZ0X1gpKSwgTnVtYmVyKGYyKGNvb3JkaW5hdGVzLmxvd2VyTGVmdF9ZKSksIE51bWJlcihmMihjb29yZGluYXRlcy51cHBlclJpZ2h0X1gpKSwgTnVtYmVyKGYyKGNvb3JkaW5hdGVzLnVwcGVyUmlnaHRfWSkpXTtcbiAgICB9O1xuXG4gICAgdmFyIGNhbGN1bGF0ZUFwcGVhcmFuY2VTdHJlYW0gPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICBpZiAoZm9ybU9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1PYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZvcm1PYmplY3QuViAmJiAhZm9ybU9iamVjdC5EVikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZWxzZSBjYWxjdWxhdGUgaXRcblxuICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgIHZhciB0ZXh0ID0gZm9ybU9iamVjdC5WIHx8IGZvcm1PYmplY3QuRFY7XG4gICAgICAgIHZhciBjYWxjUmVzID0gY2FsY3VsYXRlWChmb3JtT2JqZWN0LCB0ZXh0KTtcbiAgICAgICAgdmFyIGZvbnRLZXkgPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KGZvcm1PYmplY3QuZm9udE5hbWUsIGZvcm1PYmplY3QuZm9udFN0eWxlKS5pZDtcblxuICAgICAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgNDQ0XG4gICAgICAgIHN0cmVhbS5wdXNoKCcvVHggQk1DJyk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCdxJyk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCdCVCcpOyAvLyBCZWdpbiBUZXh0XG4gICAgICAgIHN0cmVhbS5wdXNoKHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJy8nICsgZm9udEtleSArICcgJyArIGYyKGNhbGNSZXMuZm9udFNpemUpICsgJyBUZicpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnMSAwIDAgMSAwIDAgVG0nKTsvLyBUcmFuc2Zvcm1hdGlvbiBNYXRyaXhcbiAgICAgICAgc3RyZWFtLnB1c2goY2FsY1Jlcy50ZXh0KTtcbiAgICAgICAgc3RyZWFtLnB1c2goJ0VUJyk7IC8vIEVuZCBUZXh0ICAgIFxuICAgICAgICBzdHJlYW0ucHVzaCgnUScpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnRU1DJyk7XG5cbiAgICAgICAgdmFyIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgcmV0dXJuIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50O1xuICAgIH07XG5cbiAgICB2YXIgY2FsY3VsYXRlWCA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0LCB0ZXh0KSB7XG4gICAgICAgIGlmIChmb3JtT2JqZWN0LmlzVW5pY29kZSkgdGV4dCA9IGZvcm1PYmplY3QudHJ1ZVZhbHVlO1xuICAgICAgICAgdmFyIG1heEZvbnRTaXplID1cbiAgICAgICAgICAgIGZvcm1PYmplY3QuZm9udFNpemUgPT09IDAgPyBmb3JtT2JqZWN0Lm1heEZvbnRTaXplIDogZm9ybU9iamVjdC5mb250U2l6ZTtcbiAgICAgICAgdmFyIHJldHVyblZhbHVlID0ge1xuICAgICAgICAgICAgdGV4dDogXCJcIixcbiAgICAgICAgICAgIGZvbnRTaXplOiBcIlwiXG4gICAgICAgIH07XG4gICAgICAgIC8vIFJlbW92ZSBCcmFja2V0c1xuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHIoMCwgMSkgPT0gXCIoXCIgPyB0ZXh0LnN1YnN0cigxKSA6IHRleHQ7XG4gICAgICAgIHRleHQgPVxuICAgICAgICAgICAgdGV4dC5zdWJzdHIodGV4dC5sZW5ndGggLSAxKSA9PSBcIilcIlxuICAgICAgICAgICAgPyB0ZXh0LnN1YnN0cigwLCB0ZXh0Lmxlbmd0aCAtIDEpXG4gICAgICAgICAgICA6IHRleHQ7XG4gICAgICAgIC8vIHNwbGl0IGludG8gYXJyYXkgb2Ygd29yZHNcbiAgICAgICAgdmFyIHRleHRTcGxpdCA9IHRleHQuc3BsaXQoXCIgXCIpO1xuICAgICAgICB0ZXh0U3BsaXQgPSB0ZXh0U3BsaXQubWFwKGZ1bmN0aW9uICh3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gd29yZC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZm9ybU9iamVjdC5tdWx0aWxpbmUpIHtcbiAgICAgICAgICAgIHRleHRTcGxpdCA9IHRleHRTcGxpdC5tYXAoZnVuY3Rpb24gKGFycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBbYXJyLmpvaW4oXCIgXCIpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZm9udFNpemUgPSBtYXhGb250U2l6ZTsgLy8gVGhlIFN0YXJ0aW5nIGZvbnRTaXplIChUaGUgTWF4aW11bSlcbiAgICAgICAgdmFyIGxpbmVTcGFjaW5nID0gMjtcbiAgICAgICAgdmFyIGJvcmRlclBhZGRpbmcgPSAyO1xuXG4gICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIGhlaWdodCA9IGhlaWdodCA8IDAgPyAtaGVpZ2h0IDogaGVpZ2h0O1xuICAgICAgICB2YXIgd2lkdGggPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgfHwgMDtcbiAgICAgICAgd2lkdGggPSB3aWR0aCA8IDAgPyAtd2lkdGggOiB3aWR0aDtcblxuICAgICAgICB2YXIgaXNTbWFsbGVyVGhhbldpZHRoID0gZnVuY3Rpb24oaSwgbGFzdExpbmUsIGZvbnRTaXplKSB7XG4gICAgICAgICAgICBpZiAoaSArIDEgPCB0ZXh0U3BsaXQubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gbGFzdExpbmUgKyBcIiBcIiArIHRleHRTcGxpdFtpICsgMV1bMF07XG4gICAgICAgICAgICB2YXIgVGV4dFdpZHRoID0gY2FsY3VsYXRlRm9udFNwYWNlKHRtcCwgZm9ybU9iamVjdCwgZm9udFNpemUpLndpZHRoO1xuICAgICAgICAgICAgdmFyIEZpZWxkV2lkdGggPSB3aWR0aCAtIDIgKiBib3JkZXJQYWRkaW5nO1xuICAgICAgICAgICAgcmV0dXJuIFRleHRXaWR0aCA8PSBGaWVsZFdpZHRoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBmb250U2l6ZSsrO1xuICAgICAgICBGb250U2l6ZTogd2hpbGUgKGZvbnRTaXplID4gMCkge1xuICAgICAgICAgICAgdGV4dCA9IFwiXCI7XG4gICAgICAgICAgICBmb250U2l6ZS0tO1xuICAgICAgICAgICAgdmFyIHRleHRIZWlnaHQgPSBjYWxjdWxhdGVGb250U3BhY2UoXCIzXCIsIGZvcm1PYmplY3QsIGZvbnRTaXplKS5oZWlnaHQ7XG4gICAgICAgICAgICB2YXIgc3RhcnRZID0gZm9ybU9iamVjdC5tdWx0aWxpbmVcbiAgICAgICAgICAgID8gaGVpZ2h0IC0gZm9udFNpemVcbiAgICAgICAgICAgIDogKGhlaWdodCAtIHRleHRIZWlnaHQpIC8gMjtcbiAgICAgICAgICAgIHN0YXJ0WSArPSBsaW5lU3BhY2luZztcbiAgICAgICAgICAgIHZhciBzdGFydFg7XG5cbiAgICAgICAgICAgIHZhciBsYXN0WSA9IHN0YXJ0WTtcbiAgICAgICAgICAgIHZhciBmaXJzdFdvcmRJbkxpbmUgPSAwLFxuICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSAwO1xuICAgICAgICAgICAgdmFyIGxhc3RMZW5ndGg7XG4gICAgICAgICAgICB2YXIgY3VycldvcmQgPSAwO1xuXG4gICAgICAgICAgICBpZiAoZm9udFNpemUgPD0gMCkge1xuICAgICAgICAgICAgLy8gSW4gY2FzZSwgdGhlIFRleHQgZG9lc24ndCBmaXQgYXQgYWxsXG4gICAgICAgICAgICBmb250U2l6ZSA9IDEyO1xuICAgICAgICAgICAgdGV4dCA9IFwiKC4uLikgVGpcXG5cIjtcbiAgICAgICAgICAgIHRleHQgKz1cbiAgICAgICAgICAgICAgICBcIiUgV2lkdGggb2YgVGV4dDogXCIgK1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUZvbnRTcGFjZSh0ZXh0LCBmb3JtT2JqZWN0LCBmb250U2l6ZSkud2lkdGggK1xuICAgICAgICAgICAgICAgIFwiLCBGaWVsZFdpZHRoOlwiICtcbiAgICAgICAgICAgICAgICB3aWR0aCArXG4gICAgICAgICAgICAgICAgXCJcXG5cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbGFzdExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgdmFyIGxpbmVDb3VudCA9IDA7XG4gICAgICAgICAgICBMaW5lOiBmb3IgKHZhciBpID0gMDsgaSA8IHRleHRTcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRleHRTcGxpdC5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBpc1dpdGhOZXdMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRTcGxpdFtpXS5sZW5ndGggIT09IDEgJiYgY3VycldvcmQgIT09IHRleHRTcGxpdFtpXS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAodGV4dEhlaWdodCArIGxpbmVTcGFjaW5nKSAqIChsaW5lQ291bnQgKyAyKSArIGxpbmVTcGFjaW5nID5cbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxhc3RMaW5lICs9IHRleHRTcGxpdFtpXVtjdXJyV29yZF07XG4gICAgICAgICAgICAgICAgaXNXaXRoTmV3TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSBpO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxhc3RMaW5lICs9IHRleHRTcGxpdFtpXVtjdXJyV29yZF0gKyBcIiBcIjtcbiAgICAgICAgICAgICAgICBsYXN0TGluZSA9XG4gICAgICAgICAgICAgICAgICAgIGxhc3RMaW5lLnN1YnN0cihsYXN0TGluZS5sZW5ndGggLSAxKSA9PSBcIiBcIlxuICAgICAgICAgICAgICAgICAgICA/IGxhc3RMaW5lLnN1YnN0cigwLCBsYXN0TGluZS5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICA6IGxhc3RMaW5lO1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBwYXJzZUludChpKTtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dExpbmVJc1NtYWxsZXIgPSBpc1NtYWxsZXJUaGFuV2lkdGgoa2V5LCBsYXN0TGluZSwgZm9udFNpemUpO1xuICAgICAgICAgICAgICAgIHZhciBpc0xhc3RXb3JkID0gaSA+PSB0ZXh0U3BsaXQubGVuZ3RoIC0gMTtcblxuICAgICAgICAgICAgICAgIGlmIChuZXh0TGluZUlzU21hbGxlciAmJiAhaXNMYXN0V29yZCkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0TGluZSArPSBcIiBcIjtcbiAgICAgICAgICAgICAgICAgICAgY3VycldvcmQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTGluZVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5leHRMaW5lSXNTbWFsbGVyICYmICFpc0xhc3RXb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZm9ybU9iamVjdC5tdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgRm9udFNpemU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICh0ZXh0SGVpZ2h0ICsgbGluZVNwYWNpbmcpICogKGxpbmVDb3VudCArIDIpICsgbGluZVNwYWNpbmcgPlxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFRleHQgaXMgaGlnaGVyIHRoYW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWVsZE9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgRm9udFNpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdvIG9uXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTGFzdFdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSBrZXk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBmb3JtT2JqZWN0Lm11bHRpbGluZSAmJlxuICAgICAgICAgICAgICAgICAgICAodGV4dEhlaWdodCArIGxpbmVTcGFjaW5nKSAqIChsaW5lQ291bnQgKyAyKSArIGxpbmVTcGFjaW5nID5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFRleHQgaXMgaGlnaGVyIHRoYW4gdGhlIEZpZWxkT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbGFzdCBibGFua1xuXG4gICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBcIlwiO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IGZpcnN0V29yZEluTGluZTsgeCA8PSBsYXN0V29yZEluTGluZTsgeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjdXJyTGluZSA9IHRleHRTcGxpdFt4XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1PYmplY3QubXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PT0gbGFzdFdvcmRJbkxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gY3VyckxpbmVbY3VycldvcmRdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyV29yZCA9IChjdXJyV29yZCArIDEpICUgY3VyckxpbmUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PT0gZmlyc3RXb3JkSW5MaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lICs9IGN1cnJMaW5lW2N1cnJMaW5lLmxlbmd0aCAtIDFdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsaW5lICs9IGN1cnJMaW5lWzBdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGxhc3QgYmxhbmtcbiAgICAgICAgICAgICAgICBsaW5lID1cbiAgICAgICAgICAgICAgICBsaW5lLnN1YnN0cihsaW5lLmxlbmd0aCAtIDEpID09IFwiIFwiXG4gICAgICAgICAgICAgICAgICAgID8gbGluZS5zdWJzdHIoMCwgbGluZS5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICA6IGxpbmU7XG4gICAgICAgICAgICAgICAgLy8gbGFzdExlbmd0aCAtPSBibGFua1NwYWNlLndpZHRoO1xuICAgICAgICAgICAgICAgIGxhc3RMZW5ndGggPSBjYWxjdWxhdGVGb250U3BhY2UobGluZSwgZm9ybU9iamVjdCwgZm9udFNpemUpLndpZHRoO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHN0YXJ0WFxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZm9ybU9iamVjdC50ZXh0QWxpZ24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwicmlnaHRcIjpcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYID0gd2lkdGggLSBsYXN0TGVuZ3RoIC0gYm9yZGVyUGFkZGluZztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgICAgICAgICAgICBzdGFydFggPSAod2lkdGggLSBsYXN0TGVuZ3RoKSAvIDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYID0gYm9yZGVyUGFkZGluZztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRleHQgKz0gZjIoc3RhcnRYKSArIFwiIFwiICsgZjIobGFzdFkpICsgXCIgVGRcXG5cIjtcblxuICAgICAgICAgICAgICAgIGlmIChmb3JtT2JqZWN0LmlzVW5pY29kZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZm9udExpc3QgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZm9udExpc3Rbc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udCgpLmlkXSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBsaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgeDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZzogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRXNjYXBlOiBwZGZFc2NhcGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRm9udEtleTogc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udCgpLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzOiBmb250TGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVGb250U2l6ZTogZm9ybU9iamVjdC5mb250U2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMucHVibGlzaCgncG9zdFByb2Nlc3NUZXh0JywgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gJzwnICsgcGF5bG9hZC50ZXh0ICsgJz4gVGpcXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnKCcgKyBwZGZFc2NhcGUobGluZSkgKyAnKSBUalxcbic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHJlc2V0IFggaW4gUERGXG4gICAgICAgICAgICAgICAgdGV4dCArPSAtZjIoc3RhcnRYKSArIFwiIDAgVGRcXG5cIjtcblxuICAgICAgICAgICAgICAgIC8vIEFmdGVyIGEgTGluZSwgYWRqdXN0IHkgcG9zaXRpb25cbiAgICAgICAgICAgICAgICBsYXN0WSA9IC0oZm9udFNpemUgKyBsaW5lU3BhY2luZyk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZXNldCBmb3IgbmV4dCBpdGVyYXRpb24gc3RlcFxuICAgICAgICAgICAgICAgIGxhc3RMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGZpcnN0V29yZEluTGluZSA9IGlzV2l0aE5ld0xpbmUgPyBsYXN0V29yZEluTGluZSA6IGxhc3RXb3JkSW5MaW5lICsgMTtcbiAgICAgICAgICAgICAgICBsaW5lQ291bnQrKztcblxuICAgICAgICAgICAgICAgIGxhc3RMaW5lID0gXCJcIjtcbiAgICAgICAgICAgICAgICBjb250aW51ZSBMaW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm5WYWx1ZS50ZXh0ID0gdGV4dDtcbiAgICAgICAgcmV0dXJuVmFsdWUuZm9udFNpemUgPSBmb250U2l6ZTtcblxuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogU21hbGwgd29ya2Fyb3VuZCBmb3IgY2FsY3VsYXRpbmcgdGhlIFRleHRNZXRyaWMgYXBwcm94aW1hdGVseS5cbiAgICAqIFxuICAgICogQHBhcmFtIHRleHRcbiAgICAqIEBwYXJhbSBmb250c2l6ZVxuICAgICogQHJldHVybnMge1RleHRNZXRyaWNzfSAoSGFzIEhlaWdodCBhbmQgV2lkdGgpXG4gICAgKi9cbiAgICB2YXIgY2FsY3VsYXRlRm9udFNwYWNlID0gZnVuY3Rpb24gKHRleHQsIGZvcm1PYmplY3QsIGZvbnRTaXplKSB7XG4gICAgICAgIHZhciBmb250ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSk7XG4gICAgICAgIHZhciB3aWR0aCA9IHNjb3BlLmdldFN0cmluZ1VuaXRXaWR0aCh0ZXh0LCB7IGZvbnQ6IGZvbnQsIGZvbnRTaXplOiBwYXJzZUZsb2F0KGZvbnRTaXplKSwgY2hhclNwYWNlOiAwIH0pICogcGFyc2VGbG9hdChmb250U2l6ZSk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBzY29wZS5nZXRTdHJpbmdVbml0V2lkdGgoXCIzXCIsIHsgZm9udDogZm9udCwgZm9udFNpemU6IHBhcnNlRmxvYXQoZm9udFNpemUpLCBjaGFyU3BhY2U6IDAgfSkgKiBwYXJzZUZsb2F0KGZvbnRTaXplKSAqIDEuNTtcbiAgICAgICAgcmV0dXJuIHsgaGVpZ2h0OiBoZWlnaHQsIHdpZHRoOiB3aWR0aCB9O1xuICAgIH07XG5cbiAgICB2YXIgYWNyb2Zvcm1QbHVnaW5UZW1wbGF0ZSA9IHtcbiAgICAgICAgZmllbGRzOiBbXSxcbiAgICAgICAgeEZvcm1zOiBbXSxcbiAgICAgICAgLyoqXG4gICAgICAgICogYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQWNyb0Zvcm1cbiAgICAgICAgKiBEaWN0aW9uYXJ5IDA6IFRoZSBFdmVudC1Ub2tlbiwgdGhlIEFjcm9Gb3JtRGljdGlvbmFyeUNhbGxiYWNrIGhhc1xuICAgICAgICAqIDE6IFRoZSBPYmplY3QgSUQgb2YgdGhlIFJvb3RcbiAgICAgICAgKi9cbiAgICAgICAgYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdDogbnVsbCxcbiAgICAgICAgLyoqXG4gICAgICAgICogQWZ0ZXIgdGhlIFBERiBnZXRzIGV2YWx1YXRlZCwgdGhlIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBoYXMgdG8gYmVcbiAgICAgICAgKiByZXNldCwgdGhpcyBpbmRpY2F0ZXMsIHdoZXRoZXIgdGhlIHJvb3QgaGFzIGFscmVhZHkgYmVlbiBwcmludGVkXG4gICAgICAgICogb3V0XG4gICAgICAgICovXG4gICAgICAgIHByaW50ZWRPdXQ6IGZhbHNlLFxuICAgICAgICBpbnRlcm5hbDogbnVsbCxcbiAgICAgICAgaXNJbml0aWFsaXplZDogZmFsc2VcbiAgICB9O1xuXG4gICAgdmFyIGFubm90UmVmZXJlbmNlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vc2V0IG9iaklkIHRvIHVuZGVmaW5lZCBhbmQgZm9yY2UgaXQgdG8gZ2V0IGEgbmV3IG9iaklkIG9uIGJ1aWxkRG9jdW1lbnRcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGZpZWxkcyA9IHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuRmllbGRzO1xuICAgICAgICBmb3IgKHZhciBpIGluIGZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGZpZWxkcy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBmb3JtT2JqZWN0ID0gZmllbGRzW2ldO1xuICAgICAgICAgICAgICAgIC8vc2V0IG9iaklkIHRvIHVuZGVmaW5lZCBhbmQgZm9yY2UgaXQgdG8gZ2V0IGEgbmV3IG9iaklkIG9uIGJ1aWxkRG9jdW1lbnRcbiAgICAgICAgICAgICAgICBmb3JtT2JqZWN0Lm9iaklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIC8vIGFkZCBBbm5vdCBSZWZlcmVuY2UhXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1PYmplY3QuaGFzQW5ub3RhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZXMgYW4gQW5ub3RhdGlvbiBXaWRnZXQgaW4gdGhlIEZvcm0gT2JqZWN0LCBwdXQgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBpbiB0aGUgL0Fubm90IGFycmF5XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFubm90YXRpb25SZWZlcmVuY2UuY2FsbChzY29wZSwgZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBwdXRGb3JtID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgaWYgKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnByaW50ZWRPdXQpIHtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnByaW50ZWRPdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCkge1xuICAgICAgICAgICAgaW5pdGlhbGl6ZUFjcm9Gb3JtLmNhbGwoc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuRmllbGRzLnB1c2goZm9ybU9iamVjdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAqIENyZWF0ZSB0aGUgUmVmZXJlbmNlIHRvIHRoZSB3aWRnZXRBbm5vdGF0aW9uLCBzbyB0aGF0IGl0IGdldHMgcmVmZXJlbmNlZFxuICAgICogaW4gdGhlIEFubm90W10gaW50IHRoZSsgKFJlcXVpcmVzIHRoZSBBbm5vdGF0aW9uIFBsdWdpbilcbiAgICAqL1xuICAgIHZhciBjcmVhdGVBbm5vdGF0aW9uUmVmZXJlbmNlID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdyZWZlcmVuY2UnLFxuICAgICAgICAgICAgb2JqZWN0OiBvYmplY3RcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGZpbmRFbnRyeSA9IGZ1bmN0aW9uIChlbnRyeSkgeyByZXR1cm4gKGVudHJ5LnR5cGUgPT09IG9wdGlvbnMudHlwZSAmJiBlbnRyeS5vYmplY3QgPT09IG9wdGlvbnMub2JqZWN0KTsgfTtcbiAgICAgICAgaWYgKHNjb3BlLmludGVybmFsLmdldFBhZ2VJbmZvKG9iamVjdC5wYWdlKS5wYWdlQ29udGV4dC5hbm5vdGF0aW9ucy5maW5kKGZpbmRFbnRyeSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZ2V0UGFnZUluZm8ob2JqZWN0LnBhZ2UpLnBhZ2VDb250ZXh0LmFubm90YXRpb25zLnB1c2gob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2FsbGJhY2tzXG5cbiAgICB2YXIgcHV0Q2F0YWxvZ0NhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBQdXQgcmVmZXJlbmNlIHRvIEFjcm9Gb3JtIHRvIERvY3VtZW50Q2F0YWxvZ1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGZvciBzYWZldHksIHNob3VsZG4ndCBub3JtYWxseSBiZSB0aGUgY2FzZVxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwud3JpdGUoJy9BY3JvRm9ybSAnICsgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZCArICcgJyArIDAgKyAnIFInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHV0Q2F0YWxvZ0NhbGxiYWNrOiBSb290IG1pc3NpbmcuJyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBBZGRzIC9BY3JvZm9ybSBYIDAgUiB0byBEb2N1bWVudCBDYXRhbG9nLCBhbmQgY3JlYXRlcyB0aGUgQWNyb0Zvcm1cbiAgICAqIERpY3Rpb25hcnlcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybURpY3Rpb25hcnlDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGV2ZW50XG4gICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy51bnN1YnNjcmliZShzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Ll9ldmVudElEKTtcbiAgICAgICAgZGVsZXRlIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuX2V2ZW50SUQ7XG4gICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnByaW50ZWRPdXQgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIENyZWF0ZXMgdGhlIHNpbmdsZSBGaWVsZHMgYW5kIHdyaXRlcyB0aGVtIGludG8gdGhlIERvY3VtZW50XG4gICAgKiBcbiAgICAqIElmIGZpZWxkQXJyYXkgaXMgc2V0LCB1c2UgdGhlIGZpZWxkcyB0aGF0IGFyZSBpbnNpZGUgaXQgaW5zdGVhZCBvZiB0aGVcbiAgICAqIGZpZWxkcyBmcm9tIHRoZSBBY3JvUm9vdCAoZm9yIHRoZSBGb3JtWE9iamVjdHMuLi4pXG4gICAgKi9cbiAgICB2YXIgY3JlYXRlRmllbGRDYWxsYmFjayA9IGZ1bmN0aW9uIChmaWVsZEFycmF5KSB7XG4gICAgICAgIHZhciBzdGFuZGFyZEZpZWxkcyA9ICghZmllbGRBcnJheSk7XG5cbiAgICAgICAgaWYgKCFmaWVsZEFycmF5KSB7XG4gICAgICAgICAgICAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGZpZWxkQXJyYXkgc3BlY2lmaWVkLCB3ZSB3YW50IHRvIHByaW50IG91dFxuICAgICAgICAgICAgLy8gdGhlIEZpZWxkcyBvZiB0aGUgQWNyb0Zvcm1cbiAgICAgICAgICAgIC8vIFByaW50IG91dCBSb290XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5uZXdPYmplY3REZWZlcnJlZEJlZ2luKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Qub2JqSWQsIHRydWUpO1xuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5wdXRTdHJlYW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkQXJyYXkgPSBmaWVsZEFycmF5IHx8IHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuS2lkcztcblxuICAgICAgICBmb3IgKHZhciBpIGluIGZpZWxkQXJyYXkpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZEFycmF5Lmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkT2JqZWN0ID0gZmllbGRBcnJheVtpXTtcbiAgICAgICAgICAgICAgICB2YXIga2V5VmFsdWVMaXN0ID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG9sZFJlY3QgPSBmaWVsZE9iamVjdC5SZWN0O1xuXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkT2JqZWN0LlJlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRPYmplY3QuUmVjdCA9IGNhbGN1bGF0ZUNvb3JkaW5hdGVzLmNhbGwodGhpcywgZmllbGRPYmplY3QuUmVjdCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgV3JpdGluZyB0aGUgT2JqZWN0XG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihmaWVsZE9iamVjdC5vYmpJZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBmaWVsZE9iamVjdC5EQSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5jcmVhdGVEZWZhdWx0QXBwZWFyYW5jZVN0cmVhbShmaWVsZE9iamVjdCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkT2JqZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBmaWVsZE9iamVjdC5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QgPSBmaWVsZE9iamVjdC5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmaWVsZE9iamVjdC5SZWN0ID0gb2xkUmVjdDtcblxuICAgICAgICAgICAgICAgIGlmIChmaWVsZE9iamVjdC5oYXNBcHBlYXJhbmNlU3RyZWFtICYmICFmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgQXBwZWFyYW5jZVxuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZSA9IGNhbGN1bGF0ZUFwcGVhcmFuY2VTdHJlYW0uY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiAnQVAnLCB2YWx1ZTogXCI8PC9OIFwiICsgYXBwZWFyYW5jZSArIFwiPj5cIiB9KTtcblxuICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMucHVzaChhcHBlYXJhbmNlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBc3N1bWUgQXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgaXMgYSBBcnJheSB3aXRoIE4sUixEIChhdCBsZWFzdFxuICAgICAgICAgICAgICAgIC8vIG9uZSBvZiB0aGVtISlcbiAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgTixSIGFuZCBEXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudC5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50W2tdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKz0gKFwiL1wiICsgayArIFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IFwiPDxcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA+PSAxIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGVhcmFuY2VTdHJlYW0gaXMgYW4gQXJyYXkgb3IgT2JqZWN0IVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gdmFsdWVbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgRnVuY3Rpb24gaXMgcmVmZXJlbmNlZCwgY2FsbCBpdCBpbiBvcmRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBnZXQgdGhlIEZvcm1YT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IG9iai5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSAoXCIvXCIgKyBpICsgXCIgXCIgKyBvYmogKyBcIiBcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBYRm9ybSBpcyBhbHJlYWR5IHVzZWQsIGUuZy4gT2ZmU3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBDaGVja0JveGVzLCBkb24ndCBhZGQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMuaW5kZXhPZihvYmopID49IDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMucHVzaChvYmopO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIEZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQsIGNhbGwgaXQgaW4gb3JkZXIgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgRm9ybVhPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IG9iai5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IChcIi9cIiArIGkgKyBcIiBcIiArIG9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5pbmRleE9mKG9iaikgPj0gMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMucHVzaChvYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IFwiPj5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFwcGVhcmFuY2Ugc3RyZWFtIGlzIGEgbm9ybWFsIE9iamVjdC4uXG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiAnQVAnLCB2YWx1ZTogXCI8PFxcblwiICsgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArIFwiPj5cIiB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5wdXRTdHJlYW0oeyBhZGRpdGlvbmFsS2V5VmFsdWVzOiBrZXlWYWx1ZUxpc3QgfSk7XG5cbiAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5vdXQoXCJlbmRvYmpcIik7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhbmRhcmRGaWVsZHMpIHtcbiAgICAgICAgICAgIGNyZWF0ZVhGb3JtT2JqZWN0Q2FsbGJhY2suY2FsbCh0aGlzLCBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBjcmVhdGVYRm9ybU9iamVjdENhbGxiYWNrID0gZnVuY3Rpb24gKGZpZWxkQXJyYXkpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBmaWVsZEFycmF5KSB7XG4gICAgICAgICAgICBpZiAoZmllbGRBcnJheS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBpO1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZE9iamVjdCA9IGZpZWxkQXJyYXlbaV07XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgV3JpdGluZyB0aGUgT2JqZWN0XG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihmaWVsZE9iamVjdCAmJiBmaWVsZE9iamVjdC5vYmpJZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkT2JqZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBmaWVsZE9iamVjdC5wdXRTdHJlYW0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZE9iamVjdC5wdXRTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGZpZWxkQXJyYXlba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgaW5pdGlhbGl6ZUFjcm9Gb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbCAhPT0gdW5kZWZpbmVkICYmICh0aGlzLmludGVybmFsLmFjcm9mb3JtUGx1Z2luID09PSB1bmRlZmluZWQgfHwgdGhpcy5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5pc0luaXRpYWxpemVkID09PSBmYWxzZSkpIHtcblxuICAgICAgICAgICAgc2NvcGUgPSB0aGlzO1xuXG4gICAgICAgICAgICBBY3JvRm9ybUZpZWxkLkZpZWxkTnVtID0gMDtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFjcm9mb3JtUGx1Z2luVGVtcGxhdGUpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeGNlcHRpb24gd2hpbGUgY3JlYXRpbmcgQWNyb2Zvcm1EaWN0aW9uYXJ5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NhbGVGYWN0b3IgPSBzY29wZS5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgICAgIC8vIFRoZSBPYmplY3QgTnVtYmVyIG9mIHRoZSBBY3JvRm9ybSBEaWN0aW9uYXJ5XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290ID0gbmV3IEFjcm9Gb3JtRGljdGlvbmFyeSgpO1xuXG4gICAgICAgICAgICAvLyBhZGQgQ2FsbGJhY2sgZm9yIGNyZWF0aW5nIHRoZSBBY3JvRm9ybSBEaWN0aW9uYXJ5XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Ll9ldmVudElEID0gc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgncG9zdFB1dFJlc291cmNlcycsIEFjcm9Gb3JtRGljdGlvbmFyeUNhbGxiYWNrKTtcblxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnYnVpbGREb2N1bWVudCcsIGFubm90UmVmZXJlbmNlQ2FsbGJhY2spOyAvLyBidWlsZERvY3VtZW50XG5cbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGV2ZW50LCB0aGF0IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBEb2N1bWVudENhdGFsb2cgaXNcbiAgICAgICAgICAgIC8vIHdyaXR0ZW4sIGluIG9yZGVyIHRvIGFkZCAvQWNyb0Zvcm1cbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ3B1dENhdGFsb2cnLCBwdXRDYXRhbG9nQ2FsbGJhY2spO1xuXG4gICAgICAgICAgICAvLyBSZWdpc3RlciBldmVudCwgdGhhdCBjcmVhdGVzIGFsbCBGaWVsZHNcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ3Bvc3RQdXRQYWdlcycsIGNyZWF0ZUZpZWxkQ2FsbGJhY2spO1xuXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgMjYsIDcuMy42XG4gICAgdmFyIGFycmF5VG9QZGZBcnJheSA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5hcnJheVRvUGRmQXJyYXkgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9ICdbJztcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9ICcgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgYXJyYXlbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGFycmF5W2ldLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXS5zdWJzdHIoMCwgMSkgIT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gJygnICsgcGRmRXNjYXBlKGFycmF5W2ldLnRvU3RyaW5nKCkpICsgJyknO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGFycmF5W2ldLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZW50ICs9ICddJztcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuX19hY3JvZm9ybV9fLmFycmF5VG9QZGZBcnJheScpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gZ2V0TWF0Y2hlcyhzdHJpbmcsIHJlZ2V4LCBpbmRleCkge1xuICAgICAgICBpbmRleCB8fCAoaW5kZXggPSAxKTsgLy8gZGVmYXVsdCB0byB0aGUgZmlyc3QgY2FwdHVyaW5nIGdyb3VwXG4gICAgICAgIHZhciBtYXRjaGVzID0gW107XG4gICAgICAgIHZhciBtYXRjaDtcbiAgICAgICAgd2hpbGUgKG1hdGNoID0gcmVnZXguZXhlYyhzdHJpbmcpKSB7XG4gICAgICAgICAgICBtYXRjaGVzLnB1c2gobWF0Y2hbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICB9XG4gICAgdmFyIHBkZkFycmF5VG9TdHJpbmdBcnJheSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgYXJyYXkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGdldE1hdGNoZXMoYXJyYXksIC9cXCgoLio/KVxcKS9nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICB2YXIgdG9QZGZTdHJpbmcgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHN0cmluZyB8fCBcIlwiO1xuICAgICAgICBzdHJpbmcudG9TdHJpbmcoKTtcbiAgICAgICAgc3RyaW5nID0gJygnICsgcGRmRXNjYXBlKHN0cmluZykgKyAnKSc7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgfTtcblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gICAgLy8gQ2xhc3Nlc1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVBERk9iamVjdFxuICAgICogQGNsYXNzZGVzYyBBIEFjcm9Gb3JtUERGT2JqZWN0XG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1QREZPYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfb2JqSWQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1QREZPYmplY3Qjb2JqSWRcbiAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ29iaklkJywge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfb2JqSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX29iaklkID0gc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vYmpJZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX29iaklkID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBmdW5jdGlvbiBBY3JvRm9ybVBERk9iamVjdC50b1N0cmluZ1xuICAgICovXG4gICAgQWNyb0Zvcm1QREZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYmpJZCArIFwiIDAgUlwiO1xuICAgIH07XG5cbiAgICBBY3JvRm9ybVBERk9iamVjdC5wcm90b3R5cGUucHV0U3RyZWFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIga2V5VmFsdWVMaXN0ID0gdGhpcy5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0oKTtcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwucHV0U3RyZWFtKHsgZGF0YTogdGhpcy5zdHJlYW0sIGFkZGl0aW9uYWxLZXlWYWx1ZXM6IGtleVZhbHVlTGlzdCB9KTtcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwub3V0KFwiZW5kb2JqXCIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgYW4ga2V5LXZhbHVlLUxpc3Qgb2YgYWxsIG5vbi1jb25maWd1cmFibGUgVmFyaWFibGVzIGZyb20gdGhlIE9iamVjdFxuICAgICogXG4gICAgKiBAbmFtZSBnZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW1cbiAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgKi9cbiAgICBBY3JvRm9ybVBERk9iamVjdC5wcm90b3R5cGUuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY3JlYXRlS2V5VmFsdWVMaXN0RnJvbUZpZWxkT2JqZWN0ID0gZnVuY3Rpb24gKGZpZWxkT2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIga2V5VmFsdWVMaXN0ID0gW107XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGZpZWxkT2JqZWN0KS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoa2V5ICE9ICdjb250ZW50JyAmJiBrZXkgIT0gJ2FwcGVhcmFuY2VTdHJlYW1Db250ZW50JyAmJiBrZXkuc3Vic3RyaW5nKDAsIDEpICE9IFwiX1wiKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIGtleXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmaWVsZE9iamVjdCwga2V5c1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5RGVzY3JpcHRvciAmJiBwcm9wZXJ0eURlc2NyaXB0b3IuY29uZmlndXJhYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZmllbGRPYmplY3Rba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleToga2V5LCB2YWx1ZTogYXJyYXlUb1BkZkFycmF5KHZhbHVlKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBBY3JvRm9ybVBERk9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgaXQgaXMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBQREZPYmplY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSB0aGUgcmVmZXJlbmNlIG51bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZS5vYmpJZCArIFwiIDAgUlwiIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlWYWx1ZUxpc3Q7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUtleVZhbHVlTGlzdEZyb21GaWVsZE9iamVjdCh0aGlzKTtcbiAgICB9O1xuXG4gICAgdmFyIEFjcm9Gb3JtWE9iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1QREZPYmplY3QuY2FsbCh0aGlzKTtcblxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVHlwZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiBcIi9YT2JqZWN0XCIsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnU3VidHlwZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiBcIi9Gb3JtXCIsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRm9ybVR5cGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9CQm94ID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnQkJveCcsIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0JCb3g7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQkJveCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1Jlc291cmNlcycsIHtcbiAgICAgICAgICAgIHZhbHVlOiBcIjIgMCBSXCIsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfc3RyZWFtO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3N0cmVhbScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfc3RyZWFtID0gdmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3RyZWFtO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGluaGVyaXQoQWNyb0Zvcm1YT2JqZWN0LCBBY3JvRm9ybVBERk9iamVjdCk7XG5cbiAgICB2YXIgQWNyb0Zvcm1EaWN0aW9uYXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybVBERk9iamVjdC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHZhciBfS2lkcyA9IFtdO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnS2lkcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9LaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9LaWRzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGaWVsZHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0tpZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERlZmF1bHQgQXBwZWFyYW5jZVxuICAgICAgICB2YXIgX0RBO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0RBJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfREEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICcoJyArIF9EQSArICcpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0RBID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpbmhlcml0KEFjcm9Gb3JtRGljdGlvbmFyeSwgQWNyb0Zvcm1QREZPYmplY3QpO1xuXG4gICAgLyoqXG4gICAgKiBUaGUgRmllbGQgT2JqZWN0IGNvbnRhaW5zIHRoZSBWYXJpYWJsZXMsIHRoYXQgZXZlcnkgRmllbGQgbmVlZHNcbiAgICAqIFxuICAgICogQGNsYXNzIEFjcm9Gb3JtRmllbGRcbiAgICAqIEBjbGFzc2Rlc2MgQW4gQWNyb0Zvcm0gRmllbGRPYmplY3RcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybVBERk9iamVjdC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8vQW5ub3RhdGlvbi1GbGFnIFNlZSBUYWJsZSAxNjVcbiAgICAgICAgdmFyIF9GID0gNDtcbiAgICAgICAgdGhpcy5pc1VuaWNvZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50cnVlVmFsdWUgPSAnJztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9GO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX0YgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgZm9yIGF0dHJpYnV0ZSBGIHN1cHBsaWVkLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjIpIElmIHNldCwgcHJpbnQgdGhlIGFubm90YXRpb24gd2hlbiB0aGUgcGFnZSBpcyBwcmludGVkLiBJZiBjbGVhciwgbmV2ZXIgcHJpbnQgdGhlIGFubm90YXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2V0aGVyIGlzIGlzIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuLiBcbiAgICAgICAgKiBOT1RFIDIgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBhbm5vdGF0aW9ucyByZXByZXNlbnRpbmcgaW50ZXJhY3RpdmUgcHVzaGJ1dHRvbnMsIHdoaWNoIHdvdWxkIHNlcnZlIG5vIG1lYW5pbmdmdWwgcHVycG9zZSBvbiB0aGUgcHJpbnRlZCBwYWdlLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNzaG93V2hlblByaW50ZWRcbiAgICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2hvd1doZW5QcmludGVkJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZihfRiwgMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRiA9IHNldEJpdEZvclBkZihfRiwgMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GID0gY2xlYXJCaXRGb3JQZGYoX0YsIDMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9GZiA9IDA7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRmYnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0ZmO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX0ZmID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhdHRyaWJ1dGUgRmYgc3VwcGxpZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX1JlY3QgPSBbXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdSZWN0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9SZWN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX1JlY3Q7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9SZWN0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX1JlY3QgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSB4LXBvc2l0aW9uIG9mIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjeFxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3gnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbMF0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbMF0gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSB5LXBvc2l0aW9uIG9mIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjeVxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3knLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbMV0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbMV0gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3dpZHRoXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnd2lkdGgnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFsyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbMl0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbMl0gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNoZWlnaHRcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoZWlnaHQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbM10pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbM10gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfRlQgPSBcIlwiO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0ZUJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0ZUXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJy9CdG4nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcvVHgnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcvQ2gnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcvU2lnJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9GVCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgZm9yIGF0dHJpYnV0ZSBGVCBzdXBwbGllZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfVCA9IG51bGw7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdUJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9UIHx8IF9ULmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBhIENoaWxkIGZyb20gYSBSYWRpb8K0R3JvdXAsIHlvdSBkb24ndCBuZWVkIGEgRmllbGROYW1lXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1DaGlsZENsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF9UID0gXCJGaWVsZE9iamVjdFwiICsgKEFjcm9Gb3JtRmllbGQuRmllbGROdW0rKyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnKCcgKyBwZGZFc2NhcGUoX1QpICsgJyknO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1QgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBwYXJ0aWFsIGZpZWxkIG5hbWUgKHNlZSAxMi43LjMuMiwg4oCcRmllbGQgTmFtZXPigJ0pLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNmaWVsZE5hbWVcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmaWVsZE5hbWUnLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9UO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1QgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9mb250TmFtZSA9ICdoZWx2ZXRpY2EnO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgZm9udE5hbWUgb2YgdGhlIGZvbnQgdG8gYmUgdXNlZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZm9udE5hbWVcbiAgICAgICAgKiBAZGVmYXVsdCAnaGVsdmV0aWNhJ1xuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZm9udE5hbWUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mb250TmFtZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9mb250TmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2ZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgZm9udFN0eWxlIG9mIHRoZSBmb250IHRvIGJlIHVzZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2ZvbnRTdHlsZVxuICAgICAgICAqIEBkZWZhdWx0ICdub3JtYWwnXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmb250U3R5bGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mb250U3R5bGU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfZm9udFN0eWxlID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfZm9udFNpemUgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgZm9udFNpemUgb2YgdGhlIGZvbnQgdG8gYmUgdXNlZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZm9udFNpemVcbiAgICAgICAgKiBAZGVmYXVsdCAwIChmb3IgYXV0bylcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZvbnRTaXplJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX2ZvbnRTaXplKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9mb250U2l6ZSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9tYXhGb250U2l6ZSA9IDUwO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgbWF4aW11bSBmb250U2l6ZSBvZiB0aGUgZm9udCB0byBiZSB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNtYXhGb250U2l6ZVxuICAgICAgICAqIEBkZWZhdWx0IDAgKGZvciBhdXRvKVxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbWF4Rm9udFNpemUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFudGlTY2FsZShfbWF4Rm9udFNpemUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX21heEZvbnRTaXplID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2NvbG9yID0gJ2JsYWNrJztcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGNvbG9yIG9mIHRoZSB0ZXh0XG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2NvbG9yXG4gICAgICAgICogQGRlZmF1bHQgJ2JsYWNrJ1xuICAgICAgICAqIEB0eXBlIHtzdHJpbmd8cmdiYX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb2xvcicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX2NvbG9yID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfREEgPSAnL0YxIDAgVGYgMCBnJztcbiAgICAgICAgLy8gRGVmaW5lcyB0aGUgZGVmYXVsdCBhcHBlYXJhbmNlIChOZWVkZWQgZm9yIHZhcmlhYmxlIFRleHQpXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnREEnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX0RBXG4gICAgICAgICAgICAgICAgICAgIHx8IHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUNoaWxkQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgfHwgdGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtVGV4dEZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0b1BkZlN0cmluZyhfREEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIF9EQSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIHZhciBfRFYgPSBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0RWJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfRFYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9QZGZTdHJpbmcoX0RWKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9EVjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdWJzdHIoMCwgMSkgPT09ICcoJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgX0RWID0gcGRmVW5lc2NhcGUodmFsdWUuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCAtIDIpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9EViA9IHBkZlVuZXNjYXBlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9EViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsOyBpbmhlcml0YWJsZSkgVGhlIGRlZmF1bHQgdmFsdWUgdG8gd2hpY2ggdGhlIGZpZWxkIHJldmVydHMgd2hlbiBhIHJlc2V0LWZvcm0gYWN0aW9uIGlzIGV4ZWN1dGVkIChzZWUgMTIuNy41LjMsIOKAnFJlc2V0LUZvcm0gQWN0aW9u4oCdKS4gVGhlIGZvcm1hdCBvZiB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdmFsdWUuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNkZWZhdWx0VmFsdWVcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkZWZhdWx0VmFsdWUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwZGZVbmVzY2FwZShfRFYuc3Vic3RyKDEsIF9EVi5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9EVjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9EViA9ICcvJyArIHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9EViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9WID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdWJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbmljb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfVjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFfVikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b1BkZlN0cmluZyhfVik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfVjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1VuaWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX1YgPSB0b1VuaWNvZGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRydWVWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN1YnN0cigwLCAxKSA9PT0gJygnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX1YgPSBwZGZVbmVzY2FwZSh2YWx1ZS5zdWJzdHIoMSwgdmFsdWUubGVuZ3RoIC0gMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfViA9IHBkZlVuZXNjYXBlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9WID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbDsgaW5oZXJpdGFibGUpIFRoZSBmaWVsZOKAmXMgdmFsdWUsIHdob3NlIGZvcm1hdCB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlLiBTZWUgdGhlIGRlc2NyaXB0aW9ucyBvZiBpbmRpdmlkdWFsIGZpZWxkIHR5cGVzIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjdmFsdWVcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd2YWx1ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBkZlVuZXNjYXBlKF9WLnN1YnN0cigxLCBfVi5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9WO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX1YgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ2hlY2sgaWYgZmllbGQgaGFzIGFubm90YXRpb25zXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2hhc0Fubm90YXRpb25cbiAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoYXNBbm5vdGF0aW9uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5SZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdUeXBlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuaGFzQW5ub3RhdGlvbikgPyBcIi9Bbm5vdFwiIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdTdWJ0eXBlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuaGFzQW5ub3RhdGlvbikgPyBcIi9XaWRnZXRcIiA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfaGFzQXBwZWFyYW5jZVN0cmVhbSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgKiB0cnVlIGlmIGZpZWxkIGhhcyBhbiBhcHBlYXJhbmNlU3RyZWFtXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2hhc0FwcGVhcmFuY2VTdHJlYW1cbiAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoYXNBcHBlYXJhbmNlU3RyZWFtJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfaGFzQXBwZWFyYW5jZVN0cmVhbTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgX2hhc0FwcGVhcmFuY2VTdHJlYW0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIHBhZ2Ugb24gd2hpY2ggdGhlIEFjcm9Gb3JtRmllbGQgaXMgcGxhY2VkXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3BhZ2VcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICB2YXIgX3BhZ2U7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncGFnZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9wYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfcGFnZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX3BhZ2UgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgdXNlciBtYXkgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLiBBbnkgYXNzb2NpYXRlZCB3aWRnZXQgYW5ub3RhdGlvbnMgd2lsbCBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgdXNlcjsgdGhhdCBpcywgdGhleSB3aWxsIG5vdCByZXNwb25kIHRvIG1vdXNlIGNsaWNrcyBvciBjaGFuZ2UgdGhlaXIgYXBwZWFyYW5jZSBpbiByZXNwb25zZSB0byBtb3VzZSBtb3Rpb25zLiBUaGlzIGZsYWcgaXMgdXNlZnVsIGZvciBmaWVsZHMgd2hvc2UgdmFsdWVzIGFyZSBjb21wdXRlZCBvciBpbXBvcnRlZCBmcm9tIGEgZGF0YWJhc2UuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNyZWFkT25seVxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmVhZE9ubHknLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIGhhdmUgYSB2YWx1ZSBhdCB0aGUgdGltZSBpdCBpcyBleHBvcnRlZCBieSBhIHN1Ym1pdGZvcm0gYWN0aW9uIChzZWUgMTIuNy41LjIsIOKAnFN1Ym1pdC1Gb3JtIEFjdGlvbuKAnSkuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNyZXF1aXJlZFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmVxdWlyZWQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIG5vdCBiZSBleHBvcnRlZCBieSBhIHN1Ym1pdC1mb3JtIGFjdGlvbiAoc2VlIDEyLjcuNS4yLCDigJxTdWJtaXQtRm9ybSBBY3Rpb27igJ0pXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI25vRXhwb3J0XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdub0V4cG9ydCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICB2YXIgX1EgPSBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1EnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfUSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX1E7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoWzAsIDEsIDJdLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBfUSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBmb3IgYXR0cmlidXRlIFEgc3VwcGxpZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWw7IGluaGVyaXRhYmxlKSBBIGNvZGUgc3BlY2lmeWluZyB0aGUgZm9ybSBvZiBxdWFkZGluZyAoanVzdGlmaWNhdGlvbikgdGhhdCBzaGFsbCBiZSB1c2VkIGluIGRpc3BsYXlpbmcgdGhlIHRleHQ6XG4gICAgICAgICogJ2xlZnQnLCAnY2VudGVyJywgJ3JpZ2h0J1xuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCN0ZXh0QWxpZ25cbiAgICAgICAgKiBAZGVmYXVsdCAnbGVmdCdcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RleHRBbGlnbicsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfUSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAnbGVmdCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJ2NlbnRlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJ3JpZ2h0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfUSA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX1EgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfUSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH07XG5cbiAgICBpbmhlcml0KEFjcm9Gb3JtRmllbGQsIEFjcm9Gb3JtUERGT2JqZWN0KTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUNob2ljZUZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIC8vIEZpZWxkIFR5cGUgPSBDaG9pY2UgRmllbGRcbiAgICAgICAgdGhpcy5GVCA9IFwiL0NoXCI7XG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5WID0gJygpJztcblxuICAgICAgICB0aGlzLmZvbnROYW1lID0gJ3phcGZkaW5nYmF0cyc7XG4gICAgICAgIC8vIFRvcCBJbmRleFxuICAgICAgICB2YXIgX1RJID0gMDtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1RJJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX1RJO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1RJID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE1LIGZpeCBmb3IgQWNyb2JhdFxuICAgICAgICB2YXIgX01LID0gJzw8IC9CRyBbIDAuOTc1IDAuOTc1IDAuOTc1IF0gID4+JztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdNSycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NSztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9NSyA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBzY3JvbGxhYmxlIGxpc3QgYm94ZXMsIHRoZSB0b3AgaW5kZXggKHRoZSBpbmRleCBpbiB0aGUgT3B0IGFycmF5IG9mIHRoZSBmaXJzdCBvcHRpb24gdmlzaWJsZSBpbiB0aGUgbGlzdCkuIERlZmF1bHQgdmFsdWU6IDAuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCN0b3BJbmRleFxuICAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RvcEluZGV4Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfVEk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfVEkgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9PcHQgPSBbXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdPcHQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW5pY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlUb1BkZlVuaWNvZGVBcnJheShfT3B0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9QZGZBcnJheShfT3B0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9PcHQgPSBwZGZBcnJheVRvU3RyaW5nQXJyYXkodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBtZW1iZXJvZiBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgICAgICogQG5hbWUgZ2V0T3B0aW9uc1xuICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAqIEByZXR1cm5zIHthcnJheX0gYXJyYXkgb2YgT3B0aW9uc1xuICAgICAgICAqL1xuICAgICAgICB0aGlzLmdldE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX09wdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBtZW1iZXJvZiBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgICAgICogQG5hbWUgc2V0T3B0aW9uc1xuICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IHZhbHVlXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgX09wdCA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ydCkge1xuICAgICAgICAgICAgICAgIF9PcHQuc29ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG1lbWJlcm9mIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAgICAgKiBAbmFtZSBhZGRPcHRpb25cbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hZGRPcHRpb24gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIF9PcHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3J0KSB7XG4gICAgICAgICAgICAgICAgX09wdC5zb3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbWVtYmVyb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICAgICAqIEBuYW1lIHJlbW92ZU9wdGlvblxuICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsRW50cmllcyAoZGVmYXVsdDogZmFsc2UpXG4gICAgICAgICovXG4gICAgICAgIHRoaXMucmVtb3ZlT3B0aW9uID0gZnVuY3Rpb24gKHZhbHVlLCBhbGxFbnRyaWVzKSB7XG4gICAgICAgICAgICBhbGxFbnRyaWVzID0gYWxsRW50cmllcyB8fCBmYWxzZVxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSB8fCBcIlwiO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICB3aGlsZSAoX09wdC5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBfT3B0LnNwbGljZShfT3B0LmluZGV4T2YodmFsdWUpLCAxKTtcbiAgICAgICAgICAgICAgICBpZiAoYWxsRW50cmllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGEgY29tYm8gYm94OyBpZiBjbGVhciwgdGhlIGZpZWxkIGlzIGEgbGlzdCBib3guIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNjb21ib1xuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29tYm8nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE4KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxOCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGNvbWJvIGJveCBzaGFsbCBpbmNsdWRlIGFuIGVkaXRhYmxlIHRleHQgYm94IGFzIHdlbGwgYXMgYSBkcm9wLWRvd24gbGlzdDsgaWYgY2xlYXIsIGl0IHNoYWxsIGluY2x1ZGUgb25seSBhIGRyb3AtZG93biBsaXN0LiBUaGlzIGZsYWcgc2hhbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBDb21ibyBmbGFnIGlzIHNldC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI2VkaXRcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2VkaXQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE5KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgNDQ0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tYm8gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE5KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxOSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxk4oCZcyBvcHRpb24gaXRlbXMgc2hhbGwgYmUgc29ydGVkIGFscGhhYmV0aWNhbGx5LiBUaGlzIGZsYWcgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSB3cml0ZXJzLCBub3QgYnkgcmVhZGVycy4gQ29uZm9ybWluZyByZWFkZXJzIHNoYWxsIGRpc3BsYXkgdGhlIG9wdGlvbnMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXIgaW4gdGhlIE9wdCBhcnJheSAoc2VlIFRhYmxlIDIzMSkuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNzb3J0XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzb3J0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjApO1xuICAgICAgICAgICAgICAgICAgICBfT3B0LnNvcnQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgbW9yZSB0aGFuIG9uZSBvZiB0aGUgZmllbGTigJlzIG9wdGlvbiBpdGVtcyBtYXkgYmUgc2VsZWN0ZWQgc2ltdWx0YW5lb3VzbHk7IGlmIGNsZWFyLCBhdCBtb3N0IG9uZSBpdGVtIHNoYWxsIGJlIHNlbGVjdGVkIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNtdWx0aVNlbGVjdFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbXVsdGlTZWxlY3QnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIyKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMik7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgc3BlbGxjaGVja2VkLiBUaGlzIGZsYWcgc2hhbGwgbm90IGJlIHVzZWQgdW5sZXNzIHRoZSBDb21ibyBhbmQgRWRpdCBmbGFncyBhcmUgYm90aCBzZXQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNkb05vdFNwZWxsQ2hlY2tcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2RvTm90U3BlbGxDaGVjaycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjUpIElmIHNldCwgdGhlIG5ldyB2YWx1ZSBzaGFsbCBiZSBjb21taXR0ZWQgYXMgc29vbiBhcyBhIHNlbGVjdGlvbiBpcyBtYWRlIChjb21tb25seSB3aXRoIHRoZSBwb2ludGluZyBkZXZpY2UpLiBJbiB0aGlzIGNhc2UsIHN1cHBseWluZyBhIHZhbHVlIGZvciBhIGZpZWxkIGludm9sdmVzIHRocmVlIGFjdGlvbnM6IHNlbGVjdGluZyB0aGUgZmllbGQgZm9yIGZpbGwtaW4sIHNlbGVjdGluZyBhIGNob2ljZSBmb3IgdGhlIGZpbGwtaW4gdmFsdWUsIGFuZCBsZWF2aW5nIHRoYXQgZmllbGQsIHdoaWNoIGZpbmFsaXplcyBvciDigJxjb21taXRz4oCdIHRoZSBkYXRhIGNob2ljZSBhbmQgdHJpZ2dlcnMgYW55IGFjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRyeSBvciBjaGFuZ2luZyBvZiB0aGlzIGRhdGEuIElmIHRoaXMgZmxhZyBpcyBvbiwgdGhlbiBwcm9jZXNzaW5nIGRvZXMgbm90IHdhaXQgZm9yIGxlYXZpbmcgdGhlIGZpZWxkIGFjdGlvbiB0byBvY2N1ciwgYnV0IGltbWVkaWF0ZWx5IHByb2NlZWRzIHRvIHRoZSB0aGlyZCBzdGVwLlxuICAgICAgICAqIFRoaXMgb3B0aW9uIGVuYWJsZXMgYXBwbGljYXRpb25zIHRvIHBlcmZvcm0gYW4gYWN0aW9uIG9uY2UgYSBzZWxlY3Rpb24gaXMgbWFkZSwgd2l0aG91dCByZXF1aXJpbmcgdGhlIHVzZXIgdG8gZXhpdCB0aGUgZmllbGQuIElmIGNsZWFyLCB0aGUgbmV3IHZhbHVlIGlzIG5vdCBjb21taXR0ZWQgdW50aWwgdGhlIHVzZXIgZXhpdHMgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNjb21taXRPblNlbENoYW5nZVxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29tbWl0T25TZWxDaGFuZ2UnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI3KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyNyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDI3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgdGhpcy5oYXNBcHBlYXJhbmNlU3RyZWFtID0gZmFsc2U7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQ2hvaWNlRmllbGQsIEFjcm9Gb3JtRmllbGQpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1MaXN0Qm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1MaXN0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUNob2ljZUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuZm9udE5hbWUgPSAnaGVsdmV0aWNhJztcblxuICAgICAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgNDQ0XG4gICAgICAgIHRoaXMuY29tYm8gPSBmYWxzZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1MaXN0Qm94LCBBY3JvRm9ybUNob2ljZUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtQ29tYm9Cb3ggXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUxpc3RCb3hcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUNvbWJvQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUxpc3RCb3guY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb21ibyA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQ29tYm9Cb3gsIEFjcm9Gb3JtTGlzdEJveCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUVkaXRCb3ggXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNvbWJvQm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUxpc3RCb3hcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUVkaXRCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQ29tYm9Cb3guY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5lZGl0ID0gdHJ1ZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1FZGl0Qm94LCBBY3JvRm9ybUNvbWJvQm94KTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1CdXR0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtRmllbGQuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5GVCA9IFwiL0J0blwiO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChSYWRpbyBidXR0b25zIG9ubHkpIElmIHNldCwgZXhhY3RseSBvbmUgcmFkaW8gYnV0dG9uIHNoYWxsIGJlIHNlbGVjdGVkIGF0IGFsbCB0aW1lczsgc2VsZWN0aW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYnV0dG9uIGhhcyBubyBlZmZlY3QuIElmIGNsZWFyLCBjbGlja2luZyB0aGUgc2VsZWN0ZWQgYnV0dG9uIGRlc2VsZWN0cyBpdCwgbGVhdmluZyBubyBidXR0b24gc2VsZWN0ZWQuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jbm9Ub2dnbGVUb09mZlxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ25vVG9nZ2xlVG9PZmYnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE1KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxNSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE1KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGEgc2V0IG9mIHJhZGlvIGJ1dHRvbnM7IGlmIGNsZWFyLCB0aGUgZmllbGQgaXMgYSBjaGVja2JveC4gVGhpcyBmbGFnIG1heSBiZSBzZXQgb25seSBpZiB0aGUgUHVzaGJ1dHRvbiBmbGFnIGlzIGNsZWFyLiBcbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNyYWRpb1xuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JhZGlvJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIHB1c2hidXR0b24gdGhhdCBkb2VzIG5vdCByZXRhaW4gYSBwZXJtYW5lbnQgdmFsdWUuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jcHVzaEJ1dHRvblxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3B1c2hCdXR0b24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE3KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxNyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS41KSBJZiBzZXQsIGEgZ3JvdXAgb2YgcmFkaW8gYnV0dG9ucyB3aXRoaW4gYSByYWRpbyBidXR0b24gZmllbGQgdGhhdCB1c2UgdGhlIHNhbWUgdmFsdWUgZm9yIHRoZSBvbiBzdGF0ZSB3aWxsIHR1cm4gb24gYW5kIG9mZiBpbiB1bmlzb247IHRoYXQgaXMgaWYgb25lIGlzIGNoZWNrZWQsIHRoZXkgYXJlIGFsbCBjaGVja2VkLiBJZiBjbGVhciwgdGhlIGJ1dHRvbnMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAodGhlIHNhbWUgYmVoYXZpb3IgYXMgSFRNTCByYWRpbyBidXR0b25zKS5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI3JhZGlvSXNVbmlzb25cbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyYWRpb0lzVW5pc29uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX01LID0ge307XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTUsnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoX01LKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPDwnKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gX01LKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLycgKyBrZXkgKyAnICgnICsgX01LW2tleV0gKyAnKScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc+PicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICBfTUsgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogRnJvbSB0aGUgUERGIHJlZmVyZW5jZTpcbiAgICAgICAgKiAoT3B0aW9uYWwsIGJ1dHRvbiBmaWVsZHMgb25seSkgVGhlIHdpZGdldCBhbm5vdGF0aW9uJ3Mgbm9ybWFsIGNhcHRpb24gd2hpY2ggc2hhbGwgYmUgZGlzcGxheWVkIHdoZW4gaXQgaXMgbm90IGludGVyYWN0aW5nIHdpdGggdGhlIHVzZXIuIFxuICAgICAgICAqIFVubGlrZSB0aGUgcmVtYWluaW5nIGVudHJpZXMgbGlzdGVkIGluIHRoaXMgVGFibGUgd2hpY2ggYXBwbHkgb25seSB0byB3aWRnZXQgYW5ub3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHB1c2hidXR0b24gZmllbGRzIChzZWUgUHVzaGJ1dHRvbnMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKSwgdGhlIENBIGVudHJ5IG1heSBiZSB1c2VkIHdpdGggYW55IHR5cGUgb2YgYnV0dG9uIGZpZWxkLCBpbmNsdWRpbmcgY2hlY2sgYm94ZXMgKHNlZSBDaGVjayBCb3hlcyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpIGFuZCByYWRpbyBidXR0b25zIChSYWRpbyBCdXR0b25zIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIikuXG4gICAgICAgICpcbiAgICAgICAgKiAtICc4JyA9IENyb3NzLCBcbiAgICAgICAgKiAtICdsJyA9ICBDaXJjbGUsXG4gICAgICAgICogLSAnJyA9IG5vdGhpbmdcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNjYXB0aW9uXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjYXB0aW9uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfTUsuQ0EgfHwgJyc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9NSy5DQSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9BUztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdBUycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfQVM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQVMgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUmVxdWlyZWQgaWYgdGhlIGFwcGVhcmFuY2UgZGljdGlvbmFyeSBBUCBjb250YWlucyBvbmUgb3IgbW9yZSBzdWJkaWN0aW9uYXJpZXM7IFBERiAxLjIpIFRoZSBhbm5vdGF0aW9uJ3MgYXBwZWFyYW5jZSBzdGF0ZSwgd2hpY2ggc2VsZWN0cyB0aGUgYXBwbGljYWJsZSBhcHBlYXJhbmNlIHN0cmVhbSBmcm9tIGFuIGFwcGVhcmFuY2Ugc3ViZGljdGlvbmFyeSAoc2VlIFNlY3Rpb24gMTIuNS41LCBcIkFwcGVhcmFuY2UgU3RyZWFtc1wiKVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jYXBwZWFyYW5jZVN0YXRlXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdhcHBlYXJhbmNlU3RhdGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9BUy5zdWJzdHIoMSwgX0FTLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gJy8nICsgdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQnV0dG9uLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtUHVzaEJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVB1c2hCdXR0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQnV0dG9uLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMucHVzaEJ1dHRvbiA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtUHVzaEJ1dHRvbiwgQWNyb0Zvcm1CdXR0b24pO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1SYWRpb0J1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVJhZGlvQnV0dG9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUJ1dHRvbi5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLnJhZGlvID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wdXNoQnV0dG9uID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIF9LaWRzID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnS2lkcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9LaWRzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBfS2lkcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9LaWRzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1SYWRpb0J1dHRvbiwgQWNyb0Zvcm1CdXR0b24pO1xuXG4gICAgLyoqXG4gICAgKiBUaGUgQ2hpbGQgY2xhc3Mgb2YgYSBSYWRpb0J1dHRvbiAodGhlIHJhZGlvR3JvdXApIC0+IFRoZSBzaW5nbGUgQnV0dG9uc1xuICAgICogXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1DaGlsZENsYXNzXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKiBAaWdub3JlXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1DaGlsZENsYXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG5cbiAgICAgICAgdmFyIF9wYXJlbnQ7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnUGFyZW50Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9wYXJlbnQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfcGFyZW50ID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfb3B0aW9uTmFtZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdvcHRpb25OYW1lJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX29wdGlvbk5hbWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfb3B0aW9uTmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX01LID0ge307XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTUsnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzw8Jyk7XG4gICAgICAgICAgICAgICAgdmFyIGtleTtcbiAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiBfTUspIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJy8nICsga2V5ICsgJyAoJyArIF9NS1trZXldICsgJyknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJz4+Jyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX01LID0gdmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEZyb20gdGhlIFBERiByZWZlcmVuY2U6XG4gICAgICAgICogKE9wdGlvbmFsLCBidXR0b24gZmllbGRzIG9ubHkpIFRoZSB3aWRnZXQgYW5ub3RhdGlvbidzIG5vcm1hbCBjYXB0aW9uIHdoaWNoIHNoYWxsIGJlIGRpc3BsYXllZCB3aGVuIGl0IGlzIG5vdCBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyLiBcbiAgICAgICAgKiBVbmxpa2UgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGxpc3RlZCBpbiB0aGlzIFRhYmxlIHdoaWNoIGFwcGx5IG9ubHkgdG8gd2lkZ2V0IGFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCBwdXNoYnV0dG9uIGZpZWxkcyAoc2VlIFB1c2hidXR0b25zIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIiksIHRoZSBDQSBlbnRyeSBtYXkgYmUgdXNlZCB3aXRoIGFueSB0eXBlIG9mIGJ1dHRvbiBmaWVsZCwgaW5jbHVkaW5nIGNoZWNrIGJveGVzIChzZWUgQ2hlY2sgQm94ZXMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKSBhbmQgcmFkaW8gYnV0dG9ucyAoUmFkaW8gQnV0dG9ucyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpLlxuICAgICAgICAqXG4gICAgICAgICogLSAnOCcgPSBDcm9zcywgXG4gICAgICAgICogLSAnbCcgPSAgQ2lyY2xlLFxuICAgICAgICAqIC0gJycgPSBub3RoaW5nXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jY2FwdGlvblxuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY2FwdGlvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01LLkNBIHx8ICcnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBfTUsuQ0EgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfQVM7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnQVMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0FTO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChSZXF1aXJlZCBpZiB0aGUgYXBwZWFyYW5jZSBkaWN0aW9uYXJ5IEFQIGNvbnRhaW5zIG9uZSBvciBtb3JlIHN1YmRpY3Rpb25hcmllczsgUERGIDEuMikgVGhlIGFubm90YXRpb24ncyBhcHBlYXJhbmNlIHN0YXRlLCB3aGljaCBzZWxlY3RzIHRoZSBhcHBsaWNhYmxlIGFwcGVhcmFuY2Ugc3RyZWFtIGZyb20gYW4gYXBwZWFyYW5jZSBzdWJkaWN0aW9uYXJ5IChzZWUgU2VjdGlvbiAxMi41LjUsIFwiQXBwZWFyYW5jZSBTdHJlYW1zXCIpXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNhcHBlYXJhbmNlU3RhdGVcbiAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2FwcGVhcmFuY2VTdGF0ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0FTLnN1YnN0cigxLCBfQVMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQVMgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2FwdGlvbiA9ICdsJztcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlU3RhdGUgPSAnT2ZmJztcbiAgICAgICAgLy8gdG9kbzogc2V0IEFwcGVhcmFuY2VUeXBlIGFzIHZhcmlhYmxlIHRoYXQgY2FuIGJlIHNldCBmcm9tIHRoZVxuICAgICAgICAvLyBvdXRzaWRlLi4uXG4gICAgICAgIHRoaXMuX0FwcGVhcmFuY2VUeXBlID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZTtcbiAgICAgICAgLy8gVGhlIERlZmF1bHQgYXBwZWFyYW5jZVR5cGUgaXMgdGhlIENpcmNsZVxuICAgICAgICB0aGlzLmFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0gdGhpcy5fQXBwZWFyYW5jZVR5cGUuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSh0aGlzLm9wdGlvbk5hbWUpO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNoaWxkQ2xhc3MsIEFjcm9Gb3JtRmllbGQpO1xuXG4gICAgQWNyb0Zvcm1SYWRpb0J1dHRvbi5wcm90b3R5cGUuc2V0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlKSB7XG4gICAgICAgIGlmICghKCdjcmVhdGVBcHBlYXJhbmNlU3RyZWFtJyBpbiBhcHBlYXJhbmNlICYmICdnZXRDQScgaW4gYXBwZWFyYW5jZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGFzc2lnbiBBcHBlYXJhbmNlIHRvIFJhZGlvQnV0dG9uLiBBcHBlYXJhbmNlIHdhcyBJbnZhbGlkIVwiKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBvYmpJZCBpbiB0aGlzLktpZHMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLktpZHMuaGFzT3duUHJvcGVydHkob2JqSWQpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5LaWRzW29iaklkXTtcbiAgICAgICAgICAgICAgICBjaGlsZC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IGFwcGVhcmFuY2UuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbShjaGlsZC5vcHRpb25OYW1lKTtcbiAgICAgICAgICAgICAgICBjaGlsZC5jYXB0aW9uID0gYXBwZWFyYW5jZS5nZXRDQSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIEFjcm9Gb3JtUmFkaW9CdXR0b24ucHJvdG90eXBlLmNyZWF0ZU9wdGlvbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIC8vIENyZWF0ZSBuZXcgQ2hpbGQgZm9yIFJhZGlvR3JvdXBcbiAgICAgICAgdmFyIGNoaWxkID0gbmV3IEFjcm9Gb3JtQ2hpbGRDbGFzcygpO1xuICAgICAgICBjaGlsZC5QYXJlbnQgPSB0aGlzO1xuICAgICAgICBjaGlsZC5vcHRpb25OYW1lID0gbmFtZTtcbiAgICAgICAgLy8gQWRkIHRvIFBhcmVudFxuICAgICAgICB0aGlzLktpZHMucHVzaChjaGlsZCk7XG5cbiAgICAgICAgYWRkRmllbGQuY2FsbCh0aGlzLCBjaGlsZCk7XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUNoZWNrQm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQ2hlY2tCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQnV0dG9uLmNhbGwodGhpcyk7XG5cbiAgICAgICAgdGhpcy5mb250TmFtZSA9ICd6YXBmZGluZ2JhdHMnO1xuICAgICAgICB0aGlzLmNhcHRpb24gPSAnMyc7XG4gICAgICAgIHRoaXMuYXBwZWFyYW5jZVN0YXRlID0gJ09uJztcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwiT25cIjtcbiAgICAgICAgdGhpcy50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5DaGVja0JveC5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKCk7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQ2hlY2tCb3gsIEFjcm9Gb3JtQnV0dG9uKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtVGV4dEZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1UZXh0RmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtRmllbGQuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5GVCA9ICcvVHgnO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIG1heSBjb250YWluIG11bHRpcGxlIGxpbmVzIG9mIHRleHQ7IGlmIGNsZWFyLCB0aGUgZmllbGTigJlzIHRleHQgc2hhbGwgYmUgcmVzdHJpY3RlZCB0byBhIHNpbmdsZSBsaW5lLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI211bHRpbGluZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ211bHRpbGluZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgcmVwcmVzZW50cyB0aGUgcGF0aG5hbWUgb2YgYSBmaWxlIHdob3NlIGNvbnRlbnRzIHNoYWxsIGJlIHN1Ym1pdHRlZCBhcyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLiBcbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNmaWxlU2VsZWN0XG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmlsZVNlbGVjdCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjEpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgc3BlbGwtY2hlY2tlZC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNkb05vdFNwZWxsQ2hlY2tcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkb05vdFNwZWxsQ2hlY2snLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBub3Qgc2Nyb2xsIChob3Jpem9udGFsbHkgZm9yIHNpbmdsZS1saW5lIGZpZWxkcywgdmVydGljYWxseSBmb3IgbXVsdGlwbGUtbGluZSBmaWVsZHMpIHRvIGFjY29tbW9kYXRlIG1vcmUgdGV4dCB0aGFuIGZpdHMgd2l0aGluIGl0cyBhbm5vdGF0aW9uIHJlY3RhbmdsZS4gT25jZSB0aGUgZmllbGQgaXMgZnVsbCwgbm8gZnVydGhlciB0ZXh0IHNoYWxsIGJlIGFjY2VwdGVkIGZvciBpbnRlcmFjdGl2ZSBmb3JtIGZpbGxpbmc7IGZvciBub25pbnRlcmFjdGl2ZSBmb3JtIGZpbGxpbmcsIHRoZSBmaWxsZXIgc2hvdWxkIHRha2UgY2FyZSBub3QgdG8gYWRkIG1vcmUgY2hhcmFjdGVyIHRoYW4gd2lsbCB2aXNpYmx5IGZpdCBpbiB0aGUgZGVmaW5lZCBhcmVhLiBcbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNkb05vdFNjcm9sbFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2RvTm90U2Nyb2xsJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNSkgTWF5IGJlIHNldCBvbmx5IGlmIHRoZSBNYXhMZW4gZW50cnkgaXMgcHJlc2VudCBpbiB0aGUgdGV4dCBmaWVsZCBkaWN0aW9uYXJ5IChzZWUgVGFibGUgMjI5KSBhbmQgaWYgdGhlIE11bHRpbGluZSwgUGFzc3dvcmQsIGFuZCBGaWxlU2VsZWN0IGZsYWdzIGFyZSBjbGVhci4gSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgYmUgYXV0b21hdGljYWxseSBkaXZpZGVkIGludG8gYXMgbWFueSBlcXVhbGx5IHNwYWNlZCBwb3NpdGlvbnMsIG9yIGNvbWJzLCBhcyB0aGUgdmFsdWUgb2YgTWF4TGVuLCBhbmQgdGhlIHRleHQgaXMgbGFpZCBvdXQgaW50byB0aG9zZSBjb21icy5cbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNjb21iXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29tYicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjUpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI1KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjUpIElmIHNldCwgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgc2hhbGwgYmUgYSByaWNoIHRleHQgc3RyaW5nIChzZWUgMTIuNy4zLjQsIOKAnFJpY2ggVGV4dCBTdHJpbmdz4oCdKS4gSWYgdGhlIGZpZWxkIGhhcyBhIHZhbHVlLCB0aGUgUlYgZW50cnkgb2YgdGhlIGZpZWxkIGRpY3Rpb25hcnkgKFRhYmxlIDIyMikgc2hhbGwgc3BlY2lmeSB0aGUgcmljaCB0ZXh0IHN0cmluZy5cbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNyaWNoVGV4dFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JpY2hUZXh0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX01heExlbiA9IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTWF4TGVuJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01heExlbjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9NYXhMZW4gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsOyBpbmhlcml0YWJsZSkgVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBmaWVsZOKAmXMgdGV4dCwgaW4gY2hhcmFjdGVycy4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNtYXhMZW5ndGhcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ21heExlbmd0aCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01heExlbjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBfTWF4TGVuID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFzQXBwZWFyYW5jZVN0cmVhbScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuViB8fCB0aGlzLkRWKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1UZXh0RmllbGQsIEFjcm9Gb3JtRmllbGQpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1QYXNzd29yZEZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybVRleHRGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1UZXh0RmllbGQuY2FsbCh0aGlzKTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBpbnRlbmRlZCBmb3IgZW50ZXJpbmcgYSBzZWN1cmUgcGFzc3dvcmQgdGhhdCBzaG91bGQgbm90IGJlIGVjaG9lZCB2aXNpYmx5IHRvIHRoZSBzY3JlZW4uIENoYXJhY3RlcnMgdHlwZWQgZnJvbSB0aGUga2V5Ym9hcmQgc2hhbGwgaW5zdGVhZCBiZSBlY2hvZWQgaW4gc29tZSB1bnJlYWRhYmxlIGZvcm0sIHN1Y2ggYXMgYXN0ZXJpc2tzIG9yIGJ1bGxldCBjaGFyYWN0ZXJzLlxuICAgICAgICAqIE5PVEUgVG8gcHJvdGVjdCBwYXNzd29yZCBjb25maWRlbnRpYWxpdHksIHJlYWRlcnMgc2hvdWxkIG5ldmVyIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBmaWVsZCBpbiB0aGUgUERGIGZpbGUgaWYgdGhpcyBmbGFnIGlzIHNldC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNwYXNzd29yZFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3Bhc3N3b3JkJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCwgQWNyb0Zvcm1UZXh0RmllbGQpO1xuXG5cbiAgICAvLyBDb250YWlucyBNZXRob2RzIGZvciBjcmVhdGluZyBzdGFuZGFyZCBhcHBlYXJhbmNlc1xuICAgIHZhciBBY3JvRm9ybUFwcGVhcmFuY2UgPSB7XG4gICAgICAgIENoZWNrQm94OiB7XG4gICAgICAgICAgICBjcmVhdGVBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIE46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9uOiBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guWWVzTm9ybWFsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIEQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9uOiBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guWWVzUHVzaERvd24sXG4gICAgICAgICAgICAgICAgICAgICAgICBPZmY6IEFjcm9Gb3JtQXBwZWFyYW5jZS5DaGVja0JveC5PZmZQdXNoRG93blxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBhcHBlYXJhbmNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIE9uIEFwcGVhcmFuY2UgZm9yIGEgQ2hlY2tCb3hcbiAgICAgICAgICAgICAgKiBcbiAgICAgICAgICAgICAgKiBAcmV0dXJucyB7QWNyb0Zvcm1YT2JqZWN0fVxuICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgWWVzUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIGVuY29kZWRDb2xvciA9IHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpO1xuICAgICAgICAgICAgICAgIHZhciBjYWxjUmVzID0gY2FsY3VsYXRlWChmb3JtT2JqZWN0LCBmb3JtT2JqZWN0LmNhcHRpb24pO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSkgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiQk1DXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCAxIHJnXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiL1wiICsgZm9udEtleSArIFwiIFwiICsgZjIoY2FsY1Jlcy5mb250U2l6ZSkgKyBcIiBUZiBcIiArIGVuY29kZWRDb2xvcik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJCVFwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChjYWxjUmVzLnRleHQpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiRVRcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiRU1DXCIpO1xuICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBZZXNOb3JtYWw6IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIGZvbnRLZXkgPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KGZvcm1PYmplY3QuZm9udE5hbWUsIGZvcm1PYmplY3QuZm9udFN0eWxlKS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgZW5jb2RlZENvbG9yID0gc2NvcGUuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcik7XG4gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgY2FsY1JlcyA9IGNhbGN1bGF0ZVgoZm9ybU9iamVjdCwgZm9ybU9iamVjdC5jYXB0aW9uKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKHdpZHRoKSArIFwiIFwiICsgZjIoaGVpZ2h0KSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgMSByZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKHdpZHRoIC0gMSkgKyBcIiBcIiArIGYyKGhlaWdodCAtIDEpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJXXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiblwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkJUXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiL1wiICsgZm9udEtleSArIFwiIFwiICsgZjIoY2FsY1Jlcy5mb250U2l6ZSkgKyBcIiBUZiBcIiArIGVuY29kZWRDb2xvcik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goY2FsY1Jlcy50ZXh0KTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkVUXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICogUmV0dXJucyB0aGUgc3RhbmRhcmQgT2ZmIEFwcGVhcmFuY2UgZm9yIGEgQ2hlY2tCb3hcbiAgICAgICAgICAgICAgKiBcbiAgICAgICAgICAgICAgKiBAcmV0dXJucyB7QWNyb0Zvcm1YT2JqZWN0fVxuICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgT2ZmUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSkgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgUmFkaW9CdXR0b246IHtcbiAgICAgICAgICAgIENpcmNsZToge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUFwcGVhcmFuY2VTdHJlYW06IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2ZmJzogQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5PZmZQdXNoRG93blxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE46IHt9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50Lk5bbmFtZV0gPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLlllc05vcm1hbDtcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuRFtuYW1lXSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuWWVzUHVzaERvd247XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHBlYXJhbmNlU3RyZWFtQ29udGVudDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldENBOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnbCc7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIFllc05vcm1hbDogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSB0aGUgUmFkaXVzIG9mIHRoZSBDaXJjbGUgcmVsYXRpdmUgdG8gbWluKGhlaWdodCwgd2lkdGgpIG9mIGZvcm1PYmplY3RcbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1cyA9IChBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgPD0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgPyBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyA0IDogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCb3JkZXJwYWRkaW5nLi4uXG4gICAgICAgICAgICAgICAgICAgIERvdFJhZGl1cyA9IE51bWJlcigoRG90UmFkaXVzICogMC45KS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0M7XG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXNCZXppZXIgPSBOdW1iZXIoKERvdFJhZGl1cyAqIGMpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgICogVGhlIEZvbGxvd2luZyBpcyBhIENpcmNsZSBjcmVhdGVkIHdpdGggQmV6aWVyLUN1cnZlcy5cbiAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAwIDAgMSBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDIpICsgXCIgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gMikgKyBcIiBjbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzICsgXCIgMCBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChEb3RSYWRpdXMgKyBcIiBcIiArIERvdFJhZGl1c0JlemllciArIFwiIFwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAwIFwiICsgRG90UmFkaXVzICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIFwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIERvdFJhZGl1cyArIFwiIC1cIiArIERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIDAgLVwiICsgRG90UmFkaXVzICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzQmV6aWVyICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgWWVzUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXMgPSAoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIDw9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpID9cbiAgICAgICAgICAgICAgICAgICAgICAgIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDQgOiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gNDtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEJvcmRlcnBhZGRpbmcuLi5cbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1cyA9IE51bWJlcigoRG90UmFkaXVzICogMC45KS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSByZXN1bHRzIGZvciBsYXRlciB1c2U7IG5vIG5lZWQgdG8gd2FzdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc29yIHRpY2tzIG9uIGRvaW5nIG1hdGhcbiAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDIpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIga2MgPSBOdW1iZXIoKGsgKiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0MpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5CZXppZXJfQykudG9GaXhlZCg1KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAwIDAgMSBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDIpICsgXCIgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gMikgKyBcIiBjbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goayArIFwiIDAgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goayArIFwiIFwiICsga2MgKyBcIiBcIiArIGtjICsgXCIgXCIgKyBrICsgXCIgMCBcIiArIGsgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGtjICsgXCIgXCIgKyBrICsgXCIgLVwiICsgayArIFwiIFwiICsga2MgKyBcIiAtXCIgKyBrICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGsgKyBcIiAtXCIgKyBrYyArIFwiIC1cIiArIGtjICsgXCIgLVwiICsgayArIFwiIDAgLVwiICsgayArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGtjICsgXCIgLVwiICsgayArIFwiIFwiICsgayArIFwiIC1cIiArIGtjICsgXCIgXCIgKyBrICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDAgMCAxIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gMikgKyBcIiBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyAyKSArIFwiIGNtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChEb3RSYWRpdXMgKyBcIiAwIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIGRjICsgXCIgXCIgKyBkYyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgMCBcIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgZGMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIFwiICsgZGMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgZGMgKyBcIiAtXCIgKyBkYyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIDAgLVwiICsgRG90UmFkaXVzICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZGMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIC1cIiArIGRjICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9mZlB1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzID0gKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSA8PSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyA0IDogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCb3JkZXJwYWRkaW5nLi4uXG4gICAgICAgICAgICAgICAgICAgIERvdFJhZGl1cyA9IE51bWJlcigoRG90UmFkaXVzICogMC45KS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSByZXN1bHRzIGZvciBsYXRlciB1c2U7IG5vIG5lZWQgdG8gd2FzdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc29yIHRpY2tzIG9uIGRvaW5nIG1hdGhcbiAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDIpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIga2MgPSBOdW1iZXIoKGsgKiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0MpLnRvRml4ZWQoNSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMCAwIDEgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyAyKSArIFwiIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDIpICsgXCIgY21cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiAwIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiBcIiArIGtjICsgXCIgXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgXCIgKyBrICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrYyArIFwiIFwiICsgayArIFwiIC1cIiArIGsgKyBcIiBcIiArIGtjICsgXCIgLVwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrICsgXCIgLVwiICsga2MgKyBcIiAtXCIgKyBrYyArIFwiIC1cIiArIGsgKyBcIiAwIC1cIiArIGsgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrYyArIFwiIC1cIiArIGsgKyBcIiBcIiArIGsgKyBcIiAtXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBDcm9zczoge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgKiBDcmVhdGVzIHRoZSBBY3R1YWwgQXBwZWFyYW5jZURpY3Rpb25hcnktUmVmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgKiBcbiAgICAgICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgICAgICAgICAgICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgICAgICAgICAgICAgICogQGlnbm9yZVxuICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjcmVhdGVBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09mZic6IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5Dcm9zcy5PZmZQdXNoRG93blxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE46IHt9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50Lk5bbmFtZV0gPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ3Jvc3MuWWVzTm9ybWFsO1xuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5EW25hbWVdID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNyb3NzLlllc1B1c2hEb3duO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRDQTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzgnXG4gICAgICAgICAgICAgICAgfSxcblxuXG4gICAgICAgICAgICAgICAgWWVzTm9ybWFsOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3Jvc3MgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuY2FsY3VsYXRlQ3Jvc3MoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDEgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLSAyKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAtIDIpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiV1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJuXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54MS54KSArIFwiIFwiICsgZjIoY3Jvc3MueDEueSkgKyBcIiBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54Mi54KSArIFwiIFwiICsgZjIoY3Jvc3MueDIueSkgKyBcIiBsXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54NC54KSArIFwiIFwiICsgZjIoY3Jvc3MueDQueSkgKyBcIiBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54My54KSArIFwiIFwiICsgZjIoY3Jvc3MueDMueSkgKyBcIiBsXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBZZXNQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjcm9zcyA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5jYWxjdWxhdGVDcm9zcyhmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAxIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC0gMikgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLSAyKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIldcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiblwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDEueCkgKyBcIiBcIiArIGYyKGNyb3NzLngxLnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDIueCkgKyBcIiBcIiArIGYyKGNyb3NzLngyLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDQueCkgKyBcIiBcIiArIGYyKGNyb3NzLng0LnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDMueCkgKyBcIiBcIiArIGYyKGNyb3NzLngzLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJzXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT2ZmUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBBcHBlYXJhbmNlXG4gICAgICAgICAgKiBcbiAgICAgICAgICAqIEByZXR1cm5zIHtBY3JvRm9ybVhPYmplY3R9XG4gICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlRGVmYXVsdEFwcGVhcmFuY2VTdHJlYW06IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyBTZXQgSGVsdmV0aWNhIHRvIFN0YW5kYXJkIEZvbnQgKHNpemU6IGF1dG8pXG4gICAgICAgICAgICAvLyBDb2xvcjogQmxhY2tcbiAgICAgICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG4gICAgICAgICAgICB2YXIgZW5jb2RlZENvbG9yID0gc2NvcGUuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcik7XG4gICAgICAgICAgICB2YXIgZm9udFNpemUgPSBmb3JtT2JqZWN0LmZvbnRTaXplO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICcvJyArIGZvbnRLZXkgKyAnICcgKyBmb250U2l6ZSArICcgVGYgJyArIGVuY29kZWRDb2xvcjtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsID0ge1xuICAgICAgICBCZXppZXJfQzogMC41NTE5MTUwMjQ0OTQsXG5cbiAgICAgICAgY2FsY3VsYXRlQ3Jvc3M6IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG5cbiAgICAgICAgICAgIHZhciB3aWR0aCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgdmFyIGEgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICAgICAgdmFyIGNyb3NzID0ge1xuICAgICAgICAgICAgICAgIHgxOiB7IC8vIHVwcGVyTGVmdFxuICAgICAgICAgICAgICAgICAgICB4OiAod2lkdGggLSBhKSAvIDIsXG4gICAgICAgICAgICAgICAgICAgIHk6ICgoaGVpZ2h0IC0gYSkgLyAyKSArIGEsLy8gaGVpZ2h0IC0gYm9yZGVyUGFkZGluZ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeDI6IHsgLy8gbG93ZXJSaWdodFxuICAgICAgICAgICAgICAgICAgICB4OiAoKHdpZHRoIC0gYSkgLyAyKSArIGEsXG4gICAgICAgICAgICAgICAgICAgIHk6ICgoaGVpZ2h0IC0gYSkgLyAyKS8vIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHgzOiB7IC8vIGxvd2VyTGVmdFxuICAgICAgICAgICAgICAgICAgICB4OiAod2lkdGggLSBhKSAvIDIsXG4gICAgICAgICAgICAgICAgICAgIHk6ICgoaGVpZ2h0IC0gYSkgLyAyKS8vIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHg0OiB7IC8vIHVwcGVyUmlnaHRcbiAgICAgICAgICAgICAgICAgICAgeDogKCh3aWR0aCAtIGEpIC8gMikgKyBhLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikgKyBhLC8vIGhlaWdodCAtIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gY3Jvc3M7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGggPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICAgICAgaWYgKHR5cGVvZiBmb3JtT2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzY2FsZShmb3JtT2JqZWN0LlJlY3RbMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgICAgIGlmICh0eXBlb2YgZm9ybU9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmVzdWx0ID0gc2NhbGUoZm9ybU9iamVjdC5SZWN0WzNdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBQdWJsaWM6XG5cbiAgICAvKipcbiAgICAqIEFkZCBhbiBBY3JvRm9ybS1GaWVsZCB0byB0aGUganNQREYtaW5zdGFuY2VcbiAgICAqXG4gICAgKiBAbmFtZSBhZGRGaWVsZFxuICAgICogQGZ1bmN0aW9uIFxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRPYmplY3RcbiAgICAqIEByZXR1cm5zIHtqc1BERn1cbiAgICAqL1xuICAgIHZhciBhZGRGaWVsZCA9IGpzUERGQVBJLmFkZEZpZWxkID0gZnVuY3Rpb24gKGZpZWxkT2JqZWN0KSB7XG4gICAgICAgIGluaXRpYWxpemVBY3JvRm9ybS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIGlmIChmaWVsZE9iamVjdCBpbnN0YW5jZW9mIEFjcm9Gb3JtRmllbGQpIHtcbiAgICAgICAgICAgIHB1dEZvcm0uY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmFkZEZpZWxkLicpO1xuICAgICAgICB9XG4gICAgICAgIGZpZWxkT2JqZWN0LnBhZ2UgPSBzY29wZS5pbnRlcm5hbC5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAbmFtZSBhZGRCdXR0b25cbiAgICAqIEBmdW5jdGlvblxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge0Fjcm9Gb3JtQnV0dG9ufSBvcHRpb25zXG4gICAgKiBAcmV0dXJucyB7anNQREZ9XG4gICAgKiBAZGVwcmVjYXRlZFxuICAgICovXG4gICAganNQREZBUEkuYWRkQnV0dG9uID0gZnVuY3Rpb24gKGJ1dHRvbikge1xuICAgICAgICBpZiAoYnV0dG9uIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmFkZEJ1dHRvbi4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkRmllbGQuY2FsbCh0aGlzLCBidXR0b24pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBuYW1lIGFkZFRleHRGaWVsZFxuICAgICogQGZ1bmN0aW9uXG4gICAgKiBAaW5zdGFuY2VcbiAgICAqIEBwYXJhbSB7QWNyb0Zvcm1UZXh0RmllbGR9IHRleHRGaWVsZFxuICAgICogQHJldHVybnMge2pzUERGfVxuICAgICogQGRlcHJlY2F0ZWRcbiAgICAqL1xuICAgIGpzUERGQVBJLmFkZFRleHRGaWVsZCA9IGZ1bmN0aW9uICh0ZXh0RmllbGQpIHtcbiAgICAgICAgaWYgKHRleHRGaWVsZCBpbnN0YW5jZW9mIEFjcm9Gb3JtVGV4dEZpZWxkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRUZXh0RmllbGQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkLmNhbGwodGhpcywgdGV4dEZpZWxkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAbmFtZSBhZGRDaG9pY2VGaWVsZFxuICAgICogQGZ1bmN0aW9uXG4gICAgKiBAaW5zdGFuY2VcbiAgICAqIEBwYXJhbSB7QWNyb0Zvcm1DaG9pY2VGaWVsZH0gXG4gICAgKiBAcmV0dXJucyB7anNQREZ9XG4gICAgKiBAZGVwcmVjYXRlZFxuICAgICovXG4gICAganNQREZBUEkuYWRkQ2hvaWNlRmllbGQgPSBmdW5jdGlvbiAoY2hvaWNlRmllbGQpIHtcbiAgICAgICAgaWYgKGNob2ljZUZpZWxkIGluc3RhbmNlb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuYWRkQ2hvaWNlRmllbGQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkLmNhbGwodGhpcywgY2hvaWNlRmllbGQpO1xuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIGdsb2JhbE9iaiA9PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiQ2hvaWNlRmllbGRcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiTGlzdEJveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJDb21ib0JveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJFZGl0Qm94XCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkJ1dHRvblwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJQdXNoQnV0dG9uXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIlJhZGlvQnV0dG9uXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkNoZWNrQm94XCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIlRleHRGaWVsZFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJQYXNzd29yZEZpZWxkXCJdKSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICkge1xuICAgICAgICBnbG9iYWxPYmpbXCJDaG9pY2VGaWVsZFwiXSA9IEFjcm9Gb3JtQ2hvaWNlRmllbGQ7XG4gICAgICAgIGdsb2JhbE9ialtcIkxpc3RCb3hcIl0gPSBBY3JvRm9ybUxpc3RCb3g7XG4gICAgICAgIGdsb2JhbE9ialtcIkNvbWJvQm94XCJdID0gQWNyb0Zvcm1Db21ib0JveDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiRWRpdEJveFwiXSA9IEFjcm9Gb3JtRWRpdEJveDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiQnV0dG9uXCJdID0gQWNyb0Zvcm1CdXR0b247XG4gICAgICAgIGdsb2JhbE9ialtcIlB1c2hCdXR0b25cIl0gPSBBY3JvRm9ybVB1c2hCdXR0b247XG4gICAgICAgIGdsb2JhbE9ialtcIlJhZGlvQnV0dG9uXCJdID0gQWNyb0Zvcm1SYWRpb0J1dHRvbjtcbiAgICAgICAgZ2xvYmFsT2JqW1wiQ2hlY2tCb3hcIl0gPSBBY3JvRm9ybUNoZWNrQm94O1xuICAgICAgICBnbG9iYWxPYmpbXCJUZXh0RmllbGRcIl0gPSBBY3JvRm9ybVRleHRGaWVsZDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiUGFzc3dvcmRGaWVsZFwiXSA9IEFjcm9Gb3JtUGFzc3dvcmRGaWVsZDtcblxuICAgICAgICAvLyBiYWNrd2FyZHNDb21wYXRpYmlsaXR5XG4gICAgICAgIGdsb2JhbE9ialtcIkFjcm9Gb3JtXCJdID0geyBBcHBlYXJhbmNlOiBBY3JvRm9ybUFwcGVhcmFuY2UgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJBY3JvRm9ybS1DbGFzc2VzIGFyZSBub3QgcG9wdWxhdGVkIGludG8gZ2xvYmFsLW5hbWVzcGFjZSwgYmVjYXVzZSB0aGUgY2xhc3MtTmFtZXMgZXhpc3QgYWxyZWFkeS4gVGhpcyBhdm9pZHMgY29uZmxpY3RzIHdpdGggdGhlIGFscmVhZHkgdXNlZCBmcmFtZXdvcmsuXCIpO1xuICAgIH1cblxuICAgIGpzUERGQVBJLkFjcm9Gb3JtQ2hvaWNlRmllbGQgPSBBY3JvRm9ybUNob2ljZUZpZWxkO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtTGlzdEJveCA9IEFjcm9Gb3JtTGlzdEJveDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUNvbWJvQm94ID0gQWNyb0Zvcm1Db21ib0JveDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUVkaXRCb3ggPSBBY3JvRm9ybUVkaXRCb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1CdXR0b24gPSBBY3JvRm9ybUJ1dHRvbjtcbiAgICBqc1BERkFQSS5BY3JvRm9ybVB1c2hCdXR0b24gPSBBY3JvRm9ybVB1c2hCdXR0b247XG4gICAganNQREZBUEkuQWNyb0Zvcm1SYWRpb0J1dHRvbiA9IEFjcm9Gb3JtUmFkaW9CdXR0b247XG4gICAganNQREZBUEkuQWNyb0Zvcm1DaGVja0JveCA9IEFjcm9Gb3JtQ2hlY2tCb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1UZXh0RmllbGQgPSBBY3JvRm9ybVRleHRGaWVsZDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybVBhc3N3b3JkRmllbGQgPSBBY3JvRm9ybVBhc3N3b3JkRmllbGQ7XG4gICAganNQREZBUEkuQWNyb0Zvcm1BcHBlYXJhbmNlID0gQWNyb0Zvcm1BcHBlYXJhbmNlO1xuXG4gICAganNQREZBUEkuQWNyb0Zvcm0gPSB7XG4gICAgICAgIENob2ljZUZpZWxkOiBBY3JvRm9ybUNob2ljZUZpZWxkLFxuICAgICAgICBMaXN0Qm94OiBBY3JvRm9ybUxpc3RCb3gsXG4gICAgICAgIENvbWJvQm94OiBBY3JvRm9ybUNvbWJvQm94LFxuICAgICAgICBFZGl0Qm94OiBBY3JvRm9ybUVkaXRCb3gsXG4gICAgICAgIEJ1dHRvbjogQWNyb0Zvcm1CdXR0b24sXG4gICAgICAgIFB1c2hCdXR0b246IEFjcm9Gb3JtUHVzaEJ1dHRvbixcbiAgICAgICAgUmFkaW9CdXR0b246IEFjcm9Gb3JtUmFkaW9CdXR0b24sXG4gICAgICAgIENoZWNrQm94OiBBY3JvRm9ybUNoZWNrQm94LFxuICAgICAgICBUZXh0RmllbGQ6IEFjcm9Gb3JtVGV4dEZpZWxkLFxuICAgICAgICBQYXNzd29yZEZpZWxkOiBBY3JvRm9ybVBhc3N3b3JkRmllbGQsXG4gICAgICAgIEFwcGVhcmFuY2U6IEFjcm9Gb3JtQXBwZWFyYW5jZVxuICAgIH07XG5cbiAgICBqc1BERi5BY3JvRm9ybSA9IHtcbiAgICAgICAgQ2hvaWNlRmllbGQ6IEFjcm9Gb3JtQ2hvaWNlRmllbGQsXG4gICAgICAgIExpc3RCb3g6IEFjcm9Gb3JtTGlzdEJveCxcbiAgICAgICAgQ29tYm9Cb3g6IEFjcm9Gb3JtQ29tYm9Cb3gsXG4gICAgICAgIEVkaXRCb3g6IEFjcm9Gb3JtRWRpdEJveCxcbiAgICAgICAgQnV0dG9uOiBBY3JvRm9ybUJ1dHRvbixcbiAgICAgICAgUHVzaEJ1dHRvbjogQWNyb0Zvcm1QdXNoQnV0dG9uLFxuICAgICAgICBSYWRpb0J1dHRvbjogQWNyb0Zvcm1SYWRpb0J1dHRvbixcbiAgICAgICAgQ2hlY2tCb3g6IEFjcm9Gb3JtQ2hlY2tCb3gsXG4gICAgICAgIFRleHRGaWVsZDogQWNyb0Zvcm1UZXh0RmllbGQsXG4gICAgICAgIFBhc3N3b3JkRmllbGQ6IEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCxcbiAgICAgICAgQXBwZWFyYW5jZTogQWNyb0Zvcm1BcHBlYXJhbmNlXG4gICAgfTtcbn0pKGpzcGRmLmpzUERGLCAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93IHx8IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbCkpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0uanNcbi8vIG1vZHVsZSBpZCA9IDYyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIiAgLyoqXG4gICAqIGpzUERGIGZyb21IVE1MIHBsdWdpbi4gQkVUQSBzdGFnZS4gQVBJIHN1YmplY3QgdG8gY2hhbmdlLiBOZWVkcyBicm93c2VyXG4gICAqIENvcHlyaWdodCAoYykgMjAxMiBXaWxsb3cgU3lzdGVtcyBDb3Jwb3JhdGlvbiwgd2lsbG93LXN5c3RlbXMuY29tXG4gICAqICAgICAgICAgICAgICAgMjAxNCBKdWFuIFBhYmxvIEdhdmlyaWEsIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWFucGdhdmlyaWFcbiAgICogICAgICAgICAgICAgICAyMDE0IERpZWdvIENhc29ycmFuLCBodHRwczovL2dpdGh1Yi5jb20vZGllZ29jclxuICAgKiAgICAgICAgICAgICAgIDIwMTQgRGFuaWVsIEh1c2FyLCBodHRwczovL2dpdGh1Yi5jb20vZGFuaWVsaHVzYXJcbiAgICogICAgICAgICAgICAgICAyMDE0IFdvbGZnYW5nIEdhc3NsZXIsIGh0dHBzOi8vZ2l0aHViLmNvbS93b29sZmdcbiAgICogICAgICAgICAgICAgICAyMDE0IFN0ZXZlbiBTcHVuZ2luLCBodHRwczovL2dpdGh1Yi5jb20vZmxhbWVuY29cbiAgICpcbiAgICogQGxpY2Vuc2VcbiAgICogXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuICB2YXIganNwZGYgPSByZXF1aXJlKFwianNwZGZcIik7XG5cbiAgKGZ1bmN0aW9uIChqc1BERkFQSSkge1xuICAgIHZhciBjbG9uZSwgX0RyaWxsRm9yQ29udGVudCwgRm9udE5hbWVEQiwgRm9udFN0eWxlTWFwLCBUZXh0QWxpZ25NYXAsIEZvbnRXZWlnaHRNYXAsIEZsb2F0TWFwLCBDbGVhck1hcCwgR2V0Q1NTLCBQdXJnZVdoaXRlU3BhY2UsIFJlbmRlcmVyLCBSZXNvbHZlRm9udCwgUmVzb2x2ZVVuaXRlZE51bWJlciwgVW5pdGVkTnVtYmVyTWFwLCBlbGVtZW50SGFuZGxlZEVsc2V3aGVyZSwgaW1hZ2VzLCBsb2FkSW1ncywgY2hlY2tGb3JGb290ZXIsIHByb2Nlc3MsIHRhYmxlVG9Kc29uO1xuXG4gICAgY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICBDbG9uZS5wcm90b3R5cGUgPSBvYmo7XG4gICAgICAgIHJldHVybiBuZXcgQ2xvbmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGZ1bmN0aW9uIENsb25lKCkge31cbiAgICB9KCk7XG5cbiAgICBQdXJnZVdoaXRlU3BhY2UgPSBmdW5jdGlvbiBQdXJnZVdoaXRlU3BhY2UoYXJyYXkpIHtcbiAgICAgIHZhciBmcmFnbWVudCwgaSwgbCwgbFRyaW1tZWQsIHIsIHJUcmltbWVkLCB0cmFpbGluZ1NwYWNlO1xuICAgICAgaSA9IDA7XG4gICAgICBsID0gYXJyYXkubGVuZ3RoO1xuICAgICAgZnJhZ21lbnQgPSB2b2lkIDA7XG4gICAgICBsVHJpbW1lZCA9IGZhbHNlO1xuICAgICAgclRyaW1tZWQgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKCFsVHJpbW1lZCAmJiBpICE9PSBsKSB7XG4gICAgICAgIGZyYWdtZW50ID0gYXJyYXlbaV0gPSBhcnJheVtpXS50cmltTGVmdCgpO1xuXG4gICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgIGxUcmltbWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgaSA9IGwgLSAxO1xuXG4gICAgICB3aGlsZSAobCAmJiAhclRyaW1tZWQgJiYgaSAhPT0gLTEpIHtcbiAgICAgICAgZnJhZ21lbnQgPSBhcnJheVtpXSA9IGFycmF5W2ldLnRyaW1SaWdodCgpO1xuXG4gICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgIHJUcmltbWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGktLTtcbiAgICAgIH1cblxuICAgICAgciA9IC9cXHMrJC9nO1xuICAgICAgdHJhaWxpbmdTcGFjZSA9IHRydWU7XG4gICAgICBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgIT09IGwpIHtcbiAgICAgICAgLy8gTGVhdmUgdGhlIGxpbmUgYnJlYWtzIGludGFjdFxuICAgICAgICBpZiAoYXJyYXlbaV0gIT0gXCJcXHUyMDI4XCIpIHtcbiAgICAgICAgICBmcmFnbWVudCA9IGFycmF5W2ldLnJlcGxhY2UoL1xccysvZywgXCIgXCIpO1xuXG4gICAgICAgICAgaWYgKHRyYWlsaW5nU3BhY2UpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnQudHJpbUxlZnQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICAgIHRyYWlsaW5nU3BhY2UgPSByLnRlc3QoZnJhZ21lbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFycmF5W2ldID0gZnJhZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIgPSBmdW5jdGlvbiBSZW5kZXJlcihwZGYsIHgsIHksIHNldHRpbmdzKSB7XG4gICAgICB0aGlzLnBkZiA9IHBkZjtcbiAgICAgIHRoaXMueCA9IHg7XG4gICAgICB0aGlzLnkgPSB5O1xuICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzOyAvL2xpc3Qgb2YgZnVuY3Rpb25zIHdoaWNoIGFyZSBjYWxsZWQgYWZ0ZXIgZWFjaCBlbGVtZW50LXJlbmRlcmluZyBwcm9jZXNzXG5cbiAgICAgIHRoaXMud2F0Y2hGdW5jdGlvbnMgPSBbXTtcbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFJlc29sdmVGb250ID0gZnVuY3Rpb24gUmVzb2x2ZUZvbnQoY3NzX2ZvbnRfZmFtaWx5X3N0cmluZykge1xuICAgICAgdmFyIG5hbWUsIHBhcnQsIHBhcnRzO1xuICAgICAgbmFtZSA9IHZvaWQgMDtcbiAgICAgIHBhcnRzID0gY3NzX2ZvbnRfZmFtaWx5X3N0cmluZy5zcGxpdChcIixcIik7XG4gICAgICBwYXJ0ID0gcGFydHMuc2hpZnQoKTtcblxuICAgICAgd2hpbGUgKCFuYW1lICYmIHBhcnQpIHtcbiAgICAgICAgbmFtZSA9IEZvbnROYW1lREJbcGFydC50cmltKCkudG9Mb3dlckNhc2UoKV07XG4gICAgICAgIHBhcnQgPSBwYXJ0cy5zaGlmdCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9O1xuXG4gICAgUmVzb2x2ZVVuaXRlZE51bWJlciA9IGZ1bmN0aW9uIFJlc29sdmVVbml0ZWROdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZykge1xuICAgICAgLy9JRTggaXNzdWVzXG4gICAgICBjc3NfbGluZV9oZWlnaHRfc3RyaW5nID0gY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyA9PT0gXCJhdXRvXCIgPyBcIjBweFwiIDogY3NzX2xpbmVfaGVpZ2h0X3N0cmluZztcblxuICAgICAgaWYgKGNzc19saW5lX2hlaWdodF9zdHJpbmcuaW5kZXhPZihcImVtXCIpID4gLTEgJiYgIWlzTmFOKE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nLnJlcGxhY2UoXCJlbVwiLCBcIlwiKSkpKSB7XG4gICAgICAgIGNzc19saW5lX2hlaWdodF9zdHJpbmcgPSBOdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5yZXBsYWNlKFwiZW1cIiwgXCJcIikpICogMTguNzE5ICsgXCJweFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5pbmRleE9mKFwicHRcIikgPiAtMSAmJiAhaXNOYU4oTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcucmVwbGFjZShcInB0XCIsIFwiXCIpKSkpIHtcbiAgICAgICAgY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyA9IE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nLnJlcGxhY2UoXCJwdFwiLCBcIlwiKSkgKiAxLjMzMyArIFwicHhcIjtcbiAgICAgIH1cblxuICAgICAgdmFyIG5vcm1hbCwgdW5kZWYsIHZhbHVlO1xuICAgICAgdW5kZWYgPSB2b2lkIDA7XG4gICAgICBub3JtYWwgPSAxNi4wMDtcbiAgICAgIHZhbHVlID0gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IHtcbiAgICAgICAgXCJ4eC1zbWFsbFwiOiA5LFxuICAgICAgICBcIngtc21hbGxcIjogMTEsXG4gICAgICAgIHNtYWxsOiAxMyxcbiAgICAgICAgbWVkaXVtOiAxNixcbiAgICAgICAgbGFyZ2U6IDE5LFxuICAgICAgICBcIngtbGFyZ2VcIjogMjMsXG4gICAgICAgIFwieHgtbGFyZ2VcIjogMjgsXG4gICAgICAgIGF1dG86IDBcbiAgICAgIH1bY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ107XG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWYpIHtcbiAgICAgICAgcmV0dXJuIFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXSA9IHZhbHVlIC8gbm9ybWFsO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPSBwYXJzZUZsb2F0KGNzc19saW5lX2hlaWdodF9zdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSB2YWx1ZSAvIG5vcm1hbDtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSBjc3NfbGluZV9oZWlnaHRfc3RyaW5nLm1hdGNoKC8oW1xcZFxcLl0rKShweCkvKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gcGFyc2VGbG9hdCh2YWx1ZVsxXSkgLyBub3JtYWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSAxO1xuICAgIH07XG5cbiAgICBHZXRDU1MgPSBmdW5jdGlvbiBHZXRDU1MoZWxlbWVudCkge1xuICAgICAgdmFyIGNzcywgdG1wLCBjb21wdXRlZENTU0VsZW1lbnQ7XG5cbiAgICAgIGNvbXB1dGVkQ1NTRWxlbWVudCA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICB2YXIgY29tcENTUztcblxuICAgICAgICBjb21wQ1NTID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVsLmN1cnJlbnRTdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsLmN1cnJlbnRTdHlsZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVsLnN0eWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfShlbCk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgcHJvcCA9IHByb3AucmVwbGFjZSgvLVxcRC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaC5jaGFyQXQoMSkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gY29tcENTU1twcm9wXTtcbiAgICAgICAgfTtcbiAgICAgIH0oZWxlbWVudCk7XG5cbiAgICAgIGNzcyA9IHt9O1xuICAgICAgdG1wID0gdm9pZCAwO1xuICAgICAgY3NzW1wiZm9udC1mYW1pbHlcIl0gPSBSZXNvbHZlRm9udChjb21wdXRlZENTU0VsZW1lbnQoXCJmb250LWZhbWlseVwiKSkgfHwgXCJ0aW1lc1wiO1xuICAgICAgY3NzW1wiZm9udC1zdHlsZVwiXSA9IEZvbnRTdHlsZU1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJmb250LXN0eWxlXCIpXSB8fCBcIm5vcm1hbFwiO1xuICAgICAgY3NzW1widGV4dC1hbGlnblwiXSA9IFRleHRBbGlnbk1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJ0ZXh0LWFsaWduXCIpXSB8fCBcImxlZnRcIjtcbiAgICAgIHRtcCA9IEZvbnRXZWlnaHRNYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwiZm9udC13ZWlnaHRcIildIHx8IFwibm9ybWFsXCI7XG5cbiAgICAgIGlmICh0bXAgPT09IFwiYm9sZFwiKSB7XG4gICAgICAgIGlmIChjc3NbXCJmb250LXN0eWxlXCJdID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgY3NzW1wiZm9udC1zdHlsZVwiXSA9IHRtcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjc3NbXCJmb250LXN0eWxlXCJdID0gdG1wICsgY3NzW1wiZm9udC1zdHlsZVwiXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjc3NbXCJmb250LXNpemVcIl0gPSBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcImZvbnQtc2l6ZVwiKSkgfHwgMTtcbiAgICAgIGNzc1tcImxpbmUtaGVpZ2h0XCJdID0gUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJsaW5lLWhlaWdodFwiKSkgfHwgMTtcbiAgICAgIGNzc1tcImRpc3BsYXlcIl0gPSBjb21wdXRlZENTU0VsZW1lbnQoXCJkaXNwbGF5XCIpID09PSBcImlubGluZVwiID8gXCJpbmxpbmVcIiA6IFwiYmxvY2tcIjtcbiAgICAgIHRtcCA9IGNzc1tcImRpc3BsYXlcIl0gPT09IFwiYmxvY2tcIjtcbiAgICAgIGNzc1tcIm1hcmdpbi10b3BcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJtYXJnaW4tdG9wXCIpKSB8fCAwO1xuICAgICAgY3NzW1wibWFyZ2luLWJvdHRvbVwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcIm1hcmdpbi1ib3R0b21cIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWRkaW5nLXRvcFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZGRpbmctdG9wXCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy1ib3R0b21cIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJwYWRkaW5nLWJvdHRvbVwiKSkgfHwgMDtcbiAgICAgIGNzc1tcIm1hcmdpbi1sZWZ0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibWFyZ2luLWxlZnRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJtYXJnaW4tcmlnaHRcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJtYXJnaW4tcmlnaHRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWRkaW5nLWxlZnRcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJwYWRkaW5nLWxlZnRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWRkaW5nLXJpZ2h0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwicGFkZGluZy1yaWdodFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcInBhZ2UtYnJlYWstYmVmb3JlXCJdID0gY29tcHV0ZWRDU1NFbGVtZW50KFwicGFnZS1icmVhay1iZWZvcmVcIikgfHwgXCJhdXRvXCI7IC8vZmxvYXQgYW5kIGNsZWFyaW5nIG9mIGZsb2F0c1xuXG4gICAgICBjc3NbXCJmbG9hdFwiXSA9IEZsb2F0TWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcImNzc0Zsb2F0XCIpXSB8fCBcIm5vbmVcIjtcbiAgICAgIGNzc1tcImNsZWFyXCJdID0gQ2xlYXJNYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwiY2xlYXJcIildIHx8IFwibm9uZVwiO1xuICAgICAgY3NzW1wiY29sb3JcIl0gPSBjb21wdXRlZENTU0VsZW1lbnQoXCJjb2xvclwiKTtcbiAgICAgIHJldHVybiBjc3M7XG4gICAgfTtcblxuICAgIGVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlID0gZnVuY3Rpb24gZWxlbWVudEhhbmRsZWRFbHNld2hlcmUoZWxlbWVudCwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykge1xuICAgICAgdmFyIGhhbmRsZXJzLCBpLCBpc0hhbmRsZWRFbHNld2hlcmUsIGwsIGNsYXNzTmFtZXM7XG4gICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBmYWxzZTtcbiAgICAgIGkgPSB2b2lkIDA7XG4gICAgICBsID0gdm9pZCAwO1xuICAgICAgaGFuZGxlcnMgPSBlbGVtZW50SGFuZGxlcnNbXCIjXCIgKyBlbGVtZW50LmlkXTtcblxuICAgICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgICBsID0gaGFuZGxlcnMubGVuZ3RoO1xuXG4gICAgICAgICAgd2hpbGUgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaSAhPT0gbCkge1xuICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnNbaV0oZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBoYW5kbGVycyA9IGVsZW1lbnRIYW5kbGVyc1tlbGVtZW50Lm5vZGVOYW1lXTtcblxuICAgICAgaWYgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaGFuZGxlcnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnMoZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgIGwgPSBoYW5kbGVycy5sZW5ndGg7XG5cbiAgICAgICAgICB3aGlsZSAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBpICE9PSBsKSB7XG4gICAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVyc1tpXShlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIFRyeSBjbGFzcyBuYW1lc1xuXG5cbiAgICAgIGNsYXNzTmFtZXMgPSB0eXBlb2YgZWxlbWVudC5jbGFzc05hbWUgPT09ICdzdHJpbmcnID8gZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoJyAnKSA6IFtdO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBoYW5kbGVycyA9IGVsZW1lbnRIYW5kbGVyc1snLicgKyBjbGFzc05hbWVzW2ldXTtcblxuICAgICAgICBpZiAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBoYW5kbGVycykge1xuICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnMoZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgIGwgPSBoYW5kbGVycy5sZW5ndGg7XG5cbiAgICAgICAgICAgIHdoaWxlICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGkgIT09IGwpIHtcbiAgICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnNbaV0oZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc0hhbmRsZWRFbHNld2hlcmU7XG4gICAgfTtcblxuICAgIHRhYmxlVG9Kc29uID0gZnVuY3Rpb24gdGFibGVUb0pzb24odGFibGUsIHJlbmRlcmVyKSB7XG4gICAgICB2YXIgZGF0YSwgaGVhZGVycywgaSwgaiwgcm93RGF0YSwgdGFibGVSb3csIHRhYmxlX29iaiwgdGFibGVfd2l0aCwgY2VsbCwgbDtcbiAgICAgIGRhdGEgPSBbXTtcbiAgICAgIGhlYWRlcnMgPSBbXTtcbiAgICAgIGkgPSAwO1xuICAgICAgbCA9IDA7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgbCArPSB0YWJsZS5yb3dzWzBdLmNlbGxzW2pdLmNvbFNwYW47XG4gICAgICB9XG4gICAgICB0YWJsZV93aXRoID0gdGFibGUuY2xpZW50V2lkdGg7XG5cbiAgICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgICBjZWxsID0gdGFibGUucm93c1swXS5jZWxsc1tpXTtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNlbGwuY29sU3BhbjsgaisrKSB7XG4gICAgICAgICAgaGVhZGVyc1tpICsgal0gPSB7XG4gICAgICAgICAgICBuYW1lOiBjZWxsLnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnJykgKyAnXycgKyBqLFxuICAgICAgICAgICAgcHJvbXB0OiBjZWxsLnRleHRDb250ZW50LnJlcGxhY2UoL1xccj9cXG4vZywgJycpLFxuICAgICAgICAgICAgd2lkdGg6IGNlbGwuY2xpZW50V2lkdGggLyB0YWJsZV93aXRoICogcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggLyBjZWxsLmNvbFNwYW5cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaSArPSBqO1xuICAgICAgfVxuXG4gICAgICBpID0gMTtcblxuICAgICAgd2hpbGUgKGkgPCB0YWJsZS5yb3dzLmxlbmd0aCkge1xuICAgICAgICB0YWJsZVJvdyA9IHRhYmxlLnJvd3NbaV07XG4gICAgICAgIHJvd0RhdGEgPSB7fTtcbiAgICAgICAgaiA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGogPCB0YWJsZVJvdy5jZWxscy5sZW5ndGgpIHtcbiAgICAgICAgICByb3dEYXRhW2hlYWRlcnNbal0ubmFtZV0gPSB0YWJsZVJvdy5jZWxsc1tqXS50ZXh0Q29udGVudC5yZXBsYWNlKC9cXHI/XFxuL2csICcnKTtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLnB1c2gocm93RGF0YSk7XG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlX29iaiA9IHtcbiAgICAgICAgcm93czogZGF0YSxcbiAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFyIFNraXBOb2RlID0ge1xuICAgICAgU0NSSVBUOiAxLFxuICAgICAgU1RZTEU6IDEsXG4gICAgICBOT1NDUklQVDogMSxcbiAgICAgIE9CSkVDVDogMSxcbiAgICAgIEVNQkVEOiAxLFxuICAgICAgU0VMRUNUOiAxXG4gICAgfTtcbiAgICB2YXIgbGlzdENvdW50ID0gMTtcblxuICAgIF9EcmlsbEZvckNvbnRlbnQgPSBmdW5jdGlvbiBEcmlsbEZvckNvbnRlbnQoZWxlbWVudCwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykge1xuICAgICAgdmFyIGNuLCBjbnMsIGZyYWdtZW50Q1NTLCBpLCBpc0Jsb2NrLCBsLCB0YWJsZTJqc29uLCBjYjtcbiAgICAgIGNucyA9IGVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgIGNuID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnRDU1MgPSBHZXRDU1MoZWxlbWVudCk7XG4gICAgICBpc0Jsb2NrID0gZnJhZ21lbnRDU1MuZGlzcGxheSA9PT0gXCJibG9ja1wiO1xuXG4gICAgICBpZiAoaXNCbG9jaykge1xuICAgICAgICByZW5kZXJlci5zZXRCbG9ja0JvdW5kYXJ5KCk7XG4gICAgICAgIHJlbmRlcmVyLnNldEJsb2NrU3R5bGUoZnJhZ21lbnRDU1MpO1xuICAgICAgfVxuICAgICAgaSA9IDA7XG4gICAgICBsID0gY25zLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGkgPCBsKSB7XG4gICAgICAgIGNuID0gY25zW2ldO1xuXG4gICAgICAgIGlmICh0eXBlb2YoY24pID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy9leGVjdXRlIGFsbCB3YXRjaGVyIGZ1bmN0aW9ucyB0byBlLmcuIHJlc2V0IGZsb2F0aW5nXG4gICAgICAgICAgcmVuZGVyZXIuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zKGNuKTtcbiAgICAgICAgICAvKioqIEhFQURFUiByZW5kZXJpbmcgKiovXG5cbiAgICAgICAgICBpZiAoY24ubm9kZVR5cGUgPT09IDEgJiYgY24ubm9kZU5hbWUgPT09ICdIRUFERVInKSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gY247IC8vc3RvcmUgb2xkIHRvcCBtYXJnaW5cblxuICAgICAgICAgICAgdmFyIG9sZE1hcmdpblRvcCA9IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3A7IC8vc3Vic2NyaWJlIGZvciBuZXcgcGFnZSBldmVudCBhbmQgcmVuZGVyIGhlYWRlciBmaXJzdCBvbiBldmVyeSBwYWdlXG5cbiAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdhZGRQYWdlJywgZnVuY3Rpb24gKHBhZ2VJbmZvKSB7XG4gICAgICAgICAgICAgIC8vc2V0IGN1cnJlbnQgeSBwb3NpdGlvbiB0byBvbGQgbWFyZ2luXG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSBvbGRNYXJnaW5Ub3A7IC8vcmVuZGVyIGFsbCBjaGlsZCBub2RlcyBvZiB0aGUgaGVhZGVyIGVsZW1lbnRcblxuICAgICAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGhlYWRlciwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7IC8vc2V0IG1hcmdpbiB0byBvbGQgbWFyZ2luICsgcmVuZGVyZWQgaGVhZGVyICsgMTAgc3BhY2UgdG8gcHJldmVudCBvdmVybGFwcGluZ1xuICAgICAgICAgICAgICAvL2ltcG9ydGFudCBmb3Igb3RoZXIgcGx1Z2lucyAoZS5nLiB0YWJsZSkgdG8gc3RhcnQgcmVuZGVyaW5nIGF0IGNvcnJlY3QgcG9zaXRpb24gYWZ0ZXIgaGVhZGVyXG5cblxuICAgICAgICAgICAgICByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wID0gcmVuZGVyZXIueSArIDEwO1xuICAgICAgICAgICAgICByZW5kZXJlci55ICs9IDEwO1xuICAgICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjbi5ub2RlVHlwZSA9PT0gOCAmJiBjbi5ub2RlTmFtZSA9PT0gXCIjY29tbWVudFwiKSB7XG4gICAgICAgICAgICBpZiAofmNuLnRleHRDb250ZW50LmluZGV4T2YoXCJBRERfUEFHRVwiKSkge1xuICAgICAgICAgICAgICByZW5kZXJlci5wZGYuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICByZW5kZXJlci55ID0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVUeXBlID09PSAxICYmICFTa2lwTm9kZVtjbi5ub2RlTmFtZV0pIHtcbiAgICAgICAgICAgIC8qKiogSU1BR0UgUkVOREVSSU5HICoqKi9cbiAgICAgICAgICAgIHZhciBjYWNoZWRfaW1hZ2U7XG5cbiAgICAgICAgICAgIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJJTUdcIikge1xuICAgICAgICAgICAgICB2YXIgdXJsID0gY24uZ2V0QXR0cmlidXRlKFwic3JjXCIpO1xuICAgICAgICAgICAgICBjYWNoZWRfaW1hZ2UgPSBpbWFnZXNbKHJlbmRlcmVyLnBkZi5zSGFzaENvZGUgJiYgcmVuZGVyZXIucGRmLnNIYXNoQ29kZSh1cmwpKSB8fCB1cmxdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2FjaGVkX2ltYWdlKSB7XG4gICAgICAgICAgICAgIGlmIChyZW5kZXJlci5wZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkgLSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tIDwgcmVuZGVyZXIueSArIGNuLmhlaWdodCAmJiByZW5kZXJlci55ID4gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcCkge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5hZGRQYWdlKCk7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3A7IC8vY2hlY2sgaWYgd2UgaGF2ZSB0byBzZXQgYmFjayBzb21lIHZhbHVlcyBkdWUgdG8gZS5nLiBoZWFkZXIgcmVuZGVyaW5nIGZvciBuZXcgcGFnZVxuXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zKGNuKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBpbWFnZXNDU1MgPSBHZXRDU1MoY24pO1xuICAgICAgICAgICAgICB2YXIgaW1hZ2VYID0gcmVuZGVyZXIueDtcbiAgICAgICAgICAgICAgdmFyIGZvbnRUb1VuaXRSYXRpbyA9IDEyIC8gcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yOyAvL2RlZmluZSBhZGRpdGlvbmFsIHBhZGRpbmdzLCBtYXJnaW5zIHdoaWNoIGhhdmUgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50IGZvciBtYXJnaW4gY2FsY3VsYXRpb25zXG5cbiAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxTcGFjZUxlZnQgPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLWxlZnRcIl0gKyBpbWFnZXNDU1NbXCJwYWRkaW5nLWxlZnRcIl0pICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbFNwYWNlUmlnaHQgPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLXJpZ2h0XCJdICsgaW1hZ2VzQ1NTW1wicGFkZGluZy1yaWdodFwiXSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VUb3AgPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLXRvcFwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctdG9wXCJdKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxTcGFjZUJvdHRvbSA9IChpbWFnZXNDU1NbXCJtYXJnaW4tYm90dG9tXCJdICsgaW1hZ2VzQ1NTW1wicGFkZGluZy1ib3R0b21cIl0pICogZm9udFRvVW5pdFJhdGlvOyAvL2lmIGZsb2F0IGlzIHNldCB0byByaWdodCwgbW92ZSB0aGUgaW1hZ2UgdG8gdGhlIHJpZ2h0IGJvcmRlclxuICAgICAgICAgICAgICAvL2FkZCBzcGFjZSBpZiBtYXJnaW4gaXMgc2V0XG5cbiAgICAgICAgICAgICAgaWYgKGltYWdlc0NTU1snZmxvYXQnXSAhPT0gdW5kZWZpbmVkICYmIGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIGltYWdlWCArPSByZW5kZXJlci5zZXR0aW5ncy53aWR0aCAtIGNuLndpZHRoIC0gYWRkaXRpb25hbFNwYWNlUmlnaHQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW1hZ2VYICs9IGFkZGl0aW9uYWxTcGFjZUxlZnQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZW5kZXJlci5wZGYuYWRkSW1hZ2UoY2FjaGVkX2ltYWdlLCBpbWFnZVgsIHJlbmRlcmVyLnkgKyBhZGRpdGlvbmFsU3BhY2VUb3AsIGNuLndpZHRoLCBjbi5oZWlnaHQpO1xuICAgICAgICAgICAgICBjYWNoZWRfaW1hZ2UgPSB1bmRlZmluZWQ7IC8vaWYgdGhlIGZsb2F0IHByb3AgaXMgc3BlY2lmaWVkIHdlIGhhdmUgdG8gZmxvYXQgdGhlIHRleHQgYXJvdW5kIHRoZSBpbWFnZVxuXG4gICAgICAgICAgICAgIGlmIChpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdyaWdodCcgfHwgaW1hZ2VzQ1NTWydmbG9hdCddID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICAvL2FkZCBmdW5jdGlvbnQgdG8gc2V0IGJhY2sgY29vcmRpbmF0ZXMgYWZ0ZXIgaW1hZ2UgcmVuZGVyaW5nXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIud2F0Y2hGdW5jdGlvbnMucHVzaChmdW5jdGlvbiAoZGlmZlgsIHRocmVzaG9sZFksIGRpZmZXaWR0aCwgZWwpIHtcbiAgICAgICAgICAgICAgICAgIC8vdW5kbyBkcmF3aW5nIGJveCBhZGFwdGlvbnMgd2hpY2ggd2VyZSBzZXQgYnkgZmxvYXRpbmdcbiAgICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci55ID49IHRocmVzaG9sZFkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSBkaWZmWDtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggKz0gZGlmZldpZHRoO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwgJiYgZWwubm9kZVR5cGUgPT09IDEgJiYgIVNraXBOb2RlW2VsLm5vZGVOYW1lXSAmJiByZW5kZXJlci54ICsgZWwud2lkdGggPiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MubGVmdCArIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy53aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlci54ICs9IGRpZmZYO1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlci55ID0gdGhyZXNob2xkWTtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggKz0gZGlmZldpZHRoO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgaW1hZ2VzQ1NTWydmbG9hdCddID09PSAnbGVmdCcgPyAtY24ud2lkdGggLSBhZGRpdGlvbmFsU3BhY2VMZWZ0IC0gYWRkaXRpb25hbFNwYWNlUmlnaHQgOiAwLCByZW5kZXJlci55ICsgY24uaGVpZ2h0ICsgYWRkaXRpb25hbFNwYWNlVG9wICsgYWRkaXRpb25hbFNwYWNlQm90dG9tLCBjbi53aWR0aCkpOyAvL3Jlc2V0IGZsb2F0aW5nIGJ5IGNsZWFyOmJvdGggZGl2c1xuICAgICAgICAgICAgICAgIC8vanVzdCBzZXQgY3Vyc29yWSBhZnRlciB0aGUgZmxvYXRpbmcgZWxlbWVudFxuXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIud2F0Y2hGdW5jdGlvbnMucHVzaChmdW5jdGlvbiAoeVBvc2l0aW9uQWZ0ZXJGbG9hdGluZywgcGFnZXMsIGVsKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIueSA8IHlQb3NpdGlvbkFmdGVyRmxvYXRpbmcgJiYgcGFnZXMgPT09IHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5nZXROdW1iZXJPZlBhZ2VzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsLm5vZGVUeXBlID09PSAxICYmIEdldENTUyhlbCkuY2xlYXIgPT09ICdib3RoJykge1xuICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSB5UG9zaXRpb25BZnRlckZsb2F0aW5nO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsIHJlbmRlcmVyLnkgKyBjbi5oZWlnaHQsIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5nZXROdW1iZXJPZlBhZ2VzKCkpKTsgLy9pZiBmbG9hdGluZyBpcyBzZXQgd2UgZGVjcmVhc2UgdGhlIGF2YWlsYWJsZSB3aWR0aCBieSB0aGUgaW1hZ2Ugd2lkdGhcblxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoIC09IGNuLndpZHRoICsgYWRkaXRpb25hbFNwYWNlTGVmdCArIGFkZGl0aW9uYWxTcGFjZVJpZ2h0OyAvL2lmIGxlZnQganVzdCBhZGQgdGhlIGltYWdlIHdpZHRoIHRvIHRoZSBYIGNvb3JkaW5hdGVcblxuICAgICAgICAgICAgICAgIGlmIChpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSBjbi53aWR0aCArIGFkZGl0aW9uYWxTcGFjZUxlZnQgKyBhZGRpdGlvbmFsU3BhY2VSaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9pZiBubyBmbG9hdGluZyBpcyBzZXQsIG1vdmUgdGhlIHJlbmRlcmluZyBjdXJzb3IgYWZ0ZXIgdGhlIGltYWdlIGhlaWdodFxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gY24uaGVpZ2h0ICsgYWRkaXRpb25hbFNwYWNlVG9wICsgYWRkaXRpb25hbFNwYWNlQm90dG9tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8qKiogVEFCTEUgUkVOREVSSU5HICoqKi9cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJUQUJMRVwiKSB7XG4gICAgICAgICAgICAgIGlmKCFyZW5kZXJlci5wZGYuYXV0b1RhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGFibGUyanNvbiA9IHRhYmxlVG9Kc29uKGNuLCByZW5kZXJlcik7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAxMDtcbiAgICAgICAgICAgICAgICByZW5kZXJlci5wZGYudGFibGUocmVuZGVyZXIueCwgcmVuZGVyZXIueSwgdGFibGUyanNvbi5yb3dzLCB0YWJsZTJqc29uLmhlYWRlcnMsIHtcbiAgICAgICAgICAgICAgICAgIGF1dG9TaXplOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIHByaW50SGVhZGVyczogZWxlbWVudEhhbmRsZXJzLnByaW50SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgIG1hcmdpbnM6IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYyxcbiAgICAgICAgICAgICAgICAgIGNzczogR2V0Q1NTKGNuKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYuaW50ZXJuYWwuX19jZWxsX18ubGFzdENlbGwueSArXG4gICAgICAgICAgICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuX19jZWxsX18ubGFzdENlbGwuaGVpZ2h0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMTA7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmF1dG9UYWJsZSh7IHRoZW1lOiBcImdyaWRcIiwgaHRtbDogY24sIHN0YXJ0WTogcmVuZGVyZXIueSxcbiAgICAgICAgICAgICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICAgICAgICAgICBmb250OiByZW5kZXJlci5wZGYuZ2V0Rm9udCgpLmZvbnROYW1lLFxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogcmVuZGVyZXIucGRmLmdldEZvbnRTaXplKCksXG4gICAgICAgICAgICAgICAgICAgIHRleHRDb2xvcjogcmVuZGVyZXIucGRmLmdldFRleHRDb2xvcigpXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgbWFyZ2luOiB7IFxuICAgICAgICAgICAgICAgICAgICB0b3A6IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3AsIFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiByZW5kZXJlci54LCBcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpIC0gKHJlbmRlcmVyLnggICsgcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGgpLCBcbiAgICAgICAgICAgICAgICAgICAgYm90dG9tOiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5sYXN0QXV0b1RhYmxlLmZpbmFsWTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJPTFwiIHx8IGNuLm5vZGVOYW1lID09PSBcIlVMXCIpIHtcbiAgICAgICAgICAgICAgbGlzdENvdW50ID0gMTtcblxuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAxMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiTElcIikge1xuICAgICAgICAgICAgICB2YXIgdGVtcCA9IHJlbmRlcmVyLng7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gMjAgLyByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMztcblxuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIueCA9IHRlbXA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVOYW1lID09PSBcIkJSXCIpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSBmcmFnbWVudENTU1tcImZvbnQtc2l6ZVwiXSAqIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgICAgICAgcmVuZGVyZXIuYWRkVGV4dChcIlxcdTIwMjhcIiwgY2xvbmUoZnJhZ21lbnRDU1MpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICghZWxlbWVudEhhbmRsZWRFbHNld2hlcmUoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpKSB7XG4gICAgICAgICAgICAgICAgX0RyaWxsRm9yQ29udGVudChjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBjbi5ub2RlVmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChjbi5ub2RlVmFsdWUgJiYgY24ucGFyZW50Tm9kZS5ub2RlTmFtZSA9PT0gXCJMSVwiKSB7XG4gICAgICAgICAgICAgIGlmIChjbi5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUgPT09IFwiT0xcIikge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gbGlzdENvdW50KysgKyAnLiAnICsgdmFsdWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gZnJhZ21lbnRDU1NbXCJmb250LXNpemVcIl07XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldFggPSAoMyAtIGZvbnRTaXplICogMC43NSkgKiByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldFkgPSBmb250U2l6ZSAqIDAuNzUgKiByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgICAgdmFyIHJhZGl1cyA9IGZvbnRTaXplICogMS43NCAvIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcblxuICAgICAgICAgICAgICAgIGNiID0gZnVuY3Rpb24gY2IoeCwgeSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5wZGYuY2lyY2xlKHggKyBvZmZzZXRYLCB5ICsgb2Zmc2V0WSwgcmFkaXVzLCAnRkQnKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIE9ubHkgYWRkIHRoZSB0ZXh0IGlmIHRoZSB0ZXh0IG5vZGUgaXMgaW4gdGhlIGJvZHkgZWxlbWVudFxuICAgICAgICAgICAgLy8gQWRkIGNvbXBhdGliaWxpdHkgd2l0aCBJRTExXG5cblxuICAgICAgICAgICAgaWYgKCEhKGNuLm93bmVyRG9jdW1lbnQuYm9keS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihjbikgJiAxNikpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZXIuYWRkVGV4dCh2YWx1ZSwgZnJhZ21lbnRDU1MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNuID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZW5kZXJlci5hZGRUZXh0KGNuLCBmcmFnbWVudENTUyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50SGFuZGxlcnMub3V0WSA9IHJlbmRlcmVyLnk7XG5cbiAgICAgIGlmIChpc0Jsb2NrKSB7XG4gICAgICAgIHJldHVybiByZW5kZXJlci5zZXRCbG9ja0JvdW5kYXJ5KGNiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaW1hZ2VzID0ge307XG5cbiAgICBsb2FkSW1ncyA9IGZ1bmN0aW9uIGxvYWRJbWdzKGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMsIGNiKSB7XG4gICAgICB2YXIgaW1ncyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpLFxuICAgICAgICAgIGwgPSBpbWdzLmxlbmd0aCxcbiAgICAgICAgICBmb3VuZF9pbWFnZXMsXG4gICAgICAgICAgeCA9IDA7XG5cbiAgICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5ldmVudHMucHVibGlzaCgnaW1hZ2VzTG9hZGVkJyk7XG4gICAgICAgIGNiKGZvdW5kX2ltYWdlcyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGxvYWRJbWFnZSh1cmwsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKCF1cmwpIHJldHVybjtcbiAgICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBmb3VuZF9pbWFnZXMgPSArK3g7XG4gICAgICAgIGltZy5jcm9zc09yaWdpbiA9ICcnO1xuXG4gICAgICAgIGltZy5vbmVycm9yID0gaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoaW1nLmNvbXBsZXRlKSB7XG4gICAgICAgICAgICAvL3RvIHN1cHBvcnQgZGF0YSB1cmxzIGluIGltYWdlcywgc2V0IHdpZHRoIGFuZCBoZWlnaHRcbiAgICAgICAgICAgIC8vYXMgdGhvc2UgdmFsdWVzIGFyZSBub3QgcmVjb2duaXplZCBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAgICBpZiAoaW1nLnNyYy5pbmRleE9mKCdkYXRhOmltYWdlLycpID09PSAwKSB7XG4gICAgICAgICAgICAgIGltZy53aWR0aCA9IHdpZHRoIHx8IGltZy53aWR0aCB8fCAwO1xuICAgICAgICAgICAgICBpbWcuaGVpZ2h0ID0gaGVpZ2h0IHx8IGltZy5oZWlnaHQgfHwgMDtcbiAgICAgICAgICAgIH0gLy9pZiB2YWxpZCBpbWFnZSBhZGQgdG8ga25vd24gaW1hZ2VzIGFycmF5XG5cblxuICAgICAgICAgICAgaWYgKGltZy53aWR0aCArIGltZy5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgdmFyIGhhc2ggPSAocmVuZGVyZXIucGRmLnNIYXNoQ29kZSAmJiByZW5kZXJlci5wZGYuc0hhc2hDb2RlKHVybCkpIHx8IHVybDtcbiAgICAgICAgICAgICAgaW1hZ2VzW2hhc2hdID0gaW1hZ2VzW2hhc2hdIHx8IGltZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoISAtLXgpIHtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaW1nLnNyYyA9IHVybDtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGwtLSkge1xuICAgICAgICBsb2FkSW1hZ2UoaW1nc1tsXS5nZXRBdHRyaWJ1dGUoXCJzcmNcIiksIGltZ3NbbF0ud2lkdGgsIGltZ3NbbF0uaGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHggfHwgZG9uZSgpO1xuICAgIH07XG5cbiAgICBjaGVja0ZvckZvb3RlciA9IGZ1bmN0aW9uIGNoZWNrRm9yRm9vdGVyKGVsZW0sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpIHtcbiAgICAgIC8vY2hlY2sgaWYgd2UgY2FuIGZvdW5kIGEgPGZvb3Rlcj4gZWxlbWVudFxuICAgICAgdmFyIGZvb3RlciA9IGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJmb290ZXJcIik7XG5cbiAgICAgIGlmIChmb290ZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBmb290ZXIgPSBmb290ZXJbMF07IC8vYmFkIGhhY2sgdG8gZ2V0IGhlaWdodCBvZiBmb290ZXJcbiAgICAgICAgLy9jcmVhdCBkdW1teSBvdXQgYW5kIGNoZWNrIG5ldyB5IGFmdGVyIGZha2UgcmVuZGVyaW5nXG5cbiAgICAgICAgdmFyIG9sZE91dCA9IHJlbmRlcmVyLnBkZi5pbnRlcm5hbC53cml0ZTtcbiAgICAgICAgdmFyIG9sZFkgPSByZW5kZXJlci55O1xuXG4gICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC53cml0ZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgICAgIF9EcmlsbEZvckNvbnRlbnQoZm9vdGVyLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTtcblxuICAgICAgICB2YXIgZm9vdGVySGVpZ2h0ID0gTWF0aC5jZWlsKHJlbmRlcmVyLnkgLSBvbGRZKSArIDU7XG4gICAgICAgIHJlbmRlcmVyLnkgPSBvbGRZO1xuICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwud3JpdGUgPSBvbGRPdXQ7IC8vYWRkIDIwJSB0byBwcmV2ZW50IG92ZXJsYXBwaW5nXG5cbiAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSArPSBmb290ZXJIZWlnaHQ7IC8vQ3JlYXRlIGZ1bmN0aW9uIHJlbmRlciBoZWFkZXIgb24gZXZlcnkgcGFnZVxuXG4gICAgICAgIHZhciByZW5kZXJGb290ZXIgPSBmdW5jdGlvbiByZW5kZXJGb290ZXIocGFnZUluZm8pIHtcbiAgICAgICAgICB2YXIgcGFnZU51bWJlciA9IHBhZ2VJbmZvICE9PSB1bmRlZmluZWQgPyBwYWdlSW5mby5wYWdlTnVtYmVyIDogMTsgLy9zZXQgY3VycmVudCB5IHBvc2l0aW9uIHRvIG9sZCBtYXJnaW5cblxuICAgICAgICAgIHZhciBvbGRQb3NpdGlvbiA9IHJlbmRlcmVyLnk7IC8vcmVuZGVyIGFsbCBjaGlsZCBub2RlcyBvZiB0aGUgaGVhZGVyIGVsZW1lbnRcblxuICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkgLSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tO1xuICAgICAgICAgIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy5ib3R0b20gLT0gZm9vdGVySGVpZ2h0OyAvL2NoZWNrIGlmIHdlIGhhdmUgdG8gYWRkIHBhZ2UgbnVtYmVyc1xuXG4gICAgICAgICAgdmFyIHNwYW5zID0gZm9vdGVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzcGFuJyk7XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAvL2lmIHdlIGZpbmQgc29tZSBzcGFuIGVsZW1lbnQgd2l0aCBjbGFzcyBwYWdlQ291bnRlciwgc2V0IHRoZSBwYWdlXG4gICAgICAgICAgICBpZiAoKFwiIFwiICsgc3BhbnNbaV0uY2xhc3NOYW1lICsgXCIgXCIpLnJlcGxhY2UoL1tcXG5cXHRdL2csIFwiIFwiKS5pbmRleE9mKFwiIHBhZ2VDb3VudGVyIFwiKSA+IC0xKSB7XG4gICAgICAgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9IHBhZ2VOdW1iZXI7XG4gICAgICAgICAgICB9IC8vaWYgd2UgZmluZCBzb21lIHNwYW4gZWxlbWVudCB3aXRoIGNsYXNzIHRvdGFsUGFnZXMsIHNldCBhIHZhcmlhYmxlIHdoaWNoIGlzIHJlcGxhY2VkIGFmdGVyIHJlbmRlcmluZyBvZiBhbGwgcGFnZXNcblxuXG4gICAgICAgICAgICBpZiAoKFwiIFwiICsgc3BhbnNbaV0uY2xhc3NOYW1lICsgXCIgXCIpLnJlcGxhY2UoL1tcXG5cXHRdL2csIFwiIFwiKS5pbmRleE9mKFwiIHRvdGFsUGFnZXMgXCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgc3BhbnNbaV0uaW5uZXJIVE1MID0gJyMjI2pzUERGVmFyVG90YWxQYWdlcyMjIyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvL3JlbmRlciBmb290ZXIgY29udGVudFxuXG5cbiAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGZvb3RlciwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7IC8vc2V0IGJvdHRvbSBtYXJnaW4gdG8gcHJldmlvdXMgaGVpZ2h0IGluY2x1ZGluZyB0aGUgZm9vdGVyIGhlaWdodFxuXG5cbiAgICAgICAgICByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tICs9IGZvb3RlckhlaWdodDsgLy9pbXBvcnRhbnQgZm9yIG90aGVyIHBsdWdpbnMgKGUuZy4gdGFibGUpIHRvIHN0YXJ0IHJlbmRlcmluZyBhdCBjb3JyZWN0IHBvc2l0aW9uIGFmdGVyIGhlYWRlclxuXG4gICAgICAgICAgcmVuZGVyZXIueSA9IG9sZFBvc2l0aW9uO1xuICAgICAgICB9OyAvL2NoZWNrIGlmIGZvb3RlciBjb250YWlucyB0b3RhbFBhZ2VzIHdoaWNoIHNob3VsZCBiZSByZXBsYWNlIGF0IHRoZSBkaXNvcG9zYWwgb2YgdGhlIGRvY3VtZW50XG5cblxuICAgICAgICB2YXIgc3BhbnMgPSBmb290ZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NwYW4nKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKChcIiBcIiArIHNwYW5zW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKC9bXFxuXFx0XS9nLCBcIiBcIikuaW5kZXhPZihcIiB0b3RhbFBhZ2VzIFwiKSA+IC0xKSB7XG4gICAgICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnaHRtbFJlbmRlcmluZ0ZpbmlzaGVkJywgcmVuZGVyZXIucGRmLnB1dFRvdGFsUGFnZXMuYmluZChyZW5kZXJlci5wZGYsICcjIyNqc1BERlZhclRvdGFsUGFnZXMjIyMnKSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vcmVnaXN0ZXIgZXZlbnQgdG8gcmVuZGVyIGZvb3RlciBvbiBldmVyeSBuZXcgcGFnZVxuXG5cbiAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ2FkZFBhZ2UnLCByZW5kZXJGb290ZXIsIGZhbHNlKTsgLy9yZW5kZXIgZm9vdGVyIG9uIGZpcnN0IHBhZ2VcblxuICAgICAgICByZW5kZXJGb290ZXIoKTsgLy9wcmV2ZW50IGZvb3RlciByZW5kZXJpbmdcblxuICAgICAgICBTa2lwTm9kZVsnRk9PVEVSJ10gPSAxO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwcm9jZXNzID0gZnVuY3Rpb24gcHJvY2VzcyhwZGYsIGVsZW1lbnQsIHgsIHksIHNldHRpbmdzLCBjYWxsYmFjaykge1xuICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQgIT09IFwic3RyaW5nXCIgJiYgIWVsZW1lbnQucGFyZW50Tm9kZSkgZWxlbWVudCA9ICcnICsgZWxlbWVudC5pbm5lckhUTUw7XG5cbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBlbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgJGZyYW1lLCAkaGlkZGVuZGl2LCBmcmFtZW5hbWUsIHZpc3VhbGx5aGlkZGVuO1xuICAgICAgICAgIGZyYW1lbmFtZSA9IFwianNQREZodG1sVGV4dFwiICsgRGF0ZS5ub3coKS50b1N0cmluZygpICsgKE1hdGgucmFuZG9tKCkgKiAxMDAwKS50b0ZpeGVkKDApO1xuICAgICAgICAgIHZpc3VhbGx5aGlkZGVuID0gXCJwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcIiArIFwiY2xpcDogcmVjdCgxcHggMXB4IDFweCAxcHgpOyAvKiBJRTYsIElFNyAqL1wiICsgXCJjbGlwOiByZWN0KDFweCwgMXB4LCAxcHgsIDFweCk7XCIgKyBcInBhZGRpbmc6MCAhaW1wb3J0YW50O1wiICsgXCJib3JkZXI6MCAhaW1wb3J0YW50O1wiICsgXCJoZWlnaHQ6IDFweCAhaW1wb3J0YW50O1wiICsgXCJ3aWR0aDogMXB4ICFpbXBvcnRhbnQ7IFwiICsgXCJ0b3A6YXV0bztcIiArIFwibGVmdDotMTAwcHg7XCIgKyBcIm92ZXJmbG93OiBoaWRkZW47XCI7XG4gICAgICAgICAgJGhpZGRlbmRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICRoaWRkZW5kaXYuY2xhc3NOYW1lID0gXCJzanMtcGRmLWhpZGRlbi1odG1sLWRpdlwiO1xuICAgICAgICAgICRoaWRkZW5kaXYuc3R5bGUuY3NzVGV4dCA9IHZpc3VhbGx5aGlkZGVuO1xuICAgICAgICAgICRoaWRkZW5kaXYuaW5uZXJIVE1MID0gXCI8aWZyYW1lIHN0eWxlPVxcXCJoZWlnaHQ6MXB4O3dpZHRoOjFweFxcXCIgbmFtZT1cXFwiXCIgKyBmcmFtZW5hbWUgKyBcIlxcXCIgLz5cIjtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCRoaWRkZW5kaXYpO1xuICAgICAgICAgICRmcmFtZSA9IHdpbmRvdy5mcmFtZXNbZnJhbWVuYW1lXTtcbiAgICAgICAgICAkZnJhbWUuZG9jdW1lbnQub3BlbigpO1xuICAgICAgICAgICRmcmFtZS5kb2N1bWVudC53cml0ZWxuKGVsZW1lbnQpO1xuICAgICAgICAgICRmcmFtZS5kb2N1bWVudC5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybiAkZnJhbWUuZG9jdW1lbnQuYm9keTtcbiAgICAgICAgfShlbGVtZW50LnJlcGxhY2UoLzxcXC8/c2NyaXB0W14+XSo/Pi9naSwgJycpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGF2YWlsYWJsZUZvbnRzID0gT2JqZWN0LmtleXMocGRmLmdldEZvbnRMaXN0KCkpO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGF2YWlsYWJsZUZvbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBmb250TmFtZSA9IGF2YWlsYWJsZUZvbnRzW2ldO1xuICAgICAgICB2YXIgZm9udEZhbWlseSA9IGZvbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmKCFGb250TmFtZURCW2ZvbnRGYW1pbHldKSB7XG4gICAgICAgICAgRm9udE5hbWVEQltmb250RmFtaWx5XSA9IGZvbnROYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciByID0gbmV3IFJlbmRlcmVyKHBkZiwgeCwgeSwgc2V0dGluZ3MpLFxuICAgICAgICAgIG91dDsgLy8gMS4gbG9hZCBpbWFnZXNcbiAgICAgIC8vIDIuIHByZXBhcmUgb3B0aW9uYWwgZm9vdGVyIGVsZW1lbnRzXG4gICAgICAvLyAzLiByZW5kZXIgY29udGVudFxuXG4gICAgICBsb2FkSW1ncy5jYWxsKHRoaXMsIGVsZW1lbnQsIHIsIHNldHRpbmdzLmVsZW1lbnRIYW5kbGVycywgZnVuY3Rpb24gKGZvdW5kX2ltYWdlcykge1xuICAgICAgICBjaGVja0ZvckZvb3RlcihlbGVtZW50LCByLCBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMpO1xuXG4gICAgICAgIF9EcmlsbEZvckNvbnRlbnQoZWxlbWVudCwgciwgc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzKTsgLy9zZW5kIGV2ZW50IGRpc3Bvc2UgZm9yIGZpbmFsIHRha3MgKGUuZy4gZm9vdGVyIHRvdGFscGFnZSByZXBsYWNlbWVudClcblxuXG4gICAgICAgIHIucGRmLmludGVybmFsLmV2ZW50cy5wdWJsaXNoKCdodG1sUmVuZGVyaW5nRmluaXNoZWQnKTtcbiAgICAgICAgb3V0ID0gci5kaXNwb3NlKCk7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIGNhbGxiYWNrKG91dCk7ZWxzZSBpZiAoZm91bmRfaW1hZ2VzKSBjb25zb2xlLmVycm9yKCdqc1BERiBXYXJuaW5nOiByZW5kZXJpbmcgaXNzdWVzPyBwcm92aWRlIGEgY2FsbGJhY2sgdG8gZnJvbUhUTUwhJyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvdXQgfHwge1xuICAgICAgICB4OiByLngsXG4gICAgICAgIHk6IHIueVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnBhcmFncmFwaCA9IHtcbiAgICAgICAgdGV4dDogW10sXG4gICAgICAgIHN0eWxlOiBbXVxuICAgICAgfTtcbiAgICAgIHJldHVybiB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcInFcIik7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJRXCIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogdGhpcy54LFxuICAgICAgICB5OiB0aGlzLnksXG4gICAgICAgIHJlYWR5OiB0cnVlXG4gICAgICB9O1xuICAgIH07IC8vQ2hlY2tzIGlmIHdlIGhhdmUgdG8gZXhlY3V0ZSBzb21lIHdhdGNoZXIgZnVuY3Rpb25zXG4gICAgLy9lLmcuIHRvIGVuZCB0ZXh0IGZsb2F0aW5nIGFyb3VuZCBhbiBpbWFnZVxuXG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICB2YXIgcmV0ID0gZmFsc2U7XG4gICAgICB2YXIgbmFycmF5ID0gW107XG5cbiAgICAgIGlmICh0aGlzLndhdGNoRnVuY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndhdGNoRnVuY3Rpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKHRoaXMud2F0Y2hGdW5jdGlvbnNbaV0oZWwpID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuYXJyYXkucHVzaCh0aGlzLndhdGNoRnVuY3Rpb25zW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndhdGNoRnVuY3Rpb25zID0gbmFycmF5O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuc3BsaXRGcmFnbWVudHNJbnRvTGluZXMgPSBmdW5jdGlvbiAoZnJhZ21lbnRzLCBzdHlsZXMpIHtcbiAgICAgIHZhciBjdXJyZW50TGluZUxlbmd0aCwgZGVmYXVsdEZvbnRTaXplLCBmZiwgZm9udE1ldHJpY3MsIGZvbnRNZXRyaWNzQ2FjaGUsIGZyYWdtZW50LCBmcmFnbWVudENob3BwZWQsIGZyYWdtZW50TGVuZ3RoLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcywgZnMsIGssIGxpbmUsIGxpbmVzLCBtYXhMaW5lTGVuZ3RoLCBzdHlsZTtcbiAgICAgIGRlZmF1bHRGb250U2l6ZSA9IDEyO1xuICAgICAgayA9IHRoaXMucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgZm9udE1ldHJpY3NDYWNoZSA9IHt9O1xuICAgICAgZmYgPSB2b2lkIDA7XG4gICAgICBmcyA9IHZvaWQgMDtcbiAgICAgIGZvbnRNZXRyaWNzID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnQgPSB2b2lkIDA7XG4gICAgICBzdHlsZSA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnRMZW5ndGggPSB2b2lkIDA7XG4gICAgICBmcmFnbWVudENob3BwZWQgPSB2b2lkIDA7XG4gICAgICBsaW5lID0gW107XG4gICAgICBsaW5lcyA9IFtsaW5lXTtcbiAgICAgIGN1cnJlbnRMaW5lTGVuZ3RoID0gMDtcbiAgICAgIG1heExpbmVMZW5ndGggPSB0aGlzLnNldHRpbmdzLndpZHRoO1xuXG4gICAgICB3aGlsZSAoZnJhZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50cy5zaGlmdCgpO1xuICAgICAgICBzdHlsZSA9IHN0eWxlcy5zaGlmdCgpO1xuXG4gICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgIGZmID0gc3R5bGVbXCJmb250LWZhbWlseVwiXTtcbiAgICAgICAgICBmcyA9IHN0eWxlW1wiZm9udC1zdHlsZVwiXTtcbiAgICAgICAgICBmb250TWV0cmljcyA9IGZvbnRNZXRyaWNzQ2FjaGVbZmYgKyBmc107XG5cbiAgICAgICAgICBpZiAoIWZvbnRNZXRyaWNzKSB7XG4gICAgICAgICAgICBmb250TWV0cmljcyA9IHRoaXMucGRmLmludGVybmFsLmdldEZvbnQoZmYsIGZzKS5tZXRhZGF0YS5Vbmljb2RlO1xuICAgICAgICAgICAgZm9udE1ldHJpY3NDYWNoZVtmZiArIGZzXSA9IGZvbnRNZXRyaWNzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzID0ge1xuICAgICAgICAgICAgd2lkdGhzOiBmb250TWV0cmljcy53aWR0aHMsXG4gICAgICAgICAgICBrZXJuaW5nOiBmb250TWV0cmljcy5rZXJuaW5nLFxuICAgICAgICAgICAgZm9udFNpemU6IHN0eWxlW1wiZm9udC1zaXplXCJdICogZGVmYXVsdEZvbnRTaXplLFxuICAgICAgICAgICAgdGV4dEluZGVudDogY3VycmVudExpbmVMZW5ndGhcbiAgICAgICAgICB9O1xuICAgICAgICAgIGZyYWdtZW50TGVuZ3RoID0gdGhpcy5wZGYuZ2V0U3RyaW5nVW5pdFdpZHRoKGZyYWdtZW50LCBmcmFnbWVudFNwZWNpZmljTWV0cmljcykgKiBmcmFnbWVudFNwZWNpZmljTWV0cmljcy5mb250U2l6ZSAvIGs7XG5cbiAgICAgICAgICBpZiAoZnJhZ21lbnQgPT0gXCJcXHUyMDI4XCIpIHtcbiAgICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50TGluZUxlbmd0aCArIGZyYWdtZW50TGVuZ3RoID4gbWF4TGluZUxlbmd0aCkge1xuICAgICAgICAgICAgZnJhZ21lbnRDaG9wcGVkID0gdGhpcy5wZGYuc3BsaXRUZXh0VG9TaXplKGZyYWdtZW50LCBtYXhMaW5lTGVuZ3RoLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcyk7XG4gICAgICAgICAgICBsaW5lLnB1c2goW2ZyYWdtZW50Q2hvcHBlZC5zaGlmdCgpLCBzdHlsZV0pO1xuXG4gICAgICAgICAgICB3aGlsZSAoZnJhZ21lbnRDaG9wcGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICBsaW5lID0gW1tmcmFnbWVudENob3BwZWQuc2hpZnQoKSwgc3R5bGVdXTtcbiAgICAgICAgICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3VycmVudExpbmVMZW5ndGggPSB0aGlzLnBkZi5nZXRTdHJpbmdVbml0V2lkdGgobGluZVswXVswXSwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpICogZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MuZm9udFNpemUgLyBrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaW5lLnB1c2goW2ZyYWdtZW50LCBzdHlsZV0pO1xuICAgICAgICAgICAgY3VycmVudExpbmVMZW5ndGggKz0gZnJhZ21lbnRMZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vaWYgdGV4dCBhbGlnbm1lbnQgd2FzIHNldCwgc2V0IG1hcmdpbi9pbmRlbnQgb2YgZWFjaCBsaW5lXG5cblxuICAgICAgaWYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gIT09IHVuZGVmaW5lZCAmJiAoc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ2NlbnRlcicgfHwgc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ3JpZ2h0JyB8fCBzdHlsZVsndGV4dC1hbGlnbiddID09PSAnanVzdGlmeScpKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5wZGYuZ2V0U3RyaW5nVW5pdFdpZHRoKGxpbmVzW2ldWzBdWzBdLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcykgKiBmcmFnbWVudFNwZWNpZmljTWV0cmljcy5mb250U2l6ZSAvIGs7IC8vaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uIGxpbmUgd2UgaGF2ZSB0byBjbG9uZSB0aGUgc3R5bGUgb2JqZWN0IGFzIGFsbCBsaW5lcyBob2xkIGEgcmVmZXJlbmNlIG9uIHRoaXMgb2JqZWN0XG5cbiAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdID0gY2xvbmUobGluZXNbaV1bMF1bMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBzcGFjZSA9IG1heExpbmVMZW5ndGggLSBsZW5ndGg7XG5cbiAgICAgICAgICBpZiAoc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ21hcmdpbi1sZWZ0J10gPSBzcGFjZTsgLy9pZiBhbGlnbm1lbnQgaXMgbm90IHJpZ2h0LCBpdCBoYXMgdG8gYmUgY2VudGVyIHNvIHNwbGl0IHRoZSBzcGFjZSB0byB0aGUgbGVmdCBhbmQgdGhlIHJpZ2h0XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHlsZVsndGV4dC1hbGlnbiddID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ21hcmdpbi1sZWZ0J10gPSBzcGFjZSAvIDI7IC8vaWYganVzdGlmeSB3YXMgc2V0LCBjYWxjdWxhdGUgdGhlIHdvcmQgc3BhY2luZyBhbmQgZGVmaW5lIGluIGJ5IHVzaW5nIHRoZSBjc3MgcHJvcGVydHlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdqdXN0aWZ5Jykge1xuICAgICAgICAgICAgdmFyIGNvdW50U3BhY2VzID0gbGluZXNbaV1bMF1bMF0uc3BsaXQoJyAnKS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ3dvcmQtc3BhY2luZyddID0gc3BhY2UgLyBjb3VudFNwYWNlczsgLy9pZ25vcmUgdGhlIGxhc3QgbGluZSBpbiBqdXN0aWZ5IG1vZGVcblxuICAgICAgICAgICAgaWYgKGkgPT09IGxpbmVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ3dvcmQtc3BhY2luZyddID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuUmVuZGVyVGV4dEZyYWdtZW50ID0gZnVuY3Rpb24gKHRleHQsIHN0eWxlKSB7XG4gICAgICB2YXIgZGVmYXVsdEZvbnRTaXplLCBmb250LCBtYXhMaW5lSGVpZ2h0O1xuICAgICAgbWF4TGluZUhlaWdodCA9IDA7XG4gICAgICBkZWZhdWx0Rm9udFNpemUgPSAxMjtcblxuICAgICAgaWYgKHRoaXMucGRmLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gdGhpcy5wZGYubWFyZ2luc19kb2MuYm90dG9tIDwgdGhpcy55ICsgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Rm9udFNpemUoKSkge1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcIkVUXCIsIFwiUVwiLCBcIlFcIik7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlTnVtYmVyID0gdGhpcy5wZGYuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcjtcbiAgICAgICAgaWYgKHRoaXMucGRmLmdldE51bWJlck9mUGFnZXMoKSA9PT0gY3VycmVudFBhZ2VOdW1iZXIpIHRoaXMucGRmLmFkZFBhZ2UoKTtcbiAgICAgICAgZWxzZSB0aGlzLnBkZi5zZXRQYWdlKGN1cnJlbnRQYWdlTnVtYmVyICsgMSk7XG4gICAgICAgIHRoaXMueSA9IHRoaXMucGRmLm1hcmdpbnNfZG9jLnRvcDtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJxXCIsIFwicVwiLCBcIkJUXCIsIHRoaXMuZ2V0UGRmQ29sb3Ioc3R5bGUuY29sb3IpLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKHRoaXMueCksIHRoaXMucGRmLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyh0aGlzLnkpLCBcIlRkXCIpOyAvL21vdmUgY3Vyc29yIGJ5IG9uZSBsaW5lIG9uIG5ldyBwYWdlXG5cbiAgICAgICAgbWF4TGluZUhlaWdodCA9IE1hdGgubWF4KG1heExpbmVIZWlnaHQsIHN0eWxlW1wibGluZS1oZWlnaHRcIl0sIHN0eWxlW1wiZm9udC1zaXplXCJdKTtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoMCwgKC0xICogZGVmYXVsdEZvbnRTaXplICogbWF4TGluZUhlaWdodCkudG9GaXhlZCgyKSwgXCJUZFwiKTtcbiAgICAgIH1cblxuICAgICAgZm9udCA9IHRoaXMucGRmLmludGVybmFsLmdldEZvbnQoc3R5bGVbXCJmb250LWZhbWlseVwiXSwgc3R5bGVbXCJmb250LXN0eWxlXCJdKTsgLy8gdGV4dCBjb2xvclxuXG4gICAgICB2YXIgcGRmVGV4dENvbG9yID0gdGhpcy5nZXRQZGZDb2xvcihzdHlsZVtcImNvbG9yXCJdKTtcblxuICAgICAgaWYgKHBkZlRleHRDb2xvciAhPT0gdGhpcy5sYXN0VGV4dENvbG9yKSB7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKHBkZlRleHRDb2xvcik7XG4gICAgICAgIHRoaXMubGFzdFRleHRDb2xvciA9IHBkZlRleHRDb2xvcjtcbiAgICAgIH0gLy9zZXQgdGhlIHdvcmQgc3BhY2luZyBmb3IgZS5nLiBqdXN0aWZ5IHN0eWxlXG5cblxuICAgICAgaWYgKHN0eWxlWyd3b3JkLXNwYWNpbmcnXSAhPT0gdW5kZWZpbmVkICYmIHN0eWxlWyd3b3JkLXNwYWNpbmcnXSA+IDApIHtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoc3R5bGVbJ3dvcmQtc3BhY2luZyddLnRvRml4ZWQoMiksIFwiVHdcIik7XG4gICAgICB9XG5cblxuICAgICAgdmFyIHBkZkVzY2FwZTE2ID0gZnVuY3Rpb24odGV4dCwgZm9udCkge1xuICAgICAgICB2YXIgd2lkdGhzID0gZm9udC5tZXRhZGF0YS5Vbmljb2RlLndpZHRocztcbiAgICAgICAgdmFyIHBhZHogPSBbXCJcIiwgXCIwXCIsIFwiMDBcIiwgXCIwMDBcIiwgXCIwMDAwXCJdO1xuICAgICAgICB2YXIgYXIgPSBbXCJcIl07XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGV4dC5sZW5ndGgsIHQ7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICB0ID0gZm9udC5tZXRhZGF0YS5jaGFyYWN0ZXJUb0dseXBoKHRleHQuY2hhckNvZGVBdChpKSk7XG4gICAgICAgICAgZm9udC5tZXRhZGF0YS5nbHlJZHNVc2VkLnB1c2godCk7XG4gICAgICAgICAgZm9udC5tZXRhZGF0YS50b1VuaWNvZGVbdF0gPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgaWYgKHdpZHRocy5pbmRleE9mKHQpID09IC0xKSB7XG4gICAgICAgICAgICB3aWR0aHMucHVzaCh0KTtcbiAgICAgICAgICAgIHdpZHRocy5wdXNoKFtwYXJzZUludChmb250Lm1ldGFkYXRhLndpZHRoT2ZHbHlwaCh0KSwgMTApXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0ID09IFwiMFwiKSB7XG4gICAgICAgICAgICAvL1NwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gY21hcC5cbiAgICAgICAgICAgIHJldHVybiBhci5qb2luKFwiXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ID0gdC50b1N0cmluZygxNik7XG4gICAgICAgICAgICBhci5wdXNoKHBhZHpbNCAtIHQubGVuZ3RoXSwgdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhci5qb2luKFwiXCIpO1xuICAgICAgfTtcblxuICAgICAgdmFyIHV0ZjhUZXh0RnVuY3Rpb24gPSBmdW5jdGlvbih0ZXh0LCBmb250KSB7XG4gICAgICAgIHZhciB0ZXh0ID0gdGV4dCB8fCBcIlwiO1xuICAgIFxuICAgICAgICB2YXIgc3RyID0gXCJcIixcbiAgICAgICAgICBzID0gMCxcbiAgICAgICAgICBjbWFwQ29uZmlybTtcbiAgICAgICAgdmFyIHN0clRleHQgPSBcIlwiO1xuICAgICAgICB2YXIgZW5jb2RpbmcgPSBmb250LmVuY29kaW5nO1xuICAgIFxuICAgICAgICBpZiAoZm9udC5lbmNvZGluZyAhPT0gXCJJZGVudGl0eS1IXCIpIHtcbiAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfVxuICAgICAgICBzdHJUZXh0ID0gdGV4dDtcbiAgICBcbiAgICAgICAgZm9yIChzID0gMDsgcyA8IHN0clRleHQubGVuZ3RoOyBzICs9IDEpIHtcbiAgICAgICAgICBpZiAoZm9udC5tZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShcImNtYXBcIikpIHtcbiAgICAgICAgICAgIGNtYXBDb25maXJtID0gZm9udC5tZXRhZGF0YS5jbWFwLnVuaWNvZGUuY29kZU1hcFtzdHJUZXh0W3NdLmNoYXJDb2RlQXQoMCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWNtYXBDb25maXJtKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHN0clRleHRbc10uY2hhckNvZGVBdCgwKSA8IDI1NiAmJlxuICAgICAgICAgICAgICBmb250Lm1ldGFkYXRhLmhhc093blByb3BlcnR5KFwiVW5pY29kZVwiKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHN0ciArPSBzdHJUZXh0W3NdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RyICs9IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciArPSBzdHJUZXh0W3NdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgaWYgKHBhcnNlSW50KGZvbnQuaWQuc2xpY2UoMSkpIDwgMTQgfHwgZW5jb2RpbmcgPT09IFwiV2luQW5zaUVuY29kaW5nXCIpIHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLnBkZi5pbnRlcm5hbC5wZGZFc2NhcGUoc3RyLCBrZXkpXG4gICAgICAgICAgICAuc3BsaXQoXCJcIilcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24oY3YpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGN2LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGVuY29kaW5nID09PSBcIklkZW50aXR5LUhcIikge1xuICAgICAgICAgIHJlc3VsdCA9IHBkZkVzY2FwZTE2KHN0ciwgZm9udCk7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07ICAgICAgXG5cbiAgICAgIC8vIHZhciBlc2NhcGVkVGV4dCA9IHRoaXMucGRmLmludGVybmFsLnBkZkVzY2FwZSh0ZXh0KTtcbiAgICAgIC8vIHZhciBlc2NhcGVkVGV4dCA9IHV0ZjhUZXh0RnVuY3Rpb24odGV4dCwgZm9udCk7XG4gICAgICAvLyBpZihlc2NhcGVkVGV4dCAhPSB0ZXh0KSB7XG4gICAgICAvLyAgIGVzY2FwZWRUZXh0ID0gXCI8XCIgKyBlc2NhcGVkVGV4dCArIFwiPlwiO1xuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgZXNjYXBlZFRleHQgPSBcIihcIiArIGVzY2FwZWRUZXh0ICsgXCIpXCI7XG4gICAgICAvLyB9XG5cbiAgICAgIHZhciBlc2NhcGVkVGV4dCA9IFwiXCI7XG4gICAgICBpZihmb250LmVuY29kaW5nICE9PSBcIklkZW50aXR5LUhcIikge1xuICAgICAgICBlc2NhcGVkVGV4dCA9IFwiKFwiICsgdGhpcy5wZGYuaW50ZXJuYWwucGRmRXNjYXBlKHRleHQpICsgXCIpXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlc2NhcGVkVGV4dCA9IFwiPFwiICsgdXRmOFRleHRGdW5jdGlvbih0ZXh0LCBmb250KSArIFwiPlwiO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcIi9cIiArIGZvbnQuaWQsIChkZWZhdWx0Rm9udFNpemUgKiBzdHlsZVtcImZvbnQtc2l6ZVwiXSkudG9GaXhlZCgyKSwgXCJUZlwiLCBlc2NhcGVkVGV4dCArIFwiIFRqXCIpOyAvL3NldCB0aGUgd29yZCBzcGFjaW5nIGJhY2sgdG8gbmV1dHJhbCA9PiAwXG5cbiAgICAgIGlmIChzdHlsZVsnd29yZC1zcGFjaW5nJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZSgwLCBcIlR3XCIpO1xuICAgICAgfVxuICAgIH07IC8vIEFjY2VwdHMgI0ZGRkZGRiwgcmdiKGludCxpbnQsaW50KSwgb3IgQ1NTIENvbG9yIE5hbWVcblxuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmdldFBkZkNvbG9yID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICB2YXIgdGV4dENvbG9yO1xuICAgICAgdmFyIHIsIGcsIGI7XG4gICAgICB2YXIgcnggPSAvcmdiXFxzKlxcKFxccyooXFxkKyksXFxzKihcXGQrKSxcXHMqKFxcZCtcXHMqKVxcKS87XG4gICAgICB2YXIgbSA9IHJ4LmV4ZWMoc3R5bGUpO1xuXG4gICAgICBpZiAobSAhPSBudWxsKSB7XG4gICAgICAgIHIgPSBwYXJzZUludChtWzFdKTtcbiAgICAgICAgZyA9IHBhcnNlSW50KG1bMl0pO1xuICAgICAgICBiID0gcGFyc2VJbnQobVszXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHN0eWxlID09PSBcInN0cmluZ1wiICYmIHN0eWxlLmNoYXJBdCgwKSAhPSAnIycpIHtcbiAgICAgICAgICB2YXIgcmdiQ29sb3IgPSBuZXcgUkdCQ29sb3Ioc3R5bGUpO1xuXG4gICAgICAgICAgaWYgKHJnYkNvbG9yLm9rKSB7XG4gICAgICAgICAgICBzdHlsZSA9IHJnYkNvbG9yLnRvSGV4KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlID0gJyMwMDAwMDAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHIgPSBzdHlsZS5zdWJzdHJpbmcoMSwgMyk7XG4gICAgICAgIHIgPSBwYXJzZUludChyLCAxNik7XG4gICAgICAgIGcgPSBzdHlsZS5zdWJzdHJpbmcoMywgNSk7XG4gICAgICAgIGcgPSBwYXJzZUludChnLCAxNik7XG4gICAgICAgIGIgPSBzdHlsZS5zdWJzdHJpbmcoNSwgNyk7XG4gICAgICAgIGIgPSBwYXJzZUludChiLCAxNik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgciA9PT0gJ3N0cmluZycgJiYgL14jWzAtOUEtRmEtZl17Nn0kLy50ZXN0KHIpKSB7XG4gICAgICAgIHZhciBoZXggPSBwYXJzZUludChyLnN1YnN0cigxKSwgMTYpO1xuICAgICAgICByID0gaGV4ID4+IDE2ICYgMjU1O1xuICAgICAgICBnID0gaGV4ID4+IDggJiAyNTU7XG4gICAgICAgIGIgPSBoZXggJiAyNTU7XG4gICAgICB9XG5cbiAgICAgIHZhciBmMyA9IHRoaXMuZjM7XG5cbiAgICAgIGlmIChyID09PSAwICYmIGcgPT09IDAgJiYgYiA9PT0gMCB8fCB0eXBlb2YgZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGV4dENvbG9yID0gZjMociAvIDI1NSkgKyAnIGcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dENvbG9yID0gW2YzKHIgLyAyNTUpLCBmMyhnIC8gMjU1KSwgZjMoYiAvIDI1NSksICdyZyddLmpvaW4oJyAnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRleHRDb2xvcjtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmYzID0gZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgcmV0dXJuIG51bWJlci50b0ZpeGVkKDMpOyAvLyBJZSwgJS4zZlxuICAgIH0sIFJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXJQYXJhZ3JhcGggPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHZhciBibG9ja3N0eWxlLCBkZWZhdWx0Rm9udFNpemUsIGZvbnRUb1VuaXRSYXRpbywgZnJhZ21lbnRzLCBpLCBsLCBsaW5lLCBsaW5lcywgbWF4TGluZUhlaWdodCwgb3V0LCBwYXJhZ3JhcGhzcGFjaW5nX2FmdGVyLCBwYXJhZ3JhcGhzcGFjaW5nX2JlZm9yZSwgcHJpb3JibG9ja3N0eWxlLCBzdHlsZXMsIGZvbnRTaXplO1xuICAgICAgZnJhZ21lbnRzID0gUHVyZ2VXaGl0ZVNwYWNlKHRoaXMucGFyYWdyYXBoLnRleHQpO1xuICAgICAgc3R5bGVzID0gdGhpcy5wYXJhZ3JhcGguc3R5bGU7XG4gICAgICBibG9ja3N0eWxlID0gdGhpcy5wYXJhZ3JhcGguYmxvY2tzdHlsZTtcbiAgICAgIHByaW9yYmxvY2tzdHlsZSA9IHRoaXMucGFyYWdyYXBoLnByaW9yYmxvY2tzdHlsZSB8fCB7fTtcbiAgICAgIHRoaXMucGFyYWdyYXBoID0ge1xuICAgICAgICB0ZXh0OiBbXSxcbiAgICAgICAgc3R5bGU6IFtdLFxuICAgICAgICBibG9ja3N0eWxlOiB7fSxcbiAgICAgICAgcHJpb3JibG9ja3N0eWxlOiBibG9ja3N0eWxlXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWZyYWdtZW50cy5qb2luKFwiXCIpLnRyaW0oKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxpbmVzID0gdGhpcy5zcGxpdEZyYWdtZW50c0ludG9MaW5lcyhmcmFnbWVudHMsIHN0eWxlcyk7XG4gICAgICBsaW5lID0gdm9pZCAwO1xuICAgICAgbWF4TGluZUhlaWdodCA9IHZvaWQgMDtcbiAgICAgIGRlZmF1bHRGb250U2l6ZSA9IDEyO1xuICAgICAgZm9udFRvVW5pdFJhdGlvID0gZGVmYXVsdEZvbnRTaXplIC8gdGhpcy5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICB0aGlzLnByaW9yTWFyZ2luQm90dG9tID0gdGhpcy5wcmlvck1hcmdpbkJvdHRvbSB8fCAwO1xuICAgICAgcGFyYWdyYXBoc3BhY2luZ19iZWZvcmUgPSAoTWF0aC5tYXgoKGJsb2Nrc3R5bGVbXCJtYXJnaW4tdG9wXCJdIHx8IDApIC0gdGhpcy5wcmlvck1hcmdpbkJvdHRvbSwgMCkgKyAoYmxvY2tzdHlsZVtcInBhZGRpbmctdG9wXCJdIHx8IDApKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgIHBhcmFncmFwaHNwYWNpbmdfYWZ0ZXIgPSAoKGJsb2Nrc3R5bGVbXCJtYXJnaW4tYm90dG9tXCJdIHx8IDApICsgKGJsb2Nrc3R5bGVbXCJwYWRkaW5nLWJvdHRvbVwiXSB8fCAwKSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICB0aGlzLnByaW9yTWFyZ2luQm90dG9tID0gYmxvY2tzdHlsZVtcIm1hcmdpbi1ib3R0b21cIl0gfHwgMDtcblxuICAgICAgaWYgKGJsb2Nrc3R5bGVbJ3BhZ2UtYnJlYWstYmVmb3JlJ10gPT09ICdhbHdheXMnKSB7XG4gICAgICAgIHRoaXMucGRmLmFkZFBhZ2UoKTtcbiAgICAgICAgdGhpcy55ID0gMDtcbiAgICAgICAgcGFyYWdyYXBoc3BhY2luZ19iZWZvcmUgPSAoKGJsb2Nrc3R5bGVbXCJtYXJnaW4tdG9wXCJdIHx8IDApICsgKGJsb2Nrc3R5bGVbXCJwYWRkaW5nLXRvcFwiXSB8fCAwKSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICB9XG5cbiAgICAgIG91dCA9IHRoaXMucGRmLmludGVybmFsLndyaXRlO1xuICAgICAgaSA9IHZvaWQgMDtcbiAgICAgIGwgPSB2b2lkIDA7XG4gICAgICB0aGlzLnkgKz0gcGFyYWdyYXBoc3BhY2luZ19iZWZvcmU7XG4gICAgICBvdXQoXCJxXCIsIFwiQlQgMCBnXCIsIHRoaXMucGRmLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcodGhpcy54KSwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlU3RyaW5nKHRoaXMueSksIFwiVGRcIik7IC8vc3RvcmVzIHRoZSBjdXJyZW50IGluZGVudCBvZiBjdXJzb3IgcG9zaXRpb25cblxuICAgICAgdmFyIGN1cnJlbnRJbmRlbnQgPSAwO1xuXG4gICAgICB3aGlsZSAobGluZXMubGVuZ3RoKSB7XG4gICAgICAgIGxpbmUgPSBsaW5lcy5zaGlmdCgpO1xuICAgICAgICBtYXhMaW5lSGVpZ2h0ID0gMDtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIGwgPSBsaW5lLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaSAhPT0gbCkge1xuICAgICAgICAgIGlmIChsaW5lW2ldWzBdLnRyaW0oKSkge1xuICAgICAgICAgICAgbWF4TGluZUhlaWdodCA9IE1hdGgubWF4KG1heExpbmVIZWlnaHQsIGxpbmVbaV1bMV1bXCJsaW5lLWhlaWdodFwiXSwgbGluZVtpXVsxXVtcImZvbnQtc2l6ZVwiXSk7XG4gICAgICAgICAgICBmb250U2l6ZSA9IGxpbmVbaV1bMV1bXCJmb250LXNpemVcIl0gKiA3O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGkrKztcbiAgICAgICAgfSAvL2lmIHdlIGhhdmUgdG8gbW92ZSB0aGUgY3Vyc29yIHRvIGFkYXB0IHRoZSBpbmRlbnRcblxuXG4gICAgICAgIHZhciBpbmRlbnRNb3ZlID0gMDtcbiAgICAgICAgdmFyIHdhbnRlZEluZGVudCA9IDA7IC8vaWYgYSBtYXJnaW4gd2FzIGFkZGVkIChieSBlLmcuIGEgdGV4dC1hbGlnbm1lbnQpLCBtb3ZlIHRoZSBjdXJzb3JcblxuICAgICAgICBpZiAobGluZVswXVsxXVtcIm1hcmdpbi1sZWZ0XCJdICE9PSB1bmRlZmluZWQgJiYgbGluZVswXVsxXVtcIm1hcmdpbi1sZWZ0XCJdID4gMCkge1xuICAgICAgICAgIHdhbnRlZEluZGVudCA9IHRoaXMucGRmLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcobGluZVswXVsxXVtcIm1hcmdpbi1sZWZ0XCJdKTtcbiAgICAgICAgICBpbmRlbnRNb3ZlID0gd2FudGVkSW5kZW50IC0gY3VycmVudEluZGVudDtcbiAgICAgICAgICBjdXJyZW50SW5kZW50ID0gd2FudGVkSW5kZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGluZGVudE1vcmUgPSBNYXRoLm1heChibG9ja3N0eWxlW1wibWFyZ2luLWxlZnRcIl0gfHwgMCwgMCkgKiBmb250VG9Vbml0UmF0aW87IC8vbW92ZSB0aGUgY3Vyc29yXG5cbiAgICAgICAgb3V0KGluZGVudE1vdmUgKyBpbmRlbnRNb3JlLCAoLTEgKiBkZWZhdWx0Rm9udFNpemUgKiBtYXhMaW5lSGVpZ2h0KS50b0ZpeGVkKDIpLCBcIlRkXCIpO1xuICAgICAgICBpID0gMDtcbiAgICAgICAgbCA9IGxpbmUubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChpICE9PSBsKSB7XG4gICAgICAgICAgaWYgKGxpbmVbaV1bMF0pIHtcbiAgICAgICAgICAgIHRoaXMuUmVuZGVyVGV4dEZyYWdtZW50KGxpbmVbaV1bMF0sIGxpbmVbaV1bMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMueSArPSBtYXhMaW5lSGVpZ2h0ICogZm9udFRvVW5pdFJhdGlvOyAvL2lmIHNvbWUgd2F0Y2hlciBmdW5jdGlvbiB3YXMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bCwgc28gZS5nLiBtYXJnaW4gYW5kIHdpZHRocyB3ZXJlIGNoYW5nZWQsXG4gICAgICAgIC8vcmVzZXQgbGluZSBkcmF3aW5nIGFuZCBjYWxjdWxhdGUgcG9zaXRpb24gYW5kIGxpbmVzIGFnYWluXG4gICAgICAgIC8vZS5nLiB0byBzdG9wIHRleHQgZmxvYXRpbmcgYXJvdW5kIGFuIGltYWdlXG5cbiAgICAgICAgaWYgKHRoaXMuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zKGxpbmVbMF1bMV0pICYmIGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgbG9jYWxGcmFnbWVudHMgPSBbXTtcbiAgICAgICAgICB2YXIgbG9jYWxTdHlsZXMgPSBbXTsgLy9jcmVhdGUgZnJhZ21lbnQgYXJyYXkgb2ZcblxuICAgICAgICAgIGxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxvY2FsTGluZSkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgdmFyIGwgPSBsb2NhbExpbmUubGVuZ3RoO1xuXG4gICAgICAgICAgICB3aGlsZSAoaSAhPT0gbCkge1xuICAgICAgICAgICAgICBpZiAobG9jYWxMaW5lW2ldWzBdKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxGcmFnbWVudHMucHVzaChsb2NhbExpbmVbaV1bMF0gKyAnICcpO1xuICAgICAgICAgICAgICAgIGxvY2FsU3R5bGVzLnB1c2gobG9jYWxMaW5lW2ldWzFdKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTsgLy9zcGxpdCBsaW5lcyBhZ2FpbiBkdWUgdG8gcG9zc2libGUgY29vcmRpbmF0ZSBjaGFuZ2VzXG5cbiAgICAgICAgICBsaW5lcyA9IHRoaXMuc3BsaXRGcmFnbWVudHNJbnRvTGluZXMoUHVyZ2VXaGl0ZVNwYWNlKGxvY2FsRnJhZ21lbnRzKSwgbG9jYWxTdHlsZXMpOyAvL3JlcG9zaXRpb24gdGhlIGN1cnJlbnQgY3Vyc29yXG5cbiAgICAgICAgICBvdXQoXCJFVFwiLCBcIlFcIik7XG4gICAgICAgICAgb3V0KFwicVwiLCBcIkJUIDAgZ1wiLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKHRoaXMueCksIHRoaXMucGRmLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyh0aGlzLnkpLCBcIlRkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjYiAmJiB0eXBlb2YgY2IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYi5jYWxsKHRoaXMsIHRoaXMueCAtIDksIHRoaXMueSAtIGZvbnRTaXplIC8gMik7XG4gICAgICB9XG5cbiAgICAgIG91dChcIkVUXCIsIFwiUVwiKTtcbiAgICAgIHJldHVybiB0aGlzLnkgKz0gcGFyYWdyYXBoc3BhY2luZ19hZnRlcjtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLnNldEJsb2NrQm91bmRhcnkgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclBhcmFncmFwaChjYik7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5zZXRCbG9ja1N0eWxlID0gZnVuY3Rpb24gKGNzcykge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYWdyYXBoLmJsb2Nrc3R5bGUgPSBjc3M7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5hZGRUZXh0ID0gZnVuY3Rpb24gKHRleHQsIGNzcykge1xuICAgICAgdGhpcy5wYXJhZ3JhcGgudGV4dC5wdXNoKHRleHQpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyYWdyYXBoLnN0eWxlLnB1c2goY3NzKTtcbiAgICB9O1xuXG4gICAgRm9udE5hbWVEQiA9IHtcbiAgICAgIGhlbHZldGljYTogXCJoZWx2ZXRpY2FcIixcbiAgICAgIFwic2Fucy1zZXJpZlwiOiBcImhlbHZldGljYVwiLFxuICAgICAgXCJ0aW1lcyBuZXcgcm9tYW5cIjogXCJ0aW1lc1wiLFxuICAgICAgc2VyaWY6IFwidGltZXNcIixcbiAgICAgIHRpbWVzOiBcInRpbWVzXCIsXG4gICAgICBtb25vc3BhY2U6IFwiY291cmllclwiLFxuICAgICAgY291cmllcjogXCJjb3VyaWVyXCJcbiAgICB9O1xuICAgIEZvbnRXZWlnaHRNYXAgPSB7XG4gICAgICAxMDA6IFwibm9ybWFsXCIsXG4gICAgICAyMDA6IFwibm9ybWFsXCIsXG4gICAgICAzMDA6IFwibm9ybWFsXCIsXG4gICAgICA0MDA6IFwibm9ybWFsXCIsXG4gICAgICA1MDA6IFwiYm9sZFwiLFxuICAgICAgNjAwOiBcImJvbGRcIixcbiAgICAgIDcwMDogXCJib2xkXCIsXG4gICAgICA4MDA6IFwiYm9sZFwiLFxuICAgICAgOTAwOiBcImJvbGRcIixcbiAgICAgIG5vcm1hbDogXCJub3JtYWxcIixcbiAgICAgIGJvbGQ6IFwiYm9sZFwiLFxuICAgICAgYm9sZGVyOiBcImJvbGRcIixcbiAgICAgIGxpZ2h0ZXI6IFwibm9ybWFsXCJcbiAgICB9O1xuICAgIEZvbnRTdHlsZU1hcCA9IHtcbiAgICAgIG5vcm1hbDogXCJub3JtYWxcIixcbiAgICAgIGl0YWxpYzogXCJpdGFsaWNcIixcbiAgICAgIG9ibGlxdWU6IFwiaXRhbGljXCJcbiAgICB9O1xuICAgIFRleHRBbGlnbk1hcCA9IHtcbiAgICAgIGxlZnQ6IFwibGVmdFwiLFxuICAgICAgcmlnaHQ6IFwicmlnaHRcIixcbiAgICAgIGNlbnRlcjogXCJjZW50ZXJcIixcbiAgICAgIGp1c3RpZnk6IFwianVzdGlmeVwiXG4gICAgfTtcbiAgICBGbG9hdE1hcCA9IHtcbiAgICAgIG5vbmU6ICdub25lJyxcbiAgICAgIHJpZ2h0OiAncmlnaHQnLFxuICAgICAgbGVmdDogJ2xlZnQnXG4gICAgfTtcbiAgICBDbGVhck1hcCA9IHtcbiAgICAgIG5vbmU6ICdub25lJyxcbiAgICAgIGJvdGg6ICdib3RoJ1xuICAgIH07XG4gICAgVW5pdGVkTnVtYmVyTWFwID0ge1xuICAgICAgbm9ybWFsOiAxXG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBIVE1MLWZvcm1hdHRlZCB0ZXh0IGludG8gZm9ybWF0dGVkIFBERiB0ZXh0LlxuICAgICAqXG4gICAgICogTm90ZXM6XG4gICAgICogMjAxMi0wNy0xOFxuICAgICAqIFBsdWdpbiByZWxpZXMgb24gaGF2aW5nIGJyb3dzZXIsIERPTSBhcm91bmQuIFRoZSBIVE1MIGlzIHB1c2hlZCBpbnRvIGRvbSBhbmQgdHJhdmVyc2VkLlxuICAgICAqIFBsdWdpbiByZWxpZXMgb24galF1ZXJ5IGZvciBDU1MgZXh0cmFjdGlvbi5cbiAgICAgKiBUYXJnZXRpbmcgSFRNTCBvdXRwdXQgZnJvbSBNYXJrZG93biB0ZW1wbGF0aW5nLCB3aGljaCBpcyBhIHZlcnkgc2ltcGxlXG4gICAgICogbWFya3VwIC0gZGl2LCBzcGFuLCBlbSwgc3Ryb25nLCBwLiBObyBici1iYXNlZCBwYXJhZ3JhcGggc2VwYXJhdGlvbiBzdXBwb3J0ZWQgZXhwbGljaXRseSAoYnV0IHN0aWxsIG1heSB3b3JrLilcbiAgICAgKiBJbWFnZXMsIHRhYmxlcyBhcmUgTk9UIHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gSFRNTCB7U3RyaW5nfE9iamVjdH0gSFRNTC1mb3JtYXR0ZWQgdGV4dCwgb3IgcG9pbnRlciB0byBET00gZWxlbWVudCB0aGF0IGlzIHRvIGJlIHJlbmRlcmVkIGludG8gUERGLlxuICAgICAqIEBwYXJhbSB4IHtOdW1iZXJ9IHN0YXJ0aW5nIFggY29vcmRpbmF0ZSBpbiBqc1BERiBpbnN0YW5jZSdzIGRlY2xhcmVkIHVuaXRzLlxuICAgICAqIEBwYXJhbSB5IHtOdW1iZXJ9IHN0YXJ0aW5nIFkgY29vcmRpbmF0ZSBpbiBqc1BERiBpbnN0YW5jZSdzIGRlY2xhcmVkIHVuaXRzLlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyB7T2JqZWN0fSBBZGRpdGlvbmFsIC8gb3B0aW9uYWwgdmFyaWFibGVzIGNvbnRyb2xsaW5nIHBhcnNpbmcsIHJlbmRlcmluZy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBqc1BERiBpbnN0YW5jZVxuICAgICAqL1xuXG4gICAganNQREZBUEkuZnJvbUhUTUwgPSBmdW5jdGlvbiAoSFRNTCwgeCwgeSwgc2V0dGluZ3MsIGNhbGxiYWNrLCBtYXJnaW5zKSB7XG5cbiAgICAgIHRoaXMubWFyZ2luc19kb2MgPSBtYXJnaW5zIHx8IHtcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBib3R0b206IDBcbiAgICAgIH07XG4gICAgICBpZiAoIXNldHRpbmdzKSBzZXR0aW5ncyA9IHt9O1xuICAgICAgaWYgKCFzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMpIHNldHRpbmdzLmVsZW1lbnRIYW5kbGVycyA9IHt9O1xuICAgICAgcmV0dXJuIHByb2Nlc3ModGhpcywgSFRNTCwgaXNOYU4oeCkgPyA0IDogeCwgaXNOYU4oeSkgPyA0IDogeSwgc2V0dGluZ3MsIGNhbGxiYWNrKTtcbiAgICB9O1xuICB9KShqc3BkZi5qc1BERi5BUEkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvanNwZGZfcGx1Z2lucy9mcm9tX2h0bWwuanNcbi8vIG1vZHVsZSBpZCA9IDYzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=