@taiga-ui/kit
Version:
Taiga UI Angular main components kit
65 lines • 18.6 kB
JavaScript
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, inject, Input } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { TuiControl } from '@taiga-ui/cdk/classes';
import { TuiRepeatTimes } from '@taiga-ui/cdk/directives/repeat-times';
import { tuiFallbackValueProvider } from '@taiga-ui/cdk/tokens';
import { tuiClamp } from '@taiga-ui/cdk/utils/math';
import { TuiIcon } from '@taiga-ui/core/components/icon';
import { PolymorpheusOutlet } from '@taiga-ui/polymorpheus';
import { TUI_RATING_OPTIONS } from './rating.options';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
class TuiRating extends TuiControl {
constructor() {
super(...arguments);
this.options = inject(TUI_RATING_OPTIONS);
this.active = 0;
this.icon = this.options.icon;
this.max = this.options.max;
}
onKeyDown(event) {
if (this.readOnly()) {
event.preventDefault();
}
}
onPointer(delta) {
this.active = tuiClamp(this.active + delta, 0, 1);
}
onClick(value) {
if (this.active) {
this.onChange(value);
}
}
isActive(index) {
return Math.ceil(this.value()) >= this.max - index;
}
isFraction(index) {
return this.value() > this.max - index - 1 && this.value() < this.max - index;
}
getCut(index) {
return this.isFraction(index)
? 100 * Math.max(this.max - index - this.value(), 0)
: 0;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiRating, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiRating, isStandalone: true, selector: "tui-rating", inputs: { icon: "icon", max: "max" }, host: { listeners: { "keydown.capture": "onKeyDown($event)", "pointerdown": "onPointer(1)", "pointercancel": "onPointer(-1)", "document:pointerup": "onPointer(-1)" }, properties: { "class._disabled": "disabled()", "class._readonly": "readOnly()", "class._active": "active" } }, providers: [tuiFallbackValueProvider(0)], usesInheritance: true, ngImport: i0, template: "<input\n min=\"1\"\n type=\"range\"\n class=\"t-range\"\n [attr.aria-disabled]=\"readOnly()\"\n [disabled]=\"disabled()\"\n [max]=\"max\"\n [ngModel]=\"value()\"\n [ngModelOptions]=\"{standalone: true}\"\n (blur)=\"onTouched()\"\n (ngModelChange)=\"onChange($event)\"\n/>\n<div class=\"t-items\">\n <div\n *tuiRepeatTimes=\"let index of max\"\n class=\"t-item\"\n [class.t-item_active]=\"isActive(index)\"\n (pointerup)=\"onClick(max - index)\"\n >\n <tui-icon\n *polymorpheusOutlet=\"icon as src; context: {$implicit: max - index, value: value()}\"\n class=\"t-icon t-icon_blank\"\n [class.t-icon_fraction]=\"isFraction(index)\"\n [icon]=\"src.toString()\"\n [style.--t-cut.%]=\"100 - getCut(index)\"\n />\n <tui-icon\n *polymorpheusOutlet=\"icon as src; context: {$implicit: max - index, value: value()}\"\n class=\"t-icon\"\n [icon]=\"src.toString()\"\n [style.--t-cut.%]=\"getCut(index)\"\n />\n </div>\n</div>\n", styles: [":host{position:relative;display:block;inline-size:-webkit-fit-content;inline-size:-moz-fit-content;inline-size:fit-content;min-inline-size:-webkit-fit-content;min-inline-size:-moz-fit-content;min-inline-size:fit-content;font-size:1rem;color:var(--tui-chart-categorical-12);cursor:pointer;-webkit-user-select:none;user-select:none}:host._readonly{pointer-events:none}:host._disabled{pointer-events:none;opacity:var(--tui-disabled-opacity)}.t-range{position:absolute;top:0;left:0;inline-size:100%;block-size:100%;opacity:0;box-sizing:border-box;padding:0 .75em;pointer-events:none}.t-range:focus-visible+.t-items{box-shadow:inset 0 0 0 .125rem var(--tui-border-focus)}.t-items{position:relative;display:flex;flex-direction:row-reverse}.t-items:hover .t-icon{clip-path:inset(0 0 0 0)}.t-items:hover .t-icon_blank{clip-path:inset(0 0 0 100%)}.t-item{position:relative;flex:1 0 0;color:var(--tui-text-tertiary);transition-property:color,transform;transition-duration:var(--tui-duration);transition-timing-function:ease-in-out,cubic-bezier(.35,1.5,.4,2.5)}.t-item:first-child{max-inline-size:2.5em}.t-item:hover,.t-item:hover~.t-item,.t-items:not(:hover) .t-item_active{color:currentColor}.t-items:active .t-item:hover,.t-items:active .t-item:hover~.t-item{transform:scale(.85);transition-duration:var(--tui-duration),calc(var(--tui-duration) / 3);transition-timing-function:ease-in-out}.t-icon{transition-property:clip-path;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;inline-size:2.5em;block-size:2.5em;font-size:inherit;clip-path:inset(0 var(--t-cut) 0 0)}.t-icon ::ng-deep>*{font-size:1rem}.t-icon_blank{position:absolute;top:0;left:0;display:none;color:var(--tui-text-tertiary);clip-path:inset(0 0 0 var(--t-cut))}.t-icon_fraction{display:block}@media (any-pointer: coarse){:host._active .t-item_active{transform:scale(.85);transition-timing-function:ease-in-out}:host:not(._readonly) .t-range{pointer-events:auto}.t-icon{transition:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: TuiRepeatTimes, selector: "[tuiRepeatTimes][tuiRepeatTimesOf]", inputs: ["tuiRepeatTimesOf"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
export { TuiRating };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiRating, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'tui-rating', imports: [CommonModule, FormsModule, PolymorpheusOutlet, TuiIcon, TuiRepeatTimes], changeDetection: ChangeDetectionStrategy.OnPush, providers: [tuiFallbackValueProvider(0)], host: {
'[class._disabled]': 'disabled()',
'[class._readonly]': 'readOnly()',
'[class._active]': 'active',
'(keydown.capture)': 'onKeyDown($event)',
'(pointerdown)': 'onPointer(1)',
'(pointercancel)': 'onPointer(-1)',
'(document:pointerup)': 'onPointer(-1)',
}, template: "<input\n min=\"1\"\n type=\"range\"\n class=\"t-range\"\n [attr.aria-disabled]=\"readOnly()\"\n [disabled]=\"disabled()\"\n [max]=\"max\"\n [ngModel]=\"value()\"\n [ngModelOptions]=\"{standalone: true}\"\n (blur)=\"onTouched()\"\n (ngModelChange)=\"onChange($event)\"\n/>\n<div class=\"t-items\">\n <div\n *tuiRepeatTimes=\"let index of max\"\n class=\"t-item\"\n [class.t-item_active]=\"isActive(index)\"\n (pointerup)=\"onClick(max - index)\"\n >\n <tui-icon\n *polymorpheusOutlet=\"icon as src; context: {$implicit: max - index, value: value()}\"\n class=\"t-icon t-icon_blank\"\n [class.t-icon_fraction]=\"isFraction(index)\"\n [icon]=\"src.toString()\"\n [style.--t-cut.%]=\"100 - getCut(index)\"\n />\n <tui-icon\n *polymorpheusOutlet=\"icon as src; context: {$implicit: max - index, value: value()}\"\n class=\"t-icon\"\n [icon]=\"src.toString()\"\n [style.--t-cut.%]=\"getCut(index)\"\n />\n </div>\n</div>\n", styles: [":host{position:relative;display:block;inline-size:-webkit-fit-content;inline-size:-moz-fit-content;inline-size:fit-content;min-inline-size:-webkit-fit-content;min-inline-size:-moz-fit-content;min-inline-size:fit-content;font-size:1rem;color:var(--tui-chart-categorical-12);cursor:pointer;-webkit-user-select:none;user-select:none}:host._readonly{pointer-events:none}:host._disabled{pointer-events:none;opacity:var(--tui-disabled-opacity)}.t-range{position:absolute;top:0;left:0;inline-size:100%;block-size:100%;opacity:0;box-sizing:border-box;padding:0 .75em;pointer-events:none}.t-range:focus-visible+.t-items{box-shadow:inset 0 0 0 .125rem var(--tui-border-focus)}.t-items{position:relative;display:flex;flex-direction:row-reverse}.t-items:hover .t-icon{clip-path:inset(0 0 0 0)}.t-items:hover .t-icon_blank{clip-path:inset(0 0 0 100%)}.t-item{position:relative;flex:1 0 0;color:var(--tui-text-tertiary);transition-property:color,transform;transition-duration:var(--tui-duration);transition-timing-function:ease-in-out,cubic-bezier(.35,1.5,.4,2.5)}.t-item:first-child{max-inline-size:2.5em}.t-item:hover,.t-item:hover~.t-item,.t-items:not(:hover) .t-item_active{color:currentColor}.t-items:active .t-item:hover,.t-items:active .t-item:hover~.t-item{transform:scale(.85);transition-duration:var(--tui-duration),calc(var(--tui-duration) / 3);transition-timing-function:ease-in-out}.t-icon{transition-property:clip-path;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;inline-size:2.5em;block-size:2.5em;font-size:inherit;clip-path:inset(0 var(--t-cut) 0 0)}.t-icon ::ng-deep>*{font-size:1rem}.t-icon_blank{position:absolute;top:0;left:0;display:none;color:var(--tui-text-tertiary);clip-path:inset(0 0 0 var(--t-cut))}.t-icon_fraction{display:block}@media (any-pointer: coarse){:host._active .t-item_active{transform:scale(.85);transition-timing-function:ease-in-out}:host:not(._readonly) .t-range{pointer-events:auto}.t-icon{transition:none}}\n"] }]
}], propDecorators: { icon: [{
type: Input
}], max: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0aW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdC9jb21wb25lbnRzL3JhdGluZy9yYXRpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvcmF0aW5nL3JhdGluZy50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDckUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUcxRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQzs7O0FBRXBELE1Ba0JhLFNBQVUsU0FBUSxVQUFrQjtJQWxCakQ7O1FBbUJxQixZQUFPLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFNUMsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUdkLFNBQUksR0FBNkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFHbkQsUUFBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO0tBK0JqQztJQTdCYSxTQUFTLENBQUMsS0FBb0I7UUFDcEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDakIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQzFCO0lBQ0wsQ0FBQztJQUVTLFNBQVMsQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRVMsT0FBTyxDQUFDLEtBQWE7UUFDM0IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4QjtJQUNMLENBQUM7SUFFUyxRQUFRLENBQUMsS0FBYTtRQUM1QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDdkQsQ0FBQztJQUVTLFVBQVUsQ0FBQyxLQUFhO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDbEYsQ0FBQztJQUVTLE1BQU0sQ0FBQyxLQUFhO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDekIsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEQsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7K0dBdkNRLFNBQVM7bUdBQVQsU0FBUyxxWEFYUCxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLGlEQ3BCNUMsd2xDQWtDQSxvL0REbEJjLFlBQVksOEJBQUUsV0FBVyw2d0JBQUUsa0JBQWtCLDhIQUFFLE9BQU8scUZBQUUsY0FBYzs7U0FldkUsU0FBUzs0RkFBVCxTQUFTO2tCQWxCckIsU0FBUztpQ0FDTSxJQUFJLFlBQ04sWUFBWSxXQUNiLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLG1CQUdoRSx1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFDbEM7d0JBQ0YsbUJBQW1CLEVBQUUsWUFBWTt3QkFDakMsbUJBQW1CLEVBQUUsWUFBWTt3QkFDakMsaUJBQWlCLEVBQUUsUUFBUTt3QkFDM0IsbUJBQW1CLEVBQUUsbUJBQW1CO3dCQUN4QyxlQUFlLEVBQUUsY0FBYzt3QkFDL0IsaUJBQWlCLEVBQUUsZUFBZTt3QkFDbEMsc0JBQXNCLEVBQUUsZUFBZTtxQkFDMUM7OEJBUU0sSUFBSTtzQkFEVixLQUFLO2dCQUlDLEdBQUc7c0JBRFQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBpbmplY3QsIElucHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7VHVpQ29udHJvbH0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jbGFzc2VzJztcbmltcG9ydCB7VHVpUmVwZWF0VGltZXN9IGZyb20gJ0B0YWlnYS11aS9jZGsvZGlyZWN0aXZlcy9yZXBlYXQtdGltZXMnO1xuaW1wb3J0IHt0dWlGYWxsYmFja1ZhbHVlUHJvdmlkZXJ9IGZyb20gJ0B0YWlnYS11aS9jZGsvdG9rZW5zJztcbmltcG9ydCB7dHVpQ2xhbXB9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWF0aCc7XG5pbXBvcnQge1R1aUljb259IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvaWNvbic7XG5pbXBvcnQge1BvbHltb3JwaGV1c091dGxldH0gZnJvbSAnQHRhaWdhLXVpL3BvbHltb3JwaGV1cyc7XG5cbmltcG9ydCB0eXBlIHtUdWlSYXRpbmdPcHRpb25zfSBmcm9tICcuL3JhdGluZy5vcHRpb25zJztcbmltcG9ydCB7VFVJX1JBVElOR19PUFRJT05TfSBmcm9tICcuL3JhdGluZy5vcHRpb25zJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3R1aS1yYXRpbmcnLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBQb2x5bW9ycGhldXNPdXRsZXQsIFR1aUljb24sIFR1aVJlcGVhdFRpbWVzXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmF0aW5nLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3JhdGluZy5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbdHVpRmFsbGJhY2tWYWx1ZVByb3ZpZGVyKDApXSxcbiAgICBob3N0OiB7XG4gICAgICAgICdbY2xhc3MuX2Rpc2FibGVkXSc6ICdkaXNhYmxlZCgpJyxcbiAgICAgICAgJ1tjbGFzcy5fcmVhZG9ubHldJzogJ3JlYWRPbmx5KCknLFxuICAgICAgICAnW2NsYXNzLl9hY3RpdmVdJzogJ2FjdGl2ZScsXG4gICAgICAgICcoa2V5ZG93bi5jYXB0dXJlKSc6ICdvbktleURvd24oJGV2ZW50KScsXG4gICAgICAgICcocG9pbnRlcmRvd24pJzogJ29uUG9pbnRlcigxKScsXG4gICAgICAgICcocG9pbnRlcmNhbmNlbCknOiAnb25Qb2ludGVyKC0xKScsXG4gICAgICAgICcoZG9jdW1lbnQ6cG9pbnRlcnVwKSc6ICdvblBvaW50ZXIoLTEpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUdWlSYXRpbmcgZXh0ZW5kcyBUdWlDb250cm9sPG51bWJlcj4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucyA9IGluamVjdChUVUlfUkFUSU5HX09QVElPTlMpO1xuXG4gICAgcHJvdGVjdGVkIGFjdGl2ZSA9IDA7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpY29uOiBUdWlSYXRpbmdPcHRpb25zWydpY29uJ10gPSB0aGlzLm9wdGlvbnMuaWNvbjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1heCA9IHRoaXMub3B0aW9ucy5tYXg7XG5cbiAgICBwcm90ZWN0ZWQgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnJlYWRPbmx5KCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Qb2ludGVyKGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0dWlDbGFtcCh0aGlzLmFjdGl2ZSArIGRlbHRhLCAwLCAxKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25DbGljayh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNBY3RpdmUoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMudmFsdWUoKSkgPj0gdGhpcy5tYXggLSBpbmRleDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNGcmFjdGlvbihpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlKCkgPiB0aGlzLm1heCAtIGluZGV4IC0gMSAmJiB0aGlzLnZhbHVlKCkgPCB0aGlzLm1heCAtIGluZGV4O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRDdXQoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRnJhY3Rpb24oaW5kZXgpXG4gICAgICAgICAgICA/IDEwMCAqIE1hdGgubWF4KHRoaXMubWF4IC0gaW5kZXggLSB0aGlzLnZhbHVlKCksIDApXG4gICAgICAgICAgICA6IDA7XG4gICAgfVxufVxuIiwiPGlucHV0XG4gICAgbWluPVwiMVwiXG4gICAgdHlwZT1cInJhbmdlXCJcbiAgICBjbGFzcz1cInQtcmFuZ2VcIlxuICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwicmVhZE9ubHkoKVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgIFttYXhdPVwibWF4XCJcbiAgICBbbmdNb2RlbF09XCJ2YWx1ZSgpXCJcbiAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcbiAgICAoYmx1cik9XCJvblRvdWNoZWQoKVwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXG4vPlxuPGRpdiBjbGFzcz1cInQtaXRlbXNcIj5cbiAgICA8ZGl2XG4gICAgICAgICp0dWlSZXBlYXRUaW1lcz1cImxldCBpbmRleCBvZiBtYXhcIlxuICAgICAgICBjbGFzcz1cInQtaXRlbVwiXG4gICAgICAgIFtjbGFzcy50LWl0ZW1fYWN0aXZlXT1cImlzQWN0aXZlKGluZGV4KVwiXG4gICAgICAgIChwb2ludGVydXApPVwib25DbGljayhtYXggLSBpbmRleClcIlxuICAgID5cbiAgICAgICAgPHR1aS1pY29uXG4gICAgICAgICAgICAqcG9seW1vcnBoZXVzT3V0bGV0PVwiaWNvbiBhcyBzcmM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IG1heCAtIGluZGV4LCB2YWx1ZTogdmFsdWUoKX1cIlxuICAgICAgICAgICAgY2xhc3M9XCJ0LWljb24gdC1pY29uX2JsYW5rXCJcbiAgICAgICAgICAgIFtjbGFzcy50LWljb25fZnJhY3Rpb25dPVwiaXNGcmFjdGlvbihpbmRleClcIlxuICAgICAgICAgICAgW2ljb25dPVwic3JjLnRvU3RyaW5nKClcIlxuICAgICAgICAgICAgW3N0eWxlLi0tdC1jdXQuJV09XCIxMDAgLSBnZXRDdXQoaW5kZXgpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPHR1aS1pY29uXG4gICAgICAgICAgICAqcG9seW1vcnBoZXVzT3V0bGV0PVwiaWNvbiBhcyBzcmM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IG1heCAtIGluZGV4LCB2YWx1ZTogdmFsdWUoKX1cIlxuICAgICAgICAgICAgY2xhc3M9XCJ0LWljb25cIlxuICAgICAgICAgICAgW2ljb25dPVwic3JjLnRvU3RyaW5nKClcIlxuICAgICAgICAgICAgW3N0eWxlLi0tdC1jdXQuJV09XCJnZXRDdXQoaW5kZXgpXCJcbiAgICAgICAgLz5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19