UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

640 lines (639 loc) 64.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Directive, ElementRef, Input, Output, ViewContainerRef, Type, ComponentFactoryResolver, EventEmitter } from '@angular/core'; import { NeedFocusService } from '../service/NeedFocusService.service'; import { ObservableManager } from '../service/ObservableManager.service'; import { EventUtils } from '../share/utils/EventUtils'; const /** @type {?} */ SUB_TOPIC_NAME = 'popover'; const /** @type {?} */ TOPIC_NAME_PREFIX = 'popover.'; const /** @type {?} */ SHOW_SUFFIX = 'show'; const /** @type {?} */ HIDE_SUFFIX = 'hide'; const /** @type {?} */ CMD_SUFFIX = 'cmd'; const /** @type {?} */ SHOW_TOPIC_NAME = TOPIC_NAME_PREFIX + SHOW_SUFFIX; const /** @type {?} */ HIDE_TOPIC_NAME = TOPIC_NAME_PREFIX + HIDE_SUFFIX; const /** @type {?} */ CMD_TOPIC_NAME = TOPIC_NAME_PREFIX + CMD_SUFFIX; export class PopoverDirective { /** * @param {?} el * @param {?} needFocusService * @param {?} target * @param {?} componentFactoryResolver * @param {?} observableMgr */ constructor(el, needFocusService, target, componentFactoryResolver, observableMgr) { this.el = el; this.target = target; this.componentFactoryResolver = componentFactoryResolver; this.observableMgr = observableMgr; this.needFocusService = needFocusService; this._active = false; this.onFocus = false; this.onChange = false; this.onMouseover = false; this.beforePopoverClick = new EventEmitter(); this.popoverClick = new EventEmitter(); this.beforePopoverActive = new EventEmitter(); this.popoverActive = new EventEmitter(); this.beforePopoverInactive = new EventEmitter(); this.popoverInactive = new EventEmitter(); this.showSubjects = []; this.hideSubjects = []; } /** * @param {?} subTopicName * @return {?} */ static getShowTopicName(subTopicName) { if (subTopicName === null || typeof subTopicName === 'undefined' || subTopicName === '') { return PopoverDirective.SHOW_TOPIC_NAME; } if (subTopicName.charAt(0) === '.') { subTopicName = subTopicName.substring(1); } if (subTopicName === '') { return PopoverDirective.SHOW_TOPIC_NAME; } if (subTopicName.charAt(subTopicName.length - 1) !== '.') { subTopicName += '.'; } return TOPIC_NAME_PREFIX + subTopicName + SHOW_SUFFIX; } /** * @param {?} subTopicName * @return {?} */ static getHideTopicName(subTopicName) { if (subTopicName === null || typeof subTopicName === 'undefined' || subTopicName === '') { return PopoverDirective.HIDE_TOPIC_NAME; } if (subTopicName.charAt(0) === '.') { subTopicName = subTopicName.substring(1); } if (subTopicName === '') { return PopoverDirective.HIDE_TOPIC_NAME; } if (subTopicName.charAt(subTopicName.length - 1) !== '.') { subTopicName += '.'; } return TOPIC_NAME_PREFIX + subTopicName + HIDE_SUFFIX; } /** * @param {?} subTopicName * @return {?} */ static getCmdTopicName(subTopicName) { if (subTopicName === null || typeof subTopicName === 'undefined' || subTopicName === '') { return PopoverDirective.CMD_TOPIC_NAME; } if (subTopicName.charAt(0) === '.') { subTopicName = subTopicName.substring(1); } if (subTopicName === '') { return PopoverDirective.CMD_TOPIC_NAME; } if (subTopicName.charAt(subTopicName.length - 1) !== '.') { subTopicName += '.'; } return TOPIC_NAME_PREFIX + subTopicName + CMD_SUFFIX; } /** * @param {?} showTopic * @param {?} hideTopic * @param {?} showCmdTopic * @return {?} */ initPopoverEventTopics(showTopic, hideTopic, showCmdTopic) { // Create change event observable topics if (showTopic !== null && typeof showTopic === 'string') { this.showSubjects.push(this.observableMgr.createSubject(showTopic)); } if (hideTopic !== null && typeof hideTopic === 'string') { this.hideSubjects.push(this.observableMgr.createSubject(hideTopic)); } // Subscribe on CMD topics if (showCmdTopic !== null && typeof showCmdTopic === 'string') { this.observableMgr.subscribe(showCmdTopic, (show) => { if (typeof show === 'boolean') { this._active = show; if (this._active) { $(this.el.nativeElement).addClass('active'); $(this.el.nativeElement).popover('show'); } else { $(this.el.nativeElement).removeClass('active'); $(this.el.nativeElement).popover('hide'); } } }); } } /** * @return {?} */ ngOnInit() { if (this.selector == null || this.selector === 'undefined') { this.selector = '.anchor'; } if (this.placement == null || this.placement === 'undefined' || this.placement === '') { this.placement = 'bottom'; } if (this.delay == null) { this.delay = 0; } if (this.autoFocus === null || this.autoFocus === undefined || typeof this.autoFocus !== 'boolean') { this.autoFocus = true; } $(this.el.nativeElement).append("<button type='button' class='fake'></button>"); this.initAutoFocus(); // obs // Init super class event topics this.initPopoverEventTopics(PopoverDirective.SHOW_TOPIC_NAME, PopoverDirective.HIDE_TOPIC_NAME, PopoverDirective.CMD_TOPIC_NAME); if (this.subTopicName !== null && this.subTopicName !== '' || typeof this.subTopicName !== 'undefined') { // Init sub topic event topics this.initPopoverEventTopics(PopoverDirective.getShowTopicName(this.subTopicName), PopoverDirective.getHideTopicName(this.subTopicName), PopoverDirective.getCmdTopicName(this.subTopicName)); } $(this.el.nativeElement).popover({ html: true, placement: this.placement, content: () => { return this.html; }, delay: this.delay }); $(this.el.nativeElement).on('click', ($event) => { $event.source = this; if (this.type != null && this.type != undefined) { if (!this.autoFocus) { this.doClick($event); } else { setTimeout(() => { this.doAppendComponent($event); }, this.delay); this.doActive(); } } else { if (this.autoFocus) { if (!this.onFocus) { $(this.el.nativeElement).find(".fake").focus(); $(this.el.nativeElement).popover('show'); } else { } } } }); if (this.type != null && this.type != undefined) { this.oldType = this.type; this.render(); this.comp = $(this.el.nativeElement).next().detach(); } this.onChange = true; } /** * @return {?} */ ngOnChanges() { if (this.onChange) { if (this.comp !== undefined && this.comp !== null) { this.hide(); } if (this.oldType !== this.type && this.type !== null && this.type !== undefined) { this.render(); this.comp = $(this.el.nativeElement).next().detach(); this.oldType = this.type; } } } /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ doClick($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforePopoverClick', $event, fireEvent, ($event) => { if (!this._active) { setTimeout(() => { this.doAppendComponent($event); }, this.delay); this.doActive(); } else { this.doInactive(); } }, ($event) => { // emitBeforeEvent this.emitBeforePopoverClickEvent($event); }, ($event, result) => { // emitAfterEvent this.emitPopoverClickEvent($event); }, ($event) => { // doPrevented }); } /** * @param {?} $event * @return {?} */ doAppendComponent($event) { let /** @type {?} */ popoverDiv = $(this.el.nativeElement).next(); let /** @type {?} */ popoverSelector = $(popoverDiv).find(this.selector); if (popoverSelector != null && popoverSelector !== 'undefined') { popoverSelector.append(this.comp); if (this.needFocusService) { this.needFocusService.setFocusingComponent(this.comp, $event); } if (this.autoFocus) { $(this.el.nativeElement).find(".fake").focus(); } } let /** @type {?} */ widthPopoverDiv = popoverDiv[0].offsetWidth; let /** @type {?} */ leftWrapperPopoverDiv = $(this.el.nativeElement).offset().left; let /** @type {?} */ widthWrapperPopoverDiv = $(this.el.nativeElement).outerWidth(); let /** @type {?} */ setLeft = leftWrapperPopoverDiv + (widthWrapperPopoverDiv / 2) - (widthPopoverDiv / 2); // auto remove positioning styles popoverDiv.css({ left: setLeft + 'px' }); // remove arrow positioning styles let /** @type {?} */ popoverArrowDiv = $(popoverDiv).find(".arrow"); popoverArrowDiv.css({ left: '' }); $(popoverDiv).on('mouseover', ($event) => { this.onMouseover = true; }); $(popoverDiv).on('mouseout', ($event) => { this.onMouseover = false; }); } /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ doActive($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforePopoverActive', $event, fireEvent, ($event) => { // doEvent this.show(); }, ($event) => { // emitBeforeEvent this.emitBeforePopoverClickEvent($event); }, ($event, result) => { // emitAfterEvent this.emitPopoverClickEvent($event); }, ($event) => { // doPrevented }); } /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ doInactive($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforePopoverInactive', $event, fireEvent, ($event) => { // doEvent this.hide(); }, ($event) => { // emitBeforeEvent this.emitBeforePopoverClickEvent($event); }, ($event, result) => { // emitAfterEvent this.emitPopoverClickEvent($event); }, ($event) => { // doPrevented }); } /** * @return {?} */ render() { const /** @type {?} */ simpleCompoFactory = this.componentFactoryResolver.resolveComponentFactory(this.type); this.target.createComponent(simpleCompoFactory); } /** * @return {?} */ initAutoFocus() { $(this.el.nativeElement).find(".fake").on('focusin', ($event) => { this.onFocus = true; }); $(this.el.nativeElement).find(".fake").on('blur', ($event) => { $event.source = this; this.doLostFocus($event); setTimeout(() => { this.onFocus = false; }, 300); }); } /** * @param {?} $event * @return {?} */ doLostFocus($event) { if (!this.onMouseover) { if (this.type != null || this.type != undefined) { if (this.needFocusService !== null && this.needFocusService.getFocusingComponent() === this.comp) { this.needFocusService.resetFocusingComponent(); this.hide(); } } else { $(this.el.nativeElement).popover('hide'); } } else { $(this.el.nativeElement).find(".fake").focus(); } } /** * @param {?} $event * @return {?} */ emitBeforePopoverClickEvent($event) { let /** @type {?} */ ev = EventUtils.newCustomEvent("beforePopoverClick", this, null, $event); this.beforePopoverClick.emit(ev); } /** * @param {?} $event * @return {?} */ emitPopoverClickEvent($event) { let /** @type {?} */ ev = EventUtils.newCustomEvent("popoverClick", this, null, $event); this.popoverClick.emit(ev); } /** * @param {?} $event * @return {?} */ emitBeforePopoverActiveEvent($event) { let /** @type {?} */ ev = EventUtils.newCustomEvent("beforePopoverActive", this, null, $event); this.beforePopoverActive.emit(ev); } /** * @param {?} $event * @return {?} */ emitPopoverActiveEvent($event) { let /** @type {?} */ ev = EventUtils.newCustomEvent("popoverActive", this, null, $event); this.popoverActive.emit(ev); } /** * @param {?} $event * @return {?} */ emitBeforePopoverInactiveEvent($event) { let /** @type {?} */ ev = EventUtils.newCustomEvent("beforePopoverInactive", this, null, $event); this.beforePopoverInactive.emit(ev); } /** * @param {?} $event * @return {?} */ emitPopoverInactiveEvent($event) { let /** @type {?} */ ev = EventUtils.newCustomEvent("popoverInactive", this, null, $event); this.popoverInactive.emit(ev); } /** * @return {?} */ get active() { return this._active; } /** * @param {?} placement * @return {?} */ setPlacement(placement) { this.placement = placement; } /** * @return {?} */ getPlacement() { return this.placement; } /** * @return {?} */ show() { this._active = true; $(this.el.nativeElement).addClass('active'); $(this.el.nativeElement).popover('show'); if (Array.isArray(this.showSubjects)) { // Emit change event this.showSubjects.forEach((obsv, idx) => { obsv.next(this); }); } } /** * @return {?} */ hide() { this._active = false; $(this.el.nativeElement).removeClass('active'); $(this.el.nativeElement).popover('hide'); if (Array.isArray(this.hideSubjects)) { // Emit change event this.hideSubjects.forEach((obsv, idx) => { obsv.next(this); this.onFocus = false; }); } } /** * @return {?} */ getBeforePopoverClicked() { return this.beforePopoverClick; } /** * @param {?} event * @return {?} */ setBeforePopoverClicked(event) { this.beforePopoverClick = event; } /** * @return {?} */ getPopoverClicked() { return this.popoverClick; } /** * @param {?} event * @return {?} */ setPopoverClicked(event) { this.popoverClick = event; } /** * @return {?} */ getBeforePopoverInactived() { return this.beforePopoverInactive; } /** * @param {?} event * @return {?} */ setBeforePopoverInactived(event) { this.beforePopoverInactive = event; } /** * @return {?} */ getPopoverInactived() { return this.popoverInactive; } /** * @param {?} event * @return {?} */ setPopoverInactived(event) { this.popoverInactive = event; } /** * @return {?} */ getBeforePopoverActived() { return this.beforePopoverActive; } /** * @param {?} event * @return {?} */ setBeforePopoverActived(event) { this.beforePopoverActive = event; } /** * @return {?} */ getPopoverActived() { return this.popoverActive; } /** * @param {?} event * @return {?} */ setPopoverActived(event) { this.popoverActive = event; } } PopoverDirective.SUB_TOPIC_NAME = SUB_TOPIC_NAME; PopoverDirective.SHOW_TOPIC_NAME = SHOW_TOPIC_NAME; PopoverDirective.HIDE_TOPIC_NAME = HIDE_TOPIC_NAME; PopoverDirective.CMD_TOPIC_NAME = CMD_TOPIC_NAME; PopoverDirective.decorators = [ { type: Directive, args: [{ selector: '[phxPopover]' },] }, ]; /** @nocollapse */ PopoverDirective.ctorParameters = () => [ { type: ElementRef, }, { type: NeedFocusService, }, { type: ViewContainerRef, }, { type: ComponentFactoryResolver, }, { type: ObservableManager, }, ]; PopoverDirective.propDecorators = { "html": [{ type: Input, args: ['phxPopover',] },], "type": [{ type: Input, args: ['componentType',] },], "selector": [{ type: Input, args: ['selector',] },], "delay": [{ type: Input, args: ['delay',] },], "subTopicName": [{ type: Input, args: ['topicName',] },], "autoFocus": [{ type: Input, args: ['autoFocus',] },], "beforePopoverClick": [{ type: Output, args: ['phxBeforeClick',] },], "popoverClick": [{ type: Output, args: ['phxClick',] },], "beforePopoverActive": [{ type: Output, args: ['phxBeforeActive',] },], "popoverActive": [{ type: Output, args: ['phxActive',] },], "beforePopoverInactive": [{ type: Output, args: ['phxBeforeInactive',] },], "popoverInactive": [{ type: Output, args: ['phxInactive',] },], }; function PopoverDirective_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ PopoverDirective.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ PopoverDirective.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ PopoverDirective.propDecorators; /** @type {?} */ PopoverDirective.SUB_TOPIC_NAME; /** @type {?} */ PopoverDirective.SHOW_TOPIC_NAME; /** @type {?} */ PopoverDirective.HIDE_TOPIC_NAME; /** @type {?} */ PopoverDirective.CMD_TOPIC_NAME; /** @type {?} */ PopoverDirective.prototype.html; /** @type {?} */ PopoverDirective.prototype.type; /** @type {?} */ PopoverDirective.prototype.selector; /** @type {?} */ PopoverDirective.prototype.delay; /** @type {?} */ PopoverDirective.prototype.subTopicName; /** @type {?} */ PopoverDirective.prototype.autoFocus; /** @type {?} */ PopoverDirective.prototype.beforePopoverClick; /** @type {?} */ PopoverDirective.prototype.popoverClick; /** @type {?} */ PopoverDirective.prototype.beforePopoverActive; /** @type {?} */ PopoverDirective.prototype.popoverActive; /** @type {?} */ PopoverDirective.prototype.beforePopoverInactive; /** @type {?} */ PopoverDirective.prototype.popoverInactive; /** @type {?} */ PopoverDirective.prototype.comp; /** @type {?} */ PopoverDirective.prototype.placement; /** @type {?} */ PopoverDirective.prototype.oldType; /** @type {?} */ PopoverDirective.prototype._active; /** @type {?} */ PopoverDirective.prototype.onFocus; /** @type {?} */ PopoverDirective.prototype.onChange; /** @type {?} */ PopoverDirective.prototype.onMouseover; /** @type {?} */ PopoverDirective.prototype.el; /** @type {?} */ PopoverDirective.prototype.needFocusService; /** @type {?} */ PopoverDirective.prototype.target; /** @type {?} */ PopoverDirective.prototype.componentFactoryResolver; /** @type {?} */ PopoverDirective.prototype.observableMgr; /** @type {?} */ PopoverDirective.prototype.showSubjects; /** @type {?} */ PopoverDirective.prototype.hideSubjects; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmUvUG9wb3Zlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQVUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3SSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJdkQsdUJBQU0sY0FBYyxHQUFXLFNBQVMsQ0FBQztBQUN6Qyx1QkFBTSxpQkFBaUIsR0FBVyxVQUFVLENBQUM7QUFDN0MsdUJBQU0sV0FBVyxHQUFXLE1BQU0sQ0FBQztBQUNuQyx1QkFBTSxXQUFXLEdBQVcsTUFBTSxDQUFDO0FBQ25DLHVCQUFNLFVBQVUsR0FBVyxLQUFLLENBQUM7QUFDakMsdUJBQU0sZUFBZSxHQUFXLGlCQUFpQixHQUFHLFdBQVcsQ0FBQztBQUNoRSx1QkFBTSxlQUFlLEdBQVcsaUJBQWlCLEdBQUcsV0FBVyxDQUFDO0FBQ2hFLHVCQUFNLGNBQWMsR0FBVyxpQkFBaUIsR0FBRyxVQUFVLENBQUM7QUFLOUQsTUFBTTs7Ozs7Ozs7SUE0R0YsWUFBWSxFQUFjLEVBQUUsZ0JBQWtDLEVBQUUsTUFBd0IsRUFBRSx3QkFBa0QsRUFBRSxhQUFnQztRQUMxSyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyx3QkFBd0IsQ0FBQztRQUN6RCxJQUFJLENBQUMs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O1lBRzlGLGlCQUFpQjs7O3FCQXdCckIsS0FBSyxTQUFDLFlBQVk7cUJBRWxCLEtBQUssU0FBQyxlQUFlO3lCQUVyQixLQUFLLFNBQUMsVUFBVTtzQkFFaEIsS0FBSyxTQUFDLE9BQU87NkJBRWIsS0FBSyxTQUFDLFdBQVc7MEJBRWpCLEtBQUssU0FBQyxXQUFXO21DQUdqQixNQUFNLFNBQUMsZ0JBQWdCOzZCQUV2QixNQUFNLFNBQUMsVUFBVTtvQ0FFakIsTUFBTSxTQUFDLGlCQUFpQjs4QkFFeEIsTUFBTSxTQUFDLFdBQVc7c0NBRWxCLE1BQU0sU0FBQyxtQkFBbUI7Z0NBRTFCLE1BQU0sU0FBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBPbkluaXQsIFZpZXdDb250YWluZXJSZWYsIFR5cGUsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcy9TdWJqZWN0JztcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlTWFuYWdlciB9IGZyb20gJy4uL3NlcnZpY2UvT2JzZXJ2YWJsZU1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSAnLi4vc2hhcmUvdXRpbHMvRXZlbnRVdGlscyc7XG5cbmRlY2xhcmUgdmFyICQ6IGFueTtcblxuY29uc3QgU1VCX1RPUElDX05BTUU6IHN0cmluZyA9ICdwb3BvdmVyJztcbmNvbnN0IFRPUElDX05BTUVfUFJFRklYOiBzdHJpbmcgPSAncG9wb3Zlci4nO1xuY29uc3QgU0hPV19TVUZGSVg6IHN0cmluZyA9ICdzaG93JztcbmNvbnN0IEhJREVfU1VGRklYOiBzdHJpbmcgPSAnaGlkZSc7XG5jb25zdCBDTURfU1VGRklYOiBzdHJpbmcgPSAnY21kJztcbmNvbnN0IFNIT1dfVE9QSUNfTkFNRTogc3RyaW5nID0gVE9QSUNfTkFNRV9QUkVGSVggKyBTSE9XX1NVRkZJWDtcbmNvbnN0IEhJREVfVE9QSUNfTkFNRTogc3RyaW5nID0gVE9QSUNfTkFNRV9QUkVGSVggKyBISURFX1NVRkZJWDtcbmNvbnN0IENNRF9UT1BJQ19OQU1FOiBzdHJpbmcgPSBUT1BJQ19OQU1FX1BSRUZJWCArIENNRF9TVUZGSVg7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3BoeFBvcG92ZXJdJ1xufSlcbmV4cG9ydCBjbGFzcyBQb3BvdmVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1VCX1RPUElDX05BTUU6IHN0cmluZyA9IFNVQl9UT1BJQ19OQU1FO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0hPV19UT1BJQ19OQU1FOiBzdHJpbmcgPSBTSE9XX1RPUElDX05BTUU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBISURFX1RPUElDX05BTUU6IHN0cmluZyA9IEhJREVfVE9QSUNfTkFNRTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENNRF9UT1BJQ19OQU1FOiBzdHJpbmcgPSBDTURfVE9QSUNfTkFNRTtcblxuICAgIEBJbnB1dCgncGh4UG9wb3ZlcicpXG4gICAgcHJpdmF0ZSBodG1sOiBzdHJpbmc7XG4gICAgQElucHV0KCdjb21wb25lbnRUeXBlJylcbiAgICBwcml2YXRlIHR5cGU/OiBUeXBlPGFueT47XG4gICAgQElucHV0KCdzZWxlY3RvcicpXG4gICAgcHJpdmF0ZSBzZWxlY3Rvcj86IHN0cmluZztcbiAgICBASW5wdXQoJ2RlbGF5JylcbiAgICBwcml2YXRlIGRlbGF5OiBudW1iZXI7XG4gICAgQElucHV0KCd0b3BpY05hbWUnKVxuICAgIHByaXZhdGUgc3ViVG9waWNOYW1lOiBzdHJpbmc7XG4gICAgQElucHV0KCdhdXRvRm9jdXMnKVxuICAgIHByaXZhdGUgYXV0b0ZvY3VzOiBib29sZWFuO1xuXG4gICAgQE91dHB1dCgncGh4QmVmb3JlQ2xpY2snKVxuICAgIHByaXZhdGUgYmVmb3JlUG9wb3ZlckNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgICBAT3V0cHV0KCdwaHhDbGljaycpXG4gICAgcHJpdmF0ZSBwb3BvdmVyQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICAgIEBPdXRwdXQoJ3BoeEJlZm9yZUFjdGl2ZScpXG4gICAgcHJpdmF0ZSBiZWZvcmVQb3BvdmVyQWN0aXZlOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgICBAT3V0cHV0KCdwaHhBY3RpdmUnKVxuICAgIHByaXZhdGUgcG9wb3ZlckFjdGl2ZTogRXZlbnRFbWl0dGVyPGFueT47XG4gICAgQE91dHB1dCgncGh4QmVmb3JlSW5hY3RpdmUnKVxuICAgIHByaXZhdGUgYmVmb3JlUG9wb3ZlckluYWN0aXZlOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgICBAT3V0cHV0KCdwaHhJbmFjdGl2ZScpXG4gICAgcHJpdmF0ZSBwb3BvdmVySW5hY3RpdmU6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gICAgcHJpdmF0ZSBjb21wOiBhbnk7XG4gICAgcHJpdmF0ZSBwbGFjZW1lbnQ6IHN0cmluZztcbiAgICBwcml2YXRlIG9sZFR5cGU6IFR5cGU8YW55PjtcbiAgICBwcml2YXRlIF9hY3RpdmU6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBvbkZvY3VzOiBib29sZWFuO1xuICAgIHByaXZhdGUgb25DaGFuZ2U6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBvbk1vdXNlb3ZlcjogYm9vbGVhbjtcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZTtcbiAgICBwcml2YXRlIHRhcmdldDogVmlld0NvbnRhaW5lclJlZjtcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyO1xuICAgIHByaXZhdGUgb2JzZXJ2YWJsZU1ncjogT2JzZXJ2YWJsZU1hbmFnZXI7XG4gICAgcHJpdmF0ZSBzaG93U3ViamVjdHM6IFN1YmplY3Q8YW55PltdO1xuICAgIHByaXZhdGUgaGlkZVN1YmplY3RzOiBTdWJqZWN0PGFueT5bXTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2hvd1RvcGljTmFtZShzdWJUb3BpY05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChzdWJUb3BpY05hbWUgPT09IG51bGwgfHwgdHlwZW9mIHN1YlRvcGljTmFtZSA9PT0gJ3VuZGVmaW5lZCcgfHwgc3ViVG9waWNOYW1lID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIFBvcG92ZXJEaXJlY3RpdmUuU0hPV19UT1BJQ19OQU1FO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1YlRvcGljTmFtZS5jaGFyQXQoMCkgPT09ICcuJykge1xuICAgICAgICAgICAgc3ViVG9waWNOYW1lID0gc3ViVG9waWNOYW1lLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWJUb3BpY05hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gUG9wb3ZlckRpcmVjdGl2ZS5TSE9XX1RPUElDX05BTUU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ViVG9waWNOYW1lLmNoYXJBdChzdWJUb3BpY05hbWUubGVuZ3RoIC0gMSkgIT09ICcuJykge1xuICAgICAgICAgICAgc3ViVG9waWNOYW1lICs9ICcuJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBUT1BJQ19OQU1FX1BSRUZJWCArIHN1YlRvcGljTmFtZSArIFNIT1dfU1VGRklYO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SGlkZVRvcGljTmFtZShzdWJUb3BpY05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChzdWJUb3BpY05hbWUgPT09IG51bGwgfHwgdHlwZW9mIHN1YlRvcGljTmFtZSA9PT0gJ3VuZGVmaW5lZCcgfHwgc3ViVG9waWNOYW1lID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIFBvcG92ZXJEaXJlY3RpdmUuSElERV9UT1BJQ19OQU1FO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1YlRvcGljTmFtZS5jaGFyQXQoMCkgPT09ICcuJykge1xuICAgICAgICAgICAgc3ViVG9waWNOYW1lID0gc3ViVG9waWNOYW1lLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWJUb3BpY05hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gUG9wb3ZlckRpcmVjdGl2ZS5ISURFX1RPUElDX05BTUU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ViVG9waWNOYW1lLmNoYXJBdChzdWJUb3BpY05hbWUubGVuZ3RoIC0gMSkgIT09ICcuJykge1xuICAgICAgICAgICAgc3ViVG9waWNOYW1lICs9ICcuJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBUT1BJQ19OQU1FX1BSRUZJWCArIHN1YlRvcGljTmFtZSArIEhJREVfU1VGRklYO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q21kVG9waWNOYW1lKHN1YlRvcGljTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHN1YlRvcGljTmFtZSA9PT0gbnVsbCB8fCB0eXBlb2Ygc3ViVG9waWNOYW1lID09PSAndW5kZWZpbmVkJyB8fCBzdWJUb3BpY05hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gUG9wb3ZlckRpcmVjdGl2ZS5DTURfVE9QSUNfTkFNRTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWJUb3BpY05hbWUuY2hhckF0KDApID09PSAnLicpIHtcbiAgICAgICAgICAgIHN1YlRvcGljTmFtZSA9IHN1YlRvcGljTmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ViVG9waWNOYW1lID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIFBvcG92ZXJEaXJlY3RpdmUuQ01EX1RPUElDX05BTUU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ViVG9waWNOYW1lLmNoYXJBdChzdWJUb3BpY05hbWUubGVuZ3RoIC0gMSkgIT09ICcuJykge1xuICAgICAgICAgICAgc3ViVG9waWNOYW1lICs9ICcuJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBUT1BJQ19OQU1FX1BSRUZJWCArIHN1YlRvcGljTmFtZSArIENNRF9TVUZGSVg7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoZWw6IEVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UsIHRhcmdldDogVmlld0NvbnRhaW5lclJlZiwgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIG9ic2VydmFibGVNZ3I6IE9ic2VydmFibGVNYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gY29tcG9uZW50RmFjdG9yeVJlc29sdmVyO1xuICAgICAgICB0aGlzLm9ic2VydmFibGVNZ3IgPSBvYnNlcnZhYmxlTWdyO1xuICAgICAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2UgPSBuZWVkRm9jdXNTZXJ2aWNlO1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vbkZvY3VzID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vbk1vdXNlb3ZlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJlZm9yZVBvcG92ZXJDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wb3BvdmVyQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuYmVmb3JlUG9wb3ZlckFjdGl2ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wb3BvdmVyQWN0aXZlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmJlZm9yZVBvcG92ZXJJbmFjdGl2ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wb3BvdmVySW5hY3RpdmUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuc2hvd1N1YmplY3RzID0gW107XG4gICAgICAgIHRoaXMuaGlkZVN1YmplY3RzID0gW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0UG9wb3ZlckV2ZW50VG9waWNzKHNob3dUb3BpYzogc3RyaW5nLCBoaWRlVG9waWM6IHN0cmluZywgc2hvd0NtZFRvcGljOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gQ3JlYXRlIGNoYW5nZSBldmVudCBvYnNlcnZhYmxlIHRvcGljc1xuICAgICAgICBpZiAoc2hvd1RvcGljICE9PSBudWxsICYmIHR5cGVvZiBzaG93VG9waWMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dTdWJqZWN0cy5wdXNoKHRoaXMub2JzZXJ2YWJsZU1nci5jcmVhdGVTdWJqZWN0KHNob3dUb3BpYykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoaWRlVG9waWMgIT09IG51bGwgJiYgdHlwZW9mIGhpZGVUb3BpYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVN1YmplY3RzLnB1c2godGhpcy5vYnNlcnZhYmxlTWdyLmNyZWF0ZVN1YmplY3QoaGlkZVRvcGljKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdWJzY3JpYmUgb24gQ01EIHRvcGljc1xuICAgICAgICBpZiAoc2hvd0NtZFRvcGljICE9PSBudWxsICYmIHR5cGVvZiBzaG93Q21kVG9waWMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmFibGVNZ3Iuc3Vic2NyaWJlKHNob3dDbWRUb3BpYywgKHNob3c6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2hvdyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHNob3c7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5lbC5uYXRpdmVFbGVtZW50KS5wb3BvdmVyKCdzaG93Jyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZWwubmF0aXZlRWxlbWVudCkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpLnBvcG92ZXIoJ2hpZGUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RvciA9PSBudWxsIHx8IHRoaXMuc2VsZWN0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdG9yID0gJy5hbmNob3InO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGxhY2VtZW50ID09IG51bGwgfHwgdGhpcy5wbGFjZW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IHRoaXMucGxhY2VtZW50ID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAnYm90dG9tJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRlbGF5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsYXkgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXV0b0ZvY3VzID09PSBudWxsIHx8IHRoaXMuYXV0b0ZvY3VzID09PSB1bmRlZ