@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
153 lines • 25.2 kB
JavaScript
import { chunk, flow, get, isNil, mapValues, omitBy, orderBy } from 'lodash-es';
import { BehaviorSubject, defer, of, Subject } from 'rxjs';
import { catchError, finalize, map, switchMap, tap } from 'rxjs/operators';
import { toObservable } from '../common/extension-hooks';
export class GridDataSource {
constructor() {
this.loadingSubject = new BehaviorSubject(true);
this.dataSourceSubject = new BehaviorSubject([]);
this.dataStatsSubject = new BehaviorSubject({
size: 0,
filteredSize: 0,
currentPage: 0,
currentPageSize: 0,
firstPageSize: 0
});
this.dataSelectionSubject = new BehaviorSubject({
filteredDataIds: []
});
this.resultListSubject = new Subject();
this.loading$ = this.loadingSubject.asObservable();
this.data$ = this.dataSourceSubject.asObservable();
this.stats$ = this.dataStatsSubject.asObservable();
this.selection$ = this.dataSelectionSubject.asObservable();
this.resultList$ = this.resultListSubject.asObservable();
}
connect(_collectionViewer) {
return this.data$;
}
disconnect(_collectionViewer) {
this.loadingSubject.complete();
this.dataSourceSubject.complete();
this.dataStatsSubject.complete();
this.dataSelectionSubject.complete();
}
loadData({ rows, columns, pagination, searchText, serverSideDataCallback, selectable, selectionPrimaryKey, infiniteScroll, reload = false }) {
const clientSideData$ = toObservable(rows).pipe(map(initialData => {
let filteredSize = 0;
let filteredDataIds = [];
const transformedData = flow(data => this.doClientSideSearch({ data, columns, searchText }), data => this.doClientSideFiltering({ data, columns }), data => this.doClientSideSorting({ data, columns }), data => {
filteredSize = data.length;
filteredDataIds = selectable
? data.map(item => item[selectionPrimaryKey])
: filteredDataIds;
return data;
}, data => this.doClientSidePagination({ data, pagination }))(initialData);
this.dataStatsSubject.next({
size: initialData.length,
filteredSize,
currentPage: pagination.currentPage,
currentPageSize: transformedData.length,
firstPageSize: pagination.pageSize
});
this.dataSelectionSubject.next({ filteredDataIds });
return transformedData;
}));
const serverSideData$ = defer(() => toObservable(serverSideDataCallback({
columns,
searchText,
pagination,
selection: { enabled: selectable, primaryKey: selectionPrimaryKey }
}))).pipe(map((result) => {
const { data, paging, size, filteredSize, filteredDataIds } = result;
this.dataStatsSubject.next({
size,
filteredSize,
currentPage: paging.currentPage,
currentPageSize: data.length,
nextPage: paging.nextPage,
firstPageSize: paging.pageSize
});
this.dataSelectionSubject.next({ filteredDataIds: filteredDataIds || [] });
this.resultListSubject.next(result);
return data;
}));
const data$ = typeof serverSideDataCallback === 'function' ? serverSideData$ : clientSideData$;
of([])
.pipe(tap(() => this.loadingSubject.next(true)), switchMap(() => data$), catchError(() => {
this.dataStatsSubject.next({
size: 0,
filteredSize: 0,
currentPage: 0,
currentPageSize: 0,
firstPageSize: 0
});
this.dataSelectionSubject.next({ filteredDataIds: [] });
return of([]);
}), finalize(() => this.loadingSubject.next(false)))
.subscribe(result => {
const data = infiniteScroll && !reload ? [...this.dataSourceSubject.value, ...result] : result;
this.dataSourceSubject.next(data);
});
}
resolveValue(x, path) {
return get(x, path);
}
resolveFunction(x) {
return typeof x === 'function' ? x() : x;
}
normalizeNil(x) {
return isNil(x) ? '' : x;
}
doClientSideFiltering({ data, columns }) {
return columns.reduce((result, column) => {
const { filterPredicate } = column;
if (typeof filterPredicate === 'string') {
return this.doClientSideSearch({
data: result,
columns: [column],
searchText: filterPredicate
});
}
if (typeof filterPredicate === 'function') {
return result.filter(item => filterPredicate(item, column.path));
}
return result;
}, data);
}
doClientSideSearch({ data, columns, searchText }) {
const propPaths = columns.map(({ path }) => path).filter(column => !isNil(column));
const regexSearch = this.createRegexSearch(searchText);
return data.filter(item => {
const itemWithResolvedValues = flow(x => propPaths.map(propPath => get(x, propPath)), x => mapValues(x, this.resolveFunction), x => omitBy(x, isNil))(item);
const cellValues = Object.values(itemWithResolvedValues);
return cellValues.some(cellValue => regexSearch.test(cellValue.toString()));
});
}
doClientSideSorting({ data, columns }) {
const actives = columns.filter(({ sortOrder }) => !!sortOrder);
const sortingState = {
iteratees: actives.map(({ path }) => path).map(path => item => get(item, path) ?? ''),
orders: actives.map(({ sortOrder }) => sortOrder)
};
return orderBy(data, sortingState.iteratees, sortingState.orders);
}
doClientSidePagination({ data, pagination }) {
return pagination
? get(chunk(data, pagination.pageSize), pagination.currentPage - 1, [])
: data;
}
createRegexSearch(filterValue) {
return RegExp(escapeRegExpPattern(filterValue), 'i');
}
}
/**
*
* @param string pattern Regex pattern.
* @return string The escaped regex.
* @see https://stackoverflow.com/a/3561711/2013891
*/
function escapeRegExpPattern(pattern = '') {
return pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1kYXRhLXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZGF0YS1ncmlkL2dyaWQtZGF0YS1zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoRixPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3pELE1BQU0sT0FBTyxjQUFjO0lBcUJ6QjtRQWRRLG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQVUsSUFBSSxDQUFDLENBQUM7UUFDcEQsc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQVcsRUFBRSxDQUFDLENBQUM7UUFDdEQscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQWtCO1lBQzlELElBQUksRUFBRSxDQUFDO1lBQ1AsWUFBWSxFQUFFLENBQUM7WUFDZixXQUFXLEVBQUUsQ0FBQztZQUNkLGVBQWUsRUFBRSxDQUFDO1lBQ2xCLGFBQWEsRUFBRSxDQUFDO1NBQ2pCLENBQUMsQ0FBQztRQUNLLHlCQUFvQixHQUFHLElBQUksZUFBZSxDQUFNO1lBQ3RELGVBQWUsRUFBRSxFQUFFO1NBQ3BCLENBQUMsQ0FBQztRQUNLLHNCQUFpQixHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO1FBRzdELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNuRCxJQUFJLENBQUMsS0FB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TyxzQkFBc0IsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7UUFDakQsT0FBTyxVQUFVO1lBQ2YsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdkUsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxXQUFXO1FBQ25DLE9BQU8sTUFBTSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7Q0FDRjtBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxPQUFPLEdBQUcsRUFBRTtJQUN2QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDeEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbGxlY3Rpb25WaWV3ZXIsIERhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgSVJlc3VsdExpc3QgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBjaHVuaywgZmxvdywgZ2V0LCBpc05pbCwgbWFwVmFsdWVzLCBvbWl0QnksIG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBkZWZlciwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbmFsaXplLCBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlIH0gZnJvbSAnLi4vY29tbW9uL2V4dGVuc2lvbi1ob29rcyc7XG5pbXBvcnQgeyBDb2x1bW4sIERhdGFTb3VyY2VTdGF0cywgU2VydmVyU2lkZURhdGFSZXN1bHQgfSBmcm9tICcuL2RhdGEtZ3JpZC5tb2RlbCc7XG5cbmV4cG9ydCBjbGFzcyBHcmlkRGF0YVNvdXJjZSBpbXBsZW1lbnRzIERhdGFTb3VyY2U8b2JqZWN0PiB7XG4gIGxvYWRpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBkYXRhJDogT2JzZXJ2YWJsZTxvYmplY3RbXT47XG4gIHN0YXRzJDogT2JzZXJ2YWJsZTxEYXRhU291cmNlU3RhdHM+O1xuICBzZWxlY3Rpb24kOiBPYnNlcnZhYmxlPGFueT47XG4gIHJlc3VsdExpc3QkOiBPYnNlcnZhYmxlPElSZXN1bHRMaXN0PG9iamVjdD4+O1xuXG4gIHByaXZhdGUgbG9hZGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICBwcml2YXRlIGRhdGFTb3VyY2VTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxvYmplY3RbXT4oW10pO1xuICBwcml2YXRlIGRhdGFTdGF0c1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFTb3VyY2VTdGF0cz4oe1xuICAgIHNpemU6IDAsXG4gICAgZmlsdGVyZWRTaXplOiAwLFxuICAgIGN1cnJlbnRQYWdlOiAwLFxuICAgIGN1cnJlbnRQYWdlU2l6ZTogMCxcbiAgICBmaXJzdFBhZ2VTaXplOiAwXG4gIH0pO1xuICBwcml2YXRlIGRhdGFTZWxlY3Rpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHtcbiAgICBmaWx0ZXJlZERhdGFJZHM6IFtdXG4gIH0pO1xuICBwcml2YXRlIHJlc3VsdExpc3RTdWJqZWN0ID0gbmV3IFN1YmplY3Q8SVJlc3VsdExpc3Q8b2JqZWN0Pj4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmxvYWRpbmckID0gdGhpcy5sb2FkaW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmRhdGEkID0gdGhpcy5kYXRhU291cmNlU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnN0YXRzJCA9IHRoaXMuZGF0YVN0YXRzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnNlbGVjdGlvbiQgPSB0aGlzLmRhdGFTZWxlY3Rpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMucmVzdWx0TGlzdCQgPSB0aGlzLnJlc3VsdExpc3RTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgY29ubmVjdChfY29sbGVjdGlvblZpZXdlcjogQ29sbGVjdGlvblZpZXdlcik6IE9ic2VydmFibGU8b2JqZWN0W10+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhJDtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoX2NvbGxlY3Rpb25WaWV3ZXI6IENvbGxlY3Rpb25WaWV3ZXIpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5kYXRhU291cmNlU3ViamVjdC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZGF0YVN0YXRzU3ViamVjdC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZGF0YVNlbGVjdGlvblN1YmplY3QuY29tcGxldGUoKTtcbiAgfVxuXG4gIGxvYWREYXRhKHtcbiAgICByb3dzLFxuICAgIGNvbHVtbnMsXG4gICAgcGFnaW5hdGlvbixcbiAgICBzZWFyY2hUZXh0LFxuICAgIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2ssXG4gICAgc2VsZWN0YWJsZSxcbiAgICBzZWxlY3Rpb25QcmltYXJ5S2V5LFxuICAgIGluZmluaXRlU2Nyb2xsLFxuICAgIHJlbG9hZCA9IGZhbHNlXG4gIH0pIHtcbiAgICBjb25zdCBjbGllbnRTaWRlRGF0YSQgPSB0b09ic2VydmFibGUocm93cykucGlwZShcbiAgICAgIG1hcChpbml0aWFsRGF0YSA9PiB7XG4gICAgICAgIGxldCBmaWx0ZXJlZFNpemUgPSAwO1xuICAgICAgICBsZXQgZmlsdGVyZWREYXRhSWRzID0gW107XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWREYXRhID0gZmxvdyhcbiAgICAgICAgICBkYXRhID0+IHRoaXMuZG9DbGllbnRTaWRlU2VhcmNoKHsgZGF0YSwgY29sdW1ucywgc2VhcmNoVGV4dCB9KSxcbiAgICAgICAgICBkYXRhID0+IHRoaXMuZG9DbGllbnRTaWRlRmlsdGVyaW5nKHsgZGF0YSwgY29sdW1ucyB9KSxcbiAgICAgICAgICBkYXRhID0+IHRoaXMuZG9DbGllbnRTaWRlU29ydGluZyh7IGRhdGEsIGNvbHVtbnMgfSksXG4gICAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgICBmaWx0ZXJlZFNpemUgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YUlkcyA9IHNlbGVjdGFibGVcbiAgICAgICAgICAgICAgPyBkYXRhLm1hcChpdGVtID0+IGl0ZW1bc2VsZWN0aW9uUHJpbWFyeUtleV0pXG4gICAgICAgICAgICAgIDogZmlsdGVyZWREYXRhSWRzO1xuXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRhdGEgPT4gdGhpcy5kb0NsaWVudFNpZGVQYWdpbmF0aW9uKHsgZGF0YSwgcGFnaW5hdGlvbiB9KVxuICAgICAgICApKGluaXRpYWxEYXRhKTtcblxuICAgICAgICB0aGlzLmRhdGFTdGF0c1N1YmplY3QubmV4dCh7XG4gICAgICAgICAgc2l6ZTogaW5pdGlhbERhdGEubGVuZ3RoLFxuICAgICAgICAgIGZpbHRlcmVkU2l6ZSxcbiAgICAgICAgICBjdXJyZW50UGFnZTogcGFnaW5hdGlvbi5jdXJyZW50UGFnZSxcbiAgICAgICAgICBjdXJyZW50UGFnZVNpemU6IHRyYW5zZm9ybWVkRGF0YS5sZW5ndGgsXG4gICAgICAgICAgZmlyc3RQYWdlU2l6ZTogcGFnaW5hdGlvbi5wYWdlU2l6ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kYXRhU2VsZWN0aW9uU3ViamVjdC5uZXh0KHsgZmlsdGVyZWREYXRhSWRzIH0pO1xuXG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZERhdGE7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBzZXJ2ZXJTaWRlRGF0YSQgPSBkZWZlcigoKSA9PlxuICAgICAgdG9PYnNlcnZhYmxlKFxuICAgICAgICBzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrKHtcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIHNlYXJjaFRleHQsXG4gICAgICAgICAgcGFnaW5hdGlvbixcbiAgICAgICAgICBzZWxlY3Rpb246IHsgZW5hYmxlZDogc2VsZWN0YWJsZSwgcHJpbWFyeUtleTogc2VsZWN0aW9uUHJpbWFyeUtleSB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKS5waXBlKFxuICAgICAgbWFwKChyZXN1bHQ6IFNlcnZlclNpZGVEYXRhUmVzdWx0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgcGFnaW5nLCBzaXplLCBmaWx0ZXJlZFNpemUsIGZpbHRlcmVkRGF0YUlkcyB9ID0gcmVzdWx0O1xuICAgICAgICB0aGlzLmRhdGFTdGF0c1N1YmplY3QubmV4dCh7XG4gICAgICAgICAgc2l6ZSxcbiAgICAgICAgICBmaWx0ZXJlZFNpemUsXG4gICAgICAgICAgY3VycmVudFBhZ2U6IHBhZ2luZy5jdXJyZW50UGFnZSxcbiAgICAgICAgICBjdXJyZW50UGFnZVNpemU6IGRhdGEubGVuZ3RoLFxuICAgICAgICAgIG5leHRQYWdlOiBwYWdpbmcubmV4dFBhZ2UsXG4gICAgICAgICAgZmlyc3RQYWdlU2l6ZTogcGFnaW5nLnBhZ2VTaXplXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRhdGFTZWxlY3Rpb25TdWJqZWN0Lm5leHQoeyBmaWx0ZXJlZERhdGFJZHM6IGZpbHRlcmVkRGF0YUlkcyB8fCBbXSB9KTtcbiAgICAgICAgdGhpcy5yZXN1bHRMaXN0U3ViamVjdC5uZXh0KHJlc3VsdCk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBkYXRhJCA9IHR5cGVvZiBzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gc2VydmVyU2lkZURhdGEkIDogY2xpZW50U2lkZURhdGEkO1xuXG4gICAgb2YoW10pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiBkYXRhJCksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGF0YVN0YXRzU3ViamVjdC5uZXh0KHtcbiAgICAgICAgICAgIHNpemU6IDAsXG4gICAgICAgICAgICBmaWx0ZXJlZFNpemU6IDAsXG4gICAgICAgICAgICBjdXJyZW50UGFnZTogMCxcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlU2l6ZTogMCxcbiAgICAgICAgICAgIGZpcnN0UGFnZVNpemU6IDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmRhdGFTZWxlY3Rpb25TdWJqZWN0Lm5leHQoeyBmaWx0ZXJlZERhdGFJZHM6IFtdIH0pO1xuICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgIH0pLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID1cbiAgICAgICAgICBpbmZpbml0ZVNjcm9sbCAmJiAhcmVsb2FkID8gWy4uLnRoaXMuZGF0YVNvdXJjZVN1YmplY3QudmFsdWUsIC4uLnJlc3VsdF0gOiByZXN1bHQ7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZVN1YmplY3QubmV4dChkYXRhKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcmVzb2x2ZVZhbHVlKHgsIHBhdGgpIHtcbiAgICByZXR1cm4gZ2V0KHgsIHBhdGgpO1xuICB9XG5cbiAgcmVzb2x2ZUZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHggPT09ICdmdW5jdGlvbicgPyB4KCkgOiB4O1xuICB9XG5cbiAgbm9ybWFsaXplTmlsKHgpIHtcbiAgICByZXR1cm4gaXNOaWwoeCkgPyAnJyA6IHg7XG4gIH1cblxuICBwcml2YXRlIGRvQ2xpZW50U2lkZUZpbHRlcmluZyh7IGRhdGEsIGNvbHVtbnMgfSkge1xuICAgIHJldHVybiBjb2x1bW5zLnJlZHVjZSgocmVzdWx0LCBjb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IHsgZmlsdGVyUHJlZGljYXRlIH0gPSBjb2x1bW47XG5cbiAgICAgIGlmICh0eXBlb2YgZmlsdGVyUHJlZGljYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdGhpcy5kb0NsaWVudFNpZGVTZWFyY2goe1xuICAgICAgICAgIGRhdGE6IHJlc3VsdCxcbiAgICAgICAgICBjb2x1bW5zOiBbY29sdW1uXSxcbiAgICAgICAgICBzZWFyY2hUZXh0OiBmaWx0ZXJQcmVkaWNhdGVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZmlsdGVyUHJlZGljYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQuZmlsdGVyKGl0ZW0gPT4gZmlsdGVyUHJlZGljYXRlKGl0ZW0sIGNvbHVtbi5wYXRoKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwgZGF0YSk7XG4gIH1cblxuICBwcml2YXRlIGRvQ2xpZW50U2lkZVNlYXJjaCh7IGRhdGEsIGNvbHVtbnMsIHNlYXJjaFRleHQgfSkge1xuICAgIGNvbnN0IHByb3BQYXRocyA9IGNvbHVtbnMubWFwKCh7IHBhdGggfSkgPT4gcGF0aCkuZmlsdGVyKGNvbHVtbiA9PiAhaXNOaWwoY29sdW1uKSk7XG5cbiAgICBjb25zdCByZWdleFNlYXJjaCA9IHRoaXMuY3JlYXRlUmVnZXhTZWFyY2goc2VhcmNoVGV4dCk7XG5cbiAgICByZXR1cm4gZGF0YS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBjb25zdCBpdGVtV2l0aFJlc29sdmVkVmFsdWVzID0gZmxvdyhcbiAgICAgICAgeCA9PiBwcm9wUGF0aHMubWFwKHByb3BQYXRoID0+IGdldCh4LCBwcm9wUGF0aCkpLFxuICAgICAgICB4ID0+IG1hcFZhbHVlcyh4LCB0aGlzLnJlc29sdmVGdW5jdGlvbiksXG4gICAgICAgIHggPT4gb21pdEJ5KHgsIGlzTmlsKVxuICAgICAgKShpdGVtKTtcblxuICAgICAgY29uc3QgY2VsbFZhbHVlcyA9IE9iamVjdC52YWx1ZXMoaXRlbVdpdGhSZXNvbHZlZFZhbHVlcyk7XG5cbiAgICAgIHJldHVybiBjZWxsVmFsdWVzLnNvbWUoY2VsbFZhbHVlID0+IHJlZ2V4U2VhcmNoLnRlc3QoY2VsbFZhbHVlLnRvU3RyaW5nKCkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZG9DbGllbnRTaWRlU29ydGluZyh7IGRhdGEsIGNvbHVtbnMgfSkge1xuICAgIGNvbnN0IGFjdGl2ZXM6IENvbHVtbltdID0gY29sdW1ucy5maWx0ZXIoKHsgc29ydE9yZGVyIH06IENvbHVtbikgPT4gISFzb3J0T3JkZXIpO1xuXG4gICAgY29uc3Qgc29ydGluZ1N0YXRlID0ge1xuICAgICAgaXRlcmF0ZWVzOiBhY3RpdmVzLm1hcCgoeyBwYXRoIH0pID0+IHBhdGgpLm1hcChwYXRoID0+IGl0ZW0gPT4gZ2V0KGl0ZW0sIHBhdGgpID8/ICcnKSxcbiAgICAgIG9yZGVyczogYWN0aXZlcy5tYXAoKHsgc29ydE9yZGVyIH0pID0+IHNvcnRPcmRlcilcbiAgICB9O1xuXG4gICAgcmV0dXJuIG9yZGVyQnkoZGF0YSwgc29ydGluZ1N0YXRlLml0ZXJhdGVlcywgc29ydGluZ1N0YXRlLm9yZGVycyk7XG4gIH1cblxuICBwcml2YXRlIGRvQ2xpZW50U2lkZVBhZ2luYXRpb24oeyBkYXRhLCBwYWdpbmF0aW9uIH0pIHtcbiAgICByZXR1cm4gcGFnaW5hdGlvblxuICAgICAgPyBnZXQoY2h1bmsoZGF0YSwgcGFnaW5hdGlvbi5wYWdlU2l6ZSksIHBhZ2luYXRpb24uY3VycmVudFBhZ2UgLSAxLCBbXSlcbiAgICAgIDogZGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUmVnZXhTZWFyY2goZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gUmVnRXhwKGVzY2FwZVJlZ0V4cFBhdHRlcm4oZmlsdGVyVmFsdWUpLCAnaScpO1xuICB9XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBzdHJpbmcgcGF0dGVybiBSZWdleCBwYXR0ZXJuLlxuICogQHJldHVybiBzdHJpbmcgVGhlIGVzY2FwZWQgcmVnZXguXG4gKiBAc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNTYxNzExLzIwMTM4OTFcbiAqL1xuZnVuY3Rpb24gZXNjYXBlUmVnRXhwUGF0dGVybihwYXR0ZXJuID0gJycpIHtcbiAgcmV0dXJuIHBhdHRlcm4ucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcbn1cbiJdfQ==