diff --git a/dist/gridviz.js b/dist/gridviz.js index bb3e08e74..09155b07d 100644 --- a/dist/gridviz.js +++ b/dist/gridviz.js @@ -8146,7 +8146,7 @@ class Map { } //https://css-tricks.com/absolute-positioning-inside-relative-positioning/ - this.container.style.position = "relative"; // container element must have relative positioning + this.container.style.position = 'relative' // container element must have relative positioning //set dimensions /** @type {number} */ @@ -8162,14 +8162,15 @@ class Map { * @type {GeoCanvas} * @private */ this.geoCanvas = new _GeoCanvas_js__WEBPACK_IMPORTED_MODULE_0__.GeoCanvas(this._canvas, opts.x, opts.y, opts.z, opts) - this.geoCanvas.redraw = () => { this.redraw() } + this.geoCanvas.redraw = () => { + this.redraw() + } // legend div this.legendDivId = opts.legendDivId || 'gvizLegend' this.legend = (0,d3_selection__WEBPACK_IMPORTED_MODULE_4__["default"])('#' + this.legendDivId) if (this.legend.empty()) this.initialiseLegend() - //tooltip // set App container as default parent element for tooltip @@ -8189,6 +8190,9 @@ class Map { this.geoCanvas.canvas.addEventListener('mousemove', this.mouseMoveHandler) this.geoCanvas.canvas.addEventListener('mouseout', this.mouseOutHandler) + // listen for resize events on the App's container and handle them + this.defineResizeObserver(this.container, this._canvas) + // add extra logic to onZoomStartFun this.geoCanvas.onZoomStartFun = (e) => { if (opts.onZoomStartFun) opts.onZoomStartFun(e) @@ -8212,10 +8216,10 @@ class Map { opts.defaultGlobalCompositeOperation || this.geoCanvas.ctx.globalCompositeOperation } - /** - * @protected + /** + * @protected * @returns {HTMLCanvasElement} - */ + */ initialiseCanvas() { const canvas = document.createElement('canvas') canvas.setAttribute('width', '' + this.w) @@ -8224,7 +8228,6 @@ class Map { return canvas } - initialiseLegend() { this.legend = (0,d3_selection__WEBPACK_IMPORTED_MODULE_4__["default"])(this.container.id && this.container.id != '' ? '#' + this.container.id : 'body') .append('div') @@ -8246,8 +8249,8 @@ class Map { /** * Set/get layer stack. - * - * @param {undefined|import("./Layer.js").Layer|import("./Layer.js").Layer[]} layers + * + * @param {undefined|import("./Layer.js").Layer|import("./Layer.js").Layer[]} layers * @returns { this | import("./Layer.js").Layer[] } */ layers_(layers) { @@ -8273,14 +8276,12 @@ class Map { //go through the layers for (const layer of this.layers) { - //check if layer is visible if (layer.visible && !layer.visible(z)) continue //set layer alpha and blend mode this.geoCanvas.ctx.globalAlpha = layer.alpha ? layer.alpha(z) : 1.0 - if (layer.blendOperation) - this.geoCanvas.ctx.globalCompositeOperation = layer.blendOperation(z) + if (layer.blendOperation) this.geoCanvas.ctx.globalCompositeOperation = layer.blendOperation(z) //set affin transform to draw with geographical coordinates this.geoCanvas.setCanvasTransform() @@ -8289,24 +8290,17 @@ class Map { layer.draw(this.geoCanvas, this.legend) //draw layer filter - if (layer.filterColor) - layer.drawFilter(this.geoCanvas) + if (layer.filterColor) layer.drawFilter(this.geoCanvas) //restore default alpha and blend operation this.geoCanvas.ctx.globalAlpha = 1.0 this.geoCanvas.ctx.globalCompositeOperation = this.defaultGlobalCompositeOperation } - - // this.canvasSave = null - // listen for resize events on the App's container and handle them - this.defineResizeObserver(this.container, this._canvas) - return this } - /** * @param {number} marginPx * @returns {import('./GeoCanvas.js').Envelope} @@ -8316,8 +8310,6 @@ class Map { return this.geoCanvas.updateExtentGeo(marginPx) } - - /** @param {MouseEvent} e */ focusCell(e) { //compute mouse geo position @@ -8382,7 +8374,6 @@ class Map { } } - /** * Return the cell HTML info at a given geo position. * This is usefull for user interactions, to show this info where the user clicks for example. @@ -8424,8 +8415,7 @@ class Map { } } - - /** + /** * @param {number} x * @param {number} y * @param {number|undefined} z @@ -8438,7 +8428,9 @@ class Map { } /** @returns {import('./GeoCanvas.js').View} */ - getView() { return this.geoCanvas.view } + getView() { + return this.geoCanvas.view + } /** @returns {number} */ getZoom() { @@ -8450,7 +8442,6 @@ class Map { return this } - /** @returns {Array.} */ getCenterExtent() { return this.geoCanvas.getCenterExtent() @@ -8471,8 +8462,6 @@ class Map { return this } - - /** @returns {string} */ getBackgroundColor() { return this.geoCanvas.backgroundColor @@ -8503,7 +8492,7 @@ class Map { x: opts?.x, y: opts?.y, onZoom: opts?.onZoom, - delta: opts?.delta || 0.2 + delta: opts?.delta || 0.2, }) return this @@ -8526,7 +8515,7 @@ class Map { id: opts?.id || 'gridviz-fullscreen-button', class: opts?.class, x: opts?.x, - y: opts?.y + y: opts?.y, }) return this @@ -15875,6 +15864,8 @@ function checkWebGLSupport() { /******/ /************************************************************************/ var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { /*!**********************!*\ !*** ./src/index.js ***! \**********************/ @@ -16061,8 +16052,10 @@ const getParameterByName = _core_GeoCanvas_js__WEBPACK_IMPORTED_MODULE_1__.GeoCa currency: ['', '€'], }) +})(); + /******/ return __webpack_exports__; /******/ })() ; }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUF5QixJQUFJO0FBQzdCLHdDQUF3QyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7QUFDMUQsd0NBQXdDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUMxRCwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSx3Q0FBd0MsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQzFELDBDQUEwQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJOztBQUVuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxlQUFlLFlBQVksU0FBUztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3hIb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTywwQkFBMEIsOENBQU07QUFDdkM7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwwQkFBMEI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0NBQWdDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdDQUFnQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0NBQWdDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrREFBa0Q7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw0QkFBNEI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDBDQUEwQztBQUN6RCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NB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O0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDJDQUEyQztBQUMxRCxlQUFlLDBDQUEwQztBQUN6RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEMsc0JBQXNCLG9EQUFTO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsaUVBQWlFO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQzFNQTtBQUNZO0FBQ1o7QUFDQSxDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sMkJBQTJCLGlEQUFLO0FBQ3ZDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUIsdUJBQXVCLHdCQUF3QjtBQUNsRjtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQix1QkFBdUIsd0JBQXdCO0FBQ2xGO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCLHVCQUF1Qix3QkFBd0I7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMkNBQTJDO0FBQzFELGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHlCQUF5QjtBQUM5QyxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFdBQVc7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFdBQVc7QUFDMUM7QUFDQSwyQkFBMkIsUUFBUTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9IQTtBQUNZO0FBQ1o7QUFDQSxDQUE4QztBQUNBO0FBQ29DO0FBQzFDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsd0RBQVc7QUFDOUI7QUFDQSx3QkFBd0Isd0RBQVc7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsdUVBQXVFO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvREFBb0Q7QUFDbkUsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiw0RkFBNkIsR0FBRywwQkFBMEI7QUFDaEY7QUFDQSx3QkFBd0Isd0RBQVcsR0FBRyw4REFBOEQ7QUFDcEc7QUFDQSwyQ0FBMkMsa0RBQWtEO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixpREFBSztBQUNoQyxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQzdHQTtBQUNZO0FBQ1o7QUFDQSxDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sMEJBQTBCLGlEQUFLO0FBQ3RDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHdDQUF3QztBQUN2RCxlQUFlLHVDQUF1QztBQUN0RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGlFQUFpRTtBQUM5RjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbEdBO0FBQ1k7QUFDWjtBQUNBLENBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyw2QkFBNkIsaURBQUs7QUFDekMsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiw0RUFBNEU7QUFDL0Y7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlEQUFpRDtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwyQ0FBMkM7QUFDMUQsZUFBZSx1Q0FBdUM7QUFDdEQsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixpRUFBaUU7QUFDOUY7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3JHQTtBQUNZO0FBQ1o7QUFDQSxDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sMEJBQTBCLGlEQUFLO0FBQ3RDO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5RjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix5Q0FBeUM7QUFDM0Q7QUFDQTtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsd0NBQXdDO0FBQ3ZELGVBQWUsdUNBQXVDO0FBQ3RELGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxzQ0FBc0M7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGlFQUFpRTtBQUM5RjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDL01BO0FBQ1k7QUFDWjtBQUNBLENBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sMkJBQTJCLGlEQUFLO0FBQ3ZDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5RjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsd0NBQXdDO0FBQ3ZELGVBQWUsdUNBQXVDO0FBQ3RELGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFFBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixrRUFBa0U7QUFDL0Y7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3hHQTtBQUNZO0FBQ1o7QUFDQSxDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sa0NBQWtDLGlEQUFLO0FBQzlDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG9HQUFvRztBQUN0SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDJDQUEyQztBQUMxRCxlQUFlLDBDQUEwQztBQUN6RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsa0VBQWtFO0FBQy9GO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuSUE7QUFDWTtBQUNaO0FBQ0EsQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxnQ0FBZ0Msb0RBQVM7QUFDaEQsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixvRUFBb0U7QUFDdEY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwyQ0FBMkM7QUFDMUQsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUNBQXVDO0FBQzNELHNCQUFzQixvREFBUztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixpRUFBaUU7QUFDOUY7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2pIQTtBQUNZO0FBQ1o7QUFDQSxDQUF3QztBQUN4QztBQUNBLGdCQUFnQixnSUFBZ0k7QUFDaEo7QUFDQTtBQUNBLGFBQWEseUNBQXlDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyx3QkFBd0IsaURBQUs7QUFDcEMsZ0JBQWdCLFFBQVE7QUFDeEIseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwrQ0FBK0M7QUFDakU7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLCtDQUErQztBQUNqRTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsK0NBQStDO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSx3Q0FBd0M7QUFDdkQsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsdUNBQXVDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSwyQkFBMkIsa0JBQWtCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGtCQUFrQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixpRUFBaUU7QUFDOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSx3Q0FBd0M7QUFDdkQsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUztBQUN4QixlQUFlLFNBQVM7QUFDeEIsZUFBZSxTQUFTO0FBQ3hCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0Esb0JBQW9CLGVBQWU7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVNQTtBQUNZO0FBQ1o7QUFDQSxDQUF3QztBQUNnQjtBQUNtQztBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyw0Q0FBNEMsaURBQUs7QUFDeEQsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG9EQUFvRDtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUNBQWlDO0FBQ3BELHVCQUF1QixvR0FBOEI7QUFDckQ7QUFDQTtBQUNBO0FBQ0EsZUFBZSwyQ0FBMkM7QUFDMUQsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsUUFBUTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixxRUFBZTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLDJDQUEyQztBQUN4RTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQzNHQTtBQUNZO0FBQ1o7QUFDQSxDQUF3QztBQUNnQjtBQUM2QjtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxvQ0FBb0MsaURBQUs7QUFDaEQsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHlFQUF5RTtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDRCQUE0QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0NBQWdDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwyQ0FBMkM7QUFDMUQsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IscUVBQWU7QUFDckM7QUFDQTtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDhGQUEyQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsaUVBQWlFO0FBQzlGO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3SEE7QUFDWTtBQUNaO0FBQ0EsQ0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDBCQUEwQixpREFBSztBQUN0QyxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHlFQUF5RTtBQUMzRjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IseUVBQXlFO0FBQzNGO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix5RUFBeUU7QUFDM0Y7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLG1HQUFtRztBQUNwSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHdDQUF3QztBQUN2RCxlQUFlLHVDQUF1QztBQUN0RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsaUVBQWlFO0FBQzlGO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZJQTtBQUNZO0FBQ1o7QUFDQSxDQUEwQztBQUN3QztBQUNBO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGVBQWUsb0RBQW9EO0FBQ25FLGVBQWUsZ0JBQWdCO0FBQy9CLGVBQWUsZ0JBQWdCO0FBQy9CLGVBQWUsUUFBUTtBQUN2QixpQkFBaUI7QUFDakI7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrQ0FBa0M7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsMkJBQTJCLDJEQUFLO0FBQ2hDO0FBQ0E7QUFDQSx3QkFBd0IsbUJBQW1CO0FBQzNDO0FBQ0EsOEJBQThCLDRGQUE2QjtBQUMzRDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsb0RBQVM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuRUE7QUFDWTtBQUNaO0FBQ0EsQ0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLHdCQUF3QixpREFBSztBQUNwQyxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5RjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwyRUFBMkU7QUFDN0Y7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5RjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsd0NBQXdDO0FBQ3ZELGVBQWUsdUNBQXVDO0FBQ3RELGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixpRUFBaUU7QUFDOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZ0JBQWdCO0FBQy9CLGVBQWUscUNBQXFDO0FBQ3BELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDOUdBO0FBQ1k7QUFDWjtBQUNBLENBQXdDO0FBQ3hDO0FBQ0EsY0FBYyx3Q0FBd0M7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDhCQUE4QixpREFBSztBQUMxQyxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsMEJBQTBCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtFQUFrRTtBQUNwRjtBQUNBLG1CQUFtQixrRUFBa0U7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0VBQWtFO0FBQ3BGO0FBQ0EsbUJBQW1CLGtFQUFrRTtBQUNyRjtBQUNBLG1CQUFtQiwyRUFBMkU7QUFDOUY7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5RjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMkNBQTJDO0FBQzFELGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFFBQVE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q05BO0FBQ1k7QUFDWjtBQUNBO0FBQ21DO0FBQ1k7QUFDUjtBQUNBO0FBQ0k7QUFDOEI7QUFDekU7QUFDQTtBQUNrRDtBQUNKO0FBQ0Y7QUFDNUM7QUFDQTtBQUNvRTtBQUNoQjtBQUNFO0FBQ1E7QUFDUjtBQUNOO0FBQ0k7QUFDSjtBQUNoRCxXQUFXLGVBQWU7QUFDc0M7QUFDSjtBQUNSO0FBQ0o7QUFDd0I7QUFDZ0I7QUFDcEM7QUFDTTtBQUNFO0FBQ0o7QUFDTjtBQUNsRDtBQUNBO0FBQ2dEO0FBQ1k7QUFDTTtBQUNJO0FBQ3BCO0FBQ0k7QUFDdEQ7QUFDQTtBQUNxRDtBQUNnQjtBQUNBO0FBQ2dFO0FBQ2pEO0FBQzNCO0FBQ3pEO0FBQ0EsWUFBWSx1QkFBdUI7QUFDRTtBQUNMO0FBQ0U7QUFDSztBQUN2QztBQUNBLENBQStDO0FBQ3hDLDJCQUEyQix5REFBUztBQUMzQztBQUNBO0FBQ0EsQ0FBK0M7QUFDL0Msc0RBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWR2aXovd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2FzY2VuZGluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9iaXNlY3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYmlzZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvZGVzY2VuZGluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9leHRlbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvZ3JlYXRlc3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWF4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21heEluZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21pbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9taW5JbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9udW1iZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcGVybXV0ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9xdWFudGlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9xdWlja3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zb3J0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2NvbG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2RlZmluZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9sYWIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvbWF0aC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRpc3BhdGNoL3NyYy9kaXNwYXRjaC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL25vZHJhZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL25vZXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kc3Yvc3JjL2Nzdi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvZHN2LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZHN2L3NyYy90c3YuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9jdWJpYy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZldGNoL3NyYy9kc3YuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvanNvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZldGNoL3NyYy90ZXh0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9kZWZhdWx0TG9jYWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9leHBvbmVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0RGVjaW1hbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0R3JvdXAuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdE51bWVyYWxzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRQcmVmaXhBdXRvLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRSb3VuZGVkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRTcGVjaWZpZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFRyaW0uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFR5cGVzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvbG9jYWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2Jhc2lzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2Jhc2lzQ2xvc2VkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2xhYi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9udW1iZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvcmdiLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3N0cmluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vZGVjb21wb3NlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vcGFyc2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvem9vbS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXJhbmRvbS9zcmMvZGVmYXVsdFNvdXJjZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXJhbmRvbS9zcmMvbm9ybWFsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2luaXQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvcXVhbnRpbGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2FycmF5LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY3JlYXRvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbWF0Y2hlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2VzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9wb2ludGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9hcHBlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9hdHRyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2FsbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NsYXNzZWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jbG9uZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdGEuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kYXR1bS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Rpc3BhdGNoLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZWFjaC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VtcHR5LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW50ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9leGl0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZmlsdGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaHRtbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5zZXJ0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9qb2luLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbG93ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9tZXJnZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL25vZGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2Rlcy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vb3JkZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JhaXNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcmVtb3ZlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0QWxsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RDaGlsZHJlbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NpemUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zb3J0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc3BhcnNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi90ZXh0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0b3JBbGwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NvdXJjZUV2ZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy93aW5kb3cuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZW91dC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2FjdGl2ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvaW50ZXJydXB0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2ludGVycnVwdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi90cmFuc2l0aW9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyVHdlZW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2RlbGF5LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kdXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZWFzZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZWFzZVZhcnlpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZmlsdGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW50ZXJwb2xhdGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL21lcmdlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9vbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vcmVtb3ZlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zY2hlZHVsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3RBbGwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdGlvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlVHdlZW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RleHQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RleHRUd2Vlbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHdlZW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2V2ZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9ub2V2ZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvdHJhbnNmb3JtLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvem9vbS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2J1dHRvbi9CdXR0b24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9idXR0b24vRnVsbHNjcmVlbkJ1dHRvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2J1dHRvbi9ab29tQnV0dG9ucy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvRGF0YXNldC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvRHJhd2FibGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL0dlb0NhbnZhcy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL0xlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvTWFwLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9TdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvVG9vbHRpcC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2RhdGFzZXQvQ1NWR3JpZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2RhdGFzZXQvSlNHcmlkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvZGF0YXNldC9UaWxlZEdyaWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9CYWNrZ3JvdW5kTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9CYWNrZ3JvdW5kTGF5ZXJJbWFnZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xheWVyL0JhY2tncm91bmRMYXllcldNUy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xheWVyL0dlb0pTT05MYXllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xheWVyL0dyaWRMYXllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xheWVyL0xhYmVsTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvQ29sb3JDYXRlZ29yeUxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9Db2xvckRpc2NyZXRlTGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL0NvbG9yTGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL09yaWVudGF0aW9uTGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL1NpemVMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvVGVybmFyeUxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0NvbXBvc2l0aW9uU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9Eb3REZW5zaXR5U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9JbWFnZVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvSXNvRmVuY2VTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0pveVBsb3RTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0xlZ29TdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL01vc2FpY1N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvTmluamFTdGFyU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9QaWxsYXJTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1NlZ21lbnRTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1NoYXBlQ29sb3JTaXplU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TaWRlQ2F0ZWdvcnlTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1NpZGVTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1NxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU3F1YXJlQ29sb3JXZWJHTFN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU3Ryb2tlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9UYW5ha2FTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1RleHRTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1RpbWVTZXJpZXNTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy9zY2FsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL3N0cmV0Y2hpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy90ZXJuYXJ5LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy93ZWJHTFV0aWxzLmpzIiwid2VicGFjazovL2dyaWR2aXovd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2dyaWR2aXovd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImdyaWR2aXpcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiZ3JpZHZpelwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsICgpID0+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/IHpvb20gOiB2YWx1ZTtcbiAgfTtcblxuICB6b29tLmNsaWNrRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIHpvb20pIDogTWF0aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTtcbiAgfTtcblxuICB6b29tLnRhcERpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcERpc3RhbmNlID0gK18sIHpvb20pIDogdGFwRGlzdGFuY2U7XG4gIH07XG5cbiAgcmV0dXJuIHpvb207XG59XG4iLCJpbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXHJcblxyXG4vKipcclxuICogUGFyZW50IGNsYXNzIGZvciBidXR0b24gZWxlbWVudHMgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBncmlkdml6IHZpZXdlci5cclxuICpcclxuICogQG1vZHVsZSBidXR0b25cclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEJ1dHRvbiB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXHJcbiAgICAgKiBvcHRzLnBhcmVudE5vZGVcclxuICAgICAqIG9wdHMuaWRcclxuICAgICAqIG9wdHMudGl0bGVcclxuICAgICAqIG9wdHMuY2xhc3NcclxuICAgICAqIG9wdHMub25DbGlja0Z1bmN0aW9uXHJcbiAgICAgKiBvcHRzLnhcclxuICAgICAqIG9wdHMueVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzID0ge30pIHtcclxuICAgICAgICB0aGlzLm1hcCA9IG9wdHMubWFwXHJcbiAgICAgICAgdGhpcy5wYXJlbnROb2RlID0gb3B0cy5wYXJlbnROb2RlIHx8IG9wdHMubWFwLmNvbnRhaW5lclxyXG5cclxuICAgICAgICAvLyB0aGUgZGl2IGVsZW1lbnRcclxuICAgICAgICBpZiAob3B0cy5pZCkgdGhpcy5kaXYgPSBzZWxlY3QoJyMnICsgb3B0cy5pZClcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmRpdiB8fCB0aGlzLmRpdi5lbXB0eSgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGl2ID0gc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKVxyXG4gICAgICAgICAgICBpZiAob3B0cy5pZCkgdGhpcy5kaXYuYXR0cignaWQnLCBvcHRzLmlkKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9wdHMudGl0bGUpIHRoaXMuZGl2LmF0dHIoJ3RpdGxlJywgb3B0cy50aXRsZSlcclxuICAgICAgICBpZiAob3B0cy5jbGFzcykgdGhpcy5kaXYuYXR0cignY2xhc3MnLCBvcHRzLmNsYXNzKVxyXG5cclxuICAgICAgICAvLyBhZGQgZXZlbnRzXHJcbiAgICAgICAgaWYgKG9wdHMub25DbGlja0Z1bmN0aW9uKSB0aGlzLmRpdi5vbignY2xpY2snLCBvcHRzLm9uQ2xpY2tGdW5jdGlvbilcclxuXHJcbiAgICAgICAgLy9zZXQgc3R5bGVzXHJcbiAgICAgICAgdGhpcy5zdHlsZShcclxuICAgICAgICAgICAgJ2JveC1zaGFkb3cnLFxyXG4gICAgICAgICAgICAnMCA3cHggOHB4IHJnYmEoMCw0NywxMDMsLjA4KSwgMCAwIDIycHggcmdiYSgwLDQ3LDEwMywuMDQpLCAwIDEycHggMTdweCByZ2JhKDAsNDcsMTAzLC4wNCksIDAgLTRweCA0cHggcmdiYSgwLDQ3LDEwMywuMDQpJ1xyXG4gICAgICAgICkgLy8uZWNsLXUtc2hhZG93LTNcclxuICAgICAgICB0aGlzLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNmZmZmZmYnKVxyXG4gICAgICAgIHRoaXMuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcclxuICAgICAgICB0aGlzLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpXHJcbiAgICAgICAgdGhpcy5zdHlsZSgnZGlzcGxheScsICdmbGV4JylcclxuICAgICAgICB0aGlzLnN0eWxlKCdqdXN0aWZ5LWNvbnRlbnQnLCAnY2VudGVyJylcclxuICAgICAgICB0aGlzLnN0eWxlKCdhbGlnbi1pdGVtcycsICdjZW50ZXInKVxyXG4gICAgICAgIHRoaXMuc3R5bGUoJ3dpZHRoJywgJzMwcHgnKVxyXG4gICAgICAgIHRoaXMuc3R5bGUoJ2hlaWdodCcsICczMHB4JylcclxuICAgICAgICAvLyB0aGlzLnN0eWxlKHBhZGRpbmcgLCAnNHB4J1xyXG5cclxuICAgICAgICAvLyBhcHBlbmQgdG8gcGFyZW50XHJcbiAgICAgICAgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMuZGl2Lm5vZGUoKSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IGEgc3R5bGUgdG8gdGhlIGJ1dHRvbiBkaXYuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZcclxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxyXG4gICAgICovXHJcbiAgICBzdHlsZShrLCB2KSB7XHJcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoaywgdilcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4vQnV0dG9uLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEJ1dHRvbiBmb3IgdG9nZ2xpbmcgZnVsbHNjcmVlbiBtb2RlXHJcbiAqXHJcbiAqIEBtb2R1bGUgYnV0dG9uXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBGdWxsc2NyZWVuQnV0dG9uIGV4dGVuZHMgQnV0dG9uIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcclxuICAgICAqIG9wdHMucGFyZW50Tm9kZSAtIHRoZSBub2RlIHRoYXQgdGhlIGJ1dHRvbiBpcyBhcHBlbmRlZCB0b1xyXG4gICAgICogb3B0cy5jYW52YXMgLSB0aGUgZ3JpZHZpeiBjYW52YXNcclxuICAgICAqIG9wdHMuaWRcclxuICAgICAqIG9wdHMudGl0bGUgLSBIVE1MIHRpdGxlIGF0dHJpYnV0ZVxyXG4gICAgICogb3B0cy5jbGFzcyAtIGNzcyBjbGFzc1xyXG4gICAgICogb3B0cy5vbkNsaWNrRnVuY3Rpb25cclxuICAgICAqIG9wdHMueCAtIHggcG9zaXRpb24gb2YgdGhlIGJ1dHRvblxyXG4gICAgICogb3B0cy55IC0geSBwb3NpdGlvbiBvZiB0aGUgYnV0dG9uXHJcbiAgICAgKi9cclxuXHJcbiAgICAvLyBkZWZhdWx0IHN0YXRlXHJcbiAgICBpc0Z1bGxzY3JlZW4gPSBmYWxzZVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG5cclxuICAgICAgICAvLyBhcHBlbmQgZnVsbHNjcmVlbiBpY29uIHRvIGJ1dHRvbiBjb250YWluZXJcclxuICAgICAgICB0aGlzLmRpdi5ub2RlKCkuaW5uZXJIVE1MID0gYFxyXG4gICAgICAgIDxzdmdcclxuICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDEuMnJlbTsgd2lkdGg6IDEuMnJlbTsgZmlsbDpibGFjazsgbWFyZ2luOjA7XCJcclxuICAgICAgICAgICAgZm9jdXNhYmxlPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPHN2ZyBmaWxsPVwiIzAwMDAwMFwiIHZpZXdCb3g9XCIwIDAgOTYgOTZcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDx0aXRsZS8+XHJcbiAgICAgICAgICAgIDxnPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTMwLDBINkE1Ljk5NjYsNS45OTY2LDAsMCwwLDAsNlYzMGE2LDYsMCwwLDAsMTIsMFYxMkgzMEE2LDYsMCwwLDAsMzAsMFpcIi8+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNOTAsMEg2NmE2LDYsMCwwLDAsMCwxMkg4NFYzMGE2LDYsMCwwLDAsMTIsMFY2QTUuOTk2Niw1Ljk5NjYsMCwwLDAsOTAsMFpcIi8+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzAsODRIMTJWNjZBNiw2LDAsMCwwLDAsNjZWOTBhNS45OTY2LDUuOTk2NiwwLDAsMCw2LDZIMzBhNiw2LDAsMCwwLDAtMTJaXCIvPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTkwLDYwYTUuOTk2Niw1Ljk5NjYsMCwwLDAtNiw2Vjg0SDY2YTYsNiwwLDAsMCwwLDEySDkwYTUuOTk2Niw1Ljk5NjYsMCwwLDAsNi02VjY2QTUuOTk2Niw1Ljk5NjYsMCwwLDAsOTAsNjBaXCIvPlxyXG4gICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIGBcclxuXHJcbiAgICAgICAgLy9zYXZlIGluaXRpYWwgbWFwIGRpbWVuc2lvbnNcclxuICAgICAgICB0aGlzLmRlZmF1bHRIZWlnaHQgPSB0aGlzLm1hcC5oXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0V2lkdGggPSB0aGlzLm1hcC53XHJcblxyXG4gICAgICAgIC8vIGV2ZW50IGhhbmRsZXJcclxuICAgICAgICB0aGlzLmRpdi5vbignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2xpY2tGdW5jdGlvbihlKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5kaXYub24oJ21vdXNlb3ZlcicsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ2JhY2tncm91bmQtY29sb3InLCAnbGlnaHRncmV5JylcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuZGl2Lm9uKCdtb3VzZW91dCcsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ2JhY2tncm91bmQtY29sb3InLCAnI2ZmZmZmZicpXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgLy9zZXQgcG9zaXRpb25cclxuICAgICAgICBpZiAob3B0cy54KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ2xlZnQnLCBvcHRzLnggKyAncHgnKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3JpZ2h0JywgJzEwcHgnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3B0cy55KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3RvcCcsIG9wdHMueSArICdweCcpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zdHlsZSgndG9wJywgJzkwcHgnKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrRnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbikge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlRnVsbHNjcmVlbih0aGlzLm1hcC5jb250YWluZXIpXHJcbiAgICAgICAgICAgIC8vcmVzaXplIGNhbnZhcyB0byBkZWZhdWx0XHJcbiAgICAgICAgICAgIHRoaXMubWFwLmggPSB0aGlzLmRlZmF1bHRIZWlnaHRcclxuICAgICAgICAgICAgdGhpcy5tYXAudyA9IHRoaXMuZGVmYXVsdFdpZHRoXHJcbiAgICAgICAgICAgIHRoaXMubWFwLmdlb0NhbnZhcy5oID0gdGhpcy5kZWZhdWx0SGVpZ2h0XHJcbiAgICAgICAgICAgIHRoaXMubWFwLmdlb0NhbnZhcy53ID0gdGhpcy5kZWZhdWx0V2lkdGhcclxuICAgICAgICAgICAgdGhpcy5tYXAuZ2VvQ2FudmFzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJycgKyB0aGlzLmRlZmF1bHRXaWR0aClcclxuICAgICAgICAgICAgdGhpcy5tYXAuZ2VvQ2FudmFzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5kZWZhdWx0SGVpZ2h0KVxyXG4gICAgICAgICAgICB0aGlzLm1hcC5yZWRyYXcoKVxyXG4gICAgICAgICAgICB0aGlzLmlzRnVsbHNjcmVlbiA9IGZhbHNlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5vcGVuRnVsbHNjcmVlbih0aGlzLm1hcC5jb250YWluZXIpXHJcbiAgICAgICAgICAgIC8vcmVzaXplIGNhbnZhcyB0byBmdWxsc2NyZWVuXHJcbiAgICAgICAgICAgIHRoaXMubWFwLmggPSB3aW5kb3cuc2NyZWVuLmhlaWdodFxyXG4gICAgICAgICAgICB0aGlzLm1hcC53ID0gd2luZG93LnNjcmVlbi53aWR0aFxyXG4gICAgICAgICAgICB0aGlzLmlzRnVsbHNjcmVlbiA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyogT3BlbiBmdWxsc2NyZWVuICovXHJcbiAgICBvcGVuRnVsbHNjcmVlbihlbGVtKSB7XHJcbiAgICAgICAgaWYgKGVsZW0ucmVxdWVzdEZ1bGxzY3JlZW4pIHtcclxuICAgICAgICAgICAgZWxlbS5yZXF1ZXN0RnVsbHNjcmVlbigpXHJcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKSB7XHJcbiAgICAgICAgICAgIC8qIFNhZmFyaSAqL1xyXG4gICAgICAgICAgICBlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKClcclxuICAgICAgICB9IGVsc2UgaWYgKGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xyXG4gICAgICAgICAgICAvKiBJRTExICovXHJcbiAgICAgICAgICAgIGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbigpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qIENsb3NlIGZ1bGxzY3JlZW4gKi9cclxuICAgIGNsb3NlRnVsbHNjcmVlbigpIHtcclxuICAgICAgICBpZiAoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pIHtcclxuICAgICAgICAgICAgLyogU2FmYXJpICovXHJcbiAgICAgICAgICAgIGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKClcclxuICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pIHtcclxuICAgICAgICAgICAgLyogSUUxMSAqL1xyXG4gICAgICAgICAgICBkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnLi9CdXR0b24uanMnXHJcblxyXG4vKipcclxuICogQnV0dG9uIGZvciB0b2dnbGluZyBmdWxsc2NyZWVuIG1vZGVcclxuICpcclxuICogQG1vZHVsZSBidXR0b25cclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFpvb21CdXR0b25zIGV4dGVuZHMgQnV0dG9uIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcblxyXG4gICAgICAgIHRoaXMub25ab29tID0gb3B0cy5vblpvb20gLy8gY3VzdG9tIHVzZXIgZXZlbnQgaGFuZGxlclxyXG4gICAgICAgIHRoaXMuZGVsdGEgPSBvcHRzLmRlbHRhIHx8IDAuMlxyXG5cclxuICAgICAgICAvLyB6b29tIGluIGJ0blxyXG4gICAgICAgIHRoaXMuem9vbUluQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXHJcbiAgICAgICAgdGhpcy56b29tSW5CdG4uaW5uZXJIVE1MID0gYDxhIGlkPVwiem9vbWluXCIgY2xhc3M9XCJncmlkdml6LXpvb20tYnV0dG9uXCIgdGl0bGU9XCJab29tIGluXCI+KzwvYT5gXHJcbiAgICAgICAgdGhpcy56b29tSW5CdG4udGl0bGUgPSAnWm9vbSBpbidcclxuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuem9vbUluKGUpXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnpvb21JbkJ0bi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnbGlnaHRncmV5J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy56b29tSW5CdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnpvb21JbkJ0bi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZmZmZidcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAvLyB6b29tIG91dCBidG5cclxuICAgICAgICB0aGlzLnpvb21PdXRCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcclxuICAgICAgICB0aGlzLnpvb21PdXRCdG4uaW5uZXJIVE1MID0gYDxhIGlkPVwiem9vbWluXCIgY2xhc3M9XCJncmlkdml6LXpvb20tYnV0dG9uXCIgdGl0bGU9XCJab29tIG91dFwiPi08L2E+YFxyXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi50aXRsZSA9ICdab29tIG91dCdcclxuICAgICAgICB0aGlzLnpvb21PdXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnpvb21PdXQoZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnpvb21PdXRCdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ2xpZ2h0Z3JleSdcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuem9vbU91dEJ0bi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZmZmZidcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAvL3NldCBzdHlsZXNcclxuICAgICAgICBsZXQgYnRucyA9IFt0aGlzLnpvb21JbkJ0biwgdGhpcy56b29tT3V0QnRuXVxyXG4gICAgICAgIGJ0bnMuZm9yRWFjaCgoYnRuLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5hbGlnbkl0ZW1zID0gJ2NlbnRlcidcclxuICAgICAgICAgICAgYnRuLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gJ2NlbnRlcidcclxuICAgICAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAgICAgICAgICAgYnRuLnN0eWxlLmJvcmRlciA9ICdub25lJ1xyXG4gICAgICAgICAgICBidG4uc3R5bGUuY29sb3IgPSAnYmxhY2snXHJcbiAgICAgICAgICAgIGJ0bi5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJ1xyXG4gICAgICAgICAgICBidG4uc3R5bGUudGV4dERlY29yYXRpb24gPSAnbm9uZSdcclxuICAgICAgICAgICAgYnRuLnN0eWxlLnBhZGRpbmcgPSAnNHB4J1xyXG4gICAgICAgICAgICBidG4uc3R5bGUuZm9udFNpemUgPSAnMjBweCdcclxuICAgICAgICAgICAgYnRuLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCdcclxuICAgICAgICAgICAgYnRuLnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSdcclxuICAgICAgICAgICAgaWYgKGkgPT0gMCkgYnRuLnN0eWxlLmJvcmRlckJvdHRvbSA9ICcxcHggc29saWQgZ3JleSdcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAvLyB1bnNldCBwYXJlbnQgY2xhc3MgaGVpZ2h0IGFuZCBkaXNwbGF5IGZvciBkdWFsIGJ1dHRvbnNcclxuICAgICAgICB0aGlzLnN0eWxlKCdoZWlnaHQnLCAndW5zZXQnKVxyXG4gICAgICAgIHRoaXMuc3R5bGUoJ2Rpc3BsYXknLCAndW5zZXQnKVxyXG5cclxuICAgICAgICAvL3NldCBwb3NpdGlvblxyXG4gICAgICAgIGlmIChvcHRzLngpIHtcclxuICAgICAgICAgICAgdGhpcy5zdHlsZSgnbGVmdCcsIG9wdHMueCArICdweCcpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zdHlsZSgncmlnaHQnLCAnMTBweCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcHRzLnkpIHtcclxuICAgICAgICAgICAgdGhpcy5zdHlsZSgndG9wJywgb3B0cy55ICsgJ3B4JylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN0eWxlKCd0b3AnLCAnMTBweCcpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhcHBlbmQgdG8gYnV0dG9uIGNvbnRhaW5lclxyXG4gICAgICAgIHRoaXMuZGl2Lm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLnpvb21JbkJ0bilcclxuICAgICAgICB0aGlzLmRpdi5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy56b29tT3V0QnRuKVxyXG4gICAgfVxyXG5cclxuICAgIC8qIFpvb20gaW4gKi9cclxuICAgIHpvb21JbihlKSB7XHJcbiAgICAgICAgdGhpcy5tYXAuc2V0Wm9vbSh0aGlzLm1hcC5nZXRab29tKCkgKiAoMSAtIHRoaXMuZGVsdGEpKS5yZWRyYXcoKVxyXG4gICAgICAgIGlmICh0aGlzLm9uWm9vbSkgdGhpcy5vblpvb20oZSlcclxuICAgIH1cclxuXHJcbiAgICAvKiBab29tIG91dCAqL1xyXG4gICAgem9vbU91dChlKSB7XHJcbiAgICAgICAgdGhpcy5tYXAuc2V0Wm9vbSh0aGlzLm1hcC5nZXRab29tKCkgKiAoMSArIHRoaXMuZGVsdGEpKS5yZWRyYXcoKVxyXG4gICAgICAgIGlmICh0aGlzLm9uWm9vbSkgdGhpcy5vblpvb20oZSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8qKlxyXG4gKiBBIGdyaWQgY2VsbC5cclxuICogQHR5cGVkZWYge3t4OiBudW1iZXIsIHk6IG51bWJlcn19IENlbGwgKi9cclxuXHJcbi8qKlxyXG4gKiBBIGRhdGFzZXQgY29tcG9uZW50LCBvZiBncmlkIGNlbGxzLlxyXG4gKiBAYWJzdHJhY3RcclxuICpcclxuICogQG1vZHVsZSBjb3JlXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBEYXRhc2V0IHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL01hcC5qc1wiKS5NYXB9IG1hcCBUaGUgbWFwLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhc2V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiwgaW4gdGhlIENSUyBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OmZ1bmN0aW9uKENlbGwpOmJvb2xlYW4sIG1peGVkUmVzb2x1dGlvbj86ZnVuY3Rpb24oQ2VsbCk6bnVtYmVyfX0gb3B0c1xyXG4gICAgICogQGFic3RyYWN0XHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1hcCwgdXJsLCByZXNvbHV0aW9uLCBvcHRzID0ge30pIHtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1hcC5cclxuICAgICAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgICAgICogQHR5cGUge2ltcG9ydChcIi4vTWFwLmpzXCIpLk1hcH0gKi9cclxuICAgICAgICB0aGlzLm1hcCA9IG1hcFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdXJsIG9mIHRoZSBkYXRhc2V0LlxyXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMudXJsID0gdXJsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXHJcbiAgICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gcmVzb2x1dGlvblxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAqIEluIGNhc2UgdGhlIGRhdGFzZXQgaXMgYSBkYXRhc2V0IHdpdGggY2VsbHMgaGF2aW5nIGRpZmZlcmVudCByZXNvbHV0aW9uLFxyXG4gICAgICAgICogdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSByZXNvbHV0aW9uIG9mIGVhY2ggY2VsbC5cclxuICAgICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAgICAqIEB0eXBlIHsoZnVuY3Rpb24oQ2VsbCk6bnVtYmVyICl8IHVuZGVmaW5lZCB9ICovXHJcbiAgICAgICAgdGhpcy5taXhlZFJlc29sdXRpb24gPSBvcHRzLm1peGVkUmVzb2x1dGlvblxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggY2VsbCBhZnRlciBsb2FkaW5nLiBJdCBjYW4gYmUgdXNlZCB0byBhcHBseSBzb21lIHNwZWNpZmljIHRyZWF0bWVudCBiZWZvcmUgb3IgY29tcHV0ZSBhIG5ldyBjb2x1bW4uIEFuZCBhbHNvIHRvIGRldGVybWluZSB3aGljaCBjZWxscyB0byBrZWVwIGFmdGVyIGxvYWRpbmcuXHJcbiAgICAgICAgICogQHR5cGUgeyhmdW5jdGlvbihDZWxsKTpib29sZWFuICl8IHVuZGVmaW5lZCB9ICovXHJcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzIHx8IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvKiogVGhlIGNlbGxzIHdpdGhpbiB0aGUgdmlld1xyXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPENlbGw+fSAqL1xyXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVxdWVzdCBkYXRhIHdpdGhpbiBhIGdlb2dyYXBoaWMgZW52ZWxvcGUuXHJcbiAgICAgKlxyXG4gICAgICogQGFic3RyYWN0XHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gZXh0R2VvXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgZ2V0RGF0YShleHRHZW8gPSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBnZXREYXRhIG5vdCBpbXBsZW1lbnRlZC4nKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlsbCB0aGUgdmlldyBjYWNoZSB3aXRoIGFsbCBjZWxscyB3aGljaCBhcmUgd2l0aGluIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxyXG4gICAgICogQGFic3RyYWN0XHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkVudmVsb3BlfSBleHRHZW8gVGhlIHZpZXcgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZpZXdDYWNoZShleHRHZW8pIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCB1cGRhdGVWaWV3Q2FjaGUgbm90IGltcGxlbWVudGVkLicpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBjZWxsIHVuZGVyIGEgZ2l2ZW4gcG9zaXRpb24sIGlmIGFueS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IHBvc0dlb1xyXG4gICAgICogQHBhcmFtIHtBcnJheS48Q2VsbD59IGNlbGxzIFNvbWUgY2VsbHMgZnJvbSB0aGUgZGF0YXNldCAoYSBzdWJzZXQgaWYgbmVjZXNzYXJ5LCB1c3VhbGx5IHRoZSB2aWV3IGNhY2hlKS5cclxuICAgICAqIEByZXR1cm5zIHtDZWxsfHVuZGVmaW5lZH1cclxuICAgICAqL1xyXG4gICAgZ2V0Q2VsbEZyb21Qb3NpdGlvbihwb3NHZW8sIGNlbGxzKSB7XHJcbiAgICAgICAgLy9jb21wdXRlIGNhbmRpZGF0ZSBjZWxsIHBvc2l0aW9uXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgLy9jb25zdCByID0gdGhpcy5nZXRSZXNvbHV0aW9uKClcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAvL2NvbnN0IGNlbGxYID0gciAqIE1hdGguZmxvb3IocG9zR2VvLnggLyByKVxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIC8vY29uc3QgY2VsbFkgPSByICogTWF0aC5mbG9vcihwb3NHZW8ueSAvIHIpXHJcblxyXG4gICAgICAgIC8qL2dldCBjZWxsXHJcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIGlmIChjZWxsLnggIT0gY2VsbFgpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGlmIChjZWxsLnkgIT0gY2VsbFkpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIHJldHVybiBjZWxsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQqL1xyXG5cclxuICAgICAgICAvL3JhcmUgY2FzZSBvZiBtaXhlZCByZXNvbHV0aW9uIGRhdGFzZXRcclxuICAgICAgICBpZiAodGhpcy5taXhlZFJlc29sdXRpb24pIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSArdGhpcy5taXhlZFJlc29sdXRpb24oYylcclxuICAgICAgICAgICAgICAgIGlmIChwb3NHZW8ueCA8IGMueCkgY29udGludWVcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMueCArIHIgPCBwb3NHZW8ueCkgY29udGludWVcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvc0dlby55IDwgYy55KSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYy55ICsgciA8IHBvc0dlby55KSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gY1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vY29tbW9uIGNhc2VcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgY29uc3QgciA9IHRoaXMuZ2V0UmVzb2x1dGlvbigpXHJcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIGlmIChwb3NHZW8ueCA8IGNlbGwueCkgY29udGludWVcclxuICAgICAgICAgICAgZWxzZSBpZiAoY2VsbC54ICsgciA8IHBvc0dlby54KSBjb250aW51ZVxyXG4gICAgICAgICAgICBlbHNlIGlmIChwb3NHZW8ueSA8IGNlbGwueSkgY29udGludWVcclxuICAgICAgICAgICAgZWxzZSBpZiAoY2VsbC55ICsgciA8IHBvc0dlby55KSBjb250aW51ZVxyXG4gICAgICAgICAgICBlbHNlIHJldHVybiBjZWxsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9nZXR0ZXJzIGFuZCBzZXR0ZXJzXHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXHJcbiAgICBnZXRSZXNvbHV0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdXRpb25cclxuICAgIH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge0FycmF5LjxDZWxsPn0gKi9cclxuICAgIGdldFZpZXdDYWNoZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jZWxsc1ZpZXdDYWNoZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSByZWxldmFudCBkYXRhc2V0IGZvciBhIHNwZWNpZmllZCB6b29tLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5QaXhlbHNQZXJDZWxsXHJcbiAgICAgKiBAcmV0dXJucyB7RGF0YXNldHx1bmRlZmluZWR9XHJcbiAgICAgKiAqL1xyXG4gICAgZ2V0RGF0YXNldCh6LCBtaW5QaXhlbHNQZXJDZWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKipcclxuICogVGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyB1c2VkIHRvIGdyb3VwIGVsZW1lbnRzIHNoYXJlZCBiZXR3ZWVuIExheWVyIGFuZCBTdHlsZSBjbGFzc2VzLlxyXG4gKiBcclxuICogQGFic3RyYWN0XHJcbiAqIEBtb2R1bGUgY29yZVxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRHJhd2FibGUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gc3BlY2lmeWluZyBpZiB0aGUgZWxlbWVudCBzaG91bGQgYmUgdmlzaWJsZSBvciBub3QuXHJcbiAgICAgICAgICogVGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyB0aGUgem9vbSBsZXZlbC5cclxuICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIpOmJvb2xlYW59ICovXHJcbiAgICAgICAgdGhpcy52aXNpYmxlID0gb3B0cy52aXNpYmxlXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgYWxwaGEgKHRyYW5zcGFyZW5jeS9vcGFjaXR5KSwgYmV0d2VlbiAwLjAgKGZ1bGx5IHRyYW5zcGFyZW50KSBhbmQgMS4wIChmdWxseSBvcGFxdWUpLlxyXG4gICAgICAgICAqICBUaGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHRoZSB6b29tIGxldmVsLlxyXG4gICAgICAgICAqIChzZWUgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOiBnbG9iYWxBbHBoYSBwcm9wZXJ0eSlcclxuICAgICAgICAgKiBAdHlwZSB7KGZ1bmN0aW9uKG51bWJlcik6bnVtYmVyKXx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgdGhpcy5hbHBoYSA9IG9wdHMuYWxwaGFcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBibGVuZCBvcGVyYXRpb24uXHJcbiAgICAgICAgICogVGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyB0aGUgem9vbSBsZXZlbC5cclxuICAgICAgICAgKiAoc2VlIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDogZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIHByb3BlcnR5KVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIpOkdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbn0gKi9cclxuICAgICAgICB0aGlzLmJsZW5kT3BlcmF0aW9uID0gb3B0cy5ibGVuZE9wZXJhdGlvbiB8fCAoeiA9PiBcInNvdXJjZS1vdmVyXCIpXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKG51bWJlcik6c3RyaW5nKXx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgdGhpcy5maWx0ZXJDb2xvciA9IG9wdHMuZmlsdGVyQ29sb3IgLy8gKHopID0+IFwiI2VlZTdcIlxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBsYXllciBmaWx0ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICogQGFic3RyYWN0XHJcbiAgICAgKi9cclxuICAgIGRyYXdGaWx0ZXIoZ2VvQ2FudmFzKSB7XHJcbiAgICAgICAgLy9ubyBmaWx0ZXI6IHJldHVyblxyXG4gICAgICAgIGlmICghdGhpcy5maWx0ZXJDb2xvcikgcmV0dXJuXHJcblxyXG4gICAgICAgIC8vZ2V0IGZpbHRlclxyXG4gICAgICAgIGNvbnN0IGZjID0gdGhpcy5maWx0ZXJDb2xvcihnZW9DYW52YXMudmlldy56KVxyXG5cclxuICAgICAgICAvL25vIGZpbHRlcjogcmV0dXJuXHJcbiAgICAgICAgaWYgKCFmYyB8fCBmYyA9PSAnbm9uZScpIHJldHVyblxyXG5cclxuICAgICAgICAvL2RyYXcgZmlsdGVyXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBmY1xyXG4gICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoMCwgMCwgZ2VvQ2FudmFzLncsIGdlb0NhbnZhcy5oKVxyXG4gICAgfVxyXG5cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8qKiBAdHlwZWRlZiB7IHt4TWluOiBudW1iZXIsIHhNYXg6IG51bWJlciwgeU1pbjogbnVtYmVyLCB5TWF4OiBudW1iZXJ9IH0gRW52ZWxvcGUgKi9cclxuXHJcbi8qKlxyXG4gKiBBIHZpZXdzaGVkLlxyXG4gKiBAdHlwZWRlZiB7e3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9fSBWaWV3ICovXHJcblxyXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXHJcbmltcG9ydCB7IHpvb20gYXMgZDN6b29tLCB6b29tSWRlbnRpdHkgfSBmcm9tICdkMy16b29tJ1xyXG5cclxuLyoqXHJcbiAqIEEgSFRNTCBjYW52YXMgZm9yIGdlbyBkYXRhIGRpc3BsYXksIGVuaGFuY2VkIHdpdGggem9vbSBhbmQgcGFuIGNhcGFiaWxpdGllcy5cclxuICpcclxuICogQG1vZHVsZSBjb3JlXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHZW9DYW52YXMge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY29uc3RydWN0b3JcclxuICAgICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdmlld1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdmlld1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHogVGhlIHpvb20gbGV2ZWwgb2YgdGhlIHZpZXcgKHBpeGVsIHNpemUsIGluIGdyb3VuZCBtKVxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoY2FudmFzLCB4ID0gMCwgeSA9IDAsIHogPSAwLCBvcHRzID0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogQHR5cGUge0hUTUxDYW52YXNFbGVtZW50fSAqL1xyXG4gICAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMudyA9IHRoaXMuY2FudmFzLm9mZnNldFdpZHRoXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5oID0gdGhpcy5jYW52YXMub2Zmc2V0SGVpZ2h0XHJcblxyXG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy53XHJcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdGhpcy5oXHJcblxyXG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJylcclxuICAgICAgICBpZiAoIWN0eCkgdGhyb3cgJ0ltcG9zc2libGUgdG8gY3JlYXRlIGNhbnZhcyAyRCBjb250ZXh0J1xyXG4gICAgICAgIC8qKkB0eXBlIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9ICovXHJcbiAgICAgICAgdGhpcy5jdHggPSBjdHhcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogejogcGl4ZWwgc2l6ZSwgaW4gbS9waXhcclxuICAgICAgICAgKiBAdHlwZSB7Vmlld30gICovXHJcbiAgICAgICAgdGhpcy52aWV3ID0geyB4OiB4LCB5OiB5LCB6OiB6IH1cclxuXHJcbiAgICAgICAgLyoqIEJhY2tncm91bmQgY29sb3IuXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IG9wdHMuYmFja2dyb3VuZENvbG9yIHx8ICd3aGl0ZSdcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihvYmplY3R8dW5kZWZpbmVkKTp2b2lkfSAqL1xyXG4gICAgICAgIHRoaXMub25ab29tU3RhcnRGdW4gPSBvcHRzLm9uWm9vbVN0YXJ0RnVuXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0fHVuZGVmaW5lZCk6dm9pZH0gKi9cclxuICAgICAgICB0aGlzLm9uWm9vbUVuZEZ1biA9IG9wdHMub25ab29tRW5kRnVuXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0fHVuZGVmaW5lZCk6dm9pZH0gKi9cclxuICAgICAgICB0aGlzLm9uWm9vbUZ1biA9IG9wdHMub25ab29tRnVuXHJcblxyXG4gICAgICAgIC8vY3VycmVudCBleHRlbnRcclxuICAgICAgICAvKiogQHR5cGUge0VudmVsb3BlfSAqL1xyXG4gICAgICAgIHRoaXMuZXh0R2VvID0geyB4TWluOiBOYU4sIHhNYXg6IE5hTiwgeU1pbjogTmFOLCB5TWF4OiBOYU4gfVxyXG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcclxuXHJcbiAgICAgICAgLy9yZWx5IG9uIGQzIHpvb20gZm9yIHBhbi96b29tXHJcbiAgICAgICAgaWYgKCFvcHRzLmRpc2FibGVab29tKSB7XHJcbiAgICAgICAgICAgIGxldCB0UCA9IHpvb21JZGVudGl0eVxyXG4gICAgICAgICAgICBjb25zdCB6ID0gZDN6b29tKClcclxuICAgICAgICAgICAgICAgIC8vdG8gbWFrZSB0aGUgem9vbWluZyBhIGJpdCBmYXN0ZXJcclxuICAgICAgICAgICAgICAgIC53aGVlbERlbHRhKChlKSA9PiAtZS5kZWx0YVkgKiAoZS5kZWx0YU1vZGUgPT09IDEgPyAwLjA3IDogZS5kZWx0YU1vZGUgPyAxIDogMC4wMDQpKVxyXG4gICAgICAgICAgICAgICAgLm9uKCd6b29tJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gZS50cmFuc2Zvcm1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmID0gdFAuayAvIHQua1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9wYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHggPSB0UC54IC0gdC54XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5ID0gdFAueSAtIHQueVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhbihkeCAqIHRoaXMudmlldy56LCAtZHkgKiB0aGlzLnZpZXcueilcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZSA9IGUuc291cmNlRXZlbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlIGluc3RhbmNlb2YgV2hlZWxFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy96b29tIGF0IHRoZSBtb3VzZSBwb3NpdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waXhUb0dlb1goZS5zb3VyY2VFdmVudC5vZmZzZXRYKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpeFRvR2VvWShlLnNvdXJjZUV2ZW50Lm9mZnNldFkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2UgaW5zdGFuY2VvZiBUb3VjaEV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlLnRhcmdldFRvdWNoZXMubGVuZ3RoKSByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSB0b3VjaGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHggPSAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5ID0gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdHQgb2Ygc2UudGFyZ2V0VG91Y2hlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4ICs9IHR0LmNsaWVudFhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSArPSB0dC5jbGllbnRZXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCAvPSBzZS50YXJnZXRUb3VjaGVzLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgLz0gc2UudGFyZ2V0VG91Y2hlcy5sZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vem9vbSBhdCB0aGlzIGF2ZXJhZ2UgcG9zaXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbShmLCB0aGlzLnBpeFRvR2VvWCh0eCksIHRoaXMucGl4VG9HZW9ZKHR5KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0UCA9IHRcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25ab29tRnVuKSB0aGlzLm9uWm9vbUZ1bihlKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5vbignc3RhcnQnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJycgKyB0aGlzLncpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuaClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYy5nZXRDb250ZXh0KCcyZCcpPy5kcmF3SW1hZ2UodGhpcy5jYW52YXMsIDAsIDApXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4ID0gMFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSA9IDBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiA9IDFcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25ab29tU3RhcnRGdW4pIHRoaXMub25ab29tU3RhcnRGdW4oZSlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAub24oJ2VuZCcsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IHsgYzogbnVsbCwgZHg6IDAsIGR5OiAwLCBmOiAxIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25ab29tRW5kRnVuKSB0aGlzLm9uWm9vbUVuZEZ1bihlKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgeihzZWxlY3QodGhpcy5jYW52YXMpKVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL3NlbGVjdCh0aGlzLmNhbnZhcykuY2FsbCh6KTtcclxuXHJcbiAgICAgICAgLy9jZW50ZXIgZXh0ZW50XHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMueE1pbiA9IG9wdHMuY2VudGVyRXh0ZW50ID8gb3B0cy5jZW50ZXJFeHRlbnRbMF0gOiB1bmRlZmluZWRcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgdGhpcy55TWluID0gb3B0cy5jZW50ZXJFeHRlbnQgPyBvcHRzLmNlbnRlckV4dGVudFsxXSA6IHVuZGVmaW5lZFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLnhNYXggPSBvcHRzLmNlbnRlckV4dGVudCA/IG9wdHMuY2VudGVyRXh0ZW50WzJdIDogdW5kZWZpbmVkXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMueU1heCA9IG9wdHMuY2VudGVyRXh0ZW50ID8gb3B0cy5jZW50ZXJFeHRlbnRbM10gOiB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLyoqIFpvb20gZXh0ZW50LCB0byBsaW1pdCB6b29tIGluIGFuZCBvdXRcclxuICAgICAgICAgKiAgQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xyXG4gICAgICAgIHRoaXMuem9vbUV4dGVudCA9IG9wdHMuem9vbUV4dGVudCB8fCBbMCwgSW5maW5pdHldXHJcblxyXG4gICAgICAgIC8qKiBDYW52YXMgc3RhdGUsIHRvIGJlIHVzZWQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVkcmF3cyBvbiB6b29tL3BhblxyXG4gICAgICAgICAqICBAdHlwZSB7e2M6SFRNTENhbnZhc0VsZW1lbnR8bnVsbCxkeDpudW1iZXIsZHk6bnVtYmVyLGY6bnVtYmVyfX0gKi9cclxuICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSB7IGM6IG51bGwsIGR4OiAwLCBkeTogMCwgZjogMSB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtWaWV3fSAqL1xyXG4gICAgZ2V0VmlldygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52aWV3XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHYgKi9cclxuICAgIHNldENlbnRlckV4dGVudCh2KSB7XHJcbiAgICAgICAgdGhpcy54TWluID0gdlswXVxyXG4gICAgICAgIHRoaXMueU1pbiA9IHZbMV1cclxuICAgICAgICB0aGlzLnhNYXggPSB2WzJdXHJcbiAgICAgICAgdGhpcy55TWF4ID0gdlszXVxyXG4gICAgfVxyXG4gICAgLyoqIEByZXR1cm5zIHtBcnJheS48bnVtYmVyfHVuZGVmaW5lZD59ICovXHJcbiAgICBnZXRDZW50ZXJFeHRlbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFt0aGlzLnhNaW4sIHRoaXMueU1pbiwgdGhpcy54TWF4LCB0aGlzLnlNYXhdXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHYgKi9cclxuICAgIHNldFpvb21FeHRlbnQodikge1xyXG4gICAgICAgIHRoaXMuem9vbUV4dGVudCA9IHZcclxuICAgIH1cclxuICAgIC8qKiBAcmV0dXJucyB7QXJyYXkuPG51bWJlcj59ICovXHJcbiAgICBnZXRab29tRXh0ZW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnpvb21FeHRlbnRcclxuICAgIH1cclxuXHJcbiAgICAvKiogSW5pdGlhbGlzZSBjYW52YXMgdHJhbnNmb3JtIHdpdGggaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24uICovXHJcbiAgICBpbml0Q2FudmFzVHJhbnNmb3JtKCkge1xyXG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBJbml0aWFsaXNlIGNhbnZhcyB0cmFuc2Zvcm0gd2l0aCBnZW8gdG8gc2NyZWVuIHRyYW5zZm9ybWF0aW9uLCBzbyB0aGF0IGdlbyBvYmplY3RzIGNhbiBiZSBkcmF3biBkaXJlY3RseSBpbiBnZW8gY29vcmRpbmF0ZXMuICovXHJcbiAgICBzZXRDYW52YXNUcmFuc2Zvcm0oKSB7XHJcbiAgICAgICAgY29uc3QgayA9IDEgLyB0aGlzLnZpZXcuelxyXG4gICAgICAgIGNvbnN0IHR4ID0gLXRoaXMudmlldy54IC8gdGhpcy52aWV3LnogKyB0aGlzLncgKiAwLjVcclxuICAgICAgICBjb25zdCB0eSA9IHRoaXMudmlldy55IC8gdGhpcy52aWV3LnogKyB0aGlzLmggKiAwLjVcclxuICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oaywgMCwgMCwgLWssIHR4LCB0eSlcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gd2ViR0wgc2NyZWVuIGNvb3JkaW5hdGVzLCB3aXRoaW4gWy0xLDFdKlstMSwxXSAqL1xyXG4gICAgZ2V0V2ViR0xUcmFuc2Zvcm0oKSB7XHJcbiAgICAgICAgY29uc3Qga3ggPSAyLjAgLyAodGhpcy53ICogdGhpcy52aWV3LnopXHJcbiAgICAgICAgY29uc3Qga3kgPSAyLjAgLyAodGhpcy5oICogdGhpcy52aWV3LnopXHJcbiAgICAgICAgcmV0dXJuIFtreCwgMC4wLCAwLjAsIDAuMCwga3ksIDAuMCwgLWt4ICogdGhpcy52aWV3LngsIC1reSAqIHRoaXMudmlldy55LCAxLjBdXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGhvdyB0byBkcmF3IHRoZSBtYXAuICovXHJcbiAgICByZWRyYXcoKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgcmVkcmF3IG5vdCBpbXBsZW1lbnRlZC4nKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXIuIFRvIGJlIHVzZWQgYmVmb3JlIGEgcmVkcmF3IGZvciBleGFtcGxlLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yXHJcbiAgICAgKi9cclxuICAgIGNsZWFyKGNvbG9yID0gJ3doaXRlJykge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdHMudHJhbnNwYXJlbnRCYWNrZ3JvdW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLncsIHRoaXMuaClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdHgpIHRoaXMuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXHJcbiAgICAgICAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHRoaXMudywgdGhpcy5oKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkeEdlb1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGR5R2VvXHJcbiAgICAgKi9cclxuICAgIHBhbihkeEdlbyA9IDAsIGR5R2VvID0gMCkge1xyXG4gICAgICAgIC8vZW5zdXJlcyB4L3kgZXh0ZW50XHJcbiAgICAgICAgaWYgKHRoaXMueE1pbiAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnggKyBkeEdlbyA8IHRoaXMueE1pbikgZHhHZW8gPSB0aGlzLnhNaW4gLSB0aGlzLnZpZXcueFxyXG4gICAgICAgIGlmICh0aGlzLnlNaW4gIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy55ICsgZHlHZW8gPCB0aGlzLnlNaW4pIGR5R2VvID0gdGhpcy55TWluIC0gdGhpcy52aWV3LnlcclxuICAgICAgICBpZiAodGhpcy54TWF4ICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueCArIGR4R2VvID4gdGhpcy54TWF4KSBkeEdlbyA9IHRoaXMueE1heCAtIHRoaXMudmlldy54XHJcbiAgICAgICAgaWYgKHRoaXMueU1heCAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnkgKyBkeUdlbyA+IHRoaXMueU1heCkgZHlHZW8gPSB0aGlzLnlNYXggLSB0aGlzLnZpZXcueVxyXG5cclxuICAgICAgICAvL3BhblxyXG4gICAgICAgIHRoaXMudmlldy54ICs9IGR4R2VvXHJcbiAgICAgICAgdGhpcy52aWV3LnkgKz0gZHlHZW9cclxuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNhbnZhc1NhdmUuYykge1xyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHggLT0gZHhHZW8gLyB0aGlzLnZpZXcuelxyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHkgKz0gZHlHZW8gLyB0aGlzLnZpZXcuelxyXG4gICAgICAgICAgICB0aGlzLmNsZWFyKHRoaXMuYmFja2dyb3VuZENvbG9yKVxyXG4gICAgICAgICAgICAvLyB0aGlzIGRvZXNudCB3b3JrIG9uIG1vYmlsZSBodHRwczovL2dpdGh1Yi5jb20vZXVyb3N0YXQvZ3JpZHZpei9pc3N1ZXMvOThcclxuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzU2F2ZS5jLCB0aGlzLmNhbnZhc1NhdmUuZHgsIHRoaXMuY2FudmFzU2F2ZS5keSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBab29tLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGYgVGhlIHpvb20gZmFjdG9yLCB3aXRoaW4gXTAsIEluZmluaXR5XS4gMSBpcyBmb3Igbm8gY2hhbmdlLiA8MSB0byB6b29tLWluLCA+MSB0byB6b29tLW91dC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4R2VvIFRoZSB4IGdlbyBwb3NpdGlvbiBmaXhlZCBpbiB0aGUgc2NyZWVuLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlHZW8gVGhlIHkgZ2VvIHBvc2l0aW9uIGZpeGVkIGluIHRoZSBzY3JlZW4uXHJcbiAgICAgKi9cclxuICAgIHpvb20oZiA9IDEsIHhHZW8gPSB0aGlzLnZpZXcueCwgeUdlbyA9IHRoaXMudmlldy55KSB7XHJcbiAgICAgICAgLy9UT0RPIGZvcmNlIGdlbyBleHRlbmQgdG8gcmVtYWluXHJcblxyXG4gICAgICAgIC8vdHJ5aW5nIHRvIHpvb20gaW4vb3V0IGJleW9uZCBsaW1pdFxyXG4gICAgICAgIGlmICh0aGlzLnpvb21FeHRlbnRbMF0gPT0gdGhpcy52aWV3LnogJiYgZiA8PSAxKSByZXR1cm5cclxuICAgICAgICBpZiAodGhpcy56b29tRXh0ZW50WzFdID09IHRoaXMudmlldy56ICYmIGYgPj0gMSkgcmV0dXJuXHJcblxyXG4gICAgICAgIC8vZW5zdXJlIHpvb20gZXh0ZW50IHByZXNlcnZlZFxyXG4gICAgICAgIGNvbnN0IG5ld1pmID0gZiAqIHRoaXMudmlldy56XHJcbiAgICAgICAgaWYgKG5ld1pmIDwgdGhpcy56b29tRXh0ZW50WzBdKSBmID0gdGhpcy56b29tRXh0ZW50WzBdIC8gdGhpcy52aWV3LnpcclxuICAgICAgICBpZiAobmV3WmYgPiB0aGlzLnpvb21FeHRlbnRbMV0pIGYgPSB0aGlzLnpvb21FeHRlbnRbMV0gLyB0aGlzLnZpZXcuelxyXG5cclxuICAgICAgICB0aGlzLnZpZXcueiAqPSBmXHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBwYW5cclxuICAgICAgICBsZXQgZHhHZW8gPSAoeEdlbyAtIHRoaXMudmlldy54KSAqICgxIC0gZilcclxuICAgICAgICBsZXQgZHlHZW8gPSAoeUdlbyAtIHRoaXMudmlldy55KSAqICgxIC0gZilcclxuXHJcbiAgICAgICAgLy9lbnN1cmVzIHgveSBleHRlbnRcclxuICAgICAgICBpZiAodGhpcy54TWluICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueCArIGR4R2VvIDwgdGhpcy54TWluKSBkeEdlbyA9IHRoaXMueE1pbiAtIHRoaXMudmlldy54XHJcbiAgICAgICAgaWYgKHRoaXMueU1pbiAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnkgKyBkeUdlbyA8IHRoaXMueU1pbikgZHlHZW8gPSB0aGlzLnlNaW4gLSB0aGlzLnZpZXcueVxyXG4gICAgICAgIGlmICh0aGlzLnhNYXggIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy54ICsgZHhHZW8gPiB0aGlzLnhNYXgpIGR4R2VvID0gdGhpcy54TWF4IC0gdGhpcy52aWV3LnhcclxuICAgICAgICBpZiAodGhpcy55TWF4ICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueSArIGR5R2VvID4gdGhpcy55TWF4KSBkeUdlbyA9IHRoaXMueU1heCAtIHRoaXMudmlldy55XHJcblxyXG4gICAgICAgIC8vcGFuXHJcbiAgICAgICAgdGhpcy52aWV3LnggKz0gZHhHZW9cclxuICAgICAgICB0aGlzLnZpZXcueSArPSBkeUdlb1xyXG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzU2F2ZS5jKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXIodGhpcy5iYWNrZ3JvdW5kQ29sb3IpXHJcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5mIC89IGZcclxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4ID0gdGhpcy5nZW9Ub1BpeFgoeEdlbykgKiAoMSAtIHRoaXMuY2FudmFzU2F2ZS5mKVxyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHkgPSB0aGlzLmdlb1RvUGl4WSh5R2VvKSAqICgxIC0gdGhpcy5jYW52YXNTYXZlLmYpXHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXIodGhpcy5iYWNrZ3JvdW5kQ29sb3IpXHJcbiAgICAgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZShcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4LFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5LFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgKiB0aGlzLmNhbnZhc1NhdmUuYy53aWR0aCxcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5mICogdGhpcy5jYW52YXNTYXZlLmMuaGVpZ2h0XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWFyZ2luUHhcclxuICAgICAqIEByZXR1cm5zIHtFbnZlbG9wZX0gVGhlIGVudmVsb3BlIG9mIHRoZSB2aWV3LCBpbiBnZW8gY29vcmRpbmF0ZXMuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUV4dGVudEdlbyhtYXJnaW5QeCA9IDIwKSB7XHJcbiAgICAgICAgdGhpcy5leHRHZW8gPSB7XHJcbiAgICAgICAgICAgIHhNaW46IHRoaXMucGl4VG9HZW9YKC1tYXJnaW5QeCksXHJcbiAgICAgICAgICAgIHhNYXg6IHRoaXMucGl4VG9HZW9YKHRoaXMudyArIG1hcmdpblB4KSxcclxuICAgICAgICAgICAgeU1pbjogdGhpcy5waXhUb0dlb1kodGhpcy5oICsgbWFyZ2luUHgpLFxyXG4gICAgICAgICAgICB5TWF4OiB0aGlzLnBpeFRvR2VvWSgtbWFyZ2luUHgpLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5leHRHZW9cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrIGlmIHRoZSBvYmplY3QgaGFzIHRvIGJlIGRyYXduXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSBvYmpcclxuICAgICAqL1xyXG4gICAgdG9EcmF3KG9iaikge1xyXG4gICAgICAgIGlmIChvYmoueCA8IHRoaXMuZXh0R2VvLnhNaW4pIHJldHVybiBmYWxzZVxyXG4gICAgICAgIGlmIChvYmoueCA+IHRoaXMuZXh0R2VvLnhNYXgpIHJldHVybiBmYWxzZVxyXG4gICAgICAgIGlmIChvYmoueSA8IHRoaXMuZXh0R2VvLnlNaW4pIHJldHVybiBmYWxzZVxyXG4gICAgICAgIGlmIChvYmoueSA+IHRoaXMuZXh0R2VvLnlNYXgpIHJldHVybiBmYWxzZVxyXG4gICAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgLy9jb252ZXJzaW9uIGZ1bmN0aW9uc1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geEdlbyBHZW8geCBjb29yZGluYXRlLCBpbiBtLlxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gU2NyZWVuIHggY29vcmRpbmF0ZSwgaW4gcGl4LlxyXG4gICAgICovXHJcbiAgICBnZW9Ub1BpeFgoeEdlbykge1xyXG4gICAgICAgIHJldHVybiAoeEdlbyAtIHRoaXMudmlldy54KSAvIHRoaXMudmlldy56ICsgdGhpcy53ICogMC41XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5R2VvIEdlbyB5IGNvb3JkaW5hdGUsIGluIG0uXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTY3JlZW4geSBjb29yZGluYXRlLCBpbiBwaXguXHJcbiAgICAgKi9cclxuICAgIGdlb1RvUGl4WSh5R2VvKSB7XHJcbiAgICAgICAgcmV0dXJuIC0oeUdlbyAtIHRoaXMudmlldy55KSAvIHRoaXMudmlldy56ICsgdGhpcy5oICogMC41XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IFNjcmVlbiB4IGNvb3JkaW5hdGUsIGluIHBpeC5cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEdlbyB4IGNvb3JkaW5hdGUsIGluIG0uXHJcbiAgICAgKi9cclxuICAgIHBpeFRvR2VvWCh4KSB7XHJcbiAgICAgICAgcmV0dXJuICh4IC0gdGhpcy53ICogMC41KSAqIHRoaXMudmlldy56ICsgdGhpcy52aWV3LnhcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgU2NyZWVuIHkgY29vcmRpbmF0ZSwgaW4gcGl4LlxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gR2VvIHkgY29vcmRpbmF0ZSwgaW4gbS5cclxuICAgICAqL1xyXG4gICAgcGl4VG9HZW9ZKHkpIHtcclxuICAgICAgICByZXR1cm4gLSh5IC0gdGhpcy5oICogMC41KSAqIHRoaXMudmlldy56ICsgdGhpcy52aWV3LnlcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IHgseSx6IGVsZW1lbnRzIGZyb20gVVJMIGFuZCBhc3NpZ24gdGhlbSB0byB0aGUgdmlldy4gKi9cclxuICAgIHNldFZpZXdGcm9tVVJMKCkge1xyXG4gICAgICAgIGNvbnN0IHggPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd4JyksXHJcbiAgICAgICAgICAgIHkgPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd5JyksXHJcbiAgICAgICAgICAgIHogPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd6JylcclxuICAgICAgICBpZiAoeCAhPSBudWxsICYmIHggIT0gdW5kZWZpbmVkICYmICFpc05hTigreCkpIHRoaXMudmlldy54ID0gK3hcclxuICAgICAgICBpZiAoeSAhPSBudWxsICYmIHkgIT0gdW5kZWZpbmVkICYmICFpc05hTigreSkpIHRoaXMudmlldy55ID0gK3lcclxuICAgICAgICBpZiAoeiAhPSBudWxsICYmIHogIT0gdW5kZWZpbmVkICYmICFpc05hTigreikpIHRoaXMudmlldy56ID0gK3pcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBhIFVSTCBwYXJhbWV0ZXIgYnkgbmFtZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxyXG4gICAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRQYXJhbWV0ZXJCeU5hbWUobmFtZSkge1xyXG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1tcXFtdLywgJ1xcXFxbJykucmVwbGFjZSgvW1xcXV0vLCAnXFxcXF0nKVxyXG4gICAgICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAoJ1tcXFxcPyZdJyArIG5hbWUgKyAnPShbXiYjXSopJyksXHJcbiAgICAgICAgICAgIHJlc3VsdHMgPSByZWdleC5leGVjKGxvY2F0aW9uLnNlYXJjaClcclxuICAgICAgICByZXR1cm4gIXJlc3VsdHMgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdHNbMV0ucmVwbGFjZSgvXFwrL2csICcgJykpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBEcmF3YWJsZSB9IGZyb20gXCIuL0RyYXdhYmxlLmpzXCJcclxuXHJcbi8qKlxyXG4gKiBAbW9kdWxlIGNvcmVcclxuICogQGFic3RyYWN0XHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBMYXllciBleHRlbmRzIERyYXdhYmxlIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgbGF5ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBsZWdlbmRcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICogQGFic3RyYWN0XHJcbiAgICAgKi9cclxuICAgIGRyYXcoZ2VvQ2FudmFzLCBsZWdlbmQgPSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBkcmF3IG5vdCBpbXBsZW1lbnRlZC4nKVxyXG4gICAgfVxyXG5cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcclxuXHJcbi8qKlxyXG4gKiBBIGxlZ2VuZCBjb250YWluZXIuXHJcbiAqXHJcbiAqIEBtb2R1bGUgY29yZVxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTGVnZW5kIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuaWQgPSBvcHRzLmlkXHJcblxyXG4gICAgICAgIC8vVE9ETyBzdG9wIHVzaW5nIGl0LiBVc2Ugc3R5bGUgbWV0aG9kIGJlbG93IGluc3RlYWQuXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xyXG4gICAgICAgIHRoaXMudG9wID0gb3B0cy50b3BcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICB0aGlzLmJvdHRvbSA9IG9wdHMuYm90dG9tXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy5sZWZ0ID0gb3B0cy5sZWZ0XHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy5yaWdodCA9IG9wdHMucmlnaHRcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBvcHRzLmJhY2tncm91bmQgfHwgJ25vbmUnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy5wYWRkaW5nID0gb3B0cy5wYWRkaW5nIHx8ICc1cHgnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy5ib3JkZXIgPSBvcHRzLmJvcmRlciB8fCAnMHB4J1xyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xyXG4gICAgICAgIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSA9IG9wdHNbJ2JvcmRlci1yYWRpdXMnXSB8fCAnbm9uZSdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICB0aGlzWydib3gtc2hhZG93J10gPSBvcHRzWydib3gtc2hhZG93J10gfHwgJ25vbmUnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpc1snZm9udC1mYW1pbHknXSA9IG9wdHNbJ2ZvbnQtZmFtaWx5J10gfHwgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgLy90aGlzLndpZHRoID0gb3B0cy53aWR0aFxyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xyXG4gICAgICAgIC8vdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodFxyXG5cclxuICAgICAgICAvL3RoZSBkaXYgZWxlbWVudFxyXG4gICAgICAgIGlmICh0aGlzLmlkKSB0aGlzLmRpdiA9IHNlbGVjdCgnIycgKyB0aGlzLmlkKVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZGl2IHx8IHRoaXMuZGl2LmVtcHR5KCkpIHtcclxuICAgICAgICAgICAgdGhpcy5kaXYgPSBzZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlkKSB0aGlzLmRpdi5hdHRyKCdpZCcsIHRoaXMuaWQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3NldCBzdHlsZVxyXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdiYWNrZ3JvdW5kJywgdGhpcy5iYWNrZ3JvdW5kKVxyXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdwYWRkaW5nJywgdGhpcy5wYWRkaW5nKVxyXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3JkZXInLCB0aGlzLmJvcmRlcilcclxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnYm9yZGVyLXJhZGl1cycsIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSlcclxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnYm94LXNoYWRvdycsIHRoaXNbJ2JveC1zaGFkb3cnXSlcclxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnZm9udC1mYW1pbHknLCB0aGlzWydmb250LWZhbWlseSddKVxyXG5cclxuICAgICAgICAvL2lmICh0aGlzLndpZHRoKSB0aGlzLmRpdi5zdHlsZSgnd2lkdGgnLCB0aGlzLndpZHRoKVxyXG4gICAgICAgIC8vaWYgKHRoaXMuaGVpZ2h0KSB0aGlzLmRpdi5zdHlsZSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQpXHJcblxyXG4gICAgICAgIC8vdGl0bGVcclxuICAgICAgICB0aGlzLnRpdGxlID0gb3B0cy50aXRsZVxyXG4gICAgICAgIHRoaXMudGl0bGVGb250U2l6ZSA9IG9wdHMudGl0bGVGb250U2l6ZSB8fCAnMC44ZW0nXHJcbiAgICAgICAgdGhpcy50aXRsZUZvbnRXZWlnaHQgPSBvcHRzLnRpdGxlRm9udFdlaWdodCB8fCAnYm9sZCdcclxuXHJcbiAgICAgICAgLy9sYWJlbFxyXG4gICAgICAgIHRoaXMubGFiZWxGb250U2l6ZSA9IG9wdHMubGFiZWxGb250U2l6ZSB8fCAnMC44ZW0nXHJcbiAgICAgICAgdGhpcy5sYWJlbFVuaXRUZXh0ID0gb3B0cy5sYWJlbFVuaXRUZXh0IHx8ICcnXHJcbiAgICAgICAgdGhpcy5sYWJlbEZvcm1hdCA9IG9wdHMubGFiZWxGb3JtYXRcclxuICAgIH1cclxuXHJcblxyXG4gICAgbWFrZVRpdGxlKCkge1xyXG4gICAgICAgIGlmICghdGhpcy50aXRsZSkgcmV0dXJuXHJcbiAgICAgICAgdGhpcy5kaXZcclxuICAgICAgICAgICAgLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLnRpdGxlRm9udFNpemUpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCB0aGlzLnRpdGxlRm9udFdlaWdodClcclxuICAgICAgICAgICAgLnN0eWxlKCdtYXJnaW4tYm90dG9tJywgJzdweCcpXHJcbiAgICAgICAgICAgIC50ZXh0KHRoaXMudGl0bGUpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbHkgYSBzdHlsZSB0byB0aGUgbGVnZW5kIGRpdi5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdlxyXG4gICAgICogQHJldHVybnMge3RoaXN8c3RyaW5nfVxyXG4gICAgICovXHJcbiAgICBzdHlsZShrLCB2KSB7XHJcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMuZGl2LnN0eWxlKGspXHJcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoaywgdilcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICovXHJcbiAgICB1cGRhdGUob3B0cyA9IHt9KSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignTGVnZW5kIHVwZGF0ZSBub3QgaW1wbGVtZW50ZWQgeWV0LicpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vLyBpbnRlcm5hbCBpbXBvcnRzXHJcbmltcG9ydCB7IEdlb0NhbnZhcyB9IGZyb20gJy4vR2VvQ2FudmFzLmpzJ1xyXG5pbXBvcnQgeyBUb29sdGlwIH0gZnJvbSAnLi9Ub29sdGlwLmpzJ1xyXG5pbXBvcnQgeyBab29tQnV0dG9ucyB9IGZyb20gJy4uL2J1dHRvbi9ab29tQnV0dG9ucy5qcydcclxuaW1wb3J0IHsgRnVsbHNjcmVlbkJ1dHRvbiB9IGZyb20gJy4uL2J1dHRvbi9GdWxsc2NyZWVuQnV0dG9uLmpzJ1xyXG5cclxuLy8gZXh0ZXJuYWwgaW1wb3J0c1xyXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXHJcblxyXG4vKipcclxuICogQSBncmlkdml6IGFwcGxpY2F0aW9uLlxyXG4gKlxyXG4gKiBAbW9kdWxlIGNvcmVcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1hcCB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnR9IGNvbnRhaW5lclxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoY29udGFpbmVyLCBvcHRzKSB7XHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGxheWVycy5cclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXI+fVxyXG4gICAgICAgICAqICovXHJcbiAgICAgICAgdGhpcy5sYXllcnMgPSBvcHRzLmxheWVycyB8fCBbXVxyXG5cclxuICAgICAgICAvL2dldCBjb250YWluZXIgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncmlkdml6JylcclxuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBmaW5kIGdyaWR2aXogY29udGFpbmVyIGVsZW1lbnQuJylcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2h0dHBzOi8vY3NzLXRyaWNrcy5jb20vYWJzb2x1dGUtcG9zaXRpb25pbmctaW5zaWRlLXJlbGF0aXZlLXBvc2l0aW9uaW5nL1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiOyAvLyBjb250YWluZXIgZWxlbWVudCBtdXN0IGhhdmUgcmVsYXRpdmUgcG9zaXRpb25pbmdcclxuXHJcbiAgICAgICAgLy9zZXQgZGltZW5zaW9uc1xyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMudyA9IG9wdHMudyB8fCB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuaCA9IG9wdHMuaCB8fCB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHRcclxuXHJcbiAgICAgICAgLy9jcmVhdGUgY2FudmFzIGVsZW1lbnQgaWYgbm90IHNwZWNpZmllZFxyXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR9ICovXHJcbiAgICAgICAgdGhpcy5fY2FudmFzID0gb3B0cy5jYW52YXMgfHwgdGhpcy5pbml0aWFsaXNlQ2FudmFzKClcclxuXHJcbiAgICAgICAgLyoqIE1ha2UgZ2VvIGNhbnZhc1xyXG4gICAgICAgICAqIEB0eXBlIHtHZW9DYW52YXN9XHJcbiAgICAgICAgICogQHByaXZhdGUgKi9cclxuICAgICAgICB0aGlzLmdlb0NhbnZhcyA9IG5ldyBHZW9DYW52YXModGhpcy5fY2FudmFzLCBvcHRzLngsIG9wdHMueSwgb3B0cy56LCBvcHRzKVxyXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnJlZHJhdyA9ICgpID0+IHsgdGhpcy5yZWRyYXcoKSB9XHJcblxyXG4gICAgICAgIC8vIGxlZ2VuZCBkaXZcclxuICAgICAgICB0aGlzLmxlZ2VuZERpdklkID0gb3B0cy5sZWdlbmREaXZJZCB8fCAnZ3ZpekxlZ2VuZCdcclxuICAgICAgICB0aGlzLmxlZ2VuZCA9IHNlbGVjdCgnIycgKyB0aGlzLmxlZ2VuZERpdklkKVxyXG4gICAgICAgIGlmICh0aGlzLmxlZ2VuZC5lbXB0eSgpKSB0aGlzLmluaXRpYWxpc2VMZWdlbmQoKVxyXG5cclxuXHJcbiAgICAgICAgLy90b29sdGlwXHJcblxyXG4gICAgICAgIC8vIHNldCBBcHAgY29udGFpbmVyIGFzIGRlZmF1bHQgcGFyZW50IGVsZW1lbnQgZm9yIHRvb2x0aXBcclxuICAgICAgICBpZiAoIW9wdHMudG9vbHRpcCkgb3B0cy50b29sdGlwID0ge31cclxuICAgICAgICBpZiAoIW9wdHMudG9vbHRpcC5wYXJlbnRFbGVtZW50KSBvcHRzLnRvb2x0aXAucGFyZW50RWxlbWVudCA9IHRoaXMuY29udGFpbmVyXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge1Rvb2x0aXB9ICovXHJcbiAgICAgICAgdGhpcy50b29sdGlwID0gbmV3IFRvb2x0aXAob3B0cy50b29sdGlwKVxyXG5cclxuICAgICAgICAvLyBhZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGNvbnRhaW5lclxyXG4gICAgICAgIHRoaXMubW91c2VPdmVySGFuZGxlciA9IChlKSA9PiB0aGlzLmZvY3VzQ2VsbChlKVxyXG4gICAgICAgIHRoaXMubW91c2VNb3ZlSGFuZGxlciA9IChlKSA9PiB0aGlzLmZvY3VzQ2VsbChlKVxyXG4gICAgICAgIHRoaXMubW91c2VPdXRIYW5kbGVyID0gKGUpID0+IHRoaXMudG9vbHRpcC5oaWRlKClcclxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5tb3VzZU92ZXJIYW5kbGVyKVxyXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZUhhbmRsZXIpXHJcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5tb3VzZU91dEhhbmRsZXIpXHJcblxyXG4gICAgICAgIC8vIGFkZCBleHRyYSBsb2dpYyB0byBvblpvb21TdGFydEZ1blxyXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLm9uWm9vbVN0YXJ0RnVuID0gKGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKG9wdHMub25ab29tU3RhcnRGdW4pIG9wdHMub25ab29tU3RhcnRGdW4oZSlcclxuICAgICAgICAgICAgdGhpcy50b29sdGlwLmhpZGUoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9mb3IgbW91c2Ugb3ZlclxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge0hUTUxDYW52YXNFbGVtZW50fG51bGx9ICovXHJcbiAgICAgICAgdGhpcy5jYW52YXNTYXZlID0gbnVsbFxyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGlvblJlY3RhbmdsZUNvbG9yID0gb3B0cy5zZWxlY3Rpb25SZWN0YW5nbGVDb2xvciB8fCAncmVkJ1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXggPSBvcHRzLnNlbGVjdGlvblJlY3RhbmdsZVdpZHRoUGl4IHx8ICgoKSA9PiA0KSAvLyhyLHopID0+IHt9XHJcblxyXG4gICAgICAgIC8vIHRyYW5zcGFyZW50IGJhY2tncm91bmQgKGUuZy4gbGVhZmxldCkgJ3JlZCBwYWludGluZycgZml4XHJcbiAgICAgICAgdGhpcy50cmFuc3BhcmVudEJhY2tncm91bmQgPSBvcHRzLnRyYW5zcGFyZW50QmFja2dyb3VuZFxyXG5cclxuICAgICAgICAvL3NldCBkZWZhdWx0IGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvblxyXG4gICAgICAgIHRoaXMuZGVmYXVsdEdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9XHJcbiAgICAgICAgICAgIG9wdHMuZGVmYXVsdEdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiB8fCB0aGlzLmdlb0NhbnZhcy5jdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQHByb3RlY3RlZCBcclxuICAgICAqIEByZXR1cm5zIHtIVE1MQ2FudmFzRWxlbWVudH1cclxuICAgICovXHJcbiAgICBpbml0aWFsaXNlQ2FudmFzKCkge1xyXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXHJcbiAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcclxuICAgICAgICBjYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuaClcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpXHJcbiAgICAgICAgcmV0dXJuIGNhbnZhc1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBpbml0aWFsaXNlTGVnZW5kKCkge1xyXG4gICAgICAgIHRoaXMubGVnZW5kID0gc2VsZWN0KHRoaXMuY29udGFpbmVyLmlkICYmIHRoaXMuY29udGFpbmVyLmlkICE9ICcnID8gJyMnICsgdGhpcy5jb250YWluZXIuaWQgOiAnYm9keScpXHJcbiAgICAgICAgICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgIC5hdHRyKCdpZCcsIHRoaXMubGVnZW5kRGl2SWQpXHJcbiAgICAgICAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3dpZHRoJywgJ2F1dG8nKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2hlaWdodCcsICdhdXRvJylcclxuICAgICAgICAgICAgLnN0eWxlKCdiYWNrZ3JvdW5kJywgJyNGRkZGRkYnKVxyXG4gICAgICAgICAgICAvLy5zdHlsZShcInBhZGRpbmdcIiwgdGhpcy5wYWRkaW5nKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2JvcmRlcicsICcwcHgnKVxyXG4gICAgICAgICAgICAvLy5zdHlsZSgnYm9yZGVyLXJhZGl1cycsICc1cHgnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2JveC1zaGFkb3cnLCAnM3B4IDNweCAzcHggZ3JleSwgLTNweCAtM3B4IDNweCAjZGRkJylcclxuICAgICAgICAgICAgLnN0eWxlKCdmb250LWZhbWlseScsICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJylcclxuICAgICAgICAgICAgLnN0eWxlKCdib3R0b20nLCAnMTVweCcpXHJcbiAgICAgICAgICAgIC5zdHlsZSgncmlnaHQnLCAnMTVweCcpXHJcbiAgICAgICAgLy9oaWRlXHJcbiAgICAgICAgLy8uc3R5bGUoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQvZ2V0IGxheWVyIHN0YWNrLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3VuZGVmaW5lZHxpbXBvcnQoXCIuL0xheWVyLmpzXCIpLkxheWVyfGltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXJbXX0gbGF5ZXJzIFxyXG4gICAgICogQHJldHVybnMgeyB0aGlzIHwgaW1wb3J0KFwiLi9MYXllci5qc1wiKS5MYXllcltdIH1cclxuICAgICAqL1xyXG4gICAgbGF5ZXJzXyhsYXllcnMpIHtcclxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMubGF5ZXJzXHJcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheWVycykpIHRoaXMubGF5ZXJzID0gbGF5ZXJzXHJcbiAgICAgICAgICAgIGVsc2UgdGhpcy5sYXllcnMgPSBbbGF5ZXJzXVxyXG4gICAgICAgIGVsc2UgdGhpcy5sYXllcnMgPSBhcmd1bWVudHNcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcmV0dXJucyB7dGhpc30gKi9cclxuICAgIHJlZHJhdygpIHtcclxuICAgICAgICAvL3JlbW92ZSBsZWdlbmQgZWxlbWVudHNcclxuICAgICAgICBpZiAodGhpcy5sZWdlbmQpIHRoaXMubGVnZW5kLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXHJcblxyXG4gICAgICAgIC8vY2xlYXJcclxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcclxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5jbGVhcih0aGlzLmdlb0NhbnZhcy5iYWNrZ3JvdW5kQ29sb3IpXHJcblxyXG4gICAgICAgIGNvbnN0IHogPSB0aGlzLmdlb0NhbnZhcy52aWV3LnpcclxuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXHJcblxyXG4gICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzXHJcbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xyXG5cclxuICAgICAgICAgICAgLy9jaGVjayBpZiBsYXllciBpcyB2aXNpYmxlXHJcbiAgICAgICAgICAgIGlmIChsYXllci52aXNpYmxlICYmICFsYXllci52aXNpYmxlKHopKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9zZXQgbGF5ZXIgYWxwaGEgYW5kIGJsZW5kIG1vZGVcclxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuY3R4Lmdsb2JhbEFscGhhID0gbGF5ZXIuYWxwaGEgPyBsYXllci5hbHBoYSh6KSA6IDEuMFxyXG4gICAgICAgICAgICBpZiAobGF5ZXIuYmxlbmRPcGVyYXRpb24pXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gbGF5ZXIuYmxlbmRPcGVyYXRpb24oeilcclxuXHJcbiAgICAgICAgICAgIC8vc2V0IGFmZmluIHRyYW5zZm9ybSB0byBkcmF3IHdpdGggZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgbGF5ZXJcclxuICAgICAgICAgICAgbGF5ZXIuZHJhdyh0aGlzLmdlb0NhbnZhcywgdGhpcy5sZWdlbmQpXHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgbGF5ZXIgZmlsdGVyXHJcbiAgICAgICAgICAgIGlmIChsYXllci5maWx0ZXJDb2xvcilcclxuICAgICAgICAgICAgICAgIGxheWVyLmRyYXdGaWx0ZXIodGhpcy5nZW9DYW52YXMpXHJcblxyXG4gICAgICAgICAgICAvL3Jlc3RvcmUgZGVmYXVsdCBhbHBoYSBhbmQgYmxlbmQgb3BlcmF0aW9uXHJcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5nbG9iYWxBbHBoYSA9IDEuMFxyXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gdGhpcy5kZWZhdWx0R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IG51bGxcclxuXHJcbiAgICAgICAgLy8gbGlzdGVuIGZvciByZXNpemUgZXZlbnRzIG9uIHRoZSBBcHAncyBjb250YWluZXIgYW5kIGhhbmRsZSB0aGVtXHJcbiAgICAgICAgdGhpcy5kZWZpbmVSZXNpemVPYnNlcnZlcih0aGlzLmNvbnRhaW5lciwgdGhpcy5fY2FudmFzKVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXJnaW5QeFxyXG4gICAgICogQHJldHVybnMge2ltcG9ydCgnLi9HZW9DYW52YXMuanMnKS5FbnZlbG9wZX1cclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgdXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4ID0gMjApIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMudXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4KVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqIEBwYXJhbSB7TW91c2VFdmVudH0gZSAqL1xyXG4gICAgZm9jdXNDZWxsKGUpIHtcclxuICAgICAgICAvL2NvbXB1dGUgbW91c2UgZ2VvIHBvc2l0aW9uXHJcbiAgICAgICAgY29uc3QgbW91c2VQb3NpdGlvbkdlbyA9IHtcclxuICAgICAgICAgICAgeDogdGhpcy5nZW9DYW52YXMucGl4VG9HZW9YKGUub2Zmc2V0WCArIHRoaXMudG9vbHRpcC54TW91c2VPZmZzZXQpLFxyXG4gICAgICAgICAgICB5OiB0aGlzLmdlb0NhbnZhcy5waXhUb0dlb1koZS5vZmZzZXRZICsgdGhpcy50b29sdGlwLnlNb3VzZU9mZnNldCksXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qKiBAdHlwZSB7e2NlbGw6aW1wb3J0KCcuL0RhdGFzZXQuanMnKS5DZWxsLGh0bWw6c3RyaW5nLHJlc29sdXRpb246bnVtYmVyfSB8IHVuZGVmaW5lZH0gKi9cclxuICAgICAgICBjb25zdCBmb2N1cyA9IHRoaXMuZ2V0Q2VsbEZvY3VzSW5mbyhtb3VzZVBvc2l0aW9uR2VvKVxyXG5cclxuICAgICAgICAvLyB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIChlLmcuIGxlYWZsZXQpICdyZWQgcGFpbnRpbmcnIGZpeFxyXG4gICAgICAgIGlmICh0aGlzLnRyYW5zcGFyZW50QmFja2dyb3VuZCkge1xyXG4gICAgICAgICAgICBpZiAoZm9jdXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5odG1sKGZvY3VzLmh0bWwpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2V0UG9zaXRpb24oZSlcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5zaG93KClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KVxyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuaClcclxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmdldENvbnRleHQoJzJkJyk/LmRyYXdJbWFnZSh0aGlzLmdlb0NhbnZhcy5jYW52YXMsIDAsIDApXHJcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChmb2N1cykge1xyXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChmb2N1cy5odG1sKVxyXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2V0UG9zaXRpb24oZSlcclxuICAgICAgICAgICAgdGhpcy50b29sdGlwLnNob3coKVxyXG5cclxuICAgICAgICAgICAgLy9zaG93IGNlbGwgcG9zaXRpb24gYXMgYSByZWN0YW5nbGVcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNhbnZhc1NhdmUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmgpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZ2V0Q29udGV4dCgnMmQnKT8uZHJhd0ltYWdlKHRoaXMuZ2VvQ2FudmFzLmNhbnZhcywgMCwgMClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLCAwLCAwKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgaW1hZ2Ugc2F2ZWQgKyBkcmF3IHJlY3RhbmdsZVxyXG4gICAgICAgICAgICBjb25zdCByZWN0V1BpeCA9IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXhcclxuICAgICAgICAgICAgICAgID8gdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVXaWR0aFBpeChmb2N1cy5yZXNvbHV0aW9uLCB0aGlzLmdlb0NhbnZhcy52aWV3LnopXHJcbiAgICAgICAgICAgICAgICA6IDRcclxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXHJcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3JcclxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHJlY3RXUGl4XHJcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuY3R4LnJlY3QoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5nZW9Ub1BpeFgoZm9jdXMuY2VsbC54KSAtIHJlY3RXUGl4IC8gMixcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmdlb1RvUGl4WShmb2N1cy5jZWxsLnkpICsgcmVjdFdQaXggLyAyLFxyXG4gICAgICAgICAgICAgICAgZm9jdXMucmVzb2x1dGlvbiAvIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiArIHJlY3RXUGl4LFxyXG4gICAgICAgICAgICAgICAgLWZvY3VzLnJlc29sdXRpb24gLyB0aGlzLmdlb0NhbnZhcy52aWV3LnogLSByZWN0V1BpeFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKClcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2FudmFzU2F2ZSkgdGhpcy5nZW9DYW52YXMuY3R4LmRyYXdJbWFnZSh0aGlzLmNhbnZhc1NhdmUsIDAsIDApXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgY2VsbCBIVE1MIGluZm8gYXQgYSBnaXZlbiBnZW8gcG9zaXRpb24uXHJcbiAgICAgKiBUaGlzIGlzIHVzZWZ1bGwgZm9yIHVzZXIgaW50ZXJhY3Rpb25zLCB0byBzaG93IHRoaXMgaW5mbyB3aGVyZSB0aGUgdXNlciBjbGlja3MgZm9yIGV4YW1wbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSBwb3NHZW9cclxuICAgICAqIEByZXR1cm5zIHt7Y2VsbDppbXBvcnQoJy4vRGF0YXNldC5qcycpLkNlbGwsaHRtbDpzdHJpbmcscmVzb2x1dGlvbjpudW1iZXJ9IHwgdW5kZWZpbmVkfVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICovXHJcbiAgICBnZXRDZWxsRm9jdXNJbmZvKHBvc0dlbykge1xyXG4gICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzLCBzdGFydGluZyBmcm9tIHRvcFxyXG4gICAgICAgIGNvbnN0IHogPSB0aGlzLmdlb0NhbnZhcy52aWV3LnpcclxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5sYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL0xheWVyLmpzXCIpLkxheWVyfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzW2ldXHJcbiAgICAgICAgICAgIGlmIChsYXllci52aXNpYmxlICYmICFsYXllci52aXNpYmxlKHopKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAoIWxheWVyLmNlbGxJbmZvSFRNTCkgY29udGludWVcclxuICAgICAgICAgICAgLy9pZiAobGF5ZXIuY2VsbEluZm9IVE1MID09PSAnbm9uZScpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGlmICghbGF5ZXIuZ2V0RGF0YXNldCkgY29udGludWVcclxuICAgICAgICAgICAgY29uc3QgZHNjID0gbGF5ZXIuZ2V0RGF0YXNldCh6KVxyXG4gICAgICAgICAgICBpZiAoIWRzYykgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IGNlbGwgYXQgbW91c2UgcG9zaXRpb25cclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJy4vRGF0YXNldC5qcycpLkNlbGx8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gZHNjLmdldENlbGxGcm9tUG9zaXRpb24ocG9zR2VvLCBkc2MuZ2V0Vmlld0NhY2hlKCkpXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coY2VsbCwgZHNjLnJlc29sdXRpb24pXHJcbiAgICAgICAgICAgIGlmICghY2VsbCkgcmV0dXJuIHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAgICAgLy9yYXJlIGNhc2UgZm9yIGEgZGF0YXNldCB3aXRoIG1peGVkIHJlc29sdXRpb25zXHJcbiAgICAgICAgICAgIGlmIChkc2MubWl4ZWRSZXNvbHV0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByID0gK2RzYy5taXhlZFJlc29sdXRpb24oY2VsbClcclxuICAgICAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsYXllci5jZWxsSW5mb0hUTUwoY2VsbCwgcilcclxuICAgICAgICAgICAgICAgIGlmICghaHRtbCkgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogciB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsYXllci5jZWxsSW5mb0hUTUwoY2VsbCwgZHNjLmdldFJlc29sdXRpb24oKSlcclxuICAgICAgICAgICAgaWYgKCFodG1sKSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIHJldHVybiB7IGNlbGw6IGNlbGwsIGh0bWw6IGh0bWwsIHJlc29sdXRpb246IGRzYy5nZXRSZXNvbHV0aW9uKCkgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcnx1bmRlZmluZWR9IHpcclxuICAgICAqL1xyXG4gICAgc2V0Vmlldyh4LCB5LCB6ID0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5nZW9DYW52YXMudmlldy54ID0geFxyXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnZpZXcueSA9IHlcclxuICAgICAgICBpZiAoeiAhPSB1bmRlZmluZWQpIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiA9IHpcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcmV0dXJucyB7aW1wb3J0KCcuL0dlb0NhbnZhcy5qcycpLlZpZXd9ICovXHJcbiAgICBnZXRWaWV3KCkgeyByZXR1cm4gdGhpcy5nZW9DYW52YXMudmlldyB9XHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXHJcbiAgICBnZXRab29tKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy52aWV3LnpcclxuICAgIH1cclxuICAgIC8qKiBAcGFyYW0ge251bWJlcn0geiBAcmV0dXJucyB7dGhpc30gKi9cclxuICAgIHNldFpvb20oeikge1xyXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiA9IHpcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXJ8dW5kZWZpbmVkPn0gKi9cclxuICAgIGdldENlbnRlckV4dGVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMuZ2V0Q2VudGVyRXh0ZW50KClcclxuICAgIH1cclxuICAgIC8qKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSB2YWwgQHJldHVybnMge3RoaXN9ICovXHJcbiAgICBzZXRDZW50ZXJFeHRlbnQodmFsKSB7XHJcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuc2V0Q2VudGVyRXh0ZW50KHZhbClcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcmV0dXJucyB7QXJyYXkuPG51bWJlcj59ICovXHJcbiAgICBnZXRab29tRXh0ZW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5nZXRab29tRXh0ZW50KClcclxuICAgIH1cclxuICAgIC8qKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSB2YWwgQHJldHVybnMge3RoaXN9ICovXHJcbiAgICBzZXRab29tRXh0ZW50KHZhbCkge1xyXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldFpvb21FeHRlbnQodmFsKVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cclxuICAgIGdldEJhY2tncm91bmRDb2xvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMuYmFja2dyb3VuZENvbG9yXHJcbiAgICB9XHJcbiAgICAvKiogQHBhcmFtIHtzdHJpbmd9IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cclxuICAgIHNldEJhY2tncm91bmRDb2xvcih2YWwpIHtcclxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5iYWNrZ3JvdW5kQ29sb3IgPSB2YWxcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNldCBvZiB6b29tIGJ1dHRvbnMgdG8gdGhlIG1hcFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgYWRkWm9vbUJ1dHRvbnMob3B0cykge1xyXG4gICAgICAgIC8vICogb3B0cy5pZFxyXG4gICAgICAgIC8vICogb3B0cy5vblpvb20gLSBjdXN0b20gZXZlbnQgaGFuZGxlciBmdW5jdGlvblxyXG4gICAgICAgIC8vICogb3B0cy54XHJcbiAgICAgICAgLy8gKiBvcHRzLnlcclxuICAgICAgICAvLyAqIG9wdHMuZGVsdGEgLSB6b29tIGRlbHRhIGFwcGxpZWQgb24gZWFjaCBjbGlja1xyXG5cclxuICAgICAgICB0aGlzLnpvb21CdXR0b25zID0gbmV3IFpvb21CdXR0b25zKHtcclxuICAgICAgICAgICAgbWFwOiB0aGlzLFxyXG4gICAgICAgICAgICBpZDogb3B0cz8uaWQgfHwgJ2dyaWR2aXotem9vbS1idXR0b25zJyxcclxuICAgICAgICAgICAgY2xhc3M6IG9wdHM/LmNsYXNzLFxyXG4gICAgICAgICAgICB4OiBvcHRzPy54LFxyXG4gICAgICAgICAgICB5OiBvcHRzPy55LFxyXG4gICAgICAgICAgICBvblpvb206IG9wdHM/Lm9uWm9vbSxcclxuICAgICAgICAgICAgZGVsdGE6IG9wdHM/LmRlbHRhIHx8IDAuMlxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgZnVsbHNjcmVlbiB0b2dnbGUgYnV0dG9uIHRvIHRoZSBhcHBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICogQHJldHVybnMge3RoaXN9XHJcbiAgICAgKi9cclxuICAgIGFkZEZ1bGxzY3JlZW5CdXR0b24ob3B0cykge1xyXG4gICAgICAgIC8vICogb3B0cy5tYXAgLSB0aGUgZ3JpZHZpeiBtYXBcclxuICAgICAgICAvLyAqIG9wdHMuaWRcclxuICAgICAgICAvLyAqIG9wdHMueFxyXG4gICAgICAgIC8vICogb3B0cy55XHJcblxyXG4gICAgICAgIHRoaXMuZnVsbHNjcmVlbkJ1dHRvbiA9IG5ldyBGdWxsc2NyZWVuQnV0dG9uKHtcclxuICAgICAgICAgICAgbWFwOiB0aGlzLFxyXG4gICAgICAgICAgICBpZDogb3B0cz8uaWQgfHwgJ2dyaWR2aXotZnVsbHNjcmVlbi1idXR0b24nLFxyXG4gICAgICAgICAgICBjbGFzczogb3B0cz8uY2xhc3MsXHJcbiAgICAgICAgICAgIHg6IG9wdHM/LngsXHJcbiAgICAgICAgICAgIHk6IG9wdHM/LnlcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcmV0dXJucyB7dGhpc30gKi9cclxuICAgIHNldFZpZXdGcm9tVVJMKCkge1xyXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldFZpZXdGcm9tVVJMKClcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZCBhIHJlc2l6ZSBldmVudCBvYnNlcnZlciB0byB0aGUgQXBwcyBjb250YWluZXIgYW5kIHVwZGF0ZSB0aGUgY2FudmFzIGFjY29yZGluZ2x5XHJcbiAgICAgKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50fSBjb250YWluZXIgVGhlIEFwcCdzIGNvbnRhaW5lciBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXMgVGhlIEFwcCBjYW52YXMgZWxlbWVudFxyXG4gICAgICogQG1lbWJlcm9mIEFwcFxyXG4gICAgICovXHJcbiAgICBkZWZpbmVSZXNpemVPYnNlcnZlcihjb250YWluZXIsIGNhbnZhcykge1xyXG4gICAgICAgIC8vIGxpc3RlbiB0byByZXNpemUgZXZlbnRzXHJcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcclxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGNhbnZhcyBoYXMgYmVlbiBidWlsdFxyXG4gICAgICAgICAgICBpZiAoY29udGFpbmVyLmNsaWVudFdpZHRoID4gMCAmJiBjb250YWluZXIuY2xpZW50SGVpZ2h0ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvbnQgZXhjZWVkIGxvb3AgbGltaXQgZmlyc3RcclxuICAgICAgICAgICAgICAgIC8vIHNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDkzODQxMjAvcmVzaXplb2JzZXJ2ZXItbG9vcC1saW1pdC1leGNlZWRlZFxyXG4gICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpIHx8ICFlbnRyaWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBtYXAgYW5kIGNhbnZhcyBzaXplXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaCAhPT0gY29udGFpbmVyLmNsaWVudEhlaWdodCB8fCB0aGlzLncgIT09IGNvbnRhaW5lci5jbGllbnRXaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmggPSBjb250YWluZXIuY2xpZW50SGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudyA9IGNvbnRhaW5lci5jbGllbnRXaWR0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5oID0gY29udGFpbmVyLmNsaWVudEhlaWdodFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy53ID0gY29udGFpbmVyLmNsaWVudFdpZHRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJycgKyB0aGlzLncpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdygpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSBidXR0b24gcG9zaXRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0aGlzLnpvb21CdXR0b25zKSB0aGlzLnpvb21CdXR0b25zLm5vZGUuc3R5bGUubGVmdCA9IHRoaXMudyAtIDUwICsgJ3B4J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy5mdWxsc2NyZWVuQnV0dG9uKSB0aGlzLmZ1bGxzY3JlZW5CdXR0b24ubm9kZS5zdHlsZS5sZWZ0ID0gdGhpcy53IC0gNTAgKyAncHgnXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIERlc3Ryb3kgdGhlIG1hcCBhbmQgaXQncyBldmVudCBsaXN0ZW5lcnNcclxuICAgICAqIFRoaXMgc2hvdWxkIHNpZ25pZmljYW50bHkgcmVkdWNlIHRoZSBtZW1vcnkgdXNlZCB3aGVuIGNyZWF0aW5nIGFuZCBkZXN0cm95aW5nIGdyaWR2aXogbWFwIGluc3RhbmNlcyAoZm9yIGV4YW1wbGUgaW4gbGVhZmxldC1ncmlkdml6KVxyXG4gICAgICogQG1lbWJlcm9mIEFwcFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95KCkge1xyXG4gICAgICAgIC8vIGNsZWFyIGxheWVyc1xyXG4gICAgICAgIHRoaXMubGF5ZXJzID0gW11cclxuICAgICAgICB0aGlzLmJnTGF5ZXJzID0gW11cclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyBmcm9tIGNvbnRhaW5lclxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMubW91c2VPdmVySGFuZGxlcilcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZUhhbmRsZXIpXHJcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCB0aGlzLm1vdXNlT3V0SGFuZGxlcilcclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlIGNhbnZhc1xyXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5yZW1vdmUoKVxyXG5cclxuICAgICAgICAvLyByZW1vdmUgbGVnZW5kXHJcbiAgICAgICAgdGhpcy5sZWdlbmQ/LnJlbW92ZSgpXHJcblxyXG4gICAgICAgIC8vIHJlbW92ZSB0b29sdGlwXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnRvb2x0aXA/LnJlbW92ZSgpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKipcclxuICogQSBtdWx0aSByZXNvbHV0aW9uIGRhdGFzZXQgb2YgZ3JpZCBjZWxscy5cclxuICogSXQgY29uc2lzdHMgb2YgZGlmZmVyZW50IHtAbGluayBEYXRhc2V0fXMgZm9yIGVhY2ggcmVzb2x1dGlvbi5cclxuICpcclxuICogQGFic3RyYWN0XHJcbiAqXHJcbiAqIEBtb2R1bGUgY29yZVxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTXVsdGlSZXNvbHV0aW9uRGF0YXNldCB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHJlc29sdXRpb25zIFRoZSByZXNvbHV0aW9ucyBvZiB0aGUgZGF0YXNldHMsIGluIENSUyBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0PnxmdW5jdGlvbihudW1iZXIpOmltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0fSBkYXRhc2V0cyBUaGUgZGF0YXNldHMgbGlzdCwgb25lIHBlciByZXNvbHV0aW9uLiBPciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGRhdGFzZXQgZnJvbSBhIHJlc29sdXRpb24gdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0geyB7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGwpOmJvb2xlYW59IH0gb3B0cyBPcHRpb25zLiBwcmVwcm9jZXNzOiBBIGZ1bmN0aW9uIHRvIGFwcGx5IG9uIGVhY2ggZGF0YXNldCBjZWxsIHRvIHByZXBhcmUgaXRzIHZhbHVlcy4gQ2FuIGJlIHVzZWQgYWxzbyB0byBzZWxlY3QgY2VsbHMgdG8ga2VlcC5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocmVzb2x1dGlvbnMsIGRhdGFzZXRzLCBvcHRzID0ge30pIHtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0cywgaW4gQ1JTIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cclxuICAgICAgICB0aGlzLnJlc29sdXRpb25zID0gcmVzb2x1dGlvbnNcclxuXHJcbiAgICAgICAgLyoqIFRoZSBkYXRhc2V0cy4gSWYgdGhlIGxpc3QgaXMgbm90IGV4cGxpY3RlbHkgZGVmaW5lZCwgYnVpbGQgaXQgZnJvbSB0aGUgcmVzb2x1dGlvbiBsaXN0IHdpdGggdGhlIGZ1bmN0aW9uXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL0RhdGFzZXRcIikuRGF0YXNldD59ICovXHJcbiAgICAgICAgdGhpcy5kYXRhc2V0cyA9ICh0eXBlb2YgZGF0YXNldHMgPT09ICdmdW5jdGlvbicpID8gdGhpcy5yZXNvbHV0aW9ucy5tYXAoZGF0YXNldHMpIDogZGF0YXNldHNcclxuXHJcbiAgICAgICAgLy90aGVyZSBtdXN0IGJlIGFzIG1hbnkgZGF0YXNldHMgYXMgcmVzb2x1dGlvbnNcclxuICAgICAgICBpZiAodGhpcy5kYXRhc2V0cy5sZW5ndGggPiAxICYmIHRoaXMuZGF0YXNldHMubGVuZ3RoICE9IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAnVW5jb21wYXRpYmxlIG51bWJlciBvZiBkYXRhc2V0cyBhbmQgcmVzb2x1dGlvbnM6ICcgK1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhc2V0cy5sZW5ndGggK1xyXG4gICAgICAgICAgICAgICAgJyAnICtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoXHJcbiAgICAgICAgICAgIClcclxuXHJcbiAgICAgICAgLy9zZXQgZGF0YXNldCBwcmVwcm9jZXNzZXMgaWYgc3BlY2lmaWVkXHJcbiAgICAgICAgaWYgKG9wdHMucHJlcHJvY2VzcykgdGhpcy5zZXRQcmVwb2Nlc3NlcyhvcHRzLnByZXByb2Nlc3MpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSByZWxldmFudCBkYXRhc2V0IGZvciBhIHNwZWNpZmllZCB6b29tLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5QaXhlbHNQZXJDZWxsXHJcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR8dW5kZWZpbmVkfVxyXG4gICAgICogKi9cclxuICAgIGdldERhdGFzZXQoeiwgbWluUGl4ZWxzUGVyQ2VsbCkge1xyXG5cclxuICAgICAgICAvL3NwZWNpYWwgY2FzZSB3aGl0aCBzaW5nbGUgZGF0YXNldFxyXG4gICAgICAgIGlmICh0aGlzLmRhdGFzZXRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy5kYXRhc2V0c1swXVxyXG5cclxuICAgICAgICBjb25zdCBycyA9IHRoaXMucmVzb2x1dGlvbnNcclxuICAgICAgICBsZXQgaSA9IDBcclxuICAgICAgICBsZXQgel8gPSByc1tpXSAvIG1pblBpeGVsc1BlckNlbGxcclxuICAgICAgICB3aGlsZSAoel8gPCB6ICYmIGkgPCBycy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgaSsrXHJcbiAgICAgICAgICAgIHpfID0gcnNbaV0gLyBtaW5QaXhlbHNQZXJDZWxsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vaWYgKGkgPT0gMCkgcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0c1swXTtcclxuICAgICAgICAvL3JldHVybiB0aGlzLmRhdGFzZXQuZGF0YXNldHNbaSAtIDFdO1xyXG4gICAgICAgIGlmIChpID09IHJzLmxlbmd0aCkgcmV0dXJuIHRoaXMuZGF0YXNldHNbcnMubGVuZ3RoIC0gMV1cclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhc2V0c1tpXVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgYSBwcmVwcm9jZXNzIGZ1bmN0aW9uIGZvciBhbGwgZGF0YXNldHMuXHJcbiAgICAgKiBUaGlzIGlzIGEgZnVuY3Rpb24gYXBwbGllZCBvbiBlYWNoIGNlbGwgYWZ0ZXIgaXQgaGFzIGJlZW4gbG9hZGVkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGwpOmJvb2xlYW59IHByZXByb2Nlc3NcclxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxyXG4gICAgICovXHJcbiAgICBzZXRQcmVwb2Nlc3NlcyhwcmVwcm9jZXNzKSB7XHJcbiAgICAgICAgZm9yIChsZXQgZHMgb2YgdGhpcy5kYXRhc2V0cykgZHMucHJlcHJvY2VzcyA9IHByZXByb2Nlc3NcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBmdW5jdGlvbiB0byBlYXNlIHRoZSBjcmVhdGlvbiBvZiBtdWx0aSByZXNvbHV0aW9uIGRhdGFzZXRzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHJlc29sdXRpb25zIFRoZSByZXNvbHV0aW9ucyBvZiB0aGUgZGF0YXNldHMsIGluIENSUyBnZW9ncmFwaGljYWwgdW5pdFxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOmltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0fSByZXNUb0RhdGFzZXQgRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGF0YXNldCBmcm9tIGEgcmVzb2x1dGlvblxyXG4gICAgICogQHBhcmFtIHsge3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFufSB9IG9wdHMgT3B0aW9ucy4gcHJlcHJvY2VzczogQSBmdW5jdGlvbiB0byBhcHBseSBvbiBlYWNoIGRhdGFzZXQgY2VsbCB0byBwcmVwYXJlIGl0cyB2YWx1ZXNcclxuICAgICAqIEByZXR1cm5zIHtNdWx0aVJlc29sdXRpb25EYXRhc2V0fVxyXG4gICAgICovXHJcbiAgICAvKnN0YXRpYyBtYWtlKHJlc29sdXRpb25zLCByZXNUb0RhdGFzZXQsIG9wdHMpIHtcclxuICAgICAgICAvL21ha2UgZGF0YXNldHNcclxuICAgICAgICBjb25zdCBkc2MgPSBbXVxyXG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc29sdXRpb25zKSBkc2MucHVzaChyZXNUb0RhdGFzZXQocmVzKSlcclxuICAgICAgICAvL21ha2UgbXVsdGkgcmVzb2x1dGlvbiBkYXRhc2V0XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVJlc29sdXRpb25EYXRhc2V0KGRzYywgcmVzb2x1dGlvbnMsIG9wdHMpXHJcbiAgICB9Ki9cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IERyYXdhYmxlIH0gZnJvbSBcIi4vRHJhd2FibGUuanNcIlxyXG5cclxuLyoqIEB0eXBlZGVmIHtcInNxdWFyZVwifFwiY2lyY2xlXCJ8XCJkaWFtb25kXCJ8XCJkb251dFwifFwidHJpYW5nbGVfdXBcInxcInRyaWFuZ2xlX2Rvd25cInxcInRyaWFuZ2xlX2xlZnRcInxcInRyaWFuZ2xlX3JpZ2h0XCJ8XCJub25lXCJ9IFNoYXBlICovXHJcblxyXG4vKipcclxuICogdmlld1NjYWxlIHR5cGVcclxuICogUmV0dXJucyBhbiBvYmplY3QgZnJvbSBhIGxpc3Qgb2YgY2VsbHMsIFxyXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydCgnLi9EYXRhc2V0LmpzJykuQ2VsbD4sbnVtYmVyLCBudW1iZXIpOip9IFZpZXdTY2FsZSAqL1xyXG5cclxuLyoqXHJcbiAqIEEgc3R5bGUsIHRvIHNob3cgYSBncmlkIGRhdGFzZXQuXHJcbiAqXHJcbiAqIEBtb2R1bGUgY29yZVxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3R5bGUgZXh0ZW5kcyBEcmF3YWJsZSB7XHJcbiAgICAvKipcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICogQHBhcmFtIHt7ZmlsdGVyPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOmJvb2xlYW4sIG9mZnNldD86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLCBudW1iZXIsIG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9LCB2aXNpYmxlPzpmdW5jdGlvbihudW1iZXIpOmJvb2xlYW4sYWxwaGE/OmZ1bmN0aW9uKG51bWJlcik6bnVtYmVyLGJsZW5kT3BlcmF0aW9uPzpmdW5jdGlvbihudW1iZXIpOkdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbixkcmF3RnVuPzpmdW5jdGlvbix2aWV3U2NhbGU/OlZpZXdTY2FsZX19IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgKiBAdHlwZSB7Vmlld1NjYWxlfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLnZpZXdTY2FsZSA9IG9wdHMudmlld1NjYWxlXHJcblxyXG4gICAgICAgIC8qKiBBIGZpbHRlciBmdW5jdGlvbiB0byBhcHBseSB0byB0aGUgY2VsbCBsaXN0LCB0byBmaWx0ZXIgb3V0IHNvbWUgY2VsbHMgbm90IHRvIGJlIGRyYXduIChzdWNoIGFzIGZvciBleGFtcGxlIHRoZSBjZWxscyB3aXRoIHZhbHVlPTApLlxyXG4gICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLmZpbHRlciA9IG9wdHMuZmlsdGVyIHx8ICgoKSA9PiB0cnVlKVxyXG5cclxuICAgICAgICAvKiogQW4gb2Zmc2V0LiBUaGlzIGlzIHRvIGFsdGVyIHRoZSBwb3NpdGlvbiBvZiBhbGwgc3ltYm9scyBpbiBhIGdpdmVuIGRpcmVjdGlvbi4gSW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXHJcbiAgICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSAqL1xyXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb3B0cy5vZmZzZXQgfHwgKChjLCByLCB6KSA9PiAoeyBkeDogMCwgZHk6IDAgfSkpXHJcblxyXG4gICAgICAgIC8qKiBBIGRyYXcgZnVuY3Rpb24gZm9yIHRoZSBzdHlsZS5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb258dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMuZHJhd0Z1biA9IG9wdHMuZHJhd0Z1blxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHVibGljXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL0xlZ2VuZFwiKS5MZWdlbmQ+fSAqL1xyXG4gICAgICAgIHRoaXMubGVnZW5kcyA9IFtdXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IGNlbGxzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbD59IGNlbGxzIFRoZSBjZWxscyB0byBkcmF3LlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlbS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZWlyIHJlc29sdXRpb24gKGluIGdlb2dyYXBoaWMgdW5pdClcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuICAgICAgICBpZiAodGhpcy5kcmF3RnVuKSB0aGlzLmRyYXdGdW4oY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbilcclxuICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGRyYXcgbm90IGltcGxlbWVudGVkLicpXHJcbiAgICB9XHJcblxyXG4gICAgLy9nZXR0ZXJzIGFuZCBzZXR0ZXJzXHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSAqL1xyXG4gICAgZ2V0T2Zmc2V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldFxyXG4gICAgfVxyXG4gICAgLyoqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLG51bWJlcixudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfX0gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xyXG4gICAgc2V0T2Zmc2V0KHZhbCkge1xyXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gdmFsXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKiogVXBkYXRlIGxlZ2VuZHMgb2YgdGhlIHN0eWxlLCBpZiBhbnlcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc30gKi9cclxuICAgIHVwZGF0ZUxlZ2VuZHMob3B0cykge1xyXG4gICAgICAgIFN0eWxlLnVwZGF0ZUxlZ2VuZHNSZWN1cnNpdmUodGhpcy5sZWdlbmRzLCBvcHRzKVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBzdGF0aWMgdXBkYXRlTGVnZW5kc1JlY3Vyc2l2ZShsZywgb3B0cykge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxnKSkgZm9yIChjb25zdCBsZ18gb2YgbGcpIHRoaXMudXBkYXRlTGVnZW5kc1JlY3Vyc2l2ZShsZ18sIG9wdHMpXHJcbiAgICAgICAgZWxzZSBsZy51cGRhdGUob3B0cylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4vTGVnZW5kXCIpLkxlZ2VuZD59IGxlZ2VuZHNcclxuICAgICAqIEByZXR1cm5zIHt0aGlzfSAqL1xyXG4gICAgYWRkTGVnZW5kcyhsZWdlbmRzKSB7XHJcbiAgICAgICAgZm9yIChsZXQgbGVnZW5kIG9mIGxlZ2VuZHMpXHJcbiAgICAgICAgICAgIHRoaXMubGVnZW5kcy5wdXNoKGxlZ2VuZClcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xyXG4vL2ltcG9ydCB7IHRyYW5zaXRpb24gfSBmcm9tIFwiZDMtdHJhbnNpdGlvblwiO1xyXG5cclxuLyoqXHJcbiAqIEEgZ2VuZXJpYyBjbGFzcyB0byBtYWtlIGEgdG9vbHRpcC5cclxuICogSXQgaXMgYSBkaXYgZWxlbWVudCwgd2hpY2ggY2FuIGJlIG1vdmVkIHVuZGVyIHRoZSBtb3VzZSBwb2ludGVyIGFuZCBmaWxsZWQgd2l0aCBzb21lIGluZm9ybWF0aW9uIGluIGh0bWwuXHJcbiAqIEBtb2R1bGUgY29yZVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRvb2x0aXAge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5kaXYgPSBvcHRzLmRpdiB8fCAndG9vbHRpcF9ldXJvc3RhdCdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLm1heFdpZHRoID0gb3B0cy5tYXhXaWR0aCB8fCAnMjBlbSdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAnMS4yZW0nXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gb3B0cy5iYWNrZ3JvdW5kIHx8ICd3aGl0ZSdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnBhZGRpbmcgPSBvcHRzLnBhZGRpbmcgfHwgJzVweCdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmJvcmRlciA9IG9wdHMuYm9yZGVyIHx8ICcwcHgnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpc1snYm9yZGVyLXJhZGl1cyddID0gb3B0c1snYm9yZGVyLXJhZGl1cyddIHx8ICcwcHgnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpc1snYm94LXNoYWRvdyddID0gb3B0c1snYm94LXNoYWRvdyddIHx8ICc1cHggNXB4IDVweCBncmV5J1xyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXNbJ2ZvbnQtZmFtaWx5J10gPSBvcHRzWydmb250LWZhbWlseSddIHx8ICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJ1xyXG5cclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnRyYW5zaXRpb25EdXJhdGlvbiA9IG9wdHMudHJhbnNpdGlvbkR1cmF0aW9uIHx8IDEwMFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMueE9mZnNldCA9IG9wdHMueE9mZnNldCB8fCAzMFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMueU9mZnNldCA9IG9wdHMueU9mZnNldCB8fCAyMFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAvLyBlLmcuIHRvIHByZXZlbnQgbW91c2UgY3Vyc29yIGNvdmVyaW5nIGNlbGwgYmVpbmcgaGlnaGxpZ2h0ZWRcclxuICAgICAgICB0aGlzLnlNb3VzZU9mZnNldCA9IG9wdHMueU1vdXNlT2Zmc2V0IHx8IDBcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnhNb3VzZU9mZnNldCA9IG9wdHMueE1vdXNlT2Zmc2V0IHx8IDBcclxuICAgICAgICAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqL1xyXG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudCA9IG9wdHMucGFyZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwdWJsaWNcclxuICAgICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiZDMtc2VsZWN0aW9uXCIpLlNlbGVjdGlvbn0gKi9cclxuICAgICAgICB0aGlzLnRvb2x0aXAgPSBzZWxlY3QoJyMnICsgdGhpcy5kaXYpXHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXAuZW1wdHkoKSkge1xyXG4gICAgICAgICAgICAvL2NyZWF0ZSB0b29sdGlwIERPTSBub2RlXHJcbiAgICAgICAgICAgIC8vIHRoaXMudG9vbHRpcCA9IHNlbGVjdChcclxuICAgICAgICAgICAgLy8gICAgICcjJyArIHRoaXMucGFyZW50RWxlbWVudC5pZCAmJiB0aGlzLnBhcmVudEVsZW1lbnQuaWQgIT0gJydcclxuICAgICAgICAgICAgLy8gICAgICAgICA/ICcjJyArIHRoaXMucGFyZW50RWxlbWVudC5pZFxyXG4gICAgICAgICAgICAvLyAgICAgICAgIDogJ2JvZHknXHJcbiAgICAgICAgICAgIC8vIClcclxuICAgICAgICAgICAgdGhpcy50b29sdGlwID0gc2VsZWN0KCdib2R5JykuYXBwZW5kKCdkaXYnKS5hdHRyKCdpZCcsIHRoaXMuZGl2KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9pbml0aWFsaXNlXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdtYXgtd2lkdGgnLCB0aGlzLm1heFdpZHRoKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnb3ZlcmZsb3cnLCAnaGlkZGVuJylcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdiYWNrZ3JvdW5kJywgdGhpcy5iYWNrZ3JvdW5kKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgncGFkZGluZycsIHRoaXMucGFkZGluZylcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JvcmRlcicsIHRoaXMuYm9yZGVyKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYm9yZGVyLXJhZGl1cycsIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSlcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JveC1zaGFkb3cnLCB0aGlzWydib3gtc2hhZG93J10pXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdmb250LWZhbWlseScsIHRoaXNbJ2ZvbnQtZmFtaWx5J10pXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdub25lJylcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ29wYWNpdHknLCAnMCcpXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCd0ZXh0LXdyYXAnLCAnbm93cmFwJylcclxuXHJcbiAgICAgICAgLy8gYXJpYS1sYWJlbHMgKHRoYW5rcyB0byB3YWhsYXRsYXMpXHJcbiAgICAgICAgdGhpcy50b29sdGlwLmF0dHIoJ3JvbGUnLCAndG9vbHRpcCcpLmF0dHIoJ2FyaWEtbGl2ZScsICdwb2xpdGUnKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTaG93IHRoZSB0b29sdGlwICovXHJcbiAgICBzaG93KCkge1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLnRvb2x0aXAudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMudHJhbnNpdGlvbkR1cmF0aW9uKS5zdHlsZSgnb3BhY2l0eScsIDEpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEhpZGUgdGhlIHRvb2x0aXAgKi9cclxuICAgIGhpZGUoKSB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy50cmFuc2l0aW9uRHVyYXRpb24pLnN0eWxlKCdvcGFjaXR5JywgMClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY29udGVudCBvZiB0aGUgdG9vbHRpcC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXHJcbiAgICAgKi9cclxuICAgIGh0bWwoaHRtbCkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcC5odG1sKGh0bWwpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b29sdGlwIGF0IHRoZSBtb3VzZSBldmVudCBwb3NpdGlvbi5cclxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcclxuICAgICAqL1xyXG4gICAgc2V0UG9zaXRpb24oZXZlbnQpIHtcclxuICAgICAgICBsZXQgcGFyZW50UmVjdCA9IHRoaXMucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxyXG5cclxuICAgICAgICBsZXQgeCA9IGV2ZW50LnBhZ2VYICsgdGhpcy54T2Zmc2V0XHJcbiAgICAgICAgbGV0IHkgPSBldmVudC5wYWdlWSAtIHRoaXMueU9mZnNldFxyXG5cclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2xlZnQnLCB4ICsgJ3B4Jykuc3R5bGUoJ3RvcCcsIHkgKyAncHgnKVxyXG5cclxuICAgICAgICB0aGlzLmVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIoZXZlbnQsIHBhcmVudFJlY3QpXHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuXHRteS5tb3VzZW92ZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGh0bWwpIHtcclxuXHRcdGlmIChodG1sKSBteS5odG1sKGh0bWwpO1xyXG5cdFx0bXkuc2V0UG9zaXRpb24oZXZlbnQpO1xyXG5cdFx0bXkuc2hvdygpXHJcblx0XHQvL3RoaXMuZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lcigpO1xyXG5cdH07XHJcblx0XHJcblx0bXkubW91c2Vtb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcblx0XHRteS5zZXRQb3NpdGlvbihldmVudCk7XHJcblx0XHQvL3RoaXMuZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lcigpO1xyXG5cdH07XHJcblx0XHJcblx0bXkubW91c2VvdXQgPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRteS5oaWRlKCk7XHJcblx0fTsqL1xyXG5cclxuICAgIHN0eWxlKGssIHYpIHtcclxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy50b29sdGlwLnN0eWxlKGspXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKGssIHYpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBhdHRyKGssIHYpIHtcclxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy50b29sdGlwLmF0dHIoaylcclxuICAgICAgICB0aGlzLnRvb2x0aXAuYXR0cihrLCB2KVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lclxyXG4gICAgICogQGRlc2NyaXB0aW9uIFByZXZlbnRzIHRoZSB0b29sdGlwIGZyb20gb3ZlcmZsb3dpbmcgb3V0IG9mIHRoZSBBcHAgY29udGFpbmVyIChlbnN1cmVzIHRoYXQgdGhlIHRvb2x0aXAgaXMgaW5zaWRlIHRoZSBncmlkdml6IGNvbnRhaW5lcilcclxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcclxuICAgICAqIEBwYXJhbSB7RE9NUmVjdH0gcGFyZW50UmVjdFxyXG4gICAgICovXHJcbiAgICBlbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyID0gZnVuY3Rpb24gKGV2ZW50LCBwYXJlbnRSZWN0KSB7XHJcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLnRvb2x0aXAubm9kZSgpXHJcbiAgICAgICAgbGV0IHBhcmVudFdpZHRoID0gcGFyZW50UmVjdC53aWR0aFxyXG4gICAgICAgIGxldCBwYXJlbnRIZWlnaHQgPSBwYXJlbnRSZWN0LmhlaWdodFxyXG5cclxuICAgICAgICAvL3RvbyBmYXIgcmlnaHRcclxuICAgICAgICBpZiAobm9kZS5vZmZzZXRMZWZ0ID4gcGFyZW50UmVjdC5sZWZ0ICsgcGFyZW50V2lkdGggLSBub2RlLmNsaWVudFdpZHRoKSB7XHJcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gZXZlbnQueCAtIG5vZGUuY2xpZW50V2lkdGggLSB0aGlzLnhPZmZzZXRcclxuICAgICAgICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCdcclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgbW91c2UgY292ZXJzIHRvb2x0aXBcclxuICAgICAgICAgICAgaWYgKG5vZGUub2Zmc2V0TGVmdCArIG5vZGUuY2xpZW50V2lkdGggPiBldmVudC54KSB7XHJcbiAgICAgICAgICAgICAgICAvL21vdmUgdG9vbHRpcCBsZWZ0IHNvIGl0IGRvZXNudCBjb3ZlciBtb3VzZVxyXG4gICAgICAgICAgICAgICAgbGV0IGxlZnQyID0gZXZlbnQueCAtIG5vZGUuY2xpZW50V2lkdGggLSB0aGlzLnhPZmZzZXRcclxuICAgICAgICAgICAgICAgIG5vZGUuc3R5bGUubGVmdCA9IGxlZnQyICsgJ3B4J1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIG5vZGUuc3R5bGUudG9wID0gbm9kZS5vZmZzZXRUb3AgKyBjb25maWcueU9mZnNldCArIFwicHhcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdG9vIGZhciBkb3duXHJcbiAgICAgICAgaWYgKG5vZGUub2Zmc2V0VG9wICsgbm9kZS5jbGllbnRIZWlnaHQgPiBwYXJlbnRSZWN0LnRvcCArIHBhcmVudEhlaWdodCkge1xyXG4gICAgICAgICAgICBub2RlLnN0eWxlLnRvcCA9IG5vZGUub2Zmc2V0VG9wIC0gbm9kZS5jbGllbnRIZWlnaHQgKyAncHgnXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3RvbyBmYXIgdXBcclxuICAgICAgICBpZiAobm9kZS5vZmZzZXRUb3AgPCBwYXJlbnRSZWN0LnRvcCkge1xyXG4gICAgICAgICAgICBub2RlLnN0eWxlLnRvcCA9IHBhcmVudFJlY3QudG9wICsgdGhpcy55T2Zmc2V0ICsgJ3B4J1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8qKiBAdHlwZWRlZiB7eyBkaW1zOiBvYmplY3QsIGNyczogc3RyaW5nLCB0aWxlU2l6ZUNlbGw6IG51bWJlciwgb3JpZ2luUG9pbnQ6IHt4Om51bWJlcix5Om51bWJlcn0sIHJlc29sdXRpb25HZW86IG51bWJlciwgdGlsaW5nQm91bmRzOmltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlIH19IEdyaWRJbmZvICovXHJcblxyXG5pbXBvcnQgeyBkc3YgfSBmcm9tICdkMy1mZXRjaCdcclxuaW1wb3J0IHsgRGF0YXNldCB9IGZyb20gJy4uL2NvcmUvRGF0YXNldC5qcydcclxuXHJcbi8qKlxyXG4gKiBBIGRhdGFzZXQgY29tcG9zZWQgb2YgYSBzaW5nbGUgQ1NWIGZpbGUgKG5vdCB0aWxlZCkuXHJcbiAqXHJcbiAqIEBtb2R1bGUgZGF0YXNldFxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ1NWR3JpZCBleHRlbmRzIERhdGFzZXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvTWFwLmpzXCIpLk1hcH0gbWFwIFRoZSBtYXAuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgZGF0YXNldCByZXNvbHV0aW9uIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86KGZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsKTpib29sZWFuKSxkZWxpbWl0ZXI/OnN0cmluZ319IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobWFwLCB1cmwsIHJlc29sdXRpb24sIG9wdHMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKG1hcCwgdXJsLCByZXNvbHV0aW9uLCBvcHRzKVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSAqL1xyXG4gICAgICAgIHRoaXMuY2VsbHMgPSBbXVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgIHRoaXMuZGVsaW1pdGVyID0gb3B0cy5kZWxpbWl0ZXIgfHwgXCIsXCJcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAcHJpdmF0ZSAgKi9cclxuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcclxuXHJcbiAgICAgICAgLy9nZXQgZGF0YVxyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSh1bmRlZmluZWQpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXF1ZXN0IGRhdGEgd2l0aGluIGEgZ2VvZ3JhcGhpYyBlbnZlbG9wZS5cclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGV8dW5kZWZpbmVkfSBlXHJcbiAgICAgKi9cclxuICAgIGdldERhdGEoZSkge1xyXG4gICAgICAgIC8vY2hlY2sgaWYgZGF0YSBhbHJlYWR5IGxvYWRlZFxyXG4gICAgICAgIGlmICh0aGlzLmluZm9Mb2FkaW5nU3RhdHVzICE9ICdub3RMb2FkZWQnKSByZXR1cm4gdGhpc1xyXG5cclxuICAgICAgICAvL2xvYWQgZGF0YVxyXG4gICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbG9hZGluZydcclxuICAgICAgICAgICAgOyAoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgZHN2KHRoaXMuZGVsaW1pdGVyLCB0aGlzLnVybClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb252ZXJ0IGNvb3JkaW5hdGVzIGluIG51bWJlcnNcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjLnggPSArYy54XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGMueSA9ICtjLnlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzLnB1c2goYylcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBkYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gY2hlY2sgaWYgcmVkcmF3IGlzIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhhdCBpcyBpZiB0aGUgZGF0YXNldCBiZWxvbmdzIHRvIGEgbGF5ZXIgd2hpY2ggaXMgdmlzaWJsZSBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vcmVkcmF3IG1hcFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcCkgdGhpcy5tYXAucmVkcmF3KClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vbWFyayBhcyBmYWlsZWRcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzID0gW11cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkoKVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlsbCB0aGUgdmlldyBjYWNoZSB3aXRoIGFsbCBjZWxscyB3aGljaCBhcmUgd2l0aGluIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGV9IGV4dEdlb1xyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZpZXdDYWNoZShleHRHZW8pIHtcclxuICAgICAgICAvL2RhdGEgbm90IGxvYWRlZCB5ZXRcclxuICAgICAgICBpZiAoIXRoaXMuY2VsbHMpIHJldHVyblxyXG5cclxuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cclxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGhpcy5jZWxscykge1xyXG4gICAgICAgICAgICBpZiAoK2NlbGwueCArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby54TWluKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAoK2NlbGwueCAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby54TWF4KSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAoK2NlbGwueSArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby55TWluKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAoK2NlbGwueSAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby55TWF4KSBjb250aW51ZVxyXG4gICAgICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlLnB1c2goY2VsbClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBEYXRhc2V0IH0gZnJvbSAnLi4vY29yZS9EYXRhc2V0LmpzJ1xyXG5cclxuLyoqXHJcbiAqIEEgZGF0YXNldCBjb21wb3NlZCBvZiBjZWxscyBkZWZpbmVkIGluIGphdmFzY3JpcHQsIG9yIGxvYWRlZCBvdXRzaWRlIG9mIGdyaWR2aXogbWFwLlxyXG4gKlxyXG4gKiBAbW9kdWxlIGRhdGFzZXRcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEpTR3JpZCBleHRlbmRzIERhdGFzZXQge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPE9iamVjdD59IGNlbGxzIFRoZSBjZWxscy5cclxuICAgICAqIEBwYXJhbSB7fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHJlc29sdXRpb24sIGNlbGxzLCBvcHRzID0ge30pIHtcclxuICAgICAgICBzdXBlcih1bmRlZmluZWQsIFwiXCIsIHJlc29sdXRpb24sIG9wdHMpXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGw+fSAqL1xyXG4gICAgICAgIHRoaXMuY2VsbHMgPSBjZWxscyB8fCBbXVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVxdWVzdCBkYXRhIHdpdGhpbiBhIGdlb2dyYXBoaWMgZW52ZWxvcGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9IGVcclxuICAgICAqL1xyXG4gICAgZ2V0RGF0YShlKSB7IHJldHVybiB0aGlzIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbGwgdGhlIHZpZXcgY2FjaGUgd2l0aCBhbGwgY2VsbHMgd2hpY2ggYXJlIHdpdGhpbiBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSBleHRHZW9cclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XHJcbiAgICAgICAgLy9kYXRhIG5vdCBsb2FkZWQgeWV0XHJcbiAgICAgICAgaWYgKCF0aGlzLmNlbGxzKSByZXR1cm5cclxuXHJcbiAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZSA9IFtdXHJcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHRoaXMuY2VsbHMpIHtcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnggLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueE1heCkgY29udGludWVcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueU1pbikgY29udGludWVcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcclxuICAgICAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZS5wdXNoKGNlbGwpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqIEB0eXBlZGVmIHt7IGRpbXM6IG9iamVjdCwgY3JzOiBzdHJpbmcsIHRpbGVTaXplQ2VsbDogbnVtYmVyLCBvcmlnaW5Qb2ludDoge3g6bnVtYmVyLHk6bnVtYmVyfSwgcmVzb2x1dGlvbkdlbzogbnVtYmVyLCB0aWxpbmdCb3VuZHM6aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGUgfX0gR3JpZEluZm8gKi9cclxuXHJcbi8vIGludGVybmFsXHJcbmltcG9ydCB7IERhdGFzZXQgfSBmcm9tICcuLi9jb3JlL0RhdGFzZXQuanMnXHJcbi8vaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvVXRpbHMuanMnXHJcblxyXG4vLyBleHRlcm5hbFxyXG5pbXBvcnQgeyBqc29uLCBjc3YgfSBmcm9tICdkMy1mZXRjaCdcclxuXHJcbi8qKlxyXG4gKiBBIHRpbGVkIGRhdGFzZXQsIGNvbXBvc2VkIG9mIENTViB0aWxlcy5cclxuICpcclxuICogQG1vZHVsZSBkYXRhc2V0XHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUaWxlZEdyaWQgZXh0ZW5kcyBEYXRhc2V0IHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL01hcC5qc1wiKS5NYXB9IG1hcCBUaGUgbWFwLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhc2V0LlxyXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86KGZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsKTpib29sZWFuKSB9fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1hcCwgdXJsLCBvcHRzID0ge30pIHtcclxuICAgICAgICBzdXBlcihtYXAsIHVybCwgMCwgb3B0cylcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGdyaWQgaW5mbyBvYmplY3QsIGZyb20gdGhlIGluZm8uanNvbiBmaWxlLlxyXG4gICAgICAgICAqICBAdHlwZSB7R3JpZEluZm8gfCB1bmRlZmluZWR9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiAgKi9cclxuICAgICAgICB0aGlzLmluZm8gPSB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAcHJpdmF0ZSAgKi9cclxuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNhY2hlIG9mIHRoZSBsb2FkZWQgdGlsZXMuIEl0IGlzIGRvdWJsZSBpbmRleGVkOiBieSB4VCBhbmQgdGhlbiB5VC5cclxuICAgICAgICAgKiBFeGFtcGxlOiB0aGlzLmNhY2hlW3hUXVt5VF0gcmV0dXJucyB0aGUgdGlsZSBhdCBbeFRdW3lUXSBsb2NhdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogKi9cclxuICAgICAgICB0aGlzLmNhY2hlID0ge31cclxuXHJcbiAgICAgICAgLy9sYXVuY2ggbG9hZGluZ1xyXG4gICAgICAgIHRoaXMubG9hZEluZm8oKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZCB0aGUgaW5mby5qc29uIGZyb20gdGhlIHVybC5cclxuICAgICAqIEByZXR1cm5zIHRoaXNcclxuICAgICAqL1xyXG4gICAgbG9hZEluZm8oKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluZm8gJiYgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9PT0gJ25vdExvYWRlZCcpIHtcclxuICAgICAgICAgICAgOyAoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQganNvbih0aGlzLnVybCArICdpbmZvLmpzb24nKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mbyA9IGRhdGFcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29sdXRpb24gPSBkYXRhLnJlc29sdXRpb25HZW9cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL21hcmsgYXMgZmFpbGVkXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKClcclxuICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID09PSAnbG9hZGVkJyB8fCB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID09PSAnZmFpbGVkJykpXHJcbiAgICAgICAgICAgIHRoaXMubWFwLnJlZHJhdygpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgYSB0aWxpbmcgZW52ZWxvcGUgZnJvbSBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cclxuICAgICAqIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0byBrbm93IHdoaWNoIHRpbGVzIHRvIGRvd25sb2FkIGZvciBhIGdlb2dyYXBoaWNhbCB2aWV3LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGV9IGVcclxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9XHJcbiAgICAgKi9cclxuICAgIGdldFRpbGluZ0VudmVsb3BlKGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaW5mbykge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRJbmZvKClcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwbyA9IHRoaXMuaW5mby5vcmlnaW5Qb2ludCxcclxuICAgICAgICAgICAgciA9IHRoaXMuaW5mby5yZXNvbHV0aW9uR2VvLFxyXG4gICAgICAgICAgICBzID0gdGhpcy5pbmZvLnRpbGVTaXplQ2VsbFxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB4TWluOiBNYXRoLmZsb29yKChlLnhNaW4gLSBwby54KSAvIChyICogcykpLFxyXG4gICAgICAgICAgICB4TWF4OiBNYXRoLmZsb29yKChlLnhNYXggLSBwby54KSAvIChyICogcykpLFxyXG4gICAgICAgICAgICB5TWluOiBNYXRoLmZsb29yKChlLnlNaW4gLSBwby55KSAvIChyICogcykpLFxyXG4gICAgICAgICAgICB5TWF4OiBNYXRoLmZsb29yKChlLnlNYXggLSBwby55KSAvIChyICogcykpLFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KCcuLi9jb3JlL0dlb0NhbnZhcy5qcycpLkVudmVsb3BlfSBleHRHZW9cclxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxyXG4gICAgICovXHJcbiAgICBnZXREYXRhKGV4dEdlbykge1xyXG4gICAgICAgIC8vVE9ETyBlbXB0eSBjYWNoZSB3aGVuIGl0IGdldHMgdG9vIGJpZyA/XHJcblxyXG4gICAgICAgIC8vY2hlY2sgaWYgaW5mbyBoYXMgYmVlbiBsb2FkZWRcclxuICAgICAgICBpZiAoIXRoaXMuaW5mbykgcmV0dXJuIHRoaXNcclxuXHJcbiAgICAgICAgLy90aWxlcyB3aXRoaW4gdGhlIHNjb3BlXHJcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgY29uc3QgdGIgPSB0aGlzLmdldFRpbGluZ0VudmVsb3BlKGV4dEdlbylcclxuICAgICAgICBpZiAoIXRiKSByZXR1cm4gdGhpc1xyXG5cclxuICAgICAgICAvL2dyaWQgYm91bmRzXHJcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gKi9cclxuICAgICAgICBjb25zdCBnYiA9IHRoaXMuaW5mby50aWxpbmdCb3VuZHNcclxuXHJcbiAgICAgICAgZm9yIChsZXQgeFQgPSBNYXRoLm1heCh0Yi54TWluLCBnYi54TWluKTsgeFQgPD0gTWF0aC5taW4odGIueE1heCwgZ2IueE1heCk7IHhUKyspIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgeVQgPSBNYXRoLm1heCh0Yi55TWluLCBnYi55TWluKTsgeVQgPD0gTWF0aC5taW4odGIueU1heCwgZ2IueU1heCk7IHlUKyspIHtcclxuICAgICAgICAgICAgICAgIC8vcHJlcGFyZSBjYWNoZVxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgdGhpcy5jYWNoZVt4VF0gPSB7fVxyXG5cclxuICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgdGlsZSBleGlzdHMgaW4gdGhlIGNhY2hlXHJcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge29iamVjdH0gKi9cclxuICAgICAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy5jYWNoZVt4VF1beVRdXHJcbiAgICAgICAgICAgICAgICBpZiAodGlsZSkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgICAgICAvL21hcmsgdGlsZSBhcyBsb2FkaW5nXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSBcImxvYWRpbmdcIjtcclxuICAgICAgICAgICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXF1ZXN0IHRpbGVcclxuICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59ICAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjZWxsc1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59ICAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBjc3YodGhpcy51cmwgKyB4VCArICcvJyArIHlUICsgJy5jc3YnKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogVGlsZWRHcmlkIHBhcnNlIHN0YXJ0JylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wcmVwcm9jZXNzKGMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMucHVzaChjKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMgPSBkYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbigncHJlcHJvY2VzcyAvIGZpbHRlcicpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9tYXJrIGFzIGZhaWxlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSAnZmFpbGVkJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vc3RvcmUgdGlsZSBpbiBjYWNoZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RpbGUgaW5mbyBpbmtub3duJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbGVfID0gZ2V0R3JpZFRpbGUoY2VsbHMsIHhULCB5VCwgdGhpcy5pbmZvKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbeFRdW3lUXSA9IHRpbGVfXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignc3RvcmFnZScpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgbm8gcmVkcmF3IGlzIHNwZWNpZmllZCwgdGhlbiBsZWF2ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLnJlZHJhdygpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgcmVkcmF3IGlzIHJlYWxseSBuZWVkZWQsIHRoYXQgaXMgaWY6XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIDEuIHRoZSBkYXRhc2V0IGJlbG9uZ3MgdG8gYSBsYXllciB3aGljaCBpcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWxcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVkcmF3ID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxheWVyc1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHogPSB0aGlzLm1hcC5nZXRab29tKClcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxheSBvZiB0aGlzLm1hcC5sYXllcnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxheS52aXNpYmxlICYmICFsYXkudmlzaWJsZSh6KSkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXkuZ2V0RGF0YXNldCkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxheS5nZXREYXRhc2V0KHopICE9IHRoaXMpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZm91bmQgb25lIGxheWVyLiBObyBuZWVkIHRvIHNlZWsgbW9yZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVkcmF3ID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvL2lmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJ2NoZWNrIHJlZHJhdyAxJylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWRyYXcpIHJldHVyblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyAyLiB0aGUgdGlsZSBpcyB3aXRoaW4gdGhlIHZpZXcsIHRoYXQgaXMgaXRzIGdlbyBlbnZlbG9wZSBpbnRlcnNlY3RzIHRoZSB2aWV3ZXIgZ2VvIGVudmVsb3BlLlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudiA9IHRoaXMubWFwLnVwZGF0ZUV4dGVudEdlbygpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52VCA9IHRpbGVfLmV4dEdlb1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnYueE1heCA8PSBlbnZULnhNaW4pIHJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnYueE1pbiA+PSBlbnZULnhNYXgpIHJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnYueU1heCA8PSBlbnZULnlNaW4pIHJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnYueU1pbiA+PSBlbnZULnlNYXgpIHJldHVyblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL2lmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJ2NoZWNrIHJlZHJhdyAyJylcclxuICAgICAgICAgICAgICAgICAgICAvL2lmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyoqKiBUaWxlZEdyaWQgcGFyc2UgZW5kJylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZWRyYXdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgfSkoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXHJcbiAgICAgKiBAYWJzdHJhY3RcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGV9IGV4dEdlb1xyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZpZXdDYWNoZShleHRHZW8pIHtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxyXG5cclxuICAgICAgICAvL2NoZWNrIGlmIGluZm8gaGFzIGJlZW4gbG9hZGVkXHJcbiAgICAgICAgaWYgKCF0aGlzLmluZm8pIHJldHVyblxyXG5cclxuICAgICAgICAvL3RpbGVzIHdpdGhpbiB0aGUgc2NvcGVcclxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICBjb25zdCB0YiA9IHRoaXMuZ2V0VGlsaW5nRW52ZWxvcGUoZXh0R2VvKVxyXG4gICAgICAgIGlmICghdGIpIHJldHVyblxyXG5cclxuICAgICAgICAvL2dyaWQgYm91bmRzXHJcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gKi9cclxuICAgICAgICBjb25zdCBnYiA9IHRoaXMuaW5mby50aWxpbmdCb3VuZHNcclxuXHJcbiAgICAgICAgZm9yIChsZXQgeFQgPSBNYXRoLm1heCh0Yi54TWluLCBnYi54TWluKTsgeFQgPD0gTWF0aC5taW4odGIueE1heCwgZ2IueE1heCk7IHhUKyspIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgY29udGludWVcclxuICAgICAgICAgICAgZm9yIChsZXQgeVQgPSBNYXRoLm1heCh0Yi55TWluLCBnYi55TWluKTsgeVQgPD0gTWF0aC5taW4odGIueU1heCwgZ2IueU1heCk7IHlUKyspIHtcclxuICAgICAgICAgICAgICAgIC8vZ2V0IHRpbGVcclxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7b2JqZWN0fSAqL1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuY2FjaGVbeFRdW3lUXVxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlIHx8IHR5cGVvZiB0aWxlID09PSAnc3RyaW5nJykgY29udGludWVcclxuXHJcbiAgICAgICAgICAgICAgICAvL2dldCBjZWxsc1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmNlbGxzVmlld0NhY2hlID0gdGhpcy5jZWxsc1ZpZXdDYWNoZS5jb25jYXQodGlsZS5jZWxscylcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGlsZS5jZWxscykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC54ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnhNaW4pIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnggLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueE1heCkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICBpZiAoK2NlbGwueSArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby55TWluKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC55IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnlNYXgpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZS5wdXNoKGNlbGwpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEdyaWRUaWxlKGNlbGxzLCB4VCwgeVQsIGdyaWRJbmZvKSB7XHJcblxyXG4gICAgY29uc3QgdGlsZSA9IHt9XHJcblxyXG4gICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSAqL1xyXG4gICAgdGlsZS5jZWxscyA9IGNlbGxzXHJcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgIHRpbGUueCA9IHhUXHJcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgIHRpbGUueSA9IHlUXHJcblxyXG4gICAgY29uc3QgciA9IGdyaWRJbmZvLnJlc29sdXRpb25HZW9cclxuICAgIGNvbnN0IHMgPSBncmlkSW5mby50aWxlU2l6ZUNlbGxcclxuXHJcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkVudmVsb3BlfSAqL1xyXG4gICAgdGlsZS5leHRHZW8gPSB7XHJcbiAgICAgICAgeE1pbjogZ3JpZEluZm8ub3JpZ2luUG9pbnQueCArIHIgKiBzICogdGlsZS54LFxyXG4gICAgICAgIHhNYXg6IGdyaWRJbmZvLm9yaWdpblBvaW50LnggKyByICogcyAqICh0aWxlLnggKyAxKSxcclxuICAgICAgICB5TWluOiBncmlkSW5mby5vcmlnaW5Qb2ludC55ICsgciAqIHMgKiB0aWxlLnksXHJcbiAgICAgICAgeU1heDogZ3JpZEluZm8ub3JpZ2luUG9pbnQueSArIHIgKiBzICogKHRpbGUueSArIDEpLFxyXG4gICAgfVxyXG5cclxuICAgIC8vY29udmVydCBjZWxsIGNvb3JkaW5hdGVzIGludG8gZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXHJcbiAgICBmb3IgKGxldCBjZWxsIG9mIHRpbGUuY2VsbHMpIHtcclxuICAgICAgICBjZWxsLnggPSB0aWxlLmV4dEdlby54TWluICsgY2VsbC54ICogclxyXG4gICAgICAgIGNlbGwueSA9IHRpbGUuZXh0R2VvLnlNaW4gKyBjZWxsLnkgKiByXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRpbGVcclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29yZS9MYXllci5qcydcclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBBIG1hcCBiYWNrZ3JvdW5kIGxheWVyIGluIFwiU2xpcHB5IG1hcFwiIFhZWiBzdGFuZGFyZC5cclxuICogU2VlIGh0dHBzOi8vd2lraS5vcGVuc3RyZWV0bWFwLm9yZy93aWtpL1NsaXBweV9tYXBfdGlsZW5hbWVzXHJcbiAqIGh0dHBzOi8vd3d3Lm1hcHRpbGVyLmNvbS9nb29nbGUtbWFwcy1jb29yZGluYXRlcy10aWxlLWJvdW5kcy1wcm9qZWN0aW9uLyM2LzI3Ljg4LzQ0LjQ4XHJcbiAqIFxyXG4gKiBAbW9kdWxlIGxheWVyXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kTGF5ZXIgZXh0ZW5kcyBMYXllciB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgY2FjaGUsIGluZGV4ZWQgYnkgei95L3ggKi9cclxuICAgICAgICB0aGlzLmNhY2hlID0ge31cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXHJcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMudXJsRnVuID0gb3B0cy51cmxGdW4gfHwgKCh4LCB5LCB6KSA9PiB0aGlzLnVybCArIHogKyAnLycgKyB4ICsgJy8nICsgeSArICcucG5nJylcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cclxuICAgICAgICB0aGlzLnJlc29sdXRpb25zID0gb3B0cy5yZXNvbHV0aW9uc1xyXG4gICAgICAgIGlmICghdGhpcy5yZXNvbHV0aW9ucyB8fCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5uYlBpeCA9IG9wdHMubmJQaXggfHwgMjU2XHJcbiAgICAgICAgLyoqIENSUyBjb29yZGluYXRlcyBvZiB0b3AgbGVmdCBjb3JuZXJcclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXHJcbiAgICAgICAgdGhpcy5vcmlnaW4gPSBvcHRzLm9yaWdpbiB8fCBbMCwgMF1cclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnowID0gb3B0cy56MCB8fCAwXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgei94L3kgY2FjaGUgZGF0YS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcclxuICAgICAqIEByZXR1cm5zIHtIVE1MSW1hZ2VFbGVtZW50fHN0cmluZ3x1bmRlZmluZWR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBnZXQoeiwgeCwgeSkge1xyXG4gICAgICAgIGxldCBkID0gdGhpcy5jYWNoZVt6XVxyXG4gICAgICAgIGlmICghZCkgcmV0dXJuXHJcbiAgICAgICAgZCA9IGRbeF1cclxuICAgICAgICBpZiAoIWQpIHJldHVyblxyXG4gICAgICAgIHJldHVybiBkW3ldXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgei94L3kgY2FjaGUgZGF0YS5cclxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxzdHJpbmd9IGltZ1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geVxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHB1dChpbWcsIHosIHgsIHkpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbel0pIHRoaXMuY2FjaGVbel0gPSB7fVxyXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt6XVt4XSkgdGhpcy5jYWNoZVt6XVt4XSA9IHt9XHJcbiAgICAgICAgdGhpcy5jYWNoZVt6XVt4XVt5XSA9IGltZ1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5yZXNvbHV0aW9ucyB8fCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcbiAgICAgICAgY29uc3QgeDAgPSB0aGlzLm9yaWdpblswXSxcclxuICAgICAgICAgICAgeTAgPSB0aGlzLm9yaWdpblsxXVxyXG5cclxuICAgICAgICAvL2dldCB6b29tIGxldmVsIGFuZCByZXNvbHV0aW9uXHJcbiAgICAgICAgbGV0IHpfID0gMFxyXG4gICAgICAgIGZvciAoel8gPSAwOyB6XyA8IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoOyB6XysrKSBpZiAodGhpcy5yZXNvbHV0aW9uc1t6X10gPCB6KSBicmVha1xyXG4gICAgICAgIHpfIC09IDFcclxuICAgICAgICB6XyA9IE1hdGgubWF4KDAsIHpfKVxyXG4gICAgICAgIHpfID0gTWF0aC5taW4oel8sIHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoIC0gMSlcclxuICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoLCB6KVxyXG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMucmVzb2x1dGlvbnNbel9dXHJcblxyXG4gICAgICAgIHpfICs9IHRoaXMuejBcclxuXHJcbiAgICAgICAgY29uc3Qgc2l6ZUcgPSB0aGlzLm5iUGl4ICogcmVzXHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHNpemVHIC8gelxyXG5cclxuICAgICAgICAvL2dldCB0aWxlIG51bWJlcnNcclxuICAgICAgICBjb25zdCB4R2VvVG9UTVMgPSAoeCkgPT4gTWF0aC5jZWlsKCh4IC0geDApIC8gc2l6ZUcpXHJcbiAgICAgICAgY29uc3QgeUdlb1RvVE1TID0gKHkpID0+IE1hdGguY2VpbCgtKHkgLSB5MCkgLyBzaXplRylcclxuICAgICAgICBjb25zdCB4TWluID0geEdlb1RvVE1TKGdlb0NhbnZhcy5leHRHZW8ueE1pbikgLSAxXHJcbiAgICAgICAgY29uc3QgeE1heCA9IHhHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnhNYXgpXHJcbiAgICAgICAgY29uc3QgeU1heCA9IHlHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnlNaW4pXHJcbiAgICAgICAgY29uc3QgeU1pbiA9IHlHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnlNYXgpIC0gMVxyXG5cclxuICAgICAgICAvL2hhbmRsZSBpbWFnZXNcclxuICAgICAgICBmb3IgKGxldCB4ID0geE1pbjsgeCA8IHhNYXg7IHgrKykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCB5ID0geU1pbjsgeSA8IHlNYXg7IHkrKykge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgaW1hZ2VcclxuICAgICAgICAgICAgICAgIGxldCBpbWcgPSB0aGlzLmdldCh6XywgeCwgeSlcclxuXHJcbiAgICAgICAgICAgICAgICAvL2xvYWQgaW1hZ2VcclxuICAgICAgICAgICAgICAgIGlmICghaW1nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1dChpbWcsIHpfLCB4LCB5KVxyXG4gICAgICAgICAgICAgICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpbWcub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXQoJ2ZhaWxlZCcsIHpfLCB4LCB5KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpbWcuc3JjID0gdGhpcy51cmxGdW4oeCwgeSwgel8pXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL2Nhc2Ugd2hlbiBubyBpbWFnZVxyXG4gICAgICAgICAgICAgICAgaWYgKGltZyA9PT0gJ2ZhaWxlZCcpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICBpZiAoIShpbWcgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGltZylcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGltZy53aWR0aCA9PSAwIHx8IGltZy5oZWlnaHQgPT0gMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgaW1hZ2VcclxuICAgICAgICAgICAgICAgIGNvbnN0IHhHZW8gPSB4MCArIHggKiBzaXplR1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeUdlbyA9IHkwIC0geSAqIHNpemVHXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmRyYXdJbWFnZShpbWcsIGdlb0NhbnZhcy5nZW9Ub1BpeFgoeEdlbyksIGdlb0NhbnZhcy5nZW9Ub1BpeFkoeUdlbyksIHNpemUsIHNpemUpXHJcbiAgICAgICAgICAgICAgICAgICAgLy9jZy5jdHguZHJhd0ltYWdlKGltZywgeEdlbywgeUdlbywgc2l6ZUcsIC1zaXplRylcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uL2NvcmUvTGF5ZXIuanMnXHJcblxyXG4vKipcclxuICpcclxuICogQSBtYXAgYmFja2dyb3VuZCBsYXllciBjb21wb3NlZCBvZiBhIHNpbmdsZSBpbWFnZSBmaWxlLCBnZW9sb2NhdGVkLlxyXG4gKiBcclxuICogQG1vZHVsZSBsYXllclxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZExheWVySW1hZ2UgZXh0ZW5kcyBMYXllciB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgZmlsZSBVUkxcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcclxuXHJcbiAgICAgICAgLyoqIFRoZSBpbWFnZSBsZWZ0IGNvb3JkaW5hdGVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMueE1pbiA9IG9wdHMueE1pbiB8fCAwO1xyXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgdG9wIGNvb3JkaW5hdGVcclxuICAgICAgICAgKiAgQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnlNYXggPSBvcHRzLnlNYXggfHwgMDtcclxuXHJcbiAgICAgICAgLyoqIFRoZSBpbWFnZSB3aWR0aCwgaW4gZ2VvIHVuaXRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8IDIwMDAwXHJcbiAgICAgICAgLyoqIFRoZSBpbWFnZSBoZWlnaHQsIGluIGdlbyB1bml0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8IDIwMDAwXHJcblxyXG4gICAgICAgIC8qKiBUaGUgaW1hZ2Ugb2JqZWN0XHJcbiAgICAgICAgICogQHR5cGUge0hUTUxJbWFnZUVsZW1lbnR8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMuaW1nID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIG1hcCBleHRlbnRcclxuICAgICAgICAvL2dlb0NhbnZhcy51cGRhdGVFeHRlbnRHZW8oMClcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaW1nKSB7XHJcbiAgICAgICAgICAgIC8vdGhlIGltYWdlIHdhcyBhbHJlYWR5IGRvd25sb2FkZWQ6IGRyYXcgaXRcclxuXHJcbiAgICAgICAgICAgIC8vY29tcHV0ZSBzY3JlZW4gY29vcmRpbmF0ZXMgYW5kIHNpemUgcmF0aW9cclxuICAgICAgICAgICAgY29uc3QgeCA9IGdlb0NhbnZhcy5nZW9Ub1BpeFgodGhpcy54TWluKVxyXG4gICAgICAgICAgICBjb25zdCB5ID0gZ2VvQ2FudmFzLmdlb1RvUGl4WSh0aGlzLnlNYXgpXHJcbiAgICAgICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMuZ2V0VmlldygpLnpcclxuXHJcbiAgICAgICAgICAgIC8vZHJhdyBpbWFnZVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuaW1nLCB4LCB5LCB0aGlzLndpZHRoIC8geiwgdGhpcy5oZWlnaHQgLyB6KVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL3JldHJpZXZlIGltYWdlXHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW1nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZyA9IG5ldyBJbWFnZSgpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLnJlZHJhdygpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZy5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHJldHJpZXZlIGJhY2tncm91bmQgaW1hZ2UgZnJvbVwiLCB0aGlzLnVybClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9zZXQgVVJMIHRvIGxhdW5jaCB0aGUgZG93bmxvYWRcclxuICAgICAgICAgICAgdGhpcy5pbWcuc3JjID0gdGhpcy51cmxcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEEgbWFwIFdNUyBiYWNrZ3JvdW5kIGxheWVyLlxyXG4gKiBcclxuICogQG1vZHVsZSBsYXllclxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZExheWVyV01TIGV4dGVuZHMgTGF5ZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MSW1hZ2VFbGVtZW50fHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLmltZyA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMueE1pbiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgdGhpcy54TWF4ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLnlNaW4gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMueU1heCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ2hlY2sgaWYgdGhlIHZpZXcgaGFzIG1vdmVkIGFuZCBhIG5ldyBpbWFnZSBuZWVkcyB0byBiZSByZXRyaWV2ZWQuXHJcbiAgICAgKiBAcHJpdmF0ZSAqL1xyXG4gICAgaGFzTW92ZWQoZXh0R2VvKSB7XHJcbiAgICAgICAgaWYgKChleHRHZW8ueE1pbikgIT0gdGhpcy54TWluKSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueE1heCkgIT0gdGhpcy54TWF4KSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueU1pbikgIT0gdGhpcy55TWluKSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueU1heCkgIT0gdGhpcy55TWF4KSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIG1hcCBleHRlbnRcclxuICAgICAgICBnZW9DYW52YXMudXBkYXRlRXh0ZW50R2VvKDApXHJcblxyXG4gICAgICAgIGlmICghdGhpcy5oYXNNb3ZlZChnZW9DYW52YXMuZXh0R2VvKSAmJiB0aGlzLmltZykge1xyXG4gICAgICAgICAgICAvL3RoZSBtYXAgZGlkIG5vdCBtb3ZlIGFuZCB0aGUgaW1hZ2Ugd2FzIGFscmVhZHkgZG93bmxvYWRlZDogZHJhdyB0aGUgaW1hZ2VcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmRyYXdJbWFnZSh0aGlzLmltZywgMCwgMCwgZ2VvQ2FudmFzLncsIGdlb0NhbnZhcy5oKVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL3RoZSBtYXAgbW92ZWQ6IHJldHJpZXZlIG5ldyBpbWFnZVxyXG5cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgdGhpcy54TWluID0gZ2VvQ2FudmFzLmV4dEdlby54TWluXHJcbiAgICAgICAgICAgIHRoaXMueE1heCA9IGdlb0NhbnZhcy5leHRHZW8ueE1heFxyXG4gICAgICAgICAgICB0aGlzLnlNaW4gPSBnZW9DYW52YXMuZXh0R2VvLnlNaW5cclxuICAgICAgICAgICAgdGhpcy55TWF4ID0gZ2VvQ2FudmFzLmV4dEdlby55TWF4XHJcblxyXG4gICAgICAgICAgICAvL2J1aWxkIFdNUyBVUkxcclxuICAgICAgICAgICAgY29uc3QgdXJsID0gW11cclxuICAgICAgICAgICAgdXJsLnB1c2godGhpcy51cmwpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKFwiJndpZHRoPVwiKVxyXG4gICAgICAgICAgICB1cmwucHVzaChnZW9DYW52YXMudylcclxuICAgICAgICAgICAgdXJsLnB1c2goXCImaGVpZ2h0PVwiKVxyXG4gICAgICAgICAgICB1cmwucHVzaChnZW9DYW52YXMuaClcclxuICAgICAgICAgICAgLy9iYm94OiB4bWluIHltaW4geG1heCB5bWF4XHJcbiAgICAgICAgICAgIHVybC5wdXNoKFwiJmJib3g9XCIpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueE1pbilcclxuICAgICAgICAgICAgdXJsLnB1c2goXCIsXCIpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueU1pbilcclxuICAgICAgICAgICAgdXJsLnB1c2goXCIsXCIpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueE1heClcclxuICAgICAgICAgICAgdXJsLnB1c2goXCIsXCIpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueU1heClcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHVybFMgPSB1cmwuam9pbihcIlwiKVxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHVybFMpXHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW1nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZyA9IG5ldyBJbWFnZSgpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLnJlZHJhdygpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZy5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHJldHJpZXZlIFdNUyBiYWNrZ3JvdW5kIGltYWdlIGZyb21cIiwgdXJsUylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9zZXQgVVJMIHRvIGxhdW5jaCB0aGUgZG93bmxvYWRcclxuICAgICAgICAgICAgdGhpcy5pbWcuc3JjID0gdXJsU1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uL2NvcmUvTGF5ZXIuanMnXHJcbmltcG9ydCB7IGpzb24gfSBmcm9tICdkMy1mZXRjaCdcclxuXHJcbi8qKlxyXG4gKiBAbW9kdWxlIGxheWVyXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHZW9KU09OTGF5ZXIgZXh0ZW5kcyBMYXllciB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcHJlcHJvY2VzcyB0byBydW4gb24gZWFjaCBmZWF0dXJlIGFmdGVyIGxvYWRpbmcuXHJcbiAgICAgICAgICogSXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc29tZSBzcGVjaWZpYyB0cmVhdG1lbnQgYmVmb3JlLCBmb3JtYXQgdGhlIGxhYmVsIGRhdGEsIHByb2plY3QgY29vcmRpbmF0ZXMsIGV0Yy5cclxuICAgICAgICAgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGxhYmVsIHNob3VsZCBub3QgYmUga2VwdC5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QpOmJvb2xlYW59ICovXHJcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXHJcblxyXG4gICAgICAgIC8vZm9yIHBvaW50c1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKGYsIHopID0+ICdjaXJjbGUnKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEluIHBpeGVsXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSB8fCAoKGYsIHopID0+IDEwKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnN0cm9rZVN0eWxlID0gb3B0cy5zdHJva2VTdHlsZSB8fCAoKGYsIHopID0+ICdyZWQnKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmZpbGxTdHlsZSA9IG9wdHMuZmlsbFN0eWxlIHx8ICgoZiwgeikgPT4gJ2JsYWNrJylcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbiBwaXhlbFxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgoZiwgeikgPT4gMilcclxuXHJcblxyXG5cclxuICAgICAgICAvL2ZvciBsaW5lc1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKChmLCB6KSA9PiAnZ3JheScpXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW4gcGl4ZWxcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChmLCB6KSA9PiAyKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOkFycmF5LjxudW1iZXI+fHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLmxpbmVEYXNoID0gb3B0cy5saW5lRGFzaCB8fCAoKGYsIHopID0+IHVuZGVmaW5lZClcclxuXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxvYmplY3Q+IHwgdW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMuZnMgPSB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdub3RMb2FkZWQnXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyB0aGUgbGF5ZXIuXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgZHJhdyhnZW9DYW52YXMpIHtcclxuICAgICAgICAvL2xvYWQgZGF0YSwgaWYgbm90IGRvbmUgeWV0LlxyXG4gICAgICAgIGlmICghdGhpcy5mcykge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWQoZ2VvQ2FudmFzLnJlZHJhdylcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgZiBvZiB0aGlzLmZzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGd0ID0gZi5nZW9tZXRyeS50eXBlXHJcblxyXG4gICAgICAgICAgICBpZiAoZ3QgPT0gXCJQb2ludFwiKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gZi5nZW9tZXRyeS5jb29yZGluYXRlc1xyXG5cclxuICAgICAgICAgICAgICAgIC8vZ2V0IHN0eWxlIHBhcmFtZXRlcnMgZm9yIHRoZSBwb2ludCBmZWF0dXJlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzaGFwZSA9IHRoaXMuc2hhcGUoZix6KVxyXG4gICAgICAgICAgICAgICAgaWYoIXNoYXBlIHx8IHNoYXBlPT1cIm5vbmVcIikgY29udGludWVcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemUoZix6KSAqIHpcclxuICAgICAgICAgICAgICAgIGlmKCFzaXplKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3Ryb2tlU3R5bGUgPSB0aGlzLnN0cm9rZVN0eWxlKGYseilcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGxTdHlsZSA9IHRoaXMuZmlsbFN0eWxlKGYseilcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IHRoaXMubGluZVdpZHRoKGYseikgKiB6XHJcblxyXG4gICAgICAgICAgICAgICAgLy9zZXQgY2FudmFzIGRyYXdpbmcgcGFyYW1ldGVyc1xyXG4gICAgICAgICAgICAgICAgaWYoc3Ryb2tlU3R5bGUpIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZVxyXG4gICAgICAgICAgICAgICAgaWYoZmlsbFN0eWxlKSBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9IGZpbGxTdHlsZVxyXG4gICAgICAgICAgICAgICAgaWYobGluZVdpZHRoKSBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aFxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaGFwZSA9PSBcImNpcmNsZVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZSAtIGZpbGwgYW5kIHN0cm9rZVxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhjWzBdLCBjWzFdLCBzaXplIC8gMiwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGZpbGxTdHlsZSkgZ2VvQ2FudmFzLmN0eC5maWxsKClcclxuICAgICAgICAgICAgICAgICAgICBpZihzdHJva2VTdHlsZSAmJiBsaW5lV2lkdGgpIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT0gXCJzcXVhcmVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzcXVhcmUgLSBmaWxsIGFuZCBzdHJva2VcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5yZWN0KGNbMF0gLSBzaXplIC8gMiwgY1sxXSAtIHNpemUgLyAyLCBzaXplLCBzaXplKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGZpbGxTdHlsZSkgZ2VvQ2FudmFzLmN0eC5maWxsKClcclxuICAgICAgICAgICAgICAgICAgICBpZihzdHJva2VTdHlsZSAmJiBsaW5lV2lkdGgpIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlVuZXhwZWN0ZWQgc2hhcGUgZm9yIHBvaW50IGdlb2pzb246IFwiICsgc2hhcGUpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGd0ID09IFwiTGluZVN0cmluZ1wiKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzXHJcbiAgICAgICAgICAgICAgICBpZiAoY3MubGVuZ3RoIDwgMikgY29udGludWVcclxuXHJcbiAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihmLCB6KVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcclxuXHJcbiAgICAgICAgICAgICAgICAvL3NldCBsaW5ld2lkdGhcclxuICAgICAgICAgICAgICAgIGNvbnN0IHdQID0gdGhpcy53aWR0aChmLCB6KVxyXG4gICAgICAgICAgICAgICAgaWYgKCF3UCB8fCB3UCA8IDApIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHdQICogelxyXG5cclxuICAgICAgICAgICAgICAgIC8vc2V0IGxpbmUgZGFzaFxyXG4gICAgICAgICAgICAgICAgY29uc3QgbGRQID0gdGhpcy5saW5lRGFzaChmLCB6KVxyXG4gICAgICAgICAgICAgICAgaWYgKGxkUCkgZ2VvQ2FudmFzLmN0eC5zZXRMaW5lRGFzaChsZFApXHJcblxyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGxpbmVcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGNzWzBdWzBdLCBjc1swXVsxXSlcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY3MubGVuZ3RoOyBpKyspIGdlb0NhbnZhcy5jdHgubGluZVRvKGNzW2ldWzBdLCBjc1tpXVsxXSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSBpbiBHZW9KU09OTGF5ZXI6IFwiICsgZ3QpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLy4uLlxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHguc2V0TGluZURhc2goW10pXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIGRhdGEgZm9yIGxhYmVscywgZnJvbSBVUkwgdGhpcy51cmxcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgYXN5bmMgbG9hZChjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICghdGhpcy51cmwpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGJvdW5kYXJpZXM6IE5vIFVSTCBzcGVjaWZpZWQuICcgKyB0aGlzLnVybClcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcclxuICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vY2hlY2sgaWYgZGF0YSBhbHJlYWR5IGxvYWRlZFxyXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVyblxyXG5cclxuICAgICAgICAvL2xvYWQgZGF0YVxyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhXyA9IGF3YWl0IGpzb24odGhpcy51cmwpXHJcblxyXG4gICAgICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48b2JqZWN0PiB9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBkYXRhXy5mZWF0dXJlc1xyXG5cclxuICAgICAgICAgICAgLy9wcmVwcm9jZXNzL2ZpbHRlclxyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZzID0gW11cclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChiID09IGZhbHNlKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnMucHVzaChjKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9zdG9yZSBsYWJlbHNcclxuICAgICAgICAgICAgICAgIHRoaXMuZnMgPSBkYXRhXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXHJcblxyXG4gICAgICAgICAgICAvL3JlZHJhd1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgYm91bmRhcmllcyBmcm9tICcgKyB0aGlzLnVybClcclxuICAgICAgICAgICAgdGhpcy5mcyA9IFtdXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEEgbGF5ZXIsIHdoaWNoIHNwZWNpZmllcyBhIGRhdGFzZXQgdG8gYmUgc2hvd24gd2l0aCBzcGVjaWZpZWQgc3R5bGVzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIGxheWVyXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHcmlkTGF5ZXIgZXh0ZW5kcyBMYXllciB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkRhdGFzZXR8aW1wb3J0KFwiLi4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0XCIpLk11bHRpUmVzb2x1dGlvbkRhdGFzZXR9IGRhdGFzZXQgVGhlIGRhdGFzZXQgdG8gc2hvdy5cclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU3R5bGU+fSBzdHlsZXMgVGhlIHN0eWxlcywgb3JkZXJlZCBpbiBkcmF3aW5nIG9yZGVyLlxyXG4gICAgICogQHBhcmFtIHt7dmlzaWJsZT86ZnVuY3Rpb24obnVtYmVyKTpib29sZWFuLGFscGhhPzpmdW5jdGlvbihudW1iZXIpOm51bWJlcixibGVuZE9wZXJhdGlvbj86ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24sbWluUGl4ZWxzUGVyQ2VsbD86bnVtYmVyLGNlbGxJbmZvSFRNTD86ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOnN0cmluZ319IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoZGF0YXNldCwgc3R5bGVzLCBvcHRzID0ge30pIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkRhdGFzZXR8aW1wb3J0KFwiLi4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0XCIpLk11bHRpUmVzb2x1dGlvbkRhdGFzZXR9ICovXHJcbiAgICAgICAgdGhpcy5kYXRhc2V0ID0gZGF0YXNldFxyXG5cclxuICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlN0eWxlPn0gKi9cclxuICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlc1xyXG5cclxuICAgICAgICAvKiogXHJcbiAgICAgICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB3aGVuIHRoZSBkYXRhc2V0IGlzIGEgTXVsdGlSZXNvbHV0aW9uRGF0YXNldC5cclxuICAgICAgICAgKiBJdCBkZWZpbmVzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBwaXhlbHMgYSBncmlkIGNlbGwgc2hvdWxkIGhhdmUgdG8gc2VsZWN0IHRoZSBkYXRhc2V0IHRvIGRpc3BsYXkgYmFzZWQgb24gaXRzIHJlc29sdXRpb24uXHJcbiAgICAgICAgICogQSBsb3cgdmFsdWUsIG1lYW5zIHRoYXQgdGhlIG1hcCB3aWxsIGJlIG1vcmUgZGV0YWlsbGVkIChzbWFsbGVyIGNlbGxzKS5cclxuICAgICAgICAgKiBBIGhpZ2ggdmFsdWUsIG1lYW5zIHRoYXQgdGhlIG1hcCB3aWxsIGJlIGxlc3MgZGV0YWlsbGVkIChsYXJnZXIgY2VsbHMpLlxyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgc2hvdWxkIGJlIGhpZ2hlciB0aGFuIDEsIG90aGVyd2lzZSBpdCBtZWFucyBhIGdyaWQgY2VsbCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNjcmVlbiByZXNvbHV0aW9uLlxyXG4gICAgICAgICAqIEZvciBtb3JlIGNvbXBsZXggY2VsbCByZXByZXNlbnRhdGlvbnMgdGhhdCByZXF1aXJlIHNvbWUgbW9yZSBtYXAgc3BhY2UsIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGhpZ2hlci5cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMubWluUGl4ZWxzUGVyQ2VsbCA9IG9wdHMubWluUGl4ZWxzUGVyQ2VsbCB8fCAzXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBmdW5jdGlvbiByZXR1cm5pbmcgY2VsbCBpbmZvcm1hdGlvbiBhcyBIVE1MLlxyXG4gICAgICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHRvb2x0aXAgaW5mb3JtYXRpb24uXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsLCBudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNlbGxJbmZvSFRNTCA9IG9wdHMuY2VsbEluZm9IVE1MIHx8IEdyaWRMYXllci5kZWZhdWx0Q2VsbEluZm9IVE1MXHJcbiAgICB9XHJcblxyXG4gICAgLyoqICovXHJcbiAgICBkcmF3KGdlb0NhbnZhcywgbGVnZW5kKSB7XHJcblxyXG4gICAgICAgIC8vZ2V0IHpvb20gbGV2ZWxcclxuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxyXG5cclxuICAgICAgICAvL2dldCBsYXllciBkYXRhc2V0IGNvbXBvbmVudFxyXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5EYXRhc2V0fHVuZGVmaW5lZH0gKi9cclxuICAgICAgICBjb25zdCBkc2MgPSB0aGlzLmdldERhdGFzZXQoeilcclxuICAgICAgICBpZiAoIWRzYykgcmV0dXJuXHJcblxyXG4gICAgICAgIC8vbGF1bmNoIGRhdGEgZG93bmxvYWQsIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgIGRzYy5nZXREYXRhKGdlb0NhbnZhcy5leHRHZW8pXHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGRhdGFzZXQgdmlldyBjYWNoZVxyXG4gICAgICAgIGRzYy51cGRhdGVWaWV3Q2FjaGUoZ2VvQ2FudmFzLmV4dEdlbylcclxuXHJcbiAgICAgICAgLy9kcmF3IGNlbGxzLCBzdHlsZSBieSBzdHlsZVxyXG4gICAgICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnN0eWxlcykge1xyXG5cclxuICAgICAgICAgICAgLy9jaGVjayBpZiBzdHlsZSBpcyB2aXNpYmxlXHJcbiAgICAgICAgICAgIGlmIChzLnZpc2libGUgJiYgIXMudmlzaWJsZSh6KSkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vc2V0IHN0eWxlIGFscGhhIGFuZCBibGVuZCBtb2RlXHJcbiAgICAgICAgICAgIC8vVE9ETzogbXVsdGlwbHkgYnkgbGF5ZXIgYWxwaGEgP1xyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lmdsb2JhbEFscGhhID0gcy5hbHBoYSA/IHMuYWxwaGEoeikgOiAxLjBcclxuICAgICAgICAgICAgaWYgKHMuYmxlbmRPcGVyYXRpb24pXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IHMuYmxlbmRPcGVyYXRpb24oeilcclxuXHJcbiAgICAgICAgICAgIC8vc2V0IGFmZmluIHRyYW5zZm9ybSB0byBkcmF3IHdpdGggZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IHdpdGggc3R5bGVcclxuICAgICAgICAgICAgcy5kcmF3KGRzYy5nZXRWaWV3Q2FjaGUoKSwgZ2VvQ2FudmFzLCBkc2MuZ2V0UmVzb2x1dGlvbigpKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IHN0eWxlIGZpbHRlclxyXG4gICAgICAgICAgICBpZiAocy5maWx0ZXJDb2xvcilcclxuICAgICAgICAgICAgICAgIHMuZHJhd0ZpbHRlcihnZW9DYW52YXMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2FkZCBsZWdlbmQgZWxlbWVudFxyXG4gICAgICAgIGlmIChsZWdlbmQpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIHRoaXMuc3R5bGVzKSB7XHJcbiAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHN0eWxlIGlzIHZpc2libGVcclxuICAgICAgICAgICAgICAgIGlmIChzLnZpc2libGUgJiYgIXMudmlzaWJsZSh6KSkgY29udGludWVcclxuICAgICAgICAgICAgICAgIEdyaWRMYXllci5hZGRMZWdlbmRzKGxlZ2VuZCwgcy5sZWdlbmRzKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vY2FzZSBmb3Igc3R5bGVzIG9mIHN0eWxlcywgbGlrZSBrZXJuZWwgc21vb3RoaW5nXHJcbiAgICAgICAgICAgICAgICAvL1RPRE8gZG8gYmV0dGVyXHJcbiAgICAgICAgICAgICAgICBpZiAoc1snc3R5bGVzJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMyIG9mIHNbJ3N0eWxlcyddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzMi52aXNpYmxlICYmICFzMi52aXNpYmxlKHopKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBHcmlkTGF5ZXIuYWRkTGVnZW5kcyhsZWdlbmQsIHMyLmxlZ2VuZHMpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHN0YXRpYyBhZGRMZWdlbmRzKGxlZ2VuZENvbXAsIGxnKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGcpKSBmb3IgKGNvbnN0IGxnXyBvZiBsZykgdGhpcy5hZGRMZWdlbmRzKGxlZ2VuZENvbXAsIGxnXylcclxuICAgICAgICBlbHNlIGxlZ2VuZENvbXAubm9kZSgpLmFwcGVuZChsZy5kaXYubm9kZSgpKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgcmVsZXZhbnQgZGF0YXNldCBjb21wb25lbnQgZm9yIGEgc3BlY2lmaWVkIHpvb20uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcclxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuRGF0YXNldHx1bmRlZmluZWR9XHJcbiAgICAgKiAqL1xyXG4gICAgZ2V0RGF0YXNldCh6KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNldC5nZXREYXRhc2V0KHosIHRoaXMubWluUGl4ZWxzUGVyQ2VsbCk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldC9nZXQgc3R5bGUgc3RhY2suXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7dW5kZWZpbmVkfGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU3R5bGV8QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU3R5bGU+fSBzdHlsZXMgXHJcbiAgICAgKiBAcmV0dXJucyB7IHRoaXMgfCBBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT4gfVxyXG4gICAgICovXHJcbiAgICBzdHlsZXNfKHN0eWxlcykge1xyXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5zdHlsZXNcclxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGVzKSkgdGhpcy5zdHlsZXMgPSBzdHlsZXNcclxuICAgICAgICAgICAgZWxzZSB0aGlzLnN0eWxlcyA9IFtzdHlsZXNdXHJcbiAgICAgICAgZWxzZSB0aGlzLnN0eWxlcyA9IGFyZ3VtZW50c1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHJldHVybmluZyBjZWxsIGluZm9ybWF0aW9uIGFzIEhUTUwuXHJcbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciB0b29sdGlwIGluZm9ybWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGx9IGNlbGxcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBkZWZhdWx0Q2VsbEluZm9IVE1MKGNlbGwpIHtcclxuICAgICAgICBjb25zdCBidWYgPSBbXVxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNlbGwpKSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICd4JykgY29udGludWVcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3knKSBjb250aW51ZVxyXG4gICAgICAgICAgICBidWYucHVzaCgnPGI+Jywga2V5LCAnPC9iPicsICcgOiAnLCBjZWxsW2tleV0sICc8YnI+JylcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJ1Zi5qb2luKCcnKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xyXG5pbXBvcnQgeyBjc3YgfSBmcm9tICdkMy1mZXRjaCdcclxuXHJcbi8qKiBBIGxhYmVsLiBUaGUgbmFtZSBpcyB0aGUgdGV4dCB0byBzaG93LiAoeCx5KSBhcmUgdGhlIGNvb3JkaW5hdGVzIGluIHRoZSBzYW1lIENSUyBhcyB0aGUgZ3JpZC5cclxuICogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmcsIHg6bnVtYmVyLCB5Om51bWJlciB9fSBMYWJlbCAqL1xyXG5cclxuLyoqXHJcbiAqIEEgKGdlbmVyaWMpIGxheWVyIGZvciBwbGFjZW5hbWUgbGFiZWxzLCB0byBiZSBzaG93biBvbiB0b3Agb2YgdGhlIGdyaWQgbGF5ZXJzLlxyXG4gKiBUaGUgaW5wdXQgaXMgYSBDU1YgZmlsZSB3aXRoIHRoZSBwb3NpdGlvbiAoeCwgeSkgb2YgdGhlIGxhYmVscyBhbmQgbmFtZSArIHNvbWUgb3RoZXIgaW5mbyBvbiB0aGUgbGFiZWwgaW1wb3J0YW5jZS5cclxuICogSWYgdGhlIGxhYmVsIGRhdGEgaXMgbm90IGluIHRoZSBleHBlY3RlZCBmb3JtYXQgb3IgaW4gdGhlIHNhbWUgQ1JTIGFzIHRoZSBncmlkLCBpdCBjYW4gYmUgY29ycmVjdGVkIHdpdGggdGhlIFwicHJlcHJvY2Vzc1wiIGZ1bmN0aW9uLlxyXG4gKiBUaGUgc2VsZWN0aW9uIG9mIHRoZSBsYWJlbCwgdGhlaXIgc3R5bGUgKGZvbnQsIHdlaWdodCwgZXRjLikgYW5kIGNvbG9yIGNhbiBiZSBzcGVjaWZpZWQgZGVwZW5kaW5nIG9uIHRoZWlyIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxyXG4gKlxyXG4gKiBAbW9kdWxlIGxheWVyXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBMYWJlbExheWVyIGV4dGVuZHMgTGF5ZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgVVJMIG9mIHRoZSBsYWJlbCBkYXRhLCBhcyBDU1YgZmlsZS5cclxuICAgICAgICAgKiBUaGUgZmlsZSBzaG91bGQgY29udGFpbiB0aGUgaW5mb3JtYXRpb24gZm9yIGVhY2ggbGFiZWwgc3VjaCBhcyB0aGUgdGV4dCwgdGhlIHBvc2l0aW9uIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGRpc3BsYXkgb2YgdGhlIGxhYmVsIGFjY29yZGluZyB0byB0aGUgem9vbSBsZXZlbC5cclxuICAgICAgICAgKiBJZiBuZWNlc3NhcnksIHRoaXMgZGF0YSBjYW4gYmUgcmVmb3JtYXRlZCB3aXRoIHRoZSAncHJlcHJvY2VzcycgcGFyYW1ldGVyLlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXHJcblxyXG4gICAgICAgIC8qKiBTcGVjaWZ5IGlmIGFuZCBob3cgYSBsYWJlbCBzaG91bGQgYmUgZHJhd24sIGRlcGVuZGluZyBvbiBpdHMgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5zdHlsZSA9IG9wdHMuc3R5bGUgfHwgKCgpID0+ICdib2xkIDFlbSBBcmlhbCcpXHJcblxyXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBjb2xvciwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAob3B0cy5kYXJrID8gKCkgPT4gJyNkZGQnIDogKCkgPT4gJyMyMjInKVxyXG5cclxuICAgICAgICAvKiogU3BlY2lmeSB0aGUgbGFiZWwgaGFsbyBjb2xvciwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmhhbG9Db2xvciA9IG9wdHMuaGFsb0NvbG9yIHx8IChvcHRzLmRhcmsgPyAoKSA9PiAnIzAwMDAwMEJCJyA6ICgpID0+ICcjRkZGRkZGQkInKVxyXG5cclxuICAgICAgICAvKiogU3BlY2lmeSB0aGUgbGFiZWwgaGFsbyB3aWR0aCwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmhhbG9XaWR0aCA9IG9wdHMuaGFsb1dpZHRoIHx8ICgoKSA9PiA0KVxyXG5cclxuICAgICAgICAvKiogVGhlIGFuY2hvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0LCBmcm9tIGxhYmVsIHBvc2l0aW9uLiBTZWUgSFRNTC1jYW52YXMgdGV4dEFsaWduIHByb3BlcnR5LlxyXG4gICAgICAgICAqIFwibGVmdFwiIHx8IFwicmlnaHRcIiB8fCBcImNlbnRlclwiIHx8IFwic3RhcnRcIiB8fCBcImVuZFwiXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7Q2FudmFzVGV4dEFsaWdufSAqL1xyXG4gICAgICAgIHRoaXMudGV4dEFsaWduID0gb3B0cy50ZXh0QWxpZ24gfHwgJ3N0YXJ0J1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cclxuICAgICAgICB0aGlzLm9mZnNldFBpeCA9IG9wdHMub2Zmc2V0UGl4IHx8IFs1LCA1XVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggbGFiZWwgYWZ0ZXIgbG9hZGluZy5cclxuICAgICAgICAgKiBJdCBjYW4gYmUgdXNlZCB0byBhcHBseSBzb21lIHNwZWNpZmljIHRyZWF0bWVudCBiZWZvcmUsIGZvcm1hdCB0aGUgbGFiZWwgZGF0YSwgcHJvamVjdCBjb29yZGluYXRlcywgZXRjLlxyXG4gICAgICAgICAqIFJldHVybiBmYWxzZSBpZiB0aGUgbGFiZWwgc2hvdWxkIG5vdCBiZSBrZXB0LlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsKTpib29sZWFufSAqL1xyXG4gICAgICAgIHRoaXMucHJlcHJvY2VzcyA9IG9wdHMucHJlcHJvY2Vzc1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48TGFiZWw+IHwgdW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMubGFiZWxzID0gdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyB0aGUgbGFiZWwgbGF5ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XHJcbiAgICAgICAgLy9sb2FkIGxhYmVscywgaWYgbm90IGRvbmUgeWV0LlxyXG4gICAgICAgIGlmICghdGhpcy5sYWJlbHMpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkKGdlb0NhbnZhcy5yZWRyYXcpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxyXG5cclxuICAgICAgICAvL3RleHQgYWxpZ25cclxuICAgICAgICBnZW9DYW52YXMuY3R4LnRleHRBbGlnbiA9IHRoaXMudGV4dEFsaWduIHx8ICdzdGFydCdcclxuXHJcbiAgICAgICAgLy9saW5lIGpvaW4gYW5kIGNhcFxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUpvaW4gPSAnYmV2ZWwnIC8vfHwgXCJyb3VuZFwiIHx8IFwibWl0ZXJcIjtcclxuICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVDYXAgPSAnYnV0dCcgLy98fCBcInJvdW5kXCIgfHwgXCJzcXVhcmVcIjtcclxuXHJcbiAgICAgICAgLy9kcmF3IGluIHBpeCBjb29yZGluYXRlc1xyXG4gICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgLy9kcmF3IGxhYmVscywgb25lIGJ5IG9uZVxyXG4gICAgICAgIGZvciAoY29uc3QgbGIgb2YgdGhpcy5sYWJlbHMpIHtcclxuICAgICAgICAgICAgLy9nZXQgbGFiZWwgc3R5bGVcclxuICAgICAgICAgICAgY29uc3Qgc3QgPSB0aGlzLnN0eWxlKGxiLCB6KVxyXG4gICAgICAgICAgICBpZiAoIXN0KSBjb250aW51ZVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZvbnQgPSBzdFxyXG5cclxuICAgICAgICAgICAgLy9jaGVjayBsYWJlbCB3aXRoaW4gdGhlIHZpZXcsIHRvIGJlIGRyYXduXHJcbiAgICAgICAgICAgIGlmICghZ2VvQ2FudmFzLnRvRHJhdyhsYikpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3Bvc2l0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IHhQID0gZ2VvQ2FudmFzLmdlb1RvUGl4WChsYi54KSArIHRoaXMub2Zmc2V0UGl4WzBdXHJcbiAgICAgICAgICAgIGNvbnN0IHlQID0gZ2VvQ2FudmFzLmdlb1RvUGl4WShsYi55KSAtIHRoaXMub2Zmc2V0UGl4WzFdXHJcblxyXG4gICAgICAgICAgICAvL2xhYmVsIHN0cm9rZSwgZm9yIHRoZSBoYWxvXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmhhbG9Db2xvciAmJiB0aGlzLmhhbG9XaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaGMgPSB0aGlzLmhhbG9Db2xvcihsYiwgeilcclxuICAgICAgICAgICAgICAgIGNvbnN0IGh3ID0gdGhpcy5oYWxvV2lkdGgobGIsIHopXHJcbiAgICAgICAgICAgICAgICBpZiAoaGMgJiYgaHcgJiYgaHcgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IGhjXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSBod1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlVGV4dChsYi5uYW1lLCB4UCwgeVApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vbGFiZWwgZmlsbFxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb2xvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihsYiwgeilcclxuICAgICAgICAgICAgICAgIGlmIChjb2wpIHtcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9IGNvbFxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFRleHQobGIubmFtZSwgeFAsIHlQKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZCBkYXRhIGZvciBsYWJlbHMsIGZyb20gVVJMIHRoaXMudXJsXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6dm9pZH0gY2FsbGJhY2tcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGxvYWQoY2FsbGJhY2spIHtcclxuICAgICAgICBpZiAoIXRoaXMudXJsKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBsYWJlbHM6IE5vIFVSTCBzcGVjaWZpZWQuICcgKyB0aGlzLnVybClcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcclxuICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vY2hlY2sgaWYgZGF0YSBhbHJlYWR5IGxvYWRlZFxyXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVyblxyXG5cclxuICAgICAgICAvL2xvYWQgZGF0YVxyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48TGFiZWw+IH0gKi9cclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGNzdih0aGlzLnVybClcclxuXHJcbiAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcclxuICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wcmVwcm9jZXNzKGMpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMucHVzaChjKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9zdG9yZSBsYWJlbHNcclxuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxzID0gZGF0YVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbG9hZGVkJ1xyXG5cclxuICAgICAgICAgICAgLy9yZWRyYXdcclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGxhYmVscyBmcm9tICcgKyB0aGlzLnVybClcclxuICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGNvbG9yIGNhdGVncm9yaWVzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIGxlZ2VuZFxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29sb3JDYXRlZ29yeUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XHJcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8vY29sL2NhdGVnb3JpZXMgYXJyYXksIGluIGRpc3BsYXkgb3JkZXJcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48W3N0cmluZyxzdHJpbmddPn0gKi9cclxuICAgICAgICB0aGlzLmNvbG9yTGFiZWwgPSBvcHRzLmNvbG9yTGFiZWwgfHwgW1snZ3JheScsICctJ11dXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvU3R5bGUuanNcIikuU2hhcGV9ICovXHJcbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgJ2NpcmNsZSdcclxuICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IG9wdHMuZGltZW5zaW9uIHx8IHsgcjogOCB9XHJcbiAgICAgICAgdGhpcy5zdHJva2VDb2xvciA9IG9wdHMuc3Ryb2tlQ29sb3IgfHwgJ2dyYXknXHJcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgMVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICovXHJcbiAgICB1cGRhdGUoKSB7XHJcblxyXG4gICAgICAgIC8vY2xlYXJcclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxyXG5cclxuICAgICAgICAvL3RpdGxlXHJcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxyXG5cclxuICAgICAgICAvL2NhdGVnb3JpZXNcclxuICAgICAgICBjb25zdCBuYiA9IHRoaXMuY29sb3JMYWJlbC5sZW5ndGhcclxuICAgICAgICBpZiAobmIgPT0gMCkgcmV0dXJuXHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjYXQgPSB0aGlzLmNvbG9yTGFiZWxbaV1cclxuXHJcbiAgICAgICAgICAgIC8vbWFrZSBkaXYgZm9yIGNhdGVnb3J5XHJcbiAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgIC8vdG8gZW5hYmxlIHZlcnRpY2FsIGNlbnRlcmluZ1xyXG4gICAgICAgICAgICAvLy5zdHlsZShcInBvc2l0aW9uXCIsIFwicmVsYXRpdmVcIilcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN3ID0gdGhpcy5zdHJva2VXaWR0aFxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGdyYXBoaWMgZWxlbWVudDogYm94IC8gY2lyY2xlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNoYXBlID09PSAnc3F1YXJlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IHRoaXMuZGltZW5zaW9uLmggfHwgMTVcclxuICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB0aGlzLmRpbWVuc2lvbi53IHx8IDIwXHJcbiAgICAgICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3ICsgMiAqIHN3KVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoICsgMiAqIHN3KVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdyZWN0JylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cigneCcsIHN3KVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd5Jywgc3cpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaClcclxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCBjYXRbMF0pXHJcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuZGltZW5zaW9uLnIgfHwgOFxyXG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IDIgKiByICsgMiAqIHN3XHJcbiAgICAgICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBoKVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdjaXJjbGUnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHIgKyBzdylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignY3knLCByICsgc3cpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3InLCByKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGNhdFswXSlcclxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuc3Ryb2tlQ29sb3IpXHJcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCB0aGlzLnN0cm9rZVdpZHRoKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyB0aGlzLnNoYXBlKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL3dyaXRlIGxhYmVsIHRleHRcclxuICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgICAgICAvL3Nob3cgb24gcmlnaHQgb2YgZ3JhcGhpY1xyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXHJcblxyXG4gICAgICAgICAgICAgICAgLy9jZW50ZXIgdmVydGljYWxseVxyXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcImFic29sdXRlXCIpLnN0eWxlKFwidG9wXCIsIFwiMFwiKS5zdHlsZShcImJvdHRvbVwiLCBcIjBcIilcclxuXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsICc1cHgnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXHJcbiAgICAgICAgICAgICAgICAudGV4dChjYXRbMV0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXHJcblxyXG4vKipcclxuICogQSBsZWdlbmQgZWxlbWVudCBmb3IgZGlzY3JldGUgY29sb3Igc3R5bGUuXHJcbiAqIEluc3BpcmF0aW9uOiBodHRwczovL29ic2VydmFibGVocS5jb20vQGQzL2NvbG9yLWxlZ2VuZFxyXG4gKlxyXG4gKiBAbW9kdWxlIGxlZ2VuZFxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29sb3JEaXNjcmV0ZUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XHJcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlKTpBcnJheS48c3RyaW5nPn0gKi9cclxuICAgICAgICB0aGlzLmNvbG9ycyA9IG9wdHMuY29sb3JzXHJcbiAgICAgICAgLyoqIEBwcml2YXRlIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvU3R5bGUnKS5WaWV3U2NhbGUpOkFycmF5LjxudW1iZXI+fSAqL1xyXG4gICAgICAgIHRoaXMuYnJlYWtzID0gb3B0cy5icmVha3NcclxuXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMzAwXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAxNVxyXG5cclxuICAgICAgICB0aGlzLnRpY2tTaXplID0gb3B0cy50aWNrU2l6ZSB8fCAzXHJcblxyXG4gICAgICAgIC8vbGFiZWxcclxuICAgICAgICB0aGlzLmludmVydCA9IG9wdHMuaW52ZXJ0XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge3t2aWV3U2NhbGU6aW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlfSB9IG9wdHNcclxuICAgICAqL1xyXG4gICAgdXBkYXRlKG9wdHMpIHtcclxuXHJcbiAgICAgICAgLy9jbGVhclxyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXHJcblxyXG4gICAgICAgIC8vdGl0bGVcclxuICAgICAgICB0aGlzLm1ha2VUaXRsZSgpXHJcblxyXG4gICAgICAgIC8vZ2V0IGNvbG9ycyBhbmQgYnJlYWtzXHJcbiAgICAgICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnMob3B0cy52aWV3U2NhbGUpXHJcbiAgICAgICAgY29uc3QgYnJlYWtzID0gdGhpcy5icmVha3Mob3B0cy52aWV3U2NhbGUpXHJcbiAgICAgICAgaWYgKCFicmVha3MpIHJldHVyblxyXG5cclxuICAgICAgICAvL2NsYXNzZXNcclxuICAgICAgICBjb25zdCBuYiA9IGNvbG9ycy5sZW5ndGhcclxuICAgICAgICBpZiAobmIgPT0gMCkgcmV0dXJuXHJcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGggLyBuYlxyXG5cclxuICAgICAgICAvL21ha2Ugc3ZnIGVsZW1lbnRcclxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdlxyXG4gICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCB0aGlzLndpZHRoKVxyXG4gICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgdGhpcy5oZWlnaHQgKyB0aGlzLnRpY2tTaXplICsgMiArIDEwKVxyXG5cclxuICAgICAgICAvL2RyYXcgZ3JhcGhpYyBlbGVtZW50c1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xyXG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdyZWN0JylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgaSAqIHcpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3KVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgY29sb3JzW2ldKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy90aWNrIGxpbmVcclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcclxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgnbGluZScpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCB3ICogaSlcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneDInLCB3ICogaSlcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MicsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSlcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ2JsYWNrJylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vbGFiZWxzXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuYjsgaSsrKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBicmVha3NbaSAtIDFdXHJcbiAgICAgICAgICAgIGlmIChpc05hTihsYWJlbCkgfHwgbGFiZWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZih0aGlzLmxhYmVsRm9ybWF0KSBsYWJlbCA9IHRoaXMubGFiZWxGb3JtYXQobGFiZWwpXHJcblxyXG4gICAgICAgICAgICAvL2xhYmVsXHJcbiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ3RpY2tsYWJlbF8nICsgaSlcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgdyAqIGkpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDIpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcclxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC13ZWlnaHRcIiwgXCJib2xkXCIpXHJcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtZmFtaWx5XCIsIFwiQXJpYWxcIilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYWxpZ25tZW50LWJhc2VsaW5lJywgJ3RvcCcpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdub25lJylcclxuICAgICAgICAgICAgICAgIC50ZXh0KGxhYmVsKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGNvbnRpbnVvdXMgY29sb3Igc3R5bGUuXHJcbiAqIEluc3BpcmF0aW9uOiBodHRwczovL29ic2VydmFibGVocS5jb20vQGQzL2NvbG9yLWxlZ2VuZFxyXG4gKlxyXG4gKiBAbW9kdWxlIGxlZ2VuZFxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29sb3JMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xyXG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvL2EgZnVuY3Rpb24gWzAsMV0tPmNvbG9yIGZvciBjb250aW51b3VzIGNvbG9ycy5cclxuICAgICAgICAvL2l0IGNhbiB0YWtlIGFzIHNlY29uZCBhcmd1bWVudCB0aGUgdmlld3NjYWxlLlxyXG4gICAgICAgIHRoaXMuY29sb3JTY2FsZSA9IG9wdHMuY29sb3JTY2FsZVxyXG5cclxuICAgICAgICAvL2Z1bmN0aW9uICh0WzAsMV0pIC0+IHZhbHVlIChmb3IgbGFiZWwgdGV4dClcclxuICAgICAgICAvL2l0IGNhbiB0YWtlIGFzIHNlY29uZCBhcmd1bWVudCB0aGUgdmlld3NjYWxlLlxyXG4gICAgICAgIHRoaXMudGV4dFNjYWxlID0gb3B0cy50ZXh0U2NhbGUgfHwgKHQgPT4gdClcclxuXHJcbiAgICAgICAgdGhpcy5tYXJnaW4gPSBvcHRzLm1hcmdpbiB8fCA1XHJcblxyXG4gICAgICAgIC8vcmVwbGFjZSB3aXRoIGxhYmVscyA/XHJcbiAgICAgICAgdGhpcy50aWNrU2l6ZSA9IG9wdHMudGlja1NpemUgfHwgNlxyXG4gICAgICAgIHRoaXMudGlja3MgPSBvcHRzLnRpY2tzIHx8IE1hdGguZmxvb3IodGhpcy53aWR0aCAvIDUwKVxyXG4gICAgICAgIHRoaXMudGlja0Zvcm1hdCA9IG9wdHMudGlja0Zvcm1hdFxyXG4gICAgICAgIHRoaXMudGlja1VuaXQgPSBvcHRzLnRpY2tVbml0XHJcblxyXG4gICAgICAgIHRoaXMuZm9udFNpemUgPSBvcHRzLmZvbnRTaXplIHx8ICcwLjhlbSdcclxuICAgICAgICB0aGlzLmludmVydCA9IG9wdHMuaW52ZXJ0XHJcblxyXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8IDMwMFxyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgMTVcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7e3ZpZXdTY2FsZTppbXBvcnQoJy4uL2NvcmUvU3R5bGUnKS5WaWV3U2NhbGV9IH0gb3B0c1xyXG4gICAgICovXHJcbiAgICB1cGRhdGUob3B0cykge1xyXG5cclxuICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgLy90aXRsZVxyXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcclxuXHJcbiAgICAgICAgY29uc3Qgc3ZnVyA9IHRoaXMud2lkdGggKyAyICogdGhpcy5tYXJnaW5cclxuICAgICAgICBjb25zdCBzdmdIID0gdGhpcy5oZWlnaHQgKyB0aGlzLm1hcmdpbiArIHRoaXMudGlja1NpemUgKyAxMFxyXG4gICAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuZGl2LmFwcGVuZCgnc3ZnJykuYXR0cignd2lkdGgnLCBzdmdXKS5hdHRyKCdoZWlnaHQnLCBzdmdIKVxyXG4gICAgICAgIC8vICA8cmVjdCB3aWR0aD1cIjMwMFwiIGhlaWdodD1cIjEwMFwiIHN0eWxlPVwiZmlsbDpyZ2IoMCwwLDI1NSk7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlOnJnYigwLDAsMClcIiAvPlxyXG5cclxuICAgICAgICBjb25zdCBnID0gc3ZnXHJcbiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgdGhpcy5tYXJnaW4gKyAnICcgKyAwICsgJyknKVxyXG5cclxuICAgICAgICAvL2RyYXcgY29sb3IgYmFyXHJcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGgsXHJcbiAgICAgICAgICAgIGggPSB0aGlzLmhlaWdodFxyXG4gICAgICAgIGNvbnN0IHN0ZXAgPSA1XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3OyBpICs9IHN0ZXApIHtcclxuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHcgLSAxKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnZlcnQpIHQgPSAxIC0gdFxyXG4gICAgICAgICAgICBnLmFwcGVuZCgncmVjdCcpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIGkpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzdGVwKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGgpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmNvbG9yU2NhbGUodCwgb3B0cy52aWV3U2NhbGUpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRpY2tzOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHRoaXMudGlja3MgLSAxKVxyXG5cclxuICAgICAgICAgICAgLy90aWNrIGxpbmVcclxuICAgICAgICAgICAgZy5hcHBlbmQoJ2xpbmUnKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gxJywgdyAqIHQpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCAwKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gyJywgdyAqIHQpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneTInLCBoICsgdGhpcy50aWNrU2l6ZSlcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ2JsYWNrJylcclxuXHJcbiAgICAgICAgICAgIC8vcHJlcGFyZSB0aWNrIGxhYmVsXHJcbiAgICAgICAgICAgIGcuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICd0aWNrbGFiZWxfJyArIGkpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIHcgKiB0KVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCBoICsgdGhpcy50aWNrU2l6ZSArIDIpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpXHJcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtd2VpZ2h0XCIsIFwiYm9sZFwiKVxyXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LWZhbWlseVwiLCBcIkFyaWFsXCIpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgaSA9PSAwID8gJ3N0YXJ0JyA6IGkgPT0gdGhpcy50aWNrcyAtIDEgPyAnZW5kJyA6ICdtaWRkbGUnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdhbGlnbm1lbnQtYmFzZWxpbmUnLCAndG9wJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZG9taW5hbnQtYmFzZWxpbmUnLCAnaGFuZ2luZycpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxyXG4gICAgICAgICAgICAvLy50ZXh0KFwiLVwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy91cGRhdGUgdGljayBsYWJlbHNcclxuXHJcbiAgICAgICAgLy9sYWJlbCB0ZXh0IGZvcm1hdFxyXG4gICAgICAgIGNvbnN0IGYgPSB0aGlzLnRpY2tGb3JtYXQgJiYgdGhpcy50aWNrRm9ybWF0ICE9ICd0ZXh0JyA/IHRoaXMudGlja0Zvcm1hdCA6ICh2KSA9PiB2XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRpY2tzOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHRoaXMudGlja3MgLSAxKVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMudGV4dFNjYWxlKHQsIG9wdHMudmlld1NjYWxlKVxyXG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gKHYgPyBmKHYpIDogJzAnKSArICh0aGlzLnRpY2tVbml0ID8gdGhpcy50aWNrVW5pdCA6ICcnKVxyXG4gICAgICAgICAgICBpZiAodGV4dCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3RpY2sgbGFiZWxcclxuICAgICAgICAgICAgdGhpcy5kaXYuc2VsZWN0KCcjJyArICd0aWNrbGFiZWxfJyArIGkpLnRleHQodGV4dClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9jb3JlL0xlZ2VuZC5qcydcclxuXHJcbi8qKlxyXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBzZWdtZW50IG9yaWVudGF0aW9uLlxyXG4gKlxyXG4gKiBAbW9kdWxlIGxlZ2VuZFxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgT3JpZW50YXRpb25MZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xyXG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvL29yaWVudGF0aW9uXHJcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgMFxyXG4gICAgICAgIC8vY29sb3JcclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gJ2dyYXknKVxyXG4gICAgICAgIC8vd2lkdGhcclxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gMyAqIHopXHJcbiAgICAgICAgLy9sZW5ndGhcclxuICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdHMubGVuZ3RoIHx8ICgocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA9PiByZXNvbHV0aW9uKVxyXG5cclxuICAgICAgICAvL2xhYmVsXHJcbiAgICAgICAgdGhpcy5sYWJlbCA9IG9wdHMubGFiZWwgfHwgXCItXCJcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7eyBzdHlsZTogaW1wb3J0KFwiLi4vc3R5bGUvU2VnbWVudFN0eWxlLmpzXCIpLlNlZ21lbnRTdHlsZSwgcmVzb2x1dGlvbjogbnVtYmVyLCB6OiBudW1iZXIsIHZpZXdTY2FsZTpvYmplY3QgfX0gb3B0c1xyXG4gICAgICovXHJcbiAgICB1cGRhdGUob3B0cykge1xyXG5cclxuICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgLy90aXRsZVxyXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcclxuXHJcbiAgICAgICAgY29uc3QgZCA9IHRoaXMuZGl2LmFwcGVuZCgnZGl2JylcclxuXHJcbiAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgY29sb3IsIHdpZHRoIGFuZCBsZW5ndGhcclxuICAgICAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3Iob3B0cy5yZXNvbHV0aW9uLCBvcHRzLnosIG9wdHMudmlld1NjYWxlKVxyXG4gICAgICAgIGNvbnN0IHdpZHRoUGl4ID0gdGhpcy53aWR0aChvcHRzLnJlc29sdXRpb24sIG9wdHMueiwgb3B0cy52aWV3U2NhbGUpIC8gb3B0cy56XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoUGl4ID0gdGhpcy5sZW5ndGgob3B0cy5yZXNvbHV0aW9uLCBvcHRzLnosIG9wdHMudmlld1NjYWxlKSAvIG9wdHMuelxyXG5cclxuICAgICAgICAvL2RyYXcgU1ZHIHNlZ21lbnRcclxuICAgICAgICBjb25zdCBzdmdTID0gTWF0aC5tYXgobGVuZ3RoUGl4LCB3aWR0aFBpeClcclxuICAgICAgICBjb25zdCBzdmcgPSBkLmFwcGVuZCgnc3ZnJykuYXR0cignd2lkdGgnLCBzdmdTKS5hdHRyKCdoZWlnaHQnLCBzdmdTKS5zdHlsZSgnJywgJ2lubGluZS1ibG9jaycpXHJcblxyXG4gICAgICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKCgtdGhpcy5vcmllbnRhdGlvbiAqIE1hdGguUEkpIC8gMTgwKVxyXG4gICAgICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKCgtdGhpcy5vcmllbnRhdGlvbiAqIE1hdGguUEkpIC8gMTgwKVxyXG4gICAgICAgIGNvbnN0IGRjID0gc3ZnUyAqIDAuNSxcclxuICAgICAgICAgICAgbDIgPSBsZW5ndGhQaXggKiAwLjVcclxuICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcclxuICAgICAgICAgICAgLmF0dHIoJ3gxJywgZGMgLSBjb3MgKiBsMilcclxuICAgICAgICAgICAgLmF0dHIoJ3kxJywgZGMgLSBzaW4gKiBsMilcclxuICAgICAgICAgICAgLmF0dHIoJ3gyJywgZGMgKyBjb3MgKiBsMilcclxuICAgICAgICAgICAgLmF0dHIoJ3kyJywgZGMgKyBzaW4gKiBsMilcclxuICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCBjb2xvcilcclxuICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCB3aWR0aFBpeClcclxuXHJcblxyXG4gICAgICAgIC8vbGFiZWxcclxuICAgICAgICBkLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXHJcbiAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxyXG4gICAgICAgICAgICAudGV4dCh0aGlzLmxhYmVsICsgKHRoaXMubGFiZWxVbml0VGV4dCA/ICcgJyA6ICcnKSArIHRoaXMubGFiZWxVbml0VGV4dClcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFxyXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBvcmllbnRhdGlvbnMgXHJcbiAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGxhYmVscyBcclxuICogQHBhcmFtIHtvYmplY3R9IG9wdHMgXHJcbiAqIEByZXR1cm5zICB7IEFycmF5LjxPcmllbnRhdGlvbkxlZ2VuZD4gfVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9yaWVudGF0aW9uTGVnZW5kKG9yaWVudGF0aW9ucywgbGFiZWxzLCBvcHRzID0ge30pIHtcclxuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmllbnRhdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBvcHRzLnRpdGxlID0gaSA9PSAwID8gb3B0cy50aXRsZSA6IHVuZGVmaW5lZDtcclxuICAgICAgICBvcHRzLm9yaWVudGF0aW9uID0gb3JpZW50YXRpb25zW2ldXHJcbiAgICAgICAgb3B0cy5sYWJlbCA9IGxhYmVsc1tpXVxyXG4gICAgICAgIGxlZ2VuZHMucHVzaChuZXcgT3JpZW50YXRpb25MZWdlbmQob3B0cykpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGVnZW5kc1xyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXHJcbmltcG9ydCB7IG5pY2UgfSBmcm9tICcuLi91dGlscy91dGlscy5qcydcclxuaW1wb3J0IHsgbWF4IH0gZnJvbSAnZDMtYXJyYXknXHJcblxyXG4vKipcclxuICogQSBsZWdlbmQgZWxlbWVudCBmb3IgcHJvcG9ydGlvbmFsIHN5bWJvbHMuXHJcbiAqXHJcbiAqIEBtb2R1bGUgbGVnZW5kXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaXplTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcclxuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0ZXh0IGxhYmVsLCBmcm9tIHRoZSB2aWV3IHNjYWxlIGFuZCBsaXN0IG9mIGNlbGxzLCByZXNvbHV0aW9uIGFuZCB6b29tXHJcbiAgICAgICAgICogIEB0eXBlIHsgZnVuY3Rpb24ob2JqZWN0LCBBcnJheS48aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsPiwgbnVtYmVyLCBudW1iZXIpOihudW1iZXJ8c3RyaW5nKSB9ICovXHJcbiAgICAgICAgdGhpcy5sYWJlbCA9IG9wdHMubGFiZWwgfHwgdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgbGVnZW5kIHN5bWJvbCwgaW4gZ2VvIFVvTSwgZnJvbSB0aGUgdmlld3NjYWxlLCByZXNvbHV0aW9uIGFuZCB6b29tXHJcbiAgICAgICAgICogIEB0eXBlIHsgZnVuY3Rpb24ob2JqZWN0LCBudW1iZXIsIG51bWJlcik6bnVtYmVyIH0gKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8vc3ltYm9sXHJcbiAgICAgICAgLyoqICBAdHlwZSB7KGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU2hhcGUpfFwibGluZVwifSAqL1xyXG4gICAgICAgIHRoaXMuc2hhcGUgPSBvcHRzLnNoYXBlIHx8ICdjaXJjbGUnXHJcblxyXG4gICAgICAgIC8vZ2VuZXJhbCBjYXNlXHJcbiAgICAgICAgdGhpcy5maWxsQ29sb3IgPSBvcHRzLmZpbGxDb2xvciB8fCAnbm9uZSdcclxuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAnZ3JheSdcclxuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoID0gb3B0cy5zdHJva2VXaWR0aCB8fCAxXHJcblxyXG4gICAgICAgIC8vZm9yIGxpbmUgc2hhcGVcclxuICAgICAgICAvL1RPRE8gdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgMFxyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICdncmF5J1xyXG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0cy5sZW5ndGggfHwgKChyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+IHJlc29sdXRpb24pXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge3sgdmlld1NjYWxlOm9iamVjdCwgcmVzb2x1dGlvbjogbnVtYmVyLCB6Om51bWJlciwgY2VsbHM6QXJyYXkuPGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbD4gfX0gb3B0c1xyXG4gICAgICovXHJcbiAgICB1cGRhdGUob3B0cykge1xyXG5cclxuICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgLy90aXRsZVxyXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcclxuXHJcbiAgICAgICAgLy9nZXQgbGFiZWwuIE1heSBub3QgYmUgYSBudW1iZXIgKCEpXHJcbiAgICAgICAgbGV0IGxhYmVsID0gdGhpcy5sYWJlbChvcHRzLnZpZXdTY2FsZSwgb3B0cy5jZWxscywgb3B0cy5yZXNvbHV0aW9uLCBvcHRzLnopXHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBzaXplIG9mIHN5bWJvbCwgaW4gcGl4XHJcbiAgICAgICAgbGV0IHNpemVQaXhcclxuICAgICAgICBpZiAodGhpcy5zaXplKVxyXG4gICAgICAgICAgICBzaXplUGl4ID0gdGhpcy5zaXplKG9wdHMudmlld1NjYWxlLCBvcHRzLnJlc29sdXRpb24sIG9wdHMueikgLyBvcHRzLnpcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHNpemVQaXggPSBvcHRzLnZpZXdTY2FsZSgrbGFiZWwpIC8gb3B0cy56XHJcbiAgICAgICAgaWYgKCFzaXplUGl4KSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9mb3JtYXQgbGFiZWwsIGlmIHNwZWNpZmllZCBhbmQgcG9zc2libGVcclxuICAgICAgICBpZiAodGhpcy5sYWJlbEZvcm1hdCAmJiAhaXNOYU4oK2xhYmVsKSkgbGFiZWwgPSB0aGlzLmxhYmVsRm9ybWF0KGxhYmVsKVxyXG5cclxuICAgICAgICBjb25zdCBkID0gdGhpcy5kaXYuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAgIC8vdG8gZW5hYmxlIHZlcnRpY2FsIGNlbnRlcmluZ1xyXG4gICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKVxyXG5cclxuICAgICAgICAvL2RlZmF1bHQgc3ZnIGNvbnN0cnVjdGlvbiwgZm9yIHNxdWFyZSBhbmQgY2lyY2xlXHJcbiAgICAgICAgY29uc3Qgc3ZnID0gKCkgPT4gZFxyXG4gICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzaXplUGl4ICsgdGhpcy5zdHJva2VXaWR0aCArIDIpXHJcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBzaXplUGl4ICsgdGhpcy5zdHJva2VXaWR0aCArIDIpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnJywgJ2lubGluZS1ibG9jaycpXHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNoYXBlID09PSAnc3F1YXJlJykge1xyXG4gICAgICAgICAgICBzdmcoKS5hcHBlbmQoJ3JlY3QnKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCAwKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAwKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgc2l6ZVBpeClcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBzaXplUGl4KVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5maWxsQ29sb3IpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuc3Ryb2tlQ29sb3IpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHRoaXMuc3Ryb2tlV2lkdGgpXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAvLyA8Y2lyY2xlIGN4PVwiNTBcIiBjeT1cIjUwXCIgcj1cIjQwXCIgc3Ryb2tlPVwiYmxhY2tcIiBzdHJva2Utd2lkdGg9XCIzXCIgZmlsbD1cInJlZFwiIC8+XHJcbiAgICAgICAgICAgIGNvbnN0IHIgPSAoc2l6ZVBpeCArIHRoaXMuc3Ryb2tlV2lkdGgpICogMC41XHJcbiAgICAgICAgICAgIHN2ZygpLmFwcGVuZCgnY2lyY2xlJylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHIgKyAxKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2N5JywgciArIDEpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigncicsIHIpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmZpbGxDb2xvcilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdkb251dCcpIHtcclxuICAgICAgICAgICAgLy9UT0RPXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnZGlhbW9uZCcpIHtcclxuICAgICAgICAgICAgLy9UT0RPXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnbGluZScpIHtcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IHNlZ21lbnQgbGVuZ3RoXHJcbiAgICAgICAgICAgIGxldCBsZW5ndGhQaXggPSB0aGlzLmxlbmd0aCA/IHRoaXMubGVuZ3RoKG9wdHMucmVzb2x1dGlvbiwgb3B0cy56LCBvcHRzLnZpZXdTY2FsZSkgOiBvcHRzLnJlc29sdXRpb25cclxuICAgICAgICAgICAgbGVuZ3RoUGl4IC89IG9wdHMuelxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3ZnID0gZC5hcHBlbmQoJ3N2ZycpLmF0dHIoJ3dpZHRoJywgbGVuZ3RoUGl4KS5hdHRyKCdoZWlnaHQnLCBzaXplUGl4KS5zdHlsZSgnJywgJ2lubGluZS1ibG9jaycpXHJcblxyXG4gICAgICAgICAgICAvL1RPRE8gb3JpZW50YXRpb25cclxuICAgICAgICAgICAgLy88bGluZSB4MT1cIjBcIiB5MT1cIjBcIiB4Mj1cIjIwMFwiIHkyPVwiMjAwXCIgc3R5bGU9XCJzdHJva2U6cmdiKDI1NSwwLDApO3N0cm9rZS13aWR0aDoyXCIgLz5cclxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgnbGluZScpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCAwKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgc2l6ZVBpeCAvIDIpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneDInLCBsZW5ndGhQaXgpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneTInLCBzaXplUGl4IC8gMilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5jb2xvcilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgc2l6ZVBpeClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHRoaXMuc2hhcGUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2xhYmVsXHJcbiAgICAgICAgZC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsICc1cHgnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcclxuICAgICAgICAgICAgLnRleHQobGFiZWwgKyAodGhpcy5sYWJlbFVuaXRUZXh0ID8gJyAnIDogJycpICsgdGhpcy5sYWJlbFVuaXRUZXh0KVxyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4vKipcclxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gdmFsdWVzIFxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfSBzaXplIFxyXG4gKiBAcGFyYW0geyBvYmplY3QgfSBvcHRzIFxyXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNpemVMZWdlbmQodmFsdWVzLCBzaXplLCBvcHRzID0ge30pIHtcclxuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxyXG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XHJcbiAgICAgICAgb3B0cy50aXRsZSA9IHZhbHVlID09IHZhbHVlc1swXSA/IG9wdHMudGl0bGUgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgb3B0cy5zaXplID0gKCkgPT4gc2l6ZSh2YWx1ZSlcclxuICAgICAgICBvcHRzLmxhYmVsID0gKCkgPT4gdmFsdWVcclxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGVnZW5kc1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHsgZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsKTpudW1iZXIgfSB2YWx1ZSBcclxuICogQHBhcmFtIHsqfSBvcHRzIFxyXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNpemVMZWdlbmRWaWV3U2NhbGUodmFsdWUsIG9wdHMgPSB7fSkge1xyXG4gICAgY29uc3QgayA9IG9wdHMuayB8fCBbMC45LCAwLjUsIDAuMiwgMC4wNV1cclxuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxyXG4gICAgZm9yIChsZXQga18gb2Ygaykge1xyXG4gICAgICAgIG9wdHMudGl0bGUgPSBrXyA9PSBrWzBdID8gb3B0cy50aXRsZSA6IHVuZGVmaW5lZFxyXG4gICAgICAgIG9wdHMubGFiZWwgPSAodmlld1NjYWxlLCBjZWxscykgPT4gbmljZShrXyAqIG1heChjZWxscywgdmFsdWUpKVxyXG4gICAgICAgIGxlZ2VuZHMucHVzaChuZXcgU2l6ZUxlZ2VuZChvcHRzKSlcclxuICAgIH1cclxuICAgIHJldHVybiBsZWdlbmRzXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGZ1bmN0aW9uIHdoaWNoIHJldHVybiBhIHN0YWNrIG9mIHNpemUgbGVnZW5kcyBmb3IgYSBkaXNjcmV0ZSBjbGFzc2lmaWNhdGlvbi5cclxuICogXHJcbiAqIEBwYXJhbSB7IEFycmF5LjxudW1iZXI+IH0gYnJlYWtzIFxyXG4gKiBAcGFyYW0geyBBcnJheS48bnVtYmVyPiB9IHNpemVzIFxyXG4gKiBAcGFyYW0geyBvYmplY3QgfSBvcHRzIFxyXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNpemVEaXNjcmV0ZUxlZ2VuZChicmVha3MsIHNpemVzLCBvcHRzID0ge30pIHtcclxuICAgIGNvbnN0IGYgPSBvcHRzLmxhYmVsRm9ybWF0IHx8ICh4ID0+IHgpXHJcbiAgICBjb25zdCBsYWJlbFRleHQgPSBvcHRzLmxhYmVsVGV4dCB8fCBkZWZhdWx0TGFiZWxUZXh0KGYpXHJcbiAgICBjb25zdCBsZWdlbmRzID0gW11cclxuICAgIGZvciAobGV0IGkgPSBzaXplcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIG9wdHMudGl0bGUgPSBpID09IHNpemVzLmxlbmd0aCAtIDEgPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkXHJcbiAgICAgICAgb3B0cy5zaXplID0gKCkgPT4gc2l6ZXNbaV1cclxuICAgICAgICBvcHRzLmxhYmVsID0gKCkgPT4gbGFiZWxUZXh0KGJyZWFrc1tpIC0gMV0sIGJyZWFrc1tpXSlcclxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGVnZW5kc1xyXG59XHJcblxyXG4vKipcclxuICogQSBmdW5jdGlvbiB3aGljaCByZXR1cm4gYSBzdGFjayBvZiBzaXplIGxlZ2VuZHMgZm9yIGEgZGlzY3JldGUgY2xhc3NpZmljYXRpb24gdXNpbmcgYSB2aWV3c2NhbGUuXHJcbiAqIEBwYXJhbSB7IG51bWJlciB9IGNsYXNzTnVtYmVyIFxyXG4gKiBAcGFyYW0geyBvYmplY3QgfSBvcHRzIFxyXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNpemVEaXNjcmV0ZVZpZXdTY2FsZUxlZ2VuZChjbGFzc051bWJlciwgb3B0cyA9IHt9KSB7XHJcbiAgICBjb25zdCBmID0gb3B0cy5sYWJlbEZvcm1hdCB8fCAoeCA9PiB4KVxyXG4gICAgY29uc3QgbGFiZWxUZXh0ID0gb3B0cy5sYWJlbFRleHQgfHwgZGVmYXVsdExhYmVsVGV4dChmKVxyXG4gICAgY29uc3QgbGVnZW5kcyA9IFtdXHJcbiAgICBjb25zdCB2aWV3U2NhbGVGdW4gPSBvcHRzLnZpZXdTY2FsZUZ1biB8fCAodCA9PiB0KSAvL1RPRE8gZG8gaXQgZGlmZmVyZW50bHk/IEF0IHNpemVsZWdlbmQgbGV2ZWwgIVxyXG4gICAgZm9yIChsZXQgaSA9IGNsYXNzTnVtYmVyIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBvcHRzLnRpdGxlID0gaSA9PSBjbGFzc051bWJlciAtIDEgPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkXHJcbiAgICAgICAgb3B0cy5zaXplID0gKHZpZXdTY2FsZSkgPT4gdmlld1NjYWxlRnVuKHZpZXdTY2FsZSkudmFsdWVzW2ldXHJcbiAgICAgICAgb3B0cy5sYWJlbCA9ICh2aWV3U2NhbGUpID0+IGxhYmVsVGV4dCh2aWV3U2NhbGVGdW4odmlld1NjYWxlKS5icmVha3NbaSAtIDFdLCB2aWV3U2NhbGVGdW4odmlld1NjYWxlKS5icmVha3NbaV0pXHJcbiAgICAgICAgbGVnZW5kcy5wdXNoKG5ldyBTaXplTGVnZW5kKG9wdHMpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxlZ2VuZHNcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gZm9ybWF0IGxhYmVybHMgZm9yIGRpc2NyZXRlIHNjYWxlIGxlZ2VuZHMuXHJcbiAqIEBwYXJhbSB7IGZ1bmN0aW9uKG51bWJlcik6c3RyaW5nIH0gZm9ybWF0IFxyXG4gKiBAcmV0dXJucyB7IGZ1bmN0aW9uKG51bWJlcnx1bmRlZmluZWQsIG51bWJlcnx1bmRlZmluZWQpOiBzdHJpbmcgfVxyXG4gKi9cclxuZnVuY3Rpb24gZGVmYXVsdExhYmVsVGV4dChmb3JtYXQpIHtcclxuICAgIHJldHVybiAodjAsIHYxKSA9PiB7XHJcbiAgICAgICAgaWYgKHYwID09IHVuZGVmaW5lZCAmJiB2MSA9PSB1bmRlZmluZWQpIHJldHVybiBcIlwiXHJcbiAgICAgICAgaWYgKHYxID09IHVuZGVmaW5lZCkgcmV0dXJuIFwiPiBcIiArIGZvcm1hdCh2MClcclxuICAgICAgICBpZiAodjAgPT0gdW5kZWZpbmVkKSByZXR1cm4gXCI8IFwiICsgZm9ybWF0KHYxKVxyXG4gICAgICAgIHJldHVybiBmb3JtYXQodjApICsgXCIgLSBcIiArIGZvcm1hdCh2MSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcclxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXHJcblxyXG4vKipcclxuICpcclxuICogQG1vZHVsZSBsZWdlbmRcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRlcm5hcnlMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xyXG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvL2NsYXNzaWZpZXJcclxuICAgICAgICB0aGlzLmNsYXNzaWZpZXIgPSBvcHRzLmNsYXNzaWZpZXJcclxuXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMTUwXHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Db2xvciA9IHRoaXMuc2VsZWN0aW9uQ29sb3IgfHwgXCJyZWRcIlxyXG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG9wdHMudG9vbHRpcFxyXG4gICAgICAgIHRoaXMudGV4dHMgPSBvcHRzLnRleHRzXHJcblxyXG4gICAgICAgIHRoaXMubGVmdFRleHQgPSBvcHRzLmxlZnRUZXh0IHx8IFwiQ2F0ZWdvcnkgMFwiXHJcbiAgICAgICAgdGhpcy50b3BUZXh0ID0gb3B0cy50b3BUZXh0IHx8IFwiQ2F0ZWdvcnkgMVwiXHJcbiAgICAgICAgdGhpcy5yaWdodFRleHQgPSBvcHRzLnJpZ2h0VGV4dCB8fCBcIkNhdGVnb3J5IDJcIlxyXG5cclxuICAgICAgICB0aGlzLmNlbnRlckNvZWZmaWNpZW50ID0gb3B0cy5jZW50ZXJDb2VmZmljaWVudCB8fCB0aGlzLmNsYXNzaWZpZXIuY2VudGVyQ29lZmZpY2llbnRcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7e30gfSBvcHRzXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZShvcHRzKSB7XHJcblxyXG4gICAgICAgIC8vY2xlYXJcclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxyXG5cclxuICAgICAgICAvL3RpdGxlXHJcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxyXG5cclxuICAgICAgICBjb25zdCBzcXJ0M292ZXIyID0gMC44NjYwMjVcclxuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCwgaCA9IHcgKiBzcXJ0M292ZXIyXHJcbiAgICAgICAgY29uc3QgY2xhc3NpZmllciA9IHRoaXMuY2xhc3NpZmllclxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbG9yID0gdGhpcy5zZWxlY3Rpb25Db2xvclxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvblN0cm9rZVdpZHRoID0gMFxyXG4gICAgICAgIGNvbnN0IHR0ID0gdGhpcy50b29sdGlwXHJcbiAgICAgICAgY29uc3QgdGV4dHMgPSB0aGlzLnRleHRzIHx8IHt9XHJcblxyXG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSAyXHJcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSAxMlxyXG5cclxuICAgICAgICAvL21ha2Ugc3ZnIGVsZW1lbnRcclxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdlxyXG4gICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3ICsgc2VsZWN0aW9uU3Ryb2tlV2lkdGgpXHJcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoICsgNCAqIHBhZGRpbmcgKyAyICogZm9udFNpemUpXHJcblxyXG4gICAgICAgIC8vdG9wIGxhYmVsXHJcbiAgICAgICAgc3ZnLmFwcGVuZChcInRleHRcIikuYXR0cihcInhcIiwgdyAvIDIpLmF0dHIoXCJ5XCIsIHBhZGRpbmcgKyBmb250U2l6ZSkudGV4dCh0aGlzLnRvcFRleHQpLmF0dHIoXCJmb250LXNpemVcIiwgZm9udFNpemUpXHJcbiAgICAgICAgICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgXCJtaWRkbGVcIilcclxuICAgICAgICAvL2xlZnQgbGFiZWxcclxuICAgICAgICBzdmcuYXBwZW5kKFwidGV4dFwiKS5hdHRyKFwieFwiLCAwKS5hdHRyKFwieVwiLCAzICogcGFkZGluZyArIDIgKiBmb250U2l6ZSArIGgpLnRleHQodGhpcy5sZWZ0VGV4dCkuYXR0cihcImZvbnQtc2l6ZVwiLCBmb250U2l6ZSlcclxuICAgICAgICAgICAgLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCBcInN0YXJ0XCIpXHJcbiAgICAgICAgLy9yaWdodCBsYWJlbFxyXG4gICAgICAgIHN2Zy5hcHBlbmQoXCJ0ZXh0XCIpLmF0dHIoXCJ4XCIsIHcpLmF0dHIoXCJ5XCIsIDMgKiBwYWRkaW5nICsgMiAqIGZvbnRTaXplICsgaCkudGV4dCh0aGlzLnJpZ2h0VGV4dCkuYXR0cihcImZvbnQtc2l6ZVwiLCBmb250U2l6ZSlcclxuICAgICAgICAgICAgLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCBcImVuZFwiKVxyXG5cclxuXHJcblxyXG4gICAgICAgIC8vdHJpYW5nbGUgZ3JvdXBcclxuICAgICAgICBjb25zdCBnID0gc3ZnLmFwcGVuZChcImdcIikuYXR0cihcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZShcIiArIChzZWxlY3Rpb25TdHJva2VXaWR0aCAvIDIpICsgXCIgXCIgKyAoc2VsZWN0aW9uU3Ryb2tlV2lkdGggLyAyICsgKDIgKiBwYWRkaW5nICsgZm9udFNpemUpKSArIFwiKVwiKVxyXG5cclxuICAgICAgICAvL2NvbW1vbiBmdW5jdGlvbiBmb3IgdHJpYW5nbGUgcGF0Y2hlc1xyXG4gICAgICAgIGNvbnN0IHNldEF0dHJpYnV0ZXMgPSAoZWx0LCBjb2xvciwgdGV4dCkgPT4ge1xyXG4gICAgICAgICAgICAvL2VsdC5yYWlzZSgpO1xyXG4gICAgICAgICAgICBlbHQuYXR0cignZmlsbCcsIGNvbG9yKVxyXG4gICAgICAgICAgICAgICAgLy8uYXR0cihcInN0cm9rZVwiLCBjb2xvck92ZXIpXHJcbiAgICAgICAgICAgICAgICAvLy5hdHRyKFwic3Ryb2tlLXdpZHRoXCIsIDApXHJcbiAgICAgICAgICAgICAgICAvLy5hdHRyKFwic3Ryb2tlLWxpbmVqb2luXCIsIFwicm91bmRcIilcclxuICAgICAgICAgICAgICAgIC5vbihcIm1vdXNlb3ZlclwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpOyBzZWxlY3QodGhpcykuYXR0cihcInN0cm9rZS13aWR0aFwiLCBzZWxlY3Rpb25TdHJva2VXaWR0aCk7Ki9cclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3QodGhpcykuYXR0cignZmlsbCcsIHNlbGVjdGlvbkNvbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXR0IHx8ICF0ZXh0KSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgdHQuaHRtbCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICB0dC5zZXRQb3NpdGlvbihlKTtcclxuICAgICAgICAgICAgICAgICAgICB0dC5zaG93KClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAub24oXCJtb3VzZW91dFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLypzZWxlY3QodGhpcykuYXR0cihcInN0cm9rZS13aWR0aFwiLCAwKTsqL1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdCh0aGlzKS5hdHRyKCdmaWxsJywgY29sb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0dCkgdHQuaGlkZSgpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZiAodHQgJiYgdGV4dCkgZWx0Lm9uKFwibW91c2Vtb3ZlXCIsIGZ1bmN0aW9uIChlKSB7IHR0LnNldFBvc2l0aW9uKGUpIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2NvbnN0IFtjMCwgYzEsIGMyXSA9IGNsYXNzaWZpZXIuY2VudGVyXHJcblxyXG4gICAgICAgIC8vdHJhcGV6aXVtIHMwXHJcbiAgICAgICAgY29uc3QgdDAgPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCBcIjAsXCIgKyBoICsgXCIgXCIgKyB3IC8gMyArIFwiLFwiICsgaCArIFwiIFwiICsgdyAvIDIgKyBcIixcIiArIGggKiAyIC8gMyArIFwiIFwiICsgdyAvIDYgKyBcIixcIiArIGggKiAyIC8gMylcclxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQwLCBjbGFzc2lmaWVyLmNvbG9yc1swXSwgdGV4dHNbXCIwXCJdKVxyXG4gICAgICAgIC8vdHJhcGV6aXVtIHMxXHJcbiAgICAgICAgY29uc3QgdDEgPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCB3IC8gMiArIFwiLDAgXCIgKyB3ICogMiAvIDMgKyBcIixcIiArIGggLyAzICsgXCIgXCIgKyB3IC8gMiArIFwiLFwiICsgaCAqIDIgLyAzICsgXCIgXCIgKyB3IC8gMyArIFwiLFwiICsgaCAvIDMpXHJcbiAgICAgICAgc2V0QXR0cmlidXRlcyh0MSwgY2xhc3NpZmllci5jb2xvcnNbMV0sIHRleHRzW1wiMVwiXSlcclxuICAgICAgICAvL3RyYXBleml1bSBzMlxyXG4gICAgICAgIGNvbnN0IHQyID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxyXG4gICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqIDUgLyA2ICsgXCIsXCIgKyAyICogaCAvIDMgKyBcIiBcIiArIHcgLyAyICsgXCIsXCIgKyBoICogMiAvIDMgKyBcIiBcIiArIHcgKiAyIC8gMyArIFwiLFwiICsgaClcclxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQyLCBjbGFzc2lmaWVyLmNvbG9yc1syXSwgdGV4dHNbXCIyXCJdKVxyXG4gICAgICAgIC8vdHJpYW5nbGUgczBcclxuICAgICAgICBjb25zdCB0MF8gPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCB3IC8gMiArIFwiLFwiICsgaCAqIDIgLyAzICsgXCIgXCIgKyB3ICogNSAvIDYgKyBcIixcIiArIGggKiAyIC8gMyArIFwiIFwiICsgdyAqIDIgLyAzICsgXCIsXCIgKyBoIC8gMylcclxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQwXywgY2xhc3NpZmllci5taXhDb2xvcnNbMF0sIHRleHRzW1wibTEyXCJdKVxyXG4gICAgICAgIC8vdHJpYW5nbGUgczFcclxuICAgICAgICBjb25zdCB0MV8gPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCB3IC8gMiArIFwiLFwiICsgaCAqIDIgLyAzICsgXCIgXCIgKyB3IC8gMyArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqIDIgLyAzICsgXCIsXCIgKyBoKVxyXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDFfLCBjbGFzc2lmaWVyLm1peENvbG9yc1sxXSwgdGV4dHNbXCJtMDJcIl0pXHJcbiAgICAgICAgLy90cmlhbmdsZSBzMlxyXG4gICAgICAgIGNvbnN0IHQyXyA9IGcuYXBwZW5kKCdwb2x5Z29uJylcclxuICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgLyAyICsgXCIsXCIgKyBoICogMiAvIDMgKyBcIiBcIiArIHcgLyA2ICsgXCIsXCIgKyBoICogMiAvIDMgKyBcIiBcIiArIHcgLyAzICsgXCIsXCIgKyBoIC8gMylcclxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQyXywgY2xhc3NpZmllci5taXhDb2xvcnNbMl0sIHRleHRzW1wibTAxXCJdKVxyXG5cclxuICAgICAgICAvL2NlbnRlclxyXG4gICAgICAgIGlmICh0aGlzLmNlbnRlckNvZWZmaWNpZW50KSB7XHJcbiAgICAgICAgICAgIC8vVE9ETyBtYWtlIGl0IGFuIGhleGFnb24gIVxyXG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBnLmFwcGVuZCgnY2lyY2xlJylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHcgLyAyKS5hdHRyKCdjeScsIGggKiAyIC8gMylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgdGhpcy5jZW50ZXJDb2VmZmljaWVudCAqIGggLyAzKVxyXG4gICAgICAgICAgICBzZXRBdHRyaWJ1dGVzKGNlbnRlciwgY2xhc3NpZmllci5jZW50ZXJDb2xvciwgdGV4dHNbXCJjZW50ZXJcIl0pXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICBsZXQgbWlkZGxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBsZWZ0XywgYm90dG9tXywgcmlnaHRfXHJcbiAgICAgICAgaWYgKCF0aGlzLnJlYWwpIHtcclxuXHJcbiAgICAgICAgICAgIC8vMCBsZWZ0IHRyaWFuZ2xlXHJcbiAgICAgICAgICAgIGxlZnQgPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgXCIwLFwiICsgaCArIFwiIFwiICsgKHcgLyAzKSArIFwiLFwiICsgaCArIFwiIFwiICsgKHcgLyA2KSArIFwiLFwiICsgKDIgKiBoIC8gMykpXHJcbiAgICAgICAgICAgIC8vMSB0b3AgdHJpYW5nbGVcclxuICAgICAgICAgICAgdG9wID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMykgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3ICogMiAvIDMpICsgXCIsXCIgKyAoaCAvIDMpICsgXCIgXCIgKyAodyAvIDIpICsgXCIsMFwiKVxyXG4gICAgICAgICAgICAvLzIgcmlnaHQgdHJpYW5nbGVcclxuICAgICAgICAgICAgcmlnaHQgPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgKiAyIC8gMykgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKyBcIixcIiArIGggKyBcIiBcIiArICh3ICogNSAvIDYpICsgXCIsXCIgKyAoMiAqIGggLyAzKSlcclxuICAgICAgICAgICAgLy9taWRkbGUgdHJpYW5nbGVcclxuICAgICAgICAgICAgbWlkZGxlID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMikgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3IC8gNCkgKyBcIixcIiArIChoICogNSAvIDYpICsgXCIgXCIgKyAoMyAqIHcgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikpXHJcbiAgICAgICAgICAgIC8vMDEgbGVmdCB0cmFwZXppdW1cclxuICAgICAgICAgICAgbGVmdF8gPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyA2KSArIFwiLFwiICsgKGggKiAyIC8gMykgKyBcIiBcIiArICh3IC8gNCkgKyBcIixcIiArIChoICogNSAvIDYpICsgXCIgXCIgKyAodyAvIDIpICsgXCIsXCIgKyAoaCAvIDMpICsgXCIgXCIgKyAodyAvIDMpICsgXCIsXCIgKyAoaCAvIDMpKVxyXG4gICAgICAgICAgICAvLzAyIGJvdHRvbSB0cmFwZXppdW1cclxuICAgICAgICAgICAgYm90dG9tXyA9IGcuYXBwZW5kKCdwb2x5Z29uJylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDMpICsgXCIsXCIgKyAoaCkgKyBcIiBcIiArICgyICogdyAvIDMpICsgXCIsXCIgKyAoaCkgKyBcIiBcIiArICh3ICogMyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSArIFwiIFwiICsgKHcgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikpXHJcbiAgICAgICAgICAgIC8vMTIgcmlnaHQgdHJhcGV6aXVtXHJcbiAgICAgICAgICAgIHJpZ2h0XyA9IGcuYXBwZW5kKCdwb2x5Z29uJylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDIpICsgXCIsXCIgKyAoaCAvIDMpICsgXCIgXCIgKyAodyAqIDMgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikgKyBcIiBcIiArICh3ICogNSAvIDYpICsgXCIsXCIgKyAoaCAqIDIgLyAzKSArIFwiIFwiICsgKHcgKiAyIC8gMykgKyBcIixcIiArIChoIC8gMykpXHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAvL21pZGRsZSB0cmlhbmdsZVxyXG4gICAgICAgICAgICBtaWRkbGUgPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAyKSArIFwiLDAgMCxcIiArIGggKyBcIiBcIiArIHcgKyBcIixcIiArIGgpXHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgdHJhcGV6aXVtXHJcbiAgICAgICAgICAgIC8vZHJhdyBsYXJnZSB0cmFwZXppdW0gZmlyc3RcclxuICAgICAgICAgICAgZm9yIChsZXQgaV8gPSAyOyBpXyA+PSAwOyBpXy0tKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5jbGFzc2lmaWVyLmxvd0luZGV4W2lfXVxyXG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuY2xhc3NpZmllci5sb3dUaHJlc2hvbGRbaV1cclxuICAgICAgICAgICAgICAgIGlmIChpID09IDIpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8wMSBsZWZ0IHRyYXBleml1bVxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnRfID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyAvIDIgKyBcIiwwIDAsXCIgKyBoICsgXCIgXCIgKyB3ICogciArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxICsgcikgLyAyICsgXCIsXCIgKyByICogaClcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT0gMSlcclxuICAgICAgICAgICAgICAgICAgICAvLzAyIGJvdHRvbSB0cmFwZXppdW1cclxuICAgICAgICAgICAgICAgICAgICBib3R0b21fID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgXCIwLFwiICsgaCArIFwiIFwiICsgdyArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxIC0gciAvIDIpICsgXCIsXCIgKyBoICogKDEgLSByKSArIFwiIFwiICsgciAqIHcgLyAyICsgXCIsXCIgKyBoICogKDEgLSByKSlcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAvLzEyIHJpZ2h0IHRyYXBleml1bVxyXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0XyA9IGcuYXBwZW5kKCdwb2x5Z29uJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgKyBcIixcIiArIGggKyBcIiBcIiArIHcgLyAyICsgXCIsMCBcIiArIHcgKiAoMSAtIHIpIC8gMiArIFwiLFwiICsgaCAqIHIgKyBcIiBcIiArIHcgKiAoMSAtIHIpICsgXCIsXCIgKyBoKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgdHJpYW5nbGVzXHJcbiAgICAgICAgICAgIC8vZHJhdyBsYXJnZSB0cmlhbmdsZXMgZmlyc3RcclxuICAgICAgICAgICAgZm9yIChsZXQgaV8gPSAyOyBpXyA+PSAwOyBpXy0tKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5jbGFzc2lmaWVyLmhpZ2hJbmRleFtpX11cclxuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmNsYXNzaWZpZXIuaGlnaFRocmVzaG9sZFtpXVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpID09IDIpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8yIHJpZ2h0IHRyaWFuZ2xlXHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCB3ICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICogciArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxICsgcikgLyAyICsgXCIsXCIgKyBoICogcilcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT0gMSlcclxuICAgICAgICAgICAgICAgICAgICAvLzEgdG9wIHRyaWFuZ2xlXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAyKSArIFwiLDAgXCIgKyB3ICogciAvIDIgKyBcIixcIiArIGggKiAoMSAtIHIpICsgXCIgXCIgKyB3ICogKDEgLSByIC8gMikgKyBcIixcIiArIGggKiAoMSAtIHIpKVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vMCBsZWZ0IHRyaWFuZ2xlXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGcuYXBwZW5kKCdwb2x5Z29uJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIFwiMCxcIiArIGggKyBcIiBcIiArIHcgKiAoMSAtIHIpICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICogKDEgLSByKSAvIDIgKyBcIixcIiArIGggKiByKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0qL1xyXG5cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcclxuXHJcbi8qKiBAdHlwZWRlZiB7XCJmbGFnXCJ8XCJwaWVjaGFydFwifFwicmluZ1wifFwic2VnbWVudFwifFwicmFkYXJcInxcImFnZXB5cmFtaWRcInxcImhhbGZ0b25lXCJ9IENvbXBvc2l0aW9uVHlwZSAqL1xyXG5cclxuLyoqXHJcbiAqIEEgc3R5bGUgc2hvd2luZyB0aGUgY29tcG9zaXRpb24gb2YgYSB0b3RhbCBpbiBkaWZmZXJlbnQgY2F0ZWdvcmllcywgd2l0aCBkaWZmZXJlbnQgY29sb3IgaHVlcy5cclxuICogSXQgY29uc2lzdHMgb2YgYSBzeW1ib2wgd2l0aCBkaWZmZXJlbnQgcGFydHMsIHdob3NlIHNpemUgcmVmbGVjdCB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBjYXRlZ29yeS5cclxuICogRm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgc3ltYm9scywgQHNlZSBDb21wb3NpdGlvblR5cGVcclxuICogVGhlIHN5bWJvbCBjYW4gYmUgc2NhbGVkIGRlcGVuZGluZyBvbiB0aGUgY2VsbCBpbXBvcnRhbmNlLlxyXG4gKlxyXG4gKiBAbW9kdWxlIHN0eWxlXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb21wb3NpdGlvblN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoc3RyaW5nIC0+IGNvbG9yKSB3aGljaCBnaXZlIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5LlxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3JcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHR5cGUgb2YgZGVjb21wb3NpdGlvbiBzeW1ib2wgb2YgYSBjZWxsLCBAc2VlIENvbXBvc2l0aW9uVHlwZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsIG51bWJlcixvYmplY3QpOkNvbXBvc2l0aW9uVHlwZX0gKi9cclxuICAgICAgICB0aGlzLnR5cGUgPSBvcHRzLnR5cGUgfHwgKCgpID0+IFwiZmxhZ1wiKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoYywgcikgPT4gcikgLy8oYyxyLHosdnMpID0+IHt9XHJcblxyXG4gICAgICAgIC8qKiBGb3Igc3R5bGUgdHlwZXMgd2l0aCBzdHJpcGVzIChmbGFnLCBzZWdtZW50KSwgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBzdHJpcGVzICgwIGZvciBob3Jpem9udGFsLCBvdGhlciBmb3IgdmVydGljYWwpLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc3RyaXBlc09yaWVudGF0aW9uID0gb3B0cy5zdHJpcGVzT3JpZW50YXRpb24gfHwgKCgpID0+IDApIC8vKGMscix6LHZzKSA9PiAuLi5cclxuXHJcbiAgICAgICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGFuIG9mZnNldCBhbmdsZSBmb3IgYSByYWRhciwgaGFsZnRvbmUgb3IgcGllIGNoYXJ0IHN0eWxlLlxyXG4gICAgICAgICAqIFRoZSBhbmdsZSBpcyBzcGVjaWZpZWQgaW4gZGVncmVlLiBUaGUgcm90YXRpb24gaXMgYW50aS1jbG9ja3dpc2UuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5vZmZzZXRBbmdsZSA9IG9wdHMub2Zmc2V0QW5nbGUgfHwgKCgpID0+IDApIC8vKGMscix6LHZzKSA9PiAuLi5cclxuXHJcbiAgICAgICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIHRoZSBoZWlnaHQgb2YgdGhlIGFnZSBweXJhbWlkLCBpbiBnZW8gdW5pdC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmFnZVB5cmFtaWRIZWlnaHQgPSBvcHRzLmFnZVB5cmFtaWRIZWlnaHQgfHwgKChjLCByKSA9PiByKSAvLyhjLHIseix2cykgPT4gLi4uXHJcblxyXG4gICAgICAgIC8qKiBGb3IgcGllIGNoYXJ0LCB0aGlzIGlzIHBhcmFtZXRlciBmb3IgaW50ZXJuYWwgcmFkaXVzLCBzbyB0aGF0IHRoZSBwaWUgY2hhcnQgbG9va3MgbGlrZSBhIGRvbnV0LlxyXG4gICAgICAgICAqIDAgZm9yIG5vcm1hbCBwaWUgY2hhcnRzLCAwLjUgdG8gZW1wdHkgaGFsZiBvZiB0aGUgcmFkaXVzLlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yID0gb3B0cy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yIHx8IDBcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcyBkZXBlbmRpbmcgb24gdGhlaXIgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxyXG5cclxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXHJcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLy9uYiBjYXRlZ29yaWVzIC0gdXNlZCBmb3IgcmFkYXIgYW5kIGFnZXB5cmFtaWRcclxuICAgICAgICBjb25zdCBuYkNhdCA9IE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpLmxlbmd0aFxyXG5cclxuICAgICAgICAvL2RyYXcgY2FsbHNcclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XHJcblxyXG4gICAgICAgICAgICAvL3NpemVcclxuICAgICAgICAgICAgY29uc3Qgc0cgPSB0aGlzLnNpemUgPyB0aGlzLnNpemUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHJlc29sdXRpb25cclxuICAgICAgICAgICAgaWYgKCFzRykgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxyXG5cclxuICAgICAgICAgICAgLy9nZXQgc3ltYm9sIHR5cGVcclxuICAgICAgICAgICAgY29uc3QgdHlwZV8gPSB0aGlzLnR5cGUgPyB0aGlzLnR5cGUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdmbGFnJ1xyXG5cclxuICAgICAgICAgICAgLy9jb21wdXRlIGNlbnRlciBwb3NpdGlvblxyXG4gICAgICAgICAgICBjb25zdCB4YyA9IGNlbGwueCArIG9mZnNldC5keCArICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnID8gMCA6IHJlc29sdXRpb24gKiAwLjUpXHJcbiAgICAgICAgICAgIGNvbnN0IHljID0gY2VsbC55ICsgb2Zmc2V0LmR5ICsgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgPyAwIDogcmVzb2x1dGlvbiAqIDAuNSlcclxuXHJcbiAgICAgICAgICAgIC8vY29tcHV0ZSBvZmZzZXQgYW5nbGUsIHdoZW4gcmVsZXZhbnRcclxuICAgICAgICAgICAgY29uc3Qgb2ZmQW5nID0gdGhpcy5vZmZzZXRBbmdsZSA/ICh0aGlzLm9mZnNldEFuZ2xlKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgKiBNYXRoLlBJKSAvIDE4MCA6IDBcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnIHx8IHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnKSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBjZWxsIGNhdGVnb3J5IG1heCB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgbGV0IG1heFZhbCA9IC1JbmZpbml0eVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuY29sb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9ICtjZWxsW2tleV1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodiA+IG1heFZhbCkgbWF4VmFsID0gdlxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vY3VtdWxcclxuICAgICAgICAgICAgICAgIGxldCBjdW11bCA9IDBcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnICYmIHRoaXMuYWdlUHlyYW1pZEhlaWdodClcclxuICAgICAgICAgICAgICAgICAgICBjdW11bCA9IChyZXNvbHV0aW9uIC0gdGhpcy5hZ2VQeXJhbWlkSGVpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkpIC8gMlxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnKSBjdW11bCA9IE1hdGguUEkgLyAyICsgb2ZmQW5nXHJcblxyXG4gICAgICAgICAgICAgICAgLy9jb21wdXRlIHRoZSBpbmNyZW1lbnQsIHdoaWNoIGlzIHRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgdGhlIGN1bXVsIGZvciBlYWNoIGNhdGVnb3J5XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmNyID1cclxuICAgICAgICAgICAgICAgICAgICB0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKHRoaXMuYWdlUHlyYW1pZEhlaWdodCA/IHRoaXMuYWdlUHlyYW1pZEhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogcmVzb2x1dGlvbikgLyBuYkNhdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgyICogTWF0aC5QSSkgLyBuYkNhdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgIGlmIChpbmNyID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgdHlwZTonICsgdHlwZV8pXHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY2F0ZWdvcnkgY29sb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xvclxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgY2F0ZWdvcnkgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY2VsbFtjb2x1bW5dXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgY2F0ZWdvcnkgbGVuZ3RoIC0gaW4gZ2VvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3RyA9IChzRyAqIHZhbCkgLyBtYXhWYWxcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBiYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsUmVjdCh4YyArIChyZXNvbHV0aW9uIC0gd0cpIC8gMiwgeWMgKyBjdW11bCwgd0csIGluY3IpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25leHQgaGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsICs9IGluY3JcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAncmFkYXInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNhdGVnb3J5IGNvbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sb3JcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNhdGVncm95IHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGNhdGVnb3J5IHJhZGl1cyAtIGluIGdlb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zdCByRyA9IHRoaXMucmFkaXVzKHZhbCwgciwgc3RhdCwgY2VsbFN0YXQsIHopXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJHID0gKHNHIC8gMikgKiBNYXRoLnNxcnQodmFsIC8gbWF4VmFsKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGFuZ3VsYXIgc2VjdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oeGMsIHljKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyh4YywgeWMsIHJHLCBjdW11bCAtIGluY3IsIGN1bXVsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyh4YywgeWMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25leHQgYW5ndWxhciBzZWN0b3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gaW5jclxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdoYWxmdG9uZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY2F0ZWdvcnkgY29sb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xvclxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgY2F0ZWdyb3kgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY2VsbFtjb2x1bW5dXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgY2F0ZWdvcnkgcmFkaXVzIC0gaW4gZ2VvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByRyA9IHNHICogMC4zMzMgKiBNYXRoLnNxcnQodmFsIC8gbWF4VmFsKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMgKyByZXNvbHV0aW9uICogMC4yNSAqIE1hdGguY29zKGN1bXVsKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljICsgcmVzb2x1dGlvbiAqIDAuMjUgKiBNYXRoLnNpbihjdW11bCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByRyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogTWF0aC5QSVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25leHQgYW5ndWxhciBzZWN0b3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gaW5jclxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgdHlwZTonICsgdHlwZV8pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9jb21wdXRlIHRvdGFsXHJcbiAgICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2x1bW4gb2YgT2JqZWN0LmtleXModGhpcy5jb2xvcikpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gK2NlbGxbY29sdW1uXVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdikgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB2XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRvdGFsIHx8IGlzTmFOKHRvdGFsKSkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgZGVjb21wb3NpdGlvbiBzeW1ib2xcclxuICAgICAgICAgICAgICAgIGxldCBjdW11bCA9IDBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSByZXNvbHV0aW9uICogKDEgLSBzRyAvIHJlc29sdXRpb24pICogMC41XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcmkgPSB0aGlzLnN0cmlwZXNPcmllbnRhdGlvbihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9nZXQgc2hhcmVcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZSA9IGNlbGxbY29sdW1uXSAvIHRvdGFsXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGFyZSB8fCBpc05hTihzaGFyZSkpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xvclxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL2RyYXcgc3ltYm9sIHBhcnRcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZV8gPT09ICdmbGFnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgZmxhZyBzdHJpcGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaSA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hvcml6b250YWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgZCArIG9mZnNldC5keCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyBkICsgY3VtdWwgKiBzRyArIG9mZnNldC5keSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHNHXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ZlcnRpY2FsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxSZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGQgKyBjdW11bCAqIHNHICsgb2Zmc2V0LmR4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueSArIGQgKyBvZmZzZXQuZHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiBzRyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzR1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3BpZWNoYXJ0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgcGllIGNoYXJ0IGFuZ3VsYXIgc2VjdG9yXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgYW5nbGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGExID0gY3VtdWwgKiAyICogTWF0aC5QSVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhMiA9IChjdW11bCArIHNoYXJlKSAqIDIgKiBNYXRoLlBJXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXdcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4YywgeWMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKHhjLCB5Yywgc0cgKiAwLjUsIGExICsgb2ZmQW5nLCBhMiArIG9mZkFuZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGllQ2hhcnRJbnRlcm5hbFJhZGl1c0ZhY3RvcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHICogMC41ICogdGhpcy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGExICsgb2ZmQW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEyICsgb2ZmQW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgcmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKHhjLCB5YywgTWF0aC5zcXJ0KDEgLSBjdW11bCkgKiBzRyAqIDAuNSwgMCwgMiAqIE1hdGguUEkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3NlZ21lbnQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHNlY3Rpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gKHNHICogc0cpIC8gcmVzb2x1dGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaG9yaXpvbnRhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsUmVjdChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnggKyBvZmZzZXQuZHgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgKHJlc29sdXRpb24gLSB3RykgLyAyICsgY3VtdWwgKiB3RyArIG9mZnNldC5keSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlICogd0dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmVydGljYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgY3VtdWwgKiByZXNvbHV0aW9uICsgb2Zmc2V0LmR4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueSArIChyZXNvbHV0aW9uIC0gd0cpIC8gMiArIG9mZnNldC5keSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHJlc29sdXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgdHlwZTonICsgdHlwZV8pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBzaGFyZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcbmltcG9ydCB7IHJhbmRvbU5vcm1hbCB9IGZyb20gJ2QzLXJhbmRvbSdcclxuaW1wb3J0IHsgY2hlY2tXZWJHTFN1cHBvcnQsIG1ha2VXZWJHTENhbnZhcyB9IGZyb20gJy4uL3V0aWxzL3dlYkdMVXRpbHMuanMnXHJcbmltcG9ydCB7IFdlYkdMU3F1YXJlQ29sb3JpbmcgfSBmcm9tICcuLi91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nLmpzJ1xyXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBtb2R1bGUgc3R5bGVcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERvdERlbnNpdHlTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBudW1iZXIgb2YgZG90cyBmb3IgYSBjZWxsIHZhbHVlLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmRvdE51bWJlciA9IG9wdHMuZG90TnVtYmVyIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbiAvIDEwMCkvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBjb2xvciBvZiB0aGUgZG90cy4gU2FtZSBjb2xvciBmb3IgYWxsIGRvdHMgd2l0aGluIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRkY1NzMzJykgLy8oYyxyLHosdnMpID0+IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgZG90cywgaW4gZ2VvIHVuaXQuIFNhbWUgc2l6ZSBmb3IgYWxsIGNlbGxzLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsIG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmRvdFNpemUgPSBvcHRzLmRvdFNpemUgfHwgKChyZXNvbHV0aW9uLCB6KSA9PiAxLjUgKiB6KSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaWdtYSBvZiB0aGUgZG90cyBkaXN0cmlidXRpb24uIFNhbWUgdmFsdWUgZm9yIGFsbCBjZWxscy5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLCBudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaWdtYSA9IG9wdHMuc2lnbWEgfHwgKChyZXNvbHV0aW9uLCB6KSA9PiByZXNvbHV0aW9uIC8gMikvLyhjLHIseix2cykgPT4ge31cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvL2dldCBzaXplXHJcbiAgICAgICAgY29uc3Qgc0dlbyA9IHRoaXMuZG90U2l6ZSA/IHRoaXMuZG90U2l6ZShyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogelxyXG5cclxuICAgICAgICAvL21ha2UgcmFuZG9tIGZ1bmN0aW9uXHJcbiAgICAgICAgY29uc3Qgc2lnID0gdGhpcy5zaWdtYSA/IHRoaXMuc2lnbWEocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHJlc29sdXRpb24gKiAwLjRcclxuICAgICAgICBjb25zdCByYW5kID0gcmFuZG9tTm9ybWFsKDAsIHNpZylcclxuXHJcbiAgICAgICAgaWYgKGNoZWNrV2ViR0xTdXBwb3J0KCkpIHtcclxuICAgICAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxyXG4gICAgICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhnZW9DYW52YXMudyArICcnLCBnZW9DYW52YXMuaCArICcnKVxyXG4gICAgICAgICAgICBpZiAoIWN2V0dMKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyB3ZWJHTCcpXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9jcmVhdGUgd2ViR0wgcHJvZ3JhbVxyXG4gICAgICAgICAgICBjb25zdCBwcm9nID0gbmV3IFdlYkdMU3F1YXJlQ29sb3JpbmcoY3ZXR0wuZ2wsIHNHZW8gLyB6KVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uIC8gMlxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgLy9udW1iZXIgb2YgZG90c1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZG90TnVtYmVyID0gdGhpcy5kb3ROdW1iZXIoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcclxuXHJcbiAgICAgICAgICAgICAgICAvL2NlbGwgY2VudGVyXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIG9mZnNldC5keCArIHIyXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIG9mZnNldC5keSArIHIyXHJcblxyXG4gICAgICAgICAgICAgICAgLy9jb252ZXJ0IGNvbG9yXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYyA9IGNvbG9yKGNvbClcclxuICAgICAgICAgICAgICAgIGlmICghY2MpIHJldHVyblxyXG5cclxuICAgICAgICAgICAgICAgIC8vcmFuZG9tIHBvaW50c1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gZG90TnVtYmVyOyBpKyspXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZy5hZGRQb2ludERhdGEyKGN4ICsgcmFuZCgpLCBjeSArIHJhbmQoKSwgY2MuciwgY2MuZywgY2MuYiwgY2Mub3BhY2l0eSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3XHJcbiAgICAgICAgICAgIHByb2cuZHJhdyhnZW9DYW52YXMuZ2V0V2ViR0xUcmFuc2Zvcm0oKSlcclxuXHJcbiAgICAgICAgICAgIC8vZHJhdyBpbiBjYW52YXMgZ2VvXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5kcmF3SW1hZ2UoY3ZXR0wuY2FudmFzLCAwLCAwKVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xcclxuXHJcbiAgICAgICAgICAgICAgICAvL251bWJlciBvZiBkb3RzXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkb3ROdW1iZXIgPSB0aGlzLmRvdE51bWJlcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXHJcblxyXG4gICAgICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZHJhdyByYW5kb20gZG90c1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC8gMixcclxuICAgICAgICAgICAgICAgICAgICBjeSA9IGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLyAyXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBkb3ROdW1iZXI7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoY3ggKyByYW5kKCksIGN5ICsgcmFuZCgpLCBzR2VvLCBzR2VvKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQG1vZHVsZSBzdHlsZVxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgSW1hZ2VTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuXHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgaW1hZ2UgVVJMIG9mIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5pbWFnZSA9IG9wdHMuaW1hZ2UgfHwgKCgpID0+ICcnKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBpbWFnZSBzaXplIGluIGdyb3VuZCBtZXRlcnNcclxuICAgICAgICAgKiAgQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKVxyXG5cclxuICAgICAgICAvKiogRGljdGlvbm5hcnkgb2YgcHJlbG9hZGVkIGltYWdlcy4gdXJsIC0+IGltYWdlXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xyXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7fVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXHJcbiAgICAgKiBAb3ZlcnJpZGVcclxuICAgICAqL1xyXG4gICAgYXN5bmMgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnosXHJcbiAgICAgICAgICAgIHJlc29sdXRpb25QaXggPSByZXNvbHV0aW9uIC8gelxyXG5cclxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXHJcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLy9kcmF3IGluIHNjcmVlbiBjb29yZGluYXRlc1xyXG4gICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XHJcblxyXG4gICAgICAgICAgICAvL2dldCBjZWxsIGltYWdlIHVybFxyXG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmltYWdlKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcclxuICAgICAgICAgICAgaWYgKCF1cmwpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3NpemUgYW5kIHBvc2l0aW9uIHZhbHVlc1xyXG4gICAgICAgICAgICBsZXQgc2l6ZVBpeCA9IHRoaXMuc2l6ZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIC8gelxyXG4gICAgICAgICAgICBpZiAoIXNpemVQaXgpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL2dldCBpbWFnZSBmcm9tIGNhY2hlXHJcbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5jYWNoZVt1cmxdXHJcblxyXG4gICAgICAgICAgICAvL2xvYWRpbmcsIGtlZXAgd2FpdGluZ1xyXG4gICAgICAgICAgICBpZiAoaW1hZ2UgPT0gXCJsb2FkaW5nXCIpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIC8vbm8gaW1hZ2U6IGxvYWQgaXRcclxuICAgICAgICAgICAgZWxzZSBpZiAoIWltYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAvL3RhZyBhcyBsb2FkaW5nXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3VybF0gPSBcImxvYWRpbmdcIlxyXG5cclxuICAgICAgICAgICAgICAgIC8vZGVmaW5lIGltYWdlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKVxyXG4gICAgICAgICAgICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvL3N0b3JlIGltYWdlIGRhdGEgaW4gY2FjaGUgYW5kIHJlZHJhd1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbdXJsXSA9IGltZ1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgcmV0cmlldmUgaW1hZ2UgZnJvbVwiLCB1cmwpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL3NldCBVUkwgdG8gbGF1bmNoIHRoZSBkb3dubG9hZFxyXG4gICAgICAgICAgICAgICAgaW1nLnNyYyA9IHVybFxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBpbWFnZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IChyZXNvbHV0aW9uUGl4IC0gc2l6ZVBpeCkgLyAyXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKGltYWdlLCBnZW9DYW52YXMuZ2VvVG9QaXhYKGNlbGwueCkgKyBkLCBnZW9DYW52YXMuZ2VvVG9QaXhZKGNlbGwueSkgKyBkIC0gcmVzb2x1dGlvblBpeCwgc2l6ZVBpeCwgc2l6ZVBpeClcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcbmltcG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vU2lkZVN0eWxlLmpzJ1xyXG5cclxuLyoqIEB0eXBlZGVmIHt7eDpudW1iZXIseTpudW1iZXIsb3I6XCJ2XCJ8XCJoXCIsYzE6aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsfHVuZGVmaW5lZCxjMjppbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGx8dW5kZWZpbmVkfX0gU2lkZSAqL1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGUgc3R5bGVcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIElzb0ZlbmNlU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoc3RyaW5nIC0+IGNvbG9yKSB3aGljaCBnaXZlIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5LlxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3JcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBoZWlnaHQgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8ICgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA9PiByZXNvbHV0aW9uICogMC40KVxyXG5cclxuICAgICAgICAvKiogVGhlIHBlcnNwZWN0aXZlIGFuZ2xlLCBpbiBkZWdyZWUsIHdpdGhpbiBbLTE4MCwxODBdLCBmcm9tIFtPLHhdIGF4aXMuXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmFuZ2xlID0gb3B0cy5hbmdsZSAhPSB1bmRlZmluZWQgPyBvcHRzLmFuZ2xlIDogNTBcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb3JuZXIgbGluZSBzdHJva2Ugc3R5bGUuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCxudW1iZXIsbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29ybmVyTGluZVN0cm9rZUNvbG9yID0gb3B0cy5jb3JuZXJMaW5lU3Ryb2tlQ29sb3IgfHwgKChjLCByLCB6LCBhbmdsZSkgPT4gXCIjOTk5XCIpXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29ybmVyIGxpbmUgd2lkdGguXHJcbiAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5jb3JuZXJMaW5lV2lkdGggPSBvcHRzLmNvcm5lckxpbmVXaWR0aCB8fCAoKGMsIHIsIHosIGFuZ2xlKSA9PiAoYW5nbGUgJSA5MCA9PSAwID8gMCA6IDAuOCAqIHopKVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAqIFNob3cgdmVydGljYWwgY3Jvc3Mtc2VjdGlvbnMuXHJcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLnNWZXJ0ID0gb3B0cy5zVmVydCAhPSB1bmRlZmluZWQgPyBvcHRzLnNWZXJ0IDogdHJ1ZVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAqIFNob3cgaG9yaXpvbnRhbCBjcm9zcy1zZWN0aW9ucy5cclxuICAgICAgICAqIEB0eXBlIHtib29sZWFufSAqL1xyXG4gICAgICAgIHRoaXMuc0hvciA9IG9wdHMuc0hvciAhPSB1bmRlZmluZWQgPyBvcHRzLnNIb3IgOiB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICogQG92ZXJyaWRlXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xyXG5cclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcclxuXHJcbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxyXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8vbmIgY2F0ZWdvcmllcyAtIHVzZWQgZm9yIHJhZGFyIGFuZCBhZ2VweXJhbWlkXHJcbiAgICAgICAgY29uc3QgY2F0cyA9IE9iamVjdC5rZXlzKHRoaXMuY29sb3IpXHJcblxyXG4gICAgICAgIC8vaGFsZiByZXNvbHV0aW9uXHJcbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uIC8gMlxyXG5cclxuICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQodW5kZWZpbmVkLCByZXNvbHV0aW9uLCB6KSwgZHggPSBvZmZzZXQuZHgsIGR5ID0gb2Zmc2V0LmR5XHJcblxyXG4gICAgICAgIC8vbWFrZSBzaWRlc1xyXG4gICAgICAgIC8qKiAgQHR5cGUge0FycmF5LjxTaWRlPn0gKi9cclxuICAgICAgICBjb25zdCBzaWRlcyA9IFNpZGVTdHlsZS5idWlsZFNpZGVzKGNlbGxzLCByZXNvbHV0aW9uLCB0aGlzLmFuZ2xlICUgMTgwICE9IDkwICYmIHRoaXMuc1ZlcnQsIHRoaXMuYW5nbGUgJSAxODAgIT0gMCAmJiB0aGlzLnNIb3IpXHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgaWYgKHNpZGVzLmxlbmd0aCA9PSAwKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9hbmdsZSBpbiByYWRpYW5zXHJcbiAgICAgICAgY29uc3QgYVJhZCA9IHRoaXMuYW5nbGUgKiBNYXRoLlBJIC8gMTgwLCBjb3MgPSBNYXRoLmNvcyhhUmFkKSwgc2luID0gTWF0aC5zaW4oYVJhZClcclxuXHJcbiAgICAgICAgLy9zb3J0IHNpZGVzIHNvIHRoYXQgdGhlIGJhY2sgb25lcyBhcmUgZHJhd24gZmlyc3QuIFRoaXMgZGVwZW5kcyBvbiB0aGUgYW5nbGUuXHJcbiAgICAgICAgLy9kZXBlbmRpbmcgb24gZGlzdGFuY2UgdG8gdGhlIHJlZmVyZW5jZSBjb3JuZXIgcG9pbnRcclxuICAgICAgICBjb25zdCB4Q29ybmVyID0gTWF0aC5hYnModGhpcy5hbmdsZSkgPCA5MCA/IGdlb0NhbnZhcy5leHRHZW8ueE1pbiA6IGdlb0NhbnZhcy5leHRHZW8ueE1heFxyXG4gICAgICAgIGNvbnN0IHlDb3JuZXIgPSB0aGlzLmFuZ2xlIDwgMCA/IGdlb0NhbnZhcy5leHRHZW8ueU1heCA6IGdlb0NhbnZhcy5leHRHZW8ueU1pblxyXG4gICAgICAgIHNpZGVzLnNvcnQoKHMxLCBzMikgPT4gKE1hdGguaHlwb3QoczIueCAtIHhDb3JuZXIsIHMyLnkgLSB5Q29ybmVyKSAtIE1hdGguaHlwb3QoczEueCAtIHhDb3JuZXIsIHMxLnkgLSB5Q29ybmVyKSkpXHJcblxyXG4gICAgICAgIC8vcHJlcGFyZSBmdW5jdGlvbiB0byBkcmF3IGNvcm5lciBsaW5lIGZvciBhIGNlbGwgKmMqXHJcbiAgICAgICAgY29uc3QgZHJhd0Nvcm5lckxpbmUgPSAoY2VsbCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKCFjZWxsKSByZXR1cm5cclxuICAgICAgICAgICAgLy9saW5lIHN0eWxlXHJcbiAgICAgICAgICAgIGNvbnN0IGx3ID0gdGhpcy5jb3JuZXJMaW5lV2lkdGggPyB0aGlzLmNvcm5lckxpbmVXaWR0aChjZWxsLCByZXNvbHV0aW9uLCB6LCB0aGlzLmFuZ2xlKSA6IDAuOCAqIHpcclxuICAgICAgICAgICAgaWYgKGx3ID09IDApIHJldHVyblxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb3JuZXJMaW5lU3Ryb2tlQ29sb3IgPyB0aGlzLmNvcm5lckxpbmVTdHJva2VDb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB0aGlzLmFuZ2xlKSA6IFwiIzMzM1wiXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gbHdcclxuXHJcbiAgICAgICAgICAgIC8vaGVpZ2h0IC0gaW4gZ2VvXHJcbiAgICAgICAgICAgIGNvbnN0IGhHID0gdGhpcy5oZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGxpbmVcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjZWxsLnggKyByMiArIGR4LCBjZWxsLnkgKyByMiArIGR5KVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjZWxsLnggKyByMiArIGhHICogY29zICsgZHgsIGNlbGwueSArIHIyICsgaEcgKiBzaW4gKyBkeSlcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9kcmF3IHNpZGVzXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lQ2FwID0gXCJyb3VuZFwiO1xyXG4gICAgICAgIGZvciAobGV0IHNpZGUgb2Ygc2lkZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgYzEgPSBzaWRlLmMxLCBjMiA9IHNpZGUuYzIsIHggPSBzaWRlLngsIHkgPSBzaWRlLnlcclxuXHJcbiAgICAgICAgICAgIC8vaGVpZ2h0cyAtIGluIGdlb1xyXG4gICAgICAgICAgICBjb25zdCBoRzEgPSBjMSA/IHRoaXMuaGVpZ2h0KGMxLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogMCxcclxuICAgICAgICAgICAgICAgIGhHMiA9IGMyID8gdGhpcy5oZWlnaHQoYzIsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAwXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgdG90YWxzIGZvciBib3RoIGNlbGxzXHJcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsMSA9IGNvbXB1dGVUb3RhbChjMSwgY2F0cyksXHJcbiAgICAgICAgICAgICAgICB0b3RhbDIgPSBjb21wdXRlVG90YWwoYzIsIGNhdHMpXHJcbiAgICAgICAgICAgIGlmICh0b3RhbDEgPT0gMCAmJiB0b3RhbDIgPT0gMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIGxldCBjdW11bDEgPSAwLCBjdW11bDIgPSAwXHJcbiAgICAgICAgICAgIGZvciAobGV0IFtjb2x1bW4sIGNvbG9yXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKSkge1xyXG4gICAgICAgICAgICAgICAgLy9kcmF3IHN0cmlwZSBvZiBzaWRlIHMgYW5kIGNhdGVnb3J5IGNvbHVtblxyXG5cclxuICAgICAgICAgICAgICAgIC8vZ2V0IHZhbHVlcyBmb3IgYm90aCBjZWxsc1xyXG4gICAgICAgICAgICAgICAgbGV0IHYxID0gYzEgPyArYzFbY29sdW1uXSA6IDBcclxuICAgICAgICAgICAgICAgIGxldCB2MiA9IGMyID8gK2MyW2NvbHVtbl0gOiAwXHJcbiAgICAgICAgICAgICAgICBpZiAodjEgPT0gMCAmJiB2MiA9PSAwKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBoZWlnaHRzXHJcbiAgICAgICAgICAgICAgICBjb25zdCBoMSA9IGhHMSAqIGN1bXVsMSAvIHRvdGFsMSB8fCAwXHJcbiAgICAgICAgICAgICAgICBjb25zdCBoMW4gPSBoRzEgKiAoY3VtdWwxICsgdjEpIC8gdG90YWwxIHx8IDBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGgyID0gaEcyICogY3VtdWwyIC8gdG90YWwyIHx8IDBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGgybiA9IGhHMiAqIChjdW11bDIgKyB2MikgLyB0b3RhbDIgfHwgMFxyXG5cclxuICAgICAgICAgICAgICAgIC8vbWFrZSBwYXRoXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBpZiAoc2lkZS5vciA9PSBcImhcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vaG9yaXpvbnRhbCBzaWRlIC0gdmVydGljYWwgc2VjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIC8vYm90dG9tIGxlZnRcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4ICsgaDEgKiBjb3MgKyBkeCwgeSAtIHIyICsgaDEgKiBzaW4gKyBkeSlcclxuICAgICAgICAgICAgICAgICAgICAvL3RvcCBsZWZ0XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIGgyICogY29zICsgZHgsIHkgKyByMiArIGgyICogc2luICsgZHkpXHJcbiAgICAgICAgICAgICAgICAgICAgLy90b3AgcmlnaHRcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyh4ICsgaDJuICogY29zICsgZHgsIHkgKyByMiArIGgybiAqIHNpbiArIGR5KVxyXG4gICAgICAgICAgICAgICAgICAgIC8vYm90dG9tIHJpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIGgxbiAqIGNvcyArIGR4LCB5IC0gcjIgKyBoMW4gKiBzaW4gKyBkeSlcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy92ZXJ0aWNhbCBzaWRlIC0gaG9yaXpvbnRhbCBzZWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gbGVmdFxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHggLSByMiArIGgxICogY29zICsgZHgsIHkgKyBoMSAqIHNpbiArIGR5KVxyXG4gICAgICAgICAgICAgICAgICAgIC8vYm90dG9tIHJpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIHIyICsgaDIgKiBjb3MgKyBkeCwgeSArIGgyICogc2luICsgZHkpXHJcbiAgICAgICAgICAgICAgICAgICAgLy90b3AgcmlnaHRcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyh4ICsgcjIgKyBoMm4gKiBjb3MgKyBkeCwgeSArIGgybiAqIHNpbiArIGR5KVxyXG4gICAgICAgICAgICAgICAgICAgIC8vdG9wIGxlZnRcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyh4IC0gcjIgKyBoMW4gKiBjb3MgKyBkeCwgeSArIGgxbiAqIHNpbiArIGR5KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9jZy5jdHguY2xvc2VQYXRoKClcclxuXHJcbiAgICAgICAgICAgICAgICAvL2ZpbGxcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sb3JcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcblxyXG4gICAgICAgICAgICAgICAgY3VtdWwxICs9IHYxXHJcbiAgICAgICAgICAgICAgICBjdW11bDIgKz0gdjJcclxuXHJcbiAgICAgICAgICAgICAgICAvL1RPRE8gZHJhdyBvbmx5IG9uZSBsaW5lXHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgY29ybmVyIGxpbmVcclxuICAgICAgICAgICAgICAgIC8vaWYgKHNpZGUub3IgPT0gXCJoXCIpIHtcclxuICAgICAgICAgICAgICAgIGRyYXdDb3JuZXJMaW5lKGMxKVxyXG4gICAgICAgICAgICAgICAgZHJhd0Nvcm5lckxpbmUoYzIpXHJcbiAgICAgICAgICAgICAgICAvL2lmICh0aGlzLmFuZ2xlID4gMCAmJiBzaWRlLm9yID09IFwiaFwiKSBkcmF3Q29ybmVyTGluZShjMilcclxuICAgICAgICAgICAgICAgIC8vZWxzZSBkcmF3Q29ybmVyTGluZShjMilcclxuICAgICAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuY29uc3QgY29tcHV0ZVRvdGFsID0gKGNlbGwsIGNhdGVnb3JpZXMpID0+IHtcclxuICAgIGlmICghY2VsbCkgcmV0dXJuIDBcclxuICAgIGxldCB0b3RhbCA9IDBcclxuICAgIGZvciAobGV0IGNvbHVtbiBvZiBjYXRlZ29yaWVzKSB7XHJcbiAgICAgICAgY29uc3QgdiA9IGNlbGxbY29sdW1uXVxyXG4gICAgICAgIGlmICghdikgY29udGludWVcclxuICAgICAgICB0b3RhbCArPSArdlxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvdGFsIHx8IDBcclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcclxuXHJcbi8qKlxyXG4gKiBAbW9kdWxlIHN0eWxlXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBKb3lQbG90U3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgaGVpZ2h0IG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAoKGMsIHIpID0+IHIgKiBNYXRoLnJhbmRvbSgpKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMubGluZUNvbG9yID0gb3B0cy5saW5lQ29sb3IgfHwgKCh5LCB5cywgciwgeikgPT4gJyNCQkInKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIse21pbjpudW1iZXIsIG1heDpudW1iZXJ9LG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgoeSwgeXMsIHIsIHopID0+IHopXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gb3B0cy5maWxsQ29sb3IgfHwgKCh5LCB5cywgciwgeikgPT4gJyNjMDhjNTk2OCcpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cclxuICAgICAqIEBvdmVycmlkZVxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvL2luZGV4IGNlbGxzIGJ5IHkgYW5kIHhcclxuICAgICAgICAvKiogIEB0eXBlIHtvYmplY3R9ICovXHJcbiAgICAgICAgY29uc3QgaW5kID0ge31cclxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgbGV0IHJvdyA9IGluZFtjZWxsLnldXHJcbiAgICAgICAgICAgIGlmICghcm93KSB7XHJcbiAgICAgICAgICAgICAgICByb3cgPSB7fVxyXG4gICAgICAgICAgICAgICAgaW5kW2NlbGwueV0gPSByb3dcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByb3dbY2VsbC54XSA9IHRoaXMuaGVpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBleHRlbnRcclxuICAgICAgICBjb25zdCBlID0gZ2VvQ2FudmFzLmV4dEdlb1xyXG4gICAgICAgIGlmICghZSkgcmV0dXJuXHJcbiAgICAgICAgY29uc3QgeE1pbiA9IE1hdGguZmxvb3IoZS54TWluIC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXHJcbiAgICAgICAgY29uc3QgeE1heCA9IE1hdGguZmxvb3IoZS54TWF4IC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXHJcbiAgICAgICAgY29uc3QgeU1pbiA9IE1hdGguZmxvb3IoZS55TWluIC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXHJcbiAgICAgICAgY29uc3QgeU1heCA9IE1hdGguZmxvb3IoZS55TWF4IC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXHJcblxyXG4gICAgICAgIC8qKiAgQHR5cGUge3ttaW46bnVtYmVyLCBtYXg6bnVtYmVyfX0gKi9cclxuICAgICAgICBjb25zdCB5cyA9IHsgbWluOiB5TWluLCBtYXg6IHlNYXggfVxyXG5cclxuICAgICAgICAvL2RyYXcgbGluZXMsIHJvdyBieSByb3csIHN0YXRpbmcgZnJvbSB0aGUgdG9wXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lSm9pbiA9ICdyb3VuZCdcclxuICAgICAgICBmb3IgKGxldCB5ID0geU1heDsgeSA+PSB5TWluOyB5IC09IHJlc29sdXRpb24pIHtcclxuICAgICAgICAgICAgLy9nZXQgcm93XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGluZFt5XVxyXG5cclxuICAgICAgICAgICAgLy9ubyByb3dcclxuICAgICAgICAgICAgaWYgKCFyb3cpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3BsYWNlIGZpcnN0IHBvaW50XHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oeE1pbiAtIHJlc29sdXRpb24gLyAyLCB5KVxyXG5cclxuICAgICAgICAgICAgLy9zdG9yZSB0aGUgcHJldmlvdXMgaGVpZ2h0XHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgbGV0IGhHX1xyXG5cclxuICAgICAgICAgICAgLy9nbyB0aHJvdWdoIHRoZSBsaW5lIGNlbGxzXHJcbiAgICAgICAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDw9IHhNYXg7IHggKz0gcmVzb2x1dGlvbikge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgY29sdW1uIHZhbHVlXHJcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgICAgIGxldCBoRyA9IHJvd1t4XVxyXG4gICAgICAgICAgICAgICAgaWYgKCFoRykgaEcgPSAwXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGhHIHx8IGhHXykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZHJhdyBsaW5lIG9ubHkgd2hlbiBhdCBsZWFzdCBvbmUgb2YgYm90aCB2YWx1ZXMgaXMgbm9uLW51bGxcclxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gdGVzdCBiZXppZXJDdXJ2ZVRvXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIHJlc29sdXRpb24gLyAyLCB5ICsgaEcpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZWxzZSBtb3ZlIHRoZSBwb2ludFxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHggKyByZXNvbHV0aW9uIC8gMiwgeSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlXHJcbiAgICAgICAgICAgICAgICBoR18gPSBoR1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2xhc3QgcG9pbnRcclxuICAgICAgICAgICAgaWYgKGhHXykgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeE1heCArIHJlc29sdXRpb24gLyAyLCB5KVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGZpbGxcclxuICAgICAgICAgICAgY29uc3QgZmMgPSB0aGlzLmZpbGxDb2xvcih5LCB5cywgcmVzb2x1dGlvbiwgeilcclxuICAgICAgICAgICAgaWYgKGZjICYmIGZjICE9ICdub25lJykge1xyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBmY1xyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGxpbmVcclxuICAgICAgICAgICAgY29uc3QgbGMgPSB0aGlzLmxpbmVDb2xvcih5LCB5cywgcmVzb2x1dGlvbiwgeilcclxuICAgICAgICAgICAgY29uc3QgbHcgPSB0aGlzLmxpbmVXaWR0aCh5LCB5cywgcmVzb2x1dGlvbiwgeilcclxuICAgICAgICAgICAgaWYgKGxjICYmIGxjICE9ICdub25lJyAmJiBsdyA+IDApIHtcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBsY1xyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSBsd1xyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgVGFuYWthU3R5bGUgfSBmcm9tICcuL1RhbmFrYVN0eWxlLmpzJ1xyXG5pbXBvcnQgeyBTdHJva2VTdHlsZSB9IGZyb20gJy4vU3Ryb2tlU3R5bGUuanMnXHJcbmltcG9ydCB7IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlIH0gZnJvbSAnLi9TcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZS5qcydcclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGUgc3R5bGVcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExlZ29TdHlsZSB7XHJcblxyXG4gICAgc3RhdGljIGdldCh2YWx1ZSwgYnJlYWtzLCBjb2xvcnMsIG9wdHMgPSB7fSkge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8vdGhlIGNvbG9yc1xyXG4gICAgICAgIC8vaHR0cDovL3d3dy5qZW5ueXNjcmF5b25jb2xsZWN0aW9uLmNvbS8yMDIxLzA2L2FsbC1jdXJyZW50LWxlZ28tY29sb3JzLmh0bWxcclxuICAgICAgICAvL2h0dHBzOi8vbGVvbmF3aWN6LmdpdGh1Yi5pby9sZWdvY29sb3JzL3JlZmVyZW5jZS9maWd1cmVzL1JFQURNRS1wbG90LTEucG5nXHJcbiAgICAgICAgLypvcHRzLmNvbG9ycyA9IG9wdHMuY29sb3JzIHx8IFtcclxuICAgICAgICAgICAgJyMwMDg1MmInLCAvL2RhcmtlciBncmVlblxyXG4gICAgICAgICAgICAnI2FmZDI0NicsIC8vbGlnaHQgZ3JlZW5cclxuICAgICAgICAgICAgJyNmYWM4MGEnLCAvL2RhcmsgeWVsbG93XHJcbiAgICAgICAgICAgICcjYmI4MDVhJywgLy9icm93blxyXG4gICAgICAgICAgICAnI2Q2NzkyMycsIC8vbW9zdGFyZFxyXG4gICAgICAgICAgICAnI2NiNGUyOScsIC8vcmVkaXNoXHJcbiAgICAgICAgICAgICcjYjQwMDAwJywgLy9yZWRcclxuICAgICAgICAgICAgJyM3MjAwMTInLCAvL2RhcmsgcmVkXHJcbiAgICAgICAgICAgIC8vXCJwdXJwbGVcIixcclxuICAgICAgICAgICAgLy9cIiNlZWVcIiAvL3doaXRoZVxyXG4gICAgICAgIF0qL1xyXG5cclxuICAgICAgICBvcHRzLmNvbERhcmsgPSBvcHRzLmNvbERhcmsgfHwgJyMzMzMnXHJcbiAgICAgICAgb3B0cy5jb2xCcmlnaHQgPSBvcHRzLmNvbEJyaWdodCB8fCAnI2FhYSdcclxuICAgICAgICBvcHRzLndpZHRoRmFjdG9yID0gb3B0cy53aWR0aEZhY3RvciB8fCAwLjEyXHJcblxyXG4gICAgICAgIC8vcmV1c2UgdGFuYWthIGFzIGJhc2lzXHJcbiAgICAgICAgY29uc3QgdHMgPSBUYW5ha2FTdHlsZS5nZXQodmFsdWUsIGJyZWFrcywgY29sb3JzLCBvcHRzKVxyXG4gICAgICAgIC8vc3R5bGUgdG8gc2hvdyBsaW1pdHMgYmV0d2VlbiBwaWVjZXNcclxuICAgICAgICBjb25zdCBzc3QgPSBuZXcgU3Ryb2tlU3R5bGUoe1xyXG4gICAgICAgICAgICBzdHJva2VDb2xvcjogKCkgPT4gJyM2NjYnLFxyXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogKGMsIHIsIHopID0+IDAuMiAqIHosXHJcbiAgICAgICAgICAgIGZpbHRlcjogb3B0cy5maWx0ZXIsXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgdHNbMF0sXHJcbiAgICAgICAgICAgIHNzdCxcclxuICAgICAgICAgICAgdHNbMV0sXHJcbiAgICAgICAgICAgIG5ldyBMZWdvVG9wU3R5bGUoeyBjb2xEYXJrOiBvcHRzLmNvbERhcmssIGNvbEJyaWdodDogb3B0cy5jb2xCcmlnaHQsIGZpbHRlcjogb3B0cy5maWx0ZXIgfSksXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpOnN0cmluZ30gY29kZVxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNvbG9yXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICogQHJldHVybnMge0FycmF5LjxTdHlsZT59XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRDYXRlZ29yeShjb2RlLCBjb2xvciwgb3B0cykge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIG9wdHMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcclxuICAgICAgICBvcHRzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjYWFhJ1xyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHMgPSBuZXcgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUoeyBjb2RlOiBjb2RlLCBjb2xvcjogY29sb3IgfSlcclxuICAgICAgICAvL3N0eWxlIHRvIHNob3cgbGltaXRzIGJldHdlZW4gcGllY2VzXHJcbiAgICAgICAgY29uc3Qgc3N0ID0gbmV3IFN0cm9rZVN0eWxlKHsgc3Ryb2tlQ29sb3I6ICgpID0+ICcjNjY2Jywgc3Ryb2tlV2lkdGg6IChjLCByLCB6KSA9PiAwLjIgKiB6IH0pXHJcblxyXG4gICAgICAgIHJldHVybiBbcywgc3N0LCBuZXcgTGVnb1RvcFN0eWxlKHsgY29sRGFyazogb3B0cy5jb2xEYXJrLCBjb2xCcmlnaHQ6IG9wdHMuY29sQnJpZ2h0IH0pXVxyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQSBzdHlsZSB0byBkcmF3IHRvcCBjaXJjbGUgb2YgbGVnbyBicmlja3MuXHJcbiAqL1xyXG5jbGFzcyBMZWdvVG9wU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R8dW5kZWZpbmVkfSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG4gICAgICAgIHRoaXMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcclxuICAgICAgICB0aGlzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjYWFhJ1xyXG4gICAgfVxyXG5cclxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcikge1xyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSAwLjYgKiBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZGFyayBwYXJ0XHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sRGFya1xyXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhjLnggKyByICogMC41LCBjLnkgKyByICogMC41LCByICogMC41NSAqIDAuNSwgTWF0aC5QSSAvIDQsIC1NYXRoLlBJICogKDMgLyA0KSwgdHJ1ZSlcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9icmlnaHQgcGFydFxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbEJyaWdodFxyXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhjLnggKyByICogMC41LCBjLnkgKyByICogMC41LCByICogMC41NSAqIDAuNSwgTWF0aC5QSSAvIDQsIC1NYXRoLlBJICogKDMgLyA0KSwgZmFsc2UpXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQG1vZHVsZSBzdHlsZVxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTW9zYWljU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiBcIiNFQTZCQUNcIikgLy8oYyxyLHosdnMpID0+IHt9XHJcblxyXG4gICAgICAgIC8qKiBUaGUgbW9zYWljIGZhY3Rvciwgd2l0aGluIFswLDAuNV0uIFNldCB0byAwIGZvciBubyBtb3NhaWMgZWZmZWN0LiBTZXQgdG8gMC41IGZvciBzdHJvbmcgbW9zYWljIGVmZmVjdC5cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMubW9zYWljRmFjdG9yID0gb3B0cy5tb3NhaWNGYWN0b3IgfHwgMC4xNVxyXG5cclxuICAgICAgICAvKiogVGhlIG1vc2FpYyBzaGFkb3cgZmFjdG9yLCB3aXRoaW4gWzAsMC41XS4gU2V0IHRvIDAgZm9yIG5vIG1vc2FpYyBzaGFkb3cuIFNldCB0byAwLjUgZm9yIHN0cm9uZyBtb3NhaWMgc2hhZG93LlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaGFkb3dGYWN0b3IgPSBvcHRzLnNoYWRvd0ZhY3RvciB8fCAwLjJcclxuXHJcbiAgICAgICAgLyoqIFRoZSBtb3NhaWMgc2hhZG93IGNvbG9yLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5zaGFkb3dDb2xvciA9IG9wdHMuc2hhZG93Q29sb3IgfHwgJyM1NTUnXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxyXG5cclxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXHJcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLy9zZXQgc3Ryb2tlIHN0eWxlLCBmb3Igc2hhZG93XHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuc2hhZG93Q29sb3JcclxuICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHRoaXMuc2hhZG93RmFjdG9yICogcmVzb2x1dGlvblxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUpvaW4gPSAncm91bmQnXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lQ2FwID0gJ2J1dHQnXHJcblxyXG4gICAgICAgIC8vZnVuY3Rpb24gdG8gY29tcHV0ZSBwb3NpdGlvbiBtb3NhaWMgZWZmZWN0XHJcbiAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiB0aGlzLm1vc2FpY0ZhY3RvclxyXG4gICAgICAgIGNvbnN0IG1vc2FpYyA9ICgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgeDogTWF0aC5yYW5kb20oKSAqIGQsIHk6IE1hdGgucmFuZG9tKCkgKiBkIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgLy9zZXQgZmlsbCBjb2xvclxyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9IGNvbFxyXG5cclxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XHJcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHJlc29sdXRpb24sIHopXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgcG9zaXRpb24gbW9zYWljIGVmZmVjdFxyXG4gICAgICAgICAgICBjb25zdCBsbCA9IG1vc2FpYygpLFxyXG4gICAgICAgICAgICAgICAgdWwgPSBtb3NhaWMoKSxcclxuICAgICAgICAgICAgICAgIGxyID0gbW9zYWljKCksXHJcbiAgICAgICAgICAgICAgICB1ciA9IG1vc2FpYygpXHJcblxyXG4gICAgICAgICAgICAvL3N0cm9rZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFkb3dGYWN0b3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyBsbC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsbC55KVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIGxyLngsIGNlbGwueSArIG9mZnNldC5keSArIGxyLnkpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC0gdXIueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAtIHVyLnkpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vZmlsbFxyXG5cclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyBsbC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsbC55KVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC0gbHIueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgbHIueSlcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIHVyLngsIGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLSB1ci55KVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyB1bC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyByZXNvbHV0aW9uIC0gdWwueSlcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcclxuXHJcbi8qKlxyXG4gKiBAbW9kdWxlIHN0eWxlXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBOaW5qYVN0YXJTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+IFwiI0VBNkJBQ1wiKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCwgd2l0aGluIFswLDFdOlxyXG4gICAgICAgICAqICAtIDAsIG5vdGhpbmcgc2hvd25cclxuICAgICAgICAgKiAgLSAxLCBlbnRpcmUgc3F1YXJlXHJcbiAgICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaGFwZS5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gJ28nKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gKiAwLjVcclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIC8vY29sb3JcclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xcclxuXHJcbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlbyB1bml0XHJcbiAgICAgICAgICAgIGxldCBrID0gdGhpcy5zaXplKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcclxuICAgICAgICAgICAgayA9IGsgPCAwID8gMCA6IGsgPiAxID8gMSA6IGtcclxuICAgICAgICAgICAgY29uc3Qgc0cyID0gayAqIHIyXHJcblxyXG4gICAgICAgICAgICAvL3NoYXBlXHJcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZSA/IHRoaXMuc2hhcGUoY2VsbCkgOiAnbydcclxuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgLy9UT0RPIHVzZVxyXG4gICAgICAgICAgICAvL2NvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHIsIHopXHJcblxyXG4gICAgICAgICAgICAvL2NlbnRlciBwb3NpdGlvblxyXG4gICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIHIyXHJcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcjJcclxuXHJcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3AnKSB7XHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCwgY3kgKyByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4ICsgc0cyLCBjeSArIHNHMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4ICsgcjIsIGN5KVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyBzRzIsIGN5IC0gc0cyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3gsIGN5IC0gcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCAtIHNHMiwgY3kgLSBzRzIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCAtIHIyLCBjeSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4IC0gc0cyLCBjeSArIHNHMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdvJykge1xyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oY3gsIGN5ICsgc0cyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyByMiwgY3kgKyByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4ICsgc0cyLCBjeSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4ICsgcjIsIGN5IC0gcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCwgY3kgLSBzRzIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCAtIHIyLCBjeSAtIHIyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggLSBzRzIsIGN5KVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggLSByMiwgY3kgKyByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHNoYXBlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQG1vZHVsZSBzdHlsZVxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUGlsbGFyU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCBvZiB0aGUgbGluZSByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+IFwiI2MwOGM1OVwiKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgbGluZSByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IDAuNSAqIHJlc29sdXRpb24pXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLCBudW1iZXIsb2JqZWN0KTpib29sZWFufSAqL1xyXG4gICAgICAgIHRoaXMuc2ltcGxlID0gb3B0cy5zaW1wbGUgfHwgKCgpID0+IGZhbHNlKVxyXG5cclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnZpZXdIZWlnaHRGYWN0b3IgPSBvcHRzLnZpZXdIZWlnaHRGYWN0b3IgfHwgMS41XHJcbiAgICAgICAgLy8wLDAgaXMgdGhlIGNlbnRlclxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMudmlld1NYID0gb3B0cy52aWV3U1ggPT0gdW5kZWZpbmVkID8gMCA6IG9wdHMudmlld1NYXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy52aWV3U1kgPSBvcHRzLnZpZXdTWSA9PSB1bmRlZmluZWQgPyAtMC41IDogb3B0cy52aWV3U1lcclxuXHJcbiAgICAgICAgLy9UT0RPIHJlcGxhY2Ugd2l0aCBzdW4gbG9jYXRpb24gP1xyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc2hhZG93RGlyZWN0aW9uID1cclxuICAgICAgICAgICAgb3B0cy5zaGFkb3dEaXJlY3Rpb24gPT0gdW5kZWZpbmVkID8gKC00MC4zICogTWF0aC5QSSkgLyAxODAuMCA6IG9wdHMuc2hhZG93RGlyZWN0aW9uXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaGFkb3dGYWN0b3IgPSBvcHRzLnNoYWRvd0ZhY3RvciB8fCAwLjNcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnNoYWRvd0NvbG9yID0gb3B0cy5zaGFkb3dDb2xvciB8fCAnIzAwMDAwMDMzJ1xyXG5cclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLm91dGxpbmVDb2wgPSBvcHRzLm91dGxpbmVDb2wgfHwgJyNGRkZGRkYnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5vdXRsaW5lV2lkdGhQaXggPSBvcHRzLm91dGxpbmVXaWR0aFBpeCA9PSB1bmRlZmluZWQgPyAwLjUgOiBvcHRzLm91dGxpbmVXaWR0aFBpeFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBjZWxscyBhcyBzZWdtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvL2dldCB2aWV3IGNlbnRlciBnZW8gcG9zaXRpb25cclxuICAgICAgICBjb25zdCBjdnggPSBnZW9DYW52YXMudmlldy54ICsgdGhpcy52aWV3U1ggKiBnZW9DYW52YXMudyAqIHpcclxuICAgICAgICBjb25zdCBjdnkgPSBnZW9DYW52YXMudmlldy55ICsgdGhpcy52aWV3U1kgKiBnZW9DYW52YXMuaCAqIHpcclxuICAgICAgICAvL2dldCB2aWV3IGhlaWdodFxyXG4gICAgICAgIGNvbnN0IEggPSB0aGlzLnZpZXdIZWlnaHRGYWN0b3IgKiAoZ2VvQ2FudmFzLncgKyBnZW9DYW52YXMuaCkgKiAwLjUgKiB6XHJcblxyXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB5IGFuZCB4XHJcbiAgICAgICAgLy9jb25zdCBkaXN0VG9WaWV3Q2VudGVyID0gKGMpID0+IHsgY29uc3QgZHggPSBjdnggLSBjLngsIGR5ID0gY3Z5IC0gYy55OyByZXR1cm4gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KSB9XHJcbiAgICAgICAgY2VsbHMuc29ydCgoYzEsIGMyKSA9PiAxMDAwMDAwMDAgKiAoYzIueSAtIGMxLnkpICsgYzEueCAtIGMyLngpXHJcblxyXG4gICAgICAgIC8vZ2V0IHNpbXBsZSBpbmZvcm1hdGlvblxyXG4gICAgICAgIGNvbnN0IHNpbXBsZSA9IHRoaXMuc2ltcGxlKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcclxuXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lQ2FwID0gc2ltcGxlID8gJ2J1dHQnIDogJ3JvdW5kJ1xyXG5cclxuICAgICAgICAvL2RyYXcgc2hhZG93c1xyXG4gICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnNoYWRvd0NvbG9yXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSB0aGlzLnNoYWRvd0NvbG9yXHJcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAvL3dpZHRoXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPCAwKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9oZWlnaHRcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBoRyA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWhHIHx8IGhHIDwgMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICAvL1RPRE8gdXNlIHRoYXRcclxuICAgICAgICAgICAgLy9jb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByZXNvbHV0aW9uLCB6KVxyXG5cclxuICAgICAgICAgICAgLy9zZXQgd2lkdGhcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSB3R1xyXG5cclxuICAgICAgICAgICAgLy9jb21wdXRlIGNlbGwgY2VudGVyIHBvc3RpdGlvblxyXG4gICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIHJlc29sdXRpb24gLyAyXHJcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcmVzb2x1dGlvbiAvIDJcclxuICAgICAgICAgICAgY29uc3QgbHMgPSBoRyAqIHRoaXMuc2hhZG93RmFjdG9yXHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgc2VnbWVudFxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGN4LCBjeSlcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyBscyAqIE1hdGguY29zKHRoaXMuc2hhZG93RGlyZWN0aW9uKSwgY3kgKyBscyAqIE1hdGguc2luKHRoaXMuc2hhZG93RGlyZWN0aW9uKSlcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG5cclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2ltcGxlKSB7XHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgYmFzZSBjaXJjbGVcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKTtcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoXHJcbiAgICAgICAgICAgICAgICAgICAgY3gsIGN5LFxyXG4gICAgICAgICAgICAgICAgICAgIHdHICogMC41LFxyXG4gICAgICAgICAgICAgICAgICAgIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5zdHJva2UoKTtcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKCk7XHJcbiAgICAgICAgICAgIH0qL1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9kcmF3IHBpbGxhcnNcclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIC8vY29sb3JcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy93aWR0aFxyXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vaGVpZ2h0XHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3QgaEcgPSB0aGlzLmhlaWdodCA/IHRoaXMuaGVpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKCFoRyB8fCBoRyA8IDApIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgLy9UT0RPIHVzZSB0aGF0XHJcbiAgICAgICAgICAgIC8vY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgcmVzb2x1dGlvbiwgeilcclxuXHJcbiAgICAgICAgICAgIC8vY29tcHV0ZSBjZWxsIGNlbnRlciBwb3N0aXRpb25cclxuICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyByZXNvbHV0aW9uIC8gMlxyXG4gICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIHJlc29sdXRpb24gLyAyXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgYW5nbGVcclxuICAgICAgICAgICAgY29uc3QgZHggPSBjeCAtIGN2eCxcclxuICAgICAgICAgICAgICAgIGR5ID0gY3kgLSBjdnlcclxuICAgICAgICAgICAgY29uc3QgYSA9IE1hdGguYXRhbjIoZHksIGR4KVxyXG4gICAgICAgICAgICBjb25zdCBEID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KVxyXG4gICAgICAgICAgICBjb25zdCBkID0gKEQgKiBoRykgLyAoSCAtIGhHKVxyXG5cclxuICAgICAgICAgICAgaWYgKHNpbXBsZSkge1xyXG4gICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd0dcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGN4LCBjeSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBiYWNrZ3JvdW5kIHNlZ21lbnRcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLm91dGxpbmVDb2xcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd0cgKyAyICogdGhpcy5vdXRsaW5lV2lkdGhQaXggKiB6XHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCwgY3kpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSkpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXHJcblxyXG4gICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd0dcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGN4LCBjeSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuXHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgdG9wIGNpcmNsZVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMub3V0bGluZUNvbFxyXG4gICAgICAgICAgICAgICAgLy9jZy5jdHguZmlsbFN0eWxlID0gXCIjYzA4YzU5XCJcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gdGhpcy5vdXRsaW5lV2lkdGhQaXggKiB6XHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSksIHdHICogMC41LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5maWxsKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vaW4gY2FzZS4uLlxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9ICdidXR0J1xyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQSBzdHlsZSB3aGVyZSBlYWNoIGNlbGwgaXMgcmVwcmVzZW50ZWQgYnkgYSBzZWdtZW50IHdob3NlIGxlbmd0aCwgd2lkdGgsIGNvbG9yIGFuZCBvcmllbnRhdGlvbiBjYW4gdmFyeSBhY2NvcmRpbmcgdG8gc3RhdGlzdGljYWwgdmFsdWVzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIHN0eWxlXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTZWdtZW50U3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwgc2VnbWVudC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+IFwiI0VBNkJBQ1wiKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24gKiAwLjEpICAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YgdGhlIHNlZ21lbnQgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRzLmxlbmd0aCB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24gKiAwLjkpICAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBvcmllbnRhdGlvbiAoaW4gZGVncmVlcykgb2YgdGhlIHNlZ21lbnQgcmVwcmVzZW50aW5nIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgKCgpID0+IDE4MCAqIE1hdGgucmFuZG9tKCkpIC8vKGMscix6LHZzKSA9PiB7fVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBjZWxscyBhcyBzZWdtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9ICdidXR0J1xyXG5cclxuICAgICAgICAvL2NvbnZlcnNpb24gZmFjdG9yIGRlZ3JlZSAtPiByYWRpYW5cclxuICAgICAgICBjb25zdCBmID0gTWF0aC5QSSAvIDE4MFxyXG5cclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIC8vY29sb3JcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy93aWR0aFxyXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vbGVuZ3RoXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3QgbEcgPSB0aGlzLmxlbmd0aCA/IHRoaXMubGVuZ3RoKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8IDApIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL29yaWVudGF0aW9uIChpbiByYWRpYW4pXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBvciA9IHRoaXMub3JpZW50YXRpb24oY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSAqIGZcclxuICAgICAgICAgICAgaWYgKG9yID09PSB1bmRlZmluZWQgfHwgaXNOYU4ob3IpKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XHJcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHJlc29sdXRpb24sIHopXHJcblxyXG4gICAgICAgICAgICAvL3NldCBjb2xvciBhbmQgd2lkdGhcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHdHXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgc2VnbWVudCBjZW50ZXIgcG9zdGl0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgcmVzb2x1dGlvbiAvIDIgKyBvZmZzZXQuZHhcclxuICAgICAgICAgICAgY29uc3QgY3kgPSBjZWxsLnkgKyByZXNvbHV0aW9uIC8gMiArIG9mZnNldC5keVxyXG5cclxuICAgICAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgZGlyZWN0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IGR4ID0gMC41ICogTWF0aC5jb3Mob3IpICogbEdcclxuICAgICAgICAgICAgY29uc3QgZHkgPSAwLjUgKiBNYXRoLnNpbihvcikgKiBsR1xyXG5cclxuICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCAtIGR4LCBjeSAtIGR5KVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCArIGR4LCBjeSArIGR5KVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgdmlld1NjYWxlOiB2aWV3U2NhbGUsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIGNlbGxzOiBjZWxscyB9KVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEEgdmVyeSBnZW5lcmljIHN0eWxlIHRoYXQgc2hvd3MgZ3JpZCBjZWxscyB3aXRoIHNwZWNpZmljIGNvbG9yLCBzaXplIGFuZCBzaGFwZS5cclxuICogSXQgY2FuIGJlIHVzZWQgdG8gc2hvdyB2YXJpYWJsZXMgYXMgY2VsbCBjb2xvcnMsIGNlbGwgc2l6ZSwgY2VsbCBzaGFwZSwgb3IgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSB0aHJlZSB2aXN1YWwgdmFyaWFibGVzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIHN0eWxlXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaGFwZUNvbG9yU2l6ZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gXCIjRUE2QkFDXCIpIC8vKGMscix6LHZzKSA9PiB7fVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaGFwZSBvZiBhIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlciwgbnVtYmVyLG9iamVjdCk6aW1wb3J0KFwiLi4vY29yZS9TdHlsZS5qc1wiKS5TaGFwZX0gKi9cclxuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gXCJzcXVhcmVcIikgLy8oYyxyLHosdnMpID0+IHt9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNxdWFyZXMsIHdpdGggdmFyaW91cyBjb2xvcnMgYW5kIHNpemVzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICogQG92ZXJyaWRlXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xyXG5cclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIC8vem9vbVxyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gKiAwLjVcclxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIC8vY29sb3JcclxuICAgICAgICAgICAgbGV0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiBcImJsYWNrXCJcclxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3NpemVcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogcmVzb2x1dGlvblxyXG4gICAgICAgICAgICBpZiAoIXNpemUpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3NoYXBlXHJcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZSA/IHRoaXMuc2hhcGUoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdzcXVhcmUnXHJcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ25vbmUnKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XHJcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHJlc29sdXRpb24sIHopXHJcblxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9IGNvbFxyXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdzcXVhcmUnKSB7XHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgc3F1YXJlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gcmVzb2x1dGlvbiAqICgxIC0gc2l6ZSAvIHJlc29sdXRpb24pICogMC41XHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxSZWN0KGMueCArIGQgKyBvZmZzZXQuZHgsIGMueSArIGQgKyBvZmZzZXQuZHksIHNpemUsIHNpemUpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdjaXJjbGUnKSB7XHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgY2lyY2xlXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhjLnggKyByMiArIG9mZnNldC5keCwgYy55ICsgcjIgKyBvZmZzZXQuZHksIHNpemUgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkb251dCcpIHtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBkb251dFxyXG4gICAgICAgICAgICAgICAgY29uc3QgeGMgPSBjLnggKyByMiArIG9mZnNldC5keCxcclxuICAgICAgICAgICAgICAgICAgICB5YyA9IGMueSArIHIyICsgb2Zmc2V0LmR5XHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4YywgeWMpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyh4YywgeWMsIHIyLCAwLCAyICogTWF0aC5QSSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKHhjLCB5YywgKDEgLSBzaXplIC8gcmVzb2x1dGlvbikgKiByMiwgMCwgMiAqIE1hdGguUEksIHRydWUpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmNsb3NlUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZGlhbW9uZCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHMyID0gc2l6ZSAqIDAuNVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54ICsgcjIgLSBzMiwgYy55ICsgcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgKyBzMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHIyICsgczIsIGMueSArIHIyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54ICsgcjIsIGMueSArIHIyIC0gczIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfdXAnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgLSBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSAtIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9kb3duJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHIyID0gKHNpemUgLSByZXNvbHV0aW9uKSAvIDJcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGMueCAtIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHIyLCBjLnkgLSBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX2xlZnQnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCAtIGRyMiwgYy55ICsgcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfcmlnaHQnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgLSBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgKyByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCAtIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHNoYXBlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgdmlld1NjYWxlOiB2aWV3U2NhbGUsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIGNlbGxzOiBjZWxscyB9KVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQSBzdHlsZSB0byBzaG93IHRoZSBzaWRlcyBvZiBncmlkIGNlbGxzIGJhc2VkIG9uIHRoZWlyIGRpZmZlcmVudCBjYXRlZ29yaWVzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIHN0eWxlXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaWRlQ2F0ZWdvcnlTdHlsZSBleHRlbmRzIFNpZGVTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY2F0ZWdvcnkgY29kZSBvZiBhIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvZGUgPSBvcHRzLmNvZGVcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRpY3Rpb25hcnkgKHN0cmluZyAtPiBjb2xvcikgd2hpY2ggZ2l2ZSB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeS5cclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxyXG5cclxuICAgICAgICAvL2J1aWxkIHNpZGVzXHJcblxyXG4gICAgICAgIC8qKiAgQHR5cGUge0FycmF5LjxpbXBvcnQoJy4vU2lkZVN0eWxlLmpzJykuU2lkZT59ICovXHJcbiAgICAgICAgY29uc3Qgc2lkZXMgPSBTaWRlU3R5bGUuYnVpbGRTaWRlcyhjZWxscywgcmVzb2x1dGlvbilcclxuICAgICAgICBpZiAoc2lkZXMubGVuZ3RoID09IDApIHJldHVyblxyXG5cclxuICAgICAgICAvL2dldCBzaWRlIHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKHNpZGVzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvL2RyYXcgc2lkZXNcclxuXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lQ2FwID0gJ2J1dHQnXHJcbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uKjAuNVxyXG4gICAgICAgIGZvciAobGV0IHNpZGUgb2Ygc2lkZXMpIHtcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IGNhdGVnb3J5IGNvZGVzIGZvciBib3RoIGNlbGxzXHJcbiAgICAgICAgICAgIGNvbnN0IGNvZGUxID0gc2lkZS5jMSA/IHRoaXMuY29kZShzaWRlLmMxLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBjb25zdCBjb2RlMiA9IHNpZGUuYzIgPyB0aGlzLmNvZGUoc2lkZS5jMiwgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKGNvZGUxID09IGNvZGUyKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy93aWR0aFxyXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDw9IDApIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGNvbnN0IHcyID0gd0cgKiAwLjVcclxuXHJcbiAgICAgICAgICAgIC8vc2V0IHdpZHRoXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd0dcclxuXHJcbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHdpdGggY29ycmVjdCBvcmllbnRhdGlvblxyXG4gICAgICAgICAgICBpZiAoc2lkZS5vciA9PT0gJ2gnKSB7XHJcbiAgICAgICAgICAgICAgICAvL3RvcCBsaW5lXHJcbiAgICAgICAgICAgICAgICBpZiAoY29kZTIpIHtcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3JbY29kZTJdXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oc2lkZS54LXIyLCBzaWRlLnkgKyB3MilcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhzaWRlLngrcjIsIHNpZGUueSArIHcyKVxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL2JvdHRvbSBsaW5lXHJcbiAgICAgICAgICAgICAgICBpZiAoY29kZTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3JbY29kZTFdXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oc2lkZS54LXIyLCBzaWRlLnkgLSB3MilcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhzaWRlLngrcjIsIHNpZGUueSAtIHcyKVxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vcmlnaHQgbGluZVxyXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbG9yW2NvZGUyXVxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHNpZGUueCArIHcyLCBzaWRlLnktcjIpXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oc2lkZS54ICsgdzIsIHNpZGUueStyMilcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9sZWZ0IGxpbmVcclxuICAgICAgICAgICAgICAgIGlmIChjb2RlMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltjb2RlMV1cclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhzaWRlLnggLSB3Miwgc2lkZS55LXIyKVxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHNpZGUueCAtIHcyLCBzaWRlLnkrcjIpXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcblxyXG4vKiogQHR5cGVkZWYge3sgeDpudW1iZXIsIHk6bnVtYmVyLCBvcjpcInZcInxcImhcIiwgYzE6KGltcG9ydCgnLi4vY29yZS9EYXRhc2V0JykuQ2VsbCl8dW5kZWZpbmVkLCBjMjooaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQnKS5DZWxsKXx1bmRlZmluZWQgfX0gU2lkZSAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihBcnJheS48U2lkZT4sbnVtYmVyLCBudW1iZXIpOip9IFNpZGVWaWV3U2NhbGUgKi9cclxuXHJcbi8qKlxyXG4gKiBAbW9kdWxlIHN0eWxlXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaWRlU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgYSBjZWxsIHNpZGUuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKFNpZGUsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKHNpZGUsIHJlc29sdXRpb24sIHosIHNpZGVWaWV3U2NhbGUpID0+ICcjRUE2QkFDJylcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiBhIGNlbGwgc2lkZSwgaW4gZ2VvIHVuaXRcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgc2lkZVZpZXdTY2FsZSkgPT4gcmVzb2x1dGlvbiAvIDUpXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIGEgY2VsbCBzaWRlLCBpbiBnZW8gdW5pdFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihTaWRlLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRzLmxlbmd0aCB8fCAoKHNpZGUsIHJlc29sdXRpb24sIHosIHNpZGVWaWV3U2NhbGUpID0+IHJlc29sdXRpb24pXHJcblxyXG4gICAgICAgIC8qKiBTZXQgdG8gQSBvciB0cnVlIHNvIHRoYXQgdGhlIHNpZGUgaXMgZHJhd24gYXMgYSBkaWFtb25kICovXHJcbiAgICAgICAgdGhpcy5kaWFtb25kID0gb3B0cy5kaWFtb25kXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vYnVpbGQgc2lkZXNcclxuXHJcbiAgICAgICAgLyoqICBAdHlwZSB7QXJyYXkuPFNpZGU+fSAqL1xyXG4gICAgICAgIGNvbnN0IHNpZGVzID0gU2lkZVN0eWxlLmJ1aWxkU2lkZXMoY2VsbHMsIHJlc29sdXRpb24pXHJcbiAgICAgICAgaWYgKHNpZGVzLmxlbmd0aCA9PSAwKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9nZXQgc2lkZSB2aWV3IHNjYWxlXHJcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShzaWRlcywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLy9kcmF3IHNpZGVzXHJcblxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9ICdidXR0J1xyXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxyXG4gICAgICAgIGZvciAobGV0IHNpZGUgb2Ygc2lkZXMpIHtcclxuXHJcbiAgICAgICAgICAgIC8vY29sb3JcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihzaWRlLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5kaWFtb25kKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sXHJcblxyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGRpYW1vbmRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzaWRlLngsIHkgPSBzaWRlLnlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHggLSByMiwgeSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHgsIHkgKyByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHggKyByMiwgeSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHgsIHkgLSByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguY2xvc2VQYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vd2lkdGhcclxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8PSAwKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgICAgIC8vbGVuZ3RoXHJcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCBsRyA9IHRoaXMubGVuZ3RoID8gdGhpcy5sZW5ndGgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8PSAwKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbEcyID0gbEcgKiAwLjVcclxuXHJcbiAgICAgICAgICAgICAgICAvL3NldCB3aWR0aFxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSB3R1xyXG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcclxuXHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgc2VnbWVudCB3aXRoIGNvcnJlY3Qgb3JpZW50YXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzaWRlLngsIHkgPSBzaWRlLnlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGlmIChzaWRlLm9yID09PSBcInZcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHgsIHkgLSBsRzIpXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCwgeSArIGxHMilcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oeCAtIGxHMiwgeSlcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyh4ICsgbEcyLCB5KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQnKS5DZWxsPn0gY2VsbHMgVGhlIGNlbGxzIHRvIHVzZSB0byBidWlsZCB0aGUgc2lkZXMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgY2VsbHMgcmVzb2x1dGlvblxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB3aXRoSG9yaXpvbnRhbCBTZXQgdG8gdHJ1ZSB0byBidWlsZCBob3Jpem9udGFsIHNpZGVzLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHdpdGhWZXJ0aWNhbCBTZXQgdG8gdHJ1ZSB0byBidWlsZCB2ZXJ0aWNhbCBzaWRlcywgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjZW50ZXIgU2V0IHRvIHRydWUgc28gdGhhdCB0aGUgc2lkZSBjb29yZGluYXRlIGFyZSB0aG9zZSBvZiBpdHMgY2VudGVyIHBvaW50IHJhdGhlciB0aGFuIGl0cyBsZWZ0L2JvdHRvbSBwb2ludCAodGhlIHNpZGUgeCx5IGNvb3JkaW5hdGVzIGFyZSB0aG9zZSBvZiB0aGUgbGVmdCBwb2ludCBmb3IgaG9yaXpvbnRhbCBzaWRlcywgYW5kIG9mIHRoZSBib3R0b20gcG9pbnQgZm9yIHZlcnRpY2FsIHNpZGVzKVxyXG4gICAgICogQHJldHVybnMgeyBBcnJheS48U2lkZT4gfVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYnVpbGRTaWRlcyhjZWxscywgcmVzb2x1dGlvbiwgd2l0aEhvcml6b250YWwgPSB0cnVlLCB3aXRoVmVydGljYWwgPSB0cnVlLCBjZW50ZXIgPSB0cnVlKSB7XHJcbiAgICAgICAgLyoqIEB0eXBlIHsgQXJyYXkuPFNpZGU+IH0gKi9cclxuICAgICAgICBjb25zdCBzaWRlcyA9IFtdXHJcblxyXG4gICAgICAgIGNvbnN0IHIyID0gY2VudGVyID8gcmVzb2x1dGlvbiAvIDIgOiAwXHJcblxyXG4gICAgICAgIC8vbWFrZSBob3Jpem9udGFsIHNpZGVzXHJcbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHggYW5kIHlcclxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IChjMi54ID09IGMxLnggPyBjMS55IC0gYzIueSA6IGMxLnggLSBjMi54KSlcclxuICAgICAgICBsZXQgYzEgPSBjZWxsc1swXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGMyID0gY2VsbHNbaV1cclxuXHJcbiAgICAgICAgICAgIGlmICgoYzEueSArIHJlc29sdXRpb24gPT0gYzIueSkgJiYgKGMxLnggPT0gYzIueCkpXHJcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGluIHNhbWUgY29sdW1uIGFuZCB0b3VjaCBhbG9uZyBob3Jpem9udGFsIHNpZGVcclxuICAgICAgICAgICAgICAgIC8vbWFrZSBzaGFyZWQgc2lkZVxyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgb3I6ICdoJyxcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcjIsIHk6IGMyLnksXHJcbiAgICAgICAgICAgICAgICAgICAgYzE6IGMxLCBjMjogYzJcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9jZWxscyBkbyBub3QgdG91Y2ggYWxvbmcgaG9yaXpvbnRhbCBzaWRlXHJcbiAgICAgICAgICAgICAgICAvL21ha2UgdHdvIHNpZGVzOiB0b3Agb25lIGZvciBjMSwgYm90dG9tIGZvciBjMlxyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgb3I6ICdoJyxcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcjIsIHk6IGMxLnkgKyByZXNvbHV0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGMxOiBjMSwgYzI6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIG9yOiAnaCcsXHJcbiAgICAgICAgICAgICAgICAgICAgeDogYzIueCArIHIyLCB5OiBjMi55LFxyXG4gICAgICAgICAgICAgICAgICAgIGMxOiB1bmRlZmluZWQsIGMyOiBjMlxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYzEgPSBjMlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9tYWtlIHZlcnRpY2FsIHNpZGVzXHJcbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHkgYW5kIHhcclxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IChjMi55ID09IGMxLnkgPyBjMS54IC0gYzIueCA6IGMxLnkgLSBjMi55KSlcclxuICAgICAgICBjMSA9IGNlbGxzWzBdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgYzIgPSBjZWxsc1tpXVxyXG5cclxuICAgICAgICAgICAgaWYgKChjMS54ICsgcmVzb2x1dGlvbiA9PSBjMi54KSAmJiAoYzEueSA9PSBjMi55KSlcclxuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSByb3cgYW5kIHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcclxuICAgICAgICAgICAgICAgIC8vbWFrZSBzaGFyZWQgc2lkZVxyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcmVzb2x1dGlvbiwgeTogYzEueSArIHIyLFxyXG4gICAgICAgICAgICAgICAgICAgIGMxOiBjMSwgYzI6IGMyXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vY2VsbHMgZG8gbm90IHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcclxuICAgICAgICAgICAgICAgIC8vbWFrZSB0d28gc2lkZXM6IHJpZ2h0IG9uZSBmb3IgYzEsIGxlZnQgZm9yIGMyXHJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBvcjogJ3YnLFxyXG4gICAgICAgICAgICAgICAgICAgIHg6IGMxLnggKyByZXNvbHV0aW9uLCB5OiBjMS55ICsgcjIsXHJcbiAgICAgICAgICAgICAgICAgICAgYzE6IGMxLCBjMjogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMi54LCB5OiBjMi55ICsgcjIsXHJcbiAgICAgICAgICAgICAgICAgICAgYzE6IHVuZGVmaW5lZCwgYzI6IGMyXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjMSA9IGMyXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzaWRlc1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcclxuaW1wb3J0IHsgbWFrZVdlYkdMQ2FudmFzIH0gZnJvbSAnLi4vdXRpbHMvd2ViR0xVdGlscy5qcydcclxuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkLmpzJ1xyXG5cclxuLyoqXHJcbiAqIFN0eWxlIGJhc2VkIG9uIHdlYkdMXHJcbiAqIFRvIHNob3cgY2VsbHMgYXMgY29sb3JlZCBzcXVhcmVzLCBmcm9tIGNhdGVnb3JpZXMuXHJcbiAqIEFsbCBjZWxscyBhcmUgZHJhd24gYXMgc3F1YXJlcywgd2l0aCB0aGUgc2FtZSBzaXplXHJcbiAqXHJcbiAqIEBtb2R1bGUgc3R5bGVcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY2F0ZWdvcnkgY29kZSBvZiB0aGUgY2VsbCwgZm9yIGNvbG9yaW5nLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvZGUgPSBvcHRzLmNvZGVcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRpY3Rpb25hcnkgKGNvZGUgLT4gY29sb3IpIHdoaWNoIGdpdmVzIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5IGNvZGUuXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH0gKi9cclxuICAgICAgICBvcHRzLmNvbG9yID0gb3B0cy5jb2xvciB8fCB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHsgQXJyYXkuPHN0cmluZz4gfSAqL1xyXG4gICAgICAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMob3B0cy5jb2xvcilcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHsgb2JqZWN0IH0gQHByaXZhdGUgKi9cclxuICAgICAgICB0aGlzLmNhdFRvSSA9IHt9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykgdGhpcy5jYXRUb0lbY29kZXNbaV1dID0gaSArICcnXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxzdHJpbmc+IH0gQHByaXZhdGUgKi9cclxuICAgICAgICB0aGlzLmNvbG9ycyA9IFtdXHJcbiAgICAgICAgZm9yIChjb25zdCBjb2RlIG9mIGNvZGVzKVxyXG4gICAgICAgICAgICB0aGlzLmNvbG9ycy5wdXNoKG9wdHMuY29sb3JbJycgKyBjb2RlXSlcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgdGhlIGNlbGxzLCBpbiBnZW9ncmFwaGljYWwgdW5pdC4gQWxsIGNlbGxzIGhhdmUgdGhlIHNhbWUgc2l6ZS5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSAvLyAocmVzb2x1dGlvbiwgeikgPT4gLi4uXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUgeyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQgfSAqL1xyXG4gICAgICAgIHRoaXMud2dwID0gbmV3IFdlYkdMU3F1YXJlQ29sb3JpbmdDYXRBZHZhbmNlZCh0aGlzLmNvbG9ycylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xyXG5cclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcclxuXHJcbiAgICAgICAgLy9hZGQgdmVydGljZSBhbmQgZnJhZ21lbnQgZGF0YVxyXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAvIDJcclxuICAgICAgICBsZXQgYywgbmIgPSBjZWxscy5sZW5ndGhcclxuICAgICAgICBjb25zdCB2ZXJ0aWNlc0J1ZmZlciA9IFtdXHJcbiAgICAgICAgY29uc3QgaUJ1ZmZlciA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGMgPSBjZWxsc1tpXVxyXG4gICAgICAgICAgICBjb25zdCBjYXQgPSB0aGlzLmNvZGUoYylcclxuICAgICAgICAgICAgaWYgKGNhdCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbmV4cGVjdGVkIGNhdGVnb3J5OiAnICsgY2F0KVxyXG4gICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgY29uc3QgaV8gPSB0aGlzLmNhdFRvSVtjYXRdXHJcbiAgICAgICAgICAgIGlmIChpc05hTigraV8pKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5leHBlY3RlZCBjYXRlZ29yeSBpbmRleDogJyArIGNhdCArICcgJyArIGlfKVxyXG4gICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2ZXJ0aWNlc0J1ZmZlci5wdXNoKGMueCArIHIyLCBjLnkgKyByMilcclxuICAgICAgICAgICAgaUJ1ZmZlci5wdXNoKCtpXylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vY3JlYXRlIGNhbnZhcyBhbmQgd2ViZ2wgcmVuZGVyZXJcclxuICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhnZW9DYW52YXMudyArICcnLCBnZW9DYW52YXMuaCArICcnKVxyXG4gICAgICAgIGlmICghY3ZXR0wpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vZHJhd1xyXG4gICAgICAgIGNvbnN0IHNpemVHZW8gPSB0aGlzLnNpemUgPyB0aGlzLnNpemUocmVzb2x1dGlvbiwgeikgOiByZXNvbHV0aW9uICsgMC4yICogelxyXG4gICAgICAgIHRoaXMud2dwLmRyYXcoY3ZXR0wuZ2wsIHZlcnRpY2VzQnVmZmVyLCBpQnVmZmVyLCBnZW9DYW52YXMuZ2V0V2ViR0xUcmFuc2Zvcm0oKSwgc2l6ZUdlbyAvIHopXHJcblxyXG4gICAgICAgIC8vZHJhdyBpbiBjYW52YXMgZ2VvXHJcbiAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKGN2V0dMLmNhbnZhcywgMCwgMClcclxuXHJcbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6IH0pXHJcbiAgICB9XHJcbn0iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcclxuaW1wb3J0IHsgbWFrZVdlYkdMQ2FudmFzIH0gZnJvbSAnLi4vdXRpbHMvd2ViR0xVdGlscy5qcydcclxuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkLmpzJ1xyXG5cclxuLyoqXHJcbiAqIFN0eWxlIGJhc2VkIG9uIHdlYkdMXHJcbiAqIFRvIHNob3cgY2VsbHMgYXMgY29sb3JlZCBzcXVhcmVzLCB3aXRoIGNvbXB1dGF0aW9uIG9mIHRoZSBjb2xvcnMgb24gR1BVIHNpZGUgKGZhc3RlciB0aGFuIEphdmFTY3JpcHQgc2lkZSkuXHJcbiAqIEFsbHMgc3F1YXJlcyB3aXRoIHRoZSBzYW1lIHNpemVcclxuICpcclxuICogQG1vZHVsZSBzdHlsZVxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3F1YXJlQ29sb3JXZWJHTFN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyBhIHQgdmFsdWUgKHdpdGhpbiBbMCwxXSkgZm9yIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy50RnVuID0gb3B0cy50RnVuIC8vKGMscix6LHZzKSA9PiB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEaXN0cmlidXRpb24gc3RyZXRjaGluZyBtZXRob2QuXHJcbiAgICAgICAgICogVGhlIHN0cmV0Y2hpbmcgaXMgcGVyZm9ybWVkIG9uIEdQVSBzaWRlIChmcmFnbWVudCBzaGFkZXIpLlxyXG4gICAgICAgICAqIEB0eXBlIHt7IGZ1bjpzdHJpbmcsIGFscGhhOm51bWJlciB9fSAqL1xyXG4gICAgICAgIHRoaXMuc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc2FtcGxlIG9mIHRoZSBjb2xvciByYW1wLlxyXG4gICAgICAgICAqIFRoZSBjb2xvciBpcyBjb21wdXRlZCBvbiBHUFUgc2lkZSAoZnJhZ21lbnQgc2hhZGVyKSBiYXNlZCBvbiB0aG9zZSB2YWx1ZXMgKGxpbmVhciBpbnRlcnBvbGF0aW9uKS5cclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPHN0cmluZz59ICovXHJcbiAgICAgICAgdGhpcy5jb2xvcnMgPVxyXG4gICAgICAgICAgICBvcHRzLmNvbG9ycyB8fFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAncmdiKDE1OCwgMSwgNjYpJyxcclxuICAgICAgICAgICAgICAgICdyZ2IoMjQ4LCAxNDIsIDgzKScsXHJcbiAgICAgICAgICAgICAgICAncmdiKDI1MSwgMjQ4LCAxNzYpJyxcclxuICAgICAgICAgICAgICAgICdyZ2IoMTM3LCAyMDcsIDE2NSknLFxyXG4gICAgICAgICAgICAgICAgJ3JnYig5NCwgNzksIDE2MiknLFxyXG4gICAgICAgICAgICBdLnJldmVyc2UoKVxyXG4gICAgICAgIGlmIChvcHRzLmNvbG9yKVxyXG4gICAgICAgICAgICB0aGlzLmNvbG9ycyA9IFtcclxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMCksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuMiksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuNCksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuNiksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuOCksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDEpLFxyXG4gICAgICAgICAgICBdXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERlZmluZSB0aGUgb3BhY2l0eSBvZiB0aGUgc3R5bGUsIHdpdGhpbiBbMCwxXS5cclxuICAgICAgICAgKiBJZiB0aGlzIG9wYWNpdHkgaXMgZGVmaW5lZCwgdGhlIGluZGl2aWR1YWwgY29sb3Igb3BhY2l0eSB3aWxsIGJlIGlnbm9yZWQuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm9wYWNpdHkgPSBvcHRzLm9wYWNpdHkgLy8gKHIseikgPT4gLi4uXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIHRoZSBjZWxscywgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuIEFsbCBjZWxscyBoYXZlIHRoZSBzYW1lIHNpemUuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgLy8gKHJlc29sdXRpb24sIHopID0+IC4uLlxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxyXG5cclxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXHJcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxyXG4gICAgICAgIC8vZm9yIG9wYWNpdHkgY29udHJvbCwgc2VlOiBodHRwczovL3dlYmdsZnVuZGFtZW50YWxzLm9yZy93ZWJnbC9sZXNzb25zL3dlYmdsLWFuZC1hbHBoYS5odG1sXHJcbiAgICAgICAgY29uc3QgY3ZXR0wgPSBtYWtlV2ViR0xDYW52YXMoXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy53ICsgJycsXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5oICsgJycsXHJcbiAgICAgICAgICAgIHRoaXMub3BhY2l0eSAhPSB1bmRlZmluZWQgPyB7IHByZW11bHRpcGxpZWRBbHBoYTogZmFsc2UgfSA6IHVuZGVmaW5lZFxyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoIWN2V0dMKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHdlYkdMJylcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2FkZCB2ZXJ0aWNlIGFuZCBmcmFnbWVudCBkYXRhXHJcbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uIC8gMlxyXG4gICAgICAgIGNvbnN0IHZlcnRpY2VzQnVmZmVyID0gW11cclxuICAgICAgICBjb25zdCB0QnVmZmVyID0gW11cclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLnRGdW4oY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxyXG4gICAgICAgICAgICBpZiAodCA9PSBudWxsIHx8IHQgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxyXG4gICAgICAgICAgICB2ZXJ0aWNlc0J1ZmZlci5wdXNoKGNlbGwueCArIHIyLCBjZWxsLnkgKyByMilcclxuICAgICAgICAgICAgdEJ1ZmZlci5wdXNoKHQgPiAxID8gMSA6IHQgPCAwID8gMCA6IHQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgcGl4ZWwgc2l6ZVxyXG4gICAgICAgIGNvbnN0IHNpemVHZW8gPSB0aGlzLnNpemUgPyB0aGlzLnNpemUocmVzb2x1dGlvbiwgeikgOiByZXNvbHV0aW9uICsgMC4yICogelxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgb3BhY2l0eVxyXG4gICAgICAgIGNvbnN0IG9wID0gdGhpcy5vcGFjaXR5ID8gdGhpcy5vcGFjaXR5KHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY29uc3Qgd2dwID0gbmV3IFdlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZChjdldHTC5nbCwgdGhpcy5jb2xvcnMsIHRoaXMuc3RyZXRjaGluZywgc2l6ZUdlbyAvIHosIG9wKVxyXG5cclxuICAgICAgICAvL2RyYXdcclxuICAgICAgICB3Z3AuZHJhdyh2ZXJ0aWNlc0J1ZmZlciwgdEJ1ZmZlciwgZ2VvQ2FudmFzLmdldFdlYkdMVHJhbnNmb3JtKCkpXHJcblxyXG4gICAgICAgIC8vZHJhdyBpbiBjYW52YXMgZ2VvXHJcbiAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKGN2V0dMLmNhbnZhcywgMCwgMClcclxuXHJcbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGUgc3R5bGVcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN0cm9rZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAoKCkgPT4gXCIjNjY2XCIpIC8vKGMscix6LHZzKSA9PiB7fVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBzdHJva2UgbGluZSB3aWR0aCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgKChjZWxsLCByZXNvbHV0aW9uLCB6KSA9PiB6ICogMS41KSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaGFwZSBvZiBhIGNlbGwuXHJcbiAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOmltcG9ydChcIi4uL2NvcmUvU3R5bGUuanNcIikuU2hhcGV9ICovXHJcbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgKCgpID0+IFwic3F1YXJlXCIpIC8vKGMscix6LHZzKSA9PiB7fVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBjZWxscyBhcyBzcXVhcmVzLCB3aXRoIHZhcmlvdXMgY29sb3JzIGFuZCBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xyXG5cclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcclxuXHJcbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxyXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxyXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcclxuXHJcbiAgICAgICAgICAgIC8vY29sb3JcclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5zdHJva2VDb2xvciA/IHRoaXMuc3Ryb2tlQ29sb3IoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxyXG5cclxuICAgICAgICAgICAgLy9zaXplIC0gaW4gZ2VvIHVuaXRcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogcmVzb2x1dGlvblxyXG5cclxuICAgICAgICAgICAgLy93aWR0aFxyXG4gICAgICAgICAgICBjb25zdCB3aSA9IHRoaXMuc3Ryb2tlV2lkdGggPyB0aGlzLnN0cm9rZVdpZHRoKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAxICogelxyXG4gICAgICAgICAgICBpZiAoIXdpIHx8IHdpIDw9IDApIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd2lcclxuXHJcbiAgICAgICAgICAgIC8vc2hhcGVcclxuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLnNoYXBlID8gdGhpcy5zaGFwZShjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogJ3NxdWFyZSdcclxuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgcmVzb2x1dGlvbiwgeilcclxuXHJcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3NxdWFyZScpIHtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBzcXVhcmVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSByZXNvbHV0aW9uICogKDEgLSBzaXplIC8gcmVzb2x1dGlvbikgKiAwLjVcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgucmVjdChjLnggKyBkICsgb2Zmc2V0LmR4LCBjLnkgKyBkICsgb2Zmc2V0LmR5LCBzaXplLCBzaXplKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5hcmMoYy54ICsgcjIgKyBvZmZzZXQuZHgsIGMueSArIHIyICsgb2Zmc2V0LmR5LCBzaXplICogMC41LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkaWFtb25kJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgczIgPSBzaXplICogMC41XHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggKyByMiAtIHMyLCBjLnkgKyByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHIyLCBjLnkgKyByMiArIHMyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54ICsgcjIgKyBzMiwgYy55ICsgcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgLSBzMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHIyIC0gczIsIGMueSArIHIyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZG9udXQnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfdXAnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgLSBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSAtIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguY2xvc2VQYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX2Rvd24nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54ICsgcjIsIGMueSAtIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmNsb3NlUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9sZWZ0Jykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHIyID0gKHNpemUgLSByZXNvbHV0aW9uKSAvIDJcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggLSBkcjIsIGMueSArIHIyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55IC0gZHIyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfcmlnaHQnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgLSBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgKyByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCAtIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguY2xvc2VQYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgc2hhcGUpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vU2lkZVN0eWxlLmpzJ1xyXG5pbXBvcnQgeyBTcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZSB9IGZyb20gJy4vU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUuanMnXHJcbmltcG9ydCB7IGNsYXNzaWZpZXIgYXMgY2xGdW4sIGNvbG9yQ2xhc3NpZmllciBhcyBjY2xGdW4gfSBmcm9tICcuLi91dGlscy9zY2FsZS5qcydcclxuXHJcbi8qKlxyXG4gKiBAc2VlIGh0dHBzOi8vbWFuaWZvbGQubmV0L2RvYy9tZmQ5L2V4YW1wbGVfX3RhbmFrYV9jb250b3Vycy5odG1cclxuICpcclxuICogQG1vZHVsZSBzdHlsZVxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVGFuYWthU3R5bGUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCk6bnVtYmVyfSB2YWx1ZSBGdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIG9mIGEgY2VsbFxyXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYnJlYWtzIFRoZSBicmVhayB2YWx1ZXNcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNvbG9ycyBUaGUgY29sb3JzLCBvbmUgbW9yZSB0aGFuIHRoZSBicmVhayB2YWx1ZXNcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU3R5bGU+fVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0KHZhbHVlLCBicmVha3MsIGNvbG9ycywgb3B0cyA9IHt9KSB7XHJcblxyXG4gICAgICAgIC8vc2hhZG93IGNvbG9yc1xyXG4gICAgICAgIG9wdHMuY29sb3JEYXJrID0gb3B0cy5jb2xvckRhcmsgfHwgJyMxMTEnXHJcbiAgICAgICAgb3B0cy5jb2xvckJyaWdodCA9IG9wdHMuY29sb3JCcmlnaHQgfHwgJyNkZGQnXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7IGZ1bmN0aW9uKG51bWJlciwgbnVtYmVyKTpudW1iZXIgfSAqL1xyXG4gICAgICAgIG9wdHMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoc2lkZVZhbHVlLCByZXNvbHV0aW9uLCB6KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbldHID0gMSAqIHpcclxuICAgICAgICAgICAgY29uc3QgbWF4V0cgPSA0ICogelxyXG4gICAgICAgICAgICBjb25zdCBzdGVwID0gKG1heFdHIC0gbWluV0cpIC8gM1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4obWluV0cgKyAoc2lkZVZhbHVlIC0gMSkgKiBzdGVwLCBtYXhXRylcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAvL21ha2UgY2xhc3NpZmllclxyXG4gICAgICAgIGNvbnN0IGNsYXNzaWZpZXIgPSBjbEZ1bihicmVha3MpXHJcbiAgICAgICAgLy9tYWtlIGNvbG9ycyB0YWJsZVxyXG4gICAgICAgIGNvbnN0IGNvbG9yc0RpY3QgPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykgY29sb3JzRGljdFtpICsgXCJcIl0gPSBjb2xvcnNbaV1cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbFN0eWxlID0gbmV3IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlKHtcclxuICAgICAgICAgICAgY29kZTogY2VsbCA9PiBjbGFzc2lmaWVyKHZhbHVlKGNlbGwpKSxcclxuICAgICAgICAgICAgY29sb3I6IGNvbG9yc0RpY3RcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBjb25zdCBnZXRTaWRlVmFsdWUgPSAoc2lkZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjbDEgPSBzaWRlLmMxID8gY2xhc3NpZmllcih2YWx1ZShzaWRlLmMxKSkgOiAtMVxyXG4gICAgICAgICAgICBjb25zdCBjbDIgPSBzaWRlLmMyID8gY2xhc3NpZmllcih2YWx1ZShzaWRlLmMyKSkgOiAtMVxyXG4gICAgICAgICAgICByZXR1cm4gY2wxIC0gY2wyXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogVGhlIHNpZGUgc3R5bGUsIGZvciB0aGUgc2hhZG93IGVmZmVjdCAqL1xyXG4gICAgICAgIGNvbnN0IHNpZGVTdHlsZSA9IG5ldyBTaWRlU3R5bGUoe1xyXG4gICAgICAgICAgICAvL3doaXRlIG9yIGJsYWNrLCBkZXBlbmRpbmcgb24gb3JpZW50YXRpb24gYW5kIHZhbHVlXHJcbiAgICAgICAgICAgIGNvbG9yOiAoc2lkZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdiA9IGdldFNpZGVWYWx1ZShzaWRlKVxyXG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IDApIHJldHVyblxyXG4gICAgICAgICAgICAgICAgaWYgKHNpZGUub3IgPT09ICd2JykgcmV0dXJuIHYgPCAwID8gb3B0cy5jb2xvckJyaWdodCA6IG9wdHMuY29sb3JEYXJrXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdiA8IDAgPyBvcHRzLmNvbG9yRGFyayA6IG9wdHMuY29sb3JCcmlnaHRcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLy93aWR0aCBkZXBlbmRzIG9uIHRoZSB2YWx1ZSwgdGhhdCBpcyB0aGUgbnVtYmVyIG9mIGNsYXNzZXMgb2YgZGlmZmVyZW5jZVxyXG4gICAgICAgICAgICB3aWR0aDogKHNpZGUsIHJlc29sdXRpb24sIHopID0+IG9wdHMud2lkdGgoTWF0aC5hYnMoZ2V0U2lkZVZhbHVlKHNpZGUpKSwgcmVzb2x1dGlvbiwgeilcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICByZXR1cm4gW2NlbGxTdHlsZSwgc2lkZVN0eWxlXVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGUgc3R5bGVcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRleHRTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0ZXh0IG9mIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy50ZXh0ID0gb3B0cy50ZXh0IHx8ICgoKSA9PiAnWCcpIC8vKGMscix6LHZzKSA9PiB7fVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gXCJibGFja1wiKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBmb250IHNpemUgb2YgYSBjZWxsIGluIGdlbyB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuZm9udFNpemUgPSBvcHRzLmZvbnRTaXplIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbikgLy8oYyxyLHosdnMpID0+IHt9XHJcblxyXG4gICAgICAgIC8qKiBUaGUgdGV4dCBmb250IGZhbWlseS5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5mb250RmFtaWx5ID0gb3B0cy5mb250RmFtaWx5IHx8ICgoKSA9PiAnQXJpYWwnKVxyXG5cclxuICAgICAgICAvKiogVGhlIHRleHQgZm9udCB3ZWlnaHQuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuZm9udFdlaWdodCA9IG9wdHMuZm9udFdlaWdodCB8fCAoKCkgPT4gJ2JvbGQnKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBjZWxscyBhcyB0ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xyXG5cclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcclxuXHJcbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxyXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8vZHJhdyB3aXRoIEhUTUwgY2FudmFzXHJcbiAgICAgICAgLy9pbiBzY3JlZW4gY29vcmRpbmF0ZXNcclxuICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgLy9nZXQgY2VsbCB0ZXh0XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnRleHQgPyB0aGlzLnRleHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAodGV4dCA9PSB1bmRlZmluZWQgfHwgdGV4dCA9PSBudWxsIHx8IHRleHQgKyAnJyA9PT0gJycpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL2NvbG9yXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sXHJcblxyXG4gICAgICAgICAgICAvL2ZvbnQgc2l6ZVxyXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBwaXhlbCB1bml0XHJcbiAgICAgICAgICAgIGNvbnN0IGZvbnRTaXplUGl4ID0gdGhpcy5mb250U2l6ZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIC8gelxyXG4gICAgICAgICAgICBpZiAoIWZvbnRTaXplUGl4KSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9zZXQgZm9udFxyXG4gICAgICAgICAgICBjb25zdCBmb250RmFtaWx5ID0gdGhpcy5mb250RmFtaWx5ID8gdGhpcy5mb250RmFtaWx5KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAnQXJpYWwnXHJcbiAgICAgICAgICAgIGNvbnN0IGZvbnRXZWlnaHQgPSB0aGlzLmZvbnRXZWlnaHQgPyB0aGlzLmZvbnRXZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdib2xkJ1xyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZvbnQgPSBmb250V2VpZ2h0ICsgJyAnICsgZm9udFNpemVQaXggKyAncHggJyArIGZvbnRGYW1pbHlcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxyXG5cclxuICAgICAgICAgICAgLy90ZXh0IHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgudGV4dEFsaWduID0gJ2NlbnRlcidcclxuICAgICAgICAgICAgY29uc3QgdHggPSBnZW9DYW52YXMuZ2VvVG9QaXhYKGNlbGwueCArIHJlc29sdXRpb24gKiAwLjUgKyBvZmZzZXQuZHgpXHJcbiAgICAgICAgICAgIGNvbnN0IHR5ID0gZ2VvQ2FudmFzLmdlb1RvUGl4WShjZWxsLnkgKyByZXNvbHV0aW9uICogMC41ICsgb2Zmc2V0LmR5KSArIGZvbnRTaXplUGl4ICogMC4zIC8vaXQgc2hvdWxkIGJlIDAuNSBidXQgMC4zIHNlZW1zIHRvIHdvcmsgYmV0dGVyXHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgdGhlIHRleHRcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsVGV4dCh0ZXh0LCB0eCwgdHkpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCdWlsZCBhIGZ1bmN0aW9uIFswLDFdLT5zdHJpbmcgZm9yIGNoYXJhY3RlcnMgbGVnZW5kXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nPn0gY2hhcnNcclxuICAgICAqIEBwYXJhbSB7KGZ1bmN0aW9uKG51bWJlcik6bnVtYmVyKXx1bmRlZmluZWR9IHNjYWxlXHJcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB0ZXh0U2NhbGUoY2hhcnMsIHNjYWxlID0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3QgbmIgPSBjaGFycy5sZW5ndGhcclxuICAgICAgICByZXR1cm4gKHQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHNjYWxlKSB0ID0gc2NhbGUodClcclxuICAgICAgICAgICAgaWYgKHQgPT0gMCkgcmV0dXJuIFwiXCJcclxuICAgICAgICAgICAgaWYgKHQgPj0gMSkgcmV0dXJuIGNoYXJzW25iIC0gMV1cclxuICAgICAgICAgICAgcmV0dXJuIGNoYXJzW01hdGguZmxvb3IodCAqIG5iKV1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcblxyXG4vKiogQHR5cGVkZWYge1wiZmlyc3RcInxcImJvdHRvbVwifFwiY2VudGVyXCJ8XCJ0b3BcInxcImxhc3RcIn0gQW5jaG9yTW9kZVlFbnVtICovXHJcblxyXG4vKipcclxuICogU2hvdyBjZWxsIGFzIHRpbWVzZXJpZXMgY2hhcnRcclxuICogQ2FuIGJlIHVzZWQgZm9yIHNwYXJrbGluZSBtYXAgb2YgaHR0cHM6Ly9kYXRhZ2lzdGlwcy5oeXBvdGhlc2VzLm9yZy80ODhcclxuICpcclxuICogQG1vZHVsZSBzdHlsZVxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVGltZVNlcmllc1N0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogVGhlIGNvbHVtbnMgb2YgdGhlIHRpbWUgc2VyaWVzLCBvcmRlcmVkIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIuXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxzdHJpbmc+fSAqL1xyXG4gICAgICAgIHRoaXMudHMgPSBvcHRzLnRzXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHNwZWNpZnlpbmcgd2hlbiBhIHZhbHVlIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIFwibm8gZGF0YVwiIGFuZCB0aHVzIG5vdCBpZ25vcmVkLiBUaGUgbGluZSB3aWxsIGhhdmUgYSBicmVhayBhdCB0aGVzZSB2YWx1ZXMuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKHN0cmluZyk6Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLm5vRGF0YSA9IG9wdHMubm9EYXRhIHx8ICgodikgPT4gdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT0gXCJcIiB8fCB2ID09PSBudWxsIHx8IGlzTmFOKCt2KSlcclxuXHJcbiAgICAgICAgLy94XHJcbiAgICAgICAgLyoqIGluIGdlbyB1bml0XHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm9mZnNldFggPSBvcHRzLm9mZnNldFggfHwgKChjLCByLCB6KSA9PiAwKVxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoYywgciwgeikgPT4gcilcclxuXHJcbiAgICAgICAgLy95XHJcbiAgICAgICAgLyoqIGluIGdlbyB1bml0XHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm9mZnNldFkgPSBvcHRzLm9mZnNldFkgfHwgKChjLCByLCB6KSA9PiAwKVxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgKChjLCByLCB6KSA9PiByKVxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6QW5jaG9yTW9kZVlFbnVtfSAqL1xyXG4gICAgICAgIHRoaXMuYW5jaG9yTW9kZVkgPSBvcHRzLmFuY2hvck1vZGVZIHx8ICgoYywgciwgeikgPT4gXCJjZW50ZXJcIilcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgbGluZSwgaW4gZ2VvIHVuaXRcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5saW5lV2lkdGggPSBvcHRzLmxpbmVXaWR0aCB8fCAoKHYsIHIsIHMsIHopID0+IDEuNSAqIHopXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNoYXJ0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gXCJibGFja1wiKSAvLyhjLHIseix2cykgPT4ge31cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgY2VsbCBhbXBsaXR1ZGVcclxuICAgICAgICBjb25zdCBnZXRBbXBsaXR1ZGUgPSBjID0+IHtcclxuICAgICAgICAgICAgbGV0IG1pbiwgbWF4XHJcbiAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY1t0XTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PSB1bmRlZmluZWQgfHwgdmFsIDwgbWluKSBtaW4gPSB2YWxcclxuICAgICAgICAgICAgICAgIGlmIChtYXggPT0gdW5kZWZpbmVkIHx8IHZhbCA+IG1heCkgbWF4ID0gdmFsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG1pbiA9PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICAgICAgcmV0dXJuIG1heCAtIG1pblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jb21wdXRlIG1heCBhbXBsaXR1ZGVcclxuICAgICAgICBsZXQgYW1wTWF4XHJcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xyXG4gICAgICAgICAgICBjb25zdCBhbXAgPSBnZXRBbXBsaXR1ZGUoYylcclxuICAgICAgICAgICAgaWYgKGFtcCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGlmIChhbXBNYXggPT0gdW5kZWZpbmVkIHx8IGFtcCA+IGFtcE1heCkgYW1wTWF4ID0gYW1wXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghYW1wTWF4KSByZXR1cm5cclxuXHJcbiAgICAgICAgY29uc3QgbmIgPSB0aGlzLnRzLmxlbmd0aFxyXG5cclxuICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVDYXAgPSBcImJ1dHRcIlxyXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcclxuXHJcbiAgICAgICAgICAgIC8vbGluZSB3aWR0aFxyXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy5saW5lV2lkdGggPyB0aGlzLmxpbmVXaWR0aChjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPCAwKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9saW5lIGNvbG9yXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWNvbCkgY29udGludWVcclxuXHJcblxyXG4gICAgICAgICAgICAvL3hcclxuICAgICAgICAgICAgY29uc3Qgb2ZmWCA9IHRoaXMub2Zmc2V0WCA/IHRoaXMub2Zmc2V0WChjLCByZXNvbHV0aW9uLCB6KSA6IDBcclxuICAgICAgICAgICAgaWYgKG9mZlggPT0gdW5kZWZpbmVkIHx8IGlzTmFOKG9mZlgpKSBjb250aW51ZVxyXG4gICAgICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoYywgcmVzb2x1dGlvbiwgeikgOiByZXNvbHV0aW9uXHJcbiAgICAgICAgICAgIGlmICh3ID09IHVuZGVmaW5lZCB8fCBpc05hTih3KSkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8veVxyXG4gICAgICAgICAgICBjb25zdCBvZmZZID0gdGhpcy5vZmZzZXRZID8gdGhpcy5vZmZzZXRZKGMsIHJlc29sdXRpb24sIHopIDogMFxyXG4gICAgICAgICAgICBpZiAob2ZmWSA9PSB1bmRlZmluZWQgfHwgaXNOYU4ob2ZmWSkpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGNvbnN0IGggPSB0aGlzLmhlaWdodCA/IHRoaXMuaGVpZ2h0KGMsIHJlc29sdXRpb24sIHopIDogcmVzb2x1dGlvblxyXG4gICAgICAgICAgICBpZiAoaCA9PSB1bmRlZmluZWQgfHwgaXNOYU4oaCkpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGNvbnN0IGFuY2hZID0gdGhpcy5hbmNob3JNb2RlWSA/IHRoaXMuYW5jaG9yTW9kZVkoYywgcmVzb2x1dGlvbiwgeikgOiBcImNlbnRlclwiXHJcbiAgICAgICAgICAgIGlmICghYW5jaFkpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHdHXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcclxuXHJcbiAgICAgICAgICAgIC8vY29tcHV0ZSBhbmNob3IgWSBmaWd1cmVzXHJcbiAgICAgICAgICAgIGxldCB2YWwwLCB5MFxyXG4gICAgICAgICAgICBpZiAoYW5jaFkgPT09IFwiZmlyc3RcIikge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgZmlyc3QgdmFsdWVcclxuICAgICAgICAgICAgICAgIHZhbDAgPSBjW3RoaXMudHNbMF1dXHJcbiAgICAgICAgICAgICAgICB5MCA9IDBcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gXCJsYXN0XCIpIHtcclxuICAgICAgICAgICAgICAgIC8vZ2V0IGxhc3QgdmFsdWVcclxuICAgICAgICAgICAgICAgIHZhbDAgPSBjW3RoaXMudHNbdGhpcy50cy5sZW5ndGggLSAxXV1cclxuICAgICAgICAgICAgICAgIHkwID0gMFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFuY2hZID09PSBcImJvdHRvbVwiKSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBtaW5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9ICtjW3RdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwwID09IHVuZGVmaW5lZCB8fCB2YWwgPCB2YWwwKSB2YWwwID0gdmFsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB5MCA9IDBcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gXCJ0b3BcIikge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgbWF4XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSArY1t0XTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsMCA9PSB1bmRlZmluZWQgfHwgdmFsID4gdmFsMCkgdmFsMCA9IHZhbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgeTAgPSByZXNvbHV0aW9uXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaFkgPT09IFwiY2VudGVyXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vZ2V0IG1pbiBhbmQgbWF4XHJcbiAgICAgICAgICAgICAgICBsZXQgbWluLCBtYXhcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNbdF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbiA9PSB1bmRlZmluZWQgfHwgdmFsIDwgbWluKSBtaW4gPSB2YWxcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWF4ID09IHVuZGVmaW5lZCB8fCB2YWwgPiBtYXgpIG1heCA9IHZhbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFsMCA9ICgrbWF4ICsgK21pbikgKiAwLjVcclxuICAgICAgICAgICAgICAgIHkwID0gcmVzb2x1dGlvbiAvIDJcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5leHBlY3RlZCBhbmNob3JNb2RlWTogXCIgKyBhbmNoWSlcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKi9kcmF3IGxpbmVcclxuICAgICAgICAgICAgaWYgKHZhbDAgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHZhbDApKSBjb250aW51ZVxyXG4gICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgY29uc3Qgc1ggPSB3IC8gKG5iIC0gMSlcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjW3RoaXMudHNbaV1dXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCB8fCBpc05hTih2YWwpKSBicmVha1xyXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gMClcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKGMueCArIGkgKiBzWCArIG9mZlgsIGMueSArIHkwICsgKHZhbCAtIHZhbDApICogaCAvIGFtcE1heCArIG9mZlkpXHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjLnggKyBpICogc1ggKyBvZmZYLCBjLnkgKyB5MCArICh2YWwgLSB2YWwwKSAqIGggLyBhbXBNYXggKyBvZmZZKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKSovXHJcblxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGxpbmUsIHNlZ21lbnQgYnkgc2VnbWVudFxyXG4gICAgICAgICAgICBjb25zdCBzWCA9IHcgLyAobmIgLSAxKVxyXG5cclxuICAgICAgICAgICAgLy9oYW5kbGUgZmlyc3QgcG9pbnRcclxuICAgICAgICAgICAgbGV0IHYwID0gY1t0aGlzLnRzWzBdXVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMubm9EYXRhKHYwKSkge1xyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54ICsgb2ZmWCwgYy55ICsgeTAgKyAodjAgLSB2YWwwKSAqIGggLyBhbXBNYXggKyBvZmZZKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2codjAsIGlzTmFOKHYwKSlcclxuXHJcbiAgICAgICAgICAgIGxldCB2MVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHYxID0gY1t0aGlzLnRzW2ldXVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IGZyb20gdjAgdG8gdjFcclxuXHJcbiAgICAgICAgICAgICAgICAvL2JvdGggcG9pbnRzICdubyBkYXRhJ1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9EYXRhKHYwKSAmJiB0aGlzLm5vRGF0YSh2MSkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWNvbmQgcG9pbnQgJ25vIGRhdGEnXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm5vRGF0YSh2MCkgJiYgdGhpcy5ub0RhdGEodjEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL2ZpcnN0IHBvaW50ICdubyBkYXRhJ1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vRGF0YSh2MCkgJiYgIXRoaXMubm9EYXRhKHYxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggKyBpICogc1ggKyBvZmZYLCBjLnkgKyB5MCArICh2MSAtIHZhbDApICogaCAvIGFtcE1heCArIG9mZlkpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vYm90aCBwb2ludHMgaGF2ZSBkYXRhOiB0cmFjZSBsaW5lXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIGkgKiBzWCArIG9mZlgsIGMueSArIHkwICsgKHYxIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcclxuICAgICAgICAgICAgICAgICAgICAvL2lmIGl0IGlzIHRoZSBsYXN0IHBvaW50LCBzdHJva2VcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBuYiAtIDEpIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHYwID0gdjFcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZCwgaWYgYW55XHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcblxyXG59XHJcblxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IGluaXRTaGFkZXJQcm9ncmFtLCBjcmVhdGVTaGFkZXIgfSBmcm9tICcuL3dlYkdMVXRpbHMuanMnXHJcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXHJcblxyXG4vKipcclxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cclxuICogQWxsIHRoZSBzYW1lIHNpemUsIGJ1dCBkaWZmZXJlbnQgZmlsbCBjb2xvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBXZWJHTFNxdWFyZUNvbG9yaW5nIHtcclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihnbCwgc2l6ZVBpeCkge1xyXG4gICAgICAgIHRoaXMuZ2wgPSBnbFxyXG4gICAgICAgIHRoaXMuc2l6ZVBpeCA9IHNpemVQaXggfHwgMTAuMFxyXG5cclxuICAgICAgICB0aGlzLnByb2dyYW0gPSBpbml0U2hhZGVyUHJvZ3JhbShcclxuICAgICAgICAgICAgZ2wsXHJcbiAgICAgICAgICAgIGNyZWF0ZVNoYWRlcihcclxuICAgICAgICAgICAgICAgIGdsLFxyXG4gICAgICAgICAgICAgICAgZ2wuVkVSVEVYX1NIQURFUixcclxuICAgICAgICAgICAgICAgIGBcclxuICAgICAgICAgICAgYXR0cmlidXRlIHZlYzIgcG9zO1xyXG4gICAgICAgICAgICB1bmlmb3JtIGZsb2F0IHNpemVQaXg7XHJcbiAgICAgICAgICAgIHVuaWZvcm0gbWF0MyBtYXQ7XHJcbiAgICAgICAgICAgIGF0dHJpYnV0ZSB2ZWM0IGNvbG9yO1xyXG4gICAgICAgICAgICB2YXJ5aW5nIHZlYzQgdkNvbG9yO1xyXG4gICAgICAgICAgICB2b2lkIG1haW4oKSB7XHJcbiAgICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xyXG4gICAgICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XHJcbiAgICAgICAgICAgICAgdkNvbG9yID0gY29sb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIGBcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgY3JlYXRlU2hhZGVyKFxyXG4gICAgICAgICAgICAgICAgZ2wsXHJcbiAgICAgICAgICAgICAgICBnbC5GUkFHTUVOVF9TSEFERVIsXHJcbiAgICAgICAgICAgICAgICBgXHJcbiAgICAgICAgICAgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG4gICAgICAgICAgICB2YXJ5aW5nIHZlYzQgdkNvbG9yO1xyXG4gICAgICAgICAgICB2b2lkIG1haW4odm9pZCkge1xyXG4gICAgICAgICAgICAgICAgdmVjNCB2Q29sb3JfID0gdkNvbG9yIC8gMjU1LjA7XHJcbiAgICAgICAgICAgICAgICB2Q29sb3JfWzNdID0gMjU1LjAgKiB2Q29sb3JfWzNdO1xyXG4gICAgICAgICAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdkNvbG9yXztcclxuICAgICAgICAgICAgfWBcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSlcclxuXHJcbiAgICAgICAgLy9idWZmZXIgZGF0YVxyXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIgPSBbXVxyXG4gICAgICAgIHRoaXMuY29sb3JzQnVmZmVyID0gW11cclxuICAgIH1cclxuXHJcbiAgICAvKiogQWRkIGRhdGEgdG8gdmVydGljZXMvc2l6ZS9jb2xvciBidWZmZXJzIGZvciBjb2xvciBzcXVhcmVzIGRyYXdpbmcgKi9cclxuICAgIGFkZFBvaW50RGF0YSh4QywgeUMsIGNvbCkge1xyXG4gICAgICAgIC8vY29udmVydCBjb2xvclxyXG4gICAgICAgIGNvbnN0IGNjID0gY29sb3IoY29sKVxyXG4gICAgICAgIC8vY29uc3QgY2MgPSB7cjo0NSxnOjg3LGI6OTgsb3BhY2l0eTowLjl9XHJcbiAgICAgICAgaWYgKCFjYykgcmV0dXJuXHJcblxyXG4gICAgICAgIC8vdmVydGljZXNcclxuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyLnB1c2goeEMsIHlDKVxyXG4gICAgICAgIC8vY29sb3JcclxuICAgICAgICB0aGlzLmNvbG9yc0J1ZmZlci5wdXNoKGNjLnIsIGNjLmcsIGNjLmIsIGNjLm9wYWNpdHkpXHJcbiAgICB9XHJcblxyXG4gICAgYWRkUG9pbnREYXRhMih4QywgeUMsIHIsIGcsIGIsIG9wYWNpdHkpIHtcclxuICAgICAgICAvL3ZlcnRpY2VzXHJcbiAgICAgICAgdGhpcy52ZXJ0aWNlc0J1ZmZlci5wdXNoKHhDLCB5QylcclxuICAgICAgICAvL2NvbG9yXHJcbiAgICAgICAgdGhpcy5jb2xvcnNCdWZmZXIucHVzaChyLCBnLCBiLCBvcGFjaXR5KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiAgKi9cclxuICAgIGRyYXcodHJhbnNmb01hdCkge1xyXG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbFxyXG5cclxuICAgICAgICAvL3ZlcnRpY2UgZGF0YVxyXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcclxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh0aGlzLnZlcnRpY2VzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sICdwb3MnKVxyXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXHJcbiAgICAgICAgICAgIHBvc2l0aW9uLFxyXG4gICAgICAgICAgICAyLCAvL251bUNvbXBvbmVudHNcclxuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxyXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcclxuICAgICAgICAgICAgMCwgLy9zdHJpZGVcclxuICAgICAgICAgICAgMCAvL29mZnNldFxyXG4gICAgICAgIClcclxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShwb3NpdGlvbilcclxuXHJcbiAgICAgICAgLy9jb2xvciBkYXRhXHJcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxyXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHRoaXMuY29sb3JzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXHJcbiAgICAgICAgdmFyIGNvbG9yID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnY29sb3InKVxyXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoY29sb3IsIDQsIGdsLkZMT0FULCBmYWxzZSwgMCwgMClcclxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShjb2xvcilcclxuXHJcbiAgICAgICAgLy9zaXplUGl4XHJcbiAgICAgICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHRoaXMuc2l6ZVBpeClcclxuXHJcbiAgICAgICAgLy90cmFuc2Zvcm1hdGlvblxyXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcclxuXHJcbiAgICAgICAgLy8gRW5hYmxlIHRoZSBkZXB0aCB0ZXN0XHJcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XHJcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciBiaXRcclxuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKVxyXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XHJcbiAgICAgICAgLy9nbC52aWV3cG9ydCgwLCAwLCBjZy53LCBjZy5oKTtcclxuXHJcbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHRoaXMudmVydGljZXNCdWZmZXIubGVuZ3RoIC8gMilcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IGluaXRTaGFkZXJQcm9ncmFtLCBjcmVhdGVTaGFkZXIgfSBmcm9tICcuL3dlYkdMVXRpbHMuanMnXHJcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXHJcblxyXG4vKipcclxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cclxuICogQWxsIHRoZSBzYW1lIHNpemUsIGJ1dCBkaWZmZXJlbnQgZmlsbCBjb2xvci5cclxuICogVGhlIGNvbG9yIGludGVycG9sYXRpb24gaXMgY29tcHV0ZWQgaW4gdGhlIGZyYWdtZW50IHNoYWRlciBwcm9ncmFtLCBieSB0aGUgR1BVLCB0aHVzIGl0IGlzIGxlc3MgZmxleGlibGUgYnV0IGZhc3Rlci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBXZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQge1xyXG4gICAgLy9zZWU6XHJcbiAgICAvL2h0dHBzOi8vd2ViZ2xmdW5kYW1lbnRhbHMub3JnL3dlYmdsL2xlc3NvbnMvZnIvd2ViZ2wtc2hhZGVycy1hbmQtZ2xzbC5odG1sI2xlcy11bmlmb3Jtcy1kYW5zLWxlcy1zaGFkZXJzLWRlLXZlcnRleFxyXG4gICAgLy9odHRwczovL3RoZWJvb2tvZnNoYWRlcnMuY29tL2dsb3NzYXJ5Lz9zZWFyY2g9bWl4XHJcbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vMDYvXHJcbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vZ2xvc3NhcnkvXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBnbFxyXG4gICAgICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gY29sb3JzXHJcbiAgICAgKiBAcGFyYW0ge3tmdW46c3RyaW5nLGFscGhhOm51bWJlcn19IHN0cmV0Y2hpbmdcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplUGl4XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcnx1bmRlZmluZWR9IGdsb2JhbE9wYWNpdHlcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoZ2wsIGNvbG9ycywgc3RyZXRjaGluZywgc2l6ZVBpeCA9IDEwLCBnbG9iYWxPcGFjaXR5ID0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9ICovXHJcbiAgICAgICAgdGhpcy5nbCA9IGdsXHJcbiAgICAgICAgLy9nbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRydWUpO1xyXG4gICAgICAgIC8vZ2wuYmxlbmRGdW5jKGdsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XHJcbiAgICAgICAgLy9nbC5ibGVuZEZ1bmMoZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cclxuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKFxyXG4gICAgICAgICAgICBnbCxcclxuICAgICAgICAgICAgZ2wuVkVSVEVYX1NIQURFUixcclxuICAgICAgICAgICAgYFxyXG4gICAgICAgIGF0dHJpYnV0ZSB2ZWMyIHBvcztcclxuICAgICAgICB1bmlmb3JtIGZsb2F0IHNpemVQaXg7XHJcbiAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcclxuXHJcbiAgICAgICAgYXR0cmlidXRlIGZsb2F0IHQ7XHJcbiAgICAgICAgdmFyeWluZyBmbG9hdCB2dDtcclxuXHJcbiAgICAgICAgdm9pZCBtYWluKCkge1xyXG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xyXG4gICAgICAgICAgZ2xfUG9pbnRTaXplID0gc2l6ZVBpeDtcclxuICAgICAgICAgIHZ0ID0gdDtcclxuICAgICAgICB9XHJcbiAgICAgIGBcclxuICAgICAgICApXHJcblxyXG4gICAgICAgIC8vcHJlcGFyZSBmcmFnbWVudCBzaGFkZXIgY29kZVxyXG4gICAgICAgIC8vZGVjbGFyZSB0aGUgdW5pZm9ybSBhbmQgb3RoZXIgdmFyaWFibGVzXHJcbiAgICAgICAgbGV0IGZzaFN0cmluZyA9XHJcbiAgICAgICAgICAgICcnICtcclxuICAgICAgICAgICAgJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xcbicgK1xyXG4gICAgICAgICAgICAndmFyeWluZyBmbG9hdCB2dDtcXG4nICtcclxuICAgICAgICAgICAgJ3VuaWZvcm0gZmxvYXQgYWxwaGE7XFxuJyArXHJcbiAgICAgICAgICAgICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSBbXVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIG91dC5wdXNoKCd1bmlmb3JtIHZlYzQgYycgKyBpICsgJztcXG4nKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dC5qb2luKCcnKVxyXG4gICAgICAgICAgICB9KSgpICtcclxuICAgICAgICAgICAgLy9zdGFydCB0aGUgbWFpbiBmdW5jdGlvbiwgYXBwbHkgdGhlIHN0cmV0Y2hpbmcgb2YgdFxyXG4gICAgICAgICAgICAndm9pZCBtYWluKHZvaWQpIHtcXG4nXHJcblxyXG4gICAgICAgIGlmIChzdHJldGNoaW5nKSB7XHJcbiAgICAgICAgICAgIGlmIChzdHJldGNoaW5nLmZ1biA9PSAncG93JylcclxuICAgICAgICAgICAgICAgIC8vc1BvdyA9ICh0LCBhbHBoYSA9IDMpID0+IE1hdGgucG93KHQsIGFscGhhKTtcclxuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHBvdyh2dCwgYWxwaGEpO1xcbidcclxuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ3Bvd0ludicpXHJcbiAgICAgICAgICAgICAgICAvL3NQb3dSZXYgPSAodCwgYWxwaGEgPSAzKSA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIDEgLyBhbHBoYSk7XHJcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSAxLjAtcG93KDEuMC12dCwgMS4wL2FscGhhKTtcXG4nXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdleHAnKVxyXG4gICAgICAgICAgICAgICAgLy9zRXhwID0gKHQsIGFscGhhID0gMykgPT4gYWxwaGEgPT0gMCA/IHQgOiAoTWF0aC5leHAodCAqIGFscGhhKSAtIDEpIC8gKE1hdGguZXhwKGFscGhhKSAtIDEpO1xyXG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyZXRjaGluZy5hbHBoYSA9PSAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGZsb2F0IHQgPSB2dDtgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJyAgIGZsb2F0IHQgPSAoZXhwKHZ0ICogYWxwaGEpIC0gMS4wKSAvIChleHAoYWxwaGEpIC0gMS4wKTtcXG4nXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdsb2cnKVxyXG4gICAgICAgICAgICAgICAgLy9zRXhwUmV2ID0gKHQsIGFscGhhID0gMykgPT4gYWxwaGEgPT0gMCA/IHQgOiAxIC0gKDEgLyBhbHBoYSkgKiBNYXRoLmxvZyhNYXRoLmV4cChhbHBoYSkgKiAoMSAtIHQpICsgdCk7XHJcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cclxuICAgICAgICAgICAgICAgICAgICBzdHJldGNoaW5nLmFscGhhID09IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZmxvYXQgdCA9IHZ0O2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnICAgZmxvYXQgdCA9IDEuMCAtICgxLjAgLyBhbHBoYSkgKiBsb2coZXhwKGFscGhhKSAqICgxLjAgLSB2dCkgKyB2dCk7XFxuJ1xyXG4gICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcclxuICAgICAgICAgICAgICAgICAgICAvL2lmIChhbHBoYSA9PSAwKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSB2dDtcXG4nXHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGFscGhhID09IDEpIHJldHVybiBNYXRoLnNxcnQoMiAqIHQgLSB0ICogdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gc3FydCh2dCAqICgyLjAgLSB2dCkpO1xcbidcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgYSA9IGFscGhhIC8gKDEgLSBhbHBoYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gTWF0aC5zcXJ0KDEgLyAoYSAqIGEpICsgdCAqICgyIC8gYSArIDIgLSB0KSkgLSAxIC8gYTtcclxuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cclxuICAgICAgICAgICAgICAgICAgICAgICAgJyAgIGZsb2F0IGEgPSBhbHBoYSAvICgxLjAgLSBhbHBoYSk7XFxuJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCB0ID0gc3FydCgxLjAgLyAoYSAqIGEpICsgdnQgKiAoIDIuMC9hICsgMi4wIC0gdnQgKSkgLSAxLjAgLyBhO1xcbidcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAnY2lyY2xlSW52Jykge1xyXG4gICAgICAgICAgICAgICAgLy8gMSAtIHNDaXJjbGVMb3coMSAtIHQsIGFscGhhKVxyXG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcclxuICAgICAgICAgICAgICAgICAgICAvL2lmIChhbHBoYSA9PSAwKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSB2dDtcXG4nXHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGFscGhhID09IDEpIHJldHVybiBNYXRoLnNxcnQoMiAqIHQgLSB0ICogdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gMS4wIC0gc3FydCgoMS4wIC0gdnQpICogKDEuMCArIHZ0KSk7XFxuJ1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBhID0gYWxwaGEgLyAoMSAtIGFscGhhKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyAoMiAqIHQpIC8gYSArIDIgKiB0IC0gdCAqIHQpIC0gMSAvIGE7XHJcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCBhID0gYWxwaGEgLyAoMS4wIC0gYWxwaGEpO1xcbicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgdCA9IDEuMCAtIHNxcnQoMS4wIC8gKGEgKiBhKSArICgxLjAtdnQpICogKCAyLjAvYSArIDEuMCArIHZ0ICkpICsgMS4wIC8gYTtcXG4nXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIHN0cmV0Y2hpbmcgZnVuY3Rpb24gY29kZTogJyArIHN0cmV0Y2hpbmcuZnVuKVxyXG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jaG9vc2UgaW5pdGlhbCBhbmQgZmluYWwgY29sb3JzLCBhbmQgYWRqdXN0IHQgdmFsdWVcclxuICAgICAgICBpZiAoY29sb3JzLmxlbmd0aCA9PSAxKSBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0k9YzA7XFxuICAgdmVjNCBjRj1jMDtcXG4nXHJcbiAgICAgICAgZWxzZSBpZiAoY29sb3JzLmxlbmd0aCA9PSAyKSBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0k9YzA7XFxuICAgdmVjNCBjRj1jMTtcXG4nXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5iID0gY29sb3JzLmxlbmd0aCAtIDFcclxuICAgICAgICAgICAgY29uc3QgbmJzID0gbmIgKyAnLjAnXHJcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgdmVjNCBjSTtcXG4nXHJcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgdmVjNCBjRjtcXG4nXHJcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgaWYodDwxLjAvJyArIG5icyArICcpIHsgY0k9YzA7IGNGPWMxOyB0PXQqJyArIG5icyArICc7IH1cXG4nXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbmI7IGkrKylcclxuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxyXG4gICAgICAgICAgICAgICAgICAgICcgICBlbHNlIGlmKHQ8JyArXHJcbiAgICAgICAgICAgICAgICAgICAgaSArXHJcbiAgICAgICAgICAgICAgICAgICAgJy4wLycgK1xyXG4gICAgICAgICAgICAgICAgICAgIG5icyArXHJcbiAgICAgICAgICAgICAgICAgICAgJykgeyBjST1jJyArXHJcbiAgICAgICAgICAgICAgICAgICAgKGkgLSAxKSArXHJcbiAgICAgICAgICAgICAgICAgICAgJzsgY0Y9YycgK1xyXG4gICAgICAgICAgICAgICAgICAgIGkgK1xyXG4gICAgICAgICAgICAgICAgICAgICc7IHQ9JyArXHJcbiAgICAgICAgICAgICAgICAgICAgbmJzICtcclxuICAgICAgICAgICAgICAgICAgICAnKnQtJyArXHJcbiAgICAgICAgICAgICAgICAgICAgKGkgLSAxKSArXHJcbiAgICAgICAgICAgICAgICAgICAgJy4wOyB9XFxuJ1xyXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz1cclxuICAgICAgICAgICAgICAgICcgICBlbHNlIHsgY0k9YycgKyAobmIgLSAxKSArICc7IGNGPWMnICsgbmIgKyAnOyB0PScgKyBuYnMgKyAnKnQtJyArIChuYiAtIDEpICsgJy4wOyB9XFxuJ1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9vbmUgc2luZ2xlIGNvbG9yXHJcbiAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPT0gMSkgZnNoU3RyaW5nICs9ICcgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGMwWzBdLCBjMFsxXSwgYzBbMl0sIGMwWzNdKTt9XFxuJ1xyXG4gICAgICAgIC8vc2V0IGludGVycG9sYXRlZCBjb2xvciwgYmV0d2VlbiBpbml0aWFsIGFuZCBmaW5hbCBvbmVcclxuICAgICAgICBlbHNlIGZzaFN0cmluZyArPSAnICAgZ2xfRnJhZ0NvbG9yID0gbWl4KGNJLCBjRiwgdCk7fVxcbidcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhmc2hTdHJpbmcpXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xTaGFkZXJ9ICovXHJcbiAgICAgICAgY29uc3QgZlNoYWRlciA9IGNyZWF0ZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmc2hTdHJpbmcpXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfSAqL1xyXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKGdsLCB2U2hhZGVyLCBmU2hhZGVyKVxyXG4gICAgICAgIGdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKVxyXG5cclxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xyXG5cclxuICAgICAgICAvL3NpemVQaXhcclxuICAgICAgICAvL1RPRE86IGJ1ZyBoZXJlLiBTZWVtcyB0byBiZSBsaW1pdGVkIHRvIHNvbWUgdGhyZXNob2xkIHZhbHVlIChhcm91bmQgMjUwKS5cclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3NpemVQaXgnKSwgMS4wICogc2l6ZVBpeClcclxuXHJcbiAgICAgICAgLy9zdHJldGNoaW5nIGFscGhhIGZhY3RvclxyXG4gICAgICAgIGdsLnVuaWZvcm0xZihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnYWxwaGEnKSwgc3RyZXRjaGluZyA/IDEuMCAqIHN0cmV0Y2hpbmcuYWxwaGEgOiAwLjApXHJcblxyXG4gICAgICAgIC8vY29sb3JzXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgYyA9IGNvbG9yKGNvbG9yc1tpXSlcclxuXHJcbiAgICAgICAgICAgIGxldCBvcGFjaXR5ID0gYy5vcGFjaXR5XHJcbiAgICAgICAgICAgIGlmIChjLm9wYWNpdHkgPT0gMSAmJiBnbG9iYWxPcGFjaXR5ICE9IHVuZGVmaW5lZCkgb3BhY2l0eSA9IGdsb2JhbE9wYWNpdHlcclxuXHJcbiAgICAgICAgICAgIGdsLnVuaWZvcm00ZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2MnICsgaSksIFtcclxuICAgICAgICAgICAgICAgICtjLnIgLyAyNTUuMCxcclxuICAgICAgICAgICAgICAgICtjLmcgLyAyNTUuMCxcclxuICAgICAgICAgICAgICAgICtjLmIgLyAyNTUuMCxcclxuICAgICAgICAgICAgICAgICtvcGFjaXR5LFxyXG4gICAgICAgICAgICBdKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogICovXHJcbiAgICBkcmF3KHZlcnRpY2VzQnVmZmVyLCB0QnVmZmVyLCB0cmFuc2ZvTWF0KSB7XHJcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXHJcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHRoaXMucHJvZ3JhbVxyXG5cclxuICAgICAgICAvL3ZlcnRpY2UgZGF0YVxyXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcclxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlc0J1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3BvcycpXHJcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcclxuICAgICAgICAgICAgcG9zaXRpb24sXHJcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xyXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXHJcbiAgICAgICAgICAgIGZhbHNlLCAvL25vcm1hbGlzZVxyXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxyXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XHJcbiAgICAgICAgKVxyXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxyXG5cclxuICAgICAgICAvL3QgZGF0YVxyXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcclxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh0QnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXHJcbiAgICAgICAgY29uc3QgdCA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICd0JylcclxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHQsIDEsIGdsLkZMT0FULCBmYWxzZSwgMCwgMClcclxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0KVxyXG5cclxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXHJcbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcclxuXHJcbiAgICAgICAgLy8gRW5hYmxlIHRoZSBkZXB0aCB0ZXN0XHJcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XHJcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciBiaXRcclxuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKVxyXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XHJcbiAgICAgICAgLy9nbC52aWV3cG9ydCgwLCAwLCBjZy53LCBjZy5oKTtcclxuXHJcbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHZlcnRpY2VzQnVmZmVyLmxlbmd0aCAvIDIpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBpbml0U2hhZGVyUHJvZ3JhbSwgY3JlYXRlU2hhZGVyIH0gZnJvbSAnLi93ZWJHTFV0aWxzLmpzJ1xyXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xyXG5cclxuLyoqXHJcbiAqIEV2ZXJ5dGhpbmcgdG8gZWFzaWx5IGRyYXcgY29sb3JlZCBzcXVhcmVzIHdpdGggd2ViR0wuXHJcbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXHJcbiAqIENvbG9yIGJhc2VkIG9uIGNhdGVnb3JpZXMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nPn0gY29sb3JzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbG9ycykge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cclxuICAgICAgICB0aGlzLmNvbG9ycyA9IGNvbG9yc1xyXG5cclxuICAgICAgICAvKiogVmVjdG9yIHNoYWRlciBwcm9ncmFtXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnZzaFN0cmluZyA9IGBcclxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XHJcbiAgICAgICAgdW5pZm9ybSBmbG9hdCBzaXplUGl4O1xyXG4gICAgICAgIHVuaWZvcm0gbWF0MyBtYXQ7XHJcblxyXG4gICAgICAgIGF0dHJpYnV0ZSBmbG9hdCBpO1xyXG4gICAgICAgIHZhcnlpbmcgZmxvYXQgdmk7XHJcblxyXG4gICAgICAgIHZvaWQgbWFpbigpIHtcclxuICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChtYXQgKiB2ZWMzKHBvcywgMS4wKSwgMS4wKTtcclxuICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XHJcbiAgICAgICAgICB2aSA9IGk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGBcclxuXHJcbiAgICAgICAgLy9wcmVwYXJlIGZyYWdtZW50IHNoYWRlciBjb2RlXHJcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcclxuICAgICAgICBjb25zdCBvdXQgPSBbXVxyXG4gICAgICAgIG91dC5wdXNoKCdwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcXG52YXJ5aW5nIGZsb2F0IHZpO1xcbicpXHJcbiAgICAgICAgLy9hZGQgY29sb3IgdW5pZm9ybXNcclxuICAgICAgICBvdXQucHVzaCgndW5pZm9ybSB2ZWM0JylcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaSA+IDApIG91dC5wdXNoKCcsJylcclxuICAgICAgICAgICAgb3V0LnB1c2goJyBjJyArIGkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG91dC5wdXNoKCc7XFxuJylcclxuICAgICAgICAvL3N0YXJ0IHRoZSBtYWluIGZ1bmN0aW9uXHJcbiAgICAgICAgb3V0LnB1c2goJ3ZvaWQgbWFpbih2b2lkKSB7XFxuJylcclxuICAgICAgICAvL2Nob29zZSBjb2xvciBpXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGkgPiAwKSBvdXQucHVzaCgnZWxzZSAnKVxyXG4gICAgICAgICAgICBvdXQucHVzaCgnaWYodmk9PScpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKGkpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKCcuMCkgZ2xfRnJhZ0NvbG9yID0gdmVjNChjJylcclxuICAgICAgICAgICAgb3V0LnB1c2goaSlcclxuICAgICAgICAgICAgb3V0LnB1c2goJ1swXSwgYycpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKGkpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMV0sIGMnKVxyXG4gICAgICAgICAgICBvdXQucHVzaChpKVxyXG4gICAgICAgICAgICBvdXQucHVzaCgnWzJdLCBjJylcclxuICAgICAgICAgICAgb3V0LnB1c2goaSlcclxuICAgICAgICAgICAgb3V0LnB1c2goJ1szXSk7XFxuJylcclxuICAgICAgICB9XHJcbiAgICAgICAgb3V0LnB1c2goJ2Vsc2UgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApO1xcbn0nKVxyXG4gICAgICAgIC8qKiBGcmFnbWVudCBzaGFkZXIgcHJvZ3JhbVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5mc2hTdHJpbmcgPSBvdXQuam9pbignJylcclxuICAgIH1cclxuXHJcbiAgICAvKiogICovXHJcbiAgICBkcmF3KGdsLCB2ZXJ0aWNlc0J1ZmZlciwgaUJ1ZmZlciwgdHJhbnNmb01hdCwgc2l6ZVBpeCA9IDEwKSB7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cclxuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB0aGlzLnZzaFN0cmluZylcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cclxuICAgICAgICBjb25zdCBmU2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIHRoaXMuZnNoU3RyaW5nKVxyXG5cclxuICAgICAgICAvKiogQHR5cGUge1dlYkdMUHJvZ3JhbX0gKi9cclxuICAgICAgICBjb25zdCBwcm9ncmFtID0gaW5pdFNoYWRlclByb2dyYW0oZ2wsIHZTaGFkZXIsIGZTaGFkZXIpXHJcbiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKVxyXG5cclxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xyXG5cclxuICAgICAgICAvL3NpemVQaXhcclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXHJcblxyXG4gICAgICAgIC8vY29sb3JzXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjID0gY29sb3IodGhpcy5jb2xvcnNbaV0pXHJcbiAgICAgICAgICAgIGdsLnVuaWZvcm00ZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdjJyArIGkpLCBbXHJcbiAgICAgICAgICAgICAgICArYy5yIC8gMjU1LjAsXHJcbiAgICAgICAgICAgICAgICArYy5nIC8gMjU1LjAsXHJcbiAgICAgICAgICAgICAgICArYy5iIC8gMjU1LjAsXHJcbiAgICAgICAgICAgICAgICArYy5vcGFjaXR5LFxyXG4gICAgICAgICAgICBdKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy92ZXJ0aWNlIGRhdGFcclxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXHJcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdwb3MnKVxyXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXHJcbiAgICAgICAgICAgIHBvc2l0aW9uLFxyXG4gICAgICAgICAgICAyLCAvL251bUNvbXBvbmVudHNcclxuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxyXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcclxuICAgICAgICAgICAgMCwgLy9zdHJpZGVcclxuICAgICAgICAgICAgMCAvL29mZnNldFxyXG4gICAgICAgIClcclxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShwb3NpdGlvbilcclxuXHJcbiAgICAgICAgLy9pIGRhdGFcclxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXHJcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoaUJ1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxyXG4gICAgICAgIGNvbnN0IGkgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnaScpXHJcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihpLCAxLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApXHJcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaSlcclxuXHJcbiAgICAgICAgLy90cmFuc2Zvcm1hdGlvblxyXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdtYXQnKSwgZmFsc2UsIG5ldyBGbG9hdDMyQXJyYXkodHJhbnNmb01hdCkpXHJcblxyXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZGVwdGggdGVzdFxyXG4gICAgICAgIC8vZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xyXG4gICAgICAgIC8vIENsZWFyIHRoZSBjb2xvciBidWZmZXIgYml0XHJcbiAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVClcclxuICAgICAgICAvLyBTZXQgdGhlIHZpZXcgcG9ydFxyXG4gICAgICAgIC8vZ2wudmlld3BvcnQoMCwgMCwgY2cudywgY2cuaCk7XHJcblxyXG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCB2ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgZXh0ZW50LCBtYXggfSBmcm9tIFwiZDMtYXJyYXlcIlxyXG5pbXBvcnQgeyBzY2FsZVF1YW50aWxlIH0gZnJvbSBcImQzLXNjYWxlXCJcclxuXHJcbi8qKlxyXG4gKiBBIHNjYWxlIGlzIHNpbXBseSBhIGZ1bmN0aW9uIHRoYXQgbWFwIGEgZG9tYWluIHRvIGEgcmFuZ2UuXHJcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn0gU2NhbGUgKi9cclxuXHJcbi8qKlxyXG4gKiBBIHNjYWxlIHdob3NlIHJhbmdlIGlzIGEgY29sb3IgKHN0cmluZykuXHJcbiogQHR5cGVkZWYge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSBDb2xvclNjYWxlICovXHJcblxyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGUgdXRpbHNcclxuICovXHJcblxyXG5cclxuLyoqXHJcbiAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIHZpZXcgc2NhbGUgLSBjb250aW51b3VzIG9yIGRpc2NyZXRlXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBtaW5WYWx1ZT86bnVtYmVyLCBtaW5TaXplUGl4PzpudW1iZXIsIG1heFNpemVGYWN0b3I/Om51bWJlciwgcmFuZ2U/OltudW1iZXIsIG51bWJlcl0sIGRvbWFpbj86W251bWJlciwgbnVtYmVyXSwgc3RyZXRjaGluZz86ZnVuY3Rpb24obnVtYmVyKTpudW1iZXIsIGNsYXNzTnVtYmVyPzpudW1iZXJ9fSBvcHRzIFxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPik6U2NhbGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlID0gKG9wdHMpID0+IHtcclxuICAgIGNvbnN0IHZhbHVlRnVuY3Rpb24gPSBvcHRzLnZhbHVlRnVuY3Rpb25cclxuICAgIGNvbnN0IG1pblZhbHVlID0gb3B0cy5taW5WYWx1ZSB8fCAwXHJcbiAgICBjb25zdCBtaW5TaXplUGl4ID0gb3B0cy5taW5TaXplUGl4IHx8IDBcclxuICAgIGNvbnN0IG1heFNpemVGYWN0b3IgPSBvcHRzLm1heFNpemVGYWN0b3IgfHwgMVxyXG4gICAgY29uc3Qgc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xyXG4gICAgY29uc3QgcmFuZ2VfID0gb3B0cy5yYW5nZVxyXG4gICAgY29uc3QgZG9tYWluXyA9IG9wdHMuZG9tYWluXHJcbiAgICBjb25zdCBjbGFzc051bWJlciA9IG9wdHMuY2xhc3NOdW1iZXJcclxuICAgIHJldHVybiAoY2VsbHMsIHJlc29sdXRpb24sIHopID0+IHtcclxuICAgICAgICBjb25zdCBkb21haW4gPSBkb21haW5fIHx8IFttaW5WYWx1ZSwgbWF4KGNlbGxzLCB2YWx1ZUZ1bmN0aW9uKV1cclxuICAgICAgICBjb25zdCByYW5nZSA9IHJhbmdlXyB8fCBbbWluU2l6ZVBpeCAqIHosIHJlc29sdXRpb24gKiBtYXhTaXplRmFjdG9yXVxyXG4gICAgICAgIGNvbnN0IGRvbWFpblNpemUgPSBkb21haW5bMV0gLSBkb21haW5bMF0sIGRvbWFpbk1pbiA9IGRvbWFpblswXVxyXG4gICAgICAgIGNvbnN0IHJhbmdlU2l6ZSA9IHJhbmdlWzFdIC0gcmFuZ2VbMF0sIHJhbmdlTWluID0gcmFuZ2VbMF1cclxuICAgICAgICByZXR1cm4gdCA9PiB7XHJcbiAgICAgICAgICAgIC8vc2NhbGUgdG8gWzAsMV1cclxuICAgICAgICAgICAgdCA9ICh0IC0gZG9tYWluTWluKSAvIGRvbWFpblNpemVcclxuICAgICAgICAgICAgLy9zdHJldGNoXHJcbiAgICAgICAgICAgIGlmIChzdHJldGNoaW5nKSB0ID0gc3RyZXRjaGluZyh0KVxyXG4gICAgICAgICAgICAvL2NsYXNzaWZ5XHJcbiAgICAgICAgICAgIGlmIChjbGFzc051bWJlcikgdCA9IHQgPT0gMSA/IDEgOiBNYXRoLmZsb29yKHQgKiAoY2xhc3NOdW1iZXIpKSAvIChjbGFzc051bWJlciAtIDEpXHJcbiAgICAgICAgICAgIC8vc2NhbGUgdG8gcmFuZ2VcclxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlTWluICsgdCAqIHJhbmdlU2l6ZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG4vKipcclxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgdmlldyBzY2FsZSAtIHF1YW50aWxlXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBjbGFzc051bWJlcj86bnVtYmVyLCBtaW5TaXplUGl4PzpudW1iZXIsIG1heFNpemVGYWN0b3I/Om51bWJlciB9fSBvcHRzIFxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPik6U2NhbGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlUXVhbnRpbGUgPSAob3B0cykgPT4ge1xyXG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvblxyXG4gICAgY29uc3QgY2xhc3NOdW1iZXIgPSBvcHRzLmNsYXNzTnVtYmVyIHx8IDEyXHJcbiAgICBjb25zdCBtaW5TaXplUGl4ID0gb3B0cy5taW5TaXplUGl4IHx8IDFcclxuICAgIGNvbnN0IG1heFNpemVGYWN0b3IgPSBvcHRzLm1heFNpemVGYWN0b3IgfHwgMVxyXG4gICAgY29uc3Qgc2NhbGUgPSBzY2FsZVF1YW50aWxlKClcclxuICAgIHJldHVybiAoY2VsbHMsIHJlc29sdXRpb24sIHopID0+IHtcclxuICAgICAgICBzY2FsZS5kb21haW4oY2VsbHMubWFwKHZhbHVlRnVuY3Rpb24pKVxyXG4gICAgICAgIGNvbnN0IG1pblNpemVHZW8gPSBtaW5TaXplUGl4ICogeiwgbWF4U2l6ZUdlbyA9IHJlc29sdXRpb24gKiBtYXhTaXplRmFjdG9yXHJcbiAgICAgICAgc2NhbGUucmFuZ2UoQXJyYXkuZnJvbSh7IGxlbmd0aDogY2xhc3NOdW1iZXIgfSwgKF8sIGkpID0+IG1pblNpemVHZW8gKyBpICogKG1heFNpemVHZW8gLSBtaW5TaXplR2VvKSAvIChjbGFzc051bWJlciAtIDEpKSlcclxuICAgICAgICBzY2FsZS5icmVha3MgPSBzY2FsZS5xdWFudGlsZXMoKVxyXG4gICAgICAgIHNjYWxlLnZhbHVlcyA9IHNjYWxlLnJhbmdlKClcclxuICAgICAgICByZXR1cm4gc2NhbGU7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuLyoqXHJcbiAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIGNvbG9yIHZpZXcgc2NhbGUgLSBjb250aW51b3VzIG9yIGRpc2NyZXRlXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBjb2xvclNjYWxlPzpmdW5jdGlvbihudW1iZXIpOnN0cmluZywgY29sb3JzPzpBcnJheS48c3RyaW5nPiwgc3RyZXRjaGluZz86ZnVuY3Rpb24obnVtYmVyKTpudW1iZXIgfX0gb3B0cyBcclxuICogQHJldHVybnMge2Z1bmN0aW9uKEFycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD4pOkNvbG9yU2NhbGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlQ29sb3IgPSAob3B0cykgPT4ge1xyXG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvblxyXG4gICAgY29uc3Qgc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xyXG4gICAgbGV0IGNvbG9yU2NhbGUgPSBvcHRzLmNvbG9yU2NhbGUgfHwgKCgpID0+IFwicHVycGxlXCIpXHJcblxyXG4gICAgLy9kaXNjcmV0ZSBjb2xvcnMgY2FzZTogYnVpbGQgY29udGludW91cyBjb2xvciBzY2FsZSBmcm9tIGRpc2NyZXRlIG9uZXMuXHJcbiAgICBjb25zdCBuYkNsYXNzID0gb3B0cy5jb2xvcnM/Lmxlbmd0aFxyXG4gICAgaWYgKG9wdHMuY29sb3JzICYmIG5iQ2xhc3MpXHJcbiAgICAgICAgY29sb3JTY2FsZSA9IHQgPT4gb3B0cy5jb2xvcnNbdCA9PSAxID8gbmJDbGFzcyAtIDEgOiBNYXRoLmZsb29yKHQgKiBuYkNsYXNzKV1cclxuXHJcbiAgICByZXR1cm4gKGNlbGxzKSA9PiB7XHJcbiAgICAgICAgaWYgKGNlbGxzLmxlbmd0aCA9PSAwIHx8ICFjZWxscykgcmV0dXJuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtbdW5kZWZpbmVkLCB1bmRlZmluZWRdIHwgW251bWJlciwgbnVtYmVyXX0gKi9cclxuICAgICAgICBjb25zdCBkb21haW4gPSBleHRlbnQoY2VsbHMsIHZhbHVlRnVuY3Rpb24pXHJcbiAgICAgICAgaWYgKGRvbWFpblswXSA9PSB1bmRlZmluZWQpIHJldHVyblxyXG4gICAgICAgIGNvbnN0IGRvbWFpblNpemUgPSBkb21haW5bMV0gLSBkb21haW5bMF1cclxuICAgICAgICBjb25zdCBzY2FsZSA9IHQgPT4ge1xyXG4gICAgICAgICAgICAvL3NjYWxlIHRvIFswLDFdXHJcbiAgICAgICAgICAgIHQgPSAodCAtIGRvbWFpblswXSkgLyBkb21haW5TaXplXHJcbiAgICAgICAgICAgIC8vc3RyZXRjaFxyXG4gICAgICAgICAgICBpZiAoc3RyZXRjaGluZykgdCA9IHN0cmV0Y2hpbmcodClcclxuICAgICAgICAgICAgcmV0dXJuIGNvbG9yU2NhbGUodClcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9mdW5jdGlvbiB0aGF0IHJldHVybiB0aGUgZG9tYWluIHZhbHVlIGZyb20gdGhlIFswLDFdIHJhbmdlLlxyXG4gICAgICAgIHNjYWxlLmludmVydCA9IHQgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc3RyZXRjaGluZykgdCA9IHN0cmV0Y2hpbmcuaW52ZXJ0KHQpXHJcbiAgICAgICAgICAgIHJldHVybiBkb21haW5bMF0gKyB0ICogZG9tYWluU2l6ZVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL2Rpc2NyZXRlIGNvbG9yczogcmV0dXJuIHRoZSBicmVha3NcclxuICAgICAgICBpZiAob3B0cy5jb2xvcnMgJiYgbmJDbGFzcykge1xyXG4gICAgICAgICAgICBzY2FsZS5icmVha3MgPSBbXVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iQ2xhc3M7IGkrKylcclxuICAgICAgICAgICAgICAgIHNjYWxlLmJyZWFrcy5wdXNoKHNjYWxlLmludmVydChpIC8gbmJDbGFzcykpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2NhbGU7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4vKipcclxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgY29sb3IgdmlldyBzY2FsZSAtIHF1YW50aWxlXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBjbGFzc051bWJlcj86bnVtYmVyLCBjb2xvcnM/OkFycmF5LjxzdHJpbmc+LCBjb2xvclNjYWxlPzpmdW5jdGlvbihudW1iZXIpOnN0cmluZyB9fSBvcHRzIFxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPik6Q29sb3JTY2FsZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB2aWV3U2NhbGVDb2xvclF1YW50aWxlID0gKG9wdHMpID0+IHtcclxuICAgIGNvbnN0IHZhbHVlRnVuY3Rpb24gPSBvcHRzLnZhbHVlRnVuY3Rpb25cclxuICAgIGNvbnN0IGNsYXNzTnVtYmVyID0gb3B0cy5jbGFzc051bWJlciB8fCAxMlxyXG5cclxuICAgIGxldCBjb2xvcnMgPSBvcHRzLmNvbG9yc1xyXG4gICAgaWYgKG9wdHMuY29sb3JTY2FsZSkgY29sb3JzID0gZGlzY3JldGVDb2xvcnMob3B0cy5jb2xvclNjYWxlLCBjbGFzc051bWJlcilcclxuICAgIGNvbG9ycyA9IGNvbG9ycyB8fCBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjbGFzc051bWJlciB9LCAoXywgaSkgPT4gXCJyZ2IoXCIgKyBNYXRoLmZsb29yKDI1NSAqIGkgLyAoY2xhc3NOdW1iZXIgLSAxKSkgKyBcIiwxNTAsMTUwKVwiKVxyXG5cclxuICAgIGNvbnN0IHNjYWxlID0gc2NhbGVRdWFudGlsZSgpLnJhbmdlKGNvbG9ycylcclxuICAgIHJldHVybiAoY2VsbHMpID0+IHtcclxuICAgICAgICBzY2FsZS5kb21haW4oY2VsbHMubWFwKHZhbHVlRnVuY3Rpb24pKTtcclxuICAgICAgICBzY2FsZS5icmVha3MgPSBzY2FsZS5xdWFudGlsZXMoKVxyXG4gICAgICAgIHNjYWxlLmNvbG9ycyA9IGNvbG9yc1xyXG4gICAgICAgIHJldHVybiBzY2FsZTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5cclxuLyoqXHJcbiAqIENvbWJpbmUgdmlldyBzY2FsZSBmdW5jdGlvbnNcclxuICogXHJcbiAqIEBwYXJhbSB7Kn0gb2JqIFxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlQ29tYmluYXRpb24gPSAob2JqKSA9PiB7XHJcbiAgICAvL29iajogcHJvcCBhbmQgYSBmdW5jdGlvbiB0byBjYWxsXHJcbiAgICByZXR1cm4gKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3V0ID0ge31cclxuICAgICAgICBmb3IgKGNvbnN0IHAgaW4gb2JqKSB7IG91dFtwXSA9IG9ialtwXShjZWxscywgcmVzb2x1dGlvbiwgeikgfVxyXG4gICAgICAgIHJldHVybiBvdXRcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4vKipcclxuICogUmV0dXJuIGEgY2xhc3NpZmllciBmdW5jdGlvbiBmcm9tIGJyZWFrIHZhbHVlcy5cclxuICogVGhlIGNsYXNzaWZpZXIgZnVuY3Rpb24gcmV0dXJucyB0aGUgY2xhc3MgaWQgKGZyb20gMCB0byBicmVha3MubGVuZ3RoKSBmcm9tIGEgdmFsdWUgdG8gY2xhc3NpZml5LlxyXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBicmVha3MgdGhlIGJyZWFrc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZpZXIoYnJlYWtzKSB7XHJcbiAgICBjb25zdCBibCA9IGJyZWFrcy5sZW5ndGhcclxuICAgIGNvbnN0IGNsYXNzaWZpZXIgPSB2YWx1ZSA9PiB7XHJcbiAgICAgICAgbGV0IGkgPSAwXHJcbiAgICAgICAgd2hpbGUgKGkgPCBibCkge1xyXG4gICAgICAgICAgICBjb25zdCBicmVha18gPSBicmVha3NbaV1cclxuICAgICAgICAgICAgaWYgKHZhbHVlIDw9IGJyZWFrXykgcmV0dXJuIGlcclxuICAgICAgICAgICAgaSsrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpXHJcbiAgICB9XHJcbiAgICBjbGFzc2lmaWVyLmJyZWFrcyA9IGJyZWFrc1xyXG4gICAgcmV0dXJuIGNsYXNzaWZpZXJcclxufVxyXG5cclxuXHJcblxyXG4vKipcclxuICogUmV0dXJuIGEgY29sb3IgY2xhc3NpZmllciBmdW5jdGlvbiBmcm9tIGJyZWFrIHZhbHVlcy5cclxuICogVGhlIGNsYXNzaWZpZXIgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29sb3IgZnJvbSBhIHZhbHVlIHRvIGNsYXNzaWZpeS5cclxuICogVGhlcmUgc2hvdWxkIGJlIG9uZSBjb2xvciBtb3JlIHRoYW4gYnJlYWsgdmFsdWVzLlxyXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBicmVha3MgdGhlIGJyZWFrc1xyXG4gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjb2xvcnMgdGhlIGNvbG9yc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yQ2xhc3NpZmllcihicmVha3MsIGNvbG9ycykge1xyXG4gICAgY29uc3QgY2xhc3NpZmllcl8gPSBjbGFzc2lmaWVyKGJyZWFrcylcclxuICAgIGNvbnN0IGNvbG9yQ2xhc3NpZmllciA9IHZhbHVlID0+IGNvbG9yc1tjbGFzc2lmaWVyXyh2YWx1ZSldXHJcbiAgICBjb2xvckNsYXNzaWZpZXIuYnJlYWtzID0gYnJlYWtzXHJcbiAgICBjb2xvckNsYXNzaWZpZXIuY29sb3JzID0gY29sb3JzXHJcbiAgICByZXR1cm4gY29sb3JDbGFzc2lmaWVyXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBNYWtlIGFycmF5IG9mIGNvbG9ycyBmcm9tIGEgY29sb3JTY2FsZS5cclxuICogSXQgaXMgYSBraW5kIG9mIHNhbXBsaW5nLCBvciB1bi1pbnRlcnBvbGF0aW9uXHJcbiAqIFxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSBjb2xvclNjYWxlIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gbmIgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGlzY3JldGVDb2xvcnMoY29sb3JTY2FsZSwgbmIpIHtcclxuICAgIGlmIChuYiA9PSAxKSByZXR1cm4gW2NvbG9yU2NhbGUoMC41KV1cclxuICAgIGNvbnN0IG91dCA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iOyBpKyspXHJcbiAgICAgICAgb3V0LnB1c2goY29sb3JTY2FsZShpIC8gKG5iIC0gMSkpKVxyXG4gICAgcmV0dXJuIG91dFxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGUgdXRpbHNcclxuICovXHJcblxyXG5cclxuLy9UT0RPIGludmVydCBmb3IgY2lyY3VsYXJcclxuLy9UT0RPIHVzZSBNYXRoLnNxcnRcclxuLy9UT0RPIHZhbGlkYXRlXHJcblxyXG5cclxuLyoqXHJcbiAqIFNvbWUgZnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxyXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ldXJvc3RhdC9ncmlkdml6L2Jsb2IvbWFzdGVyL2RvY3MvcmVmZXJlbmNlLm1kI3N0cmV0Y2hpbmdcclxuICogQHNlZSBodHRwczovL29ic2VydmFibGVocS5jb20vQGpnYWZmdXJpL3N0cmV0Y2hpbmdcclxuICovXHJcblxyXG4vL2lkZW50aXR5IGZ1bmN0aW9uXHJcbmNvbnN0IGlkZW50aXR5ID0gdCA9PiB0XHJcbmlkZW50aXR5LmludmVydCA9IGlkZW50aXR5XHJcblxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlIFxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZXhwb25lbnRpYWxTY2FsZSA9IChiYXNlID0gMykgPT4ge1xyXG4gICAgaWYgKGJhc2UgPT0gMCkgcmV0dXJuIGlkZW50aXR5XHJcbiAgICBjb25zdCBhID0gKE1hdGguZXhwKGJhc2UpIC0gMSlcclxuICAgIGNvbnN0IGYgPSB0ID0+IChNYXRoLmV4cCh0ICogYmFzZSkgLSAxKSAvIGFcclxuICAgIGYuaW52ZXJ0ID0gdCA9PiBNYXRoLmxvZyhhICogdCArIDEpIC8gYmFzZVxyXG4gICAgcmV0dXJuIGZcclxufVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlIFxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbG9nYXJpdGhtaWNTY2FsZSA9IChiYXNlID0gMykgPT4ge1xyXG4gICAgaWYgKGJhc2UgPT0gMCkgcmV0dXJuIGlkZW50aXR5XHJcbiAgICBjb25zdCBhID0gTWF0aC5leHAoYmFzZSksIGIgPSAxIC0gYVxyXG4gICAgY29uc3QgZiA9IHQgPT4gMSAtIE1hdGgubG9nKGEgKyB0ICogYikgLyBiYXNlXHJcbiAgICBmLmludmVydCA9IHQgPT4gKE1hdGguZXhwKCgxIC0gdCkgKiBiYXNlKSAtIGEpIC8gYlxyXG4gICAgcmV0dXJuIGZcclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZXhwb25lbnQgXHJcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb3dlclNjYWxlID0gKGV4cG9uZW50ID0gMykgPT4ge1xyXG4gICAgaWYgKGV4cG9uZW50ID09IDEpIHJldHVybiBpZGVudGl0eVxyXG4gICAgLy9UT0RPIGlmIChleHBvbmVudCA9PSAwLjUpIHJldHVybiBNYXRoLnNxcnRcclxuICAgIGNvbnN0IGYgPSB0ID0+IE1hdGgucG93KHQsIGV4cG9uZW50KVxyXG4gICAgY29uc3QgYSA9IDEgLyBleHBvbmVudFxyXG4gICAgZi5pbnZlcnQgPSB0ID0+IE1hdGgucG93KHQsIGEpXHJcbiAgICByZXR1cm4gZlxyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtudW1iZXJ9IGV4cG9uZW50IFxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcG93ZXJJbnZlcnNlU2NhbGUgPSAoZXhwb25lbnQgPSAzKSA9PiB7XHJcbiAgICBpZiAoZXhwb25lbnQgPT0gMSkgcmV0dXJuIGlkZW50aXR5XHJcbiAgICAvL1RPRE8gaWYgKGV4cG9uZW50ID09IDIpIHJldHVybiB0ID0+IDEgLSBNYXRoLnNxcnQoMSAtIHQpXHJcbiAgICBjb25zdCBhID0gMSAvIGV4cG9uZW50XHJcbiAgICBjb25zdCBmID0gdCA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIGEpXHJcbiAgICBmLmludmVydCA9IHQgPT4gMSAtIE1hdGgucG93KDEgLSB0LCBleHBvbmVudClcclxuICAgIHJldHVybiBmXHJcbn1cclxuXHJcblxyXG5cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY2lyY3VsYXJpdHkgXHJcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjaXJjdWxhclNjYWxlID0gKGNpcmN1bGFyaXR5ID0gMC44KSA9PiB7XHJcbiAgICBpZiAoY2lyY3VsYXJpdHkgPT0gMCkgcmV0dXJuIGlkZW50aXR5XHJcbiAgICBpZiAoY2lyY3VsYXJpdHkgPT0gMSkgcmV0dXJuIHQgPT4gTWF0aC5zcXJ0KHQgKiAoMiAtIHQpKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgY29uc3QgYSA9IGNpcmN1bGFyaXR5IC8gKDEgLSBjaXJjdWxhcml0eSlcclxuICAgICAgICByZXR1cm4gdCA9PiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyB0ICogKDIgLyBhICsgMiAtIHQpKSAtIDEgLyBhXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY2lyY3VsYXJpdHkgXHJcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjaXJjdWxhckludmVyc2VTY2FsZSA9IChjaXJjdWxhcml0eSA9IDAuOCkgPT4ge1xyXG4gICAgaWYgKGNpcmN1bGFyaXR5ID09IDApIHJldHVybiBpZGVudGl0eVxyXG4gICAgY29uc3QgZiA9IGNpcmN1bGFyU2NhbGUoY2lyY3VsYXJpdHkpXHJcbiAgICByZXR1cm4gdCA9PiAxIC0gZigxIC0gdClcclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbi8vdGVzdFxyXG4vKlxyXG5jb25zdCB0ZXN0ID0gKGYsIGZ1biwgYSwgZXJyID0gMWUtMTIpID0+IHtcclxuICAgIGZvciAobGV0IHQgPSAwOyB0IDw9IDE7IHQgKz0gMSAvIDUwKSB7XHJcbiAgICAgICAgY29uc3QgZXIgPSB0IC0gZi5pbnZlcnQoZih0KSlcclxuICAgICAgICBpZiAoTWF0aC5hYnMoZXIpIDwgZXJyKSBjb250aW51ZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKGZ1biwgYSwgZXIpXHJcbiAgICB9XHJcbn1cclxuXHJcbmZvciAobGV0IGZ1biBvZiBbcG93ZXJTY2FsZSwgcG93ZXJJbnZlcnNlU2NhbGVdKVxyXG4gICAgZm9yIChsZXQgZXhwID0gLTMwOyBleHAgPD0gNTA7IGV4cCArPSAxKSB7XHJcbiAgICAgICAgaWYgKGV4cCA9PSAwKSBjb250aW51ZVxyXG4gICAgICAgIGNvbnN0IGYgPSBmdW4oZXhwKVxyXG4gICAgICAgIHRlc3QoZiwgZnVuLCBleHApXHJcbiAgICB9XHJcblxyXG5cclxuZm9yIChsZXQgZnVuIG9mIFtleHBvbmVudGlhbFNjYWxlLCBsb2dhcml0aG1pY1NjYWxlXSlcclxuICAgIGZvciAobGV0IGJhc2UgPSAtMjA7IGJhc2UgPD0gMjA7IGJhc2UgKz0gMSkge1xyXG4gICAgICAgIC8vaWYgKGV4cCA9PSAwKSBjb250aW51ZVxyXG4gICAgICAgIGNvbnN0IGYgPSBmdW4oYmFzZSlcclxuICAgICAgICB0ZXN0KGYsIGZ1biwgYmFzZSwgMWUtMTApXHJcbiAgICB9XHJcbiovIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBpbnRlcnBvbGF0ZUxhYiB9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiXHJcblxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCB0ZXJuYXJ5Q2xhc3NpZmllciA9IChwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBvcHRzID0ge30pID0+IHtcclxuXHJcbiAgICAvL3RoZSB0aHJlZSBwcm9wZXJ0aWVzXHJcbiAgICBjb25zdCBwMCA9IHByb3BlcnRpZXNbMF0sIHAxID0gcHJvcGVydGllc1sxXSwgcDIgPSBwcm9wZXJ0aWVzWzJdXHJcblxyXG4gICAgLy90aGUgY2xhc3NpZmllciBjZW50ZXIgcG9pbnQuIHN1bSBtdXN0IGJlIGVxdWFsIHRvIDFcclxuICAgIGNvbnN0IFtjMCwgYzEsIGMyXSA9IG9wdHMuY2VudGVyIHx8IFsxIC8gMywgMSAvIDMsIDEgLyAzXVxyXG5cclxuICAgIC8vcGFyYW1ldGVyIHRvIGRlY2lkZSB3ZXRoZXIgdG8gdXNlIG1peGVkIGNsYXNzZXMgbTAsIG0xLCBtMi5cclxuICAgIGNvbnN0IHdpdGhNaXhlZENsYXNzZXMgPSBvcHRzLndpdGhNaXhlZENsYXNzZXMgIT0gdW5kZWZpbmVkID8gb3B0cy53aXRoTWl4ZWRDbGFzc2VzIDogdHJ1ZVxyXG5cclxuICAgIC8vcGFyYW1lcnRlciBkZWNpZGUgd2V0aGVyIHRvIHVzZSBhIGNlbnRyYWwgY2xhc3MsIGFuZCB0aGUgc2l6ZSBvZiB0aGlzIGNlbnRyYWwgY2xhc3MuXHJcbiAgICAvL3NldCB0byAwIG9yIHVuZGVmaW5lZCBmb3Igbm90IHNob3dpbmcgYW55IGNlbnRyYWwgY2xhc3MuIFNldCB0byAxIGZvciBhIGNlbnRyYWwgY2xhc3MgdGhhdCBjb250YWlucyB0aGUgbWl4IGNsYXNzZXNcclxuICAgIGNvbnN0IGNjID0gb3B0cy5jZW50ZXJDb2VmZmljaWVudCA/IDEgLSBvcHRzLmNlbnRlckNvZWZmaWNpZW50IDogdW5kZWZpbmVkXHJcblxyXG4gICAgLy90aGUgb3V0cHV0IGNsYXNzaWZpZXIgbWV0aG9kXHJcbiAgICBjb25zdCBmdW4gPSBjID0+IHtcclxuICAgICAgICAvL2dldCB0b3RhbFxyXG4gICAgICAgIGNvbnN0IHRvdCA9IHRvdGFsRnVuY3Rpb24oYylcclxuICAgICAgICBpZiAoIXRvdCkgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgIC8vY29tcHV0ZSBzaGFyZXNcclxuICAgICAgICBjb25zdCBbczAsIHMxLCBzMl0gPSBbK2NbcDBdIC8gdG90LCArY1twMV0gLyB0b3QsICtjW3AyXSAvIHRvdF1cclxuXHJcbiAgICAgICAgLy9jbGFzcyAwXHJcbiAgICAgICAgaWYgKHMwID49IGMwICYmIHMxIDw9IGMxICYmIHMyIDw9IGMyKSB7XHJcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzcyBuZWFyIGNsYXNzIDBcclxuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiAoczIgLSBjMikgKiAoYzEgLSBjYyAqIGMxKSA+PSAoczEgLSBjYyAqIGMxKSAqIChjYyAqIGMyIC0gYzIpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY2VudGVyXCJcclxuICAgICAgICAgICAgcmV0dXJuIFwiMFwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vY2xhc3MgMVxyXG4gICAgICAgIGlmIChzMCA8PSBjMCAmJiBzMSA+PSBjMSAmJiBzMiA8PSBjMikge1xyXG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3MgbmVhciBjbGFzcyAxXHJcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgKHMyIC0gYzIpICogKGMwIC0gY2MgKiBjMCkgPj0gKHMwIC0gY2MgKiBjMCkgKiAoY2MgKiBjMiAtIGMyKSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImNlbnRlclwiXHJcbiAgICAgICAgICAgIHJldHVybiBcIjFcIlxyXG4gICAgICAgIH1cclxuICAgICAgICAvL2NsYXNzIDJcclxuICAgICAgICBpZiAoczAgPD0gYzAgJiYgczEgPD0gYzEgJiYgczIgPj0gYzIpIHtcclxuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzIG5lYXIgY2xhc3MgMlxyXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIChzMSAtIGMxKSAqIChjMCAtIGNjICogYzApID49IChzMCAtIGNjICogYzApICogKGNjICogYzEgLSBjMSkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjZW50ZXJcIlxyXG4gICAgICAgICAgICByZXR1cm4gXCIyXCJcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9taWRkbGUgY2xhc3MgMCAtIGludGVyc2VjdGlvbiBjbGFzcyAxIGFuZCAyXHJcbiAgICAgICAgaWYgKHMwIDw9IGMwICYmIHMxID49IGMxICYmIHMyID49IGMyKSB7XHJcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzc1xyXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIHMwID4gY2MgKiBjMCkgcmV0dXJuIFwiY2VudGVyXCJcclxuICAgICAgICAgICAgaWYgKHdpdGhNaXhlZENsYXNzZXMpIHJldHVybiBcIm0xMlwiXHJcbiAgICAgICAgICAgIHJldHVybiBzMSA+IHMyID8gXCIxXCIgOiBcIjJcIlxyXG4gICAgICAgIH1cclxuICAgICAgICAvL21pZGRsZSBjbGFzcyAxIC0gaW50ZXJzZWN0aW9uIGNsYXNzIDAgYW5kIDFcclxuICAgICAgICBpZiAoczAgPj0gYzAgJiYgczEgPD0gYzEgJiYgczIgPj0gYzIpIHtcclxuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzXHJcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgczEgPiBjYyAqIGMxKSByZXR1cm4gXCJjZW50ZXJcIlxyXG4gICAgICAgICAgICBpZiAod2l0aE1peGVkQ2xhc3NlcykgcmV0dXJuIFwibTAyXCJcclxuICAgICAgICAgICAgcmV0dXJuIHMwID4gczIgPyBcIjBcIiA6IFwiMlwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vbWlkZGxlIGNsYXNzIDIgLSBpbnRlcnNlY3Rpb24gY2xhc3MgMCBhbmQgMVxyXG4gICAgICAgIGlmIChzMCA+PSBjMCAmJiBzMSA+PSBjMSAmJiBzMiA8PSBjMikge1xyXG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3NcclxuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiBzMiA+IGNjICogYzIpIHJldHVybiBcImNlbnRlclwiXHJcbiAgICAgICAgICAgIGlmICh3aXRoTWl4ZWRDbGFzc2VzKSByZXR1cm4gXCJtMDFcIlxyXG4gICAgICAgICAgICByZXR1cm4gczEgPiBzMCA/IFwiMVwiIDogXCIwXCJcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9zaG91bGQgbm90IGhhcHBlblxyXG4gICAgICAgIHJldHVybiBcInVua25vd25cIlxyXG4gICAgfVxyXG5cclxuICAgIC8vYXR0YWNoIGluZm9ybWF0aW9uIHRvIG91dHB1dCBmdW5jdGlvblxyXG4gICAgZnVuLmNlbnRlciA9IFtjMCwgYzEsIGMyXVxyXG4gICAgZnVuLmNlbnRlckNvZWZmaWNpZW50ID0gb3B0cy5jZW50ZXJDb2VmZmljaWVudFxyXG5cclxuICAgIHJldHVybiBmdW5cclxufVxyXG5cclxuXHJcblxyXG5leHBvcnQgY29uc3QgdGVybmFyeUNvbG9yQ2xhc3NpZmllciA9IChwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBjb2xvcnMsIG9wdHMgPSB7fSkgPT4ge1xyXG5cclxuICAgIC8vdGhlIHRocmVlIGNvbG9yc1xyXG4gICAgY29uc3QgW2NvbG9yMCwgY29sb3IxLCBjb2xvcjJdID0gY29sb3JzIHx8IFtcInJlZFwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiXVxyXG5cclxuICAgIC8vdGhlIGNvbG9yIGludGVycG9sYXRpb24gZnVuY3Rpb25cclxuICAgIGNvbnN0IGNvbG9ySW50ZXJwb2xhdGlvbiA9IG9wdHMuY29sb3JJbnRlcnBvbGF0aW9uIHx8IGludGVycG9sYXRlTGFiXHJcblxyXG4gICAgLy9wYXJhbWV0ZXIgdG8gZGVjaWRlIHdldGhlciB0byB1c2UgbWl4ZWQgY2xhc3Nlcy5cclxuICAgIGNvbnN0IHdpdGhNaXhlZENsYXNzZXMgPSBvcHRzLndpdGhNaXhlZENsYXNzZXMgIT0gdW5kZWZpbmVkID8gb3B0cy53aXRoTWl4ZWRDbGFzc2VzIDogdHJ1ZVxyXG4gICAgLy9odHRwczovL2QzanMub3JnL2QzLWludGVycG9sYXRlL2NvbG9yXHJcbiAgICBjb25zdCBtaXhDb2xvckZ1bmN0aW9uID0gKGNvbG9yMSwgY29sb3IyKSA9PiBjb2xvckludGVycG9sYXRpb24oY29sb3IxLCBjb2xvcjIpKDAuNSlcclxuICAgIC8vdGhlIGNvbG9ycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtaXhlZCBjbGFzc2VzXHJcbiAgICBjb25zdCBbbWl4Q29sb3IwLCBtaXhDb2xvcjEsIG1peENvbG9yMl0gPSBvcHRzLm1peGVkQ29sb3JzIHx8IHdpdGhNaXhlZENsYXNzZXMgPyBbbWl4Q29sb3JGdW5jdGlvbihjb2xvcjEsIGNvbG9yMiksIG1peENvbG9yRnVuY3Rpb24oY29sb3IwLCBjb2xvcjIpLCBtaXhDb2xvckZ1bmN0aW9uKGNvbG9yMCwgY29sb3IxKV0gOiBbXVxyXG5cclxuICAgIC8vdGhlIGNlbnRyYWwgY29sb3IsIHVzZWQgZm9yIHRoZSBjZW50cmFsIGNsYXNzLCBpZiBhbnkuIFRoZSBjZW50cmFsIGNsYXNzIGlzIHRoZSBjbGFzcyBvZiByZWxhdGl2ZWx5IGJhbGFuY2VkIHZhbHVlcywgYXJvdW5kIHRoZSBjZW50ZXIgcG9pbnRcclxuICAgIGNvbnN0IGNlbnRlckNvbG9yID0gb3B0cy5jZW50ZXJDb2xvciB8fCBjb2xvckludGVycG9sYXRpb24obWl4Q29sb3JGdW5jdGlvbihjb2xvcjAsIGNvbG9yMSksIGNvbG9yMikoMC4zMzMpXHJcblxyXG4gICAgLy9tYWtlIGNsYXNzaWZpZXJcclxuICAgIGNvbnN0IGNsYXNzaWZpZXIgPSB0ZXJuYXJ5Q2xhc3NpZmllcihwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBvcHRzKVxyXG5cclxuICAgIC8vdGhlIG91dHB1dCBjb2xvciBjbGFzc2lmaWVyIG1ldGhvZFxyXG4gICAgY29uc3QgZnVuID0gYyA9PiB7XHJcbiAgICAgICAgY29uc3QgY2xhID0gY2xhc3NpZmllcihjKVxyXG4gICAgICAgIGlmIChjbGEgPT0gXCIwXCIpIHJldHVybiBjb2xvcjBcclxuICAgICAgICBpZiAoY2xhID09IFwiMVwiKSByZXR1cm4gY29sb3IxXHJcbiAgICAgICAgaWYgKGNsYSA9PSBcIjJcIikgcmV0dXJuIGNvbG9yMlxyXG4gICAgICAgIGlmIChjbGEgPT0gXCJtMTJcIikgcmV0dXJuIG1peENvbG9yMFxyXG4gICAgICAgIGlmIChjbGEgPT0gXCJtMDJcIikgcmV0dXJuIG1peENvbG9yMVxyXG4gICAgICAgIGlmIChjbGEgPT0gXCJtMDFcIikgcmV0dXJuIG1peENvbG9yMlxyXG4gICAgICAgIGlmIChjbGEgPT0gXCJjZW50ZXJcIikgcmV0dXJuIGNlbnRlckNvbG9yXHJcbiAgICAgICAgcmV0dXJuIG9wdHMuZGVmYXVsdENvbG9yIHx8IFwiYmxhY2tcIlxyXG4gICAgfVxyXG4gICAgZnVuLmNlbnRlciA9IGNsYXNzaWZpZXIuY2VudGVyXHJcbiAgICBmdW4uY2VudGVyQ29lZmZpY2llbnQgPSBvcHRzLmNlbnRlckNvZWZmaWNpZW50XHJcbiAgICBmdW4uY29sb3JzID0gW2NvbG9yMCwgY29sb3IxLCBjb2xvcjJdXHJcbiAgICBmdW4ubWl4Q29sb3JzID0gW21peENvbG9yMCwgbWl4Q29sb3IxLCBtaXhDb2xvcjJdXHJcbiAgICBmdW4uY2VudGVyQ29sb3IgPSBjZW50ZXJDb2xvclxyXG4gICAgZnVuLmNsYXNzaWZpZXIgPSBjbGFzc2lmaWVyXHJcblxyXG4gICAgcmV0dXJuIGZ1blxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbi8qXHJcbmNvbnN0IG9yZGVyZWRJbmRleGVzRGVjID0gYXJyID0+IFsuLi5hcnIua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhcnJbYl0gLSBhcnJbYV0pO1xyXG5jb25zdCBvcmRlcmVkSW5kZXhlc0luYyA9IGFyciA9PiBbLi4uYXJyLmtleXMoKV0uc29ydCgoYSwgYikgPT4gYXJyW2FdIC0gYXJyW2JdKTtcclxuXHJcbmV4cG9ydCBjb25zdCB0ZXJuYXJ5Q2xhc3NpZmllciA9IChwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBvcHRzID0ge30pID0+IHtcclxuICAgIGNvbnN0IGxvd1RocmVzaG9sZCA9IG9wdHMubG93VGhyZXNob2xkIHx8IFsxIC8gMywgMSAvIDMsIDEgLyAzXVxyXG4gICAgY29uc3QgaGlnaFRocmVzaG9sZCA9IG9wdHMuaGlnaFRocmVzaG9sZCB8fCBbMiAvIDMsIDIgLyAzLCAyIC8gM11cclxuICAgIGNvbnN0IGNvbG9ycyA9IG9wdHMuY29sb3JzIHx8IFtcInJlZFwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiXVxyXG4gICAgY29uc3QgY29sb3JJbnRlcnBvbGF0aW9uID0gb3B0cy5jb2xvckludGVycG9sYXRpb24gfHwgaW50ZXJwb2xhdGVMYWJcclxuXHJcbiAgICAvL2h0dHBzOi8vZDNqcy5vcmcvZDMtaW50ZXJwb2xhdGUvY29sb3JcclxuICAgIGNvbnN0IG1pZGRsZUNvbG9yRnVuY3Rpb24gPSAoY29sb3IxLCBjb2xvcjIpID0+IGNvbG9ySW50ZXJwb2xhdGlvbihjb2xvcjEsIGNvbG9yMikoMC41KVxyXG4gICAgY29uc3QgbWlkZGxlQ29sb3JzID0gb3B0cy5taWRkbGVDb2xvcnMgfHwgW21pZGRsZUNvbG9yRnVuY3Rpb24oY29sb3JzWzFdLCBjb2xvcnNbMl0pLCBtaWRkbGVDb2xvckZ1bmN0aW9uKGNvbG9yc1swXSwgY29sb3JzWzJdKSwgbWlkZGxlQ29sb3JGdW5jdGlvbihjb2xvcnNbMF0sIGNvbG9yc1sxXSldXHJcbiAgICBjb25zdCBjZW50ZXJDb2xvciA9IG9wdHMuY2VudGVyQ29sb3IgfHwgY29sb3JJbnRlcnBvbGF0aW9uKG1pZGRsZUNvbG9yc1syXSwgY29sb3JzWzJdKSgwLjMzMylcclxuXHJcbiAgICBjb25zdCBoaWdoXyA9IG9yZGVyZWRJbmRleGVzRGVjKGhpZ2hUaHJlc2hvbGQpXHJcbiAgICBjb25zdCBsb3dfID0gb3JkZXJlZEluZGV4ZXNJbmMobG93VGhyZXNob2xkKVxyXG5cclxuICAgIGNvbnN0IHAwID0gcHJvcGVydGllc1swXSwgcDEgPSBwcm9wZXJ0aWVzWzFdLCBwMiA9IHByb3BlcnRpZXNbMl1cclxuICAgIGNvbnN0IGZ1biA9IGMgPT4ge1xyXG4gICAgICAgIC8vZ2V0IHRvdGFsXHJcbiAgICAgICAgY29uc3QgdG90ID0gdG90YWxGdW5jdGlvbihjKVxyXG4gICAgICAgIGlmICghdG90KSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgLy9jb21wdXRlIHNoYXJlc1xyXG4gICAgICAgIGNvbnN0IHNoYXJlcyA9IFsrY1twMF0gLyB0b3QsICtjW3AxXSAvIHRvdCwgK2NbcDJdIC8gdG90XVxyXG4gICAgICAgIC8vcmV0dXJuIGNvbG9yc1xyXG4gICAgICAgIC8vc3RhcnQgZmlyc3Qgd2l0aCB0aGUgZXh0cmVtZSBoaWdoICh0cmlhbmdsZXMpOiBmcm9tIHRoZSBsYXJnZXIgdmFsdWUgKHNtYWxsIHRyaWFuZ2xlKSB0byB0aGUgbG93ZXIgdmFsdWUgKGxhcmdlIHRyaWFuZ2xlKVxyXG4gICAgICAgIGZvciAobGV0IGkgb2YgaGlnaF8pIGlmIChzaGFyZXNbaV0gPiBoaWdoVGhyZXNob2xkW2ldKSByZXR1cm4gY29sb3JzW2ldXHJcbiAgICAgICAgLy90aGVuIGRyYXcgdGhlIGV4dHJlbWUgbG93ICh0cmFwZXppdW1zKTogZnJvbSB0aGUgbG93ZXIgdmFsdWUgKHNtYWxsIHRyYXBleml1bXMpIHRvIHRoZSBsYXJnZXIgdmFsdWVzIChsYXJnZSB0cmFwZXppdW0pXHJcbiAgICAgICAgZm9yIChsZXQgaSBvZiBsb3dfKSBpZiAoc2hhcmVzW2ldIDwgbG93VGhyZXNob2xkW2ldKSByZXR1cm4gbWlkZGxlQ29sb3JzW2ldXHJcbiAgICAgICAgLy9lbHNlIGNlbnRyYWwgY29sb3JcclxuICAgICAgICByZXR1cm4gY2VudGVyQ29sb3JcclxuICAgIH1cclxuICAgIGZ1bi5sb3dUaHJlc2hvbGQgPSBsb3dUaHJlc2hvbGRcclxuICAgIGZ1bi5oaWdoVGhyZXNob2xkID0gaGlnaFRocmVzaG9sZFxyXG4gICAgZnVuLmNvbG9ycyA9IGNvbG9yc1xyXG4gICAgZnVuLm1pZGRsZUNvbG9ycyA9IG1pZGRsZUNvbG9yc1xyXG4gICAgZnVuLmNlbnRlckNvbG9yID0gY2VudGVyQ29sb3JcclxuICAgIGZ1bi5sb3dJbmRleCA9IGxvd19cclxuICAgIGZ1bi5oaWdoSW5kZXggPSBoaWdoX1xyXG4gICAgcmV0dXJuIGZ1blxyXG59XHJcbiovXHJcblxyXG4vKlxyXG5leHBvcnQgY29uc3QgdGVybmFyeUNsYXNzaWZpZXIzID0gKHByb3BlcnRpZXMsIHRvdGFsRnVuY3Rpb24sIG9wdHMgPSB7fSkgPT4ge1xyXG4gICAgY29uc3QgW2EwMSwgYTEyLCBhMjBdID0gb3B0cy50aHJlc2hvbGRzIHx8IFsxLzMsIDEvMywgMS8zXVxyXG4gICAgY29uc3QgW2MwLCBjMSwgYzJdID0gb3B0cy5jb2xvcnMgfHwgW1wicmVkXCIsIFwiZ3JlZW5cIiwgXCJibHVlXCJdXHJcbiAgICBjb25zdCBjZW50ZXJDb2xvciA9IG9wdHMuY2VudGVyQ29sb3IgfHwgXCJncmF5XCJcclxuXHJcbiAgICBjb25zdCBmZmYgPSBhID0+IGEgPT0gMSA/IEluZmluaXR5IDogYSAvICgxIC0gYSlcclxuICAgIGNvbnN0IGMwMSA9IGZmZihhMDEpLCBjMTIgPSBmZmYoYTEyKSwgYzIwID0gZmZmKGEyMClcclxuXHJcbiAgICBjb25zdCBwMCA9IHByb3BlcnRpZXNbMF0sIHAxID0gcHJvcGVydGllc1sxXSwgcDIgPSBwcm9wZXJ0aWVzWzJdXHJcbiAgICBjb25zdCBmdW4gPSBjID0+IHtcclxuICAgICAgICAvL2dldCB0b3RhbFxyXG4gICAgICAgIGNvbnN0IHRvdCA9IHRvdGFsRnVuY3Rpb24oYylcclxuICAgICAgICBpZiAoIXRvdCkgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgIC8vY29tcHV0ZSBzaGFyZXNcclxuICAgICAgICBjb25zdCBbczAsIHMxLCBzMl0gPSBbK2NbcDBdIC8gdG90LCArY1twMV0gLyB0b3QsICtjW3AyXSAvIHRvdF1cclxuICAgICAgICAvL3JldHVybiBjb2xvcnNcclxuICAgICAgICBpZiAoczAgKiBjMDEgPiBzMSAmJiBzMCA+IHMyICogYzIwKSByZXR1cm4gYzBcclxuICAgICAgICBlbHNlIGlmIChzMSA+IHMwICogYzAxICYmIHMxICogYzEyID4gczIpIHJldHVybiBjMVxyXG4gICAgICAgIGVsc2UgaWYgKHMyICogYzIwID4gczAgJiYgczIgPiBzMSAqIGMxMikgcmV0dXJuIGMyXHJcbiAgICAgICAgZWxzZSByZXR1cm4gY2VudGVyQ29sb3JcclxuICAgIH1cclxuICAgIGZ1bi5jb2xvcnMgPSBbYzAsIGMxLCBjMl1cclxuICAgIGZ1bi5jZW50ZXJDb2xvciA9IGNlbnRlckNvbG9yXHJcbiAgICByZXR1cm4gZnVuXHJcbn1cclxuKi9cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKipcclxuICogR2V0IHRoZSBjbGFzcyBpZCBmcm9tIGEgdmFsdWUgYW5kIGNsYXNzIGJyZWFrIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdiB0aGUgdmFsdWVcclxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYnJlYWtzIHRoZSBicmVha3NcclxuICogQHJldHVybnMgVGhlIGNsYXNzIGlkLCBmcm9tIDAgdG8gYnJlYWtzLmxlbmd0aFxyXG4gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0Q2xhc3NpZmllciBpbnN0ZWFkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xhc3ModiwgYnJlYWtzKSB7XHJcbiAgICBpZiAoIWJyZWFrcykgcmV0dXJuXHJcbiAgICBpZiAoYnJlYWtzLmxlbmd0aCA9PSAwKSByZXR1cm4gMFxyXG4gICAgaWYgKHYgPD0gYnJlYWtzWzBdKSByZXR1cm4gMFxyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBicmVha3MubGVuZ3RoOyBpKyspIGlmIChicmVha3NbaSAtIDFdIDwgdiAmJiB2IDw9IGJyZWFrc1tpXSkgcmV0dXJuIGlcclxuICAgIHJldHVybiBicmVha3MubGVuZ3RoXHJcbn1cclxuXHJcblxyXG5cclxuLy90YWtlICduaWNlJyB2YWx1ZSAocG93ZXIgb2YgdGVuLCBvciBtdWx0aXBsZSlcclxuZXhwb3J0IGZ1bmN0aW9uIG5pY2UodiwgbXVsdGlwbGVzID0gWzgsIDYsIDUsIDQsIDIuNSwgMl0pIHtcclxuICAgIC8vY29tcHV0ZSBiaWdnZXIgcG93ZXIgb2YgdGVuIGJlbG93XHJcbiAgICBjb25zdCB2XyA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nMTAodikpKVxyXG4gICAgZm9yIChsZXQgbXVsdGlwbGUgb2YgbXVsdGlwbGVzKVxyXG4gICAgICAgIGlmICh2XyAqIG11bHRpcGxlIDw9IHYpIHJldHVybiB2XyAqIG11bHRpcGxlXHJcbiAgICByZXR1cm4gdl9cclxufVxyXG5cclxuXHJcbi8qXHJcbi8vbm8gbG9uZ2VyIHVzZWRcclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRJbWFnZShzcmMpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsgcmVzb2x2ZShpbWcpOyB9O1xyXG4gICAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZWplY3QobmV3IEVycm9yKCdFcnJvciBsb2FkaW5nIGltYWdlJykpOyB9O1xyXG4gICAgICAgIGltZy5zcmMgPSBzcmM7XHJcbiAgICB9KTtcclxufVxyXG4qL1xyXG5cclxuXHJcbi8qXHJcbmV4cG9ydCBsZXQgbW9uaXRvciA9IGZhbHNlXHJcblxyXG5sZXQgcHJldmlvdXNEYXRlXHJcbmV4cG9ydCBmdW5jdGlvbiBtb25pdG9yRHVyYXRpb24obWVzc2FnZSkge1xyXG4gICAgY29uc3Qgbm93RGF0ZSA9IERhdGUubm93KClcclxuXHJcbiAgICAvL2ZpcnN0IGNhbGxcclxuICAgIGlmICghcHJldmlvdXNEYXRlKSB7XHJcbiAgICAgICAgcHJldmlvdXNEYXRlID0gbm93RGF0ZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKHByZXZpb3VzRGF0ZSwgbWVzc2FnZSlcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkID0gbm93RGF0ZSAtIHByZXZpb3VzRGF0ZVxyXG4gICAgcHJldmlvdXNEYXRlID0gbm93RGF0ZVxyXG4gICAgY29uc29sZS5sb2coZCwgbWVzc2FnZSlcclxufVxyXG4qL1xyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gd2lkdGhcclxuICogQHBhcmFtIHtzdHJpbmd9IGhlaWdodFxyXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gKiBAcmV0dXJucyB7e2NhbnZhczpIVE1MQ2FudmFzRWxlbWVudCwgZ2w6V2ViR0xSZW5kZXJpbmdDb250ZXh0fX1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYWtlV2ViR0xDYW52YXMod2lkdGgsIGhlaWdodCwgb3B0cz17fSkge1xyXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcclxuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgd2lkdGgpXHJcbiAgICBjYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBoZWlnaHQpXHJcbiAgICAvKiogQHR5cGUge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gKi9cclxuICAgIGNvbnN0IGdsID0gY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgb3B0cylcclxuICAgIGlmICghZ2wpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBpbml0aWFsaXplIFdlYkdMLiBZb3VyIGJyb3dzZXIgb3IgbWFjaGluZSBtYXkgbm90IHN1cHBvcnQgaXQuJylcclxuICAgIH1cclxuICAgIHJldHVybiB7IGNhbnZhczogY2FudmFzLCBnbDogZ2wgfVxyXG59XHJcblxyXG4vKipcclxuICogSW5pdGlhbGl6ZSBhIHNoYWRlciBwcm9ncmFtLCBzbyBXZWJHTCBrbm93cyBob3cgdG8gZHJhdyBvdXIgZGF0YVxyXG4gKlxyXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2xcclxuICogQHBhcmFtICB7Li4uV2ViR0xTaGFkZXJ9IHNoYWRlcnNcclxuICogQHJldHVybnMge1dlYkdMUHJvZ3JhbX1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0U2hhZGVyUHJvZ3JhbShnbCwgLi4uc2hhZGVycykge1xyXG4gICAgLyoqIEB0eXBlIHtXZWJHTFByb2dyYW18bnVsbH0gKi9cclxuICAgIGNvbnN0IHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKClcclxuICAgIGlmIChwcm9ncmFtID09IG51bGwpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSB3ZWJHTCBwcm9ncmFtJylcclxuICAgIGZvciAoY29uc3Qgc2hhZGVyIG9mIHNoYWRlcnMpIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBzaGFkZXIpXHJcbiAgICBnbC5saW5rUHJvZ3JhbShwcm9ncmFtKVxyXG4gICAgaWYgKGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpKSByZXR1cm4gcHJvZ3JhbVxyXG4gICAgdGhyb3cgbmV3IEVycm9yKGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pIHx8ICdDYW5ub3QgY3JlYXRlIHdlYkdMIHByb2dyYW0gKDIpJylcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBzaGFkZXIgb2YgdGhlIGdpdmVuIHR5cGUsIHVwbG9hZHMgdGhlIHNvdXJjZSBhbmQgY29tcGlsZXMgaXQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxyXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZVxyXG4gKiBAcGFyYW0gIHsuLi5zdHJpbmd9IHNvdXJjZXNcclxuICogQHJldHVybnMge1dlYkdMU2hhZGVyfVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNoYWRlcihnbCwgdHlwZSwgLi4uc291cmNlcykge1xyXG4gICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcnxudWxsfSAqL1xyXG4gICAgY29uc3Qgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHR5cGUpXHJcbiAgICBpZiAoc2hhZGVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSB3ZWJHTCBzaGFkZXInKVxyXG4gICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlcy5qb2luKCdcXG4nKSlcclxuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKVxyXG4gICAgaWYgKGdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkgcmV0dXJuIHNoYWRlclxyXG4gICAgdGhyb3cgbmV3IEVycm9yKGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKSB8fCAnQ2Fubm90IGNyZWF0ZSB3ZWJHTCBzaGFkZXIgKDIpJylcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHdlYkdMIGlzIHN1cHBvcnRlZFxyXG4gKlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGVja1dlYkdMU3VwcG9ydCgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcclxuICAgICAgICByZXR1cm4gISEoISF3aW5kb3cuV2ViR0xSZW5kZXJpbmdDb250ZXh0ICYmXHJcbiAgICAgICAgICAgIChjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnKSB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJykpKVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbn1cclxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8vIHRoZSBhcHBsaWNhdGlvblxyXG5leHBvcnQgeyBNYXAgfSBmcm9tICcuL2NvcmUvTWFwLmpzJ1xyXG5leHBvcnQgeyBHZW9DYW52YXMgfSBmcm9tICcuL2NvcmUvR2VvQ2FudmFzLmpzJ1xyXG5leHBvcnQgeyBTdHlsZSB9IGZyb20gJy4vY29yZS9TdHlsZS5qcydcclxuZXhwb3J0IHsgTGF5ZXIgfSBmcm9tICcuL2NvcmUvTGF5ZXIuanMnXHJcbmV4cG9ydCB7IERhdGFzZXQgfSBmcm9tICcuL2NvcmUvRGF0YXNldC5qcydcclxuZXhwb3J0IHsgTXVsdGlSZXNvbHV0aW9uRGF0YXNldCB9IGZyb20gJy4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0LmpzJ1xyXG5cclxuLy8gZXhwb3J0IGRhdGFzZXQgdHlwZXNcclxuZXhwb3J0IHsgVGlsZWRHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L1RpbGVkR3JpZC5qcydcclxuZXhwb3J0IHsgQ1NWR3JpZCB9IGZyb20gJy4vZGF0YXNldC9DU1ZHcmlkLmpzJ1xyXG5leHBvcnQgeyBKU0dyaWQgfSBmcm9tICcuL2RhdGFzZXQvSlNHcmlkLmpzJ1xyXG5cclxuLy8gZXhwb3J0IHN0eWxlc1xyXG5leHBvcnQgeyBTaGFwZUNvbG9yU2l6ZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaGFwZUNvbG9yU2l6ZVN0eWxlLmpzJ1xyXG5leHBvcnQgeyBTdHJva2VTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3Ryb2tlU3R5bGUuanMnXHJcbmV4cG9ydCB7IEpveVBsb3RTdHlsZSB9IGZyb20gJy4vc3R5bGUvSm95UGxvdFN0eWxlLmpzJ1xyXG5leHBvcnQgeyBDb21wb3NpdGlvblN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Db21wb3NpdGlvblN0eWxlLmpzJ1xyXG5leHBvcnQgeyBTZWdtZW50U3R5bGUgfSBmcm9tICcuL3N0eWxlL1NlZ21lbnRTdHlsZS5qcydcclxuZXhwb3J0IHsgVGV4dFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9UZXh0U3R5bGUuanMnXHJcbmV4cG9ydCB7IFBpbGxhclN0eWxlIH0gZnJvbSAnLi9zdHlsZS9QaWxsYXJTdHlsZS5qcydcclxuZXhwb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaWRlU3R5bGUuanMnXHJcbi8vZXhwb3J0IHsgQ29udG91clN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Db250b3VyU3R5bGUuanMnXHJcbmV4cG9ydCB7IFNpZGVDYXRlZ29yeVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaWRlQ2F0ZWdvcnlTdHlsZS5qcydcclxuZXhwb3J0IHsgRG90RGVuc2l0eVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Eb3REZW5zaXR5U3R5bGUuanMnXHJcbmV4cG9ydCB7IFRhbmFrYVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9UYW5ha2FTdHlsZS5qcydcclxuZXhwb3J0IHsgTGVnb1N0eWxlIH0gZnJvbSAnLi9zdHlsZS9MZWdvU3R5bGUuanMnXHJcbmV4cG9ydCB7IFNxdWFyZUNvbG9yV2ViR0xTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3F1YXJlQ29sb3JXZWJHTFN0eWxlLmpzJ1xyXG5leHBvcnQgeyBTcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUuanMnXHJcbmV4cG9ydCB7IE1vc2FpY1N0eWxlIH0gZnJvbSAnLi9zdHlsZS9Nb3NhaWNTdHlsZS5qcydcclxuZXhwb3J0IHsgTmluamFTdGFyU3R5bGUgfSBmcm9tICcuL3N0eWxlL05pbmphU3RhclN0eWxlLmpzJ1xyXG5leHBvcnQgeyBUaW1lU2VyaWVzU3R5bGUgfSBmcm9tICcuL3N0eWxlL1RpbWVTZXJpZXNTdHlsZS5qcydcclxuZXhwb3J0IHsgSXNvRmVuY2VTdHlsZSB9IGZyb20gJy4vc3R5bGUvSXNvRmVuY2VTdHlsZS5qcydcclxuZXhwb3J0IHsgSW1hZ2VTdHlsZSB9IGZyb20gJy4vc3R5bGUvSW1hZ2VTdHlsZS5qcydcclxuXHJcbi8vIGV4cG9ydCBhZGRpdGlvbmFsIGxheWVyc1xyXG5leHBvcnQgeyBHcmlkTGF5ZXIgfSBmcm9tICcuL2xheWVyL0dyaWRMYXllci5qcydcclxuZXhwb3J0IHsgQmFja2dyb3VuZExheWVyIH0gZnJvbSAnLi9sYXllci9CYWNrZ3JvdW5kTGF5ZXIuanMnXHJcbmV4cG9ydCB7IEJhY2tncm91bmRMYXllcldNUyB9IGZyb20gJy4vbGF5ZXIvQmFja2dyb3VuZExheWVyV01TLmpzJ1xyXG5leHBvcnQgeyBCYWNrZ3JvdW5kTGF5ZXJJbWFnZSB9IGZyb20gJy4vbGF5ZXIvQmFja2dyb3VuZExheWVySW1hZ2UuanMnXHJcbmV4cG9ydCB7IExhYmVsTGF5ZXIgfSBmcm9tICcuL2xheWVyL0xhYmVsTGF5ZXIuanMnXHJcbmV4cG9ydCB7IEdlb0pTT05MYXllciB9IGZyb20gJy4vbGF5ZXIvR2VvSlNPTkxheWVyLmpzJ1xyXG5cclxuLy8gZXhwb3J0IGxlZ2VuZHNcclxuZXhwb3J0IHsgQ29sb3JMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9Db2xvckxlZ2VuZC5qcydcclxuZXhwb3J0IHsgQ29sb3JEaXNjcmV0ZUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yRGlzY3JldGVMZWdlbmQuanMnXHJcbmV4cG9ydCB7IENvbG9yQ2F0ZWdvcnlMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9Db2xvckNhdGVnb3J5TGVnZW5kLmpzJ1xyXG5leHBvcnQgeyBTaXplTGVnZW5kLCBzaXplTGVnZW5kLCBzaXplTGVnZW5kVmlld1NjYWxlLCBzaXplRGlzY3JldGVMZWdlbmQsIHNpemVEaXNjcmV0ZVZpZXdTY2FsZUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL1NpemVMZWdlbmQuanMnXHJcbmV4cG9ydCB7IE9yaWVudGF0aW9uTGVnZW5kLCBvcmllbnRhdGlvbkxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL09yaWVudGF0aW9uTGVnZW5kLmpzJ1xyXG5leHBvcnQgeyBUZXJuYXJ5TGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvVGVybmFyeUxlZ2VuZC5qcydcclxuXHJcbi8vIGV4cG9ydCB7IGdvVG9TdHJhaWdodCwgem9vbVRvIH0gZnJvbSBcIi4vdXRpbHMvem9vbVV0aWxzXCJcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zdHJldGNoaW5nLmpzJ1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3NjYWxlLmpzJ1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3Rlcm5hcnkuanMnXHJcbmV4cG9ydCB7IG5pY2UgfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xyXG5cclxuaW1wb3J0IHsgR2VvQ2FudmFzIH0gZnJvbSAnLi9jb3JlL0dlb0NhbnZhcy5qcydcclxuZXhwb3J0IGNvbnN0IGdldFBhcmFtZXRlckJ5TmFtZSA9IEdlb0NhbnZhcy5nZXRQYXJhbWV0ZXJCeU5hbWVcclxuXHJcbi8vIHNldCBkZWZhdWx0IGQzIGxvY2FsZVxyXG5pbXBvcnQgeyBmb3JtYXREZWZhdWx0TG9jYWxlIH0gZnJvbSAnZDMtZm9ybWF0J1xyXG5mb3JtYXREZWZhdWx0TG9jYWxlKHtcclxuICAgIGRlY2ltYWw6ICcuJyxcclxuICAgIHRob3VzYW5kczogJyAnLFxyXG4gICAgZ3JvdXBpbmc6IFszXSxcclxuICAgIGN1cnJlbmN5OiBbJycsICfigqwnXSxcclxufSlcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUF5QixJQUFJO0FBQzdCLHdDQUF3QyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7QUFDMUQsd0NBQXdDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUMxRCwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSx3Q0FBd0MsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQzFELDBDQUEwQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJOztBQUVuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxlQUFlLFlBQVksU0FBUztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3hIb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTywwQkFBMEIsOENBQU07QUFDdkM7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQzVDO0FBQ0E7QUFDb0U7QUFDaEI7QUFDRTtBQUNRO0FBQ1I7QUFDTjtBQUNJO0FBQ0o7QUFDaEQsV0FBVyxlQUFlO0FBQ3NDO0FBQ0o7QUFDUjtBQUNKO0FBQ3dCO0FBQ2dCO0FBQ3BDO0FBQ007QUFDRTtBQUNKO0FBQ047QUFDbEQ7QUFDQTtBQUNnRDtBQUNZO0FBQ007QUFDSTtBQUNwQjtBQUNJO0FBQ3REO0FBQ0E7QUFDcUQ7QUFDZ0I7QUFDQTtBQUNnRTtBQUNqRDtBQUMzQjtBQUN6RDtBQUNBLFlBQVksdUJBQXVCO0FBQ0U7QUFDTDtBQUNFO0FBQ0s7QUFDdkM7QUFDQSxDQUErQztBQUN4QywyQkFBMkIseURBQVM7QUFDM0M7QUFDQTtBQUNBLENBQStDO0FBQy9DLHNEQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkdml6L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9hc2NlbmRpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYmlzZWN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2Jpc2VjdG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2Rlc2NlbmRpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvZXh0ZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2dyZWF0ZXN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21heC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXhJbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9taW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWluSW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbnVtYmVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3Blcm11dGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVhbnRpbGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVpY2tzZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvc29ydC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9jb2xvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvbGFiLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL21hdGguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kaXNwYXRjaC9zcmMvZGlzcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9ub2RyYWcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9ub2V2ZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZHN2L3NyYy9jc3YuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kc3Yvc3JjL2Rzdi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvdHN2LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY3ViaWMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvZHN2LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL2pzb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvdGV4dC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZGVmYXVsdExvY2FsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZXhwb25lbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdERlY2ltYWwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdEdyb3VwLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXROdW1lcmFscy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0UHJlZml4QXV0by5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0Um91bmRlZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0U3BlY2lmaWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRUcmltLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRUeXBlcy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2xvY2FsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpcy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpc0Nsb3NlZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb2xvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9sYWIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3JnYi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2RlY29tcG9zZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL3BhcnNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3pvb20uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1yYW5kb20vc3JjL2RlZmF1bHRTb3VyY2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1yYW5kb20vc3JjL25vcm1hbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9pbml0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3F1YW50aWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9hcnJheS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NyZWF0b3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL21hdGNoZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlcy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvcG9pbnRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXBwZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXR0ci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NhbGwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jbGFzc2VkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xvbmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kYXRhLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGF0dW0uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kaXNwYXRjaC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VhY2guanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbXB0eS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VudGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZXhpdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2h0bWwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2luc2VydC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2l0ZXJhdG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vam9pbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2xvd2VyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2RlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29yZGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yYWlzZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JlbW92ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdEFsbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGRyZW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zaXplLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc29ydC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NwYXJzZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vdGV4dC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zb3VyY2VFdmVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvd2luZG93LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVvdXQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9hY3RpdmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2ludGVycnVwdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbnRlcnJ1cHQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vdHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0ci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0clR3ZWVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kZWxheS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZHVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2VWYXJ5aW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2ludGVycG9sYXRlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9tZXJnZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3JlbW92ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2NoZWR1bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0QWxsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zdHlsZVR3ZWVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3R3ZWVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9ldmVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvbm9ldmVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3pvb20uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9idXR0b24vQnV0dG9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvYnV0dG9uL0Z1bGxzY3JlZW5CdXR0b24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9idXR0b24vWm9vbUJ1dHRvbnMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL0RhdGFzZXQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL0RyYXdhYmxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9HZW9DYW52YXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL0xheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9MZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL01hcC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvTXVsdGlSZXNvbHV0aW9uRGF0YXNldC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL1Rvb2x0aXAuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9kYXRhc2V0L0NTVkdyaWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9kYXRhc2V0L0pTR3JpZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2RhdGFzZXQvVGlsZWRHcmlkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvQmFja2dyb3VuZExheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvQmFja2dyb3VuZExheWVySW1hZ2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9CYWNrZ3JvdW5kTGF5ZXJXTVMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9HZW9KU09OTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9HcmlkTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9MYWJlbExheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL0NvbG9yQ2F0ZWdvcnlMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvQ29sb3JEaXNjcmV0ZUxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9Db2xvckxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9PcmllbnRhdGlvbkxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9TaXplTGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL1Rlcm5hcnlMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9Db21wb3NpdGlvblN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvRG90RGVuc2l0eVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvSW1hZ2VTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0lzb0ZlbmNlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9Kb3lQbG90U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9MZWdvU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9Nb3NhaWNTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL05pbmphU3RhclN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvUGlsbGFyU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TZWdtZW50U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TaGFwZUNvbG9yU2l6ZVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU2lkZUNhdGVnb3J5U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TaWRlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1NxdWFyZUNvbG9yV2ViR0xTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1N0cm9rZVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvVGFuYWthU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9UZXh0U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9UaW1lU2VyaWVzU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvc2NhbGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy9zdHJldGNoaW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvdGVybmFyeS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL3V0aWxzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvd2ViR0xVdGlscy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2dyaWR2aXovd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2dyaWR2aXovd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9ncmlkdml6L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJncmlkdml6XCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImdyaWR2aXpcIl0gPSBmYWN0b3J5KCk7XG59KShzZWxmLCAoKSA9PiB7XG5yZXR1cm4gIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPT0gbnVsbCB8fCBiID09IG51bGwgPyBOYU4gOiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nLmpzXCI7XG5pbXBvcnQgYmlzZWN0b3IgZnJvbSBcIi4vYmlzZWN0b3IuanNcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbmNvbnN0IGFzY2VuZGluZ0Jpc2VjdCA9IGJpc2VjdG9yKGFzY2VuZGluZyk7XG5leHBvcnQgY29uc3QgYmlzZWN0UmlnaHQgPSBhc2NlbmRpbmdCaXNlY3QucmlnaHQ7XG5leHBvcnQgY29uc3QgYmlzZWN0TGVmdCA9IGFzY2VuZGluZ0Jpc2VjdC5sZWZ0O1xuZXhwb3J0IGNvbnN0IGJpc2VjdENlbnRlciA9IGJpc2VjdG9yKG51bWJlcikuY2VudGVyO1xuZXhwb3J0IGRlZmF1bHQgYmlzZWN0UmlnaHQ7XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuaW1wb3J0IGRlc2NlbmRpbmcgZnJvbSBcIi4vZGVzY2VuZGluZy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBiaXNlY3RvcihmKSB7XG4gIGxldCBjb21wYXJlMSwgY29tcGFyZTIsIGRlbHRhO1xuXG4gIC8vIElmIGFuIGFjY2Vzc29yIGlzIHNwZWNpZmllZCwgcHJvbW90ZSBpdCB0byBhIGNvbXBhcmF0b3IuIEluIHRoaXMgY2FzZSB3ZVxuICAvLyBjYW4gdGVzdCB3aGV0aGVyIHRoZSBzZWFyY2ggdmFsdWUgaXMgKHNlbGYtKSBjb21wYXJhYmxlLiBXZSBjYW7igJl0IGRvIHRoaXNcbiAgLy8gZm9yIGEgY29tcGFyYXRvciAoZXhjZXB0IGZvciBzcGVjaWZpYywga25vd24gY29tcGFyYXRvcnMpIGJlY2F1c2Ugd2UgY2Fu4oCZdFxuICAvLyB0ZWxsIGlmIHRoZSBjb21wYXJhdG9yIGlzIHN5bW1ldHJpYywgYW5kIGFuIGFzeW1tZXRyaWMgY29tcGFyYXRvciBjYW7igJl0IGJlXG4gIC8vIHVzZWQgdG8gdGVzdCB3aGV0aGVyIGEgc2luZ2xlIHZhbHVlIGlzIGNvbXBhcmFibGUuXG4gIGlmIChmLmxlbmd0aCAhPT0gMikge1xuICAgIGNvbXBhcmUxID0gYXNjZW5kaW5nO1xuICAgIGNvbXBhcmUyID0gKGQsIHgpID0+IGFzY2VuZGluZyhmKGQpLCB4KTtcbiAgICBkZWx0YSA9IChkLCB4KSA9PiBmKGQpIC0geDtcbiAgfSBlbHNlIHtcbiAgICBjb21wYXJlMSA9IGYgPT09IGFzY2VuZGluZyB8fCBmID09PSBkZXNjZW5kaW5nID8gZiA6IHplcm87XG4gICAgY29tcGFyZTIgPSBmO1xuICAgIGRlbHRhID0gZjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlZnQoYSwgeCwgbG8gPSAwLCBoaSA9IGEubGVuZ3RoKSB7XG4gICAgaWYgKGxvIDwgaGkpIHtcbiAgICAgIGlmIChjb21wYXJlMSh4LCB4KSAhPT0gMCkgcmV0dXJuIGhpO1xuICAgICAgZG8ge1xuICAgICAgICBjb25zdCBtaWQgPSAobG8gKyBoaSkgPj4+IDE7XG4gICAgICAgIGlmIChjb21wYXJlMihhW21pZF0sIHgpIDwgMCkgbG8gPSBtaWQgKyAxO1xuICAgICAgICBlbHNlIGhpID0gbWlkO1xuICAgICAgfSB3aGlsZSAobG8gPCBoaSk7XG4gICAgfVxuICAgIHJldHVybiBsbztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJpZ2h0KGEsIHgsIGxvID0gMCwgaGkgPSBhLmxlbmd0aCkge1xuICAgIGlmIChsbyA8IGhpKSB7XG4gICAgICBpZiAoY29tcGFyZTEoeCwgeCkgIT09IDApIHJldHVybiBoaTtcbiAgICAgIGRvIHtcbiAgICAgICAgY29uc3QgbWlkID0gKGxvICsgaGkpID4+PiAxO1xuICAgICAgICBpZiAoY29tcGFyZTIoYVttaWRdLCB4KSA8PSAwKSBsbyA9IG1pZCArIDE7XG4gICAgICAgIGVsc2UgaGkgPSBtaWQ7XG4gICAgICB9IHdoaWxlIChsbyA8IGhpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvO1xuICB9XG5cbiAgZnVuY3Rpb24gY2VudGVyKGEsIHgsIGxvID0gMCwgaGkgPSBhLmxlbmd0aCkge1xuICAgIGNvbnN0IGkgPSBsZWZ0KGEsIHgsIGxvLCBoaSAtIDEpO1xuICAgIHJldHVybiBpID4gbG8gJiYgZGVsdGEoYVtpIC0gMV0sIHgpID4gLWRlbHRhKGFbaV0sIHgpID8gaSAtIDEgOiBpO1xuICB9XG5cbiAgcmV0dXJuIHtsZWZ0LCBjZW50ZXIsIHJpZ2h0fTtcbn1cblxuZnVuY3Rpb24gemVybygpIHtcbiAgcmV0dXJuIDA7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPT0gbnVsbCB8fCBiID09IG51bGwgPyBOYU5cbiAgICA6IGIgPCBhID8gLTFcbiAgICA6IGIgPiBhID8gMVxuICAgIDogYiA+PSBhID8gMFxuICAgIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXh0ZW50KHZhbHVlcywgdmFsdWVvZikge1xuICBsZXQgbWluO1xuICBsZXQgbWF4O1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChtaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh2YWx1ZSA+PSB2YWx1ZSkgbWluID0gbWF4ID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG1pbiA+IHZhbHVlKSBtaW4gPSB2YWx1ZTtcbiAgICAgICAgICBpZiAobWF4IDwgdmFsdWUpIG1heCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGwpIHtcbiAgICAgICAgaWYgKG1pbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID49IHZhbHVlKSBtaW4gPSBtYXggPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAobWluID4gdmFsdWUpIG1pbiA9IHZhbHVlO1xuICAgICAgICAgIGlmIChtYXggPCB2YWx1ZSkgbWF4ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFttaW4sIG1heF07XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBncmVhdGVzdCh2YWx1ZXMsIGNvbXBhcmUgPSBhc2NlbmRpbmcpIHtcbiAgbGV0IG1heDtcbiAgbGV0IGRlZmluZWQgPSBmYWxzZTtcbiAgaWYgKGNvbXBhcmUubGVuZ3RoID09PSAxKSB7XG4gICAgbGV0IG1heFZhbHVlO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB2YWx1ZXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29tcGFyZShlbGVtZW50KTtcbiAgICAgIGlmIChkZWZpbmVkXG4gICAgICAgICAgPyBhc2NlbmRpbmcodmFsdWUsIG1heFZhbHVlKSA+IDBcbiAgICAgICAgICA6IGFzY2VuZGluZyh2YWx1ZSwgdmFsdWUpID09PSAwKSB7XG4gICAgICAgIG1heCA9IGVsZW1lbnQ7XG4gICAgICAgIG1heFZhbHVlID0gdmFsdWU7XG4gICAgICAgIGRlZmluZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKGRlZmluZWRcbiAgICAgICAgICA/IGNvbXBhcmUodmFsdWUsIG1heCkgPiAwXG4gICAgICAgICAgOiBjb21wYXJlKHZhbHVlLCB2YWx1ZSkgPT09IDApIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICAgIGRlZmluZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWF4O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWF4KHZhbHVlcywgdmFsdWVvZikge1xuICBsZXQgbWF4O1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1heCA8IHZhbHVlIHx8IChtYXggPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1heCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1heCA8IHZhbHVlIHx8IChtYXggPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1heCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWF4O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWF4SW5kZXgodmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtYXg7XG4gIGxldCBtYXhJbmRleCA9IC0xO1xuICBsZXQgaW5kZXggPSAtMTtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICArK2luZGV4O1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWUsIG1heEluZGV4ID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWUsIG1heEluZGV4ID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXhJbmRleDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1pbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1pbjtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1pbkluZGV4KHZhbHVlcywgdmFsdWVvZikge1xuICBsZXQgbWluO1xuICBsZXQgbWluSW5kZXggPSAtMTtcbiAgbGV0IGluZGV4ID0gLTE7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgKytpbmRleDtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1pbiA+IHZhbHVlIHx8IChtaW4gPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1pbiA9IHZhbHVlLCBtaW5JbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1pbiA+IHZhbHVlIHx8IChtaW4gPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1pbiA9IHZhbHVlLCBtaW5JbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWluSW5kZXg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBudW1iZXIoeCkge1xuICByZXR1cm4geCA9PT0gbnVsbCA/IE5hTiA6ICt4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24qIG51bWJlcnModmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkge1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBlcm11dGUoc291cmNlLCBrZXlzKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGtleXMsIGtleSA9PiBzb3VyY2Vba2V5XSk7XG59XG4iLCJpbXBvcnQgbWF4IGZyb20gXCIuL21heC5qc1wiO1xuaW1wb3J0IG1heEluZGV4IGZyb20gXCIuL21heEluZGV4LmpzXCI7XG5pbXBvcnQgbWluIGZyb20gXCIuL21pbi5qc1wiO1xuaW1wb3J0IG1pbkluZGV4IGZyb20gXCIuL21pbkluZGV4LmpzXCI7XG5pbXBvcnQgcXVpY2tzZWxlY3QgZnJvbSBcIi4vcXVpY2tzZWxlY3QuanNcIjtcbmltcG9ydCBudW1iZXIsIHtudW1iZXJzfSBmcm9tIFwiLi9udW1iZXIuanNcIjtcbmltcG9ydCB7YXNjZW5kaW5nRGVmaW5lZH0gZnJvbSBcIi4vc29ydC5qc1wiO1xuaW1wb3J0IGdyZWF0ZXN0IGZyb20gXCIuL2dyZWF0ZXN0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHF1YW50aWxlKHZhbHVlcywgcCwgdmFsdWVvZikge1xuICB2YWx1ZXMgPSBGbG9hdDY0QXJyYXkuZnJvbShudW1iZXJzKHZhbHVlcywgdmFsdWVvZikpO1xuICBpZiAoIShuID0gdmFsdWVzLmxlbmd0aCkgfHwgaXNOYU4ocCA9ICtwKSkgcmV0dXJuO1xuICBpZiAocCA8PSAwIHx8IG4gPCAyKSByZXR1cm4gbWluKHZhbHVlcyk7XG4gIGlmIChwID49IDEpIHJldHVybiBtYXgodmFsdWVzKTtcbiAgdmFyIG4sXG4gICAgICBpID0gKG4gLSAxKSAqIHAsXG4gICAgICBpMCA9IE1hdGguZmxvb3IoaSksXG4gICAgICB2YWx1ZTAgPSBtYXgocXVpY2tzZWxlY3QodmFsdWVzLCBpMCkuc3ViYXJyYXkoMCwgaTAgKyAxKSksXG4gICAgICB2YWx1ZTEgPSBtaW4odmFsdWVzLnN1YmFycmF5KGkwICsgMSkpO1xuICByZXR1cm4gdmFsdWUwICsgKHZhbHVlMSAtIHZhbHVlMCkgKiAoaSAtIGkwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1YW50aWxlU29ydGVkKHZhbHVlcywgcCwgdmFsdWVvZiA9IG51bWJlcikge1xuICBpZiAoIShuID0gdmFsdWVzLmxlbmd0aCkgfHwgaXNOYU4ocCA9ICtwKSkgcmV0dXJuO1xuICBpZiAocCA8PSAwIHx8IG4gPCAyKSByZXR1cm4gK3ZhbHVlb2YodmFsdWVzWzBdLCAwLCB2YWx1ZXMpO1xuICBpZiAocCA+PSAxKSByZXR1cm4gK3ZhbHVlb2YodmFsdWVzW24gLSAxXSwgbiAtIDEsIHZhbHVlcyk7XG4gIHZhciBuLFxuICAgICAgaSA9IChuIC0gMSkgKiBwLFxuICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLFxuICAgICAgdmFsdWUwID0gK3ZhbHVlb2YodmFsdWVzW2kwXSwgaTAsIHZhbHVlcyksXG4gICAgICB2YWx1ZTEgPSArdmFsdWVvZih2YWx1ZXNbaTAgKyAxXSwgaTAgKyAxLCB2YWx1ZXMpO1xuICByZXR1cm4gdmFsdWUwICsgKHZhbHVlMSAtIHZhbHVlMCkgKiAoaSAtIGkwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1YW50aWxlSW5kZXgodmFsdWVzLCBwLCB2YWx1ZW9mID0gbnVtYmVyKSB7XG4gIGlmIChpc05hTihwID0gK3ApKSByZXR1cm47XG4gIG51bWJlcnMgPSBGbG9hdDY0QXJyYXkuZnJvbSh2YWx1ZXMsIChfLCBpKSA9PiBudW1iZXIodmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpKTtcbiAgaWYgKHAgPD0gMCkgcmV0dXJuIG1pbkluZGV4KG51bWJlcnMpO1xuICBpZiAocCA+PSAxKSByZXR1cm4gbWF4SW5kZXgobnVtYmVycyk7XG4gIHZhciBudW1iZXJzLFxuICAgICAgaW5kZXggPSBVaW50MzJBcnJheS5mcm9tKHZhbHVlcywgKF8sIGkpID0+IGkpLFxuICAgICAgaiA9IG51bWJlcnMubGVuZ3RoIC0gMSxcbiAgICAgIGkgPSBNYXRoLmZsb29yKGogKiBwKTtcbiAgcXVpY2tzZWxlY3QoaW5kZXgsIGksIDAsIGosIChpLCBqKSA9PiBhc2NlbmRpbmdEZWZpbmVkKG51bWJlcnNbaV0sIG51bWJlcnNbal0pKTtcbiAgaSA9IGdyZWF0ZXN0KGluZGV4LnN1YmFycmF5KDAsIGkgKyAxKSwgKGkpID0+IG51bWJlcnNbaV0pO1xuICByZXR1cm4gaSA+PSAwID8gaSA6IC0xO1xufVxuIiwiaW1wb3J0IHthc2NlbmRpbmdEZWZpbmVkLCBjb21wYXJlRGVmaW5lZH0gZnJvbSBcIi4vc29ydC5qc1wiO1xuXG4vLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbW91cm5lci9xdWlja3NlbGVjdFxuLy8gSVNDIGxpY2Vuc2UsIENvcHlyaWdodCAyMDE4IFZsYWRpbWlyIEFnYWZvbmtpbi5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHF1aWNrc2VsZWN0KGFycmF5LCBrLCBsZWZ0ID0gMCwgcmlnaHQgPSBJbmZpbml0eSwgY29tcGFyZSkge1xuICBrID0gTWF0aC5mbG9vcihrKTtcbiAgbGVmdCA9IE1hdGguZmxvb3IoTWF0aC5tYXgoMCwgbGVmdCkpO1xuICByaWdodCA9IE1hdGguZmxvb3IoTWF0aC5taW4oYXJyYXkubGVuZ3RoIC0gMSwgcmlnaHQpKTtcblxuICBpZiAoIShsZWZ0IDw9IGsgJiYgayA8PSByaWdodCkpIHJldHVybiBhcnJheTtcblxuICBjb21wYXJlID0gY29tcGFyZSA9PT0gdW5kZWZpbmVkID8gYXNjZW5kaW5nRGVmaW5lZCA6IGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUpO1xuXG4gIHdoaWxlIChyaWdodCA+IGxlZnQpIHtcbiAgICBpZiAocmlnaHQgLSBsZWZ0ID4gNjAwKSB7XG4gICAgICBjb25zdCBuID0gcmlnaHQgLSBsZWZ0ICsgMTtcbiAgICAgIGNvbnN0IG0gPSBrIC0gbGVmdCArIDE7XG4gICAgICBjb25zdCB6ID0gTWF0aC5sb2cobik7XG4gICAgICBjb25zdCBzID0gMC41ICogTWF0aC5leHAoMiAqIHogLyAzKTtcbiAgICAgIGNvbnN0IHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogKG0gLSBuIC8gMiA8IDAgPyAtMSA6IDEpO1xuICAgICAgY29uc3QgbmV3TGVmdCA9IE1hdGgubWF4KGxlZnQsIE1hdGguZmxvb3IoayAtIG0gKiBzIC8gbiArIHNkKSk7XG4gICAgICBjb25zdCBuZXdSaWdodCA9IE1hdGgubWluKHJpZ2h0LCBNYXRoLmZsb29yKGsgKyAobiAtIG0pICogcyAvIG4gKyBzZCkpO1xuICAgICAgcXVpY2tzZWxlY3QoYXJyYXksIGssIG5ld0xlZnQsIG5ld1JpZ2h0LCBjb21wYXJlKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ID0gYXJyYXlba107XG4gICAgbGV0IGkgPSBsZWZ0O1xuICAgIGxldCBqID0gcmlnaHQ7XG5cbiAgICBzd2FwKGFycmF5LCBsZWZ0LCBrKTtcbiAgICBpZiAoY29tcGFyZShhcnJheVtyaWdodF0sIHQpID4gMCkgc3dhcChhcnJheSwgbGVmdCwgcmlnaHQpO1xuXG4gICAgd2hpbGUgKGkgPCBqKSB7XG4gICAgICBzd2FwKGFycmF5LCBpLCBqKSwgKytpLCAtLWo7XG4gICAgICB3aGlsZSAoY29tcGFyZShhcnJheVtpXSwgdCkgPCAwKSArK2k7XG4gICAgICB3aGlsZSAoY29tcGFyZShhcnJheVtqXSwgdCkgPiAwKSAtLWo7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBhcmUoYXJyYXlbbGVmdF0sIHQpID09PSAwKSBzd2FwKGFycmF5LCBsZWZ0LCBqKTtcbiAgICBlbHNlICsraiwgc3dhcChhcnJheSwgaiwgcmlnaHQpO1xuXG4gICAgaWYgKGogPD0gaykgbGVmdCA9IGogKyAxO1xuICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7XG4gIH1cblxuICByZXR1cm4gYXJyYXk7XG59XG5cbmZ1bmN0aW9uIHN3YXAoYXJyYXksIGksIGopIHtcbiAgY29uc3QgdCA9IGFycmF5W2ldO1xuICBhcnJheVtpXSA9IGFycmF5W2pdO1xuICBhcnJheVtqXSA9IHQ7XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuaW1wb3J0IHBlcm11dGUgZnJvbSBcIi4vcGVybXV0ZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0KHZhbHVlcywgLi4uRikge1xuICBpZiAodHlwZW9mIHZhbHVlc1tTeW1ib2wuaXRlcmF0b3JdICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YWx1ZXMgaXMgbm90IGl0ZXJhYmxlXCIpO1xuICB2YWx1ZXMgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gIGxldCBbZl0gPSBGO1xuICBpZiAoKGYgJiYgZi5sZW5ndGggIT09IDIpIHx8IEYubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChkLCBpKSA9PiBpKTtcbiAgICBpZiAoRi5sZW5ndGggPiAxKSB7XG4gICAgICBGID0gRi5tYXAoZiA9PiB2YWx1ZXMubWFwKGYpKTtcbiAgICAgIGluZGV4LnNvcnQoKGksIGopID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIEYpIHtcbiAgICAgICAgICBjb25zdCBjID0gYXNjZW5kaW5nRGVmaW5lZChmW2ldLCBmW2pdKTtcbiAgICAgICAgICBpZiAoYykgcmV0dXJuIGM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmID0gdmFsdWVzLm1hcChmKTtcbiAgICAgIGluZGV4LnNvcnQoKGksIGopID0+IGFzY2VuZGluZ0RlZmluZWQoZltpXSwgZltqXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcGVybXV0ZSh2YWx1ZXMsIGluZGV4KTtcbiAgfVxuICByZXR1cm4gdmFsdWVzLnNvcnQoY29tcGFyZURlZmluZWQoZikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZURlZmluZWQoY29tcGFyZSA9IGFzY2VuZGluZykge1xuICBpZiAoY29tcGFyZSA9PT0gYXNjZW5kaW5nKSByZXR1cm4gYXNjZW5kaW5nRGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBjb21wYXJlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjb21wYXJlIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICBjb25zdCB4ID0gY29tcGFyZShhLCBiKTtcbiAgICBpZiAoeCB8fCB4ID09PSAwKSByZXR1cm4geDtcbiAgICByZXR1cm4gKGNvbXBhcmUoYiwgYikgPT09IDApIC0gKGNvbXBhcmUoYSwgYSkgPT09IDApO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNjZW5kaW5nRGVmaW5lZChhLCBiKSB7XG4gIHJldHVybiAoYSA9PSBudWxsIHx8ICEoYSA+PSBhKSkgLSAoYiA9PSBudWxsIHx8ICEoYiA+PSBiKSkgfHwgKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTtcbn1cbiIsImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZS5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gQ29sb3IoKSB7fVxuXG5leHBvcnQgdmFyIGRhcmtlciA9IDAuNztcbmV4cG9ydCB2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyO1xuXG52YXIgcmVJID0gXCJcXFxccyooWystXT9cXFxcZCspXFxcXHMqXCIsXG4gICAgcmVOID0gXCJcXFxccyooWystXT8oPzpcXFxcZCpcXFxcLik/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pXFxcXHMqXCIsXG4gICAgcmVQID0gXCJcXFxccyooWystXT8oPzpcXFxcZCpcXFxcLik/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pJVxcXFxzKlwiLFxuICAgIHJlSGV4ID0gL14jKFswLTlhLWZdezMsOH0pJC8sXG4gICAgcmVSZ2JJbnRlZ2VyID0gbmV3IFJlZ0V4cChgXnJnYlxcXFwoJHtyZUl9LCR7cmVJfSwke3JlSX1cXFxcKSRgKSxcbiAgICByZVJnYlBlcmNlbnQgPSBuZXcgUmVnRXhwKGBecmdiXFxcXCgke3JlUH0sJHtyZVB9LCR7cmVQfVxcXFwpJGApLFxuICAgIHJlUmdiYUludGVnZXIgPSBuZXcgUmVnRXhwKGBecmdiYVxcXFwoJHtyZUl9LCR7cmVJfSwke3JlSX0sJHtyZU59XFxcXCkkYCksXG4gICAgcmVSZ2JhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JhXFxcXCgke3JlUH0sJHtyZVB9LCR7cmVQfSwke3JlTn1cXFxcKSRgKSxcbiAgICByZUhzbFBlcmNlbnQgPSBuZXcgUmVnRXhwKGBeaHNsXFxcXCgke3JlTn0sJHtyZVB9LCR7cmVQfVxcXFwpJGApLFxuICAgIHJlSHNsYVBlcmNlbnQgPSBuZXcgUmVnRXhwKGBeaHNsYVxcXFwoJHtyZU59LCR7cmVQfSwke3JlUH0sJHtyZU59XFxcXCkkYCk7XG5cbnZhciBuYW1lZCA9IHtcbiAgYWxpY2VibHVlOiAweGYwZjhmZixcbiAgYW50aXF1ZXdoaXRlOiAweGZhZWJkNyxcbiAgYXF1YTogMHgwMGZmZmYsXG4gIGFxdWFtYXJpbmU6IDB4N2ZmZmQ0LFxuICBhenVyZTogMHhmMGZmZmYsXG4gIGJlaWdlOiAweGY1ZjVkYyxcbiAgYmlzcXVlOiAweGZmZTRjNCxcbiAgYmxhY2s6IDB4MDAwMDAwLFxuICBibGFuY2hlZGFsbW9uZDogMHhmZmViY2QsXG4gIGJsdWU6IDB4MDAwMGZmLFxuICBibHVldmlvbGV0OiAweDhhMmJlMixcbiAgYnJvd246IDB4YTUyYTJhLFxuICBidXJseXdvb2Q6IDB4ZGViODg3LFxuICBjYWRldGJsdWU6IDB4NWY5ZWEwLFxuICBjaGFydHJldXNlOiAweDdmZmYwMCxcbiAgY2hvY29sYXRlOiAweGQyNjkxZSxcbiAgY29yYWw6IDB4ZmY3ZjUwLFxuICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsXG4gIGNvcm5zaWxrOiAweGZmZjhkYyxcbiAgY3JpbXNvbjogMHhkYzE0M2MsXG4gIGN5YW46IDB4MDBmZmZmLFxuICBkYXJrYmx1ZTogMHgwMDAwOGIsXG4gIGRhcmtjeWFuOiAweDAwOGI4YixcbiAgZGFya2dvbGRlbnJvZDogMHhiODg2MGIsXG4gIGRhcmtncmF5OiAweGE5YTlhOSxcbiAgZGFya2dyZWVuOiAweDAwNjQwMCxcbiAgZGFya2dyZXk6IDB4YTlhOWE5LFxuICBkYXJra2hha2k6IDB4YmRiNzZiLFxuICBkYXJrbWFnZW50YTogMHg4YjAwOGIsXG4gIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZixcbiAgZGFya29yYW5nZTogMHhmZjhjMDAsXG4gIGRhcmtvcmNoaWQ6IDB4OTkzMmNjLFxuICBkYXJrcmVkOiAweDhiMDAwMCxcbiAgZGFya3NhbG1vbjogMHhlOTk2N2EsXG4gIGRhcmtzZWFncmVlbjogMHg4ZmJjOGYsXG4gIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiLFxuICBkYXJrc2xhdGVncmF5OiAweDJmNGY0ZixcbiAgZGFya3NsYXRlZ3JleTogMHgyZjRmNGYsXG4gIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLFxuICBkYXJrdmlvbGV0OiAweDk0MDBkMyxcbiAgZGVlcHBpbms6IDB4ZmYxNDkzLFxuICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsXG4gIGRpbWdyYXk6IDB4Njk2OTY5LFxuICBkaW1ncmV5OiAweDY5Njk2OSxcbiAgZG9kZ2VyYmx1ZTogMHgxZTkwZmYsXG4gIGZpcmVicmljazogMHhiMjIyMjIsXG4gIGZsb3JhbHdoaXRlOiAweGZmZmFmMCxcbiAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyLFxuICBmdWNoc2lhOiAweGZmMDBmZixcbiAgZ2FpbnNib3JvOiAweGRjZGNkYyxcbiAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsXG4gIGdvbGQ6IDB4ZmZkNzAwLFxuICBnb2xkZW5yb2Q6IDB4ZGFhNTIwLFxuICBncmF5OiAweDgwODA4MCxcbiAgZ3JlZW46IDB4MDA4MDAwLFxuICBncmVlbnllbGxvdzogMHhhZGZmMmYsXG4gIGdyZXk6IDB4ODA4MDgwLFxuICBob25leWRldzogMHhmMGZmZjAsXG4gIGhvdHBpbms6IDB4ZmY2OWI0LFxuICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLFxuICBpbmRpZ286IDB4NGIwMDgyLFxuICBpdm9yeTogMHhmZmZmZjAsXG4gIGtoYWtpOiAweGYwZTY4YyxcbiAgbGF2ZW5kZXI6IDB4ZTZlNmZhLFxuICBsYXZlbmRlcmJsdXNoOiAweGZmZjBmNSxcbiAgbGF3bmdyZWVuOiAweDdjZmMwMCxcbiAgbGVtb25jaGlmZm9uOiAweGZmZmFjZCxcbiAgbGlnaHRibHVlOiAweGFkZDhlNixcbiAgbGlnaHRjb3JhbDogMHhmMDgwODAsXG4gIGxpZ2h0Y3lhbjogMHhlMGZmZmYsXG4gIGxpZ2h0Z29sZGVucm9keWVsbG93OiAweGZhZmFkMixcbiAgbGlnaHRncmF5OiAweGQzZDNkMyxcbiAgbGlnaHRncmVlbjogMHg5MGVlOTAsXG4gIGxpZ2h0Z3JleTogMHhkM2QzZDMsXG4gIGxpZ2h0cGluazogMHhmZmI2YzEsXG4gIGxpZ2h0c2FsbW9uOiAweGZmYTA3YSxcbiAgbGlnaHRzZWFncmVlbjogMHgyMGIyYWEsXG4gIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmEsXG4gIGxpZ2h0c2xhdGVncmF5OiAweDc3ODg5OSxcbiAgbGlnaHRzbGF0ZWdyZXk6IDB4Nzc4ODk5LFxuICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsXG4gIGxpZ2h0eWVsbG93OiAweGZmZmZlMCxcbiAgbGltZTogMHgwMGZmMDAsXG4gIGxpbWVncmVlbjogMHgzMmNkMzIsXG4gIGxpbmVuOiAweGZhZjBlNixcbiAgbWFnZW50YTogMHhmZjAwZmYsXG4gIG1hcm9vbjogMHg4MDAwMDAsXG4gIG1lZGl1bWFxdWFtYXJpbmU6IDB4NjZjZGFhLFxuICBtZWRpdW1ibHVlOiAweDAwMDBjZCxcbiAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMyxcbiAgbWVkaXVtcHVycGxlOiAweDkzNzBkYixcbiAgbWVkaXVtc2VhZ3JlZW46IDB4M2NiMzcxLFxuICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLFxuICBtZWRpdW1zcHJpbmdncmVlbjogMHgwMGZhOWEsXG4gIG1lZGl1bXR1cnF1b2lzZTogMHg0OGQxY2MsXG4gIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsXG4gIG1pZG5pZ2h0Ymx1ZTogMHgxOTE5NzAsXG4gIG1pbnRjcmVhbTogMHhmNWZmZmEsXG4gIG1pc3R5cm9zZTogMHhmZmU0ZTEsXG4gIG1vY2Nhc2luOiAweGZmZTRiNSxcbiAgbmF2YWpvd2hpdGU6IDB4ZmZkZWFkLFxuICBuYXZ5OiAweDAwMDA4MCxcbiAgb2xkbGFjZTogMHhmZGY1ZTYsXG4gIG9saXZlOiAweDgwODAwMCxcbiAgb2xpdmVkcmFiOiAweDZiOGUyMyxcbiAgb3JhbmdlOiAweGZmYTUwMCxcbiAgb3JhbmdlcmVkOiAweGZmNDUwMCxcbiAgb3JjaGlkOiAweGRhNzBkNixcbiAgcGFsZWdvbGRlbnJvZDogMHhlZWU4YWEsXG4gIHBhbGVncmVlbjogMHg5OGZiOTgsXG4gIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLFxuICBwYWxldmlvbGV0cmVkOiAweGRiNzA5MyxcbiAgcGFwYXlhd2hpcDogMHhmZmVmZDUsXG4gIHBlYWNocHVmZjogMHhmZmRhYjksXG4gIHBlcnU6IDB4Y2Q4NTNmLFxuICBwaW5rOiAweGZmYzBjYixcbiAgcGx1bTogMHhkZGEwZGQsXG4gIHBvd2RlcmJsdWU6IDB4YjBlMGU2LFxuICBwdXJwbGU6IDB4ODAwMDgwLFxuICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSxcbiAgcmVkOiAweGZmMDAwMCxcbiAgcm9zeWJyb3duOiAweGJjOGY4ZixcbiAgcm95YWxibHVlOiAweDQxNjllMSxcbiAgc2FkZGxlYnJvd246IDB4OGI0NTEzLFxuICBzYWxtb246IDB4ZmE4MDcyLFxuICBzYW5keWJyb3duOiAweGY0YTQ2MCxcbiAgc2VhZ3JlZW46IDB4MmU4YjU3LFxuICBzZWFzaGVsbDogMHhmZmY1ZWUsXG4gIHNpZW5uYTogMHhhMDUyMmQsXG4gIHNpbHZlcjogMHhjMGMwYzAsXG4gIHNreWJsdWU6IDB4ODdjZWViLFxuICBzbGF0ZWJsdWU6IDB4NmE1YWNkLFxuICBzbGF0ZWdyYXk6IDB4NzA4MDkwLFxuICBzbGF0ZWdyZXk6IDB4NzA4MDkwLFxuICBzbm93OiAweGZmZmFmYSxcbiAgc3ByaW5nZ3JlZW46IDB4MDBmZjdmLFxuICBzdGVlbGJsdWU6IDB4NDY4MmI0LFxuICB0YW46IDB4ZDJiNDhjLFxuICB0ZWFsOiAweDAwODA4MCxcbiAgdGhpc3RsZTogMHhkOGJmZDgsXG4gIHRvbWF0bzogMHhmZjYzNDcsXG4gIHR1cnF1b2lzZTogMHg0MGUwZDAsXG4gIHZpb2xldDogMHhlZTgyZWUsXG4gIHdoZWF0OiAweGY1ZGViMyxcbiAgd2hpdGU6IDB4ZmZmZmZmLFxuICB3aGl0ZXNtb2tlOiAweGY1ZjVmNSxcbiAgeWVsbG93OiAweGZmZmYwMCxcbiAgeWVsbG93Z3JlZW46IDB4OWFjZDMyXG59O1xuXG5kZWZpbmUoQ29sb3IsIGNvbG9yLCB7XG4gIGNvcHkoY2hhbm5lbHMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3RvciwgdGhpcywgY2hhbm5lbHMpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpO1xuICB9LFxuICBoZXg6IGNvbG9yX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhleDg6IGNvbG9yX2Zvcm1hdEhleDgsXG4gIGZvcm1hdEhzbDogY29sb3JfZm9ybWF0SHNsLFxuICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IGNvbG9yX2Zvcm1hdFJnYlxufSk7XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhleDgoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleDgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SHNsKCkge1xuICByZXR1cm4gaHNsQ29udmVydCh0aGlzKS5mb3JtYXRIc2woKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0UmdiKCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29sb3IoZm9ybWF0KSB7XG4gIHZhciBtLCBsO1xuICBmb3JtYXQgPSAoZm9ybWF0ICsgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAobSA9IHJlSGV4LmV4ZWMoZm9ybWF0KSkgPyAobCA9IG1bMV0ubGVuZ3RoLCBtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBsID09PSA2ID8gcmdibihtKSAvLyAjZmYwMDAwXG4gICAgICA6IGwgPT09IDMgPyBuZXcgUmdiKChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZiksIDEpIC8vICNmMDBcbiAgICAgIDogbCA9PT0gOCA/IHJnYmEobSA+PiAyNCAmIDB4ZmYsIG0gPj4gMTYgJiAweGZmLCBtID4+IDggJiAweGZmLCAobSAmIDB4ZmYpIC8gMHhmZikgLy8gI2ZmMDAwMDAwXG4gICAgICA6IGwgPT09IDQgPyByZ2JhKChtID4+IDEyICYgMHhmKSB8IChtID4+IDggJiAweGYwKSwgKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKCgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZikpIC8gMHhmZikgLy8gI2YwMDBcbiAgICAgIDogbnVsbCkgLy8gaW52YWxpZCBoZXhcbiAgICAgIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMClcbiAgICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSlcbiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKVxuICAgICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSlcbiAgICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpXG4gICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpXG4gICAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICA6IGZvcm1hdCA9PT0gXCJ0cmFuc3BhcmVudFwiID8gbmV3IFJnYihOYU4sIE5hTiwgTmFOLCAwKVxuICAgICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiByZ2JuKG4pIHtcbiAgcmV0dXJuIG5ldyBSZ2IobiA+PiAxNiAmIDB4ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTtcbn1cblxuZnVuY3Rpb24gcmdiYShyLCBnLCBiLCBhKSB7XG4gIGlmIChhIDw9IDApIHIgPSBnID0gYiA9IE5hTjtcbiAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgUmdiO1xuICBvID0gby5yZ2IoKTtcbiAgcmV0dXJuIG5ldyBSZ2Ioby5yLCBvLmcsIG8uYiwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gcmdiQ29udmVydChyKSA6IG5ldyBSZ2IociwgZywgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgdGhpcy5yID0gK3I7XG4gIHRoaXMuZyA9ICtnO1xuICB0aGlzLmIgPSArYjtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShSZ2IsIHJnYiwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2IoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNsYW1wKCkge1xuICAgIHJldHVybiBuZXcgUmdiKGNsYW1waSh0aGlzLnIpLCBjbGFtcGkodGhpcy5nKSwgY2xhbXBpKHRoaXMuYiksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuICgtMC41IDw9IHRoaXMuciAmJiB0aGlzLnIgPCAyNTUuNSlcbiAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5nICYmIHRoaXMuZyA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmIgJiYgdGhpcy5iIDwgMjU1LjUpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGhleDogcmdiX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiByZ2JfZm9ybWF0SGV4LFxuICBmb3JtYXRIZXg4OiByZ2JfZm9ybWF0SGV4OCxcbiAgZm9ybWF0UmdiOiByZ2JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogcmdiX2Zvcm1hdFJnYlxufSkpO1xuXG5mdW5jdGlvbiByZ2JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX1gO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0SGV4OCgpIHtcbiAgcmV0dXJuIGAjJHtoZXgodGhpcy5yKX0ke2hleCh0aGlzLmcpfSR7aGV4KHRoaXMuYil9JHtoZXgoKGlzTmFOKHRoaXMub3BhY2l0eSkgPyAxIDogdGhpcy5vcGFjaXR5KSAqIDI1NSl9YDtcbn1cblxuZnVuY3Rpb24gcmdiX2Zvcm1hdFJnYigpIHtcbiAgY29uc3QgYSA9IGNsYW1wYSh0aGlzLm9wYWNpdHkpO1xuICByZXR1cm4gYCR7YSA9PT0gMSA/IFwicmdiKFwiIDogXCJyZ2JhKFwifSR7Y2xhbXBpKHRoaXMucil9LCAke2NsYW1waSh0aGlzLmcpfSwgJHtjbGFtcGkodGhpcy5iKX0ke2EgPT09IDEgPyBcIilcIiA6IGAsICR7YX0pYH1gO1xufVxuXG5mdW5jdGlvbiBjbGFtcGEob3BhY2l0eSkge1xuICByZXR1cm4gaXNOYU4ob3BhY2l0eSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgb3BhY2l0eSkpO1xufVxuXG5mdW5jdGlvbiBjbGFtcGkodmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh2YWx1ZSkgfHwgMCkpO1xufVxuXG5mdW5jdGlvbiBoZXgodmFsdWUpIHtcbiAgdmFsdWUgPSBjbGFtcGkodmFsdWUpO1xuICByZXR1cm4gKHZhbHVlIDwgMTYgPyBcIjBcIiA6IFwiXCIpICsgdmFsdWUudG9TdHJpbmcoMTYpO1xufVxuXG5mdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHtcbiAgaWYgKGEgPD0gMCkgaCA9IHMgPSBsID0gTmFOO1xuICBlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjtcbiAgZWxzZSBpZiAocyA8PSAwKSBoID0gTmFOO1xuICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbENvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgSHNsO1xuICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG87XG4gIG8gPSBvLnJnYigpO1xuICB2YXIgciA9IG8uciAvIDI1NSxcbiAgICAgIGcgPSBvLmcgLyAyNTUsXG4gICAgICBiID0gby5iIC8gMjU1LFxuICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksXG4gICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcbiAgICAgIGggPSBOYU4sXG4gICAgICBzID0gbWF4IC0gbWluLFxuICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjtcbiAgaWYgKHMpIHtcbiAgICBpZiAociA9PT0gbWF4KSBoID0gKGcgLSBiKSAvIHMgKyAoZyA8IGIpICogNjtcbiAgICBlbHNlIGlmIChnID09PSBtYXgpIGggPSAoYiAtIHIpIC8gcyArIDI7XG4gICAgZWxzZSBoID0gKHIgLSBnKSAvIHMgKyA0O1xuICAgIHMgLz0gbCA8IDAuNSA/IG1heCArIG1pbiA6IDIgLSBtYXggLSBtaW47XG4gICAgaCAqPSA2MDtcbiAgfSBlbHNlIHtcbiAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDtcbiAgfVxuICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoc2xDb252ZXJ0KGgpIDogbmV3IEhzbChoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmZ1bmN0aW9uIEhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHRoaXMuaCA9ICtoO1xuICB0aGlzLnMgPSArcztcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoSHNsLCBoc2wsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2IoKSB7XG4gICAgdmFyIGggPSB0aGlzLmggJSAzNjAgKyAodGhpcy5oIDwgMCkgKiAzNjAsXG4gICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucyxcbiAgICAgICAgbCA9IHRoaXMubCxcbiAgICAgICAgbTIgPSBsICsgKGwgPCAwLjUgPyBsIDogMSAtIGwpICogcyxcbiAgICAgICAgbTEgPSAyICogbCAtIG0yO1xuICAgIHJldHVybiBuZXcgUmdiKFxuICAgICAgaHNsMnJnYihoID49IDI0MCA/IGggLSAyNDAgOiBoICsgMTIwLCBtMSwgbTIpLFxuICAgICAgaHNsMnJnYihoLCBtMSwgbTIpLFxuICAgICAgaHNsMnJnYihoIDwgMTIwID8gaCArIDI0MCA6IGggLSAxMjAsIG0xLCBtMiksXG4gICAgICB0aGlzLm9wYWNpdHlcbiAgICApO1xuICB9LFxuICBjbGFtcCgpIHtcbiAgICByZXR1cm4gbmV3IEhzbChjbGFtcGgodGhpcy5oKSwgY2xhbXB0KHRoaXMucyksIGNsYW1wdCh0aGlzLmwpLCBjbGFtcGEodGhpcy5vcGFjaXR5KSk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiAoMCA8PSB0aGlzLnMgJiYgdGhpcy5zIDw9IDEgfHwgaXNOYU4odGhpcy5zKSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5sICYmIHRoaXMubCA8PSAxKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9LFxuICBmb3JtYXRIc2woKSB7XG4gICAgY29uc3QgYSA9IGNsYW1wYSh0aGlzLm9wYWNpdHkpO1xuICAgIHJldHVybiBgJHthID09PSAxID8gXCJoc2woXCIgOiBcImhzbGEoXCJ9JHtjbGFtcGgodGhpcy5oKX0sICR7Y2xhbXB0KHRoaXMucykgKiAxMDB9JSwgJHtjbGFtcHQodGhpcy5sKSAqIDEwMH0lJHthID09PSAxID8gXCIpXCIgOiBgLCAke2F9KWB9YDtcbiAgfVxufSkpO1xuXG5mdW5jdGlvbiBjbGFtcGgodmFsdWUpIHtcbiAgdmFsdWUgPSAodmFsdWUgfHwgMCkgJSAzNjA7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyB2YWx1ZSArIDM2MCA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjbGFtcHQodmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbHVlIHx8IDApKTtcbn1cblxuLyogRnJvbSBGdkQgMTMuMzcsIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgMyAqL1xuZnVuY3Rpb24gaHNsMnJnYihoLCBtMSwgbTIpIHtcbiAgcmV0dXJuIChoIDwgNjAgPyBtMSArIChtMiAtIG0xKSAqIGggLyA2MFxuICAgICAgOiBoIDwgMTgwID8gbTJcbiAgICAgIDogaCA8IDI0MCA/IG0xICsgKG0yIC0gbTEpICogKDI0MCAtIGgpIC8gNjBcbiAgICAgIDogbTEpICogMjU1O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29uc3RydWN0b3IsIGZhY3RvcnksIHByb3RvdHlwZSkge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBmYWN0b3J5LnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgcHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQocGFyZW50LCBkZWZpbml0aW9uKSB7XG4gIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpO1xuICBmb3IgKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgcHJvdG90eXBlW2tleV0gPSBkZWZpbml0aW9uW2tleV07XG4gIHJldHVybiBwcm90b3R5cGU7XG59XG4iLCJpbXBvcnQgZGVmaW5lLCB7ZXh0ZW5kfSBmcm9tIFwiLi9kZWZpbmUuanNcIjtcbmltcG9ydCB7Q29sb3IsIHJnYkNvbnZlcnQsIFJnYn0gZnJvbSBcIi4vY29sb3IuanNcIjtcbmltcG9ydCB7ZGVncmVlcywgcmFkaWFuc30gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG4vLyBodHRwczovL29ic2VydmFibGVocS5jb20vQG1ib3N0b2NrL2xhYi1hbmQtcmdiXG5jb25zdCBLID0gMTgsXG4gICAgWG4gPSAwLjk2NDIyLFxuICAgIFluID0gMSxcbiAgICBabiA9IDAuODI1MjEsXG4gICAgdDAgPSA0IC8gMjksXG4gICAgdDEgPSA2IC8gMjksXG4gICAgdDIgPSAzICogdDEgKiB0MSxcbiAgICB0MyA9IHQxICogdDEgKiB0MTtcblxuZnVuY3Rpb24gbGFiQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgTGFiKSByZXR1cm4gbmV3IExhYihvLmwsIG8uYSwgby5iLCBvLm9wYWNpdHkpO1xuICBpZiAobyBpbnN0YW5jZW9mIEhjbCkgcmV0dXJuIGhjbDJsYWIobyk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBSZ2IpKSBvID0gcmdiQ29udmVydChvKTtcbiAgdmFyIHIgPSByZ2IybHJnYihvLnIpLFxuICAgICAgZyA9IHJnYjJscmdiKG8uZyksXG4gICAgICBiID0gcmdiMmxyZ2Ioby5iKSxcbiAgICAgIHkgPSB4eXoybGFiKCgwLjIyMjUwNDUgKiByICsgMC43MTY4Nzg2ICogZyArIDAuMDYwNjE2OSAqIGIpIC8gWW4pLCB4LCB6O1xuICBpZiAociA9PT0gZyAmJiBnID09PSBiKSB4ID0geiA9IHk7IGVsc2Uge1xuICAgIHggPSB4eXoybGFiKCgwLjQzNjA3NDcgKiByICsgMC4zODUwNjQ5ICogZyArIDAuMTQzMDgwNCAqIGIpIC8gWG4pO1xuICAgIHogPSB4eXoybGFiKCgwLjAxMzkzMjIgKiByICsgMC4wOTcxMDQ1ICogZyArIDAuNzE0MTczMyAqIGIpIC8gWm4pO1xuICB9XG4gIHJldHVybiBuZXcgTGFiKDExNiAqIHkgLSAxNiwgNTAwICogKHggLSB5KSwgMjAwICogKHkgLSB6KSwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyYXkobCwgb3BhY2l0eSkge1xuICByZXR1cm4gbmV3IExhYihsLCAwLCAwLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxhYihsLCBhLCBiLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gbGFiQ29udmVydChsKSA6IG5ldyBMYWIobCwgYSwgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTGFiKGwsIGEsIGIsIG9wYWNpdHkpIHtcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMuYSA9ICthO1xuICB0aGlzLmIgPSArYjtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShMYWIsIGxhYiwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICByZXR1cm4gbmV3IExhYih0aGlzLmwgKyBLICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5hLCB0aGlzLmIsIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sIC0gSyAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMuYSwgdGhpcy5iLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2IoKSB7XG4gICAgdmFyIHkgPSAodGhpcy5sICsgMTYpIC8gMTE2LFxuICAgICAgICB4ID0gaXNOYU4odGhpcy5hKSA/IHkgOiB5ICsgdGhpcy5hIC8gNTAwLFxuICAgICAgICB6ID0gaXNOYU4odGhpcy5iKSA/IHkgOiB5IC0gdGhpcy5iIC8gMjAwO1xuICAgIHggPSBYbiAqIGxhYjJ4eXooeCk7XG4gICAgeSA9IFluICogbGFiMnh5eih5KTtcbiAgICB6ID0gWm4gKiBsYWIyeHl6KHopO1xuICAgIHJldHVybiBuZXcgUmdiKFxuICAgICAgbHJnYjJyZ2IoIDMuMTMzODU2MSAqIHggLSAxLjYxNjg2NjcgKiB5IC0gMC40OTA2MTQ2ICogeiksXG4gICAgICBscmdiMnJnYigtMC45Nzg3Njg0ICogeCArIDEuOTE2MTQxNSAqIHkgKyAwLjAzMzQ1NDAgKiB6KSxcbiAgICAgIGxyZ2IycmdiKCAwLjA3MTk0NTMgKiB4IC0gMC4yMjg5OTE0ICogeSArIDEuNDA1MjQyNyAqIHopLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfVxufSkpO1xuXG5mdW5jdGlvbiB4eXoybGFiKHQpIHtcbiAgcmV0dXJuIHQgPiB0MyA/IE1hdGgucG93KHQsIDEgLyAzKSA6IHQgLyB0MiArIHQwO1xufVxuXG5mdW5jdGlvbiBsYWIyeHl6KHQpIHtcbiAgcmV0dXJuIHQgPiB0MSA/IHQgKiB0ICogdCA6IHQyICogKHQgLSB0MCk7XG59XG5cbmZ1bmN0aW9uIGxyZ2IycmdiKHgpIHtcbiAgcmV0dXJuIDI1NSAqICh4IDw9IDAuMDAzMTMwOCA/IDEyLjkyICogeCA6IDEuMDU1ICogTWF0aC5wb3coeCwgMSAvIDIuNCkgLSAwLjA1NSk7XG59XG5cbmZ1bmN0aW9uIHJnYjJscmdiKHgpIHtcbiAgcmV0dXJuICh4IC89IDI1NSkgPD0gMC4wNDA0NSA/IHggLyAxMi45MiA6IE1hdGgucG93KCh4ICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG59XG5cbmZ1bmN0aW9uIGhjbENvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIEhjbCkgcmV0dXJuIG5ldyBIY2woby5oLCBvLmMsIG8ubCwgby5vcGFjaXR5KTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIExhYikpIG8gPSBsYWJDb252ZXJ0KG8pO1xuICBpZiAoby5hID09PSAwICYmIG8uYiA9PT0gMCkgcmV0dXJuIG5ldyBIY2woTmFOLCAwIDwgby5sICYmIG8ubCA8IDEwMCA/IDAgOiBOYU4sIG8ubCwgby5vcGFjaXR5KTtcbiAgdmFyIGggPSBNYXRoLmF0YW4yKG8uYiwgby5hKSAqIGRlZ3JlZXM7XG4gIHJldHVybiBuZXcgSGNsKGggPCAwID8gaCArIDM2MCA6IGgsIE1hdGguc3FydChvLmEgKiBvLmEgKyBvLmIgKiBvLmIpLCBvLmwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsY2gobCwgYywgaCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhjbENvbnZlcnQobCkgOiBuZXcgSGNsKGgsIGMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhjbChoLCBjLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaGNsQ29udmVydChoKSA6IG5ldyBIY2woaCwgYywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSGNsKGgsIGMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMuYyA9ICtjO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmZ1bmN0aW9uIGhjbDJsYWIobykge1xuICBpZiAoaXNOYU4oby5oKSkgcmV0dXJuIG5ldyBMYWIoby5sLCAwLCAwLCBvLm9wYWNpdHkpO1xuICB2YXIgaCA9IG8uaCAqIHJhZGlhbnM7XG4gIHJldHVybiBuZXcgTGFiKG8ubCwgTWF0aC5jb3MoaCkgKiBvLmMsIE1hdGguc2luKGgpICogby5jLCBvLm9wYWNpdHkpO1xufVxuXG5kZWZpbmUoSGNsLCBoY2wsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcihrKSB7XG4gICAgcmV0dXJuIG5ldyBIY2wodGhpcy5oLCB0aGlzLmMsIHRoaXMubCArIEsgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgLSBLICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiKCkge1xuICAgIHJldHVybiBoY2wybGFiKHRoaXMpLnJnYigpO1xuICB9XG59KSk7XG4iLCJleHBvcnQgY29uc3QgcmFkaWFucyA9IE1hdGguUEkgLyAxODA7XG5leHBvcnQgY29uc3QgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG4iLCJ2YXIgbm9vcCA9IHt2YWx1ZTogKCkgPT4ge319O1xuXG5mdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBfID0ge30sIHQ7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgXCJcIikgfHwgKHQgaW4gXykgfHwgL1tcXHMuXS8udGVzdCh0KSkgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCB0eXBlOiBcIiArIHQpO1xuICAgIF9bdF0gPSBbXTtcbiAgfVxuICByZXR1cm4gbmV3IERpc3BhdGNoKF8pO1xufVxuXG5mdW5jdGlvbiBEaXNwYXRjaChfKSB7XG4gIHRoaXMuXyA9IF87XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcywgdHlwZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIGlmICh0ICYmICF0eXBlcy5oYXNPd25Qcm9wZXJ0eSh0KSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHQpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5EaXNwYXRjaC5wcm90b3R5cGUgPSBkaXNwYXRjaC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBEaXNwYXRjaCxcbiAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykge1xuICAgIHZhciBfID0gdGhpcy5fLFxuICAgICAgICBUID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyBcIlwiLCBfKSxcbiAgICAgICAgdCxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gVC5sZW5ndGg7XG5cbiAgICAvLyBJZiBubyBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGNhbGxiYWNrIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUpKSkgcmV0dXJuIHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgYSB0eXBlIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIC8vIE90aGVyd2lzZSwgaWYgYSBudWxsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJlbW92ZSBjYWxsYmFja3Mgb2YgdGhlIGdpdmVuIG5hbWUuXG4gICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2FsbGJhY2s6IFwiICsgY2FsbGJhY2spO1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpZiAodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spO1xuICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNvcHk6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87XG4gICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpO1xuICAgIHJldHVybiBuZXcgRGlzcGF0Y2goY29weSk7XG4gIH0sXG4gIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHtcbiAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbih0eXBlLCB0aGF0LCBhcmdzKSB7XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHZhciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXQodHlwZSwgbmFtZSkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoLCBjOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKChjID0gdHlwZVtpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgcmV0dXJuIGMudmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldCh0eXBlLCBuYW1lLCBjYWxsYmFjaykge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgdHlwZVtpXSA9IG5vb3AsIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkgKyAxKSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHR5cGUucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IGNhbGxiYWNrfSk7XG4gIHJldHVybiB0eXBlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkaXNwYXRjaDtcbiIsImltcG9ydCB7c2VsZWN0fSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgbm9ldmVudCwge25vbnBhc3NpdmVjYXB0dXJlfSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZpZXcpIHtcbiAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCh2aWV3KS5vbihcImRyYWdzdGFydC5kcmFnXCIsIG5vZXZlbnQsIG5vbnBhc3NpdmVjYXB0dXJlKTtcbiAgaWYgKFwib25zZWxlY3RzdGFydFwiIGluIHJvb3QpIHtcbiAgICBzZWxlY3Rpb24ub24oXCJzZWxlY3RzdGFydC5kcmFnXCIsIG5vZXZlbnQsIG5vbnBhc3NpdmVjYXB0dXJlKTtcbiAgfSBlbHNlIHtcbiAgICByb290Ll9fbm9zZWxlY3QgPSByb290LnN0eWxlLk1velVzZXJTZWxlY3Q7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gXCJub25lXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHllc2RyYWcodmlldywgbm9jbGljaykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIGlmIChub2NsaWNrKSB7XG4gICAgc2VsZWN0aW9uLm9uKFwiY2xpY2suZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZWN0aW9uLm9uKFwiY2xpY2suZHJhZ1wiLCBudWxsKTsgfSwgMCk7XG4gIH1cbiAgaWYgKFwib25zZWxlY3RzdGFydFwiIGluIHJvb3QpIHtcbiAgICBzZWxlY3Rpb24ub24oXCJzZWxlY3RzdGFydC5kcmFnXCIsIG51bGwpO1xuICB9IGVsc2Uge1xuICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9IHJvb3QuX19ub3NlbGVjdDtcbiAgICBkZWxldGUgcm9vdC5fX25vc2VsZWN0O1xuICB9XG59XG4iLCIvLyBUaGVzZSBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBub2V2ZW50IHRvIGVuc3VyZSB0aGF0IHdlIGNhblxuLy8gcHJldmVudERlZmF1bHQgb24gdGhlIGV2ZW50LlxuZXhwb3J0IGNvbnN0IG5vbnBhc3NpdmUgPSB7cGFzc2l2ZTogZmFsc2V9O1xuZXhwb3J0IGNvbnN0IG5vbnBhc3NpdmVjYXB0dXJlID0ge2NhcHR1cmU6IHRydWUsIHBhc3NpdmU6IGZhbHNlfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcHJvcGFnYXRpb24oZXZlbnQpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuIiwiaW1wb3J0IGRzdiBmcm9tIFwiLi9kc3YuanNcIjtcblxudmFyIGNzdiA9IGRzdihcIixcIik7XG5cbmV4cG9ydCB2YXIgY3N2UGFyc2UgPSBjc3YucGFyc2U7XG5leHBvcnQgdmFyIGNzdlBhcnNlUm93cyA9IGNzdi5wYXJzZVJvd3M7XG5leHBvcnQgdmFyIGNzdkZvcm1hdCA9IGNzdi5mb3JtYXQ7XG5leHBvcnQgdmFyIGNzdkZvcm1hdEJvZHkgPSBjc3YuZm9ybWF0Qm9keTtcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0Um93cyA9IGNzdi5mb3JtYXRSb3dzO1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRSb3cgPSBjc3YuZm9ybWF0Um93O1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRWYWx1ZSA9IGNzdi5mb3JtYXRWYWx1ZTtcbiIsInZhciBFT0wgPSB7fSxcbiAgICBFT0YgPSB7fSxcbiAgICBRVU9URSA9IDM0LFxuICAgIE5FV0xJTkUgPSAxMCxcbiAgICBSRVRVUk4gPSAxMztcblxuZnVuY3Rpb24gb2JqZWN0Q29udmVydGVyKGNvbHVtbnMpIHtcbiAgcmV0dXJuIG5ldyBGdW5jdGlvbihcImRcIiwgXCJyZXR1cm4ge1wiICsgY29sdW1ucy5tYXAoZnVuY3Rpb24obmFtZSwgaSkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShuYW1lKSArIFwiOiBkW1wiICsgaSArIFwiXSB8fCBcXFwiXFxcIlwiO1xuICB9KS5qb2luKFwiLFwiKSArIFwifVwiKTtcbn1cblxuZnVuY3Rpb24gY3VzdG9tQ29udmVydGVyKGNvbHVtbnMsIGYpIHtcbiAgdmFyIG9iamVjdCA9IG9iamVjdENvbnZlcnRlcihjb2x1bW5zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHJvdywgaSkge1xuICAgIHJldHVybiBmKG9iamVjdChyb3cpLCBpLCBjb2x1bW5zKTtcbiAgfTtcbn1cblxuLy8gQ29tcHV0ZSB1bmlxdWUgY29sdW1ucyBpbiBvcmRlciBvZiBkaXNjb3ZlcnkuXG5mdW5jdGlvbiBpbmZlckNvbHVtbnMocm93cykge1xuICB2YXIgY29sdW1uU2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgIGNvbHVtbnMgPSBbXTtcblxuICByb3dzLmZvckVhY2goZnVuY3Rpb24ocm93KSB7XG4gICAgZm9yICh2YXIgY29sdW1uIGluIHJvdykge1xuICAgICAgaWYgKCEoY29sdW1uIGluIGNvbHVtblNldCkpIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKGNvbHVtblNldFtjb2x1bW5dID0gY29sdW1uKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBjb2x1bW5zO1xufVxuXG5mdW5jdGlvbiBwYWQodmFsdWUsIHdpZHRoKSB7XG4gIHZhciBzID0gdmFsdWUgKyBcIlwiLCBsZW5ndGggPSBzLmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbigwKSArIHMgOiBzO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRZZWFyKHllYXIpIHtcbiAgcmV0dXJuIHllYXIgPCAwID8gXCItXCIgKyBwYWQoLXllYXIsIDYpXG4gICAgOiB5ZWFyID4gOTk5OSA/IFwiK1wiICsgcGFkKHllYXIsIDYpXG4gICAgOiBwYWQoeWVhciwgNCk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZSkge1xuICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCksXG4gICAgICBtaW51dGVzID0gZGF0ZS5nZXRVVENNaW51dGVzKCksXG4gICAgICBzZWNvbmRzID0gZGF0ZS5nZXRVVENTZWNvbmRzKCksXG4gICAgICBtaWxsaXNlY29uZHMgPSBkYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpO1xuICByZXR1cm4gaXNOYU4oZGF0ZSkgPyBcIkludmFsaWQgRGF0ZVwiXG4gICAgICA6IGZvcm1hdFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpLCA0KSArIFwiLVwiICsgcGFkKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEsIDIpICsgXCItXCIgKyBwYWQoZGF0ZS5nZXRVVENEYXRlKCksIDIpXG4gICAgICArIChtaWxsaXNlY29uZHMgPyBcIlRcIiArIHBhZChob3VycywgMikgKyBcIjpcIiArIHBhZChtaW51dGVzLCAyKSArIFwiOlwiICsgcGFkKHNlY29uZHMsIDIpICsgXCIuXCIgKyBwYWQobWlsbGlzZWNvbmRzLCAzKSArIFwiWlwiXG4gICAgICA6IHNlY29uZHMgPyBcIlRcIiArIHBhZChob3VycywgMikgKyBcIjpcIiArIHBhZChtaW51dGVzLCAyKSArIFwiOlwiICsgcGFkKHNlY29uZHMsIDIpICsgXCJaXCJcbiAgICAgIDogbWludXRlcyB8fCBob3VycyA/IFwiVFwiICsgcGFkKGhvdXJzLCAyKSArIFwiOlwiICsgcGFkKG1pbnV0ZXMsIDIpICsgXCJaXCJcbiAgICAgIDogXCJcIik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGRlbGltaXRlcikge1xuICB2YXIgcmVGb3JtYXQgPSBuZXcgUmVnRXhwKFwiW1xcXCJcIiArIGRlbGltaXRlciArIFwiXFxuXFxyXVwiKSxcbiAgICAgIERFTElNSVRFUiA9IGRlbGltaXRlci5jaGFyQ29kZUF0KDApO1xuXG4gIGZ1bmN0aW9uIHBhcnNlKHRleHQsIGYpIHtcbiAgICB2YXIgY29udmVydCwgY29sdW1ucywgcm93cyA9IHBhcnNlUm93cyh0ZXh0LCBmdW5jdGlvbihyb3csIGkpIHtcbiAgICAgIGlmIChjb252ZXJ0KSByZXR1cm4gY29udmVydChyb3csIGkgLSAxKTtcbiAgICAgIGNvbHVtbnMgPSByb3csIGNvbnZlcnQgPSBmID8gY3VzdG9tQ29udmVydGVyKHJvdywgZikgOiBvYmplY3RDb252ZXJ0ZXIocm93KTtcbiAgICB9KTtcbiAgICByb3dzLmNvbHVtbnMgPSBjb2x1bW5zIHx8IFtdO1xuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VSb3dzKHRleHQsIGYpIHtcbiAgICB2YXIgcm93cyA9IFtdLCAvLyBvdXRwdXQgcm93c1xuICAgICAgICBOID0gdGV4dC5sZW5ndGgsXG4gICAgICAgIEkgPSAwLCAvLyBjdXJyZW50IGNoYXJhY3RlciBpbmRleFxuICAgICAgICBuID0gMCwgLy8gY3VycmVudCBsaW5lIG51bWJlclxuICAgICAgICB0LCAvLyBjdXJyZW50IHRva2VuXG4gICAgICAgIGVvZiA9IE4gPD0gMCwgLy8gY3VycmVudCB0b2tlbiBmb2xsb3dlZCBieSBFT0Y/XG4gICAgICAgIGVvbCA9IGZhbHNlOyAvLyBjdXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPTD9cblxuICAgIC8vIFN0cmlwIHRoZSB0cmFpbGluZyBuZXdsaW5lLlxuICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoTiAtIDEpID09PSBORVdMSU5FKSAtLU47XG4gICAgaWYgKHRleHQuY2hhckNvZGVBdChOIC0gMSkgPT09IFJFVFVSTikgLS1OO1xuXG4gICAgZnVuY3Rpb24gdG9rZW4oKSB7XG4gICAgICBpZiAoZW9mKSByZXR1cm4gRU9GO1xuICAgICAgaWYgKGVvbCkgcmV0dXJuIGVvbCA9IGZhbHNlLCBFT0w7XG5cbiAgICAgIC8vIFVuZXNjYXBlIHF1b3Rlcy5cbiAgICAgIHZhciBpLCBqID0gSSwgYztcbiAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaikgPT09IFFVT1RFKSB7XG4gICAgICAgIHdoaWxlIChJKysgPCBOICYmIHRleHQuY2hhckNvZGVBdChJKSAhPT0gUVVPVEUgfHwgdGV4dC5jaGFyQ29kZUF0KCsrSSkgPT09IFFVT1RFKTtcbiAgICAgICAgaWYgKChpID0gSSkgPj0gTikgZW9mID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoKGMgPSB0ZXh0LmNoYXJDb2RlQXQoSSsrKSkgPT09IE5FV0xJTkUpIGVvbCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKGMgPT09IFJFVFVSTikgeyBlb2wgPSB0cnVlOyBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSBORVdMSU5FKSArK0k7IH1cbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UoaiArIDEsIGkgLSAxKS5yZXBsYWNlKC9cIlwiL2csIFwiXFxcIlwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gRmluZCBuZXh0IGRlbGltaXRlciBvciBuZXdsaW5lLlxuICAgICAgd2hpbGUgKEkgPCBOKSB7XG4gICAgICAgIGlmICgoYyA9IHRleHQuY2hhckNvZGVBdChpID0gSSsrKSkgPT09IE5FV0xJTkUpIGVvbCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKGMgPT09IFJFVFVSTikgeyBlb2wgPSB0cnVlOyBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSBORVdMSU5FKSArK0k7IH1cbiAgICAgICAgZWxzZSBpZiAoYyAhPT0gREVMSU1JVEVSKSBjb250aW51ZTtcbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UoaiwgaSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHVybiBsYXN0IHRva2VuIGJlZm9yZSBFT0YuXG4gICAgICByZXR1cm4gZW9mID0gdHJ1ZSwgdGV4dC5zbGljZShqLCBOKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoKHQgPSB0b2tlbigpKSAhPT0gRU9GKSB7XG4gICAgICB2YXIgcm93ID0gW107XG4gICAgICB3aGlsZSAodCAhPT0gRU9MICYmIHQgIT09IEVPRikgcm93LnB1c2godCksIHQgPSB0b2tlbigpO1xuICAgICAgaWYgKGYgJiYgKHJvdyA9IGYocm93LCBuKyspKSA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgIHJvd3MucHVzaChyb3cpO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKSB7XG4gICAgcmV0dXJuIHJvd3MubWFwKGZ1bmN0aW9uKHJvdykge1xuICAgICAgcmV0dXJuIGNvbHVtbnMubWFwKGZ1bmN0aW9uKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gZm9ybWF0VmFsdWUocm93W2NvbHVtbl0pO1xuICAgICAgfSkuam9pbihkZWxpbWl0ZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0KHJvd3MsIGNvbHVtbnMpIHtcbiAgICBpZiAoY29sdW1ucyA9PSBudWxsKSBjb2x1bW5zID0gaW5mZXJDb2x1bW5zKHJvd3MpO1xuICAgIHJldHVybiBbY29sdW1ucy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKV0uY29uY2F0KHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykpLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpIHtcbiAgICBpZiAoY29sdW1ucyA9PSBudWxsKSBjb2x1bW5zID0gaW5mZXJDb2x1bW5zKHJvd3MpO1xuICAgIHJldHVybiBwcmVmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRSb3dzKHJvd3MpIHtcbiAgICByZXR1cm4gcm93cy5tYXAoZm9ybWF0Um93KS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0Um93KHJvdykge1xuICAgIHJldHVybiByb3cubWFwKGZvcm1hdFZhbHVlKS5qb2luKGRlbGltaXRlcik7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIlxuICAgICAgICA6IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IGZvcm1hdERhdGUodmFsdWUpXG4gICAgICAgIDogcmVGb3JtYXQudGVzdCh2YWx1ZSArPSBcIlwiKSA/IFwiXFxcIlwiICsgdmFsdWUucmVwbGFjZSgvXCIvZywgXCJcXFwiXFxcIlwiKSArIFwiXFxcIlwiXG4gICAgICAgIDogdmFsdWU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhcnNlOiBwYXJzZSxcbiAgICBwYXJzZVJvd3M6IHBhcnNlUm93cyxcbiAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICBmb3JtYXRCb2R5OiBmb3JtYXRCb2R5LFxuICAgIGZvcm1hdFJvd3M6IGZvcm1hdFJvd3MsXG4gICAgZm9ybWF0Um93OiBmb3JtYXRSb3csXG4gICAgZm9ybWF0VmFsdWU6IGZvcm1hdFZhbHVlXG4gIH07XG59XG4iLCJpbXBvcnQgZHN2IGZyb20gXCIuL2Rzdi5qc1wiO1xuXG52YXIgdHN2ID0gZHN2KFwiXFx0XCIpO1xuXG5leHBvcnQgdmFyIHRzdlBhcnNlID0gdHN2LnBhcnNlO1xuZXhwb3J0IHZhciB0c3ZQYXJzZVJvd3MgPSB0c3YucGFyc2VSb3dzO1xuZXhwb3J0IHZhciB0c3ZGb3JtYXQgPSB0c3YuZm9ybWF0O1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRCb2R5ID0gdHN2LmZvcm1hdEJvZHk7XG5leHBvcnQgdmFyIHRzdkZvcm1hdFJvd3MgPSB0c3YuZm9ybWF0Um93cztcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0Um93ID0gdHN2LmZvcm1hdFJvdztcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0VmFsdWUgPSB0c3YuZm9ybWF0VmFsdWU7XG4iLCJleHBvcnQgZnVuY3Rpb24gY3ViaWNJbih0KSB7XG4gIHJldHVybiB0ICogdCAqIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjdWJpY091dCh0KSB7XG4gIHJldHVybiAtLXQgKiB0ICogdCArIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjdWJpY0luT3V0KHQpIHtcbiAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gdCAqIHQgKiB0IDogKHQgLT0gMikgKiB0ICogdCArIDIpIC8gMjtcbn1cbiIsImltcG9ydCB7Y3N2UGFyc2UsIGRzdkZvcm1hdCwgdHN2UGFyc2V9IGZyb20gXCJkMy1kc3ZcIjtcbmltcG9ydCB0ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcblxuZnVuY3Rpb24gZHN2UGFyc2UocGFyc2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBpbml0LCByb3cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiB0eXBlb2YgaW5pdCA9PT0gXCJmdW5jdGlvblwiKSByb3cgPSBpbml0LCBpbml0ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0ZXh0KGlucHV0LCBpbml0KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcGFyc2UocmVzcG9uc2UsIHJvdyk7XG4gICAgfSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRzdihkZWxpbWl0ZXIsIGlucHV0LCBpbml0LCByb3cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIGluaXQgPT09IFwiZnVuY3Rpb25cIikgcm93ID0gaW5pdCwgaW5pdCA9IHVuZGVmaW5lZDtcbiAgdmFyIGZvcm1hdCA9IGRzdkZvcm1hdChkZWxpbWl0ZXIpO1xuICByZXR1cm4gdGV4dChpbnB1dCwgaW5pdCkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgIHJldHVybiBmb3JtYXQucGFyc2UocmVzcG9uc2UsIHJvdyk7XG4gIH0pO1xufVxuXG5leHBvcnQgdmFyIGNzdiA9IGRzdlBhcnNlKGNzdlBhcnNlKTtcbmV4cG9ydCB2YXIgdHN2ID0gZHN2UGFyc2UodHN2UGFyc2UpO1xuIiwiZnVuY3Rpb24gcmVzcG9uc2VKc29uKHJlc3BvbnNlKSB7XG4gIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyBcIiBcIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDQgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSAyMDUpIHJldHVybjtcbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5wdXQsIGluaXQpIHtcbiAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KS50aGVuKHJlc3BvbnNlSnNvbik7XG59XG4iLCJmdW5jdGlvbiByZXNwb25zZVRleHQocmVzcG9uc2UpIHtcbiAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1cyArIFwiIFwiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGlucHV0LCBpbml0KSB7XG4gIHJldHVybiBmZXRjaChpbnB1dCwgaW5pdCkudGhlbihyZXNwb25zZVRleHQpO1xufVxuIiwiaW1wb3J0IGZvcm1hdExvY2FsZSBmcm9tIFwiLi9sb2NhbGUuanNcIjtcblxudmFyIGxvY2FsZTtcbmV4cG9ydCB2YXIgZm9ybWF0O1xuZXhwb3J0IHZhciBmb3JtYXRQcmVmaXg7XG5cbmRlZmF1bHRMb2NhbGUoe1xuICB0aG91c2FuZHM6IFwiLFwiLFxuICBncm91cGluZzogWzNdLFxuICBjdXJyZW5jeTogW1wiJFwiLCBcIlwiXVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlZmF1bHRMb2NhbGUoZGVmaW5pdGlvbikge1xuICBsb2NhbGUgPSBmb3JtYXRMb2NhbGUoZGVmaW5pdGlvbik7XG4gIGZvcm1hdCA9IGxvY2FsZS5mb3JtYXQ7XG4gIGZvcm1hdFByZWZpeCA9IGxvY2FsZS5mb3JtYXRQcmVmaXg7XG4gIHJldHVybiBsb2NhbGU7XG59XG4iLCJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4ID0gZm9ybWF0RGVjaW1hbFBhcnRzKE1hdGguYWJzKHgpKSwgeCA/IHhbMV0gOiBOYU47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBNYXRoLmFicyh4ID0gTWF0aC5yb3VuZCh4KSkgPj0gMWUyMVxuICAgICAgPyB4LnRvTG9jYWxlU3RyaW5nKFwiZW5cIikucmVwbGFjZSgvLC9nLCBcIlwiKVxuICAgICAgOiB4LnRvU3RyaW5nKDEwKTtcbn1cblxuLy8gQ29tcHV0ZXMgdGhlIGRlY2ltYWwgY29lZmZpY2llbnQgYW5kIGV4cG9uZW50IG9mIHRoZSBzcGVjaWZpZWQgbnVtYmVyIHggd2l0aFxuLy8gc2lnbmlmaWNhbnQgZGlnaXRzIHAsIHdoZXJlIHggaXMgcG9zaXRpdmUgYW5kIHAgaXMgaW4gWzEsIDIxXSBvciB1bmRlZmluZWQuXG4vLyBGb3IgZXhhbXBsZSwgZm9ybWF0RGVjaW1hbFBhcnRzKDEuMjMpIHJldHVybnMgW1wiMTIzXCIsIDBdLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKSB7XG4gIGlmICgoaSA9ICh4ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZihcImVcIikpIDwgMCkgcmV0dXJuIG51bGw7IC8vIE5hTiwgwrFJbmZpbml0eVxuICB2YXIgaSwgY29lZmZpY2llbnQgPSB4LnNsaWNlKDAsIGkpO1xuXG4gIC8vIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdG9FeHBvbmVudGlhbCBlaXRoZXIgaGFzIHRoZSBmb3JtIFxcZFxcLlxcZCtlWy0rXVxcZCtcbiAgLy8gKGUuZy4sIDEuMmUrMykgb3IgdGhlIGZvcm0gXFxkZVstK11cXGQrIChlLmcuLCAxZSszKS5cbiAgcmV0dXJuIFtcbiAgICBjb2VmZmljaWVudC5sZW5ndGggPiAxID8gY29lZmZpY2llbnRbMF0gKyBjb2VmZmljaWVudC5zbGljZSgyKSA6IGNvZWZmaWNpZW50LFxuICAgICt4LnNsaWNlKGkgKyAxKVxuICBdO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZ3JvdXBpbmcsIHRob3VzYW5kcykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIHdpZHRoKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5sZW5ndGgsXG4gICAgICAgIHQgPSBbXSxcbiAgICAgICAgaiA9IDAsXG4gICAgICAgIGcgPSBncm91cGluZ1swXSxcbiAgICAgICAgbGVuZ3RoID0gMDtcblxuICAgIHdoaWxlIChpID4gMCAmJiBnID4gMCkge1xuICAgICAgaWYgKGxlbmd0aCArIGcgKyAxID4gd2lkdGgpIGcgPSBNYXRoLm1heCgxLCB3aWR0aCAtIGxlbmd0aCk7XG4gICAgICB0LnB1c2godmFsdWUuc3Vic3RyaW5nKGkgLT0gZywgaSArIGcpKTtcbiAgICAgIGlmICgobGVuZ3RoICs9IGcgKyAxKSA+IHdpZHRoKSBicmVhaztcbiAgICAgIGcgPSBncm91cGluZ1tqID0gKGogKyAxKSAlIGdyb3VwaW5nLmxlbmd0aF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHQucmV2ZXJzZSgpLmpvaW4odGhvdXNhbmRzKTtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG51bWVyYWxzKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bMC05XS9nLCBmdW5jdGlvbihpKSB7XG4gICAgICByZXR1cm4gbnVtZXJhbHNbK2ldO1xuICAgIH0pO1xuICB9O1xufVxuIiwiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IHZhciBwcmVmaXhFeHBvbmVudDtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgcCkge1xuICB2YXIgZCA9IGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKTtcbiAgaWYgKCFkKSByZXR1cm4geCArIFwiXCI7XG4gIHZhciBjb2VmZmljaWVudCA9IGRbMF0sXG4gICAgICBleHBvbmVudCA9IGRbMV0sXG4gICAgICBpID0gZXhwb25lbnQgLSAocHJlZml4RXhwb25lbnQgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCAvIDMpKSkgKiAzKSArIDEsXG4gICAgICBuID0gY29lZmZpY2llbnQubGVuZ3RoO1xuICByZXR1cm4gaSA9PT0gbiA/IGNvZWZmaWNpZW50XG4gICAgICA6IGkgPiBuID8gY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoaSAtIG4gKyAxKS5qb2luKFwiMFwiKVxuICAgICAgOiBpID4gMCA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGkpICsgXCIuXCIgKyBjb2VmZmljaWVudC5zbGljZShpKVxuICAgICAgOiBcIjAuXCIgKyBuZXcgQXJyYXkoMSAtIGkpLmpvaW4oXCIwXCIpICsgZm9ybWF0RGVjaW1hbFBhcnRzKHgsIE1hdGgubWF4KDAsIHAgKyBpIC0gMSkpWzBdOyAvLyBsZXNzIHRoYW4gMXkhXG59XG4iLCJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCBwKSB7XG4gIHZhciBkID0gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApO1xuICBpZiAoIWQpIHJldHVybiB4ICsgXCJcIjtcbiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSxcbiAgICAgIGV4cG9uZW50ID0gZFsxXTtcbiAgcmV0dXJuIGV4cG9uZW50IDwgMCA/IFwiMC5cIiArIG5ldyBBcnJheSgtZXhwb25lbnQpLmpvaW4oXCIwXCIpICsgY29lZmZpY2llbnRcbiAgICAgIDogY29lZmZpY2llbnQubGVuZ3RoID4gZXhwb25lbnQgKyAxID8gY29lZmZpY2llbnQuc2xpY2UoMCwgZXhwb25lbnQgKyAxKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoZXhwb25lbnQgKyAxKVxuICAgICAgOiBjb2VmZmljaWVudCArIG5ldyBBcnJheShleHBvbmVudCAtIGNvZWZmaWNpZW50Lmxlbmd0aCArIDIpLmpvaW4oXCIwXCIpO1xufVxuIiwiLy8gW1tmaWxsXWFsaWduXVtzaWduXVtzeW1ib2xdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt+XVt0eXBlXVxudmFyIHJlID0gL14oPzooLik/KFs8Pj1eXSkpPyhbK1xcLSggXSk/KFskI10pPygwKT8oXFxkKyk/KCwpPyhcXC5cXGQrKT8ofik/KFthLXolXSk/JC9pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7XG4gIGlmICghKG1hdGNoID0gcmUuZXhlYyhzcGVjaWZpZXIpKSkgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmb3JtYXQ6IFwiICsgc3BlY2lmaWVyKTtcbiAgdmFyIG1hdGNoO1xuICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmllcih7XG4gICAgZmlsbDogbWF0Y2hbMV0sXG4gICAgYWxpZ246IG1hdGNoWzJdLFxuICAgIHNpZ246IG1hdGNoWzNdLFxuICAgIHN5bWJvbDogbWF0Y2hbNF0sXG4gICAgemVybzogbWF0Y2hbNV0sXG4gICAgd2lkdGg6IG1hdGNoWzZdLFxuICAgIGNvbW1hOiBtYXRjaFs3XSxcbiAgICBwcmVjaXNpb246IG1hdGNoWzhdICYmIG1hdGNoWzhdLnNsaWNlKDEpLFxuICAgIHRyaW06IG1hdGNoWzldLFxuICAgIHR5cGU6IG1hdGNoWzEwXVxuICB9KTtcbn1cblxuZm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZSA9IEZvcm1hdFNwZWNpZmllci5wcm90b3R5cGU7IC8vIGluc3RhbmNlb2ZcblxuZXhwb3J0IGZ1bmN0aW9uIEZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgdGhpcy5maWxsID0gc3BlY2lmaWVyLmZpbGwgPT09IHVuZGVmaW5lZCA/IFwiIFwiIDogc3BlY2lmaWVyLmZpbGwgKyBcIlwiO1xuICB0aGlzLmFsaWduID0gc3BlY2lmaWVyLmFsaWduID09PSB1bmRlZmluZWQgPyBcIj5cIiA6IHNwZWNpZmllci5hbGlnbiArIFwiXCI7XG4gIHRoaXMuc2lnbiA9IHNwZWNpZmllci5zaWduID09PSB1bmRlZmluZWQgPyBcIi1cIiA6IHNwZWNpZmllci5zaWduICsgXCJcIjtcbiAgdGhpcy5zeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sID09PSB1bmRlZmluZWQgPyBcIlwiIDogc3BlY2lmaWVyLnN5bWJvbCArIFwiXCI7XG4gIHRoaXMuemVybyA9ICEhc3BlY2lmaWVyLnplcm87XG4gIHRoaXMud2lkdGggPSBzcGVjaWZpZXIud2lkdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIud2lkdGg7XG4gIHRoaXMuY29tbWEgPSAhIXNwZWNpZmllci5jb21tYTtcbiAgdGhpcy5wcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiArc3BlY2lmaWVyLnByZWNpc2lvbjtcbiAgdGhpcy50cmltID0gISFzcGVjaWZpZXIudHJpbTtcbiAgdGhpcy50eXBlID0gc3BlY2lmaWVyLnR5cGUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBzcGVjaWZpZXIudHlwZSArIFwiXCI7XG59XG5cbkZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZmlsbFxuICAgICAgKyB0aGlzLmFsaWduXG4gICAgICArIHRoaXMuc2lnblxuICAgICAgKyB0aGlzLnN5bWJvbFxuICAgICAgKyAodGhpcy56ZXJvID8gXCIwXCIgOiBcIlwiKVxuICAgICAgKyAodGhpcy53aWR0aCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IE1hdGgubWF4KDEsIHRoaXMud2lkdGggfCAwKSlcbiAgICAgICsgKHRoaXMuY29tbWEgPyBcIixcIiA6IFwiXCIpXG4gICAgICArICh0aGlzLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IFwiLlwiICsgTWF0aC5tYXgoMCwgdGhpcy5wcmVjaXNpb24gfCAwKSlcbiAgICAgICsgKHRoaXMudHJpbSA/IFwiflwiIDogXCJcIilcbiAgICAgICsgdGhpcy50eXBlO1xufTtcbiIsIi8vIFRyaW1zIGluc2lnbmlmaWNhbnQgemVyb3MsIGUuZy4sIHJlcGxhY2VzIDEuMjAwMGsgd2l0aCAxLjJrLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocykge1xuICBvdXQ6IGZvciAodmFyIG4gPSBzLmxlbmd0aCwgaSA9IDEsIGkwID0gLTEsIGkxOyBpIDwgbjsgKytpKSB7XG4gICAgc3dpdGNoIChzW2ldKSB7XG4gICAgICBjYXNlIFwiLlwiOiBpMCA9IGkxID0gaTsgYnJlYWs7XG4gICAgICBjYXNlIFwiMFwiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IGlmICghK3NbaV0pIGJyZWFrIG91dDsgaWYgKGkwID4gMCkgaTAgPSAwOyBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGkwID4gMCA/IHMuc2xpY2UoMCwgaTApICsgcy5zbGljZShpMSArIDEpIDogcztcbn1cbiIsImltcG9ydCBmb3JtYXREZWNpbWFsIGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcbmltcG9ydCBmb3JtYXRQcmVmaXhBdXRvIGZyb20gXCIuL2Zvcm1hdFByZWZpeEF1dG8uanNcIjtcbmltcG9ydCBmb3JtYXRSb3VuZGVkIGZyb20gXCIuL2Zvcm1hdFJvdW5kZWQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBcIiVcIjogKHgsIHApID0+ICh4ICogMTAwKS50b0ZpeGVkKHApLFxuICBcImJcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMiksXG4gIFwiY1wiOiAoeCkgPT4geCArIFwiXCIsXG4gIFwiZFwiOiBmb3JtYXREZWNpbWFsLFxuICBcImVcIjogKHgsIHApID0+IHgudG9FeHBvbmVudGlhbChwKSxcbiAgXCJmXCI6ICh4LCBwKSA9PiB4LnRvRml4ZWQocCksXG4gIFwiZ1wiOiAoeCwgcCkgPT4geC50b1ByZWNpc2lvbihwKSxcbiAgXCJvXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDgpLFxuICBcInBcIjogKHgsIHApID0+IGZvcm1hdFJvdW5kZWQoeCAqIDEwMCwgcCksXG4gIFwiclwiOiBmb3JtYXRSb3VuZGVkLFxuICBcInNcIjogZm9ybWF0UHJlZml4QXV0byxcbiAgXCJYXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLFxuICBcInhcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpXG59O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn1cbiIsImltcG9ydCBleHBvbmVudCBmcm9tIFwiLi9leHBvbmVudC5qc1wiO1xuaW1wb3J0IGZvcm1hdEdyb3VwIGZyb20gXCIuL2Zvcm1hdEdyb3VwLmpzXCI7XG5pbXBvcnQgZm9ybWF0TnVtZXJhbHMgZnJvbSBcIi4vZm9ybWF0TnVtZXJhbHMuanNcIjtcbmltcG9ydCBmb3JtYXRTcGVjaWZpZXIgZnJvbSBcIi4vZm9ybWF0U3BlY2lmaWVyLmpzXCI7XG5pbXBvcnQgZm9ybWF0VHJpbSBmcm9tIFwiLi9mb3JtYXRUcmltLmpzXCI7XG5pbXBvcnQgZm9ybWF0VHlwZXMgZnJvbSBcIi4vZm9ybWF0VHlwZXMuanNcIjtcbmltcG9ydCB7cHJlZml4RXhwb25lbnR9IGZyb20gXCIuL2Zvcm1hdFByZWZpeEF1dG8uanNcIjtcbmltcG9ydCBpZGVudGl0eSBmcm9tIFwiLi9pZGVudGl0eS5qc1wiO1xuXG52YXIgbWFwID0gQXJyYXkucHJvdG90eXBlLm1hcCxcbiAgICBwcmVmaXhlcyA9IFtcInlcIixcInpcIixcImFcIixcImZcIixcInBcIixcIm5cIixcIsK1XCIsXCJtXCIsXCJcIixcImtcIixcIk1cIixcIkdcIixcIlRcIixcIlBcIixcIkVcIixcIlpcIixcIllcIl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGxvY2FsZSkge1xuICB2YXIgZ3JvdXAgPSBsb2NhbGUuZ3JvdXBpbmcgPT09IHVuZGVmaW5lZCB8fCBsb2NhbGUudGhvdXNhbmRzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSA6IGZvcm1hdEdyb3VwKG1hcC5jYWxsKGxvY2FsZS5ncm91cGluZywgTnVtYmVyKSwgbG9jYWxlLnRob3VzYW5kcyArIFwiXCIpLFxuICAgICAgY3VycmVuY3lQcmVmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBsb2NhbGUuY3VycmVuY3lbMF0gKyBcIlwiLFxuICAgICAgY3VycmVuY3lTdWZmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBsb2NhbGUuY3VycmVuY3lbMV0gKyBcIlwiLFxuICAgICAgZGVjaW1hbCA9IGxvY2FsZS5kZWNpbWFsID09PSB1bmRlZmluZWQgPyBcIi5cIiA6IGxvY2FsZS5kZWNpbWFsICsgXCJcIixcbiAgICAgIG51bWVyYWxzID0gbG9jYWxlLm51bWVyYWxzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSA6IGZvcm1hdE51bWVyYWxzKG1hcC5jYWxsKGxvY2FsZS5udW1lcmFscywgU3RyaW5nKSksXG4gICAgICBwZXJjZW50ID0gbG9jYWxlLnBlcmNlbnQgPT09IHVuZGVmaW5lZCA/IFwiJVwiIDogbG9jYWxlLnBlcmNlbnQgKyBcIlwiLFxuICAgICAgbWludXMgPSBsb2NhbGUubWludXMgPT09IHVuZGVmaW5lZCA/IFwi4oiSXCIgOiBsb2NhbGUubWludXMgKyBcIlwiLFxuICAgICAgbmFuID0gbG9jYWxlLm5hbiA9PT0gdW5kZWZpbmVkID8gXCJOYU5cIiA6IGxvY2FsZS5uYW4gKyBcIlwiO1xuXG4gIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIpIHtcbiAgICBzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKTtcblxuICAgIHZhciBmaWxsID0gc3BlY2lmaWVyLmZpbGwsXG4gICAgICAgIGFsaWduID0gc3BlY2lmaWVyLmFsaWduLFxuICAgICAgICBzaWduID0gc3BlY2lmaWVyLnNpZ24sXG4gICAgICAgIHN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wsXG4gICAgICAgIHplcm8gPSBzcGVjaWZpZXIuemVybyxcbiAgICAgICAgd2lkdGggPSBzcGVjaWZpZXIud2lkdGgsXG4gICAgICAgIGNvbW1hID0gc3BlY2lmaWVyLmNvbW1hLFxuICAgICAgICBwcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uLFxuICAgICAgICB0cmltID0gc3BlY2lmaWVyLnRyaW0sXG4gICAgICAgIHR5cGUgPSBzcGVjaWZpZXIudHlwZTtcblxuICAgIC8vIFRoZSBcIm5cIiB0eXBlIGlzIGFuIGFsaWFzIGZvciBcIixnXCIuXG4gICAgaWYgKHR5cGUgPT09IFwiblwiKSBjb21tYSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIFRoZSBcIlwiIHR5cGUsIGFuZCBhbnkgaW52YWxpZCB0eXBlLCBpcyBhbiBhbGlhcyBmb3IgXCIuMTJ+Z1wiLlxuICAgIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgcHJlY2lzaW9uID09PSB1bmRlZmluZWQgJiYgKHByZWNpc2lvbiA9IDEyKSwgdHJpbSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBhZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLlxuICAgIGlmICh6ZXJvIHx8IChmaWxsID09PSBcIjBcIiAmJiBhbGlnbiA9PT0gXCI9XCIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9IFwiMFwiLCBhbGlnbiA9IFwiPVwiO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgLy8gRm9yIFNJLXByZWZpeCwgdGhlIHN1ZmZpeCBpcyBsYXppbHkgY29tcHV0ZWQuXG4gICAgdmFyIHByZWZpeCA9IHN5bWJvbCA9PT0gXCIkXCIgPyBjdXJyZW5jeVByZWZpeCA6IHN5bWJvbCA9PT0gXCIjXCIgJiYgL1tib3hYXS8udGVzdCh0eXBlKSA/IFwiMFwiICsgdHlwZS50b0xvd2VyQ2FzZSgpIDogXCJcIixcbiAgICAgICAgc3VmZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5U3VmZml4IDogL1slcF0vLnRlc3QodHlwZSkgPyBwZXJjZW50IDogXCJcIjtcblxuICAgIC8vIFdoYXQgZm9ybWF0IGZ1bmN0aW9uIHNob3VsZCB3ZSB1c2U/XG4gICAgLy8gSXMgdGhpcyBhbiBpbnRlZ2VyIHR5cGU/XG4gICAgLy8gQ2FuIHRoaXMgdHlwZSBnZW5lcmF0ZSBleHBvbmVudGlhbCBub3RhdGlvbj9cbiAgICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdFR5cGVzW3R5cGVdLFxuICAgICAgICBtYXliZVN1ZmZpeCA9IC9bZGVmZ3BycyVdLy50ZXN0KHR5cGUpO1xuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0IHByZWNpc2lvbiBpZiBub3Qgc3BlY2lmaWVkLFxuICAgIC8vIG9yIGNsYW1wIHRoZSBzcGVjaWZpZWQgcHJlY2lzaW9uIHRvIHRoZSBzdXBwb3J0ZWQgcmFuZ2UuXG4gICAgLy8gRm9yIHNpZ25pZmljYW50IHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMSwgMjFdLlxuICAgIC8vIEZvciBmaXhlZCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzAsIDIwXS5cbiAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IDZcbiAgICAgICAgOiAvW2dwcnNdLy50ZXN0KHR5cGUpID8gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpXG4gICAgICAgIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpO1xuXG4gICAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlKSB7XG4gICAgICB2YXIgdmFsdWVQcmVmaXggPSBwcmVmaXgsXG4gICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsXG4gICAgICAgICAgaSwgbiwgYztcblxuICAgICAgaWYgKHR5cGUgPT09IFwiY1wiKSB7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gZm9ybWF0VHlwZSh2YWx1ZSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgdmFsdWUgPSBcIlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSArdmFsdWU7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBzaWduLiAtMCBpcyBub3QgbGVzcyB0aGFuIDAsIGJ1dCAxIC8gLTAgaXMhXG4gICAgICAgIHZhciB2YWx1ZU5lZ2F0aXZlID0gdmFsdWUgPCAwIHx8IDEgLyB2YWx1ZSA8IDA7XG5cbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgaW5pdGlhbCBmb3JtYXR0aW5nLlxuICAgICAgICB2YWx1ZSA9IGlzTmFOKHZhbHVlKSA/IG5hbiA6IGZvcm1hdFR5cGUoTWF0aC5hYnModmFsdWUpLCBwcmVjaXNpb24pO1xuXG4gICAgICAgIC8vIFRyaW0gaW5zaWduaWZpY2FudCB6ZXJvcy5cbiAgICAgICAgaWYgKHRyaW0pIHZhbHVlID0gZm9ybWF0VHJpbSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gSWYgYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgdG8gemVybyBhZnRlciBmb3JtYXR0aW5nLCBhbmQgbm8gZXhwbGljaXQgcG9zaXRpdmUgc2lnbiBpcyByZXF1ZXN0ZWQsIGhpZGUgdGhlIHNpZ24uXG4gICAgICAgIGlmICh2YWx1ZU5lZ2F0aXZlICYmICt2YWx1ZSA9PT0gMCAmJiBzaWduICE9PSBcIitcIikgdmFsdWVOZWdhdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICAgICAgICB2YWx1ZVByZWZpeCA9ICh2YWx1ZU5lZ2F0aXZlID8gKHNpZ24gPT09IFwiKFwiID8gc2lnbiA6IG1pbnVzKSA6IHNpZ24gPT09IFwiLVwiIHx8IHNpZ24gPT09IFwiKFwiID8gXCJcIiA6IHNpZ24pICsgdmFsdWVQcmVmaXg7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gKHR5cGUgPT09IFwic1wiID8gcHJlZml4ZXNbOCArIHByZWZpeEV4cG9uZW50IC8gM10gOiBcIlwiKSArIHZhbHVlU3VmZml4ICsgKHZhbHVlTmVnYXRpdmUgJiYgc2lnbiA9PT0gXCIoXCIgPyBcIilcIiA6IFwiXCIpO1xuXG4gICAgICAgIC8vIEJyZWFrIHRoZSBmb3JtYXR0ZWQgdmFsdWUgaW50byB0aGUgaW50ZWdlciDigJx2YWx1ZeKAnSBwYXJ0IHRoYXQgY2FuIGJlXG4gICAgICAgIC8vIGdyb3VwZWQsIGFuZCBmcmFjdGlvbmFsIG9yIGV4cG9uZW50aWFsIOKAnHN1ZmZpeOKAnSBwYXJ0IHRoYXQgaXMgbm90LlxuICAgICAgICBpZiAobWF5YmVTdWZmaXgpIHtcbiAgICAgICAgICBpID0gLTEsIG4gPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICAgIGlmIChjID0gdmFsdWUuY2hhckNvZGVBdChpKSwgNDggPiBjIHx8IGMgPiA1Nykge1xuICAgICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IChjID09PSA0NiA/IGRlY2ltYWwgKyB2YWx1ZS5zbGljZShpICsgMSkgOiB2YWx1ZS5zbGljZShpKSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBub3QgXCIwXCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuXG4gICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTtcblxuICAgICAgLy8gQ29tcHV0ZSB0aGUgcGFkZGluZy5cbiAgICAgIHZhciBsZW5ndGggPSB2YWx1ZVByZWZpeC5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKyB2YWx1ZVN1ZmZpeC5sZW5ndGgsXG4gICAgICAgICAgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6IFwiXCI7XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBcIjBcIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBhZnRlciBwYWRkaW5nLlxuICAgICAgaWYgKGNvbW1hICYmIHplcm8pIHZhbHVlID0gZ3JvdXAocGFkZGluZyArIHZhbHVlLCBwYWRkaW5nLmxlbmd0aCA/IHdpZHRoIC0gdmFsdWVTdWZmaXgubGVuZ3RoIDogSW5maW5pdHkpLCBwYWRkaW5nID0gXCJcIjtcblxuICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuXG4gICAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICAgIGNhc2UgXCI8XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZzsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCI9XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyBwYWRkaW5nICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJeXCI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudW1lcmFscyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9ybWF0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3BlY2lmaWVyICsgXCJcIjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKSB7XG4gICAgdmFyIGYgPSBuZXdGb3JtYXQoKHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpLCBzcGVjaWZpZXIudHlwZSA9IFwiZlwiLCBzcGVjaWZpZXIpKSxcbiAgICAgICAgZSA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50KHZhbHVlKSAvIDMpKSkgKiAzLFxuICAgICAgICBrID0gTWF0aC5wb3coMTAsIC1lKSxcbiAgICAgICAgcHJlZml4ID0gcHJlZml4ZXNbOCArIGUgLyAzXTtcbiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBmKGsgKiB2YWx1ZSkgKyBwcmVmaXg7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0OiBuZXdGb3JtYXQsXG4gICAgZm9ybWF0UHJlZml4OiBmb3JtYXRQcmVmaXhcbiAgfTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHtcbiAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxO1xuICByZXR1cm4gKCgxIC0gMyAqIHQxICsgMyAqIHQyIC0gdDMpICogdjBcbiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjFcbiAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjJcbiAgICAgICsgdDMgKiB2MykgLyA2O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQgPD0gMCA/ICh0ID0gMCkgOiB0ID49IDEgPyAodCA9IDEsIG4gLSAxKSA6IE1hdGguZmxvb3IodCAqIG4pLFxuICAgICAgICB2MSA9IHZhbHVlc1tpXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbaSArIDFdLFxuICAgICAgICB2MCA9IGkgPiAwID8gdmFsdWVzW2kgLSAxXSA6IDIgKiB2MSAtIHYyLFxuICAgICAgICB2MyA9IGkgPCBuIC0gMSA/IHZhbHVlc1tpICsgMl0gOiAyICogdjIgLSB2MTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCJpbXBvcnQge2Jhc2lzfSBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gTWF0aC5mbG9vcigoKHQgJT0gMSkgPCAwID8gKyt0IDogdCkgKiBuKSxcbiAgICAgICAgdjAgPSB2YWx1ZXNbKGkgKyBuIC0gMSkgJSBuXSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaSAlIG5dLFxuICAgICAgICB2MiA9IHZhbHVlc1soaSArIDEpICUgbl0sXG4gICAgICAgIHYzID0gdmFsdWVzWyhpICsgMikgJSBuXTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gbGluZWFyKGEsIGQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSArIHQgKiBkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7XG4gIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHVlKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdhbW1hKHkpIHtcbiAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbChhLCBiLCB5KSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsImltcG9ydCB7bGFiIGFzIGNvbG9yTGFifSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBjb2xvciBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsYWIoc3RhcnQsIGVuZCkge1xuICB2YXIgbCA9IGNvbG9yKChzdGFydCA9IGNvbG9yTGFiKHN0YXJ0KSkubCwgKGVuZCA9IGNvbG9yTGFiKGVuZCkpLmwpLFxuICAgICAgYSA9IGNvbG9yKHN0YXJ0LmEsIGVuZC5hKSxcbiAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksXG4gICAgICBvcGFjaXR5ID0gY29sb3Ioc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHN0YXJ0LmwgPSBsKHQpO1xuICAgIHN0YXJ0LmEgPSBhKHQpO1xuICAgIHN0YXJ0LmIgPSBiKHQpO1xuICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgIHJldHVybiBzdGFydCArIFwiXCI7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICogKDEgLSB0KSArIGIgKiB0O1xuICB9O1xufVxuIiwiaW1wb3J0IHtyZ2IgYXMgY29sb3JSZ2J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGJhc2lzIGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5pbXBvcnQgYmFzaXNDbG9zZWQgZnJvbSBcIi4vYmFzaXNDbG9zZWQuanNcIjtcbmltcG9ydCBub2dhbW1hLCB7Z2FtbWF9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiByZ2JHYW1tYSh5KSB7XG4gIHZhciBjb2xvciA9IGdhbW1hKHkpO1xuXG4gIGZ1bmN0aW9uIHJnYihzdGFydCwgZW5kKSB7XG4gICAgdmFyIHIgPSBjb2xvcigoc3RhcnQgPSBjb2xvclJnYihzdGFydCkpLnIsIChlbmQgPSBjb2xvclJnYihlbmQpKS5yKSxcbiAgICAgICAgZyA9IGNvbG9yKHN0YXJ0LmcsIGVuZC5nKSxcbiAgICAgICAgYiA9IGNvbG9yKHN0YXJ0LmIsIGVuZC5iKSxcbiAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBzdGFydC5yID0gcih0KTtcbiAgICAgIHN0YXJ0LmcgPSBnKHQpO1xuICAgICAgc3RhcnQuYiA9IGIodCk7XG4gICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICAgIHJldHVybiBzdGFydCArIFwiXCI7XG4gICAgfTtcbiAgfVxuXG4gIHJnYi5nYW1tYSA9IHJnYkdhbW1hO1xuXG4gIHJldHVybiByZ2I7XG59KSgxKTtcblxuZnVuY3Rpb24gcmdiU3BsaW5lKHNwbGluZSkge1xuICByZXR1cm4gZnVuY3Rpb24oY29sb3JzKSB7XG4gICAgdmFyIG4gPSBjb2xvcnMubGVuZ3RoLFxuICAgICAgICByID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBnID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBiID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBpLCBjb2xvcjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBjb2xvciA9IGNvbG9yUmdiKGNvbG9yc1tpXSk7XG4gICAgICByW2ldID0gY29sb3IuciB8fCAwO1xuICAgICAgZ1tpXSA9IGNvbG9yLmcgfHwgMDtcbiAgICAgIGJbaV0gPSBjb2xvci5iIHx8IDA7XG4gICAgfVxuICAgIHIgPSBzcGxpbmUocik7XG4gICAgZyA9IHNwbGluZShnKTtcbiAgICBiID0gc3BsaW5lKGIpO1xuICAgIGNvbG9yLm9wYWNpdHkgPSAxO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBjb2xvci5yID0gcih0KTtcbiAgICAgIGNvbG9yLmcgPSBnKHQpO1xuICAgICAgY29sb3IuYiA9IGIodCk7XG4gICAgICByZXR1cm4gY29sb3IgKyBcIlwiO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB2YXIgcmdiQmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMpO1xuZXhwb3J0IHZhciByZ2JCYXNpc0Nsb3NlZCA9IHJnYlNwbGluZShiYXNpc0Nsb3NlZCk7XG4iLCJpbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuXG52YXIgcmVBID0gL1stK10/KD86XFxkK1xcLj9cXGQqfFxcLj9cXGQrKSg/OltlRV1bLStdP1xcZCspPy9nLFxuICAgIHJlQiA9IG5ldyBSZWdFeHAocmVBLnNvdXJjZSwgXCJnXCIpO1xuXG5mdW5jdGlvbiB6ZXJvKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBiO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbmUoYikge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBiKHQpICsgXCJcIjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYmkgPSByZUEubGFzdEluZGV4ID0gcmVCLmxhc3RJbmRleCA9IDAsIC8vIHNjYW4gaW5kZXggZm9yIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGFtLCAvLyBjdXJyZW50IG1hdGNoIGluIGFcbiAgICAgIGJtLCAvLyBjdXJyZW50IG1hdGNoIGluIGJcbiAgICAgIGJzLCAvLyBzdHJpbmcgcHJlY2VkaW5nIGN1cnJlbnQgbnVtYmVyIGluIGIsIGlmIGFueVxuICAgICAgaSA9IC0xLCAvLyBpbmRleCBpbiBzXG4gICAgICBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9yc1xuXG4gIC8vIENvZXJjZSBpbnB1dHMgdG8gc3RyaW5ncy5cbiAgYSA9IGEgKyBcIlwiLCBiID0gYiArIFwiXCI7XG5cbiAgLy8gSW50ZXJwb2xhdGUgcGFpcnMgb2YgbnVtYmVycyBpbiBhICYgYi5cbiAgd2hpbGUgKChhbSA9IHJlQS5leGVjKGEpKVxuICAgICAgJiYgKGJtID0gcmVCLmV4ZWMoYikpKSB7XG4gICAgaWYgKChicyA9IGJtLmluZGV4KSA+IGJpKSB7IC8vIGEgc3RyaW5nIHByZWNlZGVzIHRoZSBuZXh0IG51bWJlciBpbiBiXG4gICAgICBicyA9IGIuc2xpY2UoYmksIGJzKTtcbiAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgICAgZWxzZSBzWysraV0gPSBicztcbiAgICB9XG4gICAgaWYgKChhbSA9IGFtWzBdKSA9PT0gKGJtID0gYm1bMF0pKSB7IC8vIG51bWJlcnMgaW4gYSAmIGIgbWF0Y2hcbiAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJtOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgICAgZWxzZSBzWysraV0gPSBibTtcbiAgICB9IGVsc2UgeyAvLyBpbnRlcnBvbGF0ZSBub24tbWF0Y2hpbmcgbnVtYmVyc1xuICAgICAgc1srK2ldID0gbnVsbDtcbiAgICAgIHEucHVzaCh7aTogaSwgeDogbnVtYmVyKGFtLCBibSl9KTtcbiAgICB9XG4gICAgYmkgPSByZUIubGFzdEluZGV4O1xuICB9XG5cbiAgLy8gQWRkIHJlbWFpbnMgb2YgYi5cbiAgaWYgKGJpIDwgYi5sZW5ndGgpIHtcbiAgICBicyA9IGIuc2xpY2UoYmkpO1xuICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gIH1cblxuICAvLyBTcGVjaWFsIG9wdGltaXphdGlvbiBmb3Igb25seSBhIHNpbmdsZSBtYXRjaC5cbiAgLy8gT3RoZXJ3aXNlLCBpbnRlcnBvbGF0ZSBlYWNoIG9mIHRoZSBudW1iZXJzIGFuZCByZWpvaW4gdGhlIHN0cmluZy5cbiAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IChxWzBdXG4gICAgICA/IG9uZShxWzBdLngpXG4gICAgICA6IHplcm8oYikpXG4gICAgICA6IChiID0gcS5sZW5ndGgsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbzsgaSA8IGI7ICsraSkgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xuICAgICAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgICAgIH0pO1xufVxuIiwidmFyIGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJO1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0ge1xuICB0cmFuc2xhdGVYOiAwLFxuICB0cmFuc2xhdGVZOiAwLFxuICByb3RhdGU6IDAsXG4gIHNrZXdYOiAwLFxuICBzY2FsZVg6IDEsXG4gIHNjYWxlWTogMVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYiwgYywgZCwgZSwgZikge1xuICB2YXIgc2NhbGVYLCBzY2FsZVksIHNrZXdYO1xuICBpZiAoc2NhbGVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpKSBhIC89IHNjYWxlWCwgYiAvPSBzY2FsZVg7XG4gIGlmIChza2V3WCA9IGEgKiBjICsgYiAqIGQpIGMgLT0gYSAqIHNrZXdYLCBkIC09IGIgKiBza2V3WDtcbiAgaWYgKHNjYWxlWSA9IE1hdGguc3FydChjICogYyArIGQgKiBkKSkgYyAvPSBzY2FsZVksIGQgLz0gc2NhbGVZLCBza2V3WCAvPSBzY2FsZVk7XG4gIGlmIChhICogZCA8IGIgKiBjKSBhID0gLWEsIGIgPSAtYiwgc2tld1ggPSAtc2tld1gsIHNjYWxlWCA9IC1zY2FsZVg7XG4gIHJldHVybiB7XG4gICAgdHJhbnNsYXRlWDogZSxcbiAgICB0cmFuc2xhdGVZOiBmLFxuICAgIHJvdGF0ZTogTWF0aC5hdGFuMihiLCBhKSAqIGRlZ3JlZXMsXG4gICAgc2tld1g6IE1hdGguYXRhbihza2V3WCkgKiBkZWdyZWVzLFxuICAgIHNjYWxlWDogc2NhbGVYLFxuICAgIHNjYWxlWTogc2NhbGVZXG4gIH07XG59XG4iLCJpbXBvcnQgbnVtYmVyIGZyb20gXCIuLi9udW1iZXIuanNcIjtcbmltcG9ydCB7cGFyc2VDc3MsIHBhcnNlU3ZnfSBmcm9tIFwiLi9wYXJzZS5qc1wiO1xuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZSwgcHhDb21tYSwgcHhQYXJlbiwgZGVnUGFyZW4pIHtcblxuICBmdW5jdGlvbiBwb3Aocykge1xuICAgIHJldHVybiBzLmxlbmd0aCA/IHMucG9wKCkgKyBcIiBcIiA6IFwiXCI7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHtcbiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikge1xuICAgICAgdmFyIGkgPSBzLnB1c2goXCJ0cmFuc2xhdGUoXCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pO1xuICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7XG4gICAgfSBlbHNlIGlmICh4YiB8fCB5Yikge1xuICAgICAgcy5wdXNoKFwidHJhbnNsYXRlKFwiICsgeGIgKyBweENvbW1hICsgeWIgKyBweFBhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByb3RhdGUoYSwgYiwgcywgcSkge1xuICAgIGlmIChhICE9PSBiKSB7XG4gICAgICBpZiAoYSAtIGIgPiAxODApIGIgKz0gMzYwOyBlbHNlIGlmIChiIC0gYSA+IDE4MCkgYSArPSAzNjA7IC8vIHNob3J0ZXN0IHBhdGhcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTtcbiAgICB9IGVsc2UgaWYgKGIpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInJvdGF0ZShcIiArIGIgKyBkZWdQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2tld1goYSwgYiwgcywgcSkge1xuICAgIGlmIChhICE9PSBiKSB7XG4gICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyBcInNrZXdYKFwiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTtcbiAgICB9IGVsc2UgaWYgKGIpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInNrZXdYKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzY2FsZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChwb3AocykgKyBcInNjYWxlKFwiLCBudWxsLCBcIixcIiwgbnVsbCwgXCIpXCIpO1xuICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7XG4gICAgfSBlbHNlIGlmICh4YiAhPT0gMSB8fCB5YiAhPT0gMSkge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIgKyB4YiArIFwiLFwiICsgeWIgKyBcIilcIik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9yc1xuICAgIGEgPSBwYXJzZShhKSwgYiA9IHBhcnNlKGIpO1xuICAgIHRyYW5zbGF0ZShhLnRyYW5zbGF0ZVgsIGEudHJhbnNsYXRlWSwgYi50cmFuc2xhdGVYLCBiLnRyYW5zbGF0ZVksIHMsIHEpO1xuICAgIHJvdGF0ZShhLnJvdGF0ZSwgYi5yb3RhdGUsIHMsIHEpO1xuICAgIHNrZXdYKGEuc2tld1gsIGIuc2tld1gsIHMsIHEpO1xuICAgIHNjYWxlKGEuc2NhbGVYLCBhLnNjYWxlWSwgYi5zY2FsZVgsIGIuc2NhbGVZLCBzLCBxKTtcbiAgICBhID0gYiA9IG51bGw7IC8vIGdjXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHZhciBpID0gLTEsIG4gPSBxLmxlbmd0aCwgbztcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZUNzcywgXCJweCwgXCIsIFwicHgpXCIsIFwiZGVnKVwiKTtcbmV4cG9ydCB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZVN2ZywgXCIsIFwiLCBcIilcIiwgXCIpXCIpO1xuIiwiaW1wb3J0IGRlY29tcG9zZSwge2lkZW50aXR5fSBmcm9tIFwiLi9kZWNvbXBvc2UuanNcIjtcblxudmFyIHN2Z05vZGU7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDc3ModmFsdWUpIHtcbiAgY29uc3QgbSA9IG5ldyAodHlwZW9mIERPTU1hdHJpeCA9PT0gXCJmdW5jdGlvblwiID8gRE9NTWF0cml4IDogV2ViS2l0Q1NTTWF0cml4KSh2YWx1ZSArIFwiXCIpO1xuICByZXR1cm4gbS5pc0lkZW50aXR5ID8gaWRlbnRpdHkgOiBkZWNvbXBvc2UobS5hLCBtLmIsIG0uYywgbS5kLCBtLmUsIG0uZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN2Zyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5O1xuICBpZiAoIXN2Z05vZGUpIHN2Z05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gIHN2Z05vZGUuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIHZhbHVlKTtcbiAgaWYgKCEodmFsdWUgPSBzdmdOb2RlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHZhbHVlID0gdmFsdWUubWF0cml4O1xuICByZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsIHZhbHVlLmIsIHZhbHVlLmMsIHZhbHVlLmQsIHZhbHVlLmUsIHZhbHVlLmYpO1xufVxuIiwidmFyIGVwc2lsb24yID0gMWUtMTI7XG5cbmZ1bmN0aW9uIGNvc2goeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjtcbn1cblxuZnVuY3Rpb24gc2luaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgLSAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiB0YW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKDIgKiB4KSkgLSAxKSAvICh4ICsgMSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiB6b29tUmhvKHJobywgcmhvMiwgcmhvNCkge1xuXG4gIC8vIHAwID0gW3V4MCwgdXkwLCB3MF1cbiAgLy8gcDEgPSBbdXgxLCB1eTEsIHcxXVxuICBmdW5jdGlvbiB6b29tKHAwLCBwMSkge1xuICAgIHZhciB1eDAgPSBwMFswXSwgdXkwID0gcDBbMV0sIHcwID0gcDBbMl0sXG4gICAgICAgIHV4MSA9IHAxWzBdLCB1eTEgPSBwMVsxXSwgdzEgPSBwMVsyXSxcbiAgICAgICAgZHggPSB1eDEgLSB1eDAsXG4gICAgICAgIGR5ID0gdXkxIC0gdXkwLFxuICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5LFxuICAgICAgICBpLFxuICAgICAgICBTO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIGZvciB1MCDiiYUgdTEuXG4gICAgaWYgKGQyIDwgZXBzaWxvbjIpIHtcbiAgICAgIFMgPSBNYXRoLmxvZyh3MSAvIHcwKSAvIHJobztcbiAgICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgdXgwICsgdCAqIGR4LFxuICAgICAgICAgIHV5MCArIHQgKiBkeSxcbiAgICAgICAgICB3MCAqIE1hdGguZXhwKHJobyAqIHQgKiBTKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdlbmVyYWwgY2FzZS5cbiAgICBlbHNlIHtcbiAgICAgIHZhciBkMSA9IE1hdGguc3FydChkMiksXG4gICAgICAgICAgYjAgPSAodzEgKiB3MSAtIHcwICogdzAgKyByaG80ICogZDIpIC8gKDIgKiB3MCAqIHJobzIgKiBkMSksXG4gICAgICAgICAgYjEgPSAodzEgKiB3MSAtIHcwICogdzAgLSByaG80ICogZDIpIC8gKDIgKiB3MSAqIHJobzIgKiBkMSksXG4gICAgICAgICAgcjAgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjAgKiBiMCArIDEpIC0gYjApLFxuICAgICAgICAgIHIxID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIxICogYjEgKyAxKSAtIGIxKTtcbiAgICAgIFMgPSAocjEgLSByMCkgLyByaG87XG4gICAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgICB2YXIgcyA9IHQgKiBTLFxuICAgICAgICAgICAgY29zaHIwID0gY29zaChyMCksXG4gICAgICAgICAgICB1ID0gdzAgLyAocmhvMiAqIGQxKSAqIChjb3NocjAgKiB0YW5oKHJobyAqIHMgKyByMCkgLSBzaW5oKHIwKSk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgdXgwICsgdSAqIGR4LFxuICAgICAgICAgIHV5MCArIHUgKiBkeSxcbiAgICAgICAgICB3MCAqIGNvc2hyMCAvIGNvc2gocmhvICogcyArIHIwKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGkuZHVyYXRpb24gPSBTICogMTAwMCAqIHJobyAvIE1hdGguU1FSVDI7XG5cbiAgICByZXR1cm4gaTtcbiAgfVxuXG4gIHpvb20ucmhvID0gZnVuY3Rpb24oXykge1xuICAgIHZhciBfMSA9IE1hdGgubWF4KDFlLTMsICtfKSwgXzIgPSBfMSAqIF8xLCBfNCA9IF8yICogXzI7XG4gICAgcmV0dXJuIHpvb21SaG8oXzEsIF8yLCBfNCk7XG4gIH07XG5cbiAgcmV0dXJuIHpvb207XG59KShNYXRoLlNRUlQyLCAyLCA0KTtcbiIsImV4cG9ydCBkZWZhdWx0IE1hdGgucmFuZG9tO1xuIiwiaW1wb3J0IGRlZmF1bHRTb3VyY2UgZnJvbSBcIi4vZGVmYXVsdFNvdXJjZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gc291cmNlUmFuZG9tTm9ybWFsKHNvdXJjZSkge1xuICBmdW5jdGlvbiByYW5kb21Ob3JtYWwobXUsIHNpZ21hKSB7XG4gICAgdmFyIHgsIHI7XG4gICAgbXUgPSBtdSA9PSBudWxsID8gMCA6ICttdTtcbiAgICBzaWdtYSA9IHNpZ21hID09IG51bGwgPyAxIDogK3NpZ21hO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB5O1xuXG4gICAgICAvLyBJZiBhdmFpbGFibGUsIHVzZSB0aGUgc2Vjb25kIHByZXZpb3VzbHktZ2VuZXJhdGVkIHVuaWZvcm0gcmFuZG9tLlxuICAgICAgaWYgKHggIT0gbnVsbCkgeSA9IHgsIHggPSBudWxsO1xuXG4gICAgICAvLyBPdGhlcndpc2UsIGdlbmVyYXRlIGEgbmV3IHggYW5kIHkuXG4gICAgICBlbHNlIGRvIHtcbiAgICAgICAgeCA9IHNvdXJjZSgpICogMiAtIDE7XG4gICAgICAgIHkgPSBzb3VyY2UoKSAqIDIgLSAxO1xuICAgICAgICByID0geCAqIHggKyB5ICogeTtcbiAgICAgIH0gd2hpbGUgKCFyIHx8IHIgPiAxKTtcblxuICAgICAgcmV0dXJuIG11ICsgc2lnbWEgKiB5ICogTWF0aC5zcXJ0KC0yICogTWF0aC5sb2cocikgLyByKTtcbiAgICB9O1xuICB9XG5cbiAgcmFuZG9tTm9ybWFsLnNvdXJjZSA9IHNvdXJjZVJhbmRvbU5vcm1hbDtcblxuICByZXR1cm4gcmFuZG9tTm9ybWFsO1xufSkoZGVmYXVsdFNvdXJjZSk7XG4iLCJleHBvcnQgZnVuY3Rpb24gaW5pdFJhbmdlKGRvbWFpbiwgcmFuZ2UpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiBicmVhaztcbiAgICBjYXNlIDE6IHRoaXMucmFuZ2UoZG9tYWluKTsgYnJlYWs7XG4gICAgZGVmYXVsdDogdGhpcy5yYW5nZShyYW5nZSkuZG9tYWluKGRvbWFpbik7IGJyZWFrO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdEludGVycG9sYXRvcihkb21haW4sIGludGVycG9sYXRvcikge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IGJyZWFrO1xuICAgIGNhc2UgMToge1xuICAgICAgaWYgKHR5cGVvZiBkb21haW4gPT09IFwiZnVuY3Rpb25cIikgdGhpcy5pbnRlcnBvbGF0b3IoZG9tYWluKTtcbiAgICAgIGVsc2UgdGhpcy5yYW5nZShkb21haW4pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRoaXMuZG9tYWluKGRvbWFpbik7XG4gICAgICBpZiAodHlwZW9mIGludGVycG9sYXRvciA9PT0gXCJmdW5jdGlvblwiKSB0aGlzLmludGVycG9sYXRvcihpbnRlcnBvbGF0b3IpO1xuICAgICAgZWxzZSB0aGlzLnJhbmdlKGludGVycG9sYXRvcik7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJpbXBvcnQge2FzY2VuZGluZywgYmlzZWN0LCBxdWFudGlsZVNvcnRlZCBhcyB0aHJlc2hvbGR9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHtpbml0UmFuZ2V9IGZyb20gXCIuL2luaXQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVhbnRpbGUoKSB7XG4gIHZhciBkb21haW4gPSBbXSxcbiAgICAgIHJhbmdlID0gW10sXG4gICAgICB0aHJlc2hvbGRzID0gW10sXG4gICAgICB1bmtub3duO1xuXG4gIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgdmFyIGkgPSAwLCBuID0gTWF0aC5tYXgoMSwgcmFuZ2UubGVuZ3RoKTtcbiAgICB0aHJlc2hvbGRzID0gbmV3IEFycmF5KG4gLSAxKTtcbiAgICB3aGlsZSAoKytpIDwgbikgdGhyZXNob2xkc1tpIC0gMV0gPSB0aHJlc2hvbGQoZG9tYWluLCBpIC8gbik7XG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgIHJldHVybiB4ID09IG51bGwgfHwgaXNOYU4oeCA9ICt4KSA/IHVua25vd24gOiByYW5nZVtiaXNlY3QodGhyZXNob2xkcywgeCldO1xuICB9XG5cbiAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkge1xuICAgIHZhciBpID0gcmFuZ2UuaW5kZXhPZih5KTtcbiAgICByZXR1cm4gaSA8IDAgPyBbTmFOLCBOYU5dIDogW1xuICAgICAgaSA+IDAgPyB0aHJlc2hvbGRzW2kgLSAxXSA6IGRvbWFpblswXSxcbiAgICAgIGkgPCB0aHJlc2hvbGRzLmxlbmd0aCA/IHRocmVzaG9sZHNbaV0gOiBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdXG4gICAgXTtcbiAgfTtcblxuICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7XG4gICAgZG9tYWluID0gW107XG4gICAgZm9yIChsZXQgZCBvZiBfKSBpZiAoZCAhPSBudWxsICYmICFpc05hTihkID0gK2QpKSBkb21haW4ucHVzaChkKTtcbiAgICBkb21haW4uc29ydChhc2NlbmRpbmcpO1xuICAgIHJldHVybiByZXNjYWxlKCk7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBBcnJheS5mcm9tKF8pLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTtcbiAgfTtcblxuICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duO1xuICB9O1xuXG4gIHNjYWxlLnF1YW50aWxlcyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aHJlc2hvbGRzLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBxdWFudGlsZSgpXG4gICAgICAgIC5kb21haW4oZG9tYWluKVxuICAgICAgICAucmFuZ2UocmFuZ2UpXG4gICAgICAgIC51bmtub3duKHVua25vd24pO1xuICB9O1xuXG4gIHJldHVybiBpbml0UmFuZ2UuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7XG59XG4iLCIvLyBHaXZlbiBzb21ldGhpbmcgYXJyYXkgbGlrZSAob3IgbnVsbCksIHJldHVybnMgc29tZXRoaW5nIHRoYXQgaXMgc3RyaWN0bHkgYW5cbi8vIGFycmF5LiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgYXJyYXktbGlrZSBvYmplY3RzIHBhc3NlZCB0byBkMy5zZWxlY3RBbGxcbi8vIG9yIHNlbGVjdGlvbi5zZWxlY3RBbGwgYXJlIGNvbnZlcnRlZCBpbnRvIHByb3BlciBhcnJheXMgd2hlbiBjcmVhdGluZyBhXG4vLyBzZWxlY3Rpb247IHdlIGRvbuKAmXQgZXZlciB3YW50IHRvIGNyZWF0ZSBhIHNlbGVjdGlvbiBiYWNrZWQgYnkgYSBsaXZlXG4vLyBIVE1MQ29sbGVjdGlvbiBvciBOb2RlTGlzdC4gSG93ZXZlciwgbm90ZSB0aGF0IHNlbGVjdGlvbi5zZWxlY3RBbGwgd2lsbCB1c2UgYVxuLy8gc3RhdGljIE5vZGVMaXN0IGFzIGEgZ3JvdXAsIHNpbmNlIGl0IHNhZmVseSBkZXJpdmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFycmF5KHgpIHtcbiAgcmV0dXJuIHggPT0gbnVsbCA/IFtdIDogQXJyYXkuaXNBcnJheSh4KSA/IHggOiBBcnJheS5mcm9tKHgpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuL25hbWVzcGFjZS5qc1wiO1xuaW1wb3J0IHt4aHRtbH0gZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5mdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQsXG4gICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJO1xuICAgIHJldHVybiB1cmkgPT09IHhodG1sICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IHhodG1sXG4gICAgICAgID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKVxuICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gKGZ1bGxuYW1lLmxvY2FsXG4gICAgICA/IGNyZWF0b3JGaXhlZFxuICAgICAgOiBjcmVhdG9ySW5oZXJpdCkoZnVsbG5hbWUpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoZXMoc2VsZWN0b3IpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hpbGRNYXRjaGVyKHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbiIsImltcG9ydCBuYW1lc3BhY2VzIGZyb20gXCIuL25hbWVzcGFjZXMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgcHJlZml4ID0gbmFtZSArPSBcIlwiLCBpID0gcHJlZml4LmluZGV4T2YoXCI6XCIpO1xuICBpZiAoaSA+PSAwICYmIChwcmVmaXggPSBuYW1lLnNsaWNlKDAsIGkpKSAhPT0gXCJ4bWxuc1wiKSBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7XG4gIHJldHVybiBuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7c3BhY2U6IG5hbWVzcGFjZXNbcHJlZml4XSwgbG9jYWw6IG5hbWV9IDogbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbn1cbiIsImV4cG9ydCB2YXIgeGh0bWwgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBzdmc6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgeGh0bWw6IHhodG1sLFxuICB4bGluazogXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsXG4gIHhtbDogXCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2VcIixcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy9cIlxufTtcbiIsImltcG9ydCBzb3VyY2VFdmVudCBmcm9tIFwiLi9zb3VyY2VFdmVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCwgbm9kZSkge1xuICBldmVudCA9IHNvdXJjZUV2ZW50KGV2ZW50KTtcbiAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkgbm9kZSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gIGlmIChub2RlKSB7XG4gICAgdmFyIHN2ZyA9IG5vZGUub3duZXJTVkdFbGVtZW50IHx8IG5vZGU7XG4gICAgaWYgKHN2Zy5jcmVhdGVTVkdQb2ludCkge1xuICAgICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7XG4gICAgICBwb2ludC54ID0gZXZlbnQuY2xpZW50WCwgcG9pbnQueSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICBwb2ludCA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShub2RlLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG4gICAgICByZXR1cm4gW3BvaW50LngsIHBvaW50LnldO1xuICAgIH1cbiAgICBpZiAobm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHtcbiAgICAgIHZhciByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiBbZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIG5vZGUuY2xpZW50TGVmdCwgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gbm9kZS5jbGllbnRUb3BdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2V2ZW50LnBhZ2VYLCBldmVudC5wYWdlWV07XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbiwgcm9vdH0gZnJvbSBcIi4vc2VsZWN0aW9uL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCJcbiAgICAgID8gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKVxuICAgICAgOiBuZXcgU2VsZWN0aW9uKFtbc2VsZWN0b3JdXSwgcm9vdCk7XG59XG4iLCJpbXBvcnQgY3JlYXRvciBmcm9tIFwiLi4vY3JlYXRvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IG5hbWVzcGFjZSBmcm9tIFwiLi4vbmFtZXNwYWNlLmpzXCI7XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHYpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdik7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpO1xuICAgIHJldHVybiBmdWxsbmFtZS5sb2NhbFxuICAgICAgICA/IG5vZGUuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKVxuICAgICAgICA6IG5vZGUuZ2V0QXR0cmlidXRlKGZ1bGxuYW1lKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pXG4gICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KSkpKGZ1bGxuYW1lLCB2YWx1ZSkpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1swXTtcbiAgYXJndW1lbnRzWzBdID0gdGhpcztcbiAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxcXHMrLyk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKSB7XG4gIHJldHVybiBub2RlLmNsYXNzTGlzdCB8fCBuZXcgQ2xhc3NMaXN0KG5vZGUpO1xufVxuXG5mdW5jdGlvbiBDbGFzc0xpc3Qobm9kZSkge1xuICB0aGlzLl9ub2RlID0gbm9kZTtcbiAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIik7XG59XG5cbkNsYXNzTGlzdC5wcm90b3R5cGUgPSB7XG4gIGFkZDogZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnB1c2gobmFtZSk7XG4gICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG4gIH0sXG4gIHJlbW92ZTogZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5zcGxpY2UoaSwgMSk7XG4gICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG4gIH0sXG4gIGNvbnRhaW5zOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSkgPj0gMDtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2xhc3NlZEFkZChub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5hZGQobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkUmVtb3ZlKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRUcnVlKG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBjbGFzc2VkQWRkKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZEZhbHNlKG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBjbGFzc2VkUmVtb3ZlKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKG5hbWVzLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgKHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgPyBjbGFzc2VkQWRkIDogY2xhc3NlZFJlbW92ZSkodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgbmFtZXMgPSBjbGFzc0FycmF5KG5hbWUgKyBcIlwiKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWVcbiAgICAgID8gY2xhc3NlZFRydWVcbiAgICAgIDogY2xhc3NlZEZhbHNlKShuYW1lcywgdmFsdWUpKTtcbn1cbiIsImZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZVNoYWxsb3coKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lRGVlcCgpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUodHJ1ZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGRlZXApIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCB7RW50ZXJOb2RlfSBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBiaW5kSW5kZXgocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSkge1xuICB2YXIgaSA9IDAsXG4gICAgICBub2RlLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGZpdCBpbnRvIHVwZGF0ZS5cbiAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuXG4gIC8vIFB1dCBhbnkgcmVtYWluaW5nIGRhdGEgaW50byBlbnRlci5cbiAgZm9yICg7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb27igJl0IGZpdCBpbnRvIGV4aXQuXG4gIGZvciAoOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBiaW5kS2V5KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEsIGtleSkge1xuICB2YXIgaSxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlQnlLZXlWYWx1ZSA9IG5ldyBNYXAsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksXG4gICAgICBrZXlWYWx1ZTtcblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS5cbiAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApICsgXCJcIjtcbiAgICAgIGlmIChub2RlQnlLZXlWYWx1ZS5oYXMoa2V5VmFsdWUpKSB7XG4gICAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZUJ5S2V5VmFsdWUuc2V0KGtleVZhbHVlLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uXG4gIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuXG4gIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci5cbiAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGtleVZhbHVlID0ga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKSArIFwiXCI7XG4gICAgaWYgKG5vZGUgPSBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWUpKSB7XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICBub2RlQnlLZXlWYWx1ZS5kZWxldGUoa2V5VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZXNbaV0pID09PSBub2RlKSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRhdHVtKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX19kYXRhX187XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLCBkYXR1bSk7XG5cbiAgdmFyIGJpbmQgPSBrZXkgPyBiaW5kS2V5IDogYmluZEluZGV4LFxuICAgICAgcGFyZW50cyA9IHRoaXMuX3BhcmVudHMsXG4gICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB2YWx1ZSA9IGNvbnN0YW50KHZhbHVlKTtcblxuICBmb3IgKHZhciBtID0gZ3JvdXBzLmxlbmd0aCwgdXBkYXRlID0gbmV3IEFycmF5KG0pLCBlbnRlciA9IG5ldyBBcnJheShtKSwgZXhpdCA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tqXSxcbiAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sXG4gICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgICBkYXRhID0gYXJyYXlsaWtlKHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBwYXJlbnRzKSksXG4gICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICB1cGRhdGVHcm91cCA9IHVwZGF0ZVtqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7XG5cbiAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7XG5cbiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXRcbiAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLFxuICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLlxuICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7XG4gICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkge1xuICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxO1xuICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7XG4gICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTtcbiAgdXBkYXRlLl9lbnRlciA9IGVudGVyO1xuICB1cGRhdGUuX2V4aXQgPSBleGl0O1xuICByZXR1cm4gdXBkYXRlO1xufVxuXG4vLyBHaXZlbiBzb21lIGRhdGEsIHRoaXMgcmV0dXJucyBhbiBhcnJheS1saWtlIHZpZXcgb2YgaXQ6IGFuIG9iamVjdCB0aGF0XG4vLyBleHBvc2VzIGEgbGVuZ3RoIHByb3BlcnR5IGFuZCBhbGxvd3MgbnVtZXJpYyBpbmRleGluZy4gTm90ZSB0aGF0IHVubGlrZVxuLy8gc2VsZWN0QWxsLCB0aGlzIGlzbuKAmXQgd29ycmllZCBhYm91dCDigJxsaXZl4oCdIGNvbGxlY3Rpb25zIGJlY2F1c2UgdGhlIHJlc3VsdGluZ1xuLy8gYXJyYXkgd2lsbCBvbmx5IGJlIHVzZWQgYnJpZWZseSB3aGlsZSBkYXRhIGlzIGJlaW5nIGJvdW5kLiAoSXQgaXMgcG9zc2libGUgdG9cbi8vIGNhdXNlIHRoZSBkYXRhIHRvIGNoYW5nZSB3aGlsZSBpdGVyYXRpbmcgYnkgdXNpbmcgYSBrZXkgZnVuY3Rpb24sIGJ1dCBwbGVhc2Vcbi8vIGRvbuKAmXQ7IHdl4oCZZCByYXRoZXIgYXZvaWQgYSBncmF0dWl0b3VzIGNvcHkuKVxuZnVuY3Rpb24gYXJyYXlsaWtlKGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIFwibGVuZ3RoXCIgaW4gZGF0YVxuICAgID8gZGF0YSAvLyBBcnJheSwgVHlwZWRBcnJheSwgTm9kZUxpc3QsIGFycmF5LWxpa2VcbiAgICA6IEFycmF5LmZyb20oZGF0YSk7IC8vIE1hcCwgU2V0LCBpdGVyYWJsZSwgc3RyaW5nLCBvciBhbnl0aGluZyBlbHNlXG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLnByb3BlcnR5KFwiX19kYXRhX19cIiwgdmFsdWUpXG4gICAgICA6IHRoaXMubm9kZSgpLl9fZGF0YV9fO1xufVxuIiwiaW1wb3J0IGRlZmF1bHRWaWV3IGZyb20gXCIuLi93aW5kb3cuanNcIjtcblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChub2RlLCB0eXBlLCBwYXJhbXMpIHtcbiAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3KG5vZGUpLFxuICAgICAgZXZlbnQgPSB3aW5kb3cuQ3VzdG9tRXZlbnQ7XG5cbiAgaWYgKHR5cGVvZiBldmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTtcbiAgfSBlbHNlIHtcbiAgICBldmVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpO1xuICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsO1xuICAgIGVsc2UgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaENvbnN0YW50KHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hGdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBkaXNwYXRjaEZ1bmN0aW9uXG4gICAgICA6IGRpc3BhdGNoQ29uc3RhbnQpKHR5cGUsIHBhcmFtcykpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2spIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICF0aGlzLm5vZGUoKTtcbn1cbiIsImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlLmpzXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2VudGVyIHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkge1xuICB0aGlzLm93bmVyRG9jdW1lbnQgPSBwYXJlbnQub3duZXJEb2N1bWVudDtcbiAgdGhpcy5uYW1lc3BhY2VVUkkgPSBwYXJlbnQubmFtZXNwYWNlVVJJO1xuICB0aGlzLl9uZXh0ID0gbnVsbDtcbiAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICB0aGlzLl9fZGF0YV9fID0gZGF0dW07XG59XG5cbkVudGVyTm9kZS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUsXG4gIGFwcGVuZENoaWxkOiBmdW5jdGlvbihjaGlsZCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgdGhpcy5fbmV4dCk7IH0sXG4gIGluc2VydEJlZm9yZTogZnVuY3Rpb24oY2hpbGQsIG5leHQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIG5leHQpOyB9LFxuICBxdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9LFxuICBxdWVyeVNlbGVjdG9yQWxsOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOyB9XG59O1xuIiwiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZXhpdCB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgbWF0Y2hlciBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImZ1bmN0aW9uIGh0bWxSZW1vdmUoKSB7XG4gIHRoaXMuaW5uZXJIVE1MID0gXCJcIjtcbn1cblxuZnVuY3Rpb24gaHRtbENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlubmVySFRNTCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBodG1sRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLmlubmVySFRNTCA9IHYgPT0gbnVsbCA/IFwiXCIgOiB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gaHRtbFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gaHRtbEZ1bmN0aW9uXG4gICAgICAgICAgOiBodG1sQ29uc3RhbnQpKHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKCkuaW5uZXJIVE1MO1xufVxuIiwiaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3QgZnJvbSBcIi4vc2VsZWN0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdEFsbCBmcm9tIFwiLi9zZWxlY3RBbGwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0Q2hpbGQgZnJvbSBcIi4vc2VsZWN0Q2hpbGQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0Q2hpbGRyZW4gZnJvbSBcIi4vc2VsZWN0Q2hpbGRyZW4uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZmlsdGVyIGZyb20gXCIuL2ZpbHRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9kYXRhIGZyb20gXCIuL2RhdGEuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZW50ZXIgZnJvbSBcIi4vZW50ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZXhpdCBmcm9tIFwiLi9leGl0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2pvaW4gZnJvbSBcIi4vam9pbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9tZXJnZSBmcm9tIFwiLi9tZXJnZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9vcmRlciBmcm9tIFwiLi9vcmRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zb3J0IGZyb20gXCIuL3NvcnQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2FsbCBmcm9tIFwiLi9jYWxsLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX25vZGVzIGZyb20gXCIuL25vZGVzLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX25vZGUgZnJvbSBcIi4vbm9kZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zaXplIGZyb20gXCIuL3NpemUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZW1wdHkgZnJvbSBcIi4vZW1wdHkuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZWFjaCBmcm9tIFwiLi9lYWNoLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2F0dHIgZnJvbSBcIi4vYXR0ci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zdHlsZSBmcm9tIFwiLi9zdHlsZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9wcm9wZXJ0eSBmcm9tIFwiLi9wcm9wZXJ0eS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jbGFzc2VkIGZyb20gXCIuL2NsYXNzZWQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2h0bWwgZnJvbSBcIi4vaHRtbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9yYWlzZSBmcm9tIFwiLi9yYWlzZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9sb3dlciBmcm9tIFwiLi9sb3dlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9hcHBlbmQgZnJvbSBcIi4vYXBwZW5kLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2luc2VydCBmcm9tIFwiLi9pbnNlcnQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jbG9uZSBmcm9tIFwiLi9jbG9uZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9kYXR1bSBmcm9tIFwiLi9kYXR1bS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9vbiBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9kaXNwYXRjaCBmcm9tIFwiLi9kaXNwYXRjaC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9pdGVyYXRvciBmcm9tIFwiLi9pdGVyYXRvci5qc1wiO1xuXG5leHBvcnQgdmFyIHJvb3QgPSBbbnVsbF07XG5cbmV4cG9ydCBmdW5jdGlvbiBTZWxlY3Rpb24oZ3JvdXBzLCBwYXJlbnRzKSB7XG4gIHRoaXMuX2dyb3VwcyA9IGdyb3VwcztcbiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzO1xufVxuXG5TZWxlY3Rpb24ucHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFNlbGVjdGlvbixcbiAgc2VsZWN0OiBzZWxlY3Rpb25fc2VsZWN0LFxuICBzZWxlY3RBbGw6IHNlbGVjdGlvbl9zZWxlY3RBbGwsXG4gIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fc2VsZWN0Q2hpbGQsXG4gIHNlbGVjdENoaWxkcmVuOiBzZWxlY3Rpb25fc2VsZWN0Q2hpbGRyZW4sXG4gIGZpbHRlcjogc2VsZWN0aW9uX2ZpbHRlcixcbiAgZGF0YTogc2VsZWN0aW9uX2RhdGEsXG4gIGVudGVyOiBzZWxlY3Rpb25fZW50ZXIsXG4gIGV4aXQ6IHNlbGVjdGlvbl9leGl0LFxuICBqb2luOiBzZWxlY3Rpb25fam9pbixcbiAgbWVyZ2U6IHNlbGVjdGlvbl9tZXJnZSxcbiAgc2VsZWN0aW9uOiBzZWxlY3Rpb25fc2VsZWN0aW9uLFxuICBvcmRlcjogc2VsZWN0aW9uX29yZGVyLFxuICBzb3J0OiBzZWxlY3Rpb25fc29ydCxcbiAgY2FsbDogc2VsZWN0aW9uX2NhbGwsXG4gIG5vZGVzOiBzZWxlY3Rpb25fbm9kZXMsXG4gIG5vZGU6IHNlbGVjdGlvbl9ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fc2l6ZSxcbiAgZW1wdHk6IHNlbGVjdGlvbl9lbXB0eSxcbiAgZWFjaDogc2VsZWN0aW9uX2VhY2gsXG4gIGF0dHI6IHNlbGVjdGlvbl9hdHRyLFxuICBzdHlsZTogc2VsZWN0aW9uX3N0eWxlLFxuICBwcm9wZXJ0eTogc2VsZWN0aW9uX3Byb3BlcnR5LFxuICBjbGFzc2VkOiBzZWxlY3Rpb25fY2xhc3NlZCxcbiAgdGV4dDogc2VsZWN0aW9uX3RleHQsXG4gIGh0bWw6IHNlbGVjdGlvbl9odG1sLFxuICByYWlzZTogc2VsZWN0aW9uX3JhaXNlLFxuICBsb3dlcjogc2VsZWN0aW9uX2xvd2VyLFxuICBhcHBlbmQ6IHNlbGVjdGlvbl9hcHBlbmQsXG4gIGluc2VydDogc2VsZWN0aW9uX2luc2VydCxcbiAgcmVtb3ZlOiBzZWxlY3Rpb25fcmVtb3ZlLFxuICBjbG9uZTogc2VsZWN0aW9uX2Nsb25lLFxuICBkYXR1bTogc2VsZWN0aW9uX2RhdHVtLFxuICBvbjogc2VsZWN0aW9uX29uLFxuICBkaXNwYXRjaDogc2VsZWN0aW9uX2Rpc3BhdGNoLFxuICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX2l0ZXJhdG9yXG59O1xuXG5leHBvcnQgZGVmYXVsdCBzZWxlY3Rpb247XG4iLCJpbXBvcnQgY3JlYXRvciBmcm9tIFwiLi4vY3JlYXRvci5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yIGZyb20gXCIuLi9zZWxlY3Rvci5qc1wiO1xuXG5mdW5jdGlvbiBjb25zdGFudE51bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCBiZWZvcmUpIHtcbiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogY3JlYXRvcihuYW1lKSxcbiAgICAgIHNlbGVjdCA9IGJlZm9yZSA9PSBudWxsID8gY29uc3RhbnROdWxsIDogdHlwZW9mIGJlZm9yZSA9PT0gXCJmdW5jdGlvblwiID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24qKCkge1xuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgeWllbGQgbm9kZTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9uZW50ZXIsIG9udXBkYXRlLCBvbmV4aXQpIHtcbiAgdmFyIGVudGVyID0gdGhpcy5lbnRlcigpLCB1cGRhdGUgPSB0aGlzLCBleGl0ID0gdGhpcy5leGl0KCk7XG4gIGlmICh0eXBlb2Ygb25lbnRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZW50ZXIgPSBvbmVudGVyKGVudGVyKTtcbiAgICBpZiAoZW50ZXIpIGVudGVyID0gZW50ZXIuc2VsZWN0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgZW50ZXIgPSBlbnRlci5hcHBlbmQob25lbnRlciArIFwiXCIpO1xuICB9XG4gIGlmIChvbnVwZGF0ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTtcbiAgICBpZiAodXBkYXRlKSB1cGRhdGUgPSB1cGRhdGUuc2VsZWN0aW9uKCk7XG4gIH1cbiAgaWYgKG9uZXhpdCA9PSBudWxsKSBleGl0LnJlbW92ZSgpOyBlbHNlIG9uZXhpdChleGl0KTtcbiAgcmV0dXJuIGVudGVyICYmIHVwZGF0ZSA/IGVudGVyLm1lcmdlKHVwZGF0ZSkub3JkZXIoKSA6IHVwZGF0ZTtcbn1cbiIsImZ1bmN0aW9uIGxvd2VyKCkge1xuICBpZiAodGhpcy5wcmV2aW91c1NpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChsb3dlcik7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICB2YXIgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dDtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTtcbiAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzKTtcbn1cbiIsImZ1bmN0aW9uIGNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lcikge1xuICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50LCB0aGlzLl9fZGF0YV9fKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXModHlwZW5hbWVzKSB7XG4gIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb25SZW1vdmUodHlwZW5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvbiA9IHRoaXMuX19vbjtcbiAgICBpZiAoIW9uKSByZXR1cm47XG4gICAgZm9yICh2YXIgaiA9IDAsIGkgPSAtMSwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgaWYgKG8gPSBvbltqXSwgKCF0eXBlbmFtZS50eXBlIHx8IG8udHlwZSA9PT0gdHlwZW5hbWUudHlwZSkgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8ub3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvblsrK2ldID0gbztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCsraSkgb24ubGVuZ3RoID0gaTtcbiAgICBlbHNlIGRlbGV0ZSB0aGlzLl9fb247XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uQWRkKHR5cGVuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uID0gdGhpcy5fX29uLCBvLCBsaXN0ZW5lciA9IGNvbnRleHRMaXN0ZW5lcih2YWx1ZSk7XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgICAgaWYgKChvID0gb25bal0pLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8ub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIgPSBsaXN0ZW5lciwgby5vcHRpb25zID0gb3B0aW9ucyk7XG4gICAgICAgIG8udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodHlwZW5hbWUudHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIG8gPSB7dHlwZTogdHlwZW5hbWUudHlwZSwgbmFtZTogdHlwZW5hbWUubmFtZSwgdmFsdWU6IHZhbHVlLCBsaXN0ZW5lcjogbGlzdGVuZXIsIG9wdGlvbnM6IG9wdGlvbnN9O1xuICAgIGlmICghb24pIHRoaXMuX19vbiA9IFtvXTtcbiAgICBlbHNlIG9uLnB1c2gobyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGVuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgdHlwZW5hbWVzID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyBcIlwiKSwgaSwgbiA9IHR5cGVuYW1lcy5sZW5ndGgsIHQ7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG9uID0gdGhpcy5ub2RlKCkuX19vbjtcbiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBmb3IgKGkgPSAwLCBvID0gb25bal07IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKCh0ID0gdHlwZW5hbWVzW2ldKS50eXBlID09PSBvLnR5cGUgJiYgdC5uYW1lID09PSBvLm5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gby52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBvbiA9IHZhbHVlID8gb25BZGQgOiBvblJlbW92ZTtcbiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgdGhpcy5lYWNoKG9uKHR5cGVuYW1lc1tpXSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAtMSwgbSA9IGdyb3Vwcy5sZW5ndGg7ICsraiA8IG07KSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSBncm91cC5sZW5ndGggLSAxLCBuZXh0ID0gZ3JvdXBbaV0sIG5vZGU7IC0taSA+PSAwOykge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBpZiAobmV4dCAmJiBub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5leHQpIF4gNCkgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTtcbiAgICAgICAgbmV4dCA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJmdW5jdGlvbiBwcm9wZXJ0eVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBkZWxldGUgdGhpc1tuYW1lXTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpc1tuYW1lXSA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgZGVsZXRlIHRoaXNbbmFtZV07XG4gICAgZWxzZSB0aGlzW25hbWVdID0gdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gcHJvcGVydHlSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gcHJvcGVydHlGdW5jdGlvblxuICAgICAgICAgIDogcHJvcGVydHlDb25zdGFudCkobmFtZSwgdmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKVtuYW1lXTtcbn1cbiIsImZ1bmN0aW9uIHJhaXNlKCkge1xuICBpZiAodGhpcy5uZXh0U2libGluZykgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSk7XG59XG4iLCJmdW5jdGlvbiByZW1vdmUoKSB7XG4gIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmVtb3ZlKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yIGZyb20gXCIuLi9zZWxlY3Rvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IGFycmF5IGZyb20gXCIuLi9hcnJheS5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yQWxsIGZyb20gXCIuLi9zZWxlY3RvckFsbC5qc1wiO1xuXG5mdW5jdGlvbiBhcnJheUFsbChzZWxlY3QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBhcnJheShzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCA9PT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBhcnJheUFsbChzZWxlY3QpO1xuICBlbHNlIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTtcbiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge2NoaWxkTWF0Y2hlcn0gZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxudmFyIGZpbmQgPSBBcnJheS5wcm90b3R5cGUuZmluZDtcblxuZnVuY3Rpb24gY2hpbGRGaW5kKG1hdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmluZC5jYWxsKHRoaXMuY2hpbGRyZW4sIG1hdGNoKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2hpbGRGaXJzdCgpIHtcbiAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdChtYXRjaCA9PSBudWxsID8gY2hpbGRGaXJzdFxuICAgICAgOiBjaGlsZEZpbmQodHlwZW9mIG1hdGNoID09PSBcImZ1bmN0aW9uXCIgPyBtYXRjaCA6IGNoaWxkTWF0Y2hlcihtYXRjaCkpKTtcbn1cbiIsImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmlsdGVyID0gQXJyYXkucHJvdG90eXBlLmZpbHRlcjtcblxuZnVuY3Rpb24gY2hpbGRyZW4oKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pO1xufVxuXG5mdW5jdGlvbiBjaGlsZHJlbkZpbHRlcihtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbHRlci5jYWxsKHRoaXMuY2hpbGRyZW4sIG1hdGNoKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0QWxsKG1hdGNoID09IG51bGwgPyBjaGlsZHJlblxuICAgICAgOiBjaGlsZHJlbkZpbHRlcih0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIGxldCBzaXplID0gMDtcbiAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMpICsrc2l6ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICByZXR1cm4gc2l6ZTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb21wYXJlKSB7XG4gIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFzY2VuZGluZztcblxuICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmUoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc29ydGdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc29ydGdyb3VwW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc29ydGdyb3VwLnNvcnQoY29tcGFyZU5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc29ydGdyb3VwcywgdGhpcy5fcGFyZW50cykub3JkZXIoKTtcbn1cblxuZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odXBkYXRlKSB7XG4gIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7XG59XG4iLCJpbXBvcnQgZGVmYXVsdFZpZXcgZnJvbSBcIi4uL3dpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gICAgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICAgID8gc3R5bGVSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uXG4gICAgICAgICAgICA6IHN0eWxlQ29uc3RhbnQpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSlcbiAgICAgIDogc3R5bGVWYWx1ZSh0aGlzLm5vZGUoKSwgbmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHlsZVZhbHVlKG5vZGUsIG5hbWUpIHtcbiAgcmV0dXJuIG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKVxuICAgICAgfHwgZGVmYXVsdFZpZXcobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xufVxuIiwiZnVuY3Rpb24gdGV4dFJlbW92ZSgpIHtcbiAgdGhpcy50ZXh0Q29udGVudCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyB0ZXh0UmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0ZXh0RnVuY3Rpb25cbiAgICAgICAgICA6IHRleHRDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS50ZXh0Q29udGVudDtcbn1cbiIsImZ1bmN0aW9uIG5vbmUoKSB7fVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IG5vbmUgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfTtcbn1cbiIsImZ1bmN0aW9uIGVtcHR5KCkge1xuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGxldCBzb3VyY2VFdmVudDtcbiAgd2hpbGUgKHNvdXJjZUV2ZW50ID0gZXZlbnQuc291cmNlRXZlbnQpIGV2ZW50ID0gc291cmNlRXZlbnQ7XG4gIHJldHVybiBldmVudDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUpIHtcbiAgcmV0dXJuIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSAvLyBub2RlIGlzIGEgTm9kZVxuICAgICAgfHwgKG5vZGUuZG9jdW1lbnQgJiYgbm9kZSkgLy8gbm9kZSBpcyBhIFdpbmRvd1xuICAgICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50XG59XG4iLCJpbXBvcnQge1RpbWVyfSBmcm9tIFwiLi90aW1lci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgdmFyIHQgPSBuZXcgVGltZXI7XG4gIGRlbGF5ID0gZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXk7XG4gIHQucmVzdGFydChlbGFwc2VkID0+IHtcbiAgICB0LnN0b3AoKTtcbiAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpO1xuICB9LCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuIiwidmFyIGZyYW1lID0gMCwgLy8gaXMgYW4gYW5pbWF0aW9uIGZyYW1lIHBlbmRpbmc/XG4gICAgdGltZW91dCA9IDAsIC8vIGlzIGEgdGltZW91dCBwZW5kaW5nP1xuICAgIGludGVydmFsID0gMCwgLy8gYXJlIGFueSB0aW1lcnMgYWN0aXZlP1xuICAgIHBva2VEZWxheSA9IDEwMDAsIC8vIGhvdyBmcmVxdWVudGx5IHdlIGNoZWNrIGZvciBjbG9jayBza2V3XG4gICAgdGFza0hlYWQsXG4gICAgdGFza1RhaWwsXG4gICAgY2xvY2tMYXN0ID0gMCxcbiAgICBjbG9ja05vdyA9IDAsXG4gICAgY2xvY2tTa2V3ID0gMCxcbiAgICBjbG9jayA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gXCJvYmplY3RcIiAmJiBwZXJmb3JtYW5jZS5ub3cgPyBwZXJmb3JtYW5jZSA6IERhdGUsXG4gICAgc2V0RnJhbWUgPSB0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KSA6IGZ1bmN0aW9uKGYpIHsgc2V0VGltZW91dChmLCAxNyk7IH07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3coKSB7XG4gIHJldHVybiBjbG9ja05vdyB8fCAoc2V0RnJhbWUoY2xlYXJOb3cpLCBjbG9ja05vdyA9IGNsb2NrLm5vdygpICsgY2xvY2tTa2V3KTtcbn1cblxuZnVuY3Rpb24gY2xlYXJOb3coKSB7XG4gIGNsb2NrTm93ID0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRpbWVyKCkge1xuICB0aGlzLl9jYWxsID1cbiAgdGhpcy5fdGltZSA9XG4gIHRoaXMuX25leHQgPSBudWxsO1xufVxuXG5UaW1lci5wcm90b3R5cGUgPSB0aW1lci5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUaW1lcixcbiAgcmVzdGFydDogZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb25cIik7XG4gICAgdGltZSA9ICh0aW1lID09IG51bGwgPyBub3coKSA6ICt0aW1lKSArIChkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheSk7XG4gICAgaWYgKCF0aGlzLl9uZXh0ICYmIHRhc2tUYWlsICE9PSB0aGlzKSB7XG4gICAgICBpZiAodGFza1RhaWwpIHRhc2tUYWlsLl9uZXh0ID0gdGhpcztcbiAgICAgIGVsc2UgdGFza0hlYWQgPSB0aGlzO1xuICAgICAgdGFza1RhaWwgPSB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9jYWxsID0gY2FsbGJhY2s7XG4gICAgdGhpcy5fdGltZSA9IHRpbWU7XG4gICAgc2xlZXAoKTtcbiAgfSxcbiAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2NhbGwpIHtcbiAgICAgIHRoaXMuX2NhbGwgPSBudWxsO1xuICAgICAgdGhpcy5fdGltZSA9IEluZmluaXR5O1xuICAgICAgc2xlZXAoKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lcihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgdmFyIHQgPSBuZXcgVGltZXI7XG4gIHQucmVzdGFydChjYWxsYmFjaywgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyRmx1c2goKSB7XG4gIG5vdygpOyAvLyBHZXQgdGhlIGN1cnJlbnQgdGltZSwgaWYgbm90IGFscmVhZHkgc2V0LlxuICArK2ZyYW1lOyAvLyBQcmV0ZW5kIHdl4oCZdmUgc2V0IGFuIGFsYXJtLCBpZiB3ZSBoYXZlbuKAmXQgYWxyZWFkeS5cbiAgdmFyIHQgPSB0YXNrSGVhZCwgZTtcbiAgd2hpbGUgKHQpIHtcbiAgICBpZiAoKGUgPSBjbG9ja05vdyAtIHQuX3RpbWUpID49IDApIHQuX2NhbGwuY2FsbCh1bmRlZmluZWQsIGUpO1xuICAgIHQgPSB0Ll9uZXh0O1xuICB9XG4gIC0tZnJhbWU7XG59XG5cbmZ1bmN0aW9uIHdha2UoKSB7XG4gIGNsb2NrTm93ID0gKGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpKSArIGNsb2NrU2tldztcbiAgZnJhbWUgPSB0aW1lb3V0ID0gMDtcbiAgdHJ5IHtcbiAgICB0aW1lckZsdXNoKCk7XG4gIH0gZmluYWxseSB7XG4gICAgZnJhbWUgPSAwO1xuICAgIG5hcCgpO1xuICAgIGNsb2NrTm93ID0gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb2tlKCkge1xuICB2YXIgbm93ID0gY2xvY2subm93KCksIGRlbGF5ID0gbm93IC0gY2xvY2tMYXN0O1xuICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkpIGNsb2NrU2tldyAtPSBkZWxheSwgY2xvY2tMYXN0ID0gbm93O1xufVxuXG5mdW5jdGlvbiBuYXAoKSB7XG4gIHZhciB0MCwgdDEgPSB0YXNrSGVhZCwgdDIsIHRpbWUgPSBJbmZpbml0eTtcbiAgd2hpbGUgKHQxKSB7XG4gICAgaWYgKHQxLl9jYWxsKSB7XG4gICAgICBpZiAodGltZSA+IHQxLl90aW1lKSB0aW1lID0gdDEuX3RpbWU7XG4gICAgICB0MCA9IHQxLCB0MSA9IHQxLl9uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0MiA9IHQxLl9uZXh0LCB0MS5fbmV4dCA9IG51bGw7XG4gICAgICB0MSA9IHQwID8gdDAuX25leHQgPSB0MiA6IHRhc2tIZWFkID0gdDI7XG4gICAgfVxuICB9XG4gIHRhc2tUYWlsID0gdDA7XG4gIHNsZWVwKHRpbWUpO1xufVxuXG5mdW5jdGlvbiBzbGVlcCh0aW1lKSB7XG4gIGlmIChmcmFtZSkgcmV0dXJuOyAvLyBTb29uZXN0IGFsYXJtIGFscmVhZHkgc2V0LCBvciB3aWxsIGJlLlxuICBpZiAodGltZW91dCkgdGltZW91dCA9IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93OyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy5cbiAgaWYgKGRlbGF5ID4gMjQpIHtcbiAgICBpZiAodGltZSA8IEluZmluaXR5KSB0aW1lb3V0ID0gc2V0VGltZW91dCh3YWtlLCB0aW1lIC0gY2xvY2subm93KCkgLSBjbG9ja1NrZXcpO1xuICAgIGlmIChpbnRlcnZhbCkgaW50ZXJ2YWwgPSBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWludGVydmFsKSBjbG9ja0xhc3QgPSBjbG9jay5ub3coKSwgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChwb2tlLCBwb2tlRGVsYXkpO1xuICAgIGZyYW1lID0gMSwgc2V0RnJhbWUod2FrZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHtTQ0hFRFVMRUR9IGZyb20gXCIuL3RyYW5zaXRpb24vc2NoZWR1bGUuanNcIjtcblxudmFyIHJvb3QgPSBbbnVsbF07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgc2NoZWR1bGUsXG4gICAgICBpO1xuXG4gIGlmIChzY2hlZHVsZXMpIHtcbiAgICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLnN0YXRlID4gU0NIRURVTEVEICYmIHNjaGVkdWxlLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKFtbbm9kZV1dLCByb290LCBuYW1lLCAraSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCJpbXBvcnQgXCIuL3NlbGVjdGlvbi9pbmRleC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRyYW5zaXRpb259IGZyb20gXCIuL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBhY3RpdmV9IGZyb20gXCIuL2FjdGl2ZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycnVwdH0gZnJvbSBcIi4vaW50ZXJydXB0LmpzXCI7XG4iLCJpbXBvcnQge1NUQVJUSU5HLCBFTkRJTkcsIEVOREVEfSBmcm9tIFwiLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgc2NoZWR1bGUsXG4gICAgICBhY3RpdmUsXG4gICAgICBlbXB0eSA9IHRydWUsXG4gICAgICBpO1xuXG4gIGlmICghc2NoZWR1bGVzKSByZXR1cm47XG5cbiAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcblxuICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkubmFtZSAhPT0gbmFtZSkgeyBlbXB0eSA9IGZhbHNlOyBjb250aW51ZTsgfVxuICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7XG4gICAgc2NoZWR1bGUuc3RhdGUgPSBFTkRFRDtcbiAgICBzY2hlZHVsZS50aW1lci5zdG9wKCk7XG4gICAgc2NoZWR1bGUub24uY2FsbChhY3RpdmUgPyBcImludGVycnVwdFwiIDogXCJjYW5jZWxcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2NoZWR1bGUuaW5kZXgsIHNjaGVkdWxlLmdyb3VwKTtcbiAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICB9XG5cbiAgaWYgKGVtcHR5KSBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnRlcnJ1cHQgZnJvbSBcIi4vaW50ZXJydXB0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RyYW5zaXRpb24gZnJvbSBcIi4vdHJhbnNpdGlvbi5qc1wiO1xuXG5zZWxlY3Rpb24ucHJvdG90eXBlLmludGVycnVwdCA9IHNlbGVjdGlvbl9pbnRlcnJ1cHQ7XG5zZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjtcbiIsImltcG9ydCBpbnRlcnJ1cHQgZnJvbSBcIi4uL2ludGVycnVwdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgaW50ZXJydXB0KHRoaXMsIG5hbWUpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbiwgbmV3SWR9IGZyb20gXCIuLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUgZnJvbSBcIi4uL3RyYW5zaXRpb24vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7ZWFzZUN1YmljSW5PdXR9IGZyb20gXCJkMy1lYXNlXCI7XG5pbXBvcnQge25vd30gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBkZWZhdWx0VGltaW5nID0ge1xuICB0aW1lOiBudWxsLCAvLyBTZXQgb24gdXNlLlxuICBkZWxheTogMCxcbiAgZHVyYXRpb246IDI1MCxcbiAgZWFzZTogZWFzZUN1YmljSW5PdXRcbn07XG5cbmZ1bmN0aW9uIGluaGVyaXQobm9kZSwgaWQpIHtcbiAgdmFyIHRpbWluZztcbiAgd2hpbGUgKCEodGltaW5nID0gbm9kZS5fX3RyYW5zaXRpb24pIHx8ICEodGltaW5nID0gdGltaW5nW2lkXSkpIHtcbiAgICBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0cmFuc2l0aW9uICR7aWR9IG5vdCBmb3VuZGApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGltaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBpZCxcbiAgICAgIHRpbWluZztcblxuICBpZiAobmFtZSBpbnN0YW5jZW9mIFRyYW5zaXRpb24pIHtcbiAgICBpZCA9IG5hbWUuX2lkLCBuYW1lID0gbmFtZS5fbmFtZTtcbiAgfSBlbHNlIHtcbiAgICBpZCA9IG5ld0lkKCksICh0aW1pbmcgPSBkZWZhdWx0VGltaW5nKS50aW1lID0gbm93KCksIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG4gIH1cblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZCwgaSwgZ3JvdXAsIHRpbWluZyB8fCBpbmhlcml0KG5vZGUsIGlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSksIGkgPSBmdWxsbmFtZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJhdHRyLlwiICsgbmFtZSwgdmFsdWUpKVxuICAgICAgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkoZnVsbG5hbWUpXG4gICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KShmdWxsbmFtZSwgaSwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clR3ZWVuTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBrZXkgPSBcImF0dHIuXCIgKyBuYW1lO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCAoZnVsbG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2VlbikoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge2dldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlbGF5Q29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZGVsYXlGdW5jdGlvblxuICAgICAgICAgIDogZGVsYXlDb25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkdXJhdGlvbkNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZHVyYXRpb25GdW5jdGlvblxuICAgICAgICAgIDogZHVyYXRpb25Db25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZWFzZTtcbn1cbiIsImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlVmFyeWluZyhpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodHlwZW9mIHYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy5lYWNoKGVhc2VWYXJ5aW5nKHRoaXMuX2lkLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgb24wLCBvbjEsIHRoYXQgPSB0aGlzLCBpZCA9IHRoYXQuX2lkLCBzaXplID0gdGhhdC5zaXplKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgY2FuY2VsID0ge3ZhbHVlOiByZWplY3R9LFxuICAgICAgICBlbmQgPSB7dmFsdWU6IGZ1bmN0aW9uKCkgeyBpZiAoLS1zaXplID09PSAwKSByZXNvbHZlKCk7IH19O1xuXG4gICAgdGhhdC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgICBvbiA9IHNjaGVkdWxlLm9uO1xuXG4gICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIVxuICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgICAgaWYgKG9uICE9PSBvbjApIHtcbiAgICAgICAgb24xID0gKG9uMCA9IG9uKS5jb3B5KCk7XG4gICAgICAgIG9uMS5fLmNhbmNlbC5wdXNoKGNhbmNlbCk7XG4gICAgICAgIG9uMS5fLmludGVycnVwdC5wdXNoKGNhbmNlbCk7XG4gICAgICAgIG9uMS5fLmVuZC5wdXNoKGVuZCk7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHNlbGVjdGlvbiB3YXMgZW1wdHksIHJlc29sdmUgZW5kIGltbWVkaWF0ZWx5XG4gICAgaWYgKHNpemUgPT09IDApIHJlc29sdmUoKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQge21hdGNoZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9hdHRyIGZyb20gXCIuL2F0dHIuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHJUd2VlbiBmcm9tIFwiLi9hdHRyVHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2RlbGF5IGZyb20gXCIuL2RlbGF5LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9kdXJhdGlvbiBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZWFzZSBmcm9tIFwiLi9lYXNlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlVmFyeWluZyBmcm9tIFwiLi9lYXNlVmFyeWluZy5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZmlsdGVyIGZyb20gXCIuL2ZpbHRlci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX29uIGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9yZW1vdmUgZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zZWxlY3QgZnJvbSBcIi4vc2VsZWN0LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zZWxlY3Rpb24gZnJvbSBcIi4vc2VsZWN0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zdHlsZSBmcm9tIFwiLi9zdHlsZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGVUd2VlbiBmcm9tIFwiLi9zdHlsZVR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RleHRUd2VlbiBmcm9tIFwiLi90ZXh0VHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RyYW5zaXRpb24gZnJvbSBcIi4vdHJhbnNpdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdHdlZW4gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2VuZCBmcm9tIFwiLi9lbmQuanNcIjtcblxudmFyIGlkID0gMDtcblxuZXhwb3J0IGZ1bmN0aW9uIFRyYW5zaXRpb24oZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCkge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xuICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgdGhpcy5faWQgPSBpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNpdGlvbihuYW1lKSB7XG4gIHJldHVybiBzZWxlY3Rpb24oKS50cmFuc2l0aW9uKG5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV3SWQoKSB7XG4gIHJldHVybiArK2lkO1xufVxuXG52YXIgc2VsZWN0aW9uX3Byb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGU7XG5cblRyYW5zaXRpb24ucHJvdG90eXBlID0gdHJhbnNpdGlvbi5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUcmFuc2l0aW9uLFxuICBzZWxlY3Q6IHRyYW5zaXRpb25fc2VsZWN0LFxuICBzZWxlY3RBbGw6IHRyYW5zaXRpb25fc2VsZWN0QWxsLFxuICBzZWxlY3RDaGlsZDogc2VsZWN0aW9uX3Byb3RvdHlwZS5zZWxlY3RDaGlsZCxcbiAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGRyZW4sXG4gIGZpbHRlcjogdHJhbnNpdGlvbl9maWx0ZXIsXG4gIG1lcmdlOiB0cmFuc2l0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHRyYW5zaXRpb25fc2VsZWN0aW9uLFxuICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uX3RyYW5zaXRpb24sXG4gIGNhbGw6IHNlbGVjdGlvbl9wcm90b3R5cGUuY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZXMsXG4gIG5vZGU6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX3Byb3RvdHlwZS5lbXB0eSxcbiAgZWFjaDogc2VsZWN0aW9uX3Byb3RvdHlwZS5lYWNoLFxuICBvbjogdHJhbnNpdGlvbl9vbixcbiAgYXR0cjogdHJhbnNpdGlvbl9hdHRyLFxuICBhdHRyVHdlZW46IHRyYW5zaXRpb25fYXR0clR3ZWVuLFxuICBzdHlsZTogdHJhbnNpdGlvbl9zdHlsZSxcbiAgc3R5bGVUd2VlbjogdHJhbnNpdGlvbl9zdHlsZVR3ZWVuLFxuICB0ZXh0OiB0cmFuc2l0aW9uX3RleHQsXG4gIHRleHRUd2VlbjogdHJhbnNpdGlvbl90ZXh0VHdlZW4sXG4gIHJlbW92ZTogdHJhbnNpdGlvbl9yZW1vdmUsXG4gIHR3ZWVuOiB0cmFuc2l0aW9uX3R3ZWVuLFxuICBkZWxheTogdHJhbnNpdGlvbl9kZWxheSxcbiAgZHVyYXRpb246IHRyYW5zaXRpb25fZHVyYXRpb24sXG4gIGVhc2U6IHRyYW5zaXRpb25fZWFzZSxcbiAgZWFzZVZhcnlpbmc6IHRyYW5zaXRpb25fZWFzZVZhcnlpbmcsXG4gIGVuZDogdHJhbnNpdGlvbl9lbmQsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25fcHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl1cbn07XG4iLCJpbXBvcnQge2NvbG9yfSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGVOdW1iZXIsIGludGVycG9sYXRlUmdiLCBpbnRlcnBvbGF0ZVN0cmluZ30gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGM7XG4gIHJldHVybiAodHlwZW9mIGIgPT09IFwibnVtYmVyXCIgPyBpbnRlcnBvbGF0ZU51bWJlclxuICAgICAgOiBiIGluc3RhbmNlb2YgY29sb3IgPyBpbnRlcnBvbGF0ZVJnYlxuICAgICAgOiAoYyA9IGNvbG9yKGIpKSA/IChiID0gYywgaW50ZXJwb2xhdGVSZ2IpXG4gICAgICA6IGludGVycG9sYXRlU3RyaW5nKShhLCBiKTtcbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHJhbnNpdGlvbikge1xuICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3I7XG5cbiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHRyYW5zaXRpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gc3RhcnQobmFtZSkge1xuICByZXR1cm4gKG5hbWUgKyBcIlwiKS50cmltKCkuc3BsaXQoL158XFxzKy8pLmV2ZXJ5KGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuICF0IHx8IHQgPT09IFwic3RhcnRcIjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBvbjAsIG9uMSwgc2l0ID0gc3RhcnQobmFtZSkgPyBpbml0IDogc2V0O1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2l0KHRoaXMsIGlkKSxcbiAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAob24gIT09IG9uMCkgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihuYW1lLCBsaXN0ZW5lcik7XG5cbiAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyXG4gICAgICA/IGdldCh0aGlzLm5vZGUoKSwgaWQpLm9uLm9uKG5hbWUpXG4gICAgICA6IHRoaXMuZWFjaChvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikpO1xufVxuIiwiZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24oaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gICAgZm9yICh2YXIgaSBpbiB0aGlzLl9fdHJhbnNpdGlvbikgaWYgKCtpICE9PSBpZCkgcmV0dXJuO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm9uKFwiZW5kLnJlbW92ZVwiLCByZW1vdmVGdW5jdGlvbih0aGlzLl9pZCkpO1xufVxuIiwiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge3RpbWVyLCB0aW1lb3V0fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGVtcHR5T24gPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiZW5kXCIsIFwiY2FuY2VsXCIsIFwiaW50ZXJydXB0XCIpO1xudmFyIGVtcHR5VHdlZW4gPSBbXTtcblxuZXhwb3J0IHZhciBDUkVBVEVEID0gMDtcbmV4cG9ydCB2YXIgU0NIRURVTEVEID0gMTtcbmV4cG9ydCB2YXIgU1RBUlRJTkcgPSAyO1xuZXhwb3J0IHZhciBTVEFSVEVEID0gMztcbmV4cG9ydCB2YXIgUlVOTklORyA9IDQ7XG5leHBvcnQgdmFyIEVORElORyA9IDU7XG5leHBvcnQgdmFyIEVOREVEID0gNjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSwgaWQsIGluZGV4LCBncm91cCwgdGltaW5nKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZXMpIG5vZGUuX190cmFuc2l0aW9uID0ge307XG4gIGVsc2UgaWYgKGlkIGluIHNjaGVkdWxlcykgcmV0dXJuO1xuICBjcmVhdGUobm9kZSwgaWQsIHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIGluZGV4OiBpbmRleCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLlxuICAgIGdyb3VwOiBncm91cCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLlxuICAgIG9uOiBlbXB0eU9uLFxuICAgIHR3ZWVuOiBlbXB0eVR3ZWVuLFxuICAgIHRpbWU6IHRpbWluZy50aW1lLFxuICAgIGRlbGF5OiB0aW1pbmcuZGVsYXksXG4gICAgZHVyYXRpb246IHRpbWluZy5kdXJhdGlvbixcbiAgICBlYXNlOiB0aW1pbmcuZWFzZSxcbiAgICB0aW1lcjogbnVsbCxcbiAgICBzdGF0ZTogQ1JFQVRFRFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gZ2V0KG5vZGUsIGlkKTtcbiAgaWYgKHNjaGVkdWxlLnN0YXRlID4gQ1JFQVRFRCkgdGhyb3cgbmV3IEVycm9yKFwidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gZ2V0KG5vZGUsIGlkKTtcbiAgaWYgKHNjaGVkdWxlLnN0YXRlID4gU1RBUlRFRCkgdGhyb3cgbmV3IEVycm9yKFwidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZ1wiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uO1xuICBpZiAoIXNjaGVkdWxlIHx8ICEoc2NoZWR1bGUgPSBzY2hlZHVsZVtpZF0pKSB0aHJvdyBuZXcgRXJyb3IoXCJ0cmFuc2l0aW9uIG5vdCBmb3VuZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGUobm9kZSwgaWQsIHNlbGYpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgdHdlZW47XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgc2VsZiB0aW1lciB3aGVuIHRoZSB0cmFuc2l0aW9uIGlzIGNyZWF0ZWQuXG4gIC8vIE5vdGUgdGhlIGFjdHVhbCBkZWxheSBpcyBub3Qga25vd24gdW50aWwgdGhlIGZpcnN0IGNhbGxiYWNrIVxuICBzY2hlZHVsZXNbaWRdID0gc2VsZjtcbiAgc2VsZi50aW1lciA9IHRpbWVyKHNjaGVkdWxlLCAwLCBzZWxmLnRpbWUpO1xuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHtcbiAgICBzZWxmLnN0YXRlID0gU0NIRURVTEVEO1xuICAgIHNlbGYudGltZXIucmVzdGFydChzdGFydCwgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcblxuICAgIC8vIElmIHRoZSBlbGFwc2VkIGRlbGF5IGlzIGxlc3MgdGhhbiBvdXIgZmlyc3Qgc2xlZXAsIHN0YXJ0IGltbWVkaWF0ZWx5LlxuICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHtcbiAgICB2YXIgaSwgaiwgbiwgbztcblxuICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBub3QgU0NIRURVTEVELCB0aGVuIHdlIHByZXZpb3VzbHkgZXJyb3JlZCBvbiBzdGFydC5cbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU0NIRURVTEVEKSByZXR1cm4gc3RvcCgpO1xuXG4gICAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgICAgbyA9IHNjaGVkdWxlc1tpXTtcbiAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7XG5cbiAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsXG4gICAgICAvLyBkZWZlciBzdGFydGluZyBhbiBpbnRlcnJ1cHRpbmcgdHJhbnNpdGlvbiB1bnRpbCB0aGF0IHRyYW5zaXRpb24gaGFzIGFcbiAgICAgIC8vIGNoYW5jZSB0byB0aWNrIChhbmQgcG9zc2libHkgZW5kKTsgc2VlIGQzL2QzLXRyYW5zaXRpb24jNTQhXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCkgcmV0dXJuIHRpbWVvdXQoc3RhcnQpO1xuXG4gICAgICAvLyBJbnRlcnJ1cHQgdGhlIGFjdGl2ZSB0cmFuc2l0aW9uLCBpZiBhbnkuXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gUlVOTklORykge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJpbnRlcnJ1cHRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgcHJlLWVtcHRlZCB0cmFuc2l0aW9ucy5cbiAgICAgIGVsc2UgaWYgKCtpIDwgaWQpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuXG4gICAgLy8gTm90ZSB0aGUgdHJhbnNpdGlvbiBtYXkgYmUgY2FuY2VsZWQgYWZ0ZXIgc3RhcnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGljayFcbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBzY2hlZHVsZWQgYmVmb3JlIHRoZSBzdGFydCBldmVudDsgc2VlIGQzL2QzLXRyYW5zaXRpb24jMTYhXG4gICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLlxuICAgIHRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gU1RBUlRFRCkge1xuICAgICAgICBzZWxmLnN0YXRlID0gUlVOTklORztcbiAgICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHRpY2ssIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG4gICAgICAgIHRpY2soZWxhcHNlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgc3RhcnQgZXZlbnQuXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHR3ZWVuIGFyZSBpbml0aWFsaXplZC5cbiAgICBzZWxmLnN0YXRlID0gU1RBUlRJTkc7XG4gICAgc2VsZi5vbi5jYWxsKFwic3RhcnRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNUQVJUSU5HKSByZXR1cm47IC8vIGludGVycnVwdGVkXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJURUQ7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSB0d2VlbiwgZGVsZXRpbmcgbnVsbCB0d2Vlbi5cbiAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpO1xuICAgIGZvciAoaSA9IDAsIGogPSAtMTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG8gPSBzZWxmLnR3ZWVuW2ldLnZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCkpIHtcbiAgICAgICAgdHdlZW5bKytqXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxO1xuICB9XG5cbiAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7XG4gICAgdmFyIHQgPSBlbGFwc2VkIDwgc2VsZi5kdXJhdGlvbiA/IHNlbGYuZWFzZS5jYWxsKG51bGwsIGVsYXBzZWQgLyBzZWxmLmR1cmF0aW9uKSA6IChzZWxmLnRpbWVyLnJlc3RhcnQoc3RvcCksIHNlbGYuc3RhdGUgPSBFTkRJTkcsIDEpLFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIG4gPSB0d2Vlbi5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgdHdlZW5baV0uY2FsbChub2RlLCB0KTtcbiAgICB9XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50LlxuICAgIGlmIChzZWxmLnN0YXRlID09PSBFTkRJTkcpIHtcbiAgICAgIHNlbGYub24uY2FsbChcImVuZFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICAgIHN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHNlbGYuc3RhdGUgPSBFTkRFRDtcbiAgICBzZWxmLnRpbWVyLnN0b3AoKTtcbiAgICBkZWxldGUgc2NoZWR1bGVzW2lkXTtcbiAgICBmb3IgKHZhciBpIGluIHNjaGVkdWxlcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQge3NlbGVjdG9yfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZCA9IHRoaXMuX2lkO1xuXG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHtcbiAgICAgICAgaWYgKFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcbiAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlO1xuICAgICAgICBzY2hlZHVsZShzdWJncm91cFtpXSwgbmFtZSwgaWQsIGksIHN1Ymdyb3VwLCBnZXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdG9yQWxsfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZCA9IHRoaXMuX2lkO1xuXG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgZm9yICh2YXIgY2hpbGRyZW4gPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCksIGNoaWxkLCBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkKSwgayA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGsgPCBsOyArK2spIHtcbiAgICAgICAgICBpZiAoY2hpbGQgPSBjaGlsZHJlbltrXSkge1xuICAgICAgICAgICAgc2NoZWR1bGUoY2hpbGQsIG5hbWUsIGlkLCBrLCBjaGlsZHJlbiwgaW5oZXJpdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1Ymdyb3Vwcy5wdXNoKGNoaWxkcmVuKTtcbiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbnZhciBTZWxlY3Rpb24gPSBzZWxlY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7aW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgYXMgaW50ZXJwb2xhdGVUcmFuc2Zvcm19IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtzdHlsZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGUuanNcIjtcblxuZnVuY3Rpb24gc3R5bGVOdWxsKG5hbWUsIGludGVycG9sYXRlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKSxcbiAgICAgICAgc3RyaW5nMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBzdHlsZSh0aGlzLCBuYW1lKSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHN0cmluZzEwID0gc3RyaW5nMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKSxcbiAgICAgICAgdmFsdWUxID0gdmFsdWUodGhpcyksXG4gICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgc3RyaW5nMSA9IHZhbHVlMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBzdHlsZSh0aGlzLCBuYW1lKSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZU1heWJlUmVtb3ZlKGlkLCBuYW1lKSB7XG4gIHZhciBvbjAsIG9uMSwgbGlzdGVuZXIwLCBrZXkgPSBcInN0eWxlLlwiICsgbmFtZSwgZXZlbnQgPSBcImVuZC5cIiArIGtleSwgcmVtb3ZlO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgb24gPSBzY2hlZHVsZS5vbixcbiAgICAgICAgbGlzdGVuZXIgPSBzY2hlZHVsZS52YWx1ZVtrZXldID09IG51bGwgPyByZW1vdmUgfHwgKHJlbW92ZSA9IHN0eWxlUmVtb3ZlKG5hbWUpKSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAob24gIT09IG9uMCB8fCBsaXN0ZW5lcjAgIT09IGxpc3RlbmVyKSAob24xID0gKG9uMCA9IG9uKS5jb3B5KCkpLm9uKGV2ZW50LCBsaXN0ZW5lcjAgPSBsaXN0ZW5lcik7XG5cbiAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBpID0gKG5hbWUgKz0gXCJcIikgPT09IFwidHJhbnNmb3JtXCIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybSA6IGludGVycG9sYXRlO1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlTnVsbChuYW1lLCBpKSlcbiAgICAgIC5vbihcImVuZC5zdHlsZS5cIiArIG5hbWUsIHN0eWxlUmVtb3ZlKG5hbWUpKVxuICAgIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUZ1bmN0aW9uKG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJzdHlsZS5cIiArIG5hbWUsIHZhbHVlKSkpXG4gICAgICAuZWFjaChzdHlsZU1heWJlUmVtb3ZlKHRoaXMuX2lkLCBuYW1lKSlcbiAgICA6IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlQ29uc3RhbnQobmFtZSwgaSwgdmFsdWUpLCBwcmlvcml0eSlcbiAgICAgIC5vbihcImVuZC5zdHlsZS5cIiArIG5hbWUsIG51bGwpO1xufVxuIiwiZnVuY3Rpb24gc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgaS5jYWxsKHRoaXMsIHQpLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciB0LCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdCA9IChpMCA9IGkpICYmIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpO1xuICAgIHJldHVybiB0O1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIga2V5ID0gXCJzdHlsZS5cIiArIChuYW1lICs9IFwiXCIpO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/IFwiXCIgOiBwcmlvcml0eSkpO1xufVxuIiwiaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUxID0gdmFsdWUodGhpcyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gXCJcIiA6IHZhbHVlMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMudHdlZW4oXCJ0ZXh0XCIsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHRleHRGdW5jdGlvbih0d2VlblZhbHVlKHRoaXMsIFwidGV4dFwiLCB2YWx1ZSkpXG4gICAgICA6IHRleHRDb25zdGFudCh2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIikpO1xufVxuIiwiZnVuY3Rpb24gdGV4dEludGVycG9sYXRlKGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gaS5jYWxsKHRoaXMsIHQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0VHdlZW4odmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiB0ZXh0SW50ZXJwb2xhdGUoaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBrZXkgPSBcInRleHRcIjtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIHRleHRUd2Vlbih2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkMCA9IHRoaXMuX2lkLFxuICAgICAgaWQxID0gbmV3SWQoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICB2YXIgaW5oZXJpdCA9IGdldChub2RlLCBpZDApO1xuICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZDEsIGksIGdyb3VwLCB7XG4gICAgICAgICAgdGltZTogaW5oZXJpdC50aW1lICsgaW5oZXJpdC5kZWxheSArIGluaGVyaXQuZHVyYXRpb24sXG4gICAgICAgICAgZGVsYXk6IDAsXG4gICAgICAgICAgZHVyYXRpb246IGluaGVyaXQuZHVyYXRpb24sXG4gICAgICAgICAgZWFzZTogaW5oZXJpdC5lYXNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkMSk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiB0d2VlblJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgdHdlZW4wLCB0d2VlbjE7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gdHdlZW4wID0gdHdlZW47XG4gICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xID0gdHdlZW4xLnNsaWNlKCk7XG4gICAgICAgICAgdHdlZW4xLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0d2VlbkZ1bmN0aW9uKGlkLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgdHdlZW4wLCB0d2VlbjE7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9ICh0d2VlbjAgPSB0d2Vlbikuc2xpY2UoKTtcbiAgICAgIGZvciAodmFyIHQgPSB7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfSwgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMVtpXSA9IHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpID09PSBuKSB0d2VlbjEucHVzaCh0KTtcbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgbmFtZSArPSBcIlwiO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciB0d2VlbiA9IGdldCh0aGlzLm5vZGUoKSwgaWQpLnR3ZWVuO1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4ubGVuZ3RoLCB0OyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKHQgPSB0d2VlbltpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gdC52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gdHdlZW5SZW1vdmUgOiB0d2VlbkZ1bmN0aW9uKShpZCwgbmFtZSwgdmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR3ZWVuVmFsdWUodHJhbnNpdGlvbiwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlkID0gdHJhbnNpdGlvbi5faWQ7XG5cbiAgdHJhbnNpdGlvbi5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCk7XG4gICAgKHNjaGVkdWxlLnZhbHVlIHx8IChzY2hlZHVsZS52YWx1ZSA9IHt9KSlbbmFtZV0gPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBnZXQobm9kZSwgaWQpLnZhbHVlW25hbWVdO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgeCA9PiAoKSA9PiB4O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gWm9vbUV2ZW50KHR5cGUsIHtcbiAgc291cmNlRXZlbnQsXG4gIHRhcmdldCxcbiAgdHJhbnNmb3JtLFxuICBkaXNwYXRjaFxufSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgdHlwZToge3ZhbHVlOiB0eXBlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHNvdXJjZUV2ZW50OiB7dmFsdWU6IHNvdXJjZUV2ZW50LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHRhcmdldDoge3ZhbHVlOiB0YXJnZXQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgdHJhbnNmb3JtOiB7dmFsdWU6IHRyYW5zZm9ybSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBfOiB7dmFsdWU6IGRpc3BhdGNofVxuICB9KTtcbn1cbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyB6b29tfSBmcm9tIFwiLi96b29tLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgem9vbVRyYW5zZm9ybSwgaWRlbnRpdHkgYXMgem9vbUlkZW50aXR5LCBUcmFuc2Zvcm0gYXMgWm9vbVRyYW5zZm9ybX0gZnJvbSBcIi4vdHJhbnNmb3JtLmpzXCI7XG4iLCJleHBvcnQgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbihldmVudCkge1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHtcbiAgdGhpcy5rID0gaztcbiAgdGhpcy54ID0geDtcbiAgdGhpcy55ID0geTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zZm9ybSxcbiAgc2NhbGU6IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gayA9PT0gMSA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuayAqIGssIHRoaXMueCwgdGhpcy55KTtcbiAgfSxcbiAgdHJhbnNsYXRlOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIHggPT09IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rLCB0aGlzLnggKyB0aGlzLmsgKiB4LCB0aGlzLnkgKyB0aGlzLmsgKiB5KTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHBvaW50KSB7XG4gICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldO1xuICB9LFxuICBhcHBseVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geCAqIHRoaXMuayArIHRoaXMueDtcbiAgfSxcbiAgYXBwbHlZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24obG9jYXRpb24pIHtcbiAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdO1xuICB9LFxuICBpbnZlcnRYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuICh4IC0gdGhpcy54KSAvIHRoaXMuaztcbiAgfSxcbiAgaW52ZXJ0WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiAoeSAtIHRoaXMueSkgLyB0aGlzLms7XG4gIH0sXG4gIHJlc2NhbGVYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7XG4gIH0sXG4gIHJlc2NhbGVZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkuY29weSgpLmRvbWFpbih5LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSwgdGhpcykubWFwKHkuaW52ZXJ0LCB5KSk7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyB0aGlzLnggKyBcIixcIiArIHRoaXMueSArIFwiKSBzY2FsZShcIiArIHRoaXMuayArIFwiKVwiO1xuICB9XG59O1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0gbmV3IFRyYW5zZm9ybSgxLCAwLCAwKTtcblxudHJhbnNmb3JtLnByb3RvdHlwZSA9IFRyYW5zZm9ybS5wcm90b3R5cGU7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlKSB7XG4gIHdoaWxlICghbm9kZS5fX3pvb20pIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHJldHVybiBub2RlLl9fem9vbTtcbn1cbiIsImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHtkcmFnRGlzYWJsZSwgZHJhZ0VuYWJsZX0gZnJvbSBcImQzLWRyYWdcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGVab29tfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7c2VsZWN0LCBwb2ludGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge2ludGVycnVwdH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IFpvb21FdmVudCBmcm9tIFwiLi9ldmVudC5qc1wiO1xuaW1wb3J0IHtUcmFuc2Zvcm0sIGlkZW50aXR5fSBmcm9tIFwiLi90cmFuc2Zvcm0uanNcIjtcbmltcG9ydCBub2V2ZW50LCB7bm9wcm9wYWdhdGlvbn0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuXG4vLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS5cbi8vIGV4Y2VwdCBmb3IgcGluY2gtdG8tem9vbSwgd2hpY2ggaXMgc2VudCBhcyBhIHdoZWVsK2N0cmxLZXkgZXZlbnRcbmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIoZXZlbnQpIHtcbiAgcmV0dXJuICghZXZlbnQuY3RybEtleSB8fCBldmVudC50eXBlID09PSAnd2hlZWwnKSAmJiAhZXZlbnQuYnV0dG9uO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0RXh0ZW50KCkge1xuICB2YXIgZSA9IHRoaXM7XG4gIGlmIChlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkge1xuICAgIGUgPSBlLm93bmVyU1ZHRWxlbWVudCB8fCBlO1xuICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcInZpZXdCb3hcIikpIHtcbiAgICAgIGUgPSBlLnZpZXdCb3guYmFzZVZhbDtcbiAgICAgIHJldHVybiBbW2UueCwgZS55XSwgW2UueCArIGUud2lkdGgsIGUueSArIGUuaGVpZ2h0XV07XG4gICAgfVxuICAgIHJldHVybiBbWzAsIDBdLCBbZS53aWR0aC5iYXNlVmFsLnZhbHVlLCBlLmhlaWdodC5iYXNlVmFsLnZhbHVlXV07XG4gIH1cbiAgcmV0dXJuIFtbMCwgMF0sIFtlLmNsaWVudFdpZHRoLCBlLmNsaWVudEhlaWdodF1dO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VHJhbnNmb3JtKCkge1xuICByZXR1cm4gdGhpcy5fX3pvb20gfHwgaWRlbnRpdHk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRXaGVlbERlbHRhKGV2ZW50KSB7XG4gIHJldHVybiAtZXZlbnQuZGVsdGFZICogKGV2ZW50LmRlbHRhTW9kZSA9PT0gMSA/IDAuMDUgOiBldmVudC5kZWx0YU1vZGUgPyAxIDogMC4wMDIpICogKGV2ZW50LmN0cmxLZXkgPyAxMCA6IDEpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IChcIm9udG91Y2hzdGFydFwiIGluIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29uc3RyYWluKHRyYW5zZm9ybSwgZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpIHtcbiAgdmFyIGR4MCA9IHRyYW5zZm9ybS5pbnZlcnRYKGV4dGVudFswXVswXSkgLSB0cmFuc2xhdGVFeHRlbnRbMF1bMF0sXG4gICAgICBkeDEgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMV1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzBdLFxuICAgICAgZHkwID0gdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzBdWzFdKSAtIHRyYW5zbGF0ZUV4dGVudFswXVsxXSxcbiAgICAgIGR5MSA9IHRyYW5zZm9ybS5pbnZlcnRZKGV4dGVudFsxXVsxXSkgLSB0cmFuc2xhdGVFeHRlbnRbMV1bMV07XG4gIHJldHVybiB0cmFuc2Zvcm0udHJhbnNsYXRlKFxuICAgIGR4MSA+IGR4MCA/IChkeDAgKyBkeDEpIC8gMiA6IE1hdGgubWluKDAsIGR4MCkgfHwgTWF0aC5tYXgoMCwgZHgxKSxcbiAgICBkeTEgPiBkeTAgPyAoZHkwICsgZHkxKSAvIDIgOiBNYXRoLm1pbigwLCBkeTApIHx8IE1hdGgubWF4KDAsIGR5MSlcbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyLFxuICAgICAgZXh0ZW50ID0gZGVmYXVsdEV4dGVudCxcbiAgICAgIGNvbnN0cmFpbiA9IGRlZmF1bHRDb25zdHJhaW4sXG4gICAgICB3aGVlbERlbHRhID0gZGVmYXVsdFdoZWVsRGVsdGEsXG4gICAgICB0b3VjaGFibGUgPSBkZWZhdWx0VG91Y2hhYmxlLFxuICAgICAgc2NhbGVFeHRlbnQgPSBbMCwgSW5maW5pdHldLFxuICAgICAgdHJhbnNsYXRlRXh0ZW50ID0gW1stSW5maW5pdHksIC1JbmZpbml0eV0sIFtJbmZpbml0eSwgSW5maW5pdHldXSxcbiAgICAgIGR1cmF0aW9uID0gMjUwLFxuICAgICAgaW50ZXJwb2xhdGUgPSBpbnRlcnBvbGF0ZVpvb20sXG4gICAgICBsaXN0ZW5lcnMgPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiem9vbVwiLCBcImVuZFwiKSxcbiAgICAgIHRvdWNoc3RhcnRpbmcsXG4gICAgICB0b3VjaGZpcnN0LFxuICAgICAgdG91Y2hlbmRpbmcsXG4gICAgICB0b3VjaERlbGF5ID0gNTAwLFxuICAgICAgd2hlZWxEZWxheSA9IDE1MCxcbiAgICAgIGNsaWNrRGlzdGFuY2UyID0gMCxcbiAgICAgIHRhcERpc3RhbmNlID0gMTA7XG5cbiAgZnVuY3Rpb24gem9vbShzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb25cbiAgICAgICAgLnByb3BlcnR5KFwiX196b29tXCIsIGRlZmF1bHRUcmFuc2Zvcm0pXG4gICAgICAgIC5vbihcIndoZWVsLnpvb21cIiwgd2hlZWxlZCwge3Bhc3NpdmU6IGZhbHNlfSlcbiAgICAgICAgLm9uKFwibW91c2Vkb3duLnpvb21cIiwgbW91c2Vkb3duZWQpXG4gICAgICAgIC5vbihcImRibGNsaWNrLnpvb21cIiwgZGJsY2xpY2tlZClcbiAgICAgIC5maWx0ZXIodG91Y2hhYmxlKVxuICAgICAgICAub24oXCJ0b3VjaHN0YXJ0Lnpvb21cIiwgdG91Y2hzdGFydGVkKVxuICAgICAgICAub24oXCJ0b3VjaG1vdmUuem9vbVwiLCB0b3VjaG1vdmVkKVxuICAgICAgICAub24oXCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb21cIiwgdG91Y2hlbmRlZClcbiAgICAgICAgLnN0eWxlKFwiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yXCIsIFwicmdiYSgwLDAsMCwwKVwiKTtcbiAgfVxuXG4gIHpvb20udHJhbnNmb3JtID0gZnVuY3Rpb24oY29sbGVjdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gY29sbGVjdGlvbi5zZWxlY3Rpb24gPyBjb2xsZWN0aW9uLnNlbGVjdGlvbigpIDogY29sbGVjdGlvbjtcbiAgICBzZWxlY3Rpb24ucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSk7XG4gICAgaWYgKGNvbGxlY3Rpb24gIT09IHNlbGVjdGlvbikge1xuICAgICAgc2NoZWR1bGUoY29sbGVjdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3Rpb24uaW50ZXJydXB0KCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgLmV2ZW50KGV2ZW50KVxuICAgICAgICAgIC5zdGFydCgpXG4gICAgICAgICAgLnpvb20obnVsbCwgdHlwZW9mIHRyYW5zZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnNmb3JtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB0cmFuc2Zvcm0pXG4gICAgICAgICAgLmVuZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHpvb20uc2NhbGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaywgcCwgZXZlbnQpIHtcbiAgICB6b29tLnNjYWxlVG8oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBrMCA9IHRoaXMuX196b29tLmssXG4gICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gXCJmdW5jdGlvblwiID8gay5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogaztcbiAgICAgIHJldHVybiBrMCAqIGsxO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnNjYWxlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIGssIHAsIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlID0gZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgdDAgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHAgPT09IFwiZnVuY3Rpb25cIiA/IHAuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHAsXG4gICAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLFxuICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09IFwiZnVuY3Rpb25cIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7XG4gICAgICByZXR1cm4gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBlLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCB4LCB5LCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gY29uc3RyYWluKHRoaXMuX196b29tLnRyYW5zbGF0ZShcbiAgICAgICAgdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHguYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHgsXG4gICAgICAgIHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyB5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB5XG4gICAgICApLCBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBudWxsLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgeCwgeSwgcCwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSBcImZ1bmN0aW9uXCIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbihpZGVudGl0eS50cmFuc2xhdGUocDBbMF0sIHAwWzFdKS5zY2FsZSh0LmspLnRyYW5zbGF0ZShcbiAgICAgICAgdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IC14LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IC15LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteVxuICAgICAgKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc2NhbGUodHJhbnNmb3JtLCBrKSB7XG4gICAgayA9IE1hdGgubWF4KHNjYWxlRXh0ZW50WzBdLCBNYXRoLm1pbihzY2FsZUV4dGVudFsxXSwgaykpO1xuICAgIHJldHVybiBrID09PSB0cmFuc2Zvcm0uayA/IHRyYW5zZm9ybSA6IG5ldyBUcmFuc2Zvcm0oaywgdHJhbnNmb3JtLngsIHRyYW5zZm9ybS55KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh0cmFuc2Zvcm0sIHAwLCBwMSkge1xuICAgIHZhciB4ID0gcDBbMF0gLSBwMVswXSAqIHRyYW5zZm9ybS5rLCB5ID0gcDBbMV0gLSBwMVsxXSAqIHRyYW5zZm9ybS5rO1xuICAgIHJldHVybiB4ID09PSB0cmFuc2Zvcm0ueCAmJiB5ID09PSB0cmFuc2Zvcm0ueSA/IHRyYW5zZm9ybSA6IG5ldyBUcmFuc2Zvcm0odHJhbnNmb3JtLmssIHgsIHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2VudHJvaWQoZXh0ZW50KSB7XG4gICAgcmV0dXJuIFsoK2V4dGVudFswXVswXSArICtleHRlbnRbMV1bMF0pIC8gMiwgKCtleHRlbnRbMF1bMV0gKyArZXh0ZW50WzFdWzFdKSAvIDJdO1xuICB9XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGUodHJhbnNpdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpIHtcbiAgICB0cmFuc2l0aW9uXG4gICAgICAgIC5vbihcInN0YXJ0Lnpvb21cIiwgZnVuY3Rpb24oKSB7IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKS5ldmVudChldmVudCkuc3RhcnQoKTsgfSlcbiAgICAgICAgLm9uKFwiaW50ZXJydXB0Lnpvb20gZW5kLnpvb21cIiwgZnVuY3Rpb24oKSB7IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKS5ldmVudChldmVudCkuZW5kKCk7IH0pXG4gICAgICAgIC50d2VlbihcInpvb21cIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAgICBnID0gZ2VzdHVyZSh0aGF0LCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgICAgICAgIGUgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyksXG4gICAgICAgICAgICAgIHAgPSBwb2ludCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcG9pbnQgPT09IFwiZnVuY3Rpb25cIiA/IHBvaW50LmFwcGx5KHRoYXQsIGFyZ3MpIDogcG9pbnQsXG4gICAgICAgICAgICAgIHcgPSBNYXRoLm1heChlWzFdWzBdIC0gZVswXVswXSwgZVsxXVsxXSAtIGVbMF1bMV0pLFxuICAgICAgICAgICAgICBhID0gdGhhdC5fX3pvb20sXG4gICAgICAgICAgICAgIGIgPSB0eXBlb2YgdHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIgPyB0cmFuc2Zvcm0uYXBwbHkodGhhdCwgYXJncykgOiB0cmFuc2Zvcm0sXG4gICAgICAgICAgICAgIGkgPSBpbnRlcnBvbGF0ZShhLmludmVydChwKS5jb25jYXQodyAvIGEuayksIGIuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYi5rKSk7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGlmICh0ID09PSAxKSB0ID0gYjsgLy8gQXZvaWQgcm91bmRpbmcgZXJyb3Igb24gZW5kLlxuICAgICAgICAgICAgZWxzZSB7IHZhciBsID0gaSh0KSwgayA9IHcgLyBsWzJdOyB0ID0gbmV3IFRyYW5zZm9ybShrLCBwWzBdIC0gbFswXSAqIGssIHBbMV0gLSBsWzFdICogayk7IH1cbiAgICAgICAgICAgIGcuem9vbShudWxsLCB0KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlc3R1cmUodGhhdCwgYXJncywgY2xlYW4pIHtcbiAgICByZXR1cm4gKCFjbGVhbiAmJiB0aGF0Ll9fem9vbWluZykgfHwgbmV3IEdlc3R1cmUodGhhdCwgYXJncyk7XG4gIH1cblxuICBmdW5jdGlvbiBHZXN0dXJlKHRoYXQsIGFyZ3MpIHtcbiAgICB0aGlzLnRoYXQgPSB0aGF0O1xuICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgdGhpcy5hY3RpdmUgPSAwO1xuICAgIHRoaXMuc291cmNlRXZlbnQgPSBudWxsO1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpO1xuICAgIHRoaXMudGFwcyA9IDA7XG4gIH1cblxuICBHZXN0dXJlLnByb3RvdHlwZSA9IHtcbiAgICBldmVudDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudCkgdGhpcy5zb3VyY2VFdmVudCA9IGV2ZW50O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoKyt0aGlzLmFjdGl2ZSA9PT0gMSkge1xuICAgICAgICB0aGlzLnRoYXQuX196b29taW5nID0gdGhpcztcbiAgICAgICAgdGhpcy5lbWl0KFwic3RhcnRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHpvb206IGZ1bmN0aW9uKGtleSwgdHJhbnNmb3JtKSB7XG4gICAgICBpZiAodGhpcy5tb3VzZSAmJiBrZXkgIT09IFwibW91c2VcIikgdGhpcy5tb3VzZVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy5tb3VzZVswXSk7XG4gICAgICBpZiAodGhpcy50b3VjaDAgJiYga2V5ICE9PSBcInRvdWNoXCIpIHRoaXMudG91Y2gwWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRvdWNoMFswXSk7XG4gICAgICBpZiAodGhpcy50b3VjaDEgJiYga2V5ICE9PSBcInRvdWNoXCIpIHRoaXMudG91Y2gxWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRvdWNoMVswXSk7XG4gICAgICB0aGlzLnRoYXQuX196b29tID0gdHJhbnNmb3JtO1xuICAgICAgdGhpcy5lbWl0KFwiem9vbVwiKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgtLXRoaXMuYWN0aXZlID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRoYXQuX196b29taW5nO1xuICAgICAgICB0aGlzLmVtaXQoXCJlbmRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVtaXQ6IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIHZhciBkID0gc2VsZWN0KHRoaXMudGhhdCkuZGF0dW0oKTtcbiAgICAgIGxpc3RlbmVycy5jYWxsKFxuICAgICAgICB0eXBlLFxuICAgICAgICB0aGlzLnRoYXQsXG4gICAgICAgIG5ldyBab29tRXZlbnQodHlwZSwge1xuICAgICAgICAgIHNvdXJjZUV2ZW50OiB0aGlzLnNvdXJjZUV2ZW50LFxuICAgICAgICAgIHRhcmdldDogem9vbSxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy50aGF0Ll9fem9vbSxcbiAgICAgICAgICBkaXNwYXRjaDogbGlzdGVuZXJzXG4gICAgICAgIH0pLFxuICAgICAgICBkXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiB3aGVlbGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHQgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgayA9IE1hdGgubWF4KHNjYWxlRXh0ZW50WzBdLCBNYXRoLm1pbihzY2FsZUV4dGVudFsxXSwgdC5rICogTWF0aC5wb3coMiwgd2hlZWxEZWx0YS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSkpLFxuICAgICAgICBwID0gcG9pbnRlcihldmVudCk7XG5cbiAgICAvLyBJZiB0aGUgbW91c2UgaXMgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgYmVmb3JlLCByZXVzZSBpdC5cbiAgICAvLyBJZiB0aGVyZSB3ZXJlIHJlY2VudCB3aGVlbCBldmVudHMsIHJlc2V0IHRoZSB3aGVlbCBpZGxlIHRpbWVvdXQuXG4gICAgaWYgKGcud2hlZWwpIHtcbiAgICAgIGlmIChnLm1vdXNlWzBdWzBdICE9PSBwWzBdIHx8IGcubW91c2VbMF1bMV0gIT09IHBbMV0pIHtcbiAgICAgICAgZy5tb3VzZVsxXSA9IHQuaW52ZXJ0KGcubW91c2VbMF0gPSBwKTtcbiAgICAgIH1cbiAgICAgIGNsZWFyVGltZW91dChnLndoZWVsKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIHdoZWVsIGV2ZW50IHdvbuKAmXQgdHJpZ2dlciBhIHRyYW5zZm9ybSBjaGFuZ2UsIGlnbm9yZSBpdC5cbiAgICBlbHNlIGlmICh0LmsgPT09IGspIHJldHVybjtcblxuICAgIC8vIE90aGVyd2lzZSwgY2FwdHVyZSB0aGUgbW91c2UgcG9pbnQgYW5kIGxvY2F0aW9uIGF0IHRoZSBzdGFydC5cbiAgICBlbHNlIHtcbiAgICAgIGcubW91c2UgPSBbcCwgdC5pbnZlcnQocCldO1xuICAgICAgaW50ZXJydXB0KHRoaXMpO1xuICAgICAgZy5zdGFydCgpO1xuICAgIH1cblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGcud2hlZWwgPSBzZXRUaW1lb3V0KHdoZWVsaWRsZWQsIHdoZWVsRGVsYXkpO1xuICAgIGcuem9vbShcIm1vdXNlXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodCwgayksIGcubW91c2VbMF0sIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG5cbiAgICBmdW5jdGlvbiB3aGVlbGlkbGVkKCkge1xuICAgICAgZy53aGVlbCA9IG51bGw7XG4gICAgICBnLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNlZG93bmVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nIHx8ICFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCxcbiAgICAgICAgZyA9IGdlc3R1cmUodGhpcywgYXJncywgdHJ1ZSkuZXZlbnQoZXZlbnQpLFxuICAgICAgICB2ID0gc2VsZWN0KGV2ZW50LnZpZXcpLm9uKFwibW91c2Vtb3ZlLnpvb21cIiwgbW91c2Vtb3ZlZCwgdHJ1ZSkub24oXCJtb3VzZXVwLnpvb21cIiwgbW91c2V1cHBlZCwgdHJ1ZSksXG4gICAgICAgIHAgPSBwb2ludGVyKGV2ZW50LCBjdXJyZW50VGFyZ2V0KSxcbiAgICAgICAgeDAgPSBldmVudC5jbGllbnRYLFxuICAgICAgICB5MCA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICBkcmFnRGlzYWJsZShldmVudC52aWV3KTtcbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBnLm1vdXNlID0gW3AsIHRoaXMuX196b29tLmludmVydChwKV07XG4gICAgaW50ZXJydXB0KHRoaXMpO1xuICAgIGcuc3RhcnQoKTtcblxuICAgIGZ1bmN0aW9uIG1vdXNlbW92ZWQoZXZlbnQpIHtcbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgaWYgKCFnLm1vdmVkKSB7XG4gICAgICAgIHZhciBkeCA9IGV2ZW50LmNsaWVudFggLSB4MCwgZHkgPSBldmVudC5jbGllbnRZIC0geTA7XG4gICAgICAgIGcubW92ZWQgPSBkeCAqIGR4ICsgZHkgKiBkeSA+IGNsaWNrRGlzdGFuY2UyO1xuICAgICAgfVxuICAgICAgZy5ldmVudChldmVudClcbiAgICAgICAuem9vbShcIm1vdXNlXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUoZy50aGF0Ll9fem9vbSwgZy5tb3VzZVswXSA9IHBvaW50ZXIoZXZlbnQsIGN1cnJlbnRUYXJnZXQpLCBnLm1vdXNlWzFdKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vdXNldXBwZWQoZXZlbnQpIHtcbiAgICAgIHYub24oXCJtb3VzZW1vdmUuem9vbSBtb3VzZXVwLnpvb21cIiwgbnVsbCk7XG4gICAgICBkcmFnRW5hYmxlKGV2ZW50LnZpZXcsIGcubW92ZWQpO1xuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICBnLmV2ZW50KGV2ZW50KS5lbmQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkYmxjbGlja2VkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciB0MCA9IHRoaXMuX196b29tLFxuICAgICAgICBwMCA9IHBvaW50ZXIoZXZlbnQuY2hhbmdlZFRvdWNoZXMgPyBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSA6IGV2ZW50LCB0aGlzKSxcbiAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLFxuICAgICAgICBrMSA9IHQwLmsgKiAoZXZlbnQuc2hpZnRLZXkgPyAwLjUgOiAyKSxcbiAgICAgICAgdDEgPSBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGV4dGVudC5hcHBseSh0aGlzLCBhcmdzKSwgdHJhbnNsYXRlRXh0ZW50KTtcblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGlmIChkdXJhdGlvbiA+IDApIHNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pLmNhbGwoc2NoZWR1bGUsIHQxLCBwMCwgZXZlbnQpO1xuICAgIGVsc2Ugc2VsZWN0KHRoaXMpLmNhbGwoem9vbS50cmFuc2Zvcm0sIHQxLCBwMCwgZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hzdGFydGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciB0b3VjaGVzID0gZXZlbnQudG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLFxuICAgICAgICBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzLCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPT09IG4pLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgc3RhcnRlZCwgaSwgdCwgcDtcblxuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgIHAgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApLCB0LmlkZW50aWZpZXJdO1xuICAgICAgaWYgKCFnLnRvdWNoMCkgZy50b3VjaDAgPSBwLCBzdGFydGVkID0gdHJ1ZSwgZy50YXBzID0gMSArICEhdG91Y2hzdGFydGluZztcbiAgICAgIGVsc2UgaWYgKCFnLnRvdWNoMSAmJiBnLnRvdWNoMFsyXSAhPT0gcFsyXSkgZy50b3VjaDEgPSBwLCBnLnRhcHMgPSAwO1xuICAgIH1cblxuICAgIGlmICh0b3VjaHN0YXJ0aW5nKSB0b3VjaHN0YXJ0aW5nID0gY2xlYXJUaW1lb3V0KHRvdWNoc3RhcnRpbmcpO1xuXG4gICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgIGlmIChnLnRhcHMgPCAyKSB0b3VjaGZpcnN0ID0gcFswXSwgdG91Y2hzdGFydGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoc3RhcnRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaG1vdmVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLl9fem9vbWluZykgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0LCBwLCBsO1xuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gwWzBdID0gcDtcbiAgICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gxWzBdID0gcDtcbiAgICB9XG4gICAgdCA9IGcudGhhdC5fX3pvb207XG4gICAgaWYgKGcudG91Y2gxKSB7XG4gICAgICB2YXIgcDAgPSBnLnRvdWNoMFswXSwgbDAgPSBnLnRvdWNoMFsxXSxcbiAgICAgICAgICBwMSA9IGcudG91Y2gxWzBdLCBsMSA9IGcudG91Y2gxWzFdLFxuICAgICAgICAgIGRwID0gKGRwID0gcDFbMF0gLSBwMFswXSkgKiBkcCArIChkcCA9IHAxWzFdIC0gcDBbMV0pICogZHAsXG4gICAgICAgICAgZGwgPSAoZGwgPSBsMVswXSAtIGwwWzBdKSAqIGRsICsgKGRsID0gbDFbMV0gLSBsMFsxXSkgKiBkbDtcbiAgICAgIHQgPSBzY2FsZSh0LCBNYXRoLnNxcnQoZHAgLyBkbCkpO1xuICAgICAgcCA9IFsocDBbMF0gKyBwMVswXSkgLyAyLCAocDBbMV0gKyBwMVsxXSkgLyAyXTtcbiAgICAgIGwgPSBbKGwwWzBdICsgbDFbMF0pIC8gMiwgKGwwWzFdICsgbDFbMV0pIC8gMl07XG4gICAgfVxuICAgIGVsc2UgaWYgKGcudG91Y2gwKSBwID0gZy50b3VjaDBbMF0sIGwgPSBnLnRvdWNoMFsxXTtcbiAgICBlbHNlIHJldHVybjtcblxuICAgIGcuem9vbShcInRvdWNoXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUodCwgcCwgbCksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoZW5kZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQ7XG5cbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBpZiAodG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7XG4gICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldO1xuICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZpZXIpIGRlbGV0ZSBnLnRvdWNoMDtcbiAgICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGRlbGV0ZSBnLnRvdWNoMTtcbiAgICB9XG4gICAgaWYgKGcudG91Y2gxICYmICFnLnRvdWNoMCkgZy50b3VjaDAgPSBnLnRvdWNoMSwgZGVsZXRlIGcudG91Y2gxO1xuICAgIGlmIChnLnRvdWNoMCkgZy50b3VjaDBbMV0gPSB0aGlzLl9fem9vbS5pbnZlcnQoZy50b3VjaDBbMF0pO1xuICAgIGVsc2Uge1xuICAgICAgZy5lbmQoKTtcbiAgICAgIC8vIElmIHRoaXMgd2FzIGEgZGJsdGFwLCByZXJvdXRlIHRvIHRoZSAob3B0aW9uYWwpIGRibGNsaWNrLnpvb20gaGFuZGxlci5cbiAgICAgIGlmIChnLnRhcHMgPT09IDIpIHtcbiAgICAgICAgdCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICAgIGlmIChNYXRoLmh5cG90KHRvdWNoZmlyc3RbMF0gLSB0WzBdLCB0b3VjaGZpcnN0WzFdIC0gdFsxXSkgPCB0YXBEaXN0YW5jZSkge1xuICAgICAgICAgIHZhciBwID0gc2VsZWN0KHRoaXMpLm9uKFwiZGJsY2xpY2suem9vbVwiKTtcbiAgICAgICAgICBpZiAocCkgcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgem9vbS53aGVlbERlbHRhID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoZWVsRGVsdGEgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgem9vbSkgOiB3aGVlbERlbHRhO1xuICB9O1xuXG4gIHpvb20uZmlsdGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgem9vbSkgOiBmaWx0ZXI7XG4gIH07XG5cbiAgem9vbS50b3VjaGFibGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCB6b29tKSA6IHRvdWNoYWJsZTtcbiAgfTtcblxuICB6b29tLmV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHRlbnQgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KFtbK19bMF1bMF0sICtfWzBdWzFdXSwgWytfWzFdWzBdLCArX1sxXVsxXV1dKSwgem9vbSkgOiBleHRlbnQ7XG4gIH07XG5cbiAgem9vbS5zY2FsZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZUV4dGVudFswXSA9ICtfWzBdLCBzY2FsZUV4dGVudFsxXSA9ICtfWzFdLCB6b29tKSA6IFtzY2FsZUV4dGVudFswXSwgc2NhbGVFeHRlbnRbMV1dO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zbGF0ZUV4dGVudFswXVswXSA9ICtfWzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMF0gPSArX1sxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdID0gK19bMF1bMV0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXSA9ICtfWzFdWzFdLCB6b29tKSA6IFtbdHJhbnNsYXRlRXh0ZW50WzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV1dLCBbdHJhbnNsYXRlRXh0ZW50WzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV1dXTtcbiAgfTtcblxuICB6b29tLmNvbnN0cmFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb25zdHJhaW4gPSBfLCB6b29tKSA6IGNvbnN0cmFpbjtcbiAgfTtcblxuICB6b29tLmR1cmF0aW9uID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGR1cmF0aW9uID0gK18sIHpvb20pIDogZHVyYXRpb247XG4gIH07XG5cbiAgem9vbS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0ZSA9IF8sIHpvb20pIDogaW50ZXJwb2xhdGU7XG4gIH07XG5cbiAgem9vbS5vbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSA9IGxpc3RlbmVycy5vbi5hcHBseShsaXN0ZW5lcnMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyB6b29tIDogdmFsdWU7XG4gIH07XG5cbiAgem9vbS5jbGlja0Rpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsaWNrRGlzdGFuY2UyID0gKF8gPSArXykgKiBfLCB6b29tKSA6IE1hdGguc3FydChjbGlja0Rpc3RhbmNlMik7XG4gIH07XG5cbiAgem9vbS50YXBEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0YXBEaXN0YW5jZSA9ICtfLCB6b29tKSA6IHRhcERpc3RhbmNlO1xuICB9O1xuXG4gIHJldHVybiB6b29tO1xufVxuIiwiaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xyXG5cclxuLyoqXHJcbiAqIFBhcmVudCBjbGFzcyBmb3IgYnV0dG9uIGVsZW1lbnRzIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgZ3JpZHZpeiB2aWV3ZXIuXHJcbiAqXHJcbiAqIEBtb2R1bGUgYnV0dG9uXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBCdXR0b24ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xyXG4gICAgICogb3B0cy5wYXJlbnROb2RlXHJcbiAgICAgKiBvcHRzLmlkXHJcbiAgICAgKiBvcHRzLnRpdGxlXHJcbiAgICAgKiBvcHRzLmNsYXNzXHJcbiAgICAgKiBvcHRzLm9uQ2xpY2tGdW5jdGlvblxyXG4gICAgICogb3B0cy54XHJcbiAgICAgKiBvcHRzLnlcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy5tYXAgPSBvcHRzLm1hcFxyXG4gICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IG9wdHMucGFyZW50Tm9kZSB8fCBvcHRzLm1hcC5jb250YWluZXJcclxuXHJcbiAgICAgICAgLy8gdGhlIGRpdiBlbGVtZW50XHJcbiAgICAgICAgaWYgKG9wdHMuaWQpIHRoaXMuZGl2ID0gc2VsZWN0KCcjJyArIG9wdHMuaWQpXHJcblxyXG4gICAgICAgIGlmICghdGhpcy5kaXYgfHwgdGhpcy5kaXYuZW1wdHkoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmRpdiA9IHNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSlcclxuICAgICAgICAgICAgaWYgKG9wdHMuaWQpIHRoaXMuZGl2LmF0dHIoJ2lkJywgb3B0cy5pZClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRzLnRpdGxlKSB0aGlzLmRpdi5hdHRyKCd0aXRsZScsIG9wdHMudGl0bGUpXHJcbiAgICAgICAgaWYgKG9wdHMuY2xhc3MpIHRoaXMuZGl2LmF0dHIoJ2NsYXNzJywgb3B0cy5jbGFzcylcclxuXHJcbiAgICAgICAgLy8gYWRkIGV2ZW50c1xyXG4gICAgICAgIGlmIChvcHRzLm9uQ2xpY2tGdW5jdGlvbikgdGhpcy5kaXYub24oJ2NsaWNrJywgb3B0cy5vbkNsaWNrRnVuY3Rpb24pXHJcblxyXG4gICAgICAgIC8vc2V0IHN0eWxlc1xyXG4gICAgICAgIHRoaXMuc3R5bGUoXHJcbiAgICAgICAgICAgICdib3gtc2hhZG93JyxcclxuICAgICAgICAgICAgJzAgN3B4IDhweCByZ2JhKDAsNDcsMTAzLC4wOCksIDAgMCAyMnB4IHJnYmEoMCw0NywxMDMsLjA0KSwgMCAxMnB4IDE3cHggcmdiYSgwLDQ3LDEwMywuMDQpLCAwIC00cHggNHB4IHJnYmEoMCw0NywxMDMsLjA0KSdcclxuICAgICAgICApIC8vLmVjbC11LXNoYWRvdy0zXHJcbiAgICAgICAgdGhpcy5zdHlsZSgnYmFja2dyb3VuZC1jb2xvcicsICcjZmZmZmZmJylcclxuICAgICAgICB0aGlzLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgICAgICAgdGhpcy5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxyXG4gICAgICAgIHRoaXMuc3R5bGUoJ2Rpc3BsYXknLCAnZmxleCcpXHJcbiAgICAgICAgdGhpcy5zdHlsZSgnanVzdGlmeS1jb250ZW50JywgJ2NlbnRlcicpXHJcbiAgICAgICAgdGhpcy5zdHlsZSgnYWxpZ24taXRlbXMnLCAnY2VudGVyJylcclxuICAgICAgICB0aGlzLnN0eWxlKCd3aWR0aCcsICczMHB4JylcclxuICAgICAgICB0aGlzLnN0eWxlKCdoZWlnaHQnLCAnMzBweCcpXHJcbiAgICAgICAgLy8gdGhpcy5zdHlsZShwYWRkaW5nICwgJzRweCdcclxuXHJcbiAgICAgICAgLy8gYXBwZW5kIHRvIHBhcmVudFxyXG4gICAgICAgIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLmRpdi5ub2RlKCkpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBseSBhIHN0eWxlIHRvIHRoZSBidXR0b24gZGl2LlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2XHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgc3R5bGUoaywgdikge1xyXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKGssIHYpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuL0J1dHRvbi5qcydcclxuXHJcbi8qKlxyXG4gKiBCdXR0b24gZm9yIHRvZ2dsaW5nIGZ1bGxzY3JlZW4gbW9kZVxyXG4gKlxyXG4gKiBAbW9kdWxlIGJ1dHRvblxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRnVsbHNjcmVlbkJ1dHRvbiBleHRlbmRzIEJ1dHRvbiB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXHJcbiAgICAgKiBvcHRzLnBhcmVudE5vZGUgLSB0aGUgbm9kZSB0aGF0IHRoZSBidXR0b24gaXMgYXBwZW5kZWQgdG9cclxuICAgICAqIG9wdHMuY2FudmFzIC0gdGhlIGdyaWR2aXogY2FudmFzXHJcbiAgICAgKiBvcHRzLmlkXHJcbiAgICAgKiBvcHRzLnRpdGxlIC0gSFRNTCB0aXRsZSBhdHRyaWJ1dGVcclxuICAgICAqIG9wdHMuY2xhc3MgLSBjc3MgY2xhc3NcclxuICAgICAqIG9wdHMub25DbGlja0Z1bmN0aW9uXHJcbiAgICAgKiBvcHRzLnggLSB4IHBvc2l0aW9uIG9mIHRoZSBidXR0b25cclxuICAgICAqIG9wdHMueSAtIHkgcG9zaXRpb24gb2YgdGhlIGJ1dHRvblxyXG4gICAgICovXHJcblxyXG4gICAgLy8gZGVmYXVsdCBzdGF0ZVxyXG4gICAgaXNGdWxsc2NyZWVuID0gZmFsc2VcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuXHJcbiAgICAgICAgLy8gYXBwZW5kIGZ1bGxzY3JlZW4gaWNvbiB0byBidXR0b24gY29udGFpbmVyXHJcbiAgICAgICAgdGhpcy5kaXYubm9kZSgpLmlubmVySFRNTCA9IGBcclxuICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxLjJyZW07IHdpZHRoOiAxLjJyZW07IGZpbGw6YmxhY2s7IG1hcmdpbjowO1wiXHJcbiAgICAgICAgICAgIGZvY3VzYWJsZT1cImZhbHNlXCJcclxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzdmcgZmlsbD1cIiMwMDAwMDBcIiB2aWV3Qm94PVwiMCAwIDk2IDk2XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8dGl0bGUvPlxyXG4gICAgICAgICAgICA8Zz5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0zMCwwSDZBNS45OTY2LDUuOTk2NiwwLDAsMCwwLDZWMzBhNiw2LDAsMCwwLDEyLDBWMTJIMzBBNiw2LDAsMCwwLDMwLDBaXCIvPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTkwLDBINjZhNiw2LDAsMCwwLDAsMTJIODRWMzBhNiw2LDAsMCwwLDEyLDBWNkE1Ljk5NjYsNS45OTY2LDAsMCwwLDkwLDBaXCIvPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTMwLDg0SDEyVjY2QTYsNiwwLDAsMCwwLDY2VjkwYTUuOTk2Niw1Ljk5NjYsMCwwLDAsNiw2SDMwYTYsNiwwLDAsMCwwLTEyWlwiLz5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk05MCw2MGE1Ljk5NjYsNS45OTY2LDAsMCwwLTYsNlY4NEg2NmE2LDYsMCwwLDAsMCwxMkg5MGE1Ljk5NjYsNS45OTY2LDAsMCwwLDYtNlY2NkE1Ljk5NjYsNS45OTY2LDAsMCwwLDkwLDYwWlwiLz5cclxuICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICBgXHJcblxyXG4gICAgICAgIC8vc2F2ZSBpbml0aWFsIG1hcCBkaW1lbnNpb25zXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0SGVpZ2h0ID0gdGhpcy5tYXAuaFxyXG4gICAgICAgIHRoaXMuZGVmYXVsdFdpZHRoID0gdGhpcy5tYXAud1xyXG5cclxuICAgICAgICAvLyBldmVudCBoYW5kbGVyXHJcbiAgICAgICAgdGhpcy5kaXYub24oJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vbkNsaWNrRnVuY3Rpb24oZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuZGl2Lm9uKCdtb3VzZW92ZXInLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ2xpZ2h0Z3JleScpXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmRpdi5vbignbW91c2VvdXQnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNmZmZmZmYnKVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIC8vc2V0IHBvc2l0aW9uXHJcbiAgICAgICAgaWYgKG9wdHMueCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdsZWZ0Jywgb3B0cy54ICsgJ3B4JylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdyaWdodCcsICcxMHB4JylcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9wdHMueSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0eWxlKCd0b3AnLCBvcHRzLnkgKyAncHgnKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3RvcCcsICc5MHB4JylcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGlja0Z1bmN0aW9uKGUpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0Z1bGxzY3JlZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZUZ1bGxzY3JlZW4odGhpcy5tYXAuY29udGFpbmVyKVxyXG4gICAgICAgICAgICAvL3Jlc2l6ZSBjYW52YXMgdG8gZGVmYXVsdFxyXG4gICAgICAgICAgICB0aGlzLm1hcC5oID0gdGhpcy5kZWZhdWx0SGVpZ2h0XHJcbiAgICAgICAgICAgIHRoaXMubWFwLncgPSB0aGlzLmRlZmF1bHRXaWR0aFxyXG4gICAgICAgICAgICB0aGlzLm1hcC5nZW9DYW52YXMuaCA9IHRoaXMuZGVmYXVsdEhlaWdodFxyXG4gICAgICAgICAgICB0aGlzLm1hcC5nZW9DYW52YXMudyA9IHRoaXMuZGVmYXVsdFdpZHRoXHJcbiAgICAgICAgICAgIHRoaXMubWFwLmdlb0NhbnZhcy5jYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy5kZWZhdWx0V2lkdGgpXHJcbiAgICAgICAgICAgIHRoaXMubWFwLmdlb0NhbnZhcy5jYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuZGVmYXVsdEhlaWdodClcclxuICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcclxuICAgICAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSBmYWxzZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMub3BlbkZ1bGxzY3JlZW4odGhpcy5tYXAuY29udGFpbmVyKVxyXG4gICAgICAgICAgICAvL3Jlc2l6ZSBjYW52YXMgdG8gZnVsbHNjcmVlblxyXG4gICAgICAgICAgICB0aGlzLm1hcC5oID0gd2luZG93LnNjcmVlbi5oZWlnaHRcclxuICAgICAgICAgICAgdGhpcy5tYXAudyA9IHdpbmRvdy5zY3JlZW4ud2lkdGhcclxuICAgICAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qIE9wZW4gZnVsbHNjcmVlbiAqL1xyXG4gICAgb3BlbkZ1bGxzY3JlZW4oZWxlbSkge1xyXG4gICAgICAgIGlmIChlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKSB7XHJcbiAgICAgICAgICAgIGVsZW0ucmVxdWVzdEZ1bGxzY3JlZW4oKVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xyXG4gICAgICAgICAgICAvKiBTYWZhcmkgKi9cclxuICAgICAgICAgICAgZWxlbS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbigpXHJcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtLm1zUmVxdWVzdEZ1bGxzY3JlZW4pIHtcclxuICAgICAgICAgICAgLyogSUUxMSAqL1xyXG4gICAgICAgICAgICBlbGVtLm1zUmVxdWVzdEZ1bGxzY3JlZW4oKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiBDbG9zZSBmdWxsc2NyZWVuICovXHJcbiAgICBjbG9zZUZ1bGxzY3JlZW4oKSB7XHJcbiAgICAgICAgaWYgKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClcclxuICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKSB7XHJcbiAgICAgICAgICAgIC8qIFNhZmFyaSAqL1xyXG4gICAgICAgICAgICBkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpXHJcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKSB7XHJcbiAgICAgICAgICAgIC8qIElFMTEgKi9cclxuICAgICAgICAgICAgZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4vQnV0dG9uLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEJ1dHRvbiBmb3IgdG9nZ2xpbmcgZnVsbHNjcmVlbiBtb2RlXHJcbiAqXHJcbiAqIEBtb2R1bGUgYnV0dG9uXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBab29tQnV0dG9ucyBleHRlbmRzIEJ1dHRvbiB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG5cclxuICAgICAgICB0aGlzLm9uWm9vbSA9IG9wdHMub25ab29tIC8vIGN1c3RvbSB1c2VyIGV2ZW50IGhhbmRsZXJcclxuICAgICAgICB0aGlzLmRlbHRhID0gb3B0cy5kZWx0YSB8fCAwLjJcclxuXHJcbiAgICAgICAgLy8gem9vbSBpbiBidG5cclxuICAgICAgICB0aGlzLnpvb21JbkJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxyXG4gICAgICAgIHRoaXMuem9vbUluQnRuLmlubmVySFRNTCA9IGA8YSBpZD1cInpvb21pblwiIGNsYXNzPVwiZ3JpZHZpei16b29tLWJ1dHRvblwiIHRpdGxlPVwiWm9vbSBpblwiPis8L2E+YFxyXG4gICAgICAgIHRoaXMuem9vbUluQnRuLnRpdGxlID0gJ1pvb20gaW4nXHJcbiAgICAgICAgdGhpcy56b29tSW5CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnpvb21JbihlKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy56b29tSW5CdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKGUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy56b29tSW5CdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ2xpZ2h0Z3JleSdcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuem9vbUluQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKGUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy56b29tSW5CdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNmZmZmZmYnXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgLy8gem9vbSBvdXQgYnRuXHJcbiAgICAgICAgdGhpcy56b29tT3V0QnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXHJcbiAgICAgICAgdGhpcy56b29tT3V0QnRuLmlubmVySFRNTCA9IGA8YSBpZD1cInpvb21pblwiIGNsYXNzPVwiZ3JpZHZpei16b29tLWJ1dHRvblwiIHRpdGxlPVwiWm9vbSBvdXRcIj4tPC9hPmBcclxuICAgICAgICB0aGlzLnpvb21PdXRCdG4udGl0bGUgPSAnWm9vbSBvdXQnXHJcbiAgICAgICAgdGhpcy56b29tT3V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy56b29tT3V0KGUpXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLnpvb21PdXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKGUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy56b29tT3V0QnRuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICdsaWdodGdyZXknXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLnpvb21PdXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnpvb21PdXRCdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNmZmZmZmYnXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgLy9zZXQgc3R5bGVzXHJcbiAgICAgICAgbGV0IGJ0bnMgPSBbdGhpcy56b29tSW5CdG4sIHRoaXMuem9vbU91dEJ0bl1cclxuICAgICAgICBidG5zLmZvckVhY2goKGJ0biwgaSkgPT4ge1xyXG4gICAgICAgICAgICBidG4uc3R5bGUuYWxpZ25JdGVtcyA9ICdjZW50ZXInXHJcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICdjZW50ZXInXHJcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnXHJcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5ib3JkZXIgPSAnbm9uZSdcclxuICAgICAgICAgICAgYnRuLnN0eWxlLmNvbG9yID0gJ2JsYWNrJ1xyXG4gICAgICAgICAgICBidG4uc3R5bGUudGV4dEFsaWduID0gJ2NlbnRlcidcclxuICAgICAgICAgICAgYnRuLnN0eWxlLnRleHREZWNvcmF0aW9uID0gJ25vbmUnXHJcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5wYWRkaW5nID0gJzRweCdcclxuICAgICAgICAgICAgYnRuLnN0eWxlLmZvbnRTaXplID0gJzIwcHgnXHJcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnXHJcbiAgICAgICAgICAgIGJ0bi5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnXHJcbiAgICAgICAgICAgIGlmIChpID09IDApIGJ0bi5zdHlsZS5ib3JkZXJCb3R0b20gPSAnMXB4IHNvbGlkIGdyZXknXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgLy8gdW5zZXQgcGFyZW50IGNsYXNzIGhlaWdodCBhbmQgZGlzcGxheSBmb3IgZHVhbCBidXR0b25zXHJcbiAgICAgICAgdGhpcy5zdHlsZSgnaGVpZ2h0JywgJ3Vuc2V0JylcclxuICAgICAgICB0aGlzLnN0eWxlKCdkaXNwbGF5JywgJ3Vuc2V0JylcclxuXHJcbiAgICAgICAgLy9zZXQgcG9zaXRpb25cclxuICAgICAgICBpZiAob3B0cy54KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ2xlZnQnLCBvcHRzLnggKyAncHgnKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3JpZ2h0JywgJzEwcHgnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3B0cy55KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3RvcCcsIG9wdHMueSArICdweCcpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zdHlsZSgndG9wJywgJzEwcHgnKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYXBwZW5kIHRvIGJ1dHRvbiBjb250YWluZXJcclxuICAgICAgICB0aGlzLmRpdi5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy56b29tSW5CdG4pXHJcbiAgICAgICAgdGhpcy5kaXYubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuem9vbU91dEJ0bilcclxuICAgIH1cclxuXHJcbiAgICAvKiBab29tIGluICovXHJcbiAgICB6b29tSW4oZSkge1xyXG4gICAgICAgIHRoaXMubWFwLnNldFpvb20odGhpcy5tYXAuZ2V0Wm9vbSgpICogKDEgLSB0aGlzLmRlbHRhKSkucmVkcmF3KClcclxuICAgICAgICBpZiAodGhpcy5vblpvb20pIHRoaXMub25ab29tKGUpXHJcbiAgICB9XHJcblxyXG4gICAgLyogWm9vbSBvdXQgKi9cclxuICAgIHpvb21PdXQoZSkge1xyXG4gICAgICAgIHRoaXMubWFwLnNldFpvb20odGhpcy5tYXAuZ2V0Wm9vbSgpICogKDEgKyB0aGlzLmRlbHRhKSkucmVkcmF3KClcclxuICAgICAgICBpZiAodGhpcy5vblpvb20pIHRoaXMub25ab29tKGUpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKipcclxuICogQSBncmlkIGNlbGwuXHJcbiAqIEB0eXBlZGVmIHt7eDogbnVtYmVyLCB5OiBudW1iZXJ9fSBDZWxsICovXHJcblxyXG4vKipcclxuICogQSBkYXRhc2V0IGNvbXBvbmVudCwgb2YgZ3JpZCBjZWxscy5cclxuICogQGFic3RyYWN0XHJcbiAqXHJcbiAqIEBtb2R1bGUgY29yZVxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGF0YXNldCB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9NYXAuanNcIikuTWFwfSBtYXAgVGhlIG1hcC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCBvZiB0aGUgZGF0YXNldC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24sIGluIHRoZSBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXHJcbiAgICAgKiBAcGFyYW0ge3twcmVwcm9jZXNzPzpmdW5jdGlvbihDZWxsKTpib29sZWFuLCBtaXhlZFJlc29sdXRpb24/OmZ1bmN0aW9uKENlbGwpOm51bWJlcn19IG9wdHNcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihtYXAsIHVybCwgcmVzb2x1dGlvbiwgb3B0cyA9IHt9KSB7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtYXAuXHJcbiAgICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuL01hcC5qc1wiKS5NYXB9ICovXHJcbiAgICAgICAgdGhpcy5tYXAgPSBtYXBcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHVybCBvZiB0aGUgZGF0YXNldC5cclxuICAgICAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnVybCA9IHVybFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGF0YXNldCByZXNvbHV0aW9uIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IHJlc29sdXRpb25cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgKiBJbiBjYXNlIHRoZSBkYXRhc2V0IGlzIGEgZGF0YXNldCB3aXRoIGNlbGxzIGhhdmluZyBkaWZmZXJlbnQgcmVzb2x1dGlvbixcclxuICAgICAgICAqIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgcmVzb2x1dGlvbiBvZiBlYWNoIGNlbGwuXHJcbiAgICAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgICAgKiBAdHlwZSB7KGZ1bmN0aW9uKENlbGwpOm51bWJlciApfCB1bmRlZmluZWQgfSAqL1xyXG4gICAgICAgIHRoaXMubWl4ZWRSZXNvbHV0aW9uID0gb3B0cy5taXhlZFJlc29sdXRpb25cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBwcmVwcm9jZXNzIHRvIHJ1biBvbiBlYWNoIGNlbGwgYWZ0ZXIgbG9hZGluZy4gSXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc29tZSBzcGVjaWZpYyB0cmVhdG1lbnQgYmVmb3JlIG9yIGNvbXB1dGUgYSBuZXcgY29sdW1uLiBBbmQgYWxzbyB0byBkZXRlcm1pbmUgd2hpY2ggY2VsbHMgdG8ga2VlcCBhZnRlciBsb2FkaW5nLlxyXG4gICAgICAgICAqIEB0eXBlIHsoZnVuY3Rpb24oQ2VsbCk6Ym9vbGVhbiApfCB1bmRlZmluZWQgfSAqL1xyXG4gICAgICAgIHRoaXMucHJlcHJvY2VzcyA9IG9wdHMucHJlcHJvY2VzcyB8fCB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLyoqIFRoZSBjZWxscyB3aXRoaW4gdGhlIHZpZXdcclxuICAgICAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxDZWxsPn0gKi9cclxuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxyXG4gICAgICpcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9IGV4dEdlb1xyXG4gICAgICogQHJldHVybnMge3RoaXN9XHJcbiAgICAgKi9cclxuICAgIGdldERhdGEoZXh0R2VvID0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgZ2V0RGF0YSBub3QgaW1wbGVtZW50ZWQuJylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbGwgdGhlIHZpZXcgY2FjaGUgd2l0aCBhbGwgY2VsbHMgd2hpY2ggYXJlIHdpdGhpbiBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5FbnZlbG9wZX0gZXh0R2VvIFRoZSB2aWV3IGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgdXBkYXRlVmlld0NhY2hlIG5vdCBpbXBsZW1lbnRlZC4nKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgY2VsbCB1bmRlciBhIGdpdmVuIHBvc2l0aW9uLCBpZiBhbnkuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSBwb3NHZW9cclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPENlbGw+fSBjZWxscyBTb21lIGNlbGxzIGZyb20gdGhlIGRhdGFzZXQgKGEgc3Vic2V0IGlmIG5lY2Vzc2FyeSwgdXN1YWxseSB0aGUgdmlldyBjYWNoZSkuXHJcbiAgICAgKiBAcmV0dXJucyB7Q2VsbHx1bmRlZmluZWR9XHJcbiAgICAgKi9cclxuICAgIGdldENlbGxGcm9tUG9zaXRpb24ocG9zR2VvLCBjZWxscykge1xyXG4gICAgICAgIC8vY29tcHV0ZSBjYW5kaWRhdGUgY2VsbCBwb3NpdGlvblxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIC8vY29uc3QgciA9IHRoaXMuZ2V0UmVzb2x1dGlvbigpXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgLy9jb25zdCBjZWxsWCA9IHIgKiBNYXRoLmZsb29yKHBvc0dlby54IC8gcilcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAvL2NvbnN0IGNlbGxZID0gciAqIE1hdGguZmxvb3IocG9zR2VvLnkgLyByKVxyXG5cclxuICAgICAgICAvKi9nZXQgY2VsbFxyXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICBpZiAoY2VsbC54ICE9IGNlbGxYKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAoY2VsbC55ICE9IGNlbGxZKSBjb250aW51ZVxyXG4gICAgICAgICAgICByZXR1cm4gY2VsbFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkKi9cclxuXHJcbiAgICAgICAgLy9yYXJlIGNhc2Ugb2YgbWl4ZWQgcmVzb2x1dGlvbiBkYXRhc2V0XHJcbiAgICAgICAgaWYgKHRoaXMubWl4ZWRSZXNvbHV0aW9uKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCByID0gK3RoaXMubWl4ZWRSZXNvbHV0aW9uKGMpXHJcbiAgICAgICAgICAgICAgICBpZiAocG9zR2VvLnggPCBjLngpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjLnggKyByIDwgcG9zR2VvLngpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwb3NHZW8ueSA8IGMueSkgY29udGludWVcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMueSArIHIgPCBwb3NHZW8ueSkgY29udGludWVcclxuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIGNcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2NvbW1vbiBjYXNlXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLmdldFJlc29sdXRpb24oKVxyXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICBpZiAocG9zR2VvLnggPCBjZWxsLngpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNlbGwueCArIHIgPCBwb3NHZW8ueCkgY29udGludWVcclxuICAgICAgICAgICAgZWxzZSBpZiAocG9zR2VvLnkgPCBjZWxsLnkpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNlbGwueSArIHIgPCBwb3NHZW8ueSkgY29udGludWVcclxuICAgICAgICAgICAgZWxzZSByZXR1cm4gY2VsbFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vZ2V0dGVycyBhbmQgc2V0dGVyc1xyXG5cclxuICAgIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xyXG4gICAgZ2V0UmVzb2x1dGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHV0aW9uXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtBcnJheS48Q2VsbD59ICovXHJcbiAgICBnZXRWaWV3Q2FjaGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbHNWaWV3Q2FjaGVcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgcmVsZXZhbnQgZGF0YXNldCBmb3IgYSBzcGVjaWZpZWQgem9vbS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluUGl4ZWxzUGVyQ2VsbFxyXG4gICAgICogQHJldHVybnMge0RhdGFzZXR8dW5kZWZpbmVkfVxyXG4gICAgICogKi9cclxuICAgIGdldERhdGFzZXQoeiwgbWluUGl4ZWxzUGVyQ2VsbCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdXNlZCB0byBncm91cCBlbGVtZW50cyBzaGFyZWQgYmV0d2VlbiBMYXllciBhbmQgU3R5bGUgY2xhc3Nlcy5cclxuICogXHJcbiAqIEBhYnN0cmFjdFxyXG4gKiBAbW9kdWxlIGNvcmVcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERyYXdhYmxlIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHNwZWNpZnlpbmcgaWYgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2libGUgb3Igbm90LlxyXG4gICAgICAgICAqIFRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgdGhlIHpvb20gbGV2ZWwuXHJcbiAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpib29sZWFufSAqL1xyXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IG9wdHMudmlzaWJsZVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGFscGhhICh0cmFuc3BhcmVuY3kvb3BhY2l0eSksIGJldHdlZW4gMC4wIChmdWxseSB0cmFuc3BhcmVudCkgYW5kIDEuMCAoZnVsbHkgb3BhcXVlKS5cclxuICAgICAgICAgKiAgVGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyB0aGUgem9vbSBsZXZlbC5cclxuICAgICAgICAgKiAoc2VlIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDogZ2xvYmFsQWxwaGEgcHJvcGVydHkpXHJcbiAgICAgICAgICogQHR5cGUgeyhmdW5jdGlvbihudW1iZXIpOm51bWJlcil8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMuYWxwaGEgPSBvcHRzLmFscGhhXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgYmxlbmQgb3BlcmF0aW9uLlxyXG4gICAgICAgICAqIFRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgdGhlIHpvb20gbGV2ZWwuXHJcbiAgICAgICAgICogKHNlZSBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6IGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiBwcm9wZXJ0eSlcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb259ICovXHJcbiAgICAgICAgdGhpcy5ibGVuZE9wZXJhdGlvbiA9IG9wdHMuYmxlbmRPcGVyYXRpb24gfHwgKHogPT4gXCJzb3VyY2Utb3ZlclwiKVxyXG5cclxuICAgICAgICAvKiogQHR5cGUgeyhmdW5jdGlvbihudW1iZXIpOnN0cmluZyl8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMuZmlsdGVyQ29sb3IgPSBvcHRzLmZpbHRlckNvbG9yIC8vICh6KSA9PiBcIiNlZWU3XCJcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgbGF5ZXIgZmlsdGVyLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICovXHJcbiAgICBkcmF3RmlsdGVyKGdlb0NhbnZhcykge1xyXG4gICAgICAgIC8vbm8gZmlsdGVyOiByZXR1cm5cclxuICAgICAgICBpZiAoIXRoaXMuZmlsdGVyQ29sb3IpIHJldHVyblxyXG5cclxuICAgICAgICAvL2dldCBmaWx0ZXJcclxuICAgICAgICBjb25zdCBmYyA9IHRoaXMuZmlsdGVyQ29sb3IoZ2VvQ2FudmFzLnZpZXcueilcclxuXHJcbiAgICAgICAgLy9ubyBmaWx0ZXI6IHJldHVyblxyXG4gICAgICAgIGlmICghZmMgfHwgZmMgPT0gJ25vbmUnKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9kcmF3IGZpbHRlclxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gZmNcclxuICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxSZWN0KDAsIDAsIGdlb0NhbnZhcy53LCBnZW9DYW52YXMuaClcclxuICAgIH1cclxuXHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKiogQHR5cGVkZWYgeyB7eE1pbjogbnVtYmVyLCB4TWF4OiBudW1iZXIsIHlNaW46IG51bWJlciwgeU1heDogbnVtYmVyfSB9IEVudmVsb3BlICovXHJcblxyXG4vKipcclxuICogQSB2aWV3c2hlZC5cclxuICogQHR5cGVkZWYge3t4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfX0gVmlldyAqL1xyXG5cclxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xyXG5pbXBvcnQgeyB6b29tIGFzIGQzem9vbSwgem9vbUlkZW50aXR5IH0gZnJvbSAnZDMtem9vbSdcclxuXHJcbi8qKlxyXG4gKiBBIEhUTUwgY2FudmFzIGZvciBnZW8gZGF0YSBkaXNwbGF5LCBlbmhhbmNlZCB3aXRoIHpvb20gYW5kIHBhbiBjYXBhYmlsaXRpZXMuXHJcbiAqXHJcbiAqIEBtb2R1bGUgY29yZVxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgR2VvQ2FudmFzIHtcclxuICAgIC8qKlxyXG4gICAgICogQGNvbnN0cnVjdG9yXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHZpZXdcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHZpZXdcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IFRoZSB6b29tIGxldmVsIG9mIHRoZSB2aWV3IChwaXhlbCBzaXplLCBpbiBncm91bmQgbSlcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNhbnZhcywgeCA9IDAsIHkgPSAwLCB6ID0gMCwgb3B0cyA9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMub3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH0gKi9cclxuICAgICAgICB0aGlzLmNhbnZhcyA9IGNhbnZhc1xyXG5cclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLncgPSB0aGlzLmNhbnZhcy5vZmZzZXRXaWR0aFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuaCA9IHRoaXMuY2FudmFzLm9mZnNldEhlaWdodFxyXG5cclxuICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMud1xyXG4gICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuaFxyXG5cclxuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXHJcbiAgICAgICAgaWYgKCFjdHgpIHRocm93ICdJbXBvc3NpYmxlIHRvIGNyZWF0ZSBjYW52YXMgMkQgY29udGV4dCdcclxuICAgICAgICAvKipAdHlwZSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSAqL1xyXG4gICAgICAgIHRoaXMuY3R4ID0gY3R4XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHo6IHBpeGVsIHNpemUsIGluIG0vcGl4XHJcbiAgICAgICAgICogQHR5cGUge1ZpZXd9ICAqL1xyXG4gICAgICAgIHRoaXMudmlldyA9IHsgeDogeCwgeTogeSwgejogeiB9XHJcblxyXG4gICAgICAgIC8qKiBCYWNrZ3JvdW5kIGNvbG9yLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBvcHRzLmJhY2tncm91bmRDb2xvciB8fCAnd2hpdGUnXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0fHVuZGVmaW5lZCk6dm9pZH0gKi9cclxuICAgICAgICB0aGlzLm9uWm9vbVN0YXJ0RnVuID0gb3B0cy5vblpvb21TdGFydEZ1blxyXG5cclxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG9iamVjdHx1bmRlZmluZWQpOnZvaWR9ICovXHJcbiAgICAgICAgdGhpcy5vblpvb21FbmRGdW4gPSBvcHRzLm9uWm9vbUVuZEZ1blxyXG5cclxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG9iamVjdHx1bmRlZmluZWQpOnZvaWR9ICovXHJcbiAgICAgICAgdGhpcy5vblpvb21GdW4gPSBvcHRzLm9uWm9vbUZ1blxyXG5cclxuICAgICAgICAvL2N1cnJlbnQgZXh0ZW50XHJcbiAgICAgICAgLyoqIEB0eXBlIHtFbnZlbG9wZX0gKi9cclxuICAgICAgICB0aGlzLmV4dEdlbyA9IHsgeE1pbjogTmFOLCB4TWF4OiBOYU4sIHlNaW46IE5hTiwgeU1heDogTmFOIH1cclxuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXHJcblxyXG4gICAgICAgIC8vcmVseSBvbiBkMyB6b29tIGZvciBwYW4vem9vbVxyXG4gICAgICAgIGlmICghb3B0cy5kaXNhYmxlWm9vbSkge1xyXG4gICAgICAgICAgICBsZXQgdFAgPSB6b29tSWRlbnRpdHlcclxuICAgICAgICAgICAgY29uc3QgeiA9IGQzem9vbSgpXHJcbiAgICAgICAgICAgICAgICAvL3RvIG1ha2UgdGhlIHpvb21pbmcgYSBiaXQgZmFzdGVyXHJcbiAgICAgICAgICAgICAgICAud2hlZWxEZWx0YSgoZSkgPT4gLWUuZGVsdGFZICogKGUuZGVsdGFNb2RlID09PSAxID8gMC4wNyA6IGUuZGVsdGFNb2RlID8gMSA6IDAuMDA0KSlcclxuICAgICAgICAgICAgICAgIC5vbignem9vbScsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGUudHJhbnNmb3JtXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZiA9IHRQLmsgLyB0LmtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZiA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR4ID0gdFAueCAtIHQueFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeSA9IHRQLnkgLSB0LnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYW4oZHggKiB0aGlzLnZpZXcueiwgLWR5ICogdGhpcy52aWV3LnopXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2UgPSBlLnNvdXJjZUV2ZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZSBpbnN0YW5jZW9mIFdoZWVsRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vem9vbSBhdCB0aGUgbW91c2UgcG9zaXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl4VG9HZW9YKGUuc291cmNlRXZlbnQub2Zmc2V0WCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waXhUb0dlb1koZS5zb3VyY2VFdmVudC5vZmZzZXRZKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlIGluc3RhbmNlb2YgVG91Y2hFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZS50YXJnZXRUb3VjaGVzLmxlbmd0aCkgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgYXZlcmFnZSBwb3NpdGlvbiBvZiB0aGUgdG91Y2hlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR4ID0gMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSA9IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHR0IG9mIHNlLnRhcmdldFRvdWNoZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCArPSB0dC5jbGllbnRYXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgKz0gdHQuY2xpZW50WVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLz0gc2UudGFyZ2V0VG91Y2hlcy5sZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC89IHNlLnRhcmdldFRvdWNoZXMubGVuZ3RoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3pvb20gYXQgdGhpcyBhdmVyYWdlIHBvc2l0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb20oZiwgdGhpcy5waXhUb0dlb1godHgpLCB0aGlzLnBpeFRvR2VvWSh0eSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdFAgPSB0XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uWm9vbUZ1bikgdGhpcy5vblpvb21GdW4oZSlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAub24oJ3N0YXJ0JywgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmgpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuZ2V0Q29udGV4dCgnMmQnKT8uZHJhd0ltYWdlKHRoaXMuY2FudmFzLCAwLCAwKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCA9IDBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHkgPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgPSAxXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uWm9vbVN0YXJ0RnVuKSB0aGlzLm9uWm9vbVN0YXJ0RnVuKGUpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLm9uKCdlbmQnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSB7IGM6IG51bGwsIGR4OiAwLCBkeTogMCwgZjogMSB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uWm9vbUVuZEZ1bikgdGhpcy5vblpvb21FbmRGdW4oZSlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHooc2VsZWN0KHRoaXMuY2FudmFzKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9zZWxlY3QodGhpcy5jYW52YXMpLmNhbGwoeik7XHJcblxyXG4gICAgICAgIC8vY2VudGVyIGV4dGVudFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLnhNaW4gPSBvcHRzLmNlbnRlckV4dGVudCA/IG9wdHMuY2VudGVyRXh0ZW50WzBdIDogdW5kZWZpbmVkXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMueU1pbiA9IG9wdHMuY2VudGVyRXh0ZW50ID8gb3B0cy5jZW50ZXJFeHRlbnRbMV0gOiB1bmRlZmluZWRcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgdGhpcy54TWF4ID0gb3B0cy5jZW50ZXJFeHRlbnQgPyBvcHRzLmNlbnRlckV4dGVudFsyXSA6IHVuZGVmaW5lZFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLnlNYXggPSBvcHRzLmNlbnRlckV4dGVudCA/IG9wdHMuY2VudGVyRXh0ZW50WzNdIDogdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8qKiBab29tIGV4dGVudCwgdG8gbGltaXQgem9vbSBpbiBhbmQgb3V0XHJcbiAgICAgICAgICogIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cclxuICAgICAgICB0aGlzLnpvb21FeHRlbnQgPSBvcHRzLnpvb21FeHRlbnQgfHwgWzAsIEluZmluaXR5XVxyXG5cclxuICAgICAgICAvKiogQ2FudmFzIHN0YXRlLCB0byBiZSB1c2VkIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHJlZHJhd3Mgb24gem9vbS9wYW5cclxuICAgICAgICAgKiAgQHR5cGUge3tjOkhUTUxDYW52YXNFbGVtZW50fG51bGwsZHg6bnVtYmVyLGR5Om51bWJlcixmOm51bWJlcn19ICovXHJcbiAgICAgICAgdGhpcy5jYW52YXNTYXZlID0geyBjOiBudWxsLCBkeDogMCwgZHk6IDAsIGY6IDEgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcmV0dXJucyB7Vmlld30gKi9cclxuICAgIGdldFZpZXcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSB2ICovXHJcbiAgICBzZXRDZW50ZXJFeHRlbnQodikge1xyXG4gICAgICAgIHRoaXMueE1pbiA9IHZbMF1cclxuICAgICAgICB0aGlzLnlNaW4gPSB2WzFdXHJcbiAgICAgICAgdGhpcy54TWF4ID0gdlsyXVxyXG4gICAgICAgIHRoaXMueU1heCA9IHZbM11cclxuICAgIH1cclxuICAgIC8qKiBAcmV0dXJucyB7QXJyYXkuPG51bWJlcnx1bmRlZmluZWQ+fSAqL1xyXG4gICAgZ2V0Q2VudGVyRXh0ZW50KCkge1xyXG4gICAgICAgIHJldHVybiBbdGhpcy54TWluLCB0aGlzLnlNaW4sIHRoaXMueE1heCwgdGhpcy55TWF4XVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSB2ICovXHJcbiAgICBzZXRab29tRXh0ZW50KHYpIHtcclxuICAgICAgICB0aGlzLnpvb21FeHRlbnQgPSB2XHJcbiAgICB9XHJcbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXI+fSAqL1xyXG4gICAgZ2V0Wm9vbUV4dGVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy56b29tRXh0ZW50XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEluaXRpYWxpc2UgY2FudmFzIHRyYW5zZm9ybSB3aXRoIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uLiAqL1xyXG4gICAgaW5pdENhbnZhc1RyYW5zZm9ybSgpIHtcclxuICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMClcclxuICAgIH1cclxuXHJcbiAgICAvKiogSW5pdGlhbGlzZSBjYW52YXMgdHJhbnNmb3JtIHdpdGggZ2VvIHRvIHNjcmVlbiB0cmFuc2Zvcm1hdGlvbiwgc28gdGhhdCBnZW8gb2JqZWN0cyBjYW4gYmUgZHJhd24gZGlyZWN0bHkgaW4gZ2VvIGNvb3JkaW5hdGVzLiAqL1xyXG4gICAgc2V0Q2FudmFzVHJhbnNmb3JtKCkge1xyXG4gICAgICAgIGNvbnN0IGsgPSAxIC8gdGhpcy52aWV3LnpcclxuICAgICAgICBjb25zdCB0eCA9IC10aGlzLnZpZXcueCAvIHRoaXMudmlldy56ICsgdGhpcy53ICogMC41XHJcbiAgICAgICAgY29uc3QgdHkgPSB0aGlzLnZpZXcueSAvIHRoaXMudmlldy56ICsgdGhpcy5oICogMC41XHJcbiAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKGssIDAsIDAsIC1rLCB0eCwgdHkpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEdldCB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRvIHdlYkdMIHNjcmVlbiBjb29yZGluYXRlcywgd2l0aGluIFstMSwxXSpbLTEsMV0gKi9cclxuICAgIGdldFdlYkdMVHJhbnNmb3JtKCkge1xyXG4gICAgICAgIGNvbnN0IGt4ID0gMi4wIC8gKHRoaXMudyAqIHRoaXMudmlldy56KVxyXG4gICAgICAgIGNvbnN0IGt5ID0gMi4wIC8gKHRoaXMuaCAqIHRoaXMudmlldy56KVxyXG4gICAgICAgIHJldHVybiBba3gsIDAuMCwgMC4wLCAwLjAsIGt5LCAwLjAsIC1reCAqIHRoaXMudmlldy54LCAta3kgKiB0aGlzLnZpZXcueSwgMS4wXVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgZnVuY3Rpb24gc3BlY2lmeWluZyBob3cgdG8gZHJhdyB0aGUgbWFwLiAqL1xyXG4gICAgcmVkcmF3KCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIHJlZHJhdyBub3QgaW1wbGVtZW50ZWQuJylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFyLiBUbyBiZSB1c2VkIGJlZm9yZSBhIHJlZHJhdyBmb3IgZXhhbXBsZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclxyXG4gICAgICovXHJcbiAgICBjbGVhcihjb2xvciA9ICd3aGl0ZScpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRzLnRyYW5zcGFyZW50QmFja2dyb3VuZCkge1xyXG4gICAgICAgICAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy53LCB0aGlzLmgpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3R4KSB0aGlzLmN0eC5maWxsU3R5bGUgPSBjb2xvclxyXG4gICAgICAgICAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCB0aGlzLncsIHRoaXMuaClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZHhHZW9cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkeUdlb1xyXG4gICAgICovXHJcbiAgICBwYW4oZHhHZW8gPSAwLCBkeUdlbyA9IDApIHtcclxuICAgICAgICAvL2Vuc3VyZXMgeC95IGV4dGVudFxyXG4gICAgICAgIGlmICh0aGlzLnhNaW4gIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy54ICsgZHhHZW8gPCB0aGlzLnhNaW4pIGR4R2VvID0gdGhpcy54TWluIC0gdGhpcy52aWV3LnhcclxuICAgICAgICBpZiAodGhpcy55TWluICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueSArIGR5R2VvIDwgdGhpcy55TWluKSBkeUdlbyA9IHRoaXMueU1pbiAtIHRoaXMudmlldy55XHJcbiAgICAgICAgaWYgKHRoaXMueE1heCAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnggKyBkeEdlbyA+IHRoaXMueE1heCkgZHhHZW8gPSB0aGlzLnhNYXggLSB0aGlzLnZpZXcueFxyXG4gICAgICAgIGlmICh0aGlzLnlNYXggIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy55ICsgZHlHZW8gPiB0aGlzLnlNYXgpIGR5R2VvID0gdGhpcy55TWF4IC0gdGhpcy52aWV3LnlcclxuXHJcbiAgICAgICAgLy9wYW5cclxuICAgICAgICB0aGlzLnZpZXcueCArPSBkeEdlb1xyXG4gICAgICAgIHRoaXMudmlldy55ICs9IGR5R2VvXHJcbiAgICAgICAgdGhpcy51cGRhdGVFeHRlbnRHZW8oKVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jYW52YXNTYXZlLmMpIHtcclxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4IC09IGR4R2VvIC8gdGhpcy52aWV3LnpcclxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5ICs9IGR5R2VvIC8gdGhpcy52aWV3LnpcclxuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcclxuICAgICAgICAgICAgLy8gdGhpcyBkb2VzbnQgd29yayBvbiBtb2JpbGUgaHR0cHM6Ly9naXRodWIuY29tL2V1cm9zdGF0L2dyaWR2aXovaXNzdWVzLzk4XHJcbiAgICAgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLmNhbnZhc1NhdmUuYywgdGhpcy5jYW52YXNTYXZlLmR4LCB0aGlzLmNhbnZhc1NhdmUuZHkpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogWm9vbS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmIFRoZSB6b29tIGZhY3Rvciwgd2l0aGluIF0wLCBJbmZpbml0eV0uIDEgaXMgZm9yIG5vIGNoYW5nZS4gPDEgdG8gem9vbS1pbiwgPjEgdG8gem9vbS1vdXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geEdlbyBUaGUgeCBnZW8gcG9zaXRpb24gZml4ZWQgaW4gdGhlIHNjcmVlbi5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5R2VvIFRoZSB5IGdlbyBwb3NpdGlvbiBmaXhlZCBpbiB0aGUgc2NyZWVuLlxyXG4gICAgICovXHJcbiAgICB6b29tKGYgPSAxLCB4R2VvID0gdGhpcy52aWV3LngsIHlHZW8gPSB0aGlzLnZpZXcueSkge1xyXG4gICAgICAgIC8vVE9ETyBmb3JjZSBnZW8gZXh0ZW5kIHRvIHJlbWFpblxyXG5cclxuICAgICAgICAvL3RyeWluZyB0byB6b29tIGluL291dCBiZXlvbmQgbGltaXRcclxuICAgICAgICBpZiAodGhpcy56b29tRXh0ZW50WzBdID09IHRoaXMudmlldy56ICYmIGYgPD0gMSkgcmV0dXJuXHJcbiAgICAgICAgaWYgKHRoaXMuem9vbUV4dGVudFsxXSA9PSB0aGlzLnZpZXcueiAmJiBmID49IDEpIHJldHVyblxyXG5cclxuICAgICAgICAvL2Vuc3VyZSB6b29tIGV4dGVudCBwcmVzZXJ2ZWRcclxuICAgICAgICBjb25zdCBuZXdaZiA9IGYgKiB0aGlzLnZpZXcuelxyXG4gICAgICAgIGlmIChuZXdaZiA8IHRoaXMuem9vbUV4dGVudFswXSkgZiA9IHRoaXMuem9vbUV4dGVudFswXSAvIHRoaXMudmlldy56XHJcbiAgICAgICAgaWYgKG5ld1pmID4gdGhpcy56b29tRXh0ZW50WzFdKSBmID0gdGhpcy56b29tRXh0ZW50WzFdIC8gdGhpcy52aWV3LnpcclxuXHJcbiAgICAgICAgdGhpcy52aWV3LnogKj0gZlxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgcGFuXHJcbiAgICAgICAgbGV0IGR4R2VvID0gKHhHZW8gLSB0aGlzLnZpZXcueCkgKiAoMSAtIGYpXHJcbiAgICAgICAgbGV0IGR5R2VvID0gKHlHZW8gLSB0aGlzLnZpZXcueSkgKiAoMSAtIGYpXHJcblxyXG4gICAgICAgIC8vZW5zdXJlcyB4L3kgZXh0ZW50XHJcbiAgICAgICAgaWYgKHRoaXMueE1pbiAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnggKyBkeEdlbyA8IHRoaXMueE1pbikgZHhHZW8gPSB0aGlzLnhNaW4gLSB0aGlzLnZpZXcueFxyXG4gICAgICAgIGlmICh0aGlzLnlNaW4gIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy55ICsgZHlHZW8gPCB0aGlzLnlNaW4pIGR5R2VvID0gdGhpcy55TWluIC0gdGhpcy52aWV3LnlcclxuICAgICAgICBpZiAodGhpcy54TWF4ICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueCArIGR4R2VvID4gdGhpcy54TWF4KSBkeEdlbyA9IHRoaXMueE1heCAtIHRoaXMudmlldy54XHJcbiAgICAgICAgaWYgKHRoaXMueU1heCAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnkgKyBkeUdlbyA+IHRoaXMueU1heCkgZHlHZW8gPSB0aGlzLnlNYXggLSB0aGlzLnZpZXcueVxyXG5cclxuICAgICAgICAvL3BhblxyXG4gICAgICAgIHRoaXMudmlldy54ICs9IGR4R2VvXHJcbiAgICAgICAgdGhpcy52aWV3LnkgKz0gZHlHZW9cclxuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNhbnZhc1NhdmUuYykge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyKHRoaXMuYmFja2dyb3VuZENvbG9yKVxyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiAvPSBmXHJcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCA9IHRoaXMuZ2VvVG9QaXhYKHhHZW8pICogKDEgLSB0aGlzLmNhbnZhc1NhdmUuZilcclxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5ID0gdGhpcy5nZW9Ub1BpeFkoeUdlbykgKiAoMSAtIHRoaXMuY2FudmFzU2F2ZS5mKVxyXG4gICAgICAgICAgICB0aGlzLmNsZWFyKHRoaXMuYmFja2dyb3VuZENvbG9yKVxyXG4gICAgICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYyxcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCxcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSxcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5mICogdGhpcy5jYW52YXNTYXZlLmMud2lkdGgsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiAqIHRoaXMuY2FudmFzU2F2ZS5jLmhlaWdodFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1hcmdpblB4XHJcbiAgICAgKiBAcmV0dXJucyB7RW52ZWxvcGV9IFRoZSBlbnZlbG9wZSBvZiB0aGUgdmlldywgaW4gZ2VvIGNvb3JkaW5hdGVzLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVFeHRlbnRHZW8obWFyZ2luUHggPSAyMCkge1xyXG4gICAgICAgIHRoaXMuZXh0R2VvID0ge1xyXG4gICAgICAgICAgICB4TWluOiB0aGlzLnBpeFRvR2VvWCgtbWFyZ2luUHgpLFxyXG4gICAgICAgICAgICB4TWF4OiB0aGlzLnBpeFRvR2VvWCh0aGlzLncgKyBtYXJnaW5QeCksXHJcbiAgICAgICAgICAgIHlNaW46IHRoaXMucGl4VG9HZW9ZKHRoaXMuaCArIG1hcmdpblB4KSxcclxuICAgICAgICAgICAgeU1heDogdGhpcy5waXhUb0dlb1koLW1hcmdpblB4KSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0R2VvXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBpZiB0aGUgb2JqZWN0IGhhcyB0byBiZSBkcmF3blxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7e3g6bnVtYmVyLHk6bnVtYmVyfX0gb2JqXHJcbiAgICAgKi9cclxuICAgIHRvRHJhdyhvYmopIHtcclxuICAgICAgICBpZiAob2JqLnggPCB0aGlzLmV4dEdlby54TWluKSByZXR1cm4gZmFsc2VcclxuICAgICAgICBpZiAob2JqLnggPiB0aGlzLmV4dEdlby54TWF4KSByZXR1cm4gZmFsc2VcclxuICAgICAgICBpZiAob2JqLnkgPCB0aGlzLmV4dEdlby55TWluKSByZXR1cm4gZmFsc2VcclxuICAgICAgICBpZiAob2JqLnkgPiB0aGlzLmV4dEdlby55TWF4KSByZXR1cm4gZmFsc2VcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIC8vY29udmVyc2lvbiBmdW5jdGlvbnNcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhHZW8gR2VvIHggY29vcmRpbmF0ZSwgaW4gbS5cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNjcmVlbiB4IGNvb3JkaW5hdGUsIGluIHBpeC5cclxuICAgICAqL1xyXG4gICAgZ2VvVG9QaXhYKHhHZW8pIHtcclxuICAgICAgICByZXR1cm4gKHhHZW8gLSB0aGlzLnZpZXcueCkgLyB0aGlzLnZpZXcueiArIHRoaXMudyAqIDAuNVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geUdlbyBHZW8geSBjb29yZGluYXRlLCBpbiBtLlxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gU2NyZWVuIHkgY29vcmRpbmF0ZSwgaW4gcGl4LlxyXG4gICAgICovXHJcbiAgICBnZW9Ub1BpeFkoeUdlbykge1xyXG4gICAgICAgIHJldHVybiAtKHlHZW8gLSB0aGlzLnZpZXcueSkgLyB0aGlzLnZpZXcueiArIHRoaXMuaCAqIDAuNVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCBTY3JlZW4geCBjb29yZGluYXRlLCBpbiBwaXguXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBHZW8geCBjb29yZGluYXRlLCBpbiBtLlxyXG4gICAgICovXHJcbiAgICBwaXhUb0dlb1goeCkge1xyXG4gICAgICAgIHJldHVybiAoeCAtIHRoaXMudyAqIDAuNSkgKiB0aGlzLnZpZXcueiArIHRoaXMudmlldy54XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFNjcmVlbiB5IGNvb3JkaW5hdGUsIGluIHBpeC5cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEdlbyB5IGNvb3JkaW5hdGUsIGluIG0uXHJcbiAgICAgKi9cclxuICAgIHBpeFRvR2VvWSh5KSB7XHJcbiAgICAgICAgcmV0dXJuIC0oeSAtIHRoaXMuaCAqIDAuNSkgKiB0aGlzLnZpZXcueiArIHRoaXMudmlldy55XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEdldCB4LHkseiBlbGVtZW50cyBmcm9tIFVSTCBhbmQgYXNzaWduIHRoZW0gdG8gdGhlIHZpZXcuICovXHJcbiAgICBzZXRWaWV3RnJvbVVSTCgpIHtcclxuICAgICAgICBjb25zdCB4ID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZSgneCcpLFxyXG4gICAgICAgICAgICB5ID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZSgneScpLFxyXG4gICAgICAgICAgICB6ID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZSgneicpXHJcbiAgICAgICAgaWYgKHggIT0gbnVsbCAmJiB4ICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4oK3gpKSB0aGlzLnZpZXcueCA9ICt4XHJcbiAgICAgICAgaWYgKHkgIT0gbnVsbCAmJiB5ICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4oK3kpKSB0aGlzLnZpZXcueSA9ICt5XHJcbiAgICAgICAgaWYgKHogIT0gbnVsbCAmJiB6ICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4oK3opKSB0aGlzLnZpZXcueiA9ICt6XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBVUkwgcGFyYW1ldGVyIGJ5IG5hbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0UGFyYW1ldGVyQnlOYW1lKG5hbWUpIHtcclxuICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC9bXFxbXS8sICdcXFxcWycpLnJlcGxhY2UoL1tcXF1dLywgJ1xcXFxdJylcclxuICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKCdbXFxcXD8mXScgKyBuYW1lICsgJz0oW14mI10qKScpLFxyXG4gICAgICAgICAgICByZXN1bHRzID0gcmVnZXguZXhlYyhsb2NhdGlvbi5zZWFyY2gpXHJcbiAgICAgICAgcmV0dXJuICFyZXN1bHRzID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudChyZXN1bHRzWzFdLnJlcGxhY2UoL1xcKy9nLCAnICcpKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgRHJhd2FibGUgfSBmcm9tIFwiLi9EcmF3YWJsZS5qc1wiXHJcblxyXG4vKipcclxuICogQG1vZHVsZSBjb3JlXHJcbiAqIEBhYnN0cmFjdFxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTGF5ZXIgZXh0ZW5kcyBEcmF3YWJsZSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IGxheWVyLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbGVnZW5kXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICovXHJcbiAgICBkcmF3KGdlb0NhbnZhcywgbGVnZW5kID0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgZHJhdyBub3QgaW1wbGVtZW50ZWQuJylcclxuICAgIH1cclxuXHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXHJcblxyXG4vKipcclxuICogQSBsZWdlbmQgY29udGFpbmVyLlxyXG4gKlxyXG4gKiBAbW9kdWxlIGNvcmVcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExlZ2VuZCB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmlkID0gb3B0cy5pZFxyXG5cclxuICAgICAgICAvL1RPRE8gc3RvcCB1c2luZyBpdC4gVXNlIHN0eWxlIG1ldGhvZCBiZWxvdyBpbnN0ZWFkLlxyXG5cclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICB0aGlzLnRvcCA9IG9wdHMudG9wXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy5ib3R0b20gPSBvcHRzLmJvdHRvbVxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xyXG4gICAgICAgIHRoaXMubGVmdCA9IG9wdHMubGVmdFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xyXG4gICAgICAgIHRoaXMucmlnaHQgPSBvcHRzLnJpZ2h0XHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gb3B0cy5iYWNrZ3JvdW5kIHx8ICdub25lJ1xyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xyXG4gICAgICAgIHRoaXMucGFkZGluZyA9IG9wdHMucGFkZGluZyB8fCAnNXB4J1xyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xyXG4gICAgICAgIHRoaXMuYm9yZGVyID0gb3B0cy5ib3JkZXIgfHwgJzBweCdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICB0aGlzWydib3JkZXItcmFkaXVzJ10gPSBvcHRzWydib3JkZXItcmFkaXVzJ10gfHwgJ25vbmUnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpc1snYm94LXNoYWRvdyddID0gb3B0c1snYm94LXNoYWRvdyddIHx8ICdub25lJ1xyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xyXG4gICAgICAgIHRoaXNbJ2ZvbnQtZmFtaWx5J10gPSBvcHRzWydmb250LWZhbWlseSddIHx8ICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJ1xyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xyXG4gICAgICAgIC8vdGhpcy53aWR0aCA9IG9wdHMud2lkdGhcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICAvL3RoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHRcclxuXHJcbiAgICAgICAgLy90aGUgZGl2IGVsZW1lbnRcclxuICAgICAgICBpZiAodGhpcy5pZCkgdGhpcy5kaXYgPSBzZWxlY3QoJyMnICsgdGhpcy5pZClcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmRpdiB8fCB0aGlzLmRpdi5lbXB0eSgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGl2ID0gc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pZCkgdGhpcy5kaXYuYXR0cignaWQnLCB0aGlzLmlkKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9zZXQgc3R5bGVcclxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnYmFja2dyb3VuZCcsIHRoaXMuYmFja2dyb3VuZClcclxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgncGFkZGluZycsIHRoaXMucGFkZGluZylcclxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnYm9yZGVyJywgdGhpcy5ib3JkZXIpXHJcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCB0aGlzWydib3JkZXItcmFkaXVzJ10pXHJcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JveC1zaGFkb3cnLCB0aGlzWydib3gtc2hhZG93J10pXHJcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2ZvbnQtZmFtaWx5JywgdGhpc1snZm9udC1mYW1pbHknXSlcclxuXHJcbiAgICAgICAgLy9pZiAodGhpcy53aWR0aCkgdGhpcy5kaXYuc3R5bGUoJ3dpZHRoJywgdGhpcy53aWR0aClcclxuICAgICAgICAvL2lmICh0aGlzLmhlaWdodCkgdGhpcy5kaXYuc3R5bGUoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KVxyXG5cclxuICAgICAgICAvL3RpdGxlXHJcbiAgICAgICAgdGhpcy50aXRsZSA9IG9wdHMudGl0bGVcclxuICAgICAgICB0aGlzLnRpdGxlRm9udFNpemUgPSBvcHRzLnRpdGxlRm9udFNpemUgfHwgJzAuOGVtJ1xyXG4gICAgICAgIHRoaXMudGl0bGVGb250V2VpZ2h0ID0gb3B0cy50aXRsZUZvbnRXZWlnaHQgfHwgJ2JvbGQnXHJcblxyXG4gICAgICAgIC8vbGFiZWxcclxuICAgICAgICB0aGlzLmxhYmVsRm9udFNpemUgPSBvcHRzLmxhYmVsRm9udFNpemUgfHwgJzAuOGVtJ1xyXG4gICAgICAgIHRoaXMubGFiZWxVbml0VGV4dCA9IG9wdHMubGFiZWxVbml0VGV4dCB8fCAnJ1xyXG4gICAgICAgIHRoaXMubGFiZWxGb3JtYXQgPSBvcHRzLmxhYmVsRm9ybWF0XHJcbiAgICB9XHJcblxyXG5cclxuICAgIG1ha2VUaXRsZSgpIHtcclxuICAgICAgICBpZiAoIXRoaXMudGl0bGUpIHJldHVyblxyXG4gICAgICAgIHRoaXMuZGl2XHJcbiAgICAgICAgICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgdGhpcy50aXRsZUZvbnRXZWlnaHQpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnbWFyZ2luLWJvdHRvbScsICc3cHgnKVxyXG4gICAgICAgICAgICAudGV4dCh0aGlzLnRpdGxlKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IGEgc3R5bGUgdG8gdGhlIGxlZ2VuZCBkaXYuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZcclxuICAgICAqIEByZXR1cm5zIHt0aGlzfHN0cmluZ31cclxuICAgICAqL1xyXG4gICAgc3R5bGUoaywgdikge1xyXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiB0aGlzLmRpdi5zdHlsZShrKVxyXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKGssIHYpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAYWJzdHJhY3RcclxuICAgICAqL1xyXG4gICAgdXBkYXRlKG9wdHMgPSB7fSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0xlZ2VuZCB1cGRhdGUgbm90IGltcGxlbWVudGVkIHlldC4nKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLy8gaW50ZXJuYWwgaW1wb3J0c1xyXG5pbXBvcnQgeyBHZW9DYW52YXMgfSBmcm9tICcuL0dlb0NhbnZhcy5qcydcclxuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gJy4vVG9vbHRpcC5qcydcclxuaW1wb3J0IHsgWm9vbUJ1dHRvbnMgfSBmcm9tICcuLi9idXR0b24vWm9vbUJ1dHRvbnMuanMnXHJcbmltcG9ydCB7IEZ1bGxzY3JlZW5CdXR0b24gfSBmcm9tICcuLi9idXR0b24vRnVsbHNjcmVlbkJ1dHRvbi5qcydcclxuXHJcbi8vIGV4dGVybmFsIGltcG9ydHNcclxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xyXG5cclxuLyoqXHJcbiAqIEEgZ3JpZHZpeiBhcHBsaWNhdGlvbi5cclxuICpcclxuICogQG1vZHVsZSBjb3JlXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBNYXAge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50fSBjb250YWluZXJcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgb3B0cykge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBsYXllcnMuXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL0xheWVyLmpzXCIpLkxheWVyPn1cclxuICAgICAgICAgKiAqL1xyXG4gICAgICAgIHRoaXMubGF5ZXJzID0gb3B0cy5sYXllcnMgfHwgW11cclxuXHJcbiAgICAgICAgLy9nZXQgY29udGFpbmVyIGVsZW1lbnRcclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lciB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ3JpZHZpeicpXHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgZmluZCBncmlkdml6IGNvbnRhaW5lciBlbGVtZW50LicpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9odHRwczovL2Nzcy10cmlja3MuY29tL2Fic29sdXRlLXBvc2l0aW9uaW5nLWluc2lkZS1yZWxhdGl2ZS1wb3NpdGlvbmluZy9cclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZScgLy8gY29udGFpbmVyIGVsZW1lbnQgbXVzdCBoYXZlIHJlbGF0aXZlIHBvc2l0aW9uaW5nXHJcblxyXG4gICAgICAgIC8vc2V0IGRpbWVuc2lvbnNcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLncgPSBvcHRzLncgfHwgdGhpcy5jb250YWluZXIub2Zmc2V0V2lkdGhcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmggPSBvcHRzLmggfHwgdGhpcy5jb250YWluZXIub2Zmc2V0SGVpZ2h0XHJcblxyXG4gICAgICAgIC8vY3JlYXRlIGNhbnZhcyBlbGVtZW50IGlmIG5vdCBzcGVjaWZpZWRcclxuICAgICAgICAvKiogQHR5cGUge0hUTUxDYW52YXNFbGVtZW50fSAqL1xyXG4gICAgICAgIHRoaXMuX2NhbnZhcyA9IG9wdHMuY2FudmFzIHx8IHRoaXMuaW5pdGlhbGlzZUNhbnZhcygpXHJcblxyXG4gICAgICAgIC8qKiBNYWtlIGdlbyBjYW52YXNcclxuICAgICAgICAgKiBAdHlwZSB7R2VvQ2FudmFzfVxyXG4gICAgICAgICAqIEBwcml2YXRlICovXHJcbiAgICAgICAgdGhpcy5nZW9DYW52YXMgPSBuZXcgR2VvQ2FudmFzKHRoaXMuX2NhbnZhcywgb3B0cy54LCBvcHRzLnksIG9wdHMueiwgb3B0cylcclxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5yZWRyYXcgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVkcmF3KClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGxlZ2VuZCBkaXZcclxuICAgICAgICB0aGlzLmxlZ2VuZERpdklkID0gb3B0cy5sZWdlbmREaXZJZCB8fCAnZ3ZpekxlZ2VuZCdcclxuICAgICAgICB0aGlzLmxlZ2VuZCA9IHNlbGVjdCgnIycgKyB0aGlzLmxlZ2VuZERpdklkKVxyXG4gICAgICAgIGlmICh0aGlzLmxlZ2VuZC5lbXB0eSgpKSB0aGlzLmluaXRpYWxpc2VMZWdlbmQoKVxyXG5cclxuICAgICAgICAvL3Rvb2x0aXBcclxuXHJcbiAgICAgICAgLy8gc2V0IEFwcCBjb250YWluZXIgYXMgZGVmYXVsdCBwYXJlbnQgZWxlbWVudCBmb3IgdG9vbHRpcFxyXG4gICAgICAgIGlmICghb3B0cy50b29sdGlwKSBvcHRzLnRvb2x0aXAgPSB7fVxyXG4gICAgICAgIGlmICghb3B0cy50b29sdGlwLnBhcmVudEVsZW1lbnQpIG9wdHMudG9vbHRpcC5wYXJlbnRFbGVtZW50ID0gdGhpcy5jb250YWluZXJcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7VG9vbHRpcH0gKi9cclxuICAgICAgICB0aGlzLnRvb2x0aXAgPSBuZXcgVG9vbHRpcChvcHRzLnRvb2x0aXApXHJcblxyXG4gICAgICAgIC8vIGFkZCBldmVudCBsaXN0ZW5lcnMgdG8gY29udGFpbmVyXHJcbiAgICAgICAgdGhpcy5tb3VzZU92ZXJIYW5kbGVyID0gKGUpID0+IHRoaXMuZm9jdXNDZWxsKGUpXHJcbiAgICAgICAgdGhpcy5tb3VzZU1vdmVIYW5kbGVyID0gKGUpID0+IHRoaXMuZm9jdXNDZWxsKGUpXHJcbiAgICAgICAgdGhpcy5tb3VzZU91dEhhbmRsZXIgPSAoZSkgPT4gdGhpcy50b29sdGlwLmhpZGUoKVxyXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLm1vdXNlT3ZlckhhbmRsZXIpXHJcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlSGFuZGxlcilcclxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCB0aGlzLm1vdXNlT3V0SGFuZGxlcilcclxuXHJcbiAgICAgICAgLy8gbGlzdGVuIGZvciByZXNpemUgZXZlbnRzIG9uIHRoZSBBcHAncyBjb250YWluZXIgYW5kIGhhbmRsZSB0aGVtXHJcbiAgICAgICAgdGhpcy5kZWZpbmVSZXNpemVPYnNlcnZlcih0aGlzLmNvbnRhaW5lciwgdGhpcy5fY2FudmFzKVxyXG5cclxuICAgICAgICAvLyBhZGQgZXh0cmEgbG9naWMgdG8gb25ab29tU3RhcnRGdW5cclxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5vblpvb21TdGFydEZ1biA9IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChvcHRzLm9uWm9vbVN0YXJ0RnVuKSBvcHRzLm9uWm9vbVN0YXJ0RnVuKGUpXHJcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vZm9yIG1vdXNlIG92ZXJcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudHxudWxsfSAqL1xyXG4gICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IG51bGxcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVDb2xvciA9IG9wdHMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3IgfHwgJ3JlZCdcclxuICAgICAgICB0aGlzLnNlbGVjdGlvblJlY3RhbmdsZVdpZHRoUGl4ID0gb3B0cy5zZWxlY3Rpb25SZWN0YW5nbGVXaWR0aFBpeCB8fCAoKCkgPT4gNCkgLy8ocix6KSA9PiB7fVxyXG5cclxuICAgICAgICAvLyB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIChlLmcuIGxlYWZsZXQpICdyZWQgcGFpbnRpbmcnIGZpeFxyXG4gICAgICAgIHRoaXMudHJhbnNwYXJlbnRCYWNrZ3JvdW5kID0gb3B0cy50cmFuc3BhcmVudEJhY2tncm91bmRcclxuXHJcbiAgICAgICAgLy9zZXQgZGVmYXVsdCBnbG9iYWxDb21wb3NpdGVPcGVyYXRpb25cclxuICAgICAgICB0aGlzLmRlZmF1bHRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPVxyXG4gICAgICAgICAgICBvcHRzLmRlZmF1bHRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gfHwgdGhpcy5nZW9DYW52YXMuY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHJldHVybnMge0hUTUxDYW52YXNFbGVtZW50fVxyXG4gICAgICovXHJcbiAgICBpbml0aWFsaXNlQ2FudmFzKCkge1xyXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXHJcbiAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcclxuICAgICAgICBjYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuaClcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpXHJcbiAgICAgICAgcmV0dXJuIGNhbnZhc1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRpYWxpc2VMZWdlbmQoKSB7XHJcbiAgICAgICAgdGhpcy5sZWdlbmQgPSBzZWxlY3QodGhpcy5jb250YWluZXIuaWQgJiYgdGhpcy5jb250YWluZXIuaWQgIT0gJycgPyAnIycgKyB0aGlzLmNvbnRhaW5lci5pZCA6ICdib2R5JylcclxuICAgICAgICAgICAgLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgLmF0dHIoJ2lkJywgdGhpcy5sZWdlbmREaXZJZClcclxuICAgICAgICAgICAgLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnd2lkdGgnLCAnYXV0bycpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnaGVpZ2h0JywgJ2F1dG8nKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2JhY2tncm91bmQnLCAnI0ZGRkZGRicpXHJcbiAgICAgICAgICAgIC8vLnN0eWxlKFwicGFkZGluZ1wiLCB0aGlzLnBhZGRpbmcpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnYm9yZGVyJywgJzBweCcpXHJcbiAgICAgICAgICAgIC8vLnN0eWxlKCdib3JkZXItcmFkaXVzJywgJzVweCcpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnYm94LXNoYWRvdycsICczcHggM3B4IDNweCBncmV5LCAtM3B4IC0zcHggM3B4ICNkZGQnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtZmFtaWx5JywgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2JvdHRvbScsICcxNXB4JylcclxuICAgICAgICAgICAgLnN0eWxlKCdyaWdodCcsICcxNXB4JylcclxuICAgICAgICAvL2hpZGVcclxuICAgICAgICAvLy5zdHlsZShcInZpc2liaWxpdHlcIiwgXCJoaWRkZW5cIilcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldC9nZXQgbGF5ZXIgc3RhY2suXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHt1bmRlZmluZWR8aW1wb3J0KFwiLi9MYXllci5qc1wiKS5MYXllcnxpbXBvcnQoXCIuL0xheWVyLmpzXCIpLkxheWVyW119IGxheWVyc1xyXG4gICAgICogQHJldHVybnMgeyB0aGlzIHwgaW1wb3J0KFwiLi9MYXllci5qc1wiKS5MYXllcltdIH1cclxuICAgICAqL1xyXG4gICAgbGF5ZXJzXyhsYXllcnMpIHtcclxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMubGF5ZXJzXHJcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheWVycykpIHRoaXMubGF5ZXJzID0gbGF5ZXJzXHJcbiAgICAgICAgICAgIGVsc2UgdGhpcy5sYXllcnMgPSBbbGF5ZXJzXVxyXG4gICAgICAgIGVsc2UgdGhpcy5sYXllcnMgPSBhcmd1bWVudHNcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcmV0dXJucyB7dGhpc30gKi9cclxuICAgIHJlZHJhdygpIHtcclxuICAgICAgICAvL3JlbW92ZSBsZWdlbmQgZWxlbWVudHNcclxuICAgICAgICBpZiAodGhpcy5sZWdlbmQpIHRoaXMubGVnZW5kLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXHJcblxyXG4gICAgICAgIC8vY2xlYXJcclxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcclxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5jbGVhcih0aGlzLmdlb0NhbnZhcy5iYWNrZ3JvdW5kQ29sb3IpXHJcblxyXG4gICAgICAgIGNvbnN0IHogPSB0aGlzLmdlb0NhbnZhcy52aWV3LnpcclxuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXHJcblxyXG4gICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzXHJcbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xyXG4gICAgICAgICAgICAvL2NoZWNrIGlmIGxheWVyIGlzIHZpc2libGVcclxuICAgICAgICAgICAgaWYgKGxheWVyLnZpc2libGUgJiYgIWxheWVyLnZpc2libGUoeikpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3NldCBsYXllciBhbHBoYSBhbmQgYmxlbmQgbW9kZVxyXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZ2xvYmFsQWxwaGEgPSBsYXllci5hbHBoYSA/IGxheWVyLmFscGhhKHopIDogMS4wXHJcbiAgICAgICAgICAgIGlmIChsYXllci5ibGVuZE9wZXJhdGlvbikgdGhpcy5nZW9DYW52YXMuY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGxheWVyLmJsZW5kT3BlcmF0aW9uKHopXHJcblxyXG4gICAgICAgICAgICAvL3NldCBhZmZpbiB0cmFuc2Zvcm0gdG8gZHJhdyB3aXRoIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlc1xyXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGxheWVyXHJcbiAgICAgICAgICAgIGxheWVyLmRyYXcodGhpcy5nZW9DYW52YXMsIHRoaXMubGVnZW5kKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGxheWVyIGZpbHRlclxyXG4gICAgICAgICAgICBpZiAobGF5ZXIuZmlsdGVyQ29sb3IpIGxheWVyLmRyYXdGaWx0ZXIodGhpcy5nZW9DYW52YXMpXHJcblxyXG4gICAgICAgICAgICAvL3Jlc3RvcmUgZGVmYXVsdCBhbHBoYSBhbmQgYmxlbmQgb3BlcmF0aW9uXHJcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5nbG9iYWxBbHBoYSA9IDEuMFxyXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gdGhpcy5kZWZhdWx0R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IG51bGxcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXJnaW5QeFxyXG4gICAgICogQHJldHVybnMge2ltcG9ydCgnLi9HZW9DYW52YXMuanMnKS5FbnZlbG9wZX1cclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgdXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4ID0gMjApIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMudXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUgKi9cclxuICAgIGZvY3VzQ2VsbChlKSB7XHJcbiAgICAgICAgLy9jb21wdXRlIG1vdXNlIGdlbyBwb3NpdGlvblxyXG4gICAgICAgIGNvbnN0IG1vdXNlUG9zaXRpb25HZW8gPSB7XHJcbiAgICAgICAgICAgIHg6IHRoaXMuZ2VvQ2FudmFzLnBpeFRvR2VvWChlLm9mZnNldFggKyB0aGlzLnRvb2x0aXAueE1vdXNlT2Zmc2V0KSxcclxuICAgICAgICAgICAgeTogdGhpcy5nZW9DYW52YXMucGl4VG9HZW9ZKGUub2Zmc2V0WSArIHRoaXMudG9vbHRpcC55TW91c2VPZmZzZXQpLFxyXG4gICAgICAgIH1cclxuICAgICAgICAvKiogQHR5cGUge3tjZWxsOmltcG9ydCgnLi9EYXRhc2V0LmpzJykuQ2VsbCxodG1sOnN0cmluZyxyZXNvbHV0aW9uOm51bWJlcn0gfCB1bmRlZmluZWR9ICovXHJcbiAgICAgICAgY29uc3QgZm9jdXMgPSB0aGlzLmdldENlbGxGb2N1c0luZm8obW91c2VQb3NpdGlvbkdlbylcclxuXHJcbiAgICAgICAgLy8gdHJhbnNwYXJlbnQgYmFja2dyb3VuZCAoZS5nLiBsZWFmbGV0KSAncmVkIHBhaW50aW5nJyBmaXhcclxuICAgICAgICBpZiAodGhpcy50cmFuc3BhcmVudEJhY2tncm91bmQpIHtcclxuICAgICAgICAgICAgaWYgKGZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChmb2N1cy5odG1sKVxyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnNldFBvc2l0aW9uKGUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2hvdygpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcclxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcclxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmgpXHJcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5nZXRDb250ZXh0KCcyZCcpPy5kcmF3SW1hZ2UodGhpcy5nZW9DYW52YXMuY2FudmFzLCAwLCAwKVxyXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZm9jdXMpIHtcclxuICAgICAgICAgICAgdGhpcy50b29sdGlwLmh0bWwoZm9jdXMuaHRtbClcclxuICAgICAgICAgICAgdGhpcy50b29sdGlwLnNldFBvc2l0aW9uKGUpXHJcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5zaG93KClcclxuXHJcbiAgICAgICAgICAgIC8vc2hvdyBjZWxsIHBvc2l0aW9uIGFzIGEgcmVjdGFuZ2xlXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jYW52YXNTYXZlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmdldENvbnRleHQoJzJkJyk/LmRyYXdJbWFnZSh0aGlzLmdlb0NhbnZhcy5jYW52YXMsIDAsIDApXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzU2F2ZSwgMCwgMClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGltYWdlIHNhdmVkICsgZHJhdyByZWN0YW5nbGVcclxuICAgICAgICAgICAgY29uc3QgcmVjdFdQaXggPSB0aGlzLnNlbGVjdGlvblJlY3RhbmdsZVdpZHRoUGl4XHJcbiAgICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXgoZm9jdXMucmVzb2x1dGlvbiwgdGhpcy5nZW9DYW52YXMudmlldy56KVxyXG4gICAgICAgICAgICAgICAgOiA0XHJcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxyXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnNlbGVjdGlvblJlY3RhbmdsZUNvbG9yXHJcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSByZWN0V1BpeFxyXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5yZWN0KFxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuZ2VvVG9QaXhYKGZvY3VzLmNlbGwueCkgLSByZWN0V1BpeCAvIDIsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5nZW9Ub1BpeFkoZm9jdXMuY2VsbC55KSArIHJlY3RXUGl4IC8gMixcclxuICAgICAgICAgICAgICAgIGZvY3VzLnJlc29sdXRpb24gLyB0aGlzLmdlb0NhbnZhcy52aWV3LnogKyByZWN0V1BpeCxcclxuICAgICAgICAgICAgICAgIC1mb2N1cy5yZXNvbHV0aW9uIC8gdGhpcy5nZW9DYW52YXMudmlldy56IC0gcmVjdFdQaXhcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbnZhc1NhdmUpIHRoaXMuZ2VvQ2FudmFzLmN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLCAwLCAwKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgY2VsbCBIVE1MIGluZm8gYXQgYSBnaXZlbiBnZW8gcG9zaXRpb24uXHJcbiAgICAgKiBUaGlzIGlzIHVzZWZ1bGwgZm9yIHVzZXIgaW50ZXJhY3Rpb25zLCB0byBzaG93IHRoaXMgaW5mbyB3aGVyZSB0aGUgdXNlciBjbGlja3MgZm9yIGV4YW1wbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSBwb3NHZW9cclxuICAgICAqIEByZXR1cm5zIHt7Y2VsbDppbXBvcnQoJy4vRGF0YXNldC5qcycpLkNlbGwsaHRtbDpzdHJpbmcscmVzb2x1dGlvbjpudW1iZXJ9IHwgdW5kZWZpbmVkfVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICovXHJcbiAgICBnZXRDZWxsRm9jdXNJbmZvKHBvc0dlbykge1xyXG4gICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzLCBzdGFydGluZyBmcm9tIHRvcFxyXG4gICAgICAgIGNvbnN0IHogPSB0aGlzLmdlb0NhbnZhcy52aWV3LnpcclxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5sYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL0xheWVyLmpzXCIpLkxheWVyfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzW2ldXHJcbiAgICAgICAgICAgIGlmIChsYXllci52aXNpYmxlICYmICFsYXllci52aXNpYmxlKHopKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAoIWxheWVyLmNlbGxJbmZvSFRNTCkgY29udGludWVcclxuICAgICAgICAgICAgLy9pZiAobGF5ZXIuY2VsbEluZm9IVE1MID09PSAnbm9uZScpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGlmICghbGF5ZXIuZ2V0RGF0YXNldCkgY29udGludWVcclxuICAgICAgICAgICAgY29uc3QgZHNjID0gbGF5ZXIuZ2V0RGF0YXNldCh6KVxyXG4gICAgICAgICAgICBpZiAoIWRzYykgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IGNlbGwgYXQgbW91c2UgcG9zaXRpb25cclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJy4vRGF0YXNldC5qcycpLkNlbGx8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gZHNjLmdldENlbGxGcm9tUG9zaXRpb24ocG9zR2VvLCBkc2MuZ2V0Vmlld0NhY2hlKCkpXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coY2VsbCwgZHNjLnJlc29sdXRpb24pXHJcbiAgICAgICAgICAgIGlmICghY2VsbCkgcmV0dXJuIHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAgICAgLy9yYXJlIGNhc2UgZm9yIGEgZGF0YXNldCB3aXRoIG1peGVkIHJlc29sdXRpb25zXHJcbiAgICAgICAgICAgIGlmIChkc2MubWl4ZWRSZXNvbHV0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByID0gK2RzYy5taXhlZFJlc29sdXRpb24oY2VsbClcclxuICAgICAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsYXllci5jZWxsSW5mb0hUTUwoY2VsbCwgcilcclxuICAgICAgICAgICAgICAgIGlmICghaHRtbCkgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogciB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsYXllci5jZWxsSW5mb0hUTUwoY2VsbCwgZHNjLmdldFJlc29sdXRpb24oKSlcclxuICAgICAgICAgICAgaWYgKCFodG1sKSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIHJldHVybiB7IGNlbGw6IGNlbGwsIGh0bWw6IGh0bWwsIHJlc29sdXRpb246IGRzYy5nZXRSZXNvbHV0aW9uKCkgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ8dW5kZWZpbmVkfSB6XHJcbiAgICAgKi9cclxuICAgIHNldFZpZXcoeCwgeSwgeiA9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnZpZXcueCA9IHhcclxuICAgICAgICB0aGlzLmdlb0NhbnZhcy52aWV3LnkgPSB5XHJcbiAgICAgICAgaWYgKHogIT0gdW5kZWZpbmVkKSB0aGlzLmdlb0NhbnZhcy52aWV3LnogPSB6XHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge2ltcG9ydCgnLi9HZW9DYW52YXMuanMnKS5WaWV3fSAqL1xyXG4gICAgZ2V0VmlldygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMudmlld1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xyXG4gICAgZ2V0Wm9vbSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMudmlldy56XHJcbiAgICB9XHJcbiAgICAvKiogQHBhcmFtIHtudW1iZXJ9IHogQHJldHVybnMge3RoaXN9ICovXHJcbiAgICBzZXRab29tKHopIHtcclxuICAgICAgICB0aGlzLmdlb0NhbnZhcy52aWV3LnogPSB6XHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXJ8dW5kZWZpbmVkPn0gKi9cclxuICAgIGdldENlbnRlckV4dGVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMuZ2V0Q2VudGVyRXh0ZW50KClcclxuICAgIH1cclxuICAgIC8qKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSB2YWwgQHJldHVybnMge3RoaXN9ICovXHJcbiAgICBzZXRDZW50ZXJFeHRlbnQodmFsKSB7XHJcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuc2V0Q2VudGVyRXh0ZW50KHZhbClcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcmV0dXJucyB7QXJyYXkuPG51bWJlcj59ICovXHJcbiAgICBnZXRab29tRXh0ZW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5nZXRab29tRXh0ZW50KClcclxuICAgIH1cclxuICAgIC8qKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSB2YWwgQHJldHVybnMge3RoaXN9ICovXHJcbiAgICBzZXRab29tRXh0ZW50KHZhbCkge1xyXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldFpvb21FeHRlbnQodmFsKVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXHJcbiAgICBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VvQ2FudmFzLmJhY2tncm91bmRDb2xvclxyXG4gICAgfVxyXG4gICAgLyoqIEBwYXJhbSB7c3RyaW5nfSB2YWwgQHJldHVybnMge3RoaXN9ICovXHJcbiAgICBzZXRCYWNrZ3JvdW5kQ29sb3IodmFsKSB7XHJcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuYmFja2dyb3VuZENvbG9yID0gdmFsXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBzZXQgb2Ygem9vbSBidXR0b25zIHRvIHRoZSBtYXBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICogQHJldHVybnMge3RoaXN9XHJcbiAgICAgKi9cclxuICAgIGFkZFpvb21CdXR0b25zKG9wdHMpIHtcclxuICAgICAgICAvLyAqIG9wdHMuaWRcclxuICAgICAgICAvLyAqIG9wdHMub25ab29tIC0gY3VzdG9tIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cclxuICAgICAgICAvLyAqIG9wdHMueFxyXG4gICAgICAgIC8vICogb3B0cy55XHJcbiAgICAgICAgLy8gKiBvcHRzLmRlbHRhIC0gem9vbSBkZWx0YSBhcHBsaWVkIG9uIGVhY2ggY2xpY2tcclxuXHJcbiAgICAgICAgdGhpcy56b29tQnV0dG9ucyA9IG5ldyBab29tQnV0dG9ucyh7XHJcbiAgICAgICAgICAgIG1hcDogdGhpcyxcclxuICAgICAgICAgICAgaWQ6IG9wdHM/LmlkIHx8ICdncmlkdml6LXpvb20tYnV0dG9ucycsXHJcbiAgICAgICAgICAgIGNsYXNzOiBvcHRzPy5jbGFzcyxcclxuICAgICAgICAgICAgeDogb3B0cz8ueCxcclxuICAgICAgICAgICAgeTogb3B0cz8ueSxcclxuICAgICAgICAgICAgb25ab29tOiBvcHRzPy5vblpvb20sXHJcbiAgICAgICAgICAgIGRlbHRhOiBvcHRzPy5kZWx0YSB8fCAwLjIsXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBmdWxsc2NyZWVuIHRvZ2dsZSBidXR0b24gdG8gdGhlIGFwcFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgYWRkRnVsbHNjcmVlbkJ1dHRvbihvcHRzKSB7XHJcbiAgICAgICAgLy8gKiBvcHRzLm1hcCAtIHRoZSBncmlkdml6IG1hcFxyXG4gICAgICAgIC8vICogb3B0cy5pZFxyXG4gICAgICAgIC8vICogb3B0cy54XHJcbiAgICAgICAgLy8gKiBvcHRzLnlcclxuXHJcbiAgICAgICAgdGhpcy5mdWxsc2NyZWVuQnV0dG9uID0gbmV3IEZ1bGxzY3JlZW5CdXR0b24oe1xyXG4gICAgICAgICAgICBtYXA6IHRoaXMsXHJcbiAgICAgICAgICAgIGlkOiBvcHRzPy5pZCB8fCAnZ3JpZHZpei1mdWxsc2NyZWVuLWJ1dHRvbicsXHJcbiAgICAgICAgICAgIGNsYXNzOiBvcHRzPy5jbGFzcyxcclxuICAgICAgICAgICAgeDogb3B0cz8ueCxcclxuICAgICAgICAgICAgeTogb3B0cz8ueSxcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcmV0dXJucyB7dGhpc30gKi9cclxuICAgIHNldFZpZXdGcm9tVVJMKCkge1xyXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldFZpZXdGcm9tVVJMKClcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZCBhIHJlc2l6ZSBldmVudCBvYnNlcnZlciB0byB0aGUgQXBwcyBjb250YWluZXIgYW5kIHVwZGF0ZSB0aGUgY2FudmFzIGFjY29yZGluZ2x5XHJcbiAgICAgKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50fSBjb250YWluZXIgVGhlIEFwcCdzIGNvbnRhaW5lciBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXMgVGhlIEFwcCBjYW52YXMgZWxlbWVudFxyXG4gICAgICogQG1lbWJlcm9mIEFwcFxyXG4gICAgICovXHJcbiAgICBkZWZpbmVSZXNpemVPYnNlcnZlcihjb250YWluZXIsIGNhbnZhcykge1xyXG4gICAgICAgIC8vIGxpc3RlbiB0byByZXNpemUgZXZlbnRzXHJcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcclxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGNhbnZhcyBoYXMgYmVlbiBidWlsdFxyXG4gICAgICAgICAgICBpZiAoY29udGFpbmVyLmNsaWVudFdpZHRoID4gMCAmJiBjb250YWluZXIuY2xpZW50SGVpZ2h0ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvbnQgZXhjZWVkIGxvb3AgbGltaXQgZmlyc3RcclxuICAgICAgICAgICAgICAgIC8vIHNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDkzODQxMjAvcmVzaXplb2JzZXJ2ZXItbG9vcC1saW1pdC1leGNlZWRlZFxyXG4gICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpIHx8ICFlbnRyaWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBtYXAgYW5kIGNhbnZhcyBzaXplXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaCAhPT0gY29udGFpbmVyLmNsaWVudEhlaWdodCB8fCB0aGlzLncgIT09IGNvbnRhaW5lci5jbGllbnRXaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmggPSBjb250YWluZXIuY2xpZW50SGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudyA9IGNvbnRhaW5lci5jbGllbnRXaWR0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5oID0gY29udGFpbmVyLmNsaWVudEhlaWdodFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy53ID0gY29udGFpbmVyLmNsaWVudFdpZHRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJycgKyB0aGlzLncpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdygpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSBidXR0b24gcG9zaXRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0aGlzLnpvb21CdXR0b25zKSB0aGlzLnpvb21CdXR0b25zLm5vZGUuc3R5bGUubGVmdCA9IHRoaXMudyAtIDUwICsgJ3B4J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy5mdWxsc2NyZWVuQnV0dG9uKSB0aGlzLmZ1bGxzY3JlZW5CdXR0b24ubm9kZS5zdHlsZS5sZWZ0ID0gdGhpcy53IC0gNTAgKyAncHgnXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIERlc3Ryb3kgdGhlIG1hcCBhbmQgaXQncyBldmVudCBsaXN0ZW5lcnNcclxuICAgICAqIFRoaXMgc2hvdWxkIHNpZ25pZmljYW50bHkgcmVkdWNlIHRoZSBtZW1vcnkgdXNlZCB3aGVuIGNyZWF0aW5nIGFuZCBkZXN0cm95aW5nIGdyaWR2aXogbWFwIGluc3RhbmNlcyAoZm9yIGV4YW1wbGUgaW4gbGVhZmxldC1ncmlkdml6KVxyXG4gICAgICogQG1lbWJlcm9mIEFwcFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95KCkge1xyXG4gICAgICAgIC8vIGNsZWFyIGxheWVyc1xyXG4gICAgICAgIHRoaXMubGF5ZXJzID0gW11cclxuICAgICAgICB0aGlzLmJnTGF5ZXJzID0gW11cclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyBmcm9tIGNvbnRhaW5lclxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMubW91c2VPdmVySGFuZGxlcilcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZUhhbmRsZXIpXHJcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCB0aGlzLm1vdXNlT3V0SGFuZGxlcilcclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlIGNhbnZhc1xyXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5yZW1vdmUoKVxyXG5cclxuICAgICAgICAvLyByZW1vdmUgbGVnZW5kXHJcbiAgICAgICAgdGhpcy5sZWdlbmQ/LnJlbW92ZSgpXHJcblxyXG4gICAgICAgIC8vIHJlbW92ZSB0b29sdGlwXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnRvb2x0aXA/LnJlbW92ZSgpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKipcclxuICogQSBtdWx0aSByZXNvbHV0aW9uIGRhdGFzZXQgb2YgZ3JpZCBjZWxscy5cclxuICogSXQgY29uc2lzdHMgb2YgZGlmZmVyZW50IHtAbGluayBEYXRhc2V0fXMgZm9yIGVhY2ggcmVzb2x1dGlvbi5cclxuICpcclxuICogQGFic3RyYWN0XHJcbiAqXHJcbiAqIEBtb2R1bGUgY29yZVxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTXVsdGlSZXNvbHV0aW9uRGF0YXNldCB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHJlc29sdXRpb25zIFRoZSByZXNvbHV0aW9ucyBvZiB0aGUgZGF0YXNldHMsIGluIENSUyBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0PnxmdW5jdGlvbihudW1iZXIpOmltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0fSBkYXRhc2V0cyBUaGUgZGF0YXNldHMgbGlzdCwgb25lIHBlciByZXNvbHV0aW9uLiBPciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGRhdGFzZXQgZnJvbSBhIHJlc29sdXRpb24gdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0geyB7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGwpOmJvb2xlYW59IH0gb3B0cyBPcHRpb25zLiBwcmVwcm9jZXNzOiBBIGZ1bmN0aW9uIHRvIGFwcGx5IG9uIGVhY2ggZGF0YXNldCBjZWxsIHRvIHByZXBhcmUgaXRzIHZhbHVlcy4gQ2FuIGJlIHVzZWQgYWxzbyB0byBzZWxlY3QgY2VsbHMgdG8ga2VlcC5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocmVzb2x1dGlvbnMsIGRhdGFzZXRzLCBvcHRzID0ge30pIHtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0cywgaW4gQ1JTIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cclxuICAgICAgICB0aGlzLnJlc29sdXRpb25zID0gcmVzb2x1dGlvbnNcclxuXHJcbiAgICAgICAgLyoqIFRoZSBkYXRhc2V0cy4gSWYgdGhlIGxpc3QgaXMgbm90IGV4cGxpY3RlbHkgZGVmaW5lZCwgYnVpbGQgaXQgZnJvbSB0aGUgcmVzb2x1dGlvbiBsaXN0IHdpdGggdGhlIGZ1bmN0aW9uXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL0RhdGFzZXRcIikuRGF0YXNldD59ICovXHJcbiAgICAgICAgdGhpcy5kYXRhc2V0cyA9ICh0eXBlb2YgZGF0YXNldHMgPT09ICdmdW5jdGlvbicpID8gdGhpcy5yZXNvbHV0aW9ucy5tYXAoZGF0YXNldHMpIDogZGF0YXNldHNcclxuXHJcbiAgICAgICAgLy90aGVyZSBtdXN0IGJlIGFzIG1hbnkgZGF0YXNldHMgYXMgcmVzb2x1dGlvbnNcclxuICAgICAgICBpZiAodGhpcy5kYXRhc2V0cy5sZW5ndGggPiAxICYmIHRoaXMuZGF0YXNldHMubGVuZ3RoICE9IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAnVW5jb21wYXRpYmxlIG51bWJlciBvZiBkYXRhc2V0cyBhbmQgcmVzb2x1dGlvbnM6ICcgK1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhc2V0cy5sZW5ndGggK1xyXG4gICAgICAgICAgICAgICAgJyAnICtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoXHJcbiAgICAgICAgICAgIClcclxuXHJcbiAgICAgICAgLy9zZXQgZGF0YXNldCBwcmVwcm9jZXNzZXMgaWYgc3BlY2lmaWVkXHJcbiAgICAgICAgaWYgKG9wdHMucHJlcHJvY2VzcykgdGhpcy5zZXRQcmVwb2Nlc3NlcyhvcHRzLnByZXByb2Nlc3MpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSByZWxldmFudCBkYXRhc2V0IGZvciBhIHNwZWNpZmllZCB6b29tLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5QaXhlbHNQZXJDZWxsXHJcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR8dW5kZWZpbmVkfVxyXG4gICAgICogKi9cclxuICAgIGdldERhdGFzZXQoeiwgbWluUGl4ZWxzUGVyQ2VsbCkge1xyXG5cclxuICAgICAgICAvL3NwZWNpYWwgY2FzZSB3aGl0aCBzaW5nbGUgZGF0YXNldFxyXG4gICAgICAgIGlmICh0aGlzLmRhdGFzZXRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy5kYXRhc2V0c1swXVxyXG5cclxuICAgICAgICBjb25zdCBycyA9IHRoaXMucmVzb2x1dGlvbnNcclxuICAgICAgICBsZXQgaSA9IDBcclxuICAgICAgICBsZXQgel8gPSByc1tpXSAvIG1pblBpeGVsc1BlckNlbGxcclxuICAgICAgICB3aGlsZSAoel8gPCB6ICYmIGkgPCBycy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgaSsrXHJcbiAgICAgICAgICAgIHpfID0gcnNbaV0gLyBtaW5QaXhlbHNQZXJDZWxsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vaWYgKGkgPT0gMCkgcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0c1swXTtcclxuICAgICAgICAvL3JldHVybiB0aGlzLmRhdGFzZXQuZGF0YXNldHNbaSAtIDFdO1xyXG4gICAgICAgIGlmIChpID09IHJzLmxlbmd0aCkgcmV0dXJuIHRoaXMuZGF0YXNldHNbcnMubGVuZ3RoIC0gMV1cclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhc2V0c1tpXVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgYSBwcmVwcm9jZXNzIGZ1bmN0aW9uIGZvciBhbGwgZGF0YXNldHMuXHJcbiAgICAgKiBUaGlzIGlzIGEgZnVuY3Rpb24gYXBwbGllZCBvbiBlYWNoIGNlbGwgYWZ0ZXIgaXQgaGFzIGJlZW4gbG9hZGVkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGwpOmJvb2xlYW59IHByZXByb2Nlc3NcclxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxyXG4gICAgICovXHJcbiAgICBzZXRQcmVwb2Nlc3NlcyhwcmVwcm9jZXNzKSB7XHJcbiAgICAgICAgZm9yIChsZXQgZHMgb2YgdGhpcy5kYXRhc2V0cykgZHMucHJlcHJvY2VzcyA9IHByZXByb2Nlc3NcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBmdW5jdGlvbiB0byBlYXNlIHRoZSBjcmVhdGlvbiBvZiBtdWx0aSByZXNvbHV0aW9uIGRhdGFzZXRzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHJlc29sdXRpb25zIFRoZSByZXNvbHV0aW9ucyBvZiB0aGUgZGF0YXNldHMsIGluIENSUyBnZW9ncmFwaGljYWwgdW5pdFxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOmltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0fSByZXNUb0RhdGFzZXQgRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGF0YXNldCBmcm9tIGEgcmVzb2x1dGlvblxyXG4gICAgICogQHBhcmFtIHsge3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFufSB9IG9wdHMgT3B0aW9ucy4gcHJlcHJvY2VzczogQSBmdW5jdGlvbiB0byBhcHBseSBvbiBlYWNoIGRhdGFzZXQgY2VsbCB0byBwcmVwYXJlIGl0cyB2YWx1ZXNcclxuICAgICAqIEByZXR1cm5zIHtNdWx0aVJlc29sdXRpb25EYXRhc2V0fVxyXG4gICAgICovXHJcbiAgICAvKnN0YXRpYyBtYWtlKHJlc29sdXRpb25zLCByZXNUb0RhdGFzZXQsIG9wdHMpIHtcclxuICAgICAgICAvL21ha2UgZGF0YXNldHNcclxuICAgICAgICBjb25zdCBkc2MgPSBbXVxyXG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc29sdXRpb25zKSBkc2MucHVzaChyZXNUb0RhdGFzZXQocmVzKSlcclxuICAgICAgICAvL21ha2UgbXVsdGkgcmVzb2x1dGlvbiBkYXRhc2V0XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVJlc29sdXRpb25EYXRhc2V0KGRzYywgcmVzb2x1dGlvbnMsIG9wdHMpXHJcbiAgICB9Ki9cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IERyYXdhYmxlIH0gZnJvbSBcIi4vRHJhd2FibGUuanNcIlxyXG5cclxuLyoqIEB0eXBlZGVmIHtcInNxdWFyZVwifFwiY2lyY2xlXCJ8XCJkaWFtb25kXCJ8XCJkb251dFwifFwidHJpYW5nbGVfdXBcInxcInRyaWFuZ2xlX2Rvd25cInxcInRyaWFuZ2xlX2xlZnRcInxcInRyaWFuZ2xlX3JpZ2h0XCJ8XCJub25lXCJ9IFNoYXBlICovXHJcblxyXG4vKipcclxuICogdmlld1NjYWxlIHR5cGVcclxuICogUmV0dXJucyBhbiBvYmplY3QgZnJvbSBhIGxpc3Qgb2YgY2VsbHMsIFxyXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydCgnLi9EYXRhc2V0LmpzJykuQ2VsbD4sbnVtYmVyLCBudW1iZXIpOip9IFZpZXdTY2FsZSAqL1xyXG5cclxuLyoqXHJcbiAqIEEgc3R5bGUsIHRvIHNob3cgYSBncmlkIGRhdGFzZXQuXHJcbiAqXHJcbiAqIEBtb2R1bGUgY29yZVxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3R5bGUgZXh0ZW5kcyBEcmF3YWJsZSB7XHJcbiAgICAvKipcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICogQHBhcmFtIHt7ZmlsdGVyPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOmJvb2xlYW4sIG9mZnNldD86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLCBudW1iZXIsIG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9LCB2aXNpYmxlPzpmdW5jdGlvbihudW1iZXIpOmJvb2xlYW4sYWxwaGE/OmZ1bmN0aW9uKG51bWJlcik6bnVtYmVyLGJsZW5kT3BlcmF0aW9uPzpmdW5jdGlvbihudW1iZXIpOkdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbixkcmF3RnVuPzpmdW5jdGlvbix2aWV3U2NhbGU/OlZpZXdTY2FsZX19IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgKiBAdHlwZSB7Vmlld1NjYWxlfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLnZpZXdTY2FsZSA9IG9wdHMudmlld1NjYWxlXHJcblxyXG4gICAgICAgIC8qKiBBIGZpbHRlciBmdW5jdGlvbiB0byBhcHBseSB0byB0aGUgY2VsbCBsaXN0LCB0byBmaWx0ZXIgb3V0IHNvbWUgY2VsbHMgbm90IHRvIGJlIGRyYXduIChzdWNoIGFzIGZvciBleGFtcGxlIHRoZSBjZWxscyB3aXRoIHZhbHVlPTApLlxyXG4gICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLmZpbHRlciA9IG9wdHMuZmlsdGVyIHx8ICgoKSA9PiB0cnVlKVxyXG5cclxuICAgICAgICAvKiogQW4gb2Zmc2V0LiBUaGlzIGlzIHRvIGFsdGVyIHRoZSBwb3NpdGlvbiBvZiBhbGwgc3ltYm9scyBpbiBhIGdpdmVuIGRpcmVjdGlvbi4gSW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXHJcbiAgICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSAqL1xyXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb3B0cy5vZmZzZXQgfHwgKChjLCByLCB6KSA9PiAoeyBkeDogMCwgZHk6IDAgfSkpXHJcblxyXG4gICAgICAgIC8qKiBBIGRyYXcgZnVuY3Rpb24gZm9yIHRoZSBzdHlsZS5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb258dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMuZHJhd0Z1biA9IG9wdHMuZHJhd0Z1blxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHVibGljXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL0xlZ2VuZFwiKS5MZWdlbmQ+fSAqL1xyXG4gICAgICAgIHRoaXMubGVnZW5kcyA9IFtdXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IGNlbGxzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbD59IGNlbGxzIFRoZSBjZWxscyB0byBkcmF3LlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlbS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZWlyIHJlc29sdXRpb24gKGluIGdlb2dyYXBoaWMgdW5pdClcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuICAgICAgICBpZiAodGhpcy5kcmF3RnVuKSB0aGlzLmRyYXdGdW4oY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbilcclxuICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGRyYXcgbm90IGltcGxlbWVudGVkLicpXHJcbiAgICB9XHJcblxyXG4gICAgLy9nZXR0ZXJzIGFuZCBzZXR0ZXJzXHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSAqL1xyXG4gICAgZ2V0T2Zmc2V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldFxyXG4gICAgfVxyXG4gICAgLyoqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLG51bWJlcixudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfX0gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xyXG4gICAgc2V0T2Zmc2V0KHZhbCkge1xyXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gdmFsXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKiogVXBkYXRlIGxlZ2VuZHMgb2YgdGhlIHN0eWxlLCBpZiBhbnlcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc30gKi9cclxuICAgIHVwZGF0ZUxlZ2VuZHMob3B0cykge1xyXG4gICAgICAgIFN0eWxlLnVwZGF0ZUxlZ2VuZHNSZWN1cnNpdmUodGhpcy5sZWdlbmRzLCBvcHRzKVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBzdGF0aWMgdXBkYXRlTGVnZW5kc1JlY3Vyc2l2ZShsZywgb3B0cykge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxnKSkgZm9yIChjb25zdCBsZ18gb2YgbGcpIHRoaXMudXBkYXRlTGVnZW5kc1JlY3Vyc2l2ZShsZ18sIG9wdHMpXHJcbiAgICAgICAgZWxzZSBsZy51cGRhdGUob3B0cylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4vTGVnZW5kXCIpLkxlZ2VuZD59IGxlZ2VuZHNcclxuICAgICAqIEByZXR1cm5zIHt0aGlzfSAqL1xyXG4gICAgYWRkTGVnZW5kcyhsZWdlbmRzKSB7XHJcbiAgICAgICAgZm9yIChsZXQgbGVnZW5kIG9mIGxlZ2VuZHMpXHJcbiAgICAgICAgICAgIHRoaXMubGVnZW5kcy5wdXNoKGxlZ2VuZClcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xyXG4vL2ltcG9ydCB7IHRyYW5zaXRpb24gfSBmcm9tIFwiZDMtdHJhbnNpdGlvblwiO1xyXG5cclxuLyoqXHJcbiAqIEEgZ2VuZXJpYyBjbGFzcyB0byBtYWtlIGEgdG9vbHRpcC5cclxuICogSXQgaXMgYSBkaXYgZWxlbWVudCwgd2hpY2ggY2FuIGJlIG1vdmVkIHVuZGVyIHRoZSBtb3VzZSBwb2ludGVyIGFuZCBmaWxsZWQgd2l0aCBzb21lIGluZm9ybWF0aW9uIGluIGh0bWwuXHJcbiAqIEBtb2R1bGUgY29yZVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRvb2x0aXAge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5kaXYgPSBvcHRzLmRpdiB8fCAndG9vbHRpcF9ldXJvc3RhdCdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLm1heFdpZHRoID0gb3B0cy5tYXhXaWR0aCB8fCAnMjBlbSdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAnMS4yZW0nXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gb3B0cy5iYWNrZ3JvdW5kIHx8ICd3aGl0ZSdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnBhZGRpbmcgPSBvcHRzLnBhZGRpbmcgfHwgJzVweCdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmJvcmRlciA9IG9wdHMuYm9yZGVyIHx8ICcwcHgnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpc1snYm9yZGVyLXJhZGl1cyddID0gb3B0c1snYm9yZGVyLXJhZGl1cyddIHx8ICcwcHgnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpc1snYm94LXNoYWRvdyddID0gb3B0c1snYm94LXNoYWRvdyddIHx8ICc1cHggNXB4IDVweCBncmV5J1xyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXNbJ2ZvbnQtZmFtaWx5J10gPSBvcHRzWydmb250LWZhbWlseSddIHx8ICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJ1xyXG5cclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnRyYW5zaXRpb25EdXJhdGlvbiA9IG9wdHMudHJhbnNpdGlvbkR1cmF0aW9uIHx8IDEwMFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMueE9mZnNldCA9IG9wdHMueE9mZnNldCB8fCAzMFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMueU9mZnNldCA9IG9wdHMueU9mZnNldCB8fCAyMFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAvLyBlLmcuIHRvIHByZXZlbnQgbW91c2UgY3Vyc29yIGNvdmVyaW5nIGNlbGwgYmVpbmcgaGlnaGxpZ2h0ZWRcclxuICAgICAgICB0aGlzLnlNb3VzZU9mZnNldCA9IG9wdHMueU1vdXNlT2Zmc2V0IHx8IDBcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnhNb3VzZU9mZnNldCA9IG9wdHMueE1vdXNlT2Zmc2V0IHx8IDBcclxuICAgICAgICAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqL1xyXG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudCA9IG9wdHMucGFyZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwdWJsaWNcclxuICAgICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiZDMtc2VsZWN0aW9uXCIpLlNlbGVjdGlvbn0gKi9cclxuICAgICAgICB0aGlzLnRvb2x0aXAgPSBzZWxlY3QoJyMnICsgdGhpcy5kaXYpXHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXAuZW1wdHkoKSkge1xyXG4gICAgICAgICAgICAvL2NyZWF0ZSB0b29sdGlwIERPTSBub2RlXHJcbiAgICAgICAgICAgIC8vIHRoaXMudG9vbHRpcCA9IHNlbGVjdChcclxuICAgICAgICAgICAgLy8gICAgICcjJyArIHRoaXMucGFyZW50RWxlbWVudC5pZCAmJiB0aGlzLnBhcmVudEVsZW1lbnQuaWQgIT0gJydcclxuICAgICAgICAgICAgLy8gICAgICAgICA/ICcjJyArIHRoaXMucGFyZW50RWxlbWVudC5pZFxyXG4gICAgICAgICAgICAvLyAgICAgICAgIDogJ2JvZHknXHJcbiAgICAgICAgICAgIC8vIClcclxuICAgICAgICAgICAgdGhpcy50b29sdGlwID0gc2VsZWN0KCdib2R5JykuYXBwZW5kKCdkaXYnKS5hdHRyKCdpZCcsIHRoaXMuZGl2KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9pbml0aWFsaXNlXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdtYXgtd2lkdGgnLCB0aGlzLm1heFdpZHRoKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnb3ZlcmZsb3cnLCAnaGlkZGVuJylcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdiYWNrZ3JvdW5kJywgdGhpcy5iYWNrZ3JvdW5kKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgncGFkZGluZycsIHRoaXMucGFkZGluZylcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JvcmRlcicsIHRoaXMuYm9yZGVyKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYm9yZGVyLXJhZGl1cycsIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSlcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JveC1zaGFkb3cnLCB0aGlzWydib3gtc2hhZG93J10pXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdmb250LWZhbWlseScsIHRoaXNbJ2ZvbnQtZmFtaWx5J10pXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdub25lJylcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ29wYWNpdHknLCAnMCcpXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCd0ZXh0LXdyYXAnLCAnbm93cmFwJylcclxuXHJcbiAgICAgICAgLy8gYXJpYS1sYWJlbHMgKHRoYW5rcyB0byB3YWhsYXRsYXMpXHJcbiAgICAgICAgdGhpcy50b29sdGlwLmF0dHIoJ3JvbGUnLCAndG9vbHRpcCcpLmF0dHIoJ2FyaWEtbGl2ZScsICdwb2xpdGUnKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTaG93IHRoZSB0b29sdGlwICovXHJcbiAgICBzaG93KCkge1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLnRvb2x0aXAudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMudHJhbnNpdGlvbkR1cmF0aW9uKS5zdHlsZSgnb3BhY2l0eScsIDEpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEhpZGUgdGhlIHRvb2x0aXAgKi9cclxuICAgIGhpZGUoKSB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy50cmFuc2l0aW9uRHVyYXRpb24pLnN0eWxlKCdvcGFjaXR5JywgMClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY29udGVudCBvZiB0aGUgdG9vbHRpcC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXHJcbiAgICAgKi9cclxuICAgIGh0bWwoaHRtbCkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcC5odG1sKGh0bWwpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b29sdGlwIGF0IHRoZSBtb3VzZSBldmVudCBwb3NpdGlvbi5cclxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcclxuICAgICAqL1xyXG4gICAgc2V0UG9zaXRpb24oZXZlbnQpIHtcclxuICAgICAgICBsZXQgcGFyZW50UmVjdCA9IHRoaXMucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxyXG5cclxuICAgICAgICBsZXQgeCA9IGV2ZW50LnBhZ2VYICsgdGhpcy54T2Zmc2V0XHJcbiAgICAgICAgbGV0IHkgPSBldmVudC5wYWdlWSAtIHRoaXMueU9mZnNldFxyXG5cclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2xlZnQnLCB4ICsgJ3B4Jykuc3R5bGUoJ3RvcCcsIHkgKyAncHgnKVxyXG5cclxuICAgICAgICB0aGlzLmVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIoZXZlbnQsIHBhcmVudFJlY3QpXHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuXHRteS5tb3VzZW92ZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGh0bWwpIHtcclxuXHRcdGlmIChodG1sKSBteS5odG1sKGh0bWwpO1xyXG5cdFx0bXkuc2V0UG9zaXRpb24oZXZlbnQpO1xyXG5cdFx0bXkuc2hvdygpXHJcblx0XHQvL3RoaXMuZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lcigpO1xyXG5cdH07XHJcblx0XHJcblx0bXkubW91c2Vtb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcblx0XHRteS5zZXRQb3NpdGlvbihldmVudCk7XHJcblx0XHQvL3RoaXMuZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lcigpO1xyXG5cdH07XHJcblx0XHJcblx0bXkubW91c2VvdXQgPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRteS5oaWRlKCk7XHJcblx0fTsqL1xyXG5cclxuICAgIHN0eWxlKGssIHYpIHtcclxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy50b29sdGlwLnN0eWxlKGspXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKGssIHYpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBhdHRyKGssIHYpIHtcclxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy50b29sdGlwLmF0dHIoaylcclxuICAgICAgICB0aGlzLnRvb2x0aXAuYXR0cihrLCB2KVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lclxyXG4gICAgICogQGRlc2NyaXB0aW9uIFByZXZlbnRzIHRoZSB0b29sdGlwIGZyb20gb3ZlcmZsb3dpbmcgb3V0IG9mIHRoZSBBcHAgY29udGFpbmVyIChlbnN1cmVzIHRoYXQgdGhlIHRvb2x0aXAgaXMgaW5zaWRlIHRoZSBncmlkdml6IGNvbnRhaW5lcilcclxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcclxuICAgICAqIEBwYXJhbSB7RE9NUmVjdH0gcGFyZW50UmVjdFxyXG4gICAgICovXHJcbiAgICBlbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyID0gZnVuY3Rpb24gKGV2ZW50LCBwYXJlbnRSZWN0KSB7XHJcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLnRvb2x0aXAubm9kZSgpXHJcbiAgICAgICAgbGV0IHBhcmVudFdpZHRoID0gcGFyZW50UmVjdC53aWR0aFxyXG4gICAgICAgIGxldCBwYXJlbnRIZWlnaHQgPSBwYXJlbnRSZWN0LmhlaWdodFxyXG5cclxuICAgICAgICAvL3RvbyBmYXIgcmlnaHRcclxuICAgICAgICBpZiAobm9kZS5vZmZzZXRMZWZ0ID4gcGFyZW50UmVjdC5sZWZ0ICsgcGFyZW50V2lkdGggLSBub2RlLmNsaWVudFdpZHRoKSB7XHJcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gZXZlbnQueCAtIG5vZGUuY2xpZW50V2lkdGggLSB0aGlzLnhPZmZzZXRcclxuICAgICAgICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCdcclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgbW91c2UgY292ZXJzIHRvb2x0aXBcclxuICAgICAgICAgICAgaWYgKG5vZGUub2Zmc2V0TGVmdCArIG5vZGUuY2xpZW50V2lkdGggPiBldmVudC54KSB7XHJcbiAgICAgICAgICAgICAgICAvL21vdmUgdG9vbHRpcCBsZWZ0IHNvIGl0IGRvZXNudCBjb3ZlciBtb3VzZVxyXG4gICAgICAgICAgICAgICAgbGV0IGxlZnQyID0gZXZlbnQueCAtIG5vZGUuY2xpZW50V2lkdGggLSB0aGlzLnhPZmZzZXRcclxuICAgICAgICAgICAgICAgIG5vZGUuc3R5bGUubGVmdCA9IGxlZnQyICsgJ3B4J1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIG5vZGUuc3R5bGUudG9wID0gbm9kZS5vZmZzZXRUb3AgKyBjb25maWcueU9mZnNldCArIFwicHhcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdG9vIGZhciBkb3duXHJcbiAgICAgICAgaWYgKG5vZGUub2Zmc2V0VG9wICsgbm9kZS5jbGllbnRIZWlnaHQgPiBwYXJlbnRSZWN0LnRvcCArIHBhcmVudEhlaWdodCkge1xyXG4gICAgICAgICAgICBub2RlLnN0eWxlLnRvcCA9IG5vZGUub2Zmc2V0VG9wIC0gbm9kZS5jbGllbnRIZWlnaHQgKyAncHgnXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3RvbyBmYXIgdXBcclxuICAgICAgICBpZiAobm9kZS5vZmZzZXRUb3AgPCBwYXJlbnRSZWN0LnRvcCkge1xyXG4gICAgICAgICAgICBub2RlLnN0eWxlLnRvcCA9IHBhcmVudFJlY3QudG9wICsgdGhpcy55T2Zmc2V0ICsgJ3B4J1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8qKiBAdHlwZWRlZiB7eyBkaW1zOiBvYmplY3QsIGNyczogc3RyaW5nLCB0aWxlU2l6ZUNlbGw6IG51bWJlciwgb3JpZ2luUG9pbnQ6IHt4Om51bWJlcix5Om51bWJlcn0sIHJlc29sdXRpb25HZW86IG51bWJlciwgdGlsaW5nQm91bmRzOmltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlIH19IEdyaWRJbmZvICovXHJcblxyXG5pbXBvcnQgeyBkc3YgfSBmcm9tICdkMy1mZXRjaCdcclxuaW1wb3J0IHsgRGF0YXNldCB9IGZyb20gJy4uL2NvcmUvRGF0YXNldC5qcydcclxuXHJcbi8qKlxyXG4gKiBBIGRhdGFzZXQgY29tcG9zZWQgb2YgYSBzaW5nbGUgQ1NWIGZpbGUgKG5vdCB0aWxlZCkuXHJcbiAqXHJcbiAqIEBtb2R1bGUgZGF0YXNldFxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ1NWR3JpZCBleHRlbmRzIERhdGFzZXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvTWFwLmpzXCIpLk1hcH0gbWFwIFRoZSBtYXAuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgZGF0YXNldCByZXNvbHV0aW9uIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86KGZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsKTpib29sZWFuKSxkZWxpbWl0ZXI/OnN0cmluZ319IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobWFwLCB1cmwsIHJlc29sdXRpb24sIG9wdHMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKG1hcCwgdXJsLCByZXNvbHV0aW9uLCBvcHRzKVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSAqL1xyXG4gICAgICAgIHRoaXMuY2VsbHMgPSBbXVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgIHRoaXMuZGVsaW1pdGVyID0gb3B0cy5kZWxpbWl0ZXIgfHwgXCIsXCJcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAcHJpdmF0ZSAgKi9cclxuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcclxuXHJcbiAgICAgICAgLy9nZXQgZGF0YVxyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSh1bmRlZmluZWQpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXF1ZXN0IGRhdGEgd2l0aGluIGEgZ2VvZ3JhcGhpYyBlbnZlbG9wZS5cclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGV8dW5kZWZpbmVkfSBlXHJcbiAgICAgKi9cclxuICAgIGdldERhdGEoZSkge1xyXG4gICAgICAgIC8vY2hlY2sgaWYgZGF0YSBhbHJlYWR5IGxvYWRlZFxyXG4gICAgICAgIGlmICh0aGlzLmluZm9Mb2FkaW5nU3RhdHVzICE9ICdub3RMb2FkZWQnKSByZXR1cm4gdGhpc1xyXG5cclxuICAgICAgICAvL2xvYWQgZGF0YVxyXG4gICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbG9hZGluZydcclxuICAgICAgICAgICAgOyAoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgZHN2KHRoaXMuZGVsaW1pdGVyLCB0aGlzLnVybClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb252ZXJ0IGNvb3JkaW5hdGVzIGluIG51bWJlcnNcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjLnggPSArYy54XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGMueSA9ICtjLnlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzLnB1c2goYylcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBkYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gY2hlY2sgaWYgcmVkcmF3IGlzIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhhdCBpcyBpZiB0aGUgZGF0YXNldCBiZWxvbmdzIHRvIGEgbGF5ZXIgd2hpY2ggaXMgdmlzaWJsZSBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vcmVkcmF3IG1hcFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcCkgdGhpcy5tYXAucmVkcmF3KClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vbWFyayBhcyBmYWlsZWRcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzID0gW11cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkoKVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlsbCB0aGUgdmlldyBjYWNoZSB3aXRoIGFsbCBjZWxscyB3aGljaCBhcmUgd2l0aGluIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGV9IGV4dEdlb1xyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZpZXdDYWNoZShleHRHZW8pIHtcclxuICAgICAgICAvL2RhdGEgbm90IGxvYWRlZCB5ZXRcclxuICAgICAgICBpZiAoIXRoaXMuY2VsbHMpIHJldHVyblxyXG5cclxuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cclxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGhpcy5jZWxscykge1xyXG4gICAgICAgICAgICBpZiAoK2NlbGwueCArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby54TWluKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAoK2NlbGwueCAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby54TWF4KSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAoK2NlbGwueSArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby55TWluKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAoK2NlbGwueSAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby55TWF4KSBjb250aW51ZVxyXG4gICAgICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlLnB1c2goY2VsbClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBEYXRhc2V0IH0gZnJvbSAnLi4vY29yZS9EYXRhc2V0LmpzJ1xyXG5cclxuLyoqXHJcbiAqIEEgZGF0YXNldCBjb21wb3NlZCBvZiBjZWxscyBkZWZpbmVkIGluIGphdmFzY3JpcHQsIG9yIGxvYWRlZCBvdXRzaWRlIG9mIGdyaWR2aXogbWFwLlxyXG4gKlxyXG4gKiBAbW9kdWxlIGRhdGFzZXRcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEpTR3JpZCBleHRlbmRzIERhdGFzZXQge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPE9iamVjdD59IGNlbGxzIFRoZSBjZWxscy5cclxuICAgICAqIEBwYXJhbSB7fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHJlc29sdXRpb24sIGNlbGxzLCBvcHRzID0ge30pIHtcclxuICAgICAgICBzdXBlcih1bmRlZmluZWQsIFwiXCIsIHJlc29sdXRpb24sIG9wdHMpXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGw+fSAqL1xyXG4gICAgICAgIHRoaXMuY2VsbHMgPSBjZWxscyB8fCBbXVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVxdWVzdCBkYXRhIHdpdGhpbiBhIGdlb2dyYXBoaWMgZW52ZWxvcGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9IGVcclxuICAgICAqL1xyXG4gICAgZ2V0RGF0YShlKSB7IHJldHVybiB0aGlzIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbGwgdGhlIHZpZXcgY2FjaGUgd2l0aCBhbGwgY2VsbHMgd2hpY2ggYXJlIHdpdGhpbiBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSBleHRHZW9cclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XHJcbiAgICAgICAgLy9kYXRhIG5vdCBsb2FkZWQgeWV0XHJcbiAgICAgICAgaWYgKCF0aGlzLmNlbGxzKSByZXR1cm5cclxuXHJcbiAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZSA9IFtdXHJcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHRoaXMuY2VsbHMpIHtcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnggLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueE1heCkgY29udGludWVcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueU1pbikgY29udGludWVcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcclxuICAgICAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZS5wdXNoKGNlbGwpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqIEB0eXBlZGVmIHt7IGRpbXM6IG9iamVjdCwgY3JzOiBzdHJpbmcsIHRpbGVTaXplQ2VsbDogbnVtYmVyLCBvcmlnaW5Qb2ludDoge3g6bnVtYmVyLHk6bnVtYmVyfSwgcmVzb2x1dGlvbkdlbzogbnVtYmVyLCB0aWxpbmdCb3VuZHM6aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGUgfX0gR3JpZEluZm8gKi9cclxuXHJcbi8vIGludGVybmFsXHJcbmltcG9ydCB7IERhdGFzZXQgfSBmcm9tICcuLi9jb3JlL0RhdGFzZXQuanMnXHJcbi8vaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvVXRpbHMuanMnXHJcblxyXG4vLyBleHRlcm5hbFxyXG5pbXBvcnQgeyBqc29uLCBjc3YgfSBmcm9tICdkMy1mZXRjaCdcclxuXHJcbi8qKlxyXG4gKiBBIHRpbGVkIGRhdGFzZXQsIGNvbXBvc2VkIG9mIENTViB0aWxlcy5cclxuICpcclxuICogQG1vZHVsZSBkYXRhc2V0XHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUaWxlZEdyaWQgZXh0ZW5kcyBEYXRhc2V0IHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL01hcC5qc1wiKS5NYXB9IG1hcCBUaGUgbWFwLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhc2V0LlxyXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86KGZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsKTpib29sZWFuKSB9fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1hcCwgdXJsLCBvcHRzID0ge30pIHtcclxuICAgICAgICBzdXBlcihtYXAsIHVybCwgMCwgb3B0cylcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGdyaWQgaW5mbyBvYmplY3QsIGZyb20gdGhlIGluZm8uanNvbiBmaWxlLlxyXG4gICAgICAgICAqICBAdHlwZSB7R3JpZEluZm8gfCB1bmRlZmluZWR9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiAgKi9cclxuICAgICAgICB0aGlzLmluZm8gPSB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAcHJpdmF0ZSAgKi9cclxuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNhY2hlIG9mIHRoZSBsb2FkZWQgdGlsZXMuIEl0IGlzIGRvdWJsZSBpbmRleGVkOiBieSB4VCBhbmQgdGhlbiB5VC5cclxuICAgICAgICAgKiBFeGFtcGxlOiB0aGlzLmNhY2hlW3hUXVt5VF0gcmV0dXJucyB0aGUgdGlsZSBhdCBbeFRdW3lUXSBsb2NhdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogKi9cclxuICAgICAgICB0aGlzLmNhY2hlID0ge31cclxuXHJcbiAgICAgICAgLy9sYXVuY2ggbG9hZGluZ1xyXG4gICAgICAgIHRoaXMubG9hZEluZm8oKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZCB0aGUgaW5mby5qc29uIGZyb20gdGhlIHVybC5cclxuICAgICAqIEByZXR1cm5zIHRoaXNcclxuICAgICAqL1xyXG4gICAgbG9hZEluZm8oKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluZm8gJiYgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9PT0gJ25vdExvYWRlZCcpIHtcclxuICAgICAgICAgICAgOyAoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQganNvbih0aGlzLnVybCArICdpbmZvLmpzb24nKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mbyA9IGRhdGFcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29sdXRpb24gPSBkYXRhLnJlc29sdXRpb25HZW9cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL21hcmsgYXMgZmFpbGVkXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKClcclxuICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID09PSAnbG9hZGVkJyB8fCB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID09PSAnZmFpbGVkJykpXHJcbiAgICAgICAgICAgIHRoaXMubWFwLnJlZHJhdygpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgYSB0aWxpbmcgZW52ZWxvcGUgZnJvbSBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cclxuICAgICAqIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0byBrbm93IHdoaWNoIHRpbGVzIHRvIGRvd25sb2FkIGZvciBhIGdlb2dyYXBoaWNhbCB2aWV3LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGV9IGVcclxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9XHJcbiAgICAgKi9cclxuICAgIGdldFRpbGluZ0VudmVsb3BlKGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaW5mbykge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRJbmZvKClcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwbyA9IHRoaXMuaW5mby5vcmlnaW5Qb2ludCxcclxuICAgICAgICAgICAgciA9IHRoaXMuaW5mby5yZXNvbHV0aW9uR2VvLFxyXG4gICAgICAgICAgICBzID0gdGhpcy5pbmZvLnRpbGVTaXplQ2VsbFxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB4TWluOiBNYXRoLmZsb29yKChlLnhNaW4gLSBwby54KSAvIChyICogcykpLFxyXG4gICAgICAgICAgICB4TWF4OiBNYXRoLmZsb29yKChlLnhNYXggLSBwby54KSAvIChyICogcykpLFxyXG4gICAgICAgICAgICB5TWluOiBNYXRoLmZsb29yKChlLnlNaW4gLSBwby55KSAvIChyICogcykpLFxyXG4gICAgICAgICAgICB5TWF4OiBNYXRoLmZsb29yKChlLnlNYXggLSBwby55KSAvIChyICogcykpLFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KCcuLi9jb3JlL0dlb0NhbnZhcy5qcycpLkVudmVsb3BlfSBleHRHZW9cclxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxyXG4gICAgICovXHJcbiAgICBnZXREYXRhKGV4dEdlbykge1xyXG4gICAgICAgIC8vVE9ETyBlbXB0eSBjYWNoZSB3aGVuIGl0IGdldHMgdG9vIGJpZyA/XHJcblxyXG4gICAgICAgIC8vY2hlY2sgaWYgaW5mbyBoYXMgYmVlbiBsb2FkZWRcclxuICAgICAgICBpZiAoIXRoaXMuaW5mbykgcmV0dXJuIHRoaXNcclxuXHJcbiAgICAgICAgLy90aWxlcyB3aXRoaW4gdGhlIHNjb3BlXHJcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgY29uc3QgdGIgPSB0aGlzLmdldFRpbGluZ0VudmVsb3BlKGV4dEdlbylcclxuICAgICAgICBpZiAoIXRiKSByZXR1cm4gdGhpc1xyXG5cclxuICAgICAgICAvL2dyaWQgYm91bmRzXHJcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gKi9cclxuICAgICAgICBjb25zdCBnYiA9IHRoaXMuaW5mby50aWxpbmdCb3VuZHNcclxuXHJcbiAgICAgICAgZm9yIChsZXQgeFQgPSBNYXRoLm1heCh0Yi54TWluLCBnYi54TWluKTsgeFQgPD0gTWF0aC5taW4odGIueE1heCwgZ2IueE1heCk7IHhUKyspIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgeVQgPSBNYXRoLm1heCh0Yi55TWluLCBnYi55TWluKTsgeVQgPD0gTWF0aC5taW4odGIueU1heCwgZ2IueU1heCk7IHlUKyspIHtcclxuICAgICAgICAgICAgICAgIC8vcHJlcGFyZSBjYWNoZVxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgdGhpcy5jYWNoZVt4VF0gPSB7fVxyXG5cclxuICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgdGlsZSBleGlzdHMgaW4gdGhlIGNhY2hlXHJcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge29iamVjdH0gKi9cclxuICAgICAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy5jYWNoZVt4VF1beVRdXHJcbiAgICAgICAgICAgICAgICBpZiAodGlsZSkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgICAgICAvL21hcmsgdGlsZSBhcyBsb2FkaW5nXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSBcImxvYWRpbmdcIjtcclxuICAgICAgICAgICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXF1ZXN0IHRpbGVcclxuICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59ICAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjZWxsc1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59ICAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBjc3YodGhpcy51cmwgKyB4VCArICcvJyArIHlUICsgJy5jc3YnKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogVGlsZWRHcmlkIHBhcnNlIHN0YXJ0JylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wcmVwcm9jZXNzKGMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMucHVzaChjKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMgPSBkYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbigncHJlcHJvY2VzcyAvIGZpbHRlcicpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9tYXJrIGFzIGZhaWxlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSAnZmFpbGVkJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vc3RvcmUgdGlsZSBpbiBjYWNoZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RpbGUgaW5mbyBpbmtub3duJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbGVfID0gZ2V0R3JpZFRpbGUoY2VsbHMsIHhULCB5VCwgdGhpcy5pbmZvKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbeFRdW3lUXSA9IHRpbGVfXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignc3RvcmFnZScpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgbm8gcmVkcmF3IGlzIHNwZWNpZmllZCwgdGhlbiBsZWF2ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLnJlZHJhdygpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgcmVkcmF3IGlzIHJlYWxseSBuZWVkZWQsIHRoYXQgaXMgaWY6XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIDEuIHRoZSBkYXRhc2V0IGJlbG9uZ3MgdG8gYSBsYXllciB3aGljaCBpcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWxcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVkcmF3ID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxheWVyc1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHogPSB0aGlzLm1hcC5nZXRab29tKClcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxheSBvZiB0aGlzLm1hcC5sYXllcnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxheS52aXNpYmxlICYmICFsYXkudmlzaWJsZSh6KSkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXkuZ2V0RGF0YXNldCkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxheS5nZXREYXRhc2V0KHopICE9IHRoaXMpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZm91bmQgb25lIGxheWVyLiBObyBuZWVkIHRvIHNlZWsgbW9yZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVkcmF3ID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvL2lmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJ2NoZWNrIHJlZHJhdyAxJylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWRyYXcpIHJldHVyblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyAyLiB0aGUgdGlsZSBpcyB3aXRoaW4gdGhlIHZpZXcsIHRoYXQgaXMgaXRzIGdlbyBlbnZlbG9wZSBpbnRlcnNlY3RzIHRoZSB2aWV3ZXIgZ2VvIGVudmVsb3BlLlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudiA9IHRoaXMubWFwLnVwZGF0ZUV4dGVudEdlbygpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52VCA9IHRpbGVfLmV4dEdlb1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnYueE1heCA8PSBlbnZULnhNaW4pIHJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnYueE1pbiA+PSBlbnZULnhNYXgpIHJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnYueU1heCA8PSBlbnZULnlNaW4pIHJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnYueU1pbiA+PSBlbnZULnlNYXgpIHJldHVyblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL2lmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJ2NoZWNrIHJlZHJhdyAyJylcclxuICAgICAgICAgICAgICAgICAgICAvL2lmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyoqKiBUaWxlZEdyaWQgcGFyc2UgZW5kJylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZWRyYXdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgfSkoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXHJcbiAgICAgKiBAYWJzdHJhY3RcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGV9IGV4dEdlb1xyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZpZXdDYWNoZShleHRHZW8pIHtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxyXG5cclxuICAgICAgICAvL2NoZWNrIGlmIGluZm8gaGFzIGJlZW4gbG9hZGVkXHJcbiAgICAgICAgaWYgKCF0aGlzLmluZm8pIHJldHVyblxyXG5cclxuICAgICAgICAvL3RpbGVzIHdpdGhpbiB0aGUgc2NvcGVcclxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICBjb25zdCB0YiA9IHRoaXMuZ2V0VGlsaW5nRW52ZWxvcGUoZXh0R2VvKVxyXG4gICAgICAgIGlmICghdGIpIHJldHVyblxyXG5cclxuICAgICAgICAvL2dyaWQgYm91bmRzXHJcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gKi9cclxuICAgICAgICBjb25zdCBnYiA9IHRoaXMuaW5mby50aWxpbmdCb3VuZHNcclxuXHJcbiAgICAgICAgZm9yIChsZXQgeFQgPSBNYXRoLm1heCh0Yi54TWluLCBnYi54TWluKTsgeFQgPD0gTWF0aC5taW4odGIueE1heCwgZ2IueE1heCk7IHhUKyspIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgY29udGludWVcclxuICAgICAgICAgICAgZm9yIChsZXQgeVQgPSBNYXRoLm1heCh0Yi55TWluLCBnYi55TWluKTsgeVQgPD0gTWF0aC5taW4odGIueU1heCwgZ2IueU1heCk7IHlUKyspIHtcclxuICAgICAgICAgICAgICAgIC8vZ2V0IHRpbGVcclxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7b2JqZWN0fSAqL1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuY2FjaGVbeFRdW3lUXVxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlIHx8IHR5cGVvZiB0aWxlID09PSAnc3RyaW5nJykgY29udGludWVcclxuXHJcbiAgICAgICAgICAgICAgICAvL2dldCBjZWxsc1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmNlbGxzVmlld0NhY2hlID0gdGhpcy5jZWxsc1ZpZXdDYWNoZS5jb25jYXQodGlsZS5jZWxscylcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGlsZS5jZWxscykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC54ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnhNaW4pIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnggLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueE1heCkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICBpZiAoK2NlbGwueSArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby55TWluKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC55IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnlNYXgpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZS5wdXNoKGNlbGwpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEdyaWRUaWxlKGNlbGxzLCB4VCwgeVQsIGdyaWRJbmZvKSB7XHJcblxyXG4gICAgY29uc3QgdGlsZSA9IHt9XHJcblxyXG4gICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSAqL1xyXG4gICAgdGlsZS5jZWxscyA9IGNlbGxzXHJcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgIHRpbGUueCA9IHhUXHJcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgIHRpbGUueSA9IHlUXHJcblxyXG4gICAgY29uc3QgciA9IGdyaWRJbmZvLnJlc29sdXRpb25HZW9cclxuICAgIGNvbnN0IHMgPSBncmlkSW5mby50aWxlU2l6ZUNlbGxcclxuXHJcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkVudmVsb3BlfSAqL1xyXG4gICAgdGlsZS5leHRHZW8gPSB7XHJcbiAgICAgICAgeE1pbjogZ3JpZEluZm8ub3JpZ2luUG9pbnQueCArIHIgKiBzICogdGlsZS54LFxyXG4gICAgICAgIHhNYXg6IGdyaWRJbmZvLm9yaWdpblBvaW50LnggKyByICogcyAqICh0aWxlLnggKyAxKSxcclxuICAgICAgICB5TWluOiBncmlkSW5mby5vcmlnaW5Qb2ludC55ICsgciAqIHMgKiB0aWxlLnksXHJcbiAgICAgICAgeU1heDogZ3JpZEluZm8ub3JpZ2luUG9pbnQueSArIHIgKiBzICogKHRpbGUueSArIDEpLFxyXG4gICAgfVxyXG5cclxuICAgIC8vY29udmVydCBjZWxsIGNvb3JkaW5hdGVzIGludG8gZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXHJcbiAgICBmb3IgKGxldCBjZWxsIG9mIHRpbGUuY2VsbHMpIHtcclxuICAgICAgICBjZWxsLnggPSB0aWxlLmV4dEdlby54TWluICsgY2VsbC54ICogclxyXG4gICAgICAgIGNlbGwueSA9IHRpbGUuZXh0R2VvLnlNaW4gKyBjZWxsLnkgKiByXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRpbGVcclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29yZS9MYXllci5qcydcclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBBIG1hcCBiYWNrZ3JvdW5kIGxheWVyIGluIFwiU2xpcHB5IG1hcFwiIFhZWiBzdGFuZGFyZC5cclxuICogU2VlIGh0dHBzOi8vd2lraS5vcGVuc3RyZWV0bWFwLm9yZy93aWtpL1NsaXBweV9tYXBfdGlsZW5hbWVzXHJcbiAqIGh0dHBzOi8vd3d3Lm1hcHRpbGVyLmNvbS9nb29nbGUtbWFwcy1jb29yZGluYXRlcy10aWxlLWJvdW5kcy1wcm9qZWN0aW9uLyM2LzI3Ljg4LzQ0LjQ4XHJcbiAqIFxyXG4gKiBAbW9kdWxlIGxheWVyXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kTGF5ZXIgZXh0ZW5kcyBMYXllciB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgY2FjaGUsIGluZGV4ZWQgYnkgei95L3ggKi9cclxuICAgICAgICB0aGlzLmNhY2hlID0ge31cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXHJcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMudXJsRnVuID0gb3B0cy51cmxGdW4gfHwgKCh4LCB5LCB6KSA9PiB0aGlzLnVybCArIHogKyAnLycgKyB4ICsgJy8nICsgeSArICcucG5nJylcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cclxuICAgICAgICB0aGlzLnJlc29sdXRpb25zID0gb3B0cy5yZXNvbHV0aW9uc1xyXG4gICAgICAgIGlmICghdGhpcy5yZXNvbHV0aW9ucyB8fCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5uYlBpeCA9IG9wdHMubmJQaXggfHwgMjU2XHJcbiAgICAgICAgLyoqIENSUyBjb29yZGluYXRlcyBvZiB0b3AgbGVmdCBjb3JuZXJcclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXHJcbiAgICAgICAgdGhpcy5vcmlnaW4gPSBvcHRzLm9yaWdpbiB8fCBbMCwgMF1cclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnowID0gb3B0cy56MCB8fCAwXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgei94L3kgY2FjaGUgZGF0YS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcclxuICAgICAqIEByZXR1cm5zIHtIVE1MSW1hZ2VFbGVtZW50fHN0cmluZ3x1bmRlZmluZWR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBnZXQoeiwgeCwgeSkge1xyXG4gICAgICAgIGxldCBkID0gdGhpcy5jYWNoZVt6XVxyXG4gICAgICAgIGlmICghZCkgcmV0dXJuXHJcbiAgICAgICAgZCA9IGRbeF1cclxuICAgICAgICBpZiAoIWQpIHJldHVyblxyXG4gICAgICAgIHJldHVybiBkW3ldXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgei94L3kgY2FjaGUgZGF0YS5cclxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxzdHJpbmd9IGltZ1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geVxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHB1dChpbWcsIHosIHgsIHkpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbel0pIHRoaXMuY2FjaGVbel0gPSB7fVxyXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt6XVt4XSkgdGhpcy5jYWNoZVt6XVt4XSA9IHt9XHJcbiAgICAgICAgdGhpcy5jYWNoZVt6XVt4XVt5XSA9IGltZ1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5yZXNvbHV0aW9ucyB8fCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcbiAgICAgICAgY29uc3QgeDAgPSB0aGlzLm9yaWdpblswXSxcclxuICAgICAgICAgICAgeTAgPSB0aGlzLm9yaWdpblsxXVxyXG5cclxuICAgICAgICAvL2dldCB6b29tIGxldmVsIGFuZCByZXNvbHV0aW9uXHJcbiAgICAgICAgbGV0IHpfID0gMFxyXG4gICAgICAgIGZvciAoel8gPSAwOyB6XyA8IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoOyB6XysrKSBpZiAodGhpcy5yZXNvbHV0aW9uc1t6X10gPCB6KSBicmVha1xyXG4gICAgICAgIHpfIC09IDFcclxuICAgICAgICB6XyA9IE1hdGgubWF4KDAsIHpfKVxyXG4gICAgICAgIHpfID0gTWF0aC5taW4oel8sIHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoIC0gMSlcclxuICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoLCB6KVxyXG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMucmVzb2x1dGlvbnNbel9dXHJcblxyXG4gICAgICAgIHpfICs9IHRoaXMuejBcclxuXHJcbiAgICAgICAgY29uc3Qgc2l6ZUcgPSB0aGlzLm5iUGl4ICogcmVzXHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHNpemVHIC8gelxyXG5cclxuICAgICAgICAvL2dldCB0aWxlIG51bWJlcnNcclxuICAgICAgICBjb25zdCB4R2VvVG9UTVMgPSAoeCkgPT4gTWF0aC5jZWlsKCh4IC0geDApIC8gc2l6ZUcpXHJcbiAgICAgICAgY29uc3QgeUdlb1RvVE1TID0gKHkpID0+IE1hdGguY2VpbCgtKHkgLSB5MCkgLyBzaXplRylcclxuICAgICAgICBjb25zdCB4TWluID0geEdlb1RvVE1TKGdlb0NhbnZhcy5leHRHZW8ueE1pbikgLSAxXHJcbiAgICAgICAgY29uc3QgeE1heCA9IHhHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnhNYXgpXHJcbiAgICAgICAgY29uc3QgeU1heCA9IHlHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnlNaW4pXHJcbiAgICAgICAgY29uc3QgeU1pbiA9IHlHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnlNYXgpIC0gMVxyXG5cclxuICAgICAgICAvL2hhbmRsZSBpbWFnZXNcclxuICAgICAgICBmb3IgKGxldCB4ID0geE1pbjsgeCA8IHhNYXg7IHgrKykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCB5ID0geU1pbjsgeSA8IHlNYXg7IHkrKykge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgaW1hZ2VcclxuICAgICAgICAgICAgICAgIGxldCBpbWcgPSB0aGlzLmdldCh6XywgeCwgeSlcclxuXHJcbiAgICAgICAgICAgICAgICAvL2xvYWQgaW1hZ2VcclxuICAgICAgICAgICAgICAgIGlmICghaW1nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1dChpbWcsIHpfLCB4LCB5KVxyXG4gICAgICAgICAgICAgICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpbWcub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXQoJ2ZhaWxlZCcsIHpfLCB4LCB5KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpbWcuc3JjID0gdGhpcy51cmxGdW4oeCwgeSwgel8pXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL2Nhc2Ugd2hlbiBubyBpbWFnZVxyXG4gICAgICAgICAgICAgICAgaWYgKGltZyA9PT0gJ2ZhaWxlZCcpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICBpZiAoIShpbWcgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGltZylcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGltZy53aWR0aCA9PSAwIHx8IGltZy5oZWlnaHQgPT0gMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgaW1hZ2VcclxuICAgICAgICAgICAgICAgIGNvbnN0IHhHZW8gPSB4MCArIHggKiBzaXplR1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeUdlbyA9IHkwIC0geSAqIHNpemVHXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmRyYXdJbWFnZShpbWcsIGdlb0NhbnZhcy5nZW9Ub1BpeFgoeEdlbyksIGdlb0NhbnZhcy5nZW9Ub1BpeFkoeUdlbyksIHNpemUsIHNpemUpXHJcbiAgICAgICAgICAgICAgICAgICAgLy9jZy5jdHguZHJhd0ltYWdlKGltZywgeEdlbywgeUdlbywgc2l6ZUcsIC1zaXplRylcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uL2NvcmUvTGF5ZXIuanMnXHJcblxyXG4vKipcclxuICpcclxuICogQSBtYXAgYmFja2dyb3VuZCBsYXllciBjb21wb3NlZCBvZiBhIHNpbmdsZSBpbWFnZSBmaWxlLCBnZW9sb2NhdGVkLlxyXG4gKiBcclxuICogQG1vZHVsZSBsYXllclxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZExheWVySW1hZ2UgZXh0ZW5kcyBMYXllciB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgZmlsZSBVUkxcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcclxuXHJcbiAgICAgICAgLyoqIFRoZSBpbWFnZSBsZWZ0IGNvb3JkaW5hdGVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMueE1pbiA9IG9wdHMueE1pbiB8fCAwO1xyXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgdG9wIGNvb3JkaW5hdGVcclxuICAgICAgICAgKiAgQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnlNYXggPSBvcHRzLnlNYXggfHwgMDtcclxuXHJcbiAgICAgICAgLyoqIFRoZSBpbWFnZSB3aWR0aCwgaW4gZ2VvIHVuaXRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8IDIwMDAwXHJcbiAgICAgICAgLyoqIFRoZSBpbWFnZSBoZWlnaHQsIGluIGdlbyB1bml0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8IDIwMDAwXHJcblxyXG4gICAgICAgIC8qKiBUaGUgaW1hZ2Ugb2JqZWN0XHJcbiAgICAgICAgICogQHR5cGUge0hUTUxJbWFnZUVsZW1lbnR8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMuaW1nID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIG1hcCBleHRlbnRcclxuICAgICAgICAvL2dlb0NhbnZhcy51cGRhdGVFeHRlbnRHZW8oMClcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaW1nKSB7XHJcbiAgICAgICAgICAgIC8vdGhlIGltYWdlIHdhcyBhbHJlYWR5IGRvd25sb2FkZWQ6IGRyYXcgaXRcclxuXHJcbiAgICAgICAgICAgIC8vY29tcHV0ZSBzY3JlZW4gY29vcmRpbmF0ZXMgYW5kIHNpemUgcmF0aW9cclxuICAgICAgICAgICAgY29uc3QgeCA9IGdlb0NhbnZhcy5nZW9Ub1BpeFgodGhpcy54TWluKVxyXG4gICAgICAgICAgICBjb25zdCB5ID0gZ2VvQ2FudmFzLmdlb1RvUGl4WSh0aGlzLnlNYXgpXHJcbiAgICAgICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMuZ2V0VmlldygpLnpcclxuXHJcbiAgICAgICAgICAgIC8vZHJhdyBpbWFnZVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuaW1nLCB4LCB5LCB0aGlzLndpZHRoIC8geiwgdGhpcy5oZWlnaHQgLyB6KVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL3JldHJpZXZlIGltYWdlXHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW1nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZyA9IG5ldyBJbWFnZSgpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLnJlZHJhdygpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZy5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHJldHJpZXZlIGJhY2tncm91bmQgaW1hZ2UgZnJvbVwiLCB0aGlzLnVybClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9zZXQgVVJMIHRvIGxhdW5jaCB0aGUgZG93bmxvYWRcclxuICAgICAgICAgICAgdGhpcy5pbWcuc3JjID0gdGhpcy51cmxcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEEgbWFwIFdNUyBiYWNrZ3JvdW5kIGxheWVyLlxyXG4gKiBcclxuICogQG1vZHVsZSBsYXllclxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZExheWVyV01TIGV4dGVuZHMgTGF5ZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MSW1hZ2VFbGVtZW50fHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLmltZyA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMueE1pbiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgdGhpcy54TWF4ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLnlNaW4gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMueU1heCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ2hlY2sgaWYgdGhlIHZpZXcgaGFzIG1vdmVkIGFuZCBhIG5ldyBpbWFnZSBuZWVkcyB0byBiZSByZXRyaWV2ZWQuXHJcbiAgICAgKiBAcHJpdmF0ZSAqL1xyXG4gICAgaGFzTW92ZWQoZXh0R2VvKSB7XHJcbiAgICAgICAgaWYgKChleHRHZW8ueE1pbikgIT0gdGhpcy54TWluKSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueE1heCkgIT0gdGhpcy54TWF4KSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueU1pbikgIT0gdGhpcy55TWluKSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueU1heCkgIT0gdGhpcy55TWF4KSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIG1hcCBleHRlbnRcclxuICAgICAgICBnZW9DYW52YXMudXBkYXRlRXh0ZW50R2VvKDApXHJcblxyXG4gICAgICAgIGlmICghdGhpcy5oYXNNb3ZlZChnZW9DYW52YXMuZXh0R2VvKSAmJiB0aGlzLmltZykge1xyXG4gICAgICAgICAgICAvL3RoZSBtYXAgZGlkIG5vdCBtb3ZlIGFuZCB0aGUgaW1hZ2Ugd2FzIGFscmVhZHkgZG93bmxvYWRlZDogZHJhdyB0aGUgaW1hZ2VcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmRyYXdJbWFnZSh0aGlzLmltZywgMCwgMCwgZ2VvQ2FudmFzLncsIGdlb0NhbnZhcy5oKVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL3RoZSBtYXAgbW92ZWQ6IHJldHJpZXZlIG5ldyBpbWFnZVxyXG5cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgdGhpcy54TWluID0gZ2VvQ2FudmFzLmV4dEdlby54TWluXHJcbiAgICAgICAgICAgIHRoaXMueE1heCA9IGdlb0NhbnZhcy5leHRHZW8ueE1heFxyXG4gICAgICAgICAgICB0aGlzLnlNaW4gPSBnZW9DYW52YXMuZXh0R2VvLnlNaW5cclxuICAgICAgICAgICAgdGhpcy55TWF4ID0gZ2VvQ2FudmFzLmV4dEdlby55TWF4XHJcblxyXG4gICAgICAgICAgICAvL2J1aWxkIFdNUyBVUkxcclxuICAgICAgICAgICAgY29uc3QgdXJsID0gW11cclxuICAgICAgICAgICAgdXJsLnB1c2godGhpcy51cmwpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKFwiJndpZHRoPVwiKVxyXG4gICAgICAgICAgICB1cmwucHVzaChnZW9DYW52YXMudylcclxuICAgICAgICAgICAgdXJsLnB1c2goXCImaGVpZ2h0PVwiKVxyXG4gICAgICAgICAgICB1cmwucHVzaChnZW9DYW52YXMuaClcclxuICAgICAgICAgICAgLy9iYm94OiB4bWluIHltaW4geG1heCB5bWF4XHJcbiAgICAgICAgICAgIHVybC5wdXNoKFwiJmJib3g9XCIpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueE1pbilcclxuICAgICAgICAgICAgdXJsLnB1c2goXCIsXCIpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueU1pbilcclxuICAgICAgICAgICAgdXJsLnB1c2goXCIsXCIpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueE1heClcclxuICAgICAgICAgICAgdXJsLnB1c2goXCIsXCIpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueU1heClcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHVybFMgPSB1cmwuam9pbihcIlwiKVxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHVybFMpXHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW1nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZyA9IG5ldyBJbWFnZSgpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLnJlZHJhdygpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZy5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHJldHJpZXZlIFdNUyBiYWNrZ3JvdW5kIGltYWdlIGZyb21cIiwgdXJsUylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9zZXQgVVJMIHRvIGxhdW5jaCB0aGUgZG93bmxvYWRcclxuICAgICAgICAgICAgdGhpcy5pbWcuc3JjID0gdXJsU1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uL2NvcmUvTGF5ZXIuanMnXHJcbmltcG9ydCB7IGpzb24gfSBmcm9tICdkMy1mZXRjaCdcclxuXHJcbi8qKlxyXG4gKiBAbW9kdWxlIGxheWVyXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHZW9KU09OTGF5ZXIgZXh0ZW5kcyBMYXllciB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcHJlcHJvY2VzcyB0byBydW4gb24gZWFjaCBmZWF0dXJlIGFmdGVyIGxvYWRpbmcuXHJcbiAgICAgICAgICogSXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc29tZSBzcGVjaWZpYyB0cmVhdG1lbnQgYmVmb3JlLCBmb3JtYXQgdGhlIGxhYmVsIGRhdGEsIHByb2plY3QgY29vcmRpbmF0ZXMsIGV0Yy5cclxuICAgICAgICAgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGxhYmVsIHNob3VsZCBub3QgYmUga2VwdC5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QpOmJvb2xlYW59ICovXHJcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXHJcblxyXG4gICAgICAgIC8vZm9yIHBvaW50c1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKGYsIHopID0+ICdjaXJjbGUnKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEluIHBpeGVsXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSB8fCAoKGYsIHopID0+IDEwKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnN0cm9rZVN0eWxlID0gb3B0cy5zdHJva2VTdHlsZSB8fCAoKGYsIHopID0+ICdyZWQnKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmZpbGxTdHlsZSA9IG9wdHMuZmlsbFN0eWxlIHx8ICgoZiwgeikgPT4gJ2JsYWNrJylcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbiBwaXhlbFxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgoZiwgeikgPT4gMilcclxuXHJcblxyXG5cclxuICAgICAgICAvL2ZvciBsaW5lc1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKChmLCB6KSA9PiAnZ3JheScpXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW4gcGl4ZWxcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChmLCB6KSA9PiAyKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOkFycmF5LjxudW1iZXI+fHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLmxpbmVEYXNoID0gb3B0cy5saW5lRGFzaCB8fCAoKGYsIHopID0+IHVuZGVmaW5lZClcclxuXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxvYmplY3Q+IHwgdW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMuZnMgPSB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdub3RMb2FkZWQnXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyB0aGUgbGF5ZXIuXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgZHJhdyhnZW9DYW52YXMpIHtcclxuICAgICAgICAvL2xvYWQgZGF0YSwgaWYgbm90IGRvbmUgeWV0LlxyXG4gICAgICAgIGlmICghdGhpcy5mcykge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWQoZ2VvQ2FudmFzLnJlZHJhdylcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgZiBvZiB0aGlzLmZzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGd0ID0gZi5nZW9tZXRyeS50eXBlXHJcblxyXG4gICAgICAgICAgICBpZiAoZ3QgPT0gXCJQb2ludFwiKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gZi5nZW9tZXRyeS5jb29yZGluYXRlc1xyXG5cclxuICAgICAgICAgICAgICAgIC8vZ2V0IHN0eWxlIHBhcmFtZXRlcnMgZm9yIHRoZSBwb2ludCBmZWF0dXJlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzaGFwZSA9IHRoaXMuc2hhcGUoZix6KVxyXG4gICAgICAgICAgICAgICAgaWYoIXNoYXBlIHx8IHNoYXBlPT1cIm5vbmVcIikgY29udGludWVcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemUoZix6KSAqIHpcclxuICAgICAgICAgICAgICAgIGlmKCFzaXplKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3Ryb2tlU3R5bGUgPSB0aGlzLnN0cm9rZVN0eWxlKGYseilcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGxTdHlsZSA9IHRoaXMuZmlsbFN0eWxlKGYseilcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IHRoaXMubGluZVdpZHRoKGYseikgKiB6XHJcblxyXG4gICAgICAgICAgICAgICAgLy9zZXQgY2FudmFzIGRyYXdpbmcgcGFyYW1ldGVyc1xyXG4gICAgICAgICAgICAgICAgaWYoc3Ryb2tlU3R5bGUpIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZVxyXG4gICAgICAgICAgICAgICAgaWYoZmlsbFN0eWxlKSBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9IGZpbGxTdHlsZVxyXG4gICAgICAgICAgICAgICAgaWYobGluZVdpZHRoKSBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aFxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaGFwZSA9PSBcImNpcmNsZVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZSAtIGZpbGwgYW5kIHN0cm9rZVxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhjWzBdLCBjWzFdLCBzaXplIC8gMiwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGZpbGxTdHlsZSkgZ2VvQ2FudmFzLmN0eC5maWxsKClcclxuICAgICAgICAgICAgICAgICAgICBpZihzdHJva2VTdHlsZSAmJiBsaW5lV2lkdGgpIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT0gXCJzcXVhcmVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzcXVhcmUgLSBmaWxsIGFuZCBzdHJva2VcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5yZWN0KGNbMF0gLSBzaXplIC8gMiwgY1sxXSAtIHNpemUgLyAyLCBzaXplLCBzaXplKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGZpbGxTdHlsZSkgZ2VvQ2FudmFzLmN0eC5maWxsKClcclxuICAgICAgICAgICAgICAgICAgICBpZihzdHJva2VTdHlsZSAmJiBsaW5lV2lkdGgpIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlVuZXhwZWN0ZWQgc2hhcGUgZm9yIHBvaW50IGdlb2pzb246IFwiICsgc2hhcGUpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGd0ID09IFwiTGluZVN0cmluZ1wiKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzXHJcbiAgICAgICAgICAgICAgICBpZiAoY3MubGVuZ3RoIDwgMikgY29udGludWVcclxuXHJcbiAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihmLCB6KVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcclxuXHJcbiAgICAgICAgICAgICAgICAvL3NldCBsaW5ld2lkdGhcclxuICAgICAgICAgICAgICAgIGNvbnN0IHdQID0gdGhpcy53aWR0aChmLCB6KVxyXG4gICAgICAgICAgICAgICAgaWYgKCF3UCB8fCB3UCA8IDApIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHdQICogelxyXG5cclxuICAgICAgICAgICAgICAgIC8vc2V0IGxpbmUgZGFzaFxyXG4gICAgICAgICAgICAgICAgY29uc3QgbGRQID0gdGhpcy5saW5lRGFzaChmLCB6KVxyXG4gICAgICAgICAgICAgICAgaWYgKGxkUCkgZ2VvQ2FudmFzLmN0eC5zZXRMaW5lRGFzaChsZFApXHJcblxyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGxpbmVcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGNzWzBdWzBdLCBjc1swXVsxXSlcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY3MubGVuZ3RoOyBpKyspIGdlb0NhbnZhcy5jdHgubGluZVRvKGNzW2ldWzBdLCBjc1tpXVsxXSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSBpbiBHZW9KU09OTGF5ZXI6IFwiICsgZ3QpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLy4uLlxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHguc2V0TGluZURhc2goW10pXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIGRhdGEgZm9yIGxhYmVscywgZnJvbSBVUkwgdGhpcy51cmxcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgYXN5bmMgbG9hZChjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICghdGhpcy51cmwpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGJvdW5kYXJpZXM6IE5vIFVSTCBzcGVjaWZpZWQuICcgKyB0aGlzLnVybClcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcclxuICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vY2hlY2sgaWYgZGF0YSBhbHJlYWR5IGxvYWRlZFxyXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVyblxyXG5cclxuICAgICAgICAvL2xvYWQgZGF0YVxyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhXyA9IGF3YWl0IGpzb24odGhpcy51cmwpXHJcblxyXG4gICAgICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48b2JqZWN0PiB9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBkYXRhXy5mZWF0dXJlc1xyXG5cclxuICAgICAgICAgICAgLy9wcmVwcm9jZXNzL2ZpbHRlclxyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZzID0gW11cclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChiID09IGZhbHNlKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnMucHVzaChjKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9zdG9yZSBsYWJlbHNcclxuICAgICAgICAgICAgICAgIHRoaXMuZnMgPSBkYXRhXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXHJcblxyXG4gICAgICAgICAgICAvL3JlZHJhd1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgYm91bmRhcmllcyBmcm9tICcgKyB0aGlzLnVybClcclxuICAgICAgICAgICAgdGhpcy5mcyA9IFtdXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEEgbGF5ZXIsIHdoaWNoIHNwZWNpZmllcyBhIGRhdGFzZXQgdG8gYmUgc2hvd24gd2l0aCBzcGVjaWZpZWQgc3R5bGVzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIGxheWVyXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHcmlkTGF5ZXIgZXh0ZW5kcyBMYXllciB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkRhdGFzZXR8aW1wb3J0KFwiLi4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0XCIpLk11bHRpUmVzb2x1dGlvbkRhdGFzZXR9IGRhdGFzZXQgVGhlIGRhdGFzZXQgdG8gc2hvdy5cclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU3R5bGU+fSBzdHlsZXMgVGhlIHN0eWxlcywgb3JkZXJlZCBpbiBkcmF3aW5nIG9yZGVyLlxyXG4gICAgICogQHBhcmFtIHt7dmlzaWJsZT86ZnVuY3Rpb24obnVtYmVyKTpib29sZWFuLGFscGhhPzpmdW5jdGlvbihudW1iZXIpOm51bWJlcixibGVuZE9wZXJhdGlvbj86ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24sbWluUGl4ZWxzUGVyQ2VsbD86bnVtYmVyLGNlbGxJbmZvSFRNTD86ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOnN0cmluZ319IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoZGF0YXNldCwgc3R5bGVzLCBvcHRzID0ge30pIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkRhdGFzZXR8aW1wb3J0KFwiLi4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0XCIpLk11bHRpUmVzb2x1dGlvbkRhdGFzZXR9ICovXHJcbiAgICAgICAgdGhpcy5kYXRhc2V0ID0gZGF0YXNldFxyXG5cclxuICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlN0eWxlPn0gKi9cclxuICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlc1xyXG5cclxuICAgICAgICAvKiogXHJcbiAgICAgICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB3aGVuIHRoZSBkYXRhc2V0IGlzIGEgTXVsdGlSZXNvbHV0aW9uRGF0YXNldC5cclxuICAgICAgICAgKiBJdCBkZWZpbmVzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBwaXhlbHMgYSBncmlkIGNlbGwgc2hvdWxkIGhhdmUgdG8gc2VsZWN0IHRoZSBkYXRhc2V0IHRvIGRpc3BsYXkgYmFzZWQgb24gaXRzIHJlc29sdXRpb24uXHJcbiAgICAgICAgICogQSBsb3cgdmFsdWUsIG1lYW5zIHRoYXQgdGhlIG1hcCB3aWxsIGJlIG1vcmUgZGV0YWlsbGVkIChzbWFsbGVyIGNlbGxzKS5cclxuICAgICAgICAgKiBBIGhpZ2ggdmFsdWUsIG1lYW5zIHRoYXQgdGhlIG1hcCB3aWxsIGJlIGxlc3MgZGV0YWlsbGVkIChsYXJnZXIgY2VsbHMpLlxyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgc2hvdWxkIGJlIGhpZ2hlciB0aGFuIDEsIG90aGVyd2lzZSBpdCBtZWFucyBhIGdyaWQgY2VsbCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNjcmVlbiByZXNvbHV0aW9uLlxyXG4gICAgICAgICAqIEZvciBtb3JlIGNvbXBsZXggY2VsbCByZXByZXNlbnRhdGlvbnMgdGhhdCByZXF1aXJlIHNvbWUgbW9yZSBtYXAgc3BhY2UsIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGhpZ2hlci5cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMubWluUGl4ZWxzUGVyQ2VsbCA9IG9wdHMubWluUGl4ZWxzUGVyQ2VsbCB8fCAzXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBmdW5jdGlvbiByZXR1cm5pbmcgY2VsbCBpbmZvcm1hdGlvbiBhcyBIVE1MLlxyXG4gICAgICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHRvb2x0aXAgaW5mb3JtYXRpb24uXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsLCBudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNlbGxJbmZvSFRNTCA9IG9wdHMuY2VsbEluZm9IVE1MIHx8IEdyaWRMYXllci5kZWZhdWx0Q2VsbEluZm9IVE1MXHJcbiAgICB9XHJcblxyXG4gICAgLyoqICovXHJcbiAgICBkcmF3KGdlb0NhbnZhcywgbGVnZW5kKSB7XHJcblxyXG4gICAgICAgIC8vZ2V0IHpvb20gbGV2ZWxcclxuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxyXG5cclxuICAgICAgICAvL2dldCBsYXllciBkYXRhc2V0IGNvbXBvbmVudFxyXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5EYXRhc2V0fHVuZGVmaW5lZH0gKi9cclxuICAgICAgICBjb25zdCBkc2MgPSB0aGlzLmdldERhdGFzZXQoeilcclxuICAgICAgICBpZiAoIWRzYykgcmV0dXJuXHJcblxyXG4gICAgICAgIC8vbGF1bmNoIGRhdGEgZG93bmxvYWQsIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgIGRzYy5nZXREYXRhKGdlb0NhbnZhcy5leHRHZW8pXHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGRhdGFzZXQgdmlldyBjYWNoZVxyXG4gICAgICAgIGRzYy51cGRhdGVWaWV3Q2FjaGUoZ2VvQ2FudmFzLmV4dEdlbylcclxuXHJcbiAgICAgICAgLy9kcmF3IGNlbGxzLCBzdHlsZSBieSBzdHlsZVxyXG4gICAgICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnN0eWxlcykge1xyXG5cclxuICAgICAgICAgICAgLy9jaGVjayBpZiBzdHlsZSBpcyB2aXNpYmxlXHJcbiAgICAgICAgICAgIGlmIChzLnZpc2libGUgJiYgIXMudmlzaWJsZSh6KSkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vc2V0IHN0eWxlIGFscGhhIGFuZCBibGVuZCBtb2RlXHJcbiAgICAgICAgICAgIC8vVE9ETzogbXVsdGlwbHkgYnkgbGF5ZXIgYWxwaGEgP1xyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lmdsb2JhbEFscGhhID0gcy5hbHBoYSA/IHMuYWxwaGEoeikgOiAxLjBcclxuICAgICAgICAgICAgaWYgKHMuYmxlbmRPcGVyYXRpb24pXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IHMuYmxlbmRPcGVyYXRpb24oeilcclxuXHJcbiAgICAgICAgICAgIC8vc2V0IGFmZmluIHRyYW5zZm9ybSB0byBkcmF3IHdpdGggZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IHdpdGggc3R5bGVcclxuICAgICAgICAgICAgcy5kcmF3KGRzYy5nZXRWaWV3Q2FjaGUoKSwgZ2VvQ2FudmFzLCBkc2MuZ2V0UmVzb2x1dGlvbigpKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IHN0eWxlIGZpbHRlclxyXG4gICAgICAgICAgICBpZiAocy5maWx0ZXJDb2xvcilcclxuICAgICAgICAgICAgICAgIHMuZHJhd0ZpbHRlcihnZW9DYW52YXMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2FkZCBsZWdlbmQgZWxlbWVudFxyXG4gICAgICAgIGlmIChsZWdlbmQpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIHRoaXMuc3R5bGVzKSB7XHJcbiAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHN0eWxlIGlzIHZpc2libGVcclxuICAgICAgICAgICAgICAgIGlmIChzLnZpc2libGUgJiYgIXMudmlzaWJsZSh6KSkgY29udGludWVcclxuICAgICAgICAgICAgICAgIEdyaWRMYXllci5hZGRMZWdlbmRzKGxlZ2VuZCwgcy5sZWdlbmRzKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vY2FzZSBmb3Igc3R5bGVzIG9mIHN0eWxlcywgbGlrZSBrZXJuZWwgc21vb3RoaW5nXHJcbiAgICAgICAgICAgICAgICAvL1RPRE8gZG8gYmV0dGVyXHJcbiAgICAgICAgICAgICAgICBpZiAoc1snc3R5bGVzJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMyIG9mIHNbJ3N0eWxlcyddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzMi52aXNpYmxlICYmICFzMi52aXNpYmxlKHopKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBHcmlkTGF5ZXIuYWRkTGVnZW5kcyhsZWdlbmQsIHMyLmxlZ2VuZHMpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHN0YXRpYyBhZGRMZWdlbmRzKGxlZ2VuZENvbXAsIGxnKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGcpKSBmb3IgKGNvbnN0IGxnXyBvZiBsZykgdGhpcy5hZGRMZWdlbmRzKGxlZ2VuZENvbXAsIGxnXylcclxuICAgICAgICBlbHNlIGxlZ2VuZENvbXAubm9kZSgpLmFwcGVuZChsZy5kaXYubm9kZSgpKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgcmVsZXZhbnQgZGF0YXNldCBjb21wb25lbnQgZm9yIGEgc3BlY2lmaWVkIHpvb20uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcclxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuRGF0YXNldHx1bmRlZmluZWR9XHJcbiAgICAgKiAqL1xyXG4gICAgZ2V0RGF0YXNldCh6KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNldC5nZXREYXRhc2V0KHosIHRoaXMubWluUGl4ZWxzUGVyQ2VsbCk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldC9nZXQgc3R5bGUgc3RhY2suXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7dW5kZWZpbmVkfGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU3R5bGV8QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU3R5bGU+fSBzdHlsZXMgXHJcbiAgICAgKiBAcmV0dXJucyB7IHRoaXMgfCBBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT4gfVxyXG4gICAgICovXHJcbiAgICBzdHlsZXNfKHN0eWxlcykge1xyXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5zdHlsZXNcclxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGVzKSkgdGhpcy5zdHlsZXMgPSBzdHlsZXNcclxuICAgICAgICAgICAgZWxzZSB0aGlzLnN0eWxlcyA9IFtzdHlsZXNdXHJcbiAgICAgICAgZWxzZSB0aGlzLnN0eWxlcyA9IGFyZ3VtZW50c1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHJldHVybmluZyBjZWxsIGluZm9ybWF0aW9uIGFzIEhUTUwuXHJcbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciB0b29sdGlwIGluZm9ybWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGx9IGNlbGxcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBkZWZhdWx0Q2VsbEluZm9IVE1MKGNlbGwpIHtcclxuICAgICAgICBjb25zdCBidWYgPSBbXVxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNlbGwpKSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICd4JykgY29udGludWVcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3knKSBjb250aW51ZVxyXG4gICAgICAgICAgICBidWYucHVzaCgnPGI+Jywga2V5LCAnPC9iPicsICcgOiAnLCBjZWxsW2tleV0sICc8YnI+JylcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJ1Zi5qb2luKCcnKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xyXG5pbXBvcnQgeyBjc3YgfSBmcm9tICdkMy1mZXRjaCdcclxuXHJcbi8qKiBBIGxhYmVsLiBUaGUgbmFtZSBpcyB0aGUgdGV4dCB0byBzaG93LiAoeCx5KSBhcmUgdGhlIGNvb3JkaW5hdGVzIGluIHRoZSBzYW1lIENSUyBhcyB0aGUgZ3JpZC5cclxuICogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmcsIHg6bnVtYmVyLCB5Om51bWJlciB9fSBMYWJlbCAqL1xyXG5cclxuLyoqXHJcbiAqIEEgKGdlbmVyaWMpIGxheWVyIGZvciBwbGFjZW5hbWUgbGFiZWxzLCB0byBiZSBzaG93biBvbiB0b3Agb2YgdGhlIGdyaWQgbGF5ZXJzLlxyXG4gKiBUaGUgaW5wdXQgaXMgYSBDU1YgZmlsZSB3aXRoIHRoZSBwb3NpdGlvbiAoeCwgeSkgb2YgdGhlIGxhYmVscyBhbmQgbmFtZSArIHNvbWUgb3RoZXIgaW5mbyBvbiB0aGUgbGFiZWwgaW1wb3J0YW5jZS5cclxuICogSWYgdGhlIGxhYmVsIGRhdGEgaXMgbm90IGluIHRoZSBleHBlY3RlZCBmb3JtYXQgb3IgaW4gdGhlIHNhbWUgQ1JTIGFzIHRoZSBncmlkLCBpdCBjYW4gYmUgY29ycmVjdGVkIHdpdGggdGhlIFwicHJlcHJvY2Vzc1wiIGZ1bmN0aW9uLlxyXG4gKiBUaGUgc2VsZWN0aW9uIG9mIHRoZSBsYWJlbCwgdGhlaXIgc3R5bGUgKGZvbnQsIHdlaWdodCwgZXRjLikgYW5kIGNvbG9yIGNhbiBiZSBzcGVjaWZpZWQgZGVwZW5kaW5nIG9uIHRoZWlyIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxyXG4gKlxyXG4gKiBAbW9kdWxlIGxheWVyXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBMYWJlbExheWVyIGV4dGVuZHMgTGF5ZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgVVJMIG9mIHRoZSBsYWJlbCBkYXRhLCBhcyBDU1YgZmlsZS5cclxuICAgICAgICAgKiBUaGUgZmlsZSBzaG91bGQgY29udGFpbiB0aGUgaW5mb3JtYXRpb24gZm9yIGVhY2ggbGFiZWwgc3VjaCBhcyB0aGUgdGV4dCwgdGhlIHBvc2l0aW9uIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGRpc3BsYXkgb2YgdGhlIGxhYmVsIGFjY29yZGluZyB0byB0aGUgem9vbSBsZXZlbC5cclxuICAgICAgICAgKiBJZiBuZWNlc3NhcnksIHRoaXMgZGF0YSBjYW4gYmUgcmVmb3JtYXRlZCB3aXRoIHRoZSAncHJlcHJvY2VzcycgcGFyYW1ldGVyLlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXHJcblxyXG4gICAgICAgIC8qKiBTcGVjaWZ5IGlmIGFuZCBob3cgYSBsYWJlbCBzaG91bGQgYmUgZHJhd24sIGRlcGVuZGluZyBvbiBpdHMgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5zdHlsZSA9IG9wdHMuc3R5bGUgfHwgKCgpID0+ICdib2xkIDFlbSBBcmlhbCcpXHJcblxyXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBjb2xvciwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAob3B0cy5kYXJrID8gKCkgPT4gJyNkZGQnIDogKCkgPT4gJyMyMjInKVxyXG5cclxuICAgICAgICAvKiogU3BlY2lmeSB0aGUgbGFiZWwgaGFsbyBjb2xvciwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmhhbG9Db2xvciA9IG9wdHMuaGFsb0NvbG9yIHx8IChvcHRzLmRhcmsgPyAoKSA9PiAnIzAwMDAwMEJCJyA6ICgpID0+ICcjRkZGRkZGQkInKVxyXG5cclxuICAgICAgICAvKiogU3BlY2lmeSB0aGUgbGFiZWwgaGFsbyB3aWR0aCwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmhhbG9XaWR0aCA9IG9wdHMuaGFsb1dpZHRoIHx8ICgoKSA9PiA0KVxyXG5cclxuICAgICAgICAvKiogVGhlIGFuY2hvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0LCBmcm9tIGxhYmVsIHBvc2l0aW9uLiBTZWUgSFRNTC1jYW52YXMgdGV4dEFsaWduIHByb3BlcnR5LlxyXG4gICAgICAgICAqIFwibGVmdFwiIHx8IFwicmlnaHRcIiB8fCBcImNlbnRlclwiIHx8IFwic3RhcnRcIiB8fCBcImVuZFwiXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7Q2FudmFzVGV4dEFsaWdufSAqL1xyXG4gICAgICAgIHRoaXMudGV4dEFsaWduID0gb3B0cy50ZXh0QWxpZ24gfHwgJ3N0YXJ0J1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cclxuICAgICAgICB0aGlzLm9mZnNldFBpeCA9IG9wdHMub2Zmc2V0UGl4IHx8IFs1LCA1XVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggbGFiZWwgYWZ0ZXIgbG9hZGluZy5cclxuICAgICAgICAgKiBJdCBjYW4gYmUgdXNlZCB0byBhcHBseSBzb21lIHNwZWNpZmljIHRyZWF0bWVudCBiZWZvcmUsIGZvcm1hdCB0aGUgbGFiZWwgZGF0YSwgcHJvamVjdCBjb29yZGluYXRlcywgZXRjLlxyXG4gICAgICAgICAqIFJldHVybiBmYWxzZSBpZiB0aGUgbGFiZWwgc2hvdWxkIG5vdCBiZSBrZXB0LlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsKTpib29sZWFufSAqL1xyXG4gICAgICAgIHRoaXMucHJlcHJvY2VzcyA9IG9wdHMucHJlcHJvY2Vzc1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48TGFiZWw+IHwgdW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMubGFiZWxzID0gdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyB0aGUgbGFiZWwgbGF5ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XHJcbiAgICAgICAgLy9sb2FkIGxhYmVscywgaWYgbm90IGRvbmUgeWV0LlxyXG4gICAgICAgIGlmICghdGhpcy5sYWJlbHMpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkKGdlb0NhbnZhcy5yZWRyYXcpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxyXG5cclxuICAgICAgICAvL3RleHQgYWxpZ25cclxuICAgICAgICBnZW9DYW52YXMuY3R4LnRleHRBbGlnbiA9IHRoaXMudGV4dEFsaWduIHx8ICdzdGFydCdcclxuXHJcbiAgICAgICAgLy9saW5lIGpvaW4gYW5kIGNhcFxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUpvaW4gPSAnYmV2ZWwnIC8vfHwgXCJyb3VuZFwiIHx8IFwibWl0ZXJcIjtcclxuICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVDYXAgPSAnYnV0dCcgLy98fCBcInJvdW5kXCIgfHwgXCJzcXVhcmVcIjtcclxuXHJcbiAgICAgICAgLy9kcmF3IGluIHBpeCBjb29yZGluYXRlc1xyXG4gICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgLy9kcmF3IGxhYmVscywgb25lIGJ5IG9uZVxyXG4gICAgICAgIGZvciAoY29uc3QgbGIgb2YgdGhpcy5sYWJlbHMpIHtcclxuICAgICAgICAgICAgLy9nZXQgbGFiZWwgc3R5bGVcclxuICAgICAgICAgICAgY29uc3Qgc3QgPSB0aGlzLnN0eWxlKGxiLCB6KVxyXG4gICAgICAgICAgICBpZiAoIXN0KSBjb250aW51ZVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZvbnQgPSBzdFxyXG5cclxuICAgICAgICAgICAgLy9jaGVjayBsYWJlbCB3aXRoaW4gdGhlIHZpZXcsIHRvIGJlIGRyYXduXHJcbiAgICAgICAgICAgIGlmICghZ2VvQ2FudmFzLnRvRHJhdyhsYikpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3Bvc2l0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IHhQID0gZ2VvQ2FudmFzLmdlb1RvUGl4WChsYi54KSArIHRoaXMub2Zmc2V0UGl4WzBdXHJcbiAgICAgICAgICAgIGNvbnN0IHlQID0gZ2VvQ2FudmFzLmdlb1RvUGl4WShsYi55KSAtIHRoaXMub2Zmc2V0UGl4WzFdXHJcblxyXG4gICAgICAgICAgICAvL2xhYmVsIHN0cm9rZSwgZm9yIHRoZSBoYWxvXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmhhbG9Db2xvciAmJiB0aGlzLmhhbG9XaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaGMgPSB0aGlzLmhhbG9Db2xvcihsYiwgeilcclxuICAgICAgICAgICAgICAgIGNvbnN0IGh3ID0gdGhpcy5oYWxvV2lkdGgobGIsIHopXHJcbiAgICAgICAgICAgICAgICBpZiAoaGMgJiYgaHcgJiYgaHcgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IGhjXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSBod1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlVGV4dChsYi5uYW1lLCB4UCwgeVApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vbGFiZWwgZmlsbFxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb2xvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihsYiwgeilcclxuICAgICAgICAgICAgICAgIGlmIChjb2wpIHtcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9IGNvbFxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFRleHQobGIubmFtZSwgeFAsIHlQKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZCBkYXRhIGZvciBsYWJlbHMsIGZyb20gVVJMIHRoaXMudXJsXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6dm9pZH0gY2FsbGJhY2tcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGxvYWQoY2FsbGJhY2spIHtcclxuICAgICAgICBpZiAoIXRoaXMudXJsKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBsYWJlbHM6IE5vIFVSTCBzcGVjaWZpZWQuICcgKyB0aGlzLnVybClcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcclxuICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vY2hlY2sgaWYgZGF0YSBhbHJlYWR5IGxvYWRlZFxyXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVyblxyXG5cclxuICAgICAgICAvL2xvYWQgZGF0YVxyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48TGFiZWw+IH0gKi9cclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGNzdih0aGlzLnVybClcclxuXHJcbiAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcclxuICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wcmVwcm9jZXNzKGMpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMucHVzaChjKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9zdG9yZSBsYWJlbHNcclxuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxzID0gZGF0YVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbG9hZGVkJ1xyXG5cclxuICAgICAgICAgICAgLy9yZWRyYXdcclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGxhYmVscyBmcm9tICcgKyB0aGlzLnVybClcclxuICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGNvbG9yIGNhdGVncm9yaWVzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIGxlZ2VuZFxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29sb3JDYXRlZ29yeUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XHJcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8vY29sL2NhdGVnb3JpZXMgYXJyYXksIGluIGRpc3BsYXkgb3JkZXJcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48W3N0cmluZyxzdHJpbmddPn0gKi9cclxuICAgICAgICB0aGlzLmNvbG9yTGFiZWwgPSBvcHRzLmNvbG9yTGFiZWwgfHwgW1snZ3JheScsICctJ11dXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvU3R5bGUuanNcIikuU2hhcGV9ICovXHJcbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgJ2NpcmNsZSdcclxuICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IG9wdHMuZGltZW5zaW9uIHx8IHsgcjogOCB9XHJcbiAgICAgICAgdGhpcy5zdHJva2VDb2xvciA9IG9wdHMuc3Ryb2tlQ29sb3IgfHwgJ2dyYXknXHJcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgMVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICovXHJcbiAgICB1cGRhdGUoKSB7XHJcblxyXG4gICAgICAgIC8vY2xlYXJcclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxyXG5cclxuICAgICAgICAvL3RpdGxlXHJcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxyXG5cclxuICAgICAgICAvL2NhdGVnb3JpZXNcclxuICAgICAgICBjb25zdCBuYiA9IHRoaXMuY29sb3JMYWJlbC5sZW5ndGhcclxuICAgICAgICBpZiAobmIgPT0gMCkgcmV0dXJuXHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjYXQgPSB0aGlzLmNvbG9yTGFiZWxbaV1cclxuXHJcbiAgICAgICAgICAgIC8vbWFrZSBkaXYgZm9yIGNhdGVnb3J5XHJcbiAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgIC8vdG8gZW5hYmxlIHZlcnRpY2FsIGNlbnRlcmluZ1xyXG4gICAgICAgICAgICAvLy5zdHlsZShcInBvc2l0aW9uXCIsIFwicmVsYXRpdmVcIilcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN3ID0gdGhpcy5zdHJva2VXaWR0aFxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGdyYXBoaWMgZWxlbWVudDogYm94IC8gY2lyY2xlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNoYXBlID09PSAnc3F1YXJlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IHRoaXMuZGltZW5zaW9uLmggfHwgMTVcclxuICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB0aGlzLmRpbWVuc2lvbi53IHx8IDIwXHJcbiAgICAgICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3ICsgMiAqIHN3KVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoICsgMiAqIHN3KVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdyZWN0JylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cigneCcsIHN3KVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd5Jywgc3cpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaClcclxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCBjYXRbMF0pXHJcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuZGltZW5zaW9uLnIgfHwgOFxyXG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IDIgKiByICsgMiAqIHN3XHJcbiAgICAgICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBoKVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdjaXJjbGUnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHIgKyBzdylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignY3knLCByICsgc3cpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3InLCByKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGNhdFswXSlcclxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuc3Ryb2tlQ29sb3IpXHJcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCB0aGlzLnN0cm9rZVdpZHRoKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyB0aGlzLnNoYXBlKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL3dyaXRlIGxhYmVsIHRleHRcclxuICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgICAgICAvL3Nob3cgb24gcmlnaHQgb2YgZ3JhcGhpY1xyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXHJcblxyXG4gICAgICAgICAgICAgICAgLy9jZW50ZXIgdmVydGljYWxseVxyXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcImFic29sdXRlXCIpLnN0eWxlKFwidG9wXCIsIFwiMFwiKS5zdHlsZShcImJvdHRvbVwiLCBcIjBcIilcclxuXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsICc1cHgnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXHJcbiAgICAgICAgICAgICAgICAudGV4dChjYXRbMV0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXHJcblxyXG4vKipcclxuICogQSBsZWdlbmQgZWxlbWVudCBmb3IgZGlzY3JldGUgY29sb3Igc3R5bGUuXHJcbiAqIEluc3BpcmF0aW9uOiBodHRwczovL29ic2VydmFibGVocS5jb20vQGQzL2NvbG9yLWxlZ2VuZFxyXG4gKlxyXG4gKiBAbW9kdWxlIGxlZ2VuZFxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29sb3JEaXNjcmV0ZUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XHJcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlKTpBcnJheS48c3RyaW5nPn0gKi9cclxuICAgICAgICB0aGlzLmNvbG9ycyA9IG9wdHMuY29sb3JzXHJcbiAgICAgICAgLyoqIEBwcml2YXRlIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvU3R5bGUnKS5WaWV3U2NhbGUpOkFycmF5LjxudW1iZXI+fSAqL1xyXG4gICAgICAgIHRoaXMuYnJlYWtzID0gb3B0cy5icmVha3NcclxuXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMzAwXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAxNVxyXG5cclxuICAgICAgICB0aGlzLnRpY2tTaXplID0gb3B0cy50aWNrU2l6ZSB8fCAzXHJcblxyXG4gICAgICAgIC8vbGFiZWxcclxuICAgICAgICB0aGlzLmludmVydCA9IG9wdHMuaW52ZXJ0XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge3t2aWV3U2NhbGU6aW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlfSB9IG9wdHNcclxuICAgICAqL1xyXG4gICAgdXBkYXRlKG9wdHMpIHtcclxuXHJcbiAgICAgICAgLy9jbGVhclxyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXHJcblxyXG4gICAgICAgIC8vdGl0bGVcclxuICAgICAgICB0aGlzLm1ha2VUaXRsZSgpXHJcblxyXG4gICAgICAgIC8vZ2V0IGNvbG9ycyBhbmQgYnJlYWtzXHJcbiAgICAgICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnMob3B0cy52aWV3U2NhbGUpXHJcbiAgICAgICAgY29uc3QgYnJlYWtzID0gdGhpcy5icmVha3Mob3B0cy52aWV3U2NhbGUpXHJcbiAgICAgICAgaWYgKCFicmVha3MpIHJldHVyblxyXG5cclxuICAgICAgICAvL2NsYXNzZXNcclxuICAgICAgICBjb25zdCBuYiA9IGNvbG9ycy5sZW5ndGhcclxuICAgICAgICBpZiAobmIgPT0gMCkgcmV0dXJuXHJcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGggLyBuYlxyXG5cclxuICAgICAgICAvL21ha2Ugc3ZnIGVsZW1lbnRcclxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdlxyXG4gICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCB0aGlzLndpZHRoKVxyXG4gICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgdGhpcy5oZWlnaHQgKyB0aGlzLnRpY2tTaXplICsgMiArIDEwKVxyXG5cclxuICAgICAgICAvL2RyYXcgZ3JhcGhpYyBlbGVtZW50c1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xyXG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdyZWN0JylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgaSAqIHcpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3KVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgY29sb3JzW2ldKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy90aWNrIGxpbmVcclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcclxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgnbGluZScpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCB3ICogaSlcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneDInLCB3ICogaSlcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MicsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSlcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ2JsYWNrJylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vbGFiZWxzXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuYjsgaSsrKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBicmVha3NbaSAtIDFdXHJcbiAgICAgICAgICAgIGlmIChpc05hTihsYWJlbCkgfHwgbGFiZWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZih0aGlzLmxhYmVsRm9ybWF0KSBsYWJlbCA9IHRoaXMubGFiZWxGb3JtYXQobGFiZWwpXHJcblxyXG4gICAgICAgICAgICAvL2xhYmVsXHJcbiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ3RpY2tsYWJlbF8nICsgaSlcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgdyAqIGkpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDIpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcclxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC13ZWlnaHRcIiwgXCJib2xkXCIpXHJcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtZmFtaWx5XCIsIFwiQXJpYWxcIilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYWxpZ25tZW50LWJhc2VsaW5lJywgJ3RvcCcpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdub25lJylcclxuICAgICAgICAgICAgICAgIC50ZXh0KGxhYmVsKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGNvbnRpbnVvdXMgY29sb3Igc3R5bGUuXHJcbiAqIEluc3BpcmF0aW9uOiBodHRwczovL29ic2VydmFibGVocS5jb20vQGQzL2NvbG9yLWxlZ2VuZFxyXG4gKlxyXG4gKiBAbW9kdWxlIGxlZ2VuZFxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29sb3JMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xyXG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvL2EgZnVuY3Rpb24gWzAsMV0tPmNvbG9yIGZvciBjb250aW51b3VzIGNvbG9ycy5cclxuICAgICAgICAvL2l0IGNhbiB0YWtlIGFzIHNlY29uZCBhcmd1bWVudCB0aGUgdmlld3NjYWxlLlxyXG4gICAgICAgIHRoaXMuY29sb3JTY2FsZSA9IG9wdHMuY29sb3JTY2FsZVxyXG5cclxuICAgICAgICAvL2Z1bmN0aW9uICh0WzAsMV0pIC0+IHZhbHVlIChmb3IgbGFiZWwgdGV4dClcclxuICAgICAgICAvL2l0IGNhbiB0YWtlIGFzIHNlY29uZCBhcmd1bWVudCB0aGUgdmlld3NjYWxlLlxyXG4gICAgICAgIHRoaXMudGV4dFNjYWxlID0gb3B0cy50ZXh0U2NhbGUgfHwgKHQgPT4gdClcclxuXHJcbiAgICAgICAgdGhpcy5tYXJnaW4gPSBvcHRzLm1hcmdpbiB8fCA1XHJcblxyXG4gICAgICAgIC8vcmVwbGFjZSB3aXRoIGxhYmVscyA/XHJcbiAgICAgICAgdGhpcy50aWNrU2l6ZSA9IG9wdHMudGlja1NpemUgfHwgNlxyXG4gICAgICAgIHRoaXMudGlja3MgPSBvcHRzLnRpY2tzIHx8IE1hdGguZmxvb3IodGhpcy53aWR0aCAvIDUwKVxyXG4gICAgICAgIHRoaXMudGlja0Zvcm1hdCA9IG9wdHMudGlja0Zvcm1hdFxyXG4gICAgICAgIHRoaXMudGlja1VuaXQgPSBvcHRzLnRpY2tVbml0XHJcblxyXG4gICAgICAgIHRoaXMuZm9udFNpemUgPSBvcHRzLmZvbnRTaXplIHx8ICcwLjhlbSdcclxuICAgICAgICB0aGlzLmludmVydCA9IG9wdHMuaW52ZXJ0XHJcblxyXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8IDMwMFxyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgMTVcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7e3ZpZXdTY2FsZTppbXBvcnQoJy4uL2NvcmUvU3R5bGUnKS5WaWV3U2NhbGV9IH0gb3B0c1xyXG4gICAgICovXHJcbiAgICB1cGRhdGUob3B0cykge1xyXG5cclxuICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgLy90aXRsZVxyXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcclxuXHJcbiAgICAgICAgY29uc3Qgc3ZnVyA9IHRoaXMud2lkdGggKyAyICogdGhpcy5tYXJnaW5cclxuICAgICAgICBjb25zdCBzdmdIID0gdGhpcy5oZWlnaHQgKyB0aGlzLm1hcmdpbiArIHRoaXMudGlja1NpemUgKyAxMFxyXG4gICAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuZGl2LmFwcGVuZCgnc3ZnJykuYXR0cignd2lkdGgnLCBzdmdXKS5hdHRyKCdoZWlnaHQnLCBzdmdIKVxyXG4gICAgICAgIC8vICA8cmVjdCB3aWR0aD1cIjMwMFwiIGhlaWdodD1cIjEwMFwiIHN0eWxlPVwiZmlsbDpyZ2IoMCwwLDI1NSk7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlOnJnYigwLDAsMClcIiAvPlxyXG5cclxuICAgICAgICBjb25zdCBnID0gc3ZnXHJcbiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgdGhpcy5tYXJnaW4gKyAnICcgKyAwICsgJyknKVxyXG5cclxuICAgICAgICAvL2RyYXcgY29sb3IgYmFyXHJcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGgsXHJcbiAgICAgICAgICAgIGggPSB0aGlzLmhlaWdodFxyXG4gICAgICAgIGNvbnN0IHN0ZXAgPSA1XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3OyBpICs9IHN0ZXApIHtcclxuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHcgLSAxKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnZlcnQpIHQgPSAxIC0gdFxyXG4gICAgICAgICAgICBnLmFwcGVuZCgncmVjdCcpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIGkpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzdGVwKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGgpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmNvbG9yU2NhbGUodCwgb3B0cy52aWV3U2NhbGUpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRpY2tzOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHRoaXMudGlja3MgLSAxKVxyXG5cclxuICAgICAgICAgICAgLy90aWNrIGxpbmVcclxuICAgICAgICAgICAgZy5hcHBlbmQoJ2xpbmUnKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gxJywgdyAqIHQpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCAwKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gyJywgdyAqIHQpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneTInLCBoICsgdGhpcy50aWNrU2l6ZSlcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ2JsYWNrJylcclxuXHJcbiAgICAgICAgICAgIC8vcHJlcGFyZSB0aWNrIGxhYmVsXHJcbiAgICAgICAgICAgIGcuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICd0aWNrbGFiZWxfJyArIGkpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIHcgKiB0KVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCBoICsgdGhpcy50aWNrU2l6ZSArIDIpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpXHJcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtd2VpZ2h0XCIsIFwiYm9sZFwiKVxyXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LWZhbWlseVwiLCBcIkFyaWFsXCIpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgaSA9PSAwID8gJ3N0YXJ0JyA6IGkgPT0gdGhpcy50aWNrcyAtIDEgPyAnZW5kJyA6ICdtaWRkbGUnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdhbGlnbm1lbnQtYmFzZWxpbmUnLCAndG9wJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZG9taW5hbnQtYmFzZWxpbmUnLCAnaGFuZ2luZycpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxyXG4gICAgICAgICAgICAvLy50ZXh0KFwiLVwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy91cGRhdGUgdGljayBsYWJlbHNcclxuXHJcbiAgICAgICAgLy9sYWJlbCB0ZXh0IGZvcm1hdFxyXG4gICAgICAgIGNvbnN0IGYgPSB0aGlzLnRpY2tGb3JtYXQgJiYgdGhpcy50aWNrRm9ybWF0ICE9ICd0ZXh0JyA/IHRoaXMudGlja0Zvcm1hdCA6ICh2KSA9PiB2XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRpY2tzOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHRoaXMudGlja3MgLSAxKVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMudGV4dFNjYWxlKHQsIG9wdHMudmlld1NjYWxlKVxyXG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gKHYgPyBmKHYpIDogJzAnKSArICh0aGlzLnRpY2tVbml0ID8gdGhpcy50aWNrVW5pdCA6ICcnKVxyXG4gICAgICAgICAgICBpZiAodGV4dCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3RpY2sgbGFiZWxcclxuICAgICAgICAgICAgdGhpcy5kaXYuc2VsZWN0KCcjJyArICd0aWNrbGFiZWxfJyArIGkpLnRleHQodGV4dClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9jb3JlL0xlZ2VuZC5qcydcclxuXHJcbi8qKlxyXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBzZWdtZW50IG9yaWVudGF0aW9uLlxyXG4gKlxyXG4gKiBAbW9kdWxlIGxlZ2VuZFxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgT3JpZW50YXRpb25MZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xyXG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvL29yaWVudGF0aW9uXHJcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgMFxyXG4gICAgICAgIC8vY29sb3JcclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gJ2dyYXknKVxyXG4gICAgICAgIC8vd2lkdGhcclxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gMyAqIHopXHJcbiAgICAgICAgLy9sZW5ndGhcclxuICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdHMubGVuZ3RoIHx8ICgocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA9PiByZXNvbHV0aW9uKVxyXG5cclxuICAgICAgICAvL2xhYmVsXHJcbiAgICAgICAgdGhpcy5sYWJlbCA9IG9wdHMubGFiZWwgfHwgXCItXCJcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7eyBzdHlsZTogaW1wb3J0KFwiLi4vc3R5bGUvU2VnbWVudFN0eWxlLmpzXCIpLlNlZ21lbnRTdHlsZSwgcmVzb2x1dGlvbjogbnVtYmVyLCB6OiBudW1iZXIsIHZpZXdTY2FsZTpvYmplY3QgfX0gb3B0c1xyXG4gICAgICovXHJcbiAgICB1cGRhdGUob3B0cykge1xyXG5cclxuICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgLy90aXRsZVxyXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcclxuXHJcbiAgICAgICAgY29uc3QgZCA9IHRoaXMuZGl2LmFwcGVuZCgnZGl2JylcclxuXHJcbiAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgY29sb3IsIHdpZHRoIGFuZCBsZW5ndGhcclxuICAgICAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3Iob3B0cy5yZXNvbHV0aW9uLCBvcHRzLnosIG9wdHMudmlld1NjYWxlKVxyXG4gICAgICAgIGNvbnN0IHdpZHRoUGl4ID0gdGhpcy53aWR0aChvcHRzLnJlc29sdXRpb24sIG9wdHMueiwgb3B0cy52aWV3U2NhbGUpIC8gb3B0cy56XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoUGl4ID0gdGhpcy5sZW5ndGgob3B0cy5yZXNvbHV0aW9uLCBvcHRzLnosIG9wdHMudmlld1NjYWxlKSAvIG9wdHMuelxyXG5cclxuICAgICAgICAvL2RyYXcgU1ZHIHNlZ21lbnRcclxuICAgICAgICBjb25zdCBzdmdTID0gTWF0aC5tYXgobGVuZ3RoUGl4LCB3aWR0aFBpeClcclxuICAgICAgICBjb25zdCBzdmcgPSBkLmFwcGVuZCgnc3ZnJykuYXR0cignd2lkdGgnLCBzdmdTKS5hdHRyKCdoZWlnaHQnLCBzdmdTKS5zdHlsZSgnJywgJ2lubGluZS1ibG9jaycpXHJcblxyXG4gICAgICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKCgtdGhpcy5vcmllbnRhdGlvbiAqIE1hdGguUEkpIC8gMTgwKVxyXG4gICAgICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKCgtdGhpcy5vcmllbnRhdGlvbiAqIE1hdGguUEkpIC8gMTgwKVxyXG4gICAgICAgIGNvbnN0IGRjID0gc3ZnUyAqIDAuNSxcclxuICAgICAgICAgICAgbDIgPSBsZW5ndGhQaXggKiAwLjVcclxuICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcclxuICAgICAgICAgICAgLmF0dHIoJ3gxJywgZGMgLSBjb3MgKiBsMilcclxuICAgICAgICAgICAgLmF0dHIoJ3kxJywgZGMgLSBzaW4gKiBsMilcclxuICAgICAgICAgICAgLmF0dHIoJ3gyJywgZGMgKyBjb3MgKiBsMilcclxuICAgICAgICAgICAgLmF0dHIoJ3kyJywgZGMgKyBzaW4gKiBsMilcclxuICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCBjb2xvcilcclxuICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCB3aWR0aFBpeClcclxuXHJcblxyXG4gICAgICAgIC8vbGFiZWxcclxuICAgICAgICBkLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXHJcbiAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxyXG4gICAgICAgICAgICAudGV4dCh0aGlzLmxhYmVsICsgKHRoaXMubGFiZWxVbml0VGV4dCA/ICcgJyA6ICcnKSArIHRoaXMubGFiZWxVbml0VGV4dClcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFxyXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBvcmllbnRhdGlvbnMgXHJcbiAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGxhYmVscyBcclxuICogQHBhcmFtIHtvYmplY3R9IG9wdHMgXHJcbiAqIEByZXR1cm5zICB7IEFycmF5LjxPcmllbnRhdGlvbkxlZ2VuZD4gfVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9yaWVudGF0aW9uTGVnZW5kKG9yaWVudGF0aW9ucywgbGFiZWxzLCBvcHRzID0ge30pIHtcclxuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmllbnRhdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBvcHRzLnRpdGxlID0gaSA9PSAwID8gb3B0cy50aXRsZSA6IHVuZGVmaW5lZDtcclxuICAgICAgICBvcHRzLm9yaWVudGF0aW9uID0gb3JpZW50YXRpb25zW2ldXHJcbiAgICAgICAgb3B0cy5sYWJlbCA9IGxhYmVsc1tpXVxyXG4gICAgICAgIGxlZ2VuZHMucHVzaChuZXcgT3JpZW50YXRpb25MZWdlbmQob3B0cykpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGVnZW5kc1xyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXHJcbmltcG9ydCB7IG5pY2UgfSBmcm9tICcuLi91dGlscy91dGlscy5qcydcclxuaW1wb3J0IHsgbWF4IH0gZnJvbSAnZDMtYXJyYXknXHJcblxyXG4vKipcclxuICogQSBsZWdlbmQgZWxlbWVudCBmb3IgcHJvcG9ydGlvbmFsIHN5bWJvbHMuXHJcbiAqXHJcbiAqIEBtb2R1bGUgbGVnZW5kXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaXplTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcclxuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0ZXh0IGxhYmVsLCBmcm9tIHRoZSB2aWV3IHNjYWxlIGFuZCBsaXN0IG9mIGNlbGxzLCByZXNvbHV0aW9uIGFuZCB6b29tXHJcbiAgICAgICAgICogIEB0eXBlIHsgZnVuY3Rpb24ob2JqZWN0LCBBcnJheS48aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsPiwgbnVtYmVyLCBudW1iZXIpOihudW1iZXJ8c3RyaW5nKSB9ICovXHJcbiAgICAgICAgdGhpcy5sYWJlbCA9IG9wdHMubGFiZWwgfHwgdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgbGVnZW5kIHN5bWJvbCwgaW4gZ2VvIFVvTSwgZnJvbSB0aGUgdmlld3NjYWxlLCByZXNvbHV0aW9uIGFuZCB6b29tXHJcbiAgICAgICAgICogIEB0eXBlIHsgZnVuY3Rpb24ob2JqZWN0LCBudW1iZXIsIG51bWJlcik6bnVtYmVyIH0gKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8vc3ltYm9sXHJcbiAgICAgICAgLyoqICBAdHlwZSB7KGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU2hhcGUpfFwibGluZVwifSAqL1xyXG4gICAgICAgIHRoaXMuc2hhcGUgPSBvcHRzLnNoYXBlIHx8ICdjaXJjbGUnXHJcblxyXG4gICAgICAgIC8vZ2VuZXJhbCBjYXNlXHJcbiAgICAgICAgdGhpcy5maWxsQ29sb3IgPSBvcHRzLmZpbGxDb2xvciB8fCAnbm9uZSdcclxuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAnZ3JheSdcclxuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoID0gb3B0cy5zdHJva2VXaWR0aCB8fCAxXHJcblxyXG4gICAgICAgIC8vZm9yIGxpbmUgc2hhcGVcclxuICAgICAgICAvL1RPRE8gdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgMFxyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICdncmF5J1xyXG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0cy5sZW5ndGggfHwgKChyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+IHJlc29sdXRpb24pXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge3sgdmlld1NjYWxlOm9iamVjdCwgcmVzb2x1dGlvbjogbnVtYmVyLCB6Om51bWJlciwgY2VsbHM6QXJyYXkuPGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbD4gfX0gb3B0c1xyXG4gICAgICovXHJcbiAgICB1cGRhdGUob3B0cykge1xyXG5cclxuICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgLy90aXRsZVxyXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcclxuXHJcbiAgICAgICAgLy9nZXQgbGFiZWwuIE1heSBub3QgYmUgYSBudW1iZXIgKCEpXHJcbiAgICAgICAgbGV0IGxhYmVsID0gdGhpcy5sYWJlbChvcHRzLnZpZXdTY2FsZSwgb3B0cy5jZWxscywgb3B0cy5yZXNvbHV0aW9uLCBvcHRzLnopXHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBzaXplIG9mIHN5bWJvbCwgaW4gcGl4XHJcbiAgICAgICAgbGV0IHNpemVQaXhcclxuICAgICAgICBpZiAodGhpcy5zaXplKVxyXG4gICAgICAgICAgICBzaXplUGl4ID0gdGhpcy5zaXplKG9wdHMudmlld1NjYWxlLCBvcHRzLnJlc29sdXRpb24sIG9wdHMueikgLyBvcHRzLnpcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHNpemVQaXggPSBvcHRzLnZpZXdTY2FsZSgrbGFiZWwpIC8gb3B0cy56XHJcbiAgICAgICAgaWYgKCFzaXplUGl4KSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9mb3JtYXQgbGFiZWwsIGlmIHNwZWNpZmllZCBhbmQgcG9zc2libGVcclxuICAgICAgICBpZiAodGhpcy5sYWJlbEZvcm1hdCAmJiAhaXNOYU4oK2xhYmVsKSkgbGFiZWwgPSB0aGlzLmxhYmVsRm9ybWF0KGxhYmVsKVxyXG5cclxuICAgICAgICBjb25zdCBkID0gdGhpcy5kaXYuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAgIC8vdG8gZW5hYmxlIHZlcnRpY2FsIGNlbnRlcmluZ1xyXG4gICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKVxyXG5cclxuICAgICAgICAvL2RlZmF1bHQgc3ZnIGNvbnN0cnVjdGlvbiwgZm9yIHNxdWFyZSBhbmQgY2lyY2xlXHJcbiAgICAgICAgY29uc3Qgc3ZnID0gKCkgPT4gZFxyXG4gICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzaXplUGl4ICsgdGhpcy5zdHJva2VXaWR0aCArIDIpXHJcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBzaXplUGl4ICsgdGhpcy5zdHJva2VXaWR0aCArIDIpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnJywgJ2lubGluZS1ibG9jaycpXHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNoYXBlID09PSAnc3F1YXJlJykge1xyXG4gICAgICAgICAgICBzdmcoKS5hcHBlbmQoJ3JlY3QnKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCAwKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAwKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgc2l6ZVBpeClcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBzaXplUGl4KVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5maWxsQ29sb3IpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuc3Ryb2tlQ29sb3IpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHRoaXMuc3Ryb2tlV2lkdGgpXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAvLyA8Y2lyY2xlIGN4PVwiNTBcIiBjeT1cIjUwXCIgcj1cIjQwXCIgc3Ryb2tlPVwiYmxhY2tcIiBzdHJva2Utd2lkdGg9XCIzXCIgZmlsbD1cInJlZFwiIC8+XHJcbiAgICAgICAgICAgIGNvbnN0IHIgPSAoc2l6ZVBpeCArIHRoaXMuc3Ryb2tlV2lkdGgpICogMC41XHJcbiAgICAgICAgICAgIHN2ZygpLmFwcGVuZCgnY2lyY2xlJylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHIgKyAxKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2N5JywgciArIDEpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigncicsIHIpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmZpbGxDb2xvcilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdkb251dCcpIHtcclxuICAgICAgICAgICAgLy9UT0RPXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnZGlhbW9uZCcpIHtcclxuICAgICAgICAgICAgLy9UT0RPXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnbGluZScpIHtcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IHNlZ21lbnQgbGVuZ3RoXHJcbiAgICAgICAgICAgIGxldCBsZW5ndGhQaXggPSB0aGlzLmxlbmd0aCA/IHRoaXMubGVuZ3RoKG9wdHMucmVzb2x1dGlvbiwgb3B0cy56LCBvcHRzLnZpZXdTY2FsZSkgOiBvcHRzLnJlc29sdXRpb25cclxuICAgICAgICAgICAgbGVuZ3RoUGl4IC89IG9wdHMuelxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3ZnID0gZC5hcHBlbmQoJ3N2ZycpLmF0dHIoJ3dpZHRoJywgbGVuZ3RoUGl4KS5hdHRyKCdoZWlnaHQnLCBzaXplUGl4KS5zdHlsZSgnJywgJ2lubGluZS1ibG9jaycpXHJcblxyXG4gICAgICAgICAgICAvL1RPRE8gb3JpZW50YXRpb25cclxuICAgICAgICAgICAgLy88bGluZSB4MT1cIjBcIiB5MT1cIjBcIiB4Mj1cIjIwMFwiIHkyPVwiMjAwXCIgc3R5bGU9XCJzdHJva2U6cmdiKDI1NSwwLDApO3N0cm9rZS13aWR0aDoyXCIgLz5cclxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgnbGluZScpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCAwKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgc2l6ZVBpeCAvIDIpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneDInLCBsZW5ndGhQaXgpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneTInLCBzaXplUGl4IC8gMilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5jb2xvcilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgc2l6ZVBpeClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHRoaXMuc2hhcGUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2xhYmVsXHJcbiAgICAgICAgZC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsICc1cHgnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcclxuICAgICAgICAgICAgLnRleHQobGFiZWwgKyAodGhpcy5sYWJlbFVuaXRUZXh0ID8gJyAnIDogJycpICsgdGhpcy5sYWJlbFVuaXRUZXh0KVxyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4vKipcclxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gdmFsdWVzIFxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfSBzaXplIFxyXG4gKiBAcGFyYW0geyBvYmplY3QgfSBvcHRzIFxyXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNpemVMZWdlbmQodmFsdWVzLCBzaXplLCBvcHRzID0ge30pIHtcclxuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxyXG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XHJcbiAgICAgICAgb3B0cy50aXRsZSA9IHZhbHVlID09IHZhbHVlc1swXSA/IG9wdHMudGl0bGUgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgb3B0cy5zaXplID0gKCkgPT4gc2l6ZSh2YWx1ZSlcclxuICAgICAgICBvcHRzLmxhYmVsID0gKCkgPT4gdmFsdWVcclxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGVnZW5kc1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHsgZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsKTpudW1iZXIgfSB2YWx1ZSBcclxuICogQHBhcmFtIHsqfSBvcHRzIFxyXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNpemVMZWdlbmRWaWV3U2NhbGUodmFsdWUsIG9wdHMgPSB7fSkge1xyXG4gICAgY29uc3QgayA9IG9wdHMuayB8fCBbMC45LCAwLjUsIDAuMiwgMC4wNV1cclxuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxyXG4gICAgZm9yIChsZXQga18gb2Ygaykge1xyXG4gICAgICAgIG9wdHMudGl0bGUgPSBrXyA9PSBrWzBdID8gb3B0cy50aXRsZSA6IHVuZGVmaW5lZFxyXG4gICAgICAgIG9wdHMubGFiZWwgPSAodmlld1NjYWxlLCBjZWxscykgPT4gbmljZShrXyAqIG1heChjZWxscywgdmFsdWUpKVxyXG4gICAgICAgIGxlZ2VuZHMucHVzaChuZXcgU2l6ZUxlZ2VuZChvcHRzKSlcclxuICAgIH1cclxuICAgIHJldHVybiBsZWdlbmRzXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGZ1bmN0aW9uIHdoaWNoIHJldHVybiBhIHN0YWNrIG9mIHNpemUgbGVnZW5kcyBmb3IgYSBkaXNjcmV0ZSBjbGFzc2lmaWNhdGlvbi5cclxuICogXHJcbiAqIEBwYXJhbSB7IEFycmF5LjxudW1iZXI+IH0gYnJlYWtzIFxyXG4gKiBAcGFyYW0geyBBcnJheS48bnVtYmVyPiB9IHNpemVzIFxyXG4gKiBAcGFyYW0geyBvYmplY3QgfSBvcHRzIFxyXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNpemVEaXNjcmV0ZUxlZ2VuZChicmVha3MsIHNpemVzLCBvcHRzID0ge30pIHtcclxuICAgIGNvbnN0IGYgPSBvcHRzLmxhYmVsRm9ybWF0IHx8ICh4ID0+IHgpXHJcbiAgICBjb25zdCBsYWJlbFRleHQgPSBvcHRzLmxhYmVsVGV4dCB8fCBkZWZhdWx0TGFiZWxUZXh0KGYpXHJcbiAgICBjb25zdCBsZWdlbmRzID0gW11cclxuICAgIGZvciAobGV0IGkgPSBzaXplcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIG9wdHMudGl0bGUgPSBpID09IHNpemVzLmxlbmd0aCAtIDEgPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkXHJcbiAgICAgICAgb3B0cy5zaXplID0gKCkgPT4gc2l6ZXNbaV1cclxuICAgICAgICBvcHRzLmxhYmVsID0gKCkgPT4gbGFiZWxUZXh0KGJyZWFrc1tpIC0gMV0sIGJyZWFrc1tpXSlcclxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGVnZW5kc1xyXG59XHJcblxyXG4vKipcclxuICogQSBmdW5jdGlvbiB3aGljaCByZXR1cm4gYSBzdGFjayBvZiBzaXplIGxlZ2VuZHMgZm9yIGEgZGlzY3JldGUgY2xhc3NpZmljYXRpb24gdXNpbmcgYSB2aWV3c2NhbGUuXHJcbiAqIEBwYXJhbSB7IG51bWJlciB9IGNsYXNzTnVtYmVyIFxyXG4gKiBAcGFyYW0geyBvYmplY3QgfSBvcHRzIFxyXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNpemVEaXNjcmV0ZVZpZXdTY2FsZUxlZ2VuZChjbGFzc051bWJlciwgb3B0cyA9IHt9KSB7XHJcbiAgICBjb25zdCBmID0gb3B0cy5sYWJlbEZvcm1hdCB8fCAoeCA9PiB4KVxyXG4gICAgY29uc3QgbGFiZWxUZXh0ID0gb3B0cy5sYWJlbFRleHQgfHwgZGVmYXVsdExhYmVsVGV4dChmKVxyXG4gICAgY29uc3QgbGVnZW5kcyA9IFtdXHJcbiAgICBjb25zdCB2aWV3U2NhbGVGdW4gPSBvcHRzLnZpZXdTY2FsZUZ1biB8fCAodCA9PiB0KSAvL1RPRE8gZG8gaXQgZGlmZmVyZW50bHk/IEF0IHNpemVsZWdlbmQgbGV2ZWwgIVxyXG4gICAgZm9yIChsZXQgaSA9IGNsYXNzTnVtYmVyIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBvcHRzLnRpdGxlID0gaSA9PSBjbGFzc051bWJlciAtIDEgPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkXHJcbiAgICAgICAgb3B0cy5zaXplID0gKHZpZXdTY2FsZSkgPT4gdmlld1NjYWxlRnVuKHZpZXdTY2FsZSkudmFsdWVzW2ldXHJcbiAgICAgICAgb3B0cy5sYWJlbCA9ICh2aWV3U2NhbGUpID0+IGxhYmVsVGV4dCh2aWV3U2NhbGVGdW4odmlld1NjYWxlKS5icmVha3NbaSAtIDFdLCB2aWV3U2NhbGVGdW4odmlld1NjYWxlKS5icmVha3NbaV0pXHJcbiAgICAgICAgbGVnZW5kcy5wdXNoKG5ldyBTaXplTGVnZW5kKG9wdHMpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxlZ2VuZHNcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gZm9ybWF0IGxhYmVybHMgZm9yIGRpc2NyZXRlIHNjYWxlIGxlZ2VuZHMuXHJcbiAqIEBwYXJhbSB7IGZ1bmN0aW9uKG51bWJlcik6c3RyaW5nIH0gZm9ybWF0IFxyXG4gKiBAcmV0dXJucyB7IGZ1bmN0aW9uKG51bWJlcnx1bmRlZmluZWQsIG51bWJlcnx1bmRlZmluZWQpOiBzdHJpbmcgfVxyXG4gKi9cclxuZnVuY3Rpb24gZGVmYXVsdExhYmVsVGV4dChmb3JtYXQpIHtcclxuICAgIHJldHVybiAodjAsIHYxKSA9PiB7XHJcbiAgICAgICAgaWYgKHYwID09IHVuZGVmaW5lZCAmJiB2MSA9PSB1bmRlZmluZWQpIHJldHVybiBcIlwiXHJcbiAgICAgICAgaWYgKHYxID09IHVuZGVmaW5lZCkgcmV0dXJuIFwiPiBcIiArIGZvcm1hdCh2MClcclxuICAgICAgICBpZiAodjAgPT0gdW5kZWZpbmVkKSByZXR1cm4gXCI8IFwiICsgZm9ybWF0KHYxKVxyXG4gICAgICAgIHJldHVybiBmb3JtYXQodjApICsgXCIgLSBcIiArIGZvcm1hdCh2MSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcclxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXHJcblxyXG4vKipcclxuICpcclxuICogQG1vZHVsZSBsZWdlbmRcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRlcm5hcnlMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xyXG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvL2NsYXNzaWZpZXJcclxuICAgICAgICB0aGlzLmNsYXNzaWZpZXIgPSBvcHRzLmNsYXNzaWZpZXJcclxuXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMTUwXHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Db2xvciA9IHRoaXMuc2VsZWN0aW9uQ29sb3IgfHwgXCJyZWRcIlxyXG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG9wdHMudG9vbHRpcFxyXG4gICAgICAgIHRoaXMudGV4dHMgPSBvcHRzLnRleHRzXHJcblxyXG4gICAgICAgIHRoaXMubGVmdFRleHQgPSBvcHRzLmxlZnRUZXh0IHx8IFwiQ2F0ZWdvcnkgMFwiXHJcbiAgICAgICAgdGhpcy50b3BUZXh0ID0gb3B0cy50b3BUZXh0IHx8IFwiQ2F0ZWdvcnkgMVwiXHJcbiAgICAgICAgdGhpcy5yaWdodFRleHQgPSBvcHRzLnJpZ2h0VGV4dCB8fCBcIkNhdGVnb3J5IDJcIlxyXG5cclxuICAgICAgICB0aGlzLmNlbnRlckNvZWZmaWNpZW50ID0gb3B0cy5jZW50ZXJDb2VmZmljaWVudCB8fCB0aGlzLmNsYXNzaWZpZXIuY2VudGVyQ29lZmZpY2llbnRcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7e30gfSBvcHRzXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZShvcHRzKSB7XHJcblxyXG4gICAgICAgIC8vY2xlYXJcclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxyXG5cclxuICAgICAgICAvL3RpdGxlXHJcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxyXG5cclxuICAgICAgICBjb25zdCBzcXJ0M292ZXIyID0gMC44NjYwMjVcclxuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCwgaCA9IHcgKiBzcXJ0M292ZXIyXHJcbiAgICAgICAgY29uc3QgY2xhc3NpZmllciA9IHRoaXMuY2xhc3NpZmllclxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbG9yID0gdGhpcy5zZWxlY3Rpb25Db2xvclxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvblN0cm9rZVdpZHRoID0gMFxyXG4gICAgICAgIGNvbnN0IHR0ID0gdGhpcy50b29sdGlwXHJcbiAgICAgICAgY29uc3QgdGV4dHMgPSB0aGlzLnRleHRzIHx8IHt9XHJcblxyXG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSAyXHJcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSAxMlxyXG5cclxuICAgICAgICAvL21ha2Ugc3ZnIGVsZW1lbnRcclxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdlxyXG4gICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3ICsgc2VsZWN0aW9uU3Ryb2tlV2lkdGgpXHJcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoICsgNCAqIHBhZGRpbmcgKyAyICogZm9udFNpemUpXHJcblxyXG4gICAgICAgIC8vdG9wIGxhYmVsXHJcbiAgICAgICAgc3ZnLmFwcGVuZChcInRleHRcIikuYXR0cihcInhcIiwgdyAvIDIpLmF0dHIoXCJ5XCIsIHBhZGRpbmcgKyBmb250U2l6ZSkudGV4dCh0aGlzLnRvcFRleHQpLmF0dHIoXCJmb250LXNpemVcIiwgZm9udFNpemUpXHJcbiAgICAgICAgICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgXCJtaWRkbGVcIilcclxuICAgICAgICAvL2xlZnQgbGFiZWxcclxuICAgICAgICBzdmcuYXBwZW5kKFwidGV4dFwiKS5hdHRyKFwieFwiLCAwKS5hdHRyKFwieVwiLCAzICogcGFkZGluZyArIDIgKiBmb250U2l6ZSArIGgpLnRleHQodGhpcy5sZWZ0VGV4dCkuYXR0cihcImZvbnQtc2l6ZVwiLCBmb250U2l6ZSlcclxuICAgICAgICAgICAgLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCBcInN0YXJ0XCIpXHJcbiAgICAgICAgLy9yaWdodCBsYWJlbFxyXG4gICAgICAgIHN2Zy5hcHBlbmQoXCJ0ZXh0XCIpLmF0dHIoXCJ4XCIsIHcpLmF0dHIoXCJ5XCIsIDMgKiBwYWRkaW5nICsgMiAqIGZvbnRTaXplICsgaCkudGV4dCh0aGlzLnJpZ2h0VGV4dCkuYXR0cihcImZvbnQtc2l6ZVwiLCBmb250U2l6ZSlcclxuICAgICAgICAgICAgLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCBcImVuZFwiKVxyXG5cclxuXHJcblxyXG4gICAgICAgIC8vdHJpYW5nbGUgZ3JvdXBcclxuICAgICAgICBjb25zdCBnID0gc3ZnLmFwcGVuZChcImdcIikuYXR0cihcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZShcIiArIChzZWxlY3Rpb25TdHJva2VXaWR0aCAvIDIpICsgXCIgXCIgKyAoc2VsZWN0aW9uU3Ryb2tlV2lkdGggLyAyICsgKDIgKiBwYWRkaW5nICsgZm9udFNpemUpKSArIFwiKVwiKVxyXG5cclxuICAgICAgICAvL2NvbW1vbiBmdW5jdGlvbiBmb3IgdHJpYW5nbGUgcGF0Y2hlc1xyXG4gICAgICAgIGNvbnN0IHNldEF0dHJpYnV0ZXMgPSAoZWx0LCBjb2xvciwgdGV4dCkgPT4ge1xyXG4gICAgICAgICAgICAvL2VsdC5yYWlzZSgpO1xyXG4gICAgICAgICAgICBlbHQuYXR0cignZmlsbCcsIGNvbG9yKVxyXG4gICAgICAgICAgICAgICAgLy8uYXR0cihcInN0cm9rZVwiLCBjb2xvck92ZXIpXHJcbiAgICAgICAgICAgICAgICAvLy5hdHRyKFwic3Ryb2tlLXdpZHRoXCIsIDApXHJcbiAgICAgICAgICAgICAgICAvLy5hdHRyKFwic3Ryb2tlLWxpbmVqb2luXCIsIFwicm91bmRcIilcclxuICAgICAgICAgICAgICAgIC5vbihcIm1vdXNlb3ZlclwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpOyBzZWxlY3QodGhpcykuYXR0cihcInN0cm9rZS13aWR0aFwiLCBzZWxlY3Rpb25TdHJva2VXaWR0aCk7Ki9cclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3QodGhpcykuYXR0cignZmlsbCcsIHNlbGVjdGlvbkNvbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXR0IHx8ICF0ZXh0KSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgdHQuaHRtbCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICB0dC5zZXRQb3NpdGlvbihlKTtcclxuICAgICAgICAgICAgICAgICAgICB0dC5zaG93KClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAub24oXCJtb3VzZW91dFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLypzZWxlY3QodGhpcykuYXR0cihcInN0cm9rZS13aWR0aFwiLCAwKTsqL1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdCh0aGlzKS5hdHRyKCdmaWxsJywgY29sb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0dCkgdHQuaGlkZSgpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZiAodHQgJiYgdGV4dCkgZWx0Lm9uKFwibW91c2Vtb3ZlXCIsIGZ1bmN0aW9uIChlKSB7IHR0LnNldFBvc2l0aW9uKGUpIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2NvbnN0IFtjMCwgYzEsIGMyXSA9IGNsYXNzaWZpZXIuY2VudGVyXHJcblxyXG4gICAgICAgIC8vdHJhcGV6aXVtIHMwXHJcbiAgICAgICAgY29uc3QgdDAgPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCBcIjAsXCIgKyBoICsgXCIgXCIgKyB3IC8gMyArIFwiLFwiICsgaCArIFwiIFwiICsgdyAvIDIgKyBcIixcIiArIGggKiAyIC8gMyArIFwiIFwiICsgdyAvIDYgKyBcIixcIiArIGggKiAyIC8gMylcclxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQwLCBjbGFzc2lmaWVyLmNvbG9yc1swXSwgdGV4dHNbXCIwXCJdKVxyXG4gICAgICAgIC8vdHJhcGV6aXVtIHMxXHJcbiAgICAgICAgY29uc3QgdDEgPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCB3IC8gMiArIFwiLDAgXCIgKyB3ICogMiAvIDMgKyBcIixcIiArIGggLyAzICsgXCIgXCIgKyB3IC8gMiArIFwiLFwiICsgaCAqIDIgLyAzICsgXCIgXCIgKyB3IC8gMyArIFwiLFwiICsgaCAvIDMpXHJcbiAgICAgICAgc2V0QXR0cmlidXRlcyh0MSwgY2xhc3NpZmllci5jb2xvcnNbMV0sIHRleHRzW1wiMVwiXSlcclxuICAgICAgICAvL3RyYXBleml1bSBzMlxyXG4gICAgICAgIGNvbnN0IHQyID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxyXG4gICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqIDUgLyA2ICsgXCIsXCIgKyAyICogaCAvIDMgKyBcIiBcIiArIHcgLyAyICsgXCIsXCIgKyBoICogMiAvIDMgKyBcIiBcIiArIHcgKiAyIC8gMyArIFwiLFwiICsgaClcclxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQyLCBjbGFzc2lmaWVyLmNvbG9yc1syXSwgdGV4dHNbXCIyXCJdKVxyXG4gICAgICAgIC8vdHJpYW5nbGUgczBcclxuICAgICAgICBjb25zdCB0MF8gPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCB3IC8gMiArIFwiLFwiICsgaCAqIDIgLyAzICsgXCIgXCIgKyB3ICogNSAvIDYgKyBcIixcIiArIGggKiAyIC8gMyArIFwiIFwiICsgdyAqIDIgLyAzICsgXCIsXCIgKyBoIC8gMylcclxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQwXywgY2xhc3NpZmllci5taXhDb2xvcnNbMF0sIHRleHRzW1wibTEyXCJdKVxyXG4gICAgICAgIC8vdHJpYW5nbGUgczFcclxuICAgICAgICBjb25zdCB0MV8gPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCB3IC8gMiArIFwiLFwiICsgaCAqIDIgLyAzICsgXCIgXCIgKyB3IC8gMyArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqIDIgLyAzICsgXCIsXCIgKyBoKVxyXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDFfLCBjbGFzc2lmaWVyLm1peENvbG9yc1sxXSwgdGV4dHNbXCJtMDJcIl0pXHJcbiAgICAgICAgLy90cmlhbmdsZSBzMlxyXG4gICAgICAgIGNvbnN0IHQyXyA9IGcuYXBwZW5kKCdwb2x5Z29uJylcclxuICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgLyAyICsgXCIsXCIgKyBoICogMiAvIDMgKyBcIiBcIiArIHcgLyA2ICsgXCIsXCIgKyBoICogMiAvIDMgKyBcIiBcIiArIHcgLyAzICsgXCIsXCIgKyBoIC8gMylcclxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQyXywgY2xhc3NpZmllci5taXhDb2xvcnNbMl0sIHRleHRzW1wibTAxXCJdKVxyXG5cclxuICAgICAgICAvL2NlbnRlclxyXG4gICAgICAgIGlmICh0aGlzLmNlbnRlckNvZWZmaWNpZW50KSB7XHJcbiAgICAgICAgICAgIC8vVE9ETyBtYWtlIGl0IGFuIGhleGFnb24gIVxyXG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBnLmFwcGVuZCgnY2lyY2xlJylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHcgLyAyKS5hdHRyKCdjeScsIGggKiAyIC8gMylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgdGhpcy5jZW50ZXJDb2VmZmljaWVudCAqIGggLyAzKVxyXG4gICAgICAgICAgICBzZXRBdHRyaWJ1dGVzKGNlbnRlciwgY2xhc3NpZmllci5jZW50ZXJDb2xvciwgdGV4dHNbXCJjZW50ZXJcIl0pXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICBsZXQgbWlkZGxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBsZWZ0XywgYm90dG9tXywgcmlnaHRfXHJcbiAgICAgICAgaWYgKCF0aGlzLnJlYWwpIHtcclxuXHJcbiAgICAgICAgICAgIC8vMCBsZWZ0IHRyaWFuZ2xlXHJcbiAgICAgICAgICAgIGxlZnQgPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgXCIwLFwiICsgaCArIFwiIFwiICsgKHcgLyAzKSArIFwiLFwiICsgaCArIFwiIFwiICsgKHcgLyA2KSArIFwiLFwiICsgKDIgKiBoIC8gMykpXHJcbiAgICAgICAgICAgIC8vMSB0b3AgdHJpYW5nbGVcclxuICAgICAgICAgICAgdG9wID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMykgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3ICogMiAvIDMpICsgXCIsXCIgKyAoaCAvIDMpICsgXCIgXCIgKyAodyAvIDIpICsgXCIsMFwiKVxyXG4gICAgICAgICAgICAvLzIgcmlnaHQgdHJpYW5nbGVcclxuICAgICAgICAgICAgcmlnaHQgPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgKiAyIC8gMykgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKyBcIixcIiArIGggKyBcIiBcIiArICh3ICogNSAvIDYpICsgXCIsXCIgKyAoMiAqIGggLyAzKSlcclxuICAgICAgICAgICAgLy9taWRkbGUgdHJpYW5nbGVcclxuICAgICAgICAgICAgbWlkZGxlID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMikgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3IC8gNCkgKyBcIixcIiArIChoICogNSAvIDYpICsgXCIgXCIgKyAoMyAqIHcgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikpXHJcbiAgICAgICAgICAgIC8vMDEgbGVmdCB0cmFwZXppdW1cclxuICAgICAgICAgICAgbGVmdF8gPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyA2KSArIFwiLFwiICsgKGggKiAyIC8gMykgKyBcIiBcIiArICh3IC8gNCkgKyBcIixcIiArIChoICogNSAvIDYpICsgXCIgXCIgKyAodyAvIDIpICsgXCIsXCIgKyAoaCAvIDMpICsgXCIgXCIgKyAodyAvIDMpICsgXCIsXCIgKyAoaCAvIDMpKVxyXG4gICAgICAgICAgICAvLzAyIGJvdHRvbSB0cmFwZXppdW1cclxuICAgICAgICAgICAgYm90dG9tXyA9IGcuYXBwZW5kKCdwb2x5Z29uJylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDMpICsgXCIsXCIgKyAoaCkgKyBcIiBcIiArICgyICogdyAvIDMpICsgXCIsXCIgKyAoaCkgKyBcIiBcIiArICh3ICogMyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSArIFwiIFwiICsgKHcgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikpXHJcbiAgICAgICAgICAgIC8vMTIgcmlnaHQgdHJhcGV6aXVtXHJcbiAgICAgICAgICAgIHJpZ2h0XyA9IGcuYXBwZW5kKCdwb2x5Z29uJylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDIpICsgXCIsXCIgKyAoaCAvIDMpICsgXCIgXCIgKyAodyAqIDMgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikgKyBcIiBcIiArICh3ICogNSAvIDYpICsgXCIsXCIgKyAoaCAqIDIgLyAzKSArIFwiIFwiICsgKHcgKiAyIC8gMykgKyBcIixcIiArIChoIC8gMykpXHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAvL21pZGRsZSB0cmlhbmdsZVxyXG4gICAgICAgICAgICBtaWRkbGUgPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAyKSArIFwiLDAgMCxcIiArIGggKyBcIiBcIiArIHcgKyBcIixcIiArIGgpXHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgdHJhcGV6aXVtXHJcbiAgICAgICAgICAgIC8vZHJhdyBsYXJnZSB0cmFwZXppdW0gZmlyc3RcclxuICAgICAgICAgICAgZm9yIChsZXQgaV8gPSAyOyBpXyA+PSAwOyBpXy0tKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5jbGFzc2lmaWVyLmxvd0luZGV4W2lfXVxyXG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuY2xhc3NpZmllci5sb3dUaHJlc2hvbGRbaV1cclxuICAgICAgICAgICAgICAgIGlmIChpID09IDIpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8wMSBsZWZ0IHRyYXBleml1bVxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnRfID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyAvIDIgKyBcIiwwIDAsXCIgKyBoICsgXCIgXCIgKyB3ICogciArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxICsgcikgLyAyICsgXCIsXCIgKyByICogaClcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT0gMSlcclxuICAgICAgICAgICAgICAgICAgICAvLzAyIGJvdHRvbSB0cmFwZXppdW1cclxuICAgICAgICAgICAgICAgICAgICBib3R0b21fID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgXCIwLFwiICsgaCArIFwiIFwiICsgdyArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxIC0gciAvIDIpICsgXCIsXCIgKyBoICogKDEgLSByKSArIFwiIFwiICsgciAqIHcgLyAyICsgXCIsXCIgKyBoICogKDEgLSByKSlcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAvLzEyIHJpZ2h0IHRyYXBleml1bVxyXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0XyA9IGcuYXBwZW5kKCdwb2x5Z29uJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgKyBcIixcIiArIGggKyBcIiBcIiArIHcgLyAyICsgXCIsMCBcIiArIHcgKiAoMSAtIHIpIC8gMiArIFwiLFwiICsgaCAqIHIgKyBcIiBcIiArIHcgKiAoMSAtIHIpICsgXCIsXCIgKyBoKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgdHJpYW5nbGVzXHJcbiAgICAgICAgICAgIC8vZHJhdyBsYXJnZSB0cmlhbmdsZXMgZmlyc3RcclxuICAgICAgICAgICAgZm9yIChsZXQgaV8gPSAyOyBpXyA+PSAwOyBpXy0tKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5jbGFzc2lmaWVyLmhpZ2hJbmRleFtpX11cclxuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmNsYXNzaWZpZXIuaGlnaFRocmVzaG9sZFtpXVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpID09IDIpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8yIHJpZ2h0IHRyaWFuZ2xlXHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBnLmFwcGVuZCgncG9seWdvbicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCB3ICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICogciArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxICsgcikgLyAyICsgXCIsXCIgKyBoICogcilcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT0gMSlcclxuICAgICAgICAgICAgICAgICAgICAvLzEgdG9wIHRyaWFuZ2xlXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAyKSArIFwiLDAgXCIgKyB3ICogciAvIDIgKyBcIixcIiArIGggKiAoMSAtIHIpICsgXCIgXCIgKyB3ICogKDEgLSByIC8gMikgKyBcIixcIiArIGggKiAoMSAtIHIpKVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vMCBsZWZ0IHRyaWFuZ2xlXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGcuYXBwZW5kKCdwb2x5Z29uJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIFwiMCxcIiArIGggKyBcIiBcIiArIHcgKiAoMSAtIHIpICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICogKDEgLSByKSAvIDIgKyBcIixcIiArIGggKiByKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0qL1xyXG5cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcclxuXHJcbi8qKiBAdHlwZWRlZiB7XCJmbGFnXCJ8XCJwaWVjaGFydFwifFwicmluZ1wifFwic2VnbWVudFwifFwicmFkYXJcInxcImFnZXB5cmFtaWRcInxcImhhbGZ0b25lXCJ9IENvbXBvc2l0aW9uVHlwZSAqL1xyXG5cclxuLyoqXHJcbiAqIEEgc3R5bGUgc2hvd2luZyB0aGUgY29tcG9zaXRpb24gb2YgYSB0b3RhbCBpbiBkaWZmZXJlbnQgY2F0ZWdvcmllcywgd2l0aCBkaWZmZXJlbnQgY29sb3IgaHVlcy5cclxuICogSXQgY29uc2lzdHMgb2YgYSBzeW1ib2wgd2l0aCBkaWZmZXJlbnQgcGFydHMsIHdob3NlIHNpemUgcmVmbGVjdCB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBjYXRlZ29yeS5cclxuICogRm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgc3ltYm9scywgQHNlZSBDb21wb3NpdGlvblR5cGVcclxuICogVGhlIHN5bWJvbCBjYW4gYmUgc2NhbGVkIGRlcGVuZGluZyBvbiB0aGUgY2VsbCBpbXBvcnRhbmNlLlxyXG4gKlxyXG4gKiBAbW9kdWxlIHN0eWxlXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb21wb3NpdGlvblN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoc3RyaW5nIC0+IGNvbG9yKSB3aGljaCBnaXZlIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5LlxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3JcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHR5cGUgb2YgZGVjb21wb3NpdGlvbiBzeW1ib2wgb2YgYSBjZWxsLCBAc2VlIENvbXBvc2l0aW9uVHlwZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsIG51bWJlcixvYmplY3QpOkNvbXBvc2l0aW9uVHlwZX0gKi9cclxuICAgICAgICB0aGlzLnR5cGUgPSBvcHRzLnR5cGUgfHwgKCgpID0+IFwiZmxhZ1wiKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoYywgcikgPT4gcikgLy8oYyxyLHosdnMpID0+IHt9XHJcblxyXG4gICAgICAgIC8qKiBGb3Igc3R5bGUgdHlwZXMgd2l0aCBzdHJpcGVzIChmbGFnLCBzZWdtZW50KSwgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBzdHJpcGVzICgwIGZvciBob3Jpem9udGFsLCBvdGhlciBmb3IgdmVydGljYWwpLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc3RyaXBlc09yaWVudGF0aW9uID0gb3B0cy5zdHJpcGVzT3JpZW50YXRpb24gfHwgKCgpID0+IDApIC8vKGMscix6LHZzKSA9PiAuLi5cclxuXHJcbiAgICAgICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGFuIG9mZnNldCBhbmdsZSBmb3IgYSByYWRhciwgaGFsZnRvbmUgb3IgcGllIGNoYXJ0IHN0eWxlLlxyXG4gICAgICAgICAqIFRoZSBhbmdsZSBpcyBzcGVjaWZpZWQgaW4gZGVncmVlLiBUaGUgcm90YXRpb24gaXMgYW50aS1jbG9ja3dpc2UuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5vZmZzZXRBbmdsZSA9IG9wdHMub2Zmc2V0QW5nbGUgfHwgKCgpID0+IDApIC8vKGMscix6LHZzKSA9PiAuLi5cclxuXHJcbiAgICAgICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIHRoZSBoZWlnaHQgb2YgdGhlIGFnZSBweXJhbWlkLCBpbiBnZW8gdW5pdC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmFnZVB5cmFtaWRIZWlnaHQgPSBvcHRzLmFnZVB5cmFtaWRIZWlnaHQgfHwgKChjLCByKSA9PiByKSAvLyhjLHIseix2cykgPT4gLi4uXHJcblxyXG4gICAgICAgIC8qKiBGb3IgcGllIGNoYXJ0LCB0aGlzIGlzIHBhcmFtZXRlciBmb3IgaW50ZXJuYWwgcmFkaXVzLCBzbyB0aGF0IHRoZSBwaWUgY2hhcnQgbG9va3MgbGlrZSBhIGRvbnV0LlxyXG4gICAgICAgICAqIDAgZm9yIG5vcm1hbCBwaWUgY2hhcnRzLCAwLjUgdG8gZW1wdHkgaGFsZiBvZiB0aGUgcmFkaXVzLlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yID0gb3B0cy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yIHx8IDBcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcyBkZXBlbmRpbmcgb24gdGhlaXIgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxyXG5cclxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXHJcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLy9uYiBjYXRlZ29yaWVzIC0gdXNlZCBmb3IgcmFkYXIgYW5kIGFnZXB5cmFtaWRcclxuICAgICAgICBjb25zdCBuYkNhdCA9IE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpLmxlbmd0aFxyXG5cclxuICAgICAgICAvL2RyYXcgY2FsbHNcclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XHJcblxyXG4gICAgICAgICAgICAvL3NpemVcclxuICAgICAgICAgICAgY29uc3Qgc0cgPSB0aGlzLnNpemUgPyB0aGlzLnNpemUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHJlc29sdXRpb25cclxuICAgICAgICAgICAgaWYgKCFzRykgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxyXG5cclxuICAgICAgICAgICAgLy9nZXQgc3ltYm9sIHR5cGVcclxuICAgICAgICAgICAgY29uc3QgdHlwZV8gPSB0aGlzLnR5cGUgPyB0aGlzLnR5cGUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdmbGFnJ1xyXG5cclxuICAgICAgICAgICAgLy9jb21wdXRlIGNlbnRlciBwb3NpdGlvblxyXG4gICAgICAgICAgICBjb25zdCB4YyA9IGNlbGwueCArIG9mZnNldC5keCArICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnID8gMCA6IHJlc29sdXRpb24gKiAwLjUpXHJcbiAgICAgICAgICAgIGNvbnN0IHljID0gY2VsbC55ICsgb2Zmc2V0LmR5ICsgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgPyAwIDogcmVzb2x1dGlvbiAqIDAuNSlcclxuXHJcbiAgICAgICAgICAgIC8vY29tcHV0ZSBvZmZzZXQgYW5nbGUsIHdoZW4gcmVsZXZhbnRcclxuICAgICAgICAgICAgY29uc3Qgb2ZmQW5nID0gdGhpcy5vZmZzZXRBbmdsZSA/ICh0aGlzLm9mZnNldEFuZ2xlKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgKiBNYXRoLlBJKSAvIDE4MCA6IDBcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnIHx8IHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnKSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBjZWxsIGNhdGVnb3J5IG1heCB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgbGV0IG1heFZhbCA9IC1JbmZpbml0eVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuY29sb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9ICtjZWxsW2tleV1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodiA+IG1heFZhbCkgbWF4VmFsID0gdlxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vY3VtdWxcclxuICAgICAgICAgICAgICAgIGxldCBjdW11bCA9IDBcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnICYmIHRoaXMuYWdlUHlyYW1pZEhlaWdodClcclxuICAgICAgICAgICAgICAgICAgICBjdW11bCA9IChyZXNvbHV0aW9uIC0gdGhpcy5hZ2VQeXJhbWlkSGVpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkpIC8gMlxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnKSBjdW11bCA9IE1hdGguUEkgLyAyICsgb2ZmQW5nXHJcblxyXG4gICAgICAgICAgICAgICAgLy9jb21wdXRlIHRoZSBpbmNyZW1lbnQsIHdoaWNoIGlzIHRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgdGhlIGN1bXVsIGZvciBlYWNoIGNhdGVnb3J5XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmNyID1cclxuICAgICAgICAgICAgICAgICAgICB0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKHRoaXMuYWdlUHlyYW1pZEhlaWdodCA/IHRoaXMuYWdlUHlyYW1pZEhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogcmVzb2x1dGlvbikgLyBuYkNhdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgyICogTWF0aC5QSSkgLyBuYkNhdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgIGlmIChpbmNyID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgdHlwZTonICsgdHlwZV8pXHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY2F0ZWdvcnkgY29sb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xvclxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgY2F0ZWdvcnkgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY2VsbFtjb2x1bW5dXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgY2F0ZWdvcnkgbGVuZ3RoIC0gaW4gZ2VvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3RyA9IChzRyAqIHZhbCkgLyBtYXhWYWxcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBiYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsUmVjdCh4YyArIChyZXNvbHV0aW9uIC0gd0cpIC8gMiwgeWMgKyBjdW11bCwgd0csIGluY3IpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25leHQgaGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsICs9IGluY3JcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAncmFkYXInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNhdGVnb3J5IGNvbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sb3JcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNhdGVncm95IHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGNhdGVnb3J5IHJhZGl1cyAtIGluIGdlb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zdCByRyA9IHRoaXMucmFkaXVzKHZhbCwgciwgc3RhdCwgY2VsbFN0YXQsIHopXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJHID0gKHNHIC8gMikgKiBNYXRoLnNxcnQodmFsIC8gbWF4VmFsKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGFuZ3VsYXIgc2VjdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oeGMsIHljKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyh4YywgeWMsIHJHLCBjdW11bCAtIGluY3IsIGN1bXVsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyh4YywgeWMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25leHQgYW5ndWxhciBzZWN0b3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gaW5jclxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdoYWxmdG9uZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY2F0ZWdvcnkgY29sb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xvclxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgY2F0ZWdyb3kgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY2VsbFtjb2x1bW5dXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgY2F0ZWdvcnkgcmFkaXVzIC0gaW4gZ2VvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByRyA9IHNHICogMC4zMzMgKiBNYXRoLnNxcnQodmFsIC8gbWF4VmFsKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMgKyByZXNvbHV0aW9uICogMC4yNSAqIE1hdGguY29zKGN1bXVsKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljICsgcmVzb2x1dGlvbiAqIDAuMjUgKiBNYXRoLnNpbihjdW11bCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByRyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogTWF0aC5QSVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25leHQgYW5ndWxhciBzZWN0b3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gaW5jclxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgdHlwZTonICsgdHlwZV8pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9jb21wdXRlIHRvdGFsXHJcbiAgICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2x1bW4gb2YgT2JqZWN0LmtleXModGhpcy5jb2xvcikpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gK2NlbGxbY29sdW1uXVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdikgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB2XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRvdGFsIHx8IGlzTmFOKHRvdGFsKSkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgZGVjb21wb3NpdGlvbiBzeW1ib2xcclxuICAgICAgICAgICAgICAgIGxldCBjdW11bCA9IDBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSByZXNvbHV0aW9uICogKDEgLSBzRyAvIHJlc29sdXRpb24pICogMC41XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcmkgPSB0aGlzLnN0cmlwZXNPcmllbnRhdGlvbihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9nZXQgc2hhcmVcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZSA9IGNlbGxbY29sdW1uXSAvIHRvdGFsXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGFyZSB8fCBpc05hTihzaGFyZSkpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xvclxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL2RyYXcgc3ltYm9sIHBhcnRcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZV8gPT09ICdmbGFnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgZmxhZyBzdHJpcGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaSA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hvcml6b250YWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgZCArIG9mZnNldC5keCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyBkICsgY3VtdWwgKiBzRyArIG9mZnNldC5keSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHNHXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ZlcnRpY2FsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxSZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGQgKyBjdW11bCAqIHNHICsgb2Zmc2V0LmR4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueSArIGQgKyBvZmZzZXQuZHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiBzRyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzR1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3BpZWNoYXJ0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgcGllIGNoYXJ0IGFuZ3VsYXIgc2VjdG9yXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgYW5nbGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGExID0gY3VtdWwgKiAyICogTWF0aC5QSVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhMiA9IChjdW11bCArIHNoYXJlKSAqIDIgKiBNYXRoLlBJXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXdcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4YywgeWMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKHhjLCB5Yywgc0cgKiAwLjUsIGExICsgb2ZmQW5nLCBhMiArIG9mZkFuZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGllQ2hhcnRJbnRlcm5hbFJhZGl1c0ZhY3RvcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHICogMC41ICogdGhpcy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGExICsgb2ZmQW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEyICsgb2ZmQW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgcmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKHhjLCB5YywgTWF0aC5zcXJ0KDEgLSBjdW11bCkgKiBzRyAqIDAuNSwgMCwgMiAqIE1hdGguUEkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3NlZ21lbnQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHNlY3Rpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gKHNHICogc0cpIC8gcmVzb2x1dGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaG9yaXpvbnRhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsUmVjdChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnggKyBvZmZzZXQuZHgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgKHJlc29sdXRpb24gLSB3RykgLyAyICsgY3VtdWwgKiB3RyArIG9mZnNldC5keSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlICogd0dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmVydGljYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgY3VtdWwgKiByZXNvbHV0aW9uICsgb2Zmc2V0LmR4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueSArIChyZXNvbHV0aW9uIC0gd0cpIC8gMiArIG9mZnNldC5keSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHJlc29sdXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgdHlwZTonICsgdHlwZV8pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBzaGFyZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcbmltcG9ydCB7IHJhbmRvbU5vcm1hbCB9IGZyb20gJ2QzLXJhbmRvbSdcclxuaW1wb3J0IHsgY2hlY2tXZWJHTFN1cHBvcnQsIG1ha2VXZWJHTENhbnZhcyB9IGZyb20gJy4uL3V0aWxzL3dlYkdMVXRpbHMuanMnXHJcbmltcG9ydCB7IFdlYkdMU3F1YXJlQ29sb3JpbmcgfSBmcm9tICcuLi91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nLmpzJ1xyXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBtb2R1bGUgc3R5bGVcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERvdERlbnNpdHlTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBudW1iZXIgb2YgZG90cyBmb3IgYSBjZWxsIHZhbHVlLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmRvdE51bWJlciA9IG9wdHMuZG90TnVtYmVyIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbiAvIDEwMCkvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBjb2xvciBvZiB0aGUgZG90cy4gU2FtZSBjb2xvciBmb3IgYWxsIGRvdHMgd2l0aGluIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRkY1NzMzJykgLy8oYyxyLHosdnMpID0+IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgZG90cywgaW4gZ2VvIHVuaXQuIFNhbWUgc2l6ZSBmb3IgYWxsIGNlbGxzLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsIG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmRvdFNpemUgPSBvcHRzLmRvdFNpemUgfHwgKChyZXNvbHV0aW9uLCB6KSA9PiAxLjUgKiB6KSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaWdtYSBvZiB0aGUgZG90cyBkaXN0cmlidXRpb24uIFNhbWUgdmFsdWUgZm9yIGFsbCBjZWxscy5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLCBudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaWdtYSA9IG9wdHMuc2lnbWEgfHwgKChyZXNvbHV0aW9uLCB6KSA9PiByZXNvbHV0aW9uIC8gMikvLyhjLHIseix2cykgPT4ge31cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvL2dldCBzaXplXHJcbiAgICAgICAgY29uc3Qgc0dlbyA9IHRoaXMuZG90U2l6ZSA/IHRoaXMuZG90U2l6ZShyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogelxyXG5cclxuICAgICAgICAvL21ha2UgcmFuZG9tIGZ1bmN0aW9uXHJcbiAgICAgICAgY29uc3Qgc2lnID0gdGhpcy5zaWdtYSA/IHRoaXMuc2lnbWEocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHJlc29sdXRpb24gKiAwLjRcclxuICAgICAgICBjb25zdCByYW5kID0gcmFuZG9tTm9ybWFsKDAsIHNpZylcclxuXHJcbiAgICAgICAgaWYgKGNoZWNrV2ViR0xTdXBwb3J0KCkpIHtcclxuICAgICAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxyXG4gICAgICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhnZW9DYW52YXMudyArICcnLCBnZW9DYW52YXMuaCArICcnKVxyXG4gICAgICAgICAgICBpZiAoIWN2V0dMKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyB3ZWJHTCcpXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9jcmVhdGUgd2ViR0wgcHJvZ3JhbVxyXG4gICAgICAgICAgICBjb25zdCBwcm9nID0gbmV3IFdlYkdMU3F1YXJlQ29sb3JpbmcoY3ZXR0wuZ2wsIHNHZW8gLyB6KVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uIC8gMlxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgLy9udW1iZXIgb2YgZG90c1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZG90TnVtYmVyID0gdGhpcy5kb3ROdW1iZXIoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcclxuXHJcbiAgICAgICAgICAgICAgICAvL2NlbGwgY2VudGVyXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIG9mZnNldC5keCArIHIyXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIG9mZnNldC5keSArIHIyXHJcblxyXG4gICAgICAgICAgICAgICAgLy9jb252ZXJ0IGNvbG9yXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYyA9IGNvbG9yKGNvbClcclxuICAgICAgICAgICAgICAgIGlmICghY2MpIHJldHVyblxyXG5cclxuICAgICAgICAgICAgICAgIC8vcmFuZG9tIHBvaW50c1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gZG90TnVtYmVyOyBpKyspXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZy5hZGRQb2ludERhdGEyKGN4ICsgcmFuZCgpLCBjeSArIHJhbmQoKSwgY2MuciwgY2MuZywgY2MuYiwgY2Mub3BhY2l0eSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3XHJcbiAgICAgICAgICAgIHByb2cuZHJhdyhnZW9DYW52YXMuZ2V0V2ViR0xUcmFuc2Zvcm0oKSlcclxuXHJcbiAgICAgICAgICAgIC8vZHJhdyBpbiBjYW52YXMgZ2VvXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5kcmF3SW1hZ2UoY3ZXR0wuY2FudmFzLCAwLCAwKVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xcclxuXHJcbiAgICAgICAgICAgICAgICAvL251bWJlciBvZiBkb3RzXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkb3ROdW1iZXIgPSB0aGlzLmRvdE51bWJlcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXHJcblxyXG4gICAgICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZHJhdyByYW5kb20gZG90c1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC8gMixcclxuICAgICAgICAgICAgICAgICAgICBjeSA9IGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLyAyXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBkb3ROdW1iZXI7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFJlY3QoY3ggKyByYW5kKCksIGN5ICsgcmFuZCgpLCBzR2VvLCBzR2VvKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQG1vZHVsZSBzdHlsZVxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgSW1hZ2VTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuXHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgaW1hZ2UgVVJMIG9mIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5pbWFnZSA9IG9wdHMuaW1hZ2UgfHwgKCgpID0+ICcnKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBpbWFnZSBzaXplIGluIGdyb3VuZCBtZXRlcnNcclxuICAgICAgICAgKiAgQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKVxyXG5cclxuICAgICAgICAvKiogRGljdGlvbm5hcnkgb2YgcHJlbG9hZGVkIGltYWdlcy4gdXJsIC0+IGltYWdlXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xyXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7fVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXHJcbiAgICAgKiBAb3ZlcnJpZGVcclxuICAgICAqL1xyXG4gICAgYXN5bmMgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnosXHJcbiAgICAgICAgICAgIHJlc29sdXRpb25QaXggPSByZXNvbHV0aW9uIC8gelxyXG5cclxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXHJcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLy9kcmF3IGluIHNjcmVlbiBjb29yZGluYXRlc1xyXG4gICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XHJcblxyXG4gICAgICAgICAgICAvL2dldCBjZWxsIGltYWdlIHVybFxyXG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmltYWdlKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcclxuICAgICAgICAgICAgaWYgKCF1cmwpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3NpemUgYW5kIHBvc2l0aW9uIHZhbHVlc1xyXG4gICAgICAgICAgICBsZXQgc2l6ZVBpeCA9IHRoaXMuc2l6ZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIC8gelxyXG4gICAgICAgICAgICBpZiAoIXNpemVQaXgpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL2dldCBpbWFnZSBmcm9tIGNhY2hlXHJcbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5jYWNoZVt1cmxdXHJcblxyXG4gICAgICAgICAgICAvL2xvYWRpbmcsIGtlZXAgd2FpdGluZ1xyXG4gICAgICAgICAgICBpZiAoaW1hZ2UgPT0gXCJsb2FkaW5nXCIpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIC8vbm8gaW1hZ2U6IGxvYWQgaXRcclxuICAgICAgICAgICAgZWxzZSBpZiAoIWltYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAvL3RhZyBhcyBsb2FkaW5nXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3VybF0gPSBcImxvYWRpbmdcIlxyXG5cclxuICAgICAgICAgICAgICAgIC8vZGVmaW5lIGltYWdlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKVxyXG4gICAgICAgICAgICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvL3N0b3JlIGltYWdlIGRhdGEgaW4gY2FjaGUgYW5kIHJlZHJhd1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbdXJsXSA9IGltZ1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgcmV0cmlldmUgaW1hZ2UgZnJvbVwiLCB1cmwpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL3NldCBVUkwgdG8gbGF1bmNoIHRoZSBkb3dubG9hZFxyXG4gICAgICAgICAgICAgICAgaW1nLnNyYyA9IHVybFxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBpbWFnZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IChyZXNvbHV0aW9uUGl4IC0gc2l6ZVBpeCkgLyAyXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKGltYWdlLCBnZW9DYW52YXMuZ2VvVG9QaXhYKGNlbGwueCkgKyBkLCBnZW9DYW52YXMuZ2VvVG9QaXhZKGNlbGwueSkgKyBkIC0gcmVzb2x1dGlvblBpeCwgc2l6ZVBpeCwgc2l6ZVBpeClcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcbmltcG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vU2lkZVN0eWxlLmpzJ1xyXG5cclxuLyoqIEB0eXBlZGVmIHt7eDpudW1iZXIseTpudW1iZXIsb3I6XCJ2XCJ8XCJoXCIsYzE6aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsfHVuZGVmaW5lZCxjMjppbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGx8dW5kZWZpbmVkfX0gU2lkZSAqL1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGUgc3R5bGVcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIElzb0ZlbmNlU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoc3RyaW5nIC0+IGNvbG9yKSB3aGljaCBnaXZlIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5LlxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3JcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBoZWlnaHQgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8ICgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA9PiByZXNvbHV0aW9uICogMC40KVxyXG5cclxuICAgICAgICAvKiogVGhlIHBlcnNwZWN0aXZlIGFuZ2xlLCBpbiBkZWdyZWUsIHdpdGhpbiBbLTE4MCwxODBdLCBmcm9tIFtPLHhdIGF4aXMuXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmFuZ2xlID0gb3B0cy5hbmdsZSAhPSB1bmRlZmluZWQgPyBvcHRzLmFuZ2xlIDogNTBcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb3JuZXIgbGluZSBzdHJva2Ugc3R5bGUuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCxudW1iZXIsbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29ybmVyTGluZVN0cm9rZUNvbG9yID0gb3B0cy5jb3JuZXJMaW5lU3Ryb2tlQ29sb3IgfHwgKChjLCByLCB6LCBhbmdsZSkgPT4gXCIjOTk5XCIpXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29ybmVyIGxpbmUgd2lkdGguXHJcbiAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5jb3JuZXJMaW5lV2lkdGggPSBvcHRzLmNvcm5lckxpbmVXaWR0aCB8fCAoKGMsIHIsIHosIGFuZ2xlKSA9PiAoYW5nbGUgJSA5MCA9PSAwID8gMCA6IDAuOCAqIHopKVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAqIFNob3cgdmVydGljYWwgY3Jvc3Mtc2VjdGlvbnMuXHJcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLnNWZXJ0ID0gb3B0cy5zVmVydCAhPSB1bmRlZmluZWQgPyBvcHRzLnNWZXJ0IDogdHJ1ZVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAqIFNob3cgaG9yaXpvbnRhbCBjcm9zcy1zZWN0aW9ucy5cclxuICAgICAgICAqIEB0eXBlIHtib29sZWFufSAqL1xyXG4gICAgICAgIHRoaXMuc0hvciA9IG9wdHMuc0hvciAhPSB1bmRlZmluZWQgPyBvcHRzLnNIb3IgOiB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICogQG92ZXJyaWRlXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xyXG5cclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcclxuXHJcbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxyXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8vbmIgY2F0ZWdvcmllcyAtIHVzZWQgZm9yIHJhZGFyIGFuZCBhZ2VweXJhbWlkXHJcbiAgICAgICAgY29uc3QgY2F0cyA9IE9iamVjdC5rZXlzKHRoaXMuY29sb3IpXHJcblxyXG4gICAgICAgIC8vaGFsZiByZXNvbHV0aW9uXHJcbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uIC8gMlxyXG5cclxuICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQodW5kZWZpbmVkLCByZXNvbHV0aW9uLCB6KSwgZHggPSBvZmZzZXQuZHgsIGR5ID0gb2Zmc2V0LmR5XHJcblxyXG4gICAgICAgIC8vbWFrZSBzaWRlc1xyXG4gICAgICAgIC8qKiAgQHR5cGUge0FycmF5LjxTaWRlPn0gKi9cclxuICAgICAgICBjb25zdCBzaWRlcyA9IFNpZGVTdHlsZS5idWlsZFNpZGVzKGNlbGxzLCByZXNvbHV0aW9uLCB0aGlzLmFuZ2xlICUgMTgwICE9IDkwICYmIHRoaXMuc1ZlcnQsIHRoaXMuYW5nbGUgJSAxODAgIT0gMCAmJiB0aGlzLnNIb3IpXHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgaWYgKHNpZGVzLmxlbmd0aCA9PSAwKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9hbmdsZSBpbiByYWRpYW5zXHJcbiAgICAgICAgY29uc3QgYVJhZCA9IHRoaXMuYW5nbGUgKiBNYXRoLlBJIC8gMTgwLCBjb3MgPSBNYXRoLmNvcyhhUmFkKSwgc2luID0gTWF0aC5zaW4oYVJhZClcclxuXHJcbiAgICAgICAgLy9zb3J0IHNpZGVzIHNvIHRoYXQgdGhlIGJhY2sgb25lcyBhcmUgZHJhd24gZmlyc3QuIFRoaXMgZGVwZW5kcyBvbiB0aGUgYW5nbGUuXHJcbiAgICAgICAgLy9kZXBlbmRpbmcgb24gZGlzdGFuY2UgdG8gdGhlIHJlZmVyZW5jZSBjb3JuZXIgcG9pbnRcclxuICAgICAgICBjb25zdCB4Q29ybmVyID0gTWF0aC5hYnModGhpcy5hbmdsZSkgPCA5MCA/IGdlb0NhbnZhcy5leHRHZW8ueE1pbiA6IGdlb0NhbnZhcy5leHRHZW8ueE1heFxyXG4gICAgICAgIGNvbnN0IHlDb3JuZXIgPSB0aGlzLmFuZ2xlIDwgMCA/IGdlb0NhbnZhcy5leHRHZW8ueU1heCA6IGdlb0NhbnZhcy5leHRHZW8ueU1pblxyXG4gICAgICAgIHNpZGVzLnNvcnQoKHMxLCBzMikgPT4gKE1hdGguaHlwb3QoczIueCAtIHhDb3JuZXIsIHMyLnkgLSB5Q29ybmVyKSAtIE1hdGguaHlwb3QoczEueCAtIHhDb3JuZXIsIHMxLnkgLSB5Q29ybmVyKSkpXHJcblxyXG4gICAgICAgIC8vcHJlcGFyZSBmdW5jdGlvbiB0byBkcmF3IGNvcm5lciBsaW5lIGZvciBhIGNlbGwgKmMqXHJcbiAgICAgICAgY29uc3QgZHJhd0Nvcm5lckxpbmUgPSAoY2VsbCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKCFjZWxsKSByZXR1cm5cclxuICAgICAgICAgICAgLy9saW5lIHN0eWxlXHJcbiAgICAgICAgICAgIGNvbnN0IGx3ID0gdGhpcy5jb3JuZXJMaW5lV2lkdGggPyB0aGlzLmNvcm5lckxpbmVXaWR0aChjZWxsLCByZXNvbHV0aW9uLCB6LCB0aGlzLmFuZ2xlKSA6IDAuOCAqIHpcclxuICAgICAgICAgICAgaWYgKGx3ID09IDApIHJldHVyblxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb3JuZXJMaW5lU3Ryb2tlQ29sb3IgPyB0aGlzLmNvcm5lckxpbmVTdHJva2VDb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB0aGlzLmFuZ2xlKSA6IFwiIzMzM1wiXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gbHdcclxuXHJcbiAgICAgICAgICAgIC8vaGVpZ2h0IC0gaW4gZ2VvXHJcbiAgICAgICAgICAgIGNvbnN0IGhHID0gdGhpcy5oZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGxpbmVcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjZWxsLnggKyByMiArIGR4LCBjZWxsLnkgKyByMiArIGR5KVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjZWxsLnggKyByMiArIGhHICogY29zICsgZHgsIGNlbGwueSArIHIyICsgaEcgKiBzaW4gKyBkeSlcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9kcmF3IHNpZGVzXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lQ2FwID0gXCJyb3VuZFwiO1xyXG4gICAgICAgIGZvciAobGV0IHNpZGUgb2Ygc2lkZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgYzEgPSBzaWRlLmMxLCBjMiA9IHNpZGUuYzIsIHggPSBzaWRlLngsIHkgPSBzaWRlLnlcclxuXHJcbiAgICAgICAgICAgIC8vaGVpZ2h0cyAtIGluIGdlb1xyXG4gICAgICAgICAgICBjb25zdCBoRzEgPSBjMSA/IHRoaXMuaGVpZ2h0KGMxLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogMCxcclxuICAgICAgICAgICAgICAgIGhHMiA9IGMyID8gdGhpcy5oZWlnaHQoYzIsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAwXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgdG90YWxzIGZvciBib3RoIGNlbGxzXHJcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsMSA9IGNvbXB1dGVUb3RhbChjMSwgY2F0cyksXHJcbiAgICAgICAgICAgICAgICB0b3RhbDIgPSBjb21wdXRlVG90YWwoYzIsIGNhdHMpXHJcbiAgICAgICAgICAgIGlmICh0b3RhbDEgPT0gMCAmJiB0b3RhbDIgPT0gMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIGxldCBjdW11bDEgPSAwLCBjdW11bDIgPSAwXHJcbiAgICAgICAgICAgIGZvciAobGV0IFtjb2x1bW4sIGNvbG9yXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKSkge1xyXG4gICAgICAgICAgICAgICAgLy9kcmF3IHN0cmlwZSBvZiBzaWRlIHMgYW5kIGNhdGVnb3J5IGNvbHVtblxyXG5cclxuICAgICAgICAgICAgICAgIC8vZ2V0IHZhbHVlcyBmb3IgYm90aCBjZWxsc1xyXG4gICAgICAgICAgICAgICAgbGV0IHYxID0gYzEgPyArYzFbY29sdW1uXSA6IDBcclxuICAgICAgICAgICAgICAgIGxldCB2MiA9IGMyID8gK2MyW2NvbHVtbl0gOiAwXHJcbiAgICAgICAgICAgICAgICBpZiAodjEgPT0gMCAmJiB2MiA9PSAwKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBoZWlnaHRzXHJcbiAgICAgICAgICAgICAgICBjb25zdCBoMSA9IGhHMSAqIGN1bXVsMSAvIHRvdGFsMSB8fCAwXHJcbiAgICAgICAgICAgICAgICBjb25zdCBoMW4gPSBoRzEgKiAoY3VtdWwxICsgdjEpIC8gdG90YWwxIHx8IDBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGgyID0gaEcyICogY3VtdWwyIC8gdG90YWwyIHx8IDBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGgybiA9IGhHMiAqIChjdW11bDIgKyB2MikgLyB0b3RhbDIgfHwgMFxyXG5cclxuICAgICAgICAgICAgICAgIC8vbWFrZSBwYXRoXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBpZiAoc2lkZS5vciA9PSBcImhcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vaG9yaXpvbnRhbCBzaWRlIC0gdmVydGljYWwgc2VjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIC8vYm90dG9tIGxlZnRcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4ICsgaDEgKiBjb3MgKyBkeCwgeSAtIHIyICsgaDEgKiBzaW4gKyBkeSlcclxuICAgICAgICAgICAgICAgICAgICAvL3RvcCBsZWZ0XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIGgyICogY29zICsgZHgsIHkgKyByMiArIGgyICogc2luICsgZHkpXHJcbiAgICAgICAgICAgICAgICAgICAgLy90b3AgcmlnaHRcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyh4ICsgaDJuICogY29zICsgZHgsIHkgKyByMiArIGgybiAqIHNpbiArIGR5KVxyXG4gICAgICAgICAgICAgICAgICAgIC8vYm90dG9tIHJpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIGgxbiAqIGNvcyArIGR4LCB5IC0gcjIgKyBoMW4gKiBzaW4gKyBkeSlcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy92ZXJ0aWNhbCBzaWRlIC0gaG9yaXpvbnRhbCBzZWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gbGVmdFxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHggLSByMiArIGgxICogY29zICsgZHgsIHkgKyBoMSAqIHNpbiArIGR5KVxyXG4gICAgICAgICAgICAgICAgICAgIC8vYm90dG9tIHJpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIHIyICsgaDIgKiBjb3MgKyBkeCwgeSArIGgyICogc2luICsgZHkpXHJcbiAgICAgICAgICAgICAgICAgICAgLy90b3AgcmlnaHRcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyh4ICsgcjIgKyBoMm4gKiBjb3MgKyBkeCwgeSArIGgybiAqIHNpbiArIGR5KVxyXG4gICAgICAgICAgICAgICAgICAgIC8vdG9wIGxlZnRcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyh4IC0gcjIgKyBoMW4gKiBjb3MgKyBkeCwgeSArIGgxbiAqIHNpbiArIGR5KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9jZy5jdHguY2xvc2VQYXRoKClcclxuXHJcbiAgICAgICAgICAgICAgICAvL2ZpbGxcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sb3JcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcblxyXG4gICAgICAgICAgICAgICAgY3VtdWwxICs9IHYxXHJcbiAgICAgICAgICAgICAgICBjdW11bDIgKz0gdjJcclxuXHJcbiAgICAgICAgICAgICAgICAvL1RPRE8gZHJhdyBvbmx5IG9uZSBsaW5lXHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgY29ybmVyIGxpbmVcclxuICAgICAgICAgICAgICAgIC8vaWYgKHNpZGUub3IgPT0gXCJoXCIpIHtcclxuICAgICAgICAgICAgICAgIGRyYXdDb3JuZXJMaW5lKGMxKVxyXG4gICAgICAgICAgICAgICAgZHJhd0Nvcm5lckxpbmUoYzIpXHJcbiAgICAgICAgICAgICAgICAvL2lmICh0aGlzLmFuZ2xlID4gMCAmJiBzaWRlLm9yID09IFwiaFwiKSBkcmF3Q29ybmVyTGluZShjMilcclxuICAgICAgICAgICAgICAgIC8vZWxzZSBkcmF3Q29ybmVyTGluZShjMilcclxuICAgICAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuY29uc3QgY29tcHV0ZVRvdGFsID0gKGNlbGwsIGNhdGVnb3JpZXMpID0+IHtcclxuICAgIGlmICghY2VsbCkgcmV0dXJuIDBcclxuICAgIGxldCB0b3RhbCA9IDBcclxuICAgIGZvciAobGV0IGNvbHVtbiBvZiBjYXRlZ29yaWVzKSB7XHJcbiAgICAgICAgY29uc3QgdiA9IGNlbGxbY29sdW1uXVxyXG4gICAgICAgIGlmICghdikgY29udGludWVcclxuICAgICAgICB0b3RhbCArPSArdlxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvdGFsIHx8IDBcclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcclxuXHJcbi8qKlxyXG4gKiBAbW9kdWxlIHN0eWxlXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBKb3lQbG90U3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgaGVpZ2h0IG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAoKGMsIHIpID0+IHIgKiBNYXRoLnJhbmRvbSgpKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMubGluZUNvbG9yID0gb3B0cy5saW5lQ29sb3IgfHwgKCh5LCB5cywgciwgeikgPT4gJyNCQkInKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIse21pbjpudW1iZXIsIG1heDpudW1iZXJ9LG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgoeSwgeXMsIHIsIHopID0+IHopXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gb3B0cy5maWxsQ29sb3IgfHwgKCh5LCB5cywgciwgeikgPT4gJyNjMDhjNTk2OCcpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cclxuICAgICAqIEBvdmVycmlkZVxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvL2luZGV4IGNlbGxzIGJ5IHkgYW5kIHhcclxuICAgICAgICAvKiogIEB0eXBlIHtvYmplY3R9ICovXHJcbiAgICAgICAgY29uc3QgaW5kID0ge31cclxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgbGV0IHJvdyA9IGluZFtjZWxsLnldXHJcbiAgICAgICAgICAgIGlmICghcm93KSB7XHJcbiAgICAgICAgICAgICAgICByb3cgPSB7fVxyXG4gICAgICAgICAgICAgICAgaW5kW2NlbGwueV0gPSByb3dcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByb3dbY2VsbC54XSA9IHRoaXMuaGVpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBleHRlbnRcclxuICAgICAgICBjb25zdCBlID0gZ2VvQ2FudmFzLmV4dEdlb1xyXG4gICAgICAgIGlmICghZSkgcmV0dXJuXHJcbiAgICAgICAgY29uc3QgeE1pbiA9IE1hdGguZmxvb3IoZS54TWluIC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXHJcbiAgICAgICAgY29uc3QgeE1heCA9IE1hdGguZmxvb3IoZS54TWF4IC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXHJcbiAgICAgICAgY29uc3QgeU1pbiA9IE1hdGguZmxvb3IoZS55TWluIC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXHJcbiAgICAgICAgY29uc3QgeU1heCA9IE1hdGguZmxvb3IoZS55TWF4IC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXHJcblxyXG4gICAgICAgIC8qKiAgQHR5cGUge3ttaW46bnVtYmVyLCBtYXg6bnVtYmVyfX0gKi9cclxuICAgICAgICBjb25zdCB5cyA9IHsgbWluOiB5TWluLCBtYXg6IHlNYXggfVxyXG5cclxuICAgICAgICAvL2RyYXcgbGluZXMsIHJvdyBieSByb3csIHN0YXRpbmcgZnJvbSB0aGUgdG9wXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lSm9pbiA9ICdyb3VuZCdcclxuICAgICAgICBmb3IgKGxldCB5ID0geU1heDsgeSA+PSB5TWluOyB5IC09IHJlc29sdXRpb24pIHtcclxuICAgICAgICAgICAgLy9nZXQgcm93XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGluZFt5XVxyXG5cclxuICAgICAgICAgICAgLy9ubyByb3dcclxuICAgICAgICAgICAgaWYgKCFyb3cpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3BsYWNlIGZpcnN0IHBvaW50XHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oeE1pbiAtIHJlc29sdXRpb24gLyAyLCB5KVxyXG5cclxuICAgICAgICAgICAgLy9zdG9yZSB0aGUgcHJldmlvdXMgaGVpZ2h0XHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgbGV0IGhHX1xyXG5cclxuICAgICAgICAgICAgLy9nbyB0aHJvdWdoIHRoZSBsaW5lIGNlbGxzXHJcbiAgICAgICAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDw9IHhNYXg7IHggKz0gcmVzb2x1dGlvbikge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgY29sdW1uIHZhbHVlXHJcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgICAgIGxldCBoRyA9IHJvd1t4XVxyXG4gICAgICAgICAgICAgICAgaWYgKCFoRykgaEcgPSAwXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGhHIHx8IGhHXykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZHJhdyBsaW5lIG9ubHkgd2hlbiBhdCBsZWFzdCBvbmUgb2YgYm90aCB2YWx1ZXMgaXMgbm9uLW51bGxcclxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gdGVzdCBiZXppZXJDdXJ2ZVRvXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCArIHJlc29sdXRpb24gLyAyLCB5ICsgaEcpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZWxzZSBtb3ZlIHRoZSBwb2ludFxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHggKyByZXNvbHV0aW9uIC8gMiwgeSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlXHJcbiAgICAgICAgICAgICAgICBoR18gPSBoR1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2xhc3QgcG9pbnRcclxuICAgICAgICAgICAgaWYgKGhHXykgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeE1heCArIHJlc29sdXRpb24gLyAyLCB5KVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGZpbGxcclxuICAgICAgICAgICAgY29uc3QgZmMgPSB0aGlzLmZpbGxDb2xvcih5LCB5cywgcmVzb2x1dGlvbiwgeilcclxuICAgICAgICAgICAgaWYgKGZjICYmIGZjICE9ICdub25lJykge1xyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBmY1xyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGxpbmVcclxuICAgICAgICAgICAgY29uc3QgbGMgPSB0aGlzLmxpbmVDb2xvcih5LCB5cywgcmVzb2x1dGlvbiwgeilcclxuICAgICAgICAgICAgY29uc3QgbHcgPSB0aGlzLmxpbmVXaWR0aCh5LCB5cywgcmVzb2x1dGlvbiwgeilcclxuICAgICAgICAgICAgaWYgKGxjICYmIGxjICE9ICdub25lJyAmJiBsdyA+IDApIHtcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBsY1xyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSBsd1xyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgVGFuYWthU3R5bGUgfSBmcm9tICcuL1RhbmFrYVN0eWxlLmpzJ1xyXG5pbXBvcnQgeyBTdHJva2VTdHlsZSB9IGZyb20gJy4vU3Ryb2tlU3R5bGUuanMnXHJcbmltcG9ydCB7IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlIH0gZnJvbSAnLi9TcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZS5qcydcclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGUgc3R5bGVcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExlZ29TdHlsZSB7XHJcblxyXG4gICAgc3RhdGljIGdldCh2YWx1ZSwgYnJlYWtzLCBjb2xvcnMsIG9wdHMgPSB7fSkge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8vdGhlIGNvbG9yc1xyXG4gICAgICAgIC8vaHR0cDovL3d3dy5qZW5ueXNjcmF5b25jb2xsZWN0aW9uLmNvbS8yMDIxLzA2L2FsbC1jdXJyZW50LWxlZ28tY29sb3JzLmh0bWxcclxuICAgICAgICAvL2h0dHBzOi8vbGVvbmF3aWN6LmdpdGh1Yi5pby9sZWdvY29sb3JzL3JlZmVyZW5jZS9maWd1cmVzL1JFQURNRS1wbG90LTEucG5nXHJcbiAgICAgICAgLypvcHRzLmNvbG9ycyA9IG9wdHMuY29sb3JzIHx8IFtcclxuICAgICAgICAgICAgJyMwMDg1MmInLCAvL2RhcmtlciBncmVlblxyXG4gICAgICAgICAgICAnI2FmZDI0NicsIC8vbGlnaHQgZ3JlZW5cclxuICAgICAgICAgICAgJyNmYWM4MGEnLCAvL2RhcmsgeWVsbG93XHJcbiAgICAgICAgICAgICcjYmI4MDVhJywgLy9icm93blxyXG4gICAgICAgICAgICAnI2Q2NzkyMycsIC8vbW9zdGFyZFxyXG4gICAgICAgICAgICAnI2NiNGUyOScsIC8vcmVkaXNoXHJcbiAgICAgICAgICAgICcjYjQwMDAwJywgLy9yZWRcclxuICAgICAgICAgICAgJyM3MjAwMTInLCAvL2RhcmsgcmVkXHJcbiAgICAgICAgICAgIC8vXCJwdXJwbGVcIixcclxuICAgICAgICAgICAgLy9cIiNlZWVcIiAvL3doaXRoZVxyXG4gICAgICAgIF0qL1xyXG5cclxuICAgICAgICBvcHRzLmNvbERhcmsgPSBvcHRzLmNvbERhcmsgfHwgJyMzMzMnXHJcbiAgICAgICAgb3B0cy5jb2xCcmlnaHQgPSBvcHRzLmNvbEJyaWdodCB8fCAnI2FhYSdcclxuICAgICAgICBvcHRzLndpZHRoRmFjdG9yID0gb3B0cy53aWR0aEZhY3RvciB8fCAwLjEyXHJcblxyXG4gICAgICAgIC8vcmV1c2UgdGFuYWthIGFzIGJhc2lzXHJcbiAgICAgICAgY29uc3QgdHMgPSBUYW5ha2FTdHlsZS5nZXQodmFsdWUsIGJyZWFrcywgY29sb3JzLCBvcHRzKVxyXG4gICAgICAgIC8vc3R5bGUgdG8gc2hvdyBsaW1pdHMgYmV0d2VlbiBwaWVjZXNcclxuICAgICAgICBjb25zdCBzc3QgPSBuZXcgU3Ryb2tlU3R5bGUoe1xyXG4gICAgICAgICAgICBzdHJva2VDb2xvcjogKCkgPT4gJyM2NjYnLFxyXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogKGMsIHIsIHopID0+IDAuMiAqIHosXHJcbiAgICAgICAgICAgIGZpbHRlcjogb3B0cy5maWx0ZXIsXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgdHNbMF0sXHJcbiAgICAgICAgICAgIHNzdCxcclxuICAgICAgICAgICAgdHNbMV0sXHJcbiAgICAgICAgICAgIG5ldyBMZWdvVG9wU3R5bGUoeyBjb2xEYXJrOiBvcHRzLmNvbERhcmssIGNvbEJyaWdodDogb3B0cy5jb2xCcmlnaHQsIGZpbHRlcjogb3B0cy5maWx0ZXIgfSksXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpOnN0cmluZ30gY29kZVxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNvbG9yXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICogQHJldHVybnMge0FycmF5LjxTdHlsZT59XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRDYXRlZ29yeShjb2RlLCBjb2xvciwgb3B0cykge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIG9wdHMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcclxuICAgICAgICBvcHRzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjYWFhJ1xyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHMgPSBuZXcgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUoeyBjb2RlOiBjb2RlLCBjb2xvcjogY29sb3IgfSlcclxuICAgICAgICAvL3N0eWxlIHRvIHNob3cgbGltaXRzIGJldHdlZW4gcGllY2VzXHJcbiAgICAgICAgY29uc3Qgc3N0ID0gbmV3IFN0cm9rZVN0eWxlKHsgc3Ryb2tlQ29sb3I6ICgpID0+ICcjNjY2Jywgc3Ryb2tlV2lkdGg6IChjLCByLCB6KSA9PiAwLjIgKiB6IH0pXHJcblxyXG4gICAgICAgIHJldHVybiBbcywgc3N0LCBuZXcgTGVnb1RvcFN0eWxlKHsgY29sRGFyazogb3B0cy5jb2xEYXJrLCBjb2xCcmlnaHQ6IG9wdHMuY29sQnJpZ2h0IH0pXVxyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQSBzdHlsZSB0byBkcmF3IHRvcCBjaXJjbGUgb2YgbGVnbyBicmlja3MuXHJcbiAqL1xyXG5jbGFzcyBMZWdvVG9wU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R8dW5kZWZpbmVkfSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG4gICAgICAgIHRoaXMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcclxuICAgICAgICB0aGlzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjYWFhJ1xyXG4gICAgfVxyXG5cclxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcikge1xyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSAwLjYgKiBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZGFyayBwYXJ0XHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sRGFya1xyXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhjLnggKyByICogMC41LCBjLnkgKyByICogMC41LCByICogMC41NSAqIDAuNSwgTWF0aC5QSSAvIDQsIC1NYXRoLlBJICogKDMgLyA0KSwgdHJ1ZSlcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9icmlnaHQgcGFydFxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbEJyaWdodFxyXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhjLnggKyByICogMC41LCBjLnkgKyByICogMC41LCByICogMC41NSAqIDAuNSwgTWF0aC5QSSAvIDQsIC1NYXRoLlBJICogKDMgLyA0KSwgZmFsc2UpXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQG1vZHVsZSBzdHlsZVxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTW9zYWljU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiBcIiNFQTZCQUNcIikgLy8oYyxyLHosdnMpID0+IHt9XHJcblxyXG4gICAgICAgIC8qKiBUaGUgbW9zYWljIGZhY3Rvciwgd2l0aGluIFswLDAuNV0uIFNldCB0byAwIGZvciBubyBtb3NhaWMgZWZmZWN0LiBTZXQgdG8gMC41IGZvciBzdHJvbmcgbW9zYWljIGVmZmVjdC5cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMubW9zYWljRmFjdG9yID0gb3B0cy5tb3NhaWNGYWN0b3IgfHwgMC4xNVxyXG5cclxuICAgICAgICAvKiogVGhlIG1vc2FpYyBzaGFkb3cgZmFjdG9yLCB3aXRoaW4gWzAsMC41XS4gU2V0IHRvIDAgZm9yIG5vIG1vc2FpYyBzaGFkb3cuIFNldCB0byAwLjUgZm9yIHN0cm9uZyBtb3NhaWMgc2hhZG93LlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaGFkb3dGYWN0b3IgPSBvcHRzLnNoYWRvd0ZhY3RvciB8fCAwLjJcclxuXHJcbiAgICAgICAgLyoqIFRoZSBtb3NhaWMgc2hhZG93IGNvbG9yLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5zaGFkb3dDb2xvciA9IG9wdHMuc2hhZG93Q29sb3IgfHwgJyM1NTUnXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxyXG5cclxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXHJcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLy9zZXQgc3Ryb2tlIHN0eWxlLCBmb3Igc2hhZG93XHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuc2hhZG93Q29sb3JcclxuICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHRoaXMuc2hhZG93RmFjdG9yICogcmVzb2x1dGlvblxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUpvaW4gPSAncm91bmQnXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lQ2FwID0gJ2J1dHQnXHJcblxyXG4gICAgICAgIC8vZnVuY3Rpb24gdG8gY29tcHV0ZSBwb3NpdGlvbiBtb3NhaWMgZWZmZWN0XHJcbiAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiB0aGlzLm1vc2FpY0ZhY3RvclxyXG4gICAgICAgIGNvbnN0IG1vc2FpYyA9ICgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgeDogTWF0aC5yYW5kb20oKSAqIGQsIHk6IE1hdGgucmFuZG9tKCkgKiBkIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgLy9zZXQgZmlsbCBjb2xvclxyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9IGNvbFxyXG5cclxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XHJcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHJlc29sdXRpb24sIHopXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgcG9zaXRpb24gbW9zYWljIGVmZmVjdFxyXG4gICAgICAgICAgICBjb25zdCBsbCA9IG1vc2FpYygpLFxyXG4gICAgICAgICAgICAgICAgdWwgPSBtb3NhaWMoKSxcclxuICAgICAgICAgICAgICAgIGxyID0gbW9zYWljKCksXHJcbiAgICAgICAgICAgICAgICB1ciA9IG1vc2FpYygpXHJcblxyXG4gICAgICAgICAgICAvL3N0cm9rZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFkb3dGYWN0b3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyBsbC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsbC55KVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIGxyLngsIGNlbGwueSArIG9mZnNldC5keSArIGxyLnkpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC0gdXIueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAtIHVyLnkpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vZmlsbFxyXG5cclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyBsbC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsbC55KVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC0gbHIueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgbHIueSlcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIHVyLngsIGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLSB1ci55KVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyB1bC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyByZXNvbHV0aW9uIC0gdWwueSlcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcclxuXHJcbi8qKlxyXG4gKiBAbW9kdWxlIHN0eWxlXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBOaW5qYVN0YXJTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+IFwiI0VBNkJBQ1wiKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCwgd2l0aGluIFswLDFdOlxyXG4gICAgICAgICAqICAtIDAsIG5vdGhpbmcgc2hvd25cclxuICAgICAgICAgKiAgLSAxLCBlbnRpcmUgc3F1YXJlXHJcbiAgICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaGFwZS5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gJ28nKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gKiAwLjVcclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIC8vY29sb3JcclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSBjb2xcclxuXHJcbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlbyB1bml0XHJcbiAgICAgICAgICAgIGxldCBrID0gdGhpcy5zaXplKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcclxuICAgICAgICAgICAgayA9IGsgPCAwID8gMCA6IGsgPiAxID8gMSA6IGtcclxuICAgICAgICAgICAgY29uc3Qgc0cyID0gayAqIHIyXHJcblxyXG4gICAgICAgICAgICAvL3NoYXBlXHJcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZSA/IHRoaXMuc2hhcGUoY2VsbCkgOiAnbydcclxuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgLy9UT0RPIHVzZVxyXG4gICAgICAgICAgICAvL2NvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHIsIHopXHJcblxyXG4gICAgICAgICAgICAvL2NlbnRlciBwb3NpdGlvblxyXG4gICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIHIyXHJcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcjJcclxuXHJcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3AnKSB7XHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCwgY3kgKyByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4ICsgc0cyLCBjeSArIHNHMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4ICsgcjIsIGN5KVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyBzRzIsIGN5IC0gc0cyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3gsIGN5IC0gcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCAtIHNHMiwgY3kgLSBzRzIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCAtIHIyLCBjeSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4IC0gc0cyLCBjeSArIHNHMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdvJykge1xyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oY3gsIGN5ICsgc0cyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyByMiwgY3kgKyByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4ICsgc0cyLCBjeSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4ICsgcjIsIGN5IC0gcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCwgY3kgLSBzRzIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCAtIHIyLCBjeSAtIHIyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggLSBzRzIsIGN5KVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggLSByMiwgY3kgKyByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHNoYXBlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQG1vZHVsZSBzdHlsZVxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUGlsbGFyU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCBvZiB0aGUgbGluZSByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+IFwiI2MwOGM1OVwiKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgbGluZSByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IDAuNSAqIHJlc29sdXRpb24pXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLCBudW1iZXIsb2JqZWN0KTpib29sZWFufSAqL1xyXG4gICAgICAgIHRoaXMuc2ltcGxlID0gb3B0cy5zaW1wbGUgfHwgKCgpID0+IGZhbHNlKVxyXG5cclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnZpZXdIZWlnaHRGYWN0b3IgPSBvcHRzLnZpZXdIZWlnaHRGYWN0b3IgfHwgMS41XHJcbiAgICAgICAgLy8wLDAgaXMgdGhlIGNlbnRlclxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMudmlld1NYID0gb3B0cy52aWV3U1ggPT0gdW5kZWZpbmVkID8gMCA6IG9wdHMudmlld1NYXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy52aWV3U1kgPSBvcHRzLnZpZXdTWSA9PSB1bmRlZmluZWQgPyAtMC41IDogb3B0cy52aWV3U1lcclxuXHJcbiAgICAgICAgLy9UT0RPIHJlcGxhY2Ugd2l0aCBzdW4gbG9jYXRpb24gP1xyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc2hhZG93RGlyZWN0aW9uID1cclxuICAgICAgICAgICAgb3B0cy5zaGFkb3dEaXJlY3Rpb24gPT0gdW5kZWZpbmVkID8gKC00MC4zICogTWF0aC5QSSkgLyAxODAuMCA6IG9wdHMuc2hhZG93RGlyZWN0aW9uXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaGFkb3dGYWN0b3IgPSBvcHRzLnNoYWRvd0ZhY3RvciB8fCAwLjNcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnNoYWRvd0NvbG9yID0gb3B0cy5zaGFkb3dDb2xvciB8fCAnIzAwMDAwMDMzJ1xyXG5cclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLm91dGxpbmVDb2wgPSBvcHRzLm91dGxpbmVDb2wgfHwgJyNGRkZGRkYnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5vdXRsaW5lV2lkdGhQaXggPSBvcHRzLm91dGxpbmVXaWR0aFBpeCA9PSB1bmRlZmluZWQgPyAwLjUgOiBvcHRzLm91dGxpbmVXaWR0aFBpeFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBjZWxscyBhcyBzZWdtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvL2dldCB2aWV3IGNlbnRlciBnZW8gcG9zaXRpb25cclxuICAgICAgICBjb25zdCBjdnggPSBnZW9DYW52YXMudmlldy54ICsgdGhpcy52aWV3U1ggKiBnZW9DYW52YXMudyAqIHpcclxuICAgICAgICBjb25zdCBjdnkgPSBnZW9DYW52YXMudmlldy55ICsgdGhpcy52aWV3U1kgKiBnZW9DYW52YXMuaCAqIHpcclxuICAgICAgICAvL2dldCB2aWV3IGhlaWdodFxyXG4gICAgICAgIGNvbnN0IEggPSB0aGlzLnZpZXdIZWlnaHRGYWN0b3IgKiAoZ2VvQ2FudmFzLncgKyBnZW9DYW52YXMuaCkgKiAwLjUgKiB6XHJcblxyXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB5IGFuZCB4XHJcbiAgICAgICAgLy9jb25zdCBkaXN0VG9WaWV3Q2VudGVyID0gKGMpID0+IHsgY29uc3QgZHggPSBjdnggLSBjLngsIGR5ID0gY3Z5IC0gYy55OyByZXR1cm4gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KSB9XHJcbiAgICAgICAgY2VsbHMuc29ydCgoYzEsIGMyKSA9PiAxMDAwMDAwMDAgKiAoYzIueSAtIGMxLnkpICsgYzEueCAtIGMyLngpXHJcblxyXG4gICAgICAgIC8vZ2V0IHNpbXBsZSBpbmZvcm1hdGlvblxyXG4gICAgICAgIGNvbnN0IHNpbXBsZSA9IHRoaXMuc2ltcGxlKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcclxuXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lQ2FwID0gc2ltcGxlID8gJ2J1dHQnIDogJ3JvdW5kJ1xyXG5cclxuICAgICAgICAvL2RyYXcgc2hhZG93c1xyXG4gICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnNoYWRvd0NvbG9yXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsU3R5bGUgPSB0aGlzLnNoYWRvd0NvbG9yXHJcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAvL3dpZHRoXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPCAwKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9oZWlnaHRcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBoRyA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWhHIHx8IGhHIDwgMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICAvL1RPRE8gdXNlIHRoYXRcclxuICAgICAgICAgICAgLy9jb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByZXNvbHV0aW9uLCB6KVxyXG5cclxuICAgICAgICAgICAgLy9zZXQgd2lkdGhcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSB3R1xyXG5cclxuICAgICAgICAgICAgLy9jb21wdXRlIGNlbGwgY2VudGVyIHBvc3RpdGlvblxyXG4gICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIHJlc29sdXRpb24gLyAyXHJcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcmVzb2x1dGlvbiAvIDJcclxuICAgICAgICAgICAgY29uc3QgbHMgPSBoRyAqIHRoaXMuc2hhZG93RmFjdG9yXHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgc2VnbWVudFxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGN4LCBjeSlcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oY3ggKyBscyAqIE1hdGguY29zKHRoaXMuc2hhZG93RGlyZWN0aW9uKSwgY3kgKyBscyAqIE1hdGguc2luKHRoaXMuc2hhZG93RGlyZWN0aW9uKSlcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG5cclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2ltcGxlKSB7XHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgYmFzZSBjaXJjbGVcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKTtcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoXHJcbiAgICAgICAgICAgICAgICAgICAgY3gsIGN5LFxyXG4gICAgICAgICAgICAgICAgICAgIHdHICogMC41LFxyXG4gICAgICAgICAgICAgICAgICAgIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5zdHJva2UoKTtcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKCk7XHJcbiAgICAgICAgICAgIH0qL1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9kcmF3IHBpbGxhcnNcclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIC8vY29sb3JcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy93aWR0aFxyXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vaGVpZ2h0XHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3QgaEcgPSB0aGlzLmhlaWdodCA/IHRoaXMuaGVpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKCFoRyB8fCBoRyA8IDApIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgLy9UT0RPIHVzZSB0aGF0XHJcbiAgICAgICAgICAgIC8vY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgcmVzb2x1dGlvbiwgeilcclxuXHJcbiAgICAgICAgICAgIC8vY29tcHV0ZSBjZWxsIGNlbnRlciBwb3N0aXRpb25cclxuICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyByZXNvbHV0aW9uIC8gMlxyXG4gICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIHJlc29sdXRpb24gLyAyXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgYW5nbGVcclxuICAgICAgICAgICAgY29uc3QgZHggPSBjeCAtIGN2eCxcclxuICAgICAgICAgICAgICAgIGR5ID0gY3kgLSBjdnlcclxuICAgICAgICAgICAgY29uc3QgYSA9IE1hdGguYXRhbjIoZHksIGR4KVxyXG4gICAgICAgICAgICBjb25zdCBEID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KVxyXG4gICAgICAgICAgICBjb25zdCBkID0gKEQgKiBoRykgLyAoSCAtIGhHKVxyXG5cclxuICAgICAgICAgICAgaWYgKHNpbXBsZSkge1xyXG4gICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd0dcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGN4LCBjeSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBiYWNrZ3JvdW5kIHNlZ21lbnRcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLm91dGxpbmVDb2xcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd0cgKyAyICogdGhpcy5vdXRsaW5lV2lkdGhQaXggKiB6XHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCwgY3kpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSkpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXHJcblxyXG4gICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd0dcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGN4LCBjeSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuXHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgdG9wIGNpcmNsZVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMub3V0bGluZUNvbFxyXG4gICAgICAgICAgICAgICAgLy9jZy5jdHguZmlsbFN0eWxlID0gXCIjYzA4YzU5XCJcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gdGhpcy5vdXRsaW5lV2lkdGhQaXggKiB6XHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSksIHdHICogMC41LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5maWxsKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vaW4gY2FzZS4uLlxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9ICdidXR0J1xyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQSBzdHlsZSB3aGVyZSBlYWNoIGNlbGwgaXMgcmVwcmVzZW50ZWQgYnkgYSBzZWdtZW50IHdob3NlIGxlbmd0aCwgd2lkdGgsIGNvbG9yIGFuZCBvcmllbnRhdGlvbiBjYW4gdmFyeSBhY2NvcmRpbmcgdG8gc3RhdGlzdGljYWwgdmFsdWVzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIHN0eWxlXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTZWdtZW50U3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwgc2VnbWVudC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+IFwiI0VBNkJBQ1wiKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24gKiAwLjEpICAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YgdGhlIHNlZ21lbnQgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRzLmxlbmd0aCB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24gKiAwLjkpICAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBvcmllbnRhdGlvbiAoaW4gZGVncmVlcykgb2YgdGhlIHNlZ21lbnQgcmVwcmVzZW50aW5nIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgKCgpID0+IDE4MCAqIE1hdGgucmFuZG9tKCkpIC8vKGMscix6LHZzKSA9PiB7fVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBjZWxscyBhcyBzZWdtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9ICdidXR0J1xyXG5cclxuICAgICAgICAvL2NvbnZlcnNpb24gZmFjdG9yIGRlZ3JlZSAtPiByYWRpYW5cclxuICAgICAgICBjb25zdCBmID0gTWF0aC5QSSAvIDE4MFxyXG5cclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIC8vY29sb3JcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy93aWR0aFxyXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vbGVuZ3RoXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3QgbEcgPSB0aGlzLmxlbmd0aCA/IHRoaXMubGVuZ3RoKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8IDApIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL29yaWVudGF0aW9uIChpbiByYWRpYW4pXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBvciA9IHRoaXMub3JpZW50YXRpb24oY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSAqIGZcclxuICAgICAgICAgICAgaWYgKG9yID09PSB1bmRlZmluZWQgfHwgaXNOYU4ob3IpKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XHJcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHJlc29sdXRpb24sIHopXHJcblxyXG4gICAgICAgICAgICAvL3NldCBjb2xvciBhbmQgd2lkdGhcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHdHXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgc2VnbWVudCBjZW50ZXIgcG9zdGl0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgcmVzb2x1dGlvbiAvIDIgKyBvZmZzZXQuZHhcclxuICAgICAgICAgICAgY29uc3QgY3kgPSBjZWxsLnkgKyByZXNvbHV0aW9uIC8gMiArIG9mZnNldC5keVxyXG5cclxuICAgICAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgZGlyZWN0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IGR4ID0gMC41ICogTWF0aC5jb3Mob3IpICogbEdcclxuICAgICAgICAgICAgY29uc3QgZHkgPSAwLjUgKiBNYXRoLnNpbihvcikgKiBsR1xyXG5cclxuICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjeCAtIGR4LCBjeSAtIGR5KVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjeCArIGR4LCBjeSArIGR5KVxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgdmlld1NjYWxlOiB2aWV3U2NhbGUsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIGNlbGxzOiBjZWxscyB9KVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEEgdmVyeSBnZW5lcmljIHN0eWxlIHRoYXQgc2hvd3MgZ3JpZCBjZWxscyB3aXRoIHNwZWNpZmljIGNvbG9yLCBzaXplIGFuZCBzaGFwZS5cclxuICogSXQgY2FuIGJlIHVzZWQgdG8gc2hvdyB2YXJpYWJsZXMgYXMgY2VsbCBjb2xvcnMsIGNlbGwgc2l6ZSwgY2VsbCBzaGFwZSwgb3IgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSB0aHJlZSB2aXN1YWwgdmFyaWFibGVzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIHN0eWxlXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaGFwZUNvbG9yU2l6ZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gXCIjRUE2QkFDXCIpIC8vKGMscix6LHZzKSA9PiB7fVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaGFwZSBvZiBhIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlciwgbnVtYmVyLG9iamVjdCk6aW1wb3J0KFwiLi4vY29yZS9TdHlsZS5qc1wiKS5TaGFwZX0gKi9cclxuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gXCJzcXVhcmVcIikgLy8oYyxyLHosdnMpID0+IHt9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNxdWFyZXMsIHdpdGggdmFyaW91cyBjb2xvcnMgYW5kIHNpemVzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICogQG92ZXJyaWRlXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xyXG5cclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIC8vem9vbVxyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gKiAwLjVcclxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIC8vY29sb3JcclxuICAgICAgICAgICAgbGV0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiBcImJsYWNrXCJcclxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3NpemVcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogcmVzb2x1dGlvblxyXG4gICAgICAgICAgICBpZiAoIXNpemUpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3NoYXBlXHJcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZSA/IHRoaXMuc2hhcGUoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdzcXVhcmUnXHJcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ25vbmUnKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XHJcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHJlc29sdXRpb24sIHopXHJcblxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxTdHlsZSA9IGNvbFxyXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdzcXVhcmUnKSB7XHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgc3F1YXJlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gcmVzb2x1dGlvbiAqICgxIC0gc2l6ZSAvIHJlc29sdXRpb24pICogMC41XHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGxSZWN0KGMueCArIGQgKyBvZmZzZXQuZHgsIGMueSArIGQgKyBvZmZzZXQuZHksIHNpemUsIHNpemUpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdjaXJjbGUnKSB7XHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgY2lyY2xlXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyhjLnggKyByMiArIG9mZnNldC5keCwgYy55ICsgcjIgKyBvZmZzZXQuZHksIHNpemUgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkb251dCcpIHtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBkb251dFxyXG4gICAgICAgICAgICAgICAgY29uc3QgeGMgPSBjLnggKyByMiArIG9mZnNldC5keCxcclxuICAgICAgICAgICAgICAgICAgICB5YyA9IGMueSArIHIyICsgb2Zmc2V0LmR5XHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyh4YywgeWMpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmFyYyh4YywgeWMsIHIyLCAwLCAyICogTWF0aC5QSSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYXJjKHhjLCB5YywgKDEgLSBzaXplIC8gcmVzb2x1dGlvbikgKiByMiwgMCwgMiAqIE1hdGguUEksIHRydWUpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmNsb3NlUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZGlhbW9uZCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHMyID0gc2l6ZSAqIDAuNVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54ICsgcjIgLSBzMiwgYy55ICsgcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgKyBzMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHIyICsgczIsIGMueSArIHIyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54ICsgcjIsIGMueSArIHIyIC0gczIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfdXAnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgLSBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSAtIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9kb3duJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHIyID0gKHNpemUgLSByZXNvbHV0aW9uKSAvIDJcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGMueCAtIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHIyLCBjLnkgLSBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsKClcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX2xlZnQnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCAtIGRyMiwgYy55ICsgcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfcmlnaHQnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgLSBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgKyByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCAtIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHNoYXBlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgdmlld1NjYWxlOiB2aWV3U2NhbGUsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIGNlbGxzOiBjZWxscyB9KVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQSBzdHlsZSB0byBzaG93IHRoZSBzaWRlcyBvZiBncmlkIGNlbGxzIGJhc2VkIG9uIHRoZWlyIGRpZmZlcmVudCBjYXRlZ29yaWVzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIHN0eWxlXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaWRlQ2F0ZWdvcnlTdHlsZSBleHRlbmRzIFNpZGVTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY2F0ZWdvcnkgY29kZSBvZiBhIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvZGUgPSBvcHRzLmNvZGVcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRpY3Rpb25hcnkgKHN0cmluZyAtPiBjb2xvcikgd2hpY2ggZ2l2ZSB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeS5cclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxyXG5cclxuICAgICAgICAvL2J1aWxkIHNpZGVzXHJcblxyXG4gICAgICAgIC8qKiAgQHR5cGUge0FycmF5LjxpbXBvcnQoJy4vU2lkZVN0eWxlLmpzJykuU2lkZT59ICovXHJcbiAgICAgICAgY29uc3Qgc2lkZXMgPSBTaWRlU3R5bGUuYnVpbGRTaWRlcyhjZWxscywgcmVzb2x1dGlvbilcclxuICAgICAgICBpZiAoc2lkZXMubGVuZ3RoID09IDApIHJldHVyblxyXG5cclxuICAgICAgICAvL2dldCBzaWRlIHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKHNpZGVzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvL2RyYXcgc2lkZXNcclxuXHJcbiAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lQ2FwID0gJ2J1dHQnXHJcbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uKjAuNVxyXG4gICAgICAgIGZvciAobGV0IHNpZGUgb2Ygc2lkZXMpIHtcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IGNhdGVnb3J5IGNvZGVzIGZvciBib3RoIGNlbGxzXHJcbiAgICAgICAgICAgIGNvbnN0IGNvZGUxID0gc2lkZS5jMSA/IHRoaXMuY29kZShzaWRlLmMxLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBjb25zdCBjb2RlMiA9IHNpZGUuYzIgPyB0aGlzLmNvZGUoc2lkZS5jMiwgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKGNvZGUxID09IGNvZGUyKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy93aWR0aFxyXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDw9IDApIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGNvbnN0IHcyID0gd0cgKiAwLjVcclxuXHJcbiAgICAgICAgICAgIC8vc2V0IHdpZHRoXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd0dcclxuXHJcbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHdpdGggY29ycmVjdCBvcmllbnRhdGlvblxyXG4gICAgICAgICAgICBpZiAoc2lkZS5vciA9PT0gJ2gnKSB7XHJcbiAgICAgICAgICAgICAgICAvL3RvcCBsaW5lXHJcbiAgICAgICAgICAgICAgICBpZiAoY29kZTIpIHtcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3JbY29kZTJdXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oc2lkZS54LXIyLCBzaWRlLnkgKyB3MilcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhzaWRlLngrcjIsIHNpZGUueSArIHcyKVxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL2JvdHRvbSBsaW5lXHJcbiAgICAgICAgICAgICAgICBpZiAoY29kZTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3JbY29kZTFdXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oc2lkZS54LXIyLCBzaWRlLnkgLSB3MilcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhzaWRlLngrcjIsIHNpZGUueSAtIHcyKVxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vcmlnaHQgbGluZVxyXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbG9yW2NvZGUyXVxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHNpZGUueCArIHcyLCBzaWRlLnktcjIpXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oc2lkZS54ICsgdzIsIHNpZGUueStyMilcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9sZWZ0IGxpbmVcclxuICAgICAgICAgICAgICAgIGlmIChjb2RlMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltjb2RlMV1cclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhzaWRlLnggLSB3Miwgc2lkZS55LXIyKVxyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHNpZGUueCAtIHcyLCBzaWRlLnkrcjIpXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcblxyXG4vKiogQHR5cGVkZWYge3sgeDpudW1iZXIsIHk6bnVtYmVyLCBvcjpcInZcInxcImhcIiwgYzE6KGltcG9ydCgnLi4vY29yZS9EYXRhc2V0JykuQ2VsbCl8dW5kZWZpbmVkLCBjMjooaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQnKS5DZWxsKXx1bmRlZmluZWQgfX0gU2lkZSAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihBcnJheS48U2lkZT4sbnVtYmVyLCBudW1iZXIpOip9IFNpZGVWaWV3U2NhbGUgKi9cclxuXHJcbi8qKlxyXG4gKiBAbW9kdWxlIHN0eWxlXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaWRlU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgYSBjZWxsIHNpZGUuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKFNpZGUsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKHNpZGUsIHJlc29sdXRpb24sIHosIHNpZGVWaWV3U2NhbGUpID0+ICcjRUE2QkFDJylcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiBhIGNlbGwgc2lkZSwgaW4gZ2VvIHVuaXRcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgc2lkZVZpZXdTY2FsZSkgPT4gcmVzb2x1dGlvbiAvIDUpXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIGEgY2VsbCBzaWRlLCBpbiBnZW8gdW5pdFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihTaWRlLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRzLmxlbmd0aCB8fCAoKHNpZGUsIHJlc29sdXRpb24sIHosIHNpZGVWaWV3U2NhbGUpID0+IHJlc29sdXRpb24pXHJcblxyXG4gICAgICAgIC8qKiBTZXQgdG8gQSBvciB0cnVlIHNvIHRoYXQgdGhlIHNpZGUgaXMgZHJhd24gYXMgYSBkaWFtb25kICovXHJcbiAgICAgICAgdGhpcy5kaWFtb25kID0gb3B0cy5kaWFtb25kXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vYnVpbGQgc2lkZXNcclxuXHJcbiAgICAgICAgLyoqICBAdHlwZSB7QXJyYXkuPFNpZGU+fSAqL1xyXG4gICAgICAgIGNvbnN0IHNpZGVzID0gU2lkZVN0eWxlLmJ1aWxkU2lkZXMoY2VsbHMsIHJlc29sdXRpb24pXHJcbiAgICAgICAgaWYgKHNpZGVzLmxlbmd0aCA9PSAwKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9nZXQgc2lkZSB2aWV3IHNjYWxlXHJcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShzaWRlcywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLy9kcmF3IHNpZGVzXHJcblxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHgubGluZUNhcCA9ICdidXR0J1xyXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxyXG4gICAgICAgIGZvciAobGV0IHNpZGUgb2Ygc2lkZXMpIHtcclxuXHJcbiAgICAgICAgICAgIC8vY29sb3JcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihzaWRlLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5kaWFtb25kKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sXHJcblxyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGRpYW1vbmRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzaWRlLngsIHkgPSBzaWRlLnlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHggLSByMiwgeSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHgsIHkgKyByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHggKyByMiwgeSlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKHgsIHkgLSByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguY2xvc2VQYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbCgpXHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vd2lkdGhcclxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8PSAwKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgICAgIC8vbGVuZ3RoXHJcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCBsRyA9IHRoaXMubGVuZ3RoID8gdGhpcy5sZW5ndGgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8PSAwKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbEcyID0gbEcgKiAwLjVcclxuXHJcbiAgICAgICAgICAgICAgICAvL3NldCB3aWR0aFxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lV2lkdGggPSB3R1xyXG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcclxuXHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgc2VnbWVudCB3aXRoIGNvcnJlY3Qgb3JpZW50YXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzaWRlLngsIHkgPSBzaWRlLnlcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGlmIChzaWRlLm9yID09PSBcInZcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKHgsIHkgLSBsRzIpXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oeCwgeSArIGxHMilcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oeCAtIGxHMiwgeSlcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyh4ICsgbEcyLCB5KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQnKS5DZWxsPn0gY2VsbHMgVGhlIGNlbGxzIHRvIHVzZSB0byBidWlsZCB0aGUgc2lkZXMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgY2VsbHMgcmVzb2x1dGlvblxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB3aXRoSG9yaXpvbnRhbCBTZXQgdG8gdHJ1ZSB0byBidWlsZCBob3Jpem9udGFsIHNpZGVzLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHdpdGhWZXJ0aWNhbCBTZXQgdG8gdHJ1ZSB0byBidWlsZCB2ZXJ0aWNhbCBzaWRlcywgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjZW50ZXIgU2V0IHRvIHRydWUgc28gdGhhdCB0aGUgc2lkZSBjb29yZGluYXRlIGFyZSB0aG9zZSBvZiBpdHMgY2VudGVyIHBvaW50IHJhdGhlciB0aGFuIGl0cyBsZWZ0L2JvdHRvbSBwb2ludCAodGhlIHNpZGUgeCx5IGNvb3JkaW5hdGVzIGFyZSB0aG9zZSBvZiB0aGUgbGVmdCBwb2ludCBmb3IgaG9yaXpvbnRhbCBzaWRlcywgYW5kIG9mIHRoZSBib3R0b20gcG9pbnQgZm9yIHZlcnRpY2FsIHNpZGVzKVxyXG4gICAgICogQHJldHVybnMgeyBBcnJheS48U2lkZT4gfVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYnVpbGRTaWRlcyhjZWxscywgcmVzb2x1dGlvbiwgd2l0aEhvcml6b250YWwgPSB0cnVlLCB3aXRoVmVydGljYWwgPSB0cnVlLCBjZW50ZXIgPSB0cnVlKSB7XHJcbiAgICAgICAgLyoqIEB0eXBlIHsgQXJyYXkuPFNpZGU+IH0gKi9cclxuICAgICAgICBjb25zdCBzaWRlcyA9IFtdXHJcblxyXG4gICAgICAgIGNvbnN0IHIyID0gY2VudGVyID8gcmVzb2x1dGlvbiAvIDIgOiAwXHJcblxyXG4gICAgICAgIC8vbWFrZSBob3Jpem9udGFsIHNpZGVzXHJcbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHggYW5kIHlcclxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IChjMi54ID09IGMxLnggPyBjMS55IC0gYzIueSA6IGMxLnggLSBjMi54KSlcclxuICAgICAgICBsZXQgYzEgPSBjZWxsc1swXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGMyID0gY2VsbHNbaV1cclxuXHJcbiAgICAgICAgICAgIGlmICgoYzEueSArIHJlc29sdXRpb24gPT0gYzIueSkgJiYgKGMxLnggPT0gYzIueCkpXHJcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGluIHNhbWUgY29sdW1uIGFuZCB0b3VjaCBhbG9uZyBob3Jpem9udGFsIHNpZGVcclxuICAgICAgICAgICAgICAgIC8vbWFrZSBzaGFyZWQgc2lkZVxyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgb3I6ICdoJyxcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcjIsIHk6IGMyLnksXHJcbiAgICAgICAgICAgICAgICAgICAgYzE6IGMxLCBjMjogYzJcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9jZWxscyBkbyBub3QgdG91Y2ggYWxvbmcgaG9yaXpvbnRhbCBzaWRlXHJcbiAgICAgICAgICAgICAgICAvL21ha2UgdHdvIHNpZGVzOiB0b3Agb25lIGZvciBjMSwgYm90dG9tIGZvciBjMlxyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgb3I6ICdoJyxcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcjIsIHk6IGMxLnkgKyByZXNvbHV0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGMxOiBjMSwgYzI6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIG9yOiAnaCcsXHJcbiAgICAgICAgICAgICAgICAgICAgeDogYzIueCArIHIyLCB5OiBjMi55LFxyXG4gICAgICAgICAgICAgICAgICAgIGMxOiB1bmRlZmluZWQsIGMyOiBjMlxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYzEgPSBjMlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9tYWtlIHZlcnRpY2FsIHNpZGVzXHJcbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHkgYW5kIHhcclxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IChjMi55ID09IGMxLnkgPyBjMS54IC0gYzIueCA6IGMxLnkgLSBjMi55KSlcclxuICAgICAgICBjMSA9IGNlbGxzWzBdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgYzIgPSBjZWxsc1tpXVxyXG5cclxuICAgICAgICAgICAgaWYgKChjMS54ICsgcmVzb2x1dGlvbiA9PSBjMi54KSAmJiAoYzEueSA9PSBjMi55KSlcclxuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSByb3cgYW5kIHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcclxuICAgICAgICAgICAgICAgIC8vbWFrZSBzaGFyZWQgc2lkZVxyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcmVzb2x1dGlvbiwgeTogYzEueSArIHIyLFxyXG4gICAgICAgICAgICAgICAgICAgIGMxOiBjMSwgYzI6IGMyXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vY2VsbHMgZG8gbm90IHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcclxuICAgICAgICAgICAgICAgIC8vbWFrZSB0d28gc2lkZXM6IHJpZ2h0IG9uZSBmb3IgYzEsIGxlZnQgZm9yIGMyXHJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBvcjogJ3YnLFxyXG4gICAgICAgICAgICAgICAgICAgIHg6IGMxLnggKyByZXNvbHV0aW9uLCB5OiBjMS55ICsgcjIsXHJcbiAgICAgICAgICAgICAgICAgICAgYzE6IGMxLCBjMjogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMi54LCB5OiBjMi55ICsgcjIsXHJcbiAgICAgICAgICAgICAgICAgICAgYzE6IHVuZGVmaW5lZCwgYzI6IGMyXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjMSA9IGMyXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzaWRlc1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcclxuaW1wb3J0IHsgbWFrZVdlYkdMQ2FudmFzIH0gZnJvbSAnLi4vdXRpbHMvd2ViR0xVdGlscy5qcydcclxuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkLmpzJ1xyXG5cclxuLyoqXHJcbiAqIFN0eWxlIGJhc2VkIG9uIHdlYkdMXHJcbiAqIFRvIHNob3cgY2VsbHMgYXMgY29sb3JlZCBzcXVhcmVzLCBmcm9tIGNhdGVnb3JpZXMuXHJcbiAqIEFsbCBjZWxscyBhcmUgZHJhd24gYXMgc3F1YXJlcywgd2l0aCB0aGUgc2FtZSBzaXplXHJcbiAqXHJcbiAqIEBtb2R1bGUgc3R5bGVcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY2F0ZWdvcnkgY29kZSBvZiB0aGUgY2VsbCwgZm9yIGNvbG9yaW5nLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvZGUgPSBvcHRzLmNvZGVcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRpY3Rpb25hcnkgKGNvZGUgLT4gY29sb3IpIHdoaWNoIGdpdmVzIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5IGNvZGUuXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH0gKi9cclxuICAgICAgICBvcHRzLmNvbG9yID0gb3B0cy5jb2xvciB8fCB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHsgQXJyYXkuPHN0cmluZz4gfSAqL1xyXG4gICAgICAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMob3B0cy5jb2xvcilcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHsgb2JqZWN0IH0gQHByaXZhdGUgKi9cclxuICAgICAgICB0aGlzLmNhdFRvSSA9IHt9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykgdGhpcy5jYXRUb0lbY29kZXNbaV1dID0gaSArICcnXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxzdHJpbmc+IH0gQHByaXZhdGUgKi9cclxuICAgICAgICB0aGlzLmNvbG9ycyA9IFtdXHJcbiAgICAgICAgZm9yIChjb25zdCBjb2RlIG9mIGNvZGVzKVxyXG4gICAgICAgICAgICB0aGlzLmNvbG9ycy5wdXNoKG9wdHMuY29sb3JbJycgKyBjb2RlXSlcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgdGhlIGNlbGxzLCBpbiBnZW9ncmFwaGljYWwgdW5pdC4gQWxsIGNlbGxzIGhhdmUgdGhlIHNhbWUgc2l6ZS5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSAvLyAocmVzb2x1dGlvbiwgeikgPT4gLi4uXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUgeyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQgfSAqL1xyXG4gICAgICAgIHRoaXMud2dwID0gbmV3IFdlYkdMU3F1YXJlQ29sb3JpbmdDYXRBZHZhbmNlZCh0aGlzLmNvbG9ycylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xyXG5cclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcclxuXHJcbiAgICAgICAgLy9hZGQgdmVydGljZSBhbmQgZnJhZ21lbnQgZGF0YVxyXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAvIDJcclxuICAgICAgICBsZXQgYywgbmIgPSBjZWxscy5sZW5ndGhcclxuICAgICAgICBjb25zdCB2ZXJ0aWNlc0J1ZmZlciA9IFtdXHJcbiAgICAgICAgY29uc3QgaUJ1ZmZlciA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGMgPSBjZWxsc1tpXVxyXG4gICAgICAgICAgICBjb25zdCBjYXQgPSB0aGlzLmNvZGUoYylcclxuICAgICAgICAgICAgaWYgKGNhdCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbmV4cGVjdGVkIGNhdGVnb3J5OiAnICsgY2F0KVxyXG4gICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgY29uc3QgaV8gPSB0aGlzLmNhdFRvSVtjYXRdXHJcbiAgICAgICAgICAgIGlmIChpc05hTigraV8pKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5leHBlY3RlZCBjYXRlZ29yeSBpbmRleDogJyArIGNhdCArICcgJyArIGlfKVxyXG4gICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2ZXJ0aWNlc0J1ZmZlci5wdXNoKGMueCArIHIyLCBjLnkgKyByMilcclxuICAgICAgICAgICAgaUJ1ZmZlci5wdXNoKCtpXylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vY3JlYXRlIGNhbnZhcyBhbmQgd2ViZ2wgcmVuZGVyZXJcclxuICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhnZW9DYW52YXMudyArICcnLCBnZW9DYW52YXMuaCArICcnKVxyXG4gICAgICAgIGlmICghY3ZXR0wpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vZHJhd1xyXG4gICAgICAgIGNvbnN0IHNpemVHZW8gPSB0aGlzLnNpemUgPyB0aGlzLnNpemUocmVzb2x1dGlvbiwgeikgOiByZXNvbHV0aW9uICsgMC4yICogelxyXG4gICAgICAgIHRoaXMud2dwLmRyYXcoY3ZXR0wuZ2wsIHZlcnRpY2VzQnVmZmVyLCBpQnVmZmVyLCBnZW9DYW52YXMuZ2V0V2ViR0xUcmFuc2Zvcm0oKSwgc2l6ZUdlbyAvIHopXHJcblxyXG4gICAgICAgIC8vZHJhdyBpbiBjYW52YXMgZ2VvXHJcbiAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKGN2V0dMLmNhbnZhcywgMCwgMClcclxuXHJcbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6IH0pXHJcbiAgICB9XHJcbn0iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcclxuaW1wb3J0IHsgbWFrZVdlYkdMQ2FudmFzIH0gZnJvbSAnLi4vdXRpbHMvd2ViR0xVdGlscy5qcydcclxuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkLmpzJ1xyXG5cclxuLyoqXHJcbiAqIFN0eWxlIGJhc2VkIG9uIHdlYkdMXHJcbiAqIFRvIHNob3cgY2VsbHMgYXMgY29sb3JlZCBzcXVhcmVzLCB3aXRoIGNvbXB1dGF0aW9uIG9mIHRoZSBjb2xvcnMgb24gR1BVIHNpZGUgKGZhc3RlciB0aGFuIEphdmFTY3JpcHQgc2lkZSkuXHJcbiAqIEFsbHMgc3F1YXJlcyB3aXRoIHRoZSBzYW1lIHNpemVcclxuICpcclxuICogQG1vZHVsZSBzdHlsZVxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3F1YXJlQ29sb3JXZWJHTFN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyBhIHQgdmFsdWUgKHdpdGhpbiBbMCwxXSkgZm9yIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy50RnVuID0gb3B0cy50RnVuIC8vKGMscix6LHZzKSA9PiB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEaXN0cmlidXRpb24gc3RyZXRjaGluZyBtZXRob2QuXHJcbiAgICAgICAgICogVGhlIHN0cmV0Y2hpbmcgaXMgcGVyZm9ybWVkIG9uIEdQVSBzaWRlIChmcmFnbWVudCBzaGFkZXIpLlxyXG4gICAgICAgICAqIEB0eXBlIHt7IGZ1bjpzdHJpbmcsIGFscGhhOm51bWJlciB9fSAqL1xyXG4gICAgICAgIHRoaXMuc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc2FtcGxlIG9mIHRoZSBjb2xvciByYW1wLlxyXG4gICAgICAgICAqIFRoZSBjb2xvciBpcyBjb21wdXRlZCBvbiBHUFUgc2lkZSAoZnJhZ21lbnQgc2hhZGVyKSBiYXNlZCBvbiB0aG9zZSB2YWx1ZXMgKGxpbmVhciBpbnRlcnBvbGF0aW9uKS5cclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPHN0cmluZz59ICovXHJcbiAgICAgICAgdGhpcy5jb2xvcnMgPVxyXG4gICAgICAgICAgICBvcHRzLmNvbG9ycyB8fFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAncmdiKDE1OCwgMSwgNjYpJyxcclxuICAgICAgICAgICAgICAgICdyZ2IoMjQ4LCAxNDIsIDgzKScsXHJcbiAgICAgICAgICAgICAgICAncmdiKDI1MSwgMjQ4LCAxNzYpJyxcclxuICAgICAgICAgICAgICAgICdyZ2IoMTM3LCAyMDcsIDE2NSknLFxyXG4gICAgICAgICAgICAgICAgJ3JnYig5NCwgNzksIDE2MiknLFxyXG4gICAgICAgICAgICBdLnJldmVyc2UoKVxyXG4gICAgICAgIGlmIChvcHRzLmNvbG9yKVxyXG4gICAgICAgICAgICB0aGlzLmNvbG9ycyA9IFtcclxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMCksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuMiksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuNCksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuNiksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuOCksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDEpLFxyXG4gICAgICAgICAgICBdXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERlZmluZSB0aGUgb3BhY2l0eSBvZiB0aGUgc3R5bGUsIHdpdGhpbiBbMCwxXS5cclxuICAgICAgICAgKiBJZiB0aGlzIG9wYWNpdHkgaXMgZGVmaW5lZCwgdGhlIGluZGl2aWR1YWwgY29sb3Igb3BhY2l0eSB3aWxsIGJlIGlnbm9yZWQuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm9wYWNpdHkgPSBvcHRzLm9wYWNpdHkgLy8gKHIseikgPT4gLi4uXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIHRoZSBjZWxscywgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuIEFsbCBjZWxscyBoYXZlIHRoZSBzYW1lIHNpemUuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgLy8gKHJlc29sdXRpb24sIHopID0+IC4uLlxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxyXG5cclxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXHJcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxyXG4gICAgICAgIC8vZm9yIG9wYWNpdHkgY29udHJvbCwgc2VlOiBodHRwczovL3dlYmdsZnVuZGFtZW50YWxzLm9yZy93ZWJnbC9sZXNzb25zL3dlYmdsLWFuZC1hbHBoYS5odG1sXHJcbiAgICAgICAgY29uc3QgY3ZXR0wgPSBtYWtlV2ViR0xDYW52YXMoXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy53ICsgJycsXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5oICsgJycsXHJcbiAgICAgICAgICAgIHRoaXMub3BhY2l0eSAhPSB1bmRlZmluZWQgPyB7IHByZW11bHRpcGxpZWRBbHBoYTogZmFsc2UgfSA6IHVuZGVmaW5lZFxyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoIWN2V0dMKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHdlYkdMJylcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2FkZCB2ZXJ0aWNlIGFuZCBmcmFnbWVudCBkYXRhXHJcbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uIC8gMlxyXG4gICAgICAgIGNvbnN0IHZlcnRpY2VzQnVmZmVyID0gW11cclxuICAgICAgICBjb25zdCB0QnVmZmVyID0gW11cclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLnRGdW4oY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxyXG4gICAgICAgICAgICBpZiAodCA9PSBudWxsIHx8IHQgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxyXG4gICAgICAgICAgICB2ZXJ0aWNlc0J1ZmZlci5wdXNoKGNlbGwueCArIHIyLCBjZWxsLnkgKyByMilcclxuICAgICAgICAgICAgdEJ1ZmZlci5wdXNoKHQgPiAxID8gMSA6IHQgPCAwID8gMCA6IHQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgcGl4ZWwgc2l6ZVxyXG4gICAgICAgIGNvbnN0IHNpemVHZW8gPSB0aGlzLnNpemUgPyB0aGlzLnNpemUocmVzb2x1dGlvbiwgeikgOiByZXNvbHV0aW9uICsgMC4yICogelxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgb3BhY2l0eVxyXG4gICAgICAgIGNvbnN0IG9wID0gdGhpcy5vcGFjaXR5ID8gdGhpcy5vcGFjaXR5KHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY29uc3Qgd2dwID0gbmV3IFdlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZChjdldHTC5nbCwgdGhpcy5jb2xvcnMsIHRoaXMuc3RyZXRjaGluZywgc2l6ZUdlbyAvIHosIG9wKVxyXG5cclxuICAgICAgICAvL2RyYXdcclxuICAgICAgICB3Z3AuZHJhdyh2ZXJ0aWNlc0J1ZmZlciwgdEJ1ZmZlciwgZ2VvQ2FudmFzLmdldFdlYkdMVHJhbnNmb3JtKCkpXHJcblxyXG4gICAgICAgIC8vZHJhdyBpbiBjYW52YXMgZ2VvXHJcbiAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxyXG4gICAgICAgIGdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKGN2V0dMLmNhbnZhcywgMCwgMClcclxuXHJcbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGUgc3R5bGVcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN0cm9rZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAoKCkgPT4gXCIjNjY2XCIpIC8vKGMscix6LHZzKSA9PiB7fVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBzdHJva2UgbGluZSB3aWR0aCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgKChjZWxsLCByZXNvbHV0aW9uLCB6KSA9PiB6ICogMS41KSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaGFwZSBvZiBhIGNlbGwuXHJcbiAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOmltcG9ydChcIi4uL2NvcmUvU3R5bGUuanNcIikuU2hhcGV9ICovXHJcbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgKCgpID0+IFwic3F1YXJlXCIpIC8vKGMscix6LHZzKSA9PiB7fVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBjZWxscyBhcyBzcXVhcmVzLCB3aXRoIHZhcmlvdXMgY29sb3JzIGFuZCBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xyXG5cclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcclxuXHJcbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxyXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxyXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcclxuXHJcbiAgICAgICAgICAgIC8vY29sb3JcclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5zdHJva2VDb2xvciA/IHRoaXMuc3Ryb2tlQ29sb3IoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxyXG5cclxuICAgICAgICAgICAgLy9zaXplIC0gaW4gZ2VvIHVuaXRcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogcmVzb2x1dGlvblxyXG5cclxuICAgICAgICAgICAgLy93aWR0aFxyXG4gICAgICAgICAgICBjb25zdCB3aSA9IHRoaXMuc3Ryb2tlV2lkdGggPyB0aGlzLnN0cm9rZVdpZHRoKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAxICogelxyXG4gICAgICAgICAgICBpZiAoIXdpIHx8IHdpIDw9IDApIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVdpZHRoID0gd2lcclxuXHJcbiAgICAgICAgICAgIC8vc2hhcGVcclxuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLnNoYXBlID8gdGhpcy5zaGFwZShjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogJ3NxdWFyZSdcclxuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgcmVzb2x1dGlvbiwgeilcclxuXHJcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3NxdWFyZScpIHtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBzcXVhcmVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSByZXNvbHV0aW9uICogKDEgLSBzaXplIC8gcmVzb2x1dGlvbikgKiAwLjVcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgucmVjdChjLnggKyBkICsgb2Zmc2V0LmR4LCBjLnkgKyBkICsgb2Zmc2V0LmR5LCBzaXplLCBzaXplKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5hcmMoYy54ICsgcjIgKyBvZmZzZXQuZHgsIGMueSArIHIyICsgb2Zmc2V0LmR5LCBzaXplICogMC41LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkaWFtb25kJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgczIgPSBzaXplICogMC41XHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggKyByMiAtIHMyLCBjLnkgKyByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHIyLCBjLnkgKyByMiArIHMyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54ICsgcjIgKyBzMiwgYy55ICsgcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgLSBzMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHIyIC0gczIsIGMueSArIHIyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZG9udXQnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfdXAnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgLSBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSAtIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguY2xvc2VQYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX2Rvd24nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54ICsgcjIsIGMueSAtIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmNsb3NlUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9sZWZ0Jykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHIyID0gKHNpemUgLSByZXNvbHV0aW9uKSAvIDJcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubW92ZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggLSBkcjIsIGMueSArIHIyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55IC0gZHIyKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5jbG9zZVBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfcmlnaHQnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgLSBkcjIpXHJcbiAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgKyByMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCAtIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguY2xvc2VQYXRoKClcclxuICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgc2hhcGUpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vU2lkZVN0eWxlLmpzJ1xyXG5pbXBvcnQgeyBTcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZSB9IGZyb20gJy4vU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUuanMnXHJcbmltcG9ydCB7IGNsYXNzaWZpZXIgYXMgY2xGdW4sIGNvbG9yQ2xhc3NpZmllciBhcyBjY2xGdW4gfSBmcm9tICcuLi91dGlscy9zY2FsZS5qcydcclxuXHJcbi8qKlxyXG4gKiBAc2VlIGh0dHBzOi8vbWFuaWZvbGQubmV0L2RvYy9tZmQ5L2V4YW1wbGVfX3RhbmFrYV9jb250b3Vycy5odG1cclxuICpcclxuICogQG1vZHVsZSBzdHlsZVxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVGFuYWthU3R5bGUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCk6bnVtYmVyfSB2YWx1ZSBGdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIG9mIGEgY2VsbFxyXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYnJlYWtzIFRoZSBicmVhayB2YWx1ZXNcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNvbG9ycyBUaGUgY29sb3JzLCBvbmUgbW9yZSB0aGFuIHRoZSBicmVhayB2YWx1ZXNcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU3R5bGU+fVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0KHZhbHVlLCBicmVha3MsIGNvbG9ycywgb3B0cyA9IHt9KSB7XHJcblxyXG4gICAgICAgIC8vc2hhZG93IGNvbG9yc1xyXG4gICAgICAgIG9wdHMuY29sb3JEYXJrID0gb3B0cy5jb2xvckRhcmsgfHwgJyMxMTEnXHJcbiAgICAgICAgb3B0cy5jb2xvckJyaWdodCA9IG9wdHMuY29sb3JCcmlnaHQgfHwgJyNkZGQnXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7IGZ1bmN0aW9uKG51bWJlciwgbnVtYmVyKTpudW1iZXIgfSAqL1xyXG4gICAgICAgIG9wdHMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoc2lkZVZhbHVlLCByZXNvbHV0aW9uLCB6KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbldHID0gMSAqIHpcclxuICAgICAgICAgICAgY29uc3QgbWF4V0cgPSA0ICogelxyXG4gICAgICAgICAgICBjb25zdCBzdGVwID0gKG1heFdHIC0gbWluV0cpIC8gM1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4obWluV0cgKyAoc2lkZVZhbHVlIC0gMSkgKiBzdGVwLCBtYXhXRylcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAvL21ha2UgY2xhc3NpZmllclxyXG4gICAgICAgIGNvbnN0IGNsYXNzaWZpZXIgPSBjbEZ1bihicmVha3MpXHJcbiAgICAgICAgLy9tYWtlIGNvbG9ycyB0YWJsZVxyXG4gICAgICAgIGNvbnN0IGNvbG9yc0RpY3QgPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykgY29sb3JzRGljdFtpICsgXCJcIl0gPSBjb2xvcnNbaV1cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbFN0eWxlID0gbmV3IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlKHtcclxuICAgICAgICAgICAgY29kZTogY2VsbCA9PiBjbGFzc2lmaWVyKHZhbHVlKGNlbGwpKSxcclxuICAgICAgICAgICAgY29sb3I6IGNvbG9yc0RpY3RcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBjb25zdCBnZXRTaWRlVmFsdWUgPSAoc2lkZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjbDEgPSBzaWRlLmMxID8gY2xhc3NpZmllcih2YWx1ZShzaWRlLmMxKSkgOiAtMVxyXG4gICAgICAgICAgICBjb25zdCBjbDIgPSBzaWRlLmMyID8gY2xhc3NpZmllcih2YWx1ZShzaWRlLmMyKSkgOiAtMVxyXG4gICAgICAgICAgICByZXR1cm4gY2wxIC0gY2wyXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogVGhlIHNpZGUgc3R5bGUsIGZvciB0aGUgc2hhZG93IGVmZmVjdCAqL1xyXG4gICAgICAgIGNvbnN0IHNpZGVTdHlsZSA9IG5ldyBTaWRlU3R5bGUoe1xyXG4gICAgICAgICAgICAvL3doaXRlIG9yIGJsYWNrLCBkZXBlbmRpbmcgb24gb3JpZW50YXRpb24gYW5kIHZhbHVlXHJcbiAgICAgICAgICAgIGNvbG9yOiAoc2lkZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdiA9IGdldFNpZGVWYWx1ZShzaWRlKVxyXG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IDApIHJldHVyblxyXG4gICAgICAgICAgICAgICAgaWYgKHNpZGUub3IgPT09ICd2JykgcmV0dXJuIHYgPCAwID8gb3B0cy5jb2xvckJyaWdodCA6IG9wdHMuY29sb3JEYXJrXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdiA8IDAgPyBvcHRzLmNvbG9yRGFyayA6IG9wdHMuY29sb3JCcmlnaHRcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLy93aWR0aCBkZXBlbmRzIG9uIHRoZSB2YWx1ZSwgdGhhdCBpcyB0aGUgbnVtYmVyIG9mIGNsYXNzZXMgb2YgZGlmZmVyZW5jZVxyXG4gICAgICAgICAgICB3aWR0aDogKHNpZGUsIHJlc29sdXRpb24sIHopID0+IG9wdHMud2lkdGgoTWF0aC5hYnMoZ2V0U2lkZVZhbHVlKHNpZGUpKSwgcmVzb2x1dGlvbiwgeilcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICByZXR1cm4gW2NlbGxTdHlsZSwgc2lkZVN0eWxlXVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGUgc3R5bGVcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRleHRTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0ZXh0IG9mIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy50ZXh0ID0gb3B0cy50ZXh0IHx8ICgoKSA9PiAnWCcpIC8vKGMscix6LHZzKSA9PiB7fVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gXCJibGFja1wiKSAvLyhjLHIseix2cykgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBmb250IHNpemUgb2YgYSBjZWxsIGluIGdlbyB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuZm9udFNpemUgPSBvcHRzLmZvbnRTaXplIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbikgLy8oYyxyLHosdnMpID0+IHt9XHJcblxyXG4gICAgICAgIC8qKiBUaGUgdGV4dCBmb250IGZhbWlseS5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5mb250RmFtaWx5ID0gb3B0cy5mb250RmFtaWx5IHx8ICgoKSA9PiAnQXJpYWwnKVxyXG5cclxuICAgICAgICAvKiogVGhlIHRleHQgZm9udCB3ZWlnaHQuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuZm9udFdlaWdodCA9IG9wdHMuZm9udFdlaWdodCB8fCAoKCkgPT4gJ2JvbGQnKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBjZWxscyBhcyB0ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xyXG5cclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcclxuXHJcbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxyXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8vZHJhdyB3aXRoIEhUTUwgY2FudmFzXHJcbiAgICAgICAgLy9pbiBzY3JlZW4gY29vcmRpbmF0ZXNcclxuICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgLy9nZXQgY2VsbCB0ZXh0XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnRleHQgPyB0aGlzLnRleHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAodGV4dCA9PSB1bmRlZmluZWQgfHwgdGV4dCA9PSBudWxsIHx8IHRleHQgKyAnJyA9PT0gJycpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL2NvbG9yXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguZmlsbFN0eWxlID0gY29sXHJcblxyXG4gICAgICAgICAgICAvL2ZvbnQgc2l6ZVxyXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBwaXhlbCB1bml0XHJcbiAgICAgICAgICAgIGNvbnN0IGZvbnRTaXplUGl4ID0gdGhpcy5mb250U2l6ZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIC8gelxyXG4gICAgICAgICAgICBpZiAoIWZvbnRTaXplUGl4KSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9zZXQgZm9udFxyXG4gICAgICAgICAgICBjb25zdCBmb250RmFtaWx5ID0gdGhpcy5mb250RmFtaWx5ID8gdGhpcy5mb250RmFtaWx5KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAnQXJpYWwnXHJcbiAgICAgICAgICAgIGNvbnN0IGZvbnRXZWlnaHQgPSB0aGlzLmZvbnRXZWlnaHQgPyB0aGlzLmZvbnRXZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdib2xkJ1xyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmZvbnQgPSBmb250V2VpZ2h0ICsgJyAnICsgZm9udFNpemVQaXggKyAncHggJyArIGZvbnRGYW1pbHlcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxyXG5cclxuICAgICAgICAgICAgLy90ZXh0IHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgudGV4dEFsaWduID0gJ2NlbnRlcidcclxuICAgICAgICAgICAgY29uc3QgdHggPSBnZW9DYW52YXMuZ2VvVG9QaXhYKGNlbGwueCArIHJlc29sdXRpb24gKiAwLjUgKyBvZmZzZXQuZHgpXHJcbiAgICAgICAgICAgIGNvbnN0IHR5ID0gZ2VvQ2FudmFzLmdlb1RvUGl4WShjZWxsLnkgKyByZXNvbHV0aW9uICogMC41ICsgb2Zmc2V0LmR5KSArIGZvbnRTaXplUGl4ICogMC4zIC8vaXQgc2hvdWxkIGJlIDAuNSBidXQgMC4zIHNlZW1zIHRvIHdvcmsgYmV0dGVyXHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgdGhlIHRleHRcclxuICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5maWxsVGV4dCh0ZXh0LCB0eCwgdHkpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCdWlsZCBhIGZ1bmN0aW9uIFswLDFdLT5zdHJpbmcgZm9yIGNoYXJhY3RlcnMgbGVnZW5kXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nPn0gY2hhcnNcclxuICAgICAqIEBwYXJhbSB7KGZ1bmN0aW9uKG51bWJlcik6bnVtYmVyKXx1bmRlZmluZWR9IHNjYWxlXHJcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB0ZXh0U2NhbGUoY2hhcnMsIHNjYWxlID0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3QgbmIgPSBjaGFycy5sZW5ndGhcclxuICAgICAgICByZXR1cm4gKHQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHNjYWxlKSB0ID0gc2NhbGUodClcclxuICAgICAgICAgICAgaWYgKHQgPT0gMCkgcmV0dXJuIFwiXCJcclxuICAgICAgICAgICAgaWYgKHQgPj0gMSkgcmV0dXJuIGNoYXJzW25iIC0gMV1cclxuICAgICAgICAgICAgcmV0dXJuIGNoYXJzW01hdGguZmxvb3IodCAqIG5iKV1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXHJcblxyXG4vKiogQHR5cGVkZWYge1wiZmlyc3RcInxcImJvdHRvbVwifFwiY2VudGVyXCJ8XCJ0b3BcInxcImxhc3RcIn0gQW5jaG9yTW9kZVlFbnVtICovXHJcblxyXG4vKipcclxuICogU2hvdyBjZWxsIGFzIHRpbWVzZXJpZXMgY2hhcnRcclxuICogQ2FuIGJlIHVzZWQgZm9yIHNwYXJrbGluZSBtYXAgb2YgaHR0cHM6Ly9kYXRhZ2lzdGlwcy5oeXBvdGhlc2VzLm9yZy80ODhcclxuICpcclxuICogQG1vZHVsZSBzdHlsZVxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVGltZVNlcmllc1N0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogVGhlIGNvbHVtbnMgb2YgdGhlIHRpbWUgc2VyaWVzLCBvcmRlcmVkIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIuXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxzdHJpbmc+fSAqL1xyXG4gICAgICAgIHRoaXMudHMgPSBvcHRzLnRzXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHNwZWNpZnlpbmcgd2hlbiBhIHZhbHVlIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIFwibm8gZGF0YVwiIGFuZCB0aHVzIG5vdCBpZ25vcmVkLiBUaGUgbGluZSB3aWxsIGhhdmUgYSBicmVhayBhdCB0aGVzZSB2YWx1ZXMuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKHN0cmluZyk6Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLm5vRGF0YSA9IG9wdHMubm9EYXRhIHx8ICgodikgPT4gdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT0gXCJcIiB8fCB2ID09PSBudWxsIHx8IGlzTmFOKCt2KSlcclxuXHJcbiAgICAgICAgLy94XHJcbiAgICAgICAgLyoqIGluIGdlbyB1bml0XHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm9mZnNldFggPSBvcHRzLm9mZnNldFggfHwgKChjLCByLCB6KSA9PiAwKVxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoYywgciwgeikgPT4gcilcclxuXHJcbiAgICAgICAgLy95XHJcbiAgICAgICAgLyoqIGluIGdlbyB1bml0XHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm9mZnNldFkgPSBvcHRzLm9mZnNldFkgfHwgKChjLCByLCB6KSA9PiAwKVxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgKChjLCByLCB6KSA9PiByKVxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6QW5jaG9yTW9kZVlFbnVtfSAqL1xyXG4gICAgICAgIHRoaXMuYW5jaG9yTW9kZVkgPSBvcHRzLmFuY2hvck1vZGVZIHx8ICgoYywgciwgeikgPT4gXCJjZW50ZXJcIilcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgbGluZSwgaW4gZ2VvIHVuaXRcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5saW5lV2lkdGggPSBvcHRzLmxpbmVXaWR0aCB8fCAoKHYsIHIsIHMsIHopID0+IDEuNSAqIHopXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNoYXJ0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gXCJibGFja1wiKSAvLyhjLHIseix2cykgPT4ge31cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XHJcblxyXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcclxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgY2VsbCBhbXBsaXR1ZGVcclxuICAgICAgICBjb25zdCBnZXRBbXBsaXR1ZGUgPSBjID0+IHtcclxuICAgICAgICAgICAgbGV0IG1pbiwgbWF4XHJcbiAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY1t0XTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PSB1bmRlZmluZWQgfHwgdmFsIDwgbWluKSBtaW4gPSB2YWxcclxuICAgICAgICAgICAgICAgIGlmIChtYXggPT0gdW5kZWZpbmVkIHx8IHZhbCA+IG1heCkgbWF4ID0gdmFsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG1pbiA9PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICAgICAgcmV0dXJuIG1heCAtIG1pblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jb21wdXRlIG1heCBhbXBsaXR1ZGVcclxuICAgICAgICBsZXQgYW1wTWF4XHJcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xyXG4gICAgICAgICAgICBjb25zdCBhbXAgPSBnZXRBbXBsaXR1ZGUoYylcclxuICAgICAgICAgICAgaWYgKGFtcCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGlmIChhbXBNYXggPT0gdW5kZWZpbmVkIHx8IGFtcCA+IGFtcE1heCkgYW1wTWF4ID0gYW1wXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghYW1wTWF4KSByZXR1cm5cclxuXHJcbiAgICAgICAgY29uc3QgbmIgPSB0aGlzLnRzLmxlbmd0aFxyXG5cclxuICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVDYXAgPSBcImJ1dHRcIlxyXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcclxuXHJcbiAgICAgICAgICAgIC8vbGluZSB3aWR0aFxyXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy5saW5lV2lkdGggPyB0aGlzLmxpbmVXaWR0aChjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPCAwKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9saW5lIGNvbG9yXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWNvbCkgY29udGludWVcclxuXHJcblxyXG4gICAgICAgICAgICAvL3hcclxuICAgICAgICAgICAgY29uc3Qgb2ZmWCA9IHRoaXMub2Zmc2V0WCA/IHRoaXMub2Zmc2V0WChjLCByZXNvbHV0aW9uLCB6KSA6IDBcclxuICAgICAgICAgICAgaWYgKG9mZlggPT0gdW5kZWZpbmVkIHx8IGlzTmFOKG9mZlgpKSBjb250aW51ZVxyXG4gICAgICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoYywgcmVzb2x1dGlvbiwgeikgOiByZXNvbHV0aW9uXHJcbiAgICAgICAgICAgIGlmICh3ID09IHVuZGVmaW5lZCB8fCBpc05hTih3KSkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8veVxyXG4gICAgICAgICAgICBjb25zdCBvZmZZID0gdGhpcy5vZmZzZXRZID8gdGhpcy5vZmZzZXRZKGMsIHJlc29sdXRpb24sIHopIDogMFxyXG4gICAgICAgICAgICBpZiAob2ZmWSA9PSB1bmRlZmluZWQgfHwgaXNOYU4ob2ZmWSkpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGNvbnN0IGggPSB0aGlzLmhlaWdodCA/IHRoaXMuaGVpZ2h0KGMsIHJlc29sdXRpb24sIHopIDogcmVzb2x1dGlvblxyXG4gICAgICAgICAgICBpZiAoaCA9PSB1bmRlZmluZWQgfHwgaXNOYU4oaCkpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGNvbnN0IGFuY2hZID0gdGhpcy5hbmNob3JNb2RlWSA/IHRoaXMuYW5jaG9yTW9kZVkoYywgcmVzb2x1dGlvbiwgeikgOiBcImNlbnRlclwiXHJcbiAgICAgICAgICAgIGlmICghYW5jaFkpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICBnZW9DYW52YXMuY3R4LmxpbmVXaWR0aCA9IHdHXHJcbiAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcclxuXHJcbiAgICAgICAgICAgIC8vY29tcHV0ZSBhbmNob3IgWSBmaWd1cmVzXHJcbiAgICAgICAgICAgIGxldCB2YWwwLCB5MFxyXG4gICAgICAgICAgICBpZiAoYW5jaFkgPT09IFwiZmlyc3RcIikge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgZmlyc3QgdmFsdWVcclxuICAgICAgICAgICAgICAgIHZhbDAgPSBjW3RoaXMudHNbMF1dXHJcbiAgICAgICAgICAgICAgICB5MCA9IDBcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gXCJsYXN0XCIpIHtcclxuICAgICAgICAgICAgICAgIC8vZ2V0IGxhc3QgdmFsdWVcclxuICAgICAgICAgICAgICAgIHZhbDAgPSBjW3RoaXMudHNbdGhpcy50cy5sZW5ndGggLSAxXV1cclxuICAgICAgICAgICAgICAgIHkwID0gMFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFuY2hZID09PSBcImJvdHRvbVwiKSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBtaW5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9ICtjW3RdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwwID09IHVuZGVmaW5lZCB8fCB2YWwgPCB2YWwwKSB2YWwwID0gdmFsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB5MCA9IDBcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gXCJ0b3BcIikge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgbWF4XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSArY1t0XTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsMCA9PSB1bmRlZmluZWQgfHwgdmFsID4gdmFsMCkgdmFsMCA9IHZhbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgeTAgPSByZXNvbHV0aW9uXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaFkgPT09IFwiY2VudGVyXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vZ2V0IG1pbiBhbmQgbWF4XHJcbiAgICAgICAgICAgICAgICBsZXQgbWluLCBtYXhcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNbdF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbiA9PSB1bmRlZmluZWQgfHwgdmFsIDwgbWluKSBtaW4gPSB2YWxcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWF4ID09IHVuZGVmaW5lZCB8fCB2YWwgPiBtYXgpIG1heCA9IHZhbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFsMCA9ICgrbWF4ICsgK21pbikgKiAwLjVcclxuICAgICAgICAgICAgICAgIHkwID0gcmVzb2x1dGlvbiAvIDJcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5leHBlY3RlZCBhbmNob3JNb2RlWTogXCIgKyBhbmNoWSlcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKi9kcmF3IGxpbmVcclxuICAgICAgICAgICAgaWYgKHZhbDAgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHZhbDApKSBjb250aW51ZVxyXG4gICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgY29uc3Qgc1ggPSB3IC8gKG5iIC0gMSlcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjW3RoaXMudHNbaV1dXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCB8fCBpc05hTih2YWwpKSBicmVha1xyXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gMClcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKGMueCArIGkgKiBzWCArIG9mZlgsIGMueSArIHkwICsgKHZhbCAtIHZhbDApICogaCAvIGFtcE1heCArIG9mZlkpXHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjLnggKyBpICogc1ggKyBvZmZYLCBjLnkgKyB5MCArICh2YWwgLSB2YWwwKSAqIGggLyBhbXBNYXggKyBvZmZZKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKSovXHJcblxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGxpbmUsIHNlZ21lbnQgYnkgc2VnbWVudFxyXG4gICAgICAgICAgICBjb25zdCBzWCA9IHcgLyAobmIgLSAxKVxyXG5cclxuICAgICAgICAgICAgLy9oYW5kbGUgZmlyc3QgcG9pbnRcclxuICAgICAgICAgICAgbGV0IHYwID0gY1t0aGlzLnRzWzBdXVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMubm9EYXRhKHYwKSkge1xyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5tb3ZlVG8oYy54ICsgb2ZmWCwgYy55ICsgeTAgKyAodjAgLSB2YWwwKSAqIGggLyBhbXBNYXggKyBvZmZZKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2codjAsIGlzTmFOKHYwKSlcclxuXHJcbiAgICAgICAgICAgIGxldCB2MVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHYxID0gY1t0aGlzLnRzW2ldXVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IGZyb20gdjAgdG8gdjFcclxuXHJcbiAgICAgICAgICAgICAgICAvL2JvdGggcG9pbnRzICdubyBkYXRhJ1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9EYXRhKHYwKSAmJiB0aGlzLm5vRGF0YSh2MSkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWNvbmQgcG9pbnQgJ25vIGRhdGEnXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm5vRGF0YSh2MCkgJiYgdGhpcy5ub0RhdGEodjEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmN0eC5zdHJva2UoKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL2ZpcnN0IHBvaW50ICdubyBkYXRhJ1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vRGF0YSh2MCkgJiYgIXRoaXMubm9EYXRhKHYxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuY3R4Lm1vdmVUbyhjLnggKyBpICogc1ggKyBvZmZYLCBjLnkgKyB5MCArICh2MSAtIHZhbDApICogaCAvIGFtcE1heCArIG9mZlkpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vYm90aCBwb2ludHMgaGF2ZSBkYXRhOiB0cmFjZSBsaW5lXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5jdHgubGluZVRvKGMueCArIGkgKiBzWCArIG9mZlgsIGMueSArIHkwICsgKHYxIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcclxuICAgICAgICAgICAgICAgICAgICAvL2lmIGl0IGlzIHRoZSBsYXN0IHBvaW50LCBzdHJva2VcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBuYiAtIDEpIGdlb0NhbnZhcy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHYwID0gdjFcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZCwgaWYgYW55XHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXHJcbiAgICB9XHJcblxyXG59XHJcblxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IGluaXRTaGFkZXJQcm9ncmFtLCBjcmVhdGVTaGFkZXIgfSBmcm9tICcuL3dlYkdMVXRpbHMuanMnXHJcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXHJcblxyXG4vKipcclxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cclxuICogQWxsIHRoZSBzYW1lIHNpemUsIGJ1dCBkaWZmZXJlbnQgZmlsbCBjb2xvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBXZWJHTFNxdWFyZUNvbG9yaW5nIHtcclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihnbCwgc2l6ZVBpeCkge1xyXG4gICAgICAgIHRoaXMuZ2wgPSBnbFxyXG4gICAgICAgIHRoaXMuc2l6ZVBpeCA9IHNpemVQaXggfHwgMTAuMFxyXG5cclxuICAgICAgICB0aGlzLnByb2dyYW0gPSBpbml0U2hhZGVyUHJvZ3JhbShcclxuICAgICAgICAgICAgZ2wsXHJcbiAgICAgICAgICAgIGNyZWF0ZVNoYWRlcihcclxuICAgICAgICAgICAgICAgIGdsLFxyXG4gICAgICAgICAgICAgICAgZ2wuVkVSVEVYX1NIQURFUixcclxuICAgICAgICAgICAgICAgIGBcclxuICAgICAgICAgICAgYXR0cmlidXRlIHZlYzIgcG9zO1xyXG4gICAgICAgICAgICB1bmlmb3JtIGZsb2F0IHNpemVQaXg7XHJcbiAgICAgICAgICAgIHVuaWZvcm0gbWF0MyBtYXQ7XHJcbiAgICAgICAgICAgIGF0dHJpYnV0ZSB2ZWM0IGNvbG9yO1xyXG4gICAgICAgICAgICB2YXJ5aW5nIHZlYzQgdkNvbG9yO1xyXG4gICAgICAgICAgICB2b2lkIG1haW4oKSB7XHJcbiAgICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xyXG4gICAgICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XHJcbiAgICAgICAgICAgICAgdkNvbG9yID0gY29sb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIGBcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgY3JlYXRlU2hhZGVyKFxyXG4gICAgICAgICAgICAgICAgZ2wsXHJcbiAgICAgICAgICAgICAgICBnbC5GUkFHTUVOVF9TSEFERVIsXHJcbiAgICAgICAgICAgICAgICBgXHJcbiAgICAgICAgICAgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG4gICAgICAgICAgICB2YXJ5aW5nIHZlYzQgdkNvbG9yO1xyXG4gICAgICAgICAgICB2b2lkIG1haW4odm9pZCkge1xyXG4gICAgICAgICAgICAgICAgdmVjNCB2Q29sb3JfID0gdkNvbG9yIC8gMjU1LjA7XHJcbiAgICAgICAgICAgICAgICB2Q29sb3JfWzNdID0gMjU1LjAgKiB2Q29sb3JfWzNdO1xyXG4gICAgICAgICAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdkNvbG9yXztcclxuICAgICAgICAgICAgfWBcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSlcclxuXHJcbiAgICAgICAgLy9idWZmZXIgZGF0YVxyXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIgPSBbXVxyXG4gICAgICAgIHRoaXMuY29sb3JzQnVmZmVyID0gW11cclxuICAgIH1cclxuXHJcbiAgICAvKiogQWRkIGRhdGEgdG8gdmVydGljZXMvc2l6ZS9jb2xvciBidWZmZXJzIGZvciBjb2xvciBzcXVhcmVzIGRyYXdpbmcgKi9cclxuICAgIGFkZFBvaW50RGF0YSh4QywgeUMsIGNvbCkge1xyXG4gICAgICAgIC8vY29udmVydCBjb2xvclxyXG4gICAgICAgIGNvbnN0IGNjID0gY29sb3IoY29sKVxyXG4gICAgICAgIC8vY29uc3QgY2MgPSB7cjo0NSxnOjg3LGI6OTgsb3BhY2l0eTowLjl9XHJcbiAgICAgICAgaWYgKCFjYykgcmV0dXJuXHJcblxyXG4gICAgICAgIC8vdmVydGljZXNcclxuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyLnB1c2goeEMsIHlDKVxyXG4gICAgICAgIC8vY29sb3JcclxuICAgICAgICB0aGlzLmNvbG9yc0J1ZmZlci5wdXNoKGNjLnIsIGNjLmcsIGNjLmIsIGNjLm9wYWNpdHkpXHJcbiAgICB9XHJcblxyXG4gICAgYWRkUG9pbnREYXRhMih4QywgeUMsIHIsIGcsIGIsIG9wYWNpdHkpIHtcclxuICAgICAgICAvL3ZlcnRpY2VzXHJcbiAgICAgICAgdGhpcy52ZXJ0aWNlc0J1ZmZlci5wdXNoKHhDLCB5QylcclxuICAgICAgICAvL2NvbG9yXHJcbiAgICAgICAgdGhpcy5jb2xvcnNCdWZmZXIucHVzaChyLCBnLCBiLCBvcGFjaXR5KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiAgKi9cclxuICAgIGRyYXcodHJhbnNmb01hdCkge1xyXG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbFxyXG5cclxuICAgICAgICAvL3ZlcnRpY2UgZGF0YVxyXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcclxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh0aGlzLnZlcnRpY2VzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sICdwb3MnKVxyXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXHJcbiAgICAgICAgICAgIHBvc2l0aW9uLFxyXG4gICAgICAgICAgICAyLCAvL251bUNvbXBvbmVudHNcclxuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxyXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcclxuICAgICAgICAgICAgMCwgLy9zdHJpZGVcclxuICAgICAgICAgICAgMCAvL29mZnNldFxyXG4gICAgICAgIClcclxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShwb3NpdGlvbilcclxuXHJcbiAgICAgICAgLy9jb2xvciBkYXRhXHJcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxyXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHRoaXMuY29sb3JzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXHJcbiAgICAgICAgdmFyIGNvbG9yID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnY29sb3InKVxyXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoY29sb3IsIDQsIGdsLkZMT0FULCBmYWxzZSwgMCwgMClcclxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShjb2xvcilcclxuXHJcbiAgICAgICAgLy9zaXplUGl4XHJcbiAgICAgICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHRoaXMuc2l6ZVBpeClcclxuXHJcbiAgICAgICAgLy90cmFuc2Zvcm1hdGlvblxyXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcclxuXHJcbiAgICAgICAgLy8gRW5hYmxlIHRoZSBkZXB0aCB0ZXN0XHJcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XHJcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciBiaXRcclxuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKVxyXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XHJcbiAgICAgICAgLy9nbC52aWV3cG9ydCgwLCAwLCBjZy53LCBjZy5oKTtcclxuXHJcbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHRoaXMudmVydGljZXNCdWZmZXIubGVuZ3RoIC8gMilcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IGluaXRTaGFkZXJQcm9ncmFtLCBjcmVhdGVTaGFkZXIgfSBmcm9tICcuL3dlYkdMVXRpbHMuanMnXHJcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXHJcblxyXG4vKipcclxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cclxuICogQWxsIHRoZSBzYW1lIHNpemUsIGJ1dCBkaWZmZXJlbnQgZmlsbCBjb2xvci5cclxuICogVGhlIGNvbG9yIGludGVycG9sYXRpb24gaXMgY29tcHV0ZWQgaW4gdGhlIGZyYWdtZW50IHNoYWRlciBwcm9ncmFtLCBieSB0aGUgR1BVLCB0aHVzIGl0IGlzIGxlc3MgZmxleGlibGUgYnV0IGZhc3Rlci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBXZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQge1xyXG4gICAgLy9zZWU6XHJcbiAgICAvL2h0dHBzOi8vd2ViZ2xmdW5kYW1lbnRhbHMub3JnL3dlYmdsL2xlc3NvbnMvZnIvd2ViZ2wtc2hhZGVycy1hbmQtZ2xzbC5odG1sI2xlcy11bmlmb3Jtcy1kYW5zLWxlcy1zaGFkZXJzLWRlLXZlcnRleFxyXG4gICAgLy9odHRwczovL3RoZWJvb2tvZnNoYWRlcnMuY29tL2dsb3NzYXJ5Lz9zZWFyY2g9bWl4XHJcbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vMDYvXHJcbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vZ2xvc3NhcnkvXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBnbFxyXG4gICAgICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gY29sb3JzXHJcbiAgICAgKiBAcGFyYW0ge3tmdW46c3RyaW5nLGFscGhhOm51bWJlcn19IHN0cmV0Y2hpbmdcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplUGl4XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcnx1bmRlZmluZWR9IGdsb2JhbE9wYWNpdHlcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoZ2wsIGNvbG9ycywgc3RyZXRjaGluZywgc2l6ZVBpeCA9IDEwLCBnbG9iYWxPcGFjaXR5ID0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9ICovXHJcbiAgICAgICAgdGhpcy5nbCA9IGdsXHJcbiAgICAgICAgLy9nbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRydWUpO1xyXG4gICAgICAgIC8vZ2wuYmxlbmRGdW5jKGdsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XHJcbiAgICAgICAgLy9nbC5ibGVuZEZ1bmMoZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cclxuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKFxyXG4gICAgICAgICAgICBnbCxcclxuICAgICAgICAgICAgZ2wuVkVSVEVYX1NIQURFUixcclxuICAgICAgICAgICAgYFxyXG4gICAgICAgIGF0dHJpYnV0ZSB2ZWMyIHBvcztcclxuICAgICAgICB1bmlmb3JtIGZsb2F0IHNpemVQaXg7XHJcbiAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcclxuXHJcbiAgICAgICAgYXR0cmlidXRlIGZsb2F0IHQ7XHJcbiAgICAgICAgdmFyeWluZyBmbG9hdCB2dDtcclxuXHJcbiAgICAgICAgdm9pZCBtYWluKCkge1xyXG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xyXG4gICAgICAgICAgZ2xfUG9pbnRTaXplID0gc2l6ZVBpeDtcclxuICAgICAgICAgIHZ0ID0gdDtcclxuICAgICAgICB9XHJcbiAgICAgIGBcclxuICAgICAgICApXHJcblxyXG4gICAgICAgIC8vcHJlcGFyZSBmcmFnbWVudCBzaGFkZXIgY29kZVxyXG4gICAgICAgIC8vZGVjbGFyZSB0aGUgdW5pZm9ybSBhbmQgb3RoZXIgdmFyaWFibGVzXHJcbiAgICAgICAgbGV0IGZzaFN0cmluZyA9XHJcbiAgICAgICAgICAgICcnICtcclxuICAgICAgICAgICAgJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xcbicgK1xyXG4gICAgICAgICAgICAndmFyeWluZyBmbG9hdCB2dDtcXG4nICtcclxuICAgICAgICAgICAgJ3VuaWZvcm0gZmxvYXQgYWxwaGE7XFxuJyArXHJcbiAgICAgICAgICAgICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSBbXVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIG91dC5wdXNoKCd1bmlmb3JtIHZlYzQgYycgKyBpICsgJztcXG4nKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dC5qb2luKCcnKVxyXG4gICAgICAgICAgICB9KSgpICtcclxuICAgICAgICAgICAgLy9zdGFydCB0aGUgbWFpbiBmdW5jdGlvbiwgYXBwbHkgdGhlIHN0cmV0Y2hpbmcgb2YgdFxyXG4gICAgICAgICAgICAndm9pZCBtYWluKHZvaWQpIHtcXG4nXHJcblxyXG4gICAgICAgIGlmIChzdHJldGNoaW5nKSB7XHJcbiAgICAgICAgICAgIGlmIChzdHJldGNoaW5nLmZ1biA9PSAncG93JylcclxuICAgICAgICAgICAgICAgIC8vc1BvdyA9ICh0LCBhbHBoYSA9IDMpID0+IE1hdGgucG93KHQsIGFscGhhKTtcclxuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHBvdyh2dCwgYWxwaGEpO1xcbidcclxuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ3Bvd0ludicpXHJcbiAgICAgICAgICAgICAgICAvL3NQb3dSZXYgPSAodCwgYWxwaGEgPSAzKSA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIDEgLyBhbHBoYSk7XHJcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSAxLjAtcG93KDEuMC12dCwgMS4wL2FscGhhKTtcXG4nXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdleHAnKVxyXG4gICAgICAgICAgICAgICAgLy9zRXhwID0gKHQsIGFscGhhID0gMykgPT4gYWxwaGEgPT0gMCA/IHQgOiAoTWF0aC5leHAodCAqIGFscGhhKSAtIDEpIC8gKE1hdGguZXhwKGFscGhhKSAtIDEpO1xyXG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyZXRjaGluZy5hbHBoYSA9PSAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGZsb2F0IHQgPSB2dDtgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJyAgIGZsb2F0IHQgPSAoZXhwKHZ0ICogYWxwaGEpIC0gMS4wKSAvIChleHAoYWxwaGEpIC0gMS4wKTtcXG4nXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdsb2cnKVxyXG4gICAgICAgICAgICAgICAgLy9zRXhwUmV2ID0gKHQsIGFscGhhID0gMykgPT4gYWxwaGEgPT0gMCA/IHQgOiAxIC0gKDEgLyBhbHBoYSkgKiBNYXRoLmxvZyhNYXRoLmV4cChhbHBoYSkgKiAoMSAtIHQpICsgdCk7XHJcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cclxuICAgICAgICAgICAgICAgICAgICBzdHJldGNoaW5nLmFscGhhID09IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZmxvYXQgdCA9IHZ0O2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnICAgZmxvYXQgdCA9IDEuMCAtICgxLjAgLyBhbHBoYSkgKiBsb2coZXhwKGFscGhhKSAqICgxLjAgLSB2dCkgKyB2dCk7XFxuJ1xyXG4gICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcclxuICAgICAgICAgICAgICAgICAgICAvL2lmIChhbHBoYSA9PSAwKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSB2dDtcXG4nXHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGFscGhhID09IDEpIHJldHVybiBNYXRoLnNxcnQoMiAqIHQgLSB0ICogdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gc3FydCh2dCAqICgyLjAgLSB2dCkpO1xcbidcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgYSA9IGFscGhhIC8gKDEgLSBhbHBoYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gTWF0aC5zcXJ0KDEgLyAoYSAqIGEpICsgdCAqICgyIC8gYSArIDIgLSB0KSkgLSAxIC8gYTtcclxuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cclxuICAgICAgICAgICAgICAgICAgICAgICAgJyAgIGZsb2F0IGEgPSBhbHBoYSAvICgxLjAgLSBhbHBoYSk7XFxuJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCB0ID0gc3FydCgxLjAgLyAoYSAqIGEpICsgdnQgKiAoIDIuMC9hICsgMi4wIC0gdnQgKSkgLSAxLjAgLyBhO1xcbidcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAnY2lyY2xlSW52Jykge1xyXG4gICAgICAgICAgICAgICAgLy8gMSAtIHNDaXJjbGVMb3coMSAtIHQsIGFscGhhKVxyXG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcclxuICAgICAgICAgICAgICAgICAgICAvL2lmIChhbHBoYSA9PSAwKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSB2dDtcXG4nXHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGFscGhhID09IDEpIHJldHVybiBNYXRoLnNxcnQoMiAqIHQgLSB0ICogdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gMS4wIC0gc3FydCgoMS4wIC0gdnQpICogKDEuMCArIHZ0KSk7XFxuJ1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBhID0gYWxwaGEgLyAoMSAtIGFscGhhKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyAoMiAqIHQpIC8gYSArIDIgKiB0IC0gdCAqIHQpIC0gMSAvIGE7XHJcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCBhID0gYWxwaGEgLyAoMS4wIC0gYWxwaGEpO1xcbicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgdCA9IDEuMCAtIHNxcnQoMS4wIC8gKGEgKiBhKSArICgxLjAtdnQpICogKCAyLjAvYSArIDEuMCArIHZ0ICkpICsgMS4wIC8gYTtcXG4nXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIHN0cmV0Y2hpbmcgZnVuY3Rpb24gY29kZTogJyArIHN0cmV0Y2hpbmcuZnVuKVxyXG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jaG9vc2UgaW5pdGlhbCBhbmQgZmluYWwgY29sb3JzLCBhbmQgYWRqdXN0IHQgdmFsdWVcclxuICAgICAgICBpZiAoY29sb3JzLmxlbmd0aCA9PSAxKSBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0k9YzA7XFxuICAgdmVjNCBjRj1jMDtcXG4nXHJcbiAgICAgICAgZWxzZSBpZiAoY29sb3JzLmxlbmd0aCA9PSAyKSBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0k9YzA7XFxuICAgdmVjNCBjRj1jMTtcXG4nXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5iID0gY29sb3JzLmxlbmd0aCAtIDFcclxuICAgICAgICAgICAgY29uc3QgbmJzID0gbmIgKyAnLjAnXHJcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgdmVjNCBjSTtcXG4nXHJcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgdmVjNCBjRjtcXG4nXHJcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgaWYodDwxLjAvJyArIG5icyArICcpIHsgY0k9YzA7IGNGPWMxOyB0PXQqJyArIG5icyArICc7IH1cXG4nXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbmI7IGkrKylcclxuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxyXG4gICAgICAgICAgICAgICAgICAgICcgICBlbHNlIGlmKHQ8JyArXHJcbiAgICAgICAgICAgICAgICAgICAgaSArXHJcbiAgICAgICAgICAgICAgICAgICAgJy4wLycgK1xyXG4gICAgICAgICAgICAgICAgICAgIG5icyArXHJcbiAgICAgICAgICAgICAgICAgICAgJykgeyBjST1jJyArXHJcbiAgICAgICAgICAgICAgICAgICAgKGkgLSAxKSArXHJcbiAgICAgICAgICAgICAgICAgICAgJzsgY0Y9YycgK1xyXG4gICAgICAgICAgICAgICAgICAgIGkgK1xyXG4gICAgICAgICAgICAgICAgICAgICc7IHQ9JyArXHJcbiAgICAgICAgICAgICAgICAgICAgbmJzICtcclxuICAgICAgICAgICAgICAgICAgICAnKnQtJyArXHJcbiAgICAgICAgICAgICAgICAgICAgKGkgLSAxKSArXHJcbiAgICAgICAgICAgICAgICAgICAgJy4wOyB9XFxuJ1xyXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz1cclxuICAgICAgICAgICAgICAgICcgICBlbHNlIHsgY0k9YycgKyAobmIgLSAxKSArICc7IGNGPWMnICsgbmIgKyAnOyB0PScgKyBuYnMgKyAnKnQtJyArIChuYiAtIDEpICsgJy4wOyB9XFxuJ1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9vbmUgc2luZ2xlIGNvbG9yXHJcbiAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPT0gMSkgZnNoU3RyaW5nICs9ICcgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGMwWzBdLCBjMFsxXSwgYzBbMl0sIGMwWzNdKTt9XFxuJ1xyXG4gICAgICAgIC8vc2V0IGludGVycG9sYXRlZCBjb2xvciwgYmV0d2VlbiBpbml0aWFsIGFuZCBmaW5hbCBvbmVcclxuICAgICAgICBlbHNlIGZzaFN0cmluZyArPSAnICAgZ2xfRnJhZ0NvbG9yID0gbWl4KGNJLCBjRiwgdCk7fVxcbidcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhmc2hTdHJpbmcpXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xTaGFkZXJ9ICovXHJcbiAgICAgICAgY29uc3QgZlNoYWRlciA9IGNyZWF0ZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmc2hTdHJpbmcpXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfSAqL1xyXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKGdsLCB2U2hhZGVyLCBmU2hhZGVyKVxyXG4gICAgICAgIGdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKVxyXG5cclxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xyXG5cclxuICAgICAgICAvL3NpemVQaXhcclxuICAgICAgICAvL1RPRE86IGJ1ZyBoZXJlLiBTZWVtcyB0byBiZSBsaW1pdGVkIHRvIHNvbWUgdGhyZXNob2xkIHZhbHVlIChhcm91bmQgMjUwKS5cclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3NpemVQaXgnKSwgMS4wICogc2l6ZVBpeClcclxuXHJcbiAgICAgICAgLy9zdHJldGNoaW5nIGFscGhhIGZhY3RvclxyXG4gICAgICAgIGdsLnVuaWZvcm0xZihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnYWxwaGEnKSwgc3RyZXRjaGluZyA/IDEuMCAqIHN0cmV0Y2hpbmcuYWxwaGEgOiAwLjApXHJcblxyXG4gICAgICAgIC8vY29sb3JzXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgYyA9IGNvbG9yKGNvbG9yc1tpXSlcclxuXHJcbiAgICAgICAgICAgIGxldCBvcGFjaXR5ID0gYy5vcGFjaXR5XHJcbiAgICAgICAgICAgIGlmIChjLm9wYWNpdHkgPT0gMSAmJiBnbG9iYWxPcGFjaXR5ICE9IHVuZGVmaW5lZCkgb3BhY2l0eSA9IGdsb2JhbE9wYWNpdHlcclxuXHJcbiAgICAgICAgICAgIGdsLnVuaWZvcm00ZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2MnICsgaSksIFtcclxuICAgICAgICAgICAgICAgICtjLnIgLyAyNTUuMCxcclxuICAgICAgICAgICAgICAgICtjLmcgLyAyNTUuMCxcclxuICAgICAgICAgICAgICAgICtjLmIgLyAyNTUuMCxcclxuICAgICAgICAgICAgICAgICtvcGFjaXR5LFxyXG4gICAgICAgICAgICBdKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogICovXHJcbiAgICBkcmF3KHZlcnRpY2VzQnVmZmVyLCB0QnVmZmVyLCB0cmFuc2ZvTWF0KSB7XHJcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXHJcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHRoaXMucHJvZ3JhbVxyXG5cclxuICAgICAgICAvL3ZlcnRpY2UgZGF0YVxyXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcclxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlc0J1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3BvcycpXHJcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcclxuICAgICAgICAgICAgcG9zaXRpb24sXHJcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xyXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXHJcbiAgICAgICAgICAgIGZhbHNlLCAvL25vcm1hbGlzZVxyXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxyXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XHJcbiAgICAgICAgKVxyXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxyXG5cclxuICAgICAgICAvL3QgZGF0YVxyXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcclxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh0QnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXHJcbiAgICAgICAgY29uc3QgdCA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICd0JylcclxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHQsIDEsIGdsLkZMT0FULCBmYWxzZSwgMCwgMClcclxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0KVxyXG5cclxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXHJcbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcclxuXHJcbiAgICAgICAgLy8gRW5hYmxlIHRoZSBkZXB0aCB0ZXN0XHJcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XHJcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciBiaXRcclxuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKVxyXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XHJcbiAgICAgICAgLy9nbC52aWV3cG9ydCgwLCAwLCBjZy53LCBjZy5oKTtcclxuXHJcbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHZlcnRpY2VzQnVmZmVyLmxlbmd0aCAvIDIpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBpbml0U2hhZGVyUHJvZ3JhbSwgY3JlYXRlU2hhZGVyIH0gZnJvbSAnLi93ZWJHTFV0aWxzLmpzJ1xyXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xyXG5cclxuLyoqXHJcbiAqIEV2ZXJ5dGhpbmcgdG8gZWFzaWx5IGRyYXcgY29sb3JlZCBzcXVhcmVzIHdpdGggd2ViR0wuXHJcbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXHJcbiAqIENvbG9yIGJhc2VkIG9uIGNhdGVnb3JpZXMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nPn0gY29sb3JzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbG9ycykge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cclxuICAgICAgICB0aGlzLmNvbG9ycyA9IGNvbG9yc1xyXG5cclxuICAgICAgICAvKiogVmVjdG9yIHNoYWRlciBwcm9ncmFtXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnZzaFN0cmluZyA9IGBcclxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XHJcbiAgICAgICAgdW5pZm9ybSBmbG9hdCBzaXplUGl4O1xyXG4gICAgICAgIHVuaWZvcm0gbWF0MyBtYXQ7XHJcblxyXG4gICAgICAgIGF0dHJpYnV0ZSBmbG9hdCBpO1xyXG4gICAgICAgIHZhcnlpbmcgZmxvYXQgdmk7XHJcblxyXG4gICAgICAgIHZvaWQgbWFpbigpIHtcclxuICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChtYXQgKiB2ZWMzKHBvcywgMS4wKSwgMS4wKTtcclxuICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XHJcbiAgICAgICAgICB2aSA9IGk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGBcclxuXHJcbiAgICAgICAgLy9wcmVwYXJlIGZyYWdtZW50IHNoYWRlciBjb2RlXHJcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcclxuICAgICAgICBjb25zdCBvdXQgPSBbXVxyXG4gICAgICAgIG91dC5wdXNoKCdwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcXG52YXJ5aW5nIGZsb2F0IHZpO1xcbicpXHJcbiAgICAgICAgLy9hZGQgY29sb3IgdW5pZm9ybXNcclxuICAgICAgICBvdXQucHVzaCgndW5pZm9ybSB2ZWM0JylcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaSA+IDApIG91dC5wdXNoKCcsJylcclxuICAgICAgICAgICAgb3V0LnB1c2goJyBjJyArIGkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG91dC5wdXNoKCc7XFxuJylcclxuICAgICAgICAvL3N0YXJ0IHRoZSBtYWluIGZ1bmN0aW9uXHJcbiAgICAgICAgb3V0LnB1c2goJ3ZvaWQgbWFpbih2b2lkKSB7XFxuJylcclxuICAgICAgICAvL2Nob29zZSBjb2xvciBpXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGkgPiAwKSBvdXQucHVzaCgnZWxzZSAnKVxyXG4gICAgICAgICAgICBvdXQucHVzaCgnaWYodmk9PScpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKGkpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKCcuMCkgZ2xfRnJhZ0NvbG9yID0gdmVjNChjJylcclxuICAgICAgICAgICAgb3V0LnB1c2goaSlcclxuICAgICAgICAgICAgb3V0LnB1c2goJ1swXSwgYycpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKGkpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMV0sIGMnKVxyXG4gICAgICAgICAgICBvdXQucHVzaChpKVxyXG4gICAgICAgICAgICBvdXQucHVzaCgnWzJdLCBjJylcclxuICAgICAgICAgICAgb3V0LnB1c2goaSlcclxuICAgICAgICAgICAgb3V0LnB1c2goJ1szXSk7XFxuJylcclxuICAgICAgICB9XHJcbiAgICAgICAgb3V0LnB1c2goJ2Vsc2UgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApO1xcbn0nKVxyXG4gICAgICAgIC8qKiBGcmFnbWVudCBzaGFkZXIgcHJvZ3JhbVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5mc2hTdHJpbmcgPSBvdXQuam9pbignJylcclxuICAgIH1cclxuXHJcbiAgICAvKiogICovXHJcbiAgICBkcmF3KGdsLCB2ZXJ0aWNlc0J1ZmZlciwgaUJ1ZmZlciwgdHJhbnNmb01hdCwgc2l6ZVBpeCA9IDEwKSB7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cclxuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB0aGlzLnZzaFN0cmluZylcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cclxuICAgICAgICBjb25zdCBmU2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIHRoaXMuZnNoU3RyaW5nKVxyXG5cclxuICAgICAgICAvKiogQHR5cGUge1dlYkdMUHJvZ3JhbX0gKi9cclxuICAgICAgICBjb25zdCBwcm9ncmFtID0gaW5pdFNoYWRlclByb2dyYW0oZ2wsIHZTaGFkZXIsIGZTaGFkZXIpXHJcbiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKVxyXG5cclxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xyXG5cclxuICAgICAgICAvL3NpemVQaXhcclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXHJcblxyXG4gICAgICAgIC8vY29sb3JzXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjID0gY29sb3IodGhpcy5jb2xvcnNbaV0pXHJcbiAgICAgICAgICAgIGdsLnVuaWZvcm00ZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdjJyArIGkpLCBbXHJcbiAgICAgICAgICAgICAgICArYy5yIC8gMjU1LjAsXHJcbiAgICAgICAgICAgICAgICArYy5nIC8gMjU1LjAsXHJcbiAgICAgICAgICAgICAgICArYy5iIC8gMjU1LjAsXHJcbiAgICAgICAgICAgICAgICArYy5vcGFjaXR5LFxyXG4gICAgICAgICAgICBdKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy92ZXJ0aWNlIGRhdGFcclxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXHJcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdwb3MnKVxyXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXHJcbiAgICAgICAgICAgIHBvc2l0aW9uLFxyXG4gICAgICAgICAgICAyLCAvL251bUNvbXBvbmVudHNcclxuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxyXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcclxuICAgICAgICAgICAgMCwgLy9zdHJpZGVcclxuICAgICAgICAgICAgMCAvL29mZnNldFxyXG4gICAgICAgIClcclxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShwb3NpdGlvbilcclxuXHJcbiAgICAgICAgLy9pIGRhdGFcclxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXHJcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoaUJ1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxyXG4gICAgICAgIGNvbnN0IGkgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnaScpXHJcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihpLCAxLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApXHJcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaSlcclxuXHJcbiAgICAgICAgLy90cmFuc2Zvcm1hdGlvblxyXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdtYXQnKSwgZmFsc2UsIG5ldyBGbG9hdDMyQXJyYXkodHJhbnNmb01hdCkpXHJcblxyXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZGVwdGggdGVzdFxyXG4gICAgICAgIC8vZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xyXG4gICAgICAgIC8vIENsZWFyIHRoZSBjb2xvciBidWZmZXIgYml0XHJcbiAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVClcclxuICAgICAgICAvLyBTZXQgdGhlIHZpZXcgcG9ydFxyXG4gICAgICAgIC8vZ2wudmlld3BvcnQoMCwgMCwgY2cudywgY2cuaCk7XHJcblxyXG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCB2ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgZXh0ZW50LCBtYXggfSBmcm9tIFwiZDMtYXJyYXlcIlxyXG5pbXBvcnQgeyBzY2FsZVF1YW50aWxlIH0gZnJvbSBcImQzLXNjYWxlXCJcclxuXHJcbi8qKlxyXG4gKiBBIHNjYWxlIGlzIHNpbXBseSBhIGZ1bmN0aW9uIHRoYXQgbWFwIGEgZG9tYWluIHRvIGEgcmFuZ2UuXHJcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn0gU2NhbGUgKi9cclxuXHJcbi8qKlxyXG4gKiBBIHNjYWxlIHdob3NlIHJhbmdlIGlzIGEgY29sb3IgKHN0cmluZykuXHJcbiogQHR5cGVkZWYge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSBDb2xvclNjYWxlICovXHJcblxyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGUgdXRpbHNcclxuICovXHJcblxyXG5cclxuLyoqXHJcbiAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIHZpZXcgc2NhbGUgLSBjb250aW51b3VzIG9yIGRpc2NyZXRlXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBtaW5WYWx1ZT86bnVtYmVyLCBtaW5TaXplUGl4PzpudW1iZXIsIG1heFNpemVGYWN0b3I/Om51bWJlciwgcmFuZ2U/OltudW1iZXIsIG51bWJlcl0sIGRvbWFpbj86W251bWJlciwgbnVtYmVyXSwgc3RyZXRjaGluZz86ZnVuY3Rpb24obnVtYmVyKTpudW1iZXIsIGNsYXNzTnVtYmVyPzpudW1iZXJ9fSBvcHRzIFxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPik6U2NhbGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlID0gKG9wdHMpID0+IHtcclxuICAgIGNvbnN0IHZhbHVlRnVuY3Rpb24gPSBvcHRzLnZhbHVlRnVuY3Rpb25cclxuICAgIGNvbnN0IG1pblZhbHVlID0gb3B0cy5taW5WYWx1ZSB8fCAwXHJcbiAgICBjb25zdCBtaW5TaXplUGl4ID0gb3B0cy5taW5TaXplUGl4IHx8IDBcclxuICAgIGNvbnN0IG1heFNpemVGYWN0b3IgPSBvcHRzLm1heFNpemVGYWN0b3IgfHwgMVxyXG4gICAgY29uc3Qgc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xyXG4gICAgY29uc3QgcmFuZ2VfID0gb3B0cy5yYW5nZVxyXG4gICAgY29uc3QgZG9tYWluXyA9IG9wdHMuZG9tYWluXHJcbiAgICBjb25zdCBjbGFzc051bWJlciA9IG9wdHMuY2xhc3NOdW1iZXJcclxuICAgIHJldHVybiAoY2VsbHMsIHJlc29sdXRpb24sIHopID0+IHtcclxuICAgICAgICBjb25zdCBkb21haW4gPSBkb21haW5fIHx8IFttaW5WYWx1ZSwgbWF4KGNlbGxzLCB2YWx1ZUZ1bmN0aW9uKV1cclxuICAgICAgICBjb25zdCByYW5nZSA9IHJhbmdlXyB8fCBbbWluU2l6ZVBpeCAqIHosIHJlc29sdXRpb24gKiBtYXhTaXplRmFjdG9yXVxyXG4gICAgICAgIGNvbnN0IGRvbWFpblNpemUgPSBkb21haW5bMV0gLSBkb21haW5bMF0sIGRvbWFpbk1pbiA9IGRvbWFpblswXVxyXG4gICAgICAgIGNvbnN0IHJhbmdlU2l6ZSA9IHJhbmdlWzFdIC0gcmFuZ2VbMF0sIHJhbmdlTWluID0gcmFuZ2VbMF1cclxuICAgICAgICByZXR1cm4gdCA9PiB7XHJcbiAgICAgICAgICAgIC8vc2NhbGUgdG8gWzAsMV1cclxuICAgICAgICAgICAgdCA9ICh0IC0gZG9tYWluTWluKSAvIGRvbWFpblNpemVcclxuICAgICAgICAgICAgLy9zdHJldGNoXHJcbiAgICAgICAgICAgIGlmIChzdHJldGNoaW5nKSB0ID0gc3RyZXRjaGluZyh0KVxyXG4gICAgICAgICAgICAvL2NsYXNzaWZ5XHJcbiAgICAgICAgICAgIGlmIChjbGFzc051bWJlcikgdCA9IHQgPT0gMSA/IDEgOiBNYXRoLmZsb29yKHQgKiAoY2xhc3NOdW1iZXIpKSAvIChjbGFzc051bWJlciAtIDEpXHJcbiAgICAgICAgICAgIC8vc2NhbGUgdG8gcmFuZ2VcclxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlTWluICsgdCAqIHJhbmdlU2l6ZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG4vKipcclxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgdmlldyBzY2FsZSAtIHF1YW50aWxlXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBjbGFzc051bWJlcj86bnVtYmVyLCBtaW5TaXplUGl4PzpudW1iZXIsIG1heFNpemVGYWN0b3I/Om51bWJlciB9fSBvcHRzIFxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPik6U2NhbGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlUXVhbnRpbGUgPSAob3B0cykgPT4ge1xyXG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvblxyXG4gICAgY29uc3QgY2xhc3NOdW1iZXIgPSBvcHRzLmNsYXNzTnVtYmVyIHx8IDEyXHJcbiAgICBjb25zdCBtaW5TaXplUGl4ID0gb3B0cy5taW5TaXplUGl4IHx8IDFcclxuICAgIGNvbnN0IG1heFNpemVGYWN0b3IgPSBvcHRzLm1heFNpemVGYWN0b3IgfHwgMVxyXG4gICAgY29uc3Qgc2NhbGUgPSBzY2FsZVF1YW50aWxlKClcclxuICAgIHJldHVybiAoY2VsbHMsIHJlc29sdXRpb24sIHopID0+IHtcclxuICAgICAgICBzY2FsZS5kb21haW4oY2VsbHMubWFwKHZhbHVlRnVuY3Rpb24pKVxyXG4gICAgICAgIGNvbnN0IG1pblNpemVHZW8gPSBtaW5TaXplUGl4ICogeiwgbWF4U2l6ZUdlbyA9IHJlc29sdXRpb24gKiBtYXhTaXplRmFjdG9yXHJcbiAgICAgICAgc2NhbGUucmFuZ2UoQXJyYXkuZnJvbSh7IGxlbmd0aDogY2xhc3NOdW1iZXIgfSwgKF8sIGkpID0+IG1pblNpemVHZW8gKyBpICogKG1heFNpemVHZW8gLSBtaW5TaXplR2VvKSAvIChjbGFzc051bWJlciAtIDEpKSlcclxuICAgICAgICBzY2FsZS5icmVha3MgPSBzY2FsZS5xdWFudGlsZXMoKVxyXG4gICAgICAgIHNjYWxlLnZhbHVlcyA9IHNjYWxlLnJhbmdlKClcclxuICAgICAgICByZXR1cm4gc2NhbGU7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuLyoqXHJcbiAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIGNvbG9yIHZpZXcgc2NhbGUgLSBjb250aW51b3VzIG9yIGRpc2NyZXRlXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBjb2xvclNjYWxlPzpmdW5jdGlvbihudW1iZXIpOnN0cmluZywgY29sb3JzPzpBcnJheS48c3RyaW5nPiwgc3RyZXRjaGluZz86ZnVuY3Rpb24obnVtYmVyKTpudW1iZXIgfX0gb3B0cyBcclxuICogQHJldHVybnMge2Z1bmN0aW9uKEFycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD4pOkNvbG9yU2NhbGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlQ29sb3IgPSAob3B0cykgPT4ge1xyXG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvblxyXG4gICAgY29uc3Qgc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xyXG4gICAgbGV0IGNvbG9yU2NhbGUgPSBvcHRzLmNvbG9yU2NhbGUgfHwgKCgpID0+IFwicHVycGxlXCIpXHJcblxyXG4gICAgLy9kaXNjcmV0ZSBjb2xvcnMgY2FzZTogYnVpbGQgY29udGludW91cyBjb2xvciBzY2FsZSBmcm9tIGRpc2NyZXRlIG9uZXMuXHJcbiAgICBjb25zdCBuYkNsYXNzID0gb3B0cy5jb2xvcnM/Lmxlbmd0aFxyXG4gICAgaWYgKG9wdHMuY29sb3JzICYmIG5iQ2xhc3MpXHJcbiAgICAgICAgY29sb3JTY2FsZSA9IHQgPT4gb3B0cy5jb2xvcnNbdCA9PSAxID8gbmJDbGFzcyAtIDEgOiBNYXRoLmZsb29yKHQgKiBuYkNsYXNzKV1cclxuXHJcbiAgICByZXR1cm4gKGNlbGxzKSA9PiB7XHJcbiAgICAgICAgaWYgKGNlbGxzLmxlbmd0aCA9PSAwIHx8ICFjZWxscykgcmV0dXJuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtbdW5kZWZpbmVkLCB1bmRlZmluZWRdIHwgW251bWJlciwgbnVtYmVyXX0gKi9cclxuICAgICAgICBjb25zdCBkb21haW4gPSBleHRlbnQoY2VsbHMsIHZhbHVlRnVuY3Rpb24pXHJcbiAgICAgICAgaWYgKGRvbWFpblswXSA9PSB1bmRlZmluZWQpIHJldHVyblxyXG4gICAgICAgIGNvbnN0IGRvbWFpblNpemUgPSBkb21haW5bMV0gLSBkb21haW5bMF1cclxuICAgICAgICBjb25zdCBzY2FsZSA9IHQgPT4ge1xyXG4gICAgICAgICAgICAvL3NjYWxlIHRvIFswLDFdXHJcbiAgICAgICAgICAgIHQgPSAodCAtIGRvbWFpblswXSkgLyBkb21haW5TaXplXHJcbiAgICAgICAgICAgIC8vc3RyZXRjaFxyXG4gICAgICAgICAgICBpZiAoc3RyZXRjaGluZykgdCA9IHN0cmV0Y2hpbmcodClcclxuICAgICAgICAgICAgcmV0dXJuIGNvbG9yU2NhbGUodClcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9mdW5jdGlvbiB0aGF0IHJldHVybiB0aGUgZG9tYWluIHZhbHVlIGZyb20gdGhlIFswLDFdIHJhbmdlLlxyXG4gICAgICAgIHNjYWxlLmludmVydCA9IHQgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc3RyZXRjaGluZykgdCA9IHN0cmV0Y2hpbmcuaW52ZXJ0KHQpXHJcbiAgICAgICAgICAgIHJldHVybiBkb21haW5bMF0gKyB0ICogZG9tYWluU2l6ZVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL2Rpc2NyZXRlIGNvbG9yczogcmV0dXJuIHRoZSBicmVha3NcclxuICAgICAgICBpZiAob3B0cy5jb2xvcnMgJiYgbmJDbGFzcykge1xyXG4gICAgICAgICAgICBzY2FsZS5icmVha3MgPSBbXVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iQ2xhc3M7IGkrKylcclxuICAgICAgICAgICAgICAgIHNjYWxlLmJyZWFrcy5wdXNoKHNjYWxlLmludmVydChpIC8gbmJDbGFzcykpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2NhbGU7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4vKipcclxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgY29sb3IgdmlldyBzY2FsZSAtIHF1YW50aWxlXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBjbGFzc051bWJlcj86bnVtYmVyLCBjb2xvcnM/OkFycmF5LjxzdHJpbmc+LCBjb2xvclNjYWxlPzpmdW5jdGlvbihudW1iZXIpOnN0cmluZyB9fSBvcHRzIFxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPik6Q29sb3JTY2FsZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB2aWV3U2NhbGVDb2xvclF1YW50aWxlID0gKG9wdHMpID0+IHtcclxuICAgIGNvbnN0IHZhbHVlRnVuY3Rpb24gPSBvcHRzLnZhbHVlRnVuY3Rpb25cclxuICAgIGNvbnN0IGNsYXNzTnVtYmVyID0gb3B0cy5jbGFzc051bWJlciB8fCAxMlxyXG5cclxuICAgIGxldCBjb2xvcnMgPSBvcHRzLmNvbG9yc1xyXG4gICAgaWYgKG9wdHMuY29sb3JTY2FsZSkgY29sb3JzID0gZGlzY3JldGVDb2xvcnMob3B0cy5jb2xvclNjYWxlLCBjbGFzc051bWJlcilcclxuICAgIGNvbG9ycyA9IGNvbG9ycyB8fCBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjbGFzc051bWJlciB9LCAoXywgaSkgPT4gXCJyZ2IoXCIgKyBNYXRoLmZsb29yKDI1NSAqIGkgLyAoY2xhc3NOdW1iZXIgLSAxKSkgKyBcIiwxNTAsMTUwKVwiKVxyXG5cclxuICAgIGNvbnN0IHNjYWxlID0gc2NhbGVRdWFudGlsZSgpLnJhbmdlKGNvbG9ycylcclxuICAgIHJldHVybiAoY2VsbHMpID0+IHtcclxuICAgICAgICBzY2FsZS5kb21haW4oY2VsbHMubWFwKHZhbHVlRnVuY3Rpb24pKTtcclxuICAgICAgICBzY2FsZS5icmVha3MgPSBzY2FsZS5xdWFudGlsZXMoKVxyXG4gICAgICAgIHNjYWxlLmNvbG9ycyA9IGNvbG9yc1xyXG4gICAgICAgIHJldHVybiBzY2FsZTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5cclxuLyoqXHJcbiAqIENvbWJpbmUgdmlldyBzY2FsZSBmdW5jdGlvbnNcclxuICogXHJcbiAqIEBwYXJhbSB7Kn0gb2JqIFxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlQ29tYmluYXRpb24gPSAob2JqKSA9PiB7XHJcbiAgICAvL29iajogcHJvcCBhbmQgYSBmdW5jdGlvbiB0byBjYWxsXHJcbiAgICByZXR1cm4gKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3V0ID0ge31cclxuICAgICAgICBmb3IgKGNvbnN0IHAgaW4gb2JqKSB7IG91dFtwXSA9IG9ialtwXShjZWxscywgcmVzb2x1dGlvbiwgeikgfVxyXG4gICAgICAgIHJldHVybiBvdXRcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4vKipcclxuICogUmV0dXJuIGEgY2xhc3NpZmllciBmdW5jdGlvbiBmcm9tIGJyZWFrIHZhbHVlcy5cclxuICogVGhlIGNsYXNzaWZpZXIgZnVuY3Rpb24gcmV0dXJucyB0aGUgY2xhc3MgaWQgKGZyb20gMCB0byBicmVha3MubGVuZ3RoKSBmcm9tIGEgdmFsdWUgdG8gY2xhc3NpZml5LlxyXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBicmVha3MgdGhlIGJyZWFrc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZpZXIoYnJlYWtzKSB7XHJcbiAgICBjb25zdCBibCA9IGJyZWFrcy5sZW5ndGhcclxuICAgIGNvbnN0IGNsYXNzaWZpZXIgPSB2YWx1ZSA9PiB7XHJcbiAgICAgICAgbGV0IGkgPSAwXHJcbiAgICAgICAgd2hpbGUgKGkgPCBibCkge1xyXG4gICAgICAgICAgICBjb25zdCBicmVha18gPSBicmVha3NbaV1cclxuICAgICAgICAgICAgaWYgKHZhbHVlIDw9IGJyZWFrXykgcmV0dXJuIGlcclxuICAgICAgICAgICAgaSsrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpXHJcbiAgICB9XHJcbiAgICBjbGFzc2lmaWVyLmJyZWFrcyA9IGJyZWFrc1xyXG4gICAgcmV0dXJuIGNsYXNzaWZpZXJcclxufVxyXG5cclxuXHJcblxyXG4vKipcclxuICogUmV0dXJuIGEgY29sb3IgY2xhc3NpZmllciBmdW5jdGlvbiBmcm9tIGJyZWFrIHZhbHVlcy5cclxuICogVGhlIGNsYXNzaWZpZXIgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29sb3IgZnJvbSBhIHZhbHVlIHRvIGNsYXNzaWZpeS5cclxuICogVGhlcmUgc2hvdWxkIGJlIG9uZSBjb2xvciBtb3JlIHRoYW4gYnJlYWsgdmFsdWVzLlxyXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBicmVha3MgdGhlIGJyZWFrc1xyXG4gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjb2xvcnMgdGhlIGNvbG9yc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yQ2xhc3NpZmllcihicmVha3MsIGNvbG9ycykge1xyXG4gICAgY29uc3QgY2xhc3NpZmllcl8gPSBjbGFzc2lmaWVyKGJyZWFrcylcclxuICAgIGNvbnN0IGNvbG9yQ2xhc3NpZmllciA9IHZhbHVlID0+IGNvbG9yc1tjbGFzc2lmaWVyXyh2YWx1ZSldXHJcbiAgICBjb2xvckNsYXNzaWZpZXIuYnJlYWtzID0gYnJlYWtzXHJcbiAgICBjb2xvckNsYXNzaWZpZXIuY29sb3JzID0gY29sb3JzXHJcbiAgICByZXR1cm4gY29sb3JDbGFzc2lmaWVyXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBNYWtlIGFycmF5IG9mIGNvbG9ycyBmcm9tIGEgY29sb3JTY2FsZS5cclxuICogSXQgaXMgYSBraW5kIG9mIHNhbXBsaW5nLCBvciB1bi1pbnRlcnBvbGF0aW9uXHJcbiAqIFxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSBjb2xvclNjYWxlIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gbmIgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGlzY3JldGVDb2xvcnMoY29sb3JTY2FsZSwgbmIpIHtcclxuICAgIGlmIChuYiA9PSAxKSByZXR1cm4gW2NvbG9yU2NhbGUoMC41KV1cclxuICAgIGNvbnN0IG91dCA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iOyBpKyspXHJcbiAgICAgICAgb3V0LnB1c2goY29sb3JTY2FsZShpIC8gKG5iIC0gMSkpKVxyXG4gICAgcmV0dXJuIG91dFxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGUgdXRpbHNcclxuICovXHJcblxyXG5cclxuLy9UT0RPIGludmVydCBmb3IgY2lyY3VsYXJcclxuLy9UT0RPIHVzZSBNYXRoLnNxcnRcclxuLy9UT0RPIHZhbGlkYXRlXHJcblxyXG5cclxuLyoqXHJcbiAqIFNvbWUgZnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxyXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ldXJvc3RhdC9ncmlkdml6L2Jsb2IvbWFzdGVyL2RvY3MvcmVmZXJlbmNlLm1kI3N0cmV0Y2hpbmdcclxuICogQHNlZSBodHRwczovL29ic2VydmFibGVocS5jb20vQGpnYWZmdXJpL3N0cmV0Y2hpbmdcclxuICovXHJcblxyXG4vL2lkZW50aXR5IGZ1bmN0aW9uXHJcbmNvbnN0IGlkZW50aXR5ID0gdCA9PiB0XHJcbmlkZW50aXR5LmludmVydCA9IGlkZW50aXR5XHJcblxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlIFxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZXhwb25lbnRpYWxTY2FsZSA9IChiYXNlID0gMykgPT4ge1xyXG4gICAgaWYgKGJhc2UgPT0gMCkgcmV0dXJuIGlkZW50aXR5XHJcbiAgICBjb25zdCBhID0gKE1hdGguZXhwKGJhc2UpIC0gMSlcclxuICAgIGNvbnN0IGYgPSB0ID0+IChNYXRoLmV4cCh0ICogYmFzZSkgLSAxKSAvIGFcclxuICAgIGYuaW52ZXJ0ID0gdCA9PiBNYXRoLmxvZyhhICogdCArIDEpIC8gYmFzZVxyXG4gICAgcmV0dXJuIGZcclxufVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlIFxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbG9nYXJpdGhtaWNTY2FsZSA9IChiYXNlID0gMykgPT4ge1xyXG4gICAgaWYgKGJhc2UgPT0gMCkgcmV0dXJuIGlkZW50aXR5XHJcbiAgICBjb25zdCBhID0gTWF0aC5leHAoYmFzZSksIGIgPSAxIC0gYVxyXG4gICAgY29uc3QgZiA9IHQgPT4gMSAtIE1hdGgubG9nKGEgKyB0ICogYikgLyBiYXNlXHJcbiAgICBmLmludmVydCA9IHQgPT4gKE1hdGguZXhwKCgxIC0gdCkgKiBiYXNlKSAtIGEpIC8gYlxyXG4gICAgcmV0dXJuIGZcclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZXhwb25lbnQgXHJcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb3dlclNjYWxlID0gKGV4cG9uZW50ID0gMykgPT4ge1xyXG4gICAgaWYgKGV4cG9uZW50ID09IDEpIHJldHVybiBpZGVudGl0eVxyXG4gICAgLy9UT0RPIGlmIChleHBvbmVudCA9PSAwLjUpIHJldHVybiBNYXRoLnNxcnRcclxuICAgIGNvbnN0IGYgPSB0ID0+IE1hdGgucG93KHQsIGV4cG9uZW50KVxyXG4gICAgY29uc3QgYSA9IDEgLyBleHBvbmVudFxyXG4gICAgZi5pbnZlcnQgPSB0ID0+IE1hdGgucG93KHQsIGEpXHJcbiAgICByZXR1cm4gZlxyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtudW1iZXJ9IGV4cG9uZW50IFxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcG93ZXJJbnZlcnNlU2NhbGUgPSAoZXhwb25lbnQgPSAzKSA9PiB7XHJcbiAgICBpZiAoZXhwb25lbnQgPT0gMSkgcmV0dXJuIGlkZW50aXR5XHJcbiAgICAvL1RPRE8gaWYgKGV4cG9uZW50ID09IDIpIHJldHVybiB0ID0+IDEgLSBNYXRoLnNxcnQoMSAtIHQpXHJcbiAgICBjb25zdCBhID0gMSAvIGV4cG9uZW50XHJcbiAgICBjb25zdCBmID0gdCA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIGEpXHJcbiAgICBmLmludmVydCA9IHQgPT4gMSAtIE1hdGgucG93KDEgLSB0LCBleHBvbmVudClcclxuICAgIHJldHVybiBmXHJcbn1cclxuXHJcblxyXG5cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY2lyY3VsYXJpdHkgXHJcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjaXJjdWxhclNjYWxlID0gKGNpcmN1bGFyaXR5ID0gMC44KSA9PiB7XHJcbiAgICBpZiAoY2lyY3VsYXJpdHkgPT0gMCkgcmV0dXJuIGlkZW50aXR5XHJcbiAgICBpZiAoY2lyY3VsYXJpdHkgPT0gMSkgcmV0dXJuIHQgPT4gTWF0aC5zcXJ0KHQgKiAoMiAtIHQpKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgY29uc3QgYSA9IGNpcmN1bGFyaXR5IC8gKDEgLSBjaXJjdWxhcml0eSlcclxuICAgICAgICByZXR1cm4gdCA9PiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyB0ICogKDIgLyBhICsgMiAtIHQpKSAtIDEgLyBhXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY2lyY3VsYXJpdHkgXHJcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjaXJjdWxhckludmVyc2VTY2FsZSA9IChjaXJjdWxhcml0eSA9IDAuOCkgPT4ge1xyXG4gICAgaWYgKGNpcmN1bGFyaXR5ID09IDApIHJldHVybiBpZGVudGl0eVxyXG4gICAgY29uc3QgZiA9IGNpcmN1bGFyU2NhbGUoY2lyY3VsYXJpdHkpXHJcbiAgICByZXR1cm4gdCA9PiAxIC0gZigxIC0gdClcclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbi8vdGVzdFxyXG4vKlxyXG5jb25zdCB0ZXN0ID0gKGYsIGZ1biwgYSwgZXJyID0gMWUtMTIpID0+IHtcclxuICAgIGZvciAobGV0IHQgPSAwOyB0IDw9IDE7IHQgKz0gMSAvIDUwKSB7XHJcbiAgICAgICAgY29uc3QgZXIgPSB0IC0gZi5pbnZlcnQoZih0KSlcclxuICAgICAgICBpZiAoTWF0aC5hYnMoZXIpIDwgZXJyKSBjb250aW51ZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKGZ1biwgYSwgZXIpXHJcbiAgICB9XHJcbn1cclxuXHJcbmZvciAobGV0IGZ1biBvZiBbcG93ZXJTY2FsZSwgcG93ZXJJbnZlcnNlU2NhbGVdKVxyXG4gICAgZm9yIChsZXQgZXhwID0gLTMwOyBleHAgPD0gNTA7IGV4cCArPSAxKSB7XHJcbiAgICAgICAgaWYgKGV4cCA9PSAwKSBjb250aW51ZVxyXG4gICAgICAgIGNvbnN0IGYgPSBmdW4oZXhwKVxyXG4gICAgICAgIHRlc3QoZiwgZnVuLCBleHApXHJcbiAgICB9XHJcblxyXG5cclxuZm9yIChsZXQgZnVuIG9mIFtleHBvbmVudGlhbFNjYWxlLCBsb2dhcml0aG1pY1NjYWxlXSlcclxuICAgIGZvciAobGV0IGJhc2UgPSAtMjA7IGJhc2UgPD0gMjA7IGJhc2UgKz0gMSkge1xyXG4gICAgICAgIC8vaWYgKGV4cCA9PSAwKSBjb250aW51ZVxyXG4gICAgICAgIGNvbnN0IGYgPSBmdW4oYmFzZSlcclxuICAgICAgICB0ZXN0KGYsIGZ1biwgYmFzZSwgMWUtMTApXHJcbiAgICB9XHJcbiovIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBpbnRlcnBvbGF0ZUxhYiB9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiXHJcblxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCB0ZXJuYXJ5Q2xhc3NpZmllciA9IChwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBvcHRzID0ge30pID0+IHtcclxuXHJcbiAgICAvL3RoZSB0aHJlZSBwcm9wZXJ0aWVzXHJcbiAgICBjb25zdCBwMCA9IHByb3BlcnRpZXNbMF0sIHAxID0gcHJvcGVydGllc1sxXSwgcDIgPSBwcm9wZXJ0aWVzWzJdXHJcblxyXG4gICAgLy90aGUgY2xhc3NpZmllciBjZW50ZXIgcG9pbnQuIHN1bSBtdXN0IGJlIGVxdWFsIHRvIDFcclxuICAgIGNvbnN0IFtjMCwgYzEsIGMyXSA9IG9wdHMuY2VudGVyIHx8IFsxIC8gMywgMSAvIDMsIDEgLyAzXVxyXG5cclxuICAgIC8vcGFyYW1ldGVyIHRvIGRlY2lkZSB3ZXRoZXIgdG8gdXNlIG1peGVkIGNsYXNzZXMgbTAsIG0xLCBtMi5cclxuICAgIGNvbnN0IHdpdGhNaXhlZENsYXNzZXMgPSBvcHRzLndpdGhNaXhlZENsYXNzZXMgIT0gdW5kZWZpbmVkID8gb3B0cy53aXRoTWl4ZWRDbGFzc2VzIDogdHJ1ZVxyXG5cclxuICAgIC8vcGFyYW1lcnRlciBkZWNpZGUgd2V0aGVyIHRvIHVzZSBhIGNlbnRyYWwgY2xhc3MsIGFuZCB0aGUgc2l6ZSBvZiB0aGlzIGNlbnRyYWwgY2xhc3MuXHJcbiAgICAvL3NldCB0byAwIG9yIHVuZGVmaW5lZCBmb3Igbm90IHNob3dpbmcgYW55IGNlbnRyYWwgY2xhc3MuIFNldCB0byAxIGZvciBhIGNlbnRyYWwgY2xhc3MgdGhhdCBjb250YWlucyB0aGUgbWl4IGNsYXNzZXNcclxuICAgIGNvbnN0IGNjID0gb3B0cy5jZW50ZXJDb2VmZmljaWVudCA/IDEgLSBvcHRzLmNlbnRlckNvZWZmaWNpZW50IDogdW5kZWZpbmVkXHJcblxyXG4gICAgLy90aGUgb3V0cHV0IGNsYXNzaWZpZXIgbWV0aG9kXHJcbiAgICBjb25zdCBmdW4gPSBjID0+IHtcclxuICAgICAgICAvL2dldCB0b3RhbFxyXG4gICAgICAgIGNvbnN0IHRvdCA9IHRvdGFsRnVuY3Rpb24oYylcclxuICAgICAgICBpZiAoIXRvdCkgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgIC8vY29tcHV0ZSBzaGFyZXNcclxuICAgICAgICBjb25zdCBbczAsIHMxLCBzMl0gPSBbK2NbcDBdIC8gdG90LCArY1twMV0gLyB0b3QsICtjW3AyXSAvIHRvdF1cclxuXHJcbiAgICAgICAgLy9jbGFzcyAwXHJcbiAgICAgICAgaWYgKHMwID49IGMwICYmIHMxIDw9IGMxICYmIHMyIDw9IGMyKSB7XHJcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzcyBuZWFyIGNsYXNzIDBcclxuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiAoczIgLSBjMikgKiAoYzEgLSBjYyAqIGMxKSA+PSAoczEgLSBjYyAqIGMxKSAqIChjYyAqIGMyIC0gYzIpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY2VudGVyXCJcclxuICAgICAgICAgICAgcmV0dXJuIFwiMFwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vY2xhc3MgMVxyXG4gICAgICAgIGlmIChzMCA8PSBjMCAmJiBzMSA+PSBjMSAmJiBzMiA8PSBjMikge1xyXG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3MgbmVhciBjbGFzcyAxXHJcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgKHMyIC0gYzIpICogKGMwIC0gY2MgKiBjMCkgPj0gKHMwIC0gY2MgKiBjMCkgKiAoY2MgKiBjMiAtIGMyKSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImNlbnRlclwiXHJcbiAgICAgICAgICAgIHJldHVybiBcIjFcIlxyXG4gICAgICAgIH1cclxuICAgICAgICAvL2NsYXNzIDJcclxuICAgICAgICBpZiAoczAgPD0gYzAgJiYgczEgPD0gYzEgJiYgczIgPj0gYzIpIHtcclxuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzIG5lYXIgY2xhc3MgMlxyXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIChzMSAtIGMxKSAqIChjMCAtIGNjICogYzApID49IChzMCAtIGNjICogYzApICogKGNjICogYzEgLSBjMSkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjZW50ZXJcIlxyXG4gICAgICAgICAgICByZXR1cm4gXCIyXCJcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9taWRkbGUgY2xhc3MgMCAtIGludGVyc2VjdGlvbiBjbGFzcyAxIGFuZCAyXHJcbiAgICAgICAgaWYgKHMwIDw9IGMwICYmIHMxID49IGMxICYmIHMyID49IGMyKSB7XHJcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzc1xyXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIHMwID4gY2MgKiBjMCkgcmV0dXJuIFwiY2VudGVyXCJcclxuICAgICAgICAgICAgaWYgKHdpdGhNaXhlZENsYXNzZXMpIHJldHVybiBcIm0xMlwiXHJcbiAgICAgICAgICAgIHJldHVybiBzMSA+IHMyID8gXCIxXCIgOiBcIjJcIlxyXG4gICAgICAgIH1cclxuICAgICAgICAvL21pZGRsZSBjbGFzcyAxIC0gaW50ZXJzZWN0aW9uIGNsYXNzIDAgYW5kIDFcclxuICAgICAgICBpZiAoczAgPj0gYzAgJiYgczEgPD0gYzEgJiYgczIgPj0gYzIpIHtcclxuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzXHJcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgczEgPiBjYyAqIGMxKSByZXR1cm4gXCJjZW50ZXJcIlxyXG4gICAgICAgICAgICBpZiAod2l0aE1peGVkQ2xhc3NlcykgcmV0dXJuIFwibTAyXCJcclxuICAgICAgICAgICAgcmV0dXJuIHMwID4gczIgPyBcIjBcIiA6IFwiMlwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vbWlkZGxlIGNsYXNzIDIgLSBpbnRlcnNlY3Rpb24gY2xhc3MgMCBhbmQgMVxyXG4gICAgICAgIGlmIChzMCA+PSBjMCAmJiBzMSA+PSBjMSAmJiBzMiA8PSBjMikge1xyXG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3NcclxuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiBzMiA+IGNjICogYzIpIHJldHVybiBcImNlbnRlclwiXHJcbiAgICAgICAgICAgIGlmICh3aXRoTWl4ZWRDbGFzc2VzKSByZXR1cm4gXCJtMDFcIlxyXG4gICAgICAgICAgICByZXR1cm4gczEgPiBzMCA/IFwiMVwiIDogXCIwXCJcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9zaG91bGQgbm90IGhhcHBlblxyXG4gICAgICAgIHJldHVybiBcInVua25vd25cIlxyXG4gICAgfVxyXG5cclxuICAgIC8vYXR0YWNoIGluZm9ybWF0aW9uIHRvIG91dHB1dCBmdW5jdGlvblxyXG4gICAgZnVuLmNlbnRlciA9IFtjMCwgYzEsIGMyXVxyXG4gICAgZnVuLmNlbnRlckNvZWZmaWNpZW50ID0gb3B0cy5jZW50ZXJDb2VmZmljaWVudFxyXG5cclxuICAgIHJldHVybiBmdW5cclxufVxyXG5cclxuXHJcblxyXG5leHBvcnQgY29uc3QgdGVybmFyeUNvbG9yQ2xhc3NpZmllciA9IChwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBjb2xvcnMsIG9wdHMgPSB7fSkgPT4ge1xyXG5cclxuICAgIC8vdGhlIHRocmVlIGNvbG9yc1xyXG4gICAgY29uc3QgW2NvbG9yMCwgY29sb3IxLCBjb2xvcjJdID0gY29sb3JzIHx8IFtcInJlZFwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiXVxyXG5cclxuICAgIC8vdGhlIGNvbG9yIGludGVycG9sYXRpb24gZnVuY3Rpb25cclxuICAgIGNvbnN0IGNvbG9ySW50ZXJwb2xhdGlvbiA9IG9wdHMuY29sb3JJbnRlcnBvbGF0aW9uIHx8IGludGVycG9sYXRlTGFiXHJcblxyXG4gICAgLy9wYXJhbWV0ZXIgdG8gZGVjaWRlIHdldGhlciB0byB1c2UgbWl4ZWQgY2xhc3Nlcy5cclxuICAgIGNvbnN0IHdpdGhNaXhlZENsYXNzZXMgPSBvcHRzLndpdGhNaXhlZENsYXNzZXMgIT0gdW5kZWZpbmVkID8gb3B0cy53aXRoTWl4ZWRDbGFzc2VzIDogdHJ1ZVxyXG4gICAgLy9odHRwczovL2QzanMub3JnL2QzLWludGVycG9sYXRlL2NvbG9yXHJcbiAgICBjb25zdCBtaXhDb2xvckZ1bmN0aW9uID0gKGNvbG9yMSwgY29sb3IyKSA9PiBjb2xvckludGVycG9sYXRpb24oY29sb3IxLCBjb2xvcjIpKDAuNSlcclxuICAgIC8vdGhlIGNvbG9ycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtaXhlZCBjbGFzc2VzXHJcbiAgICBjb25zdCBbbWl4Q29sb3IwLCBtaXhDb2xvcjEsIG1peENvbG9yMl0gPSBvcHRzLm1peGVkQ29sb3JzIHx8IHdpdGhNaXhlZENsYXNzZXMgPyBbbWl4Q29sb3JGdW5jdGlvbihjb2xvcjEsIGNvbG9yMiksIG1peENvbG9yRnVuY3Rpb24oY29sb3IwLCBjb2xvcjIpLCBtaXhDb2xvckZ1bmN0aW9uKGNvbG9yMCwgY29sb3IxKV0gOiBbXVxyXG5cclxuICAgIC8vdGhlIGNlbnRyYWwgY29sb3IsIHVzZWQgZm9yIHRoZSBjZW50cmFsIGNsYXNzLCBpZiBhbnkuIFRoZSBjZW50cmFsIGNsYXNzIGlzIHRoZSBjbGFzcyBvZiByZWxhdGl2ZWx5IGJhbGFuY2VkIHZhbHVlcywgYXJvdW5kIHRoZSBjZW50ZXIgcG9pbnRcclxuICAgIGNvbnN0IGNlbnRlckNvbG9yID0gb3B0cy5jZW50ZXJDb2xvciB8fCBjb2xvckludGVycG9sYXRpb24obWl4Q29sb3JGdW5jdGlvbihjb2xvcjAsIGNvbG9yMSksIGNvbG9yMikoMC4zMzMpXHJcblxyXG4gICAgLy9tYWtlIGNsYXNzaWZpZXJcclxuICAgIGNvbnN0IGNsYXNzaWZpZXIgPSB0ZXJuYXJ5Q2xhc3NpZmllcihwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBvcHRzKVxyXG5cclxuICAgIC8vdGhlIG91dHB1dCBjb2xvciBjbGFzc2lmaWVyIG1ldGhvZFxyXG4gICAgY29uc3QgZnVuID0gYyA9PiB7XHJcbiAgICAgICAgY29uc3QgY2xhID0gY2xhc3NpZmllcihjKVxyXG4gICAgICAgIGlmIChjbGEgPT0gXCIwXCIpIHJldHVybiBjb2xvcjBcclxuICAgICAgICBpZiAoY2xhID09IFwiMVwiKSByZXR1cm4gY29sb3IxXHJcbiAgICAgICAgaWYgKGNsYSA9PSBcIjJcIikgcmV0dXJuIGNvbG9yMlxyXG4gICAgICAgIGlmIChjbGEgPT0gXCJtMTJcIikgcmV0dXJuIG1peENvbG9yMFxyXG4gICAgICAgIGlmIChjbGEgPT0gXCJtMDJcIikgcmV0dXJuIG1peENvbG9yMVxyXG4gICAgICAgIGlmIChjbGEgPT0gXCJtMDFcIikgcmV0dXJuIG1peENvbG9yMlxyXG4gICAgICAgIGlmIChjbGEgPT0gXCJjZW50ZXJcIikgcmV0dXJuIGNlbnRlckNvbG9yXHJcbiAgICAgICAgcmV0dXJuIG9wdHMuZGVmYXVsdENvbG9yIHx8IFwiYmxhY2tcIlxyXG4gICAgfVxyXG4gICAgZnVuLmNlbnRlciA9IGNsYXNzaWZpZXIuY2VudGVyXHJcbiAgICBmdW4uY2VudGVyQ29lZmZpY2llbnQgPSBvcHRzLmNlbnRlckNvZWZmaWNpZW50XHJcbiAgICBmdW4uY29sb3JzID0gW2NvbG9yMCwgY29sb3IxLCBjb2xvcjJdXHJcbiAgICBmdW4ubWl4Q29sb3JzID0gW21peENvbG9yMCwgbWl4Q29sb3IxLCBtaXhDb2xvcjJdXHJcbiAgICBmdW4uY2VudGVyQ29sb3IgPSBjZW50ZXJDb2xvclxyXG4gICAgZnVuLmNsYXNzaWZpZXIgPSBjbGFzc2lmaWVyXHJcblxyXG4gICAgcmV0dXJuIGZ1blxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbi8qXHJcbmNvbnN0IG9yZGVyZWRJbmRleGVzRGVjID0gYXJyID0+IFsuLi5hcnIua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhcnJbYl0gLSBhcnJbYV0pO1xyXG5jb25zdCBvcmRlcmVkSW5kZXhlc0luYyA9IGFyciA9PiBbLi4uYXJyLmtleXMoKV0uc29ydCgoYSwgYikgPT4gYXJyW2FdIC0gYXJyW2JdKTtcclxuXHJcbmV4cG9ydCBjb25zdCB0ZXJuYXJ5Q2xhc3NpZmllciA9IChwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBvcHRzID0ge30pID0+IHtcclxuICAgIGNvbnN0IGxvd1RocmVzaG9sZCA9IG9wdHMubG93VGhyZXNob2xkIHx8IFsxIC8gMywgMSAvIDMsIDEgLyAzXVxyXG4gICAgY29uc3QgaGlnaFRocmVzaG9sZCA9IG9wdHMuaGlnaFRocmVzaG9sZCB8fCBbMiAvIDMsIDIgLyAzLCAyIC8gM11cclxuICAgIGNvbnN0IGNvbG9ycyA9IG9wdHMuY29sb3JzIHx8IFtcInJlZFwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiXVxyXG4gICAgY29uc3QgY29sb3JJbnRlcnBvbGF0aW9uID0gb3B0cy5jb2xvckludGVycG9sYXRpb24gfHwgaW50ZXJwb2xhdGVMYWJcclxuXHJcbiAgICAvL2h0dHBzOi8vZDNqcy5vcmcvZDMtaW50ZXJwb2xhdGUvY29sb3JcclxuICAgIGNvbnN0IG1pZGRsZUNvbG9yRnVuY3Rpb24gPSAoY29sb3IxLCBjb2xvcjIpID0+IGNvbG9ySW50ZXJwb2xhdGlvbihjb2xvcjEsIGNvbG9yMikoMC41KVxyXG4gICAgY29uc3QgbWlkZGxlQ29sb3JzID0gb3B0cy5taWRkbGVDb2xvcnMgfHwgW21pZGRsZUNvbG9yRnVuY3Rpb24oY29sb3JzWzFdLCBjb2xvcnNbMl0pLCBtaWRkbGVDb2xvckZ1bmN0aW9uKGNvbG9yc1swXSwgY29sb3JzWzJdKSwgbWlkZGxlQ29sb3JGdW5jdGlvbihjb2xvcnNbMF0sIGNvbG9yc1sxXSldXHJcbiAgICBjb25zdCBjZW50ZXJDb2xvciA9IG9wdHMuY2VudGVyQ29sb3IgfHwgY29sb3JJbnRlcnBvbGF0aW9uKG1pZGRsZUNvbG9yc1syXSwgY29sb3JzWzJdKSgwLjMzMylcclxuXHJcbiAgICBjb25zdCBoaWdoXyA9IG9yZGVyZWRJbmRleGVzRGVjKGhpZ2hUaHJlc2hvbGQpXHJcbiAgICBjb25zdCBsb3dfID0gb3JkZXJlZEluZGV4ZXNJbmMobG93VGhyZXNob2xkKVxyXG5cclxuICAgIGNvbnN0IHAwID0gcHJvcGVydGllc1swXSwgcDEgPSBwcm9wZXJ0aWVzWzFdLCBwMiA9IHByb3BlcnRpZXNbMl1cclxuICAgIGNvbnN0IGZ1biA9IGMgPT4ge1xyXG4gICAgICAgIC8vZ2V0IHRvdGFsXHJcbiAgICAgICAgY29uc3QgdG90ID0gdG90YWxGdW5jdGlvbihjKVxyXG4gICAgICAgIGlmICghdG90KSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgLy9jb21wdXRlIHNoYXJlc1xyXG4gICAgICAgIGNvbnN0IHNoYXJlcyA9IFsrY1twMF0gLyB0b3QsICtjW3AxXSAvIHRvdCwgK2NbcDJdIC8gdG90XVxyXG4gICAgICAgIC8vcmV0dXJuIGNvbG9yc1xyXG4gICAgICAgIC8vc3RhcnQgZmlyc3Qgd2l0aCB0aGUgZXh0cmVtZSBoaWdoICh0cmlhbmdsZXMpOiBmcm9tIHRoZSBsYXJnZXIgdmFsdWUgKHNtYWxsIHRyaWFuZ2xlKSB0byB0aGUgbG93ZXIgdmFsdWUgKGxhcmdlIHRyaWFuZ2xlKVxyXG4gICAgICAgIGZvciAobGV0IGkgb2YgaGlnaF8pIGlmIChzaGFyZXNbaV0gPiBoaWdoVGhyZXNob2xkW2ldKSByZXR1cm4gY29sb3JzW2ldXHJcbiAgICAgICAgLy90aGVuIGRyYXcgdGhlIGV4dHJlbWUgbG93ICh0cmFwZXppdW1zKTogZnJvbSB0aGUgbG93ZXIgdmFsdWUgKHNtYWxsIHRyYXBleml1bXMpIHRvIHRoZSBsYXJnZXIgdmFsdWVzIChsYXJnZSB0cmFwZXppdW0pXHJcbiAgICAgICAgZm9yIChsZXQgaSBvZiBsb3dfKSBpZiAoc2hhcmVzW2ldIDwgbG93VGhyZXNob2xkW2ldKSByZXR1cm4gbWlkZGxlQ29sb3JzW2ldXHJcbiAgICAgICAgLy9lbHNlIGNlbnRyYWwgY29sb3JcclxuICAgICAgICByZXR1cm4gY2VudGVyQ29sb3JcclxuICAgIH1cclxuICAgIGZ1bi5sb3dUaHJlc2hvbGQgPSBsb3dUaHJlc2hvbGRcclxuICAgIGZ1bi5oaWdoVGhyZXNob2xkID0gaGlnaFRocmVzaG9sZFxyXG4gICAgZnVuLmNvbG9ycyA9IGNvbG9yc1xyXG4gICAgZnVuLm1pZGRsZUNvbG9ycyA9IG1pZGRsZUNvbG9yc1xyXG4gICAgZnVuLmNlbnRlckNvbG9yID0gY2VudGVyQ29sb3JcclxuICAgIGZ1bi5sb3dJbmRleCA9IGxvd19cclxuICAgIGZ1bi5oaWdoSW5kZXggPSBoaWdoX1xyXG4gICAgcmV0dXJuIGZ1blxyXG59XHJcbiovXHJcblxyXG4vKlxyXG5leHBvcnQgY29uc3QgdGVybmFyeUNsYXNzaWZpZXIzID0gKHByb3BlcnRpZXMsIHRvdGFsRnVuY3Rpb24sIG9wdHMgPSB7fSkgPT4ge1xyXG4gICAgY29uc3QgW2EwMSwgYTEyLCBhMjBdID0gb3B0cy50aHJlc2hvbGRzIHx8IFsxLzMsIDEvMywgMS8zXVxyXG4gICAgY29uc3QgW2MwLCBjMSwgYzJdID0gb3B0cy5jb2xvcnMgfHwgW1wicmVkXCIsIFwiZ3JlZW5cIiwgXCJibHVlXCJdXHJcbiAgICBjb25zdCBjZW50ZXJDb2xvciA9IG9wdHMuY2VudGVyQ29sb3IgfHwgXCJncmF5XCJcclxuXHJcbiAgICBjb25zdCBmZmYgPSBhID0+IGEgPT0gMSA/IEluZmluaXR5IDogYSAvICgxIC0gYSlcclxuICAgIGNvbnN0IGMwMSA9IGZmZihhMDEpLCBjMTIgPSBmZmYoYTEyKSwgYzIwID0gZmZmKGEyMClcclxuXHJcbiAgICBjb25zdCBwMCA9IHByb3BlcnRpZXNbMF0sIHAxID0gcHJvcGVydGllc1sxXSwgcDIgPSBwcm9wZXJ0aWVzWzJdXHJcbiAgICBjb25zdCBmdW4gPSBjID0+IHtcclxuICAgICAgICAvL2dldCB0b3RhbFxyXG4gICAgICAgIGNvbnN0IHRvdCA9IHRvdGFsRnVuY3Rpb24oYylcclxuICAgICAgICBpZiAoIXRvdCkgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgIC8vY29tcHV0ZSBzaGFyZXNcclxuICAgICAgICBjb25zdCBbczAsIHMxLCBzMl0gPSBbK2NbcDBdIC8gdG90LCArY1twMV0gLyB0b3QsICtjW3AyXSAvIHRvdF1cclxuICAgICAgICAvL3JldHVybiBjb2xvcnNcclxuICAgICAgICBpZiAoczAgKiBjMDEgPiBzMSAmJiBzMCA+IHMyICogYzIwKSByZXR1cm4gYzBcclxuICAgICAgICBlbHNlIGlmIChzMSA+IHMwICogYzAxICYmIHMxICogYzEyID4gczIpIHJldHVybiBjMVxyXG4gICAgICAgIGVsc2UgaWYgKHMyICogYzIwID4gczAgJiYgczIgPiBzMSAqIGMxMikgcmV0dXJuIGMyXHJcbiAgICAgICAgZWxzZSByZXR1cm4gY2VudGVyQ29sb3JcclxuICAgIH1cclxuICAgIGZ1bi5jb2xvcnMgPSBbYzAsIGMxLCBjMl1cclxuICAgIGZ1bi5jZW50ZXJDb2xvciA9IGNlbnRlckNvbG9yXHJcbiAgICByZXR1cm4gZnVuXHJcbn1cclxuKi9cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKipcclxuICogR2V0IHRoZSBjbGFzcyBpZCBmcm9tIGEgdmFsdWUgYW5kIGNsYXNzIGJyZWFrIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdiB0aGUgdmFsdWVcclxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYnJlYWtzIHRoZSBicmVha3NcclxuICogQHJldHVybnMgVGhlIGNsYXNzIGlkLCBmcm9tIDAgdG8gYnJlYWtzLmxlbmd0aFxyXG4gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0Q2xhc3NpZmllciBpbnN0ZWFkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xhc3ModiwgYnJlYWtzKSB7XHJcbiAgICBpZiAoIWJyZWFrcykgcmV0dXJuXHJcbiAgICBpZiAoYnJlYWtzLmxlbmd0aCA9PSAwKSByZXR1cm4gMFxyXG4gICAgaWYgKHYgPD0gYnJlYWtzWzBdKSByZXR1cm4gMFxyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBicmVha3MubGVuZ3RoOyBpKyspIGlmIChicmVha3NbaSAtIDFdIDwgdiAmJiB2IDw9IGJyZWFrc1tpXSkgcmV0dXJuIGlcclxuICAgIHJldHVybiBicmVha3MubGVuZ3RoXHJcbn1cclxuXHJcblxyXG5cclxuLy90YWtlICduaWNlJyB2YWx1ZSAocG93ZXIgb2YgdGVuLCBvciBtdWx0aXBsZSlcclxuZXhwb3J0IGZ1bmN0aW9uIG5pY2UodiwgbXVsdGlwbGVzID0gWzgsIDYsIDUsIDQsIDIuNSwgMl0pIHtcclxuICAgIC8vY29tcHV0ZSBiaWdnZXIgcG93ZXIgb2YgdGVuIGJlbG93XHJcbiAgICBjb25zdCB2XyA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nMTAodikpKVxyXG4gICAgZm9yIChsZXQgbXVsdGlwbGUgb2YgbXVsdGlwbGVzKVxyXG4gICAgICAgIGlmICh2XyAqIG11bHRpcGxlIDw9IHYpIHJldHVybiB2XyAqIG11bHRpcGxlXHJcbiAgICByZXR1cm4gdl9cclxufVxyXG5cclxuXHJcbi8qXHJcbi8vbm8gbG9uZ2VyIHVzZWRcclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRJbWFnZShzcmMpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsgcmVzb2x2ZShpbWcpOyB9O1xyXG4gICAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZWplY3QobmV3IEVycm9yKCdFcnJvciBsb2FkaW5nIGltYWdlJykpOyB9O1xyXG4gICAgICAgIGltZy5zcmMgPSBzcmM7XHJcbiAgICB9KTtcclxufVxyXG4qL1xyXG5cclxuXHJcbi8qXHJcbmV4cG9ydCBsZXQgbW9uaXRvciA9IGZhbHNlXHJcblxyXG5sZXQgcHJldmlvdXNEYXRlXHJcbmV4cG9ydCBmdW5jdGlvbiBtb25pdG9yRHVyYXRpb24obWVzc2FnZSkge1xyXG4gICAgY29uc3Qgbm93RGF0ZSA9IERhdGUubm93KClcclxuXHJcbiAgICAvL2ZpcnN0IGNhbGxcclxuICAgIGlmICghcHJldmlvdXNEYXRlKSB7XHJcbiAgICAgICAgcHJldmlvdXNEYXRlID0gbm93RGF0ZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKHByZXZpb3VzRGF0ZSwgbWVzc2FnZSlcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkID0gbm93RGF0ZSAtIHByZXZpb3VzRGF0ZVxyXG4gICAgcHJldmlvdXNEYXRlID0gbm93RGF0ZVxyXG4gICAgY29uc29sZS5sb2coZCwgbWVzc2FnZSlcclxufVxyXG4qL1xyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gd2lkdGhcclxuICogQHBhcmFtIHtzdHJpbmd9IGhlaWdodFxyXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gKiBAcmV0dXJucyB7e2NhbnZhczpIVE1MQ2FudmFzRWxlbWVudCwgZ2w6V2ViR0xSZW5kZXJpbmdDb250ZXh0fX1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYWtlV2ViR0xDYW52YXMod2lkdGgsIGhlaWdodCwgb3B0cz17fSkge1xyXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcclxuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgd2lkdGgpXHJcbiAgICBjYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBoZWlnaHQpXHJcbiAgICAvKiogQHR5cGUge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gKi9cclxuICAgIGNvbnN0IGdsID0gY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgb3B0cylcclxuICAgIGlmICghZ2wpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBpbml0aWFsaXplIFdlYkdMLiBZb3VyIGJyb3dzZXIgb3IgbWFjaGluZSBtYXkgbm90IHN1cHBvcnQgaXQuJylcclxuICAgIH1cclxuICAgIHJldHVybiB7IGNhbnZhczogY2FudmFzLCBnbDogZ2wgfVxyXG59XHJcblxyXG4vKipcclxuICogSW5pdGlhbGl6ZSBhIHNoYWRlciBwcm9ncmFtLCBzbyBXZWJHTCBrbm93cyBob3cgdG8gZHJhdyBvdXIgZGF0YVxyXG4gKlxyXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2xcclxuICogQHBhcmFtICB7Li4uV2ViR0xTaGFkZXJ9IHNoYWRlcnNcclxuICogQHJldHVybnMge1dlYkdMUHJvZ3JhbX1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0U2hhZGVyUHJvZ3JhbShnbCwgLi4uc2hhZGVycykge1xyXG4gICAgLyoqIEB0eXBlIHtXZWJHTFByb2dyYW18bnVsbH0gKi9cclxuICAgIGNvbnN0IHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKClcclxuICAgIGlmIChwcm9ncmFtID09IG51bGwpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSB3ZWJHTCBwcm9ncmFtJylcclxuICAgIGZvciAoY29uc3Qgc2hhZGVyIG9mIHNoYWRlcnMpIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBzaGFkZXIpXHJcbiAgICBnbC5saW5rUHJvZ3JhbShwcm9ncmFtKVxyXG4gICAgaWYgKGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpKSByZXR1cm4gcHJvZ3JhbVxyXG4gICAgdGhyb3cgbmV3IEVycm9yKGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pIHx8ICdDYW5ub3QgY3JlYXRlIHdlYkdMIHByb2dyYW0gKDIpJylcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBzaGFkZXIgb2YgdGhlIGdpdmVuIHR5cGUsIHVwbG9hZHMgdGhlIHNvdXJjZSBhbmQgY29tcGlsZXMgaXQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxyXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZVxyXG4gKiBAcGFyYW0gIHsuLi5zdHJpbmd9IHNvdXJjZXNcclxuICogQHJldHVybnMge1dlYkdMU2hhZGVyfVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNoYWRlcihnbCwgdHlwZSwgLi4uc291cmNlcykge1xyXG4gICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcnxudWxsfSAqL1xyXG4gICAgY29uc3Qgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHR5cGUpXHJcbiAgICBpZiAoc2hhZGVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSB3ZWJHTCBzaGFkZXInKVxyXG4gICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlcy5qb2luKCdcXG4nKSlcclxuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKVxyXG4gICAgaWYgKGdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkgcmV0dXJuIHNoYWRlclxyXG4gICAgdGhyb3cgbmV3IEVycm9yKGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKSB8fCAnQ2Fubm90IGNyZWF0ZSB3ZWJHTCBzaGFkZXIgKDIpJylcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHdlYkdMIGlzIHN1cHBvcnRlZFxyXG4gKlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGVja1dlYkdMU3VwcG9ydCgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcclxuICAgICAgICByZXR1cm4gISEoISF3aW5kb3cuV2ViR0xSZW5kZXJpbmdDb250ZXh0ICYmXHJcbiAgICAgICAgICAgIChjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnKSB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJykpKVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbn1cclxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8vIHRoZSBhcHBsaWNhdGlvblxyXG5leHBvcnQgeyBNYXAgfSBmcm9tICcuL2NvcmUvTWFwLmpzJ1xyXG5leHBvcnQgeyBHZW9DYW52YXMgfSBmcm9tICcuL2NvcmUvR2VvQ2FudmFzLmpzJ1xyXG5leHBvcnQgeyBTdHlsZSB9IGZyb20gJy4vY29yZS9TdHlsZS5qcydcclxuZXhwb3J0IHsgTGF5ZXIgfSBmcm9tICcuL2NvcmUvTGF5ZXIuanMnXHJcbmV4cG9ydCB7IERhdGFzZXQgfSBmcm9tICcuL2NvcmUvRGF0YXNldC5qcydcclxuZXhwb3J0IHsgTXVsdGlSZXNvbHV0aW9uRGF0YXNldCB9IGZyb20gJy4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0LmpzJ1xyXG5cclxuLy8gZXhwb3J0IGRhdGFzZXQgdHlwZXNcclxuZXhwb3J0IHsgVGlsZWRHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L1RpbGVkR3JpZC5qcydcclxuZXhwb3J0IHsgQ1NWR3JpZCB9IGZyb20gJy4vZGF0YXNldC9DU1ZHcmlkLmpzJ1xyXG5leHBvcnQgeyBKU0dyaWQgfSBmcm9tICcuL2RhdGFzZXQvSlNHcmlkLmpzJ1xyXG5cclxuLy8gZXhwb3J0IHN0eWxlc1xyXG5leHBvcnQgeyBTaGFwZUNvbG9yU2l6ZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaGFwZUNvbG9yU2l6ZVN0eWxlLmpzJ1xyXG5leHBvcnQgeyBTdHJva2VTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3Ryb2tlU3R5bGUuanMnXHJcbmV4cG9ydCB7IEpveVBsb3RTdHlsZSB9IGZyb20gJy4vc3R5bGUvSm95UGxvdFN0eWxlLmpzJ1xyXG5leHBvcnQgeyBDb21wb3NpdGlvblN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Db21wb3NpdGlvblN0eWxlLmpzJ1xyXG5leHBvcnQgeyBTZWdtZW50U3R5bGUgfSBmcm9tICcuL3N0eWxlL1NlZ21lbnRTdHlsZS5qcydcclxuZXhwb3J0IHsgVGV4dFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9UZXh0U3R5bGUuanMnXHJcbmV4cG9ydCB7IFBpbGxhclN0eWxlIH0gZnJvbSAnLi9zdHlsZS9QaWxsYXJTdHlsZS5qcydcclxuZXhwb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaWRlU3R5bGUuanMnXHJcbi8vZXhwb3J0IHsgQ29udG91clN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Db250b3VyU3R5bGUuanMnXHJcbmV4cG9ydCB7IFNpZGVDYXRlZ29yeVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaWRlQ2F0ZWdvcnlTdHlsZS5qcydcclxuZXhwb3J0IHsgRG90RGVuc2l0eVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Eb3REZW5zaXR5U3R5bGUuanMnXHJcbmV4cG9ydCB7IFRhbmFrYVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9UYW5ha2FTdHlsZS5qcydcclxuZXhwb3J0IHsgTGVnb1N0eWxlIH0gZnJvbSAnLi9zdHlsZS9MZWdvU3R5bGUuanMnXHJcbmV4cG9ydCB7IFNxdWFyZUNvbG9yV2ViR0xTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3F1YXJlQ29sb3JXZWJHTFN0eWxlLmpzJ1xyXG5leHBvcnQgeyBTcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUuanMnXHJcbmV4cG9ydCB7IE1vc2FpY1N0eWxlIH0gZnJvbSAnLi9zdHlsZS9Nb3NhaWNTdHlsZS5qcydcclxuZXhwb3J0IHsgTmluamFTdGFyU3R5bGUgfSBmcm9tICcuL3N0eWxlL05pbmphU3RhclN0eWxlLmpzJ1xyXG5leHBvcnQgeyBUaW1lU2VyaWVzU3R5bGUgfSBmcm9tICcuL3N0eWxlL1RpbWVTZXJpZXNTdHlsZS5qcydcclxuZXhwb3J0IHsgSXNvRmVuY2VTdHlsZSB9IGZyb20gJy4vc3R5bGUvSXNvRmVuY2VTdHlsZS5qcydcclxuZXhwb3J0IHsgSW1hZ2VTdHlsZSB9IGZyb20gJy4vc3R5bGUvSW1hZ2VTdHlsZS5qcydcclxuXHJcbi8vIGV4cG9ydCBhZGRpdGlvbmFsIGxheWVyc1xyXG5leHBvcnQgeyBHcmlkTGF5ZXIgfSBmcm9tICcuL2xheWVyL0dyaWRMYXllci5qcydcclxuZXhwb3J0IHsgQmFja2dyb3VuZExheWVyIH0gZnJvbSAnLi9sYXllci9CYWNrZ3JvdW5kTGF5ZXIuanMnXHJcbmV4cG9ydCB7IEJhY2tncm91bmRMYXllcldNUyB9IGZyb20gJy4vbGF5ZXIvQmFja2dyb3VuZExheWVyV01TLmpzJ1xyXG5leHBvcnQgeyBCYWNrZ3JvdW5kTGF5ZXJJbWFnZSB9IGZyb20gJy4vbGF5ZXIvQmFja2dyb3VuZExheWVySW1hZ2UuanMnXHJcbmV4cG9ydCB7IExhYmVsTGF5ZXIgfSBmcm9tICcuL2xheWVyL0xhYmVsTGF5ZXIuanMnXHJcbmV4cG9ydCB7IEdlb0pTT05MYXllciB9IGZyb20gJy4vbGF5ZXIvR2VvSlNPTkxheWVyLmpzJ1xyXG5cclxuLy8gZXhwb3J0IGxlZ2VuZHNcclxuZXhwb3J0IHsgQ29sb3JMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9Db2xvckxlZ2VuZC5qcydcclxuZXhwb3J0IHsgQ29sb3JEaXNjcmV0ZUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yRGlzY3JldGVMZWdlbmQuanMnXHJcbmV4cG9ydCB7IENvbG9yQ2F0ZWdvcnlMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9Db2xvckNhdGVnb3J5TGVnZW5kLmpzJ1xyXG5leHBvcnQgeyBTaXplTGVnZW5kLCBzaXplTGVnZW5kLCBzaXplTGVnZW5kVmlld1NjYWxlLCBzaXplRGlzY3JldGVMZWdlbmQsIHNpemVEaXNjcmV0ZVZpZXdTY2FsZUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL1NpemVMZWdlbmQuanMnXHJcbmV4cG9ydCB7IE9yaWVudGF0aW9uTGVnZW5kLCBvcmllbnRhdGlvbkxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL09yaWVudGF0aW9uTGVnZW5kLmpzJ1xyXG5leHBvcnQgeyBUZXJuYXJ5TGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvVGVybmFyeUxlZ2VuZC5qcydcclxuXHJcbi8vIGV4cG9ydCB7IGdvVG9TdHJhaWdodCwgem9vbVRvIH0gZnJvbSBcIi4vdXRpbHMvem9vbVV0aWxzXCJcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zdHJldGNoaW5nLmpzJ1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3NjYWxlLmpzJ1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3Rlcm5hcnkuanMnXHJcbmV4cG9ydCB7IG5pY2UgfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xyXG5cclxuaW1wb3J0IHsgR2VvQ2FudmFzIH0gZnJvbSAnLi9jb3JlL0dlb0NhbnZhcy5qcydcclxuZXhwb3J0IGNvbnN0IGdldFBhcmFtZXRlckJ5TmFtZSA9IEdlb0NhbnZhcy5nZXRQYXJhbWV0ZXJCeU5hbWVcclxuXHJcbi8vIHNldCBkZWZhdWx0IGQzIGxvY2FsZVxyXG5pbXBvcnQgeyBmb3JtYXREZWZhdWx0TG9jYWxlIH0gZnJvbSAnZDMtZm9ybWF0J1xyXG5mb3JtYXREZWZhdWx0TG9jYWxlKHtcclxuICAgIGRlY2ltYWw6ICcuJyxcclxuICAgIHRob3VzYW5kczogJyAnLFxyXG4gICAgZ3JvdXBpbmc6IFszXSxcclxuICAgIGN1cnJlbmN5OiBbJycsICfigqwnXSxcclxufSlcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/examples/test/rendering-test.html b/examples/test/rendering-test.html index ffbf191bc..cf20ed602 100644 --- a/examples/test/rendering-test.html +++ b/examples/test/rendering-test.html @@ -41,7 +41,7 @@ const style = new gridviz.ShapeColorSizeStyle({ color: colorFunction }) //add layer to map - map.layers = [new gridviz.GridLayer(dataset, [style], { minPixelsPerCell: 2 })] + map.layers = [new gridviz.GridLayer(dataset, [style], { minPixelsPerCell: 1 })] diff --git a/src/core/Map.js b/src/core/Map.js index 1c90d4bb9..1c04d1644 100644 --- a/src/core/Map.js +++ b/src/core/Map.js @@ -38,7 +38,7 @@ export class Map { } //https://css-tricks.com/absolute-positioning-inside-relative-positioning/ - this.container.style.position = "relative"; // container element must have relative positioning + this.container.style.position = 'relative' // container element must have relative positioning //set dimensions /** @type {number} */ @@ -54,14 +54,15 @@ export class Map { * @type {GeoCanvas} * @private */ this.geoCanvas = new GeoCanvas(this._canvas, opts.x, opts.y, opts.z, opts) - this.geoCanvas.redraw = () => { this.redraw() } + this.geoCanvas.redraw = () => { + this.redraw() + } // legend div this.legendDivId = opts.legendDivId || 'gvizLegend' this.legend = select('#' + this.legendDivId) if (this.legend.empty()) this.initialiseLegend() - //tooltip // set App container as default parent element for tooltip @@ -81,6 +82,9 @@ export class Map { this.geoCanvas.canvas.addEventListener('mousemove', this.mouseMoveHandler) this.geoCanvas.canvas.addEventListener('mouseout', this.mouseOutHandler) + // listen for resize events on the App's container and handle them + this.defineResizeObserver(this.container, this._canvas) + // add extra logic to onZoomStartFun this.geoCanvas.onZoomStartFun = (e) => { if (opts.onZoomStartFun) opts.onZoomStartFun(e) @@ -104,10 +108,10 @@ export class Map { opts.defaultGlobalCompositeOperation || this.geoCanvas.ctx.globalCompositeOperation } - /** - * @protected + /** + * @protected * @returns {HTMLCanvasElement} - */ + */ initialiseCanvas() { const canvas = document.createElement('canvas') canvas.setAttribute('width', '' + this.w) @@ -116,7 +120,6 @@ export class Map { return canvas } - initialiseLegend() { this.legend = select(this.container.id && this.container.id != '' ? '#' + this.container.id : 'body') .append('div') @@ -138,8 +141,8 @@ export class Map { /** * Set/get layer stack. - * - * @param {undefined|import("./Layer.js").Layer|import("./Layer.js").Layer[]} layers + * + * @param {undefined|import("./Layer.js").Layer|import("./Layer.js").Layer[]} layers * @returns { this | import("./Layer.js").Layer[] } */ layers_(layers) { @@ -165,14 +168,12 @@ export class Map { //go through the layers for (const layer of this.layers) { - //check if layer is visible if (layer.visible && !layer.visible(z)) continue //set layer alpha and blend mode this.geoCanvas.ctx.globalAlpha = layer.alpha ? layer.alpha(z) : 1.0 - if (layer.blendOperation) - this.geoCanvas.ctx.globalCompositeOperation = layer.blendOperation(z) + if (layer.blendOperation) this.geoCanvas.ctx.globalCompositeOperation = layer.blendOperation(z) //set affin transform to draw with geographical coordinates this.geoCanvas.setCanvasTransform() @@ -181,24 +182,17 @@ export class Map { layer.draw(this.geoCanvas, this.legend) //draw layer filter - if (layer.filterColor) - layer.drawFilter(this.geoCanvas) + if (layer.filterColor) layer.drawFilter(this.geoCanvas) //restore default alpha and blend operation this.geoCanvas.ctx.globalAlpha = 1.0 this.geoCanvas.ctx.globalCompositeOperation = this.defaultGlobalCompositeOperation } - - // this.canvasSave = null - // listen for resize events on the App's container and handle them - this.defineResizeObserver(this.container, this._canvas) - return this } - /** * @param {number} marginPx * @returns {import('./GeoCanvas.js').Envelope} @@ -208,8 +202,6 @@ export class Map { return this.geoCanvas.updateExtentGeo(marginPx) } - - /** @param {MouseEvent} e */ focusCell(e) { //compute mouse geo position @@ -274,7 +266,6 @@ export class Map { } } - /** * Return the cell HTML info at a given geo position. * This is usefull for user interactions, to show this info where the user clicks for example. @@ -316,8 +307,7 @@ export class Map { } } - - /** + /** * @param {number} x * @param {number} y * @param {number|undefined} z @@ -330,7 +320,9 @@ export class Map { } /** @returns {import('./GeoCanvas.js').View} */ - getView() { return this.geoCanvas.view } + getView() { + return this.geoCanvas.view + } /** @returns {number} */ getZoom() { @@ -342,7 +334,6 @@ export class Map { return this } - /** @returns {Array.} */ getCenterExtent() { return this.geoCanvas.getCenterExtent() @@ -363,8 +354,6 @@ export class Map { return this } - - /** @returns {string} */ getBackgroundColor() { return this.geoCanvas.backgroundColor @@ -395,7 +384,7 @@ export class Map { x: opts?.x, y: opts?.y, onZoom: opts?.onZoom, - delta: opts?.delta || 0.2 + delta: opts?.delta || 0.2, }) return this @@ -418,7 +407,7 @@ export class Map { id: opts?.id || 'gridviz-fullscreen-button', class: opts?.class, x: opts?.x, - y: opts?.y + y: opts?.y, }) return this