UNPKG

@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
/** * @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