@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
253 lines • 35.8 kB
JavaScript
import { __decorate } from "tslib";
import { GridBaseAPIService } from '../api.service';
import { DataType } from '../../data-operations/data-util';
import { TransactionType } from '../../services';
import { mergeObjects } from '../../core/utils';
import { Injectable } from '@angular/core';
let IgxTreeGridAPIService = class IgxTreeGridAPIService extends GridBaseAPIService {
get_all_data(transactions) {
const grid = this.grid;
const data = transactions ? grid.dataWithAddedInTransactionRows : grid.flatData;
return data ? data : [];
}
get_summary_data() {
const grid = this.grid;
const data = grid.processedRootRecords.filter(row => row.isFilteredOutParent === undefined || row.isFilteredOutParent === false)
.map(rec => rec.data);
if (grid.transactions.enabled) {
const deletedRows = grid.transactions.getTransactionLog().filter(t => t.type === TransactionType.DELETE).map(t => t.id);
deletedRows.forEach(rowID => {
const tempData = grid.primaryKey ? data.map(rec => rec[grid.primaryKey]) : data;
const index = tempData.indexOf(rowID);
if (index !== -1) {
data.splice(index, 1);
}
});
}
return data;
}
expand_row(rowID) {
const grid = this.grid;
const expandedStates = grid.expansionStates;
expandedStates.set(rowID, true);
grid.expansionStates = expandedStates;
if (grid.rowEditable) {
grid.endEdit(true);
}
}
collapse_row(rowID) {
const grid = this.grid;
const expandedStates = grid.expansionStates;
expandedStates.set(rowID, false);
grid.expansionStates = expandedStates;
if (grid.rowEditable) {
grid.endEdit(true);
}
}
toggle_row_expansion(rowID) {
const grid = this.grid;
const expandedStates = grid.expansionStates;
const treeRecord = grid.records.get(rowID);
if (treeRecord) {
const isExpanded = this.get_row_expansion_state(treeRecord);
expandedStates.set(rowID, !isExpanded);
grid.expansionStates = expandedStates;
}
if (grid.rowEditable) {
grid.endEdit(true);
}
}
// TODO: Maybe move the focus logic in the tree cell ?
trigger_row_expansion_toggle(row, expanded, event, visibleColumnIndex) {
const grid = this.grid;
if (row.expanded === expanded ||
((!row.children || !row.children.length) && (!grid.loadChildrenOnDemand ||
(grid.hasChildrenKey && !row.data[grid.hasChildrenKey])))) {
return;
}
const args = {
rowID: row.rowID,
expanded: expanded,
event: event,
cancel: false
};
grid.onRowToggle.emit(args);
if (args.cancel) {
return;
}
visibleColumnIndex = visibleColumnIndex ? visibleColumnIndex : 0;
const expandedStates = grid.expansionStates;
expandedStates.set(row.rowID, expanded);
grid.expansionStates = expandedStates;
if (grid.rowEditable) {
grid.endEdit(true);
}
// TODO: Leave it to grid observer
requestAnimationFrame(() => {
const el = this.grid.selectionService.activeElement;
if (el) {
const cell = this.get_cell_by_visible_index(el.row, el.column);
if (cell) {
cell.nativeElement.focus();
}
}
});
}
expand_path_to_record(record) {
const grid = this.grid;
const expandedStates = grid.expansionStates;
while (record.parent) {
record = record.parent;
const expanded = this.get_row_expansion_state(record);
if (!expanded) {
expandedStates.set(record.rowID, true);
}
}
grid.expansionStates = expandedStates;
if (grid.rowEditable) {
grid.endEdit(true);
}
}
get_row_expansion_state(record) {
const grid = this.grid;
const states = grid.expansionStates;
const expanded = states.get(record.rowID);
if (expanded !== undefined) {
return expanded;
}
else {
return record.children && record.children.length && record.level < grid.expansionDepth;
}
}
update_row_in_array(value, rowID, index) {
const grid = this.grid;
if (grid.primaryKey && grid.foreignKey) {
super.update_row_in_array(value, rowID, index);
}
else {
const record = grid.records.get(rowID);
const childData = record.parent ? record.parent.data[grid.childDataKey] : grid.data;
index = grid.primaryKey ? childData.map(c => c[grid.primaryKey]).indexOf(rowID) :
childData.indexOf(rowID);
childData[index] = value;
}
}
should_apply_number_style(column) {
return column.dataType === DataType.Number && column.visibleIndex !== 0;
}
deleteRowById(rowID) {
const treeGrid = this.grid;
const flatDataWithCascadeOnDeleteAndTransactions = treeGrid.primaryKey &&
treeGrid.foreignKey &&
treeGrid.cascadeOnDelete &&
treeGrid.transactions.enabled;
if (flatDataWithCascadeOnDeleteAndTransactions) {
treeGrid.transactions.startPending();
}
super.deleteRowById(rowID);
if (flatDataWithCascadeOnDeleteAndTransactions) {
treeGrid.transactions.endPending(true);
}
}
deleteRowFromData(rowID, index) {
const treeGrid = this.grid;
const record = treeGrid.records.get(rowID);
if (treeGrid.primaryKey && treeGrid.foreignKey) {
index = treeGrid.primaryKey ?
treeGrid.data.map(c => c[treeGrid.primaryKey]).indexOf(rowID) :
treeGrid.data.indexOf(rowID);
super.deleteRowFromData(rowID, index);
if (treeGrid.cascadeOnDelete) {
if (record && record.children && record.children.length > 0) {
for (let i = 0; i < record.children.length; i++) {
const child = record.children[i];
super.deleteRowById(child.rowID);
}
}
}
}
else {
const collection = record.parent ? record.parent.data[treeGrid.childDataKey] : treeGrid.data;
index = treeGrid.primaryKey ?
collection.map(c => c[treeGrid.primaryKey]).indexOf(rowID) :
collection.indexOf(rowID);
const selectedChildren = [];
this.get_selected_children(record, selectedChildren);
if (selectedChildren.length > 0) {
treeGrid.deselectRows(selectedChildren);
}
if (treeGrid.transactions.enabled) {
const path = treeGrid.generateRowPath(rowID);
treeGrid.transactions.add({
id: rowID,
type: TransactionType.DELETE,
newValue: null,
path: path
}, collection[index]);
}
else {
collection.splice(index, 1);
}
}
}
/**
* Updates related row of provided grid's data source with provided new row value
* @param grid Grid to update data for
* @param rowID ID of the row to update
* @param rowValueInDataSource Initial value of the row as it is in data source
* @param rowCurrentValue Current value of the row as it is with applied previous transactions
* @param rowNewValue New value of the row
*/
updateData(grid, rowID, rowValueInDataSource, rowCurrentValue, rowNewValue) {
if (grid.transactions.enabled) {
const path = grid.generateRowPath(rowID);
const transaction = {
id: rowID,
type: TransactionType.UPDATE,
newValue: rowNewValue,
path: path
};
grid.transactions.add(transaction, rowCurrentValue);
}
else {
mergeObjects(rowValueInDataSource, rowNewValue);
}
}
get_selected_children(record, selectedRowIDs) {
const grid = this.grid;
if (!record.children || record.children.length === 0) {
return;
}
for (const child of record.children) {
if (grid.selectionService.isRowSelected(child.rowID)) {
selectedRowIDs.push(child.rowID);
}
this.get_selected_children(child, selectedRowIDs);
}
}
row_deleted_transaction(rowID) {
return this.row_deleted_parent(rowID) || super.row_deleted_transaction(rowID);
}
row_deleted_parent(rowID) {
const grid = this.grid;
if (!grid) {
return false;
}
if ((grid.cascadeOnDelete && grid.foreignKey) || grid.childDataKey) {
let node = grid.records.get(rowID);
while (node) {
const state = grid.transactions.getState(node.rowID);
if (state && state.type === TransactionType.DELETE) {
return true;
}
node = node.parent;
}
}
return false;
}
};
IgxTreeGridAPIService = __decorate([
Injectable()
], IgxTreeGridAPIService);
export { IgxTreeGridAPIService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1ncmlkLWFwaS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy90cmVlLWdyaWQvdHJlZS1ncmlkLWFwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHM0QsT0FBTyxFQUEyQixlQUFlLEVBQVMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzQyxJQUFhLHFCQUFxQixHQUFsQyxNQUFhLHFCQUFzQixTQUFRLGtCQUF3QztJQUN4RSxZQUFZLENBQUMsWUFBc0I7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNoRixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLGdCQUFnQjtRQUNuQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxtQkFBbUIsS0FBSyxLQUFLLENBQUM7YUFDM0gsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUks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S0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BDO1lBQ0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztTQUNyRDtJQUNMLENBQUM7SUFFTSx1QkFBdUIsQ0FBQyxLQUFVO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRU8sa0JBQWtCLENBQUMsS0FBVTtRQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2hFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLE9BQU8sSUFBSSxFQUFFO2dCQUNULE1BQU0sS0FBSyxHQUFVLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsTUFBTSxFQUFFO29CQUNoRCxPQUFPLElBQUksQ0FBQztpQkFDZjtnQkFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUN0QjtTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKLENBQUE7QUFwUlkscUJBQXFCO0lBRGpDLFVBQVUsRUFBRTtHQUNBLHFCQUFxQixDQW9SakM7U0FwUlkscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR3JpZEJhc2VBUElTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4VHJlZUdyaWRDb21wb25lbnQgfSBmcm9tICcuL3RyZWUtZ3JpZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IElUcmVlR3JpZFJlY29yZCB9IGZyb20gJy4vdHJlZS1ncmlkLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgSVJvd1RvZ2dsZUV2ZW50QXJncyB9IGZyb20gJy4vdHJlZS1ncmlkLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgSGllcmFyY2hpY2FsVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uVHlwZSwgU3RhdGUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBtZXJnZU9iamVjdHMgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbHVtblR5cGUgfSBmcm9tICcuLi9jb21tb24vY29sdW1uLmludGVyZmFjZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBJZ3hUcmVlR3JpZEFQSVNlcnZpY2UgZXh0ZW5kcyBHcmlkQmFzZUFQSVNlcnZpY2U8SWd4VHJlZUdyaWRDb21wb25lbnQ+IHtcbiAgICBwdWJsaWMgZ2V0X2FsbF9kYXRhKHRyYW5zYWN0aW9ucz86IGJvb2xlYW4pOiBhbnlbXSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0cmFuc2FjdGlvbnMgPyBncmlkLmRhdGFXaXRoQWRkZWRJblRyYW5zYWN0aW9uUm93cyA6IGdyaWQuZmxhdERhdGE7XG4gICAgICAgIHJldHVybiBkYXRhID8gZGF0YSA6IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRfc3VtbWFyeV9kYXRhKCkge1xuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuICAgICAgICBjb25zdCBkYXRhID0gZ3JpZC5wcm9jZXNzZWRSb290UmVjb3Jkcy5maWx0ZXIocm93ID0+IHJvdy5pc0ZpbHRlcmVkT3V0UGFyZW50ID09PSB1bmRlZmluZWQgfHwgcm93LmlzRmlsdGVyZWRPdXRQYXJlbnQgPT09IGZhbHNlKVxuICAgICAgICAgICAgLm1hcChyZWMgPT4gcmVjLmRhdGEpO1xuICAgICAgICBpZiAoZ3JpZC50cmFuc2FjdGlvbnMuZW5hYmxlZCkge1xuICAgICAgICAgICAgY29uc3QgZGVsZXRlZFJvd3MgPSBncmlkLnRyYW5zYWN0aW9ucy5nZXRUcmFuc2FjdGlvbkxvZygpLmZpbHRlcih0ID0+IHQudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkRFTEVURSkubWFwKHQgPT4gdC5pZCk7XG4gICAgICAgICAgICBkZWxldGVkUm93cy5mb3JFYWNoKHJvd0lEID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wRGF0YSA9IGdyaWQucHJpbWFyeUtleSA/IGRhdGEubWFwKHJlYyA9PiByZWNbZ3JpZC5wcmltYXJ5S2V5XSkgOiBkYXRhO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGVtcERhdGEuaW5kZXhPZihyb3dJRCk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGV4cGFuZF9yb3cocm93SUQ6IGFueSkge1xuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuICAgICAgICBjb25zdCBleHBhbmRlZFN0YXRlcyA9IGdyaWQuZXhwYW5zaW9uU3RhdGVzO1xuICAgICAgICBleHBhbmRlZFN0YXRlcy5zZXQocm93SUQsIHRydWUpO1xuICAgICAgICBncmlkLmV4cGFuc2lvblN0YXRlcyA9IGV4cGFuZGVkU3RhdGVzO1xuICAgICAgICBpZiAoZ3JpZC5yb3dFZGl0YWJsZSkge1xuICAgICAgICAgICAgZ3JpZC5lbmRFZGl0KHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNvbGxhcHNlX3Jvdyhyb3dJRDogYW55KSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkU3RhdGVzID0gZ3JpZC5leHBhbnNpb25TdGF0ZXM7XG4gICAgICAgIGV4cGFuZGVkU3RhdGVzLnNldChyb3dJRCwgZmFsc2UpO1xuICAgICAgICBncmlkLmV4cGFuc2lvblN0YXRlcyA9IGV4cGFuZGVkU3RhdGVzO1xuICAgICAgICBpZiAoZ3JpZC5yb3dFZGl0YWJsZSkge1xuICAgICAgICAgICAgZ3JpZC5lbmRFZGl0KHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZV9yb3dfZXhwYW5zaW9uKHJvd0lEOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRTdGF0ZXMgPSBncmlkLmV4cGFuc2lvblN0YXRlcztcbiAgICAgICAgY29uc3QgdHJlZVJlY29yZCA9IGdyaWQucmVjb3Jkcy5nZXQocm93SUQpO1xuXG4gICAgICAgIGlmICh0cmVlUmVjb3JkKSB7XG4gICAgICAgICAgICBjb25zdCBpc0V4cGFuZGVkID0gdGhpcy5nZXRfcm93X2V4cGFuc2lvbl9zdGF0ZSh0cmVlUmVjb3JkKTtcbiAgICAgICAgICAgIGV4cGFuZGVkU3RhdGVzLnNldChyb3dJRCwgIWlzRXhwYW5kZWQpO1xuICAgICAgICAgICAgZ3JpZC5leHBhbnNpb25TdGF0ZXMgPSBleHBhbmRlZFN0YXRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ3JpZC5yb3dFZGl0YWJsZSkge1xuICAgICAgICAgICAgZ3JpZC5lbmRFZGl0KHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogTWF5YmUgbW92ZSB0aGUgZm9jdXMgbG9naWMgaW4gdGhlIHRyZWUgY2VsbCA/XG4gICAgcHVibGljIHRyaWdnZXJfcm93X2V4cGFuc2lvbl90b2dnbGUocm93OiBJVHJlZUdyaWRSZWNvcmQsIGV4cGFuZGVkOiBib29sZWFuLCBldmVudD86IEV2ZW50LCB2aXNpYmxlQ29sdW1uSW5kZXg/KSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG5cbiAgICAgICAgaWYgKHJvdy5leHBhbmRlZCA9PT0gZXhwYW5kZWQgfHxcbiAgICAgICAgICAgICgoIXJvdy5jaGlsZHJlbiB8fCAhcm93LmNoaWxkcmVuLmxlbmd0aCkgJiYgKCFncmlkLmxvYWRDaGlsZHJlbk9uRGVtYW5kIHx8XG4gICAgICAgICAgICAoZ3JpZC5oYXNDaGlsZHJlbktleSAmJiAhcm93LmRhdGFbZ3JpZC5oYXNDaGlsZHJlbktleV0pKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFyZ3M6IElSb3dUb2dnbGVFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICByb3dJRDogcm93LnJvd0lELFxuICAgICAgICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgY2FuY2VsOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBncmlkLm9uUm93VG9nZ2xlLmVtaXQoYXJncyk7XG5cbiAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmlzaWJsZUNvbHVtbkluZGV4ID0gdmlzaWJsZUNvbHVtbkluZGV4ID8gdmlzaWJsZUNvbHVtbkluZGV4IDogMDtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRTdGF0ZXMgPSBncmlkLmV4cGFuc2lvblN0YXRlcztcbiAgICAgICAgZXhwYW5kZWRTdGF0ZXMuc2V0KHJvdy5yb3dJRCwgZXhwYW5kZWQpO1xuICAgICAgICBncmlkLmV4cGFuc2lvblN0YXRlcyA9IGV4cGFuZGVkU3RhdGVzO1xuXG4gICAgICAgIGlmIChncmlkLnJvd0VkaXRhYmxlKSB7XG4gICAgICAgICAgICBncmlkLmVuZEVkaXQodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBMZWF2ZSBpdCB0byBncmlkIG9ic2VydmVyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMuZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5nZXRfY2VsbF9ieV92aXNpYmxlX2luZGV4KGVsLnJvdywgZWwuY29sdW1uKTtcbiAgICAgICAgICAgICAgICBpZiAoY2VsbCkge1xuICAgICAgICAgICAgICAgICAgICBjZWxsLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBleHBhbmRfcGF0aF90b19yZWNvcmQocmVjb3JkOiBJVHJlZUdyaWRSZWNvcmQpIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRTdGF0ZXMgPSBncmlkLmV4cGFuc2lvblN0YXRlcztcblxuICAgICAgICB3aGlsZSAocmVjb3JkLnBhcmVudCkge1xuICAgICAgICAgICAgcmVjb3JkID0gcmVjb3JkLnBhcmVudDtcbiAgICAgICAgICAgIGNvbnN0IGV4cGFuZGVkID0gdGhpcy5nZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyZWNvcmQpO1xuXG4gICAgICAgICAgICBpZiAoIWV4cGFuZGVkKSB7XG4gICAgICAgICAgICAgICAgZXhwYW5kZWRTdGF0ZXMuc2V0KHJlY29yZC5yb3dJRCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ3JpZC5leHBhbnNpb25TdGF0ZXMgPSBleHBhbmRlZFN0YXRlcztcblxuICAgICAgICBpZiAoZ3JpZC5yb3dFZGl0YWJsZSkge1xuICAgICAgICAgICAgZ3JpZC5lbmRFZGl0KHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHJlY29yZDogSVRyZWVHcmlkUmVjb3JkKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IHN0YXRlcyA9IGdyaWQuZXhwYW5zaW9uU3RhdGVzO1xuICAgICAgICBjb25zdCBleHBhbmRlZCA9IHN0YXRlcy5nZXQocmVjb3JkLnJvd0lEKTtcblxuICAgICAgICBpZiAoZXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGFuZGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlY29yZC5jaGlsZHJlbiAmJiByZWNvcmQuY2hpbGRyZW4ubGVuZ3RoICYmIHJlY29yZC5sZXZlbCA8IGdyaWQuZXhwYW5zaW9uRGVwdGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdXBkYXRlX3Jvd19pbl9hcnJheSh2YWx1ZTogYW55LCByb3dJRDogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGlmIChncmlkLnByaW1hcnlLZXkgJiYgZ3JpZC5mb3JlaWduS2V5KSB7XG4gICAgICAgICAgICBzdXBlci51cGRhdGVfcm93X2luX2FycmF5KHZhbHVlLCByb3dJRCwgaW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gZ3JpZC5yZWNvcmRzLmdldChyb3dJRCk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZERhdGEgPSByZWNvcmQucGFyZW50ID8gcmVjb3JkLnBhcmVudC5kYXRhW2dyaWQuY2hpbGREYXRhS2V5XSA6IGdyaWQuZGF0YTtcbiAgICAgICAgICAgIGluZGV4ID0gZ3JpZC5wcmltYXJ5S2V5ID8gY2hpbGREYXRhLm1hcChjID0+IGNbZ3JpZC5wcmltYXJ5S2V5XSkuaW5kZXhPZihyb3dJRCkgOlxuICAgICAgICAgICAgICAgIGNoaWxkRGF0YS5pbmRleE9mKHJvd0lEKTtcbiAgICAgICAgICAgIGNoaWxkRGF0YVtpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzaG91bGRfYXBwbHlfbnVtYmVyX3N0eWxlKGNvbHVtbjogQ29sdW1uVHlwZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29sdW1uLmRhdGFUeXBlID09PSBEYXRhVHlwZS5OdW1iZXIgJiYgY29sdW1uLnZpc2libGVJbmRleCAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlUm93QnlJZChyb3dJRDogYW55KSB7XG4gICAgICAgIGNvbnN0IHRyZWVHcmlkID0gdGhpcy5ncmlkO1xuICAgICAgICBjb25zdCBmbGF0RGF0YVdpdGhDYXNjYWRlT25EZWxldGVBbmRUcmFuc2FjdGlvbnMgPVxuICAgICAgICB0cmVlR3JpZC5wcmltYXJ5S2V5ICYmXG4gICAgICAgIHRyZWVHcmlkLmZvcmVpZ25LZXkgJiZcbiAgICAgICAgdHJlZUdyaWQuY2FzY2FkZU9uRGVsZXRlICYmXG4gICAgICAgIHRyZWVHcmlkLnRyYW5zYWN0aW9ucy5lbmFibGVkO1xuXG4gICAgICAgIGlmIChmbGF0RGF0YVdpdGhDYXNjYWRlT25EZWxldGVBbmRUcmFuc2FjdGlvbnMpIHtcbiAgICAgICAgICAgIHRyZWVHcmlkLnRyYW5zYWN0aW9ucy5zdGFydFBlbmRpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLmRlbGV0ZVJvd0J5SWQocm93SUQpO1xuXG4gICAgICAgIGlmIChmbGF0RGF0YVdpdGhDYXNjYWRlT25EZWxldGVBbmRUcmFuc2FjdGlvbnMpIHtcbiAgICAgICAgICAgIHRyZWVHcmlkLnRyYW5zYWN0aW9ucy5lbmRQZW5kaW5nKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZVJvd0Zyb21EYXRhKHJvd0lEOiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgdHJlZUdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHRyZWVHcmlkLnJlY29yZHMuZ2V0KHJvd0lEKTtcblxuICAgICAgICBpZiAodHJlZUdyaWQucHJpbWFyeUtleSAmJiB0cmVlR3JpZC5mb3JlaWduS2V5KSB7XG4gICAgICAgICAgICBpbmRleCA9IHRyZWVHcmlkLnByaW1hcnlLZXkgP1xuICAgICAgICAgICAgICAgIHRyZWVHcmlkLmRhdGEubWFwKGMgPT4gY1t0cmVlR3JpZC5wcmltYXJ5S2V5XSkuaW5kZXhPZihyb3dJRCkgOlxuICAgICAgICAgICAgICAgIHRyZWVHcmlkLmRhdGEuaW5kZXhPZihyb3dJRCk7XG4gICAgICAgICAgICBzdXBlci5kZWxldGVSb3dGcm9tRGF0YShyb3dJRCwgaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAodHJlZUdyaWQuY2FzY2FkZU9uRGVsZXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZCAmJiByZWNvcmQuY2hpbGRyZW4gJiYgcmVjb3JkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWNvcmQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gcmVjb3JkLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZGVsZXRlUm93QnlJZChjaGlsZC5yb3dJRCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gcmVjb3JkLnBhcmVudCA/IHJlY29yZC5wYXJlbnQuZGF0YVt0cmVlR3JpZC5jaGlsZERhdGFLZXldIDogdHJlZUdyaWQuZGF0YTtcbiAgICAgICAgICAgIGluZGV4ID0gdHJlZUdyaWQucHJpbWFyeUtleSA/XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbi5tYXAoYyA9PiBjW3RyZWVHcmlkLnByaW1hcnlLZXldKS5pbmRleE9mKHJvd0lEKSA6XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbi5pbmRleE9mKHJvd0lEKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgdGhpcy5nZXRfc2VsZWN0ZWRfY2hpbGRyZW4ocmVjb3JkLCBzZWxlY3RlZENoaWxkcmVuKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZENoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0cmVlR3JpZC5kZXNlbGVjdFJvd3Moc2VsZWN0ZWRDaGlsZHJlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0cmVlR3JpZC50cmFuc2FjdGlvbnMuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSB0cmVlR3JpZC5nZW5lcmF0ZVJvd1BhdGgocm93SUQpO1xuICAgICAgICAgICAgICAgIHRyZWVHcmlkLnRyYW5zYWN0aW9ucy5hZGQoe1xuICAgICAgICAgICAgICAgICAgICBpZDogcm93SUQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5ERUxFVEUsXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBwYXRoXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbltpbmRleF1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHJlbGF0ZWQgcm93IG9mIHByb3ZpZGVkIGdyaWQncyBkYXRhIHNvdXJjZSB3aXRoIHByb3ZpZGVkIG5ldyByb3cgdmFsdWVcbiAgICAgKiBAcGFyYW0gZ3JpZCBHcmlkIHRvIHVwZGF0ZSBkYXRhIGZvclxuICAgICAqIEBwYXJhbSByb3dJRCBJRCBvZiB0aGUgcm93IHRvIHVwZGF0ZVxuICAgICAqIEBwYXJhbSByb3dWYWx1ZUluRGF0YVNvdXJjZSBJbml0aWFsIHZhbHVlIG9mIHRoZSByb3cgYXMgaXQgaXMgaW4gZGF0YSBzb3VyY2VcbiAgICAgKiBAcGFyYW0gcm93Q3VycmVudFZhbHVlIEN1cnJlbnQgdmFsdWUgb2YgdGhlIHJvdyBhcyBpdCBpcyB3aXRoIGFwcGxpZWQgcHJldmlvdXMgdHJhbnNhY3Rpb25zXG4gICAgICogQHBhcmFtIHJvd05ld1ZhbHVlIE5ldyB2YWx1ZSBvZiB0aGUgcm93XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZURhdGEoXG4gICAgICAgIGdyaWQ6IElneFRyZWVHcmlkQ29tcG9uZW50LFxuICAgICAgICByb3dJRDogYW55LFxuICAgICAgICByb3dWYWx1ZUluRGF0YVNvdXJjZTogYW55LFxuICAgICAgICByb3dDdXJyZW50VmFsdWU6IGFueSxcbiAgICAgICAgcm93TmV3VmFsdWU6IHsgW3g6IHN0cmluZ106IGFueSB9KSB7XG4gICAgICAgIGlmIChncmlkLnRyYW5zYWN0aW9ucy5lbmFibGVkKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gZ3JpZC5nZW5lcmF0ZVJvd1BhdGgocm93SUQpO1xuICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb246IEhpZXJhcmNoaWNhbFRyYW5zYWN0aW9uID0ge1xuICAgICAgICAgICAgICAgIGlkOiByb3dJRCxcbiAgICAgICAgICAgICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuVVBEQVRFLFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiByb3dOZXdWYWx1ZSxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZ3JpZC50cmFuc2FjdGlvbnMuYWRkKHRyYW5zYWN0aW9uLCByb3dDdXJyZW50VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWVyZ2VPYmplY3RzKHJvd1ZhbHVlSW5EYXRhU291cmNlLCByb3dOZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0X3NlbGVjdGVkX2NoaWxkcmVuKHJlY29yZDogSVRyZWVHcmlkUmVjb3JkLCBzZWxlY3RlZFJvd0lEczogYW55W10pIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgaWYgKCFyZWNvcmQuY2hpbGRyZW4gfHwgcmVjb3JkLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgcmVjb3JkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmlzUm93U2VsZWN0ZWQoY2hpbGQucm93SUQpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRSb3dJRHMucHVzaChjaGlsZC5yb3dJRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdldF9zZWxlY3RlZF9jaGlsZHJlbihjaGlsZCwgc2VsZWN0ZWRSb3dJRHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJvd19kZWxldGVkX3RyYW5zYWN0aW9uKHJvd0lEOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93X2RlbGV0ZWRfcGFyZW50KHJvd0lEKSB8fCBzdXBlci5yb3dfZGVsZXRlZF90cmFuc2FjdGlvbihyb3dJRCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByb3dfZGVsZXRlZF9wYXJlbnQocm93SUQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuICAgICAgICBpZiAoIWdyaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGdyaWQuY2FzY2FkZU9uRGVsZXRlICYmIGdyaWQuZm9yZWlnbktleSkgfHwgZ3JpZC5jaGlsZERhdGFLZXkpIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gZ3JpZC5yZWNvcmRzLmdldChyb3dJRCk7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlOiBTdGF0ZSA9IGdyaWQudHJhbnNhY3Rpb25zLmdldFN0YXRlKG5vZGUucm93SUQpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuREVMRVRFKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiJdfQ==