@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
337 lines • 28.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: popover.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ComponentFactoryResolver, Directive, ElementRef, Injector, Input, ViewContainerRef } from '@angular/core';
import { OverlayContainerRef } from '@duoduo-oba/ng-devui/overlay-container';
import { PopoverComponent } from './popover.component';
import { fromEvent, Subscription, merge } from 'rxjs';
export class PopoverDirective {
/**
* @param {?} triggerElementRef
* @param {?} overlayContainerRef
* @param {?} viewContainerRef
* @param {?} injector
* @param {?} componentFactoryResolver
*/
constructor(triggerElementRef, overlayContainerRef, viewContainerRef, injector, componentFactoryResolver) {
this.triggerElementRef = triggerElementRef;
this.overlayContainerRef = overlayContainerRef;
this.viewContainerRef = viewContainerRef;
this.injector = injector;
this.componentFactoryResolver = componentFactoryResolver;
this.subscription = new Subscription();
this.blurSub = new Subscription();
this.blurSubscription = new Subscription();
/**
* popover显示位置
*/
this.position = 'top';
/**
* `appendToBody`默认可以不传,仅当popover绑定元素外层宽高不够时,overflow为hidden,不想popover的弹出框被一并隐藏掉。
*/
this.appendToBody = true;
this.zIndex = 1060;
this.popType = 'default';
// 触发 popover 的方式(点击/鼠标悬停等)
this.trigger = 'click';
// 触发 popover 的方式(点击/鼠标悬停等)
this.hoverToContent = false;
this.onDocumentClick = (/**
* @param {?} event
* @return {?}
*/
(event) => {
event.stopPropagation();
if (this.controlled && !this.triggerElementRef.nativeElement.contains(event.target) &&
!(this.popoverComponentRef && this.popoverComponentRef.instance.elementRef.nativeElement.contains(event.target))) {
this.hide();
}
});
}
/**
* popover内容
* @param {?} _popoverContent
* @return {?}
*/
set content(_popoverContent) {
this._content = _popoverContent;
if (this.popoverComponentRef) {
this.popoverComponentRef.instance.content = _popoverContent;
setTimeout((/**
* @return {?}
*/
() => {
if (this.popoverComponentRef) {
this.popoverComponentRef.instance.updatePosition();
}
}));
}
}
/**
* @param {?} _isShow
* @return {?}
*/
set visible(_isShow) {
if (_isShow) {
// when set value and create component at the same time,should wait after ng2 dirty check done
setTimeout((/**
* @return {?}
*/
() => this.show()), 0);
}
else {
this.hide();
}
}
/**
* @return {?}
*/
createPopover() {
if (this.appendToBody) {
this.popoverComponentRef = this.overlayContainerRef.createComponent(this.componentFactoryResolver.resolveComponentFactory(PopoverComponent));
}
else {
this.popoverComponentRef = this.viewContainerRef.createComponent(this.componentFactoryResolver.resolveComponentFactory(PopoverComponent), this.viewContainerRef.length, this.injector);
}
Object.assign(this.popoverComponentRef.instance, {
content: this._content,
triggerElementRef: this.triggerElementRef,
position: this.position,
popType: this.popType,
scrollElement: this.scrollElement,
appendToBody: this.appendToBody,
zIndex: this.zIndex
});
}
/**
* @return {?}
*/
show() {
this.hide();
if (!this._content) {
return;
}
if (!this.popoverComponentRef) {
this.createPopover();
}
if (this.showAnimate) {
this.popoverComponentRef.instance.show();
}
document.addEventListener('click', this.onDocumentClick);
if (this.trigger === 'hover' && this.hoverToContent) {
this.blurSubscription = fromEvent(this.popoverComponentRef.instance.elementRef.nativeElement, 'mouseleave')
.subscribe((/**
* @param {?} event
* @return {?}
*/
(event) => {
if (event.type === 'mouseleave' && this.controlled) {
this.hide();
}
}));
this.blurSub.add(this.blurSubscription);
}
}
/**
* @return {?}
*/
destroy() {
if (this.popoverComponentRef) {
this.popoverComponentRef.destroy();
this.popoverComponentRef = null;
}
document.removeEventListener('click', this.onDocumentClick);
}
/**
* @return {?}
*/
ngOnInit() {
/** @type {?} */
const element = this.triggerElementRef.nativeElement;
if (this.trigger === 'click') {
this.subscription.add(fromEvent(element, 'click').subscribe((/**
* @param {?} event
* @return {?}
*/
event => {
if (this.controlled) {
this.show();
}
})));
}
else if (this.trigger === 'hover') {
this.subscription.add(merge(fromEvent(element, 'mouseenter'), fromEvent(element, 'mouseleave')).subscribe((/**
* @param {?} event
* @return {?}
*/
(event) => {
if (event.type === 'mouseenter' && this.controlled) {
this.show();
}
if (event.type === 'mouseleave' && this.controlled) {
if (this.hoverToContent) {
/** @type {?} */
const hideTimer = setTimeout((/**
* @return {?}
*/
() => {
/** @type {?} */
const relatedTarget = event.relatedTarget;
if (!this.triggerElementRef.nativeElement.contains(relatedTarget) &&
!(this.popoverComponentRef && this.popoverComponentRef.instance.elementRef.nativeElement.contains(relatedTarget))) {
this.hide();
}
clearTimeout(hideTimer);
}), 100);
}
else {
this.hide();
}
}
})));
}
}
/**
* @return {?}
*/
ngOnDestroy() {
this.destroy();
this.subscription.unsubscribe();
if (this.blurSub) {
this.blurSub.unsubscribe();
}
}
/**
* @return {?}
*/
hide() {
if (this.blurSubscription) {
this.blurSubscription.unsubscribe();
this.blurSub.remove(this.blurSubscription);
}
if (this.popoverComponentRef) {
if (!this.showAnimate) {
this.destroy();
return;
}
this.popoverComponentRef.instance.hide();
this.popoverComponentRef.instance.onHidden = (/**
* @return {?}
*/
() => {
this.destroy();
});
}
}
}
PopoverDirective.decorators = [
{ type: Directive, args: [{
selector: '[dPopover]',
exportAs: 'dPopover',
},] }
];
/** @nocollapse */
PopoverDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: OverlayContainerRef },
{ type: ViewContainerRef },
{ type: Injector },
{ type: ComponentFactoryResolver }
];
PopoverDirective.propDecorators = {
content: [{ type: Input }],
controlled: [{ type: Input }],
position: [{ type: Input }],
showAnimate: [{ type: Input }],
scrollElement: [{ type: Input }],
appendToBody: [{ type: Input }],
zIndex: [{ type: Input }],
popType: [{ type: Input }],
trigger: [{ type: Input }],
hoverToContent: [{ type: Input }],
visible: [{ type: Input }]
};
if (false) {
/** @type {?} */
PopoverDirective.prototype.popoverComponentRef;
/** @type {?} */
PopoverDirective.prototype._content;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.subscription;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.blurSub;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.blurSubscription;
/**
* 是否通过visible来控制popover状态
* @type {?}
*/
PopoverDirective.prototype.controlled;
/**
* popover显示位置
* @type {?}
*/
PopoverDirective.prototype.position;
/**
* 是否显示动画
* @type {?}
*/
PopoverDirective.prototype.showAnimate;
/**
* `scrollElement` 默认值是 `window `, 可以不传,只有当页面的滚动不在 window 且`appendToBody`属性为`true`上的时候才需要传递
* @type {?}
*/
PopoverDirective.prototype.scrollElement;
/**
* `appendToBody`默认可以不传,仅当popover绑定元素外层宽高不够时,overflow为hidden,不想popover的弹出框被一并隐藏掉。
* @type {?}
*/
PopoverDirective.prototype.appendToBody;
/** @type {?} */
PopoverDirective.prototype.zIndex;
/** @type {?} */
PopoverDirective.prototype.popType;
/** @type {?} */
PopoverDirective.prototype.trigger;
/** @type {?} */
PopoverDirective.prototype.hoverToContent;
/** @type {?} */
PopoverDirective.prototype.onDocumentClick;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.triggerElementRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.overlayContainerRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.viewContainerRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.injector;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.componentFactoryResolver;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9wb3BvdmVyLyIsInNvdXJjZXMiOlsicG9wb3Zlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsd0JBQXdCLEVBRXhCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsUUFBUSxFQUNSLEtBQUssRUFHTCxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRyxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFPdkQsTUFBTSxPQUFPLGdCQUFnQjs7Ozs7Ozs7SUEyRDNCLFlBQW9CLGlCQUE2QixFQUM3QixtQkFBd0MsRUFDeEMsZ0JBQWtDLEVBQ2xDLFFBQWtCLEVBQ2xCLHdCQUFrRDtRQUpsRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQVk7UUFDN0Isd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQTVEOUQsaUJBQVksR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRCxZQUFPLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0MscUJBQWdCLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7Ozs7UUFzQm5ELGFBQVEsR0FBaUIsS0FBSyxDQUFDOzs7O1FBWS9CLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFFZCxZQUFPLEdBQWdCLFNBQVMsQ0FBQzs7UUFHakMsWUFBTyxHQUFnQixPQUFPLENBQUM7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TiwrQ0FBb0Q7O0lBQ3BELG9DQUErQjs7Ozs7SUFDL0Isd0NBQXdEOzs7OztJQUN4RCxtQ0FBbUQ7Ozs7O0lBQ25ELDRDQUE0RDs7Ozs7SUFrQjVELHNDQUE2Qjs7Ozs7SUFJN0Isb0NBQXdDOzs7OztJQUl4Qyx1Q0FBOEI7Ozs7O0lBSTlCLHlDQUFnQzs7Ozs7SUFJaEMsd0NBQTZCOztJQUM3QixrQ0FBdUI7O0lBRXZCLG1DQUEwQzs7SUFHMUMsbUNBQXdDOztJQUd4QywwQ0FBZ0M7O0lBbUJoQywyQ0FNQzs7Ozs7SUFkVyw2Q0FBcUM7Ozs7O0lBQ3JDLCtDQUFnRDs7Ozs7SUFDaEQsNENBQTBDOzs7OztJQUMxQyxvQ0FBMEI7Ozs7O0lBQzFCLG9EQUEwRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gIENvbXBvbmVudFJlZixcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbmplY3RvcixcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT3ZlcmxheUNvbnRhaW5lclJlZiB9IGZyb20gJ25nLWRldnVpL292ZXJsYXktY29udGFpbmVyJztcclxuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4vcG9wb3Zlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YnNjcmlwdGlvbiwgIG1lcmdlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFBvcG92ZXJUeXBlLCBQb3NpdGlvblR5cGUsIFRyaWdnZXJUeXBlIH0gZnJvbSAnLi9wb3BvdmVyLnR5cGVzJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2RQb3BvdmVyXScsXHJcbiAgZXhwb3J0QXM6ICdkUG9wb3ZlcicsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQb3BvdmVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHBvcG92ZXJDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxQb3BvdmVyQ29tcG9uZW50PjtcclxuICBfY29udGVudDogc3RyaW5nIHwgSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICBwcml2YXRlIGJsdXJTdWI6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICBwcml2YXRlIGJsdXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAvKipcclxuICAgKiBwb3BvdmVy5YaF5a65XHJcbiAgICovXHJcbiAgQElucHV0KCkgc2V0IGNvbnRlbnQoX3BvcG92ZXJDb250ZW50KSB7XHJcbiAgICB0aGlzLl9jb250ZW50ID0gX3BvcG92ZXJDb250ZW50O1xyXG4gICAgaWYgKHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZikge1xyXG4gICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UuY29udGVudCA9IF9wb3BvdmVyQ29udGVudDtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZikge1xyXG4gICAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLmluc3RhbmNlLnVwZGF0ZVBvc2l0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICog5piv5ZCm6YCa6L+HdmlzaWJsZeadpeaOp+WItnBvcG92ZXLnirbmgIFcclxuICAgKi9cclxuICBASW5wdXQoKSBjb250cm9sbGVkOiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIHBvcG92ZXLmmL7npLrkvY3nva5cclxuICAgKi9cclxuICBASW5wdXQoKSBwb3NpdGlvbjogUG9zaXRpb25UeXBlID0gJ3RvcCc7XHJcbiAgLyoqXHJcbiAgICog5piv5ZCm5pi+56S65Yqo55S7XHJcbiAgICovXHJcbiAgQElucHV0KCkgc2hvd0FuaW1hdGU6IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogYHNjcm9sbEVsZW1lbnRgIOm7mOiupOWAvOaYryBgd2luZG93IGAsIOWPr+S7peS4jeS8oO+8jOWPquacieW9k+mhtemdoueahOa7muWKqOS4jeWcqCB3aW5kb3cg5LiUYGFwcGVuZFRvQm9keWDlsZ7mgKfkuLpgdHJ1ZWDkuIrnmoTml7blgJnmiY3pnIDopoHkvKDpgJJcclxuICAgKi9cclxuICBASW5wdXQoKSBzY3JvbGxFbGVtZW50OiBFbGVtZW50O1xyXG4gIC8qKlxyXG4gICAqIGBhcHBlbmRUb0JvZHlg6buY6K6k5Y+v5Lul5LiN5Lyg77yM5LuF5b2TcG9wb3Zlcue7keWumuWFg+e0oOWkluWxguWuvemrmOS4jeWkn+aXtu+8jG92ZXJmbG935Li6aGlkZGVu77yM5LiN5oOzcG9wb3ZlcueahOW8ueWHuuahhuiiq+S4gOW5tumakOiXj+aOieOAglxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGFwcGVuZFRvQm9keSA9IHRydWU7XHJcbiAgQElucHV0KCkgekluZGV4ID0gMTA2MDtcclxuXHJcbiAgQElucHV0KCkgcG9wVHlwZTogUG9wb3ZlclR5cGUgPSAnZGVmYXVsdCc7XHJcblxyXG4gIC8vIOinpuWPkSBwb3BvdmVyIOeahOaWueW8j++8iOeCueWHuy/pvKDmoIfmgqzlgZznrYnvvIlcclxuICBASW5wdXQoKSB0cmlnZ2VyOiBUcmlnZ2VyVHlwZSA9ICdjbGljayc7XHJcblxyXG4gIC8vIOinpuWPkSBwb3BvdmVyIOeahOaWueW8j++8iOeCueWHuy/pvKDmoIfmgqzlgZznrYnvvIlcclxuICBASW5wdXQoKSBob3ZlclRvQ29udGVudCA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBzZXQgdmlzaWJsZShfaXNTaG93OiBib29sZWFuKSB7XHJcbiAgICBpZiAoX2lzU2hvdykge1xyXG4gICAgICAvLyB3aGVuIHNldCB2YWx1ZSBhbmQgY3JlYXRlIGNvbXBvbmVudCBhdCB0aGUgc2FtZSB0aW1l77yMc2hvdWxkIHdhaXQgYWZ0ZXIgbmcyIGRpcnR5IGNoZWNrIGRvbmVcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNob3coKSwgMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJpZ2dlckVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBvdmVybGF5Q29udGFpbmVyUmVmOiBPdmVybGF5Q29udGFpbmVyUmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICAgICAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSB7XHJcbiAgfVxyXG5cclxuXHJcbiAgb25Eb2N1bWVudENsaWNrID0gKGV2ZW50KSA9PiB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmNvbnRyb2xsZWQgJiYgIXRoaXMudHJpZ2dlckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpICYmXHJcbiAgICAgICEodGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmICYmIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5pbnN0YW5jZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkpIHtcclxuICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjcmVhdGVQb3BvdmVyKCkge1xyXG4gICAgaWYgKHRoaXMuYXBwZW5kVG9Cb2R5KSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiA9IHRoaXMub3ZlcmxheUNvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoXHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoUG9wb3ZlckNvbXBvbmVudClcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoXHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoUG9wb3ZlckNvbXBvbmVudCksXHJcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmxlbmd0aCxcclxuICAgICAgICB0aGlzLmluamVjdG9yXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UsIHtcclxuICAgICAgY29udGVudDogdGhpcy5fY29udGVudCxcclxuICAgICAgdHJpZ2dlckVsZW1lbnRSZWY6IHRoaXMudHJpZ2dlckVsZW1lbnRSZWYsXHJcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uLFxyXG4gICAgICBwb3BUeXBlOiB0aGlzLnBvcFR5cGUsXHJcbiAgICAgIHNjcm9sbEVsZW1lbnQ6IHRoaXMuc2Nyb2xsRWxlbWVudCxcclxuICAgICAgYXBwZW5kVG9Cb2R5OiB0aGlzLmFwcGVuZFRvQm9keSxcclxuICAgICAgekluZGV4OiB0aGlzLnpJbmRleFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzaG93KCkge1xyXG4gICAgdGhpcy5oaWRlKCk7XHJcbiAgICBpZiAoIXRoaXMuX2NvbnRlbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYpIHtcclxuICAgICAgdGhpcy5jcmVhdGVQb3BvdmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2hvd0FuaW1hdGUpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLmluc3RhbmNlLnNob3coKTtcclxuICAgIH1cclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xyXG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2hvdmVyJyAmJiB0aGlzLmhvdmVyVG9Db250ZW50KSB7XHJcbiAgICAgIHRoaXMuYmx1clN1YnNjcmlwdGlvbiA9IGZyb21FdmVudCh0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnbW91c2VsZWF2ZScpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZWxlYXZlJyAmJiB0aGlzLmNvbnRyb2xsZWQpIHtcclxuICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuYmx1clN1Yi5hZGQodGhpcy5ibHVyU3Vic2NyaXB0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25Eb2N1bWVudENsaWNrKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMudHJpZ2dlckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdjbGljaycpIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKGZyb21FdmVudChlbGVtZW50LCAnY2xpY2snKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZWQpIHtcclxuICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnRyaWdnZXIgPT09ICdob3ZlcicpIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxyXG4gICAgICAgIG1lcmdlKFxyXG4gICAgICAgICAgZnJvbUV2ZW50KGVsZW1lbnQsICdtb3VzZWVudGVyJyksXHJcbiAgICAgICAgICBmcm9tRXZlbnQoZWxlbWVudCwgJ21vdXNlbGVhdmUnKVxyXG4gICAgICAgICkuc3Vic2NyaWJlKChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZWVudGVyJyAmJiB0aGlzLmNvbnRyb2xsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlbGVhdmUnICYmIHRoaXMuY29udHJvbGxlZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ob3ZlclRvQ29udGVudCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGhpZGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudHJpZ2dlckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhyZWxhdGVkVGFyZ2V0KSAmJlxyXG4gICAgICAgICAgICAgICAgISh0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYgJiYgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLmluc3RhbmNlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhyZWxhdGVkVGFyZ2V0KSkpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlkZVRpbWVyKTtcclxuICAgICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgaWYgKHRoaXMuYmx1clN1Yikge1xyXG4gICAgICB0aGlzLmJsdXJTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhpZGUoKSB7XHJcbiAgICBpZiAodGhpcy5ibHVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuYmx1clN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICB0aGlzLmJsdXJTdWIucmVtb3ZlKHRoaXMuYmx1clN1YnNjcmlwdGlvbik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmKSB7XHJcbiAgICAgIGlmICghdGhpcy5zaG93QW5pbWF0ZSkge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLmluc3RhbmNlLmhpZGUoKTtcclxuICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLmluc3RhbmNlLm9uSGlkZGVuID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=