igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
264 lines • 22.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { cloneArray } from '../core/utils';
import { SortingDirection } from './sorting-expression.interface';
/**
* @record
*/
export function ISortingStrategy() { }
if (false) {
/** @type {?} */
ISortingStrategy.prototype.sort;
}
export class DefaultSortingStrategy {
/**
* @protected
*/
constructor() { }
/**
* @return {?}
*/
static instance() {
return this._instance || (this._instance = new this());
}
/**
* @param {?} data
* @param {?} fieldName
* @param {?} dir
* @param {?} ignoreCase
* @param {?} valueResolver
* @return {?}
*/
sort(data, fieldName, dir, ignoreCase, valueResolver) {
/** @type {?} */
const key = fieldName;
/** @type {?} */
const reverse = (dir === SortingDirection.Desc ? -1 : 1);
/** @type {?} */
const cmpFunc = (obj1, obj2) => {
return this.compareObjects(obj1, obj2, key, reverse, ignoreCase, valueResolver);
};
return this.arraySort(data, cmpFunc);
}
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
compareValues(a, b) {
/** @type {?} */
const an = (a === null || a === undefined);
/** @type {?} */
const 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;
}
/**
* @protected
* @param {?} obj1
* @param {?} obj2
* @param {?} key
* @param {?} reverse
* @param {?} ignoreCase
* @param {?} valueResolver
* @return {?}
*/
compareObjects(obj1, obj2, key, reverse, ignoreCase, valueResolver) {
/** @type {?} */
let a = valueResolver(obj1, key);
/** @type {?} */
let 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);
}
/**
* @protected
* @param {?} data
* @param {?=} compareFn
* @return {?}
*/
arraySort(data, compareFn) {
return data.sort(compareFn);
}
}
DefaultSortingStrategy._instance = null;
if (false) {
/**
* @type {?}
* @private
*/
DefaultSortingStrategy._instance;
}
export class IgxSorting {
/**
* @param {?} data
* @param {?} expressions
* @return {?}
*/
sort(data, expressions) {
return this.sortDataRecursive(data, expressions);
}
/**
* @private
* @param {?} data
* @param {?} index
* @param {?} expression
* @return {?}
*/
groupedRecordsByExpression(data, index, expression) {
/** @type {?} */
let i;
/** @type {?} */
let groupval;
/** @type {?} */
const res = [];
/** @type {?} */
const key = expression.fieldName;
/** @type {?} */
const len = data.length;
res.push(data[index]);
groupval = this.getFieldValue(data[index], key);
index++;
/** @type {?} */
const 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;
}
/**
* @private
* @template T
* @param {?} data
* @param {?} expressions
* @param {?=} expressionIndex
* @return {?}
*/
sortDataRecursive(data, expressions, expressionIndex = 0) {
/** @type {?} */
let i;
/** @type {?} */
let j;
/** @type {?} */
let expr;
/** @type {?} */
let gbData;
/** @type {?} */
let gbDataLen;
/** @type {?} */
const exprsLen = expressions.length;
/** @type {?} */
const 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;
}
/**
* @protected
* @template T
* @param {?} data
* @param {?} expressions
* @param {?} level
* @param {?} parent
* @param {?} metadata
* @param {?=} groupsRecords
* @return {?}
*/
groupDataRecursive(data, expressions, level, parent, metadata, groupsRecords = []) {
/** @type {?} */
let i = 0;
/** @type {?} */
let result = [];
while (i < data.length) {
/** @type {?} */
const group = this.groupedRecordsByExpression(data, i, expressions[level]);
/** @type {?} */
const groupRow = {
expression: expressions[level],
level,
records: cloneArray(group),
value: group[0][expressions[level].fieldName],
groupParent: parent,
groups: []
};
if (parent) {
parent.groups.push(groupRow);
}
else {
groupsRecords.push(groupRow);
}
if (level < expressions.length - 1) {
result = result.concat(this.groupDataRecursive(group, expressions, level + 1, groupRow, metadata, groupsRecords));
}
else {
for (const groupItem of group) {
metadata.push(groupRow);
result.push(groupItem);
}
}
i += group.length;
}
return result;
}
/**
* @protected
* @param {?} obj
* @param {?} key
* @return {?}
*/
getFieldValue(obj, key) {
return obj[key];
}
}
export class IgxDataRecordSorting extends IgxSorting {
/**
* @protected
* @param {?} obj
* @param {?} key
* @return {?}
*/
getFieldValue(obj, key) {
return obj.data[key];
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGluZy1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFzQixnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7O0FBR3RGLHNDQU1DOzs7SUFMRyxnQ0FJK0Q7O0FBR25FLE1BQU0sT0FBTyxzQkFBc0I7Ozs7SUFHL0IsZ0JBQXlCLENBQUM7Ozs7SUFFbkIsTUFBTSxDQUFDLFFBQVE7UUFDbEIsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQzs7Ozs7Ozs7O0lBRU0sSUFBSSxDQUFDLElBQVcsRUFDWCxTQUFpQixFQUNqQixHQUFxQixFQUNyQixVQUFtQixFQUNuQixhQUE2Qzs7Y0FDL0MsR0FBRyxHQUFHLFNBQVM7O2NBQ2YsT0FBTyxHQUFHLENBQUMsR0FBRyxLQUFLLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Y0FDbEQsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Ozs7OztJQUVNLGFBQWEsQ0FBQyxDQUFNLEVBQUUsQ0FBTTs7Y0FDekIsRUFBRSxH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QUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNoQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQzthQUNySDtpQkFBTTtnQkFDSCxLQUFLLE1BQU0sU0FBUyxJQUFJLEtBQUssRUFBRTtvQkFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDMUI7YUFDSjtZQUNELENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQzs7Ozs7OztJQUNTLGFBQWEsQ0FBQyxHQUFRLEVBQUUsR0FBVztRQUN6QyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQixDQUFDO0NBQ0o7QUFFRCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsVUFBVTs7Ozs7OztJQUN0QyxhQUFhLENBQUMsR0FBUSxFQUFFLEdBQVc7UUFDekMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNsb25lQXJyYXkgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElHcm91cEJ5UmVjb3JkIH0gZnJvbSAnLi9ncm91cGJ5LXJlY29yZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVNvcnRpbmdFeHByZXNzaW9uLCBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi9zb3J0aW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElHcm91cGluZ0V4cHJlc3Npb24gfSBmcm9tICcuL2dyb3VwaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBJU29ydGluZ1N0cmF0ZWd5IHtcbiAgICBzb3J0OiAoZGF0YTogYW55W10sXG4gICAgICAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgICAgICBkaXI6IFNvcnRpbmdEaXJlY3Rpb24sXG4gICAgICAgICAgIGlnbm9yZUNhc2U6IGJvb2xlYW4sXG4gICAgICAgICAgIHZhbHVlUmVzb2x2ZXI6IChvYmo6IGFueSwga2V5OiBzdHJpbmcpID0+IGFueSkgPT4gYW55W107XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0U29ydGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSVNvcnRpbmdTdHJhdGVneSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBEZWZhdWx0U29ydGluZ1N0cmF0ZWd5ID0gbnVsbDtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlKCk6IERlZmF1bHRTb3J0aW5nU3RyYXRlZ3kge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgfHwgKHRoaXMuX2luc3RhbmNlID0gbmV3IHRoaXMoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNvcnQoZGF0YTogYW55W10sXG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgZGlyOiBTb3J0aW5nRGlyZWN0aW9uLFxuICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgdmFsdWVSZXNvbHZlcjogKG9iajogYW55LCBrZXk6IHN0cmluZykgPT4gYW55KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGZpZWxkTmFtZTtcbiAgICAgICAgY29uc3QgcmV2ZXJzZSA9IChkaXIgPT09IFNvcnRpbmdEaXJlY3Rpb24uRGVzYyA/IC0xIDogMSk7XG4gICAgICAgIGNvbnN0IGNtcEZ1bmMgPSAob2JqMSwgb2JqMikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZU9iamVjdHMob2JqMSwgb2JqMiwga2V5LCByZXZlcnNlLCBpZ25vcmVDYXNlLCB2YWx1ZVJlc29sdmVyKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlTb3J0KGRhdGEsIGNtcEZ1bmMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wYXJlVmFsdWVzKGE6IGFueSwgYjogYW55KSB7XG4gICAgICAgIGNvbnN0IGFuID0gKGEgPT09IG51bGwgfHwgYSA9PT0gdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3QgYm4gPSAoYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoYW4pIHtcbiAgICAgICAgICAgIGlmIChibikge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2UgaWYgKGJuKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbXBhcmVPYmplY3RzKG9iajE6IG9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqMjogb2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVJlc29sdmVyOiAob2JqOiBhbnksIGtleTogc3RyaW5nKSA9PiBhbnkpIHtcbiAgICAgICAgbGV0IGEgPSB2YWx1ZVJlc29sdmVyKG9iajEsIGtleSk7XG4gICAgICAgIGxldCBiID0gdmFsdWVSZXNvbHZlcihvYmoyLCBrZXkpO1xuICAgICAgICBpZiAoaWdub3JlQ2FzZSkge1xuICAgICAgICAgICAgYSA9IGEgJiYgYS50b0xvd2VyQ2FzZSA/IGEudG9Mb3dlckNhc2UoKSA6IGE7XG4gICAgICAgICAgICBiID0gYiAmJiBiLnRvTG93ZXJDYXNlID8gYi50b0xvd2VyQ2FzZSgpIDogYjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV2ZXJzZSAqIHRoaXMuY29tcGFyZVZhbHVlcyhhLCBiKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXJyYXlTb3J0KGRhdGE6IGFueVtdLCBjb21wYXJlRm4/KTogYW55W10ge1xuICAgICAgICByZXR1cm4gZGF0YS5zb3J0KGNvbXBhcmVGbik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSWd4U29ydGluZyB7XG4gICAgcHVibGljIHNvcnQoZGF0YTogYW55W10sIGV4cHJlc3Npb25zOiBJU29ydGluZ0V4cHJlc3Npb25bXSk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERhdGFSZWN1cnNpdmUoZGF0YSwgZXhwcmVzc2lvbnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ3JvdXBlZFJlY29yZHNCeUV4cHJlc3Npb24oZGF0YTogYW55W10sXG4gICAgICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogSUdyb3VwaW5nRXhwcmVzc2lvbik6IGFueVtdIHtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGxldCBncm91cHZhbDtcbiAgICAgICAgY29uc3QgcmVzID0gW107XG4gICAgICAgIGNvbnN0IGtleSA9IGV4cHJlc3Npb24uZmllbGROYW1lO1xuICAgICAgICBjb25zdCBsZW4gPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgcmVzLnB1c2goZGF0YVtpbmRleF0pO1xuICAgICAgICBncm91cHZhbCA9IHRoaXMuZ2V0RmllbGRWYWx1ZShkYXRhW2luZGV4XSwga2V5KTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29uc3QgY29tcGFyZXIgPSBleHByZXNzaW9uLmdyb3VwaW5nQ29tcGFyZXIgfHwgRGVmYXVsdFNvcnRpbmdTdHJhdGVneS5pbnN0YW5jZSgpLmNvbXBhcmVWYWx1ZXM7XG4gICAgICAgIGZvciAoaSA9IGluZGV4OyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjb21wYXJlcih0aGlzLmdldEZpZWxkVmFsdWUoZGF0YVtpXSwga2V5KSwgZ3JvdXB2YWwpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goZGF0YVtpXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHByaXZhdGUgc29ydERhdGFSZWN1cnNpdmU8VD4oZGF0YTogVFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnM6IElTb3J0aW5nRXhwcmVzc2lvbltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkluZGV4OiBudW1iZXIgPSAwKTogVFtdIHtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGxldCBqO1xuICAgICAgICBsZXQgZXhwcjogSVNvcnRpbmdFeHByZXNzaW9uO1xuICAgICAgICBsZXQgZ2JEYXRhO1xuICAgICAgICBsZXQgZ2JEYXRhTGVuO1xuICAgICAgICBjb25zdCBleHByc0xlbiA9IGV4cHJlc3Npb25zLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZGF0YUxlbiA9IGRhdGEubGVuZ3RoO1xuICAgICAgICBleHByZXNzaW9uSW5kZXggPSBleHByZXNzaW9uSW5kZXggfHwgMDtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25JbmRleCA+PSBleHByc0xlbiB8fCBkYXRhTGVuIDw9IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGV4cHIgPSBleHByZXNzaW9uc1tleHByZXNzaW9uSW5kZXhdO1xuICAgICAgICBpZiAoIWV4cHIuc3RyYXRlZ3kpIHtcbiAgICAgICAgICAgIGV4cHIuc3RyYXRlZ3kgPSBEZWZhdWx0U29ydGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IGV4cHIuc3RyYXRlZ3kuc29ydChkYXRhLCBleHByLmZpZWxkTmFtZSwgZXhwci5kaXIsIGV4cHIuaWdub3JlQ2FzZSwgdGhpcy5nZXRGaWVsZFZhbHVlKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25JbmRleCA9PT0gZXhwcnNMZW4gLSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbiBjYXNlIG9mIG11bHRpcGxlIHNvcnRpbmdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW47IGkrKykge1xuICAgICAgICAgICAgZ2JEYXRhID0gdGhpcy5ncm91cGVkUmVjb3Jkc0J5RXhwcmVzc2lvbihkYXRhLCBpLCBleHByKTtcbiAgICAgICAgICAgIGdiRGF0YUxlbiA9IGdiRGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZ2JEYXRhTGVuID4gMSkge1xuICAgICAgICAgICAgICAgIGdiRGF0YSA9IHRoaXMuc29ydERhdGFSZWN1cnNpdmUoZ2JEYXRhLCBleHByZXNzaW9ucywgZXhwcmVzc2lvbkluZGV4ICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2JEYXRhTGVuOyBqKyspIHtcbiAgICAgICAgICAgICAgICBkYXRhW2kgKyBqXSA9IGdiRGF0YVtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkgKz0gZ2JEYXRhTGVuIC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdyb3VwRGF0YVJlY3Vyc2l2ZTxUPihkYXRhOiBUW10sIGV4cHJlc3Npb25zOiBJU29ydGluZ0V4cHJlc3Npb25bXSwgbGV2ZWw6IG51bWJlcixcbiAgICAgICAgcGFyZW50OiBJR3JvdXBCeVJlY29yZCwgbWV0YWRhdGE6IElHcm91cEJ5UmVjb3JkW10sIGdyb3Vwc1JlY29yZHM6IGFueVtdID0gW10pOiBUW10ge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3VwZWRSZWNvcmRzQnlFeHByZXNzaW9uKGRhdGEsIGksIGV4cHJlc3Npb25zW2xldmVsXSk7XG4gICAgICAgICAgICBjb25zdCBncm91cFJvdzogSUdyb3VwQnlSZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZXhwcmVzc2lvbnNbbGV2ZWxdLFxuICAgICAgICAgICAgICAgIGxldmVsLFxuICAgICAgICAgICAgICAgIHJlY29yZHM6IGNsb25lQXJyYXkoZ3JvdXApLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBncm91cFswXVtleHByZXNzaW9uc1tsZXZlbF0uZmllbGROYW1lXSxcbiAgICAgICAgICAgICAgICBncm91cFBhcmVudDogcGFyZW50LFxuICAgICAgICAgICAgICAgIGdyb3VwczogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Lmdyb3Vwcy5wdXNoKGdyb3VwUm93KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzUmVjb3Jkcy5wdXNoKGdyb3VwUm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZXZlbCA8IGV4cHJlc3Npb25zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHRoaXMuZ3JvdXBEYXRhUmVjdXJzaXZlKGdyb3VwLCBleHByZXNzaW9ucywgbGV2ZWwgKyAxLCBncm91cFJvdywgbWV0YWRhdGEsIGdyb3Vwc1JlY29yZHMpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBncm91cEl0ZW0gb2YgZ3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucHVzaChncm91cFJvdyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSArPSBncm91cC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldEZpZWxkVmFsdWUob2JqOiBhbnksIGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIG9ialtrZXldO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElneERhdGFSZWNvcmRTb3J0aW5nIGV4dGVuZHMgSWd4U29ydGluZyB7XG4gICAgcHJvdGVjdGVkIGdldEZpZWxkVmFsdWUob2JqOiBhbnksIGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIG9iai5kYXRhW2tleV07XG4gICAgfVxufVxuIl19