UNPKG

@angular-generic-table/core

Version:
223 lines (222 loc) 23.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Pipe } from '@angular/core'; // unsupported: template constraints. /** * @template R */ var GtOrderByPipe = /** @class */ (function () { function GtOrderByPipe() { /** * Return property */ this.getProperty = function (array, key) { for (var /** @type {?} */ i = 0; i < array.length; i++) { if (array[i].objectKey === key) { return array[i]; } } }; } /** * @param {?} a * @param {?} b * @return {?} */ GtOrderByPipe._orderByComparator = /** * @param {?} a * @param {?} b * @return {?} */ function (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 {?} */ GtOrderByPipe.prototype.getSortFunction = /** * Return sort function * @param {?} field * @return {?} */ function (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 {?} */ GtOrderByPipe.prototype.transform = /** * @param {?} input * @param {?} sortByProperties * @param {?} fields * @param {?} refreshSorting * @param {?} refreshData * @return {?} */ function (input, sortByProperties, fields, refreshSorting, refreshData) { var _this = this; if (!Array.isArray(input) || input === null) { return input; } if (!Array.isArray(sortByProperties) || (Array.isArray(sortByProperties) && sortByProperties.length === 1)) { var /** @type {?} */ propertyToCheck = sortByProperties[0]; var /** @type {?} */ desc_1 = propertyToCheck.substr(0, 1) === '-'; // basic array if (!propertyToCheck || propertyToCheck === '-' || propertyToCheck === '+') { return !desc_1 ? input.sort() : input.sort().reverse(); } else { var /** @type {?} */ property_1 = propertyToCheck.substr(0, 1) === '+' || propertyToCheck.substr(0, 1) === '-' ? propertyToCheck.substr(1) : propertyToCheck; // check if custom sort function is defined var /** @type {?} */ sortFunction_1 = this.getSortFunction(this.getProperty(fields, property_1)); // console.log(property); return input.sort(function (a, b) { // use custom sort function if one is defined var /** @type {?} */ propertyA = sortFunction_1 === false ? property_1 === '$$gtRowId' ? +a.$$gtRowId.split('_')[0] : a[property_1] : sortFunction_1(a); var /** @type {?} */ propertyB = sortFunction_1 === false ? property_1 === '$$gtRowId' ? +b.$$gtRowId.split('_')[0] : b[property_1] : sortFunction_1(b); // if both values are undefined... if (typeof propertyA === 'undefined' && typeof propertyB === 'undefined') { // ...skip comparison return; } return !desc_1 ? GtOrderByPipe._orderByComparator(propertyA, propertyB) : -GtOrderByPipe._orderByComparator(propertyA, propertyB); }); } } else { // loop over property of the array in order and sort return input.sort(function (a, b) { // console.log('multiple'); for (var /** @type {?} */ i = 0; i < sortByProperties.length; i++) { var /** @type {?} */ desc = sortByProperties[i].substr(0, 1) === '-'; var /** @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 var /** @type {?} */ sortFunction = _this.getSortFunction(_this.getProperty(fields, property)); // use custom sort function if one is defined var /** @type {?} */ propertyA = sortFunction === false ? property === '$$gtRowId' ? +a.$$gtRowId.split('_')[0] : a[property] : sortFunction(a); var /** @type {?} */ propertyB = sortFunction === false ? property === '$$gtRowId' ? +b.$$gtRowId.split('_')[0] : b[property] : sortFunction(b); var /** @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' },] }, ]; return GtOrderByPipe; }()); export { GtOrderByPipe }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3Qtb3JkZXItYnkucGlwZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhbmd1bGFyLWdlbmVyaWMtdGFibGUvY29yZS8iLCJzb3VyY2VzIjpbInBpcGVzL2d0LW9yZGVyLWJ5LnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7OzJCQTREN0IsVUFBUyxLQUFpQixFQUFFLEdBQVc7WUFDNUQsR0FBRyxDQUFDLENBQUMscUJBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN2QyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2hCO2FBQ0Q7U0FDRDs7Ozs7OztJQTFETSxnQ0FBa0I7Ozs7O0lBQXpCLFVBQTBCLENBQU0sRUFBRSxDQUFNOztRQUV2QyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzVCLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7UUFDRCxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzVCLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7UUFFRCxFQUFFLENBQUMsQ0FDRixLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNaLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUN0QyxDQUFDLENB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QixNQUFNLENBQUMsVUFBVSxDQUFDO3FCQUNsQjtpQkFDRDtnQkFFRCxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQ1QsQ0FBQyxDQUFDO1NBQ0g7S0FDRDs7Z0JBN0xELElBQUksU0FBQztvQkFDTCxJQUFJLEVBQUUsV0FBVztpQkFDakI7O3dCQU5EOztTQU9hLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHdENvbmZpZ0ZpZWxkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ndC1jb25maWctZmllbGQnO1xuaW1wb3J0IHsgR3RSb3cgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2d0LXJvdyc7XG5cbkBQaXBlKHtcblx0bmFtZTogJ2d0T3JkZXJCeSdcbn0pXG5leHBvcnQgY2xhc3MgR3RPcmRlckJ5UGlwZTxSIGV4dGVuZHMgR3RSb3c+IGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG5cdHN0YXRpYyBfb3JkZXJCeUNvbXBhcmF0b3IoYTogYW55LCBiOiBhbnkpOiBudW1iZXIge1xuXHRcdC8vIHNvcnQgYm9vbGVhbiB2YWx1ZXMgYXMgc3RyaW5nc1xuXHRcdGlmICh0eXBlb2YgYSA9PT0gJ2Jvb2xlYW4nKSB7XG5cdFx0XHRhID0gYS50b1N0cmluZygpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIGIgPT09ICdib29sZWFuJykge1xuXHRcdFx0YiA9IGIudG9TdHJpbmcoKTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHRpc05hTihwYXJzZUZsb2F0KGEpKSB8fFxuXHRcdFx0IWlzRmluaXRlKGEpIHx8XG5cdFx0XHQoaXNOYU4ocGFyc2VGbG9hdChiKSkgfHwgIWlzRmluaXRlKGIpKVxuXHRcdCkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRiID09PSBudWxsIHx8XG5cdFx0XHRcdCh0eXBlb2YgYiA9PT0gJ3VuZGVmaW5lZCcgJiYgKGEgIT09IG51bGwgJiYgdHlwZW9mIGEgIT09ICd1bmRlZmluZWQnKSlcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblx0XHRcdGlmIChcblx0XHRcdFx0YSA9PT0gbnVsbCB8fFxuXHRcdFx0XHQodHlwZW9mIGEgPT09ICd1bmRlZmluZWQnICYmIChiICE9PSBudWxsICYmIHR5cGVvZiBiICE9PSAndW5kZWZpbmVkJykpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBpc24ndCBhIG51bWJlciBzbyBsb3dlcmNhc2UgdGhlIHN0cmluZyB0byBwcm9wZXJseSBjb21wYXJlXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoYS50b0xvd2VyQ2FzZSgpIDwgYi50b0xvd2VyQ2FzZSgpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChhLnRvTG93ZXJDYXNlKCkgPiBiLnRvTG93ZXJDYXNlKCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHBhcnNlIHN0cmluZ3MgYXMgbnVtYmVycyB0byBjb21wYXJlIHByb3Blcmx5XG5cdFx0XHRpZiAocGFyc2VGbG9hdChhKSA8IHBhcnNlRmxvYXQoYikpIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcnNlRmxvYXQoYSkgPiBwYXJzZUZsb2F0KGIpKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAwOyAvLyBlcXVhbCBlYWNoIG90aGVyXG5cdH1cblxuXHQvKiogUmV0dXJuIHByb3BlcnR5ICovXG5cdHByaXZhdGUgZ2V0UHJvcGVydHkgPSBmdW5jdGlvbihhcnJheTogQXJyYXk8YW55Piwga2V5OiBzdHJpbmcpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoYXJyYXlbaV0ub2JqZWN0S2V5ID09PSBrZXkpIHtcblx0XHRcdFx0cmV0dXJuIGFycmF5W2ldO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHQvKiogUmV0dXJuIHNvcnQgZnVuY3Rpb24gKi9cblx0cHJpdmF0ZSBnZXRTb3J0RnVuY3Rpb24oZmllbGQ6IGFueSkge1xuXHRcdGlmICghZmllbGQpIHtcblx0XHRcdC8vIGNvbnNvbGUubG9nKCdlcnJvciB0cnlpbmcgdG8gc29ydCB1bmRlZmluZWQgZmllbGQnKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiBmaWVsZC5zb3J0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRyZXR1cm4gZmllbGQuc29ydDtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZC52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0cmV0dXJuIGZpZWxkLnZhbHVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0dHJhbnNmb3JtKFxuXHRcdGlucHV0OiBhbnksXG5cdFx0c29ydEJ5UHJvcGVydGllczogQXJyYXk8c3RyaW5nPixcblx0XHRmaWVsZHM6IEd0Q29uZmlnRmllbGQ8UiwgYW55PltdLFxuXHRcdHJlZnJlc2hTb3J0aW5nOiBib29sZWFuLFxuXHRcdHJlZnJlc2hEYXRhOiBudW1iZXJcblx0KTogYW55IHtcblx0XHRpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpIHx8IGlucHV0ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gaW5wdXQ7XG5cdFx0fVxuXHRcdGlmIChcblx0XHRcdCFBcnJheS5pc0FycmF5KHNvcnRCeVByb3BlcnRpZXMpIHx8XG5cdFx0XHQoQXJyYXkuaXNBcnJheShzb3J0QnlQcm9wZXJ0aWVzKSAmJiBzb3J0QnlQcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMSlcblx0XHQpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VG9DaGVjazogc3RyaW5nID0gc29ydEJ5UHJvcGVydGllc1swXTtcblx0XHRcdGNvbnN0IGRlc2MgPSBwcm9wZXJ0eVRvQ2hlY2suc3Vic3RyKDAsIDEpID09PSAnLSc7XG5cblx0XHRcdC8vIGJhc2ljIGFycmF5XG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFwcm9wZXJ0eVRvQ2hlY2sgfHxcblx0XHRcdFx0cHJvcGVydHlUb0NoZWNrID09PSAnLScgfHxcblx0XHRcdFx0cHJvcGVydHlUb0NoZWNrID09PSAnKydcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gIWRlc2MgPyBpbnB1dC5zb3J0KCkgOiBpbnB1dC5zb3J0KCkucmV2ZXJzZSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHk6IHN0cmluZyA9XG5cdFx0XHRcdFx0cHJvcGVydHlUb0NoZWNrLnN1YnN0cigwLCAxKSA9PT0gJysnIHx8XG5cdFx0XHRcdFx0cHJvcGVydHlUb0NoZWNrLnN1YnN0cigwLCAxKSA9PT0gJy0nXG5cdFx0XHRcdFx0XHQ/IHByb3BlcnR5VG9DaGVjay5zdWJzdHIoMSlcblx0XHRcdFx0XHRcdDogcHJvcGVydHlUb0NoZWNrO1xuXG5cdFx0XHRcdC8vIGNoZWNrIGlmIGN1c3RvbSBzb3J0IGZ1bmN0aW9uIGlzIGRlZmluZWRcblx0XHRcdFx0Y29uc3Qgc29ydEZ1bmN0aW9uOiBhbnkgPSB0aGlzLmdldFNvcnRGdW5jdGlvbihcblx0XHRcdFx0XHR0aGlzLmdldFByb3BlcnR5KGZpZWxkcywgcHJvcGVydHkpXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gY29uc29sZS5sb2cocHJvcGVydHkpO1xuXHRcdFx0XHRyZXR1cm4gaW5wdXQuc29ydChmdW5jdGlvbihhOiBhbnksIGI6IGFueSkge1xuXHRcdFx0XHRcdC8vIHVzZSBjdXN0b20gc29ydCBmdW5jdGlvbiBpZiBvbmUgaXMgZGVmaW5lZFxuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5QSA9XG5cdFx0XHRcdFx0XHRzb3J0RnVuY3Rpb24gPT09IGZhbHNlXG5cdFx0XHRcdFx0XHRcdD8gcHJvcGVydHkgPT09ICckJGd0Um93SWQnXG5cdFx0XHRcdFx0XHRcdFx0PyArYS4kJGd0Um93SWQuc3BsaXQoJ18nKVswXVxuXHRcdFx0XHRcdFx0XHRcdDogYVtwcm9wZXJ0eV1cblx0XHRcdFx0XHRcdFx0OiBzb3J0RnVuY3Rpb24oYSk7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydHlCID1cblx0XHRcdFx0XHRcdHNvcnRGdW5jdGlvbiA9PT0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0PyBwcm9wZXJ0eSA9PT0gJyQkZ3RSb3dJZCdcblx0XHRcdFx0XHRcdFx0XHQ/ICtiLiQkZ3RSb3dJZC5zcGxpdCgnXycpWzBdXG5cdFx0XHRcdFx0XHRcdFx0OiBiW3Byb3BlcnR5XVxuXHRcdFx0XHRcdFx0XHQ6IHNvcnRGdW5jdGlvbihiKTtcblxuXHRcdFx0XHRcdC8vIGlmIGJvdGggdmFsdWVzIGFyZSB1bmRlZmluZWQuLi5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHR0eXBlb2YgcHJvcGVydHlBID09PSAndW5kZWZpbmVkJyAmJlxuXHRcdFx0XHRcdFx0dHlwZW9mIHByb3BlcnR5QiA9PT0gJ3VuZGVmaW5lZCdcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdC8vIC4uLnNraXAgY29tcGFyaXNvblxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gIWRlc2Ncblx0XHRcdFx0XHRcdD8gR3RPcmRlckJ5UGlwZS5fb3JkZXJCeUNvbXBhcmF0b3IocHJvcGVydHlBLCBwcm9wZXJ0eUIpXG5cdFx0XHRcdFx0XHQ6IC1HdE9yZGVyQnlQaXBlLl9vcmRlckJ5Q29tcGFyYXRvcihwcm9wZXJ0eUEsIHByb3BlcnR5Qik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBsb29wIG92ZXIgcHJvcGVydHkgb2YgdGhlIGFycmF5IGluIG9yZGVyIGFuZCBzb3J0XG5cdFx0XHRyZXR1cm4gaW5wdXQuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ211bHRpcGxlJyk7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc29ydEJ5UHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGNvbnN0IGRlc2MgPSBzb3J0QnlQcm9wZXJ0aWVzW2ldLnN1YnN0cigwLCAxKSA9PT0gJy0nO1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5ID1cblx0XHRcdFx0XHRcdHNvcnRCeVByb3BlcnRpZXNbaV0uc3Vic3RyKDAsIDEpID09PSAnKycgfHxcblx0XHRcdFx0XHRcdHNvcnRCeVByb3BlcnRpZXNbaV0uc3Vic3RyKDAsIDEpID09PSAnLSdcblx0XHRcdFx0XHRcdFx0PyBzb3J0QnlQcm9wZXJ0aWVzW2ldLnN1YnN0cigxKVxuXHRcdFx0XHRcdFx0XHQ6IHNvcnRCeVByb3BlcnRpZXNbaV07XG5cblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhwcm9wZXJ0eSk7XG5cdFx0XHRcdFx0Ly8gY2hlY2sgaWYgY3VzdG9tIHNvcnQgZnVuY3Rpb24gaXMgZGVmaW5lZFxuXHRcdFx0XHRcdGNvbnN0IHNvcnRGdW5jdGlvbjogYW55ID0gdGhpcy5nZXRTb3J0RnVuY3Rpb24oXG5cdFx0XHRcdFx0XHR0aGlzLmdldFByb3BlcnR5KGZpZWxkcywgcHJvcGVydHkpXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdC8vIHVzZSBjdXN0b20gc29ydCBmdW5jdGlvbiBpZiBvbmUgaXMgZGVmaW5lZFxuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5QSA9XG5cdFx0XHRcdFx0XHRzb3J0RnVuY3Rpb24gPT09IGZhbHNlXG5cdFx0XHRcdFx0XHRcdD8gcHJvcGVydHkgPT09ICckJGd0Um93SWQnXG5cdFx0XHRcdFx0XHRcdFx0PyArYS4kJGd0Um93SWQuc3BsaXQoJ18nKVswXVxuXHRcdFx0XHRcdFx0XHRcdDogYVtwcm9wZXJ0eV1cblx0XHRcdFx0XHRcdFx0OiBzb3J0RnVuY3Rpb24oYSk7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydHlCID1cblx0XHRcdFx0XHRcdHNvcnRGdW5jdGlvbiA9PT0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0PyBwcm9wZXJ0eSA9PT0gJyQkZ3RSb3dJZCdcblx0XHRcdFx0XHRcdFx0XHQ/ICtiLiQkZ3RSb3dJZC5zcGxpdCgnXycpWzBdXG5cdFx0XHRcdFx0XHRcdFx0OiBiW3Byb3BlcnR5XVxuXHRcdFx0XHRcdFx0XHQ6IHNvcnRGdW5jdGlvbihiKTtcblxuXHRcdFx0XHRcdGNvbnN0IGNvbXBhcmlzb24gPSAhZGVzY1xuXHRcdFx0XHRcdFx0PyBHdE9yZGVyQnlQaXBlLl9vcmRlckJ5Q29tcGFyYXRvcihwcm9wZXJ0eUEsIHByb3BlcnR5Qilcblx0XHRcdFx0XHRcdDogLUd0T3JkZXJCeVBpcGUuX29yZGVyQnlDb21wYXJhdG9yKHByb3BlcnR5QSwgcHJvcGVydHlCKTtcblxuXHRcdFx0XHRcdC8vIGRvbid0IHJldHVybiAwIHlldCBpbiBjYXNlIG9mIG5lZWRpbmcgdG8gc29ydCBieSBuZXh0IHByb3BlcnR5XG5cdFx0XHRcdFx0aWYgKGNvbXBhcmlzb24gIT09IDApIHtcblx0XHRcdFx0XHRcdHJldHVybiBjb21wYXJpc29uO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAwOyAvLyBlcXVhbCBlYWNoIG90aGVyXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cbiJdfQ==