ngx-order-pipe
Version:
Angular order pipe, order collection by a field
203 lines • 21.2 kB
JavaScript
import { Pipe } from "@angular/core";
import * as i0 from "@angular/core";
export class OrderPipe {
/**
* Check if a value is a string
*
* @param value
*/
static isString(value) {
return typeof value === "string" || value instanceof String;
}
/**
* Sorts values ignoring the case
*
* @param a
* @param b
*/
static caseInsensitiveSort(a, b) {
if (OrderPipe.isString(a) && OrderPipe.isString(b)) {
return a.localeCompare(b);
}
return OrderPipe.defaultCompare(a, b);
}
/**
* Default compare method
*
* @param a
* @param b
*/
static defaultCompare(a, b) {
if (a && a instanceof Date) {
a = a.getTime();
}
if (b && b instanceof Date) {
b = b.getTime();
}
if (a === b) {
return 0;
}
if (a == null) {
return 1;
}
if (b == null) {
return -1;
}
return a > b ? 1 : -1;
}
/**
* Parse expression, split into items
* @param expression
* @returns {string[]}
*/
static parseExpression(expression) {
expression = expression.replace(/\[(\w+)\]/g, ".$1");
expression = expression.replace(/^\./, "");
return expression.split(".");
}
/**
* Get value by expression
*
* @param object
* @param expression
* @returns {any}
*/
static getValue(object, expression) {
for (let i = 0, n = expression.length; i < n; ++i) {
if (!object) {
return;
}
const k = expression[i];
if (!(k in object)) {
return;
}
if (typeof object[k] === "function") {
object = object[k]();
}
else {
object = object[k];
}
}
return object;
}
/**
* Set value by expression
*
* @param object
* @param value
* @param expression
*/
static setValue(object, value, expression) {
let i;
for (i = 0; i < expression.length - 1; i++) {
object = object[expression[i]];
}
object[expression[i]] = value;
}
transform(value, expression, reverse, isCaseInsensitive = false, comparator) {
if (!value) {
return value;
}
if (Array.isArray(expression)) {
return this.multiExpressionTransform(value, expression.slice(), reverse, isCaseInsensitive, comparator);
}
if (Array.isArray(value)) {
return this.sortArray(value.slice(), expression, reverse, isCaseInsensitive, comparator);
}
if (typeof value === "object") {
return this.transformObject(Object.assign({}, value), expression, reverse, isCaseInsensitive, comparator);
}
return value;
}
/**
* Sort array, returns sorted array
*
* @param array
* @param expression
* @param reverse
* @param isCaseInsensitive
* @param comparator
* @returns {Type[]}
*/
sortArray(array, expression, reverse, isCaseInsensitive, comparator) {
const isDeepLink = expression && expression.indexOf(".") !== -1;
if (isDeepLink) {
expression = OrderPipe.parseExpression(expression);
}
let compareFn;
if (comparator && typeof comparator === "function") {
compareFn = comparator;
}
else {
compareFn = isCaseInsensitive
? OrderPipe.caseInsensitiveSort
: OrderPipe.defaultCompare;
}
const sortedArray = array.sort((a, b) => {
if (!expression) {
return compareFn(a, b);
}
if (!isDeepLink) {
if (a && b) {
return compareFn(a[expression], b[expression]);
}
return compareFn(a, b);
}
return compareFn(OrderPipe.getValue(a, expression), OrderPipe.getValue(b, expression));
});
if (reverse) {
return sortedArray.reverse();
}
return sortedArray;
}
/**
* Transform Object
*
* @param value
* @param expression
* @param reverse
* @param isCaseInsensitive
* @param comparator
* @returns {any[]}
*/
transformObject(value, expression, reverse, isCaseInsensitive, comparator) {
const parsedExpression = OrderPipe.parseExpression(expression);
let lastPredicate = parsedExpression.pop();
let oldValue = OrderPipe.getValue(value, parsedExpression);
if (!Array.isArray(oldValue)) {
parsedExpression.push(lastPredicate);
lastPredicate = null;
oldValue = OrderPipe.getValue(value, parsedExpression);
}
if (!oldValue) {
return value;
}
OrderPipe.setValue(value, this.transform(oldValue, lastPredicate, reverse, isCaseInsensitive), parsedExpression);
return value;
}
/**
* Apply multiple expressions
*
* @param value
* @param {any[]} expressions
* @param {boolean} reverse
* @param {boolean} isCaseInsensitive
* @param {Function} comparator
* @returns {any}
*/
multiExpressionTransform(value, expressions, reverse, isCaseInsensitive = false, comparator) {
return expressions.reverse().reduce((result, expression) => {
return this.transform(result, expression, reverse, isCaseInsensitive, comparator);
}, value);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: OrderPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.9", ngImport: i0, type: OrderPipe, name: "orderBy", pure: false });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: OrderPipe, decorators: [{
type: Pipe,
args: [{
name: "orderBy",
pure: false,
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW9yZGVyLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL29yZGVyLXBpcGUvbmd4LW9yZGVyLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBTXBELE1BQU0sT0FBTyxTQUFTO0lBQ3BCOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQVU7UUFDeEIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZLE1BQU0sQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBTSxFQUFFLENBQU07UUFDdkMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFNLEVBQUUsQ0FBTTtRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7WUFDM0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO1lBQzNCLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEIsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FB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UUFBUSxDQUNoQixLQUFLLEVBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxFQUNuRSxnQkFBZ0IsQ0FDakIsQ0FBQztRQUNGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLHdCQUF3QixDQUM5QixLQUFVLEVBQ1YsV0FBa0IsRUFDbEIsT0FBaUIsRUFDakIsb0JBQTZCLEtBQUssRUFDbEMsVUFBcUI7UUFFckIsT0FBTyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBVyxFQUFFLFVBQWUsRUFBRSxFQUFFO1lBQ25FLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FDbkIsTUFBTSxFQUNOLFVBQVUsRUFDVixPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLFVBQVUsQ0FDWCxDQUFDO1FBQ0osQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ1osQ0FBQzt1R0E3UVUsU0FBUztxR0FBVCxTQUFTOzsyRkFBVCxTQUFTO2tCQUpyQixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxTQUFTO29CQUNmLElBQUksRUFBRSxLQUFLO2lCQUNaIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbkBQaXBlKHtcbiAgbmFtZTogXCJvcmRlckJ5XCIsXG4gIHB1cmU6IGZhbHNlLFxufSlcbmV4cG9ydCBjbGFzcyBPcmRlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBzdHJpbmdcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBzdGF0aWMgaXNTdHJpbmcodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdmFsdWVzIGlnbm9yaW5nIHRoZSBjYXNlXG4gICAqXG4gICAqIEBwYXJhbSBhXG4gICAqIEBwYXJhbSBiXG4gICAqL1xuICBzdGF0aWMgY2FzZUluc2Vuc2l0aXZlU29ydChhOiBhbnksIGI6IGFueSkge1xuICAgIGlmIChPcmRlclBpcGUuaXNTdHJpbmcoYSkgJiYgT3JkZXJQaXBlLmlzU3RyaW5nKGIpKSB7XG4gICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuICAgIH1cbiAgICByZXR1cm4gT3JkZXJQaXBlLmRlZmF1bHRDb21wYXJlKGEsIGIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgY29tcGFyZSBtZXRob2RcbiAgICpcbiAgICogQHBhcmFtIGFcbiAgICogQHBhcmFtIGJcbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0Q29tcGFyZShhOiBhbnksIGI6IGFueSkge1xuICAgIGlmIChhICYmIGEgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBhID0gYS5nZXRUaW1lKCk7XG4gICAgfVxuICAgIGlmIChiICYmIGIgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBiID0gYi5nZXRUaW1lKCk7XG4gICAgfVxuXG4gICAgaWYgKGEgPT09IGIpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAoYSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKGIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICByZXR1cm4gYSA+IGIgPyAxIDogLTE7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgZXhwcmVzc2lvbiwgc3BsaXQgaW50byBpdGVtc1xuICAgKiBAcGFyYW0gZXhwcmVzc2lvblxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBzdGF0aWMgcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5yZXBsYWNlKC9cXFsoXFx3KylcXF0vZywgXCIuJDFcIik7XG4gICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSgvXlxcLi8sIFwiXCIpO1xuICAgIHJldHVybiBleHByZXNzaW9uLnNwbGl0KFwiLlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdmFsdWUgYnkgZXhwcmVzc2lvblxuICAgKlxuICAgKiBAcGFyYW0gb2JqZWN0XG4gICAqIEBwYXJhbSBleHByZXNzaW9uXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZ2V0VmFsdWUob2JqZWN0OiBhbnksIGV4cHJlc3Npb246IHN0cmluZ1tdKTogYW55IHtcbiAgICBmb3IgKGxldCBpID0gMCwgbiA9IGV4cHJlc3Npb24ubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBrID0gZXhwcmVzc2lvbltpXTtcbiAgICAgIGlmICghKGsgaW4gb2JqZWN0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9iamVjdFtrXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrXSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZhbHVlIGJ5IGV4cHJlc3Npb25cbiAgICpcbiAgICogQHBhcmFtIG9iamVjdFxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICovXG4gIHN0YXRpYyBzZXRWYWx1ZShvYmplY3Q6IGFueSwgdmFsdWU6IGFueSwgZXhwcmVzc2lvbjogc3RyaW5nW10pIHtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZXhwcmVzc2lvbi5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIG9iamVjdCA9IG9iamVjdFtleHByZXNzaW9uW2ldXTtcbiAgICB9XG5cbiAgICBvYmplY3RbZXhwcmVzc2lvbltpXV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHRyYW5zZm9ybShcbiAgICB2YWx1ZTogYW55IHwgYW55W10sXG4gICAgZXhwcmVzc2lvbj86IGFueSxcbiAgICByZXZlcnNlPzogYm9vbGVhbixcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGNvbXBhcmF0b3I/OiBGdW5jdGlvblxuICApOiBhbnkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShleHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIHRoaXMubXVsdGlFeHByZXNzaW9uVHJhbnNmb3JtKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZXhwcmVzc2lvbi5zbGljZSgpLFxuICAgICAgICByZXZlcnNlLFxuICAgICAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICAgICAgY29tcGFyYXRvclxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNvcnRBcnJheShcbiAgICAgICAgdmFsdWUuc2xpY2UoKSxcbiAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgcmV2ZXJzZSxcbiAgICAgICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgICAgIGNvbXBhcmF0b3JcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtT2JqZWN0KFxuICAgICAgICBPYmplY3QuYXNzaWduKHt9LCB2YWx1ZSksXG4gICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgIHJldmVyc2UsXG4gICAgICAgIGlzQ2FzZUluc2Vuc2l0aXZlLFxuICAgICAgICBjb21wYXJhdG9yXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0IGFycmF5LCByZXR1cm5zIHNvcnRlZCBhcnJheVxuICAgKlxuICAgKiBAcGFyYW0gYXJyYXlcbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICogQHBhcmFtIHJldmVyc2VcbiAgICogQHBhcmFtIGlzQ2FzZUluc2Vuc2l0aXZlXG4gICAqIEBwYXJhbSBjb21wYXJhdG9yXG4gICAqIEByZXR1cm5zIHtUeXBlW119XG4gICAqL1xuICBwcml2YXRlIHNvcnRBcnJheTxUeXBlPihcbiAgICBhcnJheTogVHlwZVtdLFxuICAgIGV4cHJlc3Npb24/OiBhbnksXG4gICAgcmV2ZXJzZT86IGJvb2xlYW4sXG4gICAgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuLFxuICAgIGNvbXBhcmF0b3I/OiBGdW5jdGlvblxuICApOiBUeXBlW10ge1xuICAgIGNvbnN0IGlzRGVlcExpbmsgPSBleHByZXNzaW9uICYmIGV4cHJlc3Npb24uaW5kZXhPZihcIi5cIikgIT09IC0xO1xuXG4gICAgaWYgKGlzRGVlcExpbmspIHtcbiAgICAgIGV4cHJlc3Npb24gPSBPcmRlclBpcGUucGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIGxldCBjb21wYXJlRm46IEZ1bmN0aW9uO1xuXG4gICAgaWYgKGNvbXBhcmF0b3IgJiYgdHlwZW9mIGNvbXBhcmF0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29tcGFyZUZuID0gY29tcGFyYXRvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcGFyZUZuID0gaXNDYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBPcmRlclBpcGUuY2FzZUluc2Vuc2l0aXZlU29ydFxuICAgICAgICA6IE9yZGVyUGlwZS5kZWZhdWx0Q29tcGFyZTtcbiAgICB9XG5cbiAgICBjb25zdCBzb3J0ZWRBcnJheTogYW55W10gPSBhcnJheS5zb3J0KChhOiBhbnksIGI6IGFueSk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIWV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVGbihhLCBiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0RlZXBMaW5rKSB7XG4gICAgICAgIGlmIChhICYmIGIpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGFyZUZuKGFbZXhwcmVzc2lvbl0sIGJbZXhwcmVzc2lvbl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wYXJlRm4oYSwgYik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wYXJlRm4oXG4gICAgICAgIE9yZGVyUGlwZS5nZXRWYWx1ZShhLCBleHByZXNzaW9uKSxcbiAgICAgICAgT3JkZXJQaXBlLmdldFZhbHVlKGIsIGV4cHJlc3Npb24pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIHJldHVybiBzb3J0ZWRBcnJheS5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRlZEFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSBleHByZXNzaW9uXG4gICAqIEBwYXJhbSByZXZlcnNlXG4gICAqIEBwYXJhbSBpc0Nhc2VJbnNlbnNpdGl2ZVxuICAgKiBAcGFyYW0gY29tcGFyYXRvclxuICAgKiBAcmV0dXJucyB7YW55W119XG4gICAqL1xuICBwcml2YXRlIHRyYW5zZm9ybU9iamVjdChcbiAgICB2YWx1ZTogYW55IHwgYW55W10sXG4gICAgZXhwcmVzc2lvbj86IGFueSxcbiAgICByZXZlcnNlPzogYm9vbGVhbixcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW4sXG4gICAgY29tcGFyYXRvcj86IEZ1bmN0aW9uXG4gICk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VkRXhwcmVzc2lvbiA9IE9yZGVyUGlwZS5wYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gICAgbGV0IGxhc3RQcmVkaWNhdGU6IGFueSA9IHBhcnNlZEV4cHJlc3Npb24ucG9wKCk7XG4gICAgbGV0IG9sZFZhbHVlID0gT3JkZXJQaXBlLmdldFZhbHVlKHZhbHVlLCBwYXJzZWRFeHByZXNzaW9uKTtcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkpIHtcbiAgICAgIHBhcnNlZEV4cHJlc3Npb24ucHVzaChsYXN0UHJlZGljYXRlKTtcbiAgICAgIGxhc3RQcmVkaWNhdGUgPSBudWxsO1xuICAgICAgb2xkVmFsdWUgPSBPcmRlclBpcGUuZ2V0VmFsdWUodmFsdWUsIHBhcnNlZEV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIGlmICghb2xkVmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBPcmRlclBpcGUuc2V0VmFsdWUoXG4gICAgICB2YWx1ZSxcbiAgICAgIHRoaXMudHJhbnNmb3JtKG9sZFZhbHVlLCBsYXN0UHJlZGljYXRlLCByZXZlcnNlLCBpc0Nhc2VJbnNlbnNpdGl2ZSksXG4gICAgICBwYXJzZWRFeHByZXNzaW9uXG4gICAgKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgbXVsdGlwbGUgZXhwcmVzc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSB7YW55W119IGV4cHJlc3Npb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmV2ZXJzZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzQ2FzZUluc2Vuc2l0aXZlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3JcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHByaXZhdGUgbXVsdGlFeHByZXNzaW9uVHJhbnNmb3JtKFxuICAgIHZhbHVlOiBhbnksXG4gICAgZXhwcmVzc2lvbnM6IGFueVtdLFxuICAgIHJldmVyc2U/OiBib29sZWFuLFxuICAgIGlzQ2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2UsXG4gICAgY29tcGFyYXRvcj86IEZ1bmN0aW9uXG4gICk6IGFueSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb25zLnJldmVyc2UoKS5yZWR1Y2UoKHJlc3VsdDogYW55LCBleHByZXNzaW9uOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybShcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICByZXZlcnNlLFxuICAgICAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICAgICAgY29tcGFyYXRvclxuICAgICAgKTtcbiAgICB9LCB2YWx1ZSk7XG4gIH1cbn1cbiJdfQ==