@tangential/input-widgets
Version:
Input Widgets with persistable, dynamic configuration.
166 lines • 16.7 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/slide-toggle";
/**
* Provider Expression that allows this widget to register as a ControlValueAccessor.
* This allows it to support [(ngModel)].
* @docs-private
*/
export const TANJ_SLIDE_TOGGLE_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SlideToggleWidgetComponent),
multi: true
};
export class SlideToggleWidgetChange {
constructor(source, value) {
this.source = source;
this.value = value;
}
}
export class SlideToggleWidgetComponent {
constructor(changeDetectorRef) {
this.changeDetectorRef = changeDetectorRef;
// turn this into a class
this.flex = '';
this.flexLayout = 'column';
this.flexLayoutAlign = 'start';
this.value = false;
this.valueChange = new EventEmitter(false);
this.labelPosition = 'before';
this.disabled = false;
this.hideLabel = false;
this.onlyLabel = false;
/**
* Configuration Fields
*/
this.label = '';
this.defaultValue = 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() {
this.controlValueAccessorChangeFn(this.value);
this.change.emit(new SlideToggleWidgetChange(this, this.value));
}
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;
}
}
SlideToggleWidgetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: SlideToggleWidgetComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
SlideToggleWidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: SlideToggleWidgetComponent, selector: "tanj-slide-toggle-widget", inputs: { value: "value", labelPosition: "labelPosition", disabled: "disabled", hideLabel: "hideLabel", onlyLabel: "onlyLabel", label: "label", defaultValue: "defaultValue" }, outputs: { valueChange: "valueChange", change: "change" }, host: { properties: { "attr.flex": "this.flex", "attr.layout": "this.flexLayout", "attr.layout-align": "this.flexLayoutAlign" } }, providers: [TANJ_SLIDE_TOGGLE_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-slide-toggle-widget-label">{{label}}</span>
<div flex layout="column" layout-align="start center">
<div *ngIf="!onlyLabel"
class="tanj-widget-input"
layout="column"
layout-align="start">
<mat-slide-toggle flex
[disabled]="disabled"
[(ngModel)]="value"
(change)="handleValueChange(value)">
</mat-slide-toggle>
</div>
<div *ngIf="!hideLabel && labelPosition == 'below'" class="tanj-label tanj-below">{{label}}</div>
</div>
<span *ngIf="!hideLabel && labelPosition == 'after'" class="tanj-label tanj-slide-toggle-widget-label">{{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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: SlideToggleWidgetComponent, decorators: [{
type: Component,
args: [{
selector: 'tanj-slide-toggle-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-slide-toggle-widget-label">{{label}}</span>
<div flex layout="column" layout-align="start center">
<div *ngIf="!onlyLabel"
class="tanj-widget-input"
layout="column"
layout-align="start">
<mat-slide-toggle flex
[disabled]="disabled"
[(ngModel)]="value"
(change)="handleValueChange(value)">
</mat-slide-toggle>
</div>
<div *ngIf="!hideLabel && labelPosition == 'below'" class="tanj-label tanj-below">{{label}}</div>
</div>
<span *ngIf="!hideLabel && labelPosition == 'after'" class="tanj-label tanj-slide-toggle-widget-label">{{label}}</span>
</div>
`,
providers: [TANJ_SLIDE_TOGGLE_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
}], change: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUtdG9nZ2xlLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nZW50aWFsL2lucHV0LXdpZGdldHMvc3JjL2xpYi9zbGlkZS10b2dnbGUtd2lkZ2V0L3NsaWRlLXRvZ2dsZS13aWRnZXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFHTCxNQUFNLEVBQ04saUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBdUIsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN0RSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sa0JBQWtCLENBQUE7Ozs7O0FBRXRDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxvREFBb0QsR0FBUTtJQUN2RSxPQUFPLEVBQU0saUJBQWlCO0lBQzlCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMEJBQTBCLENBQUM7SUFDekQsS0FBSyxFQUFRLElBQUk7Q0FDbEIsQ0FBQztBQUVGLE1BQU0sT0FBTyx1QkFBdUI7SUFFbEMsWUFBbUIsTUFBa0MsRUFBUyxLQUFjO1FBQXpELFdBQU0sR0FBTixNQUFNLENBQTRCO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBUztJQUM1RSxDQUFDO0NBQ0Y7QUErQkQsTUFBTSxPQUFPLDBCQUEwQjtJQTZCckMsWUFBb0IsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUEzQnhELHlCQUF5QjtRQUNDLFNBQUksR0FBRyxFQUFFLENBQUM7UUFDUixlQUFVLEdBQUcsUUFBUSxDQUFDO1FBQ2hCLG9CQUFlLEdBQUcsT0FBTyxDQUFDO1FBSW5ELFVBQUssR0FBWSxLQUFLLENBQUE7UUFDckIsZ0JBQVcsR0FBMEIsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFN0Qsa0JBQWEsR0FBaUMsUUFBUSxDQUFBO1FBQ3RELGFBQVEsR0FBWSxLQUFLLENBQUE7UUFDekIsY0FBUyxHQUFZLEtBQUssQ0FBQTtRQUMxQixjQUFTLEdBQVksS0FBSyxDQUFBO1FBR25DOztXQUVHO1FBQ00sVUFBSyxHQUFXLEVBQUUsQ0FBQTtRQUNsQixpQkFBWSxHQUFZLEtBQUssQ0FBQTtRQUN0Qyw4QkFBOEI7UUFFcEIsV0FBTSxHQUFzQixJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUM3RCxjQUFTLEdBQWMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLGlDQUE0QixHQUF5QixDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRzVFLENBQUM7SUFHRCxRQUFRO1FBQ04sS0FBSyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQzdELENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7SUFDbEMsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQWM7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUE7WUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2pDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTtTQUN2QjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxlQUFlO1FBQ3JCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDakUsQ0FBQztJQUVNLFVBQVUsQ0FBQyxLQUFjO1FBQzlCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ3BCLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxFQUFPO1FBQzdCLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVNLGlCQUFpQixDQUFDLEVBQU87UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLFVBQW1CO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7O3dIQTNFVSwwQkFBMEI7NEdBQTFCLDBCQUEwQixpYUFIdEIsQ0FBQyxvREFBb0QsQ0FBQywrQ0F2QnREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQXNCQzs0RkFJTCwwQkFBMEI7a0JBNUJ0QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBTywwQkFBMEI7b0JBQ3pDLFFBQVEsRUFBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQkFzQkM7b0JBQ2hCLFNBQVMsRUFBTSxDQUFDLG9EQUFvRCxDQUFDO29CQUNyRSxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtpQkFDdEM7d0dBSTJCLElBQUk7c0JBQTdCLFdBQVc7dUJBQUMsV0FBVztnQkFDSSxVQUFVO3NCQUFyQyxXQUFXO3VCQUFDLGFBQWE7Z0JBQ1EsZUFBZTtzQkFBaEQsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBSXZCLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVFLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBTUcsS0FBSztzQkFBYixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0ksTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQge0hhY2tzfSBmcm9tICdAdGFuZ2VudGlhbC9jb3JlJ1xuXG4vKipcbiAqIFByb3ZpZGVyIEV4cHJlc3Npb24gdGhhdCBhbGxvd3MgdGhpcyB3aWRnZXQgdG8gcmVnaXN0ZXIgYXMgYSBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAqIFRoaXMgYWxsb3dzIGl0IHRvIHN1cHBvcnQgWyhuZ01vZGVsKV0uXG4gKiBAZG9jcy1wcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBUQU5KX1NMSURFX1RPR0dMRV9XSURHRVRfVklFV19DT05UUk9MX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XG4gIHByb3ZpZGU6ICAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2xpZGVUb2dnbGVXaWRnZXRDb21wb25lbnQpLFxuICBtdWx0aTogICAgICAgdHJ1ZVxufTtcblxuZXhwb3J0IGNsYXNzIFNsaWRlVG9nZ2xlV2lkZ2V0Q2hhbmdlIHtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc291cmNlOiBTbGlkZVRvZ2dsZVdpZGdldENvbXBvbmVudCwgcHVibGljIHZhbHVlOiBib29sZWFuKSB7XG4gIH1cbn1cblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICAgICAgJ3Rhbmotc2xpZGUtdG9nZ2xlLXdpZGdldCcsXG4gIHRlbXBsYXRlOiAgICAgIGA8IS0tIC0tPlxuICA8ZGl2IGZsZXggY2xhc3M9XCJ0YW5qLWlucHV0LXRlbXBsYXRlIHRhbmotbW9kZS1lZGl0XCJcbiAgICAgICBbbmdDbGFzc109XCJ7J3RhbmotZGlzYWJsZWQnOiBkaXNhYmxlZH1cIlxuICAgICAgIGxheW91dD1cInJvd1wiXG4gICAgICAgbGF5b3V0LWFsaWduPVwiY2VudGVyIGNlbnRlclwiPlxuICAgIDxzcGFuICpuZ0lmPVwiIWhpZGVMYWJlbCAmJiBsYWJlbFBvc2l0aW9uID09ICdiZWZvcmUnXCJcbiAgICAgICAgICBjbGFzcz1cInRhbmotbGFiZWwgdGFuai1zbGlkZS10b2dnbGUtd2lkZ2V0LWxhYmVsXCI+e3tsYWJlbH19PC9zcGFuPlxuICAgIDxkaXYgZmxleCBsYXlvdXQ9XCJjb2x1bW5cIiBsYXlvdXQtYWxpZ249XCJzdGFydCBjZW50ZXJcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhb25seUxhYmVsXCJcbiAgICAgICAgICAgY2xhc3M9XCJ0YW5qLXdpZGdldC1pbnB1dFwiXG4gICAgICAgICAgIGxheW91dD1cImNvbHVtblwiXG4gICAgICAgICAgIGxheW91dC1hbGlnbj1cInN0YXJ0XCI+XG4gICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIGZsZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlVmFsdWVDaGFuZ2UodmFsdWUpXCI+XG4gICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIiFoaWRlTGFiZWwgJiYgbGFiZWxQb3NpdGlvbiA9PSAnYmVsb3cnXCIgY2xhc3M9XCJ0YW5qLWxhYmVsIHRhbmotYmVsb3dcIj57e2xhYmVsfX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiAqbmdJZj1cIiFoaWRlTGFiZWwgJiYgbGFiZWxQb3NpdGlvbiA9PSAnYWZ0ZXInXCIgY2xhc3M9XCJ0YW5qLWxhYmVsIHRhbmotc2xpZGUtdG9nZ2xlLXdpZGdldC1sYWJlbFwiPnt7bGFiZWx9fTwvc3Bhbj5cbiAgPC9kaXY+XG4gICAgICAgICAgICAgICAgIGAsXG4gIHByb3ZpZGVyczogICAgIFtUQU5KX1NMSURFX1RPR0dMRV9XSURHRVRfVklFV19DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBTbGlkZVRvZ2dsZVdpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMsIE9uSW5pdCB7XG5cbiAgLy8gdHVybiB0aGlzIGludG8gYSBjbGFzc1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuZmxleCcpIGZsZXggPSAnJztcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmxheW91dCcpIGZsZXhMYXlvdXQgPSAnY29sdW1uJztcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmxheW91dC1hbGlnbicpIGZsZXhMYXlvdXRBbGlnbiA9ICdzdGFydCc7XG5cblxuXG4gIEBJbnB1dCgpIHZhbHVlOiBib29sZWFuID0gZmFsc2VcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuXG4gIEBJbnB1dCgpIGxhYmVsUG9zaXRpb246ICdiZWZvcmUnIHwgJ2FmdGVyJyB8ICdiZWxvdycgPSAnYmVmb3JlJ1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIGhpZGVMYWJlbDogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIG9ubHlMYWJlbDogYm9vbGVhbiA9IGZhbHNlXG5cblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBGaWVsZHNcbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJ1xuICBASW5wdXQoKSBkZWZhdWx0VmFsdWU6IGJvb2xlYW4gPSBmYWxzZVxuICAvKiBlbmQgQ29uZmlndXJhdGlvbiBGaWVsZHMgKi9cblxuICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG4gIG9uVG91Y2hlZDogKCkgPT4gYW55ID0gKCkgPT4geyB9O1xuICBwcml2YXRlIGNvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm46ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKHZhbHVlKSA9PiB7IH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgfVxuXG5cbiAgbmdPbkluaXQoKSB7XG4gICAgSGFja3MubWF0ZXJpYWxEZXNpZ25QbGFjZWhvbGRlclRleHQodGhpcy5jaGFuZ2VEZXRlY3RvclJlZilcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgfVxuXG4gIGhhbmRsZVZhbHVlQ2hhbmdlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKVxuICAgICAgdGhpcy5lbWl0Q2hhbmdlRXZlbnQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCb2lsZXJwbGF0ZSAvIHJlcXVpcmVkIGZvciBBbmd1bGFyXG4gICAqXG4gICAqL1xuICBwcml2YXRlIGVtaXRDaGFuZ2VFdmVudCgpIHtcbiAgICB0aGlzLmNvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4odGhpcy52YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdChuZXcgU2xpZGVUb2dnbGVXaWRnZXRDaGFuZ2UodGhpcywgdGhpcy52YWx1ZSkpXG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbiA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGlucHV0J3MgZGlzYWJsZWQgc3RhdGUuIEltcGxlbWVudGVkIGFzIGEgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgV2hldGhlciB0aGUgaW5wdXQgc2hvdWxkIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuXG59XG4iXX0=