(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.CanvasJS = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0) { //ctx.strokeStyle = "#4572A7 "; var color = dataSeries._colorSet[i % dataSeries._colorSet.length]; //ctx.strokeStyle = "red"; ctx.fillStyle = color; ctx.strokeStyle = color; ctx.lineWidth = dataSeries.lineThickness; if (ctx.setLineDash) { ctx.setLineDash((0, _utils.getLineDashArray)(dataSeries.lineDashType, dataSeries.lineThickness)); } var prevDataNull = true; for (; i < dataPoints.length; i++) { dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (typeof dataPoints[i].y !== "number") { closeArea(); prevDataNull = true; continue; } x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; if (isFirstDataPointInPlotArea || prevDataNull) { ctx.beginPath(); ctx.moveTo(x, y); startPoint = { x: x, y: y }; if (_utils.isCanvasSupported) { ghostCtx.beginPath(); ghostCtx.moveTo(x, y); } isFirstDataPointInPlotArea = false; prevDataNull = false; } else { ctx.lineTo(x, y); if (_utils.isCanvasSupported) ghostCtx.lineTo(x, y); if (i % 250 == 0) { closeArea(); } } var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y }; //Render Marker if (dataPoints[i].markerSize !== 0) { if (dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0) { var markerProps = dataSeries.getMarkerProperties(i, x, y, ctx); markers.push(markerProps); //if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) { // dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //} var markerColor = (0, _utils.intToHexColorString)(id); if (_utils.isCanvasSupported) { markers.push({ x: x, y: y, ctx: ghostCtx, type: markerProps.type, size: markerProps.size, color: markerColor, borderColor: markerColor, borderThickness: markerProps.borderThickness }); } } } if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "area", dataPoint: dataPoints[i], dataSeries: dataSeries, point: { x: x, y: y }, direction: dataPoints[i].y >= 0 ? 1 : -1, color: color }); } } closeArea(); //startPoint = { x: x, y: y }; _render2.default.drawMarkers(markers); } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); function closeArea() { if (!startPoint) return; if (dataSeries.lineThickness > 0) ctx.stroke(); if (plotUnit.axisY.viewportMinimum <= 0 && plotUnit.axisY.viewportMaximum >= 0) { baseY = yZeroToPixel; } else if (plotUnit.axisY.viewportMaximum < 0) baseY = axisYProps.y1;else if (plotUnit.axisY.viewportMinimum > 0) baseY = axisXProps.y2; ctx.lineTo(x, baseY); ctx.lineTo(startPoint.x, baseY); ctx.closePath(); ctx.globalAlpha = dataSeries.fillOpacity; ctx.fill(); ctx.globalAlpha = 1; if (_utils.isCanvasSupported) { ghostCtx.lineTo(x, baseY); ghostCtx.lineTo(startPoint.x, baseY); ghostCtx.closePath(); ghostCtx.fill(); } ctx.beginPath(); ctx.moveTo(x, y); ghostCtx.beginPath(); ghostCtx.moveTo(x, y); startPoint = { x: x, y: y }; } //source and dest would be same when animation is not enabled var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: _animator2.default.xClipAnimation, easingFunction: _animator2.default.easing.linear, animationBase: 0 }; return animationInfo; }; var _render = require('../helpers/render'); var _render2 = _interopRequireDefault(_render); var _animator = require('../helpers/animator'); var _animator2 = _interopRequireDefault(_animator); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } },{"../helpers/animator":37,"../helpers/render":38,"../helpers/utils":39}],2:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var color = null; var plotArea = this.plotArea; var i = 0, x, y; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number from dataTime everytime it is used. //In case of Bar Chart, yZeroToPixel is x co-ordinate! var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0; var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : Math.min(this.height * .15, this.plotArea.height / plotUnit.plotType.totalDataSeries * .9) << 0; var xMinDiff = plotUnit.axisX.dataInfo.minDiff; //var barWidth = (((plotArea.height / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum)) * Math.abs(xMinDiff)) / totalDataSeries * .9) << 0; var barWidth = plotArea.height / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.totalDataSeries * .9 << 0; if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) { barWidth = maxBarWidth / plotUnit.plotType.totalDataSeries * .9; } else if (barWidth < 1) barWidth = 1; ctx.save(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); this._eventManager.ghostCtx.clip(); } for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var isFirstDataPointInPlotArea = true; //dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); if (dataPoints.length > 0) { //var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y); var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false; ctx.strokeStyle = "#4572A7 "; for (i = 0; i < dataPoints.length; i++) { dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (typeof dataPoints[i].y !== "number") continue; //x and y are pixel co-ordinates of point and should not be confused with X and Y values y = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; x = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; var y1 = y - plotUnit.plotType.totalDataSeries * barWidth / 2 + (plotUnit.previousDataSeriesCount + j) * barWidth << 0; var y2 = y1 + barWidth << 0; var x1; var x2; if (dataPoints[i].y >= 0) { x1 = yZeroToPixel; x2 = x; } else { x1 = x; x2 = yZeroToPixel; } //drawRect(ctx, x1, y1, plotArea.x2, y2, "#EEEEEE", 0, null, false, false, false, false); //drawRect(ctx, x1, y1, plotArea.x2, y2, "#BDCED3", 0, null, false, false, false, false); color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length]; //color = "#1B4962"; (0, _utils.drawRect)(ctx, x1, y1, x2, y2, color, 0, null, bevelEnabled, false, false, false, dataSeries.fillOpacity); var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2 }; color = (0, _utils.intToHexColorString)(id); if (_utils.isCanvasSupported) (0, _utils.drawRect)(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false); if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) this._indexLabels.push({ chartType: "bar", dataPoint: dataPoints[i], dataSeries: dataSeries, point: { x: dataPoints[i].y >= 0 ? x2 : x1, y: y1 + (y2 - y1) / 2 }, direction: dataPoints[i].y >= 0 ? 1 : -1, bounds: { x1: Math.min(x1, x2), y1: y1, x2: Math.max(x1, x2), y2: y2 }, color: color }); } } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); //source and dest would be same when animation is not enabled var animationBase = Math.max(yZeroToPixel, plotUnit.axisX.boundingRect.x2); var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: _animator2.default.xScaleAnimation, easingFunction: _animator2.default.easing.easeOutQuart, animationBase: animationBase }; return animationInfo; }; var _animator = require('../helpers/animator'); var _animator2 = _interopRequireDefault(_animator); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } },{"../helpers/animator":37,"../helpers/utils":39}],3:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var color = null; var plotArea = this.plotArea; var i = 0, x, y; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number from dataTime everytime it is used. var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0; var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0; var xMinDiff = plotUnit.axisX.dataInfo.minDiff; var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / totalDataSeries * .9 << 0; ctx.save(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); this._eventManager.ghostCtx.clip(); } var maxZ = -Infinity; var minZ = Infinity; for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var z = 0; for (var i = 0; i < dataPoints.length; i++) { dataPointX = dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (typeof dataPoints[i].z !== "undefined") { z = dataPoints[i].z; if (z > maxZ) maxZ = z; if (z < minZ) minZ = z; } } } var minArea = Math.PI * 5 * 5; var maxArea = Math.max(Math.pow(Math.min(plotArea.height, plotArea.width) * .25 / 2, 2) * Math.PI, minArea); for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var isFirstDataPointInPlotArea = true; if (dataPoints.length == 1) barWidth = maxBarWidth; if (barWidth < 1) barWidth = 1;else if (barWidth > maxBarWidth) barWidth = maxBarWidth; if (dataPoints.length > 0) { //var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y); //var bevelEnabled = (barWidth > 5) ? false : false; ctx.strokeStyle = "#4572A7 "; for (var i = 0; i < dataPoints.length; i++) { dataPointX = dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (typeof dataPoints[i].y !== "number") continue; x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; var z = dataPoints[i].z; var area = maxZ === minZ ? maxArea / 2 : minArea + (maxArea - minArea) / (maxZ - minZ) * (z - minZ); var radius = Math.max(Math.sqrt(area / Math.PI) << 0, 1); var markerSize = radius * 2; var markerProps = dataSeries.getMarkerProperties(i, ctx); markerProps.size = markerSize; ctx.globalAlpha = dataSeries.fillOpacity; _render2.default.drawMarker(x, y, ctx, markerProps.type, markerProps.size, markerProps.color, markerProps.borderColor, markerProps.borderThickness); ctx.globalAlpha = 1; var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y, size: markerSize }; var markerColor = (0, _utils.intToHexColorString)(id); //RenderHelper.drawMarker(x, y, this._eventManager.ghostCtx, markerType, markerSize, markerColor, markerColor, dataSeries.markerBorderThickness); if (_utils.isCanvasSupported) _render2.default.drawMarker(x, y, this._eventManager.ghostCtx, markerProps.type, markerProps.size, markerColor, markerColor, markerProps.borderThickness); if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "bubble", dataPoint: dataPoints[i], dataSeries: dataSeries, point: { x: x, y: y }, direction: 1, bounds: { x1: x - markerProps.size / 2, y1: y - markerProps.size / 2, x2: x + markerProps.size / 2, y2: y + markerProps.size / 2 }, color: color }); } } } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); //source and dest would be same when animation is not enabled var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: _animator2.default.fadeInAnimation, easingFunction: _animator2.default.easing.easeInQuad, animationBase: 0 }; return animationInfo; }; var _render = require('../helpers/render'); var _render2 = _interopRequireDefault(_render); var _animator = require('../helpers/animator'); var _animator2 = _interopRequireDefault(_animator); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } },{"../helpers/animator":37,"../helpers/render":38,"../helpers/utils":39}],4:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var ghostCtx = this._eventManager.ghostCtx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var color = null; var plotArea = this.plotArea; var i = 0, x, y1, y2, y3, y4; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number from dataTime everytime it is used. var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0; var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .015; var xMinDiff = plotUnit.axisX.dataInfo.minDiff; var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) * .7 << 0; if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) { barWidth = maxBarWidth; } else if (barWidth < 1) barWidth = 1; ctx.save(); if (_utils.isCanvasSupported) ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ghostCtx.clip(); } //ctx.beginPath(); for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var isFirstDataPointInPlotArea = true; // Reducing pixelPerUnit by 1 just to overcome any problems due to rounding off of pixels. //dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //var offsetX = barWidth * plotUnit.index << 0; if (dataPoints.length > 0) { //var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y); var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false; for (i = 0; i < dataPoints.length; i++) { dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (dataPoints[i].y === null || !dataPoints[i].y.length || typeof dataPoints[i].y[0] !== "number" || typeof dataPoints[i].y[1] !== "number" || typeof dataPoints[i].y[2] !== "number" || typeof dataPoints[i].y[3] !== "number") continue; x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; y1 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[0] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; y2 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[1] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; y3 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[2] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; y4 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[3] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; var x1 = x - barWidth / 2 << 0; var x2 = x1 + barWidth << 0; color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[0]; //var borderThickness = Math.max(2, ((barWidth * .1) / 2 << 0) * 2); // Set only even numbers for border var borderThickness = Math.round(Math.max(1, barWidth * .15)); //borderThickness = (borderThickness / 2 << 0) * 2; //borderThickness = 2; var offset = borderThickness % 2 === 0 ? 0 : .5; var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2, x3: x, y3: y3, x4: x, y4: y4, borderThickness: borderThickness, color: color }; ctx.strokeStyle = color; ctx.beginPath(); ctx.lineWidth = borderThickness; ghostCtx.lineWidth = Math.max(borderThickness, 4); if (dataSeries.type === "candlestick") { ctx.moveTo(x - offset, y2); ctx.lineTo(x - offset, Math.min(y1, y4)); ctx.stroke(); ctx.moveTo(x - offset, Math.max(y1, y4)); ctx.lineTo(x - offset, y3); ctx.stroke(); drawRect(ctx, x1, Math.min(y1, y4), x2, Math.max(y1, y4), dataPoints[i].y[0] <= dataPoints[i].y[3] ? dataSeries.risingColor : color, borderThickness, color, bevelEnabled, bevelEnabled, false, false, dataSeries.fillOpacity); if (_utils.isCanvasSupported) { color = intToHexColorString(id); ghostCtx.strokeStyle = color; ghostCtx.moveTo(x - offset, y2); ghostCtx.lineTo(x - offset, Math.min(y1, y4)); ghostCtx.stroke(); ghostCtx.moveTo(x - offset, Math.max(y1, y4)); ghostCtx.lineTo(x - offset, y3); ghostCtx.stroke(); drawRect(ghostCtx, x1, Math.min(y1, y4), x2, Math.max(y1, y4), color, 0, null, false, false, false, false); } } else if (dataSeries.type === "ohlc") { ctx.moveTo(x - offset, y2); ctx.lineTo(x - offset, y3); ctx.stroke(); ctx.beginPath(); ctx.moveTo(x, y1); ctx.lineTo(x1, y1); ctx.stroke(); ctx.beginPath(); ctx.moveTo(x, y4); ctx.lineTo(x2, y4); ctx.stroke(); if (_utils.isCanvasSupported) { color = intToHexColorString(id); ghostCtx.strokeStyle = color; ghostCtx.moveTo(x - offset, y2); ghostCtx.lineTo(x - offset, y3); ghostCtx.stroke(); ghostCtx.beginPath(); ghostCtx.moveTo(x, y1); ghostCtx.lineTo(x1, y1); ghostCtx.stroke(); ghostCtx.beginPath(); ghostCtx.moveTo(x, y4); ghostCtx.lineTo(x2, y4); ghostCtx.stroke(); } } if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: dataSeries.type, dataPoint: dataPoints[i], dataSeries: dataSeries, point: { x: x1 + (x2 - x1) / 2, y: y2 }, direction: 1, bounds: { x1: x1, y1: Math.min(y2, y3), x2: x2, y2: Math.max(y2, y3) }, color: color }); } } } } ctx.restore(); if (_utils.isCanvasSupported) ghostCtx.restore(); //source and dest would be same when animation is not enabled var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.fadeInAnimation, easingFunction: AnimationHelper.easing.easeInQuad, animationBase: 0 }; return animationInfo; }; var _utils = require("../helpers/utils"); },{"../helpers/utils":39}],5:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var color = null; var plotArea = this.plotArea; var i = 0, x, y; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number from dataTime everytime it is used. var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0; var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : Math.min(this.width * .15, this.plotArea.width / plotUnit.plotType.totalDataSeries * .9) << 0; var xMinDiff = plotUnit.axisX.dataInfo.minDiff; var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.totalDataSeries * .9 << 0; if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) { barWidth = maxBarWidth / plotUnit.plotType.totalDataSeries * .9; } else if (barWidth < 1) barWidth = 1; ctx.save(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); this._eventManager.ghostCtx.clip(); } //ctx.beginPath(); for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var isFirstDataPointInPlotArea = true; // Reducing pixelPerUnit by 1 just to overcome any problems due to rounding off of pixels. //dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //var offsetX = barWidth * plotUnit.index << 0; if (dataPoints.length > 0) { //var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y); var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false; for (i = 0; i < dataPoints.length; i++) { dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (typeof dataPoints[i].y !== "number") continue; x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; var x1 = x - plotUnit.plotType.totalDataSeries * barWidth / 2 + (plotUnit.previousDataSeriesCount + j) * barWidth << 0; var x2 = x1 + barWidth << 0; var y1; var y2; if (dataPoints[i].y >= 0) { y1 = y; y2 = yZeroToPixel; if (y1 > y2) { var temp = y1; y1 = y2; y2 = y1; } } else { y2 = y; y1 = yZeroToPixel; if (y1 > y2) { var temp = y1; y1 = y2; y2 = y1; } } color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length]; (0, _utils.drawRect)(ctx, x1, y1, x2, y2, color, 0, null, bevelEnabled && dataPoints[i].y >= 0, dataPoints[i].y < 0 && bevelEnabled, false, false, dataSeries.fillOpacity); //if (dataSeries.markerType && dataSeries.markerSize > 0) { // RenderHelper.drawMarker(x1 + (x2 - x1) / 2, y, ctx, dataSeries.markerType, dataSeries.markerSize, color, dataSeries.markerBorderColor, dataSeries.markerBorderThickness ? dataSeries.markerBorderThickness : 1); //} var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2 }; color = (0, _utils.intToHexColorString)(id); if (_utils.isCanvasSupported) (0, _utils.drawRect)(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false); if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "column", dataPoint: dataPoints[i], dataSeries: dataSeries, point: { x: x1 + (x2 - x1) / 2, y: dataPoints[i].y >= 0 ? y1 : y2 }, direction: dataPoints[i].y >= 0 ? 1 : -1, bounds: { x1: x1, y1: Math.min(y1, y2), x2: x2, y2: Math.max(y1, y2) }, color: color }); } } } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); //source and dest would be same when animation is not enabled var animationBase = Math.min(yZeroToPixel, plotUnit.axisY.boundingRect.y2); var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: _animator2.default.yScaleAnimation, easingFunction: _animator2.default.easing.easeOutQuart, animationBase: animationBase }; return animationInfo; }; var _animator = require('../helpers/animator'); var _animator2 = _interopRequireDefault(_animator); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } },{"../helpers/animator":37,"../helpers/utils":39}],6:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.PieChart = exports.RangeSplineAreaChart = exports.RangeAreaChart = exports.RangeBarChart = exports.RangeColumnChart = exports.CandlestickChart = exports.ScatterChart = exports.BubbleChart = exports.StackedArea100Chart = exports.StackedAreaChart = exports.StepAreaChart = exports.SplineAreaChart = exports.AreaChart = exports.StackedBar100Chart = exports.StackedBarChart = exports.BarChart = exports.StackedColumn100Chart = exports.StackedColumnChart = exports.ColumnChart = exports.SplineChart = undefined; var _spline = require('../charts/spline'); var _spline2 = _interopRequireDefault(_spline); var _column = require('../charts/column'); var _column2 = _interopRequireDefault(_column); var _stacked_column = require('../charts/stacked_column'); var _stacked_column2 = _interopRequireDefault(_stacked_column); var _stacked_column_ = require('../charts/stacked_column_100'); var _stacked_column_2 = _interopRequireDefault(_stacked_column_); var _bar = require('../charts/bar'); var _bar2 = _interopRequireDefault(_bar); var _stacked_bar = require('../charts/stacked_bar'); var _stacked_bar2 = _interopRequireDefault(_stacked_bar); var _stacked_bar_ = require('../charts/stacked_bar_100'); var _stacked_bar_2 = _interopRequireDefault(_stacked_bar_); var _area = require('../charts/area'); var _area2 = _interopRequireDefault(_area); var _spline_area = require('../charts/spline_area'); var _spline_area2 = _interopRequireDefault(_spline_area); var _step_area = require('../charts/step_area'); var _step_area2 = _interopRequireDefault(_step_area); var _stacked_area = require('../charts/stacked_area'); var _stacked_area2 = _interopRequireDefault(_stacked_area); var _stacked_area_ = require('../charts/stacked_area_100'); var _stacked_area_2 = _interopRequireDefault(_stacked_area_); var _bubble = require('../charts/bubble'); var _bubble2 = _interopRequireDefault(_bubble); var _scatter = require('../charts/scatter'); var _scatter2 = _interopRequireDefault(_scatter); var _candlestick = require('../charts/candlestick'); var _candlestick2 = _interopRequireDefault(_candlestick); var _range_column = require('../charts/range_column'); var _range_column2 = _interopRequireDefault(_range_column); var _range_bar = require('../charts/range_bar'); var _range_bar2 = _interopRequireDefault(_range_bar); var _range_area = require('../charts/range_area'); var _range_area2 = _interopRequireDefault(_range_area); var _range_spline_area = require('../charts/range_spline_area'); var _range_spline_area2 = _interopRequireDefault(_range_spline_area); var _pie = require('../charts/pie'); var _pie2 = _interopRequireDefault(_pie); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.SplineChart = _spline2.default; exports.ColumnChart = _column2.default; exports.StackedColumnChart = _stacked_column2.default; exports.StackedColumn100Chart = _stacked_column_2.default; exports.BarChart = _bar2.default; exports.StackedBarChart = _stacked_bar2.default; exports.StackedBar100Chart = _stacked_bar_2.default; exports.AreaChart = _area2.default; exports.SplineAreaChart = _spline_area2.default; exports.StepAreaChart = _step_area2.default; exports.StackedAreaChart = _stacked_area2.default; exports.StackedArea100Chart = _stacked_area_2.default; exports.BubbleChart = _bubble2.default; exports.ScatterChart = _scatter2.default; exports.CandlestickChart = _candlestick2.default; exports.RangeColumnChart = _range_column2.default; exports.RangeBarChart = _range_bar2.default; exports.RangeAreaChart = _range_area2.default; exports.RangeSplineAreaChart = _range_spline_area2.default; exports.PieChart = _pie2.default; },{"../charts/area":1,"../charts/bar":2,"../charts/bubble":3,"../charts/candlestick":4,"../charts/column":5,"../charts/pie":7,"../charts/range_area":8,"../charts/range_bar":9,"../charts/range_column":10,"../charts/range_spline_area":11,"../charts/scatter":12,"../charts/spline":13,"../charts/spline_area":14,"../charts/stacked_area":15,"../charts/stacked_area_100":16,"../charts/stacked_bar":17,"../charts/stacked_bar_100":18,"../charts/stacked_column":19,"../charts/stacked_column_100":20,"../charts/step_area":21}],7:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var _this = this; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var dataSeriesIndex = plotUnit.dataSeriesIndexes[0]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var indexLabelLineEdgeLength = 10; var explodeDuration = 500; var plotArea = this.plotArea; //var maxFrame = isCanvasSupported ? 300 : 4; //var totalRecursions = 0; var dataPointEOs = []; //dataPoint Extension Objects Behaves like a storage place for all additional data relating to dataPoints. Requred because actual dataPoints should not be modified. var minDistanceBetweenLabels = 2; var indexLabelRadiusToRadiusRatio = 1.3; var poleAnglularDistance = 20 / 180 * Math.PI; //Anglular Distance from 90 & 270 to be considered pole var precision = 6; var center = { x: (plotArea.x2 + plotArea.x1) / 2, y: (plotArea.y2 + plotArea.y1) / 2 }; var sum = 0; var isIndexLabelPresent = false; for (var j = 0; j < dataPoints.length; j++) { sum += Math.abs(dataPoints[j].y); if (!isIndexLabelPresent && typeof dataPoints[j].indexLabel !== "undefined" && dataPoints[j].indexLabel !== null && dataPoints[j].indexLabel.toString().length > 0) isIndexLabelPresent = true; if (!isIndexLabelPresent && typeof dataPoints[j].label !== "undefined" && dataPoints[j].label !== null && dataPoints[j].label.toString().length > 0) isIndexLabelPresent = true; } if (sum === 0) return; isIndexLabelPresent = isIndexLabelPresent || typeof dataSeries.indexLabel !== "undefined" && dataSeries.indexLabel !== null && dataSeries.indexLabel.toString().length > 0; var outerRadius = dataSeries.indexLabelPlacement !== "inside" && isIndexLabelPresent ? Math.min(plotArea.width, plotArea.height) * 0.75 / 2 : Math.min(plotArea.width, plotArea.height) * .92 / 2; if (dataSeries.radius) outerRadius = (0, _utils.convertPercentToValue)(dataSeries.radius, outerRadius); var innerRadius = typeof dataSeries.innerRadius !== 'undefined' && dataSeries.innerRadius !== null ? (0, _utils.convertPercentToValue)(dataSeries.innerRadius, outerRadius) : 0.7 * outerRadius; var percentInnerRadius = Math.min(innerRadius / outerRadius, (outerRadius - 1) / outerRadius); function initLabels() { if (!dataSeries || !dataPoints) return; var noDPNearSouthPole = 0; var noDPNearNorthPole = 0; var firstDPCloseToSouth = 0; var firstDPCloseToNorth = 0; for (j = 0; j < dataPoints.length; j++) { var dataPoint = dataPoints[j]; var id = dataSeries.dataPointIds[j]; var dataPointEO = { id: id, objectType: "dataPoint", dataPointIndex: j, dataSeriesIndex: 0 }; dataPointEOs.push(dataPointEO); var percentAndTotal = { percent: null, total: null }; var formatterParameter = null; percentAndTotal = _this.getPercentAndTotal(dataSeries, dataPoint); if (dataSeries.indexLabelFormatter || dataPoint.indexLabelFormatter) formatterParameter = { chart: _this._options, dataSeries: dataSeries, dataPoint: dataPoint, total: percentAndTotal.total, percent: percentAndTotal.percent }; var indexLabelText = dataPoint.indexLabelFormatter ? dataPoint.indexLabelFormatter(formatterParameter) : dataPoint.indexLabel ? _this.replaceKeywordsWithValue(dataPoint.indexLabel, dataPoint, dataSeries, j) : dataSeries.indexLabelFormatter ? dataSeries.indexLabelFormatter(formatterParameter) : dataSeries.indexLabel ? _this.replaceKeywordsWithValue(dataSeries.indexLabel, dataPoint, dataSeries, j) : dataPoint.label ? dataPoint.label : ''; _this._eventManager.objectMap[id] = dataPointEO; //dataPointEO.indexLabelText = j.toString() + " " + "kingfisher: " + dataPoint.y.toString();; dataPointEO.center = { x: center.x, y: center.y }; dataPointEO.y = dataPoint.y; dataPointEO.radius = outerRadius; dataPointEO.percentInnerRadius = percentInnerRadius; dataPointEO.indexLabelText = indexLabelText; dataPointEO.indexLabelPlacement = dataSeries.indexLabelPlacement; dataPointEO.indexLabelLineColor = dataPoint.indexLabelLineColor ? dataPoint.indexLabelLineColor : dataSeries.indexLabelLineColor ? dataSeries.indexLabelLineColor : dataPoint.color ? dataPoint.color : dataSeries._colorSet[j % dataSeries._colorSet.length]; dataPointEO.indexLabelLineThickness = dataPoint.indexLabelLineThickness ? dataPoint.indexLabelLineThickness : dataSeries.indexLabelLineThickness; dataPointEO.indexLabelLineDashType = dataPoint.indexLabelLineDashType ? dataPoint.indexLabelLineDashType : dataSeries.indexLabelLineDashType; dataPointEO.indexLabelFontColor = dataPoint.indexLabelFontColor ? dataPoint.indexLabelFontColor : dataSeries.indexLabelFontColor; dataPointEO.indexLabelFontStyle = dataPoint.indexLabelFontStyle ? dataPoint.indexLabelFontStyle : dataSeries.indexLabelFontStyle; dataPointEO.indexLabelFontWeight = dataPoint.indexLabelFontWeight ? dataPoint.indexLabelFontWeight : dataSeries.indexLabelFontWeight; dataPointEO.indexLabelFontSize = dataPoint.indexLabelFontSize ? dataPoint.indexLabelFontSize : dataSeries.indexLabelFontSize; dataPointEO.indexLabelFontFamily = dataPoint.indexLabelFontFamily ? dataPoint.indexLabelFontFamily : dataSeries.indexLabelFontFamily; dataPointEO.indexLabelBackgroundColor = dataPoint.indexLabelBackgroundColor ? dataPoint.indexLabelBackgroundColor : dataSeries.indexLabelBackgroundColor ? dataSeries.indexLabelBackgroundColor : null; dataPointEO.indexLabelMaxWidth = dataPoint.indexLabelMaxWidth ? dataPoint.indexLabelMaxWidth : dataSeries.indexLabelMaxWidth ? dataSeries.indexLabelMaxWidth : plotArea.width * .33; dataPointEO.indexLabelWrap = typeof dataPoint.indexLabelWrap !== "undefined" ? dataPoint.indexLabelWrap : dataSeries.indexLabelWrap; dataPointEO.startAngle = j === 0 ? dataSeries.startAngle ? dataSeries.startAngle / 180 * Math.PI : 0 : dataPointEOs[j - 1].endAngle; dataPointEO.startAngle = (dataPointEO.startAngle + 2 * Math.PI) % (2 * Math.PI); dataPointEO.endAngle = dataPointEO.startAngle + 2 * Math.PI / sum * Math.abs(dataPoint.y); //var midAngle = dataPointEO.startAngle + Math.abs(dataPointEO.endAngle - dataPointEO.startAngle) / 2; var midAngle = (dataPointEO.endAngle + dataPointEO.startAngle) / 2; //var midAngle = (180 / Math.PI * midAngle); midAngle = (midAngle + 2 * Math.PI) % (2 * Math.PI); dataPointEO.midAngle = midAngle; if (dataPointEO.midAngle > Math.PI / 2 - poleAnglularDistance && dataPointEO.midAngle < Math.PI / 2 + poleAnglularDistance) { if (noDPNearSouthPole === 0 || dataPointEOs[firstDPCloseToSouth].midAngle > dataPointEO.midAngle) firstDPCloseToSouth = j; noDPNearSouthPole++; } else if (dataPointEO.midAngle > 3 * Math.PI / 2 - poleAnglularDistance && dataPointEO.midAngle < 3 * Math.PI / 2 + poleAnglularDistance) { if (noDPNearNorthPole === 0 || dataPointEOs[firstDPCloseToNorth].midAngle > dataPointEO.midAngle) firstDPCloseToNorth = j; noDPNearNorthPole++; } if (midAngle > Math.PI / 2 && midAngle <= 3 * Math.PI / 2) dataPointEO.hemisphere = "left";else dataPointEO.hemisphere = "right"; //dataPointEO.indexLabelText = j.toString() + "; " + dataPoint.y.toString() + "; " + midAngle.toString() + "; junk"; dataPointEO.indexLabelTextBlock = new _text_block2.default(_this.plotArea.ctx, { fontSize: dataPointEO.indexLabelFontSize, fontFamily: dataPointEO.indexLabelFontFamily, fontColor: dataPointEO.indexLabelFontColor, fontStyle: dataPointEO.indexLabelFontStyle, fontWeight: dataPointEO.indexLabelFontWeight, horizontalAlign: "left", backgroundColor: dataPointEO.indexLabelBackgroundColor, maxWidth: dataPointEO.indexLabelMaxWidth, maxHeight: dataPointEO.indexLabelWrap ? dataPointEO.indexLabelFontSize * 5 : dataPointEO.indexLabelFontSize * 1.5, text: dataPointEO.indexLabelText, padding: 0, //textBaseline: dataPointEO.indexLabelBackgroundColor ? "middle" : "top" textBaseline: "top" }); dataPointEO.indexLabelTextBlock.measureText(); //dataPoint.labelWidth = ctx.measureText(j.toString() + "; " + dataPoint.label).width; //console.log(dataPoint.label); } var noOfDPToRightOfSouthPole = 0; var noOfDPToLeftOfNorthPole = 0; var keepSameDirection = false; // once a dataPoint's hemisphere is changed, others should follow the same so that there are no labes near pole pointing in opposite direction. for (j = 0; j < dataPoints.length; j++) { var dataPointEO = dataPointEOs[(firstDPCloseToSouth + j) % dataPoints.length]; if (noDPNearSouthPole > 1 && dataPointEO.midAngle > Math.PI / 2 - poleAnglularDistance && dataPointEO.midAngle < Math.PI / 2 + poleAnglularDistance) { if (noOfDPToRightOfSouthPole <= noDPNearSouthPole / 2 && !keepSameDirection) { dataPointEO.hemisphere = "right"; noOfDPToRightOfSouthPole++; } else { dataPointEO.hemisphere = "left"; keepSameDirection = true; } } } keepSameDirection = false; for (j = 0; j < dataPoints.length; j++) { var dataPointEO = dataPointEOs[(firstDPCloseToNorth + j) % dataPoints.length]; //if (dataPoint.hemisphere = "right") // break; if (noDPNearNorthPole > 1 && dataPointEO.midAngle > 3 * Math.PI / 2 - poleAnglularDistance && dataPointEO.midAngle < 3 * Math.PI / 2 + poleAnglularDistance) { if (noOfDPToLeftOfNorthPole <= noDPNearNorthPole / 2 && !keepSameDirection) { dataPointEO.hemisphere = "left"; noOfDPToLeftOfNorthPole++; } else { dataPointEO.hemisphere = "right"; keepSameDirection = true; } } } } //End of initLabels() function renderLabels() { var ctx = _this.plotArea.ctx; ctx.fillStyle = "black"; ctx.strokeStyle = "grey"; var fontSize = 16; //ctx.font = fontSize + "px Arial"; ctx.textBaseline = "middle"; ctx.lineJoin = "round"; var i = 0, j = 0; for (i = 0; i < dataPoints.length; i++) { var dataPointEO = dataPointEOs[i]; if (!dataPointEO.indexLabelText) continue; dataPointEO.indexLabelTextBlock.y -= dataPointEO.indexLabelTextBlock.height / 2; var xOffset = 0; if (dataPointEO.hemisphere === "left") { var xOffset = dataSeries.indexLabelPlacement !== "inside" ? -(dataPointEO.indexLabelTextBlock.width + indexLabelLineEdgeLength) : -dataPointEO.indexLabelTextBlock.width / 2; } else { var xOffset = dataSeries.indexLabelPlacement !== "inside" ? indexLabelLineEdgeLength : -dataPointEO.indexLabelTextBlock.width / 2; } dataPointEO.indexLabelTextBlock.x += xOffset; dataPointEO.indexLabelTextBlock.render(true); dataPointEO.indexLabelTextBlock.x -= xOffset; //if (i < 4) // customPrompt(i + "; " + center.y + "; " + dataPointEO.indexLabelTextBlock.y.toFixed(2)); dataPointEO.indexLabelTextBlock.y += dataPointEO.indexLabelTextBlock.height / 2; if (dataPointEO.indexLabelPlacement !== "inside") { var indexLabelLineStartX = dataPointEO.center.x + outerRadius * Math.cos(dataPointEO.midAngle); var indexLabelLineStartY = dataPointEO.center.y + outerRadius * Math.sin(dataPointEO.midAngle); //ctx.strokeStyle = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length]; ctx.strokeStyle = dataPointEO.indexLabelLineColor; ctx.lineWidth = dataPointEO.indexLabelLineThickness; if (ctx.setLineDash) { ctx.setLineDash((0, _utils.getLineDashArray)(dataPointEO.indexLabelLineDashType, dataPointEO.indexLabelLineThickness)); } //ctx.lineWidth = 4; ctx.beginPath(); ctx.moveTo(indexLabelLineStartX, indexLabelLineStartY); ctx.lineTo(dataPointEO.indexLabelTextBlock.x, dataPointEO.indexLabelTextBlock.y); ctx.lineTo(dataPointEO.indexLabelTextBlock.x + (dataPointEO.hemisphere === "left" ? -indexLabelLineEdgeLength : indexLabelLineEdgeLength), dataPointEO.indexLabelTextBlock.y); ctx.stroke(); //ctx.closePath(); //window.alert("contine??"); //animate(); } ctx.lineJoin = "miter"; } } function animate(fractionComplete) { var ctx = _this.plotArea.ctx; ctx.clearRect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.fillStyle = _this.backgroundColor; ctx.fillRect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); var maxAngle = dataPointEOs[0].startAngle + 2 * Math.PI * fractionComplete; for (var i = 0; i < dataPoints.length; i++) { var startAngle = i === 0 ? dataPointEOs[i].startAngle : endAngle; var endAngle = startAngle + (dataPointEOs[i].endAngle - dataPointEOs[i].startAngle); var shouldBreak = false; if (endAngle > maxAngle) { endAngle = maxAngle; shouldBreak = true; } var color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length]; if (endAngle > startAngle) (0, _utils.drawSegment)(_this.plotArea.ctx, dataPointEOs[i].center, dataPointEOs[i].radius, color, dataSeries.type, startAngle, endAngle, dataSeries.fillOpacity, dataPointEOs[i].percentInnerRadius); if (shouldBreak) break; } } function explodeToggle(fractionComplete) { var ctx = _this.plotArea.ctx; ctx.clearRect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.fillStyle = _this.backgroundColor; ctx.fillRect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); for (var i = 0; i < dataPoints.length; i++) { var startAngle = dataPointEOs[i].startAngle; var endAngle = dataPointEOs[i].endAngle; if (endAngle > startAngle) { var offsetX = outerRadius * .07 * Math.cos(dataPointEOs[i].midAngle); var offsetY = outerRadius * .07 * Math.sin(dataPointEOs[i].midAngle); var isInTransition = false; if (dataPoints[i].exploded) { if (Math.abs(dataPointEOs[i].center.x - (center.x + offsetX)) > 0.000000001 || Math.abs(dataPointEOs[i].center.y - (center.y + offsetY)) > 0.000000001) { dataPointEOs[i].center.x = center.x + offsetX * fractionComplete; dataPointEOs[i].center.y = center.y + offsetY * fractionComplete; isInTransition = true; } } else if (Math.abs(dataPointEOs[i].center.x - center.x) > 0 || Math.abs(dataPointEOs[i].center.y - center.y) > 0) { dataPointEOs[i].center.x = center.x + offsetX * (1 - fractionComplete); dataPointEOs[i].center.y = center.y + offsetY * (1 - fractionComplete); isInTransition = true; } if (isInTransition) { var entry = {}; entry.dataSeries = dataSeries; entry.dataPoint = dataSeries.dataPoints[i]; entry.index = i; _this._toolTip.highlightObjects([entry]); } var color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length]; (0, _utils.drawSegment)(_this.plotArea.ctx, dataPointEOs[i].center, dataPointEOs[i].radius, color, dataSeries.type, startAngle, endAngle, dataSeries.fillOpacity, dataPointEOs[i].percentInnerRadius); } } //window.alert("next??"); renderLabels(); } function areDataPointsTooClose(first, second) { var label1 = { x1: first.indexLabelTextBlock.x, y1: first.indexLabelTextBlock.y - first.indexLabelTextBlock.height / 2, x2: first.indexLabelTextBlock.x + first.indexLabelTextBlock.width, y2: first.indexLabelTextBlock.y + first.indexLabelTextBlock.height / 2 }; var label2 = { x1: second.indexLabelTextBlock.x, y1: second.indexLabelTextBlock.y - second.indexLabelTextBlock.height / 2, x2: second.indexLabelTextBlock.x + second.indexLabelTextBlock.width, y2: second.indexLabelTextBlock.y + second.indexLabelTextBlock.height / 2 }; if (label1.x2 < label2.x1 - indexLabelLineEdgeLength || label1.x1 > label2.x2 + indexLabelLineEdgeLength || label1.y1 > label2.y2 + indexLabelLineEdgeLength || label1.y2 < label2.y1 - indexLabelLineEdgeLength) return false; return true; } function getVerticalDistanceBetweenLabels(first, second) { var distance = 0; var label1 = { y: first.indexLabelTextBlock.y, y1: first.indexLabelTextBlock.y - first.indexLabelTextBlock.height / 2, y2: first.indexLabelTextBlock.y + first.indexLabelTextBlock.height / 2 }; var label2 = { y: second.indexLabelTextBlock.y, y1: second.indexLabelTextBlock.y - second.indexLabelTextBlock.height / 2, y2: second.indexLabelTextBlock.y + second.indexLabelTextBlock.height / 2 }; if (label2.y > label1.y) { distance = label2.y1 - label1.y2; } else { distance = label1.y1 - label2.y2; } return distance; } function getNextLabelIndex(currentLabelIndex) { var nextLabelIndex = null; for (var i = 1; i < dataPoints.length; i++) { nextLabelIndex = (currentLabelIndex + i + dataPointEOs.length) % dataPointEOs.length; if (dataPointEOs[nextLabelIndex].hemisphere !== dataPointEOs[currentLabelIndex].hemisphere) { nextLabelIndex = null; break; } else if (dataPointEOs[nextLabelIndex].indexLabelText && nextLabelIndex !== currentLabelIndex && (getVerticalDistanceBetweenLabels(dataPointEOs[nextLabelIndex], dataPointEOs[currentLabelIndex]) < 0 || (dataPointEOs[currentLabelIndex].hemisphere === "right" ? dataPointEOs[nextLabelIndex].indexLabelTextBlock.y >= dataPointEOs[currentLabelIndex].indexLabelTextBlock.y : dataPointEOs[nextLabelIndex].indexLabelTextBlock.y <= dataPointEOs[currentLabelIndex].indexLabelTextBlock.y))) break;else { nextLabelIndex = null; } } return nextLabelIndex; } function getPreviousLabelIndex(currentLabelIndex) { var prevLabelIndex = null; for (var i = 1; i < dataPoints.length; i++) { prevLabelIndex = (currentLabelIndex - i + dataPointEOs.length) % dataPointEOs.length; if (dataPointEOs[prevLabelIndex].hemisphere !== dataPointEOs[currentLabelIndex].hemisphere) { prevLabelIndex = null; break; } else if (dataPointEOs[prevLabelIndex].indexLabelText && dataPointEOs[prevLabelIndex].hemisphere === dataPointEOs[currentLabelIndex].hemisphere && prevLabelIndex !== currentLabelIndex && (getVerticalDistanceBetweenLabels(dataPointEOs[prevLabelIndex], dataPointEOs[currentLabelIndex]) < 0 || (dataPointEOs[currentLabelIndex].hemisphere === "right" ? dataPointEOs[prevLabelIndex].indexLabelTextBlock.y <= dataPointEOs[currentLabelIndex].indexLabelTextBlock.y : dataPointEOs[prevLabelIndex].indexLabelTextBlock.y >= dataPointEOs[currentLabelIndex].indexLabelTextBlock.y))) break;else { prevLabelIndex = null; } } return prevLabelIndex; } function rePositionLabels(dataPointIndex, offset) { offset = offset || 0; var actualOffset = 0; //var labelYMin = 2; //var labelYMax = ctx.canvas.height - 2; //var labelYMin = _this.plotArea.ctx.canvas.height / 2 - indexLabelRadius * 1; //var labelYMax = _this.plotArea.ctx.canvas.height / 2 + indexLabelRadius * 1; var labelYMin = center.y - indexLabelRadius * 1; var labelYMax = center.y + indexLabelRadius * 1; //console.log(totalRecursions); if (dataPointIndex >= 0 && dataPointIndex < dataPoints.length) { var dataPointEO = dataPointEOs[dataPointIndex]; //if (dataPointIndex === 0) // customPrompt(labelYMin.toFixed(2) + "; " + labelYMax.toFixed(2) + "; " + dataPointEO.indexLabelTextBlock.y.toFixed(2)); // If label is already outside the bounds, return if (offset < 0 && dataPointEO.indexLabelTextBlock.y < labelYMin || offset > 0 && dataPointEO.indexLabelTextBlock.y > labelYMax) return 0; var validOffset = offset; //Check if the offset falls within the bounds (labelYMin, labelYMax, tangential bounds) without considering overlap. Else use the closest offset that is possible - validOffset. { var distFromIndexLineStart = 0; var indexLabelLineStartX = 0; var indexLabelLineStartY = 0; var indexLabelAngle = 0; var indexLabelAngleWhenTangent = 0; if (validOffset < 0) { if (dataPointEO.indexLabelTextBlock.y - dataPointEO.indexLabelTextBlock.height / 2 > labelYMin && dataPointEO.indexLabelTextBlock.y - dataPointEO.indexLabelTextBlock.height / 2 + validOffset < labelYMin) validOffset = -(labelYMin - (dataPointEO.indexLabelTextBlock.y - dataPointEO.indexLabelTextBlock.height / 2 + validOffset)); } else { if (dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2 < labelYMin && dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2 + validOffset > labelYMax) validOffset = dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2 + validOffset - labelYMax; } var newlabelY = dataPointEO.indexLabelTextBlock.y + validOffset; var newlabelX = 0; if (dataPointEO.hemisphere === "right") { newlabelX = center.x + Math.sqrt(Math.pow(indexLabelRadius, 2) - Math.pow(newlabelY - center.y, 2)); } else newlabelX = center.x - Math.sqrt(Math.pow(indexLabelRadius, 2) - Math.pow(newlabelY - center.y, 2)); indexLabelLineStartX = center.x + outerRadius * Math.cos(dataPointEO.midAngle); indexLabelLineStartY = center.y + outerRadius * Math.sin(dataPointEO.midAngle); distFromIndexLineStart = Math.sqrt(Math.pow(newlabelX - indexLabelLineStartX, 2) + Math.pow(newlabelY - indexLabelLineStartY, 2)); indexLabelAngleWhenTangent = Math.acos(outerRadius / indexLabelRadius); //indexLabelAngle = Math.acos((outerRadius * outerRadius + distFromIndexLineStart * distFromIndexLineStart - indexLabelRadius * indexLabelRadius) / (2 * outerRadius * distFromIndexLineStart)); indexLabelAngle = Math.acos((indexLabelRadius * indexLabelRadius + outerRadius * outerRadius - distFromIndexLineStart * distFromIndexLineStart) / (2 * outerRadius * indexLabelRadius)); if (indexLabelAngle < indexLabelAngleWhenTangent) { validOffset = newlabelY - dataPointEO.indexLabelTextBlock.y; //dataPointEO.indexLabelTextBlock.x = newlabelX; } else { validOffset = 0; //dataPointEO.indexLabelTextBlock.x = newlabelX; //Index Line is overlapping the pie. So lets find out the point where indexline becomes a tangent. //distFromIndexLineStart = Math.sqrt(indexLabelRadius * indexLabelRadius - outerRadius * outerRadius); ////distFromIndexLineStart *= offset < 0 ? -1 : 1; ////indexLabelAngle = Math.acos((indexLabelRadius * indexLabelRadius + outerRadius * outerRadius - distFromIndexLineStart * distFromIndexLineStart) / (2 * outerRadius * indexLabelRadius)); //indexLabelAngle = Math.atan2(distFromIndexLineStart, outerRadius); //newlabelX = center.x + indexLabelRadius * Math.cos(indexLabelAngle); //newlabelY = center.y + indexLabelRadius * Math.sin(indexLabelAngle); //actualOffset = newlabelY - dataPointEO.indexLabelTextBlock.y; //dataPointEO.indexLabelTextBlock.y = newlabelY; //dataPointEO.indexLabelTextBlock.x = newlabelX; } } //var tempIndex = (dataPointIndex + dataPointEOs.length - 1) % dataPointEOs.length; //var prevDataPointIndex = dataPointEOs[tempIndex].hemisphere === dataPointEO.hemisphere ? tempIndex : null; var prevDataPointIndex = getPreviousLabelIndex(dataPointIndex); //tempIndex = (dataPointIndex + dataPointEOs.length + 1) % dataPointEOs.length; //var nextDataPointIndex = dataPointEOs[tempIndex].hemisphere === dataPointEO.hemisphere ? tempIndex : null; var nextDataPointIndex = getNextLabelIndex(dataPointIndex); var otherdataPointEO, otherDataPointIndex, distanceFromOtherLabel; var otherDataPointOffset = 0; var otherDataPointActualOffset = 0; if (validOffset < 0) { otherDataPointIndex = dataPointEO.hemisphere === "right" ? prevDataPointIndex : nextDataPointIndex; actualOffset = validOffset; if (otherDataPointIndex !== null) { //if (dataPointIndex < 4) // customPrompt("valid: " + validOffset); var tempOffset = -validOffset; var distanceFromOtherLabel = dataPointEO.indexLabelTextBlock.y - dataPointEO.indexLabelTextBlock.height / 2 - (dataPointEOs[otherDataPointIndex].indexLabelTextBlock.y + dataPointEOs[otherDataPointIndex].indexLabelTextBlock.height / 2); if (distanceFromOtherLabel - tempOffset < minDistanceBetweenLabels) { otherDataPointOffset = -tempOffset; //totalRecursions++; otherDataPointActualOffset = rePositionLabels(otherDataPointIndex, otherDataPointOffset, recursionCount + 1); //if (dataPointIndex < 4) // customPrompt(dataPointIndex + "; " + "offset: " + otherDataPointOffset); if (+otherDataPointActualOffset.toFixed(precision) > +otherDataPointOffset.toFixed(precision)) { if (distanceFromOtherLabel > minDistanceBetweenLabels) actualOffset = -(distanceFromOtherLabel - minDistanceBetweenLabels); //else // actualOffset = 0; else actualOffset = -(tempOffset - (otherDataPointActualOffset - otherDataPointOffset)); } //if (dataPointIndex < 4) // customPrompt("actual: " + actualOffset); } } } else if (validOffset > 0) { otherDataPointIndex = dataPointEO.hemisphere === "right" ? nextDataPointIndex : prevDataPointIndex; actualOffset = validOffset; if (otherDataPointIndex !== null) { var tempOffset = validOffset; var distanceFromOtherLabel = dataPointEOs[otherDataPointIndex].indexLabelTextBlock.y - dataPointEOs[otherDataPointIndex].indexLabelTextBlock.height / 2 - (dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2); if (distanceFromOtherLabel - tempOffset < minDistanceBetweenLabels) { otherDataPointOffset = tempOffset; //totalRecursions++; otherDataPointActualOffset = rePositionLabels(otherDataPointIndex, otherDataPointOffset, recursionCount + 1); if (+otherDataPointActualOffset.toFixed(precision) < +otherDataPointOffset.toFixed(precision)) { if (distanceFromOtherLabel > minDistanceBetweenLabels) actualOffset = distanceFromOtherLabel - minDistanceBetweenLabels; //else // actualOffset = 0; else actualOffset = tempOffset - (otherDataPointOffset - otherDataPointActualOffset); } } } //if (!(dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2 + actualOffset < labelYMax)) { // if (dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2 < labelYMax) { // actualOffset = labelYMax - (dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2); // } // else { // actualOffset = 0; // } //} } if (actualOffset) { var newLabelY = dataPointEO.indexLabelTextBlock.y + actualOffset; var newLabelX = 0; if (dataPointEO.hemisphere === "right") { newLabelX = center.x + Math.sqrt(Math.pow(indexLabelRadius, 2) - Math.pow(newLabelY - center.y, 2)); } else newLabelX = center.x - Math.sqrt(Math.pow(indexLabelRadius, 2) - Math.pow(newLabelY - center.y, 2)); if (dataPointEO.midAngle > Math.PI / 2 - poleAnglularDistance && dataPointEO.midAngle < Math.PI / 2 + poleAnglularDistance) { var prevDPIndex = (dataPointIndex - 1 + dataPointEOs.length) % dataPointEOs.length; var prevDP = dataPointEOs[prevDPIndex]; var nextDP = dataPointEOs[(dataPointIndex + 1 + dataPointEOs.length) % dataPointEOs.length]; if (dataPointEO.hemisphere === "left" && prevDP.hemisphere === "right" && newLabelX > prevDP.indexLabelTextBlock.x) { newLabelX = prevDP.indexLabelTextBlock.x - 15; } else if (dataPointEO.hemisphere === "right" && nextDP.hemisphere === "left" && newLabelX < nextDP.indexLabelTextBlock.x) { newLabelX = nextDP.indexLabelTextBlock.x + 15; } } else if (dataPointEO.midAngle > 3 * Math.PI / 2 - poleAnglularDistance && dataPointEO.midAngle < 3 * Math.PI / 2 + poleAnglularDistance) { var prevDPIndex = (dataPointIndex - 1 + dataPointEOs.length) % dataPointEOs.length; var prevDP = dataPointEOs[prevDPIndex]; var nextDP = dataPointEOs[(dataPointIndex + 1 + dataPointEOs.length) % dataPointEOs.length]; if (dataPointEO.hemisphere === "right" && prevDP.hemisphere === "left" && newLabelX < prevDP.indexLabelTextBlock.x) { newLabelX = prevDP.indexLabelTextBlock.x + 15; } else if (dataPointEO.hemisphere === "left" && nextDP.hemisphere === "right" && newLabelX > nextDP.indexLabelTextBlock.x) { newLabelX = nextDP.indexLabelTextBlock.x - 15; } } //if (actualOffset < 0 && dataPointIndex < 4) // customPrompt(actualOffset.toFixed(2) + "; " + dataPointEO.indexLabelTextBlock.y.toFixed(2) + "; " + newLabelY.toFixed(2)); dataPointEO.indexLabelTextBlock.y = newLabelY; dataPointEO.indexLabelTextBlock.x = newLabelX; dataPointEO.indexLabelAngle = Math.atan2(dataPointEO.indexLabelTextBlock.y - center.y, dataPointEO.indexLabelTextBlock.x - center.x); } } return actualOffset; } function positionLabels() { var ctx = _this.plotArea.ctx; ctx.fillStyle = "grey"; ctx.strokeStyle = "grey"; var fontSize = 16; ctx.font = fontSize + "px Arial"; ctx.textBaseline = "middle"; var i = 0, j = 0; var deltaR = 0; var resizeFlag = true; var _loop = function _loop() { if (dataSeries.radius || !dataSeries.radius && typeof dataSeries.innerRadius !== 'undefined' && dataSeries.innerRadius !== null && outerRadius - deltaR <= innerRadius) resizeFlag = false; if (resizeFlag) outerRadius -= deltaR; deltaR = 0; if (dataSeries.indexLabelPlacement !== "inside") { indexLabelRadius = outerRadius * indexLabelRadiusToRadiusRatio; for (i = 0; i < dataPoints.length; i++) { dataPointEO = dataPointEOs[i]; dataPointEO.indexLabelTextBlock.x = center.x + indexLabelRadius * Math.cos(dataPointEO.midAngle); dataPointEO.indexLabelTextBlock.y = center.y + indexLabelRadius * Math.sin(dataPointEO.midAngle); dataPointEO.indexLabelAngle = dataPointEO.midAngle; dataPointEO.radius = outerRadius; dataPointEO.percentInnerRadius = percentInnerRadius; //dataPointEO.indexLabelFontSize = dataPoint.indexLabelFontSize ? dataPoint.indexLabelFontSize : dataSeries.indexLabelFontSize; } for (i = 0; i < dataPoints.length; i++) { dataPointEO = dataPointEOs[i]; //dataPointEO.lab //resetAnimationFrame(); //animate(); //renderLabels(); //var prevDataPointIndex = (i - 1 + dataPointEOs.length) % dataPointEOs.length; //var nextDataPointIndex = (i + 1 + dataPointEOs.length) % dataPointEOs.length; //nextDataPointIndex = dataPointEOs[nextDataPointIndex].hemisphere === dataPointEO.hemisphere && nextDataPointIndex !== i ? nextDataPointIndex : null; nextDataPointIndex = getNextLabelIndex(i); if (nextDataPointIndex === null) continue; currentDataPoint = dataPointEOs[i]; nextDataPoint = dataPointEOs[nextDataPointIndex]; distanceFromNextLabel = 0; //if (dataPointEO.hemisphere === "right") // distanceFromNextLabel = (nextDataPoint.indexLabelTextBlock.y - nextDataPoint.indexLabelTextBlock.height / 2) - (currentDataPoint.indexLabelTextBlock.y + currentDataPoint.indexLabelTextBlock.height / 2) - minDistanceBetweenLabels; //else // distanceFromNextLabel = (currentDataPoint.indexLabelTextBlock.y - currentDataPoint.indexLabelTextBlock.height / 2) - (nextDataPoint.indexLabelTextBlock.y + nextDataPoint.indexLabelTextBlock.height / 2) - minDistanceBetweenLabels; distanceFromNextLabel = getVerticalDistanceBetweenLabels(currentDataPoint, nextDataPoint) - minDistanceBetweenLabels; if (distanceFromNextLabel < 0) { dataPointsAbove = 0; dataPointsBelow = 0; //var indexLabelAngleWhenTangent = Math.acos(outerRadius / indexLabelRadius) / Math.PI * 180; for (k = 0; k < dataPoints.length; k++) { if (k === i) continue; //if (dataPointEOs[k].hemisphere !== dataPointEO.hemisphere || Math.abs(dataPointEOs[k].midAngle - dataPointEO.midAngle) > 30) // continue; //if (dataPointEOs[k].hemisphere !== dataPointEO.hemisphere || Math.abs(dataPointEOs[k].labelAngle - dataPointEO.indexLabelAngle) > 30) // continue; //if (dataPointEOs[k].hemisphere !== dataPointEO.hemisphere || Math.abs(dataPointEOs[k].midAngle - dataPointEO.midAngle) > indexLabelAngleWhenTangent) // continue; if (dataPointEOs[k].hemisphere !== dataPointEO.hemisphere) continue; if (dataPointEOs[k].indexLabelTextBlock.y < dataPointEO.indexLabelTextBlock.y) dataPointsAbove++;else dataPointsBelow++; } //var upWardsOffset = (distanceFromNextLabel) / dataPoints.length * (dataPointsBelow); upWardsOffset = distanceFromNextLabel / (dataPointsAbove + dataPointsBelow || 1) * dataPointsBelow; downWardsOffset = -1 * (distanceFromNextLabel - upWardsOffset); actualUpwardOffset = 0; actualDownwardOffset = 0; if (dataPointEO.hemisphere === "right") { actualUpwardOffset = rePositionLabels(i, upWardsOffset); //if (i < 4 && actualDownwardOffset !== upWardsOffset) // customPrompt(i + "; " + upWardsOffset.toFixed(2) + "; " + actualUpwardOffset.toFixed(2)); downWardsOffset = -1 * (distanceFromNextLabel - actualUpwardOffset); actualDownwardOffset = rePositionLabels(nextDataPointIndex, downWardsOffset); //window.alert(typeof +downWardsOffset.toFixed(precision)); //Setting precision to make sure that they don't become not equal become of minor differences - like a difference of .000001 if (+actualDownwardOffset.toFixed(precision) < +downWardsOffset.toFixed(precision) && +actualUpwardOffset.toFixed(precision) <= +upWardsOffset.toFixed(precision)) rePositionLabels(i, -(downWardsOffset - actualDownwardOffset)); } else { actualUpwardOffset = rePositionLabels(nextDataPointIndex, upWardsOffset); downWardsOffset = -1 * (distanceFromNextLabel - actualUpwardOffset); actualDownwardOffset = rePositionLabels(i, downWardsOffset); //Setting precision to make sure that they don't become not equal become of minor differences - like a difference of .000001 if (+actualDownwardOffset.toFixed(precision) < +downWardsOffset.toFixed(precision) && +actualUpwardOffset.toFixed(precision) <= +upWardsOffset.toFixed(precision)) rePositionLabels(nextDataPointIndex, -(downWardsOffset - actualDownwardOffset)); } } //resetAnimationFrame(); //animate(); //renderLabels(); //window.alert("next??"); } } else { for (i = 0; i < dataPoints.length; i++) { dataPointEO = dataPointEOs[i]; indexLabelRadius = dataSeries.type === "pie" ? outerRadius * .7 : outerRadius * .8; dx = center.x + indexLabelRadius * Math.cos(dataPointEO.midAngle); dy = center.y + indexLabelRadius * Math.sin(dataPointEO.midAngle); dataPointEO.indexLabelTextBlock.x = dx; dataPointEO.indexLabelTextBlock.y = dy; } } // Resize Pie based on the label length. for (i = 0; i < dataPoints.length; i++) { dataPointEO = dataPointEOs[i]; size = dataPointEO.indexLabelTextBlock.measureText(); // To make sure that null text or empty strings don't affect the radius. Required when user is not showing any labels if (size.height === 0 || size.width === 0) continue; xOverflow = 0; xdr = 0; if (dataPointEO.hemisphere === "right") { xOverflow = plotArea.x2 - (dataPointEO.indexLabelTextBlock.x + dataPointEO.indexLabelTextBlock.width + indexLabelLineEdgeLength); xOverflow *= -1; } else { xOverflow = plotArea.x1 - (dataPointEO.indexLabelTextBlock.x - dataPointEO.indexLabelTextBlock.width - indexLabelLineEdgeLength); } if (xOverflow > 0) { if (!resizeFlag && dataPointEO.indexLabelText) { newIndexLabelMaxWidth = dataPointEO.hemisphere === "right" ? plotArea.x2 - dataPointEO.indexLabelTextBlock.x : dataPointEO.indexLabelTextBlock.x - plotArea.x1; dataPointEO.indexLabelTextBlock.maxWidth * .3 > newIndexLabelMaxWidth ? dataPointEO.indexLabelText = "" : dataPointEO.indexLabelTextBlock.maxWidth = newIndexLabelMaxWidth * .85; if (dataPointEO.indexLabelTextBlock.maxWidth * .3 < newIndexLabelMaxWidth) dataPointEO.indexLabelTextBlock.x -= dataPointEO.hemisphere === "right" ? 2 : -2; } if (Math.abs(dataPointEO.indexLabelTextBlock.y - dataPointEO.indexLabelTextBlock.height / 2 - center.y) < outerRadius || Math.abs(dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2 - center.y) < outerRadius) { xdr = xOverflow / Math.abs(Math.cos(dataPointEO.indexLabelAngle)); if (xdr > 9) xdr = xdr * .3; if (xdr > deltaR) deltaR = xdr; } } yOverflow = 0; ydr = 0; if (dataPointEO.indexLabelAngle > 0 && dataPointEO.indexLabelAngle < Math.PI) { yOverflow = plotArea.y2 - (dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2 + 5); yOverflow *= -1; } else { yOverflow = plotArea.y1 - (dataPointEO.indexLabelTextBlock.y - dataPointEO.indexLabelTextBlock.height / 2 - 5); } if (yOverflow > 0) { if (!resizeFlag && dataPointEO.indexLabelText) { positionMultiplier = dataPointEO.indexLabelAngle > 0 && dataPointEO.indexLabelAngle < Math.PI ? -1 : 1; if (rePositionLabels(i, yOverflow * positionMultiplier) === 0) rePositionLabels(i, 2 * positionMultiplier); } if (Math.abs(dataPointEO.indexLabelTextBlock.x - center.x) < outerRadius) { ydr = yOverflow / Math.abs(Math.sin(dataPointEO.indexLabelAngle)); if (ydr > 9) ydr = ydr * .3; if (ydr > deltaR) deltaR = ydr; } } } function removeLabelsForSmallSegments(totalOverlap, startIndex, endIndex) { var dpEOs = []; var totalRemovedLabelHeight = 0; for (var i = startIndex; true; i = (i + 1 + dataPoints.length) % dataPoints.length) { dpEOs.push(dataPointEOs[i]); if (i === endIndex) break; } dpEOs.sort(function (entry1, entry2) { return entry1.y - entry2.y; }); for (i = 0; i < dpEOs.length; i++) { var dpEO = dpEOs[i]; if (totalRemovedLabelHeight < totalOverlap * .7) { totalRemovedLabelHeight += dpEO.indexLabelTextBlock.height; dpEO.indexLabelTextBlock.text = ""; dpEO.indexLabelText = ""; dpEO.indexLabelTextBlock.measureText(); } else break; } } //resetAnimationFrame(1); //animate(); //window.alert("next??"); function skipLabels() { var overlapStartIndex = -1; var overlapEndIndex = -1; var totalOverlap = 0; var removeLabels = false; for (var k = 0; k < dataPoints.length; k++) { removeLabels = false; currentDataPoint = dataPointEOs[k]; if (!currentDataPoint.indexLabelText) continue; var nextLabelIndex = getNextLabelIndex(k); if (nextLabelIndex === null) continue; var nextDataPoint = dataPointEOs[nextLabelIndex]; distanceFromNextLabel = 0; //if (nextDataPoint.indexLabelTextBlock.y > currentDataPoint.indexLabelTextBlock.y) // distanceFromNextLabel = (nextDataPoint.indexLabelTextBlock.y - (nextDataPoint.indexLabelTextBlock.height / 2)) - (currentDataPoint.indexLabelTextBlock.y + (currentDataPoint.indexLabelTextBlock.height / 2)); //else // distanceFromNextLabel = (currentDataPoint.indexLabelTextBlock.y - (currentDataPoint.indexLabelTextBlock.height / 2)) - (nextDataPoint.indexLabelTextBlock.y + (nextDataPoint.indexLabelTextBlock.height / 2)); distanceFromNextLabel = getVerticalDistanceBetweenLabels(currentDataPoint, nextDataPoint); if (distanceFromNextLabel < 0 && areDataPointsTooClose(currentDataPoint, nextDataPoint)) { //if (distanceFromNextLabel < 0 && areDataPointsTooClose(currentDataPoint, nextDataPoint) ) { if (overlapStartIndex < 0) overlapStartIndex = k; if (nextLabelIndex !== overlapStartIndex) { overlapEndIndex = nextLabelIndex; totalOverlap += -distanceFromNextLabel; } if (k % Math.max(dataPoints.length / 10, 3) === 0) removeLabels = true; //nextDataPoint.indexLabelText = ""; //nextDataPoint.indexLabelTextBlock.text = ""; //nextDataPoint.indexLabelTextBlock.measureText(); } else { removeLabels = true; } if (removeLabels) { if (totalOverlap > 0 && overlapStartIndex >= 0 && overlapEndIndex >= 0) { removeLabelsForSmallSegments(totalOverlap, overlapStartIndex, overlapEndIndex); overlapStartIndex = -1; overlapEndIndex = -1; totalOverlap = 0; } } } if (totalOverlap > 0) removeLabelsForSmallSegments(totalOverlap, overlapStartIndex, overlapEndIndex); } skipLabels(); }; for (j = 0; j < 10 && (j < 1 || deltaR > 0); j++) { var indexLabelRadius; var dataPointEO; var currentDataPoint, nextDataPoint; var dataPointEO; var nextDataPointIndex; var distanceFromNextLabel; var dataPointsAbove; var dataPointsBelow; var k; var upWardsOffset; var downWardsOffset; var actualUpwardOffset; var actualDownwardOffset; var dataPointEO; var dx; var dy; var size; var xOverflow; var xdr; var newIndexLabelMaxWidth; var yOverflow; var ydr; var positionMultiplier; _loop(); } //window.alert("next??"); //resetAnimationFrame(_this.animationEnabled && _this.renderCount === 0 ? isCanvasSupported ? 60 : 30 : 1); //animate(); //console.log("totalRecursions: " + totalRecursions); } this.pieDoughnutClickHandler = function (e) { if (_this.isAnimating) { return; } var i = e.dataPointIndex; var dataPoint = e.dataPoint; var dataSeries = this; var id = dataSeries.dataPointIds[i]; //dataPointEO = _this._eventManager.objectMap[id]; if (dataPoint.exploded) dataPoint.exploded = false;else dataPoint.exploded = true; // So that it doesn't try to explode when there is only one segment if (dataSeries.dataPoints.length > 1) { _this._animator.animate(0, explodeDuration, function (fractionComplete) { explodeToggle(fractionComplete); renderChartElementsInPlotArea(); //console.log("Explode Start"); }); } return; }; initLabels(); positionLabels(); positionLabels(); positionLabels(); positionLabels(); this.disableToolTip = true; this._animator.animate(0, this.animatedRender ? this.animationDuration : 0, function (fractionComplete) { animate(fractionComplete); renderChartElementsInPlotArea(); }, function () { _this.disableToolTip = false; _this._animator.animate(0, _this.animatedRender ? explodeDuration : 0, function (fractionComplete) { explodeToggle(fractionComplete); renderChartElementsInPlotArea(); }); //console.log("Animation Complete"); }); function renderChartElementsInPlotArea() { _this.plotArea.layoutManager.reset(); if (_this._title) { if (_this._title.dockInsidePlotArea || _this._title.horizontalAlign === "center" && _this._title.verticalAlign === "center") _this._title.render(); } if (_this.subtitles) for (var i = 0; i < _this.subtitles.length; i++) { var subtitle = _this.subtitles[i]; if (subtitle.dockInsidePlotArea || subtitle.horizontalAlign === "center" && subtitle.verticalAlign === "center") subtitle.render(); } if (_this.legend) { if (_this.legend.dockInsidePlotArea || _this.legend.horizontalAlign === "center" && _this.legend.verticalAlign === "center") _this.legend.render(); } } //this.ctx.strokeRect(plotArea.x1 + 1, plotArea.y1, plotArea.width - 2, plotArea.height); }; var _text_block = require('../core/text_block'); var _text_block2 = _interopRequireDefault(_text_block); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } },{"../core/text_block":34,"../helpers/utils":39}],8:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var ghostCtx = this._eventManager.ghostCtx; var axisXProps = plotUnit.axisX.lineCoordinates; var axisYProps = plotUnit.axisY.lineCoordinates; var markers = []; var plotArea = this.plotArea; ctx.save(); if (_utils.isCanvasSupported) ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { ghostCtx.beginPath(); ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ghostCtx.clip(); } for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var closingPath = []; var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var seriesId = dataSeries.id; this._eventManager.objectMap[seriesId] = { objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex }; var hexColor = intToHexColorString(seriesId); ghostCtx.fillStyle = hexColor; //ghostCtx.lineWidth = dataSeries.lineThickness; //ghostCtx.lineWidth = 20; markers = []; var isFirstDataPointInPlotArea = true; var i = 0, x, y1, y2; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth. var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; var baseY; var startPoint = null; if (dataPoints.length > 0) { //ctx.strokeStyle = "#4572A7 "; var color = dataSeries._colorSet[i % dataSeries._colorSet.length]; //ctx.strokeStyle = "red"; ctx.fillStyle = color; ctx.strokeStyle = color; ctx.lineWidth = dataSeries.lineThickness; if (ctx.setLineDash) { ctx.setLineDash(getLineDashArray(dataSeries.lineDashType, dataSeries.lineThickness)); } var prevDataNull = true; for (; i < dataPoints.length; i++) { dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (dataPoints[i].y === null || !dataPoints[i].y.length || typeof dataPoints[i].y[0] !== "number" || typeof dataPoints[i].y[1] !== "number") { closeArea(); prevDataNull = true; continue; } x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; y1 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[0] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; y2 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[1] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; if (isFirstDataPointInPlotArea || prevDataNull) { ctx.beginPath(); ctx.moveTo(x, y1); startPoint = { x: x, y: y1 }; closingPath = []; closingPath.push({ x: x, y: y2 }); if (_utils.isCanvasSupported) { ghostCtx.beginPath(); ghostCtx.moveTo(x, y1); } isFirstDataPointInPlotArea = false; prevDataNull = false; } else { ctx.lineTo(x, y1); closingPath.push({ x: x, y: y2 }); if (_utils.isCanvasSupported) ghostCtx.lineTo(x, y1); if (i % 250 == 0) { closeArea(); } } var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y1, y2: y2 }; //Render Marker if (dataPoints[i].markerSize !== 0) { if (dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0) { var markerProps = dataSeries.getMarkerProperties(i, x, y2, ctx); markers.push(markerProps); //if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) { // dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //} var markerColor = intToHexColorString(id); if (_utils.isCanvasSupported) { markers.push({ x: x, y: y2, ctx: ghostCtx, type: markerProps.type, size: markerProps.size, color: markerColor, borderColor: markerColor, borderThickness: markerProps.borderThickness }); } markerProps = dataSeries.getMarkerProperties(i, x, y1, ctx); markers.push(markerProps); var markerColor = intToHexColorString(id); if (_utils.isCanvasSupported) { markers.push({ x: x, y: y1, ctx: ghostCtx, type: markerProps.type, size: markerProps.size, color: markerColor, borderColor: markerColor, borderThickness: markerProps.borderThickness }); } } } if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "rangeArea", dataPoint: dataPoints[i], dataSeries: dataSeries, indexKeyword: 0, point: { x: x, y: y1 }, direction: dataPoints[i].y[0] <= dataPoints[i].y[1] ? -1 : 1, color: color }); this._indexLabels.push({ chartType: "rangeArea", dataPoint: dataPoints[i], dataSeries: dataSeries, indexKeyword: 1, point: { x: x, y: y2 }, direction: dataPoints[i].y[0] <= dataPoints[i].y[1] ? 1 : -1, color: color }); } //alert("hi"); } closeArea(); //startPoint = { x: x, y: y }; RenderHelper.drawMarkers(markers); } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); function closeArea() { if (!startPoint) return; var point = null; if (dataSeries.lineThickness > 0) ctx.stroke(); for (var i = closingPath.length - 1; i >= 0; i--) { point = closingPath[i]; ctx.lineTo(point.x, point.y); ghostCtx.lineTo(point.x, point.y); } ctx.closePath(); //ctx.lineTo(startPoint.x, startPoint.y); ctx.globalAlpha = dataSeries.fillOpacity; ctx.fill(); ctx.globalAlpha = 1; ghostCtx.fill(); //if (isCanvasSupported) { // ghostCtx.lineTo(x, baseY); // ghostCtx.lineTo(startPoint.x, baseY); // ghostCtx.closePath(); // ghostCtx.fill(); //} if (dataSeries.lineThickness > 0) { ctx.beginPath(); ctx.moveTo(point.x, point.y); for (var i = 0; i < closingPath.length; i++) { point = closingPath[i]; ctx.lineTo(point.x, point.y); } ctx.stroke(); } ctx.beginPath(); ctx.moveTo(x, y1); ghostCtx.beginPath(); ghostCtx.moveTo(x, y1); startPoint = { x: x, y: y1 }; closingPath = []; closingPath.push({ x: x, y: y2 }); } //ctx.beginPath(); //source and dest would be same when animation is not enabled var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.xClipAnimation, easingFunction: AnimationHelper.easing.linear, animationBase: 0 }; return animationInfo; }; var _utils = require("../helpers/utils"); },{"../helpers/utils":39}],9:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var color = null; var plotArea = this.plotArea; var i = 0, x1, x2, y; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number from dataTime everytime it is used. //In case of Bar Chart, yZeroToPixel is x co-ordinate! var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0; var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : Math.min(this.height * .15, this.plotArea.height / plotUnit.plotType.totalDataSeries * .9) << 0; var xMinDiff = plotUnit.axisX.dataInfo.minDiff; //var barWidth = (((plotArea.height / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum)) * Math.abs(xMinDiff)) / totalDataSeries * .9) << 0; var barWidth = plotArea.height / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.totalDataSeries * .9 << 0; if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) { barWidth = maxBarWidth / plotUnit.plotType.totalDataSeries * .9; } else if (barWidth < 1) barWidth = 1; ctx.save(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); this._eventManager.ghostCtx.clip(); } for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var isFirstDataPointInPlotArea = true; //dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); if (dataPoints.length > 0) { //var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y); var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false; ctx.strokeStyle = "#4572A7 "; for (i = 0; i < dataPoints.length; i++) { dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (dataPoints[i].y === null || !dataPoints[i].y.length || typeof dataPoints[i].y[0] !== "number" || typeof dataPoints[i].y[1] !== "number") continue; //x and y are pixel co-ordinates of point and should not be confused with X and Y values x1 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[0] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; x2 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[1] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; y = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; var y1 = y - plotUnit.plotType.totalDataSeries * barWidth / 2 + (plotUnit.previousDataSeriesCount + j) * barWidth << 0; var y2 = y1 + barWidth << 0; if (x1 > x2) { var temp = x1; x1 = x2; x2 = temp; } //drawRect(ctx, x1, y1, plotArea.x2, y2, "#EEEEEE", 0, null, false, false, false, false); //drawRect(ctx, x1, y1, plotArea.x2, y2, "#BDCED3", 0, null, false, false, false, false); color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length]; //color = "#1B4962"; drawRect(ctx, x1, y1, x2, y2, color, 0, null, bevelEnabled, false, false, false, dataSeries.fillOpacity); var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2 }; color = intToHexColorString(id); if (_utils.isCanvasSupported) drawRect(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false); if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "rangeBar", dataPoint: dataPoints[i], dataSeries: dataSeries, indexKeyword: 0, point: { x: dataPoints[i].y[1] >= dataPoints[i].y[0] ? x1 : x2, y: y1 + (y2 - y1) / 2 }, direction: dataPoints[i].y[1] >= dataPoints[i].y[0] ? -1 : 1, bounds: { x1: Math.min(x1, x2), y1: y1, x2: Math.max(x1, x2), y2: y2 }, color: color }); this._indexLabels.push({ chartType: "rangeBar", dataPoint: dataPoints[i], dataSeries: dataSeries, indexKeyword: 1, point: { x: dataPoints[i].y[1] >= dataPoints[i].y[0] ? x2 : x1, y: y1 + (y2 - y1) / 2 }, direction: dataPoints[i].y[1] >= dataPoints[i].y[0] ? 1 : -1, bounds: { x1: Math.min(x1, x2), y1: y1, x2: Math.max(x1, x2), y2: y2 }, color: color }); } } } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); //source and dest would be same when animation is not enabled var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.fadeInAnimation, easingFunction: AnimationHelper.easing.easeInQuad, animationBase: 0 }; return animationInfo; }; var _utils = require("../helpers/utils"); },{"../helpers/utils":39}],10:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var color = null; var plotArea = this.plotArea; var i = 0, x, y1, y2; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number from dataTime everytime it is used. var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0; var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .03; //var maxBarWidth = (this.width * .015); var xMinDiff = plotUnit.axisX.dataInfo.minDiff; //var barWidth = (((plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum)) * Math.abs(xMinDiff)) * .9) << 0; var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.totalDataSeries * .9 << 0; if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) { barWidth = maxBarWidth / plotUnit.plotType.totalDataSeries * .9; } else if (barWidth < 1) barWidth = 1; ctx.save(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); this._eventManager.ghostCtx.clip(); } //ctx.beginPath(); for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var isFirstDataPointInPlotArea = true; // Reducing pixelPerUnit by 1 just to overcome any problems due to rounding off of pixels. //dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //var offsetX = barWidth * plotUnit.index << 0; if (dataPoints.length > 0) { //var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y); var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false; for (i = 0; i < dataPoints.length; i++) { dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (dataPoints[i].y === null || !dataPoints[i].y.length || typeof dataPoints[i].y[0] !== "number" || typeof dataPoints[i].y[1] !== "number") continue; x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; y1 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[0] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; y2 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[1] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; //var x1 = x - barWidth / 2 << 0; var x1 = x - plotUnit.plotType.totalDataSeries * barWidth / 2 + (plotUnit.previousDataSeriesCount + j) * barWidth << 0; var x2 = x1 + barWidth << 0; var y1; var y2; color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length]; if (y1 > y2) { var temp = y1; y1 = y2; y2 = temp; } var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2 }; //var borderThickness = Math.max(1, (barWidth * .1 << 0)); var borderThickness = 0; drawRect(ctx, x1, y1, x2, y2, color, borderThickness, color, bevelEnabled, bevelEnabled, false, false, dataSeries.fillOpacity); color = intToHexColorString(id); if (_utils.isCanvasSupported) drawRect(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false); if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "rangeColumn", dataPoint: dataPoints[i], dataSeries: dataSeries, indexKeyword: 0, point: { x: x1 + (x2 - x1) / 2, y: dataPoints[i].y[1] >= dataPoints[i].y[0] ? y2 : y1 }, direction: dataPoints[i].y[1] >= dataPoints[i].y[0] ? -1 : 1, bounds: { x1: x1, y1: Math.min(y1, y2), x2: x2, y2: Math.max(y1, y2) }, color: color }); this._indexLabels.push({ chartType: "rangeColumn", dataPoint: dataPoints[i], dataSeries: dataSeries, indexKeyword: 1, point: { x: x1 + (x2 - x1) / 2, y: dataPoints[i].y[1] >= dataPoints[i].y[0] ? y1 : y2 }, direction: dataPoints[i].y[1] >= dataPoints[i].y[0] ? 1 : -1, bounds: { x1: x1, y1: Math.min(y1, y2), x2: x2, y2: Math.max(y1, y2) }, color: color }); } } } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); //source and dest would be same when animation is not enabled var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.fadeInAnimation, easingFunction: AnimationHelper.easing.easeInQuad, animationBase: 0 }; return animationInfo; }; var _utils = require("../helpers/utils"); },{"../helpers/utils":39}],11:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var ghostCtx = this._eventManager.ghostCtx; var axisXProps = plotUnit.axisX.lineCoordinates; var axisYProps = plotUnit.axisY.lineCoordinates; var markers = []; var plotArea = this.plotArea; ctx.save(); if (_utils.isCanvasSupported) ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { ghostCtx.beginPath(); ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ghostCtx.clip(); } for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var seriesId = dataSeries.id; this._eventManager.objectMap[seriesId] = { objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex }; var hexColor = intToHexColorString(seriesId); ghostCtx.fillStyle = hexColor; //ghostCtx.lineWidth = dataSeries.lineThickness; //ghostCtx.lineWidth = 20; markers = []; var isFirstDataPointInPlotArea = true; var i = 0, x, y1, y2; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth. var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; var baseY; var startPoint = null; var pixelsY1 = []; var pixelsY2 = []; if (dataPoints.length > 0) { //ctx.strokeStyle = "#4572A7 "; color = dataSeries._colorSet[i % dataSeries._colorSet.length]; //ctx.strokeStyle = "red"; ctx.fillStyle = color; ctx.strokeStyle = color; ctx.lineWidth = dataSeries.lineThickness; if (ctx.setLineDash) { ctx.setLineDash(getLineDashArray(dataSeries.lineDashType, dataSeries.lineThickness)); } for (; i < dataPoints.length; i++) { dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (dataPoints[i].y === null || !dataPoints[i].y.length || typeof dataPoints[i].y[0] !== "number" || typeof dataPoints[i].y[1] !== "number") { if (i > 0) { renderBezierArea(); pixelsY1 = []; pixelsY2 = []; } continue; } x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; y1 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[0] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; y2 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[1] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y1, y2: y2 }; pixelsY1[pixelsY1.length] = { x: x, y: y1 }; pixelsY2[pixelsY2.length] = { x: x, y: y2 }; //Render Marker if (dataPoints[i].markerSize !== 0) { if (dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0) { var markerProps = dataSeries.getMarkerProperties(i, x, y1, ctx); markers.push(markerProps); //if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) { // dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //} var markerColor = intToHexColorString(id); if (_utils.isCanvasSupported) { markers.push({ x: x, y: y1, ctx: ghostCtx, type: markerProps.type, size: markerProps.size, color: markerColor, borderColor: markerColor, borderThickness: markerProps.borderThickness }); } var markerProps = dataSeries.getMarkerProperties(i, x, y2, ctx); markers.push(markerProps); //if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) { // dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //} var markerColor = intToHexColorString(id); if (_utils.isCanvasSupported) { markers.push({ x: x, y: y2, ctx: ghostCtx, type: markerProps.type, size: markerProps.size, color: markerColor, borderColor: markerColor, borderThickness: markerProps.borderThickness }); } } } //Render Index Labels if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "splineArea", dataPoint: dataPoints[i], dataSeries: dataSeries, indexKeyword: 0, point: { x: x, y: y1 }, direction: dataPoints[i].y[0] <= dataPoints[i].y[1] ? -1 : 1, color: color }); this._indexLabels.push({ chartType: "splineArea", dataPoint: dataPoints[i], dataSeries: dataSeries, indexKeyword: 1, point: { x: x, y: y2 }, direction: dataPoints[i].y[0] <= dataPoints[i].y[1] ? 1 : -1, color: color }); } } renderBezierArea(); RenderHelper.drawMarkers(markers); } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); function renderBezierArea() { var bp = getBezierPoints(pixelsY1, 2); if (bp.length > 0) { ctx.beginPath(); ctx.moveTo(bp[0].x, bp[0].y); if (_utils.isCanvasSupported) { ghostCtx.beginPath(); ghostCtx.moveTo(bp[0].x, bp[0].y); } for (var i = 0; i < bp.length - 3; i += 3) { ctx.bezierCurveTo(bp[i + 1].x, bp[i + 1].y, bp[i + 2].x, bp[i + 2].y, bp[i + 3].x, bp[i + 3].y); if (_utils.isCanvasSupported) ghostCtx.bezierCurveTo(bp[i + 1].x, bp[i + 1].y, bp[i + 2].x, bp[i + 2].y, bp[i + 3].x, bp[i + 3].y); } if (dataSeries.lineThickness > 0) ctx.stroke(); bp = getBezierPoints(pixelsY2, 2); ctx.lineTo(pixelsY2[pixelsY2.length - 1].x, pixelsY2[pixelsY2.length - 1].y); for (var i = bp.length - 1; i > 2; i -= 3) { ctx.bezierCurveTo(bp[i - 1].x, bp[i - 1].y, bp[i - 2].x, bp[i - 2].y, bp[i - 3].x, bp[i - 3].y); if (_utils.isCanvasSupported) ghostCtx.bezierCurveTo(bp[i - 1].x, bp[i - 1].y, bp[i - 2].x, bp[i - 2].y, bp[i - 3].x, bp[i - 3].y); } ctx.closePath(); ctx.globalAlpha = dataSeries.fillOpacity; ctx.fill(); ctx.globalAlpha = 1; if (dataSeries.lineThickness > 0) { ctx.beginPath(); ctx.moveTo(pixelsY2[pixelsY2.length - 1].x, pixelsY2[pixelsY2.length - 1].y); for (var i = bp.length - 1; i > 2; i -= 3) { ctx.bezierCurveTo(bp[i - 1].x, bp[i - 1].y, bp[i - 2].x, bp[i - 2].y, bp[i - 3].x, bp[i - 3].y); if (_utils.isCanvasSupported) ghostCtx.bezierCurveTo(bp[i - 1].x, bp[i - 1].y, bp[i - 2].x, bp[i - 2].y, bp[i - 3].x, bp[i - 3].y); } ctx.stroke(); } ctx.beginPath(); if (_utils.isCanvasSupported) { ghostCtx.closePath(); ghostCtx.fill(); } } } //source and dest would be same when animation is not enabled var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.xClipAnimation, easingFunction: AnimationHelper.easing.linear, animationBase: 0 }; return animationInfo; }; var _utils = require("../helpers/utils"); //#region pieChart var drawSegment = function drawSegment(ctx, center, radius, color, type, theta1, theta2, fillOpacity, percentInnerRadius) { if (typeof fillOpacity === "undefined") fillOpacity = 1; //IE8- FIX: In IE8- segment doesn't get draw if theta2 is equal to theta1 + 2*PI. if (!_utils.isCanvasSupported) { var theta2Mod = Number((theta2 % (2 * Math.PI)).toFixed(8)); var theta1Mod = Number((theta1 % (2 * Math.PI)).toFixed(8)); if (theta1Mod === theta2Mod) theta2 -= .0001; } ctx.save(); ctx.globalAlpha = fillOpacity; if (type === "pie") { ctx.beginPath(); ctx.moveTo(center.x, center.y); ctx.arc(center.x, center.y, radius, theta1, theta2, false); ctx.fillStyle = color; ctx.strokeStyle = "white"; ctx.lineWidth = 2; // ctx.shadowOffsetX = 2; // ctx.shadowOffsetY = 1; // ctx.shadowBlur = 2; // ctx.shadowColor = '#BFBFBF'; ctx.closePath(); //ctx.stroke(); ctx.fill(); } else if (type === "doughnut") { ctx.beginPath(); ctx.arc(center.x, center.y, radius, theta1, theta2, false); ctx.arc(center.x, center.y, percentInnerRadius * radius, theta2, theta1, true); ctx.closePath(); ctx.fillStyle = color; ctx.strokeStyle = "white"; ctx.lineWidth = 2; // shadow properties // ctx.shadowOffsetX = 1; // ctx.shadowOffsetY = 1; // ctx.shadowBlur = 1; // ctx.shadowColor = '#BFBFBF'; //grey shadow //ctx.stroke(); ctx.fill(); } ctx.globalAlpha = 1; ctx.restore(); }; },{"../helpers/utils":39}],12:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var color = null; var plotArea = this.plotArea; var i = 0, x, y; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number from dataTime everytime it is used. var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0; var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0; var xMinDiff = plotUnit.axisX.dataInfo.minDiff; var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / totalDataSeries * .9 << 0; ctx.save(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); this._eventManager.ghostCtx.clip(); } for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var isFirstDataPointInPlotArea = true; if (dataPoints.length == 1) barWidth = maxBarWidth; if (barWidth < 1) barWidth = 1;else if (barWidth > maxBarWidth) barWidth = maxBarWidth; if (dataPoints.length > 0) { //var bevelEnabled = (barWidth > 5) ? false : false; ctx.strokeStyle = "#4572A7 "; var maxArea = Math.pow(Math.min(plotArea.height, plotArea.width) * .3 / 2, 2) * Math.PI; var prevDataPointX = 0; var prevDataPointY = 0; for (var i = 0; i < dataPoints.length; i++) { dataPointX = dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (typeof dataPoints[i].y !== "number") continue; x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; var markerProps = dataSeries.getMarkerProperties(i, x, y, ctx); ctx.globalAlpha = dataSeries.fillOpacity; _render2.default.drawMarker(markerProps.x, markerProps.y, markerProps.ctx, markerProps.type, markerProps.size, markerProps.color, markerProps.borderColor, markerProps.borderThickness); ctx.globalAlpha = 1; //if (Math.abs(prevDataPointX - x) < markerProps.size / 2 && Math.abs(prevDataPointY - y) < markerProps.size / 2) { // continue; //} //if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) { // dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //} if (Math.sqrt((prevDataPointX - x) * (prevDataPointX - x) + (prevDataPointY - y) * (prevDataPointY - y)) < Math.min(markerProps.size, 5) && dataPoints.length > Math.min(this.plotArea.width, this.plotArea.height)) { continue; } //Render ID on Ghost Canvas - for event handling var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y }; var markerColor = (0, _utils.intToHexColorString)(id); if (_utils.isCanvasSupported) { _render2.default.drawMarker(markerProps.x, markerProps.y, this._eventManager.ghostCtx, markerProps.type, markerProps.size, markerColor, markerColor, markerProps.borderThickness); } //markers.push(); if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "scatter", dataPoint: dataPoints[i], dataSeries: dataSeries, point: { x: x, y: y }, direction: 1, bounds: { x1: x - markerProps.size / 2, y1: y - markerProps.size / 2, x2: x + markerProps.size / 2, y2: y + markerProps.size / 2 }, color: color }); } prevDataPointX = x; prevDataPointY = y; } } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); //source and dest would be same when animation is not enabled var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: _animator2.default.fadeInAnimation, easingFunction: _animator2.default.easing.easeInQuad, animationBase: 0 }; return animationInfo; }; var _render = require('../helpers/render'); var _render2 = _interopRequireDefault(_render); var _animator = require('../helpers/animator'); var _animator2 = _interopRequireDefault(_animator); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } },{"../helpers/animator":37,"../helpers/render":38,"../helpers/utils":39}],13:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var ghostCtx = this._eventManager.ghostCtx; ctx.save(); var plotArea = this.plotArea; ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); var markers = []; for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; ctx.lineWidth = dataSeries.lineThickness; var dataPoints = dataSeries.dataPoints; if (ctx.setLineDash) { ctx.setLineDash(getLineDashArray(dataSeries.lineDashType, dataSeries.lineThickness)); } var seriesId = dataSeries.id; this._eventManager.objectMap[seriesId] = { objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex }; var hexColor = intToHexColorString(seriesId); ghostCtx.strokeStyle = hexColor; //ghostCtx.lineWidth = dataSeries.lineThickness; ghostCtx.lineWidth = dataSeries.lineThickness > 0 ? Math.max(dataSeries.lineThickness, 4) : 0; var colorSet = dataSeries._colorSet; var color = colorSet[0]; ctx.strokeStyle = color; var isFirstDataPointInPlotArea = true; var i = 0, x, y; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth. //if (!dataSeries._options.markerSize && dataSeries.dataPoints.length < 1000) // dataSeries.markerSize = 8; var pixels = []; ctx.beginPath(); if (dataPoints.length > 0) { for (i = 0; i < dataPoints.length; i++) { dataPointX = dataPoints[i].getTime ? dataPoints[i].x.getTime() : dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) continue; //if (!isFinite(dataPoints[i].y)) // continue; if (typeof dataPoints[i].y !== "number") { if (i > 0) { // if first dataPoint is null then no need to call stroke method renderBezier(pixels); pixels = []; } continue; } x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y }; pixels[pixels.length] = { x: x, y: y }; //Add Markers if (dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0) { var markerProps = dataSeries.getMarkerProperties(i, x, y, ctx); markers.push(markerProps); //if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) { // dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //} var markerColor = intToHexColorString(id); //window.console.log("index: " + i + "; id: " + id + "; hex: " + markerColor); if (_utils.isCanvasSupported) { markers.push({ x: x, y: y, ctx: ghostCtx, type: markerProps.type, size: markerProps.size, color: markerColor, borderColor: markerColor, borderThickness: markerProps.borderThickness }); } } //Add Labels if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "spline", dataPoint: dataPoints[i], dataSeries: dataSeries, point: { x: x, y: y }, direction: dataPoints[i].y >= 0 ? 1 : -1, color: color }); } } } renderBezier(pixels); } RenderHelper.drawMarkers(markers); ctx.restore(); ctx.beginPath(); if (_utils.isCanvasSupported) ghostCtx.beginPath(); function renderBezier(pixels) { var bp = getBezierPoints(pixels, 2); if (bp.length > 0) { ctx.beginPath(); if (_utils.isCanvasSupported) ghostCtx.beginPath(); ctx.moveTo(bp[0].x, bp[0].y); if (_utils.isCanvasSupported) ghostCtx.moveTo(bp[0].x, bp[0].y); for (var i = 0; i < bp.length - 3; i += 3) { ctx.bezierCurveTo(bp[i + 1].x, bp[i + 1].y, bp[i + 2].x, bp[i + 2].y, bp[i + 3].x, bp[i + 3].y); if (_utils.isCanvasSupported) ghostCtx.bezierCurveTo(bp[i + 1].x, bp[i + 1].y, bp[i + 2].x, bp[i + 2].y, bp[i + 3].x, bp[i + 3].y); if (i > 0 && i % 3000 === 0) { ctx.stroke(); ctx.beginPath(); ctx.moveTo(bp[i + 3].x, bp[i + 3].y); if (_utils.isCanvasSupported) { ghostCtx.stroke(); ghostCtx.beginPath(); ghostCtx.moveTo(bp[i + 3].x, bp[i + 3].y); } } } ctx.stroke(); if (_utils.isCanvasSupported) ghostCtx.stroke(); } } //source and dest would be same when animation is not enabled var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.xClipAnimation, easingFunction: AnimationHelper.easing.linear, animationBase: 0 }; return animationInfo; }; var _utils = require("../helpers/utils"); var drawRect = function drawRect(ctx, x1, y1, x2, y2, color, borderThickness, borderColor, top, bottom, left, right, fillOpacity) { if (typeof fillOpacity === "undefined") fillOpacity = 1; borderThickness = borderThickness || 0; borderColor = borderColor || "black"; //alert("top"+ top + "bottom" + bottom + " lt" + left+ "rt" + right ) var a1 = x1, a2 = x2, b1 = y1, b2 = y2, edgeY, edgeX; if (x2 - x1 > 15 && y2 - y1 > 15) var bevelDepth = 8;else var bevelDepth = 0.35 * Math.min(x2 - x1, y2 - y1); //alert(a1 + "" + a2); var color2 = "rgba(255, 255, 255, .4)"; var color3 = "rgba(255, 255, 255, 0.1)"; //color1 = "rgba(" + r + "," + g + ", " + b + ",1)"; var color1 = color; ctx.beginPath(); ctx.moveTo(x1, y1); ctx.save(); ctx.fillStyle = color1; ctx.globalAlpha = fillOpacity; ctx.fillRect(x1, y1, x2 - x1, y2 - y1); ctx.globalAlpha = 1; if (borderThickness > 0) { var offset = borderThickness % 2 === 0 ? 0 : .5; ctx.beginPath(); ctx.lineWidth = borderThickness; ctx.strokeStyle = borderColor; ctx.moveTo(x1, y1); ctx.rect(x1 - offset, y1 - offset, x2 - x1 + 2 * offset, y2 - y1 + 2 * offset); ctx.stroke(); } ctx.restore(); // ctx.beginPath(); if (top === true) { // alert(x1 + "" + x2 + " " + bevelDepth); ctx.save(); ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x1 + bevelDepth, y1 + bevelDepth); ctx.lineTo(x2 - bevelDepth, y1 + bevelDepth); ctx.lineTo(x2, y1); ctx.closePath(); var grd = ctx.createLinearGradient((x2 + x1) / 2, b1 + bevelDepth, (x2 + x1) / 2, b1); grd.addColorStop(0, color1); grd.addColorStop(1, color2); ctx.fillStyle = grd; ctx.fill(); // ctx.stroke(); ctx.restore(); } if (bottom === true) { ctx.save(); ctx.beginPath(); ctx.moveTo(x1, y2); ctx.lineTo(x1 + bevelDepth, y2 - bevelDepth); ctx.lineTo(x2 - bevelDepth, y2 - bevelDepth); ctx.lineTo(x2, y2); ctx.closePath(); var grd = ctx.createLinearGradient((x2 + x1) / 2, b2 - bevelDepth, (x2 + x1) / 2, b2); grd.addColorStop(0, color1); grd.addColorStop(1, color2); ctx.fillStyle = grd; // ctx.stroke(); ctx.fill(); ctx.restore(); } if (left === true) { // alert(x1) ctx.save(); ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x1 + bevelDepth, y1 + bevelDepth); ctx.lineTo(x1 + bevelDepth, y2 - bevelDepth); ctx.lineTo(x1, y2); ctx.closePath(); var grd = ctx.createLinearGradient(a1 + bevelDepth, (y2 + y1) / 2, a1, (y2 + y1) / 2); grd.addColorStop(0, color1); grd.addColorStop(1, color3); ctx.fillStyle = grd; ctx.fill(); // ctx.stroke(); ctx.restore(); } if (right === true) { ctx.save(); ctx.beginPath(); ctx.moveTo(x2, y1); ctx.lineTo(x2 - bevelDepth, y1 + bevelDepth); ctx.lineTo(x2 - bevelDepth, y2 - bevelDepth); ctx.lineTo(x2, y2); var grd = ctx.createLinearGradient(a2 - bevelDepth, (y2 + y1) / 2, a2, (y2 + y1) / 2); grd.addColorStop(0, color1); grd.addColorStop(1, color3); ctx.fillStyle = grd; grd.addColorStop(0, color1); grd.addColorStop(1, color3); ctx.fillStyle = grd; ctx.fill(); ctx.closePath(); // ctx.stroke(); ctx.restore(); } // }; },{"../helpers/utils":39}],14:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var ghostCtx = this._eventManager.ghostCtx; var axisXProps = plotUnit.axisX.lineCoordinates; var axisYProps = plotUnit.axisY.lineCoordinates; var markers = []; var plotArea = this.plotArea; ctx.save(); if (_utils.isCanvasSupported) ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { ghostCtx.beginPath(); ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ghostCtx.clip(); } for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var seriesId = dataSeries.id; this._eventManager.objectMap[seriesId] = { objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex }; var hexColor = intToHexColorString(seriesId); ghostCtx.fillStyle = hexColor; //ghostCtx.lineWidth = dataSeries.lineThickness; //ghostCtx.lineWidth = 20; markers = []; var isFirstDataPointInPlotArea = true; var i = 0, x, y; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth. var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; var baseY; var startPoint = null; var pixels = []; if (dataPoints.length > 0) { //ctx.strokeStyle = "#4572A7 "; color = dataSeries._colorSet[i % dataSeries._colorSet.length]; ctx.fillStyle = color; ctx.strokeStyle = color; ctx.lineWidth = dataSeries.lineThickness; if (ctx.setLineDash) { ctx.setLineDash(getLineDashArray(dataSeries.lineDashType, dataSeries.lineThickness)); } for (; i < dataPoints.length; i++) { dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (typeof dataPoints[i].y !== "number") { if (i > 0) { renderBezierArea(); pixels = []; } continue; } x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y }; pixels[pixels.length] = { x: x, y: y }; //Render Marker if (dataPoints[i].markerSize !== 0) { if (dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0) { var markerProps = dataSeries.getMarkerProperties(i, x, y, ctx); markers.push(markerProps); //if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) { // dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //} var markerColor = intToHexColorString(id); if (_utils.isCanvasSupported) { markers.push({ x: x, y: y, ctx: ghostCtx, type: markerProps.type, size: markerProps.size, color: markerColor, borderColor: markerColor, borderThickness: markerProps.borderThickness }); } } } //Render Index Labels if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "splineArea", dataPoint: dataPoints[i], dataSeries: dataSeries, point: { x: x, y: y }, direction: dataPoints[i].y >= 0 ? 1 : -1, color: color }); } } renderBezierArea(); RenderHelper.drawMarkers(markers); } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); function renderBezierArea() { var bp = getBezierPoints(pixels, 2); if (bp.length > 0) { ctx.beginPath(); ctx.moveTo(bp[0].x, bp[0].y); if (_utils.isCanvasSupported) { ghostCtx.beginPath(); ghostCtx.moveTo(bp[0].x, bp[0].y); } for (var i = 0; i < bp.length - 3; i += 3) { ctx.bezierCurveTo(bp[i + 1].x, bp[i + 1].y, bp[i + 2].x, bp[i + 2].y, bp[i + 3].x, bp[i + 3].y); if (_utils.isCanvasSupported) ghostCtx.bezierCurveTo(bp[i + 1].x, bp[i + 1].y, bp[i + 2].x, bp[i + 2].y, bp[i + 3].x, bp[i + 3].y); } if (dataSeries.lineThickness > 0) ctx.stroke(); if (plotUnit.axisY.viewportMinimum <= 0 && plotUnit.axisY.viewportMaximum >= 0) { baseY = yZeroToPixel; } else if (plotUnit.axisY.viewportMaximum < 0) baseY = axisYProps.y1;else if (plotUnit.axisY.viewportMinimum > 0) baseY = axisXProps.y2; startPoint = { x: bp[0].x, y: bp[0].y }; ctx.lineTo(bp[bp.length - 1].x, baseY); ctx.lineTo(startPoint.x, baseY); ctx.closePath(); ctx.globalAlpha = dataSeries.fillOpacity; ctx.fill(); ctx.globalAlpha = 1; if (_utils.isCanvasSupported) { ghostCtx.lineTo(bp[bp.length - 1].x, baseY); ghostCtx.lineTo(startPoint.x, baseY); ghostCtx.closePath(); ghostCtx.fill(); } } } //source and dest would be same when animation is not enabled var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.xClipAnimation, easingFunction: AnimationHelper.easing.linear, animationBase: 0 }; return animationInfo; }; var _utils = require("../helpers/utils"); },{"../helpers/utils":39}],15:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var color = null; var markers = []; var plotArea = this.plotArea; var offsetY = []; var allXValues = []; //var offsetNegativeY = []; var i = 0, x, y; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number everytime it is accessed. //var yZeroToPixel = (axisYProps.y2 - axisYProps.height / rangeY * Math.abs(0 - plotUnit.axisY.viewportMinimum) + .5) << 0; var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0; var xMinDiff = plotUnit.axisX.dataInfo.minDiff; var ghostCtx = this._eventManager.ghostCtx; if (_utils.isCanvasSupported) ghostCtx.beginPath(); ctx.save(); if (_utils.isCanvasSupported) ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { ghostCtx.beginPath(); ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ghostCtx.clip(); } var xValuePresent = []; for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var xValue; dataSeries.dataPointIndexes = []; for (i = 0; i < dataPoints.length; i++) { xValue = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x; dataSeries.dataPointIndexes[xValue] = i; if (!xValuePresent[xValue]) { allXValues.push(xValue); xValuePresent[xValue] = true; } } allXValues.sort(_utils.compareNumbers); } for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var isFirstDataPointInPlotArea = true; var currentBaseValues = []; var seriesId = dataSeries.id; this._eventManager.objectMap[seriesId] = { objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex }; var hexColor = (0, _utils.intToHexColorString)(seriesId); ghostCtx.fillStyle = hexColor; if (allXValues.length > 0) { color = dataSeries._colorSet[0]; //ctx.strokeStyle = "red"; ctx.fillStyle = color; ctx.strokeStyle = color; ctx.lineWidth = dataSeries.lineThickness; if (ctx.setLineDash) { ctx.setLineDash((0, _utils.getLineDashArray)(dataSeries.lineDashType, dataSeries.lineThickness)); } for (i = 0; i < allXValues.length; i++) { dataPointX = allXValues[i]; var dataPoint = null; if (dataSeries.dataPointIndexes[dataPointX] >= 0) dataPoint = dataPoints[dataSeries.dataPointIndexes[dataPointX]];else dataPoint = { x: dataPointX, y: 0 }; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (typeof dataPoint.y !== "number") continue; var x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; //var y = (plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoint.y - plotUnit.axisY.conversionParameters.minimum) + .5) << 0; var y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoint.y - plotUnit.axisY.conversionParameters.minimum); var offset = offsetY[dataPointX] ? offsetY[dataPointX] : 0; y = y - offset; currentBaseValues.push({ x: x, y: yZeroToPixel - offset }); offsetY[dataPointX] = yZeroToPixel - y; if (isFirstDataPointInPlotArea) { ctx.beginPath(); ctx.moveTo(x, y); if (_utils.isCanvasSupported) { ghostCtx.beginPath(); ghostCtx.moveTo(x, y); } isFirstDataPointInPlotArea = false; } else { ctx.lineTo(x, y); if (_utils.isCanvasSupported) ghostCtx.lineTo(x, y); if (i % 250 == 0) { if (dataSeries.lineThickness > 0) ctx.stroke(); while (currentBaseValues.length > 0) { var point = currentBaseValues.pop(); ctx.lineTo(point.x, point.y); if (_utils.isCanvasSupported) ghostCtx.lineTo(point.x, point.y); } ctx.closePath(); ctx.globalAlpha = dataSeries.fillOpacity; ctx.fill(); ctx.globalAlpha = 1; ctx.beginPath(); ctx.moveTo(x, y); if (_utils.isCanvasSupported) { ghostCtx.closePath(); ghostCtx.fill(); ghostCtx.beginPath(); ghostCtx.moveTo(x, y); } currentBaseValues.push({ x: x, y: yZeroToPixel - offset }); } } if (dataSeries.dataPointIndexes[dataPointX] >= 0) { var id = dataSeries.dataPointIds[dataSeries.dataPointIndexes[dataPointX]]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: dataSeries.dataPointIndexes[dataPointX], x1: x, y1: y }; } //Render Marker if (dataSeries.dataPointIndexes[dataPointX] >= 0 && dataPoint.markerSize !== 0) { if (dataPoint.markerSize > 0 || dataSeries.markerSize > 0) { var markerProps = dataSeries.getMarkerProperties(i, x, y, ctx); markers.push(markerProps); //if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) { // dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //} markerColor = (0, _utils.intToHexColorString)(id); if (_utils.isCanvasSupported) { markers.push({ x: x, y: y, ctx: ghostCtx, type: markerProps.type, size: markerProps.size, color: markerColor, borderColor: markerColor, borderThickness: markerProps.borderThickness }); } } } if (dataPoint.indexLabel || dataSeries.indexLabel || dataPoint.indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "stackedArea", dataPoint: dataPoint, dataSeries: dataSeries, point: { x: x, y: y }, direction: dataPoints[i].y >= 0 ? 1 : -1, color: color }); } } if (dataSeries.lineThickness > 0) ctx.stroke(); while (currentBaseValues.length > 0) { var point = currentBaseValues.pop(); ctx.lineTo(point.x, point.y); if (_utils.isCanvasSupported) ghostCtx.lineTo(point.x, point.y); } ctx.closePath(); ctx.globalAlpha = dataSeries.fillOpacity; ctx.fill(); ctx.globalAlpha = 1; ctx.beginPath(); ctx.moveTo(x, y); if (_utils.isCanvasSupported) { ghostCtx.closePath(); ghostCtx.fill(); ghostCtx.beginPath(); ghostCtx.moveTo(x, y); } } delete dataSeries.dataPointIndexes; } _render2.default.drawMarkers(markers); ctx.restore(); if (_utils.isCanvasSupported) ghostCtx.restore(); //source and dest would be same when animation is not enabled var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: _animator2.default.xClipAnimation, easingFunction: _animator2.default.easing.linear, animationBase: 0 }; return animationInfo; }; var _render = require('../helpers/render'); var _render2 = _interopRequireDefault(_render); var _animator = require('../helpers/animator'); var _animator2 = _interopRequireDefault(_animator); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } },{"../helpers/animator":37,"../helpers/render":38,"../helpers/utils":39}],16:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var color = null; var plotArea = this.plotArea; var markers = []; var offsetY = []; var allXValues = []; //var offsetNegativeY = []; var i = 0, x, y; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number everytime it is accessed. //var yZeroToPixel = (axisYProps.y2 - axisYProps.height / rangeY * Math.abs(0 - plotUnit.axisY.viewportMinimum) + .5) << 0; var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0; var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0; var xMinDiff = plotUnit.axisX.dataInfo.minDiff; var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) * .9 << 0; var ghostCtx = this._eventManager.ghostCtx; ctx.save(); if (_utils.isCanvasSupported) ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { ghostCtx.beginPath(); ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ghostCtx.clip(); } var xValuePresent = []; for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var xValue; dataSeries.dataPointIndexes = []; for (i = 0; i < dataPoints.length; i++) { xValue = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x; dataSeries.dataPointIndexes[xValue] = i; if (!xValuePresent[xValue]) { allXValues.push(xValue); xValuePresent[xValue] = true; } } allXValues.sort(_utils.compareNumbers); } for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var isFirstDataPointInPlotArea = true; var seriesId = dataSeries.id; this._eventManager.objectMap[seriesId] = { objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex }; var hexColor = (0, _utils.intToHexColorString)(seriesId); ghostCtx.fillStyle = hexColor; if (dataPoints.length == 1) barWidth = maxBarWidth; if (barWidth < 1) barWidth = 1;else if (barWidth > maxBarWidth) barWidth = maxBarWidth; var currentBaseValues = []; if (allXValues.length > 0) { color = dataSeries._colorSet[i % dataSeries._colorSet.length]; //ctx.strokeStyle = "red"; ctx.fillStyle = color; ctx.strokeStyle = color; ctx.lineWidth = dataSeries.lineThickness; if (ctx.setLineDash) { ctx.setLineDash((0, _utils.getLineDashArray)(dataSeries.lineDashType, dataSeries.lineThickness)); } var bevelEnabled = barWidth > 5 ? false : false; //ctx.strokeStyle = "#4572A7 "; for (i = 0; i < allXValues.length; i++) { dataPointX = allXValues[i]; var dataPoint = null; if (dataSeries.dataPointIndexes[dataPointX] >= 0) dataPoint = dataPoints[dataSeries.dataPointIndexes[dataPointX]];else dataPoint = { x: dataPointX, y: 0 }; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (typeof dataPoint.y !== "number") continue; var yPercent; if (plotUnit.dataPointYSums[dataPointX] !== 0) yPercent = dataPoint.y / plotUnit.dataPointYSums[dataPointX] * 100;else yPercent = 0; var x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; var y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (yPercent - plotUnit.axisY.conversionParameters.minimum); var offset = offsetY[dataPointX] ? offsetY[dataPointX] : 0; y = y - offset; currentBaseValues.push({ x: x, y: yZeroToPixel - offset }); offsetY[dataPointX] = yZeroToPixel - y; if (isFirstDataPointInPlotArea) { ctx.beginPath(); ctx.moveTo(x, y); if (_utils.isCanvasSupported) { ghostCtx.beginPath(); ghostCtx.moveTo(x, y); } isFirstDataPointInPlotArea = false; } else { ctx.lineTo(x, y); if (_utils.isCanvasSupported) ghostCtx.lineTo(x, y); if (i % 250 == 0) { if (dataSeries.lineThickness > 0) ctx.stroke(); while (currentBaseValues.length > 0) { var point = currentBaseValues.pop(); ctx.lineTo(point.x, point.y); if (_utils.isCanvasSupported) ghostCtx.lineTo(point.x, point.y); } ctx.closePath(); ctx.globalAlpha = dataSeries.fillOpacity; ctx.fill(); ctx.globalAlpha = 1; ctx.beginPath(); ctx.moveTo(x, y); if (_utils.isCanvasSupported) { ghostCtx.closePath(); ghostCtx.fill(); ghostCtx.beginPath(); ghostCtx.moveTo(x, y); } currentBaseValues.push({ x: x, y: yZeroToPixel - offset }); } } if (dataSeries.dataPointIndexes[dataPointX] >= 0) { var id = dataSeries.dataPointIds[dataSeries.dataPointIndexes[dataPointX]]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: dataSeries.dataPointIndexes[dataPointX], x1: x, y1: y }; } //Render Marker if (dataSeries.dataPointIndexes[dataPointX] >= 0 && dataPoint.markerSize !== 0) { if (dataPoint.markerSize > 0 || dataSeries.markerSize > 0) { var markerProps = dataSeries.getMarkerProperties(i, x, y, ctx); markers.push(markerProps); //if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) { // dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //} markerColor = (0, _utils.intToHexColorString)(id); if (_utils.isCanvasSupported) { markers.push({ x: x, y: y, ctx: ghostCtx, type: markerProps.type, size: markerProps.size, color: markerColor, borderColor: markerColor, borderThickness: markerProps.borderThickness }); } } } if (dataPoint.indexLabel || dataSeries.indexLabel || dataPoint.indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "stackedArea100", dataPoint: dataPoint, dataSeries: dataSeries, point: { x: x, y: y }, direction: dataPoints[i].y >= 0 ? 1 : -1, color: color }); } } if (dataSeries.lineThickness > 0) ctx.stroke(); while (currentBaseValues.length > 0) { var point = currentBaseValues.pop(); ctx.lineTo(point.x, point.y); if (_utils.isCanvasSupported) ghostCtx.lineTo(point.x, point.y); } ctx.closePath(); ctx.globalAlpha = dataSeries.fillOpacity; ctx.fill(); ctx.globalAlpha = 1; ctx.beginPath(); ctx.moveTo(x, y); if (_utils.isCanvasSupported) { ghostCtx.closePath(); ghostCtx.fill(); ghostCtx.beginPath(); ghostCtx.moveTo(x, y); } } delete dataSeries.dataPointIndexes; } _render2.default.drawMarkers(markers); ctx.restore(); if (_utils.isCanvasSupported) ghostCtx.restore(); //source and dest would be same when animation is not enabled var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: _animator2.default.xClipAnimation, easingFunction: _animator2.default.easing.linear, animationBase: 0 }; return animationInfo; }; var _render = require('../helpers/render'); var _render2 = _interopRequireDefault(_render); var _animator = require('../helpers/animator'); var _animator2 = _interopRequireDefault(_animator); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } },{"../helpers/animator":37,"../helpers/render":38,"../helpers/utils":39}],17:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var color = null; var plotArea = this.plotArea; var offsetPositiveY = []; var offsetNegativeY = []; var i = 0, x, y; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number everytime it is accessed. //var yZeroToPixel = (axisYProps.y2 - axisYProps.height / rangeY * Math.abs(0 - plotUnit.axisY.viewportMinimum) + .5) << 0; var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0; var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.height * .15 << 0; var xMinDiff = plotUnit.axisX.dataInfo.minDiff; var barWidth = plotArea.height / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.plotUnits.length * .9 << 0; if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) { barWidth = maxBarWidth; } else if (barWidth < 1) barWidth = 1; ctx.save(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); this._eventManager.ghostCtx.clip(); } for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var isFirstDataPointInPlotArea = true; //dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); if (dataPoints.length > 0) { //var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y); var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false; ctx.strokeStyle = "#4572A7 "; for (i = 0; i < dataPoints.length; i++) { dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (typeof dataPoints[i].y !== "number") continue; y = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; //x = (plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5) << 0; x = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum); //var x1 = x - (plotUnit.plotType.plotUnits.length * barWidth / 2) + (plotUnit.index * barWidth) << 0; var y1 = y - plotUnit.plotType.plotUnits.length * barWidth / 2 + plotUnit.index * barWidth << 0; var y2 = y1 + barWidth << 0; var x1; var x2; if (dataPoints[i].y >= 0) { var offset = offsetPositiveY[dataPointX] ? offsetPositiveY[dataPointX] : 0; x1 = yZeroToPixel + offset; x2 = x + offset; offsetPositiveY[dataPointX] = offset + (x2 - x1); } else { var offset = offsetNegativeY[dataPointX] ? offsetNegativeY[dataPointX] : 0; x1 = x - offset; x2 = yZeroToPixel - offset; offsetNegativeY[dataPointX] = offset + (x2 - x1); } color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length]; drawRect(ctx, x1, y1, x2, y2, color, 0, null, bevelEnabled, false, false, false, dataSeries.fillOpacity); var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2 }; color = intToHexColorString(id); if (_utils.isCanvasSupported) drawRect(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false); if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) this._indexLabels.push({ chartType: "stackedBar", dataPoint: dataPoints[i], dataSeries: dataSeries, point: { x: dataPoints[i].y >= 0 ? x2 : x1, y: y }, direction: dataPoints[i].y >= 0 ? 1 : -1, bounds: { x1: Math.min(x1, x2), y1: y1, x2: Math.max(x1, x2), y2: y2 }, color: color }); } } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); //source and dest would be same when animation is not enabled var animationBase = Math.max(yZeroToPixel, plotUnit.axisX.boundingRect.x2); var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.xScaleAnimation, easingFunction: AnimationHelper.easing.easeOutQuart, animationBase: animationBase }; return animationInfo; }; var _utils = require("../helpers/utils"); },{"../helpers/utils":39}],18:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var color = null; var plotArea = this.plotArea; var offsetPositiveY = []; var offsetNegativeY = []; var i = 0, x, y; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number everytime it is accessed. //var yZeroToPixel = (axisYProps.y2 - axisYProps.height / rangeY * Math.abs(0 - plotUnit.axisY.viewportMinimum) + .5) << 0; var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0; var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.height * .15 << 0; var xMinDiff = plotUnit.axisX.dataInfo.minDiff; var barWidth = plotArea.height / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.plotUnits.length * .9 << 0; if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) { barWidth = maxBarWidth; } else if (barWidth < 1) barWidth = 1; ctx.save(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); this._eventManager.ghostCtx.clip(); } for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var isFirstDataPointInPlotArea = true; //dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); if (dataPoints.length > 0) { //var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y); var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false; ctx.strokeStyle = "#4572A7 "; for (i = 0; i < dataPoints.length; i++) { dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (typeof dataPoints[i].y !== "number") continue; y = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; var yPercent; if (plotUnit.dataPointYSums[dataPointX] !== 0) yPercent = dataPoints[i].y / plotUnit.dataPointYSums[dataPointX] * 100;else yPercent = 0; //x = (plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (yPercent - plotUnit.axisY.conversionParameters.minimum) + .5) << 0; x = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (yPercent - plotUnit.axisY.conversionParameters.minimum); var y1 = y - plotUnit.plotType.plotUnits.length * barWidth / 2 + plotUnit.index * barWidth << 0; var y2 = y1 + barWidth << 0; var x1; var x2; if (dataPoints[i].y >= 0) { var offset = offsetPositiveY[dataPointX] ? offsetPositiveY[dataPointX] : 0; x1 = yZeroToPixel + offset; x2 = x + offset; offsetPositiveY[dataPointX] = offset + (x2 - x1); } else { var offset = offsetNegativeY[dataPointX] ? offsetNegativeY[dataPointX] : 0; x1 = x - offset; x2 = yZeroToPixel - offset; offsetNegativeY[dataPointX] = offset + (x2 - x1); } color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length]; drawRect(ctx, x1, y1, x2, y2, color, 0, null, bevelEnabled, false, false, false, dataSeries.fillOpacity); var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2 }; color = intToHexColorString(id); if (_utils.isCanvasSupported) drawRect(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false); if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) this._indexLabels.push({ chartType: "stackedBar100", dataPoint: dataPoints[i], dataSeries: dataSeries, point: { x: dataPoints[i].y >= 0 ? x2 : x1, y: y }, direction: dataPoints[i].y >= 0 ? 1 : -1, bounds: { x1: Math.min(x1, x2), y1: y1, x2: Math.max(x1, x2), y2: y2 }, color: color }); } } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); //source and dest would be same when animation is not enabled var animationBase = Math.max(yZeroToPixel, plotUnit.axisX.boundingRect.x2); var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.xScaleAnimation, easingFunction: AnimationHelper.easing.easeOutQuart, animationBase: animationBase }; return animationInfo; }; var _utils = require("../helpers/utils"); },{"../helpers/utils":39}],19:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var color = null; var plotArea = this.plotArea; var offsetPositiveY = []; var offsetNegativeY = []; var i = 0, x, y; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number everytime it is accessed. //var yZeroToPixel = (axisYProps.y2 - axisYProps.height / rangeY * Math.abs(0 - plotUnit.axisY.viewportMinimum) + .5) << 0; var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0; var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0; var xMinDiff = plotUnit.axisX.dataInfo.minDiff; var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.plotUnits.length * .9 << 0; if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) { barWidth = maxBarWidth; } else if (barWidth < 1) barWidth = 1; ctx.save(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); this._eventManager.ghostCtx.clip(); } for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var isFirstDataPointInPlotArea = true; // Reducing pixelPerUnit by 1 just to overcome any problems due to rounding off of pixels. //dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); if (dataPoints.length > 0) { //var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y); var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false; ctx.strokeStyle = "#4572A7 "; for (i = 0; i < dataPoints.length; i++) { dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (typeof dataPoints[i].y !== "number") continue; x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum); var x1 = x - plotUnit.plotType.plotUnits.length * barWidth / 2 + plotUnit.index * barWidth << 0; var x2 = x1 + barWidth << 0; var y1; var y2; if (dataPoints[i].y >= 0) { var offset = offsetPositiveY[dataPointX] ? offsetPositiveY[dataPointX] : 0; y1 = y - offset; y2 = yZeroToPixel - offset; offsetPositiveY[dataPointX] = offset + (y2 - y1); } else { var offset = offsetNegativeY[dataPointX] ? offsetNegativeY[dataPointX] : 0; y2 = y + offset; y1 = yZeroToPixel + offset; offsetNegativeY[dataPointX] = offset + (y2 - y1); } color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length]; drawRect(ctx, x1, y1, x2, y2, color, 0, null, bevelEnabled && dataPoints[i].y >= 0, dataPoints[i].y < 0 && bevelEnabled, false, false, dataSeries.fillOpacity); //if (dataSeries.markerType && dataSeries.markerSize > 0) { // RenderHelper.drawMarker(x1 + (x2 - x1)/2, y1, ctx, dataSeries.markerType, dataSeries.markerSize, color, dataSeries.markerBorderColor, dataSeries.markerBorderThickness ? dataSeries.markerBorderThickness : 1); //} var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2 }; color = intToHexColorString(id); if (_utils.isCanvasSupported) drawRect(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false); if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "stackedColumn", dataPoint: dataPoints[i], dataSeries: dataSeries, point: { x: x, y: dataPoints[i].y >= 0 ? y1 : y2 }, direction: dataPoints[i].y >= 0 ? 1 : -1, bounds: { x1: x1, y1: Math.min(y1, y2), x2: x2, y2: Math.max(y1, y2) }, color: color }); } } } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); //source and dest would be same when animation is not enabled var animationBase = Math.min(yZeroToPixel, plotUnit.axisY.boundingRect.y2); var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.yScaleAnimation, easingFunction: AnimationHelper.easing.easeOutQuart, animationBase: animationBase }; return animationInfo; }; var _utils = require("../helpers/utils"); },{"../helpers/utils":39}],20:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var color = null; var plotArea = this.plotArea; var offsetPositiveY = []; var offsetNegativeY = []; var i = 0, x, y; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number everytime it is accessed. //var yZeroToPixel = (axisYProps.y2 - axisYProps.height / rangeY * Math.abs(0 - plotUnit.axisY.viewportMinimum) + .5) << 0; var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0; var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0; var xMinDiff = plotUnit.axisX.dataInfo.minDiff; var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.plotUnits.length * .9 << 0; if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) { barWidth = maxBarWidth; } else if (barWidth < 1) barWidth = 1; ctx.save(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); this._eventManager.ghostCtx.clip(); } for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var isFirstDataPointInPlotArea = true; //dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); if (dataPoints.length > 0) { //var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y); var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false; //ctx.strokeStyle = "#4572A7 "; for (i = 0; i < dataPoints.length; i++) { dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } if (typeof dataPoints[i].y !== "number") continue; x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; var yPercent; if (plotUnit.dataPointYSums[dataPointX] !== 0) yPercent = dataPoints[i].y / plotUnit.dataPointYSums[dataPointX] * 100;else yPercent = 0; //y = (plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (yPercent - plotUnit.axisY.conversionParameters.minimum) + .5) << 0; y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (yPercent - plotUnit.axisY.conversionParameters.minimum); var x1 = x - plotUnit.plotType.plotUnits.length * barWidth / 2 + plotUnit.index * barWidth << 0; var x2 = x1 + barWidth << 0; var y1; var y2; if (dataPoints[i].y >= 0) { var offset = offsetPositiveY[dataPointX] ? offsetPositiveY[dataPointX] : 0; y1 = y - offset; y2 = yZeroToPixel - offset; offsetPositiveY[dataPointX] = offset + (y2 - y1); } else { var offset = offsetNegativeY[dataPointX] ? offsetNegativeY[dataPointX] : 0; y2 = y + offset; y1 = yZeroToPixel + offset; offsetNegativeY[dataPointX] = offset + (y2 - y1); } color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length]; drawRect(ctx, x1, y1, x2, y2, color, 0, null, bevelEnabled && dataPoints[i].y >= 0, dataPoints[i].y < 0 && bevelEnabled, false, false, dataSeries.fillOpacity); var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2 }; color = intToHexColorString(id); if (_utils.isCanvasSupported) drawRect(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false); if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "stackedColumn100", dataPoint: dataPoints[i], dataSeries: dataSeries, point: { x: x, y: dataPoints[i].y >= 0 ? y1 : y2 }, direction: dataPoints[i].y >= 0 ? 1 : -1, bounds: { x1: x1, y1: Math.min(y1, y2), x2: x2, y2: Math.max(y1, y2) }, color: color }); } } } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); //source and dest would be same when animation is not enabled var animationBase = Math.min(yZeroToPixel, plotUnit.axisY.boundingRect.y2); var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.yScaleAnimation, easingFunction: AnimationHelper.easing.easeOutQuart, animationBase: animationBase }; return animationInfo; }; var _utils = require("../helpers/utils"); },{"../helpers/utils":39}],21:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (plotUnit) { var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx; var totalDataSeries = plotUnit.dataSeriesIndexes.length; if (totalDataSeries <= 0) return; var ghostCtx = this._eventManager.ghostCtx; var axisXProps = plotUnit.axisX.lineCoordinates; var axisYProps = plotUnit.axisY.lineCoordinates; var markers = []; var plotArea = this.plotArea; ctx.save(); if (_utils.isCanvasSupported) ghostCtx.save(); ctx.beginPath(); ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ctx.clip(); if (_utils.isCanvasSupported) { ghostCtx.beginPath(); ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height); ghostCtx.clip(); } for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) { var dataSeriesIndex = plotUnit.dataSeriesIndexes[j]; var dataSeries = this.data[dataSeriesIndex]; var dataPoints = dataSeries.dataPoints; var seriesId = dataSeries.id; this._eventManager.objectMap[seriesId] = { objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex }; var hexColor = intToHexColorString(seriesId); ghostCtx.fillStyle = hexColor; //ghostCtx.lineWidth = dataSeries.lineThickness; //ghostCtx.lineWidth = 20; markers = []; var isFirstDataPointInPlotArea = true; var i = 0, x, y; var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth. var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; var baseY; var startPoint = null; var prevDataNull = false; if (dataPoints.length > 0) { //ctx.strokeStyle = "#4572A7 "; var color = dataSeries._colorSet[i % dataSeries._colorSet.length]; //ctx.strokeStyle = "red"; ctx.fillStyle = color; ctx.strokeStyle = color; ctx.lineWidth = dataSeries.lineThickness; if (ctx.setLineDash) { ctx.setLineDash(getLineDashArray(dataSeries.lineDashType, dataSeries.lineThickness)); } for (; i < dataPoints.length; i++) { dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x; if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) { continue; } var prevY = y; if (typeof dataPoints[i].y !== "number") { closeArea(); prevDataNull = true; continue; } x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0; y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0; if (isFirstDataPointInPlotArea || prevDataNull) { ctx.beginPath(); ctx.moveTo(x, y); startPoint = { x: x, y: y }; if (_utils.isCanvasSupported) { ghostCtx.beginPath(); ghostCtx.moveTo(x, y); } isFirstDataPointInPlotArea = false; prevDataNull = false; } else { ctx.lineTo(x, prevY); if (_utils.isCanvasSupported) ghostCtx.lineTo(x, prevY); ctx.lineTo(x, y); if (_utils.isCanvasSupported) ghostCtx.lineTo(x, y); if (i % 250 == 0) { closeArea(); } } var id = dataSeries.dataPointIds[i]; this._eventManager.objectMap[id] = { id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y }; //Render Marker if (dataPoints[i].markerSize !== 0) { if (dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0) { var markerProps = dataSeries.getMarkerProperties(i, x, y, ctx); markers.push(markerProps); //if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) { // dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //} var markerColor = intToHexColorString(id); if (_utils.isCanvasSupported) { markers.push({ x: x, y: y, ctx: ghostCtx, type: markerProps.type, size: markerProps.size, color: markerColor, borderColor: markerColor, borderThickness: markerProps.borderThickness }); } } } if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) { this._indexLabels.push({ chartType: "stepArea", dataPoint: dataPoints[i], dataSeries: dataSeries, point: { x: x, y: y }, direction: dataPoints[i].y >= 0 ? 1 : -1, color: color }); } } closeArea(); RenderHelper.drawMarkers(markers); } } ctx.restore(); if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore(); function closeArea() { if (!startPoint) return; if (dataSeries.lineThickness > 0) ctx.stroke(); if (plotUnit.axisY.viewportMinimum <= 0 && plotUnit.axisY.viewportMaximum >= 0) { baseY = yZeroToPixel; } else if (plotUnit.axisY.viewportMaximum < 0) baseY = axisYProps.y1;else if (plotUnit.axisY.viewportMinimum > 0) baseY = axisXProps.y2; ctx.lineTo(x, baseY); ctx.lineTo(startPoint.x, baseY); ctx.closePath(); ctx.globalAlpha = dataSeries.fillOpacity; ctx.fill(); ctx.globalAlpha = 1; if (_utils.isCanvasSupported) { ghostCtx.lineTo(x, baseY); ghostCtx.lineTo(startPoint.x, baseY); ghostCtx.closePath(); ghostCtx.fill(); } ctx.beginPath(); ctx.moveTo(x, y); ghostCtx.beginPath(); ghostCtx.moveTo(x, y); startPoint = { x: x, y: y }; } //source and dest would be same when animation is not enabled var animationInfo = { source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.xClipAnimation, easingFunction: AnimationHelper.easing.linear, animationBase: 0 }; return animationInfo; }; var _utils = require("../helpers/utils"); },{"../helpers/utils":39}],22:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var cultures = exports.cultures = { "en": {} //Derives from the default options //, //"es": { // decimalSeparator: ",", // digitGroupSeparator: ".", // zoomText: "zoom", // panText: "pan", // resetText: "reset", // days: ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], //} }; var constants = exports.constants = { numberDuration: 1, yearDuration: 1000 * 60 * 60 * 24 * 364, monthDuration: 1000 * 60 * 60 * 24 * 30, weekDuration: 1000 * 60 * 60 * 24 * 7, dayDuration: 1000 * 60 * 60 * 24, hourDuration: 1000 * 60 * 60, minuteDuration: 1000 * 60, secondDuration: 1000, millisecondDuration: 1, dayOfWeekFromInt: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] }; },{}],23:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var isDebugMode = exports.isDebugMode = false; var isCanvasSupported = exports.isCanvasSupported = !!document.createElement("canvas").getContext; //isCanvasSupported = false; //Default values for all Chart Elements that can be set by the user. CanvasJSObject.setOptions looks into this while setting the default/user-defined values. var defaultOptions = exports.defaultOptions = { Chart: { width: 500, height: 400, zoomEnabled: false, zoomType: "x", backgroundColor: "white", theme: "theme1", animationEnabled: false, animationDuration: 1200, dataPointMaxWidth: null, colorSet: "colorSet1", culture: "en", creditText: "CanvasJS.com", interactivityEnabled: true, exportEnabled: false, exportFileName: "Chart", rangeChanging: null, rangeChanged: null }, Title: { padding: 0, text: null, verticalAlign: "top", //top, center, bottom horizontalAlign: "center", //left, center, right fontSize: 20, //in pixels fontFamily: "Calibri", fontWeight: "normal", //normal, bold, bolder, lighter, fontColor: "black", fontStyle: "normal", // normal, italic, oblique borderThickness: 0, borderColor: "black", cornerRadius: 0, backgroundColor: null, margin: 5, wrap: true, maxWidth: null, dockInsidePlotArea: false //toolTipContent: null//string - To be implemented (TBI) }, Subtitle: { padding: 0, text: null, verticalAlign: "top", //top, center, bottom horizontalAlign: "center", //left, center, right fontSize: 14, //in pixels fontFamily: "Calibri", fontWeight: "normal", //normal, bold, bolder, lighter, fontColor: "black", fontStyle: "normal", // normal, italic, oblique borderThickness: 0, borderColor: "black", cornerRadius: 0, backgroundColor: null, margin: 2, wrap: true, maxWidth: null, dockInsidePlotArea: false //toolTipContent: null//string - To be implemented (TBI) }, Legend: { name: null, verticalAlign: "center", horizontalAlign: "right", fontSize: 14, //in pixels fontFamily: "calibri", fontWeight: "normal", //normal, bold, bolder, lighter, fontColor: "black", fontStyle: "normal", // normal, italic, oblique cursor: null, itemmouseover: null, itemmouseout: null, itemmousemove: null, itemclick: null, dockInsidePlotArea: false, reversed: false, maxWidth: null, maxHeight: null, itemMaxWidth: null, itemWidth: null, itemWrap: true, itemTextFormatter: null }, ToolTip: { enabled: true, shared: false, animationEnabled: true, content: null, contentFormatter: null, reversed: false, backgroundColor: null, borderColor: null, borderThickness: 2, //in pixels cornerRadius: 5, // in pixels fontSize: 14, // in pixels fontColor: "#000000", fontFamily: "Calibri, Arial, Georgia, serif;", fontWeight: "normal", //normal, bold, bolder, lighter, fontStyle: "italic" // normal, italic, oblique }, Axis: { minimum: null, //Minimum value to be shown on the Axis maximum: null, //Minimum value to be shown on the Axis viewportMinimum: null, viewportMaximum: null, interval: null, // Interval for tick marks and grid lines intervalType: null, //number, millisecond, second, minute, hour, day, month, year //reversed: false, title: null, // string titleFontColor: "black", titleFontSize: 20, titleFontFamily: "arial", titleFontWeight: "normal", titleFontStyle: "normal", labelAngle: 0, labelFontFamily: "arial", labelFontColor: "black", labelFontSize: 12, labelFontWeight: "normal", labelFontStyle: "normal", labelAutoFit: false, labelWrap: true, labelMaxWidth: null, //null for auto labelFormatter: null, prefix: "", suffix: "", includeZero: true, //Applies only for axisY. Ignored in axisX. tickLength: 5, tickColor: "black", tickThickness: 1, lineColor: "black", lineThickness: 1, lineDashType: "solid", gridColor: "A0A0A0", gridThickness: 0, gridDashType: "solid", interlacedColor: null, valueFormatString: null, margin: 2, stripLines: [] // Just a placeholder. Does not have any effect on the actual number of striplines }, StripLine: { value: null, startValue: null, endValue: null, color: "orange", opacity: null, thickness: 2, lineDashType: "solid", label: "", labelBackgroundColor: "#EEEEEE", labelFontFamily: "arial", labelFontColor: "orange", labelFontSize: 12, labelFontWeight: "normal", labelFontStyle: "normal", labelFormatter: null, showOnTop: false }, DataSeries: { name: null, dataPoints: null, label: "", bevelEnabled: false, highlightEnabled: true, cursor: null, indexLabel: "", indexLabelPlacement: "auto", //inside, outside, auto indexLabelOrientation: "horizontal", indexLabelFontColor: "black", indexLabelFontSize: 12, indexLabelFontStyle: "normal", // italic ,oblique, normal indexLabelFontFamily: "Arial", // fx: Arial Verdana "Courier New" Serif indexLabelFontWeight: "normal", // bold ,bolder, lighter, normal indexLabelBackgroundColor: null, indexLabelLineColor: null, indexLabelLineThickness: 1, indexLabelLineDashType: "solid", indexLabelMaxWidth: null, indexLabelWrap: true, indexLabelFormatter: null, lineThickness: 2, lineDashType: "solid", color: null, risingColor: "white", fillOpacity: null, startAngle: 0, radius: null, innerRadius: null, type: "column", //line, column, bar, area, scatter stackedColumn, stackedBar, stackedArea, stackedColumn100, stackedBar100, stackedArea100, pie, doughnut xValueType: "number", //number, dateTime axisYType: "primary", xValueFormatString: null, yValueFormatString: null, zValueFormatString: null, percentFormatString: null, showInLegend: null, legendMarkerType: null, legendMarkerColor: null, legendText: null, legendMarkerBorderColor: null, legendMarkerBorderThickness: null, markerType: "circle", //none, circle, square, cross, triangle, line markerColor: null, markerSize: null, markerBorderColor: null, markerBorderThickness: null, //animationEnabled: true, mouseover: null, mouseout: null, mousemove: null, click: null, toolTipContent: null, visible: true }, //Private TextBlock: { x: 0, y: 0, width: null, //read only height: null, //read only maxWidth: null, maxHeight: null, padding: 0, angle: 0, text: "", horizontalAlign: "center", //left, center, right fontSize: 12, //in pixels fontFamily: "calibri", fontWeight: "normal", //normal, bold, bolder, lighter, fontColor: "black", fontStyle: "normal", // normal, italic, oblique borderThickness: 0, borderColor: "black", cornerRadius: 0, backgroundColor: null, textBaseline: "top" }, CultureInfo: { decimalSeparator: ".", digitGroupSeparator: ",", zoomText: "Zoom", panText: "Pan", resetText: "Reset", menuText: "More Options", saveJPGText: "Save as JPG", savePNGText: "Save as PNG", days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] } }; },{}],24:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.themes = exports.colorSets = undefined; var _utils = require("../helpers/utils"); var colorSets = exports.colorSets = { "colorSet1": ["#369EAD", "#C24642", "#7F6084", //"#96C412", "#86B402", "#A2D1CF", //"#D8C641", "#C8B631", "#6DBCEB", //"#4A4946", "#52514E", "#4F81BC", "#A064A1", "#F79647"], "colorSet2": ["#4F81BC", "#C0504E", "#9BBB58", "#23BFAA", //"#FAA586", "#8064A1", "#4AACC5", "#F79647", //"#77AA33", //"#7F6084" "#33558B"], "colorSet3": ["#8CA1BC", "#36845C", "#017E82", "#8CB9D0", "#708C98", "#94838D", "#F08891", "#0366A7", "#008276", "#EE7757", "#E5BA3A", "#F2990B", "#03557B", "#782970"] //, //"colorSet4": [ // "#3698C5", // "#009B8D", // "#F1D691", // "#F8B90C", // "#0081B8", // "#5B5A96", // "#ACBDD1", // "#88A891", // "#39969D", // "#AECEDD", // "#A0B2BC", // "#BBAEB7", // "#A0C65F", // "#EEA6AA", // "#3798C5" //], //"colorSet5": [ // "#88ADBF", // "#84C336", // "#7B91C3", // "#4661EE", // "#EC5657", // "#1BCDD1", // "#8FAABB", // "#B08BEB", // "#3EA0DD", // "#F5A52A", // "#23BFAA", // "#FAA586", // "#EB8CC6" //] }; var themes = exports.themes = { "theme1": { Chart: { colorSet: "colorSet1" }, Title: { fontFamily: _utils.isCanvasSupported ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri", fontSize: 33, fontColor: "#3A3A3A", fontWeight: "bold", verticalAlign: "top", margin: 5 }, Subtitle: { fontFamily: _utils.isCanvasSupported ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri", fontSize: 16, fontColor: "#3A3A3A", fontWeight: "bold", verticalAlign: "top", margin: 5 }, Axis: { titleFontSize: 26, //titleFontColor: "rgb(98,98,98)", titleFontColor: "#666666", //titleFontFamily: "arial black", //titleFontFamily: "Verdana, Geneva, Calibri, sans-serif", titleFontFamily: _utils.isCanvasSupported ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri", //titleFontWeight: "bold", //labelFontFamily: "Times New Roman, Times, serif", labelFontFamily: _utils.isCanvasSupported ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri", //labelFontFamily: "Helvetica Neue, Helvetica", labelFontSize: 18, labelFontColor: "grey", //labelFontWeight: "bold", tickColor: "#BBBBBB", tickThickness: 2, gridThickness: 2, gridColor: "#BBBBBB", lineThickness: 2, lineColor: "#BBBBBB" }, Legend: { verticalAlign: "bottom", horizontalAlign: "center", fontFamily: _utils.isCanvasSupported ? "monospace, sans-serif,arial black" : "calibri" }, DataSeries: { //bevelEnabled: true, indexLabelFontColor: "grey", //indexLabelFontFamily: "Trebuchet MS, monospace, Courier New, Courier", indexLabelFontFamily: _utils.isCanvasSupported ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri", //indexLabelFontWeight: "bold", indexLabelFontSize: 18, //indexLabelLineColor: "lightgrey", indexLabelLineThickness: 1 } }, "theme2": { Chart: { colorSet: "colorSet2" }, Title: { fontFamily: "impact, charcoal, arial black, sans-serif", fontSize: 32, //fontColor: "rgb(58,58,58)", fontColor: "#333333", verticalAlign: "top", margin: 5 }, Subtitle: { fontFamily: "impact, charcoal, arial black, sans-serif", fontSize: 14, //fontColor: "rgb(58,58,58)", fontColor: "#333333", verticalAlign: "top", margin: 5 }, Axis: { titleFontSize: 22, titleFontColor: "rgb(98,98,98)", //titleFontFamily: "arial black", titleFontFamily: _utils.isCanvasSupported ? "monospace, sans-serif,arial black" : "arial", titleFontWeight: "bold", labelFontFamily: _utils.isCanvasSupported ? "monospace, Courier New, Courier" : "arial", //labelFontFamily: "Helvetica Neue, Helvetica", labelFontSize: 16, labelFontColor: "grey", labelFontWeight: "bold", tickColor: "grey", tickThickness: 2, gridThickness: 2, gridColor: "grey", lineColor: "grey", lineThickness: 0 }, Legend: { verticalAlign: "bottom", horizontalAlign: "center", fontFamily: _utils.isCanvasSupported ? "monospace, sans-serif,arial black" : "arial" }, DataSeries: { indexLabelFontColor: "grey", //indexLabelFontFamily: "Trebuchet MS, monospace, Courier New, Courier", indexLabelFontFamily: _utils.isCanvasSupported ? "Courier New, Courier, monospace" : "arial", indexLabelFontWeight: "bold", indexLabelFontSize: 18, //indexLabelLineColor: "lightgrey", indexLabelLineThickness: 1 } }, "theme3": { Chart: { colorSet: "colorSet1" }, Title: { fontFamily: _utils.isCanvasSupported ? "Candara, Optima, Trebuchet MS, Helvetica Neue, Helvetica, Trebuchet MS, serif" : "calibri", fontSize: 32, fontColor: "#3A3A3A", fontWeight: "bold", verticalAlign: "top", margin: 5 }, Subtitle: { fontFamily: _utils.isCanvasSupported ? "Candara, Optima, Trebuchet MS, Helvetica Neue, Helvetica, Trebuchet MS, serif" : "calibri", fontSize: 16, fontColor: "#3A3A3A", fontWeight: "bold", verticalAlign: "top", margin: 5 }, Axis: { titleFontSize: 22, titleFontColor: "rgb(98,98,98)", //titleFontFamily: "arial black", titleFontFamily: _utils.isCanvasSupported ? "Verdana, Geneva, Calibri, sans-serif" : "calibri", //titleFontWeight: "bold", //labelFontFamily: "Times New Roman, Times, serif", labelFontFamily: _utils.isCanvasSupported ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri", //labelFontFamily: "Helvetica Neue, Helvetica", labelFontSize: 18, labelFontColor: "grey", //labelFontWeight: "bold", tickColor: "grey", tickThickness: 2, gridThickness: 2, gridColor: "grey", lineThickness: 2, lineColor: "grey" }, Legend: { verticalAlign: "bottom", horizontalAlign: "center", fontFamily: _utils.isCanvasSupported ? "monospace, sans-serif,arial black" : "calibri" }, DataSeries: { bevelEnabled: true, indexLabelFontColor: "grey", //indexLabelFontFamily: "Trebuchet MS, monospace, Courier New, Courier", indexLabelFontFamily: _utils.isCanvasSupported ? "Candara, Optima, Calibri, Verdana, Geneva, sans-serif" : "calibri", //indexLabelFontWeight: "bold", indexLabelFontSize: 18, indexLabelLineColor: "lightgrey", indexLabelLineThickness: 2 } } }; },{"../helpers/utils":39}],25:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _animator = require('../helpers/animator'); var _animator2 = _interopRequireDefault(_animator); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function Animator(chart) { this.chart = chart; this.ctx = this.chart.plotArea.ctx; this.animations = []; this.animationRequestId = null; } //Animator.prototype.animate = function (duration, base, dest, source, animationCallback, onComplete) { //#region Animator Animator.prototype.animate = function (startDelay, duration, animationCallback, onComplete, easingFunction) { var _this = this; this.chart.isAnimating = true; easingFunction = easingFunction || _animator2.default.easing.linear; if (animationCallback) { this.animations.push({ startTime: new Date().getTime() + (startDelay ? startDelay : 0), duration: duration, animationCallback: animationCallback, onComplete: onComplete }); } var remainingAnimations = []; while (this.animations.length > 0) { var animation = this.animations.shift(); var now = new Date().getTime(); var fractionComplete = 0; //var fractionComplete = Math.min(((new Date()).getTime() - animation.startTime) / animation.duration, 1); if (animation.startTime <= now) { fractionComplete = easingFunction(Math.min(now - animation.startTime, animation.duration), 0, 1, animation.duration); //var fractionComplete = AnimationHelper.easing.easeOutQuad(Math.min(((new Date()).getTime() - animation.startTime), animation.duration), 0, 1, animation.duration); fractionComplete = Math.min(fractionComplete, 1); if (isNaN(fractionComplete) || !isFinite(fractionComplete)) fractionComplete = 1; } if (fractionComplete < 1) { remainingAnimations.push(animation); } animation.animationCallback(fractionComplete); if (fractionComplete >= 1 && animation.onComplete) animation.onComplete(); } this.animations = remainingAnimations; if (this.animations.length > 0) { this.animationRequestId = this.chart.requestAnimFrame.call(window, function () { _this.animate.call(_this); }); } else { this.chart.isAnimating = false; } }; Animator.prototype.cancelAllAnimations = function () { this.animations = []; if (this.animationRequestId) { this.chart.cancelRequestAnimFrame.call(window, this.animationRequestId); } this.animationRequestId = null; this.chart.isAnimating = false; }; exports.default = Animator; },{"../helpers/animator":37}],26:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _canvasjs = require('./canvasjs'); var _canvasjs2 = _interopRequireDefault(_canvasjs); var _text_block = require('./text_block'); var _text_block2 = _interopRequireDefault(_text_block); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function Axis(chart, options, type, position) { Axis.base.constructor.call(this, "Axis", options, chart.theme); this.chart = chart; this.canvas = chart.canvas; this.ctx = chart.ctx; this.maxWidth = 0; this.maxHeight = 0; this.intervalStartPosition = 0; this.labels = []; this._labels = null; //Processed information about the data that gets plotted against this axis this.dataInfo = { min: Infinity, max: -Infinity, viewPortMin: Infinity, viewPortMax: -Infinity, minDiff: Infinity // Used only in case of axisX }; if (type === "axisX") { this.sessionVariables = this.chart.sessionVariables[type]; if (!this._options.interval) this.intervalType = null; } else { if (position === "left" || position === "top") this.sessionVariables = this.chart.sessionVariables["axisY"];else { this.sessionVariables = this.chart.sessionVariables["axisY2"]; } } if (typeof this._options.titleFontSize === "undefined") { this.titleFontSize = this.chart.getAutoFontSize(this.titleFontSize); //window.console.log("titleFontSize: " + this.titleFontSize); } if (typeof this._options.labelFontSize === "undefined") { this.labelFontSize = this.chart.getAutoFontSize(this.labelFontSize); //window.console.log("labelFontSize: " + this.labelFontSize); } //Axis Type : axisX, axisY this.type = type; if (type === "axisX" && (!options || typeof options.gridThickness === "undefined")) this.gridThickness = 0; this._position = position; this.lineCoordinates = { x1: null, y1: null, x2: null, y2: null, width: null }; //{x1:, y1:, x2:, y2:, width:} // { this.labelAngle = (this.labelAngle % 360 + 360) % 360; if (this.labelAngle > 90 && this.labelAngle <= 270) this.labelAngle -= 180;else if (this.labelAngle > 180 && this.labelAngle <= 270) this.labelAngle -= 180;else if (this.labelAngle > 270 && this.labelAngle <= 360) this.labelAngle -= 360; } if (this._options.stripLines && this._options.stripLines.length > 0) { this.stripLines = []; for (var i = 0; i < this._options.stripLines.length; i++) { this.stripLines.push(new StripLine(this.chart, this._options.stripLines[i], chart.theme, ++this.chart._eventManager.lastObjectId, this)); } } this._titleTextBlock = null; if (!this.hasOptionChanged("viewportMinimum") && !isNaN(this.sessionVariables.newViewportMinimum) && this.sessionVariables.newViewportMinimum !== null) this.viewportMinimum = this.sessionVariables.newViewportMinimum;else this.sessionVariables.newViewportMinimum = null; if (!this.hasOptionChanged("viewportMaximum") && !isNaN(this.sessionVariables.newViewportMaximum) && this.sessionVariables.newViewportMaximum !== null) this.viewportMaximum = this.sessionVariables.newViewportMaximum;else this.sessionVariables.newViewportMaximum = null; if (this.minimum !== null && this.viewportMinimum !== null) this.viewportMinimum = Math.max(this.viewportMinimum, this.minimum); if (this.maximum !== null && this.viewportMaximum !== null) this.viewportMaximum = Math.min(this.viewportMaximum, this.maximum); this.trackChanges("viewportMinimum"); this.trackChanges("viewportMaximum"); } (0, _utils.extend)(Axis, _canvasjs2.default); Axis.prototype.createLabels = function () { var textBlock; var i = 0; var endPoint; var labelMaxWidth = 0; var labelMaxHeight = 0; var intervalInPixels = 0; //var intervalInPixels = this.conversionParameters.pixelPerUnit * this.interval; if (this._position === "bottom" || this._position === "top") { intervalInPixels = this.lineCoordinates.width / Math.abs(this.viewportMaximum - this.viewportMinimum) * this.interval; if (this.labelAutoFit) { labelMaxWidth = typeof this._options.labelMaxWidth === "undefined" ? intervalInPixels * .9 >> 0 : this.labelMaxWidth; } else { labelMaxWidth = typeof this._options.labelMaxWidth === "undefined" ? this.chart.width * .7 >> 0 : this.labelMaxWidth; } labelMaxHeight = typeof this._options.labelWrap === "undefined" || this.labelWrap ? this.chart.height * .5 >> 0 : this.labelFontSize * 1.5; } else if (this._position === "left" || this._position === "right") { intervalInPixels = this.lineCoordinates.height / Math.abs(this.viewportMaximum - this.viewportMinimum) * this.interval; if (this.labelAutoFit) { labelMaxWidth = typeof this._options.labelMaxWidth === "undefined" ? this.chart.width * .3 >> 0 : this.labelMaxWidth; } else { labelMaxWidth = typeof this._options.labelMaxWidth === "undefined" ? this.chart.width * .5 >> 0 : this.labelMaxWidth; } labelMaxHeight = typeof this._options.labelWrap === "undefined" || this.labelWrap ? intervalInPixels * 2 >> 0 : this.labelFontSize * 1.5; } if (this.type === "axisX" && this.chart.plotInfo.axisXValueType === "dateTime") { endPoint = addToDateTime(new Date(this.viewportMaximum), this.interval, this.intervalType); //endPoint = this.viewportMaximum; for (i = this.intervalStartPosition; i < endPoint; addToDateTime(i, this.interval, this.intervalType)) { //var text = dateFormat(i, this.valueFormatString); var timeInMilliseconds = i.getTime(); var text = this.labelFormatter ? this.labelFormatter({ chart: this.chart, axis: this._options, value: i, label: this.labels[i] ? this.labels[i] : null }) : this.type === "axisX" && this.labels[timeInMilliseconds] ? this.labels[timeInMilliseconds] : dateFormat(i, this.valueFormatString, this.chart._cultureInfo); textBlock = new _text_block2.default(this.ctx, { x: 0, y: 0, //maxWidth: this.maxHeight, //maxHeight: this.labelFontSize, maxWidth: labelMaxWidth, maxHeight: labelMaxHeight, angle: this.labelAngle, text: this.prefix + text + this.suffix, horizontalAlign: "left", //left, center, right fontSize: this.labelFontSize, //in pixels fontFamily: this.labelFontFamily, fontWeight: this.labelFontWeight, //normal, bold, bolder, lighter, fontColor: this.labelFontColor, fontStyle: this.labelFontStyle, // normal, italic, oblique textBaseline: "middle" }); this._labels.push({ position: i.getTime(), textBlock: textBlock, effectiveHeight: null }); } } else { endPoint = this.viewportMaximum; //if ((Math.floor(this.interval) < this.interval && !this._options.interval) || true) { //Check if it should be rendered as a category axis. If yes, then ceil the interval if (this.labels && this.labels.length) { var tempInterval = Math.ceil(this.interval); var tempStartPoint = Math.ceil(this.intervalStartPosition); var hasAllLabels = false; for (i = tempStartPoint; i < this.viewportMaximum; i += tempInterval) { if (this.labels[i]) { hasAllLabels = true; } else { hasAllLabels = false; break; } } if (hasAllLabels) { this.interval = tempInterval; this.intervalStartPosition = tempStartPoint; } } //parseFloat & toPrecision are being used to avoid issues related to precision. for (i = this.intervalStartPosition; i <= endPoint; i = parseFloat((i + this.interval).toFixed(14))) { var text = this.labelFormatter ? this.labelFormatter({ chart: this.chart, axis: this._options, value: i, label: this.labels[i] ? this.labels[i] : null }) : this.type === "axisX" && this.labels[i] ? this.labels[i] : (0, _utils.numberFormat)(i, this.valueFormatString, this.chart._cultureInfo); textBlock = new _text_block2.default(this.ctx, { x: 0, y: 0, //maxWidth: this.maxHeight, //maxHeight: this.labelFontSize, maxWidth: labelMaxWidth, maxHeight: labelMaxHeight, angle: this.labelAngle, text: this.prefix + text + this.suffix, horizontalAlign: "left", //left, center, right fontSize: this.labelFontSize, //in pixels fontFamily: this.labelFontFamily, fontWeight: this.labelFontWeight, //normal, bold, bolder, lighter, fontColor: this.labelFontColor, fontStyle: this.labelFontStyle, // normal, italic, oblique textBaseline: "middle", borderThickness: 0 }); this._labels.push({ position: i, textBlock: textBlock, effectiveHeight: null }); } } for (var i = 0; i < this.stripLines.length; i++) { var stripLine = this.stripLines[i]; textBlock = new _text_block2.default(this.ctx, { x: 0, y: 0, //maxWidth: this.maxHeight, //maxHeight: this.labelFontSize, backgroundColor: stripLine.labelBackgroundColor, maxWidth: labelMaxWidth, maxHeight: labelMaxHeight, angle: this.labelAngle, text: stripLine.labelFormatter ? stripLine.labelFormatter({ chart: this.chart, axis: this, stripLine: stripLine }) : stripLine.label, horizontalAlign: "left", //left, center, right fontSize: stripLine.labelFontSize, //in pixels fontFamily: stripLine.labelFontFamily, fontWeight: stripLine.labelFontWeight, //normal, bold, bolder, lighter, fontColor: stripLine._options.labelFontColor || stripLine.color, fontStyle: stripLine.labelFontStyle, // normal, italic, oblique textBaseline: "middle", borderThickness: 0 }); this._labels.push({ position: stripLine.value, textBlock: textBlock, effectiveHeight: null, stripLine: stripLine }); } }; Axis.prototype.createLabelsAndCalculateWidth = function () { var maxLabelEffectiveWidth = 0; this._labels = []; if (this._position === "left" || this._position === "right") { this.createLabels(); for (var i = 0; i < this._labels.length; i++) { var textBlock = this._labels[i].textBlock; var size = textBlock.measureText(); //var hypotenuse = Math.sqrt(Math.pow(size.height / 2, 2) + Math.pow(size.width, 2)); //labelEffectiveWidth = hypotenuse * Math.cos(Math.abs(Math.PI / 180 * this.labelAngle) - Math.abs(Math.acos(size.width / hypotenuse))); var labelEffectiveWidth = 0; if (this.labelAngle === 0) labelEffectiveWidth = size.width;else labelEffectiveWidth = size.width * Math.cos(Math.PI / 180 * Math.abs(this.labelAngle)) + size.height / 2 * Math.sin(Math.PI / 180 * Math.abs(this.labelAngle)); if (maxLabelEffectiveWidth < labelEffectiveWidth) maxLabelEffectiveWidth = labelEffectiveWidth; this._labels[i].effectiveWidth = labelEffectiveWidth; } } var titleHeight = this.title ? getFontHeightInPixels(this.titleFontFamily, this.titleFontSize, this.titleFontWeight) + 2 : 0; var axisWidth = titleHeight + maxLabelEffectiveWidth + this.tickLength + 5; //if (isDebugMode && window.console) { // window.console.log(this.type + "--- axisWidth: " + axisWidth); //} return axisWidth; }; Axis.prototype.createLabelsAndCalculateHeight = function () { var maxLabelEffectiveHeight = 0; this._labels = []; var textBlock; var i = 0; this.createLabels(); if (this._position === "bottom" || this._position === "top") { for (i = 0; i < this._labels.length; i++) { textBlock = this._labels[i].textBlock; var size = textBlock.measureText(); //var diagonal = Math.sqrt(Math.pow(size.height, 2) + Math.pow(size.width, 2)); //var hypotenuse = Math.sqrt(Math.pow(size.height / 2, 2) + Math.pow(size.width, 2)); //var labelEffectiveHeight = hypotenuse * Math.cos(Math.PI / 2 - (Math.abs(Math.PI / 180 * this.labelAngle) + Math.abs(Math.acos(size.width / hypotenuse)))); var labelEffectiveHeight = 0; if (this.labelAngle === 0) labelEffectiveHeight = size.height;else labelEffectiveHeight = size.width * Math.sin(Math.PI / 180 * Math.abs(this.labelAngle)) + size.height / 2 * Math.cos(Math.PI / 180 * Math.abs(this.labelAngle)); if (maxLabelEffectiveHeight < labelEffectiveHeight) maxLabelEffectiveHeight = labelEffectiveHeight; this._labels[i].effectiveHeight = labelEffectiveHeight; } } //var titleHeight = this.title ? this.titleFontSize + 5 : 0; var titleHeight = this.title ? getFontHeightInPixels(this.titleFontFamily, this.titleFontSize, this.titleFontWeight) + 2 : 0; return titleHeight + maxLabelEffectiveHeight + this.tickLength + 5; }; //Static Method that co-ordinates between axisX, axisY and renders them Axis.setLayoutAndRender = function (axisX, axisY, axisY2, axisPlacement, freeSpace) { var x1, y1, x2, y2; var chart = axisX.chart; var ctx = chart.ctx; axisX.calculateAxisParameters(); if (axisY) axisY.calculateAxisParameters(); if (axisY2) axisY2.calculateAxisParameters(); //if (axisY && axisY2 && typeof (axisY._options.viewportMaximum) === "undefined" && typeof (axisY._options.viewportMinimum) === "undefined" && typeof (axisY._options.interval) === "undefined" // && typeof (axisY2._options.viewportMaximum) === "undefined" && typeof (axisY2._options.viewportMinimum) === "undefined" && typeof (axisY2._options.interval) === "undefined") { // var noTicksY = (axisY.viewportMaximum - axisY.viewportMinimum) / axisY.interval; // var noTicksY2 = (axisY2.viewportMaximum - axisY2.viewportMinimum) / axisY2.interval; // if (noTicksY > noTicksY2) { // axisY2.viewportMaximum = axisY2.interval * noTicksY + axisY2.viewportMinimum; // } else if (noTicksY2 > noTicksY) { // axisY.viewportMaximum = axisY.interval * noTicksY2 + axisY.viewportMinimum; // } //} var axisYlineThickness = axisY ? axisY.lineThickness ? axisY.lineThickness : 0 : 0; var axisY2lineThickness = axisY2 ? axisY2.lineThickness ? axisY2.lineThickness : 0 : 0; var axisYGridThickness = axisY ? axisY.gridThickness ? axisY.gridThickness : 0 : 0; var axisY2GridThickness = axisY2 ? axisY2.gridThickness ? axisY2.gridThickness : 0 : 0; var axisYMargin = axisY ? axisY.margin : 0; var axisY2Margin = axisY ? axisY.margin : 0; if (axisPlacement === "normal") { axisX.lineCoordinates = {}; var axisYWidth = Math.ceil(axisY ? axisY.createLabelsAndCalculateWidth() : 0); x1 = Math.round(freeSpace.x1 + axisYWidth + axisYMargin); axisX.lineCoordinates.x1 = x1; var axisY2Width = Math.ceil(axisY2 ? axisY2.createLabelsAndCalculateWidth() : 0); x2 = Math.round(freeSpace.x2 - axisY2Width > axisX.chart.width - 10 ? axisX.chart.width - 10 : freeSpace.x2 - axisY2Width); axisX.lineCoordinates.x2 = x2; axisX.lineCoordinates.width = Math.abs(x2 - x1); // required early on inside createLabels of axisX var axisXHeight = Math.ceil(axisX.createLabelsAndCalculateHeight()); // Position axisX based on the available free space, Margin and its height //x1 = freeSpace.x1 + axisYWidth + axisYMargin + axisYlineThickness / 2; y1 = Math.round(freeSpace.y2 - axisXHeight - axisX.margin); y2 = Math.round(freeSpace.y2 - axisX.margin); //axisX.lineCoordinates = { x1: x1, y1: y1, x2: x2, y2: y1, width: Math.abs(x2 - x1) } axisX.lineCoordinates.y1 = y1; axisX.lineCoordinates.y2 = y1; axisX.boundingRect = { x1: x1, y1: y1, x2: x2, y2: y2, width: x2 - x1, height: y2 - y1 }; //if (isDebugMode) { // axisX.ctx.rect(axisX.boundingRect.x1, axisX.boundingRect.y1, axisX.boundingRect.width, axisX.boundingRect.height); // axisX.ctx.stroke(); //} // Position axisY based on the available free space, Margin and its height if (axisY) { x1 = Math.round(freeSpace.x1 + axisY.margin); y1 = Math.round(freeSpace.y1 < 10 ? 10 : freeSpace.y1); x2 = Math.round(freeSpace.x1 + axisYWidth + axisY.margin); //y2 = freeSpace.y2 - axisXHeight - axisX.margin - axisX.lineThickness / 2; y2 = Math.round(freeSpace.y2 - axisXHeight - axisX.margin); axisY.lineCoordinates = { x1: x2, y1: y1, x2: x2, y2: y2, height: Math.abs(y2 - y1) }; axisY.boundingRect = { x1: x1, y1: y1, x2: x2, y2: y2, width: x2 - x1, height: y2 - y1 }; } //if (isDebugMode && axisY) { // axisY.ctx.rect(axisY.boundingRect.x1, axisY.boundingRect.y1, axisY.boundingRect.width, axisY.boundingRect.height); // axisY.ctx.stroke(); //} // Position axisY2 based on the available free space, Margin and its height if (axisY2) { x1 = Math.round(axisX.lineCoordinates.x2); y1 = Math.round(freeSpace.y1 < 10 ? 10 : freeSpace.y1); x2 = Math.round(x1 + axisY2Width + axisY2.margin); //y2 = freeSpace.y2 - axisXHeight - axisX.margin - axisX.lineThickness / 2; y2 = Math.round(freeSpace.y2 - axisXHeight - axisX.margin); axisY2.lineCoordinates = { x1: x1, y1: y1, x2: x1, y2: y2, height: Math.abs(y2 - y1) }; axisY2.boundingRect = { x1: x1, y1: y1, x2: x2, y2: y2, width: x2 - x1, height: y2 - y1 }; } axisX.calculateValueToPixelConversionParameters(); if (axisY) axisY.calculateValueToPixelConversionParameters(); if (axisY2) axisY2.calculateValueToPixelConversionParameters(); ctx.save(); ctx.rect(5, axisX.boundingRect.y1, axisX.chart.width - 10, axisX.boundingRect.height); ctx.clip(); axisX.renderLabelsTicksAndTitle(); ctx.restore(); if (axisY) axisY.renderLabelsTicksAndTitle(); if (axisY2) axisY2.renderLabelsTicksAndTitle(); chart.preparePlotArea(); var plotArea = axisX.chart.plotArea; ctx.save(); ctx.rect(plotArea.x1, plotArea.y1, Math.abs(plotArea.x2 - plotArea.x1), Math.abs(plotArea.y2 - plotArea.y1)); ctx.clip(); axisX.renderStripLinesOfThicknessType("value"); if (axisY) axisY.renderStripLinesOfThicknessType("value"); if (axisY2) axisY2.renderStripLinesOfThicknessType("value"); axisX.renderInterlacedColors(); if (axisY) axisY.renderInterlacedColors(); if (axisY2) axisY2.renderInterlacedColors(); ctx.restore(); axisX.renderGrid(); if (axisY) axisY.renderGrid(); if (axisY2) axisY2.renderGrid(); axisX.renderAxisLine(); if (axisY) axisY.renderAxisLine(); if (axisY2) axisY2.renderAxisLine(); //No need to clip to plotArea because stripLines need to render on top of gridlines axisX.renderStripLinesOfThicknessType("pixel"); if (axisY) axisY.renderStripLinesOfThicknessType("pixel"); if (axisY2) axisY2.renderStripLinesOfThicknessType("pixel"); } else { var axisXWidth = Math.ceil(axisX.createLabelsAndCalculateWidth()); if (axisY) { axisY.lineCoordinates = {}; x1 = Math.round(freeSpace.x1 + axisXWidth + axisX.margin); x2 = Math.round(freeSpace.x2 > axisY.chart.width - 10 ? axisY.chart.width - 10 : freeSpace.x2); axisY.lineCoordinates.x1 = x1; axisY.lineCoordinates.x2 = x2; axisY.lineCoordinates.width = Math.abs(x2 - x1); } if (axisY2) { axisY2.lineCoordinates = {}; x1 = Math.round(freeSpace.x1 + axisXWidth + axisX.margin); x2 = Math.round(freeSpace.x2 > axisY2.chart.width - 10 ? axisY2.chart.width - 10 : freeSpace.x2); axisY2.lineCoordinates.x1 = x1; axisY2.lineCoordinates.x2 = x2; axisY2.lineCoordinates.width = Math.abs(x2 - x1); } var axisYHeight = Math.ceil(axisY ? axisY.createLabelsAndCalculateHeight() : 0); var axisY2Height = Math.ceil(axisY2 ? axisY2.createLabelsAndCalculateHeight() : 0); // Position axisY based on the available free space, Margin and its height if (axisY) { //x1 = freeSpace.x1 + axisXWidth + axisX.margin + axisX.lineThickness / 2; //x2 = freeSpace.x2 > axisY.chart.width - 10 ? axisY.chart.width - 10 : freeSpace.x2; y1 = Math.round(freeSpace.y2 - axisYHeight - axisY.margin); y2 = Math.round(freeSpace.y2 - axisYMargin > axisY.chart.height - 10 ? axisY.chart.height - 10 : freeSpace.y2 - axisYMargin); //axisY.lineCoordinates = { x1: x1, y1: y1, x2: x2, y2: y1, width: Math.abs(x2 - x1) } axisY.lineCoordinates.y1 = y1; axisY.lineCoordinates.y2 = y1; axisY.boundingRect = { x1: x1, y1: y1, x2: x2, y2: y2, width: x2 - x1, height: axisYHeight }; } // Position axisY based on the available free space, Margin and its height if (axisY2) { //x1 = freeSpace.x1 + axisXWidth + axisX.margin + axisX.lineThickness / 2; //x2 = freeSpace.x2 > axisY2.chart.width - 10 ? axisY2.chart.width - 10 : freeSpace.x2; y1 = Math.round(freeSpace.y1 + axisY2.margin); y2 = freeSpace.y1 + axisY2.margin + axisY2Height; //axisY2.lineCoordinates = { x1: x1, y1: y2, x2: x2, y2: y2, width: Math.abs(x2 - x1) } axisY2.lineCoordinates.y1 = y2; axisY2.lineCoordinates.y2 = y2; axisY2.boundingRect = { x1: x1, y1: y1, x2: x2, y2: y2, width: x2 - x1, height: axisY2Height }; } //axisY.ctx.rect(axisY.boundingRect.x1, axisY.boundingRect.y1, axisY.boundingRect.width, axisY.boundingRect.height); //axisY.ctx.stroke(); // Position axisX based on the available free space, Margin and its height x1 = Math.round(freeSpace.x1 + axisX.margin); y1 = Math.round(axisY2 ? axisY2.lineCoordinates.y2 : freeSpace.y1 < 10 ? 10 : freeSpace.y1); x2 = Math.round(freeSpace.x1 + axisXWidth + axisX.margin); y2 = Math.round(axisY ? axisY.lineCoordinates.y1 : freeSpace.y2 - axisYMargin > axisX.chart.height - 10 ? axisX.chart.height - 10 : freeSpace.y2 - axisYMargin); axisX.lineCoordinates = { x1: x2, y1: y1, x2: x2, y2: y2, height: Math.abs(y2 - y1) }; axisX.boundingRect = { x1: x1, y1: y1, x2: x2, y2: y2, width: x2 - x1, height: y2 - y1 }; //axisX.ctx.rect(axisX.boundingRect.x1, axisX.boundingRect.y1, axisX.boundingRect.width, axisX.boundingRect.height); //axisX.ctx.stroke(); axisX.calculateValueToPixelConversionParameters(); if (axisY) axisY.calculateValueToPixelConversionParameters(); if (axisY2) axisY2.calculateValueToPixelConversionParameters(); //ctx.save(); //ctx.rect(axisY.boundingRect.x1 - 30, axisY.boundingRect.y1, axisY.boundingRect.width + 60, axisY.boundingRect.height); //ctx.clip(); if (axisY) axisY.renderLabelsTicksAndTitle(); if (axisY2) axisY2.renderLabelsTicksAndTitle(); //ctx.restore(); axisX.renderLabelsTicksAndTitle(); chart.preparePlotArea(); var plotArea = axisX.chart.plotArea; ctx.save(); ctx.rect(plotArea.x1, plotArea.y1, Math.abs(plotArea.x2 - plotArea.x1), Math.abs(plotArea.y2 - plotArea.y1)); ctx.clip(); //No need to clip to plotArea because stripLines need to render on top of gridlines axisX.renderStripLinesOfThicknessType("value"); if (axisY) axisY.renderStripLinesOfThicknessType("value"); if (axisY2) axisY2.renderStripLinesOfThicknessType("value"); axisX.renderInterlacedColors(); if (axisY) axisY.renderInterlacedColors(); if (axisY2) axisY2.renderInterlacedColors(); ctx.restore(); axisX.renderGrid(); if (axisY) axisY.renderGrid(); if (axisY2) axisY2.renderGrid(); axisX.renderAxisLine(); if (axisY) axisY.renderAxisLine(); if (axisY2) axisY2.renderAxisLine(); axisX.renderStripLinesOfThicknessType("pixel"); if (axisY) axisY.renderStripLinesOfThicknessType("pixel"); if (axisY2) axisY2.renderStripLinesOfThicknessType("pixel"); } }; Axis.prototype.renderLabelsTicksAndTitle = function () { var skipLabels = false; var totalLabelWidth = 0; var thresholdRatio = 1; var labelCount = 0; var intervalInPixels = this.conversionParameters.pixelPerUnit * this.interval; if (this.labelAngle !== 0 && this.labelAngle !== 360) thresholdRatio = 1.2; //Don't skip labels when interval is explicitely set if (typeof this._options.interval === "undefined") { if (this._position === "bottom" || this._position === "top") { //thresholdRatio = .9;// More space is preferred between labels when axis is horizontally aligned for (i = 0; i < this._labels.length; i++) { label = this._labels[i]; if (label.position < this.viewportMinimum || label.stripLine) // don't consider stripLine's lable continue; var width = label.textBlock.width * Math.cos(Math.PI / 180 * this.labelAngle) + label.textBlock.height * Math.sin(Math.PI / 180 * this.labelAngle); totalLabelWidth += width; } if (totalLabelWidth > this.lineCoordinates.width * thresholdRatio) { skipLabels = true; } }if (this._position === "left" || this._position === "right") { for (i = 0; i < this._labels.length; i++) { label = this._labels[i]; if (label.position < this.viewportMinimum || label.stripLine) // don't consider stripLine's lable continue; var width = label.textBlock.height * Math.cos(Math.PI / 180 * this.labelAngle) + label.textBlock.width * Math.sin(Math.PI / 180 * this.labelAngle); totalLabelWidth += width; } if (totalLabelWidth > this.lineCoordinates.height * thresholdRatio) { skipLabels = true; } } } if (this._position === "bottom") { var i = 0; var label; var xy; for (i = 0; i < this._labels.length; i++) { label = this._labels[i]; if (label.position < this.viewportMinimum || label.position > this.viewportMaximum) continue; xy = this.getPixelCoordinatesOnAxis(label.position); if (this.tickThickness && !this._labels[i].stripLine || this._labels[i].stripLine && this._labels[i].stripLine._thicknessType === "pixel") { if (this._labels[i].stripLine) { stripLine = this._labels[i].stripLine; this.ctx.lineWidth = stripLine.thickness; this.ctx.strokeStyle = stripLine.color; } else { this.ctx.lineWidth = this.tickThickness; this.ctx.strokeStyle = this.tickColor; } var tickX = this.ctx.lineWidth % 2 === 1 ? (xy.x << 0) + .5 : xy.x << 0; this.ctx.beginPath(); this.ctx.moveTo(tickX, xy.y << 0); this.ctx.lineTo(tickX, xy.y + this.tickLength << 0); this.ctx.stroke(); } //Don't skip stripLine's labels if (skipLabels && labelCount++ % 2 !== 0 && !this._labels[i].stripLine) continue; if (label.textBlock.angle === 0) { xy.x -= label.textBlock.width / 2; //xy.y += this.tickLength + label.textBlock.height / 2; xy.y += this.tickLength + label.textBlock.fontSize / 2; } else { xy.x -= this.labelAngle < 0 ? label.textBlock.width * Math.cos(Math.PI / 180 * this.labelAngle) : 0; xy.y += this.tickLength + Math.abs(this.labelAngle < 0 ? label.textBlock.width * Math.sin(Math.PI / 180 * this.labelAngle) - 5 : 5); } label.textBlock.x = xy.x; label.textBlock.y = xy.y; label.textBlock.render(true); } if (this.title) { this._titleTextBlock = new _text_block2.default(this.ctx, { x: this.lineCoordinates.x1, // This is recalculated again y: this.boundingRect.y2 - this.titleFontSize - 5, // This is recalculated again maxWidth: this.lineCoordinates.width, maxHeight: this.titleFontSize * 1.5, angle: 0, text: this.title, horizontalAlign: "center", //left, center, right fontSize: this.titleFontSize, //in pixels fontFamily: this.titleFontFamily, fontWeight: this.titleFontWeight, //normal, bold, bolder, lighter, fontColor: this.titleFontColor, fontStyle: this.titleFontStyle, // normal, italic, oblique textBaseline: "top" }); this._titleTextBlock.measureText(); this._titleTextBlock.x = this.lineCoordinates.x1 + this.lineCoordinates.width / 2 - this._titleTextBlock.width / 2; this._titleTextBlock.y = this.boundingRect.y2 - this._titleTextBlock.height - 3; this._titleTextBlock.render(true); } } else if (this._position === "top") { var i = 0; var label; var xy; var stripLine; for (i = 0; i < this._labels.length; i++) { label = this._labels[i]; if (label.position < this.viewportMinimum || label.position > this.viewportMaximum) continue; xy = this.getPixelCoordinatesOnAxis(label.position); if (this.tickThickness && !this._labels[i].stripLine || this._labels[i].stripLine && this._labels[i].stripLine._thicknessType === "pixel") { if (this._labels[i].stripLine) { stripLine = this._labels[i].stripLine; this.ctx.lineWidth = stripLine.thickness; this.ctx.strokeStyle = stripLine.color; } else { this.ctx.lineWidth = this.tickThickness; this.ctx.strokeStyle = this.tickColor; } var tickX = this.ctx.lineWidth % 2 === 1 ? (xy.x << 0) + .5 : xy.x << 0; this.ctx.beginPath(); this.ctx.moveTo(tickX, xy.y << 0); this.ctx.lineTo(tickX, xy.y - this.tickLength << 0); this.ctx.stroke(); } //Don't skip stripLine's labels if (skipLabels && labelCount++ % 2 !== 0 && !this._labels[i].stripLine) continue; if (label.textBlock.angle === 0) { xy.x -= label.textBlock.width / 2; xy.y -= this.tickLength + label.textBlock.height / 2; } else { xy.x -= this.labelAngle > 0 ? label.textBlock.width * Math.cos(Math.PI / 180 * this.labelAngle) : 0; xy.y -= this.tickLength + Math.abs(this.labelAngle > 0 ? label.textBlock.width * Math.sin(Math.PI / 180 * this.labelAngle) + 5 : 5); } label.textBlock.x = xy.x; label.textBlock.y = xy.y; label.textBlock.render(true); } if (this.title) { this._titleTextBlock = new _text_block2.default(this.ctx, { x: this.lineCoordinates.x1, // This is recalculated again y: this.boundingRect.y1 + 1, maxWidth: this.lineCoordinates.width, maxHeight: this.titleFontSize * 1.5, angle: 0, text: this.title, horizontalAlign: "center", //left, center, right fontSize: this.titleFontSize, //in pixels fontFamily: this.titleFontFamily, fontWeight: this.titleFontWeight, //normal, bold, bolder, lighter, fontColor: this.titleFontColor, fontStyle: this.titleFontStyle, // normal, italic, oblique textBaseline: "top" }); this._titleTextBlock.measureText(); this._titleTextBlock.x = this.lineCoordinates.x1 + this.lineCoordinates.width / 2 - this._titleTextBlock.width / 2; this._titleTextBlock.render(true); } } else if (this._position === "left") { var label; var xy; for (var i = 0; i < this._labels.length; i++) { label = this._labels[i]; if (label.position < this.viewportMinimum || label.position > this.viewportMaximum) continue; xy = this.getPixelCoordinatesOnAxis(label.position); if (this.tickThickness && !this._labels[i].stripLine || this._labels[i].stripLine && this._labels[i].stripLine._thicknessType === "pixel") { if (this._labels[i].stripLine) { stripLine = this._labels[i].stripLine; this.ctx.lineWidth = stripLine.thickness; this.ctx.strokeStyle = stripLine.color; } else { this.ctx.lineWidth = this.tickThickness; this.ctx.strokeStyle = this.tickColor; } var tickY = this.ctx.lineWidth % 2 === 1 ? (xy.y << 0) + .5 : xy.y << 0; this.ctx.beginPath(); this.ctx.moveTo(xy.x << 0, tickY); this.ctx.lineTo(xy.x - this.tickLength << 0, tickY); this.ctx.stroke(); } //Don't skip stripLine's labels if (skipLabels && labelCount++ % 2 !== 0 && !this._labels[i].stripLine) continue; label.textBlock.x = xy.x - label.textBlock.width * Math.cos(Math.PI / 180 * this.labelAngle) - this.tickLength - 5; if (this.labelAngle === 0) { label.textBlock.y = xy.y; } else label.textBlock.y = xy.y - label.textBlock.width * Math.sin(Math.PI / 180 * this.labelAngle); label.textBlock.render(true); } if (this.title) { this._titleTextBlock = new _text_block2.default(this.ctx, { x: this.boundingRect.x1 + 1, y: this.lineCoordinates.y2, maxWidth: this.lineCoordinates.height, maxHeight: this.titleFontSize * 1.5, angle: -90, text: this.title, horizontalAlign: "center", //left, center, right fontSize: this.titleFontSize, //in pixels fontFamily: this.titleFontFamily, fontWeight: this.titleFontWeight, //normal, bold, bolder, lighter, fontColor: this.titleFontColor, fontStyle: this.titleFontStyle, // normal, italic, oblique textBaseline: "top" }); var size = this._titleTextBlock.measureText(); //this._titleTextBlock.x -= 4; this._titleTextBlock.y = this.lineCoordinates.height / 2 + this._titleTextBlock.width / 2 + this.lineCoordinates.y1; this._titleTextBlock.render(true); //if (isDebugMode) { // window.console.log("titleFontSize: " + this.titleFontSize + "; width: " + size.width + "; height: " + size.height); // window.console.log("this.boundingRect.x1: " + this.boundingRect.x1); // //this.ctx.rect(this._titleTextBlock.x, this._titleTextBlock.y, this._titleTextBlock.height, -this._titleTextBlock.width); // //this.ctx.stroke(); //} } } else if (this._position === "right") { var label; var xy; for (var i = 0; i < this._labels.length; i++) { label = this._labels[i]; if (label.position < this.viewportMinimum || label.position > this.viewportMaximum) continue; xy = this.getPixelCoordinatesOnAxis(label.position); if (this.tickThickness && !this._labels[i].stripLine || this._labels[i].stripLine && this._labels[i].stripLine._thicknessType === "pixel") { if (this._labels[i].stripLine) { stripLine = this._labels[i].stripLine; this.ctx.lineWidth = stripLine.thickness; this.ctx.strokeStyle = stripLine.color; } else { this.ctx.lineWidth = this.tickThickness; this.ctx.strokeStyle = this.tickColor; } var tickY = this.ctx.lineWidth % 2 === 1 ? (xy.y << 0) + .5 : xy.y << 0; this.ctx.beginPath(); this.ctx.moveTo(xy.x << 0, tickY); this.ctx.lineTo(xy.x + this.tickLength << 0, tickY); this.ctx.stroke(); } //Don't skip stripLine's labels if (skipLabels && labelCount++ % 2 !== 0 && !this._labels[i].stripLine) continue; label.textBlock.x = xy.x + this.tickLength + 5; //label.textBlock.y = xy.y - (label.textBlock.width * Math.sin(Math.PI / 180 * this.labelAngle)); if (this.labelAngle === 0) { label.textBlock.y = xy.y; } else label.textBlock.y = xy.y; label.textBlock.render(true); } if (this.title) { this._titleTextBlock = new _text_block2.default(this.ctx, { x: this.boundingRect.x2 - 1, y: this.lineCoordinates.y2, maxWidth: this.lineCoordinates.height, maxHeight: this.titleFontSize * 1.5, angle: 90, text: this.title, horizontalAlign: "center", //left, center, right fontSize: this.titleFontSize, //in pixels fontFamily: this.titleFontFamily, fontWeight: this.titleFontWeight, //normal, bold, bolder, lighter, fontColor: this.titleFontColor, fontStyle: this.titleFontStyle, // normal, italic, oblique textBaseline: "top" }); this._titleTextBlock.measureText(); this._titleTextBlock.y = this.lineCoordinates.height / 2 - this._titleTextBlock.width / 2 + this.lineCoordinates.y1; this._titleTextBlock.render(true); } } }; Axis.prototype.renderInterlacedColors = function () { var ctx = this.chart.plotArea.ctx; //return; var interlacedGridStartPoint; var interlacedGridEndPoint; var plotAreaCoordinates = this.chart.plotArea; var i = 0, renderInterlacedGrid = true; if ((this._position === "bottom" || this._position === "top") && this.interlacedColor) { ctx.fillStyle = this.interlacedColor; for (i = 0; i < this._labels.length; i++) { if (this._labels[i].stripLine) continue; if (renderInterlacedGrid) { //So that the interlaced color alternates interlacedGridStartPoint = this.getPixelCoordinatesOnAxis(this._labels[i].position); if (i + 1 >= this._labels.length - 1) interlacedGridEndPoint = this.getPixelCoordinatesOnAxis(this.viewportMaximum);else interlacedGridEndPoint = this.getPixelCoordinatesOnAxis(this._labels[i + 1].position); ctx.fillRect(interlacedGridStartPoint.x, plotAreaCoordinates.y1, Math.abs(interlacedGridEndPoint.x - interlacedGridStartPoint.x), Math.abs(plotAreaCoordinates.y1 - plotAreaCoordinates.y2)); renderInterlacedGrid = false; } else renderInterlacedGrid = true; } } else if ((this._position === "left" || this._position === "right") && this.interlacedColor) { ctx.fillStyle = this.interlacedColor; for (i = 0; i < this._labels.length; i++) { if (this._labels[i].stripLine) continue; if (renderInterlacedGrid) { //So that the interlaced color alternates interlacedGridEndPoint = this.getPixelCoordinatesOnAxis(this._labels[i].position); if (i + 1 >= this._labels.length - 1) interlacedGridStartPoint = this.getPixelCoordinatesOnAxis(this.viewportMaximum);else interlacedGridStartPoint = this.getPixelCoordinatesOnAxis(this._labels[i + 1].position); ctx.fillRect(plotAreaCoordinates.x1, interlacedGridStartPoint.y, Math.abs(plotAreaCoordinates.x1 - plotAreaCoordinates.x2), Math.abs(interlacedGridStartPoint.y - interlacedGridEndPoint.y)); renderInterlacedGrid = false; } else renderInterlacedGrid = true; } //throw "123"; } ctx.beginPath(); }; //Renders stripLines of given thickness type. Axis.prototype.renderStripLinesOfThicknessType = function (thicknessType) { if (!(this.stripLines && this.stripLines.length > 0) || !thicknessType) return; var _this = this; var i = 0; for (i = 0; i < this.stripLines.length; i++) { var stripLine = this.stripLines[i]; if (stripLine._thicknessType !== thicknessType) continue; //Should be skipped only if thicknessType is "pixel". If it is "value" then clipping is automatically applied before calling. if (thicknessType === "pixel" && (stripLine.value < this.viewportMinimum || stripLine.value > this.viewportMaximum)) continue; if (stripLine.showOnTop) { this.chart.addEventListener("dataAnimationIterationEnd", stripLine.render, stripLine); } else stripLine.render(); } }; Axis.prototype.renderGrid = function () { if (!(this.gridThickness && this.gridThickness > 0)) return; //var ctx = this.chart.plotArea.ctx; var ctx = this.chart.ctx; var xy; var plotAreaCoordinates = this.chart.plotArea; var stripLine; var tempLineWidth, tempStrokeStyle; //return; ctx.lineWidth = this.gridThickness; ctx.strokeStyle = this.gridColor; if (ctx.setLineDash) { ctx.setLineDash((0, _utils.getLineDashArray)(this.gridDashType, this.gridThickness)); } if (this._position === "bottom" || this._position === "top") { for (i = 0; i < this._labels.length && !this._labels[i].stripLine; i++) { if (this._labels[i].position < this.viewportMinimum || this._labels[i].position > this.viewportMaximum) continue; ctx.beginPath(); xy = this.getPixelCoordinatesOnAxis(this._labels[i].position); var gridX = ctx.lineWidth % 2 === 1 ? (xy.x << 0) + .5 : xy.x << 0; ctx.moveTo(gridX, plotAreaCoordinates.y1 << 0); ctx.lineTo(gridX, plotAreaCoordinates.y2 << 0); ctx.stroke(); } } else if (this._position === "left" || this._position === "right") { for (var i = 0; i < this._labels.length && !this._labels[i].stripLine; i++) { if (i === 0 && this.type === "axisY" && this.chart.axisX && this.chart.axisX.lineThickness) continue; if (this._labels[i].position < this.viewportMinimum || this._labels[i].position > this.viewportMaximum) continue; ctx.beginPath(); xy = this.getPixelCoordinatesOnAxis(this._labels[i].position); var gridY = ctx.lineWidth % 2 === 1 ? (xy.y << 0) + .5 : xy.y << 0; ctx.moveTo(plotAreaCoordinates.x1 << 0, gridY); ctx.lineTo(plotAreaCoordinates.x2 << 0, gridY); ctx.stroke(); } } }; Axis.prototype.renderAxisLine = function () { //var ctx = this.chart.plotArea.ctx; var ctx = this.chart.ctx; if (this._position === "bottom" || this._position === "top") { if (this.lineThickness) { ctx.lineWidth = this.lineThickness; ctx.strokeStyle = this.lineColor ? this.lineColor : "black"; if (ctx.setLineDash) { ctx.setLineDash((0, _utils.getLineDashArray)(this.lineDashType, this.lineThickness)); } var lineY = this.lineThickness % 2 === 1 ? (this.lineCoordinates.y1 << 0) + .5 : this.lineCoordinates.y1 << 0; ctx.beginPath(); ctx.moveTo(this.lineCoordinates.x1, lineY); ctx.lineTo(this.lineCoordinates.x2, lineY); ctx.stroke(); } } else if (this._position === "left" || this._position === "right") { if (this.lineThickness) { ctx.lineWidth = this.lineThickness; ctx.strokeStyle = this.lineColor; if (ctx.setLineDash) { ctx.setLineDash((0, _utils.getLineDashArray)(this.lineDashType, this.lineThickness)); } var lineX = this.lineThickness % 2 === 1 ? (this.lineCoordinates.x1 << 0) + .5 : this.lineCoordinates.x1 << 0; ctx.beginPath(); ctx.moveTo(lineX, this.lineCoordinates.y1); ctx.lineTo(lineX, this.lineCoordinates.y2); ctx.stroke(); } } }; Axis.prototype.getPixelCoordinatesOnAxis = function (value) { var xy = {}; var width = this.lineCoordinates.width; var height = this.lineCoordinates.height; if (this._position === "bottom" || this._position === "top") { //var pixelPerUnit = width / Math.abs(this.viewportMaximum - this.viewportMinimum); var pixelPerUnit = this.conversionParameters.pixelPerUnit; //xy.x = this.lineCoordinates.x1 + (pixelPerUnit * (value - this.viewportMinimum)); xy.x = this.conversionParameters.reference + pixelPerUnit * (value - this.viewportMinimum); xy.y = this.lineCoordinates.y1; } if (this._position === "left" || this._position === "right") { //var pixelPerUnit = height / Math.abs(this.viewportMaximum - this.viewportMinimum); var pixelPerUnit = -this.conversionParameters.pixelPerUnit; //xy.y = this.lineCoordinates.y2 - (pixelPerUnit * (value - this.viewportMinimum)); xy.y = this.conversionParameters.reference - pixelPerUnit * (value - this.viewportMinimum); xy.x = this.lineCoordinates.x2; } return xy; }; Axis.prototype.convertPixelToValue = function (pixel) { if (!pixel) return null; var value = 0; var p = this._position === "left" || this._position === "right" ? pixel.y : pixel.x; value = this.conversionParameters.minimum + (p - this.conversionParameters.reference) / this.conversionParameters.pixelPerUnit; return value; }; Axis.prototype.setViewPortRange = function (viewportMinimum, viewportMaximum) { this.sessionVariables.newViewportMinimum = this.viewportMinimum = Math.min(viewportMinimum, viewportMaximum); this.sessionVariables.newViewportMaximum = this.viewportMaximum = Math.max(viewportMinimum, viewportMaximum); }; Axis.prototype.getXValueAt = function (pixel) { if (!pixel) return null; var xval = null; if (this._position === "left") { xval = (this.chart.axisX.viewportMaximum - this.chart.axisX.viewportMinimum) / this.chart.axisX.lineCoordinates.height * (this.chart.axisX.lineCoordinates.y2 - pixel.y) + this.chart.axisX.viewportMinimum; } else if (this._position === "bottom") { xval = (this.chart.axisX.viewportMaximum - this.chart.axisX.viewportMinimum) / this.chart.axisX.lineCoordinates.width * (pixel.x - this.chart.axisX.lineCoordinates.x1) + this.chart.axisX.viewportMinimum; } return xval; }; Axis.prototype.calculateValueToPixelConversionParameters = function (value) { this.reversed = false; var conversionParameters = { pixelPerUnit: null, minimum: null, reference: null }; var width = this.lineCoordinates.width; var height = this.lineCoordinates.height; conversionParameters.minimum = this.viewportMinimum; if (this._position === "bottom" || this._position === "top") { conversionParameters.pixelPerUnit = (this.reversed ? -1 : 1) * width / Math.abs(this.viewportMaximum - this.viewportMinimum); conversionParameters.reference = this.reversed ? this.lineCoordinates.x2 : this.lineCoordinates.x1; } if (this._position === "left" || this._position === "right") { conversionParameters.pixelPerUnit = (this.reversed ? 1 : -1) * height / Math.abs(this.viewportMaximum - this.viewportMinimum); conversionParameters.reference = this.reversed ? this.lineCoordinates.y1 : this.lineCoordinates.y2; } this.conversionParameters = conversionParameters; }; Axis.prototype.calculateAxisParameters = function () { var freeSpace = this.chart.layoutManager.getFreeSpace(); var availableWidth = 0; var availableHeight = 0; var isLessThanTwoDataPoints = false; if (this._position === "bottom" || this._position === "top") { this.maxWidth = freeSpace.width; this.maxHeight = freeSpace.height; } else { this.maxWidth = freeSpace.height; this.maxHeight = freeSpace.width; } var noTicks = this.type === "axisX" ? this.maxWidth < 500 ? 8 : Math.max(6, Math.floor(this.maxWidth / 62)) : Math.max(Math.floor(this.maxWidth / 40), 2); var min, max; var minDiff; var range; var rangePadding = 0; if (this.viewportMinimum === null || isNaN(this.viewportMinimum)) this.viewportMinimum = this.minimum; if (this.viewportMaximum === null || isNaN(this.viewportMaximum)) this.viewportMaximum = this.maximum; if (this.type === "axisX") { min = this.viewportMinimum !== null ? this.viewportMinimum : this.dataInfo.viewPortMin; max = this.viewportMaximum !== null ? this.viewportMaximum : this.dataInfo.viewPortMax; if (max - min === 0) { rangePadding = typeof this._options.interval === "undefined" ? .4 : this._options.interval; max += rangePadding; min -= rangePadding; } if (this.dataInfo.minDiff !== Infinity) minDiff = this.dataInfo.minDiff;else if (max - min > 1) { minDiff = Math.abs(max - min) * .5; } else { minDiff = 1; if (this.chart.plotInfo.axisXValueType === "dateTime") isLessThanTwoDataPoints = true; } } else if (this.type === "axisY") { //min = typeof (this._options.viewportMinimum) === "undefined" || this._options.viewportMinimum === null ? this.dataInfo.viewPortMin : this._options.viewportMinimum; //max = typeof (this._options.viewportMaximum) === "undefined" || this._options.viewportMaximum === null ? this.dataInfo.viewPortMax : this._options.viewportMaximum; min = this.viewportMinimum !== null ? this.viewportMinimum : this.dataInfo.viewPortMin; max = this.viewportMaximum !== null ? this.viewportMaximum : this.dataInfo.viewPortMax; if (!isFinite(min) && !isFinite(max)) { max = typeof this._options.interval === "undefined" ? -Infinity : this._options.interval; min = 0; } else if (!isFinite(min)) { min = max; } else if (!isFinite(max)) { max = min; } if (min === 0 && max === 0) { // When all dataPoints are zero max += 9; min = 0; } else if (max - min === 0) { // When there is only a single dataPoint or when all dataPoints have same Y Value rangePadding = Math.min(Math.abs(Math.abs(max) * .01), 5); max += rangePadding; min -= rangePadding; } else if (min > max) { rangePadding = Math.min(Math.abs(Math.abs(max - min) * .01), 5); if (max >= 0) min = max - rangePadding;else max = min + rangePadding; } else { rangePadding = Math.min(Math.abs(Math.abs(max - min) * .01), .05); if (max !== 0) max += rangePadding; if (min !== 0) min -= rangePadding; } if (this.dataInfo.minDiff !== Infinity) minDiff = this.dataInfo.minDiff;else if (max - min > 1) { minDiff = Math.abs(max - min) * .5; } else { minDiff = 1; } //Apply includeZero if (this.includeZero && (this.viewportMinimum === null || isNaN(this.viewportMinimum))) { if (min > 0) min = 0; } if (this.includeZero && (this.viewportMaximum === null || isNaN(this.viewportMaximum))) { if (max < 0) max = 0; } } range = (isNaN(this.viewportMaximum) || this.viewportMaximum === null ? max : this.viewportMaximum) - (isNaN(this.viewportMinimum) || this.viewportMinimum === null ? min : this.viewportMinimum); if (this.type === "axisX" && this.chart.plotInfo.axisXValueType === "dateTime") { if (!this.intervalType) { if (range / (1 * 1) <= noTicks) { this.interval = 1; this.intervalType = "millisecond"; } else if (range / (1 * 2) <= noTicks) { this.interval = 2; this.intervalType = "millisecond"; } else if (range / (1 * 5) <= noTicks) { this.interval = 5; this.intervalType = "millisecond"; } else if (range / (1 * 10) <= noTicks) { this.interval = 10; this.intervalType = "millisecond"; } else if (range / (1 * 20) <= noTicks) { this.interval = 20; this.intervalType = "millisecond"; } else if (range / (1 * 50) <= noTicks) { this.interval = 50; this.intervalType = "millisecond"; } else if (range / (1 * 100) <= noTicks) { this.interval = 100; this.intervalType = "millisecond"; } else if (range / (1 * 200) <= noTicks) { this.interval = 200; this.intervalType = "millisecond"; } else if (range / (1 * 250) <= noTicks) { this.interval = 250; this.intervalType = "millisecond"; } else if (range / (1 * 300) <= noTicks) { this.interval = 300; this.intervalType = "millisecond"; } else if (range / (1 * 400) <= noTicks) { this.interval = 400; this.intervalType = "millisecond"; } else if (range / (1 * 500) <= noTicks) { this.interval = 500; this.intervalType = "millisecond"; } else if (range / (constants.secondDuration * 1) <= noTicks) { this.interval = 1; this.intervalType = "second"; } else if (range / (constants.secondDuration * 2) <= noTicks) { this.interval = 2; this.intervalType = "second"; } else if (range / (constants.secondDuration * 5) <= noTicks) { this.interval = 5; this.intervalType = "second"; } else if (range / (constants.secondDuration * 10) <= noTicks) { this.interval = 10; this.intervalType = "second"; } else if (range / (constants.secondDuration * 15) <= noTicks) { this.interval = 15; this.intervalType = "second"; } else if (range / (constants.secondDuration * 20) <= noTicks) { this.interval = 20; this.intervalType = "second"; } else if (range / (constants.secondDuration * 30) <= noTicks) { this.interval = 30; this.intervalType = "second"; } else if (range / (constants.minuteDuration * 1) <= noTicks) { this.interval = 1; this.intervalType = "minute"; } else if (range / (constants.minuteDuration * 2) <= noTicks) { this.interval = 2; this.intervalType = "minute"; } else if (range / (constants.minuteDuration * 5) <= noTicks) { this.interval = 5; this.intervalType = "minute"; } else if (range / (constants.minuteDuration * 10) <= noTicks) { this.interval = 10; this.intervalType = "minute"; } else if (range / (constants.minuteDuration * 15) <= noTicks) { this.interval = 15; this.intervalType = "minute"; } else if (range / (constants.minuteDuration * 20) <= noTicks) { this.interval = 20; this.intervalType = "minute"; } else if (range / (constants.minuteDuration * 30) <= noTicks) { this.interval = 30; this.intervalType = "minute"; } else if (range / (constants.hourDuration * 1) <= noTicks) { this.interval = 1; this.intervalType = "hour"; } else if (range / (constants.hourDuration * 2) <= noTicks) { this.interval = 2; this.intervalType = "hour"; } else if (range / (constants.hourDuration * 3) <= noTicks) { this.interval = 3; this.intervalType = "hour"; } else if (range / (constants.hourDuration * 6) <= noTicks) { this.interval = 6; this.intervalType = "hour"; } else if (range / (constants.dayDuration * 1) <= noTicks) { this.interval = 1; this.intervalType = "day"; } else if (range / (constants.dayDuration * 2) <= noTicks) { this.interval = 2; this.intervalType = "day"; } else if (range / (constants.dayDuration * 4) <= noTicks) { this.interval = 4; this.intervalType = "day"; } else if (range / (constants.weekDuration * 1) <= noTicks) { this.interval = 1; this.intervalType = "week"; } else if (range / (constants.weekDuration * 2) <= noTicks) { this.interval = 2; this.intervalType = "week"; } else if (range / (constants.weekDuration * 3) <= noTicks) { this.interval = 3; this.intervalType = "week"; } else if (range / (constants.monthDuration * 1) <= noTicks) { this.interval = 1; this.intervalType = "month"; } else if (range / (constants.monthDuration * 2) <= noTicks) { this.interval = 2; this.intervalType = "month"; } else if (range / (constants.monthDuration * 3) <= noTicks) { this.interval = 3; this.intervalType = "month"; } else if (range / (constants.monthDuration * 6) <= noTicks) { this.interval = 6; this.intervalType = "month"; } else if (range / (constants.yearDuration * 1) <= noTicks) { this.interval = 1; this.intervalType = "year"; } else if (range / (constants.yearDuration * 2) <= noTicks) { this.interval = 2; this.intervalType = "year"; } else if (range / (constants.yearDuration * 4) <= noTicks) { this.interval = 4; this.intervalType = "year"; } else { this.interval = Math.floor(Axis.getNiceNumber(range / (noTicks - 1), true) / constants.yearDuration); this.intervalType = "year"; } } if (this.viewportMinimum === null || isNaN(this.viewportMinimum)) this.viewportMinimum = min - minDiff / 2; if (this.viewportMaximum === null || isNaN(this.viewportMaximum)) this.viewportMaximum = max + minDiff / 2; if (!this.valueFormatString) { if (isLessThanTwoDataPoints) { this.valueFormatString = "MMM DD YYYY HH:mm"; } else if (this.intervalType === "year") { this.valueFormatString = "YYYY"; } else if (this.intervalType === "month") { this.valueFormatString = "MMM YYYY"; } else if (this.intervalType === "week") { this.valueFormatString = "MMM DD YYYY"; } else if (this.intervalType === "day") { this.valueFormatString = "MMM DD YYYY"; } else if (this.intervalType === "hour") { this.valueFormatString = "hh:mm TT"; } else if (this.intervalType === "minute") { this.valueFormatString = "hh:mm TT"; } else if (this.intervalType === "second") { this.valueFormatString = "hh:mm:ss TT"; } else if (this.intervalType === "millisecond") { this.valueFormatString = "fff'ms'"; } } } else { this.intervalType = "number"; range = Axis.getNiceNumber(range, false); if (this._options && this._options.interval) this.interval = this._options.interval;else { this.interval = Axis.getNiceNumber(range / (noTicks - 1), true); } if (this.viewportMinimum === null || isNaN(this.viewportMinimum)) { if (this.type === "axisX") this.viewportMinimum = min - minDiff / 2;else this.viewportMinimum = Math.floor(min / this.interval) * this.interval; } if (this.viewportMaximum === null || isNaN(this.viewportMaximum)) { if (this.type === "axisX") this.viewportMaximum = max + minDiff / 2;else this.viewportMaximum = Math.ceil(max / this.interval) * this.interval; } if (this.viewportMaximum === 0 && this.viewportMinimum === 0) { if (this._options.viewportMinimum === 0) { this.viewportMaximum += 10; } else if (this._options.viewportMaximum === 0) { this.viewportMinimum -= 10; } if (this._options && typeof this._options.interval === "undefined") { this.interval = Axis.getNiceNumber((this.viewportMaximum - this.viewportMinimum) / (noTicks - 1), true); } } } //Calculate minimum and maximum if not provided by the user if (this.minimum === null || this.maximum === null) { if (this.type === "axisX") { min = this.minimum !== null ? this.minimum : this.dataInfo.min; max = this.maximum !== null ? this.maximum : this.dataInfo.max; if (max - min === 0) { rangePadding = typeof this._options.interval === "undefined" ? .4 : this._options.interval; max += rangePadding; min -= rangePadding; } if (this.dataInfo.minDiff !== Infinity) minDiff = this.dataInfo.minDiff;else if (max - min > 1) { minDiff = Math.abs(max - min) * .5; } else { minDiff = 1; } } else if (this.type === "axisY") { min = this.minimum !== null ? this.minimum : this.dataInfo.min; max = this.maximum !== null ? this.maximum : this.dataInfo.max; if (!isFinite(min) && !isFinite(max)) { max = typeof this._options.interval === "undefined" ? -Infinity : this._options.interval; min = 0; } else if (min === 0 && max === 0) { // When all dataPoints are zero max += 9; min = 0; } else if (max - min === 0) { // When there is only a single dataPoint or when all dataPoints have same Y Value rangePadding = Math.min(Math.abs(Math.abs(max) * .01), 5); max += rangePadding; min -= rangePadding; } else if (min > max) { rangePadding = Math.min(Math.abs(Math.abs(max - min) * .01), 5); if (max >= 0) min = max - rangePadding;else max = min + rangePadding; } else { rangePadding = Math.min(Math.abs(Math.abs(max - min) * .01), .05); if (max !== 0) max += rangePadding; if (min !== 0) min -= rangePadding; } if (this.dataInfo.minDiff !== Infinity) minDiff = this.dataInfo.minDiff;else if (max - min > 1) { minDiff = Math.abs(max - min) * .5; } else { minDiff = 1; } //Apply includeZero if (this.includeZero && (this.minimum === null || isNaN(this.minimum))) { if (min > 0) min = 0; } if (this.includeZero && (this.maximum === null || isNaN(this.maximum))) { if (max < 0) max = 0; } } range = max - min; if (this.type === "axisX" && this.chart.plotInfo.axisXValueType === "dateTime") { if (this.minimum === null || isNaN(this.minimum)) this.minimum = min - minDiff / 2; if (this.maximum === null || isNaN(this.maximum)) this.maximum = max + minDiff / 2; } else { this.intervalType = "number"; if (this.minimum === null) { if (this.type === "axisX") this.minimum = min - minDiff / 2;else this.minimum = Math.floor(min / this.interval) * this.interval; this.minimum = Math.min(this.minimum, this.sessionVariables.viewportMinimum === null || isNaN(this.sessionVariables.viewportMinimum) ? Infinity : this.sessionVariables.viewportMinimum); } if (this.maximum === null) { if (this.type === "axisX") this.maximum = max + minDiff / 2;else this.maximum = Math.ceil(max / this.interval) * this.interval; this.maximum = Math.max(this.maximum, this.sessionVariables.viewportMaximum === null || isNaN(this.sessionVariables.viewportMaximum) ? -Infinity : this.sessionVariables.viewportMaximum); } //var nfrac = Math.max(-Math.floor(Math.log(d)/Math.LN10), 0); //number of fractional digits to show if (this.maximum === 0 && this.minimum === 0) { if (this._options.minimum === 0) { this.maximum += 10; } else if (this._options.maximum === 0) { this.minimum -= 10; } } } } this.viewportMinimum = Math.max(this.viewportMinimum, this.minimum); this.viewportMaximum = Math.min(this.viewportMaximum, this.maximum); if (this.type === "axisX" && this.chart.plotInfo.axisXValueType === "dateTime") this.intervalStartPosition = this.getLabelStartPoint(new Date(this.viewportMinimum), this.intervalType, this.interval);else this.intervalStartPosition = Math.floor((this.viewportMinimum + this.interval * .2) / this.interval) * this.interval; //Set valueFormatString if (!this.valueFormatString) { this.valueFormatString = "#,##0.##"; range = Math.abs(this.viewportMaximum - this.viewportMinimum); if (range < 1) { var numberOfDecimals = Math.floor(Math.abs(Math.log(range) / Math.LN10)) + 2; if (isNaN(numberOfDecimals) || !isFinite(numberOfDecimals)) numberOfDecimals = 2; if (numberOfDecimals > 2) { for (var i = 0; i < numberOfDecimals - 2; i++) { this.valueFormatString += "#"; } } } } //if (isDebugMode && window.console) { // window.console.log(this.type + ": Min = " + this.viewportMinimum); // window.console.log(this.type + ": Max = " + this.viewportMaximum); // window.console.log(this.type + ": Interval = " + this.interval); //} }; Axis.getNiceNumber = function (x, round) { var exp = Math.floor(Math.log(x) / Math.LN10); var f = x / Math.pow(10, exp); var nf; if (round) { if (f < 1.5) nf = 1;else if (f < 3) nf = 2;else if (f < 7) nf = 5;else nf = 10; } else { if (f <= 1) nf = 1;else if (f <= 2) nf = 2;else if (f <= 5) nf = 5;else nf = 10; } return Number((nf * Math.pow(10, exp)).toFixed(20)); }; Axis.prototype.getLabelStartPoint = function () { var intervalInMilliseconds = convertToNumber(this.interval, this.intervalType); var minimum = Math.floor(this.viewportMinimum / intervalInMilliseconds) * intervalInMilliseconds; var dateTime = new Date(minimum); if (this.intervalType === "millisecond") { //millisecond = dateTime.getMilliSecond(); //millisecond = Math.floor((millisecond + this.interval) / this.interval) * this.interval; } else if (this.intervalType === "second") { if (dateTime.getMilliseconds() > 0) { dateTime.setSeconds(dateTime.getSeconds() + 1); dateTime.setMilliseconds(0); } } else if (this.intervalType === "minute") { if (dateTime.getSeconds() > 0 || dateTime.getMilliseconds() > 0) { dateTime.setMinutes(dateTime.getMinutes() + 1); dateTime.setSeconds(0); dateTime.setMilliseconds(0); } } else if (this.intervalType === "hour") { if (dateTime.getMinutes() > 0 || dateTime.getSeconds() > 0 || dateTime.getMilliseconds() > 0) { dateTime.setHours(dateTime.getHours() + 1); dateTime.setMinutes(0); dateTime.setSeconds(0); dateTime.setMilliseconds(0); } } else if (this.intervalType === "day") { if (dateTime.getHours() > 0 || dateTime.getMinutes() > 0 || dateTime.getSeconds() > 0 || dateTime.getMilliseconds() > 0) { dateTime.setDate(dateTime.getDate() + 1); dateTime.setHours(0); dateTime.setMinutes(0); dateTime.setSeconds(0); dateTime.setMilliseconds(0); } } else if (this.intervalType === "week") { if (dateTime.getDay() > 0 || dateTime.getHours() > 0 || dateTime.getMinutes() > 0 || dateTime.getSeconds() > 0 || dateTime.getMilliseconds() > 0) { dateTime.setDate(dateTime.getDate() + (7 - dateTime.getDay())); dateTime.setHours(0); dateTime.setMinutes(0); dateTime.setSeconds(0); dateTime.setMilliseconds(0); } } else if (this.intervalType === "month") { if (dateTime.getDate() > 1 || dateTime.getHours() > 0 || dateTime.getMinutes() > 0 || dateTime.getSeconds() > 0 || dateTime.getMilliseconds() > 0) { dateTime.setMonth(dateTime.getMonth() + 1); dateTime.setDate(1); dateTime.setHours(0); dateTime.setMinutes(0); dateTime.setSeconds(0); dateTime.setMilliseconds(0); } } else if (this.intervalType === "year") { if (dateTime.getMonth() > 0 || dateTime.getDate() > 1 || dateTime.getHours() > 0 || dateTime.getMinutes() > 0 || dateTime.getSeconds() > 0 || dateTime.getMilliseconds() > 0) { dateTime.setFullYear(dateTime.getFullYear() + 1); dateTime.setMonth(0); dateTime.setDate(1); dateTime.setHours(0); dateTime.setMinutes(0); dateTime.setSeconds(0); dateTime.setMilliseconds(0); } } return dateTime; }; exports.default = Axis; },{"../helpers/utils":39,"./canvasjs":27,"./text_block":34}],27:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _themes = require('../constants/themes'); var _options = require('../constants/options'); function CanvasJSObject(defaultsKey, options, theme, parent) { this._defaultsKey = defaultsKey; this.parent = parent; this._eventListeners = []; //Multidimentional array with an array for each event type var currentThemeOptions = {}; if (theme && _themes.themes[theme] && _themes.themes[theme][defaultsKey]) currentThemeOptions = _themes.themes[theme][defaultsKey]; this._options = options ? options : {}; this.setOptions(this._options, currentThemeOptions); } CanvasJSObject.prototype.setOptions = function (options, currentThemeOptions) { if (!_options.defaultOptions[this._defaultsKey]) { if (_options.isDebugMode && window.console) console.log("defaults not set"); } else { var defaults = _options.defaultOptions[this._defaultsKey]; for (var prop in defaults) { if (defaults.hasOwnProperty(prop)) { if (options && prop in options) this[prop] = options[prop];else if (currentThemeOptions && prop in currentThemeOptions) this[prop] = currentThemeOptions[prop];else this[prop] = defaults[prop]; //if (typeof this[prop] === "function") { // alert("function"); // this[prop] = this[prop](); //} } } } }; // Update options. Returns true if changed or else false CanvasJSObject.prototype.updateOption = function (prop) { if (!_options.defaultOptions[this._defaultsKey] && _options.isDebugMode && window.console) console.log("defaults not set"); var defaults = _options.defaultOptions[this._defaultsKey]; var theme = this._options.theme ? this._options.theme : this.chart && this.chart._options.theme ? this.chart._options.theme : "theme1"; var currentThemeOptions = {}; var newValue = this[prop]; if (theme && _themes.themes[theme] && _themes.themes[theme][this._defaultsKey]) currentThemeOptions = _themes.themes[theme][this._defaultsKey]; if (prop in defaults) { if (prop in this._options) newValue = this._options[prop];else if (currentThemeOptions && prop in currentThemeOptions) newValue = currentThemeOptions[prop];else newValue = defaults[prop]; } if (newValue === this[prop]) return false; this[prop] = newValue; return true; }; //Stores values in _oldOptions so that it can be tracked for any changes CanvasJSObject.prototype.trackChanges = function (option) { if (!this.sessionVariables) throw "Session Variable Store not set"; this.sessionVariables[option] = this._options[option]; }; CanvasJSObject.prototype.isBeingTracked = function (option) { if (!this._options._oldOptions) this._options._oldOptions = {}; if (this._options._oldOptions[option]) return true;else return false; }; CanvasJSObject.prototype.hasOptionChanged = function (option) { if (!this.sessionVariables) throw "Session Variable Store not set"; var hasChanged = !(this.sessionVariables[option] === this._options[option]); return hasChanged; }; CanvasJSObject.prototype.addEventListener = function (eventName, eventHandler, context) { if (!eventName || !eventHandler) return; context = context || this; this._eventListeners[eventName] = this._eventListeners[eventName] || []; this._eventListeners[eventName].push({ context: context, eventHandler: eventHandler }); }; CanvasJSObject.prototype.removeEventListener = function (eventName, eventHandler) { if (!eventName || !eventHandler || !this._eventListeners[eventName]) return; var listeners = this._eventListeners[eventName]; for (var i = 0; i < listeners.length; i++) { if (listeners[i].eventHandler === eventHandler) { listeners[i].splice(i, 1); break; } } }; CanvasJSObject.prototype.removeAllEventListeners = function () { this._eventListeners = []; }; CanvasJSObject.prototype.dispatchEvent = function (eventName, eventParameter, context) { //For Internal Events if (eventName && this._eventListeners[eventName]) { eventParameter = eventParameter || {}; var listeners = this._eventListeners[eventName]; for (var i = 0; i < listeners.length; i++) { listeners[i].eventHandler.call(listeners[i].context, eventParameter); } } //External Events do not require registering as the property name is suffient to fire the event. if (typeof this[eventName] === "function") { this[eventName].call(context || this.chart._publicChartReference, eventParameter); } }; exports.default = CanvasJSObject; },{"../constants/options":23,"../constants/themes":24}],28:[function(require,module,exports){ 'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _canvasjs=require('./canvasjs');var _canvasjs2=_interopRequireDefault(_canvasjs);var _animator=require('./animator');var _animator2=_interopRequireDefault(_animator);var _data_series=require('./data_series');var _data_series2=_interopRequireDefault(_data_series);var _text_block=require('./text_block');var _text_block2=_interopRequireDefault(_text_block);var _render=require('../helpers/render');var _render2=_interopRequireDefault(_render);var _layout_manager=require('./layout_manager');var _layout_manager2=_interopRequireDefault(_layout_manager);var _event_manager=require('./event_manager');var _event_manager2=_interopRequireDefault(_event_manager);var _tooltip=require('./tooltip');var _tooltip2=_interopRequireDefault(_tooltip);var _culture_info=require('../core/culture_info');var _culture_info2=_interopRequireDefault(_culture_info);var _axis=require('../core/axis');var _axis2=_interopRequireDefault(_axis);var _title=require('../core/title');var _title2=_interopRequireDefault(_title);var _legend=require('../core/legend');var _legend2=_interopRequireDefault(_legend);var _animator3=require('../helpers/animator');var _animator4=_interopRequireDefault(_animator3);var _themes=require('../constants/themes');var _options=require('../constants/options');var _utils=require('../helpers/utils');var _index=require('../charts/index');function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{default:obj};} // import {inherits} from 'util'; function Chart(containerId,options,publicChartReference){this._publicChartReference = publicChartReference;options = options || {};Chart.base.constructor.call(this,"Chart",options,options.theme?options.theme:"theme1");var _this=this;this._containerId = containerId;this._objectsInitialized = false;this.ctx = null;this.overlaidCanvasCtx = null;this._indexLabels = [];this._panTimerId = 0;this._lastTouchEventType = "";this._lastTouchData = null;this.isAnimating = false;this.renderCount = 0;this.animatedRender = false;this.disableToolTip = false;this.panEnabled = false;this._defaultCursor = "default";this.plotArea = {canvas:null,ctx:null,x1:0,y1:0,x2:0,y2:0,width:0,height:0};this._dataInRenderedOrder = [];this._container = typeof this._containerId === "string"?document.getElementById(this._containerId):this._containerId;if(!this._container){if(window.console)window.console.log("CanvasJS Error: Chart Container with id \"" + this._containerId + "\" was not found");return;}this._container.innerHTML = "";var width=0;var height=0;if(this._options.width)width = this.width;else width = this._container.clientWidth > 0?this._container.clientWidth:this.width;if(this._options.height)height = this.height;else height = this._container.clientHeight > 0?this._container.clientHeight:this.height;this.width = width;this.height = height;this.x1 = this.y1 = 0;this.x2 = this.width;this.y2 = this.height;this._selectedColorSet = typeof _themes.colorSets[this.colorSet] !== "undefined"?_themes.colorSets[this.colorSet]:_themes.colorSets["colorSet1"];this._canvasJSContainer = document.createElement("div");this._canvasJSContainer.setAttribute("class","canvasjs-chart-container");this._canvasJSContainer.style.position = "relative";this._canvasJSContainer.style.textAlign = "left";this._canvasJSContainer.style.cursor = "auto";if(!_utils.isCanvasSupported){this._canvasJSContainer.style.height = "0px"; //In IE6 toolTip doesn't show at proper position if not set. }this._container.appendChild(this._canvasJSContainer);this.canvas = (0,_utils.createCanvas)(width,height);this.canvas.style.position = "absolute";if(this.canvas.getContext){ //try { // this.canvas.style.background = this.backgroundColor; //} catch (e) { } this._canvasJSContainer.appendChild(this.canvas);this.ctx = this.canvas.getContext("2d");this.ctx.textBaseline = "top";(0,_utils.extendCtx)(this.ctx);}else return; //this.canvas.style.cursor = "pointer"; if(!_utils.isCanvasSupported){this.plotArea.canvas = (0,_utils.createCanvas)(width,height);this.plotArea.canvas.style.position = "absolute";this.plotArea.canvas.setAttribute("class","plotAreaCanvas");this._canvasJSContainer.appendChild(this.plotArea.canvas);this.plotArea.ctx = this.plotArea.canvas.getContext("2d");}else {this.plotArea.ctx = this.ctx;}this.overlaidCanvas = (0,_utils.createCanvas)(width,height);this.overlaidCanvas.style.position = "absolute";this._canvasJSContainer.appendChild(this.overlaidCanvas);this.overlaidCanvasCtx = this.overlaidCanvas.getContext("2d");this.overlaidCanvasCtx.textBaseline = "top";this._eventManager = new _event_manager2.default(this);(0,_utils.addEvent)(window,"resize",function(){ //this._container.addEventListener("DOMSubtreeModified", function () { if(_this._updateSize())_this.render();});this._toolBar = document.createElement("div");this._toolBar.setAttribute("class","canvasjs-chart-toolbar");this._toolBar.style.cssText = "position: absolute; right: 1px; top: 1px;";this._canvasJSContainer.appendChild(this._toolBar);this.bounds = {x1:0,y1:0,x2:this.width,y2:this.height};(0,_utils.addEvent)(this.overlaidCanvas,'click',function(e){_this._mouseEventHandler(e);});(0,_utils.addEvent)(this.overlaidCanvas,'mousemove',function(e){_this._mouseEventHandler(e);});(0,_utils.addEvent)(this.overlaidCanvas,'mouseup',function(e){_this._mouseEventHandler(e);});(0,_utils.addEvent)(this.overlaidCanvas,'mousedown',function(e){_this._mouseEventHandler(e);(0,_utils.hide)(_this._dropdownMenu);});(0,_utils.addEvent)(this.overlaidCanvas,'mouseout',function(e){_this._mouseEventHandler(e);});(0,_utils.addEvent)(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerDown":"touchstart",function(e){_this._touchEventHandler(e);});(0,_utils.addEvent)(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerMove":'touchmove',function(e){_this._touchEventHandler(e);});(0,_utils.addEvent)(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerUp":'touchend',function(e){_this._touchEventHandler(e);});(0,_utils.addEvent)(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerCancel":'touchcancel',function(e){_this._touchEventHandler(e);});if(!this._creditLink){this._creditLink = document.createElement("a");this._creditLink.setAttribute("class","canvasjs-chart-credit");this._creditLink.setAttribute("style","outline:none;margin:0px;position:absolute;right:3px;top:" + (this.height - 14) + "px;color:dimgrey;text-decoration:none;font-size:10px;font-family:Lucida Grande, Lucida Sans Unicode, Arial, sans-serif");this._creditLink.setAttribute("tabIndex",-1);this._creditLink.setAttribute("target","_blank");}this._toolTip = new _tooltip2.default(this,this._options.toolTip,this.theme);this.data = null;this.axisX = null;this.axisY = null;this.axisY2 = null;this.sessionVariables = {axisX:{},axisY:{},axisY2:{}};}(0,_utils.extend)(Chart,_canvasjs2.default); //Update Chart Properties Chart.prototype._updateOptions = function(){var _this=this;this.updateOption("width");this.updateOption("height");this.updateOption("dataPointMaxWidth");this.updateOption("interactivityEnabled");this.updateOption("theme");if(this.updateOption("colorSet"))this._selectedColorSet = typeof _themes.colorSets[this.colorSet] !== "undefined"?_themes.colorSets[this.colorSet]:_themes.colorSets["colorSet1"];this.updateOption("backgroundColor");if(!this.backgroundColor)this.backgroundColor = "rgba(0,0,0,0)";this.updateOption("culture");this._cultureInfo = new _culture_info2.default(this._options.culture);this.updateOption("animationEnabled");this.animationEnabled = this.animationEnabled && _utils.isCanvasSupported;this.updateOption("animationDuration");this.updateOption("rangeChanging");this.updateOption("rangeChanged"); //Need to check this._options.zoomEnabled because this.zoomEnabled is used internally to keep track of state - and hence changes. if(this._options.zoomEnabled){if(!this._zoomButton){(0,_utils.hide)(this._zoomButton = document.createElement("button"));setButtonState(this,this._zoomButton,"pan");this._toolBar.appendChild(this._zoomButton);(0,_utils.addEvent)(this._zoomButton,"click",function(){if(_this.zoomEnabled){_this.zoomEnabled = false;_this.panEnabled = true;setButtonState(_this,_this._zoomButton,"zoom");}else {_this.zoomEnabled = true;_this.panEnabled = false;setButtonState(_this,_this._zoomButton,"pan");}_this.render();});}if(!this._resetButton){(0,_utils.hide)(this._resetButton = document.createElement("button"));setButtonState(this,this._resetButton,"reset");this._toolBar.appendChild(this._resetButton);(0,_utils.addEvent)(this._resetButton,"click",function(){_this._toolTip.hide();if(_this.zoomEnabled || _this.panEnabled){_this.zoomEnabled = true;_this.panEnabled = false;setButtonState(_this,_this._zoomButton,"pan");_this._defaultCursor = "default";_this.overlaidCanvas.style.cursor = _this._defaultCursor;}else {_this.zoomEnabled = false;_this.panEnabled = false;} //Reset axisX if(_this.sessionVariables.axisX){_this.sessionVariables.axisX.newViewportMinimum = null;_this.sessionVariables.axisX.newViewportMaximum = null;} //Reset axisY if(_this.sessionVariables.axisY){_this.sessionVariables.axisY.newViewportMinimum = null;_this.sessionVariables.axisY.newViewportMaximum = null;} //Reset axisY2 if(_this.sessionVariables.axisY2){_this.sessionVariables.axisY2.newViewportMinimum = null;_this.sessionVariables.axisY2.newViewportMaximum = null;}_this.resetOverlayedCanvas();(0,_utils.hide)(_this._zoomButton,_this._resetButton);_this._dispatchRangeEvent("rangeChanging","reset");_this.render();_this._dispatchRangeEvent("rangeChanged","reset");});this.overlaidCanvas.style.cursor = _this._defaultCursor;}if(!this.zoomEnabled && !this.panEnabled){if(!this._zoomButton){this.zoomEnabled = true;this.panEnabled = false;}else {if(_this._zoomButton.getAttribute("state") === _this._cultureInfo.zoomText){this.panEnabled = true;this.zoomEnabled = false;}else {this.zoomEnabled = true;this.panEnabled = false;}(0,_utils.show)(_this._zoomButton,_this._resetButton);}}}else {this.zoomEnabled = false;this.panEnabled = false;}if(this._menuButton){if(this.exportEnabled)(0,_utils.show)(this._menuButton);else (0,_utils.hide)(this._menuButton);}else if(this.exportEnabled && _utils.isCanvasSupported){this._menuButton = document.createElement("button");setButtonState(this,this._menuButton,"menu");this._toolBar.appendChild(this._menuButton);(0,_utils.addEvent)(this._menuButton,"click",function(){if(_this._dropdownMenu.style.display === "none"){if(_this._dropDownCloseTime && new Date().getTime() - _this._dropDownCloseTime.getTime() <= 500)return;_this._dropdownMenu.style.display = "block";_this._menuButton.blur();_this._dropdownMenu.focus();}},true);}if(!this._dropdownMenu && this.exportEnabled && _utils.isCanvasSupported){this._dropdownMenu = document.createElement("div");this._dropdownMenu.setAttribute("tabindex",-1);this._dropdownMenu.style.cssText = "position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 1px;top: 25px;min-width: 120px;outline: 0;border: 1px solid silver;font-size: 14px;font-family: Calibri, Verdana, sans-serif;padding: 5px 0px 5px 0px;text-align: left;background-color: #fff;line-height: 20px;box-shadow: 2px 2px 10px #888888;";_this._dropdownMenu.style.display = "none";this._toolBar.appendChild(this._dropdownMenu);(0,_utils.addEvent)(this._dropdownMenu,"blur",function(){(0,_utils.hide)(_this._dropdownMenu);_this._dropDownCloseTime = new Date();},true);var exportOption=document.createElement("div");exportOption.style.cssText = "padding: 2px 15px 2px 10px";exportOption.innerHTML = this._cultureInfo.saveJPGText;this._dropdownMenu.appendChild(exportOption);(0,_utils.addEvent)(exportOption,"mouseover",function(){this.style.backgroundColor = "#EEEEEE";},true);(0,_utils.addEvent)(exportOption,"mouseout",function(){this.style.backgroundColor = "transparent";},true);(0,_utils.addEvent)(exportOption,"click",function(){exportCanvas(_this.canvas,"jpg",_this.exportFileName);(0,_utils.hide)(_this._dropdownMenu);},true);var exportOption=document.createElement("div");exportOption.style.cssText = "padding: 2px 15px 2px 10px";exportOption.innerHTML = this._cultureInfo.savePNGText;this._dropdownMenu.appendChild(exportOption);(0,_utils.addEvent)(exportOption,"mouseover",function(){this.style.backgroundColor = "#EEEEEE";},true);(0,_utils.addEvent)(exportOption,"mouseout",function(){this.style.backgroundColor = "transparent";},true);(0,_utils.addEvent)(exportOption,"click",function(){exportCanvas(_this.canvas,"png",_this.exportFileName);(0,_utils.hide)(_this._dropdownMenu);},true);}if(this._toolBar.style.display !== "none" && this._zoomButton){this.panEnabled?setButtonState(_this,_this._zoomButton,"zoom"):setButtonState(_this,_this._zoomButton,"pan");if(_this._resetButton.getAttribute("state") !== _this._cultureInfo.resetText)setButtonState(_this,_this._resetButton,"reset");}if(typeof _options.defaultOptions.Chart.creditHref === "undefined"){this.creditHref = "http://canvasjs.com/";this.creditText = "CanvasJS.com";}else {var creditTextChanged=this.updateOption("creditText");var creditHrefChanged=this.updateOption("creditHref");}if(this.renderCount === 0 || creditTextChanged || creditHrefChanged){this._creditLink.setAttribute("href",this.creditHref);this._creditLink.innerHTML = this.creditText;}if(this.creditHref && this.creditText){if(!this._creditLink.parentElement)this._canvasJSContainer.appendChild(this._creditLink);}else if(this._creditLink.parentElement)this._canvasJSContainer.removeChild(this._creditLink);if(this._options.toolTip && this._toolTip._options !== this._options.toolTip)this._toolTip._options = this._options.toolTip;for(var prop in this._toolTip._options) {if(this._toolTip._options.hasOwnProperty(prop)){this._toolTip.updateOption(prop);}}};Chart.prototype._updateSize = function(){var width=0;var height=0;if(this._options.width)width = this.width;else this.width = width = this._container.clientWidth > 0?this._container.clientWidth:this.width;if(this._options.height)height = this.height;else this.height = height = this._container.clientHeight > 0?this._container.clientHeight:this.height;if(this.canvas.width !== width * _utils.devicePixelBackingStoreRatio || this.canvas.height !== height * _utils.devicePixelBackingStoreRatio){(0,_utils.setCanvasSize)(this.canvas,width,height);(0,_utils.setCanvasSize)(this.overlaidCanvas,width,height);(0,_utils.setCanvasSize)(this._eventManager.ghostCanvas,width,height);return true;}return false;}; // initialize chart objects Chart.prototype._initialize = function(){ /// ///Initializes Chart objects/state. Creates DataSeries class instance for each DataSeries provided by ther user. Sets the Axis Type based on the user data /// //this.width = this.width; if(!this._animator)this._animator = new _animator2.default(this);else {this._animator.cancelAllAnimations();}this.removeAllEventListeners();this.disableToolTip = false;this._axes = [];this.pieDoughnutClickHandler = null; //this._touchCurrentCoordinates = null; if(this.animationRequestId)this.cancelRequestAnimFrame.call(window,this.animationRequestId);this._updateOptions();this.animatedRender = _utils.isCanvasSupported && this.animationEnabled && this.renderCount === 0;this._updateSize(); //this._selectedColorSet = colorSets["colorSet2"]; //this.ctx.clearRect(0, 0, this.width, this.height); this.clearCanvas();this.ctx.beginPath();this.axisX = null;this.axisY = null;this.axisY2 = null;this._indexLabels = [];this._dataInRenderedOrder = [];this._events = [];if(this._eventManager)this._eventManager.reset();this.plotInfo = {axisPlacement:null,axisXValueType:null,plotTypes:[] //array of plotType: {type:"", axisYType: "primary", dataSeriesIndexes:[]} };this.layoutManager = new _layout_manager2.default(0,0,this.width,this.height,2);if(this.plotArea.layoutManager)this.plotArea.layoutManager.reset();this.data = [];var dataSeriesIndex=0;for(var series=0;series < this._options.data.length;series++) { //for (series in this._options.data) { dataSeriesIndex++;if(!(!this._options.data[series].type || Chart._supportedChartTypes.indexOf(this._options.data[series].type) >= 0))continue;var dataSeries=new _data_series2.default(this,this._options.data[series],this.theme,dataSeriesIndex - 1,++this._eventManager.lastObjectId);if(dataSeries.name === null)dataSeries.name = "DataSeries " + dataSeriesIndex;if(dataSeries.color === null){if(this._options.data.length > 1){dataSeries._colorSet = [this._selectedColorSet[dataSeries.index % this._selectedColorSet.length]];dataSeries.color = this._selectedColorSet[dataSeries.index % this._selectedColorSet.length];}else {if(dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline" || dataSeries.type === "area" || dataSeries.type === "stepArea" || dataSeries.type === "splineArea" || dataSeries.type === "stackedArea" || dataSeries.type === "stackedArea100" || dataSeries.type === "rangeArea" || dataSeries.type === "rangeSplineArea" || dataSeries.type === "candlestick" || dataSeries.type === "ohlc"){dataSeries._colorSet = [this._selectedColorSet[0]];}else dataSeries._colorSet = this._selectedColorSet;}}else {dataSeries._colorSet = [dataSeries.color];}if(dataSeries.markerSize === null){if((dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline") && dataSeries.dataPoints && dataSeries.dataPoints.length < this.width / 16 || dataSeries.type === "scatter"){ //if (dataSeries.type === "line") { dataSeries.markerSize = 8;}}if((dataSeries.type === "bubble" || dataSeries.type === "scatter") && dataSeries.dataPoints){dataSeries.dataPoints.sort(_utils.compareDataPointX);} //if (dataSeries.markerBorderThickness === null && dataSeries.type === "scatter") { // dataSeries.markerBorderThickness = 2; //} //if (dataSeries.markerType === null) { // if (dataSeries.type === "line" & dataSeries.dataPoints.length < 500) { // dataSeries.markerType = "circle"; // } //} this.data.push(dataSeries);var seriesAxisPlacement=dataSeries.axisPlacement; //if (isDebugMode && window.console) // window.console.log(dataSeries.type); var errorMessage;if(seriesAxisPlacement === "normal"){if(this.plotInfo.axisPlacement === "xySwapped"){errorMessage = "You cannot combine \"" + dataSeries.type + "\" with bar chart";}else if(this.plotInfo.axisPlacement === "none"){errorMessage = "You cannot combine \"" + dataSeries.type + "\" with pie chart";}else if(this.plotInfo.axisPlacement === null)this.plotInfo.axisPlacement = "normal";}else if(seriesAxisPlacement === "xySwapped"){if(this.plotInfo.axisPlacement === "normal"){errorMessage = "You cannot combine \"" + dataSeries.type + "\" with line, area, column or pie chart";}else if(this.plotInfo.axisPlacement === "none"){errorMessage = "You cannot combine \"" + dataSeries.type + "\" with pie chart";}else if(this.plotInfo.axisPlacement === null)this.plotInfo.axisPlacement = "xySwapped";}else if(seriesAxisPlacement == "none"){if(this.plotInfo.axisPlacement === "normal"){errorMessage = "You cannot combine \"" + dataSeries.type + "\" with line, area, column or bar chart";}else if(this.plotInfo.axisPlacement === "xySwapped"){errorMessage = "You cannot combine \"" + dataSeries.type + "\" with bar chart";}else if(this.plotInfo.axisPlacement === null)this.plotInfo.axisPlacement = "none";}if(errorMessage && window.console){window.console.log(errorMessage);return;}} //if (isDebugMode && window.console) { // window.console.log("xMin: " + this.plotInfo.viewPortXMin + "; xMax: " + this.plotInfo.viewPortXMax + "; yMin: " + this.plotInfo.yMin + "; yMax: " + this.plotInfo.yMax); //} this._objectsInitialized = true;}; //indexOf is not supported in IE8- Chart._supportedChartTypes = (0,_utils.addArrayIndexOf)(["line","stepLine","spline","column","area","stepArea","splineArea","bar","bubble","scatter","stackedColumn","stackedColumn100","stackedBar","stackedBar100","stackedArea","stackedArea100","candlestick","ohlc","rangeColumn","rangeBar","rangeArea","rangeSplineArea","pie","doughnut","funnel"]);Chart.prototype.render = function(options){if(options)this._options = options;this._initialize();var plotAreaElements=[]; //Elements to be rendered inside the plotArea //Create Primary and Secondary axis and assign them to the series for(var i=0;i < this.data.length;i++) {if(this.plotInfo.axisPlacement === "normal" || this.plotInfo.axisPlacement === "xySwapped"){if(!this.data[i].axisYType || this.data[i].axisYType === "primary"){if(!this.axisY){if(this.plotInfo.axisPlacement === "normal"){this._axes.push(this.axisY = new _axis2.default(this,this._options.axisY,"axisY","left"));}else if(this.plotInfo.axisPlacement === "xySwapped"){this._axes.push(this.axisY = new _axis2.default(this,this._options.axisY,"axisY","bottom"));}}this.data[i].axisY = this.axisY;}else if(this.data[i].axisYType === "secondary"){if(!this.axisY2){if(this.plotInfo.axisPlacement === "normal"){this._axes.push(this.axisY2 = new _axis2.default(this,this._options.axisY2,"axisY","right"));}else if(this.plotInfo.axisPlacement === "xySwapped"){this._axes.push(this.axisY2 = new _axis2.default(this,this._options.axisY2,"axisY","top"));}}this.data[i].axisY = this.axisY2;}if(!this.axisX){if(this.plotInfo.axisPlacement === "normal"){this._axes.push(this.axisX = new _axis2.default(this,this._options.axisX,"axisX","bottom"));}else if(this.plotInfo.axisPlacement === "xySwapped"){this._axes.push(this.axisX = new _axis2.default(this,this._options.axisX,"axisX","left"));}}this.data[i].axisX = this.axisX;}} //If Both Primary and Secondary axis are present, disable gridlines for one of them unless the user has set value for both if(this.axisY && this.axisY2){if(this.axisY.gridThickness > 0 && typeof this.axisY2._options.gridThickness === "undefined")this.axisY2.gridThickness = 0;else if(this.axisY2.gridThickness > 0 && typeof this.axisY._options.gridThickness === "undefined")this.axisY.gridThickness = 0;} //Show toolBar when viewportMinimum/viewportMaximum are set var showToolBar=false;if(this._axes.length > 0 && (this.zoomEnabled || this.panEnabled)){for(var i=0;i < this._axes.length;i++) {if(this._axes[i].viewportMinimum !== null || this._axes[i].viewportMaximum !== null){showToolBar = true;break;}}}if(showToolBar){(0,_utils.show)(this._zoomButton,this._resetButton);}else {(0,_utils.hide)(this._zoomButton,this._resetButton);}this._processData(); // Categorises the dataSeries and calculates min, max and other values if(this._options.title){this._title = new _title2.default(this,this._options.title);if(!this._title.dockInsidePlotArea)this._title.render();else plotAreaElements.push(this._title);}if(this._options.subtitles){for(var i=0;i < this._options.subtitles.length;i++) {this.subtitles = [];var subtitle=new Subtitle(this,this._options.subtitles[i]);this.subtitles.push(subtitle);if(!subtitle.dockInsidePlotArea)subtitle.render();else plotAreaElements.push(subtitle);}}this.legend = new _legend2.default(this,this._options.legend,this.theme);for(var i=0;i < this.data.length;i++) {if(this.data[i].showInLegend || this.data[i].type === "pie" || this.data[i].type === "doughnut"){this.legend.dataSeries.push(this.data[i]);}}if(!this.legend.dockInsidePlotArea)this.legend.render();else plotAreaElements.push(this.legend); //TBI: Revisit and check if the functionality is enough. if(this.plotInfo.axisPlacement === "normal" || this.plotInfo.axisPlacement === "xySwapped"){ //var freeSpace = this.layoutManager.getFreeSpace(); _axis2.default.setLayoutAndRender(this.axisX,this.axisY,this.axisY2,this.plotInfo.axisPlacement,this.layoutManager.getFreeSpace());}else if(this.plotInfo.axisPlacement === "none"){ //In case of charts with axis this method is called inside setLayoutAndRender this.preparePlotArea();}else {return;}var index=0;for(index in plotAreaElements) {if(plotAreaElements.hasOwnProperty(index))plotAreaElements[index].render();}var animations=[];if(this.animatedRender){var initialState=(0,_utils.createCanvas)(this.width,this.height);var initialStateCtx=initialState.getContext("2d");initialStateCtx.drawImage(this.canvas,0,0,this.width,this.height);}for(var i=0;i < this.plotInfo.plotTypes.length;i++) {var plotType=this.plotInfo.plotTypes[i];for(var j=0;j < plotType.plotUnits.length;j++) {var plotUnit=plotType.plotUnits[j];var animationInfo=null;plotUnit.targetCanvas = null; //In case chart updates before the animation is complete, previous canvases need to be removed if(this.animatedRender){plotUnit.targetCanvas = (0,_utils.createCanvas)(this.width,this.height);plotUnit.targetCanvasCtx = plotUnit.targetCanvas.getContext("2d");}if(plotUnit.type === "line")animationInfo = this.renderLine(plotUnit);else if(plotUnit.type === "stepLine")animationInfo = this.renderStepLine(plotUnit);else if(plotUnit.type === "spline")animationInfo = this.renderSpline(plotUnit);else if(plotUnit.type === "column")animationInfo = this.renderColumn(plotUnit);else if(plotUnit.type === "bar")animationInfo = this.renderBar(plotUnit);else if(plotUnit.type === "area")animationInfo = this.renderArea(plotUnit);else if(plotUnit.type === "stepArea")animationInfo = this.renderStepArea(plotUnit);else if(plotUnit.type === "splineArea")animationInfo = this.renderSplineArea(plotUnit);else if(plotUnit.type === "stackedColumn")animationInfo = this.renderStackedColumn(plotUnit);else if(plotUnit.type === "stackedColumn100")animationInfo = this.renderStackedColumn100(plotUnit);else if(plotUnit.type === "stackedBar")animationInfo = this.renderStackedBar(plotUnit);else if(plotUnit.type === "stackedBar100")animationInfo = this.renderStackedBar100(plotUnit);else if(plotUnit.type === "stackedArea")animationInfo = this.renderStackedArea(plotUnit);else if(plotUnit.type === "stackedArea100")animationInfo = this.renderStackedArea100(plotUnit);else if(plotUnit.type === "bubble")animationInfo = animationInfo = this.renderBubble(plotUnit);else if(plotUnit.type === "scatter")animationInfo = this.renderScatter(plotUnit);else if(plotUnit.type === "pie")this.renderPie(plotUnit);else if(plotUnit.type === "doughnut")this.renderPie(plotUnit);else if(plotUnit.type === "candlestick")animationInfo = this.renderCandlestick(plotUnit);else if(plotUnit.type === "ohlc")animationInfo = this.renderCandlestick(plotUnit);else if(plotUnit.type === "rangeColumn")animationInfo = this.renderRangeColumn(plotUnit);else if(plotUnit.type === "rangeBar")animationInfo = this.renderRangeBar(plotUnit);else if(plotUnit.type === "rangeArea")animationInfo = this.renderRangeArea(plotUnit);else if(plotUnit.type === "rangeSplineArea")animationInfo = this.renderRangeSplineArea(plotUnit);for(var k=0;k < plotUnit.dataSeriesIndexes.length;k++) {this._dataInRenderedOrder.push(this.data[plotUnit.dataSeriesIndexes[k]]);}if(this.animatedRender && animationInfo)animations.push(animationInfo);}}if(this.animatedRender && this._indexLabels.length > 0){var indexLabelCanvas=(0,_utils.createCanvas)(this.width,this.height);var indexLabelCanvasCtx=indexLabelCanvas.getContext("2d");animations.push(this.renderIndexLabels(indexLabelCanvasCtx));}var _this=this;if(animations.length > 0){ //var animationCount = 0; _this.disableToolTip = true;_this._animator.animate(200,_this.animationDuration,function(fractionComplete){ //console.log(fractionComplete); //animationCount++; _this.ctx.clearRect(0,0,_this.width,_this.height); // _this.ctx.drawImage(initialState, 0, 0, _this.width * devicePixelBackingStoreRatio, _this.height * devicePixelBackingStoreRatio, 0, 0, _this.width, _this.height); _this.ctx.drawImage(initialState,0,0,Math.floor(_this.width * _utils.devicePixelBackingStoreRatio),Math.floor(_this.height * _utils.devicePixelBackingStoreRatio),0,0,_this.width,_this.height);for(var l=0;l < animations.length;l++) {animationInfo = animations[l];if(fractionComplete < 1 && typeof animationInfo.startTimePercent !== "undefined"){if(fractionComplete >= animationInfo.startTimePercent){ //animationInfo.animationCallback(AnimationHelper.easing.linear(fractionComplete - animationInfo.startTimePercent, 0, 1, 1 - animationInfo.startTimePercent), animationInfo); animationInfo.animationCallback(animationInfo.easingFunction(fractionComplete - animationInfo.startTimePercent,0,1,1 - animationInfo.startTimePercent),animationInfo);}}else {animationInfo.animationCallback(animationInfo.easingFunction(fractionComplete,0,1,1),animationInfo);}}_this.dispatchEvent("dataAnimationIterationEnd",{chart:_this});},function(){animations = [];var count=0; //Delete all render target canvases used for animation. for(var i=0;i < _this.plotInfo.plotTypes.length;i++) {var plotType=_this.plotInfo.plotTypes[i];for(var j=0;j < plotType.plotUnits.length;j++) {var plotUnit=plotType.plotUnits[j];plotUnit.targetCanvas = null;}}initialState = null;_this.disableToolTip = false; //console.log("*********** Animation Complete - " + animationCount + " ***********"); });}else {if(_this._indexLabels.length > 0)_this.renderIndexLabels();_this.dispatchEvent("dataAnimationIterationEnd",{chart:_this});}this.attachPlotAreaEventHandlers();if(!this.zoomEnabled && !this.panEnabled && this._zoomButton && this._zoomButton.style.display !== "none"){(0,_utils.hide)(this._zoomButton,this._resetButton);}this._toolTip._updateToolTip();this.renderCount++; //if (window.console) { // window.console.log(new Date().getTime() - dt); //} if(_options.isDebugMode){var _this=this;setTimeout(function(){var ghostCanvasCopy=document.getElementById("ghostCanvasCopy");if(ghostCanvasCopy){ //console.log(ghostCanvasCopy.clientWidth); (0,_utils.setCanvasSize)(ghostCanvasCopy,_this.width,_this.height);var ghostCanvasCopyCtx=ghostCanvasCopy.getContext("2d"); //ghostCanvasCopyCtx.scale(1, 1); //var imageData = this._eventManager.ghostCtx.getImageData(0, 0, this._container.clientWidth, this._container.clientHeight); //this._eventManager.ghostCtx.drawImage(this._eventManager.ghostCanvas, 0, 0); //this.ctx.drawImage(this._eventManager.ghostCanvas, 0, 0); ghostCanvasCopyCtx.drawImage(_this._eventManager.ghostCanvas,0,0); //_this._canvasJSContainer.appendChild(_this._eventManager.ghostCanvas); //_this.overlaidCanvasCtx.drawImage(_this._eventManager.ghostCanvas, 0, 0); }},2000);}};Chart.prototype.attachPlotAreaEventHandlers = function(){ //this._toolBar.style.display = "inline"; this.attachEvent({context:this,chart:this,mousedown:this._plotAreaMouseDown,mouseup:this._plotAreaMouseUp,mousemove:this._plotAreaMouseMove,cursor:this.zoomEnabled?"col-resize":"move",cursor:this.panEnabled?"move":"default",capture:true,bounds:this.plotArea});};Chart.prototype.categoriseDataSeries = function(){var dataSeries="";for(var i=0;i < this.data.length;i++) {dataSeries = this.data[i];if(!dataSeries.dataPoints || dataSeries.dataPoints.length === 0 || !dataSeries.visible)continue;if(Chart._supportedChartTypes.indexOf(dataSeries.type) >= 0){var plotType=null;var plotTypeExists=false;var plotUnit=null;var plotUnitExists=false;for(var j=0;j < this.plotInfo.plotTypes.length;j++) {if(this.plotInfo.plotTypes[j].type === dataSeries.type){plotTypeExists = true;var plotType=this.plotInfo.plotTypes[j];break;}}if(!plotTypeExists){plotType = {type:dataSeries.type,totalDataSeries:0,plotUnits:[]};this.plotInfo.plotTypes.push(plotType);}for(var j=0;j < plotType.plotUnits.length;j++) {if(plotType.plotUnits[j].axisYType === dataSeries.axisYType){plotUnitExists = true;var plotUnit=plotType.plotUnits[j];break;}}if(!plotUnitExists){plotUnit = {type:dataSeries.type,previousDataSeriesCount:0, //to be set next index:plotType.plotUnits.length,plotType:plotType,axisYType:dataSeries.axisYType,axisY:dataSeries.axisYType === "primary"?this.axisY:this.axisY2,axisX:this.axisX,dataSeriesIndexes:[], //index of dataSeries yTotals:[]};plotType.plotUnits.push(plotUnit);}plotType.totalDataSeries++;plotUnit.dataSeriesIndexes.push(i);dataSeries.plotUnit = plotUnit;}}for(var i=0;i < this.plotInfo.plotTypes.length;i++) {var plotType=this.plotInfo.plotTypes[i];var previousDataSeriesCount=0;for(var j=0;j < plotType.plotUnits.length;j++) {plotType.plotUnits[j].previousDataSeriesCount = previousDataSeriesCount;previousDataSeriesCount += plotType.plotUnits[j].dataSeriesIndexes.length;}}};Chart.prototype.assignIdToDataPoints = function(){for(var i=0;i < this.data.length;i++) {var dataSeries=this.data[i];if(!dataSeries.dataPoints)continue;var length=dataSeries.dataPoints.length;for(var j=0;j < length;j++) {dataSeries.dataPointIds[j] = ++this._eventManager.lastObjectId;}}};Chart.prototype._processData = function(){this.assignIdToDataPoints();this.categoriseDataSeries();for(var i=0;i < this.plotInfo.plotTypes.length;i++) {var plotType=this.plotInfo.plotTypes[i];for(var j=0;j < plotType.plotUnits.length;j++) {var plotUnit=plotType.plotUnits[j];if(plotUnit.type === "line" || plotUnit.type === "stepLine" || plotUnit.type === "spline" || plotUnit.type === "column" || plotUnit.type === "area" || plotUnit.type === "stepArea" || plotUnit.type === "splineArea" || plotUnit.type === "bar" || plotUnit.type === "bubble" || plotUnit.type === "scatter")this._processMultiseriesPlotUnit(plotUnit);else if(plotUnit.type === "stackedColumn" || plotUnit.type === "stackedBar" || plotUnit.type === "stackedArea")this._processStackedPlotUnit(plotUnit);else if(plotUnit.type === "stackedColumn100" || plotUnit.type === "stackedBar100" || plotUnit.type === "stackedArea100")this._processStacked100PlotUnit(plotUnit);else if(plotUnit.type === "candlestick" || plotUnit.type === "ohlc" || plotUnit.type === "rangeColumn" || plotUnit.type === "rangeBar" || plotUnit.type === "rangeArea" || plotUnit.type === "rangeSplineArea")this._processMultiYPlotUnit(plotUnit);}}};Chart.prototype._processMultiseriesPlotUnit = function(plotUnit){if(!plotUnit.dataSeriesIndexes || plotUnit.dataSeriesIndexes.length < 1)return;var axisYDataInfo=plotUnit.axisY.dataInfo;var axisXDataInfo=plotUnit.axisX.dataInfo;var dataPointX,dataPointY;var isDateTime=false;for(var j=0;j < plotUnit.dataSeriesIndexes.length;j++) {var dataSeries=this.data[plotUnit.dataSeriesIndexes[j]];var i=0;var isFirstDPInViewPort=false;var isLastDPInViewPort=false;if(dataSeries.axisPlacement === "normal" || dataSeries.axisPlacement === "xySwapped"){var plotAreaXMin=this.sessionVariables.axisX.newViewportMinimum?this.sessionVariables.axisX.newViewportMinimum:this._options.axisX && this._options.axisX.viewportMinimum?this._options.axisX.viewportMinimum:this._options.axisX && this._options.axisX.minimum?this._options.axisX.minimum:-Infinity;var plotAreaXMax=this.sessionVariables.axisX.newViewportMaximum?this.sessionVariables.axisX.newViewportMaximum:this._options.axisX && this._options.axisX.viewportMaximum?this._options.axisX.viewportMaximum:this._options.axisX && this._options.axisX.maximum?this._options.axisX.maximum:Infinity;}if(dataSeries.dataPoints[i].x && dataSeries.dataPoints[i].x.getTime || dataSeries.xValueType === "dateTime"){isDateTime = true;}for(i = 0;i < dataSeries.dataPoints.length;i++) {if(typeof dataSeries.dataPoints[i].x === "undefined"){dataSeries.dataPoints[i].x = i;}if(dataSeries.dataPoints[i].x.getTime){isDateTime = true;dataPointX = dataSeries.dataPoints[i].x.getTime(); //dataPointX is used so that getTime is called only once in case of dateTime values }else dataPointX = dataSeries.dataPoints[i].x;dataPointY = dataSeries.dataPoints[i].y;if(dataPointX < axisXDataInfo.min)axisXDataInfo.min = dataPointX;if(dataPointX > axisXDataInfo.max)axisXDataInfo.max = dataPointX;if(dataPointY < axisYDataInfo.min)axisYDataInfo.min = dataPointY;if(dataPointY > axisYDataInfo.max)axisYDataInfo.max = dataPointY;if(i > 0){var xDiff=dataPointX - dataSeries.dataPoints[i - 1].x;xDiff < 0 && (xDiff = xDiff * -1); //If Condition shortcut if(axisXDataInfo.minDiff > xDiff && xDiff !== 0){axisXDataInfo.minDiff = xDiff;}if(dataPointY !== null && dataSeries.dataPoints[i - 1].y !== null){var yDiff=dataPointY - dataSeries.dataPoints[i - 1].y;yDiff < 0 && (yDiff = yDiff * -1); //If Condition shortcut if(axisYDataInfo.minDiff > yDiff && yDiff !== 0){axisYDataInfo.minDiff = yDiff;}}} // This section makes sure that partially visible dataPoints are included in the begining if(dataPointX < plotAreaXMin && !isFirstDPInViewPort){continue;}else if(!isFirstDPInViewPort){isFirstDPInViewPort = true;if(i > 0){i -= 2;continue;}} // This section makes sure that partially visible dataPoints are included at the end if(dataPointX > plotAreaXMax && !isLastDPInViewPort){isLastDPInViewPort = true;}else if(dataPointX > plotAreaXMax && isLastDPInViewPort){continue;}if(dataSeries.dataPoints[i].label)plotUnit.axisX.labels[dataPointX] = dataSeries.dataPoints[i].label;if(dataPointX < axisXDataInfo.viewPortMin)axisXDataInfo.viewPortMin = dataPointX;if(dataPointX > axisXDataInfo.viewPortMax)axisXDataInfo.viewPortMax = dataPointX;if(dataPointY === null)continue;if(dataPointY < axisYDataInfo.viewPortMin)axisYDataInfo.viewPortMin = dataPointY;if(dataPointY > axisYDataInfo.viewPortMax)axisYDataInfo.viewPortMax = dataPointY;}this.plotInfo.axisXValueType = dataSeries.xValueType = isDateTime?"dateTime":"number";} //this.dataPoints.sort(compareDataPointX); //this.dataPoints.sort(function (dataPoint1, dataPoint2) { return dataPoint1.x - dataPoint2.x; }); };Chart.prototype._processStackedPlotUnit = function(plotUnit){if(!plotUnit.dataSeriesIndexes || plotUnit.dataSeriesIndexes.length < 1)return;var axisYDataInfo=plotUnit.axisY.dataInfo;var axisXDataInfo=plotUnit.axisX.dataInfo;var dataPointX,dataPointY;var isDateTime=false;var dataPointYPositiveSums=[];var dataPointYNegativeSums=[];for(var j=0;j < plotUnit.dataSeriesIndexes.length;j++) {var dataSeries=this.data[plotUnit.dataSeriesIndexes[j]];var i=0;var isFirstDPInViewPort=false;var isLastDPInViewPort=false;if(dataSeries.axisPlacement === "normal" || dataSeries.axisPlacement === "xySwapped"){var plotAreaXMin=this.sessionVariables.axisX.newViewportMinimum?this.sessionVariables.axisX.newViewportMinimum:this._options.axisX && this._options.axisX.viewportMinimum?this._options.axisX.viewportMinimum:this._options.axisX && this._options.axisX.minimum?this._options.axisX.minimum:-Infinity;var plotAreaXMax=this.sessionVariables.axisX.newViewportMaximum?this.sessionVariables.axisX.newViewportMaximum:this._options.axisX && this._options.axisX.viewportMaximum?this._options.axisX.viewportMaximum:this._options.axisX && this._options.axisX.maximum?this._options.axisX.maximum:Infinity;}if(dataSeries.dataPoints[i].x && dataSeries.dataPoints[i].x.getTime || dataSeries.xValueType === "dateTime"){isDateTime = true;}for(i = 0;i < dataSeries.dataPoints.length;i++) { // Requird when no x values are provided if(typeof dataSeries.dataPoints[i].x === "undefined"){dataSeries.dataPoints[i].x = i;}if(dataSeries.dataPoints[i].x.getTime){isDateTime = true;dataPointX = dataSeries.dataPoints[i].x.getTime(); //dataPointX is used so that getTime is called only once in case of dateTime values }else dataPointX = dataSeries.dataPoints[i].x;dataPointY = dataSeries.dataPoints[i].y;if(dataPointX < axisXDataInfo.min)axisXDataInfo.min = dataPointX;if(dataPointX > axisXDataInfo.max)axisXDataInfo.max = dataPointX;if(i > 0){var xDiff=dataPointX - dataSeries.dataPoints[i - 1].x;xDiff < 0 && (xDiff = xDiff * -1); //If Condition shortcut if(axisXDataInfo.minDiff > xDiff && xDiff !== 0){axisXDataInfo.minDiff = xDiff;}if(dataPointY !== null && dataSeries.dataPoints[i - 1].y !== null){var yDiff=dataPointY - dataSeries.dataPoints[i - 1].y;yDiff < 0 && (yDiff = yDiff * -1); //If Condition shortcut if(axisYDataInfo.minDiff > yDiff && yDiff !== 0){axisYDataInfo.minDiff = yDiff;}}} // This section makes sure that partially visible dataPoints are included in the begining if(dataPointX < plotAreaXMin && !isFirstDPInViewPort){continue;}else if(!isFirstDPInViewPort){isFirstDPInViewPort = true;if(i > 0){i -= 2;continue;}} // This section makes sure that partially visible dataPoints are included at the end if(dataPointX > plotAreaXMax && !isLastDPInViewPort){isLastDPInViewPort = true;}else if(dataPointX > plotAreaXMax && isLastDPInViewPort){continue;}if(dataSeries.dataPoints[i].label)plotUnit.axisX.labels[dataPointX] = dataSeries.dataPoints[i].label;if(dataPointX < axisXDataInfo.viewPortMin)axisXDataInfo.viewPortMin = dataPointX;if(dataPointX > axisXDataInfo.viewPortMax)axisXDataInfo.viewPortMax = dataPointX;if(dataPointY === null)continue;plotUnit.yTotals[dataPointX] = (!plotUnit.yTotals[dataPointX]?0:plotUnit.yTotals[dataPointX]) + Math.abs(dataPointY);if(dataPointY >= 0){if(dataPointYPositiveSums[dataPointX])dataPointYPositiveSums[dataPointX] += dataPointY;else dataPointYPositiveSums[dataPointX] = dataPointY;}else {if(dataPointYNegativeSums[dataPointX])dataPointYNegativeSums[dataPointX] += dataPointY;else dataPointYNegativeSums[dataPointX] = dataPointY;}}this.plotInfo.axisXValueType = dataSeries.xValueType = isDateTime?"dateTime":"number";}for(i in dataPointYPositiveSums) {if(dataPointYPositiveSums.hasOwnProperty(i)){if(isNaN(i)){continue;}var ySum=dataPointYPositiveSums[i];if(ySum < axisYDataInfo.min)axisYDataInfo.min = ySum;if(ySum > axisYDataInfo.max)axisYDataInfo.max = ySum;if(i < axisXDataInfo.viewPortMin || i > axisXDataInfo.viewPortMax)continue;if(ySum < axisYDataInfo.viewPortMin)axisYDataInfo.viewPortMin = ySum;if(ySum > axisYDataInfo.viewPortMax)axisYDataInfo.viewPortMax = ySum;}}for(i in dataPointYNegativeSums) {if(dataPointYNegativeSums.hasOwnProperty(i)){if(isNaN(i)){continue;}var ySum=dataPointYNegativeSums[i];if(ySum < axisYDataInfo.min)axisYDataInfo.min = ySum;if(ySum > axisYDataInfo.max)axisYDataInfo.max = ySum;if(i < axisXDataInfo.viewPortMin || i > axisXDataInfo.viewPortMax)continue;if(ySum < axisYDataInfo.viewPortMin)axisYDataInfo.viewPortMin = ySum;if(ySum > axisYDataInfo.viewPortMax)axisYDataInfo.viewPortMax = ySum;}} //this.dataPoints.sort(compareDataPointX); //this.dataPoints.sort(function (dataPoint1, dataPoint2) { return dataPoint1.x - dataPoint2.x; }); //window.console.log("viewPortYMin: " + plotInfo.viewPortYMin + "; viewPortYMax: " + plotInfo.viewPortYMax); };Chart.prototype._processStacked100PlotUnit = function(plotUnit){if(!plotUnit.dataSeriesIndexes || plotUnit.dataSeriesIndexes.length < 1)return;var axisYDataInfo=plotUnit.axisY.dataInfo;var axisXDataInfo=plotUnit.axisX.dataInfo;var dataPointX,dataPointY;var isDateTime=false;var containsPositiveY=false;var containsNegativeY=false;var dataPointYSums=[];for(var j=0;j < plotUnit.dataSeriesIndexes.length;j++) {var dataSeries=this.data[plotUnit.dataSeriesIndexes[j]];var i=0;var isFirstDPInViewPort=false;var isLastDPInViewPort=false;if(dataSeries.axisPlacement === "normal" || dataSeries.axisPlacement === "xySwapped"){var plotAreaXMin=this.sessionVariables.axisX.newViewportMinimum?this.sessionVariables.axisX.newViewportMinimum:this._options.axisX && this._options.axisX.viewportMinimum?this._options.axisX.viewportMinimum:this._options.axisX && this._options.axisX.minimum?this._options.axisX.minimum:-Infinity;var plotAreaXMax=this.sessionVariables.axisX.newViewportMaximum?this.sessionVariables.axisX.newViewportMaximum:this._options.axisX && this._options.axisX.viewportMaximum?this._options.axisX.viewportMaximum:this._options.axisX && this._options.axisX.maximum?this._options.axisX.maximum:Infinity;}if(dataSeries.dataPoints[i].x && dataSeries.dataPoints[i].x.getTime || dataSeries.xValueType === "dateTime"){isDateTime = true;}for(i = 0;i < dataSeries.dataPoints.length;i++) { // Requird when no x values are provided if(typeof dataSeries.dataPoints[i].x === "undefined"){dataSeries.dataPoints[i].x = i;}if(dataSeries.dataPoints[i].x.getTime){isDateTime = true;dataPointX = dataSeries.dataPoints[i].x.getTime(); //dataPointX is used so that getTime is called only once in case of dateTime values }else dataPointX = dataSeries.dataPoints[i].x;dataPointY = dataSeries.dataPoints[i].y;if(dataPointX < axisXDataInfo.min)axisXDataInfo.min = dataPointX;if(dataPointX > axisXDataInfo.max)axisXDataInfo.max = dataPointX;if(i > 0){var xDiff=dataPointX - dataSeries.dataPoints[i - 1].x;xDiff < 0 && (xDiff = xDiff * -1); //If Condition shortcut if(axisXDataInfo.minDiff > xDiff && xDiff !== 0){axisXDataInfo.minDiff = xDiff;}if(dataPointY !== null && dataSeries.dataPoints[i - 1].y !== null){var yDiff=dataPointY - dataSeries.dataPoints[i - 1].y;yDiff < 0 && (yDiff = yDiff * -1); //If Condition shortcut if(axisYDataInfo.minDiff > yDiff && yDiff !== 0){axisYDataInfo.minDiff = yDiff;}}} // This section makes sure that partially visible dataPoints are included in the begining if(dataPointX < plotAreaXMin && !isFirstDPInViewPort){continue;}else if(!isFirstDPInViewPort){isFirstDPInViewPort = true;if(i > 0){i -= 2;continue;}} // This section makes sure that partially visible dataPoints are included at the end if(dataPointX > plotAreaXMax && !isLastDPInViewPort){isLastDPInViewPort = true;}else if(dataPointX > plotAreaXMax && isLastDPInViewPort){continue;}if(dataSeries.dataPoints[i].label)plotUnit.axisX.labels[dataPointX] = dataSeries.dataPoints[i].label;if(dataPointX < axisXDataInfo.viewPortMin)axisXDataInfo.viewPortMin = dataPointX;if(dataPointX > axisXDataInfo.viewPortMax)axisXDataInfo.viewPortMax = dataPointX;if(dataPointY === null)continue;plotUnit.yTotals[dataPointX] = (!plotUnit.yTotals[dataPointX]?0:plotUnit.yTotals[dataPointX]) + Math.abs(dataPointY);if(dataPointY >= 0){containsPositiveY = true;}else {containsNegativeY = true;}if(dataPointYSums[dataPointX])dataPointYSums[dataPointX] += Math.abs(dataPointY);else dataPointYSums[dataPointX] = Math.abs(dataPointY);}this.plotInfo.axisXValueType = dataSeries.xValueType = isDateTime?"dateTime":"number";}if(containsPositiveY && !containsNegativeY){axisYDataInfo.max = 99;axisYDataInfo.min = 1;}else if(containsPositiveY && containsNegativeY){axisYDataInfo.max = 99;axisYDataInfo.min = -99;}else if(!containsPositiveY && containsNegativeY){axisYDataInfo.max = -1;axisYDataInfo.min = -99;}axisYDataInfo.viewPortMin = axisYDataInfo.min;axisYDataInfo.viewPortMax = axisYDataInfo.max;plotUnit.dataPointYSums = dataPointYSums; //this.dataPoints.sort(compareDataPointX); //this.dataPoints.sort(function (dataPoint1, dataPoint2) { return dataPoint1.x - dataPoint2.x; }); //window.console.log("viewPortYMin: " + plotInfo.viewPortYMin + "; viewPortYMax: " + plotInfo.viewPortYMax); };Chart.prototype._processMultiYPlotUnit = function(plotUnit){if(!plotUnit.dataSeriesIndexes || plotUnit.dataSeriesIndexes.length < 1)return;var axisYDataInfo=plotUnit.axisY.dataInfo;var axisXDataInfo=plotUnit.axisX.dataInfo;var dataPointX,dataPointY,dataPointYMin,dataPointYMax;var isDateTime=false;for(var j=0;j < plotUnit.dataSeriesIndexes.length;j++) {var dataSeries=this.data[plotUnit.dataSeriesIndexes[j]];var i=0;var isFirstDPInViewPort=false;var isLastDPInViewPort=false;if(dataSeries.axisPlacement === "normal" || dataSeries.axisPlacement === "xySwapped"){var plotAreaXMin=this.sessionVariables.axisX.newViewportMinimum?this.sessionVariables.axisX.newViewportMinimum:this._options.axisX && this._options.axisX.viewportMinimum?this._options.axisX.viewportMinimum:this._options.axisX && this._options.axisX.minimum?this._options.axisX.minimum:-Infinity;var plotAreaXMax=this.sessionVariables.axisX.newViewportMaximum?this.sessionVariables.axisX.newViewportMaximum:this._options.axisX && this._options.axisX.viewportMaximum?this._options.axisX.viewportMaximum:this._options.axisX && this._options.axisX.maximum?this._options.axisX.maximum:Infinity;}if(dataSeries.dataPoints[i].x && dataSeries.dataPoints[i].x.getTime || dataSeries.xValueType === "dateTime"){isDateTime = true;}for(i = 0;i < dataSeries.dataPoints.length;i++) {if(typeof dataSeries.dataPoints[i].x === "undefined"){dataSeries.dataPoints[i].x = i;}if(dataSeries.dataPoints[i].x.getTime){isDateTime = true;dataPointX = dataSeries.dataPoints[i].x.getTime(); //dataPointX is used so that getTime is called only once in case of dateTime values }else dataPointX = dataSeries.dataPoints[i].x;dataPointY = dataSeries.dataPoints[i].y;if(dataPointY && dataPointY.length){dataPointYMin = Math.min.apply(null,dataPointY);dataPointYMax = Math.max.apply(null,dataPointY);}if(dataPointX < axisXDataInfo.min)axisXDataInfo.min = dataPointX;if(dataPointX > axisXDataInfo.max)axisXDataInfo.max = dataPointX;if(dataPointYMin < axisYDataInfo.min)axisYDataInfo.min = dataPointYMin;if(dataPointYMax > axisYDataInfo.max)axisYDataInfo.max = dataPointYMax;if(i > 0){var xDiff=dataPointX - dataSeries.dataPoints[i - 1].x;xDiff < 0 && (xDiff = xDiff * -1); //If Condition shortcut if(axisXDataInfo.minDiff > xDiff && xDiff !== 0){axisXDataInfo.minDiff = xDiff;}if(dataPointY[0] !== null && dataSeries.dataPoints[i - 1].y[0] !== null){var yDiff=dataPointY[0] - dataSeries.dataPoints[i - 1].y[0];yDiff < 0 && (yDiff = yDiff * -1); //If Condition shortcut if(axisYDataInfo.minDiff > yDiff && yDiff !== 0){axisYDataInfo.minDiff = yDiff;}}} // This section makes sure that partially visible dataPoints are included in the begining if(dataPointX < plotAreaXMin && !isFirstDPInViewPort){continue;}else if(!isFirstDPInViewPort){isFirstDPInViewPort = true;if(i > 0){i -= 2;continue;}} // This section makes sure that partially visible dataPoints are included at the end if(dataPointX > plotAreaXMax && !isLastDPInViewPort){isLastDPInViewPort = true;}else if(dataPointX > plotAreaXMax && isLastDPInViewPort){continue;}if(dataSeries.dataPoints[i].label)plotUnit.axisX.labels[dataPointX] = dataSeries.dataPoints[i].label;if(dataPointX < axisXDataInfo.viewPortMin)axisXDataInfo.viewPortMin = dataPointX;if(dataPointX > axisXDataInfo.viewPortMax)axisXDataInfo.viewPortMax = dataPointX;if(dataPointY === null)continue;if(dataPointYMin < axisYDataInfo.viewPortMin)axisYDataInfo.viewPortMin = dataPointYMin;if(dataPointYMax > axisYDataInfo.viewPortMax)axisYDataInfo.viewPortMax = dataPointYMax;}this.plotInfo.axisXValueType = dataSeries.xValueType = isDateTime?"dateTime":"number";} //this.dataPoints.sort(compareDataPointX); //this.dataPoints.sort(function (dataPoint1, dataPoint2) { return dataPoint1.x - dataPoint2.x; }); }; //getClosest returns objects nearby and hence shouldn't be used for events like click, mouseover, mousemove, etc which require object that is exactly under the mouse. Chart.prototype.getDataPointAtXY = function(mouseX,mouseY,getClosest){getClosest = getClosest || false;var results=[];for(var i=this._dataInRenderedOrder.length - 1;i >= 0;i--) {var dataSeries=this._dataInRenderedOrder[i];var result=null;result = dataSeries.getDataPointAtXY(mouseX,mouseY,getClosest);if(result)results.push(result);}var closestResult=null;var onlyLineAreaTypes=false;for(var m=0;m < results.length;m++) {if(results[m].dataSeries.type === "line" || results[m].dataSeries.type === "stepLine" || results[m].dataSeries.type === "area" || results[m].dataSeries.type === "stepArea"){var markerSize=(0,_utils.getProperty)("markerSize",results[m].dataPoint,results[m].dataSeries) || 8;if(results[m].distance <= markerSize / 2){onlyLineAreaTypes = true;break;}}}for(m = 0;m < results.length;m++) {if(onlyLineAreaTypes && results[m].dataSeries.type !== "line" && results[m].dataSeries.type !== "stepLine" && results[m].dataSeries.type !== "area" && results[m].dataSeries.type !== "stepArea")continue;if(!closestResult){closestResult = results[m];}else if(results[m].distance <= closestResult.distance){closestResult = results[m];}}return closestResult;};Chart.prototype.getObjectAtXY = function(mouseX,mouseY,getClosest){getClosest = getClosest || false;var id=null;var dataPointInfo=this.getDataPointAtXY(mouseX,mouseY,getClosest);if(dataPointInfo){id = dataPointInfo.dataSeries.dataPointIds[dataPointInfo.dataPointIndex];}else if(_utils.isCanvasSupported){ //IE9+ id = (0,_utils.getObjectId)(mouseX,mouseY,this._eventManager.ghostCtx);}else {for(var i=0;i < this.legend.items.length;i++) {var item=this.legend.items[i];if(mouseX >= item.x1 && mouseX <= item.x2 && mouseY >= item.y1 && mouseY <= item.y2){id = item.id;}}}return id;}; /// Calculates Font Size based on standardSize and Chart Size /// Standard font size for a Chart with min(width,height) = 400px /// The area. Chart.prototype.getAutoFontSize = function(standardSize,width,height){width = width || this.width;height = height || this.height;var fontSizeScaleFactor=standardSize / 400;return Math.round(Math.min(this.width,this.height) * fontSizeScaleFactor);}; //#region Events Chart.prototype.resetOverlayedCanvas = function(){ //var width = this.overlaidCanvas.width; //this.overlaidCanvas.width = 0; //this.overlaidCanvas.width = width; this.overlaidCanvasCtx.clearRect(0,0,this.width,this.height);};Chart.prototype.clearCanvas = function(){this.ctx.clearRect(0,0,this.width,this.height);if(this.backgroundColor){this.ctx.fillStyle = this.backgroundColor;this.ctx.fillRect(0,0,this.width,this.height);}};Chart.prototype.attachEvent = function(param){this._events.push(param);};Chart.prototype._touchEventHandler = function(ev){if(!ev.changedTouches || !this.interactivityEnabled)return;var mouseEvents=[];var touches=ev.changedTouches;var first=touches?touches[0]:ev;var touchCurrentCoordinates=null; //window.console.log(touches.length); switch(ev.type){case "touchstart":case "MSPointerDown":mouseEvents = ["mousemove","mousedown"];this._lastTouchData = (0,_utils.getMouseCoordinates)(first);this._lastTouchData.time = new Date();break;case "touchmove":case "MSPointerMove":mouseEvents = ["mousemove"];break;case "touchend":case "MSPointerUp":mouseEvents = this._lastTouchEventType === "touchstart" || this._lastTouchEventType === "MSPointerDown"?["mouseup","click"]:["mouseup"];break;default:return;}if(touches && touches.length > 1)return;touchCurrentCoordinates = (0,_utils.getMouseCoordinates)(first);touchCurrentCoordinates.time = new Date();try{var dy=touchCurrentCoordinates.y - this._lastTouchData.y;var dx=touchCurrentCoordinates.x - this._lastTouchData.x;var dt=touchCurrentCoordinates.time - this._lastTouchData.time;if(Math.abs(dy) > 15 && (!!this._lastTouchData.scroll || dt < 200)){ //this._lastTouchData.y = touchCurrentCoordinates.y; this._lastTouchData.scroll = true;var win=window.parent || window;if(win && win.scrollBy)win.scrollBy(0,-dy);}}catch(e) {};this._lastTouchEventType = ev.type;if(!!this._lastTouchData.scroll && this.zoomEnabled){if(this.isDrag)this.resetOverlayedCanvas();this.isDrag = false;return;}for(var i=0;i < mouseEvents.length;i++) {var type=mouseEvents[i];var simulatedEvent=document.createEvent("MouseEvent");simulatedEvent.initMouseEvent(type,true,true,window,1,first.screenX,first.screenY,first.clientX,first.clientY,false,false,false,false,0,null);first.target.dispatchEvent(simulatedEvent);if(ev.preventManipulation){ //alert("preventManipulation"); ev.preventManipulation();}if(ev.preventDefault){ //alert("preventDefault"); ev.preventDefault();}}};Chart.prototype._dispatchRangeEvent = function(eventName,triggerSource){var eventParameter={};eventParameter.chart = this._publicChartReference;eventParameter.type = eventName;eventParameter.trigger = triggerSource;var axes=[];if(this.axisX)axes.push("axisX");if(this.axisY)axes.push("axisY");if(this.axisY2)axes.push("axisY2");for(var i=0;i < axes.length;i++) {eventParameter[axes[i]] = {viewportMinimum:this[axes[i]].sessionVariables.newViewportMinimum,viewportMaximum:this[axes[i]].sessionVariables.newViewportMaximum};}this.dispatchEvent(eventName,eventParameter,this._publicChartReference);};Chart.prototype._mouseEventHandler = function(ev){if(!this.interactivityEnabled)return;if(this._ignoreNextEvent){this._ignoreNextEvent = false;return;} // stop panning and zooming so we can draw if(ev.preventManipulation){ //alert("preventManipulation"); ev.preventManipulation();} // we are handling this event if(ev.preventDefault){ //alert("preventDefault"); ev.preventDefault();} //IE8- uses srcElement instead of target. So instead of checking this condition everytime, its better to create a reference called target. if(typeof ev.target === "undefined" && ev.srcElement)ev.target = ev.srcElement; //console.log(ev.type); var xy=(0,_utils.getMouseCoordinates)(ev);var type=ev.type;var eventParam;var rightclick;if(!ev)var e=window.event;if(ev.which)rightclick = ev.which == 3;else if(ev.button)rightclick = ev.button == 2; //window.console.log(type + " --> x: " + xy.x + "; y:" + xy.y); //if (type === "mouseout") { // this._toolTip.hide(); //} if(_options.isDebugMode && window.console){window.console.log(type + " --> x: " + xy.x + "; y:" + xy.y);if(rightclick)window.console.log(ev.which);if(type === "mouseup")window.console.log("mouseup");}if(rightclick)return; //if (this.plotInfo.axisPlacement === "xySwapped") { // //var temp = xy.x; // //xy.x = xy.y; // //xy.y = temp; // xy = {x: xy.y, y: xy.x}; //} if(Chart.capturedEventParam){eventParam = Chart.capturedEventParam;if(type === "mouseup"){Chart.capturedEventParam = null;if(eventParam.chart.overlaidCanvas.releaseCapture)eventParam.chart.overlaidCanvas.releaseCapture();else document.body.removeEventListener("mouseup",eventParam.chart._mouseEventHandler,false);}if(eventParam.hasOwnProperty(type))eventParam[type].call(eventParam.context,xy.x,xy.y);}else if(this._events){for(var i=0;i < this._events.length;i++) {if(!this._events[i].hasOwnProperty(type))continue;eventParam = this._events[i];var bounds=eventParam.bounds;if(xy.x >= bounds.x1 && xy.x <= bounds.x2 && xy.y >= bounds.y1 && xy.y <= bounds.y2){eventParam[type].call(eventParam.context,xy.x,xy.y);if(type === "mousedown" && eventParam.capture === true){Chart.capturedEventParam = eventParam;if(this.overlaidCanvas.setCapture)this.overlaidCanvas.setCapture();else {document.body.addEventListener("mouseup",this._mouseEventHandler,false); //addEvent(document.body, "mouseup", this._mouseEventHandler); }}else if(type === "mouseup"){if(eventParam.chart.overlaidCanvas.releaseCapture)eventParam.chart.overlaidCanvas.releaseCapture();else document.body.removeEventListener("mouseup",this._mouseEventHandler,false);}break;}else eventParam = null;}if(eventParam && eventParam.cursor){ev.target.style.cursor = eventParam.cursor;}else ev.target.style.cursor = this._defaultCursor; //eventParam = }if(this._toolTip && this._toolTip.enabled){var plotArea=this.plotArea;if(xy.x < plotArea.x1 || xy.x > plotArea.x2 || xy.y < plotArea.y1 || xy.y > plotArea.y2)this._toolTip.hide();}if((!this.isDrag || !this.zoomEnabled) && this._eventManager){this._eventManager.mouseEventHandler(ev); //this._updateToolTip(ev.x, ev.y); } //if (this._toolTip.enabled) // this._toolTip.mouseMoveHandler(ev.x, ev.y); };Chart.prototype._plotAreaMouseDown = function(x,y){this.isDrag = true;if(this.plotInfo.axisPlacement !== "none"){this.dragStartPoint = {x:x,y:y};}else {this.dragStartPoint = {x:x,y:y};}};Chart.prototype._plotAreaMouseUp = function(x,y){if(this.plotInfo.axisPlacement === "normal" || this.plotInfo.axisPlacement === "xySwapped"){if(this.isDrag){var dragDelta=0,dragDeltaPY=y - this.dragStartPoint.y,dragDeltaPX=x - this.dragStartPoint.x,zoomPX=this.zoomType.indexOf("x") >= 0, //Whether to zoom horizontally zoomPY=this.zoomType.indexOf("y") >= 0, //Whether to zoom vertically reRender=false;this.resetOverlayedCanvas();if(this.plotInfo.axisPlacement === "xySwapped"){var temp=zoomPY;zoomPY = zoomPX;zoomPX = temp;}if(this.panEnabled || this.zoomEnabled){if(this.panEnabled){var overflow=0;for(var i=0;i < this._axes.length;i++) {var axis=this._axes[i];if(axis.viewportMinimum < axis.minimum){overflow = axis.minimum - axis.viewportMinimum;axis.sessionVariables.newViewportMinimum = axis.viewportMinimum + overflow;axis.sessionVariables.newViewportMaximum = axis.viewportMaximum + overflow;reRender = true;}else if(axis.viewportMaximum > axis.maximum){overflow = axis.viewportMaximum - axis.maximum;axis.sessionVariables.newViewportMinimum = axis.viewportMinimum - overflow;axis.sessionVariables.newViewportMaximum = axis.viewportMaximum - overflow;reRender = true;}}}else if((!zoomPX || Math.abs(dragDeltaPX) > 2) && (!zoomPY || Math.abs(dragDeltaPY) > 2) && this.zoomEnabled){if(!this.dragStartPoint)return;var selectedRegion={x1:zoomPX?this.dragStartPoint.x:this.plotArea.x1,y1:zoomPY?this.dragStartPoint.y:this.plotArea.y1,x2:zoomPX?x:this.plotArea.x2,y2:zoomPY?y:this.plotArea.y2};if(Math.abs(selectedRegion.x1 - selectedRegion.x2) > 2 && Math.abs(selectedRegion.y1 - selectedRegion.y2) > 2){if(this._zoomPanToSelectedRegion(selectedRegion.x1,selectedRegion.y1,selectedRegion.x2,selectedRegion.y2)){reRender = true;}}}if(reRender){this._ignoreNextEvent = true; //Required so that click event doesn't fire after zooming into a section of the chart. this._dispatchRangeEvent("rangeChanging","zoom");this.render();this._dispatchRangeEvent("rangeChanged","zoom");if(reRender && this.zoomEnabled && this._zoomButton.style.display === "none"){(0,_utils.show)(this._zoomButton,this._resetButton);setButtonState(this,this._zoomButton,"pan");setButtonState(this,this._resetButton,"reset");}}}}}this.isDrag = false;};Chart.prototype._plotAreaMouseMove = function(x,y){if(this.isDrag && this.plotInfo.axisPlacement !== "none"){var dragDeltaPX=0,dragDeltaPY=0,alpha=null,selectedRegion=null,zoomPX=this.zoomType.indexOf("x") >= 0, //Whether to zoom horizontally zoomPY=this.zoomType.indexOf("y") >= 0, //Whether to zoom vertically _this=this;if(this.plotInfo.axisPlacement === "xySwapped"){var temp=zoomPY;zoomPY = zoomPX;zoomPX = temp;}dragDeltaPX = this.dragStartPoint.x - x;dragDeltaPY = this.dragStartPoint.y - y;if(Math.abs(dragDeltaPX) > 2 && Math.abs(dragDeltaPX) < 8 && (this.panEnabled || this.zoomEnabled)){this._toolTip.hide();}else if(!this.panEnabled && !this.zoomEnabled){this._toolTip.mouseMoveHandler(x,y);}if((!zoomPX || Math.abs(dragDeltaPX) > 2 || !zoomPY || Math.abs(dragDeltaPY) > 2) && (this.panEnabled || this.zoomEnabled)){if(this.panEnabled){selectedRegion = {x1:zoomPX?this.plotArea.x1 + dragDeltaPX:this.plotArea.x1,y1:zoomPY?this.plotArea.y1 + dragDeltaPY:this.plotArea.y1,x2:zoomPX?this.plotArea.x2 + dragDeltaPX:this.plotArea.x2,y2:zoomPY?this.plotArea.y2 + dragDeltaPY:this.plotArea.y2};if(this._zoomPanToSelectedRegion(selectedRegion.x1,selectedRegion.y1,selectedRegion.x2,selectedRegion.y2,true)){this._dispatchRangeEvent("rangeChanging","pan");this.render();this._dispatchRangeEvent("rangeChanged","pan");this.dragStartPoint.x = x;this.dragStartPoint.y = y; //clearTimeout(this._panTimerId); //this._panTimerId = setTimeout(function () { // _this._dispatchRangeEvent("rangeChanging", "pan"); // _this.render(); // _this._dispatchRangeEvent("rangeChanged", "pan"); //}, 0); }}else if(this.zoomEnabled){this.resetOverlayedCanvas();alpha = this.overlaidCanvasCtx.globalAlpha;this.overlaidCanvasCtx.globalAlpha = .7;this.overlaidCanvasCtx.fillStyle = "#A0ABB8";var rect={x1:zoomPX?this.dragStartPoint.x:this.plotArea.x1,y1:zoomPY?this.dragStartPoint.y:this.plotArea.y1,x2:zoomPX?x - this.dragStartPoint.x:this.plotArea.x2 - this.plotArea.x1,y2:zoomPY?y - this.dragStartPoint.y:this.plotArea.y2 - this.plotArea.y1};this.overlaidCanvasCtx.fillRect(rect.x1,rect.y1,rect.x2,rect.y2);this.overlaidCanvasCtx.globalAlpha = alpha;}}}else this._toolTip.mouseMoveHandler(x,y);}; //#endregion Events //Sets the viewport range of Axis based on the given rect bounds (pixels). Also limits the zooming/panning based on axis bounds. Returns a boolean to indicate whether it was succesful or not based on the selected region. Chart.prototype._zoomPanToSelectedRegion = function(px1,py1,px2,py2,keepAxisIndependent){keepAxisIndependent = keepAxisIndependent || false;var zoomPX=this.zoomType.indexOf("x") >= 0, //Whether to zoom horizontally zoomPY=this.zoomType.indexOf("y") >= 0, //Whether to zoom vertically validRegion=false;var axes=[],axesWithValidRange=[];if(this.axisX && zoomPX)axes.push(this.axisX);if(this.axisY && zoomPY)axes.push(this.axisY);if(this.axisY2 && zoomPY)axes.push(this.axisY2);var params=[];for(var i=0;i < axes.length;i++) {var axis=axes[i]; //var range = Math.abs(axis.viewportMaximum - axis.viewportMinimum); var val1=axis.convertPixelToValue({x:px1,y:py1});var val2=axis.convertPixelToValue({x:px2,y:py2});if(val1 > val2){var temp=val2;val2 = val1;val1 = temp;}if(isFinite(axis.dataInfo.minDiff)){if(!(Math.abs(val2 - val1) < 3 * Math.abs(axis.dataInfo.minDiff) || val1 < axis.minimum || val2 > axis.maximum)){axesWithValidRange.push(axis);params.push({val1:val1,val2:val2});validRegion = true;}else if(!keepAxisIndependent){validRegion = false;break;}}}if(validRegion){for(var i=0;i < axesWithValidRange.length;i++) {var axis=axesWithValidRange[i];var param=params[i];axis.setViewPortRange(param.val1,param.val2);}}return validRegion;};Chart.prototype.preparePlotArea = function(){var plotArea=this.plotArea;var yAxis=this.axisY?this.axisY:this.axisY2;if(!_utils.isCanvasSupported && (plotArea.x1 > 0 || plotArea.y1 > 0)){plotArea.ctx.translate(plotArea.x1,plotArea.y1);}if(this.axisX && yAxis){plotArea.x1 = this.axisX.lineCoordinates.x1 < this.axisX.lineCoordinates.x2?this.axisX.lineCoordinates.x1:yAxis.lineCoordinates.x1;plotArea.y1 = this.axisX.lineCoordinates.y1 < yAxis.lineCoordinates.y1?this.axisX.lineCoordinates.y1:yAxis.lineCoordinates.y1;plotArea.x2 = this.axisX.lineCoordinates.x2 > yAxis.lineCoordinates.x2?this.axisX.lineCoordinates.x2:yAxis.lineCoordinates.x2;plotArea.y2 = this.axisX.lineCoordinates.y2 > this.axisX.lineCoordinates.y1?this.axisX.lineCoordinates.y2:yAxis.lineCoordinates.y2;plotArea.width = plotArea.x2 - plotArea.x1;plotArea.height = plotArea.y2 - plotArea.y1; //plotArea = { x1: x1, y1: y1, x2: x2, y2: y2, width: x2 - x1, height: y2 - y1 }; }else { //ToDo: @sunil var freeSpace=this.layoutManager.getFreeSpace();plotArea.x1 = freeSpace.x1;plotArea.x2 = freeSpace.x2;plotArea.y1 = freeSpace.y1;plotArea.y2 = freeSpace.y2;plotArea.width = freeSpace.width;plotArea.height = freeSpace.height;}if(!_utils.isCanvasSupported){plotArea.canvas.width = plotArea.width;plotArea.canvas.height = plotArea.height;plotArea.canvas.style.left = plotArea.x1 + "px";plotArea.canvas.style.top = plotArea.y1 + "px";if(plotArea.x1 > 0 || plotArea.y1 > 0){plotArea.ctx.translate(-plotArea.x1,-plotArea.y1);}}plotArea.layoutManager = new _layout_manager2.default(plotArea.x1,plotArea.y1,plotArea.x2,plotArea.y2,2);};Chart.prototype.getPixelCoordinatesOnPlotArea = function(x,y){return {x:this.axisX.getPixelCoordinatesOnAxis(x).x,y:this.axisY.getPixelCoordinatesOnAxis(y).y}; //return { x: 5, y: 10 }; }; //#region Render Methods Chart.prototype.renderIndexLabels = function(targetCtx){var ctx=targetCtx || this.plotArea.ctx;var plotArea=this.plotArea;var mid=0;var yMinLimit=0;var yMaxLimit=0;var xMinLimit=0;var xMaxLimit=0;var marginX=0,marginY=0; // Margin between label and dataPoint / PlotArea var offSetX=0,offSetY=0; // Distance to offSet textBlock (top) from dataPoint inorder to position it var visibleWidth=0;var visibleHeight=0;for(var i=0;i < this._indexLabels.length;i++) {var indexLabel=this._indexLabels[i];var chartTypeLower=indexLabel.chartType.toLowerCase();var x,y,angle;var fontColor=(0,_utils.getProperty)("indexLabelFontColor",indexLabel.dataPoint,indexLabel.dataSeries);var fontSize=(0,_utils.getProperty)("indexLabelFontSize",indexLabel.dataPoint,indexLabel.dataSeries);var fontFamily=(0,_utils.getProperty)("indexLabelFontFamily",indexLabel.dataPoint,indexLabel.dataSeries);var fontStyle=(0,_utils.getProperty)("indexLabelFontStyle",indexLabel.dataPoint,indexLabel.dataSeries);var fontWeight=(0,_utils.getProperty)("indexLabelFontWeight",indexLabel.dataPoint,indexLabel.dataSeries);var backgroundColor=(0,_utils.getProperty)("indexLabelBackgroundColor",indexLabel.dataPoint,indexLabel.dataSeries);var maxWidth=(0,_utils.getProperty)("indexLabelMaxWidth",indexLabel.dataPoint,indexLabel.dataSeries);var indexLabelWrap=(0,_utils.getProperty)("indexLabelWrap",indexLabel.dataPoint,indexLabel.dataSeries);var percentAndTotal={percent:null,total:null};var formatterParameter=null;if(indexLabel.dataSeries.type.indexOf("stacked") >= 0 || indexLabel.dataSeries.type === "pie" || indexLabel.dataSeries.type === "doughnut")percentAndTotal = this.getPercentAndTotal(indexLabel.dataSeries,indexLabel.dataPoint);if(indexLabel.dataSeries.indexLabelFormatter || indexLabel.dataPoint.indexLabelFormatter)formatterParameter = {chart:this._options,dataSeries:indexLabel.dataSeries,dataPoint:indexLabel.dataPoint,index:indexLabel.indexKeyword,total:percentAndTotal.total,percent:percentAndTotal.percent};var indexLabelText=indexLabel.dataPoint.indexLabelFormatter?indexLabel.dataPoint.indexLabelFormatter(formatterParameter):indexLabel.dataPoint.indexLabel?this.replaceKeywordsWithValue(indexLabel.dataPoint.indexLabel,indexLabel.dataPoint,indexLabel.dataSeries,null,indexLabel.indexKeyword):indexLabel.dataSeries.indexLabelFormatter?indexLabel.dataSeries.indexLabelFormatter(formatterParameter):indexLabel.dataSeries.indexLabel?this.replaceKeywordsWithValue(indexLabel.dataSeries.indexLabel,indexLabel.dataPoint,indexLabel.dataSeries,null,indexLabel.indexKeyword):null;if(indexLabelText === null || indexLabelText === "")continue;var placement=(0,_utils.getProperty)("indexLabelPlacement",indexLabel.dataPoint,indexLabel.dataSeries);var orientation=(0,_utils.getProperty)("indexLabelOrientation",indexLabel.dataPoint,indexLabel.dataSeries);var angle=0;var direction=indexLabel.direction; // +1 for above the point and -1 for below the point var axisX=indexLabel.dataSeries.axisX;var axisY=indexLabel.dataSeries.axisY;var textBlock=new _text_block2.default(ctx,{x:0,y:0,maxWidth:maxWidth?maxWidth:this.width * .5,maxHeight:indexLabelWrap?fontSize * 5:fontSize * 1.5,angle:orientation === "horizontal"?0:-90,text:indexLabelText,padding:0,backgroundColor:backgroundColor,horizontalAlign:"left", //left, center, right fontSize:fontSize, //in pixels fontFamily:fontFamily,fontWeight:fontWeight, //normal, bold, bolder, lighter, fontColor:fontColor,fontStyle:fontStyle, // normal, italic, oblique textBaseline:"top"});var textSize=textBlock.measureText(); //if (indexLabel.dataPoint.x < axisX.viewportMinimum || indexLabel.dataPoint.x > axisX.viewportMaximum || indexLabel.dataPoint.y < axisY.viewportMinimum || indexLabel.dataPoint.y > axisY.viewportMaximum) // continue; if(chartTypeLower.indexOf("line") >= 0 || chartTypeLower.indexOf("area") >= 0 || chartTypeLower.indexOf("bubble") >= 0 || chartTypeLower.indexOf("scatter") >= 0){if(indexLabel.dataPoint.x < axisX.viewportMinimum || indexLabel.dataPoint.x > axisX.viewportMaximum || indexLabel.dataPoint.y < axisY.viewportMinimum || indexLabel.dataPoint.y > axisY.viewportMaximum)continue;}else {if(indexLabel.dataPoint.x < axisX.viewportMinimum || indexLabel.dataPoint.x > axisX.viewportMaximum)continue;}marginY = 2;marginX = 2;if(orientation === "horizontal"){visibleWidth = textBlock.width;visibleHeight = textBlock.height;}else {visibleHeight = textBlock.width;visibleWidth = textBlock.height;}if(this.plotInfo.axisPlacement === "normal"){if(chartTypeLower.indexOf("line") >= 0 || chartTypeLower.indexOf("area") >= 0){placement = "auto";marginY = 4;}else if(chartTypeLower.indexOf("stacked") >= 0){if(placement === "auto")placement = "inside";}else if(chartTypeLower === "bubble" || chartTypeLower === "scatter"){placement = "inside";}x = indexLabel.point.x - visibleWidth / 2;if(placement !== "inside"){ //outside or auto yMinLimit = plotArea.y1;yMaxLimit = plotArea.y2;if(direction > 0){y = indexLabel.point.y - visibleHeight - marginY;if(y < yMinLimit){if(placement === "auto"){y = Math.max(indexLabel.point.y,yMinLimit) + marginY;}else {y = yMinLimit + marginY;}}}else {y = indexLabel.point.y + marginY;if(y > yMaxLimit - visibleHeight - marginY){if(placement === "auto"){y = Math.min(indexLabel.point.y,yMaxLimit) - visibleHeight - marginY;}else {y = yMaxLimit - visibleHeight - marginY;}}}}else {yMinLimit = Math.max(indexLabel.bounds.y1,plotArea.y1);yMaxLimit = Math.min(indexLabel.bounds.y2,plotArea.y2);if(chartTypeLower.indexOf("range") >= 0){if(direction > 0)mid = Math.max(indexLabel.bounds.y1,plotArea.y1) + visibleHeight / 2 + marginY;else mid = Math.min(indexLabel.bounds.y2,plotArea.y2) - visibleHeight / 2 - marginY;}else mid = (Math.max(indexLabel.bounds.y1,plotArea.y1) + Math.min(indexLabel.bounds.y2,plotArea.y2)) / 2;if(direction > 0){y = Math.max(indexLabel.point.y,mid) - visibleHeight / 2;if(y < yMinLimit && (chartTypeLower === "bubble" || chartTypeLower === "scatter")){y = Math.max(indexLabel.point.y - visibleHeight - marginY,plotArea.y1 + marginY);}}else {y = Math.min(indexLabel.point.y,mid) - visibleHeight / 2;if(y > yMaxLimit - visibleHeight - marginY && (chartTypeLower === "bubble" || chartTypeLower === "scatter")){y = Math.min(indexLabel.point.y + marginY,plotArea.y2 - visibleHeight - marginY);}} // Make Sure that it does not overlap the axis line y = Math.min(y,yMaxLimit - visibleHeight);}}else {if(chartTypeLower.indexOf("line") >= 0 || chartTypeLower.indexOf("area") >= 0 || chartTypeLower.indexOf("scatter") >= 0){placement = "auto";marginX = 4;}else if(chartTypeLower.indexOf("stacked") >= 0){if(placement === "auto")placement = "inside";}else if(chartTypeLower === "bubble"){placement = "inside";}y = indexLabel.point.y - visibleHeight / 2;if(placement !== "inside"){ //outside or auto xMinLimit = plotArea.x1;xMaxLimit = plotArea.x2;if(direction < 0){x = indexLabel.point.x - visibleWidth - marginX;if(x < xMinLimit){if(placement === "auto"){x = Math.max(indexLabel.point.x,xMinLimit) + marginX;}else {x = xMinLimit + marginX;}}}else {x = indexLabel.point.x + marginX;if(x > xMaxLimit - visibleWidth - marginX){if(placement === "auto"){x = Math.min(indexLabel.point.x,xMaxLimit) - visibleWidth - marginX;}else {x = xMaxLimit - visibleWidth - marginX;}}}}else {xMinLimit = Math.max(indexLabel.bounds.x1,plotArea.x1);xMaxLimit = Math.min(indexLabel.bounds.x2,plotArea.x2);if(chartTypeLower.indexOf("range") >= 0){if(direction < 0)mid = Math.max(indexLabel.bounds.x1,plotArea.x1) + visibleWidth / 2 + marginX;else mid = Math.min(indexLabel.bounds.x2,plotArea.x2) - visibleWidth / 2 - marginX;}else var mid=(Math.max(indexLabel.bounds.x1,plotArea.x1) + Math.min(indexLabel.bounds.x2,plotArea.x2)) / 2;if(direction < 0){x = Math.max(indexLabel.point.x,mid) - visibleWidth / 2; //if (y < xMinLimit) { // y = Math.max(indexLabel.point.y - visibleHeight - marginY, plotArea.y1 + marginY); //} }else {x = Math.min(indexLabel.point.x,mid) - visibleWidth / 2; //if (y > xMaxLimit - visibleHeight - marginY) { // y = Math.min(indexLabel.point.y + marginY, plotArea.y2 - visibleHeight - marginY); //} } // Make Sure that it does not overlap the axis line x = Math.max(x,xMinLimit);}}if(orientation === "vertical"){y += visibleHeight;}textBlock.x = x;textBlock.y = y; //console.log(textBlock.text + ": " + textBlock.x + "; " + textBlock.y); textBlock.render(true);} //source and dest would be same when animation is not enabled var animationInfo={source:ctx,dest:this.plotArea.ctx,animationCallback:_animator4.default.fadeInAnimation,easingFunction:_animator4.default.easing.easeInQuad,animationBase:0,startTimePercent:.7};return animationInfo;};Chart.prototype.renderLine = function(plotUnit){var ctx=plotUnit.targetCanvasCtx || this.plotArea.ctx;var totalDataSeries=plotUnit.dataSeriesIndexes.length;if(totalDataSeries <= 0)return;var ghostCtx=this._eventManager.ghostCtx; //var ghostCtx = this.overlaidCanvasCtx; ctx.save();var plotArea=this.plotArea;ctx.beginPath();ctx.rect(plotArea.x1,plotArea.y1,plotArea.width,plotArea.height);ctx.clip();var markers=[];for(var j=0;j < plotUnit.dataSeriesIndexes.length;j++) {var dataSeriesIndex=plotUnit.dataSeriesIndexes[j];var dataSeries=this.data[dataSeriesIndex];ctx.lineWidth = dataSeries.lineThickness;var dataPoints=dataSeries.dataPoints;if(ctx.setLineDash){ctx.setLineDash((0,_utils.getLineDashArray)(dataSeries.lineDashType,dataSeries.lineThickness));}var seriesId=dataSeries.id;this._eventManager.objectMap[seriesId] = {objectType:"dataSeries",dataSeriesIndex:dataSeriesIndex};var hexColor=(0,_utils.intToHexColorString)(seriesId);ghostCtx.strokeStyle = hexColor; //ghostCtx.lineWidth = dataSeries.lineThickness; ghostCtx.lineWidth = dataSeries.lineThickness > 0?Math.max(dataSeries.lineThickness,4):0;var colorSet=dataSeries._colorSet;var color=colorSet[0];ctx.strokeStyle = color;var isFirstDataPointInPlotArea=true;var i=0,x,y;var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth. //if (!dataSeries._options.markerSize && dataSeries.dataPoints.length < 1000) // dataSeries.markerSize = 8; ctx.beginPath();if(dataPoints.length > 0){ //var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y); //dataSeries.noDataPointsInPlotArea = 0 var prevDataNull=false;for(i = 0;i < dataPoints.length;i++) {dataPointX = dataPoints[i].x.getTime?dataPoints[i].x.getTime():dataPoints[i].x;if(dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax)continue; //if (!isFinite(dataPoints[i].y)) // continue; if(typeof dataPoints[i].y !== "number"){if(i > 0){ // if first dataPoint is null then no need to call stroke method ctx.stroke();if(_utils.isCanvasSupported){ghostCtx.stroke();}}prevDataNull = true;continue;}x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;var id=dataSeries.dataPointIds[i];this._eventManager.objectMap[id] = {id:id,objectType:"dataPoint",dataSeriesIndex:dataSeriesIndex,dataPointIndex:i,x1:x,y1:y}; //dataSeries.noDataPointsInPlotArea++; if(isFirstDataPointInPlotArea || prevDataNull){ctx.beginPath();ctx.moveTo(x,y);if(_utils.isCanvasSupported){ghostCtx.beginPath();ghostCtx.moveTo(x,y);}isFirstDataPointInPlotArea = false;prevDataNull = false;}else {ctx.lineTo(x,y);if(_utils.isCanvasSupported)ghostCtx.lineTo(x,y);if(i % 500 == 0){ctx.stroke();ctx.beginPath();ctx.moveTo(x,y);if(_utils.isCanvasSupported){ghostCtx.stroke();ghostCtx.beginPath();ghostCtx.moveTo(x,y);}}} //Render Marker if(dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0){var markerProps=dataSeries.getMarkerProperties(i,x,y,ctx);markers.push(markerProps); //if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) { // dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //} var markerColor=(0,_utils.intToHexColorString)(id); //window.console.log("index: " + i + "; id: " + id + "; hex: " + markerColor); if(_utils.isCanvasSupported){markers.push({x:x,y:y,ctx:ghostCtx,type:markerProps.type,size:markerProps.size,color:markerColor,borderColor:markerColor,borderThickness:markerProps.borderThickness});}}if(dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter){this._indexLabels.push({chartType:"line",dataPoint:dataPoints[i],dataSeries:dataSeries,point:{x:x,y:y},direction:dataPoints[i].y >= 0?1:-1,color:color});}}ctx.stroke();if(_utils.isCanvasSupported)ghostCtx.stroke();}}_render2.default.drawMarkers(markers);ctx.restore();ctx.beginPath();if(_utils.isCanvasSupported)ghostCtx.beginPath(); //source and dest would be same when animation is not enabled var animationInfo={source:ctx,dest:this.plotArea.ctx,animationCallback:_animator4.default.xClipAnimation,easingFunction:_animator4.default.easing.linear,animationBase:0};return animationInfo;};Chart.prototype.renderStepLine = function(plotUnit){var ctx=plotUnit.targetCanvasCtx || this.plotArea.ctx;var totalDataSeries=plotUnit.dataSeriesIndexes.length;if(totalDataSeries <= 0)return;var ghostCtx=this._eventManager.ghostCtx; //var ghostCtx = this.overlaidCanvasCtx; ctx.save();var plotArea=this.plotArea;ctx.beginPath();ctx.rect(plotArea.x1,plotArea.y1,plotArea.width,plotArea.height);ctx.clip();var markers=[];for(var j=0;j < plotUnit.dataSeriesIndexes.length;j++) {var dataSeriesIndex=plotUnit.dataSeriesIndexes[j];var dataSeries=this.data[dataSeriesIndex];ctx.lineWidth = dataSeries.lineThickness;var dataPoints=dataSeries.dataPoints;if(ctx.setLineDash){ctx.setLineDash((0,_utils.getLineDashArray)(dataSeries.lineDashType,dataSeries.lineThickness));}var seriesId=dataSeries.id;this._eventManager.objectMap[seriesId] = {objectType:"dataSeries",dataSeriesIndex:dataSeriesIndex};var hexColor=(0,_utils.intToHexColorString)(seriesId);ghostCtx.strokeStyle = hexColor; //ghostCtx.lineWidth = dataSeries.lineThickness; ghostCtx.lineWidth = dataSeries.lineThickness > 0?Math.max(dataSeries.lineThickness,4):0;var colorSet=dataSeries._colorSet;var color=colorSet[0];ctx.strokeStyle = color;var isFirstDataPointInPlotArea=true;var i=0,x,y;var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth. //if (!dataSeries._options.markerSize && dataSeries.dataPoints.length < 1000) // dataSeries.markerSize = 8; ctx.beginPath();if(dataPoints.length > 0){ //var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y); //dataSeries.noDataPointsInPlotArea = 0 var prevDataNull=false;for(i = 0;i < dataPoints.length;i++) {dataPointX = dataPoints[i].getTime?dataPoints[i].x.getTime():dataPoints[i].x;if(dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax)continue; //if (!isFinite(dataPoints[i].y)) // continue; if(typeof dataPoints[i].y !== "number"){if(i > 0){ // if first dataPoint is null then no need to call stroke method ctx.stroke();if(_utils.isCanvasSupported){ghostCtx.stroke();}}prevDataNull = true;continue;}var prevY=y;x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;var id=dataSeries.dataPointIds[i];this._eventManager.objectMap[id] = {id:id,objectType:"dataPoint",dataSeriesIndex:dataSeriesIndex,dataPointIndex:i,x1:x,y1:y}; //dataSeries.noDataPointsInPlotArea++; if(isFirstDataPointInPlotArea || prevDataNull){ctx.beginPath();ctx.moveTo(x,y);if(_utils.isCanvasSupported){ghostCtx.beginPath();ghostCtx.moveTo(x,y);}isFirstDataPointInPlotArea = false;prevDataNull = false;}else {ctx.lineTo(x,prevY);if(_utils.isCanvasSupported)ghostCtx.lineTo(x,prevY);ctx.lineTo(x,y);if(_utils.isCanvasSupported)ghostCtx.lineTo(x,y);if(i % 500 == 0){ctx.stroke();ctx.beginPath();ctx.moveTo(x,y);if(_utils.isCanvasSupported){ghostCtx.stroke();ghostCtx.beginPath();ghostCtx.moveTo(x,y);}}} //Render Marker if(dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0){var markerProps=dataSeries.getMarkerProperties(i,x,y,ctx);markers.push(markerProps); //if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) { // dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit); //} var markerColor=(0,_utils.intToHexColorString)(id); //window.console.log("index: " + i + "; id: " + id + "; hex: " + markerColor); if(_utils.isCanvasSupported){markers.push({x:x,y:y,ctx:ghostCtx,type:markerProps.type,size:markerProps.size,color:markerColor,borderColor:markerColor,borderThickness:markerProps.borderThickness});}}if(dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter){this._indexLabels.push({chartType:"stepLine",dataPoint:dataPoints[i],dataSeries:dataSeries,point:{x:x,y:y},direction:dataPoints[i].y >= 0?1:-1,color:color});}}ctx.stroke();if(_utils.isCanvasSupported)ghostCtx.stroke();}}_render2.default.drawMarkers(markers);ctx.restore();ctx.beginPath();if(_utils.isCanvasSupported)ghostCtx.beginPath(); //source and dest would be same when animation is not enabled var animationInfo={source:ctx,dest:this.plotArea.ctx,animationCallback:_animator4.default.xClipAnimation,easingFunction:_animator4.default.easing.linear,animationBase:0};return animationInfo;};Chart.prototype.animationRequestId = null;Chart.prototype.requestAnimFrame = (function(){return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback){window.setTimeout(callback,1000 / 60);};})();Chart.prototype.cancelRequestAnimFrame = (function(){return window.cancelAnimationFrame || window.webkitCancelRequestAnimationFrame || window.mozCancelRequestAnimationFrame || window.oCancelRequestAnimationFrame || window.msCancelRequestAnimationFrame || clearTimeout;})();Chart.prototype.getPercentAndTotal = function(ds,dp){var dpX=null;var total=null;var percent=null;if(ds.type.indexOf("stacked") >= 0){total = 0;dpX = dp.x.getTime?dp.x.getTime():dp.x;if(dpX in ds.plotUnit.yTotals){total = ds.plotUnit.yTotals[dpX];if(!isNaN(dp.y)){if(total === 0)percent = 0;else percent = dp.y / total * 100;}else percent = 0;}}else if(ds.type === "pie" || ds.type === "doughnut"){total = 0;for(var i=0;i < ds.dataPoints.length;i++) {if(!isNaN(ds.dataPoints[i].y))total += ds.dataPoints[i].y;}if(!isNaN(dp.y))percent = dp.y / total * 100;else percent = 0;}return {percent:percent,total:total};};Chart.prototype.replaceKeywordsWithValue = function(str,dp,ds,dpIndex,indexKeywordValue){ //var regex = /\{\s*[a-zA-Z]+\s*\}|"[^"]*"|'[^']*'/g; var regex=/\{.*?\}|"[^"]*"|'[^']*'/g;var chart=this;indexKeywordValue = typeof indexKeywordValue === "undefined"?0:indexKeywordValue;if((ds.type.indexOf("stacked") >= 0 || ds.type === "pie" || ds.type === "doughnut") && (str.indexOf("#percent") >= 0 || str.indexOf("#total") >= 0)){var percent="#percent";var total="#total";var dpX=null;var percentAndTotal=this.getPercentAndTotal(ds,dp);total = isNaN(percentAndTotal.total)?total:percentAndTotal.total;percent = isNaN(percentAndTotal.percent)?percent:percentAndTotal.percent;do {var percentFormatString="";if(ds.percentFormatString)percentFormatString = ds.percentFormatString;else {percentFormatString = "#,##0.";var numberOfDecimals=Math.max(Math.ceil(Math.log(1 / Math.abs(percent)) / Math.LN10),2);if(isNaN(numberOfDecimals) || !isFinite(numberOfDecimals))numberOfDecimals = 2;for(var n=0;n < numberOfDecimals;n++) {percentFormatString += "#";}}str = str.replace("#percent",(0,_utils.numberFormat)(percent,percentFormatString,chart._cultureInfo));str = str.replace("#total",(0,_utils.numberFormat)(total,ds.yValueFormatString?ds.yValueFormatString:"#,##0.########"));}while(str.indexOf("#percent") >= 0 || str.indexOf("#total") >= 0);}var fcn=function fcn($0){if($0[0] === "\"" && $0[$0.length - 1] === "\"" || $0[0] === "\'" && $0[$0.length - 1] === "\'")return $0.slice(1,$0.length - 1);var key=(0,_utils.trimString)($0.slice(1,$0.length - 1));key = key.replace("#index",indexKeywordValue);var index=null;try{var match=key.match(/(.*?)\s*\[\s*(.*?)\s*\]/);if(match && match.length > 0){index = (0,_utils.trimString)(match[2]);key = (0,_utils.trimString)(match[1]);}}catch(e) {};var obj=null;if(key === "color"){return dp.color?dp.color:ds.color?ds.color:ds._colorSet[dpIndex % ds._colorSet.length];}if(dp.hasOwnProperty(key))obj = dp;else if(ds.hasOwnProperty(key))obj = ds;else return "";var value=obj[key];if(index !== null)value = value[index];if(key === "x"){if(chart.axisX && chart.plotInfo.axisXValueType === "dateTime")return dateFormat(value,dp.xValueFormatString?dp.xValueFormatString:ds.xValueFormatString?ds.xValueFormatString:chart.axisX && chart.axisX.valueFormatString?chart.axisX.valueFormatString:"DD MMM YY",chart._cultureInfo);else return (0,_utils.numberFormat)(value,dp.xValueFormatString?dp.xValueFormatString:ds.xValueFormatString?ds.xValueFormatString:"#,##0.########",chart._cultureInfo);}else if(key === "y")return (0,_utils.numberFormat)(value,dp.yValueFormatString?dp.yValueFormatString:ds.yValueFormatString?ds.yValueFormatString:"#,##0.########",chart._cultureInfo);else if(key === "z")return (0,_utils.numberFormat)(value,dp.zValueFormatString?dp.zValueFormatString:ds.zValueFormatString?ds.zValueFormatString:"#,##0.########",chart._cultureInfo);else return value;};return str.replace(regex,fcn);};Chart.prototype.renderSpline = _index.SplineChart;Chart.prototype.renderColumn = _index.ColumnChart;Chart.prototype.renderStackedColumn = _index.StackedColumnChart;Chart.prototype.renderStackedColumn100 = _index.StackedColumn100Chart;Chart.prototype.renderBar = _index.BarChart;Chart.prototype.renderStackedBar = _index.StackedBarChart;Chart.prototype.renderStackedBar100 = _index.StackedBar100Chart;Chart.prototype.renderArea = _index.AreaChart;Chart.prototype.renderSplineArea = _index.SplineAreaChart;Chart.prototype.renderStepArea = _index.StepAreaChart;Chart.prototype.renderStackedArea = _index.StackedAreaChart;Chart.prototype.renderStackedArea100 = _index.StackedArea100Chart;Chart.prototype.renderBubble = _index.BubbleChart;Chart.prototype.renderScatter = _index.ScatterChart;Chart.prototype.renderCandlestick = _index.CandlestickChart;Chart.prototype.renderRangeColumn = _index.RangeColumnChart;Chart.prototype.renderRangeBar = _index.RangeBarChart;Chart.prototype.renderRangeArea = _index.RangeAreaChart;Chart.prototype.renderRangeSplineArea = _index.RangeSplineAreaChart;Chart.prototype.renderPie = _index.PieChart;exports.default = Chart; },{"../charts/index":6,"../constants/options":23,"../constants/themes":24,"../core/axis":26,"../core/culture_info":29,"../core/legend":33,"../core/title":35,"../helpers/animator":37,"../helpers/render":38,"../helpers/utils":39,"./animator":25,"./canvasjs":27,"./data_series":30,"./event_manager":31,"./layout_manager":32,"./text_block":34,"./tooltip":36}],29:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _canvasjs = require('./canvasjs'); var _canvasjs2 = _interopRequireDefault(_canvasjs); var _utils = require('../helpers/utils'); var _culture = require('../constants/culture'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function CultureInfo(culture) { var cultureInfo; if (culture && _culture.cultures[culture]) cultureInfo = _culture.cultures[culture]; CultureInfo.base.constructor.call(this, "CultureInfo", cultureInfo); } (0, _utils.extend)(CultureInfo, _canvasjs2.default); exports.default = CultureInfo; },{"../constants/culture":22,"../helpers/utils":39,"./canvasjs":27}],30:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _canvasjs = require('./canvasjs'); var _canvasjs2 = _interopRequireDefault(_canvasjs); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function DataSeries(chart, options, theme, index, id) { DataSeries.base.constructor.call(this, "DataSeries", options, theme); this.chart = chart; this.canvas = chart.canvas; this._ctx = chart.canvas.ctx; this.index = index; this.noDataPointsInPlotArea = 0; //this.maxWidthInX = 0; this.id = id; this.chart._eventManager.objectMap[id] = { id: id, objectType: "dataSeries", dataSeriesIndex: index }; this.dataPointIds = []; this.plotUnit = []; this.axisX = null; this.axisY = null; if (this.fillOpacity === null) { if (this.type.match(/area/i)) this.fillOpacity = .7;else this.fillOpacity = 1; } this.axisPlacement = this.getDefaultAxisPlacement(); if (typeof this._options.indexLabelFontSize === "undefined") { this.indexLabelFontSize = this.chart.getAutoFontSize(this.indexLabelFontSize); } } (0, _utils.extend)(DataSeries, _canvasjs2.default); //Static Method that returns the axisPlacement for a given ChartType. Returns one of "normal", "xySwapped", "none" DataSeries.prototype.getDefaultAxisPlacement = function () { //if (!this.visible) // return "none"; //type = this.type.toLowerCase(); var type = this.type; if (type === "column" || type === "line" || type === "stepLine" || type === "spline" || type === "area" || type === "stepArea" || type === "splineArea" || type === "stackedColumn" || type === "stackedLine" || type === "bubble" || type === "scatter" || type === "stackedArea" || type === "stackedColumn100" || type === "stackedLine100" || type === "stackedArea100" || type === "candlestick" || type === "ohlc" || type === "rangeColumn" || type === "rangeArea" || type === "rangeSplineArea") { return "normal"; } else if (type === "bar" || type === "stackedBar" || type === "stackedBar100" || type === "rangeBar") { return "xySwapped"; } else if (type === "pie" || type === "doughnut" || type === "funnel") { return "none"; } else { window.console.log("Unknown Chart Type: " + type); return null; } }; DataSeries.getDefaultLegendMarker = function (type) { //type = type.toLowerCase(); if (type === "column" || type === "stackedColumn" || type === "stackedLine" || type === "bar" || type === "stackedBar" || type === "stackedBar100" || type === "bubble" || type === "scatter" || type === "stackedColumn100" || type === "stackedLine100" || type === "stepArea" || type === "candlestick" || type === "ohlc" || type === "rangeColumn" || type === "rangeBar" || type === "rangeArea" || type === "rangeSplineArea") { return "square"; } else if (type === "line" || type === "stepLine" || type === "spline" || type === "pie" || type === "doughnut" || type === "funnel") { return "circle"; } else if (type === "area" || type === "splineArea" || type === "stackedArea" || type === "stackedArea100") { return "triangle"; } else { window.console.log("Unknown Chart Type: " + type); return null; } }; //Finds dataPoint with the given x value. If findClosest is set, finds dataPoint with closest x value. //Returns searchResult object if found, else returns null DataSeries.prototype.getDataPointAtX = function (x, findClosest) { if (!this.dataPoints || this.dataPoints.length === 0) return null; var searchResult = { dataPoint: null, distance: Infinity, index: NaN }; var dataPoint = null; var j = 0; var i = 0; var direction = 1; // +1 for foward and -1 for backward. var minimumXDistance = Infinity; var forwardMissCount = 0, backwardMissCount = 0; var maxMissCount = 1000; var searchStartIndex = 0; if (this.chart.plotInfo.axisPlacement !== "none") { //var xRange = (this.dataPoints[this.dataPoints.length - 1].x - this.dataPoints[0].x); //if (xRange > 0) // searchStartIndex = ((this.dataPoints.length - 1) / xRange * (x - this.dataPoints[0].x)) >> 0; //else // searchStartIndex = 0; var xRange = this.dataPoints[this.dataPoints.length - 1].x - this.dataPoints[0].x; if (xRange > 0) searchStartIndex = Math.min(Math.max((this.dataPoints.length - 1) / xRange * (x - this.dataPoints[0].x) >> 0, 0), this.dataPoints.length);else searchStartIndex = 0; //searchStartIndex = ((this.dataPoints[this.dataPoints.length - 1].x - this.dataPoints[0].x) / this.dataPoints.length * (x - this.dataPoints[0].x)) >> 0; } while (true) { i = direction > 0 ? searchStartIndex + j : searchStartIndex - j; if (i >= 0 && i < this.dataPoints.length) { dataPoint = this.dataPoints[i]; var distance = Math.abs(dataPoint.x - x); if (distance < searchResult.distance) { searchResult.dataPoint = dataPoint; searchResult.distance = distance; searchResult.index = i; } var xDistance = Math.abs(dataPoint.x - x); if (xDistance <= minimumXDistance) minimumXDistance = xDistance;else { if (direction > 0) forwardMissCount++;else backwardMissCount++; } if (forwardMissCount > maxMissCount && backwardMissCount > maxMissCount) break; } else if (searchStartIndex - j < 0 && searchStartIndex + j >= this.dataPoints.length) break; if (direction === -1) { j++; direction = 1; } else direction = -1; } if (!findClosest && searchResult.dataPoint.x === x) return searchResult;else if (findClosest && searchResult.dataPoint !== null) return searchResult;else return null; }; // x & y should be in pixels. Can be used only after rendering the chart. DataSeries.prototype.getDataPointAtXY = function (x, y, getClosest) { if (!this.dataPoints || this.dataPoints.length === 0) return null; getClosest = getClosest || false; var results = []; var j = 0, i = 0; var direction = 1; // +1 for foward and -1 for backward. var foundDataPoint = false; var minimumXDistance = Infinity; var forwardMissCount = 0, backwardMissCount = 0; var maxMissCount = 1000; var searchStartIndex = 0; if (this.chart.plotInfo.axisPlacement !== "none") { var xval = this.chart.axisX.getXValueAt({ x: x, y: y }); var xRange = this.dataPoints[this.dataPoints.length - 1].x - this.dataPoints[0].x; if (xRange > 0) searchStartIndex = Math.min(Math.max((this.dataPoints.length - 1) / xRange * (xval - this.dataPoints[0].x) >> 0, 0), this.dataPoints.length);else searchStartIndex = 0; //var xRange = (this.axisX._absoluteMaximum - this.axisX._absoluteMinimum); //if (xRange > 0) // searchStartIndex = Math.min(Math.max(((this.dataPoints.length - 1) / xRange * (xval - this.axisX._absoluteMinimum)) >> 0, 0), this.dataPoints.length); //else // searchStartIndex = 0; } while (true) { //i = searchStartIndex + (j * direction); i = direction > 0 ? searchStartIndex + j : searchStartIndex - j; if (i >= 0 && i < this.dataPoints.length) { var id = this.dataPointIds[i]; var visualInfo = this.chart._eventManager.objectMap[id]; var dataPoint = this.dataPoints[i]; var distance = null; if (visualInfo) { switch (this.type) { case "column": case "stackedColumn": case "stackedColumn100": case "bar": case "stackedBar": case "stackedBar100": case "rangeColumn": case "rangeBar": if (x >= visualInfo.x1 && x <= visualInfo.x2 && y >= visualInfo.y1 && y <= visualInfo.y2) { results.push({ dataPoint: dataPoint, dataPointIndex: i, dataSeries: this, distance: Math.min(Math.abs(visualInfo.x1 - x), Math.abs(visualInfo.x2 - x), Math.abs(visualInfo.y1 - y), Math.abs(visualInfo.y2 - y)) //distance:0 }); foundDataPoint = true; } break; case "line": case "stepLine": case "spline": case "area": case "stepArea": case "stackedArea": case "stackedArea100": case "splineArea": case "scatter": var markerSize = (0, _utils.getProperty)("markerSize", dataPoint, this) || 4; var snapDistance = getClosest ? 20 : markerSize; distance = Math.sqrt(Math.pow(visualInfo.x1 - x, 2) + Math.pow(visualInfo.y1 - y, 2)); if (distance <= snapDistance) { results.push({ dataPoint: dataPoint, dataPointIndex: i, dataSeries: this, distance: distance }); } var xDistance = Math.abs(visualInfo.x1 - x); if (xDistance <= minimumXDistance) minimumXDistance = xDistance;else { if (direction > 0) forwardMissCount++;else backwardMissCount++; } if (distance <= markerSize / 2) { foundDataPoint = true; } break; case "rangeArea": case "rangeSplineArea": var markerSize = (0, _utils.getProperty)("markerSize", dataPoint, this) || 4; var snapDistance = getClosest ? 20 : markerSize; distance = Math.min(Math.sqrt(Math.pow(visualInfo.x1 - x, 2) + Math.pow(visualInfo.y1 - y, 2)), Math.sqrt(Math.pow(visualInfo.x1 - x, 2) + Math.pow(visualInfo.y2 - y, 2))); if (distance <= snapDistance) { results.push({ dataPoint: dataPoint, dataPointIndex: i, dataSeries: this, distance: distance }); } var xDistance = Math.abs(visualInfo.x1 - x); if (xDistance <= minimumXDistance) minimumXDistance = xDistance;else { if (direction > 0) forwardMissCount++;else backwardMissCount++; } if (distance <= markerSize / 2) { foundDataPoint = true; } break; case "bubble": var markerSize = visualInfo.size; distance = Math.sqrt(Math.pow(visualInfo.x1 - x, 2) + Math.pow(visualInfo.y1 - y, 2)); if (distance <= markerSize / 2) { results.push({ dataPoint: dataPoint, dataPointIndex: i, dataSeries: this, distance: distance }); foundDataPoint = true; } break; case "pie": case "doughnut": var center = visualInfo.center; var innerRadius = this.type === "doughnut" ? visualInfo.percentInnerRadius * visualInfo.radius : 0; distance = Math.sqrt(Math.pow(center.x - x, 2) + Math.pow(center.y - y, 2)); if (distance < visualInfo.radius && distance > innerRadius) { var deltaY = y - center.y; var deltaX = x - center.x; var angle = Math.atan2(deltaY, deltaX); if (angle < 0) angle += Math.PI * 2; angle = Number(((angle / Math.PI * 180 % 360 + 360) % 360).toFixed(12)); //console.log(angle); var startAngle = Number(((visualInfo.startAngle / Math.PI * 180 % 360 + 360) % 360).toFixed(12)); var endAngle = Number(((visualInfo.endAngle / Math.PI * 180 % 360 + 360) % 360).toFixed(12)); //So that data point is detected when there is only one dataPoint if (endAngle === 0 && visualInfo.endAngle > 1) { endAngle = 360; } if (startAngle >= endAngle && dataPoint.y !== 0) { endAngle += 360; if (angle < startAngle) angle += 360; } if (angle > startAngle && angle < endAngle) { results.push({ dataPoint: dataPoint, dataPointIndex: i, dataSeries: this, distance: 0 }); foundDataPoint = true; } } break; case "candlestick": if (x >= visualInfo.x1 - visualInfo.borderThickness / 2 && x <= visualInfo.x2 + visualInfo.borderThickness / 2 && y >= visualInfo.y2 - visualInfo.borderThickness / 2 && y <= visualInfo.y3 + visualInfo.borderThickness / 2 || Math.abs(visualInfo.x2 - x + visualInfo.x1 - x) < visualInfo.borderThickness && y >= visualInfo.y1 && y <= visualInfo.y4) { results.push({ dataPoint: dataPoint, dataPointIndex: i, dataSeries: this, distance: Math.min(Math.abs(visualInfo.x1 - x), Math.abs(visualInfo.x2 - x), Math.abs(visualInfo.y2 - y), Math.abs(visualInfo.y3 - y)) //distance:0 }); foundDataPoint = true; } break; case "ohlc": if (Math.abs(visualInfo.x2 - x + visualInfo.x1 - x) < visualInfo.borderThickness && y >= visualInfo.y2 && y <= visualInfo.y3 || x >= visualInfo.x1 && x <= (visualInfo.x2 + visualInfo.x1) / 2 && y >= visualInfo.y1 - visualInfo.borderThickness / 2 && y <= visualInfo.y1 + visualInfo.borderThickness / 2 || x >= (visualInfo.x1 + visualInfo.x2) / 2 && x <= visualInfo.x2 && y >= visualInfo.y4 - visualInfo.borderThickness / 2 && y <= visualInfo.y4 + visualInfo.borderThickness / 2) { results.push({ dataPoint: dataPoint, dataPointIndex: i, dataSeries: this, distance: Math.min(Math.abs(visualInfo.x1 - x), Math.abs(visualInfo.x2 - x), Math.abs(visualInfo.y2 - y), Math.abs(visualInfo.y3 - y)) //distance:0 }); foundDataPoint = true; } break; } if (foundDataPoint || forwardMissCount > maxMissCount && backwardMissCount > maxMissCount) break; } } else if (searchStartIndex - j < 0 && searchStartIndex + j >= this.dataPoints.length) break; if (direction === -1) { j++; direction = 1; } else direction = -1; } var closestResult = null; for (var m = 0; m < results.length; m++) { if (!closestResult) { closestResult = results[m]; } else if (results[m].distance <= closestResult.distance) { closestResult = results[m]; } } //if (window.console) // window.console.log("forwardMissCount: " + forwardMissCount + "; backwardMissCount: " + backwardMissCount + "; getClosest: " + getClosest); //if (window.console && closestResult) // window.console.log(j + ": distance = " + closestResult.distance); return closestResult; }; DataSeries.prototype.getMarkerProperties = function (index, x, y, ctx) { var dataPoints = this.dataPoints; var dataSeries = this; var markerColor = dataPoints[index].markerColor ? dataPoints[index].markerColor : dataSeries.markerColor ? dataSeries.markerColor : dataPoints[index].color ? dataPoints[index].color : dataSeries.color ? dataSeries.color : dataSeries._colorSet[index % dataSeries._colorSet.length]; var markerBorderColor = dataPoints[index].markerBorderColor ? dataPoints[index].markerBorderColor : dataSeries.markerBorderColor ? dataSeries.markerBorderColor : null; var markerBorderThickness = dataPoints[index].markerBorderThickness ? dataPoints[index].markerBorderThickness : dataSeries.markerBorderThickness ? dataSeries.markerBorderThickness : null; var markerType = dataPoints[index].markerType ? dataPoints[index].markerType : dataSeries.markerType; var markerSize = dataPoints[index].markerSize ? dataPoints[index].markerSize : dataSeries.markerSize; return { x: x, y: y, ctx: ctx, type: markerType, size: markerSize, color: markerColor, borderColor: markerBorderColor, borderThickness: markerBorderThickness }; }; exports.default = DataSeries; },{"../helpers/utils":39,"./canvasjs":27}],31:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _utils = require("../helpers/utils"); function EventManager(chart) { this.chart = chart; this.lastObjectId = 0; var _this = this; this.objectMap = []; this.rectangularRegionEventSubscriptions = []; this.previousDataPointEventObject = null; //this.previousDataSeriesEventObject = null; this.ghostCanvas = (0, _utils.createCanvas)(this.chart.width, this.chart.height); //this.ghostCanvas.width = this.chart.width; //this.ghostCanvas.height = this.chart.height; this.ghostCtx = this.ghostCanvas.getContext("2d"); var eventHandler = function eventHandler(ev) { _this.mouseEventHandler.call(_this, ev); }; this.mouseoveredObjectMaps = []; //this.chart.canvas.addEventListener("mouseover", eventHandler); //this.chart.canvas.addEventListener("mousemove", eventHandler); //this.chart.canvas.addEventListener("mouseout", eventHandler); //this.chart.canvas.addEventListener("click", eventHandler); } EventManager.prototype.reset = function () { this.lastObjectId = 0; this.objectMap = []; this.rectangularRegionEventSubscriptions = []; this.previousDataPointEventObject = null; this.eventObjects = []; //this.ghostCanvas.width = this.chart.width; //this.ghostCanvas.height = this.chart.height; if (_utils.isCanvasSupported) { this.ghostCtx.clearRect(0, 0, this.chart.width, this.chart.height); this.ghostCtx.beginPath(); } }; EventManager.prototype.getNewObjectTrackingId = function () { return ++this.lastObjectId; }; EventManager.prototype.mouseEventHandler = function (ev) { if (ev.type !== "mousemove" && ev.type !== "click") return; var eventObjectMaps = []; var xy = (0, _utils.getMouseCoordinates)(ev); var id = null; //var dataPointInfo = this.chart.getDataPointAtXY(xy.x, xy.y, false); //if (dataPointInfo) { // id = dataPointInfo.dataSeries.dataPointIds[dataPointInfo.dataPointIndex]; //} else if (isCanvasSupported) {//IE9+ // id = getObjectId(xy.x, xy.y, this.ghostCtx); //} id = this.chart.getObjectAtXY(xy.x, xy.y, false); if (id && typeof this.objectMap[id] !== "undefined") { var eventObjectMap = this.objectMap[id]; if (eventObjectMap.objectType === "dataPoint") { var dataSeries = this.chart.data[eventObjectMap.dataSeriesIndex]; var dataPoint = dataSeries.dataPoints[eventObjectMap.dataPointIndex]; var dataPointIndex = eventObjectMap.dataPointIndex; //Event Parameter should not contain reference to dataSeries directly. But to its options. eventObjectMap.eventParameter = { x: xy.x, y: xy.y, dataPoint: dataPoint, dataSeries: dataSeries._options, dataPointIndex: dataPointIndex, dataSeriesIndex: dataSeries.index, chart: this.chart._publicChartReference }; eventObjectMap.eventContext = { context: dataPoint, userContext: dataPoint, mouseover: "mouseover", mousemove: "mousemove", mouseout: "mouseout", click: "click" }; eventObjectMaps.push(eventObjectMap); //Add Dataseries too because mouse event on dataPoint also means there is an event on dataSeries. DataSeries is not present on ghost canvas eventObjectMap = this.objectMap[dataSeries.id]; //Event Parameter should not contain reference to dataSeries directly. But to its options. eventObjectMap.eventParameter = { x: xy.x, y: xy.y, dataPoint: dataPoint, dataSeries: dataSeries._options, dataPointIndex: dataPointIndex, dataSeriesIndex: dataSeries.index, chart: this.chart._publicChartReference }; eventObjectMap.eventContext = { context: dataSeries, userContext: dataSeries._options, mouseover: "mouseover", mousemove: "mousemove", mouseout: "mouseout", click: "click" }; eventObjectMaps.push(this.objectMap[dataSeries.id]); } //else if (eventObjectMap.objectType === "stripLine") { // //Event Parameter should not contain reference to stripLine directly. But to its options. // eventObjectMap.eventParameter = { x: xy.x, y: xy.y, stripLine: eventObjectMap.stripLine._options, axis: eventObjectMap.axis._options, stripLineIndex: eventObjectMap.stripLineIndex }; // eventObjectMap.eventContext = { context: eventObjectMap.stripLine, userContext: eventObjectMap.stripLine._options, mouseover: "mouseover", mousemove: "mousemove", mouseout: "mouseout", click: "click" }; // eventObjectMaps.push(eventObjectMap); //} else if (eventObjectMap.objectType === "legendItem") { var dataSeries = this.chart.data[eventObjectMap.dataSeriesIndex]; var dataPoint = eventObjectMap.dataPointIndex !== null ? dataSeries.dataPoints[eventObjectMap.dataPointIndex] : null; //Event Parameter should not contain reference to DataSeries directly. But to its options. eventObjectMap.eventParameter = { x: xy.x, y: xy.y, dataSeries: dataSeries._options, dataPoint: dataPoint, dataPointIndex: eventObjectMap.dataPointIndex, dataSeriesIndex: eventObjectMap.dataSeriesIndex, chart: this.chart._publicChartReference }; eventObjectMap.eventContext = { context: this.chart.legend, userContext: this.chart.legend._options, mouseover: "itemmouseover", mousemove: "itemmousemove", mouseout: "itemmouseout", click: "itemclick" }; eventObjectMaps.push(eventObjectMap); } } //Fire mouseout if existing mouseovered objects are not present in the objectmap. var mouseOutObjectMapsExcluded = []; for (var i = 0; i < this.mouseoveredObjectMaps.length; i++) { var mouseOut = true; for (var j = 0; j < eventObjectMaps.length; j++) { if (eventObjectMaps[j].id === this.mouseoveredObjectMaps[i].id) { mouseOut = false; break; } } if (mouseOut) { this.fireEvent(this.mouseoveredObjectMaps[i], "mouseout", ev); } else { mouseOutObjectMapsExcluded.push(this.mouseoveredObjectMaps[i]); } } this.mouseoveredObjectMaps = mouseOutObjectMapsExcluded; //Process new eventObectMaps //If they already don't exist, add them and fire mouseover //If ev.type is mousemove, then just fire mousemove //If ev.type is click, then fire two events - click followed by mousemove for (var i = 0; i < eventObjectMaps.length; i++) { var existing = false; for (var j = 0; j < this.mouseoveredObjectMaps.length; j++) { if (eventObjectMaps[i].id === this.mouseoveredObjectMaps[j].id) { existing = true; break; } } if (!existing) { this.fireEvent(eventObjectMaps[i], "mouseover", ev); this.mouseoveredObjectMaps.push(eventObjectMaps[i]); } if (ev.type === "click") { this.fireEvent(eventObjectMaps[i], "click", ev); } else if (ev.type === "mousemove") { this.fireEvent(eventObjectMaps[i], "mousemove", ev); } } }; EventManager.prototype.fireEvent = function (eventObjectMap, eventType, ev) { if (!eventObjectMap || !eventType) return; var eventParameter = eventObjectMap.eventParameter; var eventContext = eventObjectMap.eventContext; //var context = eventObjectMap.eventContext.context; var userContext = eventObjectMap.eventContext.userContext; if (userContext && eventContext && userContext[eventContext[eventType]]) userContext[eventContext[eventType]].call(userContext, eventParameter); if (eventType !== "mouseout") { if (userContext.cursor && userContext.cursor !== ev.target.style.cursor) { ev.target.style.cursor = userContext.cursor; } } else { ev.target.style.cursor = this.chart._defaultCursor; delete eventObjectMap.eventParameter; // reference no longer required. delete eventObjectMap.eventContext; // reference no longer required. } //This is just a quick fix. Need to find a better way of calling internal event handlers. if (eventType === "click" && eventObjectMap.objectType === "dataPoint" && this.chart.pieDoughnutClickHandler) { this.chart.pieDoughnutClickHandler.call(this.chart.data[eventObjectMap.dataSeriesIndex], eventParameter); } }; exports.default = EventManager; },{"../helpers/utils":39}],32:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function LayoutManager(x1, y1, x2, y2, padding) { if (typeof padding === "undefined") padding = 0; this._padding = padding; this._x1 = x1; this._y1 = y1; this._x2 = x2; this._y2 = y2; this._topOccupied = this._padding; this._bottomOccupied = this._padding; this._leftOccupied = this._padding; this._rightOccupied = this._padding; } LayoutManager.prototype.registerSpace = function (position, size) { if (position === "top") { this._topOccupied += size.height; } else if (position === "bottom") { this._bottomOccupied += size.height; } else if (position === "left") { this._leftOccupied += size.width; // this is width when seen upright/vertically } else if (position === "right") { this._rightOccupied += size.width; // this is width when seen upright/vertically } }; LayoutManager.prototype.unRegisterSpace = function (position, size) { if (position === "top") { this._topOccupied -= size.height; } else if (position === "bottom") { this._bottomOccupied -= size.height; } else if (position === "left") { this._leftOccupied -= size.width; // this is width when seen upright/vertically } else if (position === "right") { this._rightOccupied -= size.width; // this is width when seen upright/vertically } }; LayoutManager.prototype.getFreeSpace = function () { /// ///Returns available free space {x1:number, y1:number, x2:number, y2:number} /// return { x1: this._x1 + this._leftOccupied, y1: this._y1 + this._topOccupied, x2: this._x2 - this._rightOccupied, y2: this._y2 - this._bottomOccupied, width: this._x2 - this._x1 - this._rightOccupied - this._leftOccupied, height: this._y2 - this._y1 - this._bottomOccupied - this._topOccupied }; }; LayoutManager.prototype.reset = function () { //so that there is enough padding. this._topOccupied = this._padding; this._bottomOccupied = this._padding; this._leftOccupied = this._padding; this._rightOccupied = this._padding; }; exports.default = LayoutManager; },{}],33:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _data_series = require('./data_series'); var _data_series2 = _interopRequireDefault(_data_series); var _canvasjs = require('./canvasjs'); var _canvasjs2 = _interopRequireDefault(_canvasjs); var _text_block = require('./text_block'); var _text_block2 = _interopRequireDefault(_text_block); var _render = require('../helpers/render'); var _render2 = _interopRequireDefault(_render); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function Legend(chart, options, theme) { Legend.base.constructor.call(this, "Legend", options, theme); this.chart = chart; this.canvas = chart.canvas; this.ctx = this.chart.ctx; this.ghostCtx = this.chart._eventManager.ghostCtx; this.items = []; this.width = 0, //this.fontSize = 12, this.height = 0, this.orientation = null, this.dataSeries = []; this.bounds = { x1: null, y1: null, x2: null, y2: null }; if (typeof this._options.fontSize === "undefined") { this.fontSize = this.chart.getAutoFontSize(this.fontSize); //window.console.log("fontSize: " + this.fontSize); } this.lineHeight = (0, _utils.getFontHeightInPixels)(this.fontFamily, this.fontSize, this.fontWeight); this.horizontalSpacing = this.fontSize; } (0, _utils.extend)(Legend, _canvasjs2.default); Legend.prototype.render = function () { var container = !this.dockInsidePlotArea ? this.chart : this.chart.plotArea; var freeSpace = container.layoutManager.getFreeSpace(); var position = null; var top = 0; var left = 0; var maxWidth = 0; var maxHeight = 0; var itemMargin = 5; var items = []; var rows = []; //this.ctx.font = getFontString("", this, null); //this.ctx.fontColor = this.fontColor; if (this.verticalAlign === "top" || this.verticalAlign === "bottom") { this.orientation = "horizontal"; position = this.verticalAlign; maxWidth = this.maxWidth !== null ? this.maxWidth : freeSpace.width * .7; maxHeight = this.maxHeight !== null ? this.maxHeight : freeSpace.height * .5; } else if (this.verticalAlign === "center") { this.orientation = "vertical"; position = this.horizontalAlign; maxWidth = this.maxWidth !== null ? this.maxWidth : freeSpace.width * .5; maxHeight = this.maxHeight !== null ? this.maxHeight : freeSpace.height * .7; } for (var i = 0; i < this.dataSeries.length; i++) { var dataSeries = this.dataSeries[i]; if (dataSeries.type !== "pie" && dataSeries.type !== "doughnut" && dataSeries.type !== "funnel") { var markerType = dataSeries.legendMarkerType ? dataSeries.legendMarkerType : (dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline" || dataSeries.type === "scatter" || dataSeries.type === "bubble") && dataSeries.markerType ? dataSeries.markerType : _data_series2.default.getDefaultLegendMarker(dataSeries.type); var legendText = dataSeries.legendText ? dataSeries.legendText : this.itemTextFormatter ? this.itemTextFormatter({ chart: this.chart, legend: this._options, dataSeries: dataSeries, dataPoint: null }) : dataSeries.name; var markerColor = dataSeries.legendMarkerColor ? dataSeries.legendMarkerColor : dataSeries.markerColor ? dataSeries.markerColor : dataSeries._colorSet[0]; var markerSize = !dataSeries.markerSize && (dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline") ? 0 : this.lineHeight * .6; var markerBorderColor = dataSeries.legendMarkerBorderColor ? dataSeries.legendMarkerBorderColor : dataSeries.markerBorderColor; var markerBorderThickness = dataSeries.legendMarkerBorderThickness ? dataSeries.legendMarkerBorderThickness : dataSeries.markerBorderThickness ? Math.max(1, Math.round(markerSize * .2)) : 0; var lineColor = dataSeries._colorSet[0]; legendText = this.chart.replaceKeywordsWithValue(legendText, dataSeries.dataPoints[0], dataSeries, i); var item = { markerType: markerType, markerColor: markerColor, text: legendText, textBlock: null, chartType: dataSeries.type, markerSize: markerSize, lineColor: dataSeries._colorSet[0], dataSeriesIndex: dataSeries.index, dataPointIndex: null, markerBorderColor: markerBorderColor, markerBorderThickness: markerBorderThickness }; items.push(item); } else { for (var dataPointIndex = 0; dataPointIndex < dataSeries.dataPoints.length; dataPointIndex++) { var dataPoint = dataSeries.dataPoints[dataPointIndex]; var markerType = dataPoint.legendMarkerType ? dataPoint.legendMarkerType : dataSeries.legendMarkerType ? dataSeries.legendMarkerType : _data_series2.default.getDefaultLegendMarker(dataSeries.type); var legendText = dataPoint.legendText ? dataPoint.legendText : dataSeries.legendText ? dataSeries.legendText : this.itemTextFormatter ? this.itemTextFormatter({ chart: this.chart, legend: this._options, dataSeries: dataSeries, dataPoint: dataPoint }) : dataPoint.name ? dataPoint.name : "DataPoint: " + (dataPointIndex + 1); var markerColor = dataPoint.legendMarkerColor ? dataPoint.legendMarkerColor : dataSeries.legendMarkerColor ? dataSeries.legendMarkerColor : dataPoint.color ? dataPoint.color : dataSeries.color ? dataSeries.color : dataSeries._colorSet[dataPointIndex % dataSeries._colorSet.length]; var markerSize = this.lineHeight * .6; var markerBorderColor = dataPoint.legendMarkerBorderColor ? dataPoint.legendMarkerBorderColor : dataSeries.legendMarkerBorderColor ? dataSeries.legendMarkerBorderColor : dataPoint.markerBorderColor ? dataPoint.markerBorderColor : dataSeries.markerBorderColor; var markerBorderThickness = dataPoint.legendMarkerBorderThickness ? dataPoint.legendMarkerBorderThickness : dataSeries.legendMarkerBorderThickness ? dataSeries.legendMarkerBorderThickness : dataPoint.markerBorderThickness || dataSeries.markerBorderThickness ? Math.max(1, Math.round(markerSize * .2)) : 0; legendText = this.chart.replaceKeywordsWithValue(legendText, dataPoint, dataSeries, dataPointIndex); var item = { markerType: markerType, markerColor: markerColor, text: legendText, textBlock: null, chartType: dataSeries.type, markerSize: markerSize, dataSeriesIndex: i, dataPointIndex: dataPointIndex, markerBorderColor: markerBorderColor, markerBorderThickness: markerBorderThickness }; if (dataPoint.showInLegend || dataSeries.showInLegend && dataPoint.showInLegend !== false) { items.push(item); } } } item = null; } if (this.reversed === true) { items.reverse(); } // Find out the required width and height of Legend and position the items relative to the container if (items.length > 0) { var row = null; var rowIndex = 0; // required for vertical orientation var textMaxWidth = 0; var columnHeight = 0; if (this.itemWidth !== null) { if (this.itemMaxWidth !== null) { textMaxWidth = Math.min(this.itemWidth, this.itemMaxWidth, maxWidth); } else { textMaxWidth = Math.min(this.itemWidth, maxWidth); } } else { if (this.itemMaxWidth !== null) { textMaxWidth = Math.min(this.itemMaxWidth, maxWidth); } else { textMaxWidth = maxWidth; } } markerSize = markerSize === 0 ? this.lineHeight * .6 : markerSize; textMaxWidth = textMaxWidth - (markerSize + this.horizontalSpacing * .1); for (var i = 0; i < items.length; i++) { var item = items[i]; if (item.chartType === "line" || item.chartType === "spline" || item.chartType === "stepLine") { textMaxWidth = textMaxWidth - 2 * (this.lineHeight * .1); } if (maxHeight <= 0 || typeof maxHeight === "undefined" || textMaxWidth <= 0 || typeof textMaxWidth === "undefined") { continue; } if (this.orientation === "horizontal") { item.textBlock = new _text_block2.default(this.ctx, { x: 0, y: 0, //TBI maxWidth: textMaxWidth, maxHeight: this.itemWrap ? maxHeight : this.lineHeight, //TBI: FontSize angle: 0, text: item.text, horizontalAlign: "left", //left, center, right fontSize: this.fontSize, //in pixels fontFamily: this.fontFamily, fontWeight: this.fontWeight, //normal, bold, bolder, lighter, fontColor: this.fontColor, fontStyle: this.fontStyle, // normal, italic, oblique textBaseline: "top" }); item.textBlock.measureText(); if (this.itemWidth !== null) { item.textBlock.width = this.itemWidth - (markerSize + this.horizontalSpacing * .1 + (item.chartType === "line" || item.chartType === "spline" || item.chartType === "stepLine" ? 2 * (this.lineHeight * .1) : 0)); } if (!row || row.width + Math.round(item.textBlock.width + this.horizontalSpacing * .1 + markerSize + (row.width === 0 ? 0 : this.horizontalSpacing) + (item.chartType === "line" || item.chartType === "spline" || item.chartType === "stepLine" ? 2 * (this.lineHeight * .1) : 0)) > maxWidth) { row = { items: [], width: 0 }; rows.push(row); this.height += columnHeight; columnHeight = 0; } columnHeight = Math.max(columnHeight, item.textBlock.height); item.textBlock.x = row.width; item.textBlock.y = 0; row.width += Math.round(item.textBlock.width + this.horizontalSpacing * .1 + markerSize + (row.width === 0 ? 0 : this.horizontalSpacing) + (item.chartType === "line" || item.chartType === "spline" || item.chartType === "stepLine" ? 2 * (this.lineHeight * .1) : 0)); row.items.push(item); this.width = Math.max(row.width, this.width); } else { item.textBlock = new _text_block2.default(this.ctx, { x: 0, y: 0, //TBI maxWidth: textMaxWidth, maxHeight: this.itemWrap === true ? maxHeight : this.fontSize * 1.5, //TBI: FontSize angle: 0, text: item.text, horizontalAlign: "left", //left, center, right fontSize: this.fontSize, //in pixels fontFamily: this.fontFamily, fontWeight: this.fontWeight, //normal, bold, bolder, lighter, fontColor: this.fontColor, fontStyle: this.fontStyle, // normal, italic, oblique textBaseline: "top" }); item.textBlock.measureText(); if (this.itemWidth !== null) { item.textBlock.width = this.itemWidth - (markerSize + this.horizontalSpacing * .1 + (item.chartType === "line" || item.chartType === "spline" || item.chartType === "stepLine" ? 2 * (this.lineHeight * .1) : 0)); } if (this.height <= maxHeight) { row = { items: [], width: 0 }; rows.push(row); } else { row = rows[rowIndex]; rowIndex = (rowIndex + 1) % rows.length; } this.height += item.textBlock.height; item.textBlock.x = row.width; // relative to the row item.textBlock.y = 0; // relative to the row row.width += Math.round(item.textBlock.width + this.horizontalSpacing * .1 + markerSize + (row.width === 0 ? 0 : this.horizontalSpacing) + (item.chartType === "line" || item.chartType === "spline" || item.chartType === "stepLine" ? 2 * (this.lineHeight * .1) : 0)); row.items.push(item); this.width = Math.max(row.width, this.width); } } if (this.itemWrap === false) { this.height = rows.length * this.lineHeight; } else { this.height += columnHeight; } this.height = Math.min(maxHeight, this.height); this.width = Math.min(maxWidth, this.width); } if (this.verticalAlign === "top") { if (this.horizontalAlign === "left") left = freeSpace.x1;else if (this.horizontalAlign === "right") left = freeSpace.x2 - this.width;else left = freeSpace.x1 + freeSpace.width / 2 - this.width / 2; top = freeSpace.y1; } else if (this.verticalAlign === "center") { if (this.horizontalAlign === "left") left = freeSpace.x1;else if (this.horizontalAlign === "right") left = freeSpace.x2 - this.width;else left = freeSpace.x1 + freeSpace.width / 2 - this.width / 2; top = freeSpace.y1 + freeSpace.height / 2 - this.height / 2; } else if (this.verticalAlign === "bottom") { if (this.horizontalAlign === "left") left = freeSpace.x1;else if (this.horizontalAlign === "right") left = freeSpace.x2 - this.width;else left = freeSpace.x1 + freeSpace.width / 2 - this.width / 2; top = freeSpace.y2 - this.height; } this.items = items; //Assign ids to all legendItems for (var i = 0; i < this.items.length; i++) { var item = items[i]; item.id = ++this.chart._eventManager.lastObjectId; this.chart._eventManager.objectMap[item.id] = { id: item.id, objectType: "legendItem", legendItemIndex: i, dataSeriesIndex: item.dataSeriesIndex, dataPointIndex: item.dataPointIndex }; //delete item.textBlock;// Not Required anymore } var rowHeight = 0; for (var i = 0; i < rows.length; i++) { var row = rows[i]; var columnHeight = 0; for (var itemIndex = 0; itemIndex < row.items.length; itemIndex++) { var item = row.items[itemIndex]; var itemX = item.textBlock.x + left + (itemIndex === 0 ? markerSize * .2 : this.horizontalSpacing); var itemY = top + rowHeight; var ghostX = itemX; if (!this.chart.data[item.dataSeriesIndex].visible) this.ctx.globalAlpha = .5; this.ctx.save(); this.ctx.rect(left, top, maxWidth, maxHeight); this.ctx.clip(); if (item.chartType === "line" || item.chartType === "stepLine" || item.chartType === "spline") { this.ctx.strokeStyle = item.lineColor; this.ctx.lineWidth = Math.ceil(this.lineHeight / 8); this.ctx.beginPath(); this.ctx.moveTo(itemX - this.lineHeight * .1, itemY + this.lineHeight / 2); this.ctx.lineTo(itemX + this.lineHeight * .7, itemY + this.lineHeight / 2); this.ctx.stroke(); ghostX -= this.lineHeight * .1; } _render2.default.drawMarker(itemX + markerSize / 2, itemY + this.lineHeight / 2, this.ctx, item.markerType, item.markerSize, item.markerColor, item.markerBorderColor, item.markerBorderThickness); item.textBlock.x = itemX + this.horizontalSpacing * .1 + markerSize; if (item.chartType === "line" || item.chartType === "stepLine" || item.chartType === "spline") { item.textBlock.x = item.textBlock.x + this.lineHeight * .1; } item.textBlock.y = itemY; item.textBlock.render(true); this.ctx.restore(); if (itemIndex > 0) { columnHeight = Math.max(columnHeight, item.textBlock.height); } else { columnHeight = item.textBlock.height; } if (!this.chart.data[item.dataSeriesIndex].visible) this.ctx.globalAlpha = 1; var hexColor = intToHexColorString(item.id); this.ghostCtx.fillStyle = hexColor; this.ghostCtx.beginPath(); this.ghostCtx.fillRect(ghostX, item.textBlock.y, item.textBlock.x + item.textBlock.width - ghostX, item.textBlock.height); item.x1 = this.chart._eventManager.objectMap[item.id].x1 = ghostX; item.y1 = this.chart._eventManager.objectMap[item.id].y1 = item.textBlock.y; item.x2 = this.chart._eventManager.objectMap[item.id].x2 = item.textBlock.x + item.textBlock.width; item.y2 = this.chart._eventManager.objectMap[item.id].y2 = item.textBlock.y + item.textBlock.height; } rowHeight = rowHeight + columnHeight; } //this.ctx.beginPath(); //this.ctx.lineWidth = 2; //this.ctx.strokeStyle = "red"; //this.ctx.rect(left, top, this.width, this.height); //this.ctx.stroke(); container.layoutManager.registerSpace(position, { width: this.width + 2 + 2, height: this.height + 5 + 5 }); this.bounds = { x1: left, y1: top, x2: left + this.width, y2: top + this.height }; }; exports.default = Legend; },{"../helpers/render":38,"../helpers/utils":39,"./canvasjs":27,"./data_series":30,"./text_block":34}],34:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _canvasjs = require('./canvasjs'); var _canvasjs2 = _interopRequireDefault(_canvasjs); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function TextBlock(ctx, options) { TextBlock.base.constructor.call(this, "TextBlock", options); this.ctx = ctx; this._isDirty = true; this._wrappedText = null; this._lineHeight = (0, _utils.getFontHeightInPixels)(this.fontFamily, this.fontSize, this.fontWeight); } (0, _utils.extend)(TextBlock, _canvasjs2.default); TextBlock.prototype.render = function (preserveContext) { if (preserveContext) this.ctx.save(); var font = this.ctx.font; this.ctx.textBaseline = this.textBaseline; var offsetY = 0; if (this._isDirty) this.measureText(this.ctx); this.ctx.translate(this.x, this.y + offsetY); if (this.textBaseline === "middle") { offsetY = -this._lineHeight / 2; } this.ctx.font = this._getFontString(); this.ctx.rotate(Math.PI / 180 * this.angle); var textLeft = 0; var textTop = this.padding; //var textTop = this.padding; var line = null; if (this.borderThickness > 0 && this.borderColor || this.backgroundColor) { this.ctx.roundRect(0, offsetY, this.width, this.height, this.cornerRadius, this.borderThickness, this.backgroundColor, this.borderColor); //if (this.textBaseline === "middle") { // //textTop += this.fontSize / 2; // textTop += this._lineHeight / 2; //} } this.ctx.fillStyle = this.fontColor; for (var i = 0; i < this._wrappedText.lines.length; i++) { line = this._wrappedText.lines[i]; if (this.horizontalAlign === "right") textLeft = this.width - line.width - this.padding;else if (this.horizontalAlign === "left") textLeft = this.padding;else if (this.horizontalAlign === "center") textLeft = (this.width - this.padding * 2) / 2 - line.width / 2 + this.padding; this.ctx.fillText(line.text, textLeft, textTop); textTop += line.height; } this.ctx.font = font; if (preserveContext) this.ctx.restore(); }; TextBlock.prototype.setText = function (text) { this.text = text; this._isDirty = true; this._wrappedText = null; }; TextBlock.prototype.measureText = function () { if (this.maxWidth === null) { throw "Please set maxWidth and height for TextBlock"; } this._wrapText(this.ctx); this._isDirty = false; return { width: this.width, height: this.height }; }; TextBlock.prototype._getLineWithWidth = function (text, width, clipWord) { text = String(text); clipWord = clipWord || false; if (!text) return { text: "", width: 0 }; var textWidth = 0, min = 0, max = text.length - 1, mid = Infinity; this.ctx.font = this._getFontString(); while (min <= max) { mid = Math.floor((min + max) / 2); var tempText = text.substr(0, mid + 1); textWidth = this.ctx.measureText(tempText).width; if (textWidth < width) { min = mid + 1; } else if (textWidth > width) { max = mid - 1; } else { break; } } //edge cases if (textWidth > width && tempText.length > 1) { tempText = tempText.substr(0, tempText.length - 1); textWidth = this.ctx.measureText(tempText).width; } var isClipped = true; if (tempText.length === text.length || text[tempText.length] === " ") isClipped = false; if (isClipped) { var resultWords = tempText.split(" "); if (resultWords.length > 1) resultWords.pop(); tempText = resultWords.join(" "); textWidth = this.ctx.measureText(tempText).width; } return { text: tempText, width: textWidth }; }; TextBlock.prototype._wrapText = function wrapText() { //this.ctx.save(); var text = new String((0, _utils.trimString)(String(this.text))); var lines = []; var font = this.ctx.font; // Save the current Font var height = 0; var width = 0; this.ctx.font = this._getFontString(); while (text.length > 0) { var maxWidth = this.maxWidth - this.padding * 2; var maxHeight = this.maxHeight - this.padding * 2; var line = this._getLineWithWidth(text, maxWidth, false); line.height = this._lineHeight; lines.push(line); width = Math.max(width, line.width); height += line.height; text = (0, _utils.trimString)(text.slice(line.text.length, text.length)); if (maxHeight && height > maxHeight) { var line = lines.pop(); height -= line.height; } } this._wrappedText = { lines: lines, width: width, height: height }; this.width = width + this.padding * 2; this.height = height + this.padding * 2; this.ctx.font = font; // Restore the font }; TextBlock.prototype._getFontString = function () { //return this.fontStyle + " " + this.fontWeight + " " + this.fontSize + "px " + this.fontFamily return (0, _utils.getFontString)("", this, null); }; exports.default = TextBlock; },{"../helpers/utils":39,"./canvasjs":27}],35:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _canvasjs = require('./canvasjs'); var _canvasjs2 = _interopRequireDefault(_canvasjs); var _text_block = require('./text_block'); var _text_block2 = _interopRequireDefault(_text_block); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function Title(chart, options) { Title.base.constructor.call(this, "Title", options, chart.theme); this.chart = chart; this.canvas = chart.canvas; this.ctx = this.chart.ctx; if (typeof this._options.fontSize === "undefined") { this.fontSize = this.chart.getAutoFontSize(this.fontSize); //window.console.log("Chart Title fontSize: " + this.fontSize); } this.width = null, //read only this.height = null; //read only this.bounds = { x1: null, y1: null, x2: null, y2: null }; } (0, _utils.extend)(Title, _canvasjs2.default); Title.prototype.render = function () { if (!this.text) return; var container = !this.dockInsidePlotArea ? this.chart : this.chart.plotArea; var freespace = container.layoutManager.getFreeSpace(); var left = freespace.x1; var top = freespace.y1; var angle = 0; var maxHeight = 0; var containerMargin = 2; //Margin towards the container var rightOffset = this.chart._menuButton && this.chart.exportEnabled && this.verticalAlign === "top" ? 22 : 0; //So that Title doesn't overlap menu button. var textBlockHorizontalAlign; var position; if (this.verticalAlign === "top" || this.verticalAlign === "bottom") { if (this.maxWidth === null) this.maxWidth = freespace.width - containerMargin * 2 - rightOffset * (this.horizontalAlign === "center" ? 2 : 1); maxHeight = freespace.height * .5 - this.margin - containerMargin; angle = 0; } else if (this.verticalAlign === "center") { if (this.horizontalAlign === "left" || this.horizontalAlign === "right") { if (this.maxWidth === null) this.maxWidth = freespace.height - containerMargin * 2; maxHeight = freespace.width * .5 - this.margin - containerMargin; } else if (this.horizontalAlign === "center") { if (this.maxWidth === null) this.maxWidth = freespace.width - containerMargin * 2; maxHeight = freespace.height * .5 - containerMargin * 2; } } if (!this.wrap) maxHeight = Math.min(maxHeight, Math.max(this.fontSize * 1.5, this.fontSize + this.padding * 2.5)); //console.log(this.maxWidth); var textBlock = new _text_block2.default(this.ctx, { fontSize: this.fontSize, fontFamily: this.fontFamily, fontColor: this.fontColor, fontStyle: this.fontStyle, fontWeight: this.fontWeight, horizontalAlign: this.horizontalAlign, verticalAlign: this.verticalAlign, borderColor: this.borderColor, borderThickness: this.borderThickness, backgroundColor: this.backgroundColor, maxWidth: this.maxWidth, maxHeight: maxHeight, cornerRadius: this.cornerRadius, text: this.text, padding: this.padding, textBaseline: "top" }); var textBlockSize = textBlock.measureText(); if (this.verticalAlign === "top" || this.verticalAlign === "bottom") { if (this.verticalAlign === "top") { top = freespace.y1 + containerMargin; position = "top"; } else if (this.verticalAlign === "bottom") { top = freespace.y2 - containerMargin - textBlockSize.height; position = "bottom"; } if (this.horizontalAlign === "left") { left = freespace.x1 + containerMargin; } else if (this.horizontalAlign === "center") { left = freespace.x1 + freespace.width / 2 - textBlockSize.width / 2; } else if (this.horizontalAlign === "right") { left = freespace.x2 - containerMargin - textBlockSize.width - rightOffset; } textBlockHorizontalAlign = this.horizontalAlign; this.width = textBlockSize.width; this.height = textBlockSize.height; } else if (this.verticalAlign === "center") { if (this.horizontalAlign === "left") { left = freespace.x1 + containerMargin; top = freespace.y2 - containerMargin - (this.maxWidth / 2 - textBlockSize.width / 2); angle = -90; position = "left"; this.width = textBlockSize.height; this.height = textBlockSize.width; } else if (this.horizontalAlign === "right") { left = freespace.x2 - containerMargin; top = freespace.y1 + containerMargin + (this.maxWidth / 2 - textBlockSize.width / 2); angle = 90; position = "right"; this.width = textBlockSize.height; this.height = textBlockSize.width; } else if (this.horizontalAlign === "center") { top = container.y1 + (container.height / 2 - textBlockSize.height / 2); left = container.x1 + (container.width / 2 - textBlockSize.width / 2); position = "center"; this.width = textBlockSize.width; this.height = textBlockSize.height; } textBlockHorizontalAlign = "center"; } textBlock.x = left; textBlock.y = top; textBlock.angle = angle; textBlock.horizontalAlign = textBlockHorizontalAlign; textBlock.render(true); container.layoutManager.registerSpace(position, { width: this.width + (position === "left" || position === "right" ? this.margin + containerMargin : 0), height: this.height + (position === "top" || position === "bottom" ? this.margin + containerMargin : 0) }); this.bounds = { x1: left, y1: top, x2: left + this.width, y2: top + this.height }; this.ctx.textBaseline = "top"; }; exports.default = Title; },{"../helpers/utils":39,"./canvasjs":27,"./text_block":34}],36:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _animator = require('../helpers/animator'); var _animator2 = _interopRequireDefault(_animator); var _render = require('../helpers/render'); var _render2 = _interopRequireDefault(_render); var _canvasjs = require('./canvasjs'); var _canvasjs2 = _interopRequireDefault(_canvasjs); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function ToolTip(chart, options, theme) { ToolTip.base.constructor.call(this, "ToolTip", options, theme); this.chart = chart; this.canvas = chart.canvas; this.ctx = this.chart.ctx; this.currentSeriesIndex = -1; this.currentDataPointIndex = -1; this._timerId = 0; this._prevX = NaN; this._prevY = NaN; this._initialize(); } (0, _utils.extend)(ToolTip, _canvasjs2.default); ToolTip.prototype._initialize = function () { if (this.enabled) { this.container = document.createElement("div"); this.container.setAttribute("class", "canvasjs-chart-tooltip"); this.container.style.position = "absolute"; this.container.style.height = "auto"; this.container.style.boxShadow = "1px 1px 2px 2px rgba(0,0,0,0.1)"; this.container.style.zIndex = "1000"; //this.container.style.pointerEvents = "none"; this.container.style.display = "none"; //this.container.style.whiteSpace = "no-wrap"; var toolTipHtml = "
Sample Tooltip
"; this.container.innerHTML = toolTipHtml; this.contentDiv = this.container.firstChild; this.container.style.borderRadius = this.contentDiv.style.borderRadius; this.chart._canvasJSContainer.appendChild(this.container); } }; ToolTip.prototype.mouseMoveHandler = function (x, y) { if (!(this._lastUpdated && new Date().getTime() - this._lastUpdated < 40)) { this._lastUpdated = new Date().getTime(); this._updateToolTip(x, y); } }; ToolTip.prototype._updateToolTip = function (mouseX, mouseY) { //return; if (this.chart.disableToolTip) // Disabled during animation, etc return; if (typeof mouseX === "undefined" || typeof mouseY === "undefined") { if (isNaN(this._prevX) || isNaN(this._prevY)) return;else { mouseX = this._prevX; mouseY = this._prevY; } } else { this._prevX = mouseX; this._prevY = mouseY; } var dataPoint = null; var dataSeries = null; var toolTipContent = ""; var entries = []; var toolTipRight; var toolTipBottom; var x = 0; if (this.shared && this.enabled && this.chart.plotInfo.axisPlacement !== "none") { // && this.chart.plotInfo.axisPlacement !== "none" if (this.chart.plotInfo.axisPlacement === "xySwapped") { x = (this.chart.axisX.viewportMaximum - this.chart.axisX.viewportMinimum) / this.chart.axisX.lineCoordinates.height * (this.chart.axisX.lineCoordinates.y2 - mouseY) + this.chart.axisX.viewportMinimum; } else { x = (this.chart.axisX.viewportMaximum - this.chart.axisX.viewportMinimum) / this.chart.axisX.lineCoordinates.width * (mouseX - this.chart.axisX.lineCoordinates.x1) + this.chart.axisX.viewportMinimum; } var nearbyEntries = []; for (var i = 0; i < this.chart.data.length; i++) { var entry = this.chart.data[i].getDataPointAtX(x, true); if (entry && entry.index >= 0) { entry.dataSeries = this.chart.data[i]; if (entry.dataPoint.y !== null) nearbyEntries.push(entry); } } if (nearbyEntries.length === 0) return; nearbyEntries.sort(function (entry1, entry2) { return entry1.distance - entry2.distance; }); var closest = nearbyEntries[0]; for (i = 0; i < nearbyEntries.length; i++) { if (nearbyEntries[i].dataPoint.x.valueOf() === closest.dataPoint.x.valueOf()) entries.push(nearbyEntries[i]); } nearbyEntries = null; } else { var dataPointInfo = this.chart.getDataPointAtXY(mouseX, mouseY, true); //dataPointInfo = null; if (dataPointInfo) { this.currentDataPointIndex = dataPointInfo.dataPointIndex; this.currentSeriesIndex = dataPointInfo.dataSeries.index; } else if (_utils.isCanvasSupported) { var id = (0, _utils.getObjectId)(mouseX, mouseY, this.chart._eventManager.ghostCtx); if (id > 0 && typeof this.chart._eventManager.objectMap[id] !== "undefined") { //DataPoint/DataSeries event var eventObject = this.chart._eventManager.objectMap[id]; if (eventObject.objectType === "legendItem") return; //if (this.currentSeriesIndex === eventObject.dataSeriesIndex && this.currentDataPointIndex === eventObject.dataPointIndex) // return; //else { this.currentSeriesIndex = eventObject.dataSeriesIndex; this.currentDataPointIndex = eventObject.dataPointIndex >= 0 ? eventObject.dataPointIndex : -1; //} //window.console.log("id: " + id + "; hex: " + intToHexColorString(id)); } else this.currentDataPointIndex = -1; } else this.currentDataPointIndex = -1; if (this.currentSeriesIndex >= 0) { dataSeries = this.chart.data[this.currentSeriesIndex]; var entry = {}; if (this.currentDataPointIndex >= 0) { dataPoint = dataSeries.dataPoints[this.currentDataPointIndex]; entry.dataSeries = dataSeries; entry.dataPoint = dataPoint; entry.index = this.currentDataPointIndex; entry.distance = Math.abs(dataPoint.x - x); } else if (this.enabled && (dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline" || dataSeries.type === "area" || dataSeries.type === "stepArea" || dataSeries.type === "splineArea" || dataSeries.type === "stackedArea" || dataSeries.type === "stackedArea100" || dataSeries.type === "rangeArea" || dataSeries.type === "rangeSplineArea" || dataSeries.type === "candlestick" || dataSeries.type === "ohlc")) { //var x = (this.chart.axisX.viewportMaximum - this.chart.axisX.viewportMinimum) / this.chart.axisX.lineCoordinates.width * (mouseX - this.chart.axisX.lineCoordinates.x1) + this.chart.axisX.viewportMinimum.valueOf(); var x = dataSeries.axisX.conversionParameters.minimum + (mouseX - dataSeries.axisX.conversionParameters.reference) / dataSeries.axisX.conversionParameters.pixelPerUnit; entry = dataSeries.getDataPointAtX(x, true); entry.dataSeries = dataSeries; this.currentDataPointIndex = entry.index; dataPoint = entry.dataPoint; } else { //this.hide(); return; } if (entry.dataPoint.y !== null) { if (entry.dataSeries.axisY) { if (entry.dataPoint.y.length > 0) { var unboundToViewport = 0; for (var i = 0; i < entry.dataPoint.y.length; i++) { if (entry.dataPoint.y[i] < entry.dataSeries.axisY.viewportMinimum) unboundToViewport--;else if (entry.dataPoint.y[i] > entry.dataSeries.axisY.viewportMaximum) unboundToViewport++; }if (unboundToViewport < entry.dataPoint.y.length && unboundToViewport > -entry.dataPoint.y.length) entries.push(entry); } else { if (entry.dataPoint.y >= entry.dataSeries.axisY.viewportMinimum && entry.dataPoint.y <= entry.dataSeries.axisY.viewportMaximum) entries.push(entry); } } else entries.push(entry); } } } if (entries.length > 0) { this.highlightObjects(entries); if (this.enabled) { var toolTipInnerHtml = ""; toolTipInnerHtml = this.getToolTipInnerHTML({ entries: entries }); if (toolTipInnerHtml !== null) { this.contentDiv.innerHTML = toolTipInnerHtml; this.contentDiv.innerHTML = toolTipInnerHtml; var previouslyHidden = false; if (this.container.style.display === "none") { previouslyHidden = true; this.container.style.display = "block"; } try { this.contentDiv.style.background = this.backgroundColor ? this.backgroundColor : _utils.isCanvasSupported ? "rgba(255,255,255,.9)" : "rgb(255,255,255)"; this.contentDiv.style.borderRightColor = this.contentDiv.style.borderLeftColor = this.contentDiv.style.borderColor = this.borderColor ? this.borderColor : entries[0].dataPoint.color ? entries[0].dataPoint.color : entries[0].dataSeries.color ? entries[0].dataSeries.color : entries[0].dataSeries._colorSet[entries[0].index % entries[0].dataSeries._colorSet.length]; this.contentDiv.style.borderWidth = this.borderThickness || this.borderThickness === 0 ? this.borderThickness + "px" : 2 + "px"; this.contentDiv.style.borderRadius = this.cornerRadius || this.cornerRadius === 0 ? this.cornerRadius + "px" : 5 + "px"; this.container.style.borderRadius = this.contentDiv.style.borderRadius; this.contentDiv.style.fontSize = this.fontSize || this.fontSize === 0 ? this.fontSize + "px" : 14 + "px"; this.contentDiv.style.color = this.fontColor ? this.fontColor : "#000000"; this.contentDiv.style.fontFamily = this.fontFamily ? this.fontFamily : "Calibri, Arial, Georgia, serif;"; this.contentDiv.style.fontWeight = this.fontWeight ? this.fontWeight : "normal"; this.contentDiv.style.fontStyle = this.fontStyle ? this.fontStyle : _utils.isCanvasSupported ? "italic" : "normal"; } catch (e) {} var toolTipLeft; if (entries[0].dataSeries.type === "pie" || entries[0].dataSeries.type === "doughnut" || entries[0].dataSeries.type === "funnel" || entries[0].dataSeries.type === "bar" || entries[0].dataSeries.type === "rangeBar" || entries[0].dataSeries.type === "stackedBar" || entries[0].dataSeries.type === "stackedBar100") { toolTipLeft = mouseX - 10 - this.container.clientWidth; } else { //toolTipLeft = (((this.chart.axisX.lineCoordinates.width / Math.abs(this.chart.axisX.viewportMaximum - this.chart.axisX.viewportMinimum)) * Math.abs(entries[0].dataPoint.x - this.chart.axisX.viewportMinimum)) + this.chart.axisX.lineCoordinates.x1 + .5) - this.container.clientWidth << 0; toolTipLeft = entries[0].dataSeries.axisX.conversionParameters.reference + entries[0].dataSeries.axisX.conversionParameters.pixelPerUnit * (entries[0].dataPoint.x - entries[0].dataSeries.axisX.conversionParameters.minimum) - this.container.clientWidth << 0; toolTipLeft -= 10; } if (toolTipLeft < 0) { toolTipLeft += this.container.clientWidth + 20; } if (toolTipLeft + this.container.clientWidth > this.chart._container.clientWidth) toolTipLeft = Math.max(0, this.chart._container.clientWidth - this.container.clientWidth); toolTipLeft += "px"; if (entries.length === 1 && !this.shared && (entries[0].dataSeries.type === "line" || entries[0].dataSeries.type === "stepLine" || entries[0].dataSeries.type === "spline" || entries[0].dataSeries.type === "area" || entries[0].dataSeries.type === "stepArea" || entries[0].dataSeries.type === "splineArea" || entries[0].dataSeries.type === "stackedArea" || entries[0].dataSeries.type === "stackedArea100")) { //toolTipBottom = (entries[0].dataSeries.axisY.lineCoordinates.y2 - entries[0].dataSeries.axisY.lineCoordinates.height / Math.abs(entries[0].dataSeries.axisY.maximum - entries[0].dataSeries.axisY.viewportMinimum) * Math.abs(entries[0].dataPoint.y - entries[0].dataSeries.axisY.viewportMinimum) + .5) << 0; toolTipBottom = entries[0].dataSeries.axisY.conversionParameters.reference + entries[0].dataSeries.axisY.conversionParameters.pixelPerUnit * (entries[0].dataPoint.y - entries[0].dataSeries.axisY.viewportMinimum) + .5 << 0; } else if (entries[0].dataSeries.type === "bar" || entries[0].dataSeries.type === "rangeBar" || entries[0].dataSeries.type === "stackedBar" || entries[0].dataSeries.type === "stackedBar100") { //toolTipBottom = (entries[0].dataSeries.axisX.lineCoordinates.y2 - entries[0].dataSeries.axisX.lineCoordinates.height / Math.abs(entries[0].dataSeries.axisX.maximum - entries[0].dataSeries.axisX.viewportMinimum) * Math.abs(entries[0].dataPoint.x - entries[0].dataSeries.axisX.viewportMinimum) + .5) << 0; toolTipBottom = entries[0].dataSeries.axisX.conversionParameters.reference + entries[0].dataSeries.axisX.conversionParameters.pixelPerUnit * (entries[0].dataPoint.x - entries[0].dataSeries.axisX.viewportMinimum) + .5 << 0; } else { toolTipBottom = mouseY; } toolTipBottom = -toolTipBottom + 10; if (toolTipBottom + this.container.clientHeight + 5 > 0) { toolTipBottom -= toolTipBottom + this.container.clientHeight + 5 - 0; } toolTipBottom += "px"; //this.container.style.right = toolTipRight; this.container.style.left = toolTipLeft; this.container.style.bottom = toolTipBottom; if (!this.animationEnabled || previouslyHidden) { this.disableAnimation(); } else this.enableAnimation(); } else { this.hide(false); } } //if (isDebugMode) // console.log("searchX: " + x + " x: " + searchResult.dataPoint.x + "; y: " + searchResult.dataPoint.y + "; distance: " + searchResult.distance + "; steps: " + steps); } }; ToolTip.prototype.highlightObjects = function (entries) { //if (!this.enabled) // return; //this.chart.overlaidCanvasCtx.clearRect(0, 0, this.chart.overlaidCanvas.width, this.chart.overlaidCanvas.height); var overlaidCanvasCtx = this.chart.overlaidCanvasCtx; this.chart.resetOverlayedCanvas(); overlaidCanvasCtx.clearRect(0, 0, this.chart.width, this.chart.height); overlaidCanvasCtx.save(); var plotArea = this.chart.plotArea; var offset = 0; overlaidCanvasCtx.rect(plotArea.x1, plotArea.y1, plotArea.x2 - plotArea.x1, plotArea.y2 - plotArea.y1); overlaidCanvasCtx.clip(); for (var i = 0; i < entries.length; i++) { var entry = entries[i]; var eventObject = this.chart._eventManager.objectMap[entry.dataSeries.dataPointIds[entry.index]]; if (!eventObject || !eventObject.objectType || eventObject.objectType !== "dataPoint") continue; var dataSeries = this.chart.data[eventObject.dataSeriesIndex]; var dataPoint = dataSeries.dataPoints[eventObject.dataPointIndex]; var index = eventObject.dataPointIndex; if (dataPoint.highlightEnabled !== false && (dataSeries.highlightEnabled === true || dataPoint.highlightEnabled === true)) { if (dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline" || dataSeries.type === "scatter" || dataSeries.type === "area" || dataSeries.type === "stepArea" || dataSeries.type === "splineArea" || dataSeries.type === "stackedArea" || dataSeries.type === "stackedArea100" || dataSeries.type === "rangeArea" || dataSeries.type === "rangeSplineArea") { var markerProps = dataSeries.getMarkerProperties(index, eventObject.x1, eventObject.y1, this.chart.overlaidCanvasCtx); markerProps.size = Math.max(markerProps.size * 1.5 << 0, 10); markerProps.borderColor = markerProps.borderColor || "#FFFFFF"; markerProps.borderThickness = markerProps.borderThickness || Math.ceil(markerProps.size * .1); //overlaidCanvasCtx.globalAlpha = .8; _render2.default.drawMarkers([markerProps]); //overlaidCanvasCtx.globalAlpha = .8; if (typeof eventObject.y2 !== "undefined") { var markerProps = dataSeries.getMarkerProperties(index, eventObject.x1, eventObject.y2, this.chart.overlaidCanvasCtx); markerProps.size = Math.max(markerProps.size * 1.5 << 0, 10); markerProps.borderColor = markerProps.borderColor || "#FFFFFF"; markerProps.borderThickness = markerProps.borderThickness || Math.ceil(markerProps.size * .1); //overlaidCanvasCtx.globalAlpha = .8; _render2.default.drawMarkers([markerProps]); //overlaidCanvasCtx.globalAlpha = .8; } } else if (dataSeries.type === "bubble") { var markerProps = dataSeries.getMarkerProperties(index, eventObject.x1, eventObject.y1, this.chart.overlaidCanvasCtx); markerProps.size = eventObject.size; markerProps.color = "white"; markerProps.borderColor = "white"; //markerProps.borderThickness = 2; overlaidCanvasCtx.globalAlpha = .3; _render2.default.drawMarkers([markerProps]); overlaidCanvasCtx.globalAlpha = 1; } else if (dataSeries.type === "column" || dataSeries.type === "stackedColumn" || dataSeries.type === "stackedColumn100" || dataSeries.type === "bar" || dataSeries.type === "rangeBar" || dataSeries.type === "stackedBar" || dataSeries.type === "stackedBar100" || dataSeries.type === "rangeColumn") { (0, _utils.drawRect)(overlaidCanvasCtx, eventObject.x1, eventObject.y1, eventObject.x2, eventObject.y2, "white", 0, null, false, false, false, false, .3); } else if (dataSeries.type === "pie" || dataSeries.type === "doughnut") { (0, _utils.drawSegment)(overlaidCanvasCtx, eventObject.center, eventObject.radius, "white", dataSeries.type, eventObject.startAngle, eventObject.endAngle, .3, eventObject.percentInnerRadius); } else if (dataSeries.type === "candlestick") { overlaidCanvasCtx.globalAlpha = 1; overlaidCanvasCtx.strokeStyle = eventObject.color; overlaidCanvasCtx.lineWidth = eventObject.borderThickness * 2; offset = overlaidCanvasCtx.lineWidth % 2 === 0 ? 0 : .5; overlaidCanvasCtx.beginPath(); overlaidCanvasCtx.moveTo(eventObject.x3 - offset, eventObject.y2); overlaidCanvasCtx.lineTo(eventObject.x3 - offset, Math.min(eventObject.y1, eventObject.y4)); overlaidCanvasCtx.stroke(); overlaidCanvasCtx.beginPath(); overlaidCanvasCtx.moveTo(eventObject.x3 - offset, Math.max(eventObject.y1, eventObject.y4)); overlaidCanvasCtx.lineTo(eventObject.x3 - offset, eventObject.y3); overlaidCanvasCtx.stroke(); (0, _utils.drawRect)(overlaidCanvasCtx, eventObject.x1, Math.min(eventObject.y1, eventObject.y4), eventObject.x2, Math.max(eventObject.y1, eventObject.y4), "transparent", eventObject.borderThickness * 2, eventObject.color, false, false, false, false); overlaidCanvasCtx.globalAlpha = 1; } else if (dataSeries.type === "ohlc") { overlaidCanvasCtx.globalAlpha = 1; overlaidCanvasCtx.strokeStyle = eventObject.color; overlaidCanvasCtx.lineWidth = eventObject.borderThickness * 2; offset = overlaidCanvasCtx.lineWidth % 2 === 0 ? 0 : .5; overlaidCanvasCtx.beginPath(); overlaidCanvasCtx.moveTo(eventObject.x3 - offset, eventObject.y2); overlaidCanvasCtx.lineTo(eventObject.x3 - offset, eventObject.y3); overlaidCanvasCtx.stroke(); overlaidCanvasCtx.beginPath(); overlaidCanvasCtx.moveTo(eventObject.x3, eventObject.y1); overlaidCanvasCtx.lineTo(eventObject.x1, eventObject.y1); overlaidCanvasCtx.stroke(); overlaidCanvasCtx.beginPath(); overlaidCanvasCtx.moveTo(eventObject.x3, eventObject.y4); overlaidCanvasCtx.lineTo(eventObject.x2, eventObject.y4); overlaidCanvasCtx.stroke(); overlaidCanvasCtx.globalAlpha = 1; } } } overlaidCanvasCtx.restore(); overlaidCanvasCtx.globalAlpha = 1; overlaidCanvasCtx.beginPath(); return; }; ToolTip.prototype.getToolTipInnerHTML = function (e) { var entries = e.entries; var toolTipInnerHtml = null; var dataSeries = null; var dataPoint = null; var index = 0; var color = null; var toolTipContent = ""; var isToolTipDefinedInData = true; for (var i = 0; i < entries.length; i++) { if (entries[i].dataSeries.toolTipContent || entries[i].dataPoint.toolTipContent) { isToolTipDefinedInData = false; break; } } if (isToolTipDefinedInData && (this.content && typeof this.content === "function" || this.contentFormatter)) { var param = { chart: this.chart, toolTip: this._options, entries: entries }; toolTipInnerHtml = this.contentFormatter ? this.contentFormatter(param) : this.content(param); } else { if (this.shared && this.chart.plotInfo.axisPlacement !== "none") { var toolTipInnerHtmlPrefix = ""; for (var i = 0; i < entries.length; i++) { dataSeries = entries[i].dataSeries; dataPoint = entries[i].dataPoint; index = entries[i].index; toolTipContent = ""; if (i === 0 && isToolTipDefinedInData && !this.content) { toolTipInnerHtmlPrefix += typeof this.chart.axisX.labels[dataPoint.x] !== "undefined" ? this.chart.axisX.labels[dataPoint.x] : "{x}"; toolTipInnerHtmlPrefix += "
"; toolTipInnerHtmlPrefix = this.chart.replaceKeywordsWithValue(toolTipInnerHtmlPrefix, dataPoint, dataSeries, index); } //Allows disabling of toolTip for individual dataPoints/dataSeries if (dataPoint.toolTipContent === null || typeof dataPoint.toolTipContent === "undefined" && dataSeries._options.toolTipContent === null) continue; if (dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline" || dataSeries.type === "area" || dataSeries.type === "stepArea" || dataSeries.type === "splineArea" || dataSeries.type === "column" || dataSeries.type === "bar" || dataSeries.type === "scatter" || dataSeries.type === "stackedColumn" || dataSeries.type === "stackedColumn100" || dataSeries.type === "stackedBar" || dataSeries.type === "stackedBar100" || dataSeries.type === "stackedArea" || dataSeries.type === "stackedArea100") { toolTipContent += dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "{name}:  {y}"; } else if (dataSeries.type === "bubble") { toolTipContent += dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "{name}:  {y},   {z}"; } else if (dataSeries.type === "pie" || dataSeries.type === "doughnut" || dataSeries.type === "funnel") { toolTipContent += dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "  {y}"; } else if (dataSeries.type === "rangeColumn" || dataSeries.type === "rangeBar" || dataSeries.type === "rangeArea" || dataSeries.type === "rangeSplineArea") { toolTipContent += dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "{name}:  {y[0]}, {y[1]}"; } else if (dataSeries.type === "candlestick" || dataSeries.type === "ohlc") { toolTipContent += dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "{name}:" + "
Open:   {y[0]}" + "
High:    {y[1]}" + "
Low:   {y[2]}" + "
Close:   {y[3]}"; } if (toolTipInnerHtml === null) toolTipInnerHtml = ""; if (this.reversed === true) { toolTipInnerHtml = this.chart.replaceKeywordsWithValue(toolTipContent, dataPoint, dataSeries, index) + toolTipInnerHtml; if (i < entries.length - 1) toolTipInnerHtml = "
" + toolTipInnerHtml; } else { toolTipInnerHtml += this.chart.replaceKeywordsWithValue(toolTipContent, dataPoint, dataSeries, index); if (i < entries.length - 1) toolTipInnerHtml += "
"; } } if (toolTipInnerHtml !== null) toolTipInnerHtml = toolTipInnerHtmlPrefix + toolTipInnerHtml; } else { dataSeries = entries[0].dataSeries; dataPoint = entries[0].dataPoint; index = entries[0].index; //Allows disabling of toolTip for individual dataPoints/dataSeries if (dataPoint.toolTipContent === null || typeof dataPoint.toolTipContent === "undefined" && dataSeries._options.toolTipContent === null) return null; if (dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline" || dataSeries.type === "area" || dataSeries.type === "stepArea" || dataSeries.type === "splineArea" || dataSeries.type === "column" || dataSeries.type === "bar" || dataSeries.type === "scatter" || dataSeries.type === "stackedColumn" || dataSeries.type === "stackedColumn100" || dataSeries.type === "stackedBar" || dataSeries.type === "stackedBar100" || dataSeries.type === "stackedArea" || dataSeries.type === "stackedArea100") { toolTipContent = dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "" + (dataPoint.label ? "{label}" : "{x}") + " :  {y}"; } else if (dataSeries.type === "bubble") { toolTipContent = dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "" + (dataPoint.label ? "{label}" : "{x}") + ":  {y},   {z}"; } else if (dataSeries.type === "pie" || dataSeries.type === "doughnut" || dataSeries.type === "funnel") { toolTipContent = dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : (dataPoint.name ? "{name}:  " : dataPoint.label ? "{label}:  " : "") + "{y}"; } else if (dataSeries.type === "rangeColumn" || dataSeries.type === "rangeBar" || dataSeries.type === "rangeArea" || dataSeries.type === "rangeSplineArea") { toolTipContent = dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "" + (dataPoint.label ? "{label}" : "{x}") + " :  {y[0]},  {y[1]}"; } else if (dataSeries.type === "candlestick" || dataSeries.type === "ohlc") { toolTipContent = dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "" + (dataPoint.label ? "{label}" : "{x}") + "" + "
Open:   {y[0]}" + "
High:    {y[1]}" + "
Low:     {y[2]}" + "
Close:   {y[3]}"; } if (toolTipInnerHtml === null) toolTipInnerHtml = ""; toolTipInnerHtml += this.chart.replaceKeywordsWithValue(toolTipContent, dataPoint, dataSeries, index); } } return toolTipInnerHtml; }; ToolTip.prototype.enableAnimation = function () { if (this.container.style.WebkitTransition) return; this.container.style.WebkitTransition = "left .2s ease-out, bottom .2s ease-out"; this.container.style.MozTransition = "left .2s ease-out, bottom .2s ease-out"; this.container.style.MsTransition = "left .2s ease-out, bottom .2s ease-out"; this.container.style.transition = "left .2s ease-out, bottom .2s ease-out"; }; ToolTip.prototype.disableAnimation = function () { if (!this.container.style.WebkitTransition) return; this.container.style.WebkitTransition = ""; this.container.style.MozTransition = ""; this.container.style.MsTransition = ""; this.container.style.transition = ""; }; ToolTip.prototype.hide = function (resetOverlayedCanvas) { if (!this.enabled) return; resetOverlayedCanvas = typeof resetOverlayedCanvas === "undefined" ? true : resetOverlayedCanvas; this.container.style.display = "none"; this.currentSeriesIndex = -1; this._prevX = NaN; this._prevY = NaN; //this.chart.overlaidCanvasCtx.clearRect(0, 0, this.chart.overlaidCanvas.width, this.chart.overlaidCanvas.height); if (resetOverlayedCanvas) this.chart.resetOverlayedCanvas(); }; exports.default = ToolTip; },{"../helpers/animator":37,"../helpers/render":38,"../helpers/utils":39,"./canvasjs":27}],37:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function yScaleAnimation(fractionComplete, animationInfo) { if (fractionComplete === 0) return; var ctx = animationInfo.dest; var sourceCanvas = animationInfo.source.canvas; var base = animationInfo.animationBase; var offsetY = base - base * fractionComplete; ctx.drawImage(sourceCanvas, 0, 0, sourceCanvas.width, sourceCanvas.height, 0, offsetY, ctx.canvas.width / devicePixelBackingStoreRatio, fractionComplete * ctx.canvas.height / devicePixelBackingStoreRatio); } function xScaleAnimation(fractionComplete, animationInfo) { if (fractionComplete === 0) return; var ctx = animationInfo.dest; var sourceCanvas = animationInfo.source.canvas; var base = animationInfo.animationBase; var offsetX = base - base * fractionComplete; ctx.drawImage(sourceCanvas, 0, 0, sourceCanvas.width, sourceCanvas.height, offsetX, 0, fractionComplete * ctx.canvas.width / devicePixelBackingStoreRatio, ctx.canvas.height / devicePixelBackingStoreRatio); } function xClipAnimation(fractionComplete, animationInfo) { if (fractionComplete === 0) return; var ctx = animationInfo.dest; var sourceCanvas = animationInfo.source.canvas; ctx.save(); if (fractionComplete > 0) ctx.drawImage(sourceCanvas, 0, 0, sourceCanvas.width * fractionComplete, sourceCanvas.height, 0, 0, sourceCanvas.width * fractionComplete / devicePixelBackingStoreRatio, sourceCanvas.height / devicePixelBackingStoreRatio); ctx.restore(); } function fadeInAnimation(fractionComplete, animationInfo) { if (fractionComplete === 0) return; var ctx = animationInfo.dest; var sourceCanvas = animationInfo.source.canvas; ctx.save(); ctx.globalAlpha = fractionComplete; ctx.drawImage(sourceCanvas, 0, 0, sourceCanvas.width, sourceCanvas.height, 0, 0, ctx.canvas.width / devicePixelBackingStoreRatio, ctx.canvas.height / devicePixelBackingStoreRatio); ctx.restore(); } var easing = { linear: function linear(t, b, c, d) { return c * t / d + b; }, easeOutQuad: function easeOutQuad(t, b, c, d) { return -c * (t /= d) * (t - 2) + b; }, easeOutQuart: function easeOutQuart(t, b, c, d) { return -c * ((t = t / d - 1) * t * t * t - 1) + b; }, easeInQuad: function easeInQuad(t, b, c, d) { return c * (t /= d) * t + b; }, easeInQuart: function easeInQuart(t, b, c, d) { return c * (t /= d) * t * t * t + b; } }; exports.default = { yScaleAnimation: yScaleAnimation, xScaleAnimation: xScaleAnimation, xClipAnimation: xClipAnimation, fadeInAnimation: fadeInAnimation, easing: easing }; },{}],38:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var RenderHelper = { drawMarker: function drawMarker(x, y, ctx, markerType, markerSize, markerColor, markerBorderColor, markerBorderThickness) { if (!ctx) return; var alpha = 1; ctx.fillStyle = markerColor ? markerColor : "#000000"; ctx.strokeStyle = markerBorderColor ? markerBorderColor : "#000000"; ctx.lineWidth = markerBorderThickness ? markerBorderThickness : 0; if (markerType === "circle") { ctx.moveTo(x, y); ctx.beginPath(); //return; ctx.arc(x, y, markerSize / 2, 0, Math.PI * 2, false); if (markerColor) ctx.fill(); if (markerBorderThickness) { if (!markerBorderColor) { alpha = ctx.globalAlpha; ctx.globalAlpha = .15; ctx.strokeStyle = "black"; ctx.stroke(); ctx.globalAlpha = alpha; } else ctx.stroke(); } } else if (markerType === "square") { //ctx.moveTo(x - markerSize / 2, y - markerSize / 2); ctx.beginPath(); ctx.rect(x - markerSize / 2, y - markerSize / 2, markerSize, markerSize); if (markerColor) ctx.fill(); if (markerBorderThickness) { if (!markerBorderColor) { alpha = ctx.globalAlpha; ctx.globalAlpha = .15; ctx.strokeStyle = "black"; ctx.stroke(); ctx.globalAlpha = alpha; } else ctx.stroke(); } } else if (markerType === "triangle") { ctx.beginPath(); ctx.moveTo(x - markerSize / 2, y + markerSize / 2); ctx.lineTo(x + markerSize / 2, y + markerSize / 2); ctx.lineTo(x, y - markerSize / 2); ctx.closePath(); if (markerColor) ctx.fill(); if (markerBorderThickness) { if (!markerBorderColor) { alpha = ctx.globalAlpha; ctx.globalAlpha = .15; ctx.strokeStyle = "black"; ctx.stroke(); ctx.globalAlpha = alpha; } else ctx.stroke(); } ctx.beginPath(); } else if (markerType === "cross") { ctx.strokeStyle = markerColor; markerBorderThickness = markerSize / 4; ctx.lineWidth = markerBorderThickness; ctx.beginPath(); ctx.moveTo(x - markerSize / 2, y - markerSize / 2); ctx.lineTo(x + markerSize / 2, y + markerSize / 2); ctx.stroke(); ctx.moveTo(x + markerSize / 2, y - markerSize / 2); ctx.lineTo(x - markerSize / 2, y + markerSize / 2); ctx.stroke(); } }, drawMarkers: function drawMarkers(markers) { for (var i = 0; i < markers.length; i++) { var marker = markers[i]; RenderHelper.drawMarker(marker.x, marker.y, marker.ctx, marker.type, marker.size, marker.color, marker.borderColor, marker.borderThickness); } } //, //draw1pxLine: function (x1, y1, x2, y2, color, ctx) { // ctx.beginPath(); // ctx.drawRect(x1, y1, x2 - x1, y2 - y1); // ctx.stroke(); //} }; exports.default = RenderHelper; },{}],39:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extend = extend; exports.inherit = inherit; exports.addToDateTime = addToDateTime; exports.convertToNumber = convertToNumber; exports.pad = pad; exports.trimString = trimString; exports.extendCtx = extendCtx; exports.compareNumbers = compareNumbers; exports.compareDataPointX = compareDataPointX; exports.intToHexColorString = intToHexColorString; exports.RGBToInt = RGBToInt; exports.intToRGB = intToRGB; exports.arrayIndexOf = arrayIndexOf; exports.addArrayIndexOf = addArrayIndexOf; exports.getFontHeightInPixels = getFontHeightInPixels; exports.getLineDashArray = getLineDashArray; exports.addEvent = addEvent; exports.dateFormat = dateFormat; exports.numberFormat = numberFormat; exports.getObjectId = getObjectId; exports.getMouseCoordinates = getMouseCoordinates; exports.getFontString = getFontString; exports.getProperty = getProperty; exports.setCanvasSize = setCanvasSize; exports.createCanvas = createCanvas; exports.exportCanvas = exportCanvas; exports.setButtonState = setButtonState; exports.show = show; exports.hide = hide; exports.getBezierPoints = getBezierPoints; exports.convertPercentToValue = convertPercentToValue; exports.drawRect = drawRect; exports.drawSegment = drawSegment; function extend(derived, base) { derived.prototype = inherit(base.prototype); derived.prototype.constructor = derived; derived.base = base.prototype; } function inherit(proto) { function F() {} F.prototype = proto; return new F(); } function addToDateTime(dateTime, num, type) { if (type === "millisecond") dateTime.setMilliseconds(dateTime.getMilliseconds() + 1 * num);else if (type === "second") dateTime.setSeconds(dateTime.getSeconds() + 1 * num);else if (type === "minute") dateTime.setMinutes(dateTime.getMinutes() + 1 * num);else if (type === "hour") dateTime.setHours(dateTime.getHours() + 1 * num);else if (type === "day") dateTime.setDate(dateTime.getDate() + 1 * num);else if (type === "week") dateTime.setDate(dateTime.getDate() + 7 * num);else if (type === "month") dateTime.setMonth(dateTime.getMonth() + 1 * num);else if (type === "year") dateTime.setFullYear(dateTime.getFullYear() + 1 * num); return dateTime; } function convertToNumber(num, type) { return constants[type + "Duration"] * num; } function pad(value, length) { var isNegative = false; if (value < 0) { isNegative = true; value *= -1; } value = "" + value; length = !length ? 1 : length; while (value.length < length) { value = "0" + value; }return isNegative ? "-" + value : value; } function trimString(str) { if (!str) return str; str = str.replace(/^\s\s*/, ''); var ws = /\s/; var i = str.length; while (ws.test(str.charAt(--i))) {} return str.slice(0, i + 1); } function extendCtx(context) { context.roundRect = function (x, y, width, height, radius, borderThickness, backgroundColor, borderColor) { /// ///Creates a rounded rectangle with given fill/stroke parameters ///x value ///y value ///Border Width ///Border Height ///Border CornerRadius ///Border Thickess ///Background Color ///Border Color /// if (backgroundColor) { this.fillStyle = backgroundColor; } if (borderColor) { this.strokeStyle = borderColor; } //if (typeof stroke == "undefined") { // stroke = true; //} if (typeof radius === "undefined") { radius = 5; } this.lineWidth = borderThickness; this.beginPath(); this.moveTo(x + radius, y); this.lineTo(x + width - radius, y); this.quadraticCurveTo(x + width, y, x + width, y + radius); this.lineTo(x + width, y + height - radius); this.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); this.lineTo(x + radius, y + height); this.quadraticCurveTo(x, y + height, x, y + height - radius); this.lineTo(x, y + radius); this.quadraticCurveTo(x, y, x + radius, y); this.closePath(); if (backgroundColor) { this.fill(); } if (borderColor && borderThickness > 0) { this.stroke(); } }; } function compareNumbers(a, b) { return a - b; } function compareDataPointX(dataPoint1, dataPoint2) { return dataPoint1.x - dataPoint2.x; } function intToHexColorString(num) { var r = ((num & 0xFF0000) >> 16).toString(16); var g = ((num & 0x00FF00) >> 8).toString(16); var b = ((num & 0x0000FF) >> 0).toString(16); r = r.length < 2 ? "0" + r : r; g = g.length < 2 ? "0" + g : g; b = b.length < 2 ? "0" + b : b; return "#" + r + g + b; } function RGBToInt(r, g, b) { var num = r << 16 | g << 8 | b; return num; } function intToRGB(num) { var rgb = []; var r = (num & 0xFF0000) >> 16; var g = (num & 0x00FF00) >> 8; var b = (num & 0x0000FF) >> 0; //r = r.length < 2 ? "0" + r : r; //g = g.length < 2 ? "0" + g : g; //b = b.length < 2 ? "0" + b : b; rgb[0] = r; rgb[1] = g; rgb[2] = b; return rgb; } function arrayIndexOf(elt /*, from*/) { var len = this.length >>> 0; var from = Number(arguments[1]) || 0; from = from < 0 ? Math.ceil(from) : Math.floor(from); if (from < 0) from += len; for (; from < len; from++) { if (from in this && this[from] === elt) return from; } return -1; }; //IE8- Fix: indexOf is not supported in IE8- for arrays function addArrayIndexOf(obj) { if (!obj.indexOf) { obj.indexOf = arrayIndexOf; } return obj; } var fontHeightInPixels = {}; var textMeasureEl = null; function getFontHeightInPixels(fontFamily, fontSize, fontWeight) { //return fontSize; fontWeight = fontWeight || "normal"; var entry = fontFamily + "_" + fontSize + "_" + fontWeight; var height = fontHeightInPixels[entry]; if (isNaN(height)) { try { var style = "position:absolute; left:0px; top:-20000px; padding:0px;margin:0px;border:none;white-space:pre;line-height:normal;" + "font-family:" + fontFamily + "; " + "font-size:" + fontSize + "px; font-weight:" + fontWeight + ";"; //console.log(style); if (!textMeasureEl) { var body = document.body; textMeasureEl = document.createElement("span"); textMeasureEl.innerHTML = ""; var textNode = document.createTextNode("Mpgyi"); textMeasureEl.appendChild(textNode); body.appendChild(textMeasureEl); } textMeasureEl.style.display = ""; textMeasureEl.setAttribute("style", style); height = Math.round(textMeasureEl.offsetHeight); textMeasureEl.style.display = "none"; //body.removeChild(tempDiv); //if (window.console) // window.console.log(fontSize + ": " + height); } catch (e) { height = Math.ceil(fontSize * 1.1); } height = Math.max(height, fontSize); fontHeightInPixels[entry] = height; } return height; } function getLineDashArray(lineDashType, lineThickness) { lineDashType = lineDashType || "solid"; var lineDashArray = []; var lineDashTypeMap = { "solid": [], "shortDash": [3, 1], "shortDot": [1, 1], "shortDashDot": [3, 1, 1, 1], "shortDashDotDot": [3, 1, 1, 1, 1, 1], "dot": [1, 2], "dash": [4, 2], "dashDot": [4, 2, 1, 2], "longDash": [8, 2], "longDashDot": [8, 2, 1, 2], "longDashDotDot": [8, 2, 1, 2, 1, 2] }; lineDashArray = lineDashTypeMap[lineDashType]; if (lineDashArray) { for (var i = 0; i < lineDashArray.length; i++) { lineDashArray[i] *= lineThickness; } } else lineDashArray = []; return lineDashArray; } //userCapture is optional. Defaults to false function addEvent(obj, eventType, fn, useCapture) { if (obj.addEventListener) { obj.addEventListener(eventType, fn, useCapture || false); } else if (obj.attachEvent) { obj.attachEvent("on" + eventType, function (e) { e = e || window.event; e.preventDefault = e.preventDefault || function () { e.returnValue = false; }; e.stopPropagation = e.stopPropagation || function () { e.cancelBubble = true; }; fn.call(obj, e); }); } else return false; } //#region formatting functions/methods function dateFormat() { var reg = /D{1,4}|M{1,4}|Y{1,4}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|f{1,3}|t{1,2}|T{1,2}|K|z{1,3}|"[^"]*"|'[^']*'/g; var defDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; var defShortDays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; var defMonths = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; var defShortMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; var timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g; var timezoneClip = /[^-+\dA-Z]/g; return function (dt, formatString, cultureInfo) { var days = cultureInfo ? cultureInfo.days : defDays; var months = cultureInfo ? cultureInfo.months : defMonths; var shortDays = cultureInfo ? cultureInfo.shortDays : defShortDays; var shortMonths = cultureInfo ? cultureInfo.shortMonths : defShortMonths; var result = ""; var utc = false; dt = dt && dt.getTime ? dt : dt ? new Date(dt) : new Date(); if (isNaN(dt)) throw SyntaxError("invalid date"); if (formatString.slice(0, 4) === "UTC:") { formatString = formatString.slice(4); utc = true; } var pre = utc ? "getUTC" : "get"; var date = dt[pre + "Date"](); var day = dt[pre + "Day"](); var month = dt[pre + "Month"](); var year = dt[pre + "FullYear"](); var hours = dt[pre + "Hours"](); var minutes = dt[pre + "Minutes"](); var seconds = dt[pre + "Seconds"](); var milliseconds = dt[pre + "Milliseconds"](); var offset = utc ? 0 : dt.getTimezoneOffset(); result = formatString.replace(reg, function (key) { switch (key) { case "D": return date; case "DD": return pad(date, 2); case "DDD": return shortDays[day]; case "DDDD": return days[day]; case "M": return month + 1; case "MM": return pad(month + 1, 2); case "MMM": return shortMonths[month]; case "MMMM": return months[month]; case "Y": return parseInt(String(year).slice(-2)); case "YY": return pad(String(year).slice(-2), 2); case "YYY": return pad(String(year).slice(-3), 3); case "YYYY": return pad(year, 4); case "h": return hours % 12 || 12; case "hh": return pad(hours % 12 || 12, 2); case "H": return hours; case "HH": return pad(hours, 2); case "m": return minutes; case "mm": return pad(minutes, 2); case "s": return seconds; case "ss": return pad(seconds, 2); case "f": return String(milliseconds).slice(0, 1); case "ff": return pad(String(milliseconds).slice(0, 2), 2); case "fff": return pad(String(milliseconds).slice(0, 3), 3); case "t": return hours < 12 ? "a" : "p"; case "tt": return hours < 12 ? "am" : "pm"; case "T": return hours < 12 ? "A" : "P"; case "TT": return hours < 12 ? "AM" : "PM"; case "K": return utc ? "UTC" : (String(dt).match(timezone) || [""]).pop().replace(timezoneClip, ""); // Time Zone; case "z": return (offset > 0 ? "-" : "+") + Math.floor(Math.abs(offset) / 60); // Hour Offset from UTC without padding case "zz": return (offset > 0 ? "-" : "+") + pad(Math.floor(Math.abs(offset) / 60), 2); // Hour Offset from UTC with padding case "zzz": return (offset > 0 ? "-" : "+") + pad(Math.floor(Math.abs(offset) / 60), 2) + pad(Math.abs(offset) % 60, 2); // Hour and Minute Offset from UTC with padding default: return key.slice(1, key.length - 1); } }); return result; }; }; function numberFormat(v, fs, cultureInfo) { if (v === null) return ""; v = Number(v); var isNegative = v < 0 ? true : false; if (isNegative) v *= -1; var decimalSeparator = cultureInfo ? cultureInfo.decimalSeparator : "."; var digitGroupSeparator = cultureInfo ? cultureInfo.digitGroupSeparator : ","; var vString = ""; fs = String(fs); var multiplier = 1; var temp; var result = ""; var matches = ""; var decimalPosition = -1; var fsBeforeDecimal = []; var fsAfterDecimal = []; var noPhBeforeDecimal = 0; // Number of Placeholders before Decimal var noPhAfterDecimal = 0; // Number of Placeholders after Decimal var noComma = 0; var isScientificNotation = false; var exponent = 0; matches = fs.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|‰|./g); //window.console.log(matches + " = " + matches.length); var match = null; for (var i = 0; matches && i < matches.length; i++) { match = matches[i]; if (match === "." && decimalPosition < 0) { decimalPosition = i; continue; } else if (match === "%") { multiplier *= 100; } else if (match === "‰") { multiplier *= 1000; continue; } else if (match[0] === "," && match[match.length - 1] === ".") { multiplier /= Math.pow(1000, match.length - 1); decimalPosition = i + match.length - 1; continue; } else if ((match[0] === "E" || match[0] === "e") && match[match.length - 1] === "0") { isScientificNotation = true; } if (decimalPosition < 0) { fsBeforeDecimal.push(match); if (match === "#" || match === "0") noPhBeforeDecimal++;else if (match === ",") noComma++; } else { fsAfterDecimal.push(match); if (match === "#" || match === "0") noPhAfterDecimal++; } } if (isScientificNotation) { var integer = Math.floor(v); exponent = (integer === 0 ? "" : String(integer)).length - noPhBeforeDecimal; multiplier /= Math.pow(10, exponent); } v *= multiplier; if (decimalPosition < 0) decimalPosition = i; vString = v.toFixed(noPhAfterDecimal); var split = vString.split("."); //window.console.log(split); var vStringBeforeDecimal = (split[0] + "").split(""); var vStringAfterDecimal = (split[1] + "").split(""); if (vStringBeforeDecimal && vStringBeforeDecimal[0] === "0") vStringBeforeDecimal.shift(); //window.console.log(fsBeforeDecimal + "<---------->" + fsAfterDecimal + " & " + vStringBeforeDecimal + "<---------->" + vStringAfterDecimal); var noPhProcessed = 0; var noDigitsAdded = 0; var noCommaAdded = 0; var commaDistance = 0; var distanceFromLastComma = 0; while (fsBeforeDecimal.length > 0) { match = fsBeforeDecimal.pop(); if (match === "#" || match === "0") { noPhProcessed++; if (noPhProcessed === noPhBeforeDecimal) { var digits = vStringBeforeDecimal; vStringBeforeDecimal = []; if (match === "0") { //var totalDigits = result.match(/[0-9]/g).length; var toPad = noPhBeforeDecimal - noDigitsAdded - (digits ? digits.length : 0); while (toPad > 0) { digits.unshift("0"); toPad--; } } while (digits.length > 0) { result = digits.pop() + result; distanceFromLastComma++; if (distanceFromLastComma % commaDistance === 0 && noCommaAdded === noComma && digits.length > 0) result = digitGroupSeparator + result; } if (isNegative) result = "-" + result; } else { if (vStringBeforeDecimal.length > 0) { result = vStringBeforeDecimal.pop() + result; noDigitsAdded++; distanceFromLastComma++; } else if (match === "0") { result = "0" + result; noDigitsAdded++; distanceFromLastComma++; } if (distanceFromLastComma % commaDistance === 0 && noCommaAdded === noComma && vStringBeforeDecimal.length > 0) result = digitGroupSeparator + result; } } else if ((match[0] === "E" || match[0] === "e") && match[match.length - 1] === "0" && /[eE][+-]*[0]+/.test(match)) { if (exponent < 0) match = match.replace("+", "").replace("-", "");else match = match.replace("-", ""); result += match.replace(/[0]+/, function ($0) { return pad(exponent, $0.length); }); } else { if (match === ",") { noCommaAdded++; commaDistance = distanceFromLastComma; distanceFromLastComma = 0; if (vStringBeforeDecimal.length > 0) result = digitGroupSeparator + result; } else if (match.length > 1 && (match[0] === "\"" && match[match.length - 1] === "\"" || match[0] === "'" && match[match.length - 1] === "'")) { result = match.slice(1, match.length - 1) + result; } else result = match + result; } } var charCount = 0; var resultAfterDecimal = ""; var addDecimalSeparator = false; while (fsAfterDecimal.length > 0) { match = fsAfterDecimal.shift(); if (match === "#" || match === "0") { if (vStringAfterDecimal.length > 0 && Number(vStringAfterDecimal.join("")) !== 0) { resultAfterDecimal += vStringAfterDecimal.shift(); addDecimalSeparator = true; } else if (match === "0") { resultAfterDecimal += "0"; addDecimalSeparator = true; } } else if (match.length > 1 && (match[0] === "\"" && match[match.length - 1] === "\"" || match[0] === "'" && match[match.length - 1] === "'")) { resultAfterDecimal += match.slice(1, match.length - 1); //addDecimalSeparator = true; } else if ((match[0] === "E" || match[0] === "e") && match[match.length - 1] === "0" && /[eE][+-]*[0]+/.test(match)) { if (exponent < 0) match = match.replace("+", "").replace("-", "");else match = match.replace("-", ""); resultAfterDecimal += match.replace(/[0]+/, function ($0) { return pad(exponent, $0.length); }); } else { resultAfterDecimal += match; //addDecimalSeparator = true; } } result += (addDecimalSeparator ? decimalSeparator : "") + resultAfterDecimal; //window.console.log(result); return result; }; //#endregion formatting functions/methods function getObjectId(x, y, ctx) { x *= devicePixelBackingStoreRatio; y *= devicePixelBackingStoreRatio; var pixels = ctx.getImageData(x, y, 2, 2).data; var isObject = true; for (var i = 0; i < 4; i++) { if (pixels[i] !== pixels[i + 4] | pixels[i] !== pixels[i + 8] | pixels[i] !== pixels[i + 12]) { isObject = false; break; } } if (isObject) { return RGBToInt(pixels[0], pixels[1], pixels[2]); } else { return 0; } //window.console.log(pixels); } //extracts mouse coordinates from the event parameters function getMouseCoordinates(ev) { var x = 0; var y = 0; ev = ev || window.event; if (ev.offsetX || ev.offsetX === 0) { x = ev.offsetX; y = ev.offsetY; } else if (ev.layerX || ev.layerX == 0) { // Firefox x = ev.layerX; y = ev.layerY; } else { x = ev.pageX - ev.target.offsetLeft; y = ev.pageY - ev.target.offsetTop; } return { x: x, y: y }; }; function getFontString(prefix, object, fallbackObject) { var fontString = ""; var fontStyleString = prefix ? prefix + "FontStyle" : "fontStyle"; var fontWeightString = prefix ? prefix + "FontWeight" : "fontWeight"; var fontSizeString = prefix ? prefix + "FontSize" : "fontSize"; var fontFamilyString = prefix ? prefix + "FontFamily" : "fontFamily"; fontString += object[fontStyleString] ? object[fontStyleString] + " " : fallbackObject && fallbackObject[fontStyleString] ? fallbackObject[fontStyleString] + " " : ""; fontString += object[fontWeightString] ? object[fontWeightString] + " " : fallbackObject && fallbackObject[fontWeightString] ? fallbackObject[fontWeightString] + " " : ""; fontString += object[fontSizeString] ? object[fontSizeString] + "px " : fallbackObject && fallbackObject[fontSizeString] ? fallbackObject[fontSizeString] + "px " : ""; var fontFamily = object[fontFamilyString] ? object[fontFamilyString] + "" : fallbackObject && fallbackObject[fontFamilyString] ? fallbackObject[fontFamilyString] + "" : ""; if (!isCanvasSupported && fontFamily) { var firstFontFamily = fontFamily.split(",")[0]; if (firstFontFamily[0] !== "'" && firstFontFamily[0] !== "\"") firstFontFamily = "'" + firstFontFamily + "'"; fontString += firstFontFamily; } else fontString += fontFamily; return fontString; } function getProperty(propertyName, object, fallbackObject) { var value = propertyName in object ? object[propertyName] : fallbackObject[propertyName]; return value; } var optimizeForHiDPI = true; //optimizeForHiDPI = false; var devicePixelRatio = window.devicePixelRatio || 1; var backingStoreRatio = 1; var devicePixelBackingStoreRatio = optimizeForHiDPI ? devicePixelRatio / backingStoreRatio : 1; function setCanvasSize(canvas, width, height) { if (isCanvasSupported && !!optimizeForHiDPI) { var ctx = canvas.getContext("2d"); backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1; devicePixelBackingStoreRatio = devicePixelRatio / backingStoreRatio; canvas.width = width * devicePixelBackingStoreRatio; canvas.height = height * devicePixelBackingStoreRatio; if (devicePixelRatio !== backingStoreRatio) { canvas.style.width = width + 'px'; canvas.style.height = height + 'px'; ctx.scale(devicePixelBackingStoreRatio, devicePixelBackingStoreRatio); } //window.alert(backingStoreRatio); //window.alert(devicePixelRatio); } else { canvas.width = width; canvas.height = height; } } function createCanvas(width, height) { var canvas = document.createElement("canvas"); canvas.setAttribute("class", "canvasjs-chart-canvas"); setCanvasSize(canvas, width, height); if (!isCanvasSupported && typeof G_vmlCanvasManager !== "undefined") { G_vmlCanvasManager.initElement(canvas); } return canvas; } function exportCanvas(canvas, format, fileName) { if (!canvas || !format || !fileName) return; var fullFileName = fileName + "." + (format === "jpeg" ? "jpg" : format); var mimeType = "image/" + format; var img = canvas.toDataURL(mimeType); var saved = false; var downloadLink = document.createElement("a"); downloadLink.download = fullFileName; downloadLink.href = img; downloadLink.target = "_blank"; var e; if (typeof Blob !== "undefined" && !!new Blob()) { //alert("blob"); var imgData = img.replace(/^data:[a-z/]*;base64,/, ''); var byteString = atob(imgData); var buffer = new ArrayBuffer(byteString.length); var intArray = new Uint8Array(buffer); for (var i = 0; i < byteString.length; i++) { intArray[i] = byteString.charCodeAt(i); } var blob = new Blob([buffer], { type: "image/" + format }); // Save the blob try { window.navigator.msSaveBlob(blob, fullFileName); saved = true; } catch (e) { downloadLink.dataset.downloadurl = [mimeType, downloadLink.download, downloadLink.href].join(':'); downloadLink.href = window.URL.createObjectURL(blob); } } if (!saved) { try { event = document.createEvent("MouseEvents"); event.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); if (downloadLink.dispatchEvent) { //alert("dispatchEvent"); downloadLink.dispatchEvent(event); } else if (downloadLink.fireEvent) { //alert("fireEvent"); downloadLink.fireEvent("onclick"); } } catch (e) { var win = window.open(); //alert("
Please right click on the image and save it to your device
"); win.document.close(); } } } var base64Images = { reset: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAcCAYAAAAAwr0iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAKRSURBVEiJrdY/iF1FFMfxzwnZrGISUSR/JLGIhoh/QiRNBLWxMLIWEkwbgiAoFgoW2mhlY6dgpY2IlRBRxBSKhSAKIklWJRYuMZKAhiyopAiaTY7FvRtmZ+/ed9/zHRjezLw5v/O9d86cuZGZpmURAfdn5o9DfdZNLXpjz+LziPgyIl6MiG0jPTJzZBuyDrP4BVm0P/AKbljTb4ToY/gGewYA7KyCl+1b3DUYANvwbiHw0gCAGRzBOzjTAXEOu0cC4Ch+r5x/HrpdrcZmvIDFSucMtnYCYC++6HmNDw8FKDT34ETrf639/azOr5vwRk/g5fbeuABtgC04XWk9VQLciMP4EH/3AFzErRNC7MXlQmsesSoHsGPE23hmEoBW+61K66HMXFmIMvN8myilXS36R01ub+KfYvw43ZXwYDX+AHP4BAci4pFJomfmr/ihmNofESsBImJGk7mlncrM45n5JPbhz0kAWpsv+juxaX21YIPmVJS2uNzJMS6ZNexC0d+I7fUWXLFyz2kSZlpWPvASlmqAf/FXNXf3FAF2F/1LuFifAlionB6dRuSI2IwHi6lzmXmp6xR8XY0fiIh7psAwh+3FuDkRHQVjl+a8lkXjo0kLUKH7XaV5oO86PmZ1FTzyP4K/XGl9v/zwfbW7BriiuETGCP5ch9bc9f97HF/vcFzCa5gdEPgWq+t/4v0V63oE1uF4h0DiFJ7HnSWMppDdh1dxtsPvJ2wcBNAKbsJXa0Ck5opdaBPsRNu/usba09i1KsaAVzmLt3sghrRjuK1Tf4xkegInxwy8gKf7dKMVH2QRsV5zXR/Cftyu+aKaKbbkQrsdH+PTzLzcqzkOQAVzM+7FHdiqqe2/YT4zF/t8S/sPmawyvC974vcAAAAASUVORK5CYII=" }, pan: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAJVSURBVFiFvZe7a1RBGMV/x2hWI4JpfKCIiSBKOoOCkID/wP4BFqIIFkE02ChIiC8QDKlSiI3YqRBsBVGwUNAUdiIEUgjiAzQIIsuKJsfizsXr5t7d+8jmwLDfzHz3nLOzc7+ZxTZlGyDgZiWOCuJ9wH2gCUyuqQFgF/AGcKJNrYkBYBj40CIet+muGQi/96kM4WS7C/Tm5VUg7whJg8BkEGkCR4BDYfodsADUgP6wErO5iCtswsuJb32hdbXy8qzL5TIdmzJinHdZoZIBZcSFkGlAKs1Z3YCketZcBtouuaQNkrblMiBpBrhme7mAgU4wMCvpcFsDkq4C54DFVRTH9h+i6vlE0r5UA5ImgCuh28jB28iIs7BIVCOeStoZD64P4uPAjUTygKSx2FsK2TIwkugfk9Qkfd/E+yMWHQCeSRqx/R3gOp3LazfaS2C4B5gHDgD7U9x3E3uAH7KNpC3AHHAwTL4FHgM9GQ8vAaPA0dB/Abxqk2/gBLA9MXba9r1k/d4LfA3JtwueBeM58ucS+edXnAW23wP10N3advEi9CXizTnyN4bPS7Zn4sH/dq3t18AY4e1YLYSy3g/csj2VnFshZPuOpOeSKHCodUINuGj7YetE6je1PV9QoNPJ9StNHKodx7nRbiWrGHBGXAi5DUiqtQwtpcWK0Jubt8CltA5MEV1IfwO7+VffPwGfia5m34CT4bXujIIX0Qna1/cGMNqV/wUJE2czxD8CQ4X5Sl7Jz7SILwCDpbjKPBRMHAd+EtX4HWV5Spdc2w8kDQGPbH8py/MXMygM69/FKz4AAAAASUVORK5CYII=" }, zoom: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAMqSURBVFiFvdfbj91TFMDxz57U6GUEMS1aYzyMtCSSDhWjCZMInpAI3khE/QHtgzdRkXgSCS8SES9epKLi0oRKNETjRahREq2KS1stdRujtDPtbA97n5zdn9+5zJxTK9k5v3POXmt991p7r71+IcaoGwkhTOIebMRqzOBTvIG3Y4zTXRmqSoyx5cAKbMJOHMFJnMZ8/jyFaXyMR7G6nb1aH22cP4BvcBxziG3GKfyTIR9D6BYg1KUghPBCDveFlb/24Av8iuUYw41YVsz5G7uxKcZ4aMEpwGt5NY3V/YbHsQ6rcAHOw/kYxigewr5CZw4fYGxBKcCLOFEYehXrMdRhr5yLETxVScsOLOkKAPfn1TYMPIvLFrShUlS2FDZm8XRHACzFAWl3R2xbqPMCYhmeLCAOYEMngAczbcTvuHYxzguIy/FesR9e6gSwU/OoPYHBHgHgviIKX2Flq7k34KhmcVnbi/PC8JX4MgMcxb118wZwdz5aISscqx7VRcox7MrPQ7i+btIAJrAkf9+bI9EPmZY2IAxiTSuAldLq4Y9+AcSUh78KP0tbAcwU35cXMD1JCIFUoGiehlqAz6TNB1f1C0DK+0h+nsNPrQC2a4bqGmlD9kOGcWt+Po6pVgDvSxfJaSkFd4UQBvoAsBYbCoB3a2flM7slA0R8iyt6rAFDeDPbm8eOTpVwGD9qVq7nLbIaZnmksPU1JtsCZMXNmpdRxFasWITzh6Xj3LCzra1OxcD2QjHiGVzdpfORnMqZio2PcF23ABdJF1Np4BPptlyPi6WzPYBzpJZtHe7A6xW9cnyP8TqA//SEIYRL8Bxul7rihvwgtVn78WcGGZXa9HGd5TDujDHuOePXNiHdKjWgZX/YbsxLx/ktqbjVzTlcjUSnvI5JrdlUVp6WesZZ6R1hRrpq9+EVTGS9jTjYAuKIouGpbcurEkIYxC051KNSamazsc+xK8b4S0VnEi/j0hqTP+M27O258egQwZuzs7pI7Mf4WQXIEDc5s9sux+5+1Py2EmP8UOq6GvWhIScxfdYjUERiAt9Jd84J6a16zf8JEKT3yCm8g1UxRv8CC4pyRhzR1uUAAAAASUVORK5CYII=" }, menu: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAgCAYAAAAbifjMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDcvMTUvMTTPsvU0AAAAP0lEQVRIie2SMQoAIBDDUvH/X667g8sJJ9KOhYYOkW0qGaU1MPdC0vGSbV19EACo3YMPAFH5BUBUjsqfAPpVXtNgGDfxEDCtAAAAAElFTkSuQmCC" } }; function setButtonState(chart, button, state) { if (button.getAttribute("state") !== state) { button.setAttribute("state", state); button.setAttribute("type", 'button'); button.style.position = "relative"; button.style.margin = "0px 0px 0px 0px"; button.style.padding = "3px 4px 0px 4px"; button.style.cssFloat = "left"; button.setAttribute("title", chart._cultureInfo[state + "Text"]); button.innerHTML = "" + chart._cultureInfo[state + "Text"] + ""; } } function show() { var element = null; for (var i = 0; i < arguments.length; i++) { element = arguments[i]; if (element.style) element.style.display = "inline"; } } function hide() { var element = null; for (var i = 0; i < arguments.length; i++) { element = arguments[i]; if (element && element.style) element.style.display = "none"; } } var isCanvasSupported = exports.isCanvasSupported = !!document.createElement("canvas").getContext; function getBezierPoints(points, tension) { var bezierPoints = []; for (var i = 0; i < points.length; i++) { if (i == 0) { bezierPoints.push(points[0]); continue; } var i1, i2, pointIndex; pointIndex = i - 1; i1 = pointIndex === 0 ? 0 : pointIndex - 1; i2 = pointIndex === points.length - 1 ? pointIndex : pointIndex + 1; var drv1 = { x: (points[i2].x - points[i1].x) / tension, y: (points[i2].y - points[i1].y) / tension }; var cp1 = { x: points[pointIndex].x + drv1.x / 3, y: points[pointIndex].y + drv1.y / 3 }; bezierPoints[bezierPoints.length] = cp1; pointIndex = i; i1 = pointIndex === 0 ? 0 : pointIndex - 1; i2 = pointIndex === points.length - 1 ? pointIndex : pointIndex + 1; var drv2 = { x: (points[i2].x - points[i1].x) / tension, y: (points[i2].y - points[i1].y) / tension }; var cp2 = { x: points[pointIndex].x - drv2.x / 3, y: points[pointIndex].y - drv2.y / 3 }; bezierPoints[bezierPoints.length] = cp2; bezierPoints[bezierPoints.length] = points[i]; } return bezierPoints; } function convertPercentToValue(input, referenceValue) { //input can be a number or string if (input === null || typeof input === "undefined") return referenceValue; var result = parseFloat(input.toString()) * (input.toString().indexOf("%") >= 0 ? referenceValue / 100 : 1); // limit to plot area if (!isNaN(result) && result <= referenceValue && result >= 0) return result; return referenceValue; } function drawRect(ctx, x1, y1, x2, y2, color, borderThickness, borderColor, top, bottom, left, right, fillOpacity) { if (typeof fillOpacity === "undefined") fillOpacity = 1; borderThickness = borderThickness || 0; borderColor = borderColor || "black"; //alert("top"+ top + "bottom" + bottom + " lt" + left+ "rt" + right ) var a1 = x1, a2 = x2, b1 = y1, b2 = y2, edgeY, edgeX; if (x2 - x1 > 15 && y2 - y1 > 15) var bevelDepth = 8;else var bevelDepth = 0.35 * Math.min(x2 - x1, y2 - y1); //alert(a1 + "" + a2); var color2 = "rgba(255, 255, 255, .4)"; var color3 = "rgba(255, 255, 255, 0.1)"; //color1 = "rgba(" + r + "," + g + ", " + b + ",1)"; var color1 = color; ctx.beginPath(); ctx.moveTo(x1, y1); ctx.save(); ctx.fillStyle = color1; ctx.globalAlpha = fillOpacity; ctx.fillRect(x1, y1, x2 - x1, y2 - y1); ctx.globalAlpha = 1; if (borderThickness > 0) { var offset = borderThickness % 2 === 0 ? 0 : .5; ctx.beginPath(); ctx.lineWidth = borderThickness; ctx.strokeStyle = borderColor; ctx.moveTo(x1, y1); ctx.rect(x1 - offset, y1 - offset, x2 - x1 + 2 * offset, y2 - y1 + 2 * offset); ctx.stroke(); } ctx.restore(); // ctx.beginPath(); if (top === true) { // alert(x1 + "" + x2 + " " + bevelDepth); ctx.save(); ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x1 + bevelDepth, y1 + bevelDepth); ctx.lineTo(x2 - bevelDepth, y1 + bevelDepth); ctx.lineTo(x2, y1); ctx.closePath(); var grd = ctx.createLinearGradient((x2 + x1) / 2, b1 + bevelDepth, (x2 + x1) / 2, b1); grd.addColorStop(0, color1); grd.addColorStop(1, color2); ctx.fillStyle = grd; ctx.fill(); // ctx.stroke(); ctx.restore(); } if (bottom === true) { ctx.save(); ctx.beginPath(); ctx.moveTo(x1, y2); ctx.lineTo(x1 + bevelDepth, y2 - bevelDepth); ctx.lineTo(x2 - bevelDepth, y2 - bevelDepth); ctx.lineTo(x2, y2); ctx.closePath(); var grd = ctx.createLinearGradient((x2 + x1) / 2, b2 - bevelDepth, (x2 + x1) / 2, b2); grd.addColorStop(0, color1); grd.addColorStop(1, color2); ctx.fillStyle = grd; // ctx.stroke(); ctx.fill(); ctx.restore(); } if (left === true) { // alert(x1) ctx.save(); ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x1 + bevelDepth, y1 + bevelDepth); ctx.lineTo(x1 + bevelDepth, y2 - bevelDepth); ctx.lineTo(x1, y2); ctx.closePath(); var grd = ctx.createLinearGradient(a1 + bevelDepth, (y2 + y1) / 2, a1, (y2 + y1) / 2); grd.addColorStop(0, color1); grd.addColorStop(1, color3); ctx.fillStyle = grd; ctx.fill(); // ctx.stroke(); ctx.restore(); } if (right === true) { ctx.save(); ctx.beginPath(); ctx.moveTo(x2, y1); ctx.lineTo(x2 - bevelDepth, y1 + bevelDepth); ctx.lineTo(x2 - bevelDepth, y2 - bevelDepth); ctx.lineTo(x2, y2); var grd = ctx.createLinearGradient(a2 - bevelDepth, (y2 + y1) / 2, a2, (y2 + y1) / 2); grd.addColorStop(0, color1); grd.addColorStop(1, color3); ctx.fillStyle = grd; grd.addColorStop(0, color1); grd.addColorStop(1, color3); ctx.fillStyle = grd; ctx.fill(); ctx.closePath(); // ctx.stroke(); ctx.restore(); } // } function drawSegment(ctx, center, radius, color, type, theta1, theta2, fillOpacity, percentInnerRadius) { if (typeof fillOpacity === "undefined") fillOpacity = 1; //IE8- FIX: In IE8- segment doesn't get draw if theta2 is equal to theta1 + 2*PI. if (!isCanvasSupported) { var theta2Mod = Number((theta2 % (2 * Math.PI)).toFixed(8)); var theta1Mod = Number((theta1 % (2 * Math.PI)).toFixed(8)); if (theta1Mod === theta2Mod) theta2 -= .0001; } ctx.save(); ctx.globalAlpha = fillOpacity; if (type === "pie") { ctx.beginPath(); ctx.moveTo(center.x, center.y); ctx.arc(center.x, center.y, radius, theta1, theta2, false); ctx.fillStyle = color; ctx.strokeStyle = "white"; ctx.lineWidth = 2; // ctx.shadowOffsetX = 2; // ctx.shadowOffsetY = 1; // ctx.shadowBlur = 2; // ctx.shadowColor = '#BFBFBF'; ctx.closePath(); //ctx.stroke(); ctx.fill(); } else if (type === "doughnut") { ctx.beginPath(); ctx.arc(center.x, center.y, radius, theta1, theta2, false); ctx.arc(center.x, center.y, percentInnerRadius * radius, theta2, theta1, true); ctx.closePath(); ctx.fillStyle = color; ctx.strokeStyle = "white"; ctx.lineWidth = 2; // shadow properties // ctx.shadowOffsetX = 1; // ctx.shadowOffsetY = 1; // ctx.shadowBlur = 1; // ctx.shadowColor = '#BFBFBF'; //grey shadow //ctx.stroke(); ctx.fill(); } ctx.globalAlpha = 1; ctx.restore(); }; },{}],40:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatDate = exports.formatNumber = exports.addCultureInfo = exports.addColorSet = undefined; exports.Chart = Chart; var _charts = require('../core/charts'); var _charts2 = _interopRequireDefault(_charts); var _culture_info = require('../core/culture_info'); var _culture_info2 = _interopRequireDefault(_culture_info); var _themes = require('../constants/themes'); var _culture = require('../constants/culture'); var _utils = require('../helpers/utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function Chart(containerId, options) { var _this = this; var _chart = new _charts2.default(containerId, options, this); this.render = function () { return _chart.render(_this.options); }; this.options = _chart._options; } /** * @preserve CanvasJS HTML5 & JavaScript Charts - v1.8.0 Beta 2 - http://canvasjs.com/ * CanvasJS Charts follows Dual Licensing Model as mentioned below. * * ---------------------Free for Non-Commercial Use-------------------- * * For non-commercial purposes you can use the software for free under Creative Commons Attribution-NonCommercial 3.0 License. Refer to the following link for further details on the same. * http://creativecommons.org/licenses/by-nc/3.0/deed.en_US * * ---------------------Commercial License-------------------- * Commercial use of CanvasJS requires you to purchase a license. Without a commercial license you can use it for evaluation purposes only. Please refer to the following link for further details. * http://canvasjs.com/ * **/ ; var addColorSet = exports.addColorSet = function addColorSet(name, colorSet) { _themes.colorSets[name] = colorSet; }; var addCultureInfo = exports.addCultureInfo = function addCultureInfo(name, cultureInfo) { _culture.cultures[name] = cultureInfo; }; var formatNumber = exports.formatNumber = function formatNumber(number, formatString, culture) { culture = culture || "en"; formatString = formatString || "#,##0.##"; if (!_culture.cultures[culture]) throw "Unknown Culture Name";else (0, _utils.numberFormat)(number, formatString, new _culture_info2.default(culture)); }; var formatDate = exports.formatDate = function formatDate(date, formatString, culture) { culture = culture || "en"; formatString = formatString || "DD MMM YYYY"; if (!_culture.cultures[culture]) throw "Unknown Culture Name";else (0, _utils.dateFormat)(date, formatString, new _culture_info2.default(culture)); }; Chart.version = "v1.8.2"; },{"../constants/culture":22,"../constants/themes":24,"../core/charts":28,"../core/culture_info":29,"../helpers/utils":39}]},{},[40])(40) }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvY2hhcnRzL2FyZWEuanMiLCJzcmMvY2hhcnRzL2Jhci5qcyIsInNyYy9jaGFydHMvYnViYmxlLmpzIiwic3JjL2NoYXJ0cy9jYW5kbGVzdGljay5qcyIsInNyYy9jaGFydHMvY29sdW1uLmpzIiwic3JjL2NoYXJ0cy9pbmRleC5qcyIsInNyYy9jaGFydHMvcGllLmpzIiwic3JjL2NoYXJ0cy9yYW5nZV9hcmVhLmpzIiwic3JjL2NoYXJ0cy9yYW5nZV9iYXIuanMiLCJzcmMvY2hhcnRzL3JhbmdlX2NvbHVtbi5qcyIsInNyYy9jaGFydHMvcmFuZ2Vfc3BsaW5lX2FyZWEuanMiLCJzcmMvY2hhcnRzL3NjYXR0ZXIuanMiLCJzcmMvY2hhcnRzL3NwbGluZS5qcyIsInNyYy9jaGFydHMvc3BsaW5lX2FyZWEuanMiLCJzcmMvY2hhcnRzL3N0YWNrZWRfYXJlYS5qcyIsInNyYy9jaGFydHMvc3RhY2tlZF9hcmVhXzEwMC5qcyIsInNyYy9jaGFydHMvc3RhY2tlZF9iYXIuanMiLCJzcmMvY2hhcnRzL3N0YWNrZWRfYmFyXzEwMC5qcyIsInNyYy9jaGFydHMvc3RhY2tlZF9jb2x1bW4uanMiLCJzcmMvY2hhcnRzL3N0YWNrZWRfY29sdW1uXzEwMC5qcyIsInNyYy9jaGFydHMvc3RlcF9hcmVhLmpzIiwic3JjL2NvbnN0YW50cy9jdWx0dXJlLmpzIiwic3JjL2NvbnN0YW50cy9vcHRpb25zLmpzIiwic3JjL2NvbnN0YW50cy90aGVtZXMuanMiLCJzcmMvY29yZS9hbmltYXRvci5qcyIsInNyYy9jb3JlL2F4aXMuanMiLCJzcmMvY29yZS9jYW52YXNqcy5qcyIsInNyYy9jb3JlL2NoYXJ0cy5qcyIsInNyYy9jb3JlL2N1bHR1cmVfaW5mby5qcyIsInNyYy9jb3JlL2RhdGFfc2VyaWVzLmpzIiwic3JjL2NvcmUvZXZlbnRfbWFuYWdlci5qcyIsInNyYy9jb3JlL2xheW91dF9tYW5hZ2VyLmpzIiwic3JjL2NvcmUvbGVnZW5kLmpzIiwic3JjL2NvcmUvdGV4dF9ibG9jay5qcyIsInNyYy9jb3JlL3RpdGxlLmpzIiwic3JjL2NvcmUvdG9vbHRpcC5qcyIsInNyYy9oZWxwZXJzL2FuaW1hdG9yLmpzIiwic3JjL2hlbHBlcnMvcmVuZGVyLmpzIiwic3JjL2hlbHBlcnMvdXRpbHMuanMiLCJzcmMvbWFpbi9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztrQkNLZSxVQUFVLFFBQVEsRUFBRTtBQUNsQyxLQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDOztBQUV4RCxLQUFJLGVBQWUsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDOztBQUV4RCxLQUFJLGVBQWUsSUFBSSxDQUFDLEVBQ3ZCLE9BQU87O0FBRVIsS0FBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7O0FBRTNDLEtBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO0FBQ2hELEtBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO0FBQ2hELEtBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQzs7QUFFakIsS0FBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUM3QixJQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7O0FBRVgsWUFuQk8saUJBQWlCLEVBb0J2QixRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7O0FBRWpCLElBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNoQixJQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNwRSxJQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7O0FBRVgsWUExQk8saUJB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QU0sR0FBRyxRQUFRLEdBQUcsQ0FBQyxBQUFDLEdBQUksUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLEFBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEcsUUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLFFBQVEsSUFBSSxDQUFDLENBQUM7QUFDNUIsUUFBSSxFQUFFLENBQUM7QUFDUCxRQUFJLEVBQUUsQ0FBQzs7QUFHUCxRQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3pCLFNBQUksTUFBTSxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztBQUUzRSxPQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNoQixPQUFFLEdBQUcsWUFBWSxHQUFHLE1BQU0sQ0FBQzs7QUFFM0Isb0JBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQSxBQUFDLENBQUM7S0FFakQsTUFBTTtBQUNOLFNBQUksTUFBTSxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztBQUUzRSxPQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNoQixPQUFFLEdBQUcsWUFBWSxHQUFHLE1BQU0sQ0FBQzs7QUFFM0Isb0JBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQSxBQUFDLENBQUM7S0FDakQ7O0FBR0QsU0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFHLFlBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVB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QUcsVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7O0FBQUMsQUFFMUQsS0FBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDOztBQUUzRCxRQUFLLENBQUMsZUFBZSxHQUFHO0FBQ3ZCLE1BQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUN6RCxDQUFBOztBQUVELFFBQUssQ0FBQyxZQUFZLEdBQUc7QUFDcEIsTUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUU7SUFDL0QsQ0FBQztHQUNGOzs7Ozs7OztBQUFBLEFBUUQsTUFBSSxNQUFNLEVBQUU7QUFDWCxLQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLEtBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkQsS0FBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDOztBQUFDLEFBRWxELEtBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzs7QUFFM0QsU0FBTSxDQUFDLGVBQWUsR0FBRztBQUN4QixNQUFF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QUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEFBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3RELFFBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7SUFFbEI7OztBQUFBLEFBR0QsT0FBSSxVQUFVLElBQUksVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUNyRSxTQUFTOztBQUVWLE9BQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ2hDLE1BQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLE1BQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDckQsTUFBTTtBQUNOLE1BQUUsQ0FBQyxDQUFDLElBQUssSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEdBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUksQ0FBQyxBQUFDLENBQUM7QUFDeEcsTUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxD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dkMsTUFBTTtBQUNOLFNBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7QUFDeEMsU0FBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztLQUN0Qzs7QUFFRCxRQUFJLEtBQUssR0FBRyxBQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQSxHQUFJLEVBQUUsR0FBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQUFBQyxDQUFDO0FBQzVFLFFBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDckIsUUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbEMsUUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQUFBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RELFFBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEI7OztBQUFBLEFBR0QsT0FBSSxVQUFVLElBQUksVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUNyRSxTQUFTOztBQUVWLFFBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEFBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQzs7QUFFckgsT0FBSSxJQUFJLENBQUMsVUFBVSxLQUFLLENBQUMsRUFBRTtBQUMxQixTQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLE1BQ0EsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBSSxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQUFBQyxDQUFDOztBQUVoRyxRQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUM3Qjs7QUFFRCxNQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7O0FBRWYsT0FBSSxDQUFDLGVBQWUsR0FBRyx5QkFBYyxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQzlDLEtBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDO0FBQzNCLEtBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7QUFDMUIsWUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTTtBQUNyQyxhQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHO0FBQ25DLFNBQUssRUFBRSxDQUFDLEVBQUU7QUFDVixRQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUs7QUFDaEIsbUJBQWUsRUFBRSxRQUFRO0FBQ3pCLFlBQVEsRUFBRSxJQUFJLENBQUMsYUFBYTtBQUM1QixjQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWU7QUFDaEMsY0FBVSxFQUFFLElBQUksQ0FBQyxlQUFlO0FBQ2hDLGFBQVMsRUFBRSxJQUFJLENBQUMsY0FBYztBQUM5QixhQUFTLEVBQUUsSUFBSSxDQUFDLGNBQWM7QUFDOUIsZ0JBQVksRUFBRSxLQUFLO0lBQ25CLENBQUMsQ0FBQzs7QUFFSCxPQUFJLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRTs7OztBQUFDLEFBSTlDLE9BQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEFBQUMsQ0FBQztBQUN0SCxPQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Ozs7Ozs7Ozs7R0FXakM7QUFYa0MsRUFZbkMsTUFDSSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssT0FBTyxFQUFFOztBQUdwQyxPQUFJLEtBQUssQ0FBQztBQUNWLE9BQUksRUFBRSxDQUFDOztBQUVQLFFBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM3QyxTQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFJLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQ2pGLFNBQVM7O0FBRVYsTUFBRSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRXBELFFBQUksQUFBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYyxLQUFLLE9BQU8sQUFBQyxFQUFFOztBQUU5SSxTQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFO0FBQzlCLGVBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzs7QUFFdEMsVUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztBQUN6QyxVQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO01BQ3ZDLE1BQU07QUFDTixVQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO0FBQ3hDLFVBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7TUFDdEM7O0FBRUQsU0FBSSxLQUFLLEdBQUcsQUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUEsR0FBSSxFQUFFLEdBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEFBQUMsQ0FBQztBQUM1RSxTQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3JCLFNBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2xDLFNBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEFBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN0RCxTQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBRWxCOzs7QUFBQSxBQUdELFFBQUksVUFBVSxJQUFJLFVBQVUsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDckUsU0FBUzs7QUFFVixTQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQzs7QUFBQyxB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S0FBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEtBQUssVUFBVSxFQUFFOztBQUUvRSxNQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTs7QUFFdkIsT0FBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQy9CLFFBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3RDLFFBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3RDLFFBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3ZDLFFBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ25CLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3ZDLFFBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ25CLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3ZDLFFBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ25CLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3hDLFFBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3hDLFFBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3hDLFFBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3hDLFFBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3hDLFFBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3hDLFFBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUks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QUMsQ0FBQyxBQUNyQyxJQUFJLGFBQWEsQ0FBRyxJQUFJLENBQUMsQUFFekIsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJO0FBQUMsQUFFN0IsR0FBSSxJQUFJLENBQUMsY0FBYyxDQUFFLENBQ3hCLFFBQVEsQ0FBQyxZQUFZLEdBQUcsVUE3ekIzQixZQUFZLEVBNnpCNEIsSUFBSSxDQUFDLEtBQUssQ0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQUFDOUQsUUFBUSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUNsRSxBQUVELEdBQUksUUFBUSxDQUFDLElBQUksS0FBSyxNQUFNLENBQzNCLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQ3RDLEdBQUksUUFBUSxDQUFDLElBQUksS0FBSyxVQUFVLENBQ3BDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQzFDLEdBQUksUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLENBQ2xDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQ3hDLEdBQUksUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLENBQ2xDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQ3hDLEdBQUksUUFBUSxDQUFDLElBQUksS0FBSyxLQUFLLENBQy9CLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQ3JDLEdBQUksUUFBUSxDQUFDLElBQUksS0FBSyxNQUFNLENBQ2hDLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQ3RDLEdBQUksUUFBUSxDQUFDLElBQUksS0FBSyxVQUFVLENBQ3BDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQzFDLEdBQUksUUFBUSxD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QUMsQUFDeEMsR0FBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FDekMsYUFBYSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsQUFFeEMsR0FBSSxVQUFVLEtBQUssSUFBSSxDQUN0QixTQUFTLEFBRVYsR0FBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FDekMsYUFBYSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsQUFDeEMsR0FBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FDekMsYUFBYSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FDeEMsQUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBRyxVQUFVLENBQUcsUUFBUSxDQUFDLENBQzFGOztBQUFBLENBSUQsQ0FBQSxBQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsdUJBQXVCLEdBQUcsU0FBVSxRQUFRLENBQUUsQ0FFN0QsR0FBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsSUFBSSxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDdkUsT0FBTyxBQUVSLElBQUksYUFBYSxDQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEFBQzVDLElBQUksYUFBYSxDQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEFBRTVDLElBQUksVUFBVSxDQUFFLFVBQVUsQ0FBQyxBQUMzQixJQUFJLFVBQVUsQ0FBRyxLQUFLLENBQUMsQUFFdkIsSUFBSSxzQkFBc0IsQ0FBRyxFQUFFLENBQUMsQUFDaEMsSUFBSSxzQkFBc0IsQ0FBRyxFQUFFLENBQUMsQUFFaEMsSUFBSyxJQUFJLENBQUMsQ0FBRyxDQUFDLENBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDM0QsSUFBSSxVQUFVLENBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUMxRCxJQUFJLENBQUMsQ0FBRyxDQUFDLENBQUMsQUFDVixJQUFJLG1CQUFtQixDQUFHLEtBQUssQ0FBQyxBQUNoQyxJQUFJLGtCQUFrQixDQUFHLEtBQUssQ0FBQyxBQUUvQixHQUFJLFVBQVUsQ0FBQyxhQUFhLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxhQUFhLEtBQUssV0FBVyxDQUFFLENBRXRGLElBQUksWUFBWSxDQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBRyxBQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FDL0ssSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFHLEFBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBRyxDQUFDLFFBQVEsQ0FBQyxBQUV0SSxJQUFJLFlBQVksQ0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUcsQUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQy9LLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBRyxBQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUcsUUFBUSxDQUFDLENBQ3JJLEFBR0QsR0FBSSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUUsQ0FDN0csVUFBVSxHQUFHLElBQUksQ0FBQyxDQUNsQixBQUVELElBQUssQ0FBQyxHQUFHLENBQUMsQ0FBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUUsQ0FBQyxFQUFFLEVBQUU7QUFHbEQsR0FBSSxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsQ0FBRSxDQUN0RCxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDL0IsQUFFRCxHQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBRSxDQUN2QyxVQUFVLEdBQUcsSUFBSSxDQUFDLEFBQ2xCLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUU7QUFBQyxDQUNsRCxLQUVBLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUV6QyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFJeEMsR0FBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FDakMsYUFBYSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsQUFDaEMsR0FBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FDakMsYUFBYSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsQUFFaEMsR0FBSSxDQUFDLEdBQUcsQ0FBQyxDQUFFLENBQ1YsSUFBSSxLQUFLLENBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUN4RCxLQUFLLEdBQUcsQ0FBQyxLQUFLLEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUEsQUFBQztBQUFDLEFBRWxDLEdBQUksYUFBYSxDQUFDLE9BQU8sR0FBRyxLQUFLLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBRSxDQUNqRCxhQUFhLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUM5QixBQUVELEdBQUksVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFFLENBQ25FLElBQUksS0FBSyxDQUFHLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFDeEQsS0FBSyxHQUFHLENBQUMsS0FBSyxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFBLEFBQUM7QUFBQyxBQUVsQyxHQUFJLGFBQWEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUUsQ0FDakQsYUFBYSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FDaEMsQ0FDQyxDQUNEO0FBQUEsQUFHRCxHQUFJLFVBQVUsR0FBRyxZQUFZLElBQUksQ0FBQyxtQkFBbUIsQ0FBRSxDQUN0RCxTQUFTLENBQ1QsS0FBTSxHQUFJLENBQUMsbUJBQW1CLENBQUUsQ0FDaEMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEFBRTNCLEdBQUksQ0FBQyxHQUFHLENBQUMsQ0FBRSxDQUNWLENBQUMsSUFBSSxDQUFDLENBQUMsQUFDUCxTQUFTLENBQ1QsQ0FDRDtBQUFBLEFBR0QsR0FBSSxVQUFVLEdBQUcsWUFBWSxJQUFJLENBQUMsa0JBQWtCLENBQUUsQ0FDckQsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLENBQzFCLEtBQU0sR0FBSSxVQUFVLEdBQUcsWUFBWSxJQUFJLGtCQUFrQixDQUFFLENBQzNELFNBQVMsQ0FDVCxBQUdELEdBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQ2pDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEFBRXBFLEdBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQ3pDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLEFBQ3hDLEdBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQ3pDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLEFBRXhDLEdBQUksVUFBVSxLQUFLLElBQUksQ0FDdEIsU0FBUyxBQUVWLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUcsQ0FBQyxDQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUEsR0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEFBRXpILEdBQUksVUFBVSxJQUFJLENBQUMsQ0FBRSxDQUNwQixHQUFJLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUNyQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsS0FFakQsc0JBQXNCLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQ2pELEtBQU0sQ0FDTixHQUFJLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUNyQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsS0FFakQsc0JBQXNCLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQ2pELENBQ0QsQUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBRyxVQUFVLENBQUcsUUFBUSxDQUFDLENBQzFGLEFBRUQsSUFBSyxDQUFDLElBQUksc0JBQXNCLEVBQUUsQ0FDakMsR0FBSSxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FDOUMsR0FBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FDYixTQUFTLENBQ1QsQUFDRCxJQUFJLElBQUksQ0FBRyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUVyQyxHQUFJLElBQUksR0FBRyxhQUFhLENBQUMsR0FBRyxDQUMzQixhQUFhLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxBQUUxQixHQUFJLElBQUksR0FBRyxhQUFhLENBQUMsR0FBRyxDQUMzQixhQUFhLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxBQUUxQixHQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsV0FBVyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsV0FBVyxDQUNqRSxTQUFTLEFBRVYsR0FBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FDbkMsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsQUFDbEMsR0FBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FDbkMsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FDbEMsQ0FFQSxBQUVELElBQUssQ0FBQyxJQUFJLHNCQUFzQixFQUFFLENBRWpDLEdBQUksc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQzlDLEdBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQ2IsU0FBUyxDQUNULEFBRUQsSUFBSSxJQUFJLENBQUcsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFFckMsR0FBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FDM0IsYUFBYSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQUFFMUIsR0FBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FDM0IsYUFBYSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQUFFMUIsR0FBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLFdBQVcsSUFBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FDakUsU0FBUyxBQUVWLEdBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQ25DLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEFBQ2xDLEdBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQ25DLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQ2xDLENBRUE7OztBQUFBLENBT0QsQ0FBQSxBQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsMEJBQTBCLEdBQUcsU0FBVSxRQUFRLENBQUUsQ0FDaEUsR0FBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsSUFBSSxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDdkUsT0FBTyxBQUVSLElBQUksYUFBYSxDQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEFBQzVDLElBQUksYUFBYSxDQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEFBRTVDLElBQUksVUFBVSxDQUFFLFVBQVUsQ0FBQyxBQUMzQixJQUFJLFVBQVUsQ0FBRyxLQUFLLENBQUMsQUFDdkIsSUFBSSxpQkFBaUIsQ0FBRyxLQUFLLENBQUMsQUFDOUIsSUFBSSxpQkFBaUIsQ0FBRyxLQUFLLENBQUMsQUFFOUIsSUFBSSxjQUFjLENBQUcsRUFBRSxDQUFDLEFBRXhCLElBQUssSUFBSSxDQUFDLENBQUcsQ0FBQyxDQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFFLENBQUMsRUFBRSxFQUFFLENBQzNELElBQUksVUFBVSxDQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFDMUQsSUFBSSxDQUFDLENBQUcsQ0FBQyxDQUFDLEFBQ1YsSUFBSSxtQkFBbUIsQ0FBRyxLQUFLLENBQUMsQUFDaEMsSUFBSSxrQkFBa0IsQ0FBRyxLQUFLLENBQUMsQUFFL0IsR0FBSSxVQUFVLENBQUMsYUFBYSxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsYUFBYSxLQUFLLFdBQVcsQ0FBRSxDQUV0RixJQUFJLFlBQVksQ0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUcsQUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQy9LLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBRyxBQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUcsQ0FBQyxRQUFRLENBQUMsQUFFdEksSUFBSSxZQUFZLENBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFHLEFBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUMvSyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUcsQUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFHLFFBQVEsQ0FBQyxDQUNySSxBQUdELEdBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFFLENBQzdHLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FDbEIsQUFFRCxJQUFLLENBQUMsR0FBRyxDQUFDLENBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFFLENBQUMsRUFBRSxFQUFFO0FBR2xELEdBQUksT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUUsQ0FDdEQsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQy9CLEFBRUQsR0FBSSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUUsQ0FDdkMsVUFBVSxHQUFHLElBQUksQ0FBQyxBQUNsQixVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO0FBQUMsQ0FDbEQsS0FFQSxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFFekMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEFBSXhDLEdBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQ2pDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEFBQ2hDLEdBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQ2pDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEFBRWhDLEdBQUksQ0FBQyxHQUFHLENBQUMsQ0FBRSxDQUNWLElBQUksS0FBSyxDQUFHLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFDeEQsS0FBSyxHQUFHLENBQUMsS0FBSyxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFBLEFBQUM7QUFBQyxBQUVsQyxH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SSxtQkFBbUIsQ0FBRyxLQUFLLENBQUMsQUFDaEMsSUFBSSxrQkFBa0IsQ0FBRyxLQUFLLENBQUMsQUFFL0IsR0FBSSxVQUFVLENBQUMsYUFBYSxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsYUFBYSxLQUFLLFdBQVcsQ0FBRSxDQUV0RixJQUFJLFlBQVksQ0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUcsQUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQy9LLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBRyxBQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUcsQ0FBQyxRQUFRLENBQUMsQUFFdEksSUFBSSxZQUFZLENBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFHLEFBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUMvSyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUcsQUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFHLFFBQVEsQ0FBQyxDQUNySSxBQUdELEdBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxD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LFNBQVMsQ0FBRSxVQUFVLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFFLEtBQUssQ0FBQyxDQUFDLENBRTFGLEFBRUQsR0FBSSxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUNsQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUUsRUFBRSxDQUFDLENBQUMsQ0FBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FJdkQsS0FDSSxHQUFJLElBQUksQ0FBQyxPQUFPLENBQUUsQ0FFdEIsSUFBSyxJQUFJLENBQUMsQ0FBRyxDQUFDLENBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFFLENBQUMsRUFBRSxFQUFFLENBQzdDLEdBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FDeEMsU0FBUyxBQUVWLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEFBQzdCLElBQUksTUFBTSxDQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQUFFL0IsR0FBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUUsQ0FDckYsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEFBRXRELEdBQUksSUFBSSxLQUFLLFdBQVcsSUFBSSxVQUFVLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBRSxDQUN4RCxLQUFLLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLEFBRXRDLEdBQUksSUFB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QUFHLElBQUksQ0FDckIsTUFBTSxDQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsTUFBTSxDQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsS0FBSyxDQUFHLElBQUksQ0FBQyxBQUVkLEdBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEtBQUssV0FBVyxDQUFFLENBQ2hELElBQUksSUFBSSxDQUFHLE1BQU0sQ0FBQyxBQUNsQixNQUFNLEdBQUcsTUFBTSxDQUFDLEFBQ2hCLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FDZCxBQUVELFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQUFDeEMsV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxBQUV4QyxHQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQSxBQUFDLENBQUUsQ0FDcEcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUNyQixLQUFNLEdBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBRSxDQUNqRCxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBQyxDQUNyQyxBQUVELEdBQUksQ0FBQyxBQUFDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQU0sSUFBSSxDQUFDLFVB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QVcsQ0FBQyxDQUNuQixDQUFBLEFBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsVUFBWSxDQUU3QyxJQUFJLFFBQVEsQ0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEFBRTdCLElBQUksS0FBSyxDQUFHLElBQUksQ0FBQyxLQUFLLENBQUcsSUFBSSxDQUFDLEtBQUssQ0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEFBRWxELEdBQUksUUFqd0VKLGlCQUFpQixBQWl3RUssS0FBSyxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQSxBQUFDLENBQUUsQ0FDL0QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDakQsQUFFRCxHQUFJLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFFLENBQ3hCLFFBQVEsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQUFDdkksUUFBUSxDQUFDLEVBQUUsR0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxBQUFDLENBQUMsQUFFcEksUUFBUSxDQUFDLEVBQUUsR0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFHLEtB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LEVBQUUsS0FBSyxFQUFFLENBQUM7V0FDcEIsQ0FBQztBQUNGLGNBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDaEIsTUFBTTtBQUNMLGFBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDckIsa0JBQVEsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUEsR0FBSSxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQ3pDOztBQUVELFlBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7O0FBRXJDLFlBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLO0FBQUMsQUFDN0IsWUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQzs7QUFBQyxBQUVyQixXQUFHLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsR0FBRyxVQUFVLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQSxBQUFDLElBQUksQUFBQyxJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFVBQVUsR0FBSSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUEsQUFBQyxHQUFHLENBQUMsQ0FBQSxBQUFDLENBQUMsQ0FBQztBQUMzUSxXQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7QUFFckIsWUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO09BQzlDO0tBQ0Y7O0FBRUQsUUFBSSxJQUFJLENBQUMsUUFBUSxLQUFL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Q0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7O0FBRTFILFVBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO0FBQ2xFLFVBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsVUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztBQUNuRyxVQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0tBQ3JHO0FBQ0QsYUFBUyxHQUFHLFNBQVMsR0FBRyxZQUFZLENBQUM7R0FDdEM7Ozs7Ozs7O0FBQUEsQUFRRCxXQUFTLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxD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R0FBRyxDQUFDLENBQUM7Q0FDdkI7O0FBRU0sU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsS0FBSSxHQUFHLEdBQUcsQUFBQyxDQUFDLElBQUksRUFBRSxHQUFLLENBQUMsSUFBSSxDQUFDLEFBQUMsR0FBSSxDQUFDLEFBQUMsQ0FBQzs7QUFFckMsUUFBTyxHQUFHLENBQUM7Q0FDWDs7QUFFTSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDN0IsS0FBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ2IsS0FBSSxDQUFDLEdBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFBLElBQUssRUFBRSxBQUFDLENBQUM7QUFDakMsS0FBSSxDQUFDLEdBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFBLElBQUssQ0FBQyxBQUFDLENBQUM7QUFDaEMsS0FBSSxDQUFDLEdBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFBLElBQUssQ0FBQyxBQUFDOzs7Ozs7QUFBQyxBQU1oQyxJQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsSUFBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNYLElBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0FBRVgsUUFBTyxHQUFHLENBQUM7Q0FDWDs7QUFFTSxTQUFTLFlBQVksQ0FBQyxjQUFHLEVBQWE7QUFDNUMsS0FBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7O0FBRTVCLEtBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsS0FBSSxHQUFHLEFBQUMsSUFBSSxHQUFHLENBQUMsR0FDWixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckIsS0FBSSxJQUFJLEdBQUcsQ0FBQyxFQUNYLElBQUksSUFB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QUc7QUFDUCxZQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBLEdBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQUEsQUFDckUsU0FBSyxJQUFJO0FBQ1IsWUFBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQSxHQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFBQSxBQUM3RSxTQUFLLEtBQUs7QUFDVCxZQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBLEdBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0FBQUEsQUFFN0c7QUFDQyxZQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0FBQUEsSUFFckM7R0FDRCxDQUFDLENBQUM7O0FBRUgsU0FBTyxNQUFNLENBQUM7RUFDZCxDQUFDO0NBQ0YsQ0FBQzs7QUFFSyxTQUFTLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRTtBQUNoRCxLQUFJLENBQUMsS0FBSyxJQUFJLEVBQ2IsT0FBTyxFQUFFLENBQUM7O0FBRVgsRUFBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEtBQUksVUFBVSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLEtB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QWdCLE9BQU8sQ0FBQyxDQUFDLENBQUM7Q0FFakUsQ0FBQzs7QUFFRixLQUFLLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJcbmltcG9ydCBSZW5kZXJIZWxwZXIgZnJvbSAnLi4vaGVscGVycy9yZW5kZXInO1xuaW1wb3J0IEFuaW1hdGlvbkhlbHBlciBmcm9tICcuLi9oZWxwZXJzL2FuaW1hdG9yJztcbmltcG9ydCB7aXNDYW52YXNTdXBwb3J0ZWQsIGdldExpbmVEYXNoQXJyYXksIGludFRvSGV4Q29sb3JTdHJpbmd9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAocGxvdFVuaXQpIHtcblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblxuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGdob3N0Q3R4ID0gdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4O1xuXG5cdHZhciBheGlzWFByb3BzID0gcGxvdFVuaXQuYXhpc1gubGluZUNvb3JkaW5hdGVzO1xuXHR2YXIgYXhpc1lQcm9wcyA9IHBsb3RVbml0LmF4aXNZLmxpbmVDb29yZGluYXRlcztcblx0dmFyIG1hcmtlcnMgPSBbXTtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXHRjdHguc2F2ZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRnaG9zdEN0eC5zYXZlKCk7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRjdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRjdHguY2xpcCgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdGdob3N0Q3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0XHRnaG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cblx0XHR2YXIgc2VyaWVzSWQgPSBkYXRhU2VyaWVzLmlkO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbc2VyaWVzSWRdID0ge1xuXHRcdFx0b2JqZWN0VHlwZTogXCJkYXRhU2VyaWVzXCIsIGRhdGFTZXJpZXNJbmRleDogZGF0YVNlcmllc0luZGV4XG5cdFx0fTtcblxuXHRcdHZhciBoZXhDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoc2VyaWVzSWQpO1xuXHRcdGdob3N0Q3R4LmZpbGxTdHlsZSA9IGhleENvbG9yO1xuXHRcdC8vZ2hvc3RDdHgubGluZVdpZHRoID0gZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzO1xuXHRcdC8vZ2hvc3RDdHgubGluZVdpZHRoID0gMjA7XG5cblx0XHRtYXJrZXJzID0gW107XG5cblx0XHR2YXIgaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgPSB0cnVlO1xuXHRcdHZhciBpID0gMCwgeCwgeTtcblx0XHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGJhY2sgYW5kIGZvcnRoLlxuXG5cdFx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0dmFyIGJhc2VZO1xuXG5cdFx0dmFyIHN0YXJ0UG9pbnQgPSBudWxsO1xuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly9jdHguc3Ryb2tlU3R5bGUgPSBcIiM0NTcyQTcgXCI7XG5cdFx0XHR2YXIgY29sb3IgPSBkYXRhU2VyaWVzLl9jb2xvclNldFtpICUgZGF0YVNlcmllcy5fY29sb3JTZXQubGVuZ3RoXTtcblx0XHRcdC8vY3R4LnN0cm9rZVN0eWxlID0gXCJyZWRcIjtcblx0XHRcdGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcblx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXHRcdFx0Y3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblxuXHRcdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheShkYXRhU2VyaWVzLmxpbmVEYXNoVHlwZSwgZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzKSk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBwcmV2RGF0YU51bGwgPSB0cnVlO1xuXHRcdFx0Zm9yICg7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lID8gZGF0YVBvaW50c1tpXS54LmdldFRpbWUoKSA6IGRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHR5cGVvZiAoZGF0YVBvaW50c1tpXS55KSAhPT0gXCJudW1iZXJcIikge1xuXHRcdFx0XHRcdGNsb3NlQXJlYSgpO1xuXG5cdFx0XHRcdFx0cHJldkRhdGFOdWxsID0gdHJ1ZTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5ID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnkgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXG5cdFx0XHRcdGlmIChpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSB8fCBwcmV2RGF0YU51bGwpIHtcblx0XHRcdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0Y3R4Lm1vdmVUbyh4LCB5KTtcblx0XHRcdFx0XHRzdGFydFBvaW50ID0ge1xuXHRcdFx0XHRcdFx0eDogeCwgeTogeVxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKHgsIHkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gZmFsc2U7XG5cdFx0XHRcdFx0cHJldkRhdGFOdWxsID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cblx0XHRcdFx0XHRjdHgubGluZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0aWYgKGkgJSAyNTAgPT0gMCkge1xuXHRcdFx0XHRcdFx0Y2xvc2VBcmVhKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4LCB5MTogeVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vUmVuZGVyIE1hcmtlclxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5tYXJrZXJTaXplICE9PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ubWFya2VyU2l6ZSA+IDAgfHwgZGF0YVNlcmllcy5tYXJrZXJTaXplID4gMCkge1xuXHRcdFx0XHRcdFx0dmFyIG1hcmtlclByb3BzID0gZGF0YVNlcmllcy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGksIHgsIHksIGN0eCk7XG5cdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2gobWFya2VyUHJvcHMpO1xuXG5cdFx0XHRcdFx0XHQvL2lmICghZGF0YVNlcmllcy5tYXhXaWR0aEluWCB8fCBtYXJrZXJQcm9wcy5zaXplID4gZGF0YVNlcmllcy5tYXhXaWR0aEluWCkge1xuXHRcdFx0XHRcdFx0Ly9cdGRhdGFTZXJpZXMubWF4V2lkdGhJblggPSBtYXJrZXJQcm9wcy5zaXplIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblx0XHRcdFx0XHRcdC8vfVxuXG5cdFx0XHRcdFx0XHR2YXIgbWFya2VyQ29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0eDogeCwgeTogeSwgY3R4OiBnaG9zdEN0eCxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBtYXJrZXJQcm9wcy50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdHNpemU6IG1hcmtlclByb3BzLnNpemUsXG5cdFx0XHRcdFx0XHRcdFx0Y29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlckNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJUaGlja25lc3M6IG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5pbmRleExhYmVsIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbCB8fCBkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWxGb3JtYXR0ZXIgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJhcmVhXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogeCwgeTogeVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55ID49IDAgPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRjb2xvcjogY29sb3Jcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNsb3NlQXJlYSgpO1xuXG5cdFx0XHQvL3N0YXJ0UG9pbnQgPSB7IHg6IHgsIHk6IHkgfTtcblx0XHRcdFJlbmRlckhlbHBlci5kcmF3TWFya2VycyhtYXJrZXJzKTtcblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlc3RvcmUoKTtcblxuXHRmdW5jdGlvbiBjbG9zZUFyZWEoKSB7XG5cblx0XHRpZiAoIXN0YXJ0UG9pbnQpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAoZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzID4gMClcblx0XHRcdGN0eC5zdHJva2UoKTtcblxuXHRcdGlmIChwbG90VW5pdC5heGlzWS52aWV3cG9ydE1pbmltdW0gPD0gMCAmJiBwbG90VW5pdC5heGlzWS52aWV3cG9ydE1heGltdW0gPj0gMCkge1xuXHRcdFx0YmFzZVkgPSB5WmVyb1RvUGl4ZWw7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHBsb3RVbml0LmF4aXNZLnZpZXdwb3J0TWF4aW11bSA8IDApXG5cdFx0XHRiYXNlWSA9IGF4aXNZUHJvcHMueTE7XG5cdFx0ZWxzZSBpZiAocGxvdFVuaXQuYXhpc1kudmlld3BvcnRNaW5pbXVtID4gMClcblx0XHRcdGJhc2VZID0gYXhpc1hQcm9wcy55MjtcblxuXHRcdGN0eC5saW5lVG8oeCwgYmFzZVkpO1xuXHRcdGN0eC5saW5lVG8oc3RhcnRQb2ludC54LCBiYXNlWSk7XG5cdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXG5cdFx0Y3R4Lmdsb2JhbEFscGhhID0gZGF0YVNlcmllcy5maWxsT3BhY2l0eTtcblx0XHRjdHguZmlsbCgpO1xuXHRcdGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cblx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdGdob3N0Q3R4LmxpbmVUbyh4LCBiYXNlWSk7XG5cdFx0XHRnaG9zdEN0eC5saW5lVG8oc3RhcnRQb2ludC54LCBiYXNlWSk7XG5cdFx0XHRnaG9zdEN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdGdob3N0Q3R4LmZpbGwoKTtcblx0XHR9XG5cblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4Lm1vdmVUbyh4LCB5KTtcblx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRnaG9zdEN0eC5tb3ZlVG8oeCwgeSk7XG5cblx0XHRzdGFydFBvaW50ID0ge1xuXHRcdFx0eDogeCwgeTogeVxuXHRcdH07XG5cdH1cblxuXHQvL3NvdXJjZSBhbmQgZGVzdCB3b3VsZCBiZSBzYW1lIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBlbmFibGVkXG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci54Q2xpcEFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcubGluZWFyLCBhbmltYXRpb25CYXNlOiAwXG5cdH07XG5cdHJldHVybiBhbmltYXRpb25JbmZvO1xufVxuIiwiXG5pbXBvcnQgQW5pbWF0aW9uSGVscGVyIGZyb20gJy4uL2hlbHBlcnMvYW5pbWF0b3InO1xuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZCwgZHJhd1JlY3QsIGludFRvSGV4Q29sb3JTdHJpbmd9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAocGxvdFVuaXQpIHtcblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblx0dmFyIHRvdGFsRGF0YVNlcmllcyA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblxuXHRpZiAodG90YWxEYXRhU2VyaWVzIDw9IDApXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBjb2xvciA9IG51bGw7XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblxuXHR2YXIgaSA9IDAsIHgsIHk7XG5cdHZhciBkYXRhUG9pbnRYOyAvL1VzZWQgc28gdGhhdCB3aGVuIGRhdGFQb2ludC54IGlzIGEgRGF0ZVRpbWUgdmFsdWUsIGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBudW1iZXIgZnJvbSBkYXRhVGltZSBldmVyeXRpbWUgaXQgaXMgdXNlZC5cblxuXHQvL0luIGNhc2Ugb2YgQmFyIENoYXJ0LCB5WmVyb1RvUGl4ZWwgaXMgeCBjby1vcmRpbmF0ZSFcblx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKSA8PCAwO1xuXG5cdHZhciBtYXhCYXJXaWR0aCA9IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggPyB0aGlzLmRhdGFQb2ludE1heFdpZHRoIDogTWF0aC5taW4oKHRoaXMuaGVpZ2h0ICogLjE1KSwgdGhpcy5wbG90QXJlYS5oZWlnaHQgLyBwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblx0dmFyIHhNaW5EaWZmID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8ubWluRGlmZjtcblx0Ly92YXIgYmFyV2lkdGggPSAoKChwbG90QXJlYS5oZWlnaHQgLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyB0b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblxuXHR2YXIgYmFyV2lkdGggPSAoKChwbG90QXJlYS5oZWlnaHQgLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyBwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblxuXHRpZiAoYmFyV2lkdGggPiBtYXhCYXJXaWR0aClcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXHRlbHNlIGlmICh4TWluRGlmZiA9PT0gSW5maW5pdHkpIHtcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoIC8gcGxvdFVuaXQucGxvdFR5cGUudG90YWxEYXRhU2VyaWVzICogLjk7XG5cdH0gZWxzZSBpZiAoYmFyV2lkdGggPCAxKVxuXHRcdGJhcldpZHRoID0gMTtcblxuXHRjdHguc2F2ZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXHRcdHZhciBpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IHRydWU7XG5cblxuXHRcdC8vZGF0YVNlcmllcy5tYXhXaWR0aEluWCA9IGJhcldpZHRoIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblxuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgeHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhKGRhdGFQb2ludHNbMF0ueCwgZGF0YVBvaW50c1swXS55KTtcblxuXHRcdFx0dmFyIGJldmVsRW5hYmxlZCA9IChiYXJXaWR0aCA+IDUpICYmIGRhdGFTZXJpZXMuYmV2ZWxFbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBcIiM0NTcyQTcgXCI7XG5cblx0XHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50c1tpXS5nZXRUaW1lID8gZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCkgOiBkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54O1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW4gfHwgZGF0YVBvaW50WCA+IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodHlwZW9mIChkYXRhUG9pbnRzW2ldLnkpICE9PSBcIm51bWJlclwiKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdC8veCBhbmQgeSBhcmUgcGl4ZWwgY28tb3JkaW5hdGVzIG9mIHBvaW50IGFuZCBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGggWCBhbmQgWSB2YWx1ZXNcblx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50WCAtIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludHNbaV0ueSAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cblxuXHRcdFx0XHR2YXIgeTEgPSAoeSAtIChwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiBiYXJXaWR0aCAvIDIpICsgKChwbG90VW5pdC5wcmV2aW91c0RhdGFTZXJpZXNDb3VudCArIGopICogYmFyV2lkdGgpKSA8PCAwO1xuXHRcdFx0XHR2YXIgeTIgPSB5MSArIGJhcldpZHRoIDw8IDA7XG5cdFx0XHRcdHZhciB4MTtcblx0XHRcdFx0dmFyIHgyO1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLnkgPj0gMCkge1xuXHRcdFx0XHRcdHgxID0geVplcm9Ub1BpeGVsO1xuXHRcdFx0XHRcdHgyID0geDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR4MSA9IHg7XG5cdFx0XHRcdFx0eDIgPSB5WmVyb1RvUGl4ZWw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL2RyYXdSZWN0KGN0eCwgeDEsIHkxLCBwbG90QXJlYS54MiwgeTIsIFwiI0VFRUVFRVwiLCAwLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG5cdFx0XHRcdC8vZHJhd1JlY3QoY3R4LCB4MSwgeTEsIHBsb3RBcmVhLngyLCB5MiwgXCIjQkRDRUQzXCIsIDAsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcblxuXHRcdFx0XHRjb2xvciA9IGRhdGFQb2ludHNbaV0uY29sb3IgPyBkYXRhUG9pbnRzW2ldLmNvbG9yIDogZGF0YVNlcmllcy5fY29sb3JTZXRbaSAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cdFx0XHRcdC8vY29sb3IgPSBcIiMxQjQ5NjJcIjtcblx0XHRcdFx0ZHJhd1JlY3QoY3R4LCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIDAsIG51bGwsIGJldmVsRW5hYmxlZCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZGF0YVNlcmllcy5maWxsT3BhY2l0eSk7XG5cblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5MlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRkcmF3UmVjdCh0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwiYmFyXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogZGF0YVBvaW50c1tpXS55ID49IDAgPyB4MiA6IHgxLCB5OiB5MSArICh5MiAtIHkxKSAvIDJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueSA+PSAwID8gMSA6IC0xLFxuXHRcdFx0XHRcdFx0Ym91bmRzOiB7XG5cdFx0XHRcdFx0XHRcdHgxOiBNYXRoLm1pbih4MSwgeDIpLCB5MTogeTEsIHgyOiBNYXRoLm1heCh4MSwgeDIpLCB5MjogeTJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRjb2xvcjogY29sb3Jcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0dmFyIGFuaW1hdGlvbkJhc2UgPSBNYXRoLm1heCh5WmVyb1RvUGl4ZWwsIHBsb3RVbml0LmF4aXNYLmJvdW5kaW5nUmVjdC54Mik7XG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci54U2NhbGVBbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmVhc2VPdXRRdWFydCwgYW5pbWF0aW9uQmFzZTogYW5pbWF0aW9uQmFzZVxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbiIsIlxuaW1wb3J0IFJlbmRlckhlbHBlciBmcm9tICcuLi9oZWxwZXJzL3JlbmRlcic7XG5pbXBvcnQgQW5pbWF0aW9uSGVscGVyIGZyb20gJy4uL2hlbHBlcnMvYW5pbWF0b3InO1xuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZCwgaW50VG9IZXhDb2xvclN0cmluZ30gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXG5cdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0dmFyIHRvdGFsRGF0YVNlcmllcyA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblxuXHRpZiAodG90YWxEYXRhU2VyaWVzIDw9IDApXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBjb2xvciA9IG51bGw7XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblxuXHR2YXIgaSA9IDAsIHgsIHk7XG5cdHZhciBkYXRhUG9pbnRYOyAvL1VzZWQgc28gdGhhdCB3aGVuIGRhdGFQb2ludC54IGlzIGEgRGF0ZVRpbWUgdmFsdWUsIGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBudW1iZXIgZnJvbSBkYXRhVGltZSBldmVyeXRpbWUgaXQgaXMgdXNlZC5cblxuXHR2YXIgeVplcm9Ub1BpeGVsID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqICgwIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkpIDw8IDA7XG5cblx0dmFyIG1heEJhcldpZHRoID0gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA/IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggOiB0aGlzLndpZHRoICogLjE1IDw8IDA7XG5cdHZhciB4TWluRGlmZiA9IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLm1pbkRpZmY7XG5cdHZhciBiYXJXaWR0aCA9ICgoKHBsb3RBcmVhLndpZHRoIC8gTWF0aC5hYnMocGxvdFVuaXQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gcGxvdFVuaXQuYXhpc1gudmlld3BvcnRNaW5pbXVtKSkgKiBNYXRoLmFicyh4TWluRGlmZikpIC8gdG90YWxEYXRhU2VyaWVzICogLjkpIDw8IDA7XG5cblxuXHRjdHguc2F2ZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHR2YXIgbWF4WiA9IC1JbmZpbml0eTtcblx0dmFyIG1pblogPSBJbmZpbml0eTtcblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblx0XHR2YXIgZGF0YVBvaW50cyA9IGRhdGFTZXJpZXMuZGF0YVBvaW50cztcblx0XHR2YXIgeiA9IDA7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0uZ2V0VGltZSA/IGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0aWYgKGRhdGFQb2ludFggPCBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbiB8fCBkYXRhUG9pbnRYID4gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0eXBlb2YgKGRhdGFQb2ludHNbaV0ueikgIT09IFwidW5kZWZpbmVkXCIpIHtcblxuXHRcdFx0XHR6ID0gZGF0YVBvaW50c1tpXS56O1xuXG5cdFx0XHRcdGlmICh6ID4gbWF4Wilcblx0XHRcdFx0XHRtYXhaID0gejtcblxuXHRcdFx0XHRpZiAoeiA8IG1pblopXG5cdFx0XHRcdFx0bWluWiA9IHo7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dmFyIG1pbkFyZWEgPSBNYXRoLlBJICogNSAqIDU7XG5cdHZhciBtYXhBcmVhID0gTWF0aC5tYXgoTWF0aC5wb3coTWF0aC5taW4ocGxvdEFyZWEuaGVpZ2h0LCBwbG90QXJlYS53aWR0aCkgKiAuMjUgLyAyLCAyKSAqIE1hdGguUEksIG1pbkFyZWEpO1xuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblxuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblxuXHRcdGlmIChkYXRhUG9pbnRzLmxlbmd0aCA9PSAxKVxuXHRcdFx0YmFyV2lkdGggPSBtYXhCYXJXaWR0aDtcblxuXHRcdGlmIChiYXJXaWR0aCA8IDEpXG5cdFx0XHRiYXJXaWR0aCA9IDE7XG5cdFx0ZWxzZSBpZiAoYmFyV2lkdGggPiBtYXhCYXJXaWR0aClcblx0XHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cblx0XHRpZiAoZGF0YVBvaW50cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL3ZhciB4eSA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uUGxvdEFyZWEoZGF0YVBvaW50c1swXS54LCBkYXRhUG9pbnRzWzBdLnkpO1xuXHRcdFx0Ly92YXIgYmV2ZWxFbmFibGVkID0gKGJhcldpZHRoID4gNSkgPyBmYWxzZSA6IGZhbHNlO1xuXG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBcIiM0NTcyQTcgXCI7XG5cblxuXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS5nZXRUaW1lID8gZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCkgOiBkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54O1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW4gfHwgZGF0YVBvaW50WCA+IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodHlwZW9mIChkYXRhUG9pbnRzW2ldLnkpICE9PSBcIm51bWJlclwiKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5ID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnkgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXG5cdFx0XHRcdHZhciB6ID0gZGF0YVBvaW50c1tpXS56O1xuXG5cdFx0XHRcdHZhciBhcmVhID0gKG1heFogPT09IG1pblopID8gbWF4QXJlYSAvIDIgOiBtaW5BcmVhICsgKG1heEFyZWEgLSBtaW5BcmVhKSAvIChtYXhaIC0gbWluWikgKiAoeiAtIG1pblopO1xuXHRcdFx0XHR2YXIgcmFkaXVzID0gTWF0aC5tYXgoTWF0aC5zcXJ0KGFyZWEgLyBNYXRoLlBJKSA8PCAwLCAxKTtcblxuXHRcdFx0XHR2YXIgbWFya2VyU2l6ZSA9IHJhZGl1cyAqIDI7XG5cdFx0XHRcdHZhciBtYXJrZXJQcm9wcyA9IGRhdGFTZXJpZXMuZ2V0TWFya2VyUHJvcGVydGllcyhpLCBjdHgpO1xuXHRcdFx0XHRtYXJrZXJQcm9wcy5zaXplID0gbWFya2VyU2l6ZTtcblxuXG5cdFx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IGRhdGFTZXJpZXMuZmlsbE9wYWNpdHk7XG5cdFx0XHRcdFJlbmRlckhlbHBlci5kcmF3TWFya2VyKHgsIHksIGN0eCwgbWFya2VyUHJvcHMudHlwZSwgbWFya2VyUHJvcHMuc2l6ZSwgbWFya2VyUHJvcHMuY29sb3IsIG1hcmtlclByb3BzLmJvcmRlckNvbG9yLCBtYXJrZXJQcm9wcy5ib3JkZXJUaGlja25lc3MpO1xuXHRcdFx0XHRjdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG5cdFx0XHRcdHZhciBpZCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2ldO1xuXHRcdFx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2lkXSA9IHtcblx0XHRcdFx0XHRpZDogaWQsIG9iamVjdFR5cGU6IFwiZGF0YVBvaW50XCIsIGRhdGFTZXJpZXNJbmRleDogZGF0YVNlcmllc0luZGV4LCBkYXRhUG9pbnRJbmRleDogaSwgeDE6IHgsIHkxOiB5LCBzaXplOiBtYXJrZXJTaXplXG5cdFx0XHRcdH07XG5cdFx0XHRcdHZhciBtYXJrZXJDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXHRcdFx0XHQvL1JlbmRlckhlbHBlci5kcmF3TWFya2VyKHgsIHksIHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eCwgbWFya2VyVHlwZSwgbWFya2VyU2l6ZSwgbWFya2VyQ29sb3IsIG1hcmtlckNvbG9yLCBkYXRhU2VyaWVzLm1hcmtlckJvcmRlclRoaWNrbmVzcyk7XG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRSZW5kZXJIZWxwZXIuZHJhd01hcmtlcih4LCB5LCB0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgsIG1hcmtlclByb3BzLnR5cGUsIG1hcmtlclByb3BzLnNpemUsIG1hcmtlckNvbG9yLCBtYXJrZXJDb2xvciwgbWFya2VyUHJvcHMuYm9yZGVyVGhpY2tuZXNzKTtcblxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpIHtcblxuXHRcdFx0XHRcdHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBcImJ1YmJsZVwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHlcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IDEsXG5cdFx0XHRcdFx0XHRib3VuZHM6IHtcblx0XHRcdFx0XHRcdFx0eDE6IHggLSBtYXJrZXJQcm9wcy5zaXplIC8gMiwgeTE6IHkgLSBtYXJrZXJQcm9wcy5zaXplIC8gMiwgeDI6IHggKyBtYXJrZXJQcm9wcy5zaXplIC8gMiwgeTI6IHkgKyBtYXJrZXJQcm9wcy5zaXplIC8gMlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y3R4LnJlc3RvcmUoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlc3RvcmUoKTtcblxuXHQvL3NvdXJjZSBhbmQgZGVzdCB3b3VsZCBiZSBzYW1lIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBlbmFibGVkXG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci5mYWRlSW5BbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmVhc2VJblF1YWQsIGFuaW1hdGlvbkJhc2U6IDBcblx0fTtcblx0cmV0dXJuIGFuaW1hdGlvbkluZm87XG59XG4iLCJcbmltcG9ydCB7aXNDYW52YXNTdXBwb3J0ZWR9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAocGxvdFVuaXQpIHtcblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblx0dmFyIGdob3N0Q3R4ID0gdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4O1xuXG5cdHZhciB0b3RhbERhdGFTZXJpZXMgPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7XG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGNvbG9yID0gbnVsbDtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdHZhciBpID0gMCwgeCwgeTEsIHkyLCB5MywgeTQ7XG5cdHZhciBkYXRhUG9pbnRYOyAvL1VzZWQgc28gdGhhdCB3aGVuIGRhdGFQb2ludC54IGlzIGEgRGF0ZVRpbWUgdmFsdWUsIGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBudW1iZXIgZnJvbSBkYXRhVGltZSBldmVyeXRpbWUgaXQgaXMgdXNlZC5cblxuXHR2YXIgeVplcm9Ub1BpeGVsID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqICgwIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkpIDw8IDA7XG5cblx0dmFyIG1heEJhcldpZHRoID0gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA/IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggOiAodGhpcy53aWR0aCAqIC4wMTUpO1xuXHR2YXIgeE1pbkRpZmYgPSBwbG90VW5pdC5heGlzWC5kYXRhSW5mby5taW5EaWZmO1xuXHR2YXIgYmFyV2lkdGggPSAoKChwbG90QXJlYS53aWR0aCAvIE1hdGguYWJzKHBsb3RVbml0LmF4aXNYLnZpZXdwb3J0TWF4aW11bSAtIHBsb3RVbml0LmF4aXNYLnZpZXdwb3J0TWluaW11bSkpICogTWF0aC5hYnMoeE1pbkRpZmYpKSAqIC43KSA8PCAwO1xuXG5cdGlmIChiYXJXaWR0aCA+IG1heEJhcldpZHRoKVxuXHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cdGVsc2UgaWYgKHhNaW5EaWZmID09PSBJbmZpbml0eSkge1xuXHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cdH0gZWxzZSBpZiAoYmFyV2lkdGggPCAxKVxuXHRcdGJhcldpZHRoID0gMTtcblxuXHRjdHguc2F2ZSgpO1xuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0Z2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRnaG9zdEN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0Z2hvc3RDdHguY2xpcCgpO1xuXHR9XG5cdC8vY3R4LmJlZ2luUGF0aCgpO1xuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblxuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblxuXG5cdFx0Ly8gUmVkdWNpbmcgcGl4ZWxQZXJVbml0IGJ5IDEganVzdCB0byBvdmVyY29tZSBhbnkgcHJvYmxlbXMgZHVlIHRvIHJvdW5kaW5nIG9mZiBvZiBwaXhlbHMuXG5cdFx0Ly9kYXRhU2VyaWVzLm1heFdpZHRoSW5YID0gYmFyV2lkdGggLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXG5cdFx0Ly92YXIgb2Zmc2V0WCA9IGJhcldpZHRoICogcGxvdFVuaXQuaW5kZXggPDwgMDtcblxuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgeHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhKGRhdGFQb2ludHNbMF0ueCwgZGF0YVBvaW50c1swXS55KTtcblxuXHRcdFx0dmFyIGJldmVsRW5hYmxlZCA9IChiYXJXaWR0aCA+IDUpICYmIGRhdGFTZXJpZXMuYmV2ZWxFbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdGRhdGFQb2ludHNbaV0uZ2V0VGltZSA/IGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ueSA9PT0gbnVsbCB8fCAhZGF0YVBvaW50c1tpXS55Lmxlbmd0aFxuXHRcdFx0XHRcdHx8IHR5cGVvZiAoZGF0YVBvaW50c1tpXS55WzBdKSAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgKGRhdGFQb2ludHNbaV0ueVsxXSkgIT09IFwibnVtYmVyXCJcblx0XHRcdFx0XHR8fCB0eXBlb2YgKGRhdGFQb2ludHNbaV0ueVsyXSkgIT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIChkYXRhUG9pbnRzW2ldLnlbM10pICE9PSBcIm51bWJlclwiKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5MSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55WzBdIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eTIgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludHNbaV0ueVsxXSAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cblx0XHRcdFx0eTMgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludHNbaV0ueVsyXSAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0XHRcdHk0ID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnlbM10gLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXG5cdFx0XHRcdHZhciB4MSA9ICh4IC0gYmFyV2lkdGggLyAyKSA8PCAwO1xuXHRcdFx0XHR2YXIgeDIgPSAoeDEgKyBiYXJXaWR0aCkgPDwgMDtcblxuXG5cdFx0XHRcdGNvbG9yID0gZGF0YVBvaW50c1tpXS5jb2xvciA/IGRhdGFQb2ludHNbaV0uY29sb3IgOiBkYXRhU2VyaWVzLl9jb2xvclNldFswXTtcblxuXG5cdFx0XHRcdC8vdmFyIGJvcmRlclRoaWNrbmVzcyA9IE1hdGgubWF4KDIsICgoYmFyV2lkdGggKiAuMSkgLyAyIDw8IDApICogMik7IC8vIFNldCBvbmx5IGV2ZW4gbnVtYmVycyBmb3IgYm9yZGVyXG5cdFx0XHRcdHZhciBib3JkZXJUaGlja25lc3MgPSBNYXRoLnJvdW5kKE1hdGgubWF4KDEsIChiYXJXaWR0aCAqIC4xNSkpKTtcblx0XHRcdFx0Ly9ib3JkZXJUaGlja25lc3MgPSAoYm9yZGVyVGhpY2tuZXNzIC8gMiA8PCAwKSAqIDI7XG5cdFx0XHRcdC8vYm9yZGVyVGhpY2tuZXNzID0gMjtcblx0XHRcdFx0dmFyIG9mZnNldCA9IGJvcmRlclRoaWNrbmVzcyAlIDIgPT09IDAgPyAwIDogLjU7XG5cblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5Mixcblx0XHRcdFx0XHR4MzogeCwgeTM6IHkzLCB4NDogeCwgeTQ6IHk0LCBib3JkZXJUaGlja25lc3M6IGJvcmRlclRoaWNrbmVzcywgY29sb3I6IGNvbG9yXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y3R4LnN0cm9rZVN0eWxlID0gY29sb3I7XG5cdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0Y3R4LmxpbmVXaWR0aCA9IGJvcmRlclRoaWNrbmVzcztcblx0XHRcdFx0Z2hvc3RDdHgubGluZVdpZHRoID0gTWF0aC5tYXgoYm9yZGVyVGhpY2tuZXNzLCA0KTtcblxuXHRcdFx0XHRpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImNhbmRsZXN0aWNrXCIpIHtcblxuXHRcdFx0XHRcdGN0eC5tb3ZlVG8oeCAtIG9mZnNldCwgeTIpO1xuXHRcdFx0XHRcdGN0eC5saW5lVG8oeCAtIG9mZnNldCwgTWF0aC5taW4oeTEsIHk0KSk7XG5cdFx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXHRcdFx0XHRcdGN0eC5tb3ZlVG8oeCAtIG9mZnNldCwgTWF0aC5tYXgoeTEsIHk0KSk7XG5cdFx0XHRcdFx0Y3R4LmxpbmVUbyh4IC0gb2Zmc2V0LCB5Myk7XG5cdFx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXG5cdFx0XHRcdFx0ZHJhd1JlY3QoY3R4LCB4MSwgTWF0aC5taW4oeTEsIHk0KSwgeDIsIE1hdGgubWF4KHkxLCB5NCksIGRhdGFQb2ludHNbaV0ueVswXSA8PSBkYXRhUG9pbnRzW2ldLnlbM10gPyBkYXRhU2VyaWVzLnJpc2luZ0NvbG9yIDogY29sb3IsIGJvcmRlclRoaWNrbmVzcywgY29sb3IsIGJldmVsRW5hYmxlZCwgYmV2ZWxFbmFibGVkLCBmYWxzZSwgZmFsc2UsIGRhdGFTZXJpZXMuZmlsbE9wYWNpdHkpO1xuXG5cblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdGNvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhpZCk7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oeCAtIG9mZnNldCwgeTIpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHggLSBvZmZzZXQsIE1hdGgubWluKHkxLCB5NCkpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHguc3Ryb2tlKCk7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oeCAtIG9mZnNldCwgTWF0aC5tYXgoeTEsIHk0KSk7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5saW5lVG8oeCAtIG9mZnNldCwgeTMpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHguc3Ryb2tlKCk7XG5cdFx0XHRcdFx0XHRkcmF3UmVjdChnaG9zdEN0eCwgeDEsIE1hdGgubWluKHkxLCB5NCksIHgyLCBNYXRoLm1heCh5MSwgeTQpLCBjb2xvciwgMCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwib2hsY1wiKSB7XG5cblx0XHRcdFx0XHRjdHgubW92ZVRvKHggLSBvZmZzZXQsIHkyKTtcblx0XHRcdFx0XHRjdHgubGluZVRvKHggLSBvZmZzZXQsIHkzKTtcblx0XHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cblx0XHRcdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0Y3R4Lm1vdmVUbyh4LCB5MSk7XG5cdFx0XHRcdFx0Y3R4LmxpbmVUbyh4MSwgeTEpO1xuXHRcdFx0XHRcdGN0eC5zdHJva2UoKTtcblxuXHRcdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRjdHgubW92ZVRvKHgsIHk0KTtcblx0XHRcdFx0XHRjdHgubGluZVRvKHgyLCB5NCk7XG5cdFx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cblx0XHRcdFx0XHRcdGNvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhpZCk7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oeCAtIG9mZnNldCwgeTIpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHggLSBvZmZzZXQsIHkzKTtcblx0XHRcdFx0XHRcdGdob3N0Q3R4LnN0cm9rZSgpO1xuXG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdGdob3N0Q3R4Lm1vdmVUbyh4LCB5MSk7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5saW5lVG8oeDEsIHkxKTtcblx0XHRcdFx0XHRcdGdob3N0Q3R4LnN0cm9rZSgpO1xuXG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdGdob3N0Q3R4Lm1vdmVUbyh4LCB5NCk7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5saW5lVG8oeDIsIHk0KTtcblx0XHRcdFx0XHRcdGdob3N0Q3R4LnN0cm9rZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpIHtcblxuXHRcdFx0XHRcdHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBkYXRhU2VyaWVzLnR5cGUsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogeDEgKyAoeDIgLSB4MSkgLyAyLCB5OiB5MlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogMSxcblx0XHRcdFx0XHRcdGJvdW5kczoge1xuXHRcdFx0XHRcdFx0XHR4MTogeDEsIHkxOiBNYXRoLm1pbih5MiwgeTMpLCB4MjogeDIsIHkyOiBNYXRoLm1heCh5MiwgeTMpXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGN0eC5yZXN0b3JlKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdGdob3N0Q3R4LnJlc3RvcmUoKTtcblxuXHQvL3NvdXJjZSBhbmQgZGVzdCB3b3VsZCBiZSBzYW1lIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBlbmFibGVkXG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci5mYWRlSW5BbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmVhc2VJblF1YWQsIGFuaW1hdGlvbkJhc2U6IDBcblx0fTtcblx0cmV0dXJuIGFuaW1hdGlvbkluZm87XG59XG4iLCJcbmltcG9ydCBBbmltYXRpb25IZWxwZXIgZnJvbSAnLi4vaGVscGVycy9hbmltYXRvcic7XG5pbXBvcnQge2lzQ2FudmFzU3VwcG9ydGVkLCBkcmF3UmVjdCwgaW50VG9IZXhDb2xvclN0cmluZ30gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXG5cdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0dmFyIHRvdGFsRGF0YVNlcmllcyA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblxuXHRpZiAodG90YWxEYXRhU2VyaWVzIDw9IDApXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBjb2xvciA9IG51bGw7XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblxuXHR2YXIgaSA9IDAsIHgsIHk7XG5cdHZhciBkYXRhUG9pbnRYOyAvL1VzZWQgc28gdGhhdCB3aGVuIGRhdGFQb2ludC54IGlzIGEgRGF0ZVRpbWUgdmFsdWUsIGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBudW1iZXIgZnJvbSBkYXRhVGltZSBldmVyeXRpbWUgaXQgaXMgdXNlZC5cblxuXHR2YXIgeVplcm9Ub1BpeGVsID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqICgwIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkpIDw8IDA7XG5cblx0dmFyIG1heEJhcldpZHRoID0gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA/IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggOiBNYXRoLm1pbigodGhpcy53aWR0aCAqIC4xNSksIHRoaXMucGxvdEFyZWEud2lkdGggLyBwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblx0dmFyIHhNaW5EaWZmID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8ubWluRGlmZjtcblx0dmFyIGJhcldpZHRoID0gKCgocGxvdEFyZWEud2lkdGggLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyBwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblxuXHRpZiAoYmFyV2lkdGggPiBtYXhCYXJXaWR0aClcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXHRlbHNlIGlmICh4TWluRGlmZiA9PT0gSW5maW5pdHkpIHtcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoIC8gcGxvdFVuaXQucGxvdFR5cGUudG90YWxEYXRhU2VyaWVzICogLjk7XG5cdH0gZWxzZSBpZiAoYmFyV2lkdGggPCAxKVxuXHRcdGJhcldpZHRoID0gMTtcblxuXHRjdHguc2F2ZSgpO1xuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnNhdmUoKTtcblxuXHRjdHguYmVnaW5QYXRoKCk7XG5cdGN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdGN0eC5jbGlwKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguY2xpcCgpO1xuXHR9XG5cdC8vY3R4LmJlZ2luUGF0aCgpO1xuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblxuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblxuXG5cdFx0Ly8gUmVkdWNpbmcgcGl4ZWxQZXJVbml0IGJ5IDEganVzdCB0byBvdmVyY29tZSBhbnkgcHJvYmxlbXMgZHVlIHRvIHJvdW5kaW5nIG9mZiBvZiBwaXhlbHMuXG5cdFx0Ly9kYXRhU2VyaWVzLm1heFdpZHRoSW5YID0gYmFyV2lkdGggLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXG5cdFx0Ly92YXIgb2Zmc2V0WCA9IGJhcldpZHRoICogcGxvdFVuaXQuaW5kZXggPDwgMDtcblxuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgeHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhKGRhdGFQb2ludHNbMF0ueCwgZGF0YVBvaW50c1swXS55KTtcblxuXHRcdFx0dmFyIGJldmVsRW5hYmxlZCA9IChiYXJXaWR0aCA+IDUpICYmIGRhdGFTZXJpZXMuYmV2ZWxFbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdGRhdGFQb2ludHNbaV0uZ2V0VGltZSA/IGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHR5cGVvZiAoZGF0YVBvaW50c1tpXS55KSAhPT0gXCJudW1iZXJcIilcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR4ID0gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRYIC0gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXHRcdFx0XHR2YXIgeDEgPSB4IC0gKHBsb3RVbml0LnBsb3RUeXBlLnRvdGFsRGF0YVNlcmllcyAqIGJhcldpZHRoIC8gMikgKyAoKHBsb3RVbml0LnByZXZpb3VzRGF0YVNlcmllc0NvdW50ICsgaikgKiBiYXJXaWR0aCkgPDwgMDtcblx0XHRcdFx0dmFyIHgyID0geDEgKyBiYXJXaWR0aCA8PCAwO1xuXHRcdFx0XHR2YXIgeTE7XG5cdFx0XHRcdHZhciB5MjtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS55ID49IDApIHtcblx0XHRcdFx0XHR5MSA9IHk7XG5cblx0XHRcdFx0XHR5MiA9IHlaZXJvVG9QaXhlbDtcblxuXHRcdFx0XHRcdGlmICh5MSA+IHkyKSB7XG5cdFx0XHRcdFx0XHR2YXIgdGVtcCA9IHkxO1xuXHRcdFx0XHRcdFx0eTEgPSB5Mjtcblx0XHRcdFx0XHRcdHkyID0geTE7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0eTIgPSB5O1xuXG5cdFx0XHRcdFx0eTEgPSB5WmVyb1RvUGl4ZWw7XG5cblx0XHRcdFx0XHRpZiAoeTEgPiB5Mikge1xuXHRcdFx0XHRcdFx0dmFyIHRlbXAgPSB5MTtcblx0XHRcdFx0XHRcdHkxID0geTI7XG5cdFx0XHRcdFx0XHR5MiA9IHkxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbG9yID0gZGF0YVBvaW50c1tpXS5jb2xvciA/IGRhdGFQb2ludHNbaV0uY29sb3IgOiBkYXRhU2VyaWVzLl9jb2xvclNldFtpICUgZGF0YVNlcmllcy5fY29sb3JTZXQubGVuZ3RoXTtcblx0XHRcdFx0ZHJhd1JlY3QoY3R4LCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIDAsIG51bGwsIGJldmVsRW5hYmxlZCAmJiAoZGF0YVBvaW50c1tpXS55ID49IDApLCAoZGF0YVBvaW50c1tpXS55IDwgMCkgJiYgYmV2ZWxFbmFibGVkLCBmYWxzZSwgZmFsc2UsIGRhdGFTZXJpZXMuZmlsbE9wYWNpdHkpO1xuXG5cdFx0XHRcdC8vaWYgKGRhdGFTZXJpZXMubWFya2VyVHlwZSAmJiBkYXRhU2VyaWVzLm1hcmtlclNpemUgPiAwKSB7XG5cdFx0XHRcdC8vICAgIFJlbmRlckhlbHBlci5kcmF3TWFya2VyKHgxICsgKHgyIC0geDEpIC8gMiwgeSwgY3R4LCBkYXRhU2VyaWVzLm1hcmtlclR5cGUsIGRhdGFTZXJpZXMubWFya2VyU2l6ZSwgY29sb3IsIGRhdGFTZXJpZXMubWFya2VyQm9yZGVyQ29sb3IsIGRhdGFTZXJpZXMubWFya2VyQm9yZGVyVGhpY2tuZXNzID8gZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJUaGlja25lc3MgOiAxKTtcblx0XHRcdFx0Ly99XG5cblx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbaV07XG5cdFx0XHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuXHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBpLCB4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTJcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRjb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0ZHJhd1JlY3QodGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIDAsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5pbmRleExhYmVsIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbCB8fCBkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWxGb3JtYXR0ZXIgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJjb2x1bW5cIixcblx0XHRcdFx0XHRcdGRhdGFQb2ludDogZGF0YVBvaW50c1tpXSxcblx0XHRcdFx0XHRcdGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMsXG5cdFx0XHRcdFx0XHRwb2ludDoge1xuXHRcdFx0XHRcdFx0XHR4OiB4MSArICh4MiAtIHgxKSAvIDIsIHk6IGRhdGFQb2ludHNbaV0ueSA+PSAwID8geTEgOiB5MlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55ID49IDAgPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRib3VuZHM6IHtcblx0XHRcdFx0XHRcdFx0eDE6IHgxLCB5MTogTWF0aC5taW4oeTEsIHkyKSwgeDI6IHgyLCB5MjogTWF0aC5tYXgoeTEsIHkyKVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0dmFyIGFuaW1hdGlvbkJhc2UgPSBNYXRoLm1pbih5WmVyb1RvUGl4ZWwsIHBsb3RVbml0LmF4aXNZLmJvdW5kaW5nUmVjdC55Mik7XG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci55U2NhbGVBbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmVhc2VPdXRRdWFydCwgYW5pbWF0aW9uQmFzZTogYW5pbWF0aW9uQmFzZVxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbiIsImV4cG9ydCBTcGxpbmVDaGFydCBmcm9tICcuLi9jaGFydHMvc3BsaW5lJztcbmV4cG9ydCBDb2x1bW5DaGFydCBmcm9tICcuLi9jaGFydHMvY29sdW1uJztcbmV4cG9ydCBTdGFja2VkQ29sdW1uQ2hhcnQgZnJvbSAnLi4vY2hhcnRzL3N0YWNrZWRfY29sdW1uJztcbmV4cG9ydCBTdGFja2VkQ29sdW1uMTAwQ2hhcnQgZnJvbSAnLi4vY2hhcnRzL3N0YWNrZWRfY29sdW1uXzEwMCc7XG5leHBvcnQgQmFyQ2hhcnQgZnJvbSAnLi4vY2hhcnRzL2Jhcic7XG5leHBvcnQgU3RhY2tlZEJhckNoYXJ0IGZyb20gJy4uL2NoYXJ0cy9zdGFja2VkX2Jhcic7XG5leHBvcnQgU3RhY2tlZEJhcjEwMENoYXJ0IGZyb20gJy4uL2NoYXJ0cy9zdGFja2VkX2Jhcl8xMDAnO1xuZXhwb3J0IEFyZWFDaGFydCBmcm9tICcuLi9jaGFydHMvYXJlYSc7XG5leHBvcnQgU3BsaW5lQXJlYUNoYXJ0IGZyb20gJy4uL2NoYXJ0cy9zcGxpbmVfYXJlYSc7XG5leHBvcnQgU3RlcEFyZWFDaGFydCBmcm9tICcuLi9jaGFydHMvc3RlcF9hcmVhJztcbmV4cG9ydCBTdGFja2VkQXJlYUNoYXJ0IGZyb20gJy4uL2NoYXJ0cy9zdGFja2VkX2FyZWEnO1xuZXhwb3J0IFN0YWNrZWRBcmVhMTAwQ2hhcnQgZnJvbSAnLi4vY2hhcnRzL3N0YWNrZWRfYXJlYV8xMDAnO1xuZXhwb3J0IEJ1YmJsZUNoYXJ0IGZyb20gJy4uL2NoYXJ0cy9idWJibGUnO1xuZXhwb3J0IFNjYXR0ZXJDaGFydCBmcm9tICcuLi9jaGFydHMvc2NhdHRlcic7XG5leHBvcnQgQ2FuZGxlc3RpY2tDaGFydCBmcm9tICcuLi9jaGFydHMvY2FuZGxlc3RpY2snO1xuZXhwb3J0IFJhbmdlQ29sdW1uQ2hhcnQgZnJvbSAnLi4vY2hhcnRzL3JhbmdlX2NvbHVtbic7XG5leHBvcnQgUmFuZ2VCYXJDaGFydCBmcm9tICcuLi9jaGFydHMvcmFuZ2VfYmFyJztcbmV4cG9ydCBSYW5nZUFyZWFDaGFydCBmcm9tICcuLi9jaGFydHMvcmFuZ2VfYXJlYSc7XG5leHBvcnQgUmFuZ2VTcGxpbmVBcmVhQ2hhcnQgZnJvbSAnLi4vY2hhcnRzL3JhbmdlX3NwbGluZV9hcmVhJztcbmV4cG9ydCBQaWVDaGFydCBmcm9tICcuLi9jaGFydHMvcGllJztcbiIsIlxuaW1wb3J0IFRleHRCbG9jayBmcm9tICcuLi9jb3JlL3RleHRfYmxvY2snO1xuaW1wb3J0IHtjb252ZXJ0UGVyY2VudFRvVmFsdWUsIGlzQ2FudmFzU3VwcG9ydGVkLCBkcmF3U2VnbWVudCwgZ2V0TGluZURhc2hBcnJheX0gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXG5cdHZhciBfdGhpcyA9IHRoaXM7XG5cdHZhciB0b3RhbERhdGFTZXJpZXMgPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7XG5cblx0aWYgKHRvdGFsRGF0YVNlcmllcyA8PSAwKVxuXHRcdHJldHVybjtcblxuXHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbMF07XG5cdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXHR2YXIgaW5kZXhMYWJlbExpbmVFZGdlTGVuZ3RoID0gMTA7XG5cdHZhciBleHBsb2RlRHVyYXRpb24gPSA1MDA7XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblxuXHQvL3ZhciBtYXhGcmFtZSA9IGlzQ2FudmFzU3VwcG9ydGVkID8gMzAwIDogNDtcblx0Ly92YXIgdG90YWxSZWN1cnNpb25zID0gMDtcblx0dmFyIGRhdGFQb2ludEVPcyA9IFtdOyAvL2RhdGFQb2ludCBFeHRlbnNpb24gT2JqZWN0cyBCZWhhdmVzIGxpa2UgYSBzdG9yYWdlIHBsYWNlIGZvciBhbGwgYWRkaXRpb25hbCBkYXRhIHJlbGF0aW5nIHRvIGRhdGFQb2ludHMuIFJlcXVyZWQgYmVjYXVzZSBhY3R1YWwgZGF0YVBvaW50cyBzaG91bGQgbm90IGJlIG1vZGlmaWVkLlxuXG5cdHZhciBtaW5EaXN0YW5jZUJldHdlZW5MYWJlbHMgPSAyO1xuXHR2YXIgaW5kZXhMYWJlbFJhZGl1c1RvUmFkaXVzUmF0aW8gPSAxLjM7XG5cdHZhciBwb2xlQW5nbHVsYXJEaXN0YW5jZSA9ICgyMCAvIDE4MCkgKiBNYXRoLlBJOyAvL0FuZ2x1bGFyIERpc3RhbmNlIGZyb20gOTAgJiAyNzAgdG8gYmUgY29uc2lkZXJlZCBwb2xlXG5cdHZhciBwcmVjaXNpb24gPSA2O1xuXG5cdHZhciBjZW50ZXIgPSB7XG5cdFx0eDogKHBsb3RBcmVhLngyICsgcGxvdEFyZWEueDEpIC8gMiwgeTogKHBsb3RBcmVhLnkyICsgcGxvdEFyZWEueTEpIC8gMlxuXHR9O1xuXG5cdHZhciBzdW0gPSAwO1xuXHR2YXIgaXNJbmRleExhYmVsUHJlc2VudCA9IGZhbHNlO1xuXHRmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFQb2ludHMubGVuZ3RoOyBqKyspIHtcblx0XHRzdW0gKz0gTWF0aC5hYnMoZGF0YVBvaW50c1tqXS55KTtcblxuXHRcdGlmICghaXNJbmRleExhYmVsUHJlc2VudCAmJiB0eXBlb2YgKGRhdGFQb2ludHNbal0uaW5kZXhMYWJlbCkgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YVBvaW50c1tqXS5pbmRleExhYmVsICE9PSBudWxsICYmIGRhdGFQb2ludHNbal0uaW5kZXhMYWJlbC50b1N0cmluZygpLmxlbmd0aCA+IDApXG5cdFx0XHRpc0luZGV4TGFiZWxQcmVzZW50ID0gdHJ1ZTtcblxuXHRcdGlmICghaXNJbmRleExhYmVsUHJlc2VudCAmJiB0eXBlb2YgKGRhdGFQb2ludHNbal0ubGFiZWwpICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGFQb2ludHNbal0ubGFiZWwgIT09IG51bGwgJiYgZGF0YVBvaW50c1tqXS5sYWJlbC50b1N0cmluZygpLmxlbmd0aCA+IDApXG5cdFx0XHRpc0luZGV4TGFiZWxQcmVzZW50ID0gdHJ1ZTtcblx0fVxuXG5cdGlmIChzdW0gPT09IDApXG5cdFx0cmV0dXJuO1xuXG5cdGlzSW5kZXhMYWJlbFByZXNlbnQgPSBpc0luZGV4TGFiZWxQcmVzZW50IHx8ICh0eXBlb2YgKGRhdGFTZXJpZXMuaW5kZXhMYWJlbCkgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YVNlcmllcy5pbmRleExhYmVsICE9PSBudWxsICYmIGRhdGFTZXJpZXMuaW5kZXhMYWJlbC50b1N0cmluZygpLmxlbmd0aCA+IDApO1xuXG5cdHZhciBvdXRlclJhZGl1cyA9IGRhdGFTZXJpZXMuaW5kZXhMYWJlbFBsYWNlbWVudCAhPT0gXCJpbnNpZGVcIiAmJiBpc0luZGV4TGFiZWxQcmVzZW50ID8gKE1hdGgubWluKHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpICogMC43NSkgLyAyIDogKE1hdGgubWluKHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpICogLjkyKSAvIDI7XG5cblx0aWYgKGRhdGFTZXJpZXMucmFkaXVzKVxuXHRcdG91dGVyUmFkaXVzID0gY29udmVydFBlcmNlbnRUb1ZhbHVlKGRhdGFTZXJpZXMucmFkaXVzLCBvdXRlclJhZGl1cyk7XG5cblxuXHR2YXIgaW5uZXJSYWRpdXMgPSAodHlwZW9mIGRhdGFTZXJpZXMuaW5uZXJSYWRpdXMgIT09ICd1bmRlZmluZWQnICYmIGRhdGFTZXJpZXMuaW5uZXJSYWRpdXMgIT09IG51bGwpID8gY29udmVydFBlcmNlbnRUb1ZhbHVlKGRhdGFTZXJpZXMuaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzKSA6IDAuNyAqIG91dGVyUmFkaXVzO1xuXG5cdHZhciBwZXJjZW50SW5uZXJSYWRpdXMgPSBNYXRoLm1pbihpbm5lclJhZGl1cyAvIG91dGVyUmFkaXVzLCAob3V0ZXJSYWRpdXMgLSAxKSAvIG91dGVyUmFkaXVzKTtcblxuXHRmdW5jdGlvbiBpbml0TGFiZWxzKCkge1xuXG5cdFx0aWYgKCFkYXRhU2VyaWVzIHx8ICFkYXRhUG9pbnRzKVxuXHRcdFx0cmV0dXJuO1xuXG5cblx0XHR2YXIgbm9EUE5lYXJTb3V0aFBvbGUgPSAwO1xuXHRcdHZhciBub0RQTmVhck5vcnRoUG9sZSA9IDA7XG5cdFx0dmFyIGZpcnN0RFBDbG9zZVRvU291dGggPSAwO1xuXHRcdHZhciBmaXJzdERQQ2xvc2VUb05vcnRoID0gMDtcblxuXHRcdGZvciAoaiA9IDA7IGogPCBkYXRhUG9pbnRzLmxlbmd0aDsgaisrKSB7XG5cblx0XHRcdHZhciBkYXRhUG9pbnQgPSBkYXRhUG9pbnRzW2pdO1xuXHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbal07XG5cblx0XHRcdHZhciBkYXRhUG9pbnRFTyA9IHtcblx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhUG9pbnRJbmRleDogaiwgZGF0YVNlcmllc0luZGV4OiAwXG5cdFx0XHR9O1xuXHRcdFx0ZGF0YVBvaW50RU9zLnB1c2goZGF0YVBvaW50RU8pO1xuXG5cdFx0XHR2YXIgcGVyY2VudEFuZFRvdGFsID0ge1xuXHRcdFx0XHRwZXJjZW50OiBudWxsLCB0b3RhbDogbnVsbFxuXHRcdFx0fTtcblx0XHRcdHZhciBmb3JtYXR0ZXJQYXJhbWV0ZXIgPSBudWxsO1xuXG5cdFx0XHRwZXJjZW50QW5kVG90YWwgPSBfdGhpcy5nZXRQZXJjZW50QW5kVG90YWwoZGF0YVNlcmllcywgZGF0YVBvaW50KTtcblxuXHRcdFx0aWYgKGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhUG9pbnQuaW5kZXhMYWJlbEZvcm1hdHRlcilcblx0XHRcdFx0Zm9ybWF0dGVyUGFyYW1ldGVyID0ge1xuXHRcdFx0XHRcdGNoYXJ0OiBfdGhpcy5fb3B0aW9ucywgZGF0YVNlcmllczogZGF0YVNlcmllcywgZGF0YVBvaW50OiBkYXRhUG9pbnQsIHRvdGFsOiBwZXJjZW50QW5kVG90YWwudG90YWwsIHBlcmNlbnQ6IHBlcmNlbnRBbmRUb3RhbC5wZXJjZW50XG5cdFx0XHRcdH07XG5cblx0XHRcdHZhciBpbmRleExhYmVsVGV4dCA9IGRhdGFQb2ludC5pbmRleExhYmVsRm9ybWF0dGVyID8gZGF0YVBvaW50LmluZGV4TGFiZWxGb3JtYXR0ZXIoZm9ybWF0dGVyUGFyYW1ldGVyKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiBkYXRhUG9pbnQuaW5kZXhMYWJlbCA/IF90aGlzLnJlcGxhY2VLZXl3b3Jkc1dpdGhWYWx1ZShkYXRhUG9pbnQuaW5kZXhMYWJlbCwgZGF0YVBvaW50LCBkYXRhU2VyaWVzLCBqKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIgPyBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIoZm9ybWF0dGVyUGFyYW1ldGVyKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiBkYXRhU2VyaWVzLmluZGV4TGFiZWwgPyBfdGhpcy5yZXBsYWNlS2V5d29yZHNXaXRoVmFsdWUoZGF0YVNlcmllcy5pbmRleExhYmVsLCBkYXRhUG9pbnQsIGRhdGFTZXJpZXMsIGopIDogZGF0YVBvaW50LmxhYmVsID8gZGF0YVBvaW50LmxhYmVsIDogJyc7XG5cblxuXHRcdFx0X3RoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0gZGF0YVBvaW50RU87XG5cblx0XHRcdC8vZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHQgPSBqLnRvU3RyaW5nKCkgKyBcIiBcIiArIFwia2luZ2Zpc2hlcjogXCIgKyBkYXRhUG9pbnQueS50b1N0cmluZygpOztcblx0XHRcdGRhdGFQb2ludEVPLmNlbnRlciA9IHtcblx0XHRcdFx0eDogY2VudGVyLngsIHk6IGNlbnRlci55XG5cdFx0XHR9O1xuXHRcdFx0ZGF0YVBvaW50RU8ueSA9IGRhdGFQb2ludC55O1xuXHRcdFx0ZGF0YVBvaW50RU8ucmFkaXVzID0gb3V0ZXJSYWRpdXM7XG5cdFx0XHRkYXRhUG9pbnRFTy5wZXJjZW50SW5uZXJSYWRpdXMgPSBwZXJjZW50SW5uZXJSYWRpdXM7XG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dCA9IGluZGV4TGFiZWxUZXh0O1xuXHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbFBsYWNlbWVudCA9IGRhdGFTZXJpZXMuaW5kZXhMYWJlbFBsYWNlbWVudDtcblx0XHRcdGRhdGFQb2ludEVPLmluZGV4TGFiZWxMaW5lQ29sb3IgPSBkYXRhUG9pbnQuaW5kZXhMYWJlbExpbmVDb2xvciA/IGRhdGFQb2ludC5pbmRleExhYmVsTGluZUNvbG9yIDogZGF0YVNlcmllcy5pbmRleExhYmVsTGluZUNvbG9yID8gZGF0YVNlcmllcy5pbmRleExhYmVsTGluZUNvbG9yIDogZGF0YVBvaW50LmNvbG9yID8gZGF0YVBvaW50LmNvbG9yIDogZGF0YVNlcmllcy5fY29sb3JTZXRbaiAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsTGluZVRoaWNrbmVzcyA9IGRhdGFQb2ludC5pbmRleExhYmVsTGluZVRoaWNrbmVzcyA/IGRhdGFQb2ludC5pbmRleExhYmVsTGluZVRoaWNrbmVzcyA6IGRhdGFTZXJpZXMuaW5kZXhMYWJlbExpbmVUaGlja25lc3M7XG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsTGluZURhc2hUeXBlID0gZGF0YVBvaW50LmluZGV4TGFiZWxMaW5lRGFzaFR5cGUgPyBkYXRhUG9pbnQuaW5kZXhMYWJlbExpbmVEYXNoVHlwZSA6IGRhdGFTZXJpZXMuaW5kZXhMYWJlbExpbmVEYXNoVHlwZTtcblx0XHRcdGRhdGFQb2ludEVPLmluZGV4TGFiZWxGb250Q29sb3IgPSBkYXRhUG9pbnQuaW5kZXhMYWJlbEZvbnRDb2xvciA/IGRhdGFQb2ludC5pbmRleExhYmVsRm9udENvbG9yIDogZGF0YVNlcmllcy5pbmRleExhYmVsRm9udENvbG9yO1xuXHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbEZvbnRTdHlsZSA9IGRhdGFQb2ludC5pbmRleExhYmVsRm9udFN0eWxlID8gZGF0YVBvaW50LmluZGV4TGFiZWxGb250U3R5bGUgOiBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb250U3R5bGU7XG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsRm9udFdlaWdodCA9IGRhdGFQb2ludC5pbmRleExhYmVsRm9udFdlaWdodCA/IGRhdGFQb2ludC5pbmRleExhYmVsRm9udFdlaWdodCA6IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvbnRXZWlnaHQ7XG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsRm9udFNpemUgPSBkYXRhUG9pbnQuaW5kZXhMYWJlbEZvbnRTaXplID8gZGF0YVBvaW50LmluZGV4TGFiZWxGb250U2l6ZSA6IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvbnRTaXplO1xuXHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbEZvbnRGYW1pbHkgPSBkYXRhUG9pbnQuaW5kZXhMYWJlbEZvbnRGYW1pbHkgPyBkYXRhUG9pbnQuaW5kZXhMYWJlbEZvbnRGYW1pbHkgOiBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb250RmFtaWx5O1xuXHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbEJhY2tncm91bmRDb2xvciA9IGRhdGFQb2ludC5pbmRleExhYmVsQmFja2dyb3VuZENvbG9yID8gZGF0YVBvaW50LmluZGV4TGFiZWxCYWNrZ3JvdW5kQ29sb3IgOiBkYXRhU2VyaWVzLmluZGV4TGFiZWxCYWNrZ3JvdW5kQ29sb3IgPyBkYXRhU2VyaWVzLmluZGV4TGFiZWxCYWNrZ3JvdW5kQ29sb3IgOiBudWxsO1xuXHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbE1heFdpZHRoID0gZGF0YVBvaW50LmluZGV4TGFiZWxNYXhXaWR0aCA/IGRhdGFQb2ludC5pbmRleExhYmVsTWF4V2lkdGggOiBkYXRhU2VyaWVzLmluZGV4TGFiZWxNYXhXaWR0aCA/IGRhdGFTZXJpZXMuaW5kZXhMYWJlbE1heFdpZHRoIDogcGxvdEFyZWEud2lkdGggKiAuMzM7XG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsV3JhcCA9IHR5cGVvZiAoZGF0YVBvaW50LmluZGV4TGFiZWxXcmFwKSAhPT0gXCJ1bmRlZmluZWRcIiA/IGRhdGFQb2ludC5pbmRleExhYmVsV3JhcCA6IGRhdGFTZXJpZXMuaW5kZXhMYWJlbFdyYXA7XG5cblx0XHRcdGRhdGFQb2ludEVPLnN0YXJ0QW5nbGUgPSBqID09PSAwID8gZGF0YVNlcmllcy5zdGFydEFuZ2xlID8gKGRhdGFTZXJpZXMuc3RhcnRBbmdsZSAvIDE4MCkgKiBNYXRoLlBJIDogMCA6IGRhdGFQb2ludEVPc1tqIC0gMV0uZW5kQW5nbGU7XG5cblx0XHRcdGRhdGFQb2ludEVPLnN0YXJ0QW5nbGUgPSAoZGF0YVBvaW50RU8uc3RhcnRBbmdsZSArICgyICogTWF0aC5QSSkpICUgKDIgKiBNYXRoLlBJKTtcblxuXHRcdFx0ZGF0YVBvaW50RU8uZW5kQW5nbGUgPSBkYXRhUG9pbnRFTy5zdGFydEFuZ2xlICsgKCgyICogTWF0aC5QSSAvIHN1bSkgKiBNYXRoLmFicyhkYXRhUG9pbnQueSkpO1xuXG5cdFx0XHQvL3ZhciBtaWRBbmdsZSA9IGRhdGFQb2ludEVPLnN0YXJ0QW5nbGUgKyBNYXRoLmFicyhkYXRhUG9pbnRFTy5lbmRBbmdsZSAtIGRhdGFQb2ludEVPLnN0YXJ0QW5nbGUpIC8gMjtcblx0XHRcdHZhciBtaWRBbmdsZSA9IChkYXRhUG9pbnRFTy5lbmRBbmdsZSArIGRhdGFQb2ludEVPLnN0YXJ0QW5nbGUpIC8gMjtcblxuXHRcdFx0Ly92YXIgbWlkQW5nbGUgPSAoMTgwIC8gTWF0aC5QSSAqIG1pZEFuZ2xlKTtcblxuXHRcdFx0bWlkQW5nbGUgPSAobWlkQW5nbGUgKyAoMiAqIE1hdGguUEkpKSAlICgyICogTWF0aC5QSSk7XG5cblx0XHRcdGRhdGFQb2ludEVPLm1pZEFuZ2xlID0gbWlkQW5nbGU7XG5cblx0XHRcdGlmIChkYXRhUG9pbnRFTy5taWRBbmdsZSA+IChNYXRoLlBJIC8gMikgLSBwb2xlQW5nbHVsYXJEaXN0YW5jZSAmJiBkYXRhUG9pbnRFTy5taWRBbmdsZSA8IChNYXRoLlBJIC8gMikgKyBwb2xlQW5nbHVsYXJEaXN0YW5jZSkge1xuXHRcdFx0XHRpZiAobm9EUE5lYXJTb3V0aFBvbGUgPT09IDAgfHwgZGF0YVBvaW50RU9zW2ZpcnN0RFBDbG9zZVRvU291dGhdLm1pZEFuZ2xlID4gZGF0YVBvaW50RU8ubWlkQW5nbGUpXG5cdFx0XHRcdFx0Zmlyc3REUENsb3NlVG9Tb3V0aCA9IGo7XG5cblx0XHRcdFx0bm9EUE5lYXJTb3V0aFBvbGUrKztcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGRhdGFQb2ludEVPLm1pZEFuZ2xlID4gKDMgKiBNYXRoLlBJIC8gMikgLSBwb2xlQW5nbHVsYXJEaXN0YW5jZSAmJiBkYXRhUG9pbnRFTy5taWRBbmdsZSA8ICgzICogTWF0aC5QSSAvIDIpICsgcG9sZUFuZ2x1bGFyRGlzdGFuY2UpIHtcblx0XHRcdFx0aWYgKG5vRFBOZWFyTm9ydGhQb2xlID09PSAwIHx8IGRhdGFQb2ludEVPc1tmaXJzdERQQ2xvc2VUb05vcnRoXS5taWRBbmdsZSA+IGRhdGFQb2ludEVPLm1pZEFuZ2xlKVxuXHRcdFx0XHRcdGZpcnN0RFBDbG9zZVRvTm9ydGggPSBqO1xuXG5cdFx0XHRcdG5vRFBOZWFyTm9ydGhQb2xlKys7XG5cdFx0XHR9XG5cblxuXHRcdFx0aWYgKG1pZEFuZ2xlID4gKE1hdGguUEkgLyAyKSAmJiBtaWRBbmdsZSA8PSAoMyAqIE1hdGguUEkgLyAyKSlcblx0XHRcdFx0ZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9IFwibGVmdFwiO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID0gXCJyaWdodFwiO1xuXG5cdFx0XHQvL2RhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0ID0gai50b1N0cmluZygpICsgXCI7IFwiICsgZGF0YVBvaW50LnkudG9TdHJpbmcoKSArIFwiOyBcIiArIG1pZEFuZ2xlLnRvU3RyaW5nKCkgKyBcIjsganVua1wiO1xuXHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jayA9IG5ldyBUZXh0QmxvY2soX3RoaXMucGxvdEFyZWEuY3R4LCB7XG5cdFx0XHRcdGZvbnRTaXplOiBkYXRhUG9pbnRFTy5pbmRleExhYmVsRm9udFNpemUsIGZvbnRGYW1pbHk6IGRhdGFQb2ludEVPLmluZGV4TGFiZWxGb250RmFtaWx5LCBmb250Q29sb3I6IGRhdGFQb2ludEVPLmluZGV4TGFiZWxGb250Q29sb3IsXG5cdFx0XHRcdGZvbnRTdHlsZTogZGF0YVBvaW50RU8uaW5kZXhMYWJlbEZvbnRTdHlsZSwgZm9udFdlaWdodDogZGF0YVBvaW50RU8uaW5kZXhMYWJlbEZvbnRXZWlnaHQsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogXCJsZWZ0XCIsXG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjogZGF0YVBvaW50RU8uaW5kZXhMYWJlbEJhY2tncm91bmRDb2xvcixcblx0XHRcdFx0bWF4V2lkdGg6IGRhdGFQb2ludEVPLmluZGV4TGFiZWxNYXhXaWR0aCwgbWF4SGVpZ2h0OiBkYXRhUG9pbnRFTy5pbmRleExhYmVsV3JhcCA/IGRhdGFQb2ludEVPLmluZGV4TGFiZWxGb250U2l6ZSAqIDUgOiBkYXRhUG9pbnRFTy5pbmRleExhYmVsRm9udFNpemUgKiAxLjUsXG5cdFx0XHRcdHRleHQ6IGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0LFxuXHRcdFx0XHRwYWRkaW5nOiAwLFxuXHRcdFx0XHQvL3RleHRCYXNlbGluZTogZGF0YVBvaW50RU8uaW5kZXhMYWJlbEJhY2tncm91bmRDb2xvciA/IFwibWlkZGxlXCIgOiBcInRvcFwiXG5cdFx0XHRcdHRleHRCYXNlbGluZTogXCJ0b3BcIlxuXHRcdFx0fSk7XG5cblx0XHRcdGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2subWVhc3VyZVRleHQoKTtcblxuXHRcdFx0Ly9kYXRhUG9pbnQubGFiZWxXaWR0aCA9IGN0eC5tZWFzdXJlVGV4dChqLnRvU3RyaW5nKCkgKyBcIjsgXCIgKyBkYXRhUG9pbnQubGFiZWwpLndpZHRoO1xuXG5cdFx0XHQvL2NvbnNvbGUubG9nKGRhdGFQb2ludC5sYWJlbCk7XG5cdFx0fVxuXG5cdFx0dmFyIG5vT2ZEUFRvUmlnaHRPZlNvdXRoUG9sZSA9IDA7XG5cdFx0dmFyIG5vT2ZEUFRvTGVmdE9mTm9ydGhQb2xlID0gMDtcblx0XHR2YXIga2VlcFNhbWVEaXJlY3Rpb24gPSBmYWxzZTsgLy8gb25jZSBhIGRhdGFQb2ludCdzIGhlbWlzcGhlcmUgaXMgY2hhbmdlZCwgb3RoZXJzIHNob3VsZCBmb2xsb3cgdGhlIHNhbWUgc28gdGhhdCB0aGVyZSBhcmUgbm8gbGFiZXMgbmVhciBwb2xlIHBvaW50aW5nIGluIG9wcG9zaXRlIGRpcmVjdGlvbi5cblxuXHRcdGZvciAoaiA9IDA7IGogPCBkYXRhUG9pbnRzLmxlbmd0aDsgaisrKSB7XG5cblx0XHRcdHZhciBkYXRhUG9pbnRFTyA9IGRhdGFQb2ludEVPc1soZmlyc3REUENsb3NlVG9Tb3V0aCArIGopICUgZGF0YVBvaW50cy5sZW5ndGhdO1xuXG5cdFx0XHRpZiAobm9EUE5lYXJTb3V0aFBvbGUgPiAxICYmIGRhdGFQb2ludEVPLm1pZEFuZ2xlID4gKE1hdGguUEkgLyAyKSAtIHBvbGVBbmdsdWxhckRpc3RhbmNlICYmIGRhdGFQb2ludEVPLm1pZEFuZ2xlIDwgKE1hdGguUEkgLyAyKSArIHBvbGVBbmdsdWxhckRpc3RhbmNlKSB7XG5cblx0XHRcdFx0aWYgKG5vT2ZEUFRvUmlnaHRPZlNvdXRoUG9sZSA8PSBub0RQTmVhclNvdXRoUG9sZSAvIDIgJiYgIWtlZXBTYW1lRGlyZWN0aW9uKSB7XG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9IFwicmlnaHRcIjtcblx0XHRcdFx0XHRub09mRFBUb1JpZ2h0T2ZTb3V0aFBvbGUrKztcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID0gXCJsZWZ0XCI7XG5cdFx0XHRcdFx0a2VlcFNhbWVEaXJlY3Rpb24gPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0a2VlcFNhbWVEaXJlY3Rpb24gPSBmYWxzZTtcblx0XHRmb3IgKGogPSAwOyBqIDwgZGF0YVBvaW50cy5sZW5ndGg7IGorKykge1xuXG5cdFx0XHR2YXIgZGF0YVBvaW50RU8gPSBkYXRhUG9pbnRFT3NbKGZpcnN0RFBDbG9zZVRvTm9ydGggKyBqKSAlIGRhdGFQb2ludHMubGVuZ3RoXTtcblxuXHRcdFx0Ly9pZiAoZGF0YVBvaW50LmhlbWlzcGhlcmUgPSBcInJpZ2h0XCIpXG5cdFx0XHQvL1x0YnJlYWs7XG5cblx0XHRcdGlmIChub0RQTmVhck5vcnRoUG9sZSA+IDEgJiYgZGF0YVBvaW50RU8ubWlkQW5nbGUgPiAoMyAqIE1hdGguUEkgLyAyKSAtIHBvbGVBbmdsdWxhckRpc3RhbmNlICYmIGRhdGFQb2ludEVPLm1pZEFuZ2xlIDwgKDMgKiBNYXRoLlBJIC8gMikgKyBwb2xlQW5nbHVsYXJEaXN0YW5jZSkge1xuXG5cdFx0XHRcdGlmIChub09mRFBUb0xlZnRPZk5vcnRoUG9sZSA8PSBub0RQTmVhck5vcnRoUG9sZSAvIDIgJiYgIWtlZXBTYW1lRGlyZWN0aW9uKSB7XG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9IFwibGVmdFwiO1xuXHRcdFx0XHRcdG5vT2ZEUFRvTGVmdE9mTm9ydGhQb2xlKys7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9IFwicmlnaHRcIjtcblx0XHRcdFx0XHRrZWVwU2FtZURpcmVjdGlvbiA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0vL0VuZCBvZiBpbml0TGFiZWxzKClcblxuXHRmdW5jdGlvbiByZW5kZXJMYWJlbHMoKSB7XG5cblx0XHR2YXIgY3R4ID0gX3RoaXMucGxvdEFyZWEuY3R4O1xuXHRcdGN0eC5maWxsU3R5bGUgPSBcImJsYWNrXCI7XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gXCJncmV5XCI7XG5cdFx0dmFyIGZvbnRTaXplID0gMTY7XG5cdFx0Ly9jdHguZm9udCA9IGZvbnRTaXplICsgXCJweCBBcmlhbFwiO1xuXHRcdGN0eC50ZXh0QmFzZWxpbmUgPSBcIm1pZGRsZVwiO1xuXHRcdGN0eC5saW5lSm9pbiA9IFwicm91bmRcIjtcblx0XHR2YXIgaSA9IDAsIGogPSAwO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBkYXRhUG9pbnRFTyA9IGRhdGFQb2ludEVPc1tpXTtcblxuXHRcdFx0aWYgKCFkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dClcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSAtPSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDI7XG5cblx0XHRcdHZhciB4T2Zmc2V0ID0gMDtcblxuXHRcdFx0aWYgKGRhdGFQb2ludEVPLmhlbWlzcGhlcmUgPT09IFwibGVmdFwiKSB7XG5cdFx0XHRcdHZhciB4T2Zmc2V0ID0gZGF0YVNlcmllcy5pbmRleExhYmVsUGxhY2VtZW50ICE9PSBcImluc2lkZVwiID8gLShkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLndpZHRoICsgaW5kZXhMYWJlbExpbmVFZGdlTGVuZ3RoKSA6IC1kYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLndpZHRoIC8gMjtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHR2YXIgeE9mZnNldCA9IGRhdGFTZXJpZXMuaW5kZXhMYWJlbFBsYWNlbWVudCAhPT0gXCJpbnNpZGVcIiA/IGluZGV4TGFiZWxMaW5lRWRnZUxlbmd0aCA6IC1kYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLndpZHRoIC8gMjtcblx0XHRcdH1cblxuXHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay54ICs9IHhPZmZzZXQ7XG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnJlbmRlcih0cnVlKTtcblx0XHRcdGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueCAtPSB4T2Zmc2V0O1xuXG5cdFx0XHQvL2lmIChpIDwgNClcblx0XHRcdC8vXHRjdXN0b21Qcm9tcHQoaSArIFwiOyBcIiArIGNlbnRlci55ICsgXCI7IFwiICsgZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55LnRvRml4ZWQoMikpO1xuXG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgKz0gZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyO1xuXG5cdFx0XHRpZiAoZGF0YVBvaW50RU8uaW5kZXhMYWJlbFBsYWNlbWVudCAhPT0gXCJpbnNpZGVcIikge1xuXHRcdFx0XHR2YXIgaW5kZXhMYWJlbExpbmVTdGFydFggPSBkYXRhUG9pbnRFTy5jZW50ZXIueCArIG91dGVyUmFkaXVzICogTWF0aC5jb3MoZGF0YVBvaW50RU8ubWlkQW5nbGUpO1xuXHRcdFx0XHR2YXIgaW5kZXhMYWJlbExpbmVTdGFydFkgPSBkYXRhUG9pbnRFTy5jZW50ZXIueSArIG91dGVyUmFkaXVzICogTWF0aC5zaW4oZGF0YVBvaW50RU8ubWlkQW5nbGUpO1xuXG5cdFx0XHRcdC8vY3R4LnN0cm9rZVN0eWxlID0gZGF0YVBvaW50c1tpXS5jb2xvciA/IGRhdGFQb2ludHNbaV0uY29sb3IgOiBkYXRhU2VyaWVzLl9jb2xvclNldFtpICUgZGF0YVNlcmllcy5fY29sb3JTZXQubGVuZ3RoXTtcblx0XHRcdFx0Y3R4LnN0cm9rZVN0eWxlID0gZGF0YVBvaW50RU8uaW5kZXhMYWJlbExpbmVDb2xvcjtcblx0XHRcdFx0Y3R4LmxpbmVXaWR0aCA9IGRhdGFQb2ludEVPLmluZGV4TGFiZWxMaW5lVGhpY2tuZXNzO1xuXG5cdFx0XHRcdGlmIChjdHguc2V0TGluZURhc2gpIHtcblx0XHRcdFx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheShkYXRhUG9pbnRFTy5pbmRleExhYmVsTGluZURhc2hUeXBlLCBkYXRhUG9pbnRFTy5pbmRleExhYmVsTGluZVRoaWNrbmVzcykpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly9jdHgubGluZVdpZHRoID0gNDtcblx0XHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRjdHgubW92ZVRvKGluZGV4TGFiZWxMaW5lU3RhcnRYLCBpbmRleExhYmVsTGluZVN0YXJ0WSk7XG5cdFx0XHRcdGN0eC5saW5lVG8oZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay54LCBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkpO1xuXHRcdFx0XHRjdHgubGluZVRvKGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueCArIChkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID09PSBcImxlZnRcIiA/IC1pbmRleExhYmVsTGluZUVkZ2VMZW5ndGggOiBpbmRleExhYmVsTGluZUVkZ2VMZW5ndGgpLCBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkpO1xuXHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0XHRcdC8vY3R4LmNsb3NlUGF0aCgpO1xuXHRcdFx0XHQvL3dpbmRvdy5hbGVydChcImNvbnRpbmU/P1wiKTtcblx0XHRcdFx0Ly9hbmltYXRlKCk7XG5cdFx0XHR9XG5cblx0XHRcdGN0eC5saW5lSm9pbiA9IFwibWl0ZXJcIjtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBhbmltYXRlKGZyYWN0aW9uQ29tcGxldGUpIHtcblxuXHRcdHZhciBjdHggPSBfdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0XHRjdHguY2xlYXJSZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IF90aGlzLmJhY2tncm91bmRDb2xvcjtcblx0XHRjdHguZmlsbFJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblxuXHRcdHZhciBtYXhBbmdsZSA9IGRhdGFQb2ludEVPc1swXS5zdGFydEFuZ2xlICsgKDIgKiBNYXRoLlBJICogZnJhY3Rpb25Db21wbGV0ZSk7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0dmFyIHN0YXJ0QW5nbGUgPSBpID09PSAwID8gZGF0YVBvaW50RU9zW2ldLnN0YXJ0QW5nbGUgOiBlbmRBbmdsZTtcblx0XHRcdHZhciBlbmRBbmdsZSA9IHN0YXJ0QW5nbGUgKyAoZGF0YVBvaW50RU9zW2ldLmVuZEFuZ2xlIC0gZGF0YVBvaW50RU9zW2ldLnN0YXJ0QW5nbGUpO1xuXG5cdFx0XHR2YXIgc2hvdWxkQnJlYWsgPSBmYWxzZTtcblxuXHRcdFx0aWYgKGVuZEFuZ2xlID4gbWF4QW5nbGUpIHtcblx0XHRcdFx0ZW5kQW5nbGUgPSBtYXhBbmdsZTtcblx0XHRcdFx0c2hvdWxkQnJlYWsgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgY29sb3IgPSBkYXRhUG9pbnRzW2ldLmNvbG9yID8gZGF0YVBvaW50c1tpXS5jb2xvciA6IGRhdGFTZXJpZXMuX2NvbG9yU2V0W2kgJSBkYXRhU2VyaWVzLl9jb2xvclNldC5sZW5ndGhdO1xuXG5cdFx0XHRpZiAoZW5kQW5nbGUgPiBzdGFydEFuZ2xlKVxuXHRcdFx0XHRkcmF3U2VnbWVudChfdGhpcy5wbG90QXJlYS5jdHgsIGRhdGFQb2ludEVPc1tpXS5jZW50ZXIsIGRhdGFQb2ludEVPc1tpXS5yYWRpdXMsIGNvbG9yLCBkYXRhU2VyaWVzLnR5cGUsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5LCBkYXRhUG9pbnRFT3NbaV0ucGVyY2VudElubmVyUmFkaXVzKTtcblxuXHRcdFx0aWYgKHNob3VsZEJyZWFrKVxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBleHBsb2RlVG9nZ2xlKGZyYWN0aW9uQ29tcGxldGUpIHtcblxuXHRcdHZhciBjdHggPSBfdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0XHRjdHguY2xlYXJSZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IF90aGlzLmJhY2tncm91bmRDb2xvcjtcblx0XHRjdHguZmlsbFJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHR2YXIgc3RhcnRBbmdsZSA9IGRhdGFQb2ludEVPc1tpXS5zdGFydEFuZ2xlO1xuXHRcdFx0dmFyIGVuZEFuZ2xlID0gZGF0YVBvaW50RU9zW2ldLmVuZEFuZ2xlO1xuXG5cdFx0XHRpZiAoZW5kQW5nbGUgPiBzdGFydEFuZ2xlKSB7XG5cblxuXHRcdFx0XHR2YXIgb2Zmc2V0WCA9IChvdXRlclJhZGl1cyAqIC4wNyAqIE1hdGguY29zKGRhdGFQb2ludEVPc1tpXS5taWRBbmdsZSkpO1xuXHRcdFx0XHR2YXIgb2Zmc2V0WSA9IChvdXRlclJhZGl1cyAqIC4wNyAqIE1hdGguc2luKGRhdGFQb2ludEVPc1tpXS5taWRBbmdsZSkpO1xuXHRcdFx0XHR2YXIgaXNJblRyYW5zaXRpb24gPSBmYWxzZTtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5leHBsb2RlZCkge1xuXHRcdFx0XHRcdGlmIChNYXRoLmFicyhkYXRhUG9pbnRFT3NbaV0uY2VudGVyLnggLSAoY2VudGVyLnggKyBvZmZzZXRYKSkgPiAwLjAwMDAwMDAwMSB8fCBNYXRoLmFicyhkYXRhUG9pbnRFT3NbaV0uY2VudGVyLnkgLSAoY2VudGVyLnkgKyBvZmZzZXRZKSkgPiAwLjAwMDAwMDAwMSkge1xuXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnRFT3NbaV0uY2VudGVyLnggPSBjZW50ZXIueCArIG9mZnNldFggKiBmcmFjdGlvbkNvbXBsZXRlO1xuXHRcdFx0XHRcdFx0ZGF0YVBvaW50RU9zW2ldLmNlbnRlci55ID0gY2VudGVyLnkgKyBvZmZzZXRZICogZnJhY3Rpb25Db21wbGV0ZTtcblxuXHRcdFx0XHRcdFx0aXNJblRyYW5zaXRpb24gPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChNYXRoLmFicyhkYXRhUG9pbnRFT3NbaV0uY2VudGVyLnggLSBjZW50ZXIueCkgPiAwIHx8IE1hdGguYWJzKGRhdGFQb2ludEVPc1tpXS5jZW50ZXIueSAtIGNlbnRlci55KSA+IDApIHtcblx0XHRcdFx0XHRkYXRhUG9pbnRFT3NbaV0uY2VudGVyLnggPSBjZW50ZXIueCArIG9mZnNldFggKiAoMSAtIGZyYWN0aW9uQ29tcGxldGUpO1xuXHRcdFx0XHRcdGRhdGFQb2ludEVPc1tpXS5jZW50ZXIueSA9IGNlbnRlci55ICsgb2Zmc2V0WSAqICgxIC0gZnJhY3Rpb25Db21wbGV0ZSk7XG5cblx0XHRcdFx0XHRpc0luVHJhbnNpdGlvbiA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNJblRyYW5zaXRpb24pIHtcblx0XHRcdFx0XHR2YXIgZW50cnkgPSB7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRlbnRyeS5kYXRhU2VyaWVzID0gZGF0YVNlcmllcztcblx0XHRcdFx0XHRlbnRyeS5kYXRhUG9pbnQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV07XG5cdFx0XHRcdFx0ZW50cnkuaW5kZXggPSBpO1xuXHRcdFx0XHRcdF90aGlzLl90b29sVGlwLmhpZ2hsaWdodE9iamVjdHMoW2VudHJ5XSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgY29sb3IgPSBkYXRhUG9pbnRzW2ldLmNvbG9yID8gZGF0YVBvaW50c1tpXS5jb2xvciA6IGRhdGFTZXJpZXMuX2NvbG9yU2V0W2kgJSBkYXRhU2VyaWVzLl9jb2xvclNldC5sZW5ndGhdO1xuXG5cdFx0XHRcdGRyYXdTZWdtZW50KF90aGlzLnBsb3RBcmVhLmN0eCwgZGF0YVBvaW50RU9zW2ldLmNlbnRlciwgZGF0YVBvaW50RU9zW2ldLnJhZGl1cywgY29sb3IsIGRhdGFTZXJpZXMudHlwZSwgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIGRhdGFTZXJpZXMuZmlsbE9wYWNpdHksIGRhdGFQb2ludEVPc1tpXS5wZXJjZW50SW5uZXJSYWRpdXMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vd2luZG93LmFsZXJ0KFwibmV4dD8/XCIpO1xuXHRcdHJlbmRlckxhYmVscygpO1xuXHR9XG5cblx0ZnVuY3Rpb24gYXJlRGF0YVBvaW50c1Rvb0Nsb3NlKGZpcnN0LCBzZWNvbmQpIHtcblxuXHRcdHZhciBsYWJlbDEgPSB7XG5cdFx0XHR4MTogZmlyc3QuaW5kZXhMYWJlbFRleHRCbG9jay54LCB5MTogZmlyc3QuaW5kZXhMYWJlbFRleHRCbG9jay55IC0gZmlyc3QuaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyLCB4MjogZmlyc3QuaW5kZXhMYWJlbFRleHRCbG9jay54ICsgZmlyc3QuaW5kZXhMYWJlbFRleHRCbG9jay53aWR0aCwgeTI6IGZpcnN0LmluZGV4TGFiZWxUZXh0QmxvY2sueSArIGZpcnN0LmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMlxuXHRcdH07XG5cdFx0dmFyIGxhYmVsMiA9IHtcblx0XHRcdHgxOiBzZWNvbmQuaW5kZXhMYWJlbFRleHRCbG9jay54LCB5MTogc2Vjb25kLmluZGV4TGFiZWxUZXh0QmxvY2sueSAtIHNlY29uZC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIsIHgyOiBzZWNvbmQuaW5kZXhMYWJlbFRleHRCbG9jay54ICsgc2Vjb25kLmluZGV4TGFiZWxUZXh0QmxvY2sud2lkdGgsIHkyOiBzZWNvbmQuaW5kZXhMYWJlbFRleHRCbG9jay55ICsgc2Vjb25kLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMlxuXHRcdH07XG5cblx0XHRpZiAobGFiZWwxLngyIDwgbGFiZWwyLngxIC0gaW5kZXhMYWJlbExpbmVFZGdlTGVuZ3RoIHx8IGxhYmVsMS54MSA+IGxhYmVsMi54MiArIGluZGV4TGFiZWxMaW5lRWRnZUxlbmd0aCB8fCBsYWJlbDEueTEgPiBsYWJlbDIueTIgKyBpbmRleExhYmVsTGluZUVkZ2VMZW5ndGggfHwgbGFiZWwxLnkyIDwgbGFiZWwyLnkxIC0gaW5kZXhMYWJlbExpbmVFZGdlTGVuZ3RoKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRWZXJ0aWNhbERpc3RhbmNlQmV0d2VlbkxhYmVscyhmaXJzdCwgc2Vjb25kKSB7XG5cblx0XHR2YXIgZGlzdGFuY2UgPSAwO1xuXHRcdHZhciBsYWJlbDEgPSB7XG5cdFx0XHR5OiBmaXJzdC5pbmRleExhYmVsVGV4dEJsb2NrLnksIHkxOiBmaXJzdC5pbmRleExhYmVsVGV4dEJsb2NrLnkgLSBmaXJzdC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIsIHkyOiBmaXJzdC5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyBmaXJzdC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDJcblx0XHR9O1xuXHRcdHZhciBsYWJlbDIgPSB7XG5cdFx0XHR5OiBzZWNvbmQuaW5kZXhMYWJlbFRleHRCbG9jay55LCB5MTogc2Vjb25kLmluZGV4TGFiZWxUZXh0QmxvY2sueSAtIHNlY29uZC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIsIHkyOiBzZWNvbmQuaW5kZXhMYWJlbFRleHRCbG9jay55ICsgc2Vjb25kLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMlxuXHRcdH07XG5cblx0XHRpZiAobGFiZWwyLnkgPiBsYWJlbDEueSkge1xuXHRcdFx0ZGlzdGFuY2UgPSBsYWJlbDIueTEgLSBsYWJlbDEueTI7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0ZGlzdGFuY2UgPSBsYWJlbDEueTEgLSBsYWJlbDIueTI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRpc3RhbmNlO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0TmV4dExhYmVsSW5kZXgoY3VycmVudExhYmVsSW5kZXgpIHtcblx0XHR2YXIgbmV4dExhYmVsSW5kZXggPSBudWxsO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDE7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdG5leHRMYWJlbEluZGV4ID0gKGN1cnJlbnRMYWJlbEluZGV4ICsgaSArIGRhdGFQb2ludEVPcy5sZW5ndGgpICUgZGF0YVBvaW50RU9zLmxlbmd0aDtcblxuXHRcdFx0aWYgKGRhdGFQb2ludEVPc1tuZXh0TGFiZWxJbmRleF0uaGVtaXNwaGVyZSAhPT0gZGF0YVBvaW50RU9zW2N1cnJlbnRMYWJlbEluZGV4XS5oZW1pc3BoZXJlKSB7XG5cdFx0XHRcdG5leHRMYWJlbEluZGV4ID0gbnVsbDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICgoZGF0YVBvaW50RU9zW25leHRMYWJlbEluZGV4XS5pbmRleExhYmVsVGV4dCkgJiYgKG5leHRMYWJlbEluZGV4ICE9PSBjdXJyZW50TGFiZWxJbmRleClcblx0XHRcdFx0JiYgKChnZXRWZXJ0aWNhbERpc3RhbmNlQmV0d2VlbkxhYmVscyhkYXRhUG9pbnRFT3NbbmV4dExhYmVsSW5kZXhdLCBkYXRhUG9pbnRFT3NbY3VycmVudExhYmVsSW5kZXhdKSA8IDApIHx8IChkYXRhUG9pbnRFT3NbY3VycmVudExhYmVsSW5kZXhdLmhlbWlzcGhlcmUgPT09IFwicmlnaHRcIiA/IGRhdGFQb2ludEVPc1tuZXh0TGFiZWxJbmRleF0uaW5kZXhMYWJlbFRleHRCbG9jay55ID49IGRhdGFQb2ludEVPc1tjdXJyZW50TGFiZWxJbmRleF0uaW5kZXhMYWJlbFRleHRCbG9jay55IDogZGF0YVBvaW50RU9zW25leHRMYWJlbEluZGV4XS5pbmRleExhYmVsVGV4dEJsb2NrLnkgPD0gZGF0YVBvaW50RU9zW2N1cnJlbnRMYWJlbEluZGV4XS5pbmRleExhYmVsVGV4dEJsb2NrLnkpKSlcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0bmV4dExhYmVsSW5kZXggPSBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBuZXh0TGFiZWxJbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIGdldFByZXZpb3VzTGFiZWxJbmRleChjdXJyZW50TGFiZWxJbmRleCkge1xuXHRcdHZhciBwcmV2TGFiZWxJbmRleCA9IG51bGw7XG5cblx0XHRmb3IgKHZhciBpID0gMTsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0cHJldkxhYmVsSW5kZXggPSAoY3VycmVudExhYmVsSW5kZXggLSBpICsgZGF0YVBvaW50RU9zLmxlbmd0aCkgJSBkYXRhUG9pbnRFT3MubGVuZ3RoO1xuXG5cdFx0XHRpZiAoZGF0YVBvaW50RU9zW3ByZXZMYWJlbEluZGV4XS5oZW1pc3BoZXJlICE9PSBkYXRhUG9pbnRFT3NbY3VycmVudExhYmVsSW5kZXhdLmhlbWlzcGhlcmUpIHtcblx0XHRcdFx0cHJldkxhYmVsSW5kZXggPSBudWxsO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKChkYXRhUG9pbnRFT3NbcHJldkxhYmVsSW5kZXhdLmluZGV4TGFiZWxUZXh0KSAmJiAoZGF0YVBvaW50RU9zW3ByZXZMYWJlbEluZGV4XS5oZW1pc3BoZXJlID09PSBkYXRhUG9pbnRFT3NbY3VycmVudExhYmVsSW5kZXhdLmhlbWlzcGhlcmUpICYmIChwcmV2TGFiZWxJbmRleCAhPT0gY3VycmVudExhYmVsSW5kZXgpXG5cdFx0XHRcdCYmICgoZ2V0VmVydGljYWxEaXN0YW5jZUJldHdlZW5MYWJlbHMoZGF0YVBvaW50RU9zW3ByZXZMYWJlbEluZGV4XSwgZGF0YVBvaW50RU9zW2N1cnJlbnRMYWJlbEluZGV4XSkgPCAwKSB8fCAoZGF0YVBvaW50RU9zW2N1cnJlbnRMYWJlbEluZGV4XS5oZW1pc3BoZXJlID09PSBcInJpZ2h0XCIgPyBkYXRhUG9pbnRFT3NbcHJldkxhYmVsSW5kZXhdLmluZGV4TGFiZWxUZXh0QmxvY2sueSA8PSBkYXRhUG9pbnRFT3NbY3VycmVudExhYmVsSW5kZXhdLmluZGV4TGFiZWxUZXh0QmxvY2sueSA6IGRhdGFQb2ludEVPc1twcmV2TGFiZWxJbmRleF0uaW5kZXhMYWJlbFRleHRCbG9jay55ID49IGRhdGFQb2ludEVPc1tjdXJyZW50TGFiZWxJbmRleF0uaW5kZXhMYWJlbFRleHRCbG9jay55KSkpXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHByZXZMYWJlbEluZGV4ID0gbnVsbDtcblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBwcmV2TGFiZWxJbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJlUG9zaXRpb25MYWJlbHMoZGF0YVBvaW50SW5kZXgsIG9mZnNldCkge1xuXHRcdG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG5cdFx0dmFyIGFjdHVhbE9mZnNldCA9IDA7XG5cblx0XHQvL3ZhciBsYWJlbFlNaW4gPSAyO1xuXHRcdC8vdmFyIGxhYmVsWU1heCA9IGN0eC5jYW52YXMuaGVpZ2h0IC0gMjtcblx0XHQvL3ZhciBsYWJlbFlNaW4gPSBfdGhpcy5wbG90QXJlYS5jdHguY2FudmFzLmhlaWdodCAvIDIgLSBpbmRleExhYmVsUmFkaXVzICogMTtcblx0XHQvL3ZhciBsYWJlbFlNYXggPSBfdGhpcy5wbG90QXJlYS5jdHguY2FudmFzLmhlaWdodCAvIDIgKyBpbmRleExhYmVsUmFkaXVzICogMTtcblxuXHRcdHZhciBsYWJlbFlNaW4gPSBjZW50ZXIueSAtIGluZGV4TGFiZWxSYWRpdXMgKiAxO1xuXHRcdHZhciBsYWJlbFlNYXggPSBjZW50ZXIueSArIGluZGV4TGFiZWxSYWRpdXMgKiAxO1xuXG5cdFx0Ly9jb25zb2xlLmxvZyh0b3RhbFJlY3Vyc2lvbnMpO1xuXG5cdFx0aWYgKGRhdGFQb2ludEluZGV4ID49IDAgJiYgZGF0YVBvaW50SW5kZXggPCBkYXRhUG9pbnRzLmxlbmd0aCkge1xuXG5cdFx0XHR2YXIgZGF0YVBvaW50RU8gPSBkYXRhUG9pbnRFT3NbZGF0YVBvaW50SW5kZXhdO1xuXHRcdFx0Ly9pZiAoZGF0YVBvaW50SW5kZXggPT09IDApXG5cdFx0XHQvL1x0Y3VzdG9tUHJvbXB0KGxhYmVsWU1pbi50b0ZpeGVkKDIpICsgXCI7IFwiICsgbGFiZWxZTWF4LnRvRml4ZWQoMikgKyBcIjsgXCIgKyBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkudG9GaXhlZCgyKSk7XG5cblx0XHRcdC8vIElmIGxhYmVsIGlzIGFscmVhZHkgb3V0c2lkZSB0aGUgYm91bmRzLCByZXR1cm5cblx0XHRcdGlmICgob2Zmc2V0IDwgMCAmJiBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgPCBsYWJlbFlNaW4pIHx8IChvZmZzZXQgPiAwICYmIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSA+IGxhYmVsWU1heCkpXG5cdFx0XHRcdHJldHVybiAwO1xuXG5cblx0XHRcdHZhciB2YWxpZE9mZnNldCA9IG9mZnNldDtcblxuXG5cdFx0XHQvL0NoZWNrIGlmIHRoZSBvZmZzZXQgZmFsbHMgd2l0aGluIHRoZSBib3VuZHMgKGxhYmVsWU1pbiwgbGFiZWxZTWF4LCB0YW5nZW50aWFsIGJvdW5kcykgd2l0aG91dCBjb25zaWRlcmluZyBvdmVybGFwLiBFbHNlIHVzZSB0aGUgY2xvc2VzdCBvZmZzZXQgdGhhdCBpcyBwb3NzaWJsZSAtIHZhbGlkT2Zmc2V0LlxuXHRcdFx0e1xuXHRcdFx0XHR2YXIgZGlzdEZyb21JbmRleExpbmVTdGFydCA9IDA7XG5cdFx0XHRcdHZhciBpbmRleExhYmVsTGluZVN0YXJ0WCA9IDA7XG5cdFx0XHRcdHZhciBpbmRleExhYmVsTGluZVN0YXJ0WSA9IDA7XG5cdFx0XHRcdHZhciBpbmRleExhYmVsQW5nbGUgPSAwO1xuXHRcdFx0XHR2YXIgaW5kZXhMYWJlbEFuZ2xlV2hlblRhbmdlbnQgPSAwO1xuXG5cdFx0XHRcdGlmICh2YWxpZE9mZnNldCA8IDApIHtcblx0XHRcdFx0XHRpZiAoZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55IC0gZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyID4gbGFiZWxZTWluICYmIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSAtIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMiArIHZhbGlkT2Zmc2V0IDwgbGFiZWxZTWluKVxuXHRcdFx0XHRcdFx0dmFsaWRPZmZzZXQgPSAtKGxhYmVsWU1pbiAtIChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgLSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIgKyB2YWxpZE9mZnNldCkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIgPCBsYWJlbFlNaW4gJiYgZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55ICsgZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyICsgdmFsaWRPZmZzZXQgPiBsYWJlbFlNYXgpXG5cdFx0XHRcdFx0XHR2YWxpZE9mZnNldCA9IChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIgKyB2YWxpZE9mZnNldCkgLSBsYWJlbFlNYXg7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgbmV3bGFiZWxZID0gZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55ICsgdmFsaWRPZmZzZXQ7XG5cdFx0XHRcdHZhciBuZXdsYWJlbFggPSAwO1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID09PSBcInJpZ2h0XCIpIHtcblx0XHRcdFx0XHRuZXdsYWJlbFggPSBjZW50ZXIueCArIE1hdGguc3FydChNYXRoLnBvdyhpbmRleExhYmVsUmFkaXVzLCAyKSAtIE1hdGgucG93KG5ld2xhYmVsWSAtIGNlbnRlci55LCAyKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdG5ld2xhYmVsWCA9IGNlbnRlci54IC0gTWF0aC5zcXJ0KE1hdGgucG93KGluZGV4TGFiZWxSYWRpdXMsIDIpIC0gTWF0aC5wb3cobmV3bGFiZWxZIC0gY2VudGVyLnksIDIpKTtcblxuXG5cdFx0XHRcdGluZGV4TGFiZWxMaW5lU3RhcnRYID0gY2VudGVyLnggKyBvdXRlclJhZGl1cyAqIE1hdGguY29zKGRhdGFQb2ludEVPLm1pZEFuZ2xlKTtcblx0XHRcdFx0aW5kZXhMYWJlbExpbmVTdGFydFkgPSBjZW50ZXIueSArIG91dGVyUmFkaXVzICogTWF0aC5zaW4oZGF0YVBvaW50RU8ubWlkQW5nbGUpO1xuXG5cdFx0XHRcdGRpc3RGcm9tSW5kZXhMaW5lU3RhcnQgPSBNYXRoLnNxcnQoTWF0aC5wb3cobmV3bGFiZWxYIC0gaW5kZXhMYWJlbExpbmVTdGFydFgsIDIpICsgTWF0aC5wb3cobmV3bGFiZWxZIC0gaW5kZXhMYWJlbExpbmVTdGFydFksIDIpKTtcblxuXHRcdFx0XHRpbmRleExhYmVsQW5nbGVXaGVuVGFuZ2VudCA9IE1hdGguYWNvcyhvdXRlclJhZGl1cyAvIGluZGV4TGFiZWxSYWRpdXMpO1xuXG5cdFx0XHRcdC8vaW5kZXhMYWJlbEFuZ2xlID0gTWF0aC5hY29zKChvdXRlclJhZGl1cyAqIG91dGVyUmFkaXVzICsgZGlzdEZyb21JbmRleExpbmVTdGFydCAqIGRpc3RGcm9tSW5kZXhMaW5lU3RhcnQgLSBpbmRleExhYmVsUmFkaXVzICogaW5kZXhMYWJlbFJhZGl1cykgLyAoMiAqIG91dGVyUmFkaXVzICogZGlzdEZyb21JbmRleExpbmVTdGFydCkpO1xuXHRcdFx0XHRpbmRleExhYmVsQW5nbGUgPSBNYXRoLmFjb3MoKGluZGV4TGFiZWxSYWRpdXMgKiBpbmRleExhYmVsUmFkaXVzICsgb3V0ZXJSYWRpdXMgKiBvdXRlclJhZGl1cyAtIGRpc3RGcm9tSW5kZXhMaW5lU3RhcnQgKiBkaXN0RnJvbUluZGV4TGluZVN0YXJ0KSAvICgyICogb3V0ZXJSYWRpdXMgKiBpbmRleExhYmVsUmFkaXVzKSk7XG5cblx0XHRcdFx0aWYgKGluZGV4TGFiZWxBbmdsZSA8IGluZGV4TGFiZWxBbmdsZVdoZW5UYW5nZW50KSB7XG5cdFx0XHRcdFx0dmFsaWRPZmZzZXQgPSBuZXdsYWJlbFkgLSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnk7XG5cdFx0XHRcdFx0Ly9kYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnggPSBuZXdsYWJlbFg7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cblx0XHRcdFx0XHR2YWxpZE9mZnNldCA9IDA7XG5cblx0XHRcdFx0XHQvL2RhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueCA9IG5ld2xhYmVsWDtcblxuXHRcdFx0XHRcdC8vSW5kZXggTGluZSBpcyBvdmVybGFwcGluZyB0aGUgcGllLiBTbyBsZXRzIGZpbmQgb3V0IHRoZSBwb2ludCB3aGVyZSBpbmRleGxpbmUgYmVjb21lcyBhIHRhbmdlbnQuXG5cblx0XHRcdFx0XHQvL2Rpc3RGcm9tSW5kZXhMaW5lU3RhcnQgPSBNYXRoLnNxcnQoaW5kZXhMYWJlbFJhZGl1cyAqIGluZGV4TGFiZWxSYWRpdXMgLSBvdXRlclJhZGl1cyAqIG91dGVyUmFkaXVzKTtcblx0XHRcdFx0XHQvLy8vZGlzdEZyb21JbmRleExpbmVTdGFydCAqPSBvZmZzZXQgPCAwID8gLTEgOiAxO1xuXHRcdFx0XHRcdC8vLy9pbmRleExhYmVsQW5nbGUgPSBNYXRoLmFjb3MoKGluZGV4TGFiZWxSYWRpdXMgKiBpbmRleExhYmVsUmFkaXVzICsgb3V0ZXJSYWRpdXMgKiBvdXRlclJhZGl1cyAtIGRpc3RGcm9tSW5kZXhMaW5lU3RhcnQgKiBkaXN0RnJvbUluZGV4TGluZVN0YXJ0KSAvICgyICogb3V0ZXJSYWRpdXMgKiBpbmRleExhYmVsUmFkaXVzKSk7XG5cdFx0XHRcdFx0Ly9pbmRleExhYmVsQW5nbGUgPSBNYXRoLmF0YW4yKGRpc3RGcm9tSW5kZXhMaW5lU3RhcnQsIG91dGVyUmFkaXVzKTtcblxuXHRcdFx0XHRcdC8vbmV3bGFiZWxYID0gY2VudGVyLnggKyBpbmRleExhYmVsUmFkaXVzICogTWF0aC5jb3MoaW5kZXhMYWJlbEFuZ2xlKTtcblx0XHRcdFx0XHQvL25ld2xhYmVsWSA9IGNlbnRlci55ICsgaW5kZXhMYWJlbFJhZGl1cyAqIE1hdGguc2luKGluZGV4TGFiZWxBbmdsZSk7XG5cblx0XHRcdFx0XHQvL2FjdHVhbE9mZnNldCA9IG5ld2xhYmVsWSAtIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueTtcblxuXHRcdFx0XHRcdC8vZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55ID0gbmV3bGFiZWxZO1xuXHRcdFx0XHRcdC8vZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay54ID0gbmV3bGFiZWxYO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvL3ZhciB0ZW1wSW5kZXggPSAoZGF0YVBvaW50SW5kZXggKyBkYXRhUG9pbnRFT3MubGVuZ3RoIC0gMSkgJSBkYXRhUG9pbnRFT3MubGVuZ3RoO1xuXG5cdFx0XHQvL3ZhciBwcmV2RGF0YVBvaW50SW5kZXggPSBkYXRhUG9pbnRFT3NbdGVtcEluZGV4XS5oZW1pc3BoZXJlID09PSBkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID8gdGVtcEluZGV4IDogbnVsbDtcblxuXHRcdFx0dmFyIHByZXZEYXRhUG9pbnRJbmRleCA9IGdldFByZXZpb3VzTGFiZWxJbmRleChkYXRhUG9pbnRJbmRleCk7XG5cblx0XHRcdC8vdGVtcEluZGV4ID0gKGRhdGFQb2ludEluZGV4ICsgZGF0YVBvaW50RU9zLmxlbmd0aCArIDEpICUgZGF0YVBvaW50RU9zLmxlbmd0aDtcblxuXHRcdFx0Ly92YXIgbmV4dERhdGFQb2ludEluZGV4ID0gZGF0YVBvaW50RU9zW3RlbXBJbmRleF0uaGVtaXNwaGVyZSA9PT0gZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA/IHRlbXBJbmRleCA6IG51bGw7XG5cblx0XHRcdHZhciBuZXh0RGF0YVBvaW50SW5kZXggPSBnZXROZXh0TGFiZWxJbmRleChkYXRhUG9pbnRJbmRleCk7XG5cblx0XHRcdHZhciBvdGhlcmRhdGFQb2ludEVPLCBvdGhlckRhdGFQb2ludEluZGV4LCBkaXN0YW5jZUZyb21PdGhlckxhYmVsO1xuXHRcdFx0dmFyIG90aGVyRGF0YVBvaW50T2Zmc2V0ID0gMDtcblx0XHRcdHZhciBvdGhlckRhdGFQb2ludEFjdHVhbE9mZnNldCA9IDA7XG5cblxuXHRcdFx0aWYgKHZhbGlkT2Zmc2V0IDwgMCkge1xuXG5cdFx0XHRcdG90aGVyRGF0YVBvaW50SW5kZXggPSBkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID09PSBcInJpZ2h0XCIgPyBwcmV2RGF0YVBvaW50SW5kZXggOiBuZXh0RGF0YVBvaW50SW5kZXg7XG5cblx0XHRcdFx0YWN0dWFsT2Zmc2V0ID0gdmFsaWRPZmZzZXQ7XG5cblx0XHRcdFx0aWYgKG90aGVyRGF0YVBvaW50SW5kZXggIT09IG51bGwpIHtcblxuXHRcdFx0XHRcdC8vaWYgKGRhdGFQb2ludEluZGV4IDwgNClcblx0XHRcdFx0XHQvL1x0Y3VzdG9tUHJvbXB0KFwidmFsaWQ6IFwiICsgdmFsaWRPZmZzZXQpO1xuXG5cdFx0XHRcdFx0dmFyIHRlbXBPZmZzZXQgPSAtdmFsaWRPZmZzZXQ7XG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2VGcm9tT3RoZXJMYWJlbCA9IChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgLSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIpIC0gKGRhdGFQb2ludEVPc1tvdGhlckRhdGFQb2ludEluZGV4XS5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyBkYXRhUG9pbnRFT3Nbb3RoZXJEYXRhUG9pbnRJbmRleF0uaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyKTtcblxuXHRcdFx0XHRcdGlmIChkaXN0YW5jZUZyb21PdGhlckxhYmVsIC0gdGVtcE9mZnNldCA8IG1pbkRpc3RhbmNlQmV0d2VlbkxhYmVscykge1xuXHRcdFx0XHRcdFx0b3RoZXJEYXRhUG9pbnRPZmZzZXQgPSAtdGVtcE9mZnNldDtcblx0XHRcdFx0XHRcdC8vdG90YWxSZWN1cnNpb25zKys7XG5cdFx0XHRcdFx0XHRvdGhlckRhdGFQb2ludEFjdHVhbE9mZnNldCA9IHJlUG9zaXRpb25MYWJlbHMob3RoZXJEYXRhUG9pbnRJbmRleCwgb3RoZXJEYXRhUG9pbnRPZmZzZXQsIHJlY3Vyc2lvbkNvdW50ICsgMSk7XG5cblx0XHRcdFx0XHRcdC8vaWYgKGRhdGFQb2ludEluZGV4IDwgNClcblx0XHRcdFx0XHRcdC8vXHRjdXN0b21Qcm9tcHQoZGF0YVBvaW50SW5kZXggKyBcIjsgXCIgKyBcIm9mZnNldDogXCIgKyBvdGhlckRhdGFQb2ludE9mZnNldCk7XG5cblxuXHRcdFx0XHRcdFx0aWYgKCtvdGhlckRhdGFQb2ludEFjdHVhbE9mZnNldC50b0ZpeGVkKHByZWNpc2lvbikgPiArb3RoZXJEYXRhUG9pbnRPZmZzZXQudG9GaXhlZChwcmVjaXNpb24pKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGRpc3RhbmNlRnJvbU90aGVyTGFiZWwgPiBtaW5EaXN0YW5jZUJldHdlZW5MYWJlbHMpXG5cdFx0XHRcdFx0XHRcdFx0YWN0dWFsT2Zmc2V0ID0gLShkaXN0YW5jZUZyb21PdGhlckxhYmVsIC0gbWluRGlzdGFuY2VCZXR3ZWVuTGFiZWxzKTtcblx0XHRcdFx0XHRcdFx0XHQvL2Vsc2Vcblx0XHRcdFx0XHRcdFx0XHQvL1x0YWN0dWFsT2Zmc2V0ID0gMDtcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGFjdHVhbE9mZnNldCA9IC0odGVtcE9mZnNldCAtIChvdGhlckRhdGFQb2ludEFjdHVhbE9mZnNldCAtIG90aGVyRGF0YVBvaW50T2Zmc2V0KSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vaWYgKGRhdGFQb2ludEluZGV4IDwgNClcblx0XHRcdFx0XHRcdC8vXHRjdXN0b21Qcm9tcHQoXCJhY3R1YWw6IFwiICsgYWN0dWFsT2Zmc2V0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKHZhbGlkT2Zmc2V0ID4gMCkge1xuXG5cdFx0XHRcdG90aGVyRGF0YVBvaW50SW5kZXggPSBkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID09PSBcInJpZ2h0XCIgPyBuZXh0RGF0YVBvaW50SW5kZXggOiBwcmV2RGF0YVBvaW50SW5kZXg7XG5cblx0XHRcdFx0YWN0dWFsT2Zmc2V0ID0gdmFsaWRPZmZzZXQ7XG5cblx0XHRcdFx0aWYgKG90aGVyRGF0YVBvaW50SW5kZXggIT09IG51bGwpIHtcblxuXHRcdFx0XHRcdHZhciB0ZW1wT2Zmc2V0ID0gdmFsaWRPZmZzZXQ7XG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2VGcm9tT3RoZXJMYWJlbCA9IChkYXRhUG9pbnRFT3Nbb3RoZXJEYXRhUG9pbnRJbmRleF0uaW5kZXhMYWJlbFRleHRCbG9jay55IC0gZGF0YVBvaW50RU9zW290aGVyRGF0YVBvaW50SW5kZXhdLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMikgLSAoZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55ICsgZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyKTtcblxuXHRcdFx0XHRcdGlmIChkaXN0YW5jZUZyb21PdGhlckxhYmVsIC0gdGVtcE9mZnNldCA8IG1pbkRpc3RhbmNlQmV0d2VlbkxhYmVscykge1xuXHRcdFx0XHRcdFx0b3RoZXJEYXRhUG9pbnRPZmZzZXQgPSB0ZW1wT2Zmc2V0O1xuXHRcdFx0XHRcdFx0Ly90b3RhbFJlY3Vyc2lvbnMrKztcblx0XHRcdFx0XHRcdG90aGVyRGF0YVBvaW50QWN0dWFsT2Zmc2V0ID0gcmVQb3NpdGlvbkxhYmVscyhvdGhlckRhdGFQb2ludEluZGV4LCBvdGhlckRhdGFQb2ludE9mZnNldCwgcmVjdXJzaW9uQ291bnQgKyAxKTtcblxuXHRcdFx0XHRcdFx0aWYgKCtvdGhlckRhdGFQb2ludEFjdHVhbE9mZnNldC50b0ZpeGVkKHByZWNpc2lvbikgPCArb3RoZXJEYXRhUG9pbnRPZmZzZXQudG9GaXhlZChwcmVjaXNpb24pKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGRpc3RhbmNlRnJvbU90aGVyTGFiZWwgPiBtaW5EaXN0YW5jZUJldHdlZW5MYWJlbHMpXG5cdFx0XHRcdFx0XHRcdFx0YWN0dWFsT2Zmc2V0ID0gZGlzdGFuY2VGcm9tT3RoZXJMYWJlbCAtIG1pbkRpc3RhbmNlQmV0d2VlbkxhYmVscztcblx0XHRcdFx0XHRcdFx0XHQvL2Vsc2Vcblx0XHRcdFx0XHRcdFx0XHQvL1x0YWN0dWFsT2Zmc2V0ID0gMDtcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGFjdHVhbE9mZnNldCA9IHRlbXBPZmZzZXQgLSAob3RoZXJEYXRhUG9pbnRPZmZzZXQgLSBvdGhlckRhdGFQb2ludEFjdHVhbE9mZnNldCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL2lmICghKGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSArIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMiArIGFjdHVhbE9mZnNldCA8IGxhYmVsWU1heCkpIHtcblx0XHRcdFx0Ly9cdGlmIChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIgPCBsYWJlbFlNYXgpIHtcblx0XHRcdFx0Ly9cdFx0YWN0dWFsT2Zmc2V0ID0gbGFiZWxZTWF4IC0gKGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSArIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMik7XG5cdFx0XHRcdC8vXHR9XG5cdFx0XHRcdC8vXHRlbHNlIHtcblx0XHRcdFx0Ly9cdFx0YWN0dWFsT2Zmc2V0ID0gMDtcblx0XHRcdFx0Ly9cdH1cblx0XHRcdFx0Ly99XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKGFjdHVhbE9mZnNldCkge1xuXG5cdFx0XHRcdHZhciBuZXdMYWJlbFkgPSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyBhY3R1YWxPZmZzZXQ7XG5cblxuXG5cblx0XHRcdFx0dmFyIG5ld0xhYmVsWCA9IDA7XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludEVPLmhlbWlzcGhlcmUgPT09IFwicmlnaHRcIikge1xuXHRcdFx0XHRcdG5ld0xhYmVsWCA9IGNlbnRlci54ICsgTWF0aC5zcXJ0KE1hdGgucG93KGluZGV4TGFiZWxSYWRpdXMsIDIpIC0gTWF0aC5wb3cobmV3TGFiZWxZIC0gY2VudGVyLnksIDIpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0bmV3TGFiZWxYID0gY2VudGVyLnggLSBNYXRoLnNxcnQoTWF0aC5wb3coaW5kZXhMYWJlbFJhZGl1cywgMikgLSBNYXRoLnBvdyhuZXdMYWJlbFkgLSBjZW50ZXIueSwgMikpO1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRFTy5taWRBbmdsZSA+IChNYXRoLlBJIC8gMikgLSBwb2xlQW5nbHVsYXJEaXN0YW5jZSAmJiBkYXRhUG9pbnRFTy5taWRBbmdsZSA8IChNYXRoLlBJIC8gMikgKyBwb2xlQW5nbHVsYXJEaXN0YW5jZSkge1xuXG5cdFx0XHRcdFx0dmFyIHByZXZEUEluZGV4ID0gKGRhdGFQb2ludEluZGV4IC0gMSArIGRhdGFQb2ludEVPcy5sZW5ndGgpICUgZGF0YVBvaW50RU9zLmxlbmd0aDtcblx0XHRcdFx0XHR2YXIgcHJldkRQID0gZGF0YVBvaW50RU9zW3ByZXZEUEluZGV4XTtcblx0XHRcdFx0XHR2YXIgbmV4dERQID0gZGF0YVBvaW50RU9zWyhkYXRhUG9pbnRJbmRleCArIDEgKyBkYXRhUG9pbnRFT3MubGVuZ3RoKSAlIGRhdGFQb2ludEVPcy5sZW5ndGhdO1xuXG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludEVPLmhlbWlzcGhlcmUgPT09IFwibGVmdFwiICYmIHByZXZEUC5oZW1pc3BoZXJlID09PSBcInJpZ2h0XCIgJiYgbmV3TGFiZWxYID4gcHJldkRQLmluZGV4TGFiZWxUZXh0QmxvY2sueCkge1xuXHRcdFx0XHRcdFx0bmV3TGFiZWxYID0gcHJldkRQLmluZGV4TGFiZWxUZXh0QmxvY2sueCAtIDE1O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9PT0gXCJyaWdodFwiICYmIG5leHREUC5oZW1pc3BoZXJlID09PSBcImxlZnRcIiAmJiBuZXdMYWJlbFggPCBuZXh0RFAuaW5kZXhMYWJlbFRleHRCbG9jay54KSB7XG5cdFx0XHRcdFx0XHRuZXdMYWJlbFggPSBuZXh0RFAuaW5kZXhMYWJlbFRleHRCbG9jay54ICsgMTU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGRhdGFQb2ludEVPLm1pZEFuZ2xlID4gKDMgKiBNYXRoLlBJIC8gMikgLSBwb2xlQW5nbHVsYXJEaXN0YW5jZSAmJiBkYXRhUG9pbnRFTy5taWRBbmdsZSA8ICgzICogTWF0aC5QSSAvIDIpICsgcG9sZUFuZ2x1bGFyRGlzdGFuY2UpIHtcblxuXHRcdFx0XHRcdHZhciBwcmV2RFBJbmRleCA9IChkYXRhUG9pbnRJbmRleCAtIDEgKyBkYXRhUG9pbnRFT3MubGVuZ3RoKSAlIGRhdGFQb2ludEVPcy5sZW5ndGg7XG5cdFx0XHRcdFx0dmFyIHByZXZEUCA9IGRhdGFQb2ludEVPc1twcmV2RFBJbmRleF07XG5cdFx0XHRcdFx0dmFyIG5leHREUCA9IGRhdGFQb2ludEVPc1soZGF0YVBvaW50SW5kZXggKyAxICsgZGF0YVBvaW50RU9zLmxlbmd0aCkgJSBkYXRhUG9pbnRFT3MubGVuZ3RoXTtcblxuXHRcdFx0XHRcdGlmIChkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID09PSBcInJpZ2h0XCIgJiYgcHJldkRQLmhlbWlzcGhlcmUgPT09IFwibGVmdFwiICYmIG5ld0xhYmVsWCA8IHByZXZEUC5pbmRleExhYmVsVGV4dEJsb2NrLngpIHtcblx0XHRcdFx0XHRcdG5ld0xhYmVsWCA9IHByZXZEUC5pbmRleExhYmVsVGV4dEJsb2NrLnggKyAxNTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGRhdGFQb2ludEVPLmhlbWlzcGhlcmUgPT09IFwibGVmdFwiICYmIG5leHREUC5oZW1pc3BoZXJlID09PSBcInJpZ2h0XCIgJiYgbmV3TGFiZWxYID4gbmV4dERQLmluZGV4TGFiZWxUZXh0QmxvY2sueCkge1xuXHRcdFx0XHRcdFx0bmV3TGFiZWxYID0gbmV4dERQLmluZGV4TGFiZWxUZXh0QmxvY2sueCAtIDE1O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vaWYgKGFjdHVhbE9mZnNldCA8IDAgJiYgZGF0YVBvaW50SW5kZXggPCA0KVxuXHRcdFx0XHQvL1x0Y3VzdG9tUHJvbXB0KGFjdHVhbE9mZnNldC50b0ZpeGVkKDIpICsgXCI7IFwiICsgZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55LnRvRml4ZWQoMikgKyBcIjsgXCIgKyBuZXdMYWJlbFkudG9GaXhlZCgyKSk7XG5cblx0XHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55ID0gbmV3TGFiZWxZO1xuXG5cdFx0XHRcdGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueCA9IG5ld0xhYmVsWDtcblxuXHRcdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsQW5nbGUgPSBNYXRoLmF0YW4yKChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgLSBjZW50ZXIueSksIChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnggLSBjZW50ZXIueCkpO1xuXG5cdFx0XHR9XG5cblxuXHRcdH1cblxuXHRcdHJldHVybiBhY3R1YWxPZmZzZXQ7XG5cdH1cblxuXG5cdGZ1bmN0aW9uIHBvc2l0aW9uTGFiZWxzKCkge1xuXHRcdHZhciBjdHggPSBfdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0XHRjdHguZmlsbFN0eWxlID0gXCJncmV5XCI7XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gXCJncmV5XCI7XG5cdFx0dmFyIGZvbnRTaXplID0gMTY7XG5cdFx0Y3R4LmZvbnQgPSBmb250U2l6ZSArIFwicHggQXJpYWxcIjtcblx0XHRjdHgudGV4dEJhc2VsaW5lID0gXCJtaWRkbGVcIjtcblx0XHR2YXIgaSA9IDAsIGogPSAwO1xuXHRcdHZhciBkZWx0YVIgPSAwO1xuXG5cdFx0dmFyIHJlc2l6ZUZsYWcgPSB0cnVlO1xuXG5cdFx0Zm9yIChqID0gMDsgaiA8IDEwICYmIChqIDwgMSB8fCBkZWx0YVIgPiAwKSA7IGorKykge1xuXG5cdFx0XHRpZiAoZGF0YVNlcmllcy5yYWRpdXMgfHwgKCFkYXRhU2VyaWVzLnJhZGl1cyAmJiB0eXBlb2YgZGF0YVNlcmllcy5pbm5lclJhZGl1cyAhPT0gJ3VuZGVmaW5lZCcgJiYgZGF0YVNlcmllcy5pbm5lclJhZGl1cyAhPT0gbnVsbCAmJiBvdXRlclJhZGl1cyAtIGRlbHRhUiA8PSBpbm5lclJhZGl1cykpXG5cdFx0XHRcdHJlc2l6ZUZsYWcgPSBmYWxzZTtcblxuXHRcdFx0aWYgKHJlc2l6ZUZsYWcpXG5cdFx0XHRvdXRlclJhZGl1cyAtPSBkZWx0YVI7XG5cblx0XHRcdGRlbHRhUiA9IDA7XG5cblx0XHRcdGlmIChkYXRhU2VyaWVzLmluZGV4TGFiZWxQbGFjZW1lbnQgIT09IFwiaW5zaWRlXCIpIHtcblxuXHRcdFx0XHR2YXIgaW5kZXhMYWJlbFJhZGl1cyA9IG91dGVyUmFkaXVzICogaW5kZXhMYWJlbFJhZGl1c1RvUmFkaXVzUmF0aW87XG5cblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHR2YXIgZGF0YVBvaW50RU8gPSBkYXRhUG9pbnRFT3NbaV07XG5cblx0XHRcdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnggPSBjZW50ZXIueCArIGluZGV4TGFiZWxSYWRpdXMgKiBNYXRoLmNvcyhkYXRhUG9pbnRFTy5taWRBbmdsZSk7XG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55ID0gY2VudGVyLnkgKyBpbmRleExhYmVsUmFkaXVzICogTWF0aC5zaW4oZGF0YVBvaW50RU8ubWlkQW5nbGUpO1xuXG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbEFuZ2xlID0gZGF0YVBvaW50RU8ubWlkQW5nbGU7XG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8ucmFkaXVzID0gb3V0ZXJSYWRpdXM7XG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8ucGVyY2VudElubmVyUmFkaXVzID0gcGVyY2VudElubmVyUmFkaXVzO1xuXHRcdFx0XHRcdC8vZGF0YVBvaW50RU8uaW5kZXhMYWJlbEZvbnRTaXplID0gZGF0YVBvaW50LmluZGV4TGFiZWxGb250U2l6ZSA/IGRhdGFQb2ludC5pbmRleExhYmVsRm9udFNpemUgOiBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb250U2l6ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBjdXJyZW50RGF0YVBvaW50LCBuZXh0RGF0YVBvaW50O1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdFx0dmFyIGRhdGFQb2ludEVPID0gZGF0YVBvaW50RU9zW2ldO1xuXHRcdFx0XHRcdC8vZGF0YVBvaW50RU8ubGFiXG5cdFx0XHRcdFx0Ly9yZXNldEFuaW1hdGlvbkZyYW1lKCk7XG5cdFx0XHRcdFx0Ly9hbmltYXRlKCk7XG5cdFx0XHRcdFx0Ly9yZW5kZXJMYWJlbHMoKTtcblxuXHRcdFx0XHRcdC8vdmFyIHByZXZEYXRhUG9pbnRJbmRleCA9IChpIC0gMSArIGRhdGFQb2ludEVPcy5sZW5ndGgpICUgZGF0YVBvaW50RU9zLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vdmFyIG5leHREYXRhUG9pbnRJbmRleCA9IChpICsgMSArIGRhdGFQb2ludEVPcy5sZW5ndGgpICUgZGF0YVBvaW50RU9zLmxlbmd0aDtcblx0XHRcdFx0XHQvL25leHREYXRhUG9pbnRJbmRleCA9IGRhdGFQb2ludEVPc1tuZXh0RGF0YVBvaW50SW5kZXhdLmhlbWlzcGhlcmUgPT09IGRhdGFQb2ludEVPLmhlbWlzcGhlcmUgJiYgbmV4dERhdGFQb2ludEluZGV4ICE9PSBpID8gbmV4dERhdGFQb2ludEluZGV4IDogbnVsbDtcblxuXHRcdFx0XHRcdHZhciBuZXh0RGF0YVBvaW50SW5kZXggPSBnZXROZXh0TGFiZWxJbmRleChpKTtcblxuXHRcdFx0XHRcdGlmIChuZXh0RGF0YVBvaW50SW5kZXggPT09IG51bGwpXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHRcdGN1cnJlbnREYXRhUG9pbnQgPSBkYXRhUG9pbnRFT3NbaV07XG5cdFx0XHRcdFx0bmV4dERhdGFQb2ludCA9IGRhdGFQb2ludEVPc1tuZXh0RGF0YVBvaW50SW5kZXhdO1xuXG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2VGcm9tTmV4dExhYmVsID0gMDtcblxuXHRcdFx0XHRcdC8vaWYgKGRhdGFQb2ludEVPLmhlbWlzcGhlcmUgPT09IFwicmlnaHRcIilcblx0XHRcdFx0XHQvL1x0ZGlzdGFuY2VGcm9tTmV4dExhYmVsID0gKG5leHREYXRhUG9pbnQuaW5kZXhMYWJlbFRleHRCbG9jay55IC0gbmV4dERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIpIC0gKGN1cnJlbnREYXRhUG9pbnQuaW5kZXhMYWJlbFRleHRCbG9jay55ICsgY3VycmVudERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIpIC0gbWluRGlzdGFuY2VCZXR3ZWVuTGFiZWxzO1xuXHRcdFx0XHRcdC8vZWxzZVxuXHRcdFx0XHRcdC8vXHRkaXN0YW5jZUZyb21OZXh0TGFiZWwgPSAoY3VycmVudERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLnkgLSBjdXJyZW50RGF0YVBvaW50LmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMikgLSAobmV4dERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyBuZXh0RGF0YVBvaW50LmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMikgLSBtaW5EaXN0YW5jZUJldHdlZW5MYWJlbHM7XG5cblx0XHRcdFx0XHRkaXN0YW5jZUZyb21OZXh0TGFiZWwgPSBnZXRWZXJ0aWNhbERpc3RhbmNlQmV0d2VlbkxhYmVscyhjdXJyZW50RGF0YVBvaW50LCBuZXh0RGF0YVBvaW50KSAtIG1pbkRpc3RhbmNlQmV0d2VlbkxhYmVscztcblxuXG5cdFx0XHRcdFx0aWYgKGRpc3RhbmNlRnJvbU5leHRMYWJlbCA8IDApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGRhdGFQb2ludHNBYm92ZSA9IDA7XG5cdFx0XHRcdFx0XHR2YXIgZGF0YVBvaW50c0JlbG93ID0gMDtcblx0XHRcdFx0XHRcdC8vdmFyIGluZGV4TGFiZWxBbmdsZVdoZW5UYW5nZW50ID0gTWF0aC5hY29zKG91dGVyUmFkaXVzIC8gaW5kZXhMYWJlbFJhZGl1cykgLyBNYXRoLlBJICogMTgwO1xuXG5cblx0XHRcdFx0XHRcdGZvciAodmFyIGsgPSAwOyBrIDwgZGF0YVBvaW50cy5sZW5ndGg7IGsrKykge1xuXG5cdFx0XHRcdFx0XHRcdGlmIChrID09PSBpKVxuXHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRcdC8vaWYgKGRhdGFQb2ludEVPc1trXS5oZW1pc3BoZXJlICE9PSBkYXRhUG9pbnRFTy5oZW1pc3BoZXJlIHx8IE1hdGguYWJzKGRhdGFQb2ludEVPc1trXS5taWRBbmdsZSAtIGRhdGFQb2ludEVPLm1pZEFuZ2xlKSA+IDMwKVxuXHRcdFx0XHRcdFx0XHQvL1x0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdC8vaWYgKGRhdGFQb2ludEVPc1trXS5oZW1pc3BoZXJlICE9PSBkYXRhUG9pbnRFTy5oZW1pc3BoZXJlIHx8IE1hdGguYWJzKGRhdGFQb2ludEVPc1trXS5sYWJlbEFuZ2xlIC0gZGF0YVBvaW50RU8uaW5kZXhMYWJlbEFuZ2xlKSA+IDMwKVxuXHRcdFx0XHRcdFx0XHQvL1x0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdC8vaWYgKGRhdGFQb2ludEVPc1trXS5oZW1pc3BoZXJlICE9PSBkYXRhUG9pbnRFTy5oZW1pc3BoZXJlIHx8IE1hdGguYWJzKGRhdGFQb2ludEVPc1trXS5taWRBbmdsZSAtIGRhdGFQb2ludEVPLm1pZEFuZ2xlKSA+IGluZGV4TGFiZWxBbmdsZVdoZW5UYW5nZW50KVxuXHRcdFx0XHRcdFx0XHQvL1x0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdGlmIChkYXRhUG9pbnRFT3Nba10uaGVtaXNwaGVyZSAhPT0gZGF0YVBvaW50RU8uaGVtaXNwaGVyZSlcblx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoZGF0YVBvaW50RU9zW2tdLmluZGV4TGFiZWxUZXh0QmxvY2sueSA8IGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSlcblx0XHRcdFx0XHRcdFx0XHRkYXRhUG9pbnRzQWJvdmUrKztcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGRhdGFQb2ludHNCZWxvdysrO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvL3ZhciB1cFdhcmRzT2Zmc2V0ID0gKGRpc3RhbmNlRnJvbU5leHRMYWJlbCkgLyBkYXRhUG9pbnRzLmxlbmd0aCAqIChkYXRhUG9pbnRzQmVsb3cpO1xuXHRcdFx0XHRcdFx0dmFyIHVwV2FyZHNPZmZzZXQgPSAoZGlzdGFuY2VGcm9tTmV4dExhYmVsKSAvIChkYXRhUG9pbnRzQWJvdmUgKyBkYXRhUG9pbnRzQmVsb3cgfHwgMSkgKiAoZGF0YVBvaW50c0JlbG93KTtcblx0XHRcdFx0XHRcdHZhciBkb3duV2FyZHNPZmZzZXQgPSAtMSAqIChkaXN0YW5jZUZyb21OZXh0TGFiZWwgLSB1cFdhcmRzT2Zmc2V0KTtcblxuXHRcdFx0XHRcdFx0dmFyIGFjdHVhbFVwd2FyZE9mZnNldCA9IDA7XG5cdFx0XHRcdFx0XHR2YXIgYWN0dWFsRG93bndhcmRPZmZzZXQgPSAwO1xuXG5cdFx0XHRcdFx0XHRpZiAoZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9PT0gXCJyaWdodFwiKSB7XG5cdFx0XHRcdFx0XHRcdGFjdHVhbFVwd2FyZE9mZnNldCA9IHJlUG9zaXRpb25MYWJlbHMoaSwgdXBXYXJkc09mZnNldCk7XG5cblx0XHRcdFx0XHRcdFx0Ly9pZiAoaSA8IDQgJiYgYWN0dWFsRG93bndhcmRPZmZzZXQgIT09IHVwV2FyZHNPZmZzZXQpXG5cdFx0XHRcdFx0XHRcdC8vXHRjdXN0b21Qcm9tcHQoaSArIFwiOyBcIiArIHVwV2FyZHNPZmZzZXQudG9GaXhlZCgyKSArIFwiOyBcIiArIGFjdHVhbFVwd2FyZE9mZnNldC50b0ZpeGVkKDIpKTtcblxuXG5cdFx0XHRcdFx0XHRcdGRvd25XYXJkc09mZnNldCA9IC0xICogKGRpc3RhbmNlRnJvbU5leHRMYWJlbCAtIGFjdHVhbFVwd2FyZE9mZnNldCk7XG5cblx0XHRcdFx0XHRcdFx0YWN0dWFsRG93bndhcmRPZmZzZXQgPSByZVBvc2l0aW9uTGFiZWxzKG5leHREYXRhUG9pbnRJbmRleCwgZG93bldhcmRzT2Zmc2V0KTtcblxuXHRcdFx0XHRcdFx0XHQvL3dpbmRvdy5hbGVydCh0eXBlb2YgK2Rvd25XYXJkc09mZnNldC50b0ZpeGVkKHByZWNpc2lvbikpO1xuXHRcdFx0XHRcdFx0XHQvL1NldHRpbmcgcHJlY2lzaW9uIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkgZG9uJ3QgYmVjb21lIG5vdCBlcXVhbCBiZWNvbWUgb2YgbWlub3IgZGlmZmVyZW5jZXMgLSBsaWtlIGEgZGlmZmVyZW5jZSBvZiAuMDAwMDAxXG5cdFx0XHRcdFx0XHRcdGlmICgrYWN0dWFsRG93bndhcmRPZmZzZXQudG9GaXhlZChwcmVjaXNpb24pIDwgK2Rvd25XYXJkc09mZnNldC50b0ZpeGVkKHByZWNpc2lvbikgJiYgK2FjdHVhbFVwd2FyZE9mZnNldC50b0ZpeGVkKHByZWNpc2lvbikgPD0gK3VwV2FyZHNPZmZzZXQudG9GaXhlZChwcmVjaXNpb24pKVxuXHRcdFx0XHRcdFx0XHRcdHJlUG9zaXRpb25MYWJlbHMoaSwgLShkb3duV2FyZHNPZmZzZXQgLSBhY3R1YWxEb3dud2FyZE9mZnNldCkpO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRhY3R1YWxVcHdhcmRPZmZzZXQgPSByZVBvc2l0aW9uTGFiZWxzKG5leHREYXRhUG9pbnRJbmRleCwgdXBXYXJkc09mZnNldCk7XG5cblx0XHRcdFx0XHRcdFx0ZG93bldhcmRzT2Zmc2V0ID0gLTEgKiAoZGlzdGFuY2VGcm9tTmV4dExhYmVsIC0gYWN0dWFsVXB3YXJkT2Zmc2V0KTtcblxuXHRcdFx0XHRcdFx0XHRhY3R1YWxEb3dud2FyZE9mZnNldCA9IHJlUG9zaXRpb25MYWJlbHMoaSwgZG93bldhcmRzT2Zmc2V0KTtcblxuXHRcdFx0XHRcdFx0XHQvL1NldHRpbmcgcHJlY2lzaW9uIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkgZG9uJ3QgYmVjb21lIG5vdCBlcXVhbCBiZWNvbWUgb2YgbWlub3IgZGlmZmVyZW5jZXMgLSBsaWtlIGEgZGlmZmVyZW5jZSBvZiAuMDAwMDAxXG5cdFx0XHRcdFx0XHRcdGlmICgrYWN0dWFsRG93bndhcmRPZmZzZXQudG9GaXhlZChwcmVjaXNpb24pIDwgK2Rvd25XYXJkc09mZnNldC50b0ZpeGVkKHByZWNpc2lvbikgJiYgK2FjdHVhbFVwd2FyZE9mZnNldC50b0ZpeGVkKHByZWNpc2lvbikgPD0gK3VwV2FyZHNPZmZzZXQudG9GaXhlZChwcmVjaXNpb24pKVxuXHRcdFx0XHRcdFx0XHRcdHJlUG9zaXRpb25MYWJlbHMobmV4dERhdGFQb2ludEluZGV4LCAtKGRvd25XYXJkc09mZnNldCAtIGFjdHVhbERvd253YXJkT2Zmc2V0KSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHQvL3Jlc2V0QW5pbWF0aW9uRnJhbWUoKTtcblx0XHRcdFx0XHQvL2FuaW1hdGUoKTtcblx0XHRcdFx0XHQvL3JlbmRlckxhYmVscygpO1xuXHRcdFx0XHRcdC8vd2luZG93LmFsZXJ0KFwibmV4dD8/XCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdFx0dmFyIGRhdGFQb2ludEVPID0gZGF0YVBvaW50RU9zW2ldO1xuXHRcdFx0XHRcdGluZGV4TGFiZWxSYWRpdXMgPSBkYXRhU2VyaWVzLnR5cGUgPT09IFwicGllXCIgPyBvdXRlclJhZGl1cyAqIC43IDogb3V0ZXJSYWRpdXMgKiAuODtcblxuXG5cdFx0XHRcdFx0dmFyIGR4ID0gY2VudGVyLnggKyBpbmRleExhYmVsUmFkaXVzICogKE1hdGguY29zKChkYXRhUG9pbnRFTy5taWRBbmdsZSkpKTtcblx0XHRcdFx0XHR2YXIgZHkgPSBjZW50ZXIueSArIGluZGV4TGFiZWxSYWRpdXMgKiAoTWF0aC5zaW4oKGRhdGFQb2ludEVPLm1pZEFuZ2xlKSkpO1xuXG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay54ID0gZHg7XG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55ID0gZHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVzaXplIFBpZSBiYXNlZCBvbiB0aGUgbGFiZWwgbGVuZ3RoLlxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRkYXRhUG9pbnRFTyA9IGRhdGFQb2ludEVPc1tpXTtcblxuXHRcdFx0XHR2YXIgc2l6ZSA9IGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2subWVhc3VyZVRleHQoKTtcblx0XHRcdFx0Ly8gVG8gbWFrZSBzdXJlIHRoYXQgbnVsbCB0ZXh0IG9yIGVtcHR5IHN0cmluZ3MgZG9uJ3QgYWZmZWN0IHRoZSByYWRpdXMuIFJlcXVpcmVkIHdoZW4gdXNlciBpcyBub3Qgc2hvd2luZyBhbnkgbGFiZWxzXG5cdFx0XHRcdGlmIChzaXplLmhlaWdodCA9PT0gMCB8fCBzaXplLndpZHRoID09PSAwKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdHZhciB4T3ZlcmZsb3cgPSAwO1xuXHRcdFx0XHR2YXIgeGRyID0gMDtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9PT0gXCJyaWdodFwiKSB7XG5cdFx0XHRcdFx0eE92ZXJmbG93ID0gcGxvdEFyZWEueDIgLSAoZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay54ICsgZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay53aWR0aCArIGluZGV4TGFiZWxMaW5lRWRnZUxlbmd0aCk7XG5cdFx0XHRcdFx0eE92ZXJmbG93ICo9IC0xO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhPdmVyZmxvdyA9IHBsb3RBcmVhLngxIC0gKGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueCAtIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sud2lkdGggLSBpbmRleExhYmVsTGluZUVkZ2VMZW5ndGgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh4T3ZlcmZsb3cgPiAwKSB7XG5cdFx0XHRcdFx0aWYgKCFyZXNpemVGbGFnICYmIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0KSB7XG5cdFx0XHRcdFx0XHR2YXIgbmV3SW5kZXhMYWJlbE1heFdpZHRoID0gZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9PT0gXCJyaWdodFwiID8gcGxvdEFyZWEueDIgLSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnggOiBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnggLSBwbG90QXJlYS54MTtcblx0XHRcdFx0XHRcdGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2subWF4V2lkdGggKiAuMyA+IG5ld0luZGV4TGFiZWxNYXhXaWR0aCA/IGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0ID0gXCJcIiA6IGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2subWF4V2lkdGggPSBuZXdJbmRleExhYmVsTWF4V2lkdGggKiAuODU7XG5cdFx0XHRcdFx0XHRpZiAoZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay5tYXhXaWR0aCAqIC4zIDwgbmV3SW5kZXhMYWJlbE1heFdpZHRoKSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnggLT0gZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9PT0gXCJyaWdodFwiID8gMiA6IC0yO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoTWF0aC5hYnMoZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55IC0gZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyIC0gY2VudGVyLnkpIDwgb3V0ZXJSYWRpdXNcblx0XHRcdFx0XHRcdHx8IE1hdGguYWJzKGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSArIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMiAtIGNlbnRlci55KSA8IG91dGVyUmFkaXVzKSB7XG5cblx0XHRcdFx0XHRcdHhkciA9IHhPdmVyZmxvdyAvIE1hdGguYWJzKE1hdGguY29zKGRhdGFQb2ludEVPLmluZGV4TGFiZWxBbmdsZSkpO1xuXG5cdFx0XHRcdFx0XHRpZiAoeGRyID4gOSlcblx0XHRcdFx0XHRcdFx0eGRyID0geGRyICogLjM7XG5cblx0XHRcdFx0XHRcdGlmICh4ZHIgPiBkZWx0YVIpXG5cdFx0XHRcdFx0XHRcdGRlbHRhUiA9IHhkcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgeU92ZXJmbG93ID0gMDtcblx0XHRcdFx0dmFyIHlkciA9IDA7XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludEVPLmluZGV4TGFiZWxBbmdsZSA+IDAgJiYgZGF0YVBvaW50RU8uaW5kZXhMYWJlbEFuZ2xlIDwgTWF0aC5QSSkge1xuXHRcdFx0XHRcdHlPdmVyZmxvdyA9IHBsb3RBcmVhLnkyIC0gKGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSArIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMiArIDUpO1xuXHRcdFx0XHRcdHlPdmVyZmxvdyAqPSAtMTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR5T3ZlcmZsb3cgPSBwbG90QXJlYS55MSAtIChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgLSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIgLSA1KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh5T3ZlcmZsb3cgPiAwKSB7XG5cdFx0XHRcdFx0aWYgKCFyZXNpemVGbGFnICYmIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0KSB7XG5cdFx0XHRcdFx0XHR2YXIgcG9zaXRpb25NdWx0aXBsaWVyID0gZGF0YVBvaW50RU8uaW5kZXhMYWJlbEFuZ2xlID4gMCAmJiBkYXRhUG9pbnRFTy5pbmRleExhYmVsQW5nbGUgPCBNYXRoLlBJID8gLTEgOiAxO1xuXHRcdFx0XHRcdFx0aWYgKHJlUG9zaXRpb25MYWJlbHMoaSwgeU92ZXJmbG93ICogcG9zaXRpb25NdWx0aXBsaWVyKSA9PT0gMClcblx0XHRcdFx0XHRcdFx0cmVQb3NpdGlvbkxhYmVscyhpLCAyICogcG9zaXRpb25NdWx0aXBsaWVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKE1hdGguYWJzKGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueCAtIGNlbnRlci54KSA8IG91dGVyUmFkaXVzKSB7XG5cblx0XHRcdFx0XHRcdHlkciA9IHlPdmVyZmxvdyAvIE1hdGguYWJzKE1hdGguc2luKGRhdGFQb2ludEVPLmluZGV4TGFiZWxBbmdsZSkpO1xuXG5cdFx0XHRcdFx0XHRpZiAoeWRyID4gOSlcblx0XHRcdFx0XHRcdFx0eWRyID0geWRyICogLjM7XG5cblx0XHRcdFx0XHRcdGlmICh5ZHIgPiBkZWx0YVIpXG5cdFx0XHRcdFx0XHRcdGRlbHRhUiA9IHlkcjtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIHJlbW92ZUxhYmVsc0ZvclNtYWxsU2VnbWVudHModG90YWxPdmVybGFwLCBzdGFydEluZGV4LCBlbmRJbmRleCkge1xuXG5cdFx0XHRcdHZhciBkcEVPcyA9IFtdO1xuXHRcdFx0XHR2YXIgdG90YWxSZW1vdmVkTGFiZWxIZWlnaHQgPSAwO1xuXG5cdFx0XHRcdGZvciAodmFyIGkgPSBzdGFydEluZGV4OyB0cnVlOyBpID0gKGkgKyAxICsgZGF0YVBvaW50cy5sZW5ndGgpICUgZGF0YVBvaW50cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRkcEVPcy5wdXNoKGRhdGFQb2ludEVPc1tpXSk7XG5cblx0XHRcdFx0XHRpZiAoaSA9PT0gZW5kSW5kZXgpXG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRwRU9zLnNvcnQoZnVuY3Rpb24gKGVudHJ5MSwgZW50cnkyKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVudHJ5MS55IC0gZW50cnkyLnk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBkcEVPcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdHZhciBkcEVPID0gZHBFT3NbaV07XG5cblx0XHRcdFx0XHRpZiAodG90YWxSZW1vdmVkTGFiZWxIZWlnaHQgPCB0b3RhbE92ZXJsYXAgKiAuNykge1xuXHRcdFx0XHRcdFx0dG90YWxSZW1vdmVkTGFiZWxIZWlnaHQgKz0gZHBFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodDtcblx0XHRcdFx0XHRcdGRwRU8uaW5kZXhMYWJlbFRleHRCbG9jay50ZXh0ID0gXCJcIjtcblx0XHRcdFx0XHRcdGRwRU8uaW5kZXhMYWJlbFRleHQgPSBcIlwiO1xuXHRcdFx0XHRcdFx0ZHBFTy5pbmRleExhYmVsVGV4dEJsb2NrLm1lYXN1cmVUZXh0KCk7XG5cdFx0XHRcdFx0fSBlbHNlXG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vcmVzZXRBbmltYXRpb25GcmFtZSgxKTtcblx0XHRcdC8vYW5pbWF0ZSgpO1xuXHRcdFx0Ly93aW5kb3cuYWxlcnQoXCJuZXh0Pz9cIik7XG5cdFx0XHRmdW5jdGlvbiBza2lwTGFiZWxzKCkge1xuXHRcdFx0dmFyIG92ZXJsYXBTdGFydEluZGV4ID0gLTE7XG5cdFx0XHR2YXIgb3ZlcmxhcEVuZEluZGV4ID0gLTE7XG5cdFx0XHR2YXIgdG90YWxPdmVybGFwID0gMDtcblx0XHRcdFx0dmFyIHJlbW92ZUxhYmVscyA9IGZhbHNlO1xuXG5cdFx0XHRmb3IgKHZhciBrID0gMDsgayA8IGRhdGFQb2ludHMubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0XHRyZW1vdmVMYWJlbHMgPSBmYWxzZTtcblx0XHRcdFx0Y3VycmVudERhdGFQb2ludCA9IGRhdGFQb2ludEVPc1trXTtcblxuXHRcdFx0XHRpZiAoIWN1cnJlbnREYXRhUG9pbnQuaW5kZXhMYWJlbFRleHQpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0dmFyIG5leHRMYWJlbEluZGV4ID0gZ2V0TmV4dExhYmVsSW5kZXgoayk7XG5cdFx0XHRcdGlmIChuZXh0TGFiZWxJbmRleCA9PT0gbnVsbClcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR2YXIgbmV4dERhdGFQb2ludCA9IGRhdGFQb2ludEVPc1tuZXh0TGFiZWxJbmRleF07XG5cblx0XHRcdFx0ZGlzdGFuY2VGcm9tTmV4dExhYmVsID0gMDtcblxuXHRcdFx0XHQvL2lmIChuZXh0RGF0YVBvaW50LmluZGV4TGFiZWxUZXh0QmxvY2sueSA+IGN1cnJlbnREYXRhUG9pbnQuaW5kZXhMYWJlbFRleHRCbG9jay55KVxuXHRcdFx0XHQvL1x0ZGlzdGFuY2VGcm9tTmV4dExhYmVsID0gKG5leHREYXRhUG9pbnQuaW5kZXhMYWJlbFRleHRCbG9jay55IC0gKG5leHREYXRhUG9pbnQuaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyKSkgLSAoY3VycmVudERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyAoY3VycmVudERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIpKTtcblx0XHRcdFx0Ly9lbHNlXG5cdFx0XHRcdC8vXHRkaXN0YW5jZUZyb21OZXh0TGFiZWwgPSAoY3VycmVudERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLnkgLSAoY3VycmVudERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIpKSAtIChuZXh0RGF0YVBvaW50LmluZGV4TGFiZWxUZXh0QmxvY2sueSArIChuZXh0RGF0YVBvaW50LmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMikpO1xuXG5cdFx0XHRcdGRpc3RhbmNlRnJvbU5leHRMYWJlbCA9IGdldFZlcnRpY2FsRGlzdGFuY2VCZXR3ZWVuTGFiZWxzKGN1cnJlbnREYXRhUG9pbnQsIG5leHREYXRhUG9pbnQpO1xuXG5cdFx0XHRcdGlmIChkaXN0YW5jZUZyb21OZXh0TGFiZWwgPCAwICYmIGFyZURhdGFQb2ludHNUb29DbG9zZShjdXJyZW50RGF0YVBvaW50LCBuZXh0RGF0YVBvaW50KSkge1xuXHRcdFx0XHRcdFx0Ly9pZiAoZGlzdGFuY2VGcm9tTmV4dExhYmVsIDwgMCAmJiBhcmVEYXRhUG9pbnRzVG9vQ2xvc2UoY3VycmVudERhdGFQb2ludCwgbmV4dERhdGFQb2ludCkgKSB7XG5cdFx0XHRcdFx0aWYgKG92ZXJsYXBTdGFydEluZGV4IDwgMClcblx0XHRcdFx0XHRcdG92ZXJsYXBTdGFydEluZGV4ID0gaztcblxuXHRcdFx0XHRcdFx0aWYgKG5leHRMYWJlbEluZGV4ICE9PSBvdmVybGFwU3RhcnRJbmRleCkge1xuXHRcdFx0XHRcdFx0b3ZlcmxhcEVuZEluZGV4ID0gbmV4dExhYmVsSW5kZXg7XG5cblx0XHRcdFx0XHR0b3RhbE92ZXJsYXAgKz0gLWRpc3RhbmNlRnJvbU5leHRMYWJlbDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGsgJSBNYXRoLm1heChkYXRhUG9pbnRzLmxlbmd0aCAvIDEwLCAzKSA9PT0gMClcblx0XHRcdFx0XHRcdFx0cmVtb3ZlTGFiZWxzID0gdHJ1ZTtcblxuXHRcdFx0XHRcdC8vbmV4dERhdGFQb2ludC5pbmRleExhYmVsVGV4dCA9IFwiXCI7XG5cdFx0XHRcdFx0Ly9uZXh0RGF0YVBvaW50LmluZGV4TGFiZWxUZXh0QmxvY2sudGV4dCA9IFwiXCI7XG5cdFx0XHRcdFx0Ly9uZXh0RGF0YVBvaW50LmluZGV4TGFiZWxUZXh0QmxvY2subWVhc3VyZVRleHQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0cmVtb3ZlTGFiZWxzID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocmVtb3ZlTGFiZWxzKSB7XG5cblx0XHRcdFx0XHRcdGlmICh0b3RhbE92ZXJsYXAgPiAwICYmIG92ZXJsYXBTdGFydEluZGV4ID49IDAgJiYgb3ZlcmxhcEVuZEluZGV4ID49IDApIHtcblx0XHRcdFx0XHRcdHJlbW92ZUxhYmVsc0ZvclNtYWxsU2VnbWVudHModG90YWxPdmVybGFwLCBvdmVybGFwU3RhcnRJbmRleCwgb3ZlcmxhcEVuZEluZGV4KTtcblxuXHRcdFx0XHRcdFx0b3ZlcmxhcFN0YXJ0SW5kZXggPSAtMTtcblx0XHRcdFx0XHRcdG92ZXJsYXBFbmRJbmRleCA9IC0xO1xuXHRcdFx0XHRcdFx0dG90YWxPdmVybGFwID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHRvdGFsT3ZlcmxhcCA+IDApXG5cdFx0XHRcdHJlbW92ZUxhYmVsc0ZvclNtYWxsU2VnbWVudHModG90YWxPdmVybGFwLCBvdmVybGFwU3RhcnRJbmRleCwgb3ZlcmxhcEVuZEluZGV4KTtcblx0XHRcdH1cblxuXHRcdFx0c2tpcExhYmVscygpO1xuXG5cblx0XHR9XG5cdFx0Ly93aW5kb3cuYWxlcnQoXCJuZXh0Pz9cIik7XG5cblxuXHRcdC8vcmVzZXRBbmltYXRpb25GcmFtZShfdGhpcy5hbmltYXRpb25FbmFibGVkICYmIF90aGlzLnJlbmRlckNvdW50ID09PSAwID8gaXNDYW52YXNTdXBwb3J0ZWQgPyA2MCA6IDMwIDogMSk7XG5cdFx0Ly9hbmltYXRlKCk7XG5cblx0XHQvL2NvbnNvbGUubG9nKFwidG90YWxSZWN1cnNpb25zOiBcIiArIHRvdGFsUmVjdXJzaW9ucyk7XG5cdH1cblxuXG5cdHRoaXMucGllRG91Z2hudXRDbGlja0hhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuXG5cdFx0aWYgKF90aGlzLmlzQW5pbWF0aW5nKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGkgPSBlLmRhdGFQb2ludEluZGV4O1xuXHRcdHZhciBkYXRhUG9pbnQgPSBlLmRhdGFQb2ludDtcblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXM7XG5cblxuXHRcdHZhciBpZCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2ldO1xuXG5cdFx0Ly9kYXRhUG9pbnRFTyA9IF90aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2lkXTtcblxuXHRcdGlmIChkYXRhUG9pbnQuZXhwbG9kZWQpXG5cdFx0XHRkYXRhUG9pbnQuZXhwbG9kZWQgPSBmYWxzZTtcblx0XHRlbHNlXG5cdFx0XHRkYXRhUG9pbnQuZXhwbG9kZWQgPSB0cnVlO1xuXG5cblx0XHQvLyBTbyB0aGF0IGl0IGRvZXNuJ3QgdHJ5IHRvIGV4cGxvZGUgd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBzZWdtZW50XG5cdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRfdGhpcy5fYW5pbWF0b3IuYW5pbWF0ZSgwLCBleHBsb2RlRHVyYXRpb24sIGZ1bmN0aW9uIChmcmFjdGlvbkNvbXBsZXRlKSB7XG5cblx0XHRcdFx0ZXhwbG9kZVRvZ2dsZShmcmFjdGlvbkNvbXBsZXRlKTtcblx0XHRcdFx0cmVuZGVyQ2hhcnRFbGVtZW50c0luUGxvdEFyZWEoKTtcblx0XHRcdFx0Ly9jb25zb2xlLmxvZyhcIkV4cGxvZGUgU3RhcnRcIik7XG5cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybjtcblx0fVxuXG5cdGluaXRMYWJlbHMoKTtcblxuXHRwb3NpdGlvbkxhYmVscygpO1xuXHRwb3NpdGlvbkxhYmVscygpO1xuXHRwb3NpdGlvbkxhYmVscygpO1xuXHRwb3NpdGlvbkxhYmVscygpO1xuXG5cdHRoaXMuZGlzYWJsZVRvb2xUaXAgPSB0cnVlO1xuXHR0aGlzLl9hbmltYXRvci5hbmltYXRlKDAsIHRoaXMuYW5pbWF0ZWRSZW5kZXIgPyB0aGlzLmFuaW1hdGlvbkR1cmF0aW9uIDogMCwgZnVuY3Rpb24gKGZyYWN0aW9uQ29tcGxldGUpIHtcblxuXHRcdGFuaW1hdGUoZnJhY3Rpb25Db21wbGV0ZSk7XG5cdFx0cmVuZGVyQ2hhcnRFbGVtZW50c0luUGxvdEFyZWEoKTtcblxuXHR9LCBmdW5jdGlvbiAoKSB7XG5cblx0XHRfdGhpcy5kaXNhYmxlVG9vbFRpcCA9IGZhbHNlO1xuXHRcdF90aGlzLl9hbmltYXRvci5hbmltYXRlKDAsIF90aGlzLmFuaW1hdGVkUmVuZGVyID8gZXhwbG9kZUR1cmF0aW9uIDogMCwgZnVuY3Rpb24gKGZyYWN0aW9uQ29tcGxldGUpIHtcblxuXHRcdFx0ZXhwbG9kZVRvZ2dsZShmcmFjdGlvbkNvbXBsZXRlKTtcblx0XHRcdHJlbmRlckNoYXJ0RWxlbWVudHNJblBsb3RBcmVhKCk7XG5cblx0XHR9KTtcblxuXHRcdC8vY29uc29sZS5sb2coXCJBbmltYXRpb24gQ29tcGxldGVcIik7XG5cdH0pO1xuXG5cdGZ1bmN0aW9uIHJlbmRlckNoYXJ0RWxlbWVudHNJblBsb3RBcmVhKCkge1xuXG5cdFx0X3RoaXMucGxvdEFyZWEubGF5b3V0TWFuYWdlci5yZXNldCgpO1xuXG5cdFx0aWYgKF90aGlzLl90aXRsZSkge1xuXHRcdFx0aWYgKF90aGlzLl90aXRsZS5kb2NrSW5zaWRlUGxvdEFyZWEgfHwgKF90aGlzLl90aXRsZS5ob3Jpem9udGFsQWxpZ24gPT09IFwiY2VudGVyXCIgJiYgX3RoaXMuX3RpdGxlLnZlcnRpY2FsQWxpZ24gPT09IFwiY2VudGVyXCIpKVxuXHRcdFx0XHRfdGhpcy5fdGl0bGUucmVuZGVyKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoX3RoaXMuc3VidGl0bGVzKVxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBfdGhpcy5zdWJ0aXRsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIHN1YnRpdGxlID0gX3RoaXMuc3VidGl0bGVzW2ldO1xuXHRcdFx0XHRpZiAoc3VidGl0bGUuZG9ja0luc2lkZVBsb3RBcmVhIHx8IChzdWJ0aXRsZS5ob3Jpem9udGFsQWxpZ24gPT09IFwiY2VudGVyXCIgJiYgc3VidGl0bGUudmVydGljYWxBbGlnbiA9PT0gXCJjZW50ZXJcIikpXG5cdFx0XHRcdFx0c3VidGl0bGUucmVuZGVyKCk7XG5cdFx0XHR9XG5cblx0XHRpZiAoX3RoaXMubGVnZW5kKSB7XG5cdFx0XHRpZiAoX3RoaXMubGVnZW5kLmRvY2tJbnNpZGVQbG90QXJlYSB8fCAoX3RoaXMubGVnZW5kLmhvcml6b250YWxBbGlnbiA9PT0gXCJjZW50ZXJcIiAmJiBfdGhpcy5sZWdlbmQudmVydGljYWxBbGlnbiA9PT0gXCJjZW50ZXJcIikpXG5cdFx0XHRcdF90aGlzLmxlZ2VuZC5yZW5kZXIoKTtcblx0XHR9XG5cdH1cblxuXHQvL3RoaXMuY3R4LnN0cm9rZVJlY3QocGxvdEFyZWEueDEgKyAxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGggLSAyLCBwbG90QXJlYS5oZWlnaHQpO1xufVxuIiwiXG5pbXBvcnQge2lzQ2FudmFzU3VwcG9ydGVkfSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cdHZhciB0b3RhbERhdGFTZXJpZXMgPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7XG5cblx0aWYgKHRvdGFsRGF0YVNlcmllcyA8PSAwKVxuXHRcdHJldHVybjtcblxuXHR2YXIgZ2hvc3RDdHggPSB0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHg7XG5cblx0dmFyIGF4aXNYUHJvcHMgPSBwbG90VW5pdC5heGlzWC5saW5lQ29vcmRpbmF0ZXM7XG5cdHZhciBheGlzWVByb3BzID0gcGxvdFVuaXQuYXhpc1kubGluZUNvb3JkaW5hdGVzO1xuXHR2YXIgbWFya2VycyA9IFtdO1xuXG5cdHZhciBwbG90QXJlYSA9IHRoaXMucGxvdEFyZWE7XG5cdGN0eC5zYXZlKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdGdob3N0Q3R4LnNhdmUoKTtcblxuXHRjdHguYmVnaW5QYXRoKCk7XG5cdGN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdGN0eC5jbGlwKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0Z2hvc3RDdHguYmVnaW5QYXRoKCk7XG5cdFx0Z2hvc3RDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRcdGdob3N0Q3R4LmNsaXAoKTtcblx0fVxuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBjbG9zaW5nUGF0aCA9IFtdO1xuXG5cdFx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdO1xuXG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblxuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXG5cdFx0dmFyIHNlcmllc0lkID0gZGF0YVNlcmllcy5pZDtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW3Nlcmllc0lkXSA9IHtcblx0XHRcdG9iamVjdFR5cGU6IFwiZGF0YVNlcmllc1wiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleFxuXHRcdH07XG5cblx0XHR2YXIgaGV4Q29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKHNlcmllc0lkKTtcblx0XHRnaG9zdEN0eC5maWxsU3R5bGUgPSBoZXhDb2xvcjtcblx0XHQvL2dob3N0Q3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblx0XHQvL2dob3N0Q3R4LmxpbmVXaWR0aCA9IDIwO1xuXG5cdFx0bWFya2VycyA9IFtdO1xuXG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblx0XHR2YXIgaSA9IDAsIHgsIHkxLCB5Mjtcblx0XHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGJhY2sgYW5kIGZvcnRoLlxuXG5cdFx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0dmFyIGJhc2VZO1xuXG5cdFx0dmFyIHN0YXJ0UG9pbnQgPSBudWxsO1xuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly9jdHguc3Ryb2tlU3R5bGUgPSBcIiM0NTcyQTcgXCI7XG5cdFx0XHR2YXIgY29sb3IgPSBkYXRhU2VyaWVzLl9jb2xvclNldFtpICUgZGF0YVNlcmllcy5fY29sb3JTZXQubGVuZ3RoXTtcblx0XHRcdC8vY3R4LnN0cm9rZVN0eWxlID0gXCJyZWRcIjtcblx0XHRcdGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcblx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXHRcdFx0Y3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblxuXHRcdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheShkYXRhU2VyaWVzLmxpbmVEYXNoVHlwZSwgZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzKSk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBwcmV2RGF0YU51bGwgPSB0cnVlO1xuXHRcdFx0Zm9yICg7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lID8gZGF0YVBvaW50c1tpXS54LmdldFRpbWUoKSA6IGRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ueSA9PT0gbnVsbCB8fCAhZGF0YVBvaW50c1tpXS55Lmxlbmd0aFxuXHRcdFx0XHRcdHx8IHR5cGVvZiAoZGF0YVBvaW50c1tpXS55WzBdKSAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgKGRhdGFQb2ludHNbaV0ueVsxXSkgIT09IFwibnVtYmVyXCIpIHtcblxuXHRcdFx0XHRcdGNsb3NlQXJlYSgpO1xuXG5cdFx0XHRcdFx0cHJldkRhdGFOdWxsID0gdHJ1ZTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXG5cdFx0XHRcdHkxID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnlbMF0gLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5MiA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55WzFdIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXHRcdFx0XHRpZiAoaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgfHwgcHJldkRhdGFOdWxsKSB7XG5cdFx0XHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdGN0eC5tb3ZlVG8oeCwgeTEpO1xuXHRcdFx0XHRcdHN0YXJ0UG9pbnQgPSB7XG5cdFx0XHRcdFx0XHR4OiB4LCB5OiB5MVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y2xvc2luZ1BhdGggPSBbXTtcblx0XHRcdFx0XHRjbG9zaW5nUGF0aC5wdXNoKHsgeDogeCwgeTogeTIgfSk7XG5cblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKHgsIHkxKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IGZhbHNlO1xuXHRcdFx0XHRcdHByZXZEYXRhTnVsbCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXG5cdFx0XHRcdFx0Y3R4LmxpbmVUbyh4LCB5MSk7XG5cdFx0XHRcdFx0Y2xvc2luZ1BhdGgucHVzaCh7IHg6IHgsIHk6IHkyIH0pO1xuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHgsIHkxKTtcblxuXHRcdFx0XHRcdGlmIChpICUgMjUwID09IDApIHtcblx0XHRcdFx0XHRcdGNsb3NlQXJlYSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cblx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbaV07XG5cdFx0XHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuXHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBpLCB4MTogeCwgeTE6IHkxLCB5MjogeTJcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvL1JlbmRlciBNYXJrZXJcblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ubWFya2VyU2l6ZSAhPT0gMCkge1xuXHRcdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLm1hcmtlclNpemUgPiAwIHx8IGRhdGFTZXJpZXMubWFya2VyU2l6ZSA+IDApIHtcblx0XHRcdFx0XHRcdHZhciBtYXJrZXJQcm9wcyA9IGRhdGFTZXJpZXMuZ2V0TWFya2VyUHJvcGVydGllcyhpLCB4LCB5MiwgY3R4KTtcblx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaChtYXJrZXJQcm9wcyk7XG5cblx0XHRcdFx0XHRcdC8vaWYgKCFkYXRhU2VyaWVzLm1heFdpZHRoSW5YIHx8IG1hcmtlclByb3BzLnNpemUgPiBkYXRhU2VyaWVzLm1heFdpZHRoSW5YKSB7XG5cdFx0XHRcdFx0XHQvL1x0ZGF0YVNlcmllcy5tYXhXaWR0aEluWCA9IG1hcmtlclByb3BzLnNpemUgLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXHRcdFx0XHRcdFx0Ly99XG5cblx0XHRcdFx0XHRcdHZhciBtYXJrZXJDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdFx0bWFya2Vycy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHR4OiB4LCB5OiB5MiwgY3R4OiBnaG9zdEN0eCxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBtYXJrZXJQcm9wcy50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdHNpemU6IG1hcmtlclByb3BzLnNpemUsXG5cdFx0XHRcdFx0XHRcdFx0Y29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlckNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJUaGlja25lc3M6IG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0bWFya2VyUHJvcHMgPSBkYXRhU2VyaWVzLmdldE1hcmtlclByb3BlcnRpZXMoaSwgeCwgeTEsIGN0eCk7XG5cdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2gobWFya2VyUHJvcHMpO1xuXG5cblxuXHRcdFx0XHRcdFx0dmFyIG1hcmtlckNvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhpZCk7XG5cblx0XHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHkxLCBjdHg6IGdob3N0Q3R4LFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IG1hcmtlclByb3BzLnR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0c2l6ZTogbWFya2VyUHJvcHMuc2l6ZSxcblx0XHRcdFx0XHRcdFx0XHRjb2xvcjogbWFya2VyQ29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyQ29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlclRoaWNrbmVzczogbWFya2VyUHJvcHMuYm9yZGVyVGhpY2tuZXNzXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpIHtcblxuXHRcdFx0XHRcdHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBcInJhbmdlQXJlYVwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdGluZGV4S2V5d29yZDogMCxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHkxXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBkYXRhUG9pbnRzW2ldLnlbMF0gPD0gZGF0YVBvaW50c1tpXS55WzFdID8gLTEgOiAxLFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJyYW5nZUFyZWFcIixcblx0XHRcdFx0XHRcdGRhdGFQb2ludDogZGF0YVBvaW50c1tpXSxcblx0XHRcdFx0XHRcdGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMsXG5cdFx0XHRcdFx0XHRpbmRleEtleXdvcmQ6IDEsXG5cdFx0XHRcdFx0XHRwb2ludDoge1xuXHRcdFx0XHRcdFx0XHR4OiB4LCB5OiB5MlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55WzBdIDw9IGRhdGFQb2ludHNbaV0ueVsxXSA/IDEgOiAtMSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL2FsZXJ0KFwiaGlcIik7XG5cdFx0XHR9XG5cblx0XHRcdGNsb3NlQXJlYSgpO1xuXG5cdFx0XHQvL3N0YXJ0UG9pbnQgPSB7IHg6IHgsIHk6IHkgfTtcblx0XHRcdFJlbmRlckhlbHBlci5kcmF3TWFya2VycyhtYXJrZXJzKTtcblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlc3RvcmUoKTtcblxuXHRmdW5jdGlvbiBjbG9zZUFyZWEoKSB7XG5cblx0XHRpZiAoIXN0YXJ0UG9pbnQpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR2YXIgcG9pbnQgPSBudWxsO1xuXG5cdFx0aWYgKGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcyA+IDApXG5cdFx0XHRjdHguc3Ryb2tlKCk7XG5cblx0XHRmb3IgKHZhciBpID0gY2xvc2luZ1BhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRcdHBvaW50ID0gY2xvc2luZ1BhdGhbaV07XG5cdFx0XHRjdHgubGluZVRvKHBvaW50LngsIHBvaW50LnkpO1xuXHRcdFx0Z2hvc3RDdHgubGluZVRvKHBvaW50LngsIHBvaW50LnkpO1xuXHRcdH1cblxuXG5cblx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0Ly9jdHgubGluZVRvKHN0YXJ0UG9pbnQueCwgc3RhcnRQb2ludC55KTtcblxuXHRcdGN0eC5nbG9iYWxBbHBoYSA9IGRhdGFTZXJpZXMuZmlsbE9wYWNpdHk7XG5cdFx0Y3R4LmZpbGwoKTtcblx0XHRjdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG5cdFx0Z2hvc3RDdHguZmlsbCgpO1xuXG5cdFx0Ly9pZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHQvL1x0Z2hvc3RDdHgubGluZVRvKHgsIGJhc2VZKTtcblx0XHQvL1x0Z2hvc3RDdHgubGluZVRvKHN0YXJ0UG9pbnQueCwgYmFzZVkpO1xuXHRcdC8vXHRnaG9zdEN0eC5jbG9zZVBhdGgoKTtcblx0XHQvL1x0Z2hvc3RDdHguZmlsbCgpO1xuXHRcdC8vfVxuXG5cdFx0aWYgKGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcyA+IDApIHtcblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGN0eC5tb3ZlVG8ocG9pbnQueCwgcG9pbnQueSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNsb3NpbmdQYXRoLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHBvaW50ID0gY2xvc2luZ1BhdGhbaV07XG5cdFx0XHRcdGN0eC5saW5lVG8ocG9pbnQueCwgcG9pbnQueSk7XG5cdFx0XHR9XG5cblx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHR9XG5cblxuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRjdHgubW92ZVRvKHgsIHkxKTtcblx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRnaG9zdEN0eC5tb3ZlVG8oeCwgeTEpO1xuXG5cdFx0c3RhcnRQb2ludCA9IHtcblx0XHRcdHg6IHgsIHk6IHkxXG5cdFx0fTtcblx0XHRjbG9zaW5nUGF0aCA9IFtdO1xuXHRcdGNsb3NpbmdQYXRoLnB1c2goeyB4OiB4LCB5OiB5MiB9KTtcblx0fVxuXG5cdC8vY3R4LmJlZ2luUGF0aCgpO1xuXHQvL3NvdXJjZSBhbmQgZGVzdCB3b3VsZCBiZSBzYW1lIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBlbmFibGVkXG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci54Q2xpcEFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcubGluZWFyLCBhbmltYXRpb25CYXNlOiAwXG5cdH07XG5cdHJldHVybiBhbmltYXRpb25JbmZvO1xufVxuIiwiXG5pbXBvcnQge2lzQ2FudmFzU3VwcG9ydGVkfSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cdHZhciB0b3RhbERhdGFTZXJpZXMgPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7XG5cblx0aWYgKHRvdGFsRGF0YVNlcmllcyA8PSAwKVxuXHRcdHJldHVybjtcblxuXHR2YXIgY29sb3IgPSBudWxsO1xuXG5cdHZhciBwbG90QXJlYSA9IHRoaXMucGxvdEFyZWE7XG5cblx0dmFyIGkgPSAwLCB4MSwgeDIsIHk7XG5cdHZhciBkYXRhUG9pbnRYOyAvL1VzZWQgc28gdGhhdCB3aGVuIGRhdGFQb2ludC54IGlzIGEgRGF0ZVRpbWUgdmFsdWUsIGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBudW1iZXIgZnJvbSBkYXRhVGltZSBldmVyeXRpbWUgaXQgaXMgdXNlZC5cblxuXHQvL0luIGNhc2Ugb2YgQmFyIENoYXJ0LCB5WmVyb1RvUGl4ZWwgaXMgeCBjby1vcmRpbmF0ZSFcblx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKSA8PCAwO1xuXG5cdHZhciBtYXhCYXJXaWR0aCA9IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggPyB0aGlzLmRhdGFQb2ludE1heFdpZHRoIDogTWF0aC5taW4oKHRoaXMuaGVpZ2h0ICogLjE1KSwgdGhpcy5wbG90QXJlYS5oZWlnaHQgLyBwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblx0dmFyIHhNaW5EaWZmID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8ubWluRGlmZjtcblx0Ly92YXIgYmFyV2lkdGggPSAoKChwbG90QXJlYS5oZWlnaHQgLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyB0b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblxuXHR2YXIgYmFyV2lkdGggPSAoKChwbG90QXJlYS5oZWlnaHQgLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyBwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblxuXHRpZiAoYmFyV2lkdGggPiBtYXhCYXJXaWR0aClcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXHRlbHNlIGlmICh4TWluRGlmZiA9PT0gSW5maW5pdHkpIHtcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoIC8gcGxvdFVuaXQucGxvdFR5cGUudG90YWxEYXRhU2VyaWVzICogLjk7XG5cdH0gZWxzZSBpZiAoYmFyV2lkdGggPCAxKVxuXHRcdGJhcldpZHRoID0gMTtcblxuXHRjdHguc2F2ZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXHRcdHZhciBpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IHRydWU7XG5cblxuXHRcdC8vZGF0YVNlcmllcy5tYXhXaWR0aEluWCA9IGJhcldpZHRoIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblxuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgeHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhKGRhdGFQb2ludHNbMF0ueCwgZGF0YVBvaW50c1swXS55KTtcblxuXHRcdFx0dmFyIGJldmVsRW5hYmxlZCA9IChiYXJXaWR0aCA+IDUpICYmIGRhdGFTZXJpZXMuYmV2ZWxFbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBcIiM0NTcyQTcgXCI7XG5cblx0XHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50c1tpXS5nZXRUaW1lID8gZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCkgOiBkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54O1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW4gfHwgZGF0YVBvaW50WCA+IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS55ID09PSBudWxsIHx8ICFkYXRhUG9pbnRzW2ldLnkubGVuZ3RoXG5cdFx0XHRcdFx0fHwgdHlwZW9mIChkYXRhUG9pbnRzW2ldLnlbMF0pICE9PSBcIm51bWJlclwiIHx8IHR5cGVvZiAoZGF0YVBvaW50c1tpXS55WzFdKSAhPT0gXCJudW1iZXJcIilcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHQvL3ggYW5kIHkgYXJlIHBpeGVsIGNvLW9yZGluYXRlcyBvZiBwb2ludCBhbmQgc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIFggYW5kIFkgdmFsdWVzXG5cdFx0XHRcdHgxID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnlbMF0gLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR4MiA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55WzFdIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXHRcdFx0XHR5ID0gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRYIC0gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXG5cdFx0XHRcdHZhciB5MSA9ICh5IC0gKHBsb3RVbml0LnBsb3RUeXBlLnRvdGFsRGF0YVNlcmllcyAqIGJhcldpZHRoIC8gMikgKyAoKHBsb3RVbml0LnByZXZpb3VzRGF0YVNlcmllc0NvdW50ICsgaikgKiBiYXJXaWR0aCkpIDw8IDA7XG5cdFx0XHRcdHZhciB5MiA9IHkxICsgYmFyV2lkdGggPDwgMDtcblxuXHRcdFx0XHRpZiAoeDEgPiB4Mikge1xuXHRcdFx0XHRcdHZhciB0ZW1wID0geDE7XG5cdFx0XHRcdFx0eDEgPSB4Mjtcblx0XHRcdFx0XHR4MiA9IHRlbXA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL2RyYXdSZWN0KGN0eCwgeDEsIHkxLCBwbG90QXJlYS54MiwgeTIsIFwiI0VFRUVFRVwiLCAwLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG5cdFx0XHRcdC8vZHJhd1JlY3QoY3R4LCB4MSwgeTEsIHBsb3RBcmVhLngyLCB5MiwgXCIjQkRDRUQzXCIsIDAsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcblxuXHRcdFx0XHRjb2xvciA9IGRhdGFQb2ludHNbaV0uY29sb3IgPyBkYXRhUG9pbnRzW2ldLmNvbG9yIDogZGF0YVNlcmllcy5fY29sb3JTZXRbaSAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cdFx0XHRcdC8vY29sb3IgPSBcIiMxQjQ5NjJcIjtcblx0XHRcdFx0ZHJhd1JlY3QoY3R4LCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIDAsIG51bGwsIGJldmVsRW5hYmxlZCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZGF0YVNlcmllcy5maWxsT3BhY2l0eSk7XG5cblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5MlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRkcmF3UmVjdCh0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbCB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWwgfHwgZGF0YVBvaW50c1tpXS5pbmRleExhYmVsRm9ybWF0dGVyIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlcikge1xuXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwicmFuZ2VCYXJcIixcblx0XHRcdFx0XHRcdGRhdGFQb2ludDogZGF0YVBvaW50c1tpXSxcblx0XHRcdFx0XHRcdGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMsXG5cdFx0XHRcdFx0XHRpbmRleEtleXdvcmQ6IDAsXG5cdFx0XHRcdFx0XHRwb2ludDoge1xuXHRcdFx0XHRcdFx0XHR4OiBkYXRhUG9pbnRzW2ldLnlbMV0gPj0gZGF0YVBvaW50c1tpXS55WzBdID8geDEgOiB4MiwgeTogeTEgKyAoeTIgLSB5MSkgLyAyXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBkYXRhUG9pbnRzW2ldLnlbMV0gPj0gZGF0YVBvaW50c1tpXS55WzBdID8gLTEgOiAxLFxuXHRcdFx0XHRcdFx0Ym91bmRzOiB7XG5cdFx0XHRcdFx0XHRcdHgxOiBNYXRoLm1pbih4MSwgeDIpLCB5MTogeTEsIHgyOiBNYXRoLm1heCh4MSwgeDIpLCB5MjogeTJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRjb2xvcjogY29sb3Jcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBcInJhbmdlQmFyXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0aW5kZXhLZXl3b3JkOiAxLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogZGF0YVBvaW50c1tpXS55WzFdID49IGRhdGFQb2ludHNbaV0ueVswXSA/IHgyIDogeDEsIHk6IHkxICsgKHkyIC0geTEpIC8gMlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55WzFdID49IGRhdGFQb2ludHNbaV0ueVswXSA/IDEgOiAtMSxcblx0XHRcdFx0XHRcdGJvdW5kczoge1xuXHRcdFx0XHRcdFx0XHR4MTogTWF0aC5taW4oeDEsIHgyKSwgeTE6IHkxLCB4MjogTWF0aC5tYXgoeDEsIHgyKSwgeTI6IHkyXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0dmFyIGFuaW1hdGlvbkluZm8gPSB7XG5cdFx0c291cmNlOiBjdHgsIGRlc3Q6IHRoaXMucGxvdEFyZWEuY3R4LCBhbmltYXRpb25DYWxsYmFjazogQW5pbWF0aW9uSGVscGVyLmZhZGVJbkFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcuZWFzZUluUXVhZCwgYW5pbWF0aW9uQmFzZTogMFxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbiIsIlxuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZH0gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXHR2YXIgY3R4ID0gcGxvdFVuaXQudGFyZ2V0Q2FudmFzQ3R4IHx8IHRoaXMucGxvdEFyZWEuY3R4O1xuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGNvbG9yID0gbnVsbDtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdHZhciBpID0gMCwgeCwgeTEsIHkyO1xuXHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGZyb20gZGF0YVRpbWUgZXZlcnl0aW1lIGl0IGlzIHVzZWQuXG5cblx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKSA8PCAwO1xuXG5cdHZhciBtYXhCYXJXaWR0aCA9IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggPyB0aGlzLmRhdGFQb2ludE1heFdpZHRoIDogKHRoaXMud2lkdGggKiAuMDMpO1xuXHQvL3ZhciBtYXhCYXJXaWR0aCA9ICh0aGlzLndpZHRoICogLjAxNSk7XG5cdHZhciB4TWluRGlmZiA9IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLm1pbkRpZmY7XG5cdC8vdmFyIGJhcldpZHRoID0gKCgocGxvdEFyZWEud2lkdGggLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgKiAuOSkgPDwgMDtcblx0dmFyIGJhcldpZHRoID0gKCgocGxvdEFyZWEud2lkdGggLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyBwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblxuXHRpZiAoYmFyV2lkdGggPiBtYXhCYXJXaWR0aClcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXHRlbHNlIGlmICh4TWluRGlmZiA9PT0gSW5maW5pdHkpIHtcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoIC8gcGxvdFVuaXQucGxvdFR5cGUudG90YWxEYXRhU2VyaWVzICogLjk7XG5cdH0gZWxzZSBpZiAoYmFyV2lkdGggPCAxKVxuXHRcdGJhcldpZHRoID0gMTtcblxuXHRjdHguc2F2ZSgpO1xuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnNhdmUoKTtcblxuXHRjdHguYmVnaW5QYXRoKCk7XG5cdGN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdGN0eC5jbGlwKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguY2xpcCgpO1xuXHR9XG5cdC8vY3R4LmJlZ2luUGF0aCgpO1xuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblxuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblxuXG5cdFx0Ly8gUmVkdWNpbmcgcGl4ZWxQZXJVbml0IGJ5IDEganVzdCB0byBvdmVyY29tZSBhbnkgcHJvYmxlbXMgZHVlIHRvIHJvdW5kaW5nIG9mZiBvZiBwaXhlbHMuXG5cdFx0Ly9kYXRhU2VyaWVzLm1heFdpZHRoSW5YID0gYmFyV2lkdGggLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXG5cdFx0Ly92YXIgb2Zmc2V0WCA9IGJhcldpZHRoICogcGxvdFVuaXQuaW5kZXggPDwgMDtcblxuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgeHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhKGRhdGFQb2ludHNbMF0ueCwgZGF0YVBvaW50c1swXS55KTtcblxuXHRcdFx0dmFyIGJldmVsRW5hYmxlZCA9IChiYXJXaWR0aCA+IDUpICYmIGRhdGFTZXJpZXMuYmV2ZWxFbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdGRhdGFQb2ludHNbaV0uZ2V0VGltZSA/IGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ueSA9PT0gbnVsbCB8fCAhZGF0YVBvaW50c1tpXS55Lmxlbmd0aFxuXHRcdFx0XHRcdHx8IHR5cGVvZiAoZGF0YVBvaW50c1tpXS55WzBdKSAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgKGRhdGFQb2ludHNbaV0ueVsxXSkgIT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0eCA9IChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50WCAtIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0XHRcdHkxID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnlbMF0gLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5MiA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55WzFdIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXHRcdFx0XHQvL3ZhciB4MSA9IHggLSBiYXJXaWR0aCAvIDIgPDwgMDtcblx0XHRcdFx0dmFyIHgxID0geCAtIChwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiBiYXJXaWR0aCAvIDIpICsgKChwbG90VW5pdC5wcmV2aW91c0RhdGFTZXJpZXNDb3VudCArIGopICogYmFyV2lkdGgpIDw8IDA7XG5cdFx0XHRcdHZhciB4MiA9IHgxICsgYmFyV2lkdGggPDwgMDtcblx0XHRcdFx0dmFyIHkxO1xuXHRcdFx0XHR2YXIgeTI7XG5cblxuXHRcdFx0XHRjb2xvciA9IGRhdGFQb2ludHNbaV0uY29sb3IgPyBkYXRhUG9pbnRzW2ldLmNvbG9yIDogZGF0YVNlcmllcy5fY29sb3JTZXRbaSAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cblx0XHRcdFx0aWYgKHkxID4geTIpIHtcblx0XHRcdFx0XHR2YXIgdGVtcCA9IHkxO1xuXHRcdFx0XHRcdHkxID0geTI7XG5cdFx0XHRcdFx0eTIgPSB0ZW1wO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbaV07XG5cdFx0XHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuXHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBpLCB4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTJcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvL3ZhciBib3JkZXJUaGlja25lc3MgPSBNYXRoLm1heCgxLCAoYmFyV2lkdGggKiAuMSA8PCAwKSk7XG5cdFx0XHRcdHZhciBib3JkZXJUaGlja25lc3MgPSAwO1xuXG5cdFx0XHRcdGRyYXdSZWN0KGN0eCwgeDEsIHkxLCB4MiwgeTIsIGNvbG9yLCBib3JkZXJUaGlja25lc3MsIGNvbG9yLCBiZXZlbEVuYWJsZWQsIGJldmVsRW5hYmxlZCwgZmFsc2UsIGZhbHNlLCBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5KTtcblx0XHRcdFx0Y29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0ZHJhd1JlY3QodGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIDAsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcblxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpIHtcblxuXHRcdFx0XHRcdHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBcInJhbmdlQ29sdW1uXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0aW5kZXhLZXl3b3JkOiAwLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogeDEgKyAoeDIgLSB4MSkgLyAyLCB5OiBkYXRhUG9pbnRzW2ldLnlbMV0gPj0gZGF0YVBvaW50c1tpXS55WzBdID8geTIgOiB5MVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55WzFdID49IGRhdGFQb2ludHNbaV0ueVswXSA/IC0xIDogMSxcblx0XHRcdFx0XHRcdGJvdW5kczoge1xuXHRcdFx0XHRcdFx0XHR4MTogeDEsIHkxOiBNYXRoLm1pbih5MSwgeTIpLCB4MjogeDIsIHkyOiBNYXRoLm1heCh5MSwgeTIpXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJyYW5nZUNvbHVtblwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdGluZGV4S2V5d29yZDogMSxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgxICsgKHgyIC0geDEpIC8gMiwgeTogZGF0YVBvaW50c1tpXS55WzFdID49IGRhdGFQb2ludHNbaV0ueVswXSA/IHkxIDogeTJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueVsxXSA+PSBkYXRhUG9pbnRzW2ldLnlbMF0gPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRib3VuZHM6IHtcblx0XHRcdFx0XHRcdFx0eDE6IHgxLCB5MTogTWF0aC5taW4oeTEsIHkyKSwgeDI6IHgyLCB5MjogTWF0aC5tYXgoeTEsIHkyKVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRzb3VyY2U6IGN0eCwgZGVzdDogdGhpcy5wbG90QXJlYS5jdHgsIGFuaW1hdGlvbkNhbGxiYWNrOiBBbmltYXRpb25IZWxwZXIuZmFkZUluQW5pbWF0aW9uLCBlYXNpbmdGdW5jdGlvbjogQW5pbWF0aW9uSGVscGVyLmVhc2luZy5lYXNlSW5RdWFkLCBhbmltYXRpb25CYXNlOiAwXG5cdH07XG5cdHJldHVybiBhbmltYXRpb25JbmZvO1xufVxuIiwiXG5pbXBvcnQge2lzQ2FudmFzU3VwcG9ydGVkfSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocGxvdFVuaXQpIHtcblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblx0dmFyIHRvdGFsRGF0YVNlcmllcyA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblxuXHRpZiAodG90YWxEYXRhU2VyaWVzIDw9IDApXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBnaG9zdEN0eCA9IHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eDtcblxuXHR2YXIgYXhpc1hQcm9wcyA9IHBsb3RVbml0LmF4aXNYLmxpbmVDb29yZGluYXRlcztcblx0dmFyIGF4aXNZUHJvcHMgPSBwbG90VW5pdC5heGlzWS5saW5lQ29vcmRpbmF0ZXM7XG5cdHZhciBtYXJrZXJzID0gW107XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblx0Y3R4LnNhdmUoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0Z2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRnaG9zdEN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0Z2hvc3RDdHguY2xpcCgpO1xuXHR9XG5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7IGorKykge1xuXG5cdFx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdO1xuXG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblxuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXG5cdFx0dmFyIHNlcmllc0lkID0gZGF0YVNlcmllcy5pZDtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW3Nlcmllc0lkXSA9IHtcblx0XHRcdG9iamVjdFR5cGU6IFwiZGF0YVNlcmllc1wiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleFxuXHRcdH07XG5cblx0XHR2YXIgaGV4Q29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKHNlcmllc0lkKTtcblx0XHRnaG9zdEN0eC5maWxsU3R5bGUgPSBoZXhDb2xvcjtcblx0XHQvL2dob3N0Q3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblx0XHQvL2dob3N0Q3R4LmxpbmVXaWR0aCA9IDIwO1xuXG5cdFx0bWFya2VycyA9IFtdO1xuXG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblx0XHR2YXIgaSA9IDAsIHgsIHkxLCB5Mjtcblx0XHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGJhY2sgYW5kIGZvcnRoLlxuXG5cdFx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0dmFyIGJhc2VZO1xuXG5cdFx0dmFyIHN0YXJ0UG9pbnQgPSBudWxsO1xuXG5cdFx0dmFyIHBpeGVsc1kxID0gW107XG5cdFx0dmFyIHBpeGVsc1kyID0gW107XG5cblx0XHRpZiAoZGF0YVBvaW50cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL2N0eC5zdHJva2VTdHlsZSA9IFwiIzQ1NzJBNyBcIjtcblx0XHRcdGNvbG9yID0gZGF0YVNlcmllcy5fY29sb3JTZXRbaSAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cdFx0XHQvL2N0eC5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gY29sb3I7XG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcblx0XHRcdGN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3M7XG5cblx0XHRcdGlmIChjdHguc2V0TGluZURhc2gpIHtcblx0XHRcdFx0Y3R4LnNldExpbmVEYXNoKGdldExpbmVEYXNoQXJyYXkoZGF0YVNlcmllcy5saW5lRGFzaFR5cGUsIGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcykpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54LmdldFRpbWUgPyBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50c1tpXS54O1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW4gfHwgZGF0YVBvaW50WCA+IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS55ID09PSBudWxsIHx8ICFkYXRhUG9pbnRzW2ldLnkubGVuZ3RoIHx8IHR5cGVvZiAoZGF0YVBvaW50c1tpXS55WzBdKSAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgKGRhdGFQb2ludHNbaV0ueVsxXSkgIT09IFwibnVtYmVyXCIpIHtcblx0XHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRcdHJlbmRlckJlemllckFyZWEoKTtcblx0XHRcdFx0XHRcdHBpeGVsc1kxID0gW107XG5cdFx0XHRcdFx0XHRwaXhlbHNZMiA9IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5MSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55WzBdIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eTIgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludHNbaV0ueVsxXSAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4LCB5MTogeTEsIHkyOiB5MlxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHBpeGVsc1kxW3BpeGVsc1kxLmxlbmd0aF0gPSB7XG5cdFx0XHRcdFx0eDogeCwgeTogeTFcblx0XHRcdFx0fTtcblx0XHRcdFx0cGl4ZWxzWTJbcGl4ZWxzWTIubGVuZ3RoXSA9IHtcblx0XHRcdFx0XHR4OiB4LCB5OiB5MlxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vUmVuZGVyIE1hcmtlclxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5tYXJrZXJTaXplICE9PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ubWFya2VyU2l6ZSA+IDAgfHwgZGF0YVNlcmllcy5tYXJrZXJTaXplID4gMCkge1xuXHRcdFx0XHRcdFx0dmFyIG1hcmtlclByb3BzID0gZGF0YVNlcmllcy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGksIHgsIHkxLCBjdHgpO1xuXHRcdFx0XHRcdFx0bWFya2Vycy5wdXNoKG1hcmtlclByb3BzKTtcblxuXHRcdFx0XHRcdFx0Ly9pZiAoIWRhdGFTZXJpZXMubWF4V2lkdGhJblggfHwgbWFya2VyUHJvcHMuc2l6ZSA+IGRhdGFTZXJpZXMubWF4V2lkdGhJblgpIHtcblx0XHRcdFx0XHRcdC8vXHRkYXRhU2VyaWVzLm1heFdpZHRoSW5YID0gbWFya2VyUHJvcHMuc2l6ZSAvIChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgPiAxID8gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0IC0gMSA6IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCk7XG5cdFx0XHRcdFx0XHQvL31cblxuXHRcdFx0XHRcdFx0dmFyIG1hcmtlckNvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhpZCk7XG5cblx0XHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHkxLCBjdHg6IGdob3N0Q3R4LFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IG1hcmtlclByb3BzLnR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0c2l6ZTogbWFya2VyUHJvcHMuc2l6ZSxcblx0XHRcdFx0XHRcdFx0XHRjb2xvcjogbWFya2VyQ29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyQ29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlclRoaWNrbmVzczogbWFya2VyUHJvcHMuYm9yZGVyVGhpY2tuZXNzXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR2YXIgbWFya2VyUHJvcHMgPSBkYXRhU2VyaWVzLmdldE1hcmtlclByb3BlcnRpZXMoaSwgeCwgeTIsIGN0eCk7XG5cdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2gobWFya2VyUHJvcHMpO1xuXG5cdFx0XHRcdFx0XHQvL2lmICghZGF0YVNlcmllcy5tYXhXaWR0aEluWCB8fCBtYXJrZXJQcm9wcy5zaXplID4gZGF0YVNlcmllcy5tYXhXaWR0aEluWCkge1xuXHRcdFx0XHRcdFx0Ly9cdGRhdGFTZXJpZXMubWF4V2lkdGhJblggPSBtYXJrZXJQcm9wcy5zaXplIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblx0XHRcdFx0XHRcdC8vfVxuXG5cdFx0XHRcdFx0XHR2YXIgbWFya2VyQ29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0eDogeCwgeTogeTIsIGN0eDogZ2hvc3RDdHgsXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogbWFya2VyUHJvcHMudHlwZSxcblx0XHRcdFx0XHRcdFx0XHRzaXplOiBtYXJrZXJQcm9wcy5zaXplLFxuXHRcdFx0XHRcdFx0XHRcdGNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJDb2xvcjogbWFya2VyQ29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyVGhpY2tuZXNzOiBtYXJrZXJQcm9wcy5ib3JkZXJUaGlja25lc3Ncblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblxuXHRcdFx0XHQvL1JlbmRlciBJbmRleCBMYWJlbHNcblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbCB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWwgfHwgZGF0YVBvaW50c1tpXS5pbmRleExhYmVsRm9ybWF0dGVyIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlcikge1xuXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwic3BsaW5lQXJlYVwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdGluZGV4S2V5d29yZDogMCxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHkxXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBkYXRhUG9pbnRzW2ldLnlbMF0gPD0gZGF0YVBvaW50c1tpXS55WzFdID8gLTEgOiAxLFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJzcGxpbmVBcmVhXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0aW5kZXhLZXl3b3JkOiAxLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogeCwgeTogeTJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueVswXSA8PSBkYXRhUG9pbnRzW2ldLnlbMV0gPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRjb2xvcjogY29sb3Jcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJlbmRlckJlemllckFyZWEoKTtcblxuXHRcdFx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXJzKG1hcmtlcnMpO1xuXHRcdH1cblx0fVxuXG5cdGN0eC5yZXN0b3JlKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZXN0b3JlKCk7XG5cblx0ZnVuY3Rpb24gcmVuZGVyQmV6aWVyQXJlYSgpIHtcblx0XHR2YXIgYnAgPSBnZXRCZXppZXJQb2ludHMocGl4ZWxzWTEsIDIpO1xuXG5cdFx0aWYgKGJwLmxlbmd0aCA+IDApIHtcblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGN0eC5tb3ZlVG8oYnBbMF0ueCwgYnBbMF0ueSk7XG5cblx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKGJwWzBdLngsIGJwWzBdLnkpO1xuXHRcdFx0fVxuXG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYnAubGVuZ3RoIC0gMzsgaSArPSAzKSB7XG5cblx0XHRcdFx0Y3R4LmJlemllckN1cnZlVG8oYnBbaSArIDFdLngsIGJwW2kgKyAxXS55LCBicFtpICsgMl0ueCwgYnBbaSArIDJdLnksIGJwW2kgKyAzXS54LCBicFtpICsgM10ueSk7XG5cblx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdGdob3N0Q3R4LmJlemllckN1cnZlVG8oYnBbaSArIDFdLngsIGJwW2kgKyAxXS55LCBicFtpICsgMl0ueCwgYnBbaSArIDJdLnksIGJwW2kgKyAzXS54LCBicFtpICsgM10ueSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChkYXRhU2VyaWVzLmxpbmVUaGlja25lc3MgPiAwKVxuXHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cblx0XHRcdGJwID0gZ2V0QmV6aWVyUG9pbnRzKHBpeGVsc1kyLCAyKTtcblxuXHRcdFx0Y3R4LmxpbmVUbyhwaXhlbHNZMltwaXhlbHNZMi5sZW5ndGggLSAxXS54LCBwaXhlbHNZMltwaXhlbHNZMi5sZW5ndGggLSAxXS55KTtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IGJwLmxlbmd0aCAtIDE7IGkgPiAyOyBpIC09IDMpIHtcblxuXHRcdFx0XHRjdHguYmV6aWVyQ3VydmVUbyhicFtpIC0gMV0ueCwgYnBbaSAtIDFdLnksIGJwW2kgLSAyXS54LCBicFtpIC0gMl0ueSwgYnBbaSAtIDNdLngsIGJwW2kgLSAzXS55KTtcblxuXHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0Z2hvc3RDdHguYmV6aWVyQ3VydmVUbyhicFtpIC0gMV0ueCwgYnBbaSAtIDFdLnksIGJwW2kgLSAyXS54LCBicFtpIC0gMl0ueSwgYnBbaSAtIDNdLngsIGJwW2kgLSAzXS55KTtcblx0XHRcdH1cblxuXHRcdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXG5cdFx0XHRjdHguZ2xvYmFsQWxwaGEgPSBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5O1xuXHRcdFx0Y3R4LmZpbGwoKTtcblx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cblxuXHRcdFx0aWYgKGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcyA+IDApIHtcblx0XHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRjdHgubW92ZVRvKHBpeGVsc1kyW3BpeGVsc1kyLmxlbmd0aCAtIDFdLngsIHBpeGVsc1kyW3BpeGVsc1kyLmxlbmd0aCAtIDFdLnkpO1xuXG5cdFx0XHRcdGZvciAodmFyIGkgPSBicC5sZW5ndGggLSAxOyBpID4gMjsgaSAtPSAzKSB7XG5cblx0XHRcdFx0XHRjdHguYmV6aWVyQ3VydmVUbyhicFtpIC0gMV0ueCwgYnBbaSAtIDFdLnksIGJwW2kgLSAyXS54LCBicFtpIC0gMl0ueSwgYnBbaSAtIDNdLngsIGJwW2kgLSAzXS55KTtcblxuXHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmJlemllckN1cnZlVG8oYnBbaSAtIDFdLngsIGJwW2kgLSAxXS55LCBicFtpIC0gMl0ueCwgYnBbaSAtIDJdLnksIGJwW2kgLSAzXS54LCBicFtpIC0gM10ueSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cblxuXHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdGdob3N0Q3R4LmNsb3NlUGF0aCgpO1xuXHRcdFx0XHRnaG9zdEN0eC5maWxsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRzb3VyY2U6IGN0eCwgZGVzdDogdGhpcy5wbG90QXJlYS5jdHgsIGFuaW1hdGlvbkNhbGxiYWNrOiBBbmltYXRpb25IZWxwZXIueENsaXBBbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmxpbmVhciwgYW5pbWF0aW9uQmFzZTogMFxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbi8vI3JlZ2lvbiBwaWVDaGFydFxuXG52YXIgZHJhd1NlZ21lbnQgPSBmdW5jdGlvbiAoY3R4LCBjZW50ZXIsIHJhZGl1cywgY29sb3IsIHR5cGUsIHRoZXRhMSwgdGhldGEyLCBmaWxsT3BhY2l0eSwgcGVyY2VudElubmVyUmFkaXVzKSB7XG5cblx0aWYgKHR5cGVvZiAoZmlsbE9wYWNpdHkpID09PSBcInVuZGVmaW5lZFwiKVxuXHRcdGZpbGxPcGFjaXR5ID0gMTtcblxuXHQvL0lFOC0gRklYOiBJbiBJRTgtIHNlZ21lbnQgZG9lc24ndCBnZXQgZHJhdyBpZiB0aGV0YTIgaXMgZXF1YWwgdG8gdGhldGExICsgMipQSS5cblx0aWYgKCFpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdHZhciB0aGV0YTJNb2QgPSBOdW1iZXIoKHRoZXRhMiAlICgyICogTWF0aC5QSSkpLnRvRml4ZWQoOCkpO1xuXHRcdHZhciB0aGV0YTFNb2QgPSBOdW1iZXIoKHRoZXRhMSAlICgyICogTWF0aC5QSSkpLnRvRml4ZWQoOCkpO1xuXHRcdGlmICh0aGV0YTFNb2QgPT09IHRoZXRhMk1vZClcblx0XHRcdHRoZXRhMiAtPSAuMDAwMTtcblx0fVxuXG5cdGN0eC5zYXZlKCk7XG5cdGN0eC5nbG9iYWxBbHBoYSA9IGZpbGxPcGFjaXR5O1xuXG5cdGlmICh0eXBlID09PSBcInBpZVwiKSB7XG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdGN0eC5tb3ZlVG8oY2VudGVyLngsIGNlbnRlci55KTtcblx0XHRjdHguYXJjKGNlbnRlci54LCBjZW50ZXIueSwgcmFkaXVzLCB0aGV0YTEsIHRoZXRhMiwgZmFsc2UpO1xuXHRcdGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcblx0XHRjdHguc3Ryb2tlU3R5bGUgPSBcIndoaXRlXCI7XG5cdFx0Y3R4LmxpbmVXaWR0aCA9IDI7XG5cdFx0Ly8gICAgY3R4LnNoYWRvd09mZnNldFggPSAyO1xuXHRcdC8vICAgIGN0eC5zaGFkb3dPZmZzZXRZID0gMTtcblx0XHQvLyAgICAgY3R4LnNoYWRvd0JsdXIgPSAyO1xuXHRcdC8vICAgIGN0eC5zaGFkb3dDb2xvciA9ICcjQkZCRkJGJztcblx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0Ly9jdHguc3Ryb2tlKCk7XG5cdFx0Y3R4LmZpbGwoKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlID09PSBcImRvdWdobnV0XCIpIHtcblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4LmFyYyhjZW50ZXIueCwgY2VudGVyLnksIHJhZGl1cywgdGhldGExLCB0aGV0YTIsIGZhbHNlKTtcblx0XHRjdHguYXJjKGNlbnRlci54LCBjZW50ZXIueSwgcGVyY2VudElubmVyUmFkaXVzICogcmFkaXVzLCB0aGV0YTIsIHRoZXRhMSwgdHJ1ZSk7XG5cdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXHRcdGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcblx0XHRjdHguc3Ryb2tlU3R5bGUgPSBcIndoaXRlXCI7XG5cdFx0Y3R4LmxpbmVXaWR0aCA9IDI7XG5cdFx0Ly8gc2hhZG93IHByb3BlcnRpZXNcblx0XHQvLyAgICAgY3R4LnNoYWRvd09mZnNldFggPSAxO1xuXHRcdC8vICAgIGN0eC5zaGFkb3dPZmZzZXRZID0gMTtcblx0XHQvLyAgICAgY3R4LnNoYWRvd0JsdXIgPSAxO1xuXHRcdC8vICAgIGN0eC5zaGFkb3dDb2xvciA9ICcjQkZCRkJGJzsgIC8vZ3JleSBzaGFkb3dcblx0XHQvL2N0eC5zdHJva2UoKTtcblx0XHRjdHguZmlsbCgpO1xuXHR9XG5cblx0Y3R4Lmdsb2JhbEFscGhhID0gMTtcblxuXHRjdHgucmVzdG9yZSgpO1xufTtcbiIsIlxuaW1wb3J0IFJlbmRlckhlbHBlciBmcm9tICcuLi9oZWxwZXJzL3JlbmRlcic7XG5pbXBvcnQgQW5pbWF0aW9uSGVscGVyIGZyb20gJy4uL2hlbHBlcnMvYW5pbWF0b3InO1xuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZCwgaW50VG9IZXhDb2xvclN0cmluZ30gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXHR2YXIgY3R4ID0gcGxvdFVuaXQudGFyZ2V0Q2FudmFzQ3R4IHx8IHRoaXMucGxvdEFyZWEuY3R4O1xuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGNvbG9yID0gbnVsbDtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdHZhciBpID0gMCwgeCwgeTtcblx0dmFyIGRhdGFQb2ludFg7IC8vVXNlZCBzbyB0aGF0IHdoZW4gZGF0YVBvaW50LnggaXMgYSBEYXRlVGltZSB2YWx1ZSwgaXQgZG9lc24ndCBnZXQgY29udmVydGVkIHRvIG51bWJlciBmcm9tIGRhdGFUaW1lIGV2ZXJ5dGltZSBpdCBpcyB1c2VkLlxuXG5cdHZhciB5WmVyb1RvUGl4ZWwgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKDAgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSkgPDwgMDtcblxuXHR2YXIgbWF4QmFyV2lkdGggPSB0aGlzLmRhdGFQb2ludE1heFdpZHRoID8gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA6IHRoaXMud2lkdGggKiAuMTUgPDwgMDtcblx0dmFyIHhNaW5EaWZmID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8ubWluRGlmZjtcblx0dmFyIGJhcldpZHRoID0gKCgocGxvdEFyZWEud2lkdGggLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyB0b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblxuXG5cdGN0eC5zYXZlKCk7XG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXHRcdHZhciBpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IHRydWU7XG5cblx0XHRpZiAoZGF0YVBvaW50cy5sZW5ndGggPT0gMSlcblx0XHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cblx0XHRpZiAoYmFyV2lkdGggPCAxKVxuXHRcdFx0YmFyV2lkdGggPSAxO1xuXHRcdGVsc2UgaWYgKGJhcldpZHRoID4gbWF4QmFyV2lkdGgpXG5cdFx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgYmV2ZWxFbmFibGVkID0gKGJhcldpZHRoID4gNSkgPyBmYWxzZSA6IGZhbHNlO1xuXG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBcIiM0NTcyQTcgXCI7XG5cblx0XHRcdHZhciBtYXhBcmVhID0gTWF0aC5wb3coTWF0aC5taW4ocGxvdEFyZWEuaGVpZ2h0LCBwbG90QXJlYS53aWR0aCkgKiAuMyAvIDIsIDIpICogTWF0aC5QSTtcblxuXHRcdFx0dmFyIHByZXZEYXRhUG9pbnRYID0gMDtcblx0XHRcdHZhciBwcmV2RGF0YVBvaW50WSA9IDA7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLmdldFRpbWUgPyBkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54LmdldFRpbWUoKSA6IGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLng7XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludFggPCBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbiB8fCBkYXRhUG9pbnRYID4gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0eXBlb2YgKGRhdGFQb2ludHNbaV0ueSkgIT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0eCA9IChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50WCAtIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0XHRcdHkgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludHNbaV0ueSAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cblx0XHRcdFx0dmFyIG1hcmtlclByb3BzID0gZGF0YVNlcmllcy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGksIHgsIHksIGN0eCk7XG5cblx0XHRcdFx0Y3R4Lmdsb2JhbEFscGhhID0gZGF0YVNlcmllcy5maWxsT3BhY2l0eTtcblx0XHRcdFx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXIobWFya2VyUHJvcHMueCwgbWFya2VyUHJvcHMueSwgbWFya2VyUHJvcHMuY3R4LCBtYXJrZXJQcm9wcy50eXBlLCBtYXJrZXJQcm9wcy5zaXplLCBtYXJrZXJQcm9wcy5jb2xvciwgbWFya2VyUHJvcHMuYm9yZGVyQ29sb3IsIG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzcyk7XG5cdFx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cblxuXHRcdFx0XHQvL2lmIChNYXRoLmFicyhwcmV2RGF0YVBvaW50WCAtIHgpIDwgbWFya2VyUHJvcHMuc2l6ZSAvIDIgJiYgTWF0aC5hYnMocHJldkRhdGFQb2ludFkgLSB5KSA8IG1hcmtlclByb3BzLnNpemUgLyAyKSB7XG5cdFx0XHRcdC8vICAgIGNvbnRpbnVlO1xuXHRcdFx0XHQvL31cblxuXHRcdFx0XHQvL2lmICghZGF0YVNlcmllcy5tYXhXaWR0aEluWCB8fCBtYXJrZXJQcm9wcy5zaXplID4gZGF0YVNlcmllcy5tYXhXaWR0aEluWCkge1xuXHRcdFx0XHQvL1x0ZGF0YVNlcmllcy5tYXhXaWR0aEluWCA9IG1hcmtlclByb3BzLnNpemUgLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXHRcdFx0XHQvL31cblxuXHRcdFx0XHRpZiAoKE1hdGguc3FydCgocHJldkRhdGFQb2ludFggLSB4KSAqIChwcmV2RGF0YVBvaW50WCAtIHgpICsgKHByZXZEYXRhUG9pbnRZIC0geSkgKiAocHJldkRhdGFQb2ludFkgLSB5KSkgPCBNYXRoLm1pbihtYXJrZXJQcm9wcy5zaXplLCA1KSlcblx0XHRcdFx0XHQmJiBkYXRhUG9pbnRzLmxlbmd0aCA+IChNYXRoLm1pbih0aGlzLnBsb3RBcmVhLndpZHRoLCB0aGlzLnBsb3RBcmVhLmhlaWdodCkpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL1JlbmRlciBJRCBvbiBHaG9zdCBDYW52YXMgLSBmb3IgZXZlbnQgaGFuZGxpbmdcblx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbaV07XG5cdFx0XHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuXHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBpLCB4MTogeCwgeTE6IHlcblx0XHRcdFx0fTtcblx0XHRcdFx0dmFyIG1hcmtlckNvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhpZCk7XG5cblx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXIoXG5cdFx0XHRcdFx0XHRcdG1hcmtlclByb3BzLngsIG1hcmtlclByb3BzLnksIHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eCxcblx0XHRcdFx0XHRcdFx0bWFya2VyUHJvcHMudHlwZSxcblx0XHRcdFx0XHRcdFx0bWFya2VyUHJvcHMuc2l6ZSxcblx0XHRcdFx0XHRcdFx0bWFya2VyQ29sb3IsXG5cdFx0XHRcdFx0XHRcdG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRtYXJrZXJQcm9wcy5ib3JkZXJUaGlja25lc3Ncblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly9tYXJrZXJzLnB1c2goKTtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5pbmRleExhYmVsIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbCB8fCBkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWxGb3JtYXR0ZXIgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJzY2F0dGVyXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogeCwgeTogeVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogMSxcblx0XHRcdFx0XHRcdGJvdW5kczoge1xuXHRcdFx0XHRcdFx0XHR4MTogeCAtIG1hcmtlclByb3BzLnNpemUgLyAyLCB5MTogeSAtIG1hcmtlclByb3BzLnNpemUgLyAyLCB4MjogeCArIG1hcmtlclByb3BzLnNpemUgLyAyLCB5MjogeSArIG1hcmtlclByb3BzLnNpemUgLyAyXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRwcmV2RGF0YVBvaW50WCA9IHg7XG5cdFx0XHRcdHByZXZEYXRhUG9pbnRZID0geTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0dmFyIGFuaW1hdGlvbkluZm8gPSB7XG5cdFx0c291cmNlOiBjdHgsIGRlc3Q6IHRoaXMucGxvdEFyZWEuY3R4LCBhbmltYXRpb25DYWxsYmFjazogQW5pbWF0aW9uSGVscGVyLmZhZGVJbkFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcuZWFzZUluUXVhZCwgYW5pbWF0aW9uQmFzZTogMFxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbiIsIlxuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZH0gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXHRcdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0XHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXHRcdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRcdHJldHVybjtcblxuXHRcdHZhciBnaG9zdEN0eCA9IHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eDtcblxuXHRcdGN0eC5zYXZlKCk7XG5cblx0XHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdGN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0Y3R4LmNsaXAoKTtcblxuXHRcdHZhciBtYXJrZXJzID0gW107XG5cblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblxuXHRcdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblx0XHRcdGN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3M7XG5cdFx0XHR2YXIgZGF0YVBvaW50cyA9IGRhdGFTZXJpZXMuZGF0YVBvaW50cztcblxuXHRcdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheShkYXRhU2VyaWVzLmxpbmVEYXNoVHlwZSwgZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzKSk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBzZXJpZXNJZCA9IGRhdGFTZXJpZXMuaWQ7XG5cdFx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW3Nlcmllc0lkXSA9IHtcblx0XHRcdFx0b2JqZWN0VHlwZTogXCJkYXRhU2VyaWVzXCIsIGRhdGFTZXJpZXNJbmRleDogZGF0YVNlcmllc0luZGV4XG5cdFx0XHR9O1xuXHRcdFx0dmFyIGhleENvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhzZXJpZXNJZCk7XG5cdFx0XHRnaG9zdEN0eC5zdHJva2VTdHlsZSA9IGhleENvbG9yO1xuXHRcdFx0Ly9naG9zdEN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3M7XG5cdFx0XHRnaG9zdEN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3MgPiAwID8gTWF0aC5tYXgoZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzLCA0KSA6IDA7XG5cblx0XHRcdHZhciBjb2xvclNldCA9IGRhdGFTZXJpZXMuX2NvbG9yU2V0O1xuXHRcdFx0dmFyIGNvbG9yID0gY29sb3JTZXRbMF07XG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcblxuXHRcdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblx0XHRcdHZhciBpID0gMCwgeCwgeTtcblx0XHRcdHZhciBkYXRhUG9pbnRYOyAvL1VzZWQgc28gdGhhdCB3aGVuIGRhdGFQb2ludC54IGlzIGEgRGF0ZVRpbWUgdmFsdWUsIGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBudW1iZXIgYmFjayBhbmQgZm9ydGguXG5cblx0XHRcdC8vaWYgKCFkYXRhU2VyaWVzLl9vcHRpb25zLm1hcmtlclNpemUgJiYgZGF0YVNlcmllcy5kYXRhUG9pbnRzLmxlbmd0aCA8IDEwMDApXG5cdFx0XHQvLyAgICBkYXRhU2VyaWVzLm1hcmtlclNpemUgPSA4O1xuXG5cdFx0XHR2YXIgcGl4ZWxzID0gW107XG5cblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGlmIChkYXRhUG9pbnRzLmxlbmd0aCA+IDApIHtcblxuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0uZ2V0VGltZSA/IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCkgOiBkYXRhUG9pbnRzW2ldLng7XG5cblx0XHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heClcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0Ly9pZiAoIWlzRmluaXRlKGRhdGFQb2ludHNbaV0ueSkpXG5cdFx0XHRcdFx0Ly8gICAgY29udGludWU7XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIChkYXRhUG9pbnRzW2ldLnkpICE9PSBcIm51bWJlclwiKSB7XG5cdFx0XHRcdFx0XHRpZiAoaSA+IDApIHsvLyBpZiBmaXJzdCBkYXRhUG9pbnQgaXMgbnVsbCB0aGVuIG5vIG5lZWQgdG8gY2FsbCBzdHJva2UgbWV0aG9kXG5cdFx0XHRcdFx0XHRcdHJlbmRlckJlemllcihwaXhlbHMpO1xuXHRcdFx0XHRcdFx0XHRwaXhlbHMgPSBbXTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0eCA9IChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50WCAtIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXHRcdFx0XHRcdHZhciBpZCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2ldO1xuXHRcdFx0XHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuXHRcdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4LCB5MTogeVxuXHRcdFx0XHRcdH07XG5cblxuXHRcdFx0XHRcdHBpeGVsc1twaXhlbHMubGVuZ3RoXSA9IHtcblx0XHRcdFx0XHRcdHg6IHgsIHk6IHlcblx0XHRcdFx0XHR9O1xuXG5cblx0XHRcdFx0XHQvL0FkZCBNYXJrZXJzXG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ubWFya2VyU2l6ZSA+IDAgfHwgZGF0YVNlcmllcy5tYXJrZXJTaXplID4gMCkge1xuXG5cdFx0XHRcdFx0XHR2YXIgbWFya2VyUHJvcHMgPSBkYXRhU2VyaWVzLmdldE1hcmtlclByb3BlcnRpZXMoaSwgeCwgeSwgY3R4KTtcblx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaChtYXJrZXJQcm9wcyk7XG5cblx0XHRcdFx0XHRcdC8vaWYgKCFkYXRhU2VyaWVzLm1heFdpZHRoSW5YIHx8IG1hcmtlclByb3BzLnNpemUgPiBkYXRhU2VyaWVzLm1heFdpZHRoSW5YKSB7XG5cdFx0XHRcdFx0XHQvL1x0ZGF0YVNlcmllcy5tYXhXaWR0aEluWCA9IG1hcmtlclByb3BzLnNpemUgLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXHRcdFx0XHRcdFx0Ly99XG5cblx0XHRcdFx0XHRcdHZhciBtYXJrZXJDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdFx0XHQvL3dpbmRvdy5jb25zb2xlLmxvZyhcImluZGV4OiBcIiArIGkgKyBcIjsgaWQ6IFwiICsgaWQgKyBcIjsgaGV4OiBcIiArIG1hcmtlckNvbG9yKTtcblx0XHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHksIGN0eDogZ2hvc3RDdHgsXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogbWFya2VyUHJvcHMudHlwZSxcblx0XHRcdFx0XHRcdFx0XHRzaXplOiBtYXJrZXJQcm9wcy5zaXplLFxuXHRcdFx0XHRcdFx0XHRcdGNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJDb2xvcjogbWFya2VyQ29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyVGhpY2tuZXNzOiBtYXJrZXJQcm9wcy5ib3JkZXJUaGlja25lc3Ncblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly9BZGQgTGFiZWxzXG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbCB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWwgfHwgZGF0YVBvaW50c1tpXS5pbmRleExhYmVsRm9ybWF0dGVyIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlcikge1xuXG5cdFx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBcInNwbGluZVwiLFxuXHRcdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRcdGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMsXG5cdFx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdFx0eDogeCwgeTogeVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueSA+PSAwID8gMSA6IC0xLFxuXHRcdFx0XHRcdFx0XHRjb2xvcjogY29sb3Jcblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmVuZGVyQmV6aWVyKHBpeGVscyk7XG5cdFx0fVxuXG5cdFx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXJzKG1hcmtlcnMpO1xuXHRcdGN0eC5yZXN0b3JlKCk7XG5cblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cblx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblxuXHRcdGZ1bmN0aW9uIHJlbmRlckJlemllcihwaXhlbHMpIHtcblxuXHRcdFx0dmFyIGJwID0gZ2V0QmV6aWVyUG9pbnRzKHBpeGVscywgMik7XG5cblx0XHRcdGlmIChicC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXG5cdFx0XHRcdGN0eC5tb3ZlVG8oYnBbMF0ueCwgYnBbMF0ueSk7XG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oYnBbMF0ueCwgYnBbMF0ueSk7XG5cblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBicC5sZW5ndGggLSAzOyBpICs9IDMpIHtcblxuXHRcdFx0XHRcdGN0eC5iZXppZXJDdXJ2ZVRvKGJwW2kgKyAxXS54LCBicFtpICsgMV0ueSwgYnBbaSArIDJdLngsIGJwW2kgKyAyXS55LCBicFtpICsgM10ueCwgYnBbaSArIDNdLnkpO1xuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdFx0Z2hvc3RDdHguYmV6aWVyQ3VydmVUbyhicFtpICsgMV0ueCwgYnBbaSArIDFdLnksIGJwW2kgKyAyXS54LCBicFtpICsgMl0ueSwgYnBbaSArIDNdLngsIGJwW2kgKyAzXS55KTtcblxuXHRcdFx0XHRcdGlmIChpID4gMCAmJiBpICUgMzAwMCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXHRcdFx0XHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdFx0Y3R4Lm1vdmVUbyhicFtpICsgM10ueCwgYnBbaSArIDNdLnkpO1xuXG5cdFx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDdHguc3Ryb2tlKCk7XG5cdFx0XHRcdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oYnBbaSArIDNdLngsIGJwW2kgKyAzXS55KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cblx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdGdob3N0Q3R4LnN0cm9rZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0XHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci54Q2xpcEFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcubGluZWFyLCBhbmltYXRpb25CYXNlOiAwXG5cdFx0fTtcblx0XHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcblx0fVxuXG5cdHZhciBkcmF3UmVjdCA9IGZ1bmN0aW9uIChjdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgYm9yZGVyVGhpY2tuZXNzLCBib3JkZXJDb2xvciwgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCBmaWxsT3BhY2l0eSkge1xuXHRcdGlmICh0eXBlb2YgKGZpbGxPcGFjaXR5KSA9PT0gXCJ1bmRlZmluZWRcIilcblx0XHRcdGZpbGxPcGFjaXR5ID0gMTtcblxuXHRcdGJvcmRlclRoaWNrbmVzcyA9IGJvcmRlclRoaWNrbmVzcyB8fCAwO1xuXHRcdGJvcmRlckNvbG9yID0gYm9yZGVyQ29sb3IgfHwgXCJibGFja1wiO1xuXHRcdC8vYWxlcnQoXCJ0b3BcIisgdG9wICsgXCJib3R0b21cIiArIGJvdHRvbSArIFwiIGx0XCIgKyBsZWZ0KyBcInJ0XCIgKyByaWdodCApXG5cdFx0dmFyIGExID0geDEsIGEyID0geDIsIGIxID0geTEsIGIyID0geTIsIGVkZ2VZLCBlZGdlWDtcblx0XHRpZiAoeDIgLSB4MSA+IDE1ICYmIHkyIC0geTEgPiAxNSlcblx0XHRcdHZhciBiZXZlbERlcHRoID0gODtcblx0XHRlbHNlXG5cdFx0XHR2YXIgYmV2ZWxEZXB0aCA9IDAuMzUgKiBNYXRoLm1pbigoeDIgLSB4MSksICh5MiAtIHkxKSk7XG5cdFx0Ly9hbGVydChhMSArIFwiXCIgKyBhMik7XG5cdFx0dmFyIGNvbG9yMiA9IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAuNClcIjtcblx0XHR2YXIgY29sb3IzID0gXCJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSlcIjtcblx0XHQvL2NvbG9yMSA9IFwicmdiYShcIiArIHIgKyBcIixcIiArIGcgKyBcIiwgXCIgKyBiICsgXCIsMSlcIjtcblx0XHR2YXIgY29sb3IxID0gY29sb3I7XG5cblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4Lm1vdmVUbyh4MSwgeTEpO1xuXHRcdGN0eC5zYXZlKCk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IGNvbG9yMTtcblxuXHRcdGN0eC5nbG9iYWxBbHBoYSA9IGZpbGxPcGFjaXR5O1xuXHRcdGN0eC5maWxsUmVjdCh4MSwgeTEsIHgyIC0geDEsIHkyIC0geTEpO1xuXHRcdGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cblx0XHRpZiAoYm9yZGVyVGhpY2tuZXNzID4gMCkge1xuXHRcdFx0dmFyIG9mZnNldCA9IGJvcmRlclRoaWNrbmVzcyAlIDIgPT09IDAgPyAwIDogLjU7XG5cdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRjdHgubGluZVdpZHRoID0gYm9yZGVyVGhpY2tuZXNzO1xuXHRcdFx0Y3R4LnN0cm9rZVN0eWxlID0gYm9yZGVyQ29sb3I7XG5cdFx0XHRjdHgubW92ZVRvKHgxLCB5MSk7XG5cdFx0XHRjdHgucmVjdCh4MSAtIG9mZnNldCwgeTEgLSBvZmZzZXQsIHgyIC0geDEgKyAyICogb2Zmc2V0LCB5MiAtIHkxICsgMiAqIG9mZnNldCk7XG5cdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0fVxuXG5cdFx0Y3R4LnJlc3RvcmUoKTtcblx0XHQvLyAgIGN0eC5iZWdpblBhdGgoKTtcblx0XHRpZiAodG9wID09PSB0cnVlKSB7XG5cdFx0XHQvLyBhbGVydCh4MSArIFwiXCIgKyB4MiArIFwiIFwiICsgYmV2ZWxEZXB0aCk7XG5cdFx0XHRjdHguc2F2ZSgpO1xuXHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0Y3R4Lm1vdmVUbyh4MSwgeTEpO1xuXHRcdFx0Y3R4LmxpbmVUbyh4MSArIGJldmVsRGVwdGgsIHkxICsgYmV2ZWxEZXB0aCk7XG5cdFx0XHRjdHgubGluZVRvKHgyIC0gYmV2ZWxEZXB0aCwgeTEgKyBiZXZlbERlcHRoKTtcblx0XHRcdGN0eC5saW5lVG8oeDIsIHkxKTtcblx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdHZhciBncmQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoKHgyICsgeDEpIC8gMiwgYjEgKyBiZXZlbERlcHRoLCAoeDIgKyB4MSkgLyAyLCBiMSk7XG5cdFx0XHRncmQuYWRkQ29sb3JTdG9wKDAsIGNvbG9yMSk7XG5cdFx0XHRncmQuYWRkQ29sb3JTdG9wKDEsIGNvbG9yMik7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gZ3JkO1xuXHRcdFx0Y3R4LmZpbGwoKTtcblx0XHRcdC8vICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG5cdFx0XHRjdHgucmVzdG9yZSgpO1xuXHRcdH1cblxuXG5cdFx0aWYgKGJvdHRvbSA9PT0gdHJ1ZSkge1xuXHRcdFx0Y3R4LnNhdmUoKTtcblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGN0eC5tb3ZlVG8oeDEsIHkyKTtcblx0XHRcdGN0eC5saW5lVG8oeDEgKyBiZXZlbERlcHRoLCB5MiAtIGJldmVsRGVwdGgpO1xuXHRcdFx0Y3R4LmxpbmVUbyh4MiAtIGJldmVsRGVwdGgsIHkyIC0gYmV2ZWxEZXB0aCk7XG5cdFx0XHRjdHgubGluZVRvKHgyLCB5Mik7XG5cdFx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0XHR2YXIgZ3JkID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KCh4MiArIHgxKSAvIDIsIGIyIC0gYmV2ZWxEZXB0aCwgKHgyICsgeDEpIC8gMiwgYjIpO1xuXHRcdFx0Z3JkLmFkZENvbG9yU3RvcCgwLCBjb2xvcjEpO1xuXHRcdFx0Z3JkLmFkZENvbG9yU3RvcCgxLCBjb2xvcjIpO1xuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9IGdyZDtcblx0XHRcdC8vICAgICAgIGN0eC5zdHJva2UoKTtcblx0XHRcdGN0eC5maWxsKCk7XG5cdFx0XHRjdHgucmVzdG9yZSgpO1xuXHRcdH1cblxuXHRcdGlmIChsZWZ0ID09PSB0cnVlKSB7XG5cdFx0XHQvLyAgIGFsZXJ0KHgxKVxuXHRcdFx0Y3R4LnNhdmUoKTtcblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGN0eC5tb3ZlVG8oeDEsIHkxKVxuXHRcdFx0Y3R4LmxpbmVUbyh4MSArIGJldmVsRGVwdGgsIHkxICsgYmV2ZWxEZXB0aCk7XG5cdFx0XHRjdHgubGluZVRvKHgxICsgYmV2ZWxEZXB0aCwgeTIgLSBiZXZlbERlcHRoKTtcblx0XHRcdGN0eC5saW5lVG8oeDEsIHkyKTtcblx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdHZhciBncmQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoYTEgKyBiZXZlbERlcHRoLCAoeTIgKyB5MSkgLyAyLCBhMSwgKHkyICsgeTEpIC8gMik7XG5cdFx0XHRncmQuYWRkQ29sb3JTdG9wKDAsIGNvbG9yMSk7XG5cdFx0XHRncmQuYWRkQ29sb3JTdG9wKDEsIGNvbG9yMyk7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gZ3JkO1xuXHRcdFx0Y3R4LmZpbGwoKTtcblx0XHRcdC8vICAgICBjdHguc3Ryb2tlKCk7XG5cdFx0XHRjdHgucmVzdG9yZSgpO1xuXHRcdH1cblxuXG5cdFx0aWYgKHJpZ2h0ID09PSB0cnVlKSB7XG5cdFx0XHRjdHguc2F2ZSgpO1xuXHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0Y3R4Lm1vdmVUbyh4MiwgeTEpXG5cdFx0XHRjdHgubGluZVRvKHgyIC0gYmV2ZWxEZXB0aCwgeTEgKyBiZXZlbERlcHRoKTtcblx0XHRcdGN0eC5saW5lVG8oeDIgLSBiZXZlbERlcHRoLCB5MiAtIGJldmVsRGVwdGgpO1xuXHRcdFx0Y3R4LmxpbmVUbyh4MiwgeTIpO1xuXHRcdFx0dmFyIGdyZCA9IGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudChhMiAtIGJldmVsRGVwdGgsICh5MiArIHkxKSAvIDIsIGEyLCAoeTIgKyB5MSkgLyAyKTtcblx0XHRcdGdyZC5hZGRDb2xvclN0b3AoMCwgY29sb3IxKTtcblx0XHRcdGdyZC5hZGRDb2xvclN0b3AoMSwgY29sb3IzKTtcblx0XHRcdGN0eC5maWxsU3R5bGUgPSBncmQ7XG5cdFx0XHRncmQuYWRkQ29sb3JTdG9wKDAsIGNvbG9yMSk7XG5cdFx0XHRncmQuYWRkQ29sb3JTdG9wKDEsIGNvbG9yMyk7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gZ3JkO1xuXHRcdFx0Y3R4LmZpbGwoKTtcblx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdC8vICAgICAgICAgIGN0eC5zdHJva2UoKTtcblx0XHRcdGN0eC5yZXN0b3JlKCk7XG5cdFx0fVxuXHRcdC8vXG5cblx0fVxuIiwiXG5pbXBvcnQge2lzQ2FudmFzU3VwcG9ydGVkfSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0dmFyIHRvdGFsRGF0YVNlcmllcyA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblxuXHRpZiAodG90YWxEYXRhU2VyaWVzIDw9IDApXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBnaG9zdEN0eCA9IHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eDtcblxuXHR2YXIgYXhpc1hQcm9wcyA9IHBsb3RVbml0LmF4aXNYLmxpbmVDb29yZGluYXRlcztcblx0dmFyIGF4aXNZUHJvcHMgPSBwbG90VW5pdC5heGlzWS5saW5lQ29vcmRpbmF0ZXM7XG5cdHZhciBtYXJrZXJzID0gW107XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblx0Y3R4LnNhdmUoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0Z2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRnaG9zdEN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0Z2hvc3RDdHguY2xpcCgpO1xuXHR9XG5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7IGorKykge1xuXG5cdFx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdO1xuXG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblxuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXG5cdFx0dmFyIHNlcmllc0lkID0gZGF0YVNlcmllcy5pZDtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW3Nlcmllc0lkXSA9IHtcblx0XHRcdG9iamVjdFR5cGU6IFwiZGF0YVNlcmllc1wiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleFxuXHRcdH07XG5cblx0XHR2YXIgaGV4Q29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKHNlcmllc0lkKTtcblx0XHRnaG9zdEN0eC5maWxsU3R5bGUgPSBoZXhDb2xvcjtcblx0XHQvL2dob3N0Q3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblx0XHQvL2dob3N0Q3R4LmxpbmVXaWR0aCA9IDIwO1xuXG5cdFx0bWFya2VycyA9IFtdO1xuXG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblx0XHR2YXIgaSA9IDAsIHgsIHk7XG5cdFx0dmFyIGRhdGFQb2ludFg7IC8vVXNlZCBzbyB0aGF0IHdoZW4gZGF0YVBvaW50LnggaXMgYSBEYXRlVGltZSB2YWx1ZSwgaXQgZG9lc24ndCBnZXQgY29udmVydGVkIHRvIG51bWJlciBiYWNrIGFuZCBmb3J0aC5cblxuXHRcdHZhciB5WmVyb1RvUGl4ZWwgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKDAgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdHZhciBiYXNlWTtcblxuXHRcdHZhciBzdGFydFBvaW50ID0gbnVsbDtcblxuXHRcdHZhciBwaXhlbHMgPSBbXTtcblxuXHRcdGlmIChkYXRhUG9pbnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vY3R4LnN0cm9rZVN0eWxlID0gXCIjNDU3MkE3IFwiO1xuXHRcdFx0Y29sb3IgPSBkYXRhU2VyaWVzLl9jb2xvclNldFtpICUgZGF0YVNlcmllcy5fY29sb3JTZXQubGVuZ3RoXTtcblx0XHRcdGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcblx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXHRcdFx0Y3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblxuXHRcdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheShkYXRhU2VyaWVzLmxpbmVEYXNoVHlwZSwgZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzKSk7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSA/IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCkgOiBkYXRhUG9pbnRzW2ldLng7XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludFggPCBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbiB8fCBkYXRhUG9pbnRYID4gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0eXBlb2YgKGRhdGFQb2ludHNbaV0ueSkgIT09IFwibnVtYmVyXCIpIHtcblx0XHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRcdHJlbmRlckJlemllckFyZWEoKTtcblx0XHRcdFx0XHRcdHBpeGVscyA9IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5ID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnkgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXG5cblx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbaV07XG5cdFx0XHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuXHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBpLCB4MTogeCwgeTE6IHlcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRwaXhlbHNbcGl4ZWxzLmxlbmd0aF0gPSB7XG5cdFx0XHRcdFx0eDogeCwgeTogeVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vUmVuZGVyIE1hcmtlclxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5tYXJrZXJTaXplICE9PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ubWFya2VyU2l6ZSA+IDAgfHwgZGF0YVNlcmllcy5tYXJrZXJTaXplID4gMCkge1xuXHRcdFx0XHRcdFx0dmFyIG1hcmtlclByb3BzID0gZGF0YVNlcmllcy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGksIHgsIHksIGN0eCk7XG5cdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2gobWFya2VyUHJvcHMpO1xuXG5cdFx0XHRcdFx0XHQvL2lmICghZGF0YVNlcmllcy5tYXhXaWR0aEluWCB8fCBtYXJrZXJQcm9wcy5zaXplID4gZGF0YVNlcmllcy5tYXhXaWR0aEluWCkge1xuXHRcdFx0XHRcdFx0Ly9cdGRhdGFTZXJpZXMubWF4V2lkdGhJblggPSBtYXJrZXJQcm9wcy5zaXplIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblx0XHRcdFx0XHRcdC8vfVxuXG5cdFx0XHRcdFx0XHR2YXIgbWFya2VyQ29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0eDogeCwgeTogeSwgY3R4OiBnaG9zdEN0eCxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBtYXJrZXJQcm9wcy50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdHNpemU6IG1hcmtlclByb3BzLnNpemUsXG5cdFx0XHRcdFx0XHRcdFx0Y29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlckNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJUaGlja25lc3M6IG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXG5cdFx0XHRcdC8vUmVuZGVyIEluZGV4IExhYmVsc1xuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5pbmRleExhYmVsIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbCB8fCBkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWxGb3JtYXR0ZXIgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJzcGxpbmVBcmVhXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogeCwgeTogeVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55ID49IDAgPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRjb2xvcjogY29sb3Jcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJlbmRlckJlemllckFyZWEoKTtcblxuXHRcdFx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXJzKG1hcmtlcnMpO1xuXHRcdH1cblx0fVxuXG5cdGN0eC5yZXN0b3JlKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZXN0b3JlKCk7XG5cblx0ZnVuY3Rpb24gcmVuZGVyQmV6aWVyQXJlYSgpIHtcblx0XHR2YXIgYnAgPSBnZXRCZXppZXJQb2ludHMocGl4ZWxzLCAyKTtcblxuXHRcdGlmIChicC5sZW5ndGggPiAwKSB7XG5cdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRjdHgubW92ZVRvKGJwWzBdLngsIGJwWzBdLnkpO1xuXG5cdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0Z2hvc3RDdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdGdob3N0Q3R4Lm1vdmVUbyhicFswXS54LCBicFswXS55KTtcblx0XHRcdH1cblxuXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGJwLmxlbmd0aCAtIDM7IGkgKz0gMykge1xuXG5cdFx0XHRcdGN0eC5iZXppZXJDdXJ2ZVRvKGJwW2kgKyAxXS54LCBicFtpICsgMV0ueSwgYnBbaSArIDJdLngsIGJwW2kgKyAyXS55LCBicFtpICsgM10ueCwgYnBbaSArIDNdLnkpO1xuXG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRnaG9zdEN0eC5iZXppZXJDdXJ2ZVRvKGJwW2kgKyAxXS54LCBicFtpICsgMV0ueSwgYnBbaSArIDJdLngsIGJwW2kgKyAyXS55LCBicFtpICsgM10ueCwgYnBbaSArIDNdLnkpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmIChkYXRhU2VyaWVzLmxpbmVUaGlja25lc3MgPiAwKVxuXHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cblx0XHRcdGlmIChwbG90VW5pdC5heGlzWS52aWV3cG9ydE1pbmltdW0gPD0gMCAmJiBwbG90VW5pdC5heGlzWS52aWV3cG9ydE1heGltdW0gPj0gMCkge1xuXHRcdFx0XHRiYXNlWSA9IHlaZXJvVG9QaXhlbDtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LmF4aXNZLnZpZXdwb3J0TWF4aW11bSA8IDApXG5cdFx0XHRcdGJhc2VZID0gYXhpc1lQcm9wcy55MTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LmF4aXNZLnZpZXdwb3J0TWluaW11bSA+IDApXG5cdFx0XHRcdGJhc2VZID0gYXhpc1hQcm9wcy55MjtcblxuXHRcdFx0c3RhcnRQb2ludCA9IHtcblx0XHRcdFx0eDogYnBbMF0ueCwgeTogYnBbMF0ueVxuXHRcdFx0fTtcblxuXHRcdFx0Y3R4LmxpbmVUbyhicFticC5sZW5ndGggLSAxXS54LCBiYXNlWSk7XG5cdFx0XHRjdHgubGluZVRvKHN0YXJ0UG9pbnQueCwgYmFzZVkpO1xuXHRcdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXG5cdFx0XHRjdHguZ2xvYmFsQWxwaGEgPSBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5O1xuXHRcdFx0Y3R4LmZpbGwoKTtcblx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cblx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRnaG9zdEN0eC5saW5lVG8oYnBbYnAubGVuZ3RoIC0gMV0ueCwgYmFzZVkpO1xuXHRcdFx0XHRnaG9zdEN0eC5saW5lVG8oc3RhcnRQb2ludC54LCBiYXNlWSk7XG5cdFx0XHRcdGdob3N0Q3R4LmNsb3NlUGF0aCgpO1xuXHRcdFx0XHRnaG9zdEN0eC5maWxsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRzb3VyY2U6IGN0eCwgZGVzdDogdGhpcy5wbG90QXJlYS5jdHgsIGFuaW1hdGlvbkNhbGxiYWNrOiBBbmltYXRpb25IZWxwZXIueENsaXBBbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmxpbmVhciwgYW5pbWF0aW9uQmFzZTogMFxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbiIsIlxuaW1wb3J0IFJlbmRlckhlbHBlciBmcm9tICcuLi9oZWxwZXJzL3JlbmRlcic7XG5pbXBvcnQgQW5pbWF0aW9uSGVscGVyIGZyb20gJy4uL2hlbHBlcnMvYW5pbWF0b3InO1xuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZCwgY29tcGFyZU51bWJlcnMsIGludFRvSGV4Q29sb3JTdHJpbmcsIGdldExpbmVEYXNoQXJyYXl9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAocGxvdFVuaXQpIHtcblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblxuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGNvbG9yID0gbnVsbDtcblx0dmFyIG1hcmtlcnMgPSBbXTtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdHZhciBvZmZzZXRZID0gW107XG5cblx0dmFyIGFsbFhWYWx1ZXMgPSBbXTtcblx0Ly92YXIgb2Zmc2V0TmVnYXRpdmVZID0gW107XG5cblx0dmFyIGkgPSAwLCB4LCB5O1xuXHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGV2ZXJ5dGltZSBpdCBpcyBhY2Nlc3NlZC5cblxuXHQvL3ZhciB5WmVyb1RvUGl4ZWwgPSAoYXhpc1lQcm9wcy55MiAtIGF4aXNZUHJvcHMuaGVpZ2h0IC8gcmFuZ2VZICogTWF0aC5hYnMoMCAtIHBsb3RVbml0LmF4aXNZLnZpZXdwb3J0TWluaW11bSkgKyAuNSkgPDwgMDtcblx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKSA8PCAwO1xuXG5cdHZhciB4TWluRGlmZiA9IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLm1pbkRpZmY7XG5cblx0dmFyIGdob3N0Q3R4ID0gdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4O1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblxuXHRjdHguc2F2ZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRnaG9zdEN0eC5zYXZlKCk7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRjdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRjdHguY2xpcCgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdGdob3N0Q3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0XHRnaG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHR2YXIgeFZhbHVlUHJlc2VudCA9IFtdO1xuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblx0XHR2YXIgZGF0YVBvaW50cyA9IGRhdGFTZXJpZXMuZGF0YVBvaW50cztcblx0XHR2YXIgeFZhbHVlO1xuXG5cdFx0ZGF0YVNlcmllcy5kYXRhUG9pbnRJbmRleGVzID0gW107XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0eFZhbHVlID0gZGF0YVBvaW50c1tpXS54LmdldFRpbWUgPyBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50c1tpXS54O1xuXHRcdFx0ZGF0YVNlcmllcy5kYXRhUG9pbnRJbmRleGVzW3hWYWx1ZV0gPSBpO1xuXG5cdFx0XHRpZiAoIXhWYWx1ZVByZXNlbnRbeFZhbHVlXSkge1xuXHRcdFx0XHRhbGxYVmFsdWVzLnB1c2goeFZhbHVlKTtcblx0XHRcdFx0eFZhbHVlUHJlc2VudFt4VmFsdWVdID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRhbGxYVmFsdWVzLnNvcnQoY29tcGFyZU51bWJlcnMpO1xuXHR9XG5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7IGorKykge1xuXG5cdFx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdO1xuXG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblx0XHR2YXIgZGF0YVBvaW50cyA9IGRhdGFTZXJpZXMuZGF0YVBvaW50cztcblx0XHR2YXIgaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgPSB0cnVlO1xuXG5cdFx0dmFyIGN1cnJlbnRCYXNlVmFsdWVzID0gW107XG5cblxuXHRcdHZhciBzZXJpZXNJZCA9IGRhdGFTZXJpZXMuaWQ7XG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtzZXJpZXNJZF0gPSB7XG5cdFx0XHRvYmplY3RUeXBlOiBcImRhdGFTZXJpZXNcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXhcblx0XHR9O1xuXHRcdHZhciBoZXhDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoc2VyaWVzSWQpO1xuXHRcdGdob3N0Q3R4LmZpbGxTdHlsZSA9IGhleENvbG9yO1xuXG5cblxuXHRcdGlmIChhbGxYVmFsdWVzLmxlbmd0aCA+IDApIHtcblxuXHRcdFx0Y29sb3IgPSBkYXRhU2VyaWVzLl9jb2xvclNldFswXTtcblx0XHRcdC8vY3R4LnN0cm9rZVN0eWxlID0gXCJyZWRcIjtcblx0XHRcdGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcblx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXHRcdFx0Y3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblxuXHRcdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheShkYXRhU2VyaWVzLmxpbmVEYXNoVHlwZSwgZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzKSk7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoaSA9IDA7IGkgPCBhbGxYVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50WCA9IGFsbFhWYWx1ZXNbaV07XG5cdFx0XHRcdHZhciBkYXRhUG9pbnQgPSBudWxsO1xuXG5cdFx0XHRcdGlmIChkYXRhU2VyaWVzLmRhdGFQb2ludEluZGV4ZXNbZGF0YVBvaW50WF0gPj0gMClcblx0XHRcdFx0XHRkYXRhUG9pbnQgPSBkYXRhUG9pbnRzW2RhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlc1tkYXRhUG9pbnRYXV07XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRkYXRhUG9pbnQgPSB7XG5cdFx0XHRcdFx0XHR4OiBkYXRhUG9pbnRYLCB5OiAwXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHR5cGVvZiAoZGF0YVBvaW50LnkpICE9PSBcIm51bWJlclwiKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdHZhciB4ID0gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRYIC0gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0Ly92YXIgeSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50LnkgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR2YXIgeSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50LnkgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSk7XG5cblx0XHRcdFx0dmFyIG9mZnNldCA9IG9mZnNldFlbZGF0YVBvaW50WF0gPyBvZmZzZXRZW2RhdGFQb2ludFhdIDogMDtcblxuXHRcdFx0XHR5ID0geSAtIG9mZnNldDtcblx0XHRcdFx0Y3VycmVudEJhc2VWYWx1ZXMucHVzaCh7IHg6IHgsIHk6IHlaZXJvVG9QaXhlbCAtIG9mZnNldCB9KTtcblx0XHRcdFx0b2Zmc2V0WVtkYXRhUG9pbnRYXSA9IHlaZXJvVG9QaXhlbCAtIHk7XG5cblx0XHRcdFx0aWYgKGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhKSB7XG5cdFx0XHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdGN0eC5tb3ZlVG8oeCwgeSk7XG5cblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKHgsIHkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cblx0XHRcdFx0XHRjdHgubGluZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0aWYgKGkgJSAyNTAgPT0gMCkge1xuXG5cdFx0XHRcdFx0XHRpZiAoZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzID4gMClcblx0XHRcdFx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXG5cdFx0XHRcdFx0XHR3aGlsZSAoY3VycmVudEJhc2VWYWx1ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgcG9pbnQgPSBjdXJyZW50QmFzZVZhbHVlcy5wb3AoKTtcblx0XHRcdFx0XHRcdFx0Y3R4LmxpbmVUbyhwb2ludC54LCBwb2ludC55KTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHBvaW50LngsIHBvaW50LnkpO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblxuXHRcdFx0XHRcdFx0Y3R4Lmdsb2JhbEFscGhhID0gZGF0YVNlcmllcy5maWxsT3BhY2l0eTtcblx0XHRcdFx0XHRcdGN0eC5maWxsKCk7XG5cdFx0XHRcdFx0XHRjdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG5cdFx0XHRcdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0XHRjdHgubW92ZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDdHguY2xvc2VQYXRoKCk7XG5cdFx0XHRcdFx0XHRcdGdob3N0Q3R4LmZpbGwoKTtcblxuXHRcdFx0XHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKHgsIHkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjdXJyZW50QmFzZVZhbHVlcy5wdXNoKHsgeDogeCwgeTogeVplcm9Ub1BpeGVsIC0gb2Zmc2V0IH0pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlc1tkYXRhUG9pbnRYXSA+PSAwKSB7XG5cdFx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbZGF0YVNlcmllcy5kYXRhUG9pbnRJbmRleGVzW2RhdGFQb2ludFhdXTtcblx0XHRcdFx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2lkXSA9IHtcblx0XHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBkYXRhU2VyaWVzLmRhdGFQb2ludEluZGV4ZXNbZGF0YVBvaW50WF0sIHgxOiB4LCB5MTogeVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL1JlbmRlciBNYXJrZXJcblx0XHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlc1tkYXRhUG9pbnRYXSA+PSAwICYmIGRhdGFQb2ludC5tYXJrZXJTaXplICE9PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludC5tYXJrZXJTaXplID4gMCB8fCBkYXRhU2VyaWVzLm1hcmtlclNpemUgPiAwKSB7XG5cblx0XHRcdFx0XHRcdHZhciBtYXJrZXJQcm9wcyA9IGRhdGFTZXJpZXMuZ2V0TWFya2VyUHJvcGVydGllcyhpLCB4LCB5LCBjdHgpO1xuXHRcdFx0XHRcdFx0bWFya2Vycy5wdXNoKG1hcmtlclByb3BzKTtcblxuXHRcdFx0XHRcdFx0Ly9pZiAoIWRhdGFTZXJpZXMubWF4V2lkdGhJblggfHwgbWFya2VyUHJvcHMuc2l6ZSA+IGRhdGFTZXJpZXMubWF4V2lkdGhJblgpIHtcblx0XHRcdFx0XHRcdC8vXHRkYXRhU2VyaWVzLm1heFdpZHRoSW5YID0gbWFya2VyUHJvcHMuc2l6ZSAvIChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgPiAxID8gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0IC0gMSA6IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCk7XG5cdFx0XHRcdFx0XHQvL31cblxuXHRcdFx0XHRcdFx0bWFya2VyQ29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0eDogeCwgeTogeSwgY3R4OiBnaG9zdEN0eCxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBtYXJrZXJQcm9wcy50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdHNpemU6IG1hcmtlclByb3BzLnNpemUsXG5cdFx0XHRcdFx0XHRcdFx0Y29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlckNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJUaGlja25lc3M6IG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50LmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludC5pbmRleExhYmVsRm9ybWF0dGVyIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlcikge1xuXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwic3RhY2tlZEFyZWFcIixcblx0XHRcdFx0XHRcdGRhdGFQb2ludDogZGF0YVBvaW50LFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHlcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueSA+PSAwID8gMSA6IC0xLFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzID4gMClcblx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXG5cdFx0XHR3aGlsZSAoY3VycmVudEJhc2VWYWx1ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHR2YXIgcG9pbnQgPSBjdXJyZW50QmFzZVZhbHVlcy5wb3AoKTtcblx0XHRcdFx0Y3R4LmxpbmVUbyhwb2ludC54LCBwb2ludC55KTtcblxuXHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHBvaW50LngsIHBvaW50LnkpO1xuXHRcdFx0fVxuXG5cdFx0XHRjdHguY2xvc2VQYXRoKCk7XG5cblx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IGRhdGFTZXJpZXMuZmlsbE9wYWNpdHk7XG5cdFx0XHRjdHguZmlsbCgpO1xuXHRcdFx0Y3R4Lmdsb2JhbEFscGhhID0gMTtcblxuXHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0Y3R4Lm1vdmVUbyh4LCB5KTtcblxuXHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdGdob3N0Q3R4LmNsb3NlUGF0aCgpO1xuXHRcdFx0XHRnaG9zdEN0eC5maWxsKCk7XG5cdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oeCwgeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZGVsZXRlIChkYXRhU2VyaWVzLmRhdGFQb2ludEluZGV4ZXMpO1xuXHR9XG5cblx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXJzKG1hcmtlcnMpO1xuXG5cblx0Y3R4LnJlc3RvcmUoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0Z2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0dmFyIGFuaW1hdGlvbkluZm8gPSB7XG5cdFx0c291cmNlOiBjdHgsIGRlc3Q6IHRoaXMucGxvdEFyZWEuY3R4LCBhbmltYXRpb25DYWxsYmFjazogQW5pbWF0aW9uSGVscGVyLnhDbGlwQW5pbWF0aW9uLCBlYXNpbmdGdW5jdGlvbjogQW5pbWF0aW9uSGVscGVyLmVhc2luZy5saW5lYXIsIGFuaW1hdGlvbkJhc2U6IDBcblx0fTtcblx0cmV0dXJuIGFuaW1hdGlvbkluZm87XG59XG4iLCJcbmltcG9ydCBSZW5kZXJIZWxwZXIgZnJvbSAnLi4vaGVscGVycy9yZW5kZXInO1xuaW1wb3J0IEFuaW1hdGlvbkhlbHBlciBmcm9tICcuLi9oZWxwZXJzL2FuaW1hdG9yJztcbmltcG9ydCB7aXNDYW52YXNTdXBwb3J0ZWQsIGNvbXBhcmVOdW1iZXJzLCBpbnRUb0hleENvbG9yU3RyaW5nLCBnZXRMaW5lRGFzaEFycmF5fSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocGxvdFVuaXQpIHtcblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblxuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGNvbG9yID0gbnVsbDtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXHR2YXIgbWFya2VycyA9IFtdO1xuXG5cdHZhciBvZmZzZXRZID0gW107XG5cblx0dmFyIGFsbFhWYWx1ZXMgPSBbXTtcblx0Ly92YXIgb2Zmc2V0TmVnYXRpdmVZID0gW107XG5cblx0dmFyIGkgPSAwLCB4LCB5O1xuXHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGV2ZXJ5dGltZSBpdCBpcyBhY2Nlc3NlZC5cblxuXG5cdC8vdmFyIHlaZXJvVG9QaXhlbCA9IChheGlzWVByb3BzLnkyIC0gYXhpc1lQcm9wcy5oZWlnaHQgLyByYW5nZVkgKiBNYXRoLmFicygwIC0gcGxvdFVuaXQuYXhpc1kudmlld3BvcnRNaW5pbXVtKSArIC41KSA8PCAwO1xuXHR2YXIgeVplcm9Ub1BpeGVsID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqICgwIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkpIDw8IDA7XG5cblx0dmFyIG1heEJhcldpZHRoID0gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA/IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggOiB0aGlzLndpZHRoICogLjE1IDw8IDA7XG5cdHZhciB4TWluRGlmZiA9IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLm1pbkRpZmY7XG5cdHZhciBiYXJXaWR0aCA9ICgoKHBsb3RBcmVhLndpZHRoIC8gTWF0aC5hYnMocGxvdFVuaXQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gcGxvdFVuaXQuYXhpc1gudmlld3BvcnRNaW5pbXVtKSkgKiBNYXRoLmFicyh4TWluRGlmZikpICogLjkpIDw8IDA7XG5cblx0dmFyIGdob3N0Q3R4ID0gdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4O1xuXG5cdGN0eC5zYXZlKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdGdob3N0Q3R4LnNhdmUoKTtcblxuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRnaG9zdEN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0Z2hvc3RDdHguY2xpcCgpO1xuXHR9XG5cblx0dmFyIHhWYWx1ZVByZXNlbnQgPSBbXTtcblx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7IGorKykge1xuXG5cdFx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdO1xuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cdFx0dmFyIHhWYWx1ZTtcblxuXHRcdGRhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlcyA9IFtdO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHhWYWx1ZSA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lID8gZGF0YVBvaW50c1tpXS54LmdldFRpbWUoKSA6IGRhdGFQb2ludHNbaV0ueDtcblx0XHRcdGRhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlc1t4VmFsdWVdID0gaTtcblxuXHRcdFx0aWYgKCF4VmFsdWVQcmVzZW50W3hWYWx1ZV0pIHtcblx0XHRcdFx0YWxsWFZhbHVlcy5wdXNoKHhWYWx1ZSk7XG5cdFx0XHRcdHhWYWx1ZVByZXNlbnRbeFZhbHVlXSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YWxsWFZhbHVlcy5zb3J0KGNvbXBhcmVOdW1iZXJzKTtcblx0fVxuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblxuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblxuXG5cdFx0dmFyIHNlcmllc0lkID0gZGF0YVNlcmllcy5pZDtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW3Nlcmllc0lkXSA9IHtcblx0XHRcdG9iamVjdFR5cGU6IFwiZGF0YVNlcmllc1wiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleFxuXHRcdH07XG5cdFx0dmFyIGhleENvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhzZXJpZXNJZCk7XG5cdFx0Z2hvc3RDdHguZmlsbFN0eWxlID0gaGV4Q29sb3I7XG5cblx0XHRpZiAoZGF0YVBvaW50cy5sZW5ndGggPT0gMSlcblx0XHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cblx0XHRpZiAoYmFyV2lkdGggPCAxKVxuXHRcdFx0YmFyV2lkdGggPSAxO1xuXHRcdGVsc2UgaWYgKGJhcldpZHRoID4gbWF4QmFyV2lkdGgpXG5cdFx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXG5cdFx0dmFyIGN1cnJlbnRCYXNlVmFsdWVzID0gW107XG5cblx0XHRpZiAoYWxsWFZhbHVlcy5sZW5ndGggPiAwKSB7XG5cblx0XHRcdGNvbG9yID0gZGF0YVNlcmllcy5fY29sb3JTZXRbaSAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cdFx0XHQvL2N0eC5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gY29sb3I7XG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcblx0XHRcdGN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3M7XG5cblx0XHRcdGlmIChjdHguc2V0TGluZURhc2gpIHtcblx0XHRcdFx0Y3R4LnNldExpbmVEYXNoKGdldExpbmVEYXNoQXJyYXkoZGF0YVNlcmllcy5saW5lRGFzaFR5cGUsIGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcykpO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgYmV2ZWxFbmFibGVkID0gKGJhcldpZHRoID4gNSkgPyBmYWxzZSA6IGZhbHNlO1xuXG5cdFx0XHQvL2N0eC5zdHJva2VTdHlsZSA9IFwiIzQ1NzJBNyBcIjtcblxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGFsbFhWYWx1ZXMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRkYXRhUG9pbnRYID0gYWxsWFZhbHVlc1tpXTtcblx0XHRcdFx0dmFyIGRhdGFQb2ludCA9IG51bGw7XG5cblx0XHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlc1tkYXRhUG9pbnRYXSA+PSAwKVxuXHRcdFx0XHRcdGRhdGFQb2ludCA9IGRhdGFQb2ludHNbZGF0YVNlcmllcy5kYXRhUG9pbnRJbmRleGVzW2RhdGFQb2ludFhdXTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGRhdGFQb2ludCA9IHtcblx0XHRcdFx0XHRcdHg6IGRhdGFQb2ludFgsIHk6IDBcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW4gfHwgZGF0YVBvaW50WCA+IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodHlwZW9mIChkYXRhUG9pbnQueSkgIT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0dmFyIHlQZXJjZW50O1xuXHRcdFx0XHRpZiAocGxvdFVuaXQuZGF0YVBvaW50WVN1bXNbZGF0YVBvaW50WF0gIT09IDApXG5cdFx0XHRcdFx0eVBlcmNlbnQgPSBkYXRhUG9pbnQueSAvIHBsb3RVbml0LmRhdGFQb2ludFlTdW1zW2RhdGFQb2ludFhdICogMTAwO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0eVBlcmNlbnQgPSAwO1xuXG5cdFx0XHRcdHZhciB4ID0gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRYIC0gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0dmFyIHkgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKHlQZXJjZW50IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkpO1xuXG5cdFx0XHRcdHZhciBvZmZzZXQgPSBvZmZzZXRZW2RhdGFQb2ludFhdID8gb2Zmc2V0WVtkYXRhUG9pbnRYXSA6IDA7XG5cblx0XHRcdFx0eSA9IHkgLSBvZmZzZXQ7XG5cdFx0XHRcdGN1cnJlbnRCYXNlVmFsdWVzLnB1c2goeyB4OiB4LCB5OiB5WmVyb1RvUGl4ZWwgLSBvZmZzZXQgfSk7XG5cdFx0XHRcdG9mZnNldFlbZGF0YVBvaW50WF0gPSB5WmVyb1RvUGl4ZWwgLSB5O1xuXG5cdFx0XHRcdGlmIChpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSkge1xuXHRcdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRjdHgubW92ZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdGdob3N0Q3R4Lm1vdmVUbyh4LCB5KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXG5cdFx0XHRcdFx0Y3R4LmxpbmVUbyh4LCB5KTtcblxuXHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmxpbmVUbyh4LCB5KTtcblxuXHRcdFx0XHRcdGlmIChpICUgMjUwID09IDApIHtcblxuXHRcdFx0XHRcdFx0aWYgKGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcyA+IDApXG5cdFx0XHRcdFx0XHRcdGN0eC5zdHJva2UoKTtcblxuXHRcdFx0XHRcdFx0d2hpbGUgKGN1cnJlbnRCYXNlVmFsdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0dmFyIHBvaW50ID0gY3VycmVudEJhc2VWYWx1ZXMucG9wKCk7XG5cdFx0XHRcdFx0XHRcdGN0eC5saW5lVG8ocG9pbnQueCwgcG9pbnQueSk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdFx0XHRcdGdob3N0Q3R4LmxpbmVUbyhwb2ludC54LCBwb2ludC55KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXG5cdFx0XHRcdFx0XHRjdHguZ2xvYmFsQWxwaGEgPSBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5O1xuXHRcdFx0XHRcdFx0Y3R4LmZpbGwoKTtcblx0XHRcdFx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cblx0XHRcdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdGN0eC5tb3ZlVG8oeCwgeSk7XG5cblx0XHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0XHRnaG9zdEN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDdHguZmlsbCgpO1xuXHRcdFx0XHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKHgsIHkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjdXJyZW50QmFzZVZhbHVlcy5wdXNoKHsgeDogeCwgeTogeVplcm9Ub1BpeGVsIC0gb2Zmc2V0IH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cblx0XHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlc1tkYXRhUG9pbnRYXSA+PSAwKSB7XG5cdFx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbZGF0YVNlcmllcy5kYXRhUG9pbnRJbmRleGVzW2RhdGFQb2ludFhdXTtcblx0XHRcdFx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2lkXSA9IHtcblx0XHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBkYXRhU2VyaWVzLmRhdGFQb2ludEluZGV4ZXNbZGF0YVBvaW50WF0sIHgxOiB4LCB5MTogeVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL1JlbmRlciBNYXJrZXJcblx0XHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlc1tkYXRhUG9pbnRYXSA+PSAwICYmIGRhdGFQb2ludC5tYXJrZXJTaXplICE9PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludC5tYXJrZXJTaXplID4gMCB8fCBkYXRhU2VyaWVzLm1hcmtlclNpemUgPiAwKSB7XG5cdFx0XHRcdFx0XHR2YXIgbWFya2VyUHJvcHMgPSBkYXRhU2VyaWVzLmdldE1hcmtlclByb3BlcnRpZXMoaSwgeCwgeSwgY3R4KTtcblx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaChtYXJrZXJQcm9wcyk7XG5cblx0XHRcdFx0XHRcdC8vaWYgKCFkYXRhU2VyaWVzLm1heFdpZHRoSW5YIHx8IG1hcmtlclByb3BzLnNpemUgPiBkYXRhU2VyaWVzLm1heFdpZHRoSW5YKSB7XG5cdFx0XHRcdFx0XHQvL1x0ZGF0YVNlcmllcy5tYXhXaWR0aEluWCA9IG1hcmtlclByb3BzLnNpemUgLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXHRcdFx0XHRcdFx0Ly99XG5cblx0XHRcdFx0XHRcdG1hcmtlckNvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhpZCk7XG5cblx0XHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHksIGN0eDogZ2hvc3RDdHgsXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogbWFya2VyUHJvcHMudHlwZSxcblx0XHRcdFx0XHRcdFx0XHRzaXplOiBtYXJrZXJQcm9wcy5zaXplLFxuXHRcdFx0XHRcdFx0XHRcdGNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJDb2xvcjogbWFya2VyQ29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyVGhpY2tuZXNzOiBtYXJrZXJQcm9wcy5ib3JkZXJUaGlja25lc3Ncblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludC5pbmRleExhYmVsIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbCB8fCBkYXRhUG9pbnQuaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpIHtcblxuXHRcdFx0XHRcdHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBcInN0YWNrZWRBcmVhMTAwXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludCxcblx0XHRcdFx0XHRcdGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMsXG5cdFx0XHRcdFx0XHRwb2ludDoge1xuXHRcdFx0XHRcdFx0XHR4OiB4LCB5OiB5XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBkYXRhUG9pbnRzW2ldLnkgPj0gMCA/IDEgOiAtMSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcyA+IDApXG5cdFx0XHRcdGN0eC5zdHJva2UoKTtcblxuXHRcdFx0d2hpbGUgKGN1cnJlbnRCYXNlVmFsdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dmFyIHBvaW50ID0gY3VycmVudEJhc2VWYWx1ZXMucG9wKCk7XG5cdFx0XHRcdGN0eC5saW5lVG8ocG9pbnQueCwgcG9pbnQueSk7XG5cblx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdGdob3N0Q3R4LmxpbmVUbyhwb2ludC54LCBwb2ludC55KTtcblx0XHRcdH1cblxuXHRcdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXG5cdFx0XHRjdHguZ2xvYmFsQWxwaGEgPSBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5O1xuXHRcdFx0Y3R4LmZpbGwoKTtcblx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGN0eC5tb3ZlVG8oeCwgeSk7XG5cblx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRnaG9zdEN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdFx0Z2hvc3RDdHguZmlsbCgpO1xuXHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKHgsIHkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGRlbGV0ZSAoZGF0YVNlcmllcy5kYXRhUG9pbnRJbmRleGVzKTtcblx0fVxuXG5cdFJlbmRlckhlbHBlci5kcmF3TWFya2VycyhtYXJrZXJzKTtcblxuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRnaG9zdEN0eC5yZXN0b3JlKCk7XG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRzb3VyY2U6IGN0eCwgZGVzdDogdGhpcy5wbG90QXJlYS5jdHgsIGFuaW1hdGlvbkNhbGxiYWNrOiBBbmltYXRpb25IZWxwZXIueENsaXBBbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmxpbmVhciwgYW5pbWF0aW9uQmFzZTogMFxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbiIsIlxuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZH0gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXHR2YXIgY3R4ID0gcGxvdFVuaXQudGFyZ2V0Q2FudmFzQ3R4IHx8IHRoaXMucGxvdEFyZWEuY3R4O1xuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGNvbG9yID0gbnVsbDtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdHZhciBvZmZzZXRQb3NpdGl2ZVkgPSBbXTtcblx0dmFyIG9mZnNldE5lZ2F0aXZlWSA9IFtdO1xuXG5cdHZhciBpID0gMCwgeCwgeTtcblx0dmFyIGRhdGFQb2ludFg7IC8vVXNlZCBzbyB0aGF0IHdoZW4gZGF0YVBvaW50LnggaXMgYSBEYXRlVGltZSB2YWx1ZSwgaXQgZG9lc24ndCBnZXQgY29udmVydGVkIHRvIG51bWJlciBldmVyeXRpbWUgaXQgaXMgYWNjZXNzZWQuXG5cblx0Ly92YXIgeVplcm9Ub1BpeGVsID0gKGF4aXNZUHJvcHMueTIgLSBheGlzWVByb3BzLmhlaWdodCAvIHJhbmdlWSAqIE1hdGguYWJzKDAgLSBwbG90VW5pdC5heGlzWS52aWV3cG9ydE1pbmltdW0pICsgLjUpIDw8IDA7XG5cdHZhciB5WmVyb1RvUGl4ZWwgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKDAgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSkgPDwgMDtcblxuXHR2YXIgbWF4QmFyV2lkdGggPSB0aGlzLmRhdGFQb2ludE1heFdpZHRoID8gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA6IHRoaXMuaGVpZ2h0ICogLjE1IDw8IDA7XG5cdHZhciB4TWluRGlmZiA9IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLm1pbkRpZmY7XG5cdHZhciBiYXJXaWR0aCA9ICgoKHBsb3RBcmVhLmhlaWdodCAvIE1hdGguYWJzKHBsb3RVbml0LmF4aXNYLnZpZXdwb3J0TWF4aW11bSAtIHBsb3RVbml0LmF4aXNYLnZpZXdwb3J0TWluaW11bSkpICogTWF0aC5hYnMoeE1pbkRpZmYpKSAvIHBsb3RVbml0LnBsb3RUeXBlLnBsb3RVbml0cy5sZW5ndGggKiAuOSkgPDwgMDtcblxuXHRpZiAoYmFyV2lkdGggPiBtYXhCYXJXaWR0aClcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXHRlbHNlIGlmICh4TWluRGlmZiA9PT0gSW5maW5pdHkpIHtcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXHR9IGVsc2UgaWYgKGJhcldpZHRoIDwgMSlcblx0XHRiYXJXaWR0aCA9IDE7XG5cblx0Y3R4LnNhdmUoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnNhdmUoKTtcblxuXHRjdHguYmVnaW5QYXRoKCk7XG5cdGN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdGN0eC5jbGlwKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguY2xpcCgpO1xuXHR9XG5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7IGorKykge1xuXG5cdFx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdO1xuXG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblx0XHR2YXIgZGF0YVBvaW50cyA9IGRhdGFTZXJpZXMuZGF0YVBvaW50cztcblx0XHR2YXIgaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgPSB0cnVlO1xuXG5cdFx0Ly9kYXRhU2VyaWVzLm1heFdpZHRoSW5YID0gYmFyV2lkdGggLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgeHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhKGRhdGFQb2ludHNbMF0ueCwgZGF0YVBvaW50c1swXS55KTtcblxuXHRcdFx0dmFyIGJldmVsRW5hYmxlZCA9IChiYXJXaWR0aCA+IDUpICYmIGRhdGFTZXJpZXMuYmV2ZWxFbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBcIiM0NTcyQTcgXCI7XG5cblx0XHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lID8gZGF0YVBvaW50c1tpXS54LmdldFRpbWUoKSA6IGRhdGFQb2ludHNbaV0ueDtcblxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW4gfHwgZGF0YVBvaW50WCA+IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodHlwZW9mIChkYXRhUG9pbnRzW2ldLnkpICE9PSBcIm51bWJlclwiKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdHkgPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHQvL3ggPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludHNbaV0ueSAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludHNbaV0ueSAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKTtcblxuXHRcdFx0XHQvL3ZhciB4MSA9IHggLSAocGxvdFVuaXQucGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aCAqIGJhcldpZHRoIC8gMikgKyAocGxvdFVuaXQuaW5kZXggKiBiYXJXaWR0aCkgPDwgMDtcblxuXHRcdFx0XHR2YXIgeTEgPSB5IC0gKHBsb3RVbml0LnBsb3RUeXBlLnBsb3RVbml0cy5sZW5ndGggKiBiYXJXaWR0aCAvIDIpICsgKHBsb3RVbml0LmluZGV4ICogYmFyV2lkdGgpIDw8IDA7XG5cdFx0XHRcdHZhciB5MiA9IHkxICsgYmFyV2lkdGggPDwgMDtcblx0XHRcdFx0dmFyIHgxO1xuXHRcdFx0XHR2YXIgeDI7XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ueSA+PSAwKSB7XG5cdFx0XHRcdFx0dmFyIG9mZnNldCA9IG9mZnNldFBvc2l0aXZlWVtkYXRhUG9pbnRYXSA/IG9mZnNldFBvc2l0aXZlWVtkYXRhUG9pbnRYXSA6IDA7XG5cblx0XHRcdFx0XHR4MSA9IHlaZXJvVG9QaXhlbCArIG9mZnNldDtcblx0XHRcdFx0XHR4MiA9IHggKyBvZmZzZXQ7XG5cblx0XHRcdFx0XHRvZmZzZXRQb3NpdGl2ZVlbZGF0YVBvaW50WF0gPSBvZmZzZXQgKyAoeDIgLSB4MSk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YXIgb2Zmc2V0ID0gb2Zmc2V0TmVnYXRpdmVZW2RhdGFQb2ludFhdID8gb2Zmc2V0TmVnYXRpdmVZW2RhdGFQb2ludFhdIDogMDtcblxuXHRcdFx0XHRcdHgxID0geCAtIG9mZnNldDtcblx0XHRcdFx0XHR4MiA9IHlaZXJvVG9QaXhlbCAtIG9mZnNldDtcblxuXHRcdFx0XHRcdG9mZnNldE5lZ2F0aXZlWVtkYXRhUG9pbnRYXSA9IG9mZnNldCArICh4MiAtIHgxKTtcblx0XHRcdFx0fVxuXG5cblx0XHRcdFx0Y29sb3IgPSBkYXRhUG9pbnRzW2ldLmNvbG9yID8gZGF0YVBvaW50c1tpXS5jb2xvciA6IGRhdGFTZXJpZXMuX2NvbG9yU2V0W2kgJSBkYXRhU2VyaWVzLl9jb2xvclNldC5sZW5ndGhdO1xuXHRcdFx0XHRkcmF3UmVjdChjdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgYmV2ZWxFbmFibGVkLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5KTtcblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5MlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRkcmF3UmVjdCh0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwic3RhY2tlZEJhclwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IGRhdGFQb2ludHNbaV0ueSA+PSAwID8geDIgOiB4MSwgeTogeVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55ID49IDAgPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRib3VuZHM6IHtcblx0XHRcdFx0XHRcdFx0eDE6IE1hdGgubWluKHgxLCB4MiksIHkxOiB5MSwgeDI6IE1hdGgubWF4KHgxLCB4MiksIHkyOiB5MlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGN0eC5yZXN0b3JlKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZXN0b3JlKCk7XG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uQmFzZSA9IE1hdGgubWF4KHlaZXJvVG9QaXhlbCwgcGxvdFVuaXQuYXhpc1guYm91bmRpbmdSZWN0LngyKTtcblx0dmFyIGFuaW1hdGlvbkluZm8gPSB7XG5cdFx0c291cmNlOiBjdHgsIGRlc3Q6IHRoaXMucGxvdEFyZWEuY3R4LCBhbmltYXRpb25DYWxsYmFjazogQW5pbWF0aW9uSGVscGVyLnhTY2FsZUFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcuZWFzZU91dFF1YXJ0LCBhbmltYXRpb25CYXNlOiBhbmltYXRpb25CYXNlXG5cdH07XG5cdHJldHVybiBhbmltYXRpb25JbmZvO1xufVxuIiwiXG5pbXBvcnQge2lzQ2FudmFzU3VwcG9ydGVkfSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cdHZhciB0b3RhbERhdGFTZXJpZXMgPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7XG5cblx0aWYgKHRvdGFsRGF0YVNlcmllcyA8PSAwKVxuXHRcdHJldHVybjtcblxuXHR2YXIgY29sb3IgPSBudWxsO1xuXG5cdHZhciBwbG90QXJlYSA9IHRoaXMucGxvdEFyZWE7XG5cblx0dmFyIG9mZnNldFBvc2l0aXZlWSA9IFtdO1xuXHR2YXIgb2Zmc2V0TmVnYXRpdmVZID0gW107XG5cblx0dmFyIGkgPSAwLCB4LCB5O1xuXHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGV2ZXJ5dGltZSBpdCBpcyBhY2Nlc3NlZC5cblxuXHQvL3ZhciB5WmVyb1RvUGl4ZWwgPSAoYXhpc1lQcm9wcy55MiAtIGF4aXNZUHJvcHMuaGVpZ2h0IC8gcmFuZ2VZICogTWF0aC5hYnMoMCAtIHBsb3RVbml0LmF4aXNZLnZpZXdwb3J0TWluaW11bSkgKyAuNSkgPDwgMDtcblx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKSA8PCAwO1xuXG5cdHZhciBtYXhCYXJXaWR0aCA9IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggPyB0aGlzLmRhdGFQb2ludE1heFdpZHRoIDogdGhpcy5oZWlnaHQgKiAuMTUgPDwgMDtcblx0dmFyIHhNaW5EaWZmID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8ubWluRGlmZjtcblx0dmFyIGJhcldpZHRoID0gKCgocGxvdEFyZWEuaGVpZ2h0IC8gTWF0aC5hYnMocGxvdFVuaXQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gcGxvdFVuaXQuYXhpc1gudmlld3BvcnRNaW5pbXVtKSkgKiBNYXRoLmFicyh4TWluRGlmZikpIC8gcGxvdFVuaXQucGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aCAqIC45KSA8PCAwO1xuXG5cdGlmIChiYXJXaWR0aCA+IG1heEJhcldpZHRoKVxuXHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cdGVsc2UgaWYgKHhNaW5EaWZmID09PSBJbmZpbml0eSkge1xuXHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cdH0gZWxzZSBpZiAoYmFyV2lkdGggPCAxKVxuXHRcdGJhcldpZHRoID0gMTtcblxuXHRjdHguc2F2ZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXHRcdHZhciBpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IHRydWU7XG5cblx0XHQvL2RhdGFTZXJpZXMubWF4V2lkdGhJblggPSBiYXJXaWR0aCAvIChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgPiAxID8gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0IC0gMSA6IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCk7XG5cblx0XHRpZiAoZGF0YVBvaW50cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL3ZhciB4eSA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uUGxvdEFyZWEoZGF0YVBvaW50c1swXS54LCBkYXRhUG9pbnRzWzBdLnkpO1xuXG5cdFx0XHR2YXIgYmV2ZWxFbmFibGVkID0gKGJhcldpZHRoID4gNSkgJiYgZGF0YVNlcmllcy5iZXZlbEVuYWJsZWQgPyB0cnVlIDogZmFsc2U7XG5cblx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IFwiIzQ1NzJBNyBcIjtcblxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54LmdldFRpbWUgPyBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50c1tpXS54O1xuXG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludFggPCBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbiB8fCBkYXRhUG9pbnRYID4gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0eXBlb2YgKGRhdGFQb2ludHNbaV0ueSkgIT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50WCAtIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cblx0XHRcdFx0dmFyIHlQZXJjZW50O1xuXHRcdFx0XHRpZiAocGxvdFVuaXQuZGF0YVBvaW50WVN1bXNbZGF0YVBvaW50WF0gIT09IDApXG5cdFx0XHRcdFx0eVBlcmNlbnQgPSBkYXRhUG9pbnRzW2ldLnkgLyBwbG90VW5pdC5kYXRhUG9pbnRZU3Vtc1tkYXRhUG9pbnRYXSAqIDEwMDtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHlQZXJjZW50ID0gMDtcblxuXHRcdFx0XHQvL3ggPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKHlQZXJjZW50IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoeVBlcmNlbnQgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSk7XG5cblx0XHRcdFx0dmFyIHkxID0geSAtIChwbG90VW5pdC5wbG90VHlwZS5wbG90VW5pdHMubGVuZ3RoICogYmFyV2lkdGggLyAyKSArIChwbG90VW5pdC5pbmRleCAqIGJhcldpZHRoKSA8PCAwO1xuXHRcdFx0XHR2YXIgeTIgPSB5MSArIGJhcldpZHRoIDw8IDA7XG5cdFx0XHRcdHZhciB4MTtcblx0XHRcdFx0dmFyIHgyO1xuXG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ueSA+PSAwKSB7XG5cdFx0XHRcdFx0dmFyIG9mZnNldCA9IG9mZnNldFBvc2l0aXZlWVtkYXRhUG9pbnRYXSA/IG9mZnNldFBvc2l0aXZlWVtkYXRhUG9pbnRYXSA6IDA7XG5cblx0XHRcdFx0XHR4MSA9IHlaZXJvVG9QaXhlbCArIG9mZnNldDtcblx0XHRcdFx0XHR4MiA9IHggKyBvZmZzZXQ7XG5cblx0XHRcdFx0XHRvZmZzZXRQb3NpdGl2ZVlbZGF0YVBvaW50WF0gPSBvZmZzZXQgKyAoeDIgLSB4MSk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YXIgb2Zmc2V0ID0gb2Zmc2V0TmVnYXRpdmVZW2RhdGFQb2ludFhdID8gb2Zmc2V0TmVnYXRpdmVZW2RhdGFQb2ludFhdIDogMDtcblxuXHRcdFx0XHRcdHgxID0geCAtIG9mZnNldDtcblx0XHRcdFx0XHR4MiA9IHlaZXJvVG9QaXhlbCAtIG9mZnNldDtcblxuXHRcdFx0XHRcdG9mZnNldE5lZ2F0aXZlWVtkYXRhUG9pbnRYXSA9IG9mZnNldCArICh4MiAtIHgxKTtcblx0XHRcdFx0fVxuXG5cblx0XHRcdFx0Y29sb3IgPSBkYXRhUG9pbnRzW2ldLmNvbG9yID8gZGF0YVBvaW50c1tpXS5jb2xvciA6IGRhdGFTZXJpZXMuX2NvbG9yU2V0W2kgJSBkYXRhU2VyaWVzLl9jb2xvclNldC5sZW5ndGhdO1xuXHRcdFx0XHRkcmF3UmVjdChjdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgYmV2ZWxFbmFibGVkLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5KTtcblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5MlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRkcmF3UmVjdCh0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwic3RhY2tlZEJhcjEwMFwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IGRhdGFQb2ludHNbaV0ueSA+PSAwID8geDIgOiB4MSwgeTogeVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55ID49IDAgPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRib3VuZHM6IHtcblx0XHRcdFx0XHRcdFx0eDE6IE1hdGgubWluKHgxLCB4MiksIHkxOiB5MSwgeDI6IE1hdGgubWF4KHgxLCB4MiksIHkyOiB5MlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGN0eC5yZXN0b3JlKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZXN0b3JlKCk7XG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uQmFzZSA9IE1hdGgubWF4KHlaZXJvVG9QaXhlbCwgcGxvdFVuaXQuYXhpc1guYm91bmRpbmdSZWN0LngyKTtcblx0dmFyIGFuaW1hdGlvbkluZm8gPSB7XG5cdFx0c291cmNlOiBjdHgsIGRlc3Q6IHRoaXMucGxvdEFyZWEuY3R4LCBhbmltYXRpb25DYWxsYmFjazogQW5pbWF0aW9uSGVscGVyLnhTY2FsZUFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcuZWFzZU91dFF1YXJ0LCBhbmltYXRpb25CYXNlOiBhbmltYXRpb25CYXNlXG5cdH07XG5cdHJldHVybiBhbmltYXRpb25JbmZvO1xufVxuIiwiXG5pbXBvcnQge2lzQ2FudmFzU3VwcG9ydGVkfSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblx0dmFyIHRvdGFsRGF0YVNlcmllcyA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblxuXHRpZiAodG90YWxEYXRhU2VyaWVzIDw9IDApXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBjb2xvciA9IG51bGw7XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblxuXHR2YXIgb2Zmc2V0UG9zaXRpdmVZID0gW107XG5cdHZhciBvZmZzZXROZWdhdGl2ZVkgPSBbXTtcblxuXHR2YXIgaSA9IDAsIHgsIHk7XG5cdHZhciBkYXRhUG9pbnRYOyAvL1VzZWQgc28gdGhhdCB3aGVuIGRhdGFQb2ludC54IGlzIGEgRGF0ZVRpbWUgdmFsdWUsIGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBudW1iZXIgZXZlcnl0aW1lIGl0IGlzIGFjY2Vzc2VkLlxuXG5cdC8vdmFyIHlaZXJvVG9QaXhlbCA9IChheGlzWVByb3BzLnkyIC0gYXhpc1lQcm9wcy5oZWlnaHQgLyByYW5nZVkgKiBNYXRoLmFicygwIC0gcGxvdFVuaXQuYXhpc1kudmlld3BvcnRNaW5pbXVtKSArIC41KSA8PCAwO1xuXHR2YXIgeVplcm9Ub1BpeGVsID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqICgwIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkpIDw8IDA7XG5cblx0dmFyIG1heEJhcldpZHRoID0gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA/IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggOiB0aGlzLndpZHRoICogLjE1IDw8IDA7XG5cdHZhciB4TWluRGlmZiA9IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLm1pbkRpZmY7XG5cdHZhciBiYXJXaWR0aCA9ICgoKHBsb3RBcmVhLndpZHRoIC8gTWF0aC5hYnMocGxvdFVuaXQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gcGxvdFVuaXQuYXhpc1gudmlld3BvcnRNaW5pbXVtKSkgKiBNYXRoLmFicyh4TWluRGlmZikpIC8gcGxvdFVuaXQucGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aCAqIC45KSA8PCAwO1xuXG5cdGlmIChiYXJXaWR0aCA+IG1heEJhcldpZHRoKVxuXHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cdGVsc2UgaWYgKHhNaW5EaWZmID09PSBJbmZpbml0eSkge1xuXHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cdH0gZWxzZSBpZiAoYmFyV2lkdGggPCAxKVxuXHRcdGJhcldpZHRoID0gMTtcblxuXG5cblx0Y3R4LnNhdmUoKTtcblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5zYXZlKCk7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRjdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRjdHguY2xpcCgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LmNsaXAoKTtcblx0fVxuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXHRcdHZhciBpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IHRydWU7XG5cblx0XHQvLyBSZWR1Y2luZyBwaXhlbFBlclVuaXQgYnkgMSBqdXN0IHRvIG92ZXJjb21lIGFueSBwcm9ibGVtcyBkdWUgdG8gcm91bmRpbmcgb2ZmIG9mIHBpeGVscy5cblx0XHQvL2RhdGFTZXJpZXMubWF4V2lkdGhJblggPSBiYXJXaWR0aCAvIChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgPiAxID8gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0IC0gMSA6IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCk7XG5cblxuXHRcdGlmIChkYXRhUG9pbnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vdmFyIHh5ID0gdGhpcy5nZXRQaXhlbENvb3JkaW5hdGVzT25QbG90QXJlYShkYXRhUG9pbnRzWzBdLngsIGRhdGFQb2ludHNbMF0ueSk7XG5cblx0XHRcdHZhciBiZXZlbEVuYWJsZWQgPSAoYmFyV2lkdGggPiA1KSAmJiBkYXRhU2VyaWVzLmJldmVsRW5hYmxlZCA/IHRydWUgOiBmYWxzZTtcblxuXHRcdFx0Y3R4LnN0cm9rZVN0eWxlID0gXCIjNDU3MkE3IFwiO1xuXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSA/IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCkgOiBkYXRhUG9pbnRzW2ldLng7XG5cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHR5cGVvZiAoZGF0YVBvaW50c1tpXS55KSAhPT0gXCJudW1iZXJcIilcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR4ID0gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRYIC0gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkpO1xuXG5cdFx0XHRcdHZhciB4MSA9IHggLSAocGxvdFVuaXQucGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aCAqIGJhcldpZHRoIC8gMikgKyAocGxvdFVuaXQuaW5kZXggKiBiYXJXaWR0aCkgPDwgMDtcblx0XHRcdFx0dmFyIHgyID0geDEgKyBiYXJXaWR0aCA8PCAwO1xuXHRcdFx0XHR2YXIgeTE7XG5cdFx0XHRcdHZhciB5MjtcblxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLnkgPj0gMCkge1xuXHRcdFx0XHRcdHZhciBvZmZzZXQgPSBvZmZzZXRQb3NpdGl2ZVlbZGF0YVBvaW50WF0gPyBvZmZzZXRQb3NpdGl2ZVlbZGF0YVBvaW50WF0gOiAwO1xuXG5cdFx0XHRcdFx0eTEgPSB5IC0gb2Zmc2V0O1xuXHRcdFx0XHRcdHkyID0geVplcm9Ub1BpeGVsIC0gb2Zmc2V0O1xuXG5cdFx0XHRcdFx0b2Zmc2V0UG9zaXRpdmVZW2RhdGFQb2ludFhdID0gb2Zmc2V0ICsgKHkyIC0geTEpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIG9mZnNldCA9IG9mZnNldE5lZ2F0aXZlWVtkYXRhUG9pbnRYXSA/IG9mZnNldE5lZ2F0aXZlWVtkYXRhUG9pbnRYXSA6IDA7XG5cblx0XHRcdFx0XHR5MiA9IHkgKyBvZmZzZXQ7XG5cdFx0XHRcdFx0eTEgPSB5WmVyb1RvUGl4ZWwgKyBvZmZzZXQ7XG5cblx0XHRcdFx0XHRvZmZzZXROZWdhdGl2ZVlbZGF0YVBvaW50WF0gPSBvZmZzZXQgKyAoeTIgLSB5MSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb2xvciA9IGRhdGFQb2ludHNbaV0uY29sb3IgPyBkYXRhUG9pbnRzW2ldLmNvbG9yIDogZGF0YVNlcmllcy5fY29sb3JTZXRbaSAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cblx0XHRcdFx0ZHJhd1JlY3QoY3R4LCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIDAsIG51bGwsIGJldmVsRW5hYmxlZCAmJiAoZGF0YVBvaW50c1tpXS55ID49IDApLCAoZGF0YVBvaW50c1tpXS55IDwgMCkgJiYgYmV2ZWxFbmFibGVkLCBmYWxzZSwgZmFsc2UsIGRhdGFTZXJpZXMuZmlsbE9wYWNpdHkpO1xuXG5cdFx0XHRcdC8vaWYgKGRhdGFTZXJpZXMubWFya2VyVHlwZSAmJiBkYXRhU2VyaWVzLm1hcmtlclNpemUgPiAwKSB7XG5cdFx0XHRcdC8vICAgIFJlbmRlckhlbHBlci5kcmF3TWFya2VyKHgxICsgKHgyIC0geDEpLzIsIHkxLCBjdHgsIGRhdGFTZXJpZXMubWFya2VyVHlwZSwgZGF0YVNlcmllcy5tYXJrZXJTaXplLCBjb2xvciwgZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJDb2xvciwgZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJUaGlja25lc3MgPyBkYXRhU2VyaWVzLm1hcmtlckJvcmRlclRoaWNrbmVzcyA6IDEpO1xuXHRcdFx0XHQvL31cblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5MlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRkcmF3UmVjdCh0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbCB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWwgfHwgZGF0YVBvaW50c1tpXS5pbmRleExhYmVsRm9ybWF0dGVyIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlcikge1xuXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwic3RhY2tlZENvbHVtblwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IGRhdGFQb2ludHNbaV0ueSA+PSAwID8geTEgOiB5MlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55ID49IDAgPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRib3VuZHM6IHtcblx0XHRcdFx0XHRcdFx0eDE6IHgxLCB5MTogTWF0aC5taW4oeTEsIHkyKSwgeDI6IHgyLCB5MjogTWF0aC5tYXgoeTEsIHkyKVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0dmFyIGFuaW1hdGlvbkJhc2UgPSBNYXRoLm1pbih5WmVyb1RvUGl4ZWwsIHBsb3RVbml0LmF4aXNZLmJvdW5kaW5nUmVjdC55Mik7XG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci55U2NhbGVBbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmVhc2VPdXRRdWFydCwgYW5pbWF0aW9uQmFzZTogYW5pbWF0aW9uQmFzZVxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbiIsIlxuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZH0gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXHR2YXIgY3R4ID0gcGxvdFVuaXQudGFyZ2V0Q2FudmFzQ3R4IHx8IHRoaXMucGxvdEFyZWEuY3R4O1xuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGNvbG9yID0gbnVsbDtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdHZhciBvZmZzZXRQb3NpdGl2ZVkgPSBbXTtcblx0dmFyIG9mZnNldE5lZ2F0aXZlWSA9IFtdO1xuXG5cdHZhciBpID0gMCwgeCwgeTtcblx0dmFyIGRhdGFQb2ludFg7IC8vVXNlZCBzbyB0aGF0IHdoZW4gZGF0YVBvaW50LnggaXMgYSBEYXRlVGltZSB2YWx1ZSwgaXQgZG9lc24ndCBnZXQgY29udmVydGVkIHRvIG51bWJlciBldmVyeXRpbWUgaXQgaXMgYWNjZXNzZWQuXG5cblx0Ly92YXIgeVplcm9Ub1BpeGVsID0gKGF4aXNZUHJvcHMueTIgLSBheGlzWVByb3BzLmhlaWdodCAvIHJhbmdlWSAqIE1hdGguYWJzKDAgLSBwbG90VW5pdC5heGlzWS52aWV3cG9ydE1pbmltdW0pICsgLjUpIDw8IDA7XG5cdHZhciB5WmVyb1RvUGl4ZWwgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKDAgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSkgPDwgMDtcblxuXHR2YXIgbWF4QmFyV2lkdGggPSB0aGlzLmRhdGFQb2ludE1heFdpZHRoID8gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA6IHRoaXMud2lkdGggKiAuMTUgPDwgMDtcblx0dmFyIHhNaW5EaWZmID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8ubWluRGlmZjtcblx0dmFyIGJhcldpZHRoID0gKCgocGxvdEFyZWEud2lkdGggLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyBwbG90VW5pdC5wbG90VHlwZS5wbG90VW5pdHMubGVuZ3RoICogLjkpIDw8IDA7XG5cblx0aWYgKGJhcldpZHRoID4gbWF4QmFyV2lkdGgpXG5cdFx0YmFyV2lkdGggPSBtYXhCYXJXaWR0aDtcblx0ZWxzZSBpZiAoeE1pbkRpZmYgPT09IEluZmluaXR5KSB7XG5cdFx0YmFyV2lkdGggPSBtYXhCYXJXaWR0aDtcblx0fSBlbHNlIGlmIChiYXJXaWR0aCA8IDEpXG5cdFx0YmFyV2lkdGggPSAxO1xuXG5cdGN0eC5zYXZlKCk7XG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXHRcdHZhciBpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IHRydWU7XG5cblxuXHRcdC8vZGF0YVNlcmllcy5tYXhXaWR0aEluWCA9IGJhcldpZHRoIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblxuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgeHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhKGRhdGFQb2ludHNbMF0ueCwgZGF0YVBvaW50c1swXS55KTtcblxuXHRcdFx0dmFyIGJldmVsRW5hYmxlZCA9IChiYXJXaWR0aCA+IDUpICYmIGRhdGFTZXJpZXMuYmV2ZWxFbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHQvL2N0eC5zdHJva2VTdHlsZSA9IFwiIzQ1NzJBNyBcIjtcblxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54LmdldFRpbWUgPyBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50c1tpXS54O1xuXG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludFggPCBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbiB8fCBkYXRhUG9pbnRYID4gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0eXBlb2YgKGRhdGFQb2ludHNbaV0ueSkgIT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0eCA9IChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50WCAtIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cblx0XHRcdFx0dmFyIHlQZXJjZW50O1xuXHRcdFx0XHRpZiAocGxvdFVuaXQuZGF0YVBvaW50WVN1bXNbZGF0YVBvaW50WF0gIT09IDApXG5cdFx0XHRcdFx0eVBlcmNlbnQgPSBkYXRhUG9pbnRzW2ldLnkgLyBwbG90VW5pdC5kYXRhUG9pbnRZU3Vtc1tkYXRhUG9pbnRYXSAqIDEwMDtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHlQZXJjZW50ID0gMDtcblxuXHRcdFx0XHQvL3kgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKHlQZXJjZW50IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoeVBlcmNlbnQgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSk7XG5cblx0XHRcdFx0dmFyIHgxID0geCAtIChwbG90VW5pdC5wbG90VHlwZS5wbG90VW5pdHMubGVuZ3RoICogYmFyV2lkdGggLyAyKSArIChwbG90VW5pdC5pbmRleCAqIGJhcldpZHRoKSA8PCAwO1xuXHRcdFx0XHR2YXIgeDIgPSB4MSArIGJhcldpZHRoIDw8IDA7XG5cdFx0XHRcdHZhciB5MTtcblx0XHRcdFx0dmFyIHkyO1xuXG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ueSA+PSAwKSB7XG5cdFx0XHRcdFx0dmFyIG9mZnNldCA9IG9mZnNldFBvc2l0aXZlWVtkYXRhUG9pbnRYXSA/IG9mZnNldFBvc2l0aXZlWVtkYXRhUG9pbnRYXSA6IDA7XG5cblx0XHRcdFx0XHR5MSA9IHkgLSBvZmZzZXQ7XG5cdFx0XHRcdFx0eTIgPSB5WmVyb1RvUGl4ZWwgLSBvZmZzZXQ7XG5cblx0XHRcdFx0XHRvZmZzZXRQb3NpdGl2ZVlbZGF0YVBvaW50WF0gPSBvZmZzZXQgKyAoeTIgLSB5MSk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YXIgb2Zmc2V0ID0gb2Zmc2V0TmVnYXRpdmVZW2RhdGFQb2ludFhdID8gb2Zmc2V0TmVnYXRpdmVZW2RhdGFQb2ludFhdIDogMDtcblxuXHRcdFx0XHRcdHkyID0geSArIG9mZnNldDtcblx0XHRcdFx0XHR5MSA9IHlaZXJvVG9QaXhlbCArIG9mZnNldDtcblxuXHRcdFx0XHRcdG9mZnNldE5lZ2F0aXZlWVtkYXRhUG9pbnRYXSA9IG9mZnNldCArICh5MiAtIHkxKTtcblx0XHRcdFx0fVxuXG5cblx0XHRcdFx0Y29sb3IgPSBkYXRhUG9pbnRzW2ldLmNvbG9yID8gZGF0YVBvaW50c1tpXS5jb2xvciA6IGRhdGFTZXJpZXMuX2NvbG9yU2V0W2kgJSBkYXRhU2VyaWVzLl9jb2xvclNldC5sZW5ndGhdO1xuXHRcdFx0XHRkcmF3UmVjdChjdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgYmV2ZWxFbmFibGVkICYmIChkYXRhUG9pbnRzW2ldLnkgPj0gMCksIChkYXRhUG9pbnRzW2ldLnkgPCAwKSAmJiBiZXZlbEVuYWJsZWQsIGZhbHNlLCBmYWxzZSwgZGF0YVNlcmllcy5maWxsT3BhY2l0eSk7XG5cblx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbaV07XG5cdFx0XHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuXHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBpLCB4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTJcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0ZHJhd1JlY3QodGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIDAsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcblxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpIHtcblxuXHRcdFx0XHRcdHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBcInN0YWNrZWRDb2x1bW4xMDBcIixcblx0XHRcdFx0XHRcdGRhdGFQb2ludDogZGF0YVBvaW50c1tpXSxcblx0XHRcdFx0XHRcdGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMsXG5cdFx0XHRcdFx0XHRwb2ludDoge1xuXHRcdFx0XHRcdFx0XHR4OiB4LCB5OiBkYXRhUG9pbnRzW2ldLnkgPj0gMCA/IHkxIDogeTJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueSA+PSAwID8gMSA6IC0xLFxuXHRcdFx0XHRcdFx0Ym91bmRzOiB7XG5cdFx0XHRcdFx0XHRcdHgxOiB4MSwgeTE6IE1hdGgubWluKHkxLCB5MiksIHgyOiB4MiwgeTI6IE1hdGgubWF4KHkxLCB5Milcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRjb2xvcjogY29sb3Jcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y3R4LnJlc3RvcmUoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlc3RvcmUoKTtcblxuXHQvL3NvdXJjZSBhbmQgZGVzdCB3b3VsZCBiZSBzYW1lIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBlbmFibGVkXG5cdHZhciBhbmltYXRpb25CYXNlID0gTWF0aC5taW4oeVplcm9Ub1BpeGVsLCBwbG90VW5pdC5heGlzWS5ib3VuZGluZ1JlY3QueTIpO1xuXHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRzb3VyY2U6IGN0eCwgZGVzdDogdGhpcy5wbG90QXJlYS5jdHgsIGFuaW1hdGlvbkNhbGxiYWNrOiBBbmltYXRpb25IZWxwZXIueVNjYWxlQW5pbWF0aW9uLCBlYXNpbmdGdW5jdGlvbjogQW5pbWF0aW9uSGVscGVyLmVhc2luZy5lYXNlT3V0UXVhcnQsIGFuaW1hdGlvbkJhc2U6IGFuaW1hdGlvbkJhc2Vcblx0fTtcblx0cmV0dXJuIGFuaW1hdGlvbkluZm87XG59XG4iLCJcbmltcG9ydCB7aXNDYW52YXNTdXBwb3J0ZWR9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAocGxvdFVuaXQpIHtcblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblxuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGdob3N0Q3R4ID0gdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4O1xuXG5cdHZhciBheGlzWFByb3BzID0gcGxvdFVuaXQuYXhpc1gubGluZUNvb3JkaW5hdGVzO1xuXHR2YXIgYXhpc1lQcm9wcyA9IHBsb3RVbml0LmF4aXNZLmxpbmVDb29yZGluYXRlcztcblx0dmFyIG1hcmtlcnMgPSBbXTtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXHRjdHguc2F2ZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRnaG9zdEN0eC5zYXZlKCk7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRjdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRjdHguY2xpcCgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdGdob3N0Q3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0XHRnaG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cblx0XHR2YXIgc2VyaWVzSWQgPSBkYXRhU2VyaWVzLmlkO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbc2VyaWVzSWRdID0ge1xuXHRcdFx0b2JqZWN0VHlwZTogXCJkYXRhU2VyaWVzXCIsIGRhdGFTZXJpZXNJbmRleDogZGF0YVNlcmllc0luZGV4XG5cdFx0fTtcblxuXHRcdHZhciBoZXhDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoc2VyaWVzSWQpO1xuXHRcdGdob3N0Q3R4LmZpbGxTdHlsZSA9IGhleENvbG9yO1xuXHRcdC8vZ2hvc3RDdHgubGluZVdpZHRoID0gZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzO1xuXHRcdC8vZ2hvc3RDdHgubGluZVdpZHRoID0gMjA7XG5cblx0XHRtYXJrZXJzID0gW107XG5cblx0XHR2YXIgaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgPSB0cnVlO1xuXHRcdHZhciBpID0gMCwgeCwgeTtcblx0XHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGJhY2sgYW5kIGZvcnRoLlxuXG5cdFx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0dmFyIGJhc2VZO1xuXG5cdFx0dmFyIHN0YXJ0UG9pbnQgPSBudWxsO1xuXG5cdFx0dmFyIHByZXZEYXRhTnVsbCA9IGZhbHNlO1xuXHRcdGlmIChkYXRhUG9pbnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vY3R4LnN0cm9rZVN0eWxlID0gXCIjNDU3MkE3IFwiO1xuXHRcdFx0dmFyIGNvbG9yID0gZGF0YVNlcmllcy5fY29sb3JTZXRbaSAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cdFx0XHQvL2N0eC5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gY29sb3I7XG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcblx0XHRcdGN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3M7XG5cblx0XHRcdGlmIChjdHguc2V0TGluZURhc2gpIHtcblx0XHRcdFx0Y3R4LnNldExpbmVEYXNoKGdldExpbmVEYXNoQXJyYXkoZGF0YVNlcmllcy5saW5lRGFzaFR5cGUsIGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcykpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54LmdldFRpbWUgPyBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50c1tpXS54O1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW4gfHwgZGF0YVBvaW50WCA+IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcHJldlkgPSB5O1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgKGRhdGFQb2ludHNbaV0ueSkgIT09IFwibnVtYmVyXCIpIHtcblx0XHRcdFx0XHRjbG9zZUFyZWEoKTtcblxuXHRcdFx0XHRcdHByZXZEYXRhTnVsbCA9IHRydWU7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR4ID0gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRYIC0gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXG5cblx0XHRcdFx0aWYgKGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhIHx8IHByZXZEYXRhTnVsbCkge1xuXHRcdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRjdHgubW92ZVRvKHgsIHkpO1xuXHRcdFx0XHRcdHN0YXJ0UG9pbnQgPSB7XG5cdFx0XHRcdFx0XHR4OiB4LCB5OiB5XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oeCwgeSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgPSBmYWxzZTtcblx0XHRcdFx0XHRwcmV2RGF0YU51bGwgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblxuXHRcdFx0XHRcdGN0eC5saW5lVG8oeCwgcHJldlkpO1xuXHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmxpbmVUbyh4LCBwcmV2WSk7XG5cblx0XHRcdFx0XHRjdHgubGluZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0aWYgKGkgJSAyNTAgPT0gMCkge1xuXHRcdFx0XHRcdFx0Y2xvc2VBcmVhKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4LCB5MTogeVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vUmVuZGVyIE1hcmtlclxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5tYXJrZXJTaXplICE9PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ubWFya2VyU2l6ZSA+IDAgfHwgZGF0YVNlcmllcy5tYXJrZXJTaXplID4gMCkge1xuXHRcdFx0XHRcdFx0dmFyIG1hcmtlclByb3BzID0gZGF0YVNlcmllcy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGksIHgsIHksIGN0eCk7XG5cdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2gobWFya2VyUHJvcHMpO1xuXG5cdFx0XHRcdFx0XHQvL2lmICghZGF0YVNlcmllcy5tYXhXaWR0aEluWCB8fCBtYXJrZXJQcm9wcy5zaXplID4gZGF0YVNlcmllcy5tYXhXaWR0aEluWCkge1xuXHRcdFx0XHRcdFx0Ly9cdGRhdGFTZXJpZXMubWF4V2lkdGhJblggPSBtYXJrZXJQcm9wcy5zaXplIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblx0XHRcdFx0XHRcdC8vfVxuXG5cdFx0XHRcdFx0XHR2YXIgbWFya2VyQ29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0eDogeCwgeTogeSwgY3R4OiBnaG9zdEN0eCxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBtYXJrZXJQcm9wcy50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdHNpemU6IG1hcmtlclByb3BzLnNpemUsXG5cdFx0XHRcdFx0XHRcdFx0Y29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlckNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJUaGlja25lc3M6IG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5pbmRleExhYmVsIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbCB8fCBkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWxGb3JtYXR0ZXIgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJzdGVwQXJlYVwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHlcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueSA+PSAwID8gMSA6IC0xLFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjbG9zZUFyZWEoKTtcblxuXHRcdFx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXJzKG1hcmtlcnMpO1xuXHRcdH1cblx0fVxuXG5cdGN0eC5yZXN0b3JlKCk7XG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cdGZ1bmN0aW9uIGNsb3NlQXJlYSgpIHtcblxuXHRcdGlmICghc3RhcnRQb2ludClcblx0XHRcdHJldHVybjtcblxuXHRcdGlmIChkYXRhU2VyaWVzLmxpbmVUaGlja25lc3MgPiAwKVxuXHRcdFx0Y3R4LnN0cm9rZSgpO1xuXG5cdFx0aWYgKHBsb3RVbml0LmF4aXNZLnZpZXdwb3J0TWluaW11bSA8PSAwICYmIHBsb3RVbml0LmF4aXNZLnZpZXdwb3J0TWF4aW11bSA+PSAwKSB7XG5cdFx0XHRiYXNlWSA9IHlaZXJvVG9QaXhlbDtcblx0XHR9XG5cdFx0ZWxzZSBpZiAocGxvdFVuaXQuYXhpc1kudmlld3BvcnRNYXhpbXVtIDwgMClcblx0XHRcdGJhc2VZID0gYXhpc1lQcm9wcy55MTtcblx0XHRlbHNlIGlmIChwbG90VW5pdC5heGlzWS52aWV3cG9ydE1pbmltdW0gPiAwKVxuXHRcdFx0YmFzZVkgPSBheGlzWFByb3BzLnkyO1xuXG5cdFx0Y3R4LmxpbmVUbyh4LCBiYXNlWSk7XG5cdFx0Y3R4LmxpbmVUbyhzdGFydFBvaW50LngsIGJhc2VZKTtcblx0XHRjdHguY2xvc2VQYXRoKCk7XG5cblx0XHRjdHguZ2xvYmFsQWxwaGEgPSBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5O1xuXHRcdGN0eC5maWxsKCk7XG5cdFx0Y3R4Lmdsb2JhbEFscGhhID0gMTtcblxuXHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0Z2hvc3RDdHgubGluZVRvKHgsIGJhc2VZKTtcblx0XHRcdGdob3N0Q3R4LmxpbmVUbyhzdGFydFBvaW50LngsIGJhc2VZKTtcblx0XHRcdGdob3N0Q3R4LmNsb3NlUGF0aCgpO1xuXHRcdFx0Z2hvc3RDdHguZmlsbCgpO1xuXHRcdH1cblxuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRjdHgubW92ZVRvKHgsIHkpO1xuXHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdGdob3N0Q3R4Lm1vdmVUbyh4LCB5KTtcblxuXHRcdHN0YXJ0UG9pbnQgPSB7XG5cdFx0XHR4OiB4LCB5OiB5XG5cdFx0fTtcblx0fVxuXG5cdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0dmFyIGFuaW1hdGlvbkluZm8gPSB7XG5cdFx0c291cmNlOiBjdHgsIGRlc3Q6IHRoaXMucGxvdEFyZWEuY3R4LCBhbmltYXRpb25DYWxsYmFjazogQW5pbWF0aW9uSGVscGVyLnhDbGlwQW5pbWF0aW9uLCBlYXNpbmdGdW5jdGlvbjogQW5pbWF0aW9uSGVscGVyLmVhc2luZy5saW5lYXIsIGFuaW1hdGlvbkJhc2U6IDBcblx0fTtcblx0cmV0dXJuIGFuaW1hdGlvbkluZm87XG59XG4iLCJleHBvcnQgY29uc3QgY3VsdHVyZXMgPSB7XG4gIFwiZW5cIjoge1xuICAgIC8vRGVyaXZlcyBmcm9tIHRoZSBkZWZhdWx0IG9wdGlvbnNcbiAgfS8vLFxuICAvL1wiZXNcIjoge1xuICAvLyAgICBkZWNpbWFsU2VwYXJhdG9yOiBcIixcIixcbiAgLy8gICAgZGlnaXRHcm91cFNlcGFyYXRvcjogXCIuXCIsXG4gIC8vICAgIHpvb21UZXh0OiBcInpvb21cIixcbiAgLy8gICAgcGFuVGV4dDogXCJwYW5cIixcbiAgLy8gICAgcmVzZXRUZXh0OiBcInJlc2V0XCIsXG4gIC8vICAgIGRheXM6IFtcImRvbWluZ29cIiwgXCJsdW5lc1wiLCBcIm1hcnRlc1wiLCBcIm1pw6lyY29sZXNcIiwgXCJqdWV2ZXNcIiwgXCJ2aWVybmVzXCIsIFwic8OhYmFkb1wiXSxcbiAgLy99XG59O1xuXG5leHBvcnQgY29uc3QgY29uc3RhbnRzID0ge1xuICBudW1iZXJEdXJhdGlvbjogMSxcbiAgeWVhckR1cmF0aW9uOiAxMDAwICogNjAgKiA2MCAqIDI0ICogMzY0LFxuICBtb250aER1cmF0aW9uOiAxMDAwICogNjAgKiA2MCAqIDI0ICogMzAsXG4gIHdlZWtEdXJhdGlvbjogMTAwMCAqIDYwICogNjAgKiAyNCAqIDcsXG4gIGRheUR1cmF0aW9uOiAxMDAwICogNjAgKiA2MCAqIDI0LFxuICBob3VyRHVyYXRpb246IDEwMDAgKiA2MCAqIDYwLFxuICBtaW51dGVEdXJhdGlvbjogMTAwMCAqIDYwLFxuICBzZWNvbmREdXJhdGlvbjogMTAwMCxcbiAgbWlsbGlzZWNvbmREdXJhdGlvbjogMSxcblxuICBkYXlPZldlZWtGcm9tSW50OiBbXCJTdW5kYXlcIiwgXCJNb25kYXlcIiwgXCJUdWVzZGF5XCIsIFwiV2VkbmVzZGF5XCIsIFwiVGh1cnNkYXlcIiwgXCJGcmlkYXlcIiwgXCJTYXR1cmRheVwiXVxufTtcbiIsIlxuZXhwb3J0IGNvbnN0IGlzRGVidWdNb2RlID0gZmFsc2U7XG5cbmV4cG9ydCBjb25zdCBpc0NhbnZhc1N1cHBvcnRlZCA9ICEhZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKS5nZXRDb250ZXh0O1xuXHQvL2lzQ2FudmFzU3VwcG9ydGVkID0gZmFsc2U7XG5cblx0Ly9EZWZhdWx0IHZhbHVlcyBmb3IgYWxsIENoYXJ0IEVsZW1lbnRzIHRoYXQgY2FuIGJlIHNldCBieSB0aGUgdXNlci4gQ2FudmFzSlNPYmplY3Quc2V0T3B0aW9ucyBsb29rcyBpbnRvIHRoaXMgd2hpbGUgc2V0dGluZyB0aGUgZGVmYXVsdC91c2VyLWRlZmluZWQgdmFsdWVzLlxuZXhwb3J0IGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuXHRcdENoYXJ0OiB7XG5cdFx0XHR3aWR0aDogNTAwLFxuXHRcdFx0aGVpZ2h0OiA0MDAsXG5cdFx0XHR6b29tRW5hYmxlZDogZmFsc2UsXG5cdFx0XHR6b29tVHlwZTogXCJ4XCIsXG5cdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IFwid2hpdGVcIixcblx0XHRcdHRoZW1lOiBcInRoZW1lMVwiLFxuXHRcdFx0YW5pbWF0aW9uRW5hYmxlZDogZmFsc2UsXG5cdFx0XHRhbmltYXRpb25EdXJhdGlvbjogMTIwMCxcblx0XHRcdGRhdGFQb2ludE1heFdpZHRoOiBudWxsLFxuXG5cdFx0XHRjb2xvclNldDogXCJjb2xvclNldDFcIixcblx0XHRcdGN1bHR1cmU6IFwiZW5cIixcblx0XHRcdGNyZWRpdFRleHQ6IFwiQ2FudmFzSlMuY29tXCIsXG5cdFx0XHRpbnRlcmFjdGl2aXR5RW5hYmxlZDogdHJ1ZSxcblx0XHRcdGV4cG9ydEVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0ZXhwb3J0RmlsZU5hbWU6IFwiQ2hhcnRcIixcblxuXHRcdFx0cmFuZ2VDaGFuZ2luZzogbnVsbCxcblx0XHRcdHJhbmdlQ2hhbmdlZDogbnVsbFxuXHRcdH0sXG5cblx0XHRUaXRsZToge1xuXHRcdFx0cGFkZGluZzogMCxcblx0XHRcdHRleHQ6IG51bGwsXG5cdFx0XHR2ZXJ0aWNhbEFsaWduOiBcInRvcFwiLC8vdG9wLCBjZW50ZXIsIGJvdHRvbVxuXHRcdFx0aG9yaXpvbnRhbEFsaWduOiBcImNlbnRlclwiLC8vbGVmdCwgY2VudGVyLCByaWdodFxuXHRcdFx0Zm9udFNpemU6IDIwLC8vaW4gcGl4ZWxzXG5cdFx0XHRmb250RmFtaWx5OiBcIkNhbGlicmlcIixcblx0XHRcdGZvbnRXZWlnaHQ6IFwibm9ybWFsXCIsIC8vbm9ybWFsLCBib2xkLCBib2xkZXIsIGxpZ2h0ZXIsXG5cdFx0XHRmb250Q29sb3I6IFwiYmxhY2tcIixcblx0XHRcdGZvbnRTdHlsZTogXCJub3JtYWxcIiwgLy8gbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcblxuXHRcdFx0Ym9yZGVyVGhpY2tuZXNzOiAwLFxuXHRcdFx0Ym9yZGVyQ29sb3I6IFwiYmxhY2tcIixcblx0XHRcdGNvcm5lclJhZGl1czogMCxcblx0XHRcdGJhY2tncm91bmRDb2xvcjogbnVsbCxcblx0XHRcdG1hcmdpbjogNSxcblx0XHRcdHdyYXA6IHRydWUsXG5cdFx0XHRtYXhXaWR0aDogbnVsbCxcblxuXHRcdFx0ZG9ja0luc2lkZVBsb3RBcmVhOiBmYWxzZVxuXHRcdFx0Ly90b29sVGlwQ29udGVudDogbnVsbC8vc3RyaW5nIC0gVG8gYmUgaW1wbGVtZW50ZWQgKFRCSSlcblx0XHR9LFxuXG5cdFx0U3VidGl0bGU6IHtcblx0XHRcdHBhZGRpbmc6IDAsXG5cdFx0XHR0ZXh0OiBudWxsLFxuXHRcdFx0dmVydGljYWxBbGlnbjogXCJ0b3BcIiwvL3RvcCwgY2VudGVyLCBib3R0b21cblx0XHRcdGhvcml6b250YWxBbGlnbjogXCJjZW50ZXJcIiwvL2xlZnQsIGNlbnRlciwgcmlnaHRcblx0XHRcdGZvbnRTaXplOiAxNCwvL2luIHBpeGVsc1xuXHRcdFx0Zm9udEZhbWlseTogXCJDYWxpYnJpXCIsXG5cdFx0XHRmb250V2VpZ2h0OiBcIm5vcm1hbFwiLCAvL25vcm1hbCwgYm9sZCwgYm9sZGVyLCBsaWdodGVyLFxuXHRcdFx0Zm9udENvbG9yOiBcImJsYWNrXCIsXG5cdFx0XHRmb250U3R5bGU6IFwibm9ybWFsXCIsIC8vIG5vcm1hbCwgaXRhbGljLCBvYmxpcXVlXG5cblx0XHRcdGJvcmRlclRoaWNrbmVzczogMCxcblx0XHRcdGJvcmRlckNvbG9yOiBcImJsYWNrXCIsXG5cdFx0XHRjb3JuZXJSYWRpdXM6IDAsXG5cdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IG51bGwsXG5cdFx0XHRtYXJnaW46IDIsXG5cdFx0XHR3cmFwOiB0cnVlLFxuXHRcdFx0bWF4V2lkdGg6IG51bGwsXG5cblx0XHRcdGRvY2tJbnNpZGVQbG90QXJlYTogZmFsc2Vcblx0XHRcdC8vdG9vbFRpcENvbnRlbnQ6IG51bGwvL3N0cmluZyAtIFRvIGJlIGltcGxlbWVudGVkIChUQkkpXG5cdFx0fSxcblxuXHRcdExlZ2VuZDoge1xuXHRcdFx0bmFtZTogbnVsbCxcblx0XHRcdHZlcnRpY2FsQWxpZ246IFwiY2VudGVyXCIsXG5cdFx0XHRob3Jpem9udGFsQWxpZ246IFwicmlnaHRcIixcblxuXHRcdFx0Zm9udFNpemU6IDE0LC8vaW4gcGl4ZWxzXG5cdFx0XHRmb250RmFtaWx5OiBcImNhbGlicmlcIixcblx0XHRcdGZvbnRXZWlnaHQ6IFwibm9ybWFsXCIsIC8vbm9ybWFsLCBib2xkLCBib2xkZXIsIGxpZ2h0ZXIsXG5cdFx0XHRmb250Q29sb3I6IFwiYmxhY2tcIixcblx0XHRcdGZvbnRTdHlsZTogXCJub3JtYWxcIiwgLy8gbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcblxuXHRcdFx0Y3Vyc29yOiBudWxsLFxuXHRcdFx0aXRlbW1vdXNlb3ZlcjogbnVsbCxcblx0XHRcdGl0ZW1tb3VzZW91dDogbnVsbCxcblx0XHRcdGl0ZW1tb3VzZW1vdmU6IG51bGwsXG5cdFx0XHRpdGVtY2xpY2s6IG51bGwsXG5cblx0XHRcdGRvY2tJbnNpZGVQbG90QXJlYTogZmFsc2UsXG5cdFx0XHRyZXZlcnNlZDogZmFsc2UsXG5cblx0XHRcdG1heFdpZHRoOiBudWxsLFxuXHRcdFx0bWF4SGVpZ2h0OiBudWxsLFxuXG5cdFx0XHRpdGVtTWF4V2lkdGg6IG51bGwsXG5cdFx0XHRpdGVtV2lkdGg6IG51bGwsXG5cdFx0XHRpdGVtV3JhcDogdHJ1ZSxcblx0XHRcdGl0ZW1UZXh0Rm9ybWF0dGVyOiBudWxsXG5cdFx0fSxcblxuXHRcdFRvb2xUaXA6IHtcblx0XHRcdGVuYWJsZWQ6IHRydWUsXG5cdFx0XHRzaGFyZWQ6IGZhbHNlLFxuXHRcdFx0YW5pbWF0aW9uRW5hYmxlZDogdHJ1ZSxcblx0XHRcdGNvbnRlbnQ6IG51bGwsXG5cdFx0XHRjb250ZW50Rm9ybWF0dGVyOiBudWxsLFxuXG5cdFx0XHRyZXZlcnNlZDogZmFsc2UsXG5cblx0XHRcdGJhY2tncm91bmRDb2xvcjogbnVsbCxcblxuXHRcdFx0Ym9yZGVyQ29sb3I6IG51bGwsXG5cdFx0XHRib3JkZXJUaGlja25lc3M6IDIsIC8vaW4gcGl4ZWxzXG5cdFx0XHRjb3JuZXJSYWRpdXM6IDUsIC8vIGluIHBpeGVsc1xuXG5cdFx0XHRmb250U2l6ZTogMTQsIC8vIGluIHBpeGVsc1xuXHRcdFx0Zm9udENvbG9yOiBcIiMwMDAwMDBcIixcblx0XHRcdGZvbnRGYW1pbHk6IFwiQ2FsaWJyaSwgQXJpYWwsIEdlb3JnaWEsIHNlcmlmO1wiLFxuXHRcdFx0Zm9udFdlaWdodDogXCJub3JtYWxcIiwgLy9ub3JtYWwsIGJvbGQsIGJvbGRlciwgbGlnaHRlcixcblx0XHRcdGZvbnRTdHlsZTogXCJpdGFsaWNcIiAgLy8gbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcblx0XHR9LFxuXG5cdFx0QXhpczoge1xuXHRcdFx0bWluaW11bTogbnVsbCwgLy9NaW5pbXVtIHZhbHVlIHRvIGJlIHNob3duIG9uIHRoZSBBeGlzXG5cdFx0XHRtYXhpbXVtOiBudWxsLCAvL01pbmltdW0gdmFsdWUgdG8gYmUgc2hvd24gb24gdGhlIEF4aXNcblx0XHRcdHZpZXdwb3J0TWluaW11bTogbnVsbCxcblx0XHRcdHZpZXdwb3J0TWF4aW11bTogbnVsbCxcblx0XHRcdGludGVydmFsOiBudWxsLCAvLyBJbnRlcnZhbCBmb3IgdGljayBtYXJrcyBhbmQgZ3JpZCBsaW5lc1xuXHRcdFx0aW50ZXJ2YWxUeXBlOiBudWxsLCAvL251bWJlciwgbWlsbGlzZWNvbmQsIHNlY29uZCwgbWludXRlLCBob3VyLCBkYXksIG1vbnRoLCB5ZWFyXG5cdFx0XHQvL3JldmVyc2VkOiBmYWxzZSxcblxuXHRcdFx0dGl0bGU6IG51bGwsIC8vIHN0cmluZ1xuXHRcdFx0dGl0bGVGb250Q29sb3I6IFwiYmxhY2tcIixcblx0XHRcdHRpdGxlRm9udFNpemU6IDIwLFxuXHRcdFx0dGl0bGVGb250RmFtaWx5OiBcImFyaWFsXCIsXG5cdFx0XHR0aXRsZUZvbnRXZWlnaHQ6IFwibm9ybWFsXCIsXG5cdFx0XHR0aXRsZUZvbnRTdHlsZTogXCJub3JtYWxcIixcblxuXHRcdFx0bGFiZWxBbmdsZTogMCxcblx0XHRcdGxhYmVsRm9udEZhbWlseTogXCJhcmlhbFwiLFxuXHRcdFx0bGFiZWxGb250Q29sb3I6IFwiYmxhY2tcIixcblx0XHRcdGxhYmVsRm9udFNpemU6IDEyLFxuXHRcdFx0bGFiZWxGb250V2VpZ2h0OiBcIm5vcm1hbFwiLFxuXHRcdFx0bGFiZWxGb250U3R5bGU6IFwibm9ybWFsXCIsXG5cdFx0XHRsYWJlbEF1dG9GaXQ6IGZhbHNlLFxuXHRcdFx0bGFiZWxXcmFwOiB0cnVlLFxuXHRcdFx0bGFiZWxNYXhXaWR0aDogbnVsbCwvL251bGwgZm9yIGF1dG9cblx0XHRcdGxhYmVsRm9ybWF0dGVyOiBudWxsLFxuXG5cdFx0XHRwcmVmaXg6IFwiXCIsXG5cdFx0XHRzdWZmaXg6IFwiXCIsXG5cblx0XHRcdGluY2x1ZGVaZXJvOiB0cnVlLCAvL0FwcGxpZXMgb25seSBmb3IgYXhpc1kuIElnbm9yZWQgaW4gYXhpc1guXG5cblx0XHRcdHRpY2tMZW5ndGg6IDUsXG5cdFx0XHR0aWNrQ29sb3I6IFwiYmxhY2tcIixcblx0XHRcdHRpY2tUaGlja25lc3M6IDEsXG5cblx0XHRcdGxpbmVDb2xvcjogXCJibGFja1wiLFxuXHRcdFx0bGluZVRoaWNrbmVzczogMSxcblx0XHRcdGxpbmVEYXNoVHlwZTogXCJzb2xpZFwiLFxuXG5cdFx0XHRncmlkQ29sb3I6IFwiQTBBMEEwXCIsXG5cdFx0XHRncmlkVGhpY2tuZXNzOiAwLFxuXHRcdFx0Z3JpZERhc2hUeXBlOiBcInNvbGlkXCIsXG5cblx0XHRcdGludGVybGFjZWRDb2xvcjogbnVsbCxcblxuXHRcdFx0dmFsdWVGb3JtYXRTdHJpbmc6IG51bGwsXG5cblx0XHRcdG1hcmdpbjogMixcblxuXHRcdFx0c3RyaXBMaW5lczogW10gLy8gSnVzdCBhIHBsYWNlaG9sZGVyLiBEb2VzIG5vdCBoYXZlIGFueSBlZmZlY3Qgb24gdGhlIGFjdHVhbCBudW1iZXIgb2Ygc3RyaXBsaW5lc1xuXHRcdH0sXG5cblx0XHRTdHJpcExpbmU6IHtcblx0XHRcdHZhbHVlOiBudWxsLFxuXHRcdFx0c3RhcnRWYWx1ZTogbnVsbCxcblx0XHRcdGVuZFZhbHVlOiBudWxsLFxuXG5cdFx0XHRjb2xvcjogXCJvcmFuZ2VcIixcblx0XHRcdG9wYWNpdHk6IG51bGwsXG5cdFx0XHR0aGlja25lc3M6IDIsXG5cdFx0XHRsaW5lRGFzaFR5cGU6IFwic29saWRcIixcblx0XHRcdGxhYmVsOiBcIlwiLFxuXHRcdFx0bGFiZWxCYWNrZ3JvdW5kQ29sb3I6IFwiI0VFRUVFRVwiLFxuXHRcdFx0bGFiZWxGb250RmFtaWx5OiBcImFyaWFsXCIsXG5cdFx0XHRsYWJlbEZvbnRDb2xvcjogXCJvcmFuZ2VcIixcblx0XHRcdGxhYmVsRm9udFNpemU6IDEyLFxuXHRcdFx0bGFiZWxGb250V2VpZ2h0OiBcIm5vcm1hbFwiLFxuXHRcdFx0bGFiZWxGb250U3R5bGU6IFwibm9ybWFsXCIsXG5cdFx0XHRsYWJlbEZvcm1hdHRlcjogbnVsbCxcblxuXHRcdFx0c2hvd09uVG9wOiBmYWxzZVxuXHRcdH0sXG5cblx0XHREYXRhU2VyaWVzOiB7XG5cdFx0XHRuYW1lOiBudWxsLFxuXHRcdFx0ZGF0YVBvaW50czogbnVsbCxcblx0XHRcdGxhYmVsOiBcIlwiLFxuXHRcdFx0YmV2ZWxFbmFibGVkOiBmYWxzZSxcblx0XHRcdGhpZ2hsaWdodEVuYWJsZWQ6IHRydWUsXG5cblx0XHRcdGN1cnNvcjogbnVsbCxcblxuXHRcdFx0aW5kZXhMYWJlbDogXCJcIixcblx0XHRcdGluZGV4TGFiZWxQbGFjZW1lbnQ6IFwiYXV0b1wiLCAgLy9pbnNpZGUsIG91dHNpZGUsIGF1dG9cblx0XHRcdGluZGV4TGFiZWxPcmllbnRhdGlvbjogXCJob3Jpem9udGFsXCIsXG5cdFx0XHRpbmRleExhYmVsRm9udENvbG9yOiBcImJsYWNrXCIsXG5cdFx0XHRpbmRleExhYmVsRm9udFNpemU6IDEyLFxuXHRcdFx0aW5kZXhMYWJlbEZvbnRTdHlsZTogXCJub3JtYWxcIiwgLy8gICBpdGFsaWMgLG9ibGlxdWUsIG5vcm1hbFxuXHRcdFx0aW5kZXhMYWJlbEZvbnRGYW1pbHk6IFwiQXJpYWxcIiwgXHQvLyBmeDogQXJpYWwgVmVyZGFuYSBcIkNvdXJpZXIgTmV3XCIgU2VyaWZcblx0XHRcdGluZGV4TGFiZWxGb250V2VpZ2h0OiBcIm5vcm1hbFwiLCBcdC8vIGJvbGQgLGJvbGRlciwgbGlnaHRlciwgbm9ybWFsXG5cdFx0XHRpbmRleExhYmVsQmFja2dyb3VuZENvbG9yOiBudWxsLFxuXHRcdFx0aW5kZXhMYWJlbExpbmVDb2xvcjogbnVsbCxcblx0XHRcdGluZGV4TGFiZWxMaW5lVGhpY2tuZXNzOiAxLFxuXHRcdFx0aW5kZXhMYWJlbExpbmVEYXNoVHlwZTogXCJzb2xpZFwiLFxuXHRcdFx0aW5kZXhMYWJlbE1heFdpZHRoOiBudWxsLFxuXHRcdFx0aW5kZXhMYWJlbFdyYXA6IHRydWUsXG5cdFx0XHRpbmRleExhYmVsRm9ybWF0dGVyOiBudWxsLFxuXG5cdFx0XHRsaW5lVGhpY2tuZXNzOiAyLFxuXHRcdFx0bGluZURhc2hUeXBlOiBcInNvbGlkXCIsXG5cblx0XHRcdGNvbG9yOiBudWxsLFxuXHRcdFx0cmlzaW5nQ29sb3I6IFwid2hpdGVcIixcblx0XHRcdGZpbGxPcGFjaXR5OiBudWxsLFxuXG5cdFx0XHRzdGFydEFuZ2xlOiAwLFxuXG5cdFx0XHRyYWRpdXM6IG51bGwsXG5cdFx0XHRpbm5lclJhZGl1czogbnVsbCxcblxuXHRcdFx0dHlwZTogXCJjb2x1bW5cIiwgLy9saW5lLCBjb2x1bW4sIGJhciwgYXJlYSwgc2NhdHRlciBzdGFja2VkQ29sdW1uLCBzdGFja2VkQmFyLCBzdGFja2VkQXJlYSwgc3RhY2tlZENvbHVtbjEwMCwgc3RhY2tlZEJhcjEwMCwgc3RhY2tlZEFyZWExMDAsIHBpZSwgZG91Z2hudXRcblx0XHRcdHhWYWx1ZVR5cGU6IFwibnVtYmVyXCIsIC8vbnVtYmVyLCBkYXRlVGltZVxuXHRcdFx0YXhpc1lUeXBlOiBcInByaW1hcnlcIixcblxuXHRcdFx0eFZhbHVlRm9ybWF0U3RyaW5nOiBudWxsLFxuXHRcdFx0eVZhbHVlRm9ybWF0U3RyaW5nOiBudWxsLFxuXHRcdFx0elZhbHVlRm9ybWF0U3RyaW5nOiBudWxsLFxuXHRcdFx0cGVyY2VudEZvcm1hdFN0cmluZzogbnVsbCxcblxuXHRcdFx0c2hvd0luTGVnZW5kOiBudWxsLFxuXHRcdFx0bGVnZW5kTWFya2VyVHlwZTogbnVsbCxcblx0XHRcdGxlZ2VuZE1hcmtlckNvbG9yOiBudWxsLFxuXHRcdFx0bGVnZW5kVGV4dDogbnVsbCxcblx0XHRcdGxlZ2VuZE1hcmtlckJvcmRlckNvbG9yOiBudWxsLFxuXHRcdFx0bGVnZW5kTWFya2VyQm9yZGVyVGhpY2tuZXNzOiBudWxsLFxuXG5cdFx0XHRtYXJrZXJUeXBlOiBcImNpcmNsZVwiLCAvL25vbmUsIGNpcmNsZSwgc3F1YXJlLCBjcm9zcywgdHJpYW5nbGUsIGxpbmVcblx0XHRcdG1hcmtlckNvbG9yOiBudWxsLFxuXHRcdFx0bWFya2VyU2l6ZTogbnVsbCxcblx0XHRcdG1hcmtlckJvcmRlckNvbG9yOiBudWxsLFxuXHRcdFx0bWFya2VyQm9yZGVyVGhpY2tuZXNzOiBudWxsLFxuXHRcdFx0Ly9hbmltYXRpb25FbmFibGVkOiB0cnVlLFxuXHRcdFx0bW91c2VvdmVyOiBudWxsLFxuXHRcdFx0bW91c2VvdXQ6IG51bGwsXG5cdFx0XHRtb3VzZW1vdmU6IG51bGwsXG5cdFx0XHRjbGljazogbnVsbCxcblx0XHRcdHRvb2xUaXBDb250ZW50OiBudWxsLFxuXG5cdFx0XHR2aXNpYmxlOiB0cnVlXG5cdFx0fSxcblxuXHRcdC8vUHJpdmF0ZVxuXHRcdFRleHRCbG9jazoge1xuXHRcdFx0eDogMCxcblx0XHRcdHk6IDAsXG5cdFx0XHR3aWR0aDogbnVsbCwvL3JlYWQgb25seVxuXHRcdFx0aGVpZ2h0OiBudWxsLC8vcmVhZCBvbmx5XG5cdFx0XHRtYXhXaWR0aDogbnVsbCxcblx0XHRcdG1heEhlaWdodDogbnVsbCxcblx0XHRcdHBhZGRpbmc6IDAsXG5cdFx0XHRhbmdsZTogMCxcblx0XHRcdHRleHQ6IFwiXCIsXG5cdFx0XHRob3Jpem9udGFsQWxpZ246IFwiY2VudGVyXCIsLy9sZWZ0LCBjZW50ZXIsIHJpZ2h0XG5cdFx0XHRmb250U2l6ZTogMTIsLy9pbiBwaXhlbHNcblx0XHRcdGZvbnRGYW1pbHk6IFwiY2FsaWJyaVwiLFxuXHRcdFx0Zm9udFdlaWdodDogXCJub3JtYWxcIiwgLy9ub3JtYWwsIGJvbGQsIGJvbGRlciwgbGlnaHRlcixcblx0XHRcdGZvbnRDb2xvcjogXCJibGFja1wiLFxuXHRcdFx0Zm9udFN0eWxlOiBcIm5vcm1hbFwiLCAvLyBub3JtYWwsIGl0YWxpYywgb2JsaXF1ZVxuXG5cdFx0XHRib3JkZXJUaGlja25lc3M6IDAsXG5cdFx0XHRib3JkZXJDb2xvcjogXCJibGFja1wiLFxuXHRcdFx0Y29ybmVyUmFkaXVzOiAwLFxuXHRcdFx0YmFja2dyb3VuZENvbG9yOiBudWxsLFxuXHRcdFx0dGV4dEJhc2VsaW5lOiBcInRvcFwiXG5cdFx0fSxcblxuXHRcdEN1bHR1cmVJbmZvOiB7XG5cdFx0XHRkZWNpbWFsU2VwYXJhdG9yOiBcIi5cIixcblx0XHRcdGRpZ2l0R3JvdXBTZXBhcmF0b3I6IFwiLFwiLFxuXHRcdFx0em9vbVRleHQ6IFwiWm9vbVwiLFxuXHRcdFx0cGFuVGV4dDogXCJQYW5cIixcblx0XHRcdHJlc2V0VGV4dDogXCJSZXNldFwiLFxuXG5cdFx0XHRtZW51VGV4dDogXCJNb3JlIE9wdGlvbnNcIixcblx0XHRcdHNhdmVKUEdUZXh0OiBcIlNhdmUgYXMgSlBHXCIsXG5cdFx0XHRzYXZlUE5HVGV4dDogXCJTYXZlIGFzIFBOR1wiLFxuXG5cdFx0XHRkYXlzOiBbXCJTdW5kYXlcIiwgXCJNb25kYXlcIiwgXCJUdWVzZGF5XCIsIFwiV2VkbmVzZGF5XCIsIFwiVGh1cnNkYXlcIiwgXCJGcmlkYXlcIiwgXCJTYXR1cmRheVwiXSxcblx0XHRcdHNob3J0RGF5czogW1wiU3VuXCIsIFwiTW9uXCIsIFwiVHVlXCIsIFwiV2VkXCIsIFwiVGh1XCIsIFwiRnJpXCIsIFwiU2F0XCJdLFxuXG5cdFx0XHRtb250aHM6IFtcIkphbnVhcnlcIiwgXCJGZWJydWFyeVwiLCBcIk1hcmNoXCIsIFwiQXByaWxcIiwgXCJNYXlcIiwgXCJKdW5lXCIsIFwiSnVseVwiLCBcIkF1Z3VzdFwiLCBcIlNlcHRlbWJlclwiLCBcIk9jdG9iZXJcIiwgXCJOb3ZlbWJlclwiLCBcIkRlY2VtYmVyXCJdLFxuXHRcdFx0c2hvcnRNb250aHM6IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiXVxuXHRcdH1cblx0fTtcbiIsIlxuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZH0gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBjb2xvclNldHMgPSB7XG5cblx0XHRcImNvbG9yU2V0MVwiOiBbXG5cdFx0XHRcIiMzNjlFQURcIixcblx0XHRcdFwiI0MyNDY0MlwiLFxuXHRcdFx0XCIjN0Y2MDg0XCIsXG5cdFx0XHQvL1wiIzk2QzQxMlwiLFxuXHRcdFx0XCIjODZCNDAyXCIsXG5cdFx0XHRcIiNBMkQxQ0ZcIixcblx0XHRcdC8vXCIjRDhDNjQxXCIsXG5cdFx0XHRcIiNDOEI2MzFcIixcblx0XHRcdFwiIzZEQkNFQlwiLFxuXHRcdFx0Ly9cIiM0QTQ5NDZcIixcblx0XHRcdFwiIzUyNTE0RVwiLFxuXHRcdFx0XCIjNEY4MUJDXCIsXG5cdFx0XHRcIiNBMDY0QTFcIixcblx0XHRcdFwiI0Y3OTY0N1wiXG5cdFx0XSxcblx0XHRcImNvbG9yU2V0MlwiOiBbXG5cdFx0XHRcIiM0RjgxQkNcIixcblx0XHRcdFwiI0MwNTA0RVwiLFxuXHRcdFx0XCIjOUJCQjU4XCIsXG5cdFx0XHRcIiMyM0JGQUFcIixcblx0XHRcdC8vXCIjRkFBNTg2XCIsXG5cdFx0XHRcIiM4MDY0QTFcIixcblx0XHRcdFwiIzRBQUNDNVwiLFxuXHRcdFx0XCIjRjc5NjQ3XCIsXG5cdFx0XHQvL1wiIzc3QUEzM1wiLFxuXHRcdFx0Ly9cIiM3RjYwODRcIlxuXHRcdFx0XCIjMzM1NThCXCJcblx0XHRdLFxuXHRcdFwiY29sb3JTZXQzXCI6IFtcblx0XHRcdFwiIzhDQTFCQ1wiLFxuXHRcdFx0XCIjMzY4NDVDXCIsXG5cdFx0XHRcIiMwMTdFODJcIixcblx0XHRcdFwiIzhDQjlEMFwiLFxuXHRcdFx0XCIjNzA4Qzk4XCIsXG5cdFx0XHRcIiM5NDgzOERcIixcblx0XHRcdFwiI0YwODg5MVwiLFxuXHRcdFx0XCIjMDM2NkE3XCIsXG5cdFx0XHRcIiMwMDgyNzZcIixcblx0XHRcdFwiI0VFNzc1N1wiLFxuXHRcdFx0XCIjRTVCQTNBXCIsXG5cdFx0XHRcIiNGMjk5MEJcIixcblx0XHRcdFwiIzAzNTU3QlwiLFxuXHRcdFx0XCIjNzgyOTcwXCJcblx0XHRdLy8sXG5cdFx0Ly9cImNvbG9yU2V0NFwiOiBbXG5cdFx0Ly8gICAgXCIjMzY5OEM1XCIsXG5cdFx0Ly8gICAgXCIjMDA5QjhEXCIsXG5cdFx0Ly8gICAgXCIjRjFENjkxXCIsXG5cdFx0Ly8gICAgXCIjRjhCOTBDXCIsXG5cdFx0Ly8gICAgXCIjMDA4MUI4XCIsXG5cdFx0Ly8gICAgXCIjNUI1QTk2XCIsXG5cdFx0Ly8gICAgXCIjQUNCREQxXCIsXG5cdFx0Ly8gICAgXCIjODhBODkxXCIsXG5cdFx0Ly8gICAgXCIjMzk5NjlEXCIsXG5cdFx0Ly8gICAgXCIjQUVDRUREXCIsXG5cdFx0Ly8gICAgXCIjQTBCMkJDXCIsXG5cdFx0Ly8gICAgXCIjQkJBRUI3XCIsXG5cdFx0Ly8gICAgXCIjQTBDNjVGXCIsXG5cdFx0Ly8gICAgXCIjRUVBNkFBXCIsXG5cdFx0Ly8gICAgXCIjMzc5OEM1XCJcblx0XHQvL10sXG5cdFx0Ly9cImNvbG9yU2V0NVwiOiBbXG5cdFx0Ly8gICAgXCIjODhBREJGXCIsXG5cdFx0Ly8gICAgXCIjODRDMzM2XCIsXG5cdFx0Ly8gICAgXCIjN0I5MUMzXCIsXG5cdFx0Ly8gICAgXCIjNDY2MUVFXCIsXG5cdFx0Ly8gICAgXCIjRUM1NjU3XCIsXG5cdFx0Ly8gICAgXCIjMUJDREQxXCIsXG5cdFx0Ly8gICAgXCIjOEZBQUJCXCIsXG5cdFx0Ly8gICAgXCIjQjA4QkVCXCIsXG5cdFx0Ly8gICAgXCIjM0VBMEREXCIsXG5cdFx0Ly8gICAgXCIjRjVBNTJBXCIsXG5cdFx0Ly8gICAgXCIjMjNCRkFBXCIsXG5cdFx0Ly8gICAgXCIjRkFBNTg2XCIsXG5cdFx0Ly8gICAgXCIjRUI4Q0M2XCJcblx0XHQvL11cblxuXHR9O1xuXG5leHBvcnQgY29uc3QgdGhlbWVzID0ge1xuXG5cdFx0XHRcInRoZW1lMVwiOiB7XG5cdFx0XHRcdENoYXJ0OlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNvbG9yU2V0OiBcImNvbG9yU2V0MVwiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0VGl0bGU6IHtcblx0XHRcdFx0XHRmb250RmFtaWx5OiBpc0NhbnZhc1N1cHBvcnRlZCA/IFwiQ2FsaWJyaSwgT3B0aW1hLCBDYW5kYXJhLCBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWZcIiA6IFwiY2FsaWJyaVwiLFxuXHRcdFx0XHRcdGZvbnRTaXplOiAzMyxcblx0XHRcdFx0XHRmb250Q29sb3I6IFwiIzNBM0EzQVwiLFxuXHRcdFx0XHRcdGZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuXHRcdFx0XHRcdHZlcnRpY2FsQWxpZ246IFwidG9wXCIsXG5cdFx0XHRcdFx0bWFyZ2luOiA1XG5cdFx0XHRcdH0sXG5cdFx0XHRcdFN1YnRpdGxlOiB7XG5cdFx0XHRcdFx0Zm9udEZhbWlseTogaXNDYW52YXNTdXBwb3J0ZWQgPyBcIkNhbGlicmksIE9wdGltYSwgQ2FuZGFyYSwgVmVyZGFuYSwgR2VuZXZhLCBzYW5zLXNlcmlmXCIgOiBcImNhbGlicmlcIixcblx0XHRcdFx0XHRmb250U2l6ZTogMTYsXG5cdFx0XHRcdFx0Zm9udENvbG9yOiBcIiMzQTNBM0FcIixcblx0XHRcdFx0XHRmb250V2VpZ2h0OiBcImJvbGRcIixcblx0XHRcdFx0XHR2ZXJ0aWNhbEFsaWduOiBcInRvcFwiLFxuXHRcdFx0XHRcdG1hcmdpbjogNVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRBeGlzOiB7XG5cdFx0XHRcdFx0dGl0bGVGb250U2l6ZTogMjYsXG5cdFx0XHRcdFx0Ly90aXRsZUZvbnRDb2xvcjogXCJyZ2IoOTgsOTgsOTgpXCIsXG5cdFx0XHRcdFx0dGl0bGVGb250Q29sb3I6IFwiIzY2NjY2NlwiLFxuXHRcdFx0XHRcdC8vdGl0bGVGb250RmFtaWx5OiBcImFyaWFsIGJsYWNrXCIsXG5cdFx0XHRcdFx0Ly90aXRsZUZvbnRGYW1pbHk6IFwiVmVyZGFuYSwgR2VuZXZhLCBDYWxpYnJpLCBzYW5zLXNlcmlmXCIsXG5cdFx0XHRcdFx0dGl0bGVGb250RmFtaWx5OiBpc0NhbnZhc1N1cHBvcnRlZCA/IFwiQ2FsaWJyaSwgT3B0aW1hLCBDYW5kYXJhLCBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWZcIiA6IFwiY2FsaWJyaVwiLFxuXHRcdFx0XHRcdC8vdGl0bGVGb250V2VpZ2h0OiBcImJvbGRcIixcblxuXHRcdFx0XHRcdC8vbGFiZWxGb250RmFtaWx5OiBcIlRpbWVzIE5ldyBSb21hbiwgVGltZXMsIHNlcmlmXCIsXG5cdFx0XHRcdFx0bGFiZWxGb250RmFtaWx5OiBpc0NhbnZhc1N1cHBvcnRlZCA/IFwiQ2FsaWJyaSwgT3B0aW1hLCBDYW5kYXJhLCBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWZcIiA6IFwiY2FsaWJyaVwiLFxuXHRcdFx0XHRcdC8vbGFiZWxGb250RmFtaWx5OiBcIkhlbHZldGljYSBOZXVlLCBIZWx2ZXRpY2FcIixcblx0XHRcdFx0XHRsYWJlbEZvbnRTaXplOiAxOCxcblx0XHRcdFx0XHRsYWJlbEZvbnRDb2xvcjogXCJncmV5XCIsXG5cdFx0XHRcdFx0Ly9sYWJlbEZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuXHRcdFx0XHRcdHRpY2tDb2xvcjogXCIjQkJCQkJCXCIsXG5cdFx0XHRcdFx0dGlja1RoaWNrbmVzczogMixcblx0XHRcdFx0XHRncmlkVGhpY2tuZXNzOiAyLFxuXHRcdFx0XHRcdGdyaWRDb2xvcjogXCIjQkJCQkJCXCIsXG5cdFx0XHRcdFx0bGluZVRoaWNrbmVzczogMixcblx0XHRcdFx0XHRsaW5lQ29sb3I6IFwiI0JCQkJCQlwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdExlZ2VuZDoge1xuXHRcdFx0XHRcdHZlcnRpY2FsQWxpZ246IFwiYm90dG9tXCIsXG5cdFx0XHRcdFx0aG9yaXpvbnRhbEFsaWduOiBcImNlbnRlclwiLFxuXHRcdFx0XHRcdGZvbnRGYW1pbHk6IGlzQ2FudmFzU3VwcG9ydGVkID8gXCJtb25vc3BhY2UsIHNhbnMtc2VyaWYsYXJpYWwgYmxhY2tcIiA6IFwiY2FsaWJyaVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdERhdGFTZXJpZXM6IHtcblx0XHRcdFx0XHQvL2JldmVsRW5hYmxlZDogdHJ1ZSxcblx0XHRcdFx0XHRpbmRleExhYmVsRm9udENvbG9yOiBcImdyZXlcIixcblx0XHRcdFx0XHQvL2luZGV4TGFiZWxGb250RmFtaWx5OiBcIlRyZWJ1Y2hldCBNUywgbW9ub3NwYWNlLCBDb3VyaWVyIE5ldywgQ291cmllclwiLFxuXHRcdFx0XHRcdGluZGV4TGFiZWxGb250RmFtaWx5OiBpc0NhbnZhc1N1cHBvcnRlZCA/IFwiQ2FsaWJyaSwgT3B0aW1hLCBDYW5kYXJhLCBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWZcIiA6IFwiY2FsaWJyaVwiLFxuXHRcdFx0XHRcdC8vaW5kZXhMYWJlbEZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuXHRcdFx0XHRcdGluZGV4TGFiZWxGb250U2l6ZTogMTgsXG5cdFx0XHRcdFx0Ly9pbmRleExhYmVsTGluZUNvbG9yOiBcImxpZ2h0Z3JleVwiLFxuXHRcdFx0XHRcdGluZGV4TGFiZWxMaW5lVGhpY2tuZXNzOiAxXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdFwidGhlbWUyXCI6IHtcblx0XHRcdFx0Q2hhcnQ6XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29sb3JTZXQ6IFwiY29sb3JTZXQyXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRUaXRsZToge1xuXHRcdFx0XHRcdGZvbnRGYW1pbHk6IFwiaW1wYWN0LCBjaGFyY29hbCwgYXJpYWwgYmxhY2ssIHNhbnMtc2VyaWZcIixcblx0XHRcdFx0XHRmb250U2l6ZTogMzIsLy9mb250Q29sb3I6IFwicmdiKDU4LDU4LDU4KVwiLFxuXHRcdFx0XHRcdGZvbnRDb2xvcjogXCIjMzMzMzMzXCIsXG5cdFx0XHRcdFx0dmVydGljYWxBbGlnbjogXCJ0b3BcIixcblx0XHRcdFx0XHRtYXJnaW46IDVcblx0XHRcdFx0fSxcblx0XHRcdFx0U3VidGl0bGU6IHtcblx0XHRcdFx0XHRmb250RmFtaWx5OiBcImltcGFjdCwgY2hhcmNvYWwsIGFyaWFsIGJsYWNrLCBzYW5zLXNlcmlmXCIsXG5cdFx0XHRcdFx0Zm9udFNpemU6IDE0LC8vZm9udENvbG9yOiBcInJnYig1OCw1OCw1OClcIixcblx0XHRcdFx0XHRmb250Q29sb3I6IFwiIzMzMzMzM1wiLFxuXHRcdFx0XHRcdHZlcnRpY2FsQWxpZ246IFwidG9wXCIsXG5cdFx0XHRcdFx0bWFyZ2luOiA1XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEF4aXM6IHtcblx0XHRcdFx0XHR0aXRsZUZvbnRTaXplOiAyMixcblx0XHRcdFx0XHR0aXRsZUZvbnRDb2xvcjogXCJyZ2IoOTgsOTgsOTgpXCIsXG5cdFx0XHRcdFx0Ly90aXRsZUZvbnRGYW1pbHk6IFwiYXJpYWwgYmxhY2tcIixcblx0XHRcdFx0XHR0aXRsZUZvbnRGYW1pbHk6IGlzQ2FudmFzU3VwcG9ydGVkID8gXCJtb25vc3BhY2UsIHNhbnMtc2VyaWYsYXJpYWwgYmxhY2tcIiA6IFwiYXJpYWxcIixcblx0XHRcdFx0XHR0aXRsZUZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuXG5cblx0XHRcdFx0XHRsYWJlbEZvbnRGYW1pbHk6IGlzQ2FudmFzU3VwcG9ydGVkID8gXCJtb25vc3BhY2UsIENvdXJpZXIgTmV3LCBDb3VyaWVyXCIgOiBcImFyaWFsXCIsXG5cdFx0XHRcdFx0Ly9sYWJlbEZvbnRGYW1pbHk6IFwiSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYVwiLFxuXHRcdFx0XHRcdGxhYmVsRm9udFNpemU6IDE2LFxuXHRcdFx0XHRcdGxhYmVsRm9udENvbG9yOiBcImdyZXlcIixcblx0XHRcdFx0XHRsYWJlbEZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuXHRcdFx0XHRcdHRpY2tDb2xvcjogXCJncmV5XCIsXG5cdFx0XHRcdFx0dGlja1RoaWNrbmVzczogMixcblx0XHRcdFx0XHRncmlkVGhpY2tuZXNzOiAyLFxuXHRcdFx0XHRcdGdyaWRDb2xvcjogXCJncmV5XCIsXG5cdFx0XHRcdFx0bGluZUNvbG9yOiBcImdyZXlcIixcblx0XHRcdFx0XHRsaW5lVGhpY2tuZXNzOiAwXG5cdFx0XHRcdH0sXG5cdFx0XHRcdExlZ2VuZDoge1xuXHRcdFx0XHRcdHZlcnRpY2FsQWxpZ246IFwiYm90dG9tXCIsXG5cdFx0XHRcdFx0aG9yaXpvbnRhbEFsaWduOiBcImNlbnRlclwiLFxuXHRcdFx0XHRcdGZvbnRGYW1pbHk6IGlzQ2FudmFzU3VwcG9ydGVkID8gXCJtb25vc3BhY2UsIHNhbnMtc2VyaWYsYXJpYWwgYmxhY2tcIiA6IFwiYXJpYWxcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHREYXRhU2VyaWVzOiB7XG5cdFx0XHRcdFx0aW5kZXhMYWJlbEZvbnRDb2xvcjogXCJncmV5XCIsXG5cdFx0XHRcdFx0Ly9pbmRleExhYmVsRm9udEZhbWlseTogXCJUcmVidWNoZXQgTVMsIG1vbm9zcGFjZSwgQ291cmllciBOZXcsIENvdXJpZXJcIixcblx0XHRcdFx0XHRpbmRleExhYmVsRm9udEZhbWlseTogaXNDYW52YXNTdXBwb3J0ZWQgPyBcIkNvdXJpZXIgTmV3LCBDb3VyaWVyLCBtb25vc3BhY2VcIiA6IFwiYXJpYWxcIixcblx0XHRcdFx0XHRpbmRleExhYmVsRm9udFdlaWdodDogXCJib2xkXCIsXG5cdFx0XHRcdFx0aW5kZXhMYWJlbEZvbnRTaXplOiAxOCxcblx0XHRcdFx0XHQvL2luZGV4TGFiZWxMaW5lQ29sb3I6IFwibGlnaHRncmV5XCIsXG5cdFx0XHRcdFx0aW5kZXhMYWJlbExpbmVUaGlja25lc3M6IDFcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0XCJ0aGVtZTNcIjoge1xuXHRcdFx0XHRDaGFydDpcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb2xvclNldDogXCJjb2xvclNldDFcIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFRpdGxlOiB7XG5cdFx0XHRcdFx0Zm9udEZhbWlseTogaXNDYW52YXNTdXBwb3J0ZWQgPyBcIkNhbmRhcmEsIE9wdGltYSwgVHJlYnVjaGV0IE1TLCBIZWx2ZXRpY2EgTmV1ZSwgSGVsdmV0aWNhLCBUcmVidWNoZXQgTVMsIHNlcmlmXCIgOiBcImNhbGlicmlcIixcblx0XHRcdFx0XHRmb250U2l6ZTogMzIsXG5cdFx0XHRcdFx0Zm9udENvbG9yOiBcIiMzQTNBM0FcIixcblx0XHRcdFx0XHRmb250V2VpZ2h0OiBcImJvbGRcIixcblx0XHRcdFx0XHR2ZXJ0aWNhbEFsaWduOiBcInRvcFwiLFxuXHRcdFx0XHRcdG1hcmdpbjogNVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRTdWJ0aXRsZToge1xuXHRcdFx0XHRcdGZvbnRGYW1pbHk6IGlzQ2FudmFzU3VwcG9ydGVkID8gXCJDYW5kYXJhLCBPcHRpbWEsIFRyZWJ1Y2hldCBNUywgSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYSwgVHJlYnVjaGV0IE1TLCBzZXJpZlwiIDogXCJjYWxpYnJpXCIsXG5cdFx0XHRcdFx0Zm9udFNpemU6IDE2LFxuXHRcdFx0XHRcdGZvbnRDb2xvcjogXCIjM0EzQTNBXCIsXG5cdFx0XHRcdFx0Zm9udFdlaWdodDogXCJib2xkXCIsXG5cdFx0XHRcdFx0dmVydGljYWxBbGlnbjogXCJ0b3BcIixcblx0XHRcdFx0XHRtYXJnaW46IDVcblx0XHRcdFx0fSxcblx0XHRcdFx0QXhpczoge1xuXHRcdFx0XHRcdHRpdGxlRm9udFNpemU6IDIyLFxuXHRcdFx0XHRcdHRpdGxlRm9udENvbG9yOiBcInJnYig5OCw5OCw5OClcIixcblx0XHRcdFx0XHQvL3RpdGxlRm9udEZhbWlseTogXCJhcmlhbCBibGFja1wiLFxuXHRcdFx0XHRcdHRpdGxlRm9udEZhbWlseTogaXNDYW52YXNTdXBwb3J0ZWQgPyBcIlZlcmRhbmEsIEdlbmV2YSwgQ2FsaWJyaSwgc2Fucy1zZXJpZlwiIDogXCJjYWxpYnJpXCIsXG5cdFx0XHRcdFx0Ly90aXRsZUZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuXG5cdFx0XHRcdFx0Ly9sYWJlbEZvbnRGYW1pbHk6IFwiVGltZXMgTmV3IFJvbWFuLCBUaW1lcywgc2VyaWZcIixcblx0XHRcdFx0XHRsYWJlbEZvbnRGYW1pbHk6IGlzQ2FudmFzU3VwcG9ydGVkID8gXCJDYWxpYnJpLCBPcHRpbWEsIENhbmRhcmEsIFZlcmRhbmEsIEdlbmV2YSwgc2Fucy1zZXJpZlwiIDogXCJjYWxpYnJpXCIsXG5cdFx0XHRcdFx0Ly9sYWJlbEZvbnRGYW1pbHk6IFwiSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYVwiLFxuXHRcdFx0XHRcdGxhYmVsRm9udFNpemU6IDE4LFxuXHRcdFx0XHRcdGxhYmVsRm9udENvbG9yOiBcImdyZXlcIixcblx0XHRcdFx0XHQvL2xhYmVsRm9udFdlaWdodDogXCJib2xkXCIsXG5cdFx0XHRcdFx0dGlja0NvbG9yOiBcImdyZXlcIixcblx0XHRcdFx0XHR0aWNrVGhpY2tuZXNzOiAyLFxuXHRcdFx0XHRcdGdyaWRUaGlja25lc3M6IDIsXG5cdFx0XHRcdFx0Z3JpZENvbG9yOiBcImdyZXlcIixcblx0XHRcdFx0XHRsaW5lVGhpY2tuZXNzOiAyLFxuXHRcdFx0XHRcdGxpbmVDb2xvcjogXCJncmV5XCJcblx0XHRcdFx0fSxcblx0XHRcdFx0TGVnZW5kOiB7XG5cdFx0XHRcdFx0dmVydGljYWxBbGlnbjogXCJib3R0b21cIixcblx0XHRcdFx0XHRob3Jpem9udGFsQWxpZ246IFwiY2VudGVyXCIsXG5cdFx0XHRcdFx0Zm9udEZhbWlseTogaXNDYW52YXNTdXBwb3J0ZWQgPyBcIm1vbm9zcGFjZSwgc2Fucy1zZXJpZixhcmlhbCBibGFja1wiIDogXCJjYWxpYnJpXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0RGF0YVNlcmllczoge1xuXHRcdFx0XHRcdGJldmVsRW5hYmxlZDogdHJ1ZSxcblx0XHRcdFx0XHRpbmRleExhYmVsRm9udENvbG9yOiBcImdyZXlcIixcblx0XHRcdFx0XHQvL2luZGV4TGFiZWxGb250RmFtaWx5OiBcIlRyZWJ1Y2hldCBNUywgbW9ub3NwYWNlLCBDb3VyaWVyIE5ldywgQ291cmllclwiLFxuXHRcdFx0XHRcdGluZGV4TGFiZWxGb250RmFtaWx5OiBpc0NhbnZhc1N1cHBvcnRlZCA/IFwiQ2FuZGFyYSwgT3B0aW1hLCBDYWxpYnJpLCBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWZcIiA6IFwiY2FsaWJyaVwiLFxuXHRcdFx0XHRcdC8vaW5kZXhMYWJlbEZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuXHRcdFx0XHRcdGluZGV4TGFiZWxGb250U2l6ZTogMTgsXG5cdFx0XHRcdFx0aW5kZXhMYWJlbExpbmVDb2xvcjogXCJsaWdodGdyZXlcIixcblx0XHRcdFx0XHRpbmRleExhYmVsTGluZVRoaWNrbmVzczogMlxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcbiIsIi8vI3JlZ2lvbiBBbmltYXRvclxuXG5pbXBvcnQgQW5pbWF0aW9uSGVscGVyIGZyb20gJy4uL2hlbHBlcnMvYW5pbWF0b3InO1xuXG5mdW5jdGlvbiBBbmltYXRvcihjaGFydCkge1xuXG4gIHRoaXMuY2hhcnQgPSBjaGFydDtcbiAgdGhpcy5jdHggPSB0aGlzLmNoYXJ0LnBsb3RBcmVhLmN0eDtcbiAgdGhpcy5hbmltYXRpb25zID0gW107XG4gIHRoaXMuYW5pbWF0aW9uUmVxdWVzdElkID0gbnVsbDtcbn1cblxuLy9BbmltYXRvci5wcm90b3R5cGUuYW5pbWF0ZSA9IGZ1bmN0aW9uIChkdXJhdGlvbiwgYmFzZSwgZGVzdCwgc291cmNlLCBhbmltYXRpb25DYWxsYmFjaywgb25Db21wbGV0ZSkge1xuQW5pbWF0b3IucHJvdG90eXBlLmFuaW1hdGUgPSBmdW5jdGlvbiAoc3RhcnREZWxheSwgZHVyYXRpb24sIGFuaW1hdGlvbkNhbGxiYWNrLCBvbkNvbXBsZXRlLCBlYXNpbmdGdW5jdGlvbikge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMuY2hhcnQuaXNBbmltYXRpbmcgPSB0cnVlO1xuICBlYXNpbmdGdW5jdGlvbiA9IGVhc2luZ0Z1bmN0aW9uIHx8IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcubGluZWFyO1xuXG4gIGlmIChhbmltYXRpb25DYWxsYmFjaykge1xuXG4gICAgdGhpcy5hbmltYXRpb25zLnB1c2goe1xuICAgICAgc3RhcnRUaW1lOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpICsgKHN0YXJ0RGVsYXkgPyBzdGFydERlbGF5IDogMCksXG4gICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICBhbmltYXRpb25DYWxsYmFjazogYW5pbWF0aW9uQ2FsbGJhY2ssXG4gICAgICBvbkNvbXBsZXRlOiBvbkNvbXBsZXRlXG4gICAgfSk7XG4gIH1cblxuICB2YXIgcmVtYWluaW5nQW5pbWF0aW9ucyA9IFtdO1xuXG4gIHdoaWxlICh0aGlzLmFuaW1hdGlvbnMubGVuZ3RoID4gMCkge1xuXG4gICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9ucy5zaGlmdCgpO1xuICAgIHZhciBub3cgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICAgIHZhciBmcmFjdGlvbkNvbXBsZXRlID0gMDtcbiAgICAvL3ZhciBmcmFjdGlvbkNvbXBsZXRlID0gTWF0aC5taW4oKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLSBhbmltYXRpb24uc3RhcnRUaW1lKSAvIGFuaW1hdGlvbi5kdXJhdGlvbiwgMSk7XG5cbiAgICBpZiAoYW5pbWF0aW9uLnN0YXJ0VGltZSA8PSBub3cpIHtcbiAgICAgIGZyYWN0aW9uQ29tcGxldGUgPSBlYXNpbmdGdW5jdGlvbihNYXRoLm1pbigobm93IC0gYW5pbWF0aW9uLnN0YXJ0VGltZSksIGFuaW1hdGlvbi5kdXJhdGlvbiksIDAsIDEsIGFuaW1hdGlvbi5kdXJhdGlvbik7XG4gICAgICAvL3ZhciBmcmFjdGlvbkNvbXBsZXRlID0gQW5pbWF0aW9uSGVscGVyLmVhc2luZy5lYXNlT3V0UXVhZChNYXRoLm1pbigoKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAtIGFuaW1hdGlvbi5zdGFydFRpbWUpLCBhbmltYXRpb24uZHVyYXRpb24pLCAwLCAxLCBhbmltYXRpb24uZHVyYXRpb24pO1xuXG4gICAgICBmcmFjdGlvbkNvbXBsZXRlID0gTWF0aC5taW4oZnJhY3Rpb25Db21wbGV0ZSwgMSk7XG5cbiAgICAgIGlmIChpc05hTihmcmFjdGlvbkNvbXBsZXRlKSB8fCAhaXNGaW5pdGUoZnJhY3Rpb25Db21wbGV0ZSkpXG4gICAgICAgIGZyYWN0aW9uQ29tcGxldGUgPSAxO1xuICAgIH1cblxuICAgIGlmIChmcmFjdGlvbkNvbXBsZXRlIDwgMSkge1xuICAgICAgcmVtYWluaW5nQW5pbWF0aW9ucy5wdXNoKGFuaW1hdGlvbik7XG4gICAgfVxuXG4gICAgYW5pbWF0aW9uLmFuaW1hdGlvbkNhbGxiYWNrKGZyYWN0aW9uQ29tcGxldGUpO1xuXG4gICAgaWYgKGZyYWN0aW9uQ29tcGxldGUgPj0gMSAmJiBhbmltYXRpb24ub25Db21wbGV0ZSlcbiAgICAgIGFuaW1hdGlvbi5vbkNvbXBsZXRlKCk7XG4gIH1cblxuICB0aGlzLmFuaW1hdGlvbnMgPSByZW1haW5pbmdBbmltYXRpb25zO1xuXG4gIGlmICh0aGlzLmFuaW1hdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIHRoaXMuYW5pbWF0aW9uUmVxdWVzdElkID0gdGhpcy5jaGFydC5yZXF1ZXN0QW5pbUZyYW1lLmNhbGwod2luZG93LCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5hbmltYXRlLmNhbGwoX3RoaXMpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuY2hhcnQuaXNBbmltYXRpbmcgPSBmYWxzZTtcbiAgfVxuXG59XG5cbkFuaW1hdG9yLnByb3RvdHlwZS5jYW5jZWxBbGxBbmltYXRpb25zID0gZnVuY3Rpb24gKCkge1xuXG4gIHRoaXMuYW5pbWF0aW9ucyA9IFtdO1xuXG4gIGlmICh0aGlzLmFuaW1hdGlvblJlcXVlc3RJZCkge1xuICAgIHRoaXMuY2hhcnQuY2FuY2VsUmVxdWVzdEFuaW1GcmFtZS5jYWxsKHdpbmRvdywgdGhpcy5hbmltYXRpb25SZXF1ZXN0SWQpO1xuICB9XG5cbiAgdGhpcy5hbmltYXRpb25SZXF1ZXN0SWQgPSBudWxsO1xuICB0aGlzLmNoYXJ0LmlzQW5pbWF0aW5nID0gZmFsc2U7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFuaW1hdG9yO1xuIiwiXG5pbXBvcnQgQ2FudmFzSlNPYmplY3QgZnJvbSAnLi9jYW52YXNqcyc7XG5pbXBvcnQgVGV4dEJsb2NrIGZyb20gJy4vdGV4dF9ibG9jayc7XG5pbXBvcnQge2V4dGVuZCwgbnVtYmVyRm9ybWF0LCBnZXRMaW5lRGFzaEFycmF5fSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZnVuY3Rpb24gQXhpcyhjaGFydCwgb3B0aW9ucywgdHlwZSwgcG9zaXRpb24pIHtcblxuXHRBeGlzLmJhc2UuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBcIkF4aXNcIiwgb3B0aW9ucywgY2hhcnQudGhlbWUpO1xuXG5cdHRoaXMuY2hhcnQgPSBjaGFydDtcblx0dGhpcy5jYW52YXMgPSBjaGFydC5jYW52YXM7XG5cdHRoaXMuY3R4ID0gY2hhcnQuY3R4O1xuXHR0aGlzLm1heFdpZHRoID0gMDtcblx0dGhpcy5tYXhIZWlnaHQgPSAwO1xuXHR0aGlzLmludGVydmFsU3RhcnRQb3NpdGlvbiA9IDA7XG5cdHRoaXMubGFiZWxzID0gW107XG5cdHRoaXMuX2xhYmVscyA9IG51bGw7XG5cblx0Ly9Qcm9jZXNzZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGEgdGhhdCBnZXRzIHBsb3R0ZWQgYWdhaW5zdCB0aGlzIGF4aXNcblx0dGhpcy5kYXRhSW5mbyA9IHtcblx0XHRtaW46IEluZmluaXR5LFxuXHRcdG1heDogLUluZmluaXR5LFxuXHRcdHZpZXdQb3J0TWluOiBJbmZpbml0eSxcblx0XHR2aWV3UG9ydE1heDogLUluZmluaXR5LFxuXHRcdG1pbkRpZmY6IEluZmluaXR5IC8vIFVzZWQgb25seSBpbiBjYXNlIG9mIGF4aXNYXG5cdH07XG5cblx0aWYgKHR5cGUgPT09IFwiYXhpc1hcIikge1xuXHRcdHRoaXMuc2Vzc2lvblZhcmlhYmxlcyA9IHRoaXMuY2hhcnQuc2Vzc2lvblZhcmlhYmxlc1t0eXBlXTtcblxuXHRcdGlmICghdGhpcy5fb3B0aW9ucy5pbnRlcnZhbClcblx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHRpZiAocG9zaXRpb24gPT09IFwibGVmdFwiIHx8IHBvc2l0aW9uID09PSBcInRvcFwiKVxuXHRcdFx0dGhpcy5zZXNzaW9uVmFyaWFibGVzID0gdGhpcy5jaGFydC5zZXNzaW9uVmFyaWFibGVzW1wiYXhpc1lcIl07XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnNlc3Npb25WYXJpYWJsZXMgPSB0aGlzLmNoYXJ0LnNlc3Npb25WYXJpYWJsZXNbXCJheGlzWTJcIl07XG5cdFx0fVxuXHR9XG5cblxuXG5cdGlmICh0eXBlb2YgKHRoaXMuX29wdGlvbnMudGl0bGVGb250U2l6ZSkgPT09IFwidW5kZWZpbmVkXCIpIHtcblxuXHRcdHRoaXMudGl0bGVGb250U2l6ZSA9IHRoaXMuY2hhcnQuZ2V0QXV0b0ZvbnRTaXplKHRoaXMudGl0bGVGb250U2l6ZSk7XG5cblx0XHQvL3dpbmRvdy5jb25zb2xlLmxvZyhcInRpdGxlRm9udFNpemU6IFwiICsgdGhpcy50aXRsZUZvbnRTaXplKTtcblx0fVxuXG5cdGlmICh0eXBlb2YgKHRoaXMuX29wdGlvbnMubGFiZWxGb250U2l6ZSkgPT09IFwidW5kZWZpbmVkXCIpIHtcblxuXHRcdHRoaXMubGFiZWxGb250U2l6ZSA9IHRoaXMuY2hhcnQuZ2V0QXV0b0ZvbnRTaXplKHRoaXMubGFiZWxGb250U2l6ZSk7XG5cblx0XHQvL3dpbmRvdy5jb25zb2xlLmxvZyhcImxhYmVsRm9udFNpemU6IFwiICsgdGhpcy5sYWJlbEZvbnRTaXplKTtcblxuXHR9XG5cblx0Ly9BeGlzIFR5cGUgOiBheGlzWCwgYXhpc1lcblx0dGhpcy50eXBlID0gdHlwZTtcblx0aWYgKHR5cGUgPT09IFwiYXhpc1hcIiAmJiAoIW9wdGlvbnMgfHwgdHlwZW9mIChvcHRpb25zLmdyaWRUaGlja25lc3MpID09PSBcInVuZGVmaW5lZFwiKSlcblx0XHR0aGlzLmdyaWRUaGlja25lc3MgPSAwO1xuXG5cdHRoaXMuX3Bvc2l0aW9uID0gcG9zaXRpb247XG5cblx0dGhpcy5saW5lQ29vcmRpbmF0ZXMgPSB7XG5cdFx0eDE6IG51bGwsIHkxOiBudWxsLCB4MjogbnVsbCwgeTI6IG51bGwsIHdpZHRoOiBudWxsXG5cdH07Ly97eDE6LCB5MTosIHgyOiwgeTI6LCB3aWR0aDp9XG5cdC8vXG5cdHtcblx0XHR0aGlzLmxhYmVsQW5nbGUgPSAoKHRoaXMubGFiZWxBbmdsZSAlIDM2MCkgKyAzNjApICUgMzYwO1xuXG5cdFx0aWYgKHRoaXMubGFiZWxBbmdsZSA+IDkwICYmIHRoaXMubGFiZWxBbmdsZSA8PSAyNzApXG5cdFx0XHR0aGlzLmxhYmVsQW5nbGUgLT0gMTgwO1xuXHRcdGVsc2UgaWYgKHRoaXMubGFiZWxBbmdsZSA+IDE4MCAmJiB0aGlzLmxhYmVsQW5nbGUgPD0gMjcwKVxuXHRcdFx0dGhpcy5sYWJlbEFuZ2xlIC09IDE4MFxuXHRcdGVsc2UgaWYgKHRoaXMubGFiZWxBbmdsZSA+IDI3MCAmJiB0aGlzLmxhYmVsQW5nbGUgPD0gMzYwKVxuXHRcdFx0dGhpcy5sYWJlbEFuZ2xlIC09IDM2MFxuXHR9XG5cblx0aWYgKHRoaXMuX29wdGlvbnMuc3RyaXBMaW5lcyAmJiB0aGlzLl9vcHRpb25zLnN0cmlwTGluZXMubGVuZ3RoID4gMCkge1xuXG5cdFx0dGhpcy5zdHJpcExpbmVzID0gW107XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX29wdGlvbnMuc3RyaXBMaW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dGhpcy5zdHJpcExpbmVzLnB1c2gobmV3IFN0cmlwTGluZSh0aGlzLmNoYXJ0LCB0aGlzLl9vcHRpb25zLnN0cmlwTGluZXNbaV0sIGNoYXJ0LnRoZW1lLCArK3RoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5sYXN0T2JqZWN0SWQsIHRoaXMpKTtcblx0XHR9XG5cdH1cblxuXHR0aGlzLl90aXRsZVRleHRCbG9jayA9IG51bGw7XG5cblx0aWYgKCF0aGlzLmhhc09wdGlvbkNoYW5nZWQoXCJ2aWV3cG9ydE1pbmltdW1cIikgJiYgIWlzTmFOKHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5uZXdWaWV3cG9ydE1pbmltdW0pICYmIHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5uZXdWaWV3cG9ydE1pbmltdW0gIT09IG51bGwpXG5cdFx0dGhpcy52aWV3cG9ydE1pbmltdW0gPSB0aGlzLnNlc3Npb25WYXJpYWJsZXMubmV3Vmlld3BvcnRNaW5pbXVtO1xuXHRlbHNlXG5cdFx0dGhpcy5zZXNzaW9uVmFyaWFibGVzLm5ld1ZpZXdwb3J0TWluaW11bSA9IG51bGw7XG5cblx0aWYgKCF0aGlzLmhhc09wdGlvbkNoYW5nZWQoXCJ2aWV3cG9ydE1heGltdW1cIikgJiYgIWlzTmFOKHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5uZXdWaWV3cG9ydE1heGltdW0pICYmIHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5uZXdWaWV3cG9ydE1heGltdW0gIT09IG51bGwpXG5cdFx0dGhpcy52aWV3cG9ydE1heGltdW0gPSB0aGlzLnNlc3Npb25WYXJpYWJsZXMubmV3Vmlld3BvcnRNYXhpbXVtO1xuXHRlbHNlXG5cdFx0dGhpcy5zZXNzaW9uVmFyaWFibGVzLm5ld1ZpZXdwb3J0TWF4aW11bSA9IG51bGw7XG5cblx0aWYgKHRoaXMubWluaW11bSAhPT0gbnVsbCAmJiB0aGlzLnZpZXdwb3J0TWluaW11bSAhPT0gbnVsbClcblx0XHR0aGlzLnZpZXdwb3J0TWluaW11bSA9IE1hdGgubWF4KHRoaXMudmlld3BvcnRNaW5pbXVtLCB0aGlzLm1pbmltdW0pO1xuXG5cdGlmICh0aGlzLm1heGltdW0gIT09IG51bGwgJiYgdGhpcy52aWV3cG9ydE1heGltdW0gIT09IG51bGwpXG5cdFx0dGhpcy52aWV3cG9ydE1heGltdW0gPSBNYXRoLm1pbih0aGlzLnZpZXdwb3J0TWF4aW11bSwgdGhpcy5tYXhpbXVtKTtcblxuXHR0aGlzLnRyYWNrQ2hhbmdlcyhcInZpZXdwb3J0TWluaW11bVwiKTtcblx0dGhpcy50cmFja0NoYW5nZXMoXCJ2aWV3cG9ydE1heGltdW1cIik7XG59XG5cbmV4dGVuZChBeGlzLCBDYW52YXNKU09iamVjdCk7XG5cbkF4aXMucHJvdG90eXBlLmNyZWF0ZUxhYmVscyA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdGV4dEJsb2NrO1xuXHR2YXIgaSA9IDA7XG5cdHZhciBlbmRQb2ludDtcblxuXHR2YXIgbGFiZWxNYXhXaWR0aCA9IDA7XG5cdHZhciBsYWJlbE1heEhlaWdodCA9IDA7XG5cdHZhciBpbnRlcnZhbEluUGl4ZWxzID0gMDtcblxuXHQvL3ZhciBpbnRlcnZhbEluUGl4ZWxzID0gdGhpcy5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiB0aGlzLmludGVydmFsO1xuXG5cblx0aWYgKHRoaXMuX3Bvc2l0aW9uID09PSBcImJvdHRvbVwiIHx8IHRoaXMuX3Bvc2l0aW9uID09PSBcInRvcFwiKSB7XG5cdFx0aW50ZXJ2YWxJblBpeGVscyA9IHRoaXMubGluZUNvb3JkaW5hdGVzLndpZHRoIC8gTWF0aC5hYnModGhpcy52aWV3cG9ydE1heGltdW0gLSB0aGlzLnZpZXdwb3J0TWluaW11bSkgKiB0aGlzLmludGVydmFsO1xuXG5cdFx0aWYgKHRoaXMubGFiZWxBdXRvRml0KSB7XG5cdFx0XHRsYWJlbE1heFdpZHRoID0gdHlwZW9mICh0aGlzLl9vcHRpb25zLmxhYmVsTWF4V2lkdGgpID09PSBcInVuZGVmaW5lZFwiID8gaW50ZXJ2YWxJblBpeGVscyAqIC45ID4+IDAgOiB0aGlzLmxhYmVsTWF4V2lkdGg7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0bGFiZWxNYXhXaWR0aCA9IHR5cGVvZiAodGhpcy5fb3B0aW9ucy5sYWJlbE1heFdpZHRoKSA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMuY2hhcnQud2lkdGggKiAuNyA+PiAwIDogdGhpcy5sYWJlbE1heFdpZHRoO1xuXHRcdH1cblxuXHRcdGxhYmVsTWF4SGVpZ2h0ID0gdHlwZW9mICh0aGlzLl9vcHRpb25zLmxhYmVsV3JhcCkgPT09IFwidW5kZWZpbmVkXCIgfHwgdGhpcy5sYWJlbFdyYXAgPyB0aGlzLmNoYXJ0LmhlaWdodCAqIC41ID4+IDAgOiB0aGlzLmxhYmVsRm9udFNpemUgKiAxLjU7XG5cdH1cblx0ZWxzZSBpZiAodGhpcy5fcG9zaXRpb24gPT09IFwibGVmdFwiIHx8IHRoaXMuX3Bvc2l0aW9uID09PSBcInJpZ2h0XCIpIHtcblxuXHRcdGludGVydmFsSW5QaXhlbHMgPSB0aGlzLmxpbmVDb29yZGluYXRlcy5oZWlnaHQgLyBNYXRoLmFicyh0aGlzLnZpZXdwb3J0TWF4aW11bSAtIHRoaXMudmlld3BvcnRNaW5pbXVtKSAqIHRoaXMuaW50ZXJ2YWw7XG5cblxuXHRcdGlmICh0aGlzLmxhYmVsQXV0b0ZpdCkge1xuXHRcdFx0bGFiZWxNYXhXaWR0aCA9IHR5cGVvZiAodGhpcy5fb3B0aW9ucy5sYWJlbE1heFdpZHRoKSA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMuY2hhcnQud2lkdGggKiAuMyA+PiAwIDogdGhpcy5sYWJlbE1heFdpZHRoO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGxhYmVsTWF4V2lkdGggPSB0eXBlb2YgKHRoaXMuX29wdGlvbnMubGFiZWxNYXhXaWR0aCkgPT09IFwidW5kZWZpbmVkXCIgPyB0aGlzLmNoYXJ0LndpZHRoICogLjUgPj4gMCA6IHRoaXMubGFiZWxNYXhXaWR0aDtcblx0XHR9XG5cblx0XHRsYWJlbE1heEhlaWdodCA9IHR5cGVvZiAodGhpcy5fb3B0aW9ucy5sYWJlbFdyYXApID09PSBcInVuZGVmaW5lZFwiIHx8IHRoaXMubGFiZWxXcmFwID8gaW50ZXJ2YWxJblBpeGVscyAqIDIgPj4gMCA6IHRoaXMubGFiZWxGb250U2l6ZSAqIDEuNTtcblx0fVxuXG5cdGlmICh0aGlzLnR5cGUgPT09IFwiYXhpc1hcIiAmJiB0aGlzLmNoYXJ0LnBsb3RJbmZvLmF4aXNYVmFsdWVUeXBlID09PSBcImRhdGVUaW1lXCIpIHtcblx0XHRlbmRQb2ludCA9IGFkZFRvRGF0ZVRpbWUobmV3IERhdGUodGhpcy52aWV3cG9ydE1heGltdW0pLCB0aGlzLmludGVydmFsLCB0aGlzLmludGVydmFsVHlwZSlcblx0XHQvL2VuZFBvaW50ID0gdGhpcy52aWV3cG9ydE1heGltdW07XG5cblx0XHRmb3IgKGkgPSB0aGlzLmludGVydmFsU3RhcnRQb3NpdGlvbjsgaSA8IGVuZFBvaW50OyBhZGRUb0RhdGVUaW1lKGksIHRoaXMuaW50ZXJ2YWwsIHRoaXMuaW50ZXJ2YWxUeXBlKSkge1xuXG5cdFx0XHQvL3ZhciB0ZXh0ID0gZGF0ZUZvcm1hdChpLCB0aGlzLnZhbHVlRm9ybWF0U3RyaW5nKTtcblx0XHRcdHZhciB0aW1lSW5NaWxsaXNlY29uZHMgPSBpLmdldFRpbWUoKTtcblx0XHRcdHZhciB0ZXh0ID0gdGhpcy5sYWJlbEZvcm1hdHRlciA/IHRoaXMubGFiZWxGb3JtYXR0ZXIoeyBjaGFydDogdGhpcy5jaGFydCwgYXhpczogdGhpcy5fb3B0aW9ucywgdmFsdWU6IGksIGxhYmVsOiB0aGlzLmxhYmVsc1tpXSA/IHRoaXMubGFiZWxzW2ldIDogbnVsbCB9KVxuXHRcdFx0XHQ6IHRoaXMudHlwZSA9PT0gXCJheGlzWFwiICYmIHRoaXMubGFiZWxzW3RpbWVJbk1pbGxpc2Vjb25kc10gPyB0aGlzLmxhYmVsc1t0aW1lSW5NaWxsaXNlY29uZHNdIDogZGF0ZUZvcm1hdChpLCB0aGlzLnZhbHVlRm9ybWF0U3RyaW5nLCB0aGlzLmNoYXJ0Ll9jdWx0dXJlSW5mbyk7XG5cblx0XHRcdHRleHRCbG9jayA9IG5ldyBUZXh0QmxvY2sodGhpcy5jdHgsIHtcblx0XHRcdFx0eDogMCxcblx0XHRcdFx0eTogMCxcblx0XHRcdFx0Ly9tYXhXaWR0aDogdGhpcy5tYXhIZWlnaHQsXG5cdFx0XHRcdC8vbWF4SGVpZ2h0OiB0aGlzLmxhYmVsRm9udFNpemUsXG5cdFx0XHRcdG1heFdpZHRoOiBsYWJlbE1heFdpZHRoLFxuXHRcdFx0XHRtYXhIZWlnaHQ6IGxhYmVsTWF4SGVpZ2h0LFxuXHRcdFx0XHRhbmdsZTogdGhpcy5sYWJlbEFuZ2xlLFxuXHRcdFx0XHR0ZXh0OiB0aGlzLnByZWZpeCArIHRleHQgKyB0aGlzLnN1ZmZpeCxcblx0XHRcdFx0aG9yaXpvbnRhbEFsaWduOiBcImxlZnRcIiwvL2xlZnQsIGNlbnRlciwgcmlnaHRcblx0XHRcdFx0Zm9udFNpemU6IHRoaXMubGFiZWxGb250U2l6ZSwvL2luIHBpeGVsc1xuXHRcdFx0XHRmb250RmFtaWx5OiB0aGlzLmxhYmVsRm9udEZhbWlseSxcblx0XHRcdFx0Zm9udFdlaWdodDogdGhpcy5sYWJlbEZvbnRXZWlnaHQsIC8vbm9ybWFsLCBib2xkLCBib2xkZXIsIGxpZ2h0ZXIsXG5cdFx0XHRcdGZvbnRDb2xvcjogdGhpcy5sYWJlbEZvbnRDb2xvcixcblx0XHRcdFx0Zm9udFN0eWxlOiB0aGlzLmxhYmVsRm9udFN0eWxlLCAvLyBub3JtYWwsIGl0YWxpYywgb2JsaXF1ZVxuXHRcdFx0XHR0ZXh0QmFzZWxpbmU6IFwibWlkZGxlXCJcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLl9sYWJlbHMucHVzaCh7IHBvc2l0aW9uOiBpLmdldFRpbWUoKSwgdGV4dEJsb2NrOiB0ZXh0QmxvY2ssIGVmZmVjdGl2ZUhlaWdodDogbnVsbCB9KTtcblx0XHR9XG5cblx0fVxuXHRlbHNlIHtcblx0XHRlbmRQb2ludCA9IHRoaXMudmlld3BvcnRNYXhpbXVtO1xuXG5cdFx0Ly9pZiAoKE1hdGguZmxvb3IodGhpcy5pbnRlcnZhbCkgPCB0aGlzLmludGVydmFsICYmICF0aGlzLl9vcHRpb25zLmludGVydmFsKSB8fCB0cnVlKSB7XG5cblx0XHQvL0NoZWNrIGlmIGl0IHNob3VsZCBiZSByZW5kZXJlZCBhcyBhIGNhdGVnb3J5IGF4aXMuIElmIHllcywgdGhlbiBjZWlsIHRoZSBpbnRlcnZhbFxuXHRcdGlmICh0aGlzLmxhYmVscyAmJiB0aGlzLmxhYmVscy5sZW5ndGgpIHtcblx0XHRcdHZhciB0ZW1wSW50ZXJ2YWwgPSBNYXRoLmNlaWwodGhpcy5pbnRlcnZhbCk7XG5cdFx0XHR2YXIgdGVtcFN0YXJ0UG9pbnQgPSBNYXRoLmNlaWwodGhpcy5pbnRlcnZhbFN0YXJ0UG9zaXRpb24pO1xuXHRcdFx0dmFyIGhhc0FsbExhYmVscyA9IGZhbHNlO1xuXHRcdFx0Zm9yIChpID0gdGVtcFN0YXJ0UG9pbnQ7IGkgPCB0aGlzLnZpZXdwb3J0TWF4aW11bTsgaSArPSB0ZW1wSW50ZXJ2YWwpIHtcblx0XHRcdFx0aWYgKHRoaXMubGFiZWxzW2ldKSB7XG5cdFx0XHRcdFx0aGFzQWxsTGFiZWxzID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRoYXNBbGxMYWJlbHMgPSBmYWxzZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaGFzQWxsTGFiZWxzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSB0ZW1wSW50ZXJ2YWw7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxTdGFydFBvc2l0aW9uID0gdGVtcFN0YXJ0UG9pbnQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly9wYXJzZUZsb2F0ICYgdG9QcmVjaXNpb24gYXJlIGJlaW5nIHVzZWQgdG8gYXZvaWQgaXNzdWVzIHJlbGF0ZWQgdG8gcHJlY2lzaW9uLlxuXHRcdGZvciAoaSA9IHRoaXMuaW50ZXJ2YWxTdGFydFBvc2l0aW9uOyBpIDw9IGVuZFBvaW50OyBpID0gcGFyc2VGbG9hdCgoaSArIHRoaXMuaW50ZXJ2YWwpLnRvRml4ZWQoMTQpKSkge1xuXG5cdFx0XHR2YXIgdGV4dCA9IHRoaXMubGFiZWxGb3JtYXR0ZXIgPyB0aGlzLmxhYmVsRm9ybWF0dGVyKHsgY2hhcnQ6IHRoaXMuY2hhcnQsIGF4aXM6IHRoaXMuX29wdGlvbnMsIHZhbHVlOiBpLCBsYWJlbDogdGhpcy5sYWJlbHNbaV0gPyB0aGlzLmxhYmVsc1tpXSA6IG51bGwgfSlcblx0XHRcdFx0OiB0aGlzLnR5cGUgPT09IFwiYXhpc1hcIiAmJiB0aGlzLmxhYmVsc1tpXSA/IHRoaXMubGFiZWxzW2ldIDogbnVtYmVyRm9ybWF0KGksIHRoaXMudmFsdWVGb3JtYXRTdHJpbmcsIHRoaXMuY2hhcnQuX2N1bHR1cmVJbmZvKTtcblxuXHRcdFx0dGV4dEJsb2NrID0gbmV3IFRleHRCbG9jayh0aGlzLmN0eCwge1xuXHRcdFx0XHR4OiAwLFxuXHRcdFx0XHR5OiAwLFxuXHRcdFx0XHQvL21heFdpZHRoOiB0aGlzLm1heEhlaWdodCxcblx0XHRcdFx0Ly9tYXhIZWlnaHQ6IHRoaXMubGFiZWxGb250U2l6ZSxcblx0XHRcdFx0bWF4V2lkdGg6IGxhYmVsTWF4V2lkdGgsXG5cdFx0XHRcdG1heEhlaWdodDogbGFiZWxNYXhIZWlnaHQsXG5cdFx0XHRcdGFuZ2xlOiB0aGlzLmxhYmVsQW5nbGUsXG5cdFx0XHRcdHRleHQ6IHRoaXMucHJlZml4ICsgdGV4dCArIHRoaXMuc3VmZml4LFxuXHRcdFx0XHRob3Jpem9udGFsQWxpZ246IFwibGVmdFwiLC8vbGVmdCwgY2VudGVyLCByaWdodFxuXHRcdFx0XHRmb250U2l6ZTogdGhpcy5sYWJlbEZvbnRTaXplLC8vaW4gcGl4ZWxzXG5cdFx0XHRcdGZvbnRGYW1pbHk6IHRoaXMubGFiZWxGb250RmFtaWx5LFxuXHRcdFx0XHRmb250V2VpZ2h0OiB0aGlzLmxhYmVsRm9udFdlaWdodCwgLy9ub3JtYWwsIGJvbGQsIGJvbGRlciwgbGlnaHRlcixcblx0XHRcdFx0Zm9udENvbG9yOiB0aGlzLmxhYmVsRm9udENvbG9yLFxuXHRcdFx0XHRmb250U3R5bGU6IHRoaXMubGFiZWxGb250U3R5bGUsIC8vIG5vcm1hbCwgaXRhbGljLCBvYmxpcXVlXG5cdFx0XHRcdHRleHRCYXNlbGluZTogXCJtaWRkbGVcIixcblx0XHRcdFx0Ym9yZGVyVGhpY2tuZXNzOiAwXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5fbGFiZWxzLnB1c2goeyBwb3NpdGlvbjogaSwgdGV4dEJsb2NrOiB0ZXh0QmxvY2ssIGVmZmVjdGl2ZUhlaWdodDogbnVsbCB9KTtcblx0XHR9XG5cdH1cblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3RyaXBMaW5lcy5sZW5ndGg7IGkrKykge1xuXG5cdFx0dmFyIHN0cmlwTGluZSA9IHRoaXMuc3RyaXBMaW5lc1tpXTtcblxuXHRcdHRleHRCbG9jayA9IG5ldyBUZXh0QmxvY2sodGhpcy5jdHgsIHtcblx0XHRcdHg6IDAsXG5cdFx0XHR5OiAwLFxuXHRcdFx0Ly9tYXhXaWR0aDogdGhpcy5tYXhIZWlnaHQsXG5cdFx0XHQvL21heEhlaWdodDogdGhpcy5sYWJlbEZvbnRTaXplLFxuXHRcdFx0YmFja2dyb3VuZENvbG9yOiBzdHJpcExpbmUubGFiZWxCYWNrZ3JvdW5kQ29sb3IsXG5cdFx0XHRtYXhXaWR0aDogbGFiZWxNYXhXaWR0aCxcblx0XHRcdG1heEhlaWdodDogbGFiZWxNYXhIZWlnaHQsXG5cdFx0XHRhbmdsZTogdGhpcy5sYWJlbEFuZ2xlLFxuXHRcdFx0dGV4dDogc3RyaXBMaW5lLmxhYmVsRm9ybWF0dGVyID8gc3RyaXBMaW5lLmxhYmVsRm9ybWF0dGVyKHsgY2hhcnQ6IHRoaXMuY2hhcnQsIGF4aXM6IHRoaXMsIHN0cmlwTGluZTogc3RyaXBMaW5lIH0pIDogc3RyaXBMaW5lLmxhYmVsLFxuXHRcdFx0aG9yaXpvbnRhbEFsaWduOiBcImxlZnRcIiwvL2xlZnQsIGNlbnRlciwgcmlnaHRcblx0XHRcdGZvbnRTaXplOiBzdHJpcExpbmUubGFiZWxGb250U2l6ZSwvL2luIHBpeGVsc1xuXHRcdFx0Zm9udEZhbWlseTogc3RyaXBMaW5lLmxhYmVsRm9udEZhbWlseSxcblx0XHRcdGZvbnRXZWlnaHQ6IHN0cmlwTGluZS5sYWJlbEZvbnRXZWlnaHQsIC8vbm9ybWFsLCBib2xkLCBib2xkZXIsIGxpZ2h0ZXIsXG5cdFx0XHRmb250Q29sb3I6IHN0cmlwTGluZS5fb3B0aW9ucy5sYWJlbEZvbnRDb2xvciB8fCBzdHJpcExpbmUuY29sb3IsXG5cdFx0XHRmb250U3R5bGU6IHN0cmlwTGluZS5sYWJlbEZvbnRTdHlsZSwgLy8gbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcblx0XHRcdHRleHRCYXNlbGluZTogXCJtaWRkbGVcIixcblx0XHRcdGJvcmRlclRoaWNrbmVzczogMFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fbGFiZWxzLnB1c2goeyBwb3NpdGlvbjogc3RyaXBMaW5lLnZhbHVlLCB0ZXh0QmxvY2s6IHRleHRCbG9jaywgZWZmZWN0aXZlSGVpZ2h0OiBudWxsLCBzdHJpcExpbmU6IHN0cmlwTGluZSB9KTtcblx0fVxuXG59XG5cbkF4aXMucHJvdG90eXBlLmNyZWF0ZUxhYmVsc0FuZENhbGN1bGF0ZVdpZHRoID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBtYXhMYWJlbEVmZmVjdGl2ZVdpZHRoID0gMDtcblx0dGhpcy5fbGFiZWxzID0gW107XG5cblx0aWYgKHRoaXMuX3Bvc2l0aW9uID09PSBcImxlZnRcIiB8fCB0aGlzLl9wb3NpdGlvbiA9PT0gXCJyaWdodFwiKSB7XG5cblx0XHR0aGlzLmNyZWF0ZUxhYmVscygpO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9sYWJlbHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0dmFyIHRleHRCbG9jayA9IHRoaXMuX2xhYmVsc1tpXS50ZXh0QmxvY2s7XG5cblx0XHRcdHZhciBzaXplID0gdGV4dEJsb2NrLm1lYXN1cmVUZXh0KCk7XG5cblx0XHRcdC8vdmFyIGh5cG90ZW51c2UgPSBNYXRoLnNxcnQoTWF0aC5wb3coc2l6ZS5oZWlnaHQgLyAyLCAyKSArIE1hdGgucG93KHNpemUud2lkdGgsIDIpKTtcblx0XHRcdC8vbGFiZWxFZmZlY3RpdmVXaWR0aCA9IGh5cG90ZW51c2UgKiBNYXRoLmNvcyhNYXRoLmFicyhNYXRoLlBJIC8gMTgwICogdGhpcy5sYWJlbEFuZ2xlKSAtIE1hdGguYWJzKE1hdGguYWNvcyhzaXplLndpZHRoIC8gaHlwb3RlbnVzZSkpKTtcblxuXHRcdFx0dmFyIGxhYmVsRWZmZWN0aXZlV2lkdGggPSAwO1xuXG5cdFx0XHRpZiAodGhpcy5sYWJlbEFuZ2xlID09PSAwKVxuXHRcdFx0XHRsYWJlbEVmZmVjdGl2ZVdpZHRoID0gc2l6ZS53aWR0aDtcblx0XHRcdGVsc2Vcblx0XHRcdFx0bGFiZWxFZmZlY3RpdmVXaWR0aCA9IChzaXplLndpZHRoICogTWF0aC5jb3MoTWF0aC5QSSAvIDE4MCAqIE1hdGguYWJzKHRoaXMubGFiZWxBbmdsZSkpKSArIChzaXplLmhlaWdodCAvIDIgKiBNYXRoLnNpbihNYXRoLlBJIC8gMTgwICogTWF0aC5hYnModGhpcy5sYWJlbEFuZ2xlKSkpO1xuXG5cblx0XHRcdGlmIChtYXhMYWJlbEVmZmVjdGl2ZVdpZHRoIDwgbGFiZWxFZmZlY3RpdmVXaWR0aClcblx0XHRcdFx0bWF4TGFiZWxFZmZlY3RpdmVXaWR0aCA9IGxhYmVsRWZmZWN0aXZlV2lkdGg7XG5cblx0XHRcdHRoaXMuX2xhYmVsc1tpXS5lZmZlY3RpdmVXaWR0aCA9IGxhYmVsRWZmZWN0aXZlV2lkdGg7XG5cdFx0fVxuXHR9XG5cblxuXG5cdHZhciB0aXRsZUhlaWdodCA9IHRoaXMudGl0bGUgPyBnZXRGb250SGVpZ2h0SW5QaXhlbHModGhpcy50aXRsZUZvbnRGYW1pbHksIHRoaXMudGl0bGVGb250U2l6ZSwgdGhpcy50aXRsZUZvbnRXZWlnaHQpICsgMiA6IDA7XG5cblx0dmFyIGF4aXNXaWR0aCA9IHRpdGxlSGVpZ2h0ICsgbWF4TGFiZWxFZmZlY3RpdmVXaWR0aCArIHRoaXMudGlja0xlbmd0aCArIDU7XG5cblx0Ly9pZiAoaXNEZWJ1Z01vZGUgJiYgd2luZG93LmNvbnNvbGUpIHtcblx0Ly9cdHdpbmRvdy5jb25zb2xlLmxvZyh0aGlzLnR5cGUgKyBcIi0tLSBheGlzV2lkdGg6IFwiICsgYXhpc1dpZHRoKTtcblx0Ly99XG5cblx0cmV0dXJuIGF4aXNXaWR0aDtcbn1cblxuQXhpcy5wcm90b3R5cGUuY3JlYXRlTGFiZWxzQW5kQ2FsY3VsYXRlSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgbWF4TGFiZWxFZmZlY3RpdmVIZWlnaHQgPSAwO1xuXHR0aGlzLl9sYWJlbHMgPSBbXTtcblx0dmFyIHRleHRCbG9jaztcblx0dmFyIGkgPSAwO1xuXG5cdHRoaXMuY3JlYXRlTGFiZWxzKCk7XG5cblx0aWYgKHRoaXMuX3Bvc2l0aW9uID09PSBcImJvdHRvbVwiIHx8IHRoaXMuX3Bvc2l0aW9uID09PSBcInRvcFwiKSB7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5fbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdHRleHRCbG9jayA9IHRoaXMuX2xhYmVsc1tpXS50ZXh0QmxvY2s7XG5cblx0XHRcdHZhciBzaXplID0gdGV4dEJsb2NrLm1lYXN1cmVUZXh0KCk7XG5cdFx0XHQvL3ZhciBkaWFnb25hbCA9IE1hdGguc3FydChNYXRoLnBvdyhzaXplLmhlaWdodCwgMikgKyBNYXRoLnBvdyhzaXplLndpZHRoLCAyKSk7XG5cblx0XHRcdC8vdmFyIGh5cG90ZW51c2UgPSBNYXRoLnNxcnQoTWF0aC5wb3coc2l6ZS5oZWlnaHQgLyAyLCAyKSArIE1hdGgucG93KHNpemUud2lkdGgsIDIpKTtcblx0XHRcdC8vdmFyIGxhYmVsRWZmZWN0aXZlSGVpZ2h0ID0gaHlwb3RlbnVzZSAqIE1hdGguY29zKE1hdGguUEkgLyAyIC0gKE1hdGguYWJzKE1hdGguUEkgLyAxODAgKiB0aGlzLmxhYmVsQW5nbGUpICsgTWF0aC5hYnMoTWF0aC5hY29zKHNpemUud2lkdGggLyBoeXBvdGVudXNlKSkpKTtcblxuXHRcdFx0dmFyIGxhYmVsRWZmZWN0aXZlSGVpZ2h0ID0gMDtcblxuXHRcdFx0aWYgKHRoaXMubGFiZWxBbmdsZSA9PT0gMClcblx0XHRcdFx0bGFiZWxFZmZlY3RpdmVIZWlnaHQgPSBzaXplLmhlaWdodDtcblx0XHRcdGVsc2Vcblx0XHRcdFx0bGFiZWxFZmZlY3RpdmVIZWlnaHQgPSAoc2l6ZS53aWR0aCAqIE1hdGguc2luKE1hdGguUEkgLyAxODAgKiBNYXRoLmFicyh0aGlzLmxhYmVsQW5nbGUpKSkgKyAoc2l6ZS5oZWlnaHQgLyAyICogTWF0aC5jb3MoTWF0aC5QSSAvIDE4MCAqIE1hdGguYWJzKHRoaXMubGFiZWxBbmdsZSkpKTtcblxuXHRcdFx0aWYgKG1heExhYmVsRWZmZWN0aXZlSGVpZ2h0IDwgbGFiZWxFZmZlY3RpdmVIZWlnaHQpXG5cdFx0XHRcdG1heExhYmVsRWZmZWN0aXZlSGVpZ2h0ID0gbGFiZWxFZmZlY3RpdmVIZWlnaHQ7XG5cblx0XHRcdHRoaXMuX2xhYmVsc1tpXS5lZmZlY3RpdmVIZWlnaHQgPSBsYWJlbEVmZmVjdGl2ZUhlaWdodDtcblx0XHR9XG5cdH1cblxuXHQvL3ZhciB0aXRsZUhlaWdodCA9IHRoaXMudGl0bGUgPyB0aGlzLnRpdGxlRm9udFNpemUgKyA1IDogMDtcblx0dmFyIHRpdGxlSGVpZ2h0ID0gdGhpcy50aXRsZSA/IGdldEZvbnRIZWlnaHRJblBpeGVscyh0aGlzLnRpdGxlRm9udEZhbWlseSwgdGhpcy50aXRsZUZvbnRTaXplLCB0aGlzLnRpdGxlRm9udFdlaWdodCkgKyAyIDogMDtcblxuXHRyZXR1cm4gdGl0bGVIZWlnaHQgKyBtYXhMYWJlbEVmZmVjdGl2ZUhlaWdodCArIHRoaXMudGlja0xlbmd0aCArIDU7XG59XG5cbi8vU3RhdGljIE1ldGhvZCB0aGF0IGNvLW9yZGluYXRlcyBiZXR3ZWVuIGF4aXNYLCBheGlzWSBhbmQgcmVuZGVycyB0aGVtXG5BeGlzLnNldExheW91dEFuZFJlbmRlciA9IGZ1bmN0aW9uIChheGlzWCwgYXhpc1ksIGF4aXNZMiwgYXhpc1BsYWNlbWVudCwgZnJlZVNwYWNlKSB7XG5cdHZhciB4MSwgeTEsIHgyLCB5Mjtcblx0dmFyIGNoYXJ0ID0gYXhpc1guY2hhcnQ7XG5cdHZhciBjdHggPSBjaGFydC5jdHg7XG5cblx0YXhpc1guY2FsY3VsYXRlQXhpc1BhcmFtZXRlcnMoKTtcblxuXHRpZiAoYXhpc1kpXG5cdFx0YXhpc1kuY2FsY3VsYXRlQXhpc1BhcmFtZXRlcnMoKTtcblxuXHRpZiAoYXhpc1kyKVxuXHRcdGF4aXNZMi5jYWxjdWxhdGVBeGlzUGFyYW1ldGVycygpO1xuXG5cdC8vaWYgKGF4aXNZICYmIGF4aXNZMiAmJiB0eXBlb2YgKGF4aXNZLl9vcHRpb25zLnZpZXdwb3J0TWF4aW11bSkgPT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIChheGlzWS5fb3B0aW9ucy52aWV3cG9ydE1pbmltdW0pID09PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiAoYXhpc1kuX29wdGlvbnMuaW50ZXJ2YWwpID09PSBcInVuZGVmaW5lZFwiXG5cdC8vXHRcdCYmIHR5cGVvZiAoYXhpc1kyLl9vcHRpb25zLnZpZXdwb3J0TWF4aW11bSkgPT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIChheGlzWTIuX29wdGlvbnMudmlld3BvcnRNaW5pbXVtKSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgKGF4aXNZMi5fb3B0aW9ucy5pbnRlcnZhbCkgPT09IFwidW5kZWZpbmVkXCIpIHtcblxuXHQvL1x0dmFyIG5vVGlja3NZID0gKGF4aXNZLnZpZXdwb3J0TWF4aW11bSAtIGF4aXNZLnZpZXdwb3J0TWluaW11bSkgLyBheGlzWS5pbnRlcnZhbDtcblxuXHQvL1x0dmFyIG5vVGlja3NZMiA9IChheGlzWTIudmlld3BvcnRNYXhpbXVtIC0gYXhpc1kyLnZpZXdwb3J0TWluaW11bSkgLyBheGlzWTIuaW50ZXJ2YWw7XG5cblx0Ly9cdGlmIChub1RpY2tzWSA+IG5vVGlja3NZMikge1xuXHQvL1x0XHRheGlzWTIudmlld3BvcnRNYXhpbXVtID0gYXhpc1kyLmludGVydmFsICogbm9UaWNrc1kgKyBheGlzWTIudmlld3BvcnRNaW5pbXVtO1xuXHQvL1x0fSBlbHNlIGlmIChub1RpY2tzWTIgPiBub1RpY2tzWSkge1xuXHQvL1x0XHRheGlzWS52aWV3cG9ydE1heGltdW0gPSBheGlzWS5pbnRlcnZhbCAqIG5vVGlja3NZMiArIGF4aXNZLnZpZXdwb3J0TWluaW11bTtcblx0Ly9cdH1cblx0Ly99XG5cblx0dmFyIGF4aXNZbGluZVRoaWNrbmVzcyA9IGF4aXNZID8gYXhpc1kubGluZVRoaWNrbmVzcyA/IGF4aXNZLmxpbmVUaGlja25lc3MgOiAwIDogMDtcblx0dmFyIGF4aXNZMmxpbmVUaGlja25lc3MgPSBheGlzWTIgPyBheGlzWTIubGluZVRoaWNrbmVzcyA/IGF4aXNZMi5saW5lVGhpY2tuZXNzIDogMCA6IDA7XG5cblx0dmFyIGF4aXNZR3JpZFRoaWNrbmVzcyA9IGF4aXNZID8gYXhpc1kuZ3JpZFRoaWNrbmVzcyA/IGF4aXNZLmdyaWRUaGlja25lc3MgOiAwIDogMDtcblx0dmFyIGF4aXNZMkdyaWRUaGlja25lc3MgPSBheGlzWTIgPyBheGlzWTIuZ3JpZFRoaWNrbmVzcyA/IGF4aXNZMi5ncmlkVGhpY2tuZXNzIDogMCA6IDA7XG5cblx0dmFyIGF4aXNZTWFyZ2luID0gYXhpc1kgPyBheGlzWS5tYXJnaW4gOiAwO1xuXHR2YXIgYXhpc1kyTWFyZ2luID0gYXhpc1kgPyBheGlzWS5tYXJnaW4gOiAwO1xuXG5cdGlmIChheGlzUGxhY2VtZW50ID09PSBcIm5vcm1hbFwiKSB7XG5cblx0XHRheGlzWC5saW5lQ29vcmRpbmF0ZXMgPSB7XG5cdFx0fTtcblxuXHRcdHZhciBheGlzWVdpZHRoID0gTWF0aC5jZWlsKGF4aXNZID8gYXhpc1kuY3JlYXRlTGFiZWxzQW5kQ2FsY3VsYXRlV2lkdGgoKSA6IDApO1xuXHRcdHgxID0gTWF0aC5yb3VuZChmcmVlU3BhY2UueDEgKyBheGlzWVdpZHRoICsgYXhpc1lNYXJnaW4pO1xuXHRcdGF4aXNYLmxpbmVDb29yZGluYXRlcy54MSA9IHgxO1xuXG5cdFx0dmFyIGF4aXNZMldpZHRoID0gTWF0aC5jZWlsKGF4aXNZMiA/IGF4aXNZMi5jcmVhdGVMYWJlbHNBbmRDYWxjdWxhdGVXaWR0aCgpIDogMCk7XG5cdFx0eDIgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS54MiAtIGF4aXNZMldpZHRoID4gYXhpc1guY2hhcnQud2lkdGggLSAxMCA/IGF4aXNYLmNoYXJ0LndpZHRoIC0gMTAgOiBmcmVlU3BhY2UueDIgLSBheGlzWTJXaWR0aCk7XG5cdFx0YXhpc1gubGluZUNvb3JkaW5hdGVzLngyID0geDI7XG5cblx0XHRheGlzWC5saW5lQ29vcmRpbmF0ZXMud2lkdGggPSBNYXRoLmFicyh4MiAtIHgxKTsgLy8gcmVxdWlyZWQgZWFybHkgb24gaW5zaWRlIGNyZWF0ZUxhYmVscyBvZiBheGlzWFxuXG5cdFx0dmFyIGF4aXNYSGVpZ2h0ID0gTWF0aC5jZWlsKGF4aXNYLmNyZWF0ZUxhYmVsc0FuZENhbGN1bGF0ZUhlaWdodCgpKTtcblxuXHRcdC8vIFBvc2l0aW9uIGF4aXNYIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgZnJlZSBzcGFjZSwgTWFyZ2luIGFuZCBpdHMgaGVpZ2h0XG5cdFx0Ly94MSA9IGZyZWVTcGFjZS54MSArIGF4aXNZV2lkdGggKyBheGlzWU1hcmdpbiArIGF4aXNZbGluZVRoaWNrbmVzcyAvIDI7XG5cdFx0eTEgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS55MiAtIGF4aXNYSGVpZ2h0IC0gYXhpc1gubWFyZ2luKTtcblx0XHR5MiA9IE1hdGgucm91bmQoZnJlZVNwYWNlLnkyIC0gYXhpc1gubWFyZ2luKTtcblxuXHRcdC8vYXhpc1gubGluZUNvb3JkaW5hdGVzID0geyB4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTEsIHdpZHRoOiBNYXRoLmFicyh4MiAtIHgxKSB9XG5cdFx0YXhpc1gubGluZUNvb3JkaW5hdGVzLnkxID0geTE7XG5cdFx0YXhpc1gubGluZUNvb3JkaW5hdGVzLnkyID0geTE7XG5cblx0XHRheGlzWC5ib3VuZGluZ1JlY3QgPSB7XG5cdFx0XHR4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTIsIHdpZHRoOiB4MiAtIHgxLCBoZWlnaHQ6IHkyIC0geTFcblx0XHR9O1xuXG5cdFx0Ly9pZiAoaXNEZWJ1Z01vZGUpIHtcblx0XHQvL1x0YXhpc1guY3R4LnJlY3QoYXhpc1guYm91bmRpbmdSZWN0LngxLCBheGlzWC5ib3VuZGluZ1JlY3QueTEsIGF4aXNYLmJvdW5kaW5nUmVjdC53aWR0aCwgYXhpc1guYm91bmRpbmdSZWN0LmhlaWdodCk7XG5cdFx0Ly9cdGF4aXNYLmN0eC5zdHJva2UoKTtcblx0XHQvL31cblxuXHRcdC8vIFBvc2l0aW9uIGF4aXNZIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgZnJlZSBzcGFjZSwgTWFyZ2luIGFuZCBpdHMgaGVpZ2h0XG5cdFx0aWYgKGF4aXNZKSB7XG5cdFx0XHR4MSA9IE1hdGgucm91bmQoZnJlZVNwYWNlLngxICsgYXhpc1kubWFyZ2luKTtcblx0XHRcdHkxID0gTWF0aC5yb3VuZChmcmVlU3BhY2UueTEgPCAxMCA/IDEwIDogZnJlZVNwYWNlLnkxKTtcblx0XHRcdHgyID0gTWF0aC5yb3VuZChmcmVlU3BhY2UueDEgKyBheGlzWVdpZHRoICsgYXhpc1kubWFyZ2luKTtcblx0XHRcdC8veTIgPSBmcmVlU3BhY2UueTIgLSBheGlzWEhlaWdodCAtIGF4aXNYLm1hcmdpbiAtIGF4aXNYLmxpbmVUaGlja25lc3MgLyAyO1xuXHRcdFx0eTIgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS55MiAtIGF4aXNYSGVpZ2h0IC0gYXhpc1gubWFyZ2luKTtcblxuXHRcdFx0YXhpc1kubGluZUNvb3JkaW5hdGVzID0ge1xuXHRcdFx0XHR4MTogeDIsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTIsIGhlaWdodDogTWF0aC5hYnMoeTIgLSB5MSlcblx0XHRcdH1cblxuXHRcdFx0YXhpc1kuYm91bmRpbmdSZWN0ID0ge1xuXHRcdFx0XHR4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTIsIHdpZHRoOiB4MiAtIHgxLCBoZWlnaHQ6IHkyIC0geTFcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly9pZiAoaXNEZWJ1Z01vZGUgJiYgYXhpc1kpIHtcblx0XHQvL1x0YXhpc1kuY3R4LnJlY3QoYXhpc1kuYm91bmRpbmdSZWN0LngxLCBheGlzWS5ib3VuZGluZ1JlY3QueTEsIGF4aXNZLmJvdW5kaW5nUmVjdC53aWR0aCwgYXhpc1kuYm91bmRpbmdSZWN0LmhlaWdodCk7XG5cdFx0Ly9cdGF4aXNZLmN0eC5zdHJva2UoKTtcblx0XHQvL31cblxuXHRcdC8vIFBvc2l0aW9uIGF4aXNZMiBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIGZyZWUgc3BhY2UsIE1hcmdpbiBhbmQgaXRzIGhlaWdodFxuXHRcdGlmIChheGlzWTIpIHtcblx0XHRcdHgxID0gTWF0aC5yb3VuZChheGlzWC5saW5lQ29vcmRpbmF0ZXMueDIpO1xuXHRcdFx0eTEgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS55MSA8IDEwID8gMTAgOiBmcmVlU3BhY2UueTEpO1xuXHRcdFx0eDIgPSBNYXRoLnJvdW5kKHgxICsgYXhpc1kyV2lkdGggKyBheGlzWTIubWFyZ2luKTtcblx0XHRcdC8veTIgPSBmcmVlU3BhY2UueTIgLSBheGlzWEhlaWdodCAtIGF4aXNYLm1hcmdpbiAtIGF4aXNYLmxpbmVUaGlja25lc3MgLyAyO1xuXHRcdFx0eTIgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS55MiAtIGF4aXNYSGVpZ2h0IC0gYXhpc1gubWFyZ2luKTtcblxuXHRcdFx0YXhpc1kyLmxpbmVDb29yZGluYXRlcyA9IHtcblx0XHRcdFx0eDE6IHgxLCB5MTogeTEsIHgyOiB4MSwgeTI6IHkyLCBoZWlnaHQ6IE1hdGguYWJzKHkyIC0geTEpXG5cdFx0XHR9XG5cblx0XHRcdGF4aXNZMi5ib3VuZGluZ1JlY3QgPSB7XG5cdFx0XHRcdHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5Miwgd2lkdGg6IHgyIC0geDEsIGhlaWdodDogeTIgLSB5MVxuXHRcdFx0fTtcblx0XHR9XG5cblxuXHRcdGF4aXNYLmNhbGN1bGF0ZVZhbHVlVG9QaXhlbENvbnZlcnNpb25QYXJhbWV0ZXJzKCk7XG5cblx0XHRpZiAoYXhpc1kpXG5cdFx0XHRheGlzWS5jYWxjdWxhdGVWYWx1ZVRvUGl4ZWxDb252ZXJzaW9uUGFyYW1ldGVycygpO1xuXG5cdFx0aWYgKGF4aXNZMilcblx0XHRcdGF4aXNZMi5jYWxjdWxhdGVWYWx1ZVRvUGl4ZWxDb252ZXJzaW9uUGFyYW1ldGVycygpO1xuXG5cblx0XHRjdHguc2F2ZSgpO1xuXHRcdGN0eC5yZWN0KDUsIGF4aXNYLmJvdW5kaW5nUmVjdC55MSwgYXhpc1guY2hhcnQud2lkdGggLSAxMCwgYXhpc1guYm91bmRpbmdSZWN0LmhlaWdodCk7XG5cdFx0Y3R4LmNsaXAoKTtcblxuXHRcdGF4aXNYLnJlbmRlckxhYmVsc1RpY2tzQW5kVGl0bGUoKTtcblx0XHRjdHgucmVzdG9yZSgpO1xuXG5cdFx0aWYgKGF4aXNZKVxuXHRcdFx0YXhpc1kucmVuZGVyTGFiZWxzVGlja3NBbmRUaXRsZSgpO1xuXG5cdFx0aWYgKGF4aXNZMilcblx0XHRcdGF4aXNZMi5yZW5kZXJMYWJlbHNUaWNrc0FuZFRpdGxlKCk7XG5cblxuXHRcdGNoYXJ0LnByZXBhcmVQbG90QXJlYSgpO1xuXHRcdHZhciBwbG90QXJlYSA9IGF4aXNYLmNoYXJ0LnBsb3RBcmVhO1xuXG5cdFx0Y3R4LnNhdmUoKTtcblxuXHRcdGN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgTWF0aC5hYnMocGxvdEFyZWEueDIgLSBwbG90QXJlYS54MSksIE1hdGguYWJzKHBsb3RBcmVhLnkyIC0gcGxvdEFyZWEueTEpKTtcblxuXHRcdGN0eC5jbGlwKCk7XG5cblx0XHRheGlzWC5yZW5kZXJTdHJpcExpbmVzT2ZUaGlja25lc3NUeXBlKFwidmFsdWVcIik7XG5cblx0XHRpZiAoYXhpc1kpXG5cdFx0XHRheGlzWS5yZW5kZXJTdHJpcExpbmVzT2ZUaGlja25lc3NUeXBlKFwidmFsdWVcIik7XG5cblx0XHRpZiAoYXhpc1kyKVxuXHRcdFx0YXhpc1kyLnJlbmRlclN0cmlwTGluZXNPZlRoaWNrbmVzc1R5cGUoXCJ2YWx1ZVwiKTtcblxuXG5cdFx0YXhpc1gucmVuZGVySW50ZXJsYWNlZENvbG9ycygpO1xuXG5cdFx0aWYgKGF4aXNZKVxuXHRcdFx0YXhpc1kucmVuZGVySW50ZXJsYWNlZENvbG9ycygpO1xuXG5cdFx0aWYgKGF4aXNZMilcblx0XHRcdGF4aXNZMi5yZW5kZXJJbnRlcmxhY2VkQ29sb3JzKCk7XG5cblx0XHRjdHgucmVzdG9yZSgpO1xuXG5cblx0XHRheGlzWC5yZW5kZXJHcmlkKCk7XG5cblx0XHRpZiAoYXhpc1kpXG5cdFx0XHRheGlzWS5yZW5kZXJHcmlkKCk7XG5cblx0XHRpZiAoYXhpc1kyKVxuXHRcdFx0YXhpc1kyLnJlbmRlckdyaWQoKTtcblxuXG5cdFx0YXhpc1gucmVuZGVyQXhpc0xpbmUoKTtcblxuXHRcdGlmIChheGlzWSlcblx0XHRcdGF4aXNZLnJlbmRlckF4aXNMaW5lKCk7XG5cblx0XHRpZiAoYXhpc1kyKVxuXHRcdFx0YXhpc1kyLnJlbmRlckF4aXNMaW5lKCk7XG5cblxuXHRcdC8vTm8gbmVlZCB0byBjbGlwIHRvIHBsb3RBcmVhIGJlY2F1c2Ugc3RyaXBMaW5lcyBuZWVkIHRvIHJlbmRlciBvbiB0b3Agb2YgZ3JpZGxpbmVzXG5cdFx0YXhpc1gucmVuZGVyU3RyaXBMaW5lc09mVGhpY2tuZXNzVHlwZShcInBpeGVsXCIpO1xuXG5cdFx0aWYgKGF4aXNZKVxuXHRcdFx0YXhpc1kucmVuZGVyU3RyaXBMaW5lc09mVGhpY2tuZXNzVHlwZShcInBpeGVsXCIpO1xuXG5cdFx0aWYgKGF4aXNZMilcblx0XHRcdGF4aXNZMi5yZW5kZXJTdHJpcExpbmVzT2ZUaGlja25lc3NUeXBlKFwicGl4ZWxcIik7XG5cdH1cblx0ZWxzZSB7XG5cdFx0dmFyIGF4aXNYV2lkdGggPSBNYXRoLmNlaWwoYXhpc1guY3JlYXRlTGFiZWxzQW5kQ2FsY3VsYXRlV2lkdGgoKSk7XG5cblx0XHRpZiAoYXhpc1kpIHtcblx0XHRcdGF4aXNZLmxpbmVDb29yZGluYXRlcyA9IHtcblx0XHRcdH07XG5cblx0XHRcdHgxID0gTWF0aC5yb3VuZChmcmVlU3BhY2UueDEgKyBheGlzWFdpZHRoICsgYXhpc1gubWFyZ2luKTtcblx0XHRcdHgyID0gTWF0aC5yb3VuZChmcmVlU3BhY2UueDIgPiBheGlzWS5jaGFydC53aWR0aCAtIDEwID8gYXhpc1kuY2hhcnQud2lkdGggLSAxMCA6IGZyZWVTcGFjZS54Mik7XG5cblx0XHRcdGF4aXNZLmxpbmVDb29yZGluYXRlcy54MSA9IHgxO1xuXHRcdFx0YXhpc1kubGluZUNvb3JkaW5hdGVzLngyID0geDI7XG5cdFx0XHRheGlzWS5saW5lQ29vcmRpbmF0ZXMud2lkdGggPSBNYXRoLmFicyh4MiAtIHgxKTtcblx0XHR9XG5cblx0XHRpZiAoYXhpc1kyKSB7XG5cdFx0XHRheGlzWTIubGluZUNvb3JkaW5hdGVzID0ge1xuXHRcdFx0fTtcblx0XHRcdHgxID0gTWF0aC5yb3VuZChmcmVlU3BhY2UueDEgKyBheGlzWFdpZHRoICsgYXhpc1gubWFyZ2luKTtcblx0XHRcdHgyID0gTWF0aC5yb3VuZChmcmVlU3BhY2UueDIgPiBheGlzWTIuY2hhcnQud2lkdGggLSAxMCA/IGF4aXNZMi5jaGFydC53aWR0aCAtIDEwIDogZnJlZVNwYWNlLngyKTtcblxuXHRcdFx0YXhpc1kyLmxpbmVDb29yZGluYXRlcy54MSA9IHgxO1xuXHRcdFx0YXhpc1kyLmxpbmVDb29yZGluYXRlcy54MiA9IHgyO1xuXHRcdFx0YXhpc1kyLmxpbmVDb29yZGluYXRlcy53aWR0aCA9IE1hdGguYWJzKHgyIC0geDEpO1xuXHRcdH1cblxuXG5cblx0XHR2YXIgYXhpc1lIZWlnaHQgPSBNYXRoLmNlaWwoYXhpc1kgPyBheGlzWS5jcmVhdGVMYWJlbHNBbmRDYWxjdWxhdGVIZWlnaHQoKSA6IDApO1xuXHRcdHZhciBheGlzWTJIZWlnaHQgPSBNYXRoLmNlaWwoYXhpc1kyID8gYXhpc1kyLmNyZWF0ZUxhYmVsc0FuZENhbGN1bGF0ZUhlaWdodCgpIDogMCk7XG5cblxuXHRcdC8vIFBvc2l0aW9uIGF4aXNZIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgZnJlZSBzcGFjZSwgTWFyZ2luIGFuZCBpdHMgaGVpZ2h0XG5cdFx0aWYgKGF4aXNZKSB7XG5cdFx0XHQvL3gxID0gZnJlZVNwYWNlLngxICsgYXhpc1hXaWR0aCArIGF4aXNYLm1hcmdpbiArIGF4aXNYLmxpbmVUaGlja25lc3MgLyAyO1xuXHRcdFx0Ly94MiA9IGZyZWVTcGFjZS54MiA+IGF4aXNZLmNoYXJ0LndpZHRoIC0gMTAgPyBheGlzWS5jaGFydC53aWR0aCAtIDEwIDogZnJlZVNwYWNlLngyO1xuXG5cdFx0XHR5MSA9IE1hdGgucm91bmQoZnJlZVNwYWNlLnkyIC0gYXhpc1lIZWlnaHQgLSBheGlzWS5tYXJnaW4pO1xuXHRcdFx0eTIgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS55MiAtIGF4aXNZTWFyZ2luID4gYXhpc1kuY2hhcnQuaGVpZ2h0IC0gMTAgPyBheGlzWS5jaGFydC5oZWlnaHQgLSAxMCA6IGZyZWVTcGFjZS55MiAtIGF4aXNZTWFyZ2luKTtcblxuXHRcdFx0Ly9heGlzWS5saW5lQ29vcmRpbmF0ZXMgPSB7IHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5MSwgd2lkdGg6IE1hdGguYWJzKHgyIC0geDEpIH1cblx0XHRcdGF4aXNZLmxpbmVDb29yZGluYXRlcy55MSA9IHkxO1xuXHRcdFx0YXhpc1kubGluZUNvb3JkaW5hdGVzLnkyID0geTE7XG5cblx0XHRcdGF4aXNZLmJvdW5kaW5nUmVjdCA9IHtcblx0XHRcdFx0eDE6IHgxLCB5MTogeTEsIHgyOiB4MiwgeTI6IHkyLCB3aWR0aDogeDIgLSB4MSwgaGVpZ2h0OiBheGlzWUhlaWdodFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBQb3NpdGlvbiBheGlzWSBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIGZyZWUgc3BhY2UsIE1hcmdpbiBhbmQgaXRzIGhlaWdodFxuXHRcdGlmIChheGlzWTIpIHtcblx0XHRcdC8veDEgPSBmcmVlU3BhY2UueDEgKyBheGlzWFdpZHRoICsgYXhpc1gubWFyZ2luICsgYXhpc1gubGluZVRoaWNrbmVzcyAvIDI7XG5cdFx0XHQvL3gyID0gZnJlZVNwYWNlLngyID4gYXhpc1kyLmNoYXJ0LndpZHRoIC0gMTAgPyBheGlzWTIuY2hhcnQud2lkdGggLSAxMCA6IGZyZWVTcGFjZS54MjtcblxuXHRcdFx0eTEgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS55MSArIGF4aXNZMi5tYXJnaW4pO1xuXHRcdFx0eTIgPSAoZnJlZVNwYWNlLnkxICsgYXhpc1kyLm1hcmdpbiArIGF4aXNZMkhlaWdodCk7XG5cblx0XHRcdC8vYXhpc1kyLmxpbmVDb29yZGluYXRlcyA9IHsgeDE6IHgxLCB5MTogeTIsIHgyOiB4MiwgeTI6IHkyLCB3aWR0aDogTWF0aC5hYnMoeDIgLSB4MSkgfVxuXHRcdFx0YXhpc1kyLmxpbmVDb29yZGluYXRlcy55MSA9IHkyO1xuXHRcdFx0YXhpc1kyLmxpbmVDb29yZGluYXRlcy55MiA9IHkyO1xuXG5cdFx0XHRheGlzWTIuYm91bmRpbmdSZWN0ID0ge1xuXHRcdFx0XHR4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTIsIHdpZHRoOiB4MiAtIHgxLCBoZWlnaHQ6IGF4aXNZMkhlaWdodFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvL2F4aXNZLmN0eC5yZWN0KGF4aXNZLmJvdW5kaW5nUmVjdC54MSwgYXhpc1kuYm91bmRpbmdSZWN0LnkxLCBheGlzWS5ib3VuZGluZ1JlY3Qud2lkdGgsIGF4aXNZLmJvdW5kaW5nUmVjdC5oZWlnaHQpO1xuXHRcdC8vYXhpc1kuY3R4LnN0cm9rZSgpO1xuXG5cdFx0Ly8gUG9zaXRpb24gYXhpc1ggYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBmcmVlIHNwYWNlLCBNYXJnaW4gYW5kIGl0cyBoZWlnaHRcblx0XHR4MSA9IE1hdGgucm91bmQoZnJlZVNwYWNlLngxICsgYXhpc1gubWFyZ2luKTtcblx0XHR5MSA9IE1hdGgucm91bmQoYXhpc1kyID8gYXhpc1kyLmxpbmVDb29yZGluYXRlcy55MiA6IChmcmVlU3BhY2UueTEgPCAxMCA/IDEwIDogZnJlZVNwYWNlLnkxKSk7XG5cdFx0eDIgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS54MSArIGF4aXNYV2lkdGggKyBheGlzWC5tYXJnaW4pO1xuXHRcdHkyID0gTWF0aC5yb3VuZChheGlzWSA/IGF4aXNZLmxpbmVDb29yZGluYXRlcy55MSA6IChmcmVlU3BhY2UueTIgLSBheGlzWU1hcmdpbiA+IGF4aXNYLmNoYXJ0LmhlaWdodCAtIDEwID8gYXhpc1guY2hhcnQuaGVpZ2h0IC0gMTAgOiBmcmVlU3BhY2UueTIgLSBheGlzWU1hcmdpbikpO1xuXG5cblx0XHRheGlzWC5saW5lQ29vcmRpbmF0ZXMgPSB7XG5cdFx0XHR4MTogeDIsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTIsIGhlaWdodDogTWF0aC5hYnMoeTIgLSB5MSlcblx0XHR9O1xuXG5cdFx0YXhpc1guYm91bmRpbmdSZWN0ID0ge1xuXHRcdFx0eDE6IHgxLCB5MTogeTEsIHgyOiB4MiwgeTI6IHkyLCB3aWR0aDogeDIgLSB4MSwgaGVpZ2h0OiB5MiAtIHkxXG5cdFx0fTtcblxuXHRcdC8vYXhpc1guY3R4LnJlY3QoYXhpc1guYm91bmRpbmdSZWN0LngxLCBheGlzWC5ib3VuZGluZ1JlY3QueTEsIGF4aXNYLmJvdW5kaW5nUmVjdC53aWR0aCwgYXhpc1guYm91bmRpbmdSZWN0LmhlaWdodCk7XG5cdFx0Ly9heGlzWC5jdHguc3Ryb2tlKCk7XG5cblx0XHRheGlzWC5jYWxjdWxhdGVWYWx1ZVRvUGl4ZWxDb252ZXJzaW9uUGFyYW1ldGVycygpO1xuXG5cdFx0aWYgKGF4aXNZKVxuXHRcdFx0YXhpc1kuY2FsY3VsYXRlVmFsdWVUb1BpeGVsQ29udmVyc2lvblBhcmFtZXRlcnMoKTtcblx0XHRpZiAoYXhpc1kyKVxuXHRcdFx0YXhpc1kyLmNhbGN1bGF0ZVZhbHVlVG9QaXhlbENvbnZlcnNpb25QYXJhbWV0ZXJzKCk7XG5cblxuXHRcdC8vY3R4LnNhdmUoKTtcblx0XHQvL2N0eC5yZWN0KGF4aXNZLmJvdW5kaW5nUmVjdC54MSAtIDMwLCBheGlzWS5ib3VuZGluZ1JlY3QueTEsIGF4aXNZLmJvdW5kaW5nUmVjdC53aWR0aCArIDYwLCBheGlzWS5ib3VuZGluZ1JlY3QuaGVpZ2h0KTtcblx0XHQvL2N0eC5jbGlwKCk7XG5cblx0XHRpZiAoYXhpc1kpXG5cdFx0XHRheGlzWS5yZW5kZXJMYWJlbHNUaWNrc0FuZFRpdGxlKCk7XG5cblx0XHRpZiAoYXhpc1kyKVxuXHRcdFx0YXhpc1kyLnJlbmRlckxhYmVsc1RpY2tzQW5kVGl0bGUoKTtcblxuXHRcdC8vY3R4LnJlc3RvcmUoKTtcblxuXHRcdGF4aXNYLnJlbmRlckxhYmVsc1RpY2tzQW5kVGl0bGUoKTtcblxuXHRcdGNoYXJ0LnByZXBhcmVQbG90QXJlYSgpO1xuXHRcdHZhciBwbG90QXJlYSA9IGF4aXNYLmNoYXJ0LnBsb3RBcmVhO1xuXG5cdFx0Y3R4LnNhdmUoKTtcblx0XHRjdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIE1hdGguYWJzKHBsb3RBcmVhLngyIC0gcGxvdEFyZWEueDEpLCBNYXRoLmFicyhwbG90QXJlYS55MiAtIHBsb3RBcmVhLnkxKSk7XG5cblx0XHRjdHguY2xpcCgpO1xuXG5cblx0XHQvL05vIG5lZWQgdG8gY2xpcCB0byBwbG90QXJlYSBiZWNhdXNlIHN0cmlwTGluZXMgbmVlZCB0byByZW5kZXIgb24gdG9wIG9mIGdyaWRsaW5lc1xuXHRcdGF4aXNYLnJlbmRlclN0cmlwTGluZXNPZlRoaWNrbmVzc1R5cGUoXCJ2YWx1ZVwiKTtcblxuXHRcdGlmIChheGlzWSlcblx0XHRcdGF4aXNZLnJlbmRlclN0cmlwTGluZXNPZlRoaWNrbmVzc1R5cGUoXCJ2YWx1ZVwiKTtcblx0XHRpZiAoYXhpc1kyKVxuXHRcdFx0YXhpc1kyLnJlbmRlclN0cmlwTGluZXNPZlRoaWNrbmVzc1R5cGUoXCJ2YWx1ZVwiKTtcblxuXHRcdGF4aXNYLnJlbmRlckludGVybGFjZWRDb2xvcnMoKTtcblxuXHRcdGlmIChheGlzWSlcblx0XHRcdGF4aXNZLnJlbmRlckludGVybGFjZWRDb2xvcnMoKTtcblx0XHRpZiAoYXhpc1kyKVxuXHRcdFx0YXhpc1kyLnJlbmRlckludGVybGFjZWRDb2xvcnMoKTtcblxuXHRcdGN0eC5yZXN0b3JlKCk7XG5cblxuXHRcdGF4aXNYLnJlbmRlckdyaWQoKTtcblxuXG5cdFx0aWYgKGF4aXNZKVxuXHRcdFx0YXhpc1kucmVuZGVyR3JpZCgpO1xuXG5cdFx0aWYgKGF4aXNZMilcblx0XHRcdGF4aXNZMi5yZW5kZXJHcmlkKCk7XG5cblxuXHRcdGF4aXNYLnJlbmRlckF4aXNMaW5lKCk7XG5cblx0XHRpZiAoYXhpc1kpXG5cdFx0XHRheGlzWS5yZW5kZXJBeGlzTGluZSgpO1xuXG5cdFx0aWYgKGF4aXNZMilcblx0XHRcdGF4aXNZMi5yZW5kZXJBeGlzTGluZSgpO1xuXG5cblx0XHRheGlzWC5yZW5kZXJTdHJpcExpbmVzT2ZUaGlja25lc3NUeXBlKFwicGl4ZWxcIik7XG5cblx0XHRpZiAoYXhpc1kpXG5cdFx0XHRheGlzWS5yZW5kZXJTdHJpcExpbmVzT2ZUaGlja25lc3NUeXBlKFwicGl4ZWxcIik7XG5cdFx0aWYgKGF4aXNZMilcblx0XHRcdGF4aXNZMi5yZW5kZXJTdHJpcExpbmVzT2ZUaGlja25lc3NUeXBlKFwicGl4ZWxcIik7XG5cdH1cblxufVxuXG5BeGlzLnByb3RvdHlwZS5yZW5kZXJMYWJlbHNUaWNrc0FuZFRpdGxlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBza2lwTGFiZWxzID0gZmFsc2U7XG5cdHZhciB0b3RhbExhYmVsV2lkdGggPSAwO1xuXHR2YXIgdGhyZXNob2xkUmF0aW8gPSAxO1xuXHR2YXIgbGFiZWxDb3VudCA9IDA7XG5cblx0dmFyIGludGVydmFsSW5QaXhlbHMgPSB0aGlzLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIHRoaXMuaW50ZXJ2YWw7XG5cblx0aWYgKHRoaXMubGFiZWxBbmdsZSAhPT0gMCAmJiB0aGlzLmxhYmVsQW5nbGUgIT09IDM2MClcblx0XHR0aHJlc2hvbGRSYXRpbyA9IDEuMjtcblxuXHQvL0Rvbid0IHNraXAgbGFiZWxzIHdoZW4gaW50ZXJ2YWwgaXMgZXhwbGljaXRlbHkgc2V0XG5cdGlmICh0eXBlb2YgKHRoaXMuX29wdGlvbnMuaW50ZXJ2YWwpID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0aWYgKHRoaXMuX3Bvc2l0aW9uID09PSBcImJvdHRvbVwiIHx8IHRoaXMuX3Bvc2l0aW9uID09PSBcInRvcFwiKSB7XG5cblx0XHRcdC8vdGhyZXNob2xkUmF0aW8gPSAuOTsvLyBNb3JlIHNwYWNlIGlzIHByZWZlcnJlZCBiZXR3ZWVuIGxhYmVscyB3aGVuIGF4aXMgaXMgaG9yaXpvbnRhbGx5IGFsaWduZWRcblxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IHRoaXMuX2xhYmVscy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRsYWJlbCA9IHRoaXMuX2xhYmVsc1tpXTtcblx0XHRcdFx0aWYgKGxhYmVsLnBvc2l0aW9uIDwgdGhpcy52aWV3cG9ydE1pbmltdW0gfHwgbGFiZWwuc3RyaXBMaW5lKS8vIGRvbid0IGNvbnNpZGVyIHN0cmlwTGluZSdzIGxhYmxlXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0dmFyIHdpZHRoID0gbGFiZWwudGV4dEJsb2NrLndpZHRoICogTWF0aC5jb3MoTWF0aC5QSSAvIDE4MCAqIHRoaXMubGFiZWxBbmdsZSkgKyBsYWJlbC50ZXh0QmxvY2suaGVpZ2h0ICogTWF0aC5zaW4oTWF0aC5QSSAvIDE4MCAqIHRoaXMubGFiZWxBbmdsZSk7XG5cblx0XHRcdFx0dG90YWxMYWJlbFdpZHRoICs9IHdpZHRoO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodG90YWxMYWJlbFdpZHRoID4gdGhpcy5saW5lQ29vcmRpbmF0ZXMud2lkdGggKiB0aHJlc2hvbGRSYXRpbykge1xuXHRcdFx0XHRza2lwTGFiZWxzID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9IGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJsZWZ0XCIgfHwgdGhpcy5fcG9zaXRpb24gPT09IFwicmlnaHRcIikge1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IHRoaXMuX2xhYmVscy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRsYWJlbCA9IHRoaXMuX2xhYmVsc1tpXTtcblx0XHRcdFx0aWYgKGxhYmVsLnBvc2l0aW9uIDwgdGhpcy52aWV3cG9ydE1pbmltdW0gfHwgbGFiZWwuc3RyaXBMaW5lKS8vIGRvbid0IGNvbnNpZGVyIHN0cmlwTGluZSdzIGxhYmxlXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0dmFyIHdpZHRoID0gbGFiZWwudGV4dEJsb2NrLmhlaWdodCAqIE1hdGguY29zKE1hdGguUEkgLyAxODAgKiB0aGlzLmxhYmVsQW5nbGUpICsgbGFiZWwudGV4dEJsb2NrLndpZHRoICogTWF0aC5zaW4oTWF0aC5QSSAvIDE4MCAqIHRoaXMubGFiZWxBbmdsZSk7XG5cblx0XHRcdFx0dG90YWxMYWJlbFdpZHRoICs9IHdpZHRoO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodG90YWxMYWJlbFdpZHRoID4gdGhpcy5saW5lQ29vcmRpbmF0ZXMuaGVpZ2h0ICogdGhyZXNob2xkUmF0aW8pIHtcblx0XHRcdFx0c2tpcExhYmVscyA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKHRoaXMuX3Bvc2l0aW9uID09PSBcImJvdHRvbVwiKSB7XG5cdFx0dmFyIGkgPSAwO1xuXG5cdFx0dmFyIGxhYmVsO1xuXHRcdHZhciB4eTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCB0aGlzLl9sYWJlbHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0bGFiZWwgPSB0aGlzLl9sYWJlbHNbaV07XG5cdFx0XHRpZiAobGFiZWwucG9zaXRpb24gPCB0aGlzLnZpZXdwb3J0TWluaW11bSB8fCBsYWJlbC5wb3NpdGlvbiA+IHRoaXMudmlld3BvcnRNYXhpbXVtKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0eHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXMobGFiZWwucG9zaXRpb24pO1xuXG5cdFx0XHRpZiAoKHRoaXMudGlja1RoaWNrbmVzcyAmJiAhdGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZSkgfHwgKHRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmUgJiYgdGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZS5fdGhpY2tuZXNzVHlwZSA9PT0gXCJwaXhlbFwiKSkge1xuXG5cdFx0XHRcdGlmICh0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lKSB7XG5cdFx0XHRcdFx0c3RyaXBMaW5lID0gdGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZTtcblx0XHRcdFx0XHR0aGlzLmN0eC5saW5lV2lkdGggPSBzdHJpcExpbmUudGhpY2tuZXNzO1xuXHRcdFx0XHRcdHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gc3RyaXBMaW5lLmNvbG9yO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5jdHgubGluZVdpZHRoID0gdGhpcy50aWNrVGhpY2tuZXNzO1xuXHRcdFx0XHRcdHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy50aWNrQ29sb3I7XG5cdFx0XHRcdH1cblxuXG5cdFx0XHRcdHZhciB0aWNrWCA9ICh0aGlzLmN0eC5saW5lV2lkdGggJSAyID09PSAxKSA/ICh4eS54IDw8IDApICsgLjUgOiAoeHkueCA8PCAwKTtcblx0XHRcdFx0dGhpcy5jdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdHRoaXMuY3R4Lm1vdmVUbyh0aWNrWCwgeHkueSA8PCAwKTtcblx0XHRcdFx0dGhpcy5jdHgubGluZVRvKHRpY2tYLCAoeHkueSArIHRoaXMudGlja0xlbmd0aCkgPDwgMCk7XG5cdFx0XHRcdHRoaXMuY3R4LnN0cm9rZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHQvL0Rvbid0IHNraXAgc3RyaXBMaW5lJ3MgbGFiZWxzXG5cdFx0XHRpZiAoc2tpcExhYmVscyAmJiBsYWJlbENvdW50KysgJSAyICE9PSAwICYmICF0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0aWYgKGxhYmVsLnRleHRCbG9jay5hbmdsZSA9PT0gMCkge1xuXHRcdFx0XHR4eS54IC09IGxhYmVsLnRleHRCbG9jay53aWR0aCAvIDI7XG5cdFx0XHRcdC8veHkueSArPSB0aGlzLnRpY2tMZW5ndGggKyBsYWJlbC50ZXh0QmxvY2suaGVpZ2h0IC8gMjtcblx0XHRcdFx0eHkueSArPSB0aGlzLnRpY2tMZW5ndGggKyBsYWJlbC50ZXh0QmxvY2suZm9udFNpemUgLyAyO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR4eS54IC09ICh0aGlzLmxhYmVsQW5nbGUgPCAwID8gKGxhYmVsLnRleHRCbG9jay53aWR0aCAqIE1hdGguY29zKE1hdGguUEkgLyAxODAgKiB0aGlzLmxhYmVsQW5nbGUpKSA6IDApO1xuXHRcdFx0XHR4eS55ICs9IHRoaXMudGlja0xlbmd0aCArIE1hdGguYWJzKCh0aGlzLmxhYmVsQW5nbGUgPCAwID8gbGFiZWwudGV4dEJsb2NrLndpZHRoICogTWF0aC5zaW4oTWF0aC5QSSAvIDE4MCAqIHRoaXMubGFiZWxBbmdsZSkgLSA1IDogNSkpO1xuXHRcdFx0fVxuXHRcdFx0bGFiZWwudGV4dEJsb2NrLnggPSB4eS54O1xuXHRcdFx0bGFiZWwudGV4dEJsb2NrLnkgPSB4eS55O1xuXG5cdFx0XHRsYWJlbC50ZXh0QmxvY2sucmVuZGVyKHRydWUpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnRpdGxlKSB7XG5cblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrID0gbmV3IFRleHRCbG9jayh0aGlzLmN0eCwge1xuXHRcdFx0XHR4OiB0aGlzLmxpbmVDb29yZGluYXRlcy54MSwvLyBUaGlzIGlzIHJlY2FsY3VsYXRlZCBhZ2FpblxuXHRcdFx0XHR5OiB0aGlzLmJvdW5kaW5nUmVjdC55MiAtIHRoaXMudGl0bGVGb250U2l6ZSAtIDUsLy8gVGhpcyBpcyByZWNhbGN1bGF0ZWQgYWdhaW5cblx0XHRcdFx0bWF4V2lkdGg6IHRoaXMubGluZUNvb3JkaW5hdGVzLndpZHRoLFxuXHRcdFx0XHRtYXhIZWlnaHQ6IHRoaXMudGl0bGVGb250U2l6ZSAqIDEuNSxcblx0XHRcdFx0YW5nbGU6IDAsXG5cdFx0XHRcdHRleHQ6IHRoaXMudGl0bGUsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogXCJjZW50ZXJcIiwvL2xlZnQsIGNlbnRlciwgcmlnaHRcblx0XHRcdFx0Zm9udFNpemU6IHRoaXMudGl0bGVGb250U2l6ZSwvL2luIHBpeGVsc1xuXHRcdFx0XHRmb250RmFtaWx5OiB0aGlzLnRpdGxlRm9udEZhbWlseSxcblx0XHRcdFx0Zm9udFdlaWdodDogdGhpcy50aXRsZUZvbnRXZWlnaHQsIC8vbm9ybWFsLCBib2xkLCBib2xkZXIsIGxpZ2h0ZXIsXG5cdFx0XHRcdGZvbnRDb2xvcjogdGhpcy50aXRsZUZvbnRDb2xvcixcblx0XHRcdFx0Zm9udFN0eWxlOiB0aGlzLnRpdGxlRm9udFN0eWxlLCAvLyBub3JtYWwsIGl0YWxpYywgb2JsaXF1ZVxuXHRcdFx0XHR0ZXh0QmFzZWxpbmU6IFwidG9wXCJcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLl90aXRsZVRleHRCbG9jay5tZWFzdXJlVGV4dCgpO1xuXHRcdFx0dGhpcy5fdGl0bGVUZXh0QmxvY2sueCA9IHRoaXMubGluZUNvb3JkaW5hdGVzLngxICsgdGhpcy5saW5lQ29vcmRpbmF0ZXMud2lkdGggLyAyIC0gdGhpcy5fdGl0bGVUZXh0QmxvY2sud2lkdGggLyAyO1xuXHRcdFx0dGhpcy5fdGl0bGVUZXh0QmxvY2sueSA9IHRoaXMuYm91bmRpbmdSZWN0LnkyIC0gdGhpcy5fdGl0bGVUZXh0QmxvY2suaGVpZ2h0IC0gMztcblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrLnJlbmRlcih0cnVlKTtcblx0XHR9XG5cdH1cblx0ZWxzZSBpZiAodGhpcy5fcG9zaXRpb24gPT09IFwidG9wXCIpIHtcblx0XHR2YXIgaSA9IDA7XG5cblx0XHR2YXIgbGFiZWw7XG5cdFx0dmFyIHh5O1xuXHRcdHZhciBzdHJpcExpbmU7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5fbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRsYWJlbCA9IHRoaXMuX2xhYmVsc1tpXTtcblx0XHRcdGlmIChsYWJlbC5wb3NpdGlvbiA8IHRoaXMudmlld3BvcnRNaW5pbXVtIHx8IGxhYmVsLnBvc2l0aW9uID4gdGhpcy52aWV3cG9ydE1heGltdW0pXG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR4eSA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyhsYWJlbC5wb3NpdGlvbik7XG5cblx0XHRcdGlmICgodGhpcy50aWNrVGhpY2tuZXNzICYmICF0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lKSB8fCAodGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZSAmJiB0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lLl90aGlja25lc3NUeXBlID09PSBcInBpeGVsXCIpKSB7XG5cblxuXHRcdFx0XHRpZiAodGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZSkge1xuXHRcdFx0XHRcdHN0cmlwTGluZSA9IHRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmU7XG5cblx0XHRcdFx0XHR0aGlzLmN0eC5saW5lV2lkdGggPSBzdHJpcExpbmUudGhpY2tuZXNzO1xuXHRcdFx0XHRcdHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gc3RyaXBMaW5lLmNvbG9yO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5jdHgubGluZVdpZHRoID0gdGhpcy50aWNrVGhpY2tuZXNzO1xuXHRcdFx0XHRcdHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy50aWNrQ29sb3I7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgdGlja1ggPSAodGhpcy5jdHgubGluZVdpZHRoICUgMiA9PT0gMSkgPyAoeHkueCA8PCAwKSArIC41IDogKHh5LnggPDwgMCk7XG5cdFx0XHRcdHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHR0aGlzLmN0eC5tb3ZlVG8odGlja1gsIHh5LnkgPDwgMCk7XG5cdFx0XHRcdHRoaXMuY3R4LmxpbmVUbyh0aWNrWCwgKHh5LnkgLSB0aGlzLnRpY2tMZW5ndGgpIDw8IDApO1xuXHRcdFx0XHR0aGlzLmN0eC5zdHJva2UoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvL0Rvbid0IHNraXAgc3RyaXBMaW5lJ3MgbGFiZWxzXG5cdFx0XHRpZiAoc2tpcExhYmVscyAmJiBsYWJlbENvdW50KysgJSAyICE9PSAwICYmICF0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0aWYgKGxhYmVsLnRleHRCbG9jay5hbmdsZSA9PT0gMCkge1xuXHRcdFx0XHR4eS54IC09IGxhYmVsLnRleHRCbG9jay53aWR0aCAvIDI7XG5cdFx0XHRcdHh5LnkgLT0gdGhpcy50aWNrTGVuZ3RoICsgbGFiZWwudGV4dEJsb2NrLmhlaWdodCAvIDI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR4eS54IC09ICh0aGlzLmxhYmVsQW5nbGUgPiAwID8gKGxhYmVsLnRleHRCbG9jay53aWR0aCAqIE1hdGguY29zKE1hdGguUEkgLyAxODAgKiB0aGlzLmxhYmVsQW5nbGUpKSA6IDApO1xuXHRcdFx0XHR4eS55IC09IHRoaXMudGlja0xlbmd0aCArIE1hdGguYWJzKCh0aGlzLmxhYmVsQW5nbGUgPiAwID8gbGFiZWwudGV4dEJsb2NrLndpZHRoICogTWF0aC5zaW4oTWF0aC5QSSAvIDE4MCAqIHRoaXMubGFiZWxBbmdsZSkgKyA1IDogNSkpO1xuXHRcdFx0fVxuXHRcdFx0bGFiZWwudGV4dEJsb2NrLnggPSB4eS54O1xuXHRcdFx0bGFiZWwudGV4dEJsb2NrLnkgPSB4eS55O1xuXG5cdFx0XHRsYWJlbC50ZXh0QmxvY2sucmVuZGVyKHRydWUpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnRpdGxlKSB7XG5cblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrID0gbmV3IFRleHRCbG9jayh0aGlzLmN0eCwge1xuXHRcdFx0XHR4OiB0aGlzLmxpbmVDb29yZGluYXRlcy54MSwvLyBUaGlzIGlzIHJlY2FsY3VsYXRlZCBhZ2FpblxuXHRcdFx0XHR5OiB0aGlzLmJvdW5kaW5nUmVjdC55MSArIDEsXG5cdFx0XHRcdG1heFdpZHRoOiB0aGlzLmxpbmVDb29yZGluYXRlcy53aWR0aCxcblx0XHRcdFx0bWF4SGVpZ2h0OiB0aGlzLnRpdGxlRm9udFNpemUgKiAxLjUsXG5cdFx0XHRcdGFuZ2xlOiAwLFxuXHRcdFx0XHR0ZXh0OiB0aGlzLnRpdGxlLFxuXHRcdFx0XHRob3Jpem9udGFsQWxpZ246IFwiY2VudGVyXCIsLy9sZWZ0LCBjZW50ZXIsIHJpZ2h0XG5cdFx0XHRcdGZvbnRTaXplOiB0aGlzLnRpdGxlRm9udFNpemUsLy9pbiBwaXhlbHNcblx0XHRcdFx0Zm9udEZhbWlseTogdGhpcy50aXRsZUZvbnRGYW1pbHksXG5cdFx0XHRcdGZvbnRXZWlnaHQ6IHRoaXMudGl0bGVGb250V2VpZ2h0LCAvL25vcm1hbCwgYm9sZCwgYm9sZGVyLCBsaWdodGVyLFxuXHRcdFx0XHRmb250Q29sb3I6IHRoaXMudGl0bGVGb250Q29sb3IsXG5cdFx0XHRcdGZvbnRTdHlsZTogdGhpcy50aXRsZUZvbnRTdHlsZSwgLy8gbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcblx0XHRcdFx0dGV4dEJhc2VsaW5lOiBcInRvcFwiXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5fdGl0bGVUZXh0QmxvY2subWVhc3VyZVRleHQoKTtcblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrLnggPSB0aGlzLmxpbmVDb29yZGluYXRlcy54MSArIHRoaXMubGluZUNvb3JkaW5hdGVzLndpZHRoIC8gMiAtIHRoaXMuX3RpdGxlVGV4dEJsb2NrLndpZHRoIC8gMjtcblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrLnJlbmRlcih0cnVlKTtcblx0XHR9XG5cdH1cblx0ZWxzZSBpZiAodGhpcy5fcG9zaXRpb24gPT09IFwibGVmdFwiKSB7XG5cblxuXHRcdHZhciBsYWJlbDtcblx0XHR2YXIgeHk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9sYWJlbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxhYmVsID0gdGhpcy5fbGFiZWxzW2ldO1xuXHRcdFx0aWYgKGxhYmVsLnBvc2l0aW9uIDwgdGhpcy52aWV3cG9ydE1pbmltdW0gfHwgbGFiZWwucG9zaXRpb24gPiB0aGlzLnZpZXdwb3J0TWF4aW11bSlcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdHh5ID0gdGhpcy5nZXRQaXhlbENvb3JkaW5hdGVzT25BeGlzKGxhYmVsLnBvc2l0aW9uKTtcblxuXHRcdFx0aWYgKCh0aGlzLnRpY2tUaGlja25lc3MgJiYgIXRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmUpIHx8ICh0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lICYmIHRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmUuX3RoaWNrbmVzc1R5cGUgPT09IFwicGl4ZWxcIikpIHtcblxuXHRcdFx0XHRpZiAodGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZSkge1xuXHRcdFx0XHRcdHN0cmlwTGluZSA9IHRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmU7XG5cblx0XHRcdFx0XHR0aGlzLmN0eC5saW5lV2lkdGggPSBzdHJpcExpbmUudGhpY2tuZXNzO1xuXHRcdFx0XHRcdHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gc3RyaXBMaW5lLmNvbG9yO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuY3R4LmxpbmVXaWR0aCA9IHRoaXMudGlja1RoaWNrbmVzcztcblx0XHRcdFx0XHR0aGlzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMudGlja0NvbG9yO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHRpY2tZID0gKHRoaXMuY3R4LmxpbmVXaWR0aCAlIDIgPT09IDEpID8gKHh5LnkgPDwgMCkgKyAuNSA6ICh4eS55IDw8IDApO1xuXHRcdFx0XHR0aGlzLmN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0dGhpcy5jdHgubW92ZVRvKHh5LnggPDwgMCwgdGlja1kpO1xuXHRcdFx0XHR0aGlzLmN0eC5saW5lVG8oKHh5LnggLSB0aGlzLnRpY2tMZW5ndGgpIDw8IDAsIHRpY2tZKTtcblx0XHRcdFx0dGhpcy5jdHguc3Ryb2tlKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vRG9uJ3Qgc2tpcCBzdHJpcExpbmUncyBsYWJlbHNcblx0XHRcdGlmIChza2lwTGFiZWxzICYmIGxhYmVsQ291bnQrKyAlIDIgIT09IDAgJiYgIXRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmUpXG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRsYWJlbC50ZXh0QmxvY2sueCA9IHh5LnggLSAobGFiZWwudGV4dEJsb2NrLndpZHRoICogTWF0aC5jb3MoTWF0aC5QSSAvIDE4MCAqIHRoaXMubGFiZWxBbmdsZSkpIC0gdGhpcy50aWNrTGVuZ3RoIC0gNTtcblxuXHRcdFx0aWYgKHRoaXMubGFiZWxBbmdsZSA9PT0gMCkge1xuXHRcdFx0XHRsYWJlbC50ZXh0QmxvY2sueSA9IHh5Lnk7XG5cdFx0XHR9IGVsc2Vcblx0XHRcdFx0bGFiZWwudGV4dEJsb2NrLnkgPSB4eS55IC0gKGxhYmVsLnRleHRCbG9jay53aWR0aCAqIE1hdGguc2luKE1hdGguUEkgLyAxODAgKiB0aGlzLmxhYmVsQW5nbGUpKTtcblxuXHRcdFx0bGFiZWwudGV4dEJsb2NrLnJlbmRlcih0cnVlKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy50aXRsZSkge1xuXG5cdFx0XHR0aGlzLl90aXRsZVRleHRCbG9jayA9IG5ldyBUZXh0QmxvY2sodGhpcy5jdHgsIHtcblx0XHRcdFx0eDogdGhpcy5ib3VuZGluZ1JlY3QueDEgKyAxLFxuXHRcdFx0XHR5OiB0aGlzLmxpbmVDb29yZGluYXRlcy55Mixcblx0XHRcdFx0bWF4V2lkdGg6IHRoaXMubGluZUNvb3JkaW5hdGVzLmhlaWdodCxcblx0XHRcdFx0bWF4SGVpZ2h0OiB0aGlzLnRpdGxlRm9udFNpemUgKiAxLjUsXG5cdFx0XHRcdGFuZ2xlOiAtOTAsXG5cdFx0XHRcdHRleHQ6IHRoaXMudGl0bGUsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogXCJjZW50ZXJcIiwvL2xlZnQsIGNlbnRlciwgcmlnaHRcblx0XHRcdFx0Zm9udFNpemU6IHRoaXMudGl0bGVGb250U2l6ZSwvL2luIHBpeGVsc1xuXHRcdFx0XHRmb250RmFtaWx5OiB0aGlzLnRpdGxlRm9udEZhbWlseSxcblx0XHRcdFx0Zm9udFdlaWdodDogdGhpcy50aXRsZUZvbnRXZWlnaHQsIC8vbm9ybWFsLCBib2xkLCBib2xkZXIsIGxpZ2h0ZXIsXG5cdFx0XHRcdGZvbnRDb2xvcjogdGhpcy50aXRsZUZvbnRDb2xvcixcblx0XHRcdFx0Zm9udFN0eWxlOiB0aGlzLnRpdGxlRm9udFN0eWxlLCAvLyBub3JtYWwsIGl0YWxpYywgb2JsaXF1ZVxuXHRcdFx0XHR0ZXh0QmFzZWxpbmU6IFwidG9wXCJcblx0XHRcdH0pO1xuXG5cdFx0XHR2YXIgc2l6ZSA9IHRoaXMuX3RpdGxlVGV4dEJsb2NrLm1lYXN1cmVUZXh0KCk7XG5cblx0XHRcdC8vdGhpcy5fdGl0bGVUZXh0QmxvY2sueCAtPSA0O1xuXG5cdFx0XHR0aGlzLl90aXRsZVRleHRCbG9jay55ID0gKHRoaXMubGluZUNvb3JkaW5hdGVzLmhlaWdodCAvIDIgKyB0aGlzLl90aXRsZVRleHRCbG9jay53aWR0aCAvIDIgKyB0aGlzLmxpbmVDb29yZGluYXRlcy55MSk7XG5cdFx0XHR0aGlzLl90aXRsZVRleHRCbG9jay5yZW5kZXIodHJ1ZSk7XG5cblx0XHRcdC8vaWYgKGlzRGVidWdNb2RlKSB7XG5cdFx0XHQvL1x0d2luZG93LmNvbnNvbGUubG9nKFwidGl0bGVGb250U2l6ZTogXCIgKyB0aGlzLnRpdGxlRm9udFNpemUgKyBcIjsgd2lkdGg6IFwiICsgc2l6ZS53aWR0aCArIFwiOyBoZWlnaHQ6IFwiICsgc2l6ZS5oZWlnaHQpO1xuXHRcdFx0Ly9cdHdpbmRvdy5jb25zb2xlLmxvZyhcInRoaXMuYm91bmRpbmdSZWN0LngxOiBcIiArIHRoaXMuYm91bmRpbmdSZWN0LngxKTtcblxuXHRcdFx0Ly9cdC8vdGhpcy5jdHgucmVjdCh0aGlzLl90aXRsZVRleHRCbG9jay54LCB0aGlzLl90aXRsZVRleHRCbG9jay55LCB0aGlzLl90aXRsZVRleHRCbG9jay5oZWlnaHQsIC10aGlzLl90aXRsZVRleHRCbG9jay53aWR0aCk7XG5cdFx0XHQvL1x0Ly90aGlzLmN0eC5zdHJva2UoKTtcblxuXHRcdFx0Ly99XG5cblx0XHR9XG5cdH1cblx0ZWxzZSBpZiAodGhpcy5fcG9zaXRpb24gPT09IFwicmlnaHRcIikge1xuXG5cblx0XHR2YXIgbGFiZWw7XG5cdFx0dmFyIHh5O1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9sYWJlbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxhYmVsID0gdGhpcy5fbGFiZWxzW2ldO1xuXHRcdFx0aWYgKGxhYmVsLnBvc2l0aW9uIDwgdGhpcy52aWV3cG9ydE1pbmltdW0gfHwgbGFiZWwucG9zaXRpb24gPiB0aGlzLnZpZXdwb3J0TWF4aW11bSlcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdHh5ID0gdGhpcy5nZXRQaXhlbENvb3JkaW5hdGVzT25BeGlzKGxhYmVsLnBvc2l0aW9uKTtcblxuXHRcdFx0aWYgKCh0aGlzLnRpY2tUaGlja25lc3MgJiYgIXRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmUpIHx8ICh0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lICYmIHRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmUuX3RoaWNrbmVzc1R5cGUgPT09IFwicGl4ZWxcIikpIHtcblxuXHRcdFx0XHRpZiAodGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZSkge1xuXHRcdFx0XHRcdHN0cmlwTGluZSA9IHRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmU7XG5cblx0XHRcdFx0XHR0aGlzLmN0eC5saW5lV2lkdGggPSBzdHJpcExpbmUudGhpY2tuZXNzO1xuXHRcdFx0XHRcdHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gc3RyaXBMaW5lLmNvbG9yO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuY3R4LmxpbmVXaWR0aCA9IHRoaXMudGlja1RoaWNrbmVzcztcblx0XHRcdFx0XHR0aGlzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMudGlja0NvbG9yO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHRpY2tZID0gKHRoaXMuY3R4LmxpbmVXaWR0aCAlIDIgPT09IDEpID8gKHh5LnkgPDwgMCkgKyAuNSA6ICh4eS55IDw8IDApO1xuXHRcdFx0XHR0aGlzLmN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0dGhpcy5jdHgubW92ZVRvKHh5LnggPDwgMCwgdGlja1kpO1xuXHRcdFx0XHR0aGlzLmN0eC5saW5lVG8oKHh5LnggKyB0aGlzLnRpY2tMZW5ndGgpIDw8IDAsIHRpY2tZKTtcblx0XHRcdFx0dGhpcy5jdHguc3Ryb2tlKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly9Eb24ndCBza2lwIHN0cmlwTGluZSdzIGxhYmVsc1xuXHRcdFx0aWYgKHNraXBMYWJlbHMgJiYgbGFiZWxDb3VudCsrICUgMiAhPT0gMCAmJiAhdGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZSlcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdGxhYmVsLnRleHRCbG9jay54ID0geHkueCArIHRoaXMudGlja0xlbmd0aCArIDU7XG5cdFx0XHQvL2xhYmVsLnRleHRCbG9jay55ID0geHkueSAtIChsYWJlbC50ZXh0QmxvY2sud2lkdGggKiBNYXRoLnNpbihNYXRoLlBJIC8gMTgwICogdGhpcy5sYWJlbEFuZ2xlKSk7XG5cdFx0XHRpZiAodGhpcy5sYWJlbEFuZ2xlID09PSAwKSB7XG5cdFx0XHRcdGxhYmVsLnRleHRCbG9jay55ID0geHkueTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0bGFiZWwudGV4dEJsb2NrLnkgPSB4eS55O1xuXG5cdFx0XHRsYWJlbC50ZXh0QmxvY2sucmVuZGVyKHRydWUpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnRpdGxlKSB7XG5cblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrID0gbmV3IFRleHRCbG9jayh0aGlzLmN0eCwge1xuXHRcdFx0XHR4OiB0aGlzLmJvdW5kaW5nUmVjdC54MiAtIDEsXG5cdFx0XHRcdHk6IHRoaXMubGluZUNvb3JkaW5hdGVzLnkyLFxuXHRcdFx0XHRtYXhXaWR0aDogdGhpcy5saW5lQ29vcmRpbmF0ZXMuaGVpZ2h0LFxuXHRcdFx0XHRtYXhIZWlnaHQ6IHRoaXMudGl0bGVGb250U2l6ZSAqIDEuNSxcblx0XHRcdFx0YW5nbGU6IDkwLFxuXHRcdFx0XHR0ZXh0OiB0aGlzLnRpdGxlLFxuXHRcdFx0XHRob3Jpem9udGFsQWxpZ246IFwiY2VudGVyXCIsLy9sZWZ0LCBjZW50ZXIsIHJpZ2h0XG5cdFx0XHRcdGZvbnRTaXplOiB0aGlzLnRpdGxlRm9udFNpemUsLy9pbiBwaXhlbHNcblx0XHRcdFx0Zm9udEZhbWlseTogdGhpcy50aXRsZUZvbnRGYW1pbHksXG5cdFx0XHRcdGZvbnRXZWlnaHQ6IHRoaXMudGl0bGVGb250V2VpZ2h0LCAvL25vcm1hbCwgYm9sZCwgYm9sZGVyLCBsaWdodGVyLFxuXHRcdFx0XHRmb250Q29sb3I6IHRoaXMudGl0bGVGb250Q29sb3IsXG5cdFx0XHRcdGZvbnRTdHlsZTogdGhpcy50aXRsZUZvbnRTdHlsZSwgLy8gbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcblx0XHRcdFx0dGV4dEJhc2VsaW5lOiBcInRvcFwiXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5fdGl0bGVUZXh0QmxvY2subWVhc3VyZVRleHQoKTtcblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrLnkgPSAodGhpcy5saW5lQ29vcmRpbmF0ZXMuaGVpZ2h0IC8gMiAtIHRoaXMuX3RpdGxlVGV4dEJsb2NrLndpZHRoIC8gMiArIHRoaXMubGluZUNvb3JkaW5hdGVzLnkxKTtcblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrLnJlbmRlcih0cnVlKTtcblxuXHRcdH1cblx0fVxufVxuXG5BeGlzLnByb3RvdHlwZS5yZW5kZXJJbnRlcmxhY2VkQ29sb3JzID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgY3R4ID0gdGhpcy5jaGFydC5wbG90QXJlYS5jdHg7XG5cdC8vcmV0dXJuO1xuXG5cdHZhciBpbnRlcmxhY2VkR3JpZFN0YXJ0UG9pbnQ7XG5cdHZhciBpbnRlcmxhY2VkR3JpZEVuZFBvaW50O1xuXHR2YXIgcGxvdEFyZWFDb29yZGluYXRlcyA9IHRoaXMuY2hhcnQucGxvdEFyZWE7XG5cdHZhciBpID0gMCwgcmVuZGVySW50ZXJsYWNlZEdyaWQgPSB0cnVlO1xuXG5cdGlmICgodGhpcy5fcG9zaXRpb24gPT09IFwiYm90dG9tXCIgfHwgdGhpcy5fcG9zaXRpb24gPT09IFwidG9wXCIpICYmIHRoaXMuaW50ZXJsYWNlZENvbG9yKSB7XG5cblx0XHRjdHguZmlsbFN0eWxlID0gdGhpcy5pbnRlcmxhY2VkQ29sb3I7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5fbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdGlmICh0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0aWYgKHJlbmRlckludGVybGFjZWRHcmlkKSB7Ly9TbyB0aGF0IHRoZSBpbnRlcmxhY2VkIGNvbG9yIGFsdGVybmF0ZXNcblx0XHRcdFx0aW50ZXJsYWNlZEdyaWRTdGFydFBvaW50ID0gdGhpcy5nZXRQaXhlbENvb3JkaW5hdGVzT25BeGlzKHRoaXMuX2xhYmVsc1tpXS5wb3NpdGlvbik7XG5cblx0XHRcdFx0aWYgKGkgKyAxID49IHRoaXMuX2xhYmVscy5sZW5ndGggLSAxKVxuXHRcdFx0XHRcdGludGVybGFjZWRHcmlkRW5kUG9pbnQgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXModGhpcy52aWV3cG9ydE1heGltdW0pO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0aW50ZXJsYWNlZEdyaWRFbmRQb2ludCA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyh0aGlzLl9sYWJlbHNbaSArIDFdLnBvc2l0aW9uKTtcblxuXHRcdFx0XHRjdHguZmlsbFJlY3QoaW50ZXJsYWNlZEdyaWRTdGFydFBvaW50LngsIHBsb3RBcmVhQ29vcmRpbmF0ZXMueTEsIE1hdGguYWJzKGludGVybGFjZWRHcmlkRW5kUG9pbnQueCAtIGludGVybGFjZWRHcmlkU3RhcnRQb2ludC54KSwgTWF0aC5hYnMocGxvdEFyZWFDb29yZGluYXRlcy55MSAtIHBsb3RBcmVhQ29vcmRpbmF0ZXMueTIpKTtcblx0XHRcdFx0cmVuZGVySW50ZXJsYWNlZEdyaWQgPSBmYWxzZTtcblx0XHRcdH0gZWxzZVxuXHRcdFx0XHRyZW5kZXJJbnRlcmxhY2VkR3JpZCA9IHRydWU7XG5cblx0XHR9XG5cblx0fSBlbHNlIGlmICgodGhpcy5fcG9zaXRpb24gPT09IFwibGVmdFwiIHx8IHRoaXMuX3Bvc2l0aW9uID09PSBcInJpZ2h0XCIpICYmIHRoaXMuaW50ZXJsYWNlZENvbG9yKSB7XG5cblx0XHRjdHguZmlsbFN0eWxlID0gdGhpcy5pbnRlcmxhY2VkQ29sb3I7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5fbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0ICAgICAgICBpZiAodGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZSlcblx0XHQgICAgICAgICAgICBjb250aW51ZTtcblxuXHRcdFx0aWYgKHJlbmRlckludGVybGFjZWRHcmlkKSB7Ly9TbyB0aGF0IHRoZSBpbnRlcmxhY2VkIGNvbG9yIGFsdGVybmF0ZXNcblxuXHRcdFx0XHRpbnRlcmxhY2VkR3JpZEVuZFBvaW50ID0gdGhpcy5nZXRQaXhlbENvb3JkaW5hdGVzT25BeGlzKHRoaXMuX2xhYmVsc1tpXS5wb3NpdGlvbik7XG5cblx0XHRcdFx0aWYgKGkgKyAxID49IHRoaXMuX2xhYmVscy5sZW5ndGggLSAxKVxuXHRcdFx0XHRcdGludGVybGFjZWRHcmlkU3RhcnRQb2ludCA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyh0aGlzLnZpZXdwb3J0TWF4aW11bSk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRpbnRlcmxhY2VkR3JpZFN0YXJ0UG9pbnQgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXModGhpcy5fbGFiZWxzW2kgKyAxXS5wb3NpdGlvbik7XG5cblx0XHRcdFx0Y3R4LmZpbGxSZWN0KHBsb3RBcmVhQ29vcmRpbmF0ZXMueDEsIGludGVybGFjZWRHcmlkU3RhcnRQb2ludC55LCBNYXRoLmFicyhwbG90QXJlYUNvb3JkaW5hdGVzLngxIC0gcGxvdEFyZWFDb29yZGluYXRlcy54MiksIE1hdGguYWJzKGludGVybGFjZWRHcmlkU3RhcnRQb2ludC55IC0gaW50ZXJsYWNlZEdyaWRFbmRQb2ludC55KSk7XG5cdFx0XHRcdHJlbmRlckludGVybGFjZWRHcmlkID0gZmFsc2U7XG5cdFx0XHR9IGVsc2Vcblx0XHRcdFx0cmVuZGVySW50ZXJsYWNlZEdyaWQgPSB0cnVlO1xuXHRcdH1cblx0XHQgICAgLy90aHJvdyBcIjEyM1wiO1xuXHR9XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xufVxuXG4vL1JlbmRlcnMgc3RyaXBMaW5lcyBvZiBnaXZlbiB0aGlja25lc3MgdHlwZS5cbkF4aXMucHJvdG90eXBlLnJlbmRlclN0cmlwTGluZXNPZlRoaWNrbmVzc1R5cGUgPSBmdW5jdGlvbiAodGhpY2tuZXNzVHlwZSkge1xuXG5cdGlmICghKHRoaXMuc3RyaXBMaW5lcyAmJiB0aGlzLnN0cmlwTGluZXMubGVuZ3RoID4gMCkgfHwgIXRoaWNrbmVzc1R5cGUpXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBfdGhpcyA9IHRoaXM7XG5cblx0dmFyIGkgPSAwO1xuXHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5zdHJpcExpbmVzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHR2YXIgc3RyaXBMaW5lID0gdGhpcy5zdHJpcExpbmVzW2ldO1xuXG5cdFx0aWYgKHN0cmlwTGluZS5fdGhpY2tuZXNzVHlwZSAhPT0gdGhpY2tuZXNzVHlwZSlcblx0XHRcdGNvbnRpbnVlO1xuXG5cblx0XHQvL1Nob3VsZCBiZSBza2lwcGVkIG9ubHkgaWYgdGhpY2tuZXNzVHlwZSBpcyBcInBpeGVsXCIuIElmIGl0IGlzIFwidmFsdWVcIiB0aGVuIGNsaXBwaW5nIGlzIGF1dG9tYXRpY2FsbHkgYXBwbGllZCBiZWZvcmUgY2FsbGluZy5cblx0XHRpZiAodGhpY2tuZXNzVHlwZSA9PT0gXCJwaXhlbFwiICYmIChzdHJpcExpbmUudmFsdWUgPCB0aGlzLnZpZXdwb3J0TWluaW11bSB8fCBzdHJpcExpbmUudmFsdWUgPiB0aGlzLnZpZXdwb3J0TWF4aW11bSkpXG5cdFx0XHRjb250aW51ZTtcblxuXHRcdGlmIChzdHJpcExpbmUuc2hvd09uVG9wKSB7XG5cdFx0XHR0aGlzLmNoYXJ0LmFkZEV2ZW50TGlzdGVuZXIoXCJkYXRhQW5pbWF0aW9uSXRlcmF0aW9uRW5kXCIsIHN0cmlwTGluZS5yZW5kZXIsIHN0cmlwTGluZSk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHN0cmlwTGluZS5yZW5kZXIoKTtcblx0fVxufTtcblxuQXhpcy5wcm90b3R5cGUucmVuZGVyR3JpZCA9IGZ1bmN0aW9uICgpIHtcblxuXHRpZiAoISh0aGlzLmdyaWRUaGlja25lc3MgJiYgdGhpcy5ncmlkVGhpY2tuZXNzID4gMCkpXG5cdFx0cmV0dXJuO1xuXG5cdC8vdmFyIGN0eCA9IHRoaXMuY2hhcnQucGxvdEFyZWEuY3R4O1xuXHR2YXIgY3R4ID0gdGhpcy5jaGFydC5jdHg7XG5cblx0dmFyIHh5O1xuXHR2YXIgcGxvdEFyZWFDb29yZGluYXRlcyA9IHRoaXMuY2hhcnQucGxvdEFyZWE7XG5cdHZhciBzdHJpcExpbmU7XG5cdHZhciB0ZW1wTGluZVdpZHRoLCB0ZW1wU3Ryb2tlU3R5bGU7XG5cdC8vcmV0dXJuO1xuXG5cdGN0eC5saW5lV2lkdGggPSB0aGlzLmdyaWRUaGlja25lc3M7XG5cdGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuZ3JpZENvbG9yO1xuXG5cdGlmIChjdHguc2V0TGluZURhc2gpIHtcblx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheSh0aGlzLmdyaWREYXNoVHlwZSwgdGhpcy5ncmlkVGhpY2tuZXNzKSk7XG5cdH1cblxuXG5cdGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJib3R0b21cIiB8fCB0aGlzLl9wb3NpdGlvbiA9PT0gXCJ0b3BcIikge1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IHRoaXMuX2xhYmVscy5sZW5ndGggJiYgIXRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmU7IGkrKykge1xuXG5cdFx0XHRpZiAodGhpcy5fbGFiZWxzW2ldLnBvc2l0aW9uIDwgdGhpcy52aWV3cG9ydE1pbmltdW0gfHwgdGhpcy5fbGFiZWxzW2ldLnBvc2l0aW9uID4gdGhpcy52aWV3cG9ydE1heGltdW0pXG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cblx0XHRcdHh5ID0gdGhpcy5nZXRQaXhlbENvb3JkaW5hdGVzT25BeGlzKHRoaXMuX2xhYmVsc1tpXS5wb3NpdGlvbik7XG5cblx0XHRcdHZhciBncmlkWCA9IChjdHgubGluZVdpZHRoICUgMiA9PT0gMSkgPyAoeHkueCA8PCAwKSArIC41IDogKHh5LnggPDwgMCk7XG5cblx0XHRcdGN0eC5tb3ZlVG8oZ3JpZFgsIHBsb3RBcmVhQ29vcmRpbmF0ZXMueTEgPDwgMCk7XG5cdFx0XHRjdHgubGluZVRvKGdyaWRYLCBwbG90QXJlYUNvb3JkaW5hdGVzLnkyIDw8IDApO1xuXG5cdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0fVxuXG5cdH1cblx0ZWxzZSBpZiAodGhpcy5fcG9zaXRpb24gPT09IFwibGVmdFwiIHx8IHRoaXMuX3Bvc2l0aW9uID09PSBcInJpZ2h0XCIpIHtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fbGFiZWxzLmxlbmd0aCAmJiAhdGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZTsgaSsrKSB7XG5cblx0XHRcdGlmIChpID09PSAwICYmIHRoaXMudHlwZSA9PT0gXCJheGlzWVwiICYmIHRoaXMuY2hhcnQuYXhpc1ggJiYgdGhpcy5jaGFydC5heGlzWC5saW5lVGhpY2tuZXNzKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0aWYgKHRoaXMuX2xhYmVsc1tpXS5wb3NpdGlvbiA8IHRoaXMudmlld3BvcnRNaW5pbXVtIHx8IHRoaXMuX2xhYmVsc1tpXS5wb3NpdGlvbiA+IHRoaXMudmlld3BvcnRNYXhpbXVtKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXG5cdFx0XHR4eSA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyh0aGlzLl9sYWJlbHNbaV0ucG9zaXRpb24pO1xuXG5cdFx0XHR2YXIgZ3JpZFkgPSAoY3R4LmxpbmVXaWR0aCAlIDIgPT09IDEpID8gKHh5LnkgPDwgMCkgKyAuNSA6ICh4eS55IDw8IDApO1xuXG5cdFx0XHRjdHgubW92ZVRvKHBsb3RBcmVhQ29vcmRpbmF0ZXMueDEgPDwgMCwgZ3JpZFkpO1xuXHRcdFx0Y3R4LmxpbmVUbyhwbG90QXJlYUNvb3JkaW5hdGVzLngyIDw8IDAsIGdyaWRZKTtcblxuXHRcdFx0Y3R4LnN0cm9rZSgpO1xuXHRcdH1cblxuXHR9XG59XG5cbkF4aXMucHJvdG90eXBlLnJlbmRlckF4aXNMaW5lID0gZnVuY3Rpb24gKCkge1xuXHQvL3ZhciBjdHggPSB0aGlzLmNoYXJ0LnBsb3RBcmVhLmN0eDtcblx0dmFyIGN0eCA9IHRoaXMuY2hhcnQuY3R4O1xuXG5cdGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJib3R0b21cIiB8fCB0aGlzLl9wb3NpdGlvbiA9PT0gXCJ0b3BcIikge1xuXHRcdGlmICh0aGlzLmxpbmVUaGlja25lc3MpIHtcblx0XHRcdGN0eC5saW5lV2lkdGggPSB0aGlzLmxpbmVUaGlja25lc3M7XG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmxpbmVDb2xvciA/IHRoaXMubGluZUNvbG9yIDogXCJibGFja1wiO1xuXG5cdFx0XHRpZiAoY3R4LnNldExpbmVEYXNoKSB7XG5cdFx0XHRcdGN0eC5zZXRMaW5lRGFzaChnZXRMaW5lRGFzaEFycmF5KHRoaXMubGluZURhc2hUeXBlLCB0aGlzLmxpbmVUaGlja25lc3MpKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGxpbmVZID0gKHRoaXMubGluZVRoaWNrbmVzcyAlIDIgPT09IDEpID8gKHRoaXMubGluZUNvb3JkaW5hdGVzLnkxIDw8IDApICsgLjUgOiAodGhpcy5saW5lQ29vcmRpbmF0ZXMueTEgPDwgMCk7XG5cblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGN0eC5tb3ZlVG8odGhpcy5saW5lQ29vcmRpbmF0ZXMueDEsIGxpbmVZKTtcblx0XHRcdGN0eC5saW5lVG8odGhpcy5saW5lQ29vcmRpbmF0ZXMueDIsIGxpbmVZKTtcblx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHR9XG5cblx0fSBlbHNlIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJsZWZ0XCIgfHwgdGhpcy5fcG9zaXRpb24gPT09IFwicmlnaHRcIikge1xuXHRcdGlmICh0aGlzLmxpbmVUaGlja25lc3MpIHtcblx0XHRcdGN0eC5saW5lV2lkdGggPSB0aGlzLmxpbmVUaGlja25lc3M7XG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmxpbmVDb2xvcjtcblxuXHRcdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheSh0aGlzLmxpbmVEYXNoVHlwZSwgdGhpcy5saW5lVGhpY2tuZXNzKSk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBsaW5lWCA9ICh0aGlzLmxpbmVUaGlja25lc3MgJSAyID09PSAxKSA/ICh0aGlzLmxpbmVDb29yZGluYXRlcy54MSA8PCAwKSArIC41IDogKHRoaXMubGluZUNvb3JkaW5hdGVzLngxIDw8IDApO1xuXG5cdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRjdHgubW92ZVRvKGxpbmVYLCB0aGlzLmxpbmVDb29yZGluYXRlcy55MSk7XG5cdFx0XHRjdHgubGluZVRvKGxpbmVYLCB0aGlzLmxpbmVDb29yZGluYXRlcy55Mik7XG5cdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0fVxuXHR9XG59XG5cbkF4aXMucHJvdG90eXBlLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0dmFyIHh5ID0ge1xuXHR9O1xuXHR2YXIgd2lkdGggPSB0aGlzLmxpbmVDb29yZGluYXRlcy53aWR0aDtcblx0dmFyIGhlaWdodCA9IHRoaXMubGluZUNvb3JkaW5hdGVzLmhlaWdodDtcblxuXHRpZiAodGhpcy5fcG9zaXRpb24gPT09IFwiYm90dG9tXCIgfHwgdGhpcy5fcG9zaXRpb24gPT09IFwidG9wXCIpIHtcblx0XHQvL3ZhciBwaXhlbFBlclVuaXQgPSB3aWR0aCAvIE1hdGguYWJzKHRoaXMudmlld3BvcnRNYXhpbXVtIC0gdGhpcy52aWV3cG9ydE1pbmltdW0pO1xuXHRcdHZhciBwaXhlbFBlclVuaXQgPSB0aGlzLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdDtcblxuXHRcdC8veHkueCA9IHRoaXMubGluZUNvb3JkaW5hdGVzLngxICsgKHBpeGVsUGVyVW5pdCAqICh2YWx1ZSAtIHRoaXMudmlld3BvcnRNaW5pbXVtKSk7XG5cdFx0eHkueCA9IHRoaXMuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgKHBpeGVsUGVyVW5pdCAqICh2YWx1ZSAtIHRoaXMudmlld3BvcnRNaW5pbXVtKSk7XG5cdFx0eHkueSA9IHRoaXMubGluZUNvb3JkaW5hdGVzLnkxO1xuXHR9XG5cdGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJsZWZ0XCIgfHwgdGhpcy5fcG9zaXRpb24gPT09IFwicmlnaHRcIikge1xuXHRcdC8vdmFyIHBpeGVsUGVyVW5pdCA9IGhlaWdodCAvIE1hdGguYWJzKHRoaXMudmlld3BvcnRNYXhpbXVtIC0gdGhpcy52aWV3cG9ydE1pbmltdW0pO1xuXHRcdHZhciBwaXhlbFBlclVuaXQgPSAtdGhpcy5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQ7XG5cblx0XHQvL3h5LnkgPSB0aGlzLmxpbmVDb29yZGluYXRlcy55MiAtIChwaXhlbFBlclVuaXQgKiAodmFsdWUgLSB0aGlzLnZpZXdwb3J0TWluaW11bSkpO1xuXHRcdHh5LnkgPSB0aGlzLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSAtIChwaXhlbFBlclVuaXQgKiAodmFsdWUgLSB0aGlzLnZpZXdwb3J0TWluaW11bSkpO1xuXHRcdHh5LnggPSB0aGlzLmxpbmVDb29yZGluYXRlcy54Mjtcblx0fVxuXG5cdHJldHVybiB4eTtcbn1cblxuQXhpcy5wcm90b3R5cGUuY29udmVydFBpeGVsVG9WYWx1ZSA9IGZ1bmN0aW9uIChwaXhlbCkge1xuXG5cdGlmICghcGl4ZWwpXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0dmFyIHZhbHVlID0gMDtcblx0dmFyIHAgPSAodGhpcy5fcG9zaXRpb24gPT09IFwibGVmdFwiIHx8IHRoaXMuX3Bvc2l0aW9uID09PSBcInJpZ2h0XCIpID8gcGl4ZWwueSA6IHBpeGVsLng7XG5cblx0dmFsdWUgPSB0aGlzLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0gKyAocCAtIHRoaXMuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlKSAvIHRoaXMuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0O1xuXG5cdHJldHVybiB2YWx1ZTtcbn1cblxuQXhpcy5wcm90b3R5cGUuc2V0Vmlld1BvcnRSYW5nZSA9IGZ1bmN0aW9uICh2aWV3cG9ydE1pbmltdW0sIHZpZXdwb3J0TWF4aW11bSkge1xuXG5cdHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5uZXdWaWV3cG9ydE1pbmltdW0gPSB0aGlzLnZpZXdwb3J0TWluaW11bSA9IE1hdGgubWluKHZpZXdwb3J0TWluaW11bSwgdmlld3BvcnRNYXhpbXVtKTtcblx0dGhpcy5zZXNzaW9uVmFyaWFibGVzLm5ld1ZpZXdwb3J0TWF4aW11bSA9IHRoaXMudmlld3BvcnRNYXhpbXVtID0gTWF0aC5tYXgodmlld3BvcnRNaW5pbXVtLCB2aWV3cG9ydE1heGltdW0pO1xuXG59XG5cbkF4aXMucHJvdG90eXBlLmdldFhWYWx1ZUF0ID0gZnVuY3Rpb24gKHBpeGVsKSB7XG5cdGlmICghcGl4ZWwpXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0dmFyIHh2YWwgPSBudWxsO1xuXG5cdGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJsZWZ0XCIpIHtcblx0XHR4dmFsID0gKHRoaXMuY2hhcnQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gdGhpcy5jaGFydC5heGlzWC52aWV3cG9ydE1pbmltdW0pIC8gdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMuaGVpZ2h0ICogKCh0aGlzLmNoYXJ0LmF4aXNYLmxpbmVDb29yZGluYXRlcy55MiAtIHBpeGVsLnkpKSArIHRoaXMuY2hhcnQuYXhpc1gudmlld3BvcnRNaW5pbXVtO1xuXHR9XG5cdGVsc2UgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSBcImJvdHRvbVwiKSB7XG5cdFx0eHZhbCA9ICh0aGlzLmNoYXJ0LmF4aXNYLnZpZXdwb3J0TWF4aW11bSAtIHRoaXMuY2hhcnQuYXhpc1gudmlld3BvcnRNaW5pbXVtKSAvIHRoaXMuY2hhcnQuYXhpc1gubGluZUNvb3JkaW5hdGVzLndpZHRoICogKHBpeGVsLnggLSB0aGlzLmNoYXJ0LmF4aXNYLmxpbmVDb29yZGluYXRlcy54MSkgKyB0aGlzLmNoYXJ0LmF4aXNYLnZpZXdwb3J0TWluaW11bTtcblx0fVxuXG5cdHJldHVybiB4dmFsO1xufVxuXG5BeGlzLnByb3RvdHlwZS5jYWxjdWxhdGVWYWx1ZVRvUGl4ZWxDb252ZXJzaW9uUGFyYW1ldGVycyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHR0aGlzLnJldmVyc2VkID0gZmFsc2U7XG5cblx0dmFyIGNvbnZlcnNpb25QYXJhbWV0ZXJzID0ge1xuXHRcdHBpeGVsUGVyVW5pdDogbnVsbCwgbWluaW11bTogbnVsbCwgcmVmZXJlbmNlOiBudWxsXG5cdH07XG5cblx0dmFyIHdpZHRoID0gdGhpcy5saW5lQ29vcmRpbmF0ZXMud2lkdGg7XG5cdHZhciBoZWlnaHQgPSB0aGlzLmxpbmVDb29yZGluYXRlcy5oZWlnaHQ7XG5cblx0Y29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSA9IHRoaXMudmlld3BvcnRNaW5pbXVtO1xuXG5cdGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJib3R0b21cIiB8fCB0aGlzLl9wb3NpdGlvbiA9PT0gXCJ0b3BcIikge1xuXHRcdGNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA9ICh0aGlzLnJldmVyc2VkID8gLTEgOiAxKSAqIHdpZHRoIC8gTWF0aC5hYnModGhpcy52aWV3cG9ydE1heGltdW0gLSB0aGlzLnZpZXdwb3J0TWluaW11bSk7XG5cdFx0Y29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlID0gKHRoaXMucmV2ZXJzZWQgPyB0aGlzLmxpbmVDb29yZGluYXRlcy54MiA6IHRoaXMubGluZUNvb3JkaW5hdGVzLngxKTtcblx0fVxuXG5cdGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJsZWZ0XCIgfHwgdGhpcy5fcG9zaXRpb24gPT09IFwicmlnaHRcIikge1xuXHRcdGNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA9ICh0aGlzLnJldmVyc2VkID8gMSA6IC0xKSAqIGhlaWdodCAvIE1hdGguYWJzKHRoaXMudmlld3BvcnRNYXhpbXVtIC0gdGhpcy52aWV3cG9ydE1pbmltdW0pO1xuXHRcdGNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSA9ICh0aGlzLnJldmVyc2VkID8gdGhpcy5saW5lQ29vcmRpbmF0ZXMueTEgOiB0aGlzLmxpbmVDb29yZGluYXRlcy55Mik7XG5cdH1cblxuXG5cdHRoaXMuY29udmVyc2lvblBhcmFtZXRlcnMgPSBjb252ZXJzaW9uUGFyYW1ldGVycztcbn1cblxuQXhpcy5wcm90b3R5cGUuY2FsY3VsYXRlQXhpc1BhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGZyZWVTcGFjZSA9IHRoaXMuY2hhcnQubGF5b3V0TWFuYWdlci5nZXRGcmVlU3BhY2UoKTtcblx0dmFyIGF2YWlsYWJsZVdpZHRoID0gMDtcblx0dmFyIGF2YWlsYWJsZUhlaWdodCA9IDA7XG5cdHZhciBpc0xlc3NUaGFuVHdvRGF0YVBvaW50cyA9IGZhbHNlO1xuXG5cdGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJib3R0b21cIiB8fCB0aGlzLl9wb3NpdGlvbiA9PT0gXCJ0b3BcIikge1xuXHRcdHRoaXMubWF4V2lkdGggPSBmcmVlU3BhY2Uud2lkdGg7XG5cdFx0dGhpcy5tYXhIZWlnaHQgPSBmcmVlU3BhY2UuaGVpZ2h0O1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMubWF4V2lkdGggPSBmcmVlU3BhY2UuaGVpZ2h0O1xuXHRcdHRoaXMubWF4SGVpZ2h0ID0gZnJlZVNwYWNlLndpZHRoO1xuXHR9XG5cblx0dmFyIG5vVGlja3MgPSB0aGlzLnR5cGUgPT09IFwiYXhpc1hcIiA/ICh0aGlzLm1heFdpZHRoIDwgNTAwID8gOCA6IE1hdGgubWF4KDYsIE1hdGguZmxvb3IodGhpcy5tYXhXaWR0aCAvIDYyKSkpIDogTWF0aC5tYXgoTWF0aC5mbG9vcih0aGlzLm1heFdpZHRoIC8gNDApLCAyKTtcblx0dmFyIG1pbiwgbWF4O1xuXHR2YXIgbWluRGlmZjtcblx0dmFyIHJhbmdlO1xuXHR2YXIgcmFuZ2VQYWRkaW5nID0gMDtcblxuXG5cdGlmICh0aGlzLnZpZXdwb3J0TWluaW11bSA9PT0gbnVsbCB8fCBpc05hTih0aGlzLnZpZXdwb3J0TWluaW11bSkpXG5cdFx0dGhpcy52aWV3cG9ydE1pbmltdW0gPSB0aGlzLm1pbmltdW07XG5cblx0aWYgKHRoaXMudmlld3BvcnRNYXhpbXVtID09PSBudWxsIHx8IGlzTmFOKHRoaXMudmlld3BvcnRNYXhpbXVtKSlcblx0XHR0aGlzLnZpZXdwb3J0TWF4aW11bSA9IHRoaXMubWF4aW11bTtcblxuXHRpZiAodGhpcy50eXBlID09PSBcImF4aXNYXCIpIHtcblx0XHRtaW4gPSAodGhpcy52aWV3cG9ydE1pbmltdW0gIT09IG51bGwpID8gdGhpcy52aWV3cG9ydE1pbmltdW0gOiB0aGlzLmRhdGFJbmZvLnZpZXdQb3J0TWluO1xuXHRcdG1heCA9ICh0aGlzLnZpZXdwb3J0TWF4aW11bSAhPT0gbnVsbCkgPyB0aGlzLnZpZXdwb3J0TWF4aW11bSA6IHRoaXMuZGF0YUluZm8udmlld1BvcnRNYXg7XG5cblx0XHRpZiAobWF4IC0gbWluID09PSAwKSB7XG5cdFx0XHRyYW5nZVBhZGRpbmcgPSB0eXBlb2YgKHRoaXMuX29wdGlvbnMuaW50ZXJ2YWwpID09PSBcInVuZGVmaW5lZFwiID8gLjQgOiB0aGlzLl9vcHRpb25zLmludGVydmFsO1xuXG5cdFx0XHRtYXggKz0gcmFuZ2VQYWRkaW5nO1xuXHRcdFx0bWluIC09IHJhbmdlUGFkZGluZztcblx0XHR9XG5cblx0XHRpZiAodGhpcy5kYXRhSW5mby5taW5EaWZmICE9PSBJbmZpbml0eSlcblx0XHRcdG1pbkRpZmYgPSB0aGlzLmRhdGFJbmZvLm1pbkRpZmY7XG5cdFx0ZWxzZSBpZiAobWF4IC0gbWluID4gMSkge1xuXHRcdFx0bWluRGlmZiA9IE1hdGguYWJzKG1heCAtIG1pbikgKiAuNTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRtaW5EaWZmID0gMTtcblxuXHRcdFx0aWYgKHRoaXMuY2hhcnQucGxvdEluZm8uYXhpc1hWYWx1ZVR5cGUgPT09IFwiZGF0ZVRpbWVcIilcblx0XHRcdFx0aXNMZXNzVGhhblR3b0RhdGFQb2ludHMgPSB0cnVlO1xuXHRcdH1cblxuXHR9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gXCJheGlzWVwiKSB7XG5cblx0XHQvL21pbiA9IHR5cGVvZiAodGhpcy5fb3B0aW9ucy52aWV3cG9ydE1pbmltdW0pID09PSBcInVuZGVmaW5lZFwiIHx8IHRoaXMuX29wdGlvbnMudmlld3BvcnRNaW5pbXVtID09PSBudWxsID8gdGhpcy5kYXRhSW5mby52aWV3UG9ydE1pbiA6IHRoaXMuX29wdGlvbnMudmlld3BvcnRNaW5pbXVtO1xuXHRcdC8vbWF4ID0gdHlwZW9mICh0aGlzLl9vcHRpb25zLnZpZXdwb3J0TWF4aW11bSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdGhpcy5fb3B0aW9ucy52aWV3cG9ydE1heGltdW0gPT09IG51bGwgPyB0aGlzLmRhdGFJbmZvLnZpZXdQb3J0TWF4IDogdGhpcy5fb3B0aW9ucy52aWV3cG9ydE1heGltdW07XG5cdFx0bWluID0gKHRoaXMudmlld3BvcnRNaW5pbXVtICE9PSBudWxsKSA/IHRoaXMudmlld3BvcnRNaW5pbXVtIDogdGhpcy5kYXRhSW5mby52aWV3UG9ydE1pbjtcblx0XHRtYXggPSAodGhpcy52aWV3cG9ydE1heGltdW0gIT09IG51bGwpID8gdGhpcy52aWV3cG9ydE1heGltdW0gOiB0aGlzLmRhdGFJbmZvLnZpZXdQb3J0TWF4O1xuXG5cdFx0aWYgKCFpc0Zpbml0ZShtaW4pICYmICFpc0Zpbml0ZShtYXgpKSB7XG5cdFx0XHRtYXggPSB0eXBlb2YgKHRoaXMuX29wdGlvbnMuaW50ZXJ2YWwpID09PSBcInVuZGVmaW5lZFwiID8gLUluZmluaXR5IDogdGhpcy5fb3B0aW9ucy5pbnRlcnZhbDtcblx0XHRcdG1pbiA9IDA7XG5cdFx0fSBlbHNlIGlmICghaXNGaW5pdGUobWluKSkge1xuXHRcdFx0bWluID0gbWF4O1xuXHRcdH0gZWxzZSBpZiAoIWlzRmluaXRlKG1heCkpIHtcblx0XHRcdG1heCA9IG1pbjtcblx0XHR9XG5cblx0XHRcdGlmIChtaW4gPT09IDAgJiYgbWF4ID09PSAwKSB7Ly8gV2hlbiBhbGwgZGF0YVBvaW50cyBhcmUgemVyb1xuXHRcdFx0XHRtYXggKz0gOTtcblx0XHRcdFx0bWluID0gMDtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKG1heCAtIG1pbiA9PT0gMCkgey8vIFdoZW4gdGhlcmUgaXMgb25seSBhIHNpbmdsZSBkYXRhUG9pbnQgb3Igd2hlbiBhbGwgZGF0YVBvaW50cyBoYXZlIHNhbWUgWSBWYWx1ZVxuXHRcdFx0XHRyYW5nZVBhZGRpbmcgPSBNYXRoLm1pbihNYXRoLmFicyhNYXRoLmFicyhtYXgpICogLjAxKSwgNSk7XG5cdFx0XHRcdG1heCArPSByYW5nZVBhZGRpbmc7XG5cdFx0XHRcdG1pbiAtPSByYW5nZVBhZGRpbmc7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChtaW4gPiBtYXgpIHtcblx0XHRcdFx0cmFuZ2VQYWRkaW5nID0gTWF0aC5taW4oTWF0aC5hYnMoTWF0aC5hYnMobWF4IC0gbWluKSAqIC4wMSksIDUpO1xuXG5cdFx0XHRcdGlmIChtYXggPj0gMClcblx0XHRcdFx0XHRtaW4gPSBtYXggLSByYW5nZVBhZGRpbmc7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRtYXggPSBtaW4gKyByYW5nZVBhZGRpbmc7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblxuXHRcdFx0XHRyYW5nZVBhZGRpbmcgPSBNYXRoLm1pbihNYXRoLmFicyhNYXRoLmFicyhtYXggLSBtaW4pICogLjAxKSwgLjA1KTtcblxuXHRcdFx0XHRpZiAobWF4ICE9PSAwKVxuXHRcdFx0XHRcdG1heCArPSByYW5nZVBhZGRpbmc7XG5cdFx0XHRcdGlmIChtaW4gIT09IDApXG5cdFx0XHRcdFx0bWluIC09IHJhbmdlUGFkZGluZztcblx0XHRcdH1cblxuXHRcdGlmICh0aGlzLmRhdGFJbmZvLm1pbkRpZmYgIT09IEluZmluaXR5KVxuXHRcdFx0bWluRGlmZiA9IHRoaXMuZGF0YUluZm8ubWluRGlmZjtcblx0XHRlbHNlIGlmIChtYXggLSBtaW4gPiAxKSB7XG5cdFx0XHRtaW5EaWZmID0gTWF0aC5hYnMobWF4IC0gbWluKSAqIC41O1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdG1pbkRpZmYgPSAxO1xuXHRcdH1cblxuXG5cdFx0Ly9BcHBseSBpbmNsdWRlWmVyb1xuXHRcdGlmICh0aGlzLmluY2x1ZGVaZXJvICYmICh0aGlzLnZpZXdwb3J0TWluaW11bSA9PT0gbnVsbCB8fCBpc05hTih0aGlzLnZpZXdwb3J0TWluaW11bSkpKSB7XG5cdFx0XHRpZiAobWluID4gMClcblx0XHRcdFx0bWluID0gMDtcblx0XHR9XG5cdFx0aWYgKHRoaXMuaW5jbHVkZVplcm8gJiYgKHRoaXMudmlld3BvcnRNYXhpbXVtID09PSBudWxsIHx8IGlzTmFOKHRoaXMudmlld3BvcnRNYXhpbXVtKSkpIHtcblx0XHRcdGlmIChtYXggPCAwKVxuXHRcdFx0XHRtYXggPSAwO1xuXHRcdH1cblx0fVxuXG5cdHJhbmdlID0gKGlzTmFOKHRoaXMudmlld3BvcnRNYXhpbXVtKSB8fCB0aGlzLnZpZXdwb3J0TWF4aW11bSA9PT0gbnVsbCA/IG1heCA6IHRoaXMudmlld3BvcnRNYXhpbXVtKSAtIChpc05hTih0aGlzLnZpZXdwb3J0TWluaW11bSkgfHwgdGhpcy52aWV3cG9ydE1pbmltdW0gPT09IG51bGwgPyBtaW4gOiB0aGlzLnZpZXdwb3J0TWluaW11bSk7XG5cblx0aWYgKHRoaXMudHlwZSA9PT0gXCJheGlzWFwiICYmIHRoaXMuY2hhcnQucGxvdEluZm8uYXhpc1hWYWx1ZVR5cGUgPT09IFwiZGF0ZVRpbWVcIikge1xuXG5cdFx0aWYgKCF0aGlzLmludGVydmFsVHlwZSkge1xuXG5cdFx0XHRpZiAocmFuZ2UgLyAoMSAqIDEpIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDE7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJtaWxsaXNlY29uZFwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvICgxICogMikgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMjtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcIm1pbGxpc2Vjb25kXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKDEgKiA1KSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSA1O1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoMSAqIDEwKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAxMDtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcIm1pbGxpc2Vjb25kXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKDEgKiAyMCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMjA7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJtaWxsaXNlY29uZFwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvICgxICogNTApIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDUwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoMSAqIDEwMCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMTAwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoMSAqIDIwMCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMjAwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoMSAqIDI1MCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMjUwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoMSAqIDMwMCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMzAwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoMSAqIDQwMCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gNDAwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoMSAqIDUwMCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gNTAwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLnNlY29uZER1cmF0aW9uICogMSkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMTtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcInNlY29uZFwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMuc2Vjb25kRHVyYXRpb24gKiAyKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAyO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwic2Vjb25kXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy5zZWNvbmREdXJhdGlvbiAqIDUpIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDU7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLnNlY29uZER1cmF0aW9uICogMTApIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDEwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwic2Vjb25kXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy5zZWNvbmREdXJhdGlvbiAqIDE1KSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAxNTtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcInNlY29uZFwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMuc2Vjb25kRHVyYXRpb24gKiAyMCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMjA7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLnNlY29uZER1cmF0aW9uICogMzApIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDMwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwic2Vjb25kXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy5taW51dGVEdXJhdGlvbiAqIDEpIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDE7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJtaW51dGVcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLm1pbnV0ZUR1cmF0aW9uICogMikgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMjtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcIm1pbnV0ZVwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMubWludXRlRHVyYXRpb24gKiA1KSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSA1O1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWludXRlXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy5taW51dGVEdXJhdGlvbiAqIDEwKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAxMDtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcIm1pbnV0ZVwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMubWludXRlRHVyYXRpb24gKiAxNSkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMTU7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJtaW51dGVcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLm1pbnV0ZUR1cmF0aW9uICogMjApIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDIwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWludXRlXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy5taW51dGVEdXJhdGlvbiAqIDMwKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAzMDtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcIm1pbnV0ZVwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMuaG91ckR1cmF0aW9uICogMSkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMTtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcImhvdXJcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLmhvdXJEdXJhdGlvbiAqIDIpIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDI7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJob3VyXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy5ob3VyRHVyYXRpb24gKiAzKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAzO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwiaG91clwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMuaG91ckR1cmF0aW9uICogNikgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gNjtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcImhvdXJcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLmRheUR1cmF0aW9uICogMSkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMTtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcImRheVwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMuZGF5RHVyYXRpb24gKiAyKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAyO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwiZGF5XCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy5kYXlEdXJhdGlvbiAqIDQpIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDQ7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJkYXlcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLndlZWtEdXJhdGlvbiAqIDEpIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDE7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJ3ZWVrXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy53ZWVrRHVyYXRpb24gKiAyKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAyO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwid2Vla1wiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMud2Vla0R1cmF0aW9uICogMykgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMztcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcIndlZWtcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLm1vbnRoRHVyYXRpb24gKiAxKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAxO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibW9udGhcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLm1vbnRoRHVyYXRpb24gKiAyKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAyO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibW9udGhcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLm1vbnRoRHVyYXRpb24gKiAzKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAzO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibW9udGhcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLm1vbnRoRHVyYXRpb24gKiA2KSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSA2O1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibW9udGhcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLnllYXJEdXJhdGlvbiAqIDEpIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDE7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJ5ZWFyXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy55ZWFyRHVyYXRpb24gKiAyKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAyO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwieWVhclwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMueWVhckR1cmF0aW9uICogNCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gNDtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcInllYXJcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSBNYXRoLmZsb29yKEF4aXMuZ2V0TmljZU51bWJlcihyYW5nZSAvIChub1RpY2tzIC0gMSksIHRydWUpIC8gY29uc3RhbnRzLnllYXJEdXJhdGlvbik7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJ5ZWFyXCI7XG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAodGhpcy52aWV3cG9ydE1pbmltdW0gPT09IG51bGwgfHwgaXNOYU4odGhpcy52aWV3cG9ydE1pbmltdW0pKVxuXHRcdFx0dGhpcy52aWV3cG9ydE1pbmltdW0gPSBtaW4gLSBtaW5EaWZmIC8gMjtcblxuXHRcdGlmICh0aGlzLnZpZXdwb3J0TWF4aW11bSA9PT0gbnVsbCB8fCBpc05hTih0aGlzLnZpZXdwb3J0TWF4aW11bSkpXG5cdFx0XHR0aGlzLnZpZXdwb3J0TWF4aW11bSA9IG1heCArIG1pbkRpZmYgLyAyO1xuXG5cblx0XHRpZiAoIXRoaXMudmFsdWVGb3JtYXRTdHJpbmcpIHtcblx0XHRcdGlmIChpc0xlc3NUaGFuVHdvRGF0YVBvaW50cykge1xuXHRcdFx0XHR0aGlzLnZhbHVlRm9ybWF0U3RyaW5nID0gXCJNTU0gREQgWVlZWSBISDptbVwiO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmludGVydmFsVHlwZSA9PT0gXCJ5ZWFyXCIpIHtcblx0XHRcdFx0dGhpcy52YWx1ZUZvcm1hdFN0cmluZyA9IFwiWVlZWVwiO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmludGVydmFsVHlwZSA9PT0gXCJtb250aFwiKSB7XG5cdFx0XHRcdHRoaXMudmFsdWVGb3JtYXRTdHJpbmcgPSBcIk1NTSBZWVlZXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuaW50ZXJ2YWxUeXBlID09PSBcIndlZWtcIikge1xuXHRcdFx0XHR0aGlzLnZhbHVlRm9ybWF0U3RyaW5nID0gXCJNTU0gREQgWVlZWVwiO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmludGVydmFsVHlwZSA9PT0gXCJkYXlcIikge1xuXHRcdFx0XHR0aGlzLnZhbHVlRm9ybWF0U3RyaW5nID0gXCJNTU0gREQgWVlZWVwiO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmludGVydmFsVHlwZSA9PT0gXCJob3VyXCIpIHtcblx0XHRcdFx0dGhpcy52YWx1ZUZvcm1hdFN0cmluZyA9IFwiaGg6bW0gVFRcIjtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5pbnRlcnZhbFR5cGUgPT09IFwibWludXRlXCIpIHtcblx0XHRcdFx0dGhpcy52YWx1ZUZvcm1hdFN0cmluZyA9IFwiaGg6bW0gVFRcIjtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5pbnRlcnZhbFR5cGUgPT09IFwic2Vjb25kXCIpIHtcblx0XHRcdFx0dGhpcy52YWx1ZUZvcm1hdFN0cmluZyA9IFwiaGg6bW06c3MgVFRcIjtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5pbnRlcnZhbFR5cGUgPT09IFwibWlsbGlzZWNvbmRcIikge1xuXHRcdFx0XHR0aGlzLnZhbHVlRm9ybWF0U3RyaW5nID0gXCJmZmYnbXMnXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibnVtYmVyXCI7XG5cblx0XHRyYW5nZSA9IEF4aXMuZ2V0TmljZU51bWJlcihyYW5nZSwgZmFsc2UpO1xuXG5cdFx0aWYgKHRoaXMuX29wdGlvbnMgJiYgdGhpcy5fb3B0aW9ucy5pbnRlcnZhbClcblx0XHRcdHRoaXMuaW50ZXJ2YWwgPSB0aGlzLl9vcHRpb25zLmludGVydmFsO1xuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5pbnRlcnZhbCA9IEF4aXMuZ2V0TmljZU51bWJlcihyYW5nZSAvIChub1RpY2tzIC0gMSksIHRydWUpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnZpZXdwb3J0TWluaW11bSA9PT0gbnVsbCB8fCBpc05hTih0aGlzLnZpZXdwb3J0TWluaW11bSkpIHtcblx0XHRcdGlmICh0aGlzLnR5cGUgPT09IFwiYXhpc1hcIilcblx0XHRcdFx0dGhpcy52aWV3cG9ydE1pbmltdW0gPSBtaW4gLSBtaW5EaWZmIC8gMjtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy52aWV3cG9ydE1pbmltdW0gPSBNYXRoLmZsb29yKG1pbiAvIHRoaXMuaW50ZXJ2YWwpICogdGhpcy5pbnRlcnZhbDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy52aWV3cG9ydE1heGltdW0gPT09IG51bGwgfHwgaXNOYU4odGhpcy52aWV3cG9ydE1heGltdW0pKSB7XG5cdFx0XHRpZiAodGhpcy50eXBlID09PSBcImF4aXNYXCIpXG5cdFx0XHRcdHRoaXMudmlld3BvcnRNYXhpbXVtID0gbWF4ICsgbWluRGlmZiAvIDI7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMudmlld3BvcnRNYXhpbXVtID0gTWF0aC5jZWlsKG1heCAvIHRoaXMuaW50ZXJ2YWwpICogdGhpcy5pbnRlcnZhbDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy52aWV3cG9ydE1heGltdW0gPT09IDAgJiYgdGhpcy52aWV3cG9ydE1pbmltdW0gPT09IDApIHtcblxuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMudmlld3BvcnRNaW5pbXVtID09PSAwKSB7XG5cdFx0XHRcdHRoaXMudmlld3BvcnRNYXhpbXVtICs9IDEwO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAodGhpcy5fb3B0aW9ucy52aWV3cG9ydE1heGltdW0gPT09IDApIHtcblx0XHRcdFx0dGhpcy52aWV3cG9ydE1pbmltdW0gLT0gMTA7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLl9vcHRpb25zICYmIHR5cGVvZiAodGhpcy5fb3B0aW9ucy5pbnRlcnZhbCkgPT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IEF4aXMuZ2V0TmljZU51bWJlcigodGhpcy52aWV3cG9ydE1heGltdW0gLSB0aGlzLnZpZXdwb3J0TWluaW11bSkgLyAobm9UaWNrcyAtIDEpLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvL0NhbGN1bGF0ZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgdXNlclxuXHRpZiAodGhpcy5taW5pbXVtID09PSBudWxsIHx8IHRoaXMubWF4aW11bSA9PT0gbnVsbCkge1xuXHRcdGlmICh0aGlzLnR5cGUgPT09IFwiYXhpc1hcIikge1xuXHRcdFx0bWluID0gKHRoaXMubWluaW11bSAhPT0gbnVsbCkgPyB0aGlzLm1pbmltdW0gOiB0aGlzLmRhdGFJbmZvLm1pbjtcblx0XHRcdG1heCA9ICh0aGlzLm1heGltdW0gIT09IG51bGwpID8gdGhpcy5tYXhpbXVtIDogdGhpcy5kYXRhSW5mby5tYXg7XG5cblx0XHRcdGlmIChtYXggLSBtaW4gPT09IDApIHtcblx0XHRcdFx0cmFuZ2VQYWRkaW5nID0gdHlwZW9mICh0aGlzLl9vcHRpb25zLmludGVydmFsKSA9PT0gXCJ1bmRlZmluZWRcIiA/IC40IDogdGhpcy5fb3B0aW9ucy5pbnRlcnZhbDtcblxuXHRcdFx0XHRtYXggKz0gcmFuZ2VQYWRkaW5nO1xuXHRcdFx0XHRtaW4gLT0gcmFuZ2VQYWRkaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5kYXRhSW5mby5taW5EaWZmICE9PSBJbmZpbml0eSlcblx0XHRcdFx0bWluRGlmZiA9IHRoaXMuZGF0YUluZm8ubWluRGlmZjtcblx0XHRcdGVsc2UgaWYgKG1heCAtIG1pbiA+IDEpIHtcblx0XHRcdFx0bWluRGlmZiA9IE1hdGguYWJzKG1heCAtIG1pbikgKiAuNTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRtaW5EaWZmID0gMTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAodGhpcy50eXBlID09PSBcImF4aXNZXCIpIHtcblxuXHRcdFx0bWluID0gKHRoaXMubWluaW11bSAhPT0gbnVsbCkgPyB0aGlzLm1pbmltdW0gOiB0aGlzLmRhdGFJbmZvLm1pbjtcblx0XHRcdG1heCA9ICh0aGlzLm1heGltdW0gIT09IG51bGwpID8gdGhpcy5tYXhpbXVtIDogdGhpcy5kYXRhSW5mby5tYXg7XG5cblx0XHRcdGlmICghaXNGaW5pdGUobWluKSAmJiAhaXNGaW5pdGUobWF4KSkge1xuXHRcdFx0XHRtYXggPSB0eXBlb2YgKHRoaXMuX29wdGlvbnMuaW50ZXJ2YWwpID09PSBcInVuZGVmaW5lZFwiID8gLUluZmluaXR5IDogdGhpcy5fb3B0aW9ucy5pbnRlcnZhbDtcblx0XHRcdFx0bWluID0gMDtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0aWYgKG1pbiA9PT0gMCAmJiBtYXggPT09IDApIHsvLyBXaGVuIGFsbCBkYXRhUG9pbnRzIGFyZSB6ZXJvXG5cdFx0XHRcdFx0bWF4ICs9IDk7XG5cdFx0XHRcdFx0bWluID0gMDtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmIChtYXggLSBtaW4gPT09IDApIHsvLyBXaGVuIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgZGF0YVBvaW50IG9yIHdoZW4gYWxsIGRhdGFQb2ludHMgaGF2ZSBzYW1lIFkgVmFsdWVcblx0XHRcdFx0XHRyYW5nZVBhZGRpbmcgPSBNYXRoLm1pbihNYXRoLmFicyhNYXRoLmFicyhtYXgpICogLjAxKSwgNSk7XG5cdFx0XHRcdFx0bWF4ICs9IHJhbmdlUGFkZGluZztcblx0XHRcdFx0XHRtaW4gLT0gcmFuZ2VQYWRkaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKG1pbiA+IG1heCkge1xuXHRcdFx0XHRcdHJhbmdlUGFkZGluZyA9IE1hdGgubWluKE1hdGguYWJzKE1hdGguYWJzKG1heCAtIG1pbikgKiAuMDEpLCA1KTtcblxuXHRcdFx0XHRcdGlmIChtYXggPj0gMClcblx0XHRcdFx0XHRcdG1pbiA9IG1heCAtIHJhbmdlUGFkZGluZztcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRtYXggPSBtaW4gKyByYW5nZVBhZGRpbmc7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cblx0XHRcdFx0XHRyYW5nZVBhZGRpbmcgPSBNYXRoLm1pbihNYXRoLmFicyhNYXRoLmFicyhtYXggLSBtaW4pICogLjAxKSwgLjA1KTtcblxuXHRcdFx0XHRcdGlmIChtYXggIT09IDApXG5cdFx0XHRcdFx0XHRtYXggKz0gcmFuZ2VQYWRkaW5nO1xuXHRcdFx0XHRcdGlmIChtaW4gIT09IDApXG5cdFx0XHRcdFx0XHRtaW4gLT0gcmFuZ2VQYWRkaW5nO1xuXHRcdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmRhdGFJbmZvLm1pbkRpZmYgIT09IEluZmluaXR5KVxuXHRcdFx0XHRtaW5EaWZmID0gdGhpcy5kYXRhSW5mby5taW5EaWZmO1xuXHRcdFx0ZWxzZSBpZiAobWF4IC0gbWluID4gMSkge1xuXHRcdFx0XHRtaW5EaWZmID0gTWF0aC5hYnMobWF4IC0gbWluKSAqIC41O1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdG1pbkRpZmYgPSAxO1xuXHRcdFx0fVxuXG5cblx0XHRcdC8vQXBwbHkgaW5jbHVkZVplcm9cblx0XHRcdGlmICh0aGlzLmluY2x1ZGVaZXJvICYmICh0aGlzLm1pbmltdW0gPT09IG51bGwgfHwgaXNOYU4odGhpcy5taW5pbXVtKSkpIHtcblx0XHRcdFx0aWYgKG1pbiA+IDApXG5cdFx0XHRcdFx0bWluID0gMDtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmluY2x1ZGVaZXJvICYmICh0aGlzLm1heGltdW0gPT09IG51bGwgfHwgaXNOYU4odGhpcy5tYXhpbXVtKSkpIHtcblx0XHRcdFx0aWYgKG1heCA8IDApXG5cdFx0XHRcdFx0bWF4ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyYW5nZSA9IG1heCAtIG1pbjtcblxuXHRcdGlmICh0aGlzLnR5cGUgPT09IFwiYXhpc1hcIiAmJiB0aGlzLmNoYXJ0LnBsb3RJbmZvLmF4aXNYVmFsdWVUeXBlID09PSBcImRhdGVUaW1lXCIpIHtcblxuXHRcdFx0aWYgKHRoaXMubWluaW11bSA9PT0gbnVsbCB8fCBpc05hTih0aGlzLm1pbmltdW0pKVxuXHRcdFx0XHR0aGlzLm1pbmltdW0gPSBtaW4gLSBtaW5EaWZmIC8gMjtcblxuXHRcdFx0aWYgKHRoaXMubWF4aW11bSA9PT0gbnVsbCB8fCBpc05hTih0aGlzLm1heGltdW0pKVxuXHRcdFx0XHR0aGlzLm1heGltdW0gPSBtYXggKyBtaW5EaWZmIC8gMjtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJudW1iZXJcIjtcblxuXHRcdFx0aWYgKHRoaXMubWluaW11bSA9PT0gbnVsbCkge1xuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSBcImF4aXNYXCIpXG5cdFx0XHRcdFx0dGhpcy5taW5pbXVtID0gbWluIC0gbWluRGlmZiAvIDI7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5taW5pbXVtID0gTWF0aC5mbG9vcihtaW4gLyB0aGlzLmludGVydmFsKSAqIHRoaXMuaW50ZXJ2YWw7XG5cblx0XHRcdFx0dGhpcy5taW5pbXVtID0gTWF0aC5taW4odGhpcy5taW5pbXVtLCB0aGlzLnNlc3Npb25WYXJpYWJsZXMudmlld3BvcnRNaW5pbXVtID09PSBudWxsIHx8IGlzTmFOKHRoaXMuc2Vzc2lvblZhcmlhYmxlcy52aWV3cG9ydE1pbmltdW0pID8gSW5maW5pdHkgOiB0aGlzLnNlc3Npb25WYXJpYWJsZXMudmlld3BvcnRNaW5pbXVtKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMubWF4aW11bSA9PT0gbnVsbCkge1xuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSBcImF4aXNYXCIpXG5cdFx0XHRcdFx0dGhpcy5tYXhpbXVtID0gbWF4ICsgbWluRGlmZiAvIDI7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5tYXhpbXVtID0gTWF0aC5jZWlsKG1heCAvIHRoaXMuaW50ZXJ2YWwpICogdGhpcy5pbnRlcnZhbDtcblxuXHRcdFx0XHR0aGlzLm1heGltdW0gPSBNYXRoLm1heCh0aGlzLm1heGltdW0sIHRoaXMuc2Vzc2lvblZhcmlhYmxlcy52aWV3cG9ydE1heGltdW0gPT09IG51bGwgfHwgaXNOYU4odGhpcy5zZXNzaW9uVmFyaWFibGVzLnZpZXdwb3J0TWF4aW11bSkgPyAtSW5maW5pdHkgOiB0aGlzLnNlc3Npb25WYXJpYWJsZXMudmlld3BvcnRNYXhpbXVtKTtcblx0XHRcdH1cblxuXHRcdC8vdmFyIG5mcmFjID0gTWF0aC5tYXgoLU1hdGguZmxvb3IoTWF0aC5sb2coZCkvTWF0aC5MTjEwKSwgMCk7IC8vbnVtYmVyIG9mIGZyYWN0aW9uYWwgZGlnaXRzIHRvIHNob3dcblxuXG5cdFx0aWYgKHRoaXMubWF4aW11bSA9PT0gMCAmJiB0aGlzLm1pbmltdW0gPT09IDApIHtcblxuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMubWluaW11bSA9PT0gMCkge1xuXHRcdFx0XHR0aGlzLm1heGltdW0gKz0gMTA7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICh0aGlzLl9vcHRpb25zLm1heGltdW0gPT09IDApIHtcblx0XHRcdFx0dGhpcy5taW5pbXVtIC09IDEwO1xuXHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHR0aGlzLnZpZXdwb3J0TWluaW11bSA9IE1hdGgubWF4KHRoaXMudmlld3BvcnRNaW5pbXVtLCB0aGlzLm1pbmltdW0pO1xuXHR0aGlzLnZpZXdwb3J0TWF4aW11bSA9IE1hdGgubWluKHRoaXMudmlld3BvcnRNYXhpbXVtLCB0aGlzLm1heGltdW0pO1xuXG5cdGlmICh0aGlzLnR5cGUgPT09IFwiYXhpc1hcIiAmJiB0aGlzLmNoYXJ0LnBsb3RJbmZvLmF4aXNYVmFsdWVUeXBlID09PSBcImRhdGVUaW1lXCIpXG5cdFx0dGhpcy5pbnRlcnZhbFN0YXJ0UG9zaXRpb24gPSB0aGlzLmdldExhYmVsU3RhcnRQb2ludChuZXcgRGF0ZSh0aGlzLnZpZXdwb3J0TWluaW11bSksIHRoaXMuaW50ZXJ2YWxUeXBlLCB0aGlzLmludGVydmFsKTtcblx0ZWxzZVxuXHRcdHRoaXMuaW50ZXJ2YWxTdGFydFBvc2l0aW9uID0gTWF0aC5mbG9vcigodGhpcy52aWV3cG9ydE1pbmltdW0gKyAodGhpcy5pbnRlcnZhbCAqIC4yKSkgLyB0aGlzLmludGVydmFsKSAqIHRoaXMuaW50ZXJ2YWw7XG5cblx0Ly9TZXQgdmFsdWVGb3JtYXRTdHJpbmdcblx0aWYgKCF0aGlzLnZhbHVlRm9ybWF0U3RyaW5nKSB7XG5cdFx0dGhpcy52YWx1ZUZvcm1hdFN0cmluZyA9IFwiIywjIzAuIyNcIjtcblxuXHRcdHJhbmdlID0gTWF0aC5hYnModGhpcy52aWV3cG9ydE1heGltdW0gLSB0aGlzLnZpZXdwb3J0TWluaW11bSk7XG5cblx0XHRpZiAocmFuZ2UgPCAxKSB7XG5cdFx0XHR2YXIgbnVtYmVyT2ZEZWNpbWFscyA9IE1hdGguZmxvb3IoTWF0aC5hYnMoTWF0aC5sb2cocmFuZ2UpIC8gTWF0aC5MTjEwKSkgKyAyO1xuXG5cdFx0XHRpZiAoaXNOYU4obnVtYmVyT2ZEZWNpbWFscykgfHwgIWlzRmluaXRlKG51bWJlck9mRGVjaW1hbHMpKVxuXHRcdFx0XHRudW1iZXJPZkRlY2ltYWxzID0gMjtcblxuXHRcdFx0aWYgKG51bWJlck9mRGVjaW1hbHMgPiAyKSB7XG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbnVtYmVyT2ZEZWNpbWFscyAtIDI7IGkrKylcblx0XHRcdFx0XHR0aGlzLnZhbHVlRm9ybWF0U3RyaW5nICs9IFwiI1wiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHR9XG5cblx0Ly9pZiAoaXNEZWJ1Z01vZGUgJiYgd2luZG93LmNvbnNvbGUpIHtcblx0Ly8gICAgd2luZG93LmNvbnNvbGUubG9nKHRoaXMudHlwZSArIFwiOiBNaW4gPSBcIiArIHRoaXMudmlld3BvcnRNaW5pbXVtKTtcblx0Ly8gICAgd2luZG93LmNvbnNvbGUubG9nKHRoaXMudHlwZSArIFwiOiBNYXggPSBcIiArIHRoaXMudmlld3BvcnRNYXhpbXVtKTtcblx0Ly8gICAgd2luZG93LmNvbnNvbGUubG9nKHRoaXMudHlwZSArIFwiOiBJbnRlcnZhbCA9IFwiICsgdGhpcy5pbnRlcnZhbCk7XG5cdC8vfVxufVxuXG5BeGlzLmdldE5pY2VOdW1iZXIgPSBmdW5jdGlvbiAoeCwgcm91bmQpIHtcblxuXHR2YXIgZXhwID0gTWF0aC5mbG9vcihNYXRoLmxvZyh4KSAvIE1hdGguTE4xMCk7XG5cdHZhciBmID0geCAvIE1hdGgucG93KDEwLCBleHApO1xuXHR2YXIgbmY7XG5cblx0aWYgKHJvdW5kKSB7XG5cdFx0aWYgKGYgPCAxLjUpXG5cdFx0XHRuZiA9IDE7XG5cdFx0ZWxzZSBpZiAoZiA8IDMpXG5cdFx0XHRuZiA9IDI7XG5cdFx0ZWxzZSBpZiAoZiA8IDcpXG5cdFx0XHRuZiA9IDU7XG5cdFx0ZWxzZVxuXHRcdFx0bmYgPSAxMDtcblx0fVxuXHRlbHNlIHtcblx0XHRpZiAoZiA8PSAxKVxuXHRcdFx0bmYgPSAxO1xuXHRcdGVsc2UgaWYgKGYgPD0gMilcblx0XHRcdG5mID0gMjtcblx0XHRlbHNlIGlmIChmIDw9IDUpXG5cdFx0XHRuZiA9IDU7XG5cdFx0ZWxzZSBuZiA9IDEwO1xuXHR9XG5cblx0cmV0dXJuIE51bWJlcigobmYgKiBNYXRoLnBvdygxMCwgZXhwKSkudG9GaXhlZCgyMCkpO1xufVxuXG5BeGlzLnByb3RvdHlwZS5nZXRMYWJlbFN0YXJ0UG9pbnQgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGludGVydmFsSW5NaWxsaXNlY29uZHMgPSBjb252ZXJ0VG9OdW1iZXIodGhpcy5pbnRlcnZhbCwgdGhpcy5pbnRlcnZhbFR5cGUpO1xuXHR2YXIgbWluaW11bSA9IE1hdGguZmxvb3IoKHRoaXMudmlld3BvcnRNaW5pbXVtKSAvIGludGVydmFsSW5NaWxsaXNlY29uZHMpICogaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcztcblx0dmFyIGRhdGVUaW1lID0gbmV3IERhdGUobWluaW11bSk7XG5cblx0aWYgKHRoaXMuaW50ZXJ2YWxUeXBlID09PSBcIm1pbGxpc2Vjb25kXCIpIHtcblx0XHQvL21pbGxpc2Vjb25kID0gZGF0ZVRpbWUuZ2V0TWlsbGlTZWNvbmQoKTtcblx0XHQvL21pbGxpc2Vjb25kID0gTWF0aC5mbG9vcigobWlsbGlzZWNvbmQgKyB0aGlzLmludGVydmFsKSAvIHRoaXMuaW50ZXJ2YWwpICogdGhpcy5pbnRlcnZhbDtcblx0fVxuXHRlbHNlIGlmICh0aGlzLmludGVydmFsVHlwZSA9PT0gXCJzZWNvbmRcIikge1xuXHRcdGlmIChkYXRlVGltZS5nZXRNaWxsaXNlY29uZHMoKSA+IDApIHtcblx0XHRcdGRhdGVUaW1lLnNldFNlY29uZHMoZGF0ZVRpbWUuZ2V0U2Vjb25kcygpICsgMSk7XG5cdFx0XHRkYXRlVGltZS5zZXRNaWxsaXNlY29uZHMoMCk7XG5cdFx0fVxuXHR9XG5cdGVsc2UgaWYgKHRoaXMuaW50ZXJ2YWxUeXBlID09PSBcIm1pbnV0ZVwiKSB7XG5cdFx0aWYgKGRhdGVUaW1lLmdldFNlY29uZHMoKSA+IDAgfHwgZGF0ZVRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkgPiAwKSB7XG5cdFx0XHRkYXRlVGltZS5zZXRNaW51dGVzKGRhdGVUaW1lLmdldE1pbnV0ZXMoKSArIDEpO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0U2Vjb25kcygwKTtcblx0XHRcdGRhdGVUaW1lLnNldE1pbGxpc2Vjb25kcygwKTtcblx0XHR9XG5cdH1cblx0ZWxzZSBpZiAodGhpcy5pbnRlcnZhbFR5cGUgPT09IFwiaG91clwiKSB7XG5cdFx0aWYgKGRhdGVUaW1lLmdldE1pbnV0ZXMoKSA+IDAgfHwgZGF0ZVRpbWUuZ2V0U2Vjb25kcygpID4gMCB8fCBkYXRlVGltZS5nZXRNaWxsaXNlY29uZHMoKSA+IDApIHtcblx0XHRcdGRhdGVUaW1lLnNldEhvdXJzKGRhdGVUaW1lLmdldEhvdXJzKCkgKyAxKTtcblx0XHRcdGRhdGVUaW1lLnNldE1pbnV0ZXMoMCk7XG5cdFx0XHRkYXRlVGltZS5zZXRTZWNvbmRzKDApO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0TWlsbGlzZWNvbmRzKDApO1xuXHRcdH1cblx0fVxuXHRlbHNlIGlmICh0aGlzLmludGVydmFsVHlwZSA9PT0gXCJkYXlcIikge1xuXHRcdGlmIChkYXRlVGltZS5nZXRIb3VycygpID4gMCB8fCBkYXRlVGltZS5nZXRNaW51dGVzKCkgPiAwIHx8IGRhdGVUaW1lLmdldFNlY29uZHMoKSA+IDAgfHwgZGF0ZVRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkgPiAwKSB7XG5cdFx0XHRkYXRlVGltZS5zZXREYXRlKGRhdGVUaW1lLmdldERhdGUoKSArIDEpO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0SG91cnMoMCk7XG5cdFx0XHRkYXRlVGltZS5zZXRNaW51dGVzKDApO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0U2Vjb25kcygwKTtcblx0XHRcdGRhdGVUaW1lLnNldE1pbGxpc2Vjb25kcygwKTtcblx0XHR9XG5cdH1cblx0ZWxzZSBpZiAodGhpcy5pbnRlcnZhbFR5cGUgPT09IFwid2Vla1wiKSB7XG5cdFx0aWYgKGRhdGVUaW1lLmdldERheSgpID4gMCB8fCBkYXRlVGltZS5nZXRIb3VycygpID4gMCB8fCBkYXRlVGltZS5nZXRNaW51dGVzKCkgPiAwIHx8IGRhdGVUaW1lLmdldFNlY29uZHMoKSA+IDAgfHwgZGF0ZVRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkgPiAwKSB7XG5cdFx0XHRkYXRlVGltZS5zZXREYXRlKGRhdGVUaW1lLmdldERhdGUoKSArICg3IC0gZGF0ZVRpbWUuZ2V0RGF5KCkpKTtcblx0XHRcdGRhdGVUaW1lLnNldEhvdXJzKDApO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0TWludXRlcygwKTtcblx0XHRcdGRhdGVUaW1lLnNldFNlY29uZHMoMCk7XG5cdFx0XHRkYXRlVGltZS5zZXRNaWxsaXNlY29uZHMoMCk7XG5cdFx0fVxuXHR9XG5cdGVsc2UgaWYgKHRoaXMuaW50ZXJ2YWxUeXBlID09PSBcIm1vbnRoXCIpIHtcblx0XHRpZiAoZGF0ZVRpbWUuZ2V0RGF0ZSgpID4gMSB8fCBkYXRlVGltZS5nZXRIb3VycygpID4gMCB8fCBkYXRlVGltZS5nZXRNaW51dGVzKCkgPiAwIHx8IGRhdGVUaW1lLmdldFNlY29uZHMoKSA+IDAgfHwgZGF0ZVRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkgPiAwKSB7XG5cdFx0XHRkYXRlVGltZS5zZXRNb250aChkYXRlVGltZS5nZXRNb250aCgpICsgMSk7XG5cdFx0XHRkYXRlVGltZS5zZXREYXRlKDEpO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0SG91cnMoMCk7XG5cdFx0XHRkYXRlVGltZS5zZXRNaW51dGVzKDApO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0U2Vjb25kcygwKTtcblx0XHRcdGRhdGVUaW1lLnNldE1pbGxpc2Vjb25kcygwKTtcblx0XHR9XG5cdH1cblx0ZWxzZSBpZiAodGhpcy5pbnRlcnZhbFR5cGUgPT09IFwieWVhclwiKSB7XG5cdFx0aWYgKGRhdGVUaW1lLmdldE1vbnRoKCkgPiAwIHx8IGRhdGVUaW1lLmdldERhdGUoKSA+IDEgfHwgZGF0ZVRpbWUuZ2V0SG91cnMoKSA+IDAgfHwgZGF0ZVRpbWUuZ2V0TWludXRlcygpID4gMCB8fCBkYXRlVGltZS5nZXRTZWNvbmRzKCkgPiAwIHx8IGRhdGVUaW1lLmdldE1pbGxpc2Vjb25kcygpID4gMCkge1xuXHRcdFx0ZGF0ZVRpbWUuc2V0RnVsbFllYXIoZGF0ZVRpbWUuZ2V0RnVsbFllYXIoKSArIDEpO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0TW9udGgoMCk7XG5cdFx0XHRkYXRlVGltZS5zZXREYXRlKDEpO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0SG91cnMoMCk7XG5cdFx0XHRkYXRlVGltZS5zZXRNaW51dGVzKDApO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0U2Vjb25kcygwKTtcblx0XHRcdGRhdGVUaW1lLnNldE1pbGxpc2Vjb25kcygwKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZGF0ZVRpbWU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEF4aXM7XG4iLCJpbXBvcnQge3RoZW1lc30gZnJvbSAnLi4vY29uc3RhbnRzL3RoZW1lcyc7XG5pbXBvcnQge2lzRGVidWdNb2RlLCBkZWZhdWx0T3B0aW9uc30gZnJvbSAnLi4vY29uc3RhbnRzL29wdGlvbnMnO1xuXG5mdW5jdGlvbiBDYW52YXNKU09iamVjdChkZWZhdWx0c0tleSwgb3B0aW9ucywgdGhlbWUsIHBhcmVudCkge1xuICB0aGlzLl9kZWZhdWx0c0tleSA9IGRlZmF1bHRzS2V5O1xuXG4gIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXG4gIHRoaXMuX2V2ZW50TGlzdGVuZXJzID0gW107Ly9NdWx0aWRpbWVudGlvbmFsIGFycmF5IHdpdGggYW4gYXJyYXkgZm9yIGVhY2ggZXZlbnQgdHlwZVxuXG4gIHZhciBjdXJyZW50VGhlbWVPcHRpb25zID0ge307XG5cbiAgaWYgKHRoZW1lICYmIHRoZW1lc1t0aGVtZV0gJiYgdGhlbWVzW3RoZW1lXVtkZWZhdWx0c0tleV0pXG4gICAgY3VycmVudFRoZW1lT3B0aW9ucyA9IHRoZW1lc1t0aGVtZV1bZGVmYXVsdHNLZXldO1xuXG4gIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zID8gb3B0aW9ucyA6IHt9O1xuICB0aGlzLnNldE9wdGlvbnModGhpcy5fb3B0aW9ucywgY3VycmVudFRoZW1lT3B0aW9ucyk7XG59XG5cbkNhbnZhc0pTT2JqZWN0LnByb3RvdHlwZS5zZXRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMsIGN1cnJlbnRUaGVtZU9wdGlvbnMpIHtcblxuICBpZiAoIWRlZmF1bHRPcHRpb25zW3RoaXMuX2RlZmF1bHRzS2V5XSkge1xuICAgIGlmIChpc0RlYnVnTW9kZSAmJiB3aW5kb3cuY29uc29sZSlcbiAgICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdHMgbm90IHNldFwiKTtcbiAgfVxuICBlbHNlIHtcbiAgICB2YXIgZGVmYXVsdHMgPSBkZWZhdWx0T3B0aW9uc1t0aGlzLl9kZWZhdWx0c0tleV07XG5cbiAgICBmb3IgKHZhciBwcm9wIGluIGRlZmF1bHRzKSB7XG5cbiAgICAgIGlmIChkZWZhdWx0cy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgaWYgKG9wdGlvbnMgJiYgcHJvcCBpbiBvcHRpb25zKVxuICAgICAgICB0aGlzW3Byb3BdID0gb3B0aW9uc1twcm9wXTtcbiAgICAgIGVsc2UgaWYgKGN1cnJlbnRUaGVtZU9wdGlvbnMgJiYgcHJvcCBpbiBjdXJyZW50VGhlbWVPcHRpb25zKVxuICAgICAgICB0aGlzW3Byb3BdID0gY3VycmVudFRoZW1lT3B0aW9uc1twcm9wXTtcbiAgICAgIGVsc2UgdGhpc1twcm9wXSA9IGRlZmF1bHRzW3Byb3BdO1xuXG4gICAgICAvL2lmICh0eXBlb2YgdGhpc1twcm9wXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyAgICBhbGVydChcImZ1bmN0aW9uXCIpO1xuICAgICAgLy8gICAgdGhpc1twcm9wXSA9IHRoaXNbcHJvcF0oKTtcbiAgICAgIC8vfVxuICAgIH1cblxuICB9XG4gIH1cbn07XG5cbi8vIFVwZGF0ZSBvcHRpb25zLiBSZXR1cm5zIHRydWUgaWYgY2hhbmdlZCBvciBlbHNlIGZhbHNlXG5DYW52YXNKU09iamVjdC5wcm90b3R5cGUudXBkYXRlT3B0aW9uID0gZnVuY3Rpb24gKHByb3ApIHtcblxuICBpZiAoIWRlZmF1bHRPcHRpb25zW3RoaXMuX2RlZmF1bHRzS2V5XSAmJiBpc0RlYnVnTW9kZSAmJiB3aW5kb3cuY29uc29sZSlcbiAgICBjb25zb2xlLmxvZyhcImRlZmF1bHRzIG5vdCBzZXRcIik7XG5cbiAgdmFyIGRlZmF1bHRzID0gZGVmYXVsdE9wdGlvbnNbdGhpcy5fZGVmYXVsdHNLZXldO1xuICB2YXIgdGhlbWUgPSB0aGlzLl9vcHRpb25zLnRoZW1lID8gdGhpcy5fb3B0aW9ucy50aGVtZSA6ICh0aGlzLmNoYXJ0ICYmIHRoaXMuY2hhcnQuX29wdGlvbnMudGhlbWUpID8gdGhpcy5jaGFydC5fb3B0aW9ucy50aGVtZSA6IFwidGhlbWUxXCI7XG5cbiAgdmFyIGN1cnJlbnRUaGVtZU9wdGlvbnMgPSB7fTtcbiAgdmFyIG5ld1ZhbHVlID0gdGhpc1twcm9wXTtcblxuICBpZiAodGhlbWUgJiYgdGhlbWVzW3RoZW1lXSAmJiB0aGVtZXNbdGhlbWVdW3RoaXMuX2RlZmF1bHRzS2V5XSlcbiAgICBjdXJyZW50VGhlbWVPcHRpb25zID0gdGhlbWVzW3RoZW1lXVt0aGlzLl9kZWZhdWx0c0tleV07XG5cbiAgaWYgKHByb3AgaW4gZGVmYXVsdHMpIHtcbiAgICBpZiAocHJvcCBpbiB0aGlzLl9vcHRpb25zKVxuICAgICAgbmV3VmFsdWUgPSB0aGlzLl9vcHRpb25zW3Byb3BdO1xuICAgIGVsc2UgaWYgKGN1cnJlbnRUaGVtZU9wdGlvbnMgJiYgcHJvcCBpbiBjdXJyZW50VGhlbWVPcHRpb25zKVxuICAgICAgbmV3VmFsdWUgPSBjdXJyZW50VGhlbWVPcHRpb25zW3Byb3BdO1xuICAgIGVsc2UgbmV3VmFsdWUgPSBkZWZhdWx0c1twcm9wXTtcbiAgfVxuXG4gIGlmIChuZXdWYWx1ZSA9PT0gdGhpc1twcm9wXSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgdGhpc1twcm9wXSA9IG5ld1ZhbHVlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy9TdG9yZXMgdmFsdWVzIGluIF9vbGRPcHRpb25zIHNvIHRoYXQgaXQgY2FuIGJlIHRyYWNrZWQgZm9yIGFueSBjaGFuZ2VzXG5DYW52YXNKU09iamVjdC5wcm90b3R5cGUudHJhY2tDaGFuZ2VzID0gZnVuY3Rpb24gKG9wdGlvbikge1xuICBpZiAoIXRoaXMuc2Vzc2lvblZhcmlhYmxlcylcbiAgICB0aHJvdyBcIlNlc3Npb24gVmFyaWFibGUgU3RvcmUgbm90IHNldFwiO1xuXG4gIHRoaXMuc2Vzc2lvblZhcmlhYmxlc1tvcHRpb25dID0gdGhpcy5fb3B0aW9uc1tvcHRpb25dO1xufTtcblxuQ2FudmFzSlNPYmplY3QucHJvdG90eXBlLmlzQmVpbmdUcmFja2VkID0gZnVuY3Rpb24gKG9wdGlvbikge1xuICBpZiAoIXRoaXMuX29wdGlvbnMuX29sZE9wdGlvbnMpXG4gICAgdGhpcy5fb3B0aW9ucy5fb2xkT3B0aW9ucyA9IHt9O1xuXG4gIGlmICh0aGlzLl9vcHRpb25zLl9vbGRPcHRpb25zW29wdGlvbl0pXG4gICAgcmV0dXJuIHRydWU7XG4gIGVsc2VcbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5DYW52YXNKU09iamVjdC5wcm90b3R5cGUuaGFzT3B0aW9uQ2hhbmdlZCA9IGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgaWYgKCF0aGlzLnNlc3Npb25WYXJpYWJsZXMpXG4gICAgdGhyb3cgXCJTZXNzaW9uIFZhcmlhYmxlIFN0b3JlIG5vdCBzZXRcIjtcblxuICB2YXIgaGFzQ2hhbmdlZCA9ICEodGhpcy5zZXNzaW9uVmFyaWFibGVzW29wdGlvbl0gPT09IHRoaXMuX29wdGlvbnNbb3B0aW9uXSk7XG5cbiAgcmV0dXJuIGhhc0NoYW5nZWQ7XG59O1xuXG5DYW52YXNKU09iamVjdC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGV2ZW50SGFuZGxlciwgY29udGV4dCkge1xuICBpZiAoIWV2ZW50TmFtZSB8fCAhZXZlbnRIYW5kbGVyKVxuICAgIHJldHVybjtcblxuICBjb250ZXh0ID0gY29udGV4dCB8fCB0aGlzO1xuXG4gIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0gPSB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudE5hbWVdIHx8IFtdO1xuXG4gIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0ucHVzaCh7IGNvbnRleHQ6IGNvbnRleHQsIGV2ZW50SGFuZGxlcjogZXZlbnRIYW5kbGVyIH0pO1xufVxuXG5DYW52YXNKU09iamVjdC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGV2ZW50SGFuZGxlcikge1xuICBpZiAoIWV2ZW50TmFtZSB8fCAhZXZlbnRIYW5kbGVyIHx8ICF0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudE5hbWVdKVxuICAgIHJldHVybjtcblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcblxuICAgIGlmIChsaXN0ZW5lcnNbaV0uZXZlbnRIYW5kbGVyID09PSBldmVudEhhbmRsZXIpIHtcbiAgICAgIGxpc3RlbmVyc1tpXS5zcGxpY2UoaSwgMSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuQ2FudmFzSlNPYmplY3QucHJvdG90eXBlLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9ldmVudExpc3RlbmVycyA9IFtdO1xufVxuXG5DYW52YXNKU09iamVjdC5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGV2ZW50UGFyYW1ldGVyLCBjb250ZXh0KSB7XG5cbiAgLy9Gb3IgSW50ZXJuYWwgRXZlbnRzXG4gIGlmIChldmVudE5hbWUgJiYgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXSkge1xuXG4gIGV2ZW50UGFyYW1ldGVyID0gZXZlbnRQYXJhbWV0ZXIgfHwge307XG5cbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICBsaXN0ZW5lcnNbaV0uZXZlbnRIYW5kbGVyLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGV2ZW50UGFyYW1ldGVyKTtcbiAgfVxufVxuXG4gIC8vRXh0ZXJuYWwgRXZlbnRzIGRvIG5vdCByZXF1aXJlIHJlZ2lzdGVyaW5nIGFzIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHN1ZmZpZW50IHRvIGZpcmUgdGhlIGV2ZW50LlxuICBpZiAodHlwZW9mICh0aGlzW2V2ZW50TmFtZV0pID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aGlzW2V2ZW50TmFtZV0uY2FsbChjb250ZXh0IHx8IHRoaXMuY2hhcnQuX3B1YmxpY0NoYXJ0UmVmZXJlbmNlLCBldmVudFBhcmFtZXRlcik7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FudmFzSlNPYmplY3Q7XG4iLCJcbmltcG9ydCBDYW52YXNKU09iamVjdCBmcm9tICcuL2NhbnZhc2pzJztcbmltcG9ydCBBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yJztcbmltcG9ydCBEYXRhU2VyaWVzIGZyb20gJy4vZGF0YV9zZXJpZXMnO1xuaW1wb3J0IFRleHRCbG9jayBmcm9tICcuL3RleHRfYmxvY2snO1xuaW1wb3J0IFJlbmRlckhlbHBlciBmcm9tICcuLi9oZWxwZXJzL3JlbmRlcic7XG5pbXBvcnQgTGF5b3V0TWFuYWdlciBmcm9tICcuL2xheW91dF9tYW5hZ2VyJztcbmltcG9ydCBFdmVudE1hbmFnZXIgZnJvbSAnLi9ldmVudF9tYW5hZ2VyJztcbmltcG9ydCBUb29sVGlwIGZyb20gJy4vdG9vbHRpcCc7XG5pbXBvcnQgQ3VsdHVyZUluZm8gZnJvbSAnLi4vY29yZS9jdWx0dXJlX2luZm8nO1xuaW1wb3J0IEF4aXMgZnJvbSAnLi4vY29yZS9heGlzJztcbmltcG9ydCBUaXRsZSBmcm9tICcuLi9jb3JlL3RpdGxlJztcbmltcG9ydCBMZWdlbmQgZnJvbSAnLi4vY29yZS9sZWdlbmQnO1xuaW1wb3J0IEFuaW1hdGlvbkhlbHBlciBmcm9tICcuLi9oZWxwZXJzL2FuaW1hdG9yJztcbmltcG9ydCB7Y29sb3JTZXRzfSBmcm9tICcuLi9jb25zdGFudHMvdGhlbWVzJztcbmltcG9ydCB7aXNEZWJ1Z01vZGUsIGRlZmF1bHRPcHRpb25zfSBmcm9tICcuLi9jb25zdGFudHMvb3B0aW9ucyc7XG4vLyBpbXBvcnQge2luaGVyaXRzfSBmcm9tICd1dGlsJztcblxuaW1wb3J0IHtcblx0YWRkRXZlbnQsXG5cdHNldENhbnZhc1NpemUsXG5cdGFkZEFycmF5SW5kZXhPZixcblx0aGlkZSxcblx0c2hvdyxcblx0Z2V0TW91c2VDb29yZGluYXRlcyxcblx0Z2V0UHJvcGVydHksXG5cdGlzQ2FudmFzU3VwcG9ydGVkLFxuXHRleHRlbmQsXG5cdGNyZWF0ZUNhbnZhcyxcblx0ZXh0ZW5kQ3R4LFxuXHRnZXRPYmplY3RJZCxcblx0ZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbyxcblx0dHJpbVN0cmluZyxcblx0bnVtYmVyRm9ybWF0LFxuXHRnZXRMaW5lRGFzaEFycmF5LFxuXHRpbnRUb0hleENvbG9yU3RyaW5nLFxuXHRjb21wYXJlRGF0YVBvaW50WFxufSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuaW1wb3J0IHtcblx0U3BsaW5lQ2hhcnQsXG5cdENvbHVtbkNoYXJ0LFxuXHRTdGFja2VkQ29sdW1uQ2hhcnQsXG5cdFN0YWNrZWRDb2x1bW4xMDBDaGFydCxcblx0QmFyQ2hhcnQsXG5cdFN0YWNrZWRCYXJDaGFydCxcblx0U3RhY2tlZEJhcjEwMENoYXJ0LFxuXHRBcmVhQ2hhcnQsXG5cdFNwbGluZUFyZWFDaGFydCxcblx0U3RlcEFyZWFDaGFydCxcblx0U3RhY2tlZEFyZWFDaGFydCxcblx0U3RhY2tlZEFyZWExMDBDaGFydCxcblx0QnViYmxlQ2hhcnQsXG5cdFNjYXR0ZXJDaGFydCxcblx0Q2FuZGxlc3RpY2tDaGFydCxcblx0UmFuZ2VDb2x1bW5DaGFydCxcblx0UmFuZ2VCYXJDaGFydCxcblx0UmFuZ2VBcmVhQ2hhcnQsXG5cdFJhbmdlU3BsaW5lQXJlYUNoYXJ0LFxuXHRQaWVDaGFydFxufSBmcm9tICcuLi9jaGFydHMvaW5kZXgnO1xuXG5mdW5jdGlvbiBDaGFydChjb250YWluZXJJZCwgb3B0aW9ucywgcHVibGljQ2hhcnRSZWZlcmVuY2UpIHtcblxuXHR0aGlzLl9wdWJsaWNDaGFydFJlZmVyZW5jZSA9IHB1YmxpY0NoYXJ0UmVmZXJlbmNlO1xuXG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdENoYXJ0LmJhc2UuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBcIkNoYXJ0XCIsIG9wdGlvbnMsIG9wdGlvbnMudGhlbWUgPyBvcHRpb25zLnRoZW1lIDogXCJ0aGVtZTFcIik7XG5cblx0dmFyIF90aGlzID0gdGhpcztcblxuXHR0aGlzLl9jb250YWluZXJJZCA9IGNvbnRhaW5lcklkO1xuXHR0aGlzLl9vYmplY3RzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblx0dGhpcy5jdHggPSBudWxsO1xuXHR0aGlzLm92ZXJsYWlkQ2FudmFzQ3R4ID0gbnVsbDtcblx0dGhpcy5faW5kZXhMYWJlbHMgPSBbXTtcblx0dGhpcy5fcGFuVGltZXJJZCA9IDA7XG5cdHRoaXMuX2xhc3RUb3VjaEV2ZW50VHlwZSA9IFwiXCI7XG5cdHRoaXMuX2xhc3RUb3VjaERhdGEgPSBudWxsO1xuXHR0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG5cdHRoaXMucmVuZGVyQ291bnQgPSAwO1xuXHR0aGlzLmFuaW1hdGVkUmVuZGVyID0gZmFsc2U7XG5cdHRoaXMuZGlzYWJsZVRvb2xUaXAgPSBmYWxzZTtcblxuXG5cdHRoaXMucGFuRW5hYmxlZCA9IGZhbHNlO1xuXHR0aGlzLl9kZWZhdWx0Q3Vyc29yID0gXCJkZWZhdWx0XCI7XG5cdHRoaXMucGxvdEFyZWEgPSB7IGNhbnZhczogbnVsbCwgY3R4OiBudWxsLCB4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuXHR0aGlzLl9kYXRhSW5SZW5kZXJlZE9yZGVyID0gW107XG5cblx0dGhpcy5fY29udGFpbmVyID0gdHlwZW9mICh0aGlzLl9jb250YWluZXJJZCkgPT09IFwic3RyaW5nXCIgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLl9jb250YWluZXJJZCkgOiB0aGlzLl9jb250YWluZXJJZDtcblxuXHRpZiAoIXRoaXMuX2NvbnRhaW5lcikge1xuXHRcdGlmICh3aW5kb3cuY29uc29sZSlcblx0XHRcdHdpbmRvdy5jb25zb2xlLmxvZyhcIkNhbnZhc0pTIEVycm9yOiBDaGFydCBDb250YWluZXIgd2l0aCBpZCBcXFwiXCIgKyB0aGlzLl9jb250YWluZXJJZCArIFwiXFxcIiB3YXMgbm90IGZvdW5kXCIpO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHRoaXMuX2NvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuXG5cdHZhciB3aWR0aCA9IDA7XG5cdHZhciBoZWlnaHQgPSAwO1xuXG5cdGlmICh0aGlzLl9vcHRpb25zLndpZHRoKVxuXHRcdHdpZHRoID0gdGhpcy53aWR0aDtcblx0ZWxzZVxuXHRcdHdpZHRoID0gdGhpcy5fY29udGFpbmVyLmNsaWVudFdpZHRoID4gMCA/IHRoaXMuX2NvbnRhaW5lci5jbGllbnRXaWR0aCA6IHRoaXMud2lkdGg7XG5cblx0aWYgKHRoaXMuX29wdGlvbnMuaGVpZ2h0KVxuXHRcdGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXHRlbHNlXG5cdFx0aGVpZ2h0ID0gdGhpcy5fY29udGFpbmVyLmNsaWVudEhlaWdodCA+IDAgPyB0aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0IDogdGhpcy5oZWlnaHQ7XG5cblx0dGhpcy53aWR0aCA9IHdpZHRoO1xuXHR0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuXHR0aGlzLngxID0gdGhpcy55MSA9IDA7XG5cdHRoaXMueDIgPSB0aGlzLndpZHRoO1xuXHR0aGlzLnkyID0gdGhpcy5oZWlnaHQ7XG5cblxuXHR0aGlzLl9zZWxlY3RlZENvbG9yU2V0ID0gdHlwZW9mIChjb2xvclNldHNbdGhpcy5jb2xvclNldF0pICE9PSBcInVuZGVmaW5lZFwiID8gY29sb3JTZXRzW3RoaXMuY29sb3JTZXRdIDogY29sb3JTZXRzW1wiY29sb3JTZXQxXCJdO1xuXG5cdHRoaXMuX2NhbnZhc0pTQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0dGhpcy5fY2FudmFzSlNDb250YWluZXIuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJjYW52YXNqcy1jaGFydC1jb250YWluZXJcIik7XG5cblx0dGhpcy5fY2FudmFzSlNDb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdHRoaXMuX2NhbnZhc0pTQ29udGFpbmVyLnN0eWxlLnRleHRBbGlnbiA9IFwibGVmdFwiO1xuXHR0aGlzLl9jYW52YXNKU0NvbnRhaW5lci5zdHlsZS5jdXJzb3IgPSBcImF1dG9cIjtcblxuXHRpZiAoIWlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0dGhpcy5fY2FudmFzSlNDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gXCIwcHhcIjsvL0luIElFNiB0b29sVGlwIGRvZXNuJ3Qgc2hvdyBhdCBwcm9wZXIgcG9zaXRpb24gaWYgbm90IHNldC5cblx0fVxuXHR0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fY2FudmFzSlNDb250YWluZXIpO1xuXG5cblx0dGhpcy5jYW52YXMgPSBjcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG5cblx0dGhpcy5jYW52YXMuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdGlmICh0aGlzLmNhbnZhcy5nZXRDb250ZXh0KSB7XG5cdFx0Ly90cnkge1xuXHRcdC8vXHR0aGlzLmNhbnZhcy5zdHlsZS5iYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kQ29sb3I7XG5cdFx0Ly99IGNhdGNoIChlKSB7IH1cblx0XHR0aGlzLl9jYW52YXNKU0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XG5cdFx0dGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cdFx0dGhpcy5jdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcblx0XHRleHRlbmRDdHgodGhpcy5jdHgpO1xuXG5cdH0gZWxzZSByZXR1cm47XG5cblx0Ly90aGlzLmNhbnZhcy5zdHlsZS5jdXJzb3IgPSBcInBvaW50ZXJcIjtcblxuXHRpZiAoIWlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0dGhpcy5wbG90QXJlYS5jYW52YXMgPSBjcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG5cdFx0dGhpcy5wbG90QXJlYS5jYW52YXMuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0dGhpcy5wbG90QXJlYS5jYW52YXMuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJwbG90QXJlYUNhbnZhc1wiKTtcblx0XHR0aGlzLl9jYW52YXNKU0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnBsb3RBcmVhLmNhbnZhcyk7XG5cblx0XHR0aGlzLnBsb3RBcmVhLmN0eCA9IHRoaXMucGxvdEFyZWEuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLnBsb3RBcmVhLmN0eCA9IHRoaXMuY3R4O1xuXHR9XG5cblx0dGhpcy5vdmVybGFpZENhbnZhcyA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcblx0dGhpcy5vdmVybGFpZENhbnZhcy5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblx0dGhpcy5fY2FudmFzSlNDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5vdmVybGFpZENhbnZhcyk7XG5cdHRoaXMub3ZlcmxhaWRDYW52YXNDdHggPSB0aGlzLm92ZXJsYWlkQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblx0dGhpcy5vdmVybGFpZENhbnZhc0N0eC50ZXh0QmFzZWxpbmUgPSBcInRvcFwiO1xuXG5cdHRoaXMuX2V2ZW50TWFuYWdlciA9IG5ldyBFdmVudE1hbmFnZXIodGhpcyk7XG5cblx0YWRkRXZlbnQod2luZG93LCBcInJlc2l6ZVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0Ly90aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTVN1YnRyZWVNb2RpZmllZFwiLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoX3RoaXMuX3VwZGF0ZVNpemUoKSlcblx0XHRcdF90aGlzLnJlbmRlcigpO1xuXHR9KTtcblxuXG5cdHRoaXMuX3Rvb2xCYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHR0aGlzLl90b29sQmFyLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiY2FudmFzanMtY2hhcnQtdG9vbGJhclwiKTtcblx0dGhpcy5fdG9vbEJhci5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAxcHg7IHRvcDogMXB4O1wiO1xuXHR0aGlzLl9jYW52YXNKU0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl90b29sQmFyKTtcblxuXG5cdHRoaXMuYm91bmRzID0geyB4MTogMCwgeTE6IDAsIHgyOiB0aGlzLndpZHRoLCB5MjogdGhpcy5oZWlnaHQgfTtcblxuXHRhZGRFdmVudCh0aGlzLm92ZXJsYWlkQ2FudmFzLCAnY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuXHRcdF90aGlzLl9tb3VzZUV2ZW50SGFuZGxlcihlKTtcblx0fSk7XG5cblx0YWRkRXZlbnQodGhpcy5vdmVybGFpZENhbnZhcywgJ21vdXNlbW92ZScsIGZ1bmN0aW9uIChlKSB7XG5cdFx0X3RoaXMuX21vdXNlRXZlbnRIYW5kbGVyKGUpO1xuXHR9KTtcblxuXHRhZGRFdmVudCh0aGlzLm92ZXJsYWlkQ2FudmFzLCAnbW91c2V1cCcsIGZ1bmN0aW9uIChlKSB7XG5cdFx0X3RoaXMuX21vdXNlRXZlbnRIYW5kbGVyKGUpO1xuXHR9KTtcblxuXHRhZGRFdmVudCh0aGlzLm92ZXJsYWlkQ2FudmFzLCAnbW91c2Vkb3duJywgZnVuY3Rpb24gKGUpIHtcblx0XHRfdGhpcy5fbW91c2VFdmVudEhhbmRsZXIoZSk7XG5cdFx0aGlkZShfdGhpcy5fZHJvcGRvd25NZW51KTtcblx0fSk7XG5cblx0YWRkRXZlbnQodGhpcy5vdmVybGFpZENhbnZhcywgJ21vdXNlb3V0JywgZnVuY3Rpb24gKGUpIHtcblx0XHRfdGhpcy5fbW91c2VFdmVudEhhbmRsZXIoZSk7XG5cdH0pO1xuXG5cblx0YWRkRXZlbnQodGhpcy5vdmVybGFpZENhbnZhcywgd2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkID8gXCJNU1BvaW50ZXJEb3duXCIgOiBcInRvdWNoc3RhcnRcIiwgZnVuY3Rpb24gKGUpIHtcblx0XHRfdGhpcy5fdG91Y2hFdmVudEhhbmRsZXIoZSk7XG5cdH0pO1xuXG5cdGFkZEV2ZW50KHRoaXMub3ZlcmxhaWRDYW52YXMsIHdpbmRvdy5uYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZCA/IFwiTVNQb2ludGVyTW92ZVwiIDogJ3RvdWNobW92ZScsIGZ1bmN0aW9uIChlKSB7XG5cdFx0X3RoaXMuX3RvdWNoRXZlbnRIYW5kbGVyKGUpO1xuXHR9KTtcblxuXHRhZGRFdmVudCh0aGlzLm92ZXJsYWlkQ2FudmFzLCB3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQgPyBcIk1TUG9pbnRlclVwXCIgOiAndG91Y2hlbmQnLCBmdW5jdGlvbiAoZSkge1xuXHRcdF90aGlzLl90b3VjaEV2ZW50SGFuZGxlcihlKTtcblx0fSk7XG5cblx0YWRkRXZlbnQodGhpcy5vdmVybGFpZENhbnZhcywgd2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkID8gXCJNU1BvaW50ZXJDYW5jZWxcIiA6ICd0b3VjaGNhbmNlbCcsIGZ1bmN0aW9uIChlKSB7XG5cdFx0X3RoaXMuX3RvdWNoRXZlbnRIYW5kbGVyKGUpO1xuXHR9KTtcblxuXHRpZiAoIXRoaXMuX2NyZWRpdExpbmspIHtcblxuXHRcdHRoaXMuX2NyZWRpdExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcblx0XHR0aGlzLl9jcmVkaXRMaW5rLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiY2FudmFzanMtY2hhcnQtY3JlZGl0XCIpO1xuXHRcdHRoaXMuX2NyZWRpdExpbmsuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJvdXRsaW5lOm5vbmU7bWFyZ2luOjBweDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDozcHg7dG9wOlwiICsgKHRoaXMuaGVpZ2h0IC0gMTQpICsgXCJweDtjb2xvcjpkaW1ncmV5O3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtc2l6ZToxMHB4O2ZvbnQtZmFtaWx5Okx1Y2lkYSBHcmFuZGUsIEx1Y2lkYSBTYW5zIFVuaWNvZGUsIEFyaWFsLCBzYW5zLXNlcmlmXCIpO1xuXG5cdFx0dGhpcy5fY3JlZGl0TGluay5zZXRBdHRyaWJ1dGUoXCJ0YWJJbmRleFwiLCAtMSk7XG5cblx0XHR0aGlzLl9jcmVkaXRMaW5rLnNldEF0dHJpYnV0ZShcInRhcmdldFwiLCBcIl9ibGFua1wiKTtcblx0fVxuXG5cdHRoaXMuX3Rvb2xUaXAgPSBuZXcgVG9vbFRpcCh0aGlzLCB0aGlzLl9vcHRpb25zLnRvb2xUaXAsIHRoaXMudGhlbWUpO1xuXG5cdHRoaXMuZGF0YSA9IG51bGw7XG5cdHRoaXMuYXhpc1ggPSBudWxsO1xuXHR0aGlzLmF4aXNZID0gbnVsbDtcblx0dGhpcy5heGlzWTIgPSBudWxsO1xuXG5cdHRoaXMuc2Vzc2lvblZhcmlhYmxlcyA9IHtcblx0XHRheGlzWDoge30sXG5cdFx0YXhpc1k6IHt9LFxuXHRcdGF4aXNZMjoge31cblx0fTtcbn1cblxuZXh0ZW5kKENoYXJ0LCBDYW52YXNKU09iamVjdCk7XG5cbi8vVXBkYXRlIENoYXJ0IFByb3BlcnRpZXNcbkNoYXJ0LnByb3RvdHlwZS5fdXBkYXRlT3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgX3RoaXMgPSB0aGlzO1xuXG5cdHRoaXMudXBkYXRlT3B0aW9uKFwid2lkdGhcIik7XG5cdHRoaXMudXBkYXRlT3B0aW9uKFwiaGVpZ2h0XCIpO1xuXHR0aGlzLnVwZGF0ZU9wdGlvbihcImRhdGFQb2ludE1heFdpZHRoXCIpO1xuXHR0aGlzLnVwZGF0ZU9wdGlvbihcImludGVyYWN0aXZpdHlFbmFibGVkXCIpO1xuXHR0aGlzLnVwZGF0ZU9wdGlvbihcInRoZW1lXCIpO1xuXG5cdGlmICh0aGlzLnVwZGF0ZU9wdGlvbihcImNvbG9yU2V0XCIpKVxuXHRcdHRoaXMuX3NlbGVjdGVkQ29sb3JTZXQgPSB0eXBlb2YgKGNvbG9yU2V0c1t0aGlzLmNvbG9yU2V0XSkgIT09IFwidW5kZWZpbmVkXCIgPyBjb2xvclNldHNbdGhpcy5jb2xvclNldF0gOiBjb2xvclNldHNbXCJjb2xvclNldDFcIl07XG5cblx0dGhpcy51cGRhdGVPcHRpb24oXCJiYWNrZ3JvdW5kQ29sb3JcIik7XG5cdGlmICghdGhpcy5iYWNrZ3JvdW5kQ29sb3IpXG5cdFx0dGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBcInJnYmEoMCwwLDAsMClcIjtcblxuXHR0aGlzLnVwZGF0ZU9wdGlvbihcImN1bHR1cmVcIik7XG5cdHRoaXMuX2N1bHR1cmVJbmZvID0gbmV3IEN1bHR1cmVJbmZvKHRoaXMuX29wdGlvbnMuY3VsdHVyZSk7XG5cblx0dGhpcy51cGRhdGVPcHRpb24oXCJhbmltYXRpb25FbmFibGVkXCIpO1xuXHR0aGlzLmFuaW1hdGlvbkVuYWJsZWQgPSB0aGlzLmFuaW1hdGlvbkVuYWJsZWQgJiYgaXNDYW52YXNTdXBwb3J0ZWQ7XG5cdHRoaXMudXBkYXRlT3B0aW9uKFwiYW5pbWF0aW9uRHVyYXRpb25cIik7XG5cblx0dGhpcy51cGRhdGVPcHRpb24oXCJyYW5nZUNoYW5naW5nXCIpO1xuXHR0aGlzLnVwZGF0ZU9wdGlvbihcInJhbmdlQ2hhbmdlZFwiKTtcblxuXHQvL05lZWQgdG8gY2hlY2sgdGhpcy5fb3B0aW9ucy56b29tRW5hYmxlZCBiZWNhdXNlIHRoaXMuem9vbUVuYWJsZWQgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIGtlZXAgdHJhY2sgb2Ygc3RhdGUgLSBhbmQgaGVuY2UgY2hhbmdlcy5cblx0aWYgKHRoaXMuX29wdGlvbnMuem9vbUVuYWJsZWQpIHtcblxuXHRcdGlmICghdGhpcy5fem9vbUJ1dHRvbikge1xuXG5cdFx0XHRoaWRlKHRoaXMuX3pvb21CdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpKTtcblxuXHRcdFx0c2V0QnV0dG9uU3RhdGUodGhpcywgdGhpcy5fem9vbUJ1dHRvbiwgXCJwYW5cIik7XG5cblx0XHRcdHRoaXMuX3Rvb2xCYXIuYXBwZW5kQ2hpbGQodGhpcy5fem9vbUJ1dHRvbik7XG5cdFx0XHRhZGRFdmVudCh0aGlzLl96b29tQnV0dG9uLCBcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKF90aGlzLnpvb21FbmFibGVkKSB7XG5cdFx0XHRcdFx0X3RoaXMuem9vbUVuYWJsZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRfdGhpcy5wYW5FbmFibGVkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdHNldEJ1dHRvblN0YXRlKF90aGlzLCBfdGhpcy5fem9vbUJ1dHRvbiwgXCJ6b29tXCIpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0X3RoaXMuem9vbUVuYWJsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdF90aGlzLnBhbkVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdHNldEJ1dHRvblN0YXRlKF90aGlzLCBfdGhpcy5fem9vbUJ1dHRvbiwgXCJwYW5cIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRfdGhpcy5yZW5kZXIoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXG5cdFx0aWYgKCF0aGlzLl9yZXNldEJ1dHRvbikge1xuXHRcdFx0aGlkZSh0aGlzLl9yZXNldEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIikpO1xuXHRcdFx0c2V0QnV0dG9uU3RhdGUodGhpcywgdGhpcy5fcmVzZXRCdXR0b24sIFwicmVzZXRcIik7XG5cdFx0XHR0aGlzLl90b29sQmFyLmFwcGVuZENoaWxkKHRoaXMuX3Jlc2V0QnV0dG9uKTtcblxuXHRcdFx0YWRkRXZlbnQodGhpcy5fcmVzZXRCdXR0b24sIFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdF90aGlzLl90b29sVGlwLmhpZGUoKTtcblxuXHRcdFx0XHRpZiAoX3RoaXMuem9vbUVuYWJsZWQgfHwgX3RoaXMucGFuRW5hYmxlZCkge1xuXHRcdFx0XHRcdF90aGlzLnpvb21FbmFibGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRfdGhpcy5wYW5FbmFibGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0c2V0QnV0dG9uU3RhdGUoX3RoaXMsIF90aGlzLl96b29tQnV0dG9uLCBcInBhblwiKTtcblxuXHRcdFx0XHRcdF90aGlzLl9kZWZhdWx0Q3Vyc29yID0gXCJkZWZhdWx0XCI7XG5cdFx0XHRcdFx0X3RoaXMub3ZlcmxhaWRDYW52YXMuc3R5bGUuY3Vyc29yID0gX3RoaXMuX2RlZmF1bHRDdXJzb3I7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0X3RoaXMuem9vbUVuYWJsZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRfdGhpcy5wYW5FbmFibGVkID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly9SZXNldCBheGlzWFxuXHRcdFx0XHRpZiAoX3RoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWCkge1xuXHRcdFx0XHRcdF90aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1gubmV3Vmlld3BvcnRNaW5pbXVtID0gbnVsbDtcblx0XHRcdFx0XHRfdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLm5ld1ZpZXdwb3J0TWF4aW11bSA9IG51bGw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL1Jlc2V0IGF4aXNZXG5cdFx0XHRcdGlmIChfdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNZKSB7XG5cdFx0XHRcdFx0X3RoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWS5uZXdWaWV3cG9ydE1pbmltdW0gPSBudWxsO1xuXHRcdFx0XHRcdF90aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1kubmV3Vmlld3BvcnRNYXhpbXVtID0gbnVsbDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vUmVzZXQgYXhpc1kyXG5cdFx0XHRcdGlmIChfdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNZMikge1xuXHRcdFx0XHRcdF90aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1kyLm5ld1ZpZXdwb3J0TWluaW11bSA9IG51bGw7XG5cdFx0XHRcdFx0X3RoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWTIubmV3Vmlld3BvcnRNYXhpbXVtID0gbnVsbDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdF90aGlzLnJlc2V0T3ZlcmxheWVkQ2FudmFzKCk7XG5cblx0XHRcdFx0aGlkZShfdGhpcy5fem9vbUJ1dHRvbiwgX3RoaXMuX3Jlc2V0QnV0dG9uKTtcblxuXHRcdFx0XHRfdGhpcy5fZGlzcGF0Y2hSYW5nZUV2ZW50KFwicmFuZ2VDaGFuZ2luZ1wiLCBcInJlc2V0XCIpO1xuXHRcdFx0XHRfdGhpcy5yZW5kZXIoKTtcblx0XHRcdFx0X3RoaXMuX2Rpc3BhdGNoUmFuZ2VFdmVudChcInJhbmdlQ2hhbmdlZFwiLCBcInJlc2V0XCIpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMub3ZlcmxhaWRDYW52YXMuc3R5bGUuY3Vyc29yID0gX3RoaXMuX2RlZmF1bHRDdXJzb3I7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLnpvb21FbmFibGVkICYmICF0aGlzLnBhbkVuYWJsZWQpIHtcblx0XHRcdGlmICghdGhpcy5fem9vbUJ1dHRvbikge1xuXHRcdFx0XHR0aGlzLnpvb21FbmFibGVkID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5wYW5FbmFibGVkID0gZmFsc2U7XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGlmIChfdGhpcy5fem9vbUJ1dHRvbi5nZXRBdHRyaWJ1dGUoXCJzdGF0ZVwiKSA9PT0gX3RoaXMuX2N1bHR1cmVJbmZvLnpvb21UZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5wYW5FbmFibGVkID0gdHJ1ZTtcblx0XHRcdFx0XHR0aGlzLnpvb21FbmFibGVkID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy56b29tRW5hYmxlZCA9IHRydWU7XG5cdFx0XHRcdFx0dGhpcy5wYW5FbmFibGVkID0gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzaG93KF90aGlzLl96b29tQnV0dG9uLCBfdGhpcy5fcmVzZXRCdXR0b24pO1xuXHRcdFx0fVxuXHRcdH1cblxuXG5cblx0fSBlbHNlIHtcblx0XHR0aGlzLnpvb21FbmFibGVkID0gZmFsc2U7XG5cdFx0dGhpcy5wYW5FbmFibGVkID0gZmFsc2U7XG5cdH1cblxuXG5cblx0aWYgKHRoaXMuX21lbnVCdXR0b24pIHtcblx0XHRpZiAodGhpcy5leHBvcnRFbmFibGVkKVxuXHRcdFx0c2hvdyh0aGlzLl9tZW51QnV0dG9uKTtcblx0XHRlbHNlXG5cdFx0XHRoaWRlKHRoaXMuX21lbnVCdXR0b24pO1xuXHR9IGVsc2UgaWYgKHRoaXMuZXhwb3J0RW5hYmxlZCAmJiBpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdHRoaXMuX21lbnVCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuXHRcdHNldEJ1dHRvblN0YXRlKHRoaXMsIHRoaXMuX21lbnVCdXR0b24sIFwibWVudVwiKTtcblx0XHR0aGlzLl90b29sQmFyLmFwcGVuZENoaWxkKHRoaXMuX21lbnVCdXR0b24pO1xuXG5cdFx0YWRkRXZlbnQodGhpcy5fbWVudUJ1dHRvbiwgXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoX3RoaXMuX2Ryb3Bkb3duTWVudS5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIikge1xuXG5cdFx0XHRcdGlmIChfdGhpcy5fZHJvcERvd25DbG9zZVRpbWUgJiYgKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLSBfdGhpcy5fZHJvcERvd25DbG9zZVRpbWUuZ2V0VGltZSgpIDw9IDUwMCkpXG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdF90aGlzLl9kcm9wZG93bk1lbnUuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblx0XHRcdFx0X3RoaXMuX21lbnVCdXR0b24uYmx1cigpO1xuXHRcdFx0XHRfdGhpcy5fZHJvcGRvd25NZW51LmZvY3VzKCk7XG5cdFx0XHR9XG5cblx0XHR9LCB0cnVlKTtcblx0fVxuXG5cblx0aWYgKCF0aGlzLl9kcm9wZG93bk1lbnUgJiYgdGhpcy5leHBvcnRFbmFibGVkICYmIGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0dGhpcy5fZHJvcGRvd25NZW51ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR0aGlzLl9kcm9wZG93bk1lbnUuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgLTEpO1xuXHRcdHRoaXMuX2Ryb3Bkb3duTWVudS5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogYWJzb2x1dGU7IC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7IC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7IC1tcy11c2VyLXNlbGVjdDogbm9uZTsgdXNlci1zZWxlY3Q6IG5vbmU7IGN1cnNvcjogcG9pbnRlcjtyaWdodDogMXB4O3RvcDogMjVweDttaW4td2lkdGg6IDEyMHB4O291dGxpbmU6IDA7Ym9yZGVyOiAxcHggc29saWQgc2lsdmVyO2ZvbnQtc2l6ZTogMTRweDtmb250LWZhbWlseTogQ2FsaWJyaSwgVmVyZGFuYSwgc2Fucy1zZXJpZjtwYWRkaW5nOiA1cHggMHB4IDVweCAwcHg7dGV4dC1hbGlnbjogbGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO2xpbmUtaGVpZ2h0OiAyMHB4O2JveC1zaGFkb3c6IDJweCAycHggMTBweCAjODg4ODg4O1wiO1xuXHRcdF90aGlzLl9kcm9wZG93bk1lbnUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdHRoaXMuX3Rvb2xCYXIuYXBwZW5kQ2hpbGQodGhpcy5fZHJvcGRvd25NZW51KTtcblxuXHRcdGFkZEV2ZW50KHRoaXMuX2Ryb3Bkb3duTWVudSwgXCJibHVyXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdGhpZGUoX3RoaXMuX2Ryb3Bkb3duTWVudSk7XG5cblx0XHRcdF90aGlzLl9kcm9wRG93bkNsb3NlVGltZSA9IG5ldyBEYXRlKCk7XG5cdFx0fSwgdHJ1ZSk7XG5cblx0XHR2YXIgZXhwb3J0T3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRleHBvcnRPcHRpb24uc3R5bGUuY3NzVGV4dCA9IFwicGFkZGluZzogMnB4IDE1cHggMnB4IDEwcHhcIlxuXHRcdGV4cG9ydE9wdGlvbi5pbm5lckhUTUwgPSB0aGlzLl9jdWx0dXJlSW5mby5zYXZlSlBHVGV4dDtcblx0XHR0aGlzLl9kcm9wZG93bk1lbnUuYXBwZW5kQ2hpbGQoZXhwb3J0T3B0aW9uKTtcblxuXHRcdGFkZEV2ZW50KGV4cG9ydE9wdGlvbiwgXCJtb3VzZW92ZXJcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0dGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIiNFRUVFRUVcIjtcblx0XHR9LCB0cnVlKTtcblxuXHRcdGFkZEV2ZW50KGV4cG9ydE9wdGlvbiwgXCJtb3VzZW91dFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0aGlzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwidHJhbnNwYXJlbnRcIjtcblx0XHR9LCB0cnVlKTtcblxuXHRcdGFkZEV2ZW50KGV4cG9ydE9wdGlvbiwgXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRleHBvcnRDYW52YXMoX3RoaXMuY2FudmFzLCBcImpwZ1wiLCBfdGhpcy5leHBvcnRGaWxlTmFtZSk7XG5cdFx0XHRoaWRlKF90aGlzLl9kcm9wZG93bk1lbnUpO1xuXHRcdH0sIHRydWUpO1xuXG5cdFx0dmFyIGV4cG9ydE9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0ZXhwb3J0T3B0aW9uLnN0eWxlLmNzc1RleHQgPSBcInBhZGRpbmc6IDJweCAxNXB4IDJweCAxMHB4XCJcblx0XHRleHBvcnRPcHRpb24uaW5uZXJIVE1MID0gdGhpcy5fY3VsdHVyZUluZm8uc2F2ZVBOR1RleHQ7XG5cdFx0dGhpcy5fZHJvcGRvd25NZW51LmFwcGVuZENoaWxkKGV4cG9ydE9wdGlvbik7XG5cblx0XHRhZGRFdmVudChleHBvcnRPcHRpb24sIFwibW91c2VvdmVyXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdHRoaXMuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCIjRUVFRUVFXCI7XG5cdFx0fSwgdHJ1ZSk7XG5cblx0XHRhZGRFdmVudChleHBvcnRPcHRpb24sIFwibW91c2VvdXRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0dGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcInRyYW5zcGFyZW50XCI7XG5cdFx0fSwgdHJ1ZSk7XG5cblx0XHRhZGRFdmVudChleHBvcnRPcHRpb24sIFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0ZXhwb3J0Q2FudmFzKF90aGlzLmNhbnZhcywgXCJwbmdcIiwgX3RoaXMuZXhwb3J0RmlsZU5hbWUpO1xuXHRcdFx0aGlkZShfdGhpcy5fZHJvcGRvd25NZW51KTtcblx0XHR9LCB0cnVlKTtcblx0fVxuXG5cblx0aWYgKHRoaXMuX3Rvb2xCYXIuc3R5bGUuZGlzcGxheSAhPT0gXCJub25lXCIgJiYgdGhpcy5fem9vbUJ1dHRvbikge1xuXG5cdFx0dGhpcy5wYW5FbmFibGVkID8gc2V0QnV0dG9uU3RhdGUoX3RoaXMsIF90aGlzLl96b29tQnV0dG9uLCBcInpvb21cIikgOiBzZXRCdXR0b25TdGF0ZShfdGhpcywgX3RoaXMuX3pvb21CdXR0b24sIFwicGFuXCIpO1xuXG5cblx0XHRpZiAoX3RoaXMuX3Jlc2V0QnV0dG9uLmdldEF0dHJpYnV0ZShcInN0YXRlXCIpICE9PSBfdGhpcy5fY3VsdHVyZUluZm8ucmVzZXRUZXh0KVxuXHRcdFx0c2V0QnV0dG9uU3RhdGUoX3RoaXMsIF90aGlzLl9yZXNldEJ1dHRvbiwgXCJyZXNldFwiKTtcblx0fVxuXG5cdGlmICh0eXBlb2YgKGRlZmF1bHRPcHRpb25zLkNoYXJ0LmNyZWRpdEhyZWYpID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0dGhpcy5jcmVkaXRIcmVmID0gXCJodHRwOi8vY2FudmFzanMuY29tL1wiO1xuXHRcdHRoaXMuY3JlZGl0VGV4dCA9IFwiQ2FudmFzSlMuY29tXCI7XG5cdH0gZWxzZSB7XG5cdFx0dmFyIGNyZWRpdFRleHRDaGFuZ2VkID0gdGhpcy51cGRhdGVPcHRpb24oXCJjcmVkaXRUZXh0XCIpO1xuXHRcdHZhciBjcmVkaXRIcmVmQ2hhbmdlZCA9IHRoaXMudXBkYXRlT3B0aW9uKFwiY3JlZGl0SHJlZlwiKTtcblx0fVxuXG5cdGlmICh0aGlzLnJlbmRlckNvdW50ID09PSAwIHx8IChjcmVkaXRUZXh0Q2hhbmdlZCB8fCBjcmVkaXRIcmVmQ2hhbmdlZCkpIHtcblx0XHR0aGlzLl9jcmVkaXRMaW5rLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgdGhpcy5jcmVkaXRIcmVmKTtcblx0XHR0aGlzLl9jcmVkaXRMaW5rLmlubmVySFRNTCA9IHRoaXMuY3JlZGl0VGV4dDtcblx0fVxuXG5cdGlmICh0aGlzLmNyZWRpdEhyZWYgJiYgdGhpcy5jcmVkaXRUZXh0KSB7XG5cdFx0aWYgKCF0aGlzLl9jcmVkaXRMaW5rLnBhcmVudEVsZW1lbnQpXG5cdFx0XHR0aGlzLl9jYW52YXNKU0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jcmVkaXRMaW5rKTtcblx0fVxuXHRlbHNlIGlmICh0aGlzLl9jcmVkaXRMaW5rLnBhcmVudEVsZW1lbnQpXG5cdFx0dGhpcy5fY2FudmFzSlNDb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fY3JlZGl0TGluayk7XG5cblx0aWYgKHRoaXMuX29wdGlvbnMudG9vbFRpcCAmJiB0aGlzLl90b29sVGlwLl9vcHRpb25zICE9PSB0aGlzLl9vcHRpb25zLnRvb2xUaXApXG5cdFx0dGhpcy5fdG9vbFRpcC5fb3B0aW9ucyA9IHRoaXMuX29wdGlvbnMudG9vbFRpcFxuXG5cdGZvciAodmFyIHByb3AgaW4gdGhpcy5fdG9vbFRpcC5fb3B0aW9ucykge1xuXG5cdFx0aWYgKHRoaXMuX3Rvb2xUaXAuX29wdGlvbnMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcblx0XHRcdHRoaXMuX3Rvb2xUaXAudXBkYXRlT3B0aW9uKHByb3ApO1xuXHRcdH1cblx0fVxuXG59XG5cbkNoYXJ0LnByb3RvdHlwZS5fdXBkYXRlU2l6ZSA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHdpZHRoID0gMDtcblx0dmFyIGhlaWdodCA9IDA7XG5cblx0aWYgKHRoaXMuX29wdGlvbnMud2lkdGgpXG5cdFx0d2lkdGggPSB0aGlzLndpZHRoO1xuXHRlbHNlXG5cdFx0dGhpcy53aWR0aCA9IHdpZHRoID0gdGhpcy5fY29udGFpbmVyLmNsaWVudFdpZHRoID4gMCA/IHRoaXMuX2NvbnRhaW5lci5jbGllbnRXaWR0aCA6IHRoaXMud2lkdGg7XG5cblx0aWYgKHRoaXMuX29wdGlvbnMuaGVpZ2h0KVxuXHRcdGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXHRlbHNlXG5cdFx0dGhpcy5oZWlnaHQgPSBoZWlnaHQgPSB0aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0ID4gMCA/IHRoaXMuX2NvbnRhaW5lci5jbGllbnRIZWlnaHQgOiB0aGlzLmhlaWdodDtcblxuXHRpZiAodGhpcy5jYW52YXMud2lkdGggIT09IHdpZHRoICogZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbyB8fCB0aGlzLmNhbnZhcy5oZWlnaHQgIT09IGhlaWdodCAqIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8pIHtcblx0XHRzZXRDYW52YXNTaXplKHRoaXMuY2FudmFzLCB3aWR0aCwgaGVpZ2h0KTtcblxuXHRcdHNldENhbnZhc1NpemUodGhpcy5vdmVybGFpZENhbnZhcywgd2lkdGgsIGhlaWdodCk7XG5cdFx0c2V0Q2FudmFzU2l6ZSh0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDYW52YXMsIHdpZHRoLCBoZWlnaHQpO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8vIGluaXRpYWxpemUgY2hhcnQgb2JqZWN0c1xuQ2hhcnQucHJvdG90eXBlLl9pbml0aWFsaXplID0gZnVuY3Rpb24gKCkge1xuXHQvLy88c2lnbmF0dXJlPlxuXHQvLy88c3VtbWFyeT5Jbml0aWFsaXplcyBDaGFydCBvYmplY3RzL3N0YXRlLiBDcmVhdGVzIERhdGFTZXJpZXMgY2xhc3MgaW5zdGFuY2UgZm9yIGVhY2ggRGF0YVNlcmllcyBwcm92aWRlZCBieSB0aGVyIHVzZXIuIFNldHMgdGhlIEF4aXMgVHlwZSBiYXNlZCBvbiB0aGUgdXNlciBkYXRhPC9zdW1tYXJ5PlxuXHQvLy88L3NpZ25hdHVyZT5cblx0Ly90aGlzLndpZHRoID0gdGhpcy53aWR0aDtcblxuXHRpZiAoIXRoaXMuX2FuaW1hdG9yKVxuXHRcdHRoaXMuX2FuaW1hdG9yID0gbmV3IEFuaW1hdG9yKHRoaXMpO1xuXHRlbHNlIHtcblx0XHR0aGlzLl9hbmltYXRvci5jYW5jZWxBbGxBbmltYXRpb25zKCk7XG5cdH1cblxuXHR0aGlzLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7XG5cblx0dGhpcy5kaXNhYmxlVG9vbFRpcCA9IGZhbHNlO1xuXG5cdHRoaXMuX2F4ZXMgPSBbXTtcblxuXHR0aGlzLnBpZURvdWdobnV0Q2xpY2tIYW5kbGVyID0gbnVsbDtcblx0Ly90aGlzLl90b3VjaEN1cnJlbnRDb29yZGluYXRlcyA9IG51bGw7XG5cblx0aWYgKHRoaXMuYW5pbWF0aW9uUmVxdWVzdElkKVxuXHRcdHRoaXMuY2FuY2VsUmVxdWVzdEFuaW1GcmFtZS5jYWxsKHdpbmRvdywgdGhpcy5hbmltYXRpb25SZXF1ZXN0SWQpO1xuXG5cdHRoaXMuX3VwZGF0ZU9wdGlvbnMoKTtcblxuXHR0aGlzLmFuaW1hdGVkUmVuZGVyID0gaXNDYW52YXNTdXBwb3J0ZWQgJiYgdGhpcy5hbmltYXRpb25FbmFibGVkICYmICh0aGlzLnJlbmRlckNvdW50ID09PSAwKTtcblxuXHR0aGlzLl91cGRhdGVTaXplKCk7XG5cblx0Ly90aGlzLl9zZWxlY3RlZENvbG9yU2V0ID0gY29sb3JTZXRzW1wiY29sb3JTZXQyXCJdO1xuXG5cdC8vdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblx0dGhpcy5jbGVhckNhbnZhcygpO1xuXHR0aGlzLmN0eC5iZWdpblBhdGgoKTtcblxuXHR0aGlzLmF4aXNYID0gbnVsbDtcblx0dGhpcy5heGlzWSA9IG51bGw7XG5cdHRoaXMuYXhpc1kyID0gbnVsbDtcblx0dGhpcy5faW5kZXhMYWJlbHMgPSBbXTtcblx0dGhpcy5fZGF0YUluUmVuZGVyZWRPcmRlciA9IFtdO1xuXG5cdHRoaXMuX2V2ZW50cyA9IFtdO1xuXHRpZiAodGhpcy5fZXZlbnRNYW5hZ2VyKVxuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5yZXNldCgpO1xuXG5cdHRoaXMucGxvdEluZm8gPSB7XG5cdFx0YXhpc1BsYWNlbWVudDogbnVsbCxcblx0XHRheGlzWFZhbHVlVHlwZTogbnVsbCxcblx0XHRwbG90VHlwZXM6IFtdLy9hcnJheSBvZiBwbG90VHlwZToge3R5cGU6XCJcIiwgYXhpc1lUeXBlOiBcInByaW1hcnlcIiwgZGF0YVNlcmllc0luZGV4ZXM6W119XG5cdH07XG5cblx0dGhpcy5sYXlvdXRNYW5hZ2VyID0gbmV3IExheW91dE1hbmFnZXIoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIDIpO1xuXG5cdGlmICh0aGlzLnBsb3RBcmVhLmxheW91dE1hbmFnZXIpXG5cdFx0dGhpcy5wbG90QXJlYS5sYXlvdXRNYW5hZ2VyLnJlc2V0KCk7XG5cblxuXHR0aGlzLmRhdGEgPSBbXTtcblx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IDA7XG5cblx0Zm9yICh2YXIgc2VyaWVzID0gMDsgc2VyaWVzIDwgdGhpcy5fb3B0aW9ucy5kYXRhLmxlbmd0aDsgc2VyaWVzKyspIHtcblx0XHQvL2ZvciAoc2VyaWVzIGluIHRoaXMuX29wdGlvbnMuZGF0YSkge1xuXG5cdFx0ZGF0YVNlcmllc0luZGV4Kys7XG5cblx0XHRpZiAoISghdGhpcy5fb3B0aW9ucy5kYXRhW3Nlcmllc10udHlwZSB8fCBDaGFydC5fc3VwcG9ydGVkQ2hhcnRUeXBlcy5pbmRleE9mKHRoaXMuX29wdGlvbnMuZGF0YVtzZXJpZXNdLnR5cGUpID49IDApKVxuXHRcdFx0Y29udGludWU7XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IG5ldyBEYXRhU2VyaWVzKHRoaXMsIHRoaXMuX29wdGlvbnMuZGF0YVtzZXJpZXNdLCB0aGlzLnRoZW1lLCBkYXRhU2VyaWVzSW5kZXggLSAxLCArK3RoaXMuX2V2ZW50TWFuYWdlci5sYXN0T2JqZWN0SWQpO1xuXHRcdGlmIChkYXRhU2VyaWVzLm5hbWUgPT09IG51bGwpXG5cdFx0XHRkYXRhU2VyaWVzLm5hbWUgPSBcIkRhdGFTZXJpZXMgXCIgKyAoZGF0YVNlcmllc0luZGV4KTtcblxuXHRcdGlmIChkYXRhU2VyaWVzLmNvbG9yID09PSBudWxsKSB7XG5cdFx0XHRpZiAodGhpcy5fb3B0aW9ucy5kYXRhLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0ZGF0YVNlcmllcy5fY29sb3JTZXQgPSBbdGhpcy5fc2VsZWN0ZWRDb2xvclNldFtkYXRhU2VyaWVzLmluZGV4ICUgdGhpcy5fc2VsZWN0ZWRDb2xvclNldC5sZW5ndGhdXTtcblx0XHRcdFx0ZGF0YVNlcmllcy5jb2xvciA9IHRoaXMuX3NlbGVjdGVkQ29sb3JTZXRbZGF0YVNlcmllcy5pbmRleCAlIHRoaXMuX3NlbGVjdGVkQ29sb3JTZXQubGVuZ3RoXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwibGluZVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGVwTGluZVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzcGxpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwiYXJlYVwiXG5cdFx0XHRcdFx0fHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0ZXBBcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInNwbGluZUFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEFyZWExMDBcIlxuXHRcdFx0XHRcdHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJyYW5nZUFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwicmFuZ2VTcGxpbmVBcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImNhbmRsZXN0aWNrXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcIm9obGNcIikge1xuXHRcdFx0XHRcdGRhdGFTZXJpZXMuX2NvbG9yU2V0ID0gW3RoaXMuX3NlbGVjdGVkQ29sb3JTZXRbMF1dO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRkYXRhU2VyaWVzLl9jb2xvclNldCA9IHRoaXMuX3NlbGVjdGVkQ29sb3JTZXQ7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRhdGFTZXJpZXMuX2NvbG9yU2V0ID0gW2RhdGFTZXJpZXMuY29sb3JdO1xuXHRcdH1cblxuXHRcdGlmIChkYXRhU2VyaWVzLm1hcmtlclNpemUgPT09IG51bGwpIHtcblx0XHRcdGlmICgoKGRhdGFTZXJpZXMudHlwZSA9PT0gXCJsaW5lXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0ZXBMaW5lXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInNwbGluZVwiKSAmJiBkYXRhU2VyaWVzLmRhdGFQb2ludHMgJiYgZGF0YVNlcmllcy5kYXRhUG9pbnRzLmxlbmd0aCA8IHRoaXMud2lkdGggLyAxNikgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInNjYXR0ZXJcIikge1xuXHRcdFx0XHQvL2lmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwibGluZVwiKSB7XG5cdFx0XHRcdGRhdGFTZXJpZXMubWFya2VyU2l6ZSA9IDg7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKChkYXRhU2VyaWVzLnR5cGUgPT09IFwiYnViYmxlXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInNjYXR0ZXJcIikgJiYgZGF0YVNlcmllcy5kYXRhUG9pbnRzKSB7XG5cdFx0XHRkYXRhU2VyaWVzLmRhdGFQb2ludHMuc29ydChjb21wYXJlRGF0YVBvaW50WClcblx0XHR9XG5cblx0XHQvL2lmIChkYXRhU2VyaWVzLm1hcmtlckJvcmRlclRoaWNrbmVzcyA9PT0gbnVsbCAmJiBkYXRhU2VyaWVzLnR5cGUgPT09IFwic2NhdHRlclwiKSB7XG5cdFx0Ly8gICAgZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJUaGlja25lc3MgPSAyO1xuXHRcdC8vfVxuXG5cdFx0Ly9pZiAoZGF0YVNlcmllcy5tYXJrZXJUeXBlID09PSBudWxsKSB7XG5cdFx0Ly8gICAgaWYgKGRhdGFTZXJpZXMudHlwZSA9PT0gXCJsaW5lXCIgJiBkYXRhU2VyaWVzLmRhdGFQb2ludHMubGVuZ3RoIDwgNTAwKSB7XG5cdFx0Ly8gICAgICAgIGRhdGFTZXJpZXMubWFya2VyVHlwZSA9IFwiY2lyY2xlXCI7XG5cdFx0Ly8gICAgfVxuXHRcdC8vfVxuXG5cdFx0dGhpcy5kYXRhLnB1c2goZGF0YVNlcmllcyk7XG5cblx0XHR2YXIgc2VyaWVzQXhpc1BsYWNlbWVudCA9IGRhdGFTZXJpZXMuYXhpc1BsYWNlbWVudDtcblxuXHRcdC8vaWYgKGlzRGVidWdNb2RlICYmIHdpbmRvdy5jb25zb2xlKVxuXHRcdC8vICAgIHdpbmRvdy5jb25zb2xlLmxvZyhkYXRhU2VyaWVzLnR5cGUpO1xuXG5cdFx0dmFyIGVycm9yTWVzc2FnZTtcblxuXHRcdGlmIChzZXJpZXNBeGlzUGxhY2VtZW50ID09PSBcIm5vcm1hbFwiKSB7XG5cblx0XHRcdGlmICh0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcblx0XHRcdFx0ZXJyb3JNZXNzYWdlID0gXCJZb3UgY2Fubm90IGNvbWJpbmUgXFxcIlwiICsgZGF0YVNlcmllcy50eXBlICsgXCJcXFwiIHdpdGggYmFyIGNoYXJ0XCI7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gXCJub25lXCIpIHtcblx0XHRcdFx0ZXJyb3JNZXNzYWdlID0gXCJZb3UgY2Fubm90IGNvbWJpbmUgXFxcIlwiICsgZGF0YVNlcmllcy50eXBlICsgXCJcXFwiIHdpdGggcGllIGNoYXJ0XCI7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gbnVsbClcblx0XHRcdFx0dGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID0gXCJub3JtYWxcIjtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoc2VyaWVzQXhpc1BsYWNlbWVudCA9PT0gXCJ4eVN3YXBwZWRcIikge1xuXG5cdFx0XHRpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcIm5vcm1hbFwiKSB7XG5cdFx0XHRcdGVycm9yTWVzc2FnZSA9IFwiWW91IGNhbm5vdCBjb21iaW5lIFxcXCJcIiArIGRhdGFTZXJpZXMudHlwZSArIFwiXFxcIiB3aXRoIGxpbmUsIGFyZWEsIGNvbHVtbiBvciBwaWUgY2hhcnRcIjtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcIm5vbmVcIikge1xuXHRcdFx0XHRlcnJvck1lc3NhZ2UgPSBcIllvdSBjYW5ub3QgY29tYmluZSBcXFwiXCIgKyBkYXRhU2VyaWVzLnR5cGUgKyBcIlxcXCIgd2l0aCBwaWUgY2hhcnRcIjtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBudWxsKVxuXHRcdFx0XHR0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPSBcInh5U3dhcHBlZFwiO1xuXHRcdH1cblx0XHRlbHNlIGlmIChzZXJpZXNBeGlzUGxhY2VtZW50ID09IFwibm9uZVwiKSB7XG5cblx0XHRcdGlmICh0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwibm9ybWFsXCIpIHtcblx0XHRcdFx0ZXJyb3JNZXNzYWdlID0gXCJZb3UgY2Fubm90IGNvbWJpbmUgXFxcIlwiICsgZGF0YVNlcmllcy50eXBlICsgXCJcXFwiIHdpdGggbGluZSwgYXJlYSwgY29sdW1uIG9yIGJhciBjaGFydFwiO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcblx0XHRcdFx0ZXJyb3JNZXNzYWdlID0gXCJZb3UgY2Fubm90IGNvbWJpbmUgXFxcIlwiICsgZGF0YVNlcmllcy50eXBlICsgXCJcXFwiIHdpdGggYmFyIGNoYXJ0XCI7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gbnVsbClcblx0XHRcdFx0dGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID0gXCJub25lXCI7XG5cdFx0fVxuXG5cdFx0aWYgKGVycm9yTWVzc2FnZSAmJiB3aW5kb3cuY29uc29sZSkge1xuXHRcdFx0d2luZG93LmNvbnNvbGUubG9nKGVycm9yTWVzc2FnZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0Ly9pZiAoaXNEZWJ1Z01vZGUgJiYgd2luZG93LmNvbnNvbGUpIHtcblx0Ly8gICAgd2luZG93LmNvbnNvbGUubG9nKFwieE1pbjogXCIgKyB0aGlzLnBsb3RJbmZvLnZpZXdQb3J0WE1pbiArIFwiOyB4TWF4OiBcIiArIHRoaXMucGxvdEluZm8udmlld1BvcnRYTWF4ICsgXCI7IHlNaW46IFwiICsgdGhpcy5wbG90SW5mby55TWluICsgXCI7IHlNYXg6IFwiICsgdGhpcy5wbG90SW5mby55TWF4KTtcblx0Ly99XG5cblx0dGhpcy5fb2JqZWN0c0luaXRpYWxpemVkID0gdHJ1ZTtcbn1cblxuLy9pbmRleE9mIGlzIG5vdCBzdXBwb3J0ZWQgaW4gSUU4LVxuQ2hhcnQuX3N1cHBvcnRlZENoYXJ0VHlwZXMgPSBhZGRBcnJheUluZGV4T2YoW1wibGluZVwiLCBcInN0ZXBMaW5lXCIsIFwic3BsaW5lXCIsIFwiY29sdW1uXCIsIFwiYXJlYVwiLCBcInN0ZXBBcmVhXCIsIFwic3BsaW5lQXJlYVwiLCBcImJhclwiLCBcImJ1YmJsZVwiLCBcInNjYXR0ZXJcIixcblx0XCJzdGFja2VkQ29sdW1uXCIsIFwic3RhY2tlZENvbHVtbjEwMFwiLCBcInN0YWNrZWRCYXJcIiwgXCJzdGFja2VkQmFyMTAwXCIsXG5cdFwic3RhY2tlZEFyZWFcIiwgXCJzdGFja2VkQXJlYTEwMFwiLFxuXHRcImNhbmRsZXN0aWNrXCIsXG5cdFwib2hsY1wiLFxuXHRcInJhbmdlQ29sdW1uXCIsXG5cdFwicmFuZ2VCYXJcIixcblx0XCJyYW5nZUFyZWFcIixcblx0XCJyYW5nZVNwbGluZUFyZWFcIixcblx0XCJwaWVcIiwgXCJkb3VnaG51dFwiLCBcImZ1bm5lbFwiXG5dKTtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cblx0aWYgKG9wdGlvbnMpXG5cdFx0dGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG5cblx0dGhpcy5faW5pdGlhbGl6ZSgpO1xuXHR2YXIgcGxvdEFyZWFFbGVtZW50cyA9IFtdOyAvL0VsZW1lbnRzIHRvIGJlIHJlbmRlcmVkIGluc2lkZSB0aGUgcGxvdEFyZWFcblxuXHQvL0NyZWF0ZSBQcmltYXJ5IGFuZCBTZWNvbmRhcnkgYXhpcyBhbmQgYXNzaWduIHRoZW0gdG8gdGhlIHNlcmllc1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuXG5cdFx0aWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gXCJub3JtYWxcIiB8fCB0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcblx0XHRcdGlmICghdGhpcy5kYXRhW2ldLmF4aXNZVHlwZSB8fCB0aGlzLmRhdGFbaV0uYXhpc1lUeXBlID09PSBcInByaW1hcnlcIikge1xuXHRcdFx0XHRpZiAoIXRoaXMuYXhpc1kpIHtcblxuXHRcdFx0XHRcdGlmICh0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwibm9ybWFsXCIpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2F4ZXMucHVzaCh0aGlzLmF4aXNZID0gbmV3IEF4aXModGhpcywgdGhpcy5fb3B0aW9ucy5heGlzWSwgXCJheGlzWVwiLCBcImxlZnRcIikpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIGlmICh0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2F4ZXMucHVzaCh0aGlzLmF4aXNZID0gbmV3IEF4aXModGhpcywgdGhpcy5fb3B0aW9ucy5heGlzWSwgXCJheGlzWVwiLCBcImJvdHRvbVwiKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZGF0YVtpXS5heGlzWSA9IHRoaXMuYXhpc1k7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICh0aGlzLmRhdGFbaV0uYXhpc1lUeXBlID09PSBcInNlY29uZGFyeVwiKSB7XG5cdFx0XHRcdGlmICghdGhpcy5heGlzWTIpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcIm5vcm1hbFwiKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9heGVzLnB1c2godGhpcy5heGlzWTIgPSBuZXcgQXhpcyh0aGlzLCB0aGlzLl9vcHRpb25zLmF4aXNZMiwgXCJheGlzWVwiLCBcInJpZ2h0XCIpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcInh5U3dhcHBlZFwiKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9heGVzLnB1c2godGhpcy5heGlzWTIgPSBuZXcgQXhpcyh0aGlzLCB0aGlzLl9vcHRpb25zLmF4aXNZMiwgXCJheGlzWVwiLCBcInRvcFwiKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZGF0YVtpXS5heGlzWSA9IHRoaXMuYXhpc1kyO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXRoaXMuYXhpc1gpIHtcblx0XHRcdFx0aWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gXCJub3JtYWxcIikge1xuXHRcdFx0XHRcdHRoaXMuX2F4ZXMucHVzaCh0aGlzLmF4aXNYID0gbmV3IEF4aXModGhpcywgdGhpcy5fb3B0aW9ucy5heGlzWCwgXCJheGlzWFwiLCBcImJvdHRvbVwiKSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcInh5U3dhcHBlZFwiKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXhlcy5wdXNoKHRoaXMuYXhpc1ggPSBuZXcgQXhpcyh0aGlzLCB0aGlzLl9vcHRpb25zLmF4aXNYLCBcImF4aXNYXCIsIFwibGVmdFwiKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5kYXRhW2ldLmF4aXNYID0gdGhpcy5heGlzWDtcblx0XHR9XG5cdH1cblxuXHQvL0lmIEJvdGggUHJpbWFyeSBhbmQgU2Vjb25kYXJ5IGF4aXMgYXJlIHByZXNlbnQsIGRpc2FibGUgZ3JpZGxpbmVzIGZvciBvbmUgb2YgdGhlbSB1bmxlc3MgdGhlIHVzZXIgaGFzIHNldCB2YWx1ZSBmb3IgYm90aFxuXHRpZiAodGhpcy5heGlzWSAmJiB0aGlzLmF4aXNZMikge1xuXHRcdGlmICh0aGlzLmF4aXNZLmdyaWRUaGlja25lc3MgPiAwICYmIHR5cGVvZiAodGhpcy5heGlzWTIuX29wdGlvbnMuZ3JpZFRoaWNrbmVzcykgPT09IFwidW5kZWZpbmVkXCIpXG5cdFx0XHR0aGlzLmF4aXNZMi5ncmlkVGhpY2tuZXNzID0gMDtcblx0XHRlbHNlIGlmICh0aGlzLmF4aXNZMi5ncmlkVGhpY2tuZXNzID4gMCAmJiB0eXBlb2YgKHRoaXMuYXhpc1kuX29wdGlvbnMuZ3JpZFRoaWNrbmVzcykgPT09IFwidW5kZWZpbmVkXCIpXG5cdFx0XHR0aGlzLmF4aXNZLmdyaWRUaGlja25lc3MgPSAwO1xuXHR9XG5cblxuXHQvL1Nob3cgdG9vbEJhciB3aGVuIHZpZXdwb3J0TWluaW11bS92aWV3cG9ydE1heGltdW0gYXJlIHNldFxuXHR2YXIgc2hvd1Rvb2xCYXIgPSBmYWxzZTtcblx0aWYgKHRoaXMuX2F4ZXMubGVuZ3RoID4gMCAmJiAodGhpcy56b29tRW5hYmxlZCB8fCB0aGlzLnBhbkVuYWJsZWQpKSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9heGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAodGhpcy5fYXhlc1tpXS52aWV3cG9ydE1pbmltdW0gIT09IG51bGwgfHwgdGhpcy5fYXhlc1tpXS52aWV3cG9ydE1heGltdW0gIT09IG51bGwpIHtcblx0XHRcdFx0c2hvd1Rvb2xCYXIgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoc2hvd1Rvb2xCYXIpIHtcblx0XHRzaG93KHRoaXMuX3pvb21CdXR0b24sIHRoaXMuX3Jlc2V0QnV0dG9uKTtcblx0fSBlbHNlIHtcblx0XHRoaWRlKHRoaXMuX3pvb21CdXR0b24sIHRoaXMuX3Jlc2V0QnV0dG9uKTtcblx0fVxuXG5cblx0dGhpcy5fcHJvY2Vzc0RhdGEoKTsvLyBDYXRlZ29yaXNlcyB0aGUgZGF0YVNlcmllcyBhbmQgY2FsY3VsYXRlcyBtaW4sIG1heCBhbmQgb3RoZXIgdmFsdWVzXG5cblx0aWYgKHRoaXMuX29wdGlvbnMudGl0bGUpIHtcblx0XHR0aGlzLl90aXRsZSA9IG5ldyBUaXRsZSh0aGlzLCB0aGlzLl9vcHRpb25zLnRpdGxlKTtcblxuXHRcdGlmICghdGhpcy5fdGl0bGUuZG9ja0luc2lkZVBsb3RBcmVhKVxuXHRcdFx0dGhpcy5fdGl0bGUucmVuZGVyKCk7XG5cdFx0ZWxzZVxuXHRcdFx0cGxvdEFyZWFFbGVtZW50cy5wdXNoKHRoaXMuX3RpdGxlKTtcblx0fVxuXG5cdGlmICh0aGlzLl9vcHRpb25zLnN1YnRpdGxlcykge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fb3B0aW9ucy5zdWJ0aXRsZXMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0dGhpcy5zdWJ0aXRsZXMgPSBbXTtcblxuXHRcdFx0dmFyIHN1YnRpdGxlID0gbmV3IFN1YnRpdGxlKHRoaXMsIHRoaXMuX29wdGlvbnMuc3VidGl0bGVzW2ldKTtcblx0XHRcdHRoaXMuc3VidGl0bGVzLnB1c2goc3VidGl0bGUpO1xuXG5cdFx0XHRpZiAoIXN1YnRpdGxlLmRvY2tJbnNpZGVQbG90QXJlYSlcblx0XHRcdFx0c3VidGl0bGUucmVuZGVyKCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHBsb3RBcmVhRWxlbWVudHMucHVzaChzdWJ0aXRsZSk7XG5cdFx0fVxuXHR9XG5cblx0dGhpcy5sZWdlbmQgPSBuZXcgTGVnZW5kKHRoaXMsIHRoaXMuX29wdGlvbnMubGVnZW5kLCB0aGlzLnRoZW1lKTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAodGhpcy5kYXRhW2ldLnNob3dJbkxlZ2VuZCB8fCB0aGlzLmRhdGFbaV0udHlwZSA9PT0gXCJwaWVcIiB8fCB0aGlzLmRhdGFbaV0udHlwZSA9PT0gXCJkb3VnaG51dFwiKSB7XG5cdFx0XHR0aGlzLmxlZ2VuZC5kYXRhU2VyaWVzLnB1c2godGhpcy5kYXRhW2ldKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoIXRoaXMubGVnZW5kLmRvY2tJbnNpZGVQbG90QXJlYSlcblx0XHR0aGlzLmxlZ2VuZC5yZW5kZXIoKTtcblx0ZWxzZVxuXHRcdHBsb3RBcmVhRWxlbWVudHMucHVzaCh0aGlzLmxlZ2VuZCk7XG5cblx0Ly9UQkk6IFJldmlzaXQgYW5kIGNoZWNrIGlmIHRoZSBmdW5jdGlvbmFsaXR5IGlzIGVub3VnaC5cblx0aWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gXCJub3JtYWxcIiB8fCB0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcblxuXHRcdC8vdmFyIGZyZWVTcGFjZSA9IHRoaXMubGF5b3V0TWFuYWdlci5nZXRGcmVlU3BhY2UoKTtcblxuXHRcdEF4aXMuc2V0TGF5b3V0QW5kUmVuZGVyKHRoaXMuYXhpc1gsIHRoaXMuYXhpc1ksIHRoaXMuYXhpc1kyLCB0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQsIHRoaXMubGF5b3V0TWFuYWdlci5nZXRGcmVlU3BhY2UoKSk7XG5cdH0gZWxzZSBpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcIm5vbmVcIikge1xuXHRcdC8vSW4gY2FzZSBvZiBjaGFydHMgd2l0aCBheGlzIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbnNpZGUgc2V0TGF5b3V0QW5kUmVuZGVyXG5cdFx0dGhpcy5wcmVwYXJlUGxvdEFyZWEoKTtcblx0fVxuXHRlbHNlIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR2YXIgaW5kZXggPSAwO1xuXHRmb3IgKGluZGV4IGluIHBsb3RBcmVhRWxlbWVudHMpIHtcblx0XHRpZihwbG90QXJlYUVsZW1lbnRzLmhhc093blByb3BlcnR5KGluZGV4KSlcblx0XHRwbG90QXJlYUVsZW1lbnRzW2luZGV4XS5yZW5kZXIoKTtcblx0fVxuXG5cdHZhciBhbmltYXRpb25zID0gW107XG5cdGlmICh0aGlzLmFuaW1hdGVkUmVuZGVyKSB7XG5cdFx0dmFyIGluaXRpYWxTdGF0ZSA9IGNyZWF0ZUNhbnZhcyh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG5cdFx0dmFyIGluaXRpYWxTdGF0ZUN0eCA9IGluaXRpYWxTdGF0ZS5nZXRDb250ZXh0KFwiMmRcIik7XG5cdFx0aW5pdGlhbFN0YXRlQ3R4LmRyYXdJbWFnZSh0aGlzLmNhbnZhcywgMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuXHR9XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBsb3RJbmZvLnBsb3RUeXBlcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBwbG90VHlwZSA9IHRoaXMucGxvdEluZm8ucGxvdFR5cGVzW2ldO1xuXG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VHlwZS5wbG90VW5pdHMubGVuZ3RoOyBqKyspIHtcblxuXHRcdFx0dmFyIHBsb3RVbml0ID0gcGxvdFR5cGUucGxvdFVuaXRzW2pdO1xuXHRcdFx0dmFyIGFuaW1hdGlvbkluZm8gPSBudWxsO1xuXG5cdFx0XHRwbG90VW5pdC50YXJnZXRDYW52YXMgPSBudWxsOyAvL0luIGNhc2UgY2hhcnQgdXBkYXRlcyBiZWZvcmUgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZSwgcHJldmlvdXMgY2FudmFzZXMgbmVlZCB0byBiZSByZW1vdmVkXG5cblx0XHRcdGlmICh0aGlzLmFuaW1hdGVkUmVuZGVyKSB7XG5cdFx0XHRcdHBsb3RVbml0LnRhcmdldENhbnZhcyA9IGNyZWF0ZUNhbnZhcyh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG5cdFx0XHRcdHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwbG90VW5pdC50eXBlID09PSBcImxpbmVcIilcblx0XHRcdFx0YW5pbWF0aW9uSW5mbyA9IHRoaXMucmVuZGVyTGluZShwbG90VW5pdCk7XG5cdFx0XHRlbHNlIGlmIChwbG90VW5pdC50eXBlID09PSBcInN0ZXBMaW5lXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclN0ZXBMaW5lKHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwic3BsaW5lXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclNwbGluZShwbG90VW5pdCk7XG5cdFx0XHRlbHNlIGlmIChwbG90VW5pdC50eXBlID09PSBcImNvbHVtblwiKVxuXHRcdFx0XHRhbmltYXRpb25JbmZvID0gdGhpcy5yZW5kZXJDb2x1bW4ocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJiYXJcIilcblx0XHRcdFx0YW5pbWF0aW9uSW5mbyA9IHRoaXMucmVuZGVyQmFyKHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwiYXJlYVwiKVxuXHRcdFx0XHRhbmltYXRpb25JbmZvID0gdGhpcy5yZW5kZXJBcmVhKHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwic3RlcEFyZWFcIilcblx0XHRcdFx0YW5pbWF0aW9uSW5mbyA9IHRoaXMucmVuZGVyU3RlcEFyZWEocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzcGxpbmVBcmVhXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclNwbGluZUFyZWEocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclN0YWNrZWRDb2x1bW4ocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uMTAwXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclN0YWNrZWRDb2x1bW4xMDAocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQmFyXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclN0YWNrZWRCYXIocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQmFyMTAwXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclN0YWNrZWRCYXIxMDAocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQXJlYVwiKVxuXHRcdFx0XHRhbmltYXRpb25JbmZvID0gdGhpcy5yZW5kZXJTdGFja2VkQXJlYShwbG90VW5pdCk7XG5cdFx0XHRlbHNlIGlmIChwbG90VW5pdC50eXBlID09PSBcInN0YWNrZWRBcmVhMTAwXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclN0YWNrZWRBcmVhMTAwKHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwiYnViYmxlXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSBhbmltYXRpb25JbmZvID0gdGhpcy5yZW5kZXJCdWJibGUocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzY2F0dGVyXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclNjYXR0ZXIocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJwaWVcIilcblx0XHRcdFx0dGhpcy5yZW5kZXJQaWUocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJkb3VnaG51dFwiKVxuXHRcdFx0XHR0aGlzLnJlbmRlclBpZShwbG90VW5pdCk7XG5cdFx0XHRlbHNlIGlmIChwbG90VW5pdC50eXBlID09PSBcImNhbmRsZXN0aWNrXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlckNhbmRsZXN0aWNrKHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwib2hsY1wiKVxuXHRcdFx0XHRhbmltYXRpb25JbmZvID0gdGhpcy5yZW5kZXJDYW5kbGVzdGljayhwbG90VW5pdCk7XG5cdFx0XHRlbHNlIGlmIChwbG90VW5pdC50eXBlID09PSBcInJhbmdlQ29sdW1uXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclJhbmdlQ29sdW1uKHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwicmFuZ2VCYXJcIilcblx0XHRcdFx0YW5pbWF0aW9uSW5mbyA9IHRoaXMucmVuZGVyUmFuZ2VCYXIocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJyYW5nZUFyZWFcIilcblx0XHRcdFx0YW5pbWF0aW9uSW5mbyA9IHRoaXMucmVuZGVyUmFuZ2VBcmVhKHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwicmFuZ2VTcGxpbmVBcmVhXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclJhbmdlU3BsaW5lQXJlYShwbG90VW5pdCk7XG5cblx0XHRcdGZvciAodmFyIGsgPSAwOyBrIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0dGhpcy5fZGF0YUluUmVuZGVyZWRPcmRlci5wdXNoKHRoaXMuZGF0YVtwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1trXV0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5hbmltYXRlZFJlbmRlciAmJiBhbmltYXRpb25JbmZvKVxuXHRcdFx0XHRhbmltYXRpb25zLnB1c2goYW5pbWF0aW9uSW5mbyk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHRoaXMuYW5pbWF0ZWRSZW5kZXIgJiYgdGhpcy5faW5kZXhMYWJlbHMubGVuZ3RoID4gMCkge1xuXHRcdHZhciBpbmRleExhYmVsQ2FudmFzID0gY3JlYXRlQ2FudmFzKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblx0XHR2YXIgaW5kZXhMYWJlbENhbnZhc0N0eCA9IGluZGV4TGFiZWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuXHRcdGFuaW1hdGlvbnMucHVzaCh0aGlzLnJlbmRlckluZGV4TGFiZWxzKGluZGV4TGFiZWxDYW52YXNDdHgpKTtcblx0fVxuXG5cdHZhciBfdGhpcyA9IHRoaXM7XG5cblx0aWYgKGFuaW1hdGlvbnMubGVuZ3RoID4gMCkge1xuXHRcdC8vdmFyIGFuaW1hdGlvbkNvdW50ID0gMDtcblx0XHRfdGhpcy5kaXNhYmxlVG9vbFRpcCA9IHRydWU7XG5cdFx0X3RoaXMuX2FuaW1hdG9yLmFuaW1hdGUoMjAwLCBfdGhpcy5hbmltYXRpb25EdXJhdGlvbiwgZnVuY3Rpb24gKGZyYWN0aW9uQ29tcGxldGUpIHtcblxuXHRcdFx0Ly9jb25zb2xlLmxvZyhmcmFjdGlvbkNvbXBsZXRlKTtcblx0XHRcdC8vYW5pbWF0aW9uQ291bnQrKztcblxuXHRcdFx0X3RoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCBfdGhpcy53aWR0aCwgX3RoaXMuaGVpZ2h0KTtcblxuXG5cdFx0XHQvLyAgX3RoaXMuY3R4LmRyYXdJbWFnZShpbml0aWFsU3RhdGUsIDAsIDAsIF90aGlzLndpZHRoICogZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbywgX3RoaXMuaGVpZ2h0ICogZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbywgMCwgMCwgX3RoaXMud2lkdGgsIF90aGlzLmhlaWdodCk7XG5cdFx0XHRfdGhpcy5jdHguZHJhd0ltYWdlKGluaXRpYWxTdGF0ZSwgMCwgMCwgTWF0aC5mbG9vcihfdGhpcy53aWR0aCAqIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8pLCBNYXRoLmZsb29yKF90aGlzLmhlaWdodCAqIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8pLCAwLCAwLCBfdGhpcy53aWR0aCwgX3RoaXMuaGVpZ2h0KTtcblxuXHRcdFx0Zm9yICh2YXIgbCA9IDA7IGwgPCBhbmltYXRpb25zLmxlbmd0aDsgbCsrKSB7XG5cblx0XHRcdFx0YW5pbWF0aW9uSW5mbyA9IGFuaW1hdGlvbnNbbF07XG5cblx0XHRcdFx0aWYgKGZyYWN0aW9uQ29tcGxldGUgPCAxICYmIHR5cGVvZiAoYW5pbWF0aW9uSW5mby5zdGFydFRpbWVQZXJjZW50KSAhPT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0XHRcdGlmIChmcmFjdGlvbkNvbXBsZXRlID49IGFuaW1hdGlvbkluZm8uc3RhcnRUaW1lUGVyY2VudCkge1xuXHRcdFx0XHRcdFx0Ly9hbmltYXRpb25JbmZvLmFuaW1hdGlvbkNhbGxiYWNrKEFuaW1hdGlvbkhlbHBlci5lYXNpbmcubGluZWFyKGZyYWN0aW9uQ29tcGxldGUgLSBhbmltYXRpb25JbmZvLnN0YXJ0VGltZVBlcmNlbnQsIDAsIDEsIDEgLSBhbmltYXRpb25JbmZvLnN0YXJ0VGltZVBlcmNlbnQpLCBhbmltYXRpb25JbmZvKTtcblxuXHRcdFx0XHRcdFx0YW5pbWF0aW9uSW5mby5hbmltYXRpb25DYWxsYmFjayhhbmltYXRpb25JbmZvLmVhc2luZ0Z1bmN0aW9uKGZyYWN0aW9uQ29tcGxldGUgLSBhbmltYXRpb25JbmZvLnN0YXJ0VGltZVBlcmNlbnQsIDAsIDEsIDEgLSBhbmltYXRpb25JbmZvLnN0YXJ0VGltZVBlcmNlbnQpLCBhbmltYXRpb25JbmZvKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25JbmZvLmFuaW1hdGlvbkNhbGxiYWNrKGFuaW1hdGlvbkluZm8uZWFzaW5nRnVuY3Rpb24oZnJhY3Rpb25Db21wbGV0ZSwgMCwgMSwgMSksIGFuaW1hdGlvbkluZm8pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdF90aGlzLmRpc3BhdGNoRXZlbnQoXCJkYXRhQW5pbWF0aW9uSXRlcmF0aW9uRW5kXCIsXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Y2hhcnQ6IF90aGlzXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHR9LCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGFuaW1hdGlvbnMgPSBbXTtcblxuXHRcdFx0dmFyIGNvdW50ID0gMDtcblxuXHRcdFx0Ly9EZWxldGUgYWxsIHJlbmRlciB0YXJnZXQgY2FudmFzZXMgdXNlZCBmb3IgYW5pbWF0aW9uLlxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBfdGhpcy5wbG90SW5mby5wbG90VHlwZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIHBsb3RUeXBlID0gX3RoaXMucGxvdEluZm8ucGxvdFR5cGVzW2ldO1xuXG5cdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0dmFyIHBsb3RVbml0ID0gcGxvdFR5cGUucGxvdFVuaXRzW2pdO1xuXHRcdFx0XHRcdHBsb3RVbml0LnRhcmdldENhbnZhcyA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aW5pdGlhbFN0YXRlID0gbnVsbDtcblx0XHRcdF90aGlzLmRpc2FibGVUb29sVGlwID0gZmFsc2U7XG5cdFx0XHQvL2NvbnNvbGUubG9nKFwiKioqKioqKioqKiogQW5pbWF0aW9uIENvbXBsZXRlIC0gXCIgKyBhbmltYXRpb25Db3VudCArIFwiICoqKioqKioqKioqXCIpO1xuXG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0aWYgKF90aGlzLl9pbmRleExhYmVscy5sZW5ndGggPiAwKVxuXHRcdFx0X3RoaXMucmVuZGVySW5kZXhMYWJlbHMoKTtcblxuXHRcdF90aGlzLmRpc3BhdGNoRXZlbnQoXCJkYXRhQW5pbWF0aW9uSXRlcmF0aW9uRW5kXCIsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjaGFydDogX3RoaXNcblx0XHRcdFx0fSk7XG5cdH1cblxuXHR0aGlzLmF0dGFjaFBsb3RBcmVhRXZlbnRIYW5kbGVycygpO1xuXG5cdGlmICghdGhpcy56b29tRW5hYmxlZCAmJiAhdGhpcy5wYW5FbmFibGVkICYmIHRoaXMuX3pvb21CdXR0b24gJiYgdGhpcy5fem9vbUJ1dHRvbi5zdHlsZS5kaXNwbGF5ICE9PSBcIm5vbmVcIikge1xuXHRcdGhpZGUodGhpcy5fem9vbUJ1dHRvbiwgdGhpcy5fcmVzZXRCdXR0b24pO1xuXHR9XG5cblx0dGhpcy5fdG9vbFRpcC5fdXBkYXRlVG9vbFRpcCgpO1xuXG5cdHRoaXMucmVuZGVyQ291bnQrKztcblxuXHQvL2lmICh3aW5kb3cuY29uc29sZSkge1xuXHQvLyAgICB3aW5kb3cuY29uc29sZS5sb2cobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBkdCk7XG5cdC8vfVxuXG5cdGlmIChpc0RlYnVnTW9kZSkge1xuXG5cdFx0dmFyIF90aGlzID0gdGhpcztcblx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBnaG9zdENhbnZhc0NvcHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImdob3N0Q2FudmFzQ29weVwiKTtcblxuXHRcdFx0aWYgKGdob3N0Q2FudmFzQ29weSkge1xuXHRcdFx0XHQvL2NvbnNvbGUubG9nKGdob3N0Q2FudmFzQ29weS5jbGllbnRXaWR0aCk7XG5cdFx0XHRcdHNldENhbnZhc1NpemUoZ2hvc3RDYW52YXNDb3B5LCBfdGhpcy53aWR0aCwgX3RoaXMuaGVpZ2h0KTtcblx0XHRcdFx0dmFyIGdob3N0Q2FudmFzQ29weUN0eCA9IGdob3N0Q2FudmFzQ29weS5nZXRDb250ZXh0KFwiMmRcIik7XG5cblx0XHRcdFx0Ly9naG9zdENhbnZhc0NvcHlDdHguc2NhbGUoMSwgMSk7XG5cdFx0XHRcdC8vdmFyIGltYWdlRGF0YSA9IHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy5fY29udGFpbmVyLmNsaWVudFdpZHRoLCB0aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0KTtcblx0XHRcdFx0Ly90aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguZHJhd0ltYWdlKHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdENhbnZhcywgMCwgMCk7XG5cdFx0XHRcdC8vdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdENhbnZhcywgMCwgMCk7XG5cblx0XHRcdFx0Z2hvc3RDYW52YXNDb3B5Q3R4LmRyYXdJbWFnZShfdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q2FudmFzLCAwLCAwKTtcblx0XHRcdFx0Ly9fdGhpcy5fY2FudmFzSlNDb250YWluZXIuYXBwZW5kQ2hpbGQoX3RoaXMuX2V2ZW50TWFuYWdlci5naG9zdENhbnZhcyk7XG5cdFx0XHRcdC8vX3RoaXMub3ZlcmxhaWRDYW52YXNDdHguZHJhd0ltYWdlKF90aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDYW52YXMsIDAsIDApO1xuXHRcdFx0fVxuXHRcdH0sIDIwMDApO1xuXHR9XG59XG5cbkNoYXJ0LnByb3RvdHlwZS5hdHRhY2hQbG90QXJlYUV2ZW50SGFuZGxlcnMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Ly90aGlzLl90b29sQmFyLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZVwiO1xuXG5cdHRoaXMuYXR0YWNoRXZlbnQoe1xuXHRcdGNvbnRleHQ6IHRoaXMsXG5cdFx0Y2hhcnQ6IHRoaXMsXG5cdFx0bW91c2Vkb3duOiB0aGlzLl9wbG90QXJlYU1vdXNlRG93bixcblx0XHRtb3VzZXVwOiB0aGlzLl9wbG90QXJlYU1vdXNlVXAsXG5cdFx0bW91c2Vtb3ZlOiB0aGlzLl9wbG90QXJlYU1vdXNlTW92ZSxcblx0XHRjdXJzb3I6IHRoaXMuem9vbUVuYWJsZWQgPyBcImNvbC1yZXNpemVcIiA6IFwibW92ZVwiLFxuXHRcdGN1cnNvcjogdGhpcy5wYW5FbmFibGVkID8gXCJtb3ZlXCIgOiBcImRlZmF1bHRcIixcblx0XHRjYXB0dXJlOiB0cnVlLFxuXHRcdGJvdW5kczogdGhpcy5wbG90QXJlYVxuXHR9KTtcblxufVxuXG5DaGFydC5wcm90b3R5cGUuY2F0ZWdvcmlzZURhdGFTZXJpZXMgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBkYXRhU2VyaWVzID0gXCJcIjtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuXHRcdGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbaV1cblx0XHRpZiAoIWRhdGFTZXJpZXMuZGF0YVBvaW50cyB8fCBkYXRhU2VyaWVzLmRhdGFQb2ludHMubGVuZ3RoID09PSAwIHx8ICFkYXRhU2VyaWVzLnZpc2libGUpXG5cdFx0XHRjb250aW51ZTtcblxuXHRcdGlmIChDaGFydC5fc3VwcG9ydGVkQ2hhcnRUeXBlcy5pbmRleE9mKGRhdGFTZXJpZXMudHlwZSkgPj0gMCkge1xuXG5cdFx0XHR2YXIgcGxvdFR5cGUgPSBudWxsO1xuXHRcdFx0dmFyIHBsb3RUeXBlRXhpc3RzID0gZmFsc2U7XG5cblx0XHRcdHZhciBwbG90VW5pdCA9IG51bGw7XG5cdFx0XHR2YXIgcGxvdFVuaXRFeGlzdHMgPSBmYWxzZTtcblxuXHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLnBsb3RJbmZvLnBsb3RUeXBlcy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRpZiAodGhpcy5wbG90SW5mby5wbG90VHlwZXNbal0udHlwZSA9PT0gZGF0YVNlcmllcy50eXBlKSB7XG5cdFx0XHRcdFx0cGxvdFR5cGVFeGlzdHMgPSB0cnVlO1xuXHRcdFx0XHRcdHZhciBwbG90VHlwZSA9IHRoaXMucGxvdEluZm8ucGxvdFR5cGVzW2pdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICghcGxvdFR5cGVFeGlzdHMpIHtcblx0XHRcdFx0cGxvdFR5cGUgPSB7XG5cdFx0XHRcdFx0dHlwZTogZGF0YVNlcmllcy50eXBlLFxuXHRcdFx0XHRcdHRvdGFsRGF0YVNlcmllczogMCxcblx0XHRcdFx0XHRwbG90VW5pdHM6IFtdXG5cdFx0XHRcdH07XG5cdFx0XHRcdHRoaXMucGxvdEluZm8ucGxvdFR5cGVzLnB1c2gocGxvdFR5cGUpXG5cdFx0XHR9XG5cblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdGlmIChwbG90VHlwZS5wbG90VW5pdHNbal0uYXhpc1lUeXBlID09PSBkYXRhU2VyaWVzLmF4aXNZVHlwZSkge1xuXHRcdFx0XHRcdHBsb3RVbml0RXhpc3RzID0gdHJ1ZTtcblx0XHRcdFx0XHR2YXIgcGxvdFVuaXQgPSBwbG90VHlwZS5wbG90VW5pdHNbal07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCFwbG90VW5pdEV4aXN0cykge1xuXHRcdFx0XHRwbG90VW5pdCA9IHtcblx0XHRcdFx0XHR0eXBlOiBkYXRhU2VyaWVzLnR5cGUsXG5cdFx0XHRcdFx0cHJldmlvdXNEYXRhU2VyaWVzQ291bnQ6IDAsIC8vdG8gYmUgc2V0IG5leHRcblx0XHRcdFx0XHRpbmRleDogcGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aCxcblx0XHRcdFx0XHRwbG90VHlwZTogcGxvdFR5cGUsXG5cdFx0XHRcdFx0YXhpc1lUeXBlOiBkYXRhU2VyaWVzLmF4aXNZVHlwZSxcblx0XHRcdFx0XHRheGlzWTogZGF0YVNlcmllcy5heGlzWVR5cGUgPT09IFwicHJpbWFyeVwiID8gdGhpcy5heGlzWSA6IHRoaXMuYXhpc1kyLFxuXHRcdFx0XHRcdGF4aXNYOiB0aGlzLmF4aXNYLFxuXHRcdFx0XHRcdGRhdGFTZXJpZXNJbmRleGVzOiBbXSwgLy9pbmRleCBvZiBkYXRhU2VyaWVzXG5cdFx0XHRcdFx0eVRvdGFsczogW11cblx0XHRcdFx0fVxuXHRcdFx0XHRwbG90VHlwZS5wbG90VW5pdHMucHVzaChwbG90VW5pdCk7XG5cdFx0XHR9XG5cblx0XHRcdHBsb3RUeXBlLnRvdGFsRGF0YVNlcmllcysrO1xuXG5cdFx0XHRwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5wdXNoKGkpO1xuXG5cdFx0XHRkYXRhU2VyaWVzLnBsb3RVbml0ID0gcGxvdFVuaXQ7XG5cdFx0fVxuXHR9XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBsb3RJbmZvLnBsb3RUeXBlcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBwbG90VHlwZSA9IHRoaXMucGxvdEluZm8ucGxvdFR5cGVzW2ldO1xuXHRcdHZhciBwcmV2aW91c0RhdGFTZXJpZXNDb3VudCA9IDA7XG5cblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RUeXBlLnBsb3RVbml0cy5sZW5ndGg7IGorKykge1xuXG5cdFx0XHRwbG90VHlwZS5wbG90VW5pdHNbal0ucHJldmlvdXNEYXRhU2VyaWVzQ291bnQgPSBwcmV2aW91c0RhdGFTZXJpZXNDb3VudDtcblxuXHRcdFx0cHJldmlvdXNEYXRhU2VyaWVzQ291bnQgKz0gcGxvdFR5cGUucGxvdFVuaXRzW2pdLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblx0XHR9XG5cdH1cbn1cblxuQ2hhcnQucHJvdG90eXBlLmFzc2lnbklkVG9EYXRhUG9pbnRzID0gZnVuY3Rpb24gKCkge1xuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbaV07XG5cblx0XHRpZiAoIWRhdGFTZXJpZXMuZGF0YVBvaW50cylcblx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0dmFyIGxlbmd0aCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50cy5sZW5ndGg7XG5cblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7XG5cdFx0XHRkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tqXSA9ICsrdGhpcy5fZXZlbnRNYW5hZ2VyLmxhc3RPYmplY3RJZDtcblx0XHR9XG5cdH1cbn1cblxuQ2hhcnQucHJvdG90eXBlLl9wcm9jZXNzRGF0YSA9IGZ1bmN0aW9uICgpIHtcblx0dGhpcy5hc3NpZ25JZFRvRGF0YVBvaW50cygpO1xuXHR0aGlzLmNhdGVnb3Jpc2VEYXRhU2VyaWVzKCk7XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBsb3RJbmZvLnBsb3RUeXBlcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBwbG90VHlwZSA9IHRoaXMucGxvdEluZm8ucGxvdFR5cGVzW2ldO1xuXG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VHlwZS5wbG90VW5pdHMubGVuZ3RoOyBqKyspIHtcblxuXHRcdFx0dmFyIHBsb3RVbml0ID0gcGxvdFR5cGUucGxvdFVuaXRzW2pdO1xuXG5cdFx0XHRpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJsaW5lXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJzdGVwTGluZVwiIHx8IHBsb3RVbml0LnR5cGUgPT09IFwic3BsaW5lXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJjb2x1bW5cIiB8fCBwbG90VW5pdC50eXBlID09PSBcImFyZWFcIiB8fCBwbG90VW5pdC50eXBlID09PSBcInN0ZXBBcmVhXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJzcGxpbmVBcmVhXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJiYXJcIiB8fCBwbG90VW5pdC50eXBlID09PSBcImJ1YmJsZVwiIHx8IHBsb3RVbml0LnR5cGUgPT09IFwic2NhdHRlclwiKVxuXHRcdFx0XHR0aGlzLl9wcm9jZXNzTXVsdGlzZXJpZXNQbG90VW5pdChwbG90VW5pdCk7XG5cdFx0XHRlbHNlIGlmIChwbG90VW5pdC50eXBlID09PSBcInN0YWNrZWRDb2x1bW5cIiB8fCBwbG90VW5pdC50eXBlID09PSBcInN0YWNrZWRCYXJcIiB8fCBwbG90VW5pdC50eXBlID09PSBcInN0YWNrZWRBcmVhXCIpXG5cdFx0XHRcdHRoaXMuX3Byb2Nlc3NTdGFja2VkUGxvdFVuaXQocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uMTAwXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQmFyMTAwXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQXJlYTEwMFwiKVxuXHRcdFx0XHR0aGlzLl9wcm9jZXNzU3RhY2tlZDEwMFBsb3RVbml0KHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwiY2FuZGxlc3RpY2tcIiB8fCBwbG90VW5pdC50eXBlID09PSBcIm9obGNcIiB8fCBwbG90VW5pdC50eXBlID09PSBcInJhbmdlQ29sdW1uXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJyYW5nZUJhclwiIHx8IHBsb3RVbml0LnR5cGUgPT09IFwicmFuZ2VBcmVhXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJyYW5nZVNwbGluZUFyZWFcIilcblx0XHRcdFx0dGhpcy5fcHJvY2Vzc011bHRpWVBsb3RVbml0KHBsb3RVbml0KTtcblx0XHR9XG5cdH1cblxufVxuXG5DaGFydC5wcm90b3R5cGUuX3Byb2Nlc3NNdWx0aXNlcmllc1Bsb3RVbml0ID0gZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cdGlmICghcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMgfHwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoIDwgMSlcblx0XHRyZXR1cm47XG5cblx0dmFyIGF4aXNZRGF0YUluZm8gPSBwbG90VW5pdC5heGlzWS5kYXRhSW5mbztcblx0dmFyIGF4aXNYRGF0YUluZm8gPSBwbG90VW5pdC5heGlzWC5kYXRhSW5mbztcblx0dmFyIGRhdGFQb2ludFgsIGRhdGFQb2ludFk7XG5cdHZhciBpc0RhdGVUaW1lID0gZmFsc2U7XG5cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal1dO1xuXHRcdHZhciBpID0gMDtcblx0XHR2YXIgaXNGaXJzdERQSW5WaWV3UG9ydCA9IGZhbHNlO1xuXHRcdHZhciBpc0xhc3REUEluVmlld1BvcnQgPSBmYWxzZTtcblxuXHRcdGlmIChkYXRhU2VyaWVzLmF4aXNQbGFjZW1lbnQgPT09IFwibm9ybWFsXCIgfHwgZGF0YVNlcmllcy5heGlzUGxhY2VtZW50ID09PSBcInh5U3dhcHBlZFwiKSB7XG5cblx0XHRcdHZhciBwbG90QXJlYVhNaW4gPSB0aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1gubmV3Vmlld3BvcnRNaW5pbXVtID8gdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLm5ld1ZpZXdwb3J0TWluaW11bSA6ICh0aGlzLl9vcHRpb25zLmF4aXNYICYmIHRoaXMuX29wdGlvbnMuYXhpc1gudmlld3BvcnRNaW5pbXVtKSA/XG5cdFx0XHRcdHRoaXMuX29wdGlvbnMuYXhpc1gudmlld3BvcnRNaW5pbXVtIDogKHRoaXMuX29wdGlvbnMuYXhpc1ggJiYgdGhpcy5fb3B0aW9ucy5heGlzWC5taW5pbXVtKSA/IHRoaXMuX29wdGlvbnMuYXhpc1gubWluaW11bSA6IC1JbmZpbml0eTtcblxuXHRcdFx0dmFyIHBsb3RBcmVhWE1heCA9IHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5uZXdWaWV3cG9ydE1heGltdW0gPyB0aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1gubmV3Vmlld3BvcnRNYXhpbXVtIDogKHRoaXMuX29wdGlvbnMuYXhpc1ggJiYgdGhpcy5fb3B0aW9ucy5heGlzWC52aWV3cG9ydE1heGltdW0pID9cblx0XHRcdFx0dGhpcy5fb3B0aW9ucy5heGlzWC52aWV3cG9ydE1heGltdW0gOiAodGhpcy5fb3B0aW9ucy5heGlzWCAmJiB0aGlzLl9vcHRpb25zLmF4aXNYLm1heGltdW0pID8gdGhpcy5fb3B0aW9ucy5heGlzWC5tYXhpbXVtIDogSW5maW5pdHk7XG5cdFx0fVxuXG5cblx0XHRpZiAoZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnggJiYgZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnguZ2V0VGltZSB8fCBkYXRhU2VyaWVzLnhWYWx1ZVR5cGUgPT09IFwiZGF0ZVRpbWVcIikge1xuXHRcdFx0aXNEYXRlVGltZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFTZXJpZXMuZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRpZiAodHlwZW9mIGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54ID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRcdGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54ID0gaTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54LmdldFRpbWUpIHtcblx0XHRcdFx0aXNEYXRlVGltZSA9IHRydWU7XG5cdFx0XHRcdGRhdGFQb2ludFggPSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCk7Ly9kYXRhUG9pbnRYIGlzIHVzZWQgc28gdGhhdCBnZXRUaW1lIGlzIGNhbGxlZCBvbmx5IG9uY2UgaW4gY2FzZSBvZiBkYXRlVGltZSB2YWx1ZXNcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54O1xuXG5cdFx0XHRkYXRhUG9pbnRZID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnk7XG5cblxuXHRcdFx0aWYgKGRhdGFQb2ludFggPCBheGlzWERhdGFJbmZvLm1pbilcblx0XHRcdFx0YXhpc1hEYXRhSW5mby5taW4gPSBkYXRhUG9pbnRYO1xuXHRcdFx0aWYgKGRhdGFQb2ludFggPiBheGlzWERhdGFJbmZvLm1heClcblx0XHRcdFx0YXhpc1hEYXRhSW5mby5tYXggPSBkYXRhUG9pbnRYO1xuXG5cdFx0XHRpZiAoZGF0YVBvaW50WSA8IGF4aXNZRGF0YUluZm8ubWluKVxuXHRcdFx0XHRheGlzWURhdGFJbmZvLm1pbiA9IGRhdGFQb2ludFk7XG5cblx0XHRcdGlmIChkYXRhUG9pbnRZID4gYXhpc1lEYXRhSW5mby5tYXgpXG5cdFx0XHRcdGF4aXNZRGF0YUluZm8ubWF4ID0gZGF0YVBvaW50WTtcblxuXG5cdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0dmFyIHhEaWZmID0gZGF0YVBvaW50WCAtIGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpIC0gMV0ueDtcblx0XHRcdFx0eERpZmYgPCAwICYmICh4RGlmZiA9IHhEaWZmICogLTEpOyAvL0lmIENvbmRpdGlvbiBzaG9ydGN1dFxuXG5cdFx0XHRcdGlmIChheGlzWERhdGFJbmZvLm1pbkRpZmYgPiB4RGlmZiAmJiB4RGlmZiAhPT0gMCkge1xuXHRcdFx0XHRcdGF4aXNYRGF0YUluZm8ubWluRGlmZiA9IHhEaWZmO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludFkgIT09IG51bGwgJiYgZGF0YVNlcmllcy5kYXRhUG9pbnRzW2kgLSAxXS55ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0dmFyIHlEaWZmID0gZGF0YVBvaW50WSAtIGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpIC0gMV0ueTtcblx0XHRcdFx0XHR5RGlmZiA8IDAgJiYgKHlEaWZmID0geURpZmYgKiAtMSk7IC8vSWYgQ29uZGl0aW9uIHNob3J0Y3V0XG5cblx0XHRcdFx0XHRpZiAoYXhpc1lEYXRhSW5mby5taW5EaWZmID4geURpZmYgJiYgeURpZmYgIT09IDApIHtcblx0XHRcdFx0XHRcdGF4aXNZRGF0YUluZm8ubWluRGlmZiA9IHlEaWZmO1xuXHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoaXMgc2VjdGlvbiBtYWtlcyBzdXJlIHRoYXQgcGFydGlhbGx5IHZpc2libGUgZGF0YVBvaW50cyBhcmUgaW5jbHVkZWQgaW4gdGhlIGJlZ2luaW5nXG5cdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RBcmVhWE1pbiAmJiAhaXNGaXJzdERQSW5WaWV3UG9ydCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH0gZWxzZSBpZiAoIWlzRmlyc3REUEluVmlld1BvcnQpIHtcblx0XHRcdFx0aXNGaXJzdERQSW5WaWV3UG9ydCA9IHRydWU7XG5cblx0XHRcdFx0aWYgKGkgPiAwKSB7XG5cdFx0XHRcdFx0aSAtPSAyO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoaXMgc2VjdGlvbiBtYWtlcyBzdXJlIHRoYXQgcGFydGlhbGx5IHZpc2libGUgZGF0YVBvaW50cyBhcmUgaW5jbHVkZWQgYXQgdGhlIGVuZFxuXHRcdFx0aWYgKGRhdGFQb2ludFggPiBwbG90QXJlYVhNYXggJiYgIWlzTGFzdERQSW5WaWV3UG9ydCkge1xuXHRcdFx0XHRpc0xhc3REUEluVmlld1BvcnQgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmIChkYXRhUG9pbnRYID4gcGxvdEFyZWFYTWF4ICYmIGlzTGFzdERQSW5WaWV3UG9ydCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS5sYWJlbClcblx0XHRcdFx0cGxvdFVuaXQuYXhpc1gubGFiZWxzW2RhdGFQb2ludFhdID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLmxhYmVsO1xuXG5cblx0XHRcdGlmIChkYXRhUG9pbnRYIDwgYXhpc1hEYXRhSW5mby52aWV3UG9ydE1pbilcblx0XHRcdFx0YXhpc1hEYXRhSW5mby52aWV3UG9ydE1pbiA9IGRhdGFQb2ludFg7XG5cdFx0XHRpZiAoZGF0YVBvaW50WCA+IGF4aXNYRGF0YUluZm8udmlld1BvcnRNYXgpXG5cdFx0XHRcdGF4aXNYRGF0YUluZm8udmlld1BvcnRNYXggPSBkYXRhUG9pbnRYO1xuXG5cdFx0XHRpZiAoZGF0YVBvaW50WSA9PT0gbnVsbClcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdGlmIChkYXRhUG9pbnRZIDwgYXhpc1lEYXRhSW5mby52aWV3UG9ydE1pbilcblx0XHRcdFx0YXhpc1lEYXRhSW5mby52aWV3UG9ydE1pbiA9IGRhdGFQb2ludFk7XG5cdFx0XHRpZiAoZGF0YVBvaW50WSA+IGF4aXNZRGF0YUluZm8udmlld1BvcnRNYXgpXG5cdFx0XHRcdGF4aXNZRGF0YUluZm8udmlld1BvcnRNYXggPSBkYXRhUG9pbnRZO1xuXHRcdH1cblxuXHRcdHRoaXMucGxvdEluZm8uYXhpc1hWYWx1ZVR5cGUgPSBkYXRhU2VyaWVzLnhWYWx1ZVR5cGUgPSBpc0RhdGVUaW1lID8gXCJkYXRlVGltZVwiIDogXCJudW1iZXJcIjtcblx0fVxuXG5cdC8vdGhpcy5kYXRhUG9pbnRzLnNvcnQoY29tcGFyZURhdGFQb2ludFgpO1xuXHQvL3RoaXMuZGF0YVBvaW50cy5zb3J0KGZ1bmN0aW9uIChkYXRhUG9pbnQxLCBkYXRhUG9pbnQyKSB7IHJldHVybiBkYXRhUG9pbnQxLnggLSBkYXRhUG9pbnQyLng7IH0pO1xufVxuXG5DaGFydC5wcm90b3R5cGUuX3Byb2Nlc3NTdGFja2VkUGxvdFVuaXQgPSBmdW5jdGlvbiAocGxvdFVuaXQpIHtcblxuXHRpZiAoIXBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzIHx8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCA8IDEpXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBheGlzWURhdGFJbmZvID0gcGxvdFVuaXQuYXhpc1kuZGF0YUluZm87XG5cdHZhciBheGlzWERhdGFJbmZvID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm87XG5cblx0dmFyIGRhdGFQb2ludFgsIGRhdGFQb2ludFk7XG5cdHZhciBpc0RhdGVUaW1lID0gZmFsc2U7XG5cblx0dmFyIGRhdGFQb2ludFlQb3NpdGl2ZVN1bXMgPSBbXTtcblx0dmFyIGRhdGFQb2ludFlOZWdhdGl2ZVN1bXMgPSBbXTtcblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal1dO1xuXHRcdHZhciBpID0gMDtcblx0XHR2YXIgaXNGaXJzdERQSW5WaWV3UG9ydCA9IGZhbHNlO1xuXHRcdHZhciBpc0xhc3REUEluVmlld1BvcnQgPSBmYWxzZTtcblxuXHRcdGlmIChkYXRhU2VyaWVzLmF4aXNQbGFjZW1lbnQgPT09IFwibm9ybWFsXCIgfHwgZGF0YVNlcmllcy5heGlzUGxhY2VtZW50ID09PSBcInh5U3dhcHBlZFwiKSB7XG5cblx0XHRcdHZhciBwbG90QXJlYVhNaW4gPSB0aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1gubmV3Vmlld3BvcnRNaW5pbXVtID8gdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLm5ld1ZpZXdwb3J0TWluaW11bSA6ICh0aGlzLl9vcHRpb25zLmF4aXNYICYmIHRoaXMuX29wdGlvbnMuYXhpc1gudmlld3BvcnRNaW5pbXVtKSA/XG5cdFx0XHRcdHRoaXMuX29wdGlvbnMuYXhpc1gudmlld3BvcnRNaW5pbXVtIDogKHRoaXMuX29wdGlvbnMuYXhpc1ggJiYgdGhpcy5fb3B0aW9ucy5heGlzWC5taW5pbXVtKSA/IHRoaXMuX29wdGlvbnMuYXhpc1gubWluaW11bSA6IC1JbmZpbml0eTtcblxuXHRcdFx0dmFyIHBsb3RBcmVhWE1heCA9IHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5uZXdWaWV3cG9ydE1heGltdW0gPyB0aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1gubmV3Vmlld3BvcnRNYXhpbXVtIDogKHRoaXMuX29wdGlvbnMuYXhpc1ggJiYgdGhpcy5fb3B0aW9ucy5heGlzWC52aWV3cG9ydE1heGltdW0pID9cblx0XHRcdFx0dGhpcy5fb3B0aW9ucy5heGlzWC52aWV3cG9ydE1heGltdW0gOiAodGhpcy5fb3B0aW9ucy5heGlzWCAmJiB0aGlzLl9vcHRpb25zLmF4aXNYLm1heGltdW0pID8gdGhpcy5fb3B0aW9ucy5heGlzWC5tYXhpbXVtIDogSW5maW5pdHk7XG5cdFx0fVxuXG5cblx0XHRpZiAoZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnggJiYgZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnguZ2V0VGltZSB8fCBkYXRhU2VyaWVzLnhWYWx1ZVR5cGUgPT09IFwiZGF0ZVRpbWVcIikge1xuXHRcdFx0aXNEYXRlVGltZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFTZXJpZXMuZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHQvLyBSZXF1aXJkIHdoZW4gbm8geCB2YWx1ZXMgYXJlIHByb3ZpZGVkXG5cdFx0XHRpZiAodHlwZW9mIGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54ID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRcdGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54ID0gaTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54LmdldFRpbWUpIHtcblx0XHRcdFx0aXNEYXRlVGltZSA9IHRydWU7XG5cdFx0XHRcdGRhdGFQb2ludFggPSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCk7Ly9kYXRhUG9pbnRYIGlzIHVzZWQgc28gdGhhdCBnZXRUaW1lIGlzIGNhbGxlZCBvbmx5IG9uY2UgaW4gY2FzZSBvZiBkYXRlVGltZSB2YWx1ZXNcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54O1xuXG5cdFx0XHRkYXRhUG9pbnRZID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnk7XG5cblxuXG5cdFx0XHRpZiAoZGF0YVBvaW50WCA8IGF4aXNYRGF0YUluZm8ubWluKVxuXHRcdFx0XHRheGlzWERhdGFJbmZvLm1pbiA9IGRhdGFQb2ludFg7XG5cdFx0XHRpZiAoZGF0YVBvaW50WCA+IGF4aXNYRGF0YUluZm8ubWF4KVxuXHRcdFx0XHRheGlzWERhdGFJbmZvLm1heCA9IGRhdGFQb2ludFg7XG5cblx0XHRcdGlmIChpID4gMCkge1xuXHRcdFx0XHR2YXIgeERpZmYgPSBkYXRhUG9pbnRYIC0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2kgLSAxXS54O1xuXHRcdFx0XHR4RGlmZiA8IDAgJiYgKHhEaWZmID0geERpZmYgKiAtMSk7IC8vSWYgQ29uZGl0aW9uIHNob3J0Y3V0XG5cblx0XHRcdFx0aWYgKGF4aXNYRGF0YUluZm8ubWluRGlmZiA+IHhEaWZmICYmIHhEaWZmICE9PSAwKSB7XG5cdFx0XHRcdFx0YXhpc1hEYXRhSW5mby5taW5EaWZmID0geERpZmY7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WSAhPT0gbnVsbCAmJiBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaSAtIDFdLnkgIT09IG51bGwpIHtcblx0XHRcdFx0XHR2YXIgeURpZmYgPSBkYXRhUG9pbnRZIC0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2kgLSAxXS55O1xuXHRcdFx0XHRcdHlEaWZmIDwgMCAmJiAoeURpZmYgPSB5RGlmZiAqIC0xKTsgLy9JZiBDb25kaXRpb24gc2hvcnRjdXRcblxuXHRcdFx0XHRcdGlmIChheGlzWURhdGFJbmZvLm1pbkRpZmYgPiB5RGlmZiAmJiB5RGlmZiAhPT0gMCkge1xuXHRcdFx0XHRcdFx0YXhpc1lEYXRhSW5mby5taW5EaWZmID0geURpZmY7XG5cdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhpcyBzZWN0aW9uIG1ha2VzIHN1cmUgdGhhdCBwYXJ0aWFsbHkgdmlzaWJsZSBkYXRhUG9pbnRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgYmVnaW5pbmdcblx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdEFyZWFYTWluICYmICFpc0ZpcnN0RFBJblZpZXdQb3J0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fSBlbHNlIGlmICghaXNGaXJzdERQSW5WaWV3UG9ydCkge1xuXHRcdFx0XHRpc0ZpcnN0RFBJblZpZXdQb3J0ID0gdHJ1ZTtcblxuXHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRpIC09IDI7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhpcyBzZWN0aW9uIG1ha2VzIHN1cmUgdGhhdCBwYXJ0aWFsbHkgdmlzaWJsZSBkYXRhUG9pbnRzIGFyZSBpbmNsdWRlZCBhdCB0aGUgZW5kXG5cdFx0XHRpZiAoZGF0YVBvaW50WCA+IHBsb3RBcmVhWE1heCAmJiAhaXNMYXN0RFBJblZpZXdQb3J0KSB7XG5cdFx0XHRcdGlzTGFzdERQSW5WaWV3UG9ydCA9IHRydWU7XG5cdFx0XHR9IGVsc2UgaWYgKGRhdGFQb2ludFggPiBwbG90QXJlYVhNYXggJiYgaXNMYXN0RFBJblZpZXdQb3J0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cblx0XHRcdGlmIChkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ubGFiZWwpXG5cdFx0XHRcdHBsb3RVbml0LmF4aXNYLmxhYmVsc1tkYXRhUG9pbnRYXSA9IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS5sYWJlbDtcblxuXHRcdFx0aWYgKGRhdGFQb2ludFggPCBheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluKVxuXHRcdFx0XHRheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluID0gZGF0YVBvaW50WDtcblx0XHRcdGlmIChkYXRhUG9pbnRYID4gYXhpc1hEYXRhSW5mby52aWV3UG9ydE1heClcblx0XHRcdFx0YXhpc1hEYXRhSW5mby52aWV3UG9ydE1heCA9IGRhdGFQb2ludFg7XG5cblx0XHRcdGlmIChkYXRhUG9pbnRZID09PSBudWxsKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0cGxvdFVuaXQueVRvdGFsc1tkYXRhUG9pbnRYXSA9ICghcGxvdFVuaXQueVRvdGFsc1tkYXRhUG9pbnRYXSA/IDAgOiBwbG90VW5pdC55VG90YWxzW2RhdGFQb2ludFhdKSArIE1hdGguYWJzKGRhdGFQb2ludFkpO1xuXG5cdFx0XHRpZiAoZGF0YVBvaW50WSA+PSAwKSB7XG5cdFx0XHRcdGlmIChkYXRhUG9pbnRZUG9zaXRpdmVTdW1zW2RhdGFQb2ludFhdKVxuXHRcdFx0XHRcdGRhdGFQb2ludFlQb3NpdGl2ZVN1bXNbZGF0YVBvaW50WF0gKz0gZGF0YVBvaW50WTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGRhdGFQb2ludFlQb3NpdGl2ZVN1bXNbZGF0YVBvaW50WF0gPSBkYXRhUG9pbnRZO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGRhdGFQb2ludFlOZWdhdGl2ZVN1bXNbZGF0YVBvaW50WF0pXG5cdFx0XHRcdFx0ZGF0YVBvaW50WU5lZ2F0aXZlU3Vtc1tkYXRhUG9pbnRYXSArPSBkYXRhUG9pbnRZO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0ZGF0YVBvaW50WU5lZ2F0aXZlU3Vtc1tkYXRhUG9pbnRYXSA9IGRhdGFQb2ludFk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5wbG90SW5mby5heGlzWFZhbHVlVHlwZSA9IGRhdGFTZXJpZXMueFZhbHVlVHlwZSA9IGlzRGF0ZVRpbWUgPyBcImRhdGVUaW1lXCIgOiBcIm51bWJlclwiO1xuXHR9XG5cblx0Zm9yIChpIGluIGRhdGFQb2ludFlQb3NpdGl2ZVN1bXMpIHtcblx0XHRpZiAoZGF0YVBvaW50WVBvc2l0aXZlU3Vtcy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuXHRcdGlmIChpc05hTihpKSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdHZhciB5U3VtID0gZGF0YVBvaW50WVBvc2l0aXZlU3Vtc1tpXTtcblxuXHRcdGlmICh5U3VtIDwgYXhpc1lEYXRhSW5mby5taW4pXG5cdFx0XHRheGlzWURhdGFJbmZvLm1pbiA9IHlTdW07XG5cblx0XHRpZiAoeVN1bSA+IGF4aXNZRGF0YUluZm8ubWF4KVxuXHRcdFx0YXhpc1lEYXRhSW5mby5tYXggPSB5U3VtO1xuXG5cdFx0aWYgKGkgPCBheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGkgPiBheGlzWERhdGFJbmZvLnZpZXdQb3J0TWF4KVxuXHRcdFx0Y29udGludWU7XG5cblx0XHRpZiAoeVN1bSA8IGF4aXNZRGF0YUluZm8udmlld1BvcnRNaW4pXG5cdFx0XHRheGlzWURhdGFJbmZvLnZpZXdQb3J0TWluID0geVN1bTtcblx0XHRpZiAoeVN1bSA+IGF4aXNZRGF0YUluZm8udmlld1BvcnRNYXgpXG5cdFx0XHRheGlzWURhdGFJbmZvLnZpZXdQb3J0TWF4ID0geVN1bTtcblx0fVxuXG5cdH1cblxuXHRmb3IgKGkgaW4gZGF0YVBvaW50WU5lZ2F0aXZlU3Vtcykge1xuXG5cdFx0aWYgKGRhdGFQb2ludFlOZWdhdGl2ZVN1bXMuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRpZiAoaXNOYU4oaSkpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdHZhciB5U3VtID0gZGF0YVBvaW50WU5lZ2F0aXZlU3Vtc1tpXTtcblxuXHRcdGlmICh5U3VtIDwgYXhpc1lEYXRhSW5mby5taW4pXG5cdFx0XHRheGlzWURhdGFJbmZvLm1pbiA9IHlTdW07XG5cblx0XHRpZiAoeVN1bSA+IGF4aXNZRGF0YUluZm8ubWF4KVxuXHRcdFx0YXhpc1lEYXRhSW5mby5tYXggPSB5U3VtO1xuXG5cdFx0aWYgKGkgPCBheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGkgPiBheGlzWERhdGFJbmZvLnZpZXdQb3J0TWF4KVxuXHRcdFx0Y29udGludWU7XG5cblx0XHRpZiAoeVN1bSA8IGF4aXNZRGF0YUluZm8udmlld1BvcnRNaW4pXG5cdFx0XHRheGlzWURhdGFJbmZvLnZpZXdQb3J0TWluID0geVN1bTtcblx0XHRpZiAoeVN1bSA+IGF4aXNZRGF0YUluZm8udmlld1BvcnRNYXgpXG5cdFx0XHRheGlzWURhdGFJbmZvLnZpZXdQb3J0TWF4ID0geVN1bTtcblx0fVxuXG5cdH1cblxuXG5cdC8vdGhpcy5kYXRhUG9pbnRzLnNvcnQoY29tcGFyZURhdGFQb2ludFgpO1xuXHQvL3RoaXMuZGF0YVBvaW50cy5zb3J0KGZ1bmN0aW9uIChkYXRhUG9pbnQxLCBkYXRhUG9pbnQyKSB7IHJldHVybiBkYXRhUG9pbnQxLnggLSBkYXRhUG9pbnQyLng7IH0pO1xuXG5cdC8vd2luZG93LmNvbnNvbGUubG9nKFwidmlld1BvcnRZTWluOiBcIiArIHBsb3RJbmZvLnZpZXdQb3J0WU1pbiArIFwiOyB2aWV3UG9ydFlNYXg6IFwiICsgcGxvdEluZm8udmlld1BvcnRZTWF4KTtcbn1cblxuQ2hhcnQucHJvdG90eXBlLl9wcm9jZXNzU3RhY2tlZDEwMFBsb3RVbml0ID0gZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cdGlmICghcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMgfHwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoIDwgMSlcblx0XHRyZXR1cm47XG5cblx0dmFyIGF4aXNZRGF0YUluZm8gPSBwbG90VW5pdC5heGlzWS5kYXRhSW5mbztcblx0dmFyIGF4aXNYRGF0YUluZm8gPSBwbG90VW5pdC5heGlzWC5kYXRhSW5mbztcblxuXHR2YXIgZGF0YVBvaW50WCwgZGF0YVBvaW50WTtcblx0dmFyIGlzRGF0ZVRpbWUgPSBmYWxzZTtcblx0dmFyIGNvbnRhaW5zUG9zaXRpdmVZID0gZmFsc2U7XG5cdHZhciBjb250YWluc05lZ2F0aXZlWSA9IGZhbHNlO1xuXG5cdHZhciBkYXRhUG9pbnRZU3VtcyA9IFtdO1xuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXV07XG5cdFx0dmFyIGkgPSAwO1xuXHRcdHZhciBpc0ZpcnN0RFBJblZpZXdQb3J0ID0gZmFsc2U7XG5cdFx0dmFyIGlzTGFzdERQSW5WaWV3UG9ydCA9IGZhbHNlO1xuXG5cdFx0aWYgKGRhdGFTZXJpZXMuYXhpc1BsYWNlbWVudCA9PT0gXCJub3JtYWxcIiB8fCBkYXRhU2VyaWVzLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcblxuXHRcdFx0dmFyIHBsb3RBcmVhWE1pbiA9IHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5uZXdWaWV3cG9ydE1pbmltdW0gPyB0aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1gubmV3Vmlld3BvcnRNaW5pbXVtIDogKHRoaXMuX29wdGlvbnMuYXhpc1ggJiYgdGhpcy5fb3B0aW9ucy5heGlzWC52aWV3cG9ydE1pbmltdW0pID9cblx0XHRcdFx0dGhpcy5fb3B0aW9ucy5heGlzWC52aWV3cG9ydE1pbmltdW0gOiAodGhpcy5fb3B0aW9ucy5heGlzWCAmJiB0aGlzLl9vcHRpb25zLmF4aXNYLm1pbmltdW0pID8gdGhpcy5fb3B0aW9ucy5heGlzWC5taW5pbXVtIDogLUluZmluaXR5O1xuXG5cdFx0XHR2YXIgcGxvdEFyZWFYTWF4ID0gdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLm5ld1ZpZXdwb3J0TWF4aW11bSA/IHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5uZXdWaWV3cG9ydE1heGltdW0gOiAodGhpcy5fb3B0aW9ucy5heGlzWCAmJiB0aGlzLl9vcHRpb25zLmF4aXNYLnZpZXdwb3J0TWF4aW11bSkgP1xuXHRcdFx0XHR0aGlzLl9vcHRpb25zLmF4aXNYLnZpZXdwb3J0TWF4aW11bSA6ICh0aGlzLl9vcHRpb25zLmF4aXNYICYmIHRoaXMuX29wdGlvbnMuYXhpc1gubWF4aW11bSkgPyB0aGlzLl9vcHRpb25zLmF4aXNYLm1heGltdW0gOiBJbmZpbml0eTtcblx0XHR9XG5cblxuXHRcdGlmIChkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueCAmJiBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueC5nZXRUaW1lIHx8IGRhdGFTZXJpZXMueFZhbHVlVHlwZSA9PT0gXCJkYXRlVGltZVwiKSB7XG5cdFx0XHRpc0RhdGVUaW1lID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVNlcmllcy5kYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdC8vIFJlcXVpcmQgd2hlbiBubyB4IHZhbHVlcyBhcmUgcHJvdmlkZWRcblx0XHRcdGlmICh0eXBlb2YgZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnggPT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdFx0ZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnggPSBpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnguZ2V0VGltZSkge1xuXHRcdFx0XHRpc0RhdGVUaW1lID0gdHJ1ZTtcblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54LmdldFRpbWUoKTsvL2RhdGFQb2ludFggaXMgdXNlZCBzbyB0aGF0IGdldFRpbWUgaXMgY2FsbGVkIG9ubHkgb25jZSBpbiBjYXNlIG9mIGRhdGVUaW1lIHZhbHVlc1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRkYXRhUG9pbnRYID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLng7XG5cblx0XHRcdGRhdGFQb2ludFkgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueTtcblxuXG5cblx0XHRcdGlmIChkYXRhUG9pbnRYIDwgYXhpc1hEYXRhSW5mby5taW4pXG5cdFx0XHRcdGF4aXNYRGF0YUluZm8ubWluID0gZGF0YVBvaW50WDtcblx0XHRcdGlmIChkYXRhUG9pbnRYID4gYXhpc1hEYXRhSW5mby5tYXgpXG5cdFx0XHRcdGF4aXNYRGF0YUluZm8ubWF4ID0gZGF0YVBvaW50WDtcblxuXHRcdFx0aWYgKGkgPiAwKSB7XG5cdFx0XHRcdHZhciB4RGlmZiA9IGRhdGFQb2ludFggLSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaSAtIDFdLng7XG5cdFx0XHRcdHhEaWZmIDwgMCAmJiAoeERpZmYgPSB4RGlmZiAqIC0xKTsgLy9JZiBDb25kaXRpb24gc2hvcnRjdXRcblxuXHRcdFx0XHRpZiAoYXhpc1hEYXRhSW5mby5taW5EaWZmID4geERpZmYgJiYgeERpZmYgIT09IDApIHtcblx0XHRcdFx0XHRheGlzWERhdGFJbmZvLm1pbkRpZmYgPSB4RGlmZjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRZICE9PSBudWxsICYmIGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpIC0gMV0ueSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHZhciB5RGlmZiA9IGRhdGFQb2ludFkgLSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaSAtIDFdLnk7XG5cdFx0XHRcdFx0eURpZmYgPCAwICYmICh5RGlmZiA9IHlEaWZmICogLTEpOyAvL0lmIENvbmRpdGlvbiBzaG9ydGN1dFxuXG5cdFx0XHRcdFx0aWYgKGF4aXNZRGF0YUluZm8ubWluRGlmZiA+IHlEaWZmICYmIHlEaWZmICE9PSAwKSB7XG5cdFx0XHRcdFx0XHRheGlzWURhdGFJbmZvLm1pbkRpZmYgPSB5RGlmZjtcblx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGlzIHNlY3Rpb24gbWFrZXMgc3VyZSB0aGF0IHBhcnRpYWxseSB2aXNpYmxlIGRhdGFQb2ludHMgYXJlIGluY2x1ZGVkIGluIHRoZSBiZWdpbmluZ1xuXHRcdFx0aWYgKGRhdGFQb2ludFggPCBwbG90QXJlYVhNaW4gJiYgIWlzRmlyc3REUEluVmlld1BvcnQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9IGVsc2UgaWYgKCFpc0ZpcnN0RFBJblZpZXdQb3J0KSB7XG5cdFx0XHRcdGlzRmlyc3REUEluVmlld1BvcnQgPSB0cnVlO1xuXG5cdFx0XHRcdGlmIChpID4gMCkge1xuXHRcdFx0XHRcdGkgLT0gMjtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGlzIHNlY3Rpb24gbWFrZXMgc3VyZSB0aGF0IHBhcnRpYWxseSB2aXNpYmxlIGRhdGFQb2ludHMgYXJlIGluY2x1ZGVkIGF0IHRoZSBlbmRcblx0XHRcdGlmIChkYXRhUG9pbnRYID4gcGxvdEFyZWFYTWF4ICYmICFpc0xhc3REUEluVmlld1BvcnQpIHtcblx0XHRcdFx0aXNMYXN0RFBJblZpZXdQb3J0ID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAoZGF0YVBvaW50WCA+IHBsb3RBcmVhWE1heCAmJiBpc0xhc3REUEluVmlld1BvcnQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ubGFiZWwpXG5cdFx0XHRcdHBsb3RVbml0LmF4aXNYLmxhYmVsc1tkYXRhUG9pbnRYXSA9IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS5sYWJlbDtcblxuXHRcdFx0aWYgKGRhdGFQb2ludFggPCBheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluKVxuXHRcdFx0XHRheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluID0gZGF0YVBvaW50WDtcblx0XHRcdGlmIChkYXRhUG9pbnRYID4gYXhpc1hEYXRhSW5mby52aWV3UG9ydE1heClcblx0XHRcdFx0YXhpc1hEYXRhSW5mby52aWV3UG9ydE1heCA9IGRhdGFQb2ludFg7XG5cblx0XHRcdGlmIChkYXRhUG9pbnRZID09PSBudWxsKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0cGxvdFVuaXQueVRvdGFsc1tkYXRhUG9pbnRYXSA9ICghcGxvdFVuaXQueVRvdGFsc1tkYXRhUG9pbnRYXSA/IDAgOiBwbG90VW5pdC55VG90YWxzW2RhdGFQb2ludFhdKSArIE1hdGguYWJzKGRhdGFQb2ludFkpO1xuXG5cdFx0XHRpZiAoZGF0YVBvaW50WSA+PSAwKSB7XG5cdFx0XHRcdGNvbnRhaW5zUG9zaXRpdmVZID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnRhaW5zTmVnYXRpdmVZID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRhdGFQb2ludFlTdW1zW2RhdGFQb2ludFhdKVxuXHRcdFx0XHRkYXRhUG9pbnRZU3Vtc1tkYXRhUG9pbnRYXSArPSBNYXRoLmFicyhkYXRhUG9pbnRZKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZGF0YVBvaW50WVN1bXNbZGF0YVBvaW50WF0gPSBNYXRoLmFicyhkYXRhUG9pbnRZKTtcblx0XHR9XG5cblx0XHR0aGlzLnBsb3RJbmZvLmF4aXNYVmFsdWVUeXBlID0gZGF0YVNlcmllcy54VmFsdWVUeXBlID0gaXNEYXRlVGltZSA/IFwiZGF0ZVRpbWVcIiA6IFwibnVtYmVyXCI7XG5cdH1cblxuXG5cdGlmIChjb250YWluc1Bvc2l0aXZlWSAmJiAhY29udGFpbnNOZWdhdGl2ZVkpIHtcblx0XHRheGlzWURhdGFJbmZvLm1heCA9IDk5O1xuXHRcdGF4aXNZRGF0YUluZm8ubWluID0gMTtcblx0fSBlbHNlIGlmIChjb250YWluc1Bvc2l0aXZlWSAmJiBjb250YWluc05lZ2F0aXZlWSkge1xuXHRcdGF4aXNZRGF0YUluZm8ubWF4ID0gOTk7XG5cdFx0YXhpc1lEYXRhSW5mby5taW4gPSAtOTk7XG5cdH0gZWxzZSBpZiAoIWNvbnRhaW5zUG9zaXRpdmVZICYmIGNvbnRhaW5zTmVnYXRpdmVZKSB7XG5cdFx0YXhpc1lEYXRhSW5mby5tYXggPSAtMTtcblx0XHRheGlzWURhdGFJbmZvLm1pbiA9IC05OTtcblx0fVxuXG5cdGF4aXNZRGF0YUluZm8udmlld1BvcnRNaW4gPSBheGlzWURhdGFJbmZvLm1pbjtcblx0YXhpc1lEYXRhSW5mby52aWV3UG9ydE1heCA9IGF4aXNZRGF0YUluZm8ubWF4O1xuXG5cdHBsb3RVbml0LmRhdGFQb2ludFlTdW1zID0gZGF0YVBvaW50WVN1bXM7XG5cblx0Ly90aGlzLmRhdGFQb2ludHMuc29ydChjb21wYXJlRGF0YVBvaW50WCk7XG5cdC8vdGhpcy5kYXRhUG9pbnRzLnNvcnQoZnVuY3Rpb24gKGRhdGFQb2ludDEsIGRhdGFQb2ludDIpIHsgcmV0dXJuIGRhdGFQb2ludDEueCAtIGRhdGFQb2ludDIueDsgfSk7XG5cblx0Ly93aW5kb3cuY29uc29sZS5sb2coXCJ2aWV3UG9ydFlNaW46IFwiICsgcGxvdEluZm8udmlld1BvcnRZTWluICsgXCI7IHZpZXdQb3J0WU1heDogXCIgKyBwbG90SW5mby52aWV3UG9ydFlNYXgpO1xufVxuXG5DaGFydC5wcm90b3R5cGUuX3Byb2Nlc3NNdWx0aVlQbG90VW5pdCA9IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXHRpZiAoIXBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzIHx8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCA8IDEpXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBheGlzWURhdGFJbmZvID0gcGxvdFVuaXQuYXhpc1kuZGF0YUluZm87XG5cdHZhciBheGlzWERhdGFJbmZvID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm87XG5cdHZhciBkYXRhUG9pbnRYLCBkYXRhUG9pbnRZLCBkYXRhUG9pbnRZTWluLCBkYXRhUG9pbnRZTWF4O1xuXHR2YXIgaXNEYXRlVGltZSA9IGZhbHNlO1xuXG5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7IGorKykge1xuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW3Bsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdXTtcblx0XHR2YXIgaSA9IDA7XG5cdFx0dmFyIGlzRmlyc3REUEluVmlld1BvcnQgPSBmYWxzZTtcblx0XHR2YXIgaXNMYXN0RFBJblZpZXdQb3J0ID0gZmFsc2U7XG5cblx0XHRpZiAoZGF0YVNlcmllcy5heGlzUGxhY2VtZW50ID09PSBcIm5vcm1hbFwiIHx8IGRhdGFTZXJpZXMuYXhpc1BsYWNlbWVudCA9PT0gXCJ4eVN3YXBwZWRcIikge1xuXG5cdFx0XHR2YXIgcGxvdEFyZWFYTWluID0gdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLm5ld1ZpZXdwb3J0TWluaW11bSA/IHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5uZXdWaWV3cG9ydE1pbmltdW0gOiAodGhpcy5fb3B0aW9ucy5heGlzWCAmJiB0aGlzLl9vcHRpb25zLmF4aXNYLnZpZXdwb3J0TWluaW11bSkgP1xuXHRcdFx0XHR0aGlzLl9vcHRpb25zLmF4aXNYLnZpZXdwb3J0TWluaW11bSA6ICh0aGlzLl9vcHRpb25zLmF4aXNYICYmIHRoaXMuX29wdGlvbnMuYXhpc1gubWluaW11bSkgPyB0aGlzLl9vcHRpb25zLmF4aXNYLm1pbmltdW0gOiAtSW5maW5pdHk7XG5cblx0XHRcdHZhciBwbG90QXJlYVhNYXggPSB0aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1gubmV3Vmlld3BvcnRNYXhpbXVtID8gdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLm5ld1ZpZXdwb3J0TWF4aW11bSA6ICh0aGlzLl9vcHRpb25zLmF4aXNYICYmIHRoaXMuX29wdGlvbnMuYXhpc1gudmlld3BvcnRNYXhpbXVtKSA/XG5cdFx0XHRcdHRoaXMuX29wdGlvbnMuYXhpc1gudmlld3BvcnRNYXhpbXVtIDogKHRoaXMuX29wdGlvbnMuYXhpc1ggJiYgdGhpcy5fb3B0aW9ucy5heGlzWC5tYXhpbXVtKSA/IHRoaXMuX29wdGlvbnMuYXhpc1gubWF4aW11bSA6IEluZmluaXR5O1xuXHRcdH1cblxuXG5cdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54ICYmIGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54LmdldFRpbWUgfHwgZGF0YVNlcmllcy54VmFsdWVUeXBlID09PSBcImRhdGVUaW1lXCIpIHtcblx0XHRcdGlzRGF0ZVRpbWUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhU2VyaWVzLmRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0aWYgKHR5cGVvZiBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueCA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0XHRkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueCA9IGk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKSB7XG5cdFx0XHRcdGlzRGF0ZVRpbWUgPSB0cnVlO1xuXHRcdFx0XHRkYXRhUG9pbnRYID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpOy8vZGF0YVBvaW50WCBpcyB1c2VkIHNvIHRoYXQgZ2V0VGltZSBpcyBjYWxsZWQgb25seSBvbmNlIGluIGNhc2Ugb2YgZGF0ZVRpbWUgdmFsdWVzXG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGRhdGFQb2ludFggPSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0ZGF0YVBvaW50WSA9IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS55O1xuXG5cdFx0XHRpZiAoZGF0YVBvaW50WSAmJiBkYXRhUG9pbnRZLmxlbmd0aCkge1xuXHRcdFx0XHRkYXRhUG9pbnRZTWluID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZGF0YVBvaW50WSk7XG5cdFx0XHRcdGRhdGFQb2ludFlNYXggPSBNYXRoLm1heC5hcHBseShudWxsLCBkYXRhUG9pbnRZKTtcblx0XHRcdH1cblxuXG5cdFx0XHRpZiAoZGF0YVBvaW50WCA8IGF4aXNYRGF0YUluZm8ubWluKVxuXHRcdFx0XHRheGlzWERhdGFJbmZvLm1pbiA9IGRhdGFQb2ludFg7XG5cdFx0XHRpZiAoZGF0YVBvaW50WCA+IGF4aXNYRGF0YUluZm8ubWF4KVxuXHRcdFx0XHRheGlzWERhdGFJbmZvLm1heCA9IGRhdGFQb2ludFg7XG5cblx0XHRcdGlmIChkYXRhUG9pbnRZTWluIDwgYXhpc1lEYXRhSW5mby5taW4pXG5cdFx0XHRcdGF4aXNZRGF0YUluZm8ubWluID0gZGF0YVBvaW50WU1pbjtcblxuXHRcdFx0aWYgKGRhdGFQb2ludFlNYXggPiBheGlzWURhdGFJbmZvLm1heClcblx0XHRcdFx0YXhpc1lEYXRhSW5mby5tYXggPSBkYXRhUG9pbnRZTWF4O1xuXG5cblx0XHRcdGlmIChpID4gMCkge1xuXHRcdFx0XHR2YXIgeERpZmYgPSBkYXRhUG9pbnRYIC0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2kgLSAxXS54O1xuXHRcdFx0XHR4RGlmZiA8IDAgJiYgKHhEaWZmID0geERpZmYgKiAtMSk7IC8vSWYgQ29uZGl0aW9uIHNob3J0Y3V0XG5cblx0XHRcdFx0aWYgKGF4aXNYRGF0YUluZm8ubWluRGlmZiA+IHhEaWZmICYmIHhEaWZmICE9PSAwKSB7XG5cdFx0XHRcdFx0YXhpc1hEYXRhSW5mby5taW5EaWZmID0geERpZmY7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WVswXSAhPT0gbnVsbCAmJiBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaSAtIDFdLnlbMF0gIT09IG51bGwpIHtcblx0XHRcdFx0XHR2YXIgeURpZmYgPSBkYXRhUG9pbnRZWzBdIC0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2kgLSAxXS55WzBdO1xuXHRcdFx0XHRcdHlEaWZmIDwgMCAmJiAoeURpZmYgPSB5RGlmZiAqIC0xKTsgLy9JZiBDb25kaXRpb24gc2hvcnRjdXRcblxuXHRcdFx0XHRcdGlmIChheGlzWURhdGFJbmZvLm1pbkRpZmYgPiB5RGlmZiAmJiB5RGlmZiAhPT0gMCkge1xuXHRcdFx0XHRcdFx0YXhpc1lEYXRhSW5mby5taW5EaWZmID0geURpZmY7XG5cdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhpcyBzZWN0aW9uIG1ha2VzIHN1cmUgdGhhdCBwYXJ0aWFsbHkgdmlzaWJsZSBkYXRhUG9pbnRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgYmVnaW5pbmdcblx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdEFyZWFYTWluICYmICFpc0ZpcnN0RFBJblZpZXdQb3J0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fSBlbHNlIGlmICghaXNGaXJzdERQSW5WaWV3UG9ydCkge1xuXHRcdFx0XHRpc0ZpcnN0RFBJblZpZXdQb3J0ID0gdHJ1ZTtcblxuXHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRpIC09IDI7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhpcyBzZWN0aW9uIG1ha2VzIHN1cmUgdGhhdCBwYXJ0aWFsbHkgdmlzaWJsZSBkYXRhUG9pbnRzIGFyZSBpbmNsdWRlZCBhdCB0aGUgZW5kXG5cdFx0XHRpZiAoZGF0YVBvaW50WCA+IHBsb3RBcmVhWE1heCAmJiAhaXNMYXN0RFBJblZpZXdQb3J0KSB7XG5cdFx0XHRcdGlzTGFzdERQSW5WaWV3UG9ydCA9IHRydWU7XG5cdFx0XHR9IGVsc2UgaWYgKGRhdGFQb2ludFggPiBwbG90QXJlYVhNYXggJiYgaXNMYXN0RFBJblZpZXdQb3J0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLmxhYmVsKVxuXHRcdFx0XHRwbG90VW5pdC5heGlzWC5sYWJlbHNbZGF0YVBvaW50WF0gPSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ubGFiZWw7XG5cblxuXHRcdFx0aWYgKGRhdGFQb2ludFggPCBheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluKVxuXHRcdFx0XHRheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluID0gZGF0YVBvaW50WDtcblx0XHRcdGlmIChkYXRhUG9pbnRYID4gYXhpc1hEYXRhSW5mby52aWV3UG9ydE1heClcblx0XHRcdFx0YXhpc1hEYXRhSW5mby52aWV3UG9ydE1heCA9IGRhdGFQb2ludFg7XG5cblx0XHRcdGlmIChkYXRhUG9pbnRZID09PSBudWxsKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0aWYgKGRhdGFQb2ludFlNaW4gPCBheGlzWURhdGFJbmZvLnZpZXdQb3J0TWluKVxuXHRcdFx0XHRheGlzWURhdGFJbmZvLnZpZXdQb3J0TWluID0gZGF0YVBvaW50WU1pbjtcblx0XHRcdGlmIChkYXRhUG9pbnRZTWF4ID4gYXhpc1lEYXRhSW5mby52aWV3UG9ydE1heClcblx0XHRcdFx0YXhpc1lEYXRhSW5mby52aWV3UG9ydE1heCA9IGRhdGFQb2ludFlNYXg7XG5cdFx0fVxuXG5cdFx0dGhpcy5wbG90SW5mby5heGlzWFZhbHVlVHlwZSA9IGRhdGFTZXJpZXMueFZhbHVlVHlwZSA9IGlzRGF0ZVRpbWUgPyBcImRhdGVUaW1lXCIgOiBcIm51bWJlclwiO1xuXHR9XG5cblx0Ly90aGlzLmRhdGFQb2ludHMuc29ydChjb21wYXJlRGF0YVBvaW50WCk7XG5cdC8vdGhpcy5kYXRhUG9pbnRzLnNvcnQoZnVuY3Rpb24gKGRhdGFQb2ludDEsIGRhdGFQb2ludDIpIHsgcmV0dXJuIGRhdGFQb2ludDEueCAtIGRhdGFQb2ludDIueDsgfSk7XG59XG5cbi8vZ2V0Q2xvc2VzdCByZXR1cm5zIG9iamVjdHMgbmVhcmJ5IGFuZCBoZW5jZSBzaG91bGRuJ3QgYmUgdXNlZCBmb3IgZXZlbnRzIGxpa2UgY2xpY2ssIG1vdXNlb3ZlciwgbW91c2Vtb3ZlLCBldGMgd2hpY2ggcmVxdWlyZSBvYmplY3QgdGhhdCBpcyBleGFjdGx5IHVuZGVyIHRoZSBtb3VzZS5cbkNoYXJ0LnByb3RvdHlwZS5nZXREYXRhUG9pbnRBdFhZID0gZnVuY3Rpb24gKG1vdXNlWCwgbW91c2VZLCBnZXRDbG9zZXN0KSB7XG5cblx0Z2V0Q2xvc2VzdCA9IGdldENsb3Nlc3QgfHwgZmFsc2U7XG5cdHZhciByZXN1bHRzID0gW107XG5cblx0Zm9yICh2YXIgaSA9IHRoaXMuX2RhdGFJblJlbmRlcmVkT3JkZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuX2RhdGFJblJlbmRlcmVkT3JkZXJbaV07XG5cblx0XHR2YXIgcmVzdWx0ID0gbnVsbDtcblxuXHRcdHJlc3VsdCA9IGRhdGFTZXJpZXMuZ2V0RGF0YVBvaW50QXRYWShtb3VzZVgsIG1vdXNlWSwgZ2V0Q2xvc2VzdCk7XG5cdFx0aWYgKHJlc3VsdClcblx0XHRcdHJlc3VsdHMucHVzaChyZXN1bHQpO1xuXHR9XG5cblx0dmFyIGNsb3Nlc3RSZXN1bHQgPSBudWxsO1xuXHR2YXIgb25seUxpbmVBcmVhVHlwZXMgPSBmYWxzZTtcblxuXHRmb3IgKHZhciBtID0gMDsgbSA8IHJlc3VsdHMubGVuZ3RoOyBtKyspIHtcblxuXHRcdGlmIChyZXN1bHRzW21dLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJsaW5lXCIgfHwgcmVzdWx0c1ttXS5kYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcExpbmVcIiB8fCByZXN1bHRzW21dLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJhcmVhXCIgfHwgcmVzdWx0c1ttXS5kYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcEFyZWFcIikge1xuXHRcdFx0dmFyIG1hcmtlclNpemUgPSBnZXRQcm9wZXJ0eShcIm1hcmtlclNpemVcIiwgcmVzdWx0c1ttXS5kYXRhUG9pbnQsIHJlc3VsdHNbbV0uZGF0YVNlcmllcykgfHwgODtcblx0XHRcdGlmIChyZXN1bHRzW21dLmRpc3RhbmNlIDw9IG1hcmtlclNpemUgLyAyKSB7XG5cdFx0XHRcdG9ubHlMaW5lQXJlYVR5cGVzID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Zm9yIChtID0gMDsgbSA8IHJlc3VsdHMubGVuZ3RoOyBtKyspIHtcblxuXHRcdGlmIChvbmx5TGluZUFyZWFUeXBlcyAmJiByZXN1bHRzW21dLmRhdGFTZXJpZXMudHlwZSAhPT0gXCJsaW5lXCIgJiYgcmVzdWx0c1ttXS5kYXRhU2VyaWVzLnR5cGUgIT09IFwic3RlcExpbmVcIiAmJiByZXN1bHRzW21dLmRhdGFTZXJpZXMudHlwZSAhPT0gXCJhcmVhXCIgJiYgcmVzdWx0c1ttXS5kYXRhU2VyaWVzLnR5cGUgIT09IFwic3RlcEFyZWFcIilcblx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0aWYgKCFjbG9zZXN0UmVzdWx0KSB7XG5cdFx0XHRjbG9zZXN0UmVzdWx0ID0gcmVzdWx0c1ttXTtcblx0XHR9IGVsc2UgaWYgKHJlc3VsdHNbbV0uZGlzdGFuY2UgPD0gY2xvc2VzdFJlc3VsdC5kaXN0YW5jZSkge1xuXHRcdFx0Y2xvc2VzdFJlc3VsdCA9IHJlc3VsdHNbbV07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNsb3Nlc3RSZXN1bHQ7XG59XG5cbkNoYXJ0LnByb3RvdHlwZS5nZXRPYmplY3RBdFhZID0gZnVuY3Rpb24gKG1vdXNlWCwgbW91c2VZLCBnZXRDbG9zZXN0KSB7XG5cdGdldENsb3Nlc3QgPSBnZXRDbG9zZXN0IHx8IGZhbHNlO1xuXG5cdHZhciBpZCA9IG51bGw7XG5cblx0dmFyIGRhdGFQb2ludEluZm8gPSB0aGlzLmdldERhdGFQb2ludEF0WFkobW91c2VYLCBtb3VzZVksIGdldENsb3Nlc3QpO1xuXG5cdGlmIChkYXRhUG9pbnRJbmZvKSB7XG5cdFx0aWQgPSBkYXRhUG9pbnRJbmZvLmRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2RhdGFQb2ludEluZm8uZGF0YVBvaW50SW5kZXhdO1xuXHR9IGVsc2UgaWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7Ly9JRTkrXG5cdFx0aWQgPSBnZXRPYmplY3RJZChtb3VzZVgsIG1vdXNlWSwgdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4KTtcblx0fVxuXHRlbHNlIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVnZW5kLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IHRoaXMubGVnZW5kLml0ZW1zW2ldO1xuXG5cdFx0XHRpZiAobW91c2VYID49IGl0ZW0ueDEgJiYgbW91c2VYIDw9IGl0ZW0ueDIgJiYgbW91c2VZID49IGl0ZW0ueTEgJiYgbW91c2VZIDw9IGl0ZW0ueTIpIHtcblx0XHRcdFx0aWQgPSBpdGVtLmlkO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBpZDtcbn1cblxuLy8vIDxzdW1tYXJ5PkNhbGN1bGF0ZXMgRm9udCBTaXplIGJhc2VkIG9uIHN0YW5kYXJkU2l6ZSBhbmQgQ2hhcnQgU2l6ZTwvc3VtbWFyeT5cbi8vLyA8cGFyYW0gbmFtZT1cInN0YW5kYXJkU2l6ZVwiIHR5cGU9XCJOdW1iZXJcIj5TdGFuZGFyZCBmb250IHNpemUgZm9yIGEgQ2hhcnQgd2l0aCBtaW4od2lkdGgsaGVpZ2h0KSA9IDQwMHB4PC9wYXJhbT5cbi8vLyA8cmV0dXJucyB0eXBlPVwiTnVtYmVyXCI+VGhlIGFyZWEuPC9yZXR1cm5zPlxuQ2hhcnQucHJvdG90eXBlLmdldEF1dG9Gb250U2l6ZSA9IGZ1bmN0aW9uIChzdGFuZGFyZFNpemUsIHdpZHRoLCBoZWlnaHQpIHtcblxuXHR3aWR0aCA9IHdpZHRoIHx8IHRoaXMud2lkdGg7XG5cdGhlaWdodCA9IGhlaWdodCB8fCB0aGlzLmhlaWdodDtcblxuXHR2YXIgZm9udFNpemVTY2FsZUZhY3RvciA9IHN0YW5kYXJkU2l6ZSAvIDQwMDtcblxuXHRyZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1pbih0aGlzLndpZHRoLCB0aGlzLmhlaWdodCkgKiBmb250U2l6ZVNjYWxlRmFjdG9yKTtcbn1cblxuLy8jcmVnaW9uIEV2ZW50c1xuXG5DaGFydC5wcm90b3R5cGUucmVzZXRPdmVybGF5ZWRDYW52YXMgPSBmdW5jdGlvbiAoKSB7XG5cdC8vdmFyIHdpZHRoID0gdGhpcy5vdmVybGFpZENhbnZhcy53aWR0aDtcblx0Ly90aGlzLm92ZXJsYWlkQ2FudmFzLndpZHRoID0gMDtcblx0Ly90aGlzLm92ZXJsYWlkQ2FudmFzLndpZHRoID0gd2lkdGg7XG5cdHRoaXMub3ZlcmxhaWRDYW52YXNDdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbn1cblxuQ2hhcnQucHJvdG90eXBlLmNsZWFyQ2FudmFzID0gZnVuY3Rpb24gKCkge1xuXHR0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuXG5cdGlmICh0aGlzLmJhY2tncm91bmRDb2xvcikge1xuXHRcdHRoaXMuY3R4LmZpbGxTdHlsZSA9IHRoaXMuYmFja2dyb3VuZENvbG9yO1xuXHRcdHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblx0fVxufVxuXG5DaGFydC5wcm90b3R5cGUuYXR0YWNoRXZlbnQgPSBmdW5jdGlvbiAocGFyYW0pIHtcblx0dGhpcy5fZXZlbnRzLnB1c2gocGFyYW0pO1xufVxuXG5DaGFydC5wcm90b3R5cGUuX3RvdWNoRXZlbnRIYW5kbGVyID0gZnVuY3Rpb24gKGV2KSB7XG5cdGlmICghZXYuY2hhbmdlZFRvdWNoZXMgfHwgIXRoaXMuaW50ZXJhY3Rpdml0eUVuYWJsZWQpXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBtb3VzZUV2ZW50cyA9IFtdO1xuXHR2YXIgdG91Y2hlcyA9IGV2LmNoYW5nZWRUb3VjaGVzO1xuXHR2YXIgZmlyc3QgPSB0b3VjaGVzID8gdG91Y2hlc1swXSA6IGV2O1xuXHR2YXIgdG91Y2hDdXJyZW50Q29vcmRpbmF0ZXMgPSBudWxsO1xuXG5cdC8vd2luZG93LmNvbnNvbGUubG9nKHRvdWNoZXMubGVuZ3RoKTtcblxuXHRzd2l0Y2ggKGV2LnR5cGUpIHtcblx0XHRjYXNlIFwidG91Y2hzdGFydFwiOiBjYXNlIFwiTVNQb2ludGVyRG93blwiOlxuXHRcdFx0bW91c2VFdmVudHMgPSBbXCJtb3VzZW1vdmVcIiwgXCJtb3VzZWRvd25cIl07XG5cdFx0XHR0aGlzLl9sYXN0VG91Y2hEYXRhID0gZ2V0TW91c2VDb29yZGluYXRlcyhmaXJzdCk7XG5cdFx0XHR0aGlzLl9sYXN0VG91Y2hEYXRhLnRpbWUgPSBuZXcgRGF0ZSgpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcInRvdWNobW92ZVwiOiBjYXNlIFwiTVNQb2ludGVyTW92ZVwiOiBtb3VzZUV2ZW50cyA9IFtcIm1vdXNlbW92ZVwiXTsgYnJlYWs7XG5cdFx0Y2FzZSBcInRvdWNoZW5kXCI6IGNhc2UgXCJNU1BvaW50ZXJVcFwiOiBtb3VzZUV2ZW50cyA9ICh0aGlzLl9sYXN0VG91Y2hFdmVudFR5cGUgPT09IFwidG91Y2hzdGFydFwiIHx8IHRoaXMuX2xhc3RUb3VjaEV2ZW50VHlwZSA9PT0gXCJNU1BvaW50ZXJEb3duXCIpID8gW1wibW91c2V1cFwiLCBcImNsaWNrXCJdIDogW1wibW91c2V1cFwiXTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHJldHVybjtcblx0fVxuXG5cdGlmICh0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoID4gMSkgcmV0dXJuO1xuXG5cblx0dG91Y2hDdXJyZW50Q29vcmRpbmF0ZXMgPSBnZXRNb3VzZUNvb3JkaW5hdGVzKGZpcnN0KTtcblx0dG91Y2hDdXJyZW50Q29vcmRpbmF0ZXMudGltZSA9IG5ldyBEYXRlKCk7XG5cdHRyeSB7XG5cdFx0dmFyIGR5ID0gdG91Y2hDdXJyZW50Q29vcmRpbmF0ZXMueSAtIHRoaXMuX2xhc3RUb3VjaERhdGEueTtcblx0XHR2YXIgZHggPSB0b3VjaEN1cnJlbnRDb29yZGluYXRlcy54IC0gdGhpcy5fbGFzdFRvdWNoRGF0YS54O1xuXHRcdHZhciBkdCA9IHRvdWNoQ3VycmVudENvb3JkaW5hdGVzLnRpbWUgLSB0aGlzLl9sYXN0VG91Y2hEYXRhLnRpbWU7XG5cblx0XHRpZiAoTWF0aC5hYnMoZHkpID4gMTUgJiYgKCEhdGhpcy5fbGFzdFRvdWNoRGF0YS5zY3JvbGwgfHwgZHQgPCAyMDApKSB7XG5cdFx0XHQvL3RoaXMuX2xhc3RUb3VjaERhdGEueSA9IHRvdWNoQ3VycmVudENvb3JkaW5hdGVzLnk7XG5cdFx0XHR0aGlzLl9sYXN0VG91Y2hEYXRhLnNjcm9sbCA9IHRydWU7XG5cblx0XHRcdHZhciB3aW4gPSB3aW5kb3cucGFyZW50IHx8IHdpbmRvdztcblx0XHRcdGlmICh3aW4gJiYgd2luLnNjcm9sbEJ5KVxuXHRcdFx0XHR3aW4uc2Nyb2xsQnkoMCwgLWR5KTtcblx0XHR9XG5cdH0gY2F0Y2ggKGUpIHsgfTtcblxuXHR0aGlzLl9sYXN0VG91Y2hFdmVudFR5cGUgPSBldi50eXBlO1xuXG5cdGlmICghIXRoaXMuX2xhc3RUb3VjaERhdGEuc2Nyb2xsICYmIHRoaXMuem9vbUVuYWJsZWQpIHtcblx0XHRpZiAodGhpcy5pc0RyYWcpXG5cdFx0XHR0aGlzLnJlc2V0T3ZlcmxheWVkQ2FudmFzKCk7XG5cblx0XHR0aGlzLmlzRHJhZyA9IGZhbHNlO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgbW91c2VFdmVudHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdHZhciB0eXBlID0gbW91c2VFdmVudHNbaV07XG5cdFx0dmFyIHNpbXVsYXRlZEV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJNb3VzZUV2ZW50XCIpO1xuXHRcdHNpbXVsYXRlZEV2ZW50LmluaXRNb3VzZUV2ZW50KHR5cGUsIHRydWUsIHRydWUsIHdpbmRvdywgMSxcblx0XHRcdFx0XHRcdFx0XHQgIGZpcnN0LnNjcmVlblgsIGZpcnN0LnNjcmVlblksXG5cdFx0XHRcdFx0XHRcdFx0ICBmaXJzdC5jbGllbnRYLCBmaXJzdC5jbGllbnRZLCBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHQgIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuXG5cdFx0Zmlyc3QudGFyZ2V0LmRpc3BhdGNoRXZlbnQoc2ltdWxhdGVkRXZlbnQpO1xuXG5cdFx0aWYgKGV2LnByZXZlbnRNYW5pcHVsYXRpb24pIHtcblx0XHRcdC8vYWxlcnQoXCJwcmV2ZW50TWFuaXB1bGF0aW9uXCIpO1xuXHRcdFx0ZXYucHJldmVudE1hbmlwdWxhdGlvbigpO1xuXHRcdH1cblxuXHRcdGlmIChldi5wcmV2ZW50RGVmYXVsdCkge1xuXHRcdFx0Ly9hbGVydChcInByZXZlbnREZWZhdWx0XCIpO1xuXHRcdFx0ZXYucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH1cbn1cblxuQ2hhcnQucHJvdG90eXBlLl9kaXNwYXRjaFJhbmdlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCB0cmlnZ2VyU291cmNlKSB7XG5cdHZhciBldmVudFBhcmFtZXRlciA9IHt9O1xuXG5cdGV2ZW50UGFyYW1ldGVyLmNoYXJ0ID0gdGhpcy5fcHVibGljQ2hhcnRSZWZlcmVuY2U7XG5cdGV2ZW50UGFyYW1ldGVyLnR5cGUgPSBldmVudE5hbWU7XG5cdGV2ZW50UGFyYW1ldGVyLnRyaWdnZXIgPSB0cmlnZ2VyU291cmNlO1xuXG5cdHZhciBheGVzID0gW107XG5cblx0aWYgKHRoaXMuYXhpc1gpXG5cdFx0YXhlcy5wdXNoKFwiYXhpc1hcIik7XG5cdGlmICh0aGlzLmF4aXNZKVxuXHRcdGF4ZXMucHVzaChcImF4aXNZXCIpO1xuXHRpZiAodGhpcy5heGlzWTIpXG5cdFx0YXhlcy5wdXNoKFwiYXhpc1kyXCIpO1xuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYXhlcy5sZW5ndGg7IGkrKykge1xuXHRcdGV2ZW50UGFyYW1ldGVyW2F4ZXNbaV1dID0ge1xuXHRcdFx0dmlld3BvcnRNaW5pbXVtOiB0aGlzW2F4ZXNbaV1dLnNlc3Npb25WYXJpYWJsZXMubmV3Vmlld3BvcnRNaW5pbXVtLFxuXHRcdFx0dmlld3BvcnRNYXhpbXVtOiB0aGlzW2F4ZXNbaV1dLnNlc3Npb25WYXJpYWJsZXMubmV3Vmlld3BvcnRNYXhpbXVtXG5cdFx0fVxuXHR9XG5cblx0dGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50TmFtZSwgZXZlbnRQYXJhbWV0ZXIsIHRoaXMuX3B1YmxpY0NoYXJ0UmVmZXJlbmNlKTtcbn1cblxuQ2hhcnQucHJvdG90eXBlLl9tb3VzZUV2ZW50SGFuZGxlciA9IGZ1bmN0aW9uIChldikge1xuXG5cdGlmICghdGhpcy5pbnRlcmFjdGl2aXR5RW5hYmxlZClcblx0XHRyZXR1cm47XG5cblx0aWYgKHRoaXMuX2lnbm9yZU5leHRFdmVudCkge1xuXHRcdHRoaXMuX2lnbm9yZU5leHRFdmVudCA9IGZhbHNlO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIHN0b3AgcGFubmluZyBhbmQgem9vbWluZyBzbyB3ZSBjYW4gZHJhd1xuXHRpZiAoZXYucHJldmVudE1hbmlwdWxhdGlvbikge1xuXHRcdC8vYWxlcnQoXCJwcmV2ZW50TWFuaXB1bGF0aW9uXCIpO1xuXHRcdGV2LnByZXZlbnRNYW5pcHVsYXRpb24oKTtcblx0fVxuXG5cdC8vIHdlIGFyZSBoYW5kbGluZyB0aGlzIGV2ZW50XG5cdGlmIChldi5wcmV2ZW50RGVmYXVsdCkge1xuXHRcdC8vYWxlcnQoXCJwcmV2ZW50RGVmYXVsdFwiKTtcblx0XHRldi5wcmV2ZW50RGVmYXVsdCgpO1xuXHR9XG5cblx0Ly9JRTgtIHVzZXMgc3JjRWxlbWVudCBpbnN0ZWFkIG9mIHRhcmdldC4gU28gaW5zdGVhZCBvZiBjaGVja2luZyB0aGlzIGNvbmRpdGlvbiBldmVyeXRpbWUsIGl0cyBiZXR0ZXIgdG8gY3JlYXRlIGEgcmVmZXJlbmNlIGNhbGxlZCB0YXJnZXQuXG5cdGlmICh0eXBlb2YgKGV2LnRhcmdldCkgPT09IFwidW5kZWZpbmVkXCIgJiYgZXYuc3JjRWxlbWVudClcblx0XHRldi50YXJnZXQgPSBldi5zcmNFbGVtZW50O1xuXG5cdC8vY29uc29sZS5sb2coZXYudHlwZSk7XG5cblx0dmFyIHh5ID0gZ2V0TW91c2VDb29yZGluYXRlcyhldik7XG5cdHZhciB0eXBlID0gZXYudHlwZTtcblx0dmFyIGV2ZW50UGFyYW07XG5cdHZhciByaWdodGNsaWNrO1xuXG5cdGlmICghZXYpIHZhciBlID0gd2luZG93LmV2ZW50O1xuXHRpZiAoZXYud2hpY2gpIHJpZ2h0Y2xpY2sgPSAoZXYud2hpY2ggPT0gMyk7XG5cdGVsc2UgaWYgKGV2LmJ1dHRvbikgcmlnaHRjbGljayA9IChldi5idXR0b24gPT0gMik7XG5cblx0Ly93aW5kb3cuY29uc29sZS5sb2codHlwZSArIFwiIC0tPiB4OiBcIiArIHh5LnggKyBcIjsgeTpcIiArIHh5LnkpO1xuXG5cdC8vaWYgKHR5cGUgPT09IFwibW91c2VvdXRcIikge1xuXHQvLyAgICB0aGlzLl90b29sVGlwLmhpZGUoKTtcblx0Ly99XG5cblx0aWYgKGlzRGVidWdNb2RlICYmIHdpbmRvdy5jb25zb2xlKSB7XG5cdFx0d2luZG93LmNvbnNvbGUubG9nKHR5cGUgKyBcIiAtLT4geDogXCIgKyB4eS54ICsgXCI7IHk6XCIgKyB4eS55KTtcblx0XHRpZiAocmlnaHRjbGljaylcblx0XHRcdHdpbmRvdy5jb25zb2xlLmxvZyhldi53aGljaCk7XG5cblx0XHRpZiAodHlwZSA9PT0gXCJtb3VzZXVwXCIpXG5cdFx0XHR3aW5kb3cuY29uc29sZS5sb2coXCJtb3VzZXVwXCIpO1xuXHR9XG5cblx0aWYgKHJpZ2h0Y2xpY2spXG5cdFx0cmV0dXJuO1xuXG5cdC8vaWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gXCJ4eVN3YXBwZWRcIikge1xuXHQvLyAgICAvL3ZhciB0ZW1wID0geHkueDtcblx0Ly8gICAgLy94eS54ID0geHkueTtcblx0Ly8gICAgLy94eS55ID0gdGVtcDtcblx0Ly8gICAgeHkgPSB7eDogeHkueSwgeTogeHkueH07XG5cdC8vfVxuXG5cdGlmIChDaGFydC5jYXB0dXJlZEV2ZW50UGFyYW0pIHtcblx0XHRldmVudFBhcmFtID0gQ2hhcnQuY2FwdHVyZWRFdmVudFBhcmFtO1xuXG5cdFx0aWYgKHR5cGUgPT09IFwibW91c2V1cFwiKSB7XG5cdFx0XHRDaGFydC5jYXB0dXJlZEV2ZW50UGFyYW0gPSBudWxsO1xuXG5cdFx0XHRpZiAoZXZlbnRQYXJhbS5jaGFydC5vdmVybGFpZENhbnZhcy5yZWxlYXNlQ2FwdHVyZSlcblx0XHRcdFx0ZXZlbnRQYXJhbS5jaGFydC5vdmVybGFpZENhbnZhcy5yZWxlYXNlQ2FwdHVyZSgpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGV2ZW50UGFyYW0uY2hhcnQuX21vdXNlRXZlbnRIYW5kbGVyLCBmYWxzZSk7XG5cblx0XHR9XG5cblx0XHRpZiAoZXZlbnRQYXJhbS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSlcblx0XHRcdGV2ZW50UGFyYW1bdHlwZV0uY2FsbChldmVudFBhcmFtLmNvbnRleHQsIHh5LngsIHh5LnkpO1xuXG5cblxuXHR9XG5cdGVsc2UgaWYgKHRoaXMuX2V2ZW50cykge1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9ldmVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmICghdGhpcy5fZXZlbnRzW2ldLmhhc093blByb3BlcnR5KHR5cGUpKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0ZXZlbnRQYXJhbSA9IHRoaXMuX2V2ZW50c1tpXTtcblx0XHRcdHZhciBib3VuZHMgPSBldmVudFBhcmFtLmJvdW5kcztcblxuXHRcdFx0aWYgKHh5LnggPj0gYm91bmRzLngxICYmIHh5LnggPD0gYm91bmRzLngyICYmIHh5LnkgPj0gYm91bmRzLnkxICYmIHh5LnkgPD0gYm91bmRzLnkyKSB7XG5cdFx0XHRcdGV2ZW50UGFyYW1bdHlwZV0uY2FsbChldmVudFBhcmFtLmNvbnRleHQsIHh5LngsIHh5LnkpO1xuXG5cdFx0XHRcdGlmICh0eXBlID09PSBcIm1vdXNlZG93blwiICYmIGV2ZW50UGFyYW0uY2FwdHVyZSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdENoYXJ0LmNhcHR1cmVkRXZlbnRQYXJhbSA9IGV2ZW50UGFyYW07XG5cblx0XHRcdFx0XHRpZiAodGhpcy5vdmVybGFpZENhbnZhcy5zZXRDYXB0dXJlKVxuXHRcdFx0XHRcdFx0dGhpcy5vdmVybGFpZENhbnZhcy5zZXRDYXB0dXJlKCk7XG5cdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuX21vdXNlRXZlbnRIYW5kbGVyLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHQvL2FkZEV2ZW50KGRvY3VtZW50LmJvZHksIFwibW91c2V1cFwiLCB0aGlzLl9tb3VzZUV2ZW50SGFuZGxlcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGUgPT09IFwibW91c2V1cFwiKSB7XG5cdFx0XHRcdFx0aWYgKGV2ZW50UGFyYW0uY2hhcnQub3ZlcmxhaWRDYW52YXMucmVsZWFzZUNhcHR1cmUpXG5cdFx0XHRcdFx0XHRldmVudFBhcmFtLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzLnJlbGVhc2VDYXB0dXJlKCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0ZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLl9tb3VzZUV2ZW50SGFuZGxlciwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGV2ZW50UGFyYW0gPSBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChldmVudFBhcmFtICYmIGV2ZW50UGFyYW0uY3Vyc29yKSB7XG5cdFx0XHRldi50YXJnZXQuc3R5bGUuY3Vyc29yID0gZXZlbnRQYXJhbS5jdXJzb3I7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdGV2LnRhcmdldC5zdHlsZS5jdXJzb3IgPSB0aGlzLl9kZWZhdWx0Q3Vyc29yO1xuXG5cdFx0Ly9ldmVudFBhcmFtID1cblx0fVxuXG5cdGlmICh0aGlzLl90b29sVGlwICYmIHRoaXMuX3Rvb2xUaXAuZW5hYmxlZCkge1xuXG5cdFx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblxuXHRcdGlmICh4eS54IDwgcGxvdEFyZWEueDEgfHwgeHkueCA+IHBsb3RBcmVhLngyIHx8IHh5LnkgPCBwbG90QXJlYS55MSB8fCB4eS55ID4gcGxvdEFyZWEueTIpXG5cdFx0XHR0aGlzLl90b29sVGlwLmhpZGUoKTtcblx0fVxuXG5cblx0aWYgKCghdGhpcy5pc0RyYWcgfHwgIXRoaXMuem9vbUVuYWJsZWQpICYmIHRoaXMuX2V2ZW50TWFuYWdlcikge1xuXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm1vdXNlRXZlbnRIYW5kbGVyKGV2KTtcblx0XHQvL3RoaXMuX3VwZGF0ZVRvb2xUaXAoZXYueCwgZXYueSk7XG5cdH1cblxuXHQvL2lmICh0aGlzLl90b29sVGlwLmVuYWJsZWQpXG5cdC8vICAgIHRoaXMuX3Rvb2xUaXAubW91c2VNb3ZlSGFuZGxlcihldi54LCBldi55KTtcbn1cblxuQ2hhcnQucHJvdG90eXBlLl9wbG90QXJlYU1vdXNlRG93biA9IGZ1bmN0aW9uICh4LCB5KSB7XG5cdHRoaXMuaXNEcmFnID0gdHJ1ZTtcblxuXHRpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ICE9PSBcIm5vbmVcIikge1xuXHRcdHRoaXMuZHJhZ1N0YXJ0UG9pbnQgPSB7IHg6IHgsIHk6IHkgfTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLmRyYWdTdGFydFBvaW50ID0geyB4OiB4LCB5OiB5IH07XG5cdH1cbn1cblxuQ2hhcnQucHJvdG90eXBlLl9wbG90QXJlYU1vdXNlVXAgPSBmdW5jdGlvbiAoeCwgeSkge1xuXG5cdGlmICh0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwibm9ybWFsXCIgfHwgdGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcInh5U3dhcHBlZFwiKSB7XG5cdFx0aWYgKHRoaXMuaXNEcmFnKSB7XG5cdFx0XHR2YXIgZHJhZ0RlbHRhID0gMCxcblx0XHRcdFx0ZHJhZ0RlbHRhUFkgPSB5IC0gdGhpcy5kcmFnU3RhcnRQb2ludC55LFxuXHRcdFx0XHRkcmFnRGVsdGFQWCA9IHggLSB0aGlzLmRyYWdTdGFydFBvaW50LngsXG5cdFx0XHRcdHpvb21QWCA9IHRoaXMuem9vbVR5cGUuaW5kZXhPZihcInhcIikgPj0gMCwgLy9XaGV0aGVyIHRvIHpvb20gaG9yaXpvbnRhbGx5XG5cdFx0XHRcdHpvb21QWSA9IHRoaXMuem9vbVR5cGUuaW5kZXhPZihcInlcIikgPj0gMCwgLy9XaGV0aGVyIHRvIHpvb20gdmVydGljYWxseVxuXHRcdFx0XHRyZVJlbmRlciA9IGZhbHNlO1xuXG5cdFx0XHR0aGlzLnJlc2V0T3ZlcmxheWVkQ2FudmFzKCk7XG5cblx0XHRcdGlmICh0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcblx0XHRcdFx0dmFyIHRlbXAgPSB6b29tUFk7XG5cdFx0XHRcdHpvb21QWSA9IHpvb21QWDtcblx0XHRcdFx0em9vbVBYID0gdGVtcDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMucGFuRW5hYmxlZCB8fCB0aGlzLnpvb21FbmFibGVkKSB7XG5cdFx0XHRcdGlmICh0aGlzLnBhbkVuYWJsZWQpIHtcblxuXHRcdFx0XHRcdHZhciBvdmVyZmxvdyA9IDA7XG5cblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2F4ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdHZhciBheGlzID0gdGhpcy5fYXhlc1tpXTtcblxuXHRcdFx0XHRcdFx0aWYgKGF4aXMudmlld3BvcnRNaW5pbXVtIDwgYXhpcy5taW5pbXVtKSB7XG5cblx0XHRcdFx0XHRcdFx0b3ZlcmZsb3cgPSBheGlzLm1pbmltdW0gLSBheGlzLnZpZXdwb3J0TWluaW11bTtcblxuXHRcdFx0XHRcdFx0XHRheGlzLnNlc3Npb25WYXJpYWJsZXMubmV3Vmlld3BvcnRNaW5pbXVtID0gYXhpcy52aWV3cG9ydE1pbmltdW0gKyBvdmVyZmxvdztcblx0XHRcdFx0XHRcdFx0YXhpcy5zZXNzaW9uVmFyaWFibGVzLm5ld1ZpZXdwb3J0TWF4aW11bSA9IGF4aXMudmlld3BvcnRNYXhpbXVtICsgb3ZlcmZsb3c7XG5cblx0XHRcdFx0XHRcdHJlUmVuZGVyID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYXhpcy52aWV3cG9ydE1heGltdW0gPiBheGlzLm1heGltdW0pIHtcblxuXHRcdFx0XHRcdFx0XHRvdmVyZmxvdyA9IGF4aXMudmlld3BvcnRNYXhpbXVtIC0gYXhpcy5tYXhpbXVtO1xuXHRcdFx0XHRcdFx0XHRheGlzLnNlc3Npb25WYXJpYWJsZXMubmV3Vmlld3BvcnRNaW5pbXVtID0gYXhpcy52aWV3cG9ydE1pbmltdW0gLSBvdmVyZmxvdztcblx0XHRcdFx0XHRcdFx0YXhpcy5zZXNzaW9uVmFyaWFibGVzLm5ld1ZpZXdwb3J0TWF4aW11bSA9IGF4aXMudmlld3BvcnRNYXhpbXVtIC0gb3ZlcmZsb3c7XG5cblx0XHRcdFx0XHRcdHJlUmVuZGVyID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiAoKCghem9vbVBYIHx8IE1hdGguYWJzKGRyYWdEZWx0YVBYKSA+IDIpICYmICghem9vbVBZIHx8IE1hdGguYWJzKGRyYWdEZWx0YVBZKSA+IDIpKSAmJiB0aGlzLnpvb21FbmFibGVkKSB7XG5cblx0XHRcdFx0XHRpZiAoIXRoaXMuZHJhZ1N0YXJ0UG9pbnQpXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR2YXIgc2VsZWN0ZWRSZWdpb24gPSB7XG5cdFx0XHRcdFx0XHR4MTogem9vbVBYID8gdGhpcy5kcmFnU3RhcnRQb2ludC54IDogdGhpcy5wbG90QXJlYS54MSxcblx0XHRcdFx0XHRcdHkxOiB6b29tUFkgPyB0aGlzLmRyYWdTdGFydFBvaW50LnkgOiB0aGlzLnBsb3RBcmVhLnkxLFxuXHRcdFx0XHRcdFx0eDI6IHpvb21QWCA/IHggOiB0aGlzLnBsb3RBcmVhLngyLFxuXHRcdFx0XHRcdFx0eTI6IHpvb21QWSA/IHkgOiB0aGlzLnBsb3RBcmVhLnkyXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGlmIChNYXRoLmFicyhzZWxlY3RlZFJlZ2lvbi54MSAtIHNlbGVjdGVkUmVnaW9uLngyKSA+IDIgJiYgTWF0aC5hYnMoc2VsZWN0ZWRSZWdpb24ueTEgLSBzZWxlY3RlZFJlZ2lvbi55MikgPiAyKSB7XG5cblx0XHRcdFx0XHRcdGlmICh0aGlzLl96b29tUGFuVG9TZWxlY3RlZFJlZ2lvbihzZWxlY3RlZFJlZ2lvbi54MSwgc2VsZWN0ZWRSZWdpb24ueTEsIHNlbGVjdGVkUmVnaW9uLngyLCBzZWxlY3RlZFJlZ2lvbi55MikpIHtcblxuXHRcdFx0XHRcdFx0XHRyZVJlbmRlciA9IHRydWU7XG5cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVSZW5kZXIpIHtcblx0XHRcdFx0XHR0aGlzLl9pZ25vcmVOZXh0RXZlbnQgPSB0cnVlOy8vUmVxdWlyZWQgc28gdGhhdCBjbGljayBldmVudCBkb2Vzbid0IGZpcmUgYWZ0ZXIgem9vbWluZyBpbnRvIGEgc2VjdGlvbiBvZiB0aGUgY2hhcnQuXG5cblx0XHRcdFx0XHR0aGlzLl9kaXNwYXRjaFJhbmdlRXZlbnQoXCJyYW5nZUNoYW5naW5nXCIsIFwiem9vbVwiKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnJlbmRlcigpO1xuXHRcdFx0XHRcdHRoaXMuX2Rpc3BhdGNoUmFuZ2VFdmVudChcInJhbmdlQ2hhbmdlZFwiLCBcInpvb21cIik7XG5cblx0XHRcdFx0XHRpZiAocmVSZW5kZXIgJiYgdGhpcy56b29tRW5hYmxlZCAmJiB0aGlzLl96b29tQnV0dG9uLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiKSB7XG5cdFx0XHRcdFx0c2hvdyh0aGlzLl96b29tQnV0dG9uLCB0aGlzLl9yZXNldEJ1dHRvbik7XG5cdFx0XHRcdFx0c2V0QnV0dG9uU3RhdGUodGhpcywgdGhpcy5fem9vbUJ1dHRvbiwgXCJwYW5cIik7XG5cdFx0XHRcdFx0c2V0QnV0dG9uU3RhdGUodGhpcywgdGhpcy5fcmVzZXRCdXR0b24sIFwicmVzZXRcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0fVxuXG5cdH1cblxuXHR0aGlzLmlzRHJhZyA9IGZhbHNlO1xufVxuXG5DaGFydC5wcm90b3R5cGUuX3Bsb3RBcmVhTW91c2VNb3ZlID0gZnVuY3Rpb24gKHgsIHkpIHtcblx0aWYgKHRoaXMuaXNEcmFnICYmIHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCAhPT0gXCJub25lXCIpIHtcblxuXHRcdHZhciBkcmFnRGVsdGFQWCA9IDAsXG5cdFx0XHRkcmFnRGVsdGFQWSA9IDAsXG5cdFx0XHRhbHBoYSA9IG51bGwsXG5cdFx0XHRzZWxlY3RlZFJlZ2lvbiA9IG51bGwsXG5cdFx0XHR6b29tUFggPSB0aGlzLnpvb21UeXBlLmluZGV4T2YoXCJ4XCIpID49IDAsIC8vV2hldGhlciB0byB6b29tIGhvcml6b250YWxseVxuXHRcdFx0em9vbVBZID0gdGhpcy56b29tVHlwZS5pbmRleE9mKFwieVwiKSA+PSAwLCAvL1doZXRoZXIgdG8gem9vbSB2ZXJ0aWNhbGx5XG5cdFx0XHRfdGhpcyA9IHRoaXM7XG5cblx0XHRpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcInh5U3dhcHBlZFwiKSB7XG5cdFx0XHR2YXIgdGVtcCA9IHpvb21QWTtcblx0XHRcdHpvb21QWSA9IHpvb21QWDtcblx0XHRcdHpvb21QWCA9IHRlbXA7XG5cdFx0fVxuXG5cdFx0ZHJhZ0RlbHRhUFggPSB0aGlzLmRyYWdTdGFydFBvaW50LnggLSB4O1xuXHRcdGRyYWdEZWx0YVBZID0gdGhpcy5kcmFnU3RhcnRQb2ludC55IC0geTtcblxuXHRcdGlmIChNYXRoLmFicyhkcmFnRGVsdGFQWCkgPiAyICYmIE1hdGguYWJzKGRyYWdEZWx0YVBYKSA8IDggJiYgKHRoaXMucGFuRW5hYmxlZCB8fCB0aGlzLnpvb21FbmFibGVkKSkge1xuXHRcdFx0dGhpcy5fdG9vbFRpcC5oaWRlKCk7XG5cdFx0fSBlbHNlIGlmICghdGhpcy5wYW5FbmFibGVkICYmICF0aGlzLnpvb21FbmFibGVkKSB7XG5cdFx0XHR0aGlzLl90b29sVGlwLm1vdXNlTW92ZUhhbmRsZXIoeCwgeSk7XG5cdFx0fVxuXG5cdFx0aWYgKCgoIXpvb21QWCB8fCBNYXRoLmFicyhkcmFnRGVsdGFQWCkgPiAyKSB8fCAoIXpvb21QWSB8fCBNYXRoLmFicyhkcmFnRGVsdGFQWSkgPiAyKSkgJiYgKHRoaXMucGFuRW5hYmxlZCB8fCB0aGlzLnpvb21FbmFibGVkKSkge1xuXHRcdFx0aWYgKHRoaXMucGFuRW5hYmxlZCkge1xuXG5cdFx0XHRcdHNlbGVjdGVkUmVnaW9uID1cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR4MTogem9vbVBYID8gdGhpcy5wbG90QXJlYS54MSArIGRyYWdEZWx0YVBYIDogdGhpcy5wbG90QXJlYS54MSxcblx0XHRcdFx0XHRcdHkxOiB6b29tUFkgPyB0aGlzLnBsb3RBcmVhLnkxICsgZHJhZ0RlbHRhUFkgOiB0aGlzLnBsb3RBcmVhLnkxLFxuXHRcdFx0XHRcdFx0eDI6IHpvb21QWCA/IHRoaXMucGxvdEFyZWEueDIgKyBkcmFnRGVsdGFQWCA6IHRoaXMucGxvdEFyZWEueDIsXG5cdFx0XHRcdFx0XHR5Mjogem9vbVBZID8gdGhpcy5wbG90QXJlYS55MiArIGRyYWdEZWx0YVBZIDogdGhpcy5wbG90QXJlYS55MlxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0aWYgKHRoaXMuX3pvb21QYW5Ub1NlbGVjdGVkUmVnaW9uKHNlbGVjdGVkUmVnaW9uLngxLCBzZWxlY3RlZFJlZ2lvbi55MSwgc2VsZWN0ZWRSZWdpb24ueDIsIHNlbGVjdGVkUmVnaW9uLnkyLCB0cnVlKSkge1xuXHRcdFx0XHRcdHRoaXMuX2Rpc3BhdGNoUmFuZ2VFdmVudChcInJhbmdlQ2hhbmdpbmdcIiwgXCJwYW5cIik7XG5cdFx0XHRcdFx0dGhpcy5yZW5kZXIoKTtcblx0XHRcdFx0XHR0aGlzLl9kaXNwYXRjaFJhbmdlRXZlbnQoXCJyYW5nZUNoYW5nZWRcIiwgXCJwYW5cIik7XG5cblx0XHRcdFx0XHR0aGlzLmRyYWdTdGFydFBvaW50LnggPSB4O1xuXHRcdFx0XHRcdHRoaXMuZHJhZ1N0YXJ0UG9pbnQueSA9IHk7XG5cblx0XHRcdFx0XHQvL2NsZWFyVGltZW91dCh0aGlzLl9wYW5UaW1lcklkKTtcblx0XHRcdFx0XHQvL3RoaXMuX3BhblRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvL1x0X3RoaXMuX2Rpc3BhdGNoUmFuZ2VFdmVudChcInJhbmdlQ2hhbmdpbmdcIiwgXCJwYW5cIik7XG5cdFx0XHRcdFx0Ly9cdF90aGlzLnJlbmRlcigpO1xuXHRcdFx0XHRcdC8vXHRfdGhpcy5fZGlzcGF0Y2hSYW5nZUV2ZW50KFwicmFuZ2VDaGFuZ2VkXCIsIFwicGFuXCIpO1xuXHRcdFx0XHRcdC8vfSwgMCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLnpvb21FbmFibGVkKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNldE92ZXJsYXllZENhbnZhcygpO1xuXG5cdFx0XHRcdGFscGhhID0gdGhpcy5vdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYTtcblxuXHRcdFx0XHR0aGlzLm92ZXJsYWlkQ2FudmFzQ3R4Lmdsb2JhbEFscGhhID0gLjc7XG5cdFx0XHRcdHRoaXMub3ZlcmxhaWRDYW52YXNDdHguZmlsbFN0eWxlID0gXCIjQTBBQkI4XCI7XG5cblx0XHRcdFx0dmFyIHJlY3QgPSB7XG5cdFx0XHRcdFx0eDE6IHpvb21QWCA/IHRoaXMuZHJhZ1N0YXJ0UG9pbnQueCA6IHRoaXMucGxvdEFyZWEueDEsXG5cdFx0XHRcdFx0eTE6IHpvb21QWSA/IHRoaXMuZHJhZ1N0YXJ0UG9pbnQueSA6IHRoaXMucGxvdEFyZWEueTEsXG5cdFx0XHRcdFx0eDI6IHpvb21QWCA/IHggLSB0aGlzLmRyYWdTdGFydFBvaW50LnggOiB0aGlzLnBsb3RBcmVhLngyIC0gdGhpcy5wbG90QXJlYS54MSxcblx0XHRcdFx0XHR5Mjogem9vbVBZID8geSAtIHRoaXMuZHJhZ1N0YXJ0UG9pbnQueSA6IHRoaXMucGxvdEFyZWEueTIgLSB0aGlzLnBsb3RBcmVhLnkxXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0dGhpcy5vdmVybGFpZENhbnZhc0N0eC5maWxsUmVjdChyZWN0LngxLCByZWN0LnkxLCByZWN0LngyLCByZWN0LnkyKTtcblxuXHRcdFx0XHR0aGlzLm92ZXJsYWlkQ2FudmFzQ3R4Lmdsb2JhbEFscGhhID0gYWxwaGE7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdH0gZWxzZVxuXHRcdHRoaXMuX3Rvb2xUaXAubW91c2VNb3ZlSGFuZGxlcih4LCB5KTtcbn1cblxuLy8jZW5kcmVnaW9uIEV2ZW50c1xuXG4vL1NldHMgdGhlIHZpZXdwb3J0IHJhbmdlIG9mIEF4aXMgYmFzZWQgb24gdGhlIGdpdmVuIHJlY3QgYm91bmRzIChwaXhlbHMpLiBBbHNvIGxpbWl0cyB0aGUgem9vbWluZy9wYW5uaW5nIGJhc2VkIG9uIGF4aXMgYm91bmRzLiBSZXR1cm5zIGEgYm9vbGVhbiB0byBpbmRpY2F0ZSB3aGV0aGVyIGl0IHdhcyBzdWNjZXNmdWwgb3Igbm90IGJhc2VkIG9uIHRoZSBzZWxlY3RlZCByZWdpb24uXG5DaGFydC5wcm90b3R5cGUuX3pvb21QYW5Ub1NlbGVjdGVkUmVnaW9uID0gZnVuY3Rpb24gKHB4MSwgcHkxLCBweDIsIHB5Miwga2VlcEF4aXNJbmRlcGVuZGVudCkge1xuXG5cdGtlZXBBeGlzSW5kZXBlbmRlbnQgPSBrZWVwQXhpc0luZGVwZW5kZW50IHx8IGZhbHNlO1xuXG5cdHZhciB6b29tUFggPSB0aGlzLnpvb21UeXBlLmluZGV4T2YoXCJ4XCIpID49IDAsIC8vV2hldGhlciB0byB6b29tIGhvcml6b250YWxseVxuXHRcdHpvb21QWSA9IHRoaXMuem9vbVR5cGUuaW5kZXhPZihcInlcIikgPj0gMCwgLy9XaGV0aGVyIHRvIHpvb20gdmVydGljYWxseVxuXHRcdHZhbGlkUmVnaW9uID0gZmFsc2U7XG5cblx0dmFyIGF4ZXMgPSBbXSwgYXhlc1dpdGhWYWxpZFJhbmdlID0gW107XG5cdGlmICh0aGlzLmF4aXNYICYmIHpvb21QWClcblx0XHRheGVzLnB1c2godGhpcy5heGlzWCk7XG5cdGlmICh0aGlzLmF4aXNZICYmIHpvb21QWSlcblx0XHRheGVzLnB1c2godGhpcy5heGlzWSk7XG5cdGlmICh0aGlzLmF4aXNZMiAmJiB6b29tUFkpXG5cdFx0YXhlcy5wdXNoKHRoaXMuYXhpc1kyKTtcblxuXHR2YXIgcGFyYW1zID0gW107XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBheGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGF4aXMgPSBheGVzW2ldO1xuXHRcdC8vdmFyIHJhbmdlID0gTWF0aC5hYnMoYXhpcy52aWV3cG9ydE1heGltdW0gLSBheGlzLnZpZXdwb3J0TWluaW11bSk7XG5cblx0XHR2YXIgdmFsMSA9IGF4aXMuY29udmVydFBpeGVsVG9WYWx1ZSh7IHg6IHB4MSwgeTogcHkxIH0pO1xuXHRcdHZhciB2YWwyID0gYXhpcy5jb252ZXJ0UGl4ZWxUb1ZhbHVlKHsgeDogcHgyLCB5OiBweTIgfSk7XG5cblx0XHRpZiAodmFsMSA+IHZhbDIpIHtcblx0XHRcdHZhciB0ZW1wID0gdmFsMjtcblx0XHRcdHZhbDIgPSB2YWwxO1xuXHRcdFx0dmFsMSA9IHRlbXA7XG5cdFx0fVxuXG5cdFx0aWYgKGlzRmluaXRlKGF4aXMuZGF0YUluZm8ubWluRGlmZikpIHtcblx0XHRcdGlmICghKE1hdGguYWJzKHZhbDIgLSB2YWwxKSA8IDMgKiBNYXRoLmFicyhheGlzLmRhdGFJbmZvLm1pbkRpZmYpXG5cdFx0XHR8fCAodmFsMSA8IGF4aXMubWluaW11bSkgfHwgKHZhbDIgPiBheGlzLm1heGltdW0pKSkge1xuXHRcdFx0XHRheGVzV2l0aFZhbGlkUmFuZ2UucHVzaChheGlzKTtcblx0XHRcdFx0cGFyYW1zLnB1c2goeyB2YWwxOiB2YWwxLCB2YWwyOiB2YWwyIH0pO1xuXG5cdFx0XHRcdHZhbGlkUmVnaW9uID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAoIWtlZXBBeGlzSW5kZXBlbmRlbnQpIHtcblx0XHRcdFx0dmFsaWRSZWdpb24gPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKHZhbGlkUmVnaW9uKSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBheGVzV2l0aFZhbGlkUmFuZ2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBheGlzID0gYXhlc1dpdGhWYWxpZFJhbmdlW2ldO1xuXHRcdFx0dmFyIHBhcmFtID0gcGFyYW1zW2ldO1xuXG5cdFx0XHRheGlzLnNldFZpZXdQb3J0UmFuZ2UocGFyYW0udmFsMSwgcGFyYW0udmFsMik7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHZhbGlkUmVnaW9uO1xufVxuXG5DaGFydC5wcm90b3R5cGUucHJlcGFyZVBsb3RBcmVhID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBwbG90QXJlYSA9IHRoaXMucGxvdEFyZWE7XG5cblx0dmFyIHlBeGlzID0gdGhpcy5heGlzWSA/IHRoaXMuYXhpc1kgOiB0aGlzLmF4aXNZMjtcblxuXHRpZiAoIWlzQ2FudmFzU3VwcG9ydGVkICYmIChwbG90QXJlYS54MSA+IDAgfHwgcGxvdEFyZWEueTEgPiAwKSkge1xuXHRcdHBsb3RBcmVhLmN0eC50cmFuc2xhdGUocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxKTtcblx0fVxuXG5cdGlmICh0aGlzLmF4aXNYICYmIHlBeGlzKSB7XG5cdFx0cGxvdEFyZWEueDEgPSB0aGlzLmF4aXNYLmxpbmVDb29yZGluYXRlcy54MSA8IHRoaXMuYXhpc1gubGluZUNvb3JkaW5hdGVzLngyID8gdGhpcy5heGlzWC5saW5lQ29vcmRpbmF0ZXMueDEgOiB5QXhpcy5saW5lQ29vcmRpbmF0ZXMueDE7XG5cdFx0cGxvdEFyZWEueTEgPSAodGhpcy5heGlzWC5saW5lQ29vcmRpbmF0ZXMueTEgPCB5QXhpcy5saW5lQ29vcmRpbmF0ZXMueTEgPyB0aGlzLmF4aXNYLmxpbmVDb29yZGluYXRlcy55MSA6IHlBeGlzLmxpbmVDb29yZGluYXRlcy55MSk7XG5cblx0XHRwbG90QXJlYS54MiA9ICh0aGlzLmF4aXNYLmxpbmVDb29yZGluYXRlcy54MiA+IHlBeGlzLmxpbmVDb29yZGluYXRlcy54MiA/IHRoaXMuYXhpc1gubGluZUNvb3JkaW5hdGVzLngyIDogeUF4aXMubGluZUNvb3JkaW5hdGVzLngyKTtcblx0XHRwbG90QXJlYS55MiA9IHRoaXMuYXhpc1gubGluZUNvb3JkaW5hdGVzLnkyID4gdGhpcy5heGlzWC5saW5lQ29vcmRpbmF0ZXMueTEgPyB0aGlzLmF4aXNYLmxpbmVDb29yZGluYXRlcy55MiA6IHlBeGlzLmxpbmVDb29yZGluYXRlcy55MjtcblxuXHRcdHBsb3RBcmVhLndpZHRoID0gcGxvdEFyZWEueDIgLSBwbG90QXJlYS54MTtcblx0XHRwbG90QXJlYS5oZWlnaHQgPSBwbG90QXJlYS55MiAtIHBsb3RBcmVhLnkxO1xuXHRcdC8vcGxvdEFyZWEgPSB7IHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5Miwgd2lkdGg6IHgyIC0geDEsIGhlaWdodDogeTIgLSB5MSB9O1xuXHR9IGVsc2Uge1xuXHRcdC8vVG9EbzogQHN1bmlsXG5cdFx0dmFyIGZyZWVTcGFjZSA9IHRoaXMubGF5b3V0TWFuYWdlci5nZXRGcmVlU3BhY2UoKTtcblx0XHRwbG90QXJlYS54MSA9IGZyZWVTcGFjZS54MTtcblx0XHRwbG90QXJlYS54MiA9IGZyZWVTcGFjZS54Mjtcblx0XHRwbG90QXJlYS55MSA9IGZyZWVTcGFjZS55MTtcblx0XHRwbG90QXJlYS55MiA9IGZyZWVTcGFjZS55MjtcblxuXHRcdHBsb3RBcmVhLndpZHRoID0gZnJlZVNwYWNlLndpZHRoO1xuXHRcdHBsb3RBcmVhLmhlaWdodCA9IGZyZWVTcGFjZS5oZWlnaHQ7XG5cdH1cblxuXHRpZiAoIWlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cblx0XHRwbG90QXJlYS5jYW52YXMud2lkdGggPSBwbG90QXJlYS53aWR0aDtcblx0XHRwbG90QXJlYS5jYW52YXMuaGVpZ2h0ID0gcGxvdEFyZWEuaGVpZ2h0O1xuXG5cdFx0cGxvdEFyZWEuY2FudmFzLnN0eWxlLmxlZnQgPSBwbG90QXJlYS54MSArIFwicHhcIjtcblx0XHRwbG90QXJlYS5jYW52YXMuc3R5bGUudG9wID0gcGxvdEFyZWEueTEgKyBcInB4XCI7XG5cblx0XHRpZiAocGxvdEFyZWEueDEgPiAwIHx8IHBsb3RBcmVhLnkxID4gMCkge1xuXHRcdFx0cGxvdEFyZWEuY3R4LnRyYW5zbGF0ZSgtcGxvdEFyZWEueDEsIC1wbG90QXJlYS55MSk7XG5cdFx0fVxuXHR9XG5cblx0cGxvdEFyZWEubGF5b3V0TWFuYWdlciA9IG5ldyBMYXlvdXRNYW5hZ2VyKHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEueDIsIHBsb3RBcmVhLnkyLCAyKTtcbn1cblxuQ2hhcnQucHJvdG90eXBlLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhID0gZnVuY3Rpb24gKHgsIHkpIHtcblx0cmV0dXJuIHtcblx0XHR4OiB0aGlzLmF4aXNYLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXMoeCkueCwgeTogdGhpcy5heGlzWS5nZXRQaXhlbENvb3JkaW5hdGVzT25BeGlzKHkpLnlcblx0fVxuXHQvL3JldHVybiB7IHg6IDUsIHk6IDEwIH07XG59XG5cbi8vI3JlZ2lvbiBSZW5kZXIgTWV0aG9kc1xuXG5DaGFydC5wcm90b3R5cGUucmVuZGVySW5kZXhMYWJlbHMgPSBmdW5jdGlvbiAodGFyZ2V0Q3R4KSB7XG5cdHZhciBjdHggPSB0YXJnZXRDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblxuXHR2YXIgbWlkID0gMDtcblx0dmFyIHlNaW5MaW1pdCA9IDA7XG5cdHZhciB5TWF4TGltaXQgPSAwO1xuXHR2YXIgeE1pbkxpbWl0ID0gMDtcblx0dmFyIHhNYXhMaW1pdCA9IDA7XG5cdHZhciBtYXJnaW5YID0gMCwgbWFyZ2luWSA9IDA7IC8vIE1hcmdpbiBiZXR3ZWVuIGxhYmVsIGFuZCBkYXRhUG9pbnQgLyBQbG90QXJlYVxuXHR2YXIgb2ZmU2V0WCA9IDAsIG9mZlNldFkgPSAwOyAvLyBEaXN0YW5jZSB0byBvZmZTZXQgdGV4dEJsb2NrICh0b3ApIGZyb20gZGF0YVBvaW50IGlub3JkZXIgdG8gcG9zaXRpb24gaXRcblx0dmFyIHZpc2libGVXaWR0aCA9IDA7XG5cdHZhciB2aXNpYmxlSGVpZ2h0ID0gMDtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2luZGV4TGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHR2YXIgaW5kZXhMYWJlbCA9IHRoaXMuX2luZGV4TGFiZWxzW2ldO1xuXHRcdHZhciBjaGFydFR5cGVMb3dlciA9IGluZGV4TGFiZWwuY2hhcnRUeXBlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHR2YXIgeCwgeSwgYW5nbGU7XG5cblx0XHR2YXIgZm9udENvbG9yID0gZ2V0UHJvcGVydHkoXCJpbmRleExhYmVsRm9udENvbG9yXCIsIGluZGV4TGFiZWwuZGF0YVBvaW50LCBpbmRleExhYmVsLmRhdGFTZXJpZXMpO1xuXHRcdHZhciBmb250U2l6ZSA9IGdldFByb3BlcnR5KFwiaW5kZXhMYWJlbEZvbnRTaXplXCIsIGluZGV4TGFiZWwuZGF0YVBvaW50LCBpbmRleExhYmVsLmRhdGFTZXJpZXMpO1xuXHRcdHZhciBmb250RmFtaWx5ID0gZ2V0UHJvcGVydHkoXCJpbmRleExhYmVsRm9udEZhbWlseVwiLCBpbmRleExhYmVsLmRhdGFQb2ludCwgaW5kZXhMYWJlbC5kYXRhU2VyaWVzKTtcblx0XHR2YXIgZm9udFN0eWxlID0gZ2V0UHJvcGVydHkoXCJpbmRleExhYmVsRm9udFN0eWxlXCIsIGluZGV4TGFiZWwuZGF0YVBvaW50LCBpbmRleExhYmVsLmRhdGFTZXJpZXMpO1xuXHRcdHZhciBmb250V2VpZ2h0ID0gZ2V0UHJvcGVydHkoXCJpbmRleExhYmVsRm9udFdlaWdodFwiLCBpbmRleExhYmVsLmRhdGFQb2ludCwgaW5kZXhMYWJlbC5kYXRhU2VyaWVzKTtcblx0XHR2YXIgYmFja2dyb3VuZENvbG9yID0gZ2V0UHJvcGVydHkoXCJpbmRleExhYmVsQmFja2dyb3VuZENvbG9yXCIsIGluZGV4TGFiZWwuZGF0YVBvaW50LCBpbmRleExhYmVsLmRhdGFTZXJpZXMpO1xuXHRcdHZhciBtYXhXaWR0aCA9IGdldFByb3BlcnR5KFwiaW5kZXhMYWJlbE1heFdpZHRoXCIsIGluZGV4TGFiZWwuZGF0YVBvaW50LCBpbmRleExhYmVsLmRhdGFTZXJpZXMpO1xuXHRcdHZhciBpbmRleExhYmVsV3JhcCA9IGdldFByb3BlcnR5KFwiaW5kZXhMYWJlbFdyYXBcIiwgaW5kZXhMYWJlbC5kYXRhUG9pbnQsIGluZGV4TGFiZWwuZGF0YVNlcmllcyk7XG5cblx0XHR2YXIgcGVyY2VudEFuZFRvdGFsID0ge1xuXHRcdFx0cGVyY2VudDogbnVsbCwgdG90YWw6IG51bGxcblx0XHR9O1xuXHRcdHZhciBmb3JtYXR0ZXJQYXJhbWV0ZXIgPSBudWxsO1xuXG5cdFx0aWYgKGluZGV4TGFiZWwuZGF0YVNlcmllcy50eXBlLmluZGV4T2YoXCJzdGFja2VkXCIpID49IDAgfHwgaW5kZXhMYWJlbC5kYXRhU2VyaWVzLnR5cGUgPT09IFwicGllXCIgfHwgaW5kZXhMYWJlbC5kYXRhU2VyaWVzLnR5cGUgPT09IFwiZG91Z2hudXRcIilcblx0XHRcdHBlcmNlbnRBbmRUb3RhbCA9IHRoaXMuZ2V0UGVyY2VudEFuZFRvdGFsKGluZGV4TGFiZWwuZGF0YVNlcmllcywgaW5kZXhMYWJlbC5kYXRhUG9pbnQpO1xuXG5cdFx0aWYgKGluZGV4TGFiZWwuZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyIHx8IGluZGV4TGFiZWwuZGF0YVBvaW50LmluZGV4TGFiZWxGb3JtYXR0ZXIpXG5cdFx0XHRmb3JtYXR0ZXJQYXJhbWV0ZXIgPSB7XG5cdFx0XHRcdGNoYXJ0OiB0aGlzLl9vcHRpb25zLCBkYXRhU2VyaWVzOiBpbmRleExhYmVsLmRhdGFTZXJpZXMsIGRhdGFQb2ludDogaW5kZXhMYWJlbC5kYXRhUG9pbnQsIGluZGV4OiBpbmRleExhYmVsLmluZGV4S2V5d29yZCwgdG90YWw6IHBlcmNlbnRBbmRUb3RhbC50b3RhbCwgcGVyY2VudDogcGVyY2VudEFuZFRvdGFsLnBlcmNlbnRcblx0XHRcdH07XG5cblxuXHRcdHZhciBpbmRleExhYmVsVGV4dCA9IGluZGV4TGFiZWwuZGF0YVBvaW50LmluZGV4TGFiZWxGb3JtYXR0ZXIgPyBpbmRleExhYmVsLmRhdGFQb2ludC5pbmRleExhYmVsRm9ybWF0dGVyKGZvcm1hdHRlclBhcmFtZXRlcilcblx0XHRcdDogaW5kZXhMYWJlbC5kYXRhUG9pbnQuaW5kZXhMYWJlbCA/IHRoaXMucmVwbGFjZUtleXdvcmRzV2l0aFZhbHVlKGluZGV4TGFiZWwuZGF0YVBvaW50LmluZGV4TGFiZWwsIGluZGV4TGFiZWwuZGF0YVBvaW50LCBpbmRleExhYmVsLmRhdGFTZXJpZXMsIG51bGwsIGluZGV4TGFiZWwuaW5kZXhLZXl3b3JkKVxuXHRcdFx0OiBpbmRleExhYmVsLmRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlciA/IGluZGV4TGFiZWwuZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyKGZvcm1hdHRlclBhcmFtZXRlcilcblx0XHRcdDogaW5kZXhMYWJlbC5kYXRhU2VyaWVzLmluZGV4TGFiZWwgPyB0aGlzLnJlcGxhY2VLZXl3b3Jkc1dpdGhWYWx1ZShpbmRleExhYmVsLmRhdGFTZXJpZXMuaW5kZXhMYWJlbCwgaW5kZXhMYWJlbC5kYXRhUG9pbnQsIGluZGV4TGFiZWwuZGF0YVNlcmllcywgbnVsbCwgaW5kZXhMYWJlbC5pbmRleEtleXdvcmQpIDogbnVsbDtcblxuXHRcdGlmIChpbmRleExhYmVsVGV4dCA9PT0gbnVsbCB8fCBpbmRleExhYmVsVGV4dCA9PT0gXCJcIilcblx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0dmFyIHBsYWNlbWVudCA9IGdldFByb3BlcnR5KFwiaW5kZXhMYWJlbFBsYWNlbWVudFwiLCBpbmRleExhYmVsLmRhdGFQb2ludCwgaW5kZXhMYWJlbC5kYXRhU2VyaWVzKTtcblx0XHR2YXIgb3JpZW50YXRpb24gPSBnZXRQcm9wZXJ0eShcImluZGV4TGFiZWxPcmllbnRhdGlvblwiLCBpbmRleExhYmVsLmRhdGFQb2ludCwgaW5kZXhMYWJlbC5kYXRhU2VyaWVzKTtcblx0XHR2YXIgYW5nbGUgPSAwO1xuXG5cdFx0dmFyIGRpcmVjdGlvbiA9IGluZGV4TGFiZWwuZGlyZWN0aW9uOyAvLyArMSBmb3IgYWJvdmUgdGhlIHBvaW50IGFuZCAtMSBmb3IgYmVsb3cgdGhlIHBvaW50XG5cblx0XHR2YXIgYXhpc1ggPSBpbmRleExhYmVsLmRhdGFTZXJpZXMuYXhpc1g7XG5cdFx0dmFyIGF4aXNZID0gaW5kZXhMYWJlbC5kYXRhU2VyaWVzLmF4aXNZO1xuXG5cblx0XHR2YXIgdGV4dEJsb2NrID0gbmV3IFRleHRCbG9jayhjdHgsIHtcblx0XHRcdHg6IDAsXG5cdFx0XHR5OiAwLFxuXHRcdFx0bWF4V2lkdGg6IG1heFdpZHRoID8gbWF4V2lkdGggOiB0aGlzLndpZHRoICogLjUsXG5cdFx0XHRtYXhIZWlnaHQ6IGluZGV4TGFiZWxXcmFwID8gZm9udFNpemUgKiA1IDogZm9udFNpemUgKiAxLjUsXG5cdFx0XHRhbmdsZTogb3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiID8gMCA6IC05MCxcblx0XHRcdHRleHQ6IGluZGV4TGFiZWxUZXh0LFxuXHRcdFx0cGFkZGluZzogMCxcblx0XHRcdGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yLFxuXHRcdFx0aG9yaXpvbnRhbEFsaWduOiBcImxlZnRcIiwvL2xlZnQsIGNlbnRlciwgcmlnaHRcblx0XHRcdGZvbnRTaXplOiBmb250U2l6ZSwvL2luIHBpeGVsc1xuXHRcdFx0Zm9udEZhbWlseTogZm9udEZhbWlseSxcblx0XHRcdGZvbnRXZWlnaHQ6IGZvbnRXZWlnaHQsIC8vbm9ybWFsLCBib2xkLCBib2xkZXIsIGxpZ2h0ZXIsXG5cdFx0XHRmb250Q29sb3I6IGZvbnRDb2xvcixcblx0XHRcdGZvbnRTdHlsZTogZm9udFN0eWxlLCAvLyBub3JtYWwsIGl0YWxpYywgb2JsaXF1ZVxuXHRcdFx0dGV4dEJhc2VsaW5lOiBcInRvcFwiXG5cdFx0fSk7XG5cblx0XHR2YXIgdGV4dFNpemUgPSB0ZXh0QmxvY2subWVhc3VyZVRleHQoKTtcblxuXHRcdC8vaWYgKGluZGV4TGFiZWwuZGF0YVBvaW50LnggPCBheGlzWC52aWV3cG9ydE1pbmltdW0gfHwgaW5kZXhMYWJlbC5kYXRhUG9pbnQueCA+IGF4aXNYLnZpZXdwb3J0TWF4aW11bSB8fCBpbmRleExhYmVsLmRhdGFQb2ludC55IDwgYXhpc1kudmlld3BvcnRNaW5pbXVtIHx8IGluZGV4TGFiZWwuZGF0YVBvaW50LnkgPiBheGlzWS52aWV3cG9ydE1heGltdW0pXG5cdFx0Ly9cdGNvbnRpbnVlO1xuXG5cdFx0aWYgKGNoYXJ0VHlwZUxvd2VyLmluZGV4T2YoXCJsaW5lXCIpID49IDAgfHwgY2hhcnRUeXBlTG93ZXIuaW5kZXhPZihcImFyZWFcIikgPj0gMFxuXHRcdFx0XHR8fCBjaGFydFR5cGVMb3dlci5pbmRleE9mKFwiYnViYmxlXCIpID49IDAgfHwgY2hhcnRUeXBlTG93ZXIuaW5kZXhPZihcInNjYXR0ZXJcIikgPj0gMCkge1xuXG5cdFx0XHRpZiAoaW5kZXhMYWJlbC5kYXRhUG9pbnQueCA8IGF4aXNYLnZpZXdwb3J0TWluaW11bSB8fCBpbmRleExhYmVsLmRhdGFQb2ludC54ID4gYXhpc1gudmlld3BvcnRNYXhpbXVtIHx8IGluZGV4TGFiZWwuZGF0YVBvaW50LnkgPCBheGlzWS52aWV3cG9ydE1pbmltdW0gfHwgaW5kZXhMYWJlbC5kYXRhUG9pbnQueSA+IGF4aXNZLnZpZXdwb3J0TWF4aW11bSlcblx0XHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0aWYgKGluZGV4TGFiZWwuZGF0YVBvaW50LnggPCBheGlzWC52aWV3cG9ydE1pbmltdW0gfHwgaW5kZXhMYWJlbC5kYXRhUG9pbnQueCA+IGF4aXNYLnZpZXdwb3J0TWF4aW11bSlcblx0XHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0bWFyZ2luWSA9IDI7XG5cdFx0bWFyZ2luWCA9IDI7XG5cblx0XHRpZiAob3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiKSB7XG5cdFx0XHR2aXNpYmxlV2lkdGggPSB0ZXh0QmxvY2sud2lkdGg7XG5cdFx0XHR2aXNpYmxlSGVpZ2h0ID0gdGV4dEJsb2NrLmhlaWdodDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmlzaWJsZUhlaWdodCA9IHRleHRCbG9jay53aWR0aDtcblx0XHRcdHZpc2libGVXaWR0aCA9IHRleHRCbG9jay5oZWlnaHQ7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gXCJub3JtYWxcIikge1xuXG5cdFx0XHRpZiAoY2hhcnRUeXBlTG93ZXIuaW5kZXhPZihcImxpbmVcIikgPj0gMCB8fCBjaGFydFR5cGVMb3dlci5pbmRleE9mKFwiYXJlYVwiKSA+PSAwKSB7XG5cblx0XHRcdFx0cGxhY2VtZW50ID0gXCJhdXRvXCI7XG5cdFx0XHRcdG1hcmdpblkgPSA0O1xuXG5cdFx0XHR9IGVsc2UgaWYgKGNoYXJ0VHlwZUxvd2VyLmluZGV4T2YoXCJzdGFja2VkXCIpID49IDApIHtcblxuXHRcdFx0XHRpZiAocGxhY2VtZW50ID09PSBcImF1dG9cIilcblx0XHRcdFx0XHRwbGFjZW1lbnQgPSBcImluc2lkZVwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKGNoYXJ0VHlwZUxvd2VyID09PSBcImJ1YmJsZVwiIHx8IGNoYXJ0VHlwZUxvd2VyID09PSBcInNjYXR0ZXJcIikge1xuXG5cdFx0XHRcdHBsYWNlbWVudCA9IFwiaW5zaWRlXCI7XG5cblx0XHRcdH1cblxuXHRcdFx0eCA9IGluZGV4TGFiZWwucG9pbnQueCAtIHZpc2libGVXaWR0aCAvIDI7XG5cblx0XHRcdGlmIChwbGFjZW1lbnQgIT09IFwiaW5zaWRlXCIpIHtcdC8vb3V0c2lkZSBvciBhdXRvXG5cblx0XHRcdFx0eU1pbkxpbWl0ID0gcGxvdEFyZWEueTE7XG5cdFx0XHRcdHlNYXhMaW1pdCA9IHBsb3RBcmVhLnkyO1xuXG5cdFx0XHRcdGlmIChkaXJlY3Rpb24gPiAwKSB7XG5cdFx0XHRcdFx0eSA9IGluZGV4TGFiZWwucG9pbnQueSAtIHZpc2libGVIZWlnaHQgLSBtYXJnaW5ZO1xuXG5cdFx0XHRcdFx0aWYgKHkgPCB5TWluTGltaXQpIHtcblx0XHRcdFx0XHRcdGlmIChwbGFjZW1lbnQgPT09IFwiYXV0b1wiKSB7XG5cdFx0XHRcdFx0XHRcdHkgPSBNYXRoLm1heChpbmRleExhYmVsLnBvaW50LnksIHlNaW5MaW1pdCkgKyBtYXJnaW5ZO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHkgPSB5TWluTGltaXQgKyBtYXJnaW5ZO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR5ID0gaW5kZXhMYWJlbC5wb2ludC55ICsgbWFyZ2luWTtcblxuXHRcdFx0XHRcdGlmICh5ID4geU1heExpbWl0IC0gdmlzaWJsZUhlaWdodCAtIG1hcmdpblkpIHtcblx0XHRcdFx0XHRcdGlmIChwbGFjZW1lbnQgPT09IFwiYXV0b1wiKSB7XG5cdFx0XHRcdFx0XHRcdHkgPSBNYXRoLm1pbihpbmRleExhYmVsLnBvaW50LnksIHlNYXhMaW1pdCkgLSB2aXNpYmxlSGVpZ2h0IC0gbWFyZ2luWTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR5ID0geU1heExpbWl0IC0gdmlzaWJsZUhlaWdodCAtIG1hcmdpblk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblxuXHRcdFx0XHR5TWluTGltaXQgPSBNYXRoLm1heChpbmRleExhYmVsLmJvdW5kcy55MSwgcGxvdEFyZWEueTEpO1xuXHRcdFx0XHR5TWF4TGltaXQgPSBNYXRoLm1pbihpbmRleExhYmVsLmJvdW5kcy55MiwgcGxvdEFyZWEueTIpO1xuXG5cblx0XHRcdFx0aWYgKGNoYXJ0VHlwZUxvd2VyLmluZGV4T2YoXCJyYW5nZVwiKSA+PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRpcmVjdGlvbiA+IDApXG5cdFx0XHRcdFx0XHRtaWQgPSBNYXRoLm1heChpbmRleExhYmVsLmJvdW5kcy55MSwgcGxvdEFyZWEueTEpICsgdmlzaWJsZUhlaWdodCAvIDIgKyBtYXJnaW5ZO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdG1pZCA9IE1hdGgubWluKGluZGV4TGFiZWwuYm91bmRzLnkyLCBwbG90QXJlYS55MikgLSB2aXNpYmxlSGVpZ2h0IC8gMiAtIG1hcmdpblk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdG1pZCA9IChNYXRoLm1heChpbmRleExhYmVsLmJvdW5kcy55MSwgcGxvdEFyZWEueTEpICsgTWF0aC5taW4oaW5kZXhMYWJlbC5ib3VuZHMueTIsIHBsb3RBcmVhLnkyKSkgLyAyXG5cblx0XHRcdFx0aWYgKGRpcmVjdGlvbiA+IDApIHtcblx0XHRcdFx0XHR5ID0gTWF0aC5tYXgoaW5kZXhMYWJlbC5wb2ludC55LCBtaWQpIC0gdmlzaWJsZUhlaWdodCAvIDI7XG5cblx0XHRcdFx0XHRpZiAoeSA8IHlNaW5MaW1pdCAmJiAoY2hhcnRUeXBlTG93ZXIgPT09IFwiYnViYmxlXCIgfHwgY2hhcnRUeXBlTG93ZXIgPT09IFwic2NhdHRlclwiKSkge1xuXHRcdFx0XHRcdFx0eSA9IE1hdGgubWF4KGluZGV4TGFiZWwucG9pbnQueSAtIHZpc2libGVIZWlnaHQgLSBtYXJnaW5ZLCBwbG90QXJlYS55MSArIG1hcmdpblkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR5ID0gTWF0aC5taW4oaW5kZXhMYWJlbC5wb2ludC55LCBtaWQpIC0gdmlzaWJsZUhlaWdodCAvIDI7XG5cblx0XHRcdFx0XHRpZiAoeSA+IHlNYXhMaW1pdCAtIHZpc2libGVIZWlnaHQgLSBtYXJnaW5ZICYmIChjaGFydFR5cGVMb3dlciA9PT0gXCJidWJibGVcIiB8fCBjaGFydFR5cGVMb3dlciA9PT0gXCJzY2F0dGVyXCIpKSB7XG5cdFx0XHRcdFx0XHR5ID0gTWF0aC5taW4oaW5kZXhMYWJlbC5wb2ludC55ICsgbWFyZ2luWSwgcGxvdEFyZWEueTIgLSB2aXNpYmxlSGVpZ2h0IC0gbWFyZ2luWSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cbiAgICAgICAgICAgICAgICAgIC8vIE1ha2UgU3VyZSB0aGF0IGl0IGRvZXMgbm90IG92ZXJsYXAgdGhlIGF4aXMgbGluZVxuXHRcdFx0XHR5ID0gTWF0aC5taW4oeSwgeU1heExpbWl0IC0gdmlzaWJsZUhlaWdodCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXG5cdFx0XHRpZiAoY2hhcnRUeXBlTG93ZXIuaW5kZXhPZihcImxpbmVcIikgPj0gMCB8fCBjaGFydFR5cGVMb3dlci5pbmRleE9mKFwiYXJlYVwiKSA+PSAwXG5cdFx0XHRcdHx8IGNoYXJ0VHlwZUxvd2VyLmluZGV4T2YoXCJzY2F0dGVyXCIpID49IDApIHtcblxuXHRcdFx0XHRwbGFjZW1lbnQgPSBcImF1dG9cIjtcblx0XHRcdFx0bWFyZ2luWCA9IDQ7XG5cblx0XHRcdH0gZWxzZSBpZiAoY2hhcnRUeXBlTG93ZXIuaW5kZXhPZihcInN0YWNrZWRcIikgPj0gMCkge1xuXG5cdFx0XHRcdGlmIChwbGFjZW1lbnQgPT09IFwiYXV0b1wiKVxuXHRcdFx0XHRcdHBsYWNlbWVudCA9IFwiaW5zaWRlXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoY2hhcnRUeXBlTG93ZXIgPT09IFwiYnViYmxlXCIpIHtcblxuXHRcdFx0XHRwbGFjZW1lbnQgPSBcImluc2lkZVwiO1xuXG5cdFx0XHR9XG5cblx0XHRcdHkgPSBpbmRleExhYmVsLnBvaW50LnkgLSB2aXNpYmxlSGVpZ2h0IC8gMjtcblxuXHRcdFx0aWYgKHBsYWNlbWVudCAhPT0gXCJpbnNpZGVcIikge1x0Ly9vdXRzaWRlIG9yIGF1dG9cblxuXHRcdFx0XHR4TWluTGltaXQgPSBwbG90QXJlYS54MTtcblx0XHRcdFx0eE1heExpbWl0ID0gcGxvdEFyZWEueDI7XG5cblx0XHRcdFx0aWYgKGRpcmVjdGlvbiA8IDApIHtcblx0XHRcdFx0XHR4ID0gaW5kZXhMYWJlbC5wb2ludC54IC0gdmlzaWJsZVdpZHRoIC0gbWFyZ2luWDtcblxuXHRcdFx0XHRcdGlmICh4IDwgeE1pbkxpbWl0KSB7XG5cdFx0XHRcdFx0XHRpZiAocGxhY2VtZW50ID09PSBcImF1dG9cIikge1xuXHRcdFx0XHRcdFx0XHR4ID0gTWF0aC5tYXgoaW5kZXhMYWJlbC5wb2ludC54LCB4TWluTGltaXQpICsgbWFyZ2luWDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR4ID0geE1pbkxpbWl0ICsgbWFyZ2luWDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0eCA9IGluZGV4TGFiZWwucG9pbnQueCArIG1hcmdpblg7XG5cblx0XHRcdFx0XHRpZiAoeCA+IHhNYXhMaW1pdCAtIHZpc2libGVXaWR0aCAtIG1hcmdpblgpIHtcblx0XHRcdFx0XHRcdGlmIChwbGFjZW1lbnQgPT09IFwiYXV0b1wiKSB7XG5cdFx0XHRcdFx0XHRcdHggPSBNYXRoLm1pbihpbmRleExhYmVsLnBvaW50LngsIHhNYXhMaW1pdCkgLSB2aXNpYmxlV2lkdGggLSBtYXJnaW5YO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHggPSB4TWF4TGltaXQgLSB2aXNpYmxlV2lkdGggLSBtYXJnaW5YO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHhNaW5MaW1pdCA9IE1hdGgubWF4KGluZGV4TGFiZWwuYm91bmRzLngxLCBwbG90QXJlYS54MSk7XG5cdFx0XHRcdHhNYXhMaW1pdCA9IE1hdGgubWluKGluZGV4TGFiZWwuYm91bmRzLngyLCBwbG90QXJlYS54Mik7XG5cblx0XHRcdFx0aWYgKGNoYXJ0VHlwZUxvd2VyLmluZGV4T2YoXCJyYW5nZVwiKSA+PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRpcmVjdGlvbiA8IDApXG5cdFx0XHRcdFx0XHRtaWQgPSBNYXRoLm1heChpbmRleExhYmVsLmJvdW5kcy54MSwgcGxvdEFyZWEueDEpICsgdmlzaWJsZVdpZHRoIC8gMiArIG1hcmdpblg7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0bWlkID0gTWF0aC5taW4oaW5kZXhMYWJlbC5ib3VuZHMueDIsIHBsb3RBcmVhLngyKSAtIHZpc2libGVXaWR0aCAvIDIgLSBtYXJnaW5YO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR2YXIgbWlkID0gKE1hdGgubWF4KGluZGV4TGFiZWwuYm91bmRzLngxLCBwbG90QXJlYS54MSkgKyBNYXRoLm1pbihpbmRleExhYmVsLmJvdW5kcy54MiwgcGxvdEFyZWEueDIpKSAvIDI7XG5cblx0XHRcdFx0aWYgKGRpcmVjdGlvbiA8IDApIHtcblx0XHRcdFx0XHR4ID0gTWF0aC5tYXgoaW5kZXhMYWJlbC5wb2ludC54LCBtaWQpIC0gdmlzaWJsZVdpZHRoIC8gMjtcblxuXHRcdFx0XHRcdC8vaWYgKHkgPCB4TWluTGltaXQpIHtcblx0XHRcdFx0XHQvL1x0eSA9IE1hdGgubWF4KGluZGV4TGFiZWwucG9pbnQueSAtIHZpc2libGVIZWlnaHQgLSBtYXJnaW5ZLCBwbG90QXJlYS55MSArIG1hcmdpblkpO1xuXHRcdFx0XHRcdC8vfVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHggPSBNYXRoLm1pbihpbmRleExhYmVsLnBvaW50LngsIG1pZCkgLSB2aXNpYmxlV2lkdGggLyAyO1xuXG5cdFx0XHRcdFx0Ly9pZiAoeSA+IHhNYXhMaW1pdCAtIHZpc2libGVIZWlnaHQgLSBtYXJnaW5ZKSB7XG5cdFx0XHRcdFx0Ly9cdHkgPSBNYXRoLm1pbihpbmRleExhYmVsLnBvaW50LnkgKyBtYXJnaW5ZLCBwbG90QXJlYS55MiAtIHZpc2libGVIZWlnaHQgLSBtYXJnaW5ZKTtcblx0XHRcdFx0XHQvL31cblx0XHRcdFx0fVxuXG5cdFx0XHQgICAgLy8gTWFrZSBTdXJlIHRoYXQgaXQgZG9lcyBub3Qgb3ZlcmxhcCB0aGUgYXhpcyBsaW5lXG5cdFx0XHQgICAgeCA9IE1hdGgubWF4KHgsIHhNaW5MaW1pdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cblx0XHRpZiAob3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIikge1xuXHRcdFx0eSArPSB2aXNpYmxlSGVpZ2h0O1xuXHRcdH1cblxuXHRcdHRleHRCbG9jay54ID0geDtcblx0XHR0ZXh0QmxvY2sueSA9IHk7XG5cblx0XHQvL2NvbnNvbGUubG9nKHRleHRCbG9jay50ZXh0ICsgXCI6IFwiICsgdGV4dEJsb2NrLnggKyBcIjsgXCIgKyB0ZXh0QmxvY2sueSk7XG5cblx0XHR0ZXh0QmxvY2sucmVuZGVyKHRydWUpO1xuXHR9XG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRzb3VyY2U6IGN0eCwgZGVzdDogdGhpcy5wbG90QXJlYS5jdHgsIGFuaW1hdGlvbkNhbGxiYWNrOiBBbmltYXRpb25IZWxwZXIuZmFkZUluQW5pbWF0aW9uLCBlYXNpbmdGdW5jdGlvbjogQW5pbWF0aW9uSGVscGVyLmVhc2luZy5lYXNlSW5RdWFkLCBhbmltYXRpb25CYXNlOiAwLCBzdGFydFRpbWVQZXJjZW50OiAuN1xuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlckxpbmUgPSBmdW5jdGlvbiAocGxvdFVuaXQpIHtcblxuXHR2YXIgY3R4ID0gcGxvdFVuaXQudGFyZ2V0Q2FudmFzQ3R4IHx8IHRoaXMucGxvdEFyZWEuY3R4O1xuXG5cdHZhciB0b3RhbERhdGFTZXJpZXMgPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7XG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGdob3N0Q3R4ID0gdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4O1xuXHQvL3ZhciBnaG9zdEN0eCA9IHRoaXMub3ZlcmxhaWRDYW52YXNDdHg7XG5cblx0Y3R4LnNhdmUoKTtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHR2YXIgbWFya2VycyA9IFtdO1xuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblxuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdFx0Y3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblx0XHR2YXIgZGF0YVBvaW50cyA9IGRhdGFTZXJpZXMuZGF0YVBvaW50cztcblxuXG5cdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0Y3R4LnNldExpbmVEYXNoKGdldExpbmVEYXNoQXJyYXkoZGF0YVNlcmllcy5saW5lRGFzaFR5cGUsIGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcykpO1xuXHRcdH1cblxuXHRcdHZhciBzZXJpZXNJZCA9IGRhdGFTZXJpZXMuaWQ7XG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtzZXJpZXNJZF0gPSB7XG5cdFx0XHRvYmplY3RUeXBlOiBcImRhdGFTZXJpZXNcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXhcblx0XHR9O1xuXHRcdHZhciBoZXhDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoc2VyaWVzSWQpO1xuXHRcdGdob3N0Q3R4LnN0cm9rZVN0eWxlID0gaGV4Q29sb3I7XG5cdFx0Ly9naG9zdEN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3M7XG5cdFx0Z2hvc3RDdHgubGluZVdpZHRoID0gZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzID4gMCA/IE1hdGgubWF4KGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcywgNCkgOiAwO1xuXG5cdFx0dmFyIGNvbG9yU2V0ID0gZGF0YVNlcmllcy5fY29sb3JTZXQ7XG5cdFx0dmFyIGNvbG9yID0gY29sb3JTZXRbMF07XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gY29sb3I7XG5cblx0XHR2YXIgaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgPSB0cnVlO1xuXHRcdHZhciBpID0gMCwgeCwgeTtcblx0XHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGJhY2sgYW5kIGZvcnRoLlxuXG5cdFx0Ly9pZiAoIWRhdGFTZXJpZXMuX29wdGlvbnMubWFya2VyU2l6ZSAmJiBkYXRhU2VyaWVzLmRhdGFQb2ludHMubGVuZ3RoIDwgMTAwMClcblx0XHQvLyAgICBkYXRhU2VyaWVzLm1hcmtlclNpemUgPSA4O1xuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRpZiAoZGF0YVBvaW50cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL3ZhciB4eSA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uUGxvdEFyZWEoZGF0YVBvaW50c1swXS54LCBkYXRhUG9pbnRzWzBdLnkpO1xuXG5cdFx0XHQvL2RhdGFTZXJpZXMubm9EYXRhUG9pbnRzSW5QbG90QXJlYSA9IDBcblx0XHRcdHZhciBwcmV2RGF0YU51bGwgPSBmYWxzZTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lID8gZGF0YVBvaW50c1tpXS54LmdldFRpbWUoKSA6IGRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heClcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHQvL2lmICghaXNGaW5pdGUoZGF0YVBvaW50c1tpXS55KSlcblx0XHRcdFx0Ly8gICAgY29udGludWU7XG5cblx0XHRcdFx0aWYgKHR5cGVvZiAoZGF0YVBvaW50c1tpXS55KSAhPT0gXCJudW1iZXJcIikge1xuXHRcdFx0XHRcdGlmIChpID4gMCkgey8vIGlmIGZpcnN0IGRhdGFQb2ludCBpcyBudWxsIHRoZW4gbm8gbmVlZCB0byBjYWxsIHN0cm9rZSBtZXRob2Rcblx0XHRcdFx0XHRcdGN0eC5zdHJva2UoKTtcblxuXHRcdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRcdGdob3N0Q3R4LnN0cm9rZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0cHJldkRhdGFOdWxsID0gdHJ1ZTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5ID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnkgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXG5cdFx0XHRcdHZhciBpZCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2ldO1xuXHRcdFx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2lkXSA9IHtcblx0XHRcdFx0XHRpZDogaWQsIG9iamVjdFR5cGU6IFwiZGF0YVBvaW50XCIsIGRhdGFTZXJpZXNJbmRleDogZGF0YVNlcmllc0luZGV4LCBkYXRhUG9pbnRJbmRleDogaSwgeDE6IHgsIHkxOiB5XG5cdFx0XHRcdH07XG5cblxuXHRcdFx0XHQvL2RhdGFTZXJpZXMubm9EYXRhUG9pbnRzSW5QbG90QXJlYSsrO1xuXG5cdFx0XHRcdGlmIChpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSB8fCBwcmV2RGF0YU51bGwpIHtcblx0XHRcdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0Y3R4Lm1vdmVUbyh4LCB5KTtcblxuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdGdob3N0Q3R4Lm1vdmVUbyh4LCB5KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IGZhbHNlO1xuXHRcdFx0XHRcdHByZXZEYXRhTnVsbCA9IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y3R4LmxpbmVUbyh4LCB5KTtcblxuXHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmxpbmVUbyh4LCB5KTtcblxuXHRcdFx0XHRcdGlmIChpICUgNTAwID09IDApIHtcblx0XHRcdFx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHRcdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdGN0eC5tb3ZlVG8oeCwgeSk7XG5cblx0XHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0XHRnaG9zdEN0eC5zdHJva2UoKTtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0XHRcdGdob3N0Q3R4Lm1vdmVUbyh4LCB5KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL1JlbmRlciBNYXJrZXJcblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ubWFya2VyU2l6ZSA+IDAgfHwgZGF0YVNlcmllcy5tYXJrZXJTaXplID4gMCkge1xuXG5cdFx0XHRcdFx0dmFyIG1hcmtlclByb3BzID0gZGF0YVNlcmllcy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGksIHgsIHksIGN0eCk7XG5cdFx0XHRcdFx0bWFya2Vycy5wdXNoKG1hcmtlclByb3BzKTtcblxuXHRcdFx0XHRcdC8vaWYgKCFkYXRhU2VyaWVzLm1heFdpZHRoSW5YIHx8IG1hcmtlclByb3BzLnNpemUgPiBkYXRhU2VyaWVzLm1heFdpZHRoSW5YKSB7XG5cdFx0XHRcdFx0Ly9cdGRhdGFTZXJpZXMubWF4V2lkdGhJblggPSBtYXJrZXJQcm9wcy5zaXplIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblx0XHRcdFx0XHQvL31cblxuXHRcdFx0XHRcdHZhciBtYXJrZXJDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdFx0Ly93aW5kb3cuY29uc29sZS5sb2coXCJpbmRleDogXCIgKyBpICsgXCI7IGlkOiBcIiArIGlkICsgXCI7IGhleDogXCIgKyBtYXJrZXJDb2xvcik7XG5cblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHksIGN0eDogZ2hvc3RDdHgsXG5cdFx0XHRcdFx0XHRcdHR5cGU6IG1hcmtlclByb3BzLnR5cGUsXG5cdFx0XHRcdFx0XHRcdHNpemU6IG1hcmtlclByb3BzLnNpemUsXG5cdFx0XHRcdFx0XHRcdGNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0Ym9yZGVyQ29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRib3JkZXJUaGlja25lc3M6IG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzc1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbCB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWwgfHwgZGF0YVBvaW50c1tpXS5pbmRleExhYmVsRm9ybWF0dGVyIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlcikge1xuXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwibGluZVwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHlcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueSA+PSAwID8gMSA6IC0xLFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGN0eC5zdHJva2UoKTtcblxuXHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRnaG9zdEN0eC5zdHJva2UoKTtcblx0XHR9XG5cblx0fVxuXG5cblx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXJzKG1hcmtlcnMpO1xuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0Z2hvc3RDdHguYmVnaW5QYXRoKCk7XG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRzb3VyY2U6IGN0eCwgZGVzdDogdGhpcy5wbG90QXJlYS5jdHgsIGFuaW1hdGlvbkNhbGxiYWNrOiBBbmltYXRpb25IZWxwZXIueENsaXBBbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmxpbmVhciwgYW5pbWF0aW9uQmFzZTogMFxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclN0ZXBMaW5lID0gZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0dmFyIHRvdGFsRGF0YVNlcmllcyA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblx0aWYgKHRvdGFsRGF0YVNlcmllcyA8PSAwKVxuXHRcdHJldHVybjtcblxuXHR2YXIgZ2hvc3RDdHggPSB0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHg7XG5cdC8vdmFyIGdob3N0Q3R4ID0gdGhpcy5vdmVybGFpZENhbnZhc0N0eDtcblxuXHRjdHguc2F2ZSgpO1xuXG5cdHZhciBwbG90QXJlYSA9IHRoaXMucGxvdEFyZWE7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRjdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRjdHguY2xpcCgpO1xuXG5cdHZhciBtYXJrZXJzID0gW107XG5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7IGorKykge1xuXG5cdFx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdO1xuXG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblx0XHRjdHgubGluZVdpZHRoID0gZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzO1xuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXG5cdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0Y3R4LnNldExpbmVEYXNoKGdldExpbmVEYXNoQXJyYXkoZGF0YVNlcmllcy5saW5lRGFzaFR5cGUsIGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcykpO1xuXHRcdH1cblxuXHRcdHZhciBzZXJpZXNJZCA9IGRhdGFTZXJpZXMuaWQ7XG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtzZXJpZXNJZF0gPSB7XG5cdFx0XHRvYmplY3RUeXBlOiBcImRhdGFTZXJpZXNcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXhcblx0XHR9O1xuXHRcdHZhciBoZXhDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoc2VyaWVzSWQpO1xuXHRcdGdob3N0Q3R4LnN0cm9rZVN0eWxlID0gaGV4Q29sb3I7XG5cdFx0Ly9naG9zdEN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3M7XG5cdFx0Z2hvc3RDdHgubGluZVdpZHRoID0gZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzID4gMCA/IE1hdGgubWF4KGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcywgNCkgOiAwO1xuXG5cdFx0dmFyIGNvbG9yU2V0ID0gZGF0YVNlcmllcy5fY29sb3JTZXQ7XG5cdFx0dmFyIGNvbG9yID0gY29sb3JTZXRbMF07XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gY29sb3I7XG5cblx0XHR2YXIgaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgPSB0cnVlO1xuXHRcdHZhciBpID0gMCwgeCwgeTtcblx0XHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGJhY2sgYW5kIGZvcnRoLlxuXG5cdFx0Ly9pZiAoIWRhdGFTZXJpZXMuX29wdGlvbnMubWFya2VyU2l6ZSAmJiBkYXRhU2VyaWVzLmRhdGFQb2ludHMubGVuZ3RoIDwgMTAwMClcblx0XHQvLyAgICBkYXRhU2VyaWVzLm1hcmtlclNpemUgPSA4O1xuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRpZiAoZGF0YVBvaW50cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL3ZhciB4eSA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uUGxvdEFyZWEoZGF0YVBvaW50c1swXS54LCBkYXRhUG9pbnRzWzBdLnkpO1xuXG5cdFx0XHQvL2RhdGFTZXJpZXMubm9EYXRhUG9pbnRzSW5QbG90QXJlYSA9IDBcblx0XHRcdHZhciBwcmV2RGF0YU51bGwgPSBmYWxzZTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0uZ2V0VGltZSA/IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCkgOiBkYXRhUG9pbnRzW2ldLng7XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludFggPCBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbiB8fCBkYXRhUG9pbnRYID4gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0Ly9pZiAoIWlzRmluaXRlKGRhdGFQb2ludHNbaV0ueSkpXG5cdFx0XHRcdC8vICAgIGNvbnRpbnVlO1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgKGRhdGFQb2ludHNbaV0ueSkgIT09IFwibnVtYmVyXCIpIHtcblx0XHRcdFx0XHRpZiAoaSA+IDApIHsvLyBpZiBmaXJzdCBkYXRhUG9pbnQgaXMgbnVsbCB0aGVuIG5vIG5lZWQgdG8gY2FsbCBzdHJva2UgbWV0aG9kXG5cdFx0XHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cblx0XHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0XHRnaG9zdEN0eC5zdHJva2UoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRwcmV2RGF0YU51bGwgPSB0cnVlO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHByZXZZID0geTtcblxuXHRcdFx0XHR4ID0gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRYIC0gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4LCB5MTogeVxuXHRcdFx0XHR9O1xuXG5cblx0XHRcdFx0Ly9kYXRhU2VyaWVzLm5vRGF0YVBvaW50c0luUGxvdEFyZWErKztcblxuXHRcdFx0XHRpZiAoaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgfHwgcHJldkRhdGFOdWxsKSB7XG5cdFx0XHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdGN0eC5tb3ZlVG8oeCwgeSk7XG5cblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKHgsIHkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gZmFsc2U7XG5cdFx0XHRcdFx0cHJldkRhdGFOdWxsID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjdHgubGluZVRvKHgsIHByZXZZKTtcblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5saW5lVG8oeCwgcHJldlkpO1xuXG5cdFx0XHRcdFx0Y3R4LmxpbmVUbyh4LCB5KTtcblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5saW5lVG8oeCwgeSk7XG5cblx0XHRcdFx0XHRpZiAoaSAlIDUwMCA9PSAwKSB7XG5cdFx0XHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0XHRcdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0XHRjdHgubW92ZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDdHguc3Ryb2tlKCk7XG5cdFx0XHRcdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oeCwgeSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly9SZW5kZXIgTWFya2VyXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLm1hcmtlclNpemUgPiAwIHx8IGRhdGFTZXJpZXMubWFya2VyU2l6ZSA+IDApIHtcblxuXHRcdFx0XHRcdHZhciBtYXJrZXJQcm9wcyA9IGRhdGFTZXJpZXMuZ2V0TWFya2VyUHJvcGVydGllcyhpLCB4LCB5LCBjdHgpO1xuXHRcdFx0XHRcdG1hcmtlcnMucHVzaChtYXJrZXJQcm9wcyk7XG5cblx0XHRcdFx0XHQvL2lmICghZGF0YVNlcmllcy5tYXhXaWR0aEluWCB8fCBtYXJrZXJQcm9wcy5zaXplID4gZGF0YVNlcmllcy5tYXhXaWR0aEluWCkge1xuXHRcdFx0XHRcdC8vXHRkYXRhU2VyaWVzLm1heFdpZHRoSW5YID0gbWFya2VyUHJvcHMuc2l6ZSAvIChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgPiAxID8gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0IC0gMSA6IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCk7XG5cdFx0XHRcdFx0Ly99XG5cblx0XHRcdFx0XHR2YXIgbWFya2VyQ29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRcdC8vd2luZG93LmNvbnNvbGUubG9nKFwiaW5kZXg6IFwiICsgaSArIFwiOyBpZDogXCIgKyBpZCArIFwiOyBoZXg6IFwiICsgbWFya2VyQ29sb3IpO1xuXHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0bWFya2Vycy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0eDogeCwgeTogeSwgY3R4OiBnaG9zdEN0eCxcblx0XHRcdFx0XHRcdFx0dHlwZTogbWFya2VyUHJvcHMudHlwZSxcblx0XHRcdFx0XHRcdFx0c2l6ZTogbWFya2VyUHJvcHMuc2l6ZSxcblx0XHRcdFx0XHRcdFx0Y29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRib3JkZXJDb2xvcjogbWFya2VyQ29sb3IsXG5cdFx0XHRcdFx0XHRcdGJvcmRlclRoaWNrbmVzczogbWFya2VyUHJvcHMuYm9yZGVyVGhpY2tuZXNzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5pbmRleExhYmVsIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbCB8fCBkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWxGb3JtYXR0ZXIgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJzdGVwTGluZVwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHlcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueSA+PSAwID8gMSA6IC0xLFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0Z2hvc3RDdHguc3Ryb2tlKCk7XG5cdFx0fVxuXHR9XG5cblxuXHRSZW5kZXJIZWxwZXIuZHJhd01hcmtlcnMobWFya2Vycyk7XG5cdGN0eC5yZXN0b3JlKCk7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblxuXHQvL3NvdXJjZSBhbmQgZGVzdCB3b3VsZCBiZSBzYW1lIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBlbmFibGVkXG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci54Q2xpcEFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcubGluZWFyLCBhbmltYXRpb25CYXNlOiAwXG5cdH07XG5cdHJldHVybiBhbmltYXRpb25JbmZvO1xufVxuXG5DaGFydC5wcm90b3R5cGUuYW5pbWF0aW9uUmVxdWVzdElkID0gbnVsbDtcblxuQ2hhcnQucHJvdG90eXBlLnJlcXVlc3RBbmltRnJhbWUgPSAoZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0ZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG5cdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gNjApO1xuXHRcdFx0fTtcbn0pKCk7XG5cbkNoYXJ0LnByb3RvdHlwZS5jYW5jZWxSZXF1ZXN0QW5pbUZyYW1lID0gKGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuXHRcdHdpbmRvdy53ZWJraXRDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHR3aW5kb3cubW96Q2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0d2luZG93Lm9DYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHR3aW5kb3cubXNDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRjbGVhclRpbWVvdXRcbn0pKCk7XG5cbkNoYXJ0LnByb3RvdHlwZS5nZXRQZXJjZW50QW5kVG90YWwgPSBmdW5jdGlvbiAoZHMsIGRwKSB7XG5cblx0dmFyIGRwWCA9IG51bGw7XG5cdHZhciB0b3RhbCA9IG51bGw7XG5cdHZhciBwZXJjZW50ID0gbnVsbDtcblxuXHRpZiAoZHMudHlwZS5pbmRleE9mKFwic3RhY2tlZFwiKSA+PSAwKSB7XG5cdFx0dG90YWwgPSAwO1xuXHRcdGRwWCA9IGRwLnguZ2V0VGltZSA/IGRwLnguZ2V0VGltZSgpIDogZHAueDtcblx0XHRpZiAoZHBYIGluIGRzLnBsb3RVbml0LnlUb3RhbHMpIHtcblx0XHRcdHRvdGFsID0gZHMucGxvdFVuaXQueVRvdGFsc1tkcFhdO1xuXG5cdFx0XHRpZiAoIWlzTmFOKGRwLnkpKSB7XG5cdFx0XHQgICAgaWYgKHRvdGFsID09PSAwKVxuXHRcdFx0ICAgICAgICBwZXJjZW50ID0gMDtcbiAgICAgICAgICAgICAgICAgIGVsc2Vcblx0XHRcdCAgICAgICAgcGVyY2VudCA9IChkcC55IC8gdG90YWwpICogMTAwO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0ICAgIHBlcmNlbnQgPSAwO1xuXHRcdH1cblx0fSBlbHNlIGlmIChkcy50eXBlID09PSBcInBpZVwiIHx8IGRzLnR5cGUgPT09IFwiZG91Z2hudXRcIikge1xuXHRcdHRvdGFsID0gMDtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRzLmRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0aWYgKCFpc05hTihkcy5kYXRhUG9pbnRzW2ldLnkpKVxuXHRcdFx0XHR0b3RhbCArPSBkcy5kYXRhUG9pbnRzW2ldLnk7XG5cdFx0fVxuXG5cdFx0aWYgKCFpc05hTihkcC55KSlcblx0XHRcdHBlcmNlbnQgPSAoZHAueSAvIHRvdGFsKSAqIDEwMDtcblx0XHRlbHNlXG5cdFx0XHRwZXJjZW50ID0gMDtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0cGVyY2VudDogcGVyY2VudCwgdG90YWw6IHRvdGFsXG5cdH07XG59XG5cbkNoYXJ0LnByb3RvdHlwZS5yZXBsYWNlS2V5d29yZHNXaXRoVmFsdWUgPSBmdW5jdGlvbiAoc3RyLCBkcCwgZHMsIGRwSW5kZXgsIGluZGV4S2V5d29yZFZhbHVlKSB7XG5cdC8vdmFyIHJlZ2V4ID0gL1xce1xccypbYS16QS1aXStcXHMqXFx9fFwiW15cIl0qXCJ8J1teJ10qJy9nO1xuXHR2YXIgcmVnZXggPSAvXFx7Lio/XFx9fFwiW15cIl0qXCJ8J1teJ10qJy9nO1xuXHR2YXIgY2hhcnQgPSB0aGlzO1xuXHRpbmRleEtleXdvcmRWYWx1ZSA9IHR5cGVvZiAoaW5kZXhLZXl3b3JkVmFsdWUpID09PSBcInVuZGVmaW5lZFwiID8gMCA6IGluZGV4S2V5d29yZFZhbHVlO1xuXG5cdGlmICgoZHMudHlwZS5pbmRleE9mKFwic3RhY2tlZFwiKSA+PSAwIHx8IChkcy50eXBlID09PSBcInBpZVwiIHx8IGRzLnR5cGUgPT09IFwiZG91Z2hudXRcIikpICYmIChzdHIuaW5kZXhPZihcIiNwZXJjZW50XCIpID49IDAgfHwgc3RyLmluZGV4T2YoXCIjdG90YWxcIikgPj0gMCkpIHtcblx0XHR2YXIgcGVyY2VudCA9IFwiI3BlcmNlbnRcIjtcblx0XHR2YXIgdG90YWwgPSBcIiN0b3RhbFwiO1xuXHRcdHZhciBkcFggPSBudWxsO1xuXG5cdFx0dmFyIHBlcmNlbnRBbmRUb3RhbCA9IHRoaXMuZ2V0UGVyY2VudEFuZFRvdGFsKGRzLCBkcCk7XG5cblx0XHR0b3RhbCA9IGlzTmFOKHBlcmNlbnRBbmRUb3RhbC50b3RhbCkgPyB0b3RhbCA6IHBlcmNlbnRBbmRUb3RhbC50b3RhbDtcblx0XHRwZXJjZW50ID0gaXNOYU4ocGVyY2VudEFuZFRvdGFsLnBlcmNlbnQpID8gcGVyY2VudCA6IHBlcmNlbnRBbmRUb3RhbC5wZXJjZW50O1xuXG5cdFx0ZG8ge1xuXHRcdFx0dmFyIHBlcmNlbnRGb3JtYXRTdHJpbmcgPSBcIlwiO1xuXHRcdFx0aWYgKGRzLnBlcmNlbnRGb3JtYXRTdHJpbmcpXG5cdFx0XHRcdHBlcmNlbnRGb3JtYXRTdHJpbmcgPSBkcy5wZXJjZW50Rm9ybWF0U3RyaW5nO1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHBlcmNlbnRGb3JtYXRTdHJpbmcgPSBcIiMsIyMwLlwiO1xuXHRcdFx0XHR2YXIgbnVtYmVyT2ZEZWNpbWFscyA9IE1hdGgubWF4KE1hdGguY2VpbChNYXRoLmxvZygxIC8gTWF0aC5hYnMocGVyY2VudCkpIC8gTWF0aC5MTjEwKSwgMik7XG5cblx0XHRcdFx0aWYgKGlzTmFOKG51bWJlck9mRGVjaW1hbHMpIHx8ICFpc0Zpbml0ZShudW1iZXJPZkRlY2ltYWxzKSlcblx0XHRcdFx0XHRudW1iZXJPZkRlY2ltYWxzID0gMjtcblxuXHRcdFx0XHRmb3IgKHZhciBuID0gMDsgbiA8IG51bWJlck9mRGVjaW1hbHM7IG4rKykge1xuXHRcdFx0XHRcdHBlcmNlbnRGb3JtYXRTdHJpbmcgKz0gXCIjXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0c3RyID0gc3RyLnJlcGxhY2UoXCIjcGVyY2VudFwiLCBudW1iZXJGb3JtYXQocGVyY2VudCwgcGVyY2VudEZvcm1hdFN0cmluZywgY2hhcnQuX2N1bHR1cmVJbmZvKSk7XG5cdFx0XHRzdHIgPSBzdHIucmVwbGFjZShcIiN0b3RhbFwiLCBudW1iZXJGb3JtYXQodG90YWwsIGRzLnlWYWx1ZUZvcm1hdFN0cmluZyA/IGRzLnlWYWx1ZUZvcm1hdFN0cmluZyA6IFwiIywjIzAuIyMjIyMjIyNcIikpO1xuXHRcdH0gd2hpbGUgKHN0ci5pbmRleE9mKFwiI3BlcmNlbnRcIikgPj0gMCB8fCBzdHIuaW5kZXhPZihcIiN0b3RhbFwiKSA+PSAwKTtcblx0fVxuXG5cblx0dmFyIGZjbiA9IGZ1bmN0aW9uICgkMCkge1xuXHRcdGlmICgoJDBbMF0gPT09IFwiXFxcIlwiICYmICQwWyQwLmxlbmd0aCAtIDFdID09PSBcIlxcXCJcIikgfHwgKCQwWzBdID09PSBcIlxcJ1wiICYmICQwWyQwLmxlbmd0aCAtIDFdID09PSBcIlxcJ1wiKSlcblx0XHRcdHJldHVybiAkMC5zbGljZSgxLCAkMC5sZW5ndGggLSAxKTtcblxuXHRcdHZhciBrZXkgPSB0cmltU3RyaW5nKCQwLnNsaWNlKDEsICQwLmxlbmd0aCAtIDEpKTtcblx0XHRrZXkgPSBrZXkucmVwbGFjZShcIiNpbmRleFwiLCBpbmRleEtleXdvcmRWYWx1ZSk7XG5cblx0XHR2YXIgaW5kZXggPSBudWxsO1xuXG5cdFx0dHJ5IHtcblx0XHRcdHZhciBtYXRjaCA9IGtleS5tYXRjaCgvKC4qPylcXHMqXFxbXFxzKiguKj8pXFxzKlxcXS8pO1xuXHRcdFx0aWYgKG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0aW5kZXggPSB0cmltU3RyaW5nKG1hdGNoWzJdKTtcblx0XHRcdFx0a2V5ID0gdHJpbVN0cmluZyhtYXRjaFsxXSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdH07XG5cblxuXHRcdHZhciBvYmogPSBudWxsO1xuXG5cdFx0aWYgKGtleSA9PT0gXCJjb2xvclwiKSB7XG5cdFx0XHRyZXR1cm4gZHAuY29sb3IgPyBkcC5jb2xvciA6IGRzLmNvbG9yID8gZHMuY29sb3IgOiBkcy5fY29sb3JTZXRbZHBJbmRleCAlIGRzLl9jb2xvclNldC5sZW5ndGhdO1xuXHRcdH1cblxuXHRcdGlmIChkcC5oYXNPd25Qcm9wZXJ0eShrZXkpKVxuXHRcdFx0b2JqID0gZHA7XG5cdFx0ZWxzZSBpZiAoZHMuaGFzT3duUHJvcGVydHkoa2V5KSlcblx0XHRcdG9iaiA9IGRzO1xuXHRcdGVsc2UgcmV0dXJuIFwiXCI7XG5cblx0XHR2YXIgdmFsdWUgPSBvYmpba2V5XTtcblx0XHRpZiAoaW5kZXggIT09IG51bGwpXG5cdFx0XHR2YWx1ZSA9IHZhbHVlW2luZGV4XTtcblxuXHRcdGlmIChrZXkgPT09IFwieFwiKSB7XG5cdFx0XHRpZiAoY2hhcnQuYXhpc1ggJiYgY2hhcnQucGxvdEluZm8uYXhpc1hWYWx1ZVR5cGUgPT09IFwiZGF0ZVRpbWVcIilcblx0XHRcdFx0cmV0dXJuIGRhdGVGb3JtYXQodmFsdWUsIGRwLnhWYWx1ZUZvcm1hdFN0cmluZyA/IGRwLnhWYWx1ZUZvcm1hdFN0cmluZyA6IGRzLnhWYWx1ZUZvcm1hdFN0cmluZyA/IGRzLnhWYWx1ZUZvcm1hdFN0cmluZyA6IGNoYXJ0LmF4aXNYICYmIGNoYXJ0LmF4aXNYLnZhbHVlRm9ybWF0U3RyaW5nID8gY2hhcnQuYXhpc1gudmFsdWVGb3JtYXRTdHJpbmcgOiBcIkREIE1NTSBZWVwiLCBjaGFydC5fY3VsdHVyZUluZm8pO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gbnVtYmVyRm9ybWF0KHZhbHVlLCBkcC54VmFsdWVGb3JtYXRTdHJpbmcgPyBkcC54VmFsdWVGb3JtYXRTdHJpbmcgOiBkcy54VmFsdWVGb3JtYXRTdHJpbmcgPyBkcy54VmFsdWVGb3JtYXRTdHJpbmcgOiBcIiMsIyMwLiMjIyMjIyMjXCIsIGNoYXJ0Ll9jdWx0dXJlSW5mbyk7XG5cdFx0fSBlbHNlIGlmIChrZXkgPT09IFwieVwiKVxuXHRcdFx0cmV0dXJuIG51bWJlckZvcm1hdCh2YWx1ZSwgZHAueVZhbHVlRm9ybWF0U3RyaW5nID8gZHAueVZhbHVlRm9ybWF0U3RyaW5nIDogZHMueVZhbHVlRm9ybWF0U3RyaW5nID8gZHMueVZhbHVlRm9ybWF0U3RyaW5nIDogXCIjLCMjMC4jIyMjIyMjI1wiLCBjaGFydC5fY3VsdHVyZUluZm8pO1xuXHRcdGVsc2UgaWYgKGtleSA9PT0gXCJ6XCIpXG5cdFx0XHRyZXR1cm4gbnVtYmVyRm9ybWF0KHZhbHVlLCBkcC56VmFsdWVGb3JtYXRTdHJpbmcgPyBkcC56VmFsdWVGb3JtYXRTdHJpbmcgOiBkcy56VmFsdWVGb3JtYXRTdHJpbmcgPyBkcy56VmFsdWVGb3JtYXRTdHJpbmcgOiBcIiMsIyMwLiMjIyMjIyMjXCIsIGNoYXJ0Ll9jdWx0dXJlSW5mbyk7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0cmV0dXJuIHN0ci5yZXBsYWNlKHJlZ2V4LCBmY24pO1xufVxuXG5cbkNoYXJ0LnByb3RvdHlwZS5yZW5kZXJTcGxpbmUgPSBTcGxpbmVDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlckNvbHVtbiA9IENvbHVtbkNoYXJ0XG5cbkNoYXJ0LnByb3RvdHlwZS5yZW5kZXJTdGFja2VkQ29sdW1uID0gU3RhY2tlZENvbHVtbkNoYXJ0O1xuXG5DaGFydC5wcm90b3R5cGUucmVuZGVyU3RhY2tlZENvbHVtbjEwMCA9IFN0YWNrZWRDb2x1bW4xMDBDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlckJhciA9IEJhckNoYXJ0O1xuXG5DaGFydC5wcm90b3R5cGUucmVuZGVyU3RhY2tlZEJhciA9IFN0YWNrZWRCYXJDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclN0YWNrZWRCYXIxMDAgPSBTdGFja2VkQmFyMTAwQ2hhcnQ7XG5cbkNoYXJ0LnByb3RvdHlwZS5yZW5kZXJBcmVhID0gQXJlYUNoYXJ0O1xuXG5DaGFydC5wcm90b3R5cGUucmVuZGVyU3BsaW5lQXJlYSA9IFNwbGluZUFyZWFDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclN0ZXBBcmVhID0gU3RlcEFyZWFDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclN0YWNrZWRBcmVhID0gU3RhY2tlZEFyZWFDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclN0YWNrZWRBcmVhMTAwID0gU3RhY2tlZEFyZWExMDBDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlckJ1YmJsZSA9IEJ1YmJsZUNoYXJ0O1xuXG5DaGFydC5wcm90b3R5cGUucmVuZGVyU2NhdHRlciA9IFNjYXR0ZXJDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlckNhbmRsZXN0aWNrID0gQ2FuZGxlc3RpY2tDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclJhbmdlQ29sdW1uID0gUmFuZ2VDb2x1bW5DaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclJhbmdlQmFyID0gUmFuZ2VCYXJDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclJhbmdlQXJlYSA9IFJhbmdlQXJlYUNoYXJ0O1xuXG5DaGFydC5wcm90b3R5cGUucmVuZGVyUmFuZ2VTcGxpbmVBcmVhID0gUmFuZ2VTcGxpbmVBcmVhQ2hhcnQ7XG5cbkNoYXJ0LnByb3RvdHlwZS5yZW5kZXJQaWUgPSBQaWVDaGFydDtcblxuZXhwb3J0IGRlZmF1bHQgQ2hhcnQ7XG4iLCJcbmltcG9ydCBDYW52YXNKU09iamVjdCBmcm9tICcuL2NhbnZhc2pzJztcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7Y3VsdHVyZXN9IGZyb20gJy4uL2NvbnN0YW50cy9jdWx0dXJlJztcblxuZnVuY3Rpb24gQ3VsdHVyZUluZm8oY3VsdHVyZSkge1xuXG4gIHZhciBjdWx0dXJlSW5mbztcblxuICBpZiAoY3VsdHVyZSAmJiBjdWx0dXJlc1tjdWx0dXJlXSkgY3VsdHVyZUluZm8gPSBjdWx0dXJlc1tjdWx0dXJlXTtcblxuICBDdWx0dXJlSW5mby5iYXNlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgXCJDdWx0dXJlSW5mb1wiLCBjdWx0dXJlSW5mbyk7XG5cbn1cblxuZXh0ZW5kKEN1bHR1cmVJbmZvLCBDYW52YXNKU09iamVjdCk7XG5cbmV4cG9ydCBkZWZhdWx0IEN1bHR1cmVJbmZvO1xuIiwiXG5pbXBvcnQgQ2FudmFzSlNPYmplY3QgZnJvbSAnLi9jYW52YXNqcyc7XG5pbXBvcnQge2V4dGVuZCwgZ2V0UHJvcGVydHl9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5mdW5jdGlvbiBEYXRhU2VyaWVzKGNoYXJ0LCBvcHRpb25zLCB0aGVtZSwgaW5kZXgsIGlkKSB7XG4gIERhdGFTZXJpZXMuYmFzZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIFwiRGF0YVNlcmllc1wiLCBvcHRpb25zLCB0aGVtZSk7XG5cbiAgdGhpcy5jaGFydCA9IGNoYXJ0O1xuICB0aGlzLmNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcbiAgdGhpcy5fY3R4ID0gY2hhcnQuY2FudmFzLmN0eDtcbiAgdGhpcy5pbmRleCA9IGluZGV4O1xuICB0aGlzLm5vRGF0YVBvaW50c0luUGxvdEFyZWEgPSAwO1xuICAvL3RoaXMubWF4V2lkdGhJblggPSAwO1xuICB0aGlzLmlkID0gaWQ7XG4gIHRoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuICAgIGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhU2VyaWVzXCIsIGRhdGFTZXJpZXNJbmRleDogaW5kZXhcbiAgfVxuICB0aGlzLmRhdGFQb2ludElkcyA9IFtdO1xuICB0aGlzLnBsb3RVbml0ID0gW107XG5cbiAgdGhpcy5heGlzWCA9IG51bGw7XG4gIHRoaXMuYXhpc1kgPSBudWxsO1xuXG4gIGlmICh0aGlzLmZpbGxPcGFjaXR5ID09PSBudWxsKSB7XG4gICAgaWYgKHRoaXMudHlwZS5tYXRjaCgvYXJlYS9pKSlcbiAgICAgIHRoaXMuZmlsbE9wYWNpdHkgPSAuNztcbiAgICBlbHNlXG4gICAgICB0aGlzLmZpbGxPcGFjaXR5ID0gMTtcbiAgfVxuXG5cbiAgdGhpcy5heGlzUGxhY2VtZW50ID0gdGhpcy5nZXREZWZhdWx0QXhpc1BsYWNlbWVudCgpO1xuXG4gIGlmICh0eXBlb2YgKHRoaXMuX29wdGlvbnMuaW5kZXhMYWJlbEZvbnRTaXplKSA9PT0gXCJ1bmRlZmluZWRcIikge1xuXG4gICAgdGhpcy5pbmRleExhYmVsRm9udFNpemUgPSB0aGlzLmNoYXJ0LmdldEF1dG9Gb250U2l6ZSh0aGlzLmluZGV4TGFiZWxGb250U2l6ZSk7XG4gIH1cbn1cblxuZXh0ZW5kKERhdGFTZXJpZXMsIENhbnZhc0pTT2JqZWN0KTtcblxuLy9TdGF0aWMgTWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgYXhpc1BsYWNlbWVudCBmb3IgYSBnaXZlbiBDaGFydFR5cGUuIFJldHVybnMgb25lIG9mIFwibm9ybWFsXCIsIFwieHlTd2FwcGVkXCIsIFwibm9uZVwiXG5EYXRhU2VyaWVzLnByb3RvdHlwZS5nZXREZWZhdWx0QXhpc1BsYWNlbWVudCA9IGZ1bmN0aW9uICgpIHtcblxuICAvL2lmICghdGhpcy52aXNpYmxlKVxuICAvL1x0cmV0dXJuIFwibm9uZVwiO1xuXG4gIC8vdHlwZSA9IHRoaXMudHlwZS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgdHlwZSA9IHRoaXMudHlwZTtcblxuICBpZiAodHlwZSA9PT0gXCJjb2x1bW5cIiB8fCB0eXBlID09PSBcImxpbmVcIiB8fCB0eXBlID09PSBcInN0ZXBMaW5lXCIgfHwgdHlwZSA9PT0gXCJzcGxpbmVcIiB8fCB0eXBlID09PSBcImFyZWFcIiB8fCB0eXBlID09PSBcInN0ZXBBcmVhXCIgfHwgdHlwZSA9PT0gXCJzcGxpbmVBcmVhXCIgfHwgdHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uXCIgfHwgdHlwZSA9PT0gXCJzdGFja2VkTGluZVwiIHx8IHR5cGUgPT09IFwiYnViYmxlXCIgfHwgdHlwZSA9PT0gXCJzY2F0dGVyXCJcbiAgICB8fCB0eXBlID09PSBcInN0YWNrZWRBcmVhXCIgfHwgdHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uMTAwXCIgfHwgdHlwZSA9PT0gXCJzdGFja2VkTGluZTEwMFwiIHx8IHR5cGUgPT09IFwic3RhY2tlZEFyZWExMDBcIlxuICAgIHx8IHR5cGUgPT09IFwiY2FuZGxlc3RpY2tcIiB8fCB0eXBlID09PSBcIm9obGNcIiB8fCB0eXBlID09PSBcInJhbmdlQ29sdW1uXCIgfHwgdHlwZSA9PT0gXCJyYW5nZUFyZWFcIiB8fCB0eXBlID09PSBcInJhbmdlU3BsaW5lQXJlYVwiKSB7XG4gICAgcmV0dXJuIFwibm9ybWFsXCI7XG4gIH1cbiAgZWxzZSBpZiAodHlwZSA9PT0gXCJiYXJcIiB8fCB0eXBlID09PSBcInN0YWNrZWRCYXJcIiB8fCB0eXBlID09PSBcInN0YWNrZWRCYXIxMDBcIiB8fCB0eXBlID09PSBcInJhbmdlQmFyXCIpIHtcblxuICAgIHJldHVybiBcInh5U3dhcHBlZFwiO1xuICB9XG4gIGVsc2UgaWYgKHR5cGUgPT09IFwicGllXCIgfHwgdHlwZSA9PT0gXCJkb3VnaG51dFwiIHx8IHR5cGUgPT09IFwiZnVubmVsXCIpIHtcbiAgICByZXR1cm4gXCJub25lXCI7XG4gIH0gZWxzZSB7XG4gICAgd2luZG93LmNvbnNvbGUubG9nKFwiVW5rbm93biBDaGFydCBUeXBlOiBcIiArIHR5cGUpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbkRhdGFTZXJpZXMuZ2V0RGVmYXVsdExlZ2VuZE1hcmtlciA9IGZ1bmN0aW9uICh0eXBlKSB7XG5cbiAgLy90eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmICh0eXBlID09PSBcImNvbHVtblwiIHx8IHR5cGUgPT09IFwic3RhY2tlZENvbHVtblwiIHx8IHR5cGUgPT09IFwic3RhY2tlZExpbmVcIiB8fCB0eXBlID09PSBcImJhclwiIHx8IHR5cGUgPT09IFwic3RhY2tlZEJhclwiIHx8IHR5cGUgPT09IFwic3RhY2tlZEJhcjEwMFwiXG4gICAgfHwgdHlwZSA9PT0gXCJidWJibGVcIiB8fCB0eXBlID09PSBcInNjYXR0ZXJcIlxuICAgIHx8IHR5cGUgPT09IFwic3RhY2tlZENvbHVtbjEwMFwiIHx8IHR5cGUgPT09IFwic3RhY2tlZExpbmUxMDBcIiB8fCB0eXBlID09PSBcInN0ZXBBcmVhXCJcbiAgICB8fCB0eXBlID09PSBcImNhbmRsZXN0aWNrXCIgfHwgdHlwZSA9PT0gXCJvaGxjXCIgfHwgdHlwZSA9PT0gXCJyYW5nZUNvbHVtblwiIHx8IHR5cGUgPT09IFwicmFuZ2VCYXJcIiB8fCB0eXBlID09PSBcInJhbmdlQXJlYVwiIHx8IHR5cGUgPT09IFwicmFuZ2VTcGxpbmVBcmVhXCIpIHtcbiAgICByZXR1cm4gXCJzcXVhcmVcIjtcbiAgfVxuICBlbHNlIGlmICh0eXBlID09PSBcImxpbmVcIiB8fCB0eXBlID09PSBcInN0ZXBMaW5lXCIgfHwgdHlwZSA9PT0gXCJzcGxpbmVcIiB8fCB0eXBlID09PSBcInBpZVwiIHx8IHR5cGUgPT09IFwiZG91Z2hudXRcIiB8fCB0eXBlID09PSBcImZ1bm5lbFwiKSB7XG4gICAgcmV0dXJuIFwiY2lyY2xlXCI7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJhcmVhXCIgfHwgdHlwZSA9PT0gXCJzcGxpbmVBcmVhXCIgfHwgdHlwZSA9PT0gXCJzdGFja2VkQXJlYVwiIHx8IHR5cGUgPT09IFwic3RhY2tlZEFyZWExMDBcIikge1xuICAgIHJldHVybiBcInRyaWFuZ2xlXCJcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cuY29uc29sZS5sb2coXCJVbmtub3duIENoYXJ0IFR5cGU6IFwiICsgdHlwZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy9GaW5kcyBkYXRhUG9pbnQgd2l0aCB0aGUgZ2l2ZW4geCB2YWx1ZS4gSWYgZmluZENsb3Nlc3QgaXMgc2V0LCBmaW5kcyBkYXRhUG9pbnQgd2l0aCBjbG9zZXN0IHggdmFsdWUuXG4vL1JldHVybnMgc2VhcmNoUmVzdWx0IG9iamVjdCBpZiBmb3VuZCwgZWxzZSByZXR1cm5zIG51bGxcbkRhdGFTZXJpZXMucHJvdG90eXBlLmdldERhdGFQb2ludEF0WCA9IGZ1bmN0aW9uICh4LCBmaW5kQ2xvc2VzdCkge1xuXG4gIGlmICghdGhpcy5kYXRhUG9pbnRzIHx8IHRoaXMuZGF0YVBvaW50cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIHZhciBzZWFyY2hSZXN1bHQgPSB7XG4gICAgZGF0YVBvaW50OiBudWxsLCBkaXN0YW5jZTogSW5maW5pdHksIGluZGV4OiBOYU5cbiAgfTtcbiAgdmFyIGRhdGFQb2ludCA9IG51bGw7XG5cbiAgdmFyIGogPSAwO1xuICB2YXIgaSA9IDA7XG4gIHZhciBkaXJlY3Rpb24gPSAxOyAvLyArMSBmb3IgZm93YXJkIGFuZCAtMSBmb3IgYmFja3dhcmQuXG5cbiAgdmFyIG1pbmltdW1YRGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgdmFyIGZvcndhcmRNaXNzQ291bnQgPSAwLCBiYWNrd2FyZE1pc3NDb3VudCA9IDA7XG4gIHZhciBtYXhNaXNzQ291bnQgPSAxMDAwO1xuICB2YXIgc2VhcmNoU3RhcnRJbmRleCA9IDA7XG5cbiAgaWYgKHRoaXMuY2hhcnQucGxvdEluZm8uYXhpc1BsYWNlbWVudCAhPT0gXCJub25lXCIpIHtcblxuICAgIC8vdmFyIHhSYW5nZSA9ICh0aGlzLmRhdGFQb2ludHNbdGhpcy5kYXRhUG9pbnRzLmxlbmd0aCAtIDFdLnggLSB0aGlzLmRhdGFQb2ludHNbMF0ueCk7XG5cbiAgICAvL2lmICh4UmFuZ2UgPiAwKVxuICAgIC8vXHRzZWFyY2hTdGFydEluZGV4ID0gKCh0aGlzLmRhdGFQb2ludHMubGVuZ3RoIC0gMSkgLyB4UmFuZ2UgKiAoeCAtIHRoaXMuZGF0YVBvaW50c1swXS54KSkgPj4gMDtcbiAgICAvL2Vsc2VcbiAgICAvL1x0c2VhcmNoU3RhcnRJbmRleCA9IDA7XG5cbiAgICB2YXIgeFJhbmdlID0gKHRoaXMuZGF0YVBvaW50c1t0aGlzLmRhdGFQb2ludHMubGVuZ3RoIC0gMV0ueCAtIHRoaXMuZGF0YVBvaW50c1swXS54KTtcblxuICAgIGlmICh4UmFuZ2UgPiAwKVxuICAgICAgc2VhcmNoU3RhcnRJbmRleCA9IE1hdGgubWluKE1hdGgubWF4KCgodGhpcy5kYXRhUG9pbnRzLmxlbmd0aCAtIDEpIC8geFJhbmdlICogKHggLSB0aGlzLmRhdGFQb2ludHNbMF0ueCkpID4+IDAsIDApLCB0aGlzLmRhdGFQb2ludHMubGVuZ3RoKTtcbiAgICBlbHNlXG4gICAgICBzZWFyY2hTdGFydEluZGV4ID0gMDtcblxuICAgIC8vc2VhcmNoU3RhcnRJbmRleCA9ICgodGhpcy5kYXRhUG9pbnRzW3RoaXMuZGF0YVBvaW50cy5sZW5ndGggLSAxXS54IC0gdGhpcy5kYXRhUG9pbnRzWzBdLngpIC8gdGhpcy5kYXRhUG9pbnRzLmxlbmd0aCAqICh4IC0gdGhpcy5kYXRhUG9pbnRzWzBdLngpKSA+PiAwO1xuICB9XG5cbiAgd2hpbGUgKHRydWUpIHtcblxuICAgIGkgPSAoZGlyZWN0aW9uID4gMCkgPyBzZWFyY2hTdGFydEluZGV4ICsgaiA6IHNlYXJjaFN0YXJ0SW5kZXggLSBqO1xuXG4gICAgaWYgKGkgPj0gMCAmJiBpIDwgdGhpcy5kYXRhUG9pbnRzLmxlbmd0aCkge1xuXG4gICAgICBkYXRhUG9pbnQgPSB0aGlzLmRhdGFQb2ludHNbaV07XG5cbiAgICAgIHZhciBkaXN0YW5jZSA9IE1hdGguYWJzKGRhdGFQb2ludC54IC0geCk7XG5cbiAgICAgIGlmIChkaXN0YW5jZSA8IHNlYXJjaFJlc3VsdC5kaXN0YW5jZSkge1xuICAgICAgICBzZWFyY2hSZXN1bHQuZGF0YVBvaW50ID0gZGF0YVBvaW50O1xuICAgICAgICBzZWFyY2hSZXN1bHQuZGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgc2VhcmNoUmVzdWx0LmluZGV4ID0gaTtcbiAgICAgIH1cblxuICAgICAgdmFyIHhEaXN0YW5jZSA9IE1hdGguYWJzKGRhdGFQb2ludC54IC0geCk7XG4gICAgICBpZiAoeERpc3RhbmNlIDw9IG1pbmltdW1YRGlzdGFuY2UpXG4gICAgICAgIG1pbmltdW1YRGlzdGFuY2UgPSB4RGlzdGFuY2U7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA+IDApXG4gICAgICAgICAgZm9yd2FyZE1pc3NDb3VudCsrO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgYmFja3dhcmRNaXNzQ291bnQrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcndhcmRNaXNzQ291bnQgPiBtYXhNaXNzQ291bnQgJiYgYmFja3dhcmRNaXNzQ291bnQgPiBtYXhNaXNzQ291bnQpXG4gICAgICAgIGJyZWFrO1xuXG5cbiAgICB9IGVsc2UgaWYgKHNlYXJjaFN0YXJ0SW5kZXggLSBqIDwgMCAmJiBzZWFyY2hTdGFydEluZGV4ICsgaiA+PSB0aGlzLmRhdGFQb2ludHMubGVuZ3RoKVxuICAgICAgYnJlYWs7XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSAtMSkge1xuICAgICAgaisrO1xuICAgICAgZGlyZWN0aW9uID0gMTtcbiAgICB9IGVsc2VcbiAgICAgIGRpcmVjdGlvbiA9IC0xO1xuICB9XG5cblxuICBpZiAoIWZpbmRDbG9zZXN0ICYmIHNlYXJjaFJlc3VsdC5kYXRhUG9pbnQueCA9PT0geClcbiAgICByZXR1cm4gc2VhcmNoUmVzdWx0O1xuICBlbHNlIGlmIChmaW5kQ2xvc2VzdCAmJiBzZWFyY2hSZXN1bHQuZGF0YVBvaW50ICE9PSBudWxsKVxuICAgIHJldHVybiBzZWFyY2hSZXN1bHQ7XG4gIGVsc2VcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuLy8geCAmIHkgc2hvdWxkIGJlIGluIHBpeGVscy4gQ2FuIGJlIHVzZWQgb25seSBhZnRlciByZW5kZXJpbmcgdGhlIGNoYXJ0LlxuRGF0YVNlcmllcy5wcm90b3R5cGUuZ2V0RGF0YVBvaW50QXRYWSA9IGZ1bmN0aW9uICh4LCB5LCBnZXRDbG9zZXN0KSB7XG5cbiAgaWYgKCF0aGlzLmRhdGFQb2ludHMgfHwgdGhpcy5kYXRhUG9pbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgZ2V0Q2xvc2VzdCA9IGdldENsb3Nlc3QgfHwgZmFsc2U7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBqID0gMCwgaSA9IDA7XG4gIHZhciBkaXJlY3Rpb24gPSAxOyAvLyArMSBmb3IgZm93YXJkIGFuZCAtMSBmb3IgYmFja3dhcmQuXG4gIHZhciBmb3VuZERhdGFQb2ludCA9IGZhbHNlO1xuICB2YXIgbWluaW11bVhEaXN0YW5jZSA9IEluZmluaXR5O1xuICB2YXIgZm9yd2FyZE1pc3NDb3VudCA9IDAsIGJhY2t3YXJkTWlzc0NvdW50ID0gMDtcbiAgdmFyIG1heE1pc3NDb3VudCA9IDEwMDA7XG4gIHZhciBzZWFyY2hTdGFydEluZGV4ID0gMDtcblxuICBpZiAodGhpcy5jaGFydC5wbG90SW5mby5heGlzUGxhY2VtZW50ICE9PSBcIm5vbmVcIikge1xuICAgIHZhciB4dmFsID0gdGhpcy5jaGFydC5heGlzWC5nZXRYVmFsdWVBdCh7IHg6IHgsIHk6IHkgfSk7XG5cbiAgICB2YXIgeFJhbmdlID0gKHRoaXMuZGF0YVBvaW50c1t0aGlzLmRhdGFQb2ludHMubGVuZ3RoIC0gMV0ueCAtIHRoaXMuZGF0YVBvaW50c1swXS54KTtcblxuICAgIGlmICh4UmFuZ2UgPiAwKVxuICAgICAgc2VhcmNoU3RhcnRJbmRleCA9IE1hdGgubWluKE1hdGgubWF4KCgodGhpcy5kYXRhUG9pbnRzLmxlbmd0aCAtIDEpIC8geFJhbmdlICogKHh2YWwgLSB0aGlzLmRhdGFQb2ludHNbMF0ueCkpID4+IDAsIDApLCB0aGlzLmRhdGFQb2ludHMubGVuZ3RoKTtcbiAgICBlbHNlXG4gICAgICBzZWFyY2hTdGFydEluZGV4ID0gMDtcblxuICAgIC8vdmFyIHhSYW5nZSA9ICh0aGlzLmF4aXNYLl9hYnNvbHV0ZU1heGltdW0gLSB0aGlzLmF4aXNYLl9hYnNvbHV0ZU1pbmltdW0pO1xuXG4gICAgLy9pZiAoeFJhbmdlID4gMClcbiAgICAvL1x0c2VhcmNoU3RhcnRJbmRleCA9IE1hdGgubWluKE1hdGgubWF4KCgodGhpcy5kYXRhUG9pbnRzLmxlbmd0aCAtIDEpIC8geFJhbmdlICogKHh2YWwgLSB0aGlzLmF4aXNYLl9hYnNvbHV0ZU1pbmltdW0pKSA+PiAwLCAwKSwgdGhpcy5kYXRhUG9pbnRzLmxlbmd0aCk7XG4gICAgLy9lbHNlXG4gICAgLy9cdHNlYXJjaFN0YXJ0SW5kZXggPSAwO1xuICB9XG5cbiAgd2hpbGUgKHRydWUpIHtcblxuICAgIC8vaSA9IHNlYXJjaFN0YXJ0SW5kZXggKyAoaiAqIGRpcmVjdGlvbik7XG4gICAgaSA9IChkaXJlY3Rpb24gPiAwKSA/IHNlYXJjaFN0YXJ0SW5kZXggKyBqIDogc2VhcmNoU3RhcnRJbmRleCAtIGo7XG5cbiAgICBpZiAoaSA+PSAwICYmIGkgPCB0aGlzLmRhdGFQb2ludHMubGVuZ3RoKSB7XG5cbiAgICAgIHZhciBpZCA9IHRoaXMuZGF0YVBvaW50SWRzW2ldO1xuICAgICAgdmFyIHZpc3VhbEluZm8gPSB0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2lkXTtcbiAgICAgIHZhciBkYXRhUG9pbnQgPSB0aGlzLmRhdGFQb2ludHNbaV07XG4gICAgICB2YXIgZGlzdGFuY2UgPSBudWxsO1xuXG4gICAgICBpZiAodmlzdWFsSW5mbykge1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG5cbiAgICAgICAgICBjYXNlIFwiY29sdW1uXCI6XG4gICAgICAgICAgY2FzZSBcInN0YWNrZWRDb2x1bW5cIjpcbiAgICAgICAgICBjYXNlIFwic3RhY2tlZENvbHVtbjEwMFwiOlxuICAgICAgICAgIGNhc2UgXCJiYXJcIjpcbiAgICAgICAgICBjYXNlIFwic3RhY2tlZEJhclwiOlxuICAgICAgICAgIGNhc2UgXCJzdGFja2VkQmFyMTAwXCI6XG4gICAgICAgICAgY2FzZSBcInJhbmdlQ29sdW1uXCI6XG4gICAgICAgICAgY2FzZSBcInJhbmdlQmFyXCI6XG5cbiAgICAgICAgICAgIGlmICh4ID49IHZpc3VhbEluZm8ueDEgJiYgeCA8PSB2aXN1YWxJbmZvLngyICYmIHkgPj0gdmlzdWFsSW5mby55MSAmJiB5IDw9IHZpc3VhbEluZm8ueTIpIHtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnQ6IGRhdGFQb2ludCxcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnRJbmRleDogaSxcbiAgICAgICAgICAgICAgICBkYXRhU2VyaWVzOiB0aGlzLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBNYXRoLm1pbihNYXRoLmFicyh2aXN1YWxJbmZvLngxIC0geCksIE1hdGguYWJzKHZpc3VhbEluZm8ueDIgLSB4KSwgTWF0aC5hYnModmlzdWFsSW5mby55MSAtIHkpLCBNYXRoLmFicyh2aXN1YWxJbmZvLnkyIC0geSkpXG4gICAgICAgICAgICAgICAgLy9kaXN0YW5jZTowXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGZvdW5kRGF0YVBvaW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcImxpbmVcIjpcbiAgICAgICAgICBjYXNlIFwic3RlcExpbmVcIjpcbiAgICAgICAgICBjYXNlIFwic3BsaW5lXCI6XG4gICAgICAgICAgY2FzZSBcImFyZWFcIjpcbiAgICAgICAgICBjYXNlIFwic3RlcEFyZWFcIjpcbiAgICAgICAgICBjYXNlIFwic3RhY2tlZEFyZWFcIjpcbiAgICAgICAgICBjYXNlIFwic3RhY2tlZEFyZWExMDBcIjpcbiAgICAgICAgICBjYXNlIFwic3BsaW5lQXJlYVwiOlxuICAgICAgICAgIGNhc2UgXCJzY2F0dGVyXCI6XG4gICAgICAgICAgICB2YXIgbWFya2VyU2l6ZSA9IGdldFByb3BlcnR5KFwibWFya2VyU2l6ZVwiLCBkYXRhUG9pbnQsIHRoaXMpIHx8IDQ7XG4gICAgICAgICAgICB2YXIgc25hcERpc3RhbmNlID0gZ2V0Q2xvc2VzdCA/IDIwIDogbWFya2VyU2l6ZTtcblxuICAgICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLnNxcnQoTWF0aC5wb3codmlzdWFsSW5mby54MSAtIHgsIDIpICsgTWF0aC5wb3codmlzdWFsSW5mby55MSAtIHksIDIpKTtcbiAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8PSBzbmFwRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnQ6IGRhdGFQb2ludCxcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnRJbmRleDogaSxcbiAgICAgICAgICAgICAgICBkYXRhU2VyaWVzOiB0aGlzLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBkaXN0YW5jZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHhEaXN0YW5jZSA9IE1hdGguYWJzKHZpc3VhbEluZm8ueDEgLSB4KTtcbiAgICAgICAgICAgIGlmICh4RGlzdGFuY2UgPD0gbWluaW11bVhEaXN0YW5jZSlcbiAgICAgICAgICAgICAgbWluaW11bVhEaXN0YW5jZSA9IHhEaXN0YW5jZTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID4gMClcbiAgICAgICAgICAgICAgICBmb3J3YXJkTWlzc0NvdW50Kys7XG4gICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBiYWNrd2FyZE1pc3NDb3VudCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPD0gbWFya2VyU2l6ZSAvIDIpIHtcbiAgICAgICAgICAgICAgZm91bmREYXRhUG9pbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJyYW5nZUFyZWFcIjpcbiAgICAgICAgICBjYXNlIFwicmFuZ2VTcGxpbmVBcmVhXCI6XG5cbiAgICAgICAgICAgIHZhciBtYXJrZXJTaXplID0gZ2V0UHJvcGVydHkoXCJtYXJrZXJTaXplXCIsIGRhdGFQb2ludCwgdGhpcykgfHwgNDtcbiAgICAgICAgICAgIHZhciBzbmFwRGlzdGFuY2UgPSBnZXRDbG9zZXN0ID8gMjAgOiBtYXJrZXJTaXplO1xuXG4gICAgICAgICAgICBkaXN0YW5jZSA9IE1hdGgubWluKE1hdGguc3FydChNYXRoLnBvdyh2aXN1YWxJbmZvLngxIC0geCwgMikgKyBNYXRoLnBvdyh2aXN1YWxJbmZvLnkxIC0geSwgMikpLCBNYXRoLnNxcnQoTWF0aC5wb3codmlzdWFsSW5mby54MSAtIHgsIDIpICsgTWF0aC5wb3codmlzdWFsSW5mby55MiAtIHksIDIpKSk7XG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPD0gc25hcERpc3RhbmNlKSB7XG4gICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGF0YVBvaW50OiBkYXRhUG9pbnQsXG4gICAgICAgICAgICAgICAgZGF0YVBvaW50SW5kZXg6IGksXG4gICAgICAgICAgICAgICAgZGF0YVNlcmllczogdGhpcyxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTogZGlzdGFuY2VcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB4RGlzdGFuY2UgPSBNYXRoLmFicyh2aXN1YWxJbmZvLngxIC0geCk7XG4gICAgICAgICAgICBpZiAoeERpc3RhbmNlIDw9IG1pbmltdW1YRGlzdGFuY2UpXG4gICAgICAgICAgICAgIG1pbmltdW1YRGlzdGFuY2UgPSB4RGlzdGFuY2U7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA+IDApXG4gICAgICAgICAgICAgICAgZm9yd2FyZE1pc3NDb3VudCsrO1xuICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYmFja3dhcmRNaXNzQ291bnQrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDw9IG1hcmtlclNpemUgLyAyKSB7XG4gICAgICAgICAgICAgIGZvdW5kRGF0YVBvaW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiYnViYmxlXCI6XG4gICAgICAgICAgICB2YXIgbWFya2VyU2l6ZSA9IHZpc3VhbEluZm8uc2l6ZTtcbiAgICAgICAgICAgIGRpc3RhbmNlID0gTWF0aC5zcXJ0KE1hdGgucG93KHZpc3VhbEluZm8ueDEgLSB4LCAyKSArIE1hdGgucG93KHZpc3VhbEluZm8ueTEgLSB5LCAyKSk7XG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPD0gbWFya2VyU2l6ZSAvIDIpIHtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnQ6IGRhdGFQb2ludCxcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnRJbmRleDogaSxcbiAgICAgICAgICAgICAgICBkYXRhU2VyaWVzOiB0aGlzLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBkaXN0YW5jZVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBmb3VuZERhdGFQb2ludCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJwaWVcIjpcbiAgICAgICAgICBjYXNlIFwiZG91Z2hudXRcIjpcbiAgICAgICAgICAgIHZhciBjZW50ZXIgPSB2aXN1YWxJbmZvLmNlbnRlcjtcbiAgICAgICAgICAgIHZhciBpbm5lclJhZGl1cyA9IHRoaXMudHlwZSA9PT0gXCJkb3VnaG51dFwiID8gdmlzdWFsSW5mby5wZXJjZW50SW5uZXJSYWRpdXMgKiB2aXN1YWxJbmZvLnJhZGl1cyA6IDA7XG5cbiAgICAgICAgICAgIGRpc3RhbmNlID0gTWF0aC5zcXJ0KE1hdGgucG93KGNlbnRlci54IC0geCwgMikgKyBNYXRoLnBvdyhjZW50ZXIueSAtIHksIDIpKTtcbiAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IHZpc3VhbEluZm8ucmFkaXVzICYmIGRpc3RhbmNlID4gaW5uZXJSYWRpdXMpIHtcblxuICAgICAgICAgICAgICB2YXIgZGVsdGFZID0geSAtIGNlbnRlci55O1xuICAgICAgICAgICAgICB2YXIgZGVsdGFYID0geCAtIGNlbnRlci54O1xuICAgICAgICAgICAgICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKGRlbHRhWSwgZGVsdGFYKTtcblxuICAgICAgICAgICAgICBpZiAoYW5nbGUgPCAwKVxuICAgICAgICAgICAgICAgIGFuZ2xlICs9IE1hdGguUEkgKiAyO1xuXG4gICAgICAgICAgICAgIGFuZ2xlID0gTnVtYmVyKCgoKGFuZ2xlIC8gTWF0aC5QSSAqIDE4MCAlIDM2MCkgKyAzNjApICUgMzYwKS50b0ZpeGVkKDEyKSk7XG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coYW5nbGUpO1xuXG5cbiAgICAgICAgICAgICAgdmFyIHN0YXJ0QW5nbGUgPSBOdW1iZXIoKCgodmlzdWFsSW5mby5zdGFydEFuZ2xlIC8gTWF0aC5QSSAqIDE4MCAlIDM2MCkgKyAzNjApICUgMzYwKS50b0ZpeGVkKDEyKSk7XG4gICAgICAgICAgICAgIHZhciBlbmRBbmdsZSA9IE51bWJlcigoKCh2aXN1YWxJbmZvLmVuZEFuZ2xlIC8gTWF0aC5QSSAqIDE4MCAlIDM2MCkgKyAzNjApICUgMzYwKS50b0ZpeGVkKDEyKSk7XG5cbiAgICAgICAgICAgICAgLy9TbyB0aGF0IGRhdGEgcG9pbnQgaXMgZGV0ZWN0ZWQgd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBkYXRhUG9pbnRcbiAgICAgICAgICAgICAgaWYgKGVuZEFuZ2xlID09PSAwICYmIHZpc3VhbEluZm8uZW5kQW5nbGUgPiAxKSB7XG4gICAgICAgICAgICAgICAgZW5kQW5nbGUgPSAzNjA7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoc3RhcnRBbmdsZSA+PSBlbmRBbmdsZSAmJiBkYXRhUG9pbnQueSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGVuZEFuZ2xlICs9IDM2MDtcblxuICAgICAgICAgICAgICAgIGlmIChhbmdsZSA8IHN0YXJ0QW5nbGUpXG4gICAgICAgICAgICAgICAgICBhbmdsZSArPSAzNjA7XG4gICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgIGlmIChhbmdsZSA+IHN0YXJ0QW5nbGUgJiYgYW5nbGUgPCBlbmRBbmdsZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBkYXRhUG9pbnQ6IGRhdGFQb2ludCxcbiAgICAgICAgICAgICAgICAgIGRhdGFQb2ludEluZGV4OiBpLFxuICAgICAgICAgICAgICAgICAgZGF0YVNlcmllczogdGhpcyxcbiAgICAgICAgICAgICAgICAgIGRpc3RhbmNlOiAwXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBmb3VuZERhdGFQb2ludCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJjYW5kbGVzdGlja1wiOlxuICAgICAgICAgICAgaWYgKCgoeCA+PSAodmlzdWFsSW5mby54MSAtIHZpc3VhbEluZm8uYm9yZGVyVGhpY2tuZXNzIC8gMikpICYmICh4IDw9ICh2aXN1YWxJbmZvLngyICsgdmlzdWFsSW5mby5ib3JkZXJUaGlja25lc3MgLyAyKSlcbiAgICAgICAgICAgICAgJiYgKHkgPj0gdmlzdWFsSW5mby55MiAtIHZpc3VhbEluZm8uYm9yZGVyVGhpY2tuZXNzIC8gMikgJiYgKHkgPD0gdmlzdWFsSW5mby55MyArIHZpc3VhbEluZm8uYm9yZGVyVGhpY2tuZXNzIC8gMikpXG4gICAgICAgICAgICAgIHx8IChNYXRoLmFicyh2aXN1YWxJbmZvLngyIC0geCArIHZpc3VhbEluZm8ueDEgLSB4KSA8IHZpc3VhbEluZm8uYm9yZGVyVGhpY2tuZXNzICYmICh5ID49IHZpc3VhbEluZm8ueTEgJiYgeSA8PSB2aXN1YWxJbmZvLnk0KSkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnQ6IGRhdGFQb2ludCxcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnRJbmRleDogaSxcbiAgICAgICAgICAgICAgICBkYXRhU2VyaWVzOiB0aGlzLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBNYXRoLm1pbihNYXRoLmFicyh2aXN1YWxJbmZvLngxIC0geCksIE1hdGguYWJzKHZpc3VhbEluZm8ueDIgLSB4KSwgTWF0aC5hYnModmlzdWFsSW5mby55MiAtIHkpLCBNYXRoLmFicyh2aXN1YWxJbmZvLnkzIC0geSkpXG4gICAgICAgICAgICAgICAgLy9kaXN0YW5jZTowXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGZvdW5kRGF0YVBvaW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIm9obGNcIjpcblxuICAgICAgICAgICAgaWYgKChNYXRoLmFicyh2aXN1YWxJbmZvLngyIC0geCArIHZpc3VhbEluZm8ueDEgLSB4KSA8IHZpc3VhbEluZm8uYm9yZGVyVGhpY2tuZXNzICYmICh5ID49IHZpc3VhbEluZm8ueTIgJiYgeSA8PSB2aXN1YWxJbmZvLnkzKSlcblxuICAgICAgICAgICAgICB8fCAoeCA+PSB2aXN1YWxJbmZvLngxICYmICh4IDw9ICh2aXN1YWxJbmZvLngyICsgdmlzdWFsSW5mby54MSkgLyAyKVxuICAgICAgICAgICAgICAgICYmICh5ID49IHZpc3VhbEluZm8ueTEgLSB2aXN1YWxJbmZvLmJvcmRlclRoaWNrbmVzcyAvIDIpICYmICh5IDw9IHZpc3VhbEluZm8ueTEgKyB2aXN1YWxJbmZvLmJvcmRlclRoaWNrbmVzcyAvIDIpKVxuXG4gICAgICAgICAgICAgIHx8ICgoeCA+PSAodmlzdWFsSW5mby54MSArIHZpc3VhbEluZm8ueDIpIC8gMikgJiYgKHggPD0gdmlzdWFsSW5mby54MilcbiAgICAgICAgICAgICAgICAmJiAoeSA+PSB2aXN1YWxJbmZvLnk0IC0gdmlzdWFsSW5mby5ib3JkZXJUaGlja25lc3MgLyAyKSAmJiAoeSA8PSB2aXN1YWxJbmZvLnk0ICsgdmlzdWFsSW5mby5ib3JkZXJUaGlja25lc3MgLyAyKSkpIHtcblxuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGRhdGFQb2ludDogZGF0YVBvaW50LFxuICAgICAgICAgICAgICAgIGRhdGFQb2ludEluZGV4OiBpLFxuICAgICAgICAgICAgICAgIGRhdGFTZXJpZXM6IHRoaXMsXG4gICAgICAgICAgICAgICAgZGlzdGFuY2U6IE1hdGgubWluKE1hdGguYWJzKHZpc3VhbEluZm8ueDEgLSB4KSwgTWF0aC5hYnModmlzdWFsSW5mby54MiAtIHgpLCBNYXRoLmFicyh2aXN1YWxJbmZvLnkyIC0geSksIE1hdGguYWJzKHZpc3VhbEluZm8ueTMgLSB5KSlcbiAgICAgICAgICAgICAgICAvL2Rpc3RhbmNlOjBcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgZm91bmREYXRhUG9pbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3VuZERhdGFQb2ludCB8fCAoZm9yd2FyZE1pc3NDb3VudCA+IG1heE1pc3NDb3VudCAmJiBiYWNrd2FyZE1pc3NDb3VudCA+IG1heE1pc3NDb3VudCkpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHNlYXJjaFN0YXJ0SW5kZXggLSBqIDwgMCAmJiBzZWFyY2hTdGFydEluZGV4ICsgaiA+PSB0aGlzLmRhdGFQb2ludHMubGVuZ3RoKVxuICAgICAgYnJlYWs7XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSAtMSkge1xuICAgICAgaisrO1xuICAgICAgZGlyZWN0aW9uID0gMTtcbiAgICB9IGVsc2VcbiAgICAgIGRpcmVjdGlvbiA9IC0xO1xuXG4gIH1cblxuXG5cbiAgdmFyIGNsb3Nlc3RSZXN1bHQgPSBudWxsO1xuXG4gIGZvciAodmFyIG0gPSAwOyBtIDwgcmVzdWx0cy5sZW5ndGg7IG0rKykge1xuICAgIGlmICghY2xvc2VzdFJlc3VsdCkge1xuICAgICAgY2xvc2VzdFJlc3VsdCA9IHJlc3VsdHNbbV07XG4gICAgfSBlbHNlIGlmIChyZXN1bHRzW21dLmRpc3RhbmNlIDw9IGNsb3Nlc3RSZXN1bHQuZGlzdGFuY2UpIHtcbiAgICAgIGNsb3Nlc3RSZXN1bHQgPSByZXN1bHRzW21dO1xuICAgIH1cbiAgfVxuXG4gIC8vaWYgKHdpbmRvdy5jb25zb2xlKVxuICAvL1x0d2luZG93LmNvbnNvbGUubG9nKFwiZm9yd2FyZE1pc3NDb3VudDogXCIgKyBmb3J3YXJkTWlzc0NvdW50ICsgXCI7IGJhY2t3YXJkTWlzc0NvdW50OiBcIiArIGJhY2t3YXJkTWlzc0NvdW50ICsgXCI7IGdldENsb3Nlc3Q6IFwiICsgZ2V0Q2xvc2VzdCk7XG5cbiAgLy9pZiAod2luZG93LmNvbnNvbGUgJiYgY2xvc2VzdFJlc3VsdClcbiAgLy8gICAgd2luZG93LmNvbnNvbGUubG9nKGogKyBcIjogZGlzdGFuY2UgPSBcIiArIGNsb3Nlc3RSZXN1bHQuZGlzdGFuY2UpO1xuXG4gIHJldHVybiBjbG9zZXN0UmVzdWx0O1xufVxuXG5EYXRhU2VyaWVzLnByb3RvdHlwZS5nZXRNYXJrZXJQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKGluZGV4LCB4LCB5LCBjdHgpIHtcbiAgdmFyIGRhdGFQb2ludHMgPSB0aGlzLmRhdGFQb2ludHM7XG4gIHZhciBkYXRhU2VyaWVzID0gdGhpcztcblxuICB2YXIgbWFya2VyQ29sb3IgPSBkYXRhUG9pbnRzW2luZGV4XS5tYXJrZXJDb2xvciA/IGRhdGFQb2ludHNbaW5kZXhdLm1hcmtlckNvbG9yIDogZGF0YVNlcmllcy5tYXJrZXJDb2xvciA/IGRhdGFTZXJpZXMubWFya2VyQ29sb3IgOiBkYXRhUG9pbnRzW2luZGV4XS5jb2xvciA/IGRhdGFQb2ludHNbaW5kZXhdLmNvbG9yIDogZGF0YVNlcmllcy5jb2xvciA/IGRhdGFTZXJpZXMuY29sb3IgOiBkYXRhU2VyaWVzLl9jb2xvclNldFtpbmRleCAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG4gIHZhciBtYXJrZXJCb3JkZXJDb2xvciA9IGRhdGFQb2ludHNbaW5kZXhdLm1hcmtlckJvcmRlckNvbG9yID8gZGF0YVBvaW50c1tpbmRleF0ubWFya2VyQm9yZGVyQ29sb3IgOiBkYXRhU2VyaWVzLm1hcmtlckJvcmRlckNvbG9yID8gZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJDb2xvciA6IG51bGw7XG4gIHZhciBtYXJrZXJCb3JkZXJUaGlja25lc3MgPSBkYXRhUG9pbnRzW2luZGV4XS5tYXJrZXJCb3JkZXJUaGlja25lc3MgPyBkYXRhUG9pbnRzW2luZGV4XS5tYXJrZXJCb3JkZXJUaGlja25lc3MgOiBkYXRhU2VyaWVzLm1hcmtlckJvcmRlclRoaWNrbmVzcyA/IGRhdGFTZXJpZXMubWFya2VyQm9yZGVyVGhpY2tuZXNzIDogbnVsbDtcbiAgdmFyIG1hcmtlclR5cGUgPSBkYXRhUG9pbnRzW2luZGV4XS5tYXJrZXJUeXBlID8gZGF0YVBvaW50c1tpbmRleF0ubWFya2VyVHlwZSA6IGRhdGFTZXJpZXMubWFya2VyVHlwZTtcbiAgdmFyIG1hcmtlclNpemUgPSBkYXRhUG9pbnRzW2luZGV4XS5tYXJrZXJTaXplID8gZGF0YVBvaW50c1tpbmRleF0ubWFya2VyU2l6ZSA6IGRhdGFTZXJpZXMubWFya2VyU2l6ZTtcblxuXG4gIHJldHVybiB7XG4gICAgeDogeCwgeTogeSwgY3R4OiBjdHgsXG4gICAgdHlwZTogbWFya2VyVHlwZSxcbiAgICBzaXplOiBtYXJrZXJTaXplLFxuICAgIGNvbG9yOiBtYXJrZXJDb2xvcixcbiAgICBib3JkZXJDb2xvcjogbWFya2VyQm9yZGVyQ29sb3IsXG4gICAgYm9yZGVyVGhpY2tuZXNzOiBtYXJrZXJCb3JkZXJUaGlja25lc3NcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEYXRhU2VyaWVzO1xuIiwiXG5pbXBvcnQge2NyZWF0ZUNhbnZhcywgZ2V0TW91c2VDb29yZGluYXRlcywgaXNDYW52YXNTdXBwb3J0ZWR9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5mdW5jdGlvbiBFdmVudE1hbmFnZXIoY2hhcnQpIHtcbiAgdGhpcy5jaGFydCA9IGNoYXJ0O1xuICB0aGlzLmxhc3RPYmplY3RJZCA9IDA7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIHRoaXMub2JqZWN0TWFwID0gW107XG4gIHRoaXMucmVjdGFuZ3VsYXJSZWdpb25FdmVudFN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgdGhpcy5wcmV2aW91c0RhdGFQb2ludEV2ZW50T2JqZWN0ID0gbnVsbDtcbiAgLy90aGlzLnByZXZpb3VzRGF0YVNlcmllc0V2ZW50T2JqZWN0ID0gbnVsbDtcblxuICB0aGlzLmdob3N0Q2FudmFzID0gY3JlYXRlQ2FudmFzKHRoaXMuY2hhcnQud2lkdGgsIHRoaXMuY2hhcnQuaGVpZ2h0KTtcbiAgLy90aGlzLmdob3N0Q2FudmFzLndpZHRoID0gdGhpcy5jaGFydC53aWR0aDtcbiAgLy90aGlzLmdob3N0Q2FudmFzLmhlaWdodCA9IHRoaXMuY2hhcnQuaGVpZ2h0O1xuXG4gIHRoaXMuZ2hvc3RDdHggPSB0aGlzLmdob3N0Q2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblxuICB2YXIgZXZlbnRIYW5kbGVyID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgX3RoaXMubW91c2VFdmVudEhhbmRsZXIuY2FsbChfdGhpcywgZXYpO1xuICB9O1xuXG4gIHRoaXMubW91c2VvdmVyZWRPYmplY3RNYXBzID0gW107XG4gIC8vdGhpcy5jaGFydC5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCBldmVudEhhbmRsZXIpO1xuICAvL3RoaXMuY2hhcnQuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgZXZlbnRIYW5kbGVyKTtcbiAgLy90aGlzLmNoYXJ0LmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgZXZlbnRIYW5kbGVyKTtcbiAgLy90aGlzLmNoYXJ0LmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZXZlbnRIYW5kbGVyKTtcbn1cblxuRXZlbnRNYW5hZ2VyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5sYXN0T2JqZWN0SWQgPSAwO1xuICB0aGlzLm9iamVjdE1hcCA9IFtdO1xuICB0aGlzLnJlY3Rhbmd1bGFyUmVnaW9uRXZlbnRTdWJzY3JpcHRpb25zID0gW107XG4gIHRoaXMucHJldmlvdXNEYXRhUG9pbnRFdmVudE9iamVjdCA9IG51bGw7XG5cbiAgdGhpcy5ldmVudE9iamVjdHMgPSBbXTtcbiAgLy90aGlzLmdob3N0Q2FudmFzLndpZHRoID0gdGhpcy5jaGFydC53aWR0aDtcbiAgLy90aGlzLmdob3N0Q2FudmFzLmhlaWdodCA9IHRoaXMuY2hhcnQuaGVpZ2h0O1xuXG4gIGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuICAgIHRoaXMuZ2hvc3RDdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2hhcnQud2lkdGgsIHRoaXMuY2hhcnQuaGVpZ2h0KTtcbiAgICB0aGlzLmdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuICB9XG59XG5cbkV2ZW50TWFuYWdlci5wcm90b3R5cGUuZ2V0TmV3T2JqZWN0VHJhY2tpbmdJZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICsrdGhpcy5sYXN0T2JqZWN0SWQ7XG59XG5cbkV2ZW50TWFuYWdlci5wcm90b3R5cGUubW91c2VFdmVudEhhbmRsZXIgPSBmdW5jdGlvbiAoZXYpIHtcblxuICBpZiAoZXYudHlwZSAhPT0gXCJtb3VzZW1vdmVcIiAmJiBldi50eXBlICE9PSBcImNsaWNrXCIpXG4gICAgcmV0dXJuO1xuXG4gIHZhciBldmVudE9iamVjdE1hcHMgPSBbXTtcbiAgdmFyIHh5ID0gZ2V0TW91c2VDb29yZGluYXRlcyhldik7XG4gIHZhciBpZCA9IG51bGw7XG5cbiAgLy92YXIgZGF0YVBvaW50SW5mbyA9IHRoaXMuY2hhcnQuZ2V0RGF0YVBvaW50QXRYWSh4eS54LCB4eS55LCBmYWxzZSk7XG5cbiAgLy9pZiAoZGF0YVBvaW50SW5mbykge1xuICAvL1x0aWQgPSBkYXRhUG9pbnRJbmZvLmRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2RhdGFQb2ludEluZm8uZGF0YVBvaW50SW5kZXhdO1xuICAvL30gZWxzZSBpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHsvL0lFOStcbiAgLy9cdGlkID0gZ2V0T2JqZWN0SWQoeHkueCwgeHkueSwgdGhpcy5naG9zdEN0eCk7XG4gIC8vfVxuICBpZCA9IHRoaXMuY2hhcnQuZ2V0T2JqZWN0QXRYWSh4eS54LCB4eS55LCBmYWxzZSk7XG5cbiAgaWYgKGlkICYmIHR5cGVvZiAodGhpcy5vYmplY3RNYXBbaWRdKSAhPT0gXCJ1bmRlZmluZWRcIikge1xuXG4gICAgdmFyIGV2ZW50T2JqZWN0TWFwID0gdGhpcy5vYmplY3RNYXBbaWRdO1xuXG4gICAgaWYgKGV2ZW50T2JqZWN0TWFwLm9iamVjdFR5cGUgPT09IFwiZGF0YVBvaW50XCIpIHtcbiAgICAgIHZhciBkYXRhU2VyaWVzID0gdGhpcy5jaGFydC5kYXRhW2V2ZW50T2JqZWN0TWFwLmRhdGFTZXJpZXNJbmRleF07XG4gICAgICB2YXIgZGF0YVBvaW50ID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2V2ZW50T2JqZWN0TWFwLmRhdGFQb2ludEluZGV4XTtcbiAgICAgIHZhciBkYXRhUG9pbnRJbmRleCA9IGV2ZW50T2JqZWN0TWFwLmRhdGFQb2ludEluZGV4O1xuXG4gICAgICAvL0V2ZW50IFBhcmFtZXRlciBzaG91bGQgbm90IGNvbnRhaW4gcmVmZXJlbmNlIHRvIGRhdGFTZXJpZXMgZGlyZWN0bHkuIEJ1dCB0byBpdHMgb3B0aW9ucy5cbiAgICAgIGV2ZW50T2JqZWN0TWFwLmV2ZW50UGFyYW1ldGVyID0ge1xuICAgICAgICB4OiB4eS54LCB5OiB4eS55LCBkYXRhUG9pbnQ6IGRhdGFQb2ludCxcbiAgICAgICAgZGF0YVNlcmllczogZGF0YVNlcmllcy5fb3B0aW9ucywgZGF0YVBvaW50SW5kZXg6IGRhdGFQb2ludEluZGV4LCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXMuaW5kZXgsXG4gICAgICAgIGNoYXJ0OiB0aGlzLmNoYXJ0Ll9wdWJsaWNDaGFydFJlZmVyZW5jZVxuICAgICAgfTtcbiAgICAgIGV2ZW50T2JqZWN0TWFwLmV2ZW50Q29udGV4dCA9IHtcbiAgICAgICAgY29udGV4dDogZGF0YVBvaW50LCB1c2VyQ29udGV4dDogZGF0YVBvaW50LCBtb3VzZW92ZXI6IFwibW91c2VvdmVyXCIsIG1vdXNlbW92ZTogXCJtb3VzZW1vdmVcIiwgbW91c2VvdXQ6IFwibW91c2VvdXRcIiwgY2xpY2s6IFwiY2xpY2tcIlxuICAgICAgfTtcbiAgICAgIGV2ZW50T2JqZWN0TWFwcy5wdXNoKGV2ZW50T2JqZWN0TWFwKTtcblxuICAgICAgLy9BZGQgRGF0YXNlcmllcyB0b28gYmVjYXVzZSBtb3VzZSBldmVudCBvbiBkYXRhUG9pbnQgYWxzbyBtZWFucyB0aGVyZSBpcyBhbiBldmVudCBvbiBkYXRhU2VyaWVzLiBEYXRhU2VyaWVzIGlzIG5vdCBwcmVzZW50IG9uIGdob3N0IGNhbnZhc1xuICAgICAgZXZlbnRPYmplY3RNYXAgPSB0aGlzLm9iamVjdE1hcFtkYXRhU2VyaWVzLmlkXTtcblxuICAgICAgLy9FdmVudCBQYXJhbWV0ZXIgc2hvdWxkIG5vdCBjb250YWluIHJlZmVyZW5jZSB0byBkYXRhU2VyaWVzIGRpcmVjdGx5LiBCdXQgdG8gaXRzIG9wdGlvbnMuXG4gICAgICBldmVudE9iamVjdE1hcC5ldmVudFBhcmFtZXRlciA9IHtcbiAgICAgICAgeDogeHkueCwgeTogeHkueSxcbiAgICAgICAgZGF0YVBvaW50OiBkYXRhUG9pbnQsIGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMuX29wdGlvbnMsIGRhdGFQb2ludEluZGV4OiBkYXRhUG9pbnRJbmRleCwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzLmluZGV4LFxuICAgICAgICBjaGFydDogdGhpcy5jaGFydC5fcHVibGljQ2hhcnRSZWZlcmVuY2VcbiAgICAgIH07XG5cbiAgICAgIGV2ZW50T2JqZWN0TWFwLmV2ZW50Q29udGV4dCA9IHtcbiAgICAgICAgY29udGV4dDogZGF0YVNlcmllcywgdXNlckNvbnRleHQ6IGRhdGFTZXJpZXMuX29wdGlvbnMsIG1vdXNlb3ZlcjogXCJtb3VzZW92ZXJcIiwgbW91c2Vtb3ZlOiBcIm1vdXNlbW92ZVwiLCBtb3VzZW91dDogXCJtb3VzZW91dFwiLCBjbGljazogXCJjbGlja1wiXG4gICAgICB9O1xuICAgICAgZXZlbnRPYmplY3RNYXBzLnB1c2godGhpcy5vYmplY3RNYXBbZGF0YVNlcmllcy5pZF0pO1xuICAgIH1cbiAgICAgIC8vZWxzZSBpZiAoZXZlbnRPYmplY3RNYXAub2JqZWN0VHlwZSA9PT0gXCJzdHJpcExpbmVcIikge1xuXG4gICAgICAvL1x0Ly9FdmVudCBQYXJhbWV0ZXIgc2hvdWxkIG5vdCBjb250YWluIHJlZmVyZW5jZSB0byBzdHJpcExpbmUgZGlyZWN0bHkuIEJ1dCB0byBpdHMgb3B0aW9ucy5cbiAgICAgIC8vXHRldmVudE9iamVjdE1hcC5ldmVudFBhcmFtZXRlciA9IHsgeDogeHkueCwgeTogeHkueSwgc3RyaXBMaW5lOiBldmVudE9iamVjdE1hcC5zdHJpcExpbmUuX29wdGlvbnMsIGF4aXM6IGV2ZW50T2JqZWN0TWFwLmF4aXMuX29wdGlvbnMsIHN0cmlwTGluZUluZGV4OiBldmVudE9iamVjdE1hcC5zdHJpcExpbmVJbmRleCB9O1xuICAgICAgLy9cdGV2ZW50T2JqZWN0TWFwLmV2ZW50Q29udGV4dCA9IHsgY29udGV4dDogZXZlbnRPYmplY3RNYXAuc3RyaXBMaW5lLCB1c2VyQ29udGV4dDogZXZlbnRPYmplY3RNYXAuc3RyaXBMaW5lLl9vcHRpb25zLCBtb3VzZW92ZXI6IFwibW91c2VvdmVyXCIsIG1vdXNlbW92ZTogXCJtb3VzZW1vdmVcIiwgbW91c2VvdXQ6IFwibW91c2VvdXRcIiwgY2xpY2s6IFwiY2xpY2tcIiB9O1xuXG4gICAgICAvL1x0ZXZlbnRPYmplY3RNYXBzLnB1c2goZXZlbnRPYmplY3RNYXApO1xuICAgICAgLy99XG4gICAgZWxzZSBpZiAoZXZlbnRPYmplY3RNYXAub2JqZWN0VHlwZSA9PT0gXCJsZWdlbmRJdGVtXCIpIHtcblxuICAgICAgdmFyIGRhdGFTZXJpZXMgPSB0aGlzLmNoYXJ0LmRhdGFbZXZlbnRPYmplY3RNYXAuZGF0YVNlcmllc0luZGV4XTtcbiAgICAgIHZhciBkYXRhUG9pbnQgPSBldmVudE9iamVjdE1hcC5kYXRhUG9pbnRJbmRleCAhPT0gbnVsbCA/IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tldmVudE9iamVjdE1hcC5kYXRhUG9pbnRJbmRleF0gOiBudWxsO1xuXG4gICAgICAvL0V2ZW50IFBhcmFtZXRlciBzaG91bGQgbm90IGNvbnRhaW4gcmVmZXJlbmNlIHRvIERhdGFTZXJpZXMgZGlyZWN0bHkuIEJ1dCB0byBpdHMgb3B0aW9ucy5cbiAgICAgIGV2ZW50T2JqZWN0TWFwLmV2ZW50UGFyYW1ldGVyID0ge1xuICAgICAgICB4OiB4eS54LCB5OiB4eS55LFxuICAgICAgICBkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLl9vcHRpb25zLCBkYXRhUG9pbnQ6IGRhdGFQb2ludCwgZGF0YVBvaW50SW5kZXg6IGV2ZW50T2JqZWN0TWFwLmRhdGFQb2ludEluZGV4LCBkYXRhU2VyaWVzSW5kZXg6IGV2ZW50T2JqZWN0TWFwLmRhdGFTZXJpZXNJbmRleCxcbiAgICAgICAgY2hhcnQ6IHRoaXMuY2hhcnQuX3B1YmxpY0NoYXJ0UmVmZXJlbmNlXG4gICAgICB9O1xuICAgICAgZXZlbnRPYmplY3RNYXAuZXZlbnRDb250ZXh0ID0ge1xuICAgICAgICBjb250ZXh0OiB0aGlzLmNoYXJ0LmxlZ2VuZCwgdXNlckNvbnRleHQ6IHRoaXMuY2hhcnQubGVnZW5kLl9vcHRpb25zLCBtb3VzZW92ZXI6IFwiaXRlbW1vdXNlb3ZlclwiLCBtb3VzZW1vdmU6IFwiaXRlbW1vdXNlbW92ZVwiLCBtb3VzZW91dDogXCJpdGVtbW91c2VvdXRcIiwgY2xpY2s6IFwiaXRlbWNsaWNrXCJcbiAgICAgIH07XG4gICAgICBldmVudE9iamVjdE1hcHMucHVzaChldmVudE9iamVjdE1hcCk7XG4gICAgfVxuICB9XG5cbiAgLy9GaXJlIG1vdXNlb3V0IGlmIGV4aXN0aW5nIG1vdXNlb3ZlcmVkIG9iamVjdHMgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvYmplY3RtYXAuXG4gIHZhciBtb3VzZU91dE9iamVjdE1hcHNFeGNsdWRlZCA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubW91c2VvdmVyZWRPYmplY3RNYXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG1vdXNlT3V0ID0gdHJ1ZTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZXZlbnRPYmplY3RNYXBzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoZXZlbnRPYmplY3RNYXBzW2pdLmlkID09PSB0aGlzLm1vdXNlb3ZlcmVkT2JqZWN0TWFwc1tpXS5pZCkge1xuICAgICAgICBtb3VzZU91dCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW91c2VPdXQpIHtcbiAgICAgIHRoaXMuZmlyZUV2ZW50KHRoaXMubW91c2VvdmVyZWRPYmplY3RNYXBzW2ldLCBcIm1vdXNlb3V0XCIsIGV2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW91c2VPdXRPYmplY3RNYXBzRXhjbHVkZWQucHVzaCh0aGlzLm1vdXNlb3ZlcmVkT2JqZWN0TWFwc1tpXSk7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5tb3VzZW92ZXJlZE9iamVjdE1hcHMgPSBtb3VzZU91dE9iamVjdE1hcHNFeGNsdWRlZDtcblxuICAvL1Byb2Nlc3MgbmV3IGV2ZW50T2JlY3RNYXBzXG4gIC8vSWYgdGhleSBhbHJlYWR5IGRvbid0IGV4aXN0LCBhZGQgdGhlbSBhbmQgZmlyZSBtb3VzZW92ZXJcbiAgLy9JZiBldi50eXBlIGlzIG1vdXNlbW92ZSwgdGhlbiBqdXN0IGZpcmUgbW91c2Vtb3ZlXG4gIC8vSWYgZXYudHlwZSBpcyBjbGljaywgdGhlbiBmaXJlIHR3byBldmVudHMgLSBjbGljayBmb2xsb3dlZCBieSBtb3VzZW1vdmVcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudE9iamVjdE1hcHMubGVuZ3RoOyBpKyspIHtcblxuICAgIHZhciBleGlzdGluZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLm1vdXNlb3ZlcmVkT2JqZWN0TWFwcy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGV2ZW50T2JqZWN0TWFwc1tpXS5pZCA9PT0gdGhpcy5tb3VzZW92ZXJlZE9iamVjdE1hcHNbal0uaWQpIHtcbiAgICAgICAgZXhpc3RpbmcgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICB0aGlzLmZpcmVFdmVudChldmVudE9iamVjdE1hcHNbaV0sIFwibW91c2VvdmVyXCIsIGV2KTtcbiAgICAgIHRoaXMubW91c2VvdmVyZWRPYmplY3RNYXBzLnB1c2goZXZlbnRPYmplY3RNYXBzW2ldKTtcbiAgICB9XG5cbiAgICBpZiAoZXYudHlwZSA9PT0gXCJjbGlja1wiKSB7XG4gICAgICB0aGlzLmZpcmVFdmVudChldmVudE9iamVjdE1hcHNbaV0sIFwiY2xpY2tcIiwgZXYpO1xuICAgIH0gZWxzZSBpZiAoZXYudHlwZSA9PT0gXCJtb3VzZW1vdmVcIikge1xuICAgICAgdGhpcy5maXJlRXZlbnQoZXZlbnRPYmplY3RNYXBzW2ldLCBcIm1vdXNlbW92ZVwiLCBldik7XG4gICAgfVxuICB9XG59XG5cbkV2ZW50TWFuYWdlci5wcm90b3R5cGUuZmlyZUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50T2JqZWN0TWFwLCBldmVudFR5cGUsIGV2KSB7XG5cbiAgaWYgKCFldmVudE9iamVjdE1hcCB8fCAhZXZlbnRUeXBlKVxuICAgIHJldHVybjtcblxuICB2YXIgZXZlbnRQYXJhbWV0ZXIgPSBldmVudE9iamVjdE1hcC5ldmVudFBhcmFtZXRlcjtcbiAgdmFyIGV2ZW50Q29udGV4dCA9IGV2ZW50T2JqZWN0TWFwLmV2ZW50Q29udGV4dDtcbiAgLy92YXIgY29udGV4dCA9IGV2ZW50T2JqZWN0TWFwLmV2ZW50Q29udGV4dC5jb250ZXh0O1xuICB2YXIgdXNlckNvbnRleHQgPSBldmVudE9iamVjdE1hcC5ldmVudENvbnRleHQudXNlckNvbnRleHRcblxuICBpZiAodXNlckNvbnRleHQgJiYgZXZlbnRDb250ZXh0ICYmIHVzZXJDb250ZXh0W2V2ZW50Q29udGV4dFtldmVudFR5cGVdXSlcbiAgICB1c2VyQ29udGV4dFtldmVudENvbnRleHRbZXZlbnRUeXBlXV0uY2FsbCh1c2VyQ29udGV4dCwgZXZlbnRQYXJhbWV0ZXIpO1xuXG4gIGlmIChldmVudFR5cGUgIT09IFwibW91c2VvdXRcIikge1xuICAgIGlmICh1c2VyQ29udGV4dC5jdXJzb3IgJiYgdXNlckNvbnRleHQuY3Vyc29yICE9PSBldi50YXJnZXQuc3R5bGUuY3Vyc29yKSB7XG4gICAgICBldi50YXJnZXQuc3R5bGUuY3Vyc29yID0gdXNlckNvbnRleHQuY3Vyc29yO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBldi50YXJnZXQuc3R5bGUuY3Vyc29yID0gdGhpcy5jaGFydC5fZGVmYXVsdEN1cnNvcjtcbiAgICBkZWxldGUgZXZlbnRPYmplY3RNYXAuZXZlbnRQYXJhbWV0ZXI7IC8vIHJlZmVyZW5jZSBubyBsb25nZXIgcmVxdWlyZWQuXG4gICAgZGVsZXRlIGV2ZW50T2JqZWN0TWFwLmV2ZW50Q29udGV4dDsgLy8gcmVmZXJlbmNlIG5vIGxvbmdlciByZXF1aXJlZC5cbiAgfVxuXG4gIC8vVGhpcyBpcyBqdXN0IGEgcXVpY2sgZml4LiBOZWVkIHRvIGZpbmQgYSBiZXR0ZXIgd2F5IG9mIGNhbGxpbmcgaW50ZXJuYWwgZXZlbnQgaGFuZGxlcnMuXG4gIGlmIChldmVudFR5cGUgPT09IFwiY2xpY2tcIiAmJiBldmVudE9iamVjdE1hcC5vYmplY3RUeXBlID09PSBcImRhdGFQb2ludFwiICYmIHRoaXMuY2hhcnQucGllRG91Z2hudXRDbGlja0hhbmRsZXIpIHtcbiAgICB0aGlzLmNoYXJ0LnBpZURvdWdobnV0Q2xpY2tIYW5kbGVyLmNhbGwodGhpcy5jaGFydC5kYXRhW2V2ZW50T2JqZWN0TWFwLmRhdGFTZXJpZXNJbmRleF0sIGV2ZW50UGFyYW1ldGVyKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFdmVudE1hbmFnZXI7XG4iLCJmdW5jdGlvbiBMYXlvdXRNYW5hZ2VyKHgxLCB5MSwgeDIsIHkyLCBwYWRkaW5nKSB7XG5cbiAgaWYgKHR5cGVvZiAocGFkZGluZykgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgcGFkZGluZyA9IDA7XG5cbiAgdGhpcy5fcGFkZGluZyA9IHBhZGRpbmc7XG5cbiAgdGhpcy5feDEgPSB4MTtcbiAgdGhpcy5feTEgPSB5MTtcbiAgdGhpcy5feDIgPSB4MjtcbiAgdGhpcy5feTIgPSB5MjtcblxuICB0aGlzLl90b3BPY2N1cGllZCA9IHRoaXMuX3BhZGRpbmc7XG4gIHRoaXMuX2JvdHRvbU9jY3VwaWVkID0gdGhpcy5fcGFkZGluZztcbiAgdGhpcy5fbGVmdE9jY3VwaWVkID0gdGhpcy5fcGFkZGluZztcbiAgdGhpcy5fcmlnaHRPY2N1cGllZCA9IHRoaXMuX3BhZGRpbmc7XG59XG5cbkxheW91dE1hbmFnZXIucHJvdG90eXBlLnJlZ2lzdGVyU3BhY2UgPSBmdW5jdGlvbiAocG9zaXRpb24sIHNpemUpIHtcbiAgaWYgKHBvc2l0aW9uID09PSBcInRvcFwiKSB7XG4gICAgdGhpcy5fdG9wT2NjdXBpZWQgKz0gc2l6ZS5oZWlnaHQ7XG4gIH1cbiAgZWxzZSBpZiAocG9zaXRpb24gPT09IFwiYm90dG9tXCIpIHtcbiAgICB0aGlzLl9ib3R0b21PY2N1cGllZCArPSBzaXplLmhlaWdodDtcbiAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gXCJsZWZ0XCIpIHtcbiAgICB0aGlzLl9sZWZ0T2NjdXBpZWQgKz0gc2l6ZS53aWR0aDsgLy8gdGhpcyBpcyB3aWR0aCB3aGVuIHNlZW4gdXByaWdodC92ZXJ0aWNhbGx5XG4gIH0gZWxzZSBpZiAocG9zaXRpb24gPT09IFwicmlnaHRcIikge1xuICAgIHRoaXMuX3JpZ2h0T2NjdXBpZWQgKz0gc2l6ZS53aWR0aDsvLyB0aGlzIGlzIHdpZHRoIHdoZW4gc2VlbiB1cHJpZ2h0L3ZlcnRpY2FsbHlcbiAgfVxufVxuXG5MYXlvdXRNYW5hZ2VyLnByb3RvdHlwZS51blJlZ2lzdGVyU3BhY2UgPSBmdW5jdGlvbiAocG9zaXRpb24sIHNpemUpIHtcbiAgaWYgKHBvc2l0aW9uID09PSBcInRvcFwiKSB7XG4gICAgdGhpcy5fdG9wT2NjdXBpZWQgLT0gc2l6ZS5oZWlnaHQ7XG4gIH1cbiAgZWxzZSBpZiAocG9zaXRpb24gPT09IFwiYm90dG9tXCIpIHtcbiAgICB0aGlzLl9ib3R0b21PY2N1cGllZCAtPSBzaXplLmhlaWdodDtcbiAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gXCJsZWZ0XCIpIHtcbiAgICB0aGlzLl9sZWZ0T2NjdXBpZWQgLT0gc2l6ZS53aWR0aDsvLyB0aGlzIGlzIHdpZHRoIHdoZW4gc2VlbiB1cHJpZ2h0L3ZlcnRpY2FsbHlcbiAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgdGhpcy5fcmlnaHRPY2N1cGllZCAtPSBzaXplLndpZHRoOy8vIHRoaXMgaXMgd2lkdGggd2hlbiBzZWVuIHVwcmlnaHQvdmVydGljYWxseVxuICB9XG59XG5cbkxheW91dE1hbmFnZXIucHJvdG90eXBlLmdldEZyZWVTcGFjZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8vPHNpZ25hdHVyZT5cbiAgLy8vPHN1bW1hcnk+UmV0dXJucyBhdmFpbGFibGUgZnJlZSBzcGFjZSB7eDE6bnVtYmVyLCB5MTpudW1iZXIsIHgyOm51bWJlciwgeTI6bnVtYmVyfTwvc3VtbWFyeT5cbiAgLy8vPC9zaWduYXR1cmU+XG5cbiAgcmV0dXJuIHtcbiAgICB4MTogdGhpcy5feDEgKyB0aGlzLl9sZWZ0T2NjdXBpZWQsXG4gICAgeTE6IHRoaXMuX3kxICsgdGhpcy5fdG9wT2NjdXBpZWQsXG4gICAgeDI6IHRoaXMuX3gyIC0gdGhpcy5fcmlnaHRPY2N1cGllZCxcbiAgICB5MjogdGhpcy5feTIgLSB0aGlzLl9ib3R0b21PY2N1cGllZCxcbiAgICB3aWR0aDogKHRoaXMuX3gyIC0gdGhpcy5feDEpIC0gdGhpcy5fcmlnaHRPY2N1cGllZCAtIHRoaXMuX2xlZnRPY2N1cGllZCxcbiAgICBoZWlnaHQ6ICh0aGlzLl95MiAtIHRoaXMuX3kxKSAtIHRoaXMuX2JvdHRvbU9jY3VwaWVkIC0gdGhpcy5fdG9wT2NjdXBpZWRcbiAgfTtcbn1cblxuTGF5b3V0TWFuYWdlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vc28gdGhhdCB0aGVyZSBpcyBlbm91Z2ggcGFkZGluZy5cbiAgdGhpcy5fdG9wT2NjdXBpZWQgPSB0aGlzLl9wYWRkaW5nO1xuICB0aGlzLl9ib3R0b21PY2N1cGllZCA9IHRoaXMuX3BhZGRpbmc7XG4gIHRoaXMuX2xlZnRPY2N1cGllZCA9IHRoaXMuX3BhZGRpbmc7XG4gIHRoaXMuX3JpZ2h0T2NjdXBpZWQgPSB0aGlzLl9wYWRkaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBMYXlvdXRNYW5hZ2VyO1xuIiwiXG5pbXBvcnQgRGF0YVNlcmllcyBmcm9tICcuL2RhdGFfc2VyaWVzJztcbmltcG9ydCBDYW52YXNKU09iamVjdCBmcm9tICcuL2NhbnZhc2pzJztcbmltcG9ydCBUZXh0QmxvY2sgZnJvbSAnLi90ZXh0X2Jsb2NrJztcbmltcG9ydCBSZW5kZXJIZWxwZXIgZnJvbSAnLi4vaGVscGVycy9yZW5kZXInO1xuaW1wb3J0IHtleHRlbmQsIGdldEZvbnRIZWlnaHRJblBpeGVsc30gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmZ1bmN0aW9uIExlZ2VuZChjaGFydCwgb3B0aW9ucywgdGhlbWUpIHtcbiAgTGVnZW5kLmJhc2UuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBcIkxlZ2VuZFwiLCBvcHRpb25zLCB0aGVtZSk7XG5cbiAgdGhpcy5jaGFydCA9IGNoYXJ0O1xuICB0aGlzLmNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcbiAgdGhpcy5jdHggPSB0aGlzLmNoYXJ0LmN0eDtcbiAgdGhpcy5naG9zdEN0eCA9IHRoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5naG9zdEN0eDtcbiAgdGhpcy5pdGVtcyA9IFtdO1xuXG4gIHRoaXMud2lkdGggPSAwLFxuICAvL3RoaXMuZm9udFNpemUgPSAxMixcbiAgdGhpcy5oZWlnaHQgPSAwLFxuICB0aGlzLm9yaWVudGF0aW9uID0gbnVsbCxcbiAgdGhpcy5kYXRhU2VyaWVzID0gW107XG4gIHRoaXMuYm91bmRzID0ge1xuICAgIHgxOiBudWxsLCB5MTogbnVsbCwgeDI6IG51bGwsIHkyOiBudWxsXG4gIH07XG5cbiAgaWYgKHR5cGVvZiAodGhpcy5fb3B0aW9ucy5mb250U2l6ZSkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB0aGlzLmZvbnRTaXplID0gdGhpcy5jaGFydC5nZXRBdXRvRm9udFNpemUodGhpcy5mb250U2l6ZSk7XG4gICAgLy93aW5kb3cuY29uc29sZS5sb2coXCJmb250U2l6ZTogXCIgKyB0aGlzLmZvbnRTaXplKTtcbiAgfVxuXG4gIHRoaXMubGluZUhlaWdodCA9IGdldEZvbnRIZWlnaHRJblBpeGVscyh0aGlzLmZvbnRGYW1pbHksIHRoaXMuZm9udFNpemUsIHRoaXMuZm9udFdlaWdodCk7XG5cbiAgdGhpcy5ob3Jpem9udGFsU3BhY2luZyA9IHRoaXMuZm9udFNpemU7XG59XG5cbmV4dGVuZChMZWdlbmQsIENhbnZhc0pTT2JqZWN0KTtcblxuTGVnZW5kLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG5cbiAgdmFyIGNvbnRhaW5lciA9ICghdGhpcy5kb2NrSW5zaWRlUGxvdEFyZWEgPyB0aGlzLmNoYXJ0IDogdGhpcy5jaGFydC5wbG90QXJlYSk7XG4gIHZhciBmcmVlU3BhY2UgPSBjb250YWluZXIubGF5b3V0TWFuYWdlci5nZXRGcmVlU3BhY2UoKTtcbiAgdmFyIHBvc2l0aW9uID0gbnVsbDtcbiAgdmFyIHRvcCA9IDA7XG4gIHZhciBsZWZ0ID0gMDtcbiAgdmFyIG1heFdpZHRoID0gMDtcbiAgdmFyIG1heEhlaWdodCA9IDA7XG4gIHZhciBpdGVtTWFyZ2luID0gNTtcblxuICB2YXIgaXRlbXMgPSBbXTtcbiAgdmFyIHJvd3MgPSBbXTtcblxuICAvL3RoaXMuY3R4LmZvbnQgPSBnZXRGb250U3RyaW5nKFwiXCIsIHRoaXMsIG51bGwpO1xuICAvL3RoaXMuY3R4LmZvbnRDb2xvciA9IHRoaXMuZm9udENvbG9yO1xuXG4gIGlmICh0aGlzLnZlcnRpY2FsQWxpZ24gPT09IFwidG9wXCIgfHwgdGhpcy52ZXJ0aWNhbEFsaWduID09PSBcImJvdHRvbVwiKSB7XG4gICAgdGhpcy5vcmllbnRhdGlvbiA9IFwiaG9yaXpvbnRhbFwiO1xuICAgIHBvc2l0aW9uID0gdGhpcy52ZXJ0aWNhbEFsaWduO1xuXG4gICAgbWF4V2lkdGggPSB0aGlzLm1heFdpZHRoICE9PSBudWxsID8gdGhpcy5tYXhXaWR0aCA6IGZyZWVTcGFjZS53aWR0aCAqIC43O1xuICAgIG1heEhlaWdodCA9IHRoaXMubWF4SGVpZ2h0ICE9PSBudWxsID8gdGhpcy5tYXhIZWlnaHQgOiBmcmVlU3BhY2UuaGVpZ2h0ICogLjU7XG4gIH1cbiAgZWxzZSBpZiAodGhpcy52ZXJ0aWNhbEFsaWduID09PSBcImNlbnRlclwiKSB7XG4gICAgdGhpcy5vcmllbnRhdGlvbiA9IFwidmVydGljYWxcIjtcbiAgICBwb3NpdGlvbiA9IHRoaXMuaG9yaXpvbnRhbEFsaWduO1xuXG4gICAgbWF4V2lkdGggPSB0aGlzLm1heFdpZHRoICE9PSBudWxsID8gdGhpcy5tYXhXaWR0aCA6IGZyZWVTcGFjZS53aWR0aCAqIC41O1xuICAgIG1heEhlaWdodCA9IHRoaXMubWF4SGVpZ2h0ICE9PSBudWxsID8gdGhpcy5tYXhIZWlnaHQgOiBmcmVlU3BhY2UuaGVpZ2h0ICogLjc7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YVNlcmllcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhU2VyaWVzW2ldO1xuXG5cbiAgICBpZiAoZGF0YVNlcmllcy50eXBlICE9PSBcInBpZVwiICYmIGRhdGFTZXJpZXMudHlwZSAhPT0gXCJkb3VnaG51dFwiICYmIGRhdGFTZXJpZXMudHlwZSAhPT0gXCJmdW5uZWxcIikge1xuXG4gICAgICB2YXIgbWFya2VyVHlwZSA9IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyVHlwZSA/IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyVHlwZSA6IChkYXRhU2VyaWVzLnR5cGUgPT09IFwibGluZVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGVwTGluZVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzcGxpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic2NhdHRlclwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJidWJibGVcIikgJiYgZGF0YVNlcmllcy5tYXJrZXJUeXBlID8gZGF0YVNlcmllcy5tYXJrZXJUeXBlIDogRGF0YVNlcmllcy5nZXREZWZhdWx0TGVnZW5kTWFya2VyKGRhdGFTZXJpZXMudHlwZSk7XG4gICAgICB2YXIgbGVnZW5kVGV4dCA9IGRhdGFTZXJpZXMubGVnZW5kVGV4dCA/IGRhdGFTZXJpZXMubGVnZW5kVGV4dCA6IHRoaXMuaXRlbVRleHRGb3JtYXR0ZXIgPyB0aGlzLml0ZW1UZXh0Rm9ybWF0dGVyKHsgY2hhcnQ6IHRoaXMuY2hhcnQsIGxlZ2VuZDogdGhpcy5fb3B0aW9ucywgZGF0YVNlcmllczogZGF0YVNlcmllcywgZGF0YVBvaW50OiBudWxsIH0pXG4gICAgICAgIDogZGF0YVNlcmllcy5uYW1lO1xuICAgICAgdmFyIG1hcmtlckNvbG9yID0gZGF0YVNlcmllcy5sZWdlbmRNYXJrZXJDb2xvciA/IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyQ29sb3IgOiBkYXRhU2VyaWVzLm1hcmtlckNvbG9yID8gZGF0YVNlcmllcy5tYXJrZXJDb2xvciA6IGRhdGFTZXJpZXMuX2NvbG9yU2V0WzBdO1xuICAgICAgdmFyIG1hcmtlclNpemUgPSAoIWRhdGFTZXJpZXMubWFya2VyU2l6ZSAmJiAoZGF0YVNlcmllcy50eXBlID09PSBcImxpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcExpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3BsaW5lXCIpKSA/IDAgOiB0aGlzLmxpbmVIZWlnaHQgKiAuNjtcbiAgICAgIHZhciBtYXJrZXJCb3JkZXJDb2xvciA9IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyQm9yZGVyQ29sb3IgPyBkYXRhU2VyaWVzLmxlZ2VuZE1hcmtlckJvcmRlckNvbG9yIDogZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJDb2xvcjtcbiAgICAgIHZhciBtYXJrZXJCb3JkZXJUaGlja25lc3MgPSBkYXRhU2VyaWVzLmxlZ2VuZE1hcmtlckJvcmRlclRoaWNrbmVzcyA/IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyQm9yZGVyVGhpY2tuZXNzIDogZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJUaGlja25lc3MgPyBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKG1hcmtlclNpemUgKiAuMikpIDogMDtcbiAgICAgIHZhciBsaW5lQ29sb3IgPSBkYXRhU2VyaWVzLl9jb2xvclNldFswXTtcblxuICAgICAgbGVnZW5kVGV4dCA9IHRoaXMuY2hhcnQucmVwbGFjZUtleXdvcmRzV2l0aFZhbHVlKGxlZ2VuZFRleHQsIGRhdGFTZXJpZXMuZGF0YVBvaW50c1swXSwgZGF0YVNlcmllcywgaSk7XG4gICAgICB2YXIgaXRlbSA9IHtcbiAgICAgICAgbWFya2VyVHlwZTogbWFya2VyVHlwZSwgbWFya2VyQ29sb3I6IG1hcmtlckNvbG9yLCB0ZXh0OiBsZWdlbmRUZXh0LCB0ZXh0QmxvY2s6IG51bGwsIGNoYXJ0VHlwZTogZGF0YVNlcmllcy50eXBlLCBtYXJrZXJTaXplOiBtYXJrZXJTaXplLCBsaW5lQ29sb3I6IGRhdGFTZXJpZXMuX2NvbG9yU2V0WzBdLFxuICAgICAgICBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXMuaW5kZXgsIGRhdGFQb2ludEluZGV4OiBudWxsLCBtYXJrZXJCb3JkZXJDb2xvcjogbWFya2VyQm9yZGVyQ29sb3IsIG1hcmtlckJvcmRlclRoaWNrbmVzczogbWFya2VyQm9yZGVyVGhpY2tuZXNzXG4gICAgICB9O1xuXG4gICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBkYXRhUG9pbnRJbmRleCA9IDA7IGRhdGFQb2ludEluZGV4IDwgZGF0YVNlcmllcy5kYXRhUG9pbnRzLmxlbmd0aDsgZGF0YVBvaW50SW5kZXgrKykge1xuXG4gICAgICAgIHZhciBkYXRhUG9pbnQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbZGF0YVBvaW50SW5kZXhdO1xuXG4gICAgICAgIHZhciBtYXJrZXJUeXBlID0gZGF0YVBvaW50LmxlZ2VuZE1hcmtlclR5cGUgPyBkYXRhUG9pbnQubGVnZW5kTWFya2VyVHlwZSA6IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyVHlwZSA/IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyVHlwZSA6IERhdGFTZXJpZXMuZ2V0RGVmYXVsdExlZ2VuZE1hcmtlcihkYXRhU2VyaWVzLnR5cGUpO1xuICAgICAgICB2YXIgbGVnZW5kVGV4dCA9IGRhdGFQb2ludC5sZWdlbmRUZXh0ID8gZGF0YVBvaW50LmxlZ2VuZFRleHQgOiBkYXRhU2VyaWVzLmxlZ2VuZFRleHQgPyBkYXRhU2VyaWVzLmxlZ2VuZFRleHQgOiB0aGlzLml0ZW1UZXh0Rm9ybWF0dGVyID8gdGhpcy5pdGVtVGV4dEZvcm1hdHRlcih7IGNoYXJ0OiB0aGlzLmNoYXJ0LCBsZWdlbmQ6IHRoaXMuX29wdGlvbnMsIGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMsIGRhdGFQb2ludDogZGF0YVBvaW50IH0pXG4gICAgICAgICAgOiBkYXRhUG9pbnQubmFtZSA/IGRhdGFQb2ludC5uYW1lIDogXCJEYXRhUG9pbnQ6IFwiICsgKGRhdGFQb2ludEluZGV4ICsgMSk7XG4gICAgICAgIHZhciBtYXJrZXJDb2xvciA9IGRhdGFQb2ludC5sZWdlbmRNYXJrZXJDb2xvciA/IGRhdGFQb2ludC5sZWdlbmRNYXJrZXJDb2xvciA6IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyQ29sb3IgPyBkYXRhU2VyaWVzLmxlZ2VuZE1hcmtlckNvbG9yIDogZGF0YVBvaW50LmNvbG9yID8gZGF0YVBvaW50LmNvbG9yIDogZGF0YVNlcmllcy5jb2xvciA/IGRhdGFTZXJpZXMuY29sb3IgOiBkYXRhU2VyaWVzLl9jb2xvclNldFtkYXRhUG9pbnRJbmRleCAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG4gICAgICAgIHZhciBtYXJrZXJTaXplID0gdGhpcy5saW5lSGVpZ2h0ICogLjY7XG4gICAgICAgIHZhciBtYXJrZXJCb3JkZXJDb2xvciA9IGRhdGFQb2ludC5sZWdlbmRNYXJrZXJCb3JkZXJDb2xvciA/IGRhdGFQb2ludC5sZWdlbmRNYXJrZXJCb3JkZXJDb2xvciA6IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyQm9yZGVyQ29sb3IgPyBkYXRhU2VyaWVzLmxlZ2VuZE1hcmtlckJvcmRlckNvbG9yIDogZGF0YVBvaW50Lm1hcmtlckJvcmRlckNvbG9yID8gZGF0YVBvaW50Lm1hcmtlckJvcmRlckNvbG9yIDogZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJDb2xvcjtcbiAgICAgICAgdmFyIG1hcmtlckJvcmRlclRoaWNrbmVzcyA9IGRhdGFQb2ludC5sZWdlbmRNYXJrZXJCb3JkZXJUaGlja25lc3MgPyBkYXRhUG9pbnQubGVnZW5kTWFya2VyQm9yZGVyVGhpY2tuZXNzIDogZGF0YVNlcmllcy5sZWdlbmRNYXJrZXJCb3JkZXJUaGlja25lc3MgPyBkYXRhU2VyaWVzLmxlZ2VuZE1hcmtlckJvcmRlclRoaWNrbmVzcyA6IGRhdGFQb2ludC5tYXJrZXJCb3JkZXJUaGlja25lc3MgfHwgZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJUaGlja25lc3MgPyBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKG1hcmtlclNpemUgKiAuMikpIDogMDtcblxuICAgICAgICBsZWdlbmRUZXh0ID0gdGhpcy5jaGFydC5yZXBsYWNlS2V5d29yZHNXaXRoVmFsdWUobGVnZW5kVGV4dCwgZGF0YVBvaW50LCBkYXRhU2VyaWVzLCBkYXRhUG9pbnRJbmRleCk7XG5cbiAgICAgICAgdmFyIGl0ZW0gPSB7XG4gICAgICAgICAgbWFya2VyVHlwZTogbWFya2VyVHlwZSwgbWFya2VyQ29sb3I6IG1hcmtlckNvbG9yLCB0ZXh0OiBsZWdlbmRUZXh0LCB0ZXh0QmxvY2s6IG51bGwsIGNoYXJ0VHlwZTogZGF0YVNlcmllcy50eXBlLCBtYXJrZXJTaXplOiBtYXJrZXJTaXplLFxuICAgICAgICAgIGRhdGFTZXJpZXNJbmRleDogaSwgZGF0YVBvaW50SW5kZXg6IGRhdGFQb2ludEluZGV4LCBtYXJrZXJCb3JkZXJDb2xvcjogbWFya2VyQm9yZGVyQ29sb3IsIG1hcmtlckJvcmRlclRoaWNrbmVzczogbWFya2VyQm9yZGVyVGhpY2tuZXNzXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGRhdGFQb2ludC5zaG93SW5MZWdlbmQgfHwgKGRhdGFTZXJpZXMuc2hvd0luTGVnZW5kICYmIGRhdGFQb2ludC5zaG93SW5MZWdlbmQgIT09IGZhbHNlKSkge1xuICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaXRlbSA9IG51bGw7XG4gIH1cbiAgaWYgKHRoaXMucmV2ZXJzZWQgPT09IHRydWUpIHtcbiAgICBpdGVtcy5yZXZlcnNlKCk7XG4gIH1cblxuICAvLyBGaW5kIG91dCB0aGUgcmVxdWlyZWQgd2lkdGggYW5kIGhlaWdodCBvZiBMZWdlbmQgYW5kIHBvc2l0aW9uIHRoZSBpdGVtcyByZWxhdGl2ZSB0byB0aGUgY29udGFpbmVyXG4gIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIHJvdyA9IG51bGw7XG4gICAgdmFyIHJvd0luZGV4ID0gMDsgLy8gcmVxdWlyZWQgZm9yIHZlcnRpY2FsIG9yaWVudGF0aW9uXG4gICAgdmFyIHRleHRNYXhXaWR0aCA9IDA7XG4gICAgdmFyIGNvbHVtbkhlaWdodCA9IDA7XG5cbiAgICBpZiAodGhpcy5pdGVtV2lkdGggIT09IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLml0ZW1NYXhXaWR0aCAhPT0gbnVsbCkge1xuICAgICAgICB0ZXh0TWF4V2lkdGggPSBNYXRoLm1pbih0aGlzLml0ZW1XaWR0aCwgdGhpcy5pdGVtTWF4V2lkdGgsIG1heFdpZHRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHRNYXhXaWR0aCA9IE1hdGgubWluKHRoaXMuaXRlbVdpZHRoLCBtYXhXaWR0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLml0ZW1NYXhXaWR0aCAhPT0gbnVsbCkge1xuICAgICAgICB0ZXh0TWF4V2lkdGggPSBNYXRoLm1pbih0aGlzLml0ZW1NYXhXaWR0aCwgbWF4V2lkdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dE1heFdpZHRoID0gbWF4V2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWFya2VyU2l6ZSA9IChtYXJrZXJTaXplID09PSAwID8gdGhpcy5saW5lSGVpZ2h0ICogLjYgOiBtYXJrZXJTaXplKTtcbiAgICB0ZXh0TWF4V2lkdGggPSB0ZXh0TWF4V2lkdGggLSAobWFya2VyU2l6ZSArIHRoaXMuaG9yaXpvbnRhbFNwYWNpbmcgKiAuMSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldO1xuXG4gICAgICBpZiAoaXRlbS5jaGFydFR5cGUgPT09IFwibGluZVwiIHx8IGl0ZW0uY2hhcnRUeXBlID09PSBcInNwbGluZVwiIHx8IGl0ZW0uY2hhcnRUeXBlID09PSBcInN0ZXBMaW5lXCIpIHtcbiAgICAgICAgdGV4dE1heFdpZHRoID0gdGV4dE1heFdpZHRoIC0gMiAqICh0aGlzLmxpbmVIZWlnaHQgKiAuMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXhIZWlnaHQgPD0gMCB8fCB0eXBlb2YgKG1heEhlaWdodCkgPT09IFwidW5kZWZpbmVkXCIgfHwgdGV4dE1heFdpZHRoIDw9IDAgfHwgdHlwZW9mICh0ZXh0TWF4V2lkdGgpID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCIpIHtcblxuICAgICAgICBpdGVtLnRleHRCbG9jayA9IG5ldyBUZXh0QmxvY2sodGhpcy5jdHgsIHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDAsLy9UQklcbiAgICAgICAgICBtYXhXaWR0aDogdGV4dE1heFdpZHRoLFxuICAgICAgICAgIG1heEhlaWdodDogdGhpcy5pdGVtV3JhcCA/IG1heEhlaWdodCA6IHRoaXMubGluZUhlaWdodCwgLy9UQkk6IEZvbnRTaXplXG4gICAgICAgICAgYW5nbGU6IDAsXG4gICAgICAgICAgdGV4dDogaXRlbS50ZXh0LFxuICAgICAgICAgIGhvcml6b250YWxBbGlnbjogXCJsZWZ0XCIsLy9sZWZ0LCBjZW50ZXIsIHJpZ2h0XG4gICAgICAgICAgZm9udFNpemU6IHRoaXMuZm9udFNpemUsLy9pbiBwaXhlbHNcbiAgICAgICAgICBmb250RmFtaWx5OiB0aGlzLmZvbnRGYW1pbHksXG4gICAgICAgICAgZm9udFdlaWdodDogdGhpcy5mb250V2VpZ2h0LCAvL25vcm1hbCwgYm9sZCwgYm9sZGVyLCBsaWdodGVyLFxuICAgICAgICAgIGZvbnRDb2xvcjogdGhpcy5mb250Q29sb3IsXG4gICAgICAgICAgZm9udFN0eWxlOiB0aGlzLmZvbnRTdHlsZSwgLy8gbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcbiAgICAgICAgICB0ZXh0QmFzZWxpbmU6IFwidG9wXCJcbiAgICAgICAgfSk7XG4gICAgICAgIGl0ZW0udGV4dEJsb2NrLm1lYXN1cmVUZXh0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXRlbVdpZHRoICE9PSBudWxsKSB7XG4gICAgICAgICAgaXRlbS50ZXh0QmxvY2sud2lkdGggPSB0aGlzLml0ZW1XaWR0aCAtIChtYXJrZXJTaXplICsgdGhpcy5ob3Jpem9udGFsU3BhY2luZyAqIC4xICsgKChpdGVtLmNoYXJ0VHlwZSA9PT0gXCJsaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3BsaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3RlcExpbmVcIikgPyAyICogKHRoaXMubGluZUhlaWdodCAqIC4xKSA6IDApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcm93IHx8IHJvdy53aWR0aCArIE1hdGgucm91bmQoaXRlbS50ZXh0QmxvY2sud2lkdGggKyB0aGlzLmhvcml6b250YWxTcGFjaW5nICogLjEgKyBtYXJrZXJTaXplICsgKHJvdy53aWR0aCA9PT0gMCA/IDAgOiAodGhpcy5ob3Jpem9udGFsU3BhY2luZykpICsgKChpdGVtLmNoYXJ0VHlwZSA9PT0gXCJsaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3BsaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3RlcExpbmVcIikgPyAyICogKHRoaXMubGluZUhlaWdodCAqIC4xKSA6IDApKSA+IG1heFdpZHRoKSB7XG4gICAgICAgICAgcm93ID0ge1xuICAgICAgICAgICAgaXRlbXM6IFtdLCB3aWR0aDogMFxuICAgICAgICAgIH07XG4gICAgICAgICAgcm93cy5wdXNoKHJvdyk7XG4gICAgICAgICAgdGhpcy5oZWlnaHQgKz0gY29sdW1uSGVpZ2h0O1xuICAgICAgICAgIGNvbHVtbkhlaWdodCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb2x1bW5IZWlnaHQgPSBNYXRoLm1heChjb2x1bW5IZWlnaHQsIGl0ZW0udGV4dEJsb2NrLmhlaWdodCk7XG5cbiAgICAgICAgaXRlbS50ZXh0QmxvY2sueCA9IHJvdy53aWR0aDtcbiAgICAgICAgaXRlbS50ZXh0QmxvY2sueSA9IDA7XG5cbiAgICAgICAgcm93LndpZHRoICs9IE1hdGgucm91bmQoaXRlbS50ZXh0QmxvY2sud2lkdGggKyB0aGlzLmhvcml6b250YWxTcGFjaW5nICogLjEgKyBtYXJrZXJTaXplICsgKHJvdy53aWR0aCA9PT0gMCA/IDAgOiB0aGlzLmhvcml6b250YWxTcGFjaW5nKSArICgoaXRlbS5jaGFydFR5cGUgPT09IFwibGluZVwiIHx8IGl0ZW0uY2hhcnRUeXBlID09PSBcInNwbGluZVwiIHx8IGl0ZW0uY2hhcnRUeXBlID09PSBcInN0ZXBMaW5lXCIpID8gMiAqICh0aGlzLmxpbmVIZWlnaHQgKiAuMSkgOiAwKSk7XG4gICAgICAgIHJvdy5pdGVtcy5wdXNoKGl0ZW0pO1xuXG4gICAgICAgIHRoaXMud2lkdGggPSBNYXRoLm1heChyb3cud2lkdGgsIHRoaXMud2lkdGgpO1xuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBpdGVtLnRleHRCbG9jayA9IG5ldyBUZXh0QmxvY2sodGhpcy5jdHgsIHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDAsLy9UQklcbiAgICAgICAgICBtYXhXaWR0aDogdGV4dE1heFdpZHRoLFxuICAgICAgICAgIG1heEhlaWdodDogdGhpcy5pdGVtV3JhcCA9PT0gdHJ1ZSA/IG1heEhlaWdodCA6IHRoaXMuZm9udFNpemUgKiAxLjUsIC8vVEJJOiBGb250U2l6ZVxuICAgICAgICAgIGFuZ2xlOiAwLFxuICAgICAgICAgIHRleHQ6IGl0ZW0udGV4dCxcbiAgICAgICAgICBob3Jpem9udGFsQWxpZ246IFwibGVmdFwiLC8vbGVmdCwgY2VudGVyLCByaWdodFxuICAgICAgICAgIGZvbnRTaXplOiB0aGlzLmZvbnRTaXplLC8vaW4gcGl4ZWxzXG4gICAgICAgICAgZm9udEZhbWlseTogdGhpcy5mb250RmFtaWx5LFxuICAgICAgICAgIGZvbnRXZWlnaHQ6IHRoaXMuZm9udFdlaWdodCwgLy9ub3JtYWwsIGJvbGQsIGJvbGRlciwgbGlnaHRlcixcbiAgICAgICAgICBmb250Q29sb3I6IHRoaXMuZm9udENvbG9yLFxuICAgICAgICAgIGZvbnRTdHlsZTogdGhpcy5mb250U3R5bGUsIC8vIG5vcm1hbCwgaXRhbGljLCBvYmxpcXVlXG4gICAgICAgICAgdGV4dEJhc2VsaW5lOiBcInRvcFwiXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0ZW0udGV4dEJsb2NrLm1lYXN1cmVUZXh0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXRlbVdpZHRoICE9PSBudWxsKSB7XG4gICAgICAgICAgaXRlbS50ZXh0QmxvY2sud2lkdGggPSB0aGlzLml0ZW1XaWR0aCAtIChtYXJrZXJTaXplICsgdGhpcy5ob3Jpem9udGFsU3BhY2luZyAqIC4xICsgKChpdGVtLmNoYXJ0VHlwZSA9PT0gXCJsaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3BsaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3RlcExpbmVcIikgPyAyICogKHRoaXMubGluZUhlaWdodCAqIC4xKSA6IDApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhlaWdodCA8PSBtYXhIZWlnaHQpIHtcbiAgICAgICAgICByb3cgPSB7XG4gICAgICAgICAgICBpdGVtczogW10sIHdpZHRoOiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgICByb3dzLnB1c2gocm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByb3cgPSByb3dzW3Jvd0luZGV4XTtcbiAgICAgICAgICByb3dJbmRleCA9IChyb3dJbmRleCArIDEpICUgcm93cy5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhlaWdodCArPSBpdGVtLnRleHRCbG9jay5oZWlnaHQ7XG5cbiAgICAgICAgaXRlbS50ZXh0QmxvY2sueCA9IHJvdy53aWR0aDsgLy8gcmVsYXRpdmUgdG8gdGhlIHJvd1xuICAgICAgICBpdGVtLnRleHRCbG9jay55ID0gMDsgLy8gcmVsYXRpdmUgdG8gdGhlIHJvd1xuXG4gICAgICAgIHJvdy53aWR0aCArPSBNYXRoLnJvdW5kKGl0ZW0udGV4dEJsb2NrLndpZHRoICsgdGhpcy5ob3Jpem9udGFsU3BhY2luZyAqIC4xICsgbWFya2VyU2l6ZSArIChyb3cud2lkdGggPT09IDAgPyAwIDogdGhpcy5ob3Jpem9udGFsU3BhY2luZykgKyAoKGl0ZW0uY2hhcnRUeXBlID09PSBcImxpbmVcIiB8fCBpdGVtLmNoYXJ0VHlwZSA9PT0gXCJzcGxpbmVcIiB8fCBpdGVtLmNoYXJ0VHlwZSA9PT0gXCJzdGVwTGluZVwiKSA/IDIgKiAodGhpcy5saW5lSGVpZ2h0ICogLjEpIDogMCkpO1xuICAgICAgICByb3cuaXRlbXMucHVzaChpdGVtKTtcblxuICAgICAgICB0aGlzLndpZHRoID0gTWF0aC5tYXgocm93LndpZHRoLCB0aGlzLndpZHRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pdGVtV3JhcCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gcm93cy5sZW5ndGggKiAodGhpcy5saW5lSGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWlnaHQgKz0gY29sdW1uSGVpZ2h0O1xuICAgIH1cblxuICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5taW4obWF4SGVpZ2h0LCB0aGlzLmhlaWdodCk7XG4gICAgdGhpcy53aWR0aCA9IE1hdGgubWluKG1heFdpZHRoLCB0aGlzLndpZHRoKTtcbiAgfVxuXG4gIGlmICh0aGlzLnZlcnRpY2FsQWxpZ24gPT09IFwidG9wXCIpIHtcbiAgICBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwibGVmdFwiKVxuICAgICAgbGVmdCA9IGZyZWVTcGFjZS54MTtcbiAgICBlbHNlIGlmICh0aGlzLmhvcml6b250YWxBbGlnbiA9PT0gXCJyaWdodFwiKVxuICAgICAgbGVmdCA9IGZyZWVTcGFjZS54MiAtIHRoaXMud2lkdGg7XG4gICAgZWxzZVxuICAgICAgbGVmdCA9IGZyZWVTcGFjZS54MSArIGZyZWVTcGFjZS53aWR0aCAvIDIgLSB0aGlzLndpZHRoIC8gMjtcblxuICAgIHRvcCA9IGZyZWVTcGFjZS55MTtcbiAgfSBlbHNlIGlmICh0aGlzLnZlcnRpY2FsQWxpZ24gPT09IFwiY2VudGVyXCIpIHtcbiAgICBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwibGVmdFwiKVxuICAgICAgbGVmdCA9IGZyZWVTcGFjZS54MTtcbiAgICBlbHNlIGlmICh0aGlzLmhvcml6b250YWxBbGlnbiA9PT0gXCJyaWdodFwiKVxuICAgICAgbGVmdCA9IGZyZWVTcGFjZS54MiAtIHRoaXMud2lkdGg7XG4gICAgZWxzZVxuICAgICAgbGVmdCA9IGZyZWVTcGFjZS54MSArIGZyZWVTcGFjZS53aWR0aCAvIDIgLSB0aGlzLndpZHRoIC8gMjtcblxuICAgIHRvcCA9IGZyZWVTcGFjZS55MSArIGZyZWVTcGFjZS5oZWlnaHQgLyAyIC0gdGhpcy5oZWlnaHQgLyAyO1xuICB9IGVsc2UgaWYgKHRoaXMudmVydGljYWxBbGlnbiA9PT0gXCJib3R0b21cIikge1xuICAgIGlmICh0aGlzLmhvcml6b250YWxBbGlnbiA9PT0gXCJsZWZ0XCIpXG4gICAgICBsZWZ0ID0gZnJlZVNwYWNlLngxO1xuICAgIGVsc2UgaWYgKHRoaXMuaG9yaXpvbnRhbEFsaWduID09PSBcInJpZ2h0XCIpXG4gICAgICBsZWZ0ID0gZnJlZVNwYWNlLngyIC0gdGhpcy53aWR0aDtcbiAgICBlbHNlXG4gICAgICBsZWZ0ID0gZnJlZVNwYWNlLngxICsgZnJlZVNwYWNlLndpZHRoIC8gMiAtIHRoaXMud2lkdGggLyAyO1xuXG4gICAgdG9wID0gZnJlZVNwYWNlLnkyIC0gdGhpcy5oZWlnaHQ7XG4gIH1cblxuICB0aGlzLml0ZW1zID0gaXRlbXM7XG5cbiAgLy9Bc3NpZ24gaWRzIHRvIGFsbCBsZWdlbmRJdGVtc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcblxuICAgIHZhciBpdGVtID0gaXRlbXNbaV07XG5cbiAgICBpdGVtLmlkID0gKyt0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIubGFzdE9iamVjdElkO1xuICAgIHRoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaXRlbS5pZF0gPSB7XG4gICAgICBpZDogaXRlbS5pZCwgb2JqZWN0VHlwZTogXCJsZWdlbmRJdGVtXCIsIGxlZ2VuZEl0ZW1JbmRleDogaSwgZGF0YVNlcmllc0luZGV4OiBpdGVtLmRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGl0ZW0uZGF0YVBvaW50SW5kZXhcbiAgICB9O1xuICAgIC8vZGVsZXRlIGl0ZW0udGV4dEJsb2NrOy8vIE5vdCBSZXF1aXJlZCBhbnltb3JlXG4gIH1cblxuICB2YXIgcm93SGVpZ2h0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJvdyA9IHJvd3NbaV07XG4gICAgdmFyIGNvbHVtbkhlaWdodCA9IDA7XG4gICAgZm9yICh2YXIgaXRlbUluZGV4ID0gMDsgaXRlbUluZGV4IDwgcm93Lml0ZW1zLmxlbmd0aDsgaXRlbUluZGV4KyspIHtcbiAgICAgIHZhciBpdGVtID0gcm93Lml0ZW1zW2l0ZW1JbmRleF07XG5cbiAgICAgIHZhciBpdGVtWCA9IGl0ZW0udGV4dEJsb2NrLnggKyBsZWZ0ICsgKGl0ZW1JbmRleCA9PT0gMCA/IG1hcmtlclNpemUgKiAuMiA6IHRoaXMuaG9yaXpvbnRhbFNwYWNpbmcpO1xuICAgICAgdmFyIGl0ZW1ZID0gdG9wICsgcm93SGVpZ2h0O1xuXG4gICAgICB2YXIgZ2hvc3RYID0gaXRlbVg7XG5cbiAgICAgIGlmICghdGhpcy5jaGFydC5kYXRhW2l0ZW0uZGF0YVNlcmllc0luZGV4XS52aXNpYmxlKVxuICAgICAgICB0aGlzLmN0eC5nbG9iYWxBbHBoYSA9IC41O1xuXG4gICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICB0aGlzLmN0eC5yZWN0KGxlZnQsIHRvcCwgbWF4V2lkdGgsIG1heEhlaWdodCk7XG4gICAgICB0aGlzLmN0eC5jbGlwKCk7XG5cbiAgICAgIGlmIChpdGVtLmNoYXJ0VHlwZSA9PT0gXCJsaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3RlcExpbmVcIiB8fCBpdGVtLmNoYXJ0VHlwZSA9PT0gXCJzcGxpbmVcIikge1xuICAgICAgICB0aGlzLmN0eC5zdHJva2VTdHlsZSA9IGl0ZW0ubGluZUNvbG9yO1xuICAgICAgICB0aGlzLmN0eC5saW5lV2lkdGggPSBNYXRoLmNlaWwodGhpcy5saW5lSGVpZ2h0IC8gOCk7XG4gICAgICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICB0aGlzLmN0eC5tb3ZlVG8oaXRlbVggLSB0aGlzLmxpbmVIZWlnaHQgKiAuMSwgaXRlbVkgKyB0aGlzLmxpbmVIZWlnaHQgLyAyKTtcbiAgICAgICAgdGhpcy5jdHgubGluZVRvKGl0ZW1YICsgdGhpcy5saW5lSGVpZ2h0ICogLjcsIGl0ZW1ZICsgdGhpcy5saW5lSGVpZ2h0IC8gMik7XG4gICAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuXG4gICAgICAgIGdob3N0WCAtPSB0aGlzLmxpbmVIZWlnaHQgKiAuMTtcbiAgICAgIH1cblxuICAgICAgUmVuZGVySGVscGVyLmRyYXdNYXJrZXIoaXRlbVggKyBtYXJrZXJTaXplIC8gMiwgaXRlbVkgKyAodGhpcy5saW5lSGVpZ2h0IC8gMiksIHRoaXMuY3R4LCBpdGVtLm1hcmtlclR5cGUsIGl0ZW0ubWFya2VyU2l6ZSwgaXRlbS5tYXJrZXJDb2xvciwgaXRlbS5tYXJrZXJCb3JkZXJDb2xvciwgaXRlbS5tYXJrZXJCb3JkZXJUaGlja25lc3MpO1xuXG4gICAgICBpdGVtLnRleHRCbG9jay54ID0gaXRlbVggKyB0aGlzLmhvcml6b250YWxTcGFjaW5nICogLjEgKyBtYXJrZXJTaXplO1xuXG4gICAgICBpZiAoaXRlbS5jaGFydFR5cGUgPT09IFwibGluZVwiIHx8IGl0ZW0uY2hhcnRUeXBlID09PSBcInN0ZXBMaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3BsaW5lXCIpIHtcbiAgICAgICAgaXRlbS50ZXh0QmxvY2sueCA9IGl0ZW0udGV4dEJsb2NrLnggKyB0aGlzLmxpbmVIZWlnaHQgKiAuMTtcbiAgICAgIH1cblxuICAgICAgaXRlbS50ZXh0QmxvY2sueSA9IGl0ZW1ZO1xuXG4gICAgICBpdGVtLnRleHRCbG9jay5yZW5kZXIodHJ1ZSk7XG5cbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcblxuICAgICAgaWYgKGl0ZW1JbmRleCA+IDApIHtcbiAgICAgICAgY29sdW1uSGVpZ2h0ID0gTWF0aC5tYXgoY29sdW1uSGVpZ2h0LCBpdGVtLnRleHRCbG9jay5oZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sdW1uSGVpZ2h0ID0gaXRlbS50ZXh0QmxvY2suaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuY2hhcnQuZGF0YVtpdGVtLmRhdGFTZXJpZXNJbmRleF0udmlzaWJsZSlcbiAgICAgICAgdGhpcy5jdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG4gICAgICB2YXIgaGV4Q29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGl0ZW0uaWQpO1xuICAgICAgdGhpcy5naG9zdEN0eC5maWxsU3R5bGUgPSBoZXhDb2xvcjtcbiAgICAgIHRoaXMuZ2hvc3RDdHguYmVnaW5QYXRoKCk7XG4gICAgICB0aGlzLmdob3N0Q3R4LmZpbGxSZWN0KGdob3N0WCwgaXRlbS50ZXh0QmxvY2sueSwgaXRlbS50ZXh0QmxvY2sueCArIGl0ZW0udGV4dEJsb2NrLndpZHRoIC0gZ2hvc3RYLCBpdGVtLnRleHRCbG9jay5oZWlnaHQpO1xuXG4gICAgICBpdGVtLngxID0gdGhpcy5jaGFydC5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpdGVtLmlkXS54MSA9IGdob3N0WDtcbiAgICAgIGl0ZW0ueTEgPSB0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2l0ZW0uaWRdLnkxID0gaXRlbS50ZXh0QmxvY2sueTtcbiAgICAgIGl0ZW0ueDIgPSB0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2l0ZW0uaWRdLngyID0gaXRlbS50ZXh0QmxvY2sueCArIGl0ZW0udGV4dEJsb2NrLndpZHRoO1xuICAgICAgaXRlbS55MiA9IHRoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaXRlbS5pZF0ueTIgPSBpdGVtLnRleHRCbG9jay55ICsgaXRlbS50ZXh0QmxvY2suaGVpZ2h0O1xuICAgIH1cbiAgICByb3dIZWlnaHQgPSByb3dIZWlnaHQgKyBjb2x1bW5IZWlnaHQ7XG4gIH1cblxuICAvL3RoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAvL3RoaXMuY3R4LmxpbmVXaWR0aCA9IDI7XG4gIC8vdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSBcInJlZFwiO1xuICAvL3RoaXMuY3R4LnJlY3QobGVmdCwgdG9wLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gIC8vdGhpcy5jdHguc3Ryb2tlKCk7XG5cbiAgY29udGFpbmVyLmxheW91dE1hbmFnZXIucmVnaXN0ZXJTcGFjZShwb3NpdGlvbiwgeyB3aWR0aDogdGhpcy53aWR0aCArIDIgKyAyLCBoZWlnaHQ6IHRoaXMuaGVpZ2h0ICsgNSArIDUgfSk7XG5cbiAgdGhpcy5ib3VuZHMgPSB7XG4gICAgeDE6IGxlZnQsIHkxOiB0b3AsIHgyOiBsZWZ0ICsgdGhpcy53aWR0aCwgeTI6IHRvcCArIHRoaXMuaGVpZ2h0XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IExlZ2VuZDtcbiIsIlxuaW1wb3J0IENhbnZhc0pTT2JqZWN0IGZyb20gJy4vY2FudmFzanMnO1xuaW1wb3J0IHtleHRlbmQsIGdldEZvbnRIZWlnaHRJblBpeGVscywgdHJpbVN0cmluZywgZ2V0Rm9udFN0cmluZ30gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmZ1bmN0aW9uIFRleHRCbG9jayhjdHgsIG9wdGlvbnMpIHtcblxuICBUZXh0QmxvY2suYmFzZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIFwiVGV4dEJsb2NrXCIsIG9wdGlvbnMpO1xuXG4gIHRoaXMuY3R4ID0gY3R4O1xuICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcbiAgdGhpcy5fd3JhcHBlZFRleHQgPSBudWxsO1xuICB0aGlzLl9saW5lSGVpZ2h0ID0gZ2V0Rm9udEhlaWdodEluUGl4ZWxzKHRoaXMuZm9udEZhbWlseSwgdGhpcy5mb250U2l6ZSwgdGhpcy5mb250V2VpZ2h0KTtcbn1cblxuZXh0ZW5kKFRleHRCbG9jaywgQ2FudmFzSlNPYmplY3QpO1xuXG5UZXh0QmxvY2sucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChwcmVzZXJ2ZUNvbnRleHQpIHtcbiAgaWYgKHByZXNlcnZlQ29udGV4dClcbiAgICB0aGlzLmN0eC5zYXZlKCk7XG5cbiAgdmFyIGZvbnQgPSB0aGlzLmN0eC5mb250O1xuICB0aGlzLmN0eC50ZXh0QmFzZWxpbmUgPSB0aGlzLnRleHRCYXNlbGluZTtcblxuICB2YXIgb2Zmc2V0WSA9IDA7XG5cbiAgaWYgKHRoaXMuX2lzRGlydHkpXG4gICAgdGhpcy5tZWFzdXJlVGV4dCh0aGlzLmN0eCk7XG5cbiAgdGhpcy5jdHgudHJhbnNsYXRlKHRoaXMueCwgdGhpcy55ICsgb2Zmc2V0WSk7XG5cbiAgaWYgKHRoaXMudGV4dEJhc2VsaW5lID09PSBcIm1pZGRsZVwiKSB7XG4gICAgb2Zmc2V0WSA9IC10aGlzLl9saW5lSGVpZ2h0IC8gMjtcbiAgfVxuXG4gIHRoaXMuY3R4LmZvbnQgPSB0aGlzLl9nZXRGb250U3RyaW5nKCk7XG5cbiAgdGhpcy5jdHgucm90YXRlKE1hdGguUEkgLyAxODAgKiB0aGlzLmFuZ2xlKTtcblxuICB2YXIgdGV4dExlZnQgPSAwO1xuICB2YXIgdGV4dFRvcCA9IHRoaXMucGFkZGluZztcbiAgLy92YXIgdGV4dFRvcCA9IHRoaXMucGFkZGluZztcbiAgdmFyIGxpbmUgPSBudWxsO1xuXG4gIGlmICgodGhpcy5ib3JkZXJUaGlja25lc3MgPiAwICYmIHRoaXMuYm9yZGVyQ29sb3IpIHx8IHRoaXMuYmFja2dyb3VuZENvbG9yKSB7XG4gICAgdGhpcy5jdHgucm91bmRSZWN0KDAsIG9mZnNldFksIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCB0aGlzLmNvcm5lclJhZGl1cywgdGhpcy5ib3JkZXJUaGlja25lc3MsIHRoaXMuYmFja2dyb3VuZENvbG9yLCB0aGlzLmJvcmRlckNvbG9yKTtcblxuICAgIC8vaWYgKHRoaXMudGV4dEJhc2VsaW5lID09PSBcIm1pZGRsZVwiKSB7XG4gICAgLy9cdC8vdGV4dFRvcCArPSB0aGlzLmZvbnRTaXplIC8gMjtcbiAgICAvL1x0dGV4dFRvcCArPSB0aGlzLl9saW5lSGVpZ2h0IC8gMjtcbiAgICAvL31cbiAgfVxuXG4gIHRoaXMuY3R4LmZpbGxTdHlsZSA9IHRoaXMuZm9udENvbG9yO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fd3JhcHBlZFRleHQubGluZXMubGVuZ3RoOyBpKyspIHtcblxuICAgIGxpbmUgPSB0aGlzLl93cmFwcGVkVGV4dC5saW5lc1tpXTtcbiAgICBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwicmlnaHRcIilcbiAgICAgIHRleHRMZWZ0ID0gdGhpcy53aWR0aCAtIGxpbmUud2lkdGggLSB0aGlzLnBhZGRpbmc7XG4gICAgZWxzZSBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwibGVmdFwiKVxuICAgICAgdGV4dExlZnQgPSB0aGlzLnBhZGRpbmc7XG4gICAgZWxzZSBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwiY2VudGVyXCIpXG4gICAgICB0ZXh0TGVmdCA9ICh0aGlzLndpZHRoIC0gdGhpcy5wYWRkaW5nICogMikgLyAyIC0gbGluZS53aWR0aCAvIDIgKyB0aGlzLnBhZGRpbmc7XG5cbiAgICB0aGlzLmN0eC5maWxsVGV4dChsaW5lLnRleHQsIHRleHRMZWZ0LCB0ZXh0VG9wKTtcblxuICAgIHRleHRUb3AgKz0gbGluZS5oZWlnaHQ7XG4gIH1cblxuICB0aGlzLmN0eC5mb250ID0gZm9udDtcblxuICBpZiAocHJlc2VydmVDb250ZXh0KVxuICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbn1cblxuVGV4dEJsb2NrLnByb3RvdHlwZS5zZXRUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG4gIHRoaXMuX3dyYXBwZWRUZXh0ID0gbnVsbDtcbn1cblxuVGV4dEJsb2NrLnByb3RvdHlwZS5tZWFzdXJlVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMubWF4V2lkdGggPT09IG51bGwpIHtcbiAgICB0aHJvdyAoXCJQbGVhc2Ugc2V0IG1heFdpZHRoIGFuZCBoZWlnaHQgZm9yIFRleHRCbG9ja1wiKTtcbiAgfVxuXG4gIHRoaXMuX3dyYXBUZXh0KHRoaXMuY3R4KTtcbiAgdGhpcy5faXNEaXJ0eSA9IGZhbHNlO1xuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHRoaXMud2lkdGgsIGhlaWdodDogdGhpcy5oZWlnaHRcbiAgfVxufVxuXG5UZXh0QmxvY2sucHJvdG90eXBlLl9nZXRMaW5lV2l0aFdpZHRoID0gZnVuY3Rpb24gKHRleHQsIHdpZHRoLCBjbGlwV29yZCkge1xuICB0ZXh0ID0gU3RyaW5nKHRleHQpO1xuICBjbGlwV29yZCA9IGNsaXBXb3JkIHx8IGZhbHNlO1xuXG4gIGlmICghdGV4dClcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogXCJcIiwgd2lkdGg6IDBcbiAgICB9O1xuXG4gIHZhciB0ZXh0V2lkdGggPSAwLFxuICAgIG1pbiA9IDAsXG4gICAgbWF4ID0gdGV4dC5sZW5ndGggLSAxLFxuICAgIG1pZCA9IEluZmluaXR5O1xuXG4gIHRoaXMuY3R4LmZvbnQgPSB0aGlzLl9nZXRGb250U3RyaW5nKCk7XG5cbiAgd2hpbGUgKG1pbiA8PSBtYXgpIHtcbiAgICBtaWQgPSBNYXRoLmZsb29yKChtaW4gKyBtYXgpIC8gMik7XG4gICAgdmFyIHRlbXBUZXh0ID0gdGV4dC5zdWJzdHIoMCwgbWlkICsgMSk7XG5cbiAgICB0ZXh0V2lkdGggPSB0aGlzLmN0eC5tZWFzdXJlVGV4dCh0ZW1wVGV4dCkud2lkdGg7XG5cbiAgICBpZiAodGV4dFdpZHRoIDwgd2lkdGgpIHtcbiAgICAgIG1pbiA9IG1pZCArIDE7XG4gICAgfSBlbHNlIGlmICh0ZXh0V2lkdGggPiB3aWR0aCkge1xuICAgICAgbWF4ID0gbWlkIC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy9lZGdlIGNhc2VzXG4gIGlmICh0ZXh0V2lkdGggPiB3aWR0aCAmJiB0ZW1wVGV4dC5sZW5ndGggPiAxKSB7XG4gICAgdGVtcFRleHQgPSB0ZW1wVGV4dC5zdWJzdHIoMCwgdGVtcFRleHQubGVuZ3RoIC0gMSk7XG4gICAgdGV4dFdpZHRoID0gdGhpcy5jdHgubWVhc3VyZVRleHQodGVtcFRleHQpLndpZHRoO1xuICB9XG5cbiAgdmFyIGlzQ2xpcHBlZCA9IHRydWU7XG5cbiAgaWYgKHRlbXBUZXh0Lmxlbmd0aCA9PT0gdGV4dC5sZW5ndGggfHwgdGV4dFt0ZW1wVGV4dC5sZW5ndGhdID09PSBcIiBcIilcbiAgICBpc0NsaXBwZWQgPSBmYWxzZTtcblxuICBpZiAoaXNDbGlwcGVkKSB7XG4gICAgdmFyIHJlc3VsdFdvcmRzID0gdGVtcFRleHQuc3BsaXQoXCIgXCIpO1xuICAgIGlmIChyZXN1bHRXb3Jkcy5sZW5ndGggPiAxKVxuICAgICAgcmVzdWx0V29yZHMucG9wKCk7XG5cbiAgICB0ZW1wVGV4dCA9IHJlc3VsdFdvcmRzLmpvaW4oXCIgXCIpO1xuICAgIHRleHRXaWR0aCA9IHRoaXMuY3R4Lm1lYXN1cmVUZXh0KHRlbXBUZXh0KS53aWR0aDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGV4dDogdGVtcFRleHQsIHdpZHRoOiB0ZXh0V2lkdGhcbiAgfTtcbn1cblxuVGV4dEJsb2NrLnByb3RvdHlwZS5fd3JhcFRleHQgPSBmdW5jdGlvbiB3cmFwVGV4dCgpIHtcbiAgLy90aGlzLmN0eC5zYXZlKCk7XG4gIHZhciB0ZXh0ID0gbmV3IFN0cmluZyh0cmltU3RyaW5nKFN0cmluZyh0aGlzLnRleHQpKSk7XG4gIHZhciBsaW5lcyA9IFtdO1xuICB2YXIgZm9udCA9IHRoaXMuY3R4LmZvbnQ7IC8vIFNhdmUgdGhlIGN1cnJlbnQgRm9udFxuICB2YXIgaGVpZ2h0ID0gMDtcbiAgdmFyIHdpZHRoID0gMDtcblxuICB0aGlzLmN0eC5mb250ID0gdGhpcy5fZ2V0Rm9udFN0cmluZygpO1xuXG4gIHdoaWxlICh0ZXh0Lmxlbmd0aCA+IDApIHtcblxuICAgIHZhciBtYXhXaWR0aCA9IHRoaXMubWF4V2lkdGggLSB0aGlzLnBhZGRpbmcgKiAyO1xuICAgIHZhciBtYXhIZWlnaHQgPSB0aGlzLm1heEhlaWdodCAtIHRoaXMucGFkZGluZyAqIDI7XG5cbiAgICB2YXIgbGluZSA9IHRoaXMuX2dldExpbmVXaXRoV2lkdGgodGV4dCwgbWF4V2lkdGgsIGZhbHNlKTtcbiAgICBsaW5lLmhlaWdodCA9IHRoaXMuX2xpbmVIZWlnaHQ7XG5cbiAgICBsaW5lcy5wdXNoKGxpbmUpO1xuXG4gICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgbGluZS53aWR0aCk7XG4gICAgaGVpZ2h0ICs9IGxpbmUuaGVpZ2h0O1xuICAgIHRleHQgPSB0cmltU3RyaW5nKHRleHQuc2xpY2UobGluZS50ZXh0Lmxlbmd0aCwgdGV4dC5sZW5ndGgpKTtcblxuICAgIGlmIChtYXhIZWlnaHQgJiYgaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICB2YXIgbGluZSA9IGxpbmVzLnBvcCgpO1xuICAgICAgaGVpZ2h0IC09IGxpbmUuaGVpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuX3dyYXBwZWRUZXh0ID0ge1xuICAgIGxpbmVzOiBsaW5lcywgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodFxuICB9O1xuICB0aGlzLndpZHRoID0gd2lkdGggKyB0aGlzLnBhZGRpbmcgKiAyO1xuICB0aGlzLmhlaWdodCA9IGhlaWdodCArIHRoaXMucGFkZGluZyAqIDI7XG5cbiAgdGhpcy5jdHguZm9udCA9IGZvbnQ7IC8vIFJlc3RvcmUgdGhlIGZvbnRcbn1cblxuVGV4dEJsb2NrLnByb3RvdHlwZS5fZ2V0Rm9udFN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgLy9yZXR1cm4gdGhpcy5mb250U3R5bGUgKyBcIiBcIiArIHRoaXMuZm9udFdlaWdodCArIFwiIFwiICsgdGhpcy5mb250U2l6ZSArIFwicHggXCIgKyB0aGlzLmZvbnRGYW1pbHlcbiAgcmV0dXJuIGdldEZvbnRTdHJpbmcoXCJcIiwgdGhpcywgbnVsbCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRleHRCbG9jaztcbiIsIlxuaW1wb3J0IENhbnZhc0pTT2JqZWN0IGZyb20gJy4vY2FudmFzanMnO1xuaW1wb3J0IFRleHRCbG9jayBmcm9tICcuL3RleHRfYmxvY2snO1xuaW1wb3J0IHtleHRlbmR9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5mdW5jdGlvbiBUaXRsZShjaGFydCwgb3B0aW9ucykge1xuXHRUaXRsZS5iYXNlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgXCJUaXRsZVwiLCBvcHRpb25zLCBjaGFydC50aGVtZSk7XG5cblx0dGhpcy5jaGFydCA9IGNoYXJ0O1xuXHR0aGlzLmNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcblx0dGhpcy5jdHggPSB0aGlzLmNoYXJ0LmN0eDtcblxuXG5cdGlmICh0eXBlb2YgKHRoaXMuX29wdGlvbnMuZm9udFNpemUpID09PSBcInVuZGVmaW5lZFwiKSB7XG5cblx0XHR0aGlzLmZvbnRTaXplID0gdGhpcy5jaGFydC5nZXRBdXRvRm9udFNpemUodGhpcy5mb250U2l6ZSk7XG5cblx0XHQvL3dpbmRvdy5jb25zb2xlLmxvZyhcIkNoYXJ0IFRpdGxlIGZvbnRTaXplOiBcIiArIHRoaXMuZm9udFNpemUpO1xuXHR9XG5cblx0dGhpcy53aWR0aCA9IG51bGwsLy9yZWFkIG9ubHlcblx0dGhpcy5oZWlnaHQgPSBudWxsLy9yZWFkIG9ubHlcblx0dGhpcy5ib3VuZHMgPSB7XG5cdFx0eDE6IG51bGwsIHkxOiBudWxsLCB4MjogbnVsbCwgeTI6IG51bGxcblx0fTtcbn1cblxuZXh0ZW5kKFRpdGxlLCBDYW52YXNKU09iamVjdCk7XG5cblRpdGxlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG5cblx0aWYgKCF0aGlzLnRleHQpIHJldHVybjtcblxuXHR2YXIgY29udGFpbmVyID0gKCF0aGlzLmRvY2tJbnNpZGVQbG90QXJlYSA/IHRoaXMuY2hhcnQgOiB0aGlzLmNoYXJ0LnBsb3RBcmVhKTtcblx0dmFyIGZyZWVzcGFjZSA9IGNvbnRhaW5lci5sYXlvdXRNYW5hZ2VyLmdldEZyZWVTcGFjZSgpO1xuXHR2YXIgbGVmdCA9IGZyZWVzcGFjZS54MTtcblx0dmFyIHRvcCA9IGZyZWVzcGFjZS55MTtcblx0dmFyIGFuZ2xlID0gMDtcblx0dmFyIG1heEhlaWdodCA9IDA7XG5cdHZhciBjb250YWluZXJNYXJnaW4gPSAyOyAvL01hcmdpbiB0b3dhcmRzIHRoZSBjb250YWluZXJcblx0dmFyIHJpZ2h0T2Zmc2V0ID0gdGhpcy5jaGFydC5fbWVudUJ1dHRvbiAmJiB0aGlzLmNoYXJ0LmV4cG9ydEVuYWJsZWQgJiYgdGhpcy52ZXJ0aWNhbEFsaWduID09PSBcInRvcFwiID8gMjIgOiAwOyAvL1NvIHRoYXQgVGl0bGUgZG9lc24ndCBvdmVybGFwIG1lbnUgYnV0dG9uLlxuXG5cdHZhciB0ZXh0QmxvY2tIb3Jpem9udGFsQWxpZ247XG5cdHZhciBwb3NpdGlvbjtcblxuXHRpZiAodGhpcy52ZXJ0aWNhbEFsaWduID09PSBcInRvcFwiIHx8IHRoaXMudmVydGljYWxBbGlnbiA9PT0gXCJib3R0b21cIikge1xuXHRcdGlmICh0aGlzLm1heFdpZHRoID09PSBudWxsKVxuXHRcdFx0dGhpcy5tYXhXaWR0aCA9IGZyZWVzcGFjZS53aWR0aCAtIGNvbnRhaW5lck1hcmdpbiAqIDIgLSByaWdodE9mZnNldCAqICh0aGlzLmhvcml6b250YWxBbGlnbiA9PT0gXCJjZW50ZXJcIiA/IDIgOiAxKTtcblxuXHRcdG1heEhlaWdodCA9IGZyZWVzcGFjZS5oZWlnaHQgKiAuNSAtIHRoaXMubWFyZ2luIC0gY29udGFpbmVyTWFyZ2luO1xuXHRcdGFuZ2xlID0gMDtcblx0fVxuXHRlbHNlIGlmICh0aGlzLnZlcnRpY2FsQWxpZ24gPT09IFwiY2VudGVyXCIpIHtcblxuXHRcdGlmICh0aGlzLmhvcml6b250YWxBbGlnbiA9PT0gXCJsZWZ0XCIgfHwgdGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwicmlnaHRcIikge1xuXHRcdFx0aWYgKHRoaXMubWF4V2lkdGggPT09IG51bGwpXG5cdFx0XHRcdHRoaXMubWF4V2lkdGggPSBmcmVlc3BhY2UuaGVpZ2h0IC0gY29udGFpbmVyTWFyZ2luICogMjtcblxuXHRcdFx0bWF4SGVpZ2h0ID0gZnJlZXNwYWNlLndpZHRoICogLjUgLSB0aGlzLm1hcmdpbiAtIGNvbnRhaW5lck1hcmdpbjtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaG9yaXpvbnRhbEFsaWduID09PSBcImNlbnRlclwiKSB7XG5cdFx0XHRpZiAodGhpcy5tYXhXaWR0aCA9PT0gbnVsbClcblx0XHRcdFx0dGhpcy5tYXhXaWR0aCA9IGZyZWVzcGFjZS53aWR0aCAtIGNvbnRhaW5lck1hcmdpbiAqIDI7XG5cblx0XHRcdG1heEhlaWdodCA9IGZyZWVzcGFjZS5oZWlnaHQgKiAuNSAtIGNvbnRhaW5lck1hcmdpbiAqIDI7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCF0aGlzLndyYXApXG5cdFx0bWF4SGVpZ2h0ID0gTWF0aC5taW4obWF4SGVpZ2h0LCBNYXRoLm1heCh0aGlzLmZvbnRTaXplICogMS41LCB0aGlzLmZvbnRTaXplICsgdGhpcy5wYWRkaW5nICogMi41KSk7XG5cdC8vY29uc29sZS5sb2codGhpcy5tYXhXaWR0aCk7XG5cblx0dmFyIHRleHRCbG9jayA9IG5ldyBUZXh0QmxvY2sodGhpcy5jdHgsIHtcblx0XHRmb250U2l6ZTogdGhpcy5mb250U2l6ZSwgZm9udEZhbWlseTogdGhpcy5mb250RmFtaWx5LCBmb250Q29sb3I6IHRoaXMuZm9udENvbG9yLFxuXHRcdGZvbnRTdHlsZTogdGhpcy5mb250U3R5bGUsIGZvbnRXZWlnaHQ6IHRoaXMuZm9udFdlaWdodCxcblx0XHRob3Jpem9udGFsQWxpZ246IHRoaXMuaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduOiB0aGlzLnZlcnRpY2FsQWxpZ24sXG5cdFx0Ym9yZGVyQ29sb3I6IHRoaXMuYm9yZGVyQ29sb3IsIGJvcmRlclRoaWNrbmVzczogdGhpcy5ib3JkZXJUaGlja25lc3MsXG5cdFx0YmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2tncm91bmRDb2xvcixcblx0XHRtYXhXaWR0aDogdGhpcy5tYXhXaWR0aCwgbWF4SGVpZ2h0OiBtYXhIZWlnaHQsXG5cdFx0Y29ybmVyUmFkaXVzOiB0aGlzLmNvcm5lclJhZGl1cyxcblx0XHR0ZXh0OiB0aGlzLnRleHQsXG5cdFx0cGFkZGluZzogdGhpcy5wYWRkaW5nLFxuXHRcdHRleHRCYXNlbGluZTogXCJ0b3BcIlxuXHR9KTtcblxuXHR2YXIgdGV4dEJsb2NrU2l6ZSA9IHRleHRCbG9jay5tZWFzdXJlVGV4dCgpO1xuXG5cdGlmICh0aGlzLnZlcnRpY2FsQWxpZ24gPT09IFwidG9wXCIgfHwgdGhpcy52ZXJ0aWNhbEFsaWduID09PSBcImJvdHRvbVwiKSB7XG5cblx0XHRpZiAodGhpcy52ZXJ0aWNhbEFsaWduID09PSBcInRvcFwiKSB7XG5cdFx0XHR0b3AgPSBmcmVlc3BhY2UueTEgKyBjb250YWluZXJNYXJnaW47XG5cdFx0XHRwb3NpdGlvbiA9IFwidG9wXCI7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMudmVydGljYWxBbGlnbiA9PT0gXCJib3R0b21cIikge1xuXHRcdFx0dG9wID0gZnJlZXNwYWNlLnkyIC0gY29udGFpbmVyTWFyZ2luIC0gdGV4dEJsb2NrU2l6ZS5oZWlnaHQ7XG5cdFx0XHRwb3NpdGlvbiA9IFwiYm90dG9tXCI7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaG9yaXpvbnRhbEFsaWduID09PSBcImxlZnRcIikge1xuXHRcdFx0bGVmdCA9IGZyZWVzcGFjZS54MSArIGNvbnRhaW5lck1hcmdpbjtcblx0XHR9XG5cdFx0ZWxzZSBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwiY2VudGVyXCIpIHtcblx0XHRcdGxlZnQgPSBmcmVlc3BhY2UueDEgKyBmcmVlc3BhY2Uud2lkdGggLyAyIC0gdGV4dEJsb2NrU2l6ZS53aWR0aCAvIDI7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMuaG9yaXpvbnRhbEFsaWduID09PSBcInJpZ2h0XCIpIHtcblx0XHRcdGxlZnQgPSBmcmVlc3BhY2UueDIgLSBjb250YWluZXJNYXJnaW4gLSB0ZXh0QmxvY2tTaXplLndpZHRoIC0gcmlnaHRPZmZzZXQ7XG5cdFx0fVxuXG5cdFx0dGV4dEJsb2NrSG9yaXpvbnRhbEFsaWduID0gdGhpcy5ob3Jpem9udGFsQWxpZ247XG5cblx0XHR0aGlzLndpZHRoID0gdGV4dEJsb2NrU2l6ZS53aWR0aDtcblx0XHR0aGlzLmhlaWdodCA9IHRleHRCbG9ja1NpemUuaGVpZ2h0O1xuXHR9XG5cdGVsc2UgaWYgKHRoaXMudmVydGljYWxBbGlnbiA9PT0gXCJjZW50ZXJcIikge1xuXG5cdFx0aWYgKHRoaXMuaG9yaXpvbnRhbEFsaWduID09PSBcImxlZnRcIikge1xuXG5cdFx0XHRsZWZ0ID0gZnJlZXNwYWNlLngxICsgY29udGFpbmVyTWFyZ2luO1xuXHRcdFx0dG9wID0gZnJlZXNwYWNlLnkyIC0gY29udGFpbmVyTWFyZ2luIC0gKHRoaXMubWF4V2lkdGggLyAyIC0gdGV4dEJsb2NrU2l6ZS53aWR0aCAvIDIpO1xuXHRcdFx0YW5nbGUgPSAtOTA7XG5cblx0XHRcdHBvc2l0aW9uID0gXCJsZWZ0XCI7XG5cdFx0XHR0aGlzLndpZHRoID0gdGV4dEJsb2NrU2l6ZS5oZWlnaHQ7XG5cdFx0XHR0aGlzLmhlaWdodCA9IHRleHRCbG9ja1NpemUud2lkdGg7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMuaG9yaXpvbnRhbEFsaWduID09PSBcInJpZ2h0XCIpIHtcblx0XHRcdGxlZnQgPSBmcmVlc3BhY2UueDIgLSBjb250YWluZXJNYXJnaW47XG5cdFx0XHR0b3AgPSBmcmVlc3BhY2UueTEgKyBjb250YWluZXJNYXJnaW4gKyAodGhpcy5tYXhXaWR0aCAvIDIgLSB0ZXh0QmxvY2tTaXplLndpZHRoIC8gMik7XG5cdFx0XHRhbmdsZSA9IDkwO1xuXG5cdFx0XHRwb3NpdGlvbiA9IFwicmlnaHRcIjtcblx0XHRcdHRoaXMud2lkdGggPSB0ZXh0QmxvY2tTaXplLmhlaWdodDtcblx0XHRcdHRoaXMuaGVpZ2h0ID0gdGV4dEJsb2NrU2l6ZS53aWR0aDtcblx0XHR9XG5cdFx0ZWxzZSBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwiY2VudGVyXCIpIHtcblx0XHRcdHRvcCA9IGNvbnRhaW5lci55MSArIChjb250YWluZXIuaGVpZ2h0IC8gMiAtIHRleHRCbG9ja1NpemUuaGVpZ2h0IC8gMik7XG5cdFx0XHRsZWZ0ID0gY29udGFpbmVyLngxICsgKGNvbnRhaW5lci53aWR0aCAvIDIgLSB0ZXh0QmxvY2tTaXplLndpZHRoIC8gMik7XG5cblx0XHRcdHBvc2l0aW9uID0gXCJjZW50ZXJcIjtcblx0XHRcdHRoaXMud2lkdGggPSB0ZXh0QmxvY2tTaXplLndpZHRoO1xuXHRcdFx0dGhpcy5oZWlnaHQgPSB0ZXh0QmxvY2tTaXplLmhlaWdodDtcblx0XHR9XG5cblx0XHR0ZXh0QmxvY2tIb3Jpem9udGFsQWxpZ24gPSBcImNlbnRlclwiO1xuXHR9XG5cblx0dGV4dEJsb2NrLnggPSBsZWZ0O1xuXHR0ZXh0QmxvY2sueSA9IHRvcDtcblx0dGV4dEJsb2NrLmFuZ2xlID0gYW5nbGU7XG5cdHRleHRCbG9jay5ob3Jpem9udGFsQWxpZ24gPSB0ZXh0QmxvY2tIb3Jpem9udGFsQWxpZ247XG5cdHRleHRCbG9jay5yZW5kZXIodHJ1ZSk7XG5cblx0Y29udGFpbmVyLmxheW91dE1hbmFnZXIucmVnaXN0ZXJTcGFjZShwb3NpdGlvbiwge1xuXHRcdHdpZHRoOiB0aGlzLndpZHRoICsgKHBvc2l0aW9uID09PSBcImxlZnRcIiB8fCBwb3NpdGlvbiA9PT0gXCJyaWdodFwiID8gdGhpcy5tYXJnaW4gKyBjb250YWluZXJNYXJnaW4gOiAwKSxcblx0XHRoZWlnaHQ6IHRoaXMuaGVpZ2h0ICsgKHBvc2l0aW9uID09PSBcInRvcFwiIHx8IHBvc2l0aW9uID09PSBcImJvdHRvbVwiID8gdGhpcy5tYXJnaW4gKyBjb250YWluZXJNYXJnaW4gOiAwKVxuXHR9KTtcblxuXHR0aGlzLmJvdW5kcyA9IHtcblx0XHR4MTogbGVmdCwgeTE6IHRvcCwgeDI6IGxlZnQgKyB0aGlzLndpZHRoLCB5MjogdG9wICsgdGhpcy5oZWlnaHRcblx0fTtcblxuXHR0aGlzLmN0eC50ZXh0QmFzZWxpbmUgPSBcInRvcFwiO1xufVxuXG5leHBvcnQgZGVmYXVsdCBUaXRsZTtcbiIsIlxuaW1wb3J0IEFuaW1hdGlvbkhlbHBlciBmcm9tICcuLi9oZWxwZXJzL2FuaW1hdG9yJztcbmltcG9ydCBSZW5kZXJIZWxwZXIgZnJvbSAnLi4vaGVscGVycy9yZW5kZXInO1xuaW1wb3J0IENhbnZhc0pTT2JqZWN0IGZyb20gJy4vY2FudmFzanMnO1xuaW1wb3J0IHtleHRlbmQsIGlzQ2FudmFzU3VwcG9ydGVkLCBnZXRPYmplY3RJZCwgZHJhd1JlY3QsIGRyYXdTZWdtZW50fSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZnVuY3Rpb24gVG9vbFRpcChjaGFydCwgb3B0aW9ucywgdGhlbWUpIHtcblxuICBUb29sVGlwLmJhc2UuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBcIlRvb2xUaXBcIiwgb3B0aW9ucywgdGhlbWUpO1xuXG4gIHRoaXMuY2hhcnQgPSBjaGFydDtcbiAgdGhpcy5jYW52YXMgPSBjaGFydC5jYW52YXM7XG4gIHRoaXMuY3R4ID0gdGhpcy5jaGFydC5jdHg7XG4gIHRoaXMuY3VycmVudFNlcmllc0luZGV4ID0gLTE7XG4gIHRoaXMuY3VycmVudERhdGFQb2ludEluZGV4ID0gLTE7XG4gIHRoaXMuX3RpbWVySWQgPSAwO1xuICB0aGlzLl9wcmV2WCA9IE5hTjtcbiAgdGhpcy5fcHJldlkgPSBOYU47XG5cbiAgdGhpcy5faW5pdGlhbGl6ZSgpO1xufVxuXG5leHRlbmQoVG9vbFRpcCwgQ2FudmFzSlNPYmplY3QpO1xuXG5Ub29sVGlwLnByb3RvdHlwZS5faW5pdGlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcblxuICBpZiAodGhpcy5lbmFibGVkKSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiY2FudmFzanMtY2hhcnQtdG9vbHRpcFwiKTtcbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBcImF1dG9cIjtcbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3hTaGFkb3cgPSBcIjFweCAxcHggMnB4IDJweCByZ2JhKDAsMCwwLDAuMSlcIjtcbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggPSBcIjEwMDBcIjtcbiAgICAvL3RoaXMuY29udGFpbmVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgLy90aGlzLmNvbnRhaW5lci5zdHlsZS53aGl0ZVNwYWNlID0gXCJuby13cmFwXCI7XG5cbiAgICB2YXIgdG9vbFRpcEh0bWwgPSBcIjxkaXYgc3R5bGU9XFxcIiB3aWR0aDogYXV0bztcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcImhlaWdodDogYXV0bztcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcIm1pbi13aWR0aDogNTBweDtcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcImxpbmUtaGVpZ2h0OiBhdXRvO1wiO1xuICAgIHRvb2xUaXBIdG1sICs9IFwibWFyZ2luOiAwcHggMHB4IDBweCAwcHg7XCI7XG4gICAgdG9vbFRpcEh0bWwgKz0gXCJwYWRkaW5nOiA1cHg7XCI7XG4gICAgdG9vbFRpcEh0bWwgKz0gXCJmb250LWZhbWlseTogQ2FsaWJyaSwgQXJpYWwsIEdlb3JnaWEsIHNlcmlmO1wiO1xuICAgIHRvb2xUaXBIdG1sICs9IFwiZm9udC13ZWlnaHQ6IG5vcm1hbDtcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcImZvbnQtc3R5bGU6IFwiICsgKGlzQ2FudmFzU3VwcG9ydGVkID8gXCJpdGFsaWM7XCIgOiBcIm5vcm1hbDtcIik7XG4gICAgdG9vbFRpcEh0bWwgKz0gXCJmb250LXNpemU6IDE0cHg7XCI7XG4gICAgdG9vbFRpcEh0bWwgKz0gXCJjb2xvcjogIzAwMDAwMDtcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcInRleHQtc2hhZG93OiAxcHggMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMSk7XCI7XG4gICAgdG9vbFRpcEh0bWwgKz0gXCJ0ZXh0LWFsaWduOiBsZWZ0O1wiO1xuICAgIHRvb2xUaXBIdG1sICs9IFwiYm9yZGVyOiAycHggc29saWQgZ3JheTtcIjtcblxuICAgIC8vT2xkZXIgYnJvd3NlcnMgbGlrZSBJRTgtIGRvbid0IHN1cHBvcnQgYWxwaGEgdmFsdWVzXG4gICAgdG9vbFRpcEh0bWwgKz0gaXNDYW52YXNTdXBwb3J0ZWQgPyBcImJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsLjkpO1wiIDogXCJiYWNrZ3JvdW5kOiByZ2IoMjU1LDI1NSwyNTUpO1wiO1xuXG4gICAgdG9vbFRpcEh0bWwgKz0gXCJ0ZXh0LWluZGVudDogMHB4O1wiO1xuICAgIHRvb2xUaXBIdG1sICs9IFwid2hpdGUtc3BhY2U6IG5vd3JhcDtcIjtcbiAgICAvL3Rvb2xUaXBIdG1sICs9IFwicG9pbnRlci1ldmVudHM6bm9uZTtcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcImJvcmRlci1yYWRpdXM6IDVweDtcIjtcblxuICAgIC8vRGlzYWJsZSBUZXh0IFNlbGVjdGlvblxuICAgIHRvb2xUaXBIdG1sICs9IFwiLW1vei11c2VyLXNlbGVjdDpub25lO1wiO1xuICAgIHRvb2xUaXBIdG1sICs9IFwiLWtodG1sLXVzZXItc2VsZWN0OiBub25lO1wiO1xuICAgIHRvb2xUaXBIdG1sICs9IFwiLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcIi1tcy11c2VyLXNlbGVjdDogbm9uZTtcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcInVzZXItc2VsZWN0OiBub25lO1wiO1xuXG4gICAgLy90b29sVGlwSHRtbCArPSBcIm9wYWNpdHk6IDA7XCI7XG4gICAgLy90b29sVGlwSHRtbCArPSBcImZpbHRlcjogcHJvZ2lkOiBEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChHcmFkaWVudFR5cGUgPSAwLCBzdGFydENvbG9yc3RyID0gJyM0Y2ZmZmZmZicsIGVuZENvbG9yc3RyID0gJyM0Y2ZmZmZmZicpO1wiO1xuXG4gICAgaWYgKCFpc0NhbnZhc1N1cHBvcnRlZCkge1xuICAgICAgLy90b29sVGlwSHRtbCArPSBcIi1tcy1maWx0ZXI6J3Byb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PTkwKSdcIjtcbiAgICAgIC8vLW1zLWZpbHRlcjogXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuU2hhZG93KFN0cmVuZ3RoPTQsIERpcmVjdGlvbj0xMzUsIENvbG9yPScjMDAwMDAwJylcIjtcbiAgICAgIC8qIEZvciBJRSA1LjUgLSA3ICovXG4gICAgICB0b29sVGlwSHRtbCArPSBcImZpbHRlcjogYWxwaGEob3BhY2l0eSA9IDkwKTtcIjtcbiAgICAgIHRvb2xUaXBIdG1sICs9IFwiZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuU2hhZG93KFN0cmVuZ3RoPTMsIERpcmVjdGlvbj0xMzUsIENvbG9yPScjNjY2NjY2Jyk7XCI7XG4gICAgfVxuXG4gICAgdG9vbFRpcEh0bWwgKz0gXCJ9IFxcXCI+IFNhbXBsZSBUb29sdGlwPC9kaXY+XCI7XG5cbiAgICB0aGlzLmNvbnRhaW5lci5pbm5lckhUTUwgPSB0b29sVGlwSHRtbDtcbiAgICB0aGlzLmNvbnRlbnREaXYgPSB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkO1xuXG5cbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3JkZXJSYWRpdXMgPSB0aGlzLmNvbnRlbnREaXYuc3R5bGUuYm9yZGVyUmFkaXVzO1xuICAgIHRoaXMuY2hhcnQuX2NhbnZhc0pTQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgfVxufVxuXG5Ub29sVGlwLnByb3RvdHlwZS5tb3VzZU1vdmVIYW5kbGVyID0gZnVuY3Rpb24gKHgsIHkpIHtcblxuICBpZiAoISh0aGlzLl9sYXN0VXBkYXRlZCAmJiAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSB0aGlzLl9sYXN0VXBkYXRlZCkgPCA0MCkpIHtcbiAgICB0aGlzLl9sYXN0VXBkYXRlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHRoaXMuX3VwZGF0ZVRvb2xUaXAoeCwgeSk7XG4gIH1cbn1cblxuVG9vbFRpcC5wcm90b3R5cGUuX3VwZGF0ZVRvb2xUaXAgPSBmdW5jdGlvbiAobW91c2VYLCBtb3VzZVkpIHtcbiAgLy9yZXR1cm47XG5cbiAgaWYgKHRoaXMuY2hhcnQuZGlzYWJsZVRvb2xUaXApIC8vIERpc2FibGVkIGR1cmluZyBhbmltYXRpb24sIGV0Y1xuICAgIHJldHVybjtcblxuICBpZiAodHlwZW9mIChtb3VzZVgpID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZiAobW91c2VZKSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGlmIChpc05hTih0aGlzLl9wcmV2WCkgfHwgaXNOYU4odGhpcy5fcHJldlkpKVxuICAgICAgcmV0dXJuO1xuICAgIGVsc2Uge1xuICAgICAgbW91c2VYID0gdGhpcy5fcHJldlg7XG4gICAgICBtb3VzZVkgPSB0aGlzLl9wcmV2WTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fcHJldlggPSBtb3VzZVg7XG4gICAgdGhpcy5fcHJldlkgPSBtb3VzZVk7XG4gIH1cblxuXG4gIHZhciBkYXRhUG9pbnQgPSBudWxsO1xuICB2YXIgZGF0YVNlcmllcyA9IG51bGw7XG4gIHZhciB0b29sVGlwQ29udGVudCA9IFwiXCI7XG4gIHZhciBlbnRyaWVzID0gW107XG4gIHZhciB0b29sVGlwUmlnaHQ7XG4gIHZhciB0b29sVGlwQm90dG9tO1xuICB2YXIgeCA9IDA7XG5cbiAgaWYgKHRoaXMuc2hhcmVkICYmIHRoaXMuZW5hYmxlZCAmJiB0aGlzLmNoYXJ0LnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgIT09IFwibm9uZVwiKSB7XG4gICAgLy8gJiYgdGhpcy5jaGFydC5wbG90SW5mby5heGlzUGxhY2VtZW50ICE9PSBcIm5vbmVcIlxuICAgIGlmICh0aGlzLmNoYXJ0LnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcbiAgICAgIHggPSAodGhpcy5jaGFydC5heGlzWC52aWV3cG9ydE1heGltdW0gLSB0aGlzLmNoYXJ0LmF4aXNYLnZpZXdwb3J0TWluaW11bSkgLyB0aGlzLmNoYXJ0LmF4aXNYLmxpbmVDb29yZGluYXRlcy5oZWlnaHQgKiAoKHRoaXMuY2hhcnQuYXhpc1gubGluZUNvb3JkaW5hdGVzLnkyIC0gbW91c2VZKSkgKyB0aGlzLmNoYXJ0LmF4aXNYLnZpZXdwb3J0TWluaW11bTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB4ID0gKHRoaXMuY2hhcnQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gdGhpcy5jaGFydC5heGlzWC52aWV3cG9ydE1pbmltdW0pIC8gdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMud2lkdGggKiAobW91c2VYIC0gdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMueDEpICsgdGhpcy5jaGFydC5heGlzWC52aWV3cG9ydE1pbmltdW07XG4gICAgfVxuXG4gICAgdmFyIG5lYXJieUVudHJpZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGFydC5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZW50cnkgPSB0aGlzLmNoYXJ0LmRhdGFbaV0uZ2V0RGF0YVBvaW50QXRYKHgsIHRydWUpO1xuXG4gICAgICBpZiAoZW50cnkgJiYgZW50cnkuaW5kZXggPj0gMCkge1xuICAgICAgICBlbnRyeS5kYXRhU2VyaWVzID0gdGhpcy5jaGFydC5kYXRhW2ldO1xuXG4gICAgICAgIGlmIChlbnRyeS5kYXRhUG9pbnQueSAhPT0gbnVsbClcbiAgICAgICAgICBuZWFyYnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZWFyYnlFbnRyaWVzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybjtcblxuICAgIG5lYXJieUVudHJpZXMuc29ydChmdW5jdGlvbiAoZW50cnkxLCBlbnRyeTIpIHtcbiAgICAgIHJldHVybiBlbnRyeTEuZGlzdGFuY2UgLSBlbnRyeTIuZGlzdGFuY2U7XG4gICAgfSk7XG5cbiAgICB2YXIgY2xvc2VzdCA9IG5lYXJieUVudHJpZXNbMF07XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbmVhcmJ5RW50cmllcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICBpZiAobmVhcmJ5RW50cmllc1tpXS5kYXRhUG9pbnQueC52YWx1ZU9mKCkgPT09IGNsb3Nlc3QuZGF0YVBvaW50LngudmFsdWVPZigpKVxuICAgICAgICBlbnRyaWVzLnB1c2gobmVhcmJ5RW50cmllc1tpXSk7XG4gICAgfVxuXG4gICAgbmVhcmJ5RW50cmllcyA9IG51bGw7XG5cbiAgfSBlbHNlIHtcblxuICAgIHZhciBkYXRhUG9pbnRJbmZvID0gdGhpcy5jaGFydC5nZXREYXRhUG9pbnRBdFhZKG1vdXNlWCwgbW91c2VZLCB0cnVlKTtcbiAgICAvL2RhdGFQb2ludEluZm8gPSBudWxsO1xuXG4gICAgaWYgKGRhdGFQb2ludEluZm8pIHtcbiAgICAgIHRoaXMuY3VycmVudERhdGFQb2ludEluZGV4ID0gZGF0YVBvaW50SW5mby5kYXRhUG9pbnRJbmRleDtcbiAgICAgIHRoaXMuY3VycmVudFNlcmllc0luZGV4ID0gZGF0YVBvaW50SW5mby5kYXRhU2VyaWVzLmluZGV4O1xuICAgIH0gZWxzZSBpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblxuICAgICAgdmFyIGlkID0gZ2V0T2JqZWN0SWQobW91c2VYLCBtb3VzZVksIHRoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5naG9zdEN0eCk7XG4gICAgICBpZiAoaWQgPiAwICYmIHR5cGVvZiB0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2lkXSAhPT0gXCJ1bmRlZmluZWRcIikgey8vRGF0YVBvaW50L0RhdGFTZXJpZXMgZXZlbnRcbiAgICAgICAgdmFyIGV2ZW50T2JqZWN0ID0gdGhpcy5jaGFydC5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF07XG5cbiAgICAgICAgaWYgKGV2ZW50T2JqZWN0Lm9iamVjdFR5cGUgPT09IFwibGVnZW5kSXRlbVwiKVxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvL2lmICh0aGlzLmN1cnJlbnRTZXJpZXNJbmRleCA9PT0gZXZlbnRPYmplY3QuZGF0YVNlcmllc0luZGV4ICYmIHRoaXMuY3VycmVudERhdGFQb2ludEluZGV4ID09PSBldmVudE9iamVjdC5kYXRhUG9pbnRJbmRleClcbiAgICAgICAgLy8gIHJldHVybjtcbiAgICAgICAgLy9lbHNlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VyaWVzSW5kZXggPSBldmVudE9iamVjdC5kYXRhU2VyaWVzSW5kZXg7XG4gICAgICAgIHRoaXMuY3VycmVudERhdGFQb2ludEluZGV4ID0gZXZlbnRPYmplY3QuZGF0YVBvaW50SW5kZXggPj0gMCA/IGV2ZW50T2JqZWN0LmRhdGFQb2ludEluZGV4IDogLTE7XG4gICAgICAgIC8vfVxuXG4gICAgICAgIC8vd2luZG93LmNvbnNvbGUubG9nKFwiaWQ6IFwiICsgaWQgKyBcIjsgaGV4OiBcIiArIGludFRvSGV4Q29sb3JTdHJpbmcoaWQpKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICB0aGlzLmN1cnJlbnREYXRhUG9pbnRJbmRleCA9IC0xO1xuXG4gICAgfSBlbHNlXG4gICAgICB0aGlzLmN1cnJlbnREYXRhUG9pbnRJbmRleCA9IC0xO1xuXG5cbiAgICBpZiAodGhpcy5jdXJyZW50U2VyaWVzSW5kZXggPj0gMCkge1xuXG4gICAgICBkYXRhU2VyaWVzID0gdGhpcy5jaGFydC5kYXRhW3RoaXMuY3VycmVudFNlcmllc0luZGV4XTtcblxuICAgICAgdmFyIGVudHJ5ID0ge1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuY3VycmVudERhdGFQb2ludEluZGV4ID49IDApIHtcbiAgICAgICAgZGF0YVBvaW50ID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW3RoaXMuY3VycmVudERhdGFQb2ludEluZGV4XTtcblxuICAgICAgICBlbnRyeS5kYXRhU2VyaWVzID0gZGF0YVNlcmllcztcbiAgICAgICAgZW50cnkuZGF0YVBvaW50ID0gZGF0YVBvaW50O1xuICAgICAgICBlbnRyeS5pbmRleCA9IHRoaXMuY3VycmVudERhdGFQb2ludEluZGV4O1xuICAgICAgICBlbnRyeS5kaXN0YW5jZSA9IE1hdGguYWJzKGRhdGFQb2ludC54IC0geCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZW5hYmxlZCAmJiAoZGF0YVNlcmllcy50eXBlID09PSBcImxpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcExpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3BsaW5lXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcEFyZWFcIlxuICAgICAgICAgIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzcGxpbmVBcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRBcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRBcmVhMTAwXCJcbiAgICAgICAgICB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwicmFuZ2VBcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInJhbmdlU3BsaW5lQXJlYVwiXG4gICAgICAgICAgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImNhbmRsZXN0aWNrXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcIm9obGNcIikpIHtcblxuICAgICAgICAvL3ZhciB4ID0gKHRoaXMuY2hhcnQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gdGhpcy5jaGFydC5heGlzWC52aWV3cG9ydE1pbmltdW0pIC8gdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMud2lkdGggKiAobW91c2VYIC0gdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMueDEpICsgdGhpcy5jaGFydC5heGlzWC52aWV3cG9ydE1pbmltdW0udmFsdWVPZigpO1xuICAgICAgICB2YXIgeCA9IGRhdGFTZXJpZXMuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSArIChtb3VzZVggLSBkYXRhU2VyaWVzLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSkgLyBkYXRhU2VyaWVzLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdDtcblxuXG4gICAgICAgIGVudHJ5ID0gZGF0YVNlcmllcy5nZXREYXRhUG9pbnRBdFgoeCwgdHJ1ZSk7XG4gICAgICAgIGVudHJ5LmRhdGFTZXJpZXMgPSBkYXRhU2VyaWVzO1xuICAgICAgICB0aGlzLmN1cnJlbnREYXRhUG9pbnRJbmRleCA9IGVudHJ5LmluZGV4O1xuICAgICAgICBkYXRhUG9pbnQgPSBlbnRyeS5kYXRhUG9pbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvL3RoaXMuaGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnRyeS5kYXRhUG9pbnQueSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoZW50cnkuZGF0YVNlcmllcy5heGlzWSkge1xuICAgICAgICAgIGlmIChlbnRyeS5kYXRhUG9pbnQueS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgdW5ib3VuZFRvVmlld3BvcnQgPSAwO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyeS5kYXRhUG9pbnQueS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGFQb2ludC55W2ldIDwgZW50cnkuZGF0YVNlcmllcy5heGlzWS52aWV3cG9ydE1pbmltdW0pXG4gICAgICAgICAgICAgICAgdW5ib3VuZFRvVmlld3BvcnQtLTtcbiAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cnkuZGF0YVBvaW50LnlbaV0gPiBlbnRyeS5kYXRhU2VyaWVzLmF4aXNZLnZpZXdwb3J0TWF4aW11bSlcbiAgICAgICAgICAgICAgICB1bmJvdW5kVG9WaWV3cG9ydCsrO1xuICAgICAgICAgICAgaWYgKHVuYm91bmRUb1ZpZXdwb3J0IDwgZW50cnkuZGF0YVBvaW50LnkubGVuZ3RoICYmIHVuYm91bmRUb1ZpZXdwb3J0ID4gLWVudHJ5LmRhdGFQb2ludC55Lmxlbmd0aClcbiAgICAgICAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGFQb2ludC55ID49IGVudHJ5LmRhdGFTZXJpZXMuYXhpc1kudmlld3BvcnRNaW5pbXVtICYmIGVudHJ5LmRhdGFQb2ludC55IDw9IGVudHJ5LmRhdGFTZXJpZXMuYXhpc1kudmlld3BvcnRNYXhpbXVtKVxuICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlXG4gICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgfVxuXG4gICAgfVxuICB9XG5cblxuICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG5cbiAgICB0aGlzLmhpZ2hsaWdodE9iamVjdHMoZW50cmllcyk7XG5cbiAgICBpZiAodGhpcy5lbmFibGVkKSB7XG5cbiAgICAgIHZhciB0b29sVGlwSW5uZXJIdG1sID0gXCJcIjtcblxuICAgICAgdG9vbFRpcElubmVySHRtbCA9IHRoaXMuZ2V0VG9vbFRpcElubmVySFRNTCh7IGVudHJpZXM6IGVudHJpZXMgfSk7XG5cbiAgICAgIGlmICh0b29sVGlwSW5uZXJIdG1sICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuY29udGVudERpdi5pbm5lckhUTUwgPSB0b29sVGlwSW5uZXJIdG1sO1xuXG4gICAgICAgIHRoaXMuY29udGVudERpdi5pbm5lckhUTUwgPSB0b29sVGlwSW5uZXJIdG1sO1xuXG4gICAgICAgIHZhciBwcmV2aW91c2x5SGlkZGVuID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIikge1xuICAgICAgICAgIHByZXZpb3VzbHlIaWRkZW4gPSB0cnVlO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuY29udGVudERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPyB0aGlzLmJhY2tncm91bmRDb2xvciA6IGlzQ2FudmFzU3VwcG9ydGVkID8gXCJyZ2JhKDI1NSwyNTUsMjU1LC45KVwiIDogXCJyZ2IoMjU1LDI1NSwyNTUpXCI7XG5cbiAgICAgICAgICB0aGlzLmNvbnRlbnREaXYuc3R5bGUuYm9yZGVyUmlnaHRDb2xvciA9IHRoaXMuY29udGVudERpdi5zdHlsZS5ib3JkZXJMZWZ0Q29sb3IgPSB0aGlzLmNvbnRlbnREaXYuc3R5bGUuYm9yZGVyQ29sb3IgPSB0aGlzLmJvcmRlckNvbG9yID8gdGhpcy5ib3JkZXJDb2xvciA6IGVudHJpZXNbMF0uZGF0YVBvaW50LmNvbG9yID8gZW50cmllc1swXS5kYXRhUG9pbnQuY29sb3IgOiBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuY29sb3IgPyBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuY29sb3IgOiBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuX2NvbG9yU2V0W2VudHJpZXNbMF0uaW5kZXggJSBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cbiAgICAgICAgICB0aGlzLmNvbnRlbnREaXYuc3R5bGUuYm9yZGVyV2lkdGggPSAodGhpcy5ib3JkZXJUaGlja25lc3MgfHwgdGhpcy5ib3JkZXJUaGlja25lc3MgPT09IDApID8gdGhpcy5ib3JkZXJUaGlja25lc3MgKyBcInB4XCIgOiAyICsgXCJweFwiO1xuXG4gICAgICAgICAgdGhpcy5jb250ZW50RGl2LnN0eWxlLmJvcmRlclJhZGl1cyA9ICh0aGlzLmNvcm5lclJhZGl1cyB8fCB0aGlzLmNvcm5lclJhZGl1cyA9PT0gMCkgPyB0aGlzLmNvcm5lclJhZGl1cyArIFwicHhcIiA6IDUgKyBcInB4XCI7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuYm9yZGVyUmFkaXVzID0gdGhpcy5jb250ZW50RGl2LnN0eWxlLmJvcmRlclJhZGl1cztcblxuXG4gICAgICAgICAgdGhpcy5jb250ZW50RGl2LnN0eWxlLmZvbnRTaXplID0gKHRoaXMuZm9udFNpemUgfHwgdGhpcy5mb250U2l6ZSA9PT0gMCkgPyB0aGlzLmZvbnRTaXplICsgXCJweFwiIDogMTQgKyBcInB4XCI7XG4gICAgICAgICAgdGhpcy5jb250ZW50RGl2LnN0eWxlLmNvbG9yID0gdGhpcy5mb250Q29sb3IgPyB0aGlzLmZvbnRDb2xvciA6IFwiIzAwMDAwMFwiO1xuICAgICAgICAgIHRoaXMuY29udGVudERpdi5zdHlsZS5mb250RmFtaWx5ID0gdGhpcy5mb250RmFtaWx5ID8gdGhpcy5mb250RmFtaWx5IDogXCJDYWxpYnJpLCBBcmlhbCwgR2VvcmdpYSwgc2VyaWY7XCI7XG4gICAgICAgICAgdGhpcy5jb250ZW50RGl2LnN0eWxlLmZvbnRXZWlnaHQgPSB0aGlzLmZvbnRXZWlnaHQgPyB0aGlzLmZvbnRXZWlnaHQgOiBcIm5vcm1hbFwiO1xuICAgICAgICAgIHRoaXMuY29udGVudERpdi5zdHlsZS5mb250U3R5bGUgPSB0aGlzLmZvbnRTdHlsZSA/IHRoaXMuZm9udFN0eWxlIDogaXNDYW52YXNTdXBwb3J0ZWQgPyBcIml0YWxpY1wiIDogXCJub3JtYWxcIjtcblxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdG9vbFRpcExlZnQ7XG5cbiAgICAgICAgaWYgKGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcInBpZVwiIHx8IGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcImRvdWdobnV0XCIgfHwgZW50cmllc1swXS5kYXRhU2VyaWVzLnR5cGUgPT09IFwiZnVubmVsXCIgfHwgZW50cmllc1swXS5kYXRhU2VyaWVzLnR5cGUgPT09IFwiYmFyXCIgfHwgZW50cmllc1swXS5kYXRhU2VyaWVzLnR5cGUgPT09IFwicmFuZ2VCYXJcIiB8fCBlbnRyaWVzWzBdLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQmFyXCIgfHwgZW50cmllc1swXS5kYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEJhcjEwMFwiKSB7XG4gICAgICAgICAgdG9vbFRpcExlZnQgPSBtb3VzZVggLSAxMCAtIHRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vdG9vbFRpcExlZnQgPSAoKCh0aGlzLmNoYXJ0LmF4aXNYLmxpbmVDb29yZGluYXRlcy53aWR0aCAvIE1hdGguYWJzKHRoaXMuY2hhcnQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gdGhpcy5jaGFydC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKGVudHJpZXNbMF0uZGF0YVBvaW50LnggLSB0aGlzLmNoYXJ0LmF4aXNYLnZpZXdwb3J0TWluaW11bSkpICsgdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMueDEgKyAuNSkgLSB0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCA8PCAwO1xuICAgICAgICAgIHRvb2xUaXBMZWZ0ID0gZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIGVudHJpZXNbMF0uZGF0YVNlcmllcy5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZW50cmllc1swXS5kYXRhUG9pbnQueCAtIGVudHJpZXNbMF0uZGF0YVNlcmllcy5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSAtIHRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoIDw8IDA7XG4gICAgICAgICAgdG9vbFRpcExlZnQgLT0gMTA7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmICh0b29sVGlwTGVmdCA8IDApIHtcbiAgICAgICAgICB0b29sVGlwTGVmdCArPSB0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCArIDIwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRvb2xUaXBMZWZ0ICsgdGhpcy5jb250YWluZXIuY2xpZW50V2lkdGggPiB0aGlzLmNoYXJ0Ll9jb250YWluZXIuY2xpZW50V2lkdGgpXG4gICAgICAgICAgdG9vbFRpcExlZnQgPSBNYXRoLm1heCgwLCB0aGlzLmNoYXJ0Ll9jb250YWluZXIuY2xpZW50V2lkdGggLSB0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCk7XG5cbiAgICAgICAgdG9vbFRpcExlZnQgKz0gXCJweFwiO1xuXG4gICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5zaGFyZWQgJiYgKGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcImxpbmVcIiB8fCBlbnRyaWVzWzBdLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGVwTGluZVwiIHx8IGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcInNwbGluZVwiIHx8IGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcImFyZWFcIiB8fCBlbnRyaWVzWzBdLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGVwQXJlYVwiIHx8IGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcInNwbGluZUFyZWFcIiB8fCBlbnRyaWVzWzBdLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQXJlYVwiIHx8IGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRBcmVhMTAwXCIpKSB7XG4gICAgICAgICAgLy90b29sVGlwQm90dG9tID0gKGVudHJpZXNbMF0uZGF0YVNlcmllcy5heGlzWS5saW5lQ29vcmRpbmF0ZXMueTIgLSBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuYXhpc1kubGluZUNvb3JkaW5hdGVzLmhlaWdodCAvIE1hdGguYWJzKGVudHJpZXNbMF0uZGF0YVNlcmllcy5heGlzWS5tYXhpbXVtIC0gZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNZLnZpZXdwb3J0TWluaW11bSkgKiBNYXRoLmFicyhlbnRyaWVzWzBdLmRhdGFQb2ludC55IC0gZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNZLnZpZXdwb3J0TWluaW11bSkgKyAuNSkgPDwgMDtcbiAgICAgICAgICB0b29sVGlwQm90dG9tID0gZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIGVudHJpZXNbMF0uZGF0YVNlcmllcy5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZW50cmllc1swXS5kYXRhUG9pbnQueSAtIGVudHJpZXNbMF0uZGF0YVNlcmllcy5heGlzWS52aWV3cG9ydE1pbmltdW0pICsgLjUgPDwgMDtcbiAgICAgICAgfSBlbHNlIGlmIChlbnRyaWVzWzBdLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJiYXJcIiB8fCBlbnRyaWVzWzBdLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJyYW5nZUJhclwiIHx8IGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRCYXJcIiB8fCBlbnRyaWVzWzBdLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQmFyMTAwXCIpIHtcbiAgICAgICAgICAvL3Rvb2xUaXBCb3R0b20gPSAoZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNYLmxpbmVDb29yZGluYXRlcy55MiAtIGVudHJpZXNbMF0uZGF0YVNlcmllcy5heGlzWC5saW5lQ29vcmRpbmF0ZXMuaGVpZ2h0IC8gTWF0aC5hYnMoZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNYLm1heGltdW0gLSBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuYXhpc1gudmlld3BvcnRNaW5pbXVtKSAqIE1hdGguYWJzKGVudHJpZXNbMF0uZGF0YVBvaW50LnggLSBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuYXhpc1gudmlld3BvcnRNaW5pbXVtKSArIC41KSA8PCAwO1xuICAgICAgICAgIHRvb2xUaXBCb3R0b20gPSBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChlbnRyaWVzWzBdLmRhdGFQb2ludC54IC0gZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNYLnZpZXdwb3J0TWluaW11bSkgKyAuNSA8PCAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRvb2xUaXBCb3R0b20gPSBtb3VzZVk7XG4gICAgICAgIH1cblxuICAgICAgICB0b29sVGlwQm90dG9tID0gKC10b29sVGlwQm90dG9tICsgMTApO1xuXG4gICAgICAgIGlmICh0b29sVGlwQm90dG9tICsgdGhpcy5jb250YWluZXIuY2xpZW50SGVpZ2h0ICsgNSA+IDApIHtcbiAgICAgICAgICB0b29sVGlwQm90dG9tIC09IHRvb2xUaXBCb3R0b20gKyB0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQgKyA1IC0gMFxuICAgICAgICB9XG5cbiAgICAgICAgdG9vbFRpcEJvdHRvbSArPSBcInB4XCI7XG5cbiAgICAgICAgLy90aGlzLmNvbnRhaW5lci5zdHlsZS5yaWdodCA9IHRvb2xUaXBSaWdodDtcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9IHRvb2xUaXBMZWZ0O1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSB0b29sVGlwQm90dG9tO1xuXG4gICAgICAgIGlmICghdGhpcy5hbmltYXRpb25FbmFibGVkIHx8IHByZXZpb3VzbHlIaWRkZW4pIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVBbmltYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpcy5lbmFibGVBbmltYXRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlkZShmYWxzZSk7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICAvL2lmIChpc0RlYnVnTW9kZSlcbiAgICAvLyAgY29uc29sZS5sb2coXCJzZWFyY2hYOiBcIiArIHggKyBcIiB4OiBcIiArIHNlYXJjaFJlc3VsdC5kYXRhUG9pbnQueCArIFwiOyB5OiBcIiArIHNlYXJjaFJlc3VsdC5kYXRhUG9pbnQueSArIFwiOyBkaXN0YW5jZTogXCIgKyBzZWFyY2hSZXN1bHQuZGlzdGFuY2UgKyBcIjsgc3RlcHM6IFwiICsgc3RlcHMpO1xuICB9XG59XG5cblxuVG9vbFRpcC5wcm90b3R5cGUuaGlnaGxpZ2h0T2JqZWN0cyA9IGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gIC8vaWYgKCF0aGlzLmVuYWJsZWQpXG4gIC8vXHRyZXR1cm47XG5cbiAgLy90aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzQ3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzLndpZHRoLCB0aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzLmhlaWdodCk7XG4gIHZhciBvdmVybGFpZENhbnZhc0N0eCA9IHRoaXMuY2hhcnQub3ZlcmxhaWRDYW52YXNDdHg7XG4gIHRoaXMuY2hhcnQucmVzZXRPdmVybGF5ZWRDYW52YXMoKTtcblxuICBvdmVybGFpZENhbnZhc0N0eC5jbGVhclJlY3QoMCwwLHRoaXMuY2hhcnQud2lkdGgsIHRoaXMuY2hhcnQuaGVpZ2h0KTtcbiAgb3ZlcmxhaWRDYW52YXNDdHguc2F2ZSgpO1xuXG5cbiAgdmFyIHBsb3RBcmVhID0gdGhpcy5jaGFydC5wbG90QXJlYTtcbiAgdmFyIG9mZnNldCA9IDA7XG5cbiAgb3ZlcmxhaWRDYW52YXNDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLngyIC0gcGxvdEFyZWEueDEsIHBsb3RBcmVhLnkyIC0gcGxvdEFyZWEueTEpO1xuICBvdmVybGFpZENhbnZhc0N0eC5jbGlwKCk7XG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcblxuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaV07XG5cbiAgICB2YXIgZXZlbnRPYmplY3QgPSB0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2VudHJ5LmRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2VudHJ5LmluZGV4XV07XG5cbiAgICBpZiAoIWV2ZW50T2JqZWN0IHx8ICFldmVudE9iamVjdC5vYmplY3RUeXBlIHx8IGV2ZW50T2JqZWN0Lm9iamVjdFR5cGUgIT09IFwiZGF0YVBvaW50XCIpXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBkYXRhU2VyaWVzID0gdGhpcy5jaGFydC5kYXRhW2V2ZW50T2JqZWN0LmRhdGFTZXJpZXNJbmRleF07XG4gICAgdmFyIGRhdGFQb2ludCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tldmVudE9iamVjdC5kYXRhUG9pbnRJbmRleF07XG4gICAgdmFyIGluZGV4ID0gZXZlbnRPYmplY3QuZGF0YVBvaW50SW5kZXg7XG5cbiAgICBpZiAoZGF0YVBvaW50LmhpZ2hsaWdodEVuYWJsZWQgIT09IGZhbHNlICYmIChkYXRhU2VyaWVzLmhpZ2hsaWdodEVuYWJsZWQgPT09IHRydWUgfHwgZGF0YVBvaW50LmhpZ2hsaWdodEVuYWJsZWQgPT09IHRydWUpKSB7XG5cbiAgICAgIGlmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwibGluZVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGVwTGluZVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzcGxpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic2NhdHRlclwiXG4gICAgICAgIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJhcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0ZXBBcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInNwbGluZUFyZWFcIlxuICAgICAgICB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEFyZWExMDBcIlxuICAgICAgICB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwicmFuZ2VBcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInJhbmdlU3BsaW5lQXJlYVwiKSB7XG4gICAgICAgIHZhciBtYXJrZXJQcm9wcyA9IGRhdGFTZXJpZXMuZ2V0TWFya2VyUHJvcGVydGllcyhpbmRleCwgZXZlbnRPYmplY3QueDEsIGV2ZW50T2JqZWN0LnkxLCB0aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzQ3R4KTtcbiAgICAgICAgbWFya2VyUHJvcHMuc2l6ZSA9IE1hdGgubWF4KG1hcmtlclByb3BzLnNpemUgKiAxLjUgPDwgMCwgMTApO1xuXG4gICAgICAgIG1hcmtlclByb3BzLmJvcmRlckNvbG9yID0gbWFya2VyUHJvcHMuYm9yZGVyQ29sb3IgfHwgXCIjRkZGRkZGXCI7XG4gICAgICAgIG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzcyA9IG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzcyB8fCBNYXRoLmNlaWwobWFya2VyUHJvcHMuc2l6ZSAqIC4xKTtcblxuICAgICAgICAvL292ZXJsYWlkQ2FudmFzQ3R4Lmdsb2JhbEFscGhhID0gLjg7XG4gICAgICAgIFJlbmRlckhlbHBlci5kcmF3TWFya2VycyhbbWFya2VyUHJvcHNdKTtcbiAgICAgICAgLy9vdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYSA9IC44O1xuXG4gICAgICAgIGlmICh0eXBlb2YgKGV2ZW50T2JqZWN0LnkyKSAhPT0gXCJ1bmRlZmluZWRcIikge1xuXG4gICAgICAgICAgdmFyIG1hcmtlclByb3BzID0gZGF0YVNlcmllcy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGluZGV4LCBldmVudE9iamVjdC54MSwgZXZlbnRPYmplY3QueTIsIHRoaXMuY2hhcnQub3ZlcmxhaWRDYW52YXNDdHgpO1xuICAgICAgICAgIG1hcmtlclByb3BzLnNpemUgPSBNYXRoLm1heChtYXJrZXJQcm9wcy5zaXplICogMS41IDw8IDAsIDEwKTtcblxuICAgICAgICAgIG1hcmtlclByb3BzLmJvcmRlckNvbG9yID0gbWFya2VyUHJvcHMuYm9yZGVyQ29sb3IgfHwgXCIjRkZGRkZGXCI7XG4gICAgICAgICAgbWFya2VyUHJvcHMuYm9yZGVyVGhpY2tuZXNzID0gbWFya2VyUHJvcHMuYm9yZGVyVGhpY2tuZXNzIHx8IE1hdGguY2VpbChtYXJrZXJQcm9wcy5zaXplICogLjEpO1xuXG4gICAgICAgICAgLy9vdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYSA9IC44O1xuICAgICAgICAgIFJlbmRlckhlbHBlci5kcmF3TWFya2VycyhbbWFya2VyUHJvcHNdKTtcbiAgICAgICAgICAvL292ZXJsYWlkQ2FudmFzQ3R4Lmdsb2JhbEFscGhhID0gLjg7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImJ1YmJsZVwiKSB7XG4gICAgICAgIHZhciBtYXJrZXJQcm9wcyA9IGRhdGFTZXJpZXMuZ2V0TWFya2VyUHJvcGVydGllcyhpbmRleCwgZXZlbnRPYmplY3QueDEsIGV2ZW50T2JqZWN0LnkxLCB0aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzQ3R4KTtcbiAgICAgICAgbWFya2VyUHJvcHMuc2l6ZSA9IGV2ZW50T2JqZWN0LnNpemU7XG4gICAgICAgIG1hcmtlclByb3BzLmNvbG9yID0gXCJ3aGl0ZVwiO1xuICAgICAgICBtYXJrZXJQcm9wcy5ib3JkZXJDb2xvciA9IFwid2hpdGVcIjtcbiAgICAgICAgLy9tYXJrZXJQcm9wcy5ib3JkZXJUaGlja25lc3MgPSAyO1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYSA9IC4zO1xuICAgICAgICBSZW5kZXJIZWxwZXIuZHJhd01hcmtlcnMoW21hcmtlclByb3BzXSk7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4Lmdsb2JhbEFscGhhID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImNvbHVtblwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRDb2x1bW4xMDBcIlxuICAgICAgICB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwiYmFyXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInJhbmdlQmFyXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRCYXJcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEJhcjEwMFwiXG4gICAgICAgIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJyYW5nZUNvbHVtblwiKSB7XG4gICAgICAgIGRyYXdSZWN0KG92ZXJsYWlkQ2FudmFzQ3R4LCBldmVudE9iamVjdC54MSwgZXZlbnRPYmplY3QueTEsIGV2ZW50T2JqZWN0LngyLCBldmVudE9iamVjdC55MiwgXCJ3aGl0ZVwiLCAwLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgLjMpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcInBpZVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJkb3VnaG51dFwiKSB7XG4gICAgICAgIGRyYXdTZWdtZW50KG92ZXJsYWlkQ2FudmFzQ3R4LCBldmVudE9iamVjdC5jZW50ZXIsIGV2ZW50T2JqZWN0LnJhZGl1cywgXCJ3aGl0ZVwiLCBkYXRhU2VyaWVzLnR5cGUsIGV2ZW50T2JqZWN0LnN0YXJ0QW5nbGUsIGV2ZW50T2JqZWN0LmVuZEFuZ2xlLCAuMywgZXZlbnRPYmplY3QucGVyY2VudElubmVyUmFkaXVzKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImNhbmRsZXN0aWNrXCIpIHtcblxuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4LnN0cm9rZVN0eWxlID0gZXZlbnRPYmplY3QuY29sb3I7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4LmxpbmVXaWR0aCA9IGV2ZW50T2JqZWN0LmJvcmRlclRoaWNrbmVzcyAqIDI7XG4gICAgICAgIG9mZnNldCA9IChvdmVybGFpZENhbnZhc0N0eC5saW5lV2lkdGgpICUgMiA9PT0gMCA/IDAgOiAuNTtcblxuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHgubW92ZVRvKGV2ZW50T2JqZWN0LngzIC0gb2Zmc2V0LCBldmVudE9iamVjdC55Mik7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4LmxpbmVUbyhldmVudE9iamVjdC54MyAtIG9mZnNldCwgTWF0aC5taW4oZXZlbnRPYmplY3QueTEsIGV2ZW50T2JqZWN0Lnk0KSk7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4LnN0cm9rZSgpO1xuXG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5tb3ZlVG8oZXZlbnRPYmplY3QueDMgLSBvZmZzZXQsIE1hdGgubWF4KGV2ZW50T2JqZWN0LnkxLCBldmVudE9iamVjdC55NCkpO1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5saW5lVG8oZXZlbnRPYmplY3QueDMgLSBvZmZzZXQsIGV2ZW50T2JqZWN0LnkzKTtcbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguc3Ryb2tlKCk7XG5cbiAgICAgICAgZHJhd1JlY3Qob3ZlcmxhaWRDYW52YXNDdHgsIGV2ZW50T2JqZWN0LngxLCBNYXRoLm1pbihldmVudE9iamVjdC55MSwgZXZlbnRPYmplY3QueTQpLCBldmVudE9iamVjdC54MiwgTWF0aC5tYXgoZXZlbnRPYmplY3QueTEsIGV2ZW50T2JqZWN0Lnk0KSwgXCJ0cmFuc3BhcmVudFwiLCBldmVudE9iamVjdC5ib3JkZXJUaGlja25lc3MgKiAyLCBldmVudE9iamVjdC5jb2xvciwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYSA9IDE7XG5cbiAgICAgIH0gZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcIm9obGNcIikge1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYSA9IDE7XG5cbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguc3Ryb2tlU3R5bGUgPSBldmVudE9iamVjdC5jb2xvcjtcbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHgubGluZVdpZHRoID0gZXZlbnRPYmplY3QuYm9yZGVyVGhpY2tuZXNzICogMjtcblxuICAgICAgICBvZmZzZXQgPSAob3ZlcmxhaWRDYW52YXNDdHgubGluZVdpZHRoKSAlIDIgPT09IDAgPyAwIDogLjU7XG5cbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4Lm1vdmVUbyhldmVudE9iamVjdC54MyAtIG9mZnNldCwgZXZlbnRPYmplY3QueTIpO1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5saW5lVG8oZXZlbnRPYmplY3QueDMgLSBvZmZzZXQsIGV2ZW50T2JqZWN0LnkzKTtcbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguc3Ryb2tlKCk7XG5cbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4Lm1vdmVUbyhldmVudE9iamVjdC54MywgZXZlbnRPYmplY3QueTEpO1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5saW5lVG8oZXZlbnRPYmplY3QueDEsIGV2ZW50T2JqZWN0LnkxKTtcbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguc3Ryb2tlKCk7XG5cbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4Lm1vdmVUbyhldmVudE9iamVjdC54MywgZXZlbnRPYmplY3QueTQpO1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5saW5lVG8oZXZlbnRPYmplY3QueDIsIGV2ZW50T2JqZWN0Lnk0KTtcbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguc3Ryb2tlKCk7XG5cbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3ZlcmxhaWRDYW52YXNDdHgucmVzdG9yZSgpO1xuICBvdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYSA9IDE7XG4gIG92ZXJsYWlkQ2FudmFzQ3R4LmJlZ2luUGF0aCgpO1xuXG4gIHJldHVybjtcbn1cblxuVG9vbFRpcC5wcm90b3R5cGUuZ2V0VG9vbFRpcElubmVySFRNTCA9IGZ1bmN0aW9uIChlKSB7XG4gIHZhciBlbnRyaWVzID0gZS5lbnRyaWVzO1xuICB2YXIgdG9vbFRpcElubmVySHRtbCA9IG51bGw7XG4gIHZhciBkYXRhU2VyaWVzID0gbnVsbDtcbiAgdmFyIGRhdGFQb2ludCA9IG51bGw7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBjb2xvciA9IG51bGw7XG4gIHZhciB0b29sVGlwQ29udGVudCA9IFwiXCI7XG5cbiAgdmFyIGlzVG9vbFRpcERlZmluZWRJbkRhdGEgPSB0cnVlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZW50cmllc1tpXS5kYXRhU2VyaWVzLnRvb2xUaXBDb250ZW50IHx8IGVudHJpZXNbaV0uZGF0YVBvaW50LnRvb2xUaXBDb250ZW50KSB7XG4gICAgICBpc1Rvb2xUaXBEZWZpbmVkSW5EYXRhID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoaXNUb29sVGlwRGVmaW5lZEluRGF0YSAmJiAoKHRoaXMuY29udGVudCAmJiB0eXBlb2YgKHRoaXMuY29udGVudCkgPT09IFwiZnVuY3Rpb25cIikgfHwgdGhpcy5jb250ZW50Rm9ybWF0dGVyKSkge1xuXG4gICAgdmFyIHBhcmFtID0ge1xuICAgICAgY2hhcnQ6IHRoaXMuY2hhcnQsIHRvb2xUaXA6IHRoaXMuX29wdGlvbnMsIGVudHJpZXM6IGVudHJpZXNcbiAgICB9O1xuICAgIHRvb2xUaXBJbm5lckh0bWwgPSB0aGlzLmNvbnRlbnRGb3JtYXR0ZXIgPyB0aGlzLmNvbnRlbnRGb3JtYXR0ZXIocGFyYW0pIDogdGhpcy5jb250ZW50KHBhcmFtKTtcblxuICB9IGVsc2Uge1xuXG4gICAgaWYgKHRoaXMuc2hhcmVkICYmIHRoaXMuY2hhcnQucGxvdEluZm8uYXhpc1BsYWNlbWVudCAhPT0gXCJub25lXCIpIHtcblxuICAgICAgdmFyIHRvb2xUaXBJbm5lckh0bWxQcmVmaXggPSBcIlwiO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZGF0YVNlcmllcyA9IGVudHJpZXNbaV0uZGF0YVNlcmllcztcbiAgICAgICAgZGF0YVBvaW50ID0gZW50cmllc1tpXS5kYXRhUG9pbnQ7XG4gICAgICAgIGluZGV4ID0gZW50cmllc1tpXS5pbmRleDtcblxuICAgICAgICB0b29sVGlwQ29udGVudCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKGkgPT09IDAgJiYgaXNUb29sVGlwRGVmaW5lZEluRGF0YSAmJiAhdGhpcy5jb250ZW50KSB7XG4gICAgICAgICAgdG9vbFRpcElubmVySHRtbFByZWZpeCArPSB0eXBlb2YgKHRoaXMuY2hhcnQuYXhpc1gubGFiZWxzW2RhdGFQb2ludC54XSkgIT09IFwidW5kZWZpbmVkXCIgPyB0aGlzLmNoYXJ0LmF4aXNYLmxhYmVsc1tkYXRhUG9pbnQueF0gOiBcInt4fVwiO1xuICAgICAgICAgIHRvb2xUaXBJbm5lckh0bWxQcmVmaXggKz0gXCI8L2JyPlwiO1xuICAgICAgICAgIHRvb2xUaXBJbm5lckh0bWxQcmVmaXggPSB0aGlzLmNoYXJ0LnJlcGxhY2VLZXl3b3Jkc1dpdGhWYWx1ZSh0b29sVGlwSW5uZXJIdG1sUHJlZml4LCBkYXRhUG9pbnQsIGRhdGFTZXJpZXMsIGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vQWxsb3dzIGRpc2FibGluZyBvZiB0b29sVGlwIGZvciBpbmRpdmlkdWFsIGRhdGFQb2ludHMvZGF0YVNlcmllc1xuICAgICAgICBpZiAoZGF0YVBvaW50LnRvb2xUaXBDb250ZW50ID09PSBudWxsIHx8ICh0eXBlb2YgKGRhdGFQb2ludC50b29sVGlwQ29udGVudCkgPT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YVNlcmllcy5fb3B0aW9ucy50b29sVGlwQ29udGVudCA9PT0gbnVsbCkpXG4gICAgICAgICAgY29udGludWU7XG5cblxuICAgICAgICBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImxpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcExpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3BsaW5lXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcEFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3BsaW5lQXJlYVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJjb2x1bW5cIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwiYmFyXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInNjYXR0ZXJcIlxuICAgICAgICB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZENvbHVtblwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uMTAwXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRCYXJcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEJhcjEwMFwiXG4gICAgICAgIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQXJlYVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQXJlYTEwMFwiKSB7XG4gICAgICAgICAgdG9vbFRpcENvbnRlbnQgKz0gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50ID8gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50IDogZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA/IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgOiB0aGlzLmNvbnRlbnQgJiYgdHlwZW9mICh0aGlzLmNvbnRlbnQpICE9PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbnRlbnQgOiBcIjxzcGFuIHN0eWxlPSdcXFwiJ2NvbG9yOntjb2xvcn07J1xcXCInPntuYW1lfTo8L3NwYW4+Jm5ic3A7Jm5ic3A7e3l9XCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImJ1YmJsZVwiKSB7XG4gICAgICAgICAgdG9vbFRpcENvbnRlbnQgKz0gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50ID8gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50IDogZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA/IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgOiB0aGlzLmNvbnRlbnQgJiYgdHlwZW9mICh0aGlzLmNvbnRlbnQpICE9PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbnRlbnQgOiBcIjxzcGFuIHN0eWxlPSdcXFwiJ2NvbG9yOntjb2xvcn07J1xcXCInPntuYW1lfTo8L3NwYW4+Jm5ic3A7Jm5ic3A7e3l9LCAmbmJzcDsmbmJzcDt7en1cIjtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwicGllXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImRvdWdobnV0XCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImZ1bm5lbFwiKSB7XG4gICAgICAgICAgdG9vbFRpcENvbnRlbnQgKz0gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50ID8gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50IDogZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA/IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgOiB0aGlzLmNvbnRlbnQgJiYgdHlwZW9mICh0aGlzLmNvbnRlbnQpICE9PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbnRlbnQgOiBcIiZuYnNwOyZuYnNwO3t5fVwiO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGFTZXJpZXMudHlwZSA9PT0gXCJyYW5nZUNvbHVtblwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJyYW5nZUJhclwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJyYW5nZUFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwicmFuZ2VTcGxpbmVBcmVhXCIpIHtcbiAgICAgICAgICB0b29sVGlwQ29udGVudCArPSBkYXRhUG9pbnQudG9vbFRpcENvbnRlbnQgPyBkYXRhUG9pbnQudG9vbFRpcENvbnRlbnQgOiBkYXRhU2VyaWVzLnRvb2xUaXBDb250ZW50ID8gZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA6IHRoaXMuY29udGVudCAmJiB0eXBlb2YgKHRoaXMuY29udGVudCkgIT09IFwiZnVuY3Rpb25cIiA/IHRoaXMuY29udGVudCA6IFwiPHNwYW4gc3R5bGU9J1xcXCInY29sb3I6e2NvbG9yfTsnXFxcIic+e25hbWV9Ojwvc3Bhbj4mbmJzcDsmbmJzcDt7eVswXX0sJm5ic3A7e3lbMV19XCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImNhbmRsZXN0aWNrXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcIm9obGNcIikge1xuICAgICAgICAgIHRvb2xUaXBDb250ZW50ICs9IGRhdGFQb2ludC50b29sVGlwQ29udGVudCA/IGRhdGFQb2ludC50b29sVGlwQ29udGVudCA6IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgPyBkYXRhU2VyaWVzLnRvb2xUaXBDb250ZW50IDogdGhpcy5jb250ZW50ICYmIHR5cGVvZiAodGhpcy5jb250ZW50KSAhPT0gXCJmdW5jdGlvblwiID8gdGhpcy5jb250ZW50IDogXCI8c3BhbiBzdHlsZT0nXFxcIidjb2xvcjp7Y29sb3J9OydcXFwiJz57bmFtZX06PC9zcGFuPlwiXG4gICAgICAgICAgICAgICAgICArIFwiPGJyLz5PcGVuOiAmbmJzcDsmbmJzcDt7eVswXX1cIlxuICAgICAgICAgICAgICAgICAgKyBcIjxici8+SGlnaDogJm5ic3A7Jm5ic3A7Jm5ic3A7e3lbMV19XCJcbiAgICAgICAgICAgICAgICAgICsgXCI8YnIvPkxvdzombmJzcDsmbmJzcDsmbmJzcDt7eVsyXX1cIlxuICAgICAgICAgICAgICAgICAgKyBcIjxici8+Q2xvc2U6ICZuYnNwOyZuYnNwO3t5WzNdfVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRvb2xUaXBJbm5lckh0bWwgPT09IG51bGwpXG4gICAgICAgICAgdG9vbFRpcElubmVySHRtbCA9IFwiXCI7XG5cblxuICAgICAgICBpZiAodGhpcy5yZXZlcnNlZCA9PT0gdHJ1ZSkge1xuXG4gICAgICAgICAgdG9vbFRpcElubmVySHRtbCA9IHRoaXMuY2hhcnQucmVwbGFjZUtleXdvcmRzV2l0aFZhbHVlKHRvb2xUaXBDb250ZW50LCBkYXRhUG9pbnQsIGRhdGFTZXJpZXMsIGluZGV4KSArIHRvb2xUaXBJbm5lckh0bWw7XG5cbiAgICAgICAgICBpZiAoaSA8IGVudHJpZXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgIHRvb2xUaXBJbm5lckh0bWwgPSBcIjwvYnI+XCIgKyB0b29sVGlwSW5uZXJIdG1sO1xuXG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICB0b29sVGlwSW5uZXJIdG1sICs9IHRoaXMuY2hhcnQucmVwbGFjZUtleXdvcmRzV2l0aFZhbHVlKHRvb2xUaXBDb250ZW50LCBkYXRhUG9pbnQsIGRhdGFTZXJpZXMsIGluZGV4KTtcblxuICAgICAgICAgIGlmIChpIDwgZW50cmllcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgdG9vbFRpcElubmVySHRtbCArPSBcIjwvYnI+XCI7XG5cbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICAgIGlmICh0b29sVGlwSW5uZXJIdG1sICE9PSBudWxsKVxuICAgICAgICB0b29sVGlwSW5uZXJIdG1sID0gdG9vbFRpcElubmVySHRtbFByZWZpeCArIHRvb2xUaXBJbm5lckh0bWw7XG5cbiAgICB9IGVsc2Uge1xuXG4gICAgICBkYXRhU2VyaWVzID0gZW50cmllc1swXS5kYXRhU2VyaWVzO1xuICAgICAgZGF0YVBvaW50ID0gZW50cmllc1swXS5kYXRhUG9pbnQ7XG4gICAgICBpbmRleCA9IGVudHJpZXNbMF0uaW5kZXg7XG5cbiAgICAgIC8vQWxsb3dzIGRpc2FibGluZyBvZiB0b29sVGlwIGZvciBpbmRpdmlkdWFsIGRhdGFQb2ludHMvZGF0YVNlcmllc1xuICAgICAgaWYgKGRhdGFQb2ludC50b29sVGlwQ29udGVudCA9PT0gbnVsbCB8fCAodHlwZW9mIChkYXRhUG9pbnQudG9vbFRpcENvbnRlbnQpID09PSBcInVuZGVmaW5lZFwiICYmIGRhdGFTZXJpZXMuX29wdGlvbnMudG9vbFRpcENvbnRlbnQgPT09IG51bGwpKVxuICAgICAgICByZXR1cm4gbnVsbDtcblxuXG4gICAgICBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImxpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcExpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3BsaW5lXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcEFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3BsaW5lQXJlYVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJjb2x1bW5cIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwiYmFyXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInNjYXR0ZXJcIlxuICAgICAgICB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZENvbHVtblwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uMTAwXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRCYXJcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEJhcjEwMFwiXG4gICAgICAgIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQXJlYVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQXJlYTEwMFwiKSB7XG4gICAgICAgIHRvb2xUaXBDb250ZW50ID0gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50ID8gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50IDogZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA/IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgOiB0aGlzLmNvbnRlbnQgJiYgdHlwZW9mICh0aGlzLmNvbnRlbnQpICE9PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbnRlbnQgOiBcIjxzcGFuIHN0eWxlPSdcXFwiJ2NvbG9yOntjb2xvcn07J1xcXCInPlwiICsgKGRhdGFQb2ludC5sYWJlbCA/IFwie2xhYmVsfVwiIDogXCJ7eH1cIikgKyBcIiA6PC9zcGFuPiZuYnNwOyZuYnNwO3t5fVwiO1xuICAgICAgfSBlbHNlIGlmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwiYnViYmxlXCIpIHtcbiAgICAgICAgdG9vbFRpcENvbnRlbnQgPSBkYXRhUG9pbnQudG9vbFRpcENvbnRlbnQgPyBkYXRhUG9pbnQudG9vbFRpcENvbnRlbnQgOiBkYXRhU2VyaWVzLnRvb2xUaXBDb250ZW50ID8gZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA6IHRoaXMuY29udGVudCAmJiB0eXBlb2YgKHRoaXMuY29udGVudCkgIT09IFwiZnVuY3Rpb25cIiA/IHRoaXMuY29udGVudCA6IFwiPHNwYW4gc3R5bGU9J1xcXCInY29sb3I6e2NvbG9yfTsnXFxcIic+XCIgKyAoZGF0YVBvaW50LmxhYmVsID8gXCJ7bGFiZWx9XCIgOiBcInt4fVwiKSArIFwiOjwvc3Bhbj4mbmJzcDsmbmJzcDt7eX0sICZuYnNwOyZuYnNwO3t6fVwiO1xuICAgICAgfSBlbHNlIGlmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwicGllXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImRvdWdobnV0XCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImZ1bm5lbFwiKSB7XG4gICAgICAgIHRvb2xUaXBDb250ZW50ID0gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50ID8gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50IDogZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA/IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgOiB0aGlzLmNvbnRlbnQgJiYgdHlwZW9mICh0aGlzLmNvbnRlbnQpICE9PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbnRlbnQgOiAoZGF0YVBvaW50Lm5hbWUgPyBcIntuYW1lfTombmJzcDsmbmJzcDtcIiA6IGRhdGFQb2ludC5sYWJlbCA/IFwie2xhYmVsfTombmJzcDsmbmJzcDtcIiA6IFwiXCIpICsgXCJ7eX1cIjtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcInJhbmdlQ29sdW1uXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInJhbmdlQmFyXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInJhbmdlQXJlYVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJyYW5nZVNwbGluZUFyZWFcIikge1xuICAgICAgICB0b29sVGlwQ29udGVudCA9IGRhdGFQb2ludC50b29sVGlwQ29udGVudCA/IGRhdGFQb2ludC50b29sVGlwQ29udGVudCA6IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgPyBkYXRhU2VyaWVzLnRvb2xUaXBDb250ZW50IDogdGhpcy5jb250ZW50ICYmIHR5cGVvZiAodGhpcy5jb250ZW50KSAhPT0gXCJmdW5jdGlvblwiID8gdGhpcy5jb250ZW50IDogXCI8c3BhbiBzdHlsZT0nXFxcIidjb2xvcjp7Y29sb3J9OydcXFwiJz5cIiArIChkYXRhUG9pbnQubGFiZWwgPyBcIntsYWJlbH1cIiA6IFwie3h9XCIpICsgXCIgOjwvc3Bhbj4mbmJzcDsmbmJzcDt7eVswXX0sICZuYnNwO3t5WzFdfVwiO1xuICAgICAgfSBlbHNlIGlmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwiY2FuZGxlc3RpY2tcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwib2hsY1wiKSB7XG4gICAgICAgIHRvb2xUaXBDb250ZW50ID0gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50ID8gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50IDogZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA/IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgOiB0aGlzLmNvbnRlbnQgJiYgdHlwZW9mICh0aGlzLmNvbnRlbnQpICE9PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbnRlbnQgOiBcIjxzcGFuIHN0eWxlPSdcXFwiJ2NvbG9yOntjb2xvcn07J1xcXCInPlwiICsgKGRhdGFQb2ludC5sYWJlbCA/IFwie2xhYmVsfVwiIDogXCJ7eH1cIikgKyBcIjwvc3Bhbj5cIlxuICAgICAgICAgICsgXCI8YnIvPk9wZW46ICZuYnNwOyZuYnNwO3t5WzBdfVwiXG4gICAgICAgICAgKyBcIjxici8+SGlnaDogJm5ic3A7Jm5ic3A7Jm5ic3A7e3lbMV19XCJcbiAgICAgICAgICArIFwiPGJyLz5Mb3c6ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3t5WzJdfVwiXG4gICAgICAgICAgKyBcIjxici8+Q2xvc2U6ICZuYnNwOyZuYnNwO3t5WzNdfVwiO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9vbFRpcElubmVySHRtbCA9PT0gbnVsbClcbiAgICAgICAgdG9vbFRpcElubmVySHRtbCA9IFwiXCI7XG5cbiAgICAgIHRvb2xUaXBJbm5lckh0bWwgKz0gdGhpcy5jaGFydC5yZXBsYWNlS2V5d29yZHNXaXRoVmFsdWUodG9vbFRpcENvbnRlbnQsIGRhdGFQb2ludCwgZGF0YVNlcmllcywgaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0b29sVGlwSW5uZXJIdG1sO1xufVxuXG5Ub29sVGlwLnByb3RvdHlwZS5lbmFibGVBbmltYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmNvbnRhaW5lci5zdHlsZS5XZWJraXRUcmFuc2l0aW9uKVxuICAgIHJldHVybjtcblxuICB0aGlzLmNvbnRhaW5lci5zdHlsZS5XZWJraXRUcmFuc2l0aW9uID0gXCJsZWZ0IC4ycyBlYXNlLW91dCwgYm90dG9tIC4ycyBlYXNlLW91dFwiO1xuICB0aGlzLmNvbnRhaW5lci5zdHlsZS5Nb3pUcmFuc2l0aW9uID0gXCJsZWZ0IC4ycyBlYXNlLW91dCwgYm90dG9tIC4ycyBlYXNlLW91dFwiO1xuICB0aGlzLmNvbnRhaW5lci5zdHlsZS5Nc1RyYW5zaXRpb24gPSBcImxlZnQgLjJzIGVhc2Utb3V0LCBib3R0b20gLjJzIGVhc2Utb3V0XCI7XG4gIHRoaXMuY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb24gPSBcImxlZnQgLjJzIGVhc2Utb3V0LCBib3R0b20gLjJzIGVhc2Utb3V0XCI7XG59XG5cblRvb2xUaXAucHJvdG90eXBlLmRpc2FibGVBbmltYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5jb250YWluZXIuc3R5bGUuV2Via2l0VHJhbnNpdGlvbilcbiAgICByZXR1cm47XG5cbiAgdGhpcy5jb250YWluZXIuc3R5bGUuV2Via2l0VHJhbnNpdGlvbiA9IFwiXCI7XG4gIHRoaXMuY29udGFpbmVyLnN0eWxlLk1velRyYW5zaXRpb24gPSBcIlwiO1xuICB0aGlzLmNvbnRhaW5lci5zdHlsZS5Nc1RyYW5zaXRpb24gPSBcIlwiO1xuICB0aGlzLmNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uID0gXCJcIjtcbn1cblxuVG9vbFRpcC5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uIChyZXNldE92ZXJsYXllZENhbnZhcykge1xuICBpZiAoIXRoaXMuZW5hYmxlZClcbiAgICByZXR1cm47XG5cbiAgcmVzZXRPdmVybGF5ZWRDYW52YXMgPSB0eXBlb2YgKHJlc2V0T3ZlcmxheWVkQ2FudmFzKSA9PT0gXCJ1bmRlZmluZWRcIiA/IHRydWUgOiByZXNldE92ZXJsYXllZENhbnZhcztcblxuICB0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gIHRoaXMuY3VycmVudFNlcmllc0luZGV4ID0gLTE7XG4gIHRoaXMuX3ByZXZYID0gTmFOO1xuICB0aGlzLl9wcmV2WSA9IE5hTjtcbiAgLy90aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzQ3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzLndpZHRoLCB0aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzLmhlaWdodCk7XG4gIGlmIChyZXNldE92ZXJsYXllZENhbnZhcylcbiAgICB0aGlzLmNoYXJ0LnJlc2V0T3ZlcmxheWVkQ2FudmFzKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRvb2xUaXA7XG4iLCJcbmZ1bmN0aW9uIHlTY2FsZUFuaW1hdGlvbihmcmFjdGlvbkNvbXBsZXRlLCBhbmltYXRpb25JbmZvKSB7XG5cbiAgaWYgKGZyYWN0aW9uQ29tcGxldGUgPT09IDApIHJldHVybjtcblxuICBjb25zdCBjdHggPSBhbmltYXRpb25JbmZvLmRlc3Q7XG4gIGNvbnN0IHNvdXJjZUNhbnZhcyA9IGFuaW1hdGlvbkluZm8uc291cmNlLmNhbnZhcztcbiAgY29uc3QgYmFzZSA9IGFuaW1hdGlvbkluZm8uYW5pbWF0aW9uQmFzZTtcblxuICBjb25zdCBvZmZzZXRZID0gKGJhc2UgLSBiYXNlICogZnJhY3Rpb25Db21wbGV0ZSk7XG5cbiAgY3R4LmRyYXdJbWFnZShzb3VyY2VDYW52YXMsIDAsIDAsIHNvdXJjZUNhbnZhcy53aWR0aCwgc291cmNlQ2FudmFzLmhlaWdodCwgMCwgb2Zmc2V0WSxcbiAgICAgY3R4LmNhbnZhcy53aWR0aCAvIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8sIGZyYWN0aW9uQ29tcGxldGUgKiBjdHguY2FudmFzLmhlaWdodCAvIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8pO1xufVxuXG5mdW5jdGlvbiB4U2NhbGVBbmltYXRpb24oZnJhY3Rpb25Db21wbGV0ZSwgYW5pbWF0aW9uSW5mbykge1xuXG4gIGlmIChmcmFjdGlvbkNvbXBsZXRlID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgY3R4ID0gYW5pbWF0aW9uSW5mby5kZXN0O1xuICBjb25zdCBzb3VyY2VDYW52YXMgPSBhbmltYXRpb25JbmZvLnNvdXJjZS5jYW52YXM7XG4gIGNvbnN0IGJhc2UgPSBhbmltYXRpb25JbmZvLmFuaW1hdGlvbkJhc2U7XG5cbiAgY29uc3Qgb2Zmc2V0WCA9IChiYXNlIC0gYmFzZSAqIGZyYWN0aW9uQ29tcGxldGUpO1xuXG4gIGN0eC5kcmF3SW1hZ2Uoc291cmNlQ2FudmFzLCAwLCAwLCBzb3VyY2VDYW52YXMud2lkdGgsIHNvdXJjZUNhbnZhcy5oZWlnaHQsIG9mZnNldFgsIDAsXG4gICAgZnJhY3Rpb25Db21wbGV0ZSAqIGN0eC5jYW52YXMud2lkdGggLyBkZXZpY2VQaXhlbEJhY2tpbmdTdG9yZVJhdGlvLCBjdHguY2FudmFzLmhlaWdodCAvIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8pO1xufVxuXG5mdW5jdGlvbiB4Q2xpcEFuaW1hdGlvbihmcmFjdGlvbkNvbXBsZXRlLCBhbmltYXRpb25JbmZvKSB7XG5cbiAgaWYgKGZyYWN0aW9uQ29tcGxldGUgPT09IDApIHJldHVybjtcblxuICBjb25zdCBjdHggPSBhbmltYXRpb25JbmZvLmRlc3Q7XG4gIGNvbnN0IHNvdXJjZUNhbnZhcyA9IGFuaW1hdGlvbkluZm8uc291cmNlLmNhbnZhcztcblxuICBjdHguc2F2ZSgpO1xuXG4gIGlmIChmcmFjdGlvbkNvbXBsZXRlID4gMClcbiAgICBjdHguZHJhd0ltYWdlKHNvdXJjZUNhbnZhcywgMCwgMCwgc291cmNlQ2FudmFzLndpZHRoICogZnJhY3Rpb25Db21wbGV0ZSwgc291cmNlQ2FudmFzLmhlaWdodCwgMCwgMCxcbiAgICAgIHNvdXJjZUNhbnZhcy53aWR0aCAqIGZyYWN0aW9uQ29tcGxldGUgLyBkZXZpY2VQaXhlbEJhY2tpbmdTdG9yZVJhdGlvLCBzb3VyY2VDYW52YXMuaGVpZ2h0IC8gZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbyk7XG5cbiAgY3R4LnJlc3RvcmUoKTtcbn1cblxuZnVuY3Rpb24gZmFkZUluQW5pbWF0aW9uKGZyYWN0aW9uQ29tcGxldGUsIGFuaW1hdGlvbkluZm8pIHtcblxuICBpZiAoZnJhY3Rpb25Db21wbGV0ZSA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGN0eCA9IGFuaW1hdGlvbkluZm8uZGVzdDtcbiAgY29uc3Qgc291cmNlQ2FudmFzID0gYW5pbWF0aW9uSW5mby5zb3VyY2UuY2FudmFzO1xuXG4gIGN0eC5zYXZlKCk7XG5cbiAgY3R4Lmdsb2JhbEFscGhhID0gZnJhY3Rpb25Db21wbGV0ZTtcblxuICBjdHguZHJhd0ltYWdlKHNvdXJjZUNhbnZhcywgMCwgMCwgc291cmNlQ2FudmFzLndpZHRoLCBzb3VyY2VDYW52YXMuaGVpZ2h0LCAwLCAwLFxuICAgIGN0eC5jYW52YXMud2lkdGggLyBkZXZpY2VQaXhlbEJhY2tpbmdTdG9yZVJhdGlvLCBjdHguY2FudmFzLmhlaWdodCAvIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8pO1xuXG4gIGN0eC5yZXN0b3JlKCk7XG5cbn1cblxuY29uc3QgZWFzaW5nID0ge1xuXG4gIGxpbmVhcih0LCBiLCBjLCBkKSB7XG4gICAgcmV0dXJuIGMgKiB0IC8gZCArIGI7XG4gIH0sXG5cbiAgZWFzZU91dFF1YWQodCwgYiwgYywgZCkge1xuICAgIHJldHVybiAtYyAqICh0IC89IGQpICogKHQgLSAyKSArIGI7XG4gIH0sXG5cbiAgZWFzZU91dFF1YXJ0ICh0LCBiLCBjLCBkKSB7XG4gICAgcmV0dXJuIC1jICogKCh0ID0gdCAvIGQgLSAxKSAqIHQgKiB0ICogdCAtIDEpICsgYjtcbiAgfSxcblxuICBlYXNlSW5RdWFkKHQsIGIsIGMsIGQpIHtcbiAgICByZXR1cm4gYyAqICh0IC89IGQpICogdCArIGI7XG4gIH0sXG5cbiAgZWFzZUluUXVhcnQodCwgYiwgYywgZCkge1xuICAgIHJldHVybiBjICogKHQgLz0gZCkgKiB0ICogdCAqIHQgKyBiO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcblxuICB5U2NhbGVBbmltYXRpb24sXG4gIHhTY2FsZUFuaW1hdGlvbixcbiAgeENsaXBBbmltYXRpb24sXG4gIGZhZGVJbkFuaW1hdGlvbixcbiAgZWFzaW5nXG5cbn1cbiIsImNvbnN0IFJlbmRlckhlbHBlciA9IHtcblxuICBkcmF3TWFya2VyOiBmdW5jdGlvbiAoeCwgeSwgY3R4LCBtYXJrZXJUeXBlLCBtYXJrZXJTaXplLCBtYXJrZXJDb2xvciwgbWFya2VyQm9yZGVyQ29sb3IsIG1hcmtlckJvcmRlclRoaWNrbmVzcykge1xuXG4gICAgaWYgKCFjdHgpXG4gICAgICByZXR1cm47XG5cbiAgICB2YXIgYWxwaGEgPSAxO1xuXG4gICAgY3R4LmZpbGxTdHlsZSA9IG1hcmtlckNvbG9yID8gbWFya2VyQ29sb3IgOiBcIiMwMDAwMDBcIjtcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBtYXJrZXJCb3JkZXJDb2xvciA/IG1hcmtlckJvcmRlckNvbG9yIDogXCIjMDAwMDAwXCI7XG4gICAgY3R4LmxpbmVXaWR0aCA9IG1hcmtlckJvcmRlclRoaWNrbmVzcyA/IG1hcmtlckJvcmRlclRoaWNrbmVzcyA6IDA7XG5cblxuICAgIGlmIChtYXJrZXJUeXBlID09PSBcImNpcmNsZVwiKSB7XG5cbiAgICAgIGN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAvL3JldHVybjtcblxuICAgICAgY3R4LmFyYyh4LCB5LCBtYXJrZXJTaXplIC8gMiwgMCwgTWF0aC5QSSAqIDIsIGZhbHNlKTtcblxuICAgICAgaWYgKG1hcmtlckNvbG9yKVxuICAgICAgICBjdHguZmlsbCgpO1xuXG4gICAgICBpZiAobWFya2VyQm9yZGVyVGhpY2tuZXNzKSB7XG5cbiAgICAgICAgaWYgKCFtYXJrZXJCb3JkZXJDb2xvcikge1xuICAgICAgICAgIGFscGhhID0gY3R4Lmdsb2JhbEFscGhhO1xuICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IC4xNTtcbiAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBcImJsYWNrXCI7XG4gICAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IGFscGhhO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICBjdHguc3Ryb2tlKCk7XG5cbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAobWFya2VyVHlwZSA9PT0gXCJzcXVhcmVcIikge1xuXG4gICAgICAvL2N0eC5tb3ZlVG8oeCAtIG1hcmtlclNpemUgLyAyLCB5IC0gbWFya2VyU2l6ZSAvIDIpO1xuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgY3R4LnJlY3QoeCAtIG1hcmtlclNpemUgLyAyLCB5IC0gbWFya2VyU2l6ZSAvIDIsIG1hcmtlclNpemUsIG1hcmtlclNpemUpO1xuXG4gICAgICBpZiAobWFya2VyQ29sb3IpXG4gICAgICAgIGN0eC5maWxsKCk7XG5cbiAgICAgIGlmIChtYXJrZXJCb3JkZXJUaGlja25lc3MpIHtcblxuICAgICAgICBpZiAoIW1hcmtlckJvcmRlckNvbG9yKSB7XG4gICAgICAgICAgYWxwaGEgPSBjdHguZ2xvYmFsQWxwaGE7XG4gICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gLjE1O1xuICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IFwiYmxhY2tcIjtcbiAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gYWxwaGE7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIGN0eC5zdHJva2UoKTtcblxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWFya2VyVHlwZSA9PT0gXCJ0cmlhbmdsZVwiKSB7XG5cbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGN0eC5tb3ZlVG8oeCAtIG1hcmtlclNpemUgLyAyLCB5ICsgbWFya2VyU2l6ZSAvIDIpO1xuICAgICAgY3R4LmxpbmVUbyh4ICsgbWFya2VyU2l6ZSAvIDIsIHkgKyBtYXJrZXJTaXplIC8gMik7XG4gICAgICBjdHgubGluZVRvKHgsIHkgLSBtYXJrZXJTaXplIC8gMik7XG4gICAgICBjdHguY2xvc2VQYXRoKCk7XG5cbiAgICAgIGlmIChtYXJrZXJDb2xvcilcbiAgICAgICAgY3R4LmZpbGwoKTtcblxuICAgICAgaWYgKG1hcmtlckJvcmRlclRoaWNrbmVzcykge1xuXG4gICAgICAgIGlmICghbWFya2VyQm9yZGVyQ29sb3IpIHtcbiAgICAgICAgICBhbHBoYSA9IGN0eC5nbG9iYWxBbHBoYTtcbiAgICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSAuMTU7XG4gICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gXCJibGFja1wiO1xuICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSBhbHBoYTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgY3R4LnN0cm9rZSgpO1xuXG4gICAgICB9XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgfSBlbHNlIGlmIChtYXJrZXJUeXBlID09PSBcImNyb3NzXCIpIHtcblxuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gbWFya2VyQ29sb3I7XG4gICAgICBtYXJrZXJCb3JkZXJUaGlja25lc3MgPSBtYXJrZXJTaXplIC8gNDtcbiAgICAgIGN0eC5saW5lV2lkdGggPSBtYXJrZXJCb3JkZXJUaGlja25lc3M7XG5cbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGN0eC5tb3ZlVG8oeCAtIG1hcmtlclNpemUgLyAyLCB5IC0gbWFya2VyU2l6ZSAvIDIpO1xuICAgICAgY3R4LmxpbmVUbyh4ICsgbWFya2VyU2l6ZSAvIDIsIHkgKyBtYXJrZXJTaXplIC8gMik7XG4gICAgICBjdHguc3Ryb2tlKCk7XG5cbiAgICAgIGN0eC5tb3ZlVG8oeCArIG1hcmtlclNpemUgLyAyLCB5IC0gbWFya2VyU2l6ZSAvIDIpO1xuICAgICAgY3R4LmxpbmVUbyh4IC0gbWFya2VyU2l6ZSAvIDIsIHkgKyBtYXJrZXJTaXplIC8gMik7XG4gICAgICBjdHguc3Ryb2tlKCk7XG5cbiAgICB9XG5cblxuICB9LFxuICBkcmF3TWFya2VyczogZnVuY3Rpb24gKG1hcmtlcnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBtYXJrZXIgPSBtYXJrZXJzW2ldO1xuXG4gICAgICBSZW5kZXJIZWxwZXIuZHJhd01hcmtlcihtYXJrZXIueCwgbWFya2VyLnksIG1hcmtlci5jdHgsIG1hcmtlci50eXBlLCBtYXJrZXIuc2l6ZSwgbWFya2VyLmNvbG9yLCBtYXJrZXIuYm9yZGVyQ29sb3IsIG1hcmtlci5ib3JkZXJUaGlja25lc3MpO1xuICAgIH1cbiAgfVxuICAvLyxcbiAgLy9kcmF3MXB4TGluZTogZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgY3R4KSB7XG4gIC8vXHRjdHguYmVnaW5QYXRoKCk7XG4gIC8vXHRjdHguZHJhd1JlY3QoeDEsIHkxLCB4MiAtIHgxLCB5MiAtIHkxKTtcbiAgLy9cdGN0eC5zdHJva2UoKTtcbiAgLy99XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlbmRlckhlbHBlcjtcbiIsIlxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChkZXJpdmVkLCBiYXNlKSB7XG5cdGRlcml2ZWQucHJvdG90eXBlID0gaW5oZXJpdChiYXNlLnByb3RvdHlwZSk7XG5cdGRlcml2ZWQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gZGVyaXZlZDtcblx0ZGVyaXZlZC5iYXNlID0gYmFzZS5wcm90b3R5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmhlcml0KHByb3RvKSB7XG5cdGZ1bmN0aW9uIEYoKSB7IH1cblx0Ri5wcm90b3R5cGUgPSBwcm90bztcblx0cmV0dXJuIG5ldyBGKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRUb0RhdGVUaW1lKGRhdGVUaW1lLCBudW0sIHR5cGUpIHtcblxuXHRpZiAodHlwZSA9PT0gXCJtaWxsaXNlY29uZFwiKVxuXHRcdGRhdGVUaW1lLnNldE1pbGxpc2Vjb25kcyhkYXRlVGltZS5nZXRNaWxsaXNlY29uZHMoKSArIDEgKiBudW0pO1xuXHRlbHNlIGlmICh0eXBlID09PSBcInNlY29uZFwiKVxuXHRcdGRhdGVUaW1lLnNldFNlY29uZHMoZGF0ZVRpbWUuZ2V0U2Vjb25kcygpICsgMSAqIG51bSk7XG5cdGVsc2UgaWYgKHR5cGUgPT09IFwibWludXRlXCIpXG5cdFx0ZGF0ZVRpbWUuc2V0TWludXRlcyhkYXRlVGltZS5nZXRNaW51dGVzKCkgKyAxICogbnVtKTtcblx0ZWxzZSBpZiAodHlwZSA9PT0gXCJob3VyXCIpXG5cdFx0ZGF0ZVRpbWUuc2V0SG91cnMoZGF0ZVRpbWUuZ2V0SG91cnMoKSArIDEgKiBudW0pO1xuXHRlbHNlIGlmICh0eXBlID09PSBcImRheVwiKVxuXHRcdGRhdGVUaW1lLnNldERhdGUoZGF0ZVRpbWUuZ2V0RGF0ZSgpICsgMSAqIG51bSk7XG5cdGVsc2UgaWYgKHR5cGUgPT09IFwid2Vla1wiKVxuXHRcdGRhdGVUaW1lLnNldERhdGUoZGF0ZVRpbWUuZ2V0RGF0ZSgpICsgNyAqIG51bSk7XG5cdGVsc2UgaWYgKHR5cGUgPT09IFwibW9udGhcIilcblx0XHRkYXRlVGltZS5zZXRNb250aChkYXRlVGltZS5nZXRNb250aCgpICsgMSAqIG51bSk7XG5cdGVsc2UgaWYgKHR5cGUgPT09IFwieWVhclwiKVxuXHRcdGRhdGVUaW1lLnNldEZ1bGxZZWFyKGRhdGVUaW1lLmdldEZ1bGxZZWFyKCkgKyAxICogbnVtKTtcblxuXHRyZXR1cm4gZGF0ZVRpbWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9OdW1iZXIobnVtLCB0eXBlKSB7XG5cdHJldHVybiBjb25zdGFudHNbdHlwZSArIFwiRHVyYXRpb25cIl0gKiBudW07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWQodmFsdWUsIGxlbmd0aCkge1xuXHR2YXIgaXNOZWdhdGl2ZSA9IGZhbHNlO1xuXHRpZiAodmFsdWUgPCAwKSB7XG5cdFx0aXNOZWdhdGl2ZSA9IHRydWU7XG5cdFx0dmFsdWUgKj0gLTE7XG5cdH1cblxuXHR2YWx1ZSA9IFwiXCIgKyB2YWx1ZTtcblx0bGVuZ3RoID0gIWxlbmd0aCA/IDEgOiBsZW5ndGg7XG5cblx0d2hpbGUgKHZhbHVlLmxlbmd0aCA8IGxlbmd0aCkgdmFsdWUgPSBcIjBcIiArIHZhbHVlO1xuXG5cdHJldHVybiBpc05lZ2F0aXZlID8gXCItXCIgKyB2YWx1ZSA6IHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJpbVN0cmluZyhzdHIpIHtcblx0aWYgKCFzdHIpXG5cdFx0cmV0dXJuIHN0cjtcblxuXHRzdHIgPSBzdHIucmVwbGFjZSgvXlxcc1xccyovLCAnJyk7XG5cdHZhciB3cyA9IC9cXHMvO1xuXHR2YXIgaSA9IHN0ci5sZW5ndGg7XG5cdHdoaWxlICh3cy50ZXN0KHN0ci5jaGFyQXQoLS1pKSkpIHsgfVxuXHRyZXR1cm4gc3RyLnNsaWNlKDAsIGkgKyAxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEN0eChjb250ZXh0KSB7XG5cdGNvbnRleHQucm91bmRSZWN0ID0gZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cywgYm9yZGVyVGhpY2tuZXNzLCBiYWNrZ3JvdW5kQ29sb3IsIGJvcmRlckNvbG9yKSB7XG5cdFx0Ly8vPHNpZ25hdHVyZT5cblx0XHQvLy88c3VtbWFyeT5DcmVhdGVzIGEgcm91bmRlZCByZWN0YW5nbGUgd2l0aCBnaXZlbiBmaWxsL3N0cm9rZSBwYXJhbWV0ZXJzPC9zdW1tYXJ5PlxuXHRcdC8vLzxwYXJhbSBuYW1lPVwieFwiIHR5cGU9XCJudW1iZXJcIj54IHZhbHVlPC9wYXJhbT5cblx0XHQvLy88cGFyYW0gbmFtZT1cInlcIiB0eXBlPVwibnVtYmVyXCI+eSB2YWx1ZTwvcGFyYW0+XG5cdFx0Ly8vPHBhcmFtIG5hbWU9XCJ3aWR0aFwiIHR5cGU9XCJudW1iZXJcIj5Cb3JkZXIgV2lkdGg8L3BhcmFtPlxuXHRcdC8vLzxwYXJhbSBuYW1lPVwiaGVpZ2h0XCIgdHlwZT1cIm51bWJlclwiPkJvcmRlciBIZWlnaHQ8L3BhcmFtPlxuXHRcdC8vLzxwYXJhbSBuYW1lPVwicmFkaXVzXCIgdHlwZT1cIm51bWJlclwiPkJvcmRlciBDb3JuZXJSYWRpdXM8L3BhcmFtPlxuXHRcdC8vLzxwYXJhbSBuYW1lPVwiYm9yZGVyVGhpY2tuZXNzXCIgdHlwZT1cIm51bWJlclwiPkJvcmRlciBUaGlja2VzczwvcGFyYW0+XG5cdFx0Ly8vPHBhcmFtIG5hbWU9XCJiYWNrZ3JvdW5kQ29sb3JcIiB0eXBlPVwibnVtYmVyXCI+QmFja2dyb3VuZCBDb2xvcjwvcGFyYW0+XG5cdFx0Ly8vPHBhcmFtIG5hbWU9XCJib3JkZXJDb2xvclwiIHR5cGU9XCJudW1iZXJcIj5Cb3JkZXIgQ29sb3I8L3BhcmFtPlxuXHRcdC8vLzwvc2lnbmF0dXJlPlxuXG5cdFx0aWYgKGJhY2tncm91bmRDb2xvcikge1xuXHRcdFx0dGhpcy5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kQ29sb3I7XG5cdFx0fVxuXG5cdFx0aWYgKGJvcmRlckNvbG9yKSB7XG5cdFx0XHR0aGlzLnN0cm9rZVN0eWxlID0gYm9yZGVyQ29sb3I7XG5cdFx0fVxuXG5cdFx0Ly9pZiAodHlwZW9mIHN0cm9rZSA9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0Ly9cdHN0cm9rZSA9IHRydWU7XG5cdFx0Ly99XG5cblx0XHRpZiAodHlwZW9mIHJhZGl1cyA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0cmFkaXVzID0gNTtcblx0XHR9XG5cblx0XHR0aGlzLmxpbmVXaWR0aCA9IGJvcmRlclRoaWNrbmVzcztcblxuXHRcdHRoaXMuYmVnaW5QYXRoKCk7XG5cdFx0dGhpcy5tb3ZlVG8oeCArIHJhZGl1cywgeSk7XG5cdFx0dGhpcy5saW5lVG8oeCArIHdpZHRoIC0gcmFkaXVzLCB5KTtcblx0XHR0aGlzLnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5LCB4ICsgd2lkdGgsIHkgKyByYWRpdXMpO1xuXHRcdHRoaXMubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIHJhZGl1cyk7XG5cdFx0dGhpcy5xdWFkcmF0aWNDdXJ2ZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCArIHdpZHRoIC0gcmFkaXVzLCB5ICsgaGVpZ2h0KTtcblx0XHR0aGlzLmxpbmVUbyh4ICsgcmFkaXVzLCB5ICsgaGVpZ2h0KTtcblx0XHR0aGlzLnF1YWRyYXRpY0N1cnZlVG8oeCwgeSArIGhlaWdodCwgeCwgeSArIGhlaWdodCAtIHJhZGl1cyk7XG5cdFx0dGhpcy5saW5lVG8oeCwgeSArIHJhZGl1cyk7XG5cdFx0dGhpcy5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHksIHggKyByYWRpdXMsIHkpO1xuXHRcdHRoaXMuY2xvc2VQYXRoKCk7XG5cblx0XHRpZiAoYmFja2dyb3VuZENvbG9yKSB7XG5cdFx0XHR0aGlzLmZpbGwoKTtcblx0XHR9XG5cblx0XHRpZiAoYm9yZGVyQ29sb3IgJiYgYm9yZGVyVGhpY2tuZXNzID4gMCkge1xuXHRcdFx0dGhpcy5zdHJva2UoKTtcblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlTnVtYmVycyhhLCBiKSB7XG5cdHJldHVybiBhIC0gYjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVEYXRhUG9pbnRYKGRhdGFQb2ludDEsIGRhdGFQb2ludDIpIHtcblx0cmV0dXJuIGRhdGFQb2ludDEueCAtIGRhdGFQb2ludDIueDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludFRvSGV4Q29sb3JTdHJpbmcobnVtKSB7XG5cdHZhciByID0gKChudW0gJiAweEZGMDAwMCkgPj4gMTYpLnRvU3RyaW5nKDE2KTtcblx0dmFyIGcgPSAoKG51bSAmIDB4MDBGRjAwKSA+PiA4KS50b1N0cmluZygxNik7XG5cdHZhciBiID0gKChudW0gJiAweDAwMDBGRikgPj4gMCkudG9TdHJpbmcoMTYpO1xuXG5cdHIgPSByLmxlbmd0aCA8IDIgPyBcIjBcIiArIHIgOiByO1xuXHRnID0gZy5sZW5ndGggPCAyID8gXCIwXCIgKyBnIDogZztcblx0YiA9IGIubGVuZ3RoIDwgMiA/IFwiMFwiICsgYiA6IGI7XG5cblx0cmV0dXJuIFwiI1wiICsgciArIGcgKyBiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUkdCVG9JbnQociwgZywgYikge1xuXHR2YXIgbnVtID0gKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCAoYik7XG5cblx0cmV0dXJuIG51bTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludFRvUkdCKG51bSkge1xuXHR2YXIgcmdiID0gW107XG5cdHZhciByID0gKChudW0gJiAweEZGMDAwMCkgPj4gMTYpO1xuXHR2YXIgZyA9ICgobnVtICYgMHgwMEZGMDApID4+IDgpO1xuXHR2YXIgYiA9ICgobnVtICYgMHgwMDAwRkYpID4+IDApO1xuXG5cdC8vciA9IHIubGVuZ3RoIDwgMiA/IFwiMFwiICsgciA6IHI7XG5cdC8vZyA9IGcubGVuZ3RoIDwgMiA/IFwiMFwiICsgZyA6IGc7XG5cdC8vYiA9IGIubGVuZ3RoIDwgMiA/IFwiMFwiICsgYiA6IGI7XG5cblx0cmdiWzBdID0gcjtcblx0cmdiWzFdID0gZztcblx0cmdiWzJdID0gYjtcblxuXHRyZXR1cm4gcmdiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlJbmRleE9mKGVsdCAvKiwgZnJvbSovKSB7XG5cdHZhciBsZW4gPSB0aGlzLmxlbmd0aCA+Pj4gMDtcblxuXHR2YXIgZnJvbSA9IE51bWJlcihhcmd1bWVudHNbMV0pIHx8IDA7XG5cdGZyb20gPSAoZnJvbSA8IDApXG5cdFx0ID8gTWF0aC5jZWlsKGZyb20pXG5cdFx0IDogTWF0aC5mbG9vcihmcm9tKTtcblx0aWYgKGZyb20gPCAwKVxuXHRcdGZyb20gKz0gbGVuO1xuXG5cdGZvciAoOyBmcm9tIDwgbGVuOyBmcm9tKyspIHtcblx0XHRpZiAoZnJvbSBpbiB0aGlzICYmXG5cdFx0XHR0aGlzW2Zyb21dID09PSBlbHQpXG5cdFx0XHRyZXR1cm4gZnJvbTtcblx0fVxuXHRyZXR1cm4gLTE7XG59O1xuXG4vL0lFOC0gRml4OiBpbmRleE9mIGlzIG5vdCBzdXBwb3J0ZWQgaW4gSUU4LSBmb3IgYXJyYXlzXG5leHBvcnQgZnVuY3Rpb24gYWRkQXJyYXlJbmRleE9mKG9iaikge1xuaWYgKCFvYmouaW5kZXhPZikge1xuXHRvYmouaW5kZXhPZiA9IGFycmF5SW5kZXhPZjtcbn1cblxucmV0dXJuIG9iajtcbn1cblxudmFyIGZvbnRIZWlnaHRJblBpeGVscyA9IHt9O1xudmFyIHRleHRNZWFzdXJlRWwgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9udEhlaWdodEluUGl4ZWxzKGZvbnRGYW1pbHksIGZvbnRTaXplLCBmb250V2VpZ2h0KSB7XG5cblx0Ly9yZXR1cm4gZm9udFNpemU7XG5cblx0Zm9udFdlaWdodCA9IGZvbnRXZWlnaHQgfHwgXCJub3JtYWxcIjtcblxuXHR2YXIgZW50cnkgPSBmb250RmFtaWx5ICsgXCJfXCIgKyBmb250U2l6ZSArIFwiX1wiICsgZm9udFdlaWdodDtcblx0dmFyIGhlaWdodCA9IGZvbnRIZWlnaHRJblBpeGVsc1tlbnRyeV07XG5cblx0aWYgKGlzTmFOKGhlaWdodCkpIHtcblx0XHR0cnkge1xuXHRcdFx0dmFyIHN0eWxlID0gXCJwb3NpdGlvbjphYnNvbHV0ZTsgbGVmdDowcHg7IHRvcDotMjAwMDBweDsgcGFkZGluZzowcHg7bWFyZ2luOjBweDtib3JkZXI6bm9uZTt3aGl0ZS1zcGFjZTpwcmU7bGluZS1oZWlnaHQ6bm9ybWFsO1wiICsgXCJmb250LWZhbWlseTpcIiArIGZvbnRGYW1pbHkgKyBcIjsgXCIgKyBcImZvbnQtc2l6ZTpcIiArIGZvbnRTaXplICsgXCJweDsgZm9udC13ZWlnaHQ6XCIgKyBmb250V2VpZ2h0ICsgXCI7XCI7XG5cdFx0XHQvL2NvbnNvbGUubG9nKHN0eWxlKTtcblx0XHRcdGlmICghdGV4dE1lYXN1cmVFbCkge1xuXHRcdFx0XHR2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdFx0XHRcdHRleHRNZWFzdXJlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcblx0XHRcdFx0dGV4dE1lYXN1cmVFbC5pbm5lckhUTUwgPSBcIlwiO1xuXHRcdFx0XHR2YXIgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIk1wZ3lpXCIpO1xuXHRcdFx0XHR0ZXh0TWVhc3VyZUVsLmFwcGVuZENoaWxkKHRleHROb2RlKTtcblx0XHRcdFx0Ym9keS5hcHBlbmRDaGlsZCh0ZXh0TWVhc3VyZUVsKTtcblx0XHRcdH1cblxuXHRcdFx0dGV4dE1lYXN1cmVFbC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdHRleHRNZWFzdXJlRWwuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgc3R5bGUpO1xuXG5cdFx0XHRoZWlnaHQgPSBNYXRoLnJvdW5kKHRleHRNZWFzdXJlRWwub2Zmc2V0SGVpZ2h0KTtcblx0XHRcdHRleHRNZWFzdXJlRWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdFx0Ly9ib2R5LnJlbW92ZUNoaWxkKHRlbXBEaXYpO1xuXG5cdFx0XHQvL2lmICh3aW5kb3cuY29uc29sZSlcblx0XHRcdC8vXHR3aW5kb3cuY29uc29sZS5sb2coZm9udFNpemUgKyBcIjogXCIgKyBoZWlnaHQpO1xuXHRcdH1cblx0XHRjYXRjaCAoZSkge1xuXHRcdFx0aGVpZ2h0ID0gTWF0aC5jZWlsKGZvbnRTaXplICogMS4xKTtcblx0XHR9XG5cblx0XHRoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIGZvbnRTaXplKTtcblxuXHRcdGZvbnRIZWlnaHRJblBpeGVsc1tlbnRyeV0gPSBoZWlnaHQ7XG5cdH1cblxuXHRyZXR1cm4gaGVpZ2h0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGluZURhc2hBcnJheShsaW5lRGFzaFR5cGUsIGxpbmVUaGlja25lc3MpIHtcblx0bGluZURhc2hUeXBlID0gbGluZURhc2hUeXBlIHx8IFwic29saWRcIjtcblxuXHR2YXIgbGluZURhc2hBcnJheSA9IFtdO1xuXG5cdHZhciBsaW5lRGFzaFR5cGVNYXAgPSB7XG5cdFx0XCJzb2xpZFwiOiBbXSxcblx0XHRcInNob3J0RGFzaFwiOiBbMywgMV0sXG5cdFx0XCJzaG9ydERvdFwiOiBbMSwgMV0sXG5cdFx0XCJzaG9ydERhc2hEb3RcIjogWzMsIDEsIDEsIDFdLFxuXHRcdFwic2hvcnREYXNoRG90RG90XCI6IFszLCAxLCAxLCAxLCAxLCAxXSxcblx0XHRcImRvdFwiOiBbMSwgMl0sXG5cdFx0XCJkYXNoXCI6IFs0LCAyXSxcblx0XHRcImRhc2hEb3RcIjogWzQsIDIsIDEsIDJdLFxuXHRcdFwibG9uZ0Rhc2hcIjogWzgsIDJdLFxuXHRcdFwibG9uZ0Rhc2hEb3RcIjogWzgsIDIsIDEsIDJdLFxuXHRcdFwibG9uZ0Rhc2hEb3REb3RcIjogWzgsIDIsIDEsIDIsIDEsIDJdXG5cdH07XG5cblx0bGluZURhc2hBcnJheSA9IGxpbmVEYXNoVHlwZU1hcFtsaW5lRGFzaFR5cGVdO1xuXG5cdGlmIChsaW5lRGFzaEFycmF5KSB7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVEYXNoQXJyYXkubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxpbmVEYXNoQXJyYXlbaV0gKj0gbGluZVRoaWNrbmVzcztcblx0XHR9XG5cdH0gZWxzZVxuXHRcdGxpbmVEYXNoQXJyYXkgPSBbXTtcblxuXHRyZXR1cm4gbGluZURhc2hBcnJheTtcbn1cblxuLy91c2VyQ2FwdHVyZSBpcyBvcHRpb25hbC4gRGVmYXVsdHMgdG8gZmFsc2VcbmV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudChvYmosIGV2ZW50VHlwZSwgZm4sIHVzZUNhcHR1cmUpIHtcblx0aWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7XG5cdFx0b2JqLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBmbiwgdXNlQ2FwdHVyZSB8fCBmYWxzZSk7XG5cdH1cblx0ZWxzZSBpZiAob2JqLmF0dGFjaEV2ZW50KSB7XG5cdFx0b2JqLmF0dGFjaEV2ZW50KFwib25cIiArIGV2ZW50VHlwZSwgZnVuY3Rpb24gKGUpIHtcblx0XHRcdGUgPSBlIHx8IHdpbmRvdy5ldmVudDtcblx0XHRcdGUucHJldmVudERlZmF1bHQgPSBlLnByZXZlbnREZWZhdWx0IHx8IGZ1bmN0aW9uICgpIHsgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOyB9O1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24gPSBlLnN0b3BQcm9wYWdhdGlvbiB8fCBmdW5jdGlvbiAoKSB7IGUuY2FuY2VsQnViYmxlID0gdHJ1ZTsgfTtcblx0XHRcdGZuLmNhbGwob2JqLCBlKTtcblx0XHR9KTtcblx0fSBlbHNlXG5cdFx0cmV0dXJuIGZhbHNlO1xufVxuXG4vLyNyZWdpb24gZm9ybWF0dGluZyBmdW5jdGlvbnMvbWV0aG9kc1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGVGb3JtYXQoKSB7XG5cblx0dmFyIHJlZyA9IC9EezEsNH18TXsxLDR9fFl7MSw0fXxoezEsMn18SHsxLDJ9fG17MSwyfXxzezEsMn18ZnsxLDN9fHR7MSwyfXxUezEsMn18S3x6ezEsM318XCJbXlwiXSpcInwnW14nXSonL2c7XG5cblx0dmFyIGRlZkRheXMgPSBbXCJTdW5kYXlcIiwgXCJNb25kYXlcIiwgXCJUdWVzZGF5XCIsIFwiV2VkbmVzZGF5XCIsIFwiVGh1cnNkYXlcIiwgXCJGcmlkYXlcIiwgXCJTYXR1cmRheVwiXTtcblx0dmFyIGRlZlNob3J0RGF5cyA9IFtcIlN1blwiLCBcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXTtcblxuXHR2YXIgZGVmTW9udGhzID0gW1wiSmFudWFyeVwiLCBcIkZlYnJ1YXJ5XCIsIFwiTWFyY2hcIiwgXCJBcHJpbFwiLCBcIk1heVwiLCBcIkp1bmVcIiwgXCJKdWx5XCIsIFwiQXVndXN0XCIsIFwiU2VwdGVtYmVyXCIsIFwiT2N0b2JlclwiLCBcIk5vdmVtYmVyXCIsIFwiRGVjZW1iZXJcIl07XG5cdHZhciBkZWZTaG9ydE1vbnRocyA9IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiXTtcblxuXHR2YXIgdGltZXpvbmUgPSAvXFxiKD86W1BNQ0VBXVtTRFBdVHwoPzpQYWNpZmljfE1vdW50YWlufENlbnRyYWx8RWFzdGVybnxBdGxhbnRpYykgKD86U3RhbmRhcmR8RGF5bGlnaHR8UHJldmFpbGluZykgVGltZXwoPzpHTVR8VVRDKSg/OlstK11cXGR7NH0pPylcXGIvZztcblx0dmFyIHRpbWV6b25lQ2xpcCA9IC9bXi0rXFxkQS1aXS9nO1xuXG5cdHJldHVybiBmdW5jdGlvbiAoZHQsIGZvcm1hdFN0cmluZywgY3VsdHVyZUluZm8pIHtcblxuXHRcdHZhciBkYXlzID0gY3VsdHVyZUluZm8gPyBjdWx0dXJlSW5mby5kYXlzIDogZGVmRGF5cztcblx0XHR2YXIgbW9udGhzID0gY3VsdHVyZUluZm8gPyBjdWx0dXJlSW5mby5tb250aHMgOiBkZWZNb250aHM7XG5cblx0XHR2YXIgc2hvcnREYXlzID0gY3VsdHVyZUluZm8gPyBjdWx0dXJlSW5mby5zaG9ydERheXMgOiBkZWZTaG9ydERheXM7XG5cdFx0dmFyIHNob3J0TW9udGhzID0gY3VsdHVyZUluZm8gPyBjdWx0dXJlSW5mby5zaG9ydE1vbnRocyA6IGRlZlNob3J0TW9udGhzO1xuXG5cdFx0dmFyIHJlc3VsdCA9IFwiXCI7XG5cdFx0dmFyIHV0YyA9IGZhbHNlO1xuXG5cdFx0ZHQgPSBkdCAmJiBkdC5nZXRUaW1lID8gZHQgOiBkdCA/IG5ldyBEYXRlKGR0KSA6IG5ldyBEYXRlO1xuXHRcdGlmIChpc05hTihkdCkpIHRocm93IFN5bnRheEVycm9yKFwiaW52YWxpZCBkYXRlXCIpO1xuXG5cdFx0aWYgKGZvcm1hdFN0cmluZy5zbGljZSgwLCA0KSA9PT0gXCJVVEM6XCIpIHtcblx0XHRcdGZvcm1hdFN0cmluZyA9IGZvcm1hdFN0cmluZy5zbGljZSg0KTtcblx0XHRcdHV0YyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0dmFyIHByZSA9IHV0YyA/IFwiZ2V0VVRDXCIgOiBcImdldFwiO1xuXHRcdHZhciBkYXRlID0gZHRbcHJlICsgXCJEYXRlXCJdKCk7XG5cdFx0dmFyIGRheSA9IGR0W3ByZSArIFwiRGF5XCJdKCk7XG5cdFx0dmFyIG1vbnRoID0gZHRbcHJlICsgXCJNb250aFwiXSgpO1xuXHRcdHZhciB5ZWFyID0gZHRbcHJlICsgXCJGdWxsWWVhclwiXSgpO1xuXHRcdHZhciBob3VycyA9IGR0W3ByZSArIFwiSG91cnNcIl0oKTtcblx0XHR2YXIgbWludXRlcyA9IGR0W3ByZSArIFwiTWludXRlc1wiXSgpO1xuXHRcdHZhciBzZWNvbmRzID0gZHRbcHJlICsgXCJTZWNvbmRzXCJdKCk7XG5cdFx0dmFyIG1pbGxpc2Vjb25kcyA9IGR0W3ByZSArIFwiTWlsbGlzZWNvbmRzXCJdKCk7XG5cdFx0dmFyIG9mZnNldCA9IHV0YyA/IDAgOiBkdC5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG5cdFx0cmVzdWx0ID0gZm9ybWF0U3RyaW5nLnJlcGxhY2UocmVnLCBmdW5jdGlvbiAoa2V5KSB7XG5cblx0XHRcdHN3aXRjaCAoa2V5KSB7XG5cblx0XHRcdFx0Y2FzZSBcIkRcIjpcblx0XHRcdFx0XHRyZXR1cm4gZGF0ZTtcblx0XHRcdFx0Y2FzZSBcIkREXCI6XG5cdFx0XHRcdFx0cmV0dXJuIHBhZChkYXRlLCAyKTtcblx0XHRcdFx0Y2FzZSBcIkRERFwiOlxuXHRcdFx0XHRcdHJldHVybiBzaG9ydERheXNbZGF5XTtcblx0XHRcdFx0Y2FzZSBcIkRERERcIjpcblx0XHRcdFx0XHRyZXR1cm4gZGF5c1tkYXldO1xuXG5cblx0XHRcdFx0Y2FzZSBcIk1cIjpcblx0XHRcdFx0XHRyZXR1cm4gbW9udGggKyAxO1xuXHRcdFx0XHRjYXNlIFwiTU1cIjpcblx0XHRcdFx0XHRyZXR1cm4gcGFkKG1vbnRoICsgMSwgMik7XG5cdFx0XHRcdGNhc2UgXCJNTU1cIjpcblx0XHRcdFx0XHRyZXR1cm4gc2hvcnRNb250aHNbbW9udGhdO1xuXHRcdFx0XHRjYXNlIFwiTU1NTVwiOlxuXHRcdFx0XHRcdHJldHVybiBtb250aHNbbW9udGhdO1xuXG5cblx0XHRcdFx0Y2FzZSBcIllcIjpcblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQoU3RyaW5nKHllYXIpLnNsaWNlKC0yKSk7XG5cdFx0XHRcdGNhc2UgXCJZWVwiOlxuXHRcdFx0XHRcdHJldHVybiBwYWQoU3RyaW5nKHllYXIpLnNsaWNlKC0yKSwgMik7XG5cdFx0XHRcdGNhc2UgXCJZWVlcIjpcblx0XHRcdFx0XHRyZXR1cm4gcGFkKFN0cmluZyh5ZWFyKS5zbGljZSgtMyksIDMpO1xuXHRcdFx0XHRjYXNlIFwiWVlZWVwiOlxuXHRcdFx0XHRcdHJldHVybiBwYWQoeWVhciwgNCk7XG5cblxuXHRcdFx0XHRjYXNlIFwiaFwiOlxuXHRcdFx0XHRcdHJldHVybiBob3VycyAlIDEyIHx8IDEyO1xuXHRcdFx0XHRjYXNlIFwiaGhcIjpcblx0XHRcdFx0XHRyZXR1cm4gcGFkKGhvdXJzICUgMTIgfHwgMTIsIDIpO1xuXG5cblx0XHRcdFx0Y2FzZSBcIkhcIjpcblx0XHRcdFx0XHRyZXR1cm4gaG91cnM7XG5cdFx0XHRcdGNhc2UgXCJISFwiOlxuXHRcdFx0XHRcdHJldHVybiBwYWQoaG91cnMsIDIpO1xuXG5cdFx0XHRcdGNhc2UgXCJtXCI6XG5cdFx0XHRcdFx0cmV0dXJuIG1pbnV0ZXM7XG5cdFx0XHRcdGNhc2UgXCJtbVwiOlxuXHRcdFx0XHRcdHJldHVybiBwYWQobWludXRlcywgMik7XG5cblxuXHRcdFx0XHRjYXNlIFwic1wiOlxuXHRcdFx0XHRcdHJldHVybiBzZWNvbmRzO1xuXHRcdFx0XHRjYXNlIFwic3NcIjpcblx0XHRcdFx0XHRyZXR1cm4gcGFkKHNlY29uZHMsIDIpO1xuXG5cdFx0XHRcdGNhc2UgXCJmXCI6XG5cdFx0XHRcdFx0cmV0dXJuIFN0cmluZyhtaWxsaXNlY29uZHMpLnNsaWNlKDAsIDEpO1xuXHRcdFx0XHRjYXNlIFwiZmZcIjpcblx0XHRcdFx0XHRyZXR1cm4gcGFkKFN0cmluZyhtaWxsaXNlY29uZHMpLnNsaWNlKDAsIDIpLCAyKTtcblx0XHRcdFx0Y2FzZSBcImZmZlwiOlxuXHRcdFx0XHRcdHJldHVybiBwYWQoU3RyaW5nKG1pbGxpc2Vjb25kcykuc2xpY2UoMCwgMyksIDMpO1xuXG5cblx0XHRcdFx0Y2FzZSBcInRcIjpcblx0XHRcdFx0XHRyZXR1cm4gaG91cnMgPCAxMiA/IFwiYVwiIDogXCJwXCI7XG5cdFx0XHRcdGNhc2UgXCJ0dFwiOlxuXHRcdFx0XHRcdHJldHVybiBob3VycyA8IDEyID8gXCJhbVwiIDogXCJwbVwiO1xuXHRcdFx0XHRjYXNlIFwiVFwiOlxuXHRcdFx0XHRcdHJldHVybiBob3VycyA8IDEyID8gXCJBXCIgOiBcIlBcIjtcblx0XHRcdFx0Y2FzZSBcIlRUXCI6XG5cdFx0XHRcdFx0cmV0dXJuIGhvdXJzIDwgMTIgPyBcIkFNXCIgOiBcIlBNXCI7XG5cblxuXHRcdFx0XHRjYXNlIFwiS1wiOlxuXHRcdFx0XHRcdHJldHVybiB1dGMgPyBcIlVUQ1wiIDogKFN0cmluZyhkdCkubWF0Y2godGltZXpvbmUpIHx8IFtcIlwiXSkucG9wKCkucmVwbGFjZSh0aW1lem9uZUNsaXAsIFwiXCIpOyAvLyBUaW1lIFpvbmU7XG5cdFx0XHRcdGNhc2UgXCJ6XCI6XG5cdFx0XHRcdFx0cmV0dXJuIChvZmZzZXQgPiAwID8gXCItXCIgOiBcIitcIikgKyBNYXRoLmZsb29yKE1hdGguYWJzKG9mZnNldCkgLyA2MCk7IC8vIEhvdXIgT2Zmc2V0IGZyb20gVVRDIHdpdGhvdXQgcGFkZGluZ1xuXHRcdFx0XHRjYXNlIFwienpcIjpcblx0XHRcdFx0XHRyZXR1cm4gKG9mZnNldCA+IDAgPyBcIi1cIiA6IFwiK1wiKSArIHBhZChNYXRoLmZsb29yKE1hdGguYWJzKG9mZnNldCkgLyA2MCksIDIpOyAvLyBIb3VyIE9mZnNldCBmcm9tIFVUQyB3aXRoIHBhZGRpbmdcblx0XHRcdFx0Y2FzZSBcInp6elwiOlxuXHRcdFx0XHRcdHJldHVybiAob2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCIpICsgcGFkKE1hdGguZmxvb3IoTWF0aC5hYnMob2Zmc2V0KSAvIDYwKSwgMikgKyBwYWQoTWF0aC5hYnMob2Zmc2V0KSAlIDYwLCAyKTsgLy8gSG91ciBhbmQgTWludXRlIE9mZnNldCBmcm9tIFVUQyB3aXRoIHBhZGRpbmdcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHJldHVybiBrZXkuc2xpY2UoMSwga2V5Lmxlbmd0aCAtIDEpO1xuXG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlckZvcm1hdCh2LCBmcywgY3VsdHVyZUluZm8pIHtcblx0aWYgKHYgPT09IG51bGwpXG5cdFx0cmV0dXJuIFwiXCI7XG5cblx0diA9IE51bWJlcih2KTtcblx0dmFyIGlzTmVnYXRpdmUgPSB2IDwgMCA/IHRydWUgOiBmYWxzZTtcblx0aWYgKGlzTmVnYXRpdmUpIHYgKj0gLTE7XG5cblx0dmFyIGRlY2ltYWxTZXBhcmF0b3IgPSBjdWx0dXJlSW5mbyA/IGN1bHR1cmVJbmZvLmRlY2ltYWxTZXBhcmF0b3IgOiBcIi5cIjtcblx0dmFyIGRpZ2l0R3JvdXBTZXBhcmF0b3IgPSBjdWx0dXJlSW5mbyA/IGN1bHR1cmVJbmZvLmRpZ2l0R3JvdXBTZXBhcmF0b3IgOiBcIixcIjtcblxuXHR2YXIgdlN0cmluZyA9IFwiXCI7XG5cdGZzID0gU3RyaW5nKGZzKTtcblx0dmFyIG11bHRpcGxpZXIgPSAxO1xuXHR2YXIgdGVtcDtcblx0dmFyIHJlc3VsdCA9IFwiXCI7XG5cblx0dmFyIG1hdGNoZXMgPSBcIlwiO1xuXHR2YXIgZGVjaW1hbFBvc2l0aW9uID0gLTE7XG5cdHZhciBmc0JlZm9yZURlY2ltYWwgPSBbXTtcblx0dmFyIGZzQWZ0ZXJEZWNpbWFsID0gW107XG5cdHZhciBub1BoQmVmb3JlRGVjaW1hbCA9IDA7IC8vIE51bWJlciBvZiBQbGFjZWhvbGRlcnMgYmVmb3JlIERlY2ltYWxcblx0dmFyIG5vUGhBZnRlckRlY2ltYWwgPSAwOyAvLyBOdW1iZXIgb2YgUGxhY2Vob2xkZXJzIGFmdGVyIERlY2ltYWxcblx0dmFyIG5vQ29tbWEgPSAwO1xuXHR2YXIgaXNTY2llbnRpZmljTm90YXRpb24gPSBmYWxzZTtcblx0dmFyIGV4cG9uZW50ID0gMDtcblxuXHRtYXRjaGVzID0gZnMubWF0Y2goL1wiW15cIl0qXCJ8J1teJ10qJ3xbZUVdWystXSpbMF0rfFssXStbLl184oCwfC4vZyk7XG5cdC8vd2luZG93LmNvbnNvbGUubG9nKG1hdGNoZXMgKyBcIiA9IFwiICsgbWF0Y2hlcy5sZW5ndGgpO1xuXHR2YXIgbWF0Y2ggPSBudWxsO1xuXG5cdGZvciAodmFyIGkgPSAwOyBtYXRjaGVzICYmIGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0bWF0Y2ggPSBtYXRjaGVzW2ldO1xuXG5cdFx0aWYgKG1hdGNoID09PSBcIi5cIiAmJiBkZWNpbWFsUG9zaXRpb24gPCAwKSB7XG5cdFx0XHRkZWNpbWFsUG9zaXRpb24gPSBpO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fSBlbHNlIGlmIChtYXRjaCA9PT0gXCIlXCIpIHtcblx0XHRcdG11bHRpcGxpZXIgKj0gMTAwO1xuXHRcdH0gZWxzZSBpZiAobWF0Y2ggPT09IFwi4oCwXCIpIHtcblx0XHRcdG11bHRpcGxpZXIgKj0gMTAwMDtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH0gZWxzZSBpZiAobWF0Y2hbMF0gPT09IFwiLFwiICYmIG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdID09PSBcIi5cIikge1xuXHRcdFx0bXVsdGlwbGllciAvPSBNYXRoLnBvdygxMDAwLCBtYXRjaC5sZW5ndGggLSAxKTtcblx0XHRcdGRlY2ltYWxQb3NpdGlvbiA9IGkgKyBtYXRjaC5sZW5ndGggLSAxO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fSBlbHNlIGlmICgobWF0Y2hbMF0gPT09IFwiRVwiIHx8IG1hdGNoWzBdID09PSBcImVcIikgJiYgbWF0Y2hbbWF0Y2gubGVuZ3RoIC0gMV0gPT09IFwiMFwiKSB7XG5cdFx0XHRpc1NjaWVudGlmaWNOb3RhdGlvbiA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKGRlY2ltYWxQb3NpdGlvbiA8IDApIHtcblx0XHRcdGZzQmVmb3JlRGVjaW1hbC5wdXNoKG1hdGNoKTtcblx0XHRcdGlmIChtYXRjaCA9PT0gXCIjXCIgfHwgbWF0Y2ggPT09IFwiMFwiKVxuXHRcdFx0XHRub1BoQmVmb3JlRGVjaW1hbCsrO1xuXHRcdFx0ZWxzZSBpZiAobWF0Y2ggPT09IFwiLFwiKVxuXHRcdFx0XHRub0NvbW1hKys7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0ZnNBZnRlckRlY2ltYWwucHVzaChtYXRjaCk7XG5cdFx0XHRpZiAobWF0Y2ggPT09IFwiI1wiIHx8IG1hdGNoID09PSBcIjBcIilcblx0XHRcdFx0bm9QaEFmdGVyRGVjaW1hbCsrO1xuXHRcdH1cblx0fVxuXG5cdGlmIChpc1NjaWVudGlmaWNOb3RhdGlvbikge1xuXHRcdHZhciBpbnRlZ2VyID0gTWF0aC5mbG9vcih2KTtcblx0XHRleHBvbmVudCA9IChpbnRlZ2VyID09PSAwID8gXCJcIiA6IFN0cmluZyhpbnRlZ2VyKSkubGVuZ3RoIC0gbm9QaEJlZm9yZURlY2ltYWw7XG5cdFx0bXVsdGlwbGllciAvPSBNYXRoLnBvdygxMCwgZXhwb25lbnQpO1xuXHR9XG5cblx0diAqPSBtdWx0aXBsaWVyO1xuXG5cdGlmIChkZWNpbWFsUG9zaXRpb24gPCAwKVxuXHRcdGRlY2ltYWxQb3NpdGlvbiA9IGk7XG5cblx0dlN0cmluZyA9IHYudG9GaXhlZChub1BoQWZ0ZXJEZWNpbWFsKTtcblx0dmFyIHNwbGl0ID0gdlN0cmluZy5zcGxpdChcIi5cIik7XG5cdC8vd2luZG93LmNvbnNvbGUubG9nKHNwbGl0KTtcblx0dmFyIHZTdHJpbmdCZWZvcmVEZWNpbWFsID0gKHNwbGl0WzBdICsgXCJcIikuc3BsaXQoXCJcIik7XG5cdHZhciB2U3RyaW5nQWZ0ZXJEZWNpbWFsID0gKHNwbGl0WzFdICsgXCJcIikuc3BsaXQoXCJcIik7XG5cblx0aWYgKHZTdHJpbmdCZWZvcmVEZWNpbWFsICYmIHZTdHJpbmdCZWZvcmVEZWNpbWFsWzBdID09PSBcIjBcIilcblx0XHR2U3RyaW5nQmVmb3JlRGVjaW1hbC5zaGlmdCgpO1xuXG5cdC8vd2luZG93LmNvbnNvbGUubG9nKGZzQmVmb3JlRGVjaW1hbCArIFwiPC0tLS0tLS0tLS0+XCIgKyBmc0FmdGVyRGVjaW1hbCArIFwiICYgICAgICAgIFwiICsgdlN0cmluZ0JlZm9yZURlY2ltYWwgKyBcIjwtLS0tLS0tLS0tPlwiICsgdlN0cmluZ0FmdGVyRGVjaW1hbCk7XG5cblx0dmFyIG5vUGhQcm9jZXNzZWQgPSAwO1xuXHR2YXIgbm9EaWdpdHNBZGRlZCA9IDA7XG5cdHZhciBub0NvbW1hQWRkZWQgPSAwO1xuXHR2YXIgY29tbWFEaXN0YW5jZSA9IDA7XG5cdHZhciBkaXN0YW5jZUZyb21MYXN0Q29tbWEgPSAwO1xuXG5cdHdoaWxlIChmc0JlZm9yZURlY2ltYWwubGVuZ3RoID4gMCkge1xuXHRcdG1hdGNoID0gZnNCZWZvcmVEZWNpbWFsLnBvcCgpO1xuXG5cdFx0aWYgKG1hdGNoID09PSBcIiNcIiB8fCBtYXRjaCA9PT0gXCIwXCIpIHtcblx0XHRcdG5vUGhQcm9jZXNzZWQrKztcblxuXHRcdFx0aWYgKG5vUGhQcm9jZXNzZWQgPT09IG5vUGhCZWZvcmVEZWNpbWFsKSB7XG5cdFx0XHRcdHZhciBkaWdpdHMgPSB2U3RyaW5nQmVmb3JlRGVjaW1hbDtcblx0XHRcdFx0dlN0cmluZ0JlZm9yZURlY2ltYWwgPSBbXTtcblxuXHRcdFx0XHRpZiAobWF0Y2ggPT09IFwiMFwiKSB7XG5cdFx0XHRcdFx0Ly92YXIgdG90YWxEaWdpdHMgPSByZXN1bHQubWF0Y2goL1swLTldL2cpLmxlbmd0aDtcblx0XHRcdFx0XHR2YXIgdG9QYWQgPSBub1BoQmVmb3JlRGVjaW1hbCAtIG5vRGlnaXRzQWRkZWQgLSAoZGlnaXRzID8gZGlnaXRzLmxlbmd0aCA6IDApO1xuXG5cdFx0XHRcdFx0d2hpbGUgKHRvUGFkID4gMCkge1xuXHRcdFx0XHRcdFx0ZGlnaXRzLnVuc2hpZnQoXCIwXCIpO1xuXHRcdFx0XHRcdFx0dG9QYWQtLTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR3aGlsZSAoZGlnaXRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRyZXN1bHQgPSBkaWdpdHMucG9wKCkgKyByZXN1bHQ7XG5cdFx0XHRcdFx0ZGlzdGFuY2VGcm9tTGFzdENvbW1hKys7XG5cblx0XHRcdFx0XHRpZiAoZGlzdGFuY2VGcm9tTGFzdENvbW1hICUgY29tbWFEaXN0YW5jZSA9PT0gMCAmJiBub0NvbW1hQWRkZWQgPT09IG5vQ29tbWEgJiYgZGlnaXRzLmxlbmd0aCA+IDApXG5cdFx0XHRcdFx0XHRyZXN1bHQgPSBkaWdpdEdyb3VwU2VwYXJhdG9yICsgcmVzdWx0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzTmVnYXRpdmUpXG5cdFx0XHRcdFx0cmVzdWx0ID0gXCItXCIgKyByZXN1bHQ7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICh2U3RyaW5nQmVmb3JlRGVjaW1hbC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0cmVzdWx0ID0gdlN0cmluZ0JlZm9yZURlY2ltYWwucG9wKCkgKyByZXN1bHQ7XG5cdFx0XHRcdFx0bm9EaWdpdHNBZGRlZCsrO1xuXHRcdFx0XHRcdGRpc3RhbmNlRnJvbUxhc3RDb21tYSsrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKG1hdGNoID09PSBcIjBcIikge1xuXHRcdFx0XHRcdHJlc3VsdCA9IFwiMFwiICsgcmVzdWx0O1xuXHRcdFx0XHRcdG5vRGlnaXRzQWRkZWQrKztcblx0XHRcdFx0XHRkaXN0YW5jZUZyb21MYXN0Q29tbWErKztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkaXN0YW5jZUZyb21MYXN0Q29tbWEgJSBjb21tYURpc3RhbmNlID09PSAwICYmIG5vQ29tbWFBZGRlZCA9PT0gbm9Db21tYSAmJiB2U3RyaW5nQmVmb3JlRGVjaW1hbC5sZW5ndGggPiAwKVxuXHRcdFx0XHRcdHJlc3VsdCA9IGRpZ2l0R3JvdXBTZXBhcmF0b3IgKyByZXN1bHQ7XG5cdFx0XHR9XG5cblxuXHRcdH0gZWxzZSBpZiAoKG1hdGNoWzBdID09PSBcIkVcIiB8fCBtYXRjaFswXSA9PT0gXCJlXCIpICYmIG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdID09PSBcIjBcIiAmJiAvW2VFXVsrLV0qWzBdKy8udGVzdChtYXRjaCkpIHtcblx0XHRcdGlmIChleHBvbmVudCA8IDApXG5cdFx0XHRcdG1hdGNoID0gbWF0Y2gucmVwbGFjZShcIitcIiwgXCJcIikucmVwbGFjZShcIi1cIiwgXCJcIik7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdG1hdGNoID0gbWF0Y2gucmVwbGFjZShcIi1cIiwgXCJcIik7XG5cblx0XHRcdHJlc3VsdCArPSBtYXRjaC5yZXBsYWNlKC9bMF0rLywgZnVuY3Rpb24gKCQwKSB7XG5cdFx0XHRcdHJldHVybiBwYWQoZXhwb25lbnQsICQwLmxlbmd0aCk7XG5cdFx0XHR9KTtcblxuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChtYXRjaCA9PT0gXCIsXCIpIHtcblx0XHRcdFx0bm9Db21tYUFkZGVkKys7XG5cdFx0XHRcdGNvbW1hRGlzdGFuY2UgPSBkaXN0YW5jZUZyb21MYXN0Q29tbWE7XG5cdFx0XHRcdGRpc3RhbmNlRnJvbUxhc3RDb21tYSA9IDA7XG5cblx0XHRcdFx0aWYgKHZTdHJpbmdCZWZvcmVEZWNpbWFsLmxlbmd0aCA+IDApXG5cdFx0XHRcdFx0cmVzdWx0ID0gZGlnaXRHcm91cFNlcGFyYXRvciArIHJlc3VsdDtcblx0XHRcdH0gZWxzZSBpZiAobWF0Y2gubGVuZ3RoID4gMSAmJiAoKG1hdGNoWzBdID09PSBcIlxcXCJcIiAmJiBtYXRjaFttYXRjaC5sZW5ndGggLSAxXSA9PT0gXCJcXFwiXCIpIHx8IChtYXRjaFswXSA9PT0gXCInXCIgJiYgbWF0Y2hbbWF0Y2gubGVuZ3RoIC0gMV0gPT09IFwiJ1wiKSkpIHtcblx0XHRcdFx0cmVzdWx0ID0gbWF0Y2guc2xpY2UoMSwgbWF0Y2gubGVuZ3RoIC0gMSkgKyByZXN1bHQ7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJlc3VsdCA9IG1hdGNoICsgcmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdHZhciBjaGFyQ291bnQgPSAwO1xuXHR2YXIgcmVzdWx0QWZ0ZXJEZWNpbWFsID0gXCJcIjtcblx0dmFyIGFkZERlY2ltYWxTZXBhcmF0b3IgPSBmYWxzZTtcblxuXHR3aGlsZSAoZnNBZnRlckRlY2ltYWwubGVuZ3RoID4gMCkge1xuXHRcdG1hdGNoID0gZnNBZnRlckRlY2ltYWwuc2hpZnQoKTtcblxuXHRcdGlmIChtYXRjaCA9PT0gXCIjXCIgfHwgbWF0Y2ggPT09IFwiMFwiKSB7XG5cdFx0XHRpZiAodlN0cmluZ0FmdGVyRGVjaW1hbC5sZW5ndGggPiAwICYmIE51bWJlcih2U3RyaW5nQWZ0ZXJEZWNpbWFsLmpvaW4oXCJcIikpICE9PSAwKSB7XG5cdFx0XHRcdHJlc3VsdEFmdGVyRGVjaW1hbCArPSB2U3RyaW5nQWZ0ZXJEZWNpbWFsLnNoaWZ0KCk7XG5cdFx0XHRcdGFkZERlY2ltYWxTZXBhcmF0b3IgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAobWF0Y2ggPT09IFwiMFwiKSB7XG5cdFx0XHRcdHJlc3VsdEFmdGVyRGVjaW1hbCArPSBcIjBcIjtcblx0XHRcdFx0YWRkRGVjaW1hbFNlcGFyYXRvciA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChtYXRjaC5sZW5ndGggPiAxICYmICgobWF0Y2hbMF0gPT09IFwiXFxcIlwiICYmIG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdID09PSBcIlxcXCJcIikgfHwgKG1hdGNoWzBdID09PSBcIidcIiAmJiBtYXRjaFttYXRjaC5sZW5ndGggLSAxXSA9PT0gXCInXCIpKSkge1xuXHRcdFx0cmVzdWx0QWZ0ZXJEZWNpbWFsICs9IG1hdGNoLnNsaWNlKDEsIG1hdGNoLmxlbmd0aCAtIDEpO1xuXHRcdFx0Ly9hZGREZWNpbWFsU2VwYXJhdG9yID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKChtYXRjaFswXSA9PT0gXCJFXCIgfHwgbWF0Y2hbMF0gPT09IFwiZVwiKSAmJiBtYXRjaFttYXRjaC5sZW5ndGggLSAxXSA9PT0gXCIwXCIgJiYgL1tlRV1bKy1dKlswXSsvLnRlc3QobWF0Y2gpKSB7XG5cdFx0XHRpZiAoZXhwb25lbnQgPCAwKVxuXHRcdFx0XHRtYXRjaCA9IG1hdGNoLnJlcGxhY2UoXCIrXCIsIFwiXCIpLnJlcGxhY2UoXCItXCIsIFwiXCIpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRtYXRjaCA9IG1hdGNoLnJlcGxhY2UoXCItXCIsIFwiXCIpO1xuXHRcdFx0cmVzdWx0QWZ0ZXJEZWNpbWFsICs9IG1hdGNoLnJlcGxhY2UoL1swXSsvLCBmdW5jdGlvbiAoJDApIHtcblx0XHRcdFx0cmV0dXJuIHBhZChleHBvbmVudCwgJDAubGVuZ3RoKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHRBZnRlckRlY2ltYWwgKz0gbWF0Y2g7XG5cdFx0XHQvL2FkZERlY2ltYWxTZXBhcmF0b3IgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHJlc3VsdCArPSAoYWRkRGVjaW1hbFNlcGFyYXRvciA/IGRlY2ltYWxTZXBhcmF0b3IgOiBcIlwiKSArIHJlc3VsdEFmdGVyRGVjaW1hbDtcblx0Ly93aW5kb3cuY29uc29sZS5sb2cocmVzdWx0KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vI2VuZHJlZ2lvbiBmb3JtYXR0aW5nIGZ1bmN0aW9ucy9tZXRob2RzXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYmplY3RJZCh4LCB5LCBjdHgpIHtcblx0eCAqPSBkZXZpY2VQaXhlbEJhY2tpbmdTdG9yZVJhdGlvO1xuXHR5ICo9IGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW87XG5cdHZhciBwaXhlbHMgPSBjdHguZ2V0SW1hZ2VEYXRhKHgsIHksIDIsIDIpLmRhdGE7XG5cdHZhciBpc09iamVjdCA9IHRydWU7XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcblxuXHRcdGlmIChwaXhlbHNbaV0gIT09IHBpeGVsc1tpICsgNF0gfCBwaXhlbHNbaV0gIT09IHBpeGVsc1tpICsgOF0gfCBwaXhlbHNbaV0gIT09IHBpeGVsc1tpICsgMTJdKSB7XG5cdFx0XHRpc09iamVjdCA9IGZhbHNlO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGlzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIFJHQlRvSW50KHBpeGVsc1swXSwgcGl4ZWxzWzFdLCBwaXhlbHNbMl0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Ly93aW5kb3cuY29uc29sZS5sb2cocGl4ZWxzKTtcbn1cblxuLy9leHRyYWN0cyBtb3VzZSBjb29yZGluYXRlcyBmcm9tIHRoZSBldmVudCBwYXJhbWV0ZXJzXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW91c2VDb29yZGluYXRlcyhldikge1xuXHR2YXIgeCA9IDA7XG5cdHZhciB5ID0gMDtcblxuXHRldiA9IGV2IHx8IHdpbmRvdy5ldmVudDtcblxuXHRpZiAoZXYub2Zmc2V0WCB8fCBldi5vZmZzZXRYID09PSAwKSB7XG5cdFx0eCA9IGV2Lm9mZnNldFg7XG5cdFx0eSA9IGV2Lm9mZnNldFk7XG5cdH0gZWxzZSBpZiAoZXYubGF5ZXJYIHx8IGV2LmxheWVyWCA9PSAwKSB7IC8vIEZpcmVmb3hcblx0XHR4ID0gZXYubGF5ZXJYO1xuXHRcdHkgPSBldi5sYXllclk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0eCA9IGV2LnBhZ2VYIC0gZXYudGFyZ2V0Lm9mZnNldExlZnQ7XG5cdFx0eSA9IGV2LnBhZ2VZIC0gZXYudGFyZ2V0Lm9mZnNldFRvcDtcblx0fVxuXG5cdHJldHVybiB7IHg6IHgsIHk6IHkgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb250U3RyaW5nKHByZWZpeCwgb2JqZWN0LCBmYWxsYmFja09iamVjdCkge1xuXHR2YXIgZm9udFN0cmluZyA9IFwiXCI7XG5cblx0dmFyIGZvbnRTdHlsZVN0cmluZyA9IHByZWZpeCA/IHByZWZpeCArIFwiRm9udFN0eWxlXCIgOiBcImZvbnRTdHlsZVwiO1xuXHR2YXIgZm9udFdlaWdodFN0cmluZyA9IHByZWZpeCA/IHByZWZpeCArIFwiRm9udFdlaWdodFwiIDogXCJmb250V2VpZ2h0XCI7XG5cdHZhciBmb250U2l6ZVN0cmluZyA9IHByZWZpeCA/IHByZWZpeCArIFwiRm9udFNpemVcIiA6IFwiZm9udFNpemVcIjtcblx0dmFyIGZvbnRGYW1pbHlTdHJpbmcgPSBwcmVmaXggPyBwcmVmaXggKyBcIkZvbnRGYW1pbHlcIiA6IFwiZm9udEZhbWlseVwiO1xuXG5cblxuXHRmb250U3RyaW5nICs9IG9iamVjdFtmb250U3R5bGVTdHJpbmddID8gb2JqZWN0W2ZvbnRTdHlsZVN0cmluZ10gKyBcIiBcIiA6IChmYWxsYmFja09iamVjdCAmJiBmYWxsYmFja09iamVjdFtmb250U3R5bGVTdHJpbmddKSA/IChmYWxsYmFja09iamVjdFtmb250U3R5bGVTdHJpbmddICsgXCIgXCIpIDogXCJcIjtcblx0Zm9udFN0cmluZyArPSBvYmplY3RbZm9udFdlaWdodFN0cmluZ10gPyBvYmplY3RbZm9udFdlaWdodFN0cmluZ10gKyBcIiBcIiA6IChmYWxsYmFja09iamVjdCAmJiBmYWxsYmFja09iamVjdFtmb250V2VpZ2h0U3RyaW5nXSkgPyAoZmFsbGJhY2tPYmplY3RbZm9udFdlaWdodFN0cmluZ10gKyBcIiBcIikgOiBcIlwiO1xuXHRmb250U3RyaW5nICs9IG9iamVjdFtmb250U2l6ZVN0cmluZ10gPyBvYmplY3RbZm9udFNpemVTdHJpbmddICsgXCJweCBcIiA6IChmYWxsYmFja09iamVjdCAmJiBmYWxsYmFja09iamVjdFtmb250U2l6ZVN0cmluZ10pID8gKGZhbGxiYWNrT2JqZWN0W2ZvbnRTaXplU3RyaW5nXSArIFwicHggXCIpIDogXCJcIjtcblxuXG5cdHZhciBmb250RmFtaWx5ID0gb2JqZWN0W2ZvbnRGYW1pbHlTdHJpbmddID8gb2JqZWN0W2ZvbnRGYW1pbHlTdHJpbmddICsgXCJcIiA6IChmYWxsYmFja09iamVjdCAmJiBmYWxsYmFja09iamVjdFtmb250RmFtaWx5U3RyaW5nXSkgPyAoZmFsbGJhY2tPYmplY3RbZm9udEZhbWlseVN0cmluZ10gKyBcIlwiKSA6IFwiXCI7XG5cblx0aWYgKCFpc0NhbnZhc1N1cHBvcnRlZCAmJiBmb250RmFtaWx5KSB7XG5cdFx0dmFyIGZpcnN0Rm9udEZhbWlseSA9IGZvbnRGYW1pbHkuc3BsaXQoXCIsXCIpWzBdO1xuXG5cdFx0aWYgKGZpcnN0Rm9udEZhbWlseVswXSAhPT0gXCInXCIgJiYgZmlyc3RGb250RmFtaWx5WzBdICE9PSBcIlxcXCJcIilcblx0XHRcdGZpcnN0Rm9udEZhbWlseSA9IFwiJ1wiICsgZmlyc3RGb250RmFtaWx5ICsgXCInXCI7XG5cblx0XHRmb250U3RyaW5nICs9IGZpcnN0Rm9udEZhbWlseTtcblx0fSBlbHNlXG5cdFx0Zm9udFN0cmluZyArPSBmb250RmFtaWx5O1xuXG5cdHJldHVybiBmb250U3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBvYmplY3QsIGZhbGxiYWNrT2JqZWN0KSB7XG5cblx0dmFyIHZhbHVlID0gcHJvcGVydHlOYW1lIGluIG9iamVjdCA/IG9iamVjdFtwcm9wZXJ0eU5hbWVdIDogZmFsbGJhY2tPYmplY3RbcHJvcGVydHlOYW1lXTtcblxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbnZhciBvcHRpbWl6ZUZvckhpRFBJID0gdHJ1ZTtcbi8vb3B0aW1pemVGb3JIaURQSSA9IGZhbHNlO1xuXG52YXIgZGV2aWNlUGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG52YXIgYmFja2luZ1N0b3JlUmF0aW8gPSAxO1xudmFyIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8gPSBvcHRpbWl6ZUZvckhpRFBJID8gZGV2aWNlUGl4ZWxSYXRpbyAvIGJhY2tpbmdTdG9yZVJhdGlvIDogMTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldENhbnZhc1NpemUoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSB7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkICYmICEhb3B0aW1pemVGb3JIaURQSSkge1xuXHRcdHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuXHRcdGJhY2tpbmdTdG9yZVJhdGlvID0gY3R4LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcblx0XHRcdFx0XHRcdFx0Y3R4Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcblx0XHRcdFx0XHRcdFx0Y3R4Lm1zQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuXHRcdFx0XHRcdFx0XHRjdHgub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcblx0XHRcdFx0XHRcdFx0Y3R4LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgMTtcblxuXG5cdFx0ZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbyA9IGRldmljZVBpeGVsUmF0aW8gLyBiYWNraW5nU3RvcmVSYXRpbztcblxuXHRcdGNhbnZhcy53aWR0aCA9IHdpZHRoICogZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbztcblx0XHRjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbztcblxuXHRcdGlmIChkZXZpY2VQaXhlbFJhdGlvICE9PSBiYWNraW5nU3RvcmVSYXRpbykge1xuXG5cdFx0XHRjYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG5cdFx0XHRjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcblxuXHRcdFx0Y3R4LnNjYWxlKGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8sIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8pO1xuXG5cdFx0fVxuXG5cdFx0Ly93aW5kb3cuYWxlcnQoYmFja2luZ1N0b3JlUmF0aW8pO1xuXHRcdC8vd2luZG93LmFsZXJ0KGRldmljZVBpeGVsUmF0aW8pO1xuXG5cdH0gZWxzZSB7XG5cdFx0Y2FudmFzLndpZHRoID0gd2lkdGg7XG5cdFx0Y2FudmFzLmhlaWdodCA9IGhlaWdodDtcblx0fVxuXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KSB7XG5cdHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuXHRjYW52YXMuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJjYW52YXNqcy1jaGFydC1jYW52YXNcIik7XG5cblx0c2V0Q2FudmFzU2l6ZShjYW52YXMsIHdpZHRoLCBoZWlnaHQpO1xuXG5cdGlmICghaXNDYW52YXNTdXBwb3J0ZWQgJiYgdHlwZW9mIChHX3ZtbENhbnZhc01hbmFnZXIpICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0R192bWxDYW52YXNNYW5hZ2VyLmluaXRFbGVtZW50KGNhbnZhcyk7XG5cdH1cblxuXHRyZXR1cm4gY2FudmFzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0Q2FudmFzKGNhbnZhcywgZm9ybWF0LCBmaWxlTmFtZSkge1xuXHRpZiAoIWNhbnZhcyB8fCAhZm9ybWF0IHx8ICFmaWxlTmFtZSlcblx0XHRyZXR1cm47XG5cblx0dmFyIGZ1bGxGaWxlTmFtZSA9IGZpbGVOYW1lICsgXCIuXCIgKyAoZm9ybWF0ID09PSBcImpwZWdcIiA/IFwianBnXCIgOiBmb3JtYXQpO1xuXHR2YXIgbWltZVR5cGUgPSBcImltYWdlL1wiICsgZm9ybWF0O1xuXHR2YXIgaW1nID0gY2FudmFzLnRvRGF0YVVSTChtaW1lVHlwZSk7XG5cdHZhciBzYXZlZCA9IGZhbHNlO1xuXG5cdHZhciBkb3dubG9hZExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcblx0ZG93bmxvYWRMaW5rLmRvd25sb2FkID0gZnVsbEZpbGVOYW1lO1xuXHRkb3dubG9hZExpbmsuaHJlZiA9IGltZztcblx0ZG93bmxvYWRMaW5rLnRhcmdldCA9IFwiX2JsYW5rXCI7XG5cdHZhciBlO1xuXG5cblx0aWYgKHR5cGVvZiAoQmxvYikgIT09IFwidW5kZWZpbmVkXCIgJiYgISFuZXcgQmxvYigpKSB7XG5cblx0XHQvL2FsZXJ0KFwiYmxvYlwiKTtcblx0XHR2YXIgaW1nRGF0YSA9IGltZy5yZXBsYWNlKC9eZGF0YTpbYS16L10qO2Jhc2U2NCwvLCAnJyk7XG5cblx0XHR2YXIgYnl0ZVN0cmluZyA9IGF0b2IoaW1nRGF0YSk7XG5cdFx0dmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XG5cdFx0dmFyIGludEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpKyspIHtcblx0XHRcdGludEFycmF5W2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuXHRcdH1cblxuXHRcdHZhciBibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogXCJpbWFnZS9cIiArIGZvcm1hdCB9KTtcblxuXHRcdC8vIFNhdmUgdGhlIGJsb2Jcblx0XHR0cnkge1xuXHRcdFx0d2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZ1bGxGaWxlTmFtZSk7XG5cdFx0XHRzYXZlZCA9IHRydWU7XG5cdFx0fVxuXHRcdGNhdGNoIChlKSB7XG5cdFx0XHRkb3dubG9hZExpbmsuZGF0YXNldC5kb3dubG9hZHVybCA9IFttaW1lVHlwZSwgZG93bmxvYWRMaW5rLmRvd25sb2FkLCBkb3dubG9hZExpbmsuaHJlZl0uam9pbignOicpO1xuXHRcdFx0ZG93bmxvYWRMaW5rLmhyZWYgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoIXNhdmVkKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiTW91c2VFdmVudHNcIik7XG5cblx0XHRcdGV2ZW50LmluaXRNb3VzZUV2ZW50KFwiY2xpY2tcIiwgdHJ1ZSwgZmFsc2UsIHdpbmRvdyxcblx0XHRcdFx0XHRcdFx0IDAsIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsXG5cdFx0XHRcdFx0XHRcdCBmYWxzZSwgMCwgbnVsbCk7XG5cblx0XHRcdGlmIChkb3dubG9hZExpbmsuZGlzcGF0Y2hFdmVudCkge1xuXHRcdFx0XHQvL2FsZXJ0KFwiZGlzcGF0Y2hFdmVudFwiKTtcblx0XHRcdFx0ZG93bmxvYWRMaW5rLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoZG93bmxvYWRMaW5rLmZpcmVFdmVudCkge1xuXHRcdFx0XHQvL2FsZXJ0KFwiZmlyZUV2ZW50XCIpO1xuXHRcdFx0XHRkb3dubG9hZExpbmsuZmlyZUV2ZW50KFwib25jbGlja1wiKTtcblx0XHRcdH1cblxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHZhciB3aW4gPSB3aW5kb3cub3BlbigpO1xuXHRcdFx0Ly9hbGVydChcIjxJRTEwXCIpO1xuXHRcdFx0Ly93aW5kb3cuY29uc29sZS5sb2coXCJJRVwiKTtcblx0XHRcdHdpbi5kb2N1bWVudC53cml0ZShcIjxpbWcgc3JjPSdcIiArIGltZyArIFwiJz48L2ltZz48ZGl2PlBsZWFzZSByaWdodCBjbGljayBvbiB0aGUgaW1hZ2UgYW5kIHNhdmUgaXQgdG8geW91ciBkZXZpY2U8L2Rpdj5cIik7XG5cdFx0XHR3aW4uZG9jdW1lbnQuY2xvc2UoKTtcblx0XHR9XG5cdH1cbn1cblxudmFyIGJhc2U2NEltYWdlcyA9IHtcblx0cmVzZXQ6IHtcblx0XHRpbWFnZTogXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWNDQVlBQUFBQXdyMGlBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUxFZ0FBQ3hJQjB0MSsvQUFBQUJ4MFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1JtbHlaWGR2Y210eklFTlROdWk4c293QUFBS1JTVVJCVkVpSnJkWS9pRjFGRk1meHp3blpyR0lTVVNSL0pMR0lob2gvUWlSTkJMV3hNTElXRWt3YmdpQW9GZ29XMm1obFk2ZGdwWTJJbFJCUnhCU0toU0FLSWtsV0pSWXVNWktBaGl5b3BBaWFUWTdGdlJ0bVorL2VkOS96SFJqZXpMdzV2L085ZDg2Y3VaR1pwbVVSQWZkbjVvOURmZFpOTFhwanorTHppUGd5SWw2TWlHMGpQVEp6WkJ1eURyUDRCVm0wUC9BS2JsalRiNFRvWS9nR2V3WUE3S3lDbCsxYjNEVVlBTnZ3YmlIdzBnQ0FHUnpCT3pqVEFYRU91MGNDNENoK3I1eC9IcnBkcmNabXZJREZTdWNNdG5ZQ1lDKys2SG1ORHc4RktEVDM0RVRyZjYzOS9hek9yNXZ3UmsvZzVmYmV1QUJ0Z0MwNFhXazlWUUxjaU1QNEVILzNBRnpFclJOQzdNWGxRbXNlc1NvSHNHUEUyM2htRW9CVys2MUs2NkhNWEZtSU12TjhteWlsWFMzNlIwMXViK0tmWXZ3NDNaWHdZRFgrQUhQNEJBY2k0cEZKb21mbXIvaWhtTm9mRVNzQkltSkdrN21sbmNyTTQ1bjVKUGJoejBrQVdwc3YranV4YVgyMVlJUG1WSlMydU56Sk1TNlpOZXhDMGQrSTdmVVdYTEZ5ejJrU1pscFdQdkFTbG1xQWYvRlhOWGYzRkFGMkYvMUx1RmlmQWxpb25CNmRSdVNJMkl3SGk2bHptWG1wNnhSOFhZMGZpSWg3cHNBd2grM0Z1RGtSSFFWamwrYThsa1hqbzBrTFVLSDdYYVY1b084NlBtWjFGVHp5UDRLL1hHbDl2L3p3ZmJXN0JyaWl1RVRHQ1A1Y2g5YmM5Zjk3SEYvdmNGekNhNWdkRVBnV3ErdC80djBWNjNvRTF1RjRoMERpRko3SG5TV01wcERkaDFkeHRzUHZKMndjQk5BS2JzSlhhMENrNW9wZGFCUHNSTnUvdXNiYTA5aTFLc2FBVnptTHQzc2doclJqdUsxVGY0eGtlZ0lueHd5OGdLZjdkS01WSDJRUnNWNXpYUi9DZnR5dSthS2FLYmJrUXJzZEgrUFR6THpjcXprT1FBVnpNKzdGSGRpcXFlMi9ZVDR6Ri90OFMvc1BtYXd5dkM5NzR2Y0FBQUFBU1VWT1JLNUNZSUk9XCJcblx0fSxcblx0cGFuOiB7XG5cdFx0aW1hZ2U6IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFMRWdBQUN4SUIwdDErL0FBQUFCeDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdSbWx5WlhkdmNtdHpJRU5UTnVpOHNvd0FBQUpWU1VSQlZGaUZ2WmU3YTFSQkdNVi94MmhXSTRKcGZLQ0lpU0JLT29PQ2tJRC93UDRCRnFJSUZrRTAyQ2hJaUM4UURLbFNpSTNZcVJCc0JWR3dVTkFVZGlJRVVnamlBelFJSXN1S0pzZml6c1hyNXQ3ZCs4am13TERmekh6M25MT3pjNytaeFRabEd5RGdaaVdPQ3VKOXdIMmdDVXl1cVFGZ0YvQUdjS0pOcllrQllCajQwQ0lldCttdUdRaS85NmtNNFdTN0MvVG01VlVnN3doSmc4QmtFR2tDUjRCRFlmb2RzQURVZ1A2d0VyTzVpQ3Rzd3N1SmIzMmhkYlh5OHF6TDVUSWRtekppbkhkWm9aSUJaY1NGa0dsQUtzMVozWUNrZXRaY0J0b3V1YVFOa3JibE1pQnBCcmhtZTdtQWdVNHdNQ3ZwY0ZzRGtxNEM1NERGVlJUSDloK2k2dmxFMHI1VUE1SW1nQ3VoMjhqQjI4aUlzN0JJVkNPZVN0b1pENjRQNHVQQWpVVHlnS1N4MkZzSzJUSXdrdWdmazlRa2ZkL0UreU1XSFFDZVNScXgvUjNnT3AzTGF6ZmFTMkM0QjVnSERnRDdVOXgzRTN1QUg3S05wQzNBSEhBd1RMNEZIZ005R1E4dkFhUEEwZEIvQWJ4cWsyL2dCTEE5TVhiYTlyMWsvZDRMZkEzSnR3dWVCZU01OHVjUytlZFhuQVcyM3dQMTBOM2FkdkVpOUNYaXpUbnlONGJQUzdabjRzSC9kcTN0MThBWTRlMVlMWVN5M2cvY3NqMlZuRnNoWlB1T3BPZVNLSENvZFVJTnVHajdZZXRFNmplMVBWOVFvTlBKOVN0TkhLb2R4N25SYmlXckdIQkdYQWk1RFVpcXRRd3RwY1dLMEp1YnQ4Q2x0QTVNRVYxSWZ3TzcrVmZmUHdHZmlhNW0zNENUNGJYdWpJSVgwUW5hMS9jR01OcVYvd1VKRTJjenhEOENRNFg1U2w3Sno3U0lMd0NEcGJqS1BCUk1IQWQrRXRYNEhXVjVTcGRjMnc4a0RRR1BiSDhweS9NWE15Z002OS9GS3o0QUFBQUFTVVZPUks1Q1lJST1cIlxuXHR9LFxuXHR6b29tOiB7XG5cdFx0aW1hZ2U6IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFLNndBQUN1c0Jnb3NOV2dBQUFCeDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdSbWx5WlhkdmNtdHpJRU5UTnVpOHNvd0FBQU1xU1VSQlZGaUZ2ZGZiajkxVEZNRHh6NTdVNkdVRU1TMWFZenlNdENTU0RoV2pDWk1JbnBBSTNraEUvUUh0Z3pkUmtYZ1NDUzhTRVM5ZXBLTGkwb1JLTkVUalJhaFJFcTJLUzFzdGRSdWp0RFB0YkE5N241emRuOSs1ekp4VEs5azV2M1BPWG10OTkxcDdyNzErSWNhb0d3a2hUT0llYk1ScXpPQlR2SUczWTR6VFhSbXFTb3l4NWNBS2JNSk9ITUZKbk1aOC9qeUZhWHlNUjdHNm5iMWFIMjJjUDRCdmNCeHppRzNHS2Z5VElSOUQ2QllnMUtVZ2hQQkNEdmVGbGIvMjRBdjhpdVVZdzQxWVZzejVHN3V4S2NaNGFNRXB3R3Q1TlkzVi9ZYkhzUTZyY0FIT3cva1l4aWdld3I1Q1p3NGZZR3hCS2NDTE9GRVllaFhyTWRSaHI1eUxFVHhWU2NzT0xPa0tBUGZuMVRZTVBJdkxGclNoVWxTMkZEWm04WFJIQUN6RkFXbDNSMnhicVBNQ1lobWVMQ0FPWUVNbmdBY3piY1R2dUhZeHpndUl5L0Zlc1I5ZTZnU3dVL09vUFlIQkhnSGd2aUlLWDJGbHE3azM0S2htY1ZuYmkvUEM4Slg0TWdNY3hiMTE4d1p3ZHo1YUlTc2NxeDdWUmNveDdNclBRN2krYnRJQUpyQWtmOStiSTlFUG1aWTJJQXhpVFN1QWxkTHE0WTkrQWNTVWg3OEtQMHRiQWN3VTM1Y1hNRDFKQ0lGVW9HaWVobHFBejZUTkIxZjFDMERLKzBoK25zTlByUUMyYTRicUdtbEQ5a09HY1d0K1BvNnBWZ0R2U3hmSmFTa0ZkNFVRQnZvQXNCWWJDb0IzYTJmbE03c2xBMFI4aXl0NnJBRkRlRFBibThlT1RwVndHRDlxVnE3bkxiSWFabm1rc1BVMUp0c0NaTVhObXBkUnhGYXNXSVR6aDZYajNMQ3pyYTFPeGNEMlFqSGlHVnpkcGZPUm5NcVppbzJQY0YyM0FCZEpGMU5wNEJQcHRseVBpNld6UFlCenBKWnRIZTdBNnhXOWNueVA4VHFBLy9TRUlZUkw4Qnh1bDdyaWh2d2d0Vm43OFdjR0daWGE5SEdkNVREdWpESHVPZVBYTmlIZEtqV2daWC9ZYnN4THgva3RxYmpWelRsY2pVU252STVKcmRsVVZwNldlc1paNlIxaFJycHE5K0VWVEdTOWpUallBdUtJb3VHcGJjdXJFa0lZeEMwNTFLTlNhbWF6c2MreEs4YjRTMFZuRWkvajBocVRQK00yN08yNThlZ1F3WnV6czdwSTdNZjRXUVhJRURjNXM5c3V4KzUrMVB5MkVtUDhVT3E2R3ZXaElTY3hmZFlqVUVSaUF0OUpkODRKNmExNnpmOEpFS1QzeUNtOGcxVXhSdjhDQzRweVJoelIxdVVBQUFBQVNVVk9SSzVDWUlJPVwiXG5cdH0sXG5cdG1lbnU6IHtcblx0XHRpbWFnZTogXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQWdDQVlBQUFBYmlmak1BQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUs2d0FBQ3VzQmdvc05XZ0FBQUJ4MFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1JtbHlaWGR2Y210eklFTlROdWk4c293QUFBQVdkRVZZZEVOeVpXRjBhVzl1SUZScGJXVUFNRGN2TVRVdk1UVFBzdlUwQUFBQVAwbEVRVlJJaWUyU01Rb0FJQkREVXZIL1g2NjdnOHNKSjlLT2hZWU9rVzBxR2FVMU1QZEMwdkdTYlYxOUVBQ28zWU1QQUZINUJVQlVqc3FmQVBwVlh0TmdHRGZ4RURDdEFBQUFBRWxGVGtTdVFtQ0NcIlxuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRCdXR0b25TdGF0ZShjaGFydCwgYnV0dG9uLCBzdGF0ZSkge1xuXHRpZiAoYnV0dG9uLmdldEF0dHJpYnV0ZShcInN0YXRlXCIpICE9PSBzdGF0ZSkge1xuXG5cdFx0YnV0dG9uLnNldEF0dHJpYnV0ZShcInN0YXRlXCIsIHN0YXRlKTtcblx0XHRidXR0b24uc2V0QXR0cmlidXRlKFwidHlwZVwiLCAnYnV0dG9uJyk7XG5cdFx0YnV0dG9uLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuXHRcdGJ1dHRvbi5zdHlsZS5tYXJnaW4gPSBcIjBweCAwcHggMHB4IDBweFwiO1xuXHQgICAgYnV0dG9uLnN0eWxlLnBhZGRpbmcgPSBcIjNweCA0cHggMHB4IDRweFwiO1xuXHQgICAgYnV0dG9uLnN0eWxlLmNzc0Zsb2F0ID0gXCJsZWZ0XCI7XG5cdFx0YnV0dG9uLnNldEF0dHJpYnV0ZShcInRpdGxlXCIsIGNoYXJ0Ll9jdWx0dXJlSW5mb1tzdGF0ZSArIFwiVGV4dFwiXSk7XG5cdCAgICBidXR0b24uaW5uZXJIVE1MID0gXCI8aW1nIHN0eWxlPSdoZWlnaHQ6MTZweDsnIHNyYz0nXCIgKyBiYXNlNjRJbWFnZXNbc3RhdGVdLmltYWdlICsgXCInIGFsdD0nXCIgKyBjaGFydC5fY3VsdHVyZUluZm9bc3RhdGUgKyBcIlRleHRcIl0gKyBcIicgLz5cIjtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdygpIHtcblxuXHR2YXIgZWxlbWVudCA9IG51bGw7XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRlbGVtZW50ID0gYXJndW1lbnRzW2ldO1xuXHRcdGlmIChlbGVtZW50LnN0eWxlKVxuXHRcdFx0ZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmVcIjtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGlkZSgpIHtcblxuXHR2YXIgZWxlbWVudCA9IG51bGw7XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRlbGVtZW50ID0gYXJndW1lbnRzW2ldO1xuXHRcdGlmIChlbGVtZW50ICYmIGVsZW1lbnQuc3R5bGUpXG5cdFx0XHRlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgaXNDYW52YXNTdXBwb3J0ZWQgPSAhIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikuZ2V0Q29udGV4dDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJlemllclBvaW50cyhwb2ludHMsIHRlbnNpb24pIHtcblxuXHR2YXIgYmV6aWVyUG9pbnRzID0gW107XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdGlmIChpID09IDApIHtcblx0XHRcdGJlemllclBvaW50cy5wdXNoKHBvaW50c1swXSk7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHR2YXIgaTEsIGkyLCBwb2ludEluZGV4O1xuXG5cdFx0cG9pbnRJbmRleCA9IGkgLSAxO1xuXHRcdGkxID0gcG9pbnRJbmRleCA9PT0gMCA/IDAgOiBwb2ludEluZGV4IC0gMTtcblx0XHRpMiA9IHBvaW50SW5kZXggPT09IHBvaW50cy5sZW5ndGggLSAxID8gcG9pbnRJbmRleCA6IHBvaW50SW5kZXggKyAxO1xuXG5cdFx0dmFyIGRydjEgPSB7XG5cdFx0XHR4OiAocG9pbnRzW2kyXS54IC0gcG9pbnRzW2kxXS54KSAvIHRlbnNpb24sIHk6IChwb2ludHNbaTJdLnkgLSBwb2ludHNbaTFdLnkpIC8gdGVuc2lvblxuXHRcdH1cblx0XHR2YXIgY3AxID0ge1xuXHRcdFx0eDogcG9pbnRzW3BvaW50SW5kZXhdLnggKyBkcnYxLnggLyAzLCB5OiBwb2ludHNbcG9pbnRJbmRleF0ueSArIGRydjEueSAvIDNcblx0XHR9XG5cdFx0YmV6aWVyUG9pbnRzW2JlemllclBvaW50cy5sZW5ndGhdID0gY3AxO1xuXG5cblx0XHRwb2ludEluZGV4ID0gaTtcblx0XHRpMSA9IHBvaW50SW5kZXggPT09IDAgPyAwIDogcG9pbnRJbmRleCAtIDE7XG5cdFx0aTIgPSBwb2ludEluZGV4ID09PSBwb2ludHMubGVuZ3RoIC0gMSA/IHBvaW50SW5kZXggOiBwb2ludEluZGV4ICsgMTtcblxuXHRcdHZhciBkcnYyID0ge1xuXHRcdFx0eDogKHBvaW50c1tpMl0ueCAtIHBvaW50c1tpMV0ueCkgLyB0ZW5zaW9uLCB5OiAocG9pbnRzW2kyXS55IC0gcG9pbnRzW2kxXS55KSAvIHRlbnNpb25cblx0XHR9XG5cdFx0dmFyIGNwMiA9IHtcblx0XHRcdHg6IHBvaW50c1twb2ludEluZGV4XS54IC0gZHJ2Mi54IC8gMywgeTogcG9pbnRzW3BvaW50SW5kZXhdLnkgLSBkcnYyLnkgLyAzXG5cdFx0fVxuXHRcdGJlemllclBvaW50c1tiZXppZXJQb2ludHMubGVuZ3RoXSA9IGNwMjtcblxuXHRcdGJlemllclBvaW50c1tiZXppZXJQb2ludHMubGVuZ3RoXSA9IHBvaW50c1tpXTtcblx0fVxuXG5cdHJldHVybiBiZXppZXJQb2ludHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0UGVyY2VudFRvVmFsdWUoaW5wdXQsIHJlZmVyZW5jZVZhbHVlKSB7XG5cdC8vaW5wdXQgY2FuIGJlIGEgbnVtYmVyIG9yIHN0cmluZ1xuXHRpZiAoaW5wdXQgPT09IG51bGwgfHwgdHlwZW9mIChpbnB1dCkgPT09IFwidW5kZWZpbmVkXCIpXG5cdFx0cmV0dXJuIHJlZmVyZW5jZVZhbHVlO1xuXG5cdHZhciByZXN1bHQgPSBwYXJzZUZsb2F0KGlucHV0LnRvU3RyaW5nKCkpICogKGlucHV0LnRvU3RyaW5nKCkuaW5kZXhPZihcIiVcIikgPj0gMCA/IHJlZmVyZW5jZVZhbHVlIC8gMTAwIDogMSk7XG5cblx0Ly8gbGltaXQgdG8gcGxvdCBhcmVhXG5cdGlmICghaXNOYU4ocmVzdWx0KSAmJiByZXN1bHQgPD0gcmVmZXJlbmNlVmFsdWUgJiYgcmVzdWx0ID49IDApXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHRyZXR1cm4gcmVmZXJlbmNlVmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3UmVjdChjdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgYm9yZGVyVGhpY2tuZXNzLCBib3JkZXJDb2xvciwgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCBmaWxsT3BhY2l0eSkge1xuXHRpZiAodHlwZW9mIChmaWxsT3BhY2l0eSkgPT09IFwidW5kZWZpbmVkXCIpXG5cdFx0ZmlsbE9wYWNpdHkgPSAxO1xuXG5cdGJvcmRlclRoaWNrbmVzcyA9IGJvcmRlclRoaWNrbmVzcyB8fCAwO1xuXHRib3JkZXJDb2xvciA9IGJvcmRlckNvbG9yIHx8IFwiYmxhY2tcIjtcblx0Ly9hbGVydChcInRvcFwiKyB0b3AgKyBcImJvdHRvbVwiICsgYm90dG9tICsgXCIgbHRcIiArIGxlZnQrIFwicnRcIiArIHJpZ2h0IClcblx0dmFyIGExID0geDEsIGEyID0geDIsIGIxID0geTEsIGIyID0geTIsIGVkZ2VZLCBlZGdlWDtcblx0aWYgKHgyIC0geDEgPiAxNSAmJiB5MiAtIHkxID4gMTUpXG5cdFx0dmFyIGJldmVsRGVwdGggPSA4O1xuXHRlbHNlXG5cdFx0dmFyIGJldmVsRGVwdGggPSAwLjM1ICogTWF0aC5taW4oKHgyIC0geDEpLCAoeTIgLSB5MSkpO1xuXHQvL2FsZXJ0KGExICsgXCJcIiArIGEyKTtcblx0dmFyIGNvbG9yMiA9IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAuNClcIjtcblx0dmFyIGNvbG9yMyA9IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpXCI7XG5cdC8vY29sb3IxID0gXCJyZ2JhKFwiICsgciArIFwiLFwiICsgZyArIFwiLCBcIiArIGIgKyBcIiwxKVwiO1xuXHR2YXIgY29sb3IxID0gY29sb3I7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRjdHgubW92ZVRvKHgxLCB5MSk7XG5cdGN0eC5zYXZlKCk7XG5cdGN0eC5maWxsU3R5bGUgPSBjb2xvcjE7XG5cblx0Y3R4Lmdsb2JhbEFscGhhID0gZmlsbE9wYWNpdHk7XG5cdGN0eC5maWxsUmVjdCh4MSwgeTEsIHgyIC0geDEsIHkyIC0geTEpO1xuXHRjdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG5cdGlmIChib3JkZXJUaGlja25lc3MgPiAwKSB7XG5cdFx0dmFyIG9mZnNldCA9IGJvcmRlclRoaWNrbmVzcyAlIDIgPT09IDAgPyAwIDogLjU7XG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdGN0eC5saW5lV2lkdGggPSBib3JkZXJUaGlja25lc3M7XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gYm9yZGVyQ29sb3I7XG5cdFx0Y3R4Lm1vdmVUbyh4MSwgeTEpO1xuXHRcdGN0eC5yZWN0KHgxIC0gb2Zmc2V0LCB5MSAtIG9mZnNldCwgeDIgLSB4MSArIDIgKiBvZmZzZXQsIHkyIC0geTEgKyAyICogb2Zmc2V0KTtcblx0XHRjdHguc3Ryb2tlKCk7XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXHQvLyAgIGN0eC5iZWdpblBhdGgoKTtcblx0aWYgKHRvcCA9PT0gdHJ1ZSkge1xuXHRcdC8vIGFsZXJ0KHgxICsgXCJcIiArIHgyICsgXCIgXCIgKyBiZXZlbERlcHRoKTtcblx0XHRjdHguc2F2ZSgpO1xuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRjdHgubW92ZVRvKHgxLCB5MSk7XG5cdFx0Y3R4LmxpbmVUbyh4MSArIGJldmVsRGVwdGgsIHkxICsgYmV2ZWxEZXB0aCk7XG5cdFx0Y3R4LmxpbmVUbyh4MiAtIGJldmVsRGVwdGgsIHkxICsgYmV2ZWxEZXB0aCk7XG5cdFx0Y3R4LmxpbmVUbyh4MiwgeTEpO1xuXHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHR2YXIgZ3JkID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KCh4MiArIHgxKSAvIDIsIGIxICsgYmV2ZWxEZXB0aCwgKHgyICsgeDEpIC8gMiwgYjEpO1xuXHRcdGdyZC5hZGRDb2xvclN0b3AoMCwgY29sb3IxKTtcblx0XHRncmQuYWRkQ29sb3JTdG9wKDEsIGNvbG9yMik7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IGdyZDtcblx0XHRjdHguZmlsbCgpO1xuXHRcdC8vICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG5cdFx0Y3R4LnJlc3RvcmUoKTtcblx0fVxuXG5cblx0aWYgKGJvdHRvbSA9PT0gdHJ1ZSkge1xuXHRcdGN0eC5zYXZlKCk7XG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdGN0eC5tb3ZlVG8oeDEsIHkyKTtcblx0XHRjdHgubGluZVRvKHgxICsgYmV2ZWxEZXB0aCwgeTIgLSBiZXZlbERlcHRoKTtcblx0XHRjdHgubGluZVRvKHgyIC0gYmV2ZWxEZXB0aCwgeTIgLSBiZXZlbERlcHRoKTtcblx0XHRjdHgubGluZVRvKHgyLCB5Mik7XG5cdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXHRcdHZhciBncmQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoKHgyICsgeDEpIC8gMiwgYjIgLSBiZXZlbERlcHRoLCAoeDIgKyB4MSkgLyAyLCBiMik7XG5cdFx0Z3JkLmFkZENvbG9yU3RvcCgwLCBjb2xvcjEpO1xuXHRcdGdyZC5hZGRDb2xvclN0b3AoMSwgY29sb3IyKTtcblx0XHRjdHguZmlsbFN0eWxlID0gZ3JkO1xuXHRcdC8vICAgICAgIGN0eC5zdHJva2UoKTtcblx0XHRjdHguZmlsbCgpO1xuXHRcdGN0eC5yZXN0b3JlKCk7XG5cdH1cblxuXHRpZiAobGVmdCA9PT0gdHJ1ZSkge1xuXHRcdC8vICAgYWxlcnQoeDEpXG5cdFx0Y3R4LnNhdmUoKTtcblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4Lm1vdmVUbyh4MSwgeTEpXG5cdFx0Y3R4LmxpbmVUbyh4MSArIGJldmVsRGVwdGgsIHkxICsgYmV2ZWxEZXB0aCk7XG5cdFx0Y3R4LmxpbmVUbyh4MSArIGJldmVsRGVwdGgsIHkyIC0gYmV2ZWxEZXB0aCk7XG5cdFx0Y3R4LmxpbmVUbyh4MSwgeTIpO1xuXHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHR2YXIgZ3JkID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KGExICsgYmV2ZWxEZXB0aCwgKHkyICsgeTEpIC8gMiwgYTEsICh5MiArIHkxKSAvIDIpO1xuXHRcdGdyZC5hZGRDb2xvclN0b3AoMCwgY29sb3IxKTtcblx0XHRncmQuYWRkQ29sb3JTdG9wKDEsIGNvbG9yMyk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IGdyZDtcblx0XHRjdHguZmlsbCgpO1xuXHRcdC8vICAgICBjdHguc3Ryb2tlKCk7XG5cdFx0Y3R4LnJlc3RvcmUoKTtcblx0fVxuXG5cblx0aWYgKHJpZ2h0ID09PSB0cnVlKSB7XG5cdFx0Y3R4LnNhdmUoKTtcblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4Lm1vdmVUbyh4MiwgeTEpXG5cdFx0Y3R4LmxpbmVUbyh4MiAtIGJldmVsRGVwdGgsIHkxICsgYmV2ZWxEZXB0aCk7XG5cdFx0Y3R4LmxpbmVUbyh4MiAtIGJldmVsRGVwdGgsIHkyIC0gYmV2ZWxEZXB0aCk7XG5cdFx0Y3R4LmxpbmVUbyh4MiwgeTIpO1xuXHRcdHZhciBncmQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoYTIgLSBiZXZlbERlcHRoLCAoeTIgKyB5MSkgLyAyLCBhMiwgKHkyICsgeTEpIC8gMik7XG5cdFx0Z3JkLmFkZENvbG9yU3RvcCgwLCBjb2xvcjEpO1xuXHRcdGdyZC5hZGRDb2xvclN0b3AoMSwgY29sb3IzKTtcblx0XHRjdHguZmlsbFN0eWxlID0gZ3JkO1xuXHRcdGdyZC5hZGRDb2xvclN0b3AoMCwgY29sb3IxKTtcblx0XHRncmQuYWRkQ29sb3JTdG9wKDEsIGNvbG9yMyk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IGdyZDtcblx0XHRjdHguZmlsbCgpO1xuXHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHQvLyAgICAgICAgICBjdHguc3Ryb2tlKCk7XG5cdFx0Y3R4LnJlc3RvcmUoKTtcblx0fVxuXHQvL1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3U2VnbWVudChjdHgsIGNlbnRlciwgcmFkaXVzLCBjb2xvciwgdHlwZSwgdGhldGExLCB0aGV0YTIsIGZpbGxPcGFjaXR5LCBwZXJjZW50SW5uZXJSYWRpdXMpIHtcblxuXHRpZiAodHlwZW9mIChmaWxsT3BhY2l0eSkgPT09IFwidW5kZWZpbmVkXCIpXG5cdFx0ZmlsbE9wYWNpdHkgPSAxO1xuXG5cdC8vSUU4LSBGSVg6IEluIElFOC0gc2VnbWVudCBkb2Vzbid0IGdldCBkcmF3IGlmIHRoZXRhMiBpcyBlcXVhbCB0byB0aGV0YTEgKyAyKlBJLlxuXHRpZiAoIWlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0dmFyIHRoZXRhMk1vZCA9IE51bWJlcigodGhldGEyICUgKDIgKiBNYXRoLlBJKSkudG9GaXhlZCg4KSk7XG5cdFx0dmFyIHRoZXRhMU1vZCA9IE51bWJlcigodGhldGExICUgKDIgKiBNYXRoLlBJKSkudG9GaXhlZCg4KSk7XG5cdFx0aWYgKHRoZXRhMU1vZCA9PT0gdGhldGEyTW9kKVxuXHRcdFx0dGhldGEyIC09IC4wMDAxO1xuXHR9XG5cblx0Y3R4LnNhdmUoKTtcblx0Y3R4Lmdsb2JhbEFscGhhID0gZmlsbE9wYWNpdHk7XG5cblx0aWYgKHR5cGUgPT09IFwicGllXCIpIHtcblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4Lm1vdmVUbyhjZW50ZXIueCwgY2VudGVyLnkpO1xuXHRcdGN0eC5hcmMoY2VudGVyLngsIGNlbnRlci55LCByYWRpdXMsIHRoZXRhMSwgdGhldGEyLCBmYWxzZSk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IGNvbG9yO1xuXHRcdGN0eC5zdHJva2VTdHlsZSA9IFwid2hpdGVcIjtcblx0XHRjdHgubGluZVdpZHRoID0gMjtcblx0XHQvLyAgICBjdHguc2hhZG93T2Zmc2V0WCA9IDI7XG5cdFx0Ly8gICAgY3R4LnNoYWRvd09mZnNldFkgPSAxO1xuXHRcdC8vICAgICBjdHguc2hhZG93Qmx1ciA9IDI7XG5cdFx0Ly8gICAgY3R4LnNoYWRvd0NvbG9yID0gJyNCRkJGQkYnO1xuXHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHQvL2N0eC5zdHJva2UoKTtcblx0XHRjdHguZmlsbCgpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGUgPT09IFwiZG91Z2hudXRcIikge1xuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRjdHguYXJjKGNlbnRlci54LCBjZW50ZXIueSwgcmFkaXVzLCB0aGV0YTEsIHRoZXRhMiwgZmFsc2UpO1xuXHRcdGN0eC5hcmMoY2VudGVyLngsIGNlbnRlci55LCBwZXJjZW50SW5uZXJSYWRpdXMgKiByYWRpdXMsIHRoZXRhMiwgdGhldGExLCB0cnVlKTtcblx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IGNvbG9yO1xuXHRcdGN0eC5zdHJva2VTdHlsZSA9IFwid2hpdGVcIjtcblx0XHRjdHgubGluZVdpZHRoID0gMjtcblx0XHQvLyBzaGFkb3cgcHJvcGVydGllc1xuXHRcdC8vICAgICBjdHguc2hhZG93T2Zmc2V0WCA9IDE7XG5cdFx0Ly8gICAgY3R4LnNoYWRvd09mZnNldFkgPSAxO1xuXHRcdC8vICAgICBjdHguc2hhZG93Qmx1ciA9IDE7XG5cdFx0Ly8gICAgY3R4LnNoYWRvd0NvbG9yID0gJyNCRkJGQkYnOyAgLy9ncmV5IHNoYWRvd1xuXHRcdC8vY3R4LnN0cm9rZSgpO1xuXHRcdGN0eC5maWxsKCk7XG5cdH1cblxuXHRjdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG5cdGN0eC5yZXN0b3JlKCk7XG59O1xuIiwiLyoqXG4qIEBwcmVzZXJ2ZSBDYW52YXNKUyBIVE1MNSAmIEphdmFTY3JpcHQgQ2hhcnRzIC0gdjEuOC4wIEJldGEgMiAtIGh0dHA6Ly9jYW52YXNqcy5jb20vXG4qIENhbnZhc0pTIENoYXJ0cyBmb2xsb3dzIER1YWwgTGljZW5zaW5nIE1vZGVsIGFzIG1lbnRpb25lZCBiZWxvdy5cbipcbiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tRnJlZSBmb3IgTm9uLUNvbW1lcmNpYWwgVXNlLS0tLS0tLS0tLS0tLS0tLS0tLS1cbipcbiogRm9yIG5vbi1jb21tZXJjaWFsIHB1cnBvc2VzIHlvdSBjYW4gdXNlIHRoZSBzb2Z0d2FyZSBmb3IgZnJlZSB1bmRlciBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwgMy4wIExpY2Vuc2UuIFJlZmVyIHRvIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHRoZSBzYW1lLlxuKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy8zLjAvZGVlZC5lbl9VU1xuKlxuKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS1Db21tZXJjaWFsIExpY2Vuc2UtLS0tLS0tLS0tLS0tLS0tLS0tLVxuKiBDb21tZXJjaWFsIHVzZSBvZiBDYW52YXNKUyByZXF1aXJlcyB5b3UgdG8gcHVyY2hhc2UgYSBsaWNlbnNlLiBXaXRob3V0IGEgY29tbWVyY2lhbCBsaWNlbnNlIHlvdSBjYW4gdXNlIGl0IGZvciBldmFsdWF0aW9uIHB1cnBvc2VzIG9ubHkuIFBsZWFzZSByZWZlciB0byB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGZ1cnRoZXIgZGV0YWlscy5cbiogaHR0cDovL2NhbnZhc2pzLmNvbS9cbipcbioqL1xuaW1wb3J0IENoYXJ0cyBmcm9tICcuLi9jb3JlL2NoYXJ0cyc7XG5pbXBvcnQgQ3VsdHVyZUluZm8gZnJvbSAnLi4vY29yZS9jdWx0dXJlX2luZm8nO1xuaW1wb3J0IHtjb2xvclNldHN9IGZyb20gJy4uL2NvbnN0YW50cy90aGVtZXMnO1xuaW1wb3J0IHtjdWx0dXJlc30gZnJvbSAnLi4vY29uc3RhbnRzL2N1bHR1cmUnO1xuaW1wb3J0IHtudW1iZXJGb3JtYXQsIGRhdGVGb3JtYXR9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gQ2hhcnQoY29udGFpbmVySWQsIG9wdGlvbnMpIHtcblxuICBjb25zdCBfY2hhcnQgPSBuZXcgQ2hhcnRzKGNvbnRhaW5lcklkLCBvcHRpb25zLCB0aGlzKTtcblxuICB0aGlzLnJlbmRlciA9ICgpID0+ICBfY2hhcnQucmVuZGVyKHRoaXMub3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gX2NoYXJ0Ll9vcHRpb25zO1xufTtcblxuXG5leHBvcnQgY29uc3QgYWRkQ29sb3JTZXQgPSAobmFtZSwgY29sb3JTZXQpID0+IHtcblxuICAgIGNvbG9yU2V0c1tuYW1lXSA9IGNvbG9yU2V0O1xuXG59O1xuXG5leHBvcnQgY29uc3QgYWRkQ3VsdHVyZUluZm8gPSAobmFtZSwgY3VsdHVyZUluZm8pID0+IHtcblxuICAgIGN1bHR1cmVzW25hbWVdID0gY3VsdHVyZUluZm87XG5cbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXROdW1iZXIgPSAobnVtYmVyLCBmb3JtYXRTdHJpbmcsIGN1bHR1cmUpID0+IHtcblxuICAgIGN1bHR1cmUgPSBjdWx0dXJlIHx8IFwiZW5cIjtcbiAgICBmb3JtYXRTdHJpbmcgPSBmb3JtYXRTdHJpbmcgfHwgXCIjLCMjMC4jI1wiO1xuXG4gICAgaWYgKCFjdWx0dXJlc1tjdWx0dXJlXSl0aHJvdyBcIlVua25vd24gQ3VsdHVyZSBOYW1lXCI7XG4gICAgZWxzZSBudW1iZXJGb3JtYXQobnVtYmVyLCBmb3JtYXRTdHJpbmcsIG5ldyBDdWx0dXJlSW5mbyhjdWx0dXJlKSk7XG5cbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXREYXRlID0gKGRhdGUsIGZvcm1hdFN0cmluZywgY3VsdHVyZSkgPT4ge1xuXG4gICAgY3VsdHVyZSA9IGN1bHR1cmUgfHwgXCJlblwiO1xuICAgIGZvcm1hdFN0cmluZyA9IGZvcm1hdFN0cmluZyB8fCBcIkREIE1NTSBZWVlZXCI7XG5cbiAgICBpZiAoIWN1bHR1cmVzW2N1bHR1cmVdKXRocm93IFwiVW5rbm93biBDdWx0dXJlIE5hbWVcIjtcbiAgICBlbHNlIGRhdGVGb3JtYXQoZGF0ZSwgZm9ybWF0U3RyaW5nLCBuZXcgQ3VsdHVyZUluZm8oY3VsdHVyZSkpO1xuXG59O1xuXG5DaGFydC52ZXJzaW9uID0gXCJ2MS44LjJcIjtcbiJdfQ==