UNPKG

@ngx-performance-ui/ui

Version:
235 lines 18.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { ApplicationRef, ComponentFactoryResolver, Directive, ElementRef, Injector, Input, ReflectiveInjector, Renderer2, ViewContainerRef, } from '@angular/core'; import { Select, Store, Actions, ofActionDispatched } from '@ngxs/store'; import { Observable, Subject } from 'rxjs'; import { filter } from 'rxjs/operators'; import { TooltipComponent } from '../components'; import { createProjectableNode } from '../utils'; import { EventListenerRemove, EventListenerAdd, EventListenerScrollVertical, takeUntilDestroy, takeUntilNotNull, EventListenerState, } from '@ngx-performance-ui/core'; export class TooltipDirective { /** * @param {?} actions * @param {?} appRef * @param {?} elRef * @param {?} injector * @param {?} renderer * @param {?} resolver * @param {?} vcRef * @param {?} store */ constructor(actions, appRef, elRef, injector, renderer, resolver, vcRef, store) { this.actions = actions; this.appRef = appRef; this.elRef = elRef; this.injector = injector; this.renderer = renderer; this.resolver = resolver; this.vcRef = vcRef; this.store = store; this.context = {}; this.placement = 'top'; this.trigger = 'mousemove'; this.destroy$ = new Subject(); } /** * @return {?} */ get containerRect() { return ((/** @type {?} */ (((/** @type {?} */ (this.tooltip.location.nativeElement))).childNodes[0]))).getBoundingClientRect(); } /** * @return {?} */ ngOnInit() { (this.trigger === 'mousemove' ? this.mousemove$ : this.click$) .pipe(takeUntilDestroy(this), filter((/** * @param {?} event * @return {?} */ event => !!event))) .subscribe((/** * @param {?} event * @return {?} */ event => { /** @type {?} */ let onMouseContainerOver = false; if (this.tooltip) { this.tooltip.hostView.detectChanges(); const { top, bottom, left, right } = this.containerRect; const { x, y } = event; onMouseContainerOver = top < y && bottom > y && left < x && right > x; } if (!this.tooltip && this.elRef.nativeElement.contains(event.target)) { this.show(); } else if (this.tooltip && !this.elRef.nativeElement.contains(event.target) && !onMouseContainerOver) { this.hide(); } })); } /** * @return {?} */ ngOnDestroy() { this.hide(); } /** * @return {?} */ show() { /** @type {?} */ const element = (/** @type {?} */ (this.elRef.nativeElement)); /** @type {?} */ const injector = ReflectiveInjector.resolveAndCreate([ { provide: 'TOOLTIP_PROVIDER', useValue: (/** @type {?} */ ({ element, placement: this.placement })) }, ]); /** @type {?} */ const projectableNode = createProjectableNode.call(this, this.content); this.tooltip = this.resolver.resolveComponentFactory(TooltipComponent).create(injector, [projectableNode]); this.appRef.attachView(this.tooltip.hostView); this.renderer.appendChild(this.renderer.selectRootElement('p-root', true), ((/** @type {?} */ (this.tooltip.hostView))).rootNodes[0]); this.subscribeTo(); } /** * @return {?} */ hide() { if (this.tooltip) { this.tooltip.destroy(); this.tooltip = null; } this.destroy$.next(); this.store.dispatch(new EventListenerRemove('resize')); } /** * @return {?} */ subscribeTo() { this.store.dispatch(new EventListenerAdd('resize')); this.resize$ .pipe(filter((/** * @param {?} event * @return {?} */ event => !!event)), takeUntilNotNull(this.destroy$)) .subscribe((/** * @param {?} _ * @return {?} */ _ => this.hide())); this.actions .pipe(ofActionDispatched(EventListenerScrollVertical), takeUntilNotNull(this.destroy$)) .subscribe((/** * @param {?} _ * @return {?} */ _ => this.hide())); } } TooltipDirective.decorators = [ { type: Directive, args: [{ selector: '[pTooltip]', exportAs: 'pTooltip', },] } ]; /** @nocollapse */ TooltipDirective.ctorParameters = () => [ { type: Actions }, { type: ApplicationRef }, { type: ElementRef }, { type: Injector }, { type: Renderer2 }, { type: ComponentFactoryResolver }, { type: ViewContainerRef }, { type: Store } ]; TooltipDirective.propDecorators = { content: [{ type: Input, args: ['pTooltip',] }], context: [{ type: Input, args: ['pTooltipContext',] }], placement: [{ type: Input, args: ['pTooltipPlacement',] }], trigger: [{ type: Input, args: ['pTooltipTrigger',] }] }; tslib_1.__decorate([ Select(EventListenerState.getOne('mousemove')), tslib_1.__metadata("design:type", Observable) ], TooltipDirective.prototype, "mousemove$", void 0); tslib_1.__decorate([ Select(EventListenerState.getOne('click')), tslib_1.__metadata("design:type", Observable) ], TooltipDirective.prototype, "click$", void 0); tslib_1.__decorate([ Select(EventListenerState.getOne('resize')), tslib_1.__metadata("design:type", Observable) ], TooltipDirective.prototype, "resize$", void 0); if (false) { /** @type {?} */ TooltipDirective.prototype.content; /** @type {?} */ TooltipDirective.prototype.context; /** @type {?} */ TooltipDirective.prototype.placement; /** @type {?} */ TooltipDirective.prototype.trigger; /** @type {?} */ TooltipDirective.prototype.mousemove$; /** @type {?} */ TooltipDirective.prototype.click$; /** @type {?} */ TooltipDirective.prototype.resize$; /** * @type {?} * @private */ TooltipDirective.prototype.tooltip; /** * @type {?} * @private */ TooltipDirective.prototype.destroy$; /** * @type {?} * @private */ TooltipDirective.prototype.actions; /** * @type {?} * @private */ TooltipDirective.prototype.appRef; /** * @type {?} * @private */ TooltipDirective.prototype.elRef; /** * @type {?} * @private */ TooltipDirective.prototype.injector; /** * @type {?} * @private */ TooltipDirective.prototype.renderer; /** * @type {?} * @private */ TooltipDirective.prototype.resolver; /** * @type {?} * @private */ TooltipDirective.prototype.vcRef; /** * @type {?} * @private */ TooltipDirective.prototype.store; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4LXBlcmZvcm1hbmNlLXVpL3VpLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvdG9vbHRpcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsY0FBYyxFQUNkLHdCQUF3QixFQUV4QixTQUFTLEVBQ1QsVUFBVSxFQUVWLFFBQVEsRUFDUixLQUFLLEVBR0wsa0JBQWtCLEVBQ2xCLFNBQVMsRUFHVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pELE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBQ2hCLDJCQUEyQixFQUMzQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixHQUNuQixNQUFNLDBCQUEwQixDQUFDO0FBTWxDLE1BQU0sT0FBTyxnQkFBZ0I7Ozs7Ozs7Ozs7O0lBOEIzQixZQUNVLE9BQWdCLEVBQ2hCLE1BQXNCLEVBQ3RCLEtBQWlCLEVBQ2pCLFFBQWtCLEVBQ2xCLFFBQW1CLEVBQ25CLFFBQWtDLEVBQ2xDLEtBQXVCLEVBQ3ZCLEtBQVk7UUFQWixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLGFBQVEsR0FBUixRQUFRLENBQTBCO1FBQ2xDLFVBQUssR0FBTCxLQUFLLENBQWtCO1FBQ3ZCLFVBQUssR0FBTCxLQUFLLENBQU87UUFqQ3RCLFlBQU8sR0FBUSxFQUFFLENBQUM7UUFHbEIsY0FBUyxHQUF3QyxLQUFLLENBQUM7UUFHdkQsWUFBTyxHQUEwQixXQUFXLENBQUM7UUFhckMsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFlcEMsQ0FBQzs7OztJQWJKLElBQUksYUFBYTtRQUNmLE9BQU8sQ0FBQyxtQkFBQSxDQUFDLG1CQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBZSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFlLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ3JILENBQUM7Ozs7SUFhRCxRQUFRO1FBQ04sQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUMzRCxJQUFJLENBQ0gsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQ3RCLE1BQU07Ozs7UUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FDekI7YUFDQSxTQUFTOzs7O1FBQUMsS0FBSyxDQUFDLEVBQUU7O2dCQUNiLG9CQUFvQixHQUFHLEtBQUs7WUFDaEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztzQkFDaEMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYTtzQkFDakQsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSztnQkFDdEIsb0JBQW9CLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQzthQUN2RTtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3BFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNiO2lCQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDcEcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2I7UUFDSCxDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7Ozs7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQzs7OztJQUVELElBQUk7O2NBQ0ksT0FBTyxHQUFHLG1CQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFlOztjQUNqRCxRQUFRLEdBQUcsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUM7WUFDbkQsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLG1CQUFBLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQWtCLEVBQUU7U0FDcEcsQ0FBQzs7Y0FDSSxlQUFlLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRXRFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBRTNHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUMvQyxDQUFDLG1CQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUF3QixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUM3RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7SUFFRCxJQUFJO1FBQ0YsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7U0FDckI7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDOzs7O0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUVwRCxJQUFJLENBQUMsT0FBTzthQUNULElBQUksQ0FDSCxNQUFNOzs7O1FBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFDLEVBQ3hCLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDaEM7YUFDQSxTQUFTOzs7O1FBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUMsQ0FBQztRQUUvQixJQUFJLENBQUMsT0FBTzthQUNULElBQUksQ0FDSCxrQkFBa0IsQ0FBQywyQkFBMkIsQ0FBQyxFQUMvQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ2hDO2FBQ0EsU0FBUzs7OztRQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFDLENBQUM7SUFDakMsQ0FBQzs7O1lBbEhGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsUUFBUSxFQUFFLFVBQVU7YUFDckI7Ozs7WUFsQnVCLE9BQU87WUFoQjdCLGNBQWM7WUFJZCxVQUFVO1lBRVYsUUFBUTtZQUtSLFNBQVM7WUFWVCx3QkFBd0I7WUFheEIsZ0JBQWdCO1lBRUQsS0FBSzs7O3NCQW9CbkIsS0FBSyxTQUFDLFVBQVU7c0JBR2hCLEtBQUssU0FBQyxpQkFBaUI7d0JBR3ZCLEtBQUssU0FBQyxtQkFBbUI7c0JBR3pCLEtBQUssU0FBQyxpQkFBaUI7O0FBSXhCO0lBREMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztzQ0FDbkMsVUFBVTtvREFBYTtBQUduQztJQURDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7c0NBQ25DLFVBQVU7Z0RBQWE7QUFHL0I7SUFEQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3NDQUNuQyxVQUFVO2lEQUFhOzs7SUFuQmhDLG1DQUMrQzs7SUFFL0MsbUNBQ2tCOztJQUVsQixxQ0FDdUQ7O0lBRXZELG1DQUM2Qzs7SUFFN0Msc0NBQ21DOztJQUVuQyxrQ0FDK0I7O0lBRS9CLG1DQUNnQzs7Ozs7SUFFaEMsbUNBQWdEOzs7OztJQUVoRCxvQ0FBdUM7Ozs7O0lBT3JDLG1DQUF3Qjs7Ozs7SUFDeEIsa0NBQThCOzs7OztJQUM5QixpQ0FBeUI7Ozs7O0lBQ3pCLG9DQUEwQjs7Ozs7SUFDMUIsb0NBQTJCOzs7OztJQUMzQixvQ0FBMEM7Ozs7O0lBQzFDLGlDQUErQjs7Ozs7SUFDL0IsaUNBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXBwbGljYXRpb25SZWYsXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgQ29tcG9uZW50UmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEVtYmVkZGVkVmlld1JlZixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgUmVmbGVjdGl2ZUluamVjdG9yLFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxuICBUeXBlLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNlbGVjdCwgU3RvcmUsIEFjdGlvbnMsIG9mQWN0aW9uRGlzcGF0Y2hlZCB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFRvb2x0aXBDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzJztcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgY3JlYXRlUHJvamVjdGFibGVOb2RlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgRXZlbnRMaXN0ZW5lclJlbW92ZSxcbiAgRXZlbnRMaXN0ZW5lckFkZCxcbiAgRXZlbnRMaXN0ZW5lclNjcm9sbFZlcnRpY2FsLFxuICB0YWtlVW50aWxEZXN0cm95LFxuICB0YWtlVW50aWxOb3ROdWxsLFxuICBFdmVudExpc3RlbmVyU3RhdGUsXG59IGZyb20gJ0BuZ3gtcGVyZm9ybWFuY2UtdWkvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1twVG9vbHRpcF0nLFxuICBleHBvcnRBczogJ3BUb29sdGlwJyxcbn0pXG5leHBvcnQgY2xhc3MgVG9vbHRpcERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCdwVG9vbHRpcCcpXG4gIGNvbnRlbnQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4gfCBUeXBlPGFueT47XG5cbiAgQElucHV0KCdwVG9vbHRpcENvbnRleHQnKVxuICBjb250ZXh0OiBhbnkgPSB7fTtcblxuICBASW5wdXQoJ3BUb29sdGlwUGxhY2VtZW50JylcbiAgcGxhY2VtZW50OiAndG9wJyB8ICdsZWZ0JyB8ICdyaWdodCcgfCAnYm90dG9tJyA9ICd0b3AnO1xuXG4gIEBJbnB1dCgncFRvb2x0aXBUcmlnZ2VyJylcbiAgdHJpZ2dlcjogJ21vdXNlbW92ZScgfCAnY2xpY2snID0gJ21vdXNlbW92ZSc7XG5cbiAgQFNlbGVjdChFdmVudExpc3RlbmVyU3RhdGUuZ2V0T25lKCdtb3VzZW1vdmUnKSlcbiAgbW91c2Vtb3ZlJDogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcblxuICBAU2VsZWN0KEV2ZW50TGlzdGVuZXJTdGF0ZS5nZXRPbmUoJ2NsaWNrJykpXG4gIGNsaWNrJDogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcblxuICBAU2VsZWN0KEV2ZW50TGlzdGVuZXJTdGF0ZS5nZXRPbmUoJ3Jlc2l6ZScpKVxuICByZXNpemUkOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQ+O1xuXG4gIHByaXZhdGUgdG9vbHRpcDogQ29tcG9uZW50UmVmPFRvb2x0aXBDb21wb25lbnQ+O1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGdldCBjb250YWluZXJSZWN0KCk6IENsaWVudFJlY3Qge1xuICAgIHJldHVybiAoKHRoaXMudG9vbHRpcC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jaGlsZE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWN0aW9uczogQWN0aW9ucyxcbiAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgdmNSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmUsXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICAodGhpcy50cmlnZ2VyID09PSAnbW91c2Vtb3ZlJyA/IHRoaXMubW91c2Vtb3ZlJCA6IHRoaXMuY2xpY2skKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3kodGhpcyksXG4gICAgICAgIGZpbHRlcihldmVudCA9PiAhIWV2ZW50KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICBsZXQgb25Nb3VzZUNvbnRhaW5lck92ZXIgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcCkge1xuICAgICAgICAgIHRoaXMudG9vbHRpcC5ob3N0Vmlldy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgY29uc3QgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSA9IHRoaXMuY29udGFpbmVyUmVjdDtcbiAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGV2ZW50O1xuICAgICAgICAgIG9uTW91c2VDb250YWluZXJPdmVyID0gdG9wIDwgeSAmJiBib3R0b20gPiB5ICYmIGxlZnQgPCB4ICYmIHJpZ2h0ID4geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50b29sdGlwICYmIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50b29sdGlwICYmICF0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJiAhb25Nb3VzZUNvbnRhaW5lck92ZXIpIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmhpZGUoKTtcbiAgfVxuXG4gIHNob3coKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICAgIHsgcHJvdmlkZTogJ1RPT0xUSVBfUFJPVklERVInLCB1c2VWYWx1ZTogeyBlbGVtZW50LCBwbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50IH0gYXMgVG9vbHRpcC5Db25maWcgfSxcbiAgICBdKTtcbiAgICBjb25zdCBwcm9qZWN0YWJsZU5vZGUgPSBjcmVhdGVQcm9qZWN0YWJsZU5vZGUuY2FsbCh0aGlzLCB0aGlzLmNvbnRlbnQpO1xuXG4gICAgdGhpcy50b29sdGlwID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShUb29sdGlwQ29tcG9uZW50KS5jcmVhdGUoaW5qZWN0b3IsIFtwcm9qZWN0YWJsZU5vZGVdKTtcblxuICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcodGhpcy50b29sdGlwLmhvc3RWaWV3KTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKFxuICAgICAgdGhpcy5yZW5kZXJlci5zZWxlY3RSb290RWxlbWVudCgncC1yb290JywgdHJ1ZSksXG4gICAgICAodGhpcy50b29sdGlwLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+KS5yb290Tm9kZXNbMF0sXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvKCk7XG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICh0aGlzLnRvb2x0aXApIHtcbiAgICAgIHRoaXMudG9vbHRpcC5kZXN0cm95KCk7XG4gICAgICB0aGlzLnRvb2x0aXAgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBFdmVudExpc3RlbmVyUmVtb3ZlKCdyZXNpemUnKSk7XG4gIH1cblxuICBzdWJzY3JpYmVUbygpIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBFdmVudExpc3RlbmVyQWRkKCdyZXNpemUnKSk7XG5cbiAgICB0aGlzLnJlc2l6ZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gISFldmVudCksXG4gICAgICAgIHRha2VVbnRpbE5vdE51bGwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKF8gPT4gdGhpcy5oaWRlKCkpO1xuXG4gICAgdGhpcy5hY3Rpb25zXG4gICAgICAucGlwZShcbiAgICAgICAgb2ZBY3Rpb25EaXNwYXRjaGVkKEV2ZW50TGlzdGVuZXJTY3JvbGxWZXJ0aWNhbCksXG4gICAgICAgIHRha2VVbnRpbE5vdE51bGwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKF8gPT4gdGhpcy5oaWRlKCkpO1xuICB9XG59XG4iXX0=