2
0
Files

1178 lines
92 KiB
JavaScript

import { Injectable, RendererFactory2, ViewChild, Component, Input, Output, EventEmitter, HostListener, ElementRef, Directive, NgModule } from '@angular/core';
import { __generator, __spread, __assign } from 'tslib';
import { randomUniform } from 'd3-random';
import { select } from 'd3-selection';
import { line, curveBasis } from 'd3-shape';
import { BrowserModule } from '@angular/platform-browser';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NlsCanvasService = /** @class */ (function () {
function NlsCanvasService(rendererFactory) {
this.rendererFactory = rendererFactory;
this.renderer = rendererFactory.createRenderer(null, null);
}
Object.defineProperty(NlsCanvasService.prototype, "get", {
get: /**
* @return {?}
*/
function () {
return this.canvas;
},
enumerable: true,
configurable: true
});
/**
* @param {?} el
* @return {?}
*/
NlsCanvasService.prototype.set = /**
* @param {?} el
* @return {?}
*/
function (el) {
this.canvas = el;
};
/**
* @return {?}
*/
NlsCanvasService.prototype.adjustToWindow = /**
* @return {?}
*/
function () {
if (this.canvas) {
this.renderer.setStyle(this.canvas, 'width', this.canvas.innerWidth);
this.renderer.setStyle(this.canvas, 'height', this.canvas.innerHeight);
}
};
NlsCanvasService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
NlsCanvasService.ctorParameters = function () { return [
{ type: RendererFactory2 }
]; };
return NlsCanvasService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NlsHistoryService = /** @class */ (function () {
function NlsHistoryService() {
this.history = [];
}
/**
* @param {?} graphs
* @param {?} config
* @return {?}
*/
NlsHistoryService.prototype.save = /**
* @param {?} graphs
* @param {?} config
* @return {?}
*/
function (graphs, config) {
this.history.push({
date: new Date(),
graphs: graphs,
config: config,
hash: this.hash(graphs)
});
};
/**
* @param {?} graphs
* @return {?}
*/
NlsHistoryService.prototype.hash = /**
* @param {?} graphs
* @return {?}
*/
function (graphs) {
return btoa(JSON.stringify(graphs));
};
/**
* @return {?}
*/
NlsHistoryService.prototype.list = /**
* @return {?}
*/
function () {
return this.history;
};
NlsHistoryService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
NlsHistoryService.ctorParameters = function () { return []; };
return NlsHistoryService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NlsMathService = /** @class */ (function () {
function NlsMathService() {
}
/**
* Calculate distance between to points with coordinates.
* @param {?} a
* @param {?} b
* @return {?}
*/
NlsMathService.prototype.Δ = /**
* Calculate distance between to points with coordinates.
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) {
return Math.pow(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2), 0.5);
};
/**
* @param {?} point
* @param {?} matrix
* @return {?}
*/
NlsMathService.prototype.getClosestCenter = /**
* @param {?} point
* @param {?} matrix
* @return {?}
*/
function (point, matrix) {
if (this.Δ(point, matrix.start) < this.Δ(point, matrix.end)) {
return matrix.start;
}
else {
return matrix.end;
}
};
/**
* @param {?} point
* @param {?} matrix
* @return {?}
*/
NlsMathService.prototype.getFarestCenter = /**
* @param {?} point
* @param {?} matrix
* @return {?}
*/
function (point, matrix) {
if (this.Δ(point, matrix.start) > this.Δ(point, matrix.end)) {
return matrix.start;
}
else {
return matrix.end;
}
};
/**
* @param {?} matrix
* @param {?} overlap
* @return {?}
*/
NlsMathService.prototype.randomPoint = /**
* @param {?} matrix
* @param {?} overlap
* @return {?}
*/
function (matrix, overlap) {
/** @type {?} */
var x = {
min: matrix.center.x - matrix.width * overlap,
max: matrix.center.x + matrix.width * overlap
};
/** @type {?} */
var y = {
min: matrix.center.y - matrix.height * overlap,
max: matrix.center.y + matrix.height * overlap
};
return {
x: randomUniform(x.min, x.max)(),
y: randomUniform(y.min, y.max)()
};
};
/**
* @param {?} width
* @param {?} height
* @return {?}
*/
NlsMathService.prototype.centerOfArea = /**
* @param {?} width
* @param {?} height
* @return {?}
*/
function (width, height) {
return {
x: width * 0.5,
y: height * 0.5
};
};
/**
* @param {?} p1
* @param {?} p2
* @return {?}
*/
NlsMathService.prototype.centerOfPoints = /**
* @param {?} p1
* @param {?} p2
* @return {?}
*/
function (p1, p2) {
return {
x: (p1.x + p2.x) * 0.5,
y: (p1.y + p2.y) * 0.5
};
};
/**
* @param {?} curve
* @return {?}
*/
NlsMathService.prototype.centerOfCurve = /**
* @param {?} curve
* @return {?}
*/
function (curve) {
/** @type {?} */
var genMedian = this.medianPoint(curve);
/** @type {?} */
var p1 = genMedian.next().value;
/** @type {?} */
var p2 = genMedian.next().value;
/** @type {?} */
var radians = this.angleRadians(p1, p2);
return Object.assign(this.centerOfPoints(p1, p2), { ascent: radians });
};
/**
* @param {?} curve
* @return {?}
*/
NlsMathService.prototype.medianOfCurve = /**
* @param {?} curve
* @return {?}
*/
function (curve) {
/** @type {?} */
var genMedian = this.medianPoint(curve);
/** @type {?} */
var p1 = genMedian.next().value;
/** @type {?} */
var p2 = genMedian.next().value;
/** @type {?} */
var p3 = genMedian.next().value;
/** @type {?} */
var radians = this.angleRadians(p2, p3);
// const radians = Math.round(Math.random() * 10000) / 1000;
// @todo if nodes are less than 5 error occures
return Object.assign(p1, { ascent: radians });
};
/**
* @param {?} p1
* @param {?} p2
* @return {?}
*/
NlsMathService.prototype.angleRadians = /**
* @param {?} p1
* @param {?} p2
* @return {?}
*/
function (p1, p2) {
return Math.atan2(p2.y - p1.y, p2.x - p1.x);
};
/**
* @param {?} p1
* @param {?} p2
* @return {?}
*/
NlsMathService.prototype.angleDegree = /**
* @param {?} p1
* @param {?} p2
* @return {?}
*/
function (p1, p2) {
return this.angleRadians(p1, p2) * 180 / Math.PI;
};
/**
* @param {?} list
* @return {?}
*/
NlsMathService.prototype.medianIndex = /**
* @param {?} list
* @return {?}
*/
function (list) {
return Math.floor(list.length * 0.5);
};
/**
* @param {?} points
* @return {?}
*/
NlsMathService.prototype.medianPoint = /**
* @param {?} points
* @return {?}
*/
function (points) {
var index, list;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
list = points.slice();
_a.label = 1;
case 1:
if (!list) return [3 /*break*/, 3];
index = this.medianIndex(points);
return [4 /*yield*/, list[index]];
case 2:
_a.sent();
list.splice(index, 1);
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
};
/**
* Generator for sine bounce
*
* @param {?=} amplitude default to 1 indicates the amplitude in positive as well
* in negative range
* @param {?=} decimals amount of decimal places
* @param {?=} start 0 indicates to initiate with positive numbers, 1 indicates to
* start with negative numbers first
* @return {?}
*/
NlsMathService.prototype.bounce = /**
* Generator for sine bounce
*
* @param {?=} amplitude default to 1 indicates the amplitude in positive as well
* in negative range
* @param {?=} decimals amount of decimal places
* @param {?=} start 0 indicates to initiate with positive numbers, 1 indicates to
* start with negative numbers first
* @return {?}
*/
function (amplitude, decimals, start) {
if (amplitude === void 0) { amplitude = 1; }
if (decimals === void 0) { decimals = 1; }
if (start === void 0) { start = 0; }
var power, step, index, radians;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
power = Math.pow(10, decimals);
step = 2 / (power);
index = 0;
_a.label = 1;
case 1:
radians = Math.PI * step * index + start;
return [4 /*yield*/, Math.round((Math.sin(radians) * amplitude) * power) / power];
case 2:
_a.sent();
index++;
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
};
/**
* @param {?=} startPositive
* @return {?}
*/
NlsMathService.prototype.flipSign = /**
* @param {?=} startPositive
* @return {?}
*/
function (startPositive) {
if (startPositive === void 0) { startPositive = true; }
var sign;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
sign = startPositive ? 1 : -1;
_a.label = 1;
case 1:
return [4 /*yield*/, sign = sign * (-1)];
case 2:
_a.sent();
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
};
NlsMathService.decorators = [
{ type: Injectable },
];
return NlsMathService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NlsGraphService = /** @class */ (function () {
function NlsGraphService(math) {
this.math = math;
}
/**
* @return {?}
*/
NlsGraphService.prototype.get = /**
* @return {?}
*/
function () {
return this.graphs;
};
/**
* @param {?} newGraphs
* @return {?}
*/
NlsGraphService.prototype.set = /**
* @param {?} newGraphs
* @return {?}
*/
function (newGraphs) {
this.graphs = newGraphs;
};
Object.defineProperty(NlsGraphService.prototype, "isAnimated", {
get: /**
* @return {?}
*/
function () {
return this.animation;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NlsGraphService.prototype.startAnimation = /**
* @return {?}
*/
function () {
this.animation = true;
};
/**
* @return {?}
*/
NlsGraphService.prototype.stopAnimation = /**
* @return {?}
*/
function () {
this.animation = false;
};
/**
* @param {?} start
* @param {?} spacing
* @return {?}
*/
NlsGraphService.prototype.spreadOrthogonal = /**
* @param {?} start
* @param {?} spacing
* @return {?}
*/
function (start, spacing) {
var sign, currentPoint, i, currentSpacing;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
sign = this.math.flipSign();
currentPoint = start;
i = 0;
_a.label = 1;
case 1:
currentSpacing = sign.next().value * spacing * i;
currentPoint = this.shiftPoint(currentPoint, start.ascent, currentSpacing);
return [4 /*yield*/, currentPoint];
case 2:
_a.sent();
i++;
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
};
/**
* @param {?} point
* @param {?} radians
* @param {?} spacing
* @return {?}
*/
NlsGraphService.prototype.shiftPoint = /**
* @param {?} point
* @param {?} radians
* @param {?} spacing
* @return {?}
*/
function (point, radians, spacing) {
return {
x: Math.sin(radians * Math.PI) * spacing + point.x,
y: Math.cos(radians * Math.PI) * spacing + point.y
};
};
NlsGraphService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
NlsGraphService.ctorParameters = function () { return [
{ type: NlsMathService }
]; };
return NlsGraphService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/** @type {?} */
var RESIZING_TIMEOUT = 800;
var NlsGraphsComponent = /** @class */ (function () {
function NlsGraphsComponent(canvasService, historyService, math, graphService) {
this.canvasService = canvasService;
this.historyService = historyService;
this.math = math;
this.graphService = graphService;
this.svgChange = new EventEmitter();
this.graphChange = new EventEmitter();
this.genLoadedAllGraphs = this.countLoadedGraphs();
this.resizingWindow = false;
}
/**
* @param {?} event
* @return {?}
*/
NlsGraphsComponent.prototype.onResize = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
clearTimeout(this.resizingWindow);
this.resizingWindow = setTimeout(function () {
_this.canvas = _this.adjustCanvas();
_this.matrix = _this.calcMatrix();
_this.updateGraphs();
}, RESIZING_TIMEOUT);
};
/**
* @param {?} changes
* @return {?}
*/
NlsGraphsComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
this.canvas = this.adjustCanvas();
this.matrix = this.calcMatrix();
if (changes["config"]) {
this.updateGraphs();
}
if (this.restoredHistory && this.restoredHistory.hash !== this.hash) {
this.restoreGraph();
}
};
/**
* @return {?}
*/
NlsGraphsComponent.prototype.restoreGraph = /**
* @return {?}
*/
function () {
this.graphs = this.restoredHistory.graphs;
this.hash = this.restoredHistory.hash;
};
/**
* @return {?}
*/
NlsGraphsComponent.prototype.saveHistory = /**
* @return {?}
*/
function () {
this.hash = this.historyService.hash(this.graphs);
this.historyService.save(this.graphs, this.config);
};
/**
* @return {?}
*/
NlsGraphsComponent.prototype.saveGraph = /**
* @return {?}
*/
function () {
this.graphService.set(this.graphs);
};
/**
* @return {?}
*/
NlsGraphsComponent.prototype.updateGraphs = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var genShiftStart = this.shiftPoint(this.matrix.start, this.config.vectors.start);
/** @type {?} */
var genShiftEnd = this.shiftPoint(this.matrix.end, this.config.vectors.end, false);
console.log(this.matrix);
/** @type {?} */
var curveList = [
{
color: this.config.colors.primary,
start: genShiftStart.next().value,
end: genShiftEnd.next().value
},
{
color: this.config.colors.secondary,
start: genShiftEnd.next().value,
end: genShiftStart.next().value
}
];
this.graphs = curveList.map(function (curve) {
return __assign({}, _this.adjustGraph(curve), { spread: _this.config.spread, interval: _this.config.interval });
});
this.hash = this.historyService.hash(this.graphs);
this.saveHistory();
this.saveGraph();
};
/**
* @param {?} curve
* @return {?}
*/
NlsGraphsComponent.prototype.adjustGraph = /**
* @param {?} curve
* @return {?}
*/
function (curve) {
return Object.assign(curve, {
stroke: this.config.stroke,
start: Object.assign(curve.start, {
direction: this.genVectorPoint(curve.start.point, curve.start.vector)
}),
end: Object.assign(curve.end, {
direction: this.genVectorPoint(curve.end.point, curve.end.vector)
}),
nodes: this.genRandomPoints(this.config.nodes)
});
};
/**
* @param {?} num
* @return {?}
*/
NlsGraphsComponent.prototype.genRandomPoints = /**
* @param {?} num
* @return {?}
*/
function (num) {
/** @type {?} */
var generatedPoints = [];
for (var i = 0; i < this.config.nodes; i++) {
generatedPoints.push(this.math.randomPoint(this.matrix, this.config.overlap));
}
return generatedPoints;
};
/**
* @param {?} x
* @return {?}
*/
NlsGraphsComponent.prototype.flipflop = /**
* @param {?} x
* @return {?}
*/
function (x) {
return (x === 'start') ? 'end' : 'start';
};
/**
* @return {?}
*/
NlsGraphsComponent.prototype.adjustCanvas = /**
* @return {?}
*/
function () {
this.canvasService.set(this.canvas);
this.canvasService.adjustToWindow();
return this.svgElementRef.nativeElement;
};
/**
* @return {?}
*/
NlsGraphsComponent.prototype.calcMatrix = /**
* @return {?}
*/
function () {
/** @type {?} */
var canvasWidth = this.canvas.getBoundingClientRect().width;
/** @type {?} */
var canvasHeight = this.canvas.getBoundingClientRect().height;
/** @type {?} */
var totalCenter = this.math.centerOfArea(canvasWidth, canvasHeight);
return {
start: {
x: 0,
y: canvasHeight - this.config.vectors.spacing - this.config.margin.y
},
end: {
x: canvasWidth - this.config.vectors.spacing - this.config.margin.x,
y: 0
},
width: canvasWidth,
height: canvasHeight,
center: totalCenter
};
};
/**
* @param {?} point
* @param {?} vector
* @return {?}
*/
NlsGraphsComponent.prototype.genVectorPoint = /**
* @param {?} point
* @param {?} vector
* @return {?}
*/
function (point, vector) {
/** @type {?} */
var range = this.math.Δ(this.matrix.start, this.matrix.end) * this.config.vectors.range;
return {
x: range * Math.sin(Math.PI * vector) + point.x,
y: range * Math.cos(Math.PI * vector) + point.y
};
};
/**
* @param {?} point
* @param {?} vector
* @param {?=} startPositive
* @return {?}
*/
NlsGraphsComponent.prototype.shiftPoint = /**
* @param {?} point
* @param {?} vector
* @param {?=} startPositive
* @return {?}
*/
function (point, vector, startPositive) {
if (startPositive === void 0) { startPositive = true; }
var genShiftX, genShiftY;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
genShiftX = this.shiftNumber(this.config.vectors.spacing, vector, startPositive);
genShiftY = this.shiftNumber(this.config.vectors.spacing, vector, startPositive);
_a.label = 1;
case 1:
return [4 /*yield*/, {
point: {
x: Math.cos(Math.PI * vector) * genShiftX.next().value + point.x,
y: Math.sin(Math.PI * vector) * genShiftY.next().value + point.y,
},
vector: vector
}];
case 2:
_a.sent();
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
};
/**
* @param {?} space
* @param {?} vector
* @param {?=} startPositive
* @return {?}
*/
NlsGraphsComponent.prototype.shiftNumber = /**
* @param {?} space
* @param {?} vector
* @param {?=} startPositive
* @return {?}
*/
function (space, vector, startPositive) {
if (startPositive === void 0) { startPositive = true; }
var current, index, sign;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
current = 0;
index = 0;
sign = this.math.flipSign(startPositive);
_a.label = 1;
case 1:
return [4 /*yield*/, current = sign.next().value * index * space + current];
case 2:
_a.sent();
index++;
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
};
/**
* @param {?} guillocheElement
* @return {?}
*/
NlsGraphsComponent.prototype.prepareGuillocheExport = /**
* @param {?} guillocheElement
* @return {?}
*/
function (guillocheElement) {
if (this.genLoadedAllGraphs.next().value) {
this.svgChange.emit(this.svgElementRef);
}
};
/**
* @return {?}
*/
NlsGraphsComponent.prototype.countLoadedGraphs = /**
* @return {?}
*/
function () {
var cycles;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
cycles = 1;
_a.label = 1;
case 1:
if (!(cycles < this.graphs.length)) return [3 /*break*/, 3];
return [4 /*yield*/, false];
case 2:
_a.sent();
cycles++;
return [3 /*break*/, 5];
case 3: return [4 /*yield*/, true];
case 4:
_a.sent();
cycles = 1;
_a.label = 5;
case 5: return [3 /*break*/, 1];
case 6: return [2 /*return*/];
}
});
};
NlsGraphsComponent.decorators = [
{ type: Component, args: [{
selector: 'nls-graphs',
template: "<svg #svg width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\"\nversion=\"1.1\" shape-rendering=\"geometricPrecision\">\n <g nlsGuilloche *ngFor=\"let graph of graphs\" [graph]=\"graph\" [animation]=\"animation\"></g>\n</svg>\n",
styles: [":host{position:absolute;width:100%;height:100%;top:0;left:0;overflow:hidden}"]
},] },
];
/** @nocollapse */
NlsGraphsComponent.ctorParameters = function () { return [
{ type: NlsCanvasService },
{ type: NlsHistoryService },
{ type: NlsMathService },
{ type: NlsGraphService }
]; };
NlsGraphsComponent.propDecorators = {
config: [{ type: Input }],
restoredHistory: [{ type: Input }],
animation: [{ type: Input }],
svgChange: [{ type: Output }],
graphChange: [{ type: Output }],
svgElementRef: [{ type: ViewChild, args: ['svg',] }],
onResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }]
};
return NlsGraphsComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NlsGuillocheDirective = /** @class */ (function () {
function NlsGuillocheDirective(canvasService, el, math, graphService) {
this.canvasService = canvasService;
this.el = el;
this.math = math;
this.graphService = graphService;
}
/**
* @return {?}
*/
NlsGuillocheDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.group.selectAll('*').remove();
};
/**
* @param {?} changes
* @return {?}
*/
NlsGuillocheDirective.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
var _this = this;
this.group = select(this.el.nativeElement);
this.canvas = select(this.canvasService.get);
// @todo modify graph here instead of in graphs.component.ts
this.initialNodes = this.graph.nodes.slice();
this.initialCurve = __spread([
this.graph.start.point,
this.graph.start.direction
], this.graph.nodes.slice(), [
this.graph.end.direction,
this.graph.end.point
]);
this.medianPoint = this.math.medianOfCurve(this.initialCurve);
this.medianIndex = this.math.medianIndex(this.initialCurve);
if (this.animation) {
this.graph.nodes = this.graph.nodes.slice().map(function (node, i) {
return {
x: node.x,
y: node.y,
// ascent: Math.round(Math.random() * 100) / 100
ascent: _this.medianPoint.ascent + i * 0.5
};
});
this.bounces = this.initialNodes.map(function (node) {
/** @type {?} */
var bounceAmplitude = Math.round(Math.random() * 150);
return _this.math.bounce(bounceAmplitude, 3);
});
/** @type {?} */
var i_1 = 0;
this.animationInterval = setInterval(function () {
_this.animateGraph(i_1++ % 1000 / 10000);
}, this.graph.interval);
}
else {
if (this.animationInterval) {
this.bounce = null;
clearInterval(this.animationInterval);
}
}
this.group.selectAll('*').remove();
this.pathElements = [];
/** @type {?} */
var graphs = this.spreadLines(__spread([
this.graph.start.point,
this.graph.start.direction
], this.graph.nodes, [
this.graph.end.direction,
this.graph.end.point,
])).forEach(function (points, index) { return _this.drawGraph(points); });
};
/**
* @param {?} x
* @return {?}
*/
NlsGuillocheDirective.prototype.animateGraph = /**
* @param {?} x
* @return {?}
*/
function (x) {
var _this = this;
/** @type {?} */
var graphs = this.spreadLines(__spread([
this.graph.start.point,
this.graph.start.direction
], this.graph.nodes.map(function (point, i) {
/** @type {?} */
var ascent = point.ascent * Math.sin(Math.PI * x);
return _this.graphService.shiftPoint(point, ascent, _this.bounces[i].next().value);
}), [
this.graph.end.direction,
this.graph.end.point,
]));
graphs.forEach(function (points, i) { return _this.updateGraph(points, i); });
};
/**
* @param {?} points
* @return {?}
*/
NlsGuillocheDirective.prototype.spreadLines = /**
* @param {?} points
* @return {?}
*/
function (points) {
var _this = this;
/** @type {?} */
var shiftedMedians = [];
/** @type {?} */
var genshiftedMedians = this.graphService.spreadOrthogonal(this.medianPoint, this.graph.spread.spacing);
for (var i = 0; i < this.graph.spread.amount; i++) {
shiftedMedians.push(genshiftedMedians.next().value);
}
return shiftedMedians.map(function (median) {
/** @type {?} */
var shiftedPoints = points.slice();
shiftedPoints.splice(_this.medianIndex, 1, median);
return shiftedPoints;
});
};
/**
* @param {?} points
* @param {?} index
* @return {?}
*/
NlsGuillocheDirective.prototype.updateGraph = /**
* @param {?} points
* @param {?} index
* @return {?}
*/
function (points, index) {
this.pathElements[index]
.attr('d', line()
.x(function (p) { return p.x; })
.y(function (p) { return p.y; })
.curve(curveBasis)(points));
};
/**
* @param {?} points
* @return {?}
*/
NlsGuillocheDirective.prototype.drawGraph = /**
* @param {?} points
* @return {?}
*/
function (points) {
this.group
.attr('stroke', this.graph.color)
.attr('stroke-width', this.graph.stroke)
.attr('fill', 'none');
this.pathElements.push(this.group.append('path')
.attr('d', line()
.x(function (p) { return p.x; })
.y(function (p) { return p.y; })
.curve(curveBasis)(points)));
};
/**
* @param {?} points
* @return {?}
*/
NlsGuillocheDirective.prototype.debugGraph = /**
* @param {?} points
* @return {?}
*/
function (points) {
var _this = this;
points.forEach(function (point, index) {
/** @type {?} */
var circle = _this.group.append('g');
circle.append('circle')
.attr('cx', point.x)
.attr('cy', point.y)
.attr('r', 3)
.attr('fill-opacity', 0.6)
.attr('fill', _this.graph.color);
circle.append('text')
.attr('x', point.x)
.attr('y', point.y)
.attr('dx', 8)
.attr('dy', 15)
.attr('fill', _this.graph.color)
.text(index);
});
};
NlsGuillocheDirective.decorators = [
{ type: Directive, args: [{
selector: '[nlsGuilloche]'
},] },
];
/** @nocollapse */
NlsGuillocheDirective.ctorParameters = function () { return [
{ type: NlsCanvasService },
{ type: ElementRef },
{ type: NlsMathService },
{ type: NlsGraphService }
]; };
NlsGuillocheDirective.propDecorators = {
graph: [{ type: Input }],
animation: [{ type: Input }]
};
return NlsGuillocheDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NlsAnimationService = /** @class */ (function () {
// public genAnimation: any;
// private timer: Observable<number>;
// private subscribtion: any;
function NlsAnimationService(math, historyService) {
this.math = math;
this.historyService = historyService;
}
/**
* @param {?} initialGraph
* @return {?}
*/
NlsAnimationService.prototype.animate = /**
* @param {?} initialGraph
* @return {?}
*/
function (initialGraph) {
/** @type {?} */
var newGraph = Object.assign({}, initialGraph);
/** @type {?} */
var indexMiddle = Math.floor(newGraph.nodes.length * 0.5);
/** @type {?} */
var pointMiddle = newGraph.nodes[indexMiddle];
newGraph.nodes.splice(indexMiddle, 1, {
x: pointMiddle.x - 2,
y: pointMiddle.y + 2,
});
return newGraph;
// });
};
NlsAnimationService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
NlsAnimationService.ctorParameters = function () { return [
{ type: NlsMathService },
{ type: NlsHistoryService }
]; };
return NlsAnimationService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NlsGuillocheModule = /** @class */ (function () {
function NlsGuillocheModule() {
}
NlsGuillocheModule.decorators = [
{ type: NgModule, args: [{
imports: [
BrowserModule
],
declarations: [
NlsGraphsComponent,
NlsGuillocheDirective
],
providers: [
NlsHistoryService,
NlsCanvasService,
NlsMathService,
NlsGraphService,
],
exports: [
NlsGraphsComponent,
NlsGuillocheDirective
]
},] },
];
return NlsGuillocheModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { NlsGraphsComponent, NlsGuillocheDirective, NlsAnimationService, NlsCanvasService, NlsGraphService, NlsHistoryService, NlsMathService, NlsGuillocheModule };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmxzLWd1aWxsb2NoZS5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmxzLWd1aWxsb2NoZS9ubHMvc2VydmljZXMvY2FudmFzLnNlcnZpY2UudHMiLCJuZzovL25scy1ndWlsbG9jaGUvbmxzL3NlcnZpY2VzL2hpc3Rvcnkuc2VydmljZS50cyIsIm5nOi8vbmxzLWd1aWxsb2NoZS9ubHMvc2VydmljZXMvbWF0aC5zZXJ2aWNlLnRzIiwibmc6Ly9ubHMtZ3VpbGxvY2hlL25scy9zZXJ2aWNlcy9ncmFwaC5zZXJ2aWNlLnRzIiwibmc6Ly9ubHMtZ3VpbGxvY2hlL25scy9jb21wb25lbnRzL2dyYXBocy5jb21wb25lbnQudHMiLCJuZzovL25scy1ndWlsbG9jaGUvbmxzL2RpcmVjdGl2ZXMvZ3VpbGxvY2hlLmRpcmVjdGl2ZS50cyIsIm5nOi8vbmxzLWd1aWxsb2NoZS9ubHMvc2VydmljZXMvYW5pbWF0aW9uLnNlcnZpY2UudHMiLCJuZzovL25scy1ndWlsbG9jaGUvbmxzL25scy1ndWlsbG9jaGUubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChDKSAyMDE4IE1pY2hhZWwgQ3plY2hvd3NraSA8bWFpbEBkYWlseXNoLml0PlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXRcbiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlXG4gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUXG4gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3JcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvclxuICogbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGhcbiAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MVxuICogRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIFNlbGVjdGlvbiBmcm9tICdkMy1zZWxlY3Rpb24nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmxzQ2FudmFzU2VydmljZSB7XG4gIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMjtcblxuICBwdWJsaWMgY2FudmFzOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJlckZhY3Rvcnk6IFJlbmRlcmVyRmFjdG9yeTJcbiAgKSB7XG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihudWxsLCBudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLmNhbnZhcztcbiAgfVxuXG4gIHB1YmxpYyBzZXQoZWwpIHtcbiAgICB0aGlzLmNhbnZhcyA9IGVsO1xuICB9XG5cbiAgcHVibGljIGFkanVzdFRvV2luZG93KCkge1xuICAgIGlmICh0aGlzLmNhbnZhcykge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy5jYW52YXMsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgIHRoaXMuY2FudmFzLmlubmVyV2lkdGhcbiAgICAgICk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgIHRoaXMuY2FudmFzLmlubmVySGVpZ2h0XG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTggTWljaGFlbCBDemVjaG93c2tpIDxtYWlsQGRhaWx5c2guaXQ+XG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdFxuICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWVcbiAqIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yXG4gKiBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aFxuICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxXG4gKiBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIFNlbGVjdGlvbiBmcm9tICdkMy1zZWxlY3Rpb24nO1xuXG5pbXBvcnQgeyBHcmFwaCB9IGZyb20gJy4uL21vZGVscy9ncmFwaC5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBObHNIaXN0b3J5U2VydmljZSB7XG5cbiAgcHVibGljIGhpc3Rvcnk6IGFueVtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGlzdG9yeSA9IFtdO1xuICB9XG5cbiAgcHVibGljIHNhdmUoZ3JhcGhzOiBHcmFwaFtdLCBjb25maWcpIHtcbiAgICB0aGlzLmhpc3RvcnkucHVzaCh7XG4gICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgZ3JhcGhzOiBncmFwaHMsXG4gICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgIGhhc2g6IHRoaXMuaGFzaChncmFwaHMpXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaGFzaChncmFwaHMpIHtcbiAgICByZXR1cm4gYnRvYShKU09OLnN0cmluZ2lmeShncmFwaHMpKTtcbiAgfVxuXG4gIHB1YmxpYyBsaXN0KCkge1xuICAgIHJldHVybiB0aGlzLmhpc3Rvcnk7XG4gIH1cbn1cblxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTggTWljaGFlbCBDemVjaG93c2tpIDxtYWlsQGRhaWx5c2guaXQ+XG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdFxuICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWVcbiAqIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yXG4gKiBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aFxuICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxXG4gKiBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIFNlbGVjdGlvbiBmcm9tICdkMy1zZWxlY3Rpb24nO1xuaW1wb3J0ICogYXMgUmFuZG9tIGZyb20gJ2QzLXJhbmRvbSc7XG5cbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi8uLi9tb2RlbHMvcG9pbnQubW9kZWwnO1xuaW1wb3J0IHsgR3JhcGggfSBmcm9tICcuLy4uL21vZGVscy9ncmFwaC5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBObHNNYXRoU2VydmljZSB7XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBkaXN0YW5jZSBiZXR3ZWVuIHRvIHBvaW50cyB3aXRoIGNvb3JkaW5hdGVzLlxuICAgKiBAcGFyYW0gYVxuICAgKiBAcGFyYW0gYlxuICAgKi9cbiAgcHVibGljIMOOwpQoYTogUG9pbnQsIGI6IFBvaW50KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KE1hdGgucG93KGEueCAtIGIueCwgMikgKyBNYXRoLnBvdyhhLnkgLSBiLnksIDIpLCAwLjUpO1xuICB9XG5cbiAgcHVibGljIGdldENsb3Nlc3RDZW50ZXIocG9pbnQ6IFBvaW50LCBtYXRyaXg6IGFueSkge1xuICAgIGlmICh0aGlzLsOOwpQocG9pbnQsIG1hdHJpeC5zdGFydCkgPCB0aGlzLsOOwpQocG9pbnQsIG1hdHJpeC5lbmQpKSB7XG4gICAgICByZXR1cm4gbWF0cml4LnN0YXJ0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWF0cml4LmVuZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0RmFyZXN0Q2VudGVyKHBvaW50OiBQb2ludCwgbWF0cml4OiBhbnkpIHtcbiAgICBpZiAodGhpcy7DjsKUKHBvaW50LCBtYXRyaXguc3RhcnQpID4gdGhpcy7DjsKUKHBvaW50LCBtYXRyaXguZW5kKSkge1xuICAgICAgcmV0dXJuIG1hdHJpeC5zdGFydDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1hdHJpeC5lbmQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJhbmRvbVBvaW50KG1hdHJpeDogYW55LCBvdmVybGFwOiBudW1iZXIpIHtcbiAgICBjb25zdCB4ID0ge1xuICAgICAgbWluOiBtYXRyaXguY2VudGVyLnggLSBtYXRyaXgud2lkdGggKiBvdmVybGFwLFxuICAgICAgbWF4OiBtYXRyaXguY2VudGVyLnggKyBtYXRyaXgud2lkdGggKiBvdmVybGFwXG4gICAgfTtcbiAgICBjb25zdCB5ID0ge1xuICAgICAgbWluOiBtYXRyaXguY2VudGVyLnkgLSBtYXRyaXguaGVpZ2h0ICogb3ZlcmxhcCxcbiAgICAgIG1heDogbWF0cml4LmNlbnRlci55ICsgbWF0cml4LmhlaWdodCAqIG92ZXJsYXBcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IFJhbmRvbS5yYW5kb21Vbmlmb3JtKHgubWluLCB4Lm1heCkoKSxcbiAgICAgIHk6IFJhbmRvbS5yYW5kb21Vbmlmb3JtKHkubWluLCB5Lm1heCkoKVxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgY2VudGVyT2ZBcmVhKHdpZHRoLCBoZWlnaHQpOiBQb2ludCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHdpZHRoICogMC41LFxuICAgICAgeTogaGVpZ2h0ICogMC41XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBjZW50ZXJPZlBvaW50cyhwMTogUG9pbnQsIHAyOiBQb2ludCkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiAocDEueCArIHAyLngpICogMC41LFxuICAgICAgeTogKHAxLnkgKyBwMi55KSAqIDAuNVxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgY2VudGVyT2ZDdXJ2ZShjdXJ2ZTogUG9pbnRbXSkge1xuICAgIGNvbnN0IGdlbk1lZGlhbiA9IHRoaXMubWVkaWFuUG9pbnQoY3VydmUpO1xuICAgIGNvbnN0IHAxID0gZ2VuTWVkaWFuLm5leHQoKS52YWx1ZTtcbiAgICBjb25zdCBwMiA9IGdlbk1lZGlhbi5uZXh0KCkudmFsdWU7XG4gICAgY29uc3QgcmFkaWFucyA9IHRoaXMuYW5nbGVSYWRpYW5zKHAxLCBwMik7XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLmNlbnRlck9mUG9pbnRzKHAxLCBwMiksIHsgYXNjZW50OiByYWRpYW5zIH0pO1xuICB9XG5cbiAgcHVibGljIG1lZGlhbk9mQ3VydmUoY3VydmU6IFBvaW50W10pIHtcbiAgICBjb25zdCBnZW5NZWRpYW4gPSB0aGlzLm1lZGlhblBvaW50KGN1cnZlKTtcbiAgICBjb25zdCBwMSA9IGdlbk1lZGlhbi5uZXh0KCkudmFsdWU7XG4gICAgY29uc3QgcDIgPSBnZW5NZWRpYW4ubmV4dCgpLnZhbHVlO1xuICAgIGNvbnN0IHAzID0gZ2VuTWVkaWFuLm5leHQoKS52YWx1ZTtcbiAgICBjb25zdCByYWRpYW5zID0gdGhpcy5hbmdsZVJhZGlhbnMocDIsIHAzKTtcbiAgICAvLyBjb25zdCByYWRpYW5zID0gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogMTAwMDApIC8gMTAwMDtcbiAgICAvLyBAdG9kbyBpZiBub2RlcyBhcmUgbGVzcyB0aGFuIDUgZXJyb3Igb2NjdXJlc1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHAxLCB7IGFzY2VudDogcmFkaWFucyB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhbmdsZVJhZGlhbnMocDE6IFBvaW50LCBwMjogUG9pbnQpIHtcbiAgICByZXR1cm4gTWF0aC5hdGFuMihwMi55IC0gcDEueSwgcDIueCAtIHAxLngpO1xuICB9XG5cbiAgcHVibGljIGFuZ2xlRGVncmVlKHAxOiBQb2ludCwgcDI6IFBvaW50KSB7XG4gICAgcmV0dXJuIHRoaXMuYW5nbGVSYWRpYW5zKHAxLCBwMikgKiAxODAgLyBNYXRoLlBJO1xuICB9XG5cbiAgcHVibGljIG1lZGlhbkluZGV4KGxpc3Q6IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IobGlzdC5sZW5ndGggKiAwLjUpO1xuICB9XG5cbiAgcHVibGljICptZWRpYW5Qb2ludChwb2ludHM6IFBvaW50W10pIHtcbiAgICBsZXQgaW5kZXg6IG51bWJlcjtcbiAgICBjb25zdCBsaXN0OiBQb2ludFtdID0gcG9pbnRzLnNsaWNlKCk7XG5cbiAgICB3aGlsZSAobGlzdCkge1xuICAgICAgaW5kZXggPSB0aGlzLm1lZGlhbkluZGV4KHBvaW50cyk7XG4gICAgICB5aWVsZCBsaXN0W2luZGV4XTtcblxuICAgICAgbGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0b3IgZm9yIHNpbmUgYm91bmNlXG4gICAqXG4gICAqIEBwYXJhbSBzdGFydCAwIGluZGljYXRlcyB0byBpbml0aWF0ZSB3aXRoIHBvc2l0aXZlIG51bWJlcnMsIDEgaW5kaWNhdGVzIHRvXG4gICAqIHN0YXJ0IHdpdGggbmVnYXRpdmUgbnVtYmVycyBmaXJzdFxuICAgKiBAcGFyYW0gYW1wbGl0dWRlIGRlZmF1bHQgdG8gMSBpbmRpY2F0ZXMgdGhlIGFtcGxpdHVkZSBpbiBwb3NpdGl2ZSBhcyB3ZWxsXG4gICAqIGluIG5lZ2F0aXZlIHJhbmdlXG4gICAqIEBwYXJhbSBkZWNpbWFscyBhbW91bnQgb2YgZGVjaW1hbCBwbGFjZXNcbiAgICovXG5cbiAgcHVibGljICpib3VuY2UoXG4gICAgYW1wbGl0dWRlOiBudW1iZXIgPSAxLFxuICAgIGRlY2ltYWxzOiBudW1iZXIgPSAxLFxuICAgIHN0YXJ0OiBudW1iZXIgPSAwXG4gICkge1xuICAgIGNvbnN0IHBvd2VyID0gTWF0aC5wb3coMTAsIGRlY2ltYWxzKTtcbiAgICBjb25zdCBzdGVwID0gMiAvIChwb3dlcik7XG4gICAgbGV0IGluZGV4ID0gMDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByYWRpYW5zID0gTWF0aC5QSSAqIHN0ZXAgKiBpbmRleCArIHN0YXJ0O1xuICAgICAgeWllbGQgTWF0aC5yb3VuZCgoTWF0aC5zaW4ocmFkaWFucykgKiBhbXBsaXR1ZGUpICogcG93ZXIpIC8gcG93ZXI7XG5cbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICB9XG5cbiAgcHVibGljICpmbGlwU2lnbihzdGFydFBvc2l0aXZlOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGxldCBzaWduID0gc3RhcnRQb3NpdGl2ZSA/IDEgOiAtMTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB5aWVsZCBzaWduID0gc2lnbiAqICgtMSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuLyoqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTggTWljaGFlbCBDemVjaG93c2tpIDxtYWlsQGRhaWx5c2guaXQ+XG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdFxuICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWVcbiAqIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yXG4gKiBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aFxuICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxXG4gKiBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFJlbmRlcmVyMiwgUmVuZGVyZXJGYWN0b3J5MiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgU2VsZWN0aW9uIGZyb20gJ2QzLXNlbGVjdGlvbic7XG5cbmltcG9ydCB7IE5sc01hdGhTZXJ2aWNlIH0gZnJvbSAnLi9tYXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JhcGggfSBmcm9tICcuLy4uL21vZGVscy9ncmFwaC5tb2RlbCc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4vLi4vbW9kZWxzL3BvaW50Lm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5sc0dyYXBoU2VydmljZSB7XG4gIHByaXZhdGUgZ3JhcGhzOiBHcmFwaFtdO1xuICBwcml2YXRlIGFuaW1hdGlvbjogYm9vbGVhbiB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtYXRoOiBObHNNYXRoU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaHM7XG4gIH1cblxuICBwdWJsaWMgc2V0KG5ld0dyYXBoczogR3JhcGhbXSkge1xuICAgIHRoaXMuZ3JhcGhzID0gbmV3R3JhcGhzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FuaW1hdGVkKCkge1xuICAgIHJldHVybiB0aGlzLmFuaW1hdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBzdGFydEFuaW1hdGlvbigpIHtcbiAgICB0aGlzLmFuaW1hdGlvbiA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgc3RvcEFuaW1hdGlvbigpIHtcbiAgICB0aGlzLmFuaW1hdGlvbiA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljICpzcHJlYWRPcnRob2dvbmFsKHN0YXJ0OiBQb2ludCwgc3BhY2luZzogbnVtYmVyKSB7XG4gICAgY29uc3Qgc2lnbiA9IHRoaXMubWF0aC5mbGlwU2lnbigpO1xuICAgIGxldCBjdXJyZW50UG9pbnQgPSBzdGFydDtcbiAgICBsZXQgaSA9IDA7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgY3VycmVudFNwYWNpbmcgPSBzaWduLm5leHQoKS52YWx1ZSAqIHNwYWNpbmcgKiBpO1xuICAgICAgY3VycmVudFBvaW50ID0gdGhpcy5zaGlmdFBvaW50KGN1cnJlbnRQb2ludCwgc3RhcnQuYXNjZW50LCBjdXJyZW50U3BhY2luZyk7XG5cbiAgICAgIHlpZWxkIGN1cnJlbnRQb2ludDtcblxuICAgICAgaSsrO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzaGlmdFBvaW50KHBvaW50OiBQb2ludCwgcmFkaWFuczogbnVtYmVyLCBzcGFjaW5nOiBudW1iZXIpOiBQb2ludCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IE1hdGguc2luKHJhZGlhbnMgKiBNYXRoLlBJKSAqIHNwYWNpbmcgKyBwb2ludC54LFxuICAgICAgeTogTWF0aC5jb3MocmFkaWFucyAqIE1hdGguUEkpICogc3BhY2luZyArIHBvaW50LnlcbiAgICB9O1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoQykgMjAxOCBNaWNoYWVsIEN6ZWNob3dza2kgPG1haWxAZGFpbHlzaC5pdD5cbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0XG4gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZVxuICogU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVFxuICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3JcbiAqIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoXG4gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTFcbiAqIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLlxuICovXG5cbmltcG9ydCB7IFZpZXdDaGlsZCwgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBpbnRlcnZhbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgU2VsZWN0aW9uIGZyb20gJ2QzLXNlbGVjdGlvbic7XG5pbXBvcnQgKiBhcyBTaGFwZSBmcm9tICdkMy1zaGFwZSc7XG5pbXBvcnQgKiBhcyBSYW5kb20gZnJvbSAnZDMtcmFuZG9tJztcbmltcG9ydCAqIGFzIERyYWcgZnJvbSAnZDMtZHJhZyc7XG5cbmltcG9ydCB7IEdyYXBoIH0gZnJvbSAnLi8uLi9tb2RlbHMvZ3JhcGgubW9kZWwnO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi8uLi9tb2RlbHMvY29uZmlnLm1vZGVsJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi8uLi9tb2RlbHMvcG9pbnQubW9kZWwnO1xuaW1wb3J0IHsgTmxzQ2FudmFzU2VydmljZSB9IGZyb20gJy4vLi4vc2VydmljZXMvY2FudmFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmxzSGlzdG9yeVNlcnZpY2UgfSBmcm9tICcuLy4uL3NlcnZpY2VzL2hpc3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBObHNNYXRoU2VydmljZSB9IGZyb20gJy4vLi4vc2VydmljZXMvbWF0aC5zZXJ2aWNlJztcbmltcG9ydCB7IE5sc0d1aWxsb2NoZURpcmVjdGl2ZSB9IGZyb20gJy4vLi4vZGlyZWN0aXZlcy9ndWlsbG9jaGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IE5sc0dyYXBoU2VydmljZSB9IGZyb20gJy4vLi4vc2VydmljZXMvZ3JhcGguc2VydmljZSc7XG5cbmNvbnN0IFJFU0laSU5HX1RJTUVPVVQgPSA4MDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25scy1ncmFwaHMnLFxuICB0ZW1wbGF0ZTogYDxzdmcgI3N2ZyB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxMDAlXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG52ZXJzaW9uPVwiMS4xXCIgc2hhcGUtcmVuZGVyaW5nPVwiZ2VvbWV0cmljUHJlY2lzaW9uXCI+XG4gIDxnIG5sc0d1aWxsb2NoZSAqbmdGb3I9XCJsZXQgZ3JhcGggb2YgZ3JhcGhzXCIgW2dyYXBoXT1cImdyYXBoXCIgW2FuaW1hdGlvbl09XCJhbmltYXRpb25cIj48L2c+XG48L3N2Zz5cbmAsXG4gIHN0eWxlczogW2A6aG9zdHtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RvcDowO2xlZnQ6MDtvdmVyZmxvdzpoaWRkZW59YF1cbn0pXG5leHBvcnQgY2xhc3MgTmxzR3JhcGhzQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcblxuICBwdWJsaWMgY2FudmFzOiBhbnkgfCBudWxsO1xuICBwdWJsaWMgbWF0cml4OiBhbnkgfCBudWxsO1xuICBwdWJsaWMgZ3JhcGhzOiBHcmFwaFtdO1xuICBwdWJsaWMgd2luZG93SGVpZ2h0OiBudW1iZXIgfCBudWxsO1xuICBwdWJsaWMgd2luZG93V2lkdGg6IG51bWJlciB8IG51bGw7XG5cbiAgcHJpdmF0ZSBnZW5TaGlmdFBvaW50OiBhbnkgfCBudWxsO1xuICBwcml2YXRlIGdlbkxvYWRlZEFsbEdyYXBoczogYW55IHwgbnVsbDtcbiAgcHJpdmF0ZSBoYXNoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVzaXppbmdXaW5kb3c6IGFueTtcblxuICBASW5wdXQoKSBjb25maWc6IENvbmZpZztcbiAgQElucHV0KCkgcmVzdG9yZWRIaXN0b3J5OiBhbnk7XG4gIEBJbnB1dCgpIGFuaW1hdGlvbjogYm9vbGVhbjtcbiAgQE91dHB1dCgpIHN2Z0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGdyYXBoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAVmlld0NoaWxkKCdzdmcnKSBzdmdFbGVtZW50UmVmO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxuICBvblJlc2l6ZShldmVudCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6aW5nV2luZG93KTtcblxuICAgIHRoaXMucmVzaXppbmdXaW5kb3cgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2FudmFzID0gdGhpcy5hZGp1c3RDYW52YXMoKTtcbiAgICAgIHRoaXMubWF0cml4ID0gdGhpcy5jYWxjTWF0cml4KCk7XG4gICAgICB0aGlzLnVwZGF0ZUdyYXBocygpO1xuICAgIH0sIFJFU0laSU5HX1RJTUVPVVQpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjYW52YXNTZXJ2aWNlOiBObHNDYW52YXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgaGlzdG9yeVNlcnZpY2U6IE5sc0hpc3RvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWF0aDogTmxzTWF0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBncmFwaFNlcnZpY2U6IE5sc0dyYXBoU2VydmljZVxuICApIHtcbiAgICB0aGlzLmdlbkxvYWRlZEFsbEdyYXBocyA9IHRoaXMuY291bnRMb2FkZWRHcmFwaHMoKTtcbiAgICB0aGlzLnJlc2l6aW5nV2luZG93ID0gZmFsc2U7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgdGhpcy5jYW52YXMgPSB0aGlzLmFkanVzdENhbnZhcygpO1xuICAgIHRoaXMubWF0cml4ID0gdGhpcy5jYWxjTWF0cml4KCk7XG5cbiAgICBpZiAoY2hhbmdlcy5jb25maWcpIHtcbiAgICAgIHRoaXMudXBkYXRlR3JhcGhzKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdG9yZWRIaXN0b3J5ICYmIHRoaXMucmVzdG9yZWRIaXN0b3J5Lmhhc2ggIT09IHRoaXMuaGFzaCkge1xuICAgICAgdGhpcy5yZXN0b3JlR3JhcGgoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVHcmFwaCgpIHtcbiAgICB0aGlzLmdyYXBocyA9IHRoaXMucmVzdG9yZWRIaXN0b3J5LmdyYXBocztcbiAgICB0aGlzLmhhc2ggPSB0aGlzLnJlc3RvcmVkSGlzdG9yeS5oYXNoO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlSGlzdG9yeSgpIHtcbiAgICB0aGlzLmhhc2ggPSB0aGlzLmhpc3RvcnlTZXJ2aWNlLmhhc2godGhpcy5ncmFwaHMpO1xuICAgIHRoaXMuaGlzdG9yeVNlcnZpY2Uuc2F2ZSh0aGlzLmdyYXBocywgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlR3JhcGgoKSB7XG4gICAgdGhpcy5ncmFwaFNlcnZpY2Uuc2V0KHRoaXMuZ3JhcGhzKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlR3JhcGhzKCk6IHZvaWQge1xuICAgIGNvbnN0IGdlblNoaWZ0U3RhcnQgPSB0aGlzLnNoaWZ0UG9pbnQodGhpcy5tYXRyaXguc3RhcnQsIHRoaXMuY29uZmlnLnZlY3RvcnMuc3RhcnQpO1xuICAgIGNvbnN0IGdlblNoaWZ0RW5kID0gdGhpcy5zaGlmdFBvaW50KHRoaXMubWF0cml4LmVuZCwgdGhpcy5jb25maWcudmVjdG9ycy5lbmQsIGZhbHNlKTtcblxuICAgIGNvbnNvbGUubG9nKHRoaXMubWF0cml4KTtcblxuICAgIGNvbnN0IGN1cnZlTGlzdCA9IFtcbiAgICAgIHtcbiAgICAgICAgY29sb3I6IHRoaXMuY29uZmlnLmNvbG9ycy5wcmltYXJ5LFxuICAgICAgICBzdGFydDogZ2VuU2hpZnRTdGFydC5uZXh0KCkudmFsdWUsXG4gICAgICAgIGVuZDogZ2VuU2hpZnRFbmQubmV4dCgpLnZhbHVlXG4gICAgICAgIC8vIHN0YXJ0OiB7XG4gICAgICAgIC8vICAgcG9pbnQ6IHRoaXMubWF0cml4LnN0YXJ0LFxuICAgICAgICAvLyAgIHZlY3RvcjogdGhpcy5jb25maWcudmVjdG9ycy5zdGFydFxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBlbmQ6IHtcbiAgICAgICAgLy8gICBwb2ludDogdGhpcy5tYXRyaXguZW5kLFxuICAgICAgICAvLyAgIHZlY3RvcjogdGhpcy5jb25maWcudmVjdG9ycy5lbmRcbiAgICAgICAgLy8gfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY29sb3I6IHRoaXMuY29uZmlnLmNvbG9ycy5zZWNvbmRhcnksXG4gICAgICAgIHN0YXJ0OiBnZW5TaGlmdEVuZC5uZXh0KCkudmFsdWUsXG4gICAgICAgIGVuZDogZ2VuU2hpZnRTdGFydC5uZXh0KCkudmFsdWVcbiAgICAgICAgLy8gZW5kOiB7XG4gICAgICAgIC8vICAgcG9pbnQ6IHRoaXMubWF0cml4LnN0YXJ0LFxuICAgICAgICAvLyAgIHZlY3RvcjogdGhpcy5jb25maWcudmVjdG9ycy5zdGFydFxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBzdGFydDoge1xuICAgICAgICAvLyAgIHBvaW50OiB0aGlzLm1hdHJpeC5lbmQsXG4gICAgICAgIC8vICAgdmVjdG9yOiB0aGlzLmNvbmZpZy52ZWN0b3JzLmVuZFxuICAgICAgICAvLyB9XG4gICAgICB9XG4gICAgXTtcblxuICAgIHRoaXMuZ3JhcGhzID0gY3VydmVMaXN0Lm1hcChjdXJ2ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLmFkanVzdEdyYXBoKGN1cnZlKSxcbiAgICAgICAgc3ByZWFkOiB0aGlzLmNvbmZpZy5zcHJlYWQsXG4gICAgICAgIGludGVydmFsOiB0aGlzLmNvbmZpZy5pbnRlcnZhbFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLmhhc2ggPSB0aGlzLmhpc3RvcnlTZXJ2aWNlLmhhc2godGhpcy5ncmFwaHMpO1xuICAgIHRoaXMuc2F2ZUhpc3RvcnkoKTtcbiAgICB0aGlzLnNhdmVHcmFwaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGp1c3RHcmFwaChjdXJ2ZSkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGN1cnZlLCB7XG4gICAgICBzdHJva2U6IHRoaXMuY29uZmlnLnN0cm9rZSxcbiAgICAgIHN0YXJ0OiBPYmplY3QuYXNzaWduKGN1cnZlLnN0YXJ0LCB7XG4gICAgICAgIGRpcmVjdGlvbjogdGhpcy5nZW5WZWN0b3JQb2ludChjdXJ2ZS5zdGFydC5wb2ludCwgY3VydmUuc3RhcnQudmVjdG9yKVxuICAgICAgfSksXG4gICAgICBlbmQ6IE9iamVjdC5hc3NpZ24oY3VydmUuZW5kLCB7XG4gICAgICAgIGRpcmVjdGlvbjogdGhpcy5nZW5WZWN0b3JQb2ludChjdXJ2ZS5lbmQucG9pbnQsIGN1cnZlLmVuZC52ZWN0b3IpXG4gICAgICB9KSxcbiAgICAgIG5vZGVzOiB0aGlzLmdlblJhbmRvbVBvaW50cyh0aGlzLmNvbmZpZy5ub2RlcylcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuUmFuZG9tUG9pbnRzKG51bTogbnVtYmVyKSB7XG4gICAgY29uc3QgZ2VuZXJhdGVkUG9pbnRzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29uZmlnLm5vZGVzOyBpKyspIHtcbiAgICAgIGdlbmVyYXRlZFBvaW50cy5wdXNoKHRoaXMubWF0aC5yYW5kb21Qb2ludCh0aGlzLm1hdHJpeCwgdGhpcy5jb25maWcub3ZlcmxhcCkpO1xuICAgIH1cblxuICAgIHJldHVybiBnZW5lcmF0ZWRQb2ludHM7XG4gIH1cblxuICBwcml2YXRlIGZsaXBmbG9wKHg6IHN0cmluZykge1xuICAgIHJldHVybiAoeCA9PT0gJ3N0YXJ0JykgPyAnZW5kJyA6ICdzdGFydCc7XG4gIH1cblxuICBwcml2YXRlIGFkanVzdENhbnZhcygpOiB2b2lkIHtcbiAgICB0aGlzLmNhbnZhc1NlcnZpY2Uuc2V0KHRoaXMuY2FudmFzKTtcbiAgICB0aGlzLmNhbnZhc1NlcnZpY2UuYWRqdXN0VG9XaW5kb3coKTtcblxuICAgIHJldHVybiB0aGlzLnN2Z0VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY01hdHJpeCgpIHtcbiAgICBjb25zdCBjYW52YXNXaWR0aCA9IHRoaXMuY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IGNhbnZhc0hlaWdodCA9IHRoaXMuY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICBjb25zdCB0b3RhbEFyZWEgPSBNYXRoLmFicyhjYW52YXNXaWR0aCAqIGNhbnZhc0hlaWdodCk7XG4gICAgY29uc3QgdG90YWxDZW50ZXIgPSB0aGlzLm1hdGguY2VudGVyT2ZBcmVhKGNhbnZhc1dpZHRoLCBjYW52YXNIZWlnaHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IGNhbnZhc0hlaWdodCAtIHRoaXMuY29uZmlnLnZlY3RvcnMuc3BhY2luZyAtIHRoaXMuY29uZmlnLm1hcmdpbi55XG4gICAgICB9LFxuICAgICAgZW5kOiB7XG4gICAgICAgIHg6IGNhbnZhc1dpZHRoIC0gdGhpcy5jb25maWcudmVjdG9ycy5zcGFjaW5nIC0gdGhpcy5jb25maWcubWFyZ2luLngsXG4gICAgICAgIHk6IDBcbiAgICAgIH0sXG4gICAgICB3aWR0aDogY2FudmFzV2lkdGgsXG4gICAgICBoZWlnaHQ6IGNhbnZhc0hlaWdodCxcbiAgICAgIGNlbnRlcjogdG90YWxDZW50ZXJcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5WZWN0b3JQb2ludChwb2ludDogUG9pbnQsIHZlY3RvcjogbnVtYmVyKSB7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLm1hdGguw47ClCh0aGlzLm1hdHJpeC5zdGFydCwgdGhpcy5tYXRyaXguZW5kKSAqIHRoaXMuY29uZmlnLnZlY3RvcnMucmFuZ2U7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogcmFuZ2UgKiBNYXRoLnNpbihNYXRoLlBJICogdmVjdG9yKSArIHBvaW50LngsXG4gICAgICB5OiByYW5nZSAqIE1hdGguY29zKE1hdGguUEkgKiB2ZWN0b3IpICsgcG9pbnQueVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlICpzaGlmdFBvaW50KHBvaW50OiBQb2ludCwgdmVjdG9yOiBudW1iZXIsIHN0YXJ0UG9zaXRpdmU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgY29uc3QgZ2VuU2hpZnRYID0gdGhpcy5zaGlmdE51bWJlcih0aGlzLmNvbmZpZy52ZWN0b3JzLnNwYWNpbmcsIHZlY3Rvciwgc3RhcnRQb3NpdGl2ZSk7XG4gICAgY29uc3QgZ2VuU2hpZnRZID0gdGhpcy5zaGlmdE51bWJlcih0aGlzLmNvbmZpZy52ZWN0b3JzLnNwYWNpbmcsIHZlY3Rvciwgc3RhcnRQb3NpdGl2ZSk7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgeWllbGQge1xuICAgICAgICBwb2ludDoge1xuICAgICAgICAgIHg6IE1hdGguY29zKE1hdGguUEkgKiB2ZWN0b3IpICogZ2VuU2hpZnRYLm5leHQoKS52YWx1ZSArIHBvaW50LngsXG4gICAgICAgICAgeTogTWF0aC5zaW4oTWF0aC5QSSAqIHZlY3RvcikgKiBnZW5TaGlmdFkubmV4dCgpLnZhbHVlICsgcG9pbnQueSxcbiAgICAgICAgfSxcbiAgICAgICAgdmVjdG9yOiB2ZWN0b3JcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSAqc2hpZnROdW1iZXIoc3BhY2U6IG51bWJlciwgdmVjdG9yOiBudW1iZXIsIHN0YXJ0UG9zaXRpdmU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgbGV0IGN1cnJlbnQgPSAwO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgY29uc3Qgc2lnbiA9IHRoaXMubWF0aC5mbGlwU2lnbihzdGFydFBvc2l0aXZlKTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB5aWVsZCBjdXJyZW50ID0gc2lnbi5uZXh0KCkudmFsdWUgKiBpbmRleCAqIHNwYWNlICsgY3VycmVudDtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByZXBhcmVHdWlsbG9jaGVFeHBvcnQoZ3VpbGxvY2hlRWxlbWVudCkge1xuICAgIGlmICh0aGlzLmdlbkxvYWRlZEFsbEdyYXBocy5uZXh0KCkudmFsdWUpIHtcbiAgICAgIHRoaXMuc3ZnQ2hhbmdlLmVtaXQodGhpcy5zdmdFbGVtZW50UmVmKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlICpjb3VudExvYWRlZEdyYXBocygpIHtcbiAgICBsZXQgY3ljbGVzID0gMTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoY3ljbGVzIDwgdGhpcy5ncmFwaHMubGVuZ3RoKSB7XG4gICAgICAgIHlpZWxkIGZhbHNlO1xuICAgICAgICBjeWNsZXMrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHlpZWxkIHRydWU7XG4gICAgICAgIGN5Y2xlcyA9IDE7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoQykgMjAxOCBNaWNoYWVsIEN6ZWNob3dza2kgPG1haWxAZGFpbHlzaC5pdD5cbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0XG4gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZVxuICogU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVFxuICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3JcbiAqIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoXG4gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTFcbiAqIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLlxuICovXG5cbmltcG9ydCB7IEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIERpcmVjdGl2ZSwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIFNlbGVjdGlvbiBmcm9tICdkMy1zZWxlY3Rpb24nO1xuaW1wb3J0ICogYXMgU2hhcGUgZnJvbSAnZDMtc2hhcGUnO1xuaW1wb3J0ICogYXMgUmFuZG9tIGZyb20gJ2QzLXJhbmRvbSc7XG5pbXBvcnQgKiBhcyBEcmFnIGZyb20gJ2QzLWRyYWcnO1xuaW1wb3J0ICogYXMgRWFzZSBmcm9tICdkMy1lYXNlJztcbmltcG9ydCAqIGFzIFRpbWVyIGZyb20gJ2QzLXRpbWVyJztcblxuaW1wb3J0IHsgR3JhcGggfSBmcm9tICcuLy4uL21vZGVscy9ncmFwaC5tb2RlbCc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4vLi4vbW9kZWxzL3BvaW50Lm1vZGVsJztcbmltcG9ydCB7IE5sc0NhbnZhc1NlcnZpY2UgfSBmcm9tICcuLy4uL3NlcnZpY2VzL2NhbnZhcy5zZXJ2aWNlJztcbmltcG9ydCB7IE5sc01hdGhTZXJ2aWNlIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcy9tYXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmxzR3JhcGhTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZ3JhcGguc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tubHNHdWlsbG9jaGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBObHNHdWlsbG9jaGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cbiAgcHJpdmF0ZSBjYW52YXM6IGFueTtcbiAgcHJpdmF0ZSBncm91cDogYW55O1xuICBwcml2YXRlIGJvdW5jZTogYW55IHwgbnVsbDtcbiAgcHJpdmF0ZSBib3VuY2VzOiBhbnkgfCBudWxsO1xuICBwcml2YXRlIGluaXRpYWxOb2RlczogYW55O1xuICBwcml2YXRlIGluaXRpYWxDdXJ2ZTogYW55O1xuICBwcml2YXRlIGFuaW1hdGlvbkludGVydmFsOiBhbnk7XG4gIHByaXZhdGUgbWVkaWFuUG9pbnQ6IFBvaW50O1xuICBwcml2YXRlIG1lZGlhbkluZGV4OiBudW1iZXI7XG4gIHByaXZhdGUgcGF0aEVsZW1lbnRzOiBhbnk7XG5cbiAgQElucHV0KCkgZ3JhcGg6IEdyYXBoO1xuICBASW5wdXQoKSBhbmltYXRpb246IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjYW52YXNTZXJ2aWNlOiBObHNDYW52YXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBtYXRoOiBObHNNYXRoU2VydmljZSxcbiAgICBwcml2YXRlIGdyYXBoU2VydmljZTogTmxzR3JhcGhTZXJ2aWNlXG4gICkge1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5ncm91cC5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLmdyb3VwID0gU2VsZWN0aW9uLnNlbGVjdCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMuY2FudmFzID0gU2VsZWN0aW9uLnNlbGVjdCh0aGlzLmNhbnZhc1NlcnZpY2UuZ2V0KTtcbiAgICAvLyBAdG9kbyBtb2RpZnkgZ3JhcGggaGVyZSBpbnN0ZWFkIG9mIGluIGdyYXBocy5jb21wb25lbnQudHNcbiAgICB0aGlzLmluaXRpYWxOb2RlcyA9IHRoaXMuZ3JhcGgubm9kZXMuc2xpY2UoKTtcbiAgICB0aGlzLmluaXRpYWxDdXJ2ZSA9IFtcbiAgICAgIHRoaXMuZ3JhcGguc3RhcnQucG9pbnQsXG4gICAgICB0aGlzLmdyYXBoLnN0YXJ0LmRpcmVjdGlvbixcbiAgICAgIC4uLnRoaXMuZ3JhcGgubm9kZXMuc2xpY2UoKSxcbiAgICAgIHRoaXMuZ3JhcGguZW5kLmRpcmVjdGlvbixcbiAgICAgIHRoaXMuZ3JhcGguZW5kLnBvaW50XG4gICAgXTtcbiAgICB0aGlzLm1lZGlhblBvaW50ID0gdGhpcy5tYXRoLm1lZGlhbk9mQ3VydmUodGhpcy5pbml0aWFsQ3VydmUpO1xuICAgIHRoaXMubWVkaWFuSW5kZXggPSB0aGlzLm1hdGgubWVkaWFuSW5kZXgodGhpcy5pbml0aWFsQ3VydmUpO1xuXG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uKSB7XG4gICAgICB0aGlzLmdyYXBoLm5vZGVzID0gdGhpcy5ncmFwaC5ub2Rlcy5zbGljZSgpLm1hcCgobm9kZSwgaSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IG5vZGUueCxcbiAgICAgICAgICB5OiBub2RlLnksXG4gICAgICAgICAgLy8gYXNjZW50OiBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAxMDApIC8gMTAwXG4gICAgICAgICAgYXNjZW50OiB0aGlzLm1lZGlhblBvaW50LmFzY2VudCArIGkgKiAwLjVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ib3VuY2VzID0gdGhpcy5pbml0aWFsTm9kZXMubWFwKG5vZGUgPT4ge1xuICAgICAgICBjb25zdCBib3VuY2VBbXBsaXR1ZGUgPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAxNTApO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXRoLmJvdW5jZShib3VuY2VBbXBsaXR1ZGUsIDMpO1xuICAgICAgfSk7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICB0aGlzLmFuaW1hdGlvbkludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICB0aGlzLmFuaW1hdGVHcmFwaChpKysgJSAxMDAwIC8gMTAwMDApO1xuICAgICAgfSwgdGhpcy5ncmFwaC5pbnRlcnZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmFuaW1hdGlvbkludGVydmFsKSB7XG4gICAgICAgIHRoaXMuYm91bmNlID0gbnVsbDtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmFuaW1hdGlvbkludGVydmFsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmdyb3VwLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpO1xuICAgIHRoaXMucGF0aEVsZW1lbnRzID0gW107XG5cbiAgICBjb25zdCBncmFwaHMgPSB0aGlzLnNwcmVhZExpbmVzKFtcbiAgICAgIHRoaXMuZ3JhcGguc3RhcnQucG9pbnQsXG4gICAgICB0aGlzLmdyYXBoLnN0YXJ0LmRpcmVjdGlvbixcbiAgICAgIC4uLnRoaXMuZ3JhcGgubm9kZXMsXG4gICAgICB0aGlzLmdyYXBoLmVuZC5kaXJlY3Rpb24sXG4gICAgICB0aGlzLmdyYXBoLmVuZC5wb2ludCxcbiAgICBdKS5mb3JFYWNoKChwb2ludHMsIGluZGV4KSA9PiB0aGlzLmRyYXdHcmFwaChwb2ludHMpKTtcbiAgfVxuXG4gIHByaXZhdGUgYW5pbWF0ZUdyYXBoKHgpIHtcbiAgICBjb25zdCBncmFwaHMgPSB0aGlzLnNwcmVhZExpbmVzKFtcbiAgICAgIHRoaXMuZ3JhcGguc3RhcnQucG9pbnQsXG4gICAgICB0aGlzLmdyYXBoLnN0YXJ0LmRpcmVjdGlvbixcbiAgICAgIC4uLnRoaXMuZ3JhcGgubm9kZXMubWFwKChwb2ludCwgaSkgPT4ge1xuICAgICAgICBjb25zdCBhc2NlbnQgPSBwb2ludC5hc2NlbnQgKiBNYXRoLnNpbihNYXRoLlBJICogeCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdyYXBoU2VydmljZS5zaGlmdFBvaW50KHBvaW50LCBhc2NlbnQsIHRoaXMuYm91bmNlc1tpXS5uZXh0KCkudmFsdWUpO1xuICAgICAgfSksXG4gICAgICB0aGlzLmdyYXBoLmVuZC5kaXJlY3Rpb24sXG4gICAgICB0aGlzLmdyYXBoLmVuZC5wb2ludCxcbiAgICBdKTtcblxuICAgIGdyYXBocy5mb3JFYWNoKChwb2ludHMsIGkpID0+IHRoaXMudXBkYXRlR3JhcGgocG9pbnRzLCBpKSk7XG4gIH1cblxuICBwcml2YXRlIHNwcmVhZExpbmVzKHBvaW50czogUG9pbnRbXSkge1xuICAgIGNvbnN0IHNoaWZ0ZWRNZWRpYW5zID0gW107XG4gICAgY29uc3QgZ2Vuc2hpZnRlZE1lZGlhbnMgPSB0aGlzLmdyYXBoU2VydmljZS5zcHJlYWRPcnRob2dvbmFsKHRoaXMubWVkaWFuUG9pbnQsIHRoaXMuZ3JhcGguc3ByZWFkLnNwYWNpbmcpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmdyYXBoLnNwcmVhZC5hbW91bnQ7IGkrKykge1xuICAgICAgc2hpZnRlZE1lZGlhbnMucHVzaChnZW5zaGlmdGVkTWVkaWFucy5uZXh0KCkudmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBzaGlmdGVkTWVkaWFucy5tYXAobWVkaWFuID0+IHtcbiAgICAgIGNvbnN0IHNoaWZ0ZWRQb2ludHMgPSBwb2ludHMuc2xpY2UoKTtcbiAgICAgIHNoaWZ0ZWRQb2ludHMuc3BsaWNlKHRoaXMubWVkaWFuSW5kZXgsIDEsIG1lZGlhbik7XG4gICAgICByZXR1cm4gc2hpZnRlZFBvaW50cztcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlR3JhcGgocG9pbnRzOiBQb2ludFtdLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wYXRoRWxlbWVudHNbaW5kZXhdXG4gICAgICAuYXR0cignZCcsIFNoYXBlLmxpbmUoKVxuICAgICAgICAueChwID0+IHAueClcbiAgICAgICAgLnkocCA9PiBwLnkpXG4gICAgICAgIC5jdXJ2ZShTaGFwZS5jdXJ2ZUJhc2lzKShwb2ludHMpKTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhd0dyYXBoKHBvaW50czogUG9pbnRbXSk6IHZvaWQge1xuICAgIHRoaXMuZ3JvdXBcbiAgICAgIC5hdHRyKCdzdHJva2UnLCB0aGlzLmdyYXBoLmNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIHRoaXMuZ3JhcGguc3Ryb2tlKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpO1xuXG4gICAgdGhpcy5wYXRoRWxlbWVudHMucHVzaChcbiAgICAgIHRoaXMuZ3JvdXAuYXBwZW5kKCdwYXRoJylcbiAgICAgICAgLmF0dHIoJ2QnLCBTaGFwZS5saW5lKClcbiAgICAgICAgICAueChwID0+IHAueClcbiAgICAgICAgICAueShwID0+IHAueSlcbiAgICAgICAgICAuY3VydmUoU2hhcGUuY3VydmVCYXNpcykocG9pbnRzKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWJ1Z0dyYXBoKHBvaW50czogUG9pbnRbXSkge1xuICAgIHBvaW50cy5mb3JFYWNoKChwb2ludCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNpcmNsZSA9IHRoaXMuZ3JvdXAuYXBwZW5kKCdnJyk7XG5cbiAgICAgIGNpcmNsZS5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgIC5hdHRyKCdjeCcsIHBvaW50LngpXG4gICAgICAgIC5hdHRyKCdjeScsIHBvaW50LnkpXG4gICAgICAgIC5hdHRyKCdyJywgMylcbiAgICAgICAgLmF0dHIoJ2ZpbGwtb3BhY2l0eScsIDAuNilcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCB0aGlzLmdyYXBoLmNvbG9yKTtcblxuICAgICAgY2lyY2xlLmFwcGVuZCgndGV4dCcpXG4gICAgICAgIC5hdHRyKCd4JywgcG9pbnQueClcbiAgICAgICAgLmF0dHIoJ3knLCBwb2ludC55KVxuICAgICAgICAuYXR0cignZHgnLCA4KVxuICAgICAgICAuYXR0cignZHknLCAxNSlcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCB0aGlzLmdyYXBoLmNvbG9yKVxuICAgICAgICAudGV4dChpbmRleCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChDKSAyMDE4IE1pY2hhZWwgQ3plY2hvd3NraSA8bWFpbEBkYWlseXNoLml0PlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXRcbiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlXG4gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUXG4gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3JcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvclxuICogbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGhcbiAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MVxuICogRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbnRlcnZhbCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgU2VsZWN0aW9uIGZyb20gJ2QzLXNlbGVjdGlvbic7XG5cbmltcG9ydCB7IEdyYXBoIH0gZnJvbSAnLi4vbW9kZWxzL2dyYXBoLm1vZGVsJztcbmltcG9ydCB7IE5sc01hdGhTZXJ2aWNlIH0gZnJvbSAnLi9tYXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmxzSGlzdG9yeVNlcnZpY2UgfSBmcm9tICcuL2hpc3Rvcnkuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBObHNBbmltYXRpb25TZXJ2aWNlIHtcblxuICBwdWJsaWMgZ3JhcGhzOiBHcmFwaFtdO1xuICBwdWJsaWMgc3BlZWQ6IG51bWJlcjtcbiAgcHVibGljIHJhbmdlOiBudW1iZXI7XG4gIC8vIHB1YmxpYyBnZW5BbmltYXRpb246IGFueTtcbiAgLy8gcHJpdmF0ZSB0aW1lcjogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICAvLyBwcml2YXRlIHN1YnNjcmlidGlvbjogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbWF0aDogTmxzTWF0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBoaXN0b3J5U2VydmljZTogTmxzSGlzdG9yeVNlcnZpY2UsXG4gICkge1xuICB9XG5cbiAgLy8gcHVibGljIGFuaW1hdGUoaW5pdGlhbEdyYXBoczogR3JhcGhbXSkge1xuICBwdWJsaWMgYW5pbWF0ZShpbml0aWFsR3JhcGg6IEdyYXBoKSB7XG4gICAgLy8gY29uc3QgbmV3R3JhcGhzID0gaW5pdGlhbEdyYXBocy5zbGljZSgpO1xuXG4gICAgLy8gcmV0dXJuIG5ld0dyYXBocy5tYXAoZ3JhcGggPT4ge1xuXG4gICAgICBjb25zdCBuZXdHcmFwaCA9IE9iamVjdC5hc3NpZ24oe30sIGluaXRpYWxHcmFwaCk7XG4gICAgICBjb25zdCBpbmRleE1pZGRsZSA9IE1hdGguZmxvb3IobmV3R3JhcGgubm9kZXMubGVuZ3RoICogMC41KTtcbiAgICAgIGNvbnN0IHBvaW50TWlkZGxlID0gbmV3R3JhcGgubm9kZXNbaW5kZXhNaWRkbGVdO1xuXG4gICAgICBuZXdHcmFwaC5ub2Rlcy5zcGxpY2UoaW5kZXhNaWRkbGUsIDEsIHtcbiAgICAgICAgeDogcG9pbnRNaWRkbGUueCAtIDIsXG4gICAgICAgIHk6IHBvaW50TWlkZGxlLnkgKyAyLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuZXdHcmFwaDtcbiAgLy8gICB9KTtcbiAgfVxufVxuXG4iLCJpbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBObHNHcmFwaHNDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZ3JhcGhzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBObHNHdWlsbG9jaGVEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvZ3VpbGxvY2hlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBObHNIaXN0b3J5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvaGlzdG9yeS5zZXJ2aWNlJztcbmltcG9ydCB7IE5sc0NhbnZhc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2NhbnZhcy5zZXJ2aWNlJztcbmltcG9ydCB7IE5sc01hdGhTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9tYXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmxzR3JhcGhTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9ncmFwaC5zZXJ2aWNlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIEJyb3dzZXJNb2R1bGVcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgTmxzR3JhcGhzQ29tcG9uZW50LFxuICAgIE5sc0d1aWxsb2NoZURpcmVjdGl2ZVxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICBObHNIaXN0b3J5U2VydmljZSxcbiAgICBObHNDYW52YXNTZXJ2aWNlLFxuICAgIE5sc01hdGhTZXJ2aWNlLFxuICAgIE5sc0dyYXBoU2VydmljZSxcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIE5sc0dyYXBoc0NvbXBvbmVudCxcbiAgICBObHNHdWlsbG9jaGVEaXJlY3RpdmVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBObHNHdWlsbG9jaGVNb2R1bGUge31cbiJdLCJuYW1lcyI6WyJSYW5kb20ucmFuZG9tVW5pZm9ybSIsIlNlbGVjdGlvbi5zZWxlY3QiLCJTaGFwZS5saW5lIiwiU2hhcGUuY3VydmVCYXNpcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0lBeUJFLDBCQUNVO1FBQUEsb0JBQWUsR0FBZixlQUFlO1FBRXZCLElBQUksQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDNUQ7MEJBRVUsaUNBQUc7Ozs7O1lBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDOzs7Ozs7Ozs7SUFHZCw4QkFBRzs7OztjQUFDLEVBQUU7UUFDWCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Ozs7SUFHWix5Q0FBYzs7OztRQUNuQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDcEIsSUFBSSxDQUFDLE1BQU0sRUFDWCxPQUFPLEVBQ1AsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQ3ZCLENBQUM7WUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDcEIsSUFBSSxDQUFDLE1BQU0sRUFDWCxRQUFRLEVBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQ3hCLENBQUM7U0FDSDs7O2dCQWhDSixVQUFVOzs7O2dCQUg2QixnQkFBZ0I7OzJCQWhCeEQ7Ozs7Ozs7O0lDMEJFO1FBQ0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7S0FDbkI7Ozs7OztJQUVNLGdDQUFJOzs7OztjQUFDLE1BQWUsRUFBRSxNQUFNO1FBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFB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