UNPKG

ornamentum

Version:
207 lines 22.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component } from '@angular/core'; import { get } from '../../../utility/services/object-utility.class'; import { DropdownDataStateService } from '../../services/dropdown-data-state.service'; import { DropdownConfigService } from '../../services/dropdown-config.service'; import { DropdownEventStateService } from '../../services/dropdown-event-state.service'; /** * Dropdown options list component. */ var DropdownOptionsComponent = /** @class */ (function () { function DropdownOptionsComponent(config, dataStateService, eventStateService) { this.config = config; this.dataStateService = dataStateService; this.eventStateService = eventStateService; } /** * Unique data row tracking callback. * @param index Current index. * @param option Dropdown option reference. */ /** * Unique data row tracking callback. * @param {?} index Current index. * @param {?} option Dropdown option reference. * @return {?} */ DropdownOptionsComponent.prototype.optionTrackBy = /** * Unique data row tracking callback. * @param {?} index Current index. * @param {?} option Dropdown option reference. * @return {?} */ function (index, option) { return option.index; }; /** * Get selected state by option identifier. * @param id Option select track by identifier. */ /** * Get selected state by option identifier. * @param {?} id Option select track by identifier. * @return {?} */ DropdownOptionsComponent.prototype.getSelectedState = /** * Get selected state by option identifier. * @param {?} id Option select track by identifier. * @return {?} */ function (id) { var _this = this; if (this.config.selectMode === 'multi') { return this.dataStateService.selectedOptions.some((/** * @param {?} option * @return {?} */ function (option) { return get(option, _this.config.selectTrackBy) === id; })); } return get(this.dataStateService.selectedOption, this.config.selectTrackBy) === id; }; /** * Option click event handler. * @param option Option object reference. * @param event Click event arguments object. */ /** * Option click event handler. * @param {?} option Option object reference. * @param {?} event Click event arguments object. * @return {?} */ DropdownOptionsComponent.prototype.onOptionClick = /** * Option click event handler. * @param {?} option Option object reference. * @param {?} event Click event arguments object. * @return {?} */ function (option, event) { /** @type {?} */ var target = (/** @type {?} */ (event.target)); if (target && target.classList && target.classList.contains('ng-ignore-propagation')) { return; } this.toggleOptionSelectedState(option); }; /** * Option checkbox click event handler. * @param option Option object reference. * @param event Click event arguments object. */ /** * Option checkbox click event handler. * @param {?} option Option object reference. * @param {?} event Click event arguments object. * @return {?} */ DropdownOptionsComponent.prototype.onOptionCheckboxClick = /** * Option checkbox click event handler. * @param {?} option Option object reference. * @param {?} event Click event arguments object. * @return {?} */ function (option, event) { // Prevent single mode checkbox getting unchecked on tapping already selected. if (this.config.selectMode === 'single') { /** @type {?} */ var selectedId = get(this.dataStateService.selectedOption, this.config.selectTrackBy); /** @type {?} */ var id = get(option.option, this.config.selectTrackBy); if (selectedId === id) { event.preventDefault(); } } }; /** * Toggle option select state and update selected items depending on select mode. * @param option Option object reference. */ /** * Toggle option select state and update selected items depending on select mode. * @param {?} option Option object reference. * @return {?} */ DropdownOptionsComponent.prototype.toggleOptionSelectedState = /** * Toggle option select state and update selected items depending on select mode. * @param {?} option Option object reference. * @return {?} */ function (option) { var _this = this; /** @type {?} */ var id = get(option.option, this.config.selectTrackBy); switch (this.config.selectMode) { case 'multi': { /** @type {?} */ var selectedIndex = this.dataStateService.selectedOptions.findIndex((/** * @param {?} value * @return {?} */ function (value) { return get(value, _this.config.selectTrackBy) === id; })); if (selectedIndex < 0) { this.dataStateService.selectedOptions.push(option.option); } else { this.dataStateService.selectedOptions.splice(selectedIndex, 1); } this.eventStateService.selectChangeStream.emit(this.dataStateService.selectedOptions); break; } case 'single-toggle': { if (get(this.dataStateService.selectedOption, this.config.selectTrackBy) === id) { this.dataStateService.selectedOption = undefined; } else { this.dataStateService.selectedOption = option.option; } this.eventStateService.selectChangeStream.emit(this.dataStateService.selectedOption); break; } case 'single': { /** @type {?} */ var selectedId = get(this.dataStateService.selectedOption, this.config.selectTrackBy); this.dataStateService.selectedOption = option.option; if (selectedId !== id) { this.eventStateService.selectChangeStream.emit(this.dataStateService.selectedOption); } break; } } if (this.config.closeMenuOnSelect) { this.dataStateService.componentLoaderRef.hide(); } }; DropdownOptionsComponent.decorators = [ { type: Component, args: [{ selector: 'ng-dropdown-options', template: "<ul class=\"ng-dropdown-option-container\" [class.ng-milti-selectable]=\"config.selectMode === 'multi'\">\n <ng-container *ngIf=\"config.groupByField\">\n <ng-container *ngFor=\"let groupedOption of dataStateService.dropdownOptionGroups\">\n <li *ngIf=\"!dataStateService.dropdownOptionGroupHeaderTemplate\" class=\"ng-dropdown-group-heading\">\n {{ groupedOption.groupName }}\n </li>\n <ng-container\n *ngIf=\"dataStateService.dropdownOptionGroupHeaderTemplate\"\n [ngTemplateOutlet]=\"dataStateService.dropdownOptionGroupHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ groupedOption: groupedOption }\"\n >\n </ng-container>\n <ng-container *ngFor=\"let option of groupedOption.options; trackBy: optionTrackBy; let i = index;\">\n <li (click)=\"onOptionClick(option, $event)\" [class.disabled]=\"option.disabled\" [class.ng-option-selected]=\"getSelectedState(option.id)\">\n <ng-container *ngIf=\"!dataStateService.dropdownOptionTemplate\">\n <a class=\"ng-dropdown-checkbox-container\" *ngIf=\"config.showOptionSelectCheckbox\">\n <input type=\"checkbox\" class=\"ng-dropdown-checkbox-input ng-ignore-propagation\"\n [id]=\"dataStateService.getUniqueId('gop', i)\"\n [checked]=\"getSelectedState(option.id)\"\n [disabled]=\"option.disabled\"\n (change)=\"toggleOptionSelectedState(option)\"\n (click)=\"onOptionCheckboxClick(option, $event)\"\n />\n <label class=\"ng-ignore-propagation\" [for]=\"dataStateService.getUniqueId('gop', i)\">\n <span class=\"ng-ignore-propagation\" [title]=\"option.text\">{{ option.text }}</span>\n </label>\n </a>\n <span *ngIf=\"!config.showOptionSelectCheckbox\" [title]=\"option.text\">\n <span *ngIf=\"config.showOptionIndex\">{{option.index}} -</span>\n <span *ngIf=\"config.showOptionTrackBy\">{{option.id}} - </span>{{ option.text }}\n </span>\n </ng-container>\n <ng-container\n *ngIf=\"dataStateService.dropdownOptionTemplate\"\n [ngTemplateOutlet]=\"dataStateService.dropdownOptionTemplate\"\n [ngTemplateOutletContext]=\"{ option: option, selected: getSelectedState(option.id) }\"\n >\n </ng-container>\n </li>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!config.groupByField\">\n <ng-container *ngFor=\"let option of dataStateService.dropdownOptions; trackBy: optionTrackBy; index as i;\">\n <li (click)=\"onOptionClick(option, $event)\" [class.disabled]=\"option.disabled\" [class.ng-option-selected]=\"getSelectedState(option.id)\">\n <ng-container *ngIf=\"!dataStateService.dropdownOptionTemplate\">\n <a class=\"ng-dropdown-checkbox-container\" *ngIf=\"config.showOptionSelectCheckbox\">\n <input type=\"checkbox\" class=\"ng-dropdown-checkbox-input ng-ignore-propagation\"\n [id]=\"dataStateService.getUniqueId('sop', i)\"\n [checked]=\"getSelectedState(option.id)\"\n [disabled]=\"option.disabled\"\n (change)=\"toggleOptionSelectedState(option)\"\n (click)=\"onOptionCheckboxClick(option, $event)\"\n />\n <label class=\"ng-ignore-propagation\" [for]=\"dataStateService.getUniqueId('sop', i)\">\n <span class=\"ng-ignore-propagation\" [title]=\"option.text\">{{ option.text }}</span>\n </label>\n </a>\n <span *ngIf=\"!config.showOptionSelectCheckbox\" [title]=\"option.text\">\n <span *ngIf=\"config.showOptionIndex\">{{option.index}} -</span>\n <span *ngIf=\"config.showOptionTrackBy\">{{option.id}} - </span>{{ option.text }}\n </span>\n </ng-container>\n <ng-container\n *ngIf=\"dataStateService.dropdownOptionTemplate\"\n [ngTemplateOutlet]=\"dataStateService.dropdownOptionTemplate\"\n [ngTemplateOutletContext]=\"{ option: option, selected: getSelectedState(option.id) }\"\n >\n </ng-container>\n </li>\n </ng-container>\n </ng-container>\n <li *ngIf=\"!dataStateService.dataLoading && dataStateService.totalOptionCount === 0\" class=\"ng-dropdown-no-data\">\n {{ config.translations.noDataMessage }}\n </li>\n</ul>\n" }] } ]; /** @nocollapse */ DropdownOptionsComponent.ctorParameters = function () { return [ { type: DropdownConfigService }, { type: DropdownDataStateService }, { type: DropdownEventStateService } ]; }; return DropdownOptionsComponent; }()); export { DropdownOptionsComponent }; if (false) { /** @type {?} */ DropdownOptionsComponent.prototype.config; /** @type {?} */ DropdownOptionsComponent.prototype.dataStateService; /** * @type {?} * @private */ DropdownOptionsComponent.prototype.eventStateService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tb3B0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9vcm5hbWVudHVtLyIsInNvdXJjZXMiOlsiZHJvcGRvd24vY29tcG9uZW50cy9kcm9wZG93bi1vcHRpb25zL2Ryb3Bkb3duLW9wdGlvbnMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUlyRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7OztBQUt4RjtJQUtFLGtDQUNTLE1BQTZCLEVBQzdCLGdCQUEwQyxFQUN6QyxpQkFBNEM7UUFGN0MsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFDN0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEwQjtRQUN6QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQTJCO0lBQ25ELENBQUM7SUFFSjs7OztPQUlHOzs7Ozs7O0lBQ0ksZ0RBQWE7Ozs7OztJQUFwQixVQUFxQixLQUFhLEVBQUUsTUFBc0I7UUFDeEQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7Ozs7OztJQUNJLG1EQUFnQjs7Ozs7SUFBdkIsVUFBd0IsRUFBTztRQUEvQixpQkFRQztRQVBDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEtBQUssT0FBTyxFQUFFO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxJQUFJOzs7O1lBQUMsVUFBQyxNQUFXO2dCQUM1RCxPQUFPLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSSxDQUFDLE1BQU0sQ0FBQyxh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QUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3JGLE1BQU07YUFDUDtZQUNELEtBQUssUUFBUSxDQUFDLENBQUM7O29CQUNQLFVBQVUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztnQkFDdkYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUVyRCxJQUFJLFVBQVUsS0FBSyxFQUFFLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUN0RjtnQkFDRCxNQUFNO2FBQ1A7U0FDRjtRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTtZQUNqQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDakQ7SUFDSCxDQUFDOztnQkE5R0YsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLHk2SUFBZ0Q7aUJBQ2pEOzs7O2dCQVRRLHFCQUFxQjtnQkFEckIsd0JBQXdCO2dCQUV4Qix5QkFBeUI7O0lBb0hsQywrQkFBQztDQUFBLEFBL0dELElBK0dDO1NBM0dZLHdCQUF3Qjs7O0lBRWpDLDBDQUFvQzs7SUFDcEMsb0RBQWlEOzs7OztJQUNqRCxxREFBb0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0eS9zZXJ2aWNlcy9vYmplY3QtdXRpbGl0eS5jbGFzcyc7XG5cbmltcG9ydCB7IERyb3Bkb3duT3B0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Ryb3Bkb3duLW9wdGlvbi5tb2RlbCc7XG5cbmltcG9ydCB7IERyb3Bkb3duRGF0YVN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Ryb3Bkb3duLWRhdGEtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBEcm9wZG93bkNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcm9wZG93bi1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBEcm9wZG93bkV2ZW50U3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJvcGRvd24tZXZlbnQtc3RhdGUuc2VydmljZSc7XG5cbi8qKlxuICogRHJvcGRvd24gb3B0aW9ucyBsaXN0IGNvbXBvbmVudC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctZHJvcGRvd24tb3B0aW9ucycsXG4gIHRlbXBsYXRlVXJsOiAnLi9kcm9wZG93bi1vcHRpb25zLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk9wdGlvbnNDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29uZmlnOiBEcm9wZG93bkNvbmZpZ1NlcnZpY2UsXG4gICAgcHVibGljIGRhdGFTdGF0ZVNlcnZpY2U6IERyb3Bkb3duRGF0YVN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50U3RhdGVTZXJ2aWNlOiBEcm9wZG93bkV2ZW50U3RhdGVTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogVW5pcXVlIGRhdGEgcm93IHRyYWNraW5nIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0gaW5kZXggQ3VycmVudCBpbmRleC5cbiAgICogQHBhcmFtIG9wdGlvbiBEcm9wZG93biBvcHRpb24gcmVmZXJlbmNlLlxuICAgKi9cbiAgcHVibGljIG9wdGlvblRyYWNrQnkoaW5kZXg6IG51bWJlciwgb3B0aW9uOiBEcm9wZG93bk9wdGlvbik6IG51bWJlciB7XG4gICAgcmV0dXJuIG9wdGlvbi5pbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0ZWQgc3RhdGUgYnkgb3B0aW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSBpZCBPcHRpb24gc2VsZWN0IHRyYWNrIGJ5IGlkZW50aWZpZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0U2VsZWN0ZWRTdGF0ZShpZDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY29uZmlnLnNlbGVjdE1vZGUgPT09ICdtdWx0aScpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTdGF0ZVNlcnZpY2Uuc2VsZWN0ZWRPcHRpb25zLnNvbWUoKG9wdGlvbjogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBnZXQob3B0aW9uLCB0aGlzLmNvbmZpZy5zZWxlY3RUcmFja0J5KSA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0KHRoaXMuZGF0YVN0YXRlU2VydmljZS5zZWxlY3RlZE9wdGlvbiwgdGhpcy5jb25maWcuc2VsZWN0VHJhY2tCeSkgPT09IGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGlvbiBjbGljayBldmVudCBoYW5kbGVyLlxuICAgKiBAcGFyYW0gb3B0aW9uIE9wdGlvbiBvYmplY3QgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0gZXZlbnQgQ2xpY2sgZXZlbnQgYXJndW1lbnRzIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBvbk9wdGlvbkNsaWNrKG9wdGlvbjogRHJvcGRvd25PcHRpb24sIGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNsYXNzTGlzdCAmJiB0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCduZy1pZ25vcmUtcHJvcGFnYXRpb24nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudG9nZ2xlT3B0aW9uU2VsZWN0ZWRTdGF0ZShvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGlvbiBjaGVja2JveCBjbGljayBldmVudCBoYW5kbGVyLlxuICAgKiBAcGFyYW0gb3B0aW9uIE9wdGlvbiBvYmplY3QgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0gZXZlbnQgQ2xpY2sgZXZlbnQgYXJndW1lbnRzIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBvbk9wdGlvbkNoZWNrYm94Q2xpY2sob3B0aW9uOiBEcm9wZG93bk9wdGlvbiwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IHNpbmdsZSBtb2RlIGNoZWNrYm94IGdldHRpbmcgdW5jaGVja2VkIG9uIHRhcHBpbmcgYWxyZWFkeSBzZWxlY3RlZC5cbiAgICBpZiAodGhpcy5jb25maWcuc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBnZXQodGhpcy5kYXRhU3RhdGVTZXJ2aWNlLnNlbGVjdGVkT3B0aW9uLCB0aGlzLmNvbmZpZy5zZWxlY3RUcmFja0J5KTtcbiAgICAgIGNvbnN0IGlkID0gZ2V0KG9wdGlvbi5vcHRpb24sIHRoaXMuY29uZmlnLnNlbGVjdFRyYWNrQnkpO1xuICAgICAgaWYgKHNlbGVjdGVkSWQgPT09IGlkKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBvcHRpb24gc2VsZWN0IHN0YXRlIGFuZCB1cGRhdGUgc2VsZWN0ZWQgaXRlbXMgZGVwZW5kaW5nIG9uIHNlbGVjdCBtb2RlLlxuICAgKiBAcGFyYW0gb3B0aW9uIE9wdGlvbiBvYmplY3QgcmVmZXJlbmNlLlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZU9wdGlvblNlbGVjdGVkU3RhdGUob3B0aW9uOiBEcm9wZG93bk9wdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gZ2V0KG9wdGlvbi5vcHRpb24sIHRoaXMuY29uZmlnLnNlbGVjdFRyYWNrQnkpO1xuXG4gICAgc3dpdGNoICh0aGlzLmNvbmZpZy5zZWxlY3RNb2RlKSB7XG4gICAgICBjYXNlICdtdWx0aSc6IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRleCA9IHRoaXMuZGF0YVN0YXRlU2VydmljZS5zZWxlY3RlZE9wdGlvbnMuZmluZEluZGV4KCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGdldCh2YWx1ZSwgdGhpcy5jb25maWcuc2VsZWN0VHJhY2tCeSkgPT09IGlkO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCA8IDApIHtcbiAgICAgICAgICB0aGlzLmRhdGFTdGF0ZVNlcnZpY2Uuc2VsZWN0ZWRPcHRpb25zLnB1c2gob3B0aW9uLm9wdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kYXRhU3RhdGVTZXJ2aWNlLnNlbGVjdGVkT3B0aW9ucy5zcGxpY2Uoc2VsZWN0ZWRJbmRleCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50U3RhdGVTZXJ2aWNlLnNlbGVjdENoYW5nZVN0cmVhbS5lbWl0KHRoaXMuZGF0YVN0YXRlU2VydmljZS5zZWxlY3RlZE9wdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3NpbmdsZS10b2dnbGUnOiB7XG4gICAgICAgIGlmIChnZXQodGhpcy5kYXRhU3RhdGVTZXJ2aWNlLnNlbGVjdGVkT3B0aW9uLCB0aGlzLmNvbmZpZy5zZWxlY3RUcmFja0J5KSA9PT0gaWQpIHtcbiAgICAgICAgICB0aGlzLmRhdGFTdGF0ZVNlcnZpY2Uuc2VsZWN0ZWRPcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kYXRhU3RhdGVTZXJ2aWNlLnNlbGVjdGVkT3B0aW9uID0gb3B0aW9uLm9wdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRTdGF0ZVNlcnZpY2Uuc2VsZWN0Q2hhbmdlU3RyZWFtLmVtaXQodGhpcy5kYXRhU3RhdGVTZXJ2aWNlLnNlbGVjdGVkT3B0aW9uKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzaW5nbGUnOiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBnZXQodGhpcy5kYXRhU3RhdGVTZXJ2aWNlLnNlbGVjdGVkT3B0aW9uLCB0aGlzLmNvbmZpZy5zZWxlY3RUcmFja0J5KTtcbiAgICAgICAgdGhpcy5kYXRhU3RhdGVTZXJ2aWNlLnNlbGVjdGVkT3B0aW9uID0gb3B0aW9uLm9wdGlvbjtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJZCAhPT0gaWQpIHtcbiAgICAgICAgICB0aGlzLmV2ZW50U3RhdGVTZXJ2aWNlLnNlbGVjdENoYW5nZVN0cmVhbS5lbWl0KHRoaXMuZGF0YVN0YXRlU2VydmljZS5zZWxlY3RlZE9wdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLmNsb3NlTWVudU9uU2VsZWN0KSB7XG4gICAgICB0aGlzLmRhdGFTdGF0ZVNlcnZpY2UuY29tcG9uZW50TG9hZGVyUmVmLmhpZGUoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==