UNPKG

ngx-chart

Version:

Ngx-Chart provides chart solution for Angular.Currently supports Bar, Pie and Donut chart

115 lines 14.8 kB
import { __decorate } from "tslib"; import { Component, EventEmitter, Input, Output, ViewChildren } from '@angular/core'; let PieChartComponent = class PieChartComponent { constructor() { this.selectedItem = new EventEmitter(); this.chartOptions = { showLegend: true, legendTitle: 'Total', }; this.view = { height: 200, width: 200, radius: 80 }; this.chartView = []; this.totalSum = 0; this.processedData = []; this.legendData = []; } ngOnInit() { this.chartView.push(this.view.height + 'px'); this.chartView.push(this.view.width + 'px'); if (this.chartData) { // Get total number of records this.totalSum = this.chartData.reduce(function (a, b) { return a + b.value; }, 0); //generate Data for piechart let prevAngle = 0; this.chartData.map((x, index) => { let legend = { name: x.name, value: x.value, color: x.color }; this.legendData.push(legend); let percentage = this.getPercentage(x.value, this.totalSum); if (percentage > 0) { let circlePercentage = percentage / 10 * 36; let pieData = { color: x.color, a1: prevAngle, a2: prevAngle + circlePercentage, name: x.name }; prevAngle = prevAngle + circlePercentage; this.processedData.push(pieData); } }); } } ngAfterViewInit() { // create svg if (this.processedData.length > 0) { this.span.map((item, index) => { this.processedData[index].a2 = this.processedData[index].a2 >= 360 ? 359.9 : this.processedData[index].a2; item.nativeElement.setAttribute('d', this.describeArc(this.view.height / 2, this.view.height / 2, this.view.radius, this.processedData[index].a1, this.processedData[index].a2)); item.nativeElement.setAttribute('fill', this.processedData[index].color); }); } } polarToCartesian(centerX, centerY, radius, angleInDegrees) { let angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0; return { x: centerX + (radius * Math.cos(angleInRadians)), y: centerY + (radius * Math.sin(angleInRadians)) }; } describeArc(x, y, radius, startAngle, endAngle) { let start = this.polarToCartesian(x, y, radius, endAngle); let end = this.polarToCartesian(x, y, radius, startAngle); let arcSweep = endAngle - startAngle <= 180 ? "0" : "1"; let d = [ "M", start.x, start.y, "A", radius, radius, 0, arcSweep, 0, end.x, end.y, "L", x, y, "L", start.x, start.y ].join(" "); return d; } getPercentage(partialValue, totalValue) { return (100 * partialValue) / totalValue; } getItemClicked(item) { let selected = { name: item.name, value: item.value }; this.selectedItem.emit(selected); } }; __decorate([ Input() ], PieChartComponent.prototype, "chartData", void 0); __decorate([ ViewChildren('el') ], PieChartComponent.prototype, "span", void 0); __decorate([ Output() ], PieChartComponent.prototype, "selectedItem", void 0); __decorate([ Input() ], PieChartComponent.prototype, "chartOptions", void 0); __decorate([ Input() ], PieChartComponent.prototype, "view", void 0); PieChartComponent = __decorate([ Component({ selector: 'ngx-pie-chart', template: "<div class=\"chart-view ngx-pie\">\n <svg class=\"chart-wrapper\" [ngStyle]=\"{'height': chartView[0],'width': chartView[1]}\">\n <path #el class=\"pie-chart-path\" chartTooltip tooltip={{item.name}} (click)=\"getItemClicked(item)\" *ngFor=\"let item of processedData; let i=index\" />\n </svg>\n <div class=\"legend\" *ngIf=\"chartOptions.showLegend\">\n <h4>{{chartOptions.legendTitle +' : '+ totalSum}}</h4>\n <div class=\"legend-item\" *ngFor=\"let item of legendData; let i=index\">\n <div class=\"legend-item-colour\" [ngStyle]=\"{'background': item.color}\"></div><span class=\"legend-item-name\" >{{item.name}}</span><span class=\"legend-item-value\" >{{item.value}}</span>\n </div>\n </div>\n</div>", styles: ["path.pie-chart-path:hover{cursor:pointer}"] }) ], PieChartComponent); export { PieChartComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGllLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1jaGFydC8iLCJzb3VyY2VzIjpbImxpYi9fY29tcG9uZW50L3BpZS1jaGFydC9waWUtY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVVwSCxJQUFhLGlCQUFpQixHQUE5QixNQUFhLGlCQUFpQjtJQW1CNUI7UUFmVSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDeEMsaUJBQVksR0FBZ0I7WUFDbkMsVUFBVSxFQUFHLElBQUk7WUFDakIsV0FBVyxFQUFFLE9BQU87U0FDckIsQ0FBQTtRQUNRLFNBQUksR0FBaUI7WUFDNUIsTUFBTSxFQUFFLEdBQUc7WUFDWCxLQUFLLEVBQUUsR0FBRztZQUNWLE1BQU0sRUFBRyxFQUFFO1NBQ1osQ0FBQTtRQUNELGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2Isa0JBQWEsR0FBRyxFQUFFLENBQUE7UUFDbEIsZUFBVSxHQUFHLEVBQUUsQ0FBQTtJQUVDLENBQUM7SUFFakIsUUFBUTtRQUVOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFDLElBQUksQ0FBQyxDQUFBO1FBQzFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFDLElBQUksQ0FBQyxDQUFBO1FBRXpDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQiw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3JCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUlOLDRCQUE0QjtZQUM1QixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUE7WUFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBRTlCLElBQUksTUFBTSxHQUFHO29CQUNYLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtvQkFDWixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7b0JBQ2QsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO2lCQUNmLENBQUE7Z0JBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBRTVCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVELElBQUksVUFBVSxHQUFHLENBQUMsRUFBRTtvQkFDbEIsSUFBSSxnQkFBZ0IsR0FBRyxVQUFVLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztvQkFDNUMsSUFBSSxPQUFPLEdBQUc7d0JBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO3dCQUNkLEVBQUUsRUFBRSxTQUFTO3dCQUNiLEVBQUUsRUFBRSxTQUFTLEdBQUcsZ0JBQWdCO3dCQUNoQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7cUJBQ2IsQ0FBQTtvQkFDRCxTQUFTLEdBQUcsU0FBUyxHQUFHLGdCQUFnQixDQUFBO29CQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDbEM7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBRUgsQ0FBQztJQUdELGVBQWU7UUFDYixjQUFjO1FBQ2QsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFnQixFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3SyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzRSxDQUFDLENBQUMsQ0FBQztTQUNKO0lBRUgsQ0FBQztJQUVELGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWM7UUFDdkQsSUFBSSxjQUFjLEdBQUcsQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFFN0QsT0FBTztZQUNMLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNoRCxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDakQsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVE7UUFDNUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUUxRCxJQUFJLFFBQVEsR0FBRyxRQUFRLEdBQUcsVUFBVSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFFeEQsSUFBSSxDQUFDLEdBQUc7WUFDTixHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyQixHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNULEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3RCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1osT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsYUFBYSxDQUFDLFlBQVksRUFBRSxVQUFVO1FBQ3BDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDLEdBQUcsVUFBVSxDQUFDO0lBQzNDLENBQUM7SUFDRCxjQUFjLENBQUMsSUFBSTtRQUNqQixJQUFJLFFBQVEsR0FBRztZQUNiLElBQUksRUFBQyxJQUFJLENBQUMsSUFBSTtZQUNkLEtBQUssRUFBQyxJQUFJLENBQUMsS0FBSztTQUNqQixDQUFBO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFBRSxDQUFDO0NBRXZDLENBQUE7QUE1R1U7SUFBUixLQUFLLEVBQUU7b0RBQXdCO0FBQ1o7SUFBbkIsWUFBWSxDQUFDLElBQUksQ0FBQzsrQ0FBNkI7QUFDdEM7SUFBVCxNQUFNLEVBQUU7dURBQXdDO0FBQ3hDO0lBQVIsS0FBSyxFQUFFO3VEQUdQO0FBQ1E7SUFBUixLQUFLLEVBQUU7K0NBSVA7QUFiVSxpQkFBaUI7SUFMN0IsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLGVBQWU7UUFDekIscXVCQUF5Qzs7S0FFMUMsQ0FBQztHQUNXLGlCQUFpQixDQThHN0I7U0E5R1ksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENoYXJ0RGF0YSwgQ2hhcnRPcHRpb24gfSBmcm9tICcuLi8uLi9fbW9kZWwvY2hhcnREYXRhJztcbmltcG9ydCB7IFBpZUNoYXJ0VmlldyB9IGZyb20gJy4uLy4uL19tb2RlbC9waWVDaGFydE9wdGlvbnMnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1waWUtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGllLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGllLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUGllQ2hhcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIGNoYXJ0RGF0YTogQ2hhcnREYXRhW107XG4gIEBWaWV3Q2hpbGRyZW4oJ2VsJykgc3BhbjogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAT3V0cHV0KCkgc2VsZWN0ZWRJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBJbnB1dCgpIGNoYXJ0T3B0aW9uczogQ2hhcnRPcHRpb24gPSB7XG4gICAgc2hvd0xlZ2VuZCA6IHRydWUsXG4gICAgbGVnZW5kVGl0bGU6ICdUb3RhbCcsXG4gIH1cbiAgQElucHV0KCkgdmlldzogUGllQ2hhcnRWaWV3ID0ge1xuICAgIGhlaWdodDogMjAwLFxuICAgIHdpZHRoOiAyMDAsXG4gICAgcmFkaXVzIDogODBcbiAgfVxuICBjaGFydFZpZXcgPSBbXTtcbiAgdG90YWxTdW0gPSAwO1xuICBwcm9jZXNzZWREYXRhID0gW11cbiAgbGVnZW5kRGF0YSA9IFtdXG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIHRoaXMuY2hhcnRWaWV3LnB1c2godGhpcy52aWV3LmhlaWdodCsncHgnKVxuICAgIHRoaXMuY2hhcnRWaWV3LnB1c2godGhpcy52aWV3LndpZHRoKydweCcpXG5cbiAgICBpZiAodGhpcy5jaGFydERhdGEpIHtcbiAgICAgIC8vIEdldCB0b3RhbCBudW1iZXIgb2YgcmVjb3Jkc1xuICAgICAgdGhpcy50b3RhbFN1bSA9IHRoaXMuY2hhcnREYXRhLnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYSArIGIudmFsdWU7XG4gICAgICB9LCAwKTtcblxuXG5cbiAgICAgIC8vZ2VuZXJhdGUgRGF0YSBmb3IgcGllY2hhcnRcbiAgICAgIGxldCBwcmV2QW5nbGUgPSAwXG4gICAgICB0aGlzLmNoYXJ0RGF0YS5tYXAoKHgsIGluZGV4KSA9PiB7XG5cbiAgICAgICAgbGV0IGxlZ2VuZCA9IHtcbiAgICAgICAgICBuYW1lOiB4Lm5hbWUsXG4gICAgICAgICAgdmFsdWU6IHgudmFsdWUsXG4gICAgICAgICAgY29sb3I6IHguY29sb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGVnZW5kRGF0YS5wdXNoKGxlZ2VuZClcblxuICAgICAgICBsZXQgcGVyY2VudGFnZSA9IHRoaXMuZ2V0UGVyY2VudGFnZSh4LnZhbHVlLCB0aGlzLnRvdGFsU3VtKTtcbiAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPiAwKSB7XG4gICAgICAgICAgbGV0IGNpcmNsZVBlcmNlbnRhZ2UgPSBwZXJjZW50YWdlIC8gMTAgKiAzNjtcbiAgICAgICAgICBsZXQgcGllRGF0YSA9IHtcbiAgICAgICAgICAgIGNvbG9yOiB4LmNvbG9yLFxuICAgICAgICAgICAgYTE6IHByZXZBbmdsZSxcbiAgICAgICAgICAgIGEyOiBwcmV2QW5nbGUgKyBjaXJjbGVQZXJjZW50YWdlLFxuICAgICAgICAgICAgbmFtZTogeC5uYW1lXG4gICAgICAgICAgfVxuICAgICAgICAgIHByZXZBbmdsZSA9IHByZXZBbmdsZSArIGNpcmNsZVBlcmNlbnRhZ2VcbiAgICAgICAgICB0aGlzLnByb2Nlc3NlZERhdGEucHVzaChwaWVEYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gIH1cblxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBjcmVhdGUgc3ZnIFxuICAgIGlmICh0aGlzLnByb2Nlc3NlZERhdGEubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zcGFuLm1hcCgoaXRlbTogRWxlbWVudFJlZiwgaW5kZXgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9jZXNzZWREYXRhW2luZGV4XS5hMiA9IHRoaXMucHJvY2Vzc2VkRGF0YVtpbmRleF0uYTIgPj0gMzYwID8gMzU5LjkgOiB0aGlzLnByb2Nlc3NlZERhdGFbaW5kZXhdLmEyO1xuICAgICAgICBpdGVtLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdkJywgdGhpcy5kZXNjcmliZUFyYyh0aGlzLnZpZXcuaGVpZ2h0LzIsIHRoaXMudmlldy5oZWlnaHQvMiwgdGhpcy52aWV3LnJhZGl1cywgdGhpcy5wcm9jZXNzZWREYXRhW2luZGV4XS5hMSwgdGhpcy5wcm9jZXNzZWREYXRhW2luZGV4XS5hMikpO1xuICAgICAgICBpdGVtLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdmaWxsJywgdGhpcy5wcm9jZXNzZWREYXRhW2luZGV4XS5jb2xvcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIHBvbGFyVG9DYXJ0ZXNpYW4oY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBhbmdsZUluRGVncmVlcykge1xuICAgIGxldCBhbmdsZUluUmFkaWFucyA9IChhbmdsZUluRGVncmVlcyAtIDkwKSAqIE1hdGguUEkgLyAxODAuMDtcblxuICAgIHJldHVybiB7XG4gICAgICB4OiBjZW50ZXJYICsgKHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKSksXG4gICAgICB5OiBjZW50ZXJZICsgKHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlSW5SYWRpYW5zKSlcbiAgICB9O1xuICB9XG5cbiAgZGVzY3JpYmVBcmMoeCwgeSwgcmFkaXVzLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSkge1xuICAgIGxldCBzdGFydCA9IHRoaXMucG9sYXJUb0NhcnRlc2lhbih4LCB5LCByYWRpdXMsIGVuZEFuZ2xlKTtcbiAgICBsZXQgZW5kID0gdGhpcy5wb2xhclRvQ2FydGVzaWFuKHgsIHksIHJhZGl1cywgc3RhcnRBbmdsZSk7XG5cbiAgICBsZXQgYXJjU3dlZXAgPSBlbmRBbmdsZSAtIHN0YXJ0QW5nbGUgPD0gMTgwID8gXCIwXCIgOiBcIjFcIjtcblxuICAgIGxldCBkID0gW1xuICAgICAgXCJNXCIsIHN0YXJ0LngsIHN0YXJ0LnksXG4gICAgICBcIkFcIiwgcmFkaXVzLCByYWRpdXMsIDAsIGFyY1N3ZWVwLCAwLCBlbmQueCwgZW5kLnksXG4gICAgICBcIkxcIiwgeCwgeSxcbiAgICAgIFwiTFwiLCBzdGFydC54LCBzdGFydC55XG4gICAgXS5qb2luKFwiIFwiKTtcbiAgICByZXR1cm4gZDtcbiAgfVxuXG4gIGdldFBlcmNlbnRhZ2UocGFydGlhbFZhbHVlLCB0b3RhbFZhbHVlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKDEwMCAqIHBhcnRpYWxWYWx1ZSkgLyB0b3RhbFZhbHVlO1xuICB9XG4gIGdldEl0ZW1DbGlja2VkKGl0ZW0pIHtcbiAgICBsZXQgc2VsZWN0ZWQgPSB7XG4gICAgICBuYW1lOml0ZW0ubmFtZSxcbiAgICAgIHZhbHVlOml0ZW0udmFsdWVcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0uZW1pdChzZWxlY3RlZCk7ICB9XG5cbn0iXX0=