com.phloxui
Version:
PhloxUI Ng2+ Framework
640 lines (639 loc) • 64.9 kB
JavaScript
/**
* @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