@bimeister/pupakit.kit
Version:
PupaKit is an open source collection of Angular components based on an atomic approach to building interfaces, which guarantees better performance and greater development flexibility.
120 lines • 18.4 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Directive, ElementRef, HostBinding, Inject, Input, NgZone, Optional, } from '@angular/core';
import '@bimeister/utilities';
import { BehaviorSubject, fromEvent, merge, Subscription } from 'rxjs';
import { switchMap, take } from 'rxjs/operators';
import '../../../declarations/classes/opened-dropdown.class';
import '../../../declarations/interfaces/dropdown-directive-params.interface';
import '../../../declarations/interfaces/dropdown-host.interface';
import '../components/dropdown-template/dropdown-template.component';
import { subscribeInsideAngular, subscribeOutsideAngular, ThemeService } from '@bimeister/pupakit.common';
import { DropdownsService } from '../../../services/dropdowns.service';
import { ThemeWrapperService } from '../../theme-wrapper/services/theme-wrapper.service';
import * as i0 from "@angular/core";
import * as i1 from "../../../services/dropdowns.service";
import * as i2 from "@bimeister/pupakit.common";
import * as i3 from "../../theme-wrapper/services/theme-wrapper.service";
const CURSOR_POINTER = 'pointer';
export class DropdownDirective {
constructor(triggerRef, dropdownsService, ngZone, themeService, document, themeWrapperService) {
this.triggerRef = triggerRef;
this.dropdownsService = dropdownsService;
this.ngZone = ngZone;
this.themeService = themeService;
this.document = document;
this.themeWrapperService = themeWrapperService;
this.pupaDropdownDisabled = false;
this.cursorStyle = CURSOR_POINTER;
this.opened$ = new BehaviorSubject(false);
this.theme$ = this.themeWrapperService?.theme$ ?? this.themeService.theme$;
this.subscription = new Subscription();
this.isTriggerTouched$ = new BehaviorSubject(false);
this.dropdown = null;
this.outsideTouchEventSubscription = null;
this.params = null;
}
ngAfterViewInit() {
this.subscription.add(this.handleTriggerClickEvents());
this.subscription.add(this.handleTriggerTouchEvents());
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
setDropdownParams(params) {
this.params = params;
}
open() {
if (this.params === null) {
throw new Error('[DropdownDirective] dropdownParams has not set. You can set *pupaDropdownTemplate on element');
}
if (this.pupaDropdownDisabled) {
return;
}
this.theme$
.pipe(take(1), switchMap((theme) => {
this.dropdown = this.dropdownsService.open({
target: this.pupaDropdownRealTriggerElement ?? this.triggerRef.nativeElement,
widthType: this.params.widthType,
horizontalPosition: this.params.horizontalPosition,
theme,
data: {
templateRef: this.params.templateRef,
},
});
this.opened$.next(true);
this.isTriggerTouched$.next(false);
this.outsideTouchEventSubscription = this.handleOutsideTriggerTouchEvents();
return this.dropdown.closed$;
}))
.subscribe(() => {
this.outsideTouchEventSubscription?.unsubscribe();
this.opened$.next(false);
this.dropdown = null;
});
}
close() {
this.dropdown?.close();
}
toggle() {
this.opened$
.pipe(take(1), subscribeInsideAngular(this.ngZone))
.subscribe((opened) => (opened ? this.close() : this.open()));
}
handleTriggerClickEvents() {
return fromEvent(this.triggerRef.nativeElement, 'click').subscribe(() => this.toggle());
}
handleTriggerTouchEvents() {
return merge(fromEvent(this.triggerRef.nativeElement, 'touchstart'), fromEvent(this.triggerRef.nativeElement, 'mousedown'))
.pipe(subscribeOutsideAngular(this.ngZone))
.subscribe(() => {
this.isTriggerTouched$.next(true);
});
}
handleOutsideTriggerTouchEvents() {
return merge(fromEvent(this.document, 'mousedown'), fromEvent(this.document, 'touchstart'))
.pipe(switchMap(() => this.isTriggerTouched$.pipe(take(1))), subscribeOutsideAngular(this.ngZone))
.subscribe((isTriggerTouched) => (isTriggerTouched ? this.isTriggerTouched$.next(false) : this.close()));
}
}
DropdownDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DropdownDirective, deps: [{ token: i0.ElementRef }, { token: i1.DropdownsService }, { token: i0.NgZone }, { token: i2.ThemeService }, { token: DOCUMENT }, { token: i3.ThemeWrapperService, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
DropdownDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: DropdownDirective, selector: "[pupaDropdown]", inputs: { pupaDropdownDisabled: "pupaDropdownDisabled", pupaDropdownRealTriggerElement: "pupaDropdownRealTriggerElement" }, host: { properties: { "style.cursor": "this.cursorStyle" } }, exportAs: ["pupaDropdown"], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DropdownDirective, decorators: [{
type: Directive,
args: [{
selector: '[pupaDropdown]',
exportAs: 'pupaDropdown',
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.DropdownsService }, { type: i0.NgZone }, { type: i2.ThemeService }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i3.ThemeWrapperService, decorators: [{
type: Optional
}] }]; }, propDecorators: { pupaDropdownDisabled: [{
type: Input
}], pupaDropdownRealTriggerElement: [{
type: Input
}], cursorStyle: [{
type: HostBinding,
args: ['style.cursor']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvZHJvcGRvd24vZGlyZWN0aXZlcy9kcm9wZG93bi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFFTixRQUFRLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBeUIsc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFjLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQStCLHFEQUFxRCxDQUFDO0FBQ3JGLE9BQXdDLHNFQUFzRSxDQUFDO0FBQy9HLE9BQTZCLDBEQUEwRCxDQUFDO0FBQ3hGLE9BQTBDLDZEQUE2RCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBUyxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7QUFFekYsTUFBTSxjQUFjLEdBQVcsU0FBUyxDQUFDO0FBTXpDLE1BQU0sT0FBTyxpQkFBaUI7SUFrQjVCLFlBQ2tCLFVBQW1DLEVBQ2xDLGdCQUFrQyxFQUNsQyxNQUFjLEVBQ2QsWUFBMEIsRUFDUixRQUFrQixFQUN4QixtQkFBeUM7UUFMdEQsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDbEMscUJBQWdCLEdBQWhCLGdCQUFn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QUFDLEVBQ3JELHVCQUF1QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDckM7YUFDQSxTQUFTLENBQUMsQ0FBQyxnQkFBeUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0SCxDQUFDOzsrR0E3R1UsaUJBQWlCLDhIQXVCbEIsUUFBUTttR0F2QlAsaUJBQWlCOzRGQUFqQixpQkFBaUI7a0JBSjdCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsUUFBUSxFQUFFLGNBQWM7aUJBQ3pCOzswQkF3QkksTUFBTTsyQkFBQyxRQUFROzswQkFDZixRQUFROzRDQXZCSyxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQ1UsOEJBQThCO3NCQUE3QyxLQUFLO2dCQUU4QixXQUFXO3NCQUE5QyxXQUFXO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnVsbGFibGUgfSBmcm9tICdAYmltZWlzdGVyL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb21FdmVudCwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT3BlbmVkRHJvcGRvd24gfSBmcm9tICcuLi8uLi8uLi9kZWNsYXJhdGlvbnMvY2xhc3Nlcy9vcGVuZWQtZHJvcGRvd24uY2xhc3MnO1xuaW1wb3J0IHsgRHJvcGRvd25EaXJlY3RpdmVQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9kZWNsYXJhdGlvbnMvaW50ZXJmYWNlcy9kcm9wZG93bi1kaXJlY3RpdmUtcGFyYW1zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcm9wZG93bkhvc3QgfSBmcm9tICcuLi8uLi8uLi9kZWNsYXJhdGlvbnMvaW50ZXJmYWNlcy9kcm9wZG93bi1ob3N0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcm9wZG93blRlbXBsYXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9kcm9wZG93bi10ZW1wbGF0ZS9kcm9wZG93bi10ZW1wbGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgc3Vic2NyaWJlSW5zaWRlQW5ndWxhciwgc3Vic2NyaWJlT3V0c2lkZUFuZ3VsYXIsIFRoZW1lLCBUaGVtZVNlcnZpY2UgfSBmcm9tICdAYmltZWlzdGVyL3B1cGFraXQuY29tbW9uJztcbmltcG9ydCB7IERyb3Bkb3duc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9kcm9wZG93bnMuc2VydmljZSc7XG5pbXBvcnQgeyBUaGVtZVdyYXBwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdGhlbWUtd3JhcHBlci9zZXJ2aWNlcy90aGVtZS13cmFwcGVyLnNlcnZpY2UnO1xuXG5jb25zdCBDVVJTT1JfUE9JTlRFUjogc3RyaW5nID0gJ3BvaW50ZXInO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbcHVwYURyb3Bkb3duXScsXG4gIGV4cG9ydEFzOiAncHVwYURyb3Bkb3duJyxcbn0pXG5leHBvcnQgY2xhc3MgRHJvcGRvd25EaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIERyb3Bkb3duSG9zdCB7XG4gIEBJbnB1dCgpIHB1YmxpYyBwdXBhRHJvcGRvd25EaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgcHVwYURyb3Bkb3duUmVhbFRyaWdnZXJFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5jdXJzb3InKSBwdWJsaWMgY3Vyc29yU3R5bGU6IHN0cmluZyA9IENVUlNPUl9QT0lOVEVSO1xuXG4gIHB1YmxpYyByZWFkb25seSBvcGVuZWQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHRoZW1lJDogT2JzZXJ2YWJsZTxUaGVtZT4gPSB0aGlzLnRoZW1lV3JhcHBlclNlcnZpY2U/LnRoZW1lJCA/PyB0aGlzLnRoZW1lU2VydmljZS50aGVtZSQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc1RyaWdnZXJUb3VjaGVkJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSBkcm9wZG93bjogTnVsbGFibGU8T3BlbmVkRHJvcGRvd24+ID0gbnVsbDtcbiAgcHJpdmF0ZSBvdXRzaWRlVG91Y2hFdmVudFN1YnNjcmlwdGlvbjogTnVsbGFibGU8U3Vic2NyaXB0aW9uPiA9IG51bGw7XG5cbiAgcHJpdmF0ZSBwYXJhbXM6IERyb3Bkb3duRGlyZWN0aXZlUGFyYW1zIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHRyaWdnZXJSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZHJvcGRvd25zU2VydmljZTogRHJvcGRvd25zU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2UsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSB0aGVtZVdyYXBwZXJTZXJ2aWNlPzogVGhlbWVXcmFwcGVyU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy5oYW5kbGVUcmlnZ2VyQ2xpY2tFdmVudHMoKSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuaGFuZGxlVHJpZ2dlclRvdWNoRXZlbnRzKCkpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RHJvcGRvd25QYXJhbXMocGFyYW1zOiBEcm9wZG93bkRpcmVjdGl2ZVBhcmFtcyk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICB9XG5cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFyYW1zID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tEcm9wZG93bkRpcmVjdGl2ZV0gZHJvcGRvd25QYXJhbXMgaGFzIG5vdCBzZXQuIFlvdSBjYW4gc2V0ICpwdXBhRHJvcGRvd25UZW1wbGF0ZSBvbiBlbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHVwYURyb3Bkb3duRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnRoZW1lJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgodGhlbWU6IFRoZW1lKSA9PiB7XG4gICAgICAgICAgdGhpcy5kcm9wZG93biA9IHRoaXMuZHJvcGRvd25zU2VydmljZS5vcGVuPERyb3Bkb3duVGVtcGxhdGVDb21wb25lbnQ8dW5rbm93bj4+KHtcbiAgICAgICAgICAgIHRhcmdldDogdGhpcy5wdXBhRHJvcGRvd25SZWFsVHJpZ2dlckVsZW1lbnQgPz8gdGhpcy50cmlnZ2VyUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICB3aWR0aFR5cGU6IHRoaXMucGFyYW1zLndpZHRoVHlwZSxcbiAgICAgICAgICAgIGhvcml6b250YWxQb3NpdGlvbjogdGhpcy5wYXJhbXMuaG9yaXpvbnRhbFBvc2l0aW9uLFxuICAgICAgICAgICAgdGhlbWUsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIHRlbXBsYXRlUmVmOiB0aGlzLnBhcmFtcy50ZW1wbGF0ZVJlZixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLm9wZW5lZCQubmV4dCh0cnVlKTtcbiAgICAgICAgICB0aGlzLmlzVHJpZ2dlclRvdWNoZWQkLm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMub3V0c2lkZVRvdWNoRXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmhhbmRsZU91dHNpZGVUcmlnZ2VyVG91Y2hFdmVudHMoKTtcblxuICAgICAgICAgIHJldHVybiB0aGlzLmRyb3Bkb3duLmNsb3NlZCQ7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5vdXRzaWRlVG91Y2hFdmVudFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5vcGVuZWQkLm5leHQoZmFsc2UpO1xuICAgICAgICB0aGlzLmRyb3Bkb3duID0gbnVsbDtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZHJvcGRvd24/LmNsb3NlKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMub3BlbmVkJFxuICAgICAgLnBpcGUodGFrZSgxKSwgc3Vic2NyaWJlSW5zaWRlQW5ndWxhcih0aGlzLm5nWm9uZSkpXG4gICAgICAuc3Vic2NyaWJlKChvcGVuZWQ6IGJvb2xlYW4pID0+IChvcGVuZWQgPyB0aGlzLmNsb3NlKCkgOiB0aGlzLm9wZW4oKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUcmlnZ2VyQ2xpY2tFdmVudHMoKTogU3Vic2NyaXB0aW9uIHtcbiAgICByZXR1cm4gZnJvbUV2ZW50KHRoaXMudHJpZ2dlclJlZi5uYXRpdmVFbGVtZW50LCAnY2xpY2snKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy50b2dnbGUoKSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRyaWdnZXJUb3VjaEV2ZW50cygpOiBTdWJzY3JpcHRpb24ge1xuICAgIHJldHVybiBtZXJnZShcbiAgICAgIGZyb21FdmVudCh0aGlzLnRyaWdnZXJSZWYubmF0aXZlRWxlbWVudCwgJ3RvdWNoc3RhcnQnKSxcbiAgICAgIGZyb21FdmVudCh0aGlzLnRyaWdnZXJSZWYubmF0aXZlRWxlbWVudCwgJ21vdXNlZG93bicpXG4gICAgKVxuICAgICAgLnBpcGUoc3Vic2NyaWJlT3V0c2lkZUFuZ3VsYXIodGhpcy5uZ1pvbmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNUcmlnZ2VyVG91Y2hlZCQubmV4dCh0cnVlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVPdXRzaWRlVHJpZ2dlclRvdWNoRXZlbnRzKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgcmV0dXJuIG1lcmdlKGZyb21FdmVudCh0aGlzLmRvY3VtZW50LCAnbW91c2Vkb3duJyksIGZyb21FdmVudCh0aGlzLmRvY3VtZW50LCAndG91Y2hzdGFydCcpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmlzVHJpZ2dlclRvdWNoZWQkLnBpcGUodGFrZSgxKSkpLFxuICAgICAgICBzdWJzY3JpYmVPdXRzaWRlQW5ndWxhcih0aGlzLm5nWm9uZSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGlzVHJpZ2dlclRvdWNoZWQ6IGJvb2xlYW4pID0+IChpc1RyaWdnZXJUb3VjaGVkID8gdGhpcy5pc1RyaWdnZXJUb3VjaGVkJC5uZXh0KGZhbHNlKSA6IHRoaXMuY2xvc2UoKSkpO1xuICB9XG59XG4iXX0=