UNPKG

ng-d3-graphs

Version:

<img src="./assets/ng-d3.png" alt="drawing" width="250" height="250"/>

173 lines 21.6 kB
import * as tslib_1 from "tslib"; import { ChangeDetectionStrategy, Component, ElementRef, HostListener, Input, OnInit, ViewEncapsulation, } from '@angular/core'; import * as d3 from 'd3'; import { Subject } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; var PieComponent = /** @class */ (function () { function PieComponent(container) { this.container = container; this.labels = []; this.data = []; this.backgroundColors = d3.schemeSet2; this.radius = 100; this.options = {}; this.color = this.interpolateColor(); // range [0,1] -> builtin range of colors. this.defaultSliceColor = 'steerblue'; this.labelsAndData = []; this.viewBox = {}; this._options = { width: 300, height: 300, margin: { top: 50, right: 50, bottom: 50, left: 50 }, }; this.onResize$ = new Subject(); } PieComponent.prototype.onResize = function () { this.onResize$.next(); }; PieComponent.prototype.ngOnInit = function () { this.options = tslib_1.__assign({}, this._options, this.options); this.viewBox = { minX: -this.options.margin.left, minY: 0, width: Number(this.options.width) + Number(this.options.margin.left) + Number(this.options.margin.right), height: this.options.height, }; this.onBgdColorUndefined(); this.onResizeEvent(); this.render(); }; PieComponent.prototype.onBgdColorUndefined = function () { var e_1, _a; if (this.backgroundColors.length === 0) { try { // TODO: check linter // for (let index = 0; index < this.data.length; index++) { // this.backgroundColors.push(this.defaultSliceColor); // } for (var _b = tslib_1.__values(this.data), _c = _b.next(); !_c.done; _c = _b.next()) { var iterator = _c.value; this.backgroundColors.push(this.defaultSliceColor); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } } }; PieComponent.prototype.render = function () { var _this = this; var currentWidth = parseInt(d3.select(this.container.nativeElement).select('div').style('width'), 10); var currentHeight = parseInt(d3.select(this.container.nativeElement).select('div').style('height'), 10); var radius = Math.min(this.options.width, this.options.height) / 2 - this.options.margin.top; var svg = d3 .select(this.container.nativeElement) .select('div') .append('svg') .attr('width', currentWidth) .attr('height', currentHeight) .attr('viewBox', this.viewBox.minX + " " + this.viewBox.minY + " " + this.viewBox.width + " " + this.viewBox.height) .classed('svg-content', true) .append('g') .attr('transform', 'translate(' + this.options.width / 2 + ',' + this.options.height / 2 + ')'); var color = d3.scaleOrdinal().domain(this.data).range(this.backgroundColors); var pie = d3.pie().value(function (d) { return d.value; }); var pieData = pie(d3.entries(this.data)); var arcGenerator = d3.arc().innerRadius(0).outerRadius(radius); svg .selectAll('slices') .data(pieData) .enter() .append('path') .attr('d', arcGenerator) .attr('fill', function (d) { return _this.backgroundColors[d.index]; }) .attr('stroke', 'black') .style('stroke-width', '2px') .style('opacity', 0.7); svg .selectAll('slices') .data(pieData) .enter() .append('text') .text(function (d) { return _this.labels[d.index]; }) .attr('transform', function (d) { return ('translate(' + arcGenerator.centroid({ startAngle: d.startAngle, endAngle: d.endAngle, }) + ')'); }) .style('text-anchor', 'middle') .style('font-size', 17); this.addLabelAxisX(svg, this.options.width, this.options.height); }; PieComponent.prototype.addLabelAxisX = function (svg, width, height) { svg .append('text') .attr('transform', "translate(" + 0 + ", " + this.options.margin.top * 2.5 + ")") .style('text-anchor', 'middle') .text(this.options.xAxisLabel); }; /** * range [0, 1] */ PieComponent.prototype.interpolateColor = function () { return d3.interpolateCool; }; PieComponent.prototype.combineLabelsDataToOne = function () { var result = []; var N = this.data.length; for (var index = 0; index < N; index++) { result.push({ x: this.labels[index], y: this.data[index] }); } return result; }; PieComponent.prototype.onResizeEvent = function () { var _this = this; this.onResize$.pipe(debounceTime(200)).subscribe(function () { var svgExist = d3.select(_this.container.nativeElement).select('svg'); if (svgExist) { svgExist.remove(); } _this.render(); }); }; PieComponent.ctorParameters = function () { return [ { type: ElementRef } ]; }; tslib_1.__decorate([ Input() ], PieComponent.prototype, "labels", void 0); tslib_1.__decorate([ Input() ], PieComponent.prototype, "data", void 0); tslib_1.__decorate([ Input() ], PieComponent.prototype, "backgroundColors", void 0); tslib_1.__decorate([ Input() ], PieComponent.prototype, "radius", void 0); tslib_1.__decorate([ Input() ], PieComponent.prototype, "options", void 0); tslib_1.__decorate([ HostListener('window:resize') ], PieComponent.prototype, "onResize", null); PieComponent = tslib_1.__decorate([ Component({ selector: 'ng-pie', template: "<div class=\"svg-container\"></div>\n", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".svg-container{display:inline-block;position:relative;width:100%;height:100%;padding-bottom:100%;vertical-align:top;overflow:hidden}.svg-content{display:inline-block;position:absolute;top:0;left:0}.grid line{stroke:#d3d3d3;stroke-opacity:.4;shape-rendering:crispEdges}.grid path{stroke-width:0}.grid text{display:none}svg{background-color:transparent!important}.slice text{font-size:16pt;font-family:Arial}"] }) ], PieComponent); return PieComponent; }()); export { PieComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGllLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWQzLWdyYXBocy8iLCJzb3VyY2VzIjpbInBpZS9waWUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBOEI5QztJQXVCRSxzQkFBb0IsU0FBcUI7UUFBckIsY0FBUyxHQUFULFNBQVMsQ0FBWTtRQXRCaEMsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUN0QixTQUFJLEdBQVUsRUFBRSxDQUFDO1FBQ2pCLHFCQUFnQixHQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDdEMsV0FBTSxHQUFXLEdBQUcsQ0FBQztRQUNyQixZQUFPLEdBQWlCLEVBQWtCLENBQUM7UUFDcEQsVUFBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsMENBQTBDO1FBQzNFLHNCQUFpQixHQUFHLFdBQVcsQ0FBQztRQUNoQyxrQkFBYSxHQUFvQixFQUFFLENBQUM7UUFDcEMsWUFBTyxHQUFZLEVBQWEsQ0FBQztRQUV6QixhQUFRLEdBQWlCO1lBQy9CLEtBQUssRUFBRSxHQUFHO1lBQ1YsTUFBTSxFQUFFLEdBQUc7WUFDWCxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1NBQ3JELENBQUM7UUFFRixjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQU1Z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QVE7WUFDbEIsaURBQW1DO1lBRW5DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO1lBQ3JDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOztTQUNoRCxDQUFDO09BQ1csWUFBWSxDQThJeEI7SUFBRCxtQkFBQztDQUFBLEFBOUlELElBOElDO1NBOUlZLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgR3JhcGhPcHRpb25zIH0gZnJvbSAnLi4vc2hhcmVkL21vZGVscy9ncmFwaC1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBWaWV3Qm94IH0gZnJvbSAnLi4vc2hhcmVkL21vZGVscy92aWV3Ym94LmludGVyZmFjZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGllIHtcbiAgbGFiZWxzOiBzdHJpbmdbXTtcbiAgZGF0YTogYW55W107XG4gIGJhY2tncm91bmRDb2xvcnM/OiBzdHJpbmdbXTtcbiAgb3B0aW9uczogR3JhcGhPcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhYmVsIHtcbiAgdGV4dDogc3RyaW5nO1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIExhYmVsc0FuZERhdGEge1xuICB4OiBhbnk7XG4gIHk6IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctcGllJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BpZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BpZS5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUGllQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgbGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBiYWNrZ3JvdW5kQ29sb3JzOiBhbnkgPSBkMy5zY2hlbWVTZXQyO1xuICBASW5wdXQoKSByYWRpdXM6IG51bWJlciA9IDEwMDtcbiAgQElucHV0KCkgb3B0aW9uczogR3JhcGhPcHRpb25zID0ge30gYXMgR3JhcGhPcHRpb25zO1xuICBjb2xvciA9IHRoaXMuaW50ZXJwb2xhdGVDb2xvcigpOyAvLyByYW5nZSBbMCwxXSAtPiBidWlsdGluIHJhbmdlIG9mIGNvbG9ycy5cbiAgZGVmYXVsdFNsaWNlQ29sb3IgPSAnc3RlZXJibHVlJztcbiAgbGFiZWxzQW5kRGF0YTogTGFiZWxzQW5kRGF0YVtdID0gW107XG4gIHZpZXdCb3g6IFZpZXdCb3ggPSB7fSBhcyBWaWV3Qm94O1xuXG4gIHByaXZhdGUgX29wdGlvbnM6IEdyYXBoT3B0aW9ucyA9IHtcbiAgICB3aWR0aDogMzAwLFxuICAgIGhlaWdodDogMzAwLFxuICAgIG1hcmdpbjogeyB0b3A6IDUwLCByaWdodDogNTAsIGJvdHRvbTogNTAsIGxlZnQ6IDUwIH0sXG4gIH07XG5cbiAgb25SZXNpemUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIG9uUmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMub25SZXNpemUkLm5leHQoKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29udGFpbmVyOiBFbGVtZW50UmVmKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMub3B0aW9ucyA9IHsgLi4udGhpcy5fb3B0aW9ucywgLi4udGhpcy5vcHRpb25zIH07XG4gICAgdGhpcy52aWV3Qm94ID0ge1xuICAgICAgbWluWDogLXRoaXMub3B0aW9ucy5tYXJnaW4ubGVmdCxcbiAgICAgIG1pblk6IDAsXG4gICAgICB3aWR0aDogTnVtYmVyKHRoaXMub3B0aW9ucy53aWR0aCkgKyBOdW1iZXIodGhpcy5vcHRpb25zLm1hcmdpbi5sZWZ0KSArIE51bWJlcih0aGlzLm9wdGlvbnMubWFyZ2luLnJpZ2h0KSxcbiAgICAgIGhlaWdodDogdGhpcy5vcHRpb25zLmhlaWdodCxcbiAgICB9O1xuICAgIHRoaXMub25CZ2RDb2xvclVuZGVmaW5lZCgpO1xuXG4gICAgdGhpcy5vblJlc2l6ZUV2ZW50KCk7XG5cbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkJnZENvbG9yVW5kZWZpbmVkKCkge1xuICAgIGlmICh0aGlzLmJhY2tncm91bmRDb2xvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBUT0RPOiBjaGVjayBsaW50ZXJcbiAgICAgIC8vIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmRhdGEubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAvLyAgIHRoaXMuYmFja2dyb3VuZENvbG9ycy5wdXNoKHRoaXMuZGVmYXVsdFNsaWNlQ29sb3IpO1xuICAgICAgLy8gfVxuICAgICAgZm9yIChjb25zdCBpdGVyYXRvciBvZiB0aGlzLmRhdGEpIHtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3JzLnB1c2godGhpcy5kZWZhdWx0U2xpY2VDb2xvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGN1cnJlbnRXaWR0aCA9IHBhcnNlSW50KGQzLnNlbGVjdCh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50KS5zZWxlY3QoJ2RpdicpLnN0eWxlKCd3aWR0aCcpLCAxMCk7XG4gICAgY29uc3QgY3VycmVudEhlaWdodCA9IHBhcnNlSW50KGQzLnNlbGVjdCh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50KS5zZWxlY3QoJ2RpdicpLnN0eWxlKCdoZWlnaHQnKSwgMTApO1xuXG4gICAgY29uc3QgcmFkaXVzID0gTWF0aC5taW4odGhpcy5vcHRpb25zLndpZHRoLCB0aGlzLm9wdGlvbnMuaGVpZ2h0KSAvIDIgLSB0aGlzLm9wdGlvbnMubWFyZ2luLnRvcDtcbiAgICBjb25zdCBzdmcgPSBkM1xuICAgICAgLnNlbGVjdCh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50KVxuICAgICAgLnNlbGVjdCgnZGl2JylcbiAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAuYXR0cignd2lkdGgnLCBjdXJyZW50V2lkdGgpXG4gICAgICAuYXR0cignaGVpZ2h0JywgY3VycmVudEhlaWdodClcbiAgICAgIC5hdHRyKCd2aWV3Qm94JywgYCR7dGhpcy52aWV3Qm94Lm1pblh9ICR7dGhpcy52aWV3Qm94Lm1pbll9ICR7dGhpcy52aWV3Qm94LndpZHRofSAke3RoaXMudmlld0JveC5oZWlnaHR9YClcbiAgICAgIC5jbGFzc2VkKCdzdmctY29udGVudCcsIHRydWUpXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyB0aGlzLm9wdGlvbnMud2lkdGggLyAyICsgJywnICsgdGhpcy5vcHRpb25zLmhlaWdodCAvIDIgKyAnKScpO1xuXG4gICAgY29uc3QgY29sb3IgPSBkMy5zY2FsZU9yZGluYWwoKS5kb21haW4odGhpcy5kYXRhKS5yYW5nZSh0aGlzLmJhY2tncm91bmRDb2xvcnMpO1xuXG4gICAgY29uc3QgcGllID0gZDMucGllPGFueT4oKS52YWx1ZSgoZCkgPT4gZC52YWx1ZSk7XG5cbiAgICBjb25zdCBwaWVEYXRhID0gcGllKGQzLmVudHJpZXModGhpcy5kYXRhKSk7XG5cbiAgICBjb25zdCBhcmNHZW5lcmF0b3IgPSBkMy5hcmM8YW55PigpLmlubmVyUmFkaXVzKDApLm91dGVyUmFkaXVzKHJhZGl1cyk7XG5cbiAgICBzdmdcbiAgICAgIC5zZWxlY3RBbGwoJ3NsaWNlcycpXG4gICAgICAuZGF0YShwaWVEYXRhKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgLmF0dHIoJ2QnLCBhcmNHZW5lcmF0b3IpXG4gICAgICAuYXR0cignZmlsbCcsIChkKSA9PiB0aGlzLmJhY2tncm91bmRDb2xvcnNbZC5pbmRleF0pXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgJzJweCcpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAwLjcpO1xuXG4gICAgc3ZnXG4gICAgICAuc2VsZWN0QWxsKCdzbGljZXMnKVxuICAgICAgLmRhdGEocGllRGF0YSlcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC50ZXh0KChkKSA9PiB0aGlzLmxhYmVsc1tkLmluZGV4XSlcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZCkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICd0cmFuc2xhdGUoJyArXG4gICAgICAgICAgYXJjR2VuZXJhdG9yLmNlbnRyb2lkKHtcbiAgICAgICAgICAgIHN0YXJ0QW5nbGU6IGQuc3RhcnRBbmdsZSxcbiAgICAgICAgICAgIGVuZEFuZ2xlOiBkLmVuZEFuZ2xlLFxuICAgICAgICAgIH0pICtcbiAgICAgICAgICAnKSdcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIDE3KTtcblxuICAgIHRoaXMuYWRkTGFiZWxBeGlzWChzdmcsIHRoaXMub3B0aW9ucy53aWR0aCwgdGhpcy5vcHRpb25zLmhlaWdodCk7XG4gIH1cblxuICBwcml2YXRlIGFkZExhYmVsQXhpc1goc3ZnOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgc3ZnXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7MH0sICR7dGhpcy5vcHRpb25zLm1hcmdpbi50b3AgKiAyLjV9KWApXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAudGV4dCh0aGlzLm9wdGlvbnMueEF4aXNMYWJlbCk7XG4gIH1cblxuICAvKipcbiAgICogcmFuZ2UgWzAsIDFdXG4gICAqL1xuICBpbnRlcnBvbGF0ZUNvbG9yKCk6IGFueSB7XG4gICAgcmV0dXJuIGQzLmludGVycG9sYXRlQ29vbDtcbiAgfVxuXG4gIHByaXZhdGUgY29tYmluZUxhYmVsc0RhdGFUb09uZSgpOiBMYWJlbHNBbmREYXRhW10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IE4gPSB0aGlzLmRhdGEubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBOOyBpbmRleCsrKSB7XG4gICAgICByZXN1bHQucHVzaCh7IHg6IHRoaXMubGFiZWxzW2luZGV4XSwgeTogdGhpcy5kYXRhW2luZGV4XSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG9uUmVzaXplRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5vblJlc2l6ZSQucGlwZShkZWJvdW5jZVRpbWUoMjAwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IHN2Z0V4aXN0ID0gZDMuc2VsZWN0KHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpLnNlbGVjdCgnc3ZnJyk7XG4gICAgICBpZiAoc3ZnRXhpc3QpIHtcbiAgICAgICAgc3ZnRXhpc3QucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=