@neocomplexx/ngx-neo-pipes
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.
333 lines • 29.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Pipe, Injectable } from '@angular/core';
/**
* Filter object array from property
*/
export class FuncFilterPipe {
/**
* @param {?} items
* @param {?} callback
* @return {?}
*/
transform(items, callback) {
if (!items || !callback) {
return [];
}
return items.filter(callback);
}
}
FuncFilterPipe.decorators = [
{ type: Pipe, args: [{
name: 'functionFilter'
},] },
{ type: Injectable }
];
/**
* Filter object array from property
*/
export class 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
* @param {?} items
* @param {?} field
* @param {?} value
* @return {?}
*/
transform(items, field, value) {
if (!items) {
return [];
}
if (!field || !value) {
return items;
}
return items.filter(singleItem => singleItem[field].toLowerCase().includes(value.toLowerCase()));
}
}
TextPipe.decorators = [
{ type: Pipe, args: [{
name: 'textFilter'
},] },
{ type: Injectable }
];
/**
* Array filter with string value with 2 indirection level
*/
export class 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
* @param {?} items
* @param {?} firstField
* @param {?} secondField
* @param {?} value
* @return {?}
*/
transform(items, firstField, secondField, value) {
if (!items) {
return [];
}
if (!firstField || !secondField || !value) {
return items;
}
return items.filter(singleItem => (singleItem[firstField][secondField]).toLowerCase().includes(value.toLowerCase()));
}
}
TextPipeTwoLevel.decorators = [
{ type: Pipe, args: [{
name: 'textFilter2Level'
},] },
{ type: Injectable }
];
export class 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
* @param {?} items
* @param {?} field
* @param {?} value
* @return {?}
*/
transform(items, field, value) {
if (!items) {
return [];
}
if (!field || !value) {
return items;
}
return items.filter(singleItem => singleItem[field].toString().includes(value.toString()));
}
}
NumberPipe.decorators = [
{ type: Pipe, args: [{
name: 'numberFilter'
},] },
{ type: Injectable }
];
export class ToStringPipe {
/**
* @param {?} items
* @param {?} value
* @return {?}
*/
transform(items, value) {
if (!items) {
return [];
}
if (!value) {
return items;
}
return items.filter(singleItem => singleItem.toString().toLowerCase().includes(value.toLowerCase()));
}
}
ToStringPipe.decorators = [
{ type: Pipe, args: [{
name: 'toStringFilter'
},] },
{ type: Injectable }
];
export class 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
* @param {?} items
* @param {?} firstField
* @param {?} secondField
* @param {?} value
* @return {?}
*/
transform(items, firstField, secondField, value) {
if (!items) {
return [];
}
if (!firstField || !secondField || !value) {
return items;
}
return items.filter(singleItem => singleItem[firstField][secondField].toString().includes(value.toString()));
}
}
NumberPipeTwoLevel.decorators = [
{ type: Pipe, args: [{
name: 'numberFilter2Level'
},] },
{ type: Injectable }
];
export class 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
* @param {?} items
* @param {?} field
* @param {?} value
* @return {?}
*/
transform(items, field, value) {
if (!items) {
return [];
}
if (!field || !value) {
return items;
}
if (value.toString().includes('<')) { // Caso 1: es menor
// Caso 1: es menor
/** @type {?} */
const numeros = value.split('<');
/** @type {?} */
const numero = +numeros[1];
return items.filter(singleItem => singleItem[field] < numero);
}
if (value.toString().includes('-')) { // Caso 2: Rango
// Caso 2: Rango
/** @type {?} */
const numeros = value.split('-');
/** @type {?} */
const numero1 = +numeros[0];
/** @type {?} */
const numero2 = +numeros[1];
return items.filter(singleItem => singleItem[field] >= numero1 && singleItem[field] < numero2);
}
if (value.toString().includes('>=')) { // Caso 3: Mayor o Igual
// Caso 3: Mayor o Igual
/** @type {?} */
const numeros = value.split('>=');
/** @type {?} */
const numero = +numeros[1];
return items.filter(singleItem => singleItem[field] >= numero);
}
// Caso 4, item vacio
return items;
}
}
RangePipe.decorators = [
{ type: Pipe, args: [{
name: 'rangeFilter'
},] },
{ type: Injectable }
];
export class 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
* @param {?} items
* @param {?} firstField
* @param {?} secondField
* @param {?} value
* @return {?}
*/
transform(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 {?} */
const numeros = value.split('<');
/** @type {?} */
const numero = +numeros[1];
return items.filter(singleItem => singleItem[firstField][secondField] < numero);
}
if (value.toString().includes('-')) { // Caso 2: Rango
// Caso 2: Rango
/** @type {?} */
const numeros = value.split('-');
/** @type {?} */
const numero1 = +numeros[0];
/** @type {?} */
const numero2 = +numeros[1];
return items.filter(singleItem => singleItem[firstField][secondField] >= numero1 &&
singleItem[firstField][secondField] < numero2);
}
if (value.toString().includes('>')) { // Caso 3: Mayor o Igual
// Caso 3: Mayor o Igual
/** @type {?} */
const numeros = value.split('>');
/** @type {?} */
const numero = +numeros[1];
return items.filter(singleItem => singleItem[firstField][secondField] >= numero);
}
// Caso 4, item vacio
return items;
}
}
RangePipeTwoLevel.decorators = [
{ type: Pipe, args: [{
name: 'rangeFilter2Level'
},] },
{ type: Injectable }
];
/**
* Filtrara arreglos mediante un los valores de un campo de tipo fecha
*/
export class DatePipe {
/**
* @author jcangelosi
* Filtrara el arreglo items por una fecha representada por un string
* @param {?} items
* @param {?} field
* @param {?} value
* @return {?}
*/
transform(items, field, value) {
if (!items) {
return [];
}
if (!field || !value) {
return items;
}
// caso contrario la fecha es valida
/** @type {?} */
const valores = value.split('-');
/** @type {?} */
const fecha = valores[2] + '/' + valores[1] + '/' + valores[0];
return items.filter(singleItem => singleItem[field].toLowerCase().includes(fecha));
}
}
DatePipe.decorators = [
{ type: Pipe, args: [{
name: 'dateFilter'
},] },
{ type: Injectable }
];
/**
* Pipe que se utiliza para separar los string de los nombres de los enumerables por palabra, de manera que queden mas agradables
* visualmente.
*/
export class BeautifyPipe {
/**
* @param {?} text
* @return {?}
*/
transform(text) {
if (text) {
/** @type {?} */
const palabras = text.split(/(?=[A-Z])/);
/** @type {?} */
let palabraAretornar = '';
for (const palabra of palabras) {
palabraAretornar = palabraAretornar.concat(' ', palabra);
}
return palabraAretornar;
}
return text;
}
}
BeautifyPipe.decorators = [
{ type: Pipe, args: [{ name: 'beautify' },] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5waXBlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8tcGlwZXMvIiwic291cmNlcyI6WyJsaWIvZmlsdGVycy5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFTaEUsTUFBTSxPQUFPLGNBQWM7Ozs7OztJQUN2QixTQUFTLENBQUMsS0FBWSxFQUFFLFFBQWlDO1FBRXJELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDckIsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUVELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxDQUFDOzs7WUFaSixJQUFJLFNBQUM7Z0JBQ0YsSUFBSSxFQUFFLGdCQUFnQjthQUN6QjtZQUNBLFVBQVU7Ozs7O0FBbUJYLE1BQU0sT0FBTyxRQUFROzs7Ozs7Ozs7OztJQU9qQixTQUFTLENBQUMsS0FBWSxFQUFFLEtBQWEsRUFBRSxLQUFhO1FBQ2hELElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixPQUFPLEVBQUUsQ0FBQztTQUNiO1FBQ0QsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNsQixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRyxDQUFDOzs7WUFuQkosSUFBSSxTQUFDO2dCQUNGLElBQUksRUFBRSxZQUFZO2FBQ3JCO1lBQ0EsVUFBVTs7Ozs7QUF5QlgsTUFBTSxPQUFPLGdCQUFnQjs7Ozs7Ozs7Ozs7O0lBT3pCLFNBQVMsQ0FBQyxLQUFZLEVBQUUsVUFB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ckI7WUFDQSxVQUFVOzs7Ozs7QUEyQlgsTUFBTSxPQUFPLFlBQVk7Ozs7O0lBQ3JCLFNBQVMsQ0FBQyxJQUFZO1FBQ2xCLElBQUksSUFBSSxFQUFFOztrQkFDQSxRQUFRLEdBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7O2dCQUM5QyxnQkFBZ0IsR0FBRyxFQUFFO1lBQ3pCLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFO2dCQUM1QixnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQzVEO1lBQ0QsT0FBTyxnQkFBZ0IsQ0FBQztTQUMzQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7OztZQVpKLElBQUksU0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vKipcclxuICogRmlsdGVyIG9iamVjdCBhcnJheSBmcm9tIHByb3BlcnR5XHJcbiAqL1xyXG5AUGlwZSh7XHJcbiAgICBuYW1lOiAnZnVuY3Rpb25GaWx0ZXInXHJcbn0pXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEZ1bmNGaWx0ZXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgICB0cmFuc2Zvcm0oaXRlbXM6IGFueVtdLCBjYWxsYmFjazogKHZhbHVlOiBhbnkpID0+IGJvb2xlYW4pOiBhbnlbXSB7XHJcblxyXG4gICAgICAgIGlmICghaXRlbXMgfHwgIWNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoY2FsbGJhY2spO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogRmlsdGVyIG9iamVjdCBhcnJheSBmcm9tIHByb3BlcnR5XHJcbiAqL1xyXG5AUGlwZSh7XHJcbiAgICBuYW1lOiAndGV4dEZpbHRlcidcclxufSlcclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVGV4dFBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICAgIC8qKlxyXG4gICAgICogQGF1dGhvciBqY2FuZ2Vsb3NpXHJcbiAgICAgKiBGaWx0cmEgZWwgYXJyZWdsbyBpdGVtcyBjb21wYXJhbmRvIGVsIHZhbG9yIGRlIHN1IGNhbXBvIGZpZWxkIChkZSB0aXBvIHN0cmluZykgY29uIGVsIHZhbG9yIGRlIHZhbHVlXHJcbiAgICAgKiBpZGVhIGdlbmVyYWwgOiBpdGVtcy5maWVsZCA9PSB2YWx1ZVxyXG4gICAgICogTk8gRlVOQ0lPTkEgQ09OIE5VTUVST1NcclxuICAgICAqL1xyXG4gICAgdHJhbnNmb3JtKGl0ZW1zOiBhbnlbXSwgZmllbGQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IGFueVtdIHtcclxuICAgICAgICBpZiAoIWl0ZW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFmaWVsZCB8fCAhdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKHNpbmdsZUl0ZW0gPT4gc2luZ2xlSXRlbVtmaWVsZF0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2YWx1ZS50b0xvd2VyQ2FzZSgpKSk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEFycmF5IGZpbHRlciB3aXRoIHN0cmluZyB2YWx1ZSB3aXRoIDIgaW5kaXJlY3Rpb24gbGV2ZWxcclxuICovXHJcbkBQaXBlKHtcclxuICAgIG5hbWU6ICd0ZXh0RmlsdGVyMkxldmVsJ1xyXG59KVxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUZXh0UGlwZVR3b0xldmVsIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgICAvKipcclxuICAgICAqIEBhdXRob3IgamNhbmdlbG9zaVxyXG4gICAgICogRmlsdHJhIGVsIGFycmVnbG8gaXRlbXMgY29tcGFyYW5kbyBlbCB2YWxvciBkZSBzdSBjYW1wbyBzZWNvbmRmaWVsZCBjb24gZWwgdmFsb3IgZGUgdmFsdWVcclxuICAgICAqIGlkZWEgZ2VuZXJhbCA6IGl0ZW1zLmZpZWxkLnNlY29uZEZpZWxkID09IHZhbHVlXHJcbiAgICAgKiBOTyBGVU5DSU9OQSBDT04gTlVNRVJPU1xyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm0oaXRlbXM6IGFueVtdLCBmaXJzdEZpZWxkOiBzdHJpbmcsIHNlY29uZEZpZWxkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBhbnlbXSB7XHJcblxyXG4gICAgICAgIGlmICghaXRlbXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWZpcnN0RmllbGQgfHwgIXNlY29uZEZpZWxkIHx8ICF2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoc2luZ2xlSXRlbSA9PiAoc2luZ2xlSXRlbVtmaXJzdEZpZWxkXVtzZWNvbmRGaWVsZF0pLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUudG9Mb3dlckNhc2UoKSkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5AUGlwZSh7XHJcbiAgICBuYW1lOiAnbnVtYmVyRmlsdGVyJ1xyXG59KVxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOdW1iZXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgICAvKipcclxuICAgICogQGF1dGhvciBqY2FuZ2Vsb3NpXHJcbiAgICAqIEZpbHRyYSBlbCBhcnJlZ2xvIGl0ZW1zIGNvbXBhcmFuZG8gZWwgdmFsb3IgZGUgc3UgY2FtcG8gZmllbGQgKGRlIHRpcG8gbnVtYmVyKSBjb24gZWwgdmFsb3IgZGUgdmFsdWVcclxuICAgICogaWRlYSBnZW5lcmFsIDogaXRlbXMuZmllbGQgPT0gdmFsdWVcclxuICAgICogU09MTyBGVU5DSU9OQSBDT04gTlVNRVJPU1xyXG4gICAgKi9cclxuICAgIHRyYW5zZm9ybShpdGVtczogYW55W10sIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpOiBhbnlbXSB7XHJcbiAgICAgICAgaWYgKCFpdGVtcykge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZmllbGQgfHwgIXZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihzaW5nbGVJdGVtID0+IHNpbmdsZUl0ZW1bZmllbGRdLnRvU3RyaW5nKCkuaW5jbHVkZXModmFsdWUudG9TdHJpbmcoKSkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5AUGlwZSh7XHJcbiAgICBuYW1lOiAndG9TdHJpbmdGaWx0ZXInXHJcbn0pXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRvU3RyaW5nUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG4gICAgdHJhbnNmb3JtKGl0ZW1zOiBhbnlbXSwgdmFsdWU6IHN0cmluZyk6IGFueVtdIHtcclxuICAgICAgICBpZiAoIWl0ZW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoc2luZ2xlSXRlbSA9PiBzaW5nbGVJdGVtLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2YWx1ZS50b0xvd2VyQ2FzZSgpKSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbkBQaXBlKHtcclxuICAgIG5hbWU6ICdudW1iZXJGaWx0ZXIyTGV2ZWwnXHJcbn0pXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE51bWJlclBpcGVUd29MZXZlbCBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAYXV0aG9yIGpjYW5nZWxvc2lcclxuICAgICAqIEZpbHRyYSBlbCBhcnJlZ2xvIGl0ZW1zIGNvbXBhcmFuZG8gZWwgdmFsb3IgZGUgc3UgY2FtcG8gc2Vjb25kZmllbGQgY29uIGVsIHZhbG9yIGRlIHZhbHVlXHJcbiAgICAgKiBpZGVhIGdlbmVyYWwgOiBpdGVtcy5maWVsZC5zZWNvbmRGaWVsZCA9PSB2YWx1ZVxyXG4gICAgICogU09MTyBGVU5DSU9OQSBDT04gTlVNRVJPU1xyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm0oaXRlbXM6IGFueVtdLCBmaXJzdEZpZWxkOiBzdHJpbmcsIHNlY29uZEZpZWxkOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpOiBhbnlbXSB7XHJcbiAgICAgICAgaWYgKCFpdGVtcykge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZmlyc3RGaWVsZCB8fCAhc2Vjb25kRmllbGQgfHwgIXZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihzaW5nbGVJdGVtID0+IHNpbmdsZUl0ZW1bZmlyc3RGaWVsZF1bc2Vjb25kRmllbGRdLnRvU3RyaW5nKCkuaW5jbHVkZXModmFsdWUudG9TdHJpbmcoKSkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5AUGlwZSh7XHJcbiAgICBuYW1lOiAncmFuZ2VGaWx0ZXInXHJcbn0pXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFJhbmdlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAYXV0aG9yIGpjYW5nZWxvc2lcclxuICAgICAqICBGaWx0cmFyYSBlbCBhcnJlZ2xvIGVuIGJhc2UgYSB1biByYW5nbyBkZSB2YWxvcmVzIG51bWVyaWNvcyBkZW50cm8gZGUgdW4gc3RyaW5nXHJcbiAgICAgKiAgQWNlcHRhIGxvIHNpZ3VpZW50ZTogPG51bWVybywgbnVtZXJvMS1udW1lcm8yICg+PW51bWVybzEgeSA8bnVtZXJvMiksID49bnVtZXJvMlxyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm0oaXRlbXM6IGFueVtdLCBmaWVsZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogYW55W10ge1xyXG4gICAgICAgIGlmICghaXRlbXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWZpZWxkIHx8ICF2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZS50b1N0cmluZygpLmluY2x1ZGVzKCc8JykpIHsgLy8gQ2FzbyAxOiBlcyBtZW5vclxyXG4gICAgICAgICAgICBjb25zdCBudW1lcm9zID0gdmFsdWUuc3BsaXQoJzwnKTtcclxuICAgICAgICAgICAgY29uc3QgbnVtZXJvOiBudW1iZXIgPSArbnVtZXJvc1sxXTtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihzaW5nbGVJdGVtID0+IHNpbmdsZUl0ZW1bZmllbGRdIDwgbnVtZXJvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkuaW5jbHVkZXMoJy0nKSkgeyAvLyBDYXNvIDI6IFJhbmdvXHJcbiAgICAgICAgICAgIGNvbnN0IG51bWVyb3MgPSB2YWx1ZS5zcGxpdCgnLScpO1xyXG4gICAgICAgICAgICBjb25zdCBudW1lcm8xOiBudW1iZXIgPSArIG51bWVyb3NbMF07XHJcbiAgICAgICAgICAgIGNvbnN0IG51bWVybzI6IG51bWJlciA9ICsgbnVtZXJvc1sxXTtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihzaW5nbGVJdGVtID0+IHNpbmdsZUl0ZW1bZmllbGRdID49IG51bWVybzEgJiYgc2luZ2xlSXRlbVtmaWVsZF0gPCBudW1lcm8yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkuaW5jbHVkZXMoJz49JykpIHsgLy8gQ2FzbyAzOiBNYXlvciBvIElndWFsXHJcbiAgICAgICAgICAgIGNvbnN0IG51bWVyb3MgPSB2YWx1ZS5zcGxpdCgnPj0nKTtcclxuICAgICAgICAgICAgY29uc3QgbnVtZXJvOiBudW1iZXIgPSArIG51bWVyb3NbMV07XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoc2luZ2xlSXRlbSA9PiBzaW5nbGVJdGVtW2ZpZWxkXSA+PSBudW1lcm8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDYXNvIDQsIGl0ZW0gdmFjaW9cclxuICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcbn1cclxuXHJcbkBQaXBlKHtcclxuICAgIG5hbWU6ICdyYW5nZUZpbHRlcjJMZXZlbCdcclxufSlcclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUmFuZ2VQaXBlVHdvTGV2ZWwgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICAgIC8qKlxyXG4gICAgICogQGF1dGhvciBqY2FuZ2Vsb3NpXHJcbiAgICAgKiBGaWx0cmEgZWwgYXJyZWdsbyBpdGVtcyBjb21wYXJhbmRvIGVsIHZhbG9yIGRlIHN1IGNhbXBvIHNlY29uZGZpZWxkIGVuIGJhc2UgYSB1biByYW5nbyBkZSB2YWxvcmVzIG51bWVyaWNvcyBkZW50cm8gZGUgdW4gc3RyaW5nXHJcbiAgICAgKiAgQWNlcHRhIGxvIHNpZ3VpZW50ZTogPG51bWVybywgbnVtZXJvMS1udW1lcm8yICg+PW51bWVybzEgeSA8bnVtZXJvMiksID49bnVtZXJvMlxyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm0oaXRlbXM6IGFueVtdLCBmaXJzdEZpZWxkOiBzdHJpbmcsIHNlY29uZEZpZWxkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBhbnlbXSB7XHJcbiAgICAgICAgaWYgKCFpdGVtcykge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZmlyc3RGaWVsZCB8fCAhc2Vjb25kRmllbGQgfHwgIXZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkuaW5jbHVkZXMoJzwnKSkgeyAvLyBDYXNvIDE6IGVzIG1lbm9yXHJcbiAgICAgICAgICAgIGNvbnN0IG51bWVyb3MgPSB2YWx1ZS5zcGxpdCgnPCcpO1xyXG4gICAgICAgICAgICBjb25zdCBudW1lcm86IG51bWJlciA9ICtudW1lcm9zWzFdO1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKHNpbmdsZUl0ZW0gPT4gc2luZ2xlSXRlbVtmaXJzdEZpZWxkXVtzZWNvbmRGaWVsZF0gPCBudW1lcm8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUudG9TdHJpbmcoKS5pbmNsdWRlcygnLScpKSB7IC8vIENhc28gMjogUmFuZ29cclxuICAgICAgICAgICAgY29uc3QgbnVtZXJvcyA9IHZhbHVlLnNwbGl0KCctJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bWVybzE6IG51bWJlciA9ICsgbnVtZXJvc1swXTtcclxuICAgICAgICAgICAgY29uc3QgbnVtZXJvMjogbnVtYmVyID0gKyBudW1lcm9zWzFdO1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKHNpbmdsZUl0ZW0gPT4gc2luZ2xlSXRlbVtmaXJzdEZpZWxkXVtzZWNvbmRGaWVsZF0gPj0gbnVtZXJvMSAmJlxyXG4gICAgICAgICAgICAgICAgc2luZ2xlSXRlbVtmaXJzdEZpZWxkXVtzZWNvbmRGaWVsZF0gPCBudW1lcm8yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkuaW5jbHVkZXMoJz4nKSkgeyAvLyBDYXNvIDM6IE1heW9yIG8gSWd1YWxcclxuICAgICAgICAgICAgY29uc3QgbnVtZXJvcyA9IHZhbHVlLnNwbGl0KCc+Jyk7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bWVybzogbnVtYmVyID0gKyBudW1lcm9zWzFdO1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKHNpbmdsZUl0ZW0gPT4gc2luZ2xlSXRlbVtmaXJzdEZpZWxkXVtzZWNvbmRGaWVsZF0gPj0gbnVtZXJvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ2FzbyA0LCBpdGVtIHZhY2lvXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG59XHJcblxyXG5AUGlwZSh7XHJcbiAgICBuYW1lOiAnZGF0ZUZpbHRlcidcclxufSlcclxuQEluamVjdGFibGUoKVxyXG4vKipcclxuICogRmlsdHJhcmEgYXJyZWdsb3MgbWVkaWFudGUgdW4gbG9zIHZhbG9yZXMgZGUgdW4gY2FtcG8gZGUgdGlwbyBmZWNoYVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERhdGVQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgICAvKipcclxuICAgICAqIEBhdXRob3IgamNhbmdlbG9zaVxyXG4gICAgICogRmlsdHJhcmEgZWwgYXJyZWdsbyBpdGVtcyBwb3IgdW5hIGZlY2hhIHJlcHJlc2VudGFkYSBwb3IgdW4gc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHRyYW5zZm9ybShpdGVtczogc3RyaW5nW10sIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBhbnlbXSB7XHJcbiAgICAgICAgaWYgKCFpdGVtcykge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZmllbGQgfHwgIXZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2FzbyBjb250cmFyaW8gbGEgZmVjaGEgZXMgdmFsaWRhXHJcbiAgICAgICAgY29uc3QgdmFsb3JlczogU3RyaW5nW10gPSB2YWx1ZS5zcGxpdCgnLScpO1xyXG4gICAgICAgIGNvbnN0IGZlY2hhOiBTdHJpbmcgPSB2YWxvcmVzWzJdICsgJy8nICsgdmFsb3Jlc1sxXSArICcvJyArIHZhbG9yZXNbMF07XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihzaW5nbGVJdGVtID0+IHNpbmdsZUl0ZW1bZmllbGRdLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmVjaGEpKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogUGlwZSBxdWUgc2UgdXRpbGl6YSBwYXJhIHNlcGFyYXIgbG9zIHN0cmluZyBkZSBsb3Mgbm9tYnJlcyBkZSBsb3MgZW51bWVyYWJsZXMgcG9yIHBhbGFicmEsIGRlIG1hbmVyYSBxdWUgcXVlZGVuIG1hcyBhZ3JhZGFibGVzXHJcbiAqIHZpc3VhbG1lbnRlLlxyXG4gKi9cclxuQFBpcGUoeyBuYW1lOiAnYmVhdXRpZnknIH0pXHJcbmV4cG9ydCBjbGFzcyBCZWF1dGlmeVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICAgIHRyYW5zZm9ybSh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGV4dCkge1xyXG4gICAgICAgICAgICBjb25zdCBwYWxhYnJhczogc3RyaW5nW10gPSB0ZXh0LnNwbGl0KC8oPz1bQS1aXSkvKTtcclxuICAgICAgICAgICAgbGV0IHBhbGFicmFBcmV0b3JuYXIgPSAnJztcclxuICAgICAgICAgICAgZm9yIChjb25zdCBwYWxhYnJhIG9mIHBhbGFicmFzKSB7XHJcbiAgICAgICAgICAgICAgICBwYWxhYnJhQXJldG9ybmFyID0gcGFsYWJyYUFyZXRvcm5hci5jb25jYXQoJyAnLCBwYWxhYnJhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcGFsYWJyYUFyZXRvcm5hcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRleHQ7XHJcbiAgICB9XHJcbn1cclxuIl19