@hxui/angular
Version:
* * *
424 lines • 37.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { ContentChild, Directive, ElementRef, EventEmitter, Input, Output, ViewContainerRef } from '@angular/core';
import { takeUntil } from 'rxjs/operators';
import { DropdownConfig } from './dropdown.config';
import { DropdownMenuDirective } from './dropdown-menu.directive';
import { Subject } from 'rxjs/index';
import { TemplatePortal } from '@angular/cdk/portal';
import { Overlay } from '@angular/cdk/overlay';
var DropdownDirective = /** @class */ (function () {
function DropdownDirective(_elementRef, _viewContainerRef, overlay, _config) {
this._elementRef = _elementRef;
this._viewContainerRef = _viewContainerRef;
this.overlay = overlay;
this._config = _config;
this._destroyed = new Subject();
this.isOpen = false;
this.placement = 'bottom';
this._autoClose = this._config.autoClose;
this.isOpenChange = new EventEmitter();
this.onShown = new EventEmitter();
this.onHidden = new EventEmitter();
this.isDisabled = false;
this.showDelay = this._config.showDelay;
this.hideDelay = this._config.hideDelay;
}
Object.defineProperty(DropdownDirective.prototype, "autoClose", {
get: /**
* @return {?}
*/
function () {
return this._autoClose;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._autoClose = value;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
DropdownDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () { };
/**
* @return {?}
*/
DropdownDirective.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () { };
/**
* @return {?}
*/
DropdownDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this._overlayRef) {
this._overlayRef.dispose();
this._overlayRef = null;
}
this._destroyed.next();
this._destroyed.complete();
};
/**
* Toggles an element’s popover. This is considered a “manual” triggering of
* the popover.
*/
/**
* Toggles an element’s popover. This is considered a “manual” triggering of
* the popover.
* @param {?=} value
* @return {?}
*/
DropdownDirective.prototype.toggle = /**
* Toggles an element’s popover. This is considered a “manual” triggering of
* the popover.
* @param {?=} value
* @return {?}
*/
function (value) {
if (this.isOpen || value === false) {
return this.hide();
}
return this.show();
};
/**
* @param {?=} delay
* @return {?}
*/
DropdownDirective.prototype.show = /**
* @param {?=} delay
* @return {?}
*/
function (delay) {
if (delay === void 0) { delay = this.showDelay; }
if (this.isDisabled || this.isOpen) {
return;
}
/** @type {?} */
var overlayRef = this._createOverlay();
this._detach();
overlayRef.attach(this._portal);
this._setWidthsRelativeTo(overlayRef);
this.isOpen = true;
this.isOpenChange.emit(this.isOpen);
this.onShown.emit();
};
/**
* @param {?=} delay
* @return {?}
*/
DropdownDirective.prototype.hide = /**
* @param {?=} delay
* @return {?}
*/
function (delay) {
if (delay === void 0) { delay = this.hideDelay; }
this._detach();
this.isOpen = false;
this.isOpenChange.emit(this.isOpen);
this.onHidden.emit();
};
/**
* @return {?}
*/
DropdownDirective.prototype._createOverlay = /**
* @return {?}
*/
function () {
var _this = this;
if (this._overlayRef) {
return this._overlayRef;
}
this._portal = new TemplatePortal(this.menu.templateRef, this._viewContainerRef);
/** @type {?} */
var positionStrategy = this.overlay
.position()
.flexibleConnectedTo(this._elementRef)
.withFlexibleDimensions(false)
.withDefaultOffsetX(0)
.withPositions([
{ originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'top' }
])
.withTransformOriginOn('.hxa-dropdown-control');
this._overlayRef = this.overlay.create({
positionStrategy: positionStrategy,
panelClass: [
'hxui-reset',
'hxa-dropdown-panel',
'is-open',
this.minWidthRelativeTo ? 'is-fluid-min-width' : 'not-fuild-min-width'
],
hasBackdrop: true,
backdropClass: 'cdk-overlay-transparent-backdrop'
});
this._updatePosition();
this._overlayRef
.detachments()
.pipe(takeUntil(this._destroyed))
.subscribe(function () { return _this._detach(); });
this._overlayRef.backdropClick().subscribe(function () { return _this.hide(); });
/** @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';
}
else if (pos.connectionPair.originY === 'top') {
_this.placement = 'top';
}
else if (pos.connectionPair.originY === 'bottom') {
_this.placement = 'bottom';
}
});
return this._overlayRef;
};
/**
* @return {?}
*/
DropdownDirective.prototype._detach = /**
* @return {?}
*/
function () {
if (this._overlayRef && this._overlayRef.hasAttached()) {
this._overlayRef.detach();
}
};
/**
* @param {?} overlayRef
* @return {?}
*/
DropdownDirective.prototype._setWidthsRelativeTo = /**
* @param {?} overlayRef
* @return {?}
*/
function (overlayRef) {
if (this.maxWidthRelativeTo && this.minWidthRelativeTo) {
/** @type {?} */
var elem = document.getElementById(this.maxWidthRelativeTo);
overlayRef.updateSize({
minWidth: elem.clientWidth,
maxWidth: elem.clientWidth
});
}
else if (this.maxWidthRelativeTo) {
/** @type {?} */
var elem = document.getElementById(this.maxWidthRelativeTo);
overlayRef.updateSize({ maxWidth: elem.clientWidth });
}
else if (this.minWidthRelativeTo) {
/** @type {?} */
var elem = document.getElementById(this.minWidthRelativeTo);
console.log(this.menu.templateRef);
overlayRef.updateSize({ minWidth: elem.clientWidth });
}
};
/**
* @return {?}
*/
DropdownDirective.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 {?}
*/
DropdownDirective.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: 'start',
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 {?}
*/
DropdownDirective.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: 'start', overlayY: 'bottom' };
}
else if (placement === 'bottom') {
overlayPlacement = { overlayX: 'start', 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 {?}
*/
DropdownDirective.prototype._invertPosition = /**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) {
if (this.placement === 'top' || this.placement === '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 };
};
DropdownDirective.decorators = [
{ type: Directive, args: [{
selector: '[hxaDropdown],[hxDropdown]',
exportAs: 'hx-dropdown, hxa-dropdown'
},] },
];
/** @nocollapse */
DropdownDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: ViewContainerRef },
{ type: Overlay },
{ type: DropdownConfig }
]; };
DropdownDirective.propDecorators = {
menu: [{ type: ContentChild, args: [DropdownMenuDirective,] }],
placement: [{ type: Input }],
autoClose: [{ type: Input }],
isOpenChange: [{ type: Output }],
onShown: [{ type: Output }],
onHidden: [{ type: Output }],
isDisabled: [{ type: Input }],
showDelay: [{ type: Input }],
hideDelay: [{ type: Input }],
maxWidthRelativeTo: [{ type: Input }],
minWidthRelativeTo: [{ type: Input }]
};
return DropdownDirective;
}());
export { DropdownDirective };
if (false) {
/** @type {?} */
DropdownDirective.prototype.menu;
/** @type {?} */
DropdownDirective.prototype._overlayRef;
/** @type {?} */
DropdownDirective.prototype._portal;
/** @type {?} */
DropdownDirective.prototype._destroyed;
/** @type {?} */
DropdownDirective.prototype.isOpen;
/** @type {?} */
DropdownDirective.prototype.placement;
/** @type {?} */
DropdownDirective.prototype._autoClose;
/** @type {?} */
DropdownDirective.prototype.isOpenChange;
/** @type {?} */
DropdownDirective.prototype.onShown;
/** @type {?} */
DropdownDirective.prototype.onHidden;
/** @type {?} */
DropdownDirective.prototype.isDisabled;
/** @type {?} */
DropdownDirective.prototype.showDelay;
/** @type {?} */
DropdownDirective.prototype.hideDelay;
/** @type {?} */
DropdownDirective.prototype.maxWidthRelativeTo;
/** @type {?} */
DropdownDirective.prototype.minWidthRelativeTo;
/** @type {?} */
DropdownDirective.prototype._elementRef;
/** @type {?} */
DropdownDirective.prototype._viewContainerRef;
/** @type {?} */
DropdownDirective.prototype.overlay;
/** @type {?} */
DropdownDirective.prototype._config;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGh4dWkvYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kcm9wZG93bi9kcm9wZG93bi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBSUwsWUFBWSxFQUVaLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUVaLEtBQUssRUFLTCxNQUFNLEVBR04sZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNyQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUVMLE9BQU8sRUFRUixNQUFNLHNCQUFzQixDQUFDO0FBSzlCO0lBOENFLDJCQUNVLFdBQXVCLEVBQ3ZCLGlCQUFtQyxFQUNwQyxPQUFnQixFQUNoQixPQUF1QjtRQUh0QixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ3BDLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUF6Q2YsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDckMsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUd0QixjQUFTLEdBQXdDLFFBQVEsQ0FBQztRQUVsRCxlQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFVbEMsaUJBQVksR0FBMEIsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVsRSxZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7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NkJBRU4sS0FBSzs0QkFHTCxLQUFLOzRCQUdMLEtBQUs7cUNBR0wsS0FBSztxQ0FHTCxLQUFLOztJQTJPUix3QkFBQztDQUFBLEFBdFJELElBc1JDO1NBbFJZLGlCQUFpQjs7O0lBQzVCLGlDQUFpRTs7SUFFakUsd0NBQStCOztJQUMvQixvQ0FBZ0M7O0lBQ2hDLHVDQUE0Qzs7SUFDNUMsbUNBQXNCOztJQUV0QixzQ0FDMEQ7O0lBRTFELHVDQUE0Qzs7SUFVNUMseUNBQTRFOztJQUU1RSxvQ0FBK0Q7O0lBRS9ELHFDQUFnRTs7SUFFaEUsdUNBQ21COztJQUVuQixzQ0FDbUM7O0lBRW5DLHNDQUNtQzs7SUFFbkMsK0NBQzJCOztJQUUzQiwrQ0FDMkI7O0lBR3pCLHdDQUErQjs7SUFDL0IsOENBQTJDOztJQUMzQyxvQ0FBdUI7O0lBQ3ZCLG9DQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgQ29udGVudENoaWxkcmVuLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgTmdab25lLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgVmlld0NvbnRhaW5lclJlZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEcm9wZG93bkNvbmZpZyB9IGZyb20gJy4vZHJvcGRvd24uY29uZmlnJztcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51RGlyZWN0aXZlIH0gZnJvbSAnLi9kcm9wZG93bi1tZW51LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzL2luZGV4JztcclxuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHtcclxuICBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgT3ZlcmxheSxcclxuICBPdmVybGF5UmVmLFxyXG4gIE92ZXJsYXlTaXplQ29uZmlnLFxyXG4gIFNjcm9sbERpc3BhdGNoZXIsXHJcbiAgT3JpZ2luQ29ubmVjdGlvblBvc2l0aW9uLFxyXG4gIE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb24sXHJcbiAgSG9yaXpvbnRhbENvbm5lY3Rpb25Qb3MsXHJcbiAgVmVydGljYWxDb25uZWN0aW9uUG9zXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcclxuaW1wb3J0IHsgRHJvcGRvd25Ub2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuL2Ryb3Bkb3duLXRvZ2dsZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBEcm9wZG93bkl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL2Ryb3Bkb3duLWl0ZW0uZGlyZWN0aXZlJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2h4YURyb3Bkb3duXSxbaHhEcm9wZG93bl0nLFxyXG4gIGV4cG9ydEFzOiAnaHgtZHJvcGRvd24sIGh4YS1kcm9wZG93bidcclxufSlcclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQge1xyXG4gIEBDb250ZW50Q2hpbGQoRHJvcGRvd25NZW51RGlyZWN0aXZlKSBtZW51OiBEcm9wZG93bk1lbnVEaXJlY3RpdmU7XHJcblxyXG4gIF9vdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbDtcclxuICBwcml2YXRlIF9wb3J0YWw6IFRlbXBsYXRlUG9ydGFsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3llZCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcHVibGljIGlzT3BlbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHBsYWNlbWVudDogJ3RvcCcgfCAnYm90dG9tJyB8ICdsZWZ0JyB8ICdyaWdodCcgPSAnYm90dG9tJztcclxuXHJcbiAgcHJpdmF0ZSBfYXV0b0Nsb3NlID0gdGhpcy5fY29uZmlnLmF1dG9DbG9zZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBhdXRvQ2xvc2UodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2F1dG9DbG9zZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF1dG9DbG9zZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9hdXRvQ2xvc2U7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgaXNPcGVuQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblNob3duOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25IaWRkZW46IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNob3dEZWxheSA9IHRoaXMuX2NvbmZpZy5zaG93RGVsYXk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaGlkZURlbGF5ID0gdGhpcy5fY29uZmlnLmhpZGVEZWxheTtcclxuXHJcbiAgQElucHV0KClcclxuICBtYXhXaWR0aFJlbGF0aXZlVG86IHN0cmluZztcclxuXHJcbiAgQElucHV0KClcclxuICBtaW5XaWR0aFJlbGF0aXZlVG86IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgIHB1YmxpYyBvdmVybGF5OiBPdmVybGF5LFxyXG4gICAgcHVibGljIF9jb25maWc6IERyb3Bkb3duQ29uZmlnXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHt9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX292ZXJsYXlSZWYpIHtcclxuICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCk7XHJcbiAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlcyBhbiBlbGVtZW504oCZcyBwb3BvdmVyLiBUaGlzIGlzIGNvbnNpZGVyZWQgYSDigJxtYW51YWzigJ0gdHJpZ2dlcmluZyBvZlxyXG4gICAqIHRoZSBwb3BvdmVyLlxyXG4gICAqL1xyXG4gIHRvZ2dsZSh2YWx1ZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzT3BlbiB8fCB2YWx1ZSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnNob3coKTtcclxuICB9XHJcblxyXG4gIHNob3coZGVsYXk6IG51bWJlciA9IHRoaXMuc2hvd0RlbGF5KSB7XHJcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkIHx8IHRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5fY3JlYXRlT3ZlcmxheSgpO1xyXG4gICAgdGhpcy5fZGV0YWNoKCk7XHJcbiAgICBvdmVybGF5UmVmLmF0dGFjaCh0aGlzLl9wb3J0YWwpO1xyXG4gICAgdGhpcy5fc2V0V2lkdGhzUmVsYXRpdmVUbyhvdmVybGF5UmVmKTtcclxuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNPcGVuQ2hhbmdlLmVtaXQodGhpcy5pc09wZW4pO1xyXG4gICAgdGhpcy5vblNob3duLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIGhpZGUoZGVsYXk6IG51bWJlciA9IHRoaXMuaGlkZURlbGF5KSB7XHJcbiAgICB0aGlzLl9kZXRhY2goKTtcclxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzT3BlbkNoYW5nZS5lbWl0KHRoaXMuaXNPcGVuKTtcclxuICAgIHRoaXMub25IaWRkZW4uZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlT3ZlcmxheSgpOiBPdmVybGF5UmVmIHtcclxuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5UmVmO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3BvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbChcclxuICAgICAgdGhpcy5tZW51LnRlbXBsYXRlUmVmLFxyXG4gICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmXHJcbiAgICApO1xyXG5cclxuICAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XHJcbiAgICAgIC5wb3NpdGlvbigpXHJcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuX2VsZW1lbnRSZWYpXHJcbiAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxyXG4gICAgICAud2l0aERlZmF1bHRPZmZzZXRYKDApXHJcbiAgICAgIC53aXRoUG9zaXRpb25zKFtcclxuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICd0b3AnIH1cclxuICAgICAgXSlcclxuICAgICAgLndpdGhUcmFuc2Zvcm1PcmlnaW5PbignLmh4YS1kcm9wZG93bi1jb250cm9sJyk7XHJcblxyXG4gICAgdGhpcy5fb3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoe1xyXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiBwb3NpdGlvblN0cmF0ZWd5LFxyXG4gICAgICBwYW5lbENsYXNzOiBbXHJcbiAgICAgICAgJ2h4dWktcmVzZXQnLFxyXG4gICAgICAgICdoeGEtZHJvcGRvd24tcGFuZWwnLFxyXG4gICAgICAgICdpcy1vcGVuJyxcclxuICAgICAgICB0aGlzLm1pbldpZHRoUmVsYXRpdmVUbyA/ICdpcy1mbHVpZC1taW4td2lkdGgnIDogJ25vdC1mdWlsZC1taW4td2lkdGgnXHJcbiAgICAgIF0sXHJcbiAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxyXG4gICAgICBiYWNrZHJvcENsYXNzOiAnY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl91cGRhdGVQb3NpdGlvbigpO1xyXG5cclxuICAgIHRoaXMuX292ZXJsYXlSZWZcclxuICAgICAgLmRldGFjaG1lbnRzKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZGV0YWNoKCkpO1xyXG5cclxuICAgIHRoaXMuX292ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhpZGUoKSk7XHJcblxyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpXHJcbiAgICAgIC5wb3NpdGlvblN0cmF0ZWd5IGFzIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneTtcclxuICAgIHBvc2l0aW9uLnBvc2l0aW9uQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUocG9zID0+IHtcclxuICAgICAgaWYgKHBvcy5jb25uZWN0aW9uUGFpci5vcmlnaW5YID09PSAnc3RhcnQnKSB7XHJcbiAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAnbGVmdCc7XHJcbiAgICAgIH0gZWxzZSBpZiAocG9zLmNvbm5lY3Rpb25QYWlyLm9yaWdpblggPT09ICdlbmQnKSB7XHJcbiAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAncmlnaHQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHBvcy5jb25uZWN0aW9uUGFpci5vcmlnaW5ZID09PSAndG9wJykge1xyXG4gICAgICAgIHRoaXMucGxhY2VtZW50ID0gJ3RvcCc7XHJcbiAgICAgIH0gZWxzZSBpZiAocG9zLmNvbm5lY3Rpb25QYWlyLm9yaWdpblkgPT09ICdib3R0b20nKSB7XHJcbiAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAnYm90dG9tJztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX292ZXJsYXlSZWY7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kZXRhY2goKSB7XHJcbiAgICBpZiAodGhpcy5fb3ZlcmxheVJlZiAmJiB0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kZXRhY2goKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldFdpZHRoc1JlbGF0aXZlVG8ob3ZlcmxheVJlZjogT3ZlcmxheVJlZikge1xyXG4gICAgaWYgKHRoaXMubWF4V2lkdGhSZWxhdGl2ZVRvICYmIHRoaXMubWluV2lkdGhSZWxhdGl2ZVRvKSB7XHJcbiAgICAgIGNvbnN0IGVsZW06IEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm1heFdpZHRoUmVsYXRpdmVUbyk7XHJcbiAgICAgIG92ZXJsYXlSZWYudXBkYXRlU2l6ZSh7XHJcbiAgICAgICAgbWluV2lkdGg6IGVsZW0uY2xpZW50V2lkdGgsXHJcbiAgICAgICAgbWF4V2lkdGg6IGVsZW0uY2xpZW50V2lkdGhcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF4V2lkdGhSZWxhdGl2ZVRvKSB7XHJcbiAgICAgIGNvbnN0IGVsZW06IEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm1heFdpZHRoUmVsYXRpdmVUbyk7XHJcbiAgICAgIG92ZXJsYXlSZWYudXBkYXRlU2l6ZSh7IG1heFdpZHRoOiBlbGVtLmNsaWVudFdpZHRoIH0pO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLm1pbldpZHRoUmVsYXRpdmVUbykge1xyXG4gICAgICBjb25zdCBlbGVtOiBFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5taW5XaWR0aFJlbGF0aXZlVG8pO1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLm1lbnUudGVtcGxhdGVSZWYpO1xyXG4gICAgICBvdmVybGF5UmVmLnVwZGF0ZVNpemUoeyBtaW5XaWR0aDogZWxlbS5jbGllbnRXaWR0aCB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZVBvc2l0aW9uKCkge1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLl9vdmVybGF5UmVmIS5nZXRDb25maWcoKVxyXG4gICAgICAucG9zaXRpb25TdHJhdGVneSBhcyBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k7XHJcbiAgICBjb25zdCBvcmlnaW4gPSB0aGlzLl9nZXRPcmlnaW4oKTtcclxuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLl9nZXRPdmVybGF5UG9zaXRpb24oKTtcclxuXHJcbiAgICBwb3NpdGlvbi53aXRoUG9zaXRpb25zKFtcclxuICAgICAgeyAuLi5vcmlnaW4ubWFpbiwgLi4ub3ZlcmxheS5tYWluIH0sXHJcbiAgICAgIHsgLi4ub3JpZ2luLmZhbGxiYWNrLCAuLi5vdmVybGF5LmZhbGxiYWNrIH1cclxuICAgIF0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgb3JpZ2luIHBvc2l0aW9uIGFuZCBhIGZhbGxiYWNrIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSB1c2VyJ3MgcG9zaXRpb24gcHJlZmVyZW5jZS5cclxuICAgKiBUaGUgZmFsbGJhY2sgcG9zaXRpb24gaXMgdGhlIGludmVyc2Ugb2YgdGhlIG9yaWdpbiAoZS5nLiBgJ2JvdHRvbScgLT4gJ3RvcCdgKS5cclxuICAgKi9cclxuICBwcml2YXRlIF9nZXRPcmlnaW4oKToge1xyXG4gICAgbWFpbjogT3JpZ2luQ29ubmVjdGlvblBvc2l0aW9uO1xyXG4gICAgZmFsbGJhY2s6IE9yaWdpbkNvbm5lY3Rpb25Qb3NpdGlvbjtcclxuICB9IHtcclxuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMucGxhY2VtZW50O1xyXG4gICAgbGV0IG9yaWdpblBsYWNlbWVudDogT3JpZ2luQ29ubmVjdGlvblBvc2l0aW9uO1xyXG5cclxuICAgIGlmIChwbGFjZW1lbnQgPT09ICd0b3AnIHx8IHBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcclxuICAgICAgb3JpZ2luUGxhY2VtZW50ID0ge1xyXG4gICAgICAgIG9yaWdpblg6ICdzdGFydCcsXHJcbiAgICAgICAgb3JpZ2luWTogcGxhY2VtZW50ID09PSAndG9wJyA/ICd0b3AnIDogJ2JvdHRvbSdcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSBpZiAocGxhY2VtZW50ID09PSAnbGVmdCcpIHtcclxuICAgICAgb3JpZ2luUGxhY2VtZW50ID0geyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnY2VudGVyJyB9O1xyXG4gICAgfSBlbHNlIGlmIChwbGFjZW1lbnQgPT09ICdyaWdodCcpIHtcclxuICAgICAgb3JpZ2luUGxhY2VtZW50ID0geyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogJ2NlbnRlcicgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Bvc2l0aW9uIGVycm9yJywgcGxhY2VtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuX2ludmVydFBvc2l0aW9uKFxyXG4gICAgICBvcmlnaW5QbGFjZW1lbnQub3JpZ2luWCxcclxuICAgICAgb3JpZ2luUGxhY2VtZW50Lm9yaWdpbllcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbWFpbjogb3JpZ2luUGxhY2VtZW50LFxyXG4gICAgICBmYWxsYmFjazogeyBvcmlnaW5YOiB4LCBvcmlnaW5ZOiB5IH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJucyB0aGUgb3ZlcmxheSBwb3NpdGlvbiBhbmQgYSBmYWxsYmFjayBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgdXNlcidzIHByZWZlcmVuY2UgKi9cclxuICBwcml2YXRlIF9nZXRPdmVybGF5UG9zaXRpb24oKToge1xyXG4gICAgbWFpbjogT3ZlcmxheUNvbm5lY3Rpb25Qb3NpdGlvbjtcclxuICAgIGZhbGxiYWNrOiBPdmVybGF5Q29ubmVjdGlvblBvc2l0aW9uO1xyXG4gIH0ge1xyXG4gICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5wbGFjZW1lbnQ7XHJcbiAgICBsZXQgb3ZlcmxheVBsYWNlbWVudDogT3ZlcmxheUNvbm5lY3Rpb25Qb3NpdGlvbjtcclxuXHJcbiAgICBpZiAocGxhY2VtZW50ID09PSAndG9wJykge1xyXG4gICAgICBvdmVybGF5UGxhY2VtZW50ID0geyBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nIH07XHJcbiAgICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudCA9IHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJyB9O1xyXG4gICAgfSBlbHNlIGlmIChwbGFjZW1lbnQgPT09ICdsZWZ0Jykge1xyXG4gICAgICBvdmVybGF5UGxhY2VtZW50ID0geyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAnY2VudGVyJyB9O1xyXG4gICAgfSBlbHNlIGlmIChwbGFjZW1lbnQgPT09ICdyaWdodCcpIHtcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudCA9IHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAnY2VudGVyJyB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGZpbmQgYSBwb3NpdGlvbicsIHBsYWNlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLl9pbnZlcnRQb3NpdGlvbihcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudC5vdmVybGF5WCxcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudC5vdmVybGF5WVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtYWluOiBvdmVybGF5UGxhY2VtZW50LFxyXG4gICAgICBmYWxsYmFjazogeyBvdmVybGF5WDogeCwgb3ZlcmxheVk6IHkgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2ludmVydFBvc2l0aW9uKFxyXG4gICAgeDogSG9yaXpvbnRhbENvbm5lY3Rpb25Qb3MsXHJcbiAgICB5OiBWZXJ0aWNhbENvbm5lY3Rpb25Qb3NcclxuICApIHtcclxuICAgIGlmICh0aGlzLnBsYWNlbWVudCA9PT0gJ3RvcCcgfHwgdGhpcy5wbGFjZW1lbnQgPT09ICdib3R0b20nKSB7XHJcbiAgICAgIGlmICh5ID09PSAndG9wJykge1xyXG4gICAgICAgIHkgPSAnYm90dG9tJztcclxuICAgICAgfSBlbHNlIGlmICh5ID09PSAnYm90dG9tJykge1xyXG4gICAgICAgIHkgPSAndG9wJztcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHggPT09ICdlbmQnKSB7XHJcbiAgICAgICAgeCA9ICdzdGFydCc7XHJcbiAgICAgIH0gZWxzZSBpZiAoeCA9PT0gJ3N0YXJ0Jykge1xyXG4gICAgICAgIHggPSAnZW5kJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHgsIHkgfTtcclxuICB9XHJcbn1cclxuIl19