gridviz 3.0.11 → 3.0.12
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/dist/gridviz.js +56 -73
- package/dist/gridviz.min.js +1 -1
- package/package.json +1 -1
- package/src/index.js +3 -2
- package/src/style/ImageStyle.js +48 -25
package/dist/gridviz.js
CHANGED
|
@@ -11911,11 +11911,14 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
11911
11911
|
/* harmony export */ ImageStyle: () => (/* binding */ ImageStyle)
|
|
11912
11912
|
/* harmony export */ });
|
|
11913
11913
|
/* harmony import */ var _core_Style_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/Style.js */ "./src/core/Style.js");
|
|
11914
|
+
/* harmony import */ var _utils_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/utils.js */ "./src/utils/utils.js");
|
|
11914
11915
|
//@ts-check
|
|
11915
11916
|
|
|
11916
11917
|
|
|
11917
11918
|
;
|
|
11918
11919
|
|
|
11920
|
+
|
|
11921
|
+
|
|
11919
11922
|
/**
|
|
11920
11923
|
* @module style
|
|
11921
11924
|
* @author Julien Gaffuri
|
|
@@ -11927,17 +11930,19 @@ class ImageStyle extends _core_Style_js__WEBPACK_IMPORTED_MODULE_0__.Style {
|
|
|
11927
11930
|
super(opts)
|
|
11928
11931
|
opts = opts || {}
|
|
11929
11932
|
|
|
11930
|
-
/** A function returning the image
|
|
11933
|
+
/** A function returning the image URL of a cell.
|
|
11931
11934
|
* @type {function(import('../core/Dataset.js').Cell, number, number, object):string} */
|
|
11932
|
-
this.
|
|
11933
|
-
|
|
11934
|
-
/** The dictionnary code -> image
|
|
11935
|
-
* @type {object} */
|
|
11936
|
-
this.images = opts.images || {}
|
|
11935
|
+
this.image = opts.image || (() => '') //(c,r,z,vs) => {}
|
|
11937
11936
|
|
|
11938
11937
|
/** The image size in ground meters
|
|
11939
11938
|
* @type {function(import('../core/Dataset.js').Cell, number, number, object):number} */
|
|
11940
11939
|
this.size = opts.size || ((cell, resolution) => resolution)
|
|
11940
|
+
|
|
11941
|
+
/** Dictionnary of preloaded images. url -> image
|
|
11942
|
+
* @private
|
|
11943
|
+
* @type {object} */
|
|
11944
|
+
this.cache = {}
|
|
11945
|
+
|
|
11941
11946
|
}
|
|
11942
11947
|
|
|
11943
11948
|
/**
|
|
@@ -11946,7 +11951,7 @@ class ImageStyle extends _core_Style_js__WEBPACK_IMPORTED_MODULE_0__.Style {
|
|
|
11946
11951
|
* @param {number} resolution
|
|
11947
11952
|
* @override
|
|
11948
11953
|
*/
|
|
11949
|
-
draw(cells, geoCanvas, resolution) {
|
|
11954
|
+
async draw(cells, geoCanvas, resolution) {
|
|
11950
11955
|
|
|
11951
11956
|
//
|
|
11952
11957
|
const z = geoCanvas.view.z,
|
|
@@ -11961,28 +11966,47 @@ class ImageStyle extends _core_Style_js__WEBPACK_IMPORTED_MODULE_0__.Style {
|
|
|
11961
11966
|
//
|
|
11962
11967
|
for (let cell of cells) {
|
|
11963
11968
|
|
|
11964
|
-
//get cell image
|
|
11965
|
-
const
|
|
11966
|
-
|
|
11967
|
-
//get image
|
|
11968
|
-
const image = this.images[code]
|
|
11969
|
-
if (!image) continue
|
|
11969
|
+
//get cell image url
|
|
11970
|
+
const url = this.image(cell, resolution, z, viewScale)
|
|
11971
|
+
if (!url) continue
|
|
11970
11972
|
|
|
11971
11973
|
//size and position values
|
|
11972
11974
|
let sizePix = this.size(cell, resolution, z, viewScale) / z
|
|
11973
11975
|
if (!sizePix) continue
|
|
11974
|
-
|
|
11975
|
-
|
|
11976
|
-
|
|
11977
|
-
|
|
11978
|
-
|
|
11979
|
-
|
|
11980
|
-
|
|
11981
|
-
|
|
11982
|
-
|
|
11983
|
-
|
|
11984
|
-
|
|
11985
|
-
|
|
11976
|
+
|
|
11977
|
+
//get image from cache
|
|
11978
|
+
const image = this.cache[url]
|
|
11979
|
+
|
|
11980
|
+
//loading, keep waiting
|
|
11981
|
+
if (image == "loading") return;
|
|
11982
|
+
|
|
11983
|
+
//no image: load it
|
|
11984
|
+
else if (!image) {
|
|
11985
|
+
//tag as loading
|
|
11986
|
+
this.cache[url] = "loading"
|
|
11987
|
+
|
|
11988
|
+
//define image
|
|
11989
|
+
const img = new Image()
|
|
11990
|
+
img.onload = () => {
|
|
11991
|
+
//store image data in cache and redraw
|
|
11992
|
+
this.cache[url] = img
|
|
11993
|
+
geoCanvas.redraw()
|
|
11994
|
+
}
|
|
11995
|
+
img.onerror = () => {
|
|
11996
|
+
//case when no image
|
|
11997
|
+
console.warn("Could not retrieve image from", url)
|
|
11998
|
+
}
|
|
11999
|
+
//set URL to launch the download
|
|
12000
|
+
img.src = url
|
|
12001
|
+
|
|
12002
|
+
} else {
|
|
12003
|
+
//draw image
|
|
12004
|
+
const d = (resolutionPix - sizePix) / 2
|
|
12005
|
+
try {
|
|
12006
|
+
geoCanvas.ctx.drawImage(image, geoCanvas.geoToPixX(cell.x) + d, geoCanvas.geoToPixY(cell.y) + d - resolutionPix, sizePix, sizePix)
|
|
12007
|
+
} catch (error) {
|
|
12008
|
+
console.error(error)
|
|
12009
|
+
}
|
|
11986
12010
|
}
|
|
11987
12011
|
|
|
11988
12012
|
}
|
|
@@ -14956,45 +14980,6 @@ class WebGLSquareColoringCatAdvanced {
|
|
|
14956
14980
|
}
|
|
14957
14981
|
|
|
14958
14982
|
|
|
14959
|
-
/***/ }),
|
|
14960
|
-
|
|
14961
|
-
/***/ "./src/utils/chernoff.js":
|
|
14962
|
-
/*!*******************************!*\
|
|
14963
|
-
!*** ./src/utils/chernoff.js ***!
|
|
14964
|
-
\*******************************/
|
|
14965
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
14966
|
-
|
|
14967
|
-
__webpack_require__.r(__webpack_exports__);
|
|
14968
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
14969
|
-
/* harmony export */ loadChernoffFacesImages: () => (/* binding */ loadChernoffFacesImages)
|
|
14970
|
-
/* harmony export */ });
|
|
14971
|
-
/* harmony import */ var _utils_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/utils.js */ "./src/utils/utils.js");
|
|
14972
|
-
//@ts-check
|
|
14973
|
-
|
|
14974
|
-
|
|
14975
|
-
;
|
|
14976
|
-
|
|
14977
|
-
//
|
|
14978
|
-
|
|
14979
|
-
/**
|
|
14980
|
-
* Load chernoff images
|
|
14981
|
-
* See for example: https://github.com/jgaffuri/chernoff-faces
|
|
14982
|
-
* @param {object} out
|
|
14983
|
-
* @param {string} baseURL
|
|
14984
|
-
* @param {function|undefined} callback
|
|
14985
|
-
* @returns
|
|
14986
|
-
*/
|
|
14987
|
-
async function loadChernoffFacesImages(out, baseURL, callback = undefined) {
|
|
14988
|
-
out = out || {}
|
|
14989
|
-
for (let s of ["f", "m"])
|
|
14990
|
-
for (let a of ["y", "m", "o"])
|
|
14991
|
-
for (let i = 0; i <= 2; i++)
|
|
14992
|
-
out[s + a + i] = await (0,_utils_utils_js__WEBPACK_IMPORTED_MODULE_0__.loadImage)(baseURL + (s + a + i) + ".png")
|
|
14993
|
-
if (callback) callback()
|
|
14994
|
-
return out
|
|
14995
|
-
}
|
|
14996
|
-
|
|
14997
|
-
|
|
14998
14983
|
/***/ }),
|
|
14999
14984
|
|
|
15000
14985
|
/***/ "./src/utils/scale.js":
|
|
@@ -15892,10 +15877,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
15892
15877
|
/* harmony export */ discreteColors: () => (/* reexport safe */ _utils_scale_js__WEBPACK_IMPORTED_MODULE_41__.discreteColors),
|
|
15893
15878
|
/* harmony export */ exponentialScale: () => (/* reexport safe */ _utils_stretching_js__WEBPACK_IMPORTED_MODULE_40__.exponentialScale),
|
|
15894
15879
|
/* harmony export */ getParameterByName: () => (/* binding */ getParameterByName),
|
|
15895
|
-
/* harmony export */ loadChernoffFacesImages: () => (/* reexport safe */ _utils_chernoff_js__WEBPACK_IMPORTED_MODULE_43__.loadChernoffFacesImages),
|
|
15896
|
-
/* harmony export */ loadImage: () => (/* reexport safe */ _utils_utils_js__WEBPACK_IMPORTED_MODULE_44__.loadImage),
|
|
15897
15880
|
/* harmony export */ logarithmicScale: () => (/* reexport safe */ _utils_stretching_js__WEBPACK_IMPORTED_MODULE_40__.logarithmicScale),
|
|
15898
|
-
/* harmony export */ nice: () => (/* reexport safe */
|
|
15881
|
+
/* harmony export */ nice: () => (/* reexport safe */ _utils_utils_js__WEBPACK_IMPORTED_MODULE_43__.nice),
|
|
15899
15882
|
/* harmony export */ orientationLegend: () => (/* reexport safe */ _legend_OrientationLegend_js__WEBPACK_IMPORTED_MODULE_38__.orientationLegend),
|
|
15900
15883
|
/* harmony export */ powerInverseScale: () => (/* reexport safe */ _utils_stretching_js__WEBPACK_IMPORTED_MODULE_40__.powerInverseScale),
|
|
15901
15884
|
/* harmony export */ powerScale: () => (/* reexport safe */ _utils_stretching_js__WEBPACK_IMPORTED_MODULE_40__.powerScale),
|
|
@@ -15954,9 +15937,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
15954
15937
|
/* harmony import */ var _utils_stretching_js__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./utils/stretching.js */ "./src/utils/stretching.js");
|
|
15955
15938
|
/* harmony import */ var _utils_scale_js__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./utils/scale.js */ "./src/utils/scale.js");
|
|
15956
15939
|
/* harmony import */ var _utils_trivariate_js__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./utils/trivariate.js */ "./src/utils/trivariate.js");
|
|
15957
|
-
/* harmony import */ var
|
|
15958
|
-
/* harmony import */ var
|
|
15959
|
-
/* harmony import */ var d3_format__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! d3-format */ "./node_modules/d3-format/src/defaultLocale.js");
|
|
15940
|
+
/* harmony import */ var _utils_utils_js__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./utils/utils.js */ "./src/utils/utils.js");
|
|
15941
|
+
/* harmony import */ var d3_format__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! d3-format */ "./node_modules/d3-format/src/defaultLocale.js");
|
|
15960
15942
|
//@ts-check
|
|
15961
15943
|
|
|
15962
15944
|
|
|
@@ -16015,15 +15997,16 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
16015
15997
|
|
|
16016
15998
|
|
|
16017
15999
|
|
|
16000
|
+
//export * from './utils/chernoff.js'
|
|
16018
16001
|
|
|
16019
|
-
|
|
16002
|
+
//loadImage
|
|
16020
16003
|
|
|
16021
16004
|
;
|
|
16022
16005
|
const getParameterByName = _core_GeoCanvas_js__WEBPACK_IMPORTED_MODULE_1__.GeoCanvas.getParameterByName
|
|
16023
16006
|
|
|
16024
16007
|
// set default d3 locale
|
|
16025
16008
|
;
|
|
16026
|
-
(0,
|
|
16009
|
+
(0,d3_format__WEBPACK_IMPORTED_MODULE_44__["default"])({
|
|
16027
16010
|
decimal: '.',
|
|
16028
16011
|
thousands: ' ',
|
|
16029
16012
|
grouping: [3],
|
|
@@ -16034,4 +16017,4 @@ const getParameterByName = _core_GeoCanvas_js__WEBPACK_IMPORTED_MODULE_1__.GeoCa
|
|
|
16034
16017
|
/******/ })()
|
|
16035
16018
|
;
|
|
16036
16019
|
});
|
|
16037
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUF5QixJQUFJO0FBQzdCLHdDQUF3QyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7QUFDMUQsd0NBQXdDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUMxRCwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSx3Q0FBd0MsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQzFELDBDQUEwQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJOztBQUVuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFtQyxlQUFlLFlBQVksU0FBUztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3hIb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDBCQUEwQiw4Q0FBTTtBQUN2QztBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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OztXQ1BBOzs7OztXQ0FBO1dBQ0E7V0FDQTtXQUNBLHVEQUF1RCxpQkFBaUI7V0FDeEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNZOztBQUVaO0FBQ21DO0FBQ1k7QUFDUjtBQUNBO0FBQ0k7QUFDOEI7O0FBRXpFO0FBQ2tEO0FBQ0o7QUFDRjs7QUFFNUM7QUFDb0U7QUFDaEI7QUFDRTtBQUNRO0FBQ1I7QUFDTjtBQUNJO0FBQ0o7QUFDaEQsV0FBVyxlQUFlO0FBQ3NDO0FBQ0o7QUFDUjtBQUNKO0FBQ3dCO0FBQ2dCO0FBQ3BDO0FBQ007QUFDRTtBQUNKO0FBQ047O0FBRWxEO0FBQ2dEO0FBQ1k7QUFDTTtBQUNJO0FBQ3BCO0FBQ0k7O0FBRXREO0FBQ3FEO0FBQ2dCO0FBQ0E7QUFDZ0U7QUFDakQ7QUFDckI7O0FBRS9ELFlBQVksdUJBQXVCO0FBQ0U7QUFDTDtBQUNLO0FBQ0Y7QUFDZTs7QUFFbEQsQ0FBK0M7QUFDeEMsMkJBQTJCLHlEQUFTOztBQUUzQztBQUNBLENBQStDO0FBQy9DLHNEQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkdml6L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9hc2NlbmRpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYmlzZWN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2Jpc2VjdG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2Rlc2NlbmRpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvZXh0ZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2dyZWF0ZXN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21heC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXhJbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9taW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWluSW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbnVtYmVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3Blcm11dGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVhbnRpbGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVpY2tzZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvc29ydC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9jb2xvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvbGFiLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL21hdGguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kaXNwYXRjaC9zcmMvZGlzcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9ub2RyYWcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9ub2V2ZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZHN2L3NyYy9jc3YuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kc3Yvc3JjL2Rzdi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvdHN2LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY3ViaWMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvZHN2LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL2pzb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvdGV4dC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZGVmYXVsdExvY2FsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZXhwb25lbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdERlY2ltYWwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdEdyb3VwLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXROdW1lcmFscy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0UHJlZml4QXV0by5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0Um91bmRlZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0U3BlY2lmaWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRUcmltLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRUeXBlcy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2xvY2FsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpcy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpc0Nsb3NlZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb2xvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9sYWIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3JnYi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2RlY29tcG9zZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL3BhcnNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3pvb20uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1yYW5kb20vc3JjL2RlZmF1bHRTb3VyY2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1yYW5kb20vc3JjL25vcm1hbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9pbml0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3F1YW50aWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9hcnJheS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NyZWF0b3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL21hdGNoZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlcy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvcG9pbnRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXBwZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXR0ci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NhbGwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jbGFzc2VkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xvbmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kYXRhLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGF0dW0uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kaXNwYXRjaC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VhY2guanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbXB0eS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VudGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZXhpdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2h0bWwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2luc2VydC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2l0ZXJhdG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vam9pbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2xvd2VyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2RlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29yZGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yYWlzZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JlbW92ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdEFsbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGRyZW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zaXplLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc29ydC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NwYXJzZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vdGV4dC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zb3VyY2VFdmVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvd2luZG93LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVvdXQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9hY3RpdmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2ludGVycnVwdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbnRlcnJ1cHQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vdHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0ci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0clR3ZWVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kZWxheS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZHVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2VWYXJ5aW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2ludGVycG9sYXRlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9tZXJnZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3JlbW92ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2NoZWR1bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0QWxsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zdHlsZVR3ZWVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3R3ZWVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9ldmVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvbm9ldmVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3pvb20uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9idXR0b24vQnV0dG9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvYnV0dG9uL0Z1bGxzY3JlZW5CdXR0b24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9idXR0b24vWm9vbUJ1dHRvbnMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL0RhdGFzZXQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL0RyYXdhYmxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9HZW9DYW52YXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL0xheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9MZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL01hcC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvTXVsdGlSZXNvbHV0aW9uRGF0YXNldC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL1Rvb2x0aXAuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9kYXRhc2V0L0NTVkdyaWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9kYXRhc2V0L0pTR3JpZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2RhdGFzZXQvVGlsZWRHcmlkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvQmFja2dyb3VuZExheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvQmFja2dyb3VuZExheWVySW1hZ2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9CYWNrZ3JvdW5kTGF5ZXJXTVMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9HZW9KU09OTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9HcmlkTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9MYWJlbExheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL0NvbG9yQ2F0ZWdvcnlMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvQ29sb3JEaXNjcmV0ZUxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9Db2xvckxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9PcmllbnRhdGlvbkxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9TaXplTGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL1RyaXZhcmlhdGVMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9Db21wb3NpdGlvblN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvRG90RGVuc2l0eVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvSW1hZ2VTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0lzb0ZlbmNlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9Kb3lQbG90U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9MZWdvU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9Nb3NhaWNTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL05pbmphU3RhclN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvUGlsbGFyU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TZWdtZW50U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TaGFwZUNvbG9yU2l6ZVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU2lkZUNhdGVnb3J5U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TaWRlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1NxdWFyZUNvbG9yV2ViR0xTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1N0cm9rZVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvVGFuYWthU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9UZXh0U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9UaW1lU2VyaWVzU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvY2hlcm5vZmYuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy9zY2FsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL3N0cmV0Y2hpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy90cml2YXJpYXRlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy93ZWJHTFV0aWxzLmpzIiwid2VicGFjazovL2dyaWR2aXovd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2dyaWR2aXovd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImdyaWR2aXpcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiZ3JpZHZpelwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsICgpID0+IHtcbnJldHVybiAiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA9PSBudWxsIHx8IGIgPT0gbnVsbCA/IE5hTiA6IGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcbmltcG9ydCBiaXNlY3RvciBmcm9tIFwiLi9iaXNlY3Rvci5qc1wiO1xuaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxuY29uc3QgYXNjZW5kaW5nQmlzZWN0ID0gYmlzZWN0b3IoYXNjZW5kaW5nKTtcbmV4cG9ydCBjb25zdCBiaXNlY3RSaWdodCA9IGFzY2VuZGluZ0Jpc2VjdC5yaWdodDtcbmV4cG9ydCBjb25zdCBiaXNlY3RMZWZ0ID0gYXNjZW5kaW5nQmlzZWN0LmxlZnQ7XG5leHBvcnQgY29uc3QgYmlzZWN0Q2VudGVyID0gYmlzZWN0b3IobnVtYmVyKS5jZW50ZXI7XG5leHBvcnQgZGVmYXVsdCBiaXNlY3RSaWdodDtcbiIsImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nLmpzXCI7XG5pbXBvcnQgZGVzY2VuZGluZyBmcm9tIFwiLi9kZXNjZW5kaW5nLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJpc2VjdG9yKGYpIHtcbiAgbGV0IGNvbXBhcmUxLCBjb21wYXJlMiwgZGVsdGE7XG5cbiAgLy8gSWYgYW4gYWNjZXNzb3IgaXMgc3BlY2lmaWVkLCBwcm9tb3RlIGl0IHRvIGEgY29tcGFyYXRvci4gSW4gdGhpcyBjYXNlIHdlXG4gIC8vIGNhbiB0ZXN0IHdoZXRoZXIgdGhlIHNlYXJjaCB2YWx1ZSBpcyAoc2VsZi0pIGNvbXBhcmFibGUuIFdlIGNhbuKAmXQgZG8gdGhpc1xuICAvLyBmb3IgYSBjb21wYXJhdG9yIChleGNlcHQgZm9yIHNwZWNpZmljLCBrbm93biBjb21wYXJhdG9ycykgYmVjYXVzZSB3ZSBjYW7igJl0XG4gIC8vIHRlbGwgaWYgdGhlIGNvbXBhcmF0b3IgaXMgc3ltbWV0cmljLCBhbmQgYW4gYXN5bW1ldHJpYyBjb21wYXJhdG9yIGNhbuKAmXQgYmVcbiAgLy8gdXNlZCB0byB0ZXN0IHdoZXRoZXIgYSBzaW5nbGUgdmFsdWUgaXMgY29tcGFyYWJsZS5cbiAgaWYgKGYubGVuZ3RoICE9PSAyKSB7XG4gICAgY29tcGFyZTEgPSBhc2NlbmRpbmc7XG4gICAgY29tcGFyZTIgPSAoZCwgeCkgPT4gYXNjZW5kaW5nKGYoZCksIHgpO1xuICAgIGRlbHRhID0gKGQsIHgpID0+IGYoZCkgLSB4O1xuICB9IGVsc2Uge1xuICAgIGNvbXBhcmUxID0gZiA9PT0gYXNjZW5kaW5nIHx8IGYgPT09IGRlc2NlbmRpbmcgPyBmIDogemVybztcbiAgICBjb21wYXJlMiA9IGY7XG4gICAgZGVsdGEgPSBmO1xuICB9XG5cbiAgZnVuY3Rpb24gbGVmdChhLCB4LCBsbyA9IDAsIGhpID0gYS5sZW5ndGgpIHtcbiAgICBpZiAobG8gPCBoaSkge1xuICAgICAgaWYgKGNvbXBhcmUxKHgsIHgpICE9PSAwKSByZXR1cm4gaGk7XG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgICAgaWYgKGNvbXBhcmUyKGFbbWlkXSwgeCkgPCAwKSBsbyA9IG1pZCArIDE7XG4gICAgICAgIGVsc2UgaGkgPSBtaWQ7XG4gICAgICB9IHdoaWxlIChsbyA8IGhpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvO1xuICB9XG5cbiAgZnVuY3Rpb24gcmlnaHQoYSwgeCwgbG8gPSAwLCBoaSA9IGEubGVuZ3RoKSB7XG4gICAgaWYgKGxvIDwgaGkpIHtcbiAgICAgIGlmIChjb21wYXJlMSh4LCB4KSAhPT0gMCkgcmV0dXJuIGhpO1xuICAgICAgZG8ge1xuICAgICAgICBjb25zdCBtaWQgPSAobG8gKyBoaSkgPj4+IDE7XG4gICAgICAgIGlmIChjb21wYXJlMihhW21pZF0sIHgpIDw9IDApIGxvID0gbWlkICsgMTtcbiAgICAgICAgZWxzZSBoaSA9IG1pZDtcbiAgICAgIH0gd2hpbGUgKGxvIDwgaGkpO1xuICAgIH1cbiAgICByZXR1cm4gbG87XG4gIH1cblxuICBmdW5jdGlvbiBjZW50ZXIoYSwgeCwgbG8gPSAwLCBoaSA9IGEubGVuZ3RoKSB7XG4gICAgY29uc3QgaSA9IGxlZnQoYSwgeCwgbG8sIGhpIC0gMSk7XG4gICAgcmV0dXJuIGkgPiBsbyAmJiBkZWx0YShhW2kgLSAxXSwgeCkgPiAtZGVsdGEoYVtpXSwgeCkgPyBpIC0gMSA6IGk7XG4gIH1cblxuICByZXR1cm4ge2xlZnQsIGNlbnRlciwgcmlnaHR9O1xufVxuXG5mdW5jdGlvbiB6ZXJvKCkge1xuICByZXR1cm4gMDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA9PSBudWxsIHx8IGIgPT0gbnVsbCA/IE5hTlxuICAgIDogYiA8IGEgPyAtMVxuICAgIDogYiA+IGEgPyAxXG4gICAgOiBiID49IGEgPyAwXG4gICAgOiBOYU47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHRlbnQodmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtaW47XG4gIGxldCBtYXg7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKG1pbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID49IHZhbHVlKSBtaW4gPSBtYXggPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAobWluID4gdmFsdWUpIG1pbiA9IHZhbHVlO1xuICAgICAgICAgIGlmIChtYXggPCB2YWx1ZSkgbWF4ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCkge1xuICAgICAgICBpZiAobWluID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPj0gdmFsdWUpIG1pbiA9IG1heCA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0gdmFsdWU7XG4gICAgICAgICAgaWYgKG1heCA8IHZhbHVlKSBtYXggPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gW21pbiwgbWF4XTtcbn1cbiIsImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdyZWF0ZXN0KHZhbHVlcywgY29tcGFyZSA9IGFzY2VuZGluZykge1xuICBsZXQgbWF4O1xuICBsZXQgZGVmaW5lZCA9IGZhbHNlO1xuICBpZiAoY29tcGFyZS5sZW5ndGggPT09IDEpIHtcbiAgICBsZXQgbWF4VmFsdWU7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlcykge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb21wYXJlKGVsZW1lbnQpO1xuICAgICAgaWYgKGRlZmluZWRcbiAgICAgICAgICA/IGFzY2VuZGluZyh2YWx1ZSwgbWF4VmFsdWUpID4gMFxuICAgICAgICAgIDogYXNjZW5kaW5nKHZhbHVlLCB2YWx1ZSkgPT09IDApIHtcbiAgICAgICAgbWF4ID0gZWxlbWVudDtcbiAgICAgICAgbWF4VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgZGVmaW5lZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoZGVmaW5lZFxuICAgICAgICAgID8gY29tcGFyZSh2YWx1ZSwgbWF4KSA+IDBcbiAgICAgICAgICA6IGNvbXBhcmUodmFsdWUsIHZhbHVlKSA9PT0gMCkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgICAgZGVmaW5lZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXgodmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtYXg7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXhJbmRleCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1heDtcbiAgbGV0IG1heEluZGV4ID0gLTE7XG4gIGxldCBpbmRleCA9IC0xO1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICsraW5kZXg7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZSwgbWF4SW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZSwgbWF4SW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heEluZGV4O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWluKHZhbHVlcywgdmFsdWVvZikge1xuICBsZXQgbWluO1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1pbiA+IHZhbHVlIHx8IChtaW4gPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1pbiA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1pbiA+IHZhbHVlIHx8IChtaW4gPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1pbiA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWluO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWluSW5kZXgodmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtaW47XG4gIGxldCBtaW5JbmRleCA9IC0xO1xuICBsZXQgaW5kZXggPSAtMTtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICArK2luZGV4O1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWUsIG1pbkluZGV4ID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWUsIG1pbkluZGV4ID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW5JbmRleDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG51bWJlcih4KSB7XG4gIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkge1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGVybXV0ZShzb3VyY2UsIGtleXMpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oa2V5cywga2V5ID0+IHNvdXJjZVtrZXldKTtcbn1cbiIsImltcG9ydCBtYXggZnJvbSBcIi4vbWF4LmpzXCI7XG5pbXBvcnQgbWF4SW5kZXggZnJvbSBcIi4vbWF4SW5kZXguanNcIjtcbmltcG9ydCBtaW4gZnJvbSBcIi4vbWluLmpzXCI7XG5pbXBvcnQgbWluSW5kZXggZnJvbSBcIi4vbWluSW5kZXguanNcIjtcbmltcG9ydCBxdWlja3NlbGVjdCBmcm9tIFwiLi9xdWlja3NlbGVjdC5qc1wiO1xuaW1wb3J0IG51bWJlciwge251bWJlcnN9IGZyb20gXCIuL251bWJlci5qc1wiO1xuaW1wb3J0IHthc2NlbmRpbmdEZWZpbmVkfSBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgZ3JlYXRlc3QgZnJvbSBcIi4vZ3JlYXRlc3QuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVhbnRpbGUodmFsdWVzLCBwLCB2YWx1ZW9mKSB7XG4gIHZhbHVlcyA9IEZsb2F0NjRBcnJheS5mcm9tKG51bWJlcnModmFsdWVzLCB2YWx1ZW9mKSk7XG4gIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSB8fCBpc05hTihwID0gK3ApKSByZXR1cm47XG4gIGlmIChwIDw9IDAgfHwgbiA8IDIpIHJldHVybiBtaW4odmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heCh2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9IG1heChxdWlja3NlbGVjdCh2YWx1ZXMsIGkwKS5zdWJhcnJheSgwLCBpMCArIDEpKSxcbiAgICAgIHZhbHVlMSA9IG1pbih2YWx1ZXMuc3ViYXJyYXkoaTAgKyAxKSk7XG4gIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVhbnRpbGVTb3J0ZWQodmFsdWVzLCBwLCB2YWx1ZW9mID0gbnVtYmVyKSB7XG4gIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSB8fCBpc05hTihwID0gK3ApKSByZXR1cm47XG4gIGlmIChwIDw9IDAgfHwgbiA8IDIpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbMF0sIDAsIHZhbHVlcyk7XG4gIGlmIChwID49IDEpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbbiAtIDFdLCBuIC0gMSwgdmFsdWVzKTtcbiAgdmFyIG4sXG4gICAgICBpID0gKG4gLSAxKSAqIHAsXG4gICAgICBpMCA9IE1hdGguZmxvb3IoaSksXG4gICAgICB2YWx1ZTAgPSArdmFsdWVvZih2YWx1ZXNbaTBdLCBpMCwgdmFsdWVzKSxcbiAgICAgIHZhbHVlMSA9ICt2YWx1ZW9mKHZhbHVlc1tpMCArIDFdLCBpMCArIDEsIHZhbHVlcyk7XG4gIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVhbnRpbGVJbmRleCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgbnVtYmVycyA9IEZsb2F0NjRBcnJheS5mcm9tKHZhbHVlcywgKF8sIGkpID0+IG51bWJlcih2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkpO1xuICBpZiAocCA8PSAwKSByZXR1cm4gbWluSW5kZXgobnVtYmVycyk7XG4gIGlmIChwID49IDEpIHJldHVybiBtYXhJbmRleChudW1iZXJzKTtcbiAgdmFyIG51bWJlcnMsXG4gICAgICBpbmRleCA9IFVpbnQzMkFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gaSksXG4gICAgICBqID0gbnVtYmVycy5sZW5ndGggLSAxLFxuICAgICAgaSA9IE1hdGguZmxvb3IoaiAqIHApO1xuICBxdWlja3NlbGVjdChpbmRleCwgaSwgMCwgaiwgKGksIGopID0+IGFzY2VuZGluZ0RlZmluZWQobnVtYmVyc1tpXSwgbnVtYmVyc1tqXSkpO1xuICBpID0gZ3JlYXRlc3QoaW5kZXguc3ViYXJyYXkoMCwgaSArIDEpLCAoaSkgPT4gbnVtYmVyc1tpXSk7XG4gIHJldHVybiBpID49IDAgPyBpIDogLTE7XG59XG4iLCJpbXBvcnQge2FzY2VuZGluZ0RlZmluZWQsIGNvbXBhcmVEZWZpbmVkfSBmcm9tIFwiLi9zb3J0LmpzXCI7XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3VybmVyL3F1aWNrc2VsZWN0XG4vLyBJU0MgbGljZW5zZSwgQ29weXJpZ2h0IDIwMTggVmxhZGltaXIgQWdhZm9ua2luLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVpY2tzZWxlY3QoYXJyYXksIGssIGxlZnQgPSAwLCByaWdodCA9IEluZmluaXR5LCBjb21wYXJlKSB7XG4gIGsgPSBNYXRoLmZsb29yKGspO1xuICBsZWZ0ID0gTWF0aC5mbG9vcihNYXRoLm1heCgwLCBsZWZ0KSk7XG4gIHJpZ2h0ID0gTWF0aC5mbG9vcihNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCByaWdodCkpO1xuXG4gIGlmICghKGxlZnQgPD0gayAmJiBrIDw9IHJpZ2h0KSkgcmV0dXJuIGFycmF5O1xuXG4gIGNvbXBhcmUgPSBjb21wYXJlID09PSB1bmRlZmluZWQgPyBhc2NlbmRpbmdEZWZpbmVkIDogY29tcGFyZURlZmluZWQoY29tcGFyZSk7XG5cbiAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgIGlmIChyaWdodCAtIGxlZnQgPiA2MDApIHtcbiAgICAgIGNvbnN0IG4gPSByaWdodCAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgbSA9IGsgLSBsZWZ0ICsgMTtcbiAgICAgIGNvbnN0IHogPSBNYXRoLmxvZyhuKTtcbiAgICAgIGNvbnN0IHMgPSAwLjUgKiBNYXRoLmV4cCgyICogeiAvIDMpO1xuICAgICAgY29uc3Qgc2QgPSAwLjUgKiBNYXRoLnNxcnQoeiAqIHMgKiAobiAtIHMpIC8gbikgKiAobSAtIG4gLyAyIDwgMCA/IC0xIDogMSk7XG4gICAgICBjb25zdCBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gbSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIGNvbnN0IG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gbSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICBxdWlja3NlbGVjdChhcnJheSwgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGNvbXBhcmUpO1xuICAgIH1cblxuICAgIGNvbnN0IHQgPSBhcnJheVtrXTtcbiAgICBsZXQgaSA9IGxlZnQ7XG4gICAgbGV0IGogPSByaWdodDtcblxuICAgIHN3YXAoYXJyYXksIGxlZnQsIGspO1xuICAgIGlmIChjb21wYXJlKGFycmF5W3JpZ2h0XSwgdCkgPiAwKSBzd2FwKGFycmF5LCBsZWZ0LCByaWdodCk7XG5cbiAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgIHN3YXAoYXJyYXksIGksIGopLCArK2ksIC0tajtcbiAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2ldLCB0KSA8IDApICsraTtcbiAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2pdLCB0KSA+IDApIC0tajtcbiAgICB9XG5cbiAgICBpZiAoY29tcGFyZShhcnJheVtsZWZ0XSwgdCkgPT09IDApIHN3YXAoYXJyYXksIGxlZnQsIGopO1xuICAgIGVsc2UgKytqLCBzd2FwKGFycmF5LCBqLCByaWdodCk7XG5cbiAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgaWYgKGsgPD0gaikgcmlnaHQgPSBqIC0gMTtcbiAgfVxuXG4gIHJldHVybiBhcnJheTtcbn1cblxuZnVuY3Rpb24gc3dhcChhcnJheSwgaSwgaikge1xuICBjb25zdCB0ID0gYXJyYXlbaV07XG4gIGFycmF5W2ldID0gYXJyYXlbal07XG4gIGFycmF5W2pdID0gdDtcbn1cbiIsImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nLmpzXCI7XG5pbXBvcnQgcGVybXV0ZSBmcm9tIFwiLi9wZXJtdXRlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNvcnQodmFsdWVzLCAuLi5GKSB7XG4gIGlmICh0eXBlb2YgdmFsdWVzW1N5bWJvbC5pdGVyYXRvcl0gIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcInZhbHVlcyBpcyBub3QgaXRlcmFibGVcIik7XG4gIHZhbHVlcyA9IEFycmF5LmZyb20odmFsdWVzKTtcbiAgbGV0IFtmXSA9IEY7XG4gIGlmICgoZiAmJiBmLmxlbmd0aCAhPT0gMikgfHwgRi5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgaW5kZXggPSBVaW50MzJBcnJheS5mcm9tKHZhbHVlcywgKGQsIGkpID0+IGkpO1xuICAgIGlmIChGLmxlbmd0aCA+IDEpIHtcbiAgICAgIEYgPSBGLm1hcChmID0+IHZhbHVlcy5tYXAoZikpO1xuICAgICAgaW5kZXguc29ydCgoaSwgaikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgRikge1xuICAgICAgICAgIGNvbnN0IGMgPSBhc2NlbmRpbmdEZWZpbmVkKGZbaV0sIGZbal0pO1xuICAgICAgICAgIGlmIChjKSByZXR1cm4gYztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGYgPSB2YWx1ZXMubWFwKGYpO1xuICAgICAgaW5kZXguc29ydCgoaSwgaikgPT4gYXNjZW5kaW5nRGVmaW5lZChmW2ldLCBmW2pdKSk7XG4gICAgfVxuICAgIHJldHVybiBwZXJtdXRlKHZhbHVlcywgaW5kZXgpO1xuICB9XG4gIHJldHVybiB2YWx1ZXMuc29ydChjb21wYXJlRGVmaW5lZChmKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlRGVmaW5lZChjb21wYXJlID0gYXNjZW5kaW5nKSB7XG4gIGlmIChjb21wYXJlID09PSBhc2NlbmRpbmcpIHJldHVybiBhc2NlbmRpbmdEZWZpbmVkO1xuICBpZiAodHlwZW9mIGNvbXBhcmUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNvbXBhcmUgaXMgbm90IGEgZnVuY3Rpb25cIik7XG4gIHJldHVybiAoYSwgYikgPT4ge1xuICAgIGNvbnN0IHggPSBjb21wYXJlKGEsIGIpO1xuICAgIGlmICh4IHx8IHggPT09IDApIHJldHVybiB4O1xuICAgIHJldHVybiAoY29tcGFyZShiLCBiKSA9PT0gMCkgLSAoY29tcGFyZShhLCBhKSA9PT0gMCk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc2NlbmRpbmdEZWZpbmVkKGEsIGIpIHtcbiAgcmV0dXJuIChhID09IG51bGwgfHwgIShhID49IGEpKSAtIChiID09IG51bGwgfHwgIShiID49IGIpKSB8fCAoYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApO1xufVxuIiwiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb2xvcigpIHt9XG5cbmV4cG9ydCB2YXIgZGFya2VyID0gMC43O1xuZXhwb3J0IHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7XG5cbnZhciByZUkgPSBcIlxcXFxzKihbKy1dP1xcXFxkKylcXFxccypcIixcbiAgICByZU4gPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPylcXFxccypcIixcbiAgICByZVAgPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPyklXFxcXHMqXCIsXG4gICAgcmVIZXggPSAvXiMoWzAtOWEtZl17Myw4fSkkLyxcbiAgICByZVJnYkludGVnZXIgPSBuZXcgUmVnRXhwKGBecmdiXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfVxcXFwpJGApLFxuICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JhXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfSwke3JlTn1cXFxcKSRgKSxcbiAgICByZVJnYmFQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYmFcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9LCR7cmVOfVxcXFwpJGApLFxuICAgIHJlSHNsUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xcXFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xhXFxcXCgke3JlTn0sJHtyZVB9LCR7cmVQfSwke3JlTn1cXFxcKSRgKTtcblxudmFyIG5hbWVkID0ge1xuICBhbGljZWJsdWU6IDB4ZjBmOGZmLFxuICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LFxuICBhcXVhOiAweDAwZmZmZixcbiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsXG4gIGF6dXJlOiAweGYwZmZmZixcbiAgYmVpZ2U6IDB4ZjVmNWRjLFxuICBiaXNxdWU6IDB4ZmZlNGM0LFxuICBibGFjazogMHgwMDAwMDAsXG4gIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCxcbiAgYmx1ZTogMHgwMDAwZmYsXG4gIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLFxuICBicm93bjogMHhhNTJhMmEsXG4gIGJ1cmx5d29vZDogMHhkZWI4ODcsXG4gIGNhZGV0Ymx1ZTogMHg1ZjllYTAsXG4gIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLFxuICBjaG9jb2xhdGU6IDB4ZDI2OTFlLFxuICBjb3JhbDogMHhmZjdmNTAsXG4gIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCxcbiAgY29ybnNpbGs6IDB4ZmZmOGRjLFxuICBjcmltc29uOiAweGRjMTQzYyxcbiAgY3lhbjogMHgwMGZmZmYsXG4gIGRhcmtibHVlOiAweDAwMDA4YixcbiAgZGFya2N5YW46IDB4MDA4YjhiLFxuICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYixcbiAgZGFya2dyYXk6IDB4YTlhOWE5LFxuICBkYXJrZ3JlZW46IDB4MDA2NDAwLFxuICBkYXJrZ3JleTogMHhhOWE5YTksXG4gIGRhcmtraGFraTogMHhiZGI3NmIsXG4gIGRhcmttYWdlbnRhOiAweDhiMDA4YixcbiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLFxuICBkYXJrb3JhbmdlOiAweGZmOGMwMCxcbiAgZGFya29yY2hpZDogMHg5OTMyY2MsXG4gIGRhcmtyZWQ6IDB4OGIwMDAwLFxuICBkYXJrc2FsbW9uOiAweGU5OTY3YSxcbiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZixcbiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsXG4gIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLFxuICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZixcbiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsXG4gIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLFxuICBkZWVwcGluazogMHhmZjE0OTMsXG4gIGRlZXBza3libHVlOiAweDAwYmZmZixcbiAgZGltZ3JheTogMHg2OTY5NjksXG4gIGRpbWdyZXk6IDB4Njk2OTY5LFxuICBkb2RnZXJibHVlOiAweDFlOTBmZixcbiAgZmlyZWJyaWNrOiAweGIyMjIyMixcbiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLFxuICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsXG4gIGZ1Y2hzaWE6IDB4ZmYwMGZmLFxuICBnYWluc2Jvcm86IDB4ZGNkY2RjLFxuICBnaG9zdHdoaXRlOiAweGY4ZjhmZixcbiAgZ29sZDogMHhmZmQ3MDAsXG4gIGdvbGRlbnJvZDogMHhkYWE1MjAsXG4gIGdyYXk6IDB4ODA4MDgwLFxuICBncmVlbjogMHgwMDgwMDAsXG4gIGdyZWVueWVsbG93OiAweGFkZmYyZixcbiAgZ3JleTogMHg4MDgwODAsXG4gIGhvbmV5ZGV3OiAweGYwZmZmMCxcbiAgaG90cGluazogMHhmZjY5YjQsXG4gIGluZGlhbnJlZDogMHhjZDVjNWMsXG4gIGluZGlnbzogMHg0YjAwODIsXG4gIGl2b3J5OiAweGZmZmZmMCxcbiAga2hha2k6IDB4ZjBlNjhjLFxuICBsYXZlbmRlcjogMHhlNmU2ZmEsXG4gIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LFxuICBsYXduZ3JlZW46IDB4N2NmYzAwLFxuICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLFxuICBsaWdodGJsdWU6IDB4YWRkOGU2LFxuICBsaWdodGNvcmFsOiAweGYwODA4MCxcbiAgbGlnaHRjeWFuOiAweGUwZmZmZixcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLFxuICBsaWdodGdyYXk6IDB4ZDNkM2QzLFxuICBsaWdodGdyZWVuOiAweDkwZWU5MCxcbiAgbGlnaHRncmV5OiAweGQzZDNkMyxcbiAgbGlnaHRwaW5rOiAweGZmYjZjMSxcbiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLFxuICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSxcbiAgbGlnaHRza3libHVlOiAweDg3Y2VmYSxcbiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LFxuICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksXG4gIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSxcbiAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLFxuICBsaW1lOiAweDAwZmYwMCxcbiAgbGltZWdyZWVuOiAweDMyY2QzMixcbiAgbGluZW46IDB4ZmFmMGU2LFxuICBtYWdlbnRhOiAweGZmMDBmZixcbiAgbWFyb29uOiAweDgwMDAwMCxcbiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsXG4gIG1lZGl1bWJsdWU6IDB4MDAwMGNkLFxuICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLFxuICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLFxuICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsXG4gIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsXG4gIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSxcbiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYyxcbiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSxcbiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCxcbiAgbWludGNyZWFtOiAweGY1ZmZmYSxcbiAgbWlzdHlyb3NlOiAweGZmZTRlMSxcbiAgbW9jY2FzaW46IDB4ZmZlNGI1LFxuICBuYXZham93aGl0ZTogMHhmZmRlYWQsXG4gIG5hdnk6IDB4MDAwMDgwLFxuICBvbGRsYWNlOiAweGZkZjVlNixcbiAgb2xpdmU6IDB4ODA4MDAwLFxuICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLFxuICBvcmFuZ2U6IDB4ZmZhNTAwLFxuICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLFxuICBvcmNoaWQ6IDB4ZGE3MGQ2LFxuICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSxcbiAgcGFsZWdyZWVuOiAweDk4ZmI5OCxcbiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsXG4gIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLFxuICBwYXBheWF3aGlwOiAweGZmZWZkNSxcbiAgcGVhY2hwdWZmOiAweGZmZGFiOSxcbiAgcGVydTogMHhjZDg1M2YsXG4gIHBpbms6IDB4ZmZjMGNiLFxuICBwbHVtOiAweGRkYTBkZCxcbiAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsXG4gIHB1cnBsZTogMHg4MDAwODAsXG4gIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LFxuICByZWQ6IDB4ZmYwMDAwLFxuICByb3N5YnJvd246IDB4YmM4ZjhmLFxuICByb3lhbGJsdWU6IDB4NDE2OWUxLFxuICBzYWRkbGVicm93bjogMHg4YjQ1MTMsXG4gIHNhbG1vbjogMHhmYTgwNzIsXG4gIHNhbmR5YnJvd246IDB4ZjRhNDYwLFxuICBzZWFncmVlbjogMHgyZThiNTcsXG4gIHNlYXNoZWxsOiAweGZmZjVlZSxcbiAgc2llbm5hOiAweGEwNTIyZCxcbiAgc2lsdmVyOiAweGMwYzBjMCxcbiAgc2t5Ymx1ZTogMHg4N2NlZWIsXG4gIHNsYXRlYmx1ZTogMHg2YTVhY2QsXG4gIHNsYXRlZ3JheTogMHg3MDgwOTAsXG4gIHNsYXRlZ3JleTogMHg3MDgwOTAsXG4gIHNub3c6IDB4ZmZmYWZhLFxuICBzcHJpbmdncmVlbjogMHgwMGZmN2YsXG4gIHN0ZWVsYmx1ZTogMHg0NjgyYjQsXG4gIHRhbjogMHhkMmI0OGMsXG4gIHRlYWw6IDB4MDA4MDgwLFxuICB0aGlzdGxlOiAweGQ4YmZkOCxcbiAgdG9tYXRvOiAweGZmNjM0NyxcbiAgdHVycXVvaXNlOiAweDQwZTBkMCxcbiAgdmlvbGV0OiAweGVlODJlZSxcbiAgd2hlYXQ6IDB4ZjVkZWIzLFxuICB3aGl0ZTogMHhmZmZmZmYsXG4gIHdoaXRlc21va2U6IDB4ZjVmNWY1LFxuICB5ZWxsb3c6IDB4ZmZmZjAwLFxuICB5ZWxsb3dncmVlbjogMHg5YWNkMzJcbn07XG5cbmRlZmluZShDb2xvciwgY29sb3IsIHtcbiAgY29weShjaGFubmVscykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7XG4gIH0sXG4gIGhleDogY29sb3JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IGNvbG9yX2Zvcm1hdEhleCxcbiAgZm9ybWF0SGV4ODogY29sb3JfZm9ybWF0SGV4OCxcbiAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsXG4gIGZvcm1hdFJnYjogY29sb3JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiXG59KTtcblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4OCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2woKSB7XG4gIHJldHVybiBoc2xDb252ZXJ0KHRoaXMpLmZvcm1hdEhzbCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRSZ2IoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHtcbiAgdmFyIG0sIGw7XG4gIGZvcm1hdCA9IChmb3JtYXQgKyBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChtID0gcmVIZXguZXhlYyhmb3JtYXQpKSA/IChsID0gbVsxXS5sZW5ndGgsIG0gPSBwYXJzZUludChtWzFdLCAxNiksIGwgPT09IDYgPyByZ2JuKG0pIC8vICNmZjAwMDBcbiAgICAgIDogbCA9PT0gMyA/IG5ldyBSZ2IoKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkgLy8gI2YwMFxuICAgICAgOiBsID09PSA4ID8gcmdiYShtID4+IDI0ICYgMHhmZiwgbSA+PiAxNiAmIDB4ZmYsIG0gPj4gOCAmIDB4ZmYsIChtICYgMHhmZikgLyAweGZmKSAvLyAjZmYwMDAwMDBcbiAgICAgIDogbCA9PT0gNCA/IHJnYmEoKG0gPj4gMTIgJiAweGYpIHwgKG0gPj4gOCAmIDB4ZjApLCAobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSkgLyAweGZmKSAvLyAjZjAwMFxuICAgICAgOiBudWxsKSAvLyBpbnZhbGlkIGhleFxuICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKVxuICAgICAgOiAobSA9IHJlUmdiUGVyY2VudC5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCAxKSAvLyByZ2IoMTAwJSwgMCUsIDAlKVxuICAgICAgOiAobSA9IHJlUmdiYUludGVnZXIuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSwgbVsyXSwgbVszXSwgbVs0XSkgLy8gcmdiYSgyNTUsIDAsIDAsIDEpXG4gICAgICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKVxuICAgICAgOiAobSA9IHJlSHNsUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCAxKSAvLyBoc2woMTIwLCA1MCUsIDUwJSlcbiAgICAgIDogKG0gPSByZUhzbGFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIG1bNF0pIC8vIGhzbGEoMTIwLCA1MCUsIDUwJSwgMSlcbiAgICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIDogZm9ybWF0ID09PSBcInRyYW5zcGFyZW50XCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApXG4gICAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJnYm4obikge1xuICByZXR1cm4gbmV3IFJnYihuID4+IDE2ICYgMHhmZiwgbiA+PiA4ICYgMHhmZiwgbiAmIDB4ZmYsIDEpO1xufVxuXG5mdW5jdGlvbiByZ2JhKHIsIGcsIGIsIGEpIHtcbiAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOO1xuICByZXR1cm4gbmV3IFJnYihyLCBnLCBiLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYkNvbnZlcnQobykge1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBSZ2I7XG4gIG8gPSBvLnJnYigpO1xuICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICB0aGlzLnIgPSArcjtcbiAgdGhpcy5nID0gK2c7XG4gIHRoaXMuYiA9ICtiO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY2xhbXAoKSB7XG4gICAgcmV0dXJuIG5ldyBSZ2IoY2xhbXBpKHRoaXMuciksIGNsYW1waSh0aGlzLmcpLCBjbGFtcGkodGhpcy5iKSwgY2xhbXBhKHRoaXMub3BhY2l0eSkpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmcgJiYgdGhpcy5nIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuYiAmJiB0aGlzLmIgPCAyNTUuNSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgaGV4OiByZ2JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhleDg6IHJnYl9mb3JtYXRIZXg4LFxuICBmb3JtYXRSZ2I6IHJnYl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiXG59KSk7XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfWA7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXg4KCkge1xuICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX0ke2hleCgoaXNOYU4odGhpcy5vcGFjaXR5KSA/IDEgOiB0aGlzLm9wYWNpdHkpICogMjU1KX1gO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0UmdiKCkge1xuICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gIHJldHVybiBgJHthID09PSAxID8gXCJyZ2IoXCIgOiBcInJnYmEoXCJ9JHtjbGFtcGkodGhpcy5yKX0sICR7Y2xhbXBpKHRoaXMuZyl9LCAke2NsYW1waSh0aGlzLmIpfSR7YSA9PT0gMSA/IFwiKVwiIDogYCwgJHthfSlgfWA7XG59XG5cbmZ1bmN0aW9uIGNsYW1wYShvcGFjaXR5KSB7XG4gIHJldHVybiBpc05hTihvcGFjaXR5KSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBvcGFjaXR5KSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1waSh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7XG59XG5cbmZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICB2YWx1ZSA9IGNsYW1waSh2YWx1ZSk7XG4gIHJldHVybiAodmFsdWUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyB2YWx1ZS50b1N0cmluZygxNik7XG59XG5cbmZ1bmN0aW9uIGhzbGEoaCwgcywgbCwgYSkge1xuICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47XG4gIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOO1xuICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbmV3IEhzbChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBIc2w7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbztcbiAgbyA9IG8ucmdiKCk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgaCA9IE5hTixcbiAgICAgIHMgPSBtYXggLSBtaW4sXG4gICAgICBsID0gKG1heCArIG1pbikgLyAyO1xuICBpZiAocykge1xuICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O1xuICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtcbiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7XG4gICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjtcbiAgICBoICo9IDYwO1xuICB9IGVsc2Uge1xuICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoO1xuICB9XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMucyA9ICtzO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCxcbiAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLFxuICAgICAgICBsID0gdGhpcy5sLFxuICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLFxuICAgICAgICBtMSA9IDIgKiBsIC0gbTI7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGgsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH0sXG4gIGNsYW1wKCkge1xuICAgIHJldHVybiBuZXcgSHNsKGNsYW1waCh0aGlzLmgpLCBjbGFtcHQodGhpcy5zKSwgY2xhbXB0KHRoaXMubCksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLmwgJiYgdGhpcy5sIDw9IDEpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGZvcm1hdEhzbCgpIHtcbiAgICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gICAgcmV0dXJuIGAke2EgPT09IDEgPyBcImhzbChcIiA6IFwiaHNsYShcIn0ke2NsYW1waCh0aGlzLmgpfSwgJHtjbGFtcHQodGhpcy5zKSAqIDEwMH0lLCAke2NsYW1wdCh0aGlzLmwpICogMTAwfSUke2EgPT09IDEgPyBcIilcIiA6IGAsICR7YX0pYH1gO1xuICB9XG59KSk7XG5cbmZ1bmN0aW9uIGNsYW1waCh2YWx1ZSkge1xuICB2YWx1ZSA9ICh2YWx1ZSB8fCAwKSAlIDM2MDtcbiAgcmV0dXJuIHZhbHVlIDwgMCA/IHZhbHVlICsgMzYwIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNsYW1wdCh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdmFsdWUgfHwgMCkpO1xufVxuXG4vKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovXG5mdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikge1xuICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwXG4gICAgICA6IGggPCAxODAgPyBtMlxuICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MFxuICAgICAgOiBtMSkgKiAyNTU7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3Rvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChwYXJlbnQsIGRlZmluaXRpb24pIHtcbiAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7XG4gIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRpb25ba2V5XTtcbiAgcmV0dXJuIHByb3RvdHlwZTtcbn1cbiIsImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZS5qc1wiO1xuaW1wb3J0IHtDb2xvciwgcmdiQ29udmVydCwgUmdifSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuaW1wb3J0IHtkZWdyZWVzLCByYWRpYW5zfSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbi8vIGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AbWJvc3RvY2svbGFiLWFuZC1yZ2JcbmNvbnN0IEsgPSAxOCxcbiAgICBYbiA9IDAuOTY0MjIsXG4gICAgWW4gPSAxLFxuICAgIFpuID0gMC44MjUyMSxcbiAgICB0MCA9IDQgLyAyOSxcbiAgICB0MSA9IDYgLyAyOSxcbiAgICB0MiA9IDMgKiB0MSAqIHQxLFxuICAgIHQzID0gdDEgKiB0MSAqIHQxO1xuXG5mdW5jdGlvbiBsYWJDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBMYWIpIHJldHVybiBuZXcgTGFiKG8ubCwgby5hLCBvLmIsIG8ub3BhY2l0eSk7XG4gIGlmIChvIGluc3RhbmNlb2YgSGNsKSByZXR1cm4gaGNsMmxhYihvKTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYikpIG8gPSByZ2JDb252ZXJ0KG8pO1xuICB2YXIgciA9IHJnYjJscmdiKG8uciksXG4gICAgICBnID0gcmdiMmxyZ2Ioby5nKSxcbiAgICAgIGIgPSByZ2IybHJnYihvLmIpLFxuICAgICAgeSA9IHh5ejJsYWIoKDAuMjIyNTA0NSAqIHIgKyAwLjcxNjg3ODYgKiBnICsgMC4wNjA2MTY5ICogYikgLyBZbiksIHgsIHo7XG4gIGlmIChyID09PSBnICYmIGcgPT09IGIpIHggPSB6ID0geTsgZWxzZSB7XG4gICAgeCA9IHh5ejJsYWIoKDAuNDM2MDc0NyAqIHIgKyAwLjM4NTA2NDkgKiBnICsgMC4xNDMwODA0ICogYikgLyBYbik7XG4gICAgeiA9IHh5ejJsYWIoKDAuMDEzOTMyMiAqIHIgKyAwLjA5NzEwNDUgKiBnICsgMC43MTQxNzMzICogYikgLyBabik7XG4gIH1cbiAgcmV0dXJuIG5ldyBMYWIoMTE2ICogeSAtIDE2LCA1MDAgKiAoeCAtIHkpLCAyMDAgKiAoeSAtIHopLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3JheShsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBuZXcgTGFiKGwsIDAsIDAsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGFiKGwsIGEsIGIsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBsYWJDb252ZXJ0KGwpIDogbmV3IExhYihsLCBhLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBMYWIobCwgYSwgYiwgb3BhY2l0eSkge1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5hID0gK2E7XG4gIHRoaXMuYiA9ICtiO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKExhYiwgbGFiLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIHJldHVybiBuZXcgTGFiKHRoaXMubCArIEsgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICByZXR1cm4gbmV3IExhYih0aGlzLmwgLSBLICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5hLCB0aGlzLmIsIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICB2YXIgeSA9ICh0aGlzLmwgKyAxNikgLyAxMTYsXG4gICAgICAgIHggPSBpc05hTih0aGlzLmEpID8geSA6IHkgKyB0aGlzLmEgLyA1MDAsXG4gICAgICAgIHogPSBpc05hTih0aGlzLmIpID8geSA6IHkgLSB0aGlzLmIgLyAyMDA7XG4gICAgeCA9IFhuICogbGFiMnh5eih4KTtcbiAgICB5ID0gWW4gKiBsYWIyeHl6KHkpO1xuICAgIHogPSBabiAqIGxhYjJ4eXooeik7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBscmdiMnJnYiggMy4xMzM4NTYxICogeCAtIDEuNjE2ODY2NyAqIHkgLSAwLjQ5MDYxNDYgKiB6KSxcbiAgICAgIGxyZ2IycmdiKC0wLjk3ODc2ODQgKiB4ICsgMS45MTYxNDE1ICogeSArIDAuMDMzNDU0MCAqIHopLFxuICAgICAgbHJnYjJyZ2IoIDAuMDcxOTQ1MyAqIHggLSAwLjIyODk5MTQgKiB5ICsgMS40MDUyNDI3ICogeiksXG4gICAgICB0aGlzLm9wYWNpdHlcbiAgICApO1xuICB9XG59KSk7XG5cbmZ1bmN0aW9uIHh5ejJsYWIodCkge1xuICByZXR1cm4gdCA+IHQzID8gTWF0aC5wb3codCwgMSAvIDMpIDogdCAvIHQyICsgdDA7XG59XG5cbmZ1bmN0aW9uIGxhYjJ4eXoodCkge1xuICByZXR1cm4gdCA+IHQxID8gdCAqIHQgKiB0IDogdDIgKiAodCAtIHQwKTtcbn1cblxuZnVuY3Rpb24gbHJnYjJyZ2IoeCkge1xuICByZXR1cm4gMjU1ICogKHggPD0gMC4wMDMxMzA4ID8gMTIuOTIgKiB4IDogMS4wNTUgKiBNYXRoLnBvdyh4LCAxIC8gMi40KSAtIDAuMDU1KTtcbn1cblxuZnVuY3Rpb24gcmdiMmxyZ2IoeCkge1xuICByZXR1cm4gKHggLz0gMjU1KSA8PSAwLjA0MDQ1ID8geCAvIDEyLjkyIDogTWF0aC5wb3coKHggKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbn1cblxuZnVuY3Rpb24gaGNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSGNsKSByZXR1cm4gbmV3IEhjbChvLmgsIG8uYywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgTGFiKSkgbyA9IGxhYkNvbnZlcnQobyk7XG4gIGlmIChvLmEgPT09IDAgJiYgby5iID09PSAwKSByZXR1cm4gbmV3IEhjbChOYU4sIDAgPCBvLmwgJiYgby5sIDwgMTAwID8gMCA6IE5hTiwgby5sLCBvLm9wYWNpdHkpO1xuICB2YXIgaCA9IE1hdGguYXRhbjIoby5iLCBvLmEpICogZGVncmVlcztcbiAgcmV0dXJuIG5ldyBIY2woaCA8IDAgPyBoICsgMzYwIDogaCwgTWF0aC5zcXJ0KG8uYSAqIG8uYSArIG8uYiAqIG8uYiksIG8ubCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxjaChsLCBjLCBoLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaGNsQ29udmVydChsKSA6IG5ldyBIY2woaCwgYywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGNsKGgsIGMsIGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoY2xDb252ZXJ0KGgpIDogbmV3IEhjbChoLCBjLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIY2woaCwgYywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5jID0gK2M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZnVuY3Rpb24gaGNsMmxhYihvKSB7XG4gIGlmIChpc05hTihvLmgpKSByZXR1cm4gbmV3IExhYihvLmwsIDAsIDAsIG8ub3BhY2l0eSk7XG4gIHZhciBoID0gby5oICogcmFkaWFucztcbiAgcmV0dXJuIG5ldyBMYWIoby5sLCBNYXRoLmNvcyhoKSAqIG8uYywgTWF0aC5zaW4oaCkgKiBvLmMsIG8ub3BhY2l0eSk7XG59XG5cbmRlZmluZShIY2wsIGhjbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICByZXR1cm4gbmV3IEhjbCh0aGlzLmgsIHRoaXMuYywgdGhpcy5sICsgSyAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgcmV0dXJuIG5ldyBIY2wodGhpcy5oLCB0aGlzLmMsIHRoaXMubCAtIEsgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2IoKSB7XG4gICAgcmV0dXJuIGhjbDJsYWIodGhpcykucmdiKCk7XG4gIH1cbn0pKTtcbiIsImV4cG9ydCBjb25zdCByYWRpYW5zID0gTWF0aC5QSSAvIDE4MDtcbmV4cG9ydCBjb25zdCBkZWdyZWVzID0gMTgwIC8gTWF0aC5QSTtcbiIsInZhciBub29wID0ge3ZhbHVlOiAoKSA9PiB7fX07XG5cbmZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF8gPSB7fSwgdDsgaSA8IG47ICsraSkge1xuICAgIGlmICghKHQgPSBhcmd1bWVudHNbaV0gKyBcIlwiKSB8fCAodCBpbiBfKSB8fCAvW1xccy5dLy50ZXN0KHQpKSB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIHR5cGU6IFwiICsgdCk7XG4gICAgX1t0XSA9IFtdO1xuICB9XG4gIHJldHVybiBuZXcgRGlzcGF0Y2goXyk7XG59XG5cbmZ1bmN0aW9uIERpc3BhdGNoKF8pIHtcbiAgdGhpcy5fID0gXztcbn1cblxuZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXModHlwZW5hbWVzLCB0eXBlcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgaWYgKHQgJiYgIXR5cGVzLmhhc093blByb3BlcnR5KHQpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdCk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbkRpc3BhdGNoLnByb3RvdHlwZSA9IGRpc3BhdGNoLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IERpc3BhdGNoLFxuICBvbjogZnVuY3Rpb24odHlwZW5hbWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF8gPSB0aGlzLl8sXG4gICAgICAgIFQgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIsIF8pLFxuICAgICAgICB0LFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIG4gPSBULmxlbmd0aDtcblxuICAgIC8vIElmIG5vIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgY2FsbGJhY2sgb2YgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgJiYgKHQgPSBnZXQoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIHR5cGUgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS5cbiAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBjYWxsYmFjazogXCIgKyBjYWxsYmFjayk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgX1t0XSA9IHNldChfW3RdLCB0eXBlbmFtZS5uYW1lLCBjYWxsYmFjayk7XG4gICAgICBlbHNlIGlmIChjYWxsYmFjayA9PSBudWxsKSBmb3IgKHQgaW4gXykgX1t0XSA9IHNldChfW3RdLCB0eXBlbmFtZS5uYW1lLCBudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY29weTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvcHkgPSB7fSwgXyA9IHRoaXMuXztcbiAgICBmb3IgKHZhciB0IGluIF8pIGNvcHlbdF0gPSBfW3RdLnNsaWNlKCk7XG4gICAgcmV0dXJuIG5ldyBEaXNwYXRjaChjb3B5KTtcbiAgfSxcbiAgY2FsbDogZnVuY3Rpb24odHlwZSwgdGhhdCkge1xuICAgIGlmICgobiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyKSA+IDApIGZvciAodmFyIGFyZ3MgPSBuZXcgQXJyYXkobiksIGkgPSAwLCBuLCB0OyBpIDwgbjsgKytpKSBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHR5cGUpO1xuICAgIGZvciAodCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHR5cGUsIHRoYXQsIGFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHR5cGUpO1xuICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdldCh0eXBlLCBuYW1lKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGgsIGM7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICByZXR1cm4gYy52YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0KHR5cGUsIG5hbWUsIGNhbGxiYWNrKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAodHlwZVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICB0eXBlW2ldID0gbm9vcCwgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSkuY29uY2F0KHR5cGUuc2xpY2UoaSArIDEpKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogY2FsbGJhY2t9KTtcbiAgcmV0dXJuIHR5cGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRpc3BhdGNoO1xuIiwiaW1wb3J0IHtzZWxlY3R9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBub2V2ZW50LCB7bm9ucGFzc2l2ZWNhcHR1cmV9IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmlldykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbm9ldmVudCwgbm9ucGFzc2l2ZWNhcHR1cmUpO1xuICBpZiAoXCJvbnNlbGVjdHN0YXJ0XCIgaW4gcm9vdCkge1xuICAgIHNlbGVjdGlvbi5vbihcInNlbGVjdHN0YXJ0LmRyYWdcIiwgbm9ldmVudCwgbm9ucGFzc2l2ZWNhcHR1cmUpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QuX19ub3NlbGVjdCA9IHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdDtcbiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSBcIm5vbmVcIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24geWVzZHJhZyh2aWV3LCBub2NsaWNrKSB7XG4gIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Qodmlldykub24oXCJkcmFnc3RhcnQuZHJhZ1wiLCBudWxsKTtcbiAgaWYgKG5vY2xpY2spIHtcbiAgICBzZWxlY3Rpb24ub24oXCJjbGljay5kcmFnXCIsIG5vZXZlbnQsIG5vbnBhc3NpdmVjYXB0dXJlKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxlY3Rpb24ub24oXCJjbGljay5kcmFnXCIsIG51bGwpOyB9LCAwKTtcbiAgfVxuICBpZiAoXCJvbnNlbGVjdHN0YXJ0XCIgaW4gcm9vdCkge1xuICAgIHNlbGVjdGlvbi5vbihcInNlbGVjdHN0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gcm9vdC5fX25vc2VsZWN0O1xuICAgIGRlbGV0ZSByb290Ll9fbm9zZWxlY3Q7XG4gIH1cbn1cbiIsIi8vIFRoZXNlIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG5vZXZlbnQgdG8gZW5zdXJlIHRoYXQgd2UgY2FuXG4vLyBwcmV2ZW50RGVmYXVsdCBvbiB0aGUgZXZlbnQuXG5leHBvcnQgY29uc3Qgbm9ucGFzc2l2ZSA9IHtwYXNzaXZlOiBmYWxzZX07XG5leHBvcnQgY29uc3Qgbm9ucGFzc2l2ZWNhcHR1cmUgPSB7Y2FwdHVyZTogdHJ1ZSwgcGFzc2l2ZTogZmFsc2V9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbihldmVudCkge1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG4iLCJpbXBvcnQgZHN2IGZyb20gXCIuL2Rzdi5qc1wiO1xuXG52YXIgY3N2ID0gZHN2KFwiLFwiKTtcblxuZXhwb3J0IHZhciBjc3ZQYXJzZSA9IGNzdi5wYXJzZTtcbmV4cG9ydCB2YXIgY3N2UGFyc2VSb3dzID0gY3N2LnBhcnNlUm93cztcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0ID0gY3N2LmZvcm1hdDtcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0Qm9keSA9IGNzdi5mb3JtYXRCb2R5O1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRSb3dzID0gY3N2LmZvcm1hdFJvd3M7XG5leHBvcnQgdmFyIGNzdkZvcm1hdFJvdyA9IGNzdi5mb3JtYXRSb3c7XG5leHBvcnQgdmFyIGNzdkZvcm1hdFZhbHVlID0gY3N2LmZvcm1hdFZhbHVlO1xuIiwidmFyIEVPTCA9IHt9LFxuICAgIEVPRiA9IHt9LFxuICAgIFFVT1RFID0gMzQsXG4gICAgTkVXTElORSA9IDEwLFxuICAgIFJFVFVSTiA9IDEzO1xuXG5mdW5jdGlvbiBvYmplY3RDb252ZXJ0ZXIoY29sdW1ucykge1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKFwiZFwiLCBcInJldHVybiB7XCIgKyBjb2x1bW5zLm1hcChmdW5jdGlvbihuYW1lLCBpKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5hbWUpICsgXCI6IGRbXCIgKyBpICsgXCJdIHx8IFxcXCJcXFwiXCI7XG4gIH0pLmpvaW4oXCIsXCIpICsgXCJ9XCIpO1xufVxuXG5mdW5jdGlvbiBjdXN0b21Db252ZXJ0ZXIoY29sdW1ucywgZikge1xuICB2YXIgb2JqZWN0ID0gb2JqZWN0Q29udmVydGVyKGNvbHVtbnMpO1xuICByZXR1cm4gZnVuY3Rpb24ocm93LCBpKSB7XG4gICAgcmV0dXJuIGYob2JqZWN0KHJvdyksIGksIGNvbHVtbnMpO1xuICB9O1xufVxuXG4vLyBDb21wdXRlIHVuaXF1ZSBjb2x1bW5zIGluIG9yZGVyIG9mIGRpc2NvdmVyeS5cbmZ1bmN0aW9uIGluZmVyQ29sdW1ucyhyb3dzKSB7XG4gIHZhciBjb2x1bW5TZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgY29sdW1ucyA9IFtdO1xuXG4gIHJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3cpIHtcbiAgICBmb3IgKHZhciBjb2x1bW4gaW4gcm93KSB7XG4gICAgICBpZiAoIShjb2x1bW4gaW4gY29sdW1uU2V0KSkge1xuICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uU2V0W2NvbHVtbl0gPSBjb2x1bW4pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGNvbHVtbnM7XG59XG5cbmZ1bmN0aW9uIHBhZCh2YWx1ZSwgd2lkdGgpIHtcbiAgdmFyIHMgPSB2YWx1ZSArIFwiXCIsIGxlbmd0aCA9IHMubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKDApICsgcyA6IHM7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFllYXIoeWVhcikge1xuICByZXR1cm4geWVhciA8IDAgPyBcIi1cIiArIHBhZCgteWVhciwgNilcbiAgICA6IHllYXIgPiA5OTk5ID8gXCIrXCIgKyBwYWQoeWVhciwgNilcbiAgICA6IHBhZCh5ZWFyLCA0KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlKSB7XG4gIHZhciBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKSxcbiAgICAgIG1pbnV0ZXMgPSBkYXRlLmdldFVUQ01pbnV0ZXMoKSxcbiAgICAgIHNlY29uZHMgPSBkYXRlLmdldFVUQ1NlY29uZHMoKSxcbiAgICAgIG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0VVRDTWlsbGlzZWNvbmRzKCk7XG4gIHJldHVybiBpc05hTihkYXRlKSA/IFwiSW52YWxpZCBEYXRlXCJcbiAgICAgIDogZm9ybWF0WWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCksIDQpICsgXCItXCIgKyBwYWQoZGF0ZS5nZXRVVENNb250aCgpICsgMSwgMikgKyBcIi1cIiArIHBhZChkYXRlLmdldFVUQ0RhdGUoKSwgMilcbiAgICAgICsgKG1pbGxpc2Vjb25kcyA/IFwiVFwiICsgcGFkKGhvdXJzLCAyKSArIFwiOlwiICsgcGFkKG1pbnV0ZXMsIDIpICsgXCI6XCIgKyBwYWQoc2Vjb25kcywgMikgKyBcIi5cIiArIHBhZChtaWxsaXNlY29uZHMsIDMpICsgXCJaXCJcbiAgICAgIDogc2Vjb25kcyA/IFwiVFwiICsgcGFkKGhvdXJzLCAyKSArIFwiOlwiICsgcGFkKG1pbnV0ZXMsIDIpICsgXCI6XCIgKyBwYWQoc2Vjb25kcywgMikgKyBcIlpcIlxuICAgICAgOiBtaW51dGVzIHx8IGhvdXJzID8gXCJUXCIgKyBwYWQoaG91cnMsIDIpICsgXCI6XCIgKyBwYWQobWludXRlcywgMikgKyBcIlpcIlxuICAgICAgOiBcIlwiKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVsaW1pdGVyKSB7XG4gIHZhciByZUZvcm1hdCA9IG5ldyBSZWdFeHAoXCJbXFxcIlwiICsgZGVsaW1pdGVyICsgXCJcXG5cXHJdXCIpLFxuICAgICAgREVMSU1JVEVSID0gZGVsaW1pdGVyLmNoYXJDb2RlQXQoMCk7XG5cbiAgZnVuY3Rpb24gcGFyc2UodGV4dCwgZikge1xuICAgIHZhciBjb252ZXJ0LCBjb2x1bW5zLCByb3dzID0gcGFyc2VSb3dzKHRleHQsIGZ1bmN0aW9uKHJvdywgaSkge1xuICAgICAgaWYgKGNvbnZlcnQpIHJldHVybiBjb252ZXJ0KHJvdywgaSAtIDEpO1xuICAgICAgY29sdW1ucyA9IHJvdywgY29udmVydCA9IGYgPyBjdXN0b21Db252ZXJ0ZXIocm93LCBmKSA6IG9iamVjdENvbnZlcnRlcihyb3cpO1xuICAgIH0pO1xuICAgIHJvd3MuY29sdW1ucyA9IGNvbHVtbnMgfHwgW107XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVJvd3ModGV4dCwgZikge1xuICAgIHZhciByb3dzID0gW10sIC8vIG91dHB1dCByb3dzXG4gICAgICAgIE4gPSB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgSSA9IDAsIC8vIGN1cnJlbnQgY2hhcmFjdGVyIGluZGV4XG4gICAgICAgIG4gPSAwLCAvLyBjdXJyZW50IGxpbmUgbnVtYmVyXG4gICAgICAgIHQsIC8vIGN1cnJlbnQgdG9rZW5cbiAgICAgICAgZW9mID0gTiA8PSAwLCAvLyBjdXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPRj9cbiAgICAgICAgZW9sID0gZmFsc2U7IC8vIGN1cnJlbnQgdG9rZW4gZm9sbG93ZWQgYnkgRU9MP1xuXG4gICAgLy8gU3RyaXAgdGhlIHRyYWlsaW5nIG5ld2xpbmUuXG4gICAgaWYgKHRleHQuY2hhckNvZGVBdChOIC0gMSkgPT09IE5FV0xJTkUpIC0tTjtcbiAgICBpZiAodGV4dC5jaGFyQ29kZUF0KE4gLSAxKSA9PT0gUkVUVVJOKSAtLU47XG5cbiAgICBmdW5jdGlvbiB0b2tlbigpIHtcbiAgICAgIGlmIChlb2YpIHJldHVybiBFT0Y7XG4gICAgICBpZiAoZW9sKSByZXR1cm4gZW9sID0gZmFsc2UsIEVPTDtcblxuICAgICAgLy8gVW5lc2NhcGUgcXVvdGVzLlxuICAgICAgdmFyIGksIGogPSBJLCBjO1xuICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChqKSA9PT0gUVVPVEUpIHtcbiAgICAgICAgd2hpbGUgKEkrKyA8IE4gJiYgdGV4dC5jaGFyQ29kZUF0KEkpICE9PSBRVU9URSB8fCB0ZXh0LmNoYXJDb2RlQXQoKytJKSA9PT0gUVVPVEUpO1xuICAgICAgICBpZiAoKGkgPSBJKSA+PSBOKSBlb2YgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgoYyA9IHRleHQuY2hhckNvZGVBdChJKyspKSA9PT0gTkVXTElORSkgZW9sID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoYyA9PT0gUkVUVVJOKSB7IGVvbCA9IHRydWU7IGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IE5FV0xJTkUpICsrSTsgfVxuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqICsgMSwgaSAtIDEpLnJlcGxhY2UoL1wiXCIvZywgXCJcXFwiXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBGaW5kIG5leHQgZGVsaW1pdGVyIG9yIG5ld2xpbmUuXG4gICAgICB3aGlsZSAoSSA8IE4pIHtcbiAgICAgICAgaWYgKChjID0gdGV4dC5jaGFyQ29kZUF0KGkgPSBJKyspKSA9PT0gTkVXTElORSkgZW9sID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoYyA9PT0gUkVUVVJOKSB7IGVvbCA9IHRydWU7IGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IE5FV0xJTkUpICsrSTsgfVxuICAgICAgICBlbHNlIGlmIChjICE9PSBERUxJTUlURVIpIGNvbnRpbnVlO1xuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqLCBpKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIGxhc3QgdG9rZW4gYmVmb3JlIEVPRi5cbiAgICAgIHJldHVybiBlb2YgPSB0cnVlLCB0ZXh0LnNsaWNlKGosIE4pO1xuICAgIH1cblxuICAgIHdoaWxlICgodCA9IHRva2VuKCkpICE9PSBFT0YpIHtcbiAgICAgIHZhciByb3cgPSBbXTtcbiAgICAgIHdoaWxlICh0ICE9PSBFT0wgJiYgdCAhPT0gRU9GKSByb3cucHVzaCh0KSwgdCA9IHRva2VuKCk7XG4gICAgICBpZiAoZiAmJiAocm93ID0gZihyb3csIG4rKykpID09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgcm93cy5wdXNoKHJvdyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpIHtcbiAgICByZXR1cm4gcm93cy5tYXAoZnVuY3Rpb24ocm93KSB7XG4gICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVuY3Rpb24oY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXRWYWx1ZShyb3dbY29sdW1uXSk7XG4gICAgICB9KS5qb2luKGRlbGltaXRlcik7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXQocm93cywgY29sdW1ucykge1xuICAgIGlmIChjb2x1bW5zID09IG51bGwpIGNvbHVtbnMgPSBpbmZlckNvbHVtbnMocm93cyk7XG4gICAgcmV0dXJuIFtjb2x1bW5zLm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpXS5jb25jYXQocHJlZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKSkuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdEJvZHkocm93cywgY29sdW1ucykge1xuICAgIGlmIChjb2x1bW5zID09IG51bGwpIGNvbHVtbnMgPSBpbmZlckNvbHVtbnMocm93cyk7XG4gICAgcmV0dXJuIHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFJvd3Mocm93cykge1xuICAgIHJldHVybiByb3dzLm1hcChmb3JtYXRSb3cpLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRSb3cocm93KSB7XG4gICAgcmV0dXJuIHJvdy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiXG4gICAgICAgIDogdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gZm9ybWF0RGF0ZSh2YWx1ZSlcbiAgICAgICAgOiByZUZvcm1hdC50ZXN0KHZhbHVlICs9IFwiXCIpID8gXCJcXFwiXCIgKyB2YWx1ZS5yZXBsYWNlKC9cIi9nLCBcIlxcXCJcXFwiXCIpICsgXCJcXFwiXCJcbiAgICAgICAgOiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGFyc2U6IHBhcnNlLFxuICAgIHBhcnNlUm93czogcGFyc2VSb3dzLFxuICAgIGZvcm1hdDogZm9ybWF0LFxuICAgIGZvcm1hdEJvZHk6IGZvcm1hdEJvZHksXG4gICAgZm9ybWF0Um93czogZm9ybWF0Um93cyxcbiAgICBmb3JtYXRSb3c6IGZvcm1hdFJvdyxcbiAgICBmb3JtYXRWYWx1ZTogZm9ybWF0VmFsdWVcbiAgfTtcbn1cbiIsImltcG9ydCBkc3YgZnJvbSBcIi4vZHN2LmpzXCI7XG5cbnZhciB0c3YgPSBkc3YoXCJcXHRcIik7XG5cbmV4cG9ydCB2YXIgdHN2UGFyc2UgPSB0c3YucGFyc2U7XG5leHBvcnQgdmFyIHRzdlBhcnNlUm93cyA9IHRzdi5wYXJzZVJvd3M7XG5leHBvcnQgdmFyIHRzdkZvcm1hdCA9IHRzdi5mb3JtYXQ7XG5leHBvcnQgdmFyIHRzdkZvcm1hdEJvZHkgPSB0c3YuZm9ybWF0Qm9keTtcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0Um93cyA9IHRzdi5mb3JtYXRSb3dzO1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRSb3cgPSB0c3YuZm9ybWF0Um93O1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRWYWx1ZSA9IHRzdi5mb3JtYXRWYWx1ZTtcbiIsImV4cG9ydCBmdW5jdGlvbiBjdWJpY0luKHQpIHtcbiAgcmV0dXJuIHQgKiB0ICogdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljT3V0KHQpIHtcbiAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyO1xufVxuIiwiaW1wb3J0IHtjc3ZQYXJzZSwgZHN2Rm9ybWF0LCB0c3ZQYXJzZX0gZnJvbSBcImQzLWRzdlwiO1xuaW1wb3J0IHRleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuXG5mdW5jdGlvbiBkc3ZQYXJzZShwYXJzZSkge1xuICByZXR1cm4gZnVuY3Rpb24oaW5wdXQsIGluaXQsIHJvdykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBpbml0ID09PSBcImZ1bmN0aW9uXCIpIHJvdyA9IGluaXQsIGluaXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRleHQoaW5wdXQsIGluaXQpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBwYXJzZShyZXNwb25zZSwgcm93KTtcbiAgICB9KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZHN2KGRlbGltaXRlciwgaW5wdXQsIGluaXQsIHJvdykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2YgaW5pdCA9PT0gXCJmdW5jdGlvblwiKSByb3cgPSBpbml0LCBpbml0ID0gdW5kZWZpbmVkO1xuICB2YXIgZm9ybWF0ID0gZHN2Rm9ybWF0KGRlbGltaXRlcik7XG4gIHJldHVybiB0ZXh0KGlucHV0LCBpbml0KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGZvcm1hdC5wYXJzZShyZXNwb25zZSwgcm93KTtcbiAgfSk7XG59XG5cbmV4cG9ydCB2YXIgY3N2ID0gZHN2UGFyc2UoY3N2UGFyc2UpO1xuZXhwb3J0IHZhciB0c3YgPSBkc3ZQYXJzZSh0c3ZQYXJzZSk7XG4iLCJmdW5jdGlvbiByZXNwb25zZUpzb24ocmVzcG9uc2UpIHtcbiAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1cyArIFwiIFwiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCB8fCByZXNwb25zZS5zdGF0dXMgPT09IDIwNSkgcmV0dXJuO1xuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpLnRoZW4ocmVzcG9uc2VKc29uKTtcbn1cbiIsImZ1bmN0aW9uIHJlc3BvbnNlVGV4dChyZXNwb25zZSkge1xuICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzICsgXCIgXCIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5wdXQsIGluaXQpIHtcbiAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KS50aGVuKHJlc3BvbnNlVGV4dCk7XG59XG4iLCJpbXBvcnQgZm9ybWF0TG9jYWxlIGZyb20gXCIuL2xvY2FsZS5qc1wiO1xuXG52YXIgbG9jYWxlO1xuZXhwb3J0IHZhciBmb3JtYXQ7XG5leHBvcnQgdmFyIGZvcm1hdFByZWZpeDtcblxuZGVmYXVsdExvY2FsZSh7XG4gIHRob3VzYW5kczogXCIsXCIsXG4gIGdyb3VwaW5nOiBbM10sXG4gIGN1cnJlbmN5OiBbXCIkXCIsIFwiXCJdXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7XG4gIGxvY2FsZSA9IGZvcm1hdExvY2FsZShkZWZpbml0aW9uKTtcbiAgZm9ybWF0ID0gbG9jYWxlLmZvcm1hdDtcbiAgZm9ybWF0UHJlZml4ID0gbG9jYWxlLmZvcm1hdFByZWZpeDtcbiAgcmV0dXJuIGxvY2FsZTtcbn1cbiIsImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHggPSBmb3JtYXREZWNpbWFsUGFydHMoTWF0aC5hYnMoeCkpLCB4ID8geFsxXSA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHggPSBNYXRoLnJvdW5kKHgpKSA+PSAxZTIxXG4gICAgICA/IHgudG9Mb2NhbGVTdHJpbmcoXCJlblwiKS5yZXBsYWNlKC8sL2csIFwiXCIpXG4gICAgICA6IHgudG9TdHJpbmcoMTApO1xufVxuXG4vLyBDb21wdXRlcyB0aGUgZGVjaW1hbCBjb2VmZmljaWVudCBhbmQgZXhwb25lbnQgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgeCB3aXRoXG4vLyBzaWduaWZpY2FudCBkaWdpdHMgcCwgd2hlcmUgeCBpcyBwb3NpdGl2ZSBhbmQgcCBpcyBpbiBbMSwgMjFdIG9yIHVuZGVmaW5lZC5cbi8vIEZvciBleGFtcGxlLCBmb3JtYXREZWNpbWFsUGFydHMoMS4yMykgcmV0dXJucyBbXCIxMjNcIiwgMF0uXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApIHtcbiAgaWYgKChpID0gKHggPSBwID8geC50b0V4cG9uZW50aWFsKHAgLSAxKSA6IHgudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKFwiZVwiKSkgPCAwKSByZXR1cm4gbnVsbDsgLy8gTmFOLCDCsUluZmluaXR5XG4gIHZhciBpLCBjb2VmZmljaWVudCA9IHguc2xpY2UoMCwgaSk7XG5cbiAgLy8gVGhlIHN0cmluZyByZXR1cm5lZCBieSB0b0V4cG9uZW50aWFsIGVpdGhlciBoYXMgdGhlIGZvcm0gXFxkXFwuXFxkK2VbLStdXFxkK1xuICAvLyAoZS5nLiwgMS4yZSszKSBvciB0aGUgZm9ybSBcXGRlWy0rXVxcZCsgKGUuZy4sIDFlKzMpLlxuICByZXR1cm4gW1xuICAgIGNvZWZmaWNpZW50Lmxlbmd0aCA+IDEgPyBjb2VmZmljaWVudFswXSArIGNvZWZmaWNpZW50LnNsaWNlKDIpIDogY29lZmZpY2llbnQsXG4gICAgK3guc2xpY2UoaSArIDEpXG4gIF07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihncm91cGluZywgdGhvdXNhbmRzKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgd2lkdGgpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aCxcbiAgICAgICAgdCA9IFtdLFxuICAgICAgICBqID0gMCxcbiAgICAgICAgZyA9IGdyb3VwaW5nWzBdLFxuICAgICAgICBsZW5ndGggPSAwO1xuXG4gICAgd2hpbGUgKGkgPiAwICYmIGcgPiAwKSB7XG4gICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEsIHdpZHRoIC0gbGVuZ3RoKTtcbiAgICAgIHQucHVzaCh2YWx1ZS5zdWJzdHJpbmcoaSAtPSBnLCBpICsgZykpO1xuICAgICAgaWYgKChsZW5ndGggKz0gZyArIDEpID4gd2lkdGgpIGJyZWFrO1xuICAgICAgZyA9IGdyb3VwaW5nW2ogPSAoaiArIDEpICUgZ3JvdXBpbmcubGVuZ3RoXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdC5yZXZlcnNlKCkuam9pbih0aG91c2FuZHMpO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obnVtZXJhbHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1swLTldL2csIGZ1bmN0aW9uKGkpIHtcbiAgICAgIHJldHVybiBudW1lcmFsc1sraV07XG4gICAgfSk7XG4gIH07XG59XG4iLCJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgdmFyIHByZWZpeEV4cG9uZW50O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCBwKSB7XG4gIHZhciBkID0gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApO1xuICBpZiAoIWQpIHJldHVybiB4ICsgXCJcIjtcbiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSxcbiAgICAgIGV4cG9uZW50ID0gZFsxXSxcbiAgICAgIGkgPSBleHBvbmVudCAtIChwcmVmaXhFeHBvbmVudCA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50IC8gMykpKSAqIDMpICsgMSxcbiAgICAgIG4gPSBjb2VmZmljaWVudC5sZW5ndGg7XG4gIHJldHVybiBpID09PSBuID8gY29lZmZpY2llbnRcbiAgICAgIDogaSA+IG4gPyBjb2VmZmljaWVudCArIG5ldyBBcnJheShpIC0gbiArIDEpLmpvaW4oXCIwXCIpXG4gICAgICA6IGkgPiAwID8gY29lZmZpY2llbnQuc2xpY2UoMCwgaSkgKyBcIi5cIiArIGNvZWZmaWNpZW50LnNsaWNlKGkpXG4gICAgICA6IFwiMC5cIiArIG5ldyBBcnJheSgxIC0gaSkuam9pbihcIjBcIikgKyBmb3JtYXREZWNpbWFsUGFydHMoeCwgTWF0aC5tYXgoMCwgcCArIGkgLSAxKSlbMF07IC8vIGxlc3MgdGhhbiAxeSFcbn1cbiIsImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHApIHtcbiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCk7XG4gIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLFxuICAgICAgZXhwb25lbnQgPSBkWzFdO1xuICByZXR1cm4gZXhwb25lbnQgPCAwID8gXCIwLlwiICsgbmV3IEFycmF5KC1leHBvbmVudCkuam9pbihcIjBcIikgKyBjb2VmZmljaWVudFxuICAgICAgOiBjb2VmZmljaWVudC5sZW5ndGggPiBleHBvbmVudCArIDEgPyBjb2VmZmljaWVudC5zbGljZSgwLCBleHBvbmVudCArIDEpICsgXCIuXCIgKyBjb2VmZmljaWVudC5zbGljZShleHBvbmVudCArIDEpXG4gICAgICA6IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGV4cG9uZW50IC0gY29lZmZpY2llbnQubGVuZ3RoICsgMikuam9pbihcIjBcIik7XG59XG4iLCIvLyBbW2ZpbGxdYWxpZ25dW3NpZ25dW3N5bWJvbF1bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW35dW3R5cGVdXG52YXIgcmUgPSAvXig/OiguKT8oWzw+PV5dKSk/KFsrXFwtKCBdKT8oWyQjXSk/KDApPyhcXGQrKT8oLCk/KFxcLlxcZCspPyh+KT8oW2EteiVdKT8kL2k7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgaWYgKCEobWF0Y2ggPSByZS5leGVjKHNwZWNpZmllcikpKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGZvcm1hdDogXCIgKyBzcGVjaWZpZXIpO1xuICB2YXIgbWF0Y2g7XG4gIHJldHVybiBuZXcgRm9ybWF0U3BlY2lmaWVyKHtcbiAgICBmaWxsOiBtYXRjaFsxXSxcbiAgICBhbGlnbjogbWF0Y2hbMl0sXG4gICAgc2lnbjogbWF0Y2hbM10sXG4gICAgc3ltYm9sOiBtYXRjaFs0XSxcbiAgICB6ZXJvOiBtYXRjaFs1XSxcbiAgICB3aWR0aDogbWF0Y2hbNl0sXG4gICAgY29tbWE6IG1hdGNoWzddLFxuICAgIHByZWNpc2lvbjogbWF0Y2hbOF0gJiYgbWF0Y2hbOF0uc2xpY2UoMSksXG4gICAgdHJpbTogbWF0Y2hbOV0sXG4gICAgdHlwZTogbWF0Y2hbMTBdXG4gIH0pO1xufVxuXG5mb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlID0gRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZTsgLy8gaW5zdGFuY2VvZlxuXG5leHBvcnQgZnVuY3Rpb24gRm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikge1xuICB0aGlzLmZpbGwgPSBzcGVjaWZpZXIuZmlsbCA9PT0gdW5kZWZpbmVkID8gXCIgXCIgOiBzcGVjaWZpZXIuZmlsbCArIFwiXCI7XG4gIHRoaXMuYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24gPT09IHVuZGVmaW5lZCA/IFwiPlwiIDogc3BlY2lmaWVyLmFsaWduICsgXCJcIjtcbiAgdGhpcy5zaWduID0gc3BlY2lmaWVyLnNpZ24gPT09IHVuZGVmaW5lZCA/IFwiLVwiIDogc3BlY2lmaWVyLnNpZ24gKyBcIlwiO1xuICB0aGlzLnN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBzcGVjaWZpZXIuc3ltYm9sICsgXCJcIjtcbiAgdGhpcy56ZXJvID0gISFzcGVjaWZpZXIuemVybztcbiAgdGhpcy53aWR0aCA9IHNwZWNpZmllci53aWR0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogK3NwZWNpZmllci53aWR0aDtcbiAgdGhpcy5jb21tYSA9ICEhc3BlY2lmaWVyLmNvbW1hO1xuICB0aGlzLnByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIucHJlY2lzaW9uO1xuICB0aGlzLnRyaW0gPSAhIXNwZWNpZmllci50cmltO1xuICB0aGlzLnR5cGUgPSBzcGVjaWZpZXIudHlwZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHNwZWNpZmllci50eXBlICsgXCJcIjtcbn1cblxuRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5maWxsXG4gICAgICArIHRoaXMuYWxpZ25cbiAgICAgICsgdGhpcy5zaWduXG4gICAgICArIHRoaXMuc3ltYm9sXG4gICAgICArICh0aGlzLnplcm8gPyBcIjBcIiA6IFwiXCIpXG4gICAgICArICh0aGlzLndpZHRoID09PSB1bmRlZmluZWQgPyBcIlwiIDogTWF0aC5tYXgoMSwgdGhpcy53aWR0aCB8IDApKVxuICAgICAgKyAodGhpcy5jb21tYSA/IFwiLFwiIDogXCJcIilcbiAgICAgICsgKHRoaXMucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyBcIlwiIDogXCIuXCIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKVxuICAgICAgKyAodGhpcy50cmltID8gXCJ+XCIgOiBcIlwiKVxuICAgICAgKyB0aGlzLnR5cGU7XG59O1xuIiwiLy8gVHJpbXMgaW5zaWduaWZpY2FudCB6ZXJvcywgZS5nLiwgcmVwbGFjZXMgMS4yMDAwayB3aXRoIDEuMmsuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzKSB7XG4gIG91dDogZm9yICh2YXIgbiA9IHMubGVuZ3RoLCBpID0gMSwgaTAgPSAtMSwgaTE7IGkgPCBuOyArK2kpIHtcbiAgICBzd2l0Y2ggKHNbaV0pIHtcbiAgICAgIGNhc2UgXCIuXCI6IGkwID0gaTEgPSBpOyBicmVhaztcbiAgICAgIGNhc2UgXCIwXCI6IGlmIChpMCA9PT0gMCkgaTAgPSBpOyBpMSA9IGk7IGJyZWFrO1xuICAgICAgZGVmYXVsdDogaWYgKCErc1tpXSkgYnJlYWsgb3V0OyBpZiAoaTAgPiAwKSBpMCA9IDA7IGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaTAgPiAwID8gcy5zbGljZSgwLCBpMCkgKyBzLnNsaWNlKGkxICsgMSkgOiBzO1xufVxuIiwiaW1wb3J0IGZvcm1hdERlY2ltYWwgZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuaW1wb3J0IGZvcm1hdFByZWZpeEF1dG8gZnJvbSBcIi4vZm9ybWF0UHJlZml4QXV0by5qc1wiO1xuaW1wb3J0IGZvcm1hdFJvdW5kZWQgZnJvbSBcIi4vZm9ybWF0Um91bmRlZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIFwiJVwiOiAoeCwgcCkgPT4gKHggKiAxMDApLnRvRml4ZWQocCksXG4gIFwiYlwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygyKSxcbiAgXCJjXCI6ICh4KSA9PiB4ICsgXCJcIixcbiAgXCJkXCI6IGZvcm1hdERlY2ltYWwsXG4gIFwiZVwiOiAoeCwgcCkgPT4geC50b0V4cG9uZW50aWFsKHApLFxuICBcImZcIjogKHgsIHApID0+IHgudG9GaXhlZChwKSxcbiAgXCJnXCI6ICh4LCBwKSA9PiB4LnRvUHJlY2lzaW9uKHApLFxuICBcIm9cIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoOCksXG4gIFwicFwiOiAoeCwgcCkgPT4gZm9ybWF0Um91bmRlZCh4ICogMTAwLCBwKSxcbiAgXCJyXCI6IGZvcm1hdFJvdW5kZWQsXG4gIFwic1wiOiBmb3JtYXRQcmVmaXhBdXRvLFxuICBcIlhcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCksXG4gIFwieFwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNilcbn07XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4O1xufVxuIiwiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5pbXBvcnQgZm9ybWF0R3JvdXAgZnJvbSBcIi4vZm9ybWF0R3JvdXAuanNcIjtcbmltcG9ydCBmb3JtYXROdW1lcmFscyBmcm9tIFwiLi9mb3JtYXROdW1lcmFscy5qc1wiO1xuaW1wb3J0IGZvcm1hdFNwZWNpZmllciBmcm9tIFwiLi9mb3JtYXRTcGVjaWZpZXIuanNcIjtcbmltcG9ydCBmb3JtYXRUcmltIGZyb20gXCIuL2Zvcm1hdFRyaW0uanNcIjtcbmltcG9ydCBmb3JtYXRUeXBlcyBmcm9tIFwiLi9mb3JtYXRUeXBlcy5qc1wiO1xuaW1wb3J0IHtwcmVmaXhFeHBvbmVudH0gZnJvbSBcIi4vZm9ybWF0UHJlZml4QXV0by5qc1wiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuL2lkZW50aXR5LmpzXCI7XG5cbnZhciBtYXAgPSBBcnJheS5wcm90b3R5cGUubWFwLFxuICAgIHByZWZpeGVzID0gW1wieVwiLFwielwiLFwiYVwiLFwiZlwiLFwicFwiLFwiblwiLFwiwrVcIixcIm1cIixcIlwiLFwia1wiLFwiTVwiLFwiR1wiLFwiVFwiLFwiUFwiLFwiRVwiLFwiWlwiLFwiWVwiXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obG9jYWxlKSB7XG4gIHZhciBncm91cCA9IGxvY2FsZS5ncm91cGluZyA9PT0gdW5kZWZpbmVkIHx8IGxvY2FsZS50aG91c2FuZHMgPT09IHVuZGVmaW5lZCA/IGlkZW50aXR5IDogZm9ybWF0R3JvdXAobWFwLmNhbGwobG9jYWxlLmdyb3VwaW5nLCBOdW1iZXIpLCBsb2NhbGUudGhvdXNhbmRzICsgXCJcIiksXG4gICAgICBjdXJyZW5jeVByZWZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGxvY2FsZS5jdXJyZW5jeVswXSArIFwiXCIsXG4gICAgICBjdXJyZW5jeVN1ZmZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGxvY2FsZS5jdXJyZW5jeVsxXSArIFwiXCIsXG4gICAgICBkZWNpbWFsID0gbG9jYWxlLmRlY2ltYWwgPT09IHVuZGVmaW5lZCA/IFwiLlwiIDogbG9jYWxlLmRlY2ltYWwgKyBcIlwiLFxuICAgICAgbnVtZXJhbHMgPSBsb2NhbGUubnVtZXJhbHMgPT09IHVuZGVmaW5lZCA/IGlkZW50aXR5IDogZm9ybWF0TnVtZXJhbHMobWFwLmNhbGwobG9jYWxlLm51bWVyYWxzLCBTdHJpbmcpKSxcbiAgICAgIHBlcmNlbnQgPSBsb2NhbGUucGVyY2VudCA9PT0gdW5kZWZpbmVkID8gXCIlXCIgOiBsb2NhbGUucGVyY2VudCArIFwiXCIsXG4gICAgICBtaW51cyA9IGxvY2FsZS5taW51cyA9PT0gdW5kZWZpbmVkID8gXCLiiJJcIiA6IGxvY2FsZS5taW51cyArIFwiXCIsXG4gICAgICBuYW4gPSBsb2NhbGUubmFuID09PSB1bmRlZmluZWQgPyBcIk5hTlwiIDogbG9jYWxlLm5hbiArIFwiXCI7XG5cbiAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllcikge1xuICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpO1xuXG4gICAgdmFyIGZpbGwgPSBzcGVjaWZpZXIuZmlsbCxcbiAgICAgICAgYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24sXG4gICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbixcbiAgICAgICAgc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCxcbiAgICAgICAgemVybyA9IHNwZWNpZmllci56ZXJvLFxuICAgICAgICB3aWR0aCA9IHNwZWNpZmllci53aWR0aCxcbiAgICAgICAgY29tbWEgPSBzcGVjaWZpZXIuY29tbWEsXG4gICAgICAgIHByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24sXG4gICAgICAgIHRyaW0gPSBzcGVjaWZpZXIudHJpbSxcbiAgICAgICAgdHlwZSA9IHNwZWNpZmllci50eXBlO1xuXG4gICAgLy8gVGhlIFwiblwiIHR5cGUgaXMgYW4gYWxpYXMgZm9yIFwiLGdcIi5cbiAgICBpZiAodHlwZSA9PT0gXCJuXCIpIGNvbW1hID0gdHJ1ZSwgdHlwZSA9IFwiZ1wiO1xuXG4gICAgLy8gVGhlIFwiXCIgdHlwZSwgYW5kIGFueSBpbnZhbGlkIHR5cGUsIGlzIGFuIGFsaWFzIGZvciBcIi4xMn5nXCIuXG4gICAgZWxzZSBpZiAoIWZvcm1hdFR5cGVzW3R5cGVdKSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiAocHJlY2lzaW9uID0gMTIpLCB0cmltID0gdHJ1ZSwgdHlwZSA9IFwiZ1wiO1xuXG4gICAgLy8gSWYgemVybyBmaWxsIGlzIHNwZWNpZmllZCwgcGFkZGluZyBnb2VzIGFmdGVyIHNpZ24gYW5kIGJlZm9yZSBkaWdpdHMuXG4gICAgaWYgKHplcm8gfHwgKGZpbGwgPT09IFwiMFwiICYmIGFsaWduID09PSBcIj1cIikpIHplcm8gPSB0cnVlLCBmaWxsID0gXCIwXCIsIGFsaWduID0gXCI9XCI7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC5cbiAgICAvLyBGb3IgU0ktcHJlZml4LCB0aGUgc3VmZml4IGlzIGxhemlseSBjb21wdXRlZC5cbiAgICB2YXIgcHJlZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5UHJlZml4IDogc3ltYm9sID09PSBcIiNcIiAmJiAvW2JveFhdLy50ZXN0KHR5cGUpID8gXCIwXCIgKyB0eXBlLnRvTG93ZXJDYXNlKCkgOiBcIlwiLFxuICAgICAgICBzdWZmaXggPSBzeW1ib2wgPT09IFwiJFwiID8gY3VycmVuY3lTdWZmaXggOiAvWyVwXS8udGVzdCh0eXBlKSA/IHBlcmNlbnQgOiBcIlwiO1xuXG4gICAgLy8gV2hhdCBmb3JtYXQgZnVuY3Rpb24gc2hvdWxkIHdlIHVzZT9cbiAgICAvLyBJcyB0aGlzIGFuIGludGVnZXIgdHlwZT9cbiAgICAvLyBDYW4gdGhpcyB0eXBlIGdlbmVyYXRlIGV4cG9uZW50aWFsIG5vdGF0aW9uP1xuICAgIHZhciBmb3JtYXRUeXBlID0gZm9ybWF0VHlwZXNbdHlwZV0sXG4gICAgICAgIG1heWJlU3VmZml4ID0gL1tkZWZncHJzJV0vLnRlc3QodHlwZSk7XG5cbiAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlmIG5vdCBzcGVjaWZpZWQsXG4gICAgLy8gb3IgY2xhbXAgdGhlIHNwZWNpZmllZCBwcmVjaXNpb24gdG8gdGhlIHN1cHBvcnRlZCByYW5nZS5cbiAgICAvLyBGb3Igc2lnbmlmaWNhbnQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFsxLCAyMV0uXG4gICAgLy8gRm9yIGZpeGVkIHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMCwgMjBdLlxuICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gNlxuICAgICAgICA6IC9bZ3Byc10vLnRlc3QodHlwZSkgPyBNYXRoLm1heCgxLCBNYXRoLm1pbigyMSwgcHJlY2lzaW9uKSlcbiAgICAgICAgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgcHJlY2lzaW9uKSk7XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQodmFsdWUpIHtcbiAgICAgIHZhciB2YWx1ZVByZWZpeCA9IHByZWZpeCxcbiAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IHN1ZmZpeCxcbiAgICAgICAgICBpLCBuLCBjO1xuXG4gICAgICBpZiAodHlwZSA9PT0gXCJjXCIpIHtcbiAgICAgICAgdmFsdWVTdWZmaXggPSBmb3JtYXRUeXBlKHZhbHVlKSArIHZhbHVlU3VmZml4O1xuICAgICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9ICt2YWx1ZTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHNpZ24uIC0wIGlzIG5vdCBsZXNzIHRoYW4gMCwgYnV0IDEgLyAtMCBpcyFcbiAgICAgICAgdmFyIHZhbHVlTmVnYXRpdmUgPSB2YWx1ZSA8IDAgfHwgMSAvIHZhbHVlIDwgMDtcblxuICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbml0aWFsIGZvcm1hdHRpbmcuXG4gICAgICAgIHZhbHVlID0gaXNOYU4odmFsdWUpID8gbmFuIDogZm9ybWF0VHlwZShNYXRoLmFicyh2YWx1ZSksIHByZWNpc2lvbik7XG5cbiAgICAgICAgLy8gVHJpbSBpbnNpZ25pZmljYW50IHplcm9zLlxuICAgICAgICBpZiAodHJpbSkgdmFsdWUgPSBmb3JtYXRUcmltKHZhbHVlKTtcblxuICAgICAgICAvLyBJZiBhIG5lZ2F0aXZlIHZhbHVlIHJvdW5kcyB0byB6ZXJvIGFmdGVyIGZvcm1hdHRpbmcsIGFuZCBubyBleHBsaWNpdCBwb3NpdGl2ZSBzaWduIGlzIHJlcXVlc3RlZCwgaGlkZSB0aGUgc2lnbi5cbiAgICAgICAgaWYgKHZhbHVlTmVnYXRpdmUgJiYgK3ZhbHVlID09PSAwICYmIHNpZ24gIT09IFwiK1wiKSB2YWx1ZU5lZ2F0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgICAgIHZhbHVlUHJlZml4ID0gKHZhbHVlTmVnYXRpdmUgPyAoc2lnbiA9PT0gXCIoXCIgPyBzaWduIDogbWludXMpIDogc2lnbiA9PT0gXCItXCIgfHwgc2lnbiA9PT0gXCIoXCIgPyBcIlwiIDogc2lnbikgKyB2YWx1ZVByZWZpeDtcbiAgICAgICAgdmFsdWVTdWZmaXggPSAodHlwZSA9PT0gXCJzXCIgPyBwcmVmaXhlc1s4ICsgcHJlZml4RXhwb25lbnQgLyAzXSA6IFwiXCIpICsgdmFsdWVTdWZmaXggKyAodmFsdWVOZWdhdGl2ZSAmJiBzaWduID09PSBcIihcIiA/IFwiKVwiIDogXCJcIik7XG5cbiAgICAgICAgLy8gQnJlYWsgdGhlIGZvcm1hdHRlZCB2YWx1ZSBpbnRvIHRoZSBpbnRlZ2VyIOKAnHZhbHVl4oCdIHBhcnQgdGhhdCBjYW4gYmVcbiAgICAgICAgLy8gZ3JvdXBlZCwgYW5kIGZyYWN0aW9uYWwgb3IgZXhwb25lbnRpYWwg4oCcc3VmZml44oCdIHBhcnQgdGhhdCBpcyBub3QuXG4gICAgICAgIGlmIChtYXliZVN1ZmZpeCkge1xuICAgICAgICAgIGkgPSAtMSwgbiA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICAgICAgaWYgKGMgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpLCA0OCA+IGMgfHwgYyA+IDU3KSB7XG4gICAgICAgICAgICAgIHZhbHVlU3VmZml4ID0gKGMgPT09IDQ2ID8gZGVjaW1hbCArIHZhbHVlLnNsaWNlKGkgKyAxKSA6IHZhbHVlLnNsaWNlKGkpKSArIHZhbHVlU3VmZml4O1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIG5vdCBcIjBcIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBiZWZvcmUgcGFkZGluZy5cbiAgICAgIGlmIChjb21tYSAmJiAhemVybykgdmFsdWUgPSBncm91cCh2YWx1ZSwgSW5maW5pdHkpO1xuXG4gICAgICAvLyBDb21wdXRlIHRoZSBwYWRkaW5nLlxuICAgICAgdmFyIGxlbmd0aCA9IHZhbHVlUHJlZml4Lmxlbmd0aCArIHZhbHVlLmxlbmd0aCArIHZhbHVlU3VmZml4Lmxlbmd0aCxcbiAgICAgICAgICBwYWRkaW5nID0gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpIDogXCJcIjtcblxuICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIFwiMFwiLCBncm91cGluZyBpcyBhcHBsaWVkIGFmdGVyIHBhZGRpbmcuXG4gICAgICBpZiAoY29tbWEgJiYgemVybykgdmFsdWUgPSBncm91cChwYWRkaW5nICsgdmFsdWUsIHBhZGRpbmcubGVuZ3RoID8gd2lkdGggLSB2YWx1ZVN1ZmZpeC5sZW5ndGggOiBJbmZpbml0eSksIHBhZGRpbmcgPSBcIlwiO1xuXG4gICAgICAvLyBSZWNvbnN0cnVjdCB0aGUgZmluYWwgb3V0cHV0IGJhc2VkIG9uIHRoZSBkZXNpcmVkIGFsaWdubWVudC5cbiAgICAgIHN3aXRjaCAoYWxpZ24pIHtcbiAgICAgICAgY2FzZSBcIjxcIjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXggKyBwYWRkaW5nOyBicmVhaztcbiAgICAgICAgY2FzZSBcIj1cIjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHBhZGRpbmcgKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhaztcbiAgICAgICAgY2FzZSBcIl5cIjogdmFsdWUgPSBwYWRkaW5nLnNsaWNlKDAsIGxlbmd0aCA9IHBhZGRpbmcubGVuZ3RoID4+IDEpICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZy5zbGljZShsZW5ndGgpOyBicmVhaztcbiAgICAgICAgZGVmYXVsdDogdmFsdWUgPSBwYWRkaW5nICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bWVyYWxzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmb3JtYXQudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzcGVjaWZpZXIgKyBcIlwiO1xuICAgIH07XG5cbiAgICByZXR1cm4gZm9ybWF0O1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpIHtcbiAgICB2YXIgZiA9IG5ld0Zvcm1hdCgoc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciksIHNwZWNpZmllci50eXBlID0gXCJmXCIsIHNwZWNpZmllcikpLFxuICAgICAgICBlID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQodmFsdWUpIC8gMykpKSAqIDMsXG4gICAgICAgIGsgPSBNYXRoLnBvdygxMCwgLWUpLFxuICAgICAgICBwcmVmaXggPSBwcmVmaXhlc1s4ICsgZSAvIDNdO1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGYoayAqIHZhbHVlKSArIHByZWZpeDtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXQ6IG5ld0Zvcm1hdCxcbiAgICBmb3JtYXRQcmVmaXg6IGZvcm1hdFByZWZpeFxuICB9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJhc2lzKHQxLCB2MCwgdjEsIHYyLCB2Mykge1xuICB2YXIgdDIgPSB0MSAqIHQxLCB0MyA9IHQyICogdDE7XG4gIHJldHVybiAoKDEgLSAzICogdDEgKyAzICogdDIgLSB0MykgKiB2MFxuICAgICAgKyAoNCAtIDYgKiB0MiArIDMgKiB0MykgKiB2MVxuICAgICAgKyAoMSArIDMgKiB0MSArIDMgKiB0MiAtIDMgKiB0MykgKiB2MlxuICAgICAgKyB0MyAqIHYzKSAvIDY7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGggLSAxO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdCA8PSAwID8gKHQgPSAwKSA6IHQgPj0gMSA/ICh0ID0gMSwgbiAtIDEpIDogTWF0aC5mbG9vcih0ICogbiksXG4gICAgICAgIHYxID0gdmFsdWVzW2ldLFxuICAgICAgICB2MiA9IHZhbHVlc1tpICsgMV0sXG4gICAgICAgIHYwID0gaSA+IDAgPyB2YWx1ZXNbaSAtIDFdIDogMiAqIHYxIC0gdjIsXG4gICAgICAgIHYzID0gaSA8IG4gLSAxID8gdmFsdWVzW2kgKyAyXSA6IDIgKiB2MiAtIHYxO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7YmFzaXN9IGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGg7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKCgodCAlPSAxKSA8IDAgPyArK3QgOiB0KSAqIG4pLFxuICAgICAgICB2MCA9IHZhbHVlc1soaSArIG4gLSAxKSAlIG5dLFxuICAgICAgICB2MSA9IHZhbHVlc1tpICUgbl0sXG4gICAgICAgIHYyID0gdmFsdWVzWyhpICsgMSkgJSBuXSxcbiAgICAgICAgdjMgPSB2YWx1ZXNbKGkgKyAyKSAlIG5dO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn1cbiIsImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBsaW5lYXIoYSwgZCkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICsgdCAqIGQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4cG9uZW50aWFsKGEsIGIsIHkpIHtcbiAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBodWUoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2FtbWEoeSkge1xuICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hIDogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vZ2FtbWEoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgeCA9PiAoKSA9PiB4O1xuIiwiaW1wb3J0IHtsYWIgYXMgY29sb3JMYWJ9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGNvbG9yIGZyb20gXCIuL2NvbG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxhYihzdGFydCwgZW5kKSB7XG4gIHZhciBsID0gY29sb3IoKHN0YXJ0ID0gY29sb3JMYWIoc3RhcnQpKS5sLCAoZW5kID0gY29sb3JMYWIoZW5kKSkubCksXG4gICAgICBhID0gY29sb3Ioc3RhcnQuYSwgZW5kLmEpLFxuICAgICAgYiA9IGNvbG9yKHN0YXJ0LmIsIGVuZC5iKSxcbiAgICAgIG9wYWNpdHkgPSBjb2xvcihzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgc3RhcnQubCA9IGwodCk7XG4gICAgc3RhcnQuYSA9IGEodCk7XG4gICAgc3RhcnQuYiA9IGIodCk7XG4gICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGEgKiAoMSAtIHQpICsgYiAqIHQ7XG4gIH07XG59XG4iLCJpbXBvcnQge3JnYiBhcyBjb2xvclJnYn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgYmFzaXMgZnJvbSBcIi4vYmFzaXMuanNcIjtcbmltcG9ydCBiYXNpc0Nsb3NlZCBmcm9tIFwiLi9iYXNpc0Nsb3NlZC5qc1wiO1xuaW1wb3J0IG5vZ2FtbWEsIHtnYW1tYX0gZnJvbSBcIi4vY29sb3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHtcbiAgdmFyIGNvbG9yID0gZ2FtbWEoeSk7XG5cbiAgZnVuY3Rpb24gcmdiKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IGNvbG9yUmdiKHN0YXJ0KSkuciwgKGVuZCA9IGNvbG9yUmdiKGVuZCkpLnIpLFxuICAgICAgICBnID0gY29sb3Ioc3RhcnQuZywgZW5kLmcpLFxuICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLFxuICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHN0YXJ0LnIgPSByKHQpO1xuICAgICAgc3RhcnQuZyA9IGcodCk7XG4gICAgICBzdGFydC5iID0gYih0KTtcbiAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICB9O1xuICB9XG5cbiAgcmdiLmdhbW1hID0gcmdiR2FtbWE7XG5cbiAgcmV0dXJuIHJnYjtcbn0pKDEpO1xuXG5mdW5jdGlvbiByZ2JTcGxpbmUoc3BsaW5lKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xvcnMpIHtcbiAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsXG4gICAgICAgIHIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGcgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGksIGNvbG9yO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGNvbG9yID0gY29sb3JSZ2IoY29sb3JzW2ldKTtcbiAgICAgIHJbaV0gPSBjb2xvci5yIHx8IDA7XG4gICAgICBnW2ldID0gY29sb3IuZyB8fCAwO1xuICAgICAgYltpXSA9IGNvbG9yLmIgfHwgMDtcbiAgICB9XG4gICAgciA9IHNwbGluZShyKTtcbiAgICBnID0gc3BsaW5lKGcpO1xuICAgIGIgPSBzcGxpbmUoYik7XG4gICAgY29sb3Iub3BhY2l0eSA9IDE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIGNvbG9yLnIgPSByKHQpO1xuICAgICAgY29sb3IuZyA9IGcodCk7XG4gICAgICBjb2xvci5iID0gYih0KTtcbiAgICAgIHJldHVybiBjb2xvciArIFwiXCI7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciByZ2JCYXNpcyA9IHJnYlNwbGluZShiYXNpcyk7XG5leHBvcnQgdmFyIHJnYkJhc2lzQ2xvc2VkID0gcmdiU3BsaW5lKGJhc2lzQ2xvc2VkKTtcbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbnZhciByZUEgPSAvWy0rXT8oPzpcXGQrXFwuP1xcZCp8XFwuP1xcZCspKD86W2VFXVstK10/XFxkKyk/L2csXG4gICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCBcImdcIik7XG5cbmZ1bmN0aW9uIHplcm8oYikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGI7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uZShiKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGIodCkgKyBcIlwiO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYVxuICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYlxuICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55XG4gICAgICBpID0gLTEsIC8vIGluZGV4IGluIHNcbiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG5cbiAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLlxuICBhID0gYSArIFwiXCIsIGIgPSBiICsgXCJcIjtcblxuICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLlxuICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpXG4gICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHtcbiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpO1xuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJzO1xuICAgIH1cbiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaFxuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJtO1xuICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzXG4gICAgICBzWysraV0gPSBudWxsO1xuICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pO1xuICAgIH1cbiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7XG4gIH1cblxuICAvLyBBZGQgcmVtYWlucyBvZiBiLlxuICBpZiAoYmkgPCBiLmxlbmd0aCkge1xuICAgIGJzID0gYi5zbGljZShiaSk7XG4gICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgZWxzZSBzWysraV0gPSBicztcbiAgfVxuXG4gIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLlxuICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLlxuICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF1cbiAgICAgID8gb25lKHFbMF0ueClcbiAgICAgIDogemVybyhiKSlcbiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICAgICAgfSk7XG59XG4iLCJ2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSB7XG4gIHRyYW5zbGF0ZVg6IDAsXG4gIHRyYW5zbGF0ZVk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2tld1g6IDAsXG4gIHNjYWxlWDogMSxcbiAgc2NhbGVZOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7XG4gIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDtcbiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYO1xuICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTtcbiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGVYOiBlLFxuICAgIHRyYW5zbGF0ZVk6IGYsXG4gICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcyxcbiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsXG4gICAgc2NhbGVYOiBzY2FsZVgsXG4gICAgc2NhbGVZOiBzY2FsZVlcbiAgfTtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlci5qc1wiO1xuaW1wb3J0IHtwYXJzZUNzcywgcGFyc2VTdmd9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikge1xuXG4gIGZ1bmN0aW9uIHBvcChzKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArIFwiIFwiIDogXCJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChcInRyYW5zbGF0ZShcIiwgbnVsbCwgcHhDb21tYSwgbnVsbCwgcHhQYXJlbik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7XG4gICAgICBzLnB1c2goXCJ0cmFuc2xhdGUoXCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aFxuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiArIHhiICsgXCIsXCIgKyB5YiArIFwiKVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG4gICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7XG4gICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7XG4gICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7XG4gICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7XG4gICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpO1xuICAgIGEgPSBiID0gbnVsbDsgLy8gZ2NcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlQ3NzLCBcInB4LCBcIiwgXCJweClcIiwgXCJkZWcpXCIpO1xuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCBcIiwgXCIsIFwiKVwiLCBcIilcIik7XG4iLCJpbXBvcnQgZGVjb21wb3NlLCB7aWRlbnRpdHl9IGZyb20gXCIuL2RlY29tcG9zZS5qc1wiO1xuXG52YXIgc3ZnTm9kZTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNzcyh2YWx1ZSkge1xuICBjb25zdCBtID0gbmV3ICh0eXBlb2YgRE9NTWF0cml4ID09PSBcImZ1bmN0aW9uXCIgPyBET01NYXRyaXggOiBXZWJLaXRDU1NNYXRyaXgpKHZhbHVlICsgXCJcIik7XG4gIHJldHVybiBtLmlzSWRlbnRpdHkgPyBpZGVudGl0eSA6IGRlY29tcG9zZShtLmEsIG0uYiwgbS5jLCBtLmQsIG0uZSwgbS5mKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3ZnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHk7XG4gIGlmICghc3ZnTm9kZSkgc3ZnTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgdmFsdWUpO1xuICBpZiAoISh2YWx1ZSA9IHN2Z05vZGUudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSkpIHJldHVybiBpZGVudGl0eTtcbiAgdmFsdWUgPSB2YWx1ZS5tYXRyaXg7XG4gIHJldHVybiBkZWNvbXBvc2UodmFsdWUuYSwgdmFsdWUuYiwgdmFsdWUuYywgdmFsdWUuZCwgdmFsdWUuZSwgdmFsdWUuZik7XG59XG4iLCJ2YXIgZXBzaWxvbjIgPSAxZS0xMjtcblxuZnVuY3Rpb24gY29zaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgKyAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiBzaW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7XG59XG5cbmZ1bmN0aW9uIHRhbmgoeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoMiAqIHgpKSAtIDEpIC8gKHggKyAxKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHpvb21SaG8ocmhvLCByaG8yLCByaG80KSB7XG5cbiAgLy8gcDAgPSBbdXgwLCB1eTAsIHcwXVxuICAvLyBwMSA9IFt1eDEsIHV5MSwgdzFdXG4gIGZ1bmN0aW9uIHpvb20ocDAsIHAxKSB7XG4gICAgdmFyIHV4MCA9IHAwWzBdLCB1eTAgPSBwMFsxXSwgdzAgPSBwMFsyXSxcbiAgICAgICAgdXgxID0gcDFbMF0sIHV5MSA9IHAxWzFdLCB3MSA9IHAxWzJdLFxuICAgICAgICBkeCA9IHV4MSAtIHV4MCxcbiAgICAgICAgZHkgPSB1eTEgLSB1eTAsXG4gICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHksXG4gICAgICAgIGksXG4gICAgICAgIFM7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHUwIOKJhSB1MS5cbiAgICBpZiAoZDIgPCBlcHNpbG9uMikge1xuICAgICAgUyA9IE1hdGgubG9nKHcxIC8gdzApIC8gcmhvO1xuICAgICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB1eDAgKyB0ICogZHgsXG4gICAgICAgICAgdXkwICsgdCAqIGR5LFxuICAgICAgICAgIHcwICogTWF0aC5leHAocmhvICogdCAqIFMpXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhbCBjYXNlLlxuICAgIGVsc2Uge1xuICAgICAgdmFyIGQxID0gTWF0aC5zcXJ0KGQyKSxcbiAgICAgICAgICBiMCA9ICh3MSAqIHcxIC0gdzAgKiB3MCArIHJobzQgKiBkMikgLyAoMiAqIHcwICogcmhvMiAqIGQxKSxcbiAgICAgICAgICBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSxcbiAgICAgICAgICByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCksXG4gICAgICAgICAgcjEgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjEgKiBiMSArIDEpIC0gYjEpO1xuICAgICAgUyA9IChyMSAtIHIwKSAvIHJobztcbiAgICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHZhciBzID0gdCAqIFMsXG4gICAgICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSxcbiAgICAgICAgICAgIHUgPSB3MCAvIChyaG8yICogZDEpICogKGNvc2hyMCAqIHRhbmgocmhvICogcyArIHIwKSAtIHNpbmgocjApKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB1eDAgKyB1ICogZHgsXG4gICAgICAgICAgdXkwICsgdSAqIGR5LFxuICAgICAgICAgIHcwICogY29zaHIwIC8gY29zaChyaG8gKiBzICsgcjApXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaS5kdXJhdGlvbiA9IFMgKiAxMDAwICogcmhvIC8gTWF0aC5TUVJUMjtcblxuICAgIHJldHVybiBpO1xuICB9XG5cbiAgem9vbS5yaG8gPSBmdW5jdGlvbihfKSB7XG4gICAgdmFyIF8xID0gTWF0aC5tYXgoMWUtMywgK18pLCBfMiA9IF8xICogXzEsIF80ID0gXzIgKiBfMjtcbiAgICByZXR1cm4gem9vbVJobyhfMSwgXzIsIF80KTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn0pKE1hdGguU1FSVDIsIDIsIDQpO1xuIiwiZXhwb3J0IGRlZmF1bHQgTWF0aC5yYW5kb207XG4iLCJpbXBvcnQgZGVmYXVsdFNvdXJjZSBmcm9tIFwiLi9kZWZhdWx0U291cmNlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBzb3VyY2VSYW5kb21Ob3JtYWwoc291cmNlKSB7XG4gIGZ1bmN0aW9uIHJhbmRvbU5vcm1hbChtdSwgc2lnbWEpIHtcbiAgICB2YXIgeCwgcjtcbiAgICBtdSA9IG11ID09IG51bGwgPyAwIDogK211O1xuICAgIHNpZ21hID0gc2lnbWEgPT0gbnVsbCA/IDEgOiArc2lnbWE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHk7XG5cbiAgICAgIC8vIElmIGF2YWlsYWJsZSwgdXNlIHRoZSBzZWNvbmQgcHJldmlvdXNseS1nZW5lcmF0ZWQgdW5pZm9ybSByYW5kb20uXG4gICAgICBpZiAoeCAhPSBudWxsKSB5ID0geCwgeCA9IG51bGw7XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgZ2VuZXJhdGUgYSBuZXcgeCBhbmQgeS5cbiAgICAgIGVsc2UgZG8ge1xuICAgICAgICB4ID0gc291cmNlKCkgKiAyIC0gMTtcbiAgICAgICAgeSA9IHNvdXJjZSgpICogMiAtIDE7XG4gICAgICAgIHIgPSB4ICogeCArIHkgKiB5O1xuICAgICAgfSB3aGlsZSAoIXIgfHwgciA+IDEpO1xuXG4gICAgICByZXR1cm4gbXUgKyBzaWdtYSAqIHkgKiBNYXRoLnNxcnQoLTIgKiBNYXRoLmxvZyhyKSAvIHIpO1xuICAgIH07XG4gIH1cblxuICByYW5kb21Ob3JtYWwuc291cmNlID0gc291cmNlUmFuZG9tTm9ybWFsO1xuXG4gIHJldHVybiByYW5kb21Ob3JtYWw7XG59KShkZWZhdWx0U291cmNlKTtcbiIsImV4cG9ydCBmdW5jdGlvbiBpbml0UmFuZ2UoZG9tYWluLCByYW5nZSkge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IGJyZWFrO1xuICAgIGNhc2UgMTogdGhpcy5yYW5nZShkb21haW4pOyBicmVhaztcbiAgICBkZWZhdWx0OiB0aGlzLnJhbmdlKHJhbmdlKS5kb21haW4oZG9tYWluKTsgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0SW50ZXJwb2xhdG9yKGRvbWFpbiwgaW50ZXJwb2xhdG9yKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogYnJlYWs7XG4gICAgY2FzZSAxOiB7XG4gICAgICBpZiAodHlwZW9mIGRvbWFpbiA9PT0gXCJmdW5jdGlvblwiKSB0aGlzLmludGVycG9sYXRvcihkb21haW4pO1xuICAgICAgZWxzZSB0aGlzLnJhbmdlKGRvbWFpbik7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhpcy5kb21haW4oZG9tYWluKTtcbiAgICAgIGlmICh0eXBlb2YgaW50ZXJwb2xhdG9yID09PSBcImZ1bmN0aW9uXCIpIHRoaXMuaW50ZXJwb2xhdG9yKGludGVycG9sYXRvcik7XG4gICAgICBlbHNlIHRoaXMucmFuZ2UoaW50ZXJwb2xhdG9yKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsImltcG9ydCB7YXNjZW5kaW5nLCBiaXNlY3QsIHF1YW50aWxlU29ydGVkIGFzIHRocmVzaG9sZH0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge2luaXRSYW5nZX0gZnJvbSBcIi4vaW5pdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFudGlsZSgpIHtcbiAgdmFyIGRvbWFpbiA9IFtdLFxuICAgICAgcmFuZ2UgPSBbXSxcbiAgICAgIHRocmVzaG9sZHMgPSBbXSxcbiAgICAgIHVua25vd247XG5cbiAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcbiAgICB2YXIgaSA9IDAsIG4gPSBNYXRoLm1heCgxLCByYW5nZS5sZW5ndGgpO1xuICAgIHRocmVzaG9sZHMgPSBuZXcgQXJyYXkobiAtIDEpO1xuICAgIHdoaWxlICgrK2kgPCBuKSB0aHJlc2hvbGRzW2kgLSAxXSA9IHRocmVzaG9sZChkb21haW4sIGkgLyBuKTtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgcmV0dXJuIHggPT0gbnVsbCB8fCBpc05hTih4ID0gK3gpID8gdW5rbm93biA6IHJhbmdlW2Jpc2VjdCh0aHJlc2hvbGRzLCB4KV07XG4gIH1cblxuICBzY2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7XG4gICAgdmFyIGkgPSByYW5nZS5pbmRleE9mKHkpO1xuICAgIHJldHVybiBpIDwgMCA/IFtOYU4sIE5hTl0gOiBbXG4gICAgICBpID4gMCA/IHRocmVzaG9sZHNbaSAtIDFdIDogZG9tYWluWzBdLFxuICAgICAgaSA8IHRocmVzaG9sZHMubGVuZ3RoID8gdGhyZXNob2xkc1tpXSA6IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV1cbiAgICBdO1xuICB9O1xuXG4gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW4uc2xpY2UoKTtcbiAgICBkb21haW4gPSBbXTtcbiAgICBmb3IgKGxldCBkIG9mIF8pIGlmIChkICE9IG51bGwgJiYgIWlzTmFOKGQgPSArZCkpIGRvbWFpbi5wdXNoKGQpO1xuICAgIGRvbWFpbi5zb3J0KGFzY2VuZGluZyk7XG4gICAgcmV0dXJuIHJlc2NhbGUoKTtcbiAgfTtcblxuICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IEFycmF5LmZyb20oXyksIHJlc2NhbGUoKSkgOiByYW5nZS5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247XG4gIH07XG5cbiAgc2NhbGUucXVhbnRpbGVzID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRocmVzaG9sZHMuc2xpY2UoKTtcbiAgfTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHF1YW50aWxlKClcbiAgICAgICAgLmRvbWFpbihkb21haW4pXG4gICAgICAgIC5yYW5nZShyYW5nZSlcbiAgICAgICAgLnVua25vd24odW5rbm93bik7XG4gIH07XG5cbiAgcmV0dXJuIGluaXRSYW5nZS5hcHBseShzY2FsZSwgYXJndW1lbnRzKTtcbn1cbiIsIi8vIEdpdmVuIHNvbWV0aGluZyBhcnJheSBsaWtlIChvciBudWxsKSwgcmV0dXJucyBzb21ldGhpbmcgdGhhdCBpcyBzdHJpY3RseSBhblxuLy8gYXJyYXkuIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBhcnJheS1saWtlIG9iamVjdHMgcGFzc2VkIHRvIGQzLnNlbGVjdEFsbFxuLy8gb3Igc2VsZWN0aW9uLnNlbGVjdEFsbCBhcmUgY29udmVydGVkIGludG8gcHJvcGVyIGFycmF5cyB3aGVuIGNyZWF0aW5nIGFcbi8vIHNlbGVjdGlvbjsgd2UgZG9u4oCZdCBldmVyIHdhbnQgdG8gY3JlYXRlIGEgc2VsZWN0aW9uIGJhY2tlZCBieSBhIGxpdmVcbi8vIEhUTUxDb2xsZWN0aW9uIG9yIE5vZGVMaXN0LiBIb3dldmVyLCBub3RlIHRoYXQgc2VsZWN0aW9uLnNlbGVjdEFsbCB3aWxsIHVzZSBhXG4vLyBzdGF0aWMgTm9kZUxpc3QgYXMgYSBncm91cCwgc2luY2UgaXQgc2FmZWx5IGRlcml2ZWQgZnJvbSBxdWVyeVNlbGVjdG9yQWxsLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXJyYXkoeCkge1xuICByZXR1cm4geCA9PSBudWxsID8gW10gOiBBcnJheS5pc0FycmF5KHgpID8geCA6IEFycmF5LmZyb20oeCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4vbmFtZXNwYWNlLmpzXCI7XG5pbXBvcnQge3hodG1sfSBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCxcbiAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7XG4gICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWxcbiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpXG4gICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiAoZnVsbG5hbWUubG9jYWxcbiAgICAgID8gY3JlYXRvckZpeGVkXG4gICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZE1hdGNoZXIoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuIiwiaW1wb3J0IG5hbWVzcGFjZXMgZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBwcmVmaXggPSBuYW1lICs9IFwiXCIsIGkgPSBwcmVmaXguaW5kZXhPZihcIjpcIik7XG4gIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwgaSkpICE9PSBcInhtbG5zXCIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTtcbiAgcmV0dXJuIG5hbWVzcGFjZXMuaGFzT3duUHJvcGVydHkocHJlZml4KSA/IHtzcGFjZTogbmFtZXNwYWNlc1twcmVmaXhdLCBsb2NhbDogbmFtZX0gOiBuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xufVxuIiwiZXhwb3J0IHZhciB4aHRtbCA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHN2ZzogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB4aHRtbDogeGh0bWwsXG4gIHhsaW5rOiBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcbiAgeG1sOiBcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLFxuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zL1wiXG59O1xuIiwiaW1wb3J0IHNvdXJjZUV2ZW50IGZyb20gXCIuL3NvdXJjZUV2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50LCBub2RlKSB7XG4gIGV2ZW50ID0gc291cmNlRXZlbnQoZXZlbnQpO1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSBub2RlID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgaWYgKG5vZGUpIHtcbiAgICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1lbnQgfHwgbm9kZTtcbiAgICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7XG4gICAgICB2YXIgcG9pbnQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTtcbiAgICAgIHBvaW50LnggPSBldmVudC5jbGllbnRYLCBwb2ludC55ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcbiAgICAgIHJldHVybiBbcG9pbnQueCwgcG9pbnQueV07XG4gICAgfVxuICAgIGlmIChub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIFtldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gbm9kZS5jbGllbnRMZWZ0LCBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBub2RlLmNsaWVudFRvcF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9uLCByb290fSBmcm9tIFwiLi9zZWxlY3Rpb24vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcildXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pXG4gICAgICA6IG5ldyBTZWxlY3Rpb24oW1tzZWxlY3Rvcl1dLCByb290KTtcbn1cbiIsImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogY3JlYXRvcihuYW1lKTtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuLi9uYW1lc3BhY2UuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgcmV0dXJuIGZ1bGxuYW1lLmxvY2FsXG4gICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpXG4gICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUoZnVsbG5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbilcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKSkoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzWzBdO1xuICBhcmd1bWVudHNbMF0gPSB0aGlzO1xuICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImZ1bmN0aW9uIGNsYXNzQXJyYXkoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcudHJpbSgpLnNwbGl0KC9efFxccysvKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NMaXN0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0IHx8IG5ldyBDbGFzc0xpc3Qobm9kZSk7XG59XG5cbmZ1bmN0aW9uIENsYXNzTGlzdChub2RlKSB7XG4gIHRoaXMuX25vZGUgPSBub2RlO1xuICB0aGlzLl9uYW1lcyA9IGNsYXNzQXJyYXkobm9kZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSB8fCBcIlwiKTtcbn1cblxuQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHtcbiAgYWRkOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpIDwgMCkge1xuICAgICAgdGhpcy5fbmFtZXMucHVzaChuYW1lKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgY29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LmFkZChuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QucmVtb3ZlKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRBZGQodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRmFsc2UobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRSZW1vdmUodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArIFwiXCIpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0KHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBjbGFzc2VkRnVuY3Rpb24gOiB2YWx1ZVxuICAgICAgPyBjbGFzc2VkVHJ1ZVxuICAgICAgOiBjbGFzc2VkRmFsc2UpKG5hbWVzLCB2YWx1ZSkpO1xufVxuIiwiZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdygpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUoZmFsc2UpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVEZWVwKCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVlcCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZGVlcCA/IHNlbGVjdGlvbl9jbG9uZURlZXAgOiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHtFbnRlck5vZGV9IGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4uL2NvbnN0YW50LmpzXCI7XG5cbmZ1bmN0aW9uIGJpbmRJbmRleChwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhKSB7XG4gIHZhciBpID0gMCxcbiAgICAgIG5vZGUsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLlxuICAvLyBQdXQgYW55IG51bGwgbm9kZXMgaW50byBlbnRlci5cbiAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLlxuICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGRvbuKAmXQgZml0IGludG8gZXhpdC5cbiAgZm9yICg7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7XG4gIHZhciBpLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVCeUtleVZhbHVlID0gbmV3IE1hcCxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAga2V5VmFsdWVzID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKSxcbiAgICAgIGtleVZhbHVlO1xuXG4gIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLlxuICAvLyBJZiBtdWx0aXBsZSBub2RlcyBoYXZlIHRoZSBzYW1lIGtleSwgdGhlIGR1cGxpY2F0ZXMgYXJlIGFkZGVkIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWUgPSBrZXkuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkgKyBcIlwiO1xuICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHtcbiAgICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS5cbiAgLy8gSWYgdGhlcmUgYSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleSwgam9pbiBhbmQgYWRkIGl0IHRvIHVwZGF0ZS5cbiAgLy8gSWYgdGhlcmUgaXMgbm90IChvciB0aGUga2V5IGlzIGEgZHVwbGljYXRlKSwgYWRkIGl0IHRvIGVudGVyLlxuICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAga2V5VmFsdWUgPSBrZXkuY2FsbChwYXJlbnQsIGRhdGFbaV0sIGksIGRhdGEpICsgXCJcIjtcbiAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZSkpIHtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIG5vZGVCeUtleVZhbHVlLmRlbGV0ZShrZXlWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBhbnkgcmVtYWluaW5nIG5vZGVzIHRoYXQgd2VyZSBub3QgYm91bmQgdG8gZGF0YSB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAobm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlc1tpXSkgPT09IG5vZGUpKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0dW0obm9kZSkge1xuICByZXR1cm4gbm9kZS5fX2RhdGFfXztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBBcnJheS5mcm9tKHRoaXMsIGRhdHVtKTtcblxuICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsXG4gICAgICBwYXJlbnRzID0gdGhpcy5fcGFyZW50cyxcbiAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwcztcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHZhbHVlID0gY29uc3RhbnQodmFsdWUpO1xuXG4gIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJyYXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLFxuICAgICAgICBncm91cCA9IGdyb3Vwc1tqXSxcbiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICAgIGRhdGEgPSBhcnJheWxpa2UodmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpKSxcbiAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAgICBlbnRlckdyb3VwID0gZW50ZXJbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICBleGl0R3JvdXAgPSBleGl0W2pdID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKTtcblxuICAgIGJpbmQocGFyZW50LCBncm91cCwgZW50ZXJHcm91cCwgdXBkYXRlR3JvdXAsIGV4aXRHcm91cCwgZGF0YSwga2V5KTtcblxuICAgIC8vIE5vdyBjb25uZWN0IHRoZSBlbnRlciBub2RlcyB0byB0aGVpciBmb2xsb3dpbmcgdXBkYXRlIG5vZGUsIHN1Y2ggdGhhdFxuICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVyaWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsXG4gICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuXG4gICAgZm9yICh2YXIgaTAgPSAwLCBpMSA9IDAsIHByZXZpb3VzLCBuZXh0OyBpMCA8IGRhdGFMZW5ndGg7ICsraTApIHtcbiAgICAgIGlmIChwcmV2aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7XG4gICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7XG4gICAgICAgIHdoaWxlICghKG5leHQgPSB1cGRhdGVHcm91cFtpMV0pICYmICsraTEgPCBkYXRhTGVuZ3RoKTtcbiAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlID0gbmV3IFNlbGVjdGlvbih1cGRhdGUsIHBhcmVudHMpO1xuICB1cGRhdGUuX2VudGVyID0gZW50ZXI7XG4gIHVwZGF0ZS5fZXhpdCA9IGV4aXQ7XG4gIHJldHVybiB1cGRhdGU7XG59XG5cbi8vIEdpdmVuIHNvbWUgZGF0YSwgdGhpcyByZXR1cm5zIGFuIGFycmF5LWxpa2UgdmlldyBvZiBpdDogYW4gb2JqZWN0IHRoYXRcbi8vIGV4cG9zZXMgYSBsZW5ndGggcHJvcGVydHkgYW5kIGFsbG93cyBudW1lcmljIGluZGV4aW5nLiBOb3RlIHRoYXQgdW5saWtlXG4vLyBzZWxlY3RBbGwsIHRoaXMgaXNu4oCZdCB3b3JyaWVkIGFib3V0IOKAnGxpdmXigJ0gY29sbGVjdGlvbnMgYmVjYXVzZSB0aGUgcmVzdWx0aW5nXG4vLyBhcnJheSB3aWxsIG9ubHkgYmUgdXNlZCBicmllZmx5IHdoaWxlIGRhdGEgaXMgYmVpbmcgYm91bmQuIChJdCBpcyBwb3NzaWJsZSB0b1xuLy8gY2F1c2UgdGhlIGRhdGEgdG8gY2hhbmdlIHdoaWxlIGl0ZXJhdGluZyBieSB1c2luZyBhIGtleSBmdW5jdGlvbiwgYnV0IHBsZWFzZVxuLy8gZG9u4oCZdDsgd2XigJlkIHJhdGhlciBhdm9pZCBhIGdyYXR1aXRvdXMgY29weS4pXG5mdW5jdGlvbiBhcnJheWxpa2UoZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgXCJsZW5ndGhcIiBpbiBkYXRhXG4gICAgPyBkYXRhIC8vIEFycmF5LCBUeXBlZEFycmF5LCBOb2RlTGlzdCwgYXJyYXktbGlrZVxuICAgIDogQXJyYXkuZnJvbShkYXRhKTsgLy8gTWFwLCBTZXQsIGl0ZXJhYmxlLCBzdHJpbmcsIG9yIGFueXRoaW5nIGVsc2Vcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMucHJvcGVydHkoXCJfX2RhdGFfX1wiLCB2YWx1ZSlcbiAgICAgIDogdGhpcy5ub2RlKCkuX19kYXRhX187XG59XG4iLCJpbXBvcnQgZGVmYXVsdFZpZXcgZnJvbSBcIi4uL3dpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KG5vZGUsIHR5cGUsIHBhcmFtcykge1xuICB2YXIgd2luZG93ID0gZGVmYXVsdFZpZXcobm9kZSksXG4gICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDtcblxuICBpZiAodHlwZW9mIGV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBldmVudCA9IG5ldyBldmVudCh0eXBlLCBwYXJhbXMpO1xuICB9IGVsc2Uge1xuICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgaWYgKHBhcmFtcykgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSksIGV2ZW50LmRldGFpbCA9IHBhcmFtcy5kZXRhaWw7XG4gICAgZWxzZSBldmVudC5pbml0RXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoQ29uc3RhbnQodHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHBhcmFtcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGRpc3BhdGNoRnVuY3Rpb25cbiAgICAgIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMubm9kZSgpO1xufVxuIiwiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZW50ZXIgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEVudGVyTm9kZShwYXJlbnQsIGRhdHVtKSB7XG4gIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50O1xuICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7XG4gIHRoaXMuX25leHQgPSBudWxsO1xuICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuX19kYXRhX18gPSBkYXR1bTtcbn1cblxuRW50ZXJOb2RlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEVudGVyTm9kZSxcbiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSxcbiAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihjaGlsZCwgbmV4dCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7IH0sXG4gIHF1ZXJ5U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH0sXG4gIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH1cbn07XG4iLCJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBtYXRjaGVyIGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHtcbiAgdGhpcy5pbm5lckhUTUwgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiBodG1sQ29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBodG1sUmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBodG1sRnVuY3Rpb25cbiAgICAgICAgICA6IGh0bWxDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7XG59XG4iLCJpbXBvcnQgc2VsZWN0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCBmcm9tIFwiLi9zZWxlY3RDaGlsZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbiBmcm9tIFwiLi9zZWxlY3RDaGlsZHJlbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdGEgZnJvbSBcIi4vZGF0YS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbnRlciBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9leGl0IGZyb20gXCIuL2V4aXQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fam9pbiBmcm9tIFwiLi9qb2luLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29yZGVyIGZyb20gXCIuL29yZGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NvcnQgZnJvbSBcIi4vc29ydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jYWxsIGZyb20gXCIuL2NhbGwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZXMgZnJvbSBcIi4vbm9kZXMuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZSBmcm9tIFwiLi9ub2RlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NpemUgZnJvbSBcIi4vc2l6ZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbXB0eSBmcm9tIFwiLi9lbXB0eS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lYWNoIGZyb20gXCIuL2VhY2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3Byb3BlcnR5IGZyb20gXCIuL3Byb3BlcnR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NsYXNzZWQgZnJvbSBcIi4vY2xhc3NlZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faHRtbCBmcm9tIFwiLi9odG1sLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JhaXNlIGZyb20gXCIuL3JhaXNlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2xvd2VyIGZyb20gXCIuL2xvd2VyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2FwcGVuZCBmcm9tIFwiLi9hcHBlbmQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faW5zZXJ0IGZyb20gXCIuL2luc2VydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9yZW1vdmUgZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Nsb25lIGZyb20gXCIuL2Nsb25lLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdHVtIGZyb20gXCIuL2RhdHVtLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29uIGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Rpc3BhdGNoIGZyb20gXCIuL2Rpc3BhdGNoLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2l0ZXJhdG9yIGZyb20gXCIuL2l0ZXJhdG9yLmpzXCI7XG5cbmV4cG9ydCB2YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdGlvbihncm91cHMsIHBhcmVudHMpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCByb290KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdGlvbigpIHtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblNlbGVjdGlvbi5wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogU2VsZWN0aW9uLFxuICBzZWxlY3Q6IHNlbGVjdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCxcbiAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLFxuICBkYXRhOiBzZWxlY3Rpb25fZGF0YSxcbiAgZW50ZXI6IHNlbGVjdGlvbl9lbnRlcixcbiAgZXhpdDogc2VsZWN0aW9uX2V4aXQsXG4gIGpvaW46IHNlbGVjdGlvbl9qb2luLFxuICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHNlbGVjdGlvbl9zZWxlY3Rpb24sXG4gIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIsXG4gIHNvcnQ6IHNlbGVjdGlvbl9zb3J0LFxuICBjYWxsOiBzZWxlY3Rpb25fY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX25vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fZWFjaCxcbiAgYXR0cjogc2VsZWN0aW9uX2F0dHIsXG4gIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUsXG4gIHByb3BlcnR5OiBzZWxlY3Rpb25fcHJvcGVydHksXG4gIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLFxuICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCxcbiAgaHRtbDogc2VsZWN0aW9uX2h0bWwsXG4gIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsXG4gIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsXG4gIGFwcGVuZDogc2VsZWN0aW9uX2FwcGVuZCxcbiAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LFxuICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUsXG4gIGNsb25lOiBzZWxlY3Rpb25fY2xvbmUsXG4gIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sXG4gIG9uOiBzZWxlY3Rpb25fb24sXG4gIGRpc3BhdGNoOiBzZWxlY3Rpb25fZGlzcGF0Y2gsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25faXRlcmF0b3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNlbGVjdGlvbjtcbiIsImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmZ1bmN0aW9uIGNvbnN0YW50TnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGJlZm9yZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpLFxuICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSBcImZ1bmN0aW9uXCIgPyBiZWZvcmUgOiBzZWxlY3RvcihiZWZvcmUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiooKSB7XG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB5aWVsZCBub2RlO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob25lbnRlciwgb251cGRhdGUsIG9uZXhpdCkge1xuICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksIHVwZGF0ZSA9IHRoaXMsIGV4aXQgPSB0aGlzLmV4aXQoKTtcbiAgaWYgKHR5cGVvZiBvbmVudGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBlbnRlciA9IG9uZW50ZXIoZW50ZXIpO1xuICAgIGlmIChlbnRlcikgZW50ZXIgPSBlbnRlci5zZWxlY3Rpb24oKTtcbiAgfSBlbHNlIHtcbiAgICBlbnRlciA9IGVudGVyLmFwcGVuZChvbmVudGVyICsgXCJcIik7XG4gIH1cbiAgaWYgKG9udXBkYXRlICE9IG51bGwpIHtcbiAgICB1cGRhdGUgPSBvbnVwZGF0ZSh1cGRhdGUpO1xuICAgIGlmICh1cGRhdGUpIHVwZGF0ZSA9IHVwZGF0ZS5zZWxlY3Rpb24oKTtcbiAgfVxuICBpZiAob25leGl0ID09IG51bGwpIGV4aXQucmVtb3ZlKCk7IGVsc2Ugb25leGl0KGV4aXQpO1xuICByZXR1cm4gZW50ZXIgJiYgdXBkYXRlID8gZW50ZXIubWVyZ2UodXBkYXRlKS5vcmRlcigpIDogdXBkYXRlO1xufVxuIiwiZnVuY3Rpb24gbG93ZXIoKSB7XG4gIGlmICh0aGlzLnByZXZpb3VzU2libGluZykgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLCB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKGxvd2VyKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHZhciBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0O1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSBzZWxlY3Rpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldO1xuICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMpO1xufVxuIiwiZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIHJldHVybiBmdW5jdGlvbihldmVudCkge1xuICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQsIHRoaXMuX19kYXRhX18pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uID0gdGhpcy5fX29uO1xuICAgIGlmICghb24pIHJldHVybjtcbiAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uWysraV0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO1xuICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyKHZhbHVlKTtcbiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAoKG8gPSBvbltqXSkudHlwZSA9PT0gdHlwZW5hbWUudHlwZSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLm9wdGlvbnMgPSBvcHRpb25zKTtcbiAgICAgICAgby52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlbmFtZS50eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5lciwgb3B0aW9uczogb3B0aW9uc307XG4gICAgaWYgKCFvbikgdGhpcy5fX29uID0gW29dO1xuICAgIGVsc2Ugb24ucHVzaChvKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIpLCBpLCBuID0gdHlwZW5hbWVzLmxlbmd0aCwgdDtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAoaSA9IDAsIG8gPSBvbltqXTsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkge1xuICAgICAgICAgIHJldHVybiBvLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIG9uID0gdmFsdWUgPyBvbkFkZCA6IG9uUmVtb3ZlO1xuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgb3B0aW9ucykpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7KSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGlmIChuZXh0ICYmIG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dCkgXiA0KSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpO1xuICAgICAgICBuZXh0ID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImZ1bmN0aW9uIHByb3BlcnR5UmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzW25hbWVdID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICBlbHNlIHRoaXNbbmFtZV0gPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBwcm9wZXJ0eUZ1bmN0aW9uXG4gICAgICAgICAgOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpW25hbWVdO1xufVxuIiwiZnVuY3Rpb24gcmFpc2UoKSB7XG4gIGlmICh0aGlzLm5leHRTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlKTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgYXJyYXkgZnJvbSBcIi4uL2FycmF5LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3JBbGwgZnJvbSBcIi4uL3NlbGVjdG9yQWxsLmpzXCI7XG5cbmZ1bmN0aW9uIGFycmF5QWxsKHNlbGVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGFycmF5KHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ID09PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IGFycmF5QWxsKHNlbGVjdCk7XG4gIGVsc2Ugc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzdWJncm91cHMucHVzaChzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCBwYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmluZCA9IEFycmF5LnByb3RvdHlwZS5maW5kO1xuXG5mdW5jdGlvbiBjaGlsZEZpbmQobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaW5kLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjaGlsZEZpcnN0KCkge1xuICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KG1hdGNoID09IG51bGwgPyBjaGlsZEZpcnN0XG4gICAgICA6IGNoaWxkRmluZCh0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaWx0ZXIgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyO1xuXG5mdW5jdGlvbiBjaGlsZHJlbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbik7XG59XG5cbmZ1bmN0aW9uIGNoaWxkcmVuRmlsdGVyKG1hdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3RBbGwobWF0Y2ggPT0gbnVsbCA/IGNoaWxkcmVuXG4gICAgICA6IGNoaWxkcmVuRmlsdGVyKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykgKytzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiBzaXplO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbXBhcmUpIHtcbiAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nO1xuXG4gIGZ1bmN0aW9uIGNvbXBhcmVOb2RlKGEsIGIpIHtcbiAgICByZXR1cm4gYSAmJiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7XG4gIH1cblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzb3J0Z3JvdXAgPSBzb3J0Z3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzb3J0Z3JvdXBzLCB0aGlzLl9wYXJlbnRzKS5vcmRlcigpO1xufVxuXG5mdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih1cGRhdGUpIHtcbiAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTtcbn1cbiIsImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHN0eWxlRnVuY3Rpb25cbiAgICAgICAgICAgIDogc3R5bGVDb25zdGFudCkobmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKVxuICAgICAgOiBzdHlsZVZhbHVlKHRoaXMubm9kZSgpLCBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0eWxlVmFsdWUobm9kZSwgbmFtZSkge1xuICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpXG4gICAgICB8fCBkZWZhdWx0Vmlldyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkge1xuICB0aGlzLnRleHRDb250ZW50ID0gXCJcIjtcbn1cblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHRleHRSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRleHRGdW5jdGlvblxuICAgICAgICAgIDogdGV4dENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50O1xufVxuIiwiZnVuY3Rpb24gbm9uZSgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiZnVuY3Rpb24gZW1wdHkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBlbXB0eSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgbGV0IHNvdXJjZUV2ZW50O1xuICB3aGlsZSAoc291cmNlRXZlbnQgPSBldmVudC5zb3VyY2VFdmVudCkgZXZlbnQgPSBzb3VyY2VFdmVudDtcbiAgcmV0dXJuIGV2ZW50O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSkge1xuICByZXR1cm4gKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIC8vIG5vZGUgaXMgYSBOb2RlXG4gICAgICB8fCAobm9kZS5kb2N1bWVudCAmJiBub2RlKSAvLyBub2RlIGlzIGEgV2luZG93XG4gICAgICB8fCBub2RlLmRlZmF1bHRWaWV3OyAvLyBub2RlIGlzIGEgRG9jdW1lbnRcbn1cbiIsImltcG9ydCB7VGltZXJ9IGZyb20gXCIuL3RpbWVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgZGVsYXkgPSBkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheTtcbiAgdC5yZXN0YXJ0KGVsYXBzZWQgPT4ge1xuICAgIHQuc3RvcCgpO1xuICAgIGNhbGxiYWNrKGVsYXBzZWQgKyBkZWxheSk7XG4gIH0sIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG4iLCJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7XG4gICAgdCA9IHQuX25leHQ7XG4gIH1cbiAgLS1mcmFtZTtcbn1cblxuZnVuY3Rpb24gd2FrZSgpIHtcbiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3O1xuICBmcmFtZSA9IHRpbWVvdXQgPSAwO1xuICB0cnkge1xuICAgIHRpbWVyRmx1c2goKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcmFtZSA9IDA7XG4gICAgbmFwKCk7XG4gICAgY2xvY2tOb3cgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBva2UoKSB7XG4gIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7XG4gIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7XG59XG5cbmZ1bmN0aW9uIG5hcCgpIHtcbiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5O1xuICB3aGlsZSAodDEpIHtcbiAgICBpZiAodDEuX2NhbGwpIHtcbiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTtcbiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDtcbiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjtcbiAgICB9XG4gIH1cbiAgdGFza1RhaWwgPSB0MDtcbiAgc2xlZXAodGltZSk7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHtcbiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuXG4gIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LlxuICBpZiAoZGVsYXkgPiAyNCkge1xuICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAtIGNsb2NrU2tldyk7XG4gICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7XG4gICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5pbXBvcnQge1NDSEVEVUxFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG52YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSkge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICBzY2hlZHVsZSxcbiAgICAgIGk7XG5cbiAgaWYgKHNjaGVkdWxlcykge1xuICAgIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG4gICAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkuc3RhdGUgPiBTQ0hFRFVMRUQgJiYgc2NoZWR1bGUubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oW1tub2RlXV0sIHJvb3QsIG5hbWUsICtpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsImltcG9ydCBcIi4vc2VsZWN0aW9uL2luZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdHJhbnNpdGlvbn0gZnJvbSBcIi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGFjdGl2ZX0gZnJvbSBcIi4vYWN0aXZlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJydXB0fSBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbiIsImltcG9ydCB7U1RBUlRJTkcsIEVORElORywgRU5ERUR9IGZyb20gXCIuL3RyYW5zaXRpb24vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSkge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICBzY2hlZHVsZSxcbiAgICAgIGFjdGl2ZSxcbiAgICAgIGVtcHR5ID0gdHJ1ZSxcbiAgICAgIGk7XG5cbiAgaWYgKCFzY2hlZHVsZXMpIHJldHVybjtcblxuICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuXG4gIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5uYW1lICE9PSBuYW1lKSB7IGVtcHR5ID0gZmFsc2U7IGNvbnRpbnVlOyB9XG4gICAgYWN0aXZlID0gc2NoZWR1bGUuc3RhdGUgPiBTVEFSVElORyAmJiBzY2hlZHVsZS5zdGF0ZSA8IEVORElORztcbiAgICBzY2hlZHVsZS5zdGF0ZSA9IEVOREVEO1xuICAgIHNjaGVkdWxlLnRpbWVyLnN0b3AoKTtcbiAgICBzY2hlZHVsZS5vbi5jYWxsKGFjdGl2ZSA/IFwiaW50ZXJydXB0XCIgOiBcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gIH1cblxuICBpZiAoZW1wdHkpIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbn1cbiIsImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ludGVycnVwdCBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5cbnNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDtcbnNlbGVjdGlvbi5wcm90b3R5cGUudHJhbnNpdGlvbiA9IHNlbGVjdGlvbl90cmFuc2l0aW9uO1xuIiwiaW1wb3J0IGludGVycnVwdCBmcm9tIFwiLi4vaW50ZXJydXB0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4uL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHtlYXNlQ3ViaWNJbk91dH0gZnJvbSBcImQzLWVhc2VcIjtcbmltcG9ydCB7bm93fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGRlZmF1bHRUaW1pbmcgPSB7XG4gIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuXG4gIGRlbGF5OiAwLFxuICBkdXJhdGlvbjogMjUwLFxuICBlYXNlOiBlYXNlQ3ViaWNJbk91dFxufTtcblxuZnVuY3Rpb24gaW5oZXJpdChub2RlLCBpZCkge1xuICB2YXIgdGltaW5nO1xuICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkge1xuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zaXRpb24gJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aW1pbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGlkLFxuICAgICAgdGltaW5nO1xuXG4gIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikge1xuICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lO1xuICB9IGVsc2Uge1xuICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtU3ZnIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGUuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKSwgaSA9IGZ1bGxuYW1lID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHRoaXMuYXR0clR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKShmdWxsbmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcImF0dHIuXCIgKyBuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKShmdWxsbmFtZSlcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2VlbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGtleSA9IFwiYXR0ci5cIiArIG5hbWU7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkZWxheUZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVsYXlDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkZWxheUZ1bmN0aW9uXG4gICAgICAgICAgOiBkZWxheUNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kZWxheTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGR1cmF0aW9uRnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGR1cmF0aW9uQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkdXJhdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgOiBkdXJhdGlvbkNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kdXJhdGlvbjtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKGVhc2VDb25zdGFudChpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5lYXNlO1xufVxuIiwiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VWYXJ5aW5nKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh0eXBlb2YgdiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLmVhY2goZWFzZVZhcnlpbmcodGhpcy5faWQsIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBvbjAsIG9uMSwgdGhhdCA9IHRoaXMsIGlkID0gdGhhdC5faWQsIHNpemUgPSB0aGF0LnNpemUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBjYW5jZWwgPSB7dmFsdWU6IHJlamVjdH0sXG4gICAgICAgIGVuZCA9IHt2YWx1ZTogZnVuY3Rpb24oKSB7IGlmICgtLXNpemUgPT09IDApIHJlc29sdmUoKTsgfX07XG5cbiAgICB0aGF0LmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgICBpZiAob24gIT09IG9uMCkge1xuICAgICAgICBvbjEgPSAob24wID0gb24pLmNvcHkoKTtcbiAgICAgICAgb24xLl8uY2FuY2VsLnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uaW50ZXJydXB0LnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uZW5kLnB1c2goZW5kKTtcbiAgICAgIH1cblxuICAgICAgc2NoZWR1bGUub24gPSBvbjE7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgc2VsZWN0aW9uIHdhcyBlbXB0eSwgcmVzb2x2ZSBlbmQgaW1tZWRpYXRlbHlcbiAgICBpZiAoc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7bWF0Y2hlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHIgZnJvbSBcIi4vYXR0ci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0clR3ZWVuIGZyb20gXCIuL2F0dHJUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZGVsYXkgZnJvbSBcIi4vZGVsYXkuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2R1cmF0aW9uIGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlIGZyb20gXCIuL2Vhc2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nIGZyb20gXCIuL2Vhc2VWYXJ5aW5nLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9tZXJnZSBmcm9tIFwiLi9tZXJnZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdEFsbCBmcm9tIFwiLi9zZWxlY3RBbGwuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdGlvbiBmcm9tIFwiLi9zZWxlY3Rpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zdHlsZVR3ZWVuIGZyb20gXCIuL3N0eWxlVHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dFR3ZWVuIGZyb20gXCIuL3RleHRUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90d2VlbiBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZW5kIGZyb20gXCIuL2VuZC5qc1wiO1xuXG52YXIgaWQgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7XG4gIHRoaXMuX2dyb3VwcyA9IGdyb3VwcztcbiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG4gIHRoaXMuX25hbWUgPSBuYW1lO1xuICB0aGlzLl9pZCA9IGlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2l0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHNlbGVjdGlvbigpLnRyYW5zaXRpb24obmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdJZCgpIHtcbiAgcmV0dXJuICsraWQ7XG59XG5cbnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZTtcblxuVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB0cmFuc2l0aW9uLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sXG4gIHNlbGVjdDogdHJhbnNpdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwsXG4gIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3Byb3RvdHlwZS5zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiB0cmFuc2l0aW9uX2ZpbHRlcixcbiAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogdHJhbnNpdGlvbl9zZWxlY3Rpb24sXG4gIHRyYW5zaXRpb246IHRyYW5zaXRpb25fdHJhbnNpdGlvbixcbiAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fcHJvdG90eXBlLmVtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fcHJvdG90eXBlLmVhY2gsXG4gIG9uOiB0cmFuc2l0aW9uX29uLFxuICBhdHRyOiB0cmFuc2l0aW9uX2F0dHIsXG4gIGF0dHJUd2VlbjogdHJhbnNpdGlvbl9hdHRyVHdlZW4sXG4gIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLFxuICBzdHlsZVR3ZWVuOiB0cmFuc2l0aW9uX3N0eWxlVHdlZW4sXG4gIHRleHQ6IHRyYW5zaXRpb25fdGV4dCxcbiAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbixcbiAgcmVtb3ZlOiB0cmFuc2l0aW9uX3JlbW92ZSxcbiAgdHdlZW46IHRyYW5zaXRpb25fdHdlZW4sXG4gIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LFxuICBkdXJhdGlvbjogdHJhbnNpdGlvbl9kdXJhdGlvbixcbiAgZWFzZTogdHJhbnNpdGlvbl9lYXNlLFxuICBlYXNlVmFyeWluZzogdHJhbnNpdGlvbl9lYXNlVmFyeWluZyxcbiAgZW5kOiB0cmFuc2l0aW9uX2VuZCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXVxufTtcbiIsImltcG9ydCB7Y29sb3J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZU51bWJlciwgaW50ZXJwb2xhdGVSZ2IsIGludGVycG9sYXRlU3RyaW5nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYztcbiAgcmV0dXJuICh0eXBlb2YgYiA9PT0gXCJudW1iZXJcIiA/IGludGVycG9sYXRlTnVtYmVyXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IGludGVycG9sYXRlUmdiXG4gICAgICA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYilcbiAgICAgIDogaW50ZXJwb2xhdGVTdHJpbmcpKGEsIGIpO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0cmFuc2l0aW9uKSB7XG4gIGlmICh0cmFuc2l0aW9uLl9pZCAhPT0gdGhpcy5faWQpIHRocm93IG5ldyBFcnJvcjtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gdHJhbnNpdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBzdGFydChuYW1lKSB7XG4gIHJldHVybiAobmFtZSArIFwiXCIpLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykuZXZlcnkoZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICByZXR1cm4gIXQgfHwgdCA9PT0gXCJzdGFydFwiO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG9uMCwgb24xLCBzaXQgPSBzdGFydChuYW1lKSA/IGluaXQgOiBzZXQ7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzaXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wKSAob24xID0gKG9uMCA9IG9uKS5jb3B5KCkpLm9uKG5hbWUsIGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDJcbiAgICAgID8gZ2V0KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSlcbiAgICAgIDogdGhpcy5lYWNoKG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSk7XG59XG4iLCJmdW5jdGlvbiByZW1vdmVGdW5jdGlvbihpZCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMub24oXCJlbmQucmVtb3ZlXCIsIHJlbW92ZUZ1bmN0aW9uKHRoaXMuX2lkKSk7XG59XG4iLCJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7dGltZXIsIHRpbWVvdXR9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZW1wdHlPbiA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJlbmRcIiwgXCJjYW5jZWxcIiwgXCJpbnRlcnJ1cHRcIik7XG52YXIgZW1wdHlUd2VlbiA9IFtdO1xuXG5leHBvcnQgdmFyIENSRUFURUQgPSAwO1xuZXhwb3J0IHZhciBTQ0hFRFVMRUQgPSAxO1xuZXhwb3J0IHZhciBTVEFSVElORyA9IDI7XG5leHBvcnQgdmFyIFNUQVJURUQgPSAzO1xuZXhwb3J0IHZhciBSVU5OSU5HID0gNDtcbmV4cG9ydCB2YXIgRU5ESU5HID0gNTtcbmV4cG9ydCB2YXIgRU5ERUQgPSA2O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uO1xuICBpZiAoIXNjaGVkdWxlcykgbm9kZS5fX3RyYW5zaXRpb24gPSB7fTtcbiAgZWxzZSBpZiAoaWQgaW4gc2NoZWR1bGVzKSByZXR1cm47XG4gIGNyZWF0ZShub2RlLCBpZCwge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgaW5kZXg6IGluZGV4LCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suXG4gICAgZ3JvdXA6IGdyb3VwLCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suXG4gICAgb246IGVtcHR5T24sXG4gICAgdHdlZW46IGVtcHR5VHdlZW4sXG4gICAgdGltZTogdGltaW5nLnRpbWUsXG4gICAgZGVsYXk6IHRpbWluZy5kZWxheSxcbiAgICBkdXJhdGlvbjogdGltaW5nLmR1cmF0aW9uLFxuICAgIGVhc2U6IHRpbWluZy5lYXNlLFxuICAgIHRpbWVyOiBudWxsLFxuICAgIHN0YXRlOiBDUkVBVEVEXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBnZXQobm9kZSwgaWQpO1xuICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBDUkVBVEVEKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBnZXQobm9kZSwgaWQpO1xuICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBTVEFSVEVEKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBydW5uaW5nXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcihcInRyYW5zaXRpb24gbm90IGZvdW5kXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZShub2RlLCBpZCwgc2VsZikge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICB0d2VlbjtcblxuICAvLyBJbml0aWFsaXplIHRoZSBzZWxmIHRpbWVyIHdoZW4gdGhlIHRyYW5zaXRpb24gaXMgY3JlYXRlZC5cbiAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shXG4gIHNjaGVkdWxlc1tpZF0gPSBzZWxmO1xuICBzZWxmLnRpbWVyID0gdGltZXIoc2NoZWR1bGUsIDAsIHNlbGYudGltZSk7XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGUoZWxhcHNlZCkge1xuICAgIHNlbGYuc3RhdGUgPSBTQ0hFRFVMRUQ7XG4gICAgc2VsZi50aW1lci5yZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuXG4gICAgLy8gSWYgdGhlIGVsYXBzZWQgZGVsYXkgaXMgbGVzcyB0aGFuIG91ciBmaXJzdCBzbGVlcCwgc3RhcnQgaW1tZWRpYXRlbHkuXG4gICAgaWYgKHNlbGYuZGVsYXkgPD0gZWxhcHNlZCkgc3RhcnQoZWxhcHNlZCAtIHNlbGYuZGVsYXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkge1xuICAgIHZhciBpLCBqLCBuLCBvO1xuXG4gICAgLy8gSWYgdGhlIHN0YXRlIGlzIG5vdCBTQ0hFRFVMRUQsIHRoZW4gd2UgcHJldmlvdXNseSBlcnJvcmVkIG9uIHN0YXJ0LlxuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTQ0hFRFVMRUQpIHJldHVybiBzdG9wKCk7XG5cbiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgICBvID0gc2NoZWR1bGVzW2ldO1xuICAgICAgaWYgKG8ubmFtZSAhPT0gc2VsZi5uYW1lKSBjb250aW51ZTtcblxuICAgICAgLy8gV2hpbGUgdGhpcyBlbGVtZW50IGFscmVhZHkgaGFzIGEgc3RhcnRpbmcgdHJhbnNpdGlvbiBkdXJpbmcgdGhpcyBmcmFtZSxcbiAgICAgIC8vIGRlZmVyIHN0YXJ0aW5nIGFuIGludGVycnVwdGluZyB0cmFuc2l0aW9uIHVudGlsIHRoYXQgdHJhbnNpdGlvbiBoYXMgYVxuICAgICAgLy8gY2hhbmNlIHRvIHRpY2sgKGFuZCBwb3NzaWJseSBlbmQpOyBzZWUgZDMvZDMtdHJhbnNpdGlvbiM1NCFcbiAgICAgIGlmIChvLnN0YXRlID09PSBTVEFSVEVEKSByZXR1cm4gdGltZW91dChzdGFydCk7XG5cbiAgICAgIC8vIEludGVycnVwdCB0aGUgYWN0aXZlIHRyYW5zaXRpb24sIGlmIGFueS5cbiAgICAgIGlmIChvLnN0YXRlID09PSBSVU5OSU5HKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImludGVycnVwdFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FuY2VsIGFueSBwcmUtZW1wdGVkIHRyYW5zaXRpb25zLlxuICAgICAgZWxzZSBpZiAoK2kgPCBpZCkge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJjYW5jZWxcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVmZXIgdGhlIGZpcnN0IHRpY2sgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lOyBzZWUgZDMvZDMjMTU3Ni5cbiAgICAvLyBOb3RlIHRoZSB0cmFuc2l0aW9uIG1heSBiZSBjYW5jZWxlZCBhZnRlciBzdGFydCBhbmQgYmVmb3JlIHRoZSBmaXJzdCB0aWNrIVxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUgZDMvZDMtdHJhbnNpdGlvbiMxNiFcbiAgICAvLyBBc3N1bWluZyB0aGlzIGlzIHN1Y2Nlc3NmdWwsIHN1YnNlcXVlbnQgY2FsbGJhY2tzIGdvIHN0cmFpZ2h0IHRvIHRpY2suXG4gICAgdGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChzZWxmLnN0YXRlID09PSBTVEFSVEVEKSB7XG4gICAgICAgIHNlbGYuc3RhdGUgPSBSVU5OSU5HO1xuICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcbiAgICAgICAgdGljayhlbGFwc2VkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC5cbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLlxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVElORztcbiAgICBzZWxmLm9uLmNhbGwoXCJzdGFydFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU1RBUlRJTkcpIHJldHVybjsgLy8gaW50ZXJydXB0ZWRcbiAgICBzZWxmLnN0YXRlID0gU1RBUlRFRDtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLlxuICAgIHR3ZWVuID0gbmV3IEFycmF5KG4gPSBzZWxmLnR3ZWVuLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgaiA9IC0xOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkge1xuICAgICAgICB0d2VlblsrK2pdID0gbztcbiAgICAgIH1cbiAgICB9XG4gICAgdHdlZW4ubGVuZ3RoID0gaiArIDE7XG4gIH1cblxuICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHtcbiAgICB2YXIgdCA9IGVsYXBzZWQgPCBzZWxmLmR1cmF0aW9uID8gc2VsZi5lYXNlLmNhbGwobnVsbCwgZWxhcHNlZCAvIHNlbGYuZHVyYXRpb24pIDogKHNlbGYudGltZXIucmVzdGFydChzdG9wKSwgc2VsZi5zdGF0ZSA9IEVORElORywgMSksXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICB0d2VlbltpXS5jYWxsKG5vZGUsIHQpO1xuICAgIH1cblxuICAgIC8vIERpc3BhdGNoIHRoZSBlbmQgZXZlbnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgPT09IEVORElORykge1xuICAgICAgc2VsZi5vbi5jYWxsKFwiZW5kXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgICAgc3RvcCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgc2VsZi5zdGF0ZSA9IEVOREVEO1xuICAgIHNlbGYudGltZXIuc3RvcCgpO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdO1xuICAgIGZvciAodmFyIGkgaW4gc2NoZWR1bGVzKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7c2VsZWN0b3J9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBpZCwgaSwgc3ViZ3JvdXAsIGdldChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0b3JBbGx9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSwgY2hpbGQsIGluaGVyaXQgPSBnZXQobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykge1xuICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7XG4gICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxudmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9ncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3N0eWxlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZU51bGwobmFtZSwgaW50ZXJwb2xhdGUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICBzdHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgc3RyaW5nMTAgPSBzdHJpbmcxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSxcbiAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSBzdHJpbmcxID0gdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlTWF5YmVSZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIG9uMCwgb24xLCBsaXN0ZW5lcjAsIGtleSA9IFwic3R5bGUuXCIgKyBuYW1lLCBldmVudCA9IFwiZW5kLlwiICsga2V5LCByZW1vdmU7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uLFxuICAgICAgICBsaXN0ZW5lciA9IHNjaGVkdWxlLnZhbHVlW2tleV0gPT0gbnVsbCA/IHJlbW92ZSB8fCAocmVtb3ZlID0gc3R5bGVSZW1vdmUobmFtZSkpIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wIHx8IGxpc3RlbmVyMCAhPT0gbGlzdGVuZXIpIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24oZXZlbnQsIGxpc3RlbmVyMCA9IGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGkgPSAobmFtZSArPSBcIlwiKSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVOdWxsKG5hbWUsIGkpKVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgc3R5bGVSZW1vdmUobmFtZSkpXG4gICAgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlRnVuY3Rpb24obmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcInN0eWxlLlwiICsgbmFtZSwgdmFsdWUpKSlcbiAgICAgIC5lYWNoKHN0eWxlTWF5YmVSZW1vdmUodGhpcy5faWQsIG5hbWUpKVxuICAgIDogdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVDb25zdGFudChuYW1lLCBpLCB2YWx1ZSksIHByaW9yaXR5KVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgbnVsbCk7XG59XG4iLCJmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIHQsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0ID0gKGkwID0gaSkgJiYgc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSk7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBrZXkgPSBcInN0eWxlLlwiICsgKG5hbWUgKz0gXCJcIik7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSk7XG59XG4iLCJpbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWUxID09IG51bGwgPyBcIlwiIDogdmFsdWUxO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdGhpcy50d2VlbihcInRleHRcIiwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gdGV4dEZ1bmN0aW9uKHR3ZWVuVmFsdWUodGhpcywgXCJ0ZXh0XCIsIHZhbHVlKSlcbiAgICAgIDogdGV4dENvbnN0YW50KHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiKSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUoaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRUd2Vlbih2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZShpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGtleSA9IFwidGV4dFwiO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgdGV4dFR3ZWVuKHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQwID0gdGhpcy5faWQsXG4gICAgICBpZDEgPSBuZXdJZCgpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHZhciBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkMCk7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHtcbiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBkZWxheTogMCxcbiAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHR3ZWVuUmVtb3ZlKGlkLCBuYW1lKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSB0d2VlbjAgPSB0d2VlbjtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjEgPSB0d2VlbjEuc2xpY2UoKTtcbiAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHR3ZWVuRnVuY3Rpb24oaWQsIG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpO1xuICAgICAgZm9yICh2YXIgdCA9IHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9LCBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xW2ldID0gdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPT09IG4pIHR3ZWVuMS5wdXNoKHQpO1xuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICBuYW1lICs9IFwiXCI7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIHR3ZWVuID0gZ2V0KHRoaXMubm9kZSgpLCBpZCkudHdlZW47XG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2Vlbi5sZW5ndGgsIHQ7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgodCA9IHR3ZWVuW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiB0LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHdlZW5WYWx1ZSh0cmFuc2l0aW9uLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0cmFuc2l0aW9uLl9pZDtcblxuICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKTtcbiAgICAoc2NoZWR1bGUudmFsdWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIGdldChub2RlLCBpZCkudmFsdWVbbmFtZV07XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBab29tRXZlbnQodHlwZSwge1xuICBzb3VyY2VFdmVudCxcbiAgdGFyZ2V0LFxuICB0cmFuc2Zvcm0sXG4gIGRpc3BhdGNoXG59KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICB0eXBlOiB7dmFsdWU6IHR5cGUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgc291cmNlRXZlbnQ6IHt2YWx1ZTogc291cmNlRXZlbnQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgdGFyZ2V0OiB7dmFsdWU6IHRhcmdldCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0cmFuc2Zvcm06IHt2YWx1ZTogdHJhbnNmb3JtLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIF86IHt2YWx1ZTogZGlzcGF0Y2h9XG4gIH0pO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIHpvb219IGZyb20gXCIuL3pvb20uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB6b29tVHJhbnNmb3JtLCBpZGVudGl0eSBhcyB6b29tSWRlbnRpdHksIFRyYW5zZm9ybSBhcyBab29tVHJhbnNmb3JtfSBmcm9tIFwiLi90cmFuc2Zvcm0uanNcIjtcbiIsImV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkge1xuICB0aGlzLmsgPSBrO1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLFxuICBzY2FsZTogZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBrID09PSAxID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rICogaywgdGhpcy54LCB0aGlzLnkpO1xuICB9LFxuICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICByZXR1cm4gW3BvaW50WzBdICogdGhpcy5rICsgdGhpcy54LCBwb2ludFsxXSAqIHRoaXMuayArIHRoaXMueV07XG4gIH0sXG4gIGFwcGx5WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54O1xuICB9LFxuICBhcHBseVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbihsb2NhdGlvbikge1xuICAgIHJldHVybiBbKGxvY2F0aW9uWzBdIC0gdGhpcy54KSAvIHRoaXMuaywgKGxvY2F0aW9uWzFdIC0gdGhpcy55KSAvIHRoaXMua107XG4gIH0sXG4gIGludmVydFg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rO1xuICB9LFxuICBpbnZlcnRZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuaztcbiAgfSxcbiAgcmVzY2FsZVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geC5jb3B5KCkuZG9tYWluKHgucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLCB0aGlzKS5tYXAoeC5pbnZlcnQsIHgpKTtcbiAgfSxcbiAgcmVzY2FsZVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHRoaXMueCArIFwiLFwiICsgdGhpcy55ICsgXCIpIHNjYWxlKFwiICsgdGhpcy5rICsgXCIpXCI7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSBuZXcgVHJhbnNmb3JtKDEsIDAsIDApO1xuXG50cmFuc2Zvcm0ucHJvdG90eXBlID0gVHJhbnNmb3JtLnByb3RvdHlwZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUpIHtcbiAgd2hpbGUgKCFub2RlLl9fem9vbSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIG5vZGUuX196b29tO1xufVxuIiwiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge2RyYWdEaXNhYmxlLCBkcmFnRW5hYmxlfSBmcm9tIFwiZDMtZHJhZ1wiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZVpvb219IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtzZWxlY3QsIHBvaW50ZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7aW50ZXJydXB0fSBmcm9tIFwiZDMtdHJhbnNpdGlvblwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgWm9vbUV2ZW50IGZyb20gXCIuL2V2ZW50LmpzXCI7XG5pbXBvcnQge1RyYW5zZm9ybSwgaWRlbnRpdHl9IGZyb20gXCIuL3RyYW5zZm9ybS5qc1wiO1xuaW1wb3J0IG5vZXZlbnQsIHtub3Byb3BhZ2F0aW9ufSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbi8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LlxuLy8gZXhjZXB0IGZvciBwaW5jaC10by16b29tLCB3aGljaCBpcyBzZW50IGFzIGEgd2hlZWwrY3RybEtleSBldmVudFxuZnVuY3Rpb24gZGVmYXVsdEZpbHRlcihldmVudCkge1xuICByZXR1cm4gKCFldmVudC5jdHJsS2V5IHx8IGV2ZW50LnR5cGUgPT09ICd3aGVlbCcpICYmICFldmVudC5idXR0b247XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRFeHRlbnQoKSB7XG4gIHZhciBlID0gdGhpcztcbiAgaWYgKGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7XG4gICAgZSA9IGUub3duZXJTVkdFbGVtZW50IHx8IGU7XG4gICAgaWYgKGUuaGFzQXR0cmlidXRlKFwidmlld0JveFwiKSkge1xuICAgICAgZSA9IGUudmlld0JveC5iYXNlVmFsO1xuICAgICAgcmV0dXJuIFtbZS54LCBlLnldLCBbZS54ICsgZS53aWR0aCwgZS55ICsgZS5oZWlnaHRdXTtcbiAgICB9XG4gICAgcmV0dXJuIFtbMCwgMF0sIFtlLndpZHRoLmJhc2VWYWwudmFsdWUsIGUuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTtcbiAgfVxuICByZXR1cm4gW1swLCAwXSwgW2UuY2xpZW50V2lkdGgsIGUuY2xpZW50SGVpZ2h0XV07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUcmFuc2Zvcm0oKSB7XG4gIHJldHVybiB0aGlzLl9fem9vbSB8fCBpZGVudGl0eTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFdoZWVsRGVsdGEoZXZlbnQpIHtcbiAgcmV0dXJuIC1ldmVudC5kZWx0YVkgKiAoZXZlbnQuZGVsdGFNb2RlID09PSAxID8gMC4wNSA6IGV2ZW50LmRlbHRhTW9kZSA/IDEgOiAwLjAwMikgKiAoZXZlbnQuY3RybEtleSA/IDEwIDogMSk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUb3VjaGFibGUoKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgKFwib250b3VjaHN0YXJ0XCIgaW4gdGhpcyk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb25zdHJhaW4odHJhbnNmb3JtLCBleHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkge1xuICB2YXIgZHgwID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzBdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFswXVswXSxcbiAgICAgIGR4MSA9IHRyYW5zZm9ybS5pbnZlcnRYKGV4dGVudFsxXVswXSkgLSB0cmFuc2xhdGVFeHRlbnRbMV1bMF0sXG4gICAgICBkeTAgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMF1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzFdLFxuICAgICAgZHkxID0gdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzFdWzFdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVsxXTtcbiAgcmV0dXJuIHRyYW5zZm9ybS50cmFuc2xhdGUoXG4gICAgZHgxID4gZHgwID8gKGR4MCArIGR4MSkgLyAyIDogTWF0aC5taW4oMCwgZHgwKSB8fCBNYXRoLm1heCgwLCBkeDEpLFxuICAgIGR5MSA+IGR5MCA/IChkeTAgKyBkeTEpIC8gMiA6IE1hdGgubWluKDAsIGR5MCkgfHwgTWF0aC5tYXgoMCwgZHkxKVxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIsXG4gICAgICBleHRlbnQgPSBkZWZhdWx0RXh0ZW50LFxuICAgICAgY29uc3RyYWluID0gZGVmYXVsdENvbnN0cmFpbixcbiAgICAgIHdoZWVsRGVsdGEgPSBkZWZhdWx0V2hlZWxEZWx0YSxcbiAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUsXG4gICAgICBzY2FsZUV4dGVudCA9IFswLCBJbmZpbml0eV0sXG4gICAgICB0cmFuc2xhdGVFeHRlbnQgPSBbWy1JbmZpbml0eSwgLUluZmluaXR5XSwgW0luZmluaXR5LCBJbmZpbml0eV1dLFxuICAgICAgZHVyYXRpb24gPSAyNTAsXG4gICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlWm9vbSxcbiAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJ6b29tXCIsIFwiZW5kXCIpLFxuICAgICAgdG91Y2hzdGFydGluZyxcbiAgICAgIHRvdWNoZmlyc3QsXG4gICAgICB0b3VjaGVuZGluZyxcbiAgICAgIHRvdWNoRGVsYXkgPSA1MDAsXG4gICAgICB3aGVlbERlbGF5ID0gMTUwLFxuICAgICAgY2xpY2tEaXN0YW5jZTIgPSAwLFxuICAgICAgdGFwRGlzdGFuY2UgPSAxMDtcblxuICBmdW5jdGlvbiB6b29tKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvblxuICAgICAgICAucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSlcbiAgICAgICAgLm9uKFwid2hlZWwuem9vbVwiLCB3aGVlbGVkLCB7cGFzc2l2ZTogZmFsc2V9KVxuICAgICAgICAub24oXCJtb3VzZWRvd24uem9vbVwiLCBtb3VzZWRvd25lZClcbiAgICAgICAgLm9uKFwiZGJsY2xpY2suem9vbVwiLCBkYmxjbGlja2VkKVxuICAgICAgLmZpbHRlcih0b3VjaGFibGUpXG4gICAgICAgIC5vbihcInRvdWNoc3RhcnQuem9vbVwiLCB0b3VjaHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS56b29tXCIsIHRvdWNobW92ZWQpXG4gICAgICAgIC5vbihcInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbVwiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIiwgXCJyZ2JhKDAsMCwwLDApXCIpO1xuICB9XG5cbiAgem9vbS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCkge1xuICAgIHZhciBzZWxlY3Rpb24gPSBjb2xsZWN0aW9uLnNlbGVjdGlvbiA/IGNvbGxlY3Rpb24uc2VsZWN0aW9uKCkgOiBjb2xsZWN0aW9uO1xuICAgIHNlbGVjdGlvbi5wcm9wZXJ0eShcIl9fem9vbVwiLCBkZWZhdWx0VHJhbnNmb3JtKTtcbiAgICBpZiAoY29sbGVjdGlvbiAhPT0gc2VsZWN0aW9uKSB7XG4gICAgICBzY2hlZHVsZShjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGlvbi5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICAuZXZlbnQoZXZlbnQpXG4gICAgICAgICAgLnN0YXJ0KClcbiAgICAgICAgICAuem9vbShudWxsLCB0eXBlb2YgdHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIgPyB0cmFuc2Zvcm0uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRyYW5zZm9ybSlcbiAgICAgICAgICAuZW5kKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgem9vbS5zY2FsZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrLCBwLCBldmVudCkge1xuICAgIHpvb20uc2NhbGVUbyhzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGswID0gdGhpcy5fX3pvb20uayxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGswICogazE7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20uc2NhbGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaywgcCwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICB0MCA9IHRoaXMuX196b29tLFxuICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcCA9PT0gXCJmdW5jdGlvblwiID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcCxcbiAgICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gXCJmdW5jdGlvblwiID8gay5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogaztcbiAgICAgIHJldHVybiBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb25zdHJhaW4odGhpcy5fX3pvb20udHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IHkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHlcbiAgICAgICksIGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIG51bGwsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCB4LCB5LCBwLCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHAgPT09IFwiZnVuY3Rpb25cIiA/IHAuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHA7XG4gICAgICByZXR1cm4gY29uc3RyYWluKGlkZW50aXR5LnRyYW5zbGF0ZShwMFswXSwgcDBbMV0pLnNjYWxlKHQuaykudHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8gLXguYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC14LFxuICAgICAgICB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8gLXkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC15XG4gICAgICApLCBlLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICBmdW5jdGlvbiBzY2FsZSh0cmFuc2Zvcm0sIGspIHtcbiAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCBrKSk7XG4gICAgcmV0dXJuIGsgPT09IHRyYW5zZm9ybS5rID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybShrLCB0cmFuc2Zvcm0ueCwgdHJhbnNmb3JtLnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHRyYW5zZm9ybSwgcDAsIHAxKSB7XG4gICAgdmFyIHggPSBwMFswXSAtIHAxWzBdICogdHJhbnNmb3JtLmssIHkgPSBwMFsxXSAtIHAxWzFdICogdHJhbnNmb3JtLms7XG4gICAgcmV0dXJuIHggPT09IHRyYW5zZm9ybS54ICYmIHkgPT09IHRyYW5zZm9ybS55ID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybSh0cmFuc2Zvcm0uaywgeCwgeSk7XG4gIH1cblxuICBmdW5jdGlvbiBjZW50cm9pZChleHRlbnQpIHtcbiAgICByZXR1cm4gWygrZXh0ZW50WzBdWzBdICsgK2V4dGVudFsxXVswXSkgLyAyLCAoK2V4dGVudFswXVsxXSArICtleHRlbnRbMV1bMV0pIC8gMl07XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZSh0cmFuc2l0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCkge1xuICAgIHRyYW5zaXRpb25cbiAgICAgICAgLm9uKFwic3RhcnQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmV2ZW50KGV2ZW50KS5zdGFydCgpOyB9KVxuICAgICAgICAub24oXCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmV2ZW50KGV2ZW50KS5lbmQoKTsgfSlcbiAgICAgICAgLnR3ZWVuKFwiem9vbVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIGcgPSBnZXN0dXJlKHRoYXQsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgICAgICAgZSA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKSxcbiAgICAgICAgICAgICAgcCA9IHBvaW50ID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwb2ludCA9PT0gXCJmdW5jdGlvblwiID8gcG9pbnQuYXBwbHkodGhhdCwgYXJncykgOiBwb2ludCxcbiAgICAgICAgICAgICAgdyA9IE1hdGgubWF4KGVbMV1bMF0gLSBlWzBdWzBdLCBlWzFdWzFdIC0gZVswXVsxXSksXG4gICAgICAgICAgICAgIGEgPSB0aGF0Ll9fem9vbSxcbiAgICAgICAgICAgICAgYiA9IHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGF0LCBhcmdzKSA6IHRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgaSA9IGludGVycG9sYXRlKGEuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYS5rKSwgYi5pbnZlcnQocCkuY29uY2F0KHcgLyBiLmspKTtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgaWYgKHQgPT09IDEpIHQgPSBiOyAvLyBBdm9pZCByb3VuZGluZyBlcnJvciBvbiBlbmQuXG4gICAgICAgICAgICBlbHNlIHsgdmFyIGwgPSBpKHQpLCBrID0gdyAvIGxbMl07IHQgPSBuZXcgVHJhbnNmb3JtKGssIHBbMF0gLSBsWzBdICogaywgcFsxXSAtIGxbMV0gKiBrKTsgfVxuICAgICAgICAgICAgZy56b29tKG51bGwsIHQpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VzdHVyZSh0aGF0LCBhcmdzLCBjbGVhbikge1xuICAgIHJldHVybiAoIWNsZWFuICYmIHRoYXQuX196b29taW5nKSB8fCBuZXcgR2VzdHVyZSh0aGF0LCBhcmdzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEdlc3R1cmUodGhhdCwgYXJncykge1xuICAgIHRoaXMudGhhdCA9IHRoYXQ7XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB0aGlzLmFjdGl2ZSA9IDA7XG4gICAgdGhpcy5zb3VyY2VFdmVudCA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgdGhpcy50YXBzID0gMDtcbiAgfVxuXG4gIEdlc3R1cmUucHJvdG90eXBlID0ge1xuICAgIGV2ZW50OiBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50KSB0aGlzLnNvdXJjZUV2ZW50ID0gZXZlbnQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgrK3RoaXMuYWN0aXZlID09PSAxKSB7XG4gICAgICAgIHRoaXMudGhhdC5fX3pvb21pbmcgPSB0aGlzO1xuICAgICAgICB0aGlzLmVtaXQoXCJzdGFydFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgem9vbTogZnVuY3Rpb24oa2V5LCB0cmFuc2Zvcm0pIHtcbiAgICAgIGlmICh0aGlzLm1vdXNlICYmIGtleSAhPT0gXCJtb3VzZVwiKSB0aGlzLm1vdXNlWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLm1vdXNlWzBdKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoMCAmJiBrZXkgIT09IFwidG91Y2hcIikgdGhpcy50b3VjaDBbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gwWzBdKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoMSAmJiBrZXkgIT09IFwidG91Y2hcIikgdGhpcy50b3VjaDFbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gxWzBdKTtcbiAgICAgIHRoaXMudGhhdC5fX3pvb20gPSB0cmFuc2Zvcm07XG4gICAgICB0aGlzLmVtaXQoXCJ6b29tXCIpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGhpcy5hY3RpdmUgPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMudGhhdC5fX3pvb21pbmc7XG4gICAgICAgIHRoaXMuZW1pdChcImVuZFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24odHlwZSkge1xuICAgICAgdmFyIGQgPSBzZWxlY3QodGhpcy50aGF0KS5kYXR1bSgpO1xuICAgICAgbGlzdGVuZXJzLmNhbGwoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMudGhhdCxcbiAgICAgICAgbmV3IFpvb21FdmVudCh0eXBlLCB7XG4gICAgICAgICAgc291cmNlRXZlbnQ6IHRoaXMuc291cmNlRXZlbnQsXG4gICAgICAgICAgdGFyZ2V0OiB6b29tLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLnRoYXQuX196b29tLFxuICAgICAgICAgIGRpc3BhdGNoOiBsaXN0ZW5lcnNcbiAgICAgICAgfSksXG4gICAgICAgIGRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHdoZWVsZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdCA9IHRoaXMuX196b29tLFxuICAgICAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCB0LmsgKiBNYXRoLnBvdygyLCB3aGVlbERlbHRhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpKSksXG4gICAgICAgIHAgPSBwb2ludGVyKGV2ZW50KTtcblxuICAgIC8vIElmIHRoZSBtb3VzZSBpcyBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBiZWZvcmUsIHJldXNlIGl0LlxuICAgIC8vIElmIHRoZXJlIHdlcmUgcmVjZW50IHdoZWVsIGV2ZW50cywgcmVzZXQgdGhlIHdoZWVsIGlkbGUgdGltZW91dC5cbiAgICBpZiAoZy53aGVlbCkge1xuICAgICAgaWYgKGcubW91c2VbMF1bMF0gIT09IHBbMF0gfHwgZy5tb3VzZVswXVsxXSAhPT0gcFsxXSkge1xuICAgICAgICBnLm1vdXNlWzFdID0gdC5pbnZlcnQoZy5tb3VzZVswXSA9IHApO1xuICAgICAgfVxuICAgICAgY2xlYXJUaW1lb3V0KGcud2hlZWwpO1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgd2hlZWwgZXZlbnQgd29u4oCZdCB0cmlnZ2VyIGEgdHJhbnNmb3JtIGNoYW5nZSwgaWdub3JlIGl0LlxuICAgIGVsc2UgaWYgKHQuayA9PT0gaykgcmV0dXJuO1xuXG4gICAgLy8gT3RoZXJ3aXNlLCBjYXB0dXJlIHRoZSBtb3VzZSBwb2ludCBhbmQgbG9jYXRpb24gYXQgdGhlIHN0YXJ0LlxuICAgIGVsc2Uge1xuICAgICAgZy5tb3VzZSA9IFtwLCB0LmludmVydChwKV07XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZy53aGVlbCA9IHNldFRpbWVvdXQod2hlZWxpZGxlZCwgd2hlZWxEZWxheSk7XG4gICAgZy56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0LCBrKSwgZy5tb3VzZVswXSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcblxuICAgIGZ1bmN0aW9uIHdoZWVsaWRsZWQoKSB7XG4gICAgICBnLndoZWVsID0gbnVsbDtcbiAgICAgIGcuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbW91c2Vkb3duZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAodG91Y2hlbmRpbmcgfHwgIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzLCB0cnVlKS5ldmVudChldmVudCksXG4gICAgICAgIHYgPSBzZWxlY3QoZXZlbnQudmlldykub24oXCJtb3VzZW1vdmUuem9vbVwiLCBtb3VzZW1vdmVkLCB0cnVlKS5vbihcIm1vdXNldXAuem9vbVwiLCBtb3VzZXVwcGVkLCB0cnVlKSxcbiAgICAgICAgcCA9IHBvaW50ZXIoZXZlbnQsIGN1cnJlbnRUYXJnZXQpLFxuICAgICAgICB4MCA9IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHkwID0gZXZlbnQuY2xpZW50WTtcblxuICAgIGRyYWdEaXNhYmxlKGV2ZW50LnZpZXcpO1xuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGcubW91c2UgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApXTtcbiAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgZy5zdGFydCgpO1xuXG4gICAgZnVuY3Rpb24gbW91c2Vtb3ZlZChldmVudCkge1xuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICBpZiAoIWcubW92ZWQpIHtcbiAgICAgICAgdmFyIGR4ID0gZXZlbnQuY2xpZW50WCAtIHgwLCBkeSA9IGV2ZW50LmNsaWVudFkgLSB5MDtcbiAgICAgICAgZy5tb3ZlZCA9IGR4ICogZHggKyBkeSAqIGR5ID4gY2xpY2tEaXN0YW5jZTI7XG4gICAgICB9XG4gICAgICBnLmV2ZW50KGV2ZW50KVxuICAgICAgIC56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShnLnRoYXQuX196b29tLCBnLm1vdXNlWzBdID0gcG9pbnRlcihldmVudCwgY3VycmVudFRhcmdldCksIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW91c2V1cHBlZChldmVudCkge1xuICAgICAgdi5vbihcIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbVwiLCBudWxsKTtcbiAgICAgIGRyYWdFbmFibGUoZXZlbnQudmlldywgZy5tb3ZlZCk7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIGcuZXZlbnQoZXZlbnQpLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRibGNsaWNrZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgIHAwID0gcG9pbnRlcihldmVudC5jaGFuZ2VkVG91Y2hlcyA/IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdIDogZXZlbnQsIHRoaXMpLFxuICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgIGsxID0gdDAuayAqIChldmVudC5zaGlmdEtleSA/IDAuNSA6IDIpLFxuICAgICAgICB0MSA9IGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3MpLCB0cmFuc2xhdGVFeHRlbnQpO1xuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgaWYgKGR1cmF0aW9uID4gMCkgc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbikuY2FsbChzY2hlZHVsZSwgdDEsIHAwLCBldmVudCk7XG4gICAgZWxzZSBzZWxlY3QodGhpcykuY2FsbCh6b29tLnRyYW5zZm9ybSwgdDEsIHAwLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaHN0YXJ0ZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC50b3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsXG4gICAgICAgIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MsIGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA9PT0gbikuZXZlbnQoZXZlbnQpLFxuICAgICAgICBzdGFydGVkLCBpLCB0LCBwO1xuXG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgcCA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCksIHQuaWRlbnRpZmllcl07XG4gICAgICBpZiAoIWcudG91Y2gwKSBnLnRvdWNoMCA9IHAsIHN0YXJ0ZWQgPSB0cnVlLCBnLnRhcHMgPSAxICsgISF0b3VjaHN0YXJ0aW5nO1xuICAgICAgZWxzZSBpZiAoIWcudG91Y2gxICYmIGcudG91Y2gwWzJdICE9PSBwWzJdKSBnLnRvdWNoMSA9IHAsIGcudGFwcyA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHRvdWNoc3RhcnRpbmcpIHRvdWNoc3RhcnRpbmcgPSBjbGVhclRpbWVvdXQodG91Y2hzdGFydGluZyk7XG5cbiAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgaWYgKGcudGFwcyA8IDIpIHRvdWNoZmlyc3QgPSBwWzBdLCB0b3VjaHN0YXJ0aW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hzdGFydGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpO1xuICAgICAgaW50ZXJydXB0KHRoaXMpO1xuICAgICAgZy5zdGFydCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNobW92ZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQsIHAsIGw7XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDBbMF0gPSBwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDFbMF0gPSBwO1xuICAgIH1cbiAgICB0ID0gZy50aGF0Ll9fem9vbTtcbiAgICBpZiAoZy50b3VjaDEpIHtcbiAgICAgIHZhciBwMCA9IGcudG91Y2gwWzBdLCBsMCA9IGcudG91Y2gwWzFdLFxuICAgICAgICAgIHAxID0gZy50b3VjaDFbMF0sIGwxID0gZy50b3VjaDFbMV0sXG4gICAgICAgICAgZHAgPSAoZHAgPSBwMVswXSAtIHAwWzBdKSAqIGRwICsgKGRwID0gcDFbMV0gLSBwMFsxXSkgKiBkcCxcbiAgICAgICAgICBkbCA9IChkbCA9IGwxWzBdIC0gbDBbMF0pICogZGwgKyAoZGwgPSBsMVsxXSAtIGwwWzFdKSAqIGRsO1xuICAgICAgdCA9IHNjYWxlKHQsIE1hdGguc3FydChkcCAvIGRsKSk7XG4gICAgICBwID0gWyhwMFswXSArIHAxWzBdKSAvIDIsIChwMFsxXSArIHAxWzFdKSAvIDJdO1xuICAgICAgbCA9IFsobDBbMF0gKyBsMVswXSkgLyAyLCAobDBbMV0gKyBsMVsxXSkgLyAyXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZy50b3VjaDApIHAgPSBnLnRvdWNoMFswXSwgbCA9IGcudG91Y2gwWzFdO1xuICAgIGVsc2UgcmV0dXJuO1xuXG4gICAgZy56b29tKFwidG91Y2hcIiwgY29uc3RyYWluKHRyYW5zbGF0ZSh0LCBwLCBsKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hlbmRlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdDtcblxuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV07XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gxO1xuICAgIH1cbiAgICBpZiAoZy50b3VjaDEgJiYgIWcudG91Y2gwKSBnLnRvdWNoMCA9IGcudG91Y2gxLCBkZWxldGUgZy50b3VjaDE7XG4gICAgaWYgKGcudG91Y2gwKSBnLnRvdWNoMFsxXSA9IHRoaXMuX196b29tLmludmVydChnLnRvdWNoMFswXSk7XG4gICAgZWxzZSB7XG4gICAgICBnLmVuZCgpO1xuICAgICAgLy8gSWYgdGhpcyB3YXMgYSBkYmx0YXAsIHJlcm91dGUgdG8gdGhlIChvcHRpb25hbCkgZGJsY2xpY2suem9vbSBoYW5kbGVyLlxuICAgICAgaWYgKGcudGFwcyA9PT0gMikge1xuICAgICAgICB0ID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgICAgaWYgKE1hdGguaHlwb3QodG91Y2hmaXJzdFswXSAtIHRbMF0sIHRvdWNoZmlyc3RbMV0gLSB0WzFdKSA8IHRhcERpc3RhbmNlKSB7XG4gICAgICAgICAgdmFyIHAgPSBzZWxlY3QodGhpcykub24oXCJkYmxjbGljay56b29tXCIpO1xuICAgICAgICAgIGlmIChwKSBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB6b29tLndoZWVsRGVsdGEgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAod2hlZWxEZWx0YSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCB6b29tKSA6IHdoZWVsRGVsdGE7XG4gIH07XG5cbiAgem9vbS5maWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCB6b29tKSA6IGZpbHRlcjtcbiAgfTtcblxuICB6b29tLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b3VjaGFibGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogdG91Y2hhYmxlO1xuICB9O1xuXG4gIHpvb20uZXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoW1srX1swXVswXSwgK19bMF1bMV1dLCBbK19bMV1bMF0sICtfWzFdWzFdXV0pLCB6b29tKSA6IGV4dGVudDtcbiAgfTtcblxuICB6b29tLnNjYWxlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlRXh0ZW50WzBdID0gK19bMF0sIHNjYWxlRXh0ZW50WzFdID0gK19bMV0sIHpvb20pIDogW3NjYWxlRXh0ZW50WzBdLCBzY2FsZUV4dGVudFsxXV07XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNsYXRlRXh0ZW50WzBdWzBdID0gK19bMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVswXSA9ICtfWzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV0gPSArX1swXVsxXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdID0gK19bMV1bMV0sIHpvb20pIDogW1t0cmFuc2xhdGVFeHRlbnRbMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXV0sIFt0cmFuc2xhdGVFeHRlbnRbMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXV1dO1xuICB9O1xuXG4gIHpvb20uY29uc3RyYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnN0cmFpbiA9IF8sIHpvb20pIDogY29uc3RyYWluO1xuICB9O1xuXG4gIHpvb20uZHVyYXRpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHVyYXRpb24gPSArXywgem9vbSkgOiBkdXJhdGlvbjtcbiAgfTtcblxuICB6b29tLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRlID0gXywgem9vbSkgOiBpbnRlcnBvbGF0ZTtcbiAgfTtcblxuICB6b29tLm9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IHpvb20gOiB2YWx1ZTtcbiAgfTtcblxuICB6b29tLmNsaWNrRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIHpvb20pIDogTWF0aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTtcbiAgfTtcblxuICB6b29tLnRhcERpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcERpc3RhbmNlID0gK18sIHpvb20pIDogdGFwRGlzdGFuY2U7XG4gIH07XG5cbiAgcmV0dXJuIHpvb207XG59XG4iLCJpbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG5cbi8qKlxuICogUGFyZW50IGNsYXNzIGZvciBidXR0b24gZWxlbWVudHMgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBncmlkdml6IHZpZXdlci5cbiAqXG4gKiBAbW9kdWxlIGJ1dHRvblxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQnV0dG9uIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqIG9wdHMucGFyZW50Tm9kZVxuICAgICAqIG9wdHMuaWRcbiAgICAgKiBvcHRzLnRpdGxlXG4gICAgICogb3B0cy5jbGFzc1xuICAgICAqIG9wdHMub25DbGlja0Z1bmN0aW9uXG4gICAgICogb3B0cy54XG4gICAgICogb3B0cy55XG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XG4gICAgICAgIHRoaXMubWFwID0gb3B0cy5tYXBcbiAgICAgICAgdGhpcy5wYXJlbnROb2RlID0gb3B0cy5wYXJlbnROb2RlIHx8IG9wdHMubWFwLmNvbnRhaW5lclxuXG4gICAgICAgIC8vIHRoZSBkaXYgZWxlbWVudFxuICAgICAgICBpZiAob3B0cy5pZCkgdGhpcy5kaXYgPSBzZWxlY3QoJyMnICsgb3B0cy5pZClcblxuICAgICAgICBpZiAoIXRoaXMuZGl2IHx8IHRoaXMuZGl2LmVtcHR5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGl2ID0gc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKVxuICAgICAgICAgICAgaWYgKG9wdHMuaWQpIHRoaXMuZGl2LmF0dHIoJ2lkJywgb3B0cy5pZClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRzLnRpdGxlKSB0aGlzLmRpdi5hdHRyKCd0aXRsZScsIG9wdHMudGl0bGUpXG4gICAgICAgIGlmIChvcHRzLmNsYXNzKSB0aGlzLmRpdi5hdHRyKCdjbGFzcycsIG9wdHMuY2xhc3MpXG5cbiAgICAgICAgLy8gYWRkIGV2ZW50c1xuICAgICAgICBpZiAob3B0cy5vbkNsaWNrRnVuY3Rpb24pIHRoaXMuZGl2Lm9uKCdjbGljaycsIG9wdHMub25DbGlja0Z1bmN0aW9uKVxuXG4gICAgICAgIC8vc2V0IHN0eWxlc1xuICAgICAgICB0aGlzLnN0eWxlKFxuICAgICAgICAgICAgJ2JveC1zaGFkb3cnLFxuICAgICAgICAgICAgJzAgN3B4IDhweCByZ2JhKDAsNDcsMTAzLC4wOCksIDAgMCAyMnB4IHJnYmEoMCw0NywxMDMsLjA0KSwgMCAxMnB4IDE3cHggcmdiYSgwLDQ3LDEwMywuMDQpLCAwIC00cHggNHB4IHJnYmEoMCw0NywxMDMsLjA0KSdcbiAgICAgICAgKSAvLy5lY2wtdS1zaGFkb3ctM1xuICAgICAgICB0aGlzLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNmZmZmZmYnKVxuICAgICAgICB0aGlzLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXG4gICAgICAgIHRoaXMuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgICAgdGhpcy5zdHlsZSgnZGlzcGxheScsICdmbGV4JylcbiAgICAgICAgdGhpcy5zdHlsZSgnanVzdGlmeS1jb250ZW50JywgJ2NlbnRlcicpXG4gICAgICAgIHRoaXMuc3R5bGUoJ2FsaWduLWl0ZW1zJywgJ2NlbnRlcicpXG4gICAgICAgIHRoaXMuc3R5bGUoJ3dpZHRoJywgJzMwcHgnKVxuICAgICAgICB0aGlzLnN0eWxlKCdoZWlnaHQnLCAnMzBweCcpXG4gICAgICAgIC8vIHRoaXMuc3R5bGUocGFkZGluZyAsICc0cHgnXG5cbiAgICAgICAgLy8gYXBwZW5kIHRvIHBhcmVudFxuICAgICAgICB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kaXYubm9kZSgpKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGx5IGEgc3R5bGUgdG8gdGhlIGJ1dHRvbiBkaXYuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdlxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIHN0eWxlKGssIHYpIHtcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoaywgdilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuL0J1dHRvbi5qcydcblxuLyoqXG4gKiBCdXR0b24gZm9yIHRvZ2dsaW5nIGZ1bGxzY3JlZW4gbW9kZVxuICpcbiAqIEBtb2R1bGUgYnV0dG9uXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBGdWxsc2NyZWVuQnV0dG9uIGV4dGVuZHMgQnV0dG9uIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqIG9wdHMucGFyZW50Tm9kZSAtIHRoZSBub2RlIHRoYXQgdGhlIGJ1dHRvbiBpcyBhcHBlbmRlZCB0b1xuICAgICAqIG9wdHMuY2FudmFzIC0gdGhlIGdyaWR2aXogY2FudmFzXG4gICAgICogb3B0cy5pZFxuICAgICAqIG9wdHMudGl0bGUgLSBIVE1MIHRpdGxlIGF0dHJpYnV0ZVxuICAgICAqIG9wdHMuY2xhc3MgLSBjc3MgY2xhc3NcbiAgICAgKiBvcHRzLm9uQ2xpY2tGdW5jdGlvblxuICAgICAqIG9wdHMueCAtIHggcG9zaXRpb24gb2YgdGhlIGJ1dHRvblxuICAgICAqIG9wdHMueSAtIHkgcG9zaXRpb24gb2YgdGhlIGJ1dHRvblxuICAgICAqL1xuXG4gICAgLy8gZGVmYXVsdCBzdGF0ZVxuICAgIGlzRnVsbHNjcmVlbiA9IGZhbHNlXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG5cbiAgICAgICAgLy8gYXBwZW5kIGZ1bGxzY3JlZW4gaWNvbiB0byBidXR0b24gY29udGFpbmVyXG4gICAgICAgIHRoaXMuZGl2Lm5vZGUoKS5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxzdmdcbiAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxLjJyZW07IHdpZHRoOiAxLjJyZW07IGZpbGw6YmxhY2s7IG1hcmdpbjowO1wiXG4gICAgICAgICAgICBmb2N1c2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8c3ZnIGZpbGw9XCIjMDAwMDAwXCIgdmlld0JveD1cIjAgMCA5NiA5NlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDx0aXRsZS8+XG4gICAgICAgICAgICA8Zz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzAsMEg2QTUuOTk2Niw1Ljk5NjYsMCwwLDAsMCw2VjMwYTYsNiwwLDAsMCwxMiwwVjEySDMwQTYsNiwwLDAsMCwzMCwwWlwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNOTAsMEg2NmE2LDYsMCwwLDAsMCwxMkg4NFYzMGE2LDYsMCwwLDAsMTIsMFY2QTUuOTk2Niw1Ljk5NjYsMCwwLDAsOTAsMFpcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTMwLDg0SDEyVjY2QTYsNiwwLDAsMCwwLDY2VjkwYTUuOTk2Niw1Ljk5NjYsMCwwLDAsNiw2SDMwYTYsNiwwLDAsMCwwLTEyWlwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNOTAsNjBhNS45OTY2LDUuOTk2NiwwLDAsMC02LDZWODRINjZhNiw2LDAsMCwwLDAsMTJIOTBhNS45OTY2LDUuOTk2NiwwLDAsMCw2LTZWNjZBNS45OTY2LDUuOTk2NiwwLDAsMCw5MCw2MFpcIi8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIGBcblxuICAgICAgICAvL3NhdmUgaW5pdGlhbCBtYXAgZGltZW5zaW9uc1xuICAgICAgICB0aGlzLmRlZmF1bHRIZWlnaHQgPSB0aGlzLm1hcC5oXG4gICAgICAgIHRoaXMuZGVmYXVsdFdpZHRoID0gdGhpcy5tYXAud1xuXG4gICAgICAgIC8vIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgdGhpcy5kaXYub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25DbGlja0Z1bmN0aW9uKGUpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuZGl2Lm9uKCdtb3VzZW92ZXInLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSgnYmFja2dyb3VuZC1jb2xvcicsICdsaWdodGdyZXknKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLmRpdi5vbignbW91c2VvdXQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSgnYmFja2dyb3VuZC1jb2xvcicsICcjZmZmZmZmJylcbiAgICAgICAgfSlcblxuICAgICAgICAvL3NldCBwb3NpdGlvblxuICAgICAgICBpZiAob3B0cy54KSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdsZWZ0Jywgb3B0cy54ICsgJ3B4JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3JpZ2h0JywgJzEwcHgnKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLnkpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3RvcCcsIG9wdHMueSArICdweCcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCd0b3AnLCAnOTBweCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNsaWNrRnVuY3Rpb24oZSkge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VGdWxsc2NyZWVuKHRoaXMubWFwLmNvbnRhaW5lcilcbiAgICAgICAgICAgIC8vcmVzaXplIGNhbnZhcyB0byBkZWZhdWx0XG4gICAgICAgICAgICB0aGlzLm1hcC5oID0gdGhpcy5kZWZhdWx0SGVpZ2h0XG4gICAgICAgICAgICB0aGlzLm1hcC53ID0gdGhpcy5kZWZhdWx0V2lkdGhcbiAgICAgICAgICAgIHRoaXMubWFwLmdlb0NhbnZhcy5oID0gdGhpcy5kZWZhdWx0SGVpZ2h0XG4gICAgICAgICAgICB0aGlzLm1hcC5nZW9DYW52YXMudyA9IHRoaXMuZGVmYXVsdFdpZHRoXG4gICAgICAgICAgICB0aGlzLm1hcC5nZW9DYW52YXMuY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMuZGVmYXVsdFdpZHRoKVxuICAgICAgICAgICAgdGhpcy5tYXAuZ2VvQ2FudmFzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5kZWZhdWx0SGVpZ2h0KVxuICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkZ1bGxzY3JlZW4odGhpcy5tYXAuY29udGFpbmVyKVxuICAgICAgICAgICAgLy9yZXNpemUgY2FudmFzIHRvIGZ1bGxzY3JlZW5cbiAgICAgICAgICAgIHRoaXMubWFwLmggPSB3aW5kb3cuc2NyZWVuLmhlaWdodFxuICAgICAgICAgICAgdGhpcy5tYXAudyA9IHdpbmRvdy5zY3JlZW4ud2lkdGhcbiAgICAgICAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gdHJ1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyogT3BlbiBmdWxsc2NyZWVuICovXG4gICAgb3BlbkZ1bGxzY3JlZW4oZWxlbSkge1xuICAgICAgICBpZiAoZWxlbS5yZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgZWxlbS5yZXF1ZXN0RnVsbHNjcmVlbigpXG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgLyogU2FmYXJpICovXG4gICAgICAgICAgICBlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKClcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtLm1zUmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgIC8qIElFMTEgKi9cbiAgICAgICAgICAgIGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbigpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBDbG9zZSBmdWxsc2NyZWVuICovXG4gICAgY2xvc2VGdWxsc2NyZWVuKCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgLyogU2FmYXJpICovXG4gICAgICAgICAgICBkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpXG4gICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgLyogSUUxMSAqL1xuICAgICAgICAgICAgZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuL0J1dHRvbi5qcydcblxuLyoqXG4gKiBCdXR0b24gZm9yIHRvZ2dsaW5nIGZ1bGxzY3JlZW4gbW9kZVxuICpcbiAqIEBtb2R1bGUgYnV0dG9uXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBab29tQnV0dG9ucyBleHRlbmRzIEJ1dHRvbiB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG5cbiAgICAgICAgdGhpcy5vblpvb20gPSBvcHRzLm9uWm9vbSAvLyBjdXN0b20gdXNlciBldmVudCBoYW5kbGVyXG4gICAgICAgIHRoaXMuZGVsdGEgPSBvcHRzLmRlbHRhIHx8IDAuMlxuXG4gICAgICAgIC8vIHpvb20gaW4gYnRuXG4gICAgICAgIHRoaXMuem9vbUluQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICAgIHRoaXMuem9vbUluQnRuLmlubmVySFRNTCA9IGA8YSBpZD1cInpvb21pblwiIGNsYXNzPVwiZ3JpZHZpei16b29tLWJ1dHRvblwiIHRpdGxlPVwiWm9vbSBpblwiPis8L2E+YFxuICAgICAgICB0aGlzLnpvb21JbkJ0bi50aXRsZSA9ICdab29tIGluJ1xuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21JbihlKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b29tSW5CdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ2xpZ2h0Z3JleSdcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy56b29tSW5CdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b29tSW5CdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNmZmZmZmYnXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gem9vbSBvdXQgYnRuXG4gICAgICAgIHRoaXMuem9vbU91dEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICB0aGlzLnpvb21PdXRCdG4uaW5uZXJIVE1MID0gYDxhIGlkPVwiem9vbWluXCIgY2xhc3M9XCJncmlkdml6LXpvb20tYnV0dG9uXCIgdGl0bGU9XCJab29tIG91dFwiPi08L2E+YFxuICAgICAgICB0aGlzLnpvb21PdXRCdG4udGl0bGUgPSAnWm9vbSBvdXQnXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21PdXQoZSlcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy56b29tT3V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21PdXRCdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ2xpZ2h0Z3JleSdcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy56b29tT3V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9vbU91dEJ0bi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZmZmZidcbiAgICAgICAgfSlcblxuICAgICAgICAvL3NldCBzdHlsZXNcbiAgICAgICAgbGV0IGJ0bnMgPSBbdGhpcy56b29tSW5CdG4sIHRoaXMuem9vbU91dEJ0bl1cbiAgICAgICAgYnRucy5mb3JFYWNoKChidG4sIGkpID0+IHtcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5hbGlnbkl0ZW1zID0gJ2NlbnRlcidcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICdjZW50ZXInXG4gICAgICAgICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xuICAgICAgICAgICAgYnRuLnN0eWxlLmJvcmRlciA9ICdub25lJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLmNvbG9yID0gJ2JsYWNrJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLnRleHRBbGlnbiA9ICdjZW50ZXInXG4gICAgICAgICAgICBidG4uc3R5bGUudGV4dERlY29yYXRpb24gPSAnbm9uZSdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5wYWRkaW5nID0gJzRweCdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5mb250U2l6ZSA9ICcyMHB4J1xuICAgICAgICAgICAgYnRuLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnXG4gICAgICAgICAgICBpZiAoaSA9PSAwKSBidG4uc3R5bGUuYm9yZGVyQm90dG9tID0gJzFweCBzb2xpZCBncmV5J1xuICAgICAgICB9KVxuXG4gICAgICAgIC8vIHVuc2V0IHBhcmVudCBjbGFzcyBoZWlnaHQgYW5kIGRpc3BsYXkgZm9yIGR1YWwgYnV0dG9uc1xuICAgICAgICB0aGlzLnN0eWxlKCdoZWlnaHQnLCAndW5zZXQnKVxuICAgICAgICB0aGlzLnN0eWxlKCdkaXNwbGF5JywgJ3Vuc2V0JylcblxuICAgICAgICAvL3NldCBwb3NpdGlvblxuICAgICAgICBpZiAob3B0cy54KSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdsZWZ0Jywgb3B0cy54ICsgJ3B4JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3JpZ2h0JywgJzEwcHgnKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLnkpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3RvcCcsIG9wdHMueSArICdweCcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCd0b3AnLCAnMTBweCcpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBhcHBlbmQgdG8gYnV0dG9uIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmRpdi5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy56b29tSW5CdG4pXG4gICAgICAgIHRoaXMuZGl2Lm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLnpvb21PdXRCdG4pXG4gICAgfVxuXG4gICAgLyogWm9vbSBpbiAqL1xuICAgIHpvb21JbihlKSB7XG4gICAgICAgIHRoaXMubWFwLnNldFpvb20odGhpcy5tYXAuZ2V0Wm9vbSgpICogKDEgLSB0aGlzLmRlbHRhKSkucmVkcmF3KClcbiAgICAgICAgaWYgKHRoaXMub25ab29tKSB0aGlzLm9uWm9vbShlKVxuICAgIH1cblxuICAgIC8qIFpvb20gb3V0ICovXG4gICAgem9vbU91dChlKSB7XG4gICAgICAgIHRoaXMubWFwLnNldFpvb20odGhpcy5tYXAuZ2V0Wm9vbSgpICogKDEgKyB0aGlzLmRlbHRhKSkucmVkcmF3KClcbiAgICAgICAgaWYgKHRoaXMub25ab29tKSB0aGlzLm9uWm9vbShlKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBBIGdyaWQgY2VsbC5cbiAqIEB0eXBlZGVmIHt7eDogbnVtYmVyLCB5OiBudW1iZXJ9fSBDZWxsICovXG5cbi8qKlxuICogQSBkYXRhc2V0IGNvbXBvbmVudCwgb2YgZ3JpZCBjZWxscy5cbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgRGF0YXNldCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL01hcC5qc1wiKS5NYXB9IG1hcCBUaGUgbWFwLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCBvZiB0aGUgZGF0YXNldC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgZGF0YXNldCByZXNvbHV0aW9uLCBpbiB0aGUgQ1JTIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OmZ1bmN0aW9uKENlbGwpOmJvb2xlYW4sIG1peGVkUmVzb2x1dGlvbj86ZnVuY3Rpb24oQ2VsbCk6bnVtYmVyfX0gb3B0c1xuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcCwgdXJsLCByZXNvbHV0aW9uLCBvcHRzID0ge30pIHtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG1hcC5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9NYXAuanNcIikuTWFwfSAqL1xuICAgICAgICB0aGlzLm1hcCA9IG1hcFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdXJsIG9mIHRoZSBkYXRhc2V0LlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gdXJsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gcmVzb2x1dGlvblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEluIGNhc2UgdGhlIGRhdGFzZXQgaXMgYSBkYXRhc2V0IHdpdGggY2VsbHMgaGF2aW5nIGRpZmZlcmVudCByZXNvbHV0aW9uLFxuICAgICAgICAqIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgcmVzb2x1dGlvbiBvZiBlYWNoIGNlbGwuXG4gICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAqIEB0eXBlIHsoZnVuY3Rpb24oQ2VsbCk6bnVtYmVyICl8IHVuZGVmaW5lZCB9ICovXG4gICAgICAgIHRoaXMubWl4ZWRSZXNvbHV0aW9uID0gb3B0cy5taXhlZFJlc29sdXRpb25cblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBwcmVwcm9jZXNzIHRvIHJ1biBvbiBlYWNoIGNlbGwgYWZ0ZXIgbG9hZGluZy4gSXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc29tZSBzcGVjaWZpYyB0cmVhdG1lbnQgYmVmb3JlIG9yIGNvbXB1dGUgYSBuZXcgY29sdW1uLiBBbmQgYWxzbyB0byBkZXRlcm1pbmUgd2hpY2ggY2VsbHMgdG8ga2VlcCBhZnRlciBsb2FkaW5nLlxuICAgICAgICAgKiBAdHlwZSB7KGZ1bmN0aW9uKENlbGwpOmJvb2xlYW4gKXwgdW5kZWZpbmVkIH0gKi9cbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzIHx8IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKiBUaGUgY2VsbHMgd2l0aGluIHRoZSB2aWV3XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxDZWxsPn0gKi9cbiAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZSA9IFtdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBkYXRhIHdpdGhpbiBhIGdlb2dyYXBoaWMgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gZXh0R2VvXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgZ2V0RGF0YShleHRHZW8gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgZ2V0RGF0YSBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICogQGFic3RyYWN0XG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5FbnZlbG9wZX0gZXh0R2VvIFRoZSB2aWV3IGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIHVwZGF0ZVZpZXdDYWNoZSBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBjZWxsIHVuZGVyIGEgZ2l2ZW4gcG9zaXRpb24sIGlmIGFueS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7e3g6bnVtYmVyLHk6bnVtYmVyfX0gcG9zR2VvXG4gICAgICogQHBhcmFtIHtBcnJheS48Q2VsbD59IGNlbGxzIFNvbWUgY2VsbHMgZnJvbSB0aGUgZGF0YXNldCAoYSBzdWJzZXQgaWYgbmVjZXNzYXJ5LCB1c3VhbGx5IHRoZSB2aWV3IGNhY2hlKS5cbiAgICAgKiBAcmV0dXJucyB7Q2VsbHx1bmRlZmluZWR9XG4gICAgICovXG4gICAgZ2V0Q2VsbEZyb21Qb3NpdGlvbihwb3NHZW8sIGNlbGxzKSB7XG4gICAgICAgIC8vY29tcHV0ZSBjYW5kaWRhdGUgY2VsbCBwb3NpdGlvblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgLy9jb25zdCByID0gdGhpcy5nZXRSZXNvbHV0aW9uKClcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIC8vY29uc3QgY2VsbFggPSByICogTWF0aC5mbG9vcihwb3NHZW8ueCAvIHIpXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAvL2NvbnN0IGNlbGxZID0gciAqIE1hdGguZmxvb3IocG9zR2VvLnkgLyByKVxuXG4gICAgICAgIC8qL2dldCBjZWxsXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgaWYgKGNlbGwueCAhPSBjZWxsWCkgY29udGludWVcbiAgICAgICAgICAgIGlmIChjZWxsLnkgIT0gY2VsbFkpIGNvbnRpbnVlXG4gICAgICAgICAgICByZXR1cm4gY2VsbFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQqL1xuXG4gICAgICAgIC8vcmFyZSBjYXNlIG9mIG1peGVkIHJlc29sdXRpb24gZGF0YXNldFxuICAgICAgICBpZiAodGhpcy5taXhlZFJlc29sdXRpb24pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSArdGhpcy5taXhlZFJlc29sdXRpb24oYylcbiAgICAgICAgICAgICAgICBpZiAocG9zR2VvLnggPCBjLngpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYy54ICsgciA8IHBvc0dlby54KSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvc0dlby55IDwgYy55KSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMueSArIHIgPCBwb3NHZW8ueSkgY29udGludWVcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBjXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbW1vbiBjYXNlXG5cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLmdldFJlc29sdXRpb24oKVxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGlmIChwb3NHZW8ueCA8IGNlbGwueCkgY29udGludWVcbiAgICAgICAgICAgIGVsc2UgaWYgKGNlbGwueCArIHIgPCBwb3NHZW8ueCkgY29udGludWVcbiAgICAgICAgICAgIGVsc2UgaWYgKHBvc0dlby55IDwgY2VsbC55KSBjb250aW51ZVxuICAgICAgICAgICAgZWxzZSBpZiAoY2VsbC55ICsgciA8IHBvc0dlby55KSBjb250aW51ZVxuICAgICAgICAgICAgZWxzZSByZXR1cm4gY2VsbFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcblxuICAgIH1cblxuICAgIC8vZ2V0dGVycyBhbmQgc2V0dGVyc1xuXG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gICAgZ2V0UmVzb2x1dGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x1dGlvblxuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7QXJyYXkuPENlbGw+fSAqL1xuICAgIGdldFZpZXdDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbHNWaWV3Q2FjaGVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHJlbGV2YW50IGRhdGFzZXQgZm9yIGEgc3BlY2lmaWVkIHpvb20uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluUGl4ZWxzUGVyQ2VsbFxuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fHVuZGVmaW5lZH1cbiAgICAgKiAqL1xuICAgIGdldERhdGFzZXQoeiwgbWluUGl4ZWxzUGVyQ2VsbCkge1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdXNlZCB0byBncm91cCBlbGVtZW50cyBzaGFyZWQgYmV0d2VlbiBMYXllciBhbmQgU3R5bGUgY2xhc3Nlcy5cbiAqIFxuICogQGFic3RyYWN0XG4gKiBAbW9kdWxlIGNvcmVcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIERyYXdhYmxlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSB2aXNpYmxlIG9yIG5vdC5cbiAgICAgICAgICogVGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpib29sZWFufSAqL1xuICAgICAgICB0aGlzLnZpc2libGUgPSBvcHRzLnZpc2libGVcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGFscGhhICh0cmFuc3BhcmVuY3kvb3BhY2l0eSksIGJldHdlZW4gMC4wIChmdWxseSB0cmFuc3BhcmVudCkgYW5kIDEuMCAoZnVsbHkgb3BhcXVlKS5cbiAgICAgICAgICogIFRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIChzZWUgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOiBnbG9iYWxBbHBoYSBwcm9wZXJ0eSlcbiAgICAgICAgICogQHR5cGUgeyhmdW5jdGlvbihudW1iZXIpOm51bWJlcil8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmFscGhhID0gb3B0cy5hbHBoYVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgYmxlbmQgb3BlcmF0aW9uLlxuICAgICAgICAgKiBUaGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiAoc2VlIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDogZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIHByb3BlcnR5KVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb259ICovXG4gICAgICAgIHRoaXMuYmxlbmRPcGVyYXRpb24gPSBvcHRzLmJsZW5kT3BlcmF0aW9uIHx8ICh6ID0+IFwic291cmNlLW92ZXJcIilcblxuICAgICAgICAvKiogQHR5cGUgeyhmdW5jdGlvbihudW1iZXIpOnN0cmluZyl8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmZpbHRlckNvbG9yID0gb3B0cy5maWx0ZXJDb2xvciAvLyAoeikgPT4gXCIjZWVlN1wiXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBsYXllciBmaWx0ZXIuXG4gICAgICogXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIGRyYXdGaWx0ZXIoZ2VvQ2FudmFzKSB7XG4gICAgICAgIC8vbm8gZmlsdGVyOiByZXR1cm5cbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlckNvbG9yKSByZXR1cm5cblxuICAgICAgICAvL2dldCBmaWx0ZXJcbiAgICAgICAgY29uc3QgZmMgPSB0aGlzLmZpbHRlckNvbG9yKGdlb0NhbnZhcy52aWV3LnopXG5cbiAgICAgICAgLy9ubyBmaWx0ZXI6IHJldHVyblxuICAgICAgICBpZiAoIWZjIHx8IGZjID09ICdub25lJykgcmV0dXJuXG5cbiAgICAgICAgLy9kcmF3IGZpbHRlclxuICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9IGZjXG4gICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoMCwgMCwgZ2VvQ2FudmFzLncsIGdlb0NhbnZhcy5oKVxuICAgIH1cblxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYgeyB7eE1pbjogbnVtYmVyLCB4TWF4OiBudW1iZXIsIHlNaW46IG51bWJlciwgeU1heDogbnVtYmVyfSB9IEVudmVsb3BlICovXG5cbi8qKlxuICogQSB2aWV3c2hlZC5cbiAqIEB0eXBlZGVmIHt7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn19IFZpZXcgKi9cblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuaW1wb3J0IHsgem9vbSBhcyBkM3pvb20sIHpvb21JZGVudGl0eSB9IGZyb20gJ2QzLXpvb20nXG5cbi8qKlxuICogQSBIVE1MIGNhbnZhcyBmb3IgZ2VvIGRhdGEgZGlzcGxheSwgZW5oYW5jZWQgd2l0aCB6b29tIGFuZCBwYW4gY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgR2VvQ2FudmFzIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB2aWV3XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdmlld1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IFRoZSB6b29tIGxldmVsIG9mIHRoZSB2aWV3IChwaXhlbCBzaXplLCBpbiBncm91bmQgbSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhbnZhcywgeCA9IDAsIHkgPSAwLCB6ID0gMCwgb3B0cyA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXNcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy53ID0gdGhpcy5jYW52YXMub2Zmc2V0V2lkdGhcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaCA9IHRoaXMuY2FudmFzLm9mZnNldEhlaWdodFxuXG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy53XG4gICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuaFxuXG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgICAgICAgaWYgKCFjdHgpIHRocm93ICdJbXBvc3NpYmxlIHRvIGNyZWF0ZSBjYW52YXMgMkQgY29udGV4dCdcbiAgICAgICAgLyoqQHR5cGUge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gKi9cbiAgICAgICAgdGhpcy5jdHggPSBjdHhcblxuICAgICAgICAvKiogXG4gICAgICAgICAqIHo6IHBpeGVsIHNpemUsIGluIG0vcGl4XG4gICAgICAgICAqIEB0eXBlIHtWaWV3fSAgKi9cbiAgICAgICAgdGhpcy52aWV3ID0geyB4OiB4LCB5OiB5LCB6OiB6IH1cblxuICAgICAgICAvKiogQmFja2dyb3VuZCBjb2xvci5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBvcHRzLmJhY2tncm91bmRDb2xvciB8fCAnd2hpdGUnXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihvYmplY3R8dW5kZWZpbmVkKTp2b2lkfSAqL1xuICAgICAgICB0aGlzLm9uWm9vbVN0YXJ0RnVuID0gb3B0cy5vblpvb21TdGFydEZ1blxuXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0fHVuZGVmaW5lZCk6dm9pZH0gKi9cbiAgICAgICAgdGhpcy5vblpvb21FbmRGdW4gPSBvcHRzLm9uWm9vbUVuZEZ1blxuXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0fHVuZGVmaW5lZCk6dm9pZH0gKi9cbiAgICAgICAgdGhpcy5vblpvb21GdW4gPSBvcHRzLm9uWm9vbUZ1blxuXG4gICAgICAgIC8vY3VycmVudCBleHRlbnRcbiAgICAgICAgLyoqIEB0eXBlIHtFbnZlbG9wZX0gKi9cbiAgICAgICAgdGhpcy5leHRHZW8gPSB7IHhNaW46IE5hTiwgeE1heDogTmFOLCB5TWluOiBOYU4sIHlNYXg6IE5hTiB9XG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcblxuICAgICAgICAvL3JlbHkgb24gZDMgem9vbSBmb3IgcGFuL3pvb21cbiAgICAgICAgaWYgKCFvcHRzLmRpc2FibGVab29tKSB7XG4gICAgICAgICAgICBsZXQgdFAgPSB6b29tSWRlbnRpdHlcbiAgICAgICAgICAgIGNvbnN0IHogPSBkM3pvb20oKVxuICAgICAgICAgICAgICAgIC8vdG8gbWFrZSB0aGUgem9vbWluZyBhIGJpdCBmYXN0ZXJcbiAgICAgICAgICAgICAgICAud2hlZWxEZWx0YSgoZSkgPT4gLWUuZGVsdGFZICogKGUuZGVsdGFNb2RlID09PSAxID8gMC4wNyA6IGUuZGVsdGFNb2RlID8gMSA6IDAuMDA0KSlcbiAgICAgICAgICAgICAgICAub24oJ3pvb20nLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gZS50cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZiA9IHRQLmsgLyB0LmtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGYgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9wYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR4ID0gdFAueCAtIHQueFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHkgPSB0UC55IC0gdC55XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhbihkeCAqIHRoaXMudmlldy56LCAtZHkgKiB0aGlzLnZpZXcueilcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlID0gZS5zb3VyY2VFdmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlIGluc3RhbmNlb2YgV2hlZWxFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vem9vbSBhdCB0aGUgbW91c2UgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl4VG9HZW9YKGUuc291cmNlRXZlbnQub2Zmc2V0WCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl4VG9HZW9ZKGUuc291cmNlRXZlbnQub2Zmc2V0WSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlIGluc3RhbmNlb2YgVG91Y2hFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSB0b3VjaGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR4ID0gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgPSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdHQgb2Ygc2UudGFyZ2V0VG91Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCArPSB0dC5jbGllbnRYXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5ICs9IHR0LmNsaWVudFlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLz0gc2UudGFyZ2V0VG91Y2hlcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAvPSBzZS50YXJnZXRUb3VjaGVzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vem9vbSBhdCB0aGlzIGF2ZXJhZ2UgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb20oZiwgdGhpcy5waXhUb0dlb1godHgpLCB0aGlzLnBpeFRvR2VvWSh0eSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdFAgPSB0XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25ab29tRnVuKSB0aGlzLm9uWm9vbUZ1bihlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLm9uKCdzdGFydCcsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuaCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jLmdldENvbnRleHQoJzJkJyk/LmRyYXdJbWFnZSh0aGlzLmNhbnZhcywgMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5mID0gMTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblpvb21TdGFydEZ1bikgdGhpcy5vblpvb21TdGFydEZ1bihlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLm9uKCdlbmQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IHsgYzogbnVsbCwgZHg6IDAsIGR5OiAwLCBmOiAxIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblpvb21FbmRGdW4pIHRoaXMub25ab29tRW5kRnVuKGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHooc2VsZWN0KHRoaXMuY2FudmFzKSlcbiAgICAgICAgfVxuICAgICAgICAvL3NlbGVjdCh0aGlzLmNhbnZhcykuY2FsbCh6KTtcblxuICAgICAgICAvKiogWm9vbSBleHRlbnQsIHRvIGxpbWl0IHpvb20gaW4gYW5kIG91dFxuICAgICAgICAgKiAgQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xuICAgICAgICB0aGlzLnpvb21FeHRlbnQgPSBvcHRzLnpvb21FeHRlbnQgfHwgWzAsIEluZmluaXR5XVxuXG4gICAgICAgIC8qKiBDYW52YXMgc3RhdGUsIHRvIGJlIHVzZWQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVkcmF3cyBvbiB6b29tL3BhblxuICAgICAgICAgKiAgQHR5cGUge3tjOkhUTUxDYW52YXNFbGVtZW50fG51bGwsZHg6bnVtYmVyLGR5Om51bWJlcixmOm51bWJlcn19ICovXG4gICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IHsgYzogbnVsbCwgZHg6IDAsIGR5OiAwLCBmOiAxIH1cbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge1ZpZXd9ICovXG4gICAgZ2V0VmlldygpIHsgcmV0dXJuIHRoaXMudmlldyB9XG5cblxuICAgIC8qKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSB2ICovXG4gICAgc2V0Wm9vbUV4dGVudCh2KSB7XG4gICAgICAgIHRoaXMuem9vbUV4dGVudCA9IHZcbiAgICB9XG4gICAgLyoqIEByZXR1cm5zIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICBnZXRab29tRXh0ZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy56b29tRXh0ZW50XG4gICAgfVxuXG4gICAgLyoqIEluaXRpYWxpc2UgY2FudmFzIHRyYW5zZm9ybSB3aXRoIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uLiAqL1xuICAgIGluaXRDYW52YXNUcmFuc2Zvcm0oKSB7XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgIH1cblxuICAgIC8qKiBJbml0aWFsaXNlIGNhbnZhcyB0cmFuc2Zvcm0gd2l0aCBnZW8gdG8gc2NyZWVuIHRyYW5zZm9ybWF0aW9uLCBzbyB0aGF0IGdlbyBvYmplY3RzIGNhbiBiZSBkcmF3biBkaXJlY3RseSBpbiBnZW8gY29vcmRpbmF0ZXMuICovXG4gICAgc2V0Q2FudmFzVHJhbnNmb3JtKCkge1xuICAgICAgICBjb25zdCBrID0gMSAvIHRoaXMudmlldy56XG4gICAgICAgIGNvbnN0IHR4ID0gLXRoaXMudmlldy54IC8gdGhpcy52aWV3LnogKyB0aGlzLncgKiAwLjVcbiAgICAgICAgY29uc3QgdHkgPSB0aGlzLnZpZXcueSAvIHRoaXMudmlldy56ICsgdGhpcy5oICogMC41XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybShrLCAwLCAwLCAtaywgdHgsIHR5KVxuICAgIH1cblxuICAgIC8qKiBHZXQgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byB3ZWJHTCBzY3JlZW4gY29vcmRpbmF0ZXMsIHdpdGhpbiBbLTEsMV0qWy0xLDFdICovXG4gICAgZ2V0V2ViR0xUcmFuc2Zvcm0oKSB7XG4gICAgICAgIGNvbnN0IGt4ID0gMi4wIC8gKHRoaXMudyAqIHRoaXMudmlldy56KVxuICAgICAgICBjb25zdCBreSA9IDIuMCAvICh0aGlzLmggKiB0aGlzLnZpZXcueilcbiAgICAgICAgcmV0dXJuIFtreCwgMC4wLCAwLjAsIDAuMCwga3ksIDAuMCwgLWt4ICogdGhpcy52aWV3LngsIC1reSAqIHRoaXMudmlldy55LCAxLjBdXG4gICAgfVxuXG4gICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGhvdyB0byBkcmF3IHRoZSBtYXAuICovXG4gICAgcmVkcmF3KCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCByZWRyYXcgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIuIFRvIGJlIHVzZWQgYmVmb3JlIGEgcmVkcmF3IGZvciBleGFtcGxlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclxuICAgICAqL1xuICAgIGNsZWFyKGNvbG9yID0gJ3doaXRlJykge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnRyYW5zcGFyZW50QmFja2dyb3VuZCkge1xuICAgICAgICAgICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMudywgdGhpcy5oKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3R4KSB0aGlzLmN0eC5maWxsU3R5bGUgPSBjb2xvclxuICAgICAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgdGhpcy53LCB0aGlzLmgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZHhHZW9cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZHlHZW9cbiAgICAgKi9cbiAgICBwYW4oZHhHZW8gPSAwLCBkeUdlbyA9IDApIHtcbiAgICAgICAgLy9UT0RPIGZvcmNlIGV4dGVuZCB0byByZW1haW5cbiAgICAgICAgdGhpcy52aWV3LnggKz0gZHhHZW9cbiAgICAgICAgdGhpcy52aWV3LnkgKz0gZHlHZW9cbiAgICAgICAgdGhpcy51cGRhdGVFeHRlbnRHZW8oKVxuXG4gICAgICAgIGlmICh0aGlzLmNhbnZhc1NhdmUuYykge1xuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4IC09IGR4R2VvIC8gdGhpcy52aWV3LnpcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSArPSBkeUdlbyAvIHRoaXMudmlldy56XG4gICAgICAgICAgICB0aGlzLmNsZWFyKHRoaXMuYmFja2dyb3VuZENvbG9yKVxuICAgICAgICAgICAgLy8gdGhpcyBkb2VzbnQgd29yayBvbiBtb2JpbGUgaHR0cHM6Ly9naXRodWIuY29tL2V1cm9zdGF0L2dyaWR2aXovaXNzdWVzLzk4XG4gICAgICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLmMsIHRoaXMuY2FudmFzU2F2ZS5keCwgdGhpcy5jYW52YXNTYXZlLmR5KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWm9vbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZiBUaGUgLCB3aXRoaW4gXTAsIEluZmluaXR5XS4gMSBpcyBmb3Igbm8gY2hhbmdlLiA8MSB0byB6b29tLWluLCA+MSB0byB6b29tLW91dC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geEdlbyBUaGUgeCBnZW8gcG9zaXRpb24gZml4ZWQgaW4gdGhlIHNjcmVlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geUdlbyBUaGUgeSBnZW8gcG9zaXRpb24gZml4ZWQgaW4gdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICB6b29tKGYgPSAxLCB4R2VvID0gdGhpcy52aWV3LngsIHlHZW8gPSB0aGlzLnZpZXcueSkge1xuICAgICAgICAvL1RPRE8gZm9yY2UgZ2VvIGV4dGVuZCB0byByZW1haW5cblxuICAgICAgICAvL3RyeWluZyB0byB6b29tIGluL291dCBiZXlvbmQgbGltaXRcbiAgICAgICAgaWYgKHRoaXMuem9vbUV4dGVudFswXSA9PSB0aGlzLnZpZXcueiAmJiBmIDw9IDEpIHJldHVyblxuICAgICAgICBpZiAodGhpcy56b29tRXh0ZW50WzFdID09IHRoaXMudmlldy56ICYmIGYgPj0gMSkgcmV0dXJuXG5cbiAgICAgICAgLy9lbnN1cmUgem9vbSBleHRlbnQgcHJlc2VydmVkXG4gICAgICAgIGNvbnN0IG5ld1pmID0gZiAqIHRoaXMudmlldy56XG4gICAgICAgIGlmIChuZXdaZiA8IHRoaXMuem9vbUV4dGVudFswXSkgZiA9IHRoaXMuem9vbUV4dGVudFswXSAvIHRoaXMudmlldy56XG4gICAgICAgIGlmIChuZXdaZiA+IHRoaXMuem9vbUV4dGVudFsxXSkgZiA9IHRoaXMuem9vbUV4dGVudFsxXSAvIHRoaXMudmlldy56XG5cbiAgICAgICAgdGhpcy52aWV3LnogKj0gZlxuICAgICAgICBjb25zdCBkeEdlbyA9ICh4R2VvIC0gdGhpcy52aWV3LngpICogKDEgLSBmKVxuICAgICAgICB0aGlzLnZpZXcueCArPSBkeEdlb1xuICAgICAgICBjb25zdCBkeUdlbyA9ICh5R2VvIC0gdGhpcy52aWV3LnkpICogKDEgLSBmKVxuICAgICAgICB0aGlzLnZpZXcueSArPSBkeUdlb1xuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXG5cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzU2F2ZS5jKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKHRoaXMuYmFja2dyb3VuZENvbG9yKVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgLz0gZlxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4ID0gdGhpcy5nZW9Ub1BpeFgoeEdlbykgKiAoMSAtIHRoaXMuY2FudmFzU2F2ZS5mKVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5ID0gdGhpcy5nZW9Ub1BpeFkoeUdlbykgKiAoMSAtIHRoaXMuY2FudmFzU2F2ZS5mKVxuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcbiAgICAgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZShcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYyxcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHgsXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5LFxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5mICogdGhpcy5jYW52YXNTYXZlLmMud2lkdGgsXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgKiB0aGlzLmNhbnZhc1NhdmUuYy5oZWlnaHRcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXJnaW5QeFxuICAgICAqIEByZXR1cm5zIHtFbnZlbG9wZX0gVGhlIGVudmVsb3BlIG9mIHRoZSB2aWV3LCBpbiBnZW8gY29vcmRpbmF0ZXMuXG4gICAgICovXG4gICAgdXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4ID0gMjApIHtcbiAgICAgICAgdGhpcy5leHRHZW8gPSB7XG4gICAgICAgICAgICB4TWluOiB0aGlzLnBpeFRvR2VvWCgtbWFyZ2luUHgpLFxuICAgICAgICAgICAgeE1heDogdGhpcy5waXhUb0dlb1godGhpcy53ICsgbWFyZ2luUHgpLFxuICAgICAgICAgICAgeU1pbjogdGhpcy5waXhUb0dlb1kodGhpcy5oICsgbWFyZ2luUHgpLFxuICAgICAgICAgICAgeU1heDogdGhpcy5waXhUb0dlb1koLW1hcmdpblB4KSxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5leHRHZW9cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgb2JqZWN0IGhhcyB0byBiZSBkcmF3blxuICAgICAqXG4gICAgICogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSBvYmpcbiAgICAgKi9cbiAgICB0b0RyYXcob2JqKSB7XG4gICAgICAgIGlmIChvYmoueCA8IHRoaXMuZXh0R2VvLnhNaW4pIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAob2JqLnggPiB0aGlzLmV4dEdlby54TWF4KSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKG9iai55IDwgdGhpcy5leHRHZW8ueU1pbikgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChvYmoueSA+IHRoaXMuZXh0R2VvLnlNYXgpIHJldHVybiBmYWxzZVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vY29udmVyc2lvbiBmdW5jdGlvbnNcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geEdlbyBHZW8geCBjb29yZGluYXRlLCBpbiBtLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNjcmVlbiB4IGNvb3JkaW5hdGUsIGluIHBpeC5cbiAgICAgKi9cbiAgICBnZW9Ub1BpeFgoeEdlbykge1xuICAgICAgICByZXR1cm4gKHhHZW8gLSB0aGlzLnZpZXcueCkgLyB0aGlzLnZpZXcueiArIHRoaXMudyAqIDAuNVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geUdlbyBHZW8geSBjb29yZGluYXRlLCBpbiBtLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNjcmVlbiB5IGNvb3JkaW5hdGUsIGluIHBpeC5cbiAgICAgKi9cbiAgICBnZW9Ub1BpeFkoeUdlbykge1xuICAgICAgICByZXR1cm4gLSh5R2VvIC0gdGhpcy52aWV3LnkpIC8gdGhpcy52aWV3LnogKyB0aGlzLmggKiAwLjVcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggU2NyZWVuIHggY29vcmRpbmF0ZSwgaW4gcGl4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEdlbyB4IGNvb3JkaW5hdGUsIGluIG0uXG4gICAgICovXG4gICAgcGl4VG9HZW9YKHgpIHtcbiAgICAgICAgcmV0dXJuICh4IC0gdGhpcy53ICogMC41KSAqIHRoaXMudmlldy56ICsgdGhpcy52aWV3LnhcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgU2NyZWVuIHkgY29vcmRpbmF0ZSwgaW4gcGl4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEdlbyB5IGNvb3JkaW5hdGUsIGluIG0uXG4gICAgICovXG4gICAgcGl4VG9HZW9ZKHkpIHtcbiAgICAgICAgcmV0dXJuIC0oeSAtIHRoaXMuaCAqIDAuNSkgKiB0aGlzLnZpZXcueiArIHRoaXMudmlldy55XG4gICAgfVxuXG4gICAgLyoqIEdldCB4LHkseiBlbGVtZW50cyBmcm9tIFVSTCBhbmQgYXNzaWduIHRoZW0gdG8gdGhlIHZpZXcuICovXG4gICAgc2V0Vmlld0Zyb21VUkwoKSB7XG4gICAgICAgIGNvbnN0IHggPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd4JyksXG4gICAgICAgICAgICB5ID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZSgneScpLFxuICAgICAgICAgICAgeiA9IEdlb0NhbnZhcy5nZXRQYXJhbWV0ZXJCeU5hbWUoJ3onKVxuICAgICAgICBpZiAoeCAhPSBudWxsICYmIHggIT0gdW5kZWZpbmVkICYmICFpc05hTigreCkpIHRoaXMudmlldy54ID0gK3hcbiAgICAgICAgaWYgKHkgIT0gbnVsbCAmJiB5ICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4oK3kpKSB0aGlzLnZpZXcueSA9ICt5XG4gICAgICAgIGlmICh6ICE9IG51bGwgJiYgeiAhPSB1bmRlZmluZWQgJiYgIWlzTmFOKCt6KSkgdGhpcy52aWV3LnogPSArelxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIFVSTCBwYXJhbWV0ZXIgYnkgbmFtZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAgICovXG4gICAgc3RhdGljIGdldFBhcmFtZXRlckJ5TmFtZShuYW1lKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1tcXFtdLywgJ1xcXFxbJykucmVwbGFjZSgvW1xcXV0vLCAnXFxcXF0nKVxuICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKCdbXFxcXD8mXScgKyBuYW1lICsgJz0oW14mI10qKScpLFxuICAgICAgICAgICAgcmVzdWx0cyA9IHJlZ2V4LmV4ZWMobG9jYXRpb24uc2VhcmNoKVxuICAgICAgICByZXR1cm4gIXJlc3VsdHMgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdHNbMV0ucmVwbGFjZSgvXFwrL2csICcgJykpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBEcmF3YWJsZSB9IGZyb20gXCIuL0RyYXdhYmxlLmpzXCJcblxuLyoqXG4gKiBAbW9kdWxlIGNvcmVcbiAqIEBhYnN0cmFjdFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTGF5ZXIgZXh0ZW5kcyBEcmF3YWJsZSB7XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGxheWVyLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbGVnZW5kXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgZHJhdyhnZW9DYW52YXMsIGxlZ2VuZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBkcmF3IG5vdCBpbXBsZW1lbnRlZC4nKVxuICAgIH1cblxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG5cbi8qKlxuICogQSBsZWdlbmQgY29udGFpbmVyLlxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTGVnZW5kIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5pZCA9IG9wdHMuaWRcblxuICAgICAgICAvL1RPRE8gc3RvcCB1c2luZyBpdC4gVXNlIHN0eWxlIG1ldGhvZCBiZWxvdyBpbnN0ZWFkLlxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLnRvcCA9IG9wdHMudG9wXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmJvdHRvbSA9IG9wdHMuYm90dG9tXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmxlZnQgPSBvcHRzLmxlZnRcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMucmlnaHQgPSBvcHRzLnJpZ2h0XG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBvcHRzLmJhY2tncm91bmQgfHwgJ25vbmUnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLnBhZGRpbmcgPSBvcHRzLnBhZGRpbmcgfHwgJzVweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMuYm9yZGVyID0gb3B0cy5ib3JkZXIgfHwgJzBweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSA9IG9wdHNbJ2JvcmRlci1yYWRpdXMnXSB8fCAnbm9uZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2JveC1zaGFkb3cnXSA9IG9wdHNbJ2JveC1zaGFkb3cnXSB8fCAnbm9uZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2ZvbnQtZmFtaWx5J10gPSBvcHRzWydmb250LWZhbWlseSddIHx8ICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgLy90aGlzLndpZHRoID0gb3B0cy53aWR0aFxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgLy90aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0XG5cbiAgICAgICAgLy90aGUgZGl2IGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMuaWQpIHRoaXMuZGl2ID0gc2VsZWN0KCcjJyArIHRoaXMuaWQpXG5cbiAgICAgICAgaWYgKCF0aGlzLmRpdiB8fCB0aGlzLmRpdi5lbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLmRpdiA9IHNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSlcbiAgICAgICAgICAgIGlmICh0aGlzLmlkKSB0aGlzLmRpdi5hdHRyKCdpZCcsIHRoaXMuaWQpXG4gICAgICAgIH1cblxuICAgICAgICAvL3NldCBzdHlsZVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnYmFja2dyb3VuZCcsIHRoaXMuYmFja2dyb3VuZClcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ3BhZGRpbmcnLCB0aGlzLnBhZGRpbmcpXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3JkZXInLCB0aGlzLmJvcmRlcilcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCB0aGlzWydib3JkZXItcmFkaXVzJ10pXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3gtc2hhZG93JywgdGhpc1snYm94LXNoYWRvdyddKVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnZm9udC1mYW1pbHknLCB0aGlzWydmb250LWZhbWlseSddKVxuXG4gICAgICAgIC8vaWYgKHRoaXMud2lkdGgpIHRoaXMuZGl2LnN0eWxlKCd3aWR0aCcsIHRoaXMud2lkdGgpXG4gICAgICAgIC8vaWYgKHRoaXMuaGVpZ2h0KSB0aGlzLmRpdi5zdHlsZSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLnRpdGxlID0gb3B0cy50aXRsZVxuICAgICAgICB0aGlzLnRpdGxlRm9udFNpemUgPSBvcHRzLnRpdGxlRm9udFNpemUgfHwgJzAuOGVtJ1xuICAgICAgICB0aGlzLnRpdGxlRm9udFdlaWdodCA9IG9wdHMudGl0bGVGb250V2VpZ2h0IHx8ICdib2xkJ1xuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy5sYWJlbFVuaXRUZXh0ID0gb3B0cy5sYWJlbFVuaXRUZXh0IHx8ICcnXG4gICAgICAgIHRoaXMubGFiZWxGb3JtYXQgPSBvcHRzLmxhYmVsRm9ybWF0XG4gICAgfVxuXG5cbiAgICBtYWtlVGl0bGUoKSB7XG4gICAgICAgIGlmICghdGhpcy50aXRsZSkgcmV0dXJuXG4gICAgICAgIHRoaXMuZGl2XG4gICAgICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLnRpdGxlRm9udFNpemUpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgdGhpcy50aXRsZUZvbnRXZWlnaHQpXG4gICAgICAgICAgICAuc3R5bGUoJ21hcmdpbi1ib3R0b20nLCAnN3B4JylcbiAgICAgICAgICAgIC50ZXh0KHRoaXMudGl0bGUpXG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBhIHN0eWxlIHRvIHRoZSBsZWdlbmQgZGl2LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZcbiAgICAgKiBAcmV0dXJucyB7dGhpc3xzdHJpbmd9XG4gICAgICovXG4gICAgc3R5bGUoaywgdikge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy5kaXYuc3R5bGUoaylcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoaywgdilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHVwZGF0ZShvcHRzID0ge30pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTGVnZW5kIHVwZGF0ZSBub3QgaW1wbGVtZW50ZWQgeWV0LicpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vLyBpbnRlcm5hbCBpbXBvcnRzXG5pbXBvcnQgeyBHZW9DYW52YXMgfSBmcm9tICcuL0dlb0NhbnZhcy5qcydcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuL1Rvb2x0aXAuanMnXG5pbXBvcnQgeyBab29tQnV0dG9ucyB9IGZyb20gJy4uL2J1dHRvbi9ab29tQnV0dG9ucy5qcydcbmltcG9ydCB7IEZ1bGxzY3JlZW5CdXR0b24gfSBmcm9tICcuLi9idXR0b24vRnVsbHNjcmVlbkJ1dHRvbi5qcydcblxuLy8gZXh0ZXJuYWwgaW1wb3J0c1xuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuXG4vKipcbiAqIEEgZ3JpZHZpeiBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAbW9kdWxlIGNvcmVcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIE1hcCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gY29udGFpbmVyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXIsIG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGxheWVycy5cbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL0xheWVyLmpzXCIpLkxheWVyPn1cbiAgICAgICAgICogKi9cbiAgICAgICAgdGhpcy5sYXllcnMgPSBvcHRzLmxheWVycyB8fCBbXVxuXG4gICAgICAgIC8vZ2V0IGNvbnRhaW5lciBlbGVtZW50XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncmlkdml6JylcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IGZpbmQgZ3JpZHZpeiBjb250YWluZXIgZWxlbWVudC4nKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvL2h0dHBzOi8vY3NzLXRyaWNrcy5jb20vYWJzb2x1dGUtcG9zaXRpb25pbmctaW5zaWRlLXJlbGF0aXZlLXBvc2l0aW9uaW5nL1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjsgLy8gY29udGFpbmVyIGVsZW1lbnQgbXVzdCBoYXZlIHJlbGF0aXZlIHBvc2l0aW9uaW5nXG5cbiAgICAgICAgLy9zZXQgZGltZW5zaW9uc1xuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy53ID0gb3B0cy53IHx8IHRoaXMuY29udGFpbmVyLm9mZnNldFdpZHRoXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmggPSBvcHRzLmggfHwgdGhpcy5jb250YWluZXIub2Zmc2V0SGVpZ2h0XG5cbiAgICAgICAgLy9jcmVhdGUgY2FudmFzIGVsZW1lbnQgaWYgbm90IHNwZWNpZmllZFxuICAgICAgICAvKiogQHR5cGUge0hUTUxDYW52YXNFbGVtZW50fSAqL1xuICAgICAgICB0aGlzLl9jYW52YXMgPSBvcHRzLmNhbnZhcyB8fCB0aGlzLmluaXRpYWxpc2VDYW52YXMoKVxuXG4gICAgICAgIC8qKiBNYWtlIGdlbyBjYW52YXNcbiAgICAgICAgICogQHR5cGUge0dlb0NhbnZhc31cbiAgICAgICAgICogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5nZW9DYW52YXMgPSBuZXcgR2VvQ2FudmFzKHRoaXMuX2NhbnZhcywgb3B0cy54LCBvcHRzLnksIG9wdHMueiwgb3B0cylcbiAgICAgICAgdGhpcy5nZW9DYW52YXMucmVkcmF3ID0gKCkgPT4geyB0aGlzLnJlZHJhdygpIH1cblxuICAgICAgICAvLyBsZWdlbmQgZGl2XG4gICAgICAgIHRoaXMubGVnZW5kRGl2SWQgPSBvcHRzLmxlZ2VuZERpdklkIHx8ICdndml6TGVnZW5kJ1xuICAgICAgICB0aGlzLmxlZ2VuZCA9IHNlbGVjdCgnIycgKyB0aGlzLmxlZ2VuZERpdklkKVxuICAgICAgICBpZiAodGhpcy5sZWdlbmQuZW1wdHkoKSkgdGhpcy5pbml0aWFsaXNlTGVnZW5kKClcblxuXG4gICAgICAgIC8vdG9vbHRpcFxuXG4gICAgICAgIC8vIHNldCBBcHAgY29udGFpbmVyIGFzIGRlZmF1bHQgcGFyZW50IGVsZW1lbnQgZm9yIHRvb2x0aXBcbiAgICAgICAgaWYgKCFvcHRzLnRvb2x0aXApIG9wdHMudG9vbHRpcCA9IHt9XG4gICAgICAgIGlmICghb3B0cy50b29sdGlwLnBhcmVudEVsZW1lbnQpIG9wdHMudG9vbHRpcC5wYXJlbnRFbGVtZW50ID0gdGhpcy5jb250YWluZXJcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge1Rvb2x0aXB9ICovXG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG5ldyBUb29sdGlwKG9wdHMudG9vbHRpcClcblxuICAgICAgICAvLyBhZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGNvbnRhaW5lclxuICAgICAgICB0aGlzLm1vdXNlT3ZlckhhbmRsZXIgPSAoZSkgPT4gdGhpcy5mb2N1c0NlbGwoZSlcbiAgICAgICAgdGhpcy5tb3VzZU1vdmVIYW5kbGVyID0gKGUpID0+IHRoaXMuZm9jdXNDZWxsKGUpXG4gICAgICAgIHRoaXMubW91c2VPdXRIYW5kbGVyID0gKGUpID0+IHRoaXMudG9vbHRpcC5oaWRlKClcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMubW91c2VPdmVySGFuZGxlcilcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlSGFuZGxlcilcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5tb3VzZU91dEhhbmRsZXIpXG5cbiAgICAgICAgLy8gYWRkIGV4dHJhIGxvZ2ljIHRvIG9uWm9vbVN0YXJ0RnVuXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLm9uWm9vbVN0YXJ0RnVuID0gKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRzLm9uWm9vbVN0YXJ0RnVuKSBvcHRzLm9uWm9vbVN0YXJ0RnVuKGUpXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvL2ZvciBtb3VzZSBvdmVyXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR8bnVsbH0gKi9cbiAgICAgICAgdGhpcy5jYW52YXNTYXZlID0gbnVsbFxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3IgPSBvcHRzLnNlbGVjdGlvblJlY3RhbmdsZUNvbG9yIHx8ICdyZWQnXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXggPSBvcHRzLnNlbGVjdGlvblJlY3RhbmdsZVdpZHRoUGl4IHx8ICgoKSA9PiA0KSAvLyhyLHopID0+IHt9XG5cbiAgICAgICAgLy8gdHJhbnNwYXJlbnQgYmFja2dyb3VuZCAoZS5nLiBsZWFmbGV0KSAncmVkIHBhaW50aW5nJyBmaXhcbiAgICAgICAgdGhpcy50cmFuc3BhcmVudEJhY2tncm91bmQgPSBvcHRzLnRyYW5zcGFyZW50QmFja2dyb3VuZFxuXG4gICAgICAgIC8vc2V0IGRlZmF1bHQgZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXG4gICAgICAgIHRoaXMuZGVmYXVsdEdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9XG4gICAgICAgICAgICBvcHRzLmRlZmF1bHRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gfHwgdGhpcy5nZW9DYW52YXMuY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvblxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBAcHJvdGVjdGVkIFxuICAgICAqIEByZXR1cm5zIHtIVE1MQ2FudmFzRWxlbWVudH1cbiAgICAqL1xuICAgIGluaXRpYWxpc2VDYW52YXMoKSB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJycgKyB0aGlzLncpXG4gICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpXG4gICAgICAgIHJldHVybiBjYW52YXNcbiAgICB9XG5cblxuICAgIGluaXRpYWxpc2VMZWdlbmQoKSB7XG4gICAgICAgIHRoaXMubGVnZW5kID0gc2VsZWN0KHRoaXMuY29udGFpbmVyLmlkICYmIHRoaXMuY29udGFpbmVyLmlkICE9ICcnID8gJyMnICsgdGhpcy5jb250YWluZXIuaWQgOiAnYm9keScpXG4gICAgICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgLmF0dHIoJ2lkJywgdGhpcy5sZWdlbmREaXZJZClcbiAgICAgICAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgICAgICAgLnN0eWxlKCd3aWR0aCcsICdhdXRvJylcbiAgICAgICAgICAgIC5zdHlsZSgnaGVpZ2h0JywgJ2F1dG8nKVxuICAgICAgICAgICAgLnN0eWxlKCdiYWNrZ3JvdW5kJywgJyNGRkZGRkYnKVxuICAgICAgICAgICAgLy8uc3R5bGUoXCJwYWRkaW5nXCIsIHRoaXMucGFkZGluZylcbiAgICAgICAgICAgIC5zdHlsZSgnYm9yZGVyJywgJzBweCcpXG4gICAgICAgICAgICAvLy5zdHlsZSgnYm9yZGVyLXJhZGl1cycsICc1cHgnKVxuICAgICAgICAgICAgLnN0eWxlKCdib3gtc2hhZG93JywgJzNweCAzcHggM3B4IGdyZXksIC0zcHggLTNweCAzcHggI2RkZCcpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtZmFtaWx5JywgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnKVxuICAgICAgICAgICAgLnN0eWxlKCdib3R0b20nLCAnMTVweCcpXG4gICAgICAgICAgICAuc3R5bGUoJ3JpZ2h0JywgJzE1cHgnKVxuICAgICAgICAvL2hpZGVcbiAgICAgICAgLy8uc3R5bGUoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0L2dldCBsYXllciBzdGFjay5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge3VuZGVmaW5lZHxpbXBvcnQoXCIuL0xheWVyLmpzXCIpLkxheWVyfGltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXJbXX0gbGF5ZXJzIFxuICAgICAqIEByZXR1cm5zIHsgdGhpcyB8IGltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXJbXSB9XG4gICAgICovXG4gICAgbGF5ZXJzXyhsYXllcnMpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLmxheWVyc1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheWVycykpIHRoaXMubGF5ZXJzID0gbGF5ZXJzXG4gICAgICAgICAgICBlbHNlIHRoaXMubGF5ZXJzID0gW2xheWVyc11cbiAgICAgICAgZWxzZSB0aGlzLmxheWVycyA9IGFyZ3VtZW50c1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7dGhpc30gKi9cbiAgICByZWRyYXcoKSB7XG4gICAgICAgIC8vcmVtb3ZlIGxlZ2VuZCBlbGVtZW50c1xuICAgICAgICBpZiAodGhpcy5sZWdlbmQpIHRoaXMubGVnZW5kLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2xlYXIodGhpcy5nZW9DYW52YXMuYmFja2dyb3VuZENvbG9yKVxuXG4gICAgICAgIGNvbnN0IHogPSB0aGlzLmdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgdGhpcy51cGRhdGVFeHRlbnRHZW8oKVxuXG4gICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcblxuICAgICAgICAgICAgLy9jaGVjayBpZiBsYXllciBpcyB2aXNpYmxlXG4gICAgICAgICAgICBpZiAobGF5ZXIudmlzaWJsZSAmJiAhbGF5ZXIudmlzaWJsZSh6KSkgY29udGludWVcblxuICAgICAgICAgICAgLy9zZXQgbGF5ZXIgYWxwaGEgYW5kIGJsZW5kIG1vZGVcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5nbG9iYWxBbHBoYSA9IGxheWVyLmFscGhhID8gbGF5ZXIuYWxwaGEoeikgOiAxLjBcbiAgICAgICAgICAgIGlmIChsYXllci5ibGVuZE9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gbGF5ZXIuYmxlbmRPcGVyYXRpb24oeilcblxuICAgICAgICAgICAgLy9zZXQgYWZmaW4gdHJhbnNmb3JtIHRvIGRyYXcgd2l0aCBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXNcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsYXllclxuICAgICAgICAgICAgbGF5ZXIuZHJhdyh0aGlzLmdlb0NhbnZhcywgdGhpcy5sZWdlbmQpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsYXllciBmaWx0ZXJcbiAgICAgICAgICAgIGlmIChsYXllci5maWx0ZXJDb2xvcilcbiAgICAgICAgICAgICAgICBsYXllci5kcmF3RmlsdGVyKHRoaXMuZ2VvQ2FudmFzKVxuXG4gICAgICAgICAgICAvL3Jlc3RvcmUgZGVmYXVsdCBhbHBoYSBhbmQgYmxlbmQgb3BlcmF0aW9uXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZ2xvYmFsQWxwaGEgPSAxLjBcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSB0aGlzLmRlZmF1bHRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb25cbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IG51bGxcblxuICAgICAgICAvLyBsaXN0ZW4gZm9yIHJlc2l6ZSBldmVudHMgb24gdGhlIEFwcCdzIGNvbnRhaW5lciBhbmQgaGFuZGxlIHRoZW1cbiAgICAgICAgdGhpcy5kZWZpbmVSZXNpemVPYnNlcnZlcih0aGlzLmNvbnRhaW5lciwgdGhpcy5fY2FudmFzKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWFyZ2luUHhcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KCcuL0dlb0NhbnZhcy5qcycpLkVudmVsb3BlfVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICB1cGRhdGVFeHRlbnRHZW8obWFyZ2luUHggPSAyMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMudXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4KVxuICAgIH1cblxuXG5cbiAgICAvKiogQHBhcmFtIHtNb3VzZUV2ZW50fSBlICovXG4gICAgZm9jdXNDZWxsKGUpIHtcbiAgICAgICAgLy9jb21wdXRlIG1vdXNlIGdlbyBwb3NpdGlvblxuICAgICAgICBjb25zdCBtb3VzZVBvc2l0aW9uR2VvID0ge1xuICAgICAgICAgICAgeDogdGhpcy5nZW9DYW52YXMucGl4VG9HZW9YKGUub2Zmc2V0WCArIHRoaXMudG9vbHRpcC54TW91c2VPZmZzZXQpLFxuICAgICAgICAgICAgeTogdGhpcy5nZW9DYW52YXMucGl4VG9HZW9ZKGUub2Zmc2V0WSArIHRoaXMudG9vbHRpcC55TW91c2VPZmZzZXQpLFxuICAgICAgICB9XG4gICAgICAgIC8qKiBAdHlwZSB7e2NlbGw6aW1wb3J0KCcuL0RhdGFzZXQuanMnKS5DZWxsLGh0bWw6c3RyaW5nLHJlc29sdXRpb246bnVtYmVyfSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgICAgY29uc3QgZm9jdXMgPSB0aGlzLmdldENlbGxGb2N1c0luZm8obW91c2VQb3NpdGlvbkdlbylcblxuICAgICAgICAvLyB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIChlLmcuIGxlYWZsZXQpICdyZWQgcGFpbnRpbmcnIGZpeFxuICAgICAgICBpZiAodGhpcy50cmFuc3BhcmVudEJhY2tncm91bmQpIHtcbiAgICAgICAgICAgIGlmIChmb2N1cykge1xuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5odG1sKGZvY3VzLmh0bWwpXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnNldFBvc2l0aW9uKGUpXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnNob3coKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmdldENvbnRleHQoJzJkJyk/LmRyYXdJbWFnZSh0aGlzLmdlb0NhbnZhcy5jYW52YXMsIDAsIDApXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChmb2N1cy5odG1sKVxuICAgICAgICAgICAgdGhpcy50b29sdGlwLnNldFBvc2l0aW9uKGUpXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2hvdygpXG5cbiAgICAgICAgICAgIC8vc2hvdyBjZWxsIHBvc2l0aW9uIGFzIGEgcmVjdGFuZ2xlXG4gICAgICAgICAgICBpZiAoIXRoaXMuY2FudmFzU2F2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuaClcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZ2V0Q29udGV4dCgnMmQnKT8uZHJhd0ltYWdlKHRoaXMuZ2VvQ2FudmFzLmNhbnZhcywgMCwgMClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuY3R4LmRyYXdJbWFnZSh0aGlzLmNhbnZhc1NhdmUsIDAsIDApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZHJhdyBpbWFnZSBzYXZlZCArIGRyYXcgcmVjdGFuZ2xlXG4gICAgICAgICAgICBjb25zdCByZWN0V1BpeCA9IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXhcbiAgICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXgoZm9jdXMucmVzb2x1dGlvbiwgdGhpcy5nZW9DYW52YXMudmlldy56KVxuICAgICAgICAgICAgICAgIDogNFxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnNlbGVjdGlvblJlY3RhbmdsZUNvbG9yXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gcmVjdFdQaXhcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHgucmVjdChcbiAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5nZW9Ub1BpeFgoZm9jdXMuY2VsbC54KSAtIHJlY3RXUGl4IC8gMixcbiAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5nZW9Ub1BpeFkoZm9jdXMuY2VsbC55KSArIHJlY3RXUGl4IC8gMixcbiAgICAgICAgICAgICAgICBmb2N1cy5yZXNvbHV0aW9uIC8gdGhpcy5nZW9DYW52YXMudmlldy56ICsgcmVjdFdQaXgsXG4gICAgICAgICAgICAgICAgLWZvY3VzLnJlc29sdXRpb24gLyB0aGlzLmdlb0NhbnZhcy52aWV3LnogLSByZWN0V1BpeFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgICAgICBpZiAodGhpcy5jYW52YXNTYXZlKSB0aGlzLmdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzU2F2ZSwgMCwgMClcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBjZWxsIEhUTUwgaW5mbyBhdCBhIGdpdmVuIGdlbyBwb3NpdGlvbi5cbiAgICAgKiBUaGlzIGlzIHVzZWZ1bGwgZm9yIHVzZXIgaW50ZXJhY3Rpb25zLCB0byBzaG93IHRoaXMgaW5mbyB3aGVyZSB0aGUgdXNlciBjbGlja3MgZm9yIGV4YW1wbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IHBvc0dlb1xuICAgICAqIEByZXR1cm5zIHt7Y2VsbDppbXBvcnQoJy4vRGF0YXNldC5qcycpLkNlbGwsaHRtbDpzdHJpbmcscmVzb2x1dGlvbjpudW1iZXJ9IHwgdW5kZWZpbmVkfVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBnZXRDZWxsRm9jdXNJbmZvKHBvc0dlbykge1xuICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxheWVycywgc3RhcnRpbmcgZnJvbSB0b3BcbiAgICAgICAgY29uc3QgeiA9IHRoaXMuZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5sYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9MYXllci5qc1wiKS5MYXllcn0gKi9cbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllcnNbaV1cbiAgICAgICAgICAgIGlmIChsYXllci52aXNpYmxlICYmICFsYXllci52aXNpYmxlKHopKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCFsYXllci5jZWxsSW5mb0hUTUwpIGNvbnRpbnVlXG4gICAgICAgICAgICAvL2lmIChsYXllci5jZWxsSW5mb0hUTUwgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgIGlmICghbGF5ZXIuZ2V0RGF0YXNldCkgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IGRzYyA9IGxheWVyLmdldERhdGFzZXQoeilcbiAgICAgICAgICAgIGlmICghZHNjKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBjZWxsIGF0IG1vdXNlIHBvc2l0aW9uXG4gICAgICAgICAgICAvKiogQHR5cGUge2ltcG9ydCgnLi9EYXRhc2V0LmpzJykuQ2VsbHx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gZHNjLmdldENlbGxGcm9tUG9zaXRpb24ocG9zR2VvLCBkc2MuZ2V0Vmlld0NhY2hlKCkpXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGNlbGwsIGRzYy5yZXNvbHV0aW9uKVxuICAgICAgICAgICAgaWYgKCFjZWxsKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgICAgIC8vcmFyZSBjYXNlIGZvciBhIGRhdGFzZXQgd2l0aCBtaXhlZCByZXNvbHV0aW9uc1xuICAgICAgICAgICAgaWYgKGRzYy5taXhlZFJlc29sdXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gK2RzYy5taXhlZFJlc29sdXRpb24oY2VsbClcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gbGF5ZXIuY2VsbEluZm9IVE1MKGNlbGwsIHIpXG4gICAgICAgICAgICAgICAgaWYgKCFodG1sKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogciB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsYXllci5jZWxsSW5mb0hUTUwoY2VsbCwgZHNjLmdldFJlc29sdXRpb24oKSlcbiAgICAgICAgICAgIGlmICghaHRtbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogZHNjLmdldFJlc29sdXRpb24oKSB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ8dW5kZWZpbmVkfSB6XG4gICAgICovXG4gICAgc2V0Vmlldyh4LCB5LCB6ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnZpZXcueCA9IHhcbiAgICAgICAgdGhpcy5nZW9DYW52YXMudmlldy55ID0geVxuICAgICAgICBpZiAoeiAhPSB1bmRlZmluZWQpIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiA9IHpcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge2ltcG9ydCgnLi9HZW9DYW52YXMuanMnKS5WaWV3fSAqL1xuICAgIGdldFZpZXcoKSB7IHJldHVybiB0aGlzLmdlb0NhbnZhcy52aWV3IH1cblxuICAgIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICAgIGdldFpvb20oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy52aWV3LnpcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7bnVtYmVyfSB6IEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHNldFpvb20oeikge1xuICAgICAgICB0aGlzLmdlb0NhbnZhcy52aWV3LnogPSB6XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG5cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXI+fSAqL1xuICAgIGdldFpvb21FeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5nZXRab29tRXh0ZW50KClcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRab29tRXh0ZW50KHZhbCkge1xuICAgICAgICB0aGlzLmdlb0NhbnZhcy5zZXRab29tRXh0ZW50KHZhbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cblxuXG4gICAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gICAgZ2V0QmFja2dyb3VuZENvbG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMuYmFja2dyb3VuZENvbG9yXG4gICAgfVxuICAgIC8qKiBAcGFyYW0ge3N0cmluZ30gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHNldEJhY2tncm91bmRDb2xvcih2YWwpIHtcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuYmFja2dyb3VuZENvbG9yID0gdmFsXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNldCBvZiB6b29tIGJ1dHRvbnMgdG8gdGhlIG1hcFxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRab29tQnV0dG9ucyhvcHRzKSB7XG4gICAgICAgIC8vICogb3B0cy5pZFxuICAgICAgICAvLyAqIG9wdHMub25ab29tIC0gY3VzdG9tIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAgLy8gKiBvcHRzLnhcbiAgICAgICAgLy8gKiBvcHRzLnlcbiAgICAgICAgLy8gKiBvcHRzLmRlbHRhIC0gem9vbSBkZWx0YSBhcHBsaWVkIG9uIGVhY2ggY2xpY2tcblxuICAgICAgICB0aGlzLnpvb21CdXR0b25zID0gbmV3IFpvb21CdXR0b25zKHtcbiAgICAgICAgICAgIG1hcDogdGhpcyxcbiAgICAgICAgICAgIGlkOiBvcHRzPy5pZCB8fCAnZ3JpZHZpei16b29tLWJ1dHRvbnMnLFxuICAgICAgICAgICAgY2xhc3M6IG9wdHM/LmNsYXNzLFxuICAgICAgICAgICAgeDogb3B0cz8ueCxcbiAgICAgICAgICAgIHk6IG9wdHM/LnksXG4gICAgICAgICAgICBvblpvb206IG9wdHM/Lm9uWm9vbSxcbiAgICAgICAgICAgIGRlbHRhOiBvcHRzPy5kZWx0YSB8fCAwLjJcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmdWxsc2NyZWVuIHRvZ2dsZSBidXR0b24gdG8gdGhlIGFwcFxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRGdWxsc2NyZWVuQnV0dG9uKG9wdHMpIHtcbiAgICAgICAgLy8gKiBvcHRzLm1hcCAtIHRoZSBncmlkdml6IG1hcFxuICAgICAgICAvLyAqIG9wdHMuaWRcbiAgICAgICAgLy8gKiBvcHRzLnhcbiAgICAgICAgLy8gKiBvcHRzLnlcblxuICAgICAgICB0aGlzLmZ1bGxzY3JlZW5CdXR0b24gPSBuZXcgRnVsbHNjcmVlbkJ1dHRvbih7XG4gICAgICAgICAgICBtYXA6IHRoaXMsXG4gICAgICAgICAgICBpZDogb3B0cz8uaWQgfHwgJ2dyaWR2aXotZnVsbHNjcmVlbi1idXR0b24nLFxuICAgICAgICAgICAgY2xhc3M6IG9wdHM/LmNsYXNzLFxuICAgICAgICAgICAgeDogb3B0cz8ueCxcbiAgICAgICAgICAgIHk6IG9wdHM/LnlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRWaWV3RnJvbVVSTCgpIHtcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuc2V0Vmlld0Zyb21VUkwoKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBBZGQgYSByZXNpemUgZXZlbnQgb2JzZXJ2ZXIgdG8gdGhlIEFwcHMgY29udGFpbmVyIGFuZCB1cGRhdGUgdGhlIGNhbnZhcyBhY2NvcmRpbmdseVxuICAgICAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnR9IGNvbnRhaW5lciBUaGUgQXBwJ3MgY29udGFpbmVyIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXMgVGhlIEFwcCBjYW52YXMgZWxlbWVudFxuICAgICAqIEBtZW1iZXJvZiBBcHBcbiAgICAgKi9cbiAgICBkZWZpbmVSZXNpemVPYnNlcnZlcihjb250YWluZXIsIGNhbnZhcykge1xuICAgICAgICAvLyBsaXN0ZW4gdG8gcmVzaXplIGV2ZW50c1xuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGNhbnZhcyBoYXMgYmVlbiBidWlsdFxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5jbGllbnRXaWR0aCA+IDAgJiYgY29udGFpbmVyLmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG9udCBleGNlZWQgbG9vcCBsaW1pdCBmaXJzdFxuICAgICAgICAgICAgICAgIC8vIHNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDkzODQxMjAvcmVzaXplb2JzZXJ2ZXItbG9vcC1saW1pdC1leGNlZWRlZFxuICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZW50cmllcykgfHwgIWVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG1hcCBhbmQgY2FudmFzIHNpemVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaCAhPT0gY29udGFpbmVyLmNsaWVudEhlaWdodCB8fCB0aGlzLncgIT09IGNvbnRhaW5lci5jbGllbnRXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oID0gY29udGFpbmVyLmNsaWVudEhlaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ID0gY29udGFpbmVyLmNsaWVudFdpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5oID0gY29udGFpbmVyLmNsaWVudEhlaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMudyA9IGNvbnRhaW5lci5jbGllbnRXaWR0aFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSBidXR0b24gcG9zaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy56b29tQnV0dG9ucykgdGhpcy56b29tQnV0dG9ucy5ub2RlLnN0eWxlLmxlZnQgPSB0aGlzLncgLSA1MCArICdweCdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0aGlzLmZ1bGxzY3JlZW5CdXR0b24pIHRoaXMuZnVsbHNjcmVlbkJ1dHRvbi5ub2RlLnN0eWxlLmxlZnQgPSB0aGlzLncgLSA1MCArICdweCdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIERlc3Ryb3kgdGhlIG1hcCBhbmQgaXQncyBldmVudCBsaXN0ZW5lcnNcbiAgICAgKiBUaGlzIHNob3VsZCBzaWduaWZpY2FudGx5IHJlZHVjZSB0aGUgbWVtb3J5IHVzZWQgd2hlbiBjcmVhdGluZyBhbmQgZGVzdHJveWluZyBncmlkdml6IG1hcCBpbnN0YW5jZXMgKGZvciBleGFtcGxlIGluIGxlYWZsZXQtZ3JpZHZpeilcbiAgICAgKiBAbWVtYmVyb2YgQXBwXG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgLy8gY2xlYXIgbGF5ZXJzXG4gICAgICAgIHRoaXMubGF5ZXJzID0gW11cbiAgICAgICAgdGhpcy5iZ0xheWVycyA9IFtdXG5cbiAgICAgICAgLy8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyBmcm9tIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLm1vdXNlT3ZlckhhbmRsZXIpXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlSGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCB0aGlzLm1vdXNlT3V0SGFuZGxlcilcblxuICAgICAgICAvLyByZW1vdmUgY2FudmFzXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5yZW1vdmUoKVxuXG4gICAgICAgIC8vIHJlbW92ZSBsZWdlbmRcbiAgICAgICAgdGhpcy5sZWdlbmQ/LnJlbW92ZSgpXG5cbiAgICAgICAgLy8gcmVtb3ZlIHRvb2x0aXBcbiAgICAgICAgdGhpcy50b29sdGlwLnRvb2x0aXA/LnJlbW92ZSgpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEEgbXVsdGkgcmVzb2x1dGlvbiBkYXRhc2V0IG9mIGdyaWQgY2VsbHMuXG4gKiBJdCBjb25zaXN0cyBvZiBkaWZmZXJlbnQge0BsaW5rIERhdGFzZXR9cyBmb3IgZWFjaCByZXNvbHV0aW9uLlxuICpcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTXVsdGlSZXNvbHV0aW9uRGF0YXNldCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmVzb2x1dGlvbnMgVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0cywgaW4gQ1JTIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0PnxmdW5jdGlvbihudW1iZXIpOmltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0fSBkYXRhc2V0cyBUaGUgZGF0YXNldHMgbGlzdCwgb25lIHBlciByZXNvbHV0aW9uLiBPciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGRhdGFzZXQgZnJvbSBhIHJlc29sdXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsge3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFufSB9IG9wdHMgT3B0aW9ucy4gcHJlcHJvY2VzczogQSBmdW5jdGlvbiB0byBhcHBseSBvbiBlYWNoIGRhdGFzZXQgY2VsbCB0byBwcmVwYXJlIGl0cyB2YWx1ZXMuIENhbiBiZSB1c2VkIGFsc28gdG8gc2VsZWN0IGNlbGxzIHRvIGtlZXAuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmVzb2x1dGlvbnMsIGRhdGFzZXRzLCBvcHRzID0ge30pIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0cywgaW4gQ1JTIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbnMgPSByZXNvbHV0aW9uc1xuXG4gICAgICAgIC8qKiBUaGUgZGF0YXNldHMuIElmIHRoZSBsaXN0IGlzIG5vdCBleHBsaWN0ZWx5IGRlZmluZWQsIGJ1aWxkIGl0IGZyb20gdGhlIHJlc29sdXRpb24gbGlzdCB3aXRoIHRoZSBmdW5jdGlvblxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0Pn0gKi9cbiAgICAgICAgdGhpcy5kYXRhc2V0cyA9ICh0eXBlb2YgZGF0YXNldHMgPT09ICdmdW5jdGlvbicpID8gdGhpcy5yZXNvbHV0aW9ucy5tYXAoZGF0YXNldHMpIDogZGF0YXNldHNcblxuICAgICAgICAvL3RoZXJlIG11c3QgYmUgYXMgbWFueSBkYXRhc2V0cyBhcyByZXNvbHV0aW9uc1xuICAgICAgICBpZiAodGhpcy5kYXRhc2V0cy5sZW5ndGggPiAxICYmIHRoaXMuZGF0YXNldHMubGVuZ3RoICE9IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdVbmNvbXBhdGlibGUgbnVtYmVyIG9mIGRhdGFzZXRzIGFuZCByZXNvbHV0aW9uczogJyArXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhc2V0cy5sZW5ndGggK1xuICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHV0aW9ucy5sZW5ndGhcbiAgICAgICAgICAgIClcblxuICAgICAgICAvL3NldCBkYXRhc2V0IHByZXByb2Nlc3NlcyBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKG9wdHMucHJlcHJvY2VzcykgdGhpcy5zZXRQcmVwb2Nlc3NlcyhvcHRzLnByZXByb2Nlc3MpXG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHJlbGV2YW50IGRhdGFzZXQgZm9yIGEgc3BlY2lmaWVkIHpvb20uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluUGl4ZWxzUGVyQ2VsbFxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL0RhdGFzZXRcIikuRGF0YXNldHx1bmRlZmluZWR9XG4gICAgICogKi9cbiAgICBnZXREYXRhc2V0KHosIG1pblBpeGVsc1BlckNlbGwpIHtcblxuICAgICAgICAvL3NwZWNpYWwgY2FzZSB3aGl0aCBzaW5nbGUgZGF0YXNldFxuICAgICAgICBpZiAodGhpcy5kYXRhc2V0cy5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMuZGF0YXNldHNbMF1cblxuICAgICAgICBjb25zdCBycyA9IHRoaXMucmVzb2x1dGlvbnNcbiAgICAgICAgbGV0IGkgPSAwXG4gICAgICAgIGxldCB6XyA9IHJzW2ldIC8gbWluUGl4ZWxzUGVyQ2VsbFxuICAgICAgICB3aGlsZSAoel8gPCB6ICYmIGkgPCBycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgel8gPSByc1tpXSAvIG1pblBpeGVsc1BlckNlbGxcbiAgICAgICAgfVxuICAgICAgICAvL2lmIChpID09IDApIHJldHVybiB0aGlzLmRhdGFzZXQuZGF0YXNldHNbMF07XG4gICAgICAgIC8vcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0c1tpIC0gMV07XG4gICAgICAgIGlmIChpID09IHJzLmxlbmd0aCkgcmV0dXJuIHRoaXMuZGF0YXNldHNbcnMubGVuZ3RoIC0gMV1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNldHNbaV1cbiAgICB9XG5cblxuXG4gICAgLyoqXG4gICAgICogU2V0IGEgcHJlcHJvY2VzcyBmdW5jdGlvbiBmb3IgYWxsIGRhdGFzZXRzLlxuICAgICAqIFRoaXMgaXMgYSBmdW5jdGlvbiBhcHBsaWVkIG9uIGVhY2ggY2VsbCBhZnRlciBpdCBoYXMgYmVlbiBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFufSBwcmVwcm9jZXNzXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgc2V0UHJlcG9jZXNzZXMocHJlcHJvY2Vzcykge1xuICAgICAgICBmb3IgKGxldCBkcyBvZiB0aGlzLmRhdGFzZXRzKSBkcy5wcmVwcm9jZXNzID0gcHJlcHJvY2Vzc1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gdG8gZWFzZSB0aGUgY3JlYXRpb24gb2YgbXVsdGkgcmVzb2x1dGlvbiBkYXRhc2V0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHJlc29sdXRpb25zIFRoZSByZXNvbHV0aW9ucyBvZiB0aGUgZGF0YXNldHMsIGluIENSUyBnZW9ncmFwaGljYWwgdW5pdFxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obnVtYmVyKTppbXBvcnQoXCIuL0RhdGFzZXRcIikuRGF0YXNldH0gcmVzVG9EYXRhc2V0IEZ1bmN0aW9uIHJldHVybmluZyBhIGRhdGFzZXQgZnJvbSBhIHJlc29sdXRpb25cbiAgICAgKiBAcGFyYW0geyB7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGwpOmJvb2xlYW59IH0gb3B0cyBPcHRpb25zLiBwcmVwcm9jZXNzOiBBIGZ1bmN0aW9uIHRvIGFwcGx5IG9uIGVhY2ggZGF0YXNldCBjZWxsIHRvIHByZXBhcmUgaXRzIHZhbHVlc1xuICAgICAqIEByZXR1cm5zIHtNdWx0aVJlc29sdXRpb25EYXRhc2V0fVxuICAgICAqL1xuICAgIC8qc3RhdGljIG1ha2UocmVzb2x1dGlvbnMsIHJlc1RvRGF0YXNldCwgb3B0cykge1xuICAgICAgICAvL21ha2UgZGF0YXNldHNcbiAgICAgICAgY29uc3QgZHNjID0gW11cbiAgICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzb2x1dGlvbnMpIGRzYy5wdXNoKHJlc1RvRGF0YXNldChyZXMpKVxuICAgICAgICAvL21ha2UgbXVsdGkgcmVzb2x1dGlvbiBkYXRhc2V0XG4gICAgICAgIHJldHVybiBuZXcgTXVsdGlSZXNvbHV0aW9uRGF0YXNldChkc2MsIHJlc29sdXRpb25zLCBvcHRzKVxuICAgIH0qL1xufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBEcmF3YWJsZSB9IGZyb20gXCIuL0RyYXdhYmxlLmpzXCJcblxuLyoqIEB0eXBlZGVmIHtcInNxdWFyZVwifFwiY2lyY2xlXCJ8XCJkaWFtb25kXCJ8XCJkb251dFwifFwidHJpYW5nbGVfdXBcInxcInRyaWFuZ2xlX2Rvd25cInxcInRyaWFuZ2xlX2xlZnRcInxcInRyaWFuZ2xlX3JpZ2h0XCJ8XCJub25lXCJ9IFNoYXBlICovXG5cbi8qKlxuICogdmlld1NjYWxlIHR5cGVcbiAqIFJldHVybnMgYW4gb2JqZWN0IGZyb20gYSBsaXN0IG9mIGNlbGxzLCBcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihBcnJheS48aW1wb3J0KCcuL0RhdGFzZXQuanMnKS5DZWxsPixudW1iZXIsIG51bWJlcik6Kn0gVmlld1NjYWxlICovXG5cbi8qKlxuICogQSBzdHlsZSwgdG8gc2hvdyBhIGdyaWQgZGF0YXNldC5cbiAqXG4gKiBAbW9kdWxlIGNvcmVcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFN0eWxlIGV4dGVuZHMgRHJhd2FibGUge1xuICAgIC8qKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEBwYXJhbSB7e2ZpbHRlcj86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpib29sZWFuLCBvZmZzZXQ/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCwgbnVtYmVyLCBudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfSwgdmlzaWJsZT86ZnVuY3Rpb24obnVtYmVyKTpib29sZWFuLGFscGhhPzpmdW5jdGlvbihudW1iZXIpOm51bWJlcixibGVuZE9wZXJhdGlvbj86ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24sZHJhd0Z1bj86ZnVuY3Rpb24sdmlld1NjYWxlPzpWaWV3U2NhbGV9fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEB0eXBlIHtWaWV3U2NhbGV8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLnZpZXdTY2FsZSA9IG9wdHMudmlld1NjYWxlXG5cbiAgICAgICAgLyoqIEEgZmlsdGVyIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIHRoZSBjZWxsIGxpc3QsIHRvIGZpbHRlciBvdXQgc29tZSBjZWxscyBub3QgdG8gYmUgZHJhd24gKHN1Y2ggYXMgZm9yIGV4YW1wbGUgdGhlIGNlbGxzIHdpdGggdmFsdWU9MCkuXG4gICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOmJvb2xlYW59ICovXG4gICAgICAgIHRoaXMuZmlsdGVyID0gb3B0cy5maWx0ZXIgfHwgKCgpID0+IHRydWUpXG5cbiAgICAgICAgLyoqIEFuIG9mZnNldC4gVGhpcyBpcyB0byBhbHRlciB0aGUgcG9zaXRpb24gb2YgYWxsIHN5bWJvbHMgaW4gYSBnaXZlbiBkaXJlY3Rpb24uIEluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSAqL1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9wdHMub2Zmc2V0IHx8ICgoYywgciwgeikgPT4gKHsgZHg6IDAsIGR5OiAwIH0pKVxuXG4gICAgICAgIC8qKiBBIGRyYXcgZnVuY3Rpb24gZm9yIHRoZSBzdHlsZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5kcmF3RnVuID0gb3B0cy5kcmF3RnVuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwdWJsaWNcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL0xlZ2VuZFwiKS5MZWdlbmQ+fSAqL1xuICAgICAgICB0aGlzLmxlZ2VuZHMgPSBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGw+fSBjZWxscyBUaGUgY2VsbHMgdG8gZHJhdy5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGVtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZWlyIHJlc29sdXRpb24gKGluIGdlb2dyYXBoaWMgdW5pdClcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhd0Z1bikgdGhpcy5kcmF3RnVuKGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pXG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgZHJhdyBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cbiAgICAvL2dldHRlcnMgYW5kIHNldHRlcnNcblxuICAgIC8qKiBAcmV0dXJucyB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLG51bWJlcixudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfX0gKi9cbiAgICBnZXRPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldFxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSB2YWwgQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0T2Zmc2V0KHZhbCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IHZhbFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBVcGRhdGUgbGVnZW5kcyBvZiB0aGUgc3R5bGUsIGlmIGFueVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHJldHVybnMge3RoaXN9ICovXG4gICAgdXBkYXRlTGVnZW5kcyhvcHRzKSB7XG4gICAgICAgIFN0eWxlLnVwZGF0ZUxlZ2VuZHNSZWN1cnNpdmUodGhpcy5sZWdlbmRzLCBvcHRzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIHN0YXRpYyB1cGRhdGVMZWdlbmRzUmVjdXJzaXZlKGxnLCBvcHRzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxnKSkgZm9yIChjb25zdCBsZ18gb2YgbGcpIHRoaXMudXBkYXRlTGVnZW5kc1JlY3Vyc2l2ZShsZ18sIG9wdHMpXG4gICAgICAgIGVsc2UgbGcudXBkYXRlKG9wdHMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi9MZWdlbmRcIikuTGVnZW5kPn0gbGVnZW5kc1xuICAgICAqIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIGFkZExlZ2VuZHMobGVnZW5kcykge1xuICAgICAgICBmb3IgKGxldCBsZWdlbmQgb2YgbGVnZW5kcylcbiAgICAgICAgICAgIHRoaXMubGVnZW5kcy5wdXNoKGxlZ2VuZClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcbi8vaW1wb3J0IHsgdHJhbnNpdGlvbiB9IGZyb20gXCJkMy10cmFuc2l0aW9uXCI7XG5cbi8qKlxuICogQSBnZW5lcmljIGNsYXNzIHRvIG1ha2UgYSB0b29sdGlwLlxuICogSXQgaXMgYSBkaXYgZWxlbWVudCwgd2hpY2ggY2FuIGJlIG1vdmVkIHVuZGVyIHRoZSBtb3VzZSBwb2ludGVyIGFuZCBmaWxsZWQgd2l0aCBzb21lIGluZm9ybWF0aW9uIGluIGh0bWwuXG4gKiBAbW9kdWxlIGNvcmVcbiAqL1xuZXhwb3J0IGNsYXNzIFRvb2x0aXAge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmRpdiA9IG9wdHMuZGl2IHx8ICd0b29sdGlwX2V1cm9zdGF0J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5tYXhXaWR0aCA9IG9wdHMubWF4V2lkdGggfHwgJzIwZW0nXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAnMS4yZW0nXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBvcHRzLmJhY2tncm91bmQgfHwgJ3doaXRlJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5wYWRkaW5nID0gb3B0cy5wYWRkaW5nIHx8ICc1cHgnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmJvcmRlciA9IG9wdHMuYm9yZGVyIHx8ICcwcHgnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzWydib3JkZXItcmFkaXVzJ10gPSBvcHRzWydib3JkZXItcmFkaXVzJ10gfHwgJzBweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXNbJ2JveC1zaGFkb3cnXSA9IG9wdHNbJ2JveC1zaGFkb3cnXSB8fCAnNXB4IDVweCA1cHggZ3JleSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXNbJ2ZvbnQtZmFtaWx5J10gPSBvcHRzWydmb250LWZhbWlseSddIHx8ICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJ1xuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25EdXJhdGlvbiA9IG9wdHMudHJhbnNpdGlvbkR1cmF0aW9uIHx8IDEwMFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy54T2Zmc2V0ID0gb3B0cy54T2Zmc2V0IHx8IDMwXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnlPZmZzZXQgPSBvcHRzLnlPZmZzZXQgfHwgMjBcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovIC8vIGUuZy4gdG8gcHJldmVudCBtb3VzZSBjdXJzb3IgY292ZXJpbmcgY2VsbCBiZWluZyBoaWdobGlnaHRlZFxuICAgICAgICB0aGlzLnlNb3VzZU9mZnNldCA9IG9wdHMueU1vdXNlT2Zmc2V0IHx8IDBcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMueE1vdXNlT2Zmc2V0ID0gb3B0cy54TW91c2VPZmZzZXQgfHwgMFxuICAgICAgICAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqL1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSBvcHRzLnBhcmVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHVibGljXG4gICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCJkMy1zZWxlY3Rpb25cIikuU2VsZWN0aW9ufSAqL1xuICAgICAgICB0aGlzLnRvb2x0aXAgPSBzZWxlY3QoJyMnICsgdGhpcy5kaXYpXG5cbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcC5lbXB0eSgpKSB7XG4gICAgICAgICAgICAvL2NyZWF0ZSB0b29sdGlwIERPTSBub2RlXG4gICAgICAgICAgICAvLyB0aGlzLnRvb2x0aXAgPSBzZWxlY3QoXG4gICAgICAgICAgICAvLyAgICAgJyMnICsgdGhpcy5wYXJlbnRFbGVtZW50LmlkICYmIHRoaXMucGFyZW50RWxlbWVudC5pZCAhPSAnJ1xuICAgICAgICAgICAgLy8gICAgICAgICA/ICcjJyArIHRoaXMucGFyZW50RWxlbWVudC5pZFxuICAgICAgICAgICAgLy8gICAgICAgICA6ICdib2R5J1xuICAgICAgICAgICAgLy8gKVxuICAgICAgICAgICAgdGhpcy50b29sdGlwID0gc2VsZWN0KCdib2R5JykuYXBwZW5kKCdkaXYnKS5hdHRyKCdpZCcsIHRoaXMuZGl2KVxuICAgICAgICB9XG5cbiAgICAgICAgLy9pbml0aWFsaXNlXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnbWF4LXdpZHRoJywgdGhpcy5tYXhXaWR0aClcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdvdmVyZmxvdycsICdoaWRkZW4nKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYmFja2dyb3VuZCcsIHRoaXMuYmFja2dyb3VuZClcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdwYWRkaW5nJywgdGhpcy5wYWRkaW5nKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JvcmRlcicsIHRoaXMuYm9yZGVyKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCB0aGlzWydib3JkZXItcmFkaXVzJ10pXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYm94LXNoYWRvdycsIHRoaXNbJ2JveC1zaGFkb3cnXSlcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdmb250LWZhbWlseScsIHRoaXNbJ2ZvbnQtZmFtaWx5J10pXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ29wYWNpdHknLCAnMCcpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgndGV4dC13cmFwJywgJ25vd3JhcCcpXG5cbiAgICAgICAgLy8gYXJpYS1sYWJlbHMgKHRoYW5rcyB0byB3YWhsYXRsYXMpXG4gICAgICAgIHRoaXMudG9vbHRpcC5hdHRyKCdyb2xlJywgJ3Rvb2x0aXAnKS5hdHRyKCdhcmlhLWxpdmUnLCAncG9saXRlJylcbiAgICB9XG5cbiAgICAvKiogU2hvdyB0aGUgdG9vbHRpcCAqL1xuICAgIHNob3coKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy50b29sdGlwLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLnRyYW5zaXRpb25EdXJhdGlvbikuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgIH1cblxuICAgIC8qKiBIaWRlIHRoZSB0b29sdGlwICovXG4gICAgaGlkZSgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnRvb2x0aXAudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMudHJhbnNpdGlvbkR1cmF0aW9uKS5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBjb250ZW50IG9mIHRoZSB0b29sdGlwLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gICAgICovXG4gICAgaHRtbChodG1sKSB7XG4gICAgICAgIHRoaXMudG9vbHRpcC5odG1sKGh0bWwpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9vbHRpcCBhdCB0aGUgbW91c2UgZXZlbnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxuICAgICAqL1xuICAgIHNldFBvc2l0aW9uKGV2ZW50KSB7XG4gICAgICAgIGxldCBwYXJlbnRSZWN0ID0gdGhpcy5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG5cbiAgICAgICAgbGV0IHggPSBldmVudC5wYWdlWCArIHRoaXMueE9mZnNldFxuICAgICAgICBsZXQgeSA9IGV2ZW50LnBhZ2VZIC0gdGhpcy55T2Zmc2V0XG5cbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdsZWZ0JywgeCArICdweCcpLnN0eWxlKCd0b3AnLCB5ICsgJ3B4JylcblxuICAgICAgICB0aGlzLmVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIoZXZlbnQsIHBhcmVudFJlY3QpXG4gICAgfVxuXG4gICAgLypcblx0bXkubW91c2VvdmVyID0gZnVuY3Rpb24gKGV2ZW50LCBodG1sKSB7XG5cdFx0aWYgKGh0bWwpIG15Lmh0bWwoaHRtbCk7XG5cdFx0bXkuc2V0UG9zaXRpb24oZXZlbnQpO1xuXHRcdG15LnNob3coKVxuXHRcdC8vdGhpcy5lbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyKCk7XG5cdH07XG5cdFxuXHRteS5tb3VzZW1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRteS5zZXRQb3NpdGlvbihldmVudCk7XG5cdFx0Ly90aGlzLmVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIoKTtcblx0fTtcblx0XG5cdG15Lm1vdXNlb3V0ID0gZnVuY3Rpb24gKCkge1xuXHRcdG15LmhpZGUoKTtcblx0fTsqL1xuXG4gICAgc3R5bGUoaywgdikge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy50b29sdGlwLnN0eWxlKGspXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZShrLCB2KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGF0dHIoaywgdikge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy50b29sdGlwLmF0dHIoaylcbiAgICAgICAgdGhpcy50b29sdGlwLmF0dHIoaywgdilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb24gZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lclxuICAgICAqIEBkZXNjcmlwdGlvbiBQcmV2ZW50cyB0aGUgdG9vbHRpcCBmcm9tIG92ZXJmbG93aW5nIG91dCBvZiB0aGUgQXBwIGNvbnRhaW5lciAoZW5zdXJlcyB0aGF0IHRoZSB0b29sdGlwIGlzIGluc2lkZSB0aGUgZ3JpZHZpeiBjb250YWluZXIpXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxuICAgICAqIEBwYXJhbSB7RE9NUmVjdH0gcGFyZW50UmVjdFxuICAgICAqL1xuICAgIGVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIgPSBmdW5jdGlvbiAoZXZlbnQsIHBhcmVudFJlY3QpIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLnRvb2x0aXAubm9kZSgpXG4gICAgICAgIGxldCBwYXJlbnRXaWR0aCA9IHBhcmVudFJlY3Qud2lkdGhcbiAgICAgICAgbGV0IHBhcmVudEhlaWdodCA9IHBhcmVudFJlY3QuaGVpZ2h0XG5cbiAgICAgICAgLy90b28gZmFyIHJpZ2h0XG4gICAgICAgIGlmIChub2RlLm9mZnNldExlZnQgPiBwYXJlbnRSZWN0LmxlZnQgKyBwYXJlbnRXaWR0aCAtIG5vZGUuY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gZXZlbnQueCAtIG5vZGUuY2xpZW50V2lkdGggLSB0aGlzLnhPZmZzZXRcbiAgICAgICAgICAgIG5vZGUuc3R5bGUubGVmdCA9IGxlZnQgKyAncHgnXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBtb3VzZSBjb3ZlcnMgdG9vbHRpcFxuICAgICAgICAgICAgaWYgKG5vZGUub2Zmc2V0TGVmdCArIG5vZGUuY2xpZW50V2lkdGggPiBldmVudC54KSB7XG4gICAgICAgICAgICAgICAgLy9tb3ZlIHRvb2x0aXAgbGVmdCBzbyBpdCBkb2VzbnQgY292ZXIgbW91c2VcbiAgICAgICAgICAgICAgICBsZXQgbGVmdDIgPSBldmVudC54IC0gbm9kZS5jbGllbnRXaWR0aCAtIHRoaXMueE9mZnNldFxuICAgICAgICAgICAgICAgIG5vZGUuc3R5bGUubGVmdCA9IGxlZnQyICsgJ3B4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbm9kZS5zdHlsZS50b3AgPSBub2RlLm9mZnNldFRvcCArIGNvbmZpZy55T2Zmc2V0ICsgXCJweFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy90b28gZmFyIGRvd25cbiAgICAgICAgaWYgKG5vZGUub2Zmc2V0VG9wICsgbm9kZS5jbGllbnRIZWlnaHQgPiBwYXJlbnRSZWN0LnRvcCArIHBhcmVudEhlaWdodCkge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS50b3AgPSBub2RlLm9mZnNldFRvcCAtIG5vZGUuY2xpZW50SGVpZ2h0ICsgJ3B4J1xuICAgICAgICB9XG5cbiAgICAgICAgLy90b28gZmFyIHVwXG4gICAgICAgIGlmIChub2RlLm9mZnNldFRvcCA8IHBhcmVudFJlY3QudG9wKSB7XG4gICAgICAgICAgICBub2RlLnN0eWxlLnRvcCA9IHBhcmVudFJlY3QudG9wICsgdGhpcy55T2Zmc2V0ICsgJ3B4J1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZSB9fSBHcmlkSW5mbyAqL1xuXG5pbXBvcnQgeyBkc3YgfSBmcm9tICdkMy1mZXRjaCdcbmltcG9ydCB7IERhdGFzZXQgfSBmcm9tICcuLi9jb3JlL0RhdGFzZXQuanMnXG5cbi8qKlxuICogQSBkYXRhc2V0IGNvbXBvc2VkIG9mIGEgc2luZ2xlIENTViBmaWxlIChub3QgdGlsZWQpLlxuICpcbiAqIEBtb2R1bGUgZGF0YXNldFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ1NWR3JpZCBleHRlbmRzIERhdGFzZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9NYXAuanNcIikuTWFwfSBtYXAgVGhlIG1hcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgKiBAcGFyYW0ge3twcmVwcm9jZXNzPzooZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwpOmJvb2xlYW4pLGRlbGltaXRlcj86c3RyaW5nfX0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcCwgdXJsLCByZXNvbHV0aW9uLCBvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIobWFwLCB1cmwsIHJlc29sdXRpb24sIG9wdHMpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSAqL1xuICAgICAgICB0aGlzLmNlbGxzID0gW11cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgIHRoaXMuZGVsaW1pdGVyID0gb3B0cy5kZWxpbWl0ZXIgfHwgXCIsXCJcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICogQHByaXZhdGUgICovXG4gICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xuXG4gICAgICAgIC8vZ2V0IGRhdGFcbiAgICAgICAgdGhpcy5nZXREYXRhKHVuZGVmaW5lZClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGRhdGEgd2l0aGluIGEgZ2VvZ3JhcGhpYyBlbnZlbG9wZS5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gZVxuICAgICAqL1xuICAgIGdldERhdGEoZSkge1xuICAgICAgICAvL2NoZWNrIGlmIGRhdGEgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgaWYgKHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVybiB0aGlzXG5cbiAgICAgICAgLy9sb2FkIGRhdGFcbiAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xuICAgICAgICAgICAgOyAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBkc3YodGhpcy5kZWxpbWl0ZXIsIHRoaXMudXJsKVxuXG4gICAgICAgICAgICAgICAgICAgIC8vY29udmVydCBjb29yZGluYXRlcyBpbiBudW1iZXJzXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLnggPSArYy54XG4gICAgICAgICAgICAgICAgICAgICAgICBjLnkgPSArYy55XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXByb2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wcmVwcm9jZXNzKGMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxscy5wdXNoKGMpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzID0gZGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIGNoZWNrIGlmIHJlZHJhdyBpcyBuZWNlc3NhcnlcbiAgICAgICAgICAgICAgICAgICAgLy90aGF0IGlzIGlmIHRoZSBkYXRhc2V0IGJlbG9uZ3MgdG8gYSBsYXllciB3aGljaCBpcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWxcblxuICAgICAgICAgICAgICAgICAgICAvL3JlZHJhdyBtYXBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwKSB0aGlzLm1hcC5yZWRyYXcoKVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbG9hZGVkJ1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vbWFyayBhcyBmYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKClcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGwgdGhlIHZpZXcgY2FjaGUgd2l0aCBhbGwgY2VsbHMgd2hpY2ggYXJlIHdpdGhpbiBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGV9IGV4dEdlb1xuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHVwZGF0ZVZpZXdDYWNoZShleHRHZW8pIHtcbiAgICAgICAgLy9kYXRhIG5vdCBsb2FkZWQgeWV0XG4gICAgICAgIGlmICghdGhpcy5jZWxscykgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZSA9IFtdXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aGlzLmNlbGxzKSB7XG4gICAgICAgICAgICBpZiAoK2NlbGwueCArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby54TWluKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCtjZWxsLnggLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueE1heCkgY29udGludWVcbiAgICAgICAgICAgIGlmICgrY2VsbC55ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnlNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoK2NlbGwueSAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby55TWF4KSBjb250aW51ZVxuICAgICAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZS5wdXNoKGNlbGwpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IERhdGFzZXQgfSBmcm9tICcuLi9jb3JlL0RhdGFzZXQuanMnXG5cbi8qKlxuICogQSBkYXRhc2V0IGNvbXBvc2VkIG9mIGNlbGxzIGRlZmluZWQgaW4gamF2YXNjcmlwdCwgb3IgbG9hZGVkIG91dHNpZGUgb2YgZ3JpZHZpeiBtYXAuXG4gKlxuICogQG1vZHVsZSBkYXRhc2V0XG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBKU0dyaWQgZXh0ZW5kcyBEYXRhc2V0IHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHtBcnJheS48T2JqZWN0Pn0gY2VsbHMgVGhlIGNlbGxzLlxuICAgICAqIEBwYXJhbSB7fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmVzb2x1dGlvbiwgY2VsbHMsIG9wdHMgPSB7fSkge1xuICAgICAgICBzdXBlcih1bmRlZmluZWQsIFwiXCIsIHJlc29sdXRpb24sIG9wdHMpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsPn0gKi9cbiAgICAgICAgdGhpcy5jZWxscyA9IGNlbGxzIHx8IFtdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBkYXRhIHdpdGhpbiBhIGdlb2dyYXBoaWMgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gZVxuICAgICAqL1xuICAgIGdldERhdGEoZSkgeyByZXR1cm4gdGhpcyB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSBleHRHZW9cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XG4gICAgICAgIC8vZGF0YSBub3QgbG9hZGVkIHlldFxuICAgICAgICBpZiAoIXRoaXMuY2VsbHMpIHJldHVyblxuXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGhpcy5jZWxscykge1xuICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcbiAgICAgICAgICAgIGlmICgrY2VsbC54IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnhNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoK2NlbGwueSArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby55TWluKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcbiAgICAgICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUucHVzaChjZWxsKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZSB9fSBHcmlkSW5mbyAqL1xuXG4vLyBpbnRlcm5hbFxuaW1wb3J0IHsgRGF0YXNldCB9IGZyb20gJy4uL2NvcmUvRGF0YXNldC5qcydcbi8vaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvVXRpbHMuanMnXG5cbi8vIGV4dGVybmFsXG5pbXBvcnQgeyBqc29uLCBjc3YgfSBmcm9tICdkMy1mZXRjaCdcblxuLyoqXG4gKiBBIHRpbGVkIGRhdGFzZXQsIGNvbXBvc2VkIG9mIENTViB0aWxlcy5cbiAqXG4gKiBAbW9kdWxlIGRhdGFzZXRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbGVkR3JpZCBleHRlbmRzIERhdGFzZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9NYXAuanNcIikuTWFwfSBtYXAgVGhlIG1hcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86KGZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsKTpib29sZWFuKSB9fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWFwLCB1cmwsIG9wdHMgPSB7fSkge1xuICAgICAgICBzdXBlcihtYXAsIHVybCwgMCwgb3B0cylcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGdyaWQgaW5mbyBvYmplY3QsIGZyb20gdGhlIGluZm8uanNvbiBmaWxlLlxuICAgICAgICAgKiAgQHR5cGUge0dyaWRJbmZvIHwgdW5kZWZpbmVkfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiAgKi9cbiAgICAgICAgdGhpcy5pbmZvID0gdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqIEBwcml2YXRlICAqL1xuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNhY2hlIG9mIHRoZSBsb2FkZWQgdGlsZXMuIEl0IGlzIGRvdWJsZSBpbmRleGVkOiBieSB4VCBhbmQgdGhlbiB5VC5cbiAgICAgICAgICogRXhhbXBsZTogdGhpcy5jYWNoZVt4VF1beVRdIHJldHVybnMgdGhlIHRpbGUgYXQgW3hUXVt5VF0gbG9jYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqICovXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7fVxuXG4gICAgICAgIC8vbGF1bmNoIGxvYWRpbmdcbiAgICAgICAgdGhpcy5sb2FkSW5mbygpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCB0aGUgaW5mby5qc29uIGZyb20gdGhlIHVybC5cbiAgICAgKiBAcmV0dXJucyB0aGlzXG4gICAgICovXG4gICAgbG9hZEluZm8oKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmZvICYmIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPT09ICdub3RMb2FkZWQnKSB7XG4gICAgICAgICAgICA7IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGpzb24odGhpcy51cmwgKyAnaW5mby5qc29uJylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmZvID0gZGF0YVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29sdXRpb24gPSBkYXRhLnJlc29sdXRpb25HZW9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9tYXJrIGFzIGZhaWxlZFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpXG4gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPT09ICdsb2FkZWQnIHx8IHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPT09ICdmYWlsZWQnKSlcbiAgICAgICAgICAgIHRoaXMubWFwLnJlZHJhdygpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSBhIHRpbGluZyBlbnZlbG9wZSBmcm9tIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0byBrbm93IHdoaWNoIHRpbGVzIHRvIGRvd25sb2FkIGZvciBhIGdlb2dyYXBoaWNhbCB2aWV3LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gZVxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9XG4gICAgICovXG4gICAgZ2V0VGlsaW5nRW52ZWxvcGUoZSkge1xuICAgICAgICBpZiAoIXRoaXMuaW5mbykge1xuICAgICAgICAgICAgdGhpcy5sb2FkSW5mbygpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvID0gdGhpcy5pbmZvLm9yaWdpblBvaW50LFxuICAgICAgICAgICAgciA9IHRoaXMuaW5mby5yZXNvbHV0aW9uR2VvLFxuICAgICAgICAgICAgcyA9IHRoaXMuaW5mby50aWxlU2l6ZUNlbGxcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeE1pbjogTWF0aC5mbG9vcigoZS54TWluIC0gcG8ueCkgLyAociAqIHMpKSxcbiAgICAgICAgICAgIHhNYXg6IE1hdGguZmxvb3IoKGUueE1heCAtIHBvLngpIC8gKHIgKiBzKSksXG4gICAgICAgICAgICB5TWluOiBNYXRoLmZsb29yKChlLnlNaW4gLSBwby55KSAvIChyICogcykpLFxuICAgICAgICAgICAgeU1heDogTWF0aC5mbG9vcigoZS55TWF4IC0gcG8ueSkgLyAociAqIHMpKSxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoJy4uL2NvcmUvR2VvQ2FudmFzLmpzJykuRW52ZWxvcGV9IGV4dEdlb1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGdldERhdGEoZXh0R2VvKSB7XG4gICAgICAgIC8vVE9ETyBlbXB0eSBjYWNoZSB3aGVuIGl0IGdldHMgdG9vIGJpZyA/XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbmZvIGhhcyBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAoIXRoaXMuaW5mbykgcmV0dXJuIHRoaXNcblxuICAgICAgICAvL3RpbGVzIHdpdGhpbiB0aGUgc2NvcGVcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9ICovXG4gICAgICAgIGNvbnN0IHRiID0gdGhpcy5nZXRUaWxpbmdFbnZlbG9wZShleHRHZW8pXG4gICAgICAgIGlmICghdGIpIHJldHVybiB0aGlzXG5cbiAgICAgICAgLy9ncmlkIGJvdW5kc1xuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSAqL1xuICAgICAgICBjb25zdCBnYiA9IHRoaXMuaW5mby50aWxpbmdCb3VuZHNcblxuICAgICAgICBmb3IgKGxldCB4VCA9IE1hdGgubWF4KHRiLnhNaW4sIGdiLnhNaW4pOyB4VCA8PSBNYXRoLm1pbih0Yi54TWF4LCBnYi54TWF4KTsgeFQrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeVQgPSBNYXRoLm1heCh0Yi55TWluLCBnYi55TWluKTsgeVQgPD0gTWF0aC5taW4odGIueU1heCwgZ2IueU1heCk7IHlUKyspIHtcbiAgICAgICAgICAgICAgICAvL3ByZXBhcmUgY2FjaGVcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2FjaGVbeFRdKSB0aGlzLmNhY2hlW3hUXSA9IHt9XG5cbiAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHRpbGUgZXhpc3RzIGluIHRoZSBjYWNoZVxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy5jYWNoZVt4VF1beVRdXG4gICAgICAgICAgICAgICAgaWYgKHRpbGUpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAvL21hcmsgdGlsZSBhcyBsb2FkaW5nXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt4VF1beVRdID0gXCJsb2FkaW5nXCI7XG4gICAgICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9yZXF1ZXN0IHRpbGVcbiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSAgKi9cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNlbGxzXG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gICovXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgY3N2KHRoaXMudXJsICsgeFQgKyAnLycgKyB5VCArICcuY3N2JylcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogVGlsZWRHcmlkIHBhcnNlIHN0YXJ0JylcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmVwcm9jZXNzL2ZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzID0gW11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wcmVwcm9jZXNzKGMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID09IGZhbHNlKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxscy5wdXNoKGMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxscyA9IGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCdwcmVwcm9jZXNzIC8gZmlsdGVyJylcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbWFyayBhcyBmYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbeFRdW3lUXSA9ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vc3RvcmUgdGlsZSBpbiBjYWNoZVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5mbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGlsZSBpbmZvIGlua25vd24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGlsZV8gPSBnZXRHcmlkVGlsZShjZWxscywgeFQsIHlULCB0aGlzLmluZm8pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbeFRdW3lUXSA9IHRpbGVfXG5cbiAgICAgICAgICAgICAgICAgICAgLy9pZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCdzdG9yYWdlJylcblxuICAgICAgICAgICAgICAgICAgICAvL2lmIG5vIHJlZHJhdyBpcyBzcGVjaWZpZWQsIHRoZW4gbGVhdmVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcblxuICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHJlZHJhdyBpcyByZWFsbHkgbmVlZGVkLCB0aGF0IGlzIGlmOlxuXG4gICAgICAgICAgICAgICAgICAgIC8vIDEuIHRoZSBkYXRhc2V0IGJlbG9uZ3MgdG8gYSBsYXllciB3aGljaCBpcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZHJhdyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHogPSB0aGlzLm1hcC5nZXRab29tKClcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBsYXkgb2YgdGhpcy5tYXAubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF5LnZpc2libGUgJiYgIWxheS52aXNpYmxlKHopKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXkuZ2V0RGF0YXNldCkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXkuZ2V0RGF0YXNldCh6KSAhPSB0aGlzKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3VuZCBvbmUgbGF5ZXIuIE5vIG5lZWQgdG8gc2VlayBtb3JlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVkcmF3ID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvL2lmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJ2NoZWNrIHJlZHJhdyAxJylcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZHJhdykgcmV0dXJuXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gMi4gdGhlIHRpbGUgaXMgd2l0aGluIHRoZSB2aWV3LCB0aGF0IGlzIGl0cyBnZW8gZW52ZWxvcGUgaW50ZXJzZWN0cyB0aGUgdmlld2VyIGdlbyBlbnZlbG9wZS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52ID0gdGhpcy5tYXAudXBkYXRlRXh0ZW50R2VvKClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52VCA9IHRpbGVfLmV4dEdlb1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnhNYXggPD0gZW52VC54TWluKSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudi54TWluID49IGVudlQueE1heCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnYueU1heCA8PSBlbnZULnlNaW4pIHJldHVyblxuICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnlNaW4gPj0gZW52VC55TWF4KSByZXR1cm5cblxuICAgICAgICAgICAgICAgICAgICAvL2lmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJ2NoZWNrIHJlZHJhdyAyJylcbiAgICAgICAgICAgICAgICAgICAgLy9pZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogVGlsZWRHcmlkIHBhcnNlIGVuZCcpXG5cbiAgICAgICAgICAgICAgICAgICAgLy9yZWRyYXdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9KSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICogQGFic3RyYWN0XG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gZXh0R2VvXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgdXBkYXRlVmlld0NhY2hlKGV4dEdlbykge1xuICAgICAgICAvL1xuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cblxuICAgICAgICAvL2NoZWNrIGlmIGluZm8gaGFzIGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICghdGhpcy5pbmZvKSByZXR1cm5cblxuICAgICAgICAvL3RpbGVzIHdpdGhpbiB0aGUgc2NvcGVcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9ICovXG4gICAgICAgIGNvbnN0IHRiID0gdGhpcy5nZXRUaWxpbmdFbnZlbG9wZShleHRHZW8pXG4gICAgICAgIGlmICghdGIpIHJldHVyblxuXG4gICAgICAgIC8vZ3JpZCBib3VuZHNcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gKi9cbiAgICAgICAgY29uc3QgZ2IgPSB0aGlzLmluZm8udGlsaW5nQm91bmRzXG5cbiAgICAgICAgZm9yIChsZXQgeFQgPSBNYXRoLm1heCh0Yi54TWluLCBnYi54TWluKTsgeFQgPD0gTWF0aC5taW4odGIueE1heCwgZ2IueE1heCk7IHhUKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jYWNoZVt4VF0pIGNvbnRpbnVlXG4gICAgICAgICAgICBmb3IgKGxldCB5VCA9IE1hdGgubWF4KHRiLnlNaW4sIGdiLnlNaW4pOyB5VCA8PSBNYXRoLm1pbih0Yi55TWF4LCBnYi55TWF4KTsgeVQrKykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IHRpbGVcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5jYWNoZVt4VF1beVRdXG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlIHx8IHR5cGVvZiB0aWxlID09PSAnc3RyaW5nJykgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vZ2V0IGNlbGxzXG4gICAgICAgICAgICAgICAgLy90aGlzLmNlbGxzVmlld0NhY2hlID0gdGhpcy5jZWxsc1ZpZXdDYWNoZS5jb25jYXQodGlsZS5jZWxscylcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aWxlLmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC54ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnhNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC54IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnhNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC55ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnlNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC55IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnlNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUucHVzaChjZWxsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0R3JpZFRpbGUoY2VsbHMsIHhULCB5VCwgZ3JpZEluZm8pIHtcblxuICAgIGNvbnN0IHRpbGUgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSAqL1xuICAgIHRpbGUuY2VsbHMgPSBjZWxsc1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRpbGUueCA9IHhUXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGlsZS55ID0geVRcblxuICAgIGNvbnN0IHIgPSBncmlkSW5mby5yZXNvbHV0aW9uR2VvXG4gICAgY29uc3QgcyA9IGdyaWRJbmZvLnRpbGVTaXplQ2VsbFxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5FbnZlbG9wZX0gKi9cbiAgICB0aWxlLmV4dEdlbyA9IHtcbiAgICAgICAgeE1pbjogZ3JpZEluZm8ub3JpZ2luUG9pbnQueCArIHIgKiBzICogdGlsZS54LFxuICAgICAgICB4TWF4OiBncmlkSW5mby5vcmlnaW5Qb2ludC54ICsgciAqIHMgKiAodGlsZS54ICsgMSksXG4gICAgICAgIHlNaW46IGdyaWRJbmZvLm9yaWdpblBvaW50LnkgKyByICogcyAqIHRpbGUueSxcbiAgICAgICAgeU1heDogZ3JpZEluZm8ub3JpZ2luUG9pbnQueSArIHIgKiBzICogKHRpbGUueSArIDEpLFxuICAgIH1cblxuICAgIC8vY29udmVydCBjZWxsIGNvb3JkaW5hdGVzIGludG8gZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXG4gICAgZm9yIChsZXQgY2VsbCBvZiB0aWxlLmNlbGxzKSB7XG4gICAgICAgIGNlbGwueCA9IHRpbGUuZXh0R2VvLnhNaW4gKyBjZWxsLnggKiByXG4gICAgICAgIGNlbGwueSA9IHRpbGUuZXh0R2VvLnlNaW4gKyBjZWxsLnkgKiByXG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbGVcbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuXG4vKipcbiAqXG4gKiBBIG1hcCBiYWNrZ3JvdW5kIGxheWVyIGluIFwiU2xpcHB5IG1hcFwiIFhZWiBzdGFuZGFyZC5cbiAqIFNlZSBodHRwczovL3dpa2kub3BlbnN0cmVldG1hcC5vcmcvd2lraS9TbGlwcHlfbWFwX3RpbGVuYW1lc1xuICogaHR0cHM6Ly93d3cubWFwdGlsZXIuY29tL2dvb2dsZS1tYXBzLWNvb3JkaW5hdGVzLXRpbGUtYm91bmRzLXByb2plY3Rpb24vIzYvMjcuODgvNDQuNDhcbiAqIFxuICogQG1vZHVsZSBsYXllclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZExheWVyIGV4dGVuZHMgTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgY2FjaGUsIGluZGV4ZWQgYnkgei95L3ggKi9cbiAgICAgICAgdGhpcy5jYWNoZSA9IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnVybEZ1biA9IG9wdHMudXJsRnVuIHx8ICgoeCwgeSwgeikgPT4gdGhpcy51cmwgKyB6ICsgJy8nICsgeCArICcvJyArIHkgKyAnLnBuZycpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9ucyA9IG9wdHMucmVzb2x1dGlvbnNcbiAgICAgICAgaWYgKCF0aGlzLnJlc29sdXRpb25zIHx8IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoID09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5uYlBpeCA9IG9wdHMubmJQaXggfHwgMjU2XG4gICAgICAgIC8qKiBDUlMgY29vcmRpbmF0ZXMgb2YgdG9wIGxlZnQgY29ybmVyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5vcmlnaW4gPSBvcHRzLm9yaWdpbiB8fCBbMCwgMF1cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuejAgPSBvcHRzLnowIHx8IDBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgei94L3kgY2FjaGUgZGF0YS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICAgKiBAcmV0dXJucyB7SFRNTEltYWdlRWxlbWVudHxzdHJpbmd8dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0KHosIHgsIHkpIHtcbiAgICAgICAgbGV0IGQgPSB0aGlzLmNhY2hlW3pdXG4gICAgICAgIGlmICghZCkgcmV0dXJuXG4gICAgICAgIGQgPSBkW3hdXG4gICAgICAgIGlmICghZCkgcmV0dXJuXG4gICAgICAgIHJldHVybiBkW3ldXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHoveC95IGNhY2hlIGRhdGEuXG4gICAgICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50fHN0cmluZ30gaW1nXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAgICogQHJldHVybnNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHB1dChpbWcsIHosIHgsIHkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3pdKSB0aGlzLmNhY2hlW3pdID0ge31cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3pdW3hdKSB0aGlzLmNhY2hlW3pdW3hdID0ge31cbiAgICAgICAgdGhpcy5jYWNoZVt6XVt4XVt5XSA9IGltZ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkcmF3KGdlb0NhbnZhcykge1xuXG4gICAgICAgIGlmICghdGhpcy5yZXNvbHV0aW9ucyB8fCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyByZXNvbHV0aW9ucyBwcm92aWRlZCBmb3IgYmFja2dyb3VuZCBsYXllcicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IHgwID0gdGhpcy5vcmlnaW5bMF0sXG4gICAgICAgICAgICB5MCA9IHRoaXMub3JpZ2luWzFdXG5cbiAgICAgICAgLy9nZXQgem9vbSBsZXZlbCBhbmQgcmVzb2x1dGlvblxuICAgICAgICBsZXQgel8gPSAwXG4gICAgICAgIGZvciAoel8gPSAwOyB6XyA8IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoOyB6XysrKSBpZiAodGhpcy5yZXNvbHV0aW9uc1t6X10gPCB6KSBicmVha1xuICAgICAgICB6XyAtPSAxXG4gICAgICAgIHpfID0gTWF0aC5tYXgoMCwgel8pXG4gICAgICAgIHpfID0gTWF0aC5taW4oel8sIHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoIC0gMSlcbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnJlc29sdXRpb25zLmxlbmd0aCwgeilcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5yZXNvbHV0aW9uc1t6X11cblxuICAgICAgICB6XyArPSB0aGlzLnowXG5cbiAgICAgICAgY29uc3Qgc2l6ZUcgPSB0aGlzLm5iUGl4ICogcmVzXG4gICAgICAgIGNvbnN0IHNpemUgPSBzaXplRyAvIHpcblxuICAgICAgICAvL2dldCB0aWxlIG51bWJlcnNcbiAgICAgICAgY29uc3QgeEdlb1RvVE1TID0gKHgpID0+IE1hdGguY2VpbCgoeCAtIHgwKSAvIHNpemVHKVxuICAgICAgICBjb25zdCB5R2VvVG9UTVMgPSAoeSkgPT4gTWF0aC5jZWlsKC0oeSAtIHkwKSAvIHNpemVHKVxuICAgICAgICBjb25zdCB4TWluID0geEdlb1RvVE1TKGdlb0NhbnZhcy5leHRHZW8ueE1pbikgLSAxXG4gICAgICAgIGNvbnN0IHhNYXggPSB4R2VvVG9UTVMoZ2VvQ2FudmFzLmV4dEdlby54TWF4KVxuICAgICAgICBjb25zdCB5TWF4ID0geUdlb1RvVE1TKGdlb0NhbnZhcy5leHRHZW8ueU1pbilcbiAgICAgICAgY29uc3QgeU1pbiA9IHlHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnlNYXgpIC0gMVxuXG4gICAgICAgIC8vaGFuZGxlIGltYWdlc1xuICAgICAgICBmb3IgKGxldCB4ID0geE1pbjsgeCA8IHhNYXg7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IHlNaW47IHkgPCB5TWF4OyB5KyspIHtcbiAgICAgICAgICAgICAgICAvL2dldCBpbWFnZVxuICAgICAgICAgICAgICAgIGxldCBpbWcgPSB0aGlzLmdldCh6XywgeCwgeSlcblxuICAgICAgICAgICAgICAgIC8vbG9hZCBpbWFnZVxuICAgICAgICAgICAgICAgIGlmICghaW1nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHV0KGltZywgel8sIHgsIHkpXG4gICAgICAgICAgICAgICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1dCgnZmFpbGVkJywgel8sIHgsIHkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaW1nLnNyYyA9IHRoaXMudXJsRnVuKHgsIHksIHpfKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXG4gICAgICAgICAgICAgICAgaWYgKGltZyA9PT0gJ2ZhaWxlZCcpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgaWYgKCEoaW1nIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coaW1nKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW1nLndpZHRoID09IDAgfHwgaW1nLmhlaWdodCA9PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IGltYWdlXG4gICAgICAgICAgICAgICAgY29uc3QgeEdlbyA9IHgwICsgeCAqIHNpemVHXG4gICAgICAgICAgICAgICAgY29uc3QgeUdlbyA9IHkwIC0geSAqIHNpemVHXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmRyYXdJbWFnZShpbWcsIGdlb0NhbnZhcy5nZW9Ub1BpeFgoeEdlbyksIGdlb0NhbnZhcy5nZW9Ub1BpeFkoeUdlbyksIHNpemUsIHNpemUpXG4gICAgICAgICAgICAgICAgICAgIC8vY2cuY3R4LmRyYXdJbWFnZShpbWcsIHhHZW8sIHlHZW8sIHNpemVHLCAtc2l6ZUcpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuXG4vKipcbiAqXG4gKiBBIG1hcCBiYWNrZ3JvdW5kIGxheWVyIGNvbXBvc2VkIG9mIGEgc2luZ2xlIGltYWdlIGZpbGUsIGdlb2xvY2F0ZWQuXG4gKiBcbiAqIEBtb2R1bGUgbGF5ZXJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEJhY2tncm91bmRMYXllckltYWdlIGV4dGVuZHMgTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgZmlsZSBVUkxcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgbGVmdCBjb29yZGluYXRlXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMueE1pbiA9IG9wdHMueE1pbiB8fCAwO1xuICAgICAgICAvKiogVGhlIGltYWdlIHRvcCBjb29yZGluYXRlXG4gICAgICAgICAqICBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnlNYXggPSBvcHRzLnlNYXggfHwgMDtcblxuICAgICAgICAvKiogVGhlIGltYWdlIHdpZHRoLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAyMDAwMFxuICAgICAgICAvKiogVGhlIGltYWdlIGhlaWdodCwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAyMDAwMFxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2Ugb2JqZWN0XG4gICAgICAgICAqIEB0eXBlIHtIVE1MSW1hZ2VFbGVtZW50fHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5pbWcgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XG5cbiAgICAgICAgLy91cGRhdGUgbWFwIGV4dGVudFxuICAgICAgICAvL2dlb0NhbnZhcy51cGRhdGVFeHRlbnRHZW8oMClcblxuICAgICAgICBpZiAodGhpcy5pbWcpIHtcbiAgICAgICAgICAgIC8vdGhlIGltYWdlIHdhcyBhbHJlYWR5IGRvd25sb2FkZWQ6IGRyYXcgaXRcblxuICAgICAgICAgICAgLy9jb21wdXRlIHNjcmVlbiBjb29yZGluYXRlcyBhbmQgc2l6ZSByYXRpb1xuICAgICAgICAgICAgY29uc3QgeCA9IGdlb0NhbnZhcy5nZW9Ub1BpeFgodGhpcy54TWluKVxuICAgICAgICAgICAgY29uc3QgeSA9IGdlb0NhbnZhcy5nZW9Ub1BpeFkodGhpcy55TWF4KVxuICAgICAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy5nZXRWaWV3KCkuelxuXG4gICAgICAgICAgICAvL2RyYXcgaW1hZ2VcbiAgICAgICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuaW1nLCB4LCB5LCB0aGlzLndpZHRoIC8geiwgdGhpcy5oZWlnaHQgLyB6KVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL3JldHJpZXZlIGltYWdlXG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pbWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltZyA9IG5ldyBJbWFnZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHJldHJpZXZlIGJhY2tncm91bmQgaW1hZ2UgZnJvbVwiLCB0aGlzLnVybClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vc2V0IFVSTCB0byBsYXVuY2ggdGhlIGRvd25sb2FkXG4gICAgICAgICAgICB0aGlzLmltZy5zcmMgPSB0aGlzLnVybFxuICAgICAgICB9XG5cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29yZS9MYXllci5qcydcblxuLyoqXG4gKlxuICogQSBtYXAgV01TIGJhY2tncm91bmQgbGF5ZXIuXG4gKiBcbiAqIEBtb2R1bGUgbGF5ZXJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEJhY2tncm91bmRMYXllcldNUyBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTEltYWdlRWxlbWVudHx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuaW1nID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy54TWluID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMueE1heCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLnlNaW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy55TWF4ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKiBDaGVjayBpZiB0aGUgdmlldyBoYXMgbW92ZWQgYW5kIGEgbmV3IGltYWdlIG5lZWRzIHRvIGJlIHJldHJpZXZlZC5cbiAgICAgKiBAcHJpdmF0ZSAqL1xuICAgIGhhc01vdmVkKGV4dEdlbykge1xuICAgICAgICBpZiAoKGV4dEdlby54TWluKSAhPSB0aGlzLnhNaW4pIHJldHVybiB0cnVlXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueE1heCkgIT0gdGhpcy54TWF4KSByZXR1cm4gdHJ1ZVxuICAgICAgICBlbHNlIGlmICgoZXh0R2VvLnlNaW4pICE9IHRoaXMueU1pbikgcmV0dXJuIHRydWVcbiAgICAgICAgZWxzZSBpZiAoKGV4dEdlby55TWF4KSAhPSB0aGlzLnlNYXgpIHJldHVybiB0cnVlXG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZHJhdyhnZW9DYW52YXMpIHtcblxuICAgICAgICAvL3VwZGF0ZSBtYXAgZXh0ZW50XG4gICAgICAgIGdlb0NhbnZhcy51cGRhdGVFeHRlbnRHZW8oMClcblxuICAgICAgICBpZiAoIXRoaXMuaGFzTW92ZWQoZ2VvQ2FudmFzLmV4dEdlbykgJiYgdGhpcy5pbWcpIHtcbiAgICAgICAgICAgIC8vdGhlIG1hcCBkaWQgbm90IG1vdmUgYW5kIHRoZSBpbWFnZSB3YXMgYWxyZWFkeSBkb3dubG9hZGVkOiBkcmF3IHRoZSBpbWFnZVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5kcmF3SW1hZ2UodGhpcy5pbWcsIDAsIDAsIGdlb0NhbnZhcy53LCBnZW9DYW52YXMuaClcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy90aGUgbWFwIG1vdmVkOiByZXRyaWV2ZSBuZXcgaW1hZ2VcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHRoaXMueE1pbiA9IGdlb0NhbnZhcy5leHRHZW8ueE1pblxuICAgICAgICAgICAgdGhpcy54TWF4ID0gZ2VvQ2FudmFzLmV4dEdlby54TWF4XG4gICAgICAgICAgICB0aGlzLnlNaW4gPSBnZW9DYW52YXMuZXh0R2VvLnlNaW5cbiAgICAgICAgICAgIHRoaXMueU1heCA9IGdlb0NhbnZhcy5leHRHZW8ueU1heFxuXG4gICAgICAgICAgICAvL2J1aWxkIFdNUyBVUkxcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IFtdXG4gICAgICAgICAgICB1cmwucHVzaCh0aGlzLnVybClcbiAgICAgICAgICAgIHVybC5wdXNoKFwiJndpZHRoPVwiKVxuICAgICAgICAgICAgdXJsLnB1c2goZ2VvQ2FudmFzLncpXG4gICAgICAgICAgICB1cmwucHVzaChcIiZoZWlnaHQ9XCIpXG4gICAgICAgICAgICB1cmwucHVzaChnZW9DYW52YXMuaClcbiAgICAgICAgICAgIC8vYmJveDogeG1pbiB5bWluIHhtYXggeW1heFxuICAgICAgICAgICAgdXJsLnB1c2goXCImYmJveD1cIilcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueE1pbilcbiAgICAgICAgICAgIHVybC5wdXNoKFwiLFwiKVxuICAgICAgICAgICAgdXJsLnB1c2goZ2VvQ2FudmFzLmV4dEdlby55TWluKVxuICAgICAgICAgICAgdXJsLnB1c2goXCIsXCIpXG4gICAgICAgICAgICB1cmwucHVzaChnZW9DYW52YXMuZXh0R2VvLnhNYXgpXG4gICAgICAgICAgICB1cmwucHVzaChcIixcIilcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueU1heClcblxuICAgICAgICAgICAgY29uc3QgdXJsUyA9IHVybC5qb2luKFwiXCIpXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHVybFMpXG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pbWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltZyA9IG5ldyBJbWFnZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHJldHJpZXZlIFdNUyBiYWNrZ3JvdW5kIGltYWdlIGZyb21cIiwgdXJsUylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vc2V0IFVSTCB0byBsYXVuY2ggdGhlIGRvd25sb2FkXG4gICAgICAgICAgICB0aGlzLmltZy5zcmMgPSB1cmxTXG4gICAgICAgIH1cblxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuaW1wb3J0IHsganNvbiB9IGZyb20gJ2QzLWZldGNoJ1xuXG4vKipcbiAqIEBtb2R1bGUgbGF5ZXJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEdlb0pTT05MYXllciBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggZmVhdHVyZSBhZnRlciBsb2FkaW5nLlxuICAgICAgICAgKiBJdCBjYW4gYmUgdXNlZCB0byBhcHBseSBzb21lIHNwZWNpZmljIHRyZWF0bWVudCBiZWZvcmUsIGZvcm1hdCB0aGUgbGFiZWwgZGF0YSwgcHJvamVjdCBjb29yZGluYXRlcywgZXRjLlxuICAgICAgICAgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGxhYmVsIHNob3VsZCBub3QgYmUga2VwdC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXG5cbiAgICAgICAgLy9mb3IgcG9pbnRzXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKGYsIHopID0+ICdjaXJjbGUnKVxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gcGl4ZWxcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoZiwgeikgPT4gMTApXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnN0cm9rZVN0eWxlID0gb3B0cy5zdHJva2VTdHlsZSB8fCAoKGYsIHopID0+ICdyZWQnKVxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5maWxsU3R5bGUgPSBvcHRzLmZpbGxTdHlsZSB8fCAoKGYsIHopID0+ICdibGFjaycpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBwaXhlbFxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgoZiwgeikgPT4gMilcblxuXG5cbiAgICAgICAgLy9mb3IgbGluZXNcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKChmLCB6KSA9PiAnZ3JheScpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBwaXhlbFxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKGYsIHopID0+IDIpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6QXJyYXkuPG51bWJlcj58dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmxpbmVEYXNoID0gb3B0cy5saW5lRGFzaCB8fCAoKGYsIHopID0+IHVuZGVmaW5lZClcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG9iamVjdD4gfCB1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuZnMgPSB1bmRlZmluZWRcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIERyYXcgdGhlIGxheWVyLlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkcmF3KGdlb0NhbnZhcykge1xuICAgICAgICAvL2xvYWQgZGF0YSwgaWYgbm90IGRvbmUgeWV0LlxuICAgICAgICBpZiAoIXRoaXMuZnMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZChnZW9DYW52YXMucmVkcmF3KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIGZvciAoY29uc3QgZiBvZiB0aGlzLmZzKSB7XG4gICAgICAgICAgICBjb25zdCBndCA9IGYuZ2VvbWV0cnkudHlwZVxuXG4gICAgICAgICAgICBpZiAoZ3QgPT0gXCJQb2ludFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcblxuICAgICAgICAgICAgICAgIC8vZ2V0IHN0eWxlIHBhcmFtZXRlcnMgZm9yIHRoZSBwb2ludCBmZWF0dXJlXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLnNoYXBlKGYseilcbiAgICAgICAgICAgICAgICBpZighc2hhcGUgfHwgc2hhcGU9PVwibm9uZVwiKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemUoZix6KSAqIHpcbiAgICAgICAgICAgICAgICBpZighc2l6ZSkgY29udGludWVcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJva2VTdHlsZSA9IHRoaXMuc3Ryb2tlU3R5bGUoZix6KVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGxTdHlsZSA9IHRoaXMuZmlsbFN0eWxlKGYseilcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lV2lkdGggPSB0aGlzLmxpbmVXaWR0aChmLHopICogelxuXG4gICAgICAgICAgICAgICAgLy9zZXQgY2FudmFzIGRyYXdpbmcgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgIGlmKHN0cm9rZVN0eWxlKSBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGVcbiAgICAgICAgICAgICAgICBpZihmaWxsU3R5bGUpIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gZmlsbFN0eWxlXG4gICAgICAgICAgICAgICAgaWYobGluZVdpZHRoKSBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aFxuXG4gICAgICAgICAgICAgICAgaWYgKHNoYXBlID09IFwiY2lyY2xlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZSAtIGZpbGwgYW5kIHN0cm9rZVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKGNbMF0sIGNbMV0sIHNpemUgLyAyLCAwLCAyICogTWF0aC5QSSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIGlmKGZpbGxTdHlsZSkgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgICAgICAgICAgaWYoc3Ryb2tlU3R5bGUgJiYgbGluZVdpZHRoKSBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PSBcInNxdWFyZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzcXVhcmUgLSBmaWxsIGFuZCBzdHJva2VcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnJlY3QoY1swXSAtIHNpemUgLyAyLCBjWzFdIC0gc2l6ZSAvIDIsIHNpemUsIHNpemUpXG4gICAgICAgICAgICAgICAgICAgIGlmKGZpbGxTdHlsZSkgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgICAgICAgICAgaWYoc3Ryb2tlU3R5bGUgJiYgbGluZVdpZHRoKSBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlVuZXhwZWN0ZWQgc2hhcGUgZm9yIHBvaW50IGdlb2pzb246IFwiICsgc2hhcGUpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGd0ID09IFwiTGluZVN0cmluZ1wiKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjcyA9IGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcbiAgICAgICAgICAgICAgICBpZiAoY3MubGVuZ3RoIDwgMikgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihmLCB6KVxuICAgICAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PSAnbm9uZScpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAgICAgLy9zZXQgbGluZXdpZHRoXG4gICAgICAgICAgICAgICAgY29uc3Qgd1AgPSB0aGlzLndpZHRoKGYsIHopXG4gICAgICAgICAgICAgICAgaWYgKCF3UCB8fCB3UCA8IDApIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSB3UCAqIHpcblxuICAgICAgICAgICAgICAgIC8vc2V0IGxpbmUgZGFzaFxuICAgICAgICAgICAgICAgIGNvbnN0IGxkUCA9IHRoaXMubGluZURhc2goZiwgeilcbiAgICAgICAgICAgICAgICBpZiAobGRQKSBnZW9DYW52YXMuY3R4LnNldExpbmVEYXNoKGxkUClcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBsaW5lXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGNzWzBdWzBdLCBjc1swXVsxXSlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNzLmxlbmd0aDsgaSsrKSBnZW9DYW52YXMuY3R4LmxpbmVUbyhjc1tpXVswXSwgY3NbaV1bMV0pXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlVuc3VwcG9ydGVkIGdlb21ldHJ5IHR5cGUgaW4gR2VvSlNPTkxheWVyOiBcIiArIGd0KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICAvLy4uLlxuICAgICAgICBnZW9DYW52YXMuY3R4LnNldExpbmVEYXNoKFtdKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgZGF0YSBmb3IgbGFiZWxzLCBmcm9tIFVSTCB0aGlzLnVybFxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYXN5bmMgbG9hZChjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMudXJsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgYm91bmRhcmllczogTm8gVVJMIHNwZWNpZmllZC4gJyArIHRoaXMudXJsKVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgIHRoaXMubGFiZWxzID0gW11cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBkYXRhIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVyblxuXG4gICAgICAgIC8vbG9hZCBkYXRhXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhXyA9IGF3YWl0IGpzb24odGhpcy51cmwpXG5cbiAgICAgICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxvYmplY3Q+IH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBkYXRhXy5mZWF0dXJlc1xuXG4gICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcyA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxuICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSBmYWxzZSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcy5wdXNoKGMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL3N0b3JlIGxhYmVsc1xuICAgICAgICAgICAgICAgIHRoaXMuZnMgPSBkYXRhXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG5cbiAgICAgICAgICAgIC8vcmVkcmF3XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBib3VuZGFyaWVzIGZyb20gJyArIHRoaXMudXJsKVxuICAgICAgICAgICAgdGhpcy5mcyA9IFtdXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uL2NvcmUvTGF5ZXIuanMnXG5cbi8qKlxuICogQSBsYXllciwgd2hpY2ggc3BlY2lmaWVzIGEgZGF0YXNldCB0byBiZSBzaG93biB3aXRoIHNwZWNpZmllZCBzdHlsZXMuXG4gKlxuICogQG1vZHVsZSBsYXllclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgR3JpZExheWVyIGV4dGVuZHMgTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkRhdGFzZXR8aW1wb3J0KFwiLi4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0XCIpLk11bHRpUmVzb2x1dGlvbkRhdGFzZXR9IGRhdGFzZXQgVGhlIGRhdGFzZXQgdG8gc2hvdy5cbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlN0eWxlPn0gc3R5bGVzIFRoZSBzdHlsZXMsIG9yZGVyZWQgaW4gZHJhd2luZyBvcmRlci5cbiAgICAgKiBAcGFyYW0ge3t2aXNpYmxlPzpmdW5jdGlvbihudW1iZXIpOmJvb2xlYW4sYWxwaGE/OmZ1bmN0aW9uKG51bWJlcik6bnVtYmVyLGJsZW5kT3BlcmF0aW9uPzpmdW5jdGlvbihudW1iZXIpOkdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbixtaW5QaXhlbHNQZXJDZWxsPzpudW1iZXIsY2VsbEluZm9IVE1MPzpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6c3RyaW5nfX0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRhdGFzZXQsIHN0eWxlcywgb3B0cyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuRGF0YXNldHxpbXBvcnQoXCIuLi9jb3JlL011bHRpUmVzb2x1dGlvbkRhdGFzZXRcIikuTXVsdGlSZXNvbHV0aW9uRGF0YXNldH0gKi9cbiAgICAgICAgdGhpcy5kYXRhc2V0ID0gZGF0YXNldFxuXG4gICAgICAgIC8qKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU3R5bGU+fSAqL1xuICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlc1xuXG4gICAgICAgIC8qKiBcbiAgICAgICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB3aGVuIHRoZSBkYXRhc2V0IGlzIGEgTXVsdGlSZXNvbHV0aW9uRGF0YXNldC5cbiAgICAgICAgICogSXQgZGVmaW5lcyB0aGUgbWluaW11bSBudW1iZXIgb2YgcGl4ZWxzIGEgZ3JpZCBjZWxsIHNob3VsZCBoYXZlIHRvIHNlbGVjdCB0aGUgZGF0YXNldCB0byBkaXNwbGF5IGJhc2VkIG9uIGl0cyByZXNvbHV0aW9uLlxuICAgICAgICAgKiBBIGxvdyB2YWx1ZSwgbWVhbnMgdGhhdCB0aGUgbWFwIHdpbGwgYmUgbW9yZSBkZXRhaWxsZWQgKHNtYWxsZXIgY2VsbHMpLlxuICAgICAgICAgKiBBIGhpZ2ggdmFsdWUsIG1lYW5zIHRoYXQgdGhlIG1hcCB3aWxsIGJlIGxlc3MgZGV0YWlsbGVkIChsYXJnZXIgY2VsbHMpLlxuICAgICAgICAgKiBUaGlzIHZhbHVlIHNob3VsZCBiZSBoaWdoZXIgdGhhbiAxLCBvdGhlcndpc2UgaXQgbWVhbnMgYSBncmlkIGNlbGwgaXMgc21hbGxlciB0aGFuIHRoZSBzY3JlZW4gcmVzb2x1dGlvbi5cbiAgICAgICAgICogRm9yIG1vcmUgY29tcGxleCBjZWxsIHJlcHJlc2VudGF0aW9ucyB0aGF0IHJlcXVpcmUgc29tZSBtb3JlIG1hcCBzcGFjZSwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaGlnaGVyLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm1pblBpeGVsc1BlckNlbGwgPSBvcHRzLm1pblBpeGVsc1BlckNlbGwgfHwgM1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZnVuY3Rpb24gcmV0dXJuaW5nIGNlbGwgaW5mb3JtYXRpb24gYXMgSFRNTC5cbiAgICAgICAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgdG9vbHRpcCBpbmZvcm1hdGlvbi5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsLCBudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jZWxsSW5mb0hUTUwgPSBvcHRzLmNlbGxJbmZvSFRNTCB8fCBHcmlkTGF5ZXIuZGVmYXVsdENlbGxJbmZvSFRNTFxuICAgIH1cblxuICAgIC8qKiAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzLCBsZWdlbmQpIHtcblxuICAgICAgICAvL2dldCB6b29tIGxldmVsXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9nZXQgbGF5ZXIgZGF0YXNldCBjb21wb25lbnRcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkRhdGFzZXR8dW5kZWZpbmVkfSAqL1xuICAgICAgICBjb25zdCBkc2MgPSB0aGlzLmdldERhdGFzZXQoeilcbiAgICAgICAgaWYgKCFkc2MpIHJldHVyblxuXG4gICAgICAgIC8vbGF1bmNoIGRhdGEgZG93bmxvYWQsIGlmIG5lY2Vzc2FyeVxuICAgICAgICBkc2MuZ2V0RGF0YShnZW9DYW52YXMuZXh0R2VvKVxuXG4gICAgICAgIC8vdXBkYXRlIGRhdGFzZXQgdmlldyBjYWNoZVxuICAgICAgICBkc2MudXBkYXRlVmlld0NhY2hlKGdlb0NhbnZhcy5leHRHZW8pXG5cbiAgICAgICAgLy9kcmF3IGNlbGxzLCBzdHlsZSBieSBzdHlsZVxuICAgICAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5zdHlsZXMpIHtcblxuICAgICAgICAgICAgLy9jaGVjayBpZiBzdHlsZSBpcyB2aXNpYmxlXG4gICAgICAgICAgICBpZiAocy52aXNpYmxlICYmICFzLnZpc2libGUoeikpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vc2V0IHN0eWxlIGFscGhhIGFuZCBibGVuZCBtb2RlXG4gICAgICAgICAgICAvL1RPRE86IG11bHRpcGx5IGJ5IGxheWVyIGFscGhhID9cbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZ2xvYmFsQWxwaGEgPSBzLmFscGhhID8gcy5hbHBoYSh6KSA6IDEuMFxuICAgICAgICAgICAgaWYgKHMuYmxlbmRPcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBzLmJsZW5kT3BlcmF0aW9uKHopXG5cbiAgICAgICAgICAgIC8vc2V0IGFmZmluIHRyYW5zZm9ybSB0byBkcmF3IHdpdGggZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICBnZW9DYW52YXMuc2V0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICAgICAgLy9kcmF3IHdpdGggc3R5bGVcbiAgICAgICAgICAgIHMuZHJhdyhkc2MuZ2V0Vmlld0NhY2hlKCksIGdlb0NhbnZhcywgZHNjLmdldFJlc29sdXRpb24oKSlcblxuICAgICAgICAgICAgLy9kcmF3IHN0eWxlIGZpbHRlclxuICAgICAgICAgICAgaWYgKHMuZmlsdGVyQ29sb3IpXG4gICAgICAgICAgICAgICAgcy5kcmF3RmlsdGVyKGdlb0NhbnZhcylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vYWRkIGxlZ2VuZCBlbGVtZW50XG4gICAgICAgIGlmIChsZWdlbmQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgc3R5bGUgaXMgdmlzaWJsZVxuICAgICAgICAgICAgICAgIGlmIChzLnZpc2libGUgJiYgIXMudmlzaWJsZSh6KSkgY29udGludWVcbiAgICAgICAgICAgICAgICBHcmlkTGF5ZXIuYWRkTGVnZW5kcyhsZWdlbmQsIHMubGVnZW5kcylcblxuICAgICAgICAgICAgICAgIC8vY2FzZSBmb3Igc3R5bGVzIG9mIHN0eWxlcywgbGlrZSBrZXJuZWwgc21vb3RoaW5nXG4gICAgICAgICAgICAgICAgLy9UT0RPIGRvIGJldHRlclxuICAgICAgICAgICAgICAgIGlmIChzWydzdHlsZXMnXSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMyIG9mIHNbJ3N0eWxlcyddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoczIudmlzaWJsZSAmJiAhczIudmlzaWJsZSh6KSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgIEdyaWRMYXllci5hZGRMZWdlbmRzKGxlZ2VuZCwgczIubGVnZW5kcylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgc3RhdGljIGFkZExlZ2VuZHMobGVnZW5kQ29tcCwgbGcpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGcpKSBmb3IgKGNvbnN0IGxnXyBvZiBsZykgdGhpcy5hZGRMZWdlbmRzKGxlZ2VuZENvbXAsIGxnXylcbiAgICAgICAgZWxzZSBsZWdlbmRDb21wLm5vZGUoKS5hcHBlbmQobGcuZGl2Lm5vZGUoKSlcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgcmVsZXZhbnQgZGF0YXNldCBjb21wb25lbnQgZm9yIGEgc3BlY2lmaWVkIHpvb20uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuRGF0YXNldHx1bmRlZmluZWR9XG4gICAgICogKi9cbiAgICBnZXREYXRhc2V0KHopIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNldC5nZXREYXRhc2V0KHosIHRoaXMubWluUGl4ZWxzUGVyQ2VsbCk7XG4gICAgfVxuXG5cblxuICAgIC8qKlxuICAgICAqIFNldC9nZXQgc3R5bGUgc3RhY2suXG4gICAgICogXG4gICAgICogQHBhcmFtIHt1bmRlZmluZWR8aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZXxBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT59IHN0eWxlcyBcbiAgICAgKiBAcmV0dXJucyB7IHRoaXMgfCBBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT4gfVxuICAgICAqL1xuICAgIHN0eWxlc18oc3R5bGVzKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5zdHlsZXNcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZXMpKSB0aGlzLnN0eWxlcyA9IHN0eWxlc1xuICAgICAgICAgICAgZWxzZSB0aGlzLnN0eWxlcyA9IFtzdHlsZXNdXG4gICAgICAgIGVsc2UgdGhpcy5zdHlsZXMgPSBhcmd1bWVudHNcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cblxuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgZnVuY3Rpb24gcmV0dXJuaW5nIGNlbGwgaW5mb3JtYXRpb24gYXMgSFRNTC5cbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciB0b29sdGlwIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbH0gY2VsbFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGRlZmF1bHRDZWxsSW5mb0hUTUwoY2VsbCkge1xuICAgICAgICBjb25zdCBidWYgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjZWxsKSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3gnKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3knKSBjb250aW51ZVxuICAgICAgICAgICAgYnVmLnB1c2goJzxiPicsIGtleSwgJzwvYj4nLCAnIDogJywgY2VsbFtrZXldLCAnPGJyPicpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1Zi5qb2luKCcnKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuaW1wb3J0IHsgY3N2IH0gZnJvbSAnZDMtZmV0Y2gnXG5cbi8qKiBBIGxhYmVsLiBUaGUgbmFtZSBpcyB0aGUgdGV4dCB0byBzaG93LiAoeCx5KSBhcmUgdGhlIGNvb3JkaW5hdGVzIGluIHRoZSBzYW1lIENSUyBhcyB0aGUgZ3JpZC5cbiAqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nLCB4Om51bWJlciwgeTpudW1iZXIgfX0gTGFiZWwgKi9cblxuLyoqXG4gKiBBIChnZW5lcmljKSBsYXllciBmb3IgcGxhY2VuYW1lIGxhYmVscywgdG8gYmUgc2hvd24gb24gdG9wIG9mIHRoZSBncmlkIGxheWVycy5cbiAqIFRoZSBpbnB1dCBpcyBhIENTViBmaWxlIHdpdGggdGhlIHBvc2l0aW9uICh4LCB5KSBvZiB0aGUgbGFiZWxzIGFuZCBuYW1lICsgc29tZSBvdGhlciBpbmZvIG9uIHRoZSBsYWJlbCBpbXBvcnRhbmNlLlxuICogSWYgdGhlIGxhYmVsIGRhdGEgaXMgbm90IGluIHRoZSBleHBlY3RlZCBmb3JtYXQgb3IgaW4gdGhlIHNhbWUgQ1JTIGFzIHRoZSBncmlkLCBpdCBjYW4gYmUgY29ycmVjdGVkIHdpdGggdGhlIFwicHJlcHJvY2Vzc1wiIGZ1bmN0aW9uLlxuICogVGhlIHNlbGVjdGlvbiBvZiB0aGUgbGFiZWwsIHRoZWlyIHN0eWxlIChmb250LCB3ZWlnaHQsIGV0Yy4pIGFuZCBjb2xvciBjYW4gYmUgc3BlY2lmaWVkIGRlcGVuZGluZyBvbiB0aGVpciBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cbiAqXG4gKiBAbW9kdWxlIGxheWVyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBMYWJlbExheWVyIGV4dGVuZHMgTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgVVJMIG9mIHRoZSBsYWJlbCBkYXRhLCBhcyBDU1YgZmlsZS5cbiAgICAgICAgICogVGhlIGZpbGUgc2hvdWxkIGNvbnRhaW4gdGhlIGluZm9ybWF0aW9uIGZvciBlYWNoIGxhYmVsIHN1Y2ggYXMgdGhlIHRleHQsIHRoZSBwb3NpdGlvbiBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBkaXNwbGF5IG9mIHRoZSBsYWJlbCBhY2NvcmRpbmcgdG8gdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIElmIG5lY2Vzc2FyeSwgdGhpcyBkYXRhIGNhbiBiZSByZWZvcm1hdGVkIHdpdGggdGhlICdwcmVwcm9jZXNzJyBwYXJhbWV0ZXIuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcblxuICAgICAgICAvKiogU3BlY2lmeSBpZiBhbmQgaG93IGEgbGFiZWwgc2hvdWxkIGJlIGRyYXduLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc3R5bGUgPSBvcHRzLnN0eWxlIHx8ICgoKSA9PiAnYm9sZCAxZW0gQXJpYWwnKVxuXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBjb2xvciwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAob3B0cy5kYXJrID8gKCkgPT4gJyNkZGQnIDogKCkgPT4gJyMyMjInKVxuXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBoYWxvIGNvbG9yLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuaGFsb0NvbG9yID0gb3B0cy5oYWxvQ29sb3IgfHwgKG9wdHMuZGFyayA/ICgpID0+ICcjMDAwMDAwQkInIDogKCkgPT4gJyNGRkZGRkZCQicpXG5cbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGxhYmVsIGhhbG8gd2lkdGgsIGRlcGVuZGluZyBvbiBpdHMgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oYWxvV2lkdGggPSBvcHRzLmhhbG9XaWR0aCB8fCAoKCkgPT4gNClcblxuICAgICAgICAvKiogVGhlIGFuY2hvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0LCBmcm9tIGxhYmVsIHBvc2l0aW9uLiBTZWUgSFRNTC1jYW52YXMgdGV4dEFsaWduIHByb3BlcnR5LlxuICAgICAgICAgKiBcImxlZnRcIiB8fCBcInJpZ2h0XCIgfHwgXCJjZW50ZXJcIiB8fCBcInN0YXJ0XCIgfHwgXCJlbmRcIlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7Q2FudmFzVGV4dEFsaWdufSAqL1xuICAgICAgICB0aGlzLnRleHRBbGlnbiA9IG9wdHMudGV4dEFsaWduIHx8ICdzdGFydCdcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xuICAgICAgICB0aGlzLm9mZnNldFBpeCA9IG9wdHMub2Zmc2V0UGl4IHx8IFs1LCA1XVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggbGFiZWwgYWZ0ZXIgbG9hZGluZy5cbiAgICAgICAgICogSXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc29tZSBzcGVjaWZpYyB0cmVhdG1lbnQgYmVmb3JlLCBmb3JtYXQgdGhlIGxhYmVsIGRhdGEsIHByb2plY3QgY29vcmRpbmF0ZXMsIGV0Yy5cbiAgICAgICAgICogUmV0dXJuIGZhbHNlIGlmIHRoZSBsYWJlbCBzaG91bGQgbm90IGJlIGtlcHQuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48TGFiZWw+IHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmxhYmVscyA9IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgdGhlIGxhYmVsIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XG4gICAgICAgIC8vbG9hZCBsYWJlbHMsIGlmIG5vdCBkb25lIHlldC5cbiAgICAgICAgaWYgKCF0aGlzLmxhYmVscykge1xuICAgICAgICAgICAgdGhpcy5sb2FkKGdlb0NhbnZhcy5yZWRyYXcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy90ZXh0IGFsaWduXG4gICAgICAgIGdlb0NhbnZhcy5jdHgudGV4dEFsaWduID0gdGhpcy50ZXh0QWxpZ24gfHwgJ3N0YXJ0J1xuXG4gICAgICAgIC8vbGluZSBqb2luIGFuZCBjYXBcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lSm9pbiA9ICdiZXZlbCcgLy98fCBcInJvdW5kXCIgfHwgXCJtaXRlclwiO1xuICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVDYXAgPSAnYnV0dCcgLy98fCBcInJvdW5kXCIgfHwgXCJzcXVhcmVcIjtcblxuICAgICAgICAvL2RyYXcgaW4gcGl4IGNvb3JkaW5hdGVzXG4gICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICAvL2RyYXcgbGFiZWxzLCBvbmUgYnkgb25lXG4gICAgICAgIGZvciAoY29uc3QgbGIgb2YgdGhpcy5sYWJlbHMpIHtcbiAgICAgICAgICAgIC8vZ2V0IGxhYmVsIHN0eWxlXG4gICAgICAgICAgICBjb25zdCBzdCA9IHRoaXMuc3R5bGUobGIsIHopXG4gICAgICAgICAgICBpZiAoIXN0KSBjb250aW51ZVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5mb250ID0gc3RcblxuICAgICAgICAgICAgLy9jaGVjayBsYWJlbCB3aXRoaW4gdGhlIHZpZXcsIHRvIGJlIGRyYXduXG4gICAgICAgICAgICBpZiAoIWdlb0NhbnZhcy50b0RyYXcobGIpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3Bvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCB4UCA9IGdlb0NhbnZhcy5nZW9Ub1BpeFgobGIueCkgKyB0aGlzLm9mZnNldFBpeFswXVxuICAgICAgICAgICAgY29uc3QgeVAgPSBnZW9DYW52YXMuZ2VvVG9QaXhZKGxiLnkpIC0gdGhpcy5vZmZzZXRQaXhbMV1cblxuICAgICAgICAgICAgLy9sYWJlbCBzdHJva2UsIGZvciB0aGUgaGFsb1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFsb0NvbG9yICYmIHRoaXMuaGFsb1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGMgPSB0aGlzLmhhbG9Db2xvcihsYiwgeilcbiAgICAgICAgICAgICAgICBjb25zdCBodyA9IHRoaXMuaGFsb1dpZHRoKGxiLCB6KVxuICAgICAgICAgICAgICAgIGlmIChoYyAmJiBodyAmJiBodyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IGhjXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gaHdcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VUZXh0KGxiLm5hbWUsIHhQLCB5UClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vbGFiZWwgZmlsbFxuICAgICAgICAgICAgaWYgKHRoaXMuY29sb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yKGxiLCB6KVxuICAgICAgICAgICAgICAgIGlmIChjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsVGV4dChsYi5uYW1lLCB4UCwgeVApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBkYXRhIGZvciBsYWJlbHMsIGZyb20gVVJMIHRoaXMudXJsXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhc3luYyBsb2FkKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy51cmwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBsYWJlbHM6IE5vIFVSTCBzcGVjaWZpZWQuICcgKyB0aGlzLnVybClcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgZGF0YSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5sb2FkaW5nU3RhdHVzICE9ICdub3RMb2FkZWQnKSByZXR1cm5cblxuICAgICAgICAvL2xvYWQgZGF0YVxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbG9hZGluZydcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLyoqIEB0eXBlIHsgQXJyYXkuPExhYmVsPiB9ICovXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgY3N2KHRoaXMudXJsKVxuXG4gICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFiZWxzLnB1c2goYylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vc3RvcmUgbGFiZWxzXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBkYXRhXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG5cbiAgICAgICAgICAgIC8vcmVkcmF3XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBsYWJlbHMgZnJvbSAnICsgdGhpcy51cmwpXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9jb3JlL0xlZ2VuZC5qcydcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBjb2xvciBjYXRlZ3Jvcmllcy5cbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29sb3JDYXRlZ29yeUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8vY29sL2NhdGVnb3JpZXMgYXJyYXksIGluIGRpc3BsYXkgb3JkZXJcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48W3N0cmluZyxzdHJpbmddPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvckxhYmVsID0gb3B0cy5jb2xvckxhYmVsIHx8IFtbJ2dyYXknLCAnLSddXVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29yZS9TdHlsZS5qc1wiKS5TaGFwZX0gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgJ2NpcmNsZSdcbiAgICAgICAgdGhpcy5kaW1lbnNpb24gPSBvcHRzLmRpbWVuc2lvbiB8fCB7IHI6IDggfVxuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAnZ3JheSdcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgMVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqL1xuICAgIHVwZGF0ZSgpIHtcblxuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLm1ha2VUaXRsZSgpXG5cbiAgICAgICAgLy9jYXRlZ29yaWVzXG4gICAgICAgIGNvbnN0IG5iID0gdGhpcy5jb2xvckxhYmVsLmxlbmd0aFxuICAgICAgICBpZiAobmIgPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjYXQgPSB0aGlzLmNvbG9yTGFiZWxbaV1cblxuICAgICAgICAgICAgLy9tYWtlIGRpdiBmb3IgY2F0ZWdvcnlcbiAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAvL3RvIGVuYWJsZSB2ZXJ0aWNhbCBjZW50ZXJpbmdcbiAgICAgICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKVxuXG4gICAgICAgICAgICBjb25zdCBzdyA9IHRoaXMuc3Ryb2tlV2lkdGhcblxuICAgICAgICAgICAgLy9kcmF3IGdyYXBoaWMgZWxlbWVudDogYm94IC8gY2lyY2xlXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFwZSA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoID0gdGhpcy5kaW1lbnNpb24uaCB8fCAxNVxuICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB0aGlzLmRpbWVuc2lvbi53IHx8IDIwXG4gICAgICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcgKyAyICogc3cpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoICsgMiAqIHN3KVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3JlY3QnKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigneCcsIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigneScsIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaClcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgY2F0WzBdKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuc3Ryb2tlQ29sb3IpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGFwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5kaW1lbnNpb24uciB8fCA4XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IDIgKiByICsgMiAqIHN3XG4gICAgICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIGgpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoKVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHIgKyBzdylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2N5JywgciArIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigncicsIHIpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGNhdFswXSlcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHRoaXMuc3Ryb2tlV2lkdGgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgdGhpcy5zaGFwZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy93cml0ZSBsYWJlbCB0ZXh0XG4gICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgICAgICAvL3Nob3cgb24gcmlnaHQgb2YgZ3JhcGhpY1xuICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuXG4gICAgICAgICAgICAgICAgLy9jZW50ZXIgdmVydGljYWxseVxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJhYnNvbHV0ZVwiKS5zdHlsZShcInRvcFwiLCBcIjBcIikuc3R5bGUoXCJib3R0b21cIiwgXCIwXCIpXG5cbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsICc1cHgnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxuICAgICAgICAgICAgICAgIC50ZXh0KGNhdFsxXSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXG5cbi8qKlxuICogQSBsZWdlbmQgZWxlbWVudCBmb3IgZGlzY3JldGUgY29sb3Igc3R5bGUuXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9jb2xvci1sZWdlbmRcbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29sb3JEaXNjcmV0ZUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlKTpBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBvcHRzLmNvbG9yc1xuICAgICAgICAvKiogQHByaXZhdGUgQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9TdHlsZScpLlZpZXdTY2FsZSk6QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMuYnJlYWtzID0gb3B0cy5icmVha3NcblxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAzMDBcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAxNVxuXG4gICAgICAgIHRoaXMudGlja1NpemUgPSBvcHRzLnRpY2tTaXplIHx8IDNcblxuICAgICAgICAvL2xhYmVsXG4gICAgICAgIHRoaXMuaW52ZXJ0ID0gb3B0cy5pbnZlcnRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3t2aWV3U2NhbGU6aW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlfSB9IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICAvL2dldCBjb2xvcnMgYW5kIGJyZWFrc1xuICAgICAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmNvbG9ycyhvcHRzLnZpZXdTY2FsZSlcbiAgICAgICAgY29uc3QgYnJlYWtzID0gdGhpcy5icmVha3Mob3B0cy52aWV3U2NhbGUpXG4gICAgICAgIGlmICghYnJlYWtzKSByZXR1cm5cblxuICAgICAgICAvL2NsYXNzZXNcbiAgICAgICAgY29uc3QgbmIgPSBjb2xvcnMubGVuZ3RoXG4gICAgICAgIGlmIChuYiA9PSAwKSByZXR1cm5cbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGggLyBuYlxuXG4gICAgICAgIC8vbWFrZSBzdmcgZWxlbWVudFxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdlxuICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMud2lkdGgpXG4gICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgdGhpcy5oZWlnaHQgKyB0aGlzLnRpY2tTaXplICsgMiArIDEwKVxuXG4gICAgICAgIC8vZHJhdyBncmFwaGljIGVsZW1lbnRzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgc3ZnLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCBpICogdylcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdylcbiAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgdGhpcy5oZWlnaHQpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgY29sb3JzW2ldKVxuICAgICAgICB9XG5cbiAgICAgICAgLy90aWNrIGxpbmVcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcbiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCB3ICogaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MicsIHcgKiBpKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MicsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSlcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICdibGFjaycpXG4gICAgICAgIH1cblxuICAgICAgICAvL2xhYmVsc1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcblxuICAgICAgICAgICAgbGV0IGxhYmVsID0gYnJlYWtzW2kgLSAxXVxuICAgICAgICAgICAgaWYgKGlzTmFOKGxhYmVsKSB8fCBsYWJlbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZih0aGlzLmxhYmVsRm9ybWF0KSBsYWJlbCA9IHRoaXMubGFiZWxGb3JtYXQobGFiZWwpXG5cbiAgICAgICAgICAgIC8vbGFiZWxcbiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICd0aWNrbGFiZWxfJyArIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCB3ICogaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LXdlaWdodFwiLCBcImJvbGRcIilcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtZmFtaWx5XCIsIFwiQXJpYWxcIilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdhbGlnbm1lbnQtYmFzZWxpbmUnLCAndG9wJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAgICAgICAgICAgLnRleHQobGFiZWwpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGNvbnRpbnVvdXMgY29sb3Igc3R5bGUuXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9jb2xvci1sZWdlbmRcbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29sb3JMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL2EgZnVuY3Rpb24gWzAsMV0tPmNvbG9yIGZvciBjb250aW51b3VzIGNvbG9yc1xuICAgICAgICAvL29yIGFycmF5IG9mIGNvbG9ycyBmb3IgZGlzY3JldGUgY29sb3JzXG4gICAgICAgIHRoaXMuY29sb3JTY2FsZSA9IG9wdHMuY29sb3JTY2FsZVxuXG4gICAgICAgIC8vZnVuY3Rpb24gKHRbMCwxXSkgLT4gdmFsdWUgKGZvciBsYWJlbCB0ZXh0KVxuICAgICAgICB0aGlzLnRleHRTY2FsZSA9IG9wdHMudGV4dFNjYWxlIHx8ICh0ID0+IHQpXG5cbiAgICAgICAgdGhpcy5tYXJnaW4gPSBvcHRzLm1hcmdpbiB8fCA1XG5cbiAgICAgICAgLy9yZXBsYWNlIHdpdGggbGFiZWxzID9cbiAgICAgICAgdGhpcy50aWNrU2l6ZSA9IG9wdHMudGlja1NpemUgfHwgNlxuICAgICAgICB0aGlzLnRpY2tzID0gb3B0cy50aWNrcyB8fCBNYXRoLmZsb29yKHRoaXMud2lkdGggLyA1MClcbiAgICAgICAgdGhpcy50aWNrRm9ybWF0ID0gb3B0cy50aWNrRm9ybWF0XG4gICAgICAgIHRoaXMudGlja1VuaXQgPSBvcHRzLnRpY2tVbml0XG5cbiAgICAgICAgdGhpcy5mb250U2l6ZSA9IG9wdHMuZm9udFNpemUgfHwgJzAuOGVtJ1xuICAgICAgICB0aGlzLmludmVydCA9IG9wdHMuaW52ZXJ0XG5cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMzAwXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgMTVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3t2aWV3U2NhbGU6aW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlfSB9IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICBjb25zdCBzdmdXID0gdGhpcy53aWR0aCArIDIgKiB0aGlzLm1hcmdpblxuICAgICAgICBjb25zdCBzdmdIID0gdGhpcy5oZWlnaHQgKyB0aGlzLm1hcmdpbiArIHRoaXMudGlja1NpemUgKyAxMFxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdi5hcHBlbmQoJ3N2ZycpLmF0dHIoJ3dpZHRoJywgc3ZnVykuYXR0cignaGVpZ2h0Jywgc3ZnSClcbiAgICAgICAgLy8gIDxyZWN0IHdpZHRoPVwiMzAwXCIgaGVpZ2h0PVwiMTAwXCIgc3R5bGU9XCJmaWxsOnJnYigwLDAsMjU1KTtzdHJva2Utd2lkdGg6MztzdHJva2U6cmdiKDAsMCwwKVwiIC8+XG5cbiAgICAgICAgY29uc3QgZyA9IHN2Z1xuICAgICAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgdGhpcy5tYXJnaW4gKyAnICcgKyAwICsgJyknKVxuXG4gICAgICAgIC8vZHJhdyBjb2xvciBiYXJcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGgsXG4gICAgICAgICAgICBoID0gdGhpcy5oZWlnaHRcbiAgICAgICAgY29uc3Qgc3RlcCA9IDVcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3OyBpICs9IHN0ZXApIHtcbiAgICAgICAgICAgIGxldCB0ID0gaSAvICh3IC0gMSlcbiAgICAgICAgICAgIGlmICh0aGlzLmludmVydCkgdCA9IDEgLSB0XG4gICAgICAgICAgICBnLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCBpKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgMClcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzdGVwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIHRoaXMuY29sb3JTY2FsZSh0LCBvcHRzLnZpZXdTY2FsZSkpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGlja3M7IGkrKykge1xuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHRoaXMudGlja3MgLSAxKVxuXG4gICAgICAgICAgICAvL3RpY2sgbGluZVxuICAgICAgICAgICAgZy5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MScsIHcgKiB0KVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gyJywgdyAqIHQpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgaCArIHRoaXMudGlja1NpemUpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAnYmxhY2snKVxuXG4gICAgICAgICAgICAvL3ByZXBhcmUgdGljayBsYWJlbFxuICAgICAgICAgICAgZy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICd0aWNrbGFiZWxfJyArIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCB3ICogdClcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIGggKyB0aGlzLnRpY2tTaXplICsgMilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LXdlaWdodFwiLCBcImJvbGRcIilcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtZmFtaWx5XCIsIFwiQXJpYWxcIilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgaSA9PSAwID8gJ3N0YXJ0JyA6IGkgPT0gdGhpcy50aWNrcyAtIDEgPyAnZW5kJyA6ICdtaWRkbGUnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYWxpZ25tZW50LWJhc2VsaW5lJywgJ3RvcCcpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdkb21pbmFudC1iYXNlbGluZScsICdoYW5naW5nJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICAgICAgLy8udGV4dChcIi1cIilcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIHRpY2sgbGFiZWxzXG5cbiAgICAgICAgLy9sYWJlbCB0ZXh0IGZvcm1hdFxuICAgICAgICBjb25zdCBmID0gdGhpcy50aWNrRm9ybWF0ICYmIHRoaXMudGlja0Zvcm1hdCAhPSAndGV4dCcgPyB0aGlzLnRpY2tGb3JtYXQgOiAodikgPT4gdlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGlja3M7IGkrKykge1xuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHRoaXMudGlja3MgLSAxKVxuXG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy50ZXh0U2NhbGUodCwgb3B0cy52aWV3U2NhbGUpXG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gKHYgPyBmKHYpIDogJzAnKSArICh0aGlzLnRpY2tVbml0ID8gdGhpcy50aWNrVW5pdCA6ICcnKVxuICAgICAgICAgICAgaWYgKHRleHQgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3RpY2sgbGFiZWxcbiAgICAgICAgICAgIHRoaXMuZGl2LnNlbGVjdCgnIycgKyAndGlja2xhYmVsXycgKyBpKS50ZXh0KHRleHQpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIHNlZ21lbnQgb3JpZW50YXRpb24uXG4gKlxuICogQG1vZHVsZSBsZWdlbmRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIE9yaWVudGF0aW9uTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy9vcmllbnRhdGlvblxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gb3B0cy5vcmllbnRhdGlvbiB8fCAwXG4gICAgICAgIC8vY29sb3JcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKChyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+ICdncmF5JylcbiAgICAgICAgLy93aWR0aFxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gMyAqIHopXG4gICAgICAgIC8vbGVuZ3RoXG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0cy5sZW5ndGggfHwgKChyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+IHJlc29sdXRpb24pXG5cbiAgICAgICAgLy9sYWJlbFxuICAgICAgICB0aGlzLmxhYmVsID0gb3B0cy5sYWJlbCB8fCBcIi1cIlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7eyBzdHlsZTogaW1wb3J0KFwiLi4vc3R5bGUvU2VnbWVudFN0eWxlLmpzXCIpLlNlZ21lbnRTdHlsZSwgcmVzb2x1dGlvbjogbnVtYmVyLCB6OiBudW1iZXIsIHZpZXdTY2FsZTpvYmplY3QgfX0gb3B0c1xuICAgICAqL1xuICAgIHVwZGF0ZShvcHRzKSB7XG5cbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxuXG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXG5cbiAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgY29sb3IsIHdpZHRoIGFuZCBsZW5ndGhcbiAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLmNvbG9yKG9wdHMucmVzb2x1dGlvbiwgb3B0cy56LCBvcHRzLnZpZXdTY2FsZSlcbiAgICAgICAgY29uc3Qgd2lkdGhQaXggPSB0aGlzLndpZHRoKG9wdHMucmVzb2x1dGlvbiwgb3B0cy56LCBvcHRzLnZpZXdTY2FsZSkgLyBvcHRzLnpcbiAgICAgICAgY29uc3QgbGVuZ3RoUGl4ID0gdGhpcy5sZW5ndGgob3B0cy5yZXNvbHV0aW9uLCBvcHRzLnosIG9wdHMudmlld1NjYWxlKSAvIG9wdHMuelxuXG4gICAgICAgIC8vZHJhdyBTVkcgc2VnbWVudFxuICAgICAgICBjb25zdCBzdmdTID0gTWF0aC5tYXgobGVuZ3RoUGl4LCB3aWR0aFBpeClcbiAgICAgICAgY29uc3Qgc3ZnID0gZC5hcHBlbmQoJ3N2ZycpLmF0dHIoJ3dpZHRoJywgc3ZnUykuYXR0cignaGVpZ2h0Jywgc3ZnUykuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxuXG4gICAgICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKCgtdGhpcy5vcmllbnRhdGlvbiAqIE1hdGguUEkpIC8gMTgwKVxuICAgICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbigoLXRoaXMub3JpZW50YXRpb24gKiBNYXRoLlBJKSAvIDE4MClcbiAgICAgICAgY29uc3QgZGMgPSBzdmdTICogMC41LFxuICAgICAgICAgICAgbDIgPSBsZW5ndGhQaXggKiAwLjVcbiAgICAgICAgc3ZnLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAuYXR0cigneDEnLCBkYyAtIGNvcyAqIGwyKVxuICAgICAgICAgICAgLmF0dHIoJ3kxJywgZGMgLSBzaW4gKiBsMilcbiAgICAgICAgICAgIC5hdHRyKCd4MicsIGRjICsgY29zICogbDIpXG4gICAgICAgICAgICAuYXR0cigneTInLCBkYyArIHNpbiAqIGwyKVxuICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCBjb2xvcilcbiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgd2lkdGhQaXgpXG5cblxuICAgICAgICAvL2xhYmVsXG4gICAgICAgIGQuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXG4gICAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsICc1cHgnKVxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXG4gICAgICAgICAgICAudGV4dCh0aGlzLmxhYmVsICsgKHRoaXMubGFiZWxVbml0VGV4dCA/ICcgJyA6ICcnKSArIHRoaXMubGFiZWxVbml0VGV4dClcbiAgICB9XG59XG5cbi8qKlxuICogXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBvcmllbnRhdGlvbnMgXG4gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBsYWJlbHMgXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyBcbiAqIEByZXR1cm5zICB7IEFycmF5LjxPcmllbnRhdGlvbkxlZ2VuZD4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3JpZW50YXRpb25MZWdlbmQob3JpZW50YXRpb25zLCBsYWJlbHMsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JpZW50YXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSBpID09IDAgPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkO1xuICAgICAgICBvcHRzLm9yaWVudGF0aW9uID0gb3JpZW50YXRpb25zW2ldXG4gICAgICAgIG9wdHMubGFiZWwgPSBsYWJlbHNbaV1cbiAgICAgICAgbGVnZW5kcy5wdXNoKG5ldyBPcmllbnRhdGlvbkxlZ2VuZChvcHRzKSlcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZHNcbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXG5pbXBvcnQgeyBuaWNlIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMuanMnXG5pbXBvcnQgeyBtYXggfSBmcm9tICdkMy1hcnJheSdcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBwcm9wb3J0aW9uYWwgc3ltYm9scy5cbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU2l6ZUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdGV4dCBsYWJlbCwgZnJvbSB0aGUgdmlldyBzY2FsZSBhbmQgbGlzdCBvZiBjZWxscywgcmVzb2x1dGlvbiBhbmQgem9vbVxuICAgICAgICAgKiAgQHR5cGUgeyBmdW5jdGlvbihvYmplY3QsIEFycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGw+LCBudW1iZXIsIG51bWJlcik6KG51bWJlcnxzdHJpbmcpIH0gKi9cbiAgICAgICAgdGhpcy5sYWJlbCA9IG9wdHMubGFiZWwgfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIHRoZSBsZWdlbmQgc3ltYm9sLCBpbiBnZW8gVW9NLCBmcm9tIHRoZSB2aWV3c2NhbGUsIHJlc29sdXRpb24gYW5kIHpvb21cbiAgICAgICAgICogIEB0eXBlIHsgZnVuY3Rpb24ob2JqZWN0LCBudW1iZXIsIG51bWJlcik6bnVtYmVyIH0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vc3ltYm9sXG4gICAgICAgIC8qKiAgQHR5cGUgeyhpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlNoYXBlKXxcImxpbmVcIn0gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgJ2NpcmNsZSdcblxuICAgICAgICAvL2dlbmVyYWwgY2FzZVxuICAgICAgICB0aGlzLmZpbGxDb2xvciA9IG9wdHMuZmlsbENvbG9yIHx8ICdub25lJ1xuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAnZ3JheSdcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgMVxuXG4gICAgICAgIC8vZm9yIGxpbmUgc2hhcGVcbiAgICAgICAgLy9UT0RPIHRoaXMub3JpZW50YXRpb24gPSBvcHRzLm9yaWVudGF0aW9uIHx8IDBcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgJ2dyYXknXG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0cy5sZW5ndGggfHwgKChyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+IHJlc29sdXRpb24pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7IHZpZXdTY2FsZTpvYmplY3QsIHJlc29sdXRpb246IG51bWJlciwgejpudW1iZXIsIGNlbGxzOkFycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGw+IH19IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICAvL2dldCBsYWJlbC4gTWF5IG5vdCBiZSBhIG51bWJlciAoISlcbiAgICAgICAgbGV0IGxhYmVsID0gdGhpcy5sYWJlbChvcHRzLnZpZXdTY2FsZSwgb3B0cy5jZWxscywgb3B0cy5yZXNvbHV0aW9uLCBvcHRzLnopXG5cbiAgICAgICAgLy9jb21wdXRlIHNpemUgb2Ygc3ltYm9sLCBpbiBwaXhcbiAgICAgICAgbGV0IHNpemVQaXhcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSlcbiAgICAgICAgICAgIHNpemVQaXggPSB0aGlzLnNpemUob3B0cy52aWV3U2NhbGUsIG9wdHMucmVzb2x1dGlvbiwgb3B0cy56KSAvIG9wdHMuelxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBzaXplUGl4ID0gb3B0cy52aWV3U2NhbGUoK2xhYmVsKSAvIG9wdHMuelxuICAgICAgICBpZiAoIXNpemVQaXgpIHJldHVyblxuXG4gICAgICAgIC8vZm9ybWF0IGxhYmVsLCBpZiBzcGVjaWZpZWQgYW5kIHBvc3NpYmxlXG4gICAgICAgIGlmICh0aGlzLmxhYmVsRm9ybWF0ICYmICFpc05hTigrbGFiZWwpKSBsYWJlbCA9IHRoaXMubGFiZWxGb3JtYXQobGFiZWwpXG5cbiAgICAgICAgY29uc3QgZCA9IHRoaXMuZGl2LmFwcGVuZCgnZGl2JylcbiAgICAgICAgLy90byBlbmFibGUgdmVydGljYWwgY2VudGVyaW5nXG4gICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKVxuXG4gICAgICAgIC8vZGVmYXVsdCBzdmcgY29uc3RydWN0aW9uLCBmb3Igc3F1YXJlIGFuZCBjaXJjbGVcbiAgICAgICAgY29uc3Qgc3ZnID0gKCkgPT4gZFxuICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHNpemVQaXggKyB0aGlzLnN0cm9rZVdpZHRoICsgMilcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBzaXplUGl4ICsgdGhpcy5zdHJva2VXaWR0aCArIDIpXG4gICAgICAgICAgICAuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxuXG4gICAgICAgIGlmICh0aGlzLnNoYXBlID09PSAnc3F1YXJlJykge1xuICAgICAgICAgICAgc3ZnKCkuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHNpemVQaXgpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHNpemVQaXgpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnY2lyY2xlJykge1xuICAgICAgICAgICAgLy8gPGNpcmNsZSBjeD1cIjUwXCIgY3k9XCI1MFwiIHI9XCI0MFwiIHN0cm9rZT1cImJsYWNrXCIgc3Ryb2tlLXdpZHRoPVwiM1wiIGZpbGw9XCJyZWRcIiAvPlxuICAgICAgICAgICAgY29uc3QgciA9IChzaXplUGl4ICsgdGhpcy5zdHJva2VXaWR0aCkgKiAwLjVcbiAgICAgICAgICAgIHN2ZygpLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgICAgICAgICAuYXR0cignY3gnLCByICsgMSlcbiAgICAgICAgICAgICAgICAuYXR0cignY3knLCByICsgMSlcbiAgICAgICAgICAgICAgICAuYXR0cigncicsIHIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnZG9udXQnKSB7XG4gICAgICAgICAgICAvL1RPRE9cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnZGlhbW9uZCcpIHtcbiAgICAgICAgICAgIC8vVE9ET1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdsaW5lJykge1xuXG4gICAgICAgICAgICAvL2dldCBzZWdtZW50IGxlbmd0aFxuICAgICAgICAgICAgbGV0IGxlbmd0aFBpeCA9IHRoaXMubGVuZ3RoID8gdGhpcy5sZW5ndGgob3B0cy5yZXNvbHV0aW9uLCBvcHRzLnosIG9wdHMudmlld1NjYWxlKSA6IG9wdHMucmVzb2x1dGlvblxuICAgICAgICAgICAgbGVuZ3RoUGl4IC89IG9wdHMuelxuXG4gICAgICAgICAgICBjb25zdCBzdmcgPSBkLmFwcGVuZCgnc3ZnJykuYXR0cignd2lkdGgnLCBsZW5ndGhQaXgpLmF0dHIoJ2hlaWdodCcsIHNpemVQaXgpLnN0eWxlKCcnLCAnaW5saW5lLWJsb2NrJylcblxuICAgICAgICAgICAgLy9UT0RPIG9yaWVudGF0aW9uXG4gICAgICAgICAgICAvLzxsaW5lIHgxPVwiMFwiIHkxPVwiMFwiIHgyPVwiMjAwXCIgeTI9XCIyMDBcIiBzdHlsZT1cInN0cm9rZTpyZ2IoMjU1LDAsMCk7c3Ryb2tlLXdpZHRoOjJcIiAvPlxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gxJywgMClcbiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCBzaXplUGl4IC8gMilcbiAgICAgICAgICAgICAgICAuYXR0cigneDInLCBsZW5ndGhQaXgpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgc2l6ZVBpeCAvIDIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLmNvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgc2l6ZVBpeClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgdGhpcy5zaGFwZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcbiAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcbiAgICAgICAgICAgIC50ZXh0KGxhYmVsICsgKHRoaXMubGFiZWxVbml0VGV4dCA/ICcgJyA6ICcnKSArIHRoaXMubGFiZWxVbml0VGV4dClcbiAgICB9XG59XG5cblxuXG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gdmFsdWVzIFxuICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn0gc2l6ZSBcbiAqIEBwYXJhbSB7IG9iamVjdCB9IG9wdHMgXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZUxlZ2VuZCh2YWx1ZXMsIHNpemUsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICBvcHRzLnRpdGxlID0gdmFsdWUgPT0gdmFsdWVzWzBdID8gb3B0cy50aXRsZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgb3B0cy5zaXplID0gKCkgPT4gc2l6ZSh2YWx1ZSlcbiAgICAgICAgb3B0cy5sYWJlbCA9ICgpID0+IHZhbHVlXG4gICAgICAgIGxlZ2VuZHMucHVzaChuZXcgU2l6ZUxlZ2VuZChvcHRzKSlcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZHNcbn1cblxuLyoqXG4gKiBAcGFyYW0geyBmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpOm51bWJlciB9IHZhbHVlIFxuICogQHBhcmFtIHsqfSBvcHRzIFxuICogQHJldHVybnMge0FycmF5LjxTaXplTGVnZW5kPn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpemVMZWdlbmRWaWV3U2NhbGUodmFsdWUsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGsgPSBvcHRzLmsgfHwgWzAuOSwgMC41LCAwLjIsIDAuMDVdXG4gICAgY29uc3QgbGVnZW5kcyA9IFtdXG4gICAgZm9yIChsZXQga18gb2Ygaykge1xuICAgICAgICBvcHRzLnRpdGxlID0ga18gPT0ga1swXSA/IG9wdHMudGl0bGUgOiB1bmRlZmluZWRcbiAgICAgICAgb3B0cy5sYWJlbCA9ICh2aWV3U2NhbGUsIGNlbGxzKSA9PiBuaWNlKGtfICogbWF4KGNlbGxzLCB2YWx1ZSkpXG4gICAgICAgIGxlZ2VuZHMucHVzaChuZXcgU2l6ZUxlZ2VuZChvcHRzKSlcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZHNcbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHdoaWNoIHJldHVybiBhIHN0YWNrIG9mIHNpemUgbGVnZW5kcyBmb3IgYSBkaXNjcmV0ZSBjbGFzc2lmaWNhdGlvbi5cbiAqIFxuICogQHBhcmFtIHsgQXJyYXkuPG51bWJlcj4gfSBicmVha3MgXG4gKiBAcGFyYW0geyBBcnJheS48bnVtYmVyPiB9IHNpemVzIFxuICogQHBhcmFtIHsgb2JqZWN0IH0gb3B0cyBcbiAqIEByZXR1cm5zIHtBcnJheS48U2l6ZUxlZ2VuZD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaXplRGlzY3JldGVMZWdlbmQoYnJlYWtzLCBzaXplcywgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgZiA9IG9wdHMubGFiZWxGb3JtYXQgfHwgKHggPT4geClcbiAgICBjb25zdCBsYWJlbFRleHQgPSBvcHRzLmxhYmVsVGV4dCB8fCBkZWZhdWx0TGFiZWxUZXh0KGYpXG4gICAgY29uc3QgbGVnZW5kcyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IHNpemVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSBpID09IHNpemVzLmxlbmd0aCAtIDEgPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkXG4gICAgICAgIG9wdHMuc2l6ZSA9ICgpID0+IHNpemVzW2ldXG4gICAgICAgIG9wdHMubGFiZWwgPSAoKSA9PiBsYWJlbFRleHQoYnJlYWtzW2kgLSAxXSwgYnJlYWtzW2ldKVxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRzXG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB3aGljaCByZXR1cm4gYSBzdGFjayBvZiBzaXplIGxlZ2VuZHMgZm9yIGEgZGlzY3JldGUgY2xhc3NpZmljYXRpb24gdXNpbmcgYSB2aWV3c2NhbGUuXG4gKiBAcGFyYW0geyBudW1iZXIgfSBjbGFzc051bWJlciBcbiAqIEBwYXJhbSB7IG9iamVjdCB9IG9wdHMgXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZURpc2NyZXRlVmlld1NjYWxlTGVnZW5kKGNsYXNzTnVtYmVyLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBmID0gb3B0cy5sYWJlbEZvcm1hdCB8fCAoeCA9PiB4KVxuICAgIGNvbnN0IGxhYmVsVGV4dCA9IG9wdHMubGFiZWxUZXh0IHx8IGRlZmF1bHRMYWJlbFRleHQoZilcbiAgICBjb25zdCBsZWdlbmRzID0gW11cbiAgICBjb25zdCB2aWV3U2NhbGVGdW4gPSBvcHRzLnZpZXdTY2FsZUZ1biB8fCAodCA9PiB0KSAvL1RPRE8gZG8gaXQgZGlmZmVyZW50bHk/IEF0IHNpemVsZWdlbmQgbGV2ZWwgIVxuICAgIGZvciAobGV0IGkgPSBjbGFzc051bWJlciAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSBpID09IGNsYXNzTnVtYmVyIC0gMSA/IG9wdHMudGl0bGUgOiB1bmRlZmluZWRcbiAgICAgICAgb3B0cy5zaXplID0gKHZpZXdTY2FsZSkgPT4gdmlld1NjYWxlRnVuKHZpZXdTY2FsZSkudmFsdWVzW2ldXG4gICAgICAgIG9wdHMubGFiZWwgPSAodmlld1NjYWxlKSA9PiBsYWJlbFRleHQodmlld1NjYWxlRnVuKHZpZXdTY2FsZSkuYnJlYWtzW2kgLSAxXSwgdmlld1NjYWxlRnVuKHZpZXdTY2FsZSkuYnJlYWtzW2ldKVxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRzXG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBmdW5jdGlvbiB0byBmb3JtYXQgbGFiZXJscyBmb3IgZGlzY3JldGUgc2NhbGUgbGVnZW5kcy5cbiAqIEBwYXJhbSB7IGZ1bmN0aW9uKG51bWJlcik6c3RyaW5nIH0gZm9ybWF0IFxuICogQHJldHVybnMgeyBmdW5jdGlvbihudW1iZXJ8dW5kZWZpbmVkLCBudW1iZXJ8dW5kZWZpbmVkKTogc3RyaW5nIH1cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdExhYmVsVGV4dChmb3JtYXQpIHtcbiAgICByZXR1cm4gKHYwLCB2MSkgPT4ge1xuICAgICAgICBpZiAodjAgPT0gdW5kZWZpbmVkICYmIHYxID09IHVuZGVmaW5lZCkgcmV0dXJuIFwiXCJcbiAgICAgICAgaWYgKHYxID09IHVuZGVmaW5lZCkgcmV0dXJuIFwiPiBcIiArIGZvcm1hdCh2MClcbiAgICAgICAgaWYgKHYwID09IHVuZGVmaW5lZCkgcmV0dXJuIFwiPCBcIiArIGZvcm1hdCh2MSlcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh2MCkgKyBcIiAtIFwiICsgZm9ybWF0KHYxKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXG5cbi8qKlxuICpcbiAqIEBtb2R1bGUgbGVnZW5kXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBUcml2YXJpYXRlTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy9jbGFzc2lmaWVyXG4gICAgICAgIHRoaXMuY2xhc3NpZmllciA9IG9wdHMuY2xhc3NpZmllclxuXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8IDE1MFxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbG9yID0gdGhpcy5zZWxlY3Rpb25Db2xvciB8fCBcInJlZFwiXG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG9wdHMudG9vbHRpcFxuICAgICAgICB0aGlzLnRleHRzID0gb3B0cy50ZXh0c1xuXG4gICAgICAgIHRoaXMubGVmdFRleHQgPSBvcHRzLmxlZnRUZXh0IHx8IFwiQ2F0ZWdvcnkgMFwiXG4gICAgICAgIHRoaXMudG9wVGV4dCA9IG9wdHMudG9wVGV4dCB8fCBcIkNhdGVnb3J5IDFcIlxuICAgICAgICB0aGlzLnJpZ2h0VGV4dCA9IG9wdHMucmlnaHRUZXh0IHx8IFwiQ2F0ZWdvcnkgMlwiXG5cbiAgICAgICAgdGhpcy5jZW50ZXJDb2VmZmljaWVudCA9IG9wdHMuY2VudGVyQ29lZmZpY2llbnQgfHwgdGhpcy5jbGFzc2lmaWVyLmNlbnRlckNvZWZmaWNpZW50XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7fSB9IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICBjb25zdCBzcXJ0M292ZXIyID0gMC44NjYwMjVcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGgsIGggPSB3ICogc3FydDNvdmVyMlxuICAgICAgICBjb25zdCBjbGFzc2lmaWVyID0gdGhpcy5jbGFzc2lmaWVyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbG9yID0gdGhpcy5zZWxlY3Rpb25Db2xvclxuICAgICAgICBjb25zdCBzZWxlY3Rpb25TdHJva2VXaWR0aCA9IDBcbiAgICAgICAgY29uc3QgdHQgPSB0aGlzLnRvb2x0aXBcbiAgICAgICAgY29uc3QgdGV4dHMgPSB0aGlzLnRleHRzIHx8IHt9XG5cbiAgICAgICAgY29uc3QgcGFkZGluZyA9IDJcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSAxMlxuXG4gICAgICAgIC8vbWFrZSBzdmcgZWxlbWVudFxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdlxuICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcgKyBzZWxlY3Rpb25TdHJva2VXaWR0aClcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoICsgNCAqIHBhZGRpbmcgKyAyICogZm9udFNpemUpXG5cbiAgICAgICAgLy90b3AgbGFiZWxcbiAgICAgICAgc3ZnLmFwcGVuZChcInRleHRcIikuYXR0cihcInhcIiwgdyAvIDIpLmF0dHIoXCJ5XCIsIHBhZGRpbmcgKyBmb250U2l6ZSkudGV4dCh0aGlzLnRvcFRleHQpLmF0dHIoXCJmb250LXNpemVcIiwgZm9udFNpemUpXG4gICAgICAgICAgICAuYXR0cihcInRleHQtYW5jaG9yXCIsIFwibWlkZGxlXCIpXG4gICAgICAgIC8vbGVmdCBsYWJlbFxuICAgICAgICBzdmcuYXBwZW5kKFwidGV4dFwiKS5hdHRyKFwieFwiLCAwKS5hdHRyKFwieVwiLCAzICogcGFkZGluZyArIDIgKiBmb250U2l6ZSArIGgpLnRleHQodGhpcy5sZWZ0VGV4dCkuYXR0cihcImZvbnQtc2l6ZVwiLCBmb250U2l6ZSlcbiAgICAgICAgICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgXCJzdGFydFwiKVxuICAgICAgICAvL3JpZ2h0IGxhYmVsXG4gICAgICAgIHN2Zy5hcHBlbmQoXCJ0ZXh0XCIpLmF0dHIoXCJ4XCIsIHcpLmF0dHIoXCJ5XCIsIDMgKiBwYWRkaW5nICsgMiAqIGZvbnRTaXplICsgaCkudGV4dCh0aGlzLnJpZ2h0VGV4dCkuYXR0cihcImZvbnQtc2l6ZVwiLCBmb250U2l6ZSlcbiAgICAgICAgICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgXCJlbmRcIilcblxuXG5cbiAgICAgICAgLy90cmlhbmdsZSBncm91cFxuICAgICAgICBjb25zdCBnID0gc3ZnLmFwcGVuZChcImdcIikuYXR0cihcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZShcIiArIChzZWxlY3Rpb25TdHJva2VXaWR0aCAvIDIpICsgXCIgXCIgKyAoc2VsZWN0aW9uU3Ryb2tlV2lkdGggLyAyICsgKDIgKiBwYWRkaW5nICsgZm9udFNpemUpKSArIFwiKVwiKVxuXG4gICAgICAgIC8vY29tbW9uIGZ1bmN0aW9uIGZvciB0cmlhbmdsZSBwYXRjaGVzXG4gICAgICAgIGNvbnN0IHNldEF0dHJpYnV0ZXMgPSAoZWx0LCBjb2xvciwgdGV4dCkgPT4ge1xuICAgICAgICAgICAgLy9lbHQucmFpc2UoKTtcbiAgICAgICAgICAgIGVsdC5hdHRyKCdmaWxsJywgY29sb3IpXG4gICAgICAgICAgICAgICAgLy8uYXR0cihcInN0cm9rZVwiLCBjb2xvck92ZXIpXG4gICAgICAgICAgICAgICAgLy8uYXR0cihcInN0cm9rZS13aWR0aFwiLCAwKVxuICAgICAgICAgICAgICAgIC8vLmF0dHIoXCJzdHJva2UtbGluZWpvaW5cIiwgXCJyb3VuZFwiKVxuICAgICAgICAgICAgICAgIC5vbihcIm1vdXNlb3ZlclwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvKnRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTsgc2VsZWN0KHRoaXMpLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgc2VsZWN0aW9uU3Ryb2tlV2lkdGgpOyovXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdCh0aGlzKS5hdHRyKCdmaWxsJywgc2VsZWN0aW9uQ29sb3IpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXR0IHx8ICF0ZXh0KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHR0Lmh0bWwodGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIHR0LnNldFBvc2l0aW9uKGUpO1xuICAgICAgICAgICAgICAgICAgICB0dC5zaG93KClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5vbihcIm1vdXNlb3V0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLypzZWxlY3QodGhpcykuYXR0cihcInN0cm9rZS13aWR0aFwiLCAwKTsqL1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3QodGhpcykuYXR0cignZmlsbCcsIGNvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR0KSB0dC5oaWRlKClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYgKHR0ICYmIHRleHQpIGVsdC5vbihcIm1vdXNlbW92ZVwiLCBmdW5jdGlvbiAoZSkgeyB0dC5zZXRQb3NpdGlvbihlKSB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb25zdCBbYzAsIGMxLCBjMl0gPSBjbGFzc2lmaWVyLmNlbnRlclxuXG4gICAgICAgIC8vdHJhcGV6aXVtIHMwXG4gICAgICAgIGNvbnN0IHQwID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIFwiMCxcIiArIGggKyBcIiBcIiArIHcgLyAzICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3IC8gMiArIFwiLFwiICsgaCAqIDIgLyAzICsgXCIgXCIgKyB3IC8gNiArIFwiLFwiICsgaCAqIDIgLyAzKVxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQwLCBjbGFzc2lmaWVyLmNvbG9yc1swXSwgdGV4dHNbXCIwXCJdKVxuICAgICAgICAvL3RyYXBleml1bSBzMVxuICAgICAgICBjb25zdCB0MSA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCB3IC8gMiArIFwiLDAgXCIgKyB3ICogMiAvIDMgKyBcIixcIiArIGggLyAzICsgXCIgXCIgKyB3IC8gMiArIFwiLFwiICsgaCAqIDIgLyAzICsgXCIgXCIgKyB3IC8gMyArIFwiLFwiICsgaCAvIDMpXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDEsIGNsYXNzaWZpZXIuY29sb3JzWzFdLCB0ZXh0c1tcIjFcIl0pXG4gICAgICAgIC8vdHJhcGV6aXVtIHMyXG4gICAgICAgIGNvbnN0IHQyID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKiA1IC8gNiArIFwiLFwiICsgMiAqIGggLyAzICsgXCIgXCIgKyB3IC8gMiArIFwiLFwiICsgaCAqIDIgLyAzICsgXCIgXCIgKyB3ICogMiAvIDMgKyBcIixcIiArIGgpXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDIsIGNsYXNzaWZpZXIuY29sb3JzWzJdLCB0ZXh0c1tcIjJcIl0pXG4gICAgICAgIC8vdHJpYW5nbGUgczBcbiAgICAgICAgY29uc3QgdDBfID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgLyAyICsgXCIsXCIgKyBoICogMiAvIDMgKyBcIiBcIiArIHcgKiA1IC8gNiArIFwiLFwiICsgaCAqIDIgLyAzICsgXCIgXCIgKyB3ICogMiAvIDMgKyBcIixcIiArIGggLyAzKVxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQwXywgY2xhc3NpZmllci5taXhDb2xvcnNbMF0sIHRleHRzW1wiMTJcIl0pXG4gICAgICAgIC8vdHJpYW5nbGUgczFcbiAgICAgICAgY29uc3QgdDFfID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgLyAyICsgXCIsXCIgKyBoICogMiAvIDMgKyBcIiBcIiArIHcgLyAzICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICogMiAvIDMgKyBcIixcIiArIGgpXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDFfLCBjbGFzc2lmaWVyLm1peENvbG9yc1sxXSwgdGV4dHNbXCIwMlwiXSlcbiAgICAgICAgLy90cmlhbmdsZSBzMlxuICAgICAgICBjb25zdCB0Ml8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyAvIDIgKyBcIixcIiArIGggKiAyIC8gMyArIFwiIFwiICsgdyAvIDYgKyBcIixcIiArIGggKiAyIC8gMyArIFwiIFwiICsgdyAvIDMgKyBcIixcIiArIGggLyAzKVxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQyXywgY2xhc3NpZmllci5taXhDb2xvcnNbMl0sIHRleHRzW1wiMDFcIl0pXG5cbiAgICAgICAgLy9jZW50ZXJcbiAgICAgICAgaWYgKHRoaXMuY2VudGVyQ29lZmZpY2llbnQpIHtcbiAgICAgICAgICAgIC8vVE9ETyBtYWtlIGl0IGFuIGhleGFnb24gIVxuICAgICAgICAgICAgY29uc3QgY2VudGVyID0gZy5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2N4JywgdyAvIDIpLmF0dHIoJ2N5JywgaCAqIDIgLyAzKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgdGhpcy5jZW50ZXJDb2VmZmljaWVudCAqIGggLyAzKVxuICAgICAgICAgICAgc2V0QXR0cmlidXRlcyhjZW50ZXIsIGNsYXNzaWZpZXIuY2VudGVyQ29sb3IsIHRleHRzW1wiY2VudGVyXCJdKVxuICAgICAgICB9XG5cblxuICAgICAgICAvKlxuICAgICAgICBsZXQgbWlkZGxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBsZWZ0XywgYm90dG9tXywgcmlnaHRfXG4gICAgICAgIGlmICghdGhpcy5yZWFsKSB7XG5cbiAgICAgICAgICAgIC8vMCBsZWZ0IHRyaWFuZ2xlXG4gICAgICAgICAgICBsZWZ0ID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCBcIjAsXCIgKyBoICsgXCIgXCIgKyAodyAvIDMpICsgXCIsXCIgKyBoICsgXCIgXCIgKyAodyAvIDYpICsgXCIsXCIgKyAoMiAqIGggLyAzKSlcbiAgICAgICAgICAgIC8vMSB0b3AgdHJpYW5nbGVcbiAgICAgICAgICAgIHRvcCA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAzKSArIFwiLFwiICsgKGggLyAzKSArIFwiIFwiICsgKHcgKiAyIC8gMykgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3IC8gMikgKyBcIiwwXCIpXG4gICAgICAgICAgICAvLzIgcmlnaHQgdHJpYW5nbGVcbiAgICAgICAgICAgIHJpZ2h0ID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAqIDIgLyAzKSArIFwiLFwiICsgaCArIFwiIFwiICsgdyArIFwiLFwiICsgaCArIFwiIFwiICsgKHcgKiA1IC8gNikgKyBcIixcIiArICgyICogaCAvIDMpKVxuICAgICAgICAgICAgLy9taWRkbGUgdHJpYW5nbGVcbiAgICAgICAgICAgIG1pZGRsZSA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAyKSArIFwiLFwiICsgKGggLyAzKSArIFwiIFwiICsgKHcgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikgKyBcIiBcIiArICgzICogdyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSlcbiAgICAgICAgICAgIC8vMDEgbGVmdCB0cmFwZXppdW1cbiAgICAgICAgICAgIGxlZnRfID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDYpICsgXCIsXCIgKyAoaCAqIDIgLyAzKSArIFwiIFwiICsgKHcgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikgKyBcIiBcIiArICh3IC8gMikgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3IC8gMykgKyBcIixcIiArIChoIC8gMykpXG4gICAgICAgICAgICAvLzAyIGJvdHRvbSB0cmFwZXppdW1cbiAgICAgICAgICAgIGJvdHRvbV8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMykgKyBcIixcIiArIChoKSArIFwiIFwiICsgKDIgKiB3IC8gMykgKyBcIixcIiArIChoKSArIFwiIFwiICsgKHcgKiAzIC8gNCkgKyBcIixcIiArIChoICogNSAvIDYpICsgXCIgXCIgKyAodyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSlcbiAgICAgICAgICAgIC8vMTIgcmlnaHQgdHJhcGV6aXVtXG4gICAgICAgICAgICByaWdodF8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMikgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3ICogMyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSArIFwiIFwiICsgKHcgKiA1IC8gNikgKyBcIixcIiArIChoICogMiAvIDMpICsgXCIgXCIgKyAodyAqIDIgLyAzKSArIFwiLFwiICsgKGggLyAzKSlcblxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAvL21pZGRsZSB0cmlhbmdsZVxuICAgICAgICAgICAgbWlkZGxlID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDIpICsgXCIsMCAwLFwiICsgaCArIFwiIFwiICsgdyArIFwiLFwiICsgaClcblxuICAgICAgICAgICAgLy9kcmF3IHRyYXBleml1bVxuICAgICAgICAgICAgLy9kcmF3IGxhcmdlIHRyYXBleml1bSBmaXJzdFxuICAgICAgICAgICAgZm9yIChsZXQgaV8gPSAyOyBpXyA+PSAwOyBpXy0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuY2xhc3NpZmllci5sb3dJbmRleFtpX11cbiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5jbGFzc2lmaWVyLmxvd1RocmVzaG9sZFtpXVxuICAgICAgICAgICAgICAgIGlmIChpID09IDIpXG4gICAgICAgICAgICAgICAgICAgIC8vMDEgbGVmdCB0cmFwZXppdW1cbiAgICAgICAgICAgICAgICAgICAgbGVmdF8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyAvIDIgKyBcIiwwIDAsXCIgKyBoICsgXCIgXCIgKyB3ICogciArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxICsgcikgLyAyICsgXCIsXCIgKyByICogaClcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vMDIgYm90dG9tIHRyYXBleml1bVxuICAgICAgICAgICAgICAgICAgICBib3R0b21fID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIFwiMCxcIiArIGggKyBcIiBcIiArIHcgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKiAoMSAtIHIgLyAyKSArIFwiLFwiICsgaCAqICgxIC0gcikgKyBcIiBcIiArIHIgKiB3IC8gMiArIFwiLFwiICsgaCAqICgxIC0gcikpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAvLzEyIHJpZ2h0IHRyYXBleml1bVxuICAgICAgICAgICAgICAgICAgICByaWdodF8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyArIFwiLFwiICsgaCArIFwiIFwiICsgdyAvIDIgKyBcIiwwIFwiICsgdyAqICgxIC0gcikgLyAyICsgXCIsXCIgKyBoICogciArIFwiIFwiICsgdyAqICgxIC0gcikgKyBcIixcIiArIGgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZHJhdyB0cmlhbmdsZXNcbiAgICAgICAgICAgIC8vZHJhdyBsYXJnZSB0cmlhbmdsZXMgZmlyc3RcbiAgICAgICAgICAgIGZvciAobGV0IGlfID0gMjsgaV8gPj0gMDsgaV8tLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmNsYXNzaWZpZXIuaGlnaEluZGV4W2lfXVxuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmNsYXNzaWZpZXIuaGlnaFRocmVzaG9sZFtpXVxuXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gMilcbiAgICAgICAgICAgICAgICAgICAgLy8yIHJpZ2h0IHRyaWFuZ2xlXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKiByICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICogKDEgKyByKSAvIDIgKyBcIixcIiArIGggKiByKVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgLy8xIHRvcCB0cmlhbmdsZVxuICAgICAgICAgICAgICAgICAgICB0b3AgPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAyKSArIFwiLDAgXCIgKyB3ICogciAvIDIgKyBcIixcIiArIGggKiAoMSAtIHIpICsgXCIgXCIgKyB3ICogKDEgLSByIC8gMikgKyBcIixcIiArIGggKiAoMSAtIHIpKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgLy8wIGxlZnQgdHJpYW5nbGVcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCBcIjAsXCIgKyBoICsgXCIgXCIgKyB3ICogKDEgLSByKSArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxIC0gcikgLyAyICsgXCIsXCIgKyBoICogcilcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9Ki9cblxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge1wiZmxhZ1wifFwicGllY2hhcnRcInxcInJpbmdcInxcInNlZ21lbnRcInxcInJhZGFyXCJ8XCJhZ2VweXJhbWlkXCJ8XCJoYWxmdG9uZVwifSBDb21wb3NpdGlvblR5cGUgKi9cblxuLyoqXG4gKiBBIHN0eWxlIHNob3dpbmcgdGhlIGNvbXBvc2l0aW9uIG9mIGEgdG90YWwgaW4gZGlmZmVyZW50IGNhdGVnb3JpZXMsIHdpdGggZGlmZmVyZW50IGNvbG9yIGh1ZXMuXG4gKiBJdCBjb25zaXN0cyBvZiBhIHN5bWJvbCB3aXRoIGRpZmZlcmVudCBwYXJ0cywgd2hvc2Ugc2l6ZSByZWZsZWN0IHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhdGVnb3J5LlxuICogRm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgc3ltYm9scywgQHNlZSBDb21wb3NpdGlvblR5cGVcbiAqIFRoZSBzeW1ib2wgY2FuIGJlIHNjYWxlZCBkZXBlbmRpbmcgb24gdGhlIGNlbGwgaW1wb3J0YW5jZS5cbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGlvblN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpY3Rpb25hcnkgKHN0cmluZyAtPiBjb2xvcikgd2hpY2ggZ2l2ZSB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeS5cbiAgICAgICAgICogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3JcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHR5cGUgb2YgZGVjb21wb3NpdGlvbiBzeW1ib2wgb2YgYSBjZWxsLCBAc2VlIENvbXBvc2l0aW9uVHlwZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLCBudW1iZXIsb2JqZWN0KTpDb21wb3NpdGlvblR5cGV9ICovXG4gICAgICAgIHRoaXMudHlwZSA9IG9wdHMudHlwZSB8fCAoKCkgPT4gXCJmbGFnXCIpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiBhIGNlbGwgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoYywgcikgPT4gcikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEZvciBzdHlsZSB0eXBlcyB3aXRoIHN0cmlwZXMgKGZsYWcsIHNlZ21lbnQpLCB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHN0cmlwZXMgKDAgZm9yIGhvcml6b250YWwsIG90aGVyIGZvciB2ZXJ0aWNhbCkuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnN0cmlwZXNPcmllbnRhdGlvbiA9IG9wdHMuc3RyaXBlc09yaWVudGF0aW9uIHx8ICgoKSA9PiAwKSAvLyhjLHIseix2cykgPT4gLi4uXG5cbiAgICAgICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGFuIG9mZnNldCBhbmdsZSBmb3IgYSByYWRhciwgaGFsZnRvbmUgb3IgcGllIGNoYXJ0IHN0eWxlLlxuICAgICAgICAgKiBUaGUgYW5nbGUgaXMgc3BlY2lmaWVkIGluIGRlZ3JlZS4gVGhlIHJvdGF0aW9uIGlzIGFudGktY2xvY2t3aXNlLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vZmZzZXRBbmdsZSA9IG9wdHMub2Zmc2V0QW5nbGUgfHwgKCgpID0+IDApIC8vKGMscix6LHZzKSA9PiAuLi5cblxuICAgICAgICAvKiogVGhlIGZ1bmN0aW9uIHNwZWNpZnlpbmcgdGhlIGhlaWdodCBvZiB0aGUgYWdlIHB5cmFtaWQsIGluIGdlbyB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5hZ2VQeXJhbWlkSGVpZ2h0ID0gb3B0cy5hZ2VQeXJhbWlkSGVpZ2h0IHx8ICgoYywgcikgPT4gcikgLy8oYyxyLHosdnMpID0+IC4uLlxuXG4gICAgICAgIC8qKiBGb3IgcGllIGNoYXJ0LCB0aGlzIGlzIHBhcmFtZXRlciBmb3IgaW50ZXJuYWwgcmFkaXVzLCBzbyB0aGF0IHRoZSBwaWUgY2hhcnQgbG9va3MgbGlrZSBhIGRvbnV0LlxuICAgICAgICAgKiAwIGZvciBub3JtYWwgcGllIGNoYXJ0cywgMC41IHRvIGVtcHR5IGhhbGYgb2YgdGhlIHJhZGl1cy5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yID0gb3B0cy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yIHx8IDBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNxdWFyZXMgZGVwZW5kaW5nIG9uIHRoZWlyIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9uYiBjYXRlZ29yaWVzIC0gdXNlZCBmb3IgcmFkYXIgYW5kIGFnZXB5cmFtaWRcbiAgICAgICAgY29uc3QgbmJDYXQgPSBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKS5sZW5ndGhcblxuICAgICAgICAvL2RyYXcgY2FsbHNcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuXG4gICAgICAgICAgICAvL3NpemVcbiAgICAgICAgICAgIGNvbnN0IHNHID0gdGhpcy5zaXplID8gdGhpcy5zaXplKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiByZXNvbHV0aW9uXG4gICAgICAgICAgICBpZiAoIXNHKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIC8vZ2V0IHN5bWJvbCB0eXBlXG4gICAgICAgICAgICBjb25zdCB0eXBlXyA9IHRoaXMudHlwZSA/IHRoaXMudHlwZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogJ2ZsYWcnXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBjZW50ZXIgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IHhjID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgPyAwIDogcmVzb2x1dGlvbiAqIDAuNSlcbiAgICAgICAgICAgIGNvbnN0IHljID0gY2VsbC55ICsgb2Zmc2V0LmR5ICsgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgPyAwIDogcmVzb2x1dGlvbiAqIDAuNSlcblxuICAgICAgICAgICAgLy9jb21wdXRlIG9mZnNldCBhbmdsZSwgd2hlbiByZWxldmFudFxuICAgICAgICAgICAgY29uc3Qgb2ZmQW5nID0gdGhpcy5vZmZzZXRBbmdsZSA/ICh0aGlzLm9mZnNldEFuZ2xlKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgKiBNYXRoLlBJKSAvIDE4MCA6IDBcblxuICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgfHwgdHlwZV8gPT09ICdyYWRhcicgfHwgdHlwZV8gPT09ICdoYWxmdG9uZScpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBjZWxsIGNhdGVnb3J5IG1heCB2YWx1ZVxuICAgICAgICAgICAgICAgIGxldCBtYXhWYWwgPSAtSW5maW5pdHlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9ICtjZWxsW2tleV1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgPiBtYXhWYWwpIG1heFZhbCA9IHZcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2N1bXVsXG4gICAgICAgICAgICAgICAgbGV0IGN1bXVsID0gMFxuICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnICYmIHRoaXMuYWdlUHlyYW1pZEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgY3VtdWwgPSAocmVzb2x1dGlvbiAtIHRoaXMuYWdlUHlyYW1pZEhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpKSAvIDJcbiAgICAgICAgICAgICAgICBpZiAodHlwZV8gPT09ICdyYWRhcicgfHwgdHlwZV8gPT09ICdoYWxmdG9uZScpIGN1bXVsID0gTWF0aC5QSSAvIDIgKyBvZmZBbmdcblxuICAgICAgICAgICAgICAgIC8vY29tcHV0ZSB0aGUgaW5jcmVtZW50LCB3aGljaCBpcyB0aGUgdmFsdWUgdG8gaW5jcmVtZW50IHRoZSBjdW11bCBmb3IgZWFjaCBjYXRlZ29yeVxuICAgICAgICAgICAgICAgIGNvbnN0IGluY3IgPVxuICAgICAgICAgICAgICAgICAgICB0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICh0aGlzLmFnZVB5cmFtaWRIZWlnaHQgPyB0aGlzLmFnZVB5cmFtaWRIZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHJlc29sdXRpb24pIC8gbmJDYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZV8gPT09ICdyYWRhcicgfHwgdHlwZV8gPT09ICdoYWxmdG9uZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgyICogTWF0aC5QSSkgLyBuYkNhdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYgKGluY3IgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHN5bWJvbCB0eXBlOicgKyB0eXBlXylcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IFtjb2x1bW4sIGNvbG9yXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZV8gPT09ICdhZ2VweXJhbWlkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY2F0ZWdvcnkgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgY2F0ZWdvcnkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgY2F0ZWdvcnkgbGVuZ3RoIC0gaW4gZ2VvXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gKHNHICogdmFsKSAvIG1heFZhbFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxSZWN0KHhjICsgKHJlc29sdXRpb24gLSB3RykgLyAyLCB5YyArIGN1bXVsLCB3RywgaW5jcilcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGhlaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gaW5jclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAncmFkYXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBjYXRlZ29yeSBjb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xvclxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2dldCBjYXRlZ3JveSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY2VsbFtjb2x1bW5dXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBjYXRlZ29yeSByYWRpdXMgLSBpbiBnZW9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zdCByRyA9IHRoaXMucmFkaXVzKHZhbCwgciwgc3RhdCwgY2VsbFN0YXQsIHopXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByRyA9IChzRyAvIDIpICogTWF0aC5zcXJ0KHZhbCAvIG1heFZhbClcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGFuZ3VsYXIgc2VjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4YywgeWMpXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyh4YywgeWMsIHJHLCBjdW11bCAtIGluY3IsIGN1bXVsKVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGFuZ3VsYXIgc2VjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdoYWxmdG9uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNhdGVnb3J5IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNhdGVncm95IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjZWxsW2NvbHVtbl1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGNhdGVnb3J5IHJhZGl1cyAtIGluIGdlb1xuICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByRyA9IHNHICogMC4zMzMgKiBNYXRoLnNxcnQodmFsIC8gbWF4VmFsKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgY2lyY2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YyArIHJlc29sdXRpb24gKiAwLjI1ICogTWF0aC5jb3MoY3VtdWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljICsgcmVzb2x1dGlvbiAqIDAuMjUgKiBNYXRoLnNpbihjdW11bCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgckcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogTWF0aC5QSVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGFuZ3VsYXIgc2VjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sIHR5cGU6JyArIHR5cGVfKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2NvbXB1dGUgdG90YWxcbiAgICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uIG9mIE9iamVjdC5rZXlzKHRoaXMuY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSArY2VsbFtjb2x1bW5dXG4gICAgICAgICAgICAgICAgICAgIGlmICghdikgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRvdGFsIHx8IGlzTmFOKHRvdGFsKSkgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBkZWNvbXBvc2l0aW9uIHN5bWJvbFxuICAgICAgICAgICAgICAgIGxldCBjdW11bCA9IDBcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gcmVzb2x1dGlvbiAqICgxIC0gc0cgLyByZXNvbHV0aW9uKSAqIDAuNVxuICAgICAgICAgICAgICAgIGNvbnN0IG9yaSA9IHRoaXMuc3RyaXBlc09yaWVudGF0aW9uKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IFtjb2x1bW4sIGNvbG9yXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAvL2dldCBzaGFyZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZSA9IGNlbGxbY29sdW1uXSAvIHRvdGFsXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hhcmUgfHwgaXNOYU4oc2hhcmUpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAvL2RyYXcgc3ltYm9sIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnZmxhZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBmbGFnIHN0cmlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ob3Jpem9udGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsUmVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgZCArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgZCArIGN1bXVsICogc0cgKyBvZmZzZXQuZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHNHXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ZlcnRpY2FsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsUmVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgZCArIGN1bXVsICogc0cgKyBvZmZzZXQuZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueSArIGQgKyBvZmZzZXQuZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlICogc0csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAncGllY2hhcnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgcGllIGNoYXJ0IGFuZ3VsYXIgc2VjdG9yXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBhbmdsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGExID0gY3VtdWwgKiAyICogTWF0aC5QSVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYTIgPSAoY3VtdWwgKyBzaGFyZSkgKiAyICogTWF0aC5QSVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXdcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHhjLCB5YylcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKHhjLCB5Yywgc0cgKiAwLjUsIGExICsgb2ZmQW5nLCBhMiArIG9mZkFuZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5hcmMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0cgKiAwLjUgKiB0aGlzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGExICsgb2ZmQW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMiArIG9mZkFuZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguY2xvc2VQYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKHhjLCB5YywgTWF0aC5zcXJ0KDEgLSBjdW11bCkgKiBzRyAqIDAuNSwgMCwgMiAqIE1hdGguUEkpXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAnc2VnbWVudCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHNlY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3RyA9IChzRyAqIHNHKSAvIHJlc29sdXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgKHJlc29sdXRpb24gLSB3RykgLyAyICsgY3VtdWwgKiB3RyArIG9mZnNldC5keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiB3R1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92ZXJ0aWNhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGN1bXVsICogcmVzb2x1dGlvbiArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgKHJlc29sdXRpb24gLSB3RykgLyAyICsgb2Zmc2V0LmR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdHXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHN5bWJvbCB0eXBlOicgKyB0eXBlXylcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGN1bXVsICs9IHNoYXJlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcbmltcG9ydCB7IHJhbmRvbU5vcm1hbCB9IGZyb20gJ2QzLXJhbmRvbSdcbmltcG9ydCB7IGNoZWNrV2ViR0xTdXBwb3J0LCBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZyB9IGZyb20gJy4uL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmcuanMnXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xuXG4vKipcbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBEb3REZW5zaXR5U3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbnVtYmVyIG9mIGRvdHMgZm9yIGEgY2VsbCB2YWx1ZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmRvdE51bWJlciA9IG9wdHMuZG90TnVtYmVyIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbiAvIDEwMCkvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogVGhlIGNvbG9yIG9mIHRoZSBkb3RzLiBTYW1lIGNvbG9yIGZvciBhbGwgZG90cyB3aXRoaW4gYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0ZGNTczMycpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgZG90cywgaW4gZ2VvIHVuaXQuIFNhbWUgc2l6ZSBmb3IgYWxsIGNlbGxzLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLCBudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuZG90U2l6ZSA9IG9wdHMuZG90U2l6ZSB8fCAoKHJlc29sdXRpb24sIHopID0+IDEuNSAqIHopIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2lnbWEgb2YgdGhlIGRvdHMgZGlzdHJpYnV0aW9uLiBTYW1lIHZhbHVlIGZvciBhbGwgY2VsbHMuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsIG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaWdtYSA9IG9wdHMuc2lnbWEgfHwgKChyZXNvbHV0aW9uLCB6KSA9PiByZXNvbHV0aW9uIC8gMikvLyhjLHIseix2cykgPT4ge31cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2dldCBzaXplXG4gICAgICAgIGNvbnN0IHNHZW8gPSB0aGlzLmRvdFNpemUgPyB0aGlzLmRvdFNpemUocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHpcblxuICAgICAgICAvL21ha2UgcmFuZG9tIGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IHNpZyA9IHRoaXMuc2lnbWEgPyB0aGlzLnNpZ21hKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiByZXNvbHV0aW9uICogMC40XG4gICAgICAgIGNvbnN0IHJhbmQgPSByYW5kb21Ob3JtYWwoMCwgc2lnKVxuXG4gICAgICAgIGlmIChjaGVja1dlYkdMU3VwcG9ydCgpKSB7XG4gICAgICAgICAgICAvL2NyZWF0ZSBjYW52YXMgYW5kIHdlYmdsIHJlbmRlcmVyXG4gICAgICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhnZW9DYW52YXMudyArICcnLCBnZW9DYW52YXMuaCArICcnKVxuICAgICAgICAgICAgaWYgKCFjdldHTCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHdlYkdMJylcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9jcmVhdGUgd2ViR0wgcHJvZ3JhbVxuICAgICAgICAgICAgY29uc3QgcHJvZyA9IG5ldyBXZWJHTFNxdWFyZUNvbG9yaW5nKGN2V0dMLmdsLCBzR2VvIC8geilcblxuICAgICAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uIC8gMlxuXG4gICAgICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vbnVtYmVyIG9mIGRvdHNcbiAgICAgICAgICAgICAgICBjb25zdCBkb3ROdW1iZXIgPSB0aGlzLmRvdE51bWJlcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG5cbiAgICAgICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAgICAgLy9jZWxsIGNlbnRlclxuICAgICAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgcjJcbiAgICAgICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIG9mZnNldC5keSArIHIyXG5cbiAgICAgICAgICAgICAgICAvL2NvbnZlcnQgY29sb3JcbiAgICAgICAgICAgICAgICBjb25zdCBjYyA9IGNvbG9yKGNvbClcbiAgICAgICAgICAgICAgICBpZiAoIWNjKSByZXR1cm5cblxuICAgICAgICAgICAgICAgIC8vcmFuZG9tIHBvaW50c1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGRvdE51bWJlcjsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBwcm9nLmFkZFBvaW50RGF0YTIoY3ggKyByYW5kKCksIGN5ICsgcmFuZCgpLCBjYy5yLCBjYy5nLCBjYy5iLCBjYy5vcGFjaXR5KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2RyYXdcbiAgICAgICAgICAgIHByb2cuZHJhdyhnZW9DYW52YXMuZ2V0V2ViR0xUcmFuc2Zvcm0oKSlcblxuICAgICAgICAgICAgLy9kcmF3IGluIGNhbnZhcyBnZW9cbiAgICAgICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKGN2V0dMLmNhbnZhcywgMCwgMClcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuXG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgICAgICAvL251bWJlciBvZiBkb3RzXG4gICAgICAgICAgICAgICAgY29uc3QgZG90TnVtYmVyID0gdGhpcy5kb3ROdW1iZXIoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuXG4gICAgICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgICAgIC8vZHJhdyByYW5kb20gZG90c1xuICAgICAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAvIDIsXG4gICAgICAgICAgICAgICAgICAgIGN5ID0gY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBkb3ROdW1iZXI7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxSZWN0KGN4ICsgcmFuZCgpLCBjeSArIHJhbmQoKSwgc0dlbywgc0dlbylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEltYWdlU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG5cbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBpbWFnZSBjb2RlIG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmltYWdlQ29kZSA9IG9wdHMuaW1hZ2VDb2RlIHx8ICgoKSA9PiAnJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIFRoZSBkaWN0aW9ubmFyeSBjb2RlIC0+IGltYWdlXG4gICAgICAgICAqICBAdHlwZSB7b2JqZWN0fSAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbWFnZXMgPSBvcHRzLmltYWdlcyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2Ugc2l6ZSBpbiBncm91bmQgbWV0ZXJzXG4gICAgICAgICAqICBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICAgICAgICAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcueixcbiAgICAgICAgICAgIHJlc29sdXRpb25QaXggPSByZXNvbHV0aW9uIC8gelxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2RyYXcgaW4gc2NyZWVuIGNvb3JkaW5hdGVzXG4gICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICAvL1xuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG5cbiAgICAgICAgICAgIC8vZ2V0IGNlbGwgaW1hZ2UgY29kZVxuICAgICAgICAgICAgY29uc3QgY29kZSA9IHRoaXMuaW1hZ2VDb2RlKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcblxuICAgICAgICAgICAgLy9nZXQgaW1hZ2VcbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5pbWFnZXNbY29kZV1cbiAgICAgICAgICAgIGlmICghaW1hZ2UpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vc2l6ZSBhbmQgcG9zaXRpb24gdmFsdWVzXG4gICAgICAgICAgICBsZXQgc2l6ZVBpeCA9IHRoaXMuc2l6ZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIC8gelxuICAgICAgICAgICAgaWYgKCFzaXplUGl4KSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgZCA9IChyZXNvbHV0aW9uUGl4IC0gc2l6ZVBpeCkgLyAyXG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5kcmF3SW1hZ2UoaW1hZ2UsIGdlb0NhbnZhcy5nZW9Ub1BpeFgoY2VsbC54KSArIGQsIGdlb0NhbnZhcy5nZW9Ub1BpeFkoY2VsbC55KSArIGQgLXJlc29sdXRpb25QaXgsIHNpemVQaXgsIHNpemVQaXgpXG5cbiAgICAgICAgICAgICAgICAvKi9yZWQgY29sb3IgZmlsdGVyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLWluJztcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9ICdyZWQnO1xuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoZ2VvQ2FudmFzLmdlb1RvUGl4WChjZWxsLngpICsgZCwgZ2VvQ2FudmFzLmdlb1RvUGl4WShjZWxsLnkpICsgZCwgc2l6ZVBpeCwgc2l6ZVBpeCk7XG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInOyovXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcbmltcG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vU2lkZVN0eWxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge3t4Om51bWJlcix5Om51bWJlcixvcjpcInZcInxcImhcIixjMTppbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGx8dW5kZWZpbmVkLGMyOmltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbHx1bmRlZmluZWR9fSBTaWRlICovXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgSXNvRmVuY2VTdHlsZSBleHRlbmRzIFN0eWxlIHtcblxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpY3Rpb25hcnkgKHN0cmluZyAtPiBjb2xvcikgd2hpY2ggZ2l2ZSB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeS5cbiAgICAgICAgICogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3JcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCBvZiBhIGNlbGwgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAoKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gcmVzb2x1dGlvbiAqIDAuNClcblxuICAgICAgICAvKiogVGhlIHBlcnNwZWN0aXZlIGFuZ2xlLCBpbiBkZWdyZWUsIHdpdGhpbiBbLTE4MCwxODBdLCBmcm9tIFtPLHhdIGF4aXMuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuYW5nbGUgPSBvcHRzLmFuZ2xlICE9IHVuZGVmaW5lZCA/IG9wdHMuYW5nbGUgOiA1MFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29ybmVyIGxpbmUgc3Ryb2tlIHN0eWxlLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29ybmVyTGluZVN0cm9rZUNvbG9yID0gb3B0cy5jb3JuZXJMaW5lU3Ryb2tlQ29sb3IgfHwgKChjLCByLCB6LCBhbmdsZSkgPT4gXCIjOTk5XCIpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb3JuZXIgbGluZSB3aWR0aC5cbiAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuY29ybmVyTGluZVdpZHRoID0gb3B0cy5jb3JuZXJMaW5lV2lkdGggfHwgKChjLCByLCB6LCBhbmdsZSkgPT4gKGFuZ2xlICUgOTAgPT0gMCA/IDAgOiAwLjggKiB6KSlcblxuICAgICAgICAvKipcbiAgICAgICAgKiBTaG93IHZlcnRpY2FsIGNyb3NzLXNlY3Rpb25zLlxuICAgICAgICAqIEB0eXBlIHtib29sZWFufSAqL1xuICAgICAgICB0aGlzLnNWZXJ0ID0gb3B0cy5zVmVydCAhPSB1bmRlZmluZWQgPyBvcHRzLnNWZXJ0IDogdHJ1ZVxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFNob3cgaG9yaXpvbnRhbCBjcm9zcy1zZWN0aW9ucy5cbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5zSG9yID0gb3B0cy5zSG9yICE9IHVuZGVmaW5lZCA/IG9wdHMuc0hvciA6IHRydWVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL25iIGNhdGVnb3JpZXMgLSB1c2VkIGZvciByYWRhciBhbmQgYWdlcHlyYW1pZFxuICAgICAgICBjb25zdCBjYXRzID0gT2JqZWN0LmtleXModGhpcy5jb2xvcilcblxuICAgICAgICAvL2hhbGYgcmVzb2x1dGlvblxuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gLyAyXG5cbiAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQodW5kZWZpbmVkLCByZXNvbHV0aW9uLCB6KSwgZHggPSBvZmZzZXQuZHgsIGR5ID0gb2Zmc2V0LmR5XG5cbiAgICAgICAgLy9tYWtlIHNpZGVzXG4gICAgICAgIC8qKiAgQHR5cGUge0FycmF5LjxTaWRlPn0gKi9cbiAgICAgICAgY29uc3Qgc2lkZXMgPSBTaWRlU3R5bGUuYnVpbGRTaWRlcyhjZWxscywgcmVzb2x1dGlvbiwgdGhpcy5hbmdsZSAlIDE4MCAhPSA5MCAmJiB0aGlzLnNWZXJ0LCB0aGlzLmFuZ2xlICUgMTgwICE9IDAgJiYgdGhpcy5zSG9yKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChzaWRlcy5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgLy9hbmdsZSBpbiByYWRpYW5zXG4gICAgICAgIGNvbnN0IGFSYWQgPSB0aGlzLmFuZ2xlICogTWF0aC5QSSAvIDE4MCwgY29zID0gTWF0aC5jb3MoYVJhZCksIHNpbiA9IE1hdGguc2luKGFSYWQpXG5cbiAgICAgICAgLy9zb3J0IHNpZGVzIHNvIHRoYXQgdGhlIGJhY2sgb25lcyBhcmUgZHJhd24gZmlyc3QuIFRoaXMgZGVwZW5kcyBvbiB0aGUgYW5nbGUuXG4gICAgICAgIC8vZGVwZW5kaW5nIG9uIGRpc3RhbmNlIHRvIHRoZSByZWZlcmVuY2UgY29ybmVyIHBvaW50XG4gICAgICAgIGNvbnN0IHhDb3JuZXIgPSBNYXRoLmFicyh0aGlzLmFuZ2xlKSA8IDkwID8gZ2VvQ2FudmFzLmV4dEdlby54TWluIDogZ2VvQ2FudmFzLmV4dEdlby54TWF4XG4gICAgICAgIGNvbnN0IHlDb3JuZXIgPSB0aGlzLmFuZ2xlIDwgMCA/IGdlb0NhbnZhcy5leHRHZW8ueU1heCA6IGdlb0NhbnZhcy5leHRHZW8ueU1pblxuICAgICAgICBzaWRlcy5zb3J0KChzMSwgczIpID0+IChNYXRoLmh5cG90KHMyLnggLSB4Q29ybmVyLCBzMi55IC0geUNvcm5lcikgLSBNYXRoLmh5cG90KHMxLnggLSB4Q29ybmVyLCBzMS55IC0geUNvcm5lcikpKVxuXG4gICAgICAgIC8vcHJlcGFyZSBmdW5jdGlvbiB0byBkcmF3IGNvcm5lciBsaW5lIGZvciBhIGNlbGwgKmMqXG4gICAgICAgIGNvbnN0IGRyYXdDb3JuZXJMaW5lID0gKGNlbGwpID0+IHtcblxuICAgICAgICAgICAgaWYgKCFjZWxsKSByZXR1cm5cbiAgICAgICAgICAgIC8vbGluZSBzdHlsZVxuICAgICAgICAgICAgY29uc3QgbHcgPSB0aGlzLmNvcm5lckxpbmVXaWR0aCA/IHRoaXMuY29ybmVyTGluZVdpZHRoKGNlbGwsIHJlc29sdXRpb24sIHosIHRoaXMuYW5nbGUpIDogMC44ICogelxuICAgICAgICAgICAgaWYgKGx3ID09IDApIHJldHVyblxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29ybmVyTGluZVN0cm9rZUNvbG9yID8gdGhpcy5jb3JuZXJMaW5lU3Ryb2tlQ29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdGhpcy5hbmdsZSkgOiBcIiMzMzNcIlxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSBsd1xuXG4gICAgICAgICAgICAvL2hlaWdodCAtIGluIGdlb1xuICAgICAgICAgICAgY29uc3QgaEcgPSB0aGlzLmhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsaW5lXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjZWxsLnggKyByMiArIGR4LCBjZWxsLnkgKyByMiArIGR5KVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY2VsbC54ICsgcjIgKyBoRyAqIGNvcyArIGR4LCBjZWxsLnkgKyByMiArIGhHICogc2luICsgZHkpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvL2RyYXcgc2lkZXNcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lQ2FwID0gXCJyb3VuZFwiO1xuICAgICAgICBmb3IgKGxldCBzaWRlIG9mIHNpZGVzKSB7XG4gICAgICAgICAgICBjb25zdCBjMSA9IHNpZGUuYzEsIGMyID0gc2lkZS5jMiwgeCA9IHNpZGUueCwgeSA9IHNpZGUueVxuXG4gICAgICAgICAgICAvL2hlaWdodHMgLSBpbiBnZW9cbiAgICAgICAgICAgIGNvbnN0IGhHMSA9IGMxID8gdGhpcy5oZWlnaHQoYzEsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAwLFxuICAgICAgICAgICAgICAgIGhHMiA9IGMyID8gdGhpcy5oZWlnaHQoYzIsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAwXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSB0b3RhbHMgZm9yIGJvdGggY2VsbHNcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsMSA9IGNvbXB1dGVUb3RhbChjMSwgY2F0cyksXG4gICAgICAgICAgICAgICAgdG90YWwyID0gY29tcHV0ZVRvdGFsKGMyLCBjYXRzKVxuICAgICAgICAgICAgaWYgKHRvdGFsMSA9PSAwICYmIHRvdGFsMiA9PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICBsZXQgY3VtdWwxID0gMCwgY3VtdWwyID0gMFxuICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IHN0cmlwZSBvZiBzaWRlIHMgYW5kIGNhdGVnb3J5IGNvbHVtblxuXG4gICAgICAgICAgICAgICAgLy9nZXQgdmFsdWVzIGZvciBib3RoIGNlbGxzXG4gICAgICAgICAgICAgICAgbGV0IHYxID0gYzEgPyArYzFbY29sdW1uXSA6IDBcbiAgICAgICAgICAgICAgICBsZXQgdjIgPSBjMiA/ICtjMltjb2x1bW5dIDogMFxuICAgICAgICAgICAgICAgIGlmICh2MSA9PSAwICYmIHYyID09IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAvL2NvbXB1dGUgaGVpZ2h0c1xuICAgICAgICAgICAgICAgIGNvbnN0IGgxID0gaEcxICogY3VtdWwxIC8gdG90YWwxIHx8IDBcbiAgICAgICAgICAgICAgICBjb25zdCBoMW4gPSBoRzEgKiAoY3VtdWwxICsgdjEpIC8gdG90YWwxIHx8IDBcbiAgICAgICAgICAgICAgICBjb25zdCBoMiA9IGhHMiAqIGN1bXVsMiAvIHRvdGFsMiB8fCAwXG4gICAgICAgICAgICAgICAgY29uc3QgaDJuID0gaEcyICogKGN1bXVsMiArIHYyKSAvIHRvdGFsMiB8fCAwXG5cbiAgICAgICAgICAgICAgICAvL21ha2UgcGF0aFxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBpZiAoc2lkZS5vciA9PSBcImhcIikge1xuICAgICAgICAgICAgICAgICAgICAvL2hvcml6b250YWwgc2lkZSAtIHZlcnRpY2FsIHNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gbGVmdFxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4ICsgaDEgKiBjb3MgKyBkeCwgeSAtIHIyICsgaDEgKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy90b3AgbGVmdFxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyh4ICsgaDIgKiBjb3MgKyBkeCwgeSArIHIyICsgaDIgKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy90b3AgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIGgybiAqIGNvcyArIGR4LCB5ICsgcjIgKyBoMm4gKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIGgxbiAqIGNvcyArIGR4LCB5IC0gcjIgKyBoMW4gKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL3ZlcnRpY2FsIHNpZGUgLSBob3Jpem9udGFsIHNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gbGVmdFxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4IC0gcjIgKyBoMSAqIGNvcyArIGR4LCB5ICsgaDEgKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIHIyICsgaDIgKiBjb3MgKyBkeCwgeSArIGgyICogc2luICsgZHkpXG4gICAgICAgICAgICAgICAgICAgIC8vdG9wIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHggKyByMiArIGgybiAqIGNvcyArIGR4LCB5ICsgaDJuICogc2luICsgZHkpXG4gICAgICAgICAgICAgICAgICAgIC8vdG9wIGxlZnRcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCAtIHIyICsgaDFuICogY29zICsgZHgsIHkgKyBoMW4gKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9jZy5jdHguY2xvc2VQYXRoKClcblxuICAgICAgICAgICAgICAgIC8vZmlsbFxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sb3JcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxuXG4gICAgICAgICAgICAgICAgY3VtdWwxICs9IHYxXG4gICAgICAgICAgICAgICAgY3VtdWwyICs9IHYyXG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gZHJhdyBvbmx5IG9uZSBsaW5lXG4gICAgICAgICAgICAgICAgLy9kcmF3IGNvcm5lciBsaW5lXG4gICAgICAgICAgICAgICAgLy9pZiAoc2lkZS5vciA9PSBcImhcIikge1xuICAgICAgICAgICAgICAgIGRyYXdDb3JuZXJMaW5lKGMxKVxuICAgICAgICAgICAgICAgIGRyYXdDb3JuZXJMaW5lKGMyKVxuICAgICAgICAgICAgICAgIC8vaWYgKHRoaXMuYW5nbGUgPiAwICYmIHNpZGUub3IgPT0gXCJoXCIpIGRyYXdDb3JuZXJMaW5lKGMyKVxuICAgICAgICAgICAgICAgIC8vZWxzZSBkcmF3Q29ybmVyTGluZShjMilcbiAgICAgICAgICAgICAgICAvL31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuXG5cblxuY29uc3QgY29tcHV0ZVRvdGFsID0gKGNlbGwsIGNhdGVnb3JpZXMpID0+IHtcbiAgICBpZiAoIWNlbGwpIHJldHVybiAwXG4gICAgbGV0IHRvdGFsID0gMFxuICAgIGZvciAobGV0IGNvbHVtbiBvZiBjYXRlZ29yaWVzKSB7XG4gICAgICAgIGNvbnN0IHYgPSBjZWxsW2NvbHVtbl1cbiAgICAgICAgaWYgKCF2KSBjb250aW51ZVxuICAgICAgICB0b3RhbCArPSArdlxuICAgIH1cbiAgICByZXR1cm4gdG90YWwgfHwgMFxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgSm95UGxvdFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCBvZiBhIGNlbGwgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAoKGMsIHIpID0+IHIgKiBNYXRoLnJhbmRvbSgpKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmxpbmVDb2xvciA9IG9wdHMubGluZUNvbG9yIHx8ICgoeSwgeXMsIHIsIHopID0+ICcjQkJCJylcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIse21pbjpudW1iZXIsIG1heDpudW1iZXJ9LG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5saW5lV2lkdGggPSBvcHRzLmxpbmVXaWR0aCB8fCAoKHksIHlzLCByLCB6KSA9PiB6KVxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZpbGxDb2xvciA9IG9wdHMuZmlsbENvbG9yIHx8ICgoeSwgeXMsIHIsIHopID0+ICcjYzA4YzU5NjgnKVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9pbmRleCBjZWxscyBieSB5IGFuZCB4XG4gICAgICAgIC8qKiAgQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgY29uc3QgaW5kID0ge31cbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBsZXQgcm93ID0gaW5kW2NlbGwueV1cbiAgICAgICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICAgICAgcm93ID0ge31cbiAgICAgICAgICAgICAgICBpbmRbY2VsbC55XSA9IHJvd1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93W2NlbGwueF0gPSB0aGlzLmhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXB1dGUgZXh0ZW50XG4gICAgICAgIGNvbnN0IGUgPSBnZW9DYW52YXMuZXh0R2VvXG4gICAgICAgIGlmICghZSkgcmV0dXJuXG4gICAgICAgIGNvbnN0IHhNaW4gPSBNYXRoLmZsb29yKGUueE1pbiAvIHJlc29sdXRpb24pICogcmVzb2x1dGlvblxuICAgICAgICBjb25zdCB4TWF4ID0gTWF0aC5mbG9vcihlLnhNYXggLyByZXNvbHV0aW9uKSAqIHJlc29sdXRpb25cbiAgICAgICAgY29uc3QgeU1pbiA9IE1hdGguZmxvb3IoZS55TWluIC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXG4gICAgICAgIGNvbnN0IHlNYXggPSBNYXRoLmZsb29yKGUueU1heCAvIHJlc29sdXRpb24pICogcmVzb2x1dGlvblxuXG4gICAgICAgIC8qKiAgQHR5cGUge3ttaW46bnVtYmVyLCBtYXg6bnVtYmVyfX0gKi9cbiAgICAgICAgY29uc3QgeXMgPSB7IG1pbjogeU1pbiwgbWF4OiB5TWF4IH1cblxuICAgICAgICAvL2RyYXcgbGluZXMsIHJvdyBieSByb3csIHN0YXRpbmcgZnJvbSB0aGUgdG9wXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUpvaW4gPSAncm91bmQnXG4gICAgICAgIGZvciAobGV0IHkgPSB5TWF4OyB5ID49IHlNaW47IHkgLT0gcmVzb2x1dGlvbikge1xuICAgICAgICAgICAgLy9nZXQgcm93XG4gICAgICAgICAgICBjb25zdCByb3cgPSBpbmRbeV1cblxuICAgICAgICAgICAgLy9ubyByb3dcbiAgICAgICAgICAgIGlmICghcm93KSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3BsYWNlIGZpcnN0IHBvaW50XG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4TWluIC0gcmVzb2x1dGlvbiAvIDIsIHkpXG5cbiAgICAgICAgICAgIC8vc3RvcmUgdGhlIHByZXZpb3VzIGhlaWdodFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgbGV0IGhHX1xuXG4gICAgICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxpbmUgY2VsbHNcbiAgICAgICAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDw9IHhNYXg7IHggKz0gcmVzb2x1dGlvbikge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGNvbHVtbiB2YWx1ZVxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgICAgIGxldCBoRyA9IHJvd1t4XVxuICAgICAgICAgICAgICAgIGlmICghaEcpIGhHID0gMFxuXG4gICAgICAgICAgICAgICAgaWYgKGhHIHx8IGhHXykge1xuICAgICAgICAgICAgICAgICAgICAvL2RyYXcgbGluZSBvbmx5IHdoZW4gYXQgbGVhc3Qgb25lIG9mIGJvdGggdmFsdWVzIGlzIG5vbi1udWxsXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyB0ZXN0IGJlemllckN1cnZlVG9cbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIHJlc29sdXRpb24gLyAyLCB5ICsgaEcpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9lbHNlIG1vdmUgdGhlIHBvaW50XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHggKyByZXNvbHV0aW9uIC8gMiwgeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9zdG9yZSB0aGUgcHJldmlvdXMgdmFsdWVcbiAgICAgICAgICAgICAgICBoR18gPSBoR1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2xhc3QgcG9pbnRcbiAgICAgICAgICAgIGlmIChoR18pIGdlb0NhbnZhcy5jdHgubGluZVRvKHhNYXggKyByZXNvbHV0aW9uIC8gMiwgeSlcblxuICAgICAgICAgICAgLy9kcmF3IGZpbGxcbiAgICAgICAgICAgIGNvbnN0IGZjID0gdGhpcy5maWxsQ29sb3IoeSwgeXMsIHJlc29sdXRpb24sIHopXG4gICAgICAgICAgICBpZiAoZmMgJiYgZmMgIT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBmY1xuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZHJhdyBsaW5lXG4gICAgICAgICAgICBjb25zdCBsYyA9IHRoaXMubGluZUNvbG9yKHksIHlzLCByZXNvbHV0aW9uLCB6KVxuICAgICAgICAgICAgY29uc3QgbHcgPSB0aGlzLmxpbmVXaWR0aCh5LCB5cywgcmVzb2x1dGlvbiwgeilcbiAgICAgICAgICAgIGlmIChsYyAmJiBsYyAhPSAnbm9uZScgJiYgbHcgPiAwKSB7XG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IGxjXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSBsd1xuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgVGFuYWthU3R5bGUgfSBmcm9tICcuL1RhbmFrYVN0eWxlLmpzJ1xuaW1wb3J0IHsgU3Ryb2tlU3R5bGUgfSBmcm9tICcuL1N0cm9rZVN0eWxlLmpzJ1xuaW1wb3J0IHsgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUgfSBmcm9tICcuL1NxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlLmpzJ1xuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIExlZ29TdHlsZSB7XG5cbiAgICBzdGF0aWMgZ2V0KHZhbHVlLCBicmVha3MsIGNvbG9ycywgb3B0cyA9IHt9KSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy90aGUgY29sb3JzXG4gICAgICAgIC8vaHR0cDovL3d3dy5qZW5ueXNjcmF5b25jb2xsZWN0aW9uLmNvbS8yMDIxLzA2L2FsbC1jdXJyZW50LWxlZ28tY29sb3JzLmh0bWxcbiAgICAgICAgLy9odHRwczovL2xlb25hd2ljei5naXRodWIuaW8vbGVnb2NvbG9ycy9yZWZlcmVuY2UvZmlndXJlcy9SRUFETUUtcGxvdC0xLnBuZ1xuICAgICAgICAvKm9wdHMuY29sb3JzID0gb3B0cy5jb2xvcnMgfHwgW1xuICAgICAgICAgICAgJyMwMDg1MmInLCAvL2RhcmtlciBncmVlblxuICAgICAgICAgICAgJyNhZmQyNDYnLCAvL2xpZ2h0IGdyZWVuXG4gICAgICAgICAgICAnI2ZhYzgwYScsIC8vZGFyayB5ZWxsb3dcbiAgICAgICAgICAgICcjYmI4MDVhJywgLy9icm93blxuICAgICAgICAgICAgJyNkNjc5MjMnLCAvL21vc3RhcmRcbiAgICAgICAgICAgICcjY2I0ZTI5JywgLy9yZWRpc2hcbiAgICAgICAgICAgICcjYjQwMDAwJywgLy9yZWRcbiAgICAgICAgICAgICcjNzIwMDEyJywgLy9kYXJrIHJlZFxuICAgICAgICAgICAgLy9cInB1cnBsZVwiLFxuICAgICAgICAgICAgLy9cIiNlZWVcIiAvL3doaXRoZVxuICAgICAgICBdKi9cblxuICAgICAgICBvcHRzLmNvbERhcmsgPSBvcHRzLmNvbERhcmsgfHwgJyMzMzMnXG4gICAgICAgIG9wdHMuY29sQnJpZ2h0ID0gb3B0cy5jb2xCcmlnaHQgfHwgJyNhYWEnXG4gICAgICAgIG9wdHMud2lkdGhGYWN0b3IgPSBvcHRzLndpZHRoRmFjdG9yIHx8IDAuMTJcblxuICAgICAgICAvL3JldXNlIHRhbmFrYSBhcyBiYXNpc1xuICAgICAgICBjb25zdCB0cyA9IFRhbmFrYVN0eWxlLmdldCh2YWx1ZSwgYnJlYWtzLCBjb2xvcnMsIG9wdHMpXG4gICAgICAgIC8vc3R5bGUgdG8gc2hvdyBsaW1pdHMgYmV0d2VlbiBwaWVjZXNcbiAgICAgICAgY29uc3Qgc3N0ID0gbmV3IFN0cm9rZVN0eWxlKHtcbiAgICAgICAgICAgIHN0cm9rZUNvbG9yOiAoKSA9PiAnIzY2NicsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogKGMsIHIsIHopID0+IDAuMiAqIHosXG4gICAgICAgICAgICBmaWx0ZXI6IG9wdHMuZmlsdGVyLFxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB0c1swXSxcbiAgICAgICAgICAgIHNzdCxcbiAgICAgICAgICAgIHRzWzFdLFxuICAgICAgICAgICAgbmV3IExlZ29Ub3BTdHlsZSh7IGNvbERhcms6IG9wdHMuY29sRGFyaywgY29sQnJpZ2h0OiBvcHRzLmNvbEJyaWdodCwgZmlsdGVyOiBvcHRzLmZpbHRlciB9KSxcbiAgICAgICAgXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsKTpzdHJpbmd9IGNvZGVcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gY29sb3JcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHtBcnJheS48U3R5bGU+fVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDYXRlZ29yeShjb2RlLCBjb2xvciwgb3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIG9wdHMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcbiAgICAgICAgb3B0cy5jb2xCcmlnaHQgPSBvcHRzLmNvbEJyaWdodCB8fCAnI2FhYSdcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCBzID0gbmV3IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlKHsgY29kZTogY29kZSwgY29sb3I6IGNvbG9yIH0pXG4gICAgICAgIC8vc3R5bGUgdG8gc2hvdyBsaW1pdHMgYmV0d2VlbiBwaWVjZXNcbiAgICAgICAgY29uc3Qgc3N0ID0gbmV3IFN0cm9rZVN0eWxlKHsgc3Ryb2tlQ29sb3I6ICgpID0+ICcjNjY2Jywgc3Ryb2tlV2lkdGg6IChjLCByLCB6KSA9PiAwLjIgKiB6IH0pXG5cbiAgICAgICAgcmV0dXJuIFtzLCBzc3QsIG5ldyBMZWdvVG9wU3R5bGUoeyBjb2xEYXJrOiBvcHRzLmNvbERhcmssIGNvbEJyaWdodDogb3B0cy5jb2xCcmlnaHQgfSldXG4gICAgfVxufVxuXG4vKipcbiAqIEEgc3R5bGUgdG8gZHJhdyB0b3AgY2lyY2xlIG9mIGxlZ28gYnJpY2tzLlxuICovXG5jbGFzcyBMZWdvVG9wU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fHVuZGVmaW5lZH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cbiAgICAgICAgdGhpcy5jb2xEYXJrID0gb3B0cy5jb2xEYXJrIHx8ICcjMzMzJ1xuICAgICAgICB0aGlzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjYWFhJ1xuICAgIH1cblxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gMC42ICogZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vZGFyayBwYXJ0XG4gICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbERhcmtcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5hcmMoYy54ICsgciAqIDAuNSwgYy55ICsgciAqIDAuNSwgciAqIDAuNTUgKiAwLjUsIE1hdGguUEkgLyA0LCAtTWF0aC5QSSAqICgzIC8gNCksIHRydWUpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvL2JyaWdodCBwYXJ0XG4gICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbEJyaWdodFxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhjLnggKyByICogMC41LCBjLnkgKyByICogMC41LCByICogMC41NSAqIDAuNSwgTWF0aC5QSSAvIDQsIC1NYXRoLlBJICogKDMgLyA0KSwgZmFsc2UpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBNb3NhaWNTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gXCIjRUE2QkFDXCIpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBUaGUgbW9zYWljIGZhY3Rvciwgd2l0aGluIFswLDAuNV0uIFNldCB0byAwIGZvciBubyBtb3NhaWMgZWZmZWN0LiBTZXQgdG8gMC41IGZvciBzdHJvbmcgbW9zYWljIGVmZmVjdC5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5tb3NhaWNGYWN0b3IgPSBvcHRzLm1vc2FpY0ZhY3RvciB8fCAwLjE1XG5cbiAgICAgICAgLyoqIFRoZSBtb3NhaWMgc2hhZG93IGZhY3Rvciwgd2l0aGluIFswLDAuNV0uIFNldCB0byAwIGZvciBubyBtb3NhaWMgc2hhZG93LiBTZXQgdG8gMC41IGZvciBzdHJvbmcgbW9zYWljIHNoYWRvdy5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dGYWN0b3IgPSBvcHRzLnNoYWRvd0ZhY3RvciB8fCAwLjJcblxuICAgICAgICAvKiogVGhlIG1vc2FpYyBzaGFkb3cgY29sb3IuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc2hhZG93Q29sb3IgPSBvcHRzLnNoYWRvd0NvbG9yIHx8ICcjNTU1J1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9zZXQgc3Ryb2tlIHN0eWxlLCBmb3Igc2hhZG93XG4gICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnNoYWRvd0NvbG9yXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gdGhpcy5zaGFkb3dGYWN0b3IgKiByZXNvbHV0aW9uXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUpvaW4gPSAncm91bmQnXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9ICdidXR0J1xuXG4gICAgICAgIC8vZnVuY3Rpb24gdG8gY29tcHV0ZSBwb3NpdGlvbiBtb3NhaWMgZWZmZWN0XG4gICAgICAgIGNvbnN0IGQgPSByZXNvbHV0aW9uICogdGhpcy5tb3NhaWNGYWN0b3JcbiAgICAgICAgY29uc3QgbW9zYWljID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgeDogTWF0aC5yYW5kb20oKSAqIGQsIHk6IE1hdGgucmFuZG9tKCkgKiBkIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vc2V0IGZpbGwgY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgcG9zaXRpb24gbW9zYWljIGVmZmVjdFxuICAgICAgICAgICAgY29uc3QgbGwgPSBtb3NhaWMoKSxcbiAgICAgICAgICAgICAgICB1bCA9IG1vc2FpYygpLFxuICAgICAgICAgICAgICAgIGxyID0gbW9zYWljKCksXG4gICAgICAgICAgICAgICAgdXIgPSBtb3NhaWMoKVxuXG4gICAgICAgICAgICAvL3N0cm9rZVxuICAgICAgICAgICAgaWYgKHRoaXMuc2hhZG93RmFjdG9yID4gMCkge1xuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyBsbC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsbC55KVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSBsci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsci55KVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSB1ci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyByZXNvbHV0aW9uIC0gdXIueSlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZmlsbFxuXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyBsbC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsbC55KVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIGxyLngsIGNlbGwueSArIG9mZnNldC5keSArIGxyLnkpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC0gdXIueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAtIHVyLnkpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyB1bC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyByZXNvbHV0aW9uIC0gdWwueSlcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIE5pbmphU3RhclN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiBcIiNFQTZCQUNcIikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCwgd2l0aGluIFswLDFdOlxuICAgICAgICAgKiAgLSAwLCBub3RoaW5nIHNob3duXG4gICAgICAgICAqICAtIDEsIGVudGlyZSBzcXVhcmVcbiAgICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaGFwZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc2hhcGUgPSBvcHRzLnNoYXBlIHx8ICgoKSA9PiAnbycpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uICogMC41XG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgLy9zaXplIC0gaW4gZ2VvIHVuaXRcbiAgICAgICAgICAgIGxldCBrID0gdGhpcy5zaXplKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgIGsgPSBrIDwgMCA/IDAgOiBrID4gMSA/IDEgOiBrXG4gICAgICAgICAgICBjb25zdCBzRzIgPSBrICogcjJcblxuICAgICAgICAgICAgLy9zaGFwZVxuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLnNoYXBlID8gdGhpcy5zaGFwZShjZWxsKSA6ICdvJ1xuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgLy9UT0RPIHVzZVxuICAgICAgICAgICAgLy9jb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByLCB6KVxuXG4gICAgICAgICAgICAvL2NlbnRlciBwb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyByMlxuICAgICAgICAgICAgY29uc3QgY3kgPSBjZWxsLnkgKyByMlxuXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdwJykge1xuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCwgY3kgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCArIHNHMiwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyByMiwgY3kpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyBzRzIsIGN5IC0gc0cyKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4LCBjeSAtIHIyKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4IC0gc0cyLCBjeSAtIHNHMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCAtIHIyLCBjeSlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCAtIHNHMiwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdvJykge1xuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyByMiwgY3kgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCArIHNHMiwgY3kpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyByMiwgY3kgLSByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCwgY3kgLSBzRzIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggLSByMiwgY3kgLSByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCAtIHNHMiwgY3kpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggLSByMiwgY3kgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHNoYXBlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBQaWxsYXJTdHlsZSBleHRlbmRzIFN0eWxlIHtcblxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCBvZiB0aGUgbGluZSByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHRcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBsaW5lIHJlcHJlc2VudGluZyBhIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+IFwiI2MwOGM1OVwiKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBsaW5lIHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiAwLjUgKiByZXNvbHV0aW9uKVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlciwgbnVtYmVyLG9iamVjdCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5zaW1wbGUgPSBvcHRzLnNpbXBsZSB8fCAoKCkgPT4gZmFsc2UpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudmlld0hlaWdodEZhY3RvciA9IG9wdHMudmlld0hlaWdodEZhY3RvciB8fCAxLjVcbiAgICAgICAgLy8wLDAgaXMgdGhlIGNlbnRlclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy52aWV3U1ggPSBvcHRzLnZpZXdTWCA9PSB1bmRlZmluZWQgPyAwIDogb3B0cy52aWV3U1hcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudmlld1NZID0gb3B0cy52aWV3U1kgPT0gdW5kZWZpbmVkID8gLTAuNSA6IG9wdHMudmlld1NZXG5cbiAgICAgICAgLy9UT0RPIHJlcGxhY2Ugd2l0aCBzdW4gbG9jYXRpb24gP1xuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dEaXJlY3Rpb24gPVxuICAgICAgICAgICAgb3B0cy5zaGFkb3dEaXJlY3Rpb24gPT0gdW5kZWZpbmVkID8gKC00MC4zICogTWF0aC5QSSkgLyAxODAuMCA6IG9wdHMuc2hhZG93RGlyZWN0aW9uXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNoYWRvd0ZhY3RvciA9IG9wdHMuc2hhZG93RmFjdG9yIHx8IDAuM1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dDb2xvciA9IG9wdHMuc2hhZG93Q29sb3IgfHwgJyMwMDAwMDAzMydcblxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5vdXRsaW5lQ29sID0gb3B0cy5vdXRsaW5lQ29sIHx8ICcjRkZGRkZGJ1xuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vdXRsaW5lV2lkdGhQaXggPSBvcHRzLm91dGxpbmVXaWR0aFBpeCA9PSB1bmRlZmluZWQgPyAwLjUgOiBvcHRzLm91dGxpbmVXaWR0aFBpeFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc2VnbWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2dldCB2aWV3IGNlbnRlciBnZW8gcG9zaXRpb25cbiAgICAgICAgY29uc3QgY3Z4ID0gZ2VvQ2FudmFzLnZpZXcueCArIHRoaXMudmlld1NYICogZ2VvQ2FudmFzLncgKiB6XG4gICAgICAgIGNvbnN0IGN2eSA9IGdlb0NhbnZhcy52aWV3LnkgKyB0aGlzLnZpZXdTWSAqIGdlb0NhbnZhcy5oICogelxuICAgICAgICAvL2dldCB2aWV3IGhlaWdodFxuICAgICAgICBjb25zdCBIID0gdGhpcy52aWV3SGVpZ2h0RmFjdG9yICogKGdlb0NhbnZhcy53ICsgZ2VvQ2FudmFzLmgpICogMC41ICogelxuXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB5IGFuZCB4XG4gICAgICAgIC8vY29uc3QgZGlzdFRvVmlld0NlbnRlciA9IChjKSA9PiB7IGNvbnN0IGR4ID0gY3Z4IC0gYy54LCBkeSA9IGN2eSAtIGMueTsgcmV0dXJuIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkgfVxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IDEwMDAwMDAwMCAqIChjMi55IC0gYzEueSkgKyBjMS54IC0gYzIueClcblxuICAgICAgICAvL2dldCBzaW1wbGUgaW5mb3JtYXRpb25cbiAgICAgICAgY29uc3Qgc2ltcGxlID0gdGhpcy5zaW1wbGUocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9IHNpbXBsZSA/ICdidXR0JyA6ICdyb3VuZCdcblxuICAgICAgICAvL2RyYXcgc2hhZG93c1xuICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5zaGFkb3dDb2xvclxuICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9IHRoaXMuc2hhZG93Q29sb3JcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy93aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9oZWlnaHRcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGhHID0gdGhpcy5oZWlnaHQgPyB0aGlzLmhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWhHIHx8IGhHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICAvL1RPRE8gdXNlIHRoYXRcbiAgICAgICAgICAgIC8vY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgLy9zZXQgd2lkdGhcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd0dcblxuICAgICAgICAgICAgLy9jb21wdXRlIGNlbGwgY2VudGVyIHBvc3RpdGlvblxuICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyByZXNvbHV0aW9uIC8gMlxuICAgICAgICAgICAgY29uc3QgY3kgPSBjZWxsLnkgKyByZXNvbHV0aW9uIC8gMlxuICAgICAgICAgICAgY29uc3QgbHMgPSBoRyAqIHRoaXMuc2hhZG93RmFjdG9yXG5cbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCArIGxzICogTWF0aC5jb3ModGhpcy5zaGFkb3dEaXJlY3Rpb24pLCBjeSArIGxzICogTWF0aC5zaW4odGhpcy5zaGFkb3dEaXJlY3Rpb24pKVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgaWYgKHRoaXMuc2ltcGxlKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGJhc2UgY2lyY2xlXG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoXG4gICAgICAgICAgICAgICAgICAgIGN4LCBjeSxcbiAgICAgICAgICAgICAgICAgICAgd0cgKiAwLjUsXG4gICAgICAgICAgICAgICAgICAgIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgLy9jZy5jdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKTtcbiAgICAgICAgICAgIH0qL1xuICAgICAgICB9XG5cbiAgICAgICAgLy9kcmF3IHBpbGxhcnNcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vaGVpZ2h0XG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBoRyA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFoRyB8fCBoRyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgLy9UT0RPIHVzZSB0aGF0XG4gICAgICAgICAgICAvL2NvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBjZWxsIGNlbnRlciBwb3N0aXRpb25cbiAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcmVzb2x1dGlvbiAvIDJcblxuICAgICAgICAgICAgLy9jb21wdXRlIGFuZ2xlXG4gICAgICAgICAgICBjb25zdCBkeCA9IGN4IC0gY3Z4LFxuICAgICAgICAgICAgICAgIGR5ID0gY3kgLSBjdnlcbiAgICAgICAgICAgIGNvbnN0IGEgPSBNYXRoLmF0YW4yKGR5LCBkeClcbiAgICAgICAgICAgIGNvbnN0IEQgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpXG4gICAgICAgICAgICBjb25zdCBkID0gKEQgKiBoRykgLyAoSCAtIGhHKVxuXG4gICAgICAgICAgICBpZiAoc2ltcGxlKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gY29sXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSB3R1xuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGJhY2tncm91bmQgc2VnbWVudFxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLm91dGxpbmVDb2xcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHdHICsgMiAqIHRoaXMub3V0bGluZVdpZHRoUGl4ICogelxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd0dcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oY3gsIGN5KVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgdG9wIGNpcmNsZVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLm91dGxpbmVDb2xcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5maWxsU3R5bGUgPSBcIiNjMDhjNTlcIlxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gdGhpcy5vdXRsaW5lV2lkdGhQaXggKiB6XG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSwgd0cgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgLy9jZy5jdHguZmlsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9pbiBjYXNlLi4uXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9ICdidXR0J1xuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQSBzdHlsZSB3aGVyZSBlYWNoIGNlbGwgaXMgcmVwcmVzZW50ZWQgYnkgYSBzZWdtZW50IHdob3NlIGxlbmd0aCwgd2lkdGgsIGNvbG9yIGFuZCBvcmllbnRhdGlvbiBjYW4gdmFyeSBhY2NvcmRpbmcgdG8gc3RhdGlzdGljYWwgdmFsdWVzLlxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNlZ21lbnRTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbCBzZWdtZW50LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiBcIiNFQTZCQUNcIikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbiAqIDAuMSkgIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBzZWdtZW50IHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRzLmxlbmd0aCB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24gKiAwLjkpICAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG9yaWVudGF0aW9uIChpbiBkZWdyZWVzKSBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBvcHRzLm9yaWVudGF0aW9uIHx8ICgoKSA9PiAxODAgKiBNYXRoLnJhbmRvbSgpKSAvLyhjLHIseix2cykgPT4ge31cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNlZ21lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9cbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lQ2FwID0gJ2J1dHQnXG5cbiAgICAgICAgLy9jb252ZXJzaW9uIGZhY3RvciBkZWdyZWUgLT4gcmFkaWFuXG4gICAgICAgIGNvbnN0IGYgPSBNYXRoLlBJIC8gMTgwXG5cbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vbGVuZ3RoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBsRyA9IHRoaXMubGVuZ3RoID8gdGhpcy5sZW5ndGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vb3JpZW50YXRpb24gKGluIHJhZGlhbilcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgY29uc3Qgb3IgPSB0aGlzLm9yaWVudGF0aW9uKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgKiBmXG4gICAgICAgICAgICBpZiAob3IgPT09IHVuZGVmaW5lZCB8fCBpc05hTihvcikpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgLy9zZXQgY29sb3IgYW5kIHdpZHRoXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gY29sXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHdHXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBzZWdtZW50IGNlbnRlciBwb3N0aXRpb25cbiAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgcmVzb2x1dGlvbiAvIDIgKyBvZmZzZXQuZHhcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcmVzb2x1dGlvbiAvIDIgKyBvZmZzZXQuZHlcblxuICAgICAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgZGlyZWN0aW9uXG4gICAgICAgICAgICBjb25zdCBkeCA9IDAuNSAqIE1hdGguY29zKG9yKSAqIGxHXG4gICAgICAgICAgICBjb25zdCBkeSA9IDAuNSAqIE1hdGguc2luKG9yKSAqIGxHXG5cbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCAtIGR4LCBjeSAtIGR5KVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyBkeCwgY3kgKyBkeSlcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgdmlld1NjYWxlOiB2aWV3U2NhbGUsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIGNlbGxzOiBjZWxscyB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEEgdmVyeSBnZW5lcmljIHN0eWxlIHRoYXQgc2hvd3MgZ3JpZCBjZWxscyB3aXRoIHNwZWNpZmljIGNvbG9yLCBzaXplIGFuZCBzaGFwZS5cbiAqIEl0IGNhbiBiZSB1c2VkIHRvIHNob3cgdmFyaWFibGVzIGFzIGNlbGwgY29sb3JzLCBjZWxsIHNpemUsIGNlbGwgc2hhcGUsIG9yIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgdGhyZWUgdmlzdWFsIHZhcmlhYmxlcy5cbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTaGFwZUNvbG9yU2l6ZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiBcIiNFQTZCQUNcIikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNoYXBlIG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlciwgbnVtYmVyLG9iamVjdCk6aW1wb3J0KFwiLi4vY29yZS9TdHlsZS5qc1wiKS5TaGFwZX0gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgKCgpID0+IFwic3F1YXJlXCIpIC8vKGMscix6LHZzKSA9PiB7fVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcywgd2l0aCB2YXJpb3VzIGNvbG9ycyBhbmQgc2l6ZXMuXG4gICAgICogXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy96b29tXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICBsZXQgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IFwiYmxhY2tcIlxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vc2l6ZVxuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogcmVzb2x1dGlvblxuICAgICAgICAgICAgaWYgKCFzaXplKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3NoYXBlXG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHRoaXMuc2hhcGUgPyB0aGlzLnNoYXBlKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAnc3F1YXJlJ1xuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgc3F1YXJlXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiAoMSAtIHNpemUgLyByZXNvbHV0aW9uKSAqIDAuNVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoYy54ICsgZCArIG9mZnNldC5keCwgYy55ICsgZCArIG9mZnNldC5keSwgc2l6ZSwgc2l6ZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhjLnggKyByMiArIG9mZnNldC5keCwgYy55ICsgcjIgKyBvZmZzZXQuZHksIHNpemUgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2RvbnV0Jykge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBkb251dFxuICAgICAgICAgICAgICAgIGNvbnN0IHhjID0gYy54ICsgcjIgKyBvZmZzZXQuZHgsXG4gICAgICAgICAgICAgICAgICAgIHljID0gYy55ICsgcjIgKyBvZmZzZXQuZHlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKHhjLCB5YywgcjIsIDAsIDIgKiBNYXRoLlBJKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKHhjLCB5YywgKDEgLSBzaXplIC8gcmVzb2x1dGlvbikgKiByMiwgMCwgMiAqIE1hdGguUEksIHRydWUpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZGlhbW9uZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzMiA9IHNpemUgKiAwLjVcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54ICsgcjIgLSBzMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54ICsgcjIsIGMueSArIHIyICsgczIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54ICsgcjIgKyBzMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54ICsgcjIsIGMueSArIHIyIC0gczIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV91cCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9kb3duJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGMueCAtIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9sZWZ0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54IC0gZHIyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9yaWdodCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggLSBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyBzaGFwZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgdmlld1NjYWxlOiB2aWV3U2NhbGUsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIGNlbGxzOiBjZWxscyB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXG5cbi8qKlxuICogQSBzdHlsZSB0byBzaG93IHRoZSBzaWRlcyBvZiBncmlkIGNlbGxzIGJhc2VkIG9uIHRoZWlyIGRpZmZlcmVudCBjYXRlZ29yaWVzLlxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpZGVDYXRlZ29yeVN0eWxlIGV4dGVuZHMgU2lkZVN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjYXRlZ29yeSBjb2RlIG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2RlID0gb3B0cy5jb2RlXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChzdHJpbmcgLT4gY29sb3IpIHdoaWNoIGdpdmUgdGhlIGNvbG9yIG9mIGVhY2ggY2F0ZWdvcnkuXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yXG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vYnVpbGQgc2lkZXNcblxuICAgICAgICAvKiogIEB0eXBlIHtBcnJheS48aW1wb3J0KCcuL1NpZGVTdHlsZS5qcycpLlNpZGU+fSAqL1xuICAgICAgICBjb25zdCBzaWRlcyA9IFNpZGVTdHlsZS5idWlsZFNpZGVzKGNlbGxzLCByZXNvbHV0aW9uKVxuICAgICAgICBpZiAoc2lkZXMubGVuZ3RoID09IDApIHJldHVyblxuXG4gICAgICAgIC8vZ2V0IHNpZGUgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKHNpZGVzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vZHJhdyBzaWRlc1xuXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9ICdidXR0J1xuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24qMC41XG4gICAgICAgIGZvciAobGV0IHNpZGUgb2Ygc2lkZXMpIHtcblxuICAgICAgICAgICAgLy9nZXQgY2F0ZWdvcnkgY29kZXMgZm9yIGJvdGggY2VsbHNcbiAgICAgICAgICAgIGNvbnN0IGNvZGUxID0gc2lkZS5jMSA/IHRoaXMuY29kZShzaWRlLmMxLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgY29uc3QgY29kZTIgPSBzaWRlLmMyID8gdGhpcy5jb2RlKHNpZGUuYzIsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoY29kZTEgPT0gY29kZTIpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8PSAwKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgdzIgPSB3RyAqIDAuNVxuXG4gICAgICAgICAgICAvL3NldCB3aWR0aFxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSB3R1xuXG4gICAgICAgICAgICAvL2RyYXcgc2VnbWVudCB3aXRoIGNvcnJlY3Qgb3JpZW50YXRpb25cbiAgICAgICAgICAgIGlmIChzaWRlLm9yID09PSAnaCcpIHtcbiAgICAgICAgICAgICAgICAvL3RvcCBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUyKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3JbY29kZTJdXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHNpZGUueC1yMiwgc2lkZS55ICsgdzIpXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHNpZGUueCtyMiwgc2lkZS55ICsgdzIpXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2JvdHRvbSBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUxKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3JbY29kZTFdXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHNpZGUueC1yMiwgc2lkZS55IC0gdzIpXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHNpZGUueCtyMiwgc2lkZS55IC0gdzIpXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vcmlnaHQgbGluZVxuICAgICAgICAgICAgICAgIGlmIChjb2RlMikge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbG9yW2NvZGUyXVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhzaWRlLnggKyB3Miwgc2lkZS55LXIyKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhzaWRlLnggKyB3Miwgc2lkZS55K3IyKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9sZWZ0IGxpbmVcbiAgICAgICAgICAgICAgICBpZiAoY29kZTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltjb2RlMV1cbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oc2lkZS54IC0gdzIsIHNpZGUueS1yMilcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oc2lkZS54IC0gdzIsIHNpZGUueStyMilcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKiBAdHlwZWRlZiB7eyB4Om51bWJlciwgeTpudW1iZXIsIG9yOlwidlwifFwiaFwiLCBjMTooaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQnKS5DZWxsKXx1bmRlZmluZWQsIGMyOihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldCcpLkNlbGwpfHVuZGVmaW5lZCB9fSBTaWRlICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKEFycmF5LjxTaWRlPixudW1iZXIsIG51bWJlcik6Kn0gU2lkZVZpZXdTY2FsZSAqL1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpZGVTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIob3B0cylcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIGEgY2VsbCBzaWRlLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKHNpZGUsIHJlc29sdXRpb24sIHosIHNpZGVWaWV3U2NhbGUpID0+ICcjRUE2QkFDJylcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIGEgY2VsbCBzaWRlLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKHNpZGUsIHJlc29sdXRpb24sIHosIHNpZGVWaWV3U2NhbGUpID0+IHJlc29sdXRpb24gLyA1KVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIGEgY2VsbCBzaWRlLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdHMubGVuZ3RoIHx8ICgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgc2lkZVZpZXdTY2FsZSkgPT4gcmVzb2x1dGlvbilcblxuICAgICAgICAvKiogU2V0IHRvIEEgb3IgdHJ1ZSBzbyB0aGF0IHRoZSBzaWRlIGlzIGRyYXduIGFzIGEgZGlhbW9uZCAqL1xuICAgICAgICB0aGlzLmRpYW1vbmQgPSBvcHRzLmRpYW1vbmRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vYnVpbGQgc2lkZXNcblxuICAgICAgICAvKiogIEB0eXBlIHtBcnJheS48U2lkZT59ICovXG4gICAgICAgIGNvbnN0IHNpZGVzID0gU2lkZVN0eWxlLmJ1aWxkU2lkZXMoY2VsbHMsIHJlc29sdXRpb24pXG4gICAgICAgIGlmIChzaWRlcy5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgLy9nZXQgc2lkZSB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoc2lkZXMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9kcmF3IHNpZGVzXG5cbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lQ2FwID0gJ2J1dHQnXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxuICAgICAgICBmb3IgKGxldCBzaWRlIG9mIHNpZGVzKSB7XG5cbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKHNpZGUsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRpYW1vbmQpIHtcblxuICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBkaWFtb25kXG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IHNpZGUueCwgeSA9IHNpZGUueVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4IC0gcjIsIHkpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCwgeSArIHIyKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHggKyByMiwgeSlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyh4LCB5IC0gcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPD0gMCkgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vbGVuZ3RoXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IGxHID0gdGhpcy5sZW5ndGggPyB0aGlzLmxlbmd0aChzaWRlLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8PSAwKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNvbnN0IGxHMiA9IGxHICogMC41XG5cbiAgICAgICAgICAgICAgICAvL3NldCB3aWR0aFxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd0dcbiAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHdpdGggY29ycmVjdCBvcmllbnRhdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzaWRlLngsIHkgPSBzaWRlLnlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgaWYgKHNpZGUub3IgPT09IFwidlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHgsIHkgLSBsRzIpXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHgsIHkgKyBsRzIpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oeCAtIGxHMiwgeSlcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIGxHMiwgeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG5cblxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQnKS5DZWxsPn0gY2VsbHMgVGhlIGNlbGxzIHRvIHVzZSB0byBidWlsZCB0aGUgc2lkZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGNlbGxzIHJlc29sdXRpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHdpdGhIb3Jpem9udGFsIFNldCB0byB0cnVlIHRvIGJ1aWxkIGhvcml6b250YWwgc2lkZXMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHdpdGhWZXJ0aWNhbCBTZXQgdG8gdHJ1ZSB0byBidWlsZCB2ZXJ0aWNhbCBzaWRlcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2VudGVyIFNldCB0byB0cnVlIHNvIHRoYXQgdGhlIHNpZGUgY29vcmRpbmF0ZSBhcmUgdGhvc2Ugb2YgaXRzIGNlbnRlciBwb2ludCByYXRoZXIgdGhhbiBpdHMgbGVmdC9ib3R0b20gcG9pbnQgKHRoZSBzaWRlIHgseSBjb29yZGluYXRlcyBhcmUgdGhvc2Ugb2YgdGhlIGxlZnQgcG9pbnQgZm9yIGhvcml6b250YWwgc2lkZXMsIGFuZCBvZiB0aGUgYm90dG9tIHBvaW50IGZvciB2ZXJ0aWNhbCBzaWRlcylcbiAgICAgKiBAcmV0dXJucyB7IEFycmF5LjxTaWRlPiB9XG4gICAgICovXG4gICAgc3RhdGljIGJ1aWxkU2lkZXMoY2VsbHMsIHJlc29sdXRpb24sIHdpdGhIb3Jpem9udGFsID0gdHJ1ZSwgd2l0aFZlcnRpY2FsID0gdHJ1ZSwgY2VudGVyID0gdHJ1ZSkge1xuICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48U2lkZT4gfSAqL1xuICAgICAgICBjb25zdCBzaWRlcyA9IFtdXG5cbiAgICAgICAgY29uc3QgcjIgPSBjZW50ZXIgPyByZXNvbHV0aW9uIC8gMiA6IDBcblxuICAgICAgICAvL21ha2UgaG9yaXpvbnRhbCBzaWRlc1xuICAgICAgICAvL3NvcnQgY2VsbHMgYnkgeCBhbmQgeVxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IChjMi54ID09IGMxLnggPyBjMS55IC0gYzIueSA6IGMxLnggLSBjMi54KSlcbiAgICAgICAgbGV0IGMxID0gY2VsbHNbMF1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGMyID0gY2VsbHNbaV1cblxuICAgICAgICAgICAgaWYgKChjMS55ICsgcmVzb2x1dGlvbiA9PSBjMi55KSAmJiAoYzEueCA9PSBjMi54KSlcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGluIHNhbWUgY29sdW1uIGFuZCB0b3VjaCBhbG9uZyBob3Jpem9udGFsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2Ugc2hhcmVkIHNpZGVcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb3I6ICdoJyxcbiAgICAgICAgICAgICAgICAgICAgeDogYzEueCArIHIyLCB5OiBjMi55LFxuICAgICAgICAgICAgICAgICAgICBjMTogYzEsIGMyOiBjMlxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGRvIG5vdCB0b3VjaCBhbG9uZyBob3Jpem9udGFsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2UgdHdvIHNpZGVzOiB0b3Agb25lIGZvciBjMSwgYm90dG9tIGZvciBjMlxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBvcjogJ2gnLFxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcjIsIHk6IGMxLnkgKyByZXNvbHV0aW9uLFxuICAgICAgICAgICAgICAgICAgICBjMTogYzEsIGMyOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBvcjogJ2gnLFxuICAgICAgICAgICAgICAgICAgICB4OiBjMi54ICsgcjIsIHk6IGMyLnksXG4gICAgICAgICAgICAgICAgICAgIGMxOiB1bmRlZmluZWQsIGMyOiBjMlxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGMxID0gYzJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vbWFrZSB2ZXJ0aWNhbCBzaWRlc1xuICAgICAgICAvL3NvcnQgY2VsbHMgYnkgeSBhbmQgeFxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IChjMi55ID09IGMxLnkgPyBjMS54IC0gYzIueCA6IGMxLnkgLSBjMi55KSlcbiAgICAgICAgYzEgPSBjZWxsc1swXVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYzIgPSBjZWxsc1tpXVxuXG4gICAgICAgICAgICBpZiAoKGMxLnggKyByZXNvbHV0aW9uID09IGMyLngpICYmIChjMS55ID09IGMyLnkpKVxuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSByb3cgYW5kIHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2Ugc2hhcmVkIHNpZGVcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcbiAgICAgICAgICAgICAgICAgICAgeDogYzEueCArIHJlc29sdXRpb24sIHk6IGMxLnkgKyByMixcbiAgICAgICAgICAgICAgICAgICAgYzE6IGMxLCBjMjogYzJcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9jZWxscyBkbyBub3QgdG91Y2ggYWxvbmcgdmVydGljYWwgc2lkZVxuICAgICAgICAgICAgICAgIC8vbWFrZSB0d28gc2lkZXM6IHJpZ2h0IG9uZSBmb3IgYzEsIGxlZnQgZm9yIGMyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG9yOiAndicsXG4gICAgICAgICAgICAgICAgICAgIHg6IGMxLnggKyByZXNvbHV0aW9uLCB5OiBjMS55ICsgcjIsXG4gICAgICAgICAgICAgICAgICAgIGMxOiBjMSwgYzI6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG9yOiAndicsXG4gICAgICAgICAgICAgICAgICAgIHg6IGMyLngsIHk6IGMyLnkgKyByMixcbiAgICAgICAgICAgICAgICAgICAgYzE6IHVuZGVmaW5lZCwgYzI6IGMyXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYzEgPSBjMlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaWRlc1xuICAgIH1cblxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5pbXBvcnQgeyBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkLmpzJ1xuXG4vKipcbiAqIFN0eWxlIGJhc2VkIG9uIHdlYkdMXG4gKiBUbyBzaG93IGNlbGxzIGFzIGNvbG9yZWQgc3F1YXJlcywgZnJvbSBjYXRlZ29yaWVzLlxuICogQWxsIGNlbGxzIGFyZSBkcmF3biBhcyBzcXVhcmVzLCB3aXRoIHRoZSBzYW1lIHNpemVcbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjYXRlZ29yeSBjb2RlIG9mIHRoZSBjZWxsLCBmb3IgY29sb3JpbmcuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2RlID0gb3B0cy5jb2RlXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChjb2RlIC0+IGNvbG9yKSB3aGljaCBnaXZlcyB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeSBjb2RlLlxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICBvcHRzLmNvbG9yID0gb3B0cy5jb2xvciB8fCB1bmRlZmluZWRcblxuICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48c3RyaW5nPiB9ICovXG4gICAgICAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMob3B0cy5jb2xvcilcblxuICAgICAgICAvKiogQHR5cGUgeyBvYmplY3QgfSBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLmNhdFRvSSA9IHt9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpKyspIHRoaXMuY2F0VG9JW2NvZGVzW2ldXSA9IGkgKyAnJ1xuXG4gICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxzdHJpbmc+IH0gQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgY29kZXMpXG4gICAgICAgICAgICB0aGlzLmNvbG9ycy5wdXNoKG9wdHMuY29sb3JbJycgKyBjb2RlXSlcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgdGhlIGNlbGxzLCBpbiBnZW9ncmFwaGljYWwgdW5pdC4gQWxsIGNlbGxzIGhhdmUgdGhlIHNhbWUgc2l6ZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIC8vIChyZXNvbHV0aW9uLCB6KSA9PiAuLi5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUgeyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQgfSAqL1xuICAgICAgICB0aGlzLndncCA9IG5ldyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQodGhpcy5jb2xvcnMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2FkZCB2ZXJ0aWNlIGFuZCBmcmFnbWVudCBkYXRhXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgbGV0IGMsIG5iID0gY2VsbHMubGVuZ3RoXG4gICAgICAgIGNvbnN0IHZlcnRpY2VzQnVmZmVyID0gW11cbiAgICAgICAgY29uc3QgaUJ1ZmZlciA9IFtdXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgYyA9IGNlbGxzW2ldXG4gICAgICAgICAgICBjb25zdCBjYXQgPSB0aGlzLmNvZGUoYylcbiAgICAgICAgICAgIGlmIChjYXQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VuZXhwZWN0ZWQgY2F0ZWdvcnk6ICcgKyBjYXQpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgY29uc3QgaV8gPSB0aGlzLmNhdFRvSVtjYXRdXG4gICAgICAgICAgICBpZiAoaXNOYU4oK2lfKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbmV4cGVjdGVkIGNhdGVnb3J5IGluZGV4OiAnICsgY2F0ICsgJyAnICsgaV8pXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlcnRpY2VzQnVmZmVyLnB1c2goYy54ICsgcjIsIGMueSArIHIyKVxuICAgICAgICAgICAgaUJ1ZmZlci5wdXNoKCtpXylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY3JlYXRlIGNhbnZhcyBhbmQgd2ViZ2wgcmVuZGVyZXJcbiAgICAgICAgY29uc3QgY3ZXR0wgPSBtYWtlV2ViR0xDYW52YXMoZ2VvQ2FudmFzLncgKyAnJywgZ2VvQ2FudmFzLmggKyAnJylcbiAgICAgICAgaWYgKCFjdldHTCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvL2RyYXdcbiAgICAgICAgY29uc3Qgc2l6ZUdlbyA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShyZXNvbHV0aW9uLCB6KSA6IHJlc29sdXRpb24gKyAwLjIgKiB6XG4gICAgICAgIHRoaXMud2dwLmRyYXcoY3ZXR0wuZ2wsIHZlcnRpY2VzQnVmZmVyLCBpQnVmZmVyLCBnZW9DYW52YXMuZ2V0V2ViR0xUcmFuc2Zvcm0oKSwgc2l6ZUdlbyAvIHopXG5cbiAgICAgICAgLy9kcmF3IGluIGNhbnZhcyBnZW9cbiAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICBnZW9DYW52YXMuY3R4LmRyYXdJbWFnZShjdldHTC5jYW52YXMsIDAsIDApXG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiB9KVxuICAgIH1cbn0iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcbmltcG9ydCB7IG1ha2VXZWJHTENhbnZhcyB9IGZyb20gJy4uL3V0aWxzL3dlYkdMVXRpbHMuanMnXG5pbXBvcnQgeyBXZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQgfSBmcm9tICcuLi91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQuanMnXG5cbi8qKlxuICogU3R5bGUgYmFzZWQgb24gd2ViR0xcbiAqIFRvIHNob3cgY2VsbHMgYXMgY29sb3JlZCBzcXVhcmVzLCB3aXRoIGNvbXB1dGF0aW9uIG9mIHRoZSBjb2xvcnMgb24gR1BVIHNpZGUgKGZhc3RlciB0aGFuIEphdmFTY3JpcHQgc2lkZSkuXG4gKiBBbGxzIHNxdWFyZXMgd2l0aCB0aGUgc2FtZSBzaXplXG4gKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU3F1YXJlQ29sb3JXZWJHTFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgYSB0IHZhbHVlICh3aXRoaW4gWzAsMV0pIGZvciBhIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy50RnVuID0gb3B0cy50RnVuIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXN0cmlidXRpb24gc3RyZXRjaGluZyBtZXRob2QuXG4gICAgICAgICAqIFRoZSBzdHJldGNoaW5nIGlzIHBlcmZvcm1lZCBvbiBHUFUgc2lkZSAoZnJhZ21lbnQgc2hhZGVyKS5cbiAgICAgICAgICogQHR5cGUge3sgZnVuOnN0cmluZywgYWxwaGE6bnVtYmVyIH19ICovXG4gICAgICAgIHRoaXMuc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc2FtcGxlIG9mIHRoZSBjb2xvciByYW1wLlxuICAgICAgICAgKiBUaGUgY29sb3IgaXMgY29tcHV0ZWQgb24gR1BVIHNpZGUgKGZyYWdtZW50IHNoYWRlcikgYmFzZWQgb24gdGhvc2UgdmFsdWVzIChsaW5lYXIgaW50ZXJwb2xhdGlvbikuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPVxuICAgICAgICAgICAgb3B0cy5jb2xvcnMgfHxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAncmdiKDE1OCwgMSwgNjYpJyxcbiAgICAgICAgICAgICAgICAncmdiKDI0OCwgMTQyLCA4MyknLFxuICAgICAgICAgICAgICAgICdyZ2IoMjUxLCAyNDgsIDE3NiknLFxuICAgICAgICAgICAgICAgICdyZ2IoMTM3LCAyMDcsIDE2NSknLFxuICAgICAgICAgICAgICAgICdyZ2IoOTQsIDc5LCAxNjIpJyxcbiAgICAgICAgICAgIF0ucmV2ZXJzZSgpXG4gICAgICAgIGlmIChvcHRzLmNvbG9yKVxuICAgICAgICAgICAgdGhpcy5jb2xvcnMgPSBbXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwKSxcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuMiksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwLjQpLFxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMC42KSxcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuOCksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigxKSxcbiAgICAgICAgICAgIF1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lIHRoZSBvcGFjaXR5IG9mIHRoZSBzdHlsZSwgd2l0aGluIFswLDFdLlxuICAgICAgICAgKiBJZiB0aGlzIG9wYWNpdHkgaXMgZGVmaW5lZCwgdGhlIGluZGl2aWR1YWwgY29sb3Igb3BhY2l0eSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub3BhY2l0eSA9IG9wdHMub3BhY2l0eSAvLyAocix6KSA9PiAuLi5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgdGhlIGNlbGxzLCBpbiBnZW9ncmFwaGljYWwgdW5pdC4gQWxsIGNlbGxzIGhhdmUgdGhlIHNhbWUgc2l6ZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIC8vIChyZXNvbHV0aW9uLCB6KSA9PiAuLi5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2NyZWF0ZSBjYW52YXMgYW5kIHdlYmdsIHJlbmRlcmVyXG4gICAgICAgIC8vZm9yIG9wYWNpdHkgY29udHJvbCwgc2VlOiBodHRwczovL3dlYmdsZnVuZGFtZW50YWxzLm9yZy93ZWJnbC9sZXNzb25zL3dlYmdsLWFuZC1hbHBoYS5odG1sXG4gICAgICAgIGNvbnN0IGN2V0dMID0gbWFrZVdlYkdMQ2FudmFzKFxuICAgICAgICAgICAgZ2VvQ2FudmFzLncgKyAnJyxcbiAgICAgICAgICAgIGdlb0NhbnZhcy5oICsgJycsXG4gICAgICAgICAgICB0aGlzLm9wYWNpdHkgIT0gdW5kZWZpbmVkID8geyBwcmVtdWx0aXBsaWVkQWxwaGE6IGZhbHNlIH0gOiB1bmRlZmluZWRcbiAgICAgICAgKVxuICAgICAgICBpZiAoIWN2V0dMKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyB3ZWJHTCcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vYWRkIHZlcnRpY2UgYW5kIGZyYWdtZW50IGRhdGFcbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uIC8gMlxuICAgICAgICBjb25zdCB2ZXJ0aWNlc0J1ZmZlciA9IFtdXG4gICAgICAgIGNvbnN0IHRCdWZmZXIgPSBbXVxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy50RnVuKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgIGlmICh0ID09IG51bGwgfHwgdCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICB2ZXJ0aWNlc0J1ZmZlci5wdXNoKGNlbGwueCArIHIyLCBjZWxsLnkgKyByMilcbiAgICAgICAgICAgIHRCdWZmZXIucHVzaCh0ID4gMSA/IDEgOiB0IDwgMCA/IDAgOiB0KVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wdXRlIHBpeGVsIHNpemVcbiAgICAgICAgY29uc3Qgc2l6ZUdlbyA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShyZXNvbHV0aW9uLCB6KSA6IHJlc29sdXRpb24gKyAwLjIgKiB6XG5cbiAgICAgICAgLy9jb21wdXRlIG9wYWNpdHlcbiAgICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wYWNpdHkgPyB0aGlzLm9wYWNpdHkocmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB3Z3AgPSBuZXcgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkKGN2V0dMLmdsLCB0aGlzLmNvbG9ycywgdGhpcy5zdHJldGNoaW5nLCBzaXplR2VvIC8geiwgb3ApXG5cbiAgICAgICAgLy9kcmF3XG4gICAgICAgIHdncC5kcmF3KHZlcnRpY2VzQnVmZmVyLCB0QnVmZmVyLCBnZW9DYW52YXMuZ2V0V2ViR0xUcmFuc2Zvcm0oKSlcblxuICAgICAgICAvL2RyYXcgaW4gY2FudmFzIGdlb1xuICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgIGdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKGN2V0dMLmNhbnZhcywgMCwgMClcblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cm9rZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBvcHRzLnN0cm9rZUNvbG9yIHx8ICgoKSA9PiBcIiM2NjZcIikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogVGhlIHN0cm9rZSBsaW5lIHdpZHRoIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc3Ryb2tlV2lkdGggPSBvcHRzLnN0cm9rZVdpZHRoIHx8ICgoY2VsbCwgcmVzb2x1dGlvbiwgeikgPT4geiAqIDEuNSkgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaGFwZSBvZiBhIGNlbGwuXG4gICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTppbXBvcnQoXCIuLi9jb3JlL1N0eWxlLmpzXCIpLlNoYXBlfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gXCJzcXVhcmVcIikgLy8oYyxyLHosdnMpID0+IHt9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyBzcXVhcmVzLCB3aXRoIHZhcmlvdXMgY29sb3JzIGFuZCBzaXplLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uICogMC41XG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcblxuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5zdHJva2VDb2xvciA/IHRoaXMuc3Ryb2tlQ29sb3IoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlbyB1bml0XG4gICAgICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplID8gdGhpcy5zaXplKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiByZXNvbHV0aW9uXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIGNvbnN0IHdpID0gdGhpcy5zdHJva2VXaWR0aCA/IHRoaXMuc3Ryb2tlV2lkdGgoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IDEgKiB6XG4gICAgICAgICAgICBpZiAoIXdpIHx8IHdpIDw9IDApIGNvbnRpbnVlXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHdpXG5cbiAgICAgICAgICAgIC8vc2hhcGVcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZSA/IHRoaXMuc2hhcGUoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdzcXVhcmUnXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdzcXVhcmUnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IHNxdWFyZVxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSByZXNvbHV0aW9uICogKDEgLSBzaXplIC8gcmVzb2x1dGlvbikgKiAwLjVcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5yZWN0KGMueCArIGQgKyBvZmZzZXQuZHgsIGMueSArIGQgKyBvZmZzZXQuZHksIHNpemUsIHNpemUpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgY2lyY2xlXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKGMueCArIHIyICsgb2Zmc2V0LmR4LCBjLnkgKyByMiArIG9mZnNldC5keSwgc2l6ZSAqIDAuNSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkaWFtb25kJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMyID0gc2l6ZSAqIDAuNVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggKyByMiAtIHMyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgKyBzMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiArIHMyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgLSBzMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiAtIHMyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZG9udXQnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm90IGltcGxlbWVudGVkJylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV91cCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9kb3duJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGMueCAtIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9sZWZ0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54IC0gZHIyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9yaWdodCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggLSBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyBzaGFwZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTaWRlU3R5bGUgfSBmcm9tICcuL1NpZGVTdHlsZS5qcydcbmltcG9ydCB7IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlIH0gZnJvbSAnLi9TcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZS5qcydcbmltcG9ydCB7IGNsYXNzaWZpZXIgYXMgY2xGdW4sIGNvbG9yQ2xhc3NpZmllciBhcyBjY2xGdW4gfSBmcm9tICcuLi91dGlscy9zY2FsZS5qcydcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vbWFuaWZvbGQubmV0L2RvYy9tZmQ5L2V4YW1wbGVfX3RhbmFrYV9jb250b3Vycy5odG1cbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBUYW5ha2FTdHlsZSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpOm51bWJlcn0gdmFsdWUgRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIGNlbGxcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBicmVha3MgVGhlIGJyZWFrIHZhbHVlc1xuICAgICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNvbG9ycyBUaGUgY29sb3JzLCBvbmUgbW9yZSB0aGFuIHRoZSBicmVhayB2YWx1ZXNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT59XG4gICAgICovXG4gICAgc3RhdGljIGdldCh2YWx1ZSwgYnJlYWtzLCBjb2xvcnMsIG9wdHMgPSB7fSkge1xuXG4gICAgICAgIC8vc2hhZG93IGNvbG9yc1xuICAgICAgICBvcHRzLmNvbG9yRGFyayA9IG9wdHMuY29sb3JEYXJrIHx8ICcjMTExJ1xuICAgICAgICBvcHRzLmNvbG9yQnJpZ2h0ID0gb3B0cy5jb2xvckJyaWdodCB8fCAnI2RkZCdcblxuICAgICAgICAvKiogQHR5cGUgeyBmdW5jdGlvbihudW1iZXIsIG51bWJlcik6bnVtYmVyIH0gKi9cbiAgICAgICAgb3B0cy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChzaWRlVmFsdWUsIHJlc29sdXRpb24sIHopID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1pbldHID0gMSAqIHpcbiAgICAgICAgICAgIGNvbnN0IG1heFdHID0gNCAqIHpcbiAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSAobWF4V0cgLSBtaW5XRykgLyAzXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4obWluV0cgKyAoc2lkZVZhbHVlIC0gMSkgKiBzdGVwLCBtYXhXRylcbiAgICAgICAgfSlcblxuICAgICAgICAvL21ha2UgY2xhc3NpZmllclxuICAgICAgICBjb25zdCBjbGFzc2lmaWVyID0gY2xGdW4oYnJlYWtzKVxuICAgICAgICAvL21ha2UgY29sb3JzIHRhYmxlXG4gICAgICAgIGNvbnN0IGNvbG9yc0RpY3QgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIGNvbG9yc0RpY3RbaSArIFwiXCJdID0gY29sb3JzW2ldXG5cbiAgICAgICAgY29uc3QgY2VsbFN0eWxlID0gbmV3IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlKHtcbiAgICAgICAgICAgIGNvZGU6IGNlbGwgPT4gY2xhc3NpZmllcih2YWx1ZShjZWxsKSksXG4gICAgICAgICAgICBjb2xvcjogY29sb3JzRGljdFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGdldFNpZGVWYWx1ZSA9IChzaWRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjbDEgPSBzaWRlLmMxID8gY2xhc3NpZmllcih2YWx1ZShzaWRlLmMxKSkgOiAtMVxuICAgICAgICAgICAgY29uc3QgY2wyID0gc2lkZS5jMiA/IGNsYXNzaWZpZXIodmFsdWUoc2lkZS5jMikpIDogLTFcbiAgICAgICAgICAgIHJldHVybiBjbDEgLSBjbDJcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiBUaGUgc2lkZSBzdHlsZSwgZm9yIHRoZSBzaGFkb3cgZWZmZWN0ICovXG4gICAgICAgIGNvbnN0IHNpZGVTdHlsZSA9IG5ldyBTaWRlU3R5bGUoe1xuICAgICAgICAgICAgLy93aGl0ZSBvciBibGFjaywgZGVwZW5kaW5nIG9uIG9yaWVudGF0aW9uIGFuZCB2YWx1ZVxuICAgICAgICAgICAgY29sb3I6IChzaWRlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdiA9IGdldFNpZGVWYWx1ZShzaWRlKVxuICAgICAgICAgICAgICAgIGlmICh2ID09PSAwKSByZXR1cm5cbiAgICAgICAgICAgICAgICBpZiAoc2lkZS5vciA9PT0gJ3YnKSByZXR1cm4gdiA8IDAgPyBvcHRzLmNvbG9yQnJpZ2h0IDogb3B0cy5jb2xvckRhcmtcbiAgICAgICAgICAgICAgICByZXR1cm4gdiA8IDAgPyBvcHRzLmNvbG9yRGFyayA6IG9wdHMuY29sb3JCcmlnaHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvL3dpZHRoIGRlcGVuZHMgb24gdGhlIHZhbHVlLCB0aGF0IGlzIHRoZSBudW1iZXIgb2YgY2xhc3NlcyBvZiBkaWZmZXJlbmNlXG4gICAgICAgICAgICB3aWR0aDogKHNpZGUsIHJlc29sdXRpb24sIHopID0+IG9wdHMud2lkdGgoTWF0aC5hYnMoZ2V0U2lkZVZhbHVlKHNpZGUpKSwgcmVzb2x1dGlvbiwgeilcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gW2NlbGxTdHlsZSwgc2lkZVN0eWxlXVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRleHRTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0ZXh0IG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnRleHQgPSBvcHRzLnRleHQgfHwgKCgpID0+ICdYJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gXCJibGFja1wiKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGZvbnQgc2l6ZSBvZiBhIGNlbGwgaW4gZ2VvIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24pIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBUaGUgdGV4dCBmb250IGZhbWlseS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZvbnRGYW1pbHkgPSBvcHRzLmZvbnRGYW1pbHkgfHwgKCgpID0+ICdBcmlhbCcpXG5cbiAgICAgICAgLyoqIFRoZSB0ZXh0IGZvbnQgd2VpZ2h0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZm9udFdlaWdodCA9IG9wdHMuZm9udFdlaWdodCB8fCAoKCkgPT4gJ2JvbGQnKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcblxuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vZHJhdyB3aXRoIEhUTUwgY2FudmFzXG4gICAgICAgIC8vaW4gc2NyZWVuIGNvb3JkaW5hdGVzXG4gICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2dldCBjZWxsIHRleHRcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnRleHQgPyB0aGlzLnRleHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKHRleHQgPT0gdW5kZWZpbmVkIHx8IHRleHQgPT0gbnVsbCB8fCB0ZXh0ICsgJycgPT09ICcnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCkgY29udGludWVcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vZm9udCBzaXplXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBwaXhlbCB1bml0XG4gICAgICAgICAgICBjb25zdCBmb250U2l6ZVBpeCA9IHRoaXMuZm9udFNpemUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSAvIHpcbiAgICAgICAgICAgIGlmICghZm9udFNpemVQaXgpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vc2V0IGZvbnRcbiAgICAgICAgICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLmZvbnRGYW1pbHkgPyB0aGlzLmZvbnRGYW1pbHkoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdBcmlhbCdcbiAgICAgICAgICAgIGNvbnN0IGZvbnRXZWlnaHQgPSB0aGlzLmZvbnRXZWlnaHQgPyB0aGlzLmZvbnRXZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdib2xkJ1xuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5mb250ID0gZm9udFdlaWdodCArICcgJyArIGZvbnRTaXplUGl4ICsgJ3B4ICcgKyBmb250RmFtaWx5XG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgLy90ZXh0IHBvc2l0aW9uXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInXG4gICAgICAgICAgICBjb25zdCB0eCA9IGdlb0NhbnZhcy5nZW9Ub1BpeFgoY2VsbC54ICsgcmVzb2x1dGlvbiAqIDAuNSArIG9mZnNldC5keClcbiAgICAgICAgICAgIGNvbnN0IHR5ID0gZ2VvQ2FudmFzLmdlb1RvUGl4WShjZWxsLnkgKyByZXNvbHV0aW9uICogMC41ICsgb2Zmc2V0LmR5KSArIGZvbnRTaXplUGl4ICogMC4zIC8vaXQgc2hvdWxkIGJlIDAuNSBidXQgMC4zIHNlZW1zIHRvIHdvcmsgYmV0dGVyXG5cbiAgICAgICAgICAgIC8vZHJhdyB0aGUgdGV4dFxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsVGV4dCh0ZXh0LCB0eCwgdHkpXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGEgZnVuY3Rpb24gWzAsMV0tPnN0cmluZyBmb3IgY2hhcmFjdGVycyBsZWdlbmRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNoYXJzXG4gICAgICogQHBhcmFtIHsoZnVuY3Rpb24obnVtYmVyKTpudW1iZXIpfHVuZGVmaW5lZH0gc2NhbGVcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIHRleHRTY2FsZShjaGFycywgc2NhbGUgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbmIgPSBjaGFycy5sZW5ndGhcbiAgICAgICAgcmV0dXJuICh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoc2NhbGUpIHQgPSBzY2FsZSh0KVxuICAgICAgICAgICAgaWYgKHQgPT0gMCkgcmV0dXJuIFwiXCJcbiAgICAgICAgICAgIGlmICh0ID49IDEpIHJldHVybiBjaGFyc1tuYiAtIDFdXG4gICAgICAgICAgICByZXR1cm4gY2hhcnNbTWF0aC5mbG9vcih0ICogbmIpXVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKiBAdHlwZWRlZiB7XCJmaXJzdFwifFwiYm90dG9tXCJ8XCJjZW50ZXJcInxcInRvcFwifFwibGFzdFwifSBBbmNob3JNb2RlWUVudW0gKi9cblxuLyoqXG4gKiBTaG93IGNlbGwgYXMgdGltZXNlcmllcyBjaGFydFxuICogQ2FuIGJlIHVzZWQgZm9yIHNwYXJrbGluZSBtYXAgb2YgaHR0cHM6Ly9kYXRhZ2lzdGlwcy5oeXBvdGhlc2VzLm9yZy80ODhcbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lU2VyaWVzU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgY29sdW1ucyBvZiB0aGUgdGltZSBzZXJpZXMsIG9yZGVyZWQgaW4gY2hyb25vbG9naWNhbCBvcmRlci5cbiAgICAgICAgICogQHR5cGUge0FycmF5LjxzdHJpbmc+fSAqL1xuICAgICAgICB0aGlzLnRzID0gb3B0cy50c1xuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHNwZWNpZnlpbmcgd2hlbiBhIHZhbHVlIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIFwibm8gZGF0YVwiIGFuZCB0aHVzIG5vdCBpZ25vcmVkLiBUaGUgbGluZSB3aWxsIGhhdmUgYSBicmVhayBhdCB0aGVzZSB2YWx1ZXMuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcpOmJvb2xlYW59ICovXG4gICAgICAgIHRoaXMubm9EYXRhID0gb3B0cy5ub0RhdGEgfHwgKCh2KSA9PiB2ID09PSB1bmRlZmluZWQgfHwgdiA9PSBcIlwiIHx8IHYgPT09IG51bGwgfHwgaXNOYU4oK3YpKVxuXG4gICAgICAgIC8veFxuICAgICAgICAvKiogaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vZmZzZXRYID0gb3B0cy5vZmZzZXRYIHx8ICgoYywgciwgeikgPT4gMClcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoYywgciwgeikgPT4gcilcblxuICAgICAgICAvL3lcbiAgICAgICAgLyoqIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub2Zmc2V0WSA9IG9wdHMub2Zmc2V0WSB8fCAoKGMsIHIsIHopID0+IDApXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8ICgoYywgciwgeikgPT4gcilcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpBbmNob3JNb2RlWUVudW19ICovXG4gICAgICAgIHRoaXMuYW5jaG9yTW9kZVkgPSBvcHRzLmFuY2hvck1vZGVZIHx8ICgoYywgciwgeikgPT4gXCJjZW50ZXJcIilcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBsaW5lLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubGluZVdpZHRoID0gb3B0cy5saW5lV2lkdGggfHwgKCh2LCByLCBzLCB6KSA9PiAxLjUgKiB6KVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNoYXJ0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiBcImJsYWNrXCIpIC8vKGMscix6LHZzKSA9PiB7fVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcblxuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vY29tcHV0ZSBjZWxsIGFtcGxpdHVkZVxuICAgICAgICBjb25zdCBnZXRBbXBsaXR1ZGUgPSBjID0+IHtcbiAgICAgICAgICAgIGxldCBtaW4sIG1heFxuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY1t0XTtcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgICAgICBpZiAobWluID09IHVuZGVmaW5lZCB8fCB2YWwgPCBtaW4pIG1pbiA9IHZhbFxuICAgICAgICAgICAgICAgIGlmIChtYXggPT0gdW5kZWZpbmVkIHx8IHZhbCA+IG1heCkgbWF4ID0gdmFsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWluID09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIG1heCAtIG1pblxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wdXRlIG1heCBhbXBsaXR1ZGVcbiAgICAgICAgbGV0IGFtcE1heFxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBjb25zdCBhbXAgPSBnZXRBbXBsaXR1ZGUoYylcbiAgICAgICAgICAgIGlmIChhbXAgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKGFtcE1heCA9PSB1bmRlZmluZWQgfHwgYW1wID4gYW1wTWF4KSBhbXBNYXggPSBhbXBcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFtcE1heCkgcmV0dXJuXG5cbiAgICAgICAgY29uc3QgbmIgPSB0aGlzLnRzLmxlbmd0aFxuXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9IFwiYnV0dFwiXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcblxuICAgICAgICAgICAgLy9saW5lIHdpZHRoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCB3RyA9IHRoaXMubGluZVdpZHRoID8gdGhpcy5saW5lV2lkdGgoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vbGluZSBjb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXG5cblxuICAgICAgICAgICAgLy94XG4gICAgICAgICAgICBjb25zdCBvZmZYID0gdGhpcy5vZmZzZXRYID8gdGhpcy5vZmZzZXRYKGMsIHJlc29sdXRpb24sIHopIDogMFxuICAgICAgICAgICAgaWYgKG9mZlggPT0gdW5kZWZpbmVkIHx8IGlzTmFOKG9mZlgpKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGggPyB0aGlzLndpZHRoKGMsIHJlc29sdXRpb24sIHopIDogcmVzb2x1dGlvblxuICAgICAgICAgICAgaWYgKHcgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHcpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3lcbiAgICAgICAgICAgIGNvbnN0IG9mZlkgPSB0aGlzLm9mZnNldFkgPyB0aGlzLm9mZnNldFkoYywgcmVzb2x1dGlvbiwgeikgOiAwXG4gICAgICAgICAgICBpZiAob2ZmWSA9PSB1bmRlZmluZWQgfHwgaXNOYU4ob2ZmWSkpIGNvbnRpbnVlXG4gICAgICAgICAgICBjb25zdCBoID0gdGhpcy5oZWlnaHQgPyB0aGlzLmhlaWdodChjLCByZXNvbHV0aW9uLCB6KSA6IHJlc29sdXRpb25cbiAgICAgICAgICAgIGlmIChoID09IHVuZGVmaW5lZCB8fCBpc05hTihoKSkgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IGFuY2hZID0gdGhpcy5hbmNob3JNb2RlWSA/IHRoaXMuYW5jaG9yTW9kZVkoYywgcmVzb2x1dGlvbiwgeikgOiBcImNlbnRlclwiXG4gICAgICAgICAgICBpZiAoIWFuY2hZKSBjb250aW51ZVxuXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHdHXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBhbmNob3IgWSBmaWd1cmVzXG4gICAgICAgICAgICBsZXQgdmFsMCwgeTBcbiAgICAgICAgICAgIGlmIChhbmNoWSA9PT0gXCJmaXJzdFwiKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgZmlyc3QgdmFsdWVcbiAgICAgICAgICAgICAgICB2YWwwID0gY1t0aGlzLnRzWzBdXVxuICAgICAgICAgICAgICAgIHkwID0gMFxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gXCJsYXN0XCIpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBsYXN0IHZhbHVlXG4gICAgICAgICAgICAgICAgdmFsMCA9IGNbdGhpcy50c1t0aGlzLnRzLmxlbmd0aCAtIDFdXVxuICAgICAgICAgICAgICAgIHkwID0gMFxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gXCJib3R0b21cIikge1xuICAgICAgICAgICAgICAgIC8vZ2V0IG1pblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSArY1t0XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwwID09IHVuZGVmaW5lZCB8fCB2YWwgPCB2YWwwKSB2YWwwID0gdmFsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHkwID0gMFxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gXCJ0b3BcIikge1xuICAgICAgICAgICAgICAgIC8vZ2V0IG1heFxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSArY1t0XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwwID09IHVuZGVmaW5lZCB8fCB2YWwgPiB2YWwwKSB2YWwwID0gdmFsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHkwID0gcmVzb2x1dGlvblxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gXCJjZW50ZXJcIikge1xuICAgICAgICAgICAgICAgIC8vZ2V0IG1pbiBhbmQgbWF4XG4gICAgICAgICAgICAgICAgbGV0IG1pbiwgbWF4XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNbdF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICBpZiAobWluID09IHVuZGVmaW5lZCB8fCB2YWwgPCBtaW4pIG1pbiA9IHZhbFxuICAgICAgICAgICAgICAgICAgICBpZiAobWF4ID09IHVuZGVmaW5lZCB8fCB2YWwgPiBtYXgpIG1heCA9IHZhbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWwwID0gKCttYXggKyArbWluKSAqIDAuNVxuICAgICAgICAgICAgICAgIHkwID0gcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJVbmV4cGVjdGVkIGFuY2hvck1vZGVZOiBcIiArIGFuY2hZKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKi9kcmF3IGxpbmVcbiAgICAgICAgICAgIGlmICh2YWwwID09IHVuZGVmaW5lZCB8fCBpc05hTih2YWwwKSkgY29udGludWVcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY29uc3Qgc1ggPSB3IC8gKG5iIC0gMSlcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNbdGhpcy50c1tpXV1cbiAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCB8fCBpc05hTih2YWwpKSBicmVha1xuICAgICAgICAgICAgICAgIGlmIChpID09IDApXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oYy54ICsgaSAqIHNYICsgb2ZmWCwgYy55ICsgeTAgKyAodmFsIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oYy54ICsgaSAqIHNYICsgb2ZmWCwgYy55ICsgeTAgKyAodmFsIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKSovXG5cblxuICAgICAgICAgICAgLy9kcmF3IGxpbmUsIHNlZ21lbnQgYnkgc2VnbWVudFxuICAgICAgICAgICAgY29uc3Qgc1ggPSB3IC8gKG5iIC0gMSlcblxuICAgICAgICAgICAgLy9oYW5kbGUgZmlyc3QgcG9pbnRcbiAgICAgICAgICAgIGxldCB2MCA9IGNbdGhpcy50c1swXV1cbiAgICAgICAgICAgIGlmICghdGhpcy5ub0RhdGEodjApKSB7XG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGMueCArIG9mZlgsIGMueSArIHkwICsgKHYwIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2codjAsIGlzTmFOKHYwKSlcblxuICAgICAgICAgICAgbGV0IHYxXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2MSA9IGNbdGhpcy50c1tpXV1cblxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IGZyb20gdjAgdG8gdjFcblxuICAgICAgICAgICAgICAgIC8vYm90aCBwb2ludHMgJ25vIGRhdGEnXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9EYXRhKHYwKSAmJiB0aGlzLm5vRGF0YSh2MSkpIHtcblxuICAgICAgICAgICAgICAgICAgICAvL3NlY29uZCBwb2ludCAnbm8gZGF0YSdcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm5vRGF0YSh2MCkgJiYgdGhpcy5ub0RhdGEodjEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcblxuICAgICAgICAgICAgICAgICAgICAvL2ZpcnN0IHBvaW50ICdubyBkYXRhJ1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub0RhdGEodjApICYmICF0aGlzLm5vRGF0YSh2MSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggKyBpICogc1ggKyBvZmZYLCBjLnkgKyB5MCArICh2MSAtIHZhbDApICogaCAvIGFtcE1heCArIG9mZlkpXG5cbiAgICAgICAgICAgICAgICAgICAgLy9ib3RoIHBvaW50cyBoYXZlIGRhdGE6IHRyYWNlIGxpbmVcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyBpICogc1ggKyBvZmZYLCBjLnkgKyB5MCArICh2MSAtIHZhbDApICogaCAvIGFtcE1heCArIG9mZlkpXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgaXQgaXMgdGhlIGxhc3QgcG9pbnQsIHN0cm9rZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBuYiAtIDEpIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdjAgPSB2MVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmQsIGlmIGFueVxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG5cbn1cblxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBpbml0U2hhZGVyUHJvZ3JhbSwgY3JlYXRlU2hhZGVyIH0gZnJvbSAnLi93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdkMy1jb2xvcidcblxuLyoqXG4gKiBFdmVyeXRoaW5nIHRvIGVhc2lseSBkcmF3IGNvbG9yZWQgc3F1YXJlcyB3aXRoIHdlYkdMLlxuICogQWxsIHRoZSBzYW1lIHNpemUsIGJ1dCBkaWZmZXJlbnQgZmlsbCBjb2xvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkdMU3F1YXJlQ29sb3Jpbmcge1xuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZ2wsIHNpemVQaXgpIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsXG4gICAgICAgIHRoaXMuc2l6ZVBpeCA9IHNpemVQaXggfHwgMTAuMFxuXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKFxuICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICBjcmVhdGVTaGFkZXIoXG4gICAgICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICAgICAgZ2wuVkVSVEVYX1NIQURFUixcbiAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XG4gICAgICAgICAgICB1bmlmb3JtIGZsb2F0IHNpemVQaXg7XG4gICAgICAgICAgICB1bmlmb3JtIG1hdDMgbWF0O1xuICAgICAgICAgICAgYXR0cmlidXRlIHZlYzQgY29sb3I7XG4gICAgICAgICAgICB2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuICAgICAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQobWF0ICogdmVjMyhwb3MsIDEuMCksIDEuMCk7XG4gICAgICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgICAgIHZDb2xvciA9IGNvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGBcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjcmVhdGVTaGFkZXIoXG4gICAgICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICAgICAgZ2wuRlJBR01FTlRfU0hBREVSLFxuICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuICAgICAgICAgICAgdmFyeWluZyB2ZWM0IHZDb2xvcjtcbiAgICAgICAgICAgIHZvaWQgbWFpbih2b2lkKSB7XG4gICAgICAgICAgICAgICAgdmVjNCB2Q29sb3JfID0gdkNvbG9yIC8gMjU1LjA7XG4gICAgICAgICAgICAgICAgdkNvbG9yX1szXSA9IDI1NS4wICogdkNvbG9yX1szXTtcbiAgICAgICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSB2Q29sb3JfO1xuICAgICAgICAgICAgfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSlcblxuICAgICAgICAvL2J1ZmZlciBkYXRhXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIgPSBbXVxuICAgICAgICB0aGlzLmNvbG9yc0J1ZmZlciA9IFtdXG4gICAgfVxuXG4gICAgLyoqIEFkZCBkYXRhIHRvIHZlcnRpY2VzL3NpemUvY29sb3IgYnVmZmVycyBmb3IgY29sb3Igc3F1YXJlcyBkcmF3aW5nICovXG4gICAgYWRkUG9pbnREYXRhKHhDLCB5QywgY29sKSB7XG4gICAgICAgIC8vY29udmVydCBjb2xvclxuICAgICAgICBjb25zdCBjYyA9IGNvbG9yKGNvbClcbiAgICAgICAgLy9jb25zdCBjYyA9IHtyOjQ1LGc6ODcsYjo5OCxvcGFjaXR5OjAuOX1cbiAgICAgICAgaWYgKCFjYykgcmV0dXJuXG5cbiAgICAgICAgLy92ZXJ0aWNlc1xuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyLnB1c2goeEMsIHlDKVxuICAgICAgICAvL2NvbG9yXG4gICAgICAgIHRoaXMuY29sb3JzQnVmZmVyLnB1c2goY2MuciwgY2MuZywgY2MuYiwgY2Mub3BhY2l0eSlcbiAgICB9XG5cbiAgICBhZGRQb2ludERhdGEyKHhDLCB5QywgciwgZywgYiwgb3BhY2l0eSkge1xuICAgICAgICAvL3ZlcnRpY2VzXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIucHVzaCh4QywgeUMpXG4gICAgICAgIC8vY29sb3JcbiAgICAgICAgdGhpcy5jb2xvcnNCdWZmZXIucHVzaChyLCBnLCBiLCBvcGFjaXR5KVxuICAgIH1cblxuICAgIC8qKiAgKi9cbiAgICBkcmF3KHRyYW5zZm9NYXQpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXG5cbiAgICAgICAgLy92ZXJ0aWNlIGRhdGFcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh0aGlzLnZlcnRpY2VzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCAncG9zJylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgMiwgLy9udW1Db21wb25lbnRzXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcbiAgICAgICAgICAgIDAsIC8vc3RyaWRlXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XG4gICAgICAgIClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pXG5cbiAgICAgICAgLy9jb2xvciBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5jb2xvcnNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcbiAgICAgICAgdmFyIGNvbG9yID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnY29sb3InKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGNvbG9yLCA0LCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGNvbG9yKVxuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3NpemVQaXgnKSwgMS4wICogdGhpcy5zaXplUGl4KVxuXG4gICAgICAgIC8vdHJhbnNmb3JtYXRpb25cbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnbWF0JyksIGZhbHNlLCBuZXcgRmxvYXQzMkFycmF5KHRyYW5zZm9NYXQpKVxuXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZGVwdGggdGVzdFxuICAgICAgICAvL2dsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciBiaXRcbiAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVClcbiAgICAgICAgLy8gU2V0IHRoZSB2aWV3IHBvcnRcbiAgICAgICAgLy9nbC52aWV3cG9ydCgwLCAwLCBjZy53LCBjZy5oKTtcblxuICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlBPSU5UUywgMCwgdGhpcy52ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5cbi8qKlxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXG4gKiBUaGUgY29sb3IgaW50ZXJwb2xhdGlvbiBpcyBjb21wdXRlZCBpbiB0aGUgZnJhZ21lbnQgc2hhZGVyIHByb2dyYW0sIGJ5IHRoZSBHUFUsIHRodXMgaXQgaXMgbGVzcyBmbGV4aWJsZSBidXQgZmFzdGVyLlxuICovXG5leHBvcnQgY2xhc3MgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkIHtcbiAgICAvL3NlZTpcbiAgICAvL2h0dHBzOi8vd2ViZ2xmdW5kYW1lbnRhbHMub3JnL3dlYmdsL2xlc3NvbnMvZnIvd2ViZ2wtc2hhZGVycy1hbmQtZ2xzbC5odG1sI2xlcy11bmlmb3Jtcy1kYW5zLWxlcy1zaGFkZXJzLWRlLXZlcnRleFxuICAgIC8vaHR0cHM6Ly90aGVib29rb2ZzaGFkZXJzLmNvbS9nbG9zc2FyeS8/c2VhcmNoPW1peFxuICAgIC8vaHR0cHM6Ly90aGVib29rb2ZzaGFkZXJzLmNvbS8wNi9cbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vZ2xvc3NhcnkvXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gZ2xcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxTdHJpbmc+fSBjb2xvcnNcbiAgICAgKiBAcGFyYW0ge3tmdW46c3RyaW5nLGFscGhhOm51bWJlcn19IHN0cmV0Y2hpbmdcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVBpeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfHVuZGVmaW5lZH0gZ2xvYmFsT3BhY2l0eVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGdsLCBjb2xvcnMsIHN0cmV0Y2hpbmcsIHNpemVQaXggPSAxMCwgZ2xvYmFsT3BhY2l0eSA9IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiogQHR5cGUge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gKi9cbiAgICAgICAgdGhpcy5nbCA9IGdsXG4gICAgICAgIC8vZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCB0cnVlKTtcbiAgICAgICAgLy9nbC5ibGVuZEZ1bmMoZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcbiAgICAgICAgLy9nbC5ibGVuZEZ1bmMoZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcblxuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKFxuICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICBnbC5WRVJURVhfU0hBREVSLFxuICAgICAgICAgICAgYFxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XG4gICAgICAgIHVuaWZvcm0gZmxvYXQgc2l6ZVBpeDtcbiAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcblxuICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgdDtcbiAgICAgICAgdmFyeWluZyBmbG9hdCB2dDtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xuICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgdnQgPSB0O1xuICAgICAgICB9XG4gICAgICBgXG4gICAgICAgIClcblxuICAgICAgICAvL3ByZXBhcmUgZnJhZ21lbnQgc2hhZGVyIGNvZGVcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcbiAgICAgICAgbGV0IGZzaFN0cmluZyA9XG4gICAgICAgICAgICAnJyArXG4gICAgICAgICAgICAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuJyArXG4gICAgICAgICAgICAndmFyeWluZyBmbG9hdCB2dDtcXG4nICtcbiAgICAgICAgICAgICd1bmlmb3JtIGZsb2F0IGFscGhhO1xcbicgK1xuICAgICAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSBbXVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSBvdXQucHVzaCgndW5pZm9ybSB2ZWM0IGMnICsgaSArICc7XFxuJylcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0LmpvaW4oJycpXG4gICAgICAgICAgICB9KSgpICtcbiAgICAgICAgICAgIC8vc3RhcnQgdGhlIG1haW4gZnVuY3Rpb24sIGFwcGx5IHRoZSBzdHJldGNoaW5nIG9mIHRcbiAgICAgICAgICAgICd2b2lkIG1haW4odm9pZCkge1xcbidcblxuICAgICAgICBpZiAoc3RyZXRjaGluZykge1xuICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdwb3cnKVxuICAgICAgICAgICAgICAgIC8vc1BvdyA9ICh0LCBhbHBoYSA9IDMpID0+IE1hdGgucG93KHQsIGFscGhhKTtcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSBwb3codnQsIGFscGhhKTtcXG4nXG4gICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAncG93SW52JylcbiAgICAgICAgICAgICAgICAvL3NQb3dSZXYgPSAodCwgYWxwaGEgPSAzKSA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIDEgLyBhbHBoYSk7XG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gMS4wLXBvdygxLjAtdnQsIDEuMC9hbHBoYSk7XFxuJ1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2V4cCcpXG4gICAgICAgICAgICAgICAgLy9zRXhwID0gKHQsIGFscGhhID0gMykgPT4gYWxwaGEgPT0gMCA/IHQgOiAoTWF0aC5leHAodCAqIGFscGhhKSAtIDEpIC8gKE1hdGguZXhwKGFscGhhKSAtIDEpO1xuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxuICAgICAgICAgICAgICAgICAgICBzdHJldGNoaW5nLmFscGhhID09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGZsb2F0IHQgPSB2dDtgXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcgICBmbG9hdCB0ID0gKGV4cCh2dCAqIGFscGhhKSAtIDEuMCkgLyAoZXhwKGFscGhhKSAtIDEuMCk7XFxuJ1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2xvZycpXG4gICAgICAgICAgICAgICAgLy9zRXhwUmV2ID0gKHQsIGFscGhhID0gMykgPT4gYWxwaGEgPT0gMCA/IHQgOiAxIC0gKDEgLyBhbHBoYSkgKiBNYXRoLmxvZyhNYXRoLmV4cChhbHBoYSkgKiAoMSAtIHQpICsgdCk7XG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XG4gICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hpbmcuYWxwaGEgPT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZmxvYXQgdCA9IHZ0O2BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJyAgIGZsb2F0IHQgPSAxLjAgLSAoMS4wIC8gYWxwaGEpICogbG9nKGV4cChhbHBoYSkgKiAoMS4wIC0gdnQpICsgdnQpO1xcbidcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgLy9pZiAoYWxwaGEgPT0gMCkgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHZ0O1xcbidcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChhbHBoYSA9PSAxKSByZXR1cm4gTWF0aC5zcXJ0KDIgKiB0IC0gdCAqIHQpO1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSBzcXJ0KHZ0ICogKDIuMCAtIHZ0KSk7XFxuJ1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IGEgPSBhbHBoYSAvICgxIC0gYWxwaGEpO1xuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyB0ICogKDIgLyBhICsgMiAtIHQpKSAtIDEgLyBhO1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCBhID0gYWxwaGEgLyAoMS4wIC0gYWxwaGEpO1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAgIGZsb2F0IHQgPSBzcXJ0KDEuMCAvIChhICogYSkgKyB2dCAqICggMi4wL2EgKyAyLjAgLSB2dCApKSAtIDEuMCAvIGE7XFxuJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2NpcmNsZUludicpIHtcbiAgICAgICAgICAgICAgICAvLyAxIC0gc0NpcmNsZUxvdygxIC0gdCwgYWxwaGEpXG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgLy9pZiAoYWxwaGEgPT0gMCkgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHZ0O1xcbidcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChhbHBoYSA9PSAxKSByZXR1cm4gTWF0aC5zcXJ0KDIgKiB0IC0gdCAqIHQpO1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSAxLjAgLSBzcXJ0KCgxLjAgLSB2dCkgKiAoMS4wICsgdnQpKTtcXG4nXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgYSA9IGFscGhhIC8gKDEgLSBhbHBoYSk7XG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE1hdGguc3FydCgxIC8gKGEgKiBhKSArICgyICogdCkgLyBhICsgMiAqIHQgLSB0ICogdCkgLSAxIC8gYTtcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgYSA9IGFscGhhIC8gKDEuMCAtIGFscGhhKTtcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCB0ID0gMS4wIC0gc3FydCgxLjAgLyAoYSAqIGEpICsgKDEuMC12dCkgKiAoIDIuMC9hICsgMS4wICsgdnQgKSkgKyAxLjAgLyBhO1xcbidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgc3RyZXRjaGluZyBmdW5jdGlvbiBjb2RlOiAnICsgc3RyZXRjaGluZy5mdW4pXG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaG9vc2UgaW5pdGlhbCBhbmQgZmluYWwgY29sb3JzLCBhbmQgYWRqdXN0IHQgdmFsdWVcbiAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPT0gMSkgZnNoU3RyaW5nICs9ICcgICB2ZWM0IGNJPWMwO1xcbiAgIHZlYzQgY0Y9YzA7XFxuJ1xuICAgICAgICBlbHNlIGlmIChjb2xvcnMubGVuZ3RoID09IDIpIGZzaFN0cmluZyArPSAnICAgdmVjNCBjST1jMDtcXG4gICB2ZWM0IGNGPWMxO1xcbidcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuYiA9IGNvbG9ycy5sZW5ndGggLSAxXG4gICAgICAgICAgICBjb25zdCBuYnMgPSBuYiArICcuMCdcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgdmVjNCBjSTtcXG4nXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0Y7XFxuJ1xuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBpZih0PDEuMC8nICsgbmJzICsgJykgeyBjST1jMDsgY0Y9YzE7IHQ9dConICsgbmJzICsgJzsgfVxcbidcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbmI7IGkrKylcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAgICAgJyAgIGVsc2UgaWYodDwnICtcbiAgICAgICAgICAgICAgICAgICAgaSArXG4gICAgICAgICAgICAgICAgICAgICcuMC8nICtcbiAgICAgICAgICAgICAgICAgICAgbmJzICtcbiAgICAgICAgICAgICAgICAgICAgJykgeyBjST1jJyArXG4gICAgICAgICAgICAgICAgICAgIChpIC0gMSkgK1xuICAgICAgICAgICAgICAgICAgICAnOyBjRj1jJyArXG4gICAgICAgICAgICAgICAgICAgIGkgK1xuICAgICAgICAgICAgICAgICAgICAnOyB0PScgK1xuICAgICAgICAgICAgICAgICAgICBuYnMgK1xuICAgICAgICAgICAgICAgICAgICAnKnQtJyArXG4gICAgICAgICAgICAgICAgICAgIChpIC0gMSkgK1xuICAgICAgICAgICAgICAgICAgICAnLjA7IH1cXG4nXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAnICAgZWxzZSB7IGNJPWMnICsgKG5iIC0gMSkgKyAnOyBjRj1jJyArIG5iICsgJzsgdD0nICsgbmJzICsgJyp0LScgKyAobmIgLSAxKSArICcuMDsgfVxcbidcbiAgICAgICAgfVxuXG4gICAgICAgIC8vb25lIHNpbmdsZSBjb2xvclxuICAgICAgICBpZiAoY29sb3JzLmxlbmd0aCA9PSAxKSBmc2hTdHJpbmcgKz0gJyAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoYzBbMF0sIGMwWzFdLCBjMFsyXSwgYzBbM10pO31cXG4nXG4gICAgICAgIC8vc2V0IGludGVycG9sYXRlZCBjb2xvciwgYmV0d2VlbiBpbml0aWFsIGFuZCBmaW5hbCBvbmVcbiAgICAgICAgZWxzZSBmc2hTdHJpbmcgKz0gJyAgIGdsX0ZyYWdDb2xvciA9IG1peChjSSwgY0YsIHQpO31cXG4nXG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyhmc2hTdHJpbmcpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cbiAgICAgICAgY29uc3QgZlNoYWRlciA9IGNyZWF0ZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmc2hTdHJpbmcpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFByb2dyYW19ICovXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKGdsLCB2U2hhZGVyLCBmU2hhZGVyKVxuICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSlcblxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICAvL1RPRE86IGJ1ZyBoZXJlLiBTZWVtcyB0byBiZSBsaW1pdGVkIHRvIHNvbWUgdGhyZXNob2xkIHZhbHVlIChhcm91bmQgMjUwKS5cbiAgICAgICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXG5cbiAgICAgICAgLy9zdHJldGNoaW5nIGFscGhhIGZhY3RvclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2FscGhhJyksIHN0cmV0Y2hpbmcgPyAxLjAgKiBzdHJldGNoaW5nLmFscGhhIDogMC4wKVxuXG4gICAgICAgIC8vY29sb3JzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY29sb3IoY29sb3JzW2ldKVxuXG4gICAgICAgICAgICBsZXQgb3BhY2l0eSA9IGMub3BhY2l0eVxuICAgICAgICAgICAgaWYgKGMub3BhY2l0eSA9PSAxICYmIGdsb2JhbE9wYWNpdHkgIT0gdW5kZWZpbmVkKSBvcGFjaXR5ID0gZ2xvYmFsT3BhY2l0eVxuXG4gICAgICAgICAgICBnbC51bmlmb3JtNGZ2KGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdjJyArIGkpLCBbXG4gICAgICAgICAgICAgICAgK2MuciAvIDI1NS4wLFxuICAgICAgICAgICAgICAgICtjLmcgLyAyNTUuMCxcbiAgICAgICAgICAgICAgICArYy5iIC8gMjU1LjAsXG4gICAgICAgICAgICAgICAgK29wYWNpdHksXG4gICAgICAgICAgICBdKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqICAqL1xuICAgIGRyYXcodmVydGljZXNCdWZmZXIsIHRCdWZmZXIsIHRyYW5zZm9NYXQpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnByb2dyYW1cblxuICAgICAgICAvL3ZlcnRpY2UgZGF0YVxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3BvcycpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxuICAgICAgICAgICAgZmFsc2UsIC8vbm9ybWFsaXNlXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxuICAgICAgICAgICAgMCAvL29mZnNldFxuICAgICAgICApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxuXG4gICAgICAgIC8vdCBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodEJ1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICBjb25zdCB0ID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3QnKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHQsIDEsIGdsLkZMT0FULCBmYWxzZSwgMCwgMClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodClcblxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdtYXQnKSwgZmFsc2UsIG5ldyBGbG9hdDMyQXJyYXkodHJhbnNmb01hdCkpXG5cbiAgICAgICAgLy8gRW5hYmxlIHRoZSBkZXB0aCB0ZXN0XG4gICAgICAgIC8vZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgICAgICAvLyBDbGVhciB0aGUgY29sb3IgYnVmZmVyIGJpdFxuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKVxuICAgICAgICAvLyBTZXQgdGhlIHZpZXcgcG9ydFxuICAgICAgICAvL2dsLnZpZXdwb3J0KDAsIDAsIGNnLncsIGNnLmgpO1xuXG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCB2ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5cbi8qKlxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXG4gKiBDb2xvciBiYXNlZCBvbiBjYXRlZ29yaWVzLlxuICovXG5leHBvcnQgY2xhc3MgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjb2xvcnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb2xvcnMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBjb2xvcnNcblxuICAgICAgICAvKiogVmVjdG9yIHNoYWRlciBwcm9ncmFtXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudnNoU3RyaW5nID0gYFxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XG4gICAgICAgIHVuaWZvcm0gZmxvYXQgc2l6ZVBpeDtcbiAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcblxuICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgaTtcbiAgICAgICAgdmFyeWluZyBmbG9hdCB2aTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xuICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgdmkgPSBpO1xuICAgICAgICB9XG4gICAgICAgIGBcblxuICAgICAgICAvL3ByZXBhcmUgZnJhZ21lbnQgc2hhZGVyIGNvZGVcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcbiAgICAgICAgY29uc3Qgb3V0ID0gW11cbiAgICAgICAgb3V0LnB1c2goJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xcbnZhcnlpbmcgZmxvYXQgdmk7XFxuJylcbiAgICAgICAgLy9hZGQgY29sb3IgdW5pZm9ybXNcbiAgICAgICAgb3V0LnB1c2goJ3VuaWZvcm0gdmVjNCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA+IDApIG91dC5wdXNoKCcsJylcbiAgICAgICAgICAgIG91dC5wdXNoKCcgYycgKyBpKVxuICAgICAgICB9XG4gICAgICAgIG91dC5wdXNoKCc7XFxuJylcbiAgICAgICAgLy9zdGFydCB0aGUgbWFpbiBmdW5jdGlvblxuICAgICAgICBvdXQucHVzaCgndm9pZCBtYWluKHZvaWQpIHtcXG4nKVxuICAgICAgICAvL2Nob29zZSBjb2xvciBpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA+IDApIG91dC5wdXNoKCdlbHNlICcpXG4gICAgICAgICAgICBvdXQucHVzaCgnaWYodmk9PScpXG4gICAgICAgICAgICBvdXQucHVzaChpKVxuICAgICAgICAgICAgb3V0LnB1c2goJy4wKSBnbF9GcmFnQ29sb3IgPSB2ZWM0KGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMF0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMV0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMl0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbM10pO1xcbicpXG4gICAgICAgIH1cbiAgICAgICAgb3V0LnB1c2goJ2Vsc2UgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApO1xcbn0nKVxuICAgICAgICAvKiogRnJhZ21lbnQgc2hhZGVyIHByb2dyYW1cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5mc2hTdHJpbmcgPSBvdXQuam9pbignJylcbiAgICB9XG5cbiAgICAvKiogICovXG4gICAgZHJhdyhnbCwgdmVydGljZXNCdWZmZXIsIGlCdWZmZXIsIHRyYW5zZm9NYXQsIHNpemVQaXggPSAxMCkge1xuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB0aGlzLnZzaFN0cmluZylcblxuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCBmU2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIHRoaXMuZnNoU3RyaW5nKVxuXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfSAqL1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gaW5pdFNoYWRlclByb2dyYW0oZ2wsIHZTaGFkZXIsIGZTaGFkZXIpXG4gICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSlcblxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXG5cbiAgICAgICAgLy9jb2xvcnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNvbG9yKHRoaXMuY29sb3JzW2ldKVxuICAgICAgICAgICAgZ2wudW5pZm9ybTRmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ2MnICsgaSksIFtcbiAgICAgICAgICAgICAgICArYy5yIC8gMjU1LjAsXG4gICAgICAgICAgICAgICAgK2MuZyAvIDI1NS4wLFxuICAgICAgICAgICAgICAgICtjLmIgLyAyNTUuMCxcbiAgICAgICAgICAgICAgICArYy5vcGFjaXR5LFxuICAgICAgICAgICAgXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdmVydGljZSBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAncG9zJylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgMiwgLy9udW1Db21wb25lbnRzXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcbiAgICAgICAgICAgIDAsIC8vc3RyaWRlXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XG4gICAgICAgIClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pXG5cbiAgICAgICAgLy9pIGRhdGFcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShpQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IGkgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnaScpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoaSwgMSwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKVxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShpKVxuXG4gICAgICAgIC8vdHJhbnNmb3JtYXRpb25cbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcblxuICAgICAgICAvLyBFbmFibGUgdGhlIGRlcHRoIHRlc3RcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBjb2xvciBidWZmZXIgYml0XG4gICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XG4gICAgICAgIC8vZ2wudmlld3BvcnQoMCwgMCwgY2cudywgY2cuaCk7XG5cbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHZlcnRpY2VzQnVmZmVyLmxlbmd0aCAvIDIpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBsb2FkSW1hZ2UgfSBmcm9tICcuLi91dGlscy91dGlscy5qcydcblxuLy9cblxuLyoqXG4gKiBMb2FkIGNoZXJub2ZmIGltYWdlc1xuICogU2VlIGZvciBleGFtcGxlOiBodHRwczovL2dpdGh1Yi5jb20vamdhZmZ1cmkvY2hlcm5vZmYtZmFjZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBvdXQgXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBcbiAqIEBwYXJhbSB7ZnVuY3Rpb258dW5kZWZpbmVkfSBjYWxsYmFjayBcbiAqIEByZXR1cm5zIFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZENoZXJub2ZmRmFjZXNJbWFnZXMob3V0LCBiYXNlVVJMLCBjYWxsYmFjayA9IHVuZGVmaW5lZCkge1xuICAgIG91dCA9IG91dCB8fCB7fVxuICAgIGZvciAobGV0IHMgb2YgW1wiZlwiLCBcIm1cIl0pXG4gICAgICAgIGZvciAobGV0IGEgb2YgW1wieVwiLCBcIm1cIiwgXCJvXCJdKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMjsgaSsrKVxuICAgICAgICAgICAgICAgIG91dFtzICsgYSArIGldID0gYXdhaXQgbG9hZEltYWdlKGJhc2VVUkwgKyAocyArIGEgKyBpKSArIFwiLnBuZ1wiKVxuICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKVxuICAgIHJldHVybiBvdXRcbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgZXh0ZW50LCBtYXggfSBmcm9tIFwiZDMtYXJyYXlcIlxuaW1wb3J0IHsgc2NhbGVRdWFudGlsZSB9IGZyb20gXCJkMy1zY2FsZVwiXG5cbi8qKlxuICogQSBzY2FsZSBpcyBzaW1wbHkgYSBmdW5jdGlvbiB0aGF0IG1hcCBhIGRvbWFpbiB0byBhIHJhbmdlLlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfSBTY2FsZSAqL1xuXG4vKipcbiAqIEEgc2NhbGUgd2hvc2UgcmFuZ2UgaXMgYSBjb2xvciAoc3RyaW5nKS5cbiogQHR5cGVkZWYge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSBDb2xvclNjYWxlICovXG5cblxuLyoqXG4gKiBAbW9kdWxlIHV0aWxzXG4gKi9cblxuXG4vKipcbiAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIHZpZXcgc2NhbGUgLSBjb250aW51b3VzIG9yIGRpc2NyZXRlXG4gKiBcbiAqIEBwYXJhbSB7eyB2YWx1ZUZ1bmN0aW9uOmZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsKTpudW1iZXIsIG1pblZhbHVlPzpudW1iZXIsIG1pblNpemVQaXg/Om51bWJlciwgbWF4U2l6ZUZhY3Rvcj86bnVtYmVyLCByYW5nZT86W251bWJlciwgbnVtYmVyXSwgZG9tYWluPzpbbnVtYmVyLCBudW1iZXJdLCBzdHJldGNoaW5nPzpmdW5jdGlvbihudW1iZXIpOm51bWJlciwgY2xhc3NOdW1iZXI/Om51bWJlcn19IG9wdHMgXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPik6U2NhbGV9XG4gKi9cbmV4cG9ydCBjb25zdCB2aWV3U2NhbGUgPSAob3B0cykgPT4ge1xuICAgIGNvbnN0IHZhbHVlRnVuY3Rpb24gPSBvcHRzLnZhbHVlRnVuY3Rpb25cbiAgICBjb25zdCBtaW5WYWx1ZSA9IG9wdHMubWluVmFsdWUgfHwgMFxuICAgIGNvbnN0IG1pblNpemVQaXggPSBvcHRzLm1pblNpemVQaXggfHwgMFxuICAgIGNvbnN0IG1heFNpemVGYWN0b3IgPSBvcHRzLm1heFNpemVGYWN0b3IgfHwgMVxuICAgIGNvbnN0IHN0cmV0Y2hpbmcgPSBvcHRzLnN0cmV0Y2hpbmdcbiAgICBjb25zdCByYW5nZV8gPSBvcHRzLnJhbmdlXG4gICAgY29uc3QgZG9tYWluXyA9IG9wdHMuZG9tYWluXG4gICAgY29uc3QgY2xhc3NOdW1iZXIgPSBvcHRzLmNsYXNzTnVtYmVyXG4gICAgcmV0dXJuIChjZWxscywgcmVzb2x1dGlvbiwgeikgPT4ge1xuICAgICAgICBjb25zdCBkb21haW4gPSBkb21haW5fIHx8IFttaW5WYWx1ZSwgbWF4KGNlbGxzLCB2YWx1ZUZ1bmN0aW9uKV1cbiAgICAgICAgY29uc3QgcmFuZ2UgPSByYW5nZV8gfHwgW21pblNpemVQaXggKiB6LCByZXNvbHV0aW9uICogbWF4U2l6ZUZhY3Rvcl1cbiAgICAgICAgY29uc3QgZG9tYWluU2l6ZSA9IGRvbWFpblsxXSAtIGRvbWFpblswXSwgZG9tYWluTWluID0gZG9tYWluWzBdXG4gICAgICAgIGNvbnN0IHJhbmdlU2l6ZSA9IHJhbmdlWzFdIC0gcmFuZ2VbMF0sIHJhbmdlTWluID0gcmFuZ2VbMF1cbiAgICAgICAgcmV0dXJuIHQgPT4ge1xuICAgICAgICAgICAgLy9zY2FsZSB0byBbMCwxXVxuICAgICAgICAgICAgdCA9ICh0IC0gZG9tYWluTWluKSAvIGRvbWFpblNpemVcbiAgICAgICAgICAgIC8vc3RyZXRjaFxuICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcpIHQgPSBzdHJldGNoaW5nKHQpXG4gICAgICAgICAgICAvL2NsYXNzaWZ5XG4gICAgICAgICAgICBpZiAoY2xhc3NOdW1iZXIpIHQgPSB0ID09IDEgPyAxIDogTWF0aC5mbG9vcih0ICogKGNsYXNzTnVtYmVyKSkgLyAoY2xhc3NOdW1iZXIgLSAxKVxuICAgICAgICAgICAgLy9zY2FsZSB0byByYW5nZVxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlTWluICsgdCAqIHJhbmdlU2l6ZVxuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLyoqXG4gKiBHZW5lcmljIGZ1bmN0aW9uIGZvciB2aWV3IHNjYWxlIC0gcXVhbnRpbGVcbiAqIFxuICogQHBhcmFtIHt7IHZhbHVlRnVuY3Rpb246ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOm51bWJlciwgY2xhc3NOdW1iZXI/Om51bWJlciwgbWluU2l6ZVBpeD86bnVtYmVyLCBtYXhTaXplRmFjdG9yPzpudW1iZXIgfX0gb3B0cyBcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+KTpTY2FsZX1cbiAqL1xuZXhwb3J0IGNvbnN0IHZpZXdTY2FsZVF1YW50aWxlID0gKG9wdHMpID0+IHtcbiAgICBjb25zdCB2YWx1ZUZ1bmN0aW9uID0gb3B0cy52YWx1ZUZ1bmN0aW9uXG4gICAgY29uc3QgY2xhc3NOdW1iZXIgPSBvcHRzLmNsYXNzTnVtYmVyIHx8IDEyXG4gICAgY29uc3QgbWluU2l6ZVBpeCA9IG9wdHMubWluU2l6ZVBpeCB8fCAxXG4gICAgY29uc3QgbWF4U2l6ZUZhY3RvciA9IG9wdHMubWF4U2l6ZUZhY3RvciB8fCAxXG4gICAgY29uc3Qgc2NhbGUgPSBzY2FsZVF1YW50aWxlKClcbiAgICByZXR1cm4gKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA9PiB7XG4gICAgICAgIHNjYWxlLmRvbWFpbihjZWxscy5tYXAodmFsdWVGdW5jdGlvbikpXG4gICAgICAgIGNvbnN0IG1pblNpemVHZW8gPSBtaW5TaXplUGl4ICogeiwgbWF4U2l6ZUdlbyA9IHJlc29sdXRpb24gKiBtYXhTaXplRmFjdG9yXG4gICAgICAgIHNjYWxlLnJhbmdlKEFycmF5LmZyb20oeyBsZW5ndGg6IGNsYXNzTnVtYmVyIH0sIChfLCBpKSA9PiBtaW5TaXplR2VvICsgaSAqIChtYXhTaXplR2VvIC0gbWluU2l6ZUdlbykgLyAoY2xhc3NOdW1iZXIgLSAxKSkpXG4gICAgICAgIHNjYWxlLmJyZWFrcyA9IHNjYWxlLnF1YW50aWxlcygpXG4gICAgICAgIHNjYWxlLnZhbHVlcyA9IHNjYWxlLnJhbmdlKClcbiAgICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH1cbn1cblxuXG5cblxuXG5cbi8qKlxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgY29sb3IgdmlldyBzY2FsZSAtIGNvbnRpbnVvdXMgb3IgZGlzY3JldGVcbiAqIFxuICogQHBhcmFtIHt7IHZhbHVlRnVuY3Rpb246ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOm51bWJlciwgY29sb3JTY2FsZT86ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmcsIGNvbG9ycz86QXJyYXkuPHN0cmluZz4sIHN0cmV0Y2hpbmc/OmZ1bmN0aW9uKG51bWJlcik6bnVtYmVyIH19IG9wdHMgXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPik6Q29sb3JTY2FsZX1cbiAqL1xuZXhwb3J0IGNvbnN0IHZpZXdTY2FsZUNvbG9yID0gKG9wdHMpID0+IHtcbiAgICBjb25zdCB2YWx1ZUZ1bmN0aW9uID0gb3B0cy52YWx1ZUZ1bmN0aW9uXG4gICAgY29uc3Qgc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xuICAgIGxldCBjb2xvclNjYWxlID0gb3B0cy5jb2xvclNjYWxlIHx8ICgoKSA9PiBcInB1cnBsZVwiKVxuXG4gICAgLy9kaXNjcmV0ZSBjb2xvcnMgY2FzZTogYnVpbGQgY29udGludW91cyBjb2xvciBzY2FsZSBmcm9tIGRpc2NyZXRlIG9uZXMuXG4gICAgY29uc3QgbmJDbGFzcyA9IG9wdHMuY29sb3JzPy5sZW5ndGhcbiAgICBpZiAob3B0cy5jb2xvcnMgJiYgbmJDbGFzcylcbiAgICAgICAgY29sb3JTY2FsZSA9IHQgPT4gb3B0cy5jb2xvcnNbdCA9PSAxID8gbmJDbGFzcyAtIDEgOiBNYXRoLmZsb29yKHQgKiBuYkNsYXNzKV1cblxuICAgIHJldHVybiAoY2VsbHMpID0+IHtcbiAgICAgICAgaWYgKGNlbGxzLmxlbmd0aCA9PSAwIHx8ICFjZWxscykgcmV0dXJuXG4gICAgICAgIC8qKiBAdHlwZSB7W3VuZGVmaW5lZCwgdW5kZWZpbmVkXSB8IFtudW1iZXIsIG51bWJlcl19ICovXG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IGV4dGVudChjZWxscywgdmFsdWVGdW5jdGlvbilcbiAgICAgICAgaWYgKGRvbWFpblswXSA9PSB1bmRlZmluZWQpIHJldHVyblxuICAgICAgICBjb25zdCBkb21haW5TaXplID0gZG9tYWluWzFdIC0gZG9tYWluWzBdXG4gICAgICAgIGNvbnN0IHNjYWxlID0gdCA9PiB7XG4gICAgICAgICAgICAvL3NjYWxlIHRvIFswLDFdXG4gICAgICAgICAgICB0ID0gKHQgLSBkb21haW5bMF0pIC8gZG9tYWluU2l6ZVxuICAgICAgICAgICAgLy9zdHJldGNoXG4gICAgICAgICAgICBpZiAoc3RyZXRjaGluZykgdCA9IHN0cmV0Y2hpbmcodClcbiAgICAgICAgICAgIHJldHVybiBjb2xvclNjYWxlKHQpXG4gICAgICAgIH1cbiAgICAgICAgLy9mdW5jdGlvbiB0aGF0IHJldHVybiB0aGUgZG9tYWluIHZhbHVlIGZyb20gdGhlIFswLDFdIHJhbmdlLlxuICAgICAgICBzY2FsZS5pbnZlcnQgPSB0ID0+IHtcbiAgICAgICAgICAgIGlmIChzdHJldGNoaW5nKSB0ID0gc3RyZXRjaGluZy5pbnZlcnQodClcbiAgICAgICAgICAgIHJldHVybiBkb21haW5bMF0gKyB0ICogZG9tYWluU2l6ZVxuICAgICAgICB9XG4gICAgICAgIC8vZGlzY3JldGUgY29sb3JzOiByZXR1cm4gdGhlIGJyZWFrc1xuICAgICAgICBpZiAob3B0cy5jb2xvcnMgJiYgbmJDbGFzcykge1xuICAgICAgICAgICAgc2NhbGUuYnJlYWtzID0gW11cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbmJDbGFzczsgaSsrKVxuICAgICAgICAgICAgICAgIHNjYWxlLmJyZWFrcy5wdXNoKHNjYWxlLmludmVydChpIC8gbmJDbGFzcykpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2NhbGU7XG4gICAgfVxufVxuXG5cblxuXG5cbi8qKlxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgY29sb3IgdmlldyBzY2FsZSAtIHF1YW50aWxlXG4gKiBcbiAqIEBwYXJhbSB7eyB2YWx1ZUZ1bmN0aW9uOmZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsKTpudW1iZXIsIGNsYXNzTnVtYmVyPzpudW1iZXIsIGNvbG9ycz86QXJyYXkuPHN0cmluZz4sIGNvbG9yU2NhbGU/OmZ1bmN0aW9uKG51bWJlcik6c3RyaW5nIH19IG9wdHMgXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPik6Q29sb3JTY2FsZX1cbiAqL1xuZXhwb3J0IGNvbnN0IHZpZXdTY2FsZUNvbG9yUXVhbnRpbGUgPSAob3B0cykgPT4ge1xuICAgIGNvbnN0IHZhbHVlRnVuY3Rpb24gPSBvcHRzLnZhbHVlRnVuY3Rpb25cbiAgICBjb25zdCBjbGFzc051bWJlciA9IG9wdHMuY2xhc3NOdW1iZXIgfHwgMTJcblxuICAgIGxldCBjb2xvcnMgPSBvcHRzLmNvbG9yc1xuICAgIGlmIChvcHRzLmNvbG9yU2NhbGUpIGNvbG9ycyA9IGRpc2NyZXRlQ29sb3JzKG9wdHMuY29sb3JTY2FsZSwgY2xhc3NOdW1iZXIpXG4gICAgY29sb3JzID0gY29sb3JzIHx8IEFycmF5LmZyb20oeyBsZW5ndGg6IGNsYXNzTnVtYmVyIH0sIChfLCBpKSA9PiBcInJnYihcIiArIE1hdGguZmxvb3IoMjU1ICogaSAvIChjbGFzc051bWJlciAtIDEpKSArIFwiLDE1MCwxNTApXCIpXG5cbiAgICBjb25zdCBzY2FsZSA9IHNjYWxlUXVhbnRpbGUoKS5yYW5nZShjb2xvcnMpXG4gICAgcmV0dXJuIChjZWxscykgPT4ge1xuICAgICAgICBzY2FsZS5kb21haW4oY2VsbHMubWFwKHZhbHVlRnVuY3Rpb24pKTtcbiAgICAgICAgc2NhbGUuYnJlYWtzID0gc2NhbGUucXVhbnRpbGVzKClcbiAgICAgICAgc2NhbGUuY29sb3JzID0gY29sb3JzXG4gICAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9XG59XG5cblxuXG5cbi8qKlxuICogQ29tYmluZSB2aWV3IHNjYWxlIGZ1bmN0aW9uc1xuICogXG4gKiBAcGFyYW0geyp9IG9iaiBcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn1cbiAqL1xuZXhwb3J0IGNvbnN0IHZpZXdTY2FsZUNvbWJpbmF0aW9uID0gKG9iaikgPT4ge1xuICAgIC8vb2JqOiBwcm9wIGFuZCBhIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICByZXR1cm4gKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA9PiB7XG4gICAgICAgIGNvbnN0IG91dCA9IHt9XG4gICAgICAgIGZvciAoY29uc3QgcCBpbiBvYmopIHsgb3V0W3BdID0gb2JqW3BdKGNlbGxzLCByZXNvbHV0aW9uLCB6KSB9XG4gICAgICAgIHJldHVybiBvdXRcbiAgICB9XG59XG5cblxuXG5cblxuXG4vKipcbiAqIFJldHVybiBhIGNsYXNzaWZpZXIgZnVuY3Rpb24gZnJvbSBicmVhayB2YWx1ZXMuXG4gKiBUaGUgY2xhc3NpZmllciBmdW5jdGlvbiByZXR1cm5zIHRoZSBjbGFzcyBpZCAoZnJvbSAwIHRvIGJyZWFrcy5sZW5ndGgpIGZyb20gYSB2YWx1ZSB0byBjbGFzc2lmaXkuXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBicmVha3MgdGhlIGJyZWFrc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZmllcihicmVha3MpIHtcbiAgICBjb25zdCBibCA9IGJyZWFrcy5sZW5ndGhcbiAgICBjb25zdCBjbGFzc2lmaWVyID0gdmFsdWUgPT4ge1xuICAgICAgICBsZXQgaSA9IDBcbiAgICAgICAgd2hpbGUgKGkgPCBibCkge1xuICAgICAgICAgICAgY29uc3QgYnJlYWtfID0gYnJlYWtzW2ldXG4gICAgICAgICAgICBpZiAodmFsdWUgPD0gYnJlYWtfKSByZXR1cm4gaVxuICAgICAgICAgICAgaSsrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlcbiAgICB9XG4gICAgY2xhc3NpZmllci5icmVha3MgPSBicmVha3NcbiAgICByZXR1cm4gY2xhc3NpZmllclxufVxuXG5cblxuLyoqXG4gKiBSZXR1cm4gYSBjb2xvciBjbGFzc2lmaWVyIGZ1bmN0aW9uIGZyb20gYnJlYWsgdmFsdWVzLlxuICogVGhlIGNsYXNzaWZpZXIgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29sb3IgZnJvbSBhIHZhbHVlIHRvIGNsYXNzaWZpeS5cbiAqIFRoZXJlIHNob3VsZCBiZSBvbmUgY29sb3IgbW9yZSB0aGFuIGJyZWFrIHZhbHVlcy5cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyB0aGUgYnJlYWtzXG4gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjb2xvcnMgdGhlIGNvbG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JDbGFzc2lmaWVyKGJyZWFrcywgY29sb3JzKSB7XG4gICAgY29uc3QgY2xhc3NpZmllcl8gPSBjbGFzc2lmaWVyKGJyZWFrcylcbiAgICBjb25zdCBjb2xvckNsYXNzaWZpZXIgPSB2YWx1ZSA9PiBjb2xvcnNbY2xhc3NpZmllcl8odmFsdWUpXVxuICAgIGNvbG9yQ2xhc3NpZmllci5icmVha3MgPSBicmVha3NcbiAgICBjb2xvckNsYXNzaWZpZXIuY29sb3JzID0gY29sb3JzXG4gICAgcmV0dXJuIGNvbG9yQ2xhc3NpZmllclxufVxuXG4vKipcbiAqIE1ha2UgYXJyYXkgb2YgY29sb3JzIGZyb20gYSBjb2xvclNjYWxlLlxuICogSXQgaXMgYSBraW5kIG9mIHNhbXBsaW5nLCBvciB1bi1pbnRlcnBvbGF0aW9uXG4gKiBcbiAqIEBwYXJhbSB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9IGNvbG9yU2NhbGUgXG4gKiBAcGFyYW0ge251bWJlcn0gbmIgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNjcmV0ZUNvbG9ycyhjb2xvclNjYWxlLCBuYikge1xuICAgIGlmIChuYiA9PSAxKSByZXR1cm4gW2NvbG9yU2NhbGUoMC41KV1cbiAgICBjb25zdCBvdXQgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKylcbiAgICAgICAgb3V0LnB1c2goY29sb3JTY2FsZShpIC8gKG5iIC0gMSkpKVxuICAgIHJldHVybiBvdXRcbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBAbW9kdWxlIHV0aWxzXG4gKi9cblxuXG4vL1RPRE8gaW52ZXJ0IGZvciBjaXJjdWxhclxuLy9UT0RPIHVzZSBNYXRoLnNxcnRcbi8vVE9ETyB2YWxpZGF0ZVxuXG5cbi8qKlxuICogU29tZSBmdW5jdGlvbiBbMCwxXS0+WzAsMV0gdG8gc3RyZXRjaCByYW5nZSBvZiB2YWx1ZXMuXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ldXJvc3RhdC9ncmlkdml6L2Jsb2IvbWFzdGVyL2RvY3MvcmVmZXJlbmNlLm1kI3N0cmV0Y2hpbmdcbiAqIEBzZWUgaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BqZ2FmZnVyaS9zdHJldGNoaW5nXG4gKi9cblxuLy9pZGVudGl0eSBmdW5jdGlvblxuY29uc3QgaWRlbnRpdHkgPSB0ID0+IHRcbmlkZW50aXR5LmludmVydCA9IGlkZW50aXR5XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gYmFzZSBcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IGV4cG9uZW50aWFsU2NhbGUgPSAoYmFzZSA9IDMpID0+IHtcbiAgICBpZiAoYmFzZSA9PSAwKSByZXR1cm4gaWRlbnRpdHlcbiAgICBjb25zdCBhID0gKE1hdGguZXhwKGJhc2UpIC0gMSlcbiAgICBjb25zdCBmID0gdCA9PiAoTWF0aC5leHAodCAqIGJhc2UpIC0gMSkgLyBhXG4gICAgZi5pbnZlcnQgPSB0ID0+IE1hdGgubG9nKGEgKiB0ICsgMSkgLyBiYXNlXG4gICAgcmV0dXJuIGZcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gYmFzZSBcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IGxvZ2FyaXRobWljU2NhbGUgPSAoYmFzZSA9IDMpID0+IHtcbiAgICBpZiAoYmFzZSA9PSAwKSByZXR1cm4gaWRlbnRpdHlcbiAgICBjb25zdCBhID0gTWF0aC5leHAoYmFzZSksIGIgPSAxIC0gYVxuICAgIGNvbnN0IGYgPSB0ID0+IDEgLSBNYXRoLmxvZyhhICsgdCAqIGIpIC8gYmFzZVxuICAgIGYuaW52ZXJ0ID0gdCA9PiAoTWF0aC5leHAoKDEgLSB0KSAqIGJhc2UpIC0gYSkgLyBiXG4gICAgcmV0dXJuIGZcbn1cblxuXG5cblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHBvbmVudCBcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IHBvd2VyU2NhbGUgPSAoZXhwb25lbnQgPSAzKSA9PiB7XG4gICAgaWYgKGV4cG9uZW50ID09IDEpIHJldHVybiBpZGVudGl0eVxuICAgIC8vVE9ETyBpZiAoZXhwb25lbnQgPT0gMC41KSByZXR1cm4gTWF0aC5zcXJ0XG4gICAgY29uc3QgZiA9IHQgPT4gTWF0aC5wb3codCwgZXhwb25lbnQpXG4gICAgY29uc3QgYSA9IDEgLyBleHBvbmVudFxuICAgIGYuaW52ZXJ0ID0gdCA9PiBNYXRoLnBvdyh0LCBhKVxuICAgIHJldHVybiBmXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGV4cG9uZW50IFxuICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgcG93ZXJJbnZlcnNlU2NhbGUgPSAoZXhwb25lbnQgPSAzKSA9PiB7XG4gICAgaWYgKGV4cG9uZW50ID09IDEpIHJldHVybiBpZGVudGl0eVxuICAgIC8vVE9ETyBpZiAoZXhwb25lbnQgPT0gMikgcmV0dXJuIHQgPT4gMSAtIE1hdGguc3FydCgxIC0gdClcbiAgICBjb25zdCBhID0gMSAvIGV4cG9uZW50XG4gICAgY29uc3QgZiA9IHQgPT4gMSAtIE1hdGgucG93KDEgLSB0LCBhKVxuICAgIGYuaW52ZXJ0ID0gdCA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIGV4cG9uZW50KVxuICAgIHJldHVybiBmXG59XG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGNpcmN1bGFyaXR5IFxuICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgY2lyY3VsYXJTY2FsZSA9IChjaXJjdWxhcml0eSA9IDAuOCkgPT4ge1xuICAgIGlmIChjaXJjdWxhcml0eSA9PSAwKSByZXR1cm4gaWRlbnRpdHlcbiAgICBpZiAoY2lyY3VsYXJpdHkgPT0gMSkgcmV0dXJuIHQgPT4gTWF0aC5zcXJ0KHQgKiAoMiAtIHQpKVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBhID0gY2lyY3VsYXJpdHkgLyAoMSAtIGNpcmN1bGFyaXR5KVxuICAgICAgICByZXR1cm4gdCA9PiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyB0ICogKDIgLyBhICsgMiAtIHQpKSAtIDEgLyBhXG4gICAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBjaXJjdWxhcml0eSBcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IGNpcmN1bGFySW52ZXJzZVNjYWxlID0gKGNpcmN1bGFyaXR5ID0gMC44KSA9PiB7XG4gICAgaWYgKGNpcmN1bGFyaXR5ID09IDApIHJldHVybiBpZGVudGl0eVxuICAgIGNvbnN0IGYgPSBjaXJjdWxhclNjYWxlKGNpcmN1bGFyaXR5KVxuICAgIHJldHVybiB0ID0+IDEgLSBmKDEgLSB0KVxufVxuXG5cblxuXG5cbi8vdGVzdFxuLypcbmNvbnN0IHRlc3QgPSAoZiwgZnVuLCBhLCBlcnIgPSAxZS0xMikgPT4ge1xuICAgIGZvciAobGV0IHQgPSAwOyB0IDw9IDE7IHQgKz0gMSAvIDUwKSB7XG4gICAgICAgIGNvbnN0IGVyID0gdCAtIGYuaW52ZXJ0KGYodCkpXG4gICAgICAgIGlmIChNYXRoLmFicyhlcikgPCBlcnIpIGNvbnRpbnVlXG4gICAgICAgIGNvbnNvbGUubG9nKGZ1biwgYSwgZXIpXG4gICAgfVxufVxuXG5mb3IgKGxldCBmdW4gb2YgW3Bvd2VyU2NhbGUsIHBvd2VySW52ZXJzZVNjYWxlXSlcbiAgICBmb3IgKGxldCBleHAgPSAtMzA7IGV4cCA8PSA1MDsgZXhwICs9IDEpIHtcbiAgICAgICAgaWYgKGV4cCA9PSAwKSBjb250aW51ZVxuICAgICAgICBjb25zdCBmID0gZnVuKGV4cClcbiAgICAgICAgdGVzdChmLCBmdW4sIGV4cClcbiAgICB9XG5cblxuZm9yIChsZXQgZnVuIG9mIFtleHBvbmVudGlhbFNjYWxlLCBsb2dhcml0aG1pY1NjYWxlXSlcbiAgICBmb3IgKGxldCBiYXNlID0gLTIwOyBiYXNlIDw9IDIwOyBiYXNlICs9IDEpIHtcbiAgICAgICAgLy9pZiAoZXhwID09IDApIGNvbnRpbnVlXG4gICAgICAgIGNvbnN0IGYgPSBmdW4oYmFzZSlcbiAgICAgICAgdGVzdChmLCBmdW4sIGJhc2UsIDFlLTEwKVxuICAgIH1cbiovIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBpbnRlcnBvbGF0ZUxhYiB9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiXG5cblxuXG5leHBvcnQgY29uc3QgdHJpdmFyaWF0ZUNsYXNzaWZpZXIgPSAocHJvcGVydGllcywgdG90YWxGdW5jdGlvbiwgb3B0cyA9IHt9KSA9PiB7XG5cbiAgICAvL3RoZSB0aHJlZSBwcm9wZXJ0aWVzXG4gICAgY29uc3QgcDAgPSBwcm9wZXJ0aWVzWzBdLCBwMSA9IHByb3BlcnRpZXNbMV0sIHAyID0gcHJvcGVydGllc1syXVxuXG4gICAgLy90aGUgY2xhc3NpZmllciBjZW50ZXIgcG9pbnQuIHN1bSBtdXN0IGJlIGVxdWFsIHRvIDFcbiAgICBjb25zdCBbYzAsIGMxLCBjMl0gPSBvcHRzLmNlbnRlciB8fCBbMSAvIDMsIDEgLyAzLCAxIC8gM11cblxuICAgIC8vcGFyYW1ldGVyIHRvIGRlY2lkZSB3ZXRoZXIgdG8gdXNlIG1peGVkIGNsYXNzZXMgbTAsIG0xLCBtMi5cbiAgICBjb25zdCB3aXRoTWl4ZWRDbGFzc2VzID0gb3B0cy53aXRoTWl4ZWRDbGFzc2VzICE9IHVuZGVmaW5lZCA/IG9wdHMud2l0aE1peGVkQ2xhc3NlcyA6IHRydWVcblxuICAgIC8vcGFyYW1lcnRlciBkZWNpZGUgd2V0aGVyIHRvIHVzZSBhIGNlbnRyYWwgY2xhc3MsIGFuZCB0aGUgc2l6ZSBvZiB0aGlzIGNlbnRyYWwgY2xhc3MuXG4gICAgLy9zZXQgdG8gMCBvciB1bmRlZmluZWQgZm9yIG5vdCBzaG93aW5nIGFueSBjZW50cmFsIGNsYXNzLiBTZXQgdG8gMSBmb3IgYSBjZW50cmFsIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIG1peCBjbGFzc2VzXG4gICAgY29uc3QgY2MgPSBvcHRzLmNlbnRlckNvZWZmaWNpZW50ID8gMSAtIG9wdHMuY2VudGVyQ29lZmZpY2llbnQgOiB1bmRlZmluZWRcblxuICAgIC8vdGhlIG91dHB1dCBjbGFzc2lmaWVyIG1ldGhvZFxuICAgIGNvbnN0IGZ1biA9IGMgPT4ge1xuICAgICAgICAvL2dldCB0b3RhbFxuICAgICAgICBjb25zdCB0b3QgPSB0b3RhbEZ1bmN0aW9uKGMpXG4gICAgICAgIGlmICghdG90KSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIC8vY29tcHV0ZSBzaGFyZXNcbiAgICAgICAgY29uc3QgW3MwLCBzMSwgczJdID0gWytjW3AwXSAvIHRvdCwgK2NbcDFdIC8gdG90LCArY1twMl0gLyB0b3RdXG5cbiAgICAgICAgLy9jbGFzcyAwXG4gICAgICAgIGlmIChzMCA+PSBjMCAmJiBzMSA8PSBjMSAmJiBzMiA8PSBjMikge1xuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzIG5lYXIgY2xhc3MgMFxuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiAoczIgLSBjMikgKiAoYzEgLSBjYyAqIGMxKSA+PSAoczEgLSBjYyAqIGMxKSAqIChjYyAqIGMyIC0gYzIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBcImNlbnRlclwiXG4gICAgICAgICAgICByZXR1cm4gXCIwXCJcbiAgICAgICAgfVxuICAgICAgICAvL2NsYXNzIDFcbiAgICAgICAgaWYgKHMwIDw9IGMwICYmIHMxID49IGMxICYmIHMyIDw9IGMyKSB7XG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3MgbmVhciBjbGFzcyAxXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIChzMiAtIGMyKSAqIChjMCAtIGNjICogYzApID49IChzMCAtIGNjICogYzApICogKGNjICogYzIgLSBjMikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY2VudGVyXCJcbiAgICAgICAgICAgIHJldHVybiBcIjFcIlxuICAgICAgICB9XG4gICAgICAgIC8vY2xhc3MgMlxuICAgICAgICBpZiAoczAgPD0gYzAgJiYgczEgPD0gYzEgJiYgczIgPj0gYzIpIHtcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzcyBuZWFyIGNsYXNzIDJcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgKHMxIC0gYzEpICogKGMwIC0gY2MgKiBjMCkgPj0gKHMwIC0gY2MgKiBjMCkgKiAoY2MgKiBjMSAtIGMxKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjZW50ZXJcIlxuICAgICAgICAgICAgcmV0dXJuIFwiMlwiXG4gICAgICAgIH1cbiAgICAgICAgLy9taWRkbGUgY2xhc3MgMCAtIGludGVyc2VjdGlvbiBjbGFzcyAxIGFuZCAyXG4gICAgICAgIGlmIChzMCA8PSBjMCAmJiBzMSA+PSBjMSAmJiBzMiA+PSBjMikge1xuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIHMwID4gY2MgKiBjMCkgcmV0dXJuIFwiY2VudGVyXCJcbiAgICAgICAgICAgIGlmICh3aXRoTWl4ZWRDbGFzc2VzKSByZXR1cm4gXCJtMFwiXG4gICAgICAgICAgICByZXR1cm4gczEgPiBzMiA/IFwiMVwiIDogXCIyXCJcbiAgICAgICAgfVxuICAgICAgICAvL21pZGRsZSBjbGFzcyAxIC0gaW50ZXJzZWN0aW9uIGNsYXNzIDAgYW5kIDFcbiAgICAgICAgaWYgKHMwID49IGMwICYmIHMxIDw9IGMxICYmIHMyID49IGMyKSB7XG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3NcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgczEgPiBjYyAqIGMxKSByZXR1cm4gXCJjZW50ZXJcIlxuICAgICAgICAgICAgaWYgKHdpdGhNaXhlZENsYXNzZXMpIHJldHVybiBcIm0xXCJcbiAgICAgICAgICAgIHJldHVybiBzMCA+IHMyID8gXCIwXCIgOiBcIjJcIlxuICAgICAgICB9XG4gICAgICAgIC8vbWlkZGxlIGNsYXNzIDIgLSBpbnRlcnNlY3Rpb24gY2xhc3MgMCBhbmQgMVxuICAgICAgICBpZiAoczAgPj0gYzAgJiYgczEgPj0gYzEgJiYgczIgPD0gYzIpIHtcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzc1xuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiBzMiA+IGNjICogYzIpIHJldHVybiBcImNlbnRlclwiXG4gICAgICAgICAgICBpZiAod2l0aE1peGVkQ2xhc3NlcykgcmV0dXJuIFwibTJcIlxuICAgICAgICAgICAgcmV0dXJuIHMxID4gczAgPyBcIjFcIiA6IFwiMFwiXG4gICAgICAgIH1cbiAgICAgICAgLy9zaG91bGQgbm90IGhhcHBlblxuICAgICAgICByZXR1cm4gXCJ1bmtub3duXCJcbiAgICB9XG5cbiAgICAvL2F0dGFjaCBpbmZvcm1hdGlvbiB0byBvdXRwdXQgZnVuY3Rpb25cbiAgICBmdW4uY2VudGVyID0gW2MwLCBjMSwgYzJdXG4gICAgZnVuLmNlbnRlckNvZWZmaWNpZW50ID0gb3B0cy5jZW50ZXJDb2VmZmljaWVudFxuXG4gICAgcmV0dXJuIGZ1blxufVxuXG5cblxuZXhwb3J0IGNvbnN0IHRyaXZhcmlhdGVDb2xvckNsYXNzaWZpZXIgPSAocHJvcGVydGllcywgdG90YWxGdW5jdGlvbiwgY29sb3JzLCBvcHRzID0ge30pID0+IHtcblxuICAgIC8vdGhlIHRocmVlIGNvbG9yc1xuICAgIGNvbnN0IFtjb2xvcjAsIGNvbG9yMSwgY29sb3IyXSA9IGNvbG9ycyB8fCBbXCJyZWRcIiwgXCJncmVlblwiLCBcImJsdWVcIl1cblxuICAgIC8vdGhlIGNvbG9yIGludGVycG9sYXRpb24gZnVuY3Rpb25cbiAgICBjb25zdCBjb2xvckludGVycG9sYXRpb24gPSBvcHRzLmNvbG9ySW50ZXJwb2xhdGlvbiB8fCBpbnRlcnBvbGF0ZUxhYlxuXG4gICAgLy9wYXJhbWV0ZXIgdG8gZGVjaWRlIHdldGhlciB0byB1c2UgbWl4ZWQgY2xhc3Nlcy5cbiAgICBjb25zdCB3aXRoTWl4ZWRDbGFzc2VzID0gb3B0cy53aXRoTWl4ZWRDbGFzc2VzICE9IHVuZGVmaW5lZCA/IG9wdHMud2l0aE1peGVkQ2xhc3NlcyA6IHRydWVcbiAgICAvL2h0dHBzOi8vZDNqcy5vcmcvZDMtaW50ZXJwb2xhdGUvY29sb3JcbiAgICBjb25zdCBtaXhDb2xvckZ1bmN0aW9uID0gKGNvbG9yMSwgY29sb3IyKSA9PiBjb2xvckludGVycG9sYXRpb24oY29sb3IxLCBjb2xvcjIpKDAuNSlcbiAgICAvL3RoZSBjb2xvcnMgY29ycmVzcG9uZGluZyB0byB0aGUgbWl4ZWQgY2xhc3Nlc1xuICAgIGNvbnN0IFttaXhDb2xvcjAsIG1peENvbG9yMSwgbWl4Q29sb3IyXSA9IG9wdHMubWl4ZWRDb2xvcnMgfHwgd2l0aE1peGVkQ2xhc3NlcyA/IFttaXhDb2xvckZ1bmN0aW9uKGNvbG9yMSwgY29sb3IyKSwgbWl4Q29sb3JGdW5jdGlvbihjb2xvcjAsIGNvbG9yMiksIG1peENvbG9yRnVuY3Rpb24oY29sb3IwLCBjb2xvcjEpXSA6IFtdXG5cbiAgICAvL3RoZSBjZW50cmFsIGNvbG9yLCB1c2VkIGZvciB0aGUgY2VudHJhbCBjbGFzcywgaWYgYW55LiBUaGUgY2VudHJhbCBjbGFzcyBpcyB0aGUgY2xhc3Mgb2YgcmVsYXRpdmVseSBiYWxhbmNlZCB2YWx1ZXMsIGFyb3VuZCB0aGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyQ29sb3IgPSBvcHRzLmNlbnRlckNvbG9yIHx8IGNvbG9ySW50ZXJwb2xhdGlvbihtaXhDb2xvckZ1bmN0aW9uKGNvbG9yMCwgY29sb3IxKSwgY29sb3IyKSgwLjMzMylcblxuICAgIC8vbWFrZSBjbGFzc2lmaWVyXG4gICAgY29uc3QgY2xhc3NpZmllciA9IHRyaXZhcmlhdGVDbGFzc2lmaWVyKHByb3BlcnRpZXMsIHRvdGFsRnVuY3Rpb24sIG9wdHMpXG5cbiAgICAvL3RoZSBvdXRwdXQgY29sb3IgY2xhc3NpZmllciBtZXRob2RcbiAgICBjb25zdCBmdW4gPSBjID0+IHtcbiAgICAgICAgY29uc3QgY2xhID0gY2xhc3NpZmllcihjKVxuICAgICAgICBpZiAoY2xhID09IFwiMFwiKSByZXR1cm4gY29sb3IwXG4gICAgICAgIGlmIChjbGEgPT0gXCIxXCIpIHJldHVybiBjb2xvcjFcbiAgICAgICAgaWYgKGNsYSA9PSBcIjJcIikgcmV0dXJuIGNvbG9yMlxuICAgICAgICBpZiAoY2xhID09IFwibTBcIikgcmV0dXJuIG1peENvbG9yMFxuICAgICAgICBpZiAoY2xhID09IFwibTFcIikgcmV0dXJuIG1peENvbG9yMVxuICAgICAgICBpZiAoY2xhID09IFwibTJcIikgcmV0dXJuIG1peENvbG9yMlxuICAgICAgICBpZiAoY2xhID09IFwiY2VudGVyXCIpIHJldHVybiBjZW50ZXJDb2xvclxuICAgICAgICByZXR1cm4gb3B0cy5kZWZhdWx0Q29sb3IgfHwgXCJibGFja1wiXG4gICAgfVxuICAgIGZ1bi5jZW50ZXIgPSBjbGFzc2lmaWVyLmNlbnRlclxuICAgIGZ1bi5jZW50ZXJDb2VmZmljaWVudCA9IG9wdHMuY2VudGVyQ29lZmZpY2llbnRcbiAgICBmdW4uY29sb3JzID0gW2NvbG9yMCwgY29sb3IxLCBjb2xvcjJdXG4gICAgZnVuLm1peENvbG9ycyA9IFttaXhDb2xvcjAsIG1peENvbG9yMSwgbWl4Q29sb3IyXVxuICAgIGZ1bi5jZW50ZXJDb2xvciA9IGNlbnRlckNvbG9yXG5cbiAgICByZXR1cm4gZnVuXG59XG5cblxuXG5cblxuXG4vKlxuY29uc3Qgb3JkZXJlZEluZGV4ZXNEZWMgPSBhcnIgPT4gWy4uLmFyci5rZXlzKCldLnNvcnQoKGEsIGIpID0+IGFycltiXSAtIGFyclthXSk7XG5jb25zdCBvcmRlcmVkSW5kZXhlc0luYyA9IGFyciA9PiBbLi4uYXJyLmtleXMoKV0uc29ydCgoYSwgYikgPT4gYXJyW2FdIC0gYXJyW2JdKTtcblxuZXhwb3J0IGNvbnN0IHRyaXZhcmlhdGVDbGFzc2lmaWVyID0gKHByb3BlcnRpZXMsIHRvdGFsRnVuY3Rpb24sIG9wdHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGxvd1RocmVzaG9sZCA9IG9wdHMubG93VGhyZXNob2xkIHx8IFsxIC8gMywgMSAvIDMsIDEgLyAzXVxuICAgIGNvbnN0IGhpZ2hUaHJlc2hvbGQgPSBvcHRzLmhpZ2hUaHJlc2hvbGQgfHwgWzIgLyAzLCAyIC8gMywgMiAvIDNdXG4gICAgY29uc3QgY29sb3JzID0gb3B0cy5jb2xvcnMgfHwgW1wicmVkXCIsIFwiZ3JlZW5cIiwgXCJibHVlXCJdXG4gICAgY29uc3QgY29sb3JJbnRlcnBvbGF0aW9uID0gb3B0cy5jb2xvckludGVycG9sYXRpb24gfHwgaW50ZXJwb2xhdGVMYWJcblxuICAgIC8vaHR0cHM6Ly9kM2pzLm9yZy9kMy1pbnRlcnBvbGF0ZS9jb2xvclxuICAgIGNvbnN0IG1pZGRsZUNvbG9yRnVuY3Rpb24gPSAoY29sb3IxLCBjb2xvcjIpID0+IGNvbG9ySW50ZXJwb2xhdGlvbihjb2xvcjEsIGNvbG9yMikoMC41KVxuICAgIGNvbnN0IG1pZGRsZUNvbG9ycyA9IG9wdHMubWlkZGxlQ29sb3JzIHx8IFttaWRkbGVDb2xvckZ1bmN0aW9uKGNvbG9yc1sxXSwgY29sb3JzWzJdKSwgbWlkZGxlQ29sb3JGdW5jdGlvbihjb2xvcnNbMF0sIGNvbG9yc1syXSksIG1pZGRsZUNvbG9yRnVuY3Rpb24oY29sb3JzWzBdLCBjb2xvcnNbMV0pXVxuICAgIGNvbnN0IGNlbnRlckNvbG9yID0gb3B0cy5jZW50ZXJDb2xvciB8fCBjb2xvckludGVycG9sYXRpb24obWlkZGxlQ29sb3JzWzJdLCBjb2xvcnNbMl0pKDAuMzMzKVxuXG4gICAgY29uc3QgaGlnaF8gPSBvcmRlcmVkSW5kZXhlc0RlYyhoaWdoVGhyZXNob2xkKVxuICAgIGNvbnN0IGxvd18gPSBvcmRlcmVkSW5kZXhlc0luYyhsb3dUaHJlc2hvbGQpXG5cbiAgICBjb25zdCBwMCA9IHByb3BlcnRpZXNbMF0sIHAxID0gcHJvcGVydGllc1sxXSwgcDIgPSBwcm9wZXJ0aWVzWzJdXG4gICAgY29uc3QgZnVuID0gYyA9PiB7XG4gICAgICAgIC8vZ2V0IHRvdGFsXG4gICAgICAgIGNvbnN0IHRvdCA9IHRvdGFsRnVuY3Rpb24oYylcbiAgICAgICAgaWYgKCF0b3QpIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgLy9jb21wdXRlIHNoYXJlc1xuICAgICAgICBjb25zdCBzaGFyZXMgPSBbK2NbcDBdIC8gdG90LCArY1twMV0gLyB0b3QsICtjW3AyXSAvIHRvdF1cbiAgICAgICAgLy9yZXR1cm4gY29sb3JzXG4gICAgICAgIC8vc3RhcnQgZmlyc3Qgd2l0aCB0aGUgZXh0cmVtZSBoaWdoICh0cmlhbmdsZXMpOiBmcm9tIHRoZSBsYXJnZXIgdmFsdWUgKHNtYWxsIHRyaWFuZ2xlKSB0byB0aGUgbG93ZXIgdmFsdWUgKGxhcmdlIHRyaWFuZ2xlKVxuICAgICAgICBmb3IgKGxldCBpIG9mIGhpZ2hfKSBpZiAoc2hhcmVzW2ldID4gaGlnaFRocmVzaG9sZFtpXSkgcmV0dXJuIGNvbG9yc1tpXVxuICAgICAgICAvL3RoZW4gZHJhdyB0aGUgZXh0cmVtZSBsb3cgKHRyYXBleml1bXMpOiBmcm9tIHRoZSBsb3dlciB2YWx1ZSAoc21hbGwgdHJhcGV6aXVtcykgdG8gdGhlIGxhcmdlciB2YWx1ZXMgKGxhcmdlIHRyYXBleml1bSlcbiAgICAgICAgZm9yIChsZXQgaSBvZiBsb3dfKSBpZiAoc2hhcmVzW2ldIDwgbG93VGhyZXNob2xkW2ldKSByZXR1cm4gbWlkZGxlQ29sb3JzW2ldXG4gICAgICAgIC8vZWxzZSBjZW50cmFsIGNvbG9yXG4gICAgICAgIHJldHVybiBjZW50ZXJDb2xvclxuICAgIH1cbiAgICBmdW4ubG93VGhyZXNob2xkID0gbG93VGhyZXNob2xkXG4gICAgZnVuLmhpZ2hUaHJlc2hvbGQgPSBoaWdoVGhyZXNob2xkXG4gICAgZnVuLmNvbG9ycyA9IGNvbG9yc1xuICAgIGZ1bi5taWRkbGVDb2xvcnMgPSBtaWRkbGVDb2xvcnNcbiAgICBmdW4uY2VudGVyQ29sb3IgPSBjZW50ZXJDb2xvclxuICAgIGZ1bi5sb3dJbmRleCA9IGxvd19cbiAgICBmdW4uaGlnaEluZGV4ID0gaGlnaF9cbiAgICByZXR1cm4gZnVuXG59XG4qL1xuXG4vKlxuZXhwb3J0IGNvbnN0IHRyaXZhcmlhdGVDbGFzc2lmaWVyMyA9IChwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBvcHRzID0ge30pID0+IHtcbiAgICBjb25zdCBbYTAxLCBhMTIsIGEyMF0gPSBvcHRzLnRocmVzaG9sZHMgfHwgWzEvMywgMS8zLCAxLzNdXG4gICAgY29uc3QgW2MwLCBjMSwgYzJdID0gb3B0cy5jb2xvcnMgfHwgW1wicmVkXCIsIFwiZ3JlZW5cIiwgXCJibHVlXCJdXG4gICAgY29uc3QgY2VudGVyQ29sb3IgPSBvcHRzLmNlbnRlckNvbG9yIHx8IFwiZ3JheVwiXG5cbiAgICBjb25zdCBmZmYgPSBhID0+IGEgPT0gMSA/IEluZmluaXR5IDogYSAvICgxIC0gYSlcbiAgICBjb25zdCBjMDEgPSBmZmYoYTAxKSwgYzEyID0gZmZmKGExMiksIGMyMCA9IGZmZihhMjApXG5cbiAgICBjb25zdCBwMCA9IHByb3BlcnRpZXNbMF0sIHAxID0gcHJvcGVydGllc1sxXSwgcDIgPSBwcm9wZXJ0aWVzWzJdXG4gICAgY29uc3QgZnVuID0gYyA9PiB7XG4gICAgICAgIC8vZ2V0IHRvdGFsXG4gICAgICAgIGNvbnN0IHRvdCA9IHRvdGFsRnVuY3Rpb24oYylcbiAgICAgICAgaWYgKCF0b3QpIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgLy9jb21wdXRlIHNoYXJlc1xuICAgICAgICBjb25zdCBbczAsIHMxLCBzMl0gPSBbK2NbcDBdIC8gdG90LCArY1twMV0gLyB0b3QsICtjW3AyXSAvIHRvdF1cbiAgICAgICAgLy9yZXR1cm4gY29sb3JzXG4gICAgICAgIGlmIChzMCAqIGMwMSA+IHMxICYmIHMwID4gczIgKiBjMjApIHJldHVybiBjMFxuICAgICAgICBlbHNlIGlmIChzMSA+IHMwICogYzAxICYmIHMxICogYzEyID4gczIpIHJldHVybiBjMVxuICAgICAgICBlbHNlIGlmIChzMiAqIGMyMCA+IHMwICYmIHMyID4gczEgKiBjMTIpIHJldHVybiBjMlxuICAgICAgICBlbHNlIHJldHVybiBjZW50ZXJDb2xvclxuICAgIH1cbiAgICBmdW4uY29sb3JzID0gW2MwLCBjMSwgYzJdXG4gICAgZnVuLmNlbnRlckNvbG9yID0gY2VudGVyQ29sb3JcbiAgICByZXR1cm4gZnVuXG59XG4qL1xuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEdldCB0aGUgY2xhc3MgaWQgZnJvbSBhIHZhbHVlIGFuZCBjbGFzcyBicmVhayB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdiB0aGUgdmFsdWVcbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyB0aGUgYnJlYWtzXG4gKiBAcmV0dXJucyBUaGUgY2xhc3MgaWQsIGZyb20gMCB0byBicmVha3MubGVuZ3RoXG4gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0Q2xhc3NpZmllciBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGFzcyh2LCBicmVha3MpIHtcbiAgICBpZiAoIWJyZWFrcykgcmV0dXJuXG4gICAgaWYgKGJyZWFrcy5sZW5ndGggPT0gMCkgcmV0dXJuIDBcbiAgICBpZiAodiA8PSBicmVha3NbMF0pIHJldHVybiAwXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBicmVha3MubGVuZ3RoOyBpKyspIGlmIChicmVha3NbaSAtIDFdIDwgdiAmJiB2IDw9IGJyZWFrc1tpXSkgcmV0dXJuIGlcbiAgICByZXR1cm4gYnJlYWtzLmxlbmd0aFxufVxuXG5cblxuLy90YWtlICduaWNlJyB2YWx1ZSAocG93ZXIgb2YgdGVuLCBvciBtdWx0aXBsZSlcbmV4cG9ydCBmdW5jdGlvbiBuaWNlKHYsIG11bHRpcGxlcyA9IFs4LCA2LCA1LCA0LCAyLjUsIDJdKSB7XG4gICAgLy9jb21wdXRlIGJpZ2dlciBwb3dlciBvZiB0ZW4gYmVsb3dcbiAgICBjb25zdCB2XyA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nMTAodikpKVxuICAgIGZvciAobGV0IG11bHRpcGxlIG9mIG11bHRpcGxlcylcbiAgICAgICAgaWYgKHZfICogbXVsdGlwbGUgPD0gdikgcmV0dXJuIHZfICogbXVsdGlwbGVcbiAgICByZXR1cm4gdl9cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZEltYWdlKHNyYykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgeyByZXNvbHZlKGltZyk7IH07XG4gICAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZWplY3QobmV3IEVycm9yKCdFcnJvciBsb2FkaW5nIGltYWdlJykpOyB9O1xuICAgICAgICBpbWcuc3JjID0gc3JjO1xuICAgIH0pO1xufVxuXG5cblxuLypcbmV4cG9ydCBsZXQgbW9uaXRvciA9IGZhbHNlXG5cbmxldCBwcmV2aW91c0RhdGVcbmV4cG9ydCBmdW5jdGlvbiBtb25pdG9yRHVyYXRpb24obWVzc2FnZSkge1xuICAgIGNvbnN0IG5vd0RhdGUgPSBEYXRlLm5vdygpXG5cbiAgICAvL2ZpcnN0IGNhbGxcbiAgICBpZiAoIXByZXZpb3VzRGF0ZSkge1xuICAgICAgICBwcmV2aW91c0RhdGUgPSBub3dEYXRlXG4gICAgICAgIGNvbnNvbGUubG9nKHByZXZpb3VzRGF0ZSwgbWVzc2FnZSlcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZCA9IG5vd0RhdGUgLSBwcmV2aW91c0RhdGVcbiAgICBwcmV2aW91c0RhdGUgPSBub3dEYXRlXG4gICAgY29uc29sZS5sb2coZCwgbWVzc2FnZSlcbn1cbiovXG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHdpZHRoXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVpZ2h0XG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHJldHVybnMge3tjYW52YXM6SFRNTENhbnZhc0VsZW1lbnQsIGdsOldlYkdMUmVuZGVyaW5nQ29udGV4dH19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlV2ViR0xDYW52YXMod2lkdGgsIGhlaWdodCwgb3B0cz17fSkge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB3aWR0aClcbiAgICBjYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBoZWlnaHQpXG4gICAgLyoqIEB0eXBlIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9ICovXG4gICAgY29uc3QgZ2wgPSBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBvcHRzKVxuICAgIGlmICghZ2wpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gaW5pdGlhbGl6ZSBXZWJHTC4gWW91ciBicm93c2VyIG9yIG1hY2hpbmUgbWF5IG5vdCBzdXBwb3J0IGl0LicpXG4gICAgfVxuICAgIHJldHVybiB7IGNhbnZhczogY2FudmFzLCBnbDogZ2wgfVxufVxuXG4vKipcbiAqIEluaXRpYWxpemUgYSBzaGFkZXIgcHJvZ3JhbSwgc28gV2ViR0wga25vd3MgaG93IHRvIGRyYXcgb3VyIGRhdGFcbiAqXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2xcbiAqIEBwYXJhbSAgey4uLldlYkdMU2hhZGVyfSBzaGFkZXJzXG4gKiBAcmV0dXJucyB7V2ViR0xQcm9ncmFtfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFNoYWRlclByb2dyYW0oZ2wsIC4uLnNoYWRlcnMpIHtcbiAgICAvKiogQHR5cGUge1dlYkdMUHJvZ3JhbXxudWxsfSAqL1xuICAgIGNvbnN0IHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKClcbiAgICBpZiAocHJvZ3JhbSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgcHJvZ3JhbScpXG4gICAgZm9yIChjb25zdCBzaGFkZXIgb2Ygc2hhZGVycykgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHNoYWRlcilcbiAgICBnbC5saW5rUHJvZ3JhbShwcm9ncmFtKVxuICAgIGlmIChnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSkgcmV0dXJuIHByb2dyYW1cbiAgICB0aHJvdyBuZXcgRXJyb3IoZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkgfHwgJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgcHJvZ3JhbSAoMiknKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzaGFkZXIgb2YgdGhlIGdpdmVuIHR5cGUsIHVwbG9hZHMgdGhlIHNvdXJjZSBhbmQgY29tcGlsZXMgaXQuXG4gKlxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZVxuICogQHBhcmFtICB7Li4uc3RyaW5nfSBzb3VyY2VzXG4gKiBAcmV0dXJucyB7V2ViR0xTaGFkZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaGFkZXIoZ2wsIHR5cGUsIC4uLnNvdXJjZXMpIHtcbiAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfG51bGx9ICovXG4gICAgY29uc3Qgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHR5cGUpXG4gICAgaWYgKHNoYWRlciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgc2hhZGVyJylcbiAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzb3VyY2VzLmpvaW4oJ1xcbicpKVxuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKVxuICAgIGlmIChnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykpIHJldHVybiBzaGFkZXJcbiAgICB0aHJvdyBuZXcgRXJyb3IoZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpIHx8ICdDYW5ub3QgY3JlYXRlIHdlYkdMIHNoYWRlciAoMiknKVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHdlYkdMIGlzIHN1cHBvcnRlZFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tXZWJHTFN1cHBvcnQoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgcmV0dXJuICEhKCEhd2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCAmJlxuICAgICAgICAgICAgKGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnKSkpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vLyB0aGUgYXBwbGljYXRpb25cbmV4cG9ydCB7IE1hcCB9IGZyb20gJy4vY29yZS9NYXAuanMnXG5leHBvcnQgeyBHZW9DYW52YXMgfSBmcm9tICcuL2NvcmUvR2VvQ2FudmFzLmpzJ1xuZXhwb3J0IHsgU3R5bGUgfSBmcm9tICcuL2NvcmUvU3R5bGUuanMnXG5leHBvcnQgeyBMYXllciB9IGZyb20gJy4vY29yZS9MYXllci5qcydcbmV4cG9ydCB7IERhdGFzZXQgfSBmcm9tICcuL2NvcmUvRGF0YXNldC5qcydcbmV4cG9ydCB7IE11bHRpUmVzb2x1dGlvbkRhdGFzZXQgfSBmcm9tICcuL2NvcmUvTXVsdGlSZXNvbHV0aW9uRGF0YXNldC5qcydcblxuLy8gZXhwb3J0IGRhdGFzZXQgdHlwZXNcbmV4cG9ydCB7IFRpbGVkR3JpZCB9IGZyb20gJy4vZGF0YXNldC9UaWxlZEdyaWQuanMnXG5leHBvcnQgeyBDU1ZHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L0NTVkdyaWQuanMnXG5leHBvcnQgeyBKU0dyaWQgfSBmcm9tICcuL2RhdGFzZXQvSlNHcmlkLmpzJ1xuXG4vLyBleHBvcnQgc3R5bGVzXG5leHBvcnQgeyBTaGFwZUNvbG9yU2l6ZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaGFwZUNvbG9yU2l6ZVN0eWxlLmpzJ1xuZXhwb3J0IHsgU3Ryb2tlU3R5bGUgfSBmcm9tICcuL3N0eWxlL1N0cm9rZVN0eWxlLmpzJ1xuZXhwb3J0IHsgSm95UGxvdFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Kb3lQbG90U3R5bGUuanMnXG5leHBvcnQgeyBDb21wb3NpdGlvblN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Db21wb3NpdGlvblN0eWxlLmpzJ1xuZXhwb3J0IHsgU2VnbWVudFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TZWdtZW50U3R5bGUuanMnXG5leHBvcnQgeyBUZXh0U3R5bGUgfSBmcm9tICcuL3N0eWxlL1RleHRTdHlsZS5qcydcbmV4cG9ydCB7IFBpbGxhclN0eWxlIH0gZnJvbSAnLi9zdHlsZS9QaWxsYXJTdHlsZS5qcydcbmV4cG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vc3R5bGUvU2lkZVN0eWxlLmpzJ1xuLy9leHBvcnQgeyBDb250b3VyU3R5bGUgfSBmcm9tICcuL3N0eWxlL0NvbnRvdXJTdHlsZS5qcydcbmV4cG9ydCB7IFNpZGVDYXRlZ29yeVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaWRlQ2F0ZWdvcnlTdHlsZS5qcydcbmV4cG9ydCB7IERvdERlbnNpdHlTdHlsZSB9IGZyb20gJy4vc3R5bGUvRG90RGVuc2l0eVN0eWxlLmpzJ1xuZXhwb3J0IHsgVGFuYWthU3R5bGUgfSBmcm9tICcuL3N0eWxlL1RhbmFrYVN0eWxlLmpzJ1xuZXhwb3J0IHsgTGVnb1N0eWxlIH0gZnJvbSAnLi9zdHlsZS9MZWdvU3R5bGUuanMnXG5leHBvcnQgeyBTcXVhcmVDb2xvcldlYkdMU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NxdWFyZUNvbG9yV2ViR0xTdHlsZS5qcydcbmV4cG9ydCB7IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZS5qcydcbmV4cG9ydCB7IE1vc2FpY1N0eWxlIH0gZnJvbSAnLi9zdHlsZS9Nb3NhaWNTdHlsZS5qcydcbmV4cG9ydCB7IE5pbmphU3RhclN0eWxlIH0gZnJvbSAnLi9zdHlsZS9OaW5qYVN0YXJTdHlsZS5qcydcbmV4cG9ydCB7IFRpbWVTZXJpZXNTdHlsZSB9IGZyb20gJy4vc3R5bGUvVGltZVNlcmllc1N0eWxlLmpzJ1xuZXhwb3J0IHsgSXNvRmVuY2VTdHlsZSB9IGZyb20gJy4vc3R5bGUvSXNvRmVuY2VTdHlsZS5qcydcbmV4cG9ydCB7IEltYWdlU3R5bGUgfSBmcm9tICcuL3N0eWxlL0ltYWdlU3R5bGUuanMnXG5cbi8vIGV4cG9ydCBhZGRpdGlvbmFsIGxheWVyc1xuZXhwb3J0IHsgR3JpZExheWVyIH0gZnJvbSAnLi9sYXllci9HcmlkTGF5ZXIuanMnXG5leHBvcnQgeyBCYWNrZ3JvdW5kTGF5ZXIgfSBmcm9tICcuL2xheWVyL0JhY2tncm91bmRMYXllci5qcydcbmV4cG9ydCB7IEJhY2tncm91bmRMYXllcldNUyB9IGZyb20gJy4vbGF5ZXIvQmFja2dyb3VuZExheWVyV01TLmpzJ1xuZXhwb3J0IHsgQmFja2dyb3VuZExheWVySW1hZ2UgfSBmcm9tICcuL2xheWVyL0JhY2tncm91bmRMYXllckltYWdlLmpzJ1xuZXhwb3J0IHsgTGFiZWxMYXllciB9IGZyb20gJy4vbGF5ZXIvTGFiZWxMYXllci5qcydcbmV4cG9ydCB7IEdlb0pTT05MYXllciB9IGZyb20gJy4vbGF5ZXIvR2VvSlNPTkxheWVyLmpzJ1xuXG4vLyBleHBvcnQgbGVnZW5kc1xuZXhwb3J0IHsgQ29sb3JMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9Db2xvckxlZ2VuZC5qcydcbmV4cG9ydCB7IENvbG9yRGlzY3JldGVMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9Db2xvckRpc2NyZXRlTGVnZW5kLmpzJ1xuZXhwb3J0IHsgQ29sb3JDYXRlZ29yeUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yQ2F0ZWdvcnlMZWdlbmQuanMnXG5leHBvcnQgeyBTaXplTGVnZW5kLCBzaXplTGVnZW5kLCBzaXplTGVnZW5kVmlld1NjYWxlLCBzaXplRGlzY3JldGVMZWdlbmQsIHNpemVEaXNjcmV0ZVZpZXdTY2FsZUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL1NpemVMZWdlbmQuanMnXG5leHBvcnQgeyBPcmllbnRhdGlvbkxlZ2VuZCwgb3JpZW50YXRpb25MZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9PcmllbnRhdGlvbkxlZ2VuZC5qcydcbmV4cG9ydCB7IFRyaXZhcmlhdGVMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9Ucml2YXJpYXRlTGVnZW5kLmpzJ1xuXG4vLyBleHBvcnQgeyBnb1RvU3RyYWlnaHQsIHpvb21UbyB9IGZyb20gXCIuL3V0aWxzL3pvb21VdGlsc1wiXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3N0cmV0Y2hpbmcuanMnXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3NjYWxlLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy90cml2YXJpYXRlLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9jaGVybm9mZi5qcydcbmV4cG9ydCB7IG5pY2UsIGxvYWRJbWFnZSB9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXG5cbmltcG9ydCB7IEdlb0NhbnZhcyB9IGZyb20gJy4vY29yZS9HZW9DYW52YXMuanMnXG5leHBvcnQgY29uc3QgZ2V0UGFyYW1ldGVyQnlOYW1lID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZVxuXG4vLyBzZXQgZGVmYXVsdCBkMyBsb2NhbGVcbmltcG9ydCB7IGZvcm1hdERlZmF1bHRMb2NhbGUgfSBmcm9tICdkMy1mb3JtYXQnXG5mb3JtYXREZWZhdWx0TG9jYWxlKHtcbiAgICBkZWNpbWFsOiAnLicsXG4gICAgdGhvdXNhbmRzOiAnICcsXG4gICAgZ3JvdXBpbmc6IFszXSxcbiAgICBjdXJyZW5jeTogWycnLCAn4oKsJ10sXG59KVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|
|
16020
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUF5QixJQUFJO0FBQzdCLHdDQUF3QyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7QUFDMUQsd0NBQXdDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUMxRCwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSx3Q0FBd0MsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQzFELDBDQUEwQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJOztBQUVuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFtQyxlQUFlLFlBQVksU0FBUztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3hIb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDBCQUEwQiw4Q0FBTTtBQUN2QztBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDL0ZBO0FBQ1k7O0FBRVo7QUFDQTtBQUNBLGNBQWMsdUJBQXVCOztBQUVyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxlQUFlLHdCQUF3QjtBQUN2QyxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGdCQUFnQiw2RUFBNkU7QUFDN0Y7QUFDQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHdCQUF3QjtBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixzQ0FBc0M7QUFDdkQ7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQix1Q0FBdUM7QUFDekQ7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDBDQUEwQztBQUN6RCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQ0FBZ0M7QUFDL0MsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixvQkFBb0I7QUFDcEMsZUFBZSxjQUFjO0FBQzdCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFFBQVE7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FDNUpBO0FBQ1k7O0FBRVo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLDBCQUEwQjtBQUMzQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IscUNBQXFDO0FBQ3ZEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwyQ0FBMkM7QUFDN0Q7O0FBRUEsbUJBQW1CLHFDQUFxQztBQUN4RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25ELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1REE7QUFDWTs7QUFFWixnQkFBZ0IsMERBQTBEOztBQUUxRTtBQUNBO0FBQ0EsY0FBYyxrQ0FBa0M7O0FBRWhELENBQXFDO0FBQ2lCOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxlQUFlLG1CQUFtQjtBQUNsQyxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixtQkFBbUI7QUFDdEM7O0FBRUEsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsMEJBQTBCO0FBQzVDOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QixzQkFBc0I7O0FBRXRCO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUEsbUJBQW1CLGlDQUFpQztBQUNwRDs7QUFFQSxtQkFBbUIsaUNBQWlDO0FBQ3BEOztBQUVBLG1CQUFtQixpQ0FBaUM7QUFDcEQ7O0FBRUE7QUFDQSxtQkFBbUIsVUFBVTtBQUM3Qix3QkFBd0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQixpREFBWTtBQUNqQyxzQkFBc0IsNkNBQU07QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQSxpQkFBaUI7QUFDakIsY0FBYyx3REFBTTtBQUNwQjtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQzs7QUFFQTtBQUNBLG9CQUFvQix3REFBd0Q7QUFDNUUsNEJBQTRCO0FBQzVCOztBQUVBLGtCQUFrQixNQUFNO0FBQ3hCLGdCQUFnQjs7O0FBR2hCLGdCQUFnQixnQkFBZ0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCLFVBQVU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQzFVQTtBQUNZOztBQUVaLENBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sb0JBQW9CLGtEQUFROztBQUVuQztBQUNBO0FBQ0E7QUFDQSxlQUFlLGlDQUFpQztBQUNoRCxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4QkE7QUFDWTs7QUFFWixDQUFxQzs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLFFBQVE7QUFDM0I7O0FBRUE7O0FBRUEsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCOztBQUVBO0FBQ0EsZ0NBQWdDLHdEQUFNOztBQUV0QztBQUNBLHVCQUF1Qix3REFBTTtBQUM3QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdHQTtBQUNZOztBQUVaO0FBQ0EsQ0FBMEM7QUFDSjtBQUNnQjtBQUNVOztBQUVoRTtBQUNxQzs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGVBQWUsZ0JBQWdCO0FBQy9CLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9EQUFvRDs7QUFFcEQ7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCOztBQUVBO0FBQ0EsbUJBQW1CLG1CQUFtQjtBQUN0Qzs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLDZCQUE2QixvREFBUztBQUN0Qyx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQSxzQkFBc0Isd0RBQU07QUFDNUI7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0IsMkJBQTJCLGdEQUFPOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix3QkFBd0I7QUFDMUM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxzQkFBc0Isd0RBQU07QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxtRUFBbUU7QUFDbEYsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsTUFBTTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUEsZ0JBQWdCLFlBQVk7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdFQUFnRSxhQUFhO0FBQ2pHOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0JBQW9CO0FBQ3BDLGtCQUFrQixnRUFBZ0U7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxRQUFRO0FBQ3JELHVCQUF1Qiw0QkFBNEI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUIsdUNBQXVDO0FBQzlEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTs7O0FBR0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsa0JBQWtCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQiwrQkFBK0I7QUFDakQsZ0JBQWdCOztBQUVoQixrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUSxZQUFZLE1BQU07QUFDMUM7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGdCQUFnQixjQUFjLE1BQU07QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUSxjQUFjLE1BQU07QUFDNUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwrQkFBK0IsK0RBQVc7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DLHlFQUFnQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBLGtCQUFrQixNQUFNO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLGdCQUFnQjtBQUMvQixlQUFlLG1CQUFtQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNwZUE7QUFDWTs7QUFFWjtBQUNBO0FBQ0EsNkJBQTZCLGNBQWM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGVBQWUsZ0JBQWdCO0FBQy9CLGVBQWUsa0ZBQWtGO0FBQ2pHLGlCQUFpQiwwREFBMEQ7QUFDM0U7QUFDQSxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDOztBQUVBO0FBQ0Esa0JBQWtCLHFDQUFxQztBQUN2RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsaUJBQWlCO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsNENBQTRDO0FBQzNELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZ0JBQWdCO0FBQy9CLGVBQWUsOENBQThDO0FBQzdELGlCQUFpQiwwREFBMEQ7QUFDM0UsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7O0FDaEdBO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDLGNBQWMsMkdBQTJHOztBQUV6SDtBQUNBO0FBQ0E7QUFDQSxhQUFhLGdFQUFnRTs7QUFFN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sb0JBQW9CLGtEQUFRO0FBQ25DO0FBQ0E7QUFDQSxnQkFBZ0IsZ0hBQWdILG9CQUFvQixzS0FBc0s7QUFDMVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIscUJBQXFCO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsNENBQTRDO0FBQzdEOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0Isa0RBQWtELHNCQUFzQjtBQUMxRixzREFBc0QsY0FBYzs7QUFFcEU7QUFDQSxrQkFBa0Isb0JBQW9CO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsbUNBQW1DO0FBQ3JEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQ0FBa0M7QUFDakQsZUFBZSxpQ0FBaUM7QUFDaEQsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxrQkFBa0Isa0RBQWtELHNCQUFzQjtBQUMxRjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0RBQWtELHNCQUFzQixjQUFjLE1BQU07QUFDNUc7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCLE1BQU07QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsbUNBQW1DO0FBQ2xELGlCQUFpQixNQUFNO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2xHQTtBQUNZOztBQUVaLENBQXFDO0FBQ3JDLFdBQVcsYUFBYTs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjs7QUFFQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLGFBQWE7QUFDaEM7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixrQ0FBa0M7QUFDcEQsdUJBQXVCLHdEQUFNOztBQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQix3REFBTTtBQUNqQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdExBO0FBQ1k7O0FBRVosZ0JBQWdCLCtEQUErRCxrQkFBa0IsaUZBQWlGOztBQUVsTCxDQUE4QjtBQUNjOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxzQkFBc0IscURBQU87QUFDcEM7QUFDQSxlQUFlLDhCQUE4QjtBQUM3QyxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGdCQUFnQixzRkFBc0Y7QUFDdEc7QUFDQSwrQ0FBK0M7QUFDL0M7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQiwyQ0FBMkM7QUFDN0Q7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLG1EQUFtRDtBQUNsRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsdUNBQXVDLG9EQUFHOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSx5Q0FBeUM7QUFDeEQsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDL0dBO0FBQ1k7O0FBRVosQ0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLHFCQUFxQixxREFBTzs7QUFFbkM7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxnQkFBZ0I7QUFDL0IsaUJBQWlCO0FBQ2pCO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsMkNBQTJDO0FBQzdEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxtREFBbUQ7QUFDbEU7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTtBQUNBLGVBQWUseUNBQXlDO0FBQ3hELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckRBO0FBQ1k7O0FBRVosZ0JBQWdCLCtEQUErRCxrQkFBa0IsaUZBQWlGOztBQUVsTDtBQUNBLENBQTRDO0FBQzVDLFdBQVcsMkJBQTJCOztBQUV0QztBQUNvQzs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sd0JBQXdCLHFEQUFPO0FBQ3RDO0FBQ0EsZUFBZSw4QkFBOEI7QUFDN0MsZUFBZSxRQUFRO0FBQ3ZCLGdCQUFnQixxRUFBcUU7QUFDckY7QUFDQSxtQ0FBbUM7QUFDbkM7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSx1Q0FBdUMsb0RBQUk7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHlDQUF5QztBQUN4RCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHlDQUF5QztBQUN4RCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsbURBQW1EO0FBQ3RFO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIseUNBQXlDO0FBQzVEOztBQUVBLGtEQUFrRCxrQ0FBa0M7QUFDcEYsc0RBQXNELGtDQUFrQztBQUN4RjtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCLFFBQVE7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiw0Q0FBNEM7QUFDM0U7O0FBRUE7QUFDQSxtQ0FBbUMsNENBQTRDO0FBQy9FO0FBQ0EsMkNBQTJDLDZDQUFHOztBQUU5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSx5Q0FBeUM7QUFDeEQsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsbURBQW1EO0FBQ3RFO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIseUNBQXlDO0FBQzVEOztBQUVBLGtEQUFrRCxrQ0FBa0M7QUFDcEY7QUFDQSxzREFBc0Qsa0NBQWtDO0FBQ3hGO0FBQ0EsMkJBQTJCLFFBQVE7QUFDbkM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUEsZUFBZSx3Q0FBd0M7QUFDdkQ7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQSxlQUFlLFFBQVE7QUFDdkI7O0FBRUE7QUFDQTs7QUFFQSxlQUFlLHNDQUFzQztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDL1JBO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDhCQUE4QixpREFBSztBQUMxQztBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQSxtQkFBbUIsdUNBQXVDO0FBQzFEOztBQUVBLG1CQUFtQixnQkFBZ0I7QUFDbkM7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSx5QkFBeUI7QUFDeEMsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsdUNBQXVDO0FBQ3RELGlCQUFpQjtBQUNqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsOEJBQThCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQixVQUFVO0FBQ3JDLCtCQUErQixVQUFVO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDN0pBO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sbUNBQW1DLGlEQUFLO0FBQy9DO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7O0FBRUE7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQSxrQkFBa0IsNEJBQTRCO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLDBDQUEwQztBQUN6RCxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ25GQTtBQUNZOztBQUVaLENBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGlDQUFpQyxpREFBSztBQUM3QztBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBLG1CQUFtQiw0QkFBNEI7QUFDL0M7O0FBRUEsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBLG1CQUFtQixrQkFBa0I7QUFDckM7QUFDQSxtQkFBbUIsa0JBQWtCO0FBQ3JDO0FBQ0EsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxlQUFlLHVDQUF1QztBQUN0RCxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0dBO0FBQ1k7O0FBRVosQ0FBd0M7QUFDVDs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7QUFDTywyQkFBMkIsaURBQUs7QUFDdkM7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsMEJBQTBCO0FBQzVDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0NBQWdDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdDQUFnQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7Ozs7QUFJQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGdDQUFnQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtEQUFrRDtBQUNwRTs7O0FBR0E7QUFDQTtBQUNBLGtCQUFrQiw0QkFBNEI7QUFDOUM7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxlQUFlLDBDQUEwQztBQUN6RCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBLGNBQWM7O0FBRWQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGVBQWU7QUFDL0M7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsaUJBQWlCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0Msb0RBQUk7O0FBRXBDLHdCQUF3QixpQkFBaUI7QUFDekM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzTkE7QUFDWTs7QUFFWixDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sd0JBQXdCLGlEQUFLO0FBQ3BDO0FBQ0EsZUFBZSxtR0FBbUc7QUFDbEgsZUFBZSx1Q0FBdUM7QUFDdEQsZ0JBQWdCLG9OQUFvTjtBQUNwTztBQUNBLDBDQUEwQztBQUMxQztBQUNBOztBQUVBLG1CQUFtQixtR0FBbUc7QUFDdEg7O0FBRUEsbUJBQW1CLHVDQUF1QztBQUMxRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix5REFBeUQ7QUFDM0U7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsZ0RBQWdEO0FBQ25FO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsK0VBQStFO0FBQzlGLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZ0NBQWdDO0FBQy9DLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQzVKQTtBQUNZOztBQUVaLENBQXdDO0FBQ1Y7O0FBRTlCO0FBQ0EsY0FBYyxvQ0FBb0M7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLHlCQUF5QixpREFBSztBQUNyQztBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQiwrQkFBK0I7QUFDakQ7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQiwrQkFBK0I7QUFDakQ7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQiwrQkFBK0I7QUFDakQ7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQiwrQkFBK0I7QUFDakQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQzs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQzs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLDJCQUEyQjtBQUM3Qzs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHVDQUF1QztBQUN0RCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEMsK0JBQStCLDZDQUFHOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2hNQTtBQUNZOztBQUVaLENBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxrQ0FBa0MsbURBQU07QUFDL0MsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix5QkFBeUI7QUFDM0M7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixrQ0FBa0M7QUFDcEQ7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdCQUF3QixRQUFRO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQzdHQTtBQUNZOztBQUVaLENBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGtDQUFrQyxtREFBTTtBQUMvQyxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCLDREQUE0RDtBQUN4RjtBQUNBLDRCQUE0Qiw0REFBNEQ7QUFDeEY7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0IsK0NBQStDO0FBQy9EO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QixRQUFRO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLFFBQVE7O0FBRWhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3JHQTtBQUNZOztBQUVaLENBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDBCQUEwQixtREFBTTtBQUN2QyxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQiwrQ0FBK0M7QUFDL0Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLGVBQWU7O0FBRW5GO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixPQUFPO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0IsZ0JBQWdCO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcEhBO0FBQ1k7O0FBRVosQ0FBMEM7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGdDQUFnQyxtREFBTTtBQUM3QyxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsMkdBQTJHO0FBQzVIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLGdCQUFnQjtBQUMzQixXQUFXLGdCQUFnQjtBQUMzQixXQUFXLFFBQVE7QUFDbkIsZUFBZTtBQUNmO0FBQ08sMERBQTBEO0FBQ2pFO0FBQ0Esb0JBQW9CLHlCQUF5QjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFGQTtBQUNZOztBQUVaLENBQTBDO0FBQ0Y7QUFDVjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08seUJBQXlCLG1EQUFNO0FBQ3RDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQiw4RkFBOEY7QUFDbEg7O0FBRUE7QUFDQSxvQkFBb0IsMENBQTBDO0FBQzlEOztBQUVBO0FBQ0Esb0JBQW9CLHdDQUF3QztBQUM1RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLG1HQUFtRztBQUNwSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTs7QUFFVjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSwrRUFBK0U7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0EsV0FBVyxnQkFBZ0I7QUFDM0IsV0FBVyx5QkFBeUI7QUFDcEMsWUFBWSxTQUFTO0FBQ3JCLGFBQWE7QUFDYjtBQUNPLDJDQUEyQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZLHFEQUFxRDtBQUNqRSxXQUFXLEdBQUc7QUFDZCxhQUFhO0FBQ2I7QUFDTyw2Q0FBNkM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMscURBQUksTUFBTSxvREFBRztBQUN4RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGlCQUFpQjtBQUM3QixZQUFZLGlCQUFpQjtBQUM3QixZQUFZLFNBQVM7QUFDckIsYUFBYTtBQUNiO0FBQ08sb0RBQW9EO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxRQUFRO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZLFNBQVM7QUFDckIsWUFBWSxTQUFTO0FBQ3JCLGFBQWE7QUFDYjtBQUNPLDJEQUEyRDtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZLDBCQUEwQjtBQUN0QyxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQy9OQTtBQUNZOztBQUVaLENBQXFDO0FBQ0s7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTywrQkFBK0IsbURBQU07QUFDNUMsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCx3REFBd0Q7QUFDakgsb0JBQW9CLHlEQUFNO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsMkRBQTJEO0FBQzNELG9CQUFvQix3REFBTTtBQUMxQjtBQUNBLGlCQUFpQjtBQUNqQiwrREFBK0QsbUJBQW1CO0FBQ2xGOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFVBQVU7O0FBRVY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkIsU0FBUztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2QixTQUFTO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUzs7QUFFVDtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDak5BO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDLGNBQWMsb0VBQW9FOztBQUVsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTywrQkFBK0IsaURBQUs7QUFDM0MsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLG1GQUFtRjtBQUNyRzs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0IseUVBQXlFO0FBQzNGOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IseUVBQXlFO0FBQzNGOztBQUVBO0FBQ0Esa0JBQWtCLHlFQUF5RTtBQUMzRjs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDJDQUEyQztBQUMxRCxlQUFlLDBDQUEwQztBQUN6RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1DQUFtQyxRQUFRO0FBQzNDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUMsUUFBUTtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1DQUFtQyxRQUFRO0FBQzNDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsaUVBQWlFO0FBQzlGO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL1JBO0FBQ1k7O0FBRVosQ0FBd0M7QUFDQTtBQUNtQztBQUNOO0FBQ3JDOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sOEJBQThCLGlEQUFLO0FBQzFDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGOztBQUVBO0FBQ0Esa0JBQWtCLHdDQUF3QztBQUMxRDs7QUFFQTtBQUNBLGtCQUFrQix3Q0FBd0M7QUFDMUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHdDQUF3QztBQUN2RCxlQUFlLHVDQUF1QztBQUN0RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIscURBQVk7O0FBRWpDLFlBQVksdUVBQWlCO0FBQzdCO0FBQ0EsMEJBQTBCLHFFQUFlO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCLDhFQUFtQjs7QUFFaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQixvREFBSztBQUNoQzs7QUFFQTtBQUNBLGdDQUFnQyxnQkFBZ0I7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGdCQUFnQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixpRUFBaUU7QUFDOUY7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNySUE7QUFDWTs7QUFFWixDQUE4QjtBQUNVO0FBQ0s7O0FBRTdDO0FBQ0E7QUFDQTtBQUNBO0FBQ08seUJBQXlCLGlEQUFLOztBQUVyQyxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGOztBQUVBO0FBQ0EsbUJBQW1CLG1GQUFtRjtBQUN0Rzs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7O0FBRUE7QUFDQSxlQUFlLDJDQUEyQztBQUMxRCxlQUFlLDBDQUEwQztBQUN6RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBLDZCQUE2QixpRUFBaUU7QUFDOUY7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2R0E7QUFDWTs7QUFFWixDQUF3QztBQUNFOztBQUUxQyxlQUFlLDZIQUE2SDs7QUFFNUk7QUFDQTtBQUNBO0FBQ0E7QUFDTyw0QkFBNEIsaURBQUs7O0FBRXhDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGOztBQUVBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQSxrQkFBa0IseUVBQXlFO0FBQzNGOztBQUVBO0FBQ0EsaUJBQWlCLHlFQUF5RTtBQUMxRjs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLDJDQUEyQztBQUMxRCxlQUFlLDBDQUEwQztBQUN6RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsY0FBYztBQUNsQyxzQkFBc0Isb0RBQVM7O0FBRS9CO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixpRUFBaUU7QUFDOUY7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDMU1BO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ08sMkJBQTJCLGlEQUFLO0FBQ3ZDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0IsaUJBQWlCLHVCQUF1Qix3QkFBd0I7QUFDbEY7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUIsdUJBQXVCLHdCQUF3QjtBQUNsRjtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQix1QkFBdUIsd0JBQXdCO0FBQ2xGO0FBQ0E7OztBQUdBO0FBQ0EsZUFBZSwyQ0FBMkM7QUFDMUQsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIseUJBQXlCO0FBQzlDLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBLDJCQUEyQixXQUFXO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDOztBQUVBO0FBQ0EsK0JBQStCLFdBQVc7QUFDMUM7QUFDQSwyQkFBMkIsUUFBUTtBQUNuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0hBO0FBQ1k7O0FBRVosQ0FBOEM7QUFDQTtBQUNvQztBQUMxQzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUFFUCwrQ0FBK0M7QUFDL0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQix3REFBVztBQUM5QjtBQUNBLHdCQUF3Qix3REFBVztBQUNuQztBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHVFQUF1RTtBQUN0RztBQUNBOztBQUVBO0FBQ0EsZUFBZSxvREFBb0Q7QUFDbkUsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBc0IsNEZBQTZCLEdBQUcsMEJBQTBCO0FBQ2hGO0FBQ0Esd0JBQXdCLHdEQUFXLEdBQUcsOERBQThEOztBQUVwRywyQ0FBMkMsa0RBQWtEO0FBQzdGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGlEQUFLO0FBQ2hDLGdCQUFnQixrQkFBa0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3R0E7QUFDWTs7QUFFWixDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDTywwQkFBMEIsaURBQUs7QUFDdEMsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5Rjs7QUFFQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLHdDQUF3QztBQUN2RCxlQUFlLHVDQUF1QztBQUN0RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCLGlFQUFpRTtBQUM5RjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbEdBO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ08sNkJBQTZCLGlEQUFLO0FBQ3pDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDRFQUE0RTtBQUMvRjs7QUFFQTtBQUNBLGtCQUFrQixpREFBaUQ7QUFDbkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSwyQ0FBMkM7QUFDMUQsZUFBZSx1Q0FBdUM7QUFDdEQsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCLGlFQUFpRTtBQUM5RjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDckdBO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ08sMEJBQTBCLGlEQUFLOztBQUV0QyxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGOztBQUVBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5Rjs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0IseUNBQXlDO0FBQzNEOztBQUVBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCOztBQUVBO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQTtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7O0FBRUEsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsd0NBQXdDO0FBQ3ZELGVBQWUsdUNBQXVDO0FBQ3RELGVBQWUsUUFBUTtBQUN2QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEMsc0NBQXNDO0FBQ2xGOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsaUVBQWlFO0FBQzlGO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvTUE7QUFDWTs7QUFFWixDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sMkJBQTJCLGlEQUFLO0FBQ3ZDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGOztBQUVBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5Rjs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHdDQUF3QztBQUN2RCxlQUFlLHVDQUF1QztBQUN0RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixRQUFRO0FBQy9CO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsa0VBQWtFO0FBQy9GO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4R0E7QUFDWTs7QUFFWixDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxrQ0FBa0MsaURBQUs7QUFDOUMsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5Rjs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0Isb0dBQW9HO0FBQ3RIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSwyQ0FBMkM7QUFDMUQsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCLGtFQUFrRTtBQUMvRjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbklBO0FBQ1k7O0FBRVosQ0FBMEM7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGdDQUFnQyxvREFBUztBQUNoRCxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0Isb0VBQW9FO0FBQ3RGOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQTs7QUFFQTtBQUNBLGVBQWUsMkNBQTJDO0FBQzFELGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsUUFBUTtBQUN2QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxvQkFBb0IsdUNBQXVDO0FBQzNELHNCQUFzQixvREFBUztBQUMvQjs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCLGlFQUFpRTtBQUM5RjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDakhBO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDLGdCQUFnQixnSUFBZ0k7O0FBRWhKO0FBQ0EsYUFBYSx5Q0FBeUM7O0FBRXREO0FBQ0E7QUFDQTtBQUNBO0FBQ08sd0JBQXdCLGlEQUFLO0FBQ3BDLGdCQUFnQixRQUFRO0FBQ3hCLHlCQUF5QjtBQUN6Qjs7QUFFQTtBQUNBLGtCQUFrQiwrQ0FBK0M7QUFDakU7O0FBRUE7QUFDQSxrQkFBa0IsK0NBQStDO0FBQ2pFOztBQUVBO0FBQ0Esa0JBQWtCLCtDQUErQztBQUNqRTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLHdDQUF3QztBQUN2RCxlQUFlLFFBQVE7QUFDdkIsZUFBZSx1Q0FBdUM7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxjQUFjOztBQUVkO0FBQ0EsMkJBQTJCLGtCQUFrQjtBQUM3QztBQUNBOztBQUVBO0FBQ0EsMkJBQTJCLGtCQUFrQjtBQUM3QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixpRUFBaUU7QUFDOUY7Ozs7QUFJQTtBQUNBO0FBQ0EsZUFBZSx3Q0FBd0M7QUFDdkQsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUztBQUN4QixlQUFlLFNBQVM7QUFDeEIsZUFBZSxTQUFTO0FBQ3hCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0Esb0JBQW9CLGVBQWU7QUFDbkM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isa0JBQWtCO0FBQzFDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isa0JBQWtCO0FBQzFDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1TUE7QUFDWTs7QUFFWixDQUF3QztBQUNnQjtBQUNtQzs7QUFFM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDRDQUE0QyxpREFBSztBQUN4RCxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixvREFBb0Q7QUFDdEU7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBLG9CQUFvQixpQkFBaUI7QUFDckM7O0FBRUEsb0JBQW9CLFNBQVM7QUFDN0I7QUFDQSx3QkFBd0Isa0JBQWtCOztBQUUxQyxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGdDQUFnQztBQUNsRDs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLGlDQUFpQztBQUNwRCx1QkFBdUIsb0dBQThCO0FBQ3JEOztBQUVBO0FBQ0EsZUFBZSwyQ0FBMkM7QUFDMUQsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsUUFBUTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLHFFQUFlO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsMkNBQTJDO0FBQ3hFO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0dBO0FBQ1k7O0FBRVosQ0FBd0M7QUFDZ0I7QUFDNkI7O0FBRXJGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxvQ0FBb0MsaURBQUs7QUFDaEQsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IseUVBQXlFO0FBQzNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdDQUFnQztBQUNsRDs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGdDQUFnQztBQUNsRDtBQUNBOztBQUVBO0FBQ0EsZUFBZSwyQ0FBMkM7QUFDMUQsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQixxRUFBZTtBQUNyQztBQUNBO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHdCQUF3Qiw4RkFBMkI7O0FBRW5EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCLGlFQUFpRTtBQUM5RjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDN0hBO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ08sMEJBQTBCLGlEQUFLO0FBQ3RDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQix5RUFBeUU7QUFDM0Y7O0FBRUE7QUFDQSxrQkFBa0IseUVBQXlFO0FBQzNGOztBQUVBO0FBQ0Esa0JBQWtCLHlFQUF5RTtBQUMzRjs7QUFFQTtBQUNBLGlCQUFpQixtR0FBbUc7QUFDcEg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHdDQUF3QztBQUN2RCxlQUFlLHVDQUF1QztBQUN0RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCLGlFQUFpRTtBQUM5RjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2SUE7QUFDWTs7QUFFWixDQUEwQztBQUN3QztBQUNBOztBQUVsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsZUFBZSxvREFBb0Q7QUFDbkUsZUFBZSxnQkFBZ0I7QUFDL0IsZUFBZSxnQkFBZ0I7QUFDL0IsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQjtBQUNqQjtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixrQ0FBa0M7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSwyQkFBMkIsMkRBQUs7QUFDaEM7QUFDQTtBQUNBLHdCQUF3QixtQkFBbUI7O0FBRTNDLDhCQUE4Qiw0RkFBNkI7QUFDM0Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhCQUE4QixvREFBUztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbkVBO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ08sd0JBQXdCLGlEQUFLO0FBQ3BDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGOztBQUVBO0FBQ0Esa0JBQWtCLDJFQUEyRTtBQUM3Rjs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSx3Q0FBd0M7QUFDdkQsZUFBZSx1Q0FBdUM7QUFDdEQsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCLGlFQUFpRTtBQUM5Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGdCQUFnQjtBQUMvQixlQUFlLHFDQUFxQztBQUNwRCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNZOztBQUVaLENBQXdDOztBQUV4QyxjQUFjLHdDQUF3Qzs7QUFFdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyw4QkFBOEIsaURBQUs7QUFDMUMsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQzs7QUFFQTtBQUNBLGtCQUFrQiwwQkFBMEI7QUFDNUM7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixrRUFBa0U7QUFDcEY7QUFDQSxtQkFBbUIsa0VBQWtFO0FBQ3JGOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0Isa0VBQWtFO0FBQ3BGO0FBQ0EsbUJBQW1CLGtFQUFrRTtBQUNyRjtBQUNBLG1CQUFtQiwyRUFBMkU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGOztBQUVBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMkNBQTJDO0FBQzFELGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsUUFBUTtBQUN2QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEIsUUFBUTtBQUNwQzs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsNkJBQTZCLGlFQUFpRTtBQUM5Rjs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbk9BO0FBQ1k7O0FBRVosQ0FBaUU7QUFDakM7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0EsZUFBZSx1QkFBdUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLGlFQUFpQjtBQUN4QztBQUNBLFlBQVksNERBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSw0REFBWTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixvREFBSztBQUN4QixzQkFBc0I7QUFDdEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNySEE7QUFDWTs7QUFFWixDQUFpRTtBQUNqQzs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxHQUFHO0FBQ2xCLGVBQWUsZ0JBQWdCO0FBQy9CLGdCQUFnQiwwQkFBMEI7QUFDMUMsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsa0JBQWtCO0FBQ2pDO0FBQ0E7QUFDQSxtQkFBbUIsdUJBQXVCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixhQUFhO0FBQ2hDLHdCQUF3Qiw0REFBWTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyw4QkFBOEI7QUFDOUIsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQSxnQ0FBZ0MsbUJBQW1CLHVDQUF1QztBQUMxRjtBQUNBLGFBQWE7QUFDYjtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQSxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEMscUZBQXFGO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDLGdHQUFnRztBQUNoRztBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RCxnR0FBZ0c7QUFDaEc7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQSxtRkFBbUY7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQsNEdBQTRHO0FBQzVHO0FBQ0EsY0FBYztBQUNkO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0EsVUFBVTtBQUNWLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBLDREQUE0RCxnQkFBZ0I7QUFDNUUsaUVBQWlFLGdCQUFnQjtBQUNqRjtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckMscUNBQXFDO0FBQ3JDLHFEQUFxRCxPQUFPLE9BQU8sa0JBQWtCO0FBQ3JGLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsMkJBQTJCLHNCQUFzQixnQkFBZ0IscUNBQXFDO0FBQ3RHOztBQUVBO0FBQ0Esa0dBQWtHO0FBQ2xHO0FBQ0EsNkRBQTZEOztBQUU3RDs7QUFFQSxtQkFBbUIsYUFBYTtBQUNoQyx3QkFBd0IsNERBQVk7O0FBRXBDLG1CQUFtQixjQUFjO0FBQ2pDLHVCQUF1QixpRUFBaUI7QUFDeEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0IsbUJBQW1CO0FBQzNDLHNCQUFzQixvREFBSzs7QUFFM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDck9BO0FBQ1k7O0FBRVosQ0FBaUU7QUFDakM7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQzs7QUFFQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxtQkFBbUI7QUFDN0Q7QUFDQTtBQUNBLHdCQUF3QixtQkFBbUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0Esd0JBQXdCLG1CQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0EsK0RBQStELEdBQUc7QUFDbEU7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsYUFBYTtBQUNoQyx3QkFBd0IsNERBQVk7O0FBRXBDLG1CQUFtQixhQUFhO0FBQ2hDLHdCQUF3Qiw0REFBWTs7QUFFcEMsbUJBQW1CLGNBQWM7QUFDakMsd0JBQXdCLGlFQUFpQjtBQUN6Qzs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLHdCQUF3QjtBQUNoRCxzQkFBc0Isb0RBQUs7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BJQTtBQUNZOztBQUVaLENBQXNDO0FBQ0U7O0FBRXhDO0FBQ0E7QUFDQSxhQUFhLHlCQUF5Qjs7QUFFdEM7QUFDQTtBQUNBLFlBQVkseUJBQXlCOzs7QUFHckM7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLDBPQUEwTztBQUN2UCxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxvREFBRztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGlJQUFpSTtBQUM5SSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG9EQUFhO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxxQkFBcUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBLGFBQWEsbUtBQW1LO0FBQ2hMLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsMkNBQTJDO0FBQzlELHVCQUF1QixvREFBTTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGFBQWE7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBLGFBQWEsbUpBQW1KO0FBQ2hLLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DLHFCQUFxQjs7QUFFekQsa0JBQWtCLG9EQUFhO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBLFdBQVcsZ0JBQWdCO0FBQzNCO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxnQkFBZ0I7QUFDM0IsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcseUJBQXlCO0FBQ3BDLFdBQVcsUUFBUTtBQUNuQjtBQUNPO0FBQ1A7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuT0E7QUFDWTs7QUFFWjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLFdBQVc7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EseUJBQXlCLFlBQVk7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3BJQTtBQUNZOztBQUVaLENBQStDOzs7O0FBSXhDLGtFQUFrRTs7QUFFekU7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7OztBQUlPLCtFQUErRTs7QUFFdEY7QUFDQTs7QUFFQTtBQUNBLDBEQUEwRCxzREFBYzs7QUFFeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7O0FBRUEseUVBQXlFO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwRUFBMEU7QUFDMUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQzFNQTtBQUNZOztBQUVaO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLGdCQUFnQjtBQUMzQjtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixtQkFBbUI7QUFDdkM7QUFDQTs7OztBQUlBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdPO0FBQ1A7QUFDQTtBQUNBLG1DQUFtQztBQUNuQyxvQ0FBb0M7QUFDcEM7QUFDQSxLQUFLO0FBQ0w7Ozs7QUFJQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNURBO0FBQ1k7O0FBRVo7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixjQUFjO0FBQ2Q7QUFDTywrQ0FBK0M7QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsZUFBZSx1QkFBdUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyx1QkFBdUI7QUFDbEMsWUFBWSxnQkFBZ0I7QUFDNUIsYUFBYTtBQUNiO0FBQ087QUFDUCxlQUFlLG1CQUFtQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLFFBQVE7QUFDbkIsWUFBWSxXQUFXO0FBQ3ZCLGFBQWE7QUFDYjtBQUNPO0FBQ1AsZUFBZSxrQkFBa0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7Ozs7Ozs7VUNyRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0N0QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTkE7QUFDWTs7QUFFWjtBQUNtQztBQUNZO0FBQ1I7QUFDQTtBQUNJO0FBQzhCOztBQUV6RTtBQUNrRDtBQUNKO0FBQ0Y7O0FBRTVDO0FBQ29FO0FBQ2hCO0FBQ0U7QUFDUTtBQUNSO0FBQ047QUFDSTtBQUNKO0FBQ2hELFdBQVcsZUFBZTtBQUNzQztBQUNKO0FBQ1I7QUFDSjtBQUN3QjtBQUNnQjtBQUNwQztBQUNNO0FBQ0U7QUFDSjtBQUNOOztBQUVsRDtBQUNnRDtBQUNZO0FBQ007QUFDSTtBQUNwQjtBQUNJOztBQUV0RDtBQUNxRDtBQUNnQjtBQUNBO0FBQ2dFO0FBQ2pEO0FBQ3JCOztBQUUvRCxZQUFZLHVCQUF1QjtBQUNFO0FBQ0w7QUFDSztBQUNyQztBQUN1QztBQUN2Qzs7QUFFQSxDQUErQztBQUN4QywyQkFBMkIseURBQVM7O0FBRTNDO0FBQ0EsQ0FBK0M7QUFDL0Msc0RBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWR2aXovd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2FzY2VuZGluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9iaXNlY3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYmlzZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvZGVzY2VuZGluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9leHRlbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvZ3JlYXRlc3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWF4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21heEluZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21pbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9taW5JbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9udW1iZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcGVybXV0ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9xdWFudGlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9xdWlja3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zb3J0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2NvbG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2RlZmluZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9sYWIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvbWF0aC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRpc3BhdGNoL3NyYy9kaXNwYXRjaC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL25vZHJhZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL25vZXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kc3Yvc3JjL2Nzdi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvZHN2LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZHN2L3NyYy90c3YuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9jdWJpYy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZldGNoL3NyYy9kc3YuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvanNvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZldGNoL3NyYy90ZXh0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9kZWZhdWx0TG9jYWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9leHBvbmVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0RGVjaW1hbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0R3JvdXAuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdE51bWVyYWxzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRQcmVmaXhBdXRvLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRSb3VuZGVkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRTcGVjaWZpZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFRyaW0uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFR5cGVzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvbG9jYWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2Jhc2lzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2Jhc2lzQ2xvc2VkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2xhYi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9udW1iZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvcmdiLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3N0cmluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vZGVjb21wb3NlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vcGFyc2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvem9vbS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXJhbmRvbS9zcmMvZGVmYXVsdFNvdXJjZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXJhbmRvbS9zcmMvbm9ybWFsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2luaXQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvcXVhbnRpbGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2FycmF5LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY3JlYXRvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbWF0Y2hlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2VzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9wb2ludGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9hcHBlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9hdHRyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2FsbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NsYXNzZWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jbG9uZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdGEuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kYXR1bS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Rpc3BhdGNoLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZWFjaC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VtcHR5LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW50ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9leGl0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZmlsdGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaHRtbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5zZXJ0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9qb2luLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbG93ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9tZXJnZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL25vZGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2Rlcy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vb3JkZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JhaXNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcmVtb3ZlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0QWxsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RDaGlsZHJlbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NpemUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zb3J0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc3BhcnNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi90ZXh0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0b3JBbGwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NvdXJjZUV2ZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy93aW5kb3cuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZW91dC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2FjdGl2ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvaW50ZXJydXB0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2ludGVycnVwdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi90cmFuc2l0aW9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyVHdlZW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2RlbGF5LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kdXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZWFzZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZWFzZVZhcnlpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZmlsdGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW50ZXJwb2xhdGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL21lcmdlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9vbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vcmVtb3ZlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zY2hlZHVsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3RBbGwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdGlvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlVHdlZW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RleHQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RleHRUd2Vlbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHdlZW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2V2ZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9ub2V2ZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvdHJhbnNmb3JtLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvem9vbS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2J1dHRvbi9CdXR0b24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9idXR0b24vRnVsbHNjcmVlbkJ1dHRvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2J1dHRvbi9ab29tQnV0dG9ucy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvRGF0YXNldC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvRHJhd2FibGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL0dlb0NhbnZhcy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL0xlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvTWFwLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9TdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvVG9vbHRpcC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2RhdGFzZXQvQ1NWR3JpZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2RhdGFzZXQvSlNHcmlkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvZGF0YXNldC9UaWxlZEdyaWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9CYWNrZ3JvdW5kTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9CYWNrZ3JvdW5kTGF5ZXJJbWFnZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xheWVyL0JhY2tncm91bmRMYXllcldNUy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xheWVyL0dlb0pTT05MYXllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xheWVyL0dyaWRMYXllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xheWVyL0xhYmVsTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvQ29sb3JDYXRlZ29yeUxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9Db2xvckRpc2NyZXRlTGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL0NvbG9yTGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL09yaWVudGF0aW9uTGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL1NpemVMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvVHJpdmFyaWF0ZUxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0NvbXBvc2l0aW9uU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9Eb3REZW5zaXR5U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9JbWFnZVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvSXNvRmVuY2VTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0pveVBsb3RTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0xlZ29TdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL01vc2FpY1N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvTmluamFTdGFyU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9QaWxsYXJTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1NlZ21lbnRTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1NoYXBlQ29sb3JTaXplU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TaWRlQ2F0ZWdvcnlTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1NpZGVTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1NxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU3F1YXJlQ29sb3JXZWJHTFN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU3Ryb2tlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9UYW5ha2FTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1RleHRTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1RpbWVTZXJpZXNTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy9zY2FsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL3N0cmV0Y2hpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy90cml2YXJpYXRlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy93ZWJHTFV0aWxzLmpzIiwid2VicGFjazovL2dyaWR2aXovd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2dyaWR2aXovd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImdyaWR2aXpcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiZ3JpZHZpelwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsICgpID0+IHtcbnJldHVybiAiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA9PSBudWxsIHx8IGIgPT0gbnVsbCA/IE5hTiA6IGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcbmltcG9ydCBiaXNlY3RvciBmcm9tIFwiLi9iaXNlY3Rvci5qc1wiO1xuaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxuY29uc3QgYXNjZW5kaW5nQmlzZWN0ID0gYmlzZWN0b3IoYXNjZW5kaW5nKTtcbmV4cG9ydCBjb25zdCBiaXNlY3RSaWdodCA9IGFzY2VuZGluZ0Jpc2VjdC5yaWdodDtcbmV4cG9ydCBjb25zdCBiaXNlY3RMZWZ0ID0gYXNjZW5kaW5nQmlzZWN0LmxlZnQ7XG5leHBvcnQgY29uc3QgYmlzZWN0Q2VudGVyID0gYmlzZWN0b3IobnVtYmVyKS5jZW50ZXI7XG5leHBvcnQgZGVmYXVsdCBiaXNlY3RSaWdodDtcbiIsImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nLmpzXCI7XG5pbXBvcnQgZGVzY2VuZGluZyBmcm9tIFwiLi9kZXNjZW5kaW5nLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJpc2VjdG9yKGYpIHtcbiAgbGV0IGNvbXBhcmUxLCBjb21wYXJlMiwgZGVsdGE7XG5cbiAgLy8gSWYgYW4gYWNjZXNzb3IgaXMgc3BlY2lmaWVkLCBwcm9tb3RlIGl0IHRvIGEgY29tcGFyYXRvci4gSW4gdGhpcyBjYXNlIHdlXG4gIC8vIGNhbiB0ZXN0IHdoZXRoZXIgdGhlIHNlYXJjaCB2YWx1ZSBpcyAoc2VsZi0pIGNvbXBhcmFibGUuIFdlIGNhbuKAmXQgZG8gdGhpc1xuICAvLyBmb3IgYSBjb21wYXJhdG9yIChleGNlcHQgZm9yIHNwZWNpZmljLCBrbm93biBjb21wYXJhdG9ycykgYmVjYXVzZSB3ZSBjYW7igJl0XG4gIC8vIHRlbGwgaWYgdGhlIGNvbXBhcmF0b3IgaXMgc3ltbWV0cmljLCBhbmQgYW4gYXN5bW1ldHJpYyBjb21wYXJhdG9yIGNhbuKAmXQgYmVcbiAgLy8gdXNlZCB0byB0ZXN0IHdoZXRoZXIgYSBzaW5nbGUgdmFsdWUgaXMgY29tcGFyYWJsZS5cbiAgaWYgKGYubGVuZ3RoICE9PSAyKSB7XG4gICAgY29tcGFyZTEgPSBhc2NlbmRpbmc7XG4gICAgY29tcGFyZTIgPSAoZCwgeCkgPT4gYXNjZW5kaW5nKGYoZCksIHgpO1xuICAgIGRlbHRhID0gKGQsIHgpID0+IGYoZCkgLSB4O1xuICB9IGVsc2Uge1xuICAgIGNvbXBhcmUxID0gZiA9PT0gYXNjZW5kaW5nIHx8IGYgPT09IGRlc2NlbmRpbmcgPyBmIDogemVybztcbiAgICBjb21wYXJlMiA9IGY7XG4gICAgZGVsdGEgPSBmO1xuICB9XG5cbiAgZnVuY3Rpb24gbGVmdChhLCB4LCBsbyA9IDAsIGhpID0gYS5sZW5ndGgpIHtcbiAgICBpZiAobG8gPCBoaSkge1xuICAgICAgaWYgKGNvbXBhcmUxKHgsIHgpICE9PSAwKSByZXR1cm4gaGk7XG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgICAgaWYgKGNvbXBhcmUyKGFbbWlkXSwgeCkgPCAwKSBsbyA9IG1pZCArIDE7XG4gICAgICAgIGVsc2UgaGkgPSBtaWQ7XG4gICAgICB9IHdoaWxlIChsbyA8IGhpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvO1xuICB9XG5cbiAgZnVuY3Rpb24gcmlnaHQoYSwgeCwgbG8gPSAwLCBoaSA9IGEubGVuZ3RoKSB7XG4gICAgaWYgKGxvIDwgaGkpIHtcbiAgICAgIGlmIChjb21wYXJlMSh4LCB4KSAhPT0gMCkgcmV0dXJuIGhpO1xuICAgICAgZG8ge1xuICAgICAgICBjb25zdCBtaWQgPSAobG8gKyBoaSkgPj4+IDE7XG4gICAgICAgIGlmIChjb21wYXJlMihhW21pZF0sIHgpIDw9IDApIGxvID0gbWlkICsgMTtcbiAgICAgICAgZWxzZSBoaSA9IG1pZDtcbiAgICAgIH0gd2hpbGUgKGxvIDwgaGkpO1xuICAgIH1cbiAgICByZXR1cm4gbG87XG4gIH1cblxuICBmdW5jdGlvbiBjZW50ZXIoYSwgeCwgbG8gPSAwLCBoaSA9IGEubGVuZ3RoKSB7XG4gICAgY29uc3QgaSA9IGxlZnQoYSwgeCwgbG8sIGhpIC0gMSk7XG4gICAgcmV0dXJuIGkgPiBsbyAmJiBkZWx0YShhW2kgLSAxXSwgeCkgPiAtZGVsdGEoYVtpXSwgeCkgPyBpIC0gMSA6IGk7XG4gIH1cblxuICByZXR1cm4ge2xlZnQsIGNlbnRlciwgcmlnaHR9O1xufVxuXG5mdW5jdGlvbiB6ZXJvKCkge1xuICByZXR1cm4gMDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA9PSBudWxsIHx8IGIgPT0gbnVsbCA/IE5hTlxuICAgIDogYiA8IGEgPyAtMVxuICAgIDogYiA+IGEgPyAxXG4gICAgOiBiID49IGEgPyAwXG4gICAgOiBOYU47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHRlbnQodmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtaW47XG4gIGxldCBtYXg7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKG1pbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID49IHZhbHVlKSBtaW4gPSBtYXggPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAobWluID4gdmFsdWUpIG1pbiA9IHZhbHVlO1xuICAgICAgICAgIGlmIChtYXggPCB2YWx1ZSkgbWF4ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCkge1xuICAgICAgICBpZiAobWluID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPj0gdmFsdWUpIG1pbiA9IG1heCA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0gdmFsdWU7XG4gICAgICAgICAgaWYgKG1heCA8IHZhbHVlKSBtYXggPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gW21pbiwgbWF4XTtcbn1cbiIsImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdyZWF0ZXN0KHZhbHVlcywgY29tcGFyZSA9IGFzY2VuZGluZykge1xuICBsZXQgbWF4O1xuICBsZXQgZGVmaW5lZCA9IGZhbHNlO1xuICBpZiAoY29tcGFyZS5sZW5ndGggPT09IDEpIHtcbiAgICBsZXQgbWF4VmFsdWU7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlcykge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb21wYXJlKGVsZW1lbnQpO1xuICAgICAgaWYgKGRlZmluZWRcbiAgICAgICAgICA/IGFzY2VuZGluZyh2YWx1ZSwgbWF4VmFsdWUpID4gMFxuICAgICAgICAgIDogYXNjZW5kaW5nKHZhbHVlLCB2YWx1ZSkgPT09IDApIHtcbiAgICAgICAgbWF4ID0gZWxlbWVudDtcbiAgICAgICAgbWF4VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgZGVmaW5lZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoZGVmaW5lZFxuICAgICAgICAgID8gY29tcGFyZSh2YWx1ZSwgbWF4KSA+IDBcbiAgICAgICAgICA6IGNvbXBhcmUodmFsdWUsIHZhbHVlKSA9PT0gMCkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgICAgZGVmaW5lZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXgodmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtYXg7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXhJbmRleCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1heDtcbiAgbGV0IG1heEluZGV4ID0gLTE7XG4gIGxldCBpbmRleCA9IC0xO1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICsraW5kZXg7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZSwgbWF4SW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZSwgbWF4SW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heEluZGV4O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWluKHZhbHVlcywgdmFsdWVvZikge1xuICBsZXQgbWluO1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1pbiA+IHZhbHVlIHx8IChtaW4gPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1pbiA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1pbiA+IHZhbHVlIHx8IChtaW4gPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1pbiA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWluO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWluSW5kZXgodmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtaW47XG4gIGxldCBtaW5JbmRleCA9IC0xO1xuICBsZXQgaW5kZXggPSAtMTtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICArK2luZGV4O1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWUsIG1pbkluZGV4ID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWUsIG1pbkluZGV4ID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW5JbmRleDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG51bWJlcih4KSB7XG4gIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkge1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGVybXV0ZShzb3VyY2UsIGtleXMpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oa2V5cywga2V5ID0+IHNvdXJjZVtrZXldKTtcbn1cbiIsImltcG9ydCBtYXggZnJvbSBcIi4vbWF4LmpzXCI7XG5pbXBvcnQgbWF4SW5kZXggZnJvbSBcIi4vbWF4SW5kZXguanNcIjtcbmltcG9ydCBtaW4gZnJvbSBcIi4vbWluLmpzXCI7XG5pbXBvcnQgbWluSW5kZXggZnJvbSBcIi4vbWluSW5kZXguanNcIjtcbmltcG9ydCBxdWlja3NlbGVjdCBmcm9tIFwiLi9xdWlja3NlbGVjdC5qc1wiO1xuaW1wb3J0IG51bWJlciwge251bWJlcnN9IGZyb20gXCIuL251bWJlci5qc1wiO1xuaW1wb3J0IHthc2NlbmRpbmdEZWZpbmVkfSBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgZ3JlYXRlc3QgZnJvbSBcIi4vZ3JlYXRlc3QuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVhbnRpbGUodmFsdWVzLCBwLCB2YWx1ZW9mKSB7XG4gIHZhbHVlcyA9IEZsb2F0NjRBcnJheS5mcm9tKG51bWJlcnModmFsdWVzLCB2YWx1ZW9mKSk7XG4gIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSB8fCBpc05hTihwID0gK3ApKSByZXR1cm47XG4gIGlmIChwIDw9IDAgfHwgbiA8IDIpIHJldHVybiBtaW4odmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heCh2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9IG1heChxdWlja3NlbGVjdCh2YWx1ZXMsIGkwKS5zdWJhcnJheSgwLCBpMCArIDEpKSxcbiAgICAgIHZhbHVlMSA9IG1pbih2YWx1ZXMuc3ViYXJyYXkoaTAgKyAxKSk7XG4gIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVhbnRpbGVTb3J0ZWQodmFsdWVzLCBwLCB2YWx1ZW9mID0gbnVtYmVyKSB7XG4gIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSB8fCBpc05hTihwID0gK3ApKSByZXR1cm47XG4gIGlmIChwIDw9IDAgfHwgbiA8IDIpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbMF0sIDAsIHZhbHVlcyk7XG4gIGlmIChwID49IDEpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbbiAtIDFdLCBuIC0gMSwgdmFsdWVzKTtcbiAgdmFyIG4sXG4gICAgICBpID0gKG4gLSAxKSAqIHAsXG4gICAgICBpMCA9IE1hdGguZmxvb3IoaSksXG4gICAgICB2YWx1ZTAgPSArdmFsdWVvZih2YWx1ZXNbaTBdLCBpMCwgdmFsdWVzKSxcbiAgICAgIHZhbHVlMSA9ICt2YWx1ZW9mKHZhbHVlc1tpMCArIDFdLCBpMCArIDEsIHZhbHVlcyk7XG4gIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVhbnRpbGVJbmRleCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgbnVtYmVycyA9IEZsb2F0NjRBcnJheS5mcm9tKHZhbHVlcywgKF8sIGkpID0+IG51bWJlcih2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkpO1xuICBpZiAocCA8PSAwKSByZXR1cm4gbWluSW5kZXgobnVtYmVycyk7XG4gIGlmIChwID49IDEpIHJldHVybiBtYXhJbmRleChudW1iZXJzKTtcbiAgdmFyIG51bWJlcnMsXG4gICAgICBpbmRleCA9IFVpbnQzMkFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gaSksXG4gICAgICBqID0gbnVtYmVycy5sZW5ndGggLSAxLFxuICAgICAgaSA9IE1hdGguZmxvb3IoaiAqIHApO1xuICBxdWlja3NlbGVjdChpbmRleCwgaSwgMCwgaiwgKGksIGopID0+IGFzY2VuZGluZ0RlZmluZWQobnVtYmVyc1tpXSwgbnVtYmVyc1tqXSkpO1xuICBpID0gZ3JlYXRlc3QoaW5kZXguc3ViYXJyYXkoMCwgaSArIDEpLCAoaSkgPT4gbnVtYmVyc1tpXSk7XG4gIHJldHVybiBpID49IDAgPyBpIDogLTE7XG59XG4iLCJpbXBvcnQge2FzY2VuZGluZ0RlZmluZWQsIGNvbXBhcmVEZWZpbmVkfSBmcm9tIFwiLi9zb3J0LmpzXCI7XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3VybmVyL3F1aWNrc2VsZWN0XG4vLyBJU0MgbGljZW5zZSwgQ29weXJpZ2h0IDIwMTggVmxhZGltaXIgQWdhZm9ua2luLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVpY2tzZWxlY3QoYXJyYXksIGssIGxlZnQgPSAwLCByaWdodCA9IEluZmluaXR5LCBjb21wYXJlKSB7XG4gIGsgPSBNYXRoLmZsb29yKGspO1xuICBsZWZ0ID0gTWF0aC5mbG9vcihNYXRoLm1heCgwLCBsZWZ0KSk7XG4gIHJpZ2h0ID0gTWF0aC5mbG9vcihNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCByaWdodCkpO1xuXG4gIGlmICghKGxlZnQgPD0gayAmJiBrIDw9IHJpZ2h0KSkgcmV0dXJuIGFycmF5O1xuXG4gIGNvbXBhcmUgPSBjb21wYXJlID09PSB1bmRlZmluZWQgPyBhc2NlbmRpbmdEZWZpbmVkIDogY29tcGFyZURlZmluZWQoY29tcGFyZSk7XG5cbiAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgIGlmIChyaWdodCAtIGxlZnQgPiA2MDApIHtcbiAgICAgIGNvbnN0IG4gPSByaWdodCAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgbSA9IGsgLSBsZWZ0ICsgMTtcbiAgICAgIGNvbnN0IHogPSBNYXRoLmxvZyhuKTtcbiAgICAgIGNvbnN0IHMgPSAwLjUgKiBNYXRoLmV4cCgyICogeiAvIDMpO1xuICAgICAgY29uc3Qgc2QgPSAwLjUgKiBNYXRoLnNxcnQoeiAqIHMgKiAobiAtIHMpIC8gbikgKiAobSAtIG4gLyAyIDwgMCA/IC0xIDogMSk7XG4gICAgICBjb25zdCBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gbSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIGNvbnN0IG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gbSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICBxdWlja3NlbGVjdChhcnJheSwgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGNvbXBhcmUpO1xuICAgIH1cblxuICAgIGNvbnN0IHQgPSBhcnJheVtrXTtcbiAgICBsZXQgaSA9IGxlZnQ7XG4gICAgbGV0IGogPSByaWdodDtcblxuICAgIHN3YXAoYXJyYXksIGxlZnQsIGspO1xuICAgIGlmIChjb21wYXJlKGFycmF5W3JpZ2h0XSwgdCkgPiAwKSBzd2FwKGFycmF5LCBsZWZ0LCByaWdodCk7XG5cbiAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgIHN3YXAoYXJyYXksIGksIGopLCArK2ksIC0tajtcbiAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2ldLCB0KSA8IDApICsraTtcbiAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2pdLCB0KSA+IDApIC0tajtcbiAgICB9XG5cbiAgICBpZiAoY29tcGFyZShhcnJheVtsZWZ0XSwgdCkgPT09IDApIHN3YXAoYXJyYXksIGxlZnQsIGopO1xuICAgIGVsc2UgKytqLCBzd2FwKGFycmF5LCBqLCByaWdodCk7XG5cbiAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgaWYgKGsgPD0gaikgcmlnaHQgPSBqIC0gMTtcbiAgfVxuXG4gIHJldHVybiBhcnJheTtcbn1cblxuZnVuY3Rpb24gc3dhcChhcnJheSwgaSwgaikge1xuICBjb25zdCB0ID0gYXJyYXlbaV07XG4gIGFycmF5W2ldID0gYXJyYXlbal07XG4gIGFycmF5W2pdID0gdDtcbn1cbiIsImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nLmpzXCI7XG5pbXBvcnQgcGVybXV0ZSBmcm9tIFwiLi9wZXJtdXRlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNvcnQodmFsdWVzLCAuLi5GKSB7XG4gIGlmICh0eXBlb2YgdmFsdWVzW1N5bWJvbC5pdGVyYXRvcl0gIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcInZhbHVlcyBpcyBub3QgaXRlcmFibGVcIik7XG4gIHZhbHVlcyA9IEFycmF5LmZyb20odmFsdWVzKTtcbiAgbGV0IFtmXSA9IEY7XG4gIGlmICgoZiAmJiBmLmxlbmd0aCAhPT0gMikgfHwgRi5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgaW5kZXggPSBVaW50MzJBcnJheS5mcm9tKHZhbHVlcywgKGQsIGkpID0+IGkpO1xuICAgIGlmIChGLmxlbmd0aCA+IDEpIHtcbiAgICAgIEYgPSBGLm1hcChmID0+IHZhbHVlcy5tYXAoZikpO1xuICAgICAgaW5kZXguc29ydCgoaSwgaikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgRikge1xuICAgICAgICAgIGNvbnN0IGMgPSBhc2NlbmRpbmdEZWZpbmVkKGZbaV0sIGZbal0pO1xuICAgICAgICAgIGlmIChjKSByZXR1cm4gYztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGYgPSB2YWx1ZXMubWFwKGYpO1xuICAgICAgaW5kZXguc29ydCgoaSwgaikgPT4gYXNjZW5kaW5nRGVmaW5lZChmW2ldLCBmW2pdKSk7XG4gICAgfVxuICAgIHJldHVybiBwZXJtdXRlKHZhbHVlcywgaW5kZXgpO1xuICB9XG4gIHJldHVybiB2YWx1ZXMuc29ydChjb21wYXJlRGVmaW5lZChmKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlRGVmaW5lZChjb21wYXJlID0gYXNjZW5kaW5nKSB7XG4gIGlmIChjb21wYXJlID09PSBhc2NlbmRpbmcpIHJldHVybiBhc2NlbmRpbmdEZWZpbmVkO1xuICBpZiAodHlwZW9mIGNvbXBhcmUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNvbXBhcmUgaXMgbm90IGEgZnVuY3Rpb25cIik7XG4gIHJldHVybiAoYSwgYikgPT4ge1xuICAgIGNvbnN0IHggPSBjb21wYXJlKGEsIGIpO1xuICAgIGlmICh4IHx8IHggPT09IDApIHJldHVybiB4O1xuICAgIHJldHVybiAoY29tcGFyZShiLCBiKSA9PT0gMCkgLSAoY29tcGFyZShhLCBhKSA9PT0gMCk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc2NlbmRpbmdEZWZpbmVkKGEsIGIpIHtcbiAgcmV0dXJuIChhID09IG51bGwgfHwgIShhID49IGEpKSAtIChiID09IG51bGwgfHwgIShiID49IGIpKSB8fCAoYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApO1xufVxuIiwiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb2xvcigpIHt9XG5cbmV4cG9ydCB2YXIgZGFya2VyID0gMC43O1xuZXhwb3J0IHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7XG5cbnZhciByZUkgPSBcIlxcXFxzKihbKy1dP1xcXFxkKylcXFxccypcIixcbiAgICByZU4gPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPylcXFxccypcIixcbiAgICByZVAgPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPyklXFxcXHMqXCIsXG4gICAgcmVIZXggPSAvXiMoWzAtOWEtZl17Myw4fSkkLyxcbiAgICByZVJnYkludGVnZXIgPSBuZXcgUmVnRXhwKGBecmdiXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfVxcXFwpJGApLFxuICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JhXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfSwke3JlTn1cXFxcKSRgKSxcbiAgICByZVJnYmFQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYmFcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9LCR7cmVOfVxcXFwpJGApLFxuICAgIHJlSHNsUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xcXFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xhXFxcXCgke3JlTn0sJHtyZVB9LCR7cmVQfSwke3JlTn1cXFxcKSRgKTtcblxudmFyIG5hbWVkID0ge1xuICBhbGljZWJsdWU6IDB4ZjBmOGZmLFxuICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LFxuICBhcXVhOiAweDAwZmZmZixcbiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsXG4gIGF6dXJlOiAweGYwZmZmZixcbiAgYmVpZ2U6IDB4ZjVmNWRjLFxuICBiaXNxdWU6IDB4ZmZlNGM0LFxuICBibGFjazogMHgwMDAwMDAsXG4gIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCxcbiAgYmx1ZTogMHgwMDAwZmYsXG4gIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLFxuICBicm93bjogMHhhNTJhMmEsXG4gIGJ1cmx5d29vZDogMHhkZWI4ODcsXG4gIGNhZGV0Ymx1ZTogMHg1ZjllYTAsXG4gIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLFxuICBjaG9jb2xhdGU6IDB4ZDI2OTFlLFxuICBjb3JhbDogMHhmZjdmNTAsXG4gIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCxcbiAgY29ybnNpbGs6IDB4ZmZmOGRjLFxuICBjcmltc29uOiAweGRjMTQzYyxcbiAgY3lhbjogMHgwMGZmZmYsXG4gIGRhcmtibHVlOiAweDAwMDA4YixcbiAgZGFya2N5YW46IDB4MDA4YjhiLFxuICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYixcbiAgZGFya2dyYXk6IDB4YTlhOWE5LFxuICBkYXJrZ3JlZW46IDB4MDA2NDAwLFxuICBkYXJrZ3JleTogMHhhOWE5YTksXG4gIGRhcmtraGFraTogMHhiZGI3NmIsXG4gIGRhcmttYWdlbnRhOiAweDhiMDA4YixcbiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLFxuICBkYXJrb3JhbmdlOiAweGZmOGMwMCxcbiAgZGFya29yY2hpZDogMHg5OTMyY2MsXG4gIGRhcmtyZWQ6IDB4OGIwMDAwLFxuICBkYXJrc2FsbW9uOiAweGU5OTY3YSxcbiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZixcbiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsXG4gIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLFxuICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZixcbiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsXG4gIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLFxuICBkZWVwcGluazogMHhmZjE0OTMsXG4gIGRlZXBza3libHVlOiAweDAwYmZmZixcbiAgZGltZ3JheTogMHg2OTY5NjksXG4gIGRpbWdyZXk6IDB4Njk2OTY5LFxuICBkb2RnZXJibHVlOiAweDFlOTBmZixcbiAgZmlyZWJyaWNrOiAweGIyMjIyMixcbiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLFxuICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsXG4gIGZ1Y2hzaWE6IDB4ZmYwMGZmLFxuICBnYWluc2Jvcm86IDB4ZGNkY2RjLFxuICBnaG9zdHdoaXRlOiAweGY4ZjhmZixcbiAgZ29sZDogMHhmZmQ3MDAsXG4gIGdvbGRlbnJvZDogMHhkYWE1MjAsXG4gIGdyYXk6IDB4ODA4MDgwLFxuICBncmVlbjogMHgwMDgwMDAsXG4gIGdyZWVueWVsbG93OiAweGFkZmYyZixcbiAgZ3JleTogMHg4MDgwODAsXG4gIGhvbmV5ZGV3OiAweGYwZmZmMCxcbiAgaG90cGluazogMHhmZjY5YjQsXG4gIGluZGlhbnJlZDogMHhjZDVjNWMsXG4gIGluZGlnbzogMHg0YjAwODIsXG4gIGl2b3J5OiAweGZmZmZmMCxcbiAga2hha2k6IDB4ZjBlNjhjLFxuICBsYXZlbmRlcjogMHhlNmU2ZmEsXG4gIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LFxuICBsYXduZ3JlZW46IDB4N2NmYzAwLFxuICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLFxuICBsaWdodGJsdWU6IDB4YWRkOGU2LFxuICBsaWdodGNvcmFsOiAweGYwODA4MCxcbiAgbGlnaHRjeWFuOiAweGUwZmZmZixcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLFxuICBsaWdodGdyYXk6IDB4ZDNkM2QzLFxuICBsaWdodGdyZWVuOiAweDkwZWU5MCxcbiAgbGlnaHRncmV5OiAweGQzZDNkMyxcbiAgbGlnaHRwaW5rOiAweGZmYjZjMSxcbiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLFxuICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSxcbiAgbGlnaHRza3libHVlOiAweDg3Y2VmYSxcbiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LFxuICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksXG4gIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSxcbiAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLFxuICBsaW1lOiAweDAwZmYwMCxcbiAgbGltZWdyZWVuOiAweDMyY2QzMixcbiAgbGluZW46IDB4ZmFmMGU2LFxuICBtYWdlbnRhOiAweGZmMDBmZixcbiAgbWFyb29uOiAweDgwMDAwMCxcbiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsXG4gIG1lZGl1bWJsdWU6IDB4MDAwMGNkLFxuICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLFxuICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLFxuICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsXG4gIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsXG4gIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSxcbiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYyxcbiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSxcbiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCxcbiAgbWludGNyZWFtOiAweGY1ZmZmYSxcbiAgbWlzdHlyb3NlOiAweGZmZTRlMSxcbiAgbW9jY2FzaW46IDB4ZmZlNGI1LFxuICBuYXZham93aGl0ZTogMHhmZmRlYWQsXG4gIG5hdnk6IDB4MDAwMDgwLFxuICBvbGRsYWNlOiAweGZkZjVlNixcbiAgb2xpdmU6IDB4ODA4MDAwLFxuICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLFxuICBvcmFuZ2U6IDB4ZmZhNTAwLFxuICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLFxuICBvcmNoaWQ6IDB4ZGE3MGQ2LFxuICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSxcbiAgcGFsZWdyZWVuOiAweDk4ZmI5OCxcbiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsXG4gIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLFxuICBwYXBheWF3aGlwOiAweGZmZWZkNSxcbiAgcGVhY2hwdWZmOiAweGZmZGFiOSxcbiAgcGVydTogMHhjZDg1M2YsXG4gIHBpbms6IDB4ZmZjMGNiLFxuICBwbHVtOiAweGRkYTBkZCxcbiAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsXG4gIHB1cnBsZTogMHg4MDAwODAsXG4gIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LFxuICByZWQ6IDB4ZmYwMDAwLFxuICByb3N5YnJvd246IDB4YmM4ZjhmLFxuICByb3lhbGJsdWU6IDB4NDE2OWUxLFxuICBzYWRkbGVicm93bjogMHg4YjQ1MTMsXG4gIHNhbG1vbjogMHhmYTgwNzIsXG4gIHNhbmR5YnJvd246IDB4ZjRhNDYwLFxuICBzZWFncmVlbjogMHgyZThiNTcsXG4gIHNlYXNoZWxsOiAweGZmZjVlZSxcbiAgc2llbm5hOiAweGEwNTIyZCxcbiAgc2lsdmVyOiAweGMwYzBjMCxcbiAgc2t5Ymx1ZTogMHg4N2NlZWIsXG4gIHNsYXRlYmx1ZTogMHg2YTVhY2QsXG4gIHNsYXRlZ3JheTogMHg3MDgwOTAsXG4gIHNsYXRlZ3JleTogMHg3MDgwOTAsXG4gIHNub3c6IDB4ZmZmYWZhLFxuICBzcHJpbmdncmVlbjogMHgwMGZmN2YsXG4gIHN0ZWVsYmx1ZTogMHg0NjgyYjQsXG4gIHRhbjogMHhkMmI0OGMsXG4gIHRlYWw6IDB4MDA4MDgwLFxuICB0aGlzdGxlOiAweGQ4YmZkOCxcbiAgdG9tYXRvOiAweGZmNjM0NyxcbiAgdHVycXVvaXNlOiAweDQwZTBkMCxcbiAgdmlvbGV0OiAweGVlODJlZSxcbiAgd2hlYXQ6IDB4ZjVkZWIzLFxuICB3aGl0ZTogMHhmZmZmZmYsXG4gIHdoaXRlc21va2U6IDB4ZjVmNWY1LFxuICB5ZWxsb3c6IDB4ZmZmZjAwLFxuICB5ZWxsb3dncmVlbjogMHg5YWNkMzJcbn07XG5cbmRlZmluZShDb2xvciwgY29sb3IsIHtcbiAgY29weShjaGFubmVscykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7XG4gIH0sXG4gIGhleDogY29sb3JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IGNvbG9yX2Zvcm1hdEhleCxcbiAgZm9ybWF0SGV4ODogY29sb3JfZm9ybWF0SGV4OCxcbiAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsXG4gIGZvcm1hdFJnYjogY29sb3JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiXG59KTtcblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4OCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2woKSB7XG4gIHJldHVybiBoc2xDb252ZXJ0KHRoaXMpLmZvcm1hdEhzbCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRSZ2IoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHtcbiAgdmFyIG0sIGw7XG4gIGZvcm1hdCA9IChmb3JtYXQgKyBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChtID0gcmVIZXguZXhlYyhmb3JtYXQpKSA/IChsID0gbVsxXS5sZW5ndGgsIG0gPSBwYXJzZUludChtWzFdLCAxNiksIGwgPT09IDYgPyByZ2JuKG0pIC8vICNmZjAwMDBcbiAgICAgIDogbCA9PT0gMyA/IG5ldyBSZ2IoKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkgLy8gI2YwMFxuICAgICAgOiBsID09PSA4ID8gcmdiYShtID4+IDI0ICYgMHhmZiwgbSA+PiAxNiAmIDB4ZmYsIG0gPj4gOCAmIDB4ZmYsIChtICYgMHhmZikgLyAweGZmKSAvLyAjZmYwMDAwMDBcbiAgICAgIDogbCA9PT0gNCA/IHJnYmEoKG0gPj4gMTIgJiAweGYpIHwgKG0gPj4gOCAmIDB4ZjApLCAobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSkgLyAweGZmKSAvLyAjZjAwMFxuICAgICAgOiBudWxsKSAvLyBpbnZhbGlkIGhleFxuICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKVxuICAgICAgOiAobSA9IHJlUmdiUGVyY2VudC5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCAxKSAvLyByZ2IoMTAwJSwgMCUsIDAlKVxuICAgICAgOiAobSA9IHJlUmdiYUludGVnZXIuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSwgbVsyXSwgbVszXSwgbVs0XSkgLy8gcmdiYSgyNTUsIDAsIDAsIDEpXG4gICAgICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKVxuICAgICAgOiAobSA9IHJlSHNsUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCAxKSAvLyBoc2woMTIwLCA1MCUsIDUwJSlcbiAgICAgIDogKG0gPSByZUhzbGFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIG1bNF0pIC8vIGhzbGEoMTIwLCA1MCUsIDUwJSwgMSlcbiAgICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIDogZm9ybWF0ID09PSBcInRyYW5zcGFyZW50XCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApXG4gICAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJnYm4obikge1xuICByZXR1cm4gbmV3IFJnYihuID4+IDE2ICYgMHhmZiwgbiA+PiA4ICYgMHhmZiwgbiAmIDB4ZmYsIDEpO1xufVxuXG5mdW5jdGlvbiByZ2JhKHIsIGcsIGIsIGEpIHtcbiAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOO1xuICByZXR1cm4gbmV3IFJnYihyLCBnLCBiLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYkNvbnZlcnQobykge1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBSZ2I7XG4gIG8gPSBvLnJnYigpO1xuICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICB0aGlzLnIgPSArcjtcbiAgdGhpcy5nID0gK2c7XG4gIHRoaXMuYiA9ICtiO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY2xhbXAoKSB7XG4gICAgcmV0dXJuIG5ldyBSZ2IoY2xhbXBpKHRoaXMuciksIGNsYW1waSh0aGlzLmcpLCBjbGFtcGkodGhpcy5iKSwgY2xhbXBhKHRoaXMub3BhY2l0eSkpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmcgJiYgdGhpcy5nIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuYiAmJiB0aGlzLmIgPCAyNTUuNSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgaGV4OiByZ2JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhleDg6IHJnYl9mb3JtYXRIZXg4LFxuICBmb3JtYXRSZ2I6IHJnYl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiXG59KSk7XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfWA7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXg4KCkge1xuICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX0ke2hleCgoaXNOYU4odGhpcy5vcGFjaXR5KSA/IDEgOiB0aGlzLm9wYWNpdHkpICogMjU1KX1gO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0UmdiKCkge1xuICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gIHJldHVybiBgJHthID09PSAxID8gXCJyZ2IoXCIgOiBcInJnYmEoXCJ9JHtjbGFtcGkodGhpcy5yKX0sICR7Y2xhbXBpKHRoaXMuZyl9LCAke2NsYW1waSh0aGlzLmIpfSR7YSA9PT0gMSA/IFwiKVwiIDogYCwgJHthfSlgfWA7XG59XG5cbmZ1bmN0aW9uIGNsYW1wYShvcGFjaXR5KSB7XG4gIHJldHVybiBpc05hTihvcGFjaXR5KSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBvcGFjaXR5KSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1waSh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7XG59XG5cbmZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICB2YWx1ZSA9IGNsYW1waSh2YWx1ZSk7XG4gIHJldHVybiAodmFsdWUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyB2YWx1ZS50b1N0cmluZygxNik7XG59XG5cbmZ1bmN0aW9uIGhzbGEoaCwgcywgbCwgYSkge1xuICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47XG4gIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOO1xuICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbmV3IEhzbChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBIc2w7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbztcbiAgbyA9IG8ucmdiKCk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgaCA9IE5hTixcbiAgICAgIHMgPSBtYXggLSBtaW4sXG4gICAgICBsID0gKG1heCArIG1pbikgLyAyO1xuICBpZiAocykge1xuICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O1xuICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtcbiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7XG4gICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjtcbiAgICBoICo9IDYwO1xuICB9IGVsc2Uge1xuICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoO1xuICB9XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMucyA9ICtzO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCxcbiAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLFxuICAgICAgICBsID0gdGhpcy5sLFxuICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLFxuICAgICAgICBtMSA9IDIgKiBsIC0gbTI7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGgsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH0sXG4gIGNsYW1wKCkge1xuICAgIHJldHVybiBuZXcgSHNsKGNsYW1waCh0aGlzLmgpLCBjbGFtcHQodGhpcy5zKSwgY2xhbXB0KHRoaXMubCksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLmwgJiYgdGhpcy5sIDw9IDEpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGZvcm1hdEhzbCgpIHtcbiAgICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gICAgcmV0dXJuIGAke2EgPT09IDEgPyBcImhzbChcIiA6IFwiaHNsYShcIn0ke2NsYW1waCh0aGlzLmgpfSwgJHtjbGFtcHQodGhpcy5zKSAqIDEwMH0lLCAke2NsYW1wdCh0aGlzLmwpICogMTAwfSUke2EgPT09IDEgPyBcIilcIiA6IGAsICR7YX0pYH1gO1xuICB9XG59KSk7XG5cbmZ1bmN0aW9uIGNsYW1waCh2YWx1ZSkge1xuICB2YWx1ZSA9ICh2YWx1ZSB8fCAwKSAlIDM2MDtcbiAgcmV0dXJuIHZhbHVlIDwgMCA/IHZhbHVlICsgMzYwIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNsYW1wdCh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdmFsdWUgfHwgMCkpO1xufVxuXG4vKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovXG5mdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikge1xuICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwXG4gICAgICA6IGggPCAxODAgPyBtMlxuICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MFxuICAgICAgOiBtMSkgKiAyNTU7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3Rvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChwYXJlbnQsIGRlZmluaXRpb24pIHtcbiAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7XG4gIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRpb25ba2V5XTtcbiAgcmV0dXJuIHByb3RvdHlwZTtcbn1cbiIsImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZS5qc1wiO1xuaW1wb3J0IHtDb2xvciwgcmdiQ29udmVydCwgUmdifSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuaW1wb3J0IHtkZWdyZWVzLCByYWRpYW5zfSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbi8vIGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AbWJvc3RvY2svbGFiLWFuZC1yZ2JcbmNvbnN0IEsgPSAxOCxcbiAgICBYbiA9IDAuOTY0MjIsXG4gICAgWW4gPSAxLFxuICAgIFpuID0gMC44MjUyMSxcbiAgICB0MCA9IDQgLyAyOSxcbiAgICB0MSA9IDYgLyAyOSxcbiAgICB0MiA9IDMgKiB0MSAqIHQxLFxuICAgIHQzID0gdDEgKiB0MSAqIHQxO1xuXG5mdW5jdGlvbiBsYWJDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBMYWIpIHJldHVybiBuZXcgTGFiKG8ubCwgby5hLCBvLmIsIG8ub3BhY2l0eSk7XG4gIGlmIChvIGluc3RhbmNlb2YgSGNsKSByZXR1cm4gaGNsMmxhYihvKTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYikpIG8gPSByZ2JDb252ZXJ0KG8pO1xuICB2YXIgciA9IHJnYjJscmdiKG8uciksXG4gICAgICBnID0gcmdiMmxyZ2Ioby5nKSxcbiAgICAgIGIgPSByZ2IybHJnYihvLmIpLFxuICAgICAgeSA9IHh5ejJsYWIoKDAuMjIyNTA0NSAqIHIgKyAwLjcxNjg3ODYgKiBnICsgMC4wNjA2MTY5ICogYikgLyBZbiksIHgsIHo7XG4gIGlmIChyID09PSBnICYmIGcgPT09IGIpIHggPSB6ID0geTsgZWxzZSB7XG4gICAgeCA9IHh5ejJsYWIoKDAuNDM2MDc0NyAqIHIgKyAwLjM4NTA2NDkgKiBnICsgMC4xNDMwODA0ICogYikgLyBYbik7XG4gICAgeiA9IHh5ejJsYWIoKDAuMDEzOTMyMiAqIHIgKyAwLjA5NzEwNDUgKiBnICsgMC43MTQxNzMzICogYikgLyBabik7XG4gIH1cbiAgcmV0dXJuIG5ldyBMYWIoMTE2ICogeSAtIDE2LCA1MDAgKiAoeCAtIHkpLCAyMDAgKiAoeSAtIHopLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3JheShsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBuZXcgTGFiKGwsIDAsIDAsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGFiKGwsIGEsIGIsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBsYWJDb252ZXJ0KGwpIDogbmV3IExhYihsLCBhLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBMYWIobCwgYSwgYiwgb3BhY2l0eSkge1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5hID0gK2E7XG4gIHRoaXMuYiA9ICtiO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKExhYiwgbGFiLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIHJldHVybiBuZXcgTGFiKHRoaXMubCArIEsgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICByZXR1cm4gbmV3IExhYih0aGlzLmwgLSBLICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5hLCB0aGlzLmIsIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICB2YXIgeSA9ICh0aGlzLmwgKyAxNikgLyAxMTYsXG4gICAgICAgIHggPSBpc05hTih0aGlzLmEpID8geSA6IHkgKyB0aGlzLmEgLyA1MDAsXG4gICAgICAgIHogPSBpc05hTih0aGlzLmIpID8geSA6IHkgLSB0aGlzLmIgLyAyMDA7XG4gICAgeCA9IFhuICogbGFiMnh5eih4KTtcbiAgICB5ID0gWW4gKiBsYWIyeHl6KHkpO1xuICAgIHogPSBabiAqIGxhYjJ4eXooeik7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBscmdiMnJnYiggMy4xMzM4NTYxICogeCAtIDEuNjE2ODY2NyAqIHkgLSAwLjQ5MDYxNDYgKiB6KSxcbiAgICAgIGxyZ2IycmdiKC0wLjk3ODc2ODQgKiB4ICsgMS45MTYxNDE1ICogeSArIDAuMDMzNDU0MCAqIHopLFxuICAgICAgbHJnYjJyZ2IoIDAuMDcxOTQ1MyAqIHggLSAwLjIyODk5MTQgKiB5ICsgMS40MDUyNDI3ICogeiksXG4gICAgICB0aGlzLm9wYWNpdHlcbiAgICApO1xuICB9XG59KSk7XG5cbmZ1bmN0aW9uIHh5ejJsYWIodCkge1xuICByZXR1cm4gdCA+IHQzID8gTWF0aC5wb3codCwgMSAvIDMpIDogdCAvIHQyICsgdDA7XG59XG5cbmZ1bmN0aW9uIGxhYjJ4eXoodCkge1xuICByZXR1cm4gdCA+IHQxID8gdCAqIHQgKiB0IDogdDIgKiAodCAtIHQwKTtcbn1cblxuZnVuY3Rpb24gbHJnYjJyZ2IoeCkge1xuICByZXR1cm4gMjU1ICogKHggPD0gMC4wMDMxMzA4ID8gMTIuOTIgKiB4IDogMS4wNTUgKiBNYXRoLnBvdyh4LCAxIC8gMi40KSAtIDAuMDU1KTtcbn1cblxuZnVuY3Rpb24gcmdiMmxyZ2IoeCkge1xuICByZXR1cm4gKHggLz0gMjU1KSA8PSAwLjA0MDQ1ID8geCAvIDEyLjkyIDogTWF0aC5wb3coKHggKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbn1cblxuZnVuY3Rpb24gaGNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSGNsKSByZXR1cm4gbmV3IEhjbChvLmgsIG8uYywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgTGFiKSkgbyA9IGxhYkNvbnZlcnQobyk7XG4gIGlmIChvLmEgPT09IDAgJiYgby5iID09PSAwKSByZXR1cm4gbmV3IEhjbChOYU4sIDAgPCBvLmwgJiYgby5sIDwgMTAwID8gMCA6IE5hTiwgby5sLCBvLm9wYWNpdHkpO1xuICB2YXIgaCA9IE1hdGguYXRhbjIoby5iLCBvLmEpICogZGVncmVlcztcbiAgcmV0dXJuIG5ldyBIY2woaCA8IDAgPyBoICsgMzYwIDogaCwgTWF0aC5zcXJ0KG8uYSAqIG8uYSArIG8uYiAqIG8uYiksIG8ubCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxjaChsLCBjLCBoLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaGNsQ29udmVydChsKSA6IG5ldyBIY2woaCwgYywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGNsKGgsIGMsIGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoY2xDb252ZXJ0KGgpIDogbmV3IEhjbChoLCBjLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIY2woaCwgYywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5jID0gK2M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZnVuY3Rpb24gaGNsMmxhYihvKSB7XG4gIGlmIChpc05hTihvLmgpKSByZXR1cm4gbmV3IExhYihvLmwsIDAsIDAsIG8ub3BhY2l0eSk7XG4gIHZhciBoID0gby5oICogcmFkaWFucztcbiAgcmV0dXJuIG5ldyBMYWIoby5sLCBNYXRoLmNvcyhoKSAqIG8uYywgTWF0aC5zaW4oaCkgKiBvLmMsIG8ub3BhY2l0eSk7XG59XG5cbmRlZmluZShIY2wsIGhjbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICByZXR1cm4gbmV3IEhjbCh0aGlzLmgsIHRoaXMuYywgdGhpcy5sICsgSyAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgcmV0dXJuIG5ldyBIY2wodGhpcy5oLCB0aGlzLmMsIHRoaXMubCAtIEsgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2IoKSB7XG4gICAgcmV0dXJuIGhjbDJsYWIodGhpcykucmdiKCk7XG4gIH1cbn0pKTtcbiIsImV4cG9ydCBjb25zdCByYWRpYW5zID0gTWF0aC5QSSAvIDE4MDtcbmV4cG9ydCBjb25zdCBkZWdyZWVzID0gMTgwIC8gTWF0aC5QSTtcbiIsInZhciBub29wID0ge3ZhbHVlOiAoKSA9PiB7fX07XG5cbmZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF8gPSB7fSwgdDsgaSA8IG47ICsraSkge1xuICAgIGlmICghKHQgPSBhcmd1bWVudHNbaV0gKyBcIlwiKSB8fCAodCBpbiBfKSB8fCAvW1xccy5dLy50ZXN0KHQpKSB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIHR5cGU6IFwiICsgdCk7XG4gICAgX1t0XSA9IFtdO1xuICB9XG4gIHJldHVybiBuZXcgRGlzcGF0Y2goXyk7XG59XG5cbmZ1bmN0aW9uIERpc3BhdGNoKF8pIHtcbiAgdGhpcy5fID0gXztcbn1cblxuZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXModHlwZW5hbWVzLCB0eXBlcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgaWYgKHQgJiYgIXR5cGVzLmhhc093blByb3BlcnR5KHQpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdCk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbkRpc3BhdGNoLnByb3RvdHlwZSA9IGRpc3BhdGNoLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IERpc3BhdGNoLFxuICBvbjogZnVuY3Rpb24odHlwZW5hbWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF8gPSB0aGlzLl8sXG4gICAgICAgIFQgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIsIF8pLFxuICAgICAgICB0LFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIG4gPSBULmxlbmd0aDtcblxuICAgIC8vIElmIG5vIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgY2FsbGJhY2sgb2YgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgJiYgKHQgPSBnZXQoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIHR5cGUgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS5cbiAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBjYWxsYmFjazogXCIgKyBjYWxsYmFjayk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgX1t0XSA9IHNldChfW3RdLCB0eXBlbmFtZS5uYW1lLCBjYWxsYmFjayk7XG4gICAgICBlbHNlIGlmIChjYWxsYmFjayA9PSBudWxsKSBmb3IgKHQgaW4gXykgX1t0XSA9IHNldChfW3RdLCB0eXBlbmFtZS5uYW1lLCBudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY29weTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvcHkgPSB7fSwgXyA9IHRoaXMuXztcbiAgICBmb3IgKHZhciB0IGluIF8pIGNvcHlbdF0gPSBfW3RdLnNsaWNlKCk7XG4gICAgcmV0dXJuIG5ldyBEaXNwYXRjaChjb3B5KTtcbiAgfSxcbiAgY2FsbDogZnVuY3Rpb24odHlwZSwgdGhhdCkge1xuICAgIGlmICgobiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyKSA+IDApIGZvciAodmFyIGFyZ3MgPSBuZXcgQXJyYXkobiksIGkgPSAwLCBuLCB0OyBpIDwgbjsgKytpKSBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHR5cGUpO1xuICAgIGZvciAodCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHR5cGUsIHRoYXQsIGFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHR5cGUpO1xuICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdldCh0eXBlLCBuYW1lKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGgsIGM7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICByZXR1cm4gYy52YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0KHR5cGUsIG5hbWUsIGNhbGxiYWNrKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAodHlwZVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICB0eXBlW2ldID0gbm9vcCwgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSkuY29uY2F0KHR5cGUuc2xpY2UoaSArIDEpKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogY2FsbGJhY2t9KTtcbiAgcmV0dXJuIHR5cGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRpc3BhdGNoO1xuIiwiaW1wb3J0IHtzZWxlY3R9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBub2V2ZW50LCB7bm9ucGFzc2l2ZWNhcHR1cmV9IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmlldykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbm9ldmVudCwgbm9ucGFzc2l2ZWNhcHR1cmUpO1xuICBpZiAoXCJvbnNlbGVjdHN0YXJ0XCIgaW4gcm9vdCkge1xuICAgIHNlbGVjdGlvbi5vbihcInNlbGVjdHN0YXJ0LmRyYWdcIiwgbm9ldmVudCwgbm9ucGFzc2l2ZWNhcHR1cmUpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QuX19ub3NlbGVjdCA9IHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdDtcbiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSBcIm5vbmVcIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24geWVzZHJhZyh2aWV3LCBub2NsaWNrKSB7XG4gIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Qodmlldykub24oXCJkcmFnc3RhcnQuZHJhZ1wiLCBudWxsKTtcbiAgaWYgKG5vY2xpY2spIHtcbiAgICBzZWxlY3Rpb24ub24oXCJjbGljay5kcmFnXCIsIG5vZXZlbnQsIG5vbnBhc3NpdmVjYXB0dXJlKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxlY3Rpb24ub24oXCJjbGljay5kcmFnXCIsIG51bGwpOyB9LCAwKTtcbiAgfVxuICBpZiAoXCJvbnNlbGVjdHN0YXJ0XCIgaW4gcm9vdCkge1xuICAgIHNlbGVjdGlvbi5vbihcInNlbGVjdHN0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gcm9vdC5fX25vc2VsZWN0O1xuICAgIGRlbGV0ZSByb290Ll9fbm9zZWxlY3Q7XG4gIH1cbn1cbiIsIi8vIFRoZXNlIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG5vZXZlbnQgdG8gZW5zdXJlIHRoYXQgd2UgY2FuXG4vLyBwcmV2ZW50RGVmYXVsdCBvbiB0aGUgZXZlbnQuXG5leHBvcnQgY29uc3Qgbm9ucGFzc2l2ZSA9IHtwYXNzaXZlOiBmYWxzZX07XG5leHBvcnQgY29uc3Qgbm9ucGFzc2l2ZWNhcHR1cmUgPSB7Y2FwdHVyZTogdHJ1ZSwgcGFzc2l2ZTogZmFsc2V9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbihldmVudCkge1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG4iLCJpbXBvcnQgZHN2IGZyb20gXCIuL2Rzdi5qc1wiO1xuXG52YXIgY3N2ID0gZHN2KFwiLFwiKTtcblxuZXhwb3J0IHZhciBjc3ZQYXJzZSA9IGNzdi5wYXJzZTtcbmV4cG9ydCB2YXIgY3N2UGFyc2VSb3dzID0gY3N2LnBhcnNlUm93cztcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0ID0gY3N2LmZvcm1hdDtcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0Qm9keSA9IGNzdi5mb3JtYXRCb2R5O1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRSb3dzID0gY3N2LmZvcm1hdFJvd3M7XG5leHBvcnQgdmFyIGNzdkZvcm1hdFJvdyA9IGNzdi5mb3JtYXRSb3c7XG5leHBvcnQgdmFyIGNzdkZvcm1hdFZhbHVlID0gY3N2LmZvcm1hdFZhbHVlO1xuIiwidmFyIEVPTCA9IHt9LFxuICAgIEVPRiA9IHt9LFxuICAgIFFVT1RFID0gMzQsXG4gICAgTkVXTElORSA9IDEwLFxuICAgIFJFVFVSTiA9IDEzO1xuXG5mdW5jdGlvbiBvYmplY3RDb252ZXJ0ZXIoY29sdW1ucykge1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKFwiZFwiLCBcInJldHVybiB7XCIgKyBjb2x1bW5zLm1hcChmdW5jdGlvbihuYW1lLCBpKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5hbWUpICsgXCI6IGRbXCIgKyBpICsgXCJdIHx8IFxcXCJcXFwiXCI7XG4gIH0pLmpvaW4oXCIsXCIpICsgXCJ9XCIpO1xufVxuXG5mdW5jdGlvbiBjdXN0b21Db252ZXJ0ZXIoY29sdW1ucywgZikge1xuICB2YXIgb2JqZWN0ID0gb2JqZWN0Q29udmVydGVyKGNvbHVtbnMpO1xuICByZXR1cm4gZnVuY3Rpb24ocm93LCBpKSB7XG4gICAgcmV0dXJuIGYob2JqZWN0KHJvdyksIGksIGNvbHVtbnMpO1xuICB9O1xufVxuXG4vLyBDb21wdXRlIHVuaXF1ZSBjb2x1bW5zIGluIG9yZGVyIG9mIGRpc2NvdmVyeS5cbmZ1bmN0aW9uIGluZmVyQ29sdW1ucyhyb3dzKSB7XG4gIHZhciBjb2x1bW5TZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgY29sdW1ucyA9IFtdO1xuXG4gIHJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3cpIHtcbiAgICBmb3IgKHZhciBjb2x1bW4gaW4gcm93KSB7XG4gICAgICBpZiAoIShjb2x1bW4gaW4gY29sdW1uU2V0KSkge1xuICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uU2V0W2NvbHVtbl0gPSBjb2x1bW4pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGNvbHVtbnM7XG59XG5cbmZ1bmN0aW9uIHBhZCh2YWx1ZSwgd2lkdGgpIHtcbiAgdmFyIHMgPSB2YWx1ZSArIFwiXCIsIGxlbmd0aCA9IHMubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKDApICsgcyA6IHM7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFllYXIoeWVhcikge1xuICByZXR1cm4geWVhciA8IDAgPyBcIi1cIiArIHBhZCgteWVhciwgNilcbiAgICA6IHllYXIgPiA5OTk5ID8gXCIrXCIgKyBwYWQoeWVhciwgNilcbiAgICA6IHBhZCh5ZWFyLCA0KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlKSB7XG4gIHZhciBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKSxcbiAgICAgIG1pbnV0ZXMgPSBkYXRlLmdldFVUQ01pbnV0ZXMoKSxcbiAgICAgIHNlY29uZHMgPSBkYXRlLmdldFVUQ1NlY29uZHMoKSxcbiAgICAgIG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0VVRDTWlsbGlzZWNvbmRzKCk7XG4gIHJldHVybiBpc05hTihkYXRlKSA/IFwiSW52YWxpZCBEYXRlXCJcbiAgICAgIDogZm9ybWF0WWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCksIDQpICsgXCItXCIgKyBwYWQoZGF0ZS5nZXRVVENNb250aCgpICsgMSwgMikgKyBcIi1cIiArIHBhZChkYXRlLmdldFVUQ0RhdGUoKSwgMilcbiAgICAgICsgKG1pbGxpc2Vjb25kcyA/IFwiVFwiICsgcGFkKGhvdXJzLCAyKSArIFwiOlwiICsgcGFkKG1pbnV0ZXMsIDIpICsgXCI6XCIgKyBwYWQoc2Vjb25kcywgMikgKyBcIi5cIiArIHBhZChtaWxsaXNlY29uZHMsIDMpICsgXCJaXCJcbiAgICAgIDogc2Vjb25kcyA/IFwiVFwiICsgcGFkKGhvdXJzLCAyKSArIFwiOlwiICsgcGFkKG1pbnV0ZXMsIDIpICsgXCI6XCIgKyBwYWQoc2Vjb25kcywgMikgKyBcIlpcIlxuICAgICAgOiBtaW51dGVzIHx8IGhvdXJzID8gXCJUXCIgKyBwYWQoaG91cnMsIDIpICsgXCI6XCIgKyBwYWQobWludXRlcywgMikgKyBcIlpcIlxuICAgICAgOiBcIlwiKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVsaW1pdGVyKSB7XG4gIHZhciByZUZvcm1hdCA9IG5ldyBSZWdFeHAoXCJbXFxcIlwiICsgZGVsaW1pdGVyICsgXCJcXG5cXHJdXCIpLFxuICAgICAgREVMSU1JVEVSID0gZGVsaW1pdGVyLmNoYXJDb2RlQXQoMCk7XG5cbiAgZnVuY3Rpb24gcGFyc2UodGV4dCwgZikge1xuICAgIHZhciBjb252ZXJ0LCBjb2x1bW5zLCByb3dzID0gcGFyc2VSb3dzKHRleHQsIGZ1bmN0aW9uKHJvdywgaSkge1xuICAgICAgaWYgKGNvbnZlcnQpIHJldHVybiBjb252ZXJ0KHJvdywgaSAtIDEpO1xuICAgICAgY29sdW1ucyA9IHJvdywgY29udmVydCA9IGYgPyBjdXN0b21Db252ZXJ0ZXIocm93LCBmKSA6IG9iamVjdENvbnZlcnRlcihyb3cpO1xuICAgIH0pO1xuICAgIHJvd3MuY29sdW1ucyA9IGNvbHVtbnMgfHwgW107XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVJvd3ModGV4dCwgZikge1xuICAgIHZhciByb3dzID0gW10sIC8vIG91dHB1dCByb3dzXG4gICAgICAgIE4gPSB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgSSA9IDAsIC8vIGN1cnJlbnQgY2hhcmFjdGVyIGluZGV4XG4gICAgICAgIG4gPSAwLCAvLyBjdXJyZW50IGxpbmUgbnVtYmVyXG4gICAgICAgIHQsIC8vIGN1cnJlbnQgdG9rZW5cbiAgICAgICAgZW9mID0gTiA8PSAwLCAvLyBjdXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPRj9cbiAgICAgICAgZW9sID0gZmFsc2U7IC8vIGN1cnJlbnQgdG9rZW4gZm9sbG93ZWQgYnkgRU9MP1xuXG4gICAgLy8gU3RyaXAgdGhlIHRyYWlsaW5nIG5ld2xpbmUuXG4gICAgaWYgKHRleHQuY2hhckNvZGVBdChOIC0gMSkgPT09IE5FV0xJTkUpIC0tTjtcbiAgICBpZiAodGV4dC5jaGFyQ29kZUF0KE4gLSAxKSA9PT0gUkVUVVJOKSAtLU47XG5cbiAgICBmdW5jdGlvbiB0b2tlbigpIHtcbiAgICAgIGlmIChlb2YpIHJldHVybiBFT0Y7XG4gICAgICBpZiAoZW9sKSByZXR1cm4gZW9sID0gZmFsc2UsIEVPTDtcblxuICAgICAgLy8gVW5lc2NhcGUgcXVvdGVzLlxuICAgICAgdmFyIGksIGogPSBJLCBjO1xuICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChqKSA9PT0gUVVPVEUpIHtcbiAgICAgICAgd2hpbGUgKEkrKyA8IE4gJiYgdGV4dC5jaGFyQ29kZUF0KEkpICE9PSBRVU9URSB8fCB0ZXh0LmNoYXJDb2RlQXQoKytJKSA9PT0gUVVPVEUpO1xuICAgICAgICBpZiAoKGkgPSBJKSA+PSBOKSBlb2YgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgoYyA9IHRleHQuY2hhckNvZGVBdChJKyspKSA9PT0gTkVXTElORSkgZW9sID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoYyA9PT0gUkVUVVJOKSB7IGVvbCA9IHRydWU7IGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IE5FV0xJTkUpICsrSTsgfVxuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqICsgMSwgaSAtIDEpLnJlcGxhY2UoL1wiXCIvZywgXCJcXFwiXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBGaW5kIG5leHQgZGVsaW1pdGVyIG9yIG5ld2xpbmUuXG4gICAgICB3aGlsZSAoSSA8IE4pIHtcbiAgICAgICAgaWYgKChjID0gdGV4dC5jaGFyQ29kZUF0KGkgPSBJKyspKSA9PT0gTkVXTElORSkgZW9sID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoYyA9PT0gUkVUVVJOKSB7IGVvbCA9IHRydWU7IGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IE5FV0xJTkUpICsrSTsgfVxuICAgICAgICBlbHNlIGlmIChjICE9PSBERUxJTUlURVIpIGNvbnRpbnVlO1xuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqLCBpKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIGxhc3QgdG9rZW4gYmVmb3JlIEVPRi5cbiAgICAgIHJldHVybiBlb2YgPSB0cnVlLCB0ZXh0LnNsaWNlKGosIE4pO1xuICAgIH1cblxuICAgIHdoaWxlICgodCA9IHRva2VuKCkpICE9PSBFT0YpIHtcbiAgICAgIHZhciByb3cgPSBbXTtcbiAgICAgIHdoaWxlICh0ICE9PSBFT0wgJiYgdCAhPT0gRU9GKSByb3cucHVzaCh0KSwgdCA9IHRva2VuKCk7XG4gICAgICBpZiAoZiAmJiAocm93ID0gZihyb3csIG4rKykpID09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgcm93cy5wdXNoKHJvdyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpIHtcbiAgICByZXR1cm4gcm93cy5tYXAoZnVuY3Rpb24ocm93KSB7XG4gICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVuY3Rpb24oY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXRWYWx1ZShyb3dbY29sdW1uXSk7XG4gICAgICB9KS5qb2luKGRlbGltaXRlcik7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXQocm93cywgY29sdW1ucykge1xuICAgIGlmIChjb2x1bW5zID09IG51bGwpIGNvbHVtbnMgPSBpbmZlckNvbHVtbnMocm93cyk7XG4gICAgcmV0dXJuIFtjb2x1bW5zLm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpXS5jb25jYXQocHJlZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKSkuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdEJvZHkocm93cywgY29sdW1ucykge1xuICAgIGlmIChjb2x1bW5zID09IG51bGwpIGNvbHVtbnMgPSBpbmZlckNvbHVtbnMocm93cyk7XG4gICAgcmV0dXJuIHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFJvd3Mocm93cykge1xuICAgIHJldHVybiByb3dzLm1hcChmb3JtYXRSb3cpLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRSb3cocm93KSB7XG4gICAgcmV0dXJuIHJvdy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiXG4gICAgICAgIDogdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gZm9ybWF0RGF0ZSh2YWx1ZSlcbiAgICAgICAgOiByZUZvcm1hdC50ZXN0KHZhbHVlICs9IFwiXCIpID8gXCJcXFwiXCIgKyB2YWx1ZS5yZXBsYWNlKC9cIi9nLCBcIlxcXCJcXFwiXCIpICsgXCJcXFwiXCJcbiAgICAgICAgOiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGFyc2U6IHBhcnNlLFxuICAgIHBhcnNlUm93czogcGFyc2VSb3dzLFxuICAgIGZvcm1hdDogZm9ybWF0LFxuICAgIGZvcm1hdEJvZHk6IGZvcm1hdEJvZHksXG4gICAgZm9ybWF0Um93czogZm9ybWF0Um93cyxcbiAgICBmb3JtYXRSb3c6IGZvcm1hdFJvdyxcbiAgICBmb3JtYXRWYWx1ZTogZm9ybWF0VmFsdWVcbiAgfTtcbn1cbiIsImltcG9ydCBkc3YgZnJvbSBcIi4vZHN2LmpzXCI7XG5cbnZhciB0c3YgPSBkc3YoXCJcXHRcIik7XG5cbmV4cG9ydCB2YXIgdHN2UGFyc2UgPSB0c3YucGFyc2U7XG5leHBvcnQgdmFyIHRzdlBhcnNlUm93cyA9IHRzdi5wYXJzZVJvd3M7XG5leHBvcnQgdmFyIHRzdkZvcm1hdCA9IHRzdi5mb3JtYXQ7XG5leHBvcnQgdmFyIHRzdkZvcm1hdEJvZHkgPSB0c3YuZm9ybWF0Qm9keTtcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0Um93cyA9IHRzdi5mb3JtYXRSb3dzO1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRSb3cgPSB0c3YuZm9ybWF0Um93O1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRWYWx1ZSA9IHRzdi5mb3JtYXRWYWx1ZTtcbiIsImV4cG9ydCBmdW5jdGlvbiBjdWJpY0luKHQpIHtcbiAgcmV0dXJuIHQgKiB0ICogdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljT3V0KHQpIHtcbiAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyO1xufVxuIiwiaW1wb3J0IHtjc3ZQYXJzZSwgZHN2Rm9ybWF0LCB0c3ZQYXJzZX0gZnJvbSBcImQzLWRzdlwiO1xuaW1wb3J0IHRleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuXG5mdW5jdGlvbiBkc3ZQYXJzZShwYXJzZSkge1xuICByZXR1cm4gZnVuY3Rpb24oaW5wdXQsIGluaXQsIHJvdykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBpbml0ID09PSBcImZ1bmN0aW9uXCIpIHJvdyA9IGluaXQsIGluaXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRleHQoaW5wdXQsIGluaXQpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBwYXJzZShyZXNwb25zZSwgcm93KTtcbiAgICB9KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZHN2KGRlbGltaXRlciwgaW5wdXQsIGluaXQsIHJvdykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2YgaW5pdCA9PT0gXCJmdW5jdGlvblwiKSByb3cgPSBpbml0LCBpbml0ID0gdW5kZWZpbmVkO1xuICB2YXIgZm9ybWF0ID0gZHN2Rm9ybWF0KGRlbGltaXRlcik7XG4gIHJldHVybiB0ZXh0KGlucHV0LCBpbml0KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGZvcm1hdC5wYXJzZShyZXNwb25zZSwgcm93KTtcbiAgfSk7XG59XG5cbmV4cG9ydCB2YXIgY3N2ID0gZHN2UGFyc2UoY3N2UGFyc2UpO1xuZXhwb3J0IHZhciB0c3YgPSBkc3ZQYXJzZSh0c3ZQYXJzZSk7XG4iLCJmdW5jdGlvbiByZXNwb25zZUpzb24ocmVzcG9uc2UpIHtcbiAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1cyArIFwiIFwiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCB8fCByZXNwb25zZS5zdGF0dXMgPT09IDIwNSkgcmV0dXJuO1xuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpLnRoZW4ocmVzcG9uc2VKc29uKTtcbn1cbiIsImZ1bmN0aW9uIHJlc3BvbnNlVGV4dChyZXNwb25zZSkge1xuICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzICsgXCIgXCIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5wdXQsIGluaXQpIHtcbiAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KS50aGVuKHJlc3BvbnNlVGV4dCk7XG59XG4iLCJpbXBvcnQgZm9ybWF0TG9jYWxlIGZyb20gXCIuL2xvY2FsZS5qc1wiO1xuXG52YXIgbG9jYWxlO1xuZXhwb3J0IHZhciBmb3JtYXQ7XG5leHBvcnQgdmFyIGZvcm1hdFByZWZpeDtcblxuZGVmYXVsdExvY2FsZSh7XG4gIHRob3VzYW5kczogXCIsXCIsXG4gIGdyb3VwaW5nOiBbM10sXG4gIGN1cnJlbmN5OiBbXCIkXCIsIFwiXCJdXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7XG4gIGxvY2FsZSA9IGZvcm1hdExvY2FsZShkZWZpbml0aW9uKTtcbiAgZm9ybWF0ID0gbG9jYWxlLmZvcm1hdDtcbiAgZm9ybWF0UHJlZml4ID0gbG9jYWxlLmZvcm1hdFByZWZpeDtcbiAgcmV0dXJuIGxvY2FsZTtcbn1cbiIsImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHggPSBmb3JtYXREZWNpbWFsUGFydHMoTWF0aC5hYnMoeCkpLCB4ID8geFsxXSA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHggPSBNYXRoLnJvdW5kKHgpKSA+PSAxZTIxXG4gICAgICA/IHgudG9Mb2NhbGVTdHJpbmcoXCJlblwiKS5yZXBsYWNlKC8sL2csIFwiXCIpXG4gICAgICA6IHgudG9TdHJpbmcoMTApO1xufVxuXG4vLyBDb21wdXRlcyB0aGUgZGVjaW1hbCBjb2VmZmljaWVudCBhbmQgZXhwb25lbnQgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgeCB3aXRoXG4vLyBzaWduaWZpY2FudCBkaWdpdHMgcCwgd2hlcmUgeCBpcyBwb3NpdGl2ZSBhbmQgcCBpcyBpbiBbMSwgMjFdIG9yIHVuZGVmaW5lZC5cbi8vIEZvciBleGFtcGxlLCBmb3JtYXREZWNpbWFsUGFydHMoMS4yMykgcmV0dXJucyBbXCIxMjNcIiwgMF0uXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApIHtcbiAgaWYgKChpID0gKHggPSBwID8geC50b0V4cG9uZW50aWFsKHAgLSAxKSA6IHgudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKFwiZVwiKSkgPCAwKSByZXR1cm4gbnVsbDsgLy8gTmFOLCDCsUluZmluaXR5XG4gIHZhciBpLCBjb2VmZmljaWVudCA9IHguc2xpY2UoMCwgaSk7XG5cbiAgLy8gVGhlIHN0cmluZyByZXR1cm5lZCBieSB0b0V4cG9uZW50aWFsIGVpdGhlciBoYXMgdGhlIGZvcm0gXFxkXFwuXFxkK2VbLStdXFxkK1xuICAvLyAoZS5nLiwgMS4yZSszKSBvciB0aGUgZm9ybSBcXGRlWy0rXVxcZCsgKGUuZy4sIDFlKzMpLlxuICByZXR1cm4gW1xuICAgIGNvZWZmaWNpZW50Lmxlbmd0aCA+IDEgPyBjb2VmZmljaWVudFswXSArIGNvZWZmaWNpZW50LnNsaWNlKDIpIDogY29lZmZpY2llbnQsXG4gICAgK3guc2xpY2UoaSArIDEpXG4gIF07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihncm91cGluZywgdGhvdXNhbmRzKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgd2lkdGgpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aCxcbiAgICAgICAgdCA9IFtdLFxuICAgICAgICBqID0gMCxcbiAgICAgICAgZyA9IGdyb3VwaW5nWzBdLFxuICAgICAgICBsZW5ndGggPSAwO1xuXG4gICAgd2hpbGUgKGkgPiAwICYmIGcgPiAwKSB7XG4gICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEsIHdpZHRoIC0gbGVuZ3RoKTtcbiAgICAgIHQucHVzaCh2YWx1ZS5zdWJzdHJpbmcoaSAtPSBnLCBpICsgZykpO1xuICAgICAgaWYgKChsZW5ndGggKz0gZyArIDEpID4gd2lkdGgpIGJyZWFrO1xuICAgICAgZyA9IGdyb3VwaW5nW2ogPSAoaiArIDEpICUgZ3JvdXBpbmcubGVuZ3RoXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdC5yZXZlcnNlKCkuam9pbih0aG91c2FuZHMpO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obnVtZXJhbHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1swLTldL2csIGZ1bmN0aW9uKGkpIHtcbiAgICAgIHJldHVybiBudW1lcmFsc1sraV07XG4gICAgfSk7XG4gIH07XG59XG4iLCJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgdmFyIHByZWZpeEV4cG9uZW50O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCBwKSB7XG4gIHZhciBkID0gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApO1xuICBpZiAoIWQpIHJldHVybiB4ICsgXCJcIjtcbiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSxcbiAgICAgIGV4cG9uZW50ID0gZFsxXSxcbiAgICAgIGkgPSBleHBvbmVudCAtIChwcmVmaXhFeHBvbmVudCA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50IC8gMykpKSAqIDMpICsgMSxcbiAgICAgIG4gPSBjb2VmZmljaWVudC5sZW5ndGg7XG4gIHJldHVybiBpID09PSBuID8gY29lZmZpY2llbnRcbiAgICAgIDogaSA+IG4gPyBjb2VmZmljaWVudCArIG5ldyBBcnJheShpIC0gbiArIDEpLmpvaW4oXCIwXCIpXG4gICAgICA6IGkgPiAwID8gY29lZmZpY2llbnQuc2xpY2UoMCwgaSkgKyBcIi5cIiArIGNvZWZmaWNpZW50LnNsaWNlKGkpXG4gICAgICA6IFwiMC5cIiArIG5ldyBBcnJheSgxIC0gaSkuam9pbihcIjBcIikgKyBmb3JtYXREZWNpbWFsUGFydHMoeCwgTWF0aC5tYXgoMCwgcCArIGkgLSAxKSlbMF07IC8vIGxlc3MgdGhhbiAxeSFcbn1cbiIsImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHApIHtcbiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCk7XG4gIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLFxuICAgICAgZXhwb25lbnQgPSBkWzFdO1xuICByZXR1cm4gZXhwb25lbnQgPCAwID8gXCIwLlwiICsgbmV3IEFycmF5KC1leHBvbmVudCkuam9pbihcIjBcIikgKyBjb2VmZmljaWVudFxuICAgICAgOiBjb2VmZmljaWVudC5sZW5ndGggPiBleHBvbmVudCArIDEgPyBjb2VmZmljaWVudC5zbGljZSgwLCBleHBvbmVudCArIDEpICsgXCIuXCIgKyBjb2VmZmljaWVudC5zbGljZShleHBvbmVudCArIDEpXG4gICAgICA6IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGV4cG9uZW50IC0gY29lZmZpY2llbnQubGVuZ3RoICsgMikuam9pbihcIjBcIik7XG59XG4iLCIvLyBbW2ZpbGxdYWxpZ25dW3NpZ25dW3N5bWJvbF1bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW35dW3R5cGVdXG52YXIgcmUgPSAvXig/OiguKT8oWzw+PV5dKSk/KFsrXFwtKCBdKT8oWyQjXSk/KDApPyhcXGQrKT8oLCk/KFxcLlxcZCspPyh+KT8oW2EteiVdKT8kL2k7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgaWYgKCEobWF0Y2ggPSByZS5leGVjKHNwZWNpZmllcikpKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGZvcm1hdDogXCIgKyBzcGVjaWZpZXIpO1xuICB2YXIgbWF0Y2g7XG4gIHJldHVybiBuZXcgRm9ybWF0U3BlY2lmaWVyKHtcbiAgICBmaWxsOiBtYXRjaFsxXSxcbiAgICBhbGlnbjogbWF0Y2hbMl0sXG4gICAgc2lnbjogbWF0Y2hbM10sXG4gICAgc3ltYm9sOiBtYXRjaFs0XSxcbiAgICB6ZXJvOiBtYXRjaFs1XSxcbiAgICB3aWR0aDogbWF0Y2hbNl0sXG4gICAgY29tbWE6IG1hdGNoWzddLFxuICAgIHByZWNpc2lvbjogbWF0Y2hbOF0gJiYgbWF0Y2hbOF0uc2xpY2UoMSksXG4gICAgdHJpbTogbWF0Y2hbOV0sXG4gICAgdHlwZTogbWF0Y2hbMTBdXG4gIH0pO1xufVxuXG5mb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlID0gRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZTsgLy8gaW5zdGFuY2VvZlxuXG5leHBvcnQgZnVuY3Rpb24gRm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikge1xuICB0aGlzLmZpbGwgPSBzcGVjaWZpZXIuZmlsbCA9PT0gdW5kZWZpbmVkID8gXCIgXCIgOiBzcGVjaWZpZXIuZmlsbCArIFwiXCI7XG4gIHRoaXMuYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24gPT09IHVuZGVmaW5lZCA/IFwiPlwiIDogc3BlY2lmaWVyLmFsaWduICsgXCJcIjtcbiAgdGhpcy5zaWduID0gc3BlY2lmaWVyLnNpZ24gPT09IHVuZGVmaW5lZCA/IFwiLVwiIDogc3BlY2lmaWVyLnNpZ24gKyBcIlwiO1xuICB0aGlzLnN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBzcGVjaWZpZXIuc3ltYm9sICsgXCJcIjtcbiAgdGhpcy56ZXJvID0gISFzcGVjaWZpZXIuemVybztcbiAgdGhpcy53aWR0aCA9IHNwZWNpZmllci53aWR0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogK3NwZWNpZmllci53aWR0aDtcbiAgdGhpcy5jb21tYSA9ICEhc3BlY2lmaWVyLmNvbW1hO1xuICB0aGlzLnByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIucHJlY2lzaW9uO1xuICB0aGlzLnRyaW0gPSAhIXNwZWNpZmllci50cmltO1xuICB0aGlzLnR5cGUgPSBzcGVjaWZpZXIudHlwZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHNwZWNpZmllci50eXBlICsgXCJcIjtcbn1cblxuRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5maWxsXG4gICAgICArIHRoaXMuYWxpZ25cbiAgICAgICsgdGhpcy5zaWduXG4gICAgICArIHRoaXMuc3ltYm9sXG4gICAgICArICh0aGlzLnplcm8gPyBcIjBcIiA6IFwiXCIpXG4gICAgICArICh0aGlzLndpZHRoID09PSB1bmRlZmluZWQgPyBcIlwiIDogTWF0aC5tYXgoMSwgdGhpcy53aWR0aCB8IDApKVxuICAgICAgKyAodGhpcy5jb21tYSA/IFwiLFwiIDogXCJcIilcbiAgICAgICsgKHRoaXMucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyBcIlwiIDogXCIuXCIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKVxuICAgICAgKyAodGhpcy50cmltID8gXCJ+XCIgOiBcIlwiKVxuICAgICAgKyB0aGlzLnR5cGU7XG59O1xuIiwiLy8gVHJpbXMgaW5zaWduaWZpY2FudCB6ZXJvcywgZS5nLiwgcmVwbGFjZXMgMS4yMDAwayB3aXRoIDEuMmsuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzKSB7XG4gIG91dDogZm9yICh2YXIgbiA9IHMubGVuZ3RoLCBpID0gMSwgaTAgPSAtMSwgaTE7IGkgPCBuOyArK2kpIHtcbiAgICBzd2l0Y2ggKHNbaV0pIHtcbiAgICAgIGNhc2UgXCIuXCI6IGkwID0gaTEgPSBpOyBicmVhaztcbiAgICAgIGNhc2UgXCIwXCI6IGlmIChpMCA9PT0gMCkgaTAgPSBpOyBpMSA9IGk7IGJyZWFrO1xuICAgICAgZGVmYXVsdDogaWYgKCErc1tpXSkgYnJlYWsgb3V0OyBpZiAoaTAgPiAwKSBpMCA9IDA7IGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaTAgPiAwID8gcy5zbGljZSgwLCBpMCkgKyBzLnNsaWNlKGkxICsgMSkgOiBzO1xufVxuIiwiaW1wb3J0IGZvcm1hdERlY2ltYWwgZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuaW1wb3J0IGZvcm1hdFByZWZpeEF1dG8gZnJvbSBcIi4vZm9ybWF0UHJlZml4QXV0by5qc1wiO1xuaW1wb3J0IGZvcm1hdFJvdW5kZWQgZnJvbSBcIi4vZm9ybWF0Um91bmRlZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIFwiJVwiOiAoeCwgcCkgPT4gKHggKiAxMDApLnRvRml4ZWQocCksXG4gIFwiYlwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygyKSxcbiAgXCJjXCI6ICh4KSA9PiB4ICsgXCJcIixcbiAgXCJkXCI6IGZvcm1hdERlY2ltYWwsXG4gIFwiZVwiOiAoeCwgcCkgPT4geC50b0V4cG9uZW50aWFsKHApLFxuICBcImZcIjogKHgsIHApID0+IHgudG9GaXhlZChwKSxcbiAgXCJnXCI6ICh4LCBwKSA9PiB4LnRvUHJlY2lzaW9uKHApLFxuICBcIm9cIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoOCksXG4gIFwicFwiOiAoeCwgcCkgPT4gZm9ybWF0Um91bmRlZCh4ICogMTAwLCBwKSxcbiAgXCJyXCI6IGZvcm1hdFJvdW5kZWQsXG4gIFwic1wiOiBmb3JtYXRQcmVmaXhBdXRvLFxuICBcIlhcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCksXG4gIFwieFwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNilcbn07XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4O1xufVxuIiwiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5pbXBvcnQgZm9ybWF0R3JvdXAgZnJvbSBcIi4vZm9ybWF0R3JvdXAuanNcIjtcbmltcG9ydCBmb3JtYXROdW1lcmFscyBmcm9tIFwiLi9mb3JtYXROdW1lcmFscy5qc1wiO1xuaW1wb3J0IGZvcm1hdFNwZWNpZmllciBmcm9tIFwiLi9mb3JtYXRTcGVjaWZpZXIuanNcIjtcbmltcG9ydCBmb3JtYXRUcmltIGZyb20gXCIuL2Zvcm1hdFRyaW0uanNcIjtcbmltcG9ydCBmb3JtYXRUeXBlcyBmcm9tIFwiLi9mb3JtYXRUeXBlcy5qc1wiO1xuaW1wb3J0IHtwcmVmaXhFeHBvbmVudH0gZnJvbSBcIi4vZm9ybWF0UHJlZml4QXV0by5qc1wiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuL2lkZW50aXR5LmpzXCI7XG5cbnZhciBtYXAgPSBBcnJheS5wcm90b3R5cGUubWFwLFxuICAgIHByZWZpeGVzID0gW1wieVwiLFwielwiLFwiYVwiLFwiZlwiLFwicFwiLFwiblwiLFwiwrVcIixcIm1cIixcIlwiLFwia1wiLFwiTVwiLFwiR1wiLFwiVFwiLFwiUFwiLFwiRVwiLFwiWlwiLFwiWVwiXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obG9jYWxlKSB7XG4gIHZhciBncm91cCA9IGxvY2FsZS5ncm91cGluZyA9PT0gdW5kZWZpbmVkIHx8IGxvY2FsZS50aG91c2FuZHMgPT09IHVuZGVmaW5lZCA/IGlkZW50aXR5IDogZm9ybWF0R3JvdXAobWFwLmNhbGwobG9jYWxlLmdyb3VwaW5nLCBOdW1iZXIpLCBsb2NhbGUudGhvdXNhbmRzICsgXCJcIiksXG4gICAgICBjdXJyZW5jeVByZWZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGxvY2FsZS5jdXJyZW5jeVswXSArIFwiXCIsXG4gICAgICBjdXJyZW5jeVN1ZmZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGxvY2FsZS5jdXJyZW5jeVsxXSArIFwiXCIsXG4gICAgICBkZWNpbWFsID0gbG9jYWxlLmRlY2ltYWwgPT09IHVuZGVmaW5lZCA/IFwiLlwiIDogbG9jYWxlLmRlY2ltYWwgKyBcIlwiLFxuICAgICAgbnVtZXJhbHMgPSBsb2NhbGUubnVtZXJhbHMgPT09IHVuZGVmaW5lZCA/IGlkZW50aXR5IDogZm9ybWF0TnVtZXJhbHMobWFwLmNhbGwobG9jYWxlLm51bWVyYWxzLCBTdHJpbmcpKSxcbiAgICAgIHBlcmNlbnQgPSBsb2NhbGUucGVyY2VudCA9PT0gdW5kZWZpbmVkID8gXCIlXCIgOiBsb2NhbGUucGVyY2VudCArIFwiXCIsXG4gICAgICBtaW51cyA9IGxvY2FsZS5taW51cyA9PT0gdW5kZWZpbmVkID8gXCLiiJJcIiA6IGxvY2FsZS5taW51cyArIFwiXCIsXG4gICAgICBuYW4gPSBsb2NhbGUubmFuID09PSB1bmRlZmluZWQgPyBcIk5hTlwiIDogbG9jYWxlLm5hbiArIFwiXCI7XG5cbiAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllcikge1xuICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpO1xuXG4gICAgdmFyIGZpbGwgPSBzcGVjaWZpZXIuZmlsbCxcbiAgICAgICAgYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24sXG4gICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbixcbiAgICAgICAgc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCxcbiAgICAgICAgemVybyA9IHNwZWNpZmllci56ZXJvLFxuICAgICAgICB3aWR0aCA9IHNwZWNpZmllci53aWR0aCxcbiAgICAgICAgY29tbWEgPSBzcGVjaWZpZXIuY29tbWEsXG4gICAgICAgIHByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24sXG4gICAgICAgIHRyaW0gPSBzcGVjaWZpZXIudHJpbSxcbiAgICAgICAgdHlwZSA9IHNwZWNpZmllci50eXBlO1xuXG4gICAgLy8gVGhlIFwiblwiIHR5cGUgaXMgYW4gYWxpYXMgZm9yIFwiLGdcIi5cbiAgICBpZiAodHlwZSA9PT0gXCJuXCIpIGNvbW1hID0gdHJ1ZSwgdHlwZSA9IFwiZ1wiO1xuXG4gICAgLy8gVGhlIFwiXCIgdHlwZSwgYW5kIGFueSBpbnZhbGlkIHR5cGUsIGlzIGFuIGFsaWFzIGZvciBcIi4xMn5nXCIuXG4gICAgZWxzZSBpZiAoIWZvcm1hdFR5cGVzW3R5cGVdKSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiAocHJlY2lzaW9uID0gMTIpLCB0cmltID0gdHJ1ZSwgdHlwZSA9IFwiZ1wiO1xuXG4gICAgLy8gSWYgemVybyBmaWxsIGlzIHNwZWNpZmllZCwgcGFkZGluZyBnb2VzIGFmdGVyIHNpZ24gYW5kIGJlZm9yZSBkaWdpdHMuXG4gICAgaWYgKHplcm8gfHwgKGZpbGwgPT09IFwiMFwiICYmIGFsaWduID09PSBcIj1cIikpIHplcm8gPSB0cnVlLCBmaWxsID0gXCIwXCIsIGFsaWduID0gXCI9XCI7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC5cbiAgICAvLyBGb3IgU0ktcHJlZml4LCB0aGUgc3VmZml4IGlzIGxhemlseSBjb21wdXRlZC5cbiAgICB2YXIgcHJlZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5UHJlZml4IDogc3ltYm9sID09PSBcIiNcIiAmJiAvW2JveFhdLy50ZXN0KHR5cGUpID8gXCIwXCIgKyB0eXBlLnRvTG93ZXJDYXNlKCkgOiBcIlwiLFxuICAgICAgICBzdWZmaXggPSBzeW1ib2wgPT09IFwiJFwiID8gY3VycmVuY3lTdWZmaXggOiAvWyVwXS8udGVzdCh0eXBlKSA/IHBlcmNlbnQgOiBcIlwiO1xuXG4gICAgLy8gV2hhdCBmb3JtYXQgZnVuY3Rpb24gc2hvdWxkIHdlIHVzZT9cbiAgICAvLyBJcyB0aGlzIGFuIGludGVnZXIgdHlwZT9cbiAgICAvLyBDYW4gdGhpcyB0eXBlIGdlbmVyYXRlIGV4cG9uZW50aWFsIG5vdGF0aW9uP1xuICAgIHZhciBmb3JtYXRUeXBlID0gZm9ybWF0VHlwZXNbdHlwZV0sXG4gICAgICAgIG1heWJlU3VmZml4ID0gL1tkZWZncHJzJV0vLnRlc3QodHlwZSk7XG5cbiAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlmIG5vdCBzcGVjaWZpZWQsXG4gICAgLy8gb3IgY2xhbXAgdGhlIHNwZWNpZmllZCBwcmVjaXNpb24gdG8gdGhlIHN1cHBvcnRlZCByYW5nZS5cbiAgICAvLyBGb3Igc2lnbmlmaWNhbnQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFsxLCAyMV0uXG4gICAgLy8gRm9yIGZpeGVkIHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMCwgMjBdLlxuICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gNlxuICAgICAgICA6IC9bZ3Byc10vLnRlc3QodHlwZSkgPyBNYXRoLm1heCgxLCBNYXRoLm1pbigyMSwgcHJlY2lzaW9uKSlcbiAgICAgICAgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgcHJlY2lzaW9uKSk7XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQodmFsdWUpIHtcbiAgICAgIHZhciB2YWx1ZVByZWZpeCA9IHByZWZpeCxcbiAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IHN1ZmZpeCxcbiAgICAgICAgICBpLCBuLCBjO1xuXG4gICAgICBpZiAodHlwZSA9PT0gXCJjXCIpIHtcbiAgICAgICAgdmFsdWVTdWZmaXggPSBmb3JtYXRUeXBlKHZhbHVlKSArIHZhbHVlU3VmZml4O1xuICAgICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9ICt2YWx1ZTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHNpZ24uIC0wIGlzIG5vdCBsZXNzIHRoYW4gMCwgYnV0IDEgLyAtMCBpcyFcbiAgICAgICAgdmFyIHZhbHVlTmVnYXRpdmUgPSB2YWx1ZSA8IDAgfHwgMSAvIHZhbHVlIDwgMDtcblxuICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbml0aWFsIGZvcm1hdHRpbmcuXG4gICAgICAgIHZhbHVlID0gaXNOYU4odmFsdWUpID8gbmFuIDogZm9ybWF0VHlwZShNYXRoLmFicyh2YWx1ZSksIHByZWNpc2lvbik7XG5cbiAgICAgICAgLy8gVHJpbSBpbnNpZ25pZmljYW50IHplcm9zLlxuICAgICAgICBpZiAodHJpbSkgdmFsdWUgPSBmb3JtYXRUcmltKHZhbHVlKTtcblxuICAgICAgICAvLyBJZiBhIG5lZ2F0aXZlIHZhbHVlIHJvdW5kcyB0byB6ZXJvIGFmdGVyIGZvcm1hdHRpbmcsIGFuZCBubyBleHBsaWNpdCBwb3NpdGl2ZSBzaWduIGlzIHJlcXVlc3RlZCwgaGlkZSB0aGUgc2lnbi5cbiAgICAgICAgaWYgKHZhbHVlTmVnYXRpdmUgJiYgK3ZhbHVlID09PSAwICYmIHNpZ24gIT09IFwiK1wiKSB2YWx1ZU5lZ2F0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgICAgIHZhbHVlUHJlZml4ID0gKHZhbHVlTmVnYXRpdmUgPyAoc2lnbiA9PT0gXCIoXCIgPyBzaWduIDogbWludXMpIDogc2lnbiA9PT0gXCItXCIgfHwgc2lnbiA9PT0gXCIoXCIgPyBcIlwiIDogc2lnbikgKyB2YWx1ZVByZWZpeDtcbiAgICAgICAgdmFsdWVTdWZmaXggPSAodHlwZSA9PT0gXCJzXCIgPyBwcmVmaXhlc1s4ICsgcHJlZml4RXhwb25lbnQgLyAzXSA6IFwiXCIpICsgdmFsdWVTdWZmaXggKyAodmFsdWVOZWdhdGl2ZSAmJiBzaWduID09PSBcIihcIiA/IFwiKVwiIDogXCJcIik7XG5cbiAgICAgICAgLy8gQnJlYWsgdGhlIGZvcm1hdHRlZCB2YWx1ZSBpbnRvIHRoZSBpbnRlZ2VyIOKAnHZhbHVl4oCdIHBhcnQgdGhhdCBjYW4gYmVcbiAgICAgICAgLy8gZ3JvdXBlZCwgYW5kIGZyYWN0aW9uYWwgb3IgZXhwb25lbnRpYWwg4oCcc3VmZml44oCdIHBhcnQgdGhhdCBpcyBub3QuXG4gICAgICAgIGlmIChtYXliZVN1ZmZpeCkge1xuICAgICAgICAgIGkgPSAtMSwgbiA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICAgICAgaWYgKGMgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpLCA0OCA+IGMgfHwgYyA+IDU3KSB7XG4gICAgICAgICAgICAgIHZhbHVlU3VmZml4ID0gKGMgPT09IDQ2ID8gZGVjaW1hbCArIHZhbHVlLnNsaWNlKGkgKyAxKSA6IHZhbHVlLnNsaWNlKGkpKSArIHZhbHVlU3VmZml4O1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIG5vdCBcIjBcIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBiZWZvcmUgcGFkZGluZy5cbiAgICAgIGlmIChjb21tYSAmJiAhemVybykgdmFsdWUgPSBncm91cCh2YWx1ZSwgSW5maW5pdHkpO1xuXG4gICAgICAvLyBDb21wdXRlIHRoZSBwYWRkaW5nLlxuICAgICAgdmFyIGxlbmd0aCA9IHZhbHVlUHJlZml4Lmxlbmd0aCArIHZhbHVlLmxlbmd0aCArIHZhbHVlU3VmZml4Lmxlbmd0aCxcbiAgICAgICAgICBwYWRkaW5nID0gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpIDogXCJcIjtcblxuICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIFwiMFwiLCBncm91cGluZyBpcyBhcHBsaWVkIGFmdGVyIHBhZGRpbmcuXG4gICAgICBpZiAoY29tbWEgJiYgemVybykgdmFsdWUgPSBncm91cChwYWRkaW5nICsgdmFsdWUsIHBhZGRpbmcubGVuZ3RoID8gd2lkdGggLSB2YWx1ZVN1ZmZpeC5sZW5ndGggOiBJbmZpbml0eSksIHBhZGRpbmcgPSBcIlwiO1xuXG4gICAgICAvLyBSZWNvbnN0cnVjdCB0aGUgZmluYWwgb3V0cHV0IGJhc2VkIG9uIHRoZSBkZXNpcmVkIGFsaWdubWVudC5cbiAgICAgIHN3aXRjaCAoYWxpZ24pIHtcbiAgICAgICAgY2FzZSBcIjxcIjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXggKyBwYWRkaW5nOyBicmVhaztcbiAgICAgICAgY2FzZSBcIj1cIjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHBhZGRpbmcgKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhaztcbiAgICAgICAgY2FzZSBcIl5cIjogdmFsdWUgPSBwYWRkaW5nLnNsaWNlKDAsIGxlbmd0aCA9IHBhZGRpbmcubGVuZ3RoID4+IDEpICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZy5zbGljZShsZW5ndGgpOyBicmVhaztcbiAgICAgICAgZGVmYXVsdDogdmFsdWUgPSBwYWRkaW5nICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bWVyYWxzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmb3JtYXQudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzcGVjaWZpZXIgKyBcIlwiO1xuICAgIH07XG5cbiAgICByZXR1cm4gZm9ybWF0O1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpIHtcbiAgICB2YXIgZiA9IG5ld0Zvcm1hdCgoc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciksIHNwZWNpZmllci50eXBlID0gXCJmXCIsIHNwZWNpZmllcikpLFxuICAgICAgICBlID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQodmFsdWUpIC8gMykpKSAqIDMsXG4gICAgICAgIGsgPSBNYXRoLnBvdygxMCwgLWUpLFxuICAgICAgICBwcmVmaXggPSBwcmVmaXhlc1s4ICsgZSAvIDNdO1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGYoayAqIHZhbHVlKSArIHByZWZpeDtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXQ6IG5ld0Zvcm1hdCxcbiAgICBmb3JtYXRQcmVmaXg6IGZvcm1hdFByZWZpeFxuICB9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJhc2lzKHQxLCB2MCwgdjEsIHYyLCB2Mykge1xuICB2YXIgdDIgPSB0MSAqIHQxLCB0MyA9IHQyICogdDE7XG4gIHJldHVybiAoKDEgLSAzICogdDEgKyAzICogdDIgLSB0MykgKiB2MFxuICAgICAgKyAoNCAtIDYgKiB0MiArIDMgKiB0MykgKiB2MVxuICAgICAgKyAoMSArIDMgKiB0MSArIDMgKiB0MiAtIDMgKiB0MykgKiB2MlxuICAgICAgKyB0MyAqIHYzKSAvIDY7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGggLSAxO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdCA8PSAwID8gKHQgPSAwKSA6IHQgPj0gMSA/ICh0ID0gMSwgbiAtIDEpIDogTWF0aC5mbG9vcih0ICogbiksXG4gICAgICAgIHYxID0gdmFsdWVzW2ldLFxuICAgICAgICB2MiA9IHZhbHVlc1tpICsgMV0sXG4gICAgICAgIHYwID0gaSA+IDAgPyB2YWx1ZXNbaSAtIDFdIDogMiAqIHYxIC0gdjIsXG4gICAgICAgIHYzID0gaSA8IG4gLSAxID8gdmFsdWVzW2kgKyAyXSA6IDIgKiB2MiAtIHYxO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7YmFzaXN9IGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGg7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKCgodCAlPSAxKSA8IDAgPyArK3QgOiB0KSAqIG4pLFxuICAgICAgICB2MCA9IHZhbHVlc1soaSArIG4gLSAxKSAlIG5dLFxuICAgICAgICB2MSA9IHZhbHVlc1tpICUgbl0sXG4gICAgICAgIHYyID0gdmFsdWVzWyhpICsgMSkgJSBuXSxcbiAgICAgICAgdjMgPSB2YWx1ZXNbKGkgKyAyKSAlIG5dO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn1cbiIsImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBsaW5lYXIoYSwgZCkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICsgdCAqIGQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4cG9uZW50aWFsKGEsIGIsIHkpIHtcbiAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBodWUoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2FtbWEoeSkge1xuICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hIDogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vZ2FtbWEoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgeCA9PiAoKSA9PiB4O1xuIiwiaW1wb3J0IHtsYWIgYXMgY29sb3JMYWJ9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGNvbG9yIGZyb20gXCIuL2NvbG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxhYihzdGFydCwgZW5kKSB7XG4gIHZhciBsID0gY29sb3IoKHN0YXJ0ID0gY29sb3JMYWIoc3RhcnQpKS5sLCAoZW5kID0gY29sb3JMYWIoZW5kKSkubCksXG4gICAgICBhID0gY29sb3Ioc3RhcnQuYSwgZW5kLmEpLFxuICAgICAgYiA9IGNvbG9yKHN0YXJ0LmIsIGVuZC5iKSxcbiAgICAgIG9wYWNpdHkgPSBjb2xvcihzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgc3RhcnQubCA9IGwodCk7XG4gICAgc3RhcnQuYSA9IGEodCk7XG4gICAgc3RhcnQuYiA9IGIodCk7XG4gICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGEgKiAoMSAtIHQpICsgYiAqIHQ7XG4gIH07XG59XG4iLCJpbXBvcnQge3JnYiBhcyBjb2xvclJnYn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgYmFzaXMgZnJvbSBcIi4vYmFzaXMuanNcIjtcbmltcG9ydCBiYXNpc0Nsb3NlZCBmcm9tIFwiLi9iYXNpc0Nsb3NlZC5qc1wiO1xuaW1wb3J0IG5vZ2FtbWEsIHtnYW1tYX0gZnJvbSBcIi4vY29sb3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHtcbiAgdmFyIGNvbG9yID0gZ2FtbWEoeSk7XG5cbiAgZnVuY3Rpb24gcmdiKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IGNvbG9yUmdiKHN0YXJ0KSkuciwgKGVuZCA9IGNvbG9yUmdiKGVuZCkpLnIpLFxuICAgICAgICBnID0gY29sb3Ioc3RhcnQuZywgZW5kLmcpLFxuICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLFxuICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHN0YXJ0LnIgPSByKHQpO1xuICAgICAgc3RhcnQuZyA9IGcodCk7XG4gICAgICBzdGFydC5iID0gYih0KTtcbiAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICB9O1xuICB9XG5cbiAgcmdiLmdhbW1hID0gcmdiR2FtbWE7XG5cbiAgcmV0dXJuIHJnYjtcbn0pKDEpO1xuXG5mdW5jdGlvbiByZ2JTcGxpbmUoc3BsaW5lKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xvcnMpIHtcbiAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsXG4gICAgICAgIHIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGcgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGksIGNvbG9yO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGNvbG9yID0gY29sb3JSZ2IoY29sb3JzW2ldKTtcbiAgICAgIHJbaV0gPSBjb2xvci5yIHx8IDA7XG4gICAgICBnW2ldID0gY29sb3IuZyB8fCAwO1xuICAgICAgYltpXSA9IGNvbG9yLmIgfHwgMDtcbiAgICB9XG4gICAgciA9IHNwbGluZShyKTtcbiAgICBnID0gc3BsaW5lKGcpO1xuICAgIGIgPSBzcGxpbmUoYik7XG4gICAgY29sb3Iub3BhY2l0eSA9IDE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIGNvbG9yLnIgPSByKHQpO1xuICAgICAgY29sb3IuZyA9IGcodCk7XG4gICAgICBjb2xvci5iID0gYih0KTtcbiAgICAgIHJldHVybiBjb2xvciArIFwiXCI7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciByZ2JCYXNpcyA9IHJnYlNwbGluZShiYXNpcyk7XG5leHBvcnQgdmFyIHJnYkJhc2lzQ2xvc2VkID0gcmdiU3BsaW5lKGJhc2lzQ2xvc2VkKTtcbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbnZhciByZUEgPSAvWy0rXT8oPzpcXGQrXFwuP1xcZCp8XFwuP1xcZCspKD86W2VFXVstK10/XFxkKyk/L2csXG4gICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCBcImdcIik7XG5cbmZ1bmN0aW9uIHplcm8oYikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGI7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uZShiKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGIodCkgKyBcIlwiO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYVxuICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYlxuICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55XG4gICAgICBpID0gLTEsIC8vIGluZGV4IGluIHNcbiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG5cbiAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLlxuICBhID0gYSArIFwiXCIsIGIgPSBiICsgXCJcIjtcblxuICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLlxuICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpXG4gICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHtcbiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpO1xuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJzO1xuICAgIH1cbiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaFxuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJtO1xuICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzXG4gICAgICBzWysraV0gPSBudWxsO1xuICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pO1xuICAgIH1cbiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7XG4gIH1cblxuICAvLyBBZGQgcmVtYWlucyBvZiBiLlxuICBpZiAoYmkgPCBiLmxlbmd0aCkge1xuICAgIGJzID0gYi5zbGljZShiaSk7XG4gICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgZWxzZSBzWysraV0gPSBicztcbiAgfVxuXG4gIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLlxuICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLlxuICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF1cbiAgICAgID8gb25lKHFbMF0ueClcbiAgICAgIDogemVybyhiKSlcbiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICAgICAgfSk7XG59XG4iLCJ2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSB7XG4gIHRyYW5zbGF0ZVg6IDAsXG4gIHRyYW5zbGF0ZVk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2tld1g6IDAsXG4gIHNjYWxlWDogMSxcbiAgc2NhbGVZOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7XG4gIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDtcbiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYO1xuICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTtcbiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGVYOiBlLFxuICAgIHRyYW5zbGF0ZVk6IGYsXG4gICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcyxcbiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsXG4gICAgc2NhbGVYOiBzY2FsZVgsXG4gICAgc2NhbGVZOiBzY2FsZVlcbiAgfTtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlci5qc1wiO1xuaW1wb3J0IHtwYXJzZUNzcywgcGFyc2VTdmd9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikge1xuXG4gIGZ1bmN0aW9uIHBvcChzKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArIFwiIFwiIDogXCJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChcInRyYW5zbGF0ZShcIiwgbnVsbCwgcHhDb21tYSwgbnVsbCwgcHhQYXJlbik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7XG4gICAgICBzLnB1c2goXCJ0cmFuc2xhdGUoXCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aFxuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiArIHhiICsgXCIsXCIgKyB5YiArIFwiKVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG4gICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7XG4gICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7XG4gICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7XG4gICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7XG4gICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpO1xuICAgIGEgPSBiID0gbnVsbDsgLy8gZ2NcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlQ3NzLCBcInB4LCBcIiwgXCJweClcIiwgXCJkZWcpXCIpO1xuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCBcIiwgXCIsIFwiKVwiLCBcIilcIik7XG4iLCJpbXBvcnQgZGVjb21wb3NlLCB7aWRlbnRpdHl9IGZyb20gXCIuL2RlY29tcG9zZS5qc1wiO1xuXG52YXIgc3ZnTm9kZTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNzcyh2YWx1ZSkge1xuICBjb25zdCBtID0gbmV3ICh0eXBlb2YgRE9NTWF0cml4ID09PSBcImZ1bmN0aW9uXCIgPyBET01NYXRyaXggOiBXZWJLaXRDU1NNYXRyaXgpKHZhbHVlICsgXCJcIik7XG4gIHJldHVybiBtLmlzSWRlbnRpdHkgPyBpZGVudGl0eSA6IGRlY29tcG9zZShtLmEsIG0uYiwgbS5jLCBtLmQsIG0uZSwgbS5mKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3ZnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHk7XG4gIGlmICghc3ZnTm9kZSkgc3ZnTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgdmFsdWUpO1xuICBpZiAoISh2YWx1ZSA9IHN2Z05vZGUudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSkpIHJldHVybiBpZGVudGl0eTtcbiAgdmFsdWUgPSB2YWx1ZS5tYXRyaXg7XG4gIHJldHVybiBkZWNvbXBvc2UodmFsdWUuYSwgdmFsdWUuYiwgdmFsdWUuYywgdmFsdWUuZCwgdmFsdWUuZSwgdmFsdWUuZik7XG59XG4iLCJ2YXIgZXBzaWxvbjIgPSAxZS0xMjtcblxuZnVuY3Rpb24gY29zaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgKyAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiBzaW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7XG59XG5cbmZ1bmN0aW9uIHRhbmgoeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoMiAqIHgpKSAtIDEpIC8gKHggKyAxKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHpvb21SaG8ocmhvLCByaG8yLCByaG80KSB7XG5cbiAgLy8gcDAgPSBbdXgwLCB1eTAsIHcwXVxuICAvLyBwMSA9IFt1eDEsIHV5MSwgdzFdXG4gIGZ1bmN0aW9uIHpvb20ocDAsIHAxKSB7XG4gICAgdmFyIHV4MCA9IHAwWzBdLCB1eTAgPSBwMFsxXSwgdzAgPSBwMFsyXSxcbiAgICAgICAgdXgxID0gcDFbMF0sIHV5MSA9IHAxWzFdLCB3MSA9IHAxWzJdLFxuICAgICAgICBkeCA9IHV4MSAtIHV4MCxcbiAgICAgICAgZHkgPSB1eTEgLSB1eTAsXG4gICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHksXG4gICAgICAgIGksXG4gICAgICAgIFM7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHUwIOKJhSB1MS5cbiAgICBpZiAoZDIgPCBlcHNpbG9uMikge1xuICAgICAgUyA9IE1hdGgubG9nKHcxIC8gdzApIC8gcmhvO1xuICAgICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB1eDAgKyB0ICogZHgsXG4gICAgICAgICAgdXkwICsgdCAqIGR5LFxuICAgICAgICAgIHcwICogTWF0aC5leHAocmhvICogdCAqIFMpXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhbCBjYXNlLlxuICAgIGVsc2Uge1xuICAgICAgdmFyIGQxID0gTWF0aC5zcXJ0KGQyKSxcbiAgICAgICAgICBiMCA9ICh3MSAqIHcxIC0gdzAgKiB3MCArIHJobzQgKiBkMikgLyAoMiAqIHcwICogcmhvMiAqIGQxKSxcbiAgICAgICAgICBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSxcbiAgICAgICAgICByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCksXG4gICAgICAgICAgcjEgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjEgKiBiMSArIDEpIC0gYjEpO1xuICAgICAgUyA9IChyMSAtIHIwKSAvIHJobztcbiAgICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHZhciBzID0gdCAqIFMsXG4gICAgICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSxcbiAgICAgICAgICAgIHUgPSB3MCAvIChyaG8yICogZDEpICogKGNvc2hyMCAqIHRhbmgocmhvICogcyArIHIwKSAtIHNpbmgocjApKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB1eDAgKyB1ICogZHgsXG4gICAgICAgICAgdXkwICsgdSAqIGR5LFxuICAgICAgICAgIHcwICogY29zaHIwIC8gY29zaChyaG8gKiBzICsgcjApXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaS5kdXJhdGlvbiA9IFMgKiAxMDAwICogcmhvIC8gTWF0aC5TUVJUMjtcblxuICAgIHJldHVybiBpO1xuICB9XG5cbiAgem9vbS5yaG8gPSBmdW5jdGlvbihfKSB7XG4gICAgdmFyIF8xID0gTWF0aC5tYXgoMWUtMywgK18pLCBfMiA9IF8xICogXzEsIF80ID0gXzIgKiBfMjtcbiAgICByZXR1cm4gem9vbVJobyhfMSwgXzIsIF80KTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn0pKE1hdGguU1FSVDIsIDIsIDQpO1xuIiwiZXhwb3J0IGRlZmF1bHQgTWF0aC5yYW5kb207XG4iLCJpbXBvcnQgZGVmYXVsdFNvdXJjZSBmcm9tIFwiLi9kZWZhdWx0U291cmNlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBzb3VyY2VSYW5kb21Ob3JtYWwoc291cmNlKSB7XG4gIGZ1bmN0aW9uIHJhbmRvbU5vcm1hbChtdSwgc2lnbWEpIHtcbiAgICB2YXIgeCwgcjtcbiAgICBtdSA9IG11ID09IG51bGwgPyAwIDogK211O1xuICAgIHNpZ21hID0gc2lnbWEgPT0gbnVsbCA/IDEgOiArc2lnbWE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHk7XG5cbiAgICAgIC8vIElmIGF2YWlsYWJsZSwgdXNlIHRoZSBzZWNvbmQgcHJldmlvdXNseS1nZW5lcmF0ZWQgdW5pZm9ybSByYW5kb20uXG4gICAgICBpZiAoeCAhPSBudWxsKSB5ID0geCwgeCA9IG51bGw7XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgZ2VuZXJhdGUgYSBuZXcgeCBhbmQgeS5cbiAgICAgIGVsc2UgZG8ge1xuICAgICAgICB4ID0gc291cmNlKCkgKiAyIC0gMTtcbiAgICAgICAgeSA9IHNvdXJjZSgpICogMiAtIDE7XG4gICAgICAgIHIgPSB4ICogeCArIHkgKiB5O1xuICAgICAgfSB3aGlsZSAoIXIgfHwgciA+IDEpO1xuXG4gICAgICByZXR1cm4gbXUgKyBzaWdtYSAqIHkgKiBNYXRoLnNxcnQoLTIgKiBNYXRoLmxvZyhyKSAvIHIpO1xuICAgIH07XG4gIH1cblxuICByYW5kb21Ob3JtYWwuc291cmNlID0gc291cmNlUmFuZG9tTm9ybWFsO1xuXG4gIHJldHVybiByYW5kb21Ob3JtYWw7XG59KShkZWZhdWx0U291cmNlKTtcbiIsImV4cG9ydCBmdW5jdGlvbiBpbml0UmFuZ2UoZG9tYWluLCByYW5nZSkge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IGJyZWFrO1xuICAgIGNhc2UgMTogdGhpcy5yYW5nZShkb21haW4pOyBicmVhaztcbiAgICBkZWZhdWx0OiB0aGlzLnJhbmdlKHJhbmdlKS5kb21haW4oZG9tYWluKTsgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0SW50ZXJwb2xhdG9yKGRvbWFpbiwgaW50ZXJwb2xhdG9yKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogYnJlYWs7XG4gICAgY2FzZSAxOiB7XG4gICAgICBpZiAodHlwZW9mIGRvbWFpbiA9PT0gXCJmdW5jdGlvblwiKSB0aGlzLmludGVycG9sYXRvcihkb21haW4pO1xuICAgICAgZWxzZSB0aGlzLnJhbmdlKGRvbWFpbik7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhpcy5kb21haW4oZG9tYWluKTtcbiAgICAgIGlmICh0eXBlb2YgaW50ZXJwb2xhdG9yID09PSBcImZ1bmN0aW9uXCIpIHRoaXMuaW50ZXJwb2xhdG9yKGludGVycG9sYXRvcik7XG4gICAgICBlbHNlIHRoaXMucmFuZ2UoaW50ZXJwb2xhdG9yKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsImltcG9ydCB7YXNjZW5kaW5nLCBiaXNlY3QsIHF1YW50aWxlU29ydGVkIGFzIHRocmVzaG9sZH0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge2luaXRSYW5nZX0gZnJvbSBcIi4vaW5pdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFudGlsZSgpIHtcbiAgdmFyIGRvbWFpbiA9IFtdLFxuICAgICAgcmFuZ2UgPSBbXSxcbiAgICAgIHRocmVzaG9sZHMgPSBbXSxcbiAgICAgIHVua25vd247XG5cbiAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcbiAgICB2YXIgaSA9IDAsIG4gPSBNYXRoLm1heCgxLCByYW5nZS5sZW5ndGgpO1xuICAgIHRocmVzaG9sZHMgPSBuZXcgQXJyYXkobiAtIDEpO1xuICAgIHdoaWxlICgrK2kgPCBuKSB0aHJlc2hvbGRzW2kgLSAxXSA9IHRocmVzaG9sZChkb21haW4sIGkgLyBuKTtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgcmV0dXJuIHggPT0gbnVsbCB8fCBpc05hTih4ID0gK3gpID8gdW5rbm93biA6IHJhbmdlW2Jpc2VjdCh0aHJlc2hvbGRzLCB4KV07XG4gIH1cblxuICBzY2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7XG4gICAgdmFyIGkgPSByYW5nZS5pbmRleE9mKHkpO1xuICAgIHJldHVybiBpIDwgMCA/IFtOYU4sIE5hTl0gOiBbXG4gICAgICBpID4gMCA/IHRocmVzaG9sZHNbaSAtIDFdIDogZG9tYWluWzBdLFxuICAgICAgaSA8IHRocmVzaG9sZHMubGVuZ3RoID8gdGhyZXNob2xkc1tpXSA6IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV1cbiAgICBdO1xuICB9O1xuXG4gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW4uc2xpY2UoKTtcbiAgICBkb21haW4gPSBbXTtcbiAgICBmb3IgKGxldCBkIG9mIF8pIGlmIChkICE9IG51bGwgJiYgIWlzTmFOKGQgPSArZCkpIGRvbWFpbi5wdXNoKGQpO1xuICAgIGRvbWFpbi5zb3J0KGFzY2VuZGluZyk7XG4gICAgcmV0dXJuIHJlc2NhbGUoKTtcbiAgfTtcblxuICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IEFycmF5LmZyb20oXyksIHJlc2NhbGUoKSkgOiByYW5nZS5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247XG4gIH07XG5cbiAgc2NhbGUucXVhbnRpbGVzID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRocmVzaG9sZHMuc2xpY2UoKTtcbiAgfTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHF1YW50aWxlKClcbiAgICAgICAgLmRvbWFpbihkb21haW4pXG4gICAgICAgIC5yYW5nZShyYW5nZSlcbiAgICAgICAgLnVua25vd24odW5rbm93bik7XG4gIH07XG5cbiAgcmV0dXJuIGluaXRSYW5nZS5hcHBseShzY2FsZSwgYXJndW1lbnRzKTtcbn1cbiIsIi8vIEdpdmVuIHNvbWV0aGluZyBhcnJheSBsaWtlIChvciBudWxsKSwgcmV0dXJucyBzb21ldGhpbmcgdGhhdCBpcyBzdHJpY3RseSBhblxuLy8gYXJyYXkuIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBhcnJheS1saWtlIG9iamVjdHMgcGFzc2VkIHRvIGQzLnNlbGVjdEFsbFxuLy8gb3Igc2VsZWN0aW9uLnNlbGVjdEFsbCBhcmUgY29udmVydGVkIGludG8gcHJvcGVyIGFycmF5cyB3aGVuIGNyZWF0aW5nIGFcbi8vIHNlbGVjdGlvbjsgd2UgZG9u4oCZdCBldmVyIHdhbnQgdG8gY3JlYXRlIGEgc2VsZWN0aW9uIGJhY2tlZCBieSBhIGxpdmVcbi8vIEhUTUxDb2xsZWN0aW9uIG9yIE5vZGVMaXN0LiBIb3dldmVyLCBub3RlIHRoYXQgc2VsZWN0aW9uLnNlbGVjdEFsbCB3aWxsIHVzZSBhXG4vLyBzdGF0aWMgTm9kZUxpc3QgYXMgYSBncm91cCwgc2luY2UgaXQgc2FmZWx5IGRlcml2ZWQgZnJvbSBxdWVyeVNlbGVjdG9yQWxsLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXJyYXkoeCkge1xuICByZXR1cm4geCA9PSBudWxsID8gW10gOiBBcnJheS5pc0FycmF5KHgpID8geCA6IEFycmF5LmZyb20oeCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4vbmFtZXNwYWNlLmpzXCI7XG5pbXBvcnQge3hodG1sfSBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCxcbiAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7XG4gICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWxcbiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpXG4gICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiAoZnVsbG5hbWUubG9jYWxcbiAgICAgID8gY3JlYXRvckZpeGVkXG4gICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZE1hdGNoZXIoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuIiwiaW1wb3J0IG5hbWVzcGFjZXMgZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBwcmVmaXggPSBuYW1lICs9IFwiXCIsIGkgPSBwcmVmaXguaW5kZXhPZihcIjpcIik7XG4gIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwgaSkpICE9PSBcInhtbG5zXCIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTtcbiAgcmV0dXJuIG5hbWVzcGFjZXMuaGFzT3duUHJvcGVydHkocHJlZml4KSA/IHtzcGFjZTogbmFtZXNwYWNlc1twcmVmaXhdLCBsb2NhbDogbmFtZX0gOiBuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xufVxuIiwiZXhwb3J0IHZhciB4aHRtbCA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHN2ZzogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB4aHRtbDogeGh0bWwsXG4gIHhsaW5rOiBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcbiAgeG1sOiBcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLFxuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zL1wiXG59O1xuIiwiaW1wb3J0IHNvdXJjZUV2ZW50IGZyb20gXCIuL3NvdXJjZUV2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50LCBub2RlKSB7XG4gIGV2ZW50ID0gc291cmNlRXZlbnQoZXZlbnQpO1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSBub2RlID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgaWYgKG5vZGUpIHtcbiAgICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1lbnQgfHwgbm9kZTtcbiAgICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7XG4gICAgICB2YXIgcG9pbnQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTtcbiAgICAgIHBvaW50LnggPSBldmVudC5jbGllbnRYLCBwb2ludC55ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcbiAgICAgIHJldHVybiBbcG9pbnQueCwgcG9pbnQueV07XG4gICAgfVxuICAgIGlmIChub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIFtldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gbm9kZS5jbGllbnRMZWZ0LCBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBub2RlLmNsaWVudFRvcF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9uLCByb290fSBmcm9tIFwiLi9zZWxlY3Rpb24vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcildXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pXG4gICAgICA6IG5ldyBTZWxlY3Rpb24oW1tzZWxlY3Rvcl1dLCByb290KTtcbn1cbiIsImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogY3JlYXRvcihuYW1lKTtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuLi9uYW1lc3BhY2UuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgcmV0dXJuIGZ1bGxuYW1lLmxvY2FsXG4gICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpXG4gICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUoZnVsbG5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbilcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKSkoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzWzBdO1xuICBhcmd1bWVudHNbMF0gPSB0aGlzO1xuICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImZ1bmN0aW9uIGNsYXNzQXJyYXkoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcudHJpbSgpLnNwbGl0KC9efFxccysvKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NMaXN0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0IHx8IG5ldyBDbGFzc0xpc3Qobm9kZSk7XG59XG5cbmZ1bmN0aW9uIENsYXNzTGlzdChub2RlKSB7XG4gIHRoaXMuX25vZGUgPSBub2RlO1xuICB0aGlzLl9uYW1lcyA9IGNsYXNzQXJyYXkobm9kZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSB8fCBcIlwiKTtcbn1cblxuQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHtcbiAgYWRkOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpIDwgMCkge1xuICAgICAgdGhpcy5fbmFtZXMucHVzaChuYW1lKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgY29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LmFkZChuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QucmVtb3ZlKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRBZGQodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRmFsc2UobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRSZW1vdmUodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArIFwiXCIpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0KHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBjbGFzc2VkRnVuY3Rpb24gOiB2YWx1ZVxuICAgICAgPyBjbGFzc2VkVHJ1ZVxuICAgICAgOiBjbGFzc2VkRmFsc2UpKG5hbWVzLCB2YWx1ZSkpO1xufVxuIiwiZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdygpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUoZmFsc2UpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVEZWVwKCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVlcCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZGVlcCA/IHNlbGVjdGlvbl9jbG9uZURlZXAgOiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHtFbnRlck5vZGV9IGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4uL2NvbnN0YW50LmpzXCI7XG5cbmZ1bmN0aW9uIGJpbmRJbmRleChwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhKSB7XG4gIHZhciBpID0gMCxcbiAgICAgIG5vZGUsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLlxuICAvLyBQdXQgYW55IG51bGwgbm9kZXMgaW50byBlbnRlci5cbiAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLlxuICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGRvbuKAmXQgZml0IGludG8gZXhpdC5cbiAgZm9yICg7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7XG4gIHZhciBpLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVCeUtleVZhbHVlID0gbmV3IE1hcCxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAga2V5VmFsdWVzID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKSxcbiAgICAgIGtleVZhbHVlO1xuXG4gIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLlxuICAvLyBJZiBtdWx0aXBsZSBub2RlcyBoYXZlIHRoZSBzYW1lIGtleSwgdGhlIGR1cGxpY2F0ZXMgYXJlIGFkZGVkIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWUgPSBrZXkuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkgKyBcIlwiO1xuICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHtcbiAgICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS5cbiAgLy8gSWYgdGhlcmUgYSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleSwgam9pbiBhbmQgYWRkIGl0IHRvIHVwZGF0ZS5cbiAgLy8gSWYgdGhlcmUgaXMgbm90IChvciB0aGUga2V5IGlzIGEgZHVwbGljYXRlKSwgYWRkIGl0IHRvIGVudGVyLlxuICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAga2V5VmFsdWUgPSBrZXkuY2FsbChwYXJlbnQsIGRhdGFbaV0sIGksIGRhdGEpICsgXCJcIjtcbiAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZSkpIHtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIG5vZGVCeUtleVZhbHVlLmRlbGV0ZShrZXlWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBhbnkgcmVtYWluaW5nIG5vZGVzIHRoYXQgd2VyZSBub3QgYm91bmQgdG8gZGF0YSB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAobm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlc1tpXSkgPT09IG5vZGUpKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0dW0obm9kZSkge1xuICByZXR1cm4gbm9kZS5fX2RhdGFfXztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBBcnJheS5mcm9tKHRoaXMsIGRhdHVtKTtcblxuICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsXG4gICAgICBwYXJlbnRzID0gdGhpcy5fcGFyZW50cyxcbiAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwcztcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHZhbHVlID0gY29uc3RhbnQodmFsdWUpO1xuXG4gIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJyYXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLFxuICAgICAgICBncm91cCA9IGdyb3Vwc1tqXSxcbiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICAgIGRhdGEgPSBhcnJheWxpa2UodmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpKSxcbiAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAgICBlbnRlckdyb3VwID0gZW50ZXJbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICBleGl0R3JvdXAgPSBleGl0W2pdID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKTtcblxuICAgIGJpbmQocGFyZW50LCBncm91cCwgZW50ZXJHcm91cCwgdXBkYXRlR3JvdXAsIGV4aXRHcm91cCwgZGF0YSwga2V5KTtcblxuICAgIC8vIE5vdyBjb25uZWN0IHRoZSBlbnRlciBub2RlcyB0byB0aGVpciBmb2xsb3dpbmcgdXBkYXRlIG5vZGUsIHN1Y2ggdGhhdFxuICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVyaWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsXG4gICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuXG4gICAgZm9yICh2YXIgaTAgPSAwLCBpMSA9IDAsIHByZXZpb3VzLCBuZXh0OyBpMCA8IGRhdGFMZW5ndGg7ICsraTApIHtcbiAgICAgIGlmIChwcmV2aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7XG4gICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7XG4gICAgICAgIHdoaWxlICghKG5leHQgPSB1cGRhdGVHcm91cFtpMV0pICYmICsraTEgPCBkYXRhTGVuZ3RoKTtcbiAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlID0gbmV3IFNlbGVjdGlvbih1cGRhdGUsIHBhcmVudHMpO1xuICB1cGRhdGUuX2VudGVyID0gZW50ZXI7XG4gIHVwZGF0ZS5fZXhpdCA9IGV4aXQ7XG4gIHJldHVybiB1cGRhdGU7XG59XG5cbi8vIEdpdmVuIHNvbWUgZGF0YSwgdGhpcyByZXR1cm5zIGFuIGFycmF5LWxpa2UgdmlldyBvZiBpdDogYW4gb2JqZWN0IHRoYXRcbi8vIGV4cG9zZXMgYSBsZW5ndGggcHJvcGVydHkgYW5kIGFsbG93cyBudW1lcmljIGluZGV4aW5nLiBOb3RlIHRoYXQgdW5saWtlXG4vLyBzZWxlY3RBbGwsIHRoaXMgaXNu4oCZdCB3b3JyaWVkIGFib3V0IOKAnGxpdmXigJ0gY29sbGVjdGlvbnMgYmVjYXVzZSB0aGUgcmVzdWx0aW5nXG4vLyBhcnJheSB3aWxsIG9ubHkgYmUgdXNlZCBicmllZmx5IHdoaWxlIGRhdGEgaXMgYmVpbmcgYm91bmQuIChJdCBpcyBwb3NzaWJsZSB0b1xuLy8gY2F1c2UgdGhlIGRhdGEgdG8gY2hhbmdlIHdoaWxlIGl0ZXJhdGluZyBieSB1c2luZyBhIGtleSBmdW5jdGlvbiwgYnV0IHBsZWFzZVxuLy8gZG9u4oCZdDsgd2XigJlkIHJhdGhlciBhdm9pZCBhIGdyYXR1aXRvdXMgY29weS4pXG5mdW5jdGlvbiBhcnJheWxpa2UoZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgXCJsZW5ndGhcIiBpbiBkYXRhXG4gICAgPyBkYXRhIC8vIEFycmF5LCBUeXBlZEFycmF5LCBOb2RlTGlzdCwgYXJyYXktbGlrZVxuICAgIDogQXJyYXkuZnJvbShkYXRhKTsgLy8gTWFwLCBTZXQsIGl0ZXJhYmxlLCBzdHJpbmcsIG9yIGFueXRoaW5nIGVsc2Vcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMucHJvcGVydHkoXCJfX2RhdGFfX1wiLCB2YWx1ZSlcbiAgICAgIDogdGhpcy5ub2RlKCkuX19kYXRhX187XG59XG4iLCJpbXBvcnQgZGVmYXVsdFZpZXcgZnJvbSBcIi4uL3dpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KG5vZGUsIHR5cGUsIHBhcmFtcykge1xuICB2YXIgd2luZG93ID0gZGVmYXVsdFZpZXcobm9kZSksXG4gICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDtcblxuICBpZiAodHlwZW9mIGV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBldmVudCA9IG5ldyBldmVudCh0eXBlLCBwYXJhbXMpO1xuICB9IGVsc2Uge1xuICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgaWYgKHBhcmFtcykgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSksIGV2ZW50LmRldGFpbCA9IHBhcmFtcy5kZXRhaWw7XG4gICAgZWxzZSBldmVudC5pbml0RXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoQ29uc3RhbnQodHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHBhcmFtcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGRpc3BhdGNoRnVuY3Rpb25cbiAgICAgIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMubm9kZSgpO1xufVxuIiwiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZW50ZXIgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEVudGVyTm9kZShwYXJlbnQsIGRhdHVtKSB7XG4gIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50O1xuICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7XG4gIHRoaXMuX25leHQgPSBudWxsO1xuICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuX19kYXRhX18gPSBkYXR1bTtcbn1cblxuRW50ZXJOb2RlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEVudGVyTm9kZSxcbiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSxcbiAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihjaGlsZCwgbmV4dCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7IH0sXG4gIHF1ZXJ5U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH0sXG4gIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH1cbn07XG4iLCJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBtYXRjaGVyIGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHtcbiAgdGhpcy5pbm5lckhUTUwgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiBodG1sQ29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBodG1sUmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBodG1sRnVuY3Rpb25cbiAgICAgICAgICA6IGh0bWxDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7XG59XG4iLCJpbXBvcnQgc2VsZWN0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCBmcm9tIFwiLi9zZWxlY3RDaGlsZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbiBmcm9tIFwiLi9zZWxlY3RDaGlsZHJlbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdGEgZnJvbSBcIi4vZGF0YS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbnRlciBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9leGl0IGZyb20gXCIuL2V4aXQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fam9pbiBmcm9tIFwiLi9qb2luLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29yZGVyIGZyb20gXCIuL29yZGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NvcnQgZnJvbSBcIi4vc29ydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jYWxsIGZyb20gXCIuL2NhbGwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZXMgZnJvbSBcIi4vbm9kZXMuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZSBmcm9tIFwiLi9ub2RlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NpemUgZnJvbSBcIi4vc2l6ZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbXB0eSBmcm9tIFwiLi9lbXB0eS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lYWNoIGZyb20gXCIuL2VhY2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3Byb3BlcnR5IGZyb20gXCIuL3Byb3BlcnR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NsYXNzZWQgZnJvbSBcIi4vY2xhc3NlZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faHRtbCBmcm9tIFwiLi9odG1sLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JhaXNlIGZyb20gXCIuL3JhaXNlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2xvd2VyIGZyb20gXCIuL2xvd2VyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2FwcGVuZCBmcm9tIFwiLi9hcHBlbmQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faW5zZXJ0IGZyb20gXCIuL2luc2VydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9yZW1vdmUgZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Nsb25lIGZyb20gXCIuL2Nsb25lLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdHVtIGZyb20gXCIuL2RhdHVtLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29uIGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Rpc3BhdGNoIGZyb20gXCIuL2Rpc3BhdGNoLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2l0ZXJhdG9yIGZyb20gXCIuL2l0ZXJhdG9yLmpzXCI7XG5cbmV4cG9ydCB2YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdGlvbihncm91cHMsIHBhcmVudHMpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCByb290KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdGlvbigpIHtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblNlbGVjdGlvbi5wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogU2VsZWN0aW9uLFxuICBzZWxlY3Q6IHNlbGVjdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCxcbiAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLFxuICBkYXRhOiBzZWxlY3Rpb25fZGF0YSxcbiAgZW50ZXI6IHNlbGVjdGlvbl9lbnRlcixcbiAgZXhpdDogc2VsZWN0aW9uX2V4aXQsXG4gIGpvaW46IHNlbGVjdGlvbl9qb2luLFxuICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHNlbGVjdGlvbl9zZWxlY3Rpb24sXG4gIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIsXG4gIHNvcnQ6IHNlbGVjdGlvbl9zb3J0LFxuICBjYWxsOiBzZWxlY3Rpb25fY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX25vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fZWFjaCxcbiAgYXR0cjogc2VsZWN0aW9uX2F0dHIsXG4gIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUsXG4gIHByb3BlcnR5OiBzZWxlY3Rpb25fcHJvcGVydHksXG4gIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLFxuICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCxcbiAgaHRtbDogc2VsZWN0aW9uX2h0bWwsXG4gIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsXG4gIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsXG4gIGFwcGVuZDogc2VsZWN0aW9uX2FwcGVuZCxcbiAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LFxuICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUsXG4gIGNsb25lOiBzZWxlY3Rpb25fY2xvbmUsXG4gIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sXG4gIG9uOiBzZWxlY3Rpb25fb24sXG4gIGRpc3BhdGNoOiBzZWxlY3Rpb25fZGlzcGF0Y2gsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25faXRlcmF0b3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNlbGVjdGlvbjtcbiIsImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmZ1bmN0aW9uIGNvbnN0YW50TnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGJlZm9yZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpLFxuICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSBcImZ1bmN0aW9uXCIgPyBiZWZvcmUgOiBzZWxlY3RvcihiZWZvcmUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiooKSB7XG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB5aWVsZCBub2RlO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob25lbnRlciwgb251cGRhdGUsIG9uZXhpdCkge1xuICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksIHVwZGF0ZSA9IHRoaXMsIGV4aXQgPSB0aGlzLmV4aXQoKTtcbiAgaWYgKHR5cGVvZiBvbmVudGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBlbnRlciA9IG9uZW50ZXIoZW50ZXIpO1xuICAgIGlmIChlbnRlcikgZW50ZXIgPSBlbnRlci5zZWxlY3Rpb24oKTtcbiAgfSBlbHNlIHtcbiAgICBlbnRlciA9IGVudGVyLmFwcGVuZChvbmVudGVyICsgXCJcIik7XG4gIH1cbiAgaWYgKG9udXBkYXRlICE9IG51bGwpIHtcbiAgICB1cGRhdGUgPSBvbnVwZGF0ZSh1cGRhdGUpO1xuICAgIGlmICh1cGRhdGUpIHVwZGF0ZSA9IHVwZGF0ZS5zZWxlY3Rpb24oKTtcbiAgfVxuICBpZiAob25leGl0ID09IG51bGwpIGV4aXQucmVtb3ZlKCk7IGVsc2Ugb25leGl0KGV4aXQpO1xuICByZXR1cm4gZW50ZXIgJiYgdXBkYXRlID8gZW50ZXIubWVyZ2UodXBkYXRlKS5vcmRlcigpIDogdXBkYXRlO1xufVxuIiwiZnVuY3Rpb24gbG93ZXIoKSB7XG4gIGlmICh0aGlzLnByZXZpb3VzU2libGluZykgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLCB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKGxvd2VyKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHZhciBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0O1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSBzZWxlY3Rpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldO1xuICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMpO1xufVxuIiwiZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIHJldHVybiBmdW5jdGlvbihldmVudCkge1xuICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQsIHRoaXMuX19kYXRhX18pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uID0gdGhpcy5fX29uO1xuICAgIGlmICghb24pIHJldHVybjtcbiAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uWysraV0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO1xuICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyKHZhbHVlKTtcbiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAoKG8gPSBvbltqXSkudHlwZSA9PT0gdHlwZW5hbWUudHlwZSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLm9wdGlvbnMgPSBvcHRpb25zKTtcbiAgICAgICAgby52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlbmFtZS50eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5lciwgb3B0aW9uczogb3B0aW9uc307XG4gICAgaWYgKCFvbikgdGhpcy5fX29uID0gW29dO1xuICAgIGVsc2Ugb24ucHVzaChvKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIpLCBpLCBuID0gdHlwZW5hbWVzLmxlbmd0aCwgdDtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAoaSA9IDAsIG8gPSBvbltqXTsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkge1xuICAgICAgICAgIHJldHVybiBvLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIG9uID0gdmFsdWUgPyBvbkFkZCA6IG9uUmVtb3ZlO1xuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgb3B0aW9ucykpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7KSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGlmIChuZXh0ICYmIG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dCkgXiA0KSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpO1xuICAgICAgICBuZXh0ID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImZ1bmN0aW9uIHByb3BlcnR5UmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzW25hbWVdID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICBlbHNlIHRoaXNbbmFtZV0gPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBwcm9wZXJ0eUZ1bmN0aW9uXG4gICAgICAgICAgOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpW25hbWVdO1xufVxuIiwiZnVuY3Rpb24gcmFpc2UoKSB7XG4gIGlmICh0aGlzLm5leHRTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlKTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgYXJyYXkgZnJvbSBcIi4uL2FycmF5LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3JBbGwgZnJvbSBcIi4uL3NlbGVjdG9yQWxsLmpzXCI7XG5cbmZ1bmN0aW9uIGFycmF5QWxsKHNlbGVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGFycmF5KHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ID09PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IGFycmF5QWxsKHNlbGVjdCk7XG4gIGVsc2Ugc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzdWJncm91cHMucHVzaChzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCBwYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmluZCA9IEFycmF5LnByb3RvdHlwZS5maW5kO1xuXG5mdW5jdGlvbiBjaGlsZEZpbmQobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaW5kLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjaGlsZEZpcnN0KCkge1xuICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KG1hdGNoID09IG51bGwgPyBjaGlsZEZpcnN0XG4gICAgICA6IGNoaWxkRmluZCh0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaWx0ZXIgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyO1xuXG5mdW5jdGlvbiBjaGlsZHJlbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbik7XG59XG5cbmZ1bmN0aW9uIGNoaWxkcmVuRmlsdGVyKG1hdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3RBbGwobWF0Y2ggPT0gbnVsbCA/IGNoaWxkcmVuXG4gICAgICA6IGNoaWxkcmVuRmlsdGVyKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykgKytzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiBzaXplO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbXBhcmUpIHtcbiAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nO1xuXG4gIGZ1bmN0aW9uIGNvbXBhcmVOb2RlKGEsIGIpIHtcbiAgICByZXR1cm4gYSAmJiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7XG4gIH1cblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzb3J0Z3JvdXAgPSBzb3J0Z3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzb3J0Z3JvdXBzLCB0aGlzLl9wYXJlbnRzKS5vcmRlcigpO1xufVxuXG5mdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih1cGRhdGUpIHtcbiAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTtcbn1cbiIsImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHN0eWxlRnVuY3Rpb25cbiAgICAgICAgICAgIDogc3R5bGVDb25zdGFudCkobmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKVxuICAgICAgOiBzdHlsZVZhbHVlKHRoaXMubm9kZSgpLCBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0eWxlVmFsdWUobm9kZSwgbmFtZSkge1xuICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpXG4gICAgICB8fCBkZWZhdWx0Vmlldyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkge1xuICB0aGlzLnRleHRDb250ZW50ID0gXCJcIjtcbn1cblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHRleHRSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRleHRGdW5jdGlvblxuICAgICAgICAgIDogdGV4dENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50O1xufVxuIiwiZnVuY3Rpb24gbm9uZSgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiZnVuY3Rpb24gZW1wdHkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBlbXB0eSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgbGV0IHNvdXJjZUV2ZW50O1xuICB3aGlsZSAoc291cmNlRXZlbnQgPSBldmVudC5zb3VyY2VFdmVudCkgZXZlbnQgPSBzb3VyY2VFdmVudDtcbiAgcmV0dXJuIGV2ZW50O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSkge1xuICByZXR1cm4gKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIC8vIG5vZGUgaXMgYSBOb2RlXG4gICAgICB8fCAobm9kZS5kb2N1bWVudCAmJiBub2RlKSAvLyBub2RlIGlzIGEgV2luZG93XG4gICAgICB8fCBub2RlLmRlZmF1bHRWaWV3OyAvLyBub2RlIGlzIGEgRG9jdW1lbnRcbn1cbiIsImltcG9ydCB7VGltZXJ9IGZyb20gXCIuL3RpbWVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgZGVsYXkgPSBkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheTtcbiAgdC5yZXN0YXJ0KGVsYXBzZWQgPT4ge1xuICAgIHQuc3RvcCgpO1xuICAgIGNhbGxiYWNrKGVsYXBzZWQgKyBkZWxheSk7XG4gIH0sIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG4iLCJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7XG4gICAgdCA9IHQuX25leHQ7XG4gIH1cbiAgLS1mcmFtZTtcbn1cblxuZnVuY3Rpb24gd2FrZSgpIHtcbiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3O1xuICBmcmFtZSA9IHRpbWVvdXQgPSAwO1xuICB0cnkge1xuICAgIHRpbWVyRmx1c2goKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcmFtZSA9IDA7XG4gICAgbmFwKCk7XG4gICAgY2xvY2tOb3cgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBva2UoKSB7XG4gIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7XG4gIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7XG59XG5cbmZ1bmN0aW9uIG5hcCgpIHtcbiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5O1xuICB3aGlsZSAodDEpIHtcbiAgICBpZiAodDEuX2NhbGwpIHtcbiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTtcbiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDtcbiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjtcbiAgICB9XG4gIH1cbiAgdGFza1RhaWwgPSB0MDtcbiAgc2xlZXAodGltZSk7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHtcbiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuXG4gIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LlxuICBpZiAoZGVsYXkgPiAyNCkge1xuICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAtIGNsb2NrU2tldyk7XG4gICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7XG4gICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5pbXBvcnQge1NDSEVEVUxFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG52YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSkge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICBzY2hlZHVsZSxcbiAgICAgIGk7XG5cbiAgaWYgKHNjaGVkdWxlcykge1xuICAgIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG4gICAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkuc3RhdGUgPiBTQ0hFRFVMRUQgJiYgc2NoZWR1bGUubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oW1tub2RlXV0sIHJvb3QsIG5hbWUsICtpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsImltcG9ydCBcIi4vc2VsZWN0aW9uL2luZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdHJhbnNpdGlvbn0gZnJvbSBcIi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGFjdGl2ZX0gZnJvbSBcIi4vYWN0aXZlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJydXB0fSBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbiIsImltcG9ydCB7U1RBUlRJTkcsIEVORElORywgRU5ERUR9IGZyb20gXCIuL3RyYW5zaXRpb24vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSkge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICBzY2hlZHVsZSxcbiAgICAgIGFjdGl2ZSxcbiAgICAgIGVtcHR5ID0gdHJ1ZSxcbiAgICAgIGk7XG5cbiAgaWYgKCFzY2hlZHVsZXMpIHJldHVybjtcblxuICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuXG4gIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5uYW1lICE9PSBuYW1lKSB7IGVtcHR5ID0gZmFsc2U7IGNvbnRpbnVlOyB9XG4gICAgYWN0aXZlID0gc2NoZWR1bGUuc3RhdGUgPiBTVEFSVElORyAmJiBzY2hlZHVsZS5zdGF0ZSA8IEVORElORztcbiAgICBzY2hlZHVsZS5zdGF0ZSA9IEVOREVEO1xuICAgIHNjaGVkdWxlLnRpbWVyLnN0b3AoKTtcbiAgICBzY2hlZHVsZS5vbi5jYWxsKGFjdGl2ZSA/IFwiaW50ZXJydXB0XCIgOiBcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gIH1cblxuICBpZiAoZW1wdHkpIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbn1cbiIsImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ludGVycnVwdCBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5cbnNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDtcbnNlbGVjdGlvbi5wcm90b3R5cGUudHJhbnNpdGlvbiA9IHNlbGVjdGlvbl90cmFuc2l0aW9uO1xuIiwiaW1wb3J0IGludGVycnVwdCBmcm9tIFwiLi4vaW50ZXJydXB0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4uL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHtlYXNlQ3ViaWNJbk91dH0gZnJvbSBcImQzLWVhc2VcIjtcbmltcG9ydCB7bm93fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGRlZmF1bHRUaW1pbmcgPSB7XG4gIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuXG4gIGRlbGF5OiAwLFxuICBkdXJhdGlvbjogMjUwLFxuICBlYXNlOiBlYXNlQ3ViaWNJbk91dFxufTtcblxuZnVuY3Rpb24gaW5oZXJpdChub2RlLCBpZCkge1xuICB2YXIgdGltaW5nO1xuICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkge1xuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zaXRpb24gJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aW1pbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGlkLFxuICAgICAgdGltaW5nO1xuXG4gIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikge1xuICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lO1xuICB9IGVsc2Uge1xuICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtU3ZnIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGUuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKSwgaSA9IGZ1bGxuYW1lID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHRoaXMuYXR0clR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKShmdWxsbmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcImF0dHIuXCIgKyBuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKShmdWxsbmFtZSlcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2VlbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGtleSA9IFwiYXR0ci5cIiArIG5hbWU7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkZWxheUZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVsYXlDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkZWxheUZ1bmN0aW9uXG4gICAgICAgICAgOiBkZWxheUNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kZWxheTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGR1cmF0aW9uRnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGR1cmF0aW9uQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkdXJhdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgOiBkdXJhdGlvbkNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kdXJhdGlvbjtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKGVhc2VDb25zdGFudChpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5lYXNlO1xufVxuIiwiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VWYXJ5aW5nKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh0eXBlb2YgdiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLmVhY2goZWFzZVZhcnlpbmcodGhpcy5faWQsIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBvbjAsIG9uMSwgdGhhdCA9IHRoaXMsIGlkID0gdGhhdC5faWQsIHNpemUgPSB0aGF0LnNpemUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBjYW5jZWwgPSB7dmFsdWU6IHJlamVjdH0sXG4gICAgICAgIGVuZCA9IHt2YWx1ZTogZnVuY3Rpb24oKSB7IGlmICgtLXNpemUgPT09IDApIHJlc29sdmUoKTsgfX07XG5cbiAgICB0aGF0LmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgICBpZiAob24gIT09IG9uMCkge1xuICAgICAgICBvbjEgPSAob24wID0gb24pLmNvcHkoKTtcbiAgICAgICAgb24xLl8uY2FuY2VsLnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uaW50ZXJydXB0LnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uZW5kLnB1c2goZW5kKTtcbiAgICAgIH1cblxuICAgICAgc2NoZWR1bGUub24gPSBvbjE7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgc2VsZWN0aW9uIHdhcyBlbXB0eSwgcmVzb2x2ZSBlbmQgaW1tZWRpYXRlbHlcbiAgICBpZiAoc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7bWF0Y2hlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHIgZnJvbSBcIi4vYXR0ci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0clR3ZWVuIGZyb20gXCIuL2F0dHJUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZGVsYXkgZnJvbSBcIi4vZGVsYXkuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2R1cmF0aW9uIGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlIGZyb20gXCIuL2Vhc2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nIGZyb20gXCIuL2Vhc2VWYXJ5aW5nLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9tZXJnZSBmcm9tIFwiLi9tZXJnZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdEFsbCBmcm9tIFwiLi9zZWxlY3RBbGwuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdGlvbiBmcm9tIFwiLi9zZWxlY3Rpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zdHlsZVR3ZWVuIGZyb20gXCIuL3N0eWxlVHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dFR3ZWVuIGZyb20gXCIuL3RleHRUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90d2VlbiBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZW5kIGZyb20gXCIuL2VuZC5qc1wiO1xuXG52YXIgaWQgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7XG4gIHRoaXMuX2dyb3VwcyA9IGdyb3VwcztcbiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG4gIHRoaXMuX25hbWUgPSBuYW1lO1xuICB0aGlzLl9pZCA9IGlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2l0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHNlbGVjdGlvbigpLnRyYW5zaXRpb24obmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdJZCgpIHtcbiAgcmV0dXJuICsraWQ7XG59XG5cbnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZTtcblxuVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB0cmFuc2l0aW9uLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sXG4gIHNlbGVjdDogdHJhbnNpdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwsXG4gIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3Byb3RvdHlwZS5zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiB0cmFuc2l0aW9uX2ZpbHRlcixcbiAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogdHJhbnNpdGlvbl9zZWxlY3Rpb24sXG4gIHRyYW5zaXRpb246IHRyYW5zaXRpb25fdHJhbnNpdGlvbixcbiAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fcHJvdG90eXBlLmVtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fcHJvdG90eXBlLmVhY2gsXG4gIG9uOiB0cmFuc2l0aW9uX29uLFxuICBhdHRyOiB0cmFuc2l0aW9uX2F0dHIsXG4gIGF0dHJUd2VlbjogdHJhbnNpdGlvbl9hdHRyVHdlZW4sXG4gIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLFxuICBzdHlsZVR3ZWVuOiB0cmFuc2l0aW9uX3N0eWxlVHdlZW4sXG4gIHRleHQ6IHRyYW5zaXRpb25fdGV4dCxcbiAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbixcbiAgcmVtb3ZlOiB0cmFuc2l0aW9uX3JlbW92ZSxcbiAgdHdlZW46IHRyYW5zaXRpb25fdHdlZW4sXG4gIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LFxuICBkdXJhdGlvbjogdHJhbnNpdGlvbl9kdXJhdGlvbixcbiAgZWFzZTogdHJhbnNpdGlvbl9lYXNlLFxuICBlYXNlVmFyeWluZzogdHJhbnNpdGlvbl9lYXNlVmFyeWluZyxcbiAgZW5kOiB0cmFuc2l0aW9uX2VuZCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXVxufTtcbiIsImltcG9ydCB7Y29sb3J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZU51bWJlciwgaW50ZXJwb2xhdGVSZ2IsIGludGVycG9sYXRlU3RyaW5nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYztcbiAgcmV0dXJuICh0eXBlb2YgYiA9PT0gXCJudW1iZXJcIiA/IGludGVycG9sYXRlTnVtYmVyXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IGludGVycG9sYXRlUmdiXG4gICAgICA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYilcbiAgICAgIDogaW50ZXJwb2xhdGVTdHJpbmcpKGEsIGIpO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0cmFuc2l0aW9uKSB7XG4gIGlmICh0cmFuc2l0aW9uLl9pZCAhPT0gdGhpcy5faWQpIHRocm93IG5ldyBFcnJvcjtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gdHJhbnNpdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBzdGFydChuYW1lKSB7XG4gIHJldHVybiAobmFtZSArIFwiXCIpLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykuZXZlcnkoZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICByZXR1cm4gIXQgfHwgdCA9PT0gXCJzdGFydFwiO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG9uMCwgb24xLCBzaXQgPSBzdGFydChuYW1lKSA/IGluaXQgOiBzZXQ7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzaXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wKSAob24xID0gKG9uMCA9IG9uKS5jb3B5KCkpLm9uKG5hbWUsIGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDJcbiAgICAgID8gZ2V0KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSlcbiAgICAgIDogdGhpcy5lYWNoKG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSk7XG59XG4iLCJmdW5jdGlvbiByZW1vdmVGdW5jdGlvbihpZCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMub24oXCJlbmQucmVtb3ZlXCIsIHJlbW92ZUZ1bmN0aW9uKHRoaXMuX2lkKSk7XG59XG4iLCJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7dGltZXIsIHRpbWVvdXR9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZW1wdHlPbiA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJlbmRcIiwgXCJjYW5jZWxcIiwgXCJpbnRlcnJ1cHRcIik7XG52YXIgZW1wdHlUd2VlbiA9IFtdO1xuXG5leHBvcnQgdmFyIENSRUFURUQgPSAwO1xuZXhwb3J0IHZhciBTQ0hFRFVMRUQgPSAxO1xuZXhwb3J0IHZhciBTVEFSVElORyA9IDI7XG5leHBvcnQgdmFyIFNUQVJURUQgPSAzO1xuZXhwb3J0IHZhciBSVU5OSU5HID0gNDtcbmV4cG9ydCB2YXIgRU5ESU5HID0gNTtcbmV4cG9ydCB2YXIgRU5ERUQgPSA2O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uO1xuICBpZiAoIXNjaGVkdWxlcykgbm9kZS5fX3RyYW5zaXRpb24gPSB7fTtcbiAgZWxzZSBpZiAoaWQgaW4gc2NoZWR1bGVzKSByZXR1cm47XG4gIGNyZWF0ZShub2RlLCBpZCwge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgaW5kZXg6IGluZGV4LCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suXG4gICAgZ3JvdXA6IGdyb3VwLCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suXG4gICAgb246IGVtcHR5T24sXG4gICAgdHdlZW46IGVtcHR5VHdlZW4sXG4gICAgdGltZTogdGltaW5nLnRpbWUsXG4gICAgZGVsYXk6IHRpbWluZy5kZWxheSxcbiAgICBkdXJhdGlvbjogdGltaW5nLmR1cmF0aW9uLFxuICAgIGVhc2U6IHRpbWluZy5lYXNlLFxuICAgIHRpbWVyOiBudWxsLFxuICAgIHN0YXRlOiBDUkVBVEVEXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBnZXQobm9kZSwgaWQpO1xuICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBDUkVBVEVEKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBnZXQobm9kZSwgaWQpO1xuICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBTVEFSVEVEKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBydW5uaW5nXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcihcInRyYW5zaXRpb24gbm90IGZvdW5kXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZShub2RlLCBpZCwgc2VsZikge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICB0d2VlbjtcblxuICAvLyBJbml0aWFsaXplIHRoZSBzZWxmIHRpbWVyIHdoZW4gdGhlIHRyYW5zaXRpb24gaXMgY3JlYXRlZC5cbiAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shXG4gIHNjaGVkdWxlc1tpZF0gPSBzZWxmO1xuICBzZWxmLnRpbWVyID0gdGltZXIoc2NoZWR1bGUsIDAsIHNlbGYudGltZSk7XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGUoZWxhcHNlZCkge1xuICAgIHNlbGYuc3RhdGUgPSBTQ0hFRFVMRUQ7XG4gICAgc2VsZi50aW1lci5yZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuXG4gICAgLy8gSWYgdGhlIGVsYXBzZWQgZGVsYXkgaXMgbGVzcyB0aGFuIG91ciBmaXJzdCBzbGVlcCwgc3RhcnQgaW1tZWRpYXRlbHkuXG4gICAgaWYgKHNlbGYuZGVsYXkgPD0gZWxhcHNlZCkgc3RhcnQoZWxhcHNlZCAtIHNlbGYuZGVsYXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkge1xuICAgIHZhciBpLCBqLCBuLCBvO1xuXG4gICAgLy8gSWYgdGhlIHN0YXRlIGlzIG5vdCBTQ0hFRFVMRUQsIHRoZW4gd2UgcHJldmlvdXNseSBlcnJvcmVkIG9uIHN0YXJ0LlxuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTQ0hFRFVMRUQpIHJldHVybiBzdG9wKCk7XG5cbiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgICBvID0gc2NoZWR1bGVzW2ldO1xuICAgICAgaWYgKG8ubmFtZSAhPT0gc2VsZi5uYW1lKSBjb250aW51ZTtcblxuICAgICAgLy8gV2hpbGUgdGhpcyBlbGVtZW50IGFscmVhZHkgaGFzIGEgc3RhcnRpbmcgdHJhbnNpdGlvbiBkdXJpbmcgdGhpcyBmcmFtZSxcbiAgICAgIC8vIGRlZmVyIHN0YXJ0aW5nIGFuIGludGVycnVwdGluZyB0cmFuc2l0aW9uIHVudGlsIHRoYXQgdHJhbnNpdGlvbiBoYXMgYVxuICAgICAgLy8gY2hhbmNlIHRvIHRpY2sgKGFuZCBwb3NzaWJseSBlbmQpOyBzZWUgZDMvZDMtdHJhbnNpdGlvbiM1NCFcbiAgICAgIGlmIChvLnN0YXRlID09PSBTVEFSVEVEKSByZXR1cm4gdGltZW91dChzdGFydCk7XG5cbiAgICAgIC8vIEludGVycnVwdCB0aGUgYWN0aXZlIHRyYW5zaXRpb24sIGlmIGFueS5cbiAgICAgIGlmIChvLnN0YXRlID09PSBSVU5OSU5HKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImludGVycnVwdFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FuY2VsIGFueSBwcmUtZW1wdGVkIHRyYW5zaXRpb25zLlxuICAgICAgZWxzZSBpZiAoK2kgPCBpZCkge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJjYW5jZWxcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVmZXIgdGhlIGZpcnN0IHRpY2sgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lOyBzZWUgZDMvZDMjMTU3Ni5cbiAgICAvLyBOb3RlIHRoZSB0cmFuc2l0aW9uIG1heSBiZSBjYW5jZWxlZCBhZnRlciBzdGFydCBhbmQgYmVmb3JlIHRoZSBmaXJzdCB0aWNrIVxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUgZDMvZDMtdHJhbnNpdGlvbiMxNiFcbiAgICAvLyBBc3N1bWluZyB0aGlzIGlzIHN1Y2Nlc3NmdWwsIHN1YnNlcXVlbnQgY2FsbGJhY2tzIGdvIHN0cmFpZ2h0IHRvIHRpY2suXG4gICAgdGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChzZWxmLnN0YXRlID09PSBTVEFSVEVEKSB7XG4gICAgICAgIHNlbGYuc3RhdGUgPSBSVU5OSU5HO1xuICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcbiAgICAgICAgdGljayhlbGFwc2VkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC5cbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLlxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVElORztcbiAgICBzZWxmLm9uLmNhbGwoXCJzdGFydFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU1RBUlRJTkcpIHJldHVybjsgLy8gaW50ZXJydXB0ZWRcbiAgICBzZWxmLnN0YXRlID0gU1RBUlRFRDtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLlxuICAgIHR3ZWVuID0gbmV3IEFycmF5KG4gPSBzZWxmLnR3ZWVuLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgaiA9IC0xOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkge1xuICAgICAgICB0d2VlblsrK2pdID0gbztcbiAgICAgIH1cbiAgICB9XG4gICAgdHdlZW4ubGVuZ3RoID0gaiArIDE7XG4gIH1cblxuICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHtcbiAgICB2YXIgdCA9IGVsYXBzZWQgPCBzZWxmLmR1cmF0aW9uID8gc2VsZi5lYXNlLmNhbGwobnVsbCwgZWxhcHNlZCAvIHNlbGYuZHVyYXRpb24pIDogKHNlbGYudGltZXIucmVzdGFydChzdG9wKSwgc2VsZi5zdGF0ZSA9IEVORElORywgMSksXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICB0d2VlbltpXS5jYWxsKG5vZGUsIHQpO1xuICAgIH1cblxuICAgIC8vIERpc3BhdGNoIHRoZSBlbmQgZXZlbnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgPT09IEVORElORykge1xuICAgICAgc2VsZi5vbi5jYWxsKFwiZW5kXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgICAgc3RvcCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgc2VsZi5zdGF0ZSA9IEVOREVEO1xuICAgIHNlbGYudGltZXIuc3RvcCgpO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdO1xuICAgIGZvciAodmFyIGkgaW4gc2NoZWR1bGVzKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7c2VsZWN0b3J9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBpZCwgaSwgc3ViZ3JvdXAsIGdldChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0b3JBbGx9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSwgY2hpbGQsIGluaGVyaXQgPSBnZXQobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykge1xuICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7XG4gICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxudmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9ncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3N0eWxlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZU51bGwobmFtZSwgaW50ZXJwb2xhdGUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICBzdHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgc3RyaW5nMTAgPSBzdHJpbmcxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSxcbiAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSBzdHJpbmcxID0gdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlTWF5YmVSZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIG9uMCwgb24xLCBsaXN0ZW5lcjAsIGtleSA9IFwic3R5bGUuXCIgKyBuYW1lLCBldmVudCA9IFwiZW5kLlwiICsga2V5LCByZW1vdmU7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uLFxuICAgICAgICBsaXN0ZW5lciA9IHNjaGVkdWxlLnZhbHVlW2tleV0gPT0gbnVsbCA/IHJlbW92ZSB8fCAocmVtb3ZlID0gc3R5bGVSZW1vdmUobmFtZSkpIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wIHx8IGxpc3RlbmVyMCAhPT0gbGlzdGVuZXIpIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24oZXZlbnQsIGxpc3RlbmVyMCA9IGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGkgPSAobmFtZSArPSBcIlwiKSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVOdWxsKG5hbWUsIGkpKVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgc3R5bGVSZW1vdmUobmFtZSkpXG4gICAgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlRnVuY3Rpb24obmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcInN0eWxlLlwiICsgbmFtZSwgdmFsdWUpKSlcbiAgICAgIC5lYWNoKHN0eWxlTWF5YmVSZW1vdmUodGhpcy5faWQsIG5hbWUpKVxuICAgIDogdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVDb25zdGFudChuYW1lLCBpLCB2YWx1ZSksIHByaW9yaXR5KVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgbnVsbCk7XG59XG4iLCJmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIHQsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0ID0gKGkwID0gaSkgJiYgc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSk7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBrZXkgPSBcInN0eWxlLlwiICsgKG5hbWUgKz0gXCJcIik7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSk7XG59XG4iLCJpbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWUxID09IG51bGwgPyBcIlwiIDogdmFsdWUxO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdGhpcy50d2VlbihcInRleHRcIiwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gdGV4dEZ1bmN0aW9uKHR3ZWVuVmFsdWUodGhpcywgXCJ0ZXh0XCIsIHZhbHVlKSlcbiAgICAgIDogdGV4dENvbnN0YW50KHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiKSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUoaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRUd2Vlbih2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZShpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGtleSA9IFwidGV4dFwiO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgdGV4dFR3ZWVuKHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQwID0gdGhpcy5faWQsXG4gICAgICBpZDEgPSBuZXdJZCgpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHZhciBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkMCk7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHtcbiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBkZWxheTogMCxcbiAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHR3ZWVuUmVtb3ZlKGlkLCBuYW1lKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSB0d2VlbjAgPSB0d2VlbjtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjEgPSB0d2VlbjEuc2xpY2UoKTtcbiAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHR3ZWVuRnVuY3Rpb24oaWQsIG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpO1xuICAgICAgZm9yICh2YXIgdCA9IHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9LCBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xW2ldID0gdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPT09IG4pIHR3ZWVuMS5wdXNoKHQpO1xuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICBuYW1lICs9IFwiXCI7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIHR3ZWVuID0gZ2V0KHRoaXMubm9kZSgpLCBpZCkudHdlZW47XG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2Vlbi5sZW5ndGgsIHQ7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgodCA9IHR3ZWVuW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiB0LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHdlZW5WYWx1ZSh0cmFuc2l0aW9uLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0cmFuc2l0aW9uLl9pZDtcblxuICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKTtcbiAgICAoc2NoZWR1bGUudmFsdWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIGdldChub2RlLCBpZCkudmFsdWVbbmFtZV07XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBab29tRXZlbnQodHlwZSwge1xuICBzb3VyY2VFdmVudCxcbiAgdGFyZ2V0LFxuICB0cmFuc2Zvcm0sXG4gIGRpc3BhdGNoXG59KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICB0eXBlOiB7dmFsdWU6IHR5cGUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgc291cmNlRXZlbnQ6IHt2YWx1ZTogc291cmNlRXZlbnQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgdGFyZ2V0OiB7dmFsdWU6IHRhcmdldCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0cmFuc2Zvcm06IHt2YWx1ZTogdHJhbnNmb3JtLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIF86IHt2YWx1ZTogZGlzcGF0Y2h9XG4gIH0pO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIHpvb219IGZyb20gXCIuL3pvb20uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB6b29tVHJhbnNmb3JtLCBpZGVudGl0eSBhcyB6b29tSWRlbnRpdHksIFRyYW5zZm9ybSBhcyBab29tVHJhbnNmb3JtfSBmcm9tIFwiLi90cmFuc2Zvcm0uanNcIjtcbiIsImV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkge1xuICB0aGlzLmsgPSBrO1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLFxuICBzY2FsZTogZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBrID09PSAxID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rICogaywgdGhpcy54LCB0aGlzLnkpO1xuICB9LFxuICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICByZXR1cm4gW3BvaW50WzBdICogdGhpcy5rICsgdGhpcy54LCBwb2ludFsxXSAqIHRoaXMuayArIHRoaXMueV07XG4gIH0sXG4gIGFwcGx5WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54O1xuICB9LFxuICBhcHBseVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbihsb2NhdGlvbikge1xuICAgIHJldHVybiBbKGxvY2F0aW9uWzBdIC0gdGhpcy54KSAvIHRoaXMuaywgKGxvY2F0aW9uWzFdIC0gdGhpcy55KSAvIHRoaXMua107XG4gIH0sXG4gIGludmVydFg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rO1xuICB9LFxuICBpbnZlcnRZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuaztcbiAgfSxcbiAgcmVzY2FsZVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geC5jb3B5KCkuZG9tYWluKHgucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLCB0aGlzKS5tYXAoeC5pbnZlcnQsIHgpKTtcbiAgfSxcbiAgcmVzY2FsZVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHRoaXMueCArIFwiLFwiICsgdGhpcy55ICsgXCIpIHNjYWxlKFwiICsgdGhpcy5rICsgXCIpXCI7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSBuZXcgVHJhbnNmb3JtKDEsIDAsIDApO1xuXG50cmFuc2Zvcm0ucHJvdG90eXBlID0gVHJhbnNmb3JtLnByb3RvdHlwZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUpIHtcbiAgd2hpbGUgKCFub2RlLl9fem9vbSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIG5vZGUuX196b29tO1xufVxuIiwiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge2RyYWdEaXNhYmxlLCBkcmFnRW5hYmxlfSBmcm9tIFwiZDMtZHJhZ1wiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZVpvb219IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtzZWxlY3QsIHBvaW50ZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7aW50ZXJydXB0fSBmcm9tIFwiZDMtdHJhbnNpdGlvblwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgWm9vbUV2ZW50IGZyb20gXCIuL2V2ZW50LmpzXCI7XG5pbXBvcnQge1RyYW5zZm9ybSwgaWRlbnRpdHl9IGZyb20gXCIuL3RyYW5zZm9ybS5qc1wiO1xuaW1wb3J0IG5vZXZlbnQsIHtub3Byb3BhZ2F0aW9ufSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbi8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LlxuLy8gZXhjZXB0IGZvciBwaW5jaC10by16b29tLCB3aGljaCBpcyBzZW50IGFzIGEgd2hlZWwrY3RybEtleSBldmVudFxuZnVuY3Rpb24gZGVmYXVsdEZpbHRlcihldmVudCkge1xuICByZXR1cm4gKCFldmVudC5jdHJsS2V5IHx8IGV2ZW50LnR5cGUgPT09ICd3aGVlbCcpICYmICFldmVudC5idXR0b247XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRFeHRlbnQoKSB7XG4gIHZhciBlID0gdGhpcztcbiAgaWYgKGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7XG4gICAgZSA9IGUub3duZXJTVkdFbGVtZW50IHx8IGU7XG4gICAgaWYgKGUuaGFzQXR0cmlidXRlKFwidmlld0JveFwiKSkge1xuICAgICAgZSA9IGUudmlld0JveC5iYXNlVmFsO1xuICAgICAgcmV0dXJuIFtbZS54LCBlLnldLCBbZS54ICsgZS53aWR0aCwgZS55ICsgZS5oZWlnaHRdXTtcbiAgICB9XG4gICAgcmV0dXJuIFtbMCwgMF0sIFtlLndpZHRoLmJhc2VWYWwudmFsdWUsIGUuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTtcbiAgfVxuICByZXR1cm4gW1swLCAwXSwgW2UuY2xpZW50V2lkdGgsIGUuY2xpZW50SGVpZ2h0XV07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUcmFuc2Zvcm0oKSB7XG4gIHJldHVybiB0aGlzLl9fem9vbSB8fCBpZGVudGl0eTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFdoZWVsRGVsdGEoZXZlbnQpIHtcbiAgcmV0dXJuIC1ldmVudC5kZWx0YVkgKiAoZXZlbnQuZGVsdGFNb2RlID09PSAxID8gMC4wNSA6IGV2ZW50LmRlbHRhTW9kZSA/IDEgOiAwLjAwMikgKiAoZXZlbnQuY3RybEtleSA/IDEwIDogMSk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUb3VjaGFibGUoKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgKFwib250b3VjaHN0YXJ0XCIgaW4gdGhpcyk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb25zdHJhaW4odHJhbnNmb3JtLCBleHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkge1xuICB2YXIgZHgwID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzBdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFswXVswXSxcbiAgICAgIGR4MSA9IHRyYW5zZm9ybS5pbnZlcnRYKGV4dGVudFsxXVswXSkgLSB0cmFuc2xhdGVFeHRlbnRbMV1bMF0sXG4gICAgICBkeTAgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMF1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzFdLFxuICAgICAgZHkxID0gdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzFdWzFdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVsxXTtcbiAgcmV0dXJuIHRyYW5zZm9ybS50cmFuc2xhdGUoXG4gICAgZHgxID4gZHgwID8gKGR4MCArIGR4MSkgLyAyIDogTWF0aC5taW4oMCwgZHgwKSB8fCBNYXRoLm1heCgwLCBkeDEpLFxuICAgIGR5MSA+IGR5MCA/IChkeTAgKyBkeTEpIC8gMiA6IE1hdGgubWluKDAsIGR5MCkgfHwgTWF0aC5tYXgoMCwgZHkxKVxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIsXG4gICAgICBleHRlbnQgPSBkZWZhdWx0RXh0ZW50LFxuICAgICAgY29uc3RyYWluID0gZGVmYXVsdENvbnN0cmFpbixcbiAgICAgIHdoZWVsRGVsdGEgPSBkZWZhdWx0V2hlZWxEZWx0YSxcbiAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUsXG4gICAgICBzY2FsZUV4dGVudCA9IFswLCBJbmZpbml0eV0sXG4gICAgICB0cmFuc2xhdGVFeHRlbnQgPSBbWy1JbmZpbml0eSwgLUluZmluaXR5XSwgW0luZmluaXR5LCBJbmZpbml0eV1dLFxuICAgICAgZHVyYXRpb24gPSAyNTAsXG4gICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlWm9vbSxcbiAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJ6b29tXCIsIFwiZW5kXCIpLFxuICAgICAgdG91Y2hzdGFydGluZyxcbiAgICAgIHRvdWNoZmlyc3QsXG4gICAgICB0b3VjaGVuZGluZyxcbiAgICAgIHRvdWNoRGVsYXkgPSA1MDAsXG4gICAgICB3aGVlbERlbGF5ID0gMTUwLFxuICAgICAgY2xpY2tEaXN0YW5jZTIgPSAwLFxuICAgICAgdGFwRGlzdGFuY2UgPSAxMDtcblxuICBmdW5jdGlvbiB6b29tKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvblxuICAgICAgICAucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSlcbiAgICAgICAgLm9uKFwid2hlZWwuem9vbVwiLCB3aGVlbGVkLCB7cGFzc2l2ZTogZmFsc2V9KVxuICAgICAgICAub24oXCJtb3VzZWRvd24uem9vbVwiLCBtb3VzZWRvd25lZClcbiAgICAgICAgLm9uKFwiZGJsY2xpY2suem9vbVwiLCBkYmxjbGlja2VkKVxuICAgICAgLmZpbHRlcih0b3VjaGFibGUpXG4gICAgICAgIC5vbihcInRvdWNoc3RhcnQuem9vbVwiLCB0b3VjaHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS56b29tXCIsIHRvdWNobW92ZWQpXG4gICAgICAgIC5vbihcInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbVwiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIiwgXCJyZ2JhKDAsMCwwLDApXCIpO1xuICB9XG5cbiAgem9vbS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCkge1xuICAgIHZhciBzZWxlY3Rpb24gPSBjb2xsZWN0aW9uLnNlbGVjdGlvbiA/IGNvbGxlY3Rpb24uc2VsZWN0aW9uKCkgOiBjb2xsZWN0aW9uO1xuICAgIHNlbGVjdGlvbi5wcm9wZXJ0eShcIl9fem9vbVwiLCBkZWZhdWx0VHJhbnNmb3JtKTtcbiAgICBpZiAoY29sbGVjdGlvbiAhPT0gc2VsZWN0aW9uKSB7XG4gICAgICBzY2hlZHVsZShjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGlvbi5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICAuZXZlbnQoZXZlbnQpXG4gICAgICAgICAgLnN0YXJ0KClcbiAgICAgICAgICAuem9vbShudWxsLCB0eXBlb2YgdHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIgPyB0cmFuc2Zvcm0uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRyYW5zZm9ybSlcbiAgICAgICAgICAuZW5kKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgem9vbS5zY2FsZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrLCBwLCBldmVudCkge1xuICAgIHpvb20uc2NhbGVUbyhzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGswID0gdGhpcy5fX3pvb20uayxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGswICogazE7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20uc2NhbGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaywgcCwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICB0MCA9IHRoaXMuX196b29tLFxuICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcCA9PT0gXCJmdW5jdGlvblwiID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcCxcbiAgICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gXCJmdW5jdGlvblwiID8gay5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogaztcbiAgICAgIHJldHVybiBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb25zdHJhaW4odGhpcy5fX3pvb20udHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IHkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHlcbiAgICAgICksIGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIG51bGwsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCB4LCB5LCBwLCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHAgPT09IFwiZnVuY3Rpb25cIiA/IHAuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHA7XG4gICAgICByZXR1cm4gY29uc3RyYWluKGlkZW50aXR5LnRyYW5zbGF0ZShwMFswXSwgcDBbMV0pLnNjYWxlKHQuaykudHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8gLXguYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC14LFxuICAgICAgICB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8gLXkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC15XG4gICAgICApLCBlLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICBmdW5jdGlvbiBzY2FsZSh0cmFuc2Zvcm0sIGspIHtcbiAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCBrKSk7XG4gICAgcmV0dXJuIGsgPT09IHRyYW5zZm9ybS5rID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybShrLCB0cmFuc2Zvcm0ueCwgdHJhbnNmb3JtLnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHRyYW5zZm9ybSwgcDAsIHAxKSB7XG4gICAgdmFyIHggPSBwMFswXSAtIHAxWzBdICogdHJhbnNmb3JtLmssIHkgPSBwMFsxXSAtIHAxWzFdICogdHJhbnNmb3JtLms7XG4gICAgcmV0dXJuIHggPT09IHRyYW5zZm9ybS54ICYmIHkgPT09IHRyYW5zZm9ybS55ID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybSh0cmFuc2Zvcm0uaywgeCwgeSk7XG4gIH1cblxuICBmdW5jdGlvbiBjZW50cm9pZChleHRlbnQpIHtcbiAgICByZXR1cm4gWygrZXh0ZW50WzBdWzBdICsgK2V4dGVudFsxXVswXSkgLyAyLCAoK2V4dGVudFswXVsxXSArICtleHRlbnRbMV1bMV0pIC8gMl07XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZSh0cmFuc2l0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCkge1xuICAgIHRyYW5zaXRpb25cbiAgICAgICAgLm9uKFwic3RhcnQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmV2ZW50KGV2ZW50KS5zdGFydCgpOyB9KVxuICAgICAgICAub24oXCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmV2ZW50KGV2ZW50KS5lbmQoKTsgfSlcbiAgICAgICAgLnR3ZWVuKFwiem9vbVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIGcgPSBnZXN0dXJlKHRoYXQsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgICAgICAgZSA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKSxcbiAgICAgICAgICAgICAgcCA9IHBvaW50ID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwb2ludCA9PT0gXCJmdW5jdGlvblwiID8gcG9pbnQuYXBwbHkodGhhdCwgYXJncykgOiBwb2ludCxcbiAgICAgICAgICAgICAgdyA9IE1hdGgubWF4KGVbMV1bMF0gLSBlWzBdWzBdLCBlWzFdWzFdIC0gZVswXVsxXSksXG4gICAgICAgICAgICAgIGEgPSB0aGF0Ll9fem9vbSxcbiAgICAgICAgICAgICAgYiA9IHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGF0LCBhcmdzKSA6IHRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgaSA9IGludGVycG9sYXRlKGEuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYS5rKSwgYi5pbnZlcnQocCkuY29uY2F0KHcgLyBiLmspKTtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgaWYgKHQgPT09IDEpIHQgPSBiOyAvLyBBdm9pZCByb3VuZGluZyBlcnJvciBvbiBlbmQuXG4gICAgICAgICAgICBlbHNlIHsgdmFyIGwgPSBpKHQpLCBrID0gdyAvIGxbMl07IHQgPSBuZXcgVHJhbnNmb3JtKGssIHBbMF0gLSBsWzBdICogaywgcFsxXSAtIGxbMV0gKiBrKTsgfVxuICAgICAgICAgICAgZy56b29tKG51bGwsIHQpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VzdHVyZSh0aGF0LCBhcmdzLCBjbGVhbikge1xuICAgIHJldHVybiAoIWNsZWFuICYmIHRoYXQuX196b29taW5nKSB8fCBuZXcgR2VzdHVyZSh0aGF0LCBhcmdzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEdlc3R1cmUodGhhdCwgYXJncykge1xuICAgIHRoaXMudGhhdCA9IHRoYXQ7XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB0aGlzLmFjdGl2ZSA9IDA7XG4gICAgdGhpcy5zb3VyY2VFdmVudCA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgdGhpcy50YXBzID0gMDtcbiAgfVxuXG4gIEdlc3R1cmUucHJvdG90eXBlID0ge1xuICAgIGV2ZW50OiBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50KSB0aGlzLnNvdXJjZUV2ZW50ID0gZXZlbnQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgrK3RoaXMuYWN0aXZlID09PSAxKSB7XG4gICAgICAgIHRoaXMudGhhdC5fX3pvb21pbmcgPSB0aGlzO1xuICAgICAgICB0aGlzLmVtaXQoXCJzdGFydFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgem9vbTogZnVuY3Rpb24oa2V5LCB0cmFuc2Zvcm0pIHtcbiAgICAgIGlmICh0aGlzLm1vdXNlICYmIGtleSAhPT0gXCJtb3VzZVwiKSB0aGlzLm1vdXNlWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLm1vdXNlWzBdKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoMCAmJiBrZXkgIT09IFwidG91Y2hcIikgdGhpcy50b3VjaDBbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gwWzBdKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoMSAmJiBrZXkgIT09IFwidG91Y2hcIikgdGhpcy50b3VjaDFbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gxWzBdKTtcbiAgICAgIHRoaXMudGhhdC5fX3pvb20gPSB0cmFuc2Zvcm07XG4gICAgICB0aGlzLmVtaXQoXCJ6b29tXCIpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGhpcy5hY3RpdmUgPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMudGhhdC5fX3pvb21pbmc7XG4gICAgICAgIHRoaXMuZW1pdChcImVuZFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24odHlwZSkge1xuICAgICAgdmFyIGQgPSBzZWxlY3QodGhpcy50aGF0KS5kYXR1bSgpO1xuICAgICAgbGlzdGVuZXJzLmNhbGwoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMudGhhdCxcbiAgICAgICAgbmV3IFpvb21FdmVudCh0eXBlLCB7XG4gICAgICAgICAgc291cmNlRXZlbnQ6IHRoaXMuc291cmNlRXZlbnQsXG4gICAgICAgICAgdGFyZ2V0OiB6b29tLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLnRoYXQuX196b29tLFxuICAgICAgICAgIGRpc3BhdGNoOiBsaXN0ZW5lcnNcbiAgICAgICAgfSksXG4gICAgICAgIGRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHdoZWVsZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdCA9IHRoaXMuX196b29tLFxuICAgICAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCB0LmsgKiBNYXRoLnBvdygyLCB3aGVlbERlbHRhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpKSksXG4gICAgICAgIHAgPSBwb2ludGVyKGV2ZW50KTtcblxuICAgIC8vIElmIHRoZSBtb3VzZSBpcyBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBiZWZvcmUsIHJldXNlIGl0LlxuICAgIC8vIElmIHRoZXJlIHdlcmUgcmVjZW50IHdoZWVsIGV2ZW50cywgcmVzZXQgdGhlIHdoZWVsIGlkbGUgdGltZW91dC5cbiAgICBpZiAoZy53aGVlbCkge1xuICAgICAgaWYgKGcubW91c2VbMF1bMF0gIT09IHBbMF0gfHwgZy5tb3VzZVswXVsxXSAhPT0gcFsxXSkge1xuICAgICAgICBnLm1vdXNlWzFdID0gdC5pbnZlcnQoZy5tb3VzZVswXSA9IHApO1xuICAgICAgfVxuICAgICAgY2xlYXJUaW1lb3V0KGcud2hlZWwpO1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgd2hlZWwgZXZlbnQgd29u4oCZdCB0cmlnZ2VyIGEgdHJhbnNmb3JtIGNoYW5nZSwgaWdub3JlIGl0LlxuICAgIGVsc2UgaWYgKHQuayA9PT0gaykgcmV0dXJuO1xuXG4gICAgLy8gT3RoZXJ3aXNlLCBjYXB0dXJlIHRoZSBtb3VzZSBwb2ludCBhbmQgbG9jYXRpb24gYXQgdGhlIHN0YXJ0LlxuICAgIGVsc2Uge1xuICAgICAgZy5tb3VzZSA9IFtwLCB0LmludmVydChwKV07XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZy53aGVlbCA9IHNldFRpbWVvdXQod2hlZWxpZGxlZCwgd2hlZWxEZWxheSk7XG4gICAgZy56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0LCBrKSwgZy5tb3VzZVswXSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcblxuICAgIGZ1bmN0aW9uIHdoZWVsaWRsZWQoKSB7XG4gICAgICBnLndoZWVsID0gbnVsbDtcbiAgICAgIGcuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbW91c2Vkb3duZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAodG91Y2hlbmRpbmcgfHwgIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzLCB0cnVlKS5ldmVudChldmVudCksXG4gICAgICAgIHYgPSBzZWxlY3QoZXZlbnQudmlldykub24oXCJtb3VzZW1vdmUuem9vbVwiLCBtb3VzZW1vdmVkLCB0cnVlKS5vbihcIm1vdXNldXAuem9vbVwiLCBtb3VzZXVwcGVkLCB0cnVlKSxcbiAgICAgICAgcCA9IHBvaW50ZXIoZXZlbnQsIGN1cnJlbnRUYXJnZXQpLFxuICAgICAgICB4MCA9IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHkwID0gZXZlbnQuY2xpZW50WTtcblxuICAgIGRyYWdEaXNhYmxlKGV2ZW50LnZpZXcpO1xuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGcubW91c2UgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApXTtcbiAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgZy5zdGFydCgpO1xuXG4gICAgZnVuY3Rpb24gbW91c2Vtb3ZlZChldmVudCkge1xuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICBpZiAoIWcubW92ZWQpIHtcbiAgICAgICAgdmFyIGR4ID0gZXZlbnQuY2xpZW50WCAtIHgwLCBkeSA9IGV2ZW50LmNsaWVudFkgLSB5MDtcbiAgICAgICAgZy5tb3ZlZCA9IGR4ICogZHggKyBkeSAqIGR5ID4gY2xpY2tEaXN0YW5jZTI7XG4gICAgICB9XG4gICAgICBnLmV2ZW50KGV2ZW50KVxuICAgICAgIC56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShnLnRoYXQuX196b29tLCBnLm1vdXNlWzBdID0gcG9pbnRlcihldmVudCwgY3VycmVudFRhcmdldCksIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW91c2V1cHBlZChldmVudCkge1xuICAgICAgdi5vbihcIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbVwiLCBudWxsKTtcbiAgICAgIGRyYWdFbmFibGUoZXZlbnQudmlldywgZy5tb3ZlZCk7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIGcuZXZlbnQoZXZlbnQpLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRibGNsaWNrZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgIHAwID0gcG9pbnRlcihldmVudC5jaGFuZ2VkVG91Y2hlcyA/IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdIDogZXZlbnQsIHRoaXMpLFxuICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgIGsxID0gdDAuayAqIChldmVudC5zaGlmdEtleSA/IDAuNSA6IDIpLFxuICAgICAgICB0MSA9IGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3MpLCB0cmFuc2xhdGVFeHRlbnQpO1xuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgaWYgKGR1cmF0aW9uID4gMCkgc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbikuY2FsbChzY2hlZHVsZSwgdDEsIHAwLCBldmVudCk7XG4gICAgZWxzZSBzZWxlY3QodGhpcykuY2FsbCh6b29tLnRyYW5zZm9ybSwgdDEsIHAwLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaHN0YXJ0ZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC50b3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsXG4gICAgICAgIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MsIGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA9PT0gbikuZXZlbnQoZXZlbnQpLFxuICAgICAgICBzdGFydGVkLCBpLCB0LCBwO1xuXG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgcCA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCksIHQuaWRlbnRpZmllcl07XG4gICAgICBpZiAoIWcudG91Y2gwKSBnLnRvdWNoMCA9IHAsIHN0YXJ0ZWQgPSB0cnVlLCBnLnRhcHMgPSAxICsgISF0b3VjaHN0YXJ0aW5nO1xuICAgICAgZWxzZSBpZiAoIWcudG91Y2gxICYmIGcudG91Y2gwWzJdICE9PSBwWzJdKSBnLnRvdWNoMSA9IHAsIGcudGFwcyA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHRvdWNoc3RhcnRpbmcpIHRvdWNoc3RhcnRpbmcgPSBjbGVhclRpbWVvdXQodG91Y2hzdGFydGluZyk7XG5cbiAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgaWYgKGcudGFwcyA8IDIpIHRvdWNoZmlyc3QgPSBwWzBdLCB0b3VjaHN0YXJ0aW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hzdGFydGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpO1xuICAgICAgaW50ZXJydXB0KHRoaXMpO1xuICAgICAgZy5zdGFydCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNobW92ZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQsIHAsIGw7XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDBbMF0gPSBwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDFbMF0gPSBwO1xuICAgIH1cbiAgICB0ID0gZy50aGF0Ll9fem9vbTtcbiAgICBpZiAoZy50b3VjaDEpIHtcbiAgICAgIHZhciBwMCA9IGcudG91Y2gwWzBdLCBsMCA9IGcudG91Y2gwWzFdLFxuICAgICAgICAgIHAxID0gZy50b3VjaDFbMF0sIGwxID0gZy50b3VjaDFbMV0sXG4gICAgICAgICAgZHAgPSAoZHAgPSBwMVswXSAtIHAwWzBdKSAqIGRwICsgKGRwID0gcDFbMV0gLSBwMFsxXSkgKiBkcCxcbiAgICAgICAgICBkbCA9IChkbCA9IGwxWzBdIC0gbDBbMF0pICogZGwgKyAoZGwgPSBsMVsxXSAtIGwwWzFdKSAqIGRsO1xuICAgICAgdCA9IHNjYWxlKHQsIE1hdGguc3FydChkcCAvIGRsKSk7XG4gICAgICBwID0gWyhwMFswXSArIHAxWzBdKSAvIDIsIChwMFsxXSArIHAxWzFdKSAvIDJdO1xuICAgICAgbCA9IFsobDBbMF0gKyBsMVswXSkgLyAyLCAobDBbMV0gKyBsMVsxXSkgLyAyXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZy50b3VjaDApIHAgPSBnLnRvdWNoMFswXSwgbCA9IGcudG91Y2gwWzFdO1xuICAgIGVsc2UgcmV0dXJuO1xuXG4gICAgZy56b29tKFwidG91Y2hcIiwgY29uc3RyYWluKHRyYW5zbGF0ZSh0LCBwLCBsKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hlbmRlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdDtcblxuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV07XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gxO1xuICAgIH1cbiAgICBpZiAoZy50b3VjaDEgJiYgIWcudG91Y2gwKSBnLnRvdWNoMCA9IGcudG91Y2gxLCBkZWxldGUgZy50b3VjaDE7XG4gICAgaWYgKGcudG91Y2gwKSBnLnRvdWNoMFsxXSA9IHRoaXMuX196b29tLmludmVydChnLnRvdWNoMFswXSk7XG4gICAgZWxzZSB7XG4gICAgICBnLmVuZCgpO1xuICAgICAgLy8gSWYgdGhpcyB3YXMgYSBkYmx0YXAsIHJlcm91dGUgdG8gdGhlIChvcHRpb25hbCkgZGJsY2xpY2suem9vbSBoYW5kbGVyLlxuICAgICAgaWYgKGcudGFwcyA9PT0gMikge1xuICAgICAgICB0ID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgICAgaWYgKE1hdGguaHlwb3QodG91Y2hmaXJzdFswXSAtIHRbMF0sIHRvdWNoZmlyc3RbMV0gLSB0WzFdKSA8IHRhcERpc3RhbmNlKSB7XG4gICAgICAgICAgdmFyIHAgPSBzZWxlY3QodGhpcykub24oXCJkYmxjbGljay56b29tXCIpO1xuICAgICAgICAgIGlmIChwKSBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB6b29tLndoZWVsRGVsdGEgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAod2hlZWxEZWx0YSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCB6b29tKSA6IHdoZWVsRGVsdGE7XG4gIH07XG5cbiAgem9vbS5maWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCB6b29tKSA6IGZpbHRlcjtcbiAgfTtcblxuICB6b29tLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b3VjaGFibGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogdG91Y2hhYmxlO1xuICB9O1xuXG4gIHpvb20uZXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoW1srX1swXVswXSwgK19bMF1bMV1dLCBbK19bMV1bMF0sICtfWzFdWzFdXV0pLCB6b29tKSA6IGV4dGVudDtcbiAgfTtcblxuICB6b29tLnNjYWxlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlRXh0ZW50WzBdID0gK19bMF0sIHNjYWxlRXh0ZW50WzFdID0gK19bMV0sIHpvb20pIDogW3NjYWxlRXh0ZW50WzBdLCBzY2FsZUV4dGVudFsxXV07XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNsYXRlRXh0ZW50WzBdWzBdID0gK19bMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVswXSA9ICtfWzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV0gPSArX1swXVsxXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdID0gK19bMV1bMV0sIHpvb20pIDogW1t0cmFuc2xhdGVFeHRlbnRbMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXV0sIFt0cmFuc2xhdGVFeHRlbnRbMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXV1dO1xuICB9O1xuXG4gIHpvb20uY29uc3RyYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnN0cmFpbiA9IF8sIHpvb20pIDogY29uc3RyYWluO1xuICB9O1xuXG4gIHpvb20uZHVyYXRpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHVyYXRpb24gPSArXywgem9vbSkgOiBkdXJhdGlvbjtcbiAgfTtcblxuICB6b29tLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRlID0gXywgem9vbSkgOiBpbnRlcnBvbGF0ZTtcbiAgfTtcblxuICB6b29tLm9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IHpvb20gOiB2YWx1ZTtcbiAgfTtcblxuICB6b29tLmNsaWNrRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIHpvb20pIDogTWF0aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTtcbiAgfTtcblxuICB6b29tLnRhcERpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcERpc3RhbmNlID0gK18sIHpvb20pIDogdGFwRGlzdGFuY2U7XG4gIH07XG5cbiAgcmV0dXJuIHpvb207XG59XG4iLCJpbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG5cbi8qKlxuICogUGFyZW50IGNsYXNzIGZvciBidXR0b24gZWxlbWVudHMgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBncmlkdml6IHZpZXdlci5cbiAqXG4gKiBAbW9kdWxlIGJ1dHRvblxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQnV0dG9uIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqIG9wdHMucGFyZW50Tm9kZVxuICAgICAqIG9wdHMuaWRcbiAgICAgKiBvcHRzLnRpdGxlXG4gICAgICogb3B0cy5jbGFzc1xuICAgICAqIG9wdHMub25DbGlja0Z1bmN0aW9uXG4gICAgICogb3B0cy54XG4gICAgICogb3B0cy55XG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XG4gICAgICAgIHRoaXMubWFwID0gb3B0cy5tYXBcbiAgICAgICAgdGhpcy5wYXJlbnROb2RlID0gb3B0cy5wYXJlbnROb2RlIHx8IG9wdHMubWFwLmNvbnRhaW5lclxuXG4gICAgICAgIC8vIHRoZSBkaXYgZWxlbWVudFxuICAgICAgICBpZiAob3B0cy5pZCkgdGhpcy5kaXYgPSBzZWxlY3QoJyMnICsgb3B0cy5pZClcblxuICAgICAgICBpZiAoIXRoaXMuZGl2IHx8IHRoaXMuZGl2LmVtcHR5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGl2ID0gc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKVxuICAgICAgICAgICAgaWYgKG9wdHMuaWQpIHRoaXMuZGl2LmF0dHIoJ2lkJywgb3B0cy5pZClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRzLnRpdGxlKSB0aGlzLmRpdi5hdHRyKCd0aXRsZScsIG9wdHMudGl0bGUpXG4gICAgICAgIGlmIChvcHRzLmNsYXNzKSB0aGlzLmRpdi5hdHRyKCdjbGFzcycsIG9wdHMuY2xhc3MpXG5cbiAgICAgICAgLy8gYWRkIGV2ZW50c1xuICAgICAgICBpZiAob3B0cy5vbkNsaWNrRnVuY3Rpb24pIHRoaXMuZGl2Lm9uKCdjbGljaycsIG9wdHMub25DbGlja0Z1bmN0aW9uKVxuXG4gICAgICAgIC8vc2V0IHN0eWxlc1xuICAgICAgICB0aGlzLnN0eWxlKFxuICAgICAgICAgICAgJ2JveC1zaGFkb3cnLFxuICAgICAgICAgICAgJzAgN3B4IDhweCByZ2JhKDAsNDcsMTAzLC4wOCksIDAgMCAyMnB4IHJnYmEoMCw0NywxMDMsLjA0KSwgMCAxMnB4IDE3cHggcmdiYSgwLDQ3LDEwMywuMDQpLCAwIC00cHggNHB4IHJnYmEoMCw0NywxMDMsLjA0KSdcbiAgICAgICAgKSAvLy5lY2wtdS1zaGFkb3ctM1xuICAgICAgICB0aGlzLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNmZmZmZmYnKVxuICAgICAgICB0aGlzLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXG4gICAgICAgIHRoaXMuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgICAgdGhpcy5zdHlsZSgnZGlzcGxheScsICdmbGV4JylcbiAgICAgICAgdGhpcy5zdHlsZSgnanVzdGlmeS1jb250ZW50JywgJ2NlbnRlcicpXG4gICAgICAgIHRoaXMuc3R5bGUoJ2FsaWduLWl0ZW1zJywgJ2NlbnRlcicpXG4gICAgICAgIHRoaXMuc3R5bGUoJ3dpZHRoJywgJzMwcHgnKVxuICAgICAgICB0aGlzLnN0eWxlKCdoZWlnaHQnLCAnMzBweCcpXG4gICAgICAgIC8vIHRoaXMuc3R5bGUocGFkZGluZyAsICc0cHgnXG5cbiAgICAgICAgLy8gYXBwZW5kIHRvIHBhcmVudFxuICAgICAgICB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kaXYubm9kZSgpKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGx5IGEgc3R5bGUgdG8gdGhlIGJ1dHRvbiBkaXYuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdlxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIHN0eWxlKGssIHYpIHtcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoaywgdilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuL0J1dHRvbi5qcydcblxuLyoqXG4gKiBCdXR0b24gZm9yIHRvZ2dsaW5nIGZ1bGxzY3JlZW4gbW9kZVxuICpcbiAqIEBtb2R1bGUgYnV0dG9uXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBGdWxsc2NyZWVuQnV0dG9uIGV4dGVuZHMgQnV0dG9uIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqIG9wdHMucGFyZW50Tm9kZSAtIHRoZSBub2RlIHRoYXQgdGhlIGJ1dHRvbiBpcyBhcHBlbmRlZCB0b1xuICAgICAqIG9wdHMuY2FudmFzIC0gdGhlIGdyaWR2aXogY2FudmFzXG4gICAgICogb3B0cy5pZFxuICAgICAqIG9wdHMudGl0bGUgLSBIVE1MIHRpdGxlIGF0dHJpYnV0ZVxuICAgICAqIG9wdHMuY2xhc3MgLSBjc3MgY2xhc3NcbiAgICAgKiBvcHRzLm9uQ2xpY2tGdW5jdGlvblxuICAgICAqIG9wdHMueCAtIHggcG9zaXRpb24gb2YgdGhlIGJ1dHRvblxuICAgICAqIG9wdHMueSAtIHkgcG9zaXRpb24gb2YgdGhlIGJ1dHRvblxuICAgICAqL1xuXG4gICAgLy8gZGVmYXVsdCBzdGF0ZVxuICAgIGlzRnVsbHNjcmVlbiA9IGZhbHNlXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG5cbiAgICAgICAgLy8gYXBwZW5kIGZ1bGxzY3JlZW4gaWNvbiB0byBidXR0b24gY29udGFpbmVyXG4gICAgICAgIHRoaXMuZGl2Lm5vZGUoKS5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxzdmdcbiAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxLjJyZW07IHdpZHRoOiAxLjJyZW07IGZpbGw6YmxhY2s7IG1hcmdpbjowO1wiXG4gICAgICAgICAgICBmb2N1c2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8c3ZnIGZpbGw9XCIjMDAwMDAwXCIgdmlld0JveD1cIjAgMCA5NiA5NlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDx0aXRsZS8+XG4gICAgICAgICAgICA8Zz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzAsMEg2QTUuOTk2Niw1Ljk5NjYsMCwwLDAsMCw2VjMwYTYsNiwwLDAsMCwxMiwwVjEySDMwQTYsNiwwLDAsMCwzMCwwWlwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNOTAsMEg2NmE2LDYsMCwwLDAsMCwxMkg4NFYzMGE2LDYsMCwwLDAsMTIsMFY2QTUuOTk2Niw1Ljk5NjYsMCwwLDAsOTAsMFpcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTMwLDg0SDEyVjY2QTYsNiwwLDAsMCwwLDY2VjkwYTUuOTk2Niw1Ljk5NjYsMCwwLDAsNiw2SDMwYTYsNiwwLDAsMCwwLTEyWlwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNOTAsNjBhNS45OTY2LDUuOTk2NiwwLDAsMC02LDZWODRINjZhNiw2LDAsMCwwLDAsMTJIOTBhNS45OTY2LDUuOTk2NiwwLDAsMCw2LTZWNjZBNS45OTY2LDUuOTk2NiwwLDAsMCw5MCw2MFpcIi8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIGBcblxuICAgICAgICAvL3NhdmUgaW5pdGlhbCBtYXAgZGltZW5zaW9uc1xuICAgICAgICB0aGlzLmRlZmF1bHRIZWlnaHQgPSB0aGlzLm1hcC5oXG4gICAgICAgIHRoaXMuZGVmYXVsdFdpZHRoID0gdGhpcy5tYXAud1xuXG4gICAgICAgIC8vIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgdGhpcy5kaXYub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25DbGlja0Z1bmN0aW9uKGUpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuZGl2Lm9uKCdtb3VzZW92ZXInLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSgnYmFja2dyb3VuZC1jb2xvcicsICdsaWdodGdyZXknKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLmRpdi5vbignbW91c2VvdXQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSgnYmFja2dyb3VuZC1jb2xvcicsICcjZmZmZmZmJylcbiAgICAgICAgfSlcblxuICAgICAgICAvL3NldCBwb3NpdGlvblxuICAgICAgICBpZiAob3B0cy54KSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdsZWZ0Jywgb3B0cy54ICsgJ3B4JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3JpZ2h0JywgJzEwcHgnKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLnkpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3RvcCcsIG9wdHMueSArICdweCcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCd0b3AnLCAnOTBweCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNsaWNrRnVuY3Rpb24oZSkge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VGdWxsc2NyZWVuKHRoaXMubWFwLmNvbnRhaW5lcilcbiAgICAgICAgICAgIC8vcmVzaXplIGNhbnZhcyB0byBkZWZhdWx0XG4gICAgICAgICAgICB0aGlzLm1hcC5oID0gdGhpcy5kZWZhdWx0SGVpZ2h0XG4gICAgICAgICAgICB0aGlzLm1hcC53ID0gdGhpcy5kZWZhdWx0V2lkdGhcbiAgICAgICAgICAgIHRoaXMubWFwLmdlb0NhbnZhcy5oID0gdGhpcy5kZWZhdWx0SGVpZ2h0XG4gICAgICAgICAgICB0aGlzLm1hcC5nZW9DYW52YXMudyA9IHRoaXMuZGVmYXVsdFdpZHRoXG4gICAgICAgICAgICB0aGlzLm1hcC5nZW9DYW52YXMuY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMuZGVmYXVsdFdpZHRoKVxuICAgICAgICAgICAgdGhpcy5tYXAuZ2VvQ2FudmFzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5kZWZhdWx0SGVpZ2h0KVxuICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkZ1bGxzY3JlZW4odGhpcy5tYXAuY29udGFpbmVyKVxuICAgICAgICAgICAgLy9yZXNpemUgY2FudmFzIHRvIGZ1bGxzY3JlZW5cbiAgICAgICAgICAgIHRoaXMubWFwLmggPSB3aW5kb3cuc2NyZWVuLmhlaWdodFxuICAgICAgICAgICAgdGhpcy5tYXAudyA9IHdpbmRvdy5zY3JlZW4ud2lkdGhcbiAgICAgICAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gdHJ1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyogT3BlbiBmdWxsc2NyZWVuICovXG4gICAgb3BlbkZ1bGxzY3JlZW4oZWxlbSkge1xuICAgICAgICBpZiAoZWxlbS5yZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgZWxlbS5yZXF1ZXN0RnVsbHNjcmVlbigpXG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgLyogU2FmYXJpICovXG4gICAgICAgICAgICBlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKClcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtLm1zUmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgIC8qIElFMTEgKi9cbiAgICAgICAgICAgIGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbigpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBDbG9zZSBmdWxsc2NyZWVuICovXG4gICAgY2xvc2VGdWxsc2NyZWVuKCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgLyogU2FmYXJpICovXG4gICAgICAgICAgICBkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpXG4gICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgLyogSUUxMSAqL1xuICAgICAgICAgICAgZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuL0J1dHRvbi5qcydcblxuLyoqXG4gKiBCdXR0b24gZm9yIHRvZ2dsaW5nIGZ1bGxzY3JlZW4gbW9kZVxuICpcbiAqIEBtb2R1bGUgYnV0dG9uXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBab29tQnV0dG9ucyBleHRlbmRzIEJ1dHRvbiB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG5cbiAgICAgICAgdGhpcy5vblpvb20gPSBvcHRzLm9uWm9vbSAvLyBjdXN0b20gdXNlciBldmVudCBoYW5kbGVyXG4gICAgICAgIHRoaXMuZGVsdGEgPSBvcHRzLmRlbHRhIHx8IDAuMlxuXG4gICAgICAgIC8vIHpvb20gaW4gYnRuXG4gICAgICAgIHRoaXMuem9vbUluQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICAgIHRoaXMuem9vbUluQnRuLmlubmVySFRNTCA9IGA8YSBpZD1cInpvb21pblwiIGNsYXNzPVwiZ3JpZHZpei16b29tLWJ1dHRvblwiIHRpdGxlPVwiWm9vbSBpblwiPis8L2E+YFxuICAgICAgICB0aGlzLnpvb21JbkJ0bi50aXRsZSA9ICdab29tIGluJ1xuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21JbihlKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b29tSW5CdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ2xpZ2h0Z3JleSdcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy56b29tSW5CdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b29tSW5CdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNmZmZmZmYnXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gem9vbSBvdXQgYnRuXG4gICAgICAgIHRoaXMuem9vbU91dEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICB0aGlzLnpvb21PdXRCdG4uaW5uZXJIVE1MID0gYDxhIGlkPVwiem9vbWluXCIgY2xhc3M9XCJncmlkdml6LXpvb20tYnV0dG9uXCIgdGl0bGU9XCJab29tIG91dFwiPi08L2E+YFxuICAgICAgICB0aGlzLnpvb21PdXRCdG4udGl0bGUgPSAnWm9vbSBvdXQnXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21PdXQoZSlcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy56b29tT3V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21PdXRCdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ2xpZ2h0Z3JleSdcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy56b29tT3V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9vbU91dEJ0bi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZmZmZidcbiAgICAgICAgfSlcblxuICAgICAgICAvL3NldCBzdHlsZXNcbiAgICAgICAgbGV0IGJ0bnMgPSBbdGhpcy56b29tSW5CdG4sIHRoaXMuem9vbU91dEJ0bl1cbiAgICAgICAgYnRucy5mb3JFYWNoKChidG4sIGkpID0+IHtcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5hbGlnbkl0ZW1zID0gJ2NlbnRlcidcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICdjZW50ZXInXG4gICAgICAgICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xuICAgICAgICAgICAgYnRuLnN0eWxlLmJvcmRlciA9ICdub25lJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLmNvbG9yID0gJ2JsYWNrJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLnRleHRBbGlnbiA9ICdjZW50ZXInXG4gICAgICAgICAgICBidG4uc3R5bGUudGV4dERlY29yYXRpb24gPSAnbm9uZSdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5wYWRkaW5nID0gJzRweCdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5mb250U2l6ZSA9ICcyMHB4J1xuICAgICAgICAgICAgYnRuLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnXG4gICAgICAgICAgICBpZiAoaSA9PSAwKSBidG4uc3R5bGUuYm9yZGVyQm90dG9tID0gJzFweCBzb2xpZCBncmV5J1xuICAgICAgICB9KVxuXG4gICAgICAgIC8vIHVuc2V0IHBhcmVudCBjbGFzcyBoZWlnaHQgYW5kIGRpc3BsYXkgZm9yIGR1YWwgYnV0dG9uc1xuICAgICAgICB0aGlzLnN0eWxlKCdoZWlnaHQnLCAndW5zZXQnKVxuICAgICAgICB0aGlzLnN0eWxlKCdkaXNwbGF5JywgJ3Vuc2V0JylcblxuICAgICAgICAvL3NldCBwb3NpdGlvblxuICAgICAgICBpZiAob3B0cy54KSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdsZWZ0Jywgb3B0cy54ICsgJ3B4JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3JpZ2h0JywgJzEwcHgnKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLnkpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3RvcCcsIG9wdHMueSArICdweCcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCd0b3AnLCAnMTBweCcpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBhcHBlbmQgdG8gYnV0dG9uIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmRpdi5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy56b29tSW5CdG4pXG4gICAgICAgIHRoaXMuZGl2Lm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLnpvb21PdXRCdG4pXG4gICAgfVxuXG4gICAgLyogWm9vbSBpbiAqL1xuICAgIHpvb21JbihlKSB7XG4gICAgICAgIHRoaXMubWFwLnNldFpvb20odGhpcy5tYXAuZ2V0Wm9vbSgpICogKDEgLSB0aGlzLmRlbHRhKSkucmVkcmF3KClcbiAgICAgICAgaWYgKHRoaXMub25ab29tKSB0aGlzLm9uWm9vbShlKVxuICAgIH1cblxuICAgIC8qIFpvb20gb3V0ICovXG4gICAgem9vbU91dChlKSB7XG4gICAgICAgIHRoaXMubWFwLnNldFpvb20odGhpcy5tYXAuZ2V0Wm9vbSgpICogKDEgKyB0aGlzLmRlbHRhKSkucmVkcmF3KClcbiAgICAgICAgaWYgKHRoaXMub25ab29tKSB0aGlzLm9uWm9vbShlKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBBIGdyaWQgY2VsbC5cbiAqIEB0eXBlZGVmIHt7eDogbnVtYmVyLCB5OiBudW1iZXJ9fSBDZWxsICovXG5cbi8qKlxuICogQSBkYXRhc2V0IGNvbXBvbmVudCwgb2YgZ3JpZCBjZWxscy5cbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgRGF0YXNldCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL01hcC5qc1wiKS5NYXB9IG1hcCBUaGUgbWFwLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCBvZiB0aGUgZGF0YXNldC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgZGF0YXNldCByZXNvbHV0aW9uLCBpbiB0aGUgQ1JTIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OmZ1bmN0aW9uKENlbGwpOmJvb2xlYW4sIG1peGVkUmVzb2x1dGlvbj86ZnVuY3Rpb24oQ2VsbCk6bnVtYmVyfX0gb3B0c1xuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcCwgdXJsLCByZXNvbHV0aW9uLCBvcHRzID0ge30pIHtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG1hcC5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9NYXAuanNcIikuTWFwfSAqL1xuICAgICAgICB0aGlzLm1hcCA9IG1hcFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdXJsIG9mIHRoZSBkYXRhc2V0LlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gdXJsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gcmVzb2x1dGlvblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEluIGNhc2UgdGhlIGRhdGFzZXQgaXMgYSBkYXRhc2V0IHdpdGggY2VsbHMgaGF2aW5nIGRpZmZlcmVudCByZXNvbHV0aW9uLFxuICAgICAgICAqIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgcmVzb2x1dGlvbiBvZiBlYWNoIGNlbGwuXG4gICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAqIEB0eXBlIHsoZnVuY3Rpb24oQ2VsbCk6bnVtYmVyICl8IHVuZGVmaW5lZCB9ICovXG4gICAgICAgIHRoaXMubWl4ZWRSZXNvbHV0aW9uID0gb3B0cy5taXhlZFJlc29sdXRpb25cblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBwcmVwcm9jZXNzIHRvIHJ1biBvbiBlYWNoIGNlbGwgYWZ0ZXIgbG9hZGluZy4gSXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc29tZSBzcGVjaWZpYyB0cmVhdG1lbnQgYmVmb3JlIG9yIGNvbXB1dGUgYSBuZXcgY29sdW1uLiBBbmQgYWxzbyB0byBkZXRlcm1pbmUgd2hpY2ggY2VsbHMgdG8ga2VlcCBhZnRlciBsb2FkaW5nLlxuICAgICAgICAgKiBAdHlwZSB7KGZ1bmN0aW9uKENlbGwpOmJvb2xlYW4gKXwgdW5kZWZpbmVkIH0gKi9cbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzIHx8IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKiBUaGUgY2VsbHMgd2l0aGluIHRoZSB2aWV3XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxDZWxsPn0gKi9cbiAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZSA9IFtdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBkYXRhIHdpdGhpbiBhIGdlb2dyYXBoaWMgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gZXh0R2VvXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgZ2V0RGF0YShleHRHZW8gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgZ2V0RGF0YSBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICogQGFic3RyYWN0XG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5FbnZlbG9wZX0gZXh0R2VvIFRoZSB2aWV3IGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIHVwZGF0ZVZpZXdDYWNoZSBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBjZWxsIHVuZGVyIGEgZ2l2ZW4gcG9zaXRpb24sIGlmIGFueS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7e3g6bnVtYmVyLHk6bnVtYmVyfX0gcG9zR2VvXG4gICAgICogQHBhcmFtIHtBcnJheS48Q2VsbD59IGNlbGxzIFNvbWUgY2VsbHMgZnJvbSB0aGUgZGF0YXNldCAoYSBzdWJzZXQgaWYgbmVjZXNzYXJ5LCB1c3VhbGx5IHRoZSB2aWV3IGNhY2hlKS5cbiAgICAgKiBAcmV0dXJucyB7Q2VsbHx1bmRlZmluZWR9XG4gICAgICovXG4gICAgZ2V0Q2VsbEZyb21Qb3NpdGlvbihwb3NHZW8sIGNlbGxzKSB7XG4gICAgICAgIC8vY29tcHV0ZSBjYW5kaWRhdGUgY2VsbCBwb3NpdGlvblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgLy9jb25zdCByID0gdGhpcy5nZXRSZXNvbHV0aW9uKClcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIC8vY29uc3QgY2VsbFggPSByICogTWF0aC5mbG9vcihwb3NHZW8ueCAvIHIpXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAvL2NvbnN0IGNlbGxZID0gciAqIE1hdGguZmxvb3IocG9zR2VvLnkgLyByKVxuXG4gICAgICAgIC8qL2dldCBjZWxsXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgaWYgKGNlbGwueCAhPSBjZWxsWCkgY29udGludWVcbiAgICAgICAgICAgIGlmIChjZWxsLnkgIT0gY2VsbFkpIGNvbnRpbnVlXG4gICAgICAgICAgICByZXR1cm4gY2VsbFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQqL1xuXG4gICAgICAgIC8vcmFyZSBjYXNlIG9mIG1peGVkIHJlc29sdXRpb24gZGF0YXNldFxuICAgICAgICBpZiAodGhpcy5taXhlZFJlc29sdXRpb24pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSArdGhpcy5taXhlZFJlc29sdXRpb24oYylcbiAgICAgICAgICAgICAgICBpZiAocG9zR2VvLnggPCBjLngpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYy54ICsgciA8IHBvc0dlby54KSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvc0dlby55IDwgYy55KSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMueSArIHIgPCBwb3NHZW8ueSkgY29udGludWVcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBjXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbW1vbiBjYXNlXG5cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLmdldFJlc29sdXRpb24oKVxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGlmIChwb3NHZW8ueCA8IGNlbGwueCkgY29udGludWVcbiAgICAgICAgICAgIGVsc2UgaWYgKGNlbGwueCArIHIgPCBwb3NHZW8ueCkgY29udGludWVcbiAgICAgICAgICAgIGVsc2UgaWYgKHBvc0dlby55IDwgY2VsbC55KSBjb250aW51ZVxuICAgICAgICAgICAgZWxzZSBpZiAoY2VsbC55ICsgciA8IHBvc0dlby55KSBjb250aW51ZVxuICAgICAgICAgICAgZWxzZSByZXR1cm4gY2VsbFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcblxuICAgIH1cblxuICAgIC8vZ2V0dGVycyBhbmQgc2V0dGVyc1xuXG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gICAgZ2V0UmVzb2x1dGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x1dGlvblxuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7QXJyYXkuPENlbGw+fSAqL1xuICAgIGdldFZpZXdDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbHNWaWV3Q2FjaGVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHJlbGV2YW50IGRhdGFzZXQgZm9yIGEgc3BlY2lmaWVkIHpvb20uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluUGl4ZWxzUGVyQ2VsbFxuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fHVuZGVmaW5lZH1cbiAgICAgKiAqL1xuICAgIGdldERhdGFzZXQoeiwgbWluUGl4ZWxzUGVyQ2VsbCkge1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdXNlZCB0byBncm91cCBlbGVtZW50cyBzaGFyZWQgYmV0d2VlbiBMYXllciBhbmQgU3R5bGUgY2xhc3Nlcy5cbiAqIFxuICogQGFic3RyYWN0XG4gKiBAbW9kdWxlIGNvcmVcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIERyYXdhYmxlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSB2aXNpYmxlIG9yIG5vdC5cbiAgICAgICAgICogVGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpib29sZWFufSAqL1xuICAgICAgICB0aGlzLnZpc2libGUgPSBvcHRzLnZpc2libGVcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGFscGhhICh0cmFuc3BhcmVuY3kvb3BhY2l0eSksIGJldHdlZW4gMC4wIChmdWxseSB0cmFuc3BhcmVudCkgYW5kIDEuMCAoZnVsbHkgb3BhcXVlKS5cbiAgICAgICAgICogIFRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIChzZWUgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOiBnbG9iYWxBbHBoYSBwcm9wZXJ0eSlcbiAgICAgICAgICogQHR5cGUgeyhmdW5jdGlvbihudW1iZXIpOm51bWJlcil8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmFscGhhID0gb3B0cy5hbHBoYVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgYmxlbmQgb3BlcmF0aW9uLlxuICAgICAgICAgKiBUaGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiAoc2VlIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDogZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIHByb3BlcnR5KVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb259ICovXG4gICAgICAgIHRoaXMuYmxlbmRPcGVyYXRpb24gPSBvcHRzLmJsZW5kT3BlcmF0aW9uIHx8ICh6ID0+IFwic291cmNlLW92ZXJcIilcblxuICAgICAgICAvKiogQHR5cGUgeyhmdW5jdGlvbihudW1iZXIpOnN0cmluZyl8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmZpbHRlckNvbG9yID0gb3B0cy5maWx0ZXJDb2xvciAvLyAoeikgPT4gXCIjZWVlN1wiXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBsYXllciBmaWx0ZXIuXG4gICAgICogXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIGRyYXdGaWx0ZXIoZ2VvQ2FudmFzKSB7XG4gICAgICAgIC8vbm8gZmlsdGVyOiByZXR1cm5cbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlckNvbG9yKSByZXR1cm5cblxuICAgICAgICAvL2dldCBmaWx0ZXJcbiAgICAgICAgY29uc3QgZmMgPSB0aGlzLmZpbHRlckNvbG9yKGdlb0NhbnZhcy52aWV3LnopXG5cbiAgICAgICAgLy9ubyBmaWx0ZXI6IHJldHVyblxuICAgICAgICBpZiAoIWZjIHx8IGZjID09ICdub25lJykgcmV0dXJuXG5cbiAgICAgICAgLy9kcmF3IGZpbHRlclxuICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9IGZjXG4gICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoMCwgMCwgZ2VvQ2FudmFzLncsIGdlb0NhbnZhcy5oKVxuICAgIH1cblxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYgeyB7eE1pbjogbnVtYmVyLCB4TWF4OiBudW1iZXIsIHlNaW46IG51bWJlciwgeU1heDogbnVtYmVyfSB9IEVudmVsb3BlICovXG5cbi8qKlxuICogQSB2aWV3c2hlZC5cbiAqIEB0eXBlZGVmIHt7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn19IFZpZXcgKi9cblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuaW1wb3J0IHsgem9vbSBhcyBkM3pvb20sIHpvb21JZGVudGl0eSB9IGZyb20gJ2QzLXpvb20nXG5cbi8qKlxuICogQSBIVE1MIGNhbnZhcyBmb3IgZ2VvIGRhdGEgZGlzcGxheSwgZW5oYW5jZWQgd2l0aCB6b29tIGFuZCBwYW4gY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgR2VvQ2FudmFzIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB2aWV3XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdmlld1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IFRoZSB6b29tIGxldmVsIG9mIHRoZSB2aWV3IChwaXhlbCBzaXplLCBpbiBncm91bmQgbSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhbnZhcywgeCA9IDAsIHkgPSAwLCB6ID0gMCwgb3B0cyA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXNcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy53ID0gdGhpcy5jYW52YXMub2Zmc2V0V2lkdGhcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaCA9IHRoaXMuY2FudmFzLm9mZnNldEhlaWdodFxuXG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy53XG4gICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuaFxuXG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgICAgICAgaWYgKCFjdHgpIHRocm93ICdJbXBvc3NpYmxlIHRvIGNyZWF0ZSBjYW52YXMgMkQgY29udGV4dCdcbiAgICAgICAgLyoqQHR5cGUge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gKi9cbiAgICAgICAgdGhpcy5jdHggPSBjdHhcblxuICAgICAgICAvKiogXG4gICAgICAgICAqIHo6IHBpeGVsIHNpemUsIGluIG0vcGl4XG4gICAgICAgICAqIEB0eXBlIHtWaWV3fSAgKi9cbiAgICAgICAgdGhpcy52aWV3ID0geyB4OiB4LCB5OiB5LCB6OiB6IH1cblxuICAgICAgICAvKiogQmFja2dyb3VuZCBjb2xvci5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBvcHRzLmJhY2tncm91bmRDb2xvciB8fCAnd2hpdGUnXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihvYmplY3R8dW5kZWZpbmVkKTp2b2lkfSAqL1xuICAgICAgICB0aGlzLm9uWm9vbVN0YXJ0RnVuID0gb3B0cy5vblpvb21TdGFydEZ1blxuXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0fHVuZGVmaW5lZCk6dm9pZH0gKi9cbiAgICAgICAgdGhpcy5vblpvb21FbmRGdW4gPSBvcHRzLm9uWm9vbUVuZEZ1blxuXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0fHVuZGVmaW5lZCk6dm9pZH0gKi9cbiAgICAgICAgdGhpcy5vblpvb21GdW4gPSBvcHRzLm9uWm9vbUZ1blxuXG4gICAgICAgIC8vY3VycmVudCBleHRlbnRcbiAgICAgICAgLyoqIEB0eXBlIHtFbnZlbG9wZX0gKi9cbiAgICAgICAgdGhpcy5leHRHZW8gPSB7IHhNaW46IE5hTiwgeE1heDogTmFOLCB5TWluOiBOYU4sIHlNYXg6IE5hTiB9XG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcblxuICAgICAgICAvL3JlbHkgb24gZDMgem9vbSBmb3IgcGFuL3pvb21cbiAgICAgICAgaWYgKCFvcHRzLmRpc2FibGVab29tKSB7XG4gICAgICAgICAgICBsZXQgdFAgPSB6b29tSWRlbnRpdHlcbiAgICAgICAgICAgIGNvbnN0IHogPSBkM3pvb20oKVxuICAgICAgICAgICAgICAgIC8vdG8gbWFrZSB0aGUgem9vbWluZyBhIGJpdCBmYXN0ZXJcbiAgICAgICAgICAgICAgICAud2hlZWxEZWx0YSgoZSkgPT4gLWUuZGVsdGFZICogKGUuZGVsdGFNb2RlID09PSAxID8gMC4wNyA6IGUuZGVsdGFNb2RlID8gMSA6IDAuMDA0KSlcbiAgICAgICAgICAgICAgICAub24oJ3pvb20nLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gZS50cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZiA9IHRQLmsgLyB0LmtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGYgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9wYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR4ID0gdFAueCAtIHQueFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHkgPSB0UC55IC0gdC55XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhbihkeCAqIHRoaXMudmlldy56LCAtZHkgKiB0aGlzLnZpZXcueilcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlID0gZS5zb3VyY2VFdmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlIGluc3RhbmNlb2YgV2hlZWxFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vem9vbSBhdCB0aGUgbW91c2UgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl4VG9HZW9YKGUuc291cmNlRXZlbnQub2Zmc2V0WCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl4VG9HZW9ZKGUuc291cmNlRXZlbnQub2Zmc2V0WSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlIGluc3RhbmNlb2YgVG91Y2hFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSB0b3VjaGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR4ID0gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgPSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdHQgb2Ygc2UudGFyZ2V0VG91Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCArPSB0dC5jbGllbnRYXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5ICs9IHR0LmNsaWVudFlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLz0gc2UudGFyZ2V0VG91Y2hlcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAvPSBzZS50YXJnZXRUb3VjaGVzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vem9vbSBhdCB0aGlzIGF2ZXJhZ2UgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb20oZiwgdGhpcy5waXhUb0dlb1godHgpLCB0aGlzLnBpeFRvR2VvWSh0eSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdFAgPSB0XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25ab29tRnVuKSB0aGlzLm9uWm9vbUZ1bihlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLm9uKCdzdGFydCcsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuaCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jLmdldENvbnRleHQoJzJkJyk/LmRyYXdJbWFnZSh0aGlzLmNhbnZhcywgMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5mID0gMTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblpvb21TdGFydEZ1bikgdGhpcy5vblpvb21TdGFydEZ1bihlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLm9uKCdlbmQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IHsgYzogbnVsbCwgZHg6IDAsIGR5OiAwLCBmOiAxIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblpvb21FbmRGdW4pIHRoaXMub25ab29tRW5kRnVuKGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHooc2VsZWN0KHRoaXMuY2FudmFzKSlcbiAgICAgICAgfVxuICAgICAgICAvL3NlbGVjdCh0aGlzLmNhbnZhcykuY2FsbCh6KTtcblxuICAgICAgICAvKiogWm9vbSBleHRlbnQsIHRvIGxpbWl0IHpvb20gaW4gYW5kIG91dFxuICAgICAgICAgKiAgQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xuICAgICAgICB0aGlzLnpvb21FeHRlbnQgPSBvcHRzLnpvb21FeHRlbnQgfHwgWzAsIEluZmluaXR5XVxuXG4gICAgICAgIC8qKiBDYW52YXMgc3RhdGUsIHRvIGJlIHVzZWQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVkcmF3cyBvbiB6b29tL3BhblxuICAgICAgICAgKiAgQHR5cGUge3tjOkhUTUxDYW52YXNFbGVtZW50fG51bGwsZHg6bnVtYmVyLGR5Om51bWJlcixmOm51bWJlcn19ICovXG4gICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IHsgYzogbnVsbCwgZHg6IDAsIGR5OiAwLCBmOiAxIH1cbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge1ZpZXd9ICovXG4gICAgZ2V0VmlldygpIHsgcmV0dXJuIHRoaXMudmlldyB9XG5cblxuICAgIC8qKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSB2ICovXG4gICAgc2V0Wm9vbUV4dGVudCh2KSB7XG4gICAgICAgIHRoaXMuem9vbUV4dGVudCA9IHZcbiAgICB9XG4gICAgLyoqIEByZXR1cm5zIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICBnZXRab29tRXh0ZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy56b29tRXh0ZW50XG4gICAgfVxuXG4gICAgLyoqIEluaXRpYWxpc2UgY2FudmFzIHRyYW5zZm9ybSB3aXRoIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uLiAqL1xuICAgIGluaXRDYW52YXNUcmFuc2Zvcm0oKSB7XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgIH1cblxuICAgIC8qKiBJbml0aWFsaXNlIGNhbnZhcyB0cmFuc2Zvcm0gd2l0aCBnZW8gdG8gc2NyZWVuIHRyYW5zZm9ybWF0aW9uLCBzbyB0aGF0IGdlbyBvYmplY3RzIGNhbiBiZSBkcmF3biBkaXJlY3RseSBpbiBnZW8gY29vcmRpbmF0ZXMuICovXG4gICAgc2V0Q2FudmFzVHJhbnNmb3JtKCkge1xuICAgICAgICBjb25zdCBrID0gMSAvIHRoaXMudmlldy56XG4gICAgICAgIGNvbnN0IHR4ID0gLXRoaXMudmlldy54IC8gdGhpcy52aWV3LnogKyB0aGlzLncgKiAwLjVcbiAgICAgICAgY29uc3QgdHkgPSB0aGlzLnZpZXcueSAvIHRoaXMudmlldy56ICsgdGhpcy5oICogMC41XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybShrLCAwLCAwLCAtaywgdHgsIHR5KVxuICAgIH1cblxuICAgIC8qKiBHZXQgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byB3ZWJHTCBzY3JlZW4gY29vcmRpbmF0ZXMsIHdpdGhpbiBbLTEsMV0qWy0xLDFdICovXG4gICAgZ2V0V2ViR0xUcmFuc2Zvcm0oKSB7XG4gICAgICAgIGNvbnN0IGt4ID0gMi4wIC8gKHRoaXMudyAqIHRoaXMudmlldy56KVxuICAgICAgICBjb25zdCBreSA9IDIuMCAvICh0aGlzLmggKiB0aGlzLnZpZXcueilcbiAgICAgICAgcmV0dXJuIFtreCwgMC4wLCAwLjAsIDAuMCwga3ksIDAuMCwgLWt4ICogdGhpcy52aWV3LngsIC1reSAqIHRoaXMudmlldy55LCAxLjBdXG4gICAgfVxuXG4gICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGhvdyB0byBkcmF3IHRoZSBtYXAuICovXG4gICAgcmVkcmF3KCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCByZWRyYXcgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIuIFRvIGJlIHVzZWQgYmVmb3JlIGEgcmVkcmF3IGZvciBleGFtcGxlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclxuICAgICAqL1xuICAgIGNsZWFyKGNvbG9yID0gJ3doaXRlJykge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnRyYW5zcGFyZW50QmFja2dyb3VuZCkge1xuICAgICAgICAgICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMudywgdGhpcy5oKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3R4KSB0aGlzLmN0eC5maWxsU3R5bGUgPSBjb2xvclxuICAgICAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgdGhpcy53LCB0aGlzLmgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZHhHZW9cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZHlHZW9cbiAgICAgKi9cbiAgICBwYW4oZHhHZW8gPSAwLCBkeUdlbyA9IDApIHtcbiAgICAgICAgLy9UT0RPIGZvcmNlIGV4dGVuZCB0byByZW1haW5cbiAgICAgICAgdGhpcy52aWV3LnggKz0gZHhHZW9cbiAgICAgICAgdGhpcy52aWV3LnkgKz0gZHlHZW9cbiAgICAgICAgdGhpcy51cGRhdGVFeHRlbnRHZW8oKVxuXG4gICAgICAgIGlmICh0aGlzLmNhbnZhc1NhdmUuYykge1xuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4IC09IGR4R2VvIC8gdGhpcy52aWV3LnpcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSArPSBkeUdlbyAvIHRoaXMudmlldy56XG4gICAgICAgICAgICB0aGlzLmNsZWFyKHRoaXMuYmFja2dyb3VuZENvbG9yKVxuICAgICAgICAgICAgLy8gdGhpcyBkb2VzbnQgd29yayBvbiBtb2JpbGUgaHR0cHM6Ly9naXRodWIuY29tL2V1cm9zdGF0L2dyaWR2aXovaXNzdWVzLzk4XG4gICAgICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLmMsIHRoaXMuY2FudmFzU2F2ZS5keCwgdGhpcy5jYW52YXNTYXZlLmR5KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWm9vbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZiBUaGUgLCB3aXRoaW4gXTAsIEluZmluaXR5XS4gMSBpcyBmb3Igbm8gY2hhbmdlLiA8MSB0byB6b29tLWluLCA+MSB0byB6b29tLW91dC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geEdlbyBUaGUgeCBnZW8gcG9zaXRpb24gZml4ZWQgaW4gdGhlIHNjcmVlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geUdlbyBUaGUgeSBnZW8gcG9zaXRpb24gZml4ZWQgaW4gdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICB6b29tKGYgPSAxLCB4R2VvID0gdGhpcy52aWV3LngsIHlHZW8gPSB0aGlzLnZpZXcueSkge1xuICAgICAgICAvL1RPRE8gZm9yY2UgZ2VvIGV4dGVuZCB0byByZW1haW5cblxuICAgICAgICAvL3RyeWluZyB0byB6b29tIGluL291dCBiZXlvbmQgbGltaXRcbiAgICAgICAgaWYgKHRoaXMuem9vbUV4dGVudFswXSA9PSB0aGlzLnZpZXcueiAmJiBmIDw9IDEpIHJldHVyblxuICAgICAgICBpZiAodGhpcy56b29tRXh0ZW50WzFdID09IHRoaXMudmlldy56ICYmIGYgPj0gMSkgcmV0dXJuXG5cbiAgICAgICAgLy9lbnN1cmUgem9vbSBleHRlbnQgcHJlc2VydmVkXG4gICAgICAgIGNvbnN0IG5ld1pmID0gZiAqIHRoaXMudmlldy56XG4gICAgICAgIGlmIChuZXdaZiA8IHRoaXMuem9vbUV4dGVudFswXSkgZiA9IHRoaXMuem9vbUV4dGVudFswXSAvIHRoaXMudmlldy56XG4gICAgICAgIGlmIChuZXdaZiA+IHRoaXMuem9vbUV4dGVudFsxXSkgZiA9IHRoaXMuem9vbUV4dGVudFsxXSAvIHRoaXMudmlldy56XG5cbiAgICAgICAgdGhpcy52aWV3LnogKj0gZlxuICAgICAgICBjb25zdCBkeEdlbyA9ICh4R2VvIC0gdGhpcy52aWV3LngpICogKDEgLSBmKVxuICAgICAgICB0aGlzLnZpZXcueCArPSBkeEdlb1xuICAgICAgICBjb25zdCBkeUdlbyA9ICh5R2VvIC0gdGhpcy52aWV3LnkpICogKDEgLSBmKVxuICAgICAgICB0aGlzLnZpZXcueSArPSBkeUdlb1xuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXG5cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzU2F2ZS5jKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKHRoaXMuYmFja2dyb3VuZENvbG9yKVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgLz0gZlxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4ID0gdGhpcy5nZW9Ub1BpeFgoeEdlbykgKiAoMSAtIHRoaXMuY2FudmFzU2F2ZS5mKVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5ID0gdGhpcy5nZW9Ub1BpeFkoeUdlbykgKiAoMSAtIHRoaXMuY2FudmFzU2F2ZS5mKVxuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcbiAgICAgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZShcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYyxcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHgsXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5LFxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5mICogdGhpcy5jYW52YXNTYXZlLmMud2lkdGgsXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgKiB0aGlzLmNhbnZhc1NhdmUuYy5oZWlnaHRcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXJnaW5QeFxuICAgICAqIEByZXR1cm5zIHtFbnZlbG9wZX0gVGhlIGVudmVsb3BlIG9mIHRoZSB2aWV3LCBpbiBnZW8gY29vcmRpbmF0ZXMuXG4gICAgICovXG4gICAgdXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4ID0gMjApIHtcbiAgICAgICAgdGhpcy5leHRHZW8gPSB7XG4gICAgICAgICAgICB4TWluOiB0aGlzLnBpeFRvR2VvWCgtbWFyZ2luUHgpLFxuICAgICAgICAgICAgeE1heDogdGhpcy5waXhUb0dlb1godGhpcy53ICsgbWFyZ2luUHgpLFxuICAgICAgICAgICAgeU1pbjogdGhpcy5waXhUb0dlb1kodGhpcy5oICsgbWFyZ2luUHgpLFxuICAgICAgICAgICAgeU1heDogdGhpcy5waXhUb0dlb1koLW1hcmdpblB4KSxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5leHRHZW9cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgb2JqZWN0IGhhcyB0byBiZSBkcmF3blxuICAgICAqXG4gICAgICogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSBvYmpcbiAgICAgKi9cbiAgICB0b0RyYXcob2JqKSB7XG4gICAgICAgIGlmIChvYmoueCA8IHRoaXMuZXh0R2VvLnhNaW4pIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAob2JqLnggPiB0aGlzLmV4dEdlby54TWF4KSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKG9iai55IDwgdGhpcy5leHRHZW8ueU1pbikgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChvYmoueSA+IHRoaXMuZXh0R2VvLnlNYXgpIHJldHVybiBmYWxzZVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vY29udmVyc2lvbiBmdW5jdGlvbnNcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geEdlbyBHZW8geCBjb29yZGluYXRlLCBpbiBtLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNjcmVlbiB4IGNvb3JkaW5hdGUsIGluIHBpeC5cbiAgICAgKi9cbiAgICBnZW9Ub1BpeFgoeEdlbykge1xuICAgICAgICByZXR1cm4gKHhHZW8gLSB0aGlzLnZpZXcueCkgLyB0aGlzLnZpZXcueiArIHRoaXMudyAqIDAuNVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geUdlbyBHZW8geSBjb29yZGluYXRlLCBpbiBtLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNjcmVlbiB5IGNvb3JkaW5hdGUsIGluIHBpeC5cbiAgICAgKi9cbiAgICBnZW9Ub1BpeFkoeUdlbykge1xuICAgICAgICByZXR1cm4gLSh5R2VvIC0gdGhpcy52aWV3LnkpIC8gdGhpcy52aWV3LnogKyB0aGlzLmggKiAwLjVcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggU2NyZWVuIHggY29vcmRpbmF0ZSwgaW4gcGl4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEdlbyB4IGNvb3JkaW5hdGUsIGluIG0uXG4gICAgICovXG4gICAgcGl4VG9HZW9YKHgpIHtcbiAgICAgICAgcmV0dXJuICh4IC0gdGhpcy53ICogMC41KSAqIHRoaXMudmlldy56ICsgdGhpcy52aWV3LnhcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgU2NyZWVuIHkgY29vcmRpbmF0ZSwgaW4gcGl4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEdlbyB5IGNvb3JkaW5hdGUsIGluIG0uXG4gICAgICovXG4gICAgcGl4VG9HZW9ZKHkpIHtcbiAgICAgICAgcmV0dXJuIC0oeSAtIHRoaXMuaCAqIDAuNSkgKiB0aGlzLnZpZXcueiArIHRoaXMudmlldy55XG4gICAgfVxuXG4gICAgLyoqIEdldCB4LHkseiBlbGVtZW50cyBmcm9tIFVSTCBhbmQgYXNzaWduIHRoZW0gdG8gdGhlIHZpZXcuICovXG4gICAgc2V0Vmlld0Zyb21VUkwoKSB7XG4gICAgICAgIGNvbnN0IHggPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd4JyksXG4gICAgICAgICAgICB5ID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZSgneScpLFxuICAgICAgICAgICAgeiA9IEdlb0NhbnZhcy5nZXRQYXJhbWV0ZXJCeU5hbWUoJ3onKVxuICAgICAgICBpZiAoeCAhPSBudWxsICYmIHggIT0gdW5kZWZpbmVkICYmICFpc05hTigreCkpIHRoaXMudmlldy54ID0gK3hcbiAgICAgICAgaWYgKHkgIT0gbnVsbCAmJiB5ICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4oK3kpKSB0aGlzLnZpZXcueSA9ICt5XG4gICAgICAgIGlmICh6ICE9IG51bGwgJiYgeiAhPSB1bmRlZmluZWQgJiYgIWlzTmFOKCt6KSkgdGhpcy52aWV3LnogPSArelxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIFVSTCBwYXJhbWV0ZXIgYnkgbmFtZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAgICovXG4gICAgc3RhdGljIGdldFBhcmFtZXRlckJ5TmFtZShuYW1lKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1tcXFtdLywgJ1xcXFxbJykucmVwbGFjZSgvW1xcXV0vLCAnXFxcXF0nKVxuICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKCdbXFxcXD8mXScgKyBuYW1lICsgJz0oW14mI10qKScpLFxuICAgICAgICAgICAgcmVzdWx0cyA9IHJlZ2V4LmV4ZWMobG9jYXRpb24uc2VhcmNoKVxuICAgICAgICByZXR1cm4gIXJlc3VsdHMgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdHNbMV0ucmVwbGFjZSgvXFwrL2csICcgJykpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBEcmF3YWJsZSB9IGZyb20gXCIuL0RyYXdhYmxlLmpzXCJcblxuLyoqXG4gKiBAbW9kdWxlIGNvcmVcbiAqIEBhYnN0cmFjdFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTGF5ZXIgZXh0ZW5kcyBEcmF3YWJsZSB7XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGxheWVyLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbGVnZW5kXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgZHJhdyhnZW9DYW52YXMsIGxlZ2VuZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBkcmF3IG5vdCBpbXBsZW1lbnRlZC4nKVxuICAgIH1cblxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG5cbi8qKlxuICogQSBsZWdlbmQgY29udGFpbmVyLlxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTGVnZW5kIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5pZCA9IG9wdHMuaWRcblxuICAgICAgICAvL1RPRE8gc3RvcCB1c2luZyBpdC4gVXNlIHN0eWxlIG1ldGhvZCBiZWxvdyBpbnN0ZWFkLlxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLnRvcCA9IG9wdHMudG9wXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmJvdHRvbSA9IG9wdHMuYm90dG9tXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmxlZnQgPSBvcHRzLmxlZnRcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMucmlnaHQgPSBvcHRzLnJpZ2h0XG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBvcHRzLmJhY2tncm91bmQgfHwgJ25vbmUnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLnBhZGRpbmcgPSBvcHRzLnBhZGRpbmcgfHwgJzVweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMuYm9yZGVyID0gb3B0cy5ib3JkZXIgfHwgJzBweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSA9IG9wdHNbJ2JvcmRlci1yYWRpdXMnXSB8fCAnbm9uZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2JveC1zaGFkb3cnXSA9IG9wdHNbJ2JveC1zaGFkb3cnXSB8fCAnbm9uZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2ZvbnQtZmFtaWx5J10gPSBvcHRzWydmb250LWZhbWlseSddIHx8ICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgLy90aGlzLndpZHRoID0gb3B0cy53aWR0aFxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgLy90aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0XG5cbiAgICAgICAgLy90aGUgZGl2IGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMuaWQpIHRoaXMuZGl2ID0gc2VsZWN0KCcjJyArIHRoaXMuaWQpXG5cbiAgICAgICAgaWYgKCF0aGlzLmRpdiB8fCB0aGlzLmRpdi5lbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLmRpdiA9IHNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSlcbiAgICAgICAgICAgIGlmICh0aGlzLmlkKSB0aGlzLmRpdi5hdHRyKCdpZCcsIHRoaXMuaWQpXG4gICAgICAgIH1cblxuICAgICAgICAvL3NldCBzdHlsZVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnYmFja2dyb3VuZCcsIHRoaXMuYmFja2dyb3VuZClcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ3BhZGRpbmcnLCB0aGlzLnBhZGRpbmcpXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3JkZXInLCB0aGlzLmJvcmRlcilcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCB0aGlzWydib3JkZXItcmFkaXVzJ10pXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3gtc2hhZG93JywgdGhpc1snYm94LXNoYWRvdyddKVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnZm9udC1mYW1pbHknLCB0aGlzWydmb250LWZhbWlseSddKVxuXG4gICAgICAgIC8vaWYgKHRoaXMud2lkdGgpIHRoaXMuZGl2LnN0eWxlKCd3aWR0aCcsIHRoaXMud2lkdGgpXG4gICAgICAgIC8vaWYgKHRoaXMuaGVpZ2h0KSB0aGlzLmRpdi5zdHlsZSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLnRpdGxlID0gb3B0cy50aXRsZVxuICAgICAgICB0aGlzLnRpdGxlRm9udFNpemUgPSBvcHRzLnRpdGxlRm9udFNpemUgfHwgJzAuOGVtJ1xuICAgICAgICB0aGlzLnRpdGxlRm9udFdlaWdodCA9IG9wdHMudGl0bGVGb250V2VpZ2h0IHx8ICdib2xkJ1xuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy5sYWJlbFVuaXRUZXh0ID0gb3B0cy5sYWJlbFVuaXRUZXh0IHx8ICcnXG4gICAgICAgIHRoaXMubGFiZWxGb3JtYXQgPSBvcHRzLmxhYmVsRm9ybWF0XG4gICAgfVxuXG5cbiAgICBtYWtlVGl0bGUoKSB7XG4gICAgICAgIGlmICghdGhpcy50aXRsZSkgcmV0dXJuXG4gICAgICAgIHRoaXMuZGl2XG4gICAgICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLnRpdGxlRm9udFNpemUpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgdGhpcy50aXRsZUZvbnRXZWlnaHQpXG4gICAgICAgICAgICAuc3R5bGUoJ21hcmdpbi1ib3R0b20nLCAnN3B4JylcbiAgICAgICAgICAgIC50ZXh0KHRoaXMudGl0bGUpXG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBhIHN0eWxlIHRvIHRoZSBsZWdlbmQgZGl2LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZcbiAgICAgKiBAcmV0dXJucyB7dGhpc3xzdHJpbmd9XG4gICAgICovXG4gICAgc3R5bGUoaywgdikge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy5kaXYuc3R5bGUoaylcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoaywgdilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHVwZGF0ZShvcHRzID0ge30pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTGVnZW5kIHVwZGF0ZSBub3QgaW1wbGVtZW50ZWQgeWV0LicpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vLyBpbnRlcm5hbCBpbXBvcnRzXG5pbXBvcnQgeyBHZW9DYW52YXMgfSBmcm9tICcuL0dlb0NhbnZhcy5qcydcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuL1Rvb2x0aXAuanMnXG5pbXBvcnQgeyBab29tQnV0dG9ucyB9IGZyb20gJy4uL2J1dHRvbi9ab29tQnV0dG9ucy5qcydcbmltcG9ydCB7IEZ1bGxzY3JlZW5CdXR0b24gfSBmcm9tICcuLi9idXR0b24vRnVsbHNjcmVlbkJ1dHRvbi5qcydcblxuLy8gZXh0ZXJuYWwgaW1wb3J0c1xuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuXG4vKipcbiAqIEEgZ3JpZHZpeiBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAbW9kdWxlIGNvcmVcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIE1hcCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gY29udGFpbmVyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXIsIG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGxheWVycy5cbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL0xheWVyLmpzXCIpLkxheWVyPn1cbiAgICAgICAgICogKi9cbiAgICAgICAgdGhpcy5sYXllcnMgPSBvcHRzLmxheWVycyB8fCBbXVxuXG4gICAgICAgIC8vZ2V0IGNvbnRhaW5lciBlbGVtZW50XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncmlkdml6JylcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IGZpbmQgZ3JpZHZpeiBjb250YWluZXIgZWxlbWVudC4nKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvL2h0dHBzOi8vY3NzLXRyaWNrcy5jb20vYWJzb2x1dGUtcG9zaXRpb25pbmctaW5zaWRlLXJlbGF0aXZlLXBvc2l0aW9uaW5nL1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjsgLy8gY29udGFpbmVyIGVsZW1lbnQgbXVzdCBoYXZlIHJlbGF0aXZlIHBvc2l0aW9uaW5nXG5cbiAgICAgICAgLy9zZXQgZGltZW5zaW9uc1xuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy53ID0gb3B0cy53IHx8IHRoaXMuY29udGFpbmVyLm9mZnNldFdpZHRoXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmggPSBvcHRzLmggfHwgdGhpcy5jb250YWluZXIub2Zmc2V0SGVpZ2h0XG5cbiAgICAgICAgLy9jcmVhdGUgY2FudmFzIGVsZW1lbnQgaWYgbm90IHNwZWNpZmllZFxuICAgICAgICAvKiogQHR5cGUge0hUTUxDYW52YXNFbGVtZW50fSAqL1xuICAgICAgICB0aGlzLl9jYW52YXMgPSBvcHRzLmNhbnZhcyB8fCB0aGlzLmluaXRpYWxpc2VDYW52YXMoKVxuXG4gICAgICAgIC8qKiBNYWtlIGdlbyBjYW52YXNcbiAgICAgICAgICogQHR5cGUge0dlb0NhbnZhc31cbiAgICAgICAgICogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5nZW9DYW52YXMgPSBuZXcgR2VvQ2FudmFzKHRoaXMuX2NhbnZhcywgb3B0cy54LCBvcHRzLnksIG9wdHMueiwgb3B0cylcbiAgICAgICAgdGhpcy5nZW9DYW52YXMucmVkcmF3ID0gKCkgPT4geyB0aGlzLnJlZHJhdygpIH1cblxuICAgICAgICAvLyBsZWdlbmQgZGl2XG4gICAgICAgIHRoaXMubGVnZW5kRGl2SWQgPSBvcHRzLmxlZ2VuZERpdklkIHx8ICdndml6TGVnZW5kJ1xuICAgICAgICB0aGlzLmxlZ2VuZCA9IHNlbGVjdCgnIycgKyB0aGlzLmxlZ2VuZERpdklkKVxuICAgICAgICBpZiAodGhpcy5sZWdlbmQuZW1wdHkoKSkgdGhpcy5pbml0aWFsaXNlTGVnZW5kKClcblxuXG4gICAgICAgIC8vdG9vbHRpcFxuXG4gICAgICAgIC8vIHNldCBBcHAgY29udGFpbmVyIGFzIGRlZmF1bHQgcGFyZW50IGVsZW1lbnQgZm9yIHRvb2x0aXBcbiAgICAgICAgaWYgKCFvcHRzLnRvb2x0aXApIG9wdHMudG9vbHRpcCA9IHt9XG4gICAgICAgIGlmICghb3B0cy50b29sdGlwLnBhcmVudEVsZW1lbnQpIG9wdHMudG9vbHRpcC5wYXJlbnRFbGVtZW50ID0gdGhpcy5jb250YWluZXJcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge1Rvb2x0aXB9ICovXG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG5ldyBUb29sdGlwKG9wdHMudG9vbHRpcClcblxuICAgICAgICAvLyBhZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGNvbnRhaW5lclxuICAgICAgICB0aGlzLm1vdXNlT3ZlckhhbmRsZXIgPSAoZSkgPT4gdGhpcy5mb2N1c0NlbGwoZSlcbiAgICAgICAgdGhpcy5tb3VzZU1vdmVIYW5kbGVyID0gKGUpID0+IHRoaXMuZm9jdXNDZWxsKGUpXG4gICAgICAgIHRoaXMubW91c2VPdXRIYW5kbGVyID0gKGUpID0+IHRoaXMudG9vbHRpcC5oaWRlKClcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMubW91c2VPdmVySGFuZGxlcilcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlSGFuZGxlcilcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5tb3VzZU91dEhhbmRsZXIpXG5cbiAgICAgICAgLy8gYWRkIGV4dHJhIGxvZ2ljIHRvIG9uWm9vbVN0YXJ0RnVuXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLm9uWm9vbVN0YXJ0RnVuID0gKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRzLm9uWm9vbVN0YXJ0RnVuKSBvcHRzLm9uWm9vbVN0YXJ0RnVuKGUpXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvL2ZvciBtb3VzZSBvdmVyXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR8bnVsbH0gKi9cbiAgICAgICAgdGhpcy5jYW52YXNTYXZlID0gbnVsbFxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3IgPSBvcHRzLnNlbGVjdGlvblJlY3RhbmdsZUNvbG9yIHx8ICdyZWQnXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXggPSBvcHRzLnNlbGVjdGlvblJlY3RhbmdsZVdpZHRoUGl4IHx8ICgoKSA9PiA0KSAvLyhyLHopID0+IHt9XG5cbiAgICAgICAgLy8gdHJhbnNwYXJlbnQgYmFja2dyb3VuZCAoZS5nLiBsZWFmbGV0KSAncmVkIHBhaW50aW5nJyBmaXhcbiAgICAgICAgdGhpcy50cmFuc3BhcmVudEJhY2tncm91bmQgPSBvcHRzLnRyYW5zcGFyZW50QmFja2dyb3VuZFxuXG4gICAgICAgIC8vc2V0IGRlZmF1bHQgZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXG4gICAgICAgIHRoaXMuZGVmYXVsdEdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9XG4gICAgICAgICAgICBvcHRzLmRlZmF1bHRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gfHwgdGhpcy5nZW9DYW52YXMuY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvblxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBAcHJvdGVjdGVkIFxuICAgICAqIEByZXR1cm5zIHtIVE1MQ2FudmFzRWxlbWVudH1cbiAgICAqL1xuICAgIGluaXRpYWxpc2VDYW52YXMoKSB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJycgKyB0aGlzLncpXG4gICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpXG4gICAgICAgIHJldHVybiBjYW52YXNcbiAgICB9XG5cblxuICAgIGluaXRpYWxpc2VMZWdlbmQoKSB7XG4gICAgICAgIHRoaXMubGVnZW5kID0gc2VsZWN0KHRoaXMuY29udGFpbmVyLmlkICYmIHRoaXMuY29udGFpbmVyLmlkICE9ICcnID8gJyMnICsgdGhpcy5jb250YWluZXIuaWQgOiAnYm9keScpXG4gICAgICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgLmF0dHIoJ2lkJywgdGhpcy5sZWdlbmREaXZJZClcbiAgICAgICAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgICAgICAgLnN0eWxlKCd3aWR0aCcsICdhdXRvJylcbiAgICAgICAgICAgIC5zdHlsZSgnaGVpZ2h0JywgJ2F1dG8nKVxuICAgICAgICAgICAgLnN0eWxlKCdiYWNrZ3JvdW5kJywgJyNGRkZGRkYnKVxuICAgICAgICAgICAgLy8uc3R5bGUoXCJwYWRkaW5nXCIsIHRoaXMucGFkZGluZylcbiAgICAgICAgICAgIC5zdHlsZSgnYm9yZGVyJywgJzBweCcpXG4gICAgICAgICAgICAvLy5zdHlsZSgnYm9yZGVyLXJhZGl1cycsICc1cHgnKVxuICAgICAgICAgICAgLnN0eWxlKCdib3gtc2hhZG93JywgJzNweCAzcHggM3B4IGdyZXksIC0zcHggLTNweCAzcHggI2RkZCcpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtZmFtaWx5JywgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnKVxuICAgICAgICAgICAgLnN0eWxlKCdib3R0b20nLCAnMTVweCcpXG4gICAgICAgICAgICAuc3R5bGUoJ3JpZ2h0JywgJzE1cHgnKVxuICAgICAgICAvL2hpZGVcbiAgICAgICAgLy8uc3R5bGUoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0L2dldCBsYXllciBzdGFjay5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge3VuZGVmaW5lZHxpbXBvcnQoXCIuL0xheWVyLmpzXCIpLkxheWVyfGltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXJbXX0gbGF5ZXJzIFxuICAgICAqIEByZXR1cm5zIHsgdGhpcyB8IGltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXJbXSB9XG4gICAgICovXG4gICAgbGF5ZXJzXyhsYXllcnMpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLmxheWVyc1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheWVycykpIHRoaXMubGF5ZXJzID0gbGF5ZXJzXG4gICAgICAgICAgICBlbHNlIHRoaXMubGF5ZXJzID0gW2xheWVyc11cbiAgICAgICAgZWxzZSB0aGlzLmxheWVycyA9IGFyZ3VtZW50c1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7dGhpc30gKi9cbiAgICByZWRyYXcoKSB7XG4gICAgICAgIC8vcmVtb3ZlIGxlZ2VuZCBlbGVtZW50c1xuICAgICAgICBpZiAodGhpcy5sZWdlbmQpIHRoaXMubGVnZW5kLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2xlYXIodGhpcy5nZW9DYW52YXMuYmFja2dyb3VuZENvbG9yKVxuXG4gICAgICAgIGNvbnN0IHogPSB0aGlzLmdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgdGhpcy51cGRhdGVFeHRlbnRHZW8oKVxuXG4gICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcblxuICAgICAgICAgICAgLy9jaGVjayBpZiBsYXllciBpcyB2aXNpYmxlXG4gICAgICAgICAgICBpZiAobGF5ZXIudmlzaWJsZSAmJiAhbGF5ZXIudmlzaWJsZSh6KSkgY29udGludWVcblxuICAgICAgICAgICAgLy9zZXQgbGF5ZXIgYWxwaGEgYW5kIGJsZW5kIG1vZGVcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5nbG9iYWxBbHBoYSA9IGxheWVyLmFscGhhID8gbGF5ZXIuYWxwaGEoeikgOiAxLjBcbiAgICAgICAgICAgIGlmIChsYXllci5ibGVuZE9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gbGF5ZXIuYmxlbmRPcGVyYXRpb24oeilcblxuICAgICAgICAgICAgLy9zZXQgYWZmaW4gdHJhbnNmb3JtIHRvIGRyYXcgd2l0aCBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXNcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsYXllclxuICAgICAgICAgICAgbGF5ZXIuZHJhdyh0aGlzLmdlb0NhbnZhcywgdGhpcy5sZWdlbmQpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsYXllciBmaWx0ZXJcbiAgICAgICAgICAgIGlmIChsYXllci5maWx0ZXJDb2xvcilcbiAgICAgICAgICAgICAgICBsYXllci5kcmF3RmlsdGVyKHRoaXMuZ2VvQ2FudmFzKVxuXG4gICAgICAgICAgICAvL3Jlc3RvcmUgZGVmYXVsdCBhbHBoYSBhbmQgYmxlbmQgb3BlcmF0aW9uXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZ2xvYmFsQWxwaGEgPSAxLjBcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSB0aGlzLmRlZmF1bHRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb25cbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IG51bGxcblxuICAgICAgICAvLyBsaXN0ZW4gZm9yIHJlc2l6ZSBldmVudHMgb24gdGhlIEFwcCdzIGNvbnRhaW5lciBhbmQgaGFuZGxlIHRoZW1cbiAgICAgICAgdGhpcy5kZWZpbmVSZXNpemVPYnNlcnZlcih0aGlzLmNvbnRhaW5lciwgdGhpcy5fY2FudmFzKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWFyZ2luUHhcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KCcuL0dlb0NhbnZhcy5qcycpLkVudmVsb3BlfVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICB1cGRhdGVFeHRlbnRHZW8obWFyZ2luUHggPSAyMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMudXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4KVxuICAgIH1cblxuXG5cbiAgICAvKiogQHBhcmFtIHtNb3VzZUV2ZW50fSBlICovXG4gICAgZm9jdXNDZWxsKGUpIHtcbiAgICAgICAgLy9jb21wdXRlIG1vdXNlIGdlbyBwb3NpdGlvblxuICAgICAgICBjb25zdCBtb3VzZVBvc2l0aW9uR2VvID0ge1xuICAgICAgICAgICAgeDogdGhpcy5nZW9DYW52YXMucGl4VG9HZW9YKGUub2Zmc2V0WCArIHRoaXMudG9vbHRpcC54TW91c2VPZmZzZXQpLFxuICAgICAgICAgICAgeTogdGhpcy5nZW9DYW52YXMucGl4VG9HZW9ZKGUub2Zmc2V0WSArIHRoaXMudG9vbHRpcC55TW91c2VPZmZzZXQpLFxuICAgICAgICB9XG4gICAgICAgIC8qKiBAdHlwZSB7e2NlbGw6aW1wb3J0KCcuL0RhdGFzZXQuanMnKS5DZWxsLGh0bWw6c3RyaW5nLHJlc29sdXRpb246bnVtYmVyfSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgICAgY29uc3QgZm9jdXMgPSB0aGlzLmdldENlbGxGb2N1c0luZm8obW91c2VQb3NpdGlvbkdlbylcblxuICAgICAgICAvLyB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIChlLmcuIGxlYWZsZXQpICdyZWQgcGFpbnRpbmcnIGZpeFxuICAgICAgICBpZiAodGhpcy50cmFuc3BhcmVudEJhY2tncm91bmQpIHtcbiAgICAgICAgICAgIGlmIChmb2N1cykge1xuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5odG1sKGZvY3VzLmh0bWwpXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnNldFBvc2l0aW9uKGUpXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnNob3coKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmdldENvbnRleHQoJzJkJyk/LmRyYXdJbWFnZSh0aGlzLmdlb0NhbnZhcy5jYW52YXMsIDAsIDApXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChmb2N1cy5odG1sKVxuICAgICAgICAgICAgdGhpcy50b29sdGlwLnNldFBvc2l0aW9uKGUpXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2hvdygpXG5cbiAgICAgICAgICAgIC8vc2hvdyBjZWxsIHBvc2l0aW9uIGFzIGEgcmVjdGFuZ2xlXG4gICAgICAgICAgICBpZiAoIXRoaXMuY2FudmFzU2F2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuaClcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZ2V0Q29udGV4dCgnMmQnKT8uZHJhd0ltYWdlKHRoaXMuZ2VvQ2FudmFzLmNhbnZhcywgMCwgMClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuY3R4LmRyYXdJbWFnZSh0aGlzLmNhbnZhc1NhdmUsIDAsIDApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZHJhdyBpbWFnZSBzYXZlZCArIGRyYXcgcmVjdGFuZ2xlXG4gICAgICAgICAgICBjb25zdCByZWN0V1BpeCA9IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXhcbiAgICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXgoZm9jdXMucmVzb2x1dGlvbiwgdGhpcy5nZW9DYW52YXMudmlldy56KVxuICAgICAgICAgICAgICAgIDogNFxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnNlbGVjdGlvblJlY3RhbmdsZUNvbG9yXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gcmVjdFdQaXhcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHgucmVjdChcbiAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5nZW9Ub1BpeFgoZm9jdXMuY2VsbC54KSAtIHJlY3RXUGl4IC8gMixcbiAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5nZW9Ub1BpeFkoZm9jdXMuY2VsbC55KSArIHJlY3RXUGl4IC8gMixcbiAgICAgICAgICAgICAgICBmb2N1cy5yZXNvbHV0aW9uIC8gdGhpcy5nZW9DYW52YXMudmlldy56ICsgcmVjdFdQaXgsXG4gICAgICAgICAgICAgICAgLWZvY3VzLnJlc29sdXRpb24gLyB0aGlzLmdlb0NhbnZhcy52aWV3LnogLSByZWN0V1BpeFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgICAgICBpZiAodGhpcy5jYW52YXNTYXZlKSB0aGlzLmdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzU2F2ZSwgMCwgMClcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBjZWxsIEhUTUwgaW5mbyBhdCBhIGdpdmVuIGdlbyBwb3NpdGlvbi5cbiAgICAgKiBUaGlzIGlzIHVzZWZ1bGwgZm9yIHVzZXIgaW50ZXJhY3Rpb25zLCB0byBzaG93IHRoaXMgaW5mbyB3aGVyZSB0aGUgdXNlciBjbGlja3MgZm9yIGV4YW1wbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IHBvc0dlb1xuICAgICAqIEByZXR1cm5zIHt7Y2VsbDppbXBvcnQoJy4vRGF0YXNldC5qcycpLkNlbGwsaHRtbDpzdHJpbmcscmVzb2x1dGlvbjpudW1iZXJ9IHwgdW5kZWZpbmVkfVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBnZXRDZWxsRm9jdXNJbmZvKHBvc0dlbykge1xuICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxheWVycywgc3RhcnRpbmcgZnJvbSB0b3BcbiAgICAgICAgY29uc3QgeiA9IHRoaXMuZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5sYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9MYXllci5qc1wiKS5MYXllcn0gKi9cbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllcnNbaV1cbiAgICAgICAgICAgIGlmIChsYXllci52aXNpYmxlICYmICFsYXllci52aXNpYmxlKHopKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCFsYXllci5jZWxsSW5mb0hUTUwpIGNvbnRpbnVlXG4gICAgICAgICAgICAvL2lmIChsYXllci5jZWxsSW5mb0hUTUwgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgIGlmICghbGF5ZXIuZ2V0RGF0YXNldCkgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IGRzYyA9IGxheWVyLmdldERhdGFzZXQoeilcbiAgICAgICAgICAgIGlmICghZHNjKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBjZWxsIGF0IG1vdXNlIHBvc2l0aW9uXG4gICAgICAgICAgICAvKiogQHR5cGUge2ltcG9ydCgnLi9EYXRhc2V0LmpzJykuQ2VsbHx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gZHNjLmdldENlbGxGcm9tUG9zaXRpb24ocG9zR2VvLCBkc2MuZ2V0Vmlld0NhY2hlKCkpXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGNlbGwsIGRzYy5yZXNvbHV0aW9uKVxuICAgICAgICAgICAgaWYgKCFjZWxsKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgICAgIC8vcmFyZSBjYXNlIGZvciBhIGRhdGFzZXQgd2l0aCBtaXhlZCByZXNvbHV0aW9uc1xuICAgICAgICAgICAgaWYgKGRzYy5taXhlZFJlc29sdXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gK2RzYy5taXhlZFJlc29sdXRpb24oY2VsbClcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gbGF5ZXIuY2VsbEluZm9IVE1MKGNlbGwsIHIpXG4gICAgICAgICAgICAgICAgaWYgKCFodG1sKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogciB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsYXllci5jZWxsSW5mb0hUTUwoY2VsbCwgZHNjLmdldFJlc29sdXRpb24oKSlcbiAgICAgICAgICAgIGlmICghaHRtbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogZHNjLmdldFJlc29sdXRpb24oKSB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ8dW5kZWZpbmVkfSB6XG4gICAgICovXG4gICAgc2V0Vmlldyh4LCB5LCB6ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnZpZXcueCA9IHhcbiAgICAgICAgdGhpcy5nZW9DYW52YXMudmlldy55ID0geVxuICAgICAgICBpZiAoeiAhPSB1bmRlZmluZWQpIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiA9IHpcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge2ltcG9ydCgnLi9HZW9DYW52YXMuanMnKS5WaWV3fSAqL1xuICAgIGdldFZpZXcoKSB7IHJldHVybiB0aGlzLmdlb0NhbnZhcy52aWV3IH1cblxuICAgIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICAgIGdldFpvb20oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy52aWV3LnpcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7bnVtYmVyfSB6IEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHNldFpvb20oeikge1xuICAgICAgICB0aGlzLmdlb0NhbnZhcy52aWV3LnogPSB6XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG5cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXI+fSAqL1xuICAgIGdldFpvb21FeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5nZXRab29tRXh0ZW50KClcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRab29tRXh0ZW50KHZhbCkge1xuICAgICAgICB0aGlzLmdlb0NhbnZhcy5zZXRab29tRXh0ZW50KHZhbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cblxuXG4gICAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gICAgZ2V0QmFja2dyb3VuZENvbG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMuYmFja2dyb3VuZENvbG9yXG4gICAgfVxuICAgIC8qKiBAcGFyYW0ge3N0cmluZ30gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHNldEJhY2tncm91bmRDb2xvcih2YWwpIHtcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuYmFja2dyb3VuZENvbG9yID0gdmFsXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNldCBvZiB6b29tIGJ1dHRvbnMgdG8gdGhlIG1hcFxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRab29tQnV0dG9ucyhvcHRzKSB7XG4gICAgICAgIC8vICogb3B0cy5pZFxuICAgICAgICAvLyAqIG9wdHMub25ab29tIC0gY3VzdG9tIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAgLy8gKiBvcHRzLnhcbiAgICAgICAgLy8gKiBvcHRzLnlcbiAgICAgICAgLy8gKiBvcHRzLmRlbHRhIC0gem9vbSBkZWx0YSBhcHBsaWVkIG9uIGVhY2ggY2xpY2tcblxuICAgICAgICB0aGlzLnpvb21CdXR0b25zID0gbmV3IFpvb21CdXR0b25zKHtcbiAgICAgICAgICAgIG1hcDogdGhpcyxcbiAgICAgICAgICAgIGlkOiBvcHRzPy5pZCB8fCAnZ3JpZHZpei16b29tLWJ1dHRvbnMnLFxuICAgICAgICAgICAgY2xhc3M6IG9wdHM/LmNsYXNzLFxuICAgICAgICAgICAgeDogb3B0cz8ueCxcbiAgICAgICAgICAgIHk6IG9wdHM/LnksXG4gICAgICAgICAgICBvblpvb206IG9wdHM/Lm9uWm9vbSxcbiAgICAgICAgICAgIGRlbHRhOiBvcHRzPy5kZWx0YSB8fCAwLjJcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmdWxsc2NyZWVuIHRvZ2dsZSBidXR0b24gdG8gdGhlIGFwcFxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRGdWxsc2NyZWVuQnV0dG9uKG9wdHMpIHtcbiAgICAgICAgLy8gKiBvcHRzLm1hcCAtIHRoZSBncmlkdml6IG1hcFxuICAgICAgICAvLyAqIG9wdHMuaWRcbiAgICAgICAgLy8gKiBvcHRzLnhcbiAgICAgICAgLy8gKiBvcHRzLnlcblxuICAgICAgICB0aGlzLmZ1bGxzY3JlZW5CdXR0b24gPSBuZXcgRnVsbHNjcmVlbkJ1dHRvbih7XG4gICAgICAgICAgICBtYXA6IHRoaXMsXG4gICAgICAgICAgICBpZDogb3B0cz8uaWQgfHwgJ2dyaWR2aXotZnVsbHNjcmVlbi1idXR0b24nLFxuICAgICAgICAgICAgY2xhc3M6IG9wdHM/LmNsYXNzLFxuICAgICAgICAgICAgeDogb3B0cz8ueCxcbiAgICAgICAgICAgIHk6IG9wdHM/LnlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRWaWV3RnJvbVVSTCgpIHtcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuc2V0Vmlld0Zyb21VUkwoKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBBZGQgYSByZXNpemUgZXZlbnQgb2JzZXJ2ZXIgdG8gdGhlIEFwcHMgY29udGFpbmVyIGFuZCB1cGRhdGUgdGhlIGNhbnZhcyBhY2NvcmRpbmdseVxuICAgICAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnR9IGNvbnRhaW5lciBUaGUgQXBwJ3MgY29udGFpbmVyIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXMgVGhlIEFwcCBjYW52YXMgZWxlbWVudFxuICAgICAqIEBtZW1iZXJvZiBBcHBcbiAgICAgKi9cbiAgICBkZWZpbmVSZXNpemVPYnNlcnZlcihjb250YWluZXIsIGNhbnZhcykge1xuICAgICAgICAvLyBsaXN0ZW4gdG8gcmVzaXplIGV2ZW50c1xuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGNhbnZhcyBoYXMgYmVlbiBidWlsdFxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5jbGllbnRXaWR0aCA+IDAgJiYgY29udGFpbmVyLmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG9udCBleGNlZWQgbG9vcCBsaW1pdCBmaXJzdFxuICAgICAgICAgICAgICAgIC8vIHNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDkzODQxMjAvcmVzaXplb2JzZXJ2ZXItbG9vcC1saW1pdC1leGNlZWRlZFxuICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZW50cmllcykgfHwgIWVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG1hcCBhbmQgY2FudmFzIHNpemVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaCAhPT0gY29udGFpbmVyLmNsaWVudEhlaWdodCB8fCB0aGlzLncgIT09IGNvbnRhaW5lci5jbGllbnRXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oID0gY29udGFpbmVyLmNsaWVudEhlaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ID0gY29udGFpbmVyLmNsaWVudFdpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5oID0gY29udGFpbmVyLmNsaWVudEhlaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMudyA9IGNvbnRhaW5lci5jbGllbnRXaWR0aFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSBidXR0b24gcG9zaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy56b29tQnV0dG9ucykgdGhpcy56b29tQnV0dG9ucy5ub2RlLnN0eWxlLmxlZnQgPSB0aGlzLncgLSA1MCArICdweCdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0aGlzLmZ1bGxzY3JlZW5CdXR0b24pIHRoaXMuZnVsbHNjcmVlbkJ1dHRvbi5ub2RlLnN0eWxlLmxlZnQgPSB0aGlzLncgLSA1MCArICdweCdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIERlc3Ryb3kgdGhlIG1hcCBhbmQgaXQncyBldmVudCBsaXN0ZW5lcnNcbiAgICAgKiBUaGlzIHNob3VsZCBzaWduaWZpY2FudGx5IHJlZHVjZSB0aGUgbWVtb3J5IHVzZWQgd2hlbiBjcmVhdGluZyBhbmQgZGVzdHJveWluZyBncmlkdml6IG1hcCBpbnN0YW5jZXMgKGZvciBleGFtcGxlIGluIGxlYWZsZXQtZ3JpZHZpeilcbiAgICAgKiBAbWVtYmVyb2YgQXBwXG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgLy8gY2xlYXIgbGF5ZXJzXG4gICAgICAgIHRoaXMubGF5ZXJzID0gW11cbiAgICAgICAgdGhpcy5iZ0xheWVycyA9IFtdXG5cbiAgICAgICAgLy8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyBmcm9tIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLm1vdXNlT3ZlckhhbmRsZXIpXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlSGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCB0aGlzLm1vdXNlT3V0SGFuZGxlcilcblxuICAgICAgICAvLyByZW1vdmUgY2FudmFzXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5yZW1vdmUoKVxuXG4gICAgICAgIC8vIHJlbW92ZSBsZWdlbmRcbiAgICAgICAgdGhpcy5sZWdlbmQ/LnJlbW92ZSgpXG5cbiAgICAgICAgLy8gcmVtb3ZlIHRvb2x0aXBcbiAgICAgICAgdGhpcy50b29sdGlwLnRvb2x0aXA/LnJlbW92ZSgpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEEgbXVsdGkgcmVzb2x1dGlvbiBkYXRhc2V0IG9mIGdyaWQgY2VsbHMuXG4gKiBJdCBjb25zaXN0cyBvZiBkaWZmZXJlbnQge0BsaW5rIERhdGFzZXR9cyBmb3IgZWFjaCByZXNvbHV0aW9uLlxuICpcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTXVsdGlSZXNvbHV0aW9uRGF0YXNldCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmVzb2x1dGlvbnMgVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0cywgaW4gQ1JTIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0PnxmdW5jdGlvbihudW1iZXIpOmltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0fSBkYXRhc2V0cyBUaGUgZGF0YXNldHMgbGlzdCwgb25lIHBlciByZXNvbHV0aW9uLiBPciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGRhdGFzZXQgZnJvbSBhIHJlc29sdXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsge3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFufSB9IG9wdHMgT3B0aW9ucy4gcHJlcHJvY2VzczogQSBmdW5jdGlvbiB0byBhcHBseSBvbiBlYWNoIGRhdGFzZXQgY2VsbCB0byBwcmVwYXJlIGl0cyB2YWx1ZXMuIENhbiBiZSB1c2VkIGFsc28gdG8gc2VsZWN0IGNlbGxzIHRvIGtlZXAuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmVzb2x1dGlvbnMsIGRhdGFzZXRzLCBvcHRzID0ge30pIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0cywgaW4gQ1JTIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbnMgPSByZXNvbHV0aW9uc1xuXG4gICAgICAgIC8qKiBUaGUgZGF0YXNldHMuIElmIHRoZSBsaXN0IGlzIG5vdCBleHBsaWN0ZWx5IGRlZmluZWQsIGJ1aWxkIGl0IGZyb20gdGhlIHJlc29sdXRpb24gbGlzdCB3aXRoIHRoZSBmdW5jdGlvblxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0Pn0gKi9cbiAgICAgICAgdGhpcy5kYXRhc2V0cyA9ICh0eXBlb2YgZGF0YXNldHMgPT09ICdmdW5jdGlvbicpID8gdGhpcy5yZXNvbHV0aW9ucy5tYXAoZGF0YXNldHMpIDogZGF0YXNldHNcblxuICAgICAgICAvL3RoZXJlIG11c3QgYmUgYXMgbWFueSBkYXRhc2V0cyBhcyByZXNvbHV0aW9uc1xuICAgICAgICBpZiAodGhpcy5kYXRhc2V0cy5sZW5ndGggPiAxICYmIHRoaXMuZGF0YXNldHMubGVuZ3RoICE9IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdVbmNvbXBhdGlibGUgbnVtYmVyIG9mIGRhdGFzZXRzIGFuZCByZXNvbHV0aW9uczogJyArXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhc2V0cy5sZW5ndGggK1xuICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHV0aW9ucy5sZW5ndGhcbiAgICAgICAgICAgIClcblxuICAgICAgICAvL3NldCBkYXRhc2V0IHByZXByb2Nlc3NlcyBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKG9wdHMucHJlcHJvY2VzcykgdGhpcy5zZXRQcmVwb2Nlc3NlcyhvcHRzLnByZXByb2Nlc3MpXG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHJlbGV2YW50IGRhdGFzZXQgZm9yIGEgc3BlY2lmaWVkIHpvb20uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluUGl4ZWxzUGVyQ2VsbFxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL0RhdGFzZXRcIikuRGF0YXNldHx1bmRlZmluZWR9XG4gICAgICogKi9cbiAgICBnZXREYXRhc2V0KHosIG1pblBpeGVsc1BlckNlbGwpIHtcblxuICAgICAgICAvL3NwZWNpYWwgY2FzZSB3aGl0aCBzaW5nbGUgZGF0YXNldFxuICAgICAgICBpZiAodGhpcy5kYXRhc2V0cy5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMuZGF0YXNldHNbMF1cblxuICAgICAgICBjb25zdCBycyA9IHRoaXMucmVzb2x1dGlvbnNcbiAgICAgICAgbGV0IGkgPSAwXG4gICAgICAgIGxldCB6XyA9IHJzW2ldIC8gbWluUGl4ZWxzUGVyQ2VsbFxuICAgICAgICB3aGlsZSAoel8gPCB6ICYmIGkgPCBycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgel8gPSByc1tpXSAvIG1pblBpeGVsc1BlckNlbGxcbiAgICAgICAgfVxuICAgICAgICAvL2lmIChpID09IDApIHJldHVybiB0aGlzLmRhdGFzZXQuZGF0YXNldHNbMF07XG4gICAgICAgIC8vcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0c1tpIC0gMV07XG4gICAgICAgIGlmIChpID09IHJzLmxlbmd0aCkgcmV0dXJuIHRoaXMuZGF0YXNldHNbcnMubGVuZ3RoIC0gMV1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNldHNbaV1cbiAgICB9XG5cblxuXG4gICAgLyoqXG4gICAgICogU2V0IGEgcHJlcHJvY2VzcyBmdW5jdGlvbiBmb3IgYWxsIGRhdGFzZXRzLlxuICAgICAqIFRoaXMgaXMgYSBmdW5jdGlvbiBhcHBsaWVkIG9uIGVhY2ggY2VsbCBhZnRlciBpdCBoYXMgYmVlbiBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFufSBwcmVwcm9jZXNzXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgc2V0UHJlcG9jZXNzZXMocHJlcHJvY2Vzcykge1xuICAgICAgICBmb3IgKGxldCBkcyBvZiB0aGlzLmRhdGFzZXRzKSBkcy5wcmVwcm9jZXNzID0gcHJlcHJvY2Vzc1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gdG8gZWFzZSB0aGUgY3JlYXRpb24gb2YgbXVsdGkgcmVzb2x1dGlvbiBkYXRhc2V0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHJlc29sdXRpb25zIFRoZSByZXNvbHV0aW9ucyBvZiB0aGUgZGF0YXNldHMsIGluIENSUyBnZW9ncmFwaGljYWwgdW5pdFxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obnVtYmVyKTppbXBvcnQoXCIuL0RhdGFzZXRcIikuRGF0YXNldH0gcmVzVG9EYXRhc2V0IEZ1bmN0aW9uIHJldHVybmluZyBhIGRhdGFzZXQgZnJvbSBhIHJlc29sdXRpb25cbiAgICAgKiBAcGFyYW0geyB7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGwpOmJvb2xlYW59IH0gb3B0cyBPcHRpb25zLiBwcmVwcm9jZXNzOiBBIGZ1bmN0aW9uIHRvIGFwcGx5IG9uIGVhY2ggZGF0YXNldCBjZWxsIHRvIHByZXBhcmUgaXRzIHZhbHVlc1xuICAgICAqIEByZXR1cm5zIHtNdWx0aVJlc29sdXRpb25EYXRhc2V0fVxuICAgICAqL1xuICAgIC8qc3RhdGljIG1ha2UocmVzb2x1dGlvbnMsIHJlc1RvRGF0YXNldCwgb3B0cykge1xuICAgICAgICAvL21ha2UgZGF0YXNldHNcbiAgICAgICAgY29uc3QgZHNjID0gW11cbiAgICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzb2x1dGlvbnMpIGRzYy5wdXNoKHJlc1RvRGF0YXNldChyZXMpKVxuICAgICAgICAvL21ha2UgbXVsdGkgcmVzb2x1dGlvbiBkYXRhc2V0XG4gICAgICAgIHJldHVybiBuZXcgTXVsdGlSZXNvbHV0aW9uRGF0YXNldChkc2MsIHJlc29sdXRpb25zLCBvcHRzKVxuICAgIH0qL1xufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBEcmF3YWJsZSB9IGZyb20gXCIuL0RyYXdhYmxlLmpzXCJcblxuLyoqIEB0eXBlZGVmIHtcInNxdWFyZVwifFwiY2lyY2xlXCJ8XCJkaWFtb25kXCJ8XCJkb251dFwifFwidHJpYW5nbGVfdXBcInxcInRyaWFuZ2xlX2Rvd25cInxcInRyaWFuZ2xlX2xlZnRcInxcInRyaWFuZ2xlX3JpZ2h0XCJ8XCJub25lXCJ9IFNoYXBlICovXG5cbi8qKlxuICogdmlld1NjYWxlIHR5cGVcbiAqIFJldHVybnMgYW4gb2JqZWN0IGZyb20gYSBsaXN0IG9mIGNlbGxzLCBcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihBcnJheS48aW1wb3J0KCcuL0RhdGFzZXQuanMnKS5DZWxsPixudW1iZXIsIG51bWJlcik6Kn0gVmlld1NjYWxlICovXG5cbi8qKlxuICogQSBzdHlsZSwgdG8gc2hvdyBhIGdyaWQgZGF0YXNldC5cbiAqXG4gKiBAbW9kdWxlIGNvcmVcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFN0eWxlIGV4dGVuZHMgRHJhd2FibGUge1xuICAgIC8qKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEBwYXJhbSB7e2ZpbHRlcj86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpib29sZWFuLCBvZmZzZXQ/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCwgbnVtYmVyLCBudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfSwgdmlzaWJsZT86ZnVuY3Rpb24obnVtYmVyKTpib29sZWFuLGFscGhhPzpmdW5jdGlvbihudW1iZXIpOm51bWJlcixibGVuZE9wZXJhdGlvbj86ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24sZHJhd0Z1bj86ZnVuY3Rpb24sdmlld1NjYWxlPzpWaWV3U2NhbGV9fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEB0eXBlIHtWaWV3U2NhbGV8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLnZpZXdTY2FsZSA9IG9wdHMudmlld1NjYWxlXG5cbiAgICAgICAgLyoqIEEgZmlsdGVyIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIHRoZSBjZWxsIGxpc3QsIHRvIGZpbHRlciBvdXQgc29tZSBjZWxscyBub3QgdG8gYmUgZHJhd24gKHN1Y2ggYXMgZm9yIGV4YW1wbGUgdGhlIGNlbGxzIHdpdGggdmFsdWU9MCkuXG4gICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOmJvb2xlYW59ICovXG4gICAgICAgIHRoaXMuZmlsdGVyID0gb3B0cy5maWx0ZXIgfHwgKCgpID0+IHRydWUpXG5cbiAgICAgICAgLyoqIEFuIG9mZnNldC4gVGhpcyBpcyB0byBhbHRlciB0aGUgcG9zaXRpb24gb2YgYWxsIHN5bWJvbHMgaW4gYSBnaXZlbiBkaXJlY3Rpb24uIEluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSAqL1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9wdHMub2Zmc2V0IHx8ICgoYywgciwgeikgPT4gKHsgZHg6IDAsIGR5OiAwIH0pKVxuXG4gICAgICAgIC8qKiBBIGRyYXcgZnVuY3Rpb24gZm9yIHRoZSBzdHlsZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5kcmF3RnVuID0gb3B0cy5kcmF3RnVuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwdWJsaWNcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL0xlZ2VuZFwiKS5MZWdlbmQ+fSAqL1xuICAgICAgICB0aGlzLmxlZ2VuZHMgPSBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGw+fSBjZWxscyBUaGUgY2VsbHMgdG8gZHJhdy5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGVtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZWlyIHJlc29sdXRpb24gKGluIGdlb2dyYXBoaWMgdW5pdClcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhd0Z1bikgdGhpcy5kcmF3RnVuKGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pXG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgZHJhdyBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cbiAgICAvL2dldHRlcnMgYW5kIHNldHRlcnNcblxuICAgIC8qKiBAcmV0dXJucyB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLG51bWJlcixudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfX0gKi9cbiAgICBnZXRPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldFxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSB2YWwgQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0T2Zmc2V0KHZhbCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IHZhbFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBVcGRhdGUgbGVnZW5kcyBvZiB0aGUgc3R5bGUsIGlmIGFueVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHJldHVybnMge3RoaXN9ICovXG4gICAgdXBkYXRlTGVnZW5kcyhvcHRzKSB7XG4gICAgICAgIFN0eWxlLnVwZGF0ZUxlZ2VuZHNSZWN1cnNpdmUodGhpcy5sZWdlbmRzLCBvcHRzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIHN0YXRpYyB1cGRhdGVMZWdlbmRzUmVjdXJzaXZlKGxnLCBvcHRzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxnKSkgZm9yIChjb25zdCBsZ18gb2YgbGcpIHRoaXMudXBkYXRlTGVnZW5kc1JlY3Vyc2l2ZShsZ18sIG9wdHMpXG4gICAgICAgIGVsc2UgbGcudXBkYXRlKG9wdHMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi9MZWdlbmRcIikuTGVnZW5kPn0gbGVnZW5kc1xuICAgICAqIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIGFkZExlZ2VuZHMobGVnZW5kcykge1xuICAgICAgICBmb3IgKGxldCBsZWdlbmQgb2YgbGVnZW5kcylcbiAgICAgICAgICAgIHRoaXMubGVnZW5kcy5wdXNoKGxlZ2VuZClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcbi8vaW1wb3J0IHsgdHJhbnNpdGlvbiB9IGZyb20gXCJkMy10cmFuc2l0aW9uXCI7XG5cbi8qKlxuICogQSBnZW5lcmljIGNsYXNzIHRvIG1ha2UgYSB0b29sdGlwLlxuICogSXQgaXMgYSBkaXYgZWxlbWVudCwgd2hpY2ggY2FuIGJlIG1vdmVkIHVuZGVyIHRoZSBtb3VzZSBwb2ludGVyIGFuZCBmaWxsZWQgd2l0aCBzb21lIGluZm9ybWF0aW9uIGluIGh0bWwuXG4gKiBAbW9kdWxlIGNvcmVcbiAqL1xuZXhwb3J0IGNsYXNzIFRvb2x0aXAge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmRpdiA9IG9wdHMuZGl2IHx8ICd0b29sdGlwX2V1cm9zdGF0J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5tYXhXaWR0aCA9IG9wdHMubWF4V2lkdGggfHwgJzIwZW0nXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAnMS4yZW0nXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBvcHRzLmJhY2tncm91bmQgfHwgJ3doaXRlJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5wYWRkaW5nID0gb3B0cy5wYWRkaW5nIHx8ICc1cHgnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmJvcmRlciA9IG9wdHMuYm9yZGVyIHx8ICcwcHgnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzWydib3JkZXItcmFkaXVzJ10gPSBvcHRzWydib3JkZXItcmFkaXVzJ10gfHwgJzBweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXNbJ2JveC1zaGFkb3cnXSA9IG9wdHNbJ2JveC1zaGFkb3cnXSB8fCAnNXB4IDVweCA1cHggZ3JleSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXNbJ2ZvbnQtZmFtaWx5J10gPSBvcHRzWydmb250LWZhbWlseSddIHx8ICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJ1xuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25EdXJhdGlvbiA9IG9wdHMudHJhbnNpdGlvbkR1cmF0aW9uIHx8IDEwMFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy54T2Zmc2V0ID0gb3B0cy54T2Zmc2V0IHx8IDMwXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnlPZmZzZXQgPSBvcHRzLnlPZmZzZXQgfHwgMjBcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovIC8vIGUuZy4gdG8gcHJldmVudCBtb3VzZSBjdXJzb3IgY292ZXJpbmcgY2VsbCBiZWluZyBoaWdobGlnaHRlZFxuICAgICAgICB0aGlzLnlNb3VzZU9mZnNldCA9IG9wdHMueU1vdXNlT2Zmc2V0IHx8IDBcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMueE1vdXNlT2Zmc2V0ID0gb3B0cy54TW91c2VPZmZzZXQgfHwgMFxuICAgICAgICAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqL1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSBvcHRzLnBhcmVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHVibGljXG4gICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCJkMy1zZWxlY3Rpb25cIikuU2VsZWN0aW9ufSAqL1xuICAgICAgICB0aGlzLnRvb2x0aXAgPSBzZWxlY3QoJyMnICsgdGhpcy5kaXYpXG5cbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcC5lbXB0eSgpKSB7XG4gICAgICAgICAgICAvL2NyZWF0ZSB0b29sdGlwIERPTSBub2RlXG4gICAgICAgICAgICAvLyB0aGlzLnRvb2x0aXAgPSBzZWxlY3QoXG4gICAgICAgICAgICAvLyAgICAgJyMnICsgdGhpcy5wYXJlbnRFbGVtZW50LmlkICYmIHRoaXMucGFyZW50RWxlbWVudC5pZCAhPSAnJ1xuICAgICAgICAgICAgLy8gICAgICAgICA/ICcjJyArIHRoaXMucGFyZW50RWxlbWVudC5pZFxuICAgICAgICAgICAgLy8gICAgICAgICA6ICdib2R5J1xuICAgICAgICAgICAgLy8gKVxuICAgICAgICAgICAgdGhpcy50b29sdGlwID0gc2VsZWN0KCdib2R5JykuYXBwZW5kKCdkaXYnKS5hdHRyKCdpZCcsIHRoaXMuZGl2KVxuICAgICAgICB9XG5cbiAgICAgICAgLy9pbml0aWFsaXNlXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnbWF4LXdpZHRoJywgdGhpcy5tYXhXaWR0aClcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdvdmVyZmxvdycsICdoaWRkZW4nKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYmFja2dyb3VuZCcsIHRoaXMuYmFja2dyb3VuZClcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdwYWRkaW5nJywgdGhpcy5wYWRkaW5nKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JvcmRlcicsIHRoaXMuYm9yZGVyKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCB0aGlzWydib3JkZXItcmFkaXVzJ10pXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYm94LXNoYWRvdycsIHRoaXNbJ2JveC1zaGFkb3cnXSlcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdmb250LWZhbWlseScsIHRoaXNbJ2ZvbnQtZmFtaWx5J10pXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ29wYWNpdHknLCAnMCcpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgndGV4dC13cmFwJywgJ25vd3JhcCcpXG5cbiAgICAgICAgLy8gYXJpYS1sYWJlbHMgKHRoYW5rcyB0byB3YWhsYXRsYXMpXG4gICAgICAgIHRoaXMudG9vbHRpcC5hdHRyKCdyb2xlJywgJ3Rvb2x0aXAnKS5hdHRyKCdhcmlhLWxpdmUnLCAncG9saXRlJylcbiAgICB9XG5cbiAgICAvKiogU2hvdyB0aGUgdG9vbHRpcCAqL1xuICAgIHNob3coKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy50b29sdGlwLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLnRyYW5zaXRpb25EdXJhdGlvbikuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgIH1cblxuICAgIC8qKiBIaWRlIHRoZSB0b29sdGlwICovXG4gICAgaGlkZSgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnRvb2x0aXAudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMudHJhbnNpdGlvbkR1cmF0aW9uKS5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBjb250ZW50IG9mIHRoZSB0b29sdGlwLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gICAgICovXG4gICAgaHRtbChodG1sKSB7XG4gICAgICAgIHRoaXMudG9vbHRpcC5odG1sKGh0bWwpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9vbHRpcCBhdCB0aGUgbW91c2UgZXZlbnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxuICAgICAqL1xuICAgIHNldFBvc2l0aW9uKGV2ZW50KSB7XG4gICAgICAgIGxldCBwYXJlbnRSZWN0ID0gdGhpcy5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG5cbiAgICAgICAgbGV0IHggPSBldmVudC5wYWdlWCArIHRoaXMueE9mZnNldFxuICAgICAgICBsZXQgeSA9IGV2ZW50LnBhZ2VZIC0gdGhpcy55T2Zmc2V0XG5cbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdsZWZ0JywgeCArICdweCcpLnN0eWxlKCd0b3AnLCB5ICsgJ3B4JylcblxuICAgICAgICB0aGlzLmVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIoZXZlbnQsIHBhcmVudFJlY3QpXG4gICAgfVxuXG4gICAgLypcblx0bXkubW91c2VvdmVyID0gZnVuY3Rpb24gKGV2ZW50LCBodG1sKSB7XG5cdFx0aWYgKGh0bWwpIG15Lmh0bWwoaHRtbCk7XG5cdFx0bXkuc2V0UG9zaXRpb24oZXZlbnQpO1xuXHRcdG15LnNob3coKVxuXHRcdC8vdGhpcy5lbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyKCk7XG5cdH07XG5cdFxuXHRteS5tb3VzZW1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRteS5zZXRQb3NpdGlvbihldmVudCk7XG5cdFx0Ly90aGlzLmVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIoKTtcblx0fTtcblx0XG5cdG15Lm1vdXNlb3V0ID0gZnVuY3Rpb24gKCkge1xuXHRcdG15LmhpZGUoKTtcblx0fTsqL1xuXG4gICAgc3R5bGUoaywgdikge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy50b29sdGlwLnN0eWxlKGspXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZShrLCB2KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGF0dHIoaywgdikge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy50b29sdGlwLmF0dHIoaylcbiAgICAgICAgdGhpcy50b29sdGlwLmF0dHIoaywgdilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb24gZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lclxuICAgICAqIEBkZXNjcmlwdGlvbiBQcmV2ZW50cyB0aGUgdG9vbHRpcCBmcm9tIG92ZXJmbG93aW5nIG91dCBvZiB0aGUgQXBwIGNvbnRhaW5lciAoZW5zdXJlcyB0aGF0IHRoZSB0b29sdGlwIGlzIGluc2lkZSB0aGUgZ3JpZHZpeiBjb250YWluZXIpXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxuICAgICAqIEBwYXJhbSB7RE9NUmVjdH0gcGFyZW50UmVjdFxuICAgICAqL1xuICAgIGVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIgPSBmdW5jdGlvbiAoZXZlbnQsIHBhcmVudFJlY3QpIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLnRvb2x0aXAubm9kZSgpXG4gICAgICAgIGxldCBwYXJlbnRXaWR0aCA9IHBhcmVudFJlY3Qud2lkdGhcbiAgICAgICAgbGV0IHBhcmVudEhlaWdodCA9IHBhcmVudFJlY3QuaGVpZ2h0XG5cbiAgICAgICAgLy90b28gZmFyIHJpZ2h0XG4gICAgICAgIGlmIChub2RlLm9mZnNldExlZnQgPiBwYXJlbnRSZWN0LmxlZnQgKyBwYXJlbnRXaWR0aCAtIG5vZGUuY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gZXZlbnQueCAtIG5vZGUuY2xpZW50V2lkdGggLSB0aGlzLnhPZmZzZXRcbiAgICAgICAgICAgIG5vZGUuc3R5bGUubGVmdCA9IGxlZnQgKyAncHgnXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBtb3VzZSBjb3ZlcnMgdG9vbHRpcFxuICAgICAgICAgICAgaWYgKG5vZGUub2Zmc2V0TGVmdCArIG5vZGUuY2xpZW50V2lkdGggPiBldmVudC54KSB7XG4gICAgICAgICAgICAgICAgLy9tb3ZlIHRvb2x0aXAgbGVmdCBzbyBpdCBkb2VzbnQgY292ZXIgbW91c2VcbiAgICAgICAgICAgICAgICBsZXQgbGVmdDIgPSBldmVudC54IC0gbm9kZS5jbGllbnRXaWR0aCAtIHRoaXMueE9mZnNldFxuICAgICAgICAgICAgICAgIG5vZGUuc3R5bGUubGVmdCA9IGxlZnQyICsgJ3B4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbm9kZS5zdHlsZS50b3AgPSBub2RlLm9mZnNldFRvcCArIGNvbmZpZy55T2Zmc2V0ICsgXCJweFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy90b28gZmFyIGRvd25cbiAgICAgICAgaWYgKG5vZGUub2Zmc2V0VG9wICsgbm9kZS5jbGllbnRIZWlnaHQgPiBwYXJlbnRSZWN0LnRvcCArIHBhcmVudEhlaWdodCkge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS50b3AgPSBub2RlLm9mZnNldFRvcCAtIG5vZGUuY2xpZW50SGVpZ2h0ICsgJ3B4J1xuICAgICAgICB9XG5cbiAgICAgICAgLy90b28gZmFyIHVwXG4gICAgICAgIGlmIChub2RlLm9mZnNldFRvcCA8IHBhcmVudFJlY3QudG9wKSB7XG4gICAgICAgICAgICBub2RlLnN0eWxlLnRvcCA9IHBhcmVudFJlY3QudG9wICsgdGhpcy55T2Zmc2V0ICsgJ3B4J1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZSB9fSBHcmlkSW5mbyAqL1xuXG5pbXBvcnQgeyBkc3YgfSBmcm9tICdkMy1mZXRjaCdcbmltcG9ydCB7IERhdGFzZXQgfSBmcm9tICcuLi9jb3JlL0RhdGFzZXQuanMnXG5cbi8qKlxuICogQSBkYXRhc2V0IGNvbXBvc2VkIG9mIGEgc2luZ2xlIENTViBmaWxlIChub3QgdGlsZWQpLlxuICpcbiAqIEBtb2R1bGUgZGF0YXNldFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ1NWR3JpZCBleHRlbmRzIERhdGFzZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9NYXAuanNcIikuTWFwfSBtYXAgVGhlIG1hcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgKiBAcGFyYW0ge3twcmVwcm9jZXNzPzooZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwpOmJvb2xlYW4pLGRlbGltaXRlcj86c3RyaW5nfX0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcCwgdXJsLCByZXNvbHV0aW9uLCBvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIobWFwLCB1cmwsIHJlc29sdXRpb24sIG9wdHMpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSAqL1xuICAgICAgICB0aGlzLmNlbGxzID0gW11cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgIHRoaXMuZGVsaW1pdGVyID0gb3B0cy5kZWxpbWl0ZXIgfHwgXCIsXCJcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICogQHByaXZhdGUgICovXG4gICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xuXG4gICAgICAgIC8vZ2V0IGRhdGFcbiAgICAgICAgdGhpcy5nZXREYXRhKHVuZGVmaW5lZClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGRhdGEgd2l0aGluIGEgZ2VvZ3JhcGhpYyBlbnZlbG9wZS5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gZVxuICAgICAqL1xuICAgIGdldERhdGEoZSkge1xuICAgICAgICAvL2NoZWNrIGlmIGRhdGEgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgaWYgKHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVybiB0aGlzXG5cbiAgICAgICAgLy9sb2FkIGRhdGFcbiAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xuICAgICAgICAgICAgOyAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBkc3YodGhpcy5kZWxpbWl0ZXIsIHRoaXMudXJsKVxuXG4gICAgICAgICAgICAgICAgICAgIC8vY29udmVydCBjb29yZGluYXRlcyBpbiBudW1iZXJzXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLnggPSArYy54XG4gICAgICAgICAgICAgICAgICAgICAgICBjLnkgPSArYy55XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXByb2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wcmVwcm9jZXNzKGMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxscy5wdXNoKGMpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzID0gZGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIGNoZWNrIGlmIHJlZHJhdyBpcyBuZWNlc3NhcnlcbiAgICAgICAgICAgICAgICAgICAgLy90aGF0IGlzIGlmIHRoZSBkYXRhc2V0IGJlbG9uZ3MgdG8gYSBsYXllciB3aGljaCBpcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWxcblxuICAgICAgICAgICAgICAgICAgICAvL3JlZHJhdyBtYXBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwKSB0aGlzLm1hcC5yZWRyYXcoKVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbG9hZGVkJ1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vbWFyayBhcyBmYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKClcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGwgdGhlIHZpZXcgY2FjaGUgd2l0aCBhbGwgY2VsbHMgd2hpY2ggYXJlIHdpdGhpbiBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGV9IGV4dEdlb1xuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHVwZGF0ZVZpZXdDYWNoZShleHRHZW8pIHtcbiAgICAgICAgLy9kYXRhIG5vdCBsb2FkZWQgeWV0XG4gICAgICAgIGlmICghdGhpcy5jZWxscykgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZSA9IFtdXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aGlzLmNlbGxzKSB7XG4gICAgICAgICAgICBpZiAoK2NlbGwueCArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby54TWluKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCtjZWxsLnggLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueE1heCkgY29udGludWVcbiAgICAgICAgICAgIGlmICgrY2VsbC55ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnlNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoK2NlbGwueSAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby55TWF4KSBjb250aW51ZVxuICAgICAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZS5wdXNoKGNlbGwpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IERhdGFzZXQgfSBmcm9tICcuLi9jb3JlL0RhdGFzZXQuanMnXG5cbi8qKlxuICogQSBkYXRhc2V0IGNvbXBvc2VkIG9mIGNlbGxzIGRlZmluZWQgaW4gamF2YXNjcmlwdCwgb3IgbG9hZGVkIG91dHNpZGUgb2YgZ3JpZHZpeiBtYXAuXG4gKlxuICogQG1vZHVsZSBkYXRhc2V0XG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBKU0dyaWQgZXh0ZW5kcyBEYXRhc2V0IHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHtBcnJheS48T2JqZWN0Pn0gY2VsbHMgVGhlIGNlbGxzLlxuICAgICAqIEBwYXJhbSB7fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmVzb2x1dGlvbiwgY2VsbHMsIG9wdHMgPSB7fSkge1xuICAgICAgICBzdXBlcih1bmRlZmluZWQsIFwiXCIsIHJlc29sdXRpb24sIG9wdHMpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsPn0gKi9cbiAgICAgICAgdGhpcy5jZWxscyA9IGNlbGxzIHx8IFtdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBkYXRhIHdpdGhpbiBhIGdlb2dyYXBoaWMgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gZVxuICAgICAqL1xuICAgIGdldERhdGEoZSkgeyByZXR1cm4gdGhpcyB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSBleHRHZW9cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XG4gICAgICAgIC8vZGF0YSBub3QgbG9hZGVkIHlldFxuICAgICAgICBpZiAoIXRoaXMuY2VsbHMpIHJldHVyblxuXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGhpcy5jZWxscykge1xuICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcbiAgICAgICAgICAgIGlmICgrY2VsbC54IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnhNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoK2NlbGwueSArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby55TWluKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcbiAgICAgICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUucHVzaChjZWxsKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZSB9fSBHcmlkSW5mbyAqL1xuXG4vLyBpbnRlcm5hbFxuaW1wb3J0IHsgRGF0YXNldCB9IGZyb20gJy4uL2NvcmUvRGF0YXNldC5qcydcbi8vaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvVXRpbHMuanMnXG5cbi8vIGV4dGVybmFsXG5pbXBvcnQgeyBqc29uLCBjc3YgfSBmcm9tICdkMy1mZXRjaCdcblxuLyoqXG4gKiBBIHRpbGVkIGRhdGFzZXQsIGNvbXBvc2VkIG9mIENTViB0aWxlcy5cbiAqXG4gKiBAbW9kdWxlIGRhdGFzZXRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbGVkR3JpZCBleHRlbmRzIERhdGFzZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9NYXAuanNcIikuTWFwfSBtYXAgVGhlIG1hcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86KGZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsKTpib29sZWFuKSB9fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWFwLCB1cmwsIG9wdHMgPSB7fSkge1xuICAgICAgICBzdXBlcihtYXAsIHVybCwgMCwgb3B0cylcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGdyaWQgaW5mbyBvYmplY3QsIGZyb20gdGhlIGluZm8uanNvbiBmaWxlLlxuICAgICAgICAgKiAgQHR5cGUge0dyaWRJbmZvIHwgdW5kZWZpbmVkfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiAgKi9cbiAgICAgICAgdGhpcy5pbmZvID0gdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqIEBwcml2YXRlICAqL1xuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNhY2hlIG9mIHRoZSBsb2FkZWQgdGlsZXMuIEl0IGlzIGRvdWJsZSBpbmRleGVkOiBieSB4VCBhbmQgdGhlbiB5VC5cbiAgICAgICAgICogRXhhbXBsZTogdGhpcy5jYWNoZVt4VF1beVRdIHJldHVybnMgdGhlIHRpbGUgYXQgW3hUXVt5VF0gbG9jYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqICovXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7fVxuXG4gICAgICAgIC8vbGF1bmNoIGxvYWRpbmdcbiAgICAgICAgdGhpcy5sb2FkSW5mbygpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCB0aGUgaW5mby5qc29uIGZyb20gdGhlIHVybC5cbiAgICAgKiBAcmV0dXJucyB0aGlzXG4gICAgICovXG4gICAgbG9hZEluZm8oKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmZvICYmIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPT09ICdub3RMb2FkZWQnKSB7XG4gICAgICAgICAgICA7IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGpzb24odGhpcy51cmwgKyAnaW5mby5qc29uJylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmZvID0gZGF0YVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29sdXRpb24gPSBkYXRhLnJlc29sdXRpb25HZW9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9tYXJrIGFzIGZhaWxlZFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpXG4gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPT09ICdsb2FkZWQnIHx8IHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPT09ICdmYWlsZWQnKSlcbiAgICAgICAgICAgIHRoaXMubWFwLnJlZHJhdygpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSBhIHRpbGluZyBlbnZlbG9wZSBmcm9tIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0byBrbm93IHdoaWNoIHRpbGVzIHRvIGRvd25sb2FkIGZvciBhIGdlb2dyYXBoaWNhbCB2aWV3LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gZVxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9XG4gICAgICovXG4gICAgZ2V0VGlsaW5nRW52ZWxvcGUoZSkge1xuICAgICAgICBpZiAoIXRoaXMuaW5mbykge1xuICAgICAgICAgICAgdGhpcy5sb2FkSW5mbygpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvID0gdGhpcy5pbmZvLm9yaWdpblBvaW50LFxuICAgICAgICAgICAgciA9IHRoaXMuaW5mby5yZXNvbHV0aW9uR2VvLFxuICAgICAgICAgICAgcyA9IHRoaXMuaW5mby50aWxlU2l6ZUNlbGxcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeE1pbjogTWF0aC5mbG9vcigoZS54TWluIC0gcG8ueCkgLyAociAqIHMpKSxcbiAgICAgICAgICAgIHhNYXg6IE1hdGguZmxvb3IoKGUueE1heCAtIHBvLngpIC8gKHIgKiBzKSksXG4gICAgICAgICAgICB5TWluOiBNYXRoLmZsb29yKChlLnlNaW4gLSBwby55KSAvIChyICogcykpLFxuICAgICAgICAgICAgeU1heDogTWF0aC5mbG9vcigoZS55TWF4IC0gcG8ueSkgLyAociAqIHMpKSxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoJy4uL2NvcmUvR2VvQ2FudmFzLmpzJykuRW52ZWxvcGV9IGV4dEdlb1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGdldERhdGEoZXh0R2VvKSB7XG4gICAgICAgIC8vVE9ETyBlbXB0eSBjYWNoZSB3aGVuIGl0IGdldHMgdG9vIGJpZyA/XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbmZvIGhhcyBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAoIXRoaXMuaW5mbykgcmV0dXJuIHRoaXNcblxuICAgICAgICAvL3RpbGVzIHdpdGhpbiB0aGUgc2NvcGVcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9ICovXG4gICAgICAgIGNvbnN0IHRiID0gdGhpcy5nZXRUaWxpbmdFbnZlbG9wZShleHRHZW8pXG4gICAgICAgIGlmICghdGIpIHJldHVybiB0aGlzXG5cbiAgICAgICAgLy9ncmlkIGJvdW5kc1xuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSAqL1xuICAgICAgICBjb25zdCBnYiA9IHRoaXMuaW5mby50aWxpbmdCb3VuZHNcblxuICAgICAgICBmb3IgKGxldCB4VCA9IE1hdGgubWF4KHRiLnhNaW4sIGdiLnhNaW4pOyB4VCA8PSBNYXRoLm1pbih0Yi54TWF4LCBnYi54TWF4KTsgeFQrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeVQgPSBNYXRoLm1heCh0Yi55TWluLCBnYi55TWluKTsgeVQgPD0gTWF0aC5taW4odGIueU1heCwgZ2IueU1heCk7IHlUKyspIHtcbiAgICAgICAgICAgICAgICAvL3ByZXBhcmUgY2FjaGVcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2FjaGVbeFRdKSB0aGlzLmNhY2hlW3hUXSA9IHt9XG5cbiAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHRpbGUgZXhpc3RzIGluIHRoZSBjYWNoZVxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy5jYWNoZVt4VF1beVRdXG4gICAgICAgICAgICAgICAgaWYgKHRpbGUpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAvL21hcmsgdGlsZSBhcyBsb2FkaW5nXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt4VF1beVRdID0gXCJsb2FkaW5nXCI7XG4gICAgICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9yZXF1ZXN0IHRpbGVcbiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSAgKi9cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNlbGxzXG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gICovXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgY3N2KHRoaXMudXJsICsgeFQgKyAnLycgKyB5VCArICcuY3N2JylcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogVGlsZWRHcmlkIHBhcnNlIHN0YXJ0JylcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmVwcm9jZXNzL2ZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzID0gW11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wcmVwcm9jZXNzKGMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID09IGZhbHNlKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxscy5wdXNoKGMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxscyA9IGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCdwcmVwcm9jZXNzIC8gZmlsdGVyJylcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbWFyayBhcyBmYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbeFRdW3lUXSA9ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vc3RvcmUgdGlsZSBpbiBjYWNoZVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5mbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGlsZSBpbmZvIGlua25vd24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGlsZV8gPSBnZXRHcmlkVGlsZShjZWxscywgeFQsIHlULCB0aGlzLmluZm8pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbeFRdW3lUXSA9IHRpbGVfXG5cbiAgICAgICAgICAgICAgICAgICAgLy9pZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCdzdG9yYWdlJylcblxuICAgICAgICAgICAgICAgICAgICAvL2lmIG5vIHJlZHJhdyBpcyBzcGVjaWZpZWQsIHRoZW4gbGVhdmVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcblxuICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHJlZHJhdyBpcyByZWFsbHkgbmVlZGVkLCB0aGF0IGlzIGlmOlxuXG4gICAgICAgICAgICAgICAgICAgIC8vIDEuIHRoZSBkYXRhc2V0IGJlbG9uZ3MgdG8gYSBsYXllciB3aGljaCBpcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZHJhdyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHogPSB0aGlzLm1hcC5nZXRab29tKClcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBsYXkgb2YgdGhpcy5tYXAubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF5LnZpc2libGUgJiYgIWxheS52aXNpYmxlKHopKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXkuZ2V0RGF0YXNldCkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXkuZ2V0RGF0YXNldCh6KSAhPSB0aGlzKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3VuZCBvbmUgbGF5ZXIuIE5vIG5lZWQgdG8gc2VlayBtb3JlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVkcmF3ID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvL2lmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJ2NoZWNrIHJlZHJhdyAxJylcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZHJhdykgcmV0dXJuXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gMi4gdGhlIHRpbGUgaXMgd2l0aGluIHRoZSB2aWV3LCB0aGF0IGlzIGl0cyBnZW8gZW52ZWxvcGUgaW50ZXJzZWN0cyB0aGUgdmlld2VyIGdlbyBlbnZlbG9wZS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52ID0gdGhpcy5tYXAudXBkYXRlRXh0ZW50R2VvKClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52VCA9IHRpbGVfLmV4dEdlb1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnhNYXggPD0gZW52VC54TWluKSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudi54TWluID49IGVudlQueE1heCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnYueU1heCA8PSBlbnZULnlNaW4pIHJldHVyblxuICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnlNaW4gPj0gZW52VC55TWF4KSByZXR1cm5cblxuICAgICAgICAgICAgICAgICAgICAvL2lmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJ2NoZWNrIHJlZHJhdyAyJylcbiAgICAgICAgICAgICAgICAgICAgLy9pZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogVGlsZWRHcmlkIHBhcnNlIGVuZCcpXG5cbiAgICAgICAgICAgICAgICAgICAgLy9yZWRyYXdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9KSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICogQGFic3RyYWN0XG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gZXh0R2VvXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgdXBkYXRlVmlld0NhY2hlKGV4dEdlbykge1xuICAgICAgICAvL1xuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cblxuICAgICAgICAvL2NoZWNrIGlmIGluZm8gaGFzIGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICghdGhpcy5pbmZvKSByZXR1cm5cblxuICAgICAgICAvL3RpbGVzIHdpdGhpbiB0aGUgc2NvcGVcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9ICovXG4gICAgICAgIGNvbnN0IHRiID0gdGhpcy5nZXRUaWxpbmdFbnZlbG9wZShleHRHZW8pXG4gICAgICAgIGlmICghdGIpIHJldHVyblxuXG4gICAgICAgIC8vZ3JpZCBib3VuZHNcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gKi9cbiAgICAgICAgY29uc3QgZ2IgPSB0aGlzLmluZm8udGlsaW5nQm91bmRzXG5cbiAgICAgICAgZm9yIChsZXQgeFQgPSBNYXRoLm1heCh0Yi54TWluLCBnYi54TWluKTsgeFQgPD0gTWF0aC5taW4odGIueE1heCwgZ2IueE1heCk7IHhUKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jYWNoZVt4VF0pIGNvbnRpbnVlXG4gICAgICAgICAgICBmb3IgKGxldCB5VCA9IE1hdGgubWF4KHRiLnlNaW4sIGdiLnlNaW4pOyB5VCA8PSBNYXRoLm1pbih0Yi55TWF4LCBnYi55TWF4KTsgeVQrKykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IHRpbGVcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5jYWNoZVt4VF1beVRdXG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlIHx8IHR5cGVvZiB0aWxlID09PSAnc3RyaW5nJykgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vZ2V0IGNlbGxzXG4gICAgICAgICAgICAgICAgLy90aGlzLmNlbGxzVmlld0NhY2hlID0gdGhpcy5jZWxsc1ZpZXdDYWNoZS5jb25jYXQodGlsZS5jZWxscylcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aWxlLmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC54ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnhNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC54IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnhNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC55ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnlNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC55IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnlNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUucHVzaChjZWxsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0R3JpZFRpbGUoY2VsbHMsIHhULCB5VCwgZ3JpZEluZm8pIHtcblxuICAgIGNvbnN0IHRpbGUgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSAqL1xuICAgIHRpbGUuY2VsbHMgPSBjZWxsc1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRpbGUueCA9IHhUXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGlsZS55ID0geVRcblxuICAgIGNvbnN0IHIgPSBncmlkSW5mby5yZXNvbHV0aW9uR2VvXG4gICAgY29uc3QgcyA9IGdyaWRJbmZvLnRpbGVTaXplQ2VsbFxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5FbnZlbG9wZX0gKi9cbiAgICB0aWxlLmV4dEdlbyA9IHtcbiAgICAgICAgeE1pbjogZ3JpZEluZm8ub3JpZ2luUG9pbnQueCArIHIgKiBzICogdGlsZS54LFxuICAgICAgICB4TWF4OiBncmlkSW5mby5vcmlnaW5Qb2ludC54ICsgciAqIHMgKiAodGlsZS54ICsgMSksXG4gICAgICAgIHlNaW46IGdyaWRJbmZvLm9yaWdpblBvaW50LnkgKyByICogcyAqIHRpbGUueSxcbiAgICAgICAgeU1heDogZ3JpZEluZm8ub3JpZ2luUG9pbnQueSArIHIgKiBzICogKHRpbGUueSArIDEpLFxuICAgIH1cblxuICAgIC8vY29udmVydCBjZWxsIGNvb3JkaW5hdGVzIGludG8gZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXG4gICAgZm9yIChsZXQgY2VsbCBvZiB0aWxlLmNlbGxzKSB7XG4gICAgICAgIGNlbGwueCA9IHRpbGUuZXh0R2VvLnhNaW4gKyBjZWxsLnggKiByXG4gICAgICAgIGNlbGwueSA9IHRpbGUuZXh0R2VvLnlNaW4gKyBjZWxsLnkgKiByXG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbGVcbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuXG4vKipcbiAqXG4gKiBBIG1hcCBiYWNrZ3JvdW5kIGxheWVyIGluIFwiU2xpcHB5IG1hcFwiIFhZWiBzdGFuZGFyZC5cbiAqIFNlZSBodHRwczovL3dpa2kub3BlbnN0cmVldG1hcC5vcmcvd2lraS9TbGlwcHlfbWFwX3RpbGVuYW1lc1xuICogaHR0cHM6Ly93d3cubWFwdGlsZXIuY29tL2dvb2dsZS1tYXBzLWNvb3JkaW5hdGVzLXRpbGUtYm91bmRzLXByb2plY3Rpb24vIzYvMjcuODgvNDQuNDhcbiAqIFxuICogQG1vZHVsZSBsYXllclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZExheWVyIGV4dGVuZHMgTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgY2FjaGUsIGluZGV4ZWQgYnkgei95L3ggKi9cbiAgICAgICAgdGhpcy5jYWNoZSA9IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnVybEZ1biA9IG9wdHMudXJsRnVuIHx8ICgoeCwgeSwgeikgPT4gdGhpcy51cmwgKyB6ICsgJy8nICsgeCArICcvJyArIHkgKyAnLnBuZycpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9ucyA9IG9wdHMucmVzb2x1dGlvbnNcbiAgICAgICAgaWYgKCF0aGlzLnJlc29sdXRpb25zIHx8IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoID09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5uYlBpeCA9IG9wdHMubmJQaXggfHwgMjU2XG4gICAgICAgIC8qKiBDUlMgY29vcmRpbmF0ZXMgb2YgdG9wIGxlZnQgY29ybmVyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5vcmlnaW4gPSBvcHRzLm9yaWdpbiB8fCBbMCwgMF1cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuejAgPSBvcHRzLnowIHx8IDBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgei94L3kgY2FjaGUgZGF0YS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICAgKiBAcmV0dXJucyB7SFRNTEltYWdlRWxlbWVudHxzdHJpbmd8dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0KHosIHgsIHkpIHtcbiAgICAgICAgbGV0IGQgPSB0aGlzLmNhY2hlW3pdXG4gICAgICAgIGlmICghZCkgcmV0dXJuXG4gICAgICAgIGQgPSBkW3hdXG4gICAgICAgIGlmICghZCkgcmV0dXJuXG4gICAgICAgIHJldHVybiBkW3ldXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHoveC95IGNhY2hlIGRhdGEuXG4gICAgICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50fHN0cmluZ30gaW1nXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAgICogQHJldHVybnNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHB1dChpbWcsIHosIHgsIHkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3pdKSB0aGlzLmNhY2hlW3pdID0ge31cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3pdW3hdKSB0aGlzLmNhY2hlW3pdW3hdID0ge31cbiAgICAgICAgdGhpcy5jYWNoZVt6XVt4XVt5XSA9IGltZ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkcmF3KGdlb0NhbnZhcykge1xuXG4gICAgICAgIGlmICghdGhpcy5yZXNvbHV0aW9ucyB8fCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyByZXNvbHV0aW9ucyBwcm92aWRlZCBmb3IgYmFja2dyb3VuZCBsYXllcicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IHgwID0gdGhpcy5vcmlnaW5bMF0sXG4gICAgICAgICAgICB5MCA9IHRoaXMub3JpZ2luWzFdXG5cbiAgICAgICAgLy9nZXQgem9vbSBsZXZlbCBhbmQgcmVzb2x1dGlvblxuICAgICAgICBsZXQgel8gPSAwXG4gICAgICAgIGZvciAoel8gPSAwOyB6XyA8IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoOyB6XysrKSBpZiAodGhpcy5yZXNvbHV0aW9uc1t6X10gPCB6KSBicmVha1xuICAgICAgICB6XyAtPSAxXG4gICAgICAgIHpfID0gTWF0aC5tYXgoMCwgel8pXG4gICAgICAgIHpfID0gTWF0aC5taW4oel8sIHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoIC0gMSlcbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnJlc29sdXRpb25zLmxlbmd0aCwgeilcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5yZXNvbHV0aW9uc1t6X11cblxuICAgICAgICB6XyArPSB0aGlzLnowXG5cbiAgICAgICAgY29uc3Qgc2l6ZUcgPSB0aGlzLm5iUGl4ICogcmVzXG4gICAgICAgIGNvbnN0IHNpemUgPSBzaXplRyAvIHpcblxuICAgICAgICAvL2dldCB0aWxlIG51bWJlcnNcbiAgICAgICAgY29uc3QgeEdlb1RvVE1TID0gKHgpID0+IE1hdGguY2VpbCgoeCAtIHgwKSAvIHNpemVHKVxuICAgICAgICBjb25zdCB5R2VvVG9UTVMgPSAoeSkgPT4gTWF0aC5jZWlsKC0oeSAtIHkwKSAvIHNpemVHKVxuICAgICAgICBjb25zdCB4TWluID0geEdlb1RvVE1TKGdlb0NhbnZhcy5leHRHZW8ueE1pbikgLSAxXG4gICAgICAgIGNvbnN0IHhNYXggPSB4R2VvVG9UTVMoZ2VvQ2FudmFzLmV4dEdlby54TWF4KVxuICAgICAgICBjb25zdCB5TWF4ID0geUdlb1RvVE1TKGdlb0NhbnZhcy5leHRHZW8ueU1pbilcbiAgICAgICAgY29uc3QgeU1pbiA9IHlHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnlNYXgpIC0gMVxuXG4gICAgICAgIC8vaGFuZGxlIGltYWdlc1xuICAgICAgICBmb3IgKGxldCB4ID0geE1pbjsgeCA8IHhNYXg7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IHlNaW47IHkgPCB5TWF4OyB5KyspIHtcbiAgICAgICAgICAgICAgICAvL2dldCBpbWFnZVxuICAgICAgICAgICAgICAgIGxldCBpbWcgPSB0aGlzLmdldCh6XywgeCwgeSlcblxuICAgICAgICAgICAgICAgIC8vbG9hZCBpbWFnZVxuICAgICAgICAgICAgICAgIGlmICghaW1nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHV0KGltZywgel8sIHgsIHkpXG4gICAgICAgICAgICAgICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1dCgnZmFpbGVkJywgel8sIHgsIHkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaW1nLnNyYyA9IHRoaXMudXJsRnVuKHgsIHksIHpfKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXG4gICAgICAgICAgICAgICAgaWYgKGltZyA9PT0gJ2ZhaWxlZCcpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgaWYgKCEoaW1nIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coaW1nKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW1nLndpZHRoID09IDAgfHwgaW1nLmhlaWdodCA9PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IGltYWdlXG4gICAgICAgICAgICAgICAgY29uc3QgeEdlbyA9IHgwICsgeCAqIHNpemVHXG4gICAgICAgICAgICAgICAgY29uc3QgeUdlbyA9IHkwIC0geSAqIHNpemVHXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmRyYXdJbWFnZShpbWcsIGdlb0NhbnZhcy5nZW9Ub1BpeFgoeEdlbyksIGdlb0NhbnZhcy5nZW9Ub1BpeFkoeUdlbyksIHNpemUsIHNpemUpXG4gICAgICAgICAgICAgICAgICAgIC8vY2cuY3R4LmRyYXdJbWFnZShpbWcsIHhHZW8sIHlHZW8sIHNpemVHLCAtc2l6ZUcpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuXG4vKipcbiAqXG4gKiBBIG1hcCBiYWNrZ3JvdW5kIGxheWVyIGNvbXBvc2VkIG9mIGEgc2luZ2xlIGltYWdlIGZpbGUsIGdlb2xvY2F0ZWQuXG4gKiBcbiAqIEBtb2R1bGUgbGF5ZXJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEJhY2tncm91bmRMYXllckltYWdlIGV4dGVuZHMgTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgZmlsZSBVUkxcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgbGVmdCBjb29yZGluYXRlXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMueE1pbiA9IG9wdHMueE1pbiB8fCAwO1xuICAgICAgICAvKiogVGhlIGltYWdlIHRvcCBjb29yZGluYXRlXG4gICAgICAgICAqICBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnlNYXggPSBvcHRzLnlNYXggfHwgMDtcblxuICAgICAgICAvKiogVGhlIGltYWdlIHdpZHRoLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAyMDAwMFxuICAgICAgICAvKiogVGhlIGltYWdlIGhlaWdodCwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAyMDAwMFxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2Ugb2JqZWN0XG4gICAgICAgICAqIEB0eXBlIHtIVE1MSW1hZ2VFbGVtZW50fHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5pbWcgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XG5cbiAgICAgICAgLy91cGRhdGUgbWFwIGV4dGVudFxuICAgICAgICAvL2dlb0NhbnZhcy51cGRhdGVFeHRlbnRHZW8oMClcblxuICAgICAgICBpZiAodGhpcy5pbWcpIHtcbiAgICAgICAgICAgIC8vdGhlIGltYWdlIHdhcyBhbHJlYWR5IGRvd25sb2FkZWQ6IGRyYXcgaXRcblxuICAgICAgICAgICAgLy9jb21wdXRlIHNjcmVlbiBjb29yZGluYXRlcyBhbmQgc2l6ZSByYXRpb1xuICAgICAgICAgICAgY29uc3QgeCA9IGdlb0NhbnZhcy5nZW9Ub1BpeFgodGhpcy54TWluKVxuICAgICAgICAgICAgY29uc3QgeSA9IGdlb0NhbnZhcy5nZW9Ub1BpeFkodGhpcy55TWF4KVxuICAgICAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy5nZXRWaWV3KCkuelxuXG4gICAgICAgICAgICAvL2RyYXcgaW1hZ2VcbiAgICAgICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuaW1nLCB4LCB5LCB0aGlzLndpZHRoIC8geiwgdGhpcy5oZWlnaHQgLyB6KVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL3JldHJpZXZlIGltYWdlXG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pbWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltZyA9IG5ldyBJbWFnZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHJldHJpZXZlIGJhY2tncm91bmQgaW1hZ2UgZnJvbVwiLCB0aGlzLnVybClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vc2V0IFVSTCB0byBsYXVuY2ggdGhlIGRvd25sb2FkXG4gICAgICAgICAgICB0aGlzLmltZy5zcmMgPSB0aGlzLnVybFxuICAgICAgICB9XG5cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29yZS9MYXllci5qcydcblxuLyoqXG4gKlxuICogQSBtYXAgV01TIGJhY2tncm91bmQgbGF5ZXIuXG4gKiBcbiAqIEBtb2R1bGUgbGF5ZXJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEJhY2tncm91bmRMYXllcldNUyBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTEltYWdlRWxlbWVudHx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuaW1nID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy54TWluID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMueE1heCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLnlNaW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy55TWF4ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKiBDaGVjayBpZiB0aGUgdmlldyBoYXMgbW92ZWQgYW5kIGEgbmV3IGltYWdlIG5lZWRzIHRvIGJlIHJldHJpZXZlZC5cbiAgICAgKiBAcHJpdmF0ZSAqL1xuICAgIGhhc01vdmVkKGV4dEdlbykge1xuICAgICAgICBpZiAoKGV4dEdlby54TWluKSAhPSB0aGlzLnhNaW4pIHJldHVybiB0cnVlXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueE1heCkgIT0gdGhpcy54TWF4KSByZXR1cm4gdHJ1ZVxuICAgICAgICBlbHNlIGlmICgoZXh0R2VvLnlNaW4pICE9IHRoaXMueU1pbikgcmV0dXJuIHRydWVcbiAgICAgICAgZWxzZSBpZiAoKGV4dEdlby55TWF4KSAhPSB0aGlzLnlNYXgpIHJldHVybiB0cnVlXG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZHJhdyhnZW9DYW52YXMpIHtcblxuICAgICAgICAvL3VwZGF0ZSBtYXAgZXh0ZW50XG4gICAgICAgIGdlb0NhbnZhcy51cGRhdGVFeHRlbnRHZW8oMClcblxuICAgICAgICBpZiAoIXRoaXMuaGFzTW92ZWQoZ2VvQ2FudmFzLmV4dEdlbykgJiYgdGhpcy5pbWcpIHtcbiAgICAgICAgICAgIC8vdGhlIG1hcCBkaWQgbm90IG1vdmUgYW5kIHRoZSBpbWFnZSB3YXMgYWxyZWFkeSBkb3dubG9hZGVkOiBkcmF3IHRoZSBpbWFnZVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5kcmF3SW1hZ2UodGhpcy5pbWcsIDAsIDAsIGdlb0NhbnZhcy53LCBnZW9DYW52YXMuaClcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy90aGUgbWFwIG1vdmVkOiByZXRyaWV2ZSBuZXcgaW1hZ2VcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHRoaXMueE1pbiA9IGdlb0NhbnZhcy5leHRHZW8ueE1pblxuICAgICAgICAgICAgdGhpcy54TWF4ID0gZ2VvQ2FudmFzLmV4dEdlby54TWF4XG4gICAgICAgICAgICB0aGlzLnlNaW4gPSBnZW9DYW52YXMuZXh0R2VvLnlNaW5cbiAgICAgICAgICAgIHRoaXMueU1heCA9IGdlb0NhbnZhcy5leHRHZW8ueU1heFxuXG4gICAgICAgICAgICAvL2J1aWxkIFdNUyBVUkxcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IFtdXG4gICAgICAgICAgICB1cmwucHVzaCh0aGlzLnVybClcbiAgICAgICAgICAgIHVybC5wdXNoKFwiJndpZHRoPVwiKVxuICAgICAgICAgICAgdXJsLnB1c2goZ2VvQ2FudmFzLncpXG4gICAgICAgICAgICB1cmwucHVzaChcIiZoZWlnaHQ9XCIpXG4gICAgICAgICAgICB1cmwucHVzaChnZW9DYW52YXMuaClcbiAgICAgICAgICAgIC8vYmJveDogeG1pbiB5bWluIHhtYXggeW1heFxuICAgICAgICAgICAgdXJsLnB1c2goXCImYmJveD1cIilcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueE1pbilcbiAgICAgICAgICAgIHVybC5wdXNoKFwiLFwiKVxuICAgICAgICAgICAgdXJsLnB1c2goZ2VvQ2FudmFzLmV4dEdlby55TWluKVxuICAgICAgICAgICAgdXJsLnB1c2goXCIsXCIpXG4gICAgICAgICAgICB1cmwucHVzaChnZW9DYW52YXMuZXh0R2VvLnhNYXgpXG4gICAgICAgICAgICB1cmwucHVzaChcIixcIilcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueU1heClcblxuICAgICAgICAgICAgY29uc3QgdXJsUyA9IHVybC5qb2luKFwiXCIpXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHVybFMpXG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pbWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltZyA9IG5ldyBJbWFnZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHJldHJpZXZlIFdNUyBiYWNrZ3JvdW5kIGltYWdlIGZyb21cIiwgdXJsUylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vc2V0IFVSTCB0byBsYXVuY2ggdGhlIGRvd25sb2FkXG4gICAgICAgICAgICB0aGlzLmltZy5zcmMgPSB1cmxTXG4gICAgICAgIH1cblxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuaW1wb3J0IHsganNvbiB9IGZyb20gJ2QzLWZldGNoJ1xuXG4vKipcbiAqIEBtb2R1bGUgbGF5ZXJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEdlb0pTT05MYXllciBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggZmVhdHVyZSBhZnRlciBsb2FkaW5nLlxuICAgICAgICAgKiBJdCBjYW4gYmUgdXNlZCB0byBhcHBseSBzb21lIHNwZWNpZmljIHRyZWF0bWVudCBiZWZvcmUsIGZvcm1hdCB0aGUgbGFiZWwgZGF0YSwgcHJvamVjdCBjb29yZGluYXRlcywgZXRjLlxuICAgICAgICAgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGxhYmVsIHNob3VsZCBub3QgYmUga2VwdC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXG5cbiAgICAgICAgLy9mb3IgcG9pbnRzXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKGYsIHopID0+ICdjaXJjbGUnKVxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gcGl4ZWxcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoZiwgeikgPT4gMTApXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnN0cm9rZVN0eWxlID0gb3B0cy5zdHJva2VTdHlsZSB8fCAoKGYsIHopID0+ICdyZWQnKVxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5maWxsU3R5bGUgPSBvcHRzLmZpbGxTdHlsZSB8fCAoKGYsIHopID0+ICdibGFjaycpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBwaXhlbFxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgoZiwgeikgPT4gMilcblxuXG5cbiAgICAgICAgLy9mb3IgbGluZXNcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKChmLCB6KSA9PiAnZ3JheScpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBwaXhlbFxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKGYsIHopID0+IDIpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6QXJyYXkuPG51bWJlcj58dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmxpbmVEYXNoID0gb3B0cy5saW5lRGFzaCB8fCAoKGYsIHopID0+IHVuZGVmaW5lZClcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG9iamVjdD4gfCB1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuZnMgPSB1bmRlZmluZWRcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIERyYXcgdGhlIGxheWVyLlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkcmF3KGdlb0NhbnZhcykge1xuICAgICAgICAvL2xvYWQgZGF0YSwgaWYgbm90IGRvbmUgeWV0LlxuICAgICAgICBpZiAoIXRoaXMuZnMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZChnZW9DYW52YXMucmVkcmF3KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIGZvciAoY29uc3QgZiBvZiB0aGlzLmZzKSB7XG4gICAgICAgICAgICBjb25zdCBndCA9IGYuZ2VvbWV0cnkudHlwZVxuXG4gICAgICAgICAgICBpZiAoZ3QgPT0gXCJQb2ludFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcblxuICAgICAgICAgICAgICAgIC8vZ2V0IHN0eWxlIHBhcmFtZXRlcnMgZm9yIHRoZSBwb2ludCBmZWF0dXJlXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLnNoYXBlKGYseilcbiAgICAgICAgICAgICAgICBpZighc2hhcGUgfHwgc2hhcGU9PVwibm9uZVwiKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemUoZix6KSAqIHpcbiAgICAgICAgICAgICAgICBpZighc2l6ZSkgY29udGludWVcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJva2VTdHlsZSA9IHRoaXMuc3Ryb2tlU3R5bGUoZix6KVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGxTdHlsZSA9IHRoaXMuZmlsbFN0eWxlKGYseilcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lV2lkdGggPSB0aGlzLmxpbmVXaWR0aChmLHopICogelxuXG4gICAgICAgICAgICAgICAgLy9zZXQgY2FudmFzIGRyYXdpbmcgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgIGlmKHN0cm9rZVN0eWxlKSBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGVcbiAgICAgICAgICAgICAgICBpZihmaWxsU3R5bGUpIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gZmlsbFN0eWxlXG4gICAgICAgICAgICAgICAgaWYobGluZVdpZHRoKSBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aFxuXG4gICAgICAgICAgICAgICAgaWYgKHNoYXBlID09IFwiY2lyY2xlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZSAtIGZpbGwgYW5kIHN0cm9rZVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKGNbMF0sIGNbMV0sIHNpemUgLyAyLCAwLCAyICogTWF0aC5QSSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIGlmKGZpbGxTdHlsZSkgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgICAgICAgICAgaWYoc3Ryb2tlU3R5bGUgJiYgbGluZVdpZHRoKSBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PSBcInNxdWFyZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzcXVhcmUgLSBmaWxsIGFuZCBzdHJva2VcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnJlY3QoY1swXSAtIHNpemUgLyAyLCBjWzFdIC0gc2l6ZSAvIDIsIHNpemUsIHNpemUpXG4gICAgICAgICAgICAgICAgICAgIGlmKGZpbGxTdHlsZSkgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgICAgICAgICAgaWYoc3Ryb2tlU3R5bGUgJiYgbGluZVdpZHRoKSBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlVuZXhwZWN0ZWQgc2hhcGUgZm9yIHBvaW50IGdlb2pzb246IFwiICsgc2hhcGUpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGd0ID09IFwiTGluZVN0cmluZ1wiKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjcyA9IGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcbiAgICAgICAgICAgICAgICBpZiAoY3MubGVuZ3RoIDwgMikgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihmLCB6KVxuICAgICAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PSAnbm9uZScpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAgICAgLy9zZXQgbGluZXdpZHRoXG4gICAgICAgICAgICAgICAgY29uc3Qgd1AgPSB0aGlzLndpZHRoKGYsIHopXG4gICAgICAgICAgICAgICAgaWYgKCF3UCB8fCB3UCA8IDApIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSB3UCAqIHpcblxuICAgICAgICAgICAgICAgIC8vc2V0IGxpbmUgZGFzaFxuICAgICAgICAgICAgICAgIGNvbnN0IGxkUCA9IHRoaXMubGluZURhc2goZiwgeilcbiAgICAgICAgICAgICAgICBpZiAobGRQKSBnZW9DYW52YXMuY3R4LnNldExpbmVEYXNoKGxkUClcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBsaW5lXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGNzWzBdWzBdLCBjc1swXVsxXSlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNzLmxlbmd0aDsgaSsrKSBnZW9DYW52YXMuY3R4LmxpbmVUbyhjc1tpXVswXSwgY3NbaV1bMV0pXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlVuc3VwcG9ydGVkIGdlb21ldHJ5IHR5cGUgaW4gR2VvSlNPTkxheWVyOiBcIiArIGd0KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICAvLy4uLlxuICAgICAgICBnZW9DYW52YXMuY3R4LnNldExpbmVEYXNoKFtdKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgZGF0YSBmb3IgbGFiZWxzLCBmcm9tIFVSTCB0aGlzLnVybFxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYXN5bmMgbG9hZChjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMudXJsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgYm91bmRhcmllczogTm8gVVJMIHNwZWNpZmllZC4gJyArIHRoaXMudXJsKVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgIHRoaXMubGFiZWxzID0gW11cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBkYXRhIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVyblxuXG4gICAgICAgIC8vbG9hZCBkYXRhXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhXyA9IGF3YWl0IGpzb24odGhpcy51cmwpXG5cbiAgICAgICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxvYmplY3Q+IH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBkYXRhXy5mZWF0dXJlc1xuXG4gICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcyA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxuICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSBmYWxzZSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcy5wdXNoKGMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL3N0b3JlIGxhYmVsc1xuICAgICAgICAgICAgICAgIHRoaXMuZnMgPSBkYXRhXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG5cbiAgICAgICAgICAgIC8vcmVkcmF3XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBib3VuZGFyaWVzIGZyb20gJyArIHRoaXMudXJsKVxuICAgICAgICAgICAgdGhpcy5mcyA9IFtdXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uL2NvcmUvTGF5ZXIuanMnXG5cbi8qKlxuICogQSBsYXllciwgd2hpY2ggc3BlY2lmaWVzIGEgZGF0YXNldCB0byBiZSBzaG93biB3aXRoIHNwZWNpZmllZCBzdHlsZXMuXG4gKlxuICogQG1vZHVsZSBsYXllclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgR3JpZExheWVyIGV4dGVuZHMgTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkRhdGFzZXR8aW1wb3J0KFwiLi4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0XCIpLk11bHRpUmVzb2x1dGlvbkRhdGFzZXR9IGRhdGFzZXQgVGhlIGRhdGFzZXQgdG8gc2hvdy5cbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlN0eWxlPn0gc3R5bGVzIFRoZSBzdHlsZXMsIG9yZGVyZWQgaW4gZHJhd2luZyBvcmRlci5cbiAgICAgKiBAcGFyYW0ge3t2aXNpYmxlPzpmdW5jdGlvbihudW1iZXIpOmJvb2xlYW4sYWxwaGE/OmZ1bmN0aW9uKG51bWJlcik6bnVtYmVyLGJsZW5kT3BlcmF0aW9uPzpmdW5jdGlvbihudW1iZXIpOkdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbixtaW5QaXhlbHNQZXJDZWxsPzpudW1iZXIsY2VsbEluZm9IVE1MPzpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6c3RyaW5nfX0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRhdGFzZXQsIHN0eWxlcywgb3B0cyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuRGF0YXNldHxpbXBvcnQoXCIuLi9jb3JlL011bHRpUmVzb2x1dGlvbkRhdGFzZXRcIikuTXVsdGlSZXNvbHV0aW9uRGF0YXNldH0gKi9cbiAgICAgICAgdGhpcy5kYXRhc2V0ID0gZGF0YXNldFxuXG4gICAgICAgIC8qKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU3R5bGU+fSAqL1xuICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlc1xuXG4gICAgICAgIC8qKiBcbiAgICAgICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB3aGVuIHRoZSBkYXRhc2V0IGlzIGEgTXVsdGlSZXNvbHV0aW9uRGF0YXNldC5cbiAgICAgICAgICogSXQgZGVmaW5lcyB0aGUgbWluaW11bSBudW1iZXIgb2YgcGl4ZWxzIGEgZ3JpZCBjZWxsIHNob3VsZCBoYXZlIHRvIHNlbGVjdCB0aGUgZGF0YXNldCB0byBkaXNwbGF5IGJhc2VkIG9uIGl0cyByZXNvbHV0aW9uLlxuICAgICAgICAgKiBBIGxvdyB2YWx1ZSwgbWVhbnMgdGhhdCB0aGUgbWFwIHdpbGwgYmUgbW9yZSBkZXRhaWxsZWQgKHNtYWxsZXIgY2VsbHMpLlxuICAgICAgICAgKiBBIGhpZ2ggdmFsdWUsIG1lYW5zIHRoYXQgdGhlIG1hcCB3aWxsIGJlIGxlc3MgZGV0YWlsbGVkIChsYXJnZXIgY2VsbHMpLlxuICAgICAgICAgKiBUaGlzIHZhbHVlIHNob3VsZCBiZSBoaWdoZXIgdGhhbiAxLCBvdGhlcndpc2UgaXQgbWVhbnMgYSBncmlkIGNlbGwgaXMgc21hbGxlciB0aGFuIHRoZSBzY3JlZW4gcmVzb2x1dGlvbi5cbiAgICAgICAgICogRm9yIG1vcmUgY29tcGxleCBjZWxsIHJlcHJlc2VudGF0aW9ucyB0aGF0IHJlcXVpcmUgc29tZSBtb3JlIG1hcCBzcGFjZSwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaGlnaGVyLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm1pblBpeGVsc1BlckNlbGwgPSBvcHRzLm1pblBpeGVsc1BlckNlbGwgfHwgM1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZnVuY3Rpb24gcmV0dXJuaW5nIGNlbGwgaW5mb3JtYXRpb24gYXMgSFRNTC5cbiAgICAgICAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgdG9vbHRpcCBpbmZvcm1hdGlvbi5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsLCBudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jZWxsSW5mb0hUTUwgPSBvcHRzLmNlbGxJbmZvSFRNTCB8fCBHcmlkTGF5ZXIuZGVmYXVsdENlbGxJbmZvSFRNTFxuICAgIH1cblxuICAgIC8qKiAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzLCBsZWdlbmQpIHtcblxuICAgICAgICAvL2dldCB6b29tIGxldmVsXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9nZXQgbGF5ZXIgZGF0YXNldCBjb21wb25lbnRcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkRhdGFzZXR8dW5kZWZpbmVkfSAqL1xuICAgICAgICBjb25zdCBkc2MgPSB0aGlzLmdldERhdGFzZXQoeilcbiAgICAgICAgaWYgKCFkc2MpIHJldHVyblxuXG4gICAgICAgIC8vbGF1bmNoIGRhdGEgZG93bmxvYWQsIGlmIG5lY2Vzc2FyeVxuICAgICAgICBkc2MuZ2V0RGF0YShnZW9DYW52YXMuZXh0R2VvKVxuXG4gICAgICAgIC8vdXBkYXRlIGRhdGFzZXQgdmlldyBjYWNoZVxuICAgICAgICBkc2MudXBkYXRlVmlld0NhY2hlKGdlb0NhbnZhcy5leHRHZW8pXG5cbiAgICAgICAgLy9kcmF3IGNlbGxzLCBzdHlsZSBieSBzdHlsZVxuICAgICAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5zdHlsZXMpIHtcblxuICAgICAgICAgICAgLy9jaGVjayBpZiBzdHlsZSBpcyB2aXNpYmxlXG4gICAgICAgICAgICBpZiAocy52aXNpYmxlICYmICFzLnZpc2libGUoeikpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vc2V0IHN0eWxlIGFscGhhIGFuZCBibGVuZCBtb2RlXG4gICAgICAgICAgICAvL1RPRE86IG11bHRpcGx5IGJ5IGxheWVyIGFscGhhID9cbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZ2xvYmFsQWxwaGEgPSBzLmFscGhhID8gcy5hbHBoYSh6KSA6IDEuMFxuICAgICAgICAgICAgaWYgKHMuYmxlbmRPcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBzLmJsZW5kT3BlcmF0aW9uKHopXG5cbiAgICAgICAgICAgIC8vc2V0IGFmZmluIHRyYW5zZm9ybSB0byBkcmF3IHdpdGggZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICBnZW9DYW52YXMuc2V0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICAgICAgLy9kcmF3IHdpdGggc3R5bGVcbiAgICAgICAgICAgIHMuZHJhdyhkc2MuZ2V0Vmlld0NhY2hlKCksIGdlb0NhbnZhcywgZHNjLmdldFJlc29sdXRpb24oKSlcblxuICAgICAgICAgICAgLy9kcmF3IHN0eWxlIGZpbHRlclxuICAgICAgICAgICAgaWYgKHMuZmlsdGVyQ29sb3IpXG4gICAgICAgICAgICAgICAgcy5kcmF3RmlsdGVyKGdlb0NhbnZhcylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vYWRkIGxlZ2VuZCBlbGVtZW50XG4gICAgICAgIGlmIChsZWdlbmQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgc3R5bGUgaXMgdmlzaWJsZVxuICAgICAgICAgICAgICAgIGlmIChzLnZpc2libGUgJiYgIXMudmlzaWJsZSh6KSkgY29udGludWVcbiAgICAgICAgICAgICAgICBHcmlkTGF5ZXIuYWRkTGVnZW5kcyhsZWdlbmQsIHMubGVnZW5kcylcblxuICAgICAgICAgICAgICAgIC8vY2FzZSBmb3Igc3R5bGVzIG9mIHN0eWxlcywgbGlrZSBrZXJuZWwgc21vb3RoaW5nXG4gICAgICAgICAgICAgICAgLy9UT0RPIGRvIGJldHRlclxuICAgICAgICAgICAgICAgIGlmIChzWydzdHlsZXMnXSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMyIG9mIHNbJ3N0eWxlcyddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoczIudmlzaWJsZSAmJiAhczIudmlzaWJsZSh6KSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgIEdyaWRMYXllci5hZGRMZWdlbmRzKGxlZ2VuZCwgczIubGVnZW5kcylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgc3RhdGljIGFkZExlZ2VuZHMobGVnZW5kQ29tcCwgbGcpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGcpKSBmb3IgKGNvbnN0IGxnXyBvZiBsZykgdGhpcy5hZGRMZWdlbmRzKGxlZ2VuZENvbXAsIGxnXylcbiAgICAgICAgZWxzZSBsZWdlbmRDb21wLm5vZGUoKS5hcHBlbmQobGcuZGl2Lm5vZGUoKSlcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgcmVsZXZhbnQgZGF0YXNldCBjb21wb25lbnQgZm9yIGEgc3BlY2lmaWVkIHpvb20uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuRGF0YXNldHx1bmRlZmluZWR9XG4gICAgICogKi9cbiAgICBnZXREYXRhc2V0KHopIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNldC5nZXREYXRhc2V0KHosIHRoaXMubWluUGl4ZWxzUGVyQ2VsbCk7XG4gICAgfVxuXG5cblxuICAgIC8qKlxuICAgICAqIFNldC9nZXQgc3R5bGUgc3RhY2suXG4gICAgICogXG4gICAgICogQHBhcmFtIHt1bmRlZmluZWR8aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZXxBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT59IHN0eWxlcyBcbiAgICAgKiBAcmV0dXJucyB7IHRoaXMgfCBBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT4gfVxuICAgICAqL1xuICAgIHN0eWxlc18oc3R5bGVzKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5zdHlsZXNcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZXMpKSB0aGlzLnN0eWxlcyA9IHN0eWxlc1xuICAgICAgICAgICAgZWxzZSB0aGlzLnN0eWxlcyA9IFtzdHlsZXNdXG4gICAgICAgIGVsc2UgdGhpcy5zdHlsZXMgPSBhcmd1bWVudHNcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cblxuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgZnVuY3Rpb24gcmV0dXJuaW5nIGNlbGwgaW5mb3JtYXRpb24gYXMgSFRNTC5cbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciB0b29sdGlwIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbH0gY2VsbFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGRlZmF1bHRDZWxsSW5mb0hUTUwoY2VsbCkge1xuICAgICAgICBjb25zdCBidWYgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjZWxsKSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3gnKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3knKSBjb250aW51ZVxuICAgICAgICAgICAgYnVmLnB1c2goJzxiPicsIGtleSwgJzwvYj4nLCAnIDogJywgY2VsbFtrZXldLCAnPGJyPicpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1Zi5qb2luKCcnKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuaW1wb3J0IHsgY3N2IH0gZnJvbSAnZDMtZmV0Y2gnXG5cbi8qKiBBIGxhYmVsLiBUaGUgbmFtZSBpcyB0aGUgdGV4dCB0byBzaG93LiAoeCx5KSBhcmUgdGhlIGNvb3JkaW5hdGVzIGluIHRoZSBzYW1lIENSUyBhcyB0aGUgZ3JpZC5cbiAqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nLCB4Om51bWJlciwgeTpudW1iZXIgfX0gTGFiZWwgKi9cblxuLyoqXG4gKiBBIChnZW5lcmljKSBsYXllciBmb3IgcGxhY2VuYW1lIGxhYmVscywgdG8gYmUgc2hvd24gb24gdG9wIG9mIHRoZSBncmlkIGxheWVycy5cbiAqIFRoZSBpbnB1dCBpcyBhIENTViBmaWxlIHdpdGggdGhlIHBvc2l0aW9uICh4LCB5KSBvZiB0aGUgbGFiZWxzIGFuZCBuYW1lICsgc29tZSBvdGhlciBpbmZvIG9uIHRoZSBsYWJlbCBpbXBvcnRhbmNlLlxuICogSWYgdGhlIGxhYmVsIGRhdGEgaXMgbm90IGluIHRoZSBleHBlY3RlZCBmb3JtYXQgb3IgaW4gdGhlIHNhbWUgQ1JTIGFzIHRoZSBncmlkLCBpdCBjYW4gYmUgY29ycmVjdGVkIHdpdGggdGhlIFwicHJlcHJvY2Vzc1wiIGZ1bmN0aW9uLlxuICogVGhlIHNlbGVjdGlvbiBvZiB0aGUgbGFiZWwsIHRoZWlyIHN0eWxlIChmb250LCB3ZWlnaHQsIGV0Yy4pIGFuZCBjb2xvciBjYW4gYmUgc3BlY2lmaWVkIGRlcGVuZGluZyBvbiB0aGVpciBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cbiAqXG4gKiBAbW9kdWxlIGxheWVyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBMYWJlbExheWVyIGV4dGVuZHMgTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgVVJMIG9mIHRoZSBsYWJlbCBkYXRhLCBhcyBDU1YgZmlsZS5cbiAgICAgICAgICogVGhlIGZpbGUgc2hvdWxkIGNvbnRhaW4gdGhlIGluZm9ybWF0aW9uIGZvciBlYWNoIGxhYmVsIHN1Y2ggYXMgdGhlIHRleHQsIHRoZSBwb3NpdGlvbiBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBkaXNwbGF5IG9mIHRoZSBsYWJlbCBhY2NvcmRpbmcgdG8gdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIElmIG5lY2Vzc2FyeSwgdGhpcyBkYXRhIGNhbiBiZSByZWZvcm1hdGVkIHdpdGggdGhlICdwcmVwcm9jZXNzJyBwYXJhbWV0ZXIuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcblxuICAgICAgICAvKiogU3BlY2lmeSBpZiBhbmQgaG93IGEgbGFiZWwgc2hvdWxkIGJlIGRyYXduLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc3R5bGUgPSBvcHRzLnN0eWxlIHx8ICgoKSA9PiAnYm9sZCAxZW0gQXJpYWwnKVxuXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBjb2xvciwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAob3B0cy5kYXJrID8gKCkgPT4gJyNkZGQnIDogKCkgPT4gJyMyMjInKVxuXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBoYWxvIGNvbG9yLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuaGFsb0NvbG9yID0gb3B0cy5oYWxvQ29sb3IgfHwgKG9wdHMuZGFyayA/ICgpID0+ICcjMDAwMDAwQkInIDogKCkgPT4gJyNGRkZGRkZCQicpXG5cbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGxhYmVsIGhhbG8gd2lkdGgsIGRlcGVuZGluZyBvbiBpdHMgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oYWxvV2lkdGggPSBvcHRzLmhhbG9XaWR0aCB8fCAoKCkgPT4gNClcblxuICAgICAgICAvKiogVGhlIGFuY2hvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0LCBmcm9tIGxhYmVsIHBvc2l0aW9uLiBTZWUgSFRNTC1jYW52YXMgdGV4dEFsaWduIHByb3BlcnR5LlxuICAgICAgICAgKiBcImxlZnRcIiB8fCBcInJpZ2h0XCIgfHwgXCJjZW50ZXJcIiB8fCBcInN0YXJ0XCIgfHwgXCJlbmRcIlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7Q2FudmFzVGV4dEFsaWdufSAqL1xuICAgICAgICB0aGlzLnRleHRBbGlnbiA9IG9wdHMudGV4dEFsaWduIHx8ICdzdGFydCdcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xuICAgICAgICB0aGlzLm9mZnNldFBpeCA9IG9wdHMub2Zmc2V0UGl4IHx8IFs1LCA1XVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggbGFiZWwgYWZ0ZXIgbG9hZGluZy5cbiAgICAgICAgICogSXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc29tZSBzcGVjaWZpYyB0cmVhdG1lbnQgYmVmb3JlLCBmb3JtYXQgdGhlIGxhYmVsIGRhdGEsIHByb2plY3QgY29vcmRpbmF0ZXMsIGV0Yy5cbiAgICAgICAgICogUmV0dXJuIGZhbHNlIGlmIHRoZSBsYWJlbCBzaG91bGQgbm90IGJlIGtlcHQuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48TGFiZWw+IHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmxhYmVscyA9IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgdGhlIGxhYmVsIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XG4gICAgICAgIC8vbG9hZCBsYWJlbHMsIGlmIG5vdCBkb25lIHlldC5cbiAgICAgICAgaWYgKCF0aGlzLmxhYmVscykge1xuICAgICAgICAgICAgdGhpcy5sb2FkKGdlb0NhbnZhcy5yZWRyYXcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy90ZXh0IGFsaWduXG4gICAgICAgIGdlb0NhbnZhcy5jdHgudGV4dEFsaWduID0gdGhpcy50ZXh0QWxpZ24gfHwgJ3N0YXJ0J1xuXG4gICAgICAgIC8vbGluZSBqb2luIGFuZCBjYXBcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lSm9pbiA9ICdiZXZlbCcgLy98fCBcInJvdW5kXCIgfHwgXCJtaXRlclwiO1xuICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVDYXAgPSAnYnV0dCcgLy98fCBcInJvdW5kXCIgfHwgXCJzcXVhcmVcIjtcblxuICAgICAgICAvL2RyYXcgaW4gcGl4IGNvb3JkaW5hdGVzXG4gICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICAvL2RyYXcgbGFiZWxzLCBvbmUgYnkgb25lXG4gICAgICAgIGZvciAoY29uc3QgbGIgb2YgdGhpcy5sYWJlbHMpIHtcbiAgICAgICAgICAgIC8vZ2V0IGxhYmVsIHN0eWxlXG4gICAgICAgICAgICBjb25zdCBzdCA9IHRoaXMuc3R5bGUobGIsIHopXG4gICAgICAgICAgICBpZiAoIXN0KSBjb250aW51ZVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5mb250ID0gc3RcblxuICAgICAgICAgICAgLy9jaGVjayBsYWJlbCB3aXRoaW4gdGhlIHZpZXcsIHRvIGJlIGRyYXduXG4gICAgICAgICAgICBpZiAoIWdlb0NhbnZhcy50b0RyYXcobGIpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3Bvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCB4UCA9IGdlb0NhbnZhcy5nZW9Ub1BpeFgobGIueCkgKyB0aGlzLm9mZnNldFBpeFswXVxuICAgICAgICAgICAgY29uc3QgeVAgPSBnZW9DYW52YXMuZ2VvVG9QaXhZKGxiLnkpIC0gdGhpcy5vZmZzZXRQaXhbMV1cblxuICAgICAgICAgICAgLy9sYWJlbCBzdHJva2UsIGZvciB0aGUgaGFsb1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFsb0NvbG9yICYmIHRoaXMuaGFsb1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGMgPSB0aGlzLmhhbG9Db2xvcihsYiwgeilcbiAgICAgICAgICAgICAgICBjb25zdCBodyA9IHRoaXMuaGFsb1dpZHRoKGxiLCB6KVxuICAgICAgICAgICAgICAgIGlmIChoYyAmJiBodyAmJiBodyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IGhjXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gaHdcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VUZXh0KGxiLm5hbWUsIHhQLCB5UClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vbGFiZWwgZmlsbFxuICAgICAgICAgICAgaWYgKHRoaXMuY29sb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yKGxiLCB6KVxuICAgICAgICAgICAgICAgIGlmIChjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsVGV4dChsYi5uYW1lLCB4UCwgeVApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBkYXRhIGZvciBsYWJlbHMsIGZyb20gVVJMIHRoaXMudXJsXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhc3luYyBsb2FkKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy51cmwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBsYWJlbHM6IE5vIFVSTCBzcGVjaWZpZWQuICcgKyB0aGlzLnVybClcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgZGF0YSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5sb2FkaW5nU3RhdHVzICE9ICdub3RMb2FkZWQnKSByZXR1cm5cblxuICAgICAgICAvL2xvYWQgZGF0YVxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbG9hZGluZydcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLyoqIEB0eXBlIHsgQXJyYXkuPExhYmVsPiB9ICovXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgY3N2KHRoaXMudXJsKVxuXG4gICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFiZWxzLnB1c2goYylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vc3RvcmUgbGFiZWxzXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBkYXRhXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG5cbiAgICAgICAgICAgIC8vcmVkcmF3XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBsYWJlbHMgZnJvbSAnICsgdGhpcy51cmwpXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9jb3JlL0xlZ2VuZC5qcydcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBjb2xvciBjYXRlZ3Jvcmllcy5cbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29sb3JDYXRlZ29yeUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8vY29sL2NhdGVnb3JpZXMgYXJyYXksIGluIGRpc3BsYXkgb3JkZXJcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48W3N0cmluZyxzdHJpbmddPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvckxhYmVsID0gb3B0cy5jb2xvckxhYmVsIHx8IFtbJ2dyYXknLCAnLSddXVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29yZS9TdHlsZS5qc1wiKS5TaGFwZX0gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgJ2NpcmNsZSdcbiAgICAgICAgdGhpcy5kaW1lbnNpb24gPSBvcHRzLmRpbWVuc2lvbiB8fCB7IHI6IDggfVxuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAnZ3JheSdcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgMVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqL1xuICAgIHVwZGF0ZSgpIHtcblxuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLm1ha2VUaXRsZSgpXG5cbiAgICAgICAgLy9jYXRlZ29yaWVzXG4gICAgICAgIGNvbnN0IG5iID0gdGhpcy5jb2xvckxhYmVsLmxlbmd0aFxuICAgICAgICBpZiAobmIgPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjYXQgPSB0aGlzLmNvbG9yTGFiZWxbaV1cblxuICAgICAgICAgICAgLy9tYWtlIGRpdiBmb3IgY2F0ZWdvcnlcbiAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAvL3RvIGVuYWJsZSB2ZXJ0aWNhbCBjZW50ZXJpbmdcbiAgICAgICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKVxuXG4gICAgICAgICAgICBjb25zdCBzdyA9IHRoaXMuc3Ryb2tlV2lkdGhcblxuICAgICAgICAgICAgLy9kcmF3IGdyYXBoaWMgZWxlbWVudDogYm94IC8gY2lyY2xlXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFwZSA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoID0gdGhpcy5kaW1lbnNpb24uaCB8fCAxNVxuICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB0aGlzLmRpbWVuc2lvbi53IHx8IDIwXG4gICAgICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcgKyAyICogc3cpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoICsgMiAqIHN3KVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3JlY3QnKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigneCcsIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigneScsIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaClcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgY2F0WzBdKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuc3Ryb2tlQ29sb3IpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGFwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5kaW1lbnNpb24uciB8fCA4XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IDIgKiByICsgMiAqIHN3XG4gICAgICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIGgpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoKVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHIgKyBzdylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2N5JywgciArIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigncicsIHIpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGNhdFswXSlcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHRoaXMuc3Ryb2tlV2lkdGgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgdGhpcy5zaGFwZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy93cml0ZSBsYWJlbCB0ZXh0XG4gICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgICAgICAvL3Nob3cgb24gcmlnaHQgb2YgZ3JhcGhpY1xuICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuXG4gICAgICAgICAgICAgICAgLy9jZW50ZXIgdmVydGljYWxseVxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJhYnNvbHV0ZVwiKS5zdHlsZShcInRvcFwiLCBcIjBcIikuc3R5bGUoXCJib3R0b21cIiwgXCIwXCIpXG5cbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsICc1cHgnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxuICAgICAgICAgICAgICAgIC50ZXh0KGNhdFsxXSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXG5cbi8qKlxuICogQSBsZWdlbmQgZWxlbWVudCBmb3IgZGlzY3JldGUgY29sb3Igc3R5bGUuXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9jb2xvci1sZWdlbmRcbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29sb3JEaXNjcmV0ZUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlKTpBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBvcHRzLmNvbG9yc1xuICAgICAgICAvKiogQHByaXZhdGUgQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9TdHlsZScpLlZpZXdTY2FsZSk6QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMuYnJlYWtzID0gb3B0cy5icmVha3NcblxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAzMDBcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAxNVxuXG4gICAgICAgIHRoaXMudGlja1NpemUgPSBvcHRzLnRpY2tTaXplIHx8IDNcblxuICAgICAgICAvL2xhYmVsXG4gICAgICAgIHRoaXMuaW52ZXJ0ID0gb3B0cy5pbnZlcnRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3t2aWV3U2NhbGU6aW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlfSB9IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICAvL2dldCBjb2xvcnMgYW5kIGJyZWFrc1xuICAgICAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmNvbG9ycyhvcHRzLnZpZXdTY2FsZSlcbiAgICAgICAgY29uc3QgYnJlYWtzID0gdGhpcy5icmVha3Mob3B0cy52aWV3U2NhbGUpXG4gICAgICAgIGlmICghYnJlYWtzKSByZXR1cm5cblxuICAgICAgICAvL2NsYXNzZXNcbiAgICAgICAgY29uc3QgbmIgPSBjb2xvcnMubGVuZ3RoXG4gICAgICAgIGlmIChuYiA9PSAwKSByZXR1cm5cbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGggLyBuYlxuXG4gICAgICAgIC8vbWFrZSBzdmcgZWxlbWVudFxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdlxuICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMud2lkdGgpXG4gICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgdGhpcy5oZWlnaHQgKyB0aGlzLnRpY2tTaXplICsgMiArIDEwKVxuXG4gICAgICAgIC8vZHJhdyBncmFwaGljIGVsZW1lbnRzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgc3ZnLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCBpICogdylcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdylcbiAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgdGhpcy5oZWlnaHQpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgY29sb3JzW2ldKVxuICAgICAgICB9XG5cbiAgICAgICAgLy90aWNrIGxpbmVcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcbiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCB3ICogaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MicsIHcgKiBpKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MicsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSlcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICdibGFjaycpXG4gICAgICAgIH1cblxuICAgICAgICAvL2xhYmVsc1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcblxuICAgICAgICAgICAgbGV0IGxhYmVsID0gYnJlYWtzW2kgLSAxXVxuICAgICAgICAgICAgaWYgKGlzTmFOKGxhYmVsKSB8fCBsYWJlbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZih0aGlzLmxhYmVsRm9ybWF0KSBsYWJlbCA9IHRoaXMubGFiZWxGb3JtYXQobGFiZWwpXG5cbiAgICAgICAgICAgIC8vbGFiZWxcbiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICd0aWNrbGFiZWxfJyArIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCB3ICogaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LXdlaWdodFwiLCBcImJvbGRcIilcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtZmFtaWx5XCIsIFwiQXJpYWxcIilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdhbGlnbm1lbnQtYmFzZWxpbmUnLCAndG9wJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAgICAgICAgICAgLnRleHQobGFiZWwpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGNvbnRpbnVvdXMgY29sb3Igc3R5bGUuXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9jb2xvci1sZWdlbmRcbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29sb3JMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL2EgZnVuY3Rpb24gWzAsMV0tPmNvbG9yIGZvciBjb250aW51b3VzIGNvbG9yc1xuICAgICAgICAvL29yIGFycmF5IG9mIGNvbG9ycyBmb3IgZGlzY3JldGUgY29sb3JzXG4gICAgICAgIHRoaXMuY29sb3JTY2FsZSA9IG9wdHMuY29sb3JTY2FsZVxuXG4gICAgICAgIC8vZnVuY3Rpb24gKHRbMCwxXSkgLT4gdmFsdWUgKGZvciBsYWJlbCB0ZXh0KVxuICAgICAgICB0aGlzLnRleHRTY2FsZSA9IG9wdHMudGV4dFNjYWxlIHx8ICh0ID0+IHQpXG5cbiAgICAgICAgdGhpcy5tYXJnaW4gPSBvcHRzLm1hcmdpbiB8fCA1XG5cbiAgICAgICAgLy9yZXBsYWNlIHdpdGggbGFiZWxzID9cbiAgICAgICAgdGhpcy50aWNrU2l6ZSA9IG9wdHMudGlja1NpemUgfHwgNlxuICAgICAgICB0aGlzLnRpY2tzID0gb3B0cy50aWNrcyB8fCBNYXRoLmZsb29yKHRoaXMud2lkdGggLyA1MClcbiAgICAgICAgdGhpcy50aWNrRm9ybWF0ID0gb3B0cy50aWNrRm9ybWF0XG4gICAgICAgIHRoaXMudGlja1VuaXQgPSBvcHRzLnRpY2tVbml0XG5cbiAgICAgICAgdGhpcy5mb250U2l6ZSA9IG9wdHMuZm9udFNpemUgfHwgJzAuOGVtJ1xuICAgICAgICB0aGlzLmludmVydCA9IG9wdHMuaW52ZXJ0XG5cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMzAwXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgMTVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3t2aWV3U2NhbGU6aW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlfSB9IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICBjb25zdCBzdmdXID0gdGhpcy53aWR0aCArIDIgKiB0aGlzLm1hcmdpblxuICAgICAgICBjb25zdCBzdmdIID0gdGhpcy5oZWlnaHQgKyB0aGlzLm1hcmdpbiArIHRoaXMudGlja1NpemUgKyAxMFxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdi5hcHBlbmQoJ3N2ZycpLmF0dHIoJ3dpZHRoJywgc3ZnVykuYXR0cignaGVpZ2h0Jywgc3ZnSClcbiAgICAgICAgLy8gIDxyZWN0IHdpZHRoPVwiMzAwXCIgaGVpZ2h0PVwiMTAwXCIgc3R5bGU9XCJmaWxsOnJnYigwLDAsMjU1KTtzdHJva2Utd2lkdGg6MztzdHJva2U6cmdiKDAsMCwwKVwiIC8+XG5cbiAgICAgICAgY29uc3QgZyA9IHN2Z1xuICAgICAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgdGhpcy5tYXJnaW4gKyAnICcgKyAwICsgJyknKVxuXG4gICAgICAgIC8vZHJhdyBjb2xvciBiYXJcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGgsXG4gICAgICAgICAgICBoID0gdGhpcy5oZWlnaHRcbiAgICAgICAgY29uc3Qgc3RlcCA9IDVcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3OyBpICs9IHN0ZXApIHtcbiAgICAgICAgICAgIGxldCB0ID0gaSAvICh3IC0gMSlcbiAgICAgICAgICAgIGlmICh0aGlzLmludmVydCkgdCA9IDEgLSB0XG4gICAgICAgICAgICBnLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCBpKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgMClcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzdGVwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIHRoaXMuY29sb3JTY2FsZSh0LCBvcHRzLnZpZXdTY2FsZSkpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGlja3M7IGkrKykge1xuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHRoaXMudGlja3MgLSAxKVxuXG4gICAgICAgICAgICAvL3RpY2sgbGluZVxuICAgICAgICAgICAgZy5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MScsIHcgKiB0KVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gyJywgdyAqIHQpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgaCArIHRoaXMudGlja1NpemUpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAnYmxhY2snKVxuXG4gICAgICAgICAgICAvL3ByZXBhcmUgdGljayBsYWJlbFxuICAgICAgICAgICAgZy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICd0aWNrbGFiZWxfJyArIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCB3ICogdClcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIGggKyB0aGlzLnRpY2tTaXplICsgMilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LXdlaWdodFwiLCBcImJvbGRcIilcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtZmFtaWx5XCIsIFwiQXJpYWxcIilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgaSA9PSAwID8gJ3N0YXJ0JyA6IGkgPT0gdGhpcy50aWNrcyAtIDEgPyAnZW5kJyA6ICdtaWRkbGUnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYWxpZ25tZW50LWJhc2VsaW5lJywgJ3RvcCcpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdkb21pbmFudC1iYXNlbGluZScsICdoYW5naW5nJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICAgICAgLy8udGV4dChcIi1cIilcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIHRpY2sgbGFiZWxzXG5cbiAgICAgICAgLy9sYWJlbCB0ZXh0IGZvcm1hdFxuICAgICAgICBjb25zdCBmID0gdGhpcy50aWNrRm9ybWF0ICYmIHRoaXMudGlja0Zvcm1hdCAhPSAndGV4dCcgPyB0aGlzLnRpY2tGb3JtYXQgOiAodikgPT4gdlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGlja3M7IGkrKykge1xuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHRoaXMudGlja3MgLSAxKVxuXG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy50ZXh0U2NhbGUodCwgb3B0cy52aWV3U2NhbGUpXG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gKHYgPyBmKHYpIDogJzAnKSArICh0aGlzLnRpY2tVbml0ID8gdGhpcy50aWNrVW5pdCA6ICcnKVxuICAgICAgICAgICAgaWYgKHRleHQgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3RpY2sgbGFiZWxcbiAgICAgICAgICAgIHRoaXMuZGl2LnNlbGVjdCgnIycgKyAndGlja2xhYmVsXycgKyBpKS50ZXh0KHRleHQpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIHNlZ21lbnQgb3JpZW50YXRpb24uXG4gKlxuICogQG1vZHVsZSBsZWdlbmRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIE9yaWVudGF0aW9uTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy9vcmllbnRhdGlvblxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gb3B0cy5vcmllbnRhdGlvbiB8fCAwXG4gICAgICAgIC8vY29sb3JcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKChyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+ICdncmF5JylcbiAgICAgICAgLy93aWR0aFxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gMyAqIHopXG4gICAgICAgIC8vbGVuZ3RoXG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0cy5sZW5ndGggfHwgKChyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+IHJlc29sdXRpb24pXG5cbiAgICAgICAgLy9sYWJlbFxuICAgICAgICB0aGlzLmxhYmVsID0gb3B0cy5sYWJlbCB8fCBcIi1cIlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7eyBzdHlsZTogaW1wb3J0KFwiLi4vc3R5bGUvU2VnbWVudFN0eWxlLmpzXCIpLlNlZ21lbnRTdHlsZSwgcmVzb2x1dGlvbjogbnVtYmVyLCB6OiBudW1iZXIsIHZpZXdTY2FsZTpvYmplY3QgfX0gb3B0c1xuICAgICAqL1xuICAgIHVwZGF0ZShvcHRzKSB7XG5cbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxuXG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXG5cbiAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgY29sb3IsIHdpZHRoIGFuZCBsZW5ndGhcbiAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLmNvbG9yKG9wdHMucmVzb2x1dGlvbiwgb3B0cy56LCBvcHRzLnZpZXdTY2FsZSlcbiAgICAgICAgY29uc3Qgd2lkdGhQaXggPSB0aGlzLndpZHRoKG9wdHMucmVzb2x1dGlvbiwgb3B0cy56LCBvcHRzLnZpZXdTY2FsZSkgLyBvcHRzLnpcbiAgICAgICAgY29uc3QgbGVuZ3RoUGl4ID0gdGhpcy5sZW5ndGgob3B0cy5yZXNvbHV0aW9uLCBvcHRzLnosIG9wdHMudmlld1NjYWxlKSAvIG9wdHMuelxuXG4gICAgICAgIC8vZHJhdyBTVkcgc2VnbWVudFxuICAgICAgICBjb25zdCBzdmdTID0gTWF0aC5tYXgobGVuZ3RoUGl4LCB3aWR0aFBpeClcbiAgICAgICAgY29uc3Qgc3ZnID0gZC5hcHBlbmQoJ3N2ZycpLmF0dHIoJ3dpZHRoJywgc3ZnUykuYXR0cignaGVpZ2h0Jywgc3ZnUykuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxuXG4gICAgICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKCgtdGhpcy5vcmllbnRhdGlvbiAqIE1hdGguUEkpIC8gMTgwKVxuICAgICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbigoLXRoaXMub3JpZW50YXRpb24gKiBNYXRoLlBJKSAvIDE4MClcbiAgICAgICAgY29uc3QgZGMgPSBzdmdTICogMC41LFxuICAgICAgICAgICAgbDIgPSBsZW5ndGhQaXggKiAwLjVcbiAgICAgICAgc3ZnLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAuYXR0cigneDEnLCBkYyAtIGNvcyAqIGwyKVxuICAgICAgICAgICAgLmF0dHIoJ3kxJywgZGMgLSBzaW4gKiBsMilcbiAgICAgICAgICAgIC5hdHRyKCd4MicsIGRjICsgY29zICogbDIpXG4gICAgICAgICAgICAuYXR0cigneTInLCBkYyArIHNpbiAqIGwyKVxuICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCBjb2xvcilcbiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgd2lkdGhQaXgpXG5cblxuICAgICAgICAvL2xhYmVsXG4gICAgICAgIGQuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXG4gICAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsICc1cHgnKVxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXG4gICAgICAgICAgICAudGV4dCh0aGlzLmxhYmVsICsgKHRoaXMubGFiZWxVbml0VGV4dCA/ICcgJyA6ICcnKSArIHRoaXMubGFiZWxVbml0VGV4dClcbiAgICB9XG59XG5cbi8qKlxuICogXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBvcmllbnRhdGlvbnMgXG4gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBsYWJlbHMgXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyBcbiAqIEByZXR1cm5zICB7IEFycmF5LjxPcmllbnRhdGlvbkxlZ2VuZD4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3JpZW50YXRpb25MZWdlbmQob3JpZW50YXRpb25zLCBsYWJlbHMsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JpZW50YXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSBpID09IDAgPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkO1xuICAgICAgICBvcHRzLm9yaWVudGF0aW9uID0gb3JpZW50YXRpb25zW2ldXG4gICAgICAgIG9wdHMubGFiZWwgPSBsYWJlbHNbaV1cbiAgICAgICAgbGVnZW5kcy5wdXNoKG5ldyBPcmllbnRhdGlvbkxlZ2VuZChvcHRzKSlcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZHNcbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXG5pbXBvcnQgeyBuaWNlIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMuanMnXG5pbXBvcnQgeyBtYXggfSBmcm9tICdkMy1hcnJheSdcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBwcm9wb3J0aW9uYWwgc3ltYm9scy5cbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU2l6ZUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdGV4dCBsYWJlbCwgZnJvbSB0aGUgdmlldyBzY2FsZSBhbmQgbGlzdCBvZiBjZWxscywgcmVzb2x1dGlvbiBhbmQgem9vbVxuICAgICAgICAgKiAgQHR5cGUgeyBmdW5jdGlvbihvYmplY3QsIEFycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGw+LCBudW1iZXIsIG51bWJlcik6KG51bWJlcnxzdHJpbmcpIH0gKi9cbiAgICAgICAgdGhpcy5sYWJlbCA9IG9wdHMubGFiZWwgfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIHRoZSBsZWdlbmQgc3ltYm9sLCBpbiBnZW8gVW9NLCBmcm9tIHRoZSB2aWV3c2NhbGUsIHJlc29sdXRpb24gYW5kIHpvb21cbiAgICAgICAgICogIEB0eXBlIHsgZnVuY3Rpb24ob2JqZWN0LCBudW1iZXIsIG51bWJlcik6bnVtYmVyIH0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vc3ltYm9sXG4gICAgICAgIC8qKiAgQHR5cGUgeyhpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlNoYXBlKXxcImxpbmVcIn0gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgJ2NpcmNsZSdcblxuICAgICAgICAvL2dlbmVyYWwgY2FzZVxuICAgICAgICB0aGlzLmZpbGxDb2xvciA9IG9wdHMuZmlsbENvbG9yIHx8ICdub25lJ1xuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAnZ3JheSdcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgMVxuXG4gICAgICAgIC8vZm9yIGxpbmUgc2hhcGVcbiAgICAgICAgLy9UT0RPIHRoaXMub3JpZW50YXRpb24gPSBvcHRzLm9yaWVudGF0aW9uIHx8IDBcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgJ2dyYXknXG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0cy5sZW5ndGggfHwgKChyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+IHJlc29sdXRpb24pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7IHZpZXdTY2FsZTpvYmplY3QsIHJlc29sdXRpb246IG51bWJlciwgejpudW1iZXIsIGNlbGxzOkFycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGw+IH19IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICAvL2dldCBsYWJlbC4gTWF5IG5vdCBiZSBhIG51bWJlciAoISlcbiAgICAgICAgbGV0IGxhYmVsID0gdGhpcy5sYWJlbChvcHRzLnZpZXdTY2FsZSwgb3B0cy5jZWxscywgb3B0cy5yZXNvbHV0aW9uLCBvcHRzLnopXG5cbiAgICAgICAgLy9jb21wdXRlIHNpemUgb2Ygc3ltYm9sLCBpbiBwaXhcbiAgICAgICAgbGV0IHNpemVQaXhcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSlcbiAgICAgICAgICAgIHNpemVQaXggPSB0aGlzLnNpemUob3B0cy52aWV3U2NhbGUsIG9wdHMucmVzb2x1dGlvbiwgb3B0cy56KSAvIG9wdHMuelxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBzaXplUGl4ID0gb3B0cy52aWV3U2NhbGUoK2xhYmVsKSAvIG9wdHMuelxuICAgICAgICBpZiAoIXNpemVQaXgpIHJldHVyblxuXG4gICAgICAgIC8vZm9ybWF0IGxhYmVsLCBpZiBzcGVjaWZpZWQgYW5kIHBvc3NpYmxlXG4gICAgICAgIGlmICh0aGlzLmxhYmVsRm9ybWF0ICYmICFpc05hTigrbGFiZWwpKSBsYWJlbCA9IHRoaXMubGFiZWxGb3JtYXQobGFiZWwpXG5cbiAgICAgICAgY29uc3QgZCA9IHRoaXMuZGl2LmFwcGVuZCgnZGl2JylcbiAgICAgICAgLy90byBlbmFibGUgdmVydGljYWwgY2VudGVyaW5nXG4gICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKVxuXG4gICAgICAgIC8vZGVmYXVsdCBzdmcgY29uc3RydWN0aW9uLCBmb3Igc3F1YXJlIGFuZCBjaXJjbGVcbiAgICAgICAgY29uc3Qgc3ZnID0gKCkgPT4gZFxuICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHNpemVQaXggKyB0aGlzLnN0cm9rZVdpZHRoICsgMilcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBzaXplUGl4ICsgdGhpcy5zdHJva2VXaWR0aCArIDIpXG4gICAgICAgICAgICAuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxuXG4gICAgICAgIGlmICh0aGlzLnNoYXBlID09PSAnc3F1YXJlJykge1xuICAgICAgICAgICAgc3ZnKCkuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHNpemVQaXgpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHNpemVQaXgpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnY2lyY2xlJykge1xuICAgICAgICAgICAgLy8gPGNpcmNsZSBjeD1cIjUwXCIgY3k9XCI1MFwiIHI9XCI0MFwiIHN0cm9rZT1cImJsYWNrXCIgc3Ryb2tlLXdpZHRoPVwiM1wiIGZpbGw9XCJyZWRcIiAvPlxuICAgICAgICAgICAgY29uc3QgciA9IChzaXplUGl4ICsgdGhpcy5zdHJva2VXaWR0aCkgKiAwLjVcbiAgICAgICAgICAgIHN2ZygpLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgICAgICAgICAuYXR0cignY3gnLCByICsgMSlcbiAgICAgICAgICAgICAgICAuYXR0cignY3knLCByICsgMSlcbiAgICAgICAgICAgICAgICAuYXR0cigncicsIHIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnZG9udXQnKSB7XG4gICAgICAgICAgICAvL1RPRE9cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnZGlhbW9uZCcpIHtcbiAgICAgICAgICAgIC8vVE9ET1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdsaW5lJykge1xuXG4gICAgICAgICAgICAvL2dldCBzZWdtZW50IGxlbmd0aFxuICAgICAgICAgICAgbGV0IGxlbmd0aFBpeCA9IHRoaXMubGVuZ3RoID8gdGhpcy5sZW5ndGgob3B0cy5yZXNvbHV0aW9uLCBvcHRzLnosIG9wdHMudmlld1NjYWxlKSA6IG9wdHMucmVzb2x1dGlvblxuICAgICAgICAgICAgbGVuZ3RoUGl4IC89IG9wdHMuelxuXG4gICAgICAgICAgICBjb25zdCBzdmcgPSBkLmFwcGVuZCgnc3ZnJykuYXR0cignd2lkdGgnLCBsZW5ndGhQaXgpLmF0dHIoJ2hlaWdodCcsIHNpemVQaXgpLnN0eWxlKCcnLCAnaW5saW5lLWJsb2NrJylcblxuICAgICAgICAgICAgLy9UT0RPIG9yaWVudGF0aW9uXG4gICAgICAgICAgICAvLzxsaW5lIHgxPVwiMFwiIHkxPVwiMFwiIHgyPVwiMjAwXCIgeTI9XCIyMDBcIiBzdHlsZT1cInN0cm9rZTpyZ2IoMjU1LDAsMCk7c3Ryb2tlLXdpZHRoOjJcIiAvPlxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gxJywgMClcbiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCBzaXplUGl4IC8gMilcbiAgICAgICAgICAgICAgICAuYXR0cigneDInLCBsZW5ndGhQaXgpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgc2l6ZVBpeCAvIDIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLmNvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgc2l6ZVBpeClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgdGhpcy5zaGFwZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcbiAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcbiAgICAgICAgICAgIC50ZXh0KGxhYmVsICsgKHRoaXMubGFiZWxVbml0VGV4dCA/ICcgJyA6ICcnKSArIHRoaXMubGFiZWxVbml0VGV4dClcbiAgICB9XG59XG5cblxuXG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gdmFsdWVzIFxuICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn0gc2l6ZSBcbiAqIEBwYXJhbSB7IG9iamVjdCB9IG9wdHMgXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZUxlZ2VuZCh2YWx1ZXMsIHNpemUsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICBvcHRzLnRpdGxlID0gdmFsdWUgPT0gdmFsdWVzWzBdID8gb3B0cy50aXRsZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgb3B0cy5zaXplID0gKCkgPT4gc2l6ZSh2YWx1ZSlcbiAgICAgICAgb3B0cy5sYWJlbCA9ICgpID0+IHZhbHVlXG4gICAgICAgIGxlZ2VuZHMucHVzaChuZXcgU2l6ZUxlZ2VuZChvcHRzKSlcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZHNcbn1cblxuLyoqXG4gKiBAcGFyYW0geyBmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpOm51bWJlciB9IHZhbHVlIFxuICogQHBhcmFtIHsqfSBvcHRzIFxuICogQHJldHVybnMge0FycmF5LjxTaXplTGVnZW5kPn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpemVMZWdlbmRWaWV3U2NhbGUodmFsdWUsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGsgPSBvcHRzLmsgfHwgWzAuOSwgMC41LCAwLjIsIDAuMDVdXG4gICAgY29uc3QgbGVnZW5kcyA9IFtdXG4gICAgZm9yIChsZXQga18gb2Ygaykge1xuICAgICAgICBvcHRzLnRpdGxlID0ga18gPT0ga1swXSA/IG9wdHMudGl0bGUgOiB1bmRlZmluZWRcbiAgICAgICAgb3B0cy5sYWJlbCA9ICh2aWV3U2NhbGUsIGNlbGxzKSA9PiBuaWNlKGtfICogbWF4KGNlbGxzLCB2YWx1ZSkpXG4gICAgICAgIGxlZ2VuZHMucHVzaChuZXcgU2l6ZUxlZ2VuZChvcHRzKSlcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZHNcbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHdoaWNoIHJldHVybiBhIHN0YWNrIG9mIHNpemUgbGVnZW5kcyBmb3IgYSBkaXNjcmV0ZSBjbGFzc2lmaWNhdGlvbi5cbiAqIFxuICogQHBhcmFtIHsgQXJyYXkuPG51bWJlcj4gfSBicmVha3MgXG4gKiBAcGFyYW0geyBBcnJheS48bnVtYmVyPiB9IHNpemVzIFxuICogQHBhcmFtIHsgb2JqZWN0IH0gb3B0cyBcbiAqIEByZXR1cm5zIHtBcnJheS48U2l6ZUxlZ2VuZD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaXplRGlzY3JldGVMZWdlbmQoYnJlYWtzLCBzaXplcywgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgZiA9IG9wdHMubGFiZWxGb3JtYXQgfHwgKHggPT4geClcbiAgICBjb25zdCBsYWJlbFRleHQgPSBvcHRzLmxhYmVsVGV4dCB8fCBkZWZhdWx0TGFiZWxUZXh0KGYpXG4gICAgY29uc3QgbGVnZW5kcyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IHNpemVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSBpID09IHNpemVzLmxlbmd0aCAtIDEgPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkXG4gICAgICAgIG9wdHMuc2l6ZSA9ICgpID0+IHNpemVzW2ldXG4gICAgICAgIG9wdHMubGFiZWwgPSAoKSA9PiBsYWJlbFRleHQoYnJlYWtzW2kgLSAxXSwgYnJlYWtzW2ldKVxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRzXG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB3aGljaCByZXR1cm4gYSBzdGFjayBvZiBzaXplIGxlZ2VuZHMgZm9yIGEgZGlzY3JldGUgY2xhc3NpZmljYXRpb24gdXNpbmcgYSB2aWV3c2NhbGUuXG4gKiBAcGFyYW0geyBudW1iZXIgfSBjbGFzc051bWJlciBcbiAqIEBwYXJhbSB7IG9iamVjdCB9IG9wdHMgXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZURpc2NyZXRlVmlld1NjYWxlTGVnZW5kKGNsYXNzTnVtYmVyLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBmID0gb3B0cy5sYWJlbEZvcm1hdCB8fCAoeCA9PiB4KVxuICAgIGNvbnN0IGxhYmVsVGV4dCA9IG9wdHMubGFiZWxUZXh0IHx8IGRlZmF1bHRMYWJlbFRleHQoZilcbiAgICBjb25zdCBsZWdlbmRzID0gW11cbiAgICBjb25zdCB2aWV3U2NhbGVGdW4gPSBvcHRzLnZpZXdTY2FsZUZ1biB8fCAodCA9PiB0KSAvL1RPRE8gZG8gaXQgZGlmZmVyZW50bHk/IEF0IHNpemVsZWdlbmQgbGV2ZWwgIVxuICAgIGZvciAobGV0IGkgPSBjbGFzc051bWJlciAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSBpID09IGNsYXNzTnVtYmVyIC0gMSA/IG9wdHMudGl0bGUgOiB1bmRlZmluZWRcbiAgICAgICAgb3B0cy5zaXplID0gKHZpZXdTY2FsZSkgPT4gdmlld1NjYWxlRnVuKHZpZXdTY2FsZSkudmFsdWVzW2ldXG4gICAgICAgIG9wdHMubGFiZWwgPSAodmlld1NjYWxlKSA9PiBsYWJlbFRleHQodmlld1NjYWxlRnVuKHZpZXdTY2FsZSkuYnJlYWtzW2kgLSAxXSwgdmlld1NjYWxlRnVuKHZpZXdTY2FsZSkuYnJlYWtzW2ldKVxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRzXG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBmdW5jdGlvbiB0byBmb3JtYXQgbGFiZXJscyBmb3IgZGlzY3JldGUgc2NhbGUgbGVnZW5kcy5cbiAqIEBwYXJhbSB7IGZ1bmN0aW9uKG51bWJlcik6c3RyaW5nIH0gZm9ybWF0IFxuICogQHJldHVybnMgeyBmdW5jdGlvbihudW1iZXJ8dW5kZWZpbmVkLCBudW1iZXJ8dW5kZWZpbmVkKTogc3RyaW5nIH1cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdExhYmVsVGV4dChmb3JtYXQpIHtcbiAgICByZXR1cm4gKHYwLCB2MSkgPT4ge1xuICAgICAgICBpZiAodjAgPT0gdW5kZWZpbmVkICYmIHYxID09IHVuZGVmaW5lZCkgcmV0dXJuIFwiXCJcbiAgICAgICAgaWYgKHYxID09IHVuZGVmaW5lZCkgcmV0dXJuIFwiPiBcIiArIGZvcm1hdCh2MClcbiAgICAgICAgaWYgKHYwID09IHVuZGVmaW5lZCkgcmV0dXJuIFwiPCBcIiArIGZvcm1hdCh2MSlcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh2MCkgKyBcIiAtIFwiICsgZm9ybWF0KHYxKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXG5cbi8qKlxuICpcbiAqIEBtb2R1bGUgbGVnZW5kXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBUcml2YXJpYXRlTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy9jbGFzc2lmaWVyXG4gICAgICAgIHRoaXMuY2xhc3NpZmllciA9IG9wdHMuY2xhc3NpZmllclxuXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8IDE1MFxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbG9yID0gdGhpcy5zZWxlY3Rpb25Db2xvciB8fCBcInJlZFwiXG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG9wdHMudG9vbHRpcFxuICAgICAgICB0aGlzLnRleHRzID0gb3B0cy50ZXh0c1xuXG4gICAgICAgIHRoaXMubGVmdFRleHQgPSBvcHRzLmxlZnRUZXh0IHx8IFwiQ2F0ZWdvcnkgMFwiXG4gICAgICAgIHRoaXMudG9wVGV4dCA9IG9wdHMudG9wVGV4dCB8fCBcIkNhdGVnb3J5IDFcIlxuICAgICAgICB0aGlzLnJpZ2h0VGV4dCA9IG9wdHMucmlnaHRUZXh0IHx8IFwiQ2F0ZWdvcnkgMlwiXG5cbiAgICAgICAgdGhpcy5jZW50ZXJDb2VmZmljaWVudCA9IG9wdHMuY2VudGVyQ29lZmZpY2llbnQgfHwgdGhpcy5jbGFzc2lmaWVyLmNlbnRlckNvZWZmaWNpZW50XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7fSB9IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICBjb25zdCBzcXJ0M292ZXIyID0gMC44NjYwMjVcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGgsIGggPSB3ICogc3FydDNvdmVyMlxuICAgICAgICBjb25zdCBjbGFzc2lmaWVyID0gdGhpcy5jbGFzc2lmaWVyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbG9yID0gdGhpcy5zZWxlY3Rpb25Db2xvclxuICAgICAgICBjb25zdCBzZWxlY3Rpb25TdHJva2VXaWR0aCA9IDBcbiAgICAgICAgY29uc3QgdHQgPSB0aGlzLnRvb2x0aXBcbiAgICAgICAgY29uc3QgdGV4dHMgPSB0aGlzLnRleHRzIHx8IHt9XG5cbiAgICAgICAgY29uc3QgcGFkZGluZyA9IDJcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSAxMlxuXG4gICAgICAgIC8vbWFrZSBzdmcgZWxlbWVudFxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdlxuICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcgKyBzZWxlY3Rpb25TdHJva2VXaWR0aClcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoICsgNCAqIHBhZGRpbmcgKyAyICogZm9udFNpemUpXG5cbiAgICAgICAgLy90b3AgbGFiZWxcbiAgICAgICAgc3ZnLmFwcGVuZChcInRleHRcIikuYXR0cihcInhcIiwgdyAvIDIpLmF0dHIoXCJ5XCIsIHBhZGRpbmcgKyBmb250U2l6ZSkudGV4dCh0aGlzLnRvcFRleHQpLmF0dHIoXCJmb250LXNpemVcIiwgZm9udFNpemUpXG4gICAgICAgICAgICAuYXR0cihcInRleHQtYW5jaG9yXCIsIFwibWlkZGxlXCIpXG4gICAgICAgIC8vbGVmdCBsYWJlbFxuICAgICAgICBzdmcuYXBwZW5kKFwidGV4dFwiKS5hdHRyKFwieFwiLCAwKS5hdHRyKFwieVwiLCAzICogcGFkZGluZyArIDIgKiBmb250U2l6ZSArIGgpLnRleHQodGhpcy5sZWZ0VGV4dCkuYXR0cihcImZvbnQtc2l6ZVwiLCBmb250U2l6ZSlcbiAgICAgICAgICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgXCJzdGFydFwiKVxuICAgICAgICAvL3JpZ2h0IGxhYmVsXG4gICAgICAgIHN2Zy5hcHBlbmQoXCJ0ZXh0XCIpLmF0dHIoXCJ4XCIsIHcpLmF0dHIoXCJ5XCIsIDMgKiBwYWRkaW5nICsgMiAqIGZvbnRTaXplICsgaCkudGV4dCh0aGlzLnJpZ2h0VGV4dCkuYXR0cihcImZvbnQtc2l6ZVwiLCBmb250U2l6ZSlcbiAgICAgICAgICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgXCJlbmRcIilcblxuXG5cbiAgICAgICAgLy90cmlhbmdsZSBncm91cFxuICAgICAgICBjb25zdCBnID0gc3ZnLmFwcGVuZChcImdcIikuYXR0cihcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZShcIiArIChzZWxlY3Rpb25TdHJva2VXaWR0aCAvIDIpICsgXCIgXCIgKyAoc2VsZWN0aW9uU3Ryb2tlV2lkdGggLyAyICsgKDIgKiBwYWRkaW5nICsgZm9udFNpemUpKSArIFwiKVwiKVxuXG4gICAgICAgIC8vY29tbW9uIGZ1bmN0aW9uIGZvciB0cmlhbmdsZSBwYXRjaGVzXG4gICAgICAgIGNvbnN0IHNldEF0dHJpYnV0ZXMgPSAoZWx0LCBjb2xvciwgdGV4dCkgPT4ge1xuICAgICAgICAgICAgLy9lbHQucmFpc2UoKTtcbiAgICAgICAgICAgIGVsdC5hdHRyKCdmaWxsJywgY29sb3IpXG4gICAgICAgICAgICAgICAgLy8uYXR0cihcInN0cm9rZVwiLCBjb2xvck92ZXIpXG4gICAgICAgICAgICAgICAgLy8uYXR0cihcInN0cm9rZS13aWR0aFwiLCAwKVxuICAgICAgICAgICAgICAgIC8vLmF0dHIoXCJzdHJva2UtbGluZWpvaW5cIiwgXCJyb3VuZFwiKVxuICAgICAgICAgICAgICAgIC5vbihcIm1vdXNlb3ZlclwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvKnRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTsgc2VsZWN0KHRoaXMpLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgc2VsZWN0aW9uU3Ryb2tlV2lkdGgpOyovXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdCh0aGlzKS5hdHRyKCdmaWxsJywgc2VsZWN0aW9uQ29sb3IpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXR0IHx8ICF0ZXh0KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHR0Lmh0bWwodGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIHR0LnNldFBvc2l0aW9uKGUpO1xuICAgICAgICAgICAgICAgICAgICB0dC5zaG93KClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5vbihcIm1vdXNlb3V0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLypzZWxlY3QodGhpcykuYXR0cihcInN0cm9rZS13aWR0aFwiLCAwKTsqL1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3QodGhpcykuYXR0cignZmlsbCcsIGNvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR0KSB0dC5oaWRlKClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYgKHR0ICYmIHRleHQpIGVsdC5vbihcIm1vdXNlbW92ZVwiLCBmdW5jdGlvbiAoZSkgeyB0dC5zZXRQb3NpdGlvbihlKSB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb25zdCBbYzAsIGMxLCBjMl0gPSBjbGFzc2lmaWVyLmNlbnRlclxuXG4gICAgICAgIC8vdHJhcGV6aXVtIHMwXG4gICAgICAgIGNvbnN0IHQwID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIFwiMCxcIiArIGggKyBcIiBcIiArIHcgLyAzICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3IC8gMiArIFwiLFwiICsgaCAqIDIgLyAzICsgXCIgXCIgKyB3IC8gNiArIFwiLFwiICsgaCAqIDIgLyAzKVxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQwLCBjbGFzc2lmaWVyLmNvbG9yc1swXSwgdGV4dHNbXCIwXCJdKVxuICAgICAgICAvL3RyYXBleml1bSBzMVxuICAgICAgICBjb25zdCB0MSA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCB3IC8gMiArIFwiLDAgXCIgKyB3ICogMiAvIDMgKyBcIixcIiArIGggLyAzICsgXCIgXCIgKyB3IC8gMiArIFwiLFwiICsgaCAqIDIgLyAzICsgXCIgXCIgKyB3IC8gMyArIFwiLFwiICsgaCAvIDMpXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDEsIGNsYXNzaWZpZXIuY29sb3JzWzFdLCB0ZXh0c1tcIjFcIl0pXG4gICAgICAgIC8vdHJhcGV6aXVtIHMyXG4gICAgICAgIGNvbnN0IHQyID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKiA1IC8gNiArIFwiLFwiICsgMiAqIGggLyAzICsgXCIgXCIgKyB3IC8gMiArIFwiLFwiICsgaCAqIDIgLyAzICsgXCIgXCIgKyB3ICogMiAvIDMgKyBcIixcIiArIGgpXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDIsIGNsYXNzaWZpZXIuY29sb3JzWzJdLCB0ZXh0c1tcIjJcIl0pXG4gICAgICAgIC8vdHJpYW5nbGUgczBcbiAgICAgICAgY29uc3QgdDBfID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgLyAyICsgXCIsXCIgKyBoICogMiAvIDMgKyBcIiBcIiArIHcgKiA1IC8gNiArIFwiLFwiICsgaCAqIDIgLyAzICsgXCIgXCIgKyB3ICogMiAvIDMgKyBcIixcIiArIGggLyAzKVxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQwXywgY2xhc3NpZmllci5taXhDb2xvcnNbMF0sIHRleHRzW1wiMTJcIl0pXG4gICAgICAgIC8vdHJpYW5nbGUgczFcbiAgICAgICAgY29uc3QgdDFfID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgLyAyICsgXCIsXCIgKyBoICogMiAvIDMgKyBcIiBcIiArIHcgLyAzICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICogMiAvIDMgKyBcIixcIiArIGgpXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDFfLCBjbGFzc2lmaWVyLm1peENvbG9yc1sxXSwgdGV4dHNbXCIwMlwiXSlcbiAgICAgICAgLy90cmlhbmdsZSBzMlxuICAgICAgICBjb25zdCB0Ml8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyAvIDIgKyBcIixcIiArIGggKiAyIC8gMyArIFwiIFwiICsgdyAvIDYgKyBcIixcIiArIGggKiAyIC8gMyArIFwiIFwiICsgdyAvIDMgKyBcIixcIiArIGggLyAzKVxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQyXywgY2xhc3NpZmllci5taXhDb2xvcnNbMl0sIHRleHRzW1wiMDFcIl0pXG5cbiAgICAgICAgLy9jZW50ZXJcbiAgICAgICAgaWYgKHRoaXMuY2VudGVyQ29lZmZpY2llbnQpIHtcbiAgICAgICAgICAgIC8vVE9ETyBtYWtlIGl0IGFuIGhleGFnb24gIVxuICAgICAgICAgICAgY29uc3QgY2VudGVyID0gZy5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2N4JywgdyAvIDIpLmF0dHIoJ2N5JywgaCAqIDIgLyAzKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgdGhpcy5jZW50ZXJDb2VmZmljaWVudCAqIGggLyAzKVxuICAgICAgICAgICAgc2V0QXR0cmlidXRlcyhjZW50ZXIsIGNsYXNzaWZpZXIuY2VudGVyQ29sb3IsIHRleHRzW1wiY2VudGVyXCJdKVxuICAgICAgICB9XG5cblxuICAgICAgICAvKlxuICAgICAgICBsZXQgbWlkZGxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBsZWZ0XywgYm90dG9tXywgcmlnaHRfXG4gICAgICAgIGlmICghdGhpcy5yZWFsKSB7XG5cbiAgICAgICAgICAgIC8vMCBsZWZ0IHRyaWFuZ2xlXG4gICAgICAgICAgICBsZWZ0ID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCBcIjAsXCIgKyBoICsgXCIgXCIgKyAodyAvIDMpICsgXCIsXCIgKyBoICsgXCIgXCIgKyAodyAvIDYpICsgXCIsXCIgKyAoMiAqIGggLyAzKSlcbiAgICAgICAgICAgIC8vMSB0b3AgdHJpYW5nbGVcbiAgICAgICAgICAgIHRvcCA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAzKSArIFwiLFwiICsgKGggLyAzKSArIFwiIFwiICsgKHcgKiAyIC8gMykgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3IC8gMikgKyBcIiwwXCIpXG4gICAgICAgICAgICAvLzIgcmlnaHQgdHJpYW5nbGVcbiAgICAgICAgICAgIHJpZ2h0ID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAqIDIgLyAzKSArIFwiLFwiICsgaCArIFwiIFwiICsgdyArIFwiLFwiICsgaCArIFwiIFwiICsgKHcgKiA1IC8gNikgKyBcIixcIiArICgyICogaCAvIDMpKVxuICAgICAgICAgICAgLy9taWRkbGUgdHJpYW5nbGVcbiAgICAgICAgICAgIG1pZGRsZSA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAyKSArIFwiLFwiICsgKGggLyAzKSArIFwiIFwiICsgKHcgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikgKyBcIiBcIiArICgzICogdyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSlcbiAgICAgICAgICAgIC8vMDEgbGVmdCB0cmFwZXppdW1cbiAgICAgICAgICAgIGxlZnRfID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDYpICsgXCIsXCIgKyAoaCAqIDIgLyAzKSArIFwiIFwiICsgKHcgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikgKyBcIiBcIiArICh3IC8gMikgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3IC8gMykgKyBcIixcIiArIChoIC8gMykpXG4gICAgICAgICAgICAvLzAyIGJvdHRvbSB0cmFwZXppdW1cbiAgICAgICAgICAgIGJvdHRvbV8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMykgKyBcIixcIiArIChoKSArIFwiIFwiICsgKDIgKiB3IC8gMykgKyBcIixcIiArIChoKSArIFwiIFwiICsgKHcgKiAzIC8gNCkgKyBcIixcIiArIChoICogNSAvIDYpICsgXCIgXCIgKyAodyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSlcbiAgICAgICAgICAgIC8vMTIgcmlnaHQgdHJhcGV6aXVtXG4gICAgICAgICAgICByaWdodF8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMikgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3ICogMyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSArIFwiIFwiICsgKHcgKiA1IC8gNikgKyBcIixcIiArIChoICogMiAvIDMpICsgXCIgXCIgKyAodyAqIDIgLyAzKSArIFwiLFwiICsgKGggLyAzKSlcblxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAvL21pZGRsZSB0cmlhbmdsZVxuICAgICAgICAgICAgbWlkZGxlID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDIpICsgXCIsMCAwLFwiICsgaCArIFwiIFwiICsgdyArIFwiLFwiICsgaClcblxuICAgICAgICAgICAgLy9kcmF3IHRyYXBleml1bVxuICAgICAgICAgICAgLy9kcmF3IGxhcmdlIHRyYXBleml1bSBmaXJzdFxuICAgICAgICAgICAgZm9yIChsZXQgaV8gPSAyOyBpXyA+PSAwOyBpXy0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuY2xhc3NpZmllci5sb3dJbmRleFtpX11cbiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5jbGFzc2lmaWVyLmxvd1RocmVzaG9sZFtpXVxuICAgICAgICAgICAgICAgIGlmIChpID09IDIpXG4gICAgICAgICAgICAgICAgICAgIC8vMDEgbGVmdCB0cmFwZXppdW1cbiAgICAgICAgICAgICAgICAgICAgbGVmdF8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyAvIDIgKyBcIiwwIDAsXCIgKyBoICsgXCIgXCIgKyB3ICogciArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxICsgcikgLyAyICsgXCIsXCIgKyByICogaClcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vMDIgYm90dG9tIHRyYXBleml1bVxuICAgICAgICAgICAgICAgICAgICBib3R0b21fID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIFwiMCxcIiArIGggKyBcIiBcIiArIHcgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKiAoMSAtIHIgLyAyKSArIFwiLFwiICsgaCAqICgxIC0gcikgKyBcIiBcIiArIHIgKiB3IC8gMiArIFwiLFwiICsgaCAqICgxIC0gcikpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAvLzEyIHJpZ2h0IHRyYXBleml1bVxuICAgICAgICAgICAgICAgICAgICByaWdodF8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyArIFwiLFwiICsgaCArIFwiIFwiICsgdyAvIDIgKyBcIiwwIFwiICsgdyAqICgxIC0gcikgLyAyICsgXCIsXCIgKyBoICogciArIFwiIFwiICsgdyAqICgxIC0gcikgKyBcIixcIiArIGgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZHJhdyB0cmlhbmdsZXNcbiAgICAgICAgICAgIC8vZHJhdyBsYXJnZSB0cmlhbmdsZXMgZmlyc3RcbiAgICAgICAgICAgIGZvciAobGV0IGlfID0gMjsgaV8gPj0gMDsgaV8tLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmNsYXNzaWZpZXIuaGlnaEluZGV4W2lfXVxuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmNsYXNzaWZpZXIuaGlnaFRocmVzaG9sZFtpXVxuXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gMilcbiAgICAgICAgICAgICAgICAgICAgLy8yIHJpZ2h0IHRyaWFuZ2xlXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKiByICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICogKDEgKyByKSAvIDIgKyBcIixcIiArIGggKiByKVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgLy8xIHRvcCB0cmlhbmdsZVxuICAgICAgICAgICAgICAgICAgICB0b3AgPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAyKSArIFwiLDAgXCIgKyB3ICogciAvIDIgKyBcIixcIiArIGggKiAoMSAtIHIpICsgXCIgXCIgKyB3ICogKDEgLSByIC8gMikgKyBcIixcIiArIGggKiAoMSAtIHIpKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgLy8wIGxlZnQgdHJpYW5nbGVcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCBcIjAsXCIgKyBoICsgXCIgXCIgKyB3ICogKDEgLSByKSArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxIC0gcikgLyAyICsgXCIsXCIgKyBoICogcilcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9Ki9cblxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge1wiZmxhZ1wifFwicGllY2hhcnRcInxcInJpbmdcInxcInNlZ21lbnRcInxcInJhZGFyXCJ8XCJhZ2VweXJhbWlkXCJ8XCJoYWxmdG9uZVwifSBDb21wb3NpdGlvblR5cGUgKi9cblxuLyoqXG4gKiBBIHN0eWxlIHNob3dpbmcgdGhlIGNvbXBvc2l0aW9uIG9mIGEgdG90YWwgaW4gZGlmZmVyZW50IGNhdGVnb3JpZXMsIHdpdGggZGlmZmVyZW50IGNvbG9yIGh1ZXMuXG4gKiBJdCBjb25zaXN0cyBvZiBhIHN5bWJvbCB3aXRoIGRpZmZlcmVudCBwYXJ0cywgd2hvc2Ugc2l6ZSByZWZsZWN0IHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhdGVnb3J5LlxuICogRm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgc3ltYm9scywgQHNlZSBDb21wb3NpdGlvblR5cGVcbiAqIFRoZSBzeW1ib2wgY2FuIGJlIHNjYWxlZCBkZXBlbmRpbmcgb24gdGhlIGNlbGwgaW1wb3J0YW5jZS5cbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGlvblN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpY3Rpb25hcnkgKHN0cmluZyAtPiBjb2xvcikgd2hpY2ggZ2l2ZSB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeS5cbiAgICAgICAgICogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3JcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHR5cGUgb2YgZGVjb21wb3NpdGlvbiBzeW1ib2wgb2YgYSBjZWxsLCBAc2VlIENvbXBvc2l0aW9uVHlwZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLCBudW1iZXIsb2JqZWN0KTpDb21wb3NpdGlvblR5cGV9ICovXG4gICAgICAgIHRoaXMudHlwZSA9IG9wdHMudHlwZSB8fCAoKCkgPT4gXCJmbGFnXCIpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiBhIGNlbGwgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoYywgcikgPT4gcikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEZvciBzdHlsZSB0eXBlcyB3aXRoIHN0cmlwZXMgKGZsYWcsIHNlZ21lbnQpLCB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHN0cmlwZXMgKDAgZm9yIGhvcml6b250YWwsIG90aGVyIGZvciB2ZXJ0aWNhbCkuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnN0cmlwZXNPcmllbnRhdGlvbiA9IG9wdHMuc3RyaXBlc09yaWVudGF0aW9uIHx8ICgoKSA9PiAwKSAvLyhjLHIseix2cykgPT4gLi4uXG5cbiAgICAgICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGFuIG9mZnNldCBhbmdsZSBmb3IgYSByYWRhciwgaGFsZnRvbmUgb3IgcGllIGNoYXJ0IHN0eWxlLlxuICAgICAgICAgKiBUaGUgYW5nbGUgaXMgc3BlY2lmaWVkIGluIGRlZ3JlZS4gVGhlIHJvdGF0aW9uIGlzIGFudGktY2xvY2t3aXNlLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vZmZzZXRBbmdsZSA9IG9wdHMub2Zmc2V0QW5nbGUgfHwgKCgpID0+IDApIC8vKGMscix6LHZzKSA9PiAuLi5cblxuICAgICAgICAvKiogVGhlIGZ1bmN0aW9uIHNwZWNpZnlpbmcgdGhlIGhlaWdodCBvZiB0aGUgYWdlIHB5cmFtaWQsIGluIGdlbyB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5hZ2VQeXJhbWlkSGVpZ2h0ID0gb3B0cy5hZ2VQeXJhbWlkSGVpZ2h0IHx8ICgoYywgcikgPT4gcikgLy8oYyxyLHosdnMpID0+IC4uLlxuXG4gICAgICAgIC8qKiBGb3IgcGllIGNoYXJ0LCB0aGlzIGlzIHBhcmFtZXRlciBmb3IgaW50ZXJuYWwgcmFkaXVzLCBzbyB0aGF0IHRoZSBwaWUgY2hhcnQgbG9va3MgbGlrZSBhIGRvbnV0LlxuICAgICAgICAgKiAwIGZvciBub3JtYWwgcGllIGNoYXJ0cywgMC41IHRvIGVtcHR5IGhhbGYgb2YgdGhlIHJhZGl1cy5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yID0gb3B0cy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yIHx8IDBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNxdWFyZXMgZGVwZW5kaW5nIG9uIHRoZWlyIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9uYiBjYXRlZ29yaWVzIC0gdXNlZCBmb3IgcmFkYXIgYW5kIGFnZXB5cmFtaWRcbiAgICAgICAgY29uc3QgbmJDYXQgPSBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKS5sZW5ndGhcblxuICAgICAgICAvL2RyYXcgY2FsbHNcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuXG4gICAgICAgICAgICAvL3NpemVcbiAgICAgICAgICAgIGNvbnN0IHNHID0gdGhpcy5zaXplID8gdGhpcy5zaXplKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiByZXNvbHV0aW9uXG4gICAgICAgICAgICBpZiAoIXNHKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIC8vZ2V0IHN5bWJvbCB0eXBlXG4gICAgICAgICAgICBjb25zdCB0eXBlXyA9IHRoaXMudHlwZSA/IHRoaXMudHlwZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogJ2ZsYWcnXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBjZW50ZXIgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IHhjID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgPyAwIDogcmVzb2x1dGlvbiAqIDAuNSlcbiAgICAgICAgICAgIGNvbnN0IHljID0gY2VsbC55ICsgb2Zmc2V0LmR5ICsgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgPyAwIDogcmVzb2x1dGlvbiAqIDAuNSlcblxuICAgICAgICAgICAgLy9jb21wdXRlIG9mZnNldCBhbmdsZSwgd2hlbiByZWxldmFudFxuICAgICAgICAgICAgY29uc3Qgb2ZmQW5nID0gdGhpcy5vZmZzZXRBbmdsZSA/ICh0aGlzLm9mZnNldEFuZ2xlKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgKiBNYXRoLlBJKSAvIDE4MCA6IDBcblxuICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgfHwgdHlwZV8gPT09ICdyYWRhcicgfHwgdHlwZV8gPT09ICdoYWxmdG9uZScpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBjZWxsIGNhdGVnb3J5IG1heCB2YWx1ZVxuICAgICAgICAgICAgICAgIGxldCBtYXhWYWwgPSAtSW5maW5pdHlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9ICtjZWxsW2tleV1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgPiBtYXhWYWwpIG1heFZhbCA9IHZcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2N1bXVsXG4gICAgICAgICAgICAgICAgbGV0IGN1bXVsID0gMFxuICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnICYmIHRoaXMuYWdlUHlyYW1pZEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgY3VtdWwgPSAocmVzb2x1dGlvbiAtIHRoaXMuYWdlUHlyYW1pZEhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpKSAvIDJcbiAgICAgICAgICAgICAgICBpZiAodHlwZV8gPT09ICdyYWRhcicgfHwgdHlwZV8gPT09ICdoYWxmdG9uZScpIGN1bXVsID0gTWF0aC5QSSAvIDIgKyBvZmZBbmdcblxuICAgICAgICAgICAgICAgIC8vY29tcHV0ZSB0aGUgaW5jcmVtZW50LCB3aGljaCBpcyB0aGUgdmFsdWUgdG8gaW5jcmVtZW50IHRoZSBjdW11bCBmb3IgZWFjaCBjYXRlZ29yeVxuICAgICAgICAgICAgICAgIGNvbnN0IGluY3IgPVxuICAgICAgICAgICAgICAgICAgICB0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICh0aGlzLmFnZVB5cmFtaWRIZWlnaHQgPyB0aGlzLmFnZVB5cmFtaWRIZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHJlc29sdXRpb24pIC8gbmJDYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZV8gPT09ICdyYWRhcicgfHwgdHlwZV8gPT09ICdoYWxmdG9uZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgyICogTWF0aC5QSSkgLyBuYkNhdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYgKGluY3IgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHN5bWJvbCB0eXBlOicgKyB0eXBlXylcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IFtjb2x1bW4sIGNvbG9yXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZV8gPT09ICdhZ2VweXJhbWlkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY2F0ZWdvcnkgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgY2F0ZWdvcnkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgY2F0ZWdvcnkgbGVuZ3RoIC0gaW4gZ2VvXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gKHNHICogdmFsKSAvIG1heFZhbFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxSZWN0KHhjICsgKHJlc29sdXRpb24gLSB3RykgLyAyLCB5YyArIGN1bXVsLCB3RywgaW5jcilcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGhlaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gaW5jclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAncmFkYXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBjYXRlZ29yeSBjb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xvclxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2dldCBjYXRlZ3JveSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY2VsbFtjb2x1bW5dXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBjYXRlZ29yeSByYWRpdXMgLSBpbiBnZW9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zdCByRyA9IHRoaXMucmFkaXVzKHZhbCwgciwgc3RhdCwgY2VsbFN0YXQsIHopXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByRyA9IChzRyAvIDIpICogTWF0aC5zcXJ0KHZhbCAvIG1heFZhbClcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGFuZ3VsYXIgc2VjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4YywgeWMpXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyh4YywgeWMsIHJHLCBjdW11bCAtIGluY3IsIGN1bXVsKVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGFuZ3VsYXIgc2VjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdoYWxmdG9uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNhdGVnb3J5IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNhdGVncm95IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjZWxsW2NvbHVtbl1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGNhdGVnb3J5IHJhZGl1cyAtIGluIGdlb1xuICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByRyA9IHNHICogMC4zMzMgKiBNYXRoLnNxcnQodmFsIC8gbWF4VmFsKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgY2lyY2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YyArIHJlc29sdXRpb24gKiAwLjI1ICogTWF0aC5jb3MoY3VtdWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljICsgcmVzb2x1dGlvbiAqIDAuMjUgKiBNYXRoLnNpbihjdW11bCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgckcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogTWF0aC5QSVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGFuZ3VsYXIgc2VjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sIHR5cGU6JyArIHR5cGVfKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2NvbXB1dGUgdG90YWxcbiAgICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uIG9mIE9iamVjdC5rZXlzKHRoaXMuY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSArY2VsbFtjb2x1bW5dXG4gICAgICAgICAgICAgICAgICAgIGlmICghdikgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRvdGFsIHx8IGlzTmFOKHRvdGFsKSkgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBkZWNvbXBvc2l0aW9uIHN5bWJvbFxuICAgICAgICAgICAgICAgIGxldCBjdW11bCA9IDBcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gcmVzb2x1dGlvbiAqICgxIC0gc0cgLyByZXNvbHV0aW9uKSAqIDAuNVxuICAgICAgICAgICAgICAgIGNvbnN0IG9yaSA9IHRoaXMuc3RyaXBlc09yaWVudGF0aW9uKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IFtjb2x1bW4sIGNvbG9yXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAvL2dldCBzaGFyZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZSA9IGNlbGxbY29sdW1uXSAvIHRvdGFsXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hhcmUgfHwgaXNOYU4oc2hhcmUpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAvL2RyYXcgc3ltYm9sIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnZmxhZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBmbGFnIHN0cmlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ob3Jpem9udGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsUmVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgZCArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgZCArIGN1bXVsICogc0cgKyBvZmZzZXQuZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHNHXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ZlcnRpY2FsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsUmVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgZCArIGN1bXVsICogc0cgKyBvZmZzZXQuZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueSArIGQgKyBvZmZzZXQuZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlICogc0csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAncGllY2hhcnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgcGllIGNoYXJ0IGFuZ3VsYXIgc2VjdG9yXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBhbmdsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGExID0gY3VtdWwgKiAyICogTWF0aC5QSVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYTIgPSAoY3VtdWwgKyBzaGFyZSkgKiAyICogTWF0aC5QSVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXdcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHhjLCB5YylcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKHhjLCB5Yywgc0cgKiAwLjUsIGExICsgb2ZmQW5nLCBhMiArIG9mZkFuZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5hcmMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0cgKiAwLjUgKiB0aGlzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGExICsgb2ZmQW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMiArIG9mZkFuZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguY2xvc2VQYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKHhjLCB5YywgTWF0aC5zcXJ0KDEgLSBjdW11bCkgKiBzRyAqIDAuNSwgMCwgMiAqIE1hdGguUEkpXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAnc2VnbWVudCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHNlY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3RyA9IChzRyAqIHNHKSAvIHJlc29sdXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgKHJlc29sdXRpb24gLSB3RykgLyAyICsgY3VtdWwgKiB3RyArIG9mZnNldC5keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiB3R1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92ZXJ0aWNhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGN1bXVsICogcmVzb2x1dGlvbiArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgKHJlc29sdXRpb24gLSB3RykgLyAyICsgb2Zmc2V0LmR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdHXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHN5bWJvbCB0eXBlOicgKyB0eXBlXylcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGN1bXVsICs9IHNoYXJlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcbmltcG9ydCB7IHJhbmRvbU5vcm1hbCB9IGZyb20gJ2QzLXJhbmRvbSdcbmltcG9ydCB7IGNoZWNrV2ViR0xTdXBwb3J0LCBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZyB9IGZyb20gJy4uL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmcuanMnXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xuXG4vKipcbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBEb3REZW5zaXR5U3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbnVtYmVyIG9mIGRvdHMgZm9yIGEgY2VsbCB2YWx1ZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmRvdE51bWJlciA9IG9wdHMuZG90TnVtYmVyIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbiAvIDEwMCkvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogVGhlIGNvbG9yIG9mIHRoZSBkb3RzLiBTYW1lIGNvbG9yIGZvciBhbGwgZG90cyB3aXRoaW4gYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0ZGNTczMycpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgZG90cywgaW4gZ2VvIHVuaXQuIFNhbWUgc2l6ZSBmb3IgYWxsIGNlbGxzLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLCBudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuZG90U2l6ZSA9IG9wdHMuZG90U2l6ZSB8fCAoKHJlc29sdXRpb24sIHopID0+IDEuNSAqIHopIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2lnbWEgb2YgdGhlIGRvdHMgZGlzdHJpYnV0aW9uLiBTYW1lIHZhbHVlIGZvciBhbGwgY2VsbHMuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsIG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaWdtYSA9IG9wdHMuc2lnbWEgfHwgKChyZXNvbHV0aW9uLCB6KSA9PiByZXNvbHV0aW9uIC8gMikvLyhjLHIseix2cykgPT4ge31cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2dldCBzaXplXG4gICAgICAgIGNvbnN0IHNHZW8gPSB0aGlzLmRvdFNpemUgPyB0aGlzLmRvdFNpemUocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHpcblxuICAgICAgICAvL21ha2UgcmFuZG9tIGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IHNpZyA9IHRoaXMuc2lnbWEgPyB0aGlzLnNpZ21hKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiByZXNvbHV0aW9uICogMC40XG4gICAgICAgIGNvbnN0IHJhbmQgPSByYW5kb21Ob3JtYWwoMCwgc2lnKVxuXG4gICAgICAgIGlmIChjaGVja1dlYkdMU3VwcG9ydCgpKSB7XG4gICAgICAgICAgICAvL2NyZWF0ZSBjYW52YXMgYW5kIHdlYmdsIHJlbmRlcmVyXG4gICAgICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhnZW9DYW52YXMudyArICcnLCBnZW9DYW52YXMuaCArICcnKVxuICAgICAgICAgICAgaWYgKCFjdldHTCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHdlYkdMJylcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9jcmVhdGUgd2ViR0wgcHJvZ3JhbVxuICAgICAgICAgICAgY29uc3QgcHJvZyA9IG5ldyBXZWJHTFNxdWFyZUNvbG9yaW5nKGN2V0dMLmdsLCBzR2VvIC8geilcblxuICAgICAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uIC8gMlxuXG4gICAgICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vbnVtYmVyIG9mIGRvdHNcbiAgICAgICAgICAgICAgICBjb25zdCBkb3ROdW1iZXIgPSB0aGlzLmRvdE51bWJlcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG5cbiAgICAgICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAgICAgLy9jZWxsIGNlbnRlclxuICAgICAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgcjJcbiAgICAgICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIG9mZnNldC5keSArIHIyXG5cbiAgICAgICAgICAgICAgICAvL2NvbnZlcnQgY29sb3JcbiAgICAgICAgICAgICAgICBjb25zdCBjYyA9IGNvbG9yKGNvbClcbiAgICAgICAgICAgICAgICBpZiAoIWNjKSByZXR1cm5cblxuICAgICAgICAgICAgICAgIC8vcmFuZG9tIHBvaW50c1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGRvdE51bWJlcjsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBwcm9nLmFkZFBvaW50RGF0YTIoY3ggKyByYW5kKCksIGN5ICsgcmFuZCgpLCBjYy5yLCBjYy5nLCBjYy5iLCBjYy5vcGFjaXR5KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2RyYXdcbiAgICAgICAgICAgIHByb2cuZHJhdyhnZW9DYW52YXMuZ2V0V2ViR0xUcmFuc2Zvcm0oKSlcblxuICAgICAgICAgICAgLy9kcmF3IGluIGNhbnZhcyBnZW9cbiAgICAgICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKGN2V0dMLmNhbnZhcywgMCwgMClcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuXG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgICAgICAvL251bWJlciBvZiBkb3RzXG4gICAgICAgICAgICAgICAgY29uc3QgZG90TnVtYmVyID0gdGhpcy5kb3ROdW1iZXIoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuXG4gICAgICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgICAgIC8vZHJhdyByYW5kb20gZG90c1xuICAgICAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAvIDIsXG4gICAgICAgICAgICAgICAgICAgIGN5ID0gY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBkb3ROdW1iZXI7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxSZWN0KGN4ICsgcmFuZCgpLCBjeSArIHJhbmQoKSwgc0dlbywgc0dlbylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgbWFwIH0gZnJvbSAnZDMtYXJyYXknXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5pbXBvcnQgeyBsb2FkSW1hZ2UgfSBmcm9tICcuLi91dGlscy91dGlscy5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBJbWFnZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xuXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgaW1hZ2UgVVJMIG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmltYWdlID0gb3B0cy5pbWFnZSB8fCAoKCkgPT4gJycpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2Ugc2l6ZSBpbiBncm91bmQgbWV0ZXJzXG4gICAgICAgICAqICBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICAgICAgICAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKVxuXG4gICAgICAgIC8qKiBEaWN0aW9ubmFyeSBvZiBwcmVsb2FkZWQgaW1hZ2VzLiB1cmwgLT4gaW1hZ2VcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgdGhpcy5jYWNoZSA9IHt9XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgYXN5bmMgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnosXG4gICAgICAgICAgICByZXNvbHV0aW9uUGl4ID0gcmVzb2x1dGlvbiAvIHpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9kcmF3IGluIHNjcmVlbiBjb29yZGluYXRlc1xuICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgLy9cbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuXG4gICAgICAgICAgICAvL2dldCBjZWxsIGltYWdlIHVybFxuICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5pbWFnZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgICAgICBpZiAoIXVybCkgY29udGludWVcblxuICAgICAgICAgICAgLy9zaXplIGFuZCBwb3NpdGlvbiB2YWx1ZXNcbiAgICAgICAgICAgIGxldCBzaXplUGl4ID0gdGhpcy5zaXplKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgLyB6XG4gICAgICAgICAgICBpZiAoIXNpemVQaXgpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IGltYWdlIGZyb20gY2FjaGVcbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5jYWNoZVt1cmxdXG5cbiAgICAgICAgICAgIC8vbG9hZGluZywga2VlcCB3YWl0aW5nXG4gICAgICAgICAgICBpZiAoaW1hZ2UgPT0gXCJsb2FkaW5nXCIpIHJldHVybjtcblxuICAgICAgICAgICAgLy9ubyBpbWFnZTogbG9hZCBpdFxuICAgICAgICAgICAgZWxzZSBpZiAoIWltYWdlKSB7XG4gICAgICAgICAgICAgICAgLy90YWcgYXMgbG9hZGluZ1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbdXJsXSA9IFwibG9hZGluZ1wiXG5cbiAgICAgICAgICAgICAgICAvL2RlZmluZSBpbWFnZVxuICAgICAgICAgICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpXG4gICAgICAgICAgICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9zdG9yZSBpbWFnZSBkYXRhIGluIGNhY2hlIGFuZCByZWRyYXdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt1cmxdID0gaW1nXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5yZWRyYXcoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHJldHJpZXZlIGltYWdlIGZyb21cIiwgdXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3NldCBVUkwgdG8gbGF1bmNoIHRoZSBkb3dubG9hZFxuICAgICAgICAgICAgICAgIGltZy5zcmMgPSB1cmxcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgaW1hZ2VcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gKHJlc29sdXRpb25QaXggLSBzaXplUGl4KSAvIDJcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmRyYXdJbWFnZShpbWFnZSwgZ2VvQ2FudmFzLmdlb1RvUGl4WChjZWxsLngpICsgZCwgZ2VvQ2FudmFzLmdlb1RvUGl4WShjZWxsLnkpICsgZCAtIHJlc29sdXRpb25QaXgsIHNpemVQaXgsIHNpemVQaXgpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcbmltcG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vU2lkZVN0eWxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge3t4Om51bWJlcix5Om51bWJlcixvcjpcInZcInxcImhcIixjMTppbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGx8dW5kZWZpbmVkLGMyOmltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbHx1bmRlZmluZWR9fSBTaWRlICovXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgSXNvRmVuY2VTdHlsZSBleHRlbmRzIFN0eWxlIHtcblxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpY3Rpb25hcnkgKHN0cmluZyAtPiBjb2xvcikgd2hpY2ggZ2l2ZSB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeS5cbiAgICAgICAgICogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3JcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCBvZiBhIGNlbGwgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAoKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gcmVzb2x1dGlvbiAqIDAuNClcblxuICAgICAgICAvKiogVGhlIHBlcnNwZWN0aXZlIGFuZ2xlLCBpbiBkZWdyZWUsIHdpdGhpbiBbLTE4MCwxODBdLCBmcm9tIFtPLHhdIGF4aXMuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuYW5nbGUgPSBvcHRzLmFuZ2xlICE9IHVuZGVmaW5lZCA/IG9wdHMuYW5nbGUgOiA1MFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29ybmVyIGxpbmUgc3Ryb2tlIHN0eWxlLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29ybmVyTGluZVN0cm9rZUNvbG9yID0gb3B0cy5jb3JuZXJMaW5lU3Ryb2tlQ29sb3IgfHwgKChjLCByLCB6LCBhbmdsZSkgPT4gXCIjOTk5XCIpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb3JuZXIgbGluZSB3aWR0aC5cbiAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuY29ybmVyTGluZVdpZHRoID0gb3B0cy5jb3JuZXJMaW5lV2lkdGggfHwgKChjLCByLCB6LCBhbmdsZSkgPT4gKGFuZ2xlICUgOTAgPT0gMCA/IDAgOiAwLjggKiB6KSlcblxuICAgICAgICAvKipcbiAgICAgICAgKiBTaG93IHZlcnRpY2FsIGNyb3NzLXNlY3Rpb25zLlxuICAgICAgICAqIEB0eXBlIHtib29sZWFufSAqL1xuICAgICAgICB0aGlzLnNWZXJ0ID0gb3B0cy5zVmVydCAhPSB1bmRlZmluZWQgPyBvcHRzLnNWZXJ0IDogdHJ1ZVxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFNob3cgaG9yaXpvbnRhbCBjcm9zcy1zZWN0aW9ucy5cbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5zSG9yID0gb3B0cy5zSG9yICE9IHVuZGVmaW5lZCA/IG9wdHMuc0hvciA6IHRydWVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL25iIGNhdGVnb3JpZXMgLSB1c2VkIGZvciByYWRhciBhbmQgYWdlcHlyYW1pZFxuICAgICAgICBjb25zdCBjYXRzID0gT2JqZWN0LmtleXModGhpcy5jb2xvcilcblxuICAgICAgICAvL2hhbGYgcmVzb2x1dGlvblxuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gLyAyXG5cbiAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQodW5kZWZpbmVkLCByZXNvbHV0aW9uLCB6KSwgZHggPSBvZmZzZXQuZHgsIGR5ID0gb2Zmc2V0LmR5XG5cbiAgICAgICAgLy9tYWtlIHNpZGVzXG4gICAgICAgIC8qKiAgQHR5cGUge0FycmF5LjxTaWRlPn0gKi9cbiAgICAgICAgY29uc3Qgc2lkZXMgPSBTaWRlU3R5bGUuYnVpbGRTaWRlcyhjZWxscywgcmVzb2x1dGlvbiwgdGhpcy5hbmdsZSAlIDE4MCAhPSA5MCAmJiB0aGlzLnNWZXJ0LCB0aGlzLmFuZ2xlICUgMTgwICE9IDAgJiYgdGhpcy5zSG9yKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChzaWRlcy5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgLy9hbmdsZSBpbiByYWRpYW5zXG4gICAgICAgIGNvbnN0IGFSYWQgPSB0aGlzLmFuZ2xlICogTWF0aC5QSSAvIDE4MCwgY29zID0gTWF0aC5jb3MoYVJhZCksIHNpbiA9IE1hdGguc2luKGFSYWQpXG5cbiAgICAgICAgLy9zb3J0IHNpZGVzIHNvIHRoYXQgdGhlIGJhY2sgb25lcyBhcmUgZHJhd24gZmlyc3QuIFRoaXMgZGVwZW5kcyBvbiB0aGUgYW5nbGUuXG4gICAgICAgIC8vZGVwZW5kaW5nIG9uIGRpc3RhbmNlIHRvIHRoZSByZWZlcmVuY2UgY29ybmVyIHBvaW50XG4gICAgICAgIGNvbnN0IHhDb3JuZXIgPSBNYXRoLmFicyh0aGlzLmFuZ2xlKSA8IDkwID8gZ2VvQ2FudmFzLmV4dEdlby54TWluIDogZ2VvQ2FudmFzLmV4dEdlby54TWF4XG4gICAgICAgIGNvbnN0IHlDb3JuZXIgPSB0aGlzLmFuZ2xlIDwgMCA/IGdlb0NhbnZhcy5leHRHZW8ueU1heCA6IGdlb0NhbnZhcy5leHRHZW8ueU1pblxuICAgICAgICBzaWRlcy5zb3J0KChzMSwgczIpID0+IChNYXRoLmh5cG90KHMyLnggLSB4Q29ybmVyLCBzMi55IC0geUNvcm5lcikgLSBNYXRoLmh5cG90KHMxLnggLSB4Q29ybmVyLCBzMS55IC0geUNvcm5lcikpKVxuXG4gICAgICAgIC8vcHJlcGFyZSBmdW5jdGlvbiB0byBkcmF3IGNvcm5lciBsaW5lIGZvciBhIGNlbGwgKmMqXG4gICAgICAgIGNvbnN0IGRyYXdDb3JuZXJMaW5lID0gKGNlbGwpID0+IHtcblxuICAgICAgICAgICAgaWYgKCFjZWxsKSByZXR1cm5cbiAgICAgICAgICAgIC8vbGluZSBzdHlsZVxuICAgICAgICAgICAgY29uc3QgbHcgPSB0aGlzLmNvcm5lckxpbmVXaWR0aCA/IHRoaXMuY29ybmVyTGluZVdpZHRoKGNlbGwsIHJlc29sdXRpb24sIHosIHRoaXMuYW5nbGUpIDogMC44ICogelxuICAgICAgICAgICAgaWYgKGx3ID09IDApIHJldHVyblxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29ybmVyTGluZVN0cm9rZUNvbG9yID8gdGhpcy5jb3JuZXJMaW5lU3Ryb2tlQ29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdGhpcy5hbmdsZSkgOiBcIiMzMzNcIlxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSBsd1xuXG4gICAgICAgICAgICAvL2hlaWdodCAtIGluIGdlb1xuICAgICAgICAgICAgY29uc3QgaEcgPSB0aGlzLmhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsaW5lXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjZWxsLnggKyByMiArIGR4LCBjZWxsLnkgKyByMiArIGR5KVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY2VsbC54ICsgcjIgKyBoRyAqIGNvcyArIGR4LCBjZWxsLnkgKyByMiArIGhHICogc2luICsgZHkpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvL2RyYXcgc2lkZXNcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lQ2FwID0gXCJyb3VuZFwiO1xuICAgICAgICBmb3IgKGxldCBzaWRlIG9mIHNpZGVzKSB7XG4gICAgICAgICAgICBjb25zdCBjMSA9IHNpZGUuYzEsIGMyID0gc2lkZS5jMiwgeCA9IHNpZGUueCwgeSA9IHNpZGUueVxuXG4gICAgICAgICAgICAvL2hlaWdodHMgLSBpbiBnZW9cbiAgICAgICAgICAgIGNvbnN0IGhHMSA9IGMxID8gdGhpcy5oZWlnaHQoYzEsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAwLFxuICAgICAgICAgICAgICAgIGhHMiA9IGMyID8gdGhpcy5oZWlnaHQoYzIsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAwXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSB0b3RhbHMgZm9yIGJvdGggY2VsbHNcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsMSA9IGNvbXB1dGVUb3RhbChjMSwgY2F0cyksXG4gICAgICAgICAgICAgICAgdG90YWwyID0gY29tcHV0ZVRvdGFsKGMyLCBjYXRzKVxuICAgICAgICAgICAgaWYgKHRvdGFsMSA9PSAwICYmIHRvdGFsMiA9PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICBsZXQgY3VtdWwxID0gMCwgY3VtdWwyID0gMFxuICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IHN0cmlwZSBvZiBzaWRlIHMgYW5kIGNhdGVnb3J5IGNvbHVtblxuXG4gICAgICAgICAgICAgICAgLy9nZXQgdmFsdWVzIGZvciBib3RoIGNlbGxzXG4gICAgICAgICAgICAgICAgbGV0IHYxID0gYzEgPyArYzFbY29sdW1uXSA6IDBcbiAgICAgICAgICAgICAgICBsZXQgdjIgPSBjMiA/ICtjMltjb2x1bW5dIDogMFxuICAgICAgICAgICAgICAgIGlmICh2MSA9PSAwICYmIHYyID09IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAvL2NvbXB1dGUgaGVpZ2h0c1xuICAgICAgICAgICAgICAgIGNvbnN0IGgxID0gaEcxICogY3VtdWwxIC8gdG90YWwxIHx8IDBcbiAgICAgICAgICAgICAgICBjb25zdCBoMW4gPSBoRzEgKiAoY3VtdWwxICsgdjEpIC8gdG90YWwxIHx8IDBcbiAgICAgICAgICAgICAgICBjb25zdCBoMiA9IGhHMiAqIGN1bXVsMiAvIHRvdGFsMiB8fCAwXG4gICAgICAgICAgICAgICAgY29uc3QgaDJuID0gaEcyICogKGN1bXVsMiArIHYyKSAvIHRvdGFsMiB8fCAwXG5cbiAgICAgICAgICAgICAgICAvL21ha2UgcGF0aFxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBpZiAoc2lkZS5vciA9PSBcImhcIikge1xuICAgICAgICAgICAgICAgICAgICAvL2hvcml6b250YWwgc2lkZSAtIHZlcnRpY2FsIHNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gbGVmdFxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4ICsgaDEgKiBjb3MgKyBkeCwgeSAtIHIyICsgaDEgKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy90b3AgbGVmdFxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyh4ICsgaDIgKiBjb3MgKyBkeCwgeSArIHIyICsgaDIgKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy90b3AgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIGgybiAqIGNvcyArIGR4LCB5ICsgcjIgKyBoMm4gKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIGgxbiAqIGNvcyArIGR4LCB5IC0gcjIgKyBoMW4gKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL3ZlcnRpY2FsIHNpZGUgLSBob3Jpem9udGFsIHNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gbGVmdFxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4IC0gcjIgKyBoMSAqIGNvcyArIGR4LCB5ICsgaDEgKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIHIyICsgaDIgKiBjb3MgKyBkeCwgeSArIGgyICogc2luICsgZHkpXG4gICAgICAgICAgICAgICAgICAgIC8vdG9wIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHggKyByMiArIGgybiAqIGNvcyArIGR4LCB5ICsgaDJuICogc2luICsgZHkpXG4gICAgICAgICAgICAgICAgICAgIC8vdG9wIGxlZnRcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCAtIHIyICsgaDFuICogY29zICsgZHgsIHkgKyBoMW4gKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9jZy5jdHguY2xvc2VQYXRoKClcblxuICAgICAgICAgICAgICAgIC8vZmlsbFxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sb3JcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxuXG4gICAgICAgICAgICAgICAgY3VtdWwxICs9IHYxXG4gICAgICAgICAgICAgICAgY3VtdWwyICs9IHYyXG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gZHJhdyBvbmx5IG9uZSBsaW5lXG4gICAgICAgICAgICAgICAgLy9kcmF3IGNvcm5lciBsaW5lXG4gICAgICAgICAgICAgICAgLy9pZiAoc2lkZS5vciA9PSBcImhcIikge1xuICAgICAgICAgICAgICAgIGRyYXdDb3JuZXJMaW5lKGMxKVxuICAgICAgICAgICAgICAgIGRyYXdDb3JuZXJMaW5lKGMyKVxuICAgICAgICAgICAgICAgIC8vaWYgKHRoaXMuYW5nbGUgPiAwICYmIHNpZGUub3IgPT0gXCJoXCIpIGRyYXdDb3JuZXJMaW5lKGMyKVxuICAgICAgICAgICAgICAgIC8vZWxzZSBkcmF3Q29ybmVyTGluZShjMilcbiAgICAgICAgICAgICAgICAvL31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuXG5cblxuY29uc3QgY29tcHV0ZVRvdGFsID0gKGNlbGwsIGNhdGVnb3JpZXMpID0+IHtcbiAgICBpZiAoIWNlbGwpIHJldHVybiAwXG4gICAgbGV0IHRvdGFsID0gMFxuICAgIGZvciAobGV0IGNvbHVtbiBvZiBjYXRlZ29yaWVzKSB7XG4gICAgICAgIGNvbnN0IHYgPSBjZWxsW2NvbHVtbl1cbiAgICAgICAgaWYgKCF2KSBjb250aW51ZVxuICAgICAgICB0b3RhbCArPSArdlxuICAgIH1cbiAgICByZXR1cm4gdG90YWwgfHwgMFxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgSm95UGxvdFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCBvZiBhIGNlbGwgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAoKGMsIHIpID0+IHIgKiBNYXRoLnJhbmRvbSgpKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmxpbmVDb2xvciA9IG9wdHMubGluZUNvbG9yIHx8ICgoeSwgeXMsIHIsIHopID0+ICcjQkJCJylcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIse21pbjpudW1iZXIsIG1heDpudW1iZXJ9LG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5saW5lV2lkdGggPSBvcHRzLmxpbmVXaWR0aCB8fCAoKHksIHlzLCByLCB6KSA9PiB6KVxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZpbGxDb2xvciA9IG9wdHMuZmlsbENvbG9yIHx8ICgoeSwgeXMsIHIsIHopID0+ICcjYzA4YzU5NjgnKVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9pbmRleCBjZWxscyBieSB5IGFuZCB4XG4gICAgICAgIC8qKiAgQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgY29uc3QgaW5kID0ge31cbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBsZXQgcm93ID0gaW5kW2NlbGwueV1cbiAgICAgICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICAgICAgcm93ID0ge31cbiAgICAgICAgICAgICAgICBpbmRbY2VsbC55XSA9IHJvd1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93W2NlbGwueF0gPSB0aGlzLmhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXB1dGUgZXh0ZW50XG4gICAgICAgIGNvbnN0IGUgPSBnZW9DYW52YXMuZXh0R2VvXG4gICAgICAgIGlmICghZSkgcmV0dXJuXG4gICAgICAgIGNvbnN0IHhNaW4gPSBNYXRoLmZsb29yKGUueE1pbiAvIHJlc29sdXRpb24pICogcmVzb2x1dGlvblxuICAgICAgICBjb25zdCB4TWF4ID0gTWF0aC5mbG9vcihlLnhNYXggLyByZXNvbHV0aW9uKSAqIHJlc29sdXRpb25cbiAgICAgICAgY29uc3QgeU1pbiA9IE1hdGguZmxvb3IoZS55TWluIC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXG4gICAgICAgIGNvbnN0IHlNYXggPSBNYXRoLmZsb29yKGUueU1heCAvIHJlc29sdXRpb24pICogcmVzb2x1dGlvblxuXG4gICAgICAgIC8qKiAgQHR5cGUge3ttaW46bnVtYmVyLCBtYXg6bnVtYmVyfX0gKi9cbiAgICAgICAgY29uc3QgeXMgPSB7IG1pbjogeU1pbiwgbWF4OiB5TWF4IH1cblxuICAgICAgICAvL2RyYXcgbGluZXMsIHJvdyBieSByb3csIHN0YXRpbmcgZnJvbSB0aGUgdG9wXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUpvaW4gPSAncm91bmQnXG4gICAgICAgIGZvciAobGV0IHkgPSB5TWF4OyB5ID49IHlNaW47IHkgLT0gcmVzb2x1dGlvbikge1xuICAgICAgICAgICAgLy9nZXQgcm93XG4gICAgICAgICAgICBjb25zdCByb3cgPSBpbmRbeV1cblxuICAgICAgICAgICAgLy9ubyByb3dcbiAgICAgICAgICAgIGlmICghcm93KSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3BsYWNlIGZpcnN0IHBvaW50XG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4TWluIC0gcmVzb2x1dGlvbiAvIDIsIHkpXG5cbiAgICAgICAgICAgIC8vc3RvcmUgdGhlIHByZXZpb3VzIGhlaWdodFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgbGV0IGhHX1xuXG4gICAgICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxpbmUgY2VsbHNcbiAgICAgICAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDw9IHhNYXg7IHggKz0gcmVzb2x1dGlvbikge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGNvbHVtbiB2YWx1ZVxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgICAgIGxldCBoRyA9IHJvd1t4XVxuICAgICAgICAgICAgICAgIGlmICghaEcpIGhHID0gMFxuXG4gICAgICAgICAgICAgICAgaWYgKGhHIHx8IGhHXykge1xuICAgICAgICAgICAgICAgICAgICAvL2RyYXcgbGluZSBvbmx5IHdoZW4gYXQgbGVhc3Qgb25lIG9mIGJvdGggdmFsdWVzIGlzIG5vbi1udWxsXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyB0ZXN0IGJlemllckN1cnZlVG9cbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIHJlc29sdXRpb24gLyAyLCB5ICsgaEcpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9lbHNlIG1vdmUgdGhlIHBvaW50XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHggKyByZXNvbHV0aW9uIC8gMiwgeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9zdG9yZSB0aGUgcHJldmlvdXMgdmFsdWVcbiAgICAgICAgICAgICAgICBoR18gPSBoR1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2xhc3QgcG9pbnRcbiAgICAgICAgICAgIGlmIChoR18pIGdlb0NhbnZhcy5jdHgubGluZVRvKHhNYXggKyByZXNvbHV0aW9uIC8gMiwgeSlcblxuICAgICAgICAgICAgLy9kcmF3IGZpbGxcbiAgICAgICAgICAgIGNvbnN0IGZjID0gdGhpcy5maWxsQ29sb3IoeSwgeXMsIHJlc29sdXRpb24sIHopXG4gICAgICAgICAgICBpZiAoZmMgJiYgZmMgIT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBmY1xuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZHJhdyBsaW5lXG4gICAgICAgICAgICBjb25zdCBsYyA9IHRoaXMubGluZUNvbG9yKHksIHlzLCByZXNvbHV0aW9uLCB6KVxuICAgICAgICAgICAgY29uc3QgbHcgPSB0aGlzLmxpbmVXaWR0aCh5LCB5cywgcmVzb2x1dGlvbiwgeilcbiAgICAgICAgICAgIGlmIChsYyAmJiBsYyAhPSAnbm9uZScgJiYgbHcgPiAwKSB7XG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IGxjXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSBsd1xuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgVGFuYWthU3R5bGUgfSBmcm9tICcuL1RhbmFrYVN0eWxlLmpzJ1xuaW1wb3J0IHsgU3Ryb2tlU3R5bGUgfSBmcm9tICcuL1N0cm9rZVN0eWxlLmpzJ1xuaW1wb3J0IHsgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUgfSBmcm9tICcuL1NxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlLmpzJ1xuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIExlZ29TdHlsZSB7XG5cbiAgICBzdGF0aWMgZ2V0KHZhbHVlLCBicmVha3MsIGNvbG9ycywgb3B0cyA9IHt9KSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy90aGUgY29sb3JzXG4gICAgICAgIC8vaHR0cDovL3d3dy5qZW5ueXNjcmF5b25jb2xsZWN0aW9uLmNvbS8yMDIxLzA2L2FsbC1jdXJyZW50LWxlZ28tY29sb3JzLmh0bWxcbiAgICAgICAgLy9odHRwczovL2xlb25hd2ljei5naXRodWIuaW8vbGVnb2NvbG9ycy9yZWZlcmVuY2UvZmlndXJlcy9SRUFETUUtcGxvdC0xLnBuZ1xuICAgICAgICAvKm9wdHMuY29sb3JzID0gb3B0cy5jb2xvcnMgfHwgW1xuICAgICAgICAgICAgJyMwMDg1MmInLCAvL2RhcmtlciBncmVlblxuICAgICAgICAgICAgJyNhZmQyNDYnLCAvL2xpZ2h0IGdyZWVuXG4gICAgICAgICAgICAnI2ZhYzgwYScsIC8vZGFyayB5ZWxsb3dcbiAgICAgICAgICAgICcjYmI4MDVhJywgLy9icm93blxuICAgICAgICAgICAgJyNkNjc5MjMnLCAvL21vc3RhcmRcbiAgICAgICAgICAgICcjY2I0ZTI5JywgLy9yZWRpc2hcbiAgICAgICAgICAgICcjYjQwMDAwJywgLy9yZWRcbiAgICAgICAgICAgICcjNzIwMDEyJywgLy9kYXJrIHJlZFxuICAgICAgICAgICAgLy9cInB1cnBsZVwiLFxuICAgICAgICAgICAgLy9cIiNlZWVcIiAvL3doaXRoZVxuICAgICAgICBdKi9cblxuICAgICAgICBvcHRzLmNvbERhcmsgPSBvcHRzLmNvbERhcmsgfHwgJyMzMzMnXG4gICAgICAgIG9wdHMuY29sQnJpZ2h0ID0gb3B0cy5jb2xCcmlnaHQgfHwgJyNhYWEnXG4gICAgICAgIG9wdHMud2lkdGhGYWN0b3IgPSBvcHRzLndpZHRoRmFjdG9yIHx8IDAuMTJcblxuICAgICAgICAvL3JldXNlIHRhbmFrYSBhcyBiYXNpc1xuICAgICAgICBjb25zdCB0cyA9IFRhbmFrYVN0eWxlLmdldCh2YWx1ZSwgYnJlYWtzLCBjb2xvcnMsIG9wdHMpXG4gICAgICAgIC8vc3R5bGUgdG8gc2hvdyBsaW1pdHMgYmV0d2VlbiBwaWVjZXNcbiAgICAgICAgY29uc3Qgc3N0ID0gbmV3IFN0cm9rZVN0eWxlKHtcbiAgICAgICAgICAgIHN0cm9rZUNvbG9yOiAoKSA9PiAnIzY2NicsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogKGMsIHIsIHopID0+IDAuMiAqIHosXG4gICAgICAgICAgICBmaWx0ZXI6IG9wdHMuZmlsdGVyLFxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB0c1swXSxcbiAgICAgICAgICAgIHNzdCxcbiAgICAgICAgICAgIHRzWzFdLFxuICAgICAgICAgICAgbmV3IExlZ29Ub3BTdHlsZSh7IGNvbERhcms6IG9wdHMuY29sRGFyaywgY29sQnJpZ2h0OiBvcHRzLmNvbEJyaWdodCwgZmlsdGVyOiBvcHRzLmZpbHRlciB9KSxcbiAgICAgICAgXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsKTpzdHJpbmd9IGNvZGVcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gY29sb3JcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHtBcnJheS48U3R5bGU+fVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDYXRlZ29yeShjb2RlLCBjb2xvciwgb3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIG9wdHMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcbiAgICAgICAgb3B0cy5jb2xCcmlnaHQgPSBvcHRzLmNvbEJyaWdodCB8fCAnI2FhYSdcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCBzID0gbmV3IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlKHsgY29kZTogY29kZSwgY29sb3I6IGNvbG9yIH0pXG4gICAgICAgIC8vc3R5bGUgdG8gc2hvdyBsaW1pdHMgYmV0d2VlbiBwaWVjZXNcbiAgICAgICAgY29uc3Qgc3N0ID0gbmV3IFN0cm9rZVN0eWxlKHsgc3Ryb2tlQ29sb3I6ICgpID0+ICcjNjY2Jywgc3Ryb2tlV2lkdGg6IChjLCByLCB6KSA9PiAwLjIgKiB6IH0pXG5cbiAgICAgICAgcmV0dXJuIFtzLCBzc3QsIG5ldyBMZWdvVG9wU3R5bGUoeyBjb2xEYXJrOiBvcHRzLmNvbERhcmssIGNvbEJyaWdodDogb3B0cy5jb2xCcmlnaHQgfSldXG4gICAgfVxufVxuXG4vKipcbiAqIEEgc3R5bGUgdG8gZHJhdyB0b3AgY2lyY2xlIG9mIGxlZ28gYnJpY2tzLlxuICovXG5jbGFzcyBMZWdvVG9wU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fHVuZGVmaW5lZH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cbiAgICAgICAgdGhpcy5jb2xEYXJrID0gb3B0cy5jb2xEYXJrIHx8ICcjMzMzJ1xuICAgICAgICB0aGlzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjYWFhJ1xuICAgIH1cblxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gMC42ICogZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vZGFyayBwYXJ0XG4gICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbERhcmtcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5hcmMoYy54ICsgciAqIDAuNSwgYy55ICsgciAqIDAuNSwgciAqIDAuNTUgKiAwLjUsIE1hdGguUEkgLyA0LCAtTWF0aC5QSSAqICgzIC8gNCksIHRydWUpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvL2JyaWdodCBwYXJ0XG4gICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbEJyaWdodFxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhjLnggKyByICogMC41LCBjLnkgKyByICogMC41LCByICogMC41NSAqIDAuNSwgTWF0aC5QSSAvIDQsIC1NYXRoLlBJICogKDMgLyA0KSwgZmFsc2UpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBNb3NhaWNTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gXCIjRUE2QkFDXCIpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBUaGUgbW9zYWljIGZhY3Rvciwgd2l0aGluIFswLDAuNV0uIFNldCB0byAwIGZvciBubyBtb3NhaWMgZWZmZWN0LiBTZXQgdG8gMC41IGZvciBzdHJvbmcgbW9zYWljIGVmZmVjdC5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5tb3NhaWNGYWN0b3IgPSBvcHRzLm1vc2FpY0ZhY3RvciB8fCAwLjE1XG5cbiAgICAgICAgLyoqIFRoZSBtb3NhaWMgc2hhZG93IGZhY3Rvciwgd2l0aGluIFswLDAuNV0uIFNldCB0byAwIGZvciBubyBtb3NhaWMgc2hhZG93LiBTZXQgdG8gMC41IGZvciBzdHJvbmcgbW9zYWljIHNoYWRvdy5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dGYWN0b3IgPSBvcHRzLnNoYWRvd0ZhY3RvciB8fCAwLjJcblxuICAgICAgICAvKiogVGhlIG1vc2FpYyBzaGFkb3cgY29sb3IuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc2hhZG93Q29sb3IgPSBvcHRzLnNoYWRvd0NvbG9yIHx8ICcjNTU1J1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9zZXQgc3Ryb2tlIHN0eWxlLCBmb3Igc2hhZG93XG4gICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnNoYWRvd0NvbG9yXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gdGhpcy5zaGFkb3dGYWN0b3IgKiByZXNvbHV0aW9uXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUpvaW4gPSAncm91bmQnXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9ICdidXR0J1xuXG4gICAgICAgIC8vZnVuY3Rpb24gdG8gY29tcHV0ZSBwb3NpdGlvbiBtb3NhaWMgZWZmZWN0XG4gICAgICAgIGNvbnN0IGQgPSByZXNvbHV0aW9uICogdGhpcy5tb3NhaWNGYWN0b3JcbiAgICAgICAgY29uc3QgbW9zYWljID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgeDogTWF0aC5yYW5kb20oKSAqIGQsIHk6IE1hdGgucmFuZG9tKCkgKiBkIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vc2V0IGZpbGwgY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgcG9zaXRpb24gbW9zYWljIGVmZmVjdFxuICAgICAgICAgICAgY29uc3QgbGwgPSBtb3NhaWMoKSxcbiAgICAgICAgICAgICAgICB1bCA9IG1vc2FpYygpLFxuICAgICAgICAgICAgICAgIGxyID0gbW9zYWljKCksXG4gICAgICAgICAgICAgICAgdXIgPSBtb3NhaWMoKVxuXG4gICAgICAgICAgICAvL3N0cm9rZVxuICAgICAgICAgICAgaWYgKHRoaXMuc2hhZG93RmFjdG9yID4gMCkge1xuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyBsbC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsbC55KVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSBsci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsci55KVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSB1ci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyByZXNvbHV0aW9uIC0gdXIueSlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZmlsbFxuXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyBsbC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsbC55KVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIGxyLngsIGNlbGwueSArIG9mZnNldC5keSArIGxyLnkpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC0gdXIueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAtIHVyLnkpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyB1bC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyByZXNvbHV0aW9uIC0gdWwueSlcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIE5pbmphU3RhclN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiBcIiNFQTZCQUNcIikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCwgd2l0aGluIFswLDFdOlxuICAgICAgICAgKiAgLSAwLCBub3RoaW5nIHNob3duXG4gICAgICAgICAqICAtIDEsIGVudGlyZSBzcXVhcmVcbiAgICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaGFwZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc2hhcGUgPSBvcHRzLnNoYXBlIHx8ICgoKSA9PiAnbycpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uICogMC41XG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgLy9zaXplIC0gaW4gZ2VvIHVuaXRcbiAgICAgICAgICAgIGxldCBrID0gdGhpcy5zaXplKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgIGsgPSBrIDwgMCA/IDAgOiBrID4gMSA/IDEgOiBrXG4gICAgICAgICAgICBjb25zdCBzRzIgPSBrICogcjJcblxuICAgICAgICAgICAgLy9zaGFwZVxuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLnNoYXBlID8gdGhpcy5zaGFwZShjZWxsKSA6ICdvJ1xuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgLy9UT0RPIHVzZVxuICAgICAgICAgICAgLy9jb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByLCB6KVxuXG4gICAgICAgICAgICAvL2NlbnRlciBwb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyByMlxuICAgICAgICAgICAgY29uc3QgY3kgPSBjZWxsLnkgKyByMlxuXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdwJykge1xuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCwgY3kgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCArIHNHMiwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyByMiwgY3kpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyBzRzIsIGN5IC0gc0cyKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4LCBjeSAtIHIyKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4IC0gc0cyLCBjeSAtIHNHMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCAtIHIyLCBjeSlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCAtIHNHMiwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdvJykge1xuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyByMiwgY3kgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCArIHNHMiwgY3kpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyByMiwgY3kgLSByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCwgY3kgLSBzRzIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggLSByMiwgY3kgLSByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCAtIHNHMiwgY3kpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggLSByMiwgY3kgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHNoYXBlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBQaWxsYXJTdHlsZSBleHRlbmRzIFN0eWxlIHtcblxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCBvZiB0aGUgbGluZSByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHRcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBsaW5lIHJlcHJlc2VudGluZyBhIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+IFwiI2MwOGM1OVwiKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBsaW5lIHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiAwLjUgKiByZXNvbHV0aW9uKVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlciwgbnVtYmVyLG9iamVjdCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5zaW1wbGUgPSBvcHRzLnNpbXBsZSB8fCAoKCkgPT4gZmFsc2UpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudmlld0hlaWdodEZhY3RvciA9IG9wdHMudmlld0hlaWdodEZhY3RvciB8fCAxLjVcbiAgICAgICAgLy8wLDAgaXMgdGhlIGNlbnRlclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy52aWV3U1ggPSBvcHRzLnZpZXdTWCA9PSB1bmRlZmluZWQgPyAwIDogb3B0cy52aWV3U1hcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudmlld1NZID0gb3B0cy52aWV3U1kgPT0gdW5kZWZpbmVkID8gLTAuNSA6IG9wdHMudmlld1NZXG5cbiAgICAgICAgLy9UT0RPIHJlcGxhY2Ugd2l0aCBzdW4gbG9jYXRpb24gP1xuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dEaXJlY3Rpb24gPVxuICAgICAgICAgICAgb3B0cy5zaGFkb3dEaXJlY3Rpb24gPT0gdW5kZWZpbmVkID8gKC00MC4zICogTWF0aC5QSSkgLyAxODAuMCA6IG9wdHMuc2hhZG93RGlyZWN0aW9uXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNoYWRvd0ZhY3RvciA9IG9wdHMuc2hhZG93RmFjdG9yIHx8IDAuM1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dDb2xvciA9IG9wdHMuc2hhZG93Q29sb3IgfHwgJyMwMDAwMDAzMydcblxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5vdXRsaW5lQ29sID0gb3B0cy5vdXRsaW5lQ29sIHx8ICcjRkZGRkZGJ1xuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vdXRsaW5lV2lkdGhQaXggPSBvcHRzLm91dGxpbmVXaWR0aFBpeCA9PSB1bmRlZmluZWQgPyAwLjUgOiBvcHRzLm91dGxpbmVXaWR0aFBpeFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc2VnbWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2dldCB2aWV3IGNlbnRlciBnZW8gcG9zaXRpb25cbiAgICAgICAgY29uc3QgY3Z4ID0gZ2VvQ2FudmFzLnZpZXcueCArIHRoaXMudmlld1NYICogZ2VvQ2FudmFzLncgKiB6XG4gICAgICAgIGNvbnN0IGN2eSA9IGdlb0NhbnZhcy52aWV3LnkgKyB0aGlzLnZpZXdTWSAqIGdlb0NhbnZhcy5oICogelxuICAgICAgICAvL2dldCB2aWV3IGhlaWdodFxuICAgICAgICBjb25zdCBIID0gdGhpcy52aWV3SGVpZ2h0RmFjdG9yICogKGdlb0NhbnZhcy53ICsgZ2VvQ2FudmFzLmgpICogMC41ICogelxuXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB5IGFuZCB4XG4gICAgICAgIC8vY29uc3QgZGlzdFRvVmlld0NlbnRlciA9IChjKSA9PiB7IGNvbnN0IGR4ID0gY3Z4IC0gYy54LCBkeSA9IGN2eSAtIGMueTsgcmV0dXJuIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkgfVxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IDEwMDAwMDAwMCAqIChjMi55IC0gYzEueSkgKyBjMS54IC0gYzIueClcblxuICAgICAgICAvL2dldCBzaW1wbGUgaW5mb3JtYXRpb25cbiAgICAgICAgY29uc3Qgc2ltcGxlID0gdGhpcy5zaW1wbGUocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9IHNpbXBsZSA/ICdidXR0JyA6ICdyb3VuZCdcblxuICAgICAgICAvL2RyYXcgc2hhZG93c1xuICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5zaGFkb3dDb2xvclxuICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9IHRoaXMuc2hhZG93Q29sb3JcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy93aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9oZWlnaHRcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGhHID0gdGhpcy5oZWlnaHQgPyB0aGlzLmhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWhHIHx8IGhHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICAvL1RPRE8gdXNlIHRoYXRcbiAgICAgICAgICAgIC8vY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgLy9zZXQgd2lkdGhcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd0dcblxuICAgICAgICAgICAgLy9jb21wdXRlIGNlbGwgY2VudGVyIHBvc3RpdGlvblxuICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyByZXNvbHV0aW9uIC8gMlxuICAgICAgICAgICAgY29uc3QgY3kgPSBjZWxsLnkgKyByZXNvbHV0aW9uIC8gMlxuICAgICAgICAgICAgY29uc3QgbHMgPSBoRyAqIHRoaXMuc2hhZG93RmFjdG9yXG5cbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCArIGxzICogTWF0aC5jb3ModGhpcy5zaGFkb3dEaXJlY3Rpb24pLCBjeSArIGxzICogTWF0aC5zaW4odGhpcy5zaGFkb3dEaXJlY3Rpb24pKVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgaWYgKHRoaXMuc2ltcGxlKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGJhc2UgY2lyY2xlXG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoXG4gICAgICAgICAgICAgICAgICAgIGN4LCBjeSxcbiAgICAgICAgICAgICAgICAgICAgd0cgKiAwLjUsXG4gICAgICAgICAgICAgICAgICAgIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgLy9jZy5jdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKTtcbiAgICAgICAgICAgIH0qL1xuICAgICAgICB9XG5cbiAgICAgICAgLy9kcmF3IHBpbGxhcnNcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vaGVpZ2h0XG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBoRyA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFoRyB8fCBoRyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgLy9UT0RPIHVzZSB0aGF0XG4gICAgICAgICAgICAvL2NvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBjZWxsIGNlbnRlciBwb3N0aXRpb25cbiAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcmVzb2x1dGlvbiAvIDJcblxuICAgICAgICAgICAgLy9jb21wdXRlIGFuZ2xlXG4gICAgICAgICAgICBjb25zdCBkeCA9IGN4IC0gY3Z4LFxuICAgICAgICAgICAgICAgIGR5ID0gY3kgLSBjdnlcbiAgICAgICAgICAgIGNvbnN0IGEgPSBNYXRoLmF0YW4yKGR5LCBkeClcbiAgICAgICAgICAgIGNvbnN0IEQgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpXG4gICAgICAgICAgICBjb25zdCBkID0gKEQgKiBoRykgLyAoSCAtIGhHKVxuXG4gICAgICAgICAgICBpZiAoc2ltcGxlKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gY29sXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSB3R1xuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGJhY2tncm91bmQgc2VnbWVudFxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLm91dGxpbmVDb2xcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHdHICsgMiAqIHRoaXMub3V0bGluZVdpZHRoUGl4ICogelxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd0dcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oY3gsIGN5KVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgdG9wIGNpcmNsZVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLm91dGxpbmVDb2xcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5maWxsU3R5bGUgPSBcIiNjMDhjNTlcIlxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gdGhpcy5vdXRsaW5lV2lkdGhQaXggKiB6XG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSwgd0cgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgLy9jZy5jdHguZmlsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9pbiBjYXNlLi4uXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9ICdidXR0J1xuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQSBzdHlsZSB3aGVyZSBlYWNoIGNlbGwgaXMgcmVwcmVzZW50ZWQgYnkgYSBzZWdtZW50IHdob3NlIGxlbmd0aCwgd2lkdGgsIGNvbG9yIGFuZCBvcmllbnRhdGlvbiBjYW4gdmFyeSBhY2NvcmRpbmcgdG8gc3RhdGlzdGljYWwgdmFsdWVzLlxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNlZ21lbnRTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbCBzZWdtZW50LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiBcIiNFQTZCQUNcIikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbiAqIDAuMSkgIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBzZWdtZW50IHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRzLmxlbmd0aCB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24gKiAwLjkpICAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG9yaWVudGF0aW9uIChpbiBkZWdyZWVzKSBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBvcHRzLm9yaWVudGF0aW9uIHx8ICgoKSA9PiAxODAgKiBNYXRoLnJhbmRvbSgpKSAvLyhjLHIseix2cykgPT4ge31cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNlZ21lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9cbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lQ2FwID0gJ2J1dHQnXG5cbiAgICAgICAgLy9jb252ZXJzaW9uIGZhY3RvciBkZWdyZWUgLT4gcmFkaWFuXG4gICAgICAgIGNvbnN0IGYgPSBNYXRoLlBJIC8gMTgwXG5cbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vbGVuZ3RoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBsRyA9IHRoaXMubGVuZ3RoID8gdGhpcy5sZW5ndGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vb3JpZW50YXRpb24gKGluIHJhZGlhbilcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgY29uc3Qgb3IgPSB0aGlzLm9yaWVudGF0aW9uKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgKiBmXG4gICAgICAgICAgICBpZiAob3IgPT09IHVuZGVmaW5lZCB8fCBpc05hTihvcikpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgLy9zZXQgY29sb3IgYW5kIHdpZHRoXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gY29sXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHdHXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBzZWdtZW50IGNlbnRlciBwb3N0aXRpb25cbiAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgcmVzb2x1dGlvbiAvIDIgKyBvZmZzZXQuZHhcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcmVzb2x1dGlvbiAvIDIgKyBvZmZzZXQuZHlcblxuICAgICAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgZGlyZWN0aW9uXG4gICAgICAgICAgICBjb25zdCBkeCA9IDAuNSAqIE1hdGguY29zKG9yKSAqIGxHXG4gICAgICAgICAgICBjb25zdCBkeSA9IDAuNSAqIE1hdGguc2luKG9yKSAqIGxHXG5cbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCAtIGR4LCBjeSAtIGR5KVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyBkeCwgY3kgKyBkeSlcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgdmlld1NjYWxlOiB2aWV3U2NhbGUsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIGNlbGxzOiBjZWxscyB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEEgdmVyeSBnZW5lcmljIHN0eWxlIHRoYXQgc2hvd3MgZ3JpZCBjZWxscyB3aXRoIHNwZWNpZmljIGNvbG9yLCBzaXplIGFuZCBzaGFwZS5cbiAqIEl0IGNhbiBiZSB1c2VkIHRvIHNob3cgdmFyaWFibGVzIGFzIGNlbGwgY29sb3JzLCBjZWxsIHNpemUsIGNlbGwgc2hhcGUsIG9yIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgdGhyZWUgdmlzdWFsIHZhcmlhYmxlcy5cbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTaGFwZUNvbG9yU2l6ZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiBcIiNFQTZCQUNcIikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNoYXBlIG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlciwgbnVtYmVyLG9iamVjdCk6aW1wb3J0KFwiLi4vY29yZS9TdHlsZS5qc1wiKS5TaGFwZX0gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgKCgpID0+IFwic3F1YXJlXCIpIC8vKGMscix6LHZzKSA9PiB7fVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcywgd2l0aCB2YXJpb3VzIGNvbG9ycyBhbmQgc2l6ZXMuXG4gICAgICogXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy96b29tXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICBsZXQgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IFwiYmxhY2tcIlxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vc2l6ZVxuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogcmVzb2x1dGlvblxuICAgICAgICAgICAgaWYgKCFzaXplKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3NoYXBlXG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHRoaXMuc2hhcGUgPyB0aGlzLnNoYXBlKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAnc3F1YXJlJ1xuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgc3F1YXJlXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiAoMSAtIHNpemUgLyByZXNvbHV0aW9uKSAqIDAuNVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoYy54ICsgZCArIG9mZnNldC5keCwgYy55ICsgZCArIG9mZnNldC5keSwgc2l6ZSwgc2l6ZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhjLnggKyByMiArIG9mZnNldC5keCwgYy55ICsgcjIgKyBvZmZzZXQuZHksIHNpemUgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2RvbnV0Jykge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBkb251dFxuICAgICAgICAgICAgICAgIGNvbnN0IHhjID0gYy54ICsgcjIgKyBvZmZzZXQuZHgsXG4gICAgICAgICAgICAgICAgICAgIHljID0gYy55ICsgcjIgKyBvZmZzZXQuZHlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKHhjLCB5YywgcjIsIDAsIDIgKiBNYXRoLlBJKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKHhjLCB5YywgKDEgLSBzaXplIC8gcmVzb2x1dGlvbikgKiByMiwgMCwgMiAqIE1hdGguUEksIHRydWUpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZGlhbW9uZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzMiA9IHNpemUgKiAwLjVcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54ICsgcjIgLSBzMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54ICsgcjIsIGMueSArIHIyICsgczIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54ICsgcjIgKyBzMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54ICsgcjIsIGMueSArIHIyIC0gczIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV91cCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9kb3duJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGMueCAtIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9sZWZ0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54IC0gZHIyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9yaWdodCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggLSBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyBzaGFwZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgdmlld1NjYWxlOiB2aWV3U2NhbGUsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIGNlbGxzOiBjZWxscyB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXG5cbi8qKlxuICogQSBzdHlsZSB0byBzaG93IHRoZSBzaWRlcyBvZiBncmlkIGNlbGxzIGJhc2VkIG9uIHRoZWlyIGRpZmZlcmVudCBjYXRlZ29yaWVzLlxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpZGVDYXRlZ29yeVN0eWxlIGV4dGVuZHMgU2lkZVN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjYXRlZ29yeSBjb2RlIG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2RlID0gb3B0cy5jb2RlXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChzdHJpbmcgLT4gY29sb3IpIHdoaWNoIGdpdmUgdGhlIGNvbG9yIG9mIGVhY2ggY2F0ZWdvcnkuXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yXG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vYnVpbGQgc2lkZXNcblxuICAgICAgICAvKiogIEB0eXBlIHtBcnJheS48aW1wb3J0KCcuL1NpZGVTdHlsZS5qcycpLlNpZGU+fSAqL1xuICAgICAgICBjb25zdCBzaWRlcyA9IFNpZGVTdHlsZS5idWlsZFNpZGVzKGNlbGxzLCByZXNvbHV0aW9uKVxuICAgICAgICBpZiAoc2lkZXMubGVuZ3RoID09IDApIHJldHVyblxuXG4gICAgICAgIC8vZ2V0IHNpZGUgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKHNpZGVzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vZHJhdyBzaWRlc1xuXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9ICdidXR0J1xuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24qMC41XG4gICAgICAgIGZvciAobGV0IHNpZGUgb2Ygc2lkZXMpIHtcblxuICAgICAgICAgICAgLy9nZXQgY2F0ZWdvcnkgY29kZXMgZm9yIGJvdGggY2VsbHNcbiAgICAgICAgICAgIGNvbnN0IGNvZGUxID0gc2lkZS5jMSA/IHRoaXMuY29kZShzaWRlLmMxLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgY29uc3QgY29kZTIgPSBzaWRlLmMyID8gdGhpcy5jb2RlKHNpZGUuYzIsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoY29kZTEgPT0gY29kZTIpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8PSAwKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgdzIgPSB3RyAqIDAuNVxuXG4gICAgICAgICAgICAvL3NldCB3aWR0aFxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSB3R1xuXG4gICAgICAgICAgICAvL2RyYXcgc2VnbWVudCB3aXRoIGNvcnJlY3Qgb3JpZW50YXRpb25cbiAgICAgICAgICAgIGlmIChzaWRlLm9yID09PSAnaCcpIHtcbiAgICAgICAgICAgICAgICAvL3RvcCBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUyKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3JbY29kZTJdXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHNpZGUueC1yMiwgc2lkZS55ICsgdzIpXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHNpZGUueCtyMiwgc2lkZS55ICsgdzIpXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2JvdHRvbSBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUxKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3JbY29kZTFdXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHNpZGUueC1yMiwgc2lkZS55IC0gdzIpXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHNpZGUueCtyMiwgc2lkZS55IC0gdzIpXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vcmlnaHQgbGluZVxuICAgICAgICAgICAgICAgIGlmIChjb2RlMikge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbG9yW2NvZGUyXVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhzaWRlLnggKyB3Miwgc2lkZS55LXIyKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhzaWRlLnggKyB3Miwgc2lkZS55K3IyKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9sZWZ0IGxpbmVcbiAgICAgICAgICAgICAgICBpZiAoY29kZTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltjb2RlMV1cbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oc2lkZS54IC0gdzIsIHNpZGUueS1yMilcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oc2lkZS54IC0gdzIsIHNpZGUueStyMilcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKiBAdHlwZWRlZiB7eyB4Om51bWJlciwgeTpudW1iZXIsIG9yOlwidlwifFwiaFwiLCBjMTooaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQnKS5DZWxsKXx1bmRlZmluZWQsIGMyOihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldCcpLkNlbGwpfHVuZGVmaW5lZCB9fSBTaWRlICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKEFycmF5LjxTaWRlPixudW1iZXIsIG51bWJlcik6Kn0gU2lkZVZpZXdTY2FsZSAqL1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpZGVTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIob3B0cylcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIGEgY2VsbCBzaWRlLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKHNpZGUsIHJlc29sdXRpb24sIHosIHNpZGVWaWV3U2NhbGUpID0+ICcjRUE2QkFDJylcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIGEgY2VsbCBzaWRlLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKHNpZGUsIHJlc29sdXRpb24sIHosIHNpZGVWaWV3U2NhbGUpID0+IHJlc29sdXRpb24gLyA1KVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIGEgY2VsbCBzaWRlLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdHMubGVuZ3RoIHx8ICgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgc2lkZVZpZXdTY2FsZSkgPT4gcmVzb2x1dGlvbilcblxuICAgICAgICAvKiogU2V0IHRvIEEgb3IgdHJ1ZSBzbyB0aGF0IHRoZSBzaWRlIGlzIGRyYXduIGFzIGEgZGlhbW9uZCAqL1xuICAgICAgICB0aGlzLmRpYW1vbmQgPSBvcHRzLmRpYW1vbmRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vYnVpbGQgc2lkZXNcblxuICAgICAgICAvKiogIEB0eXBlIHtBcnJheS48U2lkZT59ICovXG4gICAgICAgIGNvbnN0IHNpZGVzID0gU2lkZVN0eWxlLmJ1aWxkU2lkZXMoY2VsbHMsIHJlc29sdXRpb24pXG4gICAgICAgIGlmIChzaWRlcy5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgLy9nZXQgc2lkZSB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoc2lkZXMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9kcmF3IHNpZGVzXG5cbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lQ2FwID0gJ2J1dHQnXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxuICAgICAgICBmb3IgKGxldCBzaWRlIG9mIHNpZGVzKSB7XG5cbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKHNpZGUsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRpYW1vbmQpIHtcblxuICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBkaWFtb25kXG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IHNpZGUueCwgeSA9IHNpZGUueVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4IC0gcjIsIHkpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCwgeSArIHIyKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHggKyByMiwgeSlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyh4LCB5IC0gcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPD0gMCkgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vbGVuZ3RoXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IGxHID0gdGhpcy5sZW5ndGggPyB0aGlzLmxlbmd0aChzaWRlLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8PSAwKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNvbnN0IGxHMiA9IGxHICogMC41XG5cbiAgICAgICAgICAgICAgICAvL3NldCB3aWR0aFxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd0dcbiAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHdpdGggY29ycmVjdCBvcmllbnRhdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzaWRlLngsIHkgPSBzaWRlLnlcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgaWYgKHNpZGUub3IgPT09IFwidlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHgsIHkgLSBsRzIpXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHgsIHkgKyBsRzIpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oeCAtIGxHMiwgeSlcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIGxHMiwgeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG5cblxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQnKS5DZWxsPn0gY2VsbHMgVGhlIGNlbGxzIHRvIHVzZSB0byBidWlsZCB0aGUgc2lkZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGNlbGxzIHJlc29sdXRpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHdpdGhIb3Jpem9udGFsIFNldCB0byB0cnVlIHRvIGJ1aWxkIGhvcml6b250YWwgc2lkZXMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHdpdGhWZXJ0aWNhbCBTZXQgdG8gdHJ1ZSB0byBidWlsZCB2ZXJ0aWNhbCBzaWRlcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2VudGVyIFNldCB0byB0cnVlIHNvIHRoYXQgdGhlIHNpZGUgY29vcmRpbmF0ZSBhcmUgdGhvc2Ugb2YgaXRzIGNlbnRlciBwb2ludCByYXRoZXIgdGhhbiBpdHMgbGVmdC9ib3R0b20gcG9pbnQgKHRoZSBzaWRlIHgseSBjb29yZGluYXRlcyBhcmUgdGhvc2Ugb2YgdGhlIGxlZnQgcG9pbnQgZm9yIGhvcml6b250YWwgc2lkZXMsIGFuZCBvZiB0aGUgYm90dG9tIHBvaW50IGZvciB2ZXJ0aWNhbCBzaWRlcylcbiAgICAgKiBAcmV0dXJucyB7IEFycmF5LjxTaWRlPiB9XG4gICAgICovXG4gICAgc3RhdGljIGJ1aWxkU2lkZXMoY2VsbHMsIHJlc29sdXRpb24sIHdpdGhIb3Jpem9udGFsID0gdHJ1ZSwgd2l0aFZlcnRpY2FsID0gdHJ1ZSwgY2VudGVyID0gdHJ1ZSkge1xuICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48U2lkZT4gfSAqL1xuICAgICAgICBjb25zdCBzaWRlcyA9IFtdXG5cbiAgICAgICAgY29uc3QgcjIgPSBjZW50ZXIgPyByZXNvbHV0aW9uIC8gMiA6IDBcblxuICAgICAgICAvL21ha2UgaG9yaXpvbnRhbCBzaWRlc1xuICAgICAgICAvL3NvcnQgY2VsbHMgYnkgeCBhbmQgeVxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IChjMi54ID09IGMxLnggPyBjMS55IC0gYzIueSA6IGMxLnggLSBjMi54KSlcbiAgICAgICAgbGV0IGMxID0gY2VsbHNbMF1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGMyID0gY2VsbHNbaV1cblxuICAgICAgICAgICAgaWYgKChjMS55ICsgcmVzb2x1dGlvbiA9PSBjMi55KSAmJiAoYzEueCA9PSBjMi54KSlcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGluIHNhbWUgY29sdW1uIGFuZCB0b3VjaCBhbG9uZyBob3Jpem9udGFsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2Ugc2hhcmVkIHNpZGVcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb3I6ICdoJyxcbiAgICAgICAgICAgICAgICAgICAgeDogYzEueCArIHIyLCB5OiBjMi55LFxuICAgICAgICAgICAgICAgICAgICBjMTogYzEsIGMyOiBjMlxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGRvIG5vdCB0b3VjaCBhbG9uZyBob3Jpem9udGFsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2UgdHdvIHNpZGVzOiB0b3Agb25lIGZvciBjMSwgYm90dG9tIGZvciBjMlxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBvcjogJ2gnLFxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcjIsIHk6IGMxLnkgKyByZXNvbHV0aW9uLFxuICAgICAgICAgICAgICAgICAgICBjMTogYzEsIGMyOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBvcjogJ2gnLFxuICAgICAgICAgICAgICAgICAgICB4OiBjMi54ICsgcjIsIHk6IGMyLnksXG4gICAgICAgICAgICAgICAgICAgIGMxOiB1bmRlZmluZWQsIGMyOiBjMlxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGMxID0gYzJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vbWFrZSB2ZXJ0aWNhbCBzaWRlc1xuICAgICAgICAvL3NvcnQgY2VsbHMgYnkgeSBhbmQgeFxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IChjMi55ID09IGMxLnkgPyBjMS54IC0gYzIueCA6IGMxLnkgLSBjMi55KSlcbiAgICAgICAgYzEgPSBjZWxsc1swXVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYzIgPSBjZWxsc1tpXVxuXG4gICAgICAgICAgICBpZiAoKGMxLnggKyByZXNvbHV0aW9uID09IGMyLngpICYmIChjMS55ID09IGMyLnkpKVxuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSByb3cgYW5kIHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2Ugc2hhcmVkIHNpZGVcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcbiAgICAgICAgICAgICAgICAgICAgeDogYzEueCArIHJlc29sdXRpb24sIHk6IGMxLnkgKyByMixcbiAgICAgICAgICAgICAgICAgICAgYzE6IGMxLCBjMjogYzJcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9jZWxscyBkbyBub3QgdG91Y2ggYWxvbmcgdmVydGljYWwgc2lkZVxuICAgICAgICAgICAgICAgIC8vbWFrZSB0d28gc2lkZXM6IHJpZ2h0IG9uZSBmb3IgYzEsIGxlZnQgZm9yIGMyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG9yOiAndicsXG4gICAgICAgICAgICAgICAgICAgIHg6IGMxLnggKyByZXNvbHV0aW9uLCB5OiBjMS55ICsgcjIsXG4gICAgICAgICAgICAgICAgICAgIGMxOiBjMSwgYzI6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG9yOiAndicsXG4gICAgICAgICAgICAgICAgICAgIHg6IGMyLngsIHk6IGMyLnkgKyByMixcbiAgICAgICAgICAgICAgICAgICAgYzE6IHVuZGVmaW5lZCwgYzI6IGMyXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYzEgPSBjMlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaWRlc1xuICAgIH1cblxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5pbXBvcnQgeyBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkLmpzJ1xuXG4vKipcbiAqIFN0eWxlIGJhc2VkIG9uIHdlYkdMXG4gKiBUbyBzaG93IGNlbGxzIGFzIGNvbG9yZWQgc3F1YXJlcywgZnJvbSBjYXRlZ29yaWVzLlxuICogQWxsIGNlbGxzIGFyZSBkcmF3biBhcyBzcXVhcmVzLCB3aXRoIHRoZSBzYW1lIHNpemVcbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjYXRlZ29yeSBjb2RlIG9mIHRoZSBjZWxsLCBmb3IgY29sb3JpbmcuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2RlID0gb3B0cy5jb2RlXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChjb2RlIC0+IGNvbG9yKSB3aGljaCBnaXZlcyB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeSBjb2RlLlxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICBvcHRzLmNvbG9yID0gb3B0cy5jb2xvciB8fCB1bmRlZmluZWRcblxuICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48c3RyaW5nPiB9ICovXG4gICAgICAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMob3B0cy5jb2xvcilcblxuICAgICAgICAvKiogQHR5cGUgeyBvYmplY3QgfSBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLmNhdFRvSSA9IHt9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpKyspIHRoaXMuY2F0VG9JW2NvZGVzW2ldXSA9IGkgKyAnJ1xuXG4gICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxzdHJpbmc+IH0gQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgY29kZXMpXG4gICAgICAgICAgICB0aGlzLmNvbG9ycy5wdXNoKG9wdHMuY29sb3JbJycgKyBjb2RlXSlcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgdGhlIGNlbGxzLCBpbiBnZW9ncmFwaGljYWwgdW5pdC4gQWxsIGNlbGxzIGhhdmUgdGhlIHNhbWUgc2l6ZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIC8vIChyZXNvbHV0aW9uLCB6KSA9PiAuLi5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUgeyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQgfSAqL1xuICAgICAgICB0aGlzLndncCA9IG5ldyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQodGhpcy5jb2xvcnMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2FkZCB2ZXJ0aWNlIGFuZCBmcmFnbWVudCBkYXRhXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgbGV0IGMsIG5iID0gY2VsbHMubGVuZ3RoXG4gICAgICAgIGNvbnN0IHZlcnRpY2VzQnVmZmVyID0gW11cbiAgICAgICAgY29uc3QgaUJ1ZmZlciA9IFtdXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgYyA9IGNlbGxzW2ldXG4gICAgICAgICAgICBjb25zdCBjYXQgPSB0aGlzLmNvZGUoYylcbiAgICAgICAgICAgIGlmIChjYXQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VuZXhwZWN0ZWQgY2F0ZWdvcnk6ICcgKyBjYXQpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgY29uc3QgaV8gPSB0aGlzLmNhdFRvSVtjYXRdXG4gICAgICAgICAgICBpZiAoaXNOYU4oK2lfKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbmV4cGVjdGVkIGNhdGVnb3J5IGluZGV4OiAnICsgY2F0ICsgJyAnICsgaV8pXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlcnRpY2VzQnVmZmVyLnB1c2goYy54ICsgcjIsIGMueSArIHIyKVxuICAgICAgICAgICAgaUJ1ZmZlci5wdXNoKCtpXylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY3JlYXRlIGNhbnZhcyBhbmQgd2ViZ2wgcmVuZGVyZXJcbiAgICAgICAgY29uc3QgY3ZXR0wgPSBtYWtlV2ViR0xDYW52YXMoZ2VvQ2FudmFzLncgKyAnJywgZ2VvQ2FudmFzLmggKyAnJylcbiAgICAgICAgaWYgKCFjdldHTCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvL2RyYXdcbiAgICAgICAgY29uc3Qgc2l6ZUdlbyA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShyZXNvbHV0aW9uLCB6KSA6IHJlc29sdXRpb24gKyAwLjIgKiB6XG4gICAgICAgIHRoaXMud2dwLmRyYXcoY3ZXR0wuZ2wsIHZlcnRpY2VzQnVmZmVyLCBpQnVmZmVyLCBnZW9DYW52YXMuZ2V0V2ViR0xUcmFuc2Zvcm0oKSwgc2l6ZUdlbyAvIHopXG5cbiAgICAgICAgLy9kcmF3IGluIGNhbnZhcyBnZW9cbiAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICBnZW9DYW52YXMuY3R4LmRyYXdJbWFnZShjdldHTC5jYW52YXMsIDAsIDApXG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiB9KVxuICAgIH1cbn0iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcbmltcG9ydCB7IG1ha2VXZWJHTENhbnZhcyB9IGZyb20gJy4uL3V0aWxzL3dlYkdMVXRpbHMuanMnXG5pbXBvcnQgeyBXZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQgfSBmcm9tICcuLi91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQuanMnXG5cbi8qKlxuICogU3R5bGUgYmFzZWQgb24gd2ViR0xcbiAqIFRvIHNob3cgY2VsbHMgYXMgY29sb3JlZCBzcXVhcmVzLCB3aXRoIGNvbXB1dGF0aW9uIG9mIHRoZSBjb2xvcnMgb24gR1BVIHNpZGUgKGZhc3RlciB0aGFuIEphdmFTY3JpcHQgc2lkZSkuXG4gKiBBbGxzIHNxdWFyZXMgd2l0aCB0aGUgc2FtZSBzaXplXG4gKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU3F1YXJlQ29sb3JXZWJHTFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgYSB0IHZhbHVlICh3aXRoaW4gWzAsMV0pIGZvciBhIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy50RnVuID0gb3B0cy50RnVuIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXN0cmlidXRpb24gc3RyZXRjaGluZyBtZXRob2QuXG4gICAgICAgICAqIFRoZSBzdHJldGNoaW5nIGlzIHBlcmZvcm1lZCBvbiBHUFUgc2lkZSAoZnJhZ21lbnQgc2hhZGVyKS5cbiAgICAgICAgICogQHR5cGUge3sgZnVuOnN0cmluZywgYWxwaGE6bnVtYmVyIH19ICovXG4gICAgICAgIHRoaXMuc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc2FtcGxlIG9mIHRoZSBjb2xvciByYW1wLlxuICAgICAgICAgKiBUaGUgY29sb3IgaXMgY29tcHV0ZWQgb24gR1BVIHNpZGUgKGZyYWdtZW50IHNoYWRlcikgYmFzZWQgb24gdGhvc2UgdmFsdWVzIChsaW5lYXIgaW50ZXJwb2xhdGlvbikuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPVxuICAgICAgICAgICAgb3B0cy5jb2xvcnMgfHxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAncmdiKDE1OCwgMSwgNjYpJyxcbiAgICAgICAgICAgICAgICAncmdiKDI0OCwgMTQyLCA4MyknLFxuICAgICAgICAgICAgICAgICdyZ2IoMjUxLCAyNDgsIDE3NiknLFxuICAgICAgICAgICAgICAgICdyZ2IoMTM3LCAyMDcsIDE2NSknLFxuICAgICAgICAgICAgICAgICdyZ2IoOTQsIDc5LCAxNjIpJyxcbiAgICAgICAgICAgIF0ucmV2ZXJzZSgpXG4gICAgICAgIGlmIChvcHRzLmNvbG9yKVxuICAgICAgICAgICAgdGhpcy5jb2xvcnMgPSBbXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwKSxcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuMiksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwLjQpLFxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMC42KSxcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuOCksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigxKSxcbiAgICAgICAgICAgIF1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lIHRoZSBvcGFjaXR5IG9mIHRoZSBzdHlsZSwgd2l0aGluIFswLDFdLlxuICAgICAgICAgKiBJZiB0aGlzIG9wYWNpdHkgaXMgZGVmaW5lZCwgdGhlIGluZGl2aWR1YWwgY29sb3Igb3BhY2l0eSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub3BhY2l0eSA9IG9wdHMub3BhY2l0eSAvLyAocix6KSA9PiAuLi5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgdGhlIGNlbGxzLCBpbiBnZW9ncmFwaGljYWwgdW5pdC4gQWxsIGNlbGxzIGhhdmUgdGhlIHNhbWUgc2l6ZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIC8vIChyZXNvbHV0aW9uLCB6KSA9PiAuLi5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2NyZWF0ZSBjYW52YXMgYW5kIHdlYmdsIHJlbmRlcmVyXG4gICAgICAgIC8vZm9yIG9wYWNpdHkgY29udHJvbCwgc2VlOiBodHRwczovL3dlYmdsZnVuZGFtZW50YWxzLm9yZy93ZWJnbC9sZXNzb25zL3dlYmdsLWFuZC1hbHBoYS5odG1sXG4gICAgICAgIGNvbnN0IGN2V0dMID0gbWFrZVdlYkdMQ2FudmFzKFxuICAgICAgICAgICAgZ2VvQ2FudmFzLncgKyAnJyxcbiAgICAgICAgICAgIGdlb0NhbnZhcy5oICsgJycsXG4gICAgICAgICAgICB0aGlzLm9wYWNpdHkgIT0gdW5kZWZpbmVkID8geyBwcmVtdWx0aXBsaWVkQWxwaGE6IGZhbHNlIH0gOiB1bmRlZmluZWRcbiAgICAgICAgKVxuICAgICAgICBpZiAoIWN2V0dMKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyB3ZWJHTCcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vYWRkIHZlcnRpY2UgYW5kIGZyYWdtZW50IGRhdGFcbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uIC8gMlxuICAgICAgICBjb25zdCB2ZXJ0aWNlc0J1ZmZlciA9IFtdXG4gICAgICAgIGNvbnN0IHRCdWZmZXIgPSBbXVxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy50RnVuKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgIGlmICh0ID09IG51bGwgfHwgdCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICB2ZXJ0aWNlc0J1ZmZlci5wdXNoKGNlbGwueCArIHIyLCBjZWxsLnkgKyByMilcbiAgICAgICAgICAgIHRCdWZmZXIucHVzaCh0ID4gMSA/IDEgOiB0IDwgMCA/IDAgOiB0KVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wdXRlIHBpeGVsIHNpemVcbiAgICAgICAgY29uc3Qgc2l6ZUdlbyA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShyZXNvbHV0aW9uLCB6KSA6IHJlc29sdXRpb24gKyAwLjIgKiB6XG5cbiAgICAgICAgLy9jb21wdXRlIG9wYWNpdHlcbiAgICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wYWNpdHkgPyB0aGlzLm9wYWNpdHkocmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB3Z3AgPSBuZXcgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkKGN2V0dMLmdsLCB0aGlzLmNvbG9ycywgdGhpcy5zdHJldGNoaW5nLCBzaXplR2VvIC8geiwgb3ApXG5cbiAgICAgICAgLy9kcmF3XG4gICAgICAgIHdncC5kcmF3KHZlcnRpY2VzQnVmZmVyLCB0QnVmZmVyLCBnZW9DYW52YXMuZ2V0V2ViR0xUcmFuc2Zvcm0oKSlcblxuICAgICAgICAvL2RyYXcgaW4gY2FudmFzIGdlb1xuICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgIGdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKGN2V0dMLmNhbnZhcywgMCwgMClcblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cm9rZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBvcHRzLnN0cm9rZUNvbG9yIHx8ICgoKSA9PiBcIiM2NjZcIikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogVGhlIHN0cm9rZSBsaW5lIHdpZHRoIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc3Ryb2tlV2lkdGggPSBvcHRzLnN0cm9rZVdpZHRoIHx8ICgoY2VsbCwgcmVzb2x1dGlvbiwgeikgPT4geiAqIDEuNSkgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaGFwZSBvZiBhIGNlbGwuXG4gICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTppbXBvcnQoXCIuLi9jb3JlL1N0eWxlLmpzXCIpLlNoYXBlfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gXCJzcXVhcmVcIikgLy8oYyxyLHosdnMpID0+IHt9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyBzcXVhcmVzLCB3aXRoIHZhcmlvdXMgY29sb3JzIGFuZCBzaXplLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uICogMC41XG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcblxuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5zdHJva2VDb2xvciA/IHRoaXMuc3Ryb2tlQ29sb3IoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlbyB1bml0XG4gICAgICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplID8gdGhpcy5zaXplKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiByZXNvbHV0aW9uXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIGNvbnN0IHdpID0gdGhpcy5zdHJva2VXaWR0aCA/IHRoaXMuc3Ryb2tlV2lkdGgoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IDEgKiB6XG4gICAgICAgICAgICBpZiAoIXdpIHx8IHdpIDw9IDApIGNvbnRpbnVlXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHdpXG5cbiAgICAgICAgICAgIC8vc2hhcGVcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZSA/IHRoaXMuc2hhcGUoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdzcXVhcmUnXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdzcXVhcmUnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IHNxdWFyZVxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSByZXNvbHV0aW9uICogKDEgLSBzaXplIC8gcmVzb2x1dGlvbikgKiAwLjVcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5yZWN0KGMueCArIGQgKyBvZmZzZXQuZHgsIGMueSArIGQgKyBvZmZzZXQuZHksIHNpemUsIHNpemUpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgY2lyY2xlXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKGMueCArIHIyICsgb2Zmc2V0LmR4LCBjLnkgKyByMiArIG9mZnNldC5keSwgc2l6ZSAqIDAuNSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkaWFtb25kJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMyID0gc2l6ZSAqIDAuNVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggKyByMiAtIHMyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgKyBzMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiArIHMyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgLSBzMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiAtIHMyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZG9udXQnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm90IGltcGxlbWVudGVkJylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV91cCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9kb3duJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGMueCAtIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9sZWZ0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54IC0gZHIyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9yaWdodCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggLSBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyBzaGFwZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTaWRlU3R5bGUgfSBmcm9tICcuL1NpZGVTdHlsZS5qcydcbmltcG9ydCB7IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlIH0gZnJvbSAnLi9TcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZS5qcydcbmltcG9ydCB7IGNsYXNzaWZpZXIgYXMgY2xGdW4sIGNvbG9yQ2xhc3NpZmllciBhcyBjY2xGdW4gfSBmcm9tICcuLi91dGlscy9zY2FsZS5qcydcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vbWFuaWZvbGQubmV0L2RvYy9tZmQ5L2V4YW1wbGVfX3RhbmFrYV9jb250b3Vycy5odG1cbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBUYW5ha2FTdHlsZSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpOm51bWJlcn0gdmFsdWUgRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIGNlbGxcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBicmVha3MgVGhlIGJyZWFrIHZhbHVlc1xuICAgICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNvbG9ycyBUaGUgY29sb3JzLCBvbmUgbW9yZSB0aGFuIHRoZSBicmVhayB2YWx1ZXNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT59XG4gICAgICovXG4gICAgc3RhdGljIGdldCh2YWx1ZSwgYnJlYWtzLCBjb2xvcnMsIG9wdHMgPSB7fSkge1xuXG4gICAgICAgIC8vc2hhZG93IGNvbG9yc1xuICAgICAgICBvcHRzLmNvbG9yRGFyayA9IG9wdHMuY29sb3JEYXJrIHx8ICcjMTExJ1xuICAgICAgICBvcHRzLmNvbG9yQnJpZ2h0ID0gb3B0cy5jb2xvckJyaWdodCB8fCAnI2RkZCdcblxuICAgICAgICAvKiogQHR5cGUgeyBmdW5jdGlvbihudW1iZXIsIG51bWJlcik6bnVtYmVyIH0gKi9cbiAgICAgICAgb3B0cy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChzaWRlVmFsdWUsIHJlc29sdXRpb24sIHopID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1pbldHID0gMSAqIHpcbiAgICAgICAgICAgIGNvbnN0IG1heFdHID0gNCAqIHpcbiAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSAobWF4V0cgLSBtaW5XRykgLyAzXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4obWluV0cgKyAoc2lkZVZhbHVlIC0gMSkgKiBzdGVwLCBtYXhXRylcbiAgICAgICAgfSlcblxuICAgICAgICAvL21ha2UgY2xhc3NpZmllclxuICAgICAgICBjb25zdCBjbGFzc2lmaWVyID0gY2xGdW4oYnJlYWtzKVxuICAgICAgICAvL21ha2UgY29sb3JzIHRhYmxlXG4gICAgICAgIGNvbnN0IGNvbG9yc0RpY3QgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIGNvbG9yc0RpY3RbaSArIFwiXCJdID0gY29sb3JzW2ldXG5cbiAgICAgICAgY29uc3QgY2VsbFN0eWxlID0gbmV3IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlKHtcbiAgICAgICAgICAgIGNvZGU6IGNlbGwgPT4gY2xhc3NpZmllcih2YWx1ZShjZWxsKSksXG4gICAgICAgICAgICBjb2xvcjogY29sb3JzRGljdFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGdldFNpZGVWYWx1ZSA9IChzaWRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjbDEgPSBzaWRlLmMxID8gY2xhc3NpZmllcih2YWx1ZShzaWRlLmMxKSkgOiAtMVxuICAgICAgICAgICAgY29uc3QgY2wyID0gc2lkZS5jMiA/IGNsYXNzaWZpZXIodmFsdWUoc2lkZS5jMikpIDogLTFcbiAgICAgICAgICAgIHJldHVybiBjbDEgLSBjbDJcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiBUaGUgc2lkZSBzdHlsZSwgZm9yIHRoZSBzaGFkb3cgZWZmZWN0ICovXG4gICAgICAgIGNvbnN0IHNpZGVTdHlsZSA9IG5ldyBTaWRlU3R5bGUoe1xuICAgICAgICAgICAgLy93aGl0ZSBvciBibGFjaywgZGVwZW5kaW5nIG9uIG9yaWVudGF0aW9uIGFuZCB2YWx1ZVxuICAgICAgICAgICAgY29sb3I6IChzaWRlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdiA9IGdldFNpZGVWYWx1ZShzaWRlKVxuICAgICAgICAgICAgICAgIGlmICh2ID09PSAwKSByZXR1cm5cbiAgICAgICAgICAgICAgICBpZiAoc2lkZS5vciA9PT0gJ3YnKSByZXR1cm4gdiA8IDAgPyBvcHRzLmNvbG9yQnJpZ2h0IDogb3B0cy5jb2xvckRhcmtcbiAgICAgICAgICAgICAgICByZXR1cm4gdiA8IDAgPyBvcHRzLmNvbG9yRGFyayA6IG9wdHMuY29sb3JCcmlnaHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvL3dpZHRoIGRlcGVuZHMgb24gdGhlIHZhbHVlLCB0aGF0IGlzIHRoZSBudW1iZXIgb2YgY2xhc3NlcyBvZiBkaWZmZXJlbmNlXG4gICAgICAgICAgICB3aWR0aDogKHNpZGUsIHJlc29sdXRpb24sIHopID0+IG9wdHMud2lkdGgoTWF0aC5hYnMoZ2V0U2lkZVZhbHVlKHNpZGUpKSwgcmVzb2x1dGlvbiwgeilcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gW2NlbGxTdHlsZSwgc2lkZVN0eWxlXVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRleHRTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0ZXh0IG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnRleHQgPSBvcHRzLnRleHQgfHwgKCgpID0+ICdYJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gXCJibGFja1wiKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGZvbnQgc2l6ZSBvZiBhIGNlbGwgaW4gZ2VvIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24pIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBUaGUgdGV4dCBmb250IGZhbWlseS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZvbnRGYW1pbHkgPSBvcHRzLmZvbnRGYW1pbHkgfHwgKCgpID0+ICdBcmlhbCcpXG5cbiAgICAgICAgLyoqIFRoZSB0ZXh0IGZvbnQgd2VpZ2h0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZm9udFdlaWdodCA9IG9wdHMuZm9udFdlaWdodCB8fCAoKCkgPT4gJ2JvbGQnKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcblxuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vZHJhdyB3aXRoIEhUTUwgY2FudmFzXG4gICAgICAgIC8vaW4gc2NyZWVuIGNvb3JkaW5hdGVzXG4gICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2dldCBjZWxsIHRleHRcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnRleHQgPyB0aGlzLnRleHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKHRleHQgPT0gdW5kZWZpbmVkIHx8IHRleHQgPT0gbnVsbCB8fCB0ZXh0ICsgJycgPT09ICcnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCkgY29udGludWVcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vZm9udCBzaXplXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBwaXhlbCB1bml0XG4gICAgICAgICAgICBjb25zdCBmb250U2l6ZVBpeCA9IHRoaXMuZm9udFNpemUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSAvIHpcbiAgICAgICAgICAgIGlmICghZm9udFNpemVQaXgpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vc2V0IGZvbnRcbiAgICAgICAgICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLmZvbnRGYW1pbHkgPyB0aGlzLmZvbnRGYW1pbHkoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdBcmlhbCdcbiAgICAgICAgICAgIGNvbnN0IGZvbnRXZWlnaHQgPSB0aGlzLmZvbnRXZWlnaHQgPyB0aGlzLmZvbnRXZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdib2xkJ1xuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5mb250ID0gZm9udFdlaWdodCArICcgJyArIGZvbnRTaXplUGl4ICsgJ3B4ICcgKyBmb250RmFtaWx5XG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgLy90ZXh0IHBvc2l0aW9uXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInXG4gICAgICAgICAgICBjb25zdCB0eCA9IGdlb0NhbnZhcy5nZW9Ub1BpeFgoY2VsbC54ICsgcmVzb2x1dGlvbiAqIDAuNSArIG9mZnNldC5keClcbiAgICAgICAgICAgIGNvbnN0IHR5ID0gZ2VvQ2FudmFzLmdlb1RvUGl4WShjZWxsLnkgKyByZXNvbHV0aW9uICogMC41ICsgb2Zmc2V0LmR5KSArIGZvbnRTaXplUGl4ICogMC4zIC8vaXQgc2hvdWxkIGJlIDAuNSBidXQgMC4zIHNlZW1zIHRvIHdvcmsgYmV0dGVyXG5cbiAgICAgICAgICAgIC8vZHJhdyB0aGUgdGV4dFxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsVGV4dCh0ZXh0LCB0eCwgdHkpXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGEgZnVuY3Rpb24gWzAsMV0tPnN0cmluZyBmb3IgY2hhcmFjdGVycyBsZWdlbmRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNoYXJzXG4gICAgICogQHBhcmFtIHsoZnVuY3Rpb24obnVtYmVyKTpudW1iZXIpfHVuZGVmaW5lZH0gc2NhbGVcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIHRleHRTY2FsZShjaGFycywgc2NhbGUgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbmIgPSBjaGFycy5sZW5ndGhcbiAgICAgICAgcmV0dXJuICh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoc2NhbGUpIHQgPSBzY2FsZSh0KVxuICAgICAgICAgICAgaWYgKHQgPT0gMCkgcmV0dXJuIFwiXCJcbiAgICAgICAgICAgIGlmICh0ID49IDEpIHJldHVybiBjaGFyc1tuYiAtIDFdXG4gICAgICAgICAgICByZXR1cm4gY2hhcnNbTWF0aC5mbG9vcih0ICogbmIpXVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKiBAdHlwZWRlZiB7XCJmaXJzdFwifFwiYm90dG9tXCJ8XCJjZW50ZXJcInxcInRvcFwifFwibGFzdFwifSBBbmNob3JNb2RlWUVudW0gKi9cblxuLyoqXG4gKiBTaG93IGNlbGwgYXMgdGltZXNlcmllcyBjaGFydFxuICogQ2FuIGJlIHVzZWQgZm9yIHNwYXJrbGluZSBtYXAgb2YgaHR0cHM6Ly9kYXRhZ2lzdGlwcy5oeXBvdGhlc2VzLm9yZy80ODhcbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lU2VyaWVzU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgY29sdW1ucyBvZiB0aGUgdGltZSBzZXJpZXMsIG9yZGVyZWQgaW4gY2hyb25vbG9naWNhbCBvcmRlci5cbiAgICAgICAgICogQHR5cGUge0FycmF5LjxzdHJpbmc+fSAqL1xuICAgICAgICB0aGlzLnRzID0gb3B0cy50c1xuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHNwZWNpZnlpbmcgd2hlbiBhIHZhbHVlIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIFwibm8gZGF0YVwiIGFuZCB0aHVzIG5vdCBpZ25vcmVkLiBUaGUgbGluZSB3aWxsIGhhdmUgYSBicmVhayBhdCB0aGVzZSB2YWx1ZXMuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcpOmJvb2xlYW59ICovXG4gICAgICAgIHRoaXMubm9EYXRhID0gb3B0cy5ub0RhdGEgfHwgKCh2KSA9PiB2ID09PSB1bmRlZmluZWQgfHwgdiA9PSBcIlwiIHx8IHYgPT09IG51bGwgfHwgaXNOYU4oK3YpKVxuXG4gICAgICAgIC8veFxuICAgICAgICAvKiogaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vZmZzZXRYID0gb3B0cy5vZmZzZXRYIHx8ICgoYywgciwgeikgPT4gMClcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoYywgciwgeikgPT4gcilcblxuICAgICAgICAvL3lcbiAgICAgICAgLyoqIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub2Zmc2V0WSA9IG9wdHMub2Zmc2V0WSB8fCAoKGMsIHIsIHopID0+IDApXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8ICgoYywgciwgeikgPT4gcilcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpBbmNob3JNb2RlWUVudW19ICovXG4gICAgICAgIHRoaXMuYW5jaG9yTW9kZVkgPSBvcHRzLmFuY2hvck1vZGVZIHx8ICgoYywgciwgeikgPT4gXCJjZW50ZXJcIilcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBsaW5lLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubGluZVdpZHRoID0gb3B0cy5saW5lV2lkdGggfHwgKCh2LCByLCBzLCB6KSA9PiAxLjUgKiB6KVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNoYXJ0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiBcImJsYWNrXCIpIC8vKGMscix6LHZzKSA9PiB7fVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcblxuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vY29tcHV0ZSBjZWxsIGFtcGxpdHVkZVxuICAgICAgICBjb25zdCBnZXRBbXBsaXR1ZGUgPSBjID0+IHtcbiAgICAgICAgICAgIGxldCBtaW4sIG1heFxuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY1t0XTtcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgICAgICBpZiAobWluID09IHVuZGVmaW5lZCB8fCB2YWwgPCBtaW4pIG1pbiA9IHZhbFxuICAgICAgICAgICAgICAgIGlmIChtYXggPT0gdW5kZWZpbmVkIHx8IHZhbCA+IG1heCkgbWF4ID0gdmFsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWluID09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIG1heCAtIG1pblxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wdXRlIG1heCBhbXBsaXR1ZGVcbiAgICAgICAgbGV0IGFtcE1heFxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBjb25zdCBhbXAgPSBnZXRBbXBsaXR1ZGUoYylcbiAgICAgICAgICAgIGlmIChhbXAgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKGFtcE1heCA9PSB1bmRlZmluZWQgfHwgYW1wID4gYW1wTWF4KSBhbXBNYXggPSBhbXBcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFtcE1heCkgcmV0dXJuXG5cbiAgICAgICAgY29uc3QgbmIgPSB0aGlzLnRzLmxlbmd0aFxuXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9IFwiYnV0dFwiXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcblxuICAgICAgICAgICAgLy9saW5lIHdpZHRoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCB3RyA9IHRoaXMubGluZVdpZHRoID8gdGhpcy5saW5lV2lkdGgoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vbGluZSBjb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXG5cblxuICAgICAgICAgICAgLy94XG4gICAgICAgICAgICBjb25zdCBvZmZYID0gdGhpcy5vZmZzZXRYID8gdGhpcy5vZmZzZXRYKGMsIHJlc29sdXRpb24sIHopIDogMFxuICAgICAgICAgICAgaWYgKG9mZlggPT0gdW5kZWZpbmVkIHx8IGlzTmFOKG9mZlgpKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGggPyB0aGlzLndpZHRoKGMsIHJlc29sdXRpb24sIHopIDogcmVzb2x1dGlvblxuICAgICAgICAgICAgaWYgKHcgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHcpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3lcbiAgICAgICAgICAgIGNvbnN0IG9mZlkgPSB0aGlzLm9mZnNldFkgPyB0aGlzLm9mZnNldFkoYywgcmVzb2x1dGlvbiwgeikgOiAwXG4gICAgICAgICAgICBpZiAob2ZmWSA9PSB1bmRlZmluZWQgfHwgaXNOYU4ob2ZmWSkpIGNvbnRpbnVlXG4gICAgICAgICAgICBjb25zdCBoID0gdGhpcy5oZWlnaHQgPyB0aGlzLmhlaWdodChjLCByZXNvbHV0aW9uLCB6KSA6IHJlc29sdXRpb25cbiAgICAgICAgICAgIGlmIChoID09IHVuZGVmaW5lZCB8fCBpc05hTihoKSkgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IGFuY2hZID0gdGhpcy5hbmNob3JNb2RlWSA/IHRoaXMuYW5jaG9yTW9kZVkoYywgcmVzb2x1dGlvbiwgeikgOiBcImNlbnRlclwiXG4gICAgICAgICAgICBpZiAoIWFuY2hZKSBjb250aW51ZVxuXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHdHXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBhbmNob3IgWSBmaWd1cmVzXG4gICAgICAgICAgICBsZXQgdmFsMCwgeTBcbiAgICAgICAgICAgIGlmIChhbmNoWSA9PT0gXCJmaXJzdFwiKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgZmlyc3QgdmFsdWVcbiAgICAgICAgICAgICAgICB2YWwwID0gY1t0aGlzLnRzWzBdXVxuICAgICAgICAgICAgICAgIHkwID0gMFxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gXCJsYXN0XCIpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBsYXN0IHZhbHVlXG4gICAgICAgICAgICAgICAgdmFsMCA9IGNbdGhpcy50c1t0aGlzLnRzLmxlbmd0aCAtIDFdXVxuICAgICAgICAgICAgICAgIHkwID0gMFxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gXCJib3R0b21cIikge1xuICAgICAgICAgICAgICAgIC8vZ2V0IG1pblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSArY1t0XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwwID09IHVuZGVmaW5lZCB8fCB2YWwgPCB2YWwwKSB2YWwwID0gdmFsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHkwID0gMFxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gXCJ0b3BcIikge1xuICAgICAgICAgICAgICAgIC8vZ2V0IG1heFxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSArY1t0XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwwID09IHVuZGVmaW5lZCB8fCB2YWwgPiB2YWwwKSB2YWwwID0gdmFsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHkwID0gcmVzb2x1dGlvblxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gXCJjZW50ZXJcIikge1xuICAgICAgICAgICAgICAgIC8vZ2V0IG1pbiBhbmQgbWF4XG4gICAgICAgICAgICAgICAgbGV0IG1pbiwgbWF4XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNbdF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICBpZiAobWluID09IHVuZGVmaW5lZCB8fCB2YWwgPCBtaW4pIG1pbiA9IHZhbFxuICAgICAgICAgICAgICAgICAgICBpZiAobWF4ID09IHVuZGVmaW5lZCB8fCB2YWwgPiBtYXgpIG1heCA9IHZhbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWwwID0gKCttYXggKyArbWluKSAqIDAuNVxuICAgICAgICAgICAgICAgIHkwID0gcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJVbmV4cGVjdGVkIGFuY2hvck1vZGVZOiBcIiArIGFuY2hZKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKi9kcmF3IGxpbmVcbiAgICAgICAgICAgIGlmICh2YWwwID09IHVuZGVmaW5lZCB8fCBpc05hTih2YWwwKSkgY29udGludWVcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY29uc3Qgc1ggPSB3IC8gKG5iIC0gMSlcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNbdGhpcy50c1tpXV1cbiAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCB8fCBpc05hTih2YWwpKSBicmVha1xuICAgICAgICAgICAgICAgIGlmIChpID09IDApXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oYy54ICsgaSAqIHNYICsgb2ZmWCwgYy55ICsgeTAgKyAodmFsIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oYy54ICsgaSAqIHNYICsgb2ZmWCwgYy55ICsgeTAgKyAodmFsIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKSovXG5cblxuICAgICAgICAgICAgLy9kcmF3IGxpbmUsIHNlZ21lbnQgYnkgc2VnbWVudFxuICAgICAgICAgICAgY29uc3Qgc1ggPSB3IC8gKG5iIC0gMSlcblxuICAgICAgICAgICAgLy9oYW5kbGUgZmlyc3QgcG9pbnRcbiAgICAgICAgICAgIGxldCB2MCA9IGNbdGhpcy50c1swXV1cbiAgICAgICAgICAgIGlmICghdGhpcy5ub0RhdGEodjApKSB7XG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGMueCArIG9mZlgsIGMueSArIHkwICsgKHYwIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2codjAsIGlzTmFOKHYwKSlcblxuICAgICAgICAgICAgbGV0IHYxXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2MSA9IGNbdGhpcy50c1tpXV1cblxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IGZyb20gdjAgdG8gdjFcblxuICAgICAgICAgICAgICAgIC8vYm90aCBwb2ludHMgJ25vIGRhdGEnXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9EYXRhKHYwKSAmJiB0aGlzLm5vRGF0YSh2MSkpIHtcblxuICAgICAgICAgICAgICAgICAgICAvL3NlY29uZCBwb2ludCAnbm8gZGF0YSdcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm5vRGF0YSh2MCkgJiYgdGhpcy5ub0RhdGEodjEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcblxuICAgICAgICAgICAgICAgICAgICAvL2ZpcnN0IHBvaW50ICdubyBkYXRhJ1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub0RhdGEodjApICYmICF0aGlzLm5vRGF0YSh2MSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggKyBpICogc1ggKyBvZmZYLCBjLnkgKyB5MCArICh2MSAtIHZhbDApICogaCAvIGFtcE1heCArIG9mZlkpXG5cbiAgICAgICAgICAgICAgICAgICAgLy9ib3RoIHBvaW50cyBoYXZlIGRhdGE6IHRyYWNlIGxpbmVcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyBpICogc1ggKyBvZmZYLCBjLnkgKyB5MCArICh2MSAtIHZhbDApICogaCAvIGFtcE1heCArIG9mZlkpXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgaXQgaXMgdGhlIGxhc3QgcG9pbnQsIHN0cm9rZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBuYiAtIDEpIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdjAgPSB2MVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmQsIGlmIGFueVxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG5cbn1cblxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBpbml0U2hhZGVyUHJvZ3JhbSwgY3JlYXRlU2hhZGVyIH0gZnJvbSAnLi93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdkMy1jb2xvcidcblxuLyoqXG4gKiBFdmVyeXRoaW5nIHRvIGVhc2lseSBkcmF3IGNvbG9yZWQgc3F1YXJlcyB3aXRoIHdlYkdMLlxuICogQWxsIHRoZSBzYW1lIHNpemUsIGJ1dCBkaWZmZXJlbnQgZmlsbCBjb2xvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkdMU3F1YXJlQ29sb3Jpbmcge1xuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZ2wsIHNpemVQaXgpIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsXG4gICAgICAgIHRoaXMuc2l6ZVBpeCA9IHNpemVQaXggfHwgMTAuMFxuXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKFxuICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICBjcmVhdGVTaGFkZXIoXG4gICAgICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICAgICAgZ2wuVkVSVEVYX1NIQURFUixcbiAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XG4gICAgICAgICAgICB1bmlmb3JtIGZsb2F0IHNpemVQaXg7XG4gICAgICAgICAgICB1bmlmb3JtIG1hdDMgbWF0O1xuICAgICAgICAgICAgYXR0cmlidXRlIHZlYzQgY29sb3I7XG4gICAgICAgICAgICB2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuICAgICAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQobWF0ICogdmVjMyhwb3MsIDEuMCksIDEuMCk7XG4gICAgICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgICAgIHZDb2xvciA9IGNvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGBcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjcmVhdGVTaGFkZXIoXG4gICAgICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICAgICAgZ2wuRlJBR01FTlRfU0hBREVSLFxuICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuICAgICAgICAgICAgdmFyeWluZyB2ZWM0IHZDb2xvcjtcbiAgICAgICAgICAgIHZvaWQgbWFpbih2b2lkKSB7XG4gICAgICAgICAgICAgICAgdmVjNCB2Q29sb3JfID0gdkNvbG9yIC8gMjU1LjA7XG4gICAgICAgICAgICAgICAgdkNvbG9yX1szXSA9IDI1NS4wICogdkNvbG9yX1szXTtcbiAgICAgICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSB2Q29sb3JfO1xuICAgICAgICAgICAgfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSlcblxuICAgICAgICAvL2J1ZmZlciBkYXRhXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIgPSBbXVxuICAgICAgICB0aGlzLmNvbG9yc0J1ZmZlciA9IFtdXG4gICAgfVxuXG4gICAgLyoqIEFkZCBkYXRhIHRvIHZlcnRpY2VzL3NpemUvY29sb3IgYnVmZmVycyBmb3IgY29sb3Igc3F1YXJlcyBkcmF3aW5nICovXG4gICAgYWRkUG9pbnREYXRhKHhDLCB5QywgY29sKSB7XG4gICAgICAgIC8vY29udmVydCBjb2xvclxuICAgICAgICBjb25zdCBjYyA9IGNvbG9yKGNvbClcbiAgICAgICAgLy9jb25zdCBjYyA9IHtyOjQ1LGc6ODcsYjo5OCxvcGFjaXR5OjAuOX1cbiAgICAgICAgaWYgKCFjYykgcmV0dXJuXG5cbiAgICAgICAgLy92ZXJ0aWNlc1xuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyLnB1c2goeEMsIHlDKVxuICAgICAgICAvL2NvbG9yXG4gICAgICAgIHRoaXMuY29sb3JzQnVmZmVyLnB1c2goY2MuciwgY2MuZywgY2MuYiwgY2Mub3BhY2l0eSlcbiAgICB9XG5cbiAgICBhZGRQb2ludERhdGEyKHhDLCB5QywgciwgZywgYiwgb3BhY2l0eSkge1xuICAgICAgICAvL3ZlcnRpY2VzXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIucHVzaCh4QywgeUMpXG4gICAgICAgIC8vY29sb3JcbiAgICAgICAgdGhpcy5jb2xvcnNCdWZmZXIucHVzaChyLCBnLCBiLCBvcGFjaXR5KVxuICAgIH1cblxuICAgIC8qKiAgKi9cbiAgICBkcmF3KHRyYW5zZm9NYXQpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXG5cbiAgICAgICAgLy92ZXJ0aWNlIGRhdGFcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh0aGlzLnZlcnRpY2VzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCAncG9zJylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgMiwgLy9udW1Db21wb25lbnRzXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcbiAgICAgICAgICAgIDAsIC8vc3RyaWRlXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XG4gICAgICAgIClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pXG5cbiAgICAgICAgLy9jb2xvciBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5jb2xvcnNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcbiAgICAgICAgdmFyIGNvbG9yID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnY29sb3InKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGNvbG9yLCA0LCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGNvbG9yKVxuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3NpemVQaXgnKSwgMS4wICogdGhpcy5zaXplUGl4KVxuXG4gICAgICAgIC8vdHJhbnNmb3JtYXRpb25cbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnbWF0JyksIGZhbHNlLCBuZXcgRmxvYXQzMkFycmF5KHRyYW5zZm9NYXQpKVxuXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZGVwdGggdGVzdFxuICAgICAgICAvL2dsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciBiaXRcbiAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVClcbiAgICAgICAgLy8gU2V0IHRoZSB2aWV3IHBvcnRcbiAgICAgICAgLy9nbC52aWV3cG9ydCgwLCAwLCBjZy53LCBjZy5oKTtcblxuICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlBPSU5UUywgMCwgdGhpcy52ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5cbi8qKlxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXG4gKiBUaGUgY29sb3IgaW50ZXJwb2xhdGlvbiBpcyBjb21wdXRlZCBpbiB0aGUgZnJhZ21lbnQgc2hhZGVyIHByb2dyYW0sIGJ5IHRoZSBHUFUsIHRodXMgaXQgaXMgbGVzcyBmbGV4aWJsZSBidXQgZmFzdGVyLlxuICovXG5leHBvcnQgY2xhc3MgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkIHtcbiAgICAvL3NlZTpcbiAgICAvL2h0dHBzOi8vd2ViZ2xmdW5kYW1lbnRhbHMub3JnL3dlYmdsL2xlc3NvbnMvZnIvd2ViZ2wtc2hhZGVycy1hbmQtZ2xzbC5odG1sI2xlcy11bmlmb3Jtcy1kYW5zLWxlcy1zaGFkZXJzLWRlLXZlcnRleFxuICAgIC8vaHR0cHM6Ly90aGVib29rb2ZzaGFkZXJzLmNvbS9nbG9zc2FyeS8/c2VhcmNoPW1peFxuICAgIC8vaHR0cHM6Ly90aGVib29rb2ZzaGFkZXJzLmNvbS8wNi9cbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vZ2xvc3NhcnkvXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gZ2xcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxTdHJpbmc+fSBjb2xvcnNcbiAgICAgKiBAcGFyYW0ge3tmdW46c3RyaW5nLGFscGhhOm51bWJlcn19IHN0cmV0Y2hpbmdcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVBpeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfHVuZGVmaW5lZH0gZ2xvYmFsT3BhY2l0eVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGdsLCBjb2xvcnMsIHN0cmV0Y2hpbmcsIHNpemVQaXggPSAxMCwgZ2xvYmFsT3BhY2l0eSA9IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiogQHR5cGUge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gKi9cbiAgICAgICAgdGhpcy5nbCA9IGdsXG4gICAgICAgIC8vZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCB0cnVlKTtcbiAgICAgICAgLy9nbC5ibGVuZEZ1bmMoZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcbiAgICAgICAgLy9nbC5ibGVuZEZ1bmMoZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcblxuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKFxuICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICBnbC5WRVJURVhfU0hBREVSLFxuICAgICAgICAgICAgYFxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XG4gICAgICAgIHVuaWZvcm0gZmxvYXQgc2l6ZVBpeDtcbiAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcblxuICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgdDtcbiAgICAgICAgdmFyeWluZyBmbG9hdCB2dDtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xuICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgdnQgPSB0O1xuICAgICAgICB9XG4gICAgICBgXG4gICAgICAgIClcblxuICAgICAgICAvL3ByZXBhcmUgZnJhZ21lbnQgc2hhZGVyIGNvZGVcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcbiAgICAgICAgbGV0IGZzaFN0cmluZyA9XG4gICAgICAgICAgICAnJyArXG4gICAgICAgICAgICAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuJyArXG4gICAgICAgICAgICAndmFyeWluZyBmbG9hdCB2dDtcXG4nICtcbiAgICAgICAgICAgICd1bmlmb3JtIGZsb2F0IGFscGhhO1xcbicgK1xuICAgICAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSBbXVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSBvdXQucHVzaCgndW5pZm9ybSB2ZWM0IGMnICsgaSArICc7XFxuJylcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0LmpvaW4oJycpXG4gICAgICAgICAgICB9KSgpICtcbiAgICAgICAgICAgIC8vc3RhcnQgdGhlIG1haW4gZnVuY3Rpb24sIGFwcGx5IHRoZSBzdHJldGNoaW5nIG9mIHRcbiAgICAgICAgICAgICd2b2lkIG1haW4odm9pZCkge1xcbidcblxuICAgICAgICBpZiAoc3RyZXRjaGluZykge1xuICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdwb3cnKVxuICAgICAgICAgICAgICAgIC8vc1BvdyA9ICh0LCBhbHBoYSA9IDMpID0+IE1hdGgucG93KHQsIGFscGhhKTtcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSBwb3codnQsIGFscGhhKTtcXG4nXG4gICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAncG93SW52JylcbiAgICAgICAgICAgICAgICAvL3NQb3dSZXYgPSAodCwgYWxwaGEgPSAzKSA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIDEgLyBhbHBoYSk7XG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gMS4wLXBvdygxLjAtdnQsIDEuMC9hbHBoYSk7XFxuJ1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2V4cCcpXG4gICAgICAgICAgICAgICAgLy9zRXhwID0gKHQsIGFscGhhID0gMykgPT4gYWxwaGEgPT0gMCA/IHQgOiAoTWF0aC5leHAodCAqIGFscGhhKSAtIDEpIC8gKE1hdGguZXhwKGFscGhhKSAtIDEpO1xuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxuICAgICAgICAgICAgICAgICAgICBzdHJldGNoaW5nLmFscGhhID09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGZsb2F0IHQgPSB2dDtgXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcgICBmbG9hdCB0ID0gKGV4cCh2dCAqIGFscGhhKSAtIDEuMCkgLyAoZXhwKGFscGhhKSAtIDEuMCk7XFxuJ1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2xvZycpXG4gICAgICAgICAgICAgICAgLy9zRXhwUmV2ID0gKHQsIGFscGhhID0gMykgPT4gYWxwaGEgPT0gMCA/IHQgOiAxIC0gKDEgLyBhbHBoYSkgKiBNYXRoLmxvZyhNYXRoLmV4cChhbHBoYSkgKiAoMSAtIHQpICsgdCk7XG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XG4gICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hpbmcuYWxwaGEgPT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZmxvYXQgdCA9IHZ0O2BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJyAgIGZsb2F0IHQgPSAxLjAgLSAoMS4wIC8gYWxwaGEpICogbG9nKGV4cChhbHBoYSkgKiAoMS4wIC0gdnQpICsgdnQpO1xcbidcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgLy9pZiAoYWxwaGEgPT0gMCkgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHZ0O1xcbidcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChhbHBoYSA9PSAxKSByZXR1cm4gTWF0aC5zcXJ0KDIgKiB0IC0gdCAqIHQpO1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSBzcXJ0KHZ0ICogKDIuMCAtIHZ0KSk7XFxuJ1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IGEgPSBhbHBoYSAvICgxIC0gYWxwaGEpO1xuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyB0ICogKDIgLyBhICsgMiAtIHQpKSAtIDEgLyBhO1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCBhID0gYWxwaGEgLyAoMS4wIC0gYWxwaGEpO1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAgIGZsb2F0IHQgPSBzcXJ0KDEuMCAvIChhICogYSkgKyB2dCAqICggMi4wL2EgKyAyLjAgLSB2dCApKSAtIDEuMCAvIGE7XFxuJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2NpcmNsZUludicpIHtcbiAgICAgICAgICAgICAgICAvLyAxIC0gc0NpcmNsZUxvdygxIC0gdCwgYWxwaGEpXG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgLy9pZiAoYWxwaGEgPT0gMCkgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHZ0O1xcbidcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChhbHBoYSA9PSAxKSByZXR1cm4gTWF0aC5zcXJ0KDIgKiB0IC0gdCAqIHQpO1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSAxLjAgLSBzcXJ0KCgxLjAgLSB2dCkgKiAoMS4wICsgdnQpKTtcXG4nXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgYSA9IGFscGhhIC8gKDEgLSBhbHBoYSk7XG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE1hdGguc3FydCgxIC8gKGEgKiBhKSArICgyICogdCkgLyBhICsgMiAqIHQgLSB0ICogdCkgLSAxIC8gYTtcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgYSA9IGFscGhhIC8gKDEuMCAtIGFscGhhKTtcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCB0ID0gMS4wIC0gc3FydCgxLjAgLyAoYSAqIGEpICsgKDEuMC12dCkgKiAoIDIuMC9hICsgMS4wICsgdnQgKSkgKyAxLjAgLyBhO1xcbidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgc3RyZXRjaGluZyBmdW5jdGlvbiBjb2RlOiAnICsgc3RyZXRjaGluZy5mdW4pXG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaG9vc2UgaW5pdGlhbCBhbmQgZmluYWwgY29sb3JzLCBhbmQgYWRqdXN0IHQgdmFsdWVcbiAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPT0gMSkgZnNoU3RyaW5nICs9ICcgICB2ZWM0IGNJPWMwO1xcbiAgIHZlYzQgY0Y9YzA7XFxuJ1xuICAgICAgICBlbHNlIGlmIChjb2xvcnMubGVuZ3RoID09IDIpIGZzaFN0cmluZyArPSAnICAgdmVjNCBjST1jMDtcXG4gICB2ZWM0IGNGPWMxO1xcbidcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuYiA9IGNvbG9ycy5sZW5ndGggLSAxXG4gICAgICAgICAgICBjb25zdCBuYnMgPSBuYiArICcuMCdcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgdmVjNCBjSTtcXG4nXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0Y7XFxuJ1xuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBpZih0PDEuMC8nICsgbmJzICsgJykgeyBjST1jMDsgY0Y9YzE7IHQ9dConICsgbmJzICsgJzsgfVxcbidcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbmI7IGkrKylcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAgICAgJyAgIGVsc2UgaWYodDwnICtcbiAgICAgICAgICAgICAgICAgICAgaSArXG4gICAgICAgICAgICAgICAgICAgICcuMC8nICtcbiAgICAgICAgICAgICAgICAgICAgbmJzICtcbiAgICAgICAgICAgICAgICAgICAgJykgeyBjST1jJyArXG4gICAgICAgICAgICAgICAgICAgIChpIC0gMSkgK1xuICAgICAgICAgICAgICAgICAgICAnOyBjRj1jJyArXG4gICAgICAgICAgICAgICAgICAgIGkgK1xuICAgICAgICAgICAgICAgICAgICAnOyB0PScgK1xuICAgICAgICAgICAgICAgICAgICBuYnMgK1xuICAgICAgICAgICAgICAgICAgICAnKnQtJyArXG4gICAgICAgICAgICAgICAgICAgIChpIC0gMSkgK1xuICAgICAgICAgICAgICAgICAgICAnLjA7IH1cXG4nXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAnICAgZWxzZSB7IGNJPWMnICsgKG5iIC0gMSkgKyAnOyBjRj1jJyArIG5iICsgJzsgdD0nICsgbmJzICsgJyp0LScgKyAobmIgLSAxKSArICcuMDsgfVxcbidcbiAgICAgICAgfVxuXG4gICAgICAgIC8vb25lIHNpbmdsZSBjb2xvclxuICAgICAgICBpZiAoY29sb3JzLmxlbmd0aCA9PSAxKSBmc2hTdHJpbmcgKz0gJyAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoYzBbMF0sIGMwWzFdLCBjMFsyXSwgYzBbM10pO31cXG4nXG4gICAgICAgIC8vc2V0IGludGVycG9sYXRlZCBjb2xvciwgYmV0d2VlbiBpbml0aWFsIGFuZCBmaW5hbCBvbmVcbiAgICAgICAgZWxzZSBmc2hTdHJpbmcgKz0gJyAgIGdsX0ZyYWdDb2xvciA9IG1peChjSSwgY0YsIHQpO31cXG4nXG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyhmc2hTdHJpbmcpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cbiAgICAgICAgY29uc3QgZlNoYWRlciA9IGNyZWF0ZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmc2hTdHJpbmcpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFByb2dyYW19ICovXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKGdsLCB2U2hhZGVyLCBmU2hhZGVyKVxuICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSlcblxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICAvL1RPRE86IGJ1ZyBoZXJlLiBTZWVtcyB0byBiZSBsaW1pdGVkIHRvIHNvbWUgdGhyZXNob2xkIHZhbHVlIChhcm91bmQgMjUwKS5cbiAgICAgICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXG5cbiAgICAgICAgLy9zdHJldGNoaW5nIGFscGhhIGZhY3RvclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2FscGhhJyksIHN0cmV0Y2hpbmcgPyAxLjAgKiBzdHJldGNoaW5nLmFscGhhIDogMC4wKVxuXG4gICAgICAgIC8vY29sb3JzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY29sb3IoY29sb3JzW2ldKVxuXG4gICAgICAgICAgICBsZXQgb3BhY2l0eSA9IGMub3BhY2l0eVxuICAgICAgICAgICAgaWYgKGMub3BhY2l0eSA9PSAxICYmIGdsb2JhbE9wYWNpdHkgIT0gdW5kZWZpbmVkKSBvcGFjaXR5ID0gZ2xvYmFsT3BhY2l0eVxuXG4gICAgICAgICAgICBnbC51bmlmb3JtNGZ2KGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdjJyArIGkpLCBbXG4gICAgICAgICAgICAgICAgK2MuciAvIDI1NS4wLFxuICAgICAgICAgICAgICAgICtjLmcgLyAyNTUuMCxcbiAgICAgICAgICAgICAgICArYy5iIC8gMjU1LjAsXG4gICAgICAgICAgICAgICAgK29wYWNpdHksXG4gICAgICAgICAgICBdKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqICAqL1xuICAgIGRyYXcodmVydGljZXNCdWZmZXIsIHRCdWZmZXIsIHRyYW5zZm9NYXQpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnByb2dyYW1cblxuICAgICAgICAvL3ZlcnRpY2UgZGF0YVxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3BvcycpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxuICAgICAgICAgICAgZmFsc2UsIC8vbm9ybWFsaXNlXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxuICAgICAgICAgICAgMCAvL29mZnNldFxuICAgICAgICApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxuXG4gICAgICAgIC8vdCBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodEJ1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICBjb25zdCB0ID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3QnKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHQsIDEsIGdsLkZMT0FULCBmYWxzZSwgMCwgMClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodClcblxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdtYXQnKSwgZmFsc2UsIG5ldyBGbG9hdDMyQXJyYXkodHJhbnNmb01hdCkpXG5cbiAgICAgICAgLy8gRW5hYmxlIHRoZSBkZXB0aCB0ZXN0XG4gICAgICAgIC8vZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgICAgICAvLyBDbGVhciB0aGUgY29sb3IgYnVmZmVyIGJpdFxuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKVxuICAgICAgICAvLyBTZXQgdGhlIHZpZXcgcG9ydFxuICAgICAgICAvL2dsLnZpZXdwb3J0KDAsIDAsIGNnLncsIGNnLmgpO1xuXG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCB2ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5cbi8qKlxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXG4gKiBDb2xvciBiYXNlZCBvbiBjYXRlZ29yaWVzLlxuICovXG5leHBvcnQgY2xhc3MgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjb2xvcnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb2xvcnMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBjb2xvcnNcblxuICAgICAgICAvKiogVmVjdG9yIHNoYWRlciBwcm9ncmFtXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudnNoU3RyaW5nID0gYFxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XG4gICAgICAgIHVuaWZvcm0gZmxvYXQgc2l6ZVBpeDtcbiAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcblxuICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgaTtcbiAgICAgICAgdmFyeWluZyBmbG9hdCB2aTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xuICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgdmkgPSBpO1xuICAgICAgICB9XG4gICAgICAgIGBcblxuICAgICAgICAvL3ByZXBhcmUgZnJhZ21lbnQgc2hhZGVyIGNvZGVcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcbiAgICAgICAgY29uc3Qgb3V0ID0gW11cbiAgICAgICAgb3V0LnB1c2goJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xcbnZhcnlpbmcgZmxvYXQgdmk7XFxuJylcbiAgICAgICAgLy9hZGQgY29sb3IgdW5pZm9ybXNcbiAgICAgICAgb3V0LnB1c2goJ3VuaWZvcm0gdmVjNCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA+IDApIG91dC5wdXNoKCcsJylcbiAgICAgICAgICAgIG91dC5wdXNoKCcgYycgKyBpKVxuICAgICAgICB9XG4gICAgICAgIG91dC5wdXNoKCc7XFxuJylcbiAgICAgICAgLy9zdGFydCB0aGUgbWFpbiBmdW5jdGlvblxuICAgICAgICBvdXQucHVzaCgndm9pZCBtYWluKHZvaWQpIHtcXG4nKVxuICAgICAgICAvL2Nob29zZSBjb2xvciBpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA+IDApIG91dC5wdXNoKCdlbHNlICcpXG4gICAgICAgICAgICBvdXQucHVzaCgnaWYodmk9PScpXG4gICAgICAgICAgICBvdXQucHVzaChpKVxuICAgICAgICAgICAgb3V0LnB1c2goJy4wKSBnbF9GcmFnQ29sb3IgPSB2ZWM0KGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMF0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMV0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMl0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbM10pO1xcbicpXG4gICAgICAgIH1cbiAgICAgICAgb3V0LnB1c2goJ2Vsc2UgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApO1xcbn0nKVxuICAgICAgICAvKiogRnJhZ21lbnQgc2hhZGVyIHByb2dyYW1cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5mc2hTdHJpbmcgPSBvdXQuam9pbignJylcbiAgICB9XG5cbiAgICAvKiogICovXG4gICAgZHJhdyhnbCwgdmVydGljZXNCdWZmZXIsIGlCdWZmZXIsIHRyYW5zZm9NYXQsIHNpemVQaXggPSAxMCkge1xuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB0aGlzLnZzaFN0cmluZylcblxuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCBmU2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIHRoaXMuZnNoU3RyaW5nKVxuXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfSAqL1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gaW5pdFNoYWRlclByb2dyYW0oZ2wsIHZTaGFkZXIsIGZTaGFkZXIpXG4gICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSlcblxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXG5cbiAgICAgICAgLy9jb2xvcnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNvbG9yKHRoaXMuY29sb3JzW2ldKVxuICAgICAgICAgICAgZ2wudW5pZm9ybTRmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ2MnICsgaSksIFtcbiAgICAgICAgICAgICAgICArYy5yIC8gMjU1LjAsXG4gICAgICAgICAgICAgICAgK2MuZyAvIDI1NS4wLFxuICAgICAgICAgICAgICAgICtjLmIgLyAyNTUuMCxcbiAgICAgICAgICAgICAgICArYy5vcGFjaXR5LFxuICAgICAgICAgICAgXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdmVydGljZSBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAncG9zJylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgMiwgLy9udW1Db21wb25lbnRzXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcbiAgICAgICAgICAgIDAsIC8vc3RyaWRlXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XG4gICAgICAgIClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pXG5cbiAgICAgICAgLy9pIGRhdGFcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShpQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IGkgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnaScpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoaSwgMSwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKVxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShpKVxuXG4gICAgICAgIC8vdHJhbnNmb3JtYXRpb25cbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcblxuICAgICAgICAvLyBFbmFibGUgdGhlIGRlcHRoIHRlc3RcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBjb2xvciBidWZmZXIgYml0XG4gICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XG4gICAgICAgIC8vZ2wudmlld3BvcnQoMCwgMCwgY2cudywgY2cuaCk7XG5cbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHZlcnRpY2VzQnVmZmVyLmxlbmd0aCAvIDIpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBleHRlbnQsIG1heCB9IGZyb20gXCJkMy1hcnJheVwiXG5pbXBvcnQgeyBzY2FsZVF1YW50aWxlIH0gZnJvbSBcImQzLXNjYWxlXCJcblxuLyoqXG4gKiBBIHNjYWxlIGlzIHNpbXBseSBhIGZ1bmN0aW9uIHRoYXQgbWFwIGEgZG9tYWluIHRvIGEgcmFuZ2UuXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9IFNjYWxlICovXG5cbi8qKlxuICogQSBzY2FsZSB3aG9zZSByYW5nZSBpcyBhIGNvbG9yIChzdHJpbmcpLlxuKiBAdHlwZWRlZiB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9IENvbG9yU2NhbGUgKi9cblxuXG4vKipcbiAqIEBtb2R1bGUgdXRpbHNcbiAqL1xuXG5cbi8qKlxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgdmlldyBzY2FsZSAtIGNvbnRpbnVvdXMgb3IgZGlzY3JldGVcbiAqIFxuICogQHBhcmFtIHt7IHZhbHVlRnVuY3Rpb246ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOm51bWJlciwgbWluVmFsdWU/Om51bWJlciwgbWluU2l6ZVBpeD86bnVtYmVyLCBtYXhTaXplRmFjdG9yPzpudW1iZXIsIHJhbmdlPzpbbnVtYmVyLCBudW1iZXJdLCBkb21haW4/OltudW1iZXIsIG51bWJlcl0sIHN0cmV0Y2hpbmc/OmZ1bmN0aW9uKG51bWJlcik6bnVtYmVyLCBjbGFzc051bWJlcj86bnVtYmVyfX0gb3B0cyBcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+KTpTY2FsZX1cbiAqL1xuZXhwb3J0IGNvbnN0IHZpZXdTY2FsZSA9IChvcHRzKSA9PiB7XG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvblxuICAgIGNvbnN0IG1pblZhbHVlID0gb3B0cy5taW5WYWx1ZSB8fCAwXG4gICAgY29uc3QgbWluU2l6ZVBpeCA9IG9wdHMubWluU2l6ZVBpeCB8fCAwXG4gICAgY29uc3QgbWF4U2l6ZUZhY3RvciA9IG9wdHMubWF4U2l6ZUZhY3RvciB8fCAxXG4gICAgY29uc3Qgc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xuICAgIGNvbnN0IHJhbmdlXyA9IG9wdHMucmFuZ2VcbiAgICBjb25zdCBkb21haW5fID0gb3B0cy5kb21haW5cbiAgICBjb25zdCBjbGFzc051bWJlciA9IG9wdHMuY2xhc3NOdW1iZXJcbiAgICByZXR1cm4gKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA9PiB7XG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IGRvbWFpbl8gfHwgW21pblZhbHVlLCBtYXgoY2VsbHMsIHZhbHVlRnVuY3Rpb24pXVxuICAgICAgICBjb25zdCByYW5nZSA9IHJhbmdlXyB8fCBbbWluU2l6ZVBpeCAqIHosIHJlc29sdXRpb24gKiBtYXhTaXplRmFjdG9yXVxuICAgICAgICBjb25zdCBkb21haW5TaXplID0gZG9tYWluWzFdIC0gZG9tYWluWzBdLCBkb21haW5NaW4gPSBkb21haW5bMF1cbiAgICAgICAgY29uc3QgcmFuZ2VTaXplID0gcmFuZ2VbMV0gLSByYW5nZVswXSwgcmFuZ2VNaW4gPSByYW5nZVswXVxuICAgICAgICByZXR1cm4gdCA9PiB7XG4gICAgICAgICAgICAvL3NjYWxlIHRvIFswLDFdXG4gICAgICAgICAgICB0ID0gKHQgLSBkb21haW5NaW4pIC8gZG9tYWluU2l6ZVxuICAgICAgICAgICAgLy9zdHJldGNoXG4gICAgICAgICAgICBpZiAoc3RyZXRjaGluZykgdCA9IHN0cmV0Y2hpbmcodClcbiAgICAgICAgICAgIC8vY2xhc3NpZnlcbiAgICAgICAgICAgIGlmIChjbGFzc051bWJlcikgdCA9IHQgPT0gMSA/IDEgOiBNYXRoLmZsb29yKHQgKiAoY2xhc3NOdW1iZXIpKSAvIChjbGFzc051bWJlciAtIDEpXG4gICAgICAgICAgICAvL3NjYWxlIHRvIHJhbmdlXG4gICAgICAgICAgICByZXR1cm4gcmFuZ2VNaW4gKyB0ICogcmFuZ2VTaXplXG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vKipcbiAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIHZpZXcgc2NhbGUgLSBxdWFudGlsZVxuICogXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBjbGFzc051bWJlcj86bnVtYmVyLCBtaW5TaXplUGl4PzpudW1iZXIsIG1heFNpemVGYWN0b3I/Om51bWJlciB9fSBvcHRzIFxuICogQHJldHVybnMge2Z1bmN0aW9uKEFycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD4pOlNjYWxlfVxuICovXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlUXVhbnRpbGUgPSAob3B0cykgPT4ge1xuICAgIGNvbnN0IHZhbHVlRnVuY3Rpb24gPSBvcHRzLnZhbHVlRnVuY3Rpb25cbiAgICBjb25zdCBjbGFzc051bWJlciA9IG9wdHMuY2xhc3NOdW1iZXIgfHwgMTJcbiAgICBjb25zdCBtaW5TaXplUGl4ID0gb3B0cy5taW5TaXplUGl4IHx8IDFcbiAgICBjb25zdCBtYXhTaXplRmFjdG9yID0gb3B0cy5tYXhTaXplRmFjdG9yIHx8IDFcbiAgICBjb25zdCBzY2FsZSA9IHNjYWxlUXVhbnRpbGUoKVxuICAgIHJldHVybiAoY2VsbHMsIHJlc29sdXRpb24sIHopID0+IHtcbiAgICAgICAgc2NhbGUuZG9tYWluKGNlbGxzLm1hcCh2YWx1ZUZ1bmN0aW9uKSlcbiAgICAgICAgY29uc3QgbWluU2l6ZUdlbyA9IG1pblNpemVQaXggKiB6LCBtYXhTaXplR2VvID0gcmVzb2x1dGlvbiAqIG1heFNpemVGYWN0b3JcbiAgICAgICAgc2NhbGUucmFuZ2UoQXJyYXkuZnJvbSh7IGxlbmd0aDogY2xhc3NOdW1iZXIgfSwgKF8sIGkpID0+IG1pblNpemVHZW8gKyBpICogKG1heFNpemVHZW8gLSBtaW5TaXplR2VvKSAvIChjbGFzc051bWJlciAtIDEpKSlcbiAgICAgICAgc2NhbGUuYnJlYWtzID0gc2NhbGUucXVhbnRpbGVzKClcbiAgICAgICAgc2NhbGUudmFsdWVzID0gc2NhbGUucmFuZ2UoKVxuICAgICAgICByZXR1cm4gc2NhbGU7XG4gICAgfVxufVxuXG5cblxuXG5cblxuLyoqXG4gKiBHZW5lcmljIGZ1bmN0aW9uIGZvciBjb2xvciB2aWV3IHNjYWxlIC0gY29udGludW91cyBvciBkaXNjcmV0ZVxuICogXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBjb2xvclNjYWxlPzpmdW5jdGlvbihudW1iZXIpOnN0cmluZywgY29sb3JzPzpBcnJheS48c3RyaW5nPiwgc3RyZXRjaGluZz86ZnVuY3Rpb24obnVtYmVyKTpudW1iZXIgfX0gb3B0cyBcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+KTpDb2xvclNjYWxlfVxuICovXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlQ29sb3IgPSAob3B0cykgPT4ge1xuICAgIGNvbnN0IHZhbHVlRnVuY3Rpb24gPSBvcHRzLnZhbHVlRnVuY3Rpb25cbiAgICBjb25zdCBzdHJldGNoaW5nID0gb3B0cy5zdHJldGNoaW5nXG4gICAgbGV0IGNvbG9yU2NhbGUgPSBvcHRzLmNvbG9yU2NhbGUgfHwgKCgpID0+IFwicHVycGxlXCIpXG5cbiAgICAvL2Rpc2NyZXRlIGNvbG9ycyBjYXNlOiBidWlsZCBjb250aW51b3VzIGNvbG9yIHNjYWxlIGZyb20gZGlzY3JldGUgb25lcy5cbiAgICBjb25zdCBuYkNsYXNzID0gb3B0cy5jb2xvcnM/Lmxlbmd0aFxuICAgIGlmIChvcHRzLmNvbG9ycyAmJiBuYkNsYXNzKVxuICAgICAgICBjb2xvclNjYWxlID0gdCA9PiBvcHRzLmNvbG9yc1t0ID09IDEgPyBuYkNsYXNzIC0gMSA6IE1hdGguZmxvb3IodCAqIG5iQ2xhc3MpXVxuXG4gICAgcmV0dXJuIChjZWxscykgPT4ge1xuICAgICAgICBpZiAoY2VsbHMubGVuZ3RoID09IDAgfHwgIWNlbGxzKSByZXR1cm5cbiAgICAgICAgLyoqIEB0eXBlIHtbdW5kZWZpbmVkLCB1bmRlZmluZWRdIHwgW251bWJlciwgbnVtYmVyXX0gKi9cbiAgICAgICAgY29uc3QgZG9tYWluID0gZXh0ZW50KGNlbGxzLCB2YWx1ZUZ1bmN0aW9uKVxuICAgICAgICBpZiAoZG9tYWluWzBdID09IHVuZGVmaW5lZCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IGRvbWFpblNpemUgPSBkb21haW5bMV0gLSBkb21haW5bMF1cbiAgICAgICAgY29uc3Qgc2NhbGUgPSB0ID0+IHtcbiAgICAgICAgICAgIC8vc2NhbGUgdG8gWzAsMV1cbiAgICAgICAgICAgIHQgPSAodCAtIGRvbWFpblswXSkgLyBkb21haW5TaXplXG4gICAgICAgICAgICAvL3N0cmV0Y2hcbiAgICAgICAgICAgIGlmIChzdHJldGNoaW5nKSB0ID0gc3RyZXRjaGluZyh0KVxuICAgICAgICAgICAgcmV0dXJuIGNvbG9yU2NhbGUodClcbiAgICAgICAgfVxuICAgICAgICAvL2Z1bmN0aW9uIHRoYXQgcmV0dXJuIHRoZSBkb21haW4gdmFsdWUgZnJvbSB0aGUgWzAsMV0gcmFuZ2UuXG4gICAgICAgIHNjYWxlLmludmVydCA9IHQgPT4ge1xuICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcpIHQgPSBzdHJldGNoaW5nLmludmVydCh0KVxuICAgICAgICAgICAgcmV0dXJuIGRvbWFpblswXSArIHQgKiBkb21haW5TaXplXG4gICAgICAgIH1cbiAgICAgICAgLy9kaXNjcmV0ZSBjb2xvcnM6IHJldHVybiB0aGUgYnJlYWtzXG4gICAgICAgIGlmIChvcHRzLmNvbG9ycyAmJiBuYkNsYXNzKSB7XG4gICAgICAgICAgICBzY2FsZS5icmVha3MgPSBbXVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuYkNsYXNzOyBpKyspXG4gICAgICAgICAgICAgICAgc2NhbGUuYnJlYWtzLnB1c2goc2NhbGUuaW52ZXJ0KGkgLyBuYkNsYXNzKSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9XG59XG5cblxuXG5cblxuLyoqXG4gKiBHZW5lcmljIGZ1bmN0aW9uIGZvciBjb2xvciB2aWV3IHNjYWxlIC0gcXVhbnRpbGVcbiAqIFxuICogQHBhcmFtIHt7IHZhbHVlRnVuY3Rpb246ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOm51bWJlciwgY2xhc3NOdW1iZXI/Om51bWJlciwgY29sb3JzPzpBcnJheS48c3RyaW5nPiwgY29sb3JTY2FsZT86ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmcgfX0gb3B0cyBcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+KTpDb2xvclNjYWxlfVxuICovXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlQ29sb3JRdWFudGlsZSA9IChvcHRzKSA9PiB7XG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvblxuICAgIGNvbnN0IGNsYXNzTnVtYmVyID0gb3B0cy5jbGFzc051bWJlciB8fCAxMlxuXG4gICAgbGV0IGNvbG9ycyA9IG9wdHMuY29sb3JzXG4gICAgaWYgKG9wdHMuY29sb3JTY2FsZSkgY29sb3JzID0gZGlzY3JldGVDb2xvcnMob3B0cy5jb2xvclNjYWxlLCBjbGFzc051bWJlcilcbiAgICBjb2xvcnMgPSBjb2xvcnMgfHwgQXJyYXkuZnJvbSh7IGxlbmd0aDogY2xhc3NOdW1iZXIgfSwgKF8sIGkpID0+IFwicmdiKFwiICsgTWF0aC5mbG9vcigyNTUgKiBpIC8gKGNsYXNzTnVtYmVyIC0gMSkpICsgXCIsMTUwLDE1MClcIilcblxuICAgIGNvbnN0IHNjYWxlID0gc2NhbGVRdWFudGlsZSgpLnJhbmdlKGNvbG9ycylcbiAgICByZXR1cm4gKGNlbGxzKSA9PiB7XG4gICAgICAgIHNjYWxlLmRvbWFpbihjZWxscy5tYXAodmFsdWVGdW5jdGlvbikpO1xuICAgICAgICBzY2FsZS5icmVha3MgPSBzY2FsZS5xdWFudGlsZXMoKVxuICAgICAgICBzY2FsZS5jb2xvcnMgPSBjb2xvcnNcbiAgICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH1cbn1cblxuXG5cblxuLyoqXG4gKiBDb21iaW5lIHZpZXcgc2NhbGUgZnVuY3Rpb25zXG4gKiBcbiAqIEBwYXJhbSB7Kn0gb2JqIFxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlQ29tYmluYXRpb24gPSAob2JqKSA9PiB7XG4gICAgLy9vYmo6IHByb3AgYW5kIGEgZnVuY3Rpb24gdG8gY2FsbFxuICAgIHJldHVybiAoY2VsbHMsIHJlc29sdXRpb24sIHopID0+IHtcbiAgICAgICAgY29uc3Qgb3V0ID0ge31cbiAgICAgICAgZm9yIChjb25zdCBwIGluIG9iaikgeyBvdXRbcF0gPSBvYmpbcF0oY2VsbHMsIHJlc29sdXRpb24sIHopIH1cbiAgICAgICAgcmV0dXJuIG91dFxuICAgIH1cbn1cblxuXG5cblxuXG5cbi8qKlxuICogUmV0dXJuIGEgY2xhc3NpZmllciBmdW5jdGlvbiBmcm9tIGJyZWFrIHZhbHVlcy5cbiAqIFRoZSBjbGFzc2lmaWVyIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNsYXNzIGlkIChmcm9tIDAgdG8gYnJlYWtzLmxlbmd0aCkgZnJvbSBhIHZhbHVlIHRvIGNsYXNzaWZpeS5cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyB0aGUgYnJlYWtzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmaWVyKGJyZWFrcykge1xuICAgIGNvbnN0IGJsID0gYnJlYWtzLmxlbmd0aFxuICAgIGNvbnN0IGNsYXNzaWZpZXIgPSB2YWx1ZSA9PiB7XG4gICAgICAgIGxldCBpID0gMFxuICAgICAgICB3aGlsZSAoaSA8IGJsKSB7XG4gICAgICAgICAgICBjb25zdCBicmVha18gPSBicmVha3NbaV1cbiAgICAgICAgICAgIGlmICh2YWx1ZSA8PSBicmVha18pIHJldHVybiBpXG4gICAgICAgICAgICBpKytcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaVxuICAgIH1cbiAgICBjbGFzc2lmaWVyLmJyZWFrcyA9IGJyZWFrc1xuICAgIHJldHVybiBjbGFzc2lmaWVyXG59XG5cblxuXG4vKipcbiAqIFJldHVybiBhIGNvbG9yIGNsYXNzaWZpZXIgZnVuY3Rpb24gZnJvbSBicmVhayB2YWx1ZXMuXG4gKiBUaGUgY2xhc3NpZmllciBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb2xvciBmcm9tIGEgdmFsdWUgdG8gY2xhc3NpZml5LlxuICogVGhlcmUgc2hvdWxkIGJlIG9uZSBjb2xvciBtb3JlIHRoYW4gYnJlYWsgdmFsdWVzLlxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYnJlYWtzIHRoZSBicmVha3NcbiAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNvbG9ycyB0aGUgY29sb3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckNsYXNzaWZpZXIoYnJlYWtzLCBjb2xvcnMpIHtcbiAgICBjb25zdCBjbGFzc2lmaWVyXyA9IGNsYXNzaWZpZXIoYnJlYWtzKVxuICAgIGNvbnN0IGNvbG9yQ2xhc3NpZmllciA9IHZhbHVlID0+IGNvbG9yc1tjbGFzc2lmaWVyXyh2YWx1ZSldXG4gICAgY29sb3JDbGFzc2lmaWVyLmJyZWFrcyA9IGJyZWFrc1xuICAgIGNvbG9yQ2xhc3NpZmllci5jb2xvcnMgPSBjb2xvcnNcbiAgICByZXR1cm4gY29sb3JDbGFzc2lmaWVyXG59XG5cbi8qKlxuICogTWFrZSBhcnJheSBvZiBjb2xvcnMgZnJvbSBhIGNvbG9yU2NhbGUuXG4gKiBJdCBpcyBhIGtpbmQgb2Ygc2FtcGxpbmcsIG9yIHVuLWludGVycG9sYXRpb25cbiAqIFxuICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOnN0cmluZ30gY29sb3JTY2FsZSBcbiAqIEBwYXJhbSB7bnVtYmVyfSBuYiBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2NyZXRlQ29sb3JzKGNvbG9yU2NhbGUsIG5iKSB7XG4gICAgaWYgKG5iID09IDEpIHJldHVybiBbY29sb3JTY2FsZSgwLjUpXVxuICAgIGNvbnN0IG91dCA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKVxuICAgICAgICBvdXQucHVzaChjb2xvclNjYWxlKGkgLyAobmIgLSAxKSkpXG4gICAgcmV0dXJuIG91dFxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEBtb2R1bGUgdXRpbHNcbiAqL1xuXG5cbi8vVE9ETyBpbnZlcnQgZm9yIGNpcmN1bGFyXG4vL1RPRE8gdXNlIE1hdGguc3FydFxuLy9UT0RPIHZhbGlkYXRlXG5cblxuLyoqXG4gKiBTb21lIGZ1bmN0aW9uIFswLDFdLT5bMCwxXSB0byBzdHJldGNoIHJhbmdlIG9mIHZhbHVlcy5cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2V1cm9zdGF0L2dyaWR2aXovYmxvYi9tYXN0ZXIvZG9jcy9yZWZlcmVuY2UubWQjc3RyZXRjaGluZ1xuICogQHNlZSBodHRwczovL29ic2VydmFibGVocS5jb20vQGpnYWZmdXJpL3N0cmV0Y2hpbmdcbiAqL1xuXG4vL2lkZW50aXR5IGZ1bmN0aW9uXG5jb25zdCBpZGVudGl0eSA9IHQgPT4gdFxuaWRlbnRpdHkuaW52ZXJ0ID0gaWRlbnRpdHlcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlIFxuICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgZXhwb25lbnRpYWxTY2FsZSA9IChiYXNlID0gMykgPT4ge1xuICAgIGlmIChiYXNlID09IDApIHJldHVybiBpZGVudGl0eVxuICAgIGNvbnN0IGEgPSAoTWF0aC5leHAoYmFzZSkgLSAxKVxuICAgIGNvbnN0IGYgPSB0ID0+IChNYXRoLmV4cCh0ICogYmFzZSkgLSAxKSAvIGFcbiAgICBmLmludmVydCA9IHQgPT4gTWF0aC5sb2coYSAqIHQgKyAxKSAvIGJhc2VcbiAgICByZXR1cm4gZlxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlIFxuICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgbG9nYXJpdGhtaWNTY2FsZSA9IChiYXNlID0gMykgPT4ge1xuICAgIGlmIChiYXNlID09IDApIHJldHVybiBpZGVudGl0eVxuICAgIGNvbnN0IGEgPSBNYXRoLmV4cChiYXNlKSwgYiA9IDEgLSBhXG4gICAgY29uc3QgZiA9IHQgPT4gMSAtIE1hdGgubG9nKGEgKyB0ICogYikgLyBiYXNlXG4gICAgZi5pbnZlcnQgPSB0ID0+IChNYXRoLmV4cCgoMSAtIHQpICogYmFzZSkgLSBhKSAvIGJcbiAgICByZXR1cm4gZlxufVxuXG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGV4cG9uZW50IFxuICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgcG93ZXJTY2FsZSA9IChleHBvbmVudCA9IDMpID0+IHtcbiAgICBpZiAoZXhwb25lbnQgPT0gMSkgcmV0dXJuIGlkZW50aXR5XG4gICAgLy9UT0RPIGlmIChleHBvbmVudCA9PSAwLjUpIHJldHVybiBNYXRoLnNxcnRcbiAgICBjb25zdCBmID0gdCA9PiBNYXRoLnBvdyh0LCBleHBvbmVudClcbiAgICBjb25zdCBhID0gMSAvIGV4cG9uZW50XG4gICAgZi5pbnZlcnQgPSB0ID0+IE1hdGgucG93KHQsIGEpXG4gICAgcmV0dXJuIGZcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gZXhwb25lbnQgXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBwb3dlckludmVyc2VTY2FsZSA9IChleHBvbmVudCA9IDMpID0+IHtcbiAgICBpZiAoZXhwb25lbnQgPT0gMSkgcmV0dXJuIGlkZW50aXR5XG4gICAgLy9UT0RPIGlmIChleHBvbmVudCA9PSAyKSByZXR1cm4gdCA9PiAxIC0gTWF0aC5zcXJ0KDEgLSB0KVxuICAgIGNvbnN0IGEgPSAxIC8gZXhwb25lbnRcbiAgICBjb25zdCBmID0gdCA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIGEpXG4gICAgZi5pbnZlcnQgPSB0ID0+IDEgLSBNYXRoLnBvdygxIC0gdCwgZXhwb25lbnQpXG4gICAgcmV0dXJuIGZcbn1cblxuXG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gY2lyY3VsYXJpdHkgXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBjaXJjdWxhclNjYWxlID0gKGNpcmN1bGFyaXR5ID0gMC44KSA9PiB7XG4gICAgaWYgKGNpcmN1bGFyaXR5ID09IDApIHJldHVybiBpZGVudGl0eVxuICAgIGlmIChjaXJjdWxhcml0eSA9PSAxKSByZXR1cm4gdCA9PiBNYXRoLnNxcnQodCAqICgyIC0gdCkpXG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGEgPSBjaXJjdWxhcml0eSAvICgxIC0gY2lyY3VsYXJpdHkpXG4gICAgICAgIHJldHVybiB0ID0+IE1hdGguc3FydCgxIC8gKGEgKiBhKSArIHQgKiAoMiAvIGEgKyAyIC0gdCkpIC0gMSAvIGFcbiAgICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGNpcmN1bGFyaXR5IFxuICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgY2lyY3VsYXJJbnZlcnNlU2NhbGUgPSAoY2lyY3VsYXJpdHkgPSAwLjgpID0+IHtcbiAgICBpZiAoY2lyY3VsYXJpdHkgPT0gMCkgcmV0dXJuIGlkZW50aXR5XG4gICAgY29uc3QgZiA9IGNpcmN1bGFyU2NhbGUoY2lyY3VsYXJpdHkpXG4gICAgcmV0dXJuIHQgPT4gMSAtIGYoMSAtIHQpXG59XG5cblxuXG5cblxuLy90ZXN0XG4vKlxuY29uc3QgdGVzdCA9IChmLCBmdW4sIGEsIGVyciA9IDFlLTEyKSA9PiB7XG4gICAgZm9yIChsZXQgdCA9IDA7IHQgPD0gMTsgdCArPSAxIC8gNTApIHtcbiAgICAgICAgY29uc3QgZXIgPSB0IC0gZi5pbnZlcnQoZih0KSlcbiAgICAgICAgaWYgKE1hdGguYWJzKGVyKSA8IGVycikgY29udGludWVcbiAgICAgICAgY29uc29sZS5sb2coZnVuLCBhLCBlcilcbiAgICB9XG59XG5cbmZvciAobGV0IGZ1biBvZiBbcG93ZXJTY2FsZSwgcG93ZXJJbnZlcnNlU2NhbGVdKVxuICAgIGZvciAobGV0IGV4cCA9IC0zMDsgZXhwIDw9IDUwOyBleHAgKz0gMSkge1xuICAgICAgICBpZiAoZXhwID09IDApIGNvbnRpbnVlXG4gICAgICAgIGNvbnN0IGYgPSBmdW4oZXhwKVxuICAgICAgICB0ZXN0KGYsIGZ1biwgZXhwKVxuICAgIH1cblxuXG5mb3IgKGxldCBmdW4gb2YgW2V4cG9uZW50aWFsU2NhbGUsIGxvZ2FyaXRobWljU2NhbGVdKVxuICAgIGZvciAobGV0IGJhc2UgPSAtMjA7IGJhc2UgPD0gMjA7IGJhc2UgKz0gMSkge1xuICAgICAgICAvL2lmIChleHAgPT0gMCkgY29udGludWVcbiAgICAgICAgY29uc3QgZiA9IGZ1bihiYXNlKVxuICAgICAgICB0ZXN0KGYsIGZ1biwgYmFzZSwgMWUtMTApXG4gICAgfVxuKi8iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IGludGVycG9sYXRlTGFiIH0gZnJvbSBcImQzLWludGVycG9sYXRlXCJcblxuXG5cbmV4cG9ydCBjb25zdCB0cml2YXJpYXRlQ2xhc3NpZmllciA9IChwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBvcHRzID0ge30pID0+IHtcblxuICAgIC8vdGhlIHRocmVlIHByb3BlcnRpZXNcbiAgICBjb25zdCBwMCA9IHByb3BlcnRpZXNbMF0sIHAxID0gcHJvcGVydGllc1sxXSwgcDIgPSBwcm9wZXJ0aWVzWzJdXG5cbiAgICAvL3RoZSBjbGFzc2lmaWVyIGNlbnRlciBwb2ludC4gc3VtIG11c3QgYmUgZXF1YWwgdG8gMVxuICAgIGNvbnN0IFtjMCwgYzEsIGMyXSA9IG9wdHMuY2VudGVyIHx8IFsxIC8gMywgMSAvIDMsIDEgLyAzXVxuXG4gICAgLy9wYXJhbWV0ZXIgdG8gZGVjaWRlIHdldGhlciB0byB1c2UgbWl4ZWQgY2xhc3NlcyBtMCwgbTEsIG0yLlxuICAgIGNvbnN0IHdpdGhNaXhlZENsYXNzZXMgPSBvcHRzLndpdGhNaXhlZENsYXNzZXMgIT0gdW5kZWZpbmVkID8gb3B0cy53aXRoTWl4ZWRDbGFzc2VzIDogdHJ1ZVxuXG4gICAgLy9wYXJhbWVydGVyIGRlY2lkZSB3ZXRoZXIgdG8gdXNlIGEgY2VudHJhbCBjbGFzcywgYW5kIHRoZSBzaXplIG9mIHRoaXMgY2VudHJhbCBjbGFzcy5cbiAgICAvL3NldCB0byAwIG9yIHVuZGVmaW5lZCBmb3Igbm90IHNob3dpbmcgYW55IGNlbnRyYWwgY2xhc3MuIFNldCB0byAxIGZvciBhIGNlbnRyYWwgY2xhc3MgdGhhdCBjb250YWlucyB0aGUgbWl4IGNsYXNzZXNcbiAgICBjb25zdCBjYyA9IG9wdHMuY2VudGVyQ29lZmZpY2llbnQgPyAxIC0gb3B0cy5jZW50ZXJDb2VmZmljaWVudCA6IHVuZGVmaW5lZFxuXG4gICAgLy90aGUgb3V0cHV0IGNsYXNzaWZpZXIgbWV0aG9kXG4gICAgY29uc3QgZnVuID0gYyA9PiB7XG4gICAgICAgIC8vZ2V0IHRvdGFsXG4gICAgICAgIGNvbnN0IHRvdCA9IHRvdGFsRnVuY3Rpb24oYylcbiAgICAgICAgaWYgKCF0b3QpIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgLy9jb21wdXRlIHNoYXJlc1xuICAgICAgICBjb25zdCBbczAsIHMxLCBzMl0gPSBbK2NbcDBdIC8gdG90LCArY1twMV0gLyB0b3QsICtjW3AyXSAvIHRvdF1cblxuICAgICAgICAvL2NsYXNzIDBcbiAgICAgICAgaWYgKHMwID49IGMwICYmIHMxIDw9IGMxICYmIHMyIDw9IGMyKSB7XG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3MgbmVhciBjbGFzcyAwXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIChzMiAtIGMyKSAqIChjMSAtIGNjICogYzEpID49IChzMSAtIGNjICogYzEpICogKGNjICogYzIgLSBjMikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY2VudGVyXCJcbiAgICAgICAgICAgIHJldHVybiBcIjBcIlxuICAgICAgICB9XG4gICAgICAgIC8vY2xhc3MgMVxuICAgICAgICBpZiAoczAgPD0gYzAgJiYgczEgPj0gYzEgJiYgczIgPD0gYzIpIHtcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzcyBuZWFyIGNsYXNzIDFcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgKHMyIC0gYzIpICogKGMwIC0gY2MgKiBjMCkgPj0gKHMwIC0gY2MgKiBjMCkgKiAoY2MgKiBjMiAtIGMyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjZW50ZXJcIlxuICAgICAgICAgICAgcmV0dXJuIFwiMVwiXG4gICAgICAgIH1cbiAgICAgICAgLy9jbGFzcyAyXG4gICAgICAgIGlmIChzMCA8PSBjMCAmJiBzMSA8PSBjMSAmJiBzMiA+PSBjMikge1xuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzIG5lYXIgY2xhc3MgMlxuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiAoczEgLSBjMSkgKiAoYzAgLSBjYyAqIGMwKSA+PSAoczAgLSBjYyAqIGMwKSAqIChjYyAqIGMxIC0gYzEpKVxuICAgICAgICAgICAgICAgIHJldHVybiBcImNlbnRlclwiXG4gICAgICAgICAgICByZXR1cm4gXCIyXCJcbiAgICAgICAgfVxuICAgICAgICAvL21pZGRsZSBjbGFzcyAwIC0gaW50ZXJzZWN0aW9uIGNsYXNzIDEgYW5kIDJcbiAgICAgICAgaWYgKHMwIDw9IGMwICYmIHMxID49IGMxICYmIHMyID49IGMyKSB7XG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3NcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgczAgPiBjYyAqIGMwKSByZXR1cm4gXCJjZW50ZXJcIlxuICAgICAgICAgICAgaWYgKHdpdGhNaXhlZENsYXNzZXMpIHJldHVybiBcIm0wXCJcbiAgICAgICAgICAgIHJldHVybiBzMSA+IHMyID8gXCIxXCIgOiBcIjJcIlxuICAgICAgICB9XG4gICAgICAgIC8vbWlkZGxlIGNsYXNzIDEgLSBpbnRlcnNlY3Rpb24gY2xhc3MgMCBhbmQgMVxuICAgICAgICBpZiAoczAgPj0gYzAgJiYgczEgPD0gYzEgJiYgczIgPj0gYzIpIHtcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzc1xuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiBzMSA+IGNjICogYzEpIHJldHVybiBcImNlbnRlclwiXG4gICAgICAgICAgICBpZiAod2l0aE1peGVkQ2xhc3NlcykgcmV0dXJuIFwibTFcIlxuICAgICAgICAgICAgcmV0dXJuIHMwID4gczIgPyBcIjBcIiA6IFwiMlwiXG4gICAgICAgIH1cbiAgICAgICAgLy9taWRkbGUgY2xhc3MgMiAtIGludGVyc2VjdGlvbiBjbGFzcyAwIGFuZCAxXG4gICAgICAgIGlmIChzMCA+PSBjMCAmJiBzMSA+PSBjMSAmJiBzMiA8PSBjMikge1xuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIHMyID4gY2MgKiBjMikgcmV0dXJuIFwiY2VudGVyXCJcbiAgICAgICAgICAgIGlmICh3aXRoTWl4ZWRDbGFzc2VzKSByZXR1cm4gXCJtMlwiXG4gICAgICAgICAgICByZXR1cm4gczEgPiBzMCA/IFwiMVwiIDogXCIwXCJcbiAgICAgICAgfVxuICAgICAgICAvL3Nob3VsZCBub3QgaGFwcGVuXG4gICAgICAgIHJldHVybiBcInVua25vd25cIlxuICAgIH1cblxuICAgIC8vYXR0YWNoIGluZm9ybWF0aW9uIHRvIG91dHB1dCBmdW5jdGlvblxuICAgIGZ1bi5jZW50ZXIgPSBbYzAsIGMxLCBjMl1cbiAgICBmdW4uY2VudGVyQ29lZmZpY2llbnQgPSBvcHRzLmNlbnRlckNvZWZmaWNpZW50XG5cbiAgICByZXR1cm4gZnVuXG59XG5cblxuXG5leHBvcnQgY29uc3QgdHJpdmFyaWF0ZUNvbG9yQ2xhc3NpZmllciA9IChwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBjb2xvcnMsIG9wdHMgPSB7fSkgPT4ge1xuXG4gICAgLy90aGUgdGhyZWUgY29sb3JzXG4gICAgY29uc3QgW2NvbG9yMCwgY29sb3IxLCBjb2xvcjJdID0gY29sb3JzIHx8IFtcInJlZFwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiXVxuXG4gICAgLy90aGUgY29sb3IgaW50ZXJwb2xhdGlvbiBmdW5jdGlvblxuICAgIGNvbnN0IGNvbG9ySW50ZXJwb2xhdGlvbiA9IG9wdHMuY29sb3JJbnRlcnBvbGF0aW9uIHx8IGludGVycG9sYXRlTGFiXG5cbiAgICAvL3BhcmFtZXRlciB0byBkZWNpZGUgd2V0aGVyIHRvIHVzZSBtaXhlZCBjbGFzc2VzLlxuICAgIGNvbnN0IHdpdGhNaXhlZENsYXNzZXMgPSBvcHRzLndpdGhNaXhlZENsYXNzZXMgIT0gdW5kZWZpbmVkID8gb3B0cy53aXRoTWl4ZWRDbGFzc2VzIDogdHJ1ZVxuICAgIC8vaHR0cHM6Ly9kM2pzLm9yZy9kMy1pbnRlcnBvbGF0ZS9jb2xvclxuICAgIGNvbnN0IG1peENvbG9yRnVuY3Rpb24gPSAoY29sb3IxLCBjb2xvcjIpID0+IGNvbG9ySW50ZXJwb2xhdGlvbihjb2xvcjEsIGNvbG9yMikoMC41KVxuICAgIC8vdGhlIGNvbG9ycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtaXhlZCBjbGFzc2VzXG4gICAgY29uc3QgW21peENvbG9yMCwgbWl4Q29sb3IxLCBtaXhDb2xvcjJdID0gb3B0cy5taXhlZENvbG9ycyB8fCB3aXRoTWl4ZWRDbGFzc2VzID8gW21peENvbG9yRnVuY3Rpb24oY29sb3IxLCBjb2xvcjIpLCBtaXhDb2xvckZ1bmN0aW9uKGNvbG9yMCwgY29sb3IyKSwgbWl4Q29sb3JGdW5jdGlvbihjb2xvcjAsIGNvbG9yMSldIDogW11cblxuICAgIC8vdGhlIGNlbnRyYWwgY29sb3IsIHVzZWQgZm9yIHRoZSBjZW50cmFsIGNsYXNzLCBpZiBhbnkuIFRoZSBjZW50cmFsIGNsYXNzIGlzIHRoZSBjbGFzcyBvZiByZWxhdGl2ZWx5IGJhbGFuY2VkIHZhbHVlcywgYXJvdW5kIHRoZSBjZW50ZXIgcG9pbnRcbiAgICBjb25zdCBjZW50ZXJDb2xvciA9IG9wdHMuY2VudGVyQ29sb3IgfHwgY29sb3JJbnRlcnBvbGF0aW9uKG1peENvbG9yRnVuY3Rpb24oY29sb3IwLCBjb2xvcjEpLCBjb2xvcjIpKDAuMzMzKVxuXG4gICAgLy9tYWtlIGNsYXNzaWZpZXJcbiAgICBjb25zdCBjbGFzc2lmaWVyID0gdHJpdmFyaWF0ZUNsYXNzaWZpZXIocHJvcGVydGllcywgdG90YWxGdW5jdGlvbiwgb3B0cylcblxuICAgIC8vdGhlIG91dHB1dCBjb2xvciBjbGFzc2lmaWVyIG1ldGhvZFxuICAgIGNvbnN0IGZ1biA9IGMgPT4ge1xuICAgICAgICBjb25zdCBjbGEgPSBjbGFzc2lmaWVyKGMpXG4gICAgICAgIGlmIChjbGEgPT0gXCIwXCIpIHJldHVybiBjb2xvcjBcbiAgICAgICAgaWYgKGNsYSA9PSBcIjFcIikgcmV0dXJuIGNvbG9yMVxuICAgICAgICBpZiAoY2xhID09IFwiMlwiKSByZXR1cm4gY29sb3IyXG4gICAgICAgIGlmIChjbGEgPT0gXCJtMFwiKSByZXR1cm4gbWl4Q29sb3IwXG4gICAgICAgIGlmIChjbGEgPT0gXCJtMVwiKSByZXR1cm4gbWl4Q29sb3IxXG4gICAgICAgIGlmIChjbGEgPT0gXCJtMlwiKSByZXR1cm4gbWl4Q29sb3IyXG4gICAgICAgIGlmIChjbGEgPT0gXCJjZW50ZXJcIikgcmV0dXJuIGNlbnRlckNvbG9yXG4gICAgICAgIHJldHVybiBvcHRzLmRlZmF1bHRDb2xvciB8fCBcImJsYWNrXCJcbiAgICB9XG4gICAgZnVuLmNlbnRlciA9IGNsYXNzaWZpZXIuY2VudGVyXG4gICAgZnVuLmNlbnRlckNvZWZmaWNpZW50ID0gb3B0cy5jZW50ZXJDb2VmZmljaWVudFxuICAgIGZ1bi5jb2xvcnMgPSBbY29sb3IwLCBjb2xvcjEsIGNvbG9yMl1cbiAgICBmdW4ubWl4Q29sb3JzID0gW21peENvbG9yMCwgbWl4Q29sb3IxLCBtaXhDb2xvcjJdXG4gICAgZnVuLmNlbnRlckNvbG9yID0gY2VudGVyQ29sb3JcblxuICAgIHJldHVybiBmdW5cbn1cblxuXG5cblxuXG5cbi8qXG5jb25zdCBvcmRlcmVkSW5kZXhlc0RlYyA9IGFyciA9PiBbLi4uYXJyLmtleXMoKV0uc29ydCgoYSwgYikgPT4gYXJyW2JdIC0gYXJyW2FdKTtcbmNvbnN0IG9yZGVyZWRJbmRleGVzSW5jID0gYXJyID0+IFsuLi5hcnIua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhcnJbYV0gLSBhcnJbYl0pO1xuXG5leHBvcnQgY29uc3QgdHJpdmFyaWF0ZUNsYXNzaWZpZXIgPSAocHJvcGVydGllcywgdG90YWxGdW5jdGlvbiwgb3B0cyA9IHt9KSA9PiB7XG4gICAgY29uc3QgbG93VGhyZXNob2xkID0gb3B0cy5sb3dUaHJlc2hvbGQgfHwgWzEgLyAzLCAxIC8gMywgMSAvIDNdXG4gICAgY29uc3QgaGlnaFRocmVzaG9sZCA9IG9wdHMuaGlnaFRocmVzaG9sZCB8fCBbMiAvIDMsIDIgLyAzLCAyIC8gM11cbiAgICBjb25zdCBjb2xvcnMgPSBvcHRzLmNvbG9ycyB8fCBbXCJyZWRcIiwgXCJncmVlblwiLCBcImJsdWVcIl1cbiAgICBjb25zdCBjb2xvckludGVycG9sYXRpb24gPSBvcHRzLmNvbG9ySW50ZXJwb2xhdGlvbiB8fCBpbnRlcnBvbGF0ZUxhYlxuXG4gICAgLy9odHRwczovL2QzanMub3JnL2QzLWludGVycG9sYXRlL2NvbG9yXG4gICAgY29uc3QgbWlkZGxlQ29sb3JGdW5jdGlvbiA9IChjb2xvcjEsIGNvbG9yMikgPT4gY29sb3JJbnRlcnBvbGF0aW9uKGNvbG9yMSwgY29sb3IyKSgwLjUpXG4gICAgY29uc3QgbWlkZGxlQ29sb3JzID0gb3B0cy5taWRkbGVDb2xvcnMgfHwgW21pZGRsZUNvbG9yRnVuY3Rpb24oY29sb3JzWzFdLCBjb2xvcnNbMl0pLCBtaWRkbGVDb2xvckZ1bmN0aW9uKGNvbG9yc1swXSwgY29sb3JzWzJdKSwgbWlkZGxlQ29sb3JGdW5jdGlvbihjb2xvcnNbMF0sIGNvbG9yc1sxXSldXG4gICAgY29uc3QgY2VudGVyQ29sb3IgPSBvcHRzLmNlbnRlckNvbG9yIHx8IGNvbG9ySW50ZXJwb2xhdGlvbihtaWRkbGVDb2xvcnNbMl0sIGNvbG9yc1syXSkoMC4zMzMpXG5cbiAgICBjb25zdCBoaWdoXyA9IG9yZGVyZWRJbmRleGVzRGVjKGhpZ2hUaHJlc2hvbGQpXG4gICAgY29uc3QgbG93XyA9IG9yZGVyZWRJbmRleGVzSW5jKGxvd1RocmVzaG9sZClcblxuICAgIGNvbnN0IHAwID0gcHJvcGVydGllc1swXSwgcDEgPSBwcm9wZXJ0aWVzWzFdLCBwMiA9IHByb3BlcnRpZXNbMl1cbiAgICBjb25zdCBmdW4gPSBjID0+IHtcbiAgICAgICAgLy9nZXQgdG90YWxcbiAgICAgICAgY29uc3QgdG90ID0gdG90YWxGdW5jdGlvbihjKVxuICAgICAgICBpZiAoIXRvdCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAvL2NvbXB1dGUgc2hhcmVzXG4gICAgICAgIGNvbnN0IHNoYXJlcyA9IFsrY1twMF0gLyB0b3QsICtjW3AxXSAvIHRvdCwgK2NbcDJdIC8gdG90XVxuICAgICAgICAvL3JldHVybiBjb2xvcnNcbiAgICAgICAgLy9zdGFydCBmaXJzdCB3aXRoIHRoZSBleHRyZW1lIGhpZ2ggKHRyaWFuZ2xlcyk6IGZyb20gdGhlIGxhcmdlciB2YWx1ZSAoc21hbGwgdHJpYW5nbGUpIHRvIHRoZSBsb3dlciB2YWx1ZSAobGFyZ2UgdHJpYW5nbGUpXG4gICAgICAgIGZvciAobGV0IGkgb2YgaGlnaF8pIGlmIChzaGFyZXNbaV0gPiBoaWdoVGhyZXNob2xkW2ldKSByZXR1cm4gY29sb3JzW2ldXG4gICAgICAgIC8vdGhlbiBkcmF3IHRoZSBleHRyZW1lIGxvdyAodHJhcGV6aXVtcyk6IGZyb20gdGhlIGxvd2VyIHZhbHVlIChzbWFsbCB0cmFwZXppdW1zKSB0byB0aGUgbGFyZ2VyIHZhbHVlcyAobGFyZ2UgdHJhcGV6aXVtKVxuICAgICAgICBmb3IgKGxldCBpIG9mIGxvd18pIGlmIChzaGFyZXNbaV0gPCBsb3dUaHJlc2hvbGRbaV0pIHJldHVybiBtaWRkbGVDb2xvcnNbaV1cbiAgICAgICAgLy9lbHNlIGNlbnRyYWwgY29sb3JcbiAgICAgICAgcmV0dXJuIGNlbnRlckNvbG9yXG4gICAgfVxuICAgIGZ1bi5sb3dUaHJlc2hvbGQgPSBsb3dUaHJlc2hvbGRcbiAgICBmdW4uaGlnaFRocmVzaG9sZCA9IGhpZ2hUaHJlc2hvbGRcbiAgICBmdW4uY29sb3JzID0gY29sb3JzXG4gICAgZnVuLm1pZGRsZUNvbG9ycyA9IG1pZGRsZUNvbG9yc1xuICAgIGZ1bi5jZW50ZXJDb2xvciA9IGNlbnRlckNvbG9yXG4gICAgZnVuLmxvd0luZGV4ID0gbG93X1xuICAgIGZ1bi5oaWdoSW5kZXggPSBoaWdoX1xuICAgIHJldHVybiBmdW5cbn1cbiovXG5cbi8qXG5leHBvcnQgY29uc3QgdHJpdmFyaWF0ZUNsYXNzaWZpZXIzID0gKHByb3BlcnRpZXMsIHRvdGFsRnVuY3Rpb24sIG9wdHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IFthMDEsIGExMiwgYTIwXSA9IG9wdHMudGhyZXNob2xkcyB8fCBbMS8zLCAxLzMsIDEvM11cbiAgICBjb25zdCBbYzAsIGMxLCBjMl0gPSBvcHRzLmNvbG9ycyB8fCBbXCJyZWRcIiwgXCJncmVlblwiLCBcImJsdWVcIl1cbiAgICBjb25zdCBjZW50ZXJDb2xvciA9IG9wdHMuY2VudGVyQ29sb3IgfHwgXCJncmF5XCJcblxuICAgIGNvbnN0IGZmZiA9IGEgPT4gYSA9PSAxID8gSW5maW5pdHkgOiBhIC8gKDEgLSBhKVxuICAgIGNvbnN0IGMwMSA9IGZmZihhMDEpLCBjMTIgPSBmZmYoYTEyKSwgYzIwID0gZmZmKGEyMClcblxuICAgIGNvbnN0IHAwID0gcHJvcGVydGllc1swXSwgcDEgPSBwcm9wZXJ0aWVzWzFdLCBwMiA9IHByb3BlcnRpZXNbMl1cbiAgICBjb25zdCBmdW4gPSBjID0+IHtcbiAgICAgICAgLy9nZXQgdG90YWxcbiAgICAgICAgY29uc3QgdG90ID0gdG90YWxGdW5jdGlvbihjKVxuICAgICAgICBpZiAoIXRvdCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAvL2NvbXB1dGUgc2hhcmVzXG4gICAgICAgIGNvbnN0IFtzMCwgczEsIHMyXSA9IFsrY1twMF0gLyB0b3QsICtjW3AxXSAvIHRvdCwgK2NbcDJdIC8gdG90XVxuICAgICAgICAvL3JldHVybiBjb2xvcnNcbiAgICAgICAgaWYgKHMwICogYzAxID4gczEgJiYgczAgPiBzMiAqIGMyMCkgcmV0dXJuIGMwXG4gICAgICAgIGVsc2UgaWYgKHMxID4gczAgKiBjMDEgJiYgczEgKiBjMTIgPiBzMikgcmV0dXJuIGMxXG4gICAgICAgIGVsc2UgaWYgKHMyICogYzIwID4gczAgJiYgczIgPiBzMSAqIGMxMikgcmV0dXJuIGMyXG4gICAgICAgIGVsc2UgcmV0dXJuIGNlbnRlckNvbG9yXG4gICAgfVxuICAgIGZ1bi5jb2xvcnMgPSBbYzAsIGMxLCBjMl1cbiAgICBmdW4uY2VudGVyQ29sb3IgPSBjZW50ZXJDb2xvclxuICAgIHJldHVybiBmdW5cbn1cbiovXG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogR2V0IHRoZSBjbGFzcyBpZCBmcm9tIGEgdmFsdWUgYW5kIGNsYXNzIGJyZWFrIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IHRoZSB2YWx1ZVxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYnJlYWtzIHRoZSBicmVha3NcbiAqIEByZXR1cm5zIFRoZSBjbGFzcyBpZCwgZnJvbSAwIHRvIGJyZWFrcy5sZW5ndGhcbiAqIEBkZXByZWNhdGVkIHVzZSBnZXRDbGFzc2lmaWVyIGluc3RlYWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENsYXNzKHYsIGJyZWFrcykge1xuICAgIGlmICghYnJlYWtzKSByZXR1cm5cbiAgICBpZiAoYnJlYWtzLmxlbmd0aCA9PSAwKSByZXR1cm4gMFxuICAgIGlmICh2IDw9IGJyZWFrc1swXSkgcmV0dXJuIDBcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGJyZWFrcy5sZW5ndGg7IGkrKykgaWYgKGJyZWFrc1tpIC0gMV0gPCB2ICYmIHYgPD0gYnJlYWtzW2ldKSByZXR1cm4gaVxuICAgIHJldHVybiBicmVha3MubGVuZ3RoXG59XG5cblxuXG4vL3Rha2UgJ25pY2UnIHZhbHVlIChwb3dlciBvZiB0ZW4sIG9yIG11bHRpcGxlKVxuZXhwb3J0IGZ1bmN0aW9uIG5pY2UodiwgbXVsdGlwbGVzID0gWzgsIDYsIDUsIDQsIDIuNSwgMl0pIHtcbiAgICAvL2NvbXB1dGUgYmlnZ2VyIHBvd2VyIG9mIHRlbiBiZWxvd1xuICAgIGNvbnN0IHZfID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2cxMCh2KSkpXG4gICAgZm9yIChsZXQgbXVsdGlwbGUgb2YgbXVsdGlwbGVzKVxuICAgICAgICBpZiAodl8gKiBtdWx0aXBsZSA8PSB2KSByZXR1cm4gdl8gKiBtdWx0aXBsZVxuICAgIHJldHVybiB2X1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkSW1hZ2Uoc3JjKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7IHJlc29sdmUoaW1nKTsgfTtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJlamVjdChuZXcgRXJyb3IoJ0Vycm9yIGxvYWRpbmcgaW1hZ2UnKSk7IH07XG4gICAgICAgIGltZy5zcmMgPSBzcmM7XG4gICAgfSk7XG59XG5cblxuXG4vKlxuZXhwb3J0IGxldCBtb25pdG9yID0gZmFsc2VcblxubGV0IHByZXZpb3VzRGF0ZVxuZXhwb3J0IGZ1bmN0aW9uIG1vbml0b3JEdXJhdGlvbihtZXNzYWdlKSB7XG4gICAgY29uc3Qgbm93RGF0ZSA9IERhdGUubm93KClcblxuICAgIC8vZmlyc3QgY2FsbFxuICAgIGlmICghcHJldmlvdXNEYXRlKSB7XG4gICAgICAgIHByZXZpb3VzRGF0ZSA9IG5vd0RhdGVcbiAgICAgICAgY29uc29sZS5sb2cocHJldmlvdXNEYXRlLCBtZXNzYWdlKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkID0gbm93RGF0ZSAtIHByZXZpb3VzRGF0ZVxuICAgIHByZXZpb3VzRGF0ZSA9IG5vd0RhdGVcbiAgICBjb25zb2xlLmxvZyhkLCBtZXNzYWdlKVxufVxuKi9cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gd2lkdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWlnaHRcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcmV0dXJucyB7e2NhbnZhczpIVE1MQ2FudmFzRWxlbWVudCwgZ2w6V2ViR0xSZW5kZXJpbmdDb250ZXh0fX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VXZWJHTENhbnZhcyh3aWR0aCwgaGVpZ2h0LCBvcHRzPXt9KSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICBjYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHdpZHRoKVxuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGhlaWdodClcbiAgICAvKiogQHR5cGUge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gKi9cbiAgICBjb25zdCBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIG9wdHMpXG4gICAgaWYgKCFnbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBpbml0aWFsaXplIFdlYkdMLiBZb3VyIGJyb3dzZXIgb3IgbWFjaGluZSBtYXkgbm90IHN1cHBvcnQgaXQuJylcbiAgICB9XG4gICAgcmV0dXJuIHsgY2FudmFzOiBjYW52YXMsIGdsOiBnbCB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIHNoYWRlciBwcm9ncmFtLCBzbyBXZWJHTCBrbm93cyBob3cgdG8gZHJhdyBvdXIgZGF0YVxuICpcbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxuICogQHBhcmFtICB7Li4uV2ViR0xTaGFkZXJ9IHNoYWRlcnNcbiAqIEByZXR1cm5zIHtXZWJHTFByb2dyYW19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0U2hhZGVyUHJvZ3JhbShnbCwgLi4uc2hhZGVycykge1xuICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfG51bGx9ICovXG4gICAgY29uc3QgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKVxuICAgIGlmIChwcm9ncmFtID09IG51bGwpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSB3ZWJHTCBwcm9ncmFtJylcbiAgICBmb3IgKGNvbnN0IHNoYWRlciBvZiBzaGFkZXJzKSBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgc2hhZGVyKVxuICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pXG4gICAgaWYgKGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpKSByZXR1cm4gcHJvZ3JhbVxuICAgIHRocm93IG5ldyBFcnJvcihnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSB8fCAnQ2Fubm90IGNyZWF0ZSB3ZWJHTCBwcm9ncmFtICgyKScpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNoYWRlciBvZiB0aGUgZ2l2ZW4gdHlwZSwgdXBsb2FkcyB0aGUgc291cmNlIGFuZCBjb21waWxlcyBpdC5cbiAqXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2xcbiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlXG4gKiBAcGFyYW0gIHsuLi5zdHJpbmd9IHNvdXJjZXNcbiAqIEByZXR1cm5zIHtXZWJHTFNoYWRlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNoYWRlcihnbCwgdHlwZSwgLi4uc291cmNlcykge1xuICAgIC8qKiBAdHlwZSB7V2ViR0xTaGFkZXJ8bnVsbH0gKi9cbiAgICBjb25zdCBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIodHlwZSlcbiAgICBpZiAoc2hhZGVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSB3ZWJHTCBzaGFkZXInKVxuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZXMuam9pbignXFxuJykpXG4gICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpXG4gICAgaWYgKGdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkgcmV0dXJuIHNoYWRlclxuICAgIHRocm93IG5ldyBFcnJvcihnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikgfHwgJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgc2hhZGVyICgyKScpXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgd2ViR0wgaXMgc3VwcG9ydGVkXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1dlYkdMU3VwcG9ydCgpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgICAgICByZXR1cm4gISEoISF3aW5kb3cuV2ViR0xSZW5kZXJpbmdDb250ZXh0ICYmXG4gICAgICAgICAgICAoY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJykgfHwgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcpKSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8vIHRoZSBhcHBsaWNhdGlvblxuZXhwb3J0IHsgTWFwIH0gZnJvbSAnLi9jb3JlL01hcC5qcydcbmV4cG9ydCB7IEdlb0NhbnZhcyB9IGZyb20gJy4vY29yZS9HZW9DYW52YXMuanMnXG5leHBvcnQgeyBTdHlsZSB9IGZyb20gJy4vY29yZS9TdHlsZS5qcydcbmV4cG9ydCB7IExheWVyIH0gZnJvbSAnLi9jb3JlL0xheWVyLmpzJ1xuZXhwb3J0IHsgRGF0YXNldCB9IGZyb20gJy4vY29yZS9EYXRhc2V0LmpzJ1xuZXhwb3J0IHsgTXVsdGlSZXNvbHV0aW9uRGF0YXNldCB9IGZyb20gJy4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0LmpzJ1xuXG4vLyBleHBvcnQgZGF0YXNldCB0eXBlc1xuZXhwb3J0IHsgVGlsZWRHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L1RpbGVkR3JpZC5qcydcbmV4cG9ydCB7IENTVkdyaWQgfSBmcm9tICcuL2RhdGFzZXQvQ1NWR3JpZC5qcydcbmV4cG9ydCB7IEpTR3JpZCB9IGZyb20gJy4vZGF0YXNldC9KU0dyaWQuanMnXG5cbi8vIGV4cG9ydCBzdHlsZXNcbmV4cG9ydCB7IFNoYXBlQ29sb3JTaXplU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NoYXBlQ29sb3JTaXplU3R5bGUuanMnXG5leHBvcnQgeyBTdHJva2VTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3Ryb2tlU3R5bGUuanMnXG5leHBvcnQgeyBKb3lQbG90U3R5bGUgfSBmcm9tICcuL3N0eWxlL0pveVBsb3RTdHlsZS5qcydcbmV4cG9ydCB7IENvbXBvc2l0aW9uU3R5bGUgfSBmcm9tICcuL3N0eWxlL0NvbXBvc2l0aW9uU3R5bGUuanMnXG5leHBvcnQgeyBTZWdtZW50U3R5bGUgfSBmcm9tICcuL3N0eWxlL1NlZ21lbnRTdHlsZS5qcydcbmV4cG9ydCB7IFRleHRTdHlsZSB9IGZyb20gJy4vc3R5bGUvVGV4dFN0eWxlLmpzJ1xuZXhwb3J0IHsgUGlsbGFyU3R5bGUgfSBmcm9tICcuL3N0eWxlL1BpbGxhclN0eWxlLmpzJ1xuZXhwb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaWRlU3R5bGUuanMnXG4vL2V4cG9ydCB7IENvbnRvdXJTdHlsZSB9IGZyb20gJy4vc3R5bGUvQ29udG91clN0eWxlLmpzJ1xuZXhwb3J0IHsgU2lkZUNhdGVnb3J5U3R5bGUgfSBmcm9tICcuL3N0eWxlL1NpZGVDYXRlZ29yeVN0eWxlLmpzJ1xuZXhwb3J0IHsgRG90RGVuc2l0eVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Eb3REZW5zaXR5U3R5bGUuanMnXG5leHBvcnQgeyBUYW5ha2FTdHlsZSB9IGZyb20gJy4vc3R5bGUvVGFuYWthU3R5bGUuanMnXG5leHBvcnQgeyBMZWdvU3R5bGUgfSBmcm9tICcuL3N0eWxlL0xlZ29TdHlsZS5qcydcbmV4cG9ydCB7IFNxdWFyZUNvbG9yV2ViR0xTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3F1YXJlQ29sb3JXZWJHTFN0eWxlLmpzJ1xuZXhwb3J0IHsgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlLmpzJ1xuZXhwb3J0IHsgTW9zYWljU3R5bGUgfSBmcm9tICcuL3N0eWxlL01vc2FpY1N0eWxlLmpzJ1xuZXhwb3J0IHsgTmluamFTdGFyU3R5bGUgfSBmcm9tICcuL3N0eWxlL05pbmphU3RhclN0eWxlLmpzJ1xuZXhwb3J0IHsgVGltZVNlcmllc1N0eWxlIH0gZnJvbSAnLi9zdHlsZS9UaW1lU2VyaWVzU3R5bGUuanMnXG5leHBvcnQgeyBJc29GZW5jZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Jc29GZW5jZVN0eWxlLmpzJ1xuZXhwb3J0IHsgSW1hZ2VTdHlsZSB9IGZyb20gJy4vc3R5bGUvSW1hZ2VTdHlsZS5qcydcblxuLy8gZXhwb3J0IGFkZGl0aW9uYWwgbGF5ZXJzXG5leHBvcnQgeyBHcmlkTGF5ZXIgfSBmcm9tICcuL2xheWVyL0dyaWRMYXllci5qcydcbmV4cG9ydCB7IEJhY2tncm91bmRMYXllciB9IGZyb20gJy4vbGF5ZXIvQmFja2dyb3VuZExheWVyLmpzJ1xuZXhwb3J0IHsgQmFja2dyb3VuZExheWVyV01TIH0gZnJvbSAnLi9sYXllci9CYWNrZ3JvdW5kTGF5ZXJXTVMuanMnXG5leHBvcnQgeyBCYWNrZ3JvdW5kTGF5ZXJJbWFnZSB9IGZyb20gJy4vbGF5ZXIvQmFja2dyb3VuZExheWVySW1hZ2UuanMnXG5leHBvcnQgeyBMYWJlbExheWVyIH0gZnJvbSAnLi9sYXllci9MYWJlbExheWVyLmpzJ1xuZXhwb3J0IHsgR2VvSlNPTkxheWVyIH0gZnJvbSAnLi9sYXllci9HZW9KU09OTGF5ZXIuanMnXG5cbi8vIGV4cG9ydCBsZWdlbmRzXG5leHBvcnQgeyBDb2xvckxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yTGVnZW5kLmpzJ1xuZXhwb3J0IHsgQ29sb3JEaXNjcmV0ZUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yRGlzY3JldGVMZWdlbmQuanMnXG5leHBvcnQgeyBDb2xvckNhdGVnb3J5TGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvQ29sb3JDYXRlZ29yeUxlZ2VuZC5qcydcbmV4cG9ydCB7IFNpemVMZWdlbmQsIHNpemVMZWdlbmQsIHNpemVMZWdlbmRWaWV3U2NhbGUsIHNpemVEaXNjcmV0ZUxlZ2VuZCwgc2l6ZURpc2NyZXRlVmlld1NjYWxlTGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvU2l6ZUxlZ2VuZC5qcydcbmV4cG9ydCB7IE9yaWVudGF0aW9uTGVnZW5kLCBvcmllbnRhdGlvbkxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL09yaWVudGF0aW9uTGVnZW5kLmpzJ1xuZXhwb3J0IHsgVHJpdmFyaWF0ZUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL1RyaXZhcmlhdGVMZWdlbmQuanMnXG5cbi8vIGV4cG9ydCB7IGdvVG9TdHJhaWdodCwgem9vbVRvIH0gZnJvbSBcIi4vdXRpbHMvem9vbVV0aWxzXCJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvc3RyZXRjaGluZy5qcydcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvc2NhbGUuanMnXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3RyaXZhcmlhdGUuanMnXG4vL2V4cG9ydCAqIGZyb20gJy4vdXRpbHMvY2hlcm5vZmYuanMnXG5leHBvcnQgeyBuaWNlIH0gZnJvbSAnLi91dGlscy91dGlscy5qcydcbi8vbG9hZEltYWdlXG5cbmltcG9ydCB7IEdlb0NhbnZhcyB9IGZyb20gJy4vY29yZS9HZW9DYW52YXMuanMnXG5leHBvcnQgY29uc3QgZ2V0UGFyYW1ldGVyQnlOYW1lID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZVxuXG4vLyBzZXQgZGVmYXVsdCBkMyBsb2NhbGVcbmltcG9ydCB7IGZvcm1hdERlZmF1bHRMb2NhbGUgfSBmcm9tICdkMy1mb3JtYXQnXG5mb3JtYXREZWZhdWx0TG9jYWxlKHtcbiAgICBkZWNpbWFsOiAnLicsXG4gICAgdGhvdXNhbmRzOiAnICcsXG4gICAgZ3JvdXBpbmc6IFszXSxcbiAgICBjdXJyZW5jeTogWycnLCAn4oKsJ10sXG59KVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|