ngx-beautiful-charts
Version:
A library to create charts in Angular
292 lines • 24.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, ElementRef } from '@angular/core';
import { colorSchemes } from '../../constants/color-schemes';
import { ClusteredBarChartService } from './clustered-bar-chart.service';
import { GlobalParametersService } from '../../global/global-parameters.service';
var ClusteredBarChartComponent = /** @class */ (function () {
function ClusteredBarChartComponent(clusteredBarChartService, globalParametersService, currentElement) {
this.clusteredBarChartService = clusteredBarChartService;
this.globalParametersService = globalParametersService;
this.currentElement = currentElement;
this.showGridLines = false;
this.colorScheme = 'colorful';
this.customColorScheme = [];
this.xPadding = 60;
this.yPadding = this.xPadding / 2;
}
// [{color: string, paths: string[]}];
// [{color: string, paths: string[]}];
/**
* @return {?}
*/
ClusteredBarChartComponent.prototype.setDimensions =
// [{color: string, paths: string[]}];
/**
* @return {?}
*/
function () {
if (this.width && !this.height)
this.height = this.width / 3;
else if (!this.width && this.height)
this.width = this.height * 3;
else if (!this.width && !this.height) {
/** @type {?} */
var host = this.currentElement.nativeElement;
if (host.parentNode != null) {
/** @type {?} */
var dims = host.parentNode.getBoundingClientRect();
this.width = dims.width;
this.height = dims.width / 3;
}
}
// console.log('---set dimensions---');
// console.log('width: ' + this.width);
// console.log('height: ' + this.height);
// console.log('--------------------');
};
/**
* @return {?}
*/
ClusteredBarChartComponent.prototype.computeBarPaths = /**
* @return {?}
*/
function () {
var e_1, _a, e_2, _b, e_3, _c, e_4, _d;
this.barPaths = [];
/** @type {?} */
var uniqueXAxisValues;
/** @type {?} */
var noOfXAxisValues;
uniqueXAxisValues = new Set();
try {
for (var _e = tslib_1.__values(this.data), _f = _e.next(); !_f.done; _f = _e.next()) {
var series = _f.value;
/** @type {?} */
var seriesData = series.data;
try {
for (var seriesData_1 = tslib_1.__values(seriesData), seriesData_1_1 = seriesData_1.next(); !seriesData_1_1.done; seriesData_1_1 = seriesData_1.next()) {
var sData = seriesData_1_1.value;
uniqueXAxisValues.add(sData.name);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (seriesData_1_1 && !seriesData_1_1.done && (_b = seriesData_1.return)) _b.call(seriesData_1);
}
finally { if (e_2) throw e_2.error; }
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
}
finally { if (e_1) throw e_1.error; }
}
noOfXAxisValues = uniqueXAxisValues.size;
/** @type {?} */
var noOfSeries = this.data.length;
/** @type {?} */
var eachWidth = this.clusteredBarChartService.rectWidth / noOfXAxisValues;
/** @type {?} */
var categoryWidth = eachWidth * .5;
/** @type {?} */
var barWidth = categoryWidth / noOfSeries;
/** @type {?} */
var cnt = -1;
/** @type {?} */
var barPath = '';
/** @type {?} */
var cntSeries = -1;
try {
for (var _g = tslib_1.__values(this.data), _h = _g.next(); !_h.done; _h = _g.next()) {
var bcS = _h.value;
cntSeries++;
cnt = -1;
/** @type {?} */
var seriesPaths = void 0;
seriesPaths = [];
try {
for (var _j = tslib_1.__values(bcS.data), _k = _j.next(); !_k.done; _k = _j.next()) {
var bcD = _k.value;
cnt++;
/** @type {?} */
var xPos = cnt * eachWidth + .25 * eachWidth + cntSeries * barWidth + .5 * barWidth + this.xPadding;
/** @type {?} */
var yPos = this.clusteredBarChartService.transformY(this.clusteredBarChartService.maxY - bcD.value) + this.yPadding;
/** @type {?} */
var xStart = xPos - barWidth / 2;
/** @type {?} */
var xEnd = xPos + barWidth / 2;
/** @type {?} */
var yStart = this.clusteredBarChartService.rectHeight + this.yPadding;
barPath = 'M ';
barPath = barPath + ' ' + xStart + ' ' + yStart + ' L ' + xStart
+ ' ' + yPos + ' ' + xEnd + ' ' + yPos + ' ' + xEnd + ' ' + yStart + ' Z';
seriesPaths.push(barPath);
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (_k && !_k.done && (_d = _j.return)) _d.call(_j);
}
finally { if (e_4) throw e_4.error; }
}
this.barPaths.push({ color: bcS.color, paths: seriesPaths });
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (_h && !_h.done && (_c = _g.return)) _c.call(_g);
}
finally { if (e_3) throw e_3.error; }
}
};
/**
* @return {?}
*/
ClusteredBarChartComponent.prototype.setColors = /**
* @return {?}
*/
function () {
var e_5, _a;
/** @type {?} */
var cnt = 0;
try {
for (var _b = tslib_1.__values(this.data), _c = _b.next(); !_c.done; _c = _b.next()) {
var seriesData = _c.value;
if (!seriesData.color) {
if (this.customColorScheme.length > 0) {
seriesData.color = this.customColorScheme[cnt % this.customColorScheme.length];
}
else {
seriesData.color = colorSchemes[this.colorScheme][cnt % 10];
}
cnt++;
}
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_5) throw e_5.error; }
}
};
/**
* @return {?}
*/
ClusteredBarChartComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.componentID = this.globalParametersService.addNewComponent();
console.log('init..');
this.setDimensions();
this.dataCopy = JSON.parse(JSON.stringify(this.data));
this.setColors();
this.clusteredBarChartService.setValues({
componentID: this.componentID,
width: this.width,
height: this.height,
xPadding: this.xPadding,
yPadding: this.yPadding,
data: this.data
});
this.computeBarPaths();
};
/**
* @return {?}
*/
ClusteredBarChartComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.setColors();
this.clusteredBarChartService.setValues({
componentID: this.componentID,
width: this.width,
height: this.height,
xPadding: this.xPadding,
yPadding: this.yPadding,
data: this.data
});
this.computeBarPaths();
};
ClusteredBarChartComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-clustered-bar-chart',
template: "<svg [attr.width]=\"width\" [attr.height]=\"height\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n\n <g ngx-cbc-chart-base\n [showGridLines]=\"showGridLines\"\n [xAxisTitle]=\"xAxisTitle\" [yAxisTitle]=\"yAxisTitle\"\n />\n\n <g *ngFor=\"let series of barPaths\">\n <g *ngFor=\"let barPath of series.paths\">\n <path class=\"chart-bar\"\n [attr.d]=\"barPath\" [attr.fill]=\"series.color\" />\n </g>\n </g>\n\n</svg>",
providers: [ClusteredBarChartService],
styles: [".chart-bar:hover{stroke-width:1;stroke:#444}"]
}] }
];
/** @nocollapse */
ClusteredBarChartComponent.ctorParameters = function () { return [
{ type: ClusteredBarChartService },
{ type: GlobalParametersService },
{ type: ElementRef }
]; };
ClusteredBarChartComponent.propDecorators = {
data: [{ type: Input }],
width: [{ type: Input }],
height: [{ type: Input }],
xAxisTitle: [{ type: Input }],
yAxisTitle: [{ type: Input }],
showGridLines: [{ type: Input }],
colorScheme: [{ type: Input }],
customColorScheme: [{ type: Input }]
};
return ClusteredBarChartComponent;
}());
export { ClusteredBarChartComponent };
if (false) {
/** @type {?} */
ClusteredBarChartComponent.prototype.data;
/** @type {?} */
ClusteredBarChartComponent.prototype.width;
/** @type {?} */
ClusteredBarChartComponent.prototype.height;
/** @type {?} */
ClusteredBarChartComponent.prototype.xAxisTitle;
/** @type {?} */
ClusteredBarChartComponent.prototype.yAxisTitle;
/** @type {?} */
ClusteredBarChartComponent.prototype.showGridLines;
/** @type {?} */
ClusteredBarChartComponent.prototype.colorScheme;
/** @type {?} */
ClusteredBarChartComponent.prototype.customColorScheme;
/** @type {?} */
ClusteredBarChartComponent.prototype.componentID;
/** @type {?} */
ClusteredBarChartComponent.prototype.xPadding;
/** @type {?} */
ClusteredBarChartComponent.prototype.yPadding;
/** @type {?} */
ClusteredBarChartComponent.prototype.barPaths;
/** @type {?} */
ClusteredBarChartComponent.prototype.dataCopy;
/** @type {?} */
ClusteredBarChartComponent.prototype.clusteredBarChartService;
/**
* @type {?}
* @private
*/
ClusteredBarChartComponent.prototype.globalParametersService;
/**
* @type {?}
* @private
*/
ClusteredBarChartComponent.prototype.currentElement;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3RlcmVkLWJhci1jaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYmVhdXRpZnVsLWNoYXJ0cy8iLCJzb3VyY2VzIjpbImxpYi9jbHVzdGVyZWQtYmFyLWNoYXJ0L2NsdXN0ZXJlZC1iYXItY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFakY7SUFpRkUsb0NBQW1CLHdCQUFrRCxFQUNqRCx1QkFBZ0QsRUFDaEQsY0FBMEI7UUFGM0IsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNqRCw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBQ2hELG1CQUFjLEdBQWQsY0FBYyxDQUFZO1FBdEVyQyxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixnQkFBVyxHQUFHLFVBQVUsQ0FBQztRQUN6QixzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFHMUMsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLGFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQWdFcUIsQ0FBQztJQTdEbkQsc0NBQXNDOzs7OztJQUV0QyxrREFBYTs7Ozs7SUFBYjtRQUNFLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzthQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLElB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QXdCLENBQUM7O2lCQUN0Qzs7OztnQkFSUSx3QkFBd0I7Z0JBQ3hCLHVCQUF1QjtnQkFIYyxVQUFVOzs7dUJBYXJELEtBQUs7d0JBQ0wsS0FBSzt5QkFDTCxLQUFLOzZCQUNMLEtBQUs7NkJBQ0wsS0FBSztnQ0FDTCxLQUFLOzhCQUNMLEtBQUs7b0NBQ0wsS0FBSzs7SUFrSFIsaUNBQUM7Q0FBQSxBQWpJRCxJQWlJQztTQTNIWSwwQkFBMEI7OztJQUVyQywwQ0FBeUY7O0lBQ3pGLDJDQUF1Qjs7SUFDdkIsNENBQXdCOztJQUN4QixnREFBNEI7O0lBQzVCLGdEQUE0Qjs7SUFDNUIsbURBQStCOztJQUMvQixpREFBa0M7O0lBQ2xDLHVEQUEwQzs7SUFFMUMsaURBQW9COztJQUNwQiw4Q0FBYzs7SUFDZCw4Q0FBNkI7O0lBQzdCLDhDQUFjOztJQUNkLDhDQUFTOztJQTRERyw4REFBeUQ7Ozs7O0lBQ3pELDZEQUF3RDs7Ozs7SUFDeEQsb0RBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uQ2hhbmdlcywgSW5wdXQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbG9yU2NoZW1lcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9jb2xvci1zY2hlbWVzJztcbmltcG9ydCB7IENsdXN0ZXJlZEJhckNoYXJ0U2VydmljZSB9IGZyb20gJy4vY2x1c3RlcmVkLWJhci1jaGFydC5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZ2xvYmFsL2dsb2JhbC1wYXJhbWV0ZXJzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtY2x1c3RlcmVkLWJhci1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jbHVzdGVyZWQtYmFyLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2x1c3RlcmVkLWJhci1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtDbHVzdGVyZWRCYXJDaGFydFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIENsdXN0ZXJlZEJhckNoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIGRhdGE6IFt7c2VyaWVzOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcsIGRhdGE6IFt7bmFtZTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyIH1dfV07XG4gIEBJbnB1dCgpIHdpZHRoOiBudW1iZXI7XG4gIEBJbnB1dCgpIGhlaWdodDogbnVtYmVyO1xuICBASW5wdXQoKSB4QXhpc1RpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHlBeGlzVGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgc2hvd0dyaWRMaW5lcyA9IGZhbHNlO1xuICBASW5wdXQoKSBjb2xvclNjaGVtZSA9ICdjb2xvcmZ1bCc7XG4gIEBJbnB1dCgpIGN1c3RvbUNvbG9yU2NoZW1lOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbXBvbmVudElEOiBudW1iZXI7XG4gIHhQYWRkaW5nID0gNjA7XG4gIHlQYWRkaW5nID0gdGhpcy54UGFkZGluZyAvIDI7XG4gIGJhclBhdGhzOiBhbnk7XG4gIGRhdGFDb3B5O1xuICAvLyBbe2NvbG9yOiBzdHJpbmcsIHBhdGhzOiBzdHJpbmdbXX1dO1xuXG4gIHNldERpbWVuc2lvbnMoKSB7XG4gICAgaWYgKHRoaXMud2lkdGggJiYgIXRoaXMuaGVpZ2h0KSB0aGlzLmhlaWdodCA9IHRoaXMud2lkdGggLyAzO1xuICAgIGVsc2UgaWYgKCF0aGlzLndpZHRoICYmIHRoaXMuaGVpZ2h0KSB0aGlzLndpZHRoID0gdGhpcy5oZWlnaHQgKiAzO1xuICAgIGVsc2UgaWYgKCF0aGlzLndpZHRoICYmICF0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3QgaG9zdCA9IHRoaXMuY3VycmVudEVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmIChob3N0LnBhcmVudE5vZGUgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBkaW1zID0gaG9zdC5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLndpZHRoID0gZGltcy53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBkaW1zLndpZHRoIC8gMztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJy0tLXNldCBkaW1lbnNpb25zLS0tJyk7XG4gICAgLy8gY29uc29sZS5sb2coJ3dpZHRoOiAnICsgdGhpcy53aWR0aCk7XG4gICAgLy8gY29uc29sZS5sb2coJ2hlaWdodDogJyArIHRoaXMuaGVpZ2h0KTtcbiAgICAvLyBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgfVxuXG4gIGNvbXB1dGVCYXJQYXRocygpIHtcbiAgICB0aGlzLmJhclBhdGhzID0gW107XG4gICAgbGV0IHVuaXF1ZVhBeGlzVmFsdWVzO1xuICAgIGxldCBub09mWEF4aXNWYWx1ZXM7XG4gICAgdW5pcXVlWEF4aXNWYWx1ZXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBzZXJpZXMgb2YgdGhpcy5kYXRhKSB7XG4gICAgICBjb25zdCBzZXJpZXNEYXRhID0gc2VyaWVzLmRhdGE7XG4gICAgICBmb3IgKGNvbnN0IHNEYXRhIG9mIHNlcmllc0RhdGEpIHtcbiAgICAgICAgdW5pcXVlWEF4aXNWYWx1ZXMuYWRkKHNEYXRhLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBub09mWEF4aXNWYWx1ZXMgPSB1bmlxdWVYQXhpc1ZhbHVlcy5zaXplO1xuICAgIGNvbnN0IG5vT2ZTZXJpZXMgPSB0aGlzLmRhdGEubGVuZ3RoO1xuICAgIGNvbnN0IGVhY2hXaWR0aCA9IHRoaXMuY2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlLnJlY3RXaWR0aCAvIG5vT2ZYQXhpc1ZhbHVlcztcbiAgICBjb25zdCBjYXRlZ29yeVdpZHRoID0gZWFjaFdpZHRoICogLjU7XG4gICAgY29uc3QgYmFyV2lkdGggPSBjYXRlZ29yeVdpZHRoIC8gbm9PZlNlcmllcztcbiAgICBsZXQgY250ID0gLTE7XG4gICAgbGV0IGJhclBhdGggPSAnJztcbiAgICBsZXQgY250U2VyaWVzID0gLTE7XG4gICAgZm9yIChjb25zdCBiY1Mgb2YgdGhpcy5kYXRhKSB7XG4gICAgICBjbnRTZXJpZXMrKztcbiAgICAgIGNudCA9IC0xO1xuICAgICAgbGV0IHNlcmllc1BhdGhzO1xuICAgICAgc2VyaWVzUGF0aHMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYmNEIG9mIGJjUy5kYXRhKSB7XG4gICAgICAgIGNudCArKztcbiAgICAgICAgY29uc3QgeFBvcyA9IGNudCAqIGVhY2hXaWR0aCArIC4yNSAqIGVhY2hXaWR0aCArIGNudFNlcmllcyAqIGJhcldpZHRoICsgLjUgKiBiYXJXaWR0aCArIHRoaXMueFBhZGRpbmc7XG4gICAgICAgIGNvbnN0IHlQb3MgPSB0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS50cmFuc2Zvcm1ZKHRoaXMuY2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlLm1heFkgLSBiY0QudmFsdWUpICsgdGhpcy55UGFkZGluZztcbiAgICAgICAgY29uc3QgeFN0YXJ0ID0geFBvcyAtIGJhcldpZHRoIC8gMjtcbiAgICAgICAgY29uc3QgeEVuZCA9IHhQb3MgKyBiYXJXaWR0aCAvIDI7XG4gICAgICAgIGNvbnN0IHlTdGFydCA9IHRoaXMuY2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlLnJlY3RIZWlnaHQgKyB0aGlzLnlQYWRkaW5nO1xuICAgICAgICBiYXJQYXRoID0gJ00gJztcbiAgICAgICAgYmFyUGF0aCA9IGJhclBhdGggKyAnICcgKyB4U3RhcnQgKyAnICcgKyB5U3RhcnQgKyAnIEwgJyArIHhTdGFydFxuICAgICAgICArICcgJyArIHlQb3MgKyAnICcgKyB4RW5kICsgJyAnICsgeVBvcyArICcgJyArIHhFbmQgKyAnICcgKyB5U3RhcnQgKyAnIFonO1xuICAgICAgICBzZXJpZXNQYXRocy5wdXNoKGJhclBhdGgpO1xuICAgICAgfVxuICAgICAgdGhpcy5iYXJQYXRocy5wdXNoKHtjb2xvcjogYmNTLmNvbG9yLCBwYXRoczogc2VyaWVzUGF0aHN9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgY2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlOiBDbHVzdGVyZWRCYXJDaGFydFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgZ2xvYmFsUGFyYW1ldGVyc1NlcnZpY2U6IEdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGN1cnJlbnRFbGVtZW50OiBFbGVtZW50UmVmKSB7IH1cblxuICBzZXRDb2xvcnMoKSB7XG4gICAgbGV0IGNudCA9IDA7XG4gICAgZm9yIChjb25zdCBzZXJpZXNEYXRhIG9mIHRoaXMuZGF0YSkge1xuICAgICAgaWYgKCFzZXJpZXNEYXRhLmNvbG9yKSB7XG4gICAgICAgIGlmICh0aGlzLmN1c3RvbUNvbG9yU2NoZW1lLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXJpZXNEYXRhLmNvbG9yID0gdGhpcy5jdXN0b21Db2xvclNjaGVtZVtjbnQgJSB0aGlzLmN1c3RvbUNvbG9yU2NoZW1lLmxlbmd0aF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VyaWVzRGF0YS5jb2xvciA9IGNvbG9yU2NoZW1lc1t0aGlzLmNvbG9yU2NoZW1lXVtjbnQgJSAxMF07XG4gICAgICAgIH1cbiAgICAgICAgY250Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jb21wb25lbnRJRCA9IHRoaXMuZ2xvYmFsUGFyYW1ldGVyc1NlcnZpY2UuYWRkTmV3Q29tcG9uZW50KCk7XG4gICAgY29uc29sZS5sb2coJ2luaXQuLicpO1xuICAgIHRoaXMuc2V0RGltZW5zaW9ucygpO1xuICAgIHRoaXMuZGF0YUNvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpO1xuICAgIHRoaXMuc2V0Q29sb3JzKCk7XG4gICAgdGhpcy5jbHVzdGVyZWRCYXJDaGFydFNlcnZpY2Uuc2V0VmFsdWVzKHtcbiAgICAgIGNvbXBvbmVudElEOiB0aGlzLmNvbXBvbmVudElELFxuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgeFBhZGRpbmc6IHRoaXMueFBhZGRpbmcsXG4gICAgICB5UGFkZGluZzogdGhpcy55UGFkZGluZyxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgIH0pO1xuICAgIHRoaXMuY29tcHV0ZUJhclBhdGhzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLnNldENvbG9ycygpO1xuICAgIHRoaXMuY2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlLnNldFZhbHVlcyh7XG4gICAgICBjb21wb25lbnRJRDogdGhpcy5jb21wb25lbnRJRCxcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgIHhQYWRkaW5nOiB0aGlzLnhQYWRkaW5nLFxuICAgICAgeVBhZGRpbmc6IHRoaXMueVBhZGRpbmcsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9KTtcbiAgICB0aGlzLmNvbXB1dGVCYXJQYXRocygpO1xuICB9XG5cbn1cbiJdfQ==