UNPKG

@vm721/ui-kit

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.1.1.

170 lines 27.4 kB
import { Directive, ElementRef, Renderer2, HostListener, Input } from '@angular/core'; import { PointerMapService } from "../../dev-ninja/services/pointer-map.service"; var ToggleModes; (function (ToggleModes) { ToggleModes["AUTO"] = "auto"; ToggleModes["OPEN"] = "open"; ToggleModes["CLOSE"] = "close"; })(ToggleModes || (ToggleModes = {})); var EventListenerModes; (function (EventListenerModes) { EventListenerModes["ADD"] = "add"; EventListenerModes["REMOVE"] = "remove"; })(EventListenerModes || (EventListenerModes = {})); var OriginSides; (function (OriginSides) { OriginSides["LEFT"] = "left"; OriginSides["RIGHT"] = "right"; })(OriginSides || (OriginSides = {})); export class DropdownDirective { constructor(dropdownElemRef, renderer, pointerMap) { this.dropdownElemRef = dropdownElemRef; this.renderer = renderer; this.pointerMap = pointerMap; this.dropdownOpen = false; this.DropdownOriginSide = OriginSides.LEFT; this.DropdownClass = 'dropdown'; this.DropdownContentClass = 'dropdown__content'; this.DropdownOpenClass = 'dropdown__content_--show'; this.DropdownLeftOriginClass = 'dropdown__content--left'; this.DropdownRightOriginClass = 'dropdown__content--right'; this.dropdownElem = this.dropdownElemRef.nativeElement; this.domEventListenerHandlersMap = this.pointerMap.create(true); } ngOnInit() { this.renderer.addClass(this.dropdownElem, this.DropdownClass); this.renderer.addClass(this.DropdownContentElemRef, this.DropdownContentClass); if (this.DropdownOriginSide === OriginSides.RIGHT) { this.renderer.addClass(this.DropdownContentElemRef, this.DropdownRightOriginClass); } else if (this.DropdownOriginSide === OriginSides.LEFT) { this.renderer.addClass(this.dropdownElem, this.DropdownLeftOriginClass); } else { console.warn("----- Dropdown Directive Setup Failed -----"); console.error('Error: DropdownDirective.DropdownOriginSide was not recognised.'); console.info(`Current OriginSide Set:${this.DropdownOriginSide}`, '\nAllowed OriginSides:', { [OriginSides.LEFT]: 'Will add the DropdownLeftOriginClass to DropdownContentElement. [DEFAULT (if not set)]', [OriginSides.RIGHT]: 'Will add the DropdownRightOriginClass to DropdownContentElement.' }); console.warn("----- ----- -----"); } } ngAfterViewInit() { this.dropdownContentElem = this.DropdownContentElemRef; this.dropdownOpen = this.dropdownContentElem.classList.contains(this.DropdownOpenClass); // console.log('The Elements', this.dropdownElem, this.dropdownContentElem); } ngOnDestroy() { PointerMapService.clear(this.domEventListenerHandlersMap); } onDropdownClick(event) { // console.log("Binded:", this.DropdownContentElemRef); // console.log('dropdown clicked on', event, this.dropdownElem, this.dropdownContentElem); this.toggleDropdown(); // console.log("EventListenerHandlers:", this.domEventListenerHandlers); } getContentElem(parent_elem) { for (let i = 0; i < parent_elem.children.length; i++) { if (parent_elem.children[i].classList.contains(this.DropdownContentClass)) { return parent_elem.children[i]; } } } OutsideClickHandler(thisArg, mode = EventListenerModes.ADD, EID) { let EventID; let clickOutsidetoCloseHandler; if (EID) { EventID = EID; clickOutsidetoCloseHandler = this.domEventListenerHandlersMap.getPointer(EID); } else { EventID = this.domEventListenerHandlersMap.createEmptyPointer(); clickOutsidetoCloseHandler = this.domEventListenerHandlersMap.useEmptyPointer(EventID, (ev) => { if (!thisArg.dropdownElem.contains(ev.target) && !thisArg.dropdownContentElem.contains(ev.target)) { console.log(EventID, "-->clicked outside:", this.dropdownElem, this.dropdownContentElem, ev.target, thisArg.dropdownElem.contains(ev.target), thisArg.dropdownContentElem.contains(ev.target)); thisArg.toggleDropdown(ToggleModes.CLOSE, EventID); } }); } console.log('OutsideClickHandler ->', mode, EventID, clickOutsidetoCloseHandler); if (mode === EventListenerModes.ADD) { document.addEventListener('click', clickOutsidetoCloseHandler[1]); } else if (mode === EventListenerModes.REMOVE) { document.removeEventListener('click', clickOutsidetoCloseHandler[1]); } } toggleDropdown(mode = ToggleModes.AUTO, EID) { if (mode !== ToggleModes.AUTO) { if (mode === ToggleModes.CLOSE) { //e.classList.remove('dropdown__content_--show'); //document.removeEventListener('click', closeOnClickOutsideHandler); this.renderer.removeClass(this.dropdownContentElem, this.DropdownOpenClass); // console.log("Dropdown closed!", this.dropdownElem, this.dropdownContentElem, this.DropdownContentElemRef.classList.contains(this.DropdownOpenClass)); this.OutsideClickHandler(this, EventListenerModes.REMOVE, EID); } else if (mode === ToggleModes.OPEN) { //e.classList.add('dropdown__content_--show'); //document.addEventListener('click', closeOnClickOutsideHandler); this.renderer.addClass(this.dropdownContentElem, this.DropdownOpenClass); // console.log("Dropdown Opened!", this.dropdownElem, this.dropdownContentElem, this.DropdownContentElemRef.classList.contains(this.DropdownOpenClass)); this.OutsideClickHandler(this, EventListenerModes.ADD); } else { console.warn("----- Dropdown Toggle Failed -----"); console.error('Error: DropdownDirective.toggleDropdown() was called with unrecognized mode.'); console.info(`Current Mode Passed:${mode}`, '\nAllowed Modes:', { [ToggleModes.AUTO]: 'Automatically determines dropdown state and toggles the state. [DEFAULT (if not passed)]', [ToggleModes.OPEN]: 'Sets Dropdown state to OPEN [--force].', [ToggleModes.CLOSE]: 'Sets Dropdown state to CLOSE [--force].' }); console.warn("----- ----- -----"); } } else { // console.log("----- Dropdown Toggle -----"); this.dropdownOpen = this.dropdownContentElem.classList.contains(this.DropdownOpenClass); // console.log("Dropdown open:", this.dropdownOpen); if (this.dropdownOpen) { // console.log("Closing Dropdown!"); this.toggleDropdown(ToggleModes.CLOSE); } else { // console.log("Opening Dropdown!"); this.toggleDropdown(ToggleModes.OPEN); } } this.dropdownOpen = this.dropdownContentElem.classList.contains(this.DropdownOpenClass); } isNode(o) { return (typeof Node === "object" ? o instanceof Node : o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName === "string"); } //Returns true if it is a DOM element isElement(o) { return (typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2 o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string"); } } DropdownDirective.decorators = [ { type: Directive, args: [{ selector: '[commonDropdown]' },] } ]; DropdownDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: PointerMapService } ]; DropdownDirective.propDecorators = { DropdownContentElemRef: [{ type: Input }], DropdownOriginSide: [{ type: Input }], DropdownClass: [{ type: Input }], DropdownContentClass: [{ type: Input }], DropdownOpenClass: [{ type: Input }], DropdownLeftOriginClass: [{ type: Input }], DropdownRightOriginClass: [{ type: Input }], onDropdownClick: [{ type: HostListener, args: ['click',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkta2l0L2NvbW1vbi9kaXJlY3RpdmVzL2Ryb3Bkb3duLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFHVixTQUFTLEVBQ1QsWUFBWSxFQUVaLEtBQUssRUFFTixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUlqRixJQUFLLFdBSUo7QUFKRCxXQUFLLFdBQVc7SUFDWiw0QkFBWSxDQUFBO0lBQ1osNEJBQVksQ0FBQTtJQUNaLDhCQUFjLENBQUE7QUFDbEIsQ0FBQyxFQUpJLFdBQVcsS0FBWCxXQUFXLFFBSWY7QUFFRCxJQUFLLGtCQUdKO0FBSEQsV0FBSyxrQkFBa0I7SUFDbkIsaUNBQVcsQ0FBQTtJQUNYLHVDQUFnQixDQUFBO0FBQ3BCLENBQUMsRUFISSxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBR3RCO0FBRUQsSUFBSyxXQUdKO0FBSEQsV0FBSyxXQUFXO0lBQ1osNEJBQVksQ0FBQTtJQUNaLDhCQUFjLENBQUE7QUFDbEIsQ0FBQyxFQUhJLFdBQVcsS0FBWCxXQUFXLFFBR2Y7QUFLRCxNQUFNLE9BQU8saUJBQWlCO0lBZ0IxQixZQUFvQixlQUEyQixFQUFVLFFBQW1CLEVBQVUsVUFBNkI7UUFBL0Ysb0JBQWUsR0FBZixlQUFlLENBQVk7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVUsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFibkgsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFFckIsdUJBQWtCLEdBQVcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUM5QyxrQkFBYSxHQUFXLFVBQVUsQ0FBQztRQUNuQyx5QkFBb0IsR0FBVyxtQkFBbUIsQ0FBQztRQUNuRCxzQkFBaUIsR0FBVywwQkFB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QyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxRQUFRLEtBQUcsUUFBUSxDQUNuRyxDQUFDO0lBQ04sQ0FBQzs7O1lBM0tKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsa0JBQWtCO2FBQy9COzs7WUFoQ0MsVUFBVTtZQUdWLFNBQVM7WUFPRixpQkFBaUI7OztxQ0EyQnJCLEtBQUs7aUNBQ0wsS0FBSzs0QkFDTCxLQUFLO21DQUNMLEtBQUs7Z0NBQ0wsS0FBSztzQ0FDTCxLQUFLO3VDQUNMLEtBQUs7OEJBK0NQLFlBQVksU0FBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBPbkluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIFJlbmRlcmVyMixcbiAgSG9zdExpc3RlbmVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUG9pbnRlck1hcFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vZGV2LW5pbmphL3NlcnZpY2VzL3BvaW50ZXItbWFwLnNlcnZpY2VcIjtcbmltcG9ydCB7IFBvaW50ZXJNYXAgfSBmcm9tIFwiLi4vLi4vZGV2LW5pbmphL3BvaW50ZXJNYXAvcG9pbnRlck1hcFwiO1xuXG5cbmVudW0gVG9nZ2xlTW9kZXN7XG4gICAgQVVUTz0gJ2F1dG8nLFxuICAgIE9QRU49ICdvcGVuJyxcbiAgICBDTE9TRT0gJ2Nsb3NlJ1xufVxuXG5lbnVtIEV2ZW50TGlzdGVuZXJNb2Rlc3tcbiAgICBBREQ9ICAnYWRkJyxcbiAgICBSRU1PVkU9ICdyZW1vdmUnXG59XG5cbmVudW0gT3JpZ2luU2lkZXMge1xuICAgIExFRlQ9ICdsZWZ0JyxcbiAgICBSSUdIVD0gJ3JpZ2h0J1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tjb21tb25Ecm9wZG93bl0nXG59KVxuZXhwb3J0IGNsYXNzIERyb3Bkb3duRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIGRyb3Bkb3duRWxlbTogSFRNTEVsZW1lbnQ7XG4gICAgZHJvcGRvd25Db250ZW50RWxlbTogRWxlbWVudDtcbiAgICBkcm9wZG93bk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBEcm9wZG93bkNvbnRlbnRFbGVtUmVmOiBIVE1MRWxlbWVudDtcbiAgICBASW5wdXQoKSBEcm9wZG93bk9yaWdpblNpZGU6IHN0cmluZyA9IE9yaWdpblNpZGVzLkxFRlQ7XG4gICAgQElucHV0KCkgRHJvcGRvd25DbGFzczogc3RyaW5nID0gJ2Ryb3Bkb3duJztcbiAgICBASW5wdXQoKSBEcm9wZG93bkNvbnRlbnRDbGFzczogc3RyaW5nID0gJ2Ryb3Bkb3duX19jb250ZW50JztcbiAgICBASW5wdXQoKSBEcm9wZG93bk9wZW5DbGFzczogc3RyaW5nID0gJ2Ryb3Bkb3duX19jb250ZW50Xy0tc2hvdyc7XG4gICAgQElucHV0KCkgRHJvcGRvd25MZWZ0T3JpZ2luQ2xhc3M6IHN0cmluZyA9ICdkcm9wZG93bl9fY29udGVudC0tbGVmdCc7XG4gICAgQElucHV0KCkgRHJvcGRvd25SaWdodE9yaWdpbkNsYXNzOiBzdHJpbmc9ICdkcm9wZG93bl9fY29udGVudC0tcmlnaHQnXG5cbiAgICBkb21FdmVudExpc3RlbmVySGFuZGxlcnNNYXA6IFBvaW50ZXJNYXA7XG5cblxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBkcm9wZG93bkVsZW1SZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBwb2ludGVyTWFwOiBQb2ludGVyTWFwU2VydmljZSkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duRWxlbSA9IHRoaXMuZHJvcGRvd25FbGVtUmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgdGhpcy5kb21FdmVudExpc3RlbmVySGFuZGxlcnNNYXAgPSB0aGlzLnBvaW50ZXJNYXAuY3JlYXRlKHRydWUpO1xuXG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRyb3Bkb3duRWxlbSwgdGhpcy5Ecm9wZG93bkNsYXNzKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLkRyb3Bkb3duQ29udGVudEVsZW1SZWYsIHRoaXMuRHJvcGRvd25Db250ZW50Q2xhc3MpO1xuXG4gICAgICAgIGlmKHRoaXMuRHJvcGRvd25PcmlnaW5TaWRlID09PSBPcmlnaW5TaWRlcy5SSUdIVCl7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuRHJvcGRvd25Db250ZW50RWxlbVJlZiwgdGhpcy5Ecm9wZG93blJpZ2h0T3JpZ2luQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodGhpcy5Ecm9wZG93bk9yaWdpblNpZGUgPT09IE9yaWdpblNpZGVzLkxFRlQpe1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRyb3Bkb3duRWxlbSwgdGhpcy5Ecm9wZG93bkxlZnRPcmlnaW5DbGFzcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIi0tLS0tIERyb3Bkb3duIERpcmVjdGl2ZSBTZXR1cCBGYWlsZWQgLS0tLS1cIik7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogRHJvcGRvd25EaXJlY3RpdmUuRHJvcGRvd25PcmlnaW5TaWRlIHdhcyBub3QgcmVjb2duaXNlZC4nKVxuICAgICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgICAgIGBDdXJyZW50IE9yaWdpblNpZGUgU2V0OiR7dGhpcy5Ecm9wZG93bk9yaWdpblNpZGV9YCxcbiAgICAgICAgICAgICAgICAnXFxuQWxsb3dlZCBPcmlnaW5TaWRlczonLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgW09yaWdpblNpZGVzLkxFRlRdOiAnV2lsbCBhZGQgdGhlIERyb3Bkb3duTGVmdE9yaWdpbkNsYXNzIHRvIERyb3Bkb3duQ29udGVudEVsZW1lbnQuIFtERUZBVUxUIChpZiBub3Qgc2V0KV0nLFxuICAgICAgICAgICAgICAgICAgICBbT3JpZ2luU2lkZXMuUklHSFRdOiAnV2lsbCBhZGQgdGhlIERyb3Bkb3duUmlnaHRPcmlnaW5DbGFzcyB0byBEcm9wZG93bkNvbnRlbnRFbGVtZW50LidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiLS0tLS0gLS0tLS0gLS0tLS1cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZHtcbiAgICAgICAgdGhpcy5kcm9wZG93bkNvbnRlbnRFbGVtPSB0aGlzLkRyb3Bkb3duQ29udGVudEVsZW1SZWY7XG4gICAgICAgIHRoaXMuZHJvcGRvd25PcGVuID0gdGhpcy5kcm9wZG93bkNvbnRlbnRFbGVtLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLkRyb3Bkb3duT3BlbkNsYXNzKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1RoZSBFbGVtZW50cycsIHRoaXMuZHJvcGRvd25FbGVtLCB0aGlzLmRyb3Bkb3duQ29udGVudEVsZW0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgUG9pbnRlck1hcFNlcnZpY2UuY2xlYXIodGhpcy5kb21FdmVudExpc3RlbmVySGFuZGxlcnNNYXApO1xuICAgIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycpIG9uRHJvcGRvd25DbGljayhldmVudDogRXZlbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJCaW5kZWQ6XCIsIHRoaXMuRHJvcGRvd25Db250ZW50RWxlbVJlZik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdkcm9wZG93biBjbGlja2VkIG9uJywgZXZlbnQsIHRoaXMuZHJvcGRvd25FbGVtLCB0aGlzLmRyb3Bkb3duQ29udGVudEVsZW0pO1xuICAgICAgICB0aGlzLnRvZ2dsZURyb3Bkb3duKCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRXZlbnRMaXN0ZW5lckhhbmRsZXJzOlwiLCB0aGlzLmRvbUV2ZW50TGlzdGVuZXJIYW5kbGVycyk7XG4gICAgfVxuXG4gICAgZ2V0Q29udGVudEVsZW0ocGFyZW50X2VsZW06IEhUTUxFbGVtZW50KTogRWxlbWVudHtcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHBhcmVudF9lbGVtLmNoaWxkcmVuLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGlmKHBhcmVudF9lbGVtLmNoaWxkcmVuW2ldLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLkRyb3Bkb3duQ29udGVudENsYXNzKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudF9lbGVtLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cblxuICAgIE91dHNpZGVDbGlja0hhbmRsZXIodGhpc0FyZzp0aGlzLCBtb2RlPUV2ZW50TGlzdGVuZXJNb2Rlcy5BREQsIEVJRD86c3RyaW5nKXtcblxuICAgICAgICBsZXQgRXZlbnRJRDogc3RyaW5nO1xuICAgICAgICBsZXQgY2xpY2tPdXRzaWRldG9DbG9zZUhhbmRsZXI6IGFueTtcbiAgICAgICAgaWYgKEVJRCl7XG4gICAgICAgICAgRXZlbnRJRCA9IEVJRDtcbiAgICAgICAgICBjbGlja091dHNpZGV0b0Nsb3NlSGFuZGxlciA9IHRoaXMuZG9tRXZlbnRMaXN0ZW5lckhhbmRsZXJzTWFwLmdldFBvaW50ZXIoRUlEKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgIEV2ZW50SUQgPSB0aGlzLmRvbUV2ZW50TGlzdGVuZXJIYW5kbGVyc01hcC5jcmVhdGVFbXB0eVBvaW50ZXIoKTtcbiAgICAgICAgICBjbGlja091dHNpZGV0b0Nsb3NlSGFuZGxlciA9IHRoaXMuZG9tRXZlbnRMaXN0ZW5lckhhbmRsZXJzTWFwLnVzZUVtcHR5UG9pbnRlciggRXZlbnRJRCxcbiAgICAgICAgICAgIChldjogRXZlbnQpID0+IHtcblxuICAgICAgICAgICAgICBpZighdGhpc0FyZy5kcm9wZG93bkVsZW0uY29udGFpbnMoZXYudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSAmJiAhdGhpc0FyZy5kcm9wZG93bkNvbnRlbnRFbGVtLmNvbnRhaW5zKGV2LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKEV2ZW50SUQsXCItLT5jbGlja2VkIG91dHNpZGU6XCIsIHRoaXMuZHJvcGRvd25FbGVtLCB0aGlzLmRyb3Bkb3duQ29udGVudEVsZW0sIGV2LnRhcmdldCwgdGhpc0FyZy5kcm9wZG93bkVsZW0uY29udGFpbnMoZXYudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSwgdGhpc0FyZy5kcm9wZG93bkNvbnRlbnRFbGVtLmNvbnRhaW5zKGV2LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpO1xuICAgICAgICAgICAgICAgIHRoaXNBcmcudG9nZ2xlRHJvcGRvd24oVG9nZ2xlTW9kZXMuQ0xPU0UsIEV2ZW50SUQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdPdXRzaWRlQ2xpY2tIYW5kbGVyIC0+JywgbW9kZSwgRXZlbnRJRCwgY2xpY2tPdXRzaWRldG9DbG9zZUhhbmRsZXIpO1xuXG4gICAgICAgIGlmKG1vZGUgPT09IEV2ZW50TGlzdGVuZXJNb2Rlcy5BREQpe1xuXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsaWNrT3V0c2lkZXRvQ2xvc2VIYW5kbGVyWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RlID09PSBFdmVudExpc3RlbmVyTW9kZXMuUkVNT1ZFKXtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xpY2tPdXRzaWRldG9DbG9zZUhhbmRsZXJbMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICB0b2dnbGVEcm9wZG93bihtb2RlOnN0cmluZz1Ub2dnbGVNb2Rlcy5BVVRPLCBFSUQ/OnN0cmluZyl7XG4gICAgICAgIGlmKG1vZGUgIT09IFRvZ2dsZU1vZGVzLkFVVE8pe1xuICAgICAgICAgICAgaWYobW9kZSA9PT0gVG9nZ2xlTW9kZXMuQ0xPU0Upe1xuICAgICAgICAgICAgICAgIC8vZS5jbGFzc0xpc3QucmVtb3ZlKCdkcm9wZG93bl9fY29udGVudF8tLXNob3cnKTtcbiAgICAgICAgICAgICAgICAvL2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VPbkNsaWNrT3V0c2lkZUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5kcm9wZG93bkNvbnRlbnRFbGVtLCB0aGlzLkRyb3Bkb3duT3BlbkNsYXNzKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRyb3Bkb3duIGNsb3NlZCFcIiwgdGhpcy5kcm9wZG93bkVsZW0sIHRoaXMuZHJvcGRvd25Db250ZW50RWxlbSwgdGhpcy5Ecm9wZG93bkNvbnRlbnRFbGVtUmVmLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLkRyb3Bkb3duT3BlbkNsYXNzKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5PdXRzaWRlQ2xpY2tIYW5kbGVyKHRoaXMsIEV2ZW50TGlzdGVuZXJNb2Rlcy5SRU1PVkUsIEVJRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKG1vZGUgPT09IFRvZ2dsZU1vZGVzLk9QRU4pe1xuICAgICAgICAgICAgICAgIC8vZS5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bl9fY29udGVudF8tLXNob3cnKTtcbiAgICAgICAgICAgICAgICAvL2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VPbkNsaWNrT3V0c2lkZUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kcm9wZG93bkNvbnRlbnRFbGVtLCB0aGlzLkRyb3Bkb3duT3BlbkNsYXNzKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRyb3Bkb3duIE9wZW5lZCFcIiwgdGhpcy5kcm9wZG93bkVsZW0sIHRoaXMuZHJvcGRvd25Db250ZW50RWxlbSwgdGhpcy5Ecm9wZG93bkNvbnRlbnRFbGVtUmVmLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLkRyb3Bkb3duT3BlbkNsYXNzKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5PdXRzaWRlQ2xpY2tIYW5kbGVyKHRoaXMsIEV2ZW50TGlzdGVuZXJNb2Rlcy5BREQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCItLS0tLSBEcm9wZG93biBUb2dnbGUgRmFpbGVkIC0tLS0tXCIpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBEcm9wZG93bkRpcmVjdGl2ZS50b2dnbGVEcm9wZG93bigpIHdhcyBjYWxsZWQgd2l0aCB1bnJlY29nbml6ZWQgbW9kZS4nKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYEN1cnJlbnQgTW9kZSBQYXNzZWQ6JHttb2RlfWAsXG4gICAgICAgICAgICAgICAgICAgICdcXG5BbGxvd2VkIE1vZGVzOicsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtUb2dnbGVNb2Rlcy5BVVRPXTogJ0F1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lcyBkcm9wZG93biBzdGF0ZSBhbmQgdG9nZ2xlcyB0aGUgc3RhdGUuIFtERUZBVUxUIChpZiBub3QgcGFzc2VkKV0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1RvZ2dsZU1vZGVzLk9QRU5dOiAnU2V0cyBEcm9wZG93biBzdGF0ZSB0byBPUEVOIFstLWZvcmNlXS4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1RvZ2dsZU1vZGVzLkNMT1NFXTogJ1NldHMgRHJvcGRvd24gc3RhdGUgdG8gQ0xPU0UgWy0tZm9yY2VdLidcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiLS0tLS0gLS0tLS0gLS0tLS1cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0gRHJvcGRvd24gVG9nZ2xlIC0tLS0tXCIpO1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bk9wZW4gPSB0aGlzLmRyb3Bkb3duQ29udGVudEVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKHRoaXMuRHJvcGRvd25PcGVuQ2xhc3MpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJEcm9wZG93biBvcGVuOlwiLCB0aGlzLmRyb3Bkb3duT3Blbik7XG4gICAgICAgICAgICBpZih0aGlzLmRyb3Bkb3duT3Blbil7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJDbG9zaW5nIERyb3Bkb3duIVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZURyb3Bkb3duKFRvZ2dsZU1vZGVzLkNMT1NFKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJPcGVuaW5nIERyb3Bkb3duIVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZURyb3Bkb3duKFRvZ2dsZU1vZGVzLk9QRU4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kcm9wZG93bk9wZW4gPSB0aGlzLmRyb3Bkb3duQ29udGVudEVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKHRoaXMuRHJvcGRvd25PcGVuQ2xhc3MpO1xuICAgIH1cblxuICAgIGlzTm9kZShvOiBhbnkpOiBib29sZWFue1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdHlwZW9mIE5vZGUgPT09IFwib2JqZWN0XCIgPyBvIGluc3RhbmNlb2YgTm9kZSA6XG4gICAgICAgICAgICAgICAgbyAmJiB0eXBlb2YgbyA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygby5ub2RlVHlwZSA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2Ygby5ub2RlTmFtZT09PVwic3RyaW5nXCJcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvL1JldHVybnMgdHJ1ZSBpZiBpdCBpcyBhIERPTSBlbGVtZW50XG4gICAgaXNFbGVtZW50KG86IGFueSk6IGJvb2xlYW57XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0eXBlb2YgSFRNTEVsZW1lbnQgPT09IFwib2JqZWN0XCIgPyBvIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgOiAvL0RPTTJcbiAgICAgICAgICAgICAgICBvICYmIHR5cGVvZiBvID09PSBcIm9iamVjdFwiICYmIG8gIT09IG51bGwgJiYgby5ub2RlVHlwZSA9PT0gMSAmJiB0eXBlb2Ygby5ub2RlTmFtZT09PVwic3RyaW5nXCJcbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiJdfQ==