UNPKG

@catull/igniteui-angular

Version:

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

286 lines 38.2 kB
import { __decorate, __metadata, __values } from "tslib"; import { Pipe } from '@angular/core'; import { cloneArray, cloneHierarchicalArray } from '../../core/utils'; import { DataUtil } from '../../data-operations/data-util'; import { GridBaseAPIService } from '../api.service'; /** *@hidden */ var IgxTreeGridHierarchizingPipe = /** @class */ (function () { function IgxTreeGridHierarchizingPipe(gridAPI) { this.gridAPI = gridAPI; } IgxTreeGridHierarchizingPipe.prototype.transform = function (collection, primaryKey, foreignKey, childDataKey, id, pipeTrigger) { var grid = this.gridAPI.grid; var hierarchicalRecords = []; var treeGridRecordsMap = new Map(); var flatData = []; if (primaryKey && foreignKey) { hierarchicalRecords = this.hierarchizeFlatData(id, collection, primaryKey, foreignKey, treeGridRecordsMap, flatData); } else if (childDataKey) { hierarchicalRecords = this.hierarchizeRecursive(id, collection, primaryKey, childDataKey, undefined, flatData, 0, treeGridRecordsMap); } grid.flatData = flatData; grid.records = treeGridRecordsMap; grid.rootRecords = hierarchicalRecords; return hierarchicalRecords; }; IgxTreeGridHierarchizingPipe.prototype.getRowID = function (primaryKey, rowData) { return primaryKey ? rowData[primaryKey] : rowData; }; IgxTreeGridHierarchizingPipe.prototype.hierarchizeFlatData = function (id, collection, primaryKey, foreignKey, map, flatData) { var _this = this; var result = []; var missingParentRecords = []; collection.forEach(function (row) { var record = { rowID: _this.getRowID(primaryKey, row), data: row, children: [] }; var parent = map.get(row[foreignKey]); if (parent) { record.parent = parent; parent.children.push(record); } else { missingParentRecords.push(record); } map.set(row[primaryKey], record); }); missingParentRecords.forEach(function (record) { var parent = map.get(record.data[foreignKey]); if (parent) { record.parent = parent; parent.children.push(record); } else { result.push(record); } }); this.setIndentationLevels(id, result, 0, flatData); return result; }; IgxTreeGridHierarchizingPipe.prototype.setIndentationLevels = function (id, collection, indentationLevel, flatData) { for (var i = 0; i < collection.length; i++) { var record = collection[i]; record.level = indentationLevel; record.expanded = this.gridAPI.get_row_expansion_state(record); flatData.push(record.data); if (record.children && record.children.length > 0) { this.setIndentationLevels(id, record.children, indentationLevel + 1, flatData); } } }; IgxTreeGridHierarchizingPipe.prototype.hierarchizeRecursive = function (id, collection, primaryKey, childDataKey, parent, flatData, indentationLevel, map) { var result = []; for (var i = 0; i < collection.length; i++) { var item = collection[i]; var record = { rowID: this.getRowID(primaryKey, item), data: item, parent: parent, level: indentationLevel }; record.expanded = this.gridAPI.get_row_expansion_state(record); flatData.push(item); map.set(record.rowID, record); record.children = item[childDataKey] ? this.hierarchizeRecursive(id, item[childDataKey], primaryKey, childDataKey, record, flatData, indentationLevel + 1, map) : undefined; result.push(record); } return result; }; IgxTreeGridHierarchizingPipe.ctorParameters = function () { return [ { type: GridBaseAPIService } ]; }; IgxTreeGridHierarchizingPipe = __decorate([ Pipe({ name: 'treeGridHierarchizing', pure: true }), __metadata("design:paramtypes", [GridBaseAPIService]) ], IgxTreeGridHierarchizingPipe); return IgxTreeGridHierarchizingPipe; }()); export { IgxTreeGridHierarchizingPipe }; /** *@hidden */ var IgxTreeGridFlatteningPipe = /** @class */ (function () { function IgxTreeGridFlatteningPipe(gridAPI) { this.gridAPI = gridAPI; } IgxTreeGridFlatteningPipe.prototype.transform = function (collection, id, expandedLevels, expandedStates, pipeTrigger) { var grid = this.gridAPI.grid; var data = []; grid.processedRootRecords = collection; grid.processedRecords = new Map(); this.getFlatDataRecursive(collection, data, expandedLevels, expandedStates, id, true); grid.processedExpandedFlatData = data.map(function (r) { return r.data; }); return data; }; IgxTreeGridFlatteningPipe.prototype.getFlatDataRecursive = function (collection, data, expandedLevels, expandedStates, gridID, parentExpanded) { if (!collection || !collection.length) { return; } var grid = this.gridAPI.grid; for (var i = 0; i < collection.length; i++) { var hierarchicalRecord = collection[i]; if (parentExpanded) { data.push(hierarchicalRecord); } hierarchicalRecord.expanded = this.gridAPI.get_row_expansion_state(hierarchicalRecord); this.updateNonProcessedRecordExpansion(grid, hierarchicalRecord); grid.processedRecords.set(hierarchicalRecord.rowID, hierarchicalRecord); this.getFlatDataRecursive(hierarchicalRecord.children, data, expandedLevels, expandedStates, gridID, parentExpanded && hierarchicalRecord.expanded); } }; IgxTreeGridFlatteningPipe.prototype.updateNonProcessedRecordExpansion = function (grid, record) { var rec = grid.records.get(record.rowID); rec.expanded = record.expanded; }; IgxTreeGridFlatteningPipe.ctorParameters = function () { return [ { type: GridBaseAPIService } ]; }; IgxTreeGridFlatteningPipe = __decorate([ Pipe({ name: 'treeGridFlattening', pure: true }), __metadata("design:paramtypes", [GridBaseAPIService]) ], IgxTreeGridFlatteningPipe); return IgxTreeGridFlatteningPipe; }()); export { IgxTreeGridFlatteningPipe }; /** @hidden */ var IgxTreeGridSortingPipe = /** @class */ (function () { function IgxTreeGridSortingPipe(gridAPI) { this.gridAPI = gridAPI; } IgxTreeGridSortingPipe.prototype.transform = function (hierarchicalData, expressions, sorting, id, pipeTrigger) { var grid = this.gridAPI.grid; var result; if (!expressions.length) { result = hierarchicalData; } else { result = DataUtil.treeGridSort(hierarchicalData, expressions, sorting); } var filteredSortedData = []; this.flattenTreeGridRecords(result, filteredSortedData); grid.filteredSortedData = filteredSortedData; return result; }; IgxTreeGridSortingPipe.prototype.flattenTreeGridRecords = function (records, flatData) { var e_1, _a; if (records && records.length) { try { for (var records_1 = __values(records), records_1_1 = records_1.next(); !records_1_1.done; records_1_1 = records_1.next()) { var record = records_1_1.value; flatData.push(record.data); this.flattenTreeGridRecords(record.children, flatData); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (records_1_1 && !records_1_1.done && (_a = records_1.return)) _a.call(records_1); } finally { if (e_1) throw e_1.error; } } } }; IgxTreeGridSortingPipe.ctorParameters = function () { return [ { type: GridBaseAPIService } ]; }; IgxTreeGridSortingPipe = __decorate([ Pipe({ name: 'treeGridSorting', pure: true }), __metadata("design:paramtypes", [GridBaseAPIService]) ], IgxTreeGridSortingPipe); return IgxTreeGridSortingPipe; }()); export { IgxTreeGridSortingPipe }; /** @hidden */ var IgxTreeGridPagingPipe = /** @class */ (function () { function IgxTreeGridPagingPipe(gridAPI) { this.gridAPI = gridAPI; } IgxTreeGridPagingPipe.prototype.transform = function (collection, page, perPage, id, pipeTrigger) { if (page === void 0) { page = 0; } if (perPage === void 0) { perPage = 15; } var grid = this.gridAPI.grid; if (!grid.paging) { return collection; } var len = collection.length; var totalPages = Math.ceil(len / perPage); var state = { index: (totalPages > 0 && page >= totalPages) ? totalPages - 1 : page, recordsPerPage: perPage }; var result = DataUtil.page(cloneArray(collection), state); grid.pagingState = state; grid._page = state.index; return result; }; IgxTreeGridPagingPipe.ctorParameters = function () { return [ { type: GridBaseAPIService } ]; }; IgxTreeGridPagingPipe = __decorate([ Pipe({ name: 'treeGridPaging', pure: true }), __metadata("design:paramtypes", [GridBaseAPIService]) ], IgxTreeGridPagingPipe); return IgxTreeGridPagingPipe; }()); export { IgxTreeGridPagingPipe }; /** @hidden */ var IgxTreeGridTransactionPipe = /** @class */ (function () { function IgxTreeGridTransactionPipe(gridAPI) { this.gridAPI = gridAPI; } IgxTreeGridTransactionPipe.prototype.transform = function (collection, id, pipeTrigger) { var grid = this.gridAPI.grid; if (grid.transactions.enabled) { var aggregatedChanges = grid.transactions.getAggregatedChanges(true); if (aggregatedChanges.length > 0) { var primaryKey = grid.primaryKey; if (!primaryKey) { return collection; } var foreignKey = grid.foreignKey; var childDataKey = grid.childDataKey; if (foreignKey) { var flatDataClone = cloneArray(collection); return DataUtil.mergeTransactions(flatDataClone, aggregatedChanges, grid.primaryKey); } else if (childDataKey) { var hierarchicalDataClone = cloneHierarchicalArray(collection, childDataKey); return DataUtil.mergeHierarchicalTransactions(hierarchicalDataClone, aggregatedChanges, childDataKey, grid.primaryKey); } } } return collection; }; IgxTreeGridTransactionPipe.ctorParameters = function () { return [ { type: GridBaseAPIService } ]; }; IgxTreeGridTransactionPipe = __decorate([ Pipe({ name: 'treeGridTransaction', pure: true }), __metadata("design:paramtypes", [GridBaseAPIService]) ], IgxTreeGridTransactionPipe); return IgxTreeGridTransactionPipe; }()); export { IgxTreeGridTransactionPipe }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1ncmlkLnBpcGVzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy90cmVlLWdyaWQvdHJlZS1ncmlkLnBpcGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBUXBEOztHQUVHO0FBS0g7SUFHSSxzQ0FBWSxPQUE0RDtRQUNwRSxJQUFJLENBQUMsT0FBTyxHQUEwQixPQUFPLENBQUM7SUFDbEQsQ0FBQztJQUVNLGdEQUFTLEdBQWhCLFVBQWlCLFVBQWlCLEVBQUUsVUFBa0IsRUFBRSxVQUFrQixFQUFFLFlBQW9CLEVBQzVGLEVBQVUsRUFBRSxXQUFtQjtRQUMvQixJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMvQixJQUFJLG1CQUFtQixHQUFzQixFQUFFLENBQUM7UUFDaEQsSUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztRQUMzRCxJQUFNLFFBQVEsR0FBVSxFQUFFLENBQUM7UUFFM0IsSUFBSSxVQUFVLElBQUksVUFBVSxFQUFFO1lBQzFCLG1CQUFtQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDeEg7YUFBTSxJQUFJLFlBQVksRUFBRTtZQUNyQixtQkFBbUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUs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VSxDQUFDLENBQUM7b0JBQzdDLE9BQU8sUUFBUSxDQUFDLGlCQUFpQixDQUM3QixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDeEI7cUJBQU0sSUFBSSxZQUFZLEVBQUU7b0JBQ3JCLElBQU0scUJBQXFCLEdBQUcsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUMvRSxPQUFPLFFBQVEsQ0FBQyw2QkFBNkIsQ0FDekMscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUN4QjthQUNKO1NBQ0o7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDOztnQkFuQ29CLGtCQUFrQjs7SUFKOUIsMEJBQTBCO1FBSnRDLElBQUksQ0FBQztZQUNGLElBQUksRUFBRSxxQkFBcUI7WUFDM0IsSUFBSSxFQUFFLElBQUk7U0FDYixDQUFDO3lDQUt1QixrQkFBa0I7T0FKOUIsMEJBQTBCLENBd0N0QztJQUFELGlDQUFDO0NBQUEsQUF4Q0QsSUF3Q0M7U0F4Q1ksMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY2xvbmVBcnJheSwgY2xvbmVIaWVyYXJjaGljYWxBcnJheSB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgRGF0YVV0aWwgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IElneFRyZWVHcmlkQVBJU2VydmljZSB9IGZyb20gJy4vdHJlZS1ncmlkLWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWRCYXNlQVBJU2VydmljZSB9IGZyb20gJy4uL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IElneFRyZWVHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi90cmVlLWdyaWQuY29tcG9uZW50JztcbmltcG9ydCB7IElUcmVlR3JpZFJlY29yZCB9IGZyb20gJy4vdHJlZS1ncmlkLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgSWd4R3JpZEJhc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9ncmlkJztcbmltcG9ydCB7IElTb3J0aW5nRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9zb3J0aW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IEdyaWRUeXBlIH0gZnJvbSAnLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElHcmlkU29ydGluZ1N0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3knO1xuXG4vKipcbiAqQGhpZGRlblxuICovXG5AUGlwZSh7XG4gICAgbmFtZTogJ3RyZWVHcmlkSGllcmFyY2hpemluZycsXG4gICAgcHVyZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hUcmVlR3JpZEhpZXJhcmNoaXppbmdQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gICAgcHJpdmF0ZSBncmlkQVBJOiBJZ3hUcmVlR3JpZEFQSVNlcnZpY2U7XG5cbiAgICBjb25zdHJ1Y3RvcihncmlkQVBJOiBHcmlkQmFzZUFQSVNlcnZpY2U8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4pIHtcbiAgICAgICAgdGhpcy5ncmlkQVBJID0gPElneFRyZWVHcmlkQVBJU2VydmljZT5ncmlkQVBJO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmFuc2Zvcm0oY29sbGVjdGlvbjogYW55W10sIHByaW1hcnlLZXk6IHN0cmluZywgZm9yZWlnbktleTogc3RyaW5nLCBjaGlsZERhdGFLZXk6IHN0cmluZyxcbiAgICAgICAgaWQ6IHN0cmluZywgcGlwZVRyaWdnZXI6IG51bWJlcik6IElUcmVlR3JpZFJlY29yZFtdIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZEFQSS5ncmlkO1xuICAgICAgICBsZXQgaGllcmFyY2hpY2FsUmVjb3JkczogSVRyZWVHcmlkUmVjb3JkW10gPSBbXTtcbiAgICAgICAgY29uc3QgdHJlZUdyaWRSZWNvcmRzTWFwID0gbmV3IE1hcDxhbnksIElUcmVlR3JpZFJlY29yZD4oKTtcbiAgICAgICAgY29uc3QgZmxhdERhdGE6IGFueVtdID0gW107XG5cbiAgICAgICAgaWYgKHByaW1hcnlLZXkgJiYgZm9yZWlnbktleSkge1xuICAgICAgICAgICAgaGllcmFyY2hpY2FsUmVjb3JkcyA9IHRoaXMuaGllcmFyY2hpemVGbGF0RGF0YShpZCwgY29sbGVjdGlvbiwgcHJpbWFyeUtleSwgZm9yZWlnbktleSwgdHJlZUdyaWRSZWNvcmRzTWFwLCBmbGF0RGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hpbGREYXRhS2V5KSB7XG4gICAgICAgICAgICBoaWVyYXJjaGljYWxSZWNvcmRzID0gdGhpcy5oaWVyYXJjaGl6ZVJlY3Vyc2l2ZShpZCwgY29sbGVjdGlvbiwgcHJpbWFyeUtleSwgY2hpbGREYXRhS2V5LCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZmxhdERhdGEsIDAsIHRyZWVHcmlkUmVjb3Jkc01hcCk7XG4gICAgICAgIH1cblxuICAgICAgICBncmlkLmZsYXREYXRhID0gZmxhdERhdGE7XG4gICAgICAgIGdyaWQucmVjb3JkcyA9IHRyZWVHcmlkUmVjb3Jkc01hcDtcbiAgICAgICAgZ3JpZC5yb290UmVjb3JkcyA9IGhpZXJhcmNoaWNhbFJlY29yZHM7XG4gICAgICAgIHJldHVybiBoaWVyYXJjaGljYWxSZWNvcmRzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Um93SUQocHJpbWFyeUtleTogYW55LCByb3dEYXRhOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHByaW1hcnlLZXkgPyByb3dEYXRhW3ByaW1hcnlLZXldIDogcm93RGF0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhpZXJhcmNoaXplRmxhdERhdGEoaWQ6IHN0cmluZywgY29sbGVjdGlvbjogYW55W10sIHByaW1hcnlLZXk6IHN0cmluZywgZm9yZWlnbktleTogc3RyaW5nLFxuICAgICAgICBtYXA6IE1hcDxhbnksIElUcmVlR3JpZFJlY29yZD4sIGZsYXREYXRhOiBhbnlbXSk6XG4gICAgICAgIElUcmVlR3JpZFJlY29yZFtdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBJVHJlZUdyaWRSZWNvcmRbXSA9IFtdO1xuICAgICAgICBjb25zdCBtaXNzaW5nUGFyZW50UmVjb3JkczogSVRyZWVHcmlkUmVjb3JkW10gPSBbXTtcbiAgICAgICAgY29sbGVjdGlvbi5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWNvcmQ6IElUcmVlR3JpZFJlY29yZCA9IHtcbiAgICAgICAgICAgICAgICByb3dJRDogdGhpcy5nZXRSb3dJRChwcmltYXJ5S2V5LCByb3cpLFxuICAgICAgICAgICAgICAgIGRhdGE6IHJvdyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBtYXAuZ2V0KHJvd1tmb3JlaWduS2V5XSk7XG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChyZWNvcmQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtaXNzaW5nUGFyZW50UmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1hcC5zZXQocm93W3ByaW1hcnlLZXldLCByZWNvcmQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBtaXNzaW5nUGFyZW50UmVjb3Jkcy5mb3JFYWNoKHJlY29yZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBtYXAuZ2V0KHJlY29yZC5kYXRhW2ZvcmVpZ25LZXldKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZWNvcmQucGFyZW50ID0gcGFyZW50O1xuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2V0SW5kZW50YXRpb25MZXZlbHMoaWQsIHJlc3VsdCwgMCwgZmxhdERhdGEpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRJbmRlbnRhdGlvbkxldmVscyhpZDogc3RyaW5nLCBjb2xsZWN0aW9uOiBJVHJlZUdyaWRSZWNvcmRbXSwgaW5kZW50YXRpb25MZXZlbDogbnVtYmVyLCBmbGF0RGF0YTogYW55W10pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xsZWN0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBjb2xsZWN0aW9uW2ldO1xuICAgICAgICAgICAgcmVjb3JkLmxldmVsID0gaW5kZW50YXRpb25MZXZlbDtcbiAgICAgICAgICAgIHJlY29yZC5leHBhbmRlZCA9IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyZWNvcmQpO1xuICAgICAgICAgICAgZmxhdERhdGEucHVzaChyZWNvcmQuZGF0YSk7XG5cbiAgICAgICAgICAgIGlmIChyZWNvcmQuY2hpbGRyZW4gJiYgcmVjb3JkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEluZGVudGF0aW9uTGV2ZWxzKGlkLCByZWNvcmQuY2hpbGRyZW4sIGluZGVudGF0aW9uTGV2ZWwgKyAxLCBmbGF0RGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhpZXJhcmNoaXplUmVjdXJzaXZlKGlkOiBzdHJpbmcsIGNvbGxlY3Rpb246IGFueVtdLCBwcmltYXJ5S2V5OiBzdHJpbmcsIGNoaWxkRGF0YUtleTogc3RyaW5nLFxuICAgICAgICBwYXJlbnQ6IElUcmVlR3JpZFJlY29yZCwgZmxhdERhdGE6IGFueVtdLCBpbmRlbnRhdGlvbkxldmVsOiBudW1iZXIsIG1hcDogTWFwPGFueSwgSVRyZWVHcmlkUmVjb3JkPik6IElUcmVlR3JpZFJlY29yZFtdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBJVHJlZUdyaWRSZWNvcmRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sbGVjdGlvbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbGxlY3Rpb25baV07XG4gICAgICAgICAgICBjb25zdCByZWNvcmQ6IElUcmVlR3JpZFJlY29yZCA9IHtcbiAgICAgICAgICAgICAgICByb3dJRDogdGhpcy5nZXRSb3dJRChwcmltYXJ5S2V5LCBpdGVtKSxcbiAgICAgICAgICAgICAgICBkYXRhOiBpdGVtLFxuICAgICAgICAgICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICAgICAgICAgIGxldmVsOiBpbmRlbnRhdGlvbkxldmVsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVjb3JkLmV4cGFuZGVkID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHJlY29yZCk7XG4gICAgICAgICAgICBmbGF0RGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgbWFwLnNldChyZWNvcmQucm93SUQsIHJlY29yZCk7XG4gICAgICAgICAgICByZWNvcmQuY2hpbGRyZW4gPSBpdGVtW2NoaWxkRGF0YUtleV0gP1xuICAgICAgICAgICAgICAgIHRoaXMuaGllcmFyY2hpemVSZWN1cnNpdmUoaWQsIGl0ZW1bY2hpbGREYXRhS2V5XSwgcHJpbWFyeUtleSwgY2hpbGREYXRhS2V5LCByZWNvcmQsIGZsYXREYXRhLCBpbmRlbnRhdGlvbkxldmVsICsgMSwgbWFwKSA6XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocmVjb3JkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG4vKipcbiAqQGhpZGRlblxuICovXG5AUGlwZSh7XG4gICAgbmFtZTogJ3RyZWVHcmlkRmxhdHRlbmluZycsXG4gICAgcHVyZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hUcmVlR3JpZEZsYXR0ZW5pbmdQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gICAgcHJpdmF0ZSBncmlkQVBJOiBJZ3hUcmVlR3JpZEFQSVNlcnZpY2U7XG5cbiAgICBjb25zdHJ1Y3RvcihncmlkQVBJOiBHcmlkQmFzZUFQSVNlcnZpY2U8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4pIHtcbiAgICAgICAgdGhpcy5ncmlkQVBJID0gPElneFRyZWVHcmlkQVBJU2VydmljZT5ncmlkQVBJO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmFuc2Zvcm0oY29sbGVjdGlvbjogSVRyZWVHcmlkUmVjb3JkW10sIGlkOiBzdHJpbmcsXG4gICAgICAgIGV4cGFuZGVkTGV2ZWxzOiBudW1iZXIsIGV4cGFuZGVkU3RhdGVzOiBNYXA8YW55LCBib29sZWFuPiwgcGlwZVRyaWdnZXI6IG51bWJlcik6IGFueVtdIHtcblxuICAgICAgICBjb25zdCBncmlkOiBJZ3hUcmVlR3JpZENvbXBvbmVudCA9IHRoaXMuZ3JpZEFQSS5ncmlkO1xuICAgICAgICBjb25zdCBkYXRhOiBJVHJlZUdyaWRSZWNvcmRbXSA9IFtdO1xuXG4gICAgICAgIGdyaWQucHJvY2Vzc2VkUm9vdFJlY29yZHMgPSBjb2xsZWN0aW9uO1xuICAgICAgICBncmlkLnByb2Nlc3NlZFJlY29yZHMgPSBuZXcgTWFwPGFueSwgSVRyZWVHcmlkUmVjb3JkPigpO1xuXG4gICAgICAgIHRoaXMuZ2V0RmxhdERhdGFSZWN1cnNpdmUoY29sbGVjdGlvbiwgZGF0YSwgZXhwYW5kZWRMZXZlbHMsIGV4cGFuZGVkU3RhdGVzLCBpZCwgdHJ1ZSk7XG5cbiAgICAgICAgZ3JpZC5wcm9jZXNzZWRFeHBhbmRlZEZsYXREYXRhID0gZGF0YS5tYXAociA9PiByLmRhdGEpO1xuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmxhdERhdGFSZWN1cnNpdmUoY29sbGVjdGlvbjogSVRyZWVHcmlkUmVjb3JkW10sIGRhdGE6IElUcmVlR3JpZFJlY29yZFtdLFxuICAgICAgICBleHBhbmRlZExldmVsczogbnVtYmVyLCBleHBhbmRlZFN0YXRlczogTWFwPGFueSwgYm9vbGVhbj4sIGdyaWRJRDogc3RyaW5nLFxuICAgICAgICBwYXJlbnRFeHBhbmRlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAoIWNvbGxlY3Rpb24gfHwgIWNvbGxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ3JpZDogSWd4VHJlZUdyaWRDb21wb25lbnQgPSB0aGlzLmdyaWRBUEkuZ3JpZDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbGxlY3Rpb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGhpZXJhcmNoaWNhbFJlY29yZCA9IGNvbGxlY3Rpb25baV07XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnRFeHBhbmRlZCkge1xuICAgICAgICAgICAgICAgIGRhdGEucHVzaChoaWVyYXJjaGljYWxSZWNvcmQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBoaWVyYXJjaGljYWxSZWNvcmQuZXhwYW5kZWQgPSB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19leHBhbnNpb25fc3RhdGUoaGllcmFyY2hpY2FsUmVjb3JkKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVOb25Qcm9jZXNzZWRSZWNvcmRFeHBhbnNpb24oZ3JpZCwgaGllcmFyY2hpY2FsUmVjb3JkKTtcblxuICAgICAgICAgICAgZ3JpZC5wcm9jZXNzZWRSZWNvcmRzLnNldChoaWVyYXJjaGljYWxSZWNvcmQucm93SUQsIGhpZXJhcmNoaWNhbFJlY29yZCk7XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0RmxhdERhdGFSZWN1cnNpdmUoaGllcmFyY2hpY2FsUmVjb3JkLmNoaWxkcmVuLCBkYXRhLCBleHBhbmRlZExldmVscyxcbiAgICAgICAgICAgICAgICBleHBhbmRlZFN0YXRlcywgZ3JpZElELCBwYXJlbnRFeHBhbmRlZCAmJiBoaWVyYXJjaGljYWxSZWNvcmQuZXhwYW5kZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVOb25Qcm9jZXNzZWRSZWNvcmRFeHBhbnNpb24oZ3JpZDogSWd4VHJlZUdyaWRDb21wb25lbnQsIHJlY29yZDogSVRyZWVHcmlkUmVjb3JkKSB7XG4gICAgICAgIGNvbnN0IHJlYyA9IGdyaWQucmVjb3Jkcy5nZXQocmVjb3JkLnJvd0lEKTtcbiAgICAgICAgcmVjLmV4cGFuZGVkID0gcmVjb3JkLmV4cGFuZGVkO1xuICAgIH1cbn1cblxuLyoqIEBoaWRkZW4gKi9cbkBQaXBlKHtcbiAgICBuYW1lOiAndHJlZUdyaWRTb3J0aW5nJyxcbiAgICBwdXJlOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIElneFRyZWVHcmlkU29ydGluZ1BpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgICBwcml2YXRlIGdyaWRBUEk6IElneFRyZWVHcmlkQVBJU2VydmljZTtcblxuICAgIGNvbnN0cnVjdG9yKGdyaWRBUEk6IEdyaWRCYXNlQVBJU2VydmljZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPikge1xuICAgICAgICB0aGlzLmdyaWRBUEkgPSA8SWd4VHJlZUdyaWRBUElTZXJ2aWNlPmdyaWRBUEk7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYW5zZm9ybShcbiAgICAgICAgaGllcmFyY2hpY2FsRGF0YTogSVRyZWVHcmlkUmVjb3JkW10sXG4gICAgICAgIGV4cHJlc3Npb25zOiBJU29ydGluZ0V4cHJlc3Npb25bXSxcbiAgICAgICAgc29ydGluZzogSUdyaWRTb3J0aW5nU3RyYXRlZ3ksXG4gICAgICAgIGlkOiBzdHJpbmcsXG4gICAgICAgIHBpcGVUcmlnZ2VyOiBudW1iZXIpOiBJVHJlZUdyaWRSZWNvcmRbXSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWRBUEkuZ3JpZDtcblxuICAgICAgICBsZXQgcmVzdWx0OiBJVHJlZUdyaWRSZWNvcmRbXTtcbiAgICAgICAgaWYgKCFleHByZXNzaW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhpZXJhcmNoaWNhbERhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBEYXRhVXRpbC50cmVlR3JpZFNvcnQoaGllcmFyY2hpY2FsRGF0YSwgZXhwcmVzc2lvbnMsIHNvcnRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkU29ydGVkRGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZsYXR0ZW5UcmVlR3JpZFJlY29yZHMocmVzdWx0LCBmaWx0ZXJlZFNvcnRlZERhdGEpO1xuICAgICAgICBncmlkLmZpbHRlcmVkU29ydGVkRGF0YSA9IGZpbHRlcmVkU29ydGVkRGF0YTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZmxhdHRlblRyZWVHcmlkUmVjb3JkcyhyZWNvcmRzOiBJVHJlZUdyaWRSZWNvcmRbXSwgZmxhdERhdGE6IGFueVtdKSB7XG4gICAgICAgIGlmIChyZWNvcmRzICYmIHJlY29yZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKSB7XG4gICAgICAgICAgICAgICAgZmxhdERhdGEucHVzaChyZWNvcmQuZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbGF0dGVuVHJlZUdyaWRSZWNvcmRzKHJlY29yZC5jaGlsZHJlbiwgZmxhdERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vKiogQGhpZGRlbiAqL1xuQFBpcGUoe1xuICAgIG5hbWU6ICd0cmVlR3JpZFBhZ2luZycsXG4gICAgcHVyZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hUcmVlR3JpZFBhZ2luZ1BpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgICBwcml2YXRlIGdyaWRBUEk6IElneFRyZWVHcmlkQVBJU2VydmljZTtcblxuICAgIGNvbnN0cnVjdG9yKGdyaWRBUEk6IEdyaWRCYXNlQVBJU2VydmljZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPikge1xuICAgICAgICB0aGlzLmdyaWRBUEkgPSA8SWd4VHJlZUdyaWRBUElTZXJ2aWNlPmdyaWRBUEk7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYW5zZm9ybShjb2xsZWN0aW9uOiBJVHJlZUdyaWRSZWNvcmRbXSwgcGFnZSA9IDAsIHBlclBhZ2UgPSAxNSwgaWQ6IHN0cmluZywgcGlwZVRyaWdnZXI6IG51bWJlcik6IElUcmVlR3JpZFJlY29yZFtdIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZEFQSS5ncmlkO1xuICAgICAgICBpZiAoIWdyaWQucGFnaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxlbiA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgICBjb25zdCB0b3RhbFBhZ2VzID0gTWF0aC5jZWlsKGxlbiAvIHBlclBhZ2UpO1xuXG4gICAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICAgICAgaW5kZXg6ICh0b3RhbFBhZ2VzID4gMCAmJiBwYWdlID49IHRvdGFsUGFnZXMpID8gdG90YWxQYWdlcyAtIDEgOiBwYWdlLFxuICAgICAgICAgICAgcmVjb3Jkc1BlclBhZ2U6IHBlclBhZ2VcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQ6IElUcmVlR3JpZFJlY29yZFtdID0gRGF0YVV0aWwucGFnZShjbG9uZUFycmF5KGNvbGxlY3Rpb24pLCBzdGF0ZSk7XG4gICAgICAgIGdyaWQucGFnaW5nU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgKGdyaWQgYXMgYW55KS5fcGFnZSA9IHN0YXRlLmluZGV4O1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqIEBoaWRkZW4gKi9cbkBQaXBlKHtcbiAgICBuYW1lOiAndHJlZUdyaWRUcmFuc2FjdGlvbicsXG4gICAgcHVyZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hUcmVlR3JpZFRyYW5zYWN0aW9uUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gICAgcHJpdmF0ZSBncmlkQVBJOiBJZ3hUcmVlR3JpZEFQSVNlcnZpY2U7XG5cbiAgICBjb25zdHJ1Y3RvcihncmlkQVBJOiBHcmlkQmFzZUFQSVNlcnZpY2U8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4pIHtcbiAgICAgICAgdGhpcy5ncmlkQVBJID0gPElneFRyZWVHcmlkQVBJU2VydmljZT5ncmlkQVBJO1xuICAgIH1cblxuICAgIHRyYW5zZm9ybShjb2xsZWN0aW9uOiBhbnlbXSwgaWQ6IHN0cmluZywgcGlwZVRyaWdnZXI6IG51bWJlcik6IGFueVtdIHtcbiAgICAgICAgY29uc3QgZ3JpZDogSWd4VHJlZUdyaWRDb21wb25lbnQgPSB0aGlzLmdyaWRBUEkuZ3JpZDtcblxuICAgICAgICBpZiAoZ3JpZC50cmFuc2FjdGlvbnMuZW5hYmxlZCkge1xuICAgICAgICAgICAgY29uc3QgYWdncmVnYXRlZENoYW5nZXMgPSBncmlkLnRyYW5zYWN0aW9ucy5nZXRBZ2dyZWdhdGVkQ2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgIGlmIChhZ2dyZWdhdGVkQ2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJpbWFyeUtleSA9IGdyaWQucHJpbWFyeUtleTtcbiAgICAgICAgICAgICAgICBpZiAoIXByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZm9yZWlnbktleSA9IGdyaWQuZm9yZWlnbktleTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZERhdGFLZXkgPSBncmlkLmNoaWxkRGF0YUtleTtcblxuICAgICAgICAgICAgICAgIGlmIChmb3JlaWduS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsYXREYXRhQ2xvbmUgPSBjbG9uZUFycmF5KGNvbGxlY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0YVV0aWwubWVyZ2VUcmFuc2FjdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGF0RGF0YUNsb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlZENoYW5nZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBncmlkLnByaW1hcnlLZXkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGREYXRhS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZXJhcmNoaWNhbERhdGFDbG9uZSA9IGNsb25lSGllcmFyY2hpY2FsQXJyYXkoY29sbGVjdGlvbiwgY2hpbGREYXRhS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERhdGFVdGlsLm1lcmdlSGllcmFyY2hpY2FsVHJhbnNhY3Rpb25zKFxuICAgICAgICAgICAgICAgICAgICAgICAgaGllcmFyY2hpY2FsRGF0YUNsb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlZENoYW5nZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERhdGFLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBncmlkLnByaW1hcnlLZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG59XG4iXX0=