@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
167 lines • 21.7 kB
JavaScript
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostBinding, HostListener, inject, Input, Output } from '@angular/core';
import { Subject } from 'rxjs';
import { distinctUntilChanged, skip, takeUntil } from 'rxjs/operators';
import { FocusIndicatorOriginService } from '../../directives/accessibility/index';
import { SidePanelAnimationState, sidePanelStateAnimation } from './side-panel-animations';
import { SidePanelService } from './side-panel.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/a11y";
import * as i2 from "../../directives/focus-if/focus-if.directive";
export class SidePanelComponent {
constructor() {
this.service = inject(SidePanelService);
this._elementRef = inject(ElementRef);
this._focusOrigin = inject(FocusIndicatorOriginService);
this.inline = false;
this.attachTo = 'window';
this.width = '50%';
this.top = '0';
this.modal = false;
this.animate = false;
this.closeOnExternalClick = false;
this.focusOnShow = false;
this.openChange = new EventEmitter();
this.closeOnEscape = true;
this.animationPanelState = SidePanelAnimationState.Closed;
this._onDestroy = new Subject();
}
get open() {
return this.service.open$.value;
}
set open(value) {
this.service.open$.next(value);
}
get position() {
if (this.inline) {
return 'static';
}
if (this.attachTo === 'container') {
return 'absolute';
}
return 'fixed';
}
get cssWidth() {
return this.getCssValue(this.width);
}
get cssTop() {
return this.getCssValue(this.top);
}
get cssMinWidth() {
return this.getCssValue(this.minWidth);
}
get cssMaxWidth() {
return this.getCssValue(this.maxWidth);
}
get componentWidth() {
if (this.inline) {
return this.open ? this.cssWidth : '0';
}
return null;
}
get hostWidth() {
return this.inline ? '100%' : this.cssWidth;
}
get hostMinWidth() {
return this.inline ? undefined : this.cssMinWidth;
}
get hostMaxWidth() {
return this.inline ? undefined : this.cssMaxWidth;
}
ngOnInit() {
this.service.open$.pipe(skip(1), distinctUntilChanged(), takeUntil(this._onDestroy))
.subscribe(isOpen => this.openChange.emit(isOpen));
this.service.open$.pipe(distinctUntilChanged(), takeUntil(this._onDestroy)).subscribe(isOpen => {
this.animationPanelState = isOpen
? this.animate
? SidePanelAnimationState.Open
: SidePanelAnimationState.OpenImmediate
: SidePanelAnimationState.Closed;
});
}
ngOnDestroy() {
this._onDestroy.next();
this._onDestroy.complete();
}
openPanel() {
this.service.open();
}
closePanel() {
this.service.close();
}
_onDocumentEscape() {
if (this.open && this.closeOnEscape) {
this._focusOrigin.setOrigin('keyboard');
this.closePanel();
}
}
_onDocumentClick(target) {
if (!this.open || !this.closeOnExternalClick) {
return;
}
if (!this._elementRef.nativeElement.contains(target) || (target && target.classList.contains('modal-backdrop'))) {
this.closePanel();
}
}
getCssValue(value) {
if (typeof value === 'number') {
return value === 0 ? '0' : value + 'px';
}
return value;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SidePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: SidePanelComponent, selector: "ux-side-panel", inputs: { open: "open", inline: "inline", attachTo: "attachTo", width: "width", minWidth: "minWidth", maxWidth: "maxWidth", top: "top", modal: "modal", animate: "animate", closeOnExternalClick: "closeOnExternalClick", focusOnShow: "focusOnShow", closeOnEscape: "closeOnEscape" }, outputs: { openChange: "openChange" }, host: { listeners: { "document:keyup.escape": "_onDocumentEscape()", "document:click": "_onDocumentClick($event.target)" }, properties: { "class.open": "this.open", "class.inline": "this.inline", "attr.aria-modal": "this.modal", "class.animate": "this.animate", "style.width": "this.componentWidth" }, classAttribute: "ux-side-panel" }, providers: [SidePanelService], exportAs: ["ux-side-panel"], ngImport: i0, template: "@if (modal && open) {\n <div class=\"modal-backdrop\"\n [style.position]=\"position\"\n [style.top]=\"cssTop\"></div>\n}\n\n@if (open) {\n <div class=\"ux-side-panel-host\"\n [class.modal-panel]=\"modal\"\n [style.position]=\"position\"\n [style.width]=\"hostWidth\"\n [style.min-width]=\"hostMinWidth\"\n [style.max-width]=\"hostMaxWidth\"\n [style.top]=\"cssTop\"\n [tabindex]=\"open ? 0 : -1\"\n [@panelState]=\"animationPanelState\"\n [focusIf]=\"open && focusOnShow\"\n [focusIfScroll]=\"false\"\n [cdkTrapFocus]=\"open && modal\"\n >\n <ng-content></ng-content>\n </div>\n}\n", dependencies: [{ kind: "directive", type: i1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i2.FocusIfDirective, selector: "[focusIf]", inputs: ["focusIfDelay", "focusIfScroll", "focusIf"] }], animations: [sidePanelStateAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SidePanelComponent, decorators: [{
type: Component,
args: [{ selector: 'ux-side-panel', exportAs: 'ux-side-panel', providers: [SidePanelService], animations: [sidePanelStateAnimation], changeDetection: ChangeDetectionStrategy.OnPush, host: {
class: 'ux-side-panel'
}, template: "@if (modal && open) {\n <div class=\"modal-backdrop\"\n [style.position]=\"position\"\n [style.top]=\"cssTop\"></div>\n}\n\n@if (open) {\n <div class=\"ux-side-panel-host\"\n [class.modal-panel]=\"modal\"\n [style.position]=\"position\"\n [style.width]=\"hostWidth\"\n [style.min-width]=\"hostMinWidth\"\n [style.max-width]=\"hostMaxWidth\"\n [style.top]=\"cssTop\"\n [tabindex]=\"open ? 0 : -1\"\n [@panelState]=\"animationPanelState\"\n [focusIf]=\"open && focusOnShow\"\n [focusIfScroll]=\"false\"\n [cdkTrapFocus]=\"open && modal\"\n >\n <ng-content></ng-content>\n </div>\n}\n" }]
}], propDecorators: { open: [{
type: Input
}, {
type: HostBinding,
args: ['class.open']
}], inline: [{
type: Input
}, {
type: HostBinding,
args: ['class.inline']
}], attachTo: [{
type: Input
}], width: [{
type: Input
}], minWidth: [{
type: Input
}], maxWidth: [{
type: Input
}], top: [{
type: Input
}], modal: [{
type: Input
}, {
type: HostBinding,
args: ['attr.aria-modal']
}], animate: [{
type: Input
}, {
type: HostBinding,
args: ['class.animate']
}], closeOnExternalClick: [{
type: Input
}], focusOnShow: [{
type: Input
}], openChange: [{
type: Output
}], closeOnEscape: [{
type: Input
}], componentWidth: [{
type: HostBinding,
args: ['style.width']
}], _onDocumentEscape: [{
type: HostListener,
args: ['document:keyup.escape']
}], _onDocumentClick: [{
type: HostListener,
args: ['document:click', ['$event.target']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZS1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zaWRlLXBhbmVsL3NpZGUtcGFuZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2lkZS1wYW5lbC9zaWRlLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbkYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFheEQsTUFBTSxPQUFPLGtCQUFrQjtJQVgvQjtRQVl1QixZQUFPLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFckMsZ0JBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFakMsaUJBQVksR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQWNwRSxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBR2YsYUFBUSxHQUEyQixRQUFRLENBQUM7UUFHNUMsVUFBSyxHQUFvQixLQUFLLENBQUM7UUFTL0IsUUFBRyxHQUFvQixHQUFHLENBQUM7UUFJM0IsVUFBSyxHQUFHLEtBQUssQ0FB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QUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBpbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc2tpcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRm9jdXNJbmRpY2F0b3JPcmlnaW5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9hY2Nlc3NpYmlsaXR5L2luZGV4JztcbmltcG9ydCB7IFNpZGVQYW5lbEFuaW1hdGlvblN0YXRlLCBzaWRlUGFuZWxTdGF0ZUFuaW1hdGlvbiB9IGZyb20gJy4vc2lkZS1wYW5lbC1hbmltYXRpb25zJztcbmltcG9ydCB7IFNpZGVQYW5lbFNlcnZpY2UgfSBmcm9tICcuL3NpZGUtcGFuZWwuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndXgtc2lkZS1wYW5lbCcsXG4gICAgZXhwb3J0QXM6ICd1eC1zaWRlLXBhbmVsJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3NpZGUtcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1NpZGVQYW5lbFNlcnZpY2VdLFxuICAgIGFuaW1hdGlvbnM6IFtzaWRlUGFuZWxTdGF0ZUFuaW1hdGlvbl0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaG9zdDoge1xuICAgICAgICBjbGFzczogJ3V4LXNpZGUtcGFuZWwnXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBTaWRlUGFuZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcnZpY2UgPSBpbmplY3QoU2lkZVBhbmVsU2VydmljZSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZm9jdXNPcmlnaW4gPSBpbmplY3QoRm9jdXNJbmRpY2F0b3JPcmlnaW5TZXJ2aWNlKTtcblxuICAgIEBJbnB1dCgpXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5vcGVuJylcbiAgICBnZXQgb3BlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5vcGVuJC52YWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgb3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNlcnZpY2Uub3BlbiQubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlubGluZScpXG4gICAgaW5saW5lID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIGF0dGFjaFRvOiAnd2luZG93JyB8ICdjb250YWluZXInID0gJ3dpbmRvdyc7XG5cbiAgICBASW5wdXQoKVxuICAgIHdpZHRoOiBzdHJpbmcgfCBudW1iZXIgPSAnNTAlJztcblxuICAgIEBJbnB1dCgpXG4gICAgbWluV2lkdGg6IHN0cmluZyB8IG51bWJlcjtcblxuICAgIEBJbnB1dCgpXG4gICAgbWF4V2lkdGg6IHN0cmluZyB8IG51bWJlcjtcblxuICAgIEBJbnB1dCgpXG4gICAgdG9wOiBzdHJpbmcgfCBudW1iZXIgPSAnMCc7XG5cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLW1vZGFsJylcbiAgICBtb2RhbCA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFuaW1hdGUnKVxuICAgIGFuaW1hdGUgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgY2xvc2VPbkV4dGVybmFsQ2xpY2sgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgZm9jdXNPblNob3c6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKVxuICAgIG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICBASW5wdXQoKVxuICAgIGNsb3NlT25Fc2NhcGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgZ2V0IHBvc2l0aW9uKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmlubGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICdzdGF0aWMnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF0dGFjaFRvID09PSAnY29udGFpbmVyJykge1xuICAgICAgICAgICAgcmV0dXJuICdhYnNvbHV0ZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdmaXhlZCc7XG4gICAgfVxuXG4gICAgZ2V0IGNzc1dpZHRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENzc1ZhbHVlKHRoaXMud2lkdGgpO1xuICAgIH1cblxuICAgIGdldCBjc3NUb3AoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3NzVmFsdWUodGhpcy50b3ApO1xuICAgIH1cblxuICAgIGdldCBjc3NNaW5XaWR0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDc3NWYWx1ZSh0aGlzLm1pbldpZHRoKTtcbiAgICB9XG5cbiAgICBnZXQgY3NzTWF4V2lkdGgoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3NzVmFsdWUodGhpcy5tYXhXaWR0aCk7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aCcpXG4gICAgZ2V0IGNvbXBvbmVudFdpZHRoKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmlubGluZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbiA/IHRoaXMuY3NzV2lkdGggOiAnMCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGhvc3RXaWR0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmxpbmUgPyAnMTAwJScgOiB0aGlzLmNzc1dpZHRoO1xuICAgIH1cblxuICAgIGdldCBob3N0TWluV2lkdGgoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5saW5lID8gdW5kZWZpbmVkIDogdGhpcy5jc3NNaW5XaWR0aDtcbiAgICB9XG5cbiAgICBnZXQgaG9zdE1heFdpZHRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmlubGluZSA/IHVuZGVmaW5lZCA6IHRoaXMuY3NzTWF4V2lkdGg7XG4gICAgfVxuXG4gICAgYW5pbWF0aW9uUGFuZWxTdGF0ZTogU2lkZVBhbmVsQW5pbWF0aW9uU3RhdGUgPSBTaWRlUGFuZWxBbmltYXRpb25TdGF0ZS5DbG9zZWQ7XG5cbiAgICBwcm90ZWN0ZWQgX29uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLnNlcnZpY2Uub3BlbiQucGlwZShza2lwKDEpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoaXNPcGVuID0+IHRoaXMub3BlbkNoYW5nZS5lbWl0KGlzT3BlbikpO1xuXG4gICAgICAgIHRoaXMuc2VydmljZS5vcGVuJC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoaXNPcGVuID0+IHtcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uUGFuZWxTdGF0ZSA9IGlzT3BlblxuICAgICAgICAgICAgICAgID8gdGhpcy5hbmltYXRlXG4gICAgICAgICAgICAgICAgICAgID8gU2lkZVBhbmVsQW5pbWF0aW9uU3RhdGUuT3BlblxuICAgICAgICAgICAgICAgICAgICA6IFNpZGVQYW5lbEFuaW1hdGlvblN0YXRlLk9wZW5JbW1lZGlhdGVcbiAgICAgICAgICAgICAgICA6IFNpZGVQYW5lbEFuaW1hdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveS5uZXh0KCk7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveS5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIG9wZW5QYW5lbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLm9wZW4oKTtcbiAgICB9XG5cbiAgICBjbG9zZVBhbmVsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cC5lc2NhcGUnKVxuICAgIF9vbkRvY3VtZW50RXNjYXBlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcGVuICYmIHRoaXMuY2xvc2VPbkVzY2FwZSkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNPcmlnaW4uc2V0T3JpZ2luKCdrZXlib2FyZCcpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKVxuICAgIF9vbkRvY3VtZW50Q2xpY2sodGFyZ2V0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMub3BlbiB8fCAhdGhpcy5jbG9zZU9uRXh0ZXJuYWxDbGljaykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSB8fCAodGFyZ2V0ICYmIHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ21vZGFsLWJhY2tkcm9wJykpKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q3NzVmFsdWUodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IDAgPyAnMCcgOiB2YWx1ZSArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cbiIsIkBpZiAobW9kYWwgJiYgb3Blbikge1xuICA8ZGl2IGNsYXNzPVwibW9kYWwtYmFja2Ryb3BcIlxuICAgIFtzdHlsZS5wb3NpdGlvbl09XCJwb3NpdGlvblwiXG4gIFtzdHlsZS50b3BdPVwiY3NzVG9wXCI+PC9kaXY+XG59XG5cbkBpZiAob3Blbikge1xuICA8ZGl2IGNsYXNzPVwidXgtc2lkZS1wYW5lbC1ob3N0XCJcbiAgICBbY2xhc3MubW9kYWwtcGFuZWxdPVwibW9kYWxcIlxuICAgIFtzdHlsZS5wb3NpdGlvbl09XCJwb3NpdGlvblwiXG4gICAgW3N0eWxlLndpZHRoXT1cImhvc3RXaWR0aFwiXG4gICAgW3N0eWxlLm1pbi13aWR0aF09XCJob3N0TWluV2lkdGhcIlxuICAgIFtzdHlsZS5tYXgtd2lkdGhdPVwiaG9zdE1heFdpZHRoXCJcbiAgICBbc3R5bGUudG9wXT1cImNzc1RvcFwiXG4gICAgW3RhYmluZGV4XT1cIm9wZW4gPyAwIDogLTFcIlxuICAgIFtAcGFuZWxTdGF0ZV09XCJhbmltYXRpb25QYW5lbFN0YXRlXCJcbiAgICBbZm9jdXNJZl09XCJvcGVuICYmIGZvY3VzT25TaG93XCJcbiAgICBbZm9jdXNJZlNjcm9sbF09XCJmYWxzZVwiXG4gICAgW2Nka1RyYXBGb2N1c109XCJvcGVuICYmIG1vZGFsXCJcbiAgICA+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbn1cbiJdfQ==