com.phloxui
Version:
PhloxUI Ng2+ Framework
380 lines (379 loc) • 29.1 kB
JavaScript
/**
* @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==