UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

153 lines • 25.2 kB
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==