ngrx-forms
Version:
Proper integration of forms in Angular 4 applications using ngrx
160 lines • 21.2 kB
JavaScript
import { Directive, forwardRef, Host, HostListener, Input, Optional, } from '@angular/core';
import { NGRX_FORM_VIEW_ADAPTER } from './view-adapter';
import * as i0 from "@angular/core";
// tslint:disable:directive-class-suffix
export class NgrxSelectMultipleViewAdapter {
constructor(renderer, elementRef) {
this.renderer = renderer;
this.elementRef = elementRef;
this.options = {};
this.optionValues = {};
this.idCounter = 0;
this.selectedIds = [];
this.nativeIdWasSet = false;
this.onChangeFn = () => void 0;
this.onTouched = () => void 0;
}
set ngrxFormControlState(value) {
if (!value) {
throw new Error('The control state must not be undefined!');
}
this.state = value;
const nativeId = this.elementRef.nativeElement.id;
const shouldSetNativeId = value.id !== nativeId && this.nativeIdWasSet;
if (shouldSetNativeId) {
this.renderer.setProperty(this.elementRef.nativeElement, 'id', value.id);
}
}
ngAfterViewInit() {
const nativeId = this.elementRef.nativeElement.id;
const shouldSetNativeId = this.state.id !== nativeId && !nativeId;
if (shouldSetNativeId) {
this.renderer.setProperty(this.elementRef.nativeElement, 'id', this.state.id);
this.nativeIdWasSet = true;
}
}
setViewValue(value) {
if (value === null) {
value = [];
}
if (!Array.isArray(value)) {
throw new Error(`the value provided to a NgrxSelectMultipleViewAdapter must be null or an array; got ${value} of type ${typeof value}`); // `
}
this.selectedIds = value.map(v => this.getOptionId(v)).filter(id => id !== null).map(id => id);
Object.keys(this.options).forEach(id => this.options[id].isSelected = this.selectedIds.indexOf(id) >= 0);
}
onChange() {
this.selectedIds = Object.keys(this.options).filter(id => this.options[id].isSelected);
const value = this.selectedIds.map(id => this.optionValues[id]);
this.onChangeFn(value);
}
setOnChangeCallback(fn) {
this.onChangeFn = fn;
}
setOnTouchedCallback(fn) {
this.onTouched = fn;
}
setIsDisabled(isDisabled) {
this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);
}
registerOption(option) {
const id = this.idCounter.toString();
this.options[id] = option;
this.idCounter += 1;
return id;
}
updateOptionValue(id, value) {
this.optionValues[id] = value;
if (this.selectedIds.indexOf(id) >= 0) {
this.onChange();
}
}
deregisterOption(id) {
delete this.options[id];
delete this.optionValues[id];
}
getOptionId(value) {
for (const id of Array.from(Object.keys(this.optionValues))) {
if (this.optionValues[id] === value) {
return id;
}
}
return null;
}
}
NgrxSelectMultipleViewAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgrxSelectMultipleViewAdapter, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
NgrxSelectMultipleViewAdapter.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.13", type: NgrxSelectMultipleViewAdapter, selector: "select[multiple][ngrxFormControlState]", inputs: { ngrxFormControlState: "ngrxFormControlState" }, host: { listeners: { "blur": "onTouched()", "change": "onChange()" } }, providers: [{
provide: NGRX_FORM_VIEW_ADAPTER,
useExisting: forwardRef(() => NgrxSelectMultipleViewAdapter),
multi: true,
}], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgrxSelectMultipleViewAdapter, decorators: [{
type: Directive,
args: [{
// tslint:disable-next-line:directive-selector
selector: 'select[multiple][ngrxFormControlState]',
providers: [{
provide: NGRX_FORM_VIEW_ADAPTER,
useExisting: forwardRef(() => NgrxSelectMultipleViewAdapter),
multi: true,
}],
}]
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { onTouched: [{
type: HostListener,
args: ['blur']
}], ngrxFormControlState: [{
type: Input
}], onChange: [{
type: HostListener,
args: ['change']
}] } });
const NULL_VIEW_ADAPTER = {
registerOption: () => '',
deregisterOption: () => void 0,
updateOptionValue: () => void 0,
};
const NULL_RENDERER = {
setProperty: () => void 0,
};
export class NgrxSelectMultipleOption {
constructor(element, renderer, viewAdapter) {
this.element = element;
this.renderer = renderer;
this.viewAdapter = viewAdapter;
this.renderer = viewAdapter ? renderer : NULL_RENDERER;
this.viewAdapter = viewAdapter || NULL_VIEW_ADAPTER;
this.id = this.viewAdapter.registerOption(this);
}
set value(value) {
this.viewAdapter.updateOptionValue(this.id, value);
}
set isSelected(selected) {
this.renderer.setProperty(this.element.nativeElement, 'selected', selected);
}
get isSelected() {
return this.element.nativeElement.selected;
}
ngOnInit() {
this.renderer.setProperty(this.element.nativeElement, 'value', this.id);
}
ngOnDestroy() {
this.viewAdapter.deregisterOption(this.id);
}
}
NgrxSelectMultipleOption.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgrxSelectMultipleOption, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: NgrxSelectMultipleViewAdapter, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
NgrxSelectMultipleOption.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.13", type: NgrxSelectMultipleOption, selector: "option", inputs: { value: "value" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgrxSelectMultipleOption, decorators: [{
type: Directive,
args: [{
// tslint:disable-next-line:directive-selector
selector: 'option',
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: NgrxSelectMultipleViewAdapter, decorators: [{
type: Host
}, {
type: Optional
}] }]; }, propDecorators: { value: [{
type: Input,
args: ['value']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LW11bHRpcGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3ZpZXctYWRhcHRlci9zZWxlY3QtbXVsdGlwbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxVQUFVLEVBQ1YsSUFBSSxFQUNKLFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBbUIsc0JBQXNCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFekUsd0NBQXdDO0FBV3hDLE1BQU0sT0FBTyw2QkFBNkI7SUEwQnhDLFlBQW9CLFFBQW1CLEVBQVUsVUFBc0I7UUFBbkQsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUFVLGVBQVUsR0FBVixVQUFVLENBQVk7UUF4Qi9ELFlBQU8sR0FBK0MsRUFBRSxDQUFDO1FBQ3pELGlCQUFZLEdBQTBCLEVBQUUsQ0FBQztRQUN6QyxjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFDM0IsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFL0IsZUFBVSxHQUF5QixHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUdoRCxjQUFTLEdBQWUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUE7SUFldUMsQ0FBQztJQWI1RSxJQUFhLG9CQUFvQixDQUFDLEtBQTRCO1FBQzVELElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7U0FDN0Q7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsRUFBRSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FB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QUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFtQyxDQUFDLFFBQVEsQ0FBQztJQUNwRSxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDOztzSEFoQ1Usd0JBQXdCLHFFQU1RLDZCQUE2QjswR0FON0Qsd0JBQXdCOzRGQUF4Qix3QkFBd0I7a0JBSnBDLFNBQVM7bUJBQUM7b0JBQ1QsOENBQThDO29CQUM5QyxRQUFRLEVBQUUsUUFBUTtpQkFDbkI7MkdBTzRDLDZCQUE2QjswQkFBckUsSUFBSTs7MEJBQUksUUFBUTs0Q0FRZixLQUFLO3NCQURSLEtBQUs7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBmb3J3YXJkUmVmLFxyXG4gIEhvc3QsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgUmVuZGVyZXIyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgRm9ybUNvbnRyb2xTdGF0ZSB9IGZyb20gJy4uL3N0YXRlJztcclxuaW1wb3J0IHsgRm9ybVZpZXdBZGFwdGVyLCBOR1JYX0ZPUk1fVklFV19BREFQVEVSIH0gZnJvbSAnLi92aWV3LWFkYXB0ZXInO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGU6ZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAnc2VsZWN0W211bHRpcGxlXVtuZ3J4Rm9ybUNvbnRyb2xTdGF0ZV0nLFxyXG4gIHByb3ZpZGVyczogW3tcclxuICAgIHByb3ZpZGU6IE5HUlhfRk9STV9WSUVXX0FEQVBURVIsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3J4U2VsZWN0TXVsdGlwbGVWaWV3QWRhcHRlciksXHJcbiAgICBtdWx0aTogdHJ1ZSxcclxuICB9XSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5ncnhTZWxlY3RNdWx0aXBsZVZpZXdBZGFwdGVyIGltcGxlbWVudHMgRm9ybVZpZXdBZGFwdGVyLCBBZnRlclZpZXdJbml0IHtcclxuICBwcml2YXRlIHN0YXRlOiBGb3JtQ29udHJvbFN0YXRlPGFueT47XHJcbiAgcHJpdmF0ZSBvcHRpb25zOiB7IFtpZDogc3RyaW5nXTogTmdyeFNlbGVjdE11bHRpcGxlT3B0aW9uIH0gPSB7fTtcclxuICBwcml2YXRlIG9wdGlvblZhbHVlczogeyBbaWQ6IHN0cmluZ106IGFueSB9ID0ge307XHJcbiAgcHJpdmF0ZSBpZENvdW50ZXIgPSAwO1xyXG4gIHByaXZhdGUgc2VsZWN0ZWRJZHM6IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBuYXRpdmVJZFdhc1NldCA9IGZhbHNlO1xyXG5cclxuICBvbkNoYW5nZUZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHZvaWQgMDtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpXHJcbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4gdm9pZCAwXHJcblxyXG4gIEBJbnB1dCgpIHNldCBuZ3J4Rm9ybUNvbnRyb2xTdGF0ZSh2YWx1ZTogRm9ybUNvbnRyb2xTdGF0ZTxhbnk+KSB7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNvbnRyb2wgc3RhdGUgbXVzdCBub3QgYmUgdW5kZWZpbmVkIScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhdGUgPSB2YWx1ZTtcclxuICAgIGNvbnN0IG5hdGl2ZUlkID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuaWQ7XHJcbiAgICBjb25zdCBzaG91bGRTZXROYXRpdmVJZCA9IHZhbHVlLmlkICE9PSBuYXRpdmVJZCAmJiB0aGlzLm5hdGl2ZUlkV2FzU2V0O1xyXG4gICAgaWYgKHNob3VsZFNldE5hdGl2ZUlkKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdpZCcsIHZhbHVlLmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7IH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgY29uc3QgbmF0aXZlSWQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pZDtcclxuICAgIGNvbnN0IHNob3VsZFNldE5hdGl2ZUlkID0gdGhpcy5zdGF0ZS5pZCAhPT0gbmF0aXZlSWQgJiYgIW5hdGl2ZUlkO1xyXG4gICAgaWYgKHNob3VsZFNldE5hdGl2ZUlkKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdpZCcsIHRoaXMuc3RhdGUuaWQpO1xyXG4gICAgICB0aGlzLm5hdGl2ZUlkV2FzU2V0ID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldFZpZXdWYWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgdmFsdWUgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdGhlIHZhbHVlIHByb3ZpZGVkIHRvIGEgTmdyeFNlbGVjdE11bHRpcGxlVmlld0FkYXB0ZXIgbXVzdCBiZSBudWxsIG9yIGFuIGFycmF5OyBnb3QgJHt2YWx1ZX0gb2YgdHlwZSAke3R5cGVvZiB2YWx1ZX1gKTsgLy8gYFxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRJZHMgPSB2YWx1ZS5tYXAodiA9PiB0aGlzLmdldE9wdGlvbklkKHYpKS5maWx0ZXIoaWQgPT4gaWQgIT09IG51bGwpLm1hcChpZCA9PiBpZCBhcyBzdHJpbmcpO1xyXG4gICAgT2JqZWN0LmtleXModGhpcy5vcHRpb25zKS5mb3JFYWNoKGlkID0+IHRoaXMub3B0aW9uc1tpZF0uaXNTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJZHMuaW5kZXhPZihpZCkgPj0gMCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnKVxyXG4gIG9uQ2hhbmdlKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IE9iamVjdC5rZXlzKHRoaXMub3B0aW9ucykuZmlsdGVyKGlkID0+IHRoaXMub3B0aW9uc1tpZF0uaXNTZWxlY3RlZCk7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRJZHMubWFwKGlkID0+IHRoaXMub3B0aW9uVmFsdWVzW2lkXSk7XHJcbiAgICB0aGlzLm9uQ2hhbmdlRm4odmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgc2V0T25DaGFuZ2VDYWxsYmFjayhmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpIHtcclxuICAgIHRoaXMub25DaGFuZ2VGbiA9IGZuO1xyXG4gIH1cclxuXHJcbiAgc2V0T25Ub3VjaGVkQ2FsbGJhY2soZm46ICgpID0+IHZvaWQpIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXRJc0Rpc2FibGVkKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPcHRpb24ob3B0aW9uOiBOZ3J4U2VsZWN0TXVsdGlwbGVPcHRpb24pIHtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5pZENvdW50ZXIudG9TdHJpbmcoKTtcclxuICAgIHRoaXMub3B0aW9uc1tpZF0gPSBvcHRpb247XHJcbiAgICB0aGlzLmlkQ291bnRlciArPSAxO1xyXG4gICAgcmV0dXJuIGlkO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlT3B0aW9uVmFsdWUoaWQ6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5vcHRpb25WYWx1ZXNbaWRdID0gdmFsdWU7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJZHMuaW5kZXhPZihpZCkgPj0gMCkge1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkZXJlZ2lzdGVyT3B0aW9uKGlkOiBzdHJpbmcpIHtcclxuICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNbaWRdO1xyXG4gICAgZGVsZXRlIHRoaXMub3B0aW9uVmFsdWVzW2lkXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T3B0aW9uSWQodmFsdWU6IGFueSkge1xyXG4gICAgZm9yIChjb25zdCBpZCBvZiBBcnJheS5mcm9tKE9iamVjdC5rZXlzKHRoaXMub3B0aW9uVmFsdWVzKSkpIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9uVmFsdWVzW2lkXSA9PT0gdmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IE5VTExfVklFV19BREFQVEVSOiBOZ3J4U2VsZWN0TXVsdGlwbGVWaWV3QWRhcHRlciA9IHtcclxuICByZWdpc3Rlck9wdGlvbjogKCkgPT4gJycsXHJcbiAgZGVyZWdpc3Rlck9wdGlvbjogKCkgPT4gdm9pZCAwLFxyXG4gIHVwZGF0ZU9wdGlvblZhbHVlOiAoKSA9PiB2b2lkIDAsXHJcbn0gYXMgYW55O1xyXG5cclxuY29uc3QgTlVMTF9SRU5ERVJFUjogUmVuZGVyZXIyID0ge1xyXG4gIHNldFByb3BlcnR5OiAoKSA9PiB2b2lkIDAsXHJcbn0gYXMgYW55O1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAnb3B0aW9uJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5ncnhTZWxlY3RNdWx0aXBsZU9wdGlvbiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBpZDogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIEBIb3N0KCkgQE9wdGlvbmFsKCkgcHJpdmF0ZSB2aWV3QWRhcHRlcjogTmdyeFNlbGVjdE11bHRpcGxlVmlld0FkYXB0ZXIsXHJcbiAgKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyID0gdmlld0FkYXB0ZXIgPyByZW5kZXJlciA6IE5VTExfUkVOREVSRVI7XHJcbiAgICB0aGlzLnZpZXdBZGFwdGVyID0gdmlld0FkYXB0ZXIgfHwgTlVMTF9WSUVXX0FEQVBURVI7XHJcbiAgICB0aGlzLmlkID0gdGhpcy52aWV3QWRhcHRlci5yZWdpc3Rlck9wdGlvbih0aGlzKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgndmFsdWUnKVxyXG4gIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLnZpZXdBZGFwdGVyLnVwZGF0ZU9wdGlvblZhbHVlKHRoaXMuaWQsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHNldCBpc1NlbGVjdGVkKHNlbGVjdGVkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnc2VsZWN0ZWQnLCBzZWxlY3RlZCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNTZWxlY3RlZCgpIHtcclxuICAgIHJldHVybiAodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTE9wdGlvbkVsZW1lbnQpLnNlbGVjdGVkO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB0aGlzLmlkKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy52aWV3QWRhcHRlci5kZXJlZ2lzdGVyT3B0aW9uKHRoaXMuaWQpO1xyXG4gIH1cclxufVxyXG4iXX0=