UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

847 lines (846 loc) 62.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { EventEmitter } from '@angular/core'; import { AbstractSelectOneItem } from './AbstractSelectOneItem'; import { Option } from '../../../decorator/Option.decorator'; import { BEFORE_SHOW_EVENT, SHOW_EVENT, BEFORE_HIDE_EVENT, HIDE_EVENT, BEFORE_CLICK_EVENT, CLICK_EVENT } from '../../../share/CustomEventType'; import { EventUtils } from '../../../share/utils/EventUtils'; var /** @type {?} */ LEFT = "left"; var /** @type {?} */ RIGHT = "right"; var /** @type {?} */ CENTER = "center"; var /** @type {?} */ AUTO_HEIGHT_MIN_ITEMS = 5; var /** @type {?} */ POPUP_DISPLAY_DELAY = 10; /** * @abstract */ var AbstractSimpleDropdown = /** @class */ (function (_super) { tslib_1.__extends(AbstractSimpleDropdown, _super); function AbstractSimpleDropdown(needFocusService, elementRef, phloxAppInfoService) { var _this = _super.call(this, elementRef, needFocusService) || this; _this.beforeClickEvent = new EventEmitter(); _this.clickEvent = new EventEmitter(); _this.beforeShowEvent = new EventEmitter(); _this.showEvent = new EventEmitter(); _this.beforeHideEvent = new EventEmitter(); _this.hideEvent = new EventEmitter(); _this._isItemClick = false; _this.needFocusService = needFocusService; phloxAppInfoService.getAppInfo().then(function (info) { _this.phloxAppInfo = info; }); return _this; } Object.defineProperty(AbstractSimpleDropdown.prototype, "align", { get: /** * @return {?} */ function () { if (this._align === null || typeof this._align === 'undefined') { return LEFT; } return this._align; }, set: /** * @param {?} align * @return {?} */ function (align) { if (align !== null && typeof align === 'string') { align = align.toLowerCase(); } if (align === LEFT || align === RIGHT || align === CENTER) { this._align = align; } else { this._align = null; } }, enumerable: true, configurable: true }); /** * @param {?} changes * @return {?} */ AbstractSimpleDropdown.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { var _this = this; // fix bug when set selected before item is not loaded if (changes['items'] !== null && typeof changes['items'] !== 'undefined') { var /** @type {?} */ oldType = changes['items'].previousValue; var /** @type {?} */ newType = changes['items'].currentValue; var /** @type {?} */ oldSize = (oldType !== null && typeof oldType !== 'undefined' && Array.isArray(oldType)) ? oldType.length : 0; var /** @type {?} */ newSize = (newType !== null && typeof newType !== 'undefined' && Array.isArray(newType)) ? newType.length : 0; if (oldSize !== newSize) { if (this.dataParent !== null && this.dataParent !== undefined) { // fix bug setData but still has a bug this.comp.setData() in ngOnInit setTimeout(function () { _this.loadedItems(); }, 1); } else { this.loadedItems(); } } } }; /** * @return {?} */ AbstractSimpleDropdown.prototype.getSelectItemHeight = /** * @return {?} */ function () { var /** @type {?} */ selector = this.getDropdownPopupSelector(); return $(this.elementRef.nativeElement).find(selector + ' > :eq(0)').outerHeight(); }; /** * @return {?} */ AbstractSimpleDropdown.prototype.scrollToSelectedIndex = /** * @return {?} */ function () { var _this = this; return new Promise(function (resolve, reject) { var /** @type {?} */ selectedIndex = _this.getSelectedIndex(); if (selectedIndex === null || selectedIndex === undefined || selectedIndex < 0) { selectedIndex = 0; } var /** @type {?} */ selector = _this.getDropdownPopupSelector(); var /** @type {?} */ ele = $(_this.elementRef.nativeElement).find(selector); // Get DOM element of selected item. var /** @type {?} */ selectedEle = $((ele.children().length > selectedIndex) ? ele.children()[selectedIndex] : ele.children()[ele.children().length - 1]); // Scroll to selected item top relative to its parent. var /** @type {?} */ h = selectedEle.position().top + ele.scrollTop(); ele.stop().animate({ scrollTop: h }, 1, 'swing', function () { ele.scrollTop(h); resolve(); }); }); }; /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ AbstractSimpleDropdown.prototype.doShow = /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeShowEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.show = true; return _this.resizeDropdownPopup().then(function () { return _this.scrollToSelectedIndex(); }).then(function () { if (_this.needFocusService) { _this.needFocusService.setFocusingComponent(_this, $event); } }).catch(function () { if (_this.needFocusService) { _this.needFocusService.setFocusingComponent(_this, $event); } }); }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeShowEvent($event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitShowEvent($event); }, function ($event) { // doPrevented }); }; /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ AbstractSimpleDropdown.prototype.doHide = /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeHideEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.show = false; }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeHideEvent($event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitHideEvent($event); }, function ($event) { // doPrevented }); }; /** * @return {?} */ AbstractSimpleDropdown.prototype.resizeDropdownPopup = /** * @return {?} */ function () { var _this = this; return new Promise(function (resolve, reject) { // Delay to let DOM update first to be able to get its offset().top and its size. setTimeout(function () { var /** @type {?} */ popup = $(_this.elementRef.nativeElement).find(_this.getDropdownPopupSelector()); if (_this.dropdownHeight !== null && _this.dropdownHeight !== undefined && _this.dropdownHeight !== '') { // If dropdown height is explicitly defined, do nothing & reset element's css max-height. popup.css({ "max-height": undefined }); resolve(); return; } var /** @type {?} */ popupTop = popup.offset().top; if (!popupTop) { popupTop = 0; } var /** @type {?} */ wndTop = $(window).scrollTop(); if (!wndTop) { wndTop = 0; } var /** @type {?} */ screenTop = popupTop - wndTop; var /** @type {?} */ autoHeight = $(window).height() - screenTop; if (!autoHeight) { autoHeight = 0; } var /** @type {?} */ itemHeight = _this.getSelectItemHeight(); var /** @type {?} */ minAutoHeight = AUTO_HEIGHT_MIN_ITEMS * itemHeight; if (autoHeight < minAutoHeight) { autoHeight = minAutoHeight; } popup.css({ "max-height": autoHeight + 'px' }); resolve(); }, POPUP_DISPLAY_DELAY); }); }; /** * @param {?} $event * @return {?} */ AbstractSimpleDropdown.prototype.emitBeforeClickEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ sItem = this.getSelectedItem(); var /** @type {?} */ sIndex = this.getSelectedIndex(); var /** @type {?} */ data = { item: sItem, index: sIndex }; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event); this.beforeClickEvent.emit(ev); }; /** * @param {?} $event * @return {?} */ AbstractSimpleDropdown.prototype.emitClickEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ sItem = this.getSelectedItem(); var /** @type {?} */ sIndex = this.getSelectedIndex(); var /** @type {?} */ data = { item: sItem, index: sIndex }; var /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event); this.clickEvent.emit(ev); }; /** * @param {?} $event * @return {?} */ AbstractSimpleDropdown.prototype.emitBeforeShowEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ sItem = this.getSelectedItem(); var /** @type {?} */ sIndex = this.getSelectedIndex(); var /** @type {?} */ data = { item: sItem, index: sIndex }; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_SHOW_EVENT, this, data, $event); this.beforeShowEvent.emit(ev); }; /** * @param {?} $event * @return {?} */ AbstractSimpleDropdown.prototype.emitShowEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ sItem = this.getSelectedItem(); var /** @type {?} */ sIndex = this.getSelectedIndex(); var /** @type {?} */ data = { item: sItem, index: sIndex }; var /** @type {?} */ ev = EventUtils.newCustomEvent(SHOW_EVENT, this, data, $event); this.showEvent.emit(ev); }; /** * @param {?} $event * @return {?} */ AbstractSimpleDropdown.prototype.emitBeforeHideEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ sItem = this.getSelectedItem(); var /** @type {?} */ sIndex = this.getSelectedIndex(); var /** @type {?} */ data = { item: sItem, index: sIndex }; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_HIDE_EVENT, this, data, $event); this.beforeHideEvent.emit(ev); }; /** * @param {?} $event * @return {?} */ AbstractSimpleDropdown.prototype.emitHideEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ sItem = this.getSelectedItem(); var /** @type {?} */ sIndex = this.getSelectedIndex(); var /** @type {?} */ data = { item: sItem, index: sIndex }; var /** @type {?} */ ev = EventUtils.newCustomEvent(HIDE_EVENT, this, data, $event); this.hideEvent.emit(ev); }; /** * @return {?} */ AbstractSimpleDropdown.prototype.getUIUpdateInterval = /** * @return {?} */ function () { if (this.phloxAppInfo === null || this.phloxAppInfo === undefined) { return 600; } if (this.phloxAppInfo.settings === null || this.phloxAppInfo.settings === undefined) { return 600; } if (this.phloxAppInfo.settings.UI_ANIMATE_INTERVAL === null || this.phloxAppInfo.settings.UI_ANIMATE_INTERVAL === undefined) { return 600; } return this.phloxAppInfo.settings.UI_ANIMATE_INTERVAL; }; /** * @param {?} $event * @return {?} */ AbstractSimpleDropdown.prototype.doFocus = /** * @param {?} $event * @return {?} */ function ($event) { }; /** * @param {?} $event * @return {?} */ AbstractSimpleDropdown.prototype.doLostFocus = /** * @param {?} $event * @return {?} */ function ($event) { this.setShow(false); }; /** * @param {?} $event * @return {?} */ AbstractSimpleDropdown.prototype.onFocusing = /** * @param {?} $event * @return {?} */ function ($event) { this.needFocusService.setFocusingComponent(this, $event); }; /** * @param {?} $event * @return {?} */ AbstractSimpleDropdown.prototype.onLostFocusing = /** * @param {?} $event * @return {?} */ function ($event) { var _this = this; if ($event !== undefined && $event !== null) { $event.preventDefault(); } if (this._itemLostFocusingTimeout !== null && typeof this._itemLostFocusingTimeout !== 'undefined') { clearTimeout(this._itemLostFocusingTimeout); this._itemLostFocusingTimeout = null; } this._itemLostFocusingTimeout = setTimeout(function () { if (!_this._isItemClick) { _this.doBlur($event); _this.needFocusService.resetFocusingComponent($event); } _this._isItemClick = false; }, 130); // if dropdown not hide try to adjust this value }; /** * @param {?} $event * @param {?} index * @return {?} */ AbstractSimpleDropdown.prototype.onSelectItemClicked = /** * @param {?} $event * @param {?} index * @return {?} */ function ($event, index) { this._isItemClick = true; this.setSelectedIndex(index, $event, true); // Auto hide popup when select item is clicked. this.setShow(false); }; /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ AbstractSimpleDropdown.prototype.click = /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (this.isReadOnly()) { return; } if (this.isDisabled()) { return; } if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.setShow(true); }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeClickEvent($event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitClickEvent($event); }, function ($event) { // doPrevented }); }; /** * @return {?} */ AbstractSimpleDropdown.prototype.isShow = /** * @return {?} */ function () { return this.show; }; /** * @param {?} show * @param {?=} $event * @param {?=} fireEvent * @return {?} */ AbstractSimpleDropdown.prototype.setShow = /** * @param {?} show * @param {?=} $event * @param {?=} fireEvent * @return {?} */ function (show, $event, fireEvent) { if (show === null || typeof show !== 'boolean') { show = false; } if (this.show === show) { return; } if (show) { this.doShow($event, fireEvent); } else { this.doHide($event, fireEvent); } }; /** * @return {?} */ AbstractSimpleDropdown.prototype.getAlign = /** * @return {?} */ function () { return this.align; }; /** * @param {?} align * @return {?} */ AbstractSimpleDropdown.prototype.setAlign = /** * @param {?} align * @return {?} */ function (align) { this.align = align; }; /** * @return {?} */ AbstractSimpleDropdown.prototype.getDropdownWidth = /** * @return {?} */ function () { return this.dropdownWidth; }; /** * @param {?} dropdownWidth * @return {?} */ AbstractSimpleDropdown.prototype.setDropdownWidth = /** * @param {?} dropdownWidth * @return {?} */ function (dropdownWidth) { this.dropdownWidth = dropdownWidth; }; /** * @return {?} */ AbstractSimpleDropdown.prototype.getDropdownHeight = /** * @return {?} */ function () { return this.dropdownHeight; }; /** * @param {?} dropdownHeight * @return {?} */ AbstractSimpleDropdown.prototype.setDropdownHeight = /** * @param {?} dropdownHeight * @return {?} */ function (dropdownHeight) { this.dropdownHeight = dropdownHeight; }; /** * @return {?} */ AbstractSimpleDropdown.prototype.getWidth = /** * @return {?} */ function () { return this.width; }; /** * @param {?} width * @return {?} */ AbstractSimpleDropdown.prototype.setWidth = /** * @param {?} width * @return {?} */ function (width) { this.width = width; }; /** * @return {?} */ AbstractSimpleDropdown.prototype.getHeight = /** * @return {?} */ function () { return this.height; }; /** * @param {?} height * @return {?} */ AbstractSimpleDropdown.prototype.setHeight = /** * @param {?} height * @return {?} */ function (height) { this.height = height; }; /** * @return {?} */ AbstractSimpleDropdown.prototype.getBeforeClickEvent = /** * @return {?} */ function () { return this.beforeClickEvent; }; /** * @param {?} event * @return {?} */ AbstractSimpleDropdown.prototype.setBeforeClickEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeClickEvent = event; }; /** * @return {?} */ AbstractSimpleDropdown.prototype.getClickEvent = /** * @return {?} */ function () { return this.clickEvent; }; /** * @param {?} event * @return {?} */ AbstractSimpleDropdown.prototype.setClickEvent = /** * @param {?} event * @return {?} */ function (event) { this.clickEvent = event; }; /** * @return {?} */ AbstractSimpleDropdown.prototype.getBeforeShowEvent = /** * @return {?} */ function () { return this.beforeShowEvent; }; /** * @param {?} event * @return {?} */ AbstractSimpleDropdown.prototype.setBeforeShowEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeShowEvent = event; }; /** * @return {?} */ AbstractSimpleDropdown.prototype.getShowEvent = /** * @return {?} */ function () { return this.showEvent; }; /** * @param {?} event * @return {?} */ AbstractSimpleDropdown.prototype.setShowEvent = /** * @param {?} event * @return {?} */ function (event) { this.showEvent = event; }; /** * @return {?} */ AbstractSimpleDropdown.prototype.getBeforeHideEvent = /** * @return {?} */ function () { return this.beforeHideEvent; }; /** * @param {?} event * @return {?} */ AbstractSimpleDropdown.prototype.setBeforeHideEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeHideEvent = event; }; /** * @return {?} */ AbstractSimpleDropdown.prototype.getHideEvent = /** * @return {?} */ function () { return this.hideEvent; }; /** * @param {?} event * @return {?} */ AbstractSimpleDropdown.prototype.setHideEvent = /** * @param {?} event * @return {?} */ function (event) { this.hideEvent = event; }; /** * @param {?} data * @return {?} */ AbstractSimpleDropdown.prototype.setData = /** * @param {?} data * @return {?} */ function (data) { _super.prototype.setData.call(this, data); this.setPreloadData(data); }; AbstractSimpleDropdown.LEFT = LEFT; AbstractSimpleDropdown.RIGHT = RIGHT; AbstractSimpleDropdown.CENTER = CENTER; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], AbstractSimpleDropdown.prototype, "width", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], AbstractSimpleDropdown.prototype, "height", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], AbstractSimpleDropdown.prototype, "dropdownWidth", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], AbstractSimpleDropdown.prototype, "dropdownHeight", void 0); tslib_1.__decorate([ Option('beforeClick'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractSimpleDropdown.prototype, "beforeClickEvent", void 0); tslib_1.__decorate([ Option('click'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractSimpleDropdown.prototype, "clickEvent", void 0); tslib_1.__decorate([ Option('beforeShow'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractSimpleDropdown.prototype, "beforeShowEvent", void 0); tslib_1.__decorate([ Option('show'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractSimpleDropdown.prototype, "showEvent", void 0); tslib_1.__decorate([ Option('beforeHide'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractSimpleDropdown.prototype, "beforeHideEvent", void 0); tslib_1.__decorate([ Option('hide'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractSimpleDropdown.prototype, "hideEvent", void 0); return AbstractSimpleDropdown; }(AbstractSelectOneItem)); export { AbstractSimpleDropdown }; function AbstractSimpleDropdown_tsickle_Closure_declarations() { /** @type {?} */ AbstractSimpleDropdown.LEFT; /** @type {?} */ AbstractSimpleDropdown.RIGHT; /** @type {?} */ AbstractSimpleDropdown.CENTER; /** @type {?} */ AbstractSimpleDropdown.prototype.width; /** @type {?} */ AbstractSimpleDropdown.prototype.height; /** @type {?} */ AbstractSimpleDropdown.prototype.dropdownWidth; /** @type {?} */ AbstractSimpleDropdown.prototype.dropdownHeight; /** @type {?} */ AbstractSimpleDropdown.prototype.beforeClickEvent; /** @type {?} */ AbstractSimpleDropdown.prototype.clickEvent; /** @type {?} */ AbstractSimpleDropdown.prototype.beforeShowEvent; /** @type {?} */ AbstractSimpleDropdown.prototype.showEvent; /** @type {?} */ AbstractSimpleDropdown.prototype.beforeHideEvent; /** @type {?} */ AbstractSimpleDropdown.prototype.hideEvent; /** @type {?} */ AbstractSimpleDropdown.prototype.needFocusService; /** @type {?} */ AbstractSimpleDropdown.prototype.phloxAppInfo; /** @type {?} */ AbstractSimpleDropdown.prototype._align; /** @type {?} */ AbstractSimpleDropdown.prototype._isItemClick; /** @type {?} */ AbstractSimpleDropdown.prototype._itemLostFocusingTimeout; /** @type {?} */ AbstractSimpleDropdown.prototype.show; /** * @abstract * @param {?} $event * @return {?} */ AbstractSimpleDropdown.prototype.doBlur = function ($event) { }; /** * @abstract * @return {?} */ AbstractSimpleDropdown.prototype.getDropdownPopupSelector = function () { }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RTaW1wbGVEcm9wZG93bi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9BYnN0cmFjdFNpbXBsZURyb3Bkb3duLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFzRCxZQUFZLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBTWhFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUc3RCxPQUFPLEVBQ0wsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBRTlGLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTdELHFCQUFNLElBQUksR0FBVyxNQUFNLENBQUM7QUFDNUIscUJBQU0sS0FBSyxHQUFXLE9BQU8sQ0FBQztBQUM5QixxQkFBTSxNQUFNLEdBQVcsUUFBUSxDQUFDO0FBQ2hDLHFCQUFNLHFCQUFxQixHQUFXLENBQUMsQ0FBQztBQUN4QyxxQkFBTSxtQkFBbUIsR0FBVyxFQUFFLENBQUM7Ozs7O0lBRWMsa0RBQXFCO0lBdUR4RSxnQ0FBWSxnQkFBa0MsRUFBRSxVQUFzQixFQUFFLG1CQUF3QztRQUFoSCxZQUNFLGtCQUFNLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxTQWdCcEM7UUFkQyxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxLQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckMsS0FBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDLEtBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUs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OztRQUNqQyxNQUFNLENBQUMsWUFBWSxDQUFDOzBDQUNNLFlBQVk7OztRQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDOzBDQUNNLFlBQVk7OztRQUNoQyxNQUFNLENBQUMsWUFBWSxDQUFDOzBDQUNNLFlBQVk7OztRQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDOzBDQUNNLFlBQVk7O2lDQS9DbkM7RUFzQnFELHFCQUFxQjtTQUFwRCxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgVHlwZSwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RTZWxlY3RPbmVJdGVtIH0gZnJvbSAnLi9BYnN0cmFjdFNlbGVjdE9uZUl0ZW0nO1xuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uLy4uL0lOZWVkRm9jdXMnO1xuaW1wb3J0IHsgSUhhc0RhdGEgfSBmcm9tICcuLi8uLi9JSGFzRGF0YSc7XG5pbXBvcnQgeyBJRGF0YUNvbXBhcmF0b3IgfSBmcm9tICcuLi8uLi9JRGF0YUNvbXBhcmF0b3InO1xuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSwgUGhsb3hBcHBJbmZvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2Uvc2VydmljZXMnO1xuaW1wb3J0IHsgRGVmYXVsdFNlbGVjdEl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVsL0RlZmF1bHRTZWxlY3RJdGVtTW9kZWwnO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgUGhsb3hBcHBJbmZvIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50L21vZGVsL1BobG94QXBwSW5mbyc7XG5pbXBvcnQgeyBJU2VsZWN0SXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvSVNlbGVjdEl0ZW1Nb2RlbCc7XG5pbXBvcnQge1xuICBCRUZPUkVfU0hPV19FVkVOVCwgU0hPV19FVkVOVCwgQkVGT1JFX0hJREVfRVZFTlQsIEhJREVfRVZFTlQsIEJFRk9SRV9DTElDS19FVkVOVCwgQ0xJQ0tfRVZFTlQsXG4gIEJFRk9SRV9TRUxFQ1RfRVZFTlQsIFNFTEVDVF9FVkVOVFxufSBmcm9tICcuLi8uLi8uLi9zaGFyZS9DdXN0b21FdmVudFR5cGUnO1xuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMnO1xuXG5jb25zdCBMRUZUOiBzdHJpbmcgPSBcImxlZnRcIjtcbmNvbnN0IFJJR0hUOiBzdHJpbmcgPSBcInJpZ2h0XCI7XG5jb25zdCBDRU5URVI6IHN0cmluZyA9IFwiY2VudGVyXCI7XG5jb25zdCBBVVRPX0hFSUdIVF9NSU5fSVRFTVM6IG51bWJlciA9IDU7XG5jb25zdCBQT1BVUF9ESVNQTEFZX0RFTEFZOiBudW1iZXIgPSAxMDtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2ltcGxlRHJvcGRvd24gZXh0ZW5kcyBBYnN0cmFjdFNlbGVjdE9uZUl0ZW0gaW1wbGVtZW50cyBPbkluaXQsIElOZWVkRm9jdXMsIE9uQ2hhbmdlcyB7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBMRUZUOiBzdHJpbmcgPSBMRUZUO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJJR0hUOiBzdHJpbmcgPSBSSUdIVDtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDRU5URVI6IHN0cmluZyA9IENFTlRFUjtcblxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIHdpZHRoOiBzdHJpbmc7XG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaGVpZ2h0OiBzdHJpbmc7XG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZHJvcGRvd25XaWR0aDogc3RyaW5nO1xuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRyb3Bkb3duSGVpZ2h0OiBzdHJpbmc7XG4gIEBPcHRpb24oJ2JlZm9yZUNsaWNrJylcbiAgcHJvdGVjdGVkIGJlZm9yZUNsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdjbGljaycpXG4gIHByb3RlY3RlZCBjbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignYmVmb3JlU2hvdycpXG4gIHByb3RlY3RlZCBiZWZvcmVTaG93RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdzaG93JylcbiAgcHJvdGVjdGVkIHNob3dFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZUhpZGUnKVxuICBwcm90ZWN0ZWQgYmVmb3JlSGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignaGlkZScpXG4gIHByb3RlY3RlZCBoaWRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gIHByb3RlY3RlZCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgcGhsb3hBcHBJbmZvOiBQaGxveEFwcEluZm87XG5cbiAgcHJpdmF0ZSBfYWxpZ246IHN0cmluZztcbiAgcHJpdmF0ZSBfaXNJdGVtQ2xpY2s6IGJvb2xlYW47XG4gIHByaXZhdGUgX2l0ZW1Mb3N0Rm9jdXNpbmdUaW1lb3V0OiBhbnk7XG5cbiAgcHJpdmF0ZSBzaG93OiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBzZXQgYWxpZ24oYWxpZ246IHN0cmluZykge1xuICAgIGlmIChhbGlnbiAhPT0gbnVsbCAmJiB0eXBlb2YgYWxpZ24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBhbGlnbiA9IGFsaWduLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKGFsaWduID09PSBMRUZUIHx8IGFsaWduID09PSBSSUdIVCB8fCBhbGlnbiA9PT0gQ0VOVEVSKSB7XG4gICAgICB0aGlzLl9hbGlnbiA9IGFsaWduO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hbGlnbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhbGlnbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9hbGlnbiA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5fYWxpZ24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gTEVGVDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FsaWduO1xuICB9XG5cbiAgY29uc3RydWN0b3IobmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSwgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcGhsb3hBcHBJbmZvU2VydmljZTogUGhsb3hBcHBJbmZvU2VydmljZSkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2UpO1xuXG4gICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZVNob3dFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnNob3dFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZUhpZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmhpZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHRoaXMuX2lzSXRlbUNsaWNrID0gZmFsc2U7XG5cbiAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2UgPSBuZWVkRm9jdXNTZXJ2aWNlO1xuXG4gICAgcGhsb3hBcHBJbmZvU2VydmljZS5nZXRBcHBJbmZvKCkudGhlbigoaW5mbykgPT4ge1xuICAgICAgdGhpcy5waGxveEFwcEluZm8gPSBpbmZvO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSkge1xuICAgIC8vIGZpeCBidWcgd2hlbiBzZXQgc2VsZWN0ZWQgYmVmb3JlIGl0ZW0gaXMgbm90IGxvYWRlZFxuICAgIGlmIChjaGFuZ2VzWydpdGVtcyddICE9PSBudWxsICYmIHR5cGVvZiBjaGFuZ2VzWydpdGVtcyddICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IG9sZFR5cGUgPSBjaGFuZ2VzWydpdGVtcyddLnByZXZpb3VzVmFsdWU7XG4gICAgICBsZXQgbmV3VHlwZTogYW55ID0gY2hhbmdlc1snaXRlbXMnXS5jdXJyZW50VmFsdWU7XG5cbiAgICAgIGxldCBvbGRTaXplID0gKG9sZFR5cGUgIT09IG51bGwgJiYgdHlwZW9mIG9sZFR5cGUgIT09ICd1bmRlZmluZWQnICYmIEFycmF5LmlzQXJyYXkob2xkVHlwZSkpID8gb2xkVHlwZS5sZW5ndGggOiAwO1xuICAgICAgbGV0IG5ld1NpemUgPSAobmV3VHlwZSAhPT0gbnVsbCAmJiB0eXBlb2YgbmV3VHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheShuZXdUeXBlKSkgPyBuZXdUeXBlLmxlbmd0aCA6IDA7XG5cbiAgICAgIGlmIChvbGRTaXplICE9PSBuZXdTaXplKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFQYXJlbnQgIT09IG51bGwgJiYgdGhpcy5kYXRhUGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBmaXggYnVnIHNldERhdGEgYnV0IHN0aWxsIGhhcyBhIGJ1ZyB0aGlzLmNvbXAuc2V0RGF0YSgpIGluIG5nT25Jbml0XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRlZEl0ZW1zKCk7XG4gICAgICAgICAgfSwgMSk7XG4gICAgICAgIH1lbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWRlZEl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdEl0ZW1IZWlnaHQoKTogbnVtYmVyIHtcbiAgICBsZXQgc2VsZWN0b3I6IHN0cmluZyA9IHRoaXMuZ2V0RHJvcGRvd25Qb3B1cFNlbGVjdG9yKCk7XG5cbiAgICByZXR1cm4gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZChzZWxlY3RvciArICcgPiA6ZXEoMCknKS5vdXRlckhlaWdodCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxUb1NlbGVjdGVkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzZWxlY3RlZEluZGV4OiBudW1iZXIgPSB0aGlzLmdldFNlbGVjdGVkSW5kZXgoKTtcbiAgICAgIGlmIChzZWxlY3RlZEluZGV4ID09PSBudWxsIHx8IHNlbGVjdGVkSW5kZXggPT09IHVuZGVmaW5lZCB8fCBzZWxlY3RlZEluZGV4IDwgMCkge1xuICAgICAgICBzZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgIH1cblxuICAgICAgbGV0IHNlbGVjdG9yOiBzdHJpbmcgPSB0aGlzLmdldERyb3Bkb3duUG9wdXBTZWxlY3RvcigpO1xuXG4gICAgICBsZXQgZWxlOiBhbnkgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKHNlbGVjdG9yKTtcblxuICAgICAgLy8gR2V0IERPTSBlbGVtZW50IG9mIHNlbGVjdGVkIGl0ZW0uXG4gICAgICBsZXQgc2VsZWN0ZWRFbGU6IGFueSA9ICQoKGVsZS5jaGlsZHJlbigpLmxlbmd0aCA+IHNlbGVjdGVkSW5kZXgpID8gZWxlLmNoaWxkcmVuKClbc2VsZWN0ZWRJbmRleF0gOiBlbGUuY2hpbGRyZW4oKVtlbGUuY2hpbGRyZW4oKS5sZW5ndGggLSAxXSk7XG5cbiAgICAgIC8vIFNjcm9sbCB0byBzZWxlY3RlZCBpdGVtIHRvcCByZWxhdGl2ZSB0byBpdHMgcGFyZW50LlxuICAgICAgbGV0IGg6IG51bWJlciA9IHNlbGVjdGVkRWxlLnBvc2l0aW9uKCkudG9wICsgZWxlLnNjcm9sbFRvcCgpO1xuXG4gICAgICBlbGUuc3RvcCgpLmFuaW1hdGUoeyBzY3JvbGxUb3A6IGggfSwgMSwgJ3N3aW5nJywgKCkgPT4ge1xuICAgICAgICBlbGUuc2Nyb2xsVG9wKGgpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkb1Nob3coJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIEV2ZW50VXRpbHMuaGFuZGxlQnJvd3NlckV2ZW50KHRoaXMsICdiZWZvcmVTaG93RXZlbnQnLCAkZXZlbnQsI