@angular-generic-table/core
Version:
A generic table component for Angular
202 lines (201 loc) • 22.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Pipe } from '@angular/core';
// unsupported: template constraints.
/**
* @template R
*/
export class GtOrderByPipe {
constructor() {
/**
* Return property
*/
this.getProperty = function (array, key) {
for (let /** @type {?} */ i = 0; i < array.length; i++) {
if (array[i].objectKey === key) {
return array[i];
}
}
};
}
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
static _orderByComparator(a, b) {
// sort boolean values as strings
if (typeof a === 'boolean') {
a = a.toString();
}
if (typeof b === 'boolean') {
b = b.toString();
}
if (isNaN(parseFloat(a)) ||
!isFinite(a) ||
(isNaN(parseFloat(b)) || !isFinite(b))) {
if (b === null ||
(typeof b === 'undefined' && (a !== null && typeof a !== 'undefined'))) {
return 1;
}
if (a === null ||
(typeof a === 'undefined' && (b !== null && typeof b !== 'undefined'))) {
return -1;
}
// isn't a number so lowercase the string to properly compare
try {
if (a.toLowerCase() < b.toLowerCase()) {
return -1;
}
if (a.toLowerCase() > b.toLowerCase()) {
return 1;
}
}
catch (/** @type {?} */ error) {
return 0;
}
}
else {
// parse strings as numbers to compare properly
if (parseFloat(a) < parseFloat(b)) {
return -1;
}
if (parseFloat(a) > parseFloat(b)) {
return 1;
}
}
return 0; // equal each other
}
/**
* Return sort function
* @param {?} field
* @return {?}
*/
getSortFunction(field) {
if (!field) {
// console.log('error trying to sort undefined field');
return false;
}
if (typeof field.sort === 'function') {
return field.sort;
}
else if (typeof field.value === 'function') {
return field.value;
}
else {
return false;
}
}
/**
* @param {?} input
* @param {?} sortByProperties
* @param {?} fields
* @param {?} refreshSorting
* @param {?} refreshData
* @return {?}
*/
transform(input, sortByProperties, fields, refreshSorting, refreshData) {
if (!Array.isArray(input) || input === null) {
return input;
}
if (!Array.isArray(sortByProperties) ||
(Array.isArray(sortByProperties) && sortByProperties.length === 1)) {
const /** @type {?} */ propertyToCheck = sortByProperties[0];
const /** @type {?} */ desc = propertyToCheck.substr(0, 1) === '-';
// basic array
if (!propertyToCheck ||
propertyToCheck === '-' ||
propertyToCheck === '+') {
return !desc ? input.sort() : input.sort().reverse();
}
else {
const /** @type {?} */ property = propertyToCheck.substr(0, 1) === '+' ||
propertyToCheck.substr(0, 1) === '-'
? propertyToCheck.substr(1)
: propertyToCheck;
// check if custom sort function is defined
const /** @type {?} */ sortFunction = this.getSortFunction(this.getProperty(fields, property));
// console.log(property);
return input.sort(function (a, b) {
// use custom sort function if one is defined
const /** @type {?} */ propertyA = sortFunction === false
? property === '$$gtRowId'
? +a.$$gtRowId.split('_')[0]
: a[property]
: sortFunction(a);
const /** @type {?} */ propertyB = sortFunction === false
? property === '$$gtRowId'
? +b.$$gtRowId.split('_')[0]
: b[property]
: sortFunction(b);
// if both values are undefined...
if (typeof propertyA === 'undefined' &&
typeof propertyB === 'undefined') {
// ...skip comparison
return;
}
return !desc
? GtOrderByPipe._orderByComparator(propertyA, propertyB)
: -GtOrderByPipe._orderByComparator(propertyA, propertyB);
});
}
}
else {
// loop over property of the array in order and sort
return input.sort((a, b) => {
// console.log('multiple');
for (let /** @type {?} */ i = 0; i < sortByProperties.length; i++) {
const /** @type {?} */ desc = sortByProperties[i].substr(0, 1) === '-';
const /** @type {?} */ property = sortByProperties[i].substr(0, 1) === '+' ||
sortByProperties[i].substr(0, 1) === '-'
? sortByProperties[i].substr(1)
: sortByProperties[i];
// console.log(property);
// check if custom sort function is defined
const /** @type {?} */ sortFunction = this.getSortFunction(this.getProperty(fields, property));
// use custom sort function if one is defined
const /** @type {?} */ propertyA = sortFunction === false
? property === '$$gtRowId'
? +a.$$gtRowId.split('_')[0]
: a[property]
: sortFunction(a);
const /** @type {?} */ propertyB = sortFunction === false
? property === '$$gtRowId'
? +b.$$gtRowId.split('_')[0]
: b[property]
: sortFunction(b);
const /** @type {?} */ comparison = !desc
? GtOrderByPipe._orderByComparator(propertyA, propertyB)
: -GtOrderByPipe._orderByComparator(propertyA, propertyB);
// don't return 0 yet in case of needing to sort by next property
if (comparison !== 0) {
return comparison;
}
}
return 0; // equal each other
});
}
}
}
GtOrderByPipe.decorators = [
{ type: Pipe, args: [{
name: 'gtOrderBy'
},] },
];
function GtOrderByPipe_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
GtOrderByPipe.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
GtOrderByPipe.ctorParameters;
/**
* Return property
* @type {?}
*/
GtOrderByPipe.prototype.getProperty;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3Qtb3JkZXItYnkucGlwZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhbmd1bGFyLWdlbmVyaWMtdGFibGUvY29yZS8iLCJzb3VyY2VzIjpbInBpcGVzL2d0LW9yZGVyLWJ5LnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOzs7OztBQU9wRCxNQUFNOzs7OzsyQkFxRGlCLFVBQVMsS0FBaUIsRUFBRSxHQUFXO1lBQzVELEdBQUcsQ0FBQyxDQUFDLHFCQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdkMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoQjthQUNEO1NBQ0Q7Ozs7Ozs7SUExREQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQU0sRUFBRSxDQUFNOztRQUV2QyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzVCLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7UUFDRCxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzVCLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7UUFFRCxFQUFFLENBQUMsQ0FDRixLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNaLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUN0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VUFBVSxDQUFDO3FCQUNsQjtpQkFDRDtnQkFFRCxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQ1QsQ0FBQyxDQUFDO1NBQ0g7S0FDRDs7O1lBN0xELElBQUksU0FBQztnQkFDTCxJQUFJLEVBQUUsV0FBVzthQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEd0Q29uZmlnRmllbGQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2d0LWNvbmZpZy1maWVsZCc7XG5pbXBvcnQgeyBHdFJvdyB9IGZyb20gJy4uL2ludGVyZmFjZXMvZ3Qtcm93JztcblxuQFBpcGUoe1xuXHRuYW1lOiAnZ3RPcmRlckJ5J1xufSlcbmV4cG9ydCBjbGFzcyBHdE9yZGVyQnlQaXBlPFIgZXh0ZW5kcyBHdFJvdz4gaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcblx0c3RhdGljIF9vcmRlckJ5Q29tcGFyYXRvcihhOiBhbnksIGI6IGFueSk6IG51bWJlciB7XG5cdFx0Ly8gc29ydCBib29sZWFuIHZhbHVlcyBhcyBzdHJpbmdzXG5cdFx0aWYgKHR5cGVvZiBhID09PSAnYm9vbGVhbicpIHtcblx0XHRcdGEgPSBhLnRvU3RyaW5nKCk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgYiA9PT0gJ2Jvb2xlYW4nKSB7XG5cdFx0XHRiID0gYi50b1N0cmluZygpO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdGlzTmFOKHBhcnNlRmxvYXQoYSkpIHx8XG5cdFx0XHQhaXNGaW5pdGUoYSkgfHxcblx0XHRcdChpc05hTihwYXJzZUZsb2F0KGIpKSB8fCAhaXNGaW5pdGUoYikpXG5cdFx0KSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGIgPT09IG51bGwgfHxcblx0XHRcdFx0KHR5cGVvZiBiID09PSAndW5kZWZpbmVkJyAmJiAoYSAhPT0gbnVsbCAmJiB0eXBlb2YgYSAhPT0gJ3VuZGVmaW5lZCcpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRhID09PSBudWxsIHx8XG5cdFx0XHRcdCh0eXBlb2YgYSA9PT0gJ3VuZGVmaW5lZCcgJiYgKGIgIT09IG51bGwgJiYgdHlwZW9mIGIgIT09ICd1bmRlZmluZWQnKSlcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGlzbid0IGEgbnVtYmVyIHNvIGxvd2VyY2FzZSB0aGUgc3RyaW5nIHRvIHByb3Blcmx5IGNvbXBhcmVcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChhLnRvTG93ZXJDYXNlKCkgPCBiLnRvTG93ZXJDYXNlKCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGEudG9Mb3dlckNhc2UoKSA+IGIudG9Mb3dlckNhc2UoKSkge1xuXHRcdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gcGFyc2Ugc3RyaW5ncyBhcyBudW1iZXJzIHRvIGNvbXBhcmUgcHJvcGVybHlcblx0XHRcdGlmIChwYXJzZUZsb2F0KGEpIDwgcGFyc2VGbG9hdChiKSkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyc2VGbG9hdChhKSA+IHBhcnNlRmxvYXQoYikpIHtcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIDA7IC8vIGVxdWFsIGVhY2ggb3RoZXJcblx0fVxuXG5cdC8qKiBSZXR1cm4gcHJvcGVydHkgKi9cblx0cHJpdmF0ZSBnZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uKGFycmF5OiBBcnJheTxhbnk+LCBrZXk6IHN0cmluZykge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChhcnJheVtpXS5vYmplY3RLZXkgPT09IGtleSkge1xuXHRcdFx0XHRyZXR1cm4gYXJyYXlbaV07XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8qKiBSZXR1cm4gc29ydCBmdW5jdGlvbiAqL1xuXHRwcml2YXRlIGdldFNvcnRGdW5jdGlvbihmaWVsZDogYW55KSB7XG5cdFx0aWYgKCFmaWVsZCkge1xuXHRcdFx0Ly8gY29uc29sZS5sb2coJ2Vycm9yIHRyeWluZyB0byBzb3J0IHVuZGVmaW5lZCBmaWVsZCcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIGZpZWxkLnNvcnQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHJldHVybiBmaWVsZC5zb3J0O1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRyZXR1cm4gZmllbGQudmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHR0cmFuc2Zvcm0oXG5cdFx0aW5wdXQ6IGFueSxcblx0XHRzb3J0QnlQcm9wZXJ0aWVzOiBBcnJheTxzdHJpbmc+LFxuXHRcdGZpZWxkczogR3RDb25maWdGaWVsZDxSLCBhbnk+W10sXG5cdFx0cmVmcmVzaFNvcnRpbmc6IGJvb2xlYW4sXG5cdFx0cmVmcmVzaERhdGE6IG51bWJlclxuXHQpOiBhbnkge1xuXHRcdGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkgfHwgaW5wdXQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBpbnB1dDtcblx0XHR9XG5cdFx0aWYgKFxuXHRcdFx0IUFycmF5LmlzQXJyYXkoc29ydEJ5UHJvcGVydGllcykgfHxcblx0XHRcdChBcnJheS5pc0FycmF5KHNvcnRCeVByb3BlcnRpZXMpICYmIHNvcnRCeVByb3BlcnRpZXMubGVuZ3RoID09PSAxKVxuXHRcdCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlUb0NoZWNrOiBzdHJpbmcgPSBzb3J0QnlQcm9wZXJ0aWVzWzBdO1xuXHRcdFx0Y29uc3QgZGVzYyA9IHByb3BlcnR5VG9DaGVjay5zdWJzdHIoMCwgMSkgPT09ICctJztcblxuXHRcdFx0Ly8gYmFzaWMgYXJyYXlcblx0XHRcdGlmIChcblx0XHRcdFx0IXByb3BlcnR5VG9DaGVjayB8fFxuXHRcdFx0XHRwcm9wZXJ0eVRvQ2hlY2sgPT09ICctJyB8fFxuXHRcdFx0XHRwcm9wZXJ0eVRvQ2hlY2sgPT09ICcrJ1xuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiAhZGVzYyA/IGlucHV0LnNvcnQoKSA6IGlucHV0LnNvcnQoKS5yZXZlcnNlKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eTogc3RyaW5nID1cblx0XHRcdFx0XHRwcm9wZXJ0eVRvQ2hlY2suc3Vic3RyKDAsIDEpID09PSAnKycgfHxcblx0XHRcdFx0XHRwcm9wZXJ0eVRvQ2hlY2suc3Vic3RyKDAsIDEpID09PSAnLSdcblx0XHRcdFx0XHRcdD8gcHJvcGVydHlUb0NoZWNrLnN1YnN0cigxKVxuXHRcdFx0XHRcdFx0OiBwcm9wZXJ0eVRvQ2hlY2s7XG5cblx0XHRcdFx0Ly8gY2hlY2sgaWYgY3VzdG9tIHNvcnQgZnVuY3Rpb24gaXMgZGVmaW5lZFxuXHRcdFx0XHRjb25zdCBzb3J0RnVuY3Rpb246IGFueSA9IHRoaXMuZ2V0U29ydEZ1bmN0aW9uKFxuXHRcdFx0XHRcdHRoaXMuZ2V0UHJvcGVydHkoZmllbGRzLCBwcm9wZXJ0eSlcblx0XHRcdFx0KTtcblxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhwcm9wZXJ0eSk7XG5cdFx0XHRcdHJldHVybiBpbnB1dC5zb3J0KGZ1bmN0aW9uKGE6IGFueSwgYjogYW55KSB7XG5cdFx0XHRcdFx0Ly8gdXNlIGN1c3RvbSBzb3J0IGZ1bmN0aW9uIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydHlBID1cblx0XHRcdFx0XHRcdHNvcnRGdW5jdGlvbiA9PT0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0PyBwcm9wZXJ0eSA9PT0gJyQkZ3RSb3dJZCdcblx0XHRcdFx0XHRcdFx0XHQ/ICthLiQkZ3RSb3dJZC5zcGxpdCgnXycpWzBdXG5cdFx0XHRcdFx0XHRcdFx0OiBhW3Byb3BlcnR5XVxuXHRcdFx0XHRcdFx0XHQ6IHNvcnRGdW5jdGlvbihhKTtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eUIgPVxuXHRcdFx0XHRcdFx0c29ydEZ1bmN0aW9uID09PSBmYWxzZVxuXHRcdFx0XHRcdFx0XHQ/IHByb3BlcnR5ID09PSAnJCRndFJvd0lkJ1xuXHRcdFx0XHRcdFx0XHRcdD8gK2IuJCRndFJvd0lkLnNwbGl0KCdfJylbMF1cblx0XHRcdFx0XHRcdFx0XHQ6IGJbcHJvcGVydHldXG5cdFx0XHRcdFx0XHRcdDogc29ydEZ1bmN0aW9uKGIpO1xuXG5cdFx0XHRcdFx0Ly8gaWYgYm90aCB2YWx1ZXMgYXJlIHVuZGVmaW5lZC4uLlxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHR5cGVvZiBwcm9wZXJ0eUEgPT09ICd1bmRlZmluZWQnICYmXG5cdFx0XHRcdFx0XHR0eXBlb2YgcHJvcGVydHlCID09PSAndW5kZWZpbmVkJ1xuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Ly8gLi4uc2tpcCBjb21wYXJpc29uXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiAhZGVzY1xuXHRcdFx0XHRcdFx0PyBHdE9yZGVyQnlQaXBlLl9vcmRlckJ5Q29tcGFyYXRvcihwcm9wZXJ0eUEsIHByb3BlcnR5Qilcblx0XHRcdFx0XHRcdDogLUd0T3JkZXJCeVBpcGUuX29yZGVyQnlDb21wYXJhdG9yKHByb3BlcnR5QSwgcHJvcGVydHlCKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGxvb3Agb3ZlciBwcm9wZXJ0eSBvZiB0aGUgYXJyYXkgaW4gb3JkZXIgYW5kIHNvcnRcblx0XHRcdHJldHVybiBpbnB1dC5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBjb25zb2xlLmxvZygnbXVsdGlwbGUnKTtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0QnlQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0Y29uc3QgZGVzYyA9IHNvcnRCeVByb3BlcnRpZXNbaV0uc3Vic3RyKDAsIDEpID09PSAnLSc7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydHkgPVxuXHRcdFx0XHRcdFx0c29ydEJ5UHJvcGVydGllc1tpXS5zdWJzdHIoMCwgMSkgPT09ICcrJyB8fFxuXHRcdFx0XHRcdFx0c29ydEJ5UHJvcGVydGllc1tpXS5zdWJzdHIoMCwgMSkgPT09ICctJ1xuXHRcdFx0XHRcdFx0XHQ/IHNvcnRCeVByb3BlcnRpZXNbaV0uc3Vic3RyKDEpXG5cdFx0XHRcdFx0XHRcdDogc29ydEJ5UHJvcGVydGllc1tpXTtcblxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKHByb3BlcnR5KTtcblx0XHRcdFx0XHQvLyBjaGVjayBpZiBjdXN0b20gc29ydCBmdW5jdGlvbiBpcyBkZWZpbmVkXG5cdFx0XHRcdFx0Y29uc3Qgc29ydEZ1bmN0aW9uOiBhbnkgPSB0aGlzLmdldFNvcnRGdW5jdGlvbihcblx0XHRcdFx0XHRcdHRoaXMuZ2V0UHJvcGVydHkoZmllbGRzLCBwcm9wZXJ0eSlcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Ly8gdXNlIGN1c3RvbSBzb3J0IGZ1bmN0aW9uIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydHlBID1cblx0XHRcdFx0XHRcdHNvcnRGdW5jdGlvbiA9PT0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0PyBwcm9wZXJ0eSA9PT0gJyQkZ3RSb3dJZCdcblx0XHRcdFx0XHRcdFx0XHQ/ICthLiQkZ3RSb3dJZC5zcGxpdCgnXycpWzBdXG5cdFx0XHRcdFx0XHRcdFx0OiBhW3Byb3BlcnR5XVxuXHRcdFx0XHRcdFx0XHQ6IHNvcnRGdW5jdGlvbihhKTtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eUIgPVxuXHRcdFx0XHRcdFx0c29ydEZ1bmN0aW9uID09PSBmYWxzZVxuXHRcdFx0XHRcdFx0XHQ/IHByb3BlcnR5ID09PSAnJCRndFJvd0lkJ1xuXHRcdFx0XHRcdFx0XHRcdD8gK2IuJCRndFJvd0lkLnNwbGl0KCdfJylbMF1cblx0XHRcdFx0XHRcdFx0XHQ6IGJbcHJvcGVydHldXG5cdFx0XHRcdFx0XHRcdDogc29ydEZ1bmN0aW9uKGIpO1xuXG5cdFx0XHRcdFx0Y29uc3QgY29tcGFyaXNvbiA9ICFkZXNjXG5cdFx0XHRcdFx0XHQ/IEd0T3JkZXJCeVBpcGUuX29yZGVyQnlDb21wYXJhdG9yKHByb3BlcnR5QSwgcHJvcGVydHlCKVxuXHRcdFx0XHRcdFx0OiAtR3RPcmRlckJ5UGlwZS5fb3JkZXJCeUNvbXBhcmF0b3IocHJvcGVydHlBLCBwcm9wZXJ0eUIpO1xuXG5cdFx0XHRcdFx0Ly8gZG9uJ3QgcmV0dXJuIDAgeWV0IGluIGNhc2Ugb2YgbmVlZGluZyB0byBzb3J0IGJ5IG5leHQgcHJvcGVydHlcblx0XHRcdFx0XHRpZiAoY29tcGFyaXNvbiAhPT0gMCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbXBhcmlzb247XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIDA7IC8vIGVxdWFsIGVhY2ggb3RoZXJcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufVxuIl19