UNPKG

@xui/components

Version:

xUI Components for Angular

84 lines 16.7 kB
import { __decorate, __metadata } from "tslib"; import { booleanAttribute, ChangeDetectionStrategy, Component, computed, effect, ElementRef, input, model, Optional, Self, signal } from '@angular/core'; import { NgControl } from '@angular/forms'; import { UntilDestroy } from '@ngneat/until-destroy'; import { XUI_SELECT_ACCESSOR } from './select.types'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@angular/common"; import * as i3 from "@angular/cdk/a11y"; import * as i4 from "@angular/cdk/overlay"; import * as i5 from "../icon/icon"; import * as i6 from "./option"; import * as i7 from "@ngx-translate/core"; let XuiSelect = class XuiSelect { get _width() { return this.elementRef.nativeElement.offsetWidth; } constructor(elementRef, control) { this.elementRef = elementRef; this.control = control; this._viewValue = signal(''); this._isOpened = signal(false); this._disabled = signal(false); this.value = model(null); this.placeholder = input(); this.color = input('light'); this.size = input('large'); this.items = input(); this.disabled = input(undefined, { transform: booleanAttribute }); this._styles = computed(() => { const ret = { 'x-select': true, 'x-select-disabled': this._disabled() }; ret[`x-select-${this.color()}`] = true; ret[`x-select-${this.size()}`] = true; return ret; }); if (this.control) { this.control.valueAccessor = this; } effect(() => this.disabled() && this._disabled.set(this.disabled()), { allowSignalWrites: true }); effect(() => this.value() != undefined && this.onChange?.(this.value())); } open() { this._isOpened.set(!this._disabled()); } close() { this._isOpened.set(false); } writeValue(source) { this.value.set(source); } registerOnChange(onChange) { this.onChange = onChange; } registerOnTouched(onTouched) { this._onTouched = onTouched; } setDisabledState(isDisabled) { this._disabled.set(isDisabled); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: XuiSelect, deps: [{ token: i0.ElementRef }, { token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.1", type: XuiSelect, selector: "xui-select", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { listeners: { "focusout": "_onTouched?.()" } }, providers: [{ provide: XUI_SELECT_ACCESSOR, useExisting: XuiSelect }], ngImport: i0, template: "<div\n [ngClass]=\"_styles()\"\n [tabindex]=\"_disabled() ? -1 : 0\"\n (click)=\"open()\"\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n (keydown.enter)=\"_isOpened.set(true)\"\n (keydown.space)=\"_isOpened.set(true)\"\n>\n {{ !_viewValue() ? placeholder() ?? '&nbsp;' : _viewValue() }}\n <xui-icon [icon]=\"_isOpened() ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></xui-icon>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n [cdkConnectedOverlayLockPosition]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent'\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"_isOpened()\"\n [cdkConnectedOverlayWidth]=\"_width\"\n (backdropClick)=\"_isOpened.set(false)\"\n (detach)=\"_isOpened.set(false)\"\n>\n <div class=\"x-select-options\" [tabindex]=\"0\" [cdkTrapFocus]=\"_isOpened()\" [cdkTrapFocusAutoCapture]=\"true\">\n @for (item of items(); track item.value) {\n <xui-option [value]=\"item.value\">{{ item.label | translate }}</xui-option>\n }\n <ng-content select=\"xui-option\" />\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i4.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: i5.XuiIcon, selector: "xui-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "icon"], exportAs: ["xuiIcon"] }, { kind: "component", type: i6.XuiOption, selector: "xui-option", inputs: ["value", "disabled"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } }; XuiSelect = __decorate([ UntilDestroy(), __metadata("design:paramtypes", [ElementRef, NgControl]) ], XuiSelect); export { XuiSelect }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: XuiSelect, decorators: [{ type: Component, args: [{ selector: 'xui-select', changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: XUI_SELECT_ACCESSOR, useExisting: XuiSelect }], host: { '(focusout)': '_onTouched?.()' }, template: "<div\n [ngClass]=\"_styles()\"\n [tabindex]=\"_disabled() ? -1 : 0\"\n (click)=\"open()\"\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n (keydown.enter)=\"_isOpened.set(true)\"\n (keydown.space)=\"_isOpened.set(true)\"\n>\n {{ !_viewValue() ? placeholder() ?? '&nbsp;' : _viewValue() }}\n <xui-icon [icon]=\"_isOpened() ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></xui-icon>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n [cdkConnectedOverlayLockPosition]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent'\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"_isOpened()\"\n [cdkConnectedOverlayWidth]=\"_width\"\n (backdropClick)=\"_isOpened.set(false)\"\n (detach)=\"_isOpened.set(false)\"\n>\n <div class=\"x-select-options\" [tabindex]=\"0\" [cdkTrapFocus]=\"_isOpened()\" [cdkTrapFocusAutoCapture]=\"true\">\n @for (item of items(); track item.value) {\n <xui-option [value]=\"item.value\">{{ item.label | translate }}</xui-option>\n }\n <ng-content select=\"xui-option\" />\n </div>\n</ng-template>\n" }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.NgControl, decorators: [{ type: Self }, { type: Optional }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy94dWkvc3JjL3NlbGVjdC9zZWxlY3QudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzL3h1aS9zcmMvc2VsZWN0L3NlbGVjdC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixVQUFVLEVBQ1YsS0FBSyxFQUNMLEtBQUssRUFDTCxRQUFRLEVBQ1IsSUFBSSxFQUNKLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQW9FLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQVloSCxJQUFNLFNBQVMsR0FBZixNQUFNLFNBQVM7SUE0QnBCLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO0lBQ25ELENBQUM7SUFFRCxZQUNVLFVBQXNCLEVBQ0gsT0FBbUI7UUFEdEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNILFlBQU8sR0FBUCxPQUFPLENBQVk7UUE5QmhELGVBQVUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsY0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixjQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFCLFVBQUssR0FBRyxLQUFLLENBQWMsSUFBSSxDQUFDLENBQUM7UUFDakMsZ0JBQVcsR0FBRyxLQUFLLEVBQVUsQ0FBQztRQUM5QixVQUFLLEdBQUcsS0FBSyxDQUFjLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLFNBQUksR0FBRyxLQUFLLENBQWEsT0FBTyxDQUFDLENBQUM7UUFDbEMsVUFBSyxHQUFHLEtBQUssRUFBZ0IsQ0FBQztRQUM5QixhQUFRLEdBQUcsS0FBSyxDQUF3QyxTQUFTLEVBQUU7WUFDakUsU0FBUyxFQUFFLGdCQUFnQjtTQUM1QixDQUFDLENBQUM7UUFFSCxZQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUN0QixNQUFNLEdBQUcsR0FBaUM7Z0JBQ3hDLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixtQkFBbUIsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFO2FBQ3RDLENBQUM7WUFFRixHQUFHLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUN2QyxHQUFHLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUN0QyxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUFDO1FBVUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3BDLENBQUM7UUFFRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUcsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNuRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRyxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsVUFBVSxDQUFDLE1BQW1CO1FBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUF1QztRQUN0RCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsU0FBcUI7UUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDOUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQW1CO1FBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7OEdBbEVVLFNBQVM7a0dBQVQsU0FBUyxtM0JBTFQsQ0FBQyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsMEJDdEJ2RSw0bUNBK0JBOztBREphLFNBQVM7SUFWckIsWUFBWSxFQUFFO3FDQTJDUyxVQUFVO1FBQ08sU0FBUztHQWxDckMsU0FBUyxDQW1FckI7OzJGQW5FWSxTQUFTO2tCQVRyQixTQUFTOytCQUNFLFlBQVksbUJBQ0wsdUJBQXVCLENBQUMsTUFBTSxhQUVwQyxDQUFDLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsV0FBVyxFQUFFLENBQUMsUUFDL0Q7d0JBQ0osWUFBWSxFQUFFLGdCQUFnQjtxQkFDL0I7OzBCQW9DRSxJQUFJOzswQkFBSSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBPcHRpb25hbCxcbiAgU2VsZixcbiAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFVudGlsRGVzdHJveSB9IGZyb20gJ0BuZ25lYXQvdW50aWwtZGVzdHJveSc7XG5pbXBvcnQgeyBYVUlfU0VMRUNUX0FDQ0VTU09SLCBTZWxlY3RBY2Nlc3NvciwgU2VsZWN0Q29sb3IsIFNlbGVjdEl0ZW0sIFNlbGVjdFNpemUsIFNlbGVjdFZhbHVlIH0gZnJvbSAnLi9zZWxlY3QudHlwZXMnO1xuXG5AVW50aWxEZXN0cm95KClcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3h1aS1zZWxlY3QnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGVVcmw6ICdzZWxlY3QuaHRtbCcsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogWFVJX1NFTEVDVF9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IFh1aVNlbGVjdCB9XSxcbiAgaG9zdDoge1xuICAgICcoZm9jdXNvdXQpJzogJ19vblRvdWNoZWQ/LigpJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIFh1aVNlbGVjdCBpbXBsZW1lbnRzIFNlbGVjdEFjY2Vzc29yLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByaXZhdGUgb25DaGFuZ2U/OiAoc291cmNlOiBTZWxlY3RWYWx1ZSkgPT4gdm9pZDtcbiAgX29uVG91Y2hlZD86ICgpID0+IHZvaWQ7XG5cbiAgX3ZpZXdWYWx1ZSA9IHNpZ25hbCgnJyk7XG4gIF9pc09wZW5lZCA9IHNpZ25hbChmYWxzZSk7XG4gIF9kaXNhYmxlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgdmFsdWUgPSBtb2RlbDxTZWxlY3RWYWx1ZT4obnVsbCk7XG4gIHBsYWNlaG9sZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICBjb2xvciA9IGlucHV0PFNlbGVjdENvbG9yPignbGlnaHQnKTtcbiAgc2l6ZSA9IGlucHV0PFNlbGVjdFNpemU+KCdsYXJnZScpO1xuICBpdGVtcyA9IGlucHV0PFNlbGVjdEl0ZW1bXT4oKTtcbiAgZGlzYWJsZWQgPSBpbnB1dDxib29sZWFuIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCBib29sZWFuPih1bmRlZmluZWQsIHtcbiAgICB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGVcbiAgfSk7XG5cbiAgX3N0eWxlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCByZXQ6IHsgW2tsYXNzOiBzdHJpbmddOiBib29sZWFuIH0gPSB7XG4gICAgICAneC1zZWxlY3QnOiB0cnVlLFxuICAgICAgJ3gtc2VsZWN0LWRpc2FibGVkJzogdGhpcy5fZGlzYWJsZWQoKVxuICAgIH07XG5cbiAgICByZXRbYHgtc2VsZWN0LSR7dGhpcy5jb2xvcigpfWBdID0gdHJ1ZTtcbiAgICByZXRbYHgtc2VsZWN0LSR7dGhpcy5zaXplKCl9YF0gPSB0cnVlO1xuICAgIHJldHVybiByZXQ7XG4gIH0pO1xuXG4gIGdldCBfd2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIEBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIGNvbnRyb2w/OiBOZ0NvbnRyb2xcbiAgKSB7XG4gICAgaWYgKHRoaXMuY29udHJvbCkge1xuICAgICAgdGhpcy5jb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICAgIH1cblxuICAgIGVmZmVjdCgoKSA9PiB0aGlzLmRpc2FibGVkKCkgJiYgdGhpcy5fZGlzYWJsZWQuc2V0KHRoaXMuZGlzYWJsZWQoKSEpLCB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0pO1xuICAgIGVmZmVjdCgoKSA9PiB0aGlzLnZhbHVlKCkgIT0gdW5kZWZpbmVkICYmIHRoaXMub25DaGFuZ2U/Lih0aGlzLnZhbHVlKCkhKSk7XG4gIH1cblxuICBvcGVuKCkge1xuICAgIHRoaXMuX2lzT3BlbmVkLnNldCghdGhpcy5fZGlzYWJsZWQoKSk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLl9pc09wZW5lZC5zZXQoZmFsc2UpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZShzb3VyY2U6IFNlbGVjdFZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZS5zZXQoc291cmNlKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6IChzb3VyY2U6IFNlbGVjdFZhbHVlKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5fb25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fZGlzYWJsZWQuc2V0KGlzRGlzYWJsZWQpO1xuICB9XG59XG4iLCI8ZGl2XG4gIFtuZ0NsYXNzXT1cIl9zdHlsZXMoKVwiXG4gIFt0YWJpbmRleF09XCJfZGlzYWJsZWQoKSA/IC0xIDogMFwiXG4gIChjbGljayk9XCJvcGVuKClcIlxuICBjZGtPdmVybGF5T3JpZ2luXG4gICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gIChrZXlkb3duLmVudGVyKT1cIl9pc09wZW5lZC5zZXQodHJ1ZSlcIlxuICAoa2V5ZG93bi5zcGFjZSk9XCJfaXNPcGVuZWQuc2V0KHRydWUpXCJcbj5cbiAge3sgIV92aWV3VmFsdWUoKSA/IHBsYWNlaG9sZGVyKCkgPz8gJyZuYnNwOycgOiBfdmlld1ZhbHVlKCkgfX1cbiAgPHh1aS1pY29uIFtpY29uXT1cIl9pc09wZW5lZCgpID8gJ2tleWJvYXJkX2Fycm93X3VwJyA6ICdrZXlib2FyZF9hcnJvd19kb3duJ1wiPjwveHVpLWljb24+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5TG9ja1Bvc2l0aW9uXT1cInRydWVcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3NdPVwiJ2Nkay1vdmVybGF5LXRyYW5zcGFyZW50J1wiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiX2lzT3BlbmVkKClcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheVdpZHRoXT1cIl93aWR0aFwiXG4gIChiYWNrZHJvcENsaWNrKT1cIl9pc09wZW5lZC5zZXQoZmFsc2UpXCJcbiAgKGRldGFjaCk9XCJfaXNPcGVuZWQuc2V0KGZhbHNlKVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJ4LXNlbGVjdC1vcHRpb25zXCIgW3RhYmluZGV4XT1cIjBcIiBbY2RrVHJhcEZvY3VzXT1cIl9pc09wZW5lZCgpXCIgW2Nka1RyYXBGb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIj5cbiAgICBAZm9yIChpdGVtIG9mIGl0ZW1zKCk7IHRyYWNrIGl0ZW0udmFsdWUpIHtcbiAgICAgIDx4dWktb3B0aW9uIFt2YWx1ZV09XCJpdGVtLnZhbHVlXCI+e3sgaXRlbS5sYWJlbCB8IHRyYW5zbGF0ZSB9fTwveHVpLW9wdGlvbj5cbiAgICB9XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwieHVpLW9wdGlvblwiIC8+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==