UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

478 lines (477 loc) 32.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, Input, Output, EventEmitter } from '@angular/core'; import { MenuModel } from './model/models'; import { AbstractHasData } from './AbstractHasData'; import { Option } from '../decorator/Option.decorator'; import { I18N } from '../decorator/I18N.decorator'; import { NeedFocusService } from '../service/NeedFocusService.service'; var /** @type {?} */ TYPE_NAME = "phx-context-menu-btn"; var /** @type {?} */ TYPE_PARENT = "parent"; var /** @type {?} */ TYPE_CHILDREN = "children"; var /** @type {?} */ TYPE_DISTANCE = "distance"; var ContextMenuButton = /** @class */ (function (_super) { tslib_1.__extends(ContextMenuButton, _super); function ContextMenuButton(elementRef, needFocusService) { var _this = _super.call(this, elementRef) || this; _this.needFocusService = needFocusService; _this.autoFocus = true; return _this; } /** * @return {?} */ ContextMenuButton.prototype.ngOnInit = /** * @return {?} */ function () { this.init(); }; /** * @return {?} */ ContextMenuButton.prototype.ngOnDestroy = /** * @return {?} */ function () { if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') { this.contextMenu.setContext(null); } }; /** * @return {?} */ ContextMenuButton.prototype.init = /** * @return {?} */ function () { if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') { this.contextMenu.setContext(this); } if (this.menuFactory !== null && typeof this.menuFactory !== 'undefined') { this.menuModel = this.menuFactory.createMenuModel(this); } }; /** * @return {?} */ ContextMenuButton.prototype.recreateMenuModel = /** * @return {?} */ function () { this.menuModel = this.menuFactory.createMenuModel(this); }; /** * @param {?} $event * @return {?} */ ContextMenuButton.prototype.onMoreButtonClick = /** * @param {?} $event * @return {?} */ function ($event) { var _this = this; if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') { if (this.contextMenu.isShow()) { setTimeout(function () { _this.hideMenu(); }, 50); } else { var /** @type {?} */ anchorEl = this.elementRef.nativeElement; if (this.anchorComponent !== null && this.anchorComponent !== undefined) { anchorEl = this.anchorComponent.elementRef.nativeElement; } else if (this.anchorSelector !== null && typeof this.anchorSelector === 'string') { var /** @type {?} */ selector = $(this.anchorSelector); if (selector.length > 0) { anchorEl = selector[0]; } } var /** @type {?} */ offsetTop = 0; var /** @type {?} */ offsetLeft = 0; if (this.menuOffsetTop !== null && typeof this.menuOffsetTop === 'number') { offsetTop = this.menuOffsetTop; } if (this.menuOffsetLeft !== null && typeof this.menuOffsetLeft === 'number') { offsetLeft = this.menuOffsetLeft; } var /** @type {?} */ top_1 = $(anchorEl).offset().top + $(anchorEl).height() + offsetTop; var /** @type {?} */ leftEllipsisButton = $(this.elementRef.nativeElement).offset().left + offsetLeft; var /** @type {?} */ widthEllipsisButton = $(this.elementRef.nativeElement).outerWidth(); var /** @type {?} */ setLeft = leftEllipsisButton + widthEllipsisButton; this.contextMenu.showAt(top_1, setLeft); } } }; /** * @return {?} */ ContextMenuButton.prototype.getContextMenu = /** * @return {?} */ function () { return this.contextMenu; }; /** * @param {?} menu * @return {?} */ ContextMenuButton.prototype.setContextMenu = /** * @param {?} menu * @return {?} */ function (menu) { this.contextMenu = menu; }; /** * @return {?} */ ContextMenuButton.prototype.getMenuModelFactory = /** * @return {?} */ function () { return this.menuFactory; }; /** * @param {?} menuFactory * @return {?} */ ContextMenuButton.prototype.setMenuModelFactory = /** * @param {?} menuFactory * @return {?} */ function (menuFactory) { this.menuFactory = menuFactory; }; /** * @return {?} */ ContextMenuButton.prototype.getMenuModel = /** * @return {?} */ function () { return this.menuModel; }; /** * @return {?} */ ContextMenuButton.prototype.isSelfDataDirty = /** * @return {?} */ function () { return false; }; /** * @param {?} data * @return {?} */ ContextMenuButton.prototype.selfSaveData = /** * @param {?} data * @return {?} */ function (data) { }; /** * @return {?} */ ContextMenuButton.prototype.selfResetData = /** * @return {?} */ function () { }; /** * @return {?} */ ContextMenuButton.prototype.doPreload = /** * @return {?} */ function () { return new Promise(function (resolve, reject) { resolve(null); }); }; /** * @return {?} */ ContextMenuButton.prototype.doLoaded = /** * @return {?} */ function () { }; /** * @return {?} */ ContextMenuButton.prototype.isIconURLEmpty = /** * @return {?} */ function () { if (this.iconURL == null || this.iconURL === undefined) { return true; } return false; }; /** * @return {?} */ ContextMenuButton.prototype.getIconURL = /** * @return {?} */ function () { return this.iconURL; }; /** * @return {?} */ ContextMenuButton.prototype.getStyleClasses = /** * @return {?} */ function () { return this.styleClasses; }; /** * @return {?} */ ContextMenuButton.prototype.hideMenu = /** * @return {?} */ function () { if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') { this.contextMenu.hide(); } }; /** * @return {?} */ ContextMenuButton.prototype.isShowMenu = /** * @return {?} */ function () { return this.contextMenu.isShow(); }; /** * @return {?} */ ContextMenuButton.prototype.isAutoFocus = /** * @return {?} */ function () { return this.autoFocus; }; /** * @param {?} event * @return {?} */ ContextMenuButton.prototype.onFocus = /** * @param {?} event * @return {?} */ function (event) { }; /** * @param {?} event * @return {?} */ ContextMenuButton.prototype.onLostFocus = /** * @param {?} event * @return {?} */ function (event) { this.hideMenu(); }; /** * @param {?} $event * @return {?} */ ContextMenuButton.prototype._doFocus = /** * @param {?} $event * @return {?} */ function ($event) { // do something when focus }; /** * @param {?} $event * @return {?} */ ContextMenuButton.prototype._doLostFocus = /** * @param {?} $event * @return {?} */ function ($event) { if (this.needFocusService !== null) { this.needFocusService.resetFocusingComponent(this); } }; ContextMenuButton.TYPE_NAME = TYPE_NAME; ContextMenuButton.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: "<div class=\"phx-context-menu-btn\" [ngClass]=\"getStyleClasses()\" (click)=\"onMoreButtonClick($event)\">\n <div class=\"icon-img\" *ngIf=\"!isIconURLEmpty()\">\n <img src=\"{{getIconURL()}}\">\n </div>\n <button type=\"button\" class=\"fake\" (focusin)=\"_doFocus($event)\" (blur)=\"_doLostFocus($event)\"></button>\n</div>\n<phx-context-menu [model]=\"getMenuModel()\" [context]=\"this\" class=\"vertical\" [autoFocus]=\"isAutoFocus()\"></phx-context-menu>\n" },] }, ]; /** @nocollapse */ ContextMenuButton.ctorParameters = function () { return [ { type: ElementRef, }, { type: NeedFocusService, }, ]; }; ContextMenuButton.propDecorators = { "dataParent": [{ type: Input },], "ignoreParentData": [{ type: Input },], "data": [{ type: Input },], "ignoreParentDisabled": [{ type: Input },], "delegateHistory": [{ type: Input },], "onDisabled": [{ type: Input },], "onEnabled": [{ type: Input },], "loadingEnabled": [{ type: Input },], "i18nKey": [{ type: Input },], "bypass": [{ type: Input, args: ['i18nBypass',] },], "options": [{ type: Input },], "disabled": [{ type: Input },], "menuFactory": [{ type: Input },], "iconURL": [{ type: Input }, { type: Output },], "styleClasses": [{ type: Input }, { type: Output },], "anchorComponent": [{ type: Input },], "anchorSelector": [{ type: Input },], "menuOffsetTop": [{ type: Input },], "menuOffsetLeft": [{ type: Input },], "loadEvent": [{ type: Output, args: ['phxLoad',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], ContextMenuButton.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ContextMenuButton.prototype, "ignoreParentData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], ContextMenuButton.prototype, "data", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ContextMenuButton.prototype, "ignoreParentDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ContextMenuButton.prototype, "delegateHistory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], ContextMenuButton.prototype, "onDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], ContextMenuButton.prototype, "onEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ContextMenuButton.prototype, "loadingEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], ContextMenuButton.prototype, "i18nKey", void 0); tslib_1.__decorate([ Option('i18nBypass'), tslib_1.__metadata("design:type", Boolean) ], ContextMenuButton.prototype, "bypass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ContextMenuButton.prototype, "disabled", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Object) ], ContextMenuButton.prototype, "menuFactory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], ContextMenuButton.prototype, "anchorComponent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], ContextMenuButton.prototype, "anchorSelector", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], ContextMenuButton.prototype, "menuOffsetTop", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], ContextMenuButton.prototype, "menuOffsetLeft", void 0); tslib_1.__decorate([ Option('load'), tslib_1.__metadata("design:type", EventEmitter) ], ContextMenuButton.prototype, "loadEvent", void 0); tslib_1.__decorate([ I18N(), tslib_1.__metadata("design:type", MenuModel) ], ContextMenuButton.prototype, "menuModel", void 0); return ContextMenuButton; }(AbstractHasData)); export { ContextMenuButton }; function ContextMenuButton_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ ContextMenuButton.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ ContextMenuButton.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ ContextMenuButton.propDecorators; /** @type {?} */ ContextMenuButton.TYPE_NAME; /** @type {?} */ ContextMenuButton.prototype.dataParent; /** @type {?} */ ContextMenuButton.prototype.ignoreParentData; /** @type {?} */ ContextMenuButton.prototype.data; /** @type {?} */ ContextMenuButton.prototype.ignoreParentDisabled; /** @type {?} */ ContextMenuButton.prototype.delegateHistory; /** @type {?} */ ContextMenuButton.prototype.onDisabled; /** @type {?} */ ContextMenuButton.prototype.onEnabled; /** @type {?} */ ContextMenuButton.prototype.loadingEnabled; /** @type {?} */ ContextMenuButton.prototype.i18nKey; /** @type {?} */ ContextMenuButton.prototype.bypass; /** @type {?} */ ContextMenuButton.prototype.options; /** @type {?} */ ContextMenuButton.prototype.disabled; /** @type {?} */ ContextMenuButton.prototype.menuFactory; /** @type {?} */ ContextMenuButton.prototype.iconURL; /** @type {?} */ ContextMenuButton.prototype.styleClasses; /** @type {?} */ ContextMenuButton.prototype.anchorComponent; /** @type {?} */ ContextMenuButton.prototype.anchorSelector; /** @type {?} */ ContextMenuButton.prototype.menuOffsetTop; /** @type {?} */ ContextMenuButton.prototype.menuOffsetLeft; /** @type {?} */ ContextMenuButton.prototype.loadEvent; /** @type {?} */ ContextMenuButton.prototype.menuModel; /** @type {?} */ ContextMenuButton.prototype.contextMenu; /** @type {?} */ ContextMenuButton.prototype.needFocusService; /** @type {?} */ ContextMenuButton.prototype.autoFocus; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGV4dE1lbnVCdXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L0NvbnRleHRNZW51QnV0dG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU0zQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUl2RSxxQkFBTSxTQUFTLEdBQVcsc0JBQXNCLENBQUM7QUFFakQscUJBQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQUM3QixxQkFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDO0FBQ2pDLHFCQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7O0lBY00sNkNBQWU7SUFpRnBELDJCQUFZLFVBQXNCLEVBQUUsZ0JBQWtDO1FBQXRFLFlBQ0Usa0JBQU0sVUFBVSxDQUFDLFNBSWxCO1FBRkMsS0FBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3pDLEtBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDOztLQUN2Qjs7OztJQUVNLG9DQUFROzs7O1FBQ2IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDOzs7OztJQUdQLHVDQUFXOzs7O1FBQ2hCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxX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LEtBQUs7eUNBR0wsS0FBSztvQ0FHTCxLQUFLOytCQUdMLEtBQUs7OEJBR0wsS0FBSzttQ0FHTCxLQUFLOzRCQUdMLEtBQUs7MkJBR0wsS0FBSyxTQUFDLFlBQVk7NEJBR2xCLEtBQUs7NkJBRUwsS0FBSztnQ0FLTCxLQUFLOzRCQUtMLEtBQUssWUFDTCxNQUFNO2lDQUVOLEtBQUssWUFDTCxNQUFNO29DQUVOLEtBQUs7bUNBR0wsS0FBSztrQ0FHTCxLQUFLO21DQUdMLEtBQUs7OEJBTUwsTUFBTSxTQUFDLFNBQVM7OztRQTlEaEIsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzBDQUNhLFFBQVE7OztRQUU3QixNQUFNLEVBQUU7MENBQ1ksUUFBUTs7O1FBRTVCLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sQ0FBQyxZQUFZLENBQUM7Ozs7UUFLcEIsTUFBTSxFQUFFOzs7O1FBS1IsSUFBSSxFQUFFO1FBQ04sTUFBTSxFQUFFOzs7O1FBVVIsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBTVIsTUFBTSxDQUFDLE1BQU0sQ0FBQzswQ0FDTSxZQUFZOzs7UUFJaEMsSUFBSSxFQUFFOzBDQUNjLFNBQVM7OzRCQTVHaEM7RUFnQ3VDLGVBQWU7U0FBekMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIE9uRGVzdHJveSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1lbnVNb2RlbCB9IGZyb20gJy4vbW9kZWwvbW9kZWxzJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICcuL0NvbnRleHRNZW51LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IElDb250ZXh0IH0gZnJvbSAnLi9JQ29udGV4dCc7XHJcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi9JSGFzRGF0YSc7XHJcbmltcG9ydCB7IElOZWVkRm9jdXMgfSBmcm9tICcuL0lOZWVkRm9jdXMnO1xyXG5pbXBvcnQgeyBJTWVudU1vZGVsRmFjdG9yeSB9IGZyb20gJy4vSU1lbnVNb2RlbEZhY3RvcnknO1xyXG5pbXBvcnQgeyBBYnN0cmFjdEhhc0RhdGEgfSBmcm9tICcuL0Fic3RyYWN0SGFzRGF0YSc7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgSTE4TiB9IGZyb20gJy4uL2RlY29yYXRvci9JMThOLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4LWNvbnRleHQtbWVudS1idG5cIjtcclxuXHJcbmNvbnN0IFRZUEVfUEFSRU5UID0gXCJwYXJlbnRcIjtcclxuY29uc3QgVFlQRV9DSElMRFJFTiA9IFwiY2hpbGRyZW5cIjtcclxuY29uc3QgVFlQRV9ESVNUQU5DRSA9IFwiZGlzdGFuY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXHJcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJwaHgtY29udGV4dC1tZW51LWJ0blwiIFtuZ0NsYXNzXT1cImdldFN0eWxlQ2xhc3NlcygpXCIgKGNsaWNrKT1cIm9uTW9yZUJ1dHRvbkNsaWNrKCRldmVudClcIj5cclxuICA8ZGl2IGNsYXNzPVwiaWNvbi1pbWdcIiAqbmdJZj1cIiFpc0ljb25VUkxFbXB0eSgpXCI+XHJcbiAgICA8aW1nIHNyYz1cInt7Z2V0SWNvblVSTCgpfX1cIj5cclxuICA8L2Rpdj5cclxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZha2VcIiAoZm9jdXNpbik9XCJfZG9Gb2N1cygkZXZlbnQpXCIgKGJsdXIpPVwiX2RvTG9zdEZvY3VzKCRldmVudClcIj48L2J1dHRvbj5cclxuPC9kaXY+XHJcbjxwaHgtY29udGV4dC1tZW51IFttb2RlbF09XCJnZXRNZW51TW9kZWwoKVwiIFtjb250ZXh0XT1cInRoaXNcIiBjbGFzcz1cInZlcnRpY2FsXCIgW2F1dG9Gb2N1c109XCJpc0F1dG9Gb2N1cygpXCI+PC9waHgtY29udGV4dC1tZW51PlxyXG5gXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb250ZXh0TWVudUJ1dHRvbiBleHRlbmRzIEFic3RyYWN0SGFzRGF0YSBpbXBsZW1lbnRzIE9uSW5pdCwgSUNvbnRleHQsIE9uRGVzdHJveSwgSU5lZWRGb2N1cyB7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XHJcblxyXG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBASW5wdXQuXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGF0YVBhcmVudDogSUhhc0RhdGE7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGF0YTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGVsZWdhdGVIaXN0b3J5OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG9uRGlzYWJsZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG9uRW5hYmxlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbG9hZGluZ0VuYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaTE4bktleTogc3RyaW5nO1xyXG4gIEBJbnB1dCgnaTE4bkJ5cGFzcycpXHJcbiAgQE9wdGlvbignaTE4bkJ5cGFzcycpXHJcbiAgcHJvdGVjdGVkIGJ5cGFzczogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBvcHRpb25zOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGlzYWJsZWQ6IGJvb2xlYW47XHJcblxyXG4gIC8vIC0tLSBmcm9tIFNlbGZcclxuICBASW5wdXQoKVxyXG4gIEBJMThOKClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbWVudUZhY3Rvcnk6IElNZW51TW9kZWxGYWN0b3J5O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIEBPdXRwdXQoKVxyXG4gIHByaXZhdGUgaWNvblVSTDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE91dHB1dCgpXHJcbiAgcHJpdmF0ZSBzdHlsZUNsYXNzZXM6IHN0cmluZ1tdO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJpdmF0ZSBhbmNob3JDb21wb25lbnQ6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByaXZhdGUgYW5jaG9yU2VsZWN0b3I6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByaXZhdGUgbWVudU9mZnNldFRvcDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJpdmF0ZSBtZW51T2Zmc2V0TGVmdDogc3RyaW5nO1xyXG5cclxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmUgbmcgQE91dHB1dC5cclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFcclxuICBAT3V0cHV0KCdwaHhMb2FkJylcclxuICBAT3B0aW9uKCdsb2FkJylcclxuICBwcm90ZWN0ZWQgbG9hZEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgLy8gLS0tIGZyb20gU2VsZlxyXG5cclxuICBASTE4TigpXHJcbiAgcHJvdGVjdGVkIG1lbnVNb2RlbDogTWVudU1vZGVsO1xyXG4gIHByb3RlY3RlZCBjb250ZXh0TWVudTogQ29udGV4dE1lbnU7XHJcbiAgcHJvdGVjdGVkIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIGF1dG9Gb2N1czogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSkge1xyXG4gICAgc3VwZXIoZWxlbWVudFJlZik7XHJcblxyXG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlID0gbmVlZEZvY3VzU2VydmljZTtcclxuICAgIHRoaXMuYXV0b0ZvY3VzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUgIT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgdGhpcy5jb250ZXh0TWVudS5zZXRDb250ZXh0KG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICB0aGlzLmNvbnRleHRNZW51LnNldENvbnRleHQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubWVudUZhY3RvcnkgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubWVudUZhY3RvcnkgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHRoaXMubWVudU1vZGVsID0gdGhpcy5tZW51RmFjdG9yeS5jcmVhdGVNZW51TW9kZWwodGhpcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVjcmVhdGVNZW51TW9kZWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uTW9yZUJ1dHRvbkNsaWNrKCRldmVudDogRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmNvbnRleHRNZW51ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBpZiAodGhpcy5jb250ZXh0TWVudS5pc1Nob3coKSkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCk9PntcclxuICAgICAgICAgIHRoaXMuaGlkZU1lbnUoKTtcclxuICAgICAgICB9LCA1MCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGFuY2hvckVsOiBhbnkgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYW5jaG9yQ29tcG9uZW50ICE9PSBudWxsICYmIHRoaXMuYW5jaG9yQ29tcG9uZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGFuY2hvckVsID0gdGhpcy5hbmNob3JDb21wb25lbnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hbmNob3JTZWxlY3RvciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5hbmNob3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGxldCBzZWxlY3RvcjogYW55ID0gJCh0aGlzLmFuY2hvclNlbGVjdG9yKTtcclxuXHJcbiAgICAgICAgICBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBhbmNob3JFbCA9IHNlbGVjdG9yWzBdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG9mZnNldFRvcDogbnVtYmVyID0gMDtcclxuICAgICAgICBsZXQgb2Zmc2V0TGVmdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWVudU9mZnNldFRvcCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tZW51T2Zmc2V0VG9wID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgb2Zmc2V0VG9wID0gdGhpcy5tZW51T2Zmc2V0VG9wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5tZW51T2Zmc2V0TGVmdCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tZW51T2Zmc2V0TGVmdCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIG9mZnNldExlZnQgPSB0aGlzLm1lbnVPZmZzZXRMZWZ0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRvcCA9ICQoYW5jaG9yRWwpLm9mZnNldCgpLnRvcCArICQoYW5jaG9yRWwpLmhlaWdodCgpICsgb2Zmc2V0VG9wOyAgXHJcbiAgICAgICAgbGV0IGxlZnRFbGxpcHNpc0J1dHRvbiA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm9mZnNldCgpLmxlZnQgKyBvZmZzZXRMZWZ0O1xyXG4gICAgICAgIGxldCB3aWR0aEVsbGlwc2lzQnV0dG9uID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkub3V0ZXJXaWR0aCgpO1xyXG4gICAgICAgIGxldCBzZXRMZWZ0ID0gbGVmdEVsbGlwc2lzQnV0dG9uICsgd2lkdGhFbGxpcHNpc0J1dHRvbjsgIFxyXG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvd0F0KHRvcCwgc2V0TGVmdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDb250ZXh0TWVudSgpOiBDb250ZXh0TWVudSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0TWVudTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRDb250ZXh0TWVudShtZW51OiBDb250ZXh0TWVudSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb250ZXh0TWVudSA9IG1lbnU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TWVudU1vZGVsRmFjdG9yeSgpOiBJTWVudU1vZGVsRmFjdG9yeSB7XHJcbiAgICByZXR1cm4gdGhpcy5tZW51RmFjdG9yeTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRNZW51TW9kZWxGYWN0b3J5KG1lbnVGYWN0b3J5OiBJTWVudU1vZGVsRmFjdG9yeSk6IHZvaWQge1xyXG4gICAgdGhpcy5tZW51RmFjdG9yeSA9IG1lbnVGYWN0b3J5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE1lbnVNb2RlbCgpOiBNZW51TW9kZWwge1xyXG4gICAgcmV0dXJuIHRoaXMubWVudU1vZGVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzU2VsZkRhdGFEaXJ0eSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxmU2F2ZURhdGEoZGF0YTogYW55KTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGZSZXNldERhdGEoKTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRvUHJlbG9hZCgpOiBQcm9taXNlPGFueT4geyAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgICAgICAgcmVzb2x2ZShudWxsKTsgICAgIH0pOyAgIH0gIHB1YmxpYyBkb0xvYWRlZCgpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNJY29uVVJMRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5pY29uVVJMID09IG51bGwgfHwgdGhpcy5pY29uVVJMID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEljb25VUkwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmljb25VUkw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U3R5bGVDbGFzc2VzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLnN0eWxlQ2xhc3NlcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoaWRlTWVudSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbnRleHRNZW51ICE9IG51bGwgJiYgdHlwZW9mIHRoaXMuY29udGV4dE1lbnUgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHRoaXMuY29udGV4dE1lbnUuaGlkZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzU2hvd01lbnUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0TWVudS5pc1Nob3coKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0F1dG9Gb2N1cygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmF1dG9Gb2N1cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkZvY3VzKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkxvc3RGb2N1cyhldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZGVNZW51KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgX2RvRm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gZG8gc29tZXRoaW5nIHdoZW4gZm9jdXNcclxuICB9XHJcblxyXG4gIHB1YmxpYyBfZG9Mb3N0Rm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubmVlZEZvY3VzU2VydmljZSAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5yZXNldEZvY3VzaW5nQ29tcG9uZW50KHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=