ngx-smart-popover
Version:
Simple popover control for your angular (v4+) applications using bootstrap4 with smart reflection logic when overflowing the viewport. This is a continuation of ngx-popover (https://github.com/pleerock/ngx-popover). If you want to use it without bootstrap
424 lines • 34.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/popover.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* This is a continuation of ngx-popover
* @Reference {github} https://github.com/pleerock/ngx-popover
*/
import { ChangeDetectorRef, ComponentFactoryResolver, Directive, EventEmitter, HostListener, Input, Output, ViewContainerRef, ApplicationRef, Injector } from '@angular/core';
import { PopoverContentComponent } from './popover-content.component';
import { PopoverPlacement } from './popover.placement';
/**
* \@group Basic Toolkit
* \@component Popover Directive
*/
var PopoverDirective = /** @class */ (function () {
// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
function PopoverDirective(viewContainerRef, cdr, resolver, appRef, injector) {
this.viewContainerRef = viewContainerRef;
this.cdr = cdr;
this.resolver = resolver;
this.appRef = appRef;
this.injector = injector;
// -------------------------------------------------------------------------
// Properties
// -------------------------------------------------------------------------
this.popoverContentComponent = PopoverContentComponent;
this.popoverOnHover = true;
this.popoverDismissTimeout = 0;
this.onShown = new EventEmitter();
this.onHidden = new EventEmitter();
}
// -------------------------------------------------------------------------
// Event listeners
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// Event listeners
// -------------------------------------------------------------------------
/**
* @param {?} evt
* @return {?}
*/
PopoverDirective.prototype.showOrHideOnClick =
// -------------------------------------------------------------------------
// Event listeners
// -------------------------------------------------------------------------
/**
* @param {?} evt
* @return {?}
*/
function (evt) {
if (this.popoverOnHover) {
return;
}
if (this.popoverDisabled) {
return;
}
evt.stopImmediatePropagation();
this.toggle();
};
/**
* @param {?} evt
* @return {?}
*/
PopoverDirective.prototype.showOrHideOnTouch = /**
* @param {?} evt
* @return {?}
*/
function (evt) {
evt.stopImmediatePropagation();
if (!this.popoverOnHover) {
return;
}
if (this.popoverDisabled) {
return;
}
this.toggle();
};
/**
* @return {?}
*/
PopoverDirective.prototype.showOnHover = /**
* @return {?}
*/
function () {
if (!this.popoverOnHover) {
return;
}
if (this.popoverDisabled) {
return;
}
this.show();
};
/**
* @return {?}
*/
PopoverDirective.prototype.hideOnHover = /**
* @return {?}
*/
function () {
if (this.popoverCloseOnMouseOutside) {
return; // don't do anything since we do not control this
}
if (!this.popoverOnHover) {
return;
}
if (this.popoverDisabled) {
return;
}
this.hide();
};
/**
* @param {?} changes
* @return {?}
*/
PopoverDirective.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes['popoverDisabled']) {
if (changes['popoverDisabled'].currentValue) {
this.hide();
}
}
};
/**
* @protected
* @param {?} component
* @return {?}
*/
PopoverDirective.prototype.createComponent = /**
* @protected
* @param {?} component
* @return {?}
*/
function (component) {
/** @type {?} */
var factory = this.resolver.resolveComponentFactory(component);
// Create a component reference from the component
/** @type {?} */
var componentRef = this.appendToBody
? factory.create(this.injector)
: this.viewContainerRef.createComponent(factory);
if (this.appendToBody) {
// Attach component to the appRef so that it's inside the ng component tree
this.appRef.attachView(componentRef.hostView);
// Get DOM element from component
/** @type {?} */
var domElem = (/** @type {?} */ (((/** @type {?} */ (componentRef.hostView)))
.rootNodes[0]));
// Append DOM element to the body
document.body.appendChild(domElem);
}
return componentRef;
};
/**
* @protected
* @param {?} componentRef
* @return {?}
*/
PopoverDirective.prototype.removeComponent = /**
* @protected
* @param {?} componentRef
* @return {?}
*/
function (componentRef) {
if (this.popover) {
if (this.appendToBody) {
this.appRef.detachView(componentRef.hostView);
}
componentRef.destroy();
}
};
// -------------------------------------------------------------------------
// Public Methods
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// Public Methods
// -------------------------------------------------------------------------
/**
* @return {?}
*/
PopoverDirective.prototype.toggle =
// -------------------------------------------------------------------------
// Public Methods
// -------------------------------------------------------------------------
/**
* @return {?}
*/
function () {
if (!this.visible) {
this.show();
}
else {
this.hide();
}
};
/**
* @return {?}
*/
PopoverDirective.prototype.show = /**
* @return {?}
*/
function () {
var _this = this;
if (this.visible) {
return;
}
this.visible = true;
if (typeof this.content === 'string') {
if (!this.visible) {
return;
}
this.popover = this.createComponent(this.popoverContentComponent);
/** @type {?} */
var popover = (/** @type {?} */ (this.popover.instance));
popover.popover = this;
popover.content = (/** @type {?} */ (this.content));
if (this.popoverPlacement !== undefined) {
popover.placement = this.popoverPlacement;
}
if (this.popoverAnimation !== undefined) {
popover.animation = this.popoverAnimation;
}
if (this.popoverTitle !== undefined) {
popover.title = this.popoverTitle;
}
if (this.popoverCloseOnClickOutside !== undefined) {
popover.closeOnClickOutside = this.popoverCloseOnClickOutside;
}
if (this.popoverCloseOnMouseOutside !== undefined) {
popover.closeOnMouseOutside = this.popoverCloseOnMouseOutside;
}
if (this.popoverSize) {
popover.size = this.popoverSize;
}
popover.appendToBody = this.appendToBody;
popover.onCloseFromOutside.subscribe((/**
* @return {?}
*/
function () { return _this.hide(); }));
// if dismissTimeout option is set, then this popover will be dismissed in dismissTimeout time
if (this.popoverDismissTimeout > 0) {
setTimeout((/**
* @return {?}
*/
function () { return _this.hide(); }), this.popoverDismissTimeout);
}
}
else {
/** @type {?} */
var popover = (/** @type {?} */ (this.content));
popover.popover = this;
if (this.popoverPlacement !== undefined) {
popover.placement = this.popoverPlacement;
}
if (this.popoverAnimation !== undefined) {
popover.animation = this.popoverAnimation;
}
if (this.popoverTitle !== undefined) {
popover.title = this.popoverTitle;
}
if (this.popoverCloseOnClickOutside !== undefined) {
popover.closeOnClickOutside = this.popoverCloseOnClickOutside;
}
if (this.popoverCloseOnMouseOutside !== undefined) {
popover.closeOnMouseOutside = this.popoverCloseOnMouseOutside;
}
if (this.popoverSize) {
popover.size = this.popoverSize;
}
popover.appendToBody = this.appendToBody;
popover.onCloseFromOutside.subscribe((/**
* @return {?}
*/
function () { return _this.hide(); }));
// if dismissTimeout option is set, then this popover will be dismissed in dismissTimeout time
if (this.popoverDismissTimeout > 0) {
setTimeout((/**
* @return {?}
*/
function () { return _this.hide(); }), this.popoverDismissTimeout);
}
popover.show();
}
this.cdr.detectChanges();
this.onShown.emit(this);
};
/**
* @return {?}
*/
PopoverDirective.prototype.hide = /**
* @return {?}
*/
function () {
if (!this.visible) {
return;
}
this.visible = false;
this.removeComponent(this.popover);
if (this.content instanceof PopoverContentComponent) {
((/** @type {?} */ (this.content))).hideFromPopover();
}
this.cdr.detectChanges();
this.onHidden.emit(this);
};
/**
* @return {?}
*/
PopoverDirective.prototype.getElement = /**
* @return {?}
*/
function () {
return this.viewContainerRef.element.nativeElement;
};
PopoverDirective.decorators = [
{ type: Directive, args: [{
selector: '[popover]',
exportAs: 'popover'
},] }
];
/** @nocollapse */
PopoverDirective.ctorParameters = function () { return [
{ type: ViewContainerRef },
{ type: ChangeDetectorRef },
{ type: ComponentFactoryResolver },
{ type: ApplicationRef },
{ type: Injector }
]; };
PopoverDirective.propDecorators = {
content: [{ type: Input, args: ['popover',] }],
popoverSize: [{ type: Input }],
popoverDisabled: [{ type: Input }],
popoverAnimation: [{ type: Input }],
popoverPlacement: [{ type: Input }],
popoverTitle: [{ type: Input }],
popoverOnHover: [{ type: Input }],
popoverCloseOnClickOutside: [{ type: Input }],
popoverCloseOnMouseOutside: [{ type: Input }],
popoverDismissTimeout: [{ type: Input }],
appendToBody: [{ type: Input }],
onShown: [{ type: Output }],
onHidden: [{ type: Output }],
showOrHideOnClick: [{ type: HostListener, args: ['click', ['$event'],] }],
showOrHideOnTouch: [{ type: HostListener, args: ['touchend', ['$event'],] }],
showOnHover: [{ type: HostListener, args: ['focusin',] }, { type: HostListener, args: ['mouseenter',] }],
hideOnHover: [{ type: HostListener, args: ['focusout',] }, { type: HostListener, args: ['mouseleave',] }]
};
return PopoverDirective;
}());
export { PopoverDirective };
if (false) {
/**
* @type {?}
* @protected
*/
PopoverDirective.prototype.popoverContentComponent;
/**
* @type {?}
* @protected
*/
PopoverDirective.prototype.popover;
/**
* @type {?}
* @protected
*/
PopoverDirective.prototype.visible;
/** @type {?} */
PopoverDirective.prototype.content;
/** @type {?} */
PopoverDirective.prototype.popoverSize;
/** @type {?} */
PopoverDirective.prototype.popoverDisabled;
/** @type {?} */
PopoverDirective.prototype.popoverAnimation;
/** @type {?} */
PopoverDirective.prototype.popoverPlacement;
/** @type {?} */
PopoverDirective.prototype.popoverTitle;
/** @type {?} */
PopoverDirective.prototype.popoverOnHover;
/** @type {?} */
PopoverDirective.prototype.popoverCloseOnClickOutside;
/** @type {?} */
PopoverDirective.prototype.popoverCloseOnMouseOutside;
/** @type {?} */
PopoverDirective.prototype.popoverDismissTimeout;
/** @type {?} */
PopoverDirective.prototype.appendToBody;
/** @type {?} */
PopoverDirective.prototype.onShown;
/** @type {?} */
PopoverDirective.prototype.onHidden;
/**
* @type {?}
* @protected
*/
PopoverDirective.prototype.viewContainerRef;
/**
* @type {?}
* @protected
*/
PopoverDirective.prototype.cdr;
/**
* @type {?}
* @protected
*/
PopoverDirective.prototype.resolver;
/**
* @type {?}
* @protected
*/
PopoverDirective.prototype.appRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.injector;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc21hcnQtcG9wb3Zlci8iLCJzb3VyY2VzIjpbImxpYi9wb3BvdmVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFLQSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLHdCQUF3QixFQUV4QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsUUFBUSxFQUdYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7OztBQU92RDtJQVlJLDRFQUE0RTtJQUM1RSxjQUFjO0lBQ2QsNEVBQTRFO0lBQzVFLDBCQUNjLGdCQUFrQyxFQUNsQyxHQUFzQixFQUN0QixRQUFrQyxFQUNsQyxNQUFzQixFQUN4QixRQUFrQjtRQUpoQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQTBCO1FBQ2xDLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQVU7Ozs7UUFacEIsNEJBQXVCLEdBQUcsdUJBQXVCLENBQUM7UUF3QjVDLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBR3RCLDBCQUFxQixHQUFHLENBQUMsQ0FBQztRQUV6QixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFDL0MsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO0lBakI3RCxDQUFDO0lBbUJMLDRFQUE0RTtJQUM1RSxrQkFBa0I7SUFDbEIsNEVBQTRFOzs7Ozs7OztJQUVyRSw0Q0FBaUI7Ozs7Ozs7O0lBRHhCLFVBQ3lCLEdBQVU7UUFDL0IsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3JCLE9BQU87U0FDVjtRQUNELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixPQUFPO1NBQ1Y7UUFDRCxHQUFHLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEIsQ0FBQzs7Ozs7SUFHTSw0Q0FBaUI7Ozs7SUFEeEIsVUFDeUIsR0FBVTtRQUMvQixHQUFHLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN0QixPQUFPO1NBQ1Y7UUFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDdEIsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLENBQUM7Ozs7SUFJTSxzQ0FBVzs7O0lBRmxCO1FBR0ksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdEIsT0FBTztTQUNWO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3RCLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQixDQUFDOzs7O0lBSU0sc0NBQVc7OztJQUZsQjtRQUdJLElBQUksSUFBSSxDQUFDLDBCQUEwQixFQUFFO1lBQ2pDLE9BQU8sQ0FBQyxpREFBaUQ7U0FDNUQ7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN0QixPQUFPO1NBQ1Y7UUFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDdEIsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hCLENBQUM7Ozs7O0lBRU0sc0NBQVc7Ozs7SUFBbEIsVUFBbUIsT0FBaUQ7UUFDaEUsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFBRTtZQUM1QixJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFlBQVksRUFBRTtnQkFDekMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2Y7U0FDSjtJQUNMLENBQUM7Ozs7OztJQUVTLDBDQUFlOzs7OztJQUF6QixVQUEwQixTQUFvQjs7WUFDcEMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDOzs7WUFHMUQsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZO1lBQ2xDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1FBRXBELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQiwyRUFBMkU7WUFDM0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7Z0JBR3hDLE9BQU8sR0FBRyxtQkFBQSxDQUFDLG1CQUFBLFlBQVksQ0FBQyxRQUFRLEVBQXdCLENBQUM7aUJBQzFELFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBZTtZQUVoQyxpQ0FBaUM7WUFDakMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdEM7UUFFRCxPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDOzs7Ozs7SUFFUywwQ0FBZTs7Ozs7SUFBekIsVUFBMEIsWUFBK0I7UUFDckQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDakQ7WUFDRCxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDMUI7SUFDTCxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLGlCQUFpQjtJQUNqQiw0RUFBNEU7Ozs7Ozs7SUFDckUsaUNBQU07Ozs7Ozs7SUFBYjtRQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2YsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2Y7YUFBTTtZQUNILElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNmO0lBQ0wsQ0FBQzs7OztJQUVNLCtCQUFJOzs7SUFBWDtRQUFBLGlCQTJFQztRQTFFRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDZCxPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUU7WUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2YsT0FBTzthQUNWO1lBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDOztnQkFDNUQsT0FBTyxHQUFHLG1CQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUEyQjtZQUNoRSxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUN2QixPQUFPLENBQUMsT0FBTyxHQUFHLG1CQUFBLElBQUksQ0FBQyxPQUFPLEVBQVUsQ0FBQztZQUN6QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7Z0JBQ3JDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2FBQzdDO1lBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxFQUFFO2dCQUNyQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzthQUM3QztZQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUU7Z0JBQ2pDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzthQUNyQztZQUNELElBQUksSUFBSSxDQUFDLDBCQUEwQixLQUFLLFNBQVMsRUFBRTtnQkFDL0MsT0FBTyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQzthQUNqRTtZQUNELElBQUksSUFBSSxDQUFDLDBCQUEwQixLQUFLLFNBQVMsRUFBRTtnQkFDL0MsT0FBTyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQzthQUNqRTtZQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDbEIsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO2FBQ25DO1lBRUQsT0FBTyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBRXpDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTOzs7WUFBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLElBQUksRUFBRSxFQUFYLENBQVcsRUFBQyxDQUFDO1lBQ3hELDhGQUE4RjtZQUM5RixJQUFJLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLEVBQUU7Z0JBQ2hDLFVBQVU7OztnQkFBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLElBQUksRUFBRSxFQUFYLENBQVcsR0FBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQzthQUM3RDtTQUNKO2FBQU07O2dCQUNHLE9BQU8sR0FBRyxtQkFBQSxJQUFJLENBQUMsT0FBTyxFQUEyQjtZQUN2RCxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUN2QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7Z0JBQ3JDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2FBQzdDO1lBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxFQUFFO2dCQUNyQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzthQUM3QztZQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUU7Z0JBQ2pDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzthQUNyQztZQUNELElBQUksSUFBSSxDQUFDLDBCQUEwQixLQUFLLFNBQVMsRUFBRTtnQkFDL0MsT0FBTyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQzthQUNqRTtZQUNELElBQUksSUFBSSxDQUFDLDBCQUEwQixLQUFLLFNBQVMsRUFBRTtnQkFDL0MsT0FBTyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQzthQUNqRTtZQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDbEIsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO2FBQ25DO1lBRUQsT0FBTyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBRXpDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTOzs7WUFBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLElBQUksRUFBRSxFQUFYLENBQVcsRUFBQyxDQUFDO1lBQ3hELDhGQUE4RjtZQUM5RixJQUFJLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLEVBQUU7Z0JBQ2hDLFVBQVU7OztnQkFBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLElBQUksRUFBRSxFQUFYLENBQVcsR0FBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQzthQUM3RDtZQUNELE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNsQjtRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQzs7OztJQUVNLCtCQUFJOzs7SUFBWDtRQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2YsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbkMsSUFBSSxJQUFJLENBQUMsT0FBTyxZQUFZLHVCQUF1QixFQUFFO1lBQ2pELENBQUMsbUJBQUEsSUFBSSxDQUFDLE9BQU8sRUFBMkIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQy9EO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDOzs7O0lBRU0scUNBQVU7OztJQUFqQjtRQUNJLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7SUFDdkQsQ0FBQzs7Z0JBaFBKLFNBQVMsU0FBQztvQkFDUCxRQUFRLEVBQUUsV0FBVztvQkFDckIsUUFBUSxFQUFFLFNBQVM7aUJBQ3RCOzs7O2dCQWpCRyxnQkFBZ0I7Z0JBVmhCLGlCQUFpQjtnQkFDakIsd0JBQXdCO2dCQVV4QixjQUFjO2dCQUNkLFFBQVE7OzswQkFzQ1AsS0FBSyxTQUFDLFNBQVM7OEJBQ2YsS0FBSztrQ0FDTCxLQUFLO21DQUNMLEtBQUs7bUNBQ0wsS0FBSzsrQkFDTCxLQUFLO2lDQUNMLEtBQUs7NkNBQ0wsS0FBSzs2Q0FDTCxLQUFLO3dDQUNMLEtBQUs7K0JBQ0wsS0FBSzswQkFDTCxNQUFNOzJCQUNOLE1BQU07b0NBS04sWUFBWSxTQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztvQ0FZaEMsWUFBWSxTQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQzs4QkFZbkMsWUFBWSxTQUFDLFNBQVMsY0FDdEIsWUFBWSxTQUFDLFlBQVk7OEJBV3pCLFlBQVksU0FBQyxVQUFVLGNBQ3ZCLFlBQVksU0FBQyxZQUFZOztJQWlLOUIsdUJBQUM7Q0FBQSxBQWpQRCxJQWlQQztTQTdPWSxnQkFBZ0I7Ozs7OztJQUl6QixtREFBNEQ7Ozs7O0lBQzVELG1DQUF5RDs7Ozs7SUFDekQsbUNBQTJCOztJQWdCM0IsbUNBQW1FOztJQUNuRSx1Q0FBb0Y7O0lBQ3BGLDJDQUF5Qzs7SUFDekMsNENBQTBDOztJQUMxQyw0Q0FBbUQ7O0lBQ25ELHdDQUFxQzs7SUFDckMsMENBQXNDOztJQUN0QyxzREFBb0Q7O0lBQ3BELHNEQUFvRDs7SUFDcEQsaURBQTBDOztJQUMxQyx3Q0FBc0M7O0lBQ3RDLG1DQUFnRTs7SUFDaEUsb0NBQWlFOzs7OztJQXRCN0QsNENBQTRDOzs7OztJQUM1QywrQkFBZ0M7Ozs7O0lBQ2hDLG9DQUE0Qzs7Ozs7SUFDNUMsa0NBQWdDOzs7OztJQUNoQyxvQ0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgaXMgYSBjb250aW51YXRpb24gb2Ygbmd4LXBvcG92ZXJcbiAqIEBSZWZlcmVuY2Uge2dpdGh1Yn0gaHR0cHM6Ly9naXRodWIuY29tL3BsZWVyb2NrL25neC1wb3BvdmVyXG4gKi9cblxuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgSW5qZWN0b3IsXG4gICAgVHlwZSxcbiAgICBFbWJlZGRlZFZpZXdSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQb3BvdmVyQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4vcG9wb3Zlci1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQb3BvdmVyUGxhY2VtZW50IH0gZnJvbSAnLi9wb3BvdmVyLnBsYWNlbWVudCc7XG5cblxuLyoqXG4qIEBncm91cCBCYXNpYyBUb29sa2l0XG4qIEBjb21wb25lbnQgUG9wb3ZlciBEaXJlY3RpdmVcbiovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1twb3BvdmVyXScsXG4gICAgZXhwb3J0QXM6ICdwb3BvdmVyJ1xufSlcbmV4cG9ydCBjbGFzcyBQb3BvdmVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvcGVydGllc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBwcm90ZWN0ZWQgcG9wb3ZlckNvbnRlbnRDb21wb25lbnQgPSBQb3BvdmVyQ29udGVudENvbXBvbmVudDtcbiAgICBwcm90ZWN0ZWQgcG9wb3ZlcjogQ29tcG9uZW50UmVmPFBvcG92ZXJDb250ZW50Q29tcG9uZW50PjtcbiAgICBwcm90ZWN0ZWQgdmlzaWJsZTogYm9vbGVhbjtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByb3RlY3RlZCBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgcHJvdGVjdGVkIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yXG4gICAgKSB7IH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBJbnB1dHMgLyBPdXRwdXRzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIEBJbnB1dCgncG9wb3ZlcicpIHB1YmxpYyBjb250ZW50OiBzdHJpbmcgfCBQb3BvdmVyQ29udGVudENvbXBvbmVudDtcbiAgICBASW5wdXQoKSBwdWJsaWMgcG9wb3ZlclNpemU6ICdzbWFsbCcgfCAnbWVkaXVtLXNtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJyB8ICdhdXRvJztcbiAgICBASW5wdXQoKSBwdWJsaWMgcG9wb3ZlckRpc2FibGVkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwb3BvdmVyQW5pbWF0aW9uOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwb3BvdmVyUGxhY2VtZW50OiBQb3BvdmVyUGxhY2VtZW50O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwb3BvdmVyVGl0bGU6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgcG9wb3Zlck9uSG92ZXIgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwb3BvdmVyQ2xvc2VPbkNsaWNrT3V0c2lkZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgcG9wb3ZlckNsb3NlT25Nb3VzZU91dHNpZGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIHBvcG92ZXJEaXNtaXNzVGltZW91dCA9IDA7XG4gICAgQElucHV0KCkgcHVibGljIGFwcGVuZFRvQm9keTogYm9vbGVhbjtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uU2hvd24gPSBuZXcgRXZlbnRFbWl0dGVyPFBvcG92ZXJEaXJlY3RpdmU+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkhpZGRlbiA9IG5ldyBFdmVudEVtaXR0ZXI8UG9wb3ZlckRpcmVjdGl2ZT4oKTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBzaG93T3JIaWRlT25DbGljayhldnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBvcG92ZXJPbkhvdmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9wb3ZlckRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgc2hvd09ySGlkZU9uVG91Y2goZXZ0OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBldnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICghdGhpcy5wb3BvdmVyT25Ib3Zlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBvcG92ZXJEaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZm9jdXNpbicpXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VlbnRlcicpXG4gICAgcHVibGljIHNob3dPbkhvdmVyKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucG9wb3Zlck9uSG92ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wb3BvdmVyRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3coKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdmb2N1c291dCcpXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpXG4gICAgcHVibGljIGhpZGVPbkhvdmVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wb3BvdmVyQ2xvc2VPbk1vdXNlT3V0c2lkZSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBkb24ndCBkbyBhbnl0aGluZyBzaW5jZSB3ZSBkbyBub3QgY29udHJvbCB0aGlzXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnBvcG92ZXJPbkhvdmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9wb3ZlckRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW3Byb3BlcnR5TmFtZTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlIH0pOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3BvcG92ZXJEaXNhYmxlZCddKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlc1sncG9wb3ZlckRpc2FibGVkJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudDogVHlwZTxhbnk+KTogQ29tcG9uZW50UmVmPGFueT4ge1xuICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbXBvbmVudCByZWZlcmVuY2UgZnJvbSB0aGUgY29tcG9uZW50XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuYXBwZW5kVG9Cb2R5XG4gICAgICAgICAgICA/IGZhY3RvcnkuY3JlYXRlKHRoaXMuaW5qZWN0b3IpXG4gICAgICAgICAgICA6IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXBwZW5kVG9Cb2R5KSB7XG4gICAgICAgICAgICAvLyBBdHRhY2ggY29tcG9uZW50IHRvIHRoZSBhcHBSZWYgc28gdGhhdCBpdCdzIGluc2lkZSB0aGUgbmcgY29tcG9uZW50IHRyZWVcbiAgICAgICAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcblxuICAgICAgICAgICAgLy8gR2V0IERPTSBlbGVtZW50IGZyb20gY29tcG9uZW50XG4gICAgICAgICAgICBjb25zdCBkb21FbGVtID0gKGNvbXBvbmVudFJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55PilcbiAgICAgICAgICAgICAgICAucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBBcHBlbmQgRE9NIGVsZW1lbnQgdG8gdGhlIGJvZHlcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG9tRWxlbSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tcG9uZW50UmVmO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZW1vdmVDb21wb25lbnQoY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55Pikge1xuICAgICAgICBpZiAodGhpcy5wb3BvdmVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hcHBlbmRUb0JvZHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcFJlZi5kZXRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnRSZWYuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHB1YmxpYyB0b2dnbGUoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy52aXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNob3coKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnZpc2libGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucG9wb3ZlciA9IHRoaXMuY3JlYXRlQ29tcG9uZW50KHRoaXMucG9wb3ZlckNvbnRlbnRDb21wb25lbnQpO1xuICAgICAgICAgICAgY29uc3QgcG9wb3ZlciA9IHRoaXMucG9wb3Zlci5pbnN0YW5jZSBhcyBQb3BvdmVyQ29udGVudENvbXBvbmVudDtcbiAgICAgICAgICAgIHBvcG92ZXIucG9wb3ZlciA9IHRoaXM7XG4gICAgICAgICAgICBwb3BvdmVyLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQgYXMgc3RyaW5nO1xuICAgICAgICAgICAgaWYgKHRoaXMucG9wb3ZlclBsYWNlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci5wbGFjZW1lbnQgPSB0aGlzLnBvcG92ZXJQbGFjZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyQW5pbWF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwb3BvdmVyLmFuaW1hdGlvbiA9IHRoaXMucG9wb3ZlckFuaW1hdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJUaXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci50aXRsZSA9IHRoaXMucG9wb3ZlclRpdGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucG9wb3ZlckNsb3NlT25DbGlja091dHNpZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIuY2xvc2VPbkNsaWNrT3V0c2lkZSA9IHRoaXMucG9wb3ZlckNsb3NlT25DbGlja091dHNpZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyQ2xvc2VPbk1vdXNlT3V0c2lkZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci5jbG9zZU9uTW91c2VPdXRzaWRlID0gdGhpcy5wb3BvdmVyQ2xvc2VPbk1vdXNlT3V0c2lkZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJTaXplKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci5zaXplID0gdGhpcy5wb3BvdmVyU2l6ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcG9wb3Zlci5hcHBlbmRUb0JvZHkgPSB0aGlzLmFwcGVuZFRvQm9keTtcblxuICAgICAgICAgICAgcG9wb3Zlci5vbkNsb3NlRnJvbU91dHNpZGUuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGlkZSgpKTtcbiAgICAgICAgICAgIC8vIGlmIGRpc21pc3NUaW1lb3V0IG9wdGlvbiBpcyBzZXQsIHRoZW4gdGhpcyBwb3BvdmVyIHdpbGwgYmUgZGlzbWlzc2VkIGluIGRpc21pc3NUaW1lb3V0IHRpbWVcbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJEaXNtaXNzVGltZW91dCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGlkZSgpLCB0aGlzLnBvcG92ZXJEaXNtaXNzVGltZW91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwb3BvdmVyID0gdGhpcy5jb250ZW50IGFzIFBvcG92ZXJDb250ZW50Q29tcG9uZW50O1xuICAgICAgICAgICAgcG9wb3Zlci5wb3BvdmVyID0gdGhpcztcbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJQbGFjZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIucGxhY2VtZW50ID0gdGhpcy5wb3BvdmVyUGxhY2VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucG9wb3ZlckFuaW1hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci5hbmltYXRpb24gPSB0aGlzLnBvcG92ZXJBbmltYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyVGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIudGl0bGUgPSB0aGlzLnBvcG92ZXJUaXRsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcG92ZXJDbG9zZU9uQ2xpY2tPdXRzaWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwb3BvdmVyLmNsb3NlT25DbGlja091dHNpZGUgPSB0aGlzLnBvcG92ZXJDbG9zZU9uQ2xpY2tPdXRzaWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucG9wb3ZlckNsb3NlT25Nb3VzZU91dHNpZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIuY2xvc2VPbk1vdXNlT3V0c2lkZSA9IHRoaXMucG9wb3ZlckNsb3NlT25Nb3VzZU91dHNpZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyU2l6ZSkge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIuc2l6ZSA9IHRoaXMucG9wb3ZlclNpemU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBvcG92ZXIuYXBwZW5kVG9Cb2R5ID0gdGhpcy5hcHBlbmRUb0JvZHk7XG5cbiAgICAgICAgICAgIHBvcG92ZXIub25DbG9zZUZyb21PdXRzaWRlLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhpZGUoKSk7XG4gICAgICAgICAgICAvLyBpZiBkaXNtaXNzVGltZW91dCBvcHRpb24gaXMgc2V0LCB0aGVuIHRoaXMgcG9wb3ZlciB3aWxsIGJlIGRpc21pc3NlZCBpbiBkaXNtaXNzVGltZW91dCB0aW1lXG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyRGlzbWlzc1RpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmhpZGUoKSwgdGhpcy5wb3BvdmVyRGlzbWlzc1RpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9wb3Zlci5zaG93KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMub25TaG93bi5lbWl0KHRoaXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoaWRlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVtb3ZlQ29tcG9uZW50KHRoaXMucG9wb3Zlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuY29udGVudCBpbnN0YW5jZW9mIFBvcG92ZXJDb250ZW50Q29tcG9uZW50KSB7XG4gICAgICAgICAgICAodGhpcy5jb250ZW50IGFzIFBvcG92ZXJDb250ZW50Q29tcG9uZW50KS5oaWRlRnJvbVBvcG92ZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5vbkhpZGRlbi5lbWl0KHRoaXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0NvbnRhaW5lclJlZi5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxufVxuIl19