@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
211 lines • 28.7 kB
JavaScript
import { __extends, __read, __spread, __values } from "tslib";
import { cloneArray } from '../core/utils';
import { SortingDirection } from './sorting-expression.interface';
import { getHierarchy, isHierarchyMatch } from './operations';
var DefaultSortingStrategy = /** @class */ (function () {
function DefaultSortingStrategy() {
}
DefaultSortingStrategy.instance = function () {
return this._instance || (this._instance = new this());
};
DefaultSortingStrategy.prototype.sort = function (data, fieldName, dir, ignoreCase, valueResolver) {
var _this = this;
var key = fieldName;
var reverse = (dir === SortingDirection.Desc ? -1 : 1);
var cmpFunc = function (obj1, obj2) {
return _this.compareObjects(obj1, obj2, key, reverse, ignoreCase, valueResolver);
};
return this.arraySort(data, cmpFunc);
};
DefaultSortingStrategy.prototype.compareValues = function (a, b) {
var an = (a === null || a === undefined);
var bn = (b === null || b === undefined);
if (an) {
if (bn) {
return 0;
}
return -1;
}
else if (bn) {
return 1;
}
return a > b ? 1 : a < b ? -1 : 0;
};
DefaultSortingStrategy.prototype.compareObjects = function (obj1, obj2, key, reverse, ignoreCase, valueResolver) {
var a = valueResolver(obj1, key);
var b = valueResolver(obj2, key);
if (ignoreCase) {
a = a && a.toLowerCase ? a.toLowerCase() : a;
b = b && b.toLowerCase ? b.toLowerCase() : b;
}
return reverse * this.compareValues(a, b);
};
DefaultSortingStrategy.prototype.arraySort = function (data, compareFn) {
return data.sort(compareFn);
};
DefaultSortingStrategy._instance = null;
return DefaultSortingStrategy;
}());
export { DefaultSortingStrategy };
var NoopSortingStrategy = /** @class */ (function () {
function NoopSortingStrategy() {
}
NoopSortingStrategy.instance = function () {
return this._instance || (this._instance = new NoopSortingStrategy());
};
NoopSortingStrategy.prototype.sort = function (data, expressions) {
return data;
};
NoopSortingStrategy._instance = null;
return NoopSortingStrategy;
}());
export { NoopSortingStrategy };
var IgxSorting = /** @class */ (function () {
function IgxSorting() {
}
IgxSorting.prototype.sort = function (data, expressions) {
return this.sortDataRecursive(data, expressions);
};
IgxSorting.prototype.groupedRecordsByExpression = function (data, index, expression) {
var i;
var groupval;
var res = [];
var key = expression.fieldName;
var len = data.length;
res.push(data[index]);
groupval = this.getFieldValue(data[index], key);
index++;
var comparer = expression.groupingComparer || DefaultSortingStrategy.instance().compareValues;
for (i = index; i < len; i++) {
if (comparer(this.getFieldValue(data[i], key), groupval) === 0) {
res.push(data[i]);
}
else {
break;
}
}
return res;
};
IgxSorting.prototype.sortDataRecursive = function (data, expressions, expressionIndex) {
if (expressionIndex === void 0) { expressionIndex = 0; }
var i;
var j;
var expr;
var gbData;
var gbDataLen;
var exprsLen = expressions.length;
var dataLen = data.length;
expressionIndex = expressionIndex || 0;
if (expressionIndex >= exprsLen || dataLen <= 1) {
return data;
}
expr = expressions[expressionIndex];
if (!expr.strategy) {
expr.strategy = DefaultSortingStrategy.instance();
}
data = expr.strategy.sort(data, expr.fieldName, expr.dir, expr.ignoreCase, this.getFieldValue);
if (expressionIndex === exprsLen - 1) {
return data;
}
// in case of multiple sorting
for (i = 0; i < dataLen; i++) {
gbData = this.groupedRecordsByExpression(data, i, expr);
gbDataLen = gbData.length;
if (gbDataLen > 1) {
gbData = this.sortDataRecursive(gbData, expressions, expressionIndex + 1);
}
for (j = 0; j < gbDataLen; j++) {
data[i + j] = gbData[j];
}
i += gbDataLen - 1;
}
return data;
};
IgxSorting.prototype.groupDataRecursive = function (data, state, level, parent, metadata, grid, groupsRecords, fullResult) {
if (grid === void 0) { grid = null; }
if (groupsRecords === void 0) { groupsRecords = []; }
if (fullResult === void 0) { fullResult = { data: [], metadata: [] }; }
var expressions = state.expressions;
var expansion = state.expansion;
var i = 0;
var result = [];
var _loop_1 = function () {
var e_1, _a;
var group = this_1.groupedRecordsByExpression(data, i, expressions[level]);
var groupRow = {
expression: expressions[level],
level: level,
records: cloneArray(group),
value: group[0][expressions[level].fieldName],
groupParent: parent,
groups: [],
height: grid ? grid.renderedRowHeight : null
};
if (parent) {
parent.groups.push(groupRow);
}
else {
groupsRecords.push(groupRow);
}
var hierarchy = getHierarchy(groupRow);
var expandState = expansion.find(function (s) {
return isHierarchyMatch(s.hierarchy || [{ fieldName: groupRow.expression.fieldName, value: groupRow.value }], hierarchy);
});
var expanded = expandState ? expandState.expanded : state.defaultExpanded;
var recursiveResult = void 0;
result.push(groupRow);
metadata.push(null);
fullResult.data.push(groupRow);
fullResult.metadata.push(null);
if (level < expressions.length - 1) {
recursiveResult = this_1.groupDataRecursive(group, state, level + 1, groupRow, expanded ? metadata : [], grid, groupsRecords, fullResult);
if (expanded) {
result = result.concat(recursiveResult);
}
}
else {
try {
for (var group_1 = (e_1 = void 0, __values(group)), group_1_1 = group_1.next(); !group_1_1.done; group_1_1 = group_1.next()) {
var groupItem = group_1_1.value;
fullResult.metadata.push(groupRow);
fullResult.data.push(groupItem);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (group_1_1 && !group_1_1.done && (_a = group_1.return)) _a.call(group_1);
}
finally { if (e_1) throw e_1.error; }
}
if (expanded) {
metadata.push.apply(metadata, __spread(fullResult.metadata.slice(fullResult.metadata.length - group.length)));
result.push.apply(result, __spread(fullResult.data.slice(fullResult.data.length - group.length)));
}
}
i += group.length;
};
var this_1 = this;
while (i < data.length) {
_loop_1();
}
return result;
};
IgxSorting.prototype.getFieldValue = function (obj, key) {
return obj[key];
};
return IgxSorting;
}());
export { IgxSorting };
var IgxDataRecordSorting = /** @class */ (function (_super) {
__extends(IgxDataRecordSorting, _super);
function IgxDataRecordSorting() {
return _super !== null && _super.apply(this, arguments) || this;
}
IgxDataRecordSorting.prototype.getFieldValue = function (obj, key) {
return obj.data[key];
};
return IgxDataRecordSorting;
}(IgxSorting));
export { IgxDataRecordSorting };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGluZy1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFzQixnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBS3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFVOUQ7SUFHSTtJQUF5QixDQUFDO0lBRVosK0JBQVEsR0FBdEI7UUFDSSxPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU0scUNBQUksR0FBWCxVQUFZLElBQVcsRUFDWCxTQUFpQixFQUNqQixHQUFxQixFQUNyQixVQUFtQixFQUNuQixhQUE2QztRQUp6RCxpQkFXQztRQU5HLElBQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQztRQUN0QixJQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFNLE9BQU8sR0FBRyxVQUFDLElBQUksRUFBRSxJQUFJO1lBQ3ZCLE9BQU8sS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3BGLENBQUMsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVNLDhDQUFhLEdBQXBCLFVBQXFCLENBQU0sRUFB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cUJBQ25DOzs7Ozs7Ozs7Z0JBQ0QsSUFBSSxRQUFRLEVBQUU7b0JBQ1YsUUFBUSxDQUFDLElBQUksT0FBYixRQUFRLFdBQVMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFFO29CQUN2RixNQUFNLENBQUMsSUFBSSxPQUFYLE1BQU0sV0FBUyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUU7aUJBQ2hGO2FBQ0o7WUFDRCxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQzs7O1FBekN0QixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTTs7U0EwQ3JCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUNTLGtDQUFhLEdBQXZCLFVBQXdCLEdBQVEsRUFBRSxHQUFXO1FBQ3pDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFDTCxpQkFBQztBQUFELENBQUMsQUFySEQsSUFxSEM7O0FBRUQ7SUFBMEMsd0NBQVU7SUFBcEQ7O0lBSUEsQ0FBQztJQUhhLDRDQUFhLEdBQXZCLFVBQXdCLEdBQVEsRUFBRSxHQUFXO1FBQ3pDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQ0wsMkJBQUM7QUFBRCxDQUFDLEFBSkQsQ0FBMEMsVUFBVSxHQUluRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNsb25lQXJyYXkgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElHcm91cEJ5UmVjb3JkIH0gZnJvbSAnLi9ncm91cGJ5LXJlY29yZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVNvcnRpbmdFeHByZXNzaW9uLCBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi9zb3J0aW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElHcm91cGluZ0V4cHJlc3Npb24gfSBmcm9tICcuL2dyb3VwaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElHcm91cGluZ1N0YXRlIH0gZnJvbSAnLi9ncm91cGJ5LXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJR3JvdXBCeUV4cGFuZFN0YXRlIH0gZnJvbSAnLi9ncm91cGJ5LWV4cGFuZC1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUdyb3VwQnlSZXN1bHQgfSBmcm9tICcuL2dyb3VwaW5nLXJlc3VsdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZ2V0SGllcmFyY2h5LCBpc0hpZXJhcmNoeU1hdGNoIH0gZnJvbSAnLi9vcGVyYXRpb25zJztcblxuZXhwb3J0IGludGVyZmFjZSBJU29ydGluZ1N0cmF0ZWd5IHtcbiAgICBzb3J0OiAoZGF0YTogYW55W10sXG4gICAgICAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgICAgICBkaXI6IFNvcnRpbmdEaXJlY3Rpb24sXG4gICAgICAgICAgIGlnbm9yZUNhc2U6IGJvb2xlYW4sXG4gICAgICAgICAgIHZhbHVlUmVzb2x2ZXI6IChvYmo6IGFueSwga2V5OiBzdHJpbmcpID0+IGFueSkgPT4gYW55W107XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0U29ydGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSVNvcnRpbmdTdHJhdGVneSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBEZWZhdWx0U29ydGluZ1N0cmF0ZWd5ID0gbnVsbDtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlKCk6IERlZmF1bHRTb3J0aW5nU3RyYXRlZ3kge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgfHwgKHRoaXMuX2luc3RhbmNlID0gbmV3IHRoaXMoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNvcnQoZGF0YTogYW55W10sXG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgZGlyOiBTb3J0aW5nRGlyZWN0aW9uLFxuICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgdmFsdWVSZXNvbHZlcjogKG9iajogYW55LCBrZXk6IHN0cmluZykgPT4gYW55KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGZpZWxkTmFtZTtcbiAgICAgICAgY29uc3QgcmV2ZXJzZSA9IChkaXIgPT09IFNvcnRpbmdEaXJlY3Rpb24uRGVzYyA/IC0xIDogMSk7XG4gICAgICAgIGNvbnN0IGNtcEZ1bmMgPSAob2JqMSwgb2JqMikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZU9iamVjdHMob2JqMSwgb2JqMiwga2V5LCByZXZlcnNlLCBpZ25vcmVDYXNlLCB2YWx1ZVJlc29sdmVyKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlTb3J0KGRhdGEsIGNtcEZ1bmMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wYXJlVmFsdWVzKGE6IGFueSwgYjogYW55KSB7XG4gICAgICAgIGNvbnN0IGFuID0gKGEgPT09IG51bGwgfHwgYSA9PT0gdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3QgYm4gPSAoYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoYW4pIHtcbiAgICAgICAgICAgIGlmIChibikge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2UgaWYgKGJuKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbXBhcmVPYmplY3RzKG9iajE6IG9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqMjogb2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVJlc29sdmVyOiAob2JqOiBhbnksIGtleTogc3RyaW5nKSA9PiBhbnkpIHtcbiAgICAgICAgbGV0IGEgPSB2YWx1ZVJlc29sdmVyKG9iajEsIGtleSk7XG4gICAgICAgIGxldCBiID0gdmFsdWVSZXNvbHZlcihvYmoyLCBrZXkpO1xuICAgICAgICBpZiAoaWdub3JlQ2FzZSkge1xuICAgICAgICAgICAgYSA9IGEgJiYgYS50b0xvd2VyQ2FzZSA/IGEudG9Mb3dlckNhc2UoKSA6IGE7XG4gICAgICAgICAgICBiID0gYiAmJiBiLnRvTG93ZXJDYXNlID8gYi50b0xvd2VyQ2FzZSgpIDogYjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV2ZXJzZSAqIHRoaXMuY29tcGFyZVZhbHVlcyhhLCBiKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXJyYXlTb3J0KGRhdGE6IGFueVtdLCBjb21wYXJlRm4/KTogYW55W10ge1xuICAgICAgICByZXR1cm4gZGF0YS5zb3J0KGNvbXBhcmVGbik7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkU29ydGluZ1N0cmF0ZWd5IHtcbiAgICBzb3J0KGRhdGE6IGFueVtdLCBleHByZXNzaW9uczogSVNvcnRpbmdFeHByZXNzaW9uW10pOiBhbnlbXTtcbn1cblxuZXhwb3J0IGNsYXNzIE5vb3BTb3J0aW5nU3RyYXRlZ3kgaW1wbGVtZW50cyBJR3JpZFNvcnRpbmdTdHJhdGVneSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBOb29wU29ydGluZ1N0cmF0ZWd5ID0gbnVsbDtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7ICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgfHwgKHRoaXMuX2luc3RhbmNlID0gbmV3IE5vb3BTb3J0aW5nU3RyYXRlZ3koKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNvcnQoZGF0YTogYW55W10sIGV4cHJlc3Npb25zOiBJU29ydGluZ0V4cHJlc3Npb25bXSk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSWd4U29ydGluZyBpbXBsZW1lbnRzIElHcmlkU29ydGluZ1N0cmF0ZWd5IHtcbiAgICBwdWJsaWMgc29ydChkYXRhOiBhbnlbXSwgZXhwcmVzc2lvbnM6IElTb3J0aW5nRXhwcmVzc2lvbltdKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGF0YVJlY3Vyc2l2ZShkYXRhLCBleHByZXNzaW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBncm91cGVkUmVjb3Jkc0J5RXhwcmVzc2lvbihkYXRhOiBhbnlbXSxcbiAgICAgICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICBleHByZXNzaW9uOiBJR3JvdXBpbmdFeHByZXNzaW9uKTogYW55W10ge1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgbGV0IGdyb3VwdmFsO1xuICAgICAgICBjb25zdCByZXMgPSBbXTtcbiAgICAgICAgY29uc3Qga2V5ID0gZXhwcmVzc2lvbi5maWVsZE5hbWU7XG4gICAgICAgIGNvbnN0IGxlbiA9IGRhdGEubGVuZ3RoO1xuICAgICAgICByZXMucHVzaChkYXRhW2luZGV4XSk7XG4gICAgICAgIGdyb3VwdmFsID0gdGhpcy5nZXRGaWVsZFZhbHVlKGRhdGFbaW5kZXhdLCBrZXkpO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb25zdCBjb21wYXJlciA9IGV4cHJlc3Npb24uZ3JvdXBpbmdDb21wYXJlciB8fCBEZWZhdWx0U29ydGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCkuY29tcGFyZVZhbHVlcztcbiAgICAgICAgZm9yIChpID0gaW5kZXg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGNvbXBhcmVyKHRoaXMuZ2V0RmllbGRWYWx1ZShkYXRhW2ldLCBrZXkpLCBncm91cHZhbCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaChkYXRhW2ldKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcHJpdmF0ZSBzb3J0RGF0YVJlY3Vyc2l2ZTxUPihkYXRhOiBUW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uczogSVNvcnRpbmdFeHByZXNzaW9uW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSW5kZXg6IG51bWJlciA9IDApOiBUW10ge1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgbGV0IGo7XG4gICAgICAgIGxldCBleHByOiBJU29ydGluZ0V4cHJlc3Npb247XG4gICAgICAgIGxldCBnYkRhdGE7XG4gICAgICAgIGxldCBnYkRhdGFMZW47XG4gICAgICAgIGNvbnN0IGV4cHJzTGVuID0gZXhwcmVzc2lvbnMubGVuZ3RoO1xuICAgICAgICBjb25zdCBkYXRhTGVuID0gZGF0YS5sZW5ndGg7XG4gICAgICAgIGV4cHJlc3Npb25JbmRleCA9IGV4cHJlc3Npb25JbmRleCB8fCAwO1xuICAgICAgICBpZiAoZXhwcmVzc2lvbkluZGV4ID49IGV4cHJzTGVuIHx8IGRhdGFMZW4gPD0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgZXhwciA9IGV4cHJlc3Npb25zW2V4cHJlc3Npb25JbmRleF07XG4gICAgICAgIGlmICghZXhwci5zdHJhdGVneSkge1xuICAgICAgICAgICAgZXhwci5zdHJhdGVneSA9IERlZmF1bHRTb3J0aW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhID0gZXhwci5zdHJhdGVneS5zb3J0KGRhdGEsIGV4cHIuZmllbGROYW1lLCBleHByLmRpciwgZXhwci5pZ25vcmVDYXNlLCB0aGlzLmdldEZpZWxkVmFsdWUpO1xuICAgICAgICBpZiAoZXhwcmVzc2lvbkluZGV4ID09PSBleHByc0xlbiAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIC8vIGluIGNhc2Ugb2YgbXVsdGlwbGUgc29ydGluZ1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbjsgaSsrKSB7XG4gICAgICAgICAgICBnYkRhdGEgPSB0aGlzLmdyb3VwZWRSZWNvcmRzQnlFeHByZXNzaW9uKGRhdGEsIGksIGV4cHIpO1xuICAgICAgICAgICAgZ2JEYXRhTGVuID0gZ2JEYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChnYkRhdGFMZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgZ2JEYXRhID0gdGhpcy5zb3J0RGF0YVJlY3Vyc2l2ZShnYkRhdGEsIGV4cHJlc3Npb25zLCBleHByZXNzaW9uSW5kZXggKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnYkRhdGFMZW47IGorKykge1xuICAgICAgICAgICAgICAgIGRhdGFbaSArIGpdID0gZ2JEYXRhW2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSArPSBnYkRhdGFMZW4gLSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ3JvdXBEYXRhUmVjdXJzaXZlPFQ+KGRhdGE6IFRbXSwgc3RhdGU6IElHcm91cGluZ1N0YXRlLCBsZXZlbDogbnVtYmVyLFxuICAgICAgICBwYXJlbnQ6IElHcm91cEJ5UmVjb3JkLCBtZXRhZGF0YTogSUdyb3VwQnlSZWNvcmRbXSwgZ3JpZDogYW55ID0gbnVsbCxcbiAgICAgICAgZ3JvdXBzUmVjb3JkczogYW55W10gPSBbXSwgZnVsbFJlc3VsdDogSUdyb3VwQnlSZXN1bHQgPSB7IGRhdGE6IFtdLCBtZXRhZGF0YTogW10gfSk6IFRbXSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb25zID0gc3RhdGUuZXhwcmVzc2lvbnM7XG4gICAgICAgIGNvbnN0IGV4cGFuc2lvbiA9IHN0YXRlLmV4cGFuc2lvbjtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIHdoaWxlIChpIDwgZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cGVkUmVjb3Jkc0J5RXhwcmVzc2lvbihkYXRhLCBpLCBleHByZXNzaW9uc1tsZXZlbF0pO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBSb3c6IElHcm91cEJ5UmVjb3JkID0ge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGV4cHJlc3Npb25zW2xldmVsXSxcbiAgICAgICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICAgICAgICByZWNvcmRzOiBjbG9uZUFycmF5KGdyb3VwKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZ3JvdXBbMF1bZXhwcmVzc2lvbnNbbGV2ZWxdLmZpZWxkTmFtZV0sXG4gICAgICAgICAgICAgICAgZ3JvdXBQYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgICAgICAgICBncm91cHM6IFtdLFxuICAgICAgICAgICAgICAgIGhlaWdodDogZ3JpZCA/IGdyaWQucmVuZGVyZWRSb3dIZWlnaHQgOiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgIHBhcmVudC5ncm91cHMucHVzaChncm91cFJvdyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdyb3Vwc1JlY29yZHMucHVzaChncm91cFJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBnZXRIaWVyYXJjaHkoZ3JvdXBSb3cpO1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kU3RhdGU6IElHcm91cEJ5RXhwYW5kU3RhdGUgPSBleHBhbnNpb24uZmluZCgocykgPT5cbiAgICAgICAgICAgICAgICBpc0hpZXJhcmNoeU1hdGNoKHMuaGllcmFyY2h5IHx8IFt7IGZpZWxkTmFtZTogZ3JvdXBSb3cuZXhwcmVzc2lvbi5maWVsZE5hbWUsIHZhbHVlOiBncm91cFJvdy52YWx1ZSB9XSwgaGllcmFyY2h5KSk7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRlZCA9IGV4cGFuZFN0YXRlID8gZXhwYW5kU3RhdGUuZXhwYW5kZWQgOiBzdGF0ZS5kZWZhdWx0RXhwYW5kZWQ7XG4gICAgICAgICAgICBsZXQgcmVjdXJzaXZlUmVzdWx0O1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goZ3JvdXBSb3cpO1xuICAgICAgICAgICAgbWV0YWRhdGEucHVzaChudWxsKTtcbiAgICAgICAgICAgIGZ1bGxSZXN1bHQuZGF0YS5wdXNoKGdyb3VwUm93KTtcbiAgICAgICAgICAgIGZ1bGxSZXN1bHQubWV0YWRhdGEucHVzaChudWxsKTtcbiAgICAgICAgICAgIGlmIChsZXZlbCA8IGV4cHJlc3Npb25zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICByZWN1cnNpdmVSZXN1bHQgPSB0aGlzLmdyb3VwRGF0YVJlY3Vyc2l2ZShncm91cCwgc3RhdGUsIGxldmVsICsgMSwgZ3JvdXBSb3csXG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkID8gbWV0YWRhdGEgOiBbXSwgZ3JpZCwgZ3JvdXBzUmVjb3JkcywgZnVsbFJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKGV4cGFuZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQocmVjdXJzaXZlUmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZ3JvdXBJdGVtIG9mIGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bGxSZXN1bHQubWV0YWRhdGEucHVzaChncm91cFJvdyk7XG4gICAgICAgICAgICAgICAgICAgIGZ1bGxSZXN1bHQuZGF0YS5wdXNoKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChleHBhbmRlZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5wdXNoKC4uLmZ1bGxSZXN1bHQubWV0YWRhdGEuc2xpY2UoZnVsbFJlc3VsdC5tZXRhZGF0YS5sZW5ndGggLSBncm91cC5sZW5ndGgpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uZnVsbFJlc3VsdC5kYXRhLnNsaWNlKGZ1bGxSZXN1bHQuZGF0YS5sZW5ndGggLSBncm91cC5sZW5ndGgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpICs9IGdyb3VwLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0RmllbGRWYWx1ZShvYmo6IGFueSwga2V5OiBzdHJpbmcpOiBhbnkge1xuICAgICAgICByZXR1cm4gb2JqW2tleV07XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSWd4RGF0YVJlY29yZFNvcnRpbmcgZXh0ZW5kcyBJZ3hTb3J0aW5nIHtcbiAgICBwcm90ZWN0ZWQgZ2V0RmllbGRWYWx1ZShvYmo6IGFueSwga2V5OiBzdHJpbmcpOiBhbnkge1xuICAgICAgICByZXR1cm4gb2JqLmRhdGFba2V5XTtcbiAgICB9XG59XG4iXX0=