UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

380 lines (379 loc) 29.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, Input } from '@angular/core'; import { MenuModel } from './model/MenuModel'; import { AbstractMenu } from './AbstractMenu'; import { NeedFocusService } from '../service/NeedFocusService.service'; import { Option } from '../decorator/Option.decorator'; import { I18N } from '../decorator/I18N.decorator'; var /** @type {?} */ TYPE_NAME = "phx-context-menu"; var ContextMenu = /** @class */ (function (_super) { tslib_1.__extends(ContextMenu, _super); function ContextMenu(elementRef, needFocusService) { var _this = _super.call(this, needFocusService) || this; _this.elementRef = elementRef; _this._show = false; _this.autoFocus = true; return _this; } /** * @return {?} */ ContextMenu.prototype.ngOnInit = /** * @return {?} */ function () { this.init(); if (this.autoFocus === null || typeof this.autoFocus === 'undefined') { this.autoFocus = true; } }; /** * @return {?} */ ContextMenu.prototype.init = /** * @return {?} */ function () { if (this.context != null) { this.context.setContextMenu(this); } if (this.nativeElement === undefined) { // remove dom and save them in RAM this.nativeElement = $(this.elementRef.nativeElement).detach(); } this.showMenu(this._show); }; /** * @param {?} isShow * @param {?=} widthSet * @return {?} */ ContextMenu.prototype.showMenu = /** * @param {?} isShow * @param {?=} widthSet * @return {?} */ function (isShow, widthSet) { var _this = this; this._show = isShow; if (this.nativeElement === undefined) { // remove dom and save them in RAM this.nativeElement = $(this.elementRef.nativeElement).detach(); } if (this._show) { if (this.context != null && this.context.getMenuModelFactory() != null) { this.model = this.context.getMenuModelFactory().createMenuModel(this.context); } if (this.needFocusService != null) { if (this.autoFocus) { this.needFocusService.setFocusingComponent(this); } } $(this.elementRef.nativeElement).addClass('show'); setTimeout(function () { $(_this.elementRef.nativeElement).css('opacity', 1); // append dom $("body").append(_this.nativeElement); if (typeof widthSet !== "number") { var /** @type {?} */ left = $(_this.elementRef.nativeElement).offset().left; var /** @type {?} */ width = $(_this.elementRef.nativeElement).width(); $(_this.nativeElement).css('left', (left - width) + "px"); } }, 1); } else { $(this.elementRef.nativeElement).removeClass('show'); $(this.elementRef.nativeElement).css('opacity', 0); if (this.needFocusService != null) { if (this.autoFocus && this.needFocusService.getFocusingComponent() === this) { this.needFocusService.resetFocusingComponent(); } } } }; /** * @param {?} positionX * @param {?} positionY * @param {?=} width * @return {?} */ ContextMenu.prototype.showAt = /** * @param {?} positionX * @param {?} positionY * @param {?=} width * @return {?} */ function (positionX, positionY, width) { if (positionX == null && positionY == null) { return; } if (positionX == null) { positionX = 0; } if (positionY == null) { positionY = 0; } if (this.nativeElement === undefined) { // remove dom and save them in RAM this.nativeElement = $(this.elementRef.nativeElement).detach(); } $(this.nativeElement).css('top', positionX + "px"); $(this.nativeElement).css('left', positionY + "px"); if (width !== null && width !== undefined) { $(this.nativeElement).css('width', width); } this.showMenu(true, width); }; /** * @return {?} */ ContextMenu.prototype.hide = /** * @return {?} */ function () { this.showMenu(false); }; /** * @param {?} $event * @return {?} */ ContextMenu.prototype.onItemClick = /** * @param {?} $event * @return {?} */ function ($event) { if (this.autoFocus) { if (this.needFocusService !== null && this.needFocusService !== undefined) { this.needFocusService.setFocusingComponent(this); } } }; /** * @return {?} */ ContextMenu.prototype.isShow = /** * @return {?} */ function () { return this._show; }; /** * @return {?} */ ContextMenu.prototype.doRenderMenu = /** * @return {?} */ function () { // all item was cleared and items should be set here }; /** * @param {?} dataParent * @return {?} */ ContextMenu.prototype.setDataParent = /** * @param {?} dataParent * @return {?} */ function (dataParent) { this.dataParent = dataParent; }; /** * @return {?} */ ContextMenu.prototype.getDataParent = /** * @return {?} */ function () { return this.dataParent; }; /** * @return {?} */ ContextMenu.prototype.getContext = /** * @return {?} */ function () { return this.context; }; /** * @param {?} context * @return {?} */ ContextMenu.prototype.setContext = /** * @param {?} context * @return {?} */ function (context) { this.context = context; }; /** * @param {?} event * @return {?} */ ContextMenu.prototype.onFocus = /** * @param {?} event * @return {?} */ function (event) { var _this = this; if (this.focusTimeout !== undefined && this.focusTimeout !== null) { clearTimeout(this.focusTimeout); } this.focusTimeout = setTimeout(function () { $(_this.elementRef.nativeElement).find(".fake").focus(); }, 20); }; /** * @param {?} event * @return {?} */ ContextMenu.prototype.onLostFocus = /** * @param {?} event * @return {?} */ function (event) { var _this = this; if (this.lostFocusTimeout !== undefined && this.lostFocusTimeout !== null) { clearTimeout(this.lostFocusTimeout); } this.lostFocusTimeout = setTimeout(function () { _this.showMenu(false); $(_this.elementRef.nativeElement).find(".fake").blur(); }, 400); }; /** * @param {?} autoFocus * @return {?} */ ContextMenu.prototype.setAutoFocus = /** * @param {?} autoFocus * @return {?} */ function (autoFocus) { this.autoFocus = autoFocus; }; /** * @return {?} */ ContextMenu.prototype.isAutoFocus = /** * @return {?} */ function () { return this.autoFocus; }; /** * @param {?} $event * @return {?} */ ContextMenu.prototype._doFocus = /** * @param {?} $event * @return {?} */ function ($event) { // do something when focus if (this.needFocusService !== null && this.needFocusService !== undefined) { this.needFocusService.setFocusingComponent(this); } }; /** * @param {?} $event * @return {?} */ ContextMenu.prototype._doLostFocus = /** * @param {?} $event * @return {?} */ function ($event) { if (this.needFocusService !== null && this.needFocusService.getFocusingComponent() === this) { this.needFocusService.resetFocusingComponent(); } }; ContextMenu.TYPE_NAME = TYPE_NAME; ContextMenu.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: "<div class=\"phx-context-menu\">\n\t<ul *ngIf=\"getModel() != null\">\n\t\t<li *ngFor=\"let item of getModel().items; let i = index\" [class.disable]=\"!item.enable\" (click)=\"onItemClick($event)\"><phx-component-wrapper\n\t\t\t\t[type]=\"item.type\" [handler]=\"getMenuItemHandler()\" [model]=\"item\"\n\t\t\t\t[class.disable]=\"!item.enable\"></phx-component-wrapper></li>\n\t</ul>\n\t<button type=\"button\" class=\"fake\" (focusin)=\"_doFocus($event)\" (blur)=\"_doLostFocus($event)\"></button>\n</div>\n" },] }, ]; /** @nocollapse */ ContextMenu.ctorParameters = function () { return [ { type: ElementRef, }, { type: NeedFocusService, }, ]; }; ContextMenu.propDecorators = { "model": [{ type: Input },], "items": [{ type: Input },], "dataParent": [{ type: Input },], "context": [{ type: Input },], "autoFocus": [{ type: Input },], }; tslib_1.__decorate([ Option(), I18N(), tslib_1.__metadata("design:type", MenuModel) ], ContextMenu.prototype, "model", void 0); tslib_1.__decorate([ Option(), I18N(), tslib_1.__metadata("design:type", Array) ], ContextMenu.prototype, "items", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], ContextMenu.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], ContextMenu.prototype, "context", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ContextMenu.prototype, "autoFocus", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], ContextMenu.prototype, "menuItemHandler", void 0); return ContextMenu; }(AbstractMenu)); export { ContextMenu }; function ContextMenu_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ ContextMenu.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ ContextMenu.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ ContextMenu.propDecorators; /** @type {?} */ ContextMenu.TYPE_NAME; /** @type {?} */ ContextMenu.prototype.model; /** @type {?} */ ContextMenu.prototype.items; /** @type {?} */ ContextMenu.prototype.dataParent; /** @type {?} */ ContextMenu.prototype.context; /** @type {?} */ ContextMenu.prototype.autoFocus; /** @type {?} */ ContextMenu.prototype.menuItemHandler; /** @type {?} */ ContextMenu.prototype.elementRef; /** @type {?} */ ContextMenu.prototype._show; /** @type {?} */ ContextMenu.prototype.nativeElement; /** @type {?} */ ContextMenu.prototype.focusTimeout; /** @type {?} */ ContextMenu.prototype.lostFocusTimeout; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGV4dE1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L0NvbnRleHRNZW51LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLEtBQUssRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU05QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUV2RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBSW5ELHFCQUFNLFNBQVMsR0FBVyxrQkFBa0IsQ0FBQzs7SUFlWix1Q0FBWTtJQXNDM0MscUJBQVksVUFBc0IsRUFBRSxnQkFBa0M7UUFBdEUsWUFDRSxrQkFBTSxnQkFBZ0IsQ0FBQyxTQUl4QjtRQUhDLEtBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLEtBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLEtBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDOztLQUN2Qjs7OztJQUVNLDhCQUFROzs7O1FBQ2IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVosRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDdkI7Ozs7O0lBSUssMEJBQUk7Ozs7UUFDVixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FB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QUFDLGdCQUFnQixLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzVGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQ2hEOzs0QkFoTndDLFNBQVM7O2dCQWZyRCxTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFO29CQUNuQixRQUFRLEVBQUUsU0FBUztvQkFDbkIsUUFBUSxFQUFFLCtmQVFYO2lCQUNBOzs7O2dCQTlCMkIsVUFBVTtnQkFTN0IsZ0JBQWdCOzs7MEJBNEJ0QixLQUFLOzBCQUlMLEtBQUs7K0JBS0wsS0FBSzs0QkFHTCxLQUFLOzhCQUdMLEtBQUs7OztRQWRMLE1BQU0sRUFBRTtRQUNSLElBQUksRUFBRTswQ0FDVSxTQUFTOzs7UUFFekIsTUFBTSxFQUFFO1FBQ1IsSUFBSSxFQUFFOzs7O1FBSU4sTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBTVIsTUFBTSxFQUFFOzBDQUNrQixRQUFROztzQkE1RHJDO0VBK0JpQyxZQUFZO1NBQWhDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgSW5wdXQsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWVudU1vZGVsIH0gZnJvbSAnLi9tb2RlbC9NZW51TW9kZWwnO1xuaW1wb3J0IHsgTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vbW9kZWwvTWVudUl0ZW1Nb2RlbCc7XG5pbXBvcnQgeyBBYnN0cmFjdE1lbnUgfSBmcm9tICcuL0Fic3RyYWN0TWVudSc7XG5pbXBvcnQgeyBJSGFzQ29udGV4dCB9IGZyb20gJy4vSUhhc0NvbnRleHQnO1xuaW1wb3J0IHsgSUNvbnRleHQgfSBmcm9tICcuL0lDb250ZXh0JztcbmltcG9ydCB7IElOZWVkRm9jdXMgfSBmcm9tICcuL0lOZWVkRm9jdXMnO1xuaW1wb3J0IHsgSUhhc0RhdGFQYXJlbnQgfSBmcm9tICcuL0lIYXNEYXRhUGFyZW50JztcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi9JSGFzRGF0YSc7XG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9OZWVkRm9jdXNTZXJ2aWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWJzdHJhY3RNZW51SXRlbSB9IGZyb20gJy4vQWJzdHJhY3RNZW51SXRlbSc7XG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XG5pbXBvcnQgeyBJMThOIH0gZnJvbSAnLi4vZGVjb3JhdG9yL0kxOE4uZGVjb3JhdG9yJztcblxuZGVjbGFyZSB2YXIgJDogYW55O1xuXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4LWNvbnRleHQtbWVudVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LWNvbnRleHQtbWVudVwiPlxuXHQ8dWwgKm5nSWY9XCJnZXRNb2RlbCgpICE9IG51bGxcIj5cblx0XHQ8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0TW9kZWwoKS5pdGVtczsgbGV0IGkgPSBpbmRleFwiIFtjbGFzcy5kaXNhYmxlXT1cIiFpdGVtLmVuYWJsZVwiIChjbGljayk9XCJvbkl0ZW1DbGljaygkZXZlbnQpXCI+PHBoeC1jb21wb25lbnQtd3JhcHBlclxuXHRcdFx0XHRbdHlwZV09XCJpdGVtLnR5cGVcIiBbaGFuZGxlcl09XCJnZXRNZW51SXRlbUhhbmRsZXIoKVwiIFttb2RlbF09XCJpdGVtXCJcblx0XHRcdFx0W2NsYXNzLmRpc2FibGVdPVwiIWl0ZW0uZW5hYmxlXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+PC9saT5cblx0PC91bD5cblx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmYWtlXCIgKGZvY3VzaW4pPVwiX2RvRm9jdXMoJGV2ZW50KVwiIChibHVyKT1cIl9kb0xvc3RGb2N1cygkZXZlbnQpXCI+PC9idXR0b24+XG48L2Rpdj5cbmBcbn0pXG5leHBvcnQgY2xhc3MgQ29udGV4dE1lbnUgZXh0ZW5kcyBBYnN0cmFjdE1lbnUgaW1wbGVtZW50cyBPbkluaXQsIElIYXNDb250ZXh0LCBJTmVlZEZvY3VzLCBJSGFzRGF0YVBhcmVudCB7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcblxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmUgbmcgQElucHV0LlxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdE1lbnVcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIEBJMThOKClcbiAgcHJvdGVjdGVkIG1vZGVsOiBNZW51TW9kZWw7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBASTE4TigpXG4gIHByb3RlY3RlZCBpdGVtczogQWJzdHJhY3RNZW51SXRlbVtdO1xuICAvLyAtLS0gc2VsZlxuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJpdmF0ZSBjb250ZXh0OiBJQ29udGV4dDtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByaXZhdGUgYXV0b0ZvY3VzOiBib29sZWFuO1xuXG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBAT3V0cHV0LlxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmVcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RNZW51XG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgbWVudUl0ZW1IYW5kbGVyOiBGdW5jdGlvbjtcblxuICAvLyAtLS0gc2VsZlxuICBwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgcHJpdmF0ZSBfc2hvdzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBuYXRpdmVFbGVtZW50OiBhbnk7XG4gIHByaXZhdGUgZm9jdXNUaW1lb3V0OiBhbnk7XG4gIHByaXZhdGUgbG9zdEZvY3VzVGltZW91dDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcbiAgICBzdXBlcihuZWVkRm9jdXNTZXJ2aWNlKTtcbiAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgIHRoaXMuX3Nob3cgPSBmYWxzZTtcbiAgICB0aGlzLmF1dG9Gb2N1cyA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0KCk7XG5cbiAgICBpZiAodGhpcy5hdXRvRm9jdXMgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuYXV0b0ZvY3VzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5hdXRvRm9jdXMgPSB0cnVlO1xuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSBpbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbnRleHQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5jb250ZXh0LnNldENvbnRleHRNZW51KHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gcmVtb3ZlIGRvbSBhbmQgc2F2ZSB0aGVtIGluIFJBTVxuICAgICAgdGhpcy5uYXRpdmVFbGVtZW50ID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZGV0YWNoKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93TWVudSh0aGlzLl9zaG93KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd01lbnUoaXNTaG93OiBib29sZWFuLCB3aWR0aFNldD86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3Nob3cgPSBpc1Nob3c7XG5cbiAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHJlbW92ZSBkb20gYW5kIHNhdmUgdGhlbSBpbiBSQU1cbiAgICAgIHRoaXMubmF0aXZlRWxlbWVudCA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmRldGFjaCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zaG93KSB7XG4gICAgICBpZiAodGhpcy5jb250ZXh0ICE9IG51bGwgJiYgdGhpcy5jb250ZXh0LmdldE1lbnVNb2RlbEZhY3RvcnkoKSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmNvbnRleHQuZ2V0TWVudU1vZGVsRmFjdG9yeSgpLmNyZWF0ZU1lbnVNb2RlbCh0aGlzLmNvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5uZWVkRm9jdXNTZXJ2aWNlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnNldEZvY3VzaW5nQ29tcG9uZW50KHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmFkZENsYXNzKCdzaG93Jyk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuY3NzKCdvcGFjaXR5JywgMSk7XG4gICAgICAgIC8vIGFwcGVuZCBkb21cbiAgICAgICAgJChcImJvZHlcIikuYXBwZW5kKHRoaXMubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIGlmICh0eXBlb2Ygd2lkdGhTZXQgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBsZXQgbGVmdCA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm9mZnNldCgpLmxlZnQ7XG4gICAgICAgICAgbGV0IHdpZHRoID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkud2lkdGgoKTtcbiAgICAgICAgICAkKHRoaXMubmF0aXZlRWxlbWVudCkuY3NzKCdsZWZ0JywgKGxlZnQgLSB3aWR0aCkgKyBcInB4XCIpO1xuICAgICAgICB9XG4gICAgICB9LCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkucmVtb3ZlQ2xhc3MoJ3Nob3cnKTtcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmNzcygnb3BhY2l0eScsIDApO1xuXG4gICAgICBpZiAodGhpcy5uZWVkRm9jdXNTZXJ2aWNlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0ZvY3VzICYmIHRoaXMubmVlZEZvY3VzU2VydmljZS5nZXRGb2N1c2luZ0NvbXBvbmVudCgpID09PSB0aGlzKSB7XG4gICAgICAgICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnJlc2V0Rm9jdXNpbmdDb21wb25lbnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzaG93QXQocG9zaXRpb25YOiBudW1iZXIsIHBvc2l0aW9uWTogbnVtYmVyLCB3aWR0aD86IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChwb3NpdGlvblggPT0gbnVsbCAmJiBwb3NpdGlvblkgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocG9zaXRpb25YID09IG51bGwpIHtcbiAgICAgIHBvc2l0aW9uWCA9IDA7XG4gICAgfVxuICAgIGlmIChwb3NpdGlvblkgPT0gbnVsbCkge1xuICAgICAgcG9zaXRpb25ZID0gMDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHJlbW92ZSBkb20gYW5kIHNhdmUgdGhlbSBpbiBSQU1cbiAgICAgIHRoaXMubmF0aXZlRWxlbWVudCA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmRldGFjaCgpO1xuICAgIH1cblxuICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5jc3MoJ3RvcCcsIHBvc2l0aW9uWCArIFwicHhcIik7XG4gICAgJCh0aGlzLm5hdGl2ZUVsZW1lbnQpLmNzcygnbGVmdCcsIHBvc2l0aW9uWSArIFwicHhcIik7XG5cbiAgICBpZiAod2lkdGggIT09IG51bGwgJiYgd2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgJCh0aGlzLm5hdGl2ZUVsZW1lbnQpLmNzcygnd2lkdGgnLCB3aWR0aCk7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93TWVudSh0cnVlLCB3aWR0aCk7XG4gIH1cblxuICBwdWJsaWMgaGlkZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dNZW51KGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkl0ZW1DbGljaygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b0ZvY3VzKSB7XG4gICAgICBpZiAodGhpcy5uZWVkRm9jdXNTZXJ2aWNlICE9PSBudWxsICYmIHRoaXMubmVlZEZvY3VzU2VydmljZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5zZXRGb2N1c2luZ0NvbXBvbmVudCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNTaG93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93O1xuICB9XG5cbiAgcHVibGljIGRvUmVuZGVyTWVudSgpOiB2b2lkIHtcbiAgICAvLyBhbGwgaXRlbSB3YXMgY2xlYXJlZCBhbmQgaXRlbXMgc2hvdWxkIGJlIHNldCBoZXJlXG4gIH1cblxuICBwdWJsaWMgc2V0RGF0YVBhcmVudChkYXRhUGFyZW50OiBJSGFzRGF0YSkge1xuICAgIHRoaXMuZGF0YVBhcmVudCA9IGRhdGFQYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0YVBhcmVudCgpOiBJSGFzRGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb250ZXh0KCk6IElDb250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0O1xuICB9XG5cbiAgcHVibGljIHNldENvbnRleHQoY29udGV4dDogSUNvbnRleHQpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAgcHVibGljIG9uRm9jdXMoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvY3VzVGltZW91dCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZm9jdXNUaW1lb3V0ICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5mb2N1c1RpbWVvdXQpO1xuICAgIH1cblxuICAgIHRoaXMuZm9jdXNUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKFwiLmZha2VcIikuZm9jdXMoKTtcbiAgICB9LCAyMCk7XG4gIH1cblxuICBwdWJsaWMgb25Mb3N0Rm9jdXMoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvc3RGb2N1c1RpbWVvdXQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmxvc3RGb2N1c1RpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmxvc3RGb2N1c1RpbWVvdXQpO1xuICAgIH1cblxuICAgIHRoaXMubG9zdEZvY3VzVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93TWVudShmYWxzZSk7XG4gICAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKFwiLmZha2VcIikuYmx1cigpO1xuICAgIH0sIDQwMCk7XG4gIH1cblxuICBwdWJsaWMgc2V0QXV0b0ZvY3VzKGF1dG9Gb2N1czogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuYXV0b0ZvY3VzID0gYXV0b0ZvY3VzO1xuICB9XG5cbiAgcHVibGljIGlzQXV0b0ZvY3VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmF1dG9Gb2N1cztcbiAgfVxuXG4gIHB1YmxpYyBfZG9Gb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgLy8gZG8gc29tZXRoaW5nIHdoZW4gZm9jdXNcbiAgICBpZiAodGhpcy5uZWVkRm9jdXNTZXJ2aWNlICE9PSBudWxsICYmIHRoaXMubmVlZEZvY3VzU2VydmljZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2Uuc2V0Rm9jdXNpbmdDb21wb25lbnQodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIF9kb0xvc3RGb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubmVlZEZvY3VzU2VydmljZSAhPT0gbnVsbCAmJiB0aGlzLm5lZWRGb2N1c1NlcnZpY2UuZ2V0Rm9jdXNpbmdDb21wb25lbnQoKSA9PT0gdGhpcykge1xuICAgICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnJlc2V0Rm9jdXNpbmdDb21wb25lbnQoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==