@tangential/input-widgets
Version:
Input Widgets with persistable, dynamic configuration.
220 lines • 21.9 kB
JavaScript
import { ChangeDetectorRef, Component, EventEmitter, forwardRef, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Hacks } from '@tangential/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
import * as i3 from "@angular/material/form-field";
import * as i4 from "@angular/material/input";
import * as i5 from "@angular/material/slider";
/**
* Provider Expression that allows this widget to register as a ControlValueAccessor.
* This allows it to support [(ngModel)].
* @docs-private
*/
export const TANJ_NUMBER_SLIDER_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NumberSliderWidgetComponent), multi: true
};
export class NumberSliderWidgetChange {
constructor(source, value) {
this.source = source;
this.value = value;
}
}
export class NumberSliderWidgetComponent {
constructor(changeDetectorRef) {
this.changeDetectorRef = changeDetectorRef;
// turn this into a class
this.flex = '';
this.flexLayout = 'column';
this.flexLayoutAlign = 'start';
this.value = 0;
this.valueChange = new EventEmitter(false);
this.labelPosition = 'below';
this.disabled = false;
this.hideLabel = false;
this.onlyLabel = false;
/**
* Configuration Fields
*/
this.label = '';
this.defaultValue = 0;
this.max = 5;
this.min = 0;
this.step = 1;
this.decimalPlaces = 1;
this.tickInterval = 1;
this.vertical = false;
/* end Configuration Fields */
this.change = new EventEmitter(false);
this.onTouched = () => {
};
this.controlValueAccessorChangeFn = (value) => {
};
}
ngOnInit() {
Hacks.materialDesignPlaceholderText(this.changeDetectorRef);
}
ngOnChanges(changes) {
}
handleValueChange(value) {
if (!this.disabled) {
this.value = value;
this.valueChange.emit(this.value);
this.emitChangeEvent();
}
}
/**
* Boilerplate / required for Angular
*
*/
emitChangeEvent() {
const change = new NumberSliderWidgetChange(this, this.value);
this.controlValueAccessorChangeFn(this.value);
this.change.emit(change);
}
writeValue(value) {
this.value = value;
}
registerOnChange(fn) {
this.controlValueAccessorChangeFn = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* Sets the input's disabled state. Implemented as a part of ControlValueAccessor.
* @param isDisabled Whether the input should be disabled.
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
}
NumberSliderWidgetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: NumberSliderWidgetComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
NumberSliderWidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: NumberSliderWidgetComponent, selector: "tanj-number-slider-widget", inputs: { value: "value", labelPosition: "labelPosition", disabled: "disabled", hideLabel: "hideLabel", onlyLabel: "onlyLabel", label: "label", defaultValue: "defaultValue", max: "max", min: "min", step: "step", decimalPlaces: "decimalPlaces", tickInterval: "tickInterval", vertical: "vertical" }, outputs: { valueChange: "valueChange", change: "change" }, host: { properties: { "attr.flex": "this.flex", "attr.layout": "this.flexLayout", "attr.layout-align": "this.flexLayoutAlign" } }, providers: [TANJ_NUMBER_SLIDER_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR], usesOnChanges: true, ngImport: i0, template: `<!-- -->
<div flex class="tanj-input-template tanj-mode-edit"
[ngClass]="{'tanj-disabled': disabled}"
layout="row"
layout-align="center center">
<span *ngIf="!hideLabel && labelPosition == 'before'"
class="tanj-label tanj-before">{{label}}</span>
<div flex class="tanj-widget-input-container" layout="column" layout-align="start center">
<div flex *ngIf="!onlyLabel" class="tanj-widget-input" layout="row" layout-align="start">
<mat-slider flex
[disabled]="disabled"
[(ngModel)]="value"
(change)="valueChange.emit(value)"
[max]="max"
[min]="min"
[step]="step"
[thumbLabel]="true"
[tickInterval]="tickInterval"
[vertical]="vertical">
</mat-slider>
<mat-form-field flex="15"
class="tanj-number-slider-input-field tanj-widget-input"
dividerColor="accent"
layout="row"
layout-align="start">
<input flex
matInput
class="tanj-input"
type="number"
max="{{max}}"
[disabled]="disabled"
[step]="step"
(change)="valueChange.emit(value)"
[(ngModel)]="value"/>
</mat-form-field>
</div>
<span *ngIf="!hideLabel && labelPosition == 'below'" class="tanj-label tanj-below">{{label}}</span>
</div>
<span *ngIf="!hideLabel && labelPosition == 'after'" class="tanj-label tanj-after">{{label}}</span>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatSlider, selector: "mat-slider", inputs: ["disabled", "color", "tabIndex", "invert", "max", "min", "step", "thumbLabel", "tickInterval", "value", "displayWith", "valueText", "vertical"], outputs: ["change", "input", "valueChange"], exportAs: ["matSlider"] }], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: NumberSliderWidgetComponent, decorators: [{
type: Component,
args: [{
selector: 'tanj-number-slider-widget', template: `<!-- -->
<div flex class="tanj-input-template tanj-mode-edit"
[ngClass]="{'tanj-disabled': disabled}"
layout="row"
layout-align="center center">
<span *ngIf="!hideLabel && labelPosition == 'before'"
class="tanj-label tanj-before">{{label}}</span>
<div flex class="tanj-widget-input-container" layout="column" layout-align="start center">
<div flex *ngIf="!onlyLabel" class="tanj-widget-input" layout="row" layout-align="start">
<mat-slider flex
[disabled]="disabled"
[(ngModel)]="value"
(change)="valueChange.emit(value)"
[max]="max"
[min]="min"
[step]="step"
[thumbLabel]="true"
[tickInterval]="tickInterval"
[vertical]="vertical">
</mat-slider>
<mat-form-field flex="15"
class="tanj-number-slider-input-field tanj-widget-input"
dividerColor="accent"
layout="row"
layout-align="start">
<input flex
matInput
class="tanj-input"
type="number"
max="{{max}}"
[disabled]="disabled"
[step]="step"
(change)="valueChange.emit(value)"
[(ngModel)]="value"/>
</mat-form-field>
</div>
<span *ngIf="!hideLabel && labelPosition == 'below'" class="tanj-label tanj-below">{{label}}</span>
</div>
<span *ngIf="!hideLabel && labelPosition == 'after'" class="tanj-label tanj-after">{{label}}</span>
</div>
`, providers: [TANJ_NUMBER_SLIDER_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR], encapsulation: ViewEncapsulation.None
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { flex: [{
type: HostBinding,
args: ['attr.flex']
}], flexLayout: [{
type: HostBinding,
args: ['attr.layout']
}], flexLayoutAlign: [{
type: HostBinding,
args: ['attr.layout-align']
}], value: [{
type: Input
}], valueChange: [{
type: Output
}], labelPosition: [{
type: Input
}], disabled: [{
type: Input
}], hideLabel: [{
type: Input
}], onlyLabel: [{
type: Input
}], label: [{
type: Input
}], defaultValue: [{
type: Input
}], max: [{
type: Input
}], min: [{
type: Input
}], step: [{
type: Input
}], decimalPlaces: [{
type: Input
}], tickInterval: [{
type: Input
}], vertical: [{
type: Input
}], change: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLXNsaWRlci13aWRnZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ2VudGlhbC9pbnB1dC13aWRnZXRzL3NyYy9saWIvbnVtYmVyLXNsaWRlci13aWRnZXQvbnVtYmVyLXNsaWRlci13aWRnZXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLGlCQUFpQixFQUN4SSxNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQXVCLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUE7QUFDdEUsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGtCQUFrQixDQUFBOzs7Ozs7O0FBR3RDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxREFBcUQsR0FBUTtJQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJO0NBQ3BHLENBQUM7QUFFRixNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLFlBQW1CLE1BQW1DLEVBQVMsS0FBYTtRQUF6RCxXQUFNLEdBQU4sTUFBTSxDQUE2QjtRQUFTLFVBQUssR0FBTCxLQUFLLENBQVE7SUFDNUUsQ0FBQztDQUNGO0FBOENELE1BQU0sT0FBTywyQkFBMkI7SUFxQ3RDLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBbkN4RCx5QkFBeUI7UUFDQyxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsZUFBVSxHQUFHLFFBQVEsQ0FBQztRQUNoQixvQkFBZSxHQUFHLE9BQU8sQ0FBQztRQUduRCxVQUFLLEdBQVcsQ0FBQyxDQUFBO1FB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YTtzQkFBckIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFLRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFHSSxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7SGFja3N9IGZyb20gJ0B0YW5nZW50aWFsL2NvcmUnXG5cblxuLyoqXG4gKiBQcm92aWRlciBFeHByZXNzaW9uIHRoYXQgYWxsb3dzIHRoaXMgd2lkZ2V0IHRvIHJlZ2lzdGVyIGFzIGEgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gKiBUaGlzIGFsbG93cyBpdCB0byBzdXBwb3J0IFsobmdNb2RlbCldLlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgVEFOSl9OVU1CRVJfU0xJREVSX1dJREdFVF9WSUVXX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE51bWJlclNsaWRlcldpZGdldENvbXBvbmVudCksIG11bHRpOiB0cnVlXG59O1xuXG5leHBvcnQgY2xhc3MgTnVtYmVyU2xpZGVyV2lkZ2V0Q2hhbmdlIHtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc291cmNlOiBOdW1iZXJTbGlkZXJXaWRnZXRDb21wb25lbnQsIHB1YmxpYyB2YWx1ZTogbnVtYmVyKSB7XG4gIH1cbn1cblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YW5qLW51bWJlci1zbGlkZXItd2lkZ2V0JywgdGVtcGxhdGU6IGA8IS0tIC0tPlxuICA8ZGl2IGZsZXggY2xhc3M9XCJ0YW5qLWlucHV0LXRlbXBsYXRlIHRhbmotbW9kZS1lZGl0XCJcbiAgICAgICBbbmdDbGFzc109XCJ7J3RhbmotZGlzYWJsZWQnOiBkaXNhYmxlZH1cIlxuICAgICAgIGxheW91dD1cInJvd1wiXG4gICAgICAgbGF5b3V0LWFsaWduPVwiY2VudGVyIGNlbnRlclwiPlxuICAgIDxzcGFuICpuZ0lmPVwiIWhpZGVMYWJlbCAmJiBsYWJlbFBvc2l0aW9uID09ICdiZWZvcmUnXCJcbiAgICAgICAgICBjbGFzcz1cInRhbmotbGFiZWwgdGFuai1iZWZvcmVcIj57e2xhYmVsfX08L3NwYW4+XG4gICAgPGRpdiBmbGV4IGNsYXNzPVwidGFuai13aWRnZXQtaW5wdXQtY29udGFpbmVyXCIgbGF5b3V0PVwiY29sdW1uXCIgbGF5b3V0LWFsaWduPVwic3RhcnQgY2VudGVyXCI+XG4gICAgICA8ZGl2IGZsZXggKm5nSWY9XCIhb25seUxhYmVsXCIgY2xhc3M9XCJ0YW5qLXdpZGdldC1pbnB1dFwiIGxheW91dD1cInJvd1wiIGxheW91dC1hbGlnbj1cInN0YXJ0XCI+XG4gICAgICAgIDxtYXQtc2xpZGVyIGZsZXhcbiAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgIFttYXhdPVwibWF4XCJcbiAgICAgICAgICAgICAgICAgICBbbWluXT1cIm1pblwiXG4gICAgICAgICAgICAgICAgICAgW3N0ZXBdPVwic3RlcFwiXG4gICAgICAgICAgICAgICAgICAgW3RodW1iTGFiZWxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgW3RpY2tJbnRlcnZhbF09XCJ0aWNrSW50ZXJ2YWxcIlxuICAgICAgICAgICAgICAgICAgIFt2ZXJ0aWNhbF09XCJ2ZXJ0aWNhbFwiPlxuICAgICAgICA8L21hdC1zbGlkZXI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbGV4PVwiMTVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFuai1udW1iZXItc2xpZGVyLWlucHV0LWZpZWxkIHRhbmotd2lkZ2V0LWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpZGVyQ29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dD1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LWFsaWduPVwic3RhcnRcIj5cbiAgICAgICAgICA8aW5wdXQgZmxleFxuICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICBjbGFzcz1cInRhbmotaW5wdXRcIlxuICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgbWF4PVwie3ttYXh9fVwiXG4gICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gKm5nSWY9XCIhaGlkZUxhYmVsICYmIGxhYmVsUG9zaXRpb24gPT0gJ2JlbG93J1wiIGNsYXNzPVwidGFuai1sYWJlbCB0YW5qLWJlbG93XCI+e3tsYWJlbH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxzcGFuICpuZ0lmPVwiIWhpZGVMYWJlbCAmJiBsYWJlbFBvc2l0aW9uID09ICdhZnRlcidcIiBjbGFzcz1cInRhbmotbGFiZWwgdGFuai1hZnRlclwiPnt7bGFiZWx9fTwvc3Bhbj5cbiAgPC9kaXY+XG4gICAgICAgICAgICBgLCBwcm92aWRlcnM6IFtUQU5KX05VTUJFUl9TTElERVJfV0lER0VUX1ZJRVdfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl0sIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgTnVtYmVyU2xpZGVyV2lkZ2V0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcywgT25Jbml0IHtcblxuICAvLyB0dXJuIHRoaXMgaW50byBhIGNsYXNzXG4gIEBIb3N0QmluZGluZygnYXR0ci5mbGV4JykgZmxleCA9ICcnO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIubGF5b3V0JykgZmxleExheW91dCA9ICdjb2x1bW4nO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIubGF5b3V0LWFsaWduJykgZmxleExheW91dEFsaWduID0gJ3N0YXJ0JztcblxuXG4gIEBJbnB1dCgpIHZhbHVlOiBudW1iZXIgPSAwXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuXG4gIEBJbnB1dCgpIGxhYmVsUG9zaXRpb246ICdiZWZvcmUnIHwgJ2FmdGVyJyB8ICdiZWxvdycgPSAnYmVsb3cnXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2VcbiAgQElucHV0KCkgaGlkZUxhYmVsOiBib29sZWFuID0gZmFsc2VcbiAgQElucHV0KCkgb25seUxhYmVsOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBGaWVsZHNcbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJ1xuICBASW5wdXQoKSBkZWZhdWx0VmFsdWU6IG51bWJlciA9IDBcbiAgQElucHV0KCkgbWF4OiBudW1iZXIgPSA1XG4gIEBJbnB1dCgpIG1pbjogbnVtYmVyID0gMFxuICBASW5wdXQoKSBzdGVwOiBudW1iZXIgPSAxXG4gIEBJbnB1dCgpIGRlY2ltYWxQbGFjZXM6IG51bWJlciA9IDFcbiAgQElucHV0KCkgdGlja0ludGVydmFsOiBudW1iZXIgPSAxXG4gIEBJbnB1dCgpIHZlcnRpY2FsOiBib29sZWFuID0gZmFsc2VcbiAgLyogZW5kIENvbmZpZ3VyYXRpb24gRmllbGRzICovXG5cbiAgQE91dHB1dCgpIGNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuXG4gIG9uVG91Y2hlZDogKCkgPT4gYW55ID0gKCkgPT4ge1xuICB9O1xuICBwcml2YXRlIGNvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm46ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKHZhbHVlKSA9PiB7XG4gIH07XG5cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICB9XG5cblxuICBuZ09uSW5pdCgpIHtcbiAgICBIYWNrcy5tYXRlcmlhbERlc2lnblBsYWNlaG9sZGVyVGV4dCh0aGlzLmNoYW5nZURldGVjdG9yUmVmKVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICB9XG5cbiAgaGFuZGxlVmFsdWVDaGFuZ2UodmFsdWU6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSlcbiAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQm9pbGVycGxhdGUgLyByZXF1aXJlZCBmb3IgQW5ndWxhclxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlRXZlbnQoKSB7XG4gICAgY29uc3QgY2hhbmdlID0gbmV3IE51bWJlclNsaWRlcldpZGdldENoYW5nZSh0aGlzLCB0aGlzLnZhbHVlKVxuICAgIHRoaXMuY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbih0aGlzLnZhbHVlKTtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KGNoYW5nZSlcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4gPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbnB1dCdzIGRpc2FibGVkIHN0YXRlLiBJbXBsZW1lbnRlZCBhcyBhIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAqIEBwYXJhbSBpc0Rpc2FibGVkIFdoZXRoZXIgdGhlIGlucHV0IHNob3VsZCBiZSBkaXNhYmxlZC5cbiAgICovXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG59XG4iXX0=