angular-gradient-progressbar
Version:
<p align="center"> <h1>Angular Gradient Progress Bar</h1> </p> <!-- Badges --> <p align="center"> <a href="https://www.npmjs.com/package/angular-gradient-progressbar"><img src="https://img.shields.io/npm/dw/angular-gradient-progressbar"/> </a> <
134 lines • 32.8 kB
JavaScript
import { Component, Input, ViewChild, } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class AngularGradientProgressbarComponent {
constructor() {
//type of progress bar
this.type = 1; //default is 1
//end
//tool tip textcolor
this.lowTextColor = '';
this.mediumTextColor = '';
this.highTextColor = '';
//end
//adjusting width of the progress bar
this.progressBarWidth = 7; //default is 7
//end
// number of bars
this.barCount = 7; // default is 7 and max is 10
//end
// value of the progress bar
this.value = 75; // default is 75
//end
// Quartle value of the progress bar
this.quartileValueLow = 3; //default to 3
this.quartileValueHigh = 6; // default to 6
this.quartileValue = 0;
//end
//show tooltip or not
this.showToolTip = true; // default is true
//end
//simple progress bar value
this.secondValue = 75; // default is 75
this.value1 = 0;
this.elementArr = [];
}
ngOnInit() { }
ngAfterViewInit() {
setTimeout(() => {
if (this.type === 1) {
this.rangeArray();
this.toolTip();
}
else if (this.type === 2) {
this.value1 = 100 - this.secondValue;
}
});
}
toolTip() {
this.quartileValue = Math.round(this.value / this.quartilePercentage);
this.potentialLabel =
this.quartileValue < this.quartileValueLow
? 'low'
: this.quartileValue <= this.quartileValueHigh
? 'medium'
: 'high';
this.toolTipClass = 'indicator ' + this.potentialLabel;
}
rangeArray() {
if (this.barCount <= 10) {
this.quartilePercentage = 100 / this.barCount;
this.elementArr = [];
let percent;
let quartileValue;
for (let i = 1; i <= this.barCount; i++) {
const currentPoint = Math.round(this.quartilePercentage * i);
if (this.value <= currentPoint) {
//Check if percent and quartile value is present of not. This runs only one time
if (!percent && !quartileValue) {
const previousPoint = Math.round(this.quartilePercentage * (i - 1));
const difference = currentPoint - previousPoint;
quartileValue = i;
percent =
Math.round(((this.value - previousPoint) / difference) * 100) +
'%';
}
if (percent && quartileValue) {
if (i === quartileValue) {
// set specified block value so that it can be used to make gradient
this.divView.nativeElement.style.setProperty('--block-' + i, percent);
// set left value to position the indicator and tooltip
this.divView.nativeElement.style.setProperty('--left-value', percent);
}
if (this.showToolTip) {
this.blockClass =
'item ' + (i === quartileValue ? 'current filled' : '');
this.elementArr.push(this.blockClass);
}
else {
this.blockClass =
'item ' + (i === quartileValue ? 'tool filled' : '');
this.elementArr.push(this.blockClass);
}
}
}
else {
this.blockClass = 'item filled';
this.elementArr.push(this.blockClass);
}
}
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AngularGradientProgressbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.2", type: AngularGradientProgressbarComponent, selector: "angular-gradient-progressbar", inputs: { type: "type", lowTextColor: "lowTextColor", mediumTextColor: "mediumTextColor", highTextColor: "highTextColor", progressBarWidth: "progressBarWidth", barCount: "barCount", value: "value", quartileValueLow: "quartileValueLow", quartileValueHigh: "quartileValueHigh", showToolTip: "showToolTip", secondValue: "secondValue" }, viewQueries: [{ propertyName: "divView", first: true, predicate: ["myDiv"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"type === 1\">\r\n <div>\r\n <div\r\n #myDiv\r\n class=\"potential__range\"\r\n style=\"--lowText:{{ lowTextColor }} ; --mediumText:{{mediumTextColor}}; --highText:{{highTextColor}}; --progressBarWidth:{{progressBarWidth}};\"\r\n >\r\n <div class=\"range\">\r\n <div *ngFor=\"let item of elementArr; let i = index\" [class]=\"item\">\r\n <div\r\n *ngIf=\"item === 'item current filled' && showToolTip\"\r\n [class]=\"toolTipClass\"\r\n >\r\n <span *ngIf=\"showToolTip\">{{ potentialLabel }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"type === 2 && secondValue <=100 \">\r\n <div class=\"display_\">\r\n <div class=\"progress\"></div>\r\n <div class=\"progress_1\" style=\"--p:{{ value1 }}%\"></div>\r\n </div>\r\n</ng-container>\r\n", styles: [".potential__range{--block-1: 100%;--white-block-1: 0%;--block-2: 100%;--white-block-2: 0%;--block-3: 100%;--white-block-3: 0%;--block-4: 100%;--white-block-4: 0%;--block-5: 100%;--white-block-5: 0%;--block-6: 100%;--white-block-6: 0%;--block-7: 100%;--white-block-7: 0%;--block-8: 100%;--white-block-8: 0%;--block-9: 100%;--white-block-9: 0%;--block-10: 100%;--white-block-10: 0%;--lowText: #f14913;--mediumText: #fbaf00;--highText: #0a7a30;--progressBarWidth: 7;--left-value: 0;color:#1d1d1d;margin:3rem 4rem;padding:1.6rem 0}.potential__range h3{font-size:2rem;font-weight:500}.potential__range h3 b{text-transform:capitalize}.potential__range .range{display:flex}.potential__range .range .item{width:calc(100% / var(--progressBarWidth));height:17px;position:relative;background-color:#c8cfd580}.potential__range .range .item .indicator{width:90px;height:32px;box-shadow:0 14px 20px #00000014;border:solid 2px #fff;border-radius:16px;position:absolute;left:calc(var(--left-value) - 45px);top:-60px;display:flex;align-items:center;justify-content:center}.potential__range .range .item .indicator.low{background-color:#f8e2dd}.potential__range .range .item .indicator.low span{color:var(--lowText)}.potential__range .range .item .indicator.low:after{border-top:8px solid #f8e2dd}.potential__range .range .item .indicator.medium{background-color:#fff7e3}.potential__range .range .item .indicator.medium span{color:var(--mediumText)}.potential__range .range .item .indicator.medium:after{border-top:8px solid #fff7e3}.potential__range .range .item .indicator.high{background-color:#e3f5ea}.potential__range .range .item .indicator.high span{color:var(--highText)}.potential__range .range .item .indicator.high:after{border-top:8px solid #e3f5ea}.potential__range .range .item .indicator span{font-size:1.3rem;font-family:Poppins,Arial,Helvetica,sans-serif;font-weight:700}.potential__range .range .item .indicator:before{content:\"\";width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid white;position:absolute;left:50%;top:50%;transform:translate(-50%,140%)}.potential__range .range .item .indicator:after{content:\"\";width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid white;position:absolute;left:50%;top:50%;transform:translate(-50%,140%)}.potential__range .range .item:not(:last-child){margin-right:.2rem}.potential__range .range .item.filled{position:relative}.potential__range .range .item.filled.current:before{content:\"\";height:32px;width:32px;border-radius:50%;border:3px solid white;box-shadow:0 2px 4px #00000038;background-color:#0a7a30;position:absolute;top:50%;left:calc(var(--left-value) - 19px);transform:translateY(-50%);z-index:1}.potential__range .range .item.filled.current:after{content:\"\";width:16px;height:16px;border-radius:50%;background-color:#fff;position:absolute;top:50%;left:calc(var(--left-value) - 8.25px);transform:translateY(-50%);z-index:2}.potential__range .range .item.filled:nth-child(1){background:linear-gradient(90deg,#f14913 var(--block-1),rgba(200,207,213,.5) var(--white-block-1))}.potential__range .range .item.filled:nth-child(1).current:before{background:#f14913}.potential__range .range .item.filled:nth-child(2){background:linear-gradient(90deg,#f17613 var(--block-2),rgba(200,207,213,.5) var(--white-block-2))}.potential__range .range .item.filled:nth-child(2).current:before{background:#f17613}.potential__range .range .item.filled:nth-child(3){background:linear-gradient(90deg,#f19e13 var(--block-3),rgba(200,207,213,.5) var(--white-block-3))}.potential__range .range .item.filled:nth-child(3).current:before{background:#f19e13}.potential__range .range .item.filled:nth-child(4){background:linear-gradient(90deg,#f1b113 var(--block-4),rgba(200,207,213,.5) var(--white-block-4))}.potential__range .range .item.filled:nth-child(4).current:before{background:#f1b113}.potential__range .range .item.filled:nth-child(5){background:linear-gradient(90deg,#f1de13 var(--block-5),rgba(200,207,213,.5) var(--white-block-5))}.potential__range .range .item.filled:nth-child(5).current:before{background:#f1de13}.potential__range .range .item.filled:nth-child(6){background:linear-gradient(90deg,#ccd948 var(--block-6),rgba(200,207,213,.5) var(--white-block-6))}.potential__range .range .item.filled:nth-child(6).current:before{background:#ccd948}.potential__range .range .item.filled:nth-child(7){background:linear-gradient(90deg,#a7b429 var(--block-7),rgba(200,213,200,.5) var(--white-block-7))}.potential__range .range .item.filled:nth-child(7).current:before{background:#a7b429}.potential__range .range .item.filled:nth-child(8){background:linear-gradient(90deg,#53cc7c var(--block-8),rgba(200,207,213,.5) var(--white-block-8))}.potential__range .range .item.filled:nth-child(8).current:before{background:#53cc7c}.potential__range .range .item.filled:nth-child(9){background:linear-gradient(90deg,#43c770 var(--block-9),rgba(200,207,213,.5) var(--white-block-9))}.potential__range .range .item.filled:nth-child(9).current:before{background:#43c770}.potential__range .range .item.filled:nth-child(10){background:#0a7a30;background:linear-gradient(90deg,#0a7a30 var(--block-10),rgba(200,207,213,.5) var(--white-block-10))}.potential__range .range .item.filled:nth-child(10) .indicator{right:-30px}.potential__range .range .item.empty.current:before{content:\"\";height:32px;width:32px;border-radius:50%;border:3px solid white;box-shadow:0 2px 4px #00000038;background-color:#0a7a30;position:absolute;top:50%;left:-10px;transform:translateY(-50%);z-index:1}.potential__range .range .item.empty.current:after{content:\"\";width:16px;height:16px;border-radius:50%;background-color:#fff;position:absolute;top:50%;left:1px;transform:translateY(-50%);z-index:2}.potential__range .range .item.empty .indicator{left:-15px}.potential__range .range .item:nth-child(10) svg{position:absolute;right:-24px;top:50%;transform:translateY(-50%)}.progress{height:7px;margin-bottom:-8px;background-image:linear-gradient(90deg,red,#fff200,#0f0);background-size:100% 100%,100% 100%;background-repeat:no-repeat}.progress_1{height:9px;width:103%;margin-bottom:-8px;background-image:linear-gradient(#fff,#ccc);background-size:var(--p, 50%) 100%,100% 100%;transform:rotate(180deg);z-index:100;background-repeat:no-repeat}.display_{margin:3rem 10rem;padding:1.6rem 0}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AngularGradientProgressbarComponent, decorators: [{
type: Component,
args: [{ selector: 'angular-gradient-progressbar', template: "<ng-container *ngIf=\"type === 1\">\r\n <div>\r\n <div\r\n #myDiv\r\n class=\"potential__range\"\r\n style=\"--lowText:{{ lowTextColor }} ; --mediumText:{{mediumTextColor}}; --highText:{{highTextColor}}; --progressBarWidth:{{progressBarWidth}};\"\r\n >\r\n <div class=\"range\">\r\n <div *ngFor=\"let item of elementArr; let i = index\" [class]=\"item\">\r\n <div\r\n *ngIf=\"item === 'item current filled' && showToolTip\"\r\n [class]=\"toolTipClass\"\r\n >\r\n <span *ngIf=\"showToolTip\">{{ potentialLabel }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"type === 2 && secondValue <=100 \">\r\n <div class=\"display_\">\r\n <div class=\"progress\"></div>\r\n <div class=\"progress_1\" style=\"--p:{{ value1 }}%\"></div>\r\n </div>\r\n</ng-container>\r\n", styles: [".potential__range{--block-1: 100%;--white-block-1: 0%;--block-2: 100%;--white-block-2: 0%;--block-3: 100%;--white-block-3: 0%;--block-4: 100%;--white-block-4: 0%;--block-5: 100%;--white-block-5: 0%;--block-6: 100%;--white-block-6: 0%;--block-7: 100%;--white-block-7: 0%;--block-8: 100%;--white-block-8: 0%;--block-9: 100%;--white-block-9: 0%;--block-10: 100%;--white-block-10: 0%;--lowText: #f14913;--mediumText: #fbaf00;--highText: #0a7a30;--progressBarWidth: 7;--left-value: 0;color:#1d1d1d;margin:3rem 4rem;padding:1.6rem 0}.potential__range h3{font-size:2rem;font-weight:500}.potential__range h3 b{text-transform:capitalize}.potential__range .range{display:flex}.potential__range .range .item{width:calc(100% / var(--progressBarWidth));height:17px;position:relative;background-color:#c8cfd580}.potential__range .range .item .indicator{width:90px;height:32px;box-shadow:0 14px 20px #00000014;border:solid 2px #fff;border-radius:16px;position:absolute;left:calc(var(--left-value) - 45px);top:-60px;display:flex;align-items:center;justify-content:center}.potential__range .range .item .indicator.low{background-color:#f8e2dd}.potential__range .range .item .indicator.low span{color:var(--lowText)}.potential__range .range .item .indicator.low:after{border-top:8px solid #f8e2dd}.potential__range .range .item .indicator.medium{background-color:#fff7e3}.potential__range .range .item .indicator.medium span{color:var(--mediumText)}.potential__range .range .item .indicator.medium:after{border-top:8px solid #fff7e3}.potential__range .range .item .indicator.high{background-color:#e3f5ea}.potential__range .range .item .indicator.high span{color:var(--highText)}.potential__range .range .item .indicator.high:after{border-top:8px solid #e3f5ea}.potential__range .range .item .indicator span{font-size:1.3rem;font-family:Poppins,Arial,Helvetica,sans-serif;font-weight:700}.potential__range .range .item .indicator:before{content:\"\";width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid white;position:absolute;left:50%;top:50%;transform:translate(-50%,140%)}.potential__range .range .item .indicator:after{content:\"\";width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid white;position:absolute;left:50%;top:50%;transform:translate(-50%,140%)}.potential__range .range .item:not(:last-child){margin-right:.2rem}.potential__range .range .item.filled{position:relative}.potential__range .range .item.filled.current:before{content:\"\";height:32px;width:32px;border-radius:50%;border:3px solid white;box-shadow:0 2px 4px #00000038;background-color:#0a7a30;position:absolute;top:50%;left:calc(var(--left-value) - 19px);transform:translateY(-50%);z-index:1}.potential__range .range .item.filled.current:after{content:\"\";width:16px;height:16px;border-radius:50%;background-color:#fff;position:absolute;top:50%;left:calc(var(--left-value) - 8.25px);transform:translateY(-50%);z-index:2}.potential__range .range .item.filled:nth-child(1){background:linear-gradient(90deg,#f14913 var(--block-1),rgba(200,207,213,.5) var(--white-block-1))}.potential__range .range .item.filled:nth-child(1).current:before{background:#f14913}.potential__range .range .item.filled:nth-child(2){background:linear-gradient(90deg,#f17613 var(--block-2),rgba(200,207,213,.5) var(--white-block-2))}.potential__range .range .item.filled:nth-child(2).current:before{background:#f17613}.potential__range .range .item.filled:nth-child(3){background:linear-gradient(90deg,#f19e13 var(--block-3),rgba(200,207,213,.5) var(--white-block-3))}.potential__range .range .item.filled:nth-child(3).current:before{background:#f19e13}.potential__range .range .item.filled:nth-child(4){background:linear-gradient(90deg,#f1b113 var(--block-4),rgba(200,207,213,.5) var(--white-block-4))}.potential__range .range .item.filled:nth-child(4).current:before{background:#f1b113}.potential__range .range .item.filled:nth-child(5){background:linear-gradient(90deg,#f1de13 var(--block-5),rgba(200,207,213,.5) var(--white-block-5))}.potential__range .range .item.filled:nth-child(5).current:before{background:#f1de13}.potential__range .range .item.filled:nth-child(6){background:linear-gradient(90deg,#ccd948 var(--block-6),rgba(200,207,213,.5) var(--white-block-6))}.potential__range .range .item.filled:nth-child(6).current:before{background:#ccd948}.potential__range .range .item.filled:nth-child(7){background:linear-gradient(90deg,#a7b429 var(--block-7),rgba(200,213,200,.5) var(--white-block-7))}.potential__range .range .item.filled:nth-child(7).current:before{background:#a7b429}.potential__range .range .item.filled:nth-child(8){background:linear-gradient(90deg,#53cc7c var(--block-8),rgba(200,207,213,.5) var(--white-block-8))}.potential__range .range .item.filled:nth-child(8).current:before{background:#53cc7c}.potential__range .range .item.filled:nth-child(9){background:linear-gradient(90deg,#43c770 var(--block-9),rgba(200,207,213,.5) var(--white-block-9))}.potential__range .range .item.filled:nth-child(9).current:before{background:#43c770}.potential__range .range .item.filled:nth-child(10){background:#0a7a30;background:linear-gradient(90deg,#0a7a30 var(--block-10),rgba(200,207,213,.5) var(--white-block-10))}.potential__range .range .item.filled:nth-child(10) .indicator{right:-30px}.potential__range .range .item.empty.current:before{content:\"\";height:32px;width:32px;border-radius:50%;border:3px solid white;box-shadow:0 2px 4px #00000038;background-color:#0a7a30;position:absolute;top:50%;left:-10px;transform:translateY(-50%);z-index:1}.potential__range .range .item.empty.current:after{content:\"\";width:16px;height:16px;border-radius:50%;background-color:#fff;position:absolute;top:50%;left:1px;transform:translateY(-50%);z-index:2}.potential__range .range .item.empty .indicator{left:-15px}.potential__range .range .item:nth-child(10) svg{position:absolute;right:-24px;top:50%;transform:translateY(-50%)}.progress{height:7px;margin-bottom:-8px;background-image:linear-gradient(90deg,red,#fff200,#0f0);background-size:100% 100%,100% 100%;background-repeat:no-repeat}.progress_1{height:9px;width:103%;margin-bottom:-8px;background-image:linear-gradient(#fff,#ccc);background-size:var(--p, 50%) 100%,100% 100%;transform:rotate(180deg);z-index:100;background-repeat:no-repeat}.display_{margin:3rem 10rem;padding:1.6rem 0}\n"] }]
}], ctorParameters: () => [], propDecorators: { type: [{
type: Input
}], lowTextColor: [{
type: Input
}], mediumTextColor: [{
type: Input
}], highTextColor: [{
type: Input
}], progressBarWidth: [{
type: Input
}], barCount: [{
type: Input
}], value: [{
type: Input
}], quartileValueLow: [{
type: Input
}], quartileValueHigh: [{
type: Input
}], showToolTip: [{
type: Input
}], secondValue: [{
type: Input
}], divView: [{
type: ViewChild,
args: ['myDiv']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1ncmFkaWVudC1wcm9ncmVzc2Jhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWdyYWRpZW50LXByb2dyZXNzYmFyL3NyYy9saWIvYW5ndWxhci1ncmFkaWVudC1wcm9ncmVzc2Jhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWdyYWRpZW50LXByb2dyZXNzYmFyL3NyYy9saWIvYW5ndWxhci1ncmFkaWVudC1wcm9ncmVzc2Jhci1jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxTQUFTLEdBR1YsTUFBTSxlQUFlLENBQUM7OztBQU92QixNQUFNLE9BQU8sbUNBQW1DO0lBMkM5QztRQXhDQSxzQkFBc0I7UUFDYixTQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsY0FBYztRQUNqQyxLQUFLO1FBQ0wsb0JBQW9CO1FBQ1gsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFDbEIsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDckIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDNUIsS0FBSztRQUNMLHFDQUFxQztRQUM1QixxQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxjQUFjO1FBQzdDLEtBQUs7UUFDTCxpQkFBaUI7UUFDUixhQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO1FBQ3BELEtBQUs7UUFDTCw0QkFBNEI7UUFDbkIsVUFBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQjtRQUNyQyxLQUFLO1FBQ0wsb0NBQW9DO1FBQzNCLHFCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDLGNBQWM7UUFDcEMsc0JBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsZUFBZTtRQUMvQyxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUVsQixLQUFLO1FBRUwscUJBQXFCO1FBQ1osZ0JBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQyxrQkFBa0I7UUFDL0MsS0FBSztRQUVMLDJCQUEyQjtRQUNsQixnQkFBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQjtRQUMzQyxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBSVgsZUFBVSxHQUFHLEVBQUUsQ0FBQztJQU1ELENBQUM7SUFFaEIsUUFBUSxLQUFVLENBQUM7SUFFbkIsZUFBZTtRQUNiLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGNBQWM7WUFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCO2dCQUN4QyxDQUFDLENBQUMsS0FBSztnQkFDUCxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsaUJBQWlCO29CQUM5QyxDQUFDLENBQUMsUUFBUTtvQkFDVixDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDOUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxPQUFZLENBQUM7WUFDakIsSUFBSSxhQUFrQixDQUFDO1lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQy9CLGdGQUFnRjtvQkFDaEYsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUMvQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwRSxNQUFNLFVBQVUsR0FBRyxZQUFZLEdBQUcsYUFBYSxDQUFDO3dCQUNoRCxhQUFhLEdBQUcsQ0FBQyxDQUFDO3dCQUNsQixPQUFPOzRCQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDO2dDQUM3RCxHQUFHLENBQUM7b0JBQ1IsQ0FBQztvQkFDRCxJQUFJLE9BQU8sSUFBSSxhQUFhLEVBQUUsQ0FBQzt3QkFDN0IsSUFBSSxDQUFDLEtBQUssYUFBYSxFQUFFLENBQUM7NEJBQ3hCLG9FQUFvRTs0QkFDcEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FDMUMsVUFBVSxHQUFHLENBQUMsRUFDZCxPQUFPLENBQ1IsQ0FBQzs0QkFDRix1REFBdUQ7NEJBQ3ZELElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQzFDLGNBQWMsRUFDZCxPQUFPLENBQ1IsQ0FBQzt3QkFDSixDQUFDO3dCQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOzRCQUNyQixJQUFJLENBQUMsVUFBVTtnQ0FDYixPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7NEJBQzFELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDeEMsQ0FBQzs2QkFBTSxDQUFDOzRCQUNOLElBQUksQ0FBQyxVQUFVO2dDQUNiLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7NEJBQ3ZELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDeEMsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztvQkFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDOzhHQXBIVSxtQ0FBbUM7a0dBQW5DLG1DQUFtQyxvZkNkaEQsNDZCQTJCQTs7MkZEYmEsbUNBQW1DO2tCQUwvQyxTQUFTOytCQUVFLDhCQUE4Qjt3REFPL0IsSUFBSTtzQkFBWixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQU1HLFdBQVc7c0JBQW5CLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFTYyxPQUFPO3NCQUExQixTQUFTO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgSW5wdXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlVXJsOiAnLi9hbmd1bGFyLWdyYWRpZW50LXByb2dyZXNzYmFyLWNvbXBvbmVudC5odG1sJyxcclxuICBzZWxlY3RvcjogJ2FuZ3VsYXItZ3JhZGllbnQtcHJvZ3Jlc3NiYXInLFxyXG4gIHN0eWxlVXJsczogWycuL2FuZ3VsYXItZ3JhZGllbnQtcHJvZ3Jlc3NiYXIuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhckdyYWRpZW50UHJvZ3Jlc3NiYXJDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdFxyXG57XHJcbiAgLy90eXBlIG9mIHByb2dyZXNzIGJhclxyXG4gIEBJbnB1dCgpIHR5cGUgPSAxOyAvL2RlZmF1bHQgaXMgMVxyXG4gIC8vZW5kXHJcbiAgLy90b29sIHRpcCB0ZXh0Y29sb3JcclxuICBASW5wdXQoKSBsb3dUZXh0Q29sb3IgPSAnJztcclxuICBASW5wdXQoKSBtZWRpdW1UZXh0Q29sb3IgPSAnJztcclxuICBASW5wdXQoKSBoaWdoVGV4dENvbG9yID0gJyc7XHJcbiAgLy9lbmRcclxuICAvL2FkanVzdGluZyB3aWR0aCBvZiB0aGUgcHJvZ3Jlc3MgYmFyXHJcbiAgQElucHV0KCkgcHJvZ3Jlc3NCYXJXaWR0aCA9IDc7IC8vZGVmYXVsdCBpcyA3XHJcbiAgLy9lbmRcclxuICAvLyBudW1iZXIgb2YgYmFyc1xyXG4gIEBJbnB1dCgpIGJhckNvdW50ID0gNzsgLy8gZGVmYXVsdCBpcyA3IGFuZCBtYXggaXMgMTBcclxuICAvL2VuZFxyXG4gIC8vIHZhbHVlIG9mIHRoZSBwcm9ncmVzcyBiYXJcclxuICBASW5wdXQoKSB2YWx1ZSA9IDc1OyAvLyBkZWZhdWx0IGlzIDc1XHJcbiAgLy9lbmRcclxuICAvLyBRdWFydGxlIHZhbHVlIG9mIHRoZSBwcm9ncmVzcyBiYXJcclxuICBASW5wdXQoKSBxdWFydGlsZVZhbHVlTG93ID0gMzsgLy9kZWZhdWx0IHRvIDNcclxuICBASW5wdXQoKSBxdWFydGlsZVZhbHVlSGlnaCA9IDY7IC8vIGRlZmF1bHQgdG8gNlxyXG4gIHF1YXJ0aWxlVmFsdWUgPSAwO1xyXG4gIHF1YXJ0aWxlUGVyY2VudGFnZTogYW55O1xyXG4gIC8vZW5kXHJcblxyXG4gIC8vc2hvdyB0b29sdGlwIG9yIG5vdFxyXG4gIEBJbnB1dCgpIHNob3dUb29sVGlwID0gdHJ1ZTsgLy8gZGVmYXVsdCBpcyB0cnVlXHJcbiAgLy9lbmRcclxuXHJcbiAgLy9zaW1wbGUgcHJvZ3Jlc3MgYmFyIHZhbHVlXHJcbiAgQElucHV0KCkgc2Vjb25kVmFsdWUgPSA3NTsgLy8gZGVmYXVsdCBpcyA3NVxyXG4gIHZhbHVlMSA9IDA7XHJcbiAgLy9lbmRcclxuXHJcbiAgYmxvY2tDbGFzczogYW55O1xyXG4gIGVsZW1lbnRBcnIgPSBbXTtcclxuICBwb3RlbnRpYWxMYWJlbDogYW55O1xyXG4gIHRvb2xUaXBDbGFzczogYW55O1xyXG5cclxuICBAVmlld0NoaWxkKCdteURpdicpIGRpdlZpZXc6IEVsZW1lbnRSZWY7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7fVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gMSkge1xyXG4gICAgICAgIHRoaXMucmFuZ2VBcnJheSgpO1xyXG4gICAgICAgIHRoaXMudG9vbFRpcCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gMikge1xyXG4gICAgICAgIHRoaXMudmFsdWUxID0gMTAwIC0gdGhpcy5zZWNvbmRWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b29sVGlwKCkge1xyXG4gICAgdGhpcy5xdWFydGlsZVZhbHVlID0gTWF0aC5yb3VuZCh0aGlzLnZhbHVlIC8gdGhpcy5xdWFydGlsZVBlcmNlbnRhZ2UpO1xyXG4gICAgdGhpcy5wb3RlbnRpYWxMYWJlbCA9XHJcbiAgICAgIHRoaXMucXVhcnRpbGVWYWx1ZSA8IHRoaXMucXVhcnRpbGVWYWx1ZUxvd1xyXG4gICAgICAgID8gJ2xvdydcclxuICAgICAgICA6IHRoaXMucXVhcnRpbGVWYWx1ZSA8PSB0aGlzLnF1YXJ0aWxlVmFsdWVIaWdoXHJcbiAgICAgICAgPyAnbWVkaXVtJ1xyXG4gICAgICAgIDogJ2hpZ2gnO1xyXG4gICAgdGhpcy50b29sVGlwQ2xhc3MgPSAnaW5kaWNhdG9yICcgKyB0aGlzLnBvdGVudGlhbExhYmVsO1xyXG4gIH1cclxuXHJcbiAgcmFuZ2VBcnJheSgpIHtcclxuICAgIGlmICh0aGlzLmJhckNvdW50IDw9IDEwKSB7XHJcbiAgICAgIHRoaXMucXVhcnRpbGVQZXJjZW50YWdlID0gMTAwIC8gdGhpcy5iYXJDb3VudDtcclxuICAgICAgdGhpcy5lbGVtZW50QXJyID0gW107XHJcbiAgICAgIGxldCBwZXJjZW50OiBhbnk7XHJcbiAgICAgIGxldCBxdWFydGlsZVZhbHVlOiBhbnk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRoaXMuYmFyQ291bnQ7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQb2ludCA9IE1hdGgucm91bmQodGhpcy5xdWFydGlsZVBlcmNlbnRhZ2UgKiBpKTtcclxuICAgICAgICBpZiAodGhpcy52YWx1ZSA8PSBjdXJyZW50UG9pbnQpIHtcclxuICAgICAgICAgIC8vQ2hlY2sgaWYgcGVyY2VudCBhbmQgcXVhcnRpbGUgdmFsdWUgaXMgcHJlc2VudCBvZiBub3QuIFRoaXMgcnVucyBvbmx5IG9uZSB0aW1lXHJcbiAgICAgICAgICBpZiAoIXBlcmNlbnQgJiYgIXF1YXJ0aWxlVmFsdWUpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNQb2ludCA9IE1hdGgucm91bmQodGhpcy5xdWFydGlsZVBlcmNlbnRhZ2UgKiAoaSAtIDEpKTtcclxuICAgICAgICAgICAgY29uc3QgZGlmZmVyZW5jZSA9IGN1cnJlbnRQb2ludCAtIHByZXZpb3VzUG9pbnQ7XHJcbiAgICAgICAgICAgIHF1YXJ0aWxlVmFsdWUgPSBpO1xyXG4gICAgICAgICAgICBwZXJjZW50ID1cclxuICAgICAgICAgICAgICBNYXRoLnJvdW5kKCgodGhpcy52YWx1ZSAtIHByZXZpb3VzUG9pbnQpIC8gZGlmZmVyZW5jZSkgKiAxMDApICtcclxuICAgICAgICAgICAgICAnJSc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocGVyY2VudCAmJiBxdWFydGlsZVZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmIChpID09PSBxdWFydGlsZVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgLy8gc2V0IHNwZWNpZmllZCBibG9jayB2YWx1ZSBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIG1ha2UgZ3JhZGllbnRcclxuICAgICAgICAgICAgICB0aGlzLmRpdlZpZXcubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcclxuICAgICAgICAgICAgICAgICctLWJsb2NrLScgKyBpLFxyXG4gICAgICAgICAgICAgICAgcGVyY2VudFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgLy8gc2V0IGxlZnQgdmFsdWUgdG8gcG9zaXRpb24gdGhlIGluZGljYXRvciBhbmQgdG9vbHRpcFxyXG4gICAgICAgICAgICAgIHRoaXMuZGl2Vmlldy5uYXRpdmVFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFxyXG4gICAgICAgICAgICAgICAgJy0tbGVmdC12YWx1ZScsXHJcbiAgICAgICAgICAgICAgICBwZXJjZW50XHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93VG9vbFRpcCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuYmxvY2tDbGFzcyA9XHJcbiAgICAgICAgICAgICAgICAnaXRlbSAnICsgKGkgPT09IHF1YXJ0aWxlVmFsdWUgPyAnY3VycmVudCBmaWxsZWQnIDogJycpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZWxlbWVudEFyci5wdXNoKHRoaXMuYmxvY2tDbGFzcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ibG9ja0NsYXNzID1cclxuICAgICAgICAgICAgICAgICdpdGVtICcgKyAoaSA9PT0gcXVhcnRpbGVWYWx1ZSA/ICd0b29sIGZpbGxlZCcgOiAnJyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5lbGVtZW50QXJyLnB1c2godGhpcy5ibG9ja0NsYXNzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmJsb2NrQ2xhc3MgPSAnaXRlbSBmaWxsZWQnO1xyXG4gICAgICAgICAgdGhpcy5lbGVtZW50QXJyLnB1c2godGhpcy5ibG9ja0NsYXNzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInR5cGUgPT09IDFcIj5cclxuICA8ZGl2PlxyXG4gICAgPGRpdlxyXG4gICAgICAjbXlEaXZcclxuICAgICAgY2xhc3M9XCJwb3RlbnRpYWxfX3JhbmdlXCJcclxuICAgICAgc3R5bGU9XCItLWxvd1RleHQ6e3sgbG93VGV4dENvbG9yIH19IDsgLS1tZWRpdW1UZXh0Ont7bWVkaXVtVGV4dENvbG9yfX07IC0taGlnaFRleHQ6e3toaWdoVGV4dENvbG9yfX07IC0tcHJvZ3Jlc3NCYXJXaWR0aDp7e3Byb2dyZXNzQmFyV2lkdGh9fTtcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicmFuZ2VcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGVsZW1lbnRBcnI7IGxldCBpID0gaW5kZXhcIiBbY2xhc3NdPVwiaXRlbVwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAqbmdJZj1cIml0ZW0gPT09ICdpdGVtIGN1cnJlbnQgZmlsbGVkJyAmJiBzaG93VG9vbFRpcFwiXHJcbiAgICAgICAgICAgIFtjbGFzc109XCJ0b29sVGlwQ2xhc3NcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dUb29sVGlwXCI+e3sgcG90ZW50aWFsTGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcblxyXG48bmctY29udGFpbmVyICpuZ0lmPVwidHlwZSA9PT0gMiAmJiBzZWNvbmRWYWx1ZSA8PTEwMCBcIj5cclxuICA8ZGl2IGNsYXNzPVwiZGlzcGxheV9cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXzFcIiBzdHlsZT1cIi0tcDp7eyB2YWx1ZTEgfX0lXCI+PC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG4iXX0=