@hxui/angular
Version:
* * *
379 lines • 34.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Directive, HostListener, ViewContainerRef, Input, HostBinding, ElementRef, NgZone, ComponentFactoryResolver, Optional } from '@angular/core';
import { TooltipContentComponent } from './tooltip-content.component';
import { TooltipConfig } from './tooltip.config';
import { Context } from '../enums';
import { ComponentPortal } from '@angular/cdk/portal';
import { Overlay, ScrollDispatcher } from '@angular/cdk/overlay';
import { Directionality } from '@angular/cdk/bidi';
import { takeUntil, take } from 'rxjs/operators';
import { Subject } from 'rxjs';
var TooltipDirective = /** @class */ (function () {
function TooltipDirective(_elementRef, _viewContainerRef, overlay, _ngZone, _scrollDispatcher, _componentFactoryResolver, _config, _dir) {
this._elementRef = _elementRef;
this._viewContainerRef = _viewContainerRef;
this.overlay = overlay;
this._ngZone = _ngZone;
this._scrollDispatcher = _scrollDispatcher;
this._componentFactoryResolver = _componentFactoryResolver;
this._config = _config;
this._dir = _dir;
this._destroyed = new Subject();
this.position = 'relative';
this.placement = 'bottom';
this.showDelay = this._config.showDelay;
this.hideDelay = this._config.hideDelay;
this.context = Context.None;
this.maxWidth = 200;
Object.assign(this, _config);
}
/**
* @return {?}
*/
TooltipDirective.prototype.show = /**
* @return {?}
*/
function () {
this._show();
};
/**
* @return {?}
*/
TooltipDirective.prototype.hide = /**
* @return {?}
*/
function () {
this._hide();
};
/**
* Dispose the tooltip when destroyed.
*/
/**
* Dispose the tooltip when destroyed.
* @return {?}
*/
TooltipDirective.prototype.ngOnDestroy = /**
* Dispose the tooltip when destroyed.
* @return {?}
*/
function () {
if (this._overlayRef) {
this._overlayRef.dispose();
this._tooltipInstance = null;
}
this._destroyed.next();
this._destroyed.complete();
};
/**
* @param {?=} delay
* @return {?}
*/
TooltipDirective.prototype._show = /**
* @param {?=} delay
* @return {?}
*/
function (delay) {
var _this = this;
if (delay === void 0) { delay = this.showDelay; }
if (this.disabled || !this.content) {
return;
}
/** @type {?} */
var overlayRef = this._createOverlay();
this._detach();
this._portal = this._portal || new ComponentPortal(TooltipContentComponent, this._viewContainerRef);
this._tooltipInstance = overlayRef.attach(this._portal).instance;
this._tooltipInstance.afterHidden()
.pipe(takeUntil(this._destroyed))
.subscribe(function () { return _this._detach(); });
this._updateTooltipContent();
(/** @type {?} */ (this._tooltipInstance)).show(delay);
};
/**
* @param {?=} delay
* @return {?}
*/
TooltipDirective.prototype._hide = /**
* @param {?=} delay
* @return {?}
*/
function (delay) {
if (delay === void 0) { delay = this.hideDelay; }
if (this._tooltipInstance) {
this._tooltipInstance.hide(delay);
}
};
/**
* @return {?}
*/
TooltipDirective.prototype._createOverlay = /**
* @return {?}
*/
function () {
var _this = this;
if (this._overlayRef) {
return this._overlayRef;
}
/** @type {?} */
var positionStrategy = this.overlay.position()
.flexibleConnectedTo(this._elementRef)
.withTransformOriginOn('.hx-tooltip')
.withFlexibleDimensions(false);
this._overlayRef = this.overlay.create({
positionStrategy: positionStrategy,
panelClass: 'hxa-tooltip-panel',
scrollStrategy: this.overlay.scrollStrategies.reposition()
});
this._updatePosition();
this._overlayRef.detachments()
.pipe(takeUntil(this._destroyed))
.subscribe(function () { return _this._detach(); });
/** @type {?} */
var position = (/** @type {?} */ (this._overlayRef.getConfig().positionStrategy));
position.positionChanges
.pipe(takeUntil(this._destroyed))
.subscribe(function (pos) {
if (pos.connectionPair.originX === 'start') {
_this.placement = 'left';
}
else if (pos.connectionPair.originX === 'end') {
_this.placement = 'right';
}
_this._updateTooltipContent();
});
return this._overlayRef;
};
/**
* @return {?}
*/
TooltipDirective.prototype._updatePosition = /**
* @return {?}
*/
function () {
/** @type {?} */
var position = (/** @type {?} */ ((/** @type {?} */ (this._overlayRef)).getConfig().positionStrategy));
/** @type {?} */
var origin = this._getOrigin();
/** @type {?} */
var overlay = this._getOverlayPosition();
position.withPositions([
tslib_1.__assign({}, origin.main, overlay.main),
tslib_1.__assign({}, origin.fallback, overlay.fallback)
]);
};
/**
* Returns the origin position and a fallback position based on the user's position preference.
* The fallback position is the inverse of the origin (e.g. `'bottom' -> 'top'`).
*/
/**
* Returns the origin position and a fallback position based on the user's position preference.
* The fallback position is the inverse of the origin (e.g. `'bottom' -> 'top'`).
* @return {?}
*/
TooltipDirective.prototype._getOrigin = /**
* Returns the origin position and a fallback position based on the user's position preference.
* The fallback position is the inverse of the origin (e.g. `'bottom' -> 'top'`).
* @return {?}
*/
function () {
/** @type {?} */
var placement = this.placement;
/** @type {?} */
var originPlacement;
if (placement === 'top' || placement === 'bottom') {
originPlacement = { originX: 'center', originY: placement === 'top' ? 'top' : 'bottom' };
}
else if (placement === 'left') {
originPlacement = { originX: 'start', originY: 'center' };
}
else if (placement === 'right') {
originPlacement = { originX: 'end', originY: 'center' };
}
else {
console.error('Position error', placement);
}
var _a = this._invertPosition(originPlacement.originX, originPlacement.originY), x = _a.x, y = _a.y;
return {
main: originPlacement,
fallback: { originX: x, originY: y }
};
};
/** Returns the overlay position and a fallback position based on the user's preference */
/**
* Returns the overlay position and a fallback position based on the user's preference
* @return {?}
*/
TooltipDirective.prototype._getOverlayPosition = /**
* Returns the overlay position and a fallback position based on the user's preference
* @return {?}
*/
function () {
/** @type {?} */
var placement = this.placement;
/** @type {?} */
var overlayPlacement;
if (placement === 'top') {
overlayPlacement = { overlayX: 'center', overlayY: 'bottom' };
}
else if (placement === 'bottom') {
overlayPlacement = { overlayX: 'center', overlayY: 'top' };
}
else if (placement === 'left') {
overlayPlacement = { overlayX: 'end', overlayY: 'center' };
}
else if (placement === 'right') {
overlayPlacement = { overlayX: 'start', overlayY: 'center' };
}
else {
console.error('Could not find a position', placement);
}
var _a = this._invertPosition(overlayPlacement.overlayX, overlayPlacement.overlayY), x = _a.x, y = _a.y;
return {
main: overlayPlacement,
fallback: { overlayX: x, overlayY: y }
};
};
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
TooltipDirective.prototype._invertPosition = /**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) {
if (this.position === 'top' || this.position === 'bottom') {
if (y === 'top') {
y = 'bottom';
}
else if (y === 'bottom') {
y = 'top';
}
}
else {
if (x === 'end') {
x = 'start';
}
else if (x === 'start') {
x = 'end';
}
}
return { x: x, y: y };
};
/**
* @return {?}
*/
TooltipDirective.prototype._detach = /**
* @return {?}
*/
function () {
if (this._overlayRef && this._overlayRef.hasAttached()) {
this._overlayRef.detach();
}
this._tooltipInstance = null;
};
/** Updates the tooltip content and repositions the overlay according to the new content length */
/**
* Updates the tooltip content and repositions the overlay according to the new content length
* @return {?}
*/
TooltipDirective.prototype._updateTooltipContent = /**
* Updates the tooltip content and repositions the overlay according to the new content length
* @return {?}
*/
function () {
var _this = this;
// Must wait for the content to be painted to the tooltip so that the overlay can properly
// calculate the correct positioning based on the size of its contents.
if (this._tooltipInstance) {
this._tooltipInstance.content = this.content;
this._tooltipInstance.placement = this.placement;
this._tooltipInstance.context = this.context;
this._tooltipInstance.maxWidth = this.maxWidth;
this._ngZone.onMicrotaskEmpty.asObservable().pipe(take(1), takeUntil(this._destroyed)).subscribe(function () {
if (_this._tooltipInstance) {
(/** @type {?} */ (_this._overlayRef)).updatePosition();
}
});
}
};
TooltipDirective.decorators = [
{ type: Directive, args: [{
selector: '[hxTooltip], [hxaTooltip]'
},] },
];
/** @nocollapse */
TooltipDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: ViewContainerRef },
{ type: Overlay },
{ type: NgZone },
{ type: ScrollDispatcher },
{ type: ComponentFactoryResolver },
{ type: TooltipConfig },
{ type: Directionality, decorators: [{ type: Optional }] }
]; };
TooltipDirective.propDecorators = {
position: [{ type: HostBinding, args: ['style.position',] }],
content: [{ type: Input, args: ['hxTooltip',] }],
disabled: [{ type: Input }],
placement: [{ type: Input }],
showDelay: [{ type: Input }],
hideDelay: [{ type: Input }],
context: [{ type: Input }],
maxWidth: [{ type: Input }],
show: [{ type: HostListener, args: ['focusin',] }, { type: HostListener, args: ['mouseenter',] }],
hide: [{ type: HostListener, args: ['focusout',] }, { type: HostListener, args: ['mouseleave',] }]
};
return TooltipDirective;
}());
export { TooltipDirective };
if (false) {
/** @type {?} */
TooltipDirective.prototype._overlayRef;
/** @type {?} */
TooltipDirective.prototype._tooltipInstance;
/** @type {?} */
TooltipDirective.prototype._portal;
/** @type {?} */
TooltipDirective.prototype._destroyed;
/** @type {?} */
TooltipDirective.prototype.position;
/** @type {?} */
TooltipDirective.prototype.content;
/** @type {?} */
TooltipDirective.prototype.disabled;
/** @type {?} */
TooltipDirective.prototype.placement;
/** @type {?} */
TooltipDirective.prototype.showDelay;
/** @type {?} */
TooltipDirective.prototype.hideDelay;
/** @type {?} */
TooltipDirective.prototype.context;
/** @type {?} */
TooltipDirective.prototype.maxWidth;
/** @type {?} */
TooltipDirective.prototype._elementRef;
/** @type {?} */
TooltipDirective.prototype._viewContainerRef;
/** @type {?} */
TooltipDirective.prototype.overlay;
/** @type {?} */
TooltipDirective.prototype._ngZone;
/** @type {?} */
TooltipDirective.prototype._scrollDispatcher;
/** @type {?} */
TooltipDirective.prototype._componentFactoryResolver;
/** @type {?} */
TooltipDirective.prototype._config;
/** @type {?} */
TooltipDirective.prototype._dir;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL3Rvb2x0aXAvdG9vbHRpcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsS0FBSyxFQUNMLFdBQVcsRUFBRSxVQUFVLEVBQ1osTUFBTSxFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFDdEQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFJTCxPQUFPLEVBR1AsZ0JBQWdCLEVBRU0sTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRTdCO0lBK0NFLDBCQUNVLFdBQXVCLEVBQ3ZCLGlCQUFtQyxFQUNwQyxPQUFnQixFQUNmLE9BQWUsRUFDZixpQkFBbUMsRUFDbkMseUJBQW1ELEVBQ25ELE9BQXNCLEVBQ1YsSUFBb0I7UUFQaEMsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUNwQyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2YsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFDbkMsOEJB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clxuICBEaXJlY3RpdmUsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbiAgSW5wdXQsXHJcbiAgSG9zdEJpbmRpbmcsIEVsZW1lbnRSZWYsXHJcbiAgT25EZXN0cm95LCBOZ1pvbmUsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgT3B0aW9uYWxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVG9vbHRpcENvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuL3Rvb2x0aXAtY29udGVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUb29sdGlwQ29uZmlnIH0gZnJvbSAnLi90b29sdGlwLmNvbmZpZyc7XHJcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xyXG5pbXBvcnQge1xyXG4gIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSxcclxuICBIb3Jpem9udGFsQ29ubmVjdGlvblBvcyxcclxuICBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb24sXHJcbiAgT3ZlcmxheSxcclxuICBPdmVybGF5Q29ubmVjdGlvblBvc2l0aW9uLFxyXG4gIE92ZXJsYXlSZWYsXHJcbiAgU2Nyb2xsRGlzcGF0Y2hlcixcclxuICBTY3JvbGxTdHJhdGVneSxcclxuICBWZXJ0aWNhbENvbm5lY3Rpb25Qb3N9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHtEaXJlY3Rpb25hbGl0eX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xyXG5pbXBvcnQge3Rha2VVbnRpbCwgdGFrZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbaHhUb29sdGlwXSwgW2h4YVRvb2x0aXBdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVG9vbHRpcERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIF9vdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbDtcclxuICBfdG9vbHRpcEluc3RhbmNlOiBUb29sdGlwQ29udGVudENvbXBvbmVudCB8IG51bGw7XHJcblxyXG4gIHByaXZhdGUgX3BvcnRhbDogQ29tcG9uZW50UG9ydGFsPFRvb2x0aXBDb250ZW50Q29tcG9uZW50PjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ZWQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLnBvc2l0aW9uJylcclxuICBwb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcblxyXG4gIEBJbnB1dCgnaHhUb29sdGlwJylcclxuICBjb250ZW50OiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcGxhY2VtZW50OiAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdib3R0b20nO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNob3dEZWxheSA9IHRoaXMuX2NvbmZpZy5zaG93RGVsYXk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaGlkZURlbGF5ID0gdGhpcy5fY29uZmlnLmhpZGVEZWxheTtcclxuXHJcbiAgQElucHV0KClcclxuICBjb250ZXh0OiBDb250ZXh0ID0gQ29udGV4dC5Ob25lO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIG1heFdpZHRoOiBudW1iZXIgPSAyMDA7XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzaW4nKVxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZW50ZXInKVxyXG4gIHNob3coKSB7XHJcbiAgICB0aGlzLl9zaG93KCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdmb2N1c291dCcpXHJcbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpXHJcbiAgaGlkZSgpIHtcclxuICAgdGhpcy5faGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgIHB1YmxpYyBvdmVybGF5OiBPdmVybGF5LFxyXG4gICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXHJcbiAgICBwcml2YXRlIF9zY3JvbGxEaXNwYXRjaGVyOiBTY3JvbGxEaXNwYXRjaGVyLFxyXG4gICAgcHJpdmF0ZSBfY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBwcml2YXRlIF9jb25maWc6IFRvb2x0aXBDb25maWcsXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9kaXI6IERpcmVjdGlvbmFsaXR5LFxyXG4gICkge1xyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBfY29uZmlnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpc3Bvc2UgdGhlIHRvb2x0aXAgd2hlbiBkZXN0cm95ZWQuXHJcbiAgICovXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikge1xyXG4gICAgICB0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKTtcclxuICAgICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9kZXN0cm95ZWQubmV4dCgpO1xyXG4gICAgdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zaG93KGRlbGF5OiBudW1iZXIgPSB0aGlzLnNob3dEZWxheSkge1xyXG5cclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICF0aGlzLmNvbnRlbnQpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuX2NyZWF0ZU92ZXJsYXkoKTtcclxuXHJcbiAgICB0aGlzLl9kZXRhY2goKTtcclxuICAgIHRoaXMuX3BvcnRhbCA9IHRoaXMuX3BvcnRhbCB8fCBuZXcgQ29tcG9uZW50UG9ydGFsKFRvb2x0aXBDb250ZW50Q29tcG9uZW50LCB0aGlzLl92aWV3Q29udGFpbmVyUmVmKTtcclxuICAgIHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSA9IG92ZXJsYXlSZWYuYXR0YWNoKHRoaXMuX3BvcnRhbCkuaW5zdGFuY2U7XHJcbiAgICB0aGlzLl90b29sdGlwSW5zdGFuY2UuYWZ0ZXJIaWRkZW4oKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9kZXRhY2goKSk7XHJcblxyXG4gICAgdGhpcy5fdXBkYXRlVG9vbHRpcENvbnRlbnQoKTtcclxuICAgIHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSEuc2hvdyhkZWxheSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oaWRlKGRlbGF5OiBudW1iZXIgPSB0aGlzLmhpZGVEZWxheSkge1xyXG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSkge1xyXG4gICAgICB0aGlzLl90b29sdGlwSW5zdGFuY2UuaGlkZShkZWxheSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVPdmVybGF5KCk6IE92ZXJsYXlSZWYge1xyXG4gICAgaWYgKHRoaXMuX292ZXJsYXlSZWYpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXlSZWY7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheS5wb3NpdGlvbigpXHJcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuX2VsZW1lbnRSZWYpXHJcbiAgICAgIC53aXRoVHJhbnNmb3JtT3JpZ2luT24oJy5oeC10b29sdGlwJylcclxuICAgICAgLndpdGhGbGV4aWJsZURpbWVuc2lvbnMoZmFsc2UpO1xyXG5cclxuICAgIHRoaXMuX292ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcclxuICAgICAgcG9zaXRpb25TdHJhdGVneTogcG9zaXRpb25TdHJhdGVneSxcclxuICAgICAgcGFuZWxDbGFzczogJ2h4YS10b29sdGlwLXBhbmVsJyxcclxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKVxyXG4gICAgfSk7XHJcblxyXG4gICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5fb3ZlcmxheVJlZi5kZXRhY2htZW50cygpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2RldGFjaCgpKTtcclxuXHJcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkucG9zaXRpb25TdHJhdGVneSBhcyBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k7XHJcbiAgICBwb3NpdGlvbi5wb3NpdGlvbkNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHBvcykgPT4ge1xyXG4gICAgICAgIGlmIChwb3MuY29ubmVjdGlvblBhaXIub3JpZ2luWCA9PT0gJ3N0YXJ0Jykge1xyXG4gICAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAnbGVmdCc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwb3MuY29ubmVjdGlvblBhaXIub3JpZ2luWCA9PT0gJ2VuZCcpIHtcclxuICAgICAgICAgIHRoaXMucGxhY2VtZW50ID0gJ3JpZ2h0JztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlVG9vbHRpcENvbnRlbnQoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX292ZXJsYXlSZWY7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBfdXBkYXRlUG9zaXRpb24oKSB7XHJcbiAgICBjb25zdCBwb3NpdGlvbiA9XHJcbiAgICAgIHRoaXMuX292ZXJsYXlSZWYhLmdldENvbmZpZygpLnBvc2l0aW9uU3RyYXRlZ3kgYXMgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5O1xyXG4gICAgY29uc3Qgb3JpZ2luID0gdGhpcy5fZ2V0T3JpZ2luKCk7XHJcbiAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5fZ2V0T3ZlcmxheVBvc2l0aW9uKCk7XHJcblxyXG4gICAgcG9zaXRpb24ud2l0aFBvc2l0aW9ucyhbXHJcbiAgICAgIHsuLi5vcmlnaW4ubWFpbiwgLi4ub3ZlcmxheS5tYWlufSxcclxuICAgICAgey4uLm9yaWdpbi5mYWxsYmFjaywgLi4ub3ZlcmxheS5mYWxsYmFja31cclxuICAgIF0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgb3JpZ2luIHBvc2l0aW9uIGFuZCBhIGZhbGxiYWNrIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSB1c2VyJ3MgcG9zaXRpb24gcHJlZmVyZW5jZS5cclxuICAgKiBUaGUgZmFsbGJhY2sgcG9zaXRpb24gaXMgdGhlIGludmVyc2Ugb2YgdGhlIG9yaWdpbiAoZS5nLiBgJ2JvdHRvbScgLT4gJ3RvcCdgKS5cclxuICAgKi9cclxuICBwcml2YXRlIF9nZXRPcmlnaW4oKToge21haW46IE9yaWdpbkNvbm5lY3Rpb25Qb3NpdGlvbiwgZmFsbGJhY2s6IE9yaWdpbkNvbm5lY3Rpb25Qb3NpdGlvbn0ge1xyXG4gICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5wbGFjZW1lbnQ7XHJcbiAgICBsZXQgb3JpZ2luUGxhY2VtZW50OiBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb247XHJcblxyXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gJ3RvcCcgfHwgcGxhY2VtZW50ID09PSAnYm90dG9tJykge1xyXG4gICAgICBvcmlnaW5QbGFjZW1lbnQgPSB7b3JpZ2luWDogJ2NlbnRlcicsIG9yaWdpblk6IHBsYWNlbWVudCA9PT0gJ3RvcCcgPyAndG9wJyA6ICdib3R0b20nfTtcclxuICAgIH0gZWxzZSBpZiAocGxhY2VtZW50ID09PSAnbGVmdCcpIHtcclxuICAgICAgb3JpZ2luUGxhY2VtZW50ID0ge29yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICdjZW50ZXInfTtcclxuICAgIH0gZWxzZSBpZiAocGxhY2VtZW50ID09PSAncmlnaHQnKSB7XHJcbiAgICAgIG9yaWdpblBsYWNlbWVudCA9IHtvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogJ2NlbnRlcid9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignUG9zaXRpb24gZXJyb3InLCBwbGFjZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHt4LCB5fSA9IHRoaXMuX2ludmVydFBvc2l0aW9uKG9yaWdpblBsYWNlbWVudC5vcmlnaW5YLCBvcmlnaW5QbGFjZW1lbnQub3JpZ2luWSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbWFpbjogb3JpZ2luUGxhY2VtZW50LFxyXG4gICAgICBmYWxsYmFjazoge29yaWdpblg6IHgsIG9yaWdpblk6IHl9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybnMgdGhlIG92ZXJsYXkgcG9zaXRpb24gYW5kIGEgZmFsbGJhY2sgcG9zaXRpb24gYmFzZWQgb24gdGhlIHVzZXIncyBwcmVmZXJlbmNlICovXHJcbiAgcHJpdmF0ZSBfZ2V0T3ZlcmxheVBvc2l0aW9uKCk6IHttYWluOiBPdmVybGF5Q29ubmVjdGlvblBvc2l0aW9uLCBmYWxsYmFjazogT3ZlcmxheUNvbm5lY3Rpb25Qb3NpdGlvbn0ge1xyXG4gICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5wbGFjZW1lbnQ7XHJcbiAgICBsZXQgb3ZlcmxheVBsYWNlbWVudDogT3ZlcmxheUNvbm5lY3Rpb25Qb3NpdGlvbjtcclxuXHJcbiAgICBpZiAocGxhY2VtZW50ID09PSAndG9wJykge1xyXG4gICAgICBvdmVybGF5UGxhY2VtZW50ID0ge292ZXJsYXlYOiAnY2VudGVyJywgb3ZlcmxheVk6ICdib3R0b20nfTtcclxuICAgIH0gZWxzZSBpZiAocGxhY2VtZW50ID09PSAnYm90dG9tJykge1xyXG4gICAgICBvdmVybGF5UGxhY2VtZW50ID0ge292ZXJsYXlYOiAnY2VudGVyJywgb3ZlcmxheVk6ICd0b3AnfTtcclxuICAgIH0gZWxzZSBpZiAocGxhY2VtZW50ID09PSAnbGVmdCcpIHtcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudCA9IHtvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAnY2VudGVyJ307XHJcbiAgICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ3JpZ2h0Jykge1xyXG4gICAgICBvdmVybGF5UGxhY2VtZW50ID0ge292ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2NlbnRlcid9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGZpbmQgYSBwb3NpdGlvbicsIHBsYWNlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qge3gsIHl9ID0gdGhpcy5faW52ZXJ0UG9zaXRpb24ob3ZlcmxheVBsYWNlbWVudC5vdmVybGF5WCwgb3ZlcmxheVBsYWNlbWVudC5vdmVybGF5WSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbWFpbjogb3ZlcmxheVBsYWNlbWVudCxcclxuICAgICAgZmFsbGJhY2s6IHtvdmVybGF5WDogeCwgb3ZlcmxheVk6IHl9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgX2ludmVydFBvc2l0aW9uKHg6IEhvcml6b250YWxDb25uZWN0aW9uUG9zLCB5OiBWZXJ0aWNhbENvbm5lY3Rpb25Qb3MpIHtcclxuICAgIGlmICh0aGlzLnBvc2l0aW9uID09PSAndG9wJyB8fCB0aGlzLnBvc2l0aW9uID09PSAnYm90dG9tJykge1xyXG4gICAgICBpZiAoeSA9PT0gJ3RvcCcpIHtcclxuICAgICAgICB5ID0gJ2JvdHRvbSc7XHJcbiAgICAgIH0gZWxzZSBpZiAoeSA9PT0gJ2JvdHRvbScpIHtcclxuICAgICAgICB5ID0gJ3RvcCc7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh4ID09PSAnZW5kJykge1xyXG4gICAgICAgIHggPSAnc3RhcnQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHggPT09ICdzdGFydCcpIHtcclxuICAgICAgICB4ID0gJ2VuZCc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge3gsIHl9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZGV0YWNoKCkge1xyXG4gICAgaWYgKHRoaXMuX292ZXJsYXlSZWYgJiYgdGhpcy5fb3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpKSB7XHJcbiAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl90b29sdGlwSW5zdGFuY2UgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIFVwZGF0ZXMgdGhlIHRvb2x0aXAgY29udGVudCBhbmQgcmVwb3NpdGlvbnMgdGhlIG92ZXJsYXkgYWNjb3JkaW5nIHRvIHRoZSBuZXcgY29udGVudCBsZW5ndGggKi9cclxuICBwcml2YXRlIF91cGRhdGVUb29sdGlwQ29udGVudCgpIHtcclxuICAgIC8vIE11c3Qgd2FpdCBmb3IgdGhlIGNvbnRlbnQgdG8gYmUgcGFpbnRlZCB0byB0aGUgdG9vbHRpcCBzbyB0aGF0IHRoZSBvdmVybGF5IGNhbiBwcm9wZXJseVxyXG4gICAgLy8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHBvc2l0aW9uaW5nIGJhc2VkIG9uIHRoZSBzaXplIG9mIGl0cyBjb250ZW50cy5cclxuICAgIGlmICh0aGlzLl90b29sdGlwSW5zdGFuY2UpIHtcclxuICAgICAgICB0aGlzLl90b29sdGlwSW5zdGFuY2UuY29udGVudCA9IHRoaXMuY29udGVudDtcclxuICAgICAgICB0aGlzLl90b29sdGlwSW5zdGFuY2UucGxhY2VtZW50ID0gdGhpcy5wbGFjZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlLmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XHJcbiAgICAgICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlLm1heFdpZHRoID0gdGhpcy5tYXhXaWR0aDtcclxuXHJcblxyXG4gICAgICB0aGlzLl9uZ1pvbmUub25NaWNyb3Rhc2tFbXB0eS5hc09ic2VydmFibGUoKS5waXBlKFxyXG4gICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZClcclxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLl90b29sdGlwSW5zdGFuY2UpIHtcclxuICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYhLnVwZGF0ZVBvc2l0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19