UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

498 lines 59.8 kB
import { __decorate, __metadata, __param, __values } from "tslib"; import { Directive, Optional, Input, NgModule, Host, ComponentFactoryResolver, ViewContainerRef } from '@angular/core'; import { FilteringExpressionsTree } from '../data-operations/filtering-expressions-tree'; import { IgxColumnComponent } from './columns/column.component'; import { DataType } from '../data-operations/data-util'; import { IgxBooleanFilteringOperand, IgxNumberFilteringOperand, IgxDateFilteringOperand, IgxStringFilteringOperand } from '../data-operations/filtering-condition'; import { IgxGridComponent } from './grid/grid.component'; var COLUMNS = 'columns'; var FILTERING = 'filtering'; var ADVANCED_FILTERING = 'advancedFiltering'; var SORTING = 'sorting'; var GROUPBY = 'groupBy'; var PAGING = 'paging'; var ROW_SELECTION = 'rowSelection'; var CELL_SELECTION = 'cellSelection'; var IgxGridStateDirective = /** @class */ (function () { /** * @hidden */ function IgxGridStateDirective(grid, resolver, viewRef) { this.grid = grid; this.resolver = resolver; this.viewRef = viewRef; this._options = { columns: true, filtering: true, advancedFiltering: true, sorting: true, groupBy: true, paging: true, cellSelection: true, rowSelection: true }; } Object.defineProperty(IgxGridStateDirective.prototype, "options", { /** * An object with options determining if a certain feature state should be saved. * * ```html * <igx-grid [igxGridState]="options"></igx-grid> * ``` * ```typescript * public options = {selection: false, advancedFiltering: false}; * ``` */ get: function () { return this._options; }, set: function (value) { Object.assign(this._options, value); }, enumerable: true, configurable: true }); /** * Gets the state of a feature or states of all grid features, unless a certain feature is disabled through the `options` property. * @param `serialize` determines whether the returned object will be serialized to JSON string. Default value is false. * @param `feature` string or array of strings determining the features which state to retrieve. If skipped, returns all. * @returns Returns the serialized to JSON string IGridState object, or the non-serialized IGridState object. * ```html * <igx-grid [igxGridState]="options"></igx-grid> * ``` * ```typescript * @ViewChild(IgxGridStateDirective, { static: true }) public state; * let state = this.state.getState(); * ``` */ IgxGridStateDirective.prototype.getState = function (serialize, feature) { var _this = this; if (serialize === void 0) { serialize = true; } var state; if (feature) { state = {}; if (Array.isArray(feature)) { feature.forEach(function (f) { state = Object.assign(state, _this.getGridFeature(f)); }); } else { state = this.getGridFeature(feature); } } else { state = this.getAllGridFeatures(); } if (serialize) { state = JSON.stringify(state, this.stringifyCallback); return state; } else { return state; } }; /** * Restores grid features' state based on the IGridState object passed as an argument. * @param IGridState object to restore state from. * @returns * ```html * <igx-grid [igxGridState]="options"></igx-grid> * ``` * ```typescript * @ViewChild(IgxGridStateDirective, { static: true }) public state; * this.state.setState(gridState); * ``` */ IgxGridStateDirective.prototype.setState = function (state) { if (typeof state === 'string') { state = JSON.parse(state); } this.state = state; this.restoreGridState(); this.grid.cdr.detectChanges(); }; /** * The method that calls corresponding methods to restore feature from this.state object. */ IgxGridStateDirective.prototype.restoreGridState = function () { var e_1, _a; try { for (var _b = __values(Object.keys(this.state)), _c = _b.next(); !_c.done; _c = _b.next()) { var key = _c.value; if (this.state[key]) { this.restoreFeature(key, this.state[key]); } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } }; /** * Restores the state of a feature. */ IgxGridStateDirective.prototype.restoreFeature = function (feature, state) { switch (feature) { case COLUMNS: { this.restoreColumns(state); break; } case FILTERING: { this.restoreFiltering(state); break; } case ADVANCED_FILTERING: { this.restoreAdvancedFiltering(state); break; } case SORTING: { this.restoreSorting(state); break; } case GROUPBY: { this.restoreGroupBy(state); break; } case PAGING: { this.restorePaging(state); break; } case ROW_SELECTION: { this.restoreRowSelection(state); break; } case CELL_SELECTION: { this.restoreCellSelection(state); break; } } }; /** * Returns an object containing all grid features state. */ IgxGridStateDirective.prototype.getAllGridFeatures = function () { var e_2, _a; var gridState = {}; try { for (var _b = __values(Object.keys(this.options)), _c = _b.next(); !_c.done; _c = _b.next()) { var key = _c.value; if (this.options[key]) { var feature = this.getGridFeature(key); gridState = Object.assign(gridState, feature); } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_2) throw e_2.error; } } gridState = Object.assign({}, gridState); return gridState; }; /** * Restores an object containing the state for a grid feature. * `serialize` param determines whether the returned object will be serialized to a JSON string. Default value is false., */ IgxGridStateDirective.prototype.getGridFeature = function (feature) { var state = {}; switch (feature) { case COLUMNS: { Object.assign(state, this.getColumns()); break; } case FILTERING: { Object.assign(state, this.getFiltering()); break; } case ADVANCED_FILTERING: { Object.assign(state, this.getAdvancedFiltering()); break; } case SORTING: { Object.assign(state, this.getSorting()); break; } case GROUPBY: { Object.assign(state, this.getGroupBy()); break; } case PAGING: { Object.assign(state, this.getPaging()); break; } case ROW_SELECTION: { Object.assign(state, this.getRowSelection()); break; } case CELL_SELECTION: { Object.assign(state, this.getCellSelection()); break; } } return state; }; /** * Helper method that creates a new array with the current grid columns. */ IgxGridStateDirective.prototype.getColumns = function () { var gridColumns = this.grid.columns.sort(this.sortByVisibleIndex).map(function (c) { return { pinned: c.pinned, sortable: c.sortable, filterable: c.filterable, editable: c.editable, sortingIgnoreCase: c.sortingIgnoreCase, filteringIgnoreCase: c.filteringIgnoreCase, headerClasses: c.headerClasses, headerGroupClasses: c.headerGroupClasses, maxWidth: c.maxWidth, groupable: c.groupable, movable: c.movable, hidden: c.hidden, dataType: c.dataType, hasSummary: c.hasSummary, field: c.field, width: c.width, header: c.header, resizable: c.resizable, searchable: c.searchable }; }); return { columns: gridColumns }; }; IgxGridStateDirective.prototype.getFiltering = function () { var filteringState = this.grid.filteringExpressionsTree; return { filtering: filteringState }; }; IgxGridStateDirective.prototype.getAdvancedFiltering = function () { var advancedFiltering = this.grid.advancedFilteringExpressionsTree; return { advancedFiltering: advancedFiltering }; }; IgxGridStateDirective.prototype.getPaging = function () { var pagingState = this.grid.pagingState; return { paging: pagingState }; }; IgxGridStateDirective.prototype.getSorting = function () { var sortingState = this.grid.sortingExpressions; sortingState.forEach(function (s) { delete s.strategy; }); return { sorting: sortingState }; }; IgxGridStateDirective.prototype.getGroupBy = function () { var groupingExpressions = this.grid.groupingExpressions; groupingExpressions.forEach(function (expr) { delete expr.strategy; }); var expansionState = this.grid.groupingExpansionState; var groupsExpanded = this.grid.groupsExpanded; return { groupBy: { expressions: groupingExpressions, expansion: expansionState, defaultExpanded: groupsExpanded } }; }; IgxGridStateDirective.prototype.getRowSelection = function () { var selection = this.grid.selectedRows(); return { rowSelection: selection }; }; IgxGridStateDirective.prototype.getCellSelection = function () { var selection = this.grid.getSelectedRanges().map(function (range) { return { rowStart: range.rowStart, rowEnd: range.rowEnd, columnStart: range.columnStart, columnEnd: range.columnEnd }; }); return { cellSelection: selection }; }; /** * Restores the grid columns by modifying the `columnList` collection of the grid. */ IgxGridStateDirective.prototype.restoreColumns = function (columnsState) { var _this = this; var newColumns = []; var factory = this.resolver.resolveComponentFactory(IgxColumnComponent); columnsState.forEach(function (colState) { var ref = factory.create(_this.viewRef.injector); Object.assign(ref.instance, colState); ref.changeDetectorRef.detectChanges(); newColumns.push(ref.instance); }); this.grid.columnList.reset(newColumns); this.grid.columnList.notifyOnChanges(); }; IgxGridStateDirective.prototype.sortByVisibleIndex = function (colA, colB) { var a = colA.visibleIndex, b = colB.visibleIndex; return a > b ? 1 : a < b ? -1 : 0; }; /** * Restores the grid filtering state, i.e. sets the `filteringExpressionsTree` property value. */ IgxGridStateDirective.prototype.restoreFiltering = function (state) { var filterTree = this.createExpressionsTreeFromObject(state); this.grid.filteringExpressionsTree = filterTree; }; /** * Restores the grid advanced filtering state, i.e. sets the `advancedFilteringExpressionsTree` property value. */ IgxGridStateDirective.prototype.restoreAdvancedFiltering = function (state) { var advFilterTree = this.createExpressionsTreeFromObject(state); this.grid.advancedFilteringExpressionsTree = advFilterTree; }; /** * Restores the grid sorting state, i.e. sets the `sortingExpressions` property value. */ IgxGridStateDirective.prototype.restoreSorting = function (state) { this.grid.sortingExpressions = state; }; /** * Restores the grid grouping state, i.e. sets the `groupbyExpressions` property value. */ IgxGridStateDirective.prototype.restoreGroupBy = function (state) { this.grid.groupingExpressions = state.expressions; if (this.grid.groupsExpanded !== state.defaultExpanded) { this.grid.toggleAllGroupRows(); } else { this.grid.groupingExpansionState = state.expansion; } }; /** * Restores the grid paging state, i.e. sets the `perPage` property value and paginate to index. */ IgxGridStateDirective.prototype.restorePaging = function (state) { if (this.grid.perPage !== state.recordsPerPage) { this.grid.perPage = state.recordsPerPage; this.grid.cdr.detectChanges(); } this.grid.page = state.index; }; IgxGridStateDirective.prototype.restoreRowSelection = function (state) { this.grid.selectRows(state); }; IgxGridStateDirective.prototype.restoreCellSelection = function (state) { var _this = this; state.forEach(function (r) { var range = { rowStart: r.rowStart, rowEnd: r.rowEnd, columnStart: r.columnStart, columnEnd: r.columnEnd }; _this.grid.selectRange(range); }); }; /** * This method builds a FilteringExpressionsTree from a provided object. */ IgxGridStateDirective.prototype.createExpressionsTreeFromObject = function (exprTreeObject) { var e_3, _a; if (!exprTreeObject || !exprTreeObject.filteringOperands) { return null; } var expressionsTree = new FilteringExpressionsTree(exprTreeObject.operator, exprTreeObject.fieldName); var _loop_1 = function (item) { // Check if item is an expressions tree or a single expression. if (item.filteringOperands) { var subTree = this_1.createExpressionsTreeFromObject(item); expressionsTree.filteringOperands.push(subTree); } else { var expr_1 = item; var dataType = void 0; if (this_1.grid.columnList.length > 0) { dataType = this_1.grid.columnList.find(function (c) { return c.field === expr_1.fieldName; }).dataType; } else { dataType = this_1.state[COLUMNS].find(function (c) { return c.field === expr_1.fieldName; }).dataType; } // when ESF, values are stored in Set. // First those values are converted to an array before returning string in the stringifyCallback // now we need to convert those back to Set if (Array.isArray(expr_1.searchVal)) { expr_1.searchVal = new Set(expr_1.searchVal); } else { expr_1.searchVal = (dataType === 'date') ? new Date(Date.parse(expr_1.searchVal)) : expr_1.searchVal; } expr_1.condition = this_1.generateFilteringCondition(dataType, expr_1.condition.name); expressionsTree.filteringOperands.push(expr_1); } }; var this_1 = this; try { for (var _b = __values(exprTreeObject.filteringOperands), _c = _b.next(); !_c.done; _c = _b.next()) { var item = _c.value; _loop_1(item); } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_3) throw e_3.error; } } return expressionsTree; }; /** * Returns the filtering logic function for a given dataType and condition (contains, greaterThan, etc.) */ IgxGridStateDirective.prototype.generateFilteringCondition = function (dataType, name) { var filters; switch (dataType) { case DataType.Boolean: filters = IgxBooleanFilteringOperand.instance(); break; case DataType.Number: filters = IgxNumberFilteringOperand.instance(); break; case DataType.Date: filters = IgxDateFilteringOperand.instance(); break; case DataType.String: default: filters = IgxStringFilteringOperand.instance(); break; } return filters.condition(name); }; IgxGridStateDirective.prototype.stringifyCallback = function (key, val) { if (key === 'searchVal' && val instanceof Set) { return Array.from(val); } return val; }; IgxGridStateDirective.ctorParameters = function () { return [ { type: IgxGridComponent, decorators: [{ type: Host }, { type: Optional }] }, { type: ComponentFactoryResolver }, { type: ViewContainerRef } ]; }; __decorate([ Input('igxGridState'), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], IgxGridStateDirective.prototype, "options", null); IgxGridStateDirective = __decorate([ Directive({ selector: '[igxGridState]' }), __param(0, Host()), __param(0, Optional()), __metadata("design:paramtypes", [IgxGridComponent, ComponentFactoryResolver, ViewContainerRef]) ], IgxGridStateDirective); return IgxGridStateDirective; }()); export { IgxGridStateDirective }; /** * @hidden */ var IgxGridStateModule = /** @class */ (function () { function IgxGridStateModule() { } IgxGridStateModule = __decorate([ NgModule({ declarations: [IgxGridStateDirective], exports: [IgxGridStateDirective] }) ], IgxGridStateModule); return IgxGridStateModule; }()); export { IgxGridStateModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9zdGF0ZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZILE9BQU8sRUFBRSx3QkFBd0IsRUFBNkIsTUFBTSwrQ0FBK0MsQ0FBQztBQUVwSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUdoRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLHVCQUF1QixFQUNuRix5QkFBeUIsRUFBc0IsTUFBTSx3Q0FBd0MsQ0FBQztBQUlsRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQThDekQsSUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBQzFCLElBQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQztBQUM5QixJQUFNLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDO0FBQy9DLElBQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMxQixJQUFNLE9BQU8sR0FBRyxTQUFTLENBQUM7QUFDMUIsSUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBQ3hCLElBQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQztBQUNyQyxJQUFNLGNBQWMsR0FBRyxlQUFlLENBQUM7QUFLdkM7SUFrQ0k7O09BRUc7SUFDSCwrQkFDZ0MsSUFBc0IsRUFDMUMsUUFBa0MsRUFDaEMsT0FBeUI7UUFGUCxTQUFJLEdBQUosSUFBSSxDQUFrQjtRQUMxQyxhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUNoQyxZQUFPLEdBQVAsT0FBTyxD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QUk7SUFBRCx5QkFBQztDQUFBLEFBQW5DLElBQW1DO1NBQXRCLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgT3B0aW9uYWwsIElucHV0LCBOZ01vZHVsZSwgSG9zdCwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJU29ydGluZ0V4cHJlc3Npb24gfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvc29ydGluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb25zLXRyZWUnO1xuaW1wb3J0IHsgSUZpbHRlcmluZ0V4cHJlc3Npb24gfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElneENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElHcm91cGluZ0V4cHJlc3Npb24gfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZ3JvdXBpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVBhZ2luZ1N0YXRlIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL3BhZ2luZy1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kLCBJZ3hOdW1iZXJGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZCxcbiAgICBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kLCBJRmlsdGVyaW5nT3BlcmF0aW9ufSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWNvbmRpdGlvbic7XG5pbXBvcnQgeyBHcmlkU2VsZWN0aW9uUmFuZ2UgfSBmcm9tICcuL3NlbGVjdGlvbi9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJR3JvdXBCeUV4cGFuZFN0YXRlIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2dyb3VwYnktZXhwYW5kLXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJR3JvdXBpbmdTdGF0ZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9ncm91cGJ5LXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJZ3hHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi9ncmlkL2dyaWQuY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBJR3JpZFN0YXRlIHtcbiAgICBjb2x1bW5zPzogSUNvbHVtblN0YXRlW107XG4gICAgZmlsdGVyaW5nPzogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICBhZHZhbmNlZEZpbHRlcmluZz86IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgcGFnaW5nPzogSVBhZ2luZ1N0YXRlO1xuICAgIHNvcnRpbmc/OiBJU29ydGluZ0V4cHJlc3Npb25bXTtcbiAgICBncm91cEJ5PzogSUdyb3VwaW5nU3RhdGU7XG4gICAgY2VsbFNlbGVjdGlvbj86IEdyaWRTZWxlY3Rpb25SYW5nZVtdO1xuICAgIHJvd1NlbGVjdGlvbj86IGFueVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkU3RhdGVPcHRpb25zIHtcbiAgICBjb2x1bW5zPzogYm9vbGVhbjtcbiAgICBmaWx0ZXJpbmc/OiBib29sZWFuO1xuICAgIGFkdmFuY2VkRmlsdGVyaW5nPzogYm9vbGVhbjtcbiAgICBzb3J0aW5nPzogYm9vbGVhbjtcbiAgICBncm91cEJ5PzogYm9vbGVhbjtcbiAgICBwYWdpbmc/OiBib29sZWFuO1xuICAgIGNlbGxTZWxlY3Rpb24/OiBib29sZWFuO1xuICAgIHJvd1NlbGVjdGlvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbHVtblN0YXRlIHtcbiAgICBwaW5uZWQ6IGJvb2xlYW47XG4gICAgc29ydGFibGU6IGJvb2xlYW47XG4gICAgZmlsdGVyYWJsZTogYm9vbGVhbjtcbiAgICBlZGl0YWJsZTogYm9vbGVhbjtcbiAgICBzb3J0aW5nSWdub3JlQ2FzZTogYm9vbGVhbjtcbiAgICBmaWx0ZXJpbmdJZ25vcmVDYXNlOiBib29sZWFuO1xuICAgIGhlYWRlckNsYXNzZXM6IHN0cmluZztcbiAgICBoZWFkZXJHcm91cENsYXNzZXM6IHN0cmluZztcbiAgICBtYXhXaWR0aDogc3RyaW5nO1xuICAgIGdyb3VwYWJsZTogYm9vbGVhbjtcbiAgICBtb3ZhYmxlOiBib29sZWFuO1xuICAgIGhpZGRlbjogYm9vbGVhbjtcbiAgICBkYXRhVHlwZTogRGF0YVR5cGU7XG4gICAgaGFzU3VtbWFyeTogYm9vbGVhbjtcbiAgICBmaWVsZDogc3RyaW5nO1xuICAgIHdpZHRoOiBhbnk7XG4gICAgaGVhZGVyOiBzdHJpbmc7XG4gICAgcmVzaXphYmxlOiBib29sZWFuO1xuICAgIHNlYXJjaGFibGU6IGJvb2xlYW47XG59XG5cbmNvbnN0IENPTFVNTlMgPSAnY29sdW1ucyc7XG5jb25zdCBGSUxURVJJTkcgPSAnZmlsdGVyaW5nJztcbmNvbnN0IEFEVkFOQ0VEX0ZJTFRFUklORyA9ICdhZHZhbmNlZEZpbHRlcmluZyc7XG5jb25zdCBTT1JUSU5HID0gJ3NvcnRpbmcnO1xuY29uc3QgR1JPVVBCWSA9ICdncm91cEJ5JztcbmNvbnN0IFBBR0lORyA9ICdwYWdpbmcnO1xuY29uc3QgUk9XX1NFTEVDVElPTiA9ICdyb3dTZWxlY3Rpb24nO1xuY29uc3QgQ0VMTF9TRUxFQ1RJT04gPSAnY2VsbFNlbGVjdGlvbic7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2lneEdyaWRTdGF0ZV0nXG59KVxuZXhwb3J0IGNsYXNzIElneEdyaWRTdGF0ZURpcmVjdGl2ZSB7XG5cbiAgICBwcml2YXRlIF9vcHRpb25zOiBJR3JpZFN0YXRlT3B0aW9ucyA9IHtcbiAgICAgICAgY29sdW1uczogdHJ1ZSxcbiAgICAgICAgZmlsdGVyaW5nOiB0cnVlLFxuICAgICAgICBhZHZhbmNlZEZpbHRlcmluZzogdHJ1ZSxcbiAgICAgICAgc29ydGluZzogdHJ1ZSxcbiAgICAgICAgZ3JvdXBCeTogdHJ1ZSxcbiAgICAgICAgcGFnaW5nOiB0cnVlLFxuICAgICAgICBjZWxsU2VsZWN0aW9uOiB0cnVlLFxuICAgICAgICByb3dTZWxlY3Rpb246IHRydWVcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzdGF0ZTogSUdyaWRTdGF0ZTtcblxuICAgIC8qKlxuICAgICAqICBBbiBvYmplY3Qgd2l0aCBvcHRpb25zIGRldGVybWluaW5nIGlmIGEgY2VydGFpbiBmZWF0dXJlIHN0YXRlIHNob3VsZCBiZSBzYXZlZC5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2lneEdyaWRTdGF0ZV09XCJvcHRpb25zXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIG9wdGlvbnMgPSB7c2VsZWN0aW9uOiBmYWxzZSwgYWR2YW5jZWRGaWx0ZXJpbmc6IGZhbHNlfTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2lneEdyaWRTdGF0ZScpXG4gICAgcHVibGljIGdldCBvcHRpb25zKCk6IElHcmlkU3RhdGVPcHRpb25zIHtcbiAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IG9wdGlvbnModmFsdWU6IElHcmlkU3RhdGVPcHRpb25zKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fb3B0aW9ucywgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEhvc3QoKSBAT3B0aW9uYWwoKSBwcml2YXRlIGdyaWQ6IElneEdyaWRDb21wb25lbnQsXG4gICAgICAgIHByaXZhdGUgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgcHJvdGVjdGVkIHZpZXdSZWY6IFZpZXdDb250YWluZXJSZWYpIHsgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3RhdGUgb2YgYSBmZWF0dXJlIG9yIHN0YXRlcyBvZiBhbGwgZ3JpZCBmZWF0dXJlcywgdW5sZXNzIGEgY2VydGFpbiBmZWF0dXJlIGlzIGRpc2FibGVkIHRocm91Z2ggdGhlIGBvcHRpb25zYCBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gYHNlcmlhbGl6ZWAgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZSBzZXJpYWxpemVkIHRvIEpTT04gc3RyaW5nLiBEZWZhdWx0IHZhbHVlIGlzIGZhbHNlLlxuICAgICAqIEBwYXJhbSBgZmVhdHVyZWAgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgZGV0ZXJtaW5pbmcgdGhlIGZlYXR1cmVzIHdoaWNoIHN0YXRlIHRvIHJldHJpZXZlLiBJZiBza2lwcGVkLCByZXR1cm5zIGFsbC5cbiAgICAgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBzZXJpYWxpemVkIHRvIEpTT04gc3RyaW5nIElHcmlkU3RhdGUgb2JqZWN0LCBvciB0aGUgbm9uLXNlcmlhbGl6ZWQgSUdyaWRTdGF0ZSBvYmplY3QuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbaWd4R3JpZFN0YXRlXT1cIm9wdGlvbnNcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKElneEdyaWRTdGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHN0YXRlO1xuICAgICAqIGxldCBzdGF0ZSA9ICB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldFN0YXRlKHNlcmlhbGl6ZSA9IHRydWUsIGZlYXR1cmU/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IElHcmlkU3RhdGUgfCBzdHJpbmcgIHtcbiAgICAgICAgbGV0IHN0YXRlOiBJR3JpZFN0YXRlIHwgc3RyaW5nO1xuICAgICAgICBpZiAoZmVhdHVyZSkge1xuICAgICAgICAgICAgc3RhdGUgPSB7fTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZlYXR1cmUpKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZS5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IE9iamVjdC5hc3NpZ24oc3RhdGUsIHRoaXMuZ2V0R3JpZEZlYXR1cmUoZikpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IHRoaXMuZ2V0R3JpZEZlYXR1cmUoZmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZSA9IHRoaXMuZ2V0QWxsR3JpZEZlYXR1cmVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlcmlhbGl6ZSkge1xuICAgICAgICAgICAgc3RhdGUgPSBKU09OLnN0cmluZ2lmeShzdGF0ZSwgdGhpcy5zdHJpbmdpZnlDYWxsYmFjayk7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUgYXMgc3RyaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlIGFzIElHcmlkU3RhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyBncmlkIGZlYXR1cmVzJyBzdGF0ZSBiYXNlZCBvbiB0aGUgSUdyaWRTdGF0ZSBvYmplY3QgcGFzc2VkIGFzIGFuIGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSBJR3JpZFN0YXRlIG9iamVjdCB0byByZXN0b3JlIHN0YXRlIGZyb20uXG4gICAgICogQHJldHVybnNcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtpZ3hHcmlkU3RhdGVdPVwib3B0aW9uc1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoSWd4R3JpZFN0YXRlRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgc3RhdGU7XG4gICAgICogdGhpcy5zdGF0ZS5zZXRTdGF0ZShncmlkU3RhdGUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTdGF0ZShzdGF0ZTogSUdyaWRTdGF0ZSB8IHN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIHN0YXRlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3RhdGUgPSBKU09OLnBhcnNlKHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGUgYXMgSUdyaWRTdGF0ZTtcbiAgICAgICAgdGhpcy5yZXN0b3JlR3JpZFN0YXRlKCk7XG4gICAgICAgIHRoaXMuZ3JpZC5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtZXRob2QgdGhhdCBjYWxscyBjb3JyZXNwb25kaW5nIG1ldGhvZHMgdG8gcmVzdG9yZSBmZWF0dXJlIGZyb20gdGhpcy5zdGF0ZSBvYmplY3QuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXN0b3JlR3JpZFN0YXRlKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnN0YXRlKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGVba2V5XSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZUZlYXR1cmUoa2V5LCB0aGlzLnN0YXRlW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdG9yZXMgdGhlIHN0YXRlIG9mIGEgZmVhdHVyZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc3RvcmVGZWF0dXJlKGZlYXR1cmU6IHN0cmluZywgc3RhdGU6IElDb2x1bW5TdGF0ZVtdIHwgSVBhZ2luZ1N0YXRlIHwgSVNvcnRpbmdFeHByZXNzaW9uW10gfFxuICAgICAgICBJR3JvdXBpbmdTdGF0ZSB8IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB8IEdyaWRTZWxlY3Rpb25SYW5nZVtdIHwgYW55W10pIHtcbiAgICAgICAgc3dpdGNoIChmZWF0dXJlKSB7XG4gICAgICAgICAgICBjYXNlIENPTFVNTlM6IHtcbiAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZUNvbHVtbnMoc3RhdGUgYXMgSUNvbHVtblN0YXRlW10pO1xuICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEZJTFRFUklORzoge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZUZpbHRlcmluZyhzdGF0ZSBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBBRFZBTkNFRF9GSUxURVJJTkc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVBZHZhbmNlZEZpbHRlcmluZyhzdGF0ZSBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTT1JUSU5HOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlU29ydGluZyhzdGF0ZSBhcyBJU29ydGluZ0V4cHJlc3Npb25bXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIGNhc2UgR1JPVVBCWToge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZUdyb3VwQnkoc3RhdGUgYXMgSUdyb3VwaW5nU3RhdGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICBjYXNlIFBBR0lORzoge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZVBhZ2luZyhzdGF0ZSBhcyBJUGFnaW5nU3RhdGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgUk9XX1NFTEVDVElPTjoge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZVJvd1NlbGVjdGlvbihzdGF0ZSBhcyBhbnlbXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBDRUxMX1NFTEVDVElPTjoge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZUNlbGxTZWxlY3Rpb24oc3RhdGUgYXMgR3JpZFNlbGVjdGlvblJhbmdlW10pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgZ3JpZCBmZWF0dXJlcyBzdGF0ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldEFsbEdyaWRGZWF0dXJlcygpOiBJR3JpZFN0YXRlIHtcbiAgICAgICAgbGV0IGdyaWRTdGF0ZTogSUdyaWRTdGF0ZSA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMub3B0aW9ucykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNba2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSB0aGlzLmdldEdyaWRGZWF0dXJlKGtleSk7XG4gICAgICAgICAgICAgICAgZ3JpZFN0YXRlID0gIE9iamVjdC5hc3NpZ24oZ3JpZFN0YXRlLCBmZWF0dXJlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdyaWRTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIGdyaWRTdGF0ZSk7XG4gICAgICAgIHJldHVybiBncmlkU3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdG9yZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIGZvciBhIGdyaWQgZmVhdHVyZS5cbiAgICAgKiBgc2VyaWFsaXplYCBwYXJhbSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBKU09OIHN0cmluZy4gRGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4sXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRHcmlkRmVhdHVyZShmZWF0dXJlOiBzdHJpbmcpOiBJR3JpZFN0YXRlIHtcbiAgICAgICAgY29uc3Qgc3RhdGU6IElHcmlkU3RhdGUgPSB7fTtcbiAgICAgICAgc3dpdGNoIChmZWF0dXJlKSB7XG4gICAgICAgICAgICBjYXNlIENPTFVNTlM6IHtcbiAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHRoaXMuZ2V0Q29sdW1ucygpKTtcbiAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBGSUxURVJJTkc6IHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0YXRlLCB0aGlzLmdldEZpbHRlcmluZygpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgQURWQU5DRURfRklMVEVSSU5HOiB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwgdGhpcy5nZXRBZHZhbmNlZEZpbHRlcmluZygpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU09SVElORzoge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHRoaXMuZ2V0U29ydGluZygpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgY2FzZSBHUk9VUEJZOiB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwgdGhpcy5nZXRHcm91cEJ5KCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICBjYXNlIFBBR0lORzoge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHRoaXMuZ2V0UGFnaW5nKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgUk9XX1NFTEVDVElPTjoge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHRoaXMuZ2V0Um93U2VsZWN0aW9uKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgQ0VMTF9TRUxFQ1RJT046IHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0YXRlLCB0aGlzLmdldENlbGxTZWxlY3Rpb24oKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBhcnJheSB3aXRoIHRoZSBjdXJyZW50IGdyaWQgY29sdW1ucy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldENvbHVtbnMoKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgIGNvbnN0IGdyaWRDb2x1bW5zOiBJQ29sdW1uU3RhdGVbXSA9IHRoaXMuZ3JpZC5jb2x1bW5zLnNvcnQodGhpcy5zb3J0QnlWaXNpYmxlSW5kZXgpLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwaW5uZWQ6IGMucGlubmVkLFxuICAgICAgICAgICAgICAgIHNvcnRhYmxlOiBjLnNvcnRhYmxlLFxuICAgICAgICAgICAgICAgIGZpbHRlcmFibGU6IGMuZmlsdGVyYWJsZSxcbiAgICAgICAgICAgICAgICBlZGl0YWJsZTogYy5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICBzb3J0aW5nSWdub3JlQ2FzZTogYy5zb3J0aW5nSWdub3JlQ2FzZSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmdJZ25vcmVDYXNlOiBjLmZpbHRlcmluZ0lnbm9yZUNhc2UsXG4gICAgICAgICAgICAgICAgaGVhZGVyQ2xhc3NlczogYy5oZWFkZXJDbGFzc2VzLFxuICAgICAgICAgICAgICAgIGhlYWRlckdyb3VwQ2xhc3NlczogYy5oZWFkZXJHcm91cENsYXNzZXMsXG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6IGMubWF4V2lkdGgsXG4gICAgICAgICAgICAgICAgZ3JvdXBhYmxlOiBjLmdyb3VwYWJsZSxcbiAgICAgICAgICAgICAgICBtb3ZhYmxlOiBjLm1vdmFibGUsXG4gICAgICAgICAgICAgICAgaGlkZGVuOiBjLmhpZGRlbixcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogYy5kYXRhVHlwZSxcbiAgICAgICAgICAgICAgICBoYXNTdW1tYXJ5OiBjLmhhc1N1bW1hcnksXG4gICAgICAgICAgICAgICAgZmllbGQ6IGMuZmllbGQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGMud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVhZGVyOiBjLmhlYWRlcixcbiAgICAgICAgICAgICAgICByZXNpemFibGU6IGMucmVzaXphYmxlLFxuICAgICAgICAgICAgICAgIHNlYXJjaGFibGU6IGMuc2VhcmNoYWJsZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGNvbHVtbnM6IGdyaWRDb2x1bW5zIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGaWx0ZXJpbmcoKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1N0YXRlID0gdGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgcmV0dXJuIHsgZmlsdGVyaW5nOiBmaWx0ZXJpbmdTdGF0ZSB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QWR2YW5jZWRGaWx0ZXJpbmcoKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgIGNvbnN0IGFkdmFuY2VkRmlsdGVyaW5nID0gdGhpcy5ncmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICByZXR1cm4geyBhZHZhbmNlZEZpbHRlcmluZzogYWR2YW5jZWRGaWx0ZXJpbmcgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBhZ2luZygpOiBJR3JpZFN0YXRlIHtcbiAgICAgICAgY29uc3QgcGFnaW5nU3RhdGUgPSB0aGlzLmdyaWQucGFnaW5nU3RhdGU7XG4gICAgICAgIHJldHVybiB7IHBhZ2luZzogcGFnaW5nU3RhdGUgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNvcnRpbmcoKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgIGNvbnN0IHNvcnRpbmdTdGF0ZSA9IHRoaXMuZ3JpZC5zb3J0aW5nRXhwcmVzc2lvbnM7XG4gICAgICAgIHNvcnRpbmdTdGF0ZS5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHMuc3RyYXRlZ3k7XG4gICAgICAgIH0pO1xuICAgICAgI