UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

559 lines (558 loc) 49.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { EventEmitter } from '@angular/core'; import { AbstractSelectItems } from './AbstractSelectItems'; 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'; const /** @type {?} */ LEFT = "left"; const /** @type {?} */ RIGHT = "right"; const /** @type {?} */ CENTER = "center"; /** * @abstract */ export class AbstractMultiDropdown extends AbstractSelectItems { /** * @param {?} needFocusService * @param {?} elementRef * @param {?} phloxAppInfoService */ constructor(needFocusService, elementRef, phloxAppInfoService) { super(elementRef, needFocusService); 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.selectEvent = new EventEmitter(); this._isItemClick = false; phloxAppInfoService.getAppInfo().then((info) => { this.phloxAppInfo = info; }); } /** * @param {?} align * @return {?} */ set align(align) { if (align === LEFT || align === RIGHT || align === CENTER) { this._align = align; return; } this._align = null; } /** * @return {?} */ get align() { if (this._align === null || typeof this._align === 'undefined') { return LEFT; } return this._align; } /** * @return {?} */ ngOnInit() { super.ngOnInit(); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { // fix bug when set selected before item is not loaded if (changes['items'] !== null && typeof changes['items'] !== 'undefined') { let /** @type {?} */ oldType = changes['items'].previousValue; let /** @type {?} */ newType = changes['items'].currentValue; let /** @type {?} */ oldSize = (oldType !== null && typeof oldType !== 'undefined' && Array.isArray(oldType)) ? oldType.length : 0; let /** @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(() => { this.loadedItems(); }, 1); } else { this.loadedItems(); } } } } /** * @return {?} */ scrollToSelectedIndex() { let /** @type {?} */ ele = $(this.elementRef.nativeElement).find('.menu'); let /** @type {?} */ hChild = $(this.elementRef.nativeElement).find('.menu > :eq(0)').outerHeight(); let /** @type {?} */ firstIndex = this.getSelectedIndexes().length > 0 ? this.getSelectedIndexes()[0] : 0; let /** @type {?} */ h = hChild * (firstIndex == 0 ? 0 : firstIndex - 1); if (!(ele.scrollTop() >= (h - ele.height() + hChild + hChild) && ele.scrollTop() <= (h + hChild))) { ele.stop().animate({ scrollTop: h }, 1, 'swing', function () { ele.css({ transition: "all 60ms cubic-bezier(0.175, 0.885, 0.32, 1.275)" }); ele.scrollTop(h); }); } } /** * @param {?} $event * @return {?} */ emitBeforeClickEvent($event) { let /** @type {?} */ sItem = this.getSelectedItems(); let /** @type {?} */ sIndex = this.getSelectedIndexes(); let /** @type {?} */ data = { item: sItem, index: sIndex }; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event); this.beforeClickEvent.emit(ev); } /** * @param {?} $event * @return {?} */ emitClickEvent($event) { let /** @type {?} */ sItem = this.getSelectedItems(); let /** @type {?} */ sIndex = this.getSelectedIndexes(); let /** @type {?} */ data = { item: sItem, index: sIndex }; let /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event); this.clickEvent.emit(ev); } /** * @param {?} $event * @return {?} */ emitBeforeShowEvent($event) { let /** @type {?} */ sItem = this.getSelectedItems(); let /** @type {?} */ sIndex = this.getSelectedIndexes(); let /** @type {?} */ data = { item: sItem, index: sIndex }; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_SHOW_EVENT, this, data, $event); this.beforeShowEvent.emit(ev); } /** * @param {?} $event * @return {?} */ emitShowEvent($event) { let /** @type {?} */ sItem = this.getSelectedItems(); let /** @type {?} */ sIndex = this.getSelectedIndexes(); let /** @type {?} */ data = { item: sItem, index: sIndex }; let /** @type {?} */ ev = EventUtils.newCustomEvent(SHOW_EVENT, this, data, $event); this.showEvent.emit(ev); } /** * @param {?} $event * @return {?} */ emitBeforeHideEvent($event) { let /** @type {?} */ sItem = this.getSelectedItems(); let /** @type {?} */ sIndex = this.getSelectedIndexes(); let /** @type {?} */ data = { item: sItem, index: sIndex }; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_HIDE_EVENT, this, data, $event); this.beforeHideEvent.emit(ev); } /** * @param {?} $event * @return {?} */ emitHideEvent($event) { let /** @type {?} */ sItem = this.getSelectedItems(); let /** @type {?} */ sIndex = this.getSelectedIndexes(); let /** @type {?} */ data = { item: sItem, index: sIndex }; let /** @type {?} */ ev = EventUtils.newCustomEvent(HIDE_EVENT, this, data, $event); this.hideEvent.emit(ev); } /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ doShow($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeShowEvent', $event, fireEvent, ($event) => { // doEvent this.show = true; this.scrollToSelectedIndex(); if (this.needFocusService) { this.needFocusService.setFocusingComponent(this, $event); } }, ($event) => { // emitBeforeEvent this.emitBeforeShowEvent($event); }, ($event, result) => { // emitAfterEvent this.emitShowEvent($event); }, ($event) => { // doPrevented }); } /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ doHide($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeHideEvent', $event, fireEvent, ($event) => { // doEvent this.show = false; }, ($event) => { // emitBeforeEvent this.emitBeforeHideEvent($event); }, ($event, result) => { // emitAfterEvent this.emitHideEvent($event); }, ($event) => { // doPrevented }); } /** * @return {?} */ getUIUpdateInterval() { 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 * @param {?=} fireEvent * @return {?} */ click($event, fireEvent) { if (this.isReadOnly()) { return; } if (this.isDisabled()) { return; } if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, ($event) => { // doEvent this.setShow(true); }, ($event) => { // emitBeforeEvent this.emitBeforeClickEvent($event); }, ($event, result) => { // emitAfterEvent this.emitClickEvent($event); }, ($event) => { // doPrevented }); } /** * @param {?} $event * @param {?} index * @return {?} */ onSelectItemClicked($event, index) { this._isItemClick = true; let /** @type {?} */ oldIndexes = this.getSelectedIndexes(); let /** @type {?} */ item = this.getItemAtIndex(index); let /** @type {?} */ oldDatas = []; let /** @type {?} */ newDatas = []; if (oldIndexes !== null && oldIndexes !== undefined) { for (let /** @type {?} */ oldIndex of oldIndexes) { oldDatas.push(this.getItemAtIndex(oldIndex)); newDatas.push(this.getItemAtIndex(oldIndex)); } } if (oldDatas.indexOf(item) === -1) { newDatas.push(item); } else { newDatas.splice(oldDatas.indexOf(item), 1); } this.setSelectedItems(newDatas); } /** * @param {?} $event * @return {?} */ doFocus($event) { } /** * @param {?} $event * @return {?} */ doLostFocus($event) { this.setShow(false); } /** * @param {?} $event * @return {?} */ onFocusing($event) { this.needFocusService.setFocusingComponent(this, $event); } /** * @param {?} $event * @return {?} */ onLostFocusing($event) { if ($event !== undefined && $event !== null) { $event.preventDefault(); } if (this._itemLostFocusingTimeout !== null && typeof this._itemLostFocusingTimeout !== 'undefined') { clearTimeout(this._itemLostFocusingTimeout); this._itemLostFocusingTimeout = null; } this._itemLostFocusingTimeout = setTimeout(() => { if (!this._isItemClick) { this.doBlur($event); this.needFocusService.resetFocusingComponent($event); } else { this.doFocus($event); } this._isItemClick = false; }, 20); // if dropdown not hide try to adjust this value } /** * @param {?} show * @param {?=} $event * @param {?=} fireEvent * @return {?} */ setShow(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 {?} */ isShow() { return this.show; } /** * @return {?} */ getAlign() { return this.align; } /** * @param {?} align * @return {?} */ setAlign(align) { this.align = align; } /** * @return {?} */ getDropdownWidth() { return this.dropdownWidth; } /** * @param {?} dropdownWidth * @return {?} */ setDropdownWidth(dropdownWidth) { this.dropdownWidth = dropdownWidth; } /** * @return {?} */ getDropdownHeight() { return this.dropdownHeight; } /** * @param {?} dropdownHeight * @return {?} */ setDropdownHeight(dropdownHeight) { this.dropdownHeight = dropdownHeight; } /** * @return {?} */ getClickEvent() { return this.clickEvent; } /** * @param {?} event * @return {?} */ setClickEvent(event) { this.clickEvent = event; } /** * @return {?} */ getBeforeClickEvent() { return this.beforeClickEvent; } /** * @param {?} event * @return {?} */ setBeforeClickEvent(event) { this.beforeClickEvent = event; } /** * @return {?} */ getShowEvent() { return this.showEvent; } /** * @param {?} event * @return {?} */ setShowEvent(event) { this.showEvent = event; } /** * @return {?} */ getSelectEvent() { return this.selectEvent; } /** * @param {?} event * @return {?} */ setSelectEvent(event) { this.selectEvent = event; } /** * @param {?} data * @return {?} */ setData(data) { super.setData(data); this.setPreloadData(data); } } AbstractMultiDropdown.LEFT = LEFT; AbstractMultiDropdown.RIGHT = RIGHT; AbstractMultiDropdown.CENTER = CENTER; tslib_1.__decorate([ Option('beforeClick'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMultiDropdown.prototype, "beforeClickEvent", void 0); tslib_1.__decorate([ Option('click'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMultiDropdown.prototype, "clickEvent", void 0); tslib_1.__decorate([ Option('beforeShow'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMultiDropdown.prototype, "beforeShowEvent", void 0); tslib_1.__decorate([ Option('show'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMultiDropdown.prototype, "showEvent", void 0); tslib_1.__decorate([ Option('beforeHide'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMultiDropdown.prototype, "beforeHideEvent", void 0); tslib_1.__decorate([ Option('hide'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMultiDropdown.prototype, "hideEvent", void 0); tslib_1.__decorate([ Option('select'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMultiDropdown.prototype, "selectEvent", void 0); function AbstractMultiDropdown_tsickle_Closure_declarations() { /** @type {?} */ AbstractMultiDropdown.LEFT; /** @type {?} */ AbstractMultiDropdown.RIGHT; /** @type {?} */ AbstractMultiDropdown.CENTER; /** @type {?} */ AbstractMultiDropdown.prototype.needFocusService; /** @type {?} */ AbstractMultiDropdown.prototype.data; /** @type {?} */ AbstractMultiDropdown.prototype.dataParent; /** @type {?} */ AbstractMultiDropdown.prototype.items; /** @type {?} */ AbstractMultiDropdown.prototype.dataComparator; /** @type {?} */ AbstractMultiDropdown.prototype.field; /** @type {?} */ AbstractMultiDropdown.prototype.beforeClickEvent; /** @type {?} */ AbstractMultiDropdown.prototype.clickEvent; /** @type {?} */ AbstractMultiDropdown.prototype.beforeShowEvent; /** @type {?} */ AbstractMultiDropdown.prototype.showEvent; /** @type {?} */ AbstractMultiDropdown.prototype.beforeHideEvent; /** @type {?} */ AbstractMultiDropdown.prototype.hideEvent; /** @type {?} */ AbstractMultiDropdown.prototype.selectEvent; /** @type {?} */ AbstractMultiDropdown.prototype._align; /** @type {?} */ AbstractMultiDropdown.prototype.dropdownWidth; /** @type {?} */ AbstractMultiDropdown.prototype.dropdownHeight; /** @type {?} */ AbstractMultiDropdown.prototype.phloxAppInfo; /** @type {?} */ AbstractMultiDropdown.prototype._isItemClick; /** @type {?} */ AbstractMultiDropdown.prototype._itemLostFocusingTimeout; /** @type {?} */ AbstractMultiDropdown.prototype.show; /** * @abstract * @param {?} $event * @return {?} */ AbstractMultiDropdown.prototype.doBlur = function ($event) { }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RNdWx0aURyb3Bkb3duLmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L2RhdGF2aWV3L2lucHV0L0Fic3RyYWN0TXVsdGlEcm9wZG93bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBc0QsWUFBWSxFQUF3QixNQUFNLGVBQWUsQ0FBQztBQUN2SCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQU01RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFN0QsT0FBTyxFQUNMLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUU5RixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU3RCx1QkFBTSxJQUFJLEdBQVcsTUFBTSxDQUFDO0FBQzVCLHVCQUFNLEtBQUssR0FBVyxPQUFPLENBQUM7QUFDOUIsdUJBQU0sTUFBTSxHQUFXLFFBQVEsQ0FBQzs7OztBQUVoQyxNQUFNLDRCQUFzQyxTQUFRLG1CQUFtQjs7Ozs7O0lBa0RyRSxZQUFZLGdCQUFrQyxFQUFFLFVBQXNCLEVBQUUsbUJBQXdDO1FBQzlHLEtBQUssQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7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QUFhLEVBQUUsRUFBRTs7WUFFbkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2xDLEVBQUUsQ0FBQyxNQUFhLEVBQUUsTUFBVyxFQUFFLEVBQUU7O1lBRWhDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDNUIsRUFBRSxDQUFDLE1BQWEsRUFBRSxFQUFFOztTQUVwQixDQUFDLENBQUM7Ozs7O0lBR0ssbUJBQW1CO1FBRTNCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNsRSxNQUFNLENBQUMsR0FBRyxDQUFDO1NBQ1o7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNwRixNQUFNLENBQUMsR0FBRyxDQUFDO1NBQ1o7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUM1SCxNQUFNLENBQUMsR0FBRyxDQUFDO1NBQ1o7UUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7S0FDdkQ7Ozs7OztJQUVNLEtBQUssQ0FBQyxNQUFjLEVBQUUsU0FBbUI7UUFDOUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUM7U0FDUjtRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxDQUFDO1NBQ1I7UUFFRCxFQUFFLENBQUMs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QyxNQUFNLENBQUM7c0NBQ00sWUFBWTs7O0lBQ2hDLE1BQU0sQ0FBQyxZQUFZLENBQUM7c0NBQ00sWUFBWTs7O0lBQ3RDLE1BQU0sQ0FBQyxNQUFNLENBQUM7c0NBQ00sWUFBWTs7O0lBQ2hDLE1BQU0sQ0FBQyxRQUFRLENBQUM7c0NBQ00sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBUeXBlLCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0U2VsZWN0SXRlbXMgfSBmcm9tICcuL0Fic3RyYWN0U2VsZWN0SXRlbXMnO1xyXG5pbXBvcnQgeyBJTmVlZEZvY3VzIH0gZnJvbSAnLi4vLi4vSU5lZWRGb2N1cyc7XHJcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vLi4vSUhhc0RhdGEnO1xyXG5pbXBvcnQgeyBJRGF0YUNvbXBhcmF0b3IgfSBmcm9tICcuLi8uLi9JRGF0YUNvbXBhcmF0b3InO1xyXG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlLCBQaGxveEFwcEluZm9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IERlZmF1bHRTZWxlY3RJdGVtTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9EZWZhdWx0U2VsZWN0SXRlbU1vZGVsJztcclxuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBQaGxveEFwcEluZm8gfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnQvbW9kZWwvUGhsb3hBcHBJbmZvJztcclxuaW1wb3J0IHtcclxuICBCRUZPUkVfU0hPV19FVkVOVCwgU0hPV19FVkVOVCwgQkVGT1JFX0hJREVfRVZFTlQsIEhJREVfRVZFTlQsIEJFRk9SRV9DTElDS19FVkVOVCwgQ0xJQ0tfRVZFTlQsXHJcbiAgQkVGT1JFX1NFTEVDVF9FVkVOVCwgU0VMRUNUX0VWRU5UXHJcbn0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvQ3VzdG9tRXZlbnRUeXBlJztcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMnO1xyXG5cclxuY29uc3QgTEVGVDogc3RyaW5nID0gXCJsZWZ0XCI7XHJcbmNvbnN0IFJJR0hUOiBzdHJpbmcgPSBcInJpZ2h0XCI7XHJcbmNvbnN0IENFTlRFUjogc3RyaW5nID0gXCJjZW50ZXJcIjtcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE11bHRpRHJvcGRvd24gZXh0ZW5kcyBBYnN0cmFjdFNlbGVjdEl0ZW1zIGltcGxlbWVudHMgT25Jbml0LCBJTmVlZEZvY3VzLCBPbkNoYW5nZXMge1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IExFRlQ6IHN0cmluZyA9IExFRlQ7XHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBSSUdIVDogc3RyaW5nID0gUklHSFQ7XHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDRU5URVI6IHN0cmluZyA9IENFTlRFUjtcclxuXHJcbiAgcHJvdGVjdGVkIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIGRhdGE6IGFueTtcclxuICBwcm90ZWN0ZWQgZGF0YVBhcmVudDogSUhhc0RhdGE7XHJcbiAgcHJvdGVjdGVkIGl0ZW1zOiBEZWZhdWx0U2VsZWN0SXRlbU1vZGVsW107XHJcbiAgcHJvdGVjdGVkIGRhdGFDb21wYXJhdG9yOiBJRGF0YUNvbXBhcmF0b3I8YW55PjtcclxuICBwcm90ZWN0ZWQgZmllbGQ6IHN0cmluZztcclxuICBAT3B0aW9uKCdiZWZvcmVDbGljaycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUNsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ2NsaWNrJylcclxuICBwcm90ZWN0ZWQgY2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlU2hvdycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZVNob3dFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignc2hvdycpXHJcbiAgcHJvdGVjdGVkIHNob3dFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlSGlkZScpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUhpZGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignaGlkZScpXHJcbiAgcHJvdGVjdGVkIGhpZGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignc2VsZWN0JylcclxuICBwcm90ZWN0ZWQgc2VsZWN0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIHByb3RlY3RlZCBfYWxpZ246IHN0cmluZztcclxuICBwcm90ZWN0ZWQgZHJvcGRvd25XaWR0aDogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBkcm9wZG93bkhlaWdodDogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBwaGxveEFwcEluZm86IFBobG94QXBwSW5mbztcclxuICBwcm90ZWN0ZWQgX2lzSXRlbUNsaWNrOiBib29sZWFuO1xyXG4gIHByb3RlY3RlZCBfaXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQ6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBzaG93OiBib29sZWFuO1xyXG5cclxuICBwcm90ZWN0ZWQgc2V0IGFsaWduKGFsaWduOiBzdHJpbmcpIHtcclxuICAgIGlmIChhbGlnbiA9PT0gTEVGVCB8fCBhbGlnbiA9PT0gUklHSFQgfHwgYWxpZ24gPT09IENFTlRFUikge1xyXG4gICAgICB0aGlzLl9hbGlnbiA9IGFsaWduO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9hbGlnbiA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IGFsaWduKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fYWxpZ24gPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuX2FsaWduID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICByZXR1cm4gTEVGVDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9hbGlnbjtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UsIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHBobG94QXBwSW5mb1NlcnZpY2U6IFBobG94QXBwSW5mb1NlcnZpY2UpIHtcclxuICAgIHN1cGVyKGVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2UpO1xyXG5cclxuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuYmVmb3JlU2hvd0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5zaG93RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLmJlZm9yZUhpZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuaGlkZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5zZWxlY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICB0aGlzLl9pc0l0ZW1DbGljayA9IGZhbHNlO1xyXG5cclxuICAgIHBobG94QXBwSW5mb1NlcnZpY2UuZ2V0QXBwSW5mbygpLnRoZW4oKGluZm8pID0+IHtcclxuICAgICAgdGhpcy5waGxveEFwcEluZm8gPSBpbmZvO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSkge1xyXG4gICAgLy8gZml4IGJ1ZyB3aGVuIHNldCBzZWxlY3RlZCBiZWZvcmUgaXRlbSBpcyBub3QgbG9hZGVkXHJcbiAgICBpZiAoY2hhbmdlc1snaXRlbXMnXSAhPT0gbnVsbCAmJiB0eXBlb2YgY2hhbmdlc1snaXRlbXMnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgbGV0IG9sZFR5cGUgPSBjaGFuZ2VzWydpdGVtcyddLnByZXZpb3VzVmFsdWU7XHJcbiAgICAgIGxldCBuZXdUeXBlOiBhbnkgPSBjaGFuZ2VzWydpdGVtcyddLmN1cnJlbnRWYWx1ZTtcclxuXHJcbiAgICAgIGxldCBvbGRTaXplID0gKG9sZFR5cGUgIT09IG51bGwgJiYgdHlwZW9mIG9sZFR5cGUgIT09ICd1bmRlZmluZWQnICYmIEFycmF5LmlzQXJyYXkob2xkVHlwZSkpID8gb2xkVHlwZS5sZW5ndGggOiAwO1xyXG4gICAgICBsZXQgbmV3U2l6ZSA9IChuZXdUeXBlICE9PSBudWxsICYmIHR5cGVvZiBuZXdUeXBlICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheS5pc0FycmF5KG5ld1R5cGUpKSA/IG5ld1R5cGUubGVuZ3RoIDogMDtcclxuXHJcbiAgICAgIGlmIChvbGRTaXplICE9PSBuZXdTaXplKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVBhcmVudCAhPT0gbnVsbCAmJiB0aGlzLmRhdGFQYXJlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgLy8gZml4IGJ1ZyBzZXREYXRhIGJ1dCBzdGlsbCBoYXMgYSBidWcgdGhpcy5jb21wLnNldERhdGEoKSBpbiBuZ09uSW5pdFxyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVkSXRlbXMoKTtcclxuICAgICAgICAgIH0sIDEpO1xyXG4gICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgIHRoaXMubG9hZGVkSXRlbXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNjcm9sbFRvU2VsZWN0ZWRJbmRleCgpOiB2b2lkIHtcclxuICAgIGxldCBlbGUgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcubWVudScpO1xyXG4gICAgbGV0IGhDaGlsZCA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5tZW51ID4gOmVxKDApJykub3V0ZXJIZWlnaHQoKTtcclxuXHJcbiAgICBsZXQgZmlyc3RJbmRleDogbnVtYmVyID0gdGhpcy5nZXRTZWxlY3RlZEluZGV4ZXMoKS5sZW5ndGggPiAwID8gdGhpcy5nZXRTZWxlY3RlZEluZGV4ZXMoKVswXSA6IDA7XHJcbiAgICBsZXQgaCA9IGhDaGlsZCAqIChmaXJzdEluZGV4ID09IDAgPyAwIDogZmlyc3RJbmRleCAtIDEpO1xyXG5cclxuICAgIGlmICghKGVsZS5zY3JvbGxUb3AoKSA+PSAoaCAtIGVsZS5oZWlnaHQoKSArIGhDaGlsZCArIGhDaGlsZCkgJiYgZWxlLnNjcm9sbFRvcCgpIDw9IChoICsgaENoaWxkKSkpIHtcclxuICAgICAgZWxlLnN0b3AoKS5hbmltYXRlKHsgc2Nyb2xsVG9wOiBoIH0sIDEsICdzd2luZycsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGVsZS5jc3Moe1xyXG4gICAgICAgICAgdHJhbnNpdGlvbjogXCJhbGwgNjBtcyBjdWJpYy1iZXppZXIoMC4xNzUsIDAuODg1LCAwLjMyLCAxLjI3NSlcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGVsZS5zY3JvbGxUb3AoaCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVDbGlja0V2ZW50KCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGxldCBzSXRlbSA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xyXG4gICAgbGV0IHNJbmRleCA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRleGVzKCk7XHJcblxyXG4gICAgbGV0IGRhdGE6IGFueSA9IHtcclxuICAgICAgaXRlbTogc0l0ZW0sXHJcbiAgICAgIGluZGV4OiBzSW5kZXhcclxuICAgIH07XHJcblxyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfQ0xJQ0tfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50LmVtaXQoZXYpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRDbGlja0V2ZW50KCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGxldCBzSXRlbSA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xyXG4gICAgbGV0IHNJbmRleCA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRleGVzKCk7XHJcblxyXG4gICAgbGV0IGRhdGE6IGFueSA9IHtcclxuICAgICAgaXRlbTogc0l0ZW0sXHJcbiAgICAgIGluZGV4OiBzSW5kZXhcclxuICAgIH07XHJcblxyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDTElDS19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChldik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZVNob3dFdmVudCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgc0l0ZW0gPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcclxuICAgIGxldCBzSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXhlcygpO1xyXG5cclxuICAgIGxldCBkYXRhOiBhbnkgPSB7XHJcbiAgICAgIGl0ZW06IHNJdGVtLFxyXG4gICAgICBpbmRleDogc0luZGV4XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX1NIT1dfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgdGhpcy5iZWZvcmVTaG93RXZlbnQuZW1pdChldik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdFNob3dFdmVudCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgc0l0ZW0gPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcclxuICAgIGxldCBzSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXhlcygpO1xyXG5cclxuICAgIGxldCBkYXRhOiBhbnkgPSB7XHJcbiAgICAgIGl0ZW06IHNJdGVtLFxyXG4gICAgICBpbmRleDogc0luZGV4XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoU0hPV19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLnNob3dFdmVudC5lbWl0KGV2KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlSGlkZUV2ZW50KCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGxldCBzSXRlbSA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xyXG4gICAgbGV0IHNJbmRleCA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRleGVzKCk7XHJcblxyXG4gICAgbGV0IGRhdGE6IGFueSA9IHtcclxuICAgICAgaXRlbTogc0l0ZW0sXHJcbiAgICAgIGluZGV4OiBzSW5kZXhcclxuICAgIH07XHJcblxyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfSElERV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmJlZm9yZUhpZGVFdmVudC5lbWl0KGV2KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0SGlkZUV2ZW50KCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGxldCBzSXRlbSA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xyXG4gICAgbGV0IHNJbmRleCA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRleGVzKCk7XHJcblxyXG4gICAgbGV0IGRhdGE6IGFueSA9IHtcclxuICAgICAgaXRlbTogc0l0ZW0sXHJcbiAgICAgIGluZGV4OiBzSW5kZXhcclxuICAgIH07XHJcblxyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChISURFX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xyXG5cclxuICAgIHRoaXMuaGlkZUV2ZW50LmVtaXQoZXYpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkb1Nob3coJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlU2hvd0V2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvRXZlbnRcclxuICAgICAgdGhpcy5zaG93ID0gdHJ1ZTtcclxuXHJcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZEluZGV4KCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5uZWVkRm9jdXNTZXJ2aWNlKSB7XHJcbiAgICAgICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnNldEZvY3VzaW5nQ29tcG9uZW50KHRoaXMsICRldmVudCk7XHJcbiAgICAgIH1cclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxyXG4gICAgICB0aGlzLmVtaXRCZWZvcmVTaG93RXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxyXG4gICAgICB0aGlzLmVtaXRTaG93RXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvUHJldmVudGVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZG9IaWRlKCRldmVudD86IEV2ZW50LCBmaXJlRXZlbnQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUhpZGVFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb0V2ZW50XHJcbiAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdEJlZm9yZUhpZGVFdmVudCgkZXZlbnQpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQsIHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdEhpZGVFdmVudCgkZXZlbnQpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZG9QcmV2ZW50ZWRcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldFVJVXBkYXRlSW50ZXJ2YWwoKTogbnVtYmVyIHtcclxuXHJcbiAgICBpZiAodGhpcy5waGxveEFwcEluZm8gPT09IG51bGwgfHwgdGhpcy5waGxveEFwcEluZm8gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gNjAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzID09PSBudWxsIHx8IHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIDYwMDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncy5VSV9BTklNQVRFX0lOVEVSVkFMID09PSBudWxsIHx8IHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzLlVJX0FOSU1BVEVfSU5URVJWQUwgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gNjAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncy5VSV9BTklNQVRFX0lOVEVSVkFMO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsaWNrKCRldmVudD86IEV2ZW50LCBmaXJlRXZlbnQ/OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5pc1JlYWRPbmx5KCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIEV2ZW50VXRpbHMuaGFuZGxlQnJvd3NlckV2ZW50KHRoaXMsICdiZWZvcmVDbGlja0V2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvRXZlbnRcclxuICAgICAgdGhpcy5zZXRTaG93KHRydWUpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdEJlZm9yZUNsaWNrRXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxyXG4gICAgICB0aGlzLmVtaXRDbGlja0V2ZW50KCRldmVudCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb1ByZXZlbnRlZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TZWxlY3RJdGVtQ2xpY2tlZCgkZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pc0l0ZW1DbGljayA9IHRydWU7XHJcblxyXG4gICAgbGV0IG9sZEluZGV4ZXM6IG51bWJlcltdID0gdGhpcy5nZXRTZWxlY3RlZEluZGV4ZXMoKTtcclxuXHJcbiAgICBsZXQgaXRlbSA9IHRoaXMuZ2V0SXRlbUF0SW5kZXgoaW5kZXgpO1xyXG5cclxuICAgIGxldCBvbGREYXRhczogYW55ID0gW107XHJcbiAgICBsZXQgbmV3RGF0YXM6IGFueSA9IFtdO1xyXG5cclxuICAgIGlmIChvbGRJbmRleGVzICE9PSBudWxsICYmIG9sZEluZGV4ZXMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmb3IgKGxldCBvbGRJbmRleCBvZiBvbGRJbmRleGVzKSB7XHJcbiAgICAgICAgb2xkRGF0YXMucHVzaCh0aGlzLmdldEl0ZW1BdEluZGV4KG9sZEluZGV4KSk7XHJcbiAgICAgICAgbmV3RGF0YXMucHVzaCh0aGlzLmdldEl0ZW1BdEluZGV4KG9sZEluZGV4KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAob2xkRGF0YXMuaW5kZXhPZihpdGVtKSA9PT0gLTEpIHtcclxuICAgICAgbmV3RGF0YXMucHVzaChpdGVtKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5ld0RhdGFzLnNwbGljZShvbGREYXRhcy5pbmRleE9mKGl0ZW0pLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldFNlbGVjdGVkSXRlbXMobmV3RGF0YXMpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRvRm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRvTG9zdEZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0U2hvdyhmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1c2luZygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2Uuc2V0Rm9jdXNpbmdDb21wb25lbnQodGhpcywgJGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkxvc3RGb2N1c2luZygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoJGV2ZW50ICE9PSB1bmRlZmluZWQgJiYgJGV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9pdGVtTG9zdEZvY3VzaW5nVGltZW91dCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5faXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9pdGVtTG9zdEZvY3VzaW5nVGltZW91dCk7XHJcbiAgICAgIHRoaXMuX2l0ZW1Mb3N0Rm9jdXNpbmdUaW1lb3V0ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9pdGVtTG9zdEZvY3VzaW5nVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuX2lzSXRlbUNsaWNrKSB7XHJcbiAgICAgICAgdGhpcy5kb0JsdXIoJGV2ZW50KTtcclxuICAgICAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2UucmVzZXRGb2N1c2luZ0NvbXBvbmVudCgkZXZlbnQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZG9Gb2N1cygkZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2lzSXRlbUNsaWNrID0gZmFsc2U7XHJcbiAgICB9LCAyMCk7IC8vIGlmIGRyb3Bkb3duIG5vdCBoaWRlIHRyeSB0byBhZGp1c3QgdGhpcyB2YWx1ZVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNob3coc2hvdzogYm9vbGVhbiwgJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChzaG93ID09PSBudWxsIHx8IHR5cGVvZiBzaG93ICE9PSAnYm9vbGVhbicpIHtcclxuICAgICAgc2hvdyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2hvdyA9PT0gc2hvdykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNob3cpIHtcclxuICAgICAgdGhpcy5kb1Nob3coJGV2ZW50LCBmaXJlRXZlbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kb0hpZGUoJGV2ZW50LCBmaXJlRXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzU2hvdygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNob3c7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QWxpZ24oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmFsaWduO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEFsaWduKGFsaWduOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuYWxpZ24gPSBhbGlnbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREcm9wZG93bldpZHRoKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5kcm9wZG93bldpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldERyb3Bkb3duV2lkdGgoZHJvcGRvd25XaWR0aDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyb3Bkb3duV2lkdGggPSBkcm9wZG93bldpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERyb3Bkb3duSGVpZ2h0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5kcm9wZG93bkhlaWdodDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREcm9wZG93bkhlaWdodChkcm9wZG93bkhlaWdodDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyb3Bkb3duSGVpZ2h0ID0gZHJvcGRvd25IZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2xpY2tFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jbGlja0V2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENsaWNrRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XHJcbiAgICB0aGlzLmNsaWNrRXZlbnQgPSBldmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRCZWZvcmVDbGlja0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmJlZm9yZUNsaWNrRXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0QmVmb3JlQ2xpY2tFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcclxuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudCA9IGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNob3dFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93RXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U2hvd0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93RXZlbnQgPSBldmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTZWxlY3RFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RFdmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTZWxlY3RFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0RXZlbnQgPSBldmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREYXRhKGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgc3VwZXIuc2V0RGF0YShkYXRhKTtcclxuXHJcbiAgICB0aGlzLnNldFByZWxvYWREYXRhKGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGRvQmx1cigkZXZlbnQ6IEV2ZW50KTogdm9pZDtcclxufVxyXG4iXX0=