UNPKG

ng-color-scale

Version:

[![npm](https://img.shields.io/npm/v/ng-color-scale.svg)](https://www.npmjs.com/package/ng-color-scale) [![npm downloads](https://img.shields.io/npm/dm/ng-color-scale.svg)](https://npmjs.org/ng-color-scale) ![publish](https://github.com/eddrichjanzzen/ng-

222 lines 27.1 kB
import { __decorate } from "tslib"; import { Component, OnChanges, Input, OnInit, ChangeDetectionStrategy, SimpleChanges, ElementRef, HostListener, ViewEncapsulation } from '@angular/core'; import * as d3 from 'd3'; let NgColorScaleComponent = class NgColorScaleComponent { constructor(host) { this.host = host; this.minVal = -1; this.maxVal = 1; this.hideAxis = false; this.colorList = ["#9E0142", "#D53E4F", "#F46D43", "#FDAE61", "#FEE08B", "#FFFFBF", "#E6F598", "#ABDDA4", "#66C2A5", "#6AA84F", "#38761D"]; this._margin = { top: 50, right: 50, bottom: 30, left: 50 }; this._textHeight = 35; this._axisHeight = 45; this._axisOffset = 130; } ngOnChanges() { if (this._chart) { this._createChart(); } } ngOnInit() { this._id = 'id' + (new Date()).getTime(); if (this.data) { this._createChart(); } } _createChart() { d3.select(`#${this._id}`).remove(); this._width = this.host.nativeElement.clientWidth; this._height = this.host.nativeElement.clientHeight; this._barWidth = this._width - (this._margin.left + this._margin.right); this._svg = d3.select(this.host.nativeElement) .append('div') .attr('id', `${this._id}`) .attr('transform', `translate(${this._margin.left}, ${this._margin.top})`) .style('position', 'relative') .append("svg:svg") .attr("width", this._width) .attr("height", this._height); this._chart = this._svg.append('g') .attr('transform', `translate(${this._margin.left}, ${this._margin.top})`); this._xScale = d3.scaleLinear() .domain([this.minVal, this.maxVal]) .range([0, this._barWidth]); this._colors = d3.scaleLinear().domain([this.minVal, this.maxVal]).range(this.colorList); if (!this.hideAxis) { this._drawAxis(); } this._drawLabels(); this._drawcolorBar(); } _drawAxis() { var xAxis = d3.axisBottom(this._xScale) .tickPadding(5) .ticks(5); this._chart.append('g') .attr("class", "axis") .style("font-size", 12) .attr('transform', `translate(0, ${this._axisHeight + 5})`) .call(xAxis); } _drawcolorBar() { var tempColorList = this.colorList; var tempId = `${this._id}-grad`; var grad = this._chart.append('defs') .append('linearGradient') .attr('id', tempId) .attr('x1', '0%') .attr('x2', '100%') .attr('y1', '0%') .attr('y2', '0%'); grad.selectAll('stop') .data(tempColorList) .enter() .append('stop') .style('stop-color', function (d) { return d; }) .attr('offset', function (d, i) { return 100 * (i / (tempColorList.length - 1)) + '%'; }); var gradValue = `url(#${tempId})`; var tipId = this._id; var color_bar = this._chart.append('rect') .attr('class', 'bg-rect') .attr('rx', 5) .attr('ry', 5) .style('opacity', 1) .style('fill', gradValue) .attr('height', 15) .attr('width', this._barWidth) .attr('x', 0) .on("mouseover", function (d) { d3.select(`#${tipId} > div.tip`).transition() .duration(300) .style("opacity", .9); pickerTip.transition() .duration(300) .style("opacity", .9); d3.select(this).transition() .duration(150) .style("opacity", .8); }) .on("mouseout", function (d) { d3.select(`#${tipId} > div.tip`).transition() .duration(500) .style("opacity", 0); pickerTip.transition() .duration(500) .style("opacity", 0.7); d3.select(this).transition() .duration(500) .style("opacity", 1); }); var pickerTip = this._chart.append('rect') .attr('class', 'picker-tip') .attr('rx', 4) .attr('ry', 4) .style('fill', '#333') .style('opacity', 0.7) .attr('height', 25) .attr('width', 10) .attr('y', -5) .attr('x', this._xScale(this.data) - 5); d3.select(`#${this._id}`) .append('div') .attr('class', 'tip') .style('position', 'absolute') .style('border-radius', '10px') .style('background-color', '#e8f2fa') .style('padding', '10px') .style('top', `${-5}px`) .style('opacity', 0) .style('left', `${this._xScale(this.data) + 50}px`) .html(this.data.toFixed(2)); } _drawLabels() { //left label this._chart.append('text') .attr('x', 0) .attr('y', this._textHeight) .attr('text-anchor', 'middle') .attr('font-family', 'Roboto') .attr('font-weight', 200) .attr('class', 'left-label') .text(this.leftLabel); // right label this._chart.append('text') .attr('x', this._barWidth) .attr('y', this._textHeight) .attr('text-anchor', 'middle') .attr('font-family', 'Roboto') .attr('class', 'right-label') .text(this.rightLabel); // middle label this._chart.append('text') .attr('x', this._barWidth / 2) .attr('y', this._textHeight) .attr('font-family', 'Roboto') .attr('text-anchor', 'middle') .attr('class', 'middle-label') .text(this.middleLabel); // display meta d3.select(`#${this._id}`) .append('div') .style('position', 'absolute') .style('font-family', 'Roboto') .style('text-align', 'center') .style('width', '100%') .style('top', `${this._axisOffset}px`) .html(this.displayMeta); } _onResize(event) { this._createChart(); } }; NgColorScaleComponent.ctorParameters = () => [ { type: ElementRef } ]; __decorate([ Input() ], NgColorScaleComponent.prototype, "data", void 0); __decorate([ Input() ], NgColorScaleComponent.prototype, "leftLabel", void 0); __decorate([ Input() ], NgColorScaleComponent.prototype, "rightLabel", void 0); __decorate([ Input() ], NgColorScaleComponent.prototype, "middleLabel", void 0); __decorate([ Input() ], NgColorScaleComponent.prototype, "minVal", void 0); __decorate([ Input() ], NgColorScaleComponent.prototype, "maxVal", void 0); __decorate([ Input() ], NgColorScaleComponent.prototype, "hideAxis", void 0); __decorate([ Input() ], NgColorScaleComponent.prototype, "colorList", void 0); __decorate([ Input() ], NgColorScaleComponent.prototype, "displayMeta", void 0); __decorate([ HostListener('window:resize', ['$event']) ], NgColorScaleComponent.prototype, "_onResize", null); NgColorScaleComponent = __decorate([ Component({ selector: 'ng-color-scale', template: "", changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@import url(https://fonts.googleapis.com/css?family=Roboto:400,700);:host{width:100%;height:100%;min-height:150px;max-width:1500px;display:block;font-family:Roboto}"] }) ], NgColorScaleComponent); export { NgColorScaleComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY29sb3Itc2NhbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctY29sb3Itc2NhbGUvIiwic291cmNlcyI6WyJsaWIvbmctY29sb3Itc2NhbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hKLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBUXpCLElBQWEscUJBQXFCLEdBQWxDLE1BQWEscUJBQXFCO0lBOEJoQyxZQUNVLElBQWU7UUFBZixTQUFJLEdBQUosSUFBSSxDQUFXO1FBekJoQixXQUFNLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDcEIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGNBQVMsR0FBYSxDQUFDLFNBQVMsRUFBRSxTQUFTO1lBQ2xDLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsQ0FBQyxDQUFBO1FBR3BCLFlBQU8sR0FBRyxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUMsQ0FBQztRQVFyRCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixnQkFBVyxHQUFHLEdBQUcsQ0FBQztJQUlFLENBQUM7SUFFN0IsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtJQUNILENB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QUNwQjtJQUFSLEtBQUssRUFBRTtxREFBb0I7QUFDbkI7SUFBUixLQUFLLEVBQUU7dURBQTJCO0FBQzFCO0lBQVIsS0FBSyxFQUFFO3dEQUtvQjtBQUNuQjtJQUFSLEtBQUssRUFBRTswREFBcUI7QUE4TTdCO0lBREMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3NEQUd6QztBQS9OVSxxQkFBcUI7SUFOakMsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLGdCQUFnQjtRQUMxQixZQUE4QztRQUM5QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7S0FFaEQsQ0FBQztHQUNXLHFCQUFxQixDQWtPakM7U0FsT1kscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkNoYW5nZXMsIElucHV0LCBPbkluaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBTaW1wbGVDaGFuZ2VzLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdAYW5ndWxhci9jb3JlJzsgIFxuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZy1jb2xvci1zY2FsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy1jb2xvci1zY2FsZS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdHlsZVVybHM6IFsnLi9uZy1jb2xvci1zY2FsZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5nQ29sb3JTY2FsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgZGF0YSA6IG51bWJlcjtcbiAgQElucHV0KCkgbGVmdExhYmVsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHJpZ2h0TGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgbWlkZGxlTGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgbWluVmFsOiBudW1iZXIgPSAtMTtcbiAgQElucHV0KCkgbWF4VmFsOiBudW1iZXIgPSAxO1xuICBASW5wdXQoKSBoaWRlQXhpczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjb2xvckxpc3Q6IHN0cmluZ1tdID0gW1wiIzlFMDE0MlwiLCBcIiNENTNFNEZcIixcbiAgICAgICAgICAgICAgICAgICAgXCIjRjQ2RDQzXCIsIFwiI0ZEQUU2MVwiLFxuICAgICAgICAgICAgICAgICAgICBcIiNGRUUwOEJcIiwgXCIjRkZGRkJGXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiI0U2RjU5OFwiLCBcIiNBQkREQTRcIiwgXG4gICAgICAgICAgICAgICAgICAgIFwiIzY2QzJBNVwiLCBcIiM2QUE4NEZcIixcbiAgICAgICAgICAgICAgICAgICAgXCIjMzg3NjFEXCJdXG4gIEBJbnB1dCgpIGRpc3BsYXlNZXRhOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfbWFyZ2luID0ge3RvcDogNTAsIHJpZ2h0OiA1MCwgYm90dG9tOiAzMCwgbGVmdDogNTB9OyAgXG4gIHByaXZhdGUgX3N2ZzogYW55OyBcbiAgcHJpdmF0ZSBfY2hhcnQ6IGFueTtcbiAgcHJpdmF0ZSBfd2lkdGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfaGVpZ2h0Om51bWJlcjtcbiAgcHJpdmF0ZSBfYmFyV2lkdGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfeFNjYWxlOiBhbnk7XG4gIHByaXZhdGUgX2NvbG9yczogYW55O1xuICBwcml2YXRlIF90ZXh0SGVpZ2h0ID0gMzU7XG4gIHByaXZhdGUgX2F4aXNIZWlnaHQgPSA0NTtcbiAgcHJpdmF0ZSBfYXhpc09mZnNldCA9IDEzMDtcbiAgcHJpdmF0ZSBfaWQ6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGhvc3Q6RWxlbWVudFJlZikge31cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAodGhpcy5fY2hhcnQpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZUNoYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKXtcbiAgICB0aGlzLl9pZCA9J2lkJyArIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gICAgaWYodGhpcy5kYXRhKXtcbiAgICAgIHRoaXMuX2NyZWF0ZUNoYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlQ2hhcnQoKXtcbiAgICBkMy5zZWxlY3QoYCMke3RoaXMuX2lkfWApLnJlbW92ZSgpOyAgXG4gICAgXG4gICAgdGhpcy5fd2lkdGggPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICB0aGlzLl9oZWlnaHQgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgdGhpcy5fYmFyV2lkdGggPSB0aGlzLl93aWR0aCAtICh0aGlzLl9tYXJnaW4ubGVmdCArIHRoaXMuX21hcmdpbi5yaWdodClcblxuICAgIHRoaXMuX3N2ZyA9IGQzLnNlbGVjdCh0aGlzLmhvc3QubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgIC5hdHRyKCdpZCcsIGAke3RoaXMuX2lkfWApXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt0aGlzLl9tYXJnaW4ubGVmdH0sICR7dGhpcy5fbWFyZ2luLnRvcH0pYClcbiAgICAgICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJylcbiAgICAgICAgICAuYXBwZW5kKFwic3ZnOnN2Z1wiKSBcbiAgICAgICAgICAuYXR0cihcIndpZHRoXCIsIHRoaXMuX3dpZHRoKVxuICAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIHRoaXMuX2hlaWdodClcblxuICAgIHRoaXMuX2NoYXJ0ID0gdGhpcy5fc3ZnLmFwcGVuZCgnZycpICBcbiAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3RoaXMuX21hcmdpbi5sZWZ0fSwgJHt0aGlzLl9tYXJnaW4udG9wfSlgKTtcblxuICAgIHRoaXMuX3hTY2FsZSA9IGQzLnNjYWxlTGluZWFyKClcbiAgICAgICAgLmRvbWFpbihbdGhpcy5taW5WYWwsIHRoaXMubWF4VmFsXSlcbiAgICAgICAgLnJhbmdlKFswLCB0aGlzLl9iYXJXaWR0aF0pXG5cbiAgICB0aGlzLl9jb2xvcnMgPSBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbdGhpcy5taW5WYWwsIHRoaXMubWF4VmFsXSkucmFuZ2UoPGFueVtdPnRoaXMuY29sb3JMaXN0KTtcblxuICAgIGlmKCF0aGlzLmhpZGVBeGlzKXtcbiAgICAgIHRoaXMuX2RyYXdBeGlzKClcbiAgICB9XG5cbiAgICB0aGlzLl9kcmF3TGFiZWxzKCk7XG4gICAgdGhpcy5fZHJhd2NvbG9yQmFyKCk7XG4gIH1cblxuICBwcml2YXRlIF9kcmF3QXhpcygpe1xuICAgICAgdmFyIHhBeGlzID0gZDMuYXhpc0JvdHRvbSh0aGlzLl94U2NhbGUpXG4gICAgICAgIC50aWNrUGFkZGluZyg1KVxuICAgICAgICAudGlja3MoNSlcblxuICAgICAgdGhpcy5fY2hhcnQuYXBwZW5kKCdnJylcbiAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcImF4aXNcIilcbiAgICAgICAgLnN0eWxlKFwiZm9udC1zaXplXCIsIDEyKVxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCAke3RoaXMuX2F4aXNIZWlnaHQgKyA1fSlgKVxuICAgICAgICAuY2FsbCh4QXhpcylcbiAgfVxuXG4gIHByaXZhdGUgX2RyYXdjb2xvckJhcigpe1xuICAgICAgXG4gICAgICB2YXIgdGVtcENvbG9yTGlzdCA9IHRoaXMuY29sb3JMaXN0XG4gICAgICB2YXIgdGVtcElkID0gYCR7dGhpcy5faWR9LWdyYWRgO1xuXG4gICAgICB2YXIgZ3JhZCA9IHRoaXMuX2NoYXJ0LmFwcGVuZCgnZGVmcycpXG4gICAgICAgIC5hcHBlbmQoJ2xpbmVhckdyYWRpZW50JylcbiAgICAgICAgLmF0dHIoJ2lkJywgdGVtcElkKVxuICAgICAgICAuYXR0cigneDEnLCAnMCUnKVxuICAgICAgICAuYXR0cigneDInLCAnMTAwJScpXG4gICAgICAgIC5hdHRyKCd5MScsICcwJScpXG4gICAgICAgIC5hdHRyKCd5MicsICcwJScpO1xuXG4gICAgICBncmFkLnNlbGVjdEFsbCgnc3RvcCcpXG4gICAgICAgIC5kYXRhKHRlbXBDb2xvckxpc3QpXG4gICAgICAgIC5lbnRlcigpXG4gICAgICAgIC5hcHBlbmQoJ3N0b3AnKVxuICAgICAgICAuc3R5bGUoJ3N0b3AtY29sb3InLCBmdW5jdGlvbihkKXsgcmV0dXJuIGQ7IH0pXG4gICAgICAgIC5hdHRyKCdvZmZzZXQnLCBmdW5jdGlvbihkLGkpe1xuICAgICAgICAgIHJldHVybiAxMDAgKiAoaSAvICh0ZW1wQ29sb3JMaXN0Lmxlbmd0aCAtIDEpKSArICclJztcbiAgICAgICAgfSlcblxuICAgICAgdmFyIGdyYWRWYWx1ZSA9IGB1cmwoIyR7dGVtcElkfSlgO1xuICAgICAgdmFyIHRpcElkID0gdGhpcy5faWRcblxuICAgICAgdmFyIGNvbG9yX2JhciA9IHRoaXMuX2NoYXJ0LmFwcGVuZCgncmVjdCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdiZy1yZWN0JylcbiAgICAgICAgLmF0dHIoJ3J4JywgNSlcbiAgICAgICAgLmF0dHIoJ3J5JywgNSlcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgZ3JhZFZhbHVlKVxuICAgICAgICAuYXR0cignaGVpZ2h0JywgMTUpXG4gICAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMuX2JhcldpZHRoKVxuICAgICAgICAuYXR0cigneCcsIDApXG4gICAgICAgIC5vbihcIm1vdXNlb3ZlclwiLCBmdW5jdGlvbihkKSB7ICAgXG4gICAgICAgICAgZDMuc2VsZWN0KGAjJHt0aXBJZH0gPiBkaXYudGlwYCkudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAuZHVyYXRpb24oMzAwKVxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAuOSk7ICAgICAgXG4gICAgICAgICAgXG4gICAgICAgICAgcGlja2VyVGlwLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgLmR1cmF0aW9uKDMwMCkgICAgXG4gICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIC45KTsgIFxuXG4gICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKSAgICBcbiAgICAgICAgICAgIC5kdXJhdGlvbigxNTApICAgIFxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAuOCk7ICAgICAgXG4gICAgICAgIH0pICAgICAgICAgIFxuICAgICAgICAub24oXCJtb3VzZW91dFwiLCBmdW5jdGlvbihkKSB7ICAgIFxuICAgICAgICAgIGQzLnNlbGVjdChgIyR7dGlwSWR9ID4gZGl2LnRpcGApLnRyYW5zaXRpb24oKSAgICBcbiAgICAgICAgICAgICAgLmR1cmF0aW9uKDUwMCkgICAgXG4gICAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMCk7XG5cbiAgICAgICAgICBwaWNrZXJUaXAudHJhbnNpdGlvbigpICAgIFxuICAgICAgICAgICAgICAuZHVyYXRpb24oNTAwKSAgICBcbiAgICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAwLjcpO1xuXG4gICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKSAgICBcbiAgICAgICAgICAgIC5kdXJhdGlvbig1MDApICAgIFxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAxKTtcbiAgICAgICAgfSk7XG4gICAgICBcblxuICAgICAgdmFyIHBpY2tlclRpcCA9IHRoaXMuX2NoYXJ0LmFwcGVuZCgncmVjdCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdwaWNrZXItdGlwJylcbiAgICAgICAgLmF0dHIoJ3J4JywgNClcbiAgICAgICAgLmF0dHIoJ3J5JywgNClcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJyMzMzMnKVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwLjcpXG4gICAgICAgIC5hdHRyKCdoZWlnaHQnLCAyNSlcbiAgICAgICAgLmF0dHIoJ3dpZHRoJywgMTApXG4gICAgICAgIC5hdHRyKCd5JywgLTUpXG4gICAgICAgIC5hdHRyKCd4JywgdGhpcy5feFNjYWxlKHRoaXMuZGF0YSkgLTUpXG5cbiAgICAgIGQzLnNlbGVjdChgIyR7dGhpcy5faWR9YClcbiAgICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RpcCcpXG4gICAgICAgIC5zdHlsZSgncG9zaXRpb24nLCdhYnNvbHV0ZScpXG4gICAgICAgIC5zdHlsZSgnYm9yZGVyLXJhZGl1cycsICcxMHB4JylcbiAgICAgICAgLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNlOGYyZmEnKVxuICAgICAgICAuc3R5bGUoJ3BhZGRpbmcnLCAnMTBweCcpXG4gICAgICAgIC5zdHlsZSgndG9wJywgYCR7LTV9cHhgKVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgICAuc3R5bGUoJ2xlZnQnLCBgJHt0aGlzLl94U2NhbGUodGhpcy5kYXRhKSArNTB9cHhgKVxuICAgICAgICAuaHRtbCh0aGlzLmRhdGEudG9GaXhlZCgyKSlcblxuICB9XG5cblxuICBwcml2YXRlIF9kcmF3TGFiZWxzKCl7XG4gICAgLy9sZWZ0IGxhYmVsXG4gICAgdGhpcy5fY2hhcnQuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgIC5hdHRyKCd5JywgdGhpcy5fdGV4dEhlaWdodClcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ2ZvbnQtZmFtaWx5JywgJ1JvYm90bycpXG4gICAgICAuYXR0cignZm9udC13ZWlnaHQnLCAyMDApXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGVmdC1sYWJlbCcpXG4gICAgICAudGV4dCh0aGlzLmxlZnRMYWJlbCk7XG5cbiAgICAvLyByaWdodCBsYWJlbFxuICAgIHRoaXMuX2NoYXJ0LmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cigneCcsIHRoaXMuX2JhcldpZHRoKVxuICAgICAgLmF0dHIoJ3knLCB0aGlzLl90ZXh0SGVpZ2h0KVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAuYXR0cignZm9udC1mYW1pbHknLCAnUm9ib3RvJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdyaWdodC1sYWJlbCcpXG4gICAgICAudGV4dCh0aGlzLnJpZ2h0TGFiZWwpO1xuXG4gICAgLy8gbWlkZGxlIGxhYmVsXG4gICAgdGhpcy5fY2hhcnQuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCd4Jyx0aGlzLl9iYXJXaWR0aC8yKVxuICAgICAgLmF0dHIoJ3knLCB0aGlzLl90ZXh0SGVpZ2h0KVxuICAgICAgLmF0dHIoJ2ZvbnQtZmFtaWx5JywgJ1JvYm90bycpXG4gICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdtaWRkbGUtbGFiZWwnKVxuICAgICAgLnRleHQodGhpcy5taWRkbGVMYWJlbCk7XG5cbiAgICAvLyBkaXNwbGF5IG1ldGFcbiAgICBkMy5zZWxlY3QoYCMke3RoaXMuX2lkfWApXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLnN0eWxlKCdwb3NpdGlvbicsJ2Fic29sdXRlJylcbiAgICAgIC5zdHlsZSgnZm9udC1mYW1pbHknLCAnUm9ib3RvJylcbiAgICAgIC5zdHlsZSgndGV4dC1hbGlnbicsICdjZW50ZXInKVxuICAgICAgLnN0eWxlKCd3aWR0aCcsICcxMDAlJykgICAgXG4gICAgICAuc3R5bGUoJ3RvcCcsIGAke3RoaXMuX2F4aXNPZmZzZXR9cHhgKVxuICAgICAgLmh0bWwodGhpcy5kaXNwbGF5TWV0YSlcbiAgICAgIFxuICAgIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcbiAgcHVibGljIF9vblJlc2l6ZShldmVudCkge1xuICAgIHRoaXMuX2NyZWF0ZUNoYXJ0KCk7XG4gIH1cblxuXG59XG5cbiJdfQ==