@neocomplexx/ngx-neo-pipes
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.
503 lines • 37.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Pipe, Injectable } from '@angular/core';
/**
* Filter object array from property
*/
var FuncFilterPipe = /** @class */ (function () {
function FuncFilterPipe() {
}
/**
* @param {?} items
* @param {?} callback
* @return {?}
*/
FuncFilterPipe.prototype.transform = /**
* @param {?} items
* @param {?} callback
* @return {?}
*/
function (items, callback) {
if (!items || !callback) {
return [];
}
return items.filter(callback);
};
FuncFilterPipe.decorators = [
{ type: Pipe, args: [{
name: 'functionFilter'
},] },
{ type: Injectable }
];
return FuncFilterPipe;
}());
export { FuncFilterPipe };
/**
* Filter object array from property
*/
var TextPipe = /** @class */ (function () {
function TextPipe() {
}
/**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo field (de tipo string) con el valor de value
* idea general : items.field == value
* NO FUNCIONA CON NUMEROS
*/
/**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo field (de tipo string) con el valor de value
* idea general : items.field == value
* NO FUNCIONA CON NUMEROS
* @param {?} items
* @param {?} field
* @param {?} value
* @return {?}
*/
TextPipe.prototype.transform = /**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo field (de tipo string) con el valor de value
* idea general : items.field == value
* NO FUNCIONA CON NUMEROS
* @param {?} items
* @param {?} field
* @param {?} value
* @return {?}
*/
function (items, field, value) {
if (!items) {
return [];
}
if (!field || !value) {
return items;
}
return items.filter(function (singleItem) { return singleItem[field].toLowerCase().includes(value.toLowerCase()); });
};
TextPipe.decorators = [
{ type: Pipe, args: [{
name: 'textFilter'
},] },
{ type: Injectable }
];
return TextPipe;
}());
export { TextPipe };
/**
* Array filter with string value with 2 indirection level
*/
var TextPipeTwoLevel = /** @class */ (function () {
function TextPipeTwoLevel() {
}
/**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo secondfield con el valor de value
* idea general : items.field.secondField == value
* NO FUNCIONA CON NUMEROS
*/
/**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo secondfield con el valor de value
* idea general : items.field.secondField == value
* NO FUNCIONA CON NUMEROS
* @param {?} items
* @param {?} firstField
* @param {?} secondField
* @param {?} value
* @return {?}
*/
TextPipeTwoLevel.prototype.transform = /**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo secondfield con el valor de value
* idea general : items.field.secondField == value
* NO FUNCIONA CON NUMEROS
* @param {?} items
* @param {?} firstField
* @param {?} secondField
* @param {?} value
* @return {?}
*/
function (items, firstField, secondField, value) {
if (!items) {
return [];
}
if (!firstField || !secondField || !value) {
return items;
}
return items.filter(function (singleItem) { return (singleItem[firstField][secondField]).toLowerCase().includes(value.toLowerCase()); });
};
TextPipeTwoLevel.decorators = [
{ type: Pipe, args: [{
name: 'textFilter2Level'
},] },
{ type: Injectable }
];
return TextPipeTwoLevel;
}());
export { TextPipeTwoLevel };
var NumberPipe = /** @class */ (function () {
function NumberPipe() {
}
/**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo field (de tipo number) con el valor de value
* idea general : items.field == value
* SOLO FUNCIONA CON NUMEROS
*/
/**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo field (de tipo number) con el valor de value
* idea general : items.field == value
* SOLO FUNCIONA CON NUMEROS
* @param {?} items
* @param {?} field
* @param {?} value
* @return {?}
*/
NumberPipe.prototype.transform = /**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo field (de tipo number) con el valor de value
* idea general : items.field == value
* SOLO FUNCIONA CON NUMEROS
* @param {?} items
* @param {?} field
* @param {?} value
* @return {?}
*/
function (items, field, value) {
if (!items) {
return [];
}
if (!field || !value) {
return items;
}
return items.filter(function (singleItem) { return singleItem[field].toString().includes(value.toString()); });
};
NumberPipe.decorators = [
{ type: Pipe, args: [{
name: 'numberFilter'
},] },
{ type: Injectable }
];
return NumberPipe;
}());
export { NumberPipe };
var ToStringPipe = /** @class */ (function () {
function ToStringPipe() {
}
/**
* @param {?} items
* @param {?} value
* @return {?}
*/
ToStringPipe.prototype.transform = /**
* @param {?} items
* @param {?} value
* @return {?}
*/
function (items, value) {
if (!items) {
return [];
}
if (!value) {
return items;
}
return items.filter(function (singleItem) { return singleItem.toString().toLowerCase().includes(value.toLowerCase()); });
};
ToStringPipe.decorators = [
{ type: Pipe, args: [{
name: 'toStringFilter'
},] },
{ type: Injectable }
];
return ToStringPipe;
}());
export { ToStringPipe };
var NumberPipeTwoLevel = /** @class */ (function () {
function NumberPipeTwoLevel() {
}
/**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo secondfield con el valor de value
* idea general : items.field.secondField == value
* SOLO FUNCIONA CON NUMEROS
*/
/**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo secondfield con el valor de value
* idea general : items.field.secondField == value
* SOLO FUNCIONA CON NUMEROS
* @param {?} items
* @param {?} firstField
* @param {?} secondField
* @param {?} value
* @return {?}
*/
NumberPipeTwoLevel.prototype.transform = /**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo secondfield con el valor de value
* idea general : items.field.secondField == value
* SOLO FUNCIONA CON NUMEROS
* @param {?} items
* @param {?} firstField
* @param {?} secondField
* @param {?} value
* @return {?}
*/
function (items, firstField, secondField, value) {
if (!items) {
return [];
}
if (!firstField || !secondField || !value) {
return items;
}
return items.filter(function (singleItem) { return singleItem[firstField][secondField].toString().includes(value.toString()); });
};
NumberPipeTwoLevel.decorators = [
{ type: Pipe, args: [{
name: 'numberFilter2Level'
},] },
{ type: Injectable }
];
return NumberPipeTwoLevel;
}());
export { NumberPipeTwoLevel };
var RangePipe = /** @class */ (function () {
function RangePipe() {
}
/**
* @author jcangelosi
* Filtrara el arreglo en base a un rango de valores numericos dentro de un string
* Acepta lo siguiente: <numero, numero1-numero2 (>=numero1 y <numero2), >=numero2
*/
/**
* @author jcangelosi
* Filtrara el arreglo en base a un rango de valores numericos dentro de un string
* Acepta lo siguiente: <numero, numero1-numero2 (>=numero1 y <numero2), >=numero2
* @param {?} items
* @param {?} field
* @param {?} value
* @return {?}
*/
RangePipe.prototype.transform = /**
* @author jcangelosi
* Filtrara el arreglo en base a un rango de valores numericos dentro de un string
* Acepta lo siguiente: <numero, numero1-numero2 (>=numero1 y <numero2), >=numero2
* @param {?} items
* @param {?} field
* @param {?} value
* @return {?}
*/
function (items, field, value) {
if (!items) {
return [];
}
if (!field || !value) {
return items;
}
if (value.toString().includes('<')) { // Caso 1: es menor
// Caso 1: es menor
/** @type {?} */
var numeros = value.split('<');
/** @type {?} */
var numero_1 = +numeros[1];
return items.filter(function (singleItem) { return singleItem[field] < numero_1; });
}
if (value.toString().includes('-')) { // Caso 2: Rango
// Caso 2: Rango
/** @type {?} */
var numeros = value.split('-');
/** @type {?} */
var numero1_1 = +numeros[0];
/** @type {?} */
var numero2_1 = +numeros[1];
return items.filter(function (singleItem) { return singleItem[field] >= numero1_1 && singleItem[field] < numero2_1; });
}
if (value.toString().includes('>=')) { // Caso 3: Mayor o Igual
// Caso 3: Mayor o Igual
/** @type {?} */
var numeros = value.split('>=');
/** @type {?} */
var numero_2 = +numeros[1];
return items.filter(function (singleItem) { return singleItem[field] >= numero_2; });
}
// Caso 4, item vacio
return items;
};
RangePipe.decorators = [
{ type: Pipe, args: [{
name: 'rangeFilter'
},] },
{ type: Injectable }
];
return RangePipe;
}());
export { RangePipe };
var RangePipeTwoLevel = /** @class */ (function () {
function RangePipeTwoLevel() {
}
/**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo secondfield en base a un rango de valores numericos dentro de un string
* Acepta lo siguiente: <numero, numero1-numero2 (>=numero1 y <numero2), >=numero2
*/
/**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo secondfield en base a un rango de valores numericos dentro de un string
* Acepta lo siguiente: <numero, numero1-numero2 (>=numero1 y <numero2), >=numero2
* @param {?} items
* @param {?} firstField
* @param {?} secondField
* @param {?} value
* @return {?}
*/
RangePipeTwoLevel.prototype.transform = /**
* @author jcangelosi
* Filtra el arreglo items comparando el valor de su campo secondfield en base a un rango de valores numericos dentro de un string
* Acepta lo siguiente: <numero, numero1-numero2 (>=numero1 y <numero2), >=numero2
* @param {?} items
* @param {?} firstField
* @param {?} secondField
* @param {?} value
* @return {?}
*/
function (items, firstField, secondField, value) {
if (!items) {
return [];
}
if (!firstField || !secondField || !value) {
return items;
}
if (value.toString().includes('<')) { // Caso 1: es menor
// Caso 1: es menor
/** @type {?} */
var numeros = value.split('<');
/** @type {?} */
var numero_3 = +numeros[1];
return items.filter(function (singleItem) { return singleItem[firstField][secondField] < numero_3; });
}
if (value.toString().includes('-')) { // Caso 2: Rango
// Caso 2: Rango
/** @type {?} */
var numeros = value.split('-');
/** @type {?} */
var numero1_2 = +numeros[0];
/** @type {?} */
var numero2_2 = +numeros[1];
return items.filter(function (singleItem) { return singleItem[firstField][secondField] >= numero1_2 &&
singleItem[firstField][secondField] < numero2_2; });
}
if (value.toString().includes('>')) { // Caso 3: Mayor o Igual
// Caso 3: Mayor o Igual
/** @type {?} */
var numeros = value.split('>');
/** @type {?} */
var numero_4 = +numeros[1];
return items.filter(function (singleItem) { return singleItem[firstField][secondField] >= numero_4; });
}
// Caso 4, item vacio
return items;
};
RangePipeTwoLevel.decorators = [
{ type: Pipe, args: [{
name: 'rangeFilter2Level'
},] },
{ type: Injectable }
];
return RangePipeTwoLevel;
}());
export { RangePipeTwoLevel };
var DatePipe = /** @class */ (function () {
function DatePipe() {
}
/**
* @author jcangelosi
* Filtrara el arreglo items por una fecha representada por un string
*/
/**
* @author jcangelosi
* Filtrara el arreglo items por una fecha representada por un string
* @param {?} items
* @param {?} field
* @param {?} value
* @return {?}
*/
DatePipe.prototype.transform = /**
* @author jcangelosi
* Filtrara el arreglo items por una fecha representada por un string
* @param {?} items
* @param {?} field
* @param {?} value
* @return {?}
*/
function (items, field, value) {
if (!items) {
return [];
}
if (!field || !value) {
return items;
}
// caso contrario la fecha es valida
/** @type {?} */
var valores = value.split('-');
/** @type {?} */
var fecha = valores[2] + '/' + valores[1] + '/' + valores[0];
return items.filter(function (singleItem) { return singleItem[field].toLowerCase().includes(fecha); });
};
DatePipe.decorators = [
{ type: Pipe, args: [{
name: 'dateFilter'
},] },
{ type: Injectable }
];
return DatePipe;
}());
export { DatePipe };
/**
* Pipe que se utiliza para separar los string de los nombres de los enumerables por palabra, de manera que queden mas agradables
* visualmente.
*/
var BeautifyPipe = /** @class */ (function () {
function BeautifyPipe() {
}
/**
* @param {?} text
* @return {?}
*/
BeautifyPipe.prototype.transform = /**
* @param {?} text
* @return {?}
*/
function (text) {
var e_1, _a;
if (text) {
/** @type {?} */
var palabras = text.split(/(?=[A-Z])/);
/** @type {?} */
var palabraAretornar = '';
try {
for (var palabras_1 = tslib_1.__values(palabras), palabras_1_1 = palabras_1.next(); !palabras_1_1.done; palabras_1_1 = palabras_1.next()) {
var palabra = palabras_1_1.value;
palabraAretornar = palabraAretornar.concat(' ', palabra);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (palabras_1_1 && !palabras_1_1.done && (_a = palabras_1.return)) _a.call(palabras_1);
}
finally { if (e_1) throw e_1.error; }
}
return palabraAretornar;
}
return text;
};
BeautifyPipe.decorators = [
{ type: Pipe, args: [{ name: 'beautify' },] }
];
return BeautifyPipe;
}());
export { BeautifyPipe };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5waXBlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8tcGlwZXMvIiwic291cmNlcyI6WyJsaWIvZmlsdGVycy5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBS2hFO0lBQUE7SUFhQSxDQUFDOzs7Ozs7SUFSRyxrQ0FBUzs7Ozs7SUFBVCxVQUFVLEtBQVksRUFBRSxRQUFpQztRQUVyRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3JCLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFFRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQzs7Z0JBWkosSUFBSSxTQUFDO29CQUNGLElBQUksRUFBRSxnQkFBZ0I7aUJBQ3pCO2dCQUNBLFVBQVU7O0lBVVgscUJBQUM7Q0FBQSxBQWJELElBYUM7U0FUWSxjQUFjOzs7O0FBYzNCO0lBQUE7SUFvQkEsQ0FBQztJQWZHOzs7OztPQUtHOzs7Ozs7Ozs7OztJQUNILDRCQUFTOzs7Ozs7Ozs7O0lBQVQsVUFBVSxLQUFZLEVBQUUsS0FBYSxFQUFFLEtBQWE7UUFDaEQsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFDRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2xCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsVUFBVSxJQUFJLE9BQUEsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBN0QsQ0FBNkQsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7O2dCQW5CSixJQUFJLFNBQUM7b0JBQ0YsSUFBSSxFQUFF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LEtBQXNCLElBQUEsYUFBQSxpQkFBQSxRQUFRLENBQUEsa0NBQUEsd0RBQUU7b0JBQTNCLElBQU0sT0FBTyxxQkFBQTtvQkFDZCxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lCQUM1RDs7Ozs7Ozs7O1lBQ0QsT0FBTyxnQkFBZ0IsQ0FBQztTQUMzQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7O2dCQVpKLElBQUksU0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7O0lBYTFCLG1CQUFDO0NBQUEsQUFiRCxJQWFDO1NBWlksWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0sIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKlxyXG4gKiBGaWx0ZXIgb2JqZWN0IGFycmF5IGZyb20gcHJvcGVydHlcclxuICovXHJcbkBQaXBlKHtcclxuICAgIG5hbWU6ICdmdW5jdGlvbkZpbHRlcidcclxufSlcclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRnVuY0ZpbHRlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICAgIHRyYW5zZm9ybShpdGVtczogYW55W10sIGNhbGxiYWNrOiAodmFsdWU6IGFueSkgPT4gYm9vbGVhbik6IGFueVtdIHtcclxuXHJcbiAgICAgICAgaWYgKCFpdGVtcyB8fCAhY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihjYWxsYmFjayk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGaWx0ZXIgb2JqZWN0IGFycmF5IGZyb20gcHJvcGVydHlcclxuICovXHJcbkBQaXBlKHtcclxuICAgIG5hbWU6ICd0ZXh0RmlsdGVyJ1xyXG59KVxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUZXh0UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAYXV0aG9yIGpjYW5nZWxvc2lcclxuICAgICAqIEZpbHRyYSBlbCBhcnJlZ2xvIGl0ZW1zIGNvbXBhcmFuZG8gZWwgdmFsb3IgZGUgc3UgY2FtcG8gZmllbGQgKGRlIHRpcG8gc3RyaW5nKSBjb24gZWwgdmFsb3IgZGUgdmFsdWVcclxuICAgICAqIGlkZWEgZ2VuZXJhbCA6IGl0ZW1zLmZpZWxkID09IHZhbHVlXHJcbiAgICAgKiBOTyBGVU5DSU9OQSBDT04gTlVNRVJPU1xyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm0oaXRlbXM6IGFueVtdLCBmaWVsZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogYW55W10ge1xyXG4gICAgICAgIGlmICghaXRlbXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWZpZWxkIHx8ICF2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoc2luZ2xlSXRlbSA9PiBzaW5nbGVJdGVtW2ZpZWxkXS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHZhbHVlLnRvTG93ZXJDYXNlKCkpKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogQXJyYXkgZmlsdGVyIHdpdGggc3RyaW5nIHZhbHVlIHdpdGggMiBpbmRpcmVjdGlvbiBsZXZlbFxyXG4gKi9cclxuQFBpcGUoe1xyXG4gICAgbmFtZTogJ3RleHRGaWx0ZXIyTGV2ZWwnXHJcbn0pXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRleHRQaXBlVHdvTGV2ZWwgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICAgIC8qKlxyXG4gICAgICogQGF1dGhvciBqY2FuZ2Vsb3NpXHJcbiAgICAgKiBGaWx0cmEgZWwgYXJyZWdsbyBpdGVtcyBjb21wYXJhbmRvIGVsIHZhbG9yIGRlIHN1IGNhbXBvIHNlY29uZGZpZWxkIGNvbiBlbCB2YWxvciBkZSB2YWx1ZVxyXG4gICAgICogaWRlYSBnZW5lcmFsIDogaXRlbXMuZmllbGQuc2Vjb25kRmllbGQgPT0gdmFsdWVcclxuICAgICAqIE5PIEZVTkNJT05BIENPTiBOVU1FUk9TXHJcbiAgICAgKi9cclxuICAgIHRyYW5zZm9ybShpdGVtczogYW55W10sIGZpcnN0RmllbGQ6IHN0cmluZywgc2Vjb25kRmllbGQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IGFueVtdIHtcclxuXHJcbiAgICAgICAgaWYgKCFpdGVtcykge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZmlyc3RGaWVsZCB8fCAhc2Vjb25kRmllbGQgfHwgIXZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihzaW5nbGVJdGVtID0+IChzaW5nbGVJdGVtW2ZpcnN0RmllbGRdW3NlY29uZEZpZWxkXSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2YWx1ZS50b0xvd2VyQ2FzZSgpKSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbkBQaXBlKHtcclxuICAgIG5hbWU6ICdudW1iZXJGaWx0ZXInXHJcbn0pXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE51bWJlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICAgIC8qKlxyXG4gICAgKiBAYXV0aG9yIGpjYW5nZWxvc2lcclxuICAgICogRmlsdHJhIGVsIGFycmVnbG8gaXRlbXMgY29tcGFyYW5kbyBlbCB2YWxvciBkZSBzdSBjYW1wbyBmaWVsZCAoZGUgdGlwbyBudW1iZXIpIGNvbiBlbCB2YWxvciBkZSB2YWx1ZVxyXG4gICAgKiBpZGVhIGdlbmVyYWwgOiBpdGVtcy5maWVsZCA9PSB2YWx1ZVxyXG4gICAgKiBTT0xPIEZVTkNJT05BIENPTiBOVU1FUk9TXHJcbiAgICAqL1xyXG4gICAgdHJhbnNmb3JtKGl0ZW1zOiBhbnlbXSwgZmllbGQ6IHN0cmluZywgdmFsdWU6IG51bWJlcik6IGFueVtdIHtcclxuICAgICAgICBpZiAoIWl0ZW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFmaWVsZCB8fCAhdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKHNpbmdsZUl0ZW0gPT4gc2luZ2xlSXRlbVtmaWVsZF0udG9TdHJpbmcoKS5pbmNsdWRlcyh2YWx1ZS50b1N0cmluZygpKSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbkBQaXBlKHtcclxuICAgIG5hbWU6ICd0b1N0cmluZ0ZpbHRlcidcclxufSlcclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVG9TdHJpbmdQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgICB0cmFuc2Zvcm0oaXRlbXM6IGFueVtdLCB2YWx1ZTogc3RyaW5nKTogYW55W10ge1xyXG4gICAgICAgIGlmICghaXRlbXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihzaW5nbGVJdGVtID0+IHNpbmdsZUl0ZW0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHZhbHVlLnRvTG93ZXJDYXNlKCkpKTtcclxuICAgIH1cclxufVxyXG5cclxuQFBpcGUoe1xyXG4gICAgbmFtZTogJ251bWJlckZpbHRlcjJMZXZlbCdcclxufSlcclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTnVtYmVyUGlwZVR3b0xldmVsIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgICAvKipcclxuICAgICAqIEBhdXRob3IgamNhbmdlbG9zaVxyXG4gICAgICogRmlsdHJhIGVsIGFycmVnbG8gaXRlbXMgY29tcGFyYW5kbyBlbCB2YWxvciBkZSBzdSBjYW1wbyBzZWNvbmRmaWVsZCBjb24gZWwgdmFsb3IgZGUgdmFsdWVcclxuICAgICAqIGlkZWEgZ2VuZXJhbCA6IGl0ZW1zLmZpZWxkLnNlY29uZEZpZWxkID09IHZhbHVlXHJcbiAgICAgKiBTT0xPIEZVTkNJT05BIENPTiBOVU1FUk9TXHJcbiAgICAgKi9cclxuICAgIHRyYW5zZm9ybShpdGVtczogYW55W10sIGZpcnN0RmllbGQ6IHN0cmluZywgc2Vjb25kRmllbGQ6IHN0cmluZywgdmFsdWU6IG51bWJlcik6IGFueVtdIHtcclxuICAgICAgICBpZiAoIWl0ZW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFmaXJzdEZpZWxkIHx8ICFzZWNvbmRGaWVsZCB8fCAhdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKHNpbmdsZUl0ZW0gPT4gc2luZ2xlSXRlbVtmaXJzdEZpZWxkXVtzZWNvbmRGaWVsZF0udG9TdHJpbmcoKS5pbmNsdWRlcyh2YWx1ZS50b1N0cmluZygpKSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbkBQaXBlKHtcclxuICAgIG5hbWU6ICdyYW5nZUZpbHRlcidcclxufSlcclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUmFuZ2VQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgICAvKipcclxuICAgICAqIEBhdXRob3IgamNhbmdlbG9zaVxyXG4gICAgICogIEZpbHRyYXJhIGVsIGFycmVnbG8gZW4gYmFzZSBhIHVuIHJhbmdvIGRlIHZhbG9yZXMgbnVtZXJpY29zIGRlbnRybyBkZSB1biBzdHJpbmdcclxuICAgICAqICBBY2VwdGEgbG8gc2lndWllbnRlOiA8bnVtZXJvLCBudW1lcm8xLW51bWVybzIgKD49bnVtZXJvMSB5IDxudW1lcm8yKSwgPj1udW1lcm8yXHJcbiAgICAgKi9cclxuICAgIHRyYW5zZm9ybShpdGVtczogYW55W10sIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBhbnlbXSB7XHJcbiAgICAgICAgaWYgKCFpdGVtcykge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZmllbGQgfHwgIXZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkuaW5jbHVkZXMoJzwnKSkgeyAvLyBDYXNvIDE6IGVzIG1lbm9yXHJcbiAgICAgICAgICAgIGNvbnN0IG51bWVyb3MgPSB2YWx1ZS5zcGxpdCgnPCcpO1xyXG4gICAgICAgICAgICBjb25zdCBudW1lcm86IG51bWJlciA9ICtudW1lcm9zWzFdO1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKHNpbmdsZUl0ZW0gPT4gc2luZ2xlSXRlbVtmaWVsZF0gPCBudW1lcm8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUudG9TdHJpbmcoKS5pbmNsdWRlcygnLScpKSB7IC8vIENhc28gMjogUmFuZ29cclxuICAgICAgICAgICAgY29uc3QgbnVtZXJvcyA9IHZhbHVlLnNwbGl0KCctJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bWVybzE6IG51bWJlciA9ICsgbnVtZXJvc1swXTtcclxuICAgICAgICAgICAgY29uc3QgbnVtZXJvMjogbnVtYmVyID0gKyBudW1lcm9zWzFdO1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKHNpbmdsZUl0ZW0gPT4gc2luZ2xlSXRlbVtmaWVsZF0gPj0gbnVtZXJvMSAmJiBzaW5nbGVJdGVtW2ZpZWxkXSA8IG51bWVybzIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUudG9TdHJpbmcoKS5pbmNsdWRlcygnPj0nKSkgeyAvLyBDYXNvIDM6IE1heW9yIG8gSWd1YWxcclxuICAgICAgICAgICAgY29uc3QgbnVtZXJvcyA9IHZhbHVlLnNwbGl0KCc+PScpO1xyXG4gICAgICAgICAgICBjb25zdCBudW1lcm86IG51bWJlciA9ICsgbnVtZXJvc1sxXTtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihzaW5nbGVJdGVtID0+IHNpbmdsZUl0ZW1bZmllbGRdID49IG51bWVybyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENhc28gNCwgaXRlbSB2YWNpb1xyXG4gICAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH1cclxufVxyXG5cclxuQFBpcGUoe1xyXG4gICAgbmFtZTogJ3JhbmdlRmlsdGVyMkxldmVsJ1xyXG59KVxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBSYW5nZVBpcGVUd29MZXZlbCBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAYXV0aG9yIGpjYW5nZWxvc2lcclxuICAgICAqIEZpbHRyYSBlbCBhcnJlZ2xvIGl0ZW1zIGNvbXBhcmFuZG8gZWwgdmFsb3IgZGUgc3UgY2FtcG8gc2Vjb25kZmllbGQgZW4gYmFzZSBhIHVuIHJhbmdvIGRlIHZhbG9yZXMgbnVtZXJpY29zIGRlbnRybyBkZSB1biBzdHJpbmdcclxuICAgICAqICBBY2VwdGEgbG8gc2lndWllbnRlOiA8bnVtZXJvLCBudW1lcm8xLW51bWVybzIgKD49bnVtZXJvMSB5IDxudW1lcm8yKSwgPj1udW1lcm8yXHJcbiAgICAgKi9cclxuICAgIHRyYW5zZm9ybShpdGVtczogYW55W10sIGZpcnN0RmllbGQ6IHN0cmluZywgc2Vjb25kRmllbGQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IGFueVtdIHtcclxuICAgICAgICBpZiAoIWl0ZW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFmaXJzdEZpZWxkIHx8ICFzZWNvbmRGaWVsZCB8fCAhdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUudG9TdHJpbmcoKS5pbmNsdWRlcygnPCcpKSB7IC8vIENhc28gMTogZXMgbWVub3JcclxuICAgICAgICAgICAgY29uc3QgbnVtZXJvcyA9IHZhbHVlLnNwbGl0KCc8Jyk7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bWVybzogbnVtYmVyID0gK251bWVyb3NbMV07XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoc2luZ2xlSXRlbSA9PiBzaW5nbGVJdGVtW2ZpcnN0RmllbGRdW3NlY29uZEZpZWxkXSA8IG51bWVybyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZS50b1N0cmluZygpLmluY2x1ZGVzKCctJykpIHsgLy8gQ2FzbyAyOiBSYW5nb1xyXG4gICAgICAgICAgICBjb25zdCBudW1lcm9zID0gdmFsdWUuc3BsaXQoJy0nKTtcclxuICAgICAgICAgICAgY29uc3QgbnVtZXJvMTogbnVtYmVyID0gKyBudW1lcm9zWzBdO1xyXG4gICAgICAgICAgICBjb25zdCBudW1lcm8yOiBudW1iZXIgPSArIG51bWVyb3NbMV07XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoc2luZ2xlSXRlbSA9PiBzaW5nbGVJdGVtW2ZpcnN0RmllbGRdW3NlY29uZEZpZWxkXSA+PSBudW1lcm8xICYmXHJcbiAgICAgICAgICAgICAgICBzaW5nbGVJdGVtW2ZpcnN0RmllbGRdW3NlY29uZEZpZWxkXSA8IG51bWVybzIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUudG9TdHJpbmcoKS5pbmNsdWRlcygnPicpKSB7IC8vIENhc28gMzogTWF5b3IgbyBJZ3VhbFxyXG4gICAgICAgICAgICBjb25zdCBudW1lcm9zID0gdmFsdWUuc3BsaXQoJz4nKTtcclxuICAgICAgICAgICAgY29uc3QgbnVtZXJvOiBudW1iZXIgPSArIG51bWVyb3NbMV07XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoc2luZ2xlSXRlbSA9PiBzaW5nbGVJdGVtW2ZpcnN0RmllbGRdW3NlY29uZEZpZWxkXSA+PSBudW1lcm8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDYXNvIDQsIGl0ZW0gdmFjaW9cclxuICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcbn1cclxuXHJcbkBQaXBlKHtcclxuICAgIG5hbWU6ICdkYXRlRmlsdGVyJ1xyXG59KVxyXG5ASW5qZWN0YWJsZSgpXHJcbi8qKlxyXG4gKiBGaWx0cmFyYSBhcnJlZ2xvcyBtZWRpYW50ZSB1biBsb3MgdmFsb3JlcyBkZSB1biBjYW1wbyBkZSB0aXBvIGZlY2hhXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGF0ZVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICAgIC8qKlxyXG4gICAgICogQGF1dGhvciBqY2FuZ2Vsb3NpXHJcbiAgICAgKiBGaWx0cmFyYSBlbCBhcnJlZ2xvIGl0ZW1zIHBvciB1bmEgZmVjaGEgcmVwcmVzZW50YWRhIHBvciB1biBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgdHJhbnNmb3JtKGl0ZW1zOiBzdHJpbmdbXSwgZmllbGQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IGFueVtdIHtcclxuICAgICAgICBpZiAoIWl0ZW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFmaWVsZCB8fCAhdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjYXNvIGNvbnRyYXJpbyBsYSBmZWNoYSBlcyB2YWxpZGFcclxuICAgICAgICBjb25zdCB2YWxvcmVzOiBTdHJpbmdbXSA9IHZhbHVlLnNwbGl0KCctJyk7XHJcbiAgICAgICAgY29uc3QgZmVjaGE6IFN0cmluZyA9IHZhbG9yZXNbMl0gKyAnLycgKyB2YWxvcmVzWzFdICsgJy8nICsgdmFsb3Jlc1swXTtcclxuICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKHNpbmdsZUl0ZW0gPT4gc2luZ2xlSXRlbVtmaWVsZF0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmZWNoYSkpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBQaXBlIHF1ZSBzZSB1dGlsaXphIHBhcmEgc2VwYXJhciBsb3Mgc3RyaW5nIGRlIGxvcyBub21icmVzIGRlIGxvcyBlbnVtZXJhYmxlcyBwb3IgcGFsYWJyYSwgZGUgbWFuZXJhIHF1ZSBxdWVkZW4gbWFzIGFncmFkYWJsZXNcclxuICogdmlzdWFsbWVudGUuXHJcbiAqL1xyXG5AUGlwZSh7IG5hbWU6ICdiZWF1dGlmeScgfSlcclxuZXhwb3J0IGNsYXNzIEJlYXV0aWZ5UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG4gICAgdHJhbnNmb3JtKHRleHQ6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0ZXh0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhbGFicmFzOiBzdHJpbmdbXSA9IHRleHQuc3BsaXQoLyg/PVtBLVpdKS8pO1xyXG4gICAgICAgICAgICBsZXQgcGFsYWJyYUFyZXRvcm5hciA9ICcnO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhbGFicmEgb2YgcGFsYWJyYXMpIHtcclxuICAgICAgICAgICAgICAgIHBhbGFicmFBcmV0b3JuYXIgPSBwYWxhYnJhQXJldG9ybmFyLmNvbmNhdCgnICcsIHBhbGFicmEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBwYWxhYnJhQXJldG9ybmFyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGV4dDtcclxuICAgIH1cclxufVxyXG4iXX0=