UNPKG

ms-data-grid

Version:

A powerful, customizable Angular data grid component with advanced features like sorting, filtering, pagination, column pinning, and taskbar actions. Perfect for enterprise applications.

207 lines 28.8 kB
import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; export class CommonService { constructor() { this.activeFilteredColumns = []; } gethasVisibleColumns(columns) { const checkVisible = (columns) => { return columns.some((col) => { if (col?.is_visible) return true; if (col?.children?.length) { return checkVisible(col.children); } return false; }); }; return checkVisible(columns); } gethasInVisibleColumns(columns) { const checkVisible = (columns) => { return columns.some((col) => { if (!col?.is_visible) return true; if (col?.children?.length) { return checkVisible(col.children); } return false; }); }; return checkVisible(columns); } getTotalColumnsLength(columns) { let count = 0; columns.forEach(col => { if (col.children && Array.isArray(col.children) && col.children.length) { count += col.children.length; // count children instead of parent } else { count += 1; // count parent directly } }); return count; } gethasRightPinnedColumns(columns) { const checkPinnedRight = (columns) => { return columns.some((col) => { if (col?.pinned === 'right' && col?.is_visible) return true; if (col?.children?.length) { return checkPinnedRight(col.children); } return false; }); }; return checkPinnedRight(columns); } gethasLeftPinnedColumns(columns) { const checkPinnedRight = (columns) => { return columns.some((col) => { if (col?.pinned === 'left' && col?.is_visible) return true; if (col?.children?.length) { return checkPinnedRight(col.children); } return false; }); }; return checkPinnedRight(columns); } getExpandedRowCount(data) { let groupCount = 0; let rowCount = 0; data.forEach(group => { if (group?.isGroup) { groupCount++; if (group?.isExpand && Array.isArray(group?.children)) { group.children.forEach((child) => { if (child.isGroup) { if (child.isExpand && Array.isArray(child.children)) { rowCount += child.children.length; } } else { rowCount++; } }); } } }); if (groupCount === 0) { return data.length; } return groupCount + rowCount; } getFiltersFromColumns(columns, filtersConfig) { const result = []; const checkColumn = (col) => { const hasFirstValue = col.query?.first_value != null && col.query?.first_value !== "" && filtersConfig.some((ele) => ele.field == col.field); const hasIds = Array.isArray(col.query?._ids) && col.query._ids.length > 0 && filtersConfig.some((ele) => ele.field == col.field); if (hasFirstValue || hasIds) { result.push({ search: col.search ?? "", field: col.field, type: col.type, _ids: col.type == 'dropdown' ? col.query?._ids : [], query: col.type == 'dropdown' ? null : (col?.query?.first_value ? col?.query : null) }); } if (Array.isArray(col.children) && col.children.length > 0) { col.children.forEach(checkColumn); } }; columns.forEach(checkColumn); return result; } async applyFiltersToColumns(columns, filters) { debugger; for (const col of columns) { if (!col.query) { col.query = { first_value: null, second_value: null, first_condition: col.type !== 'date' ? 'contain' : 'equal', second_condition: col.type !== 'date' ? 'contain' : 'equal', condition: 'none', _ids: [] }; } const filter = filters.find(f => f.field === col.field); if (filter) { if (col.type === 'dropdown') { col.filterValue = filter._ids ?? []; col.search = filter.search ?? ''; col.query._ids = filter._ids ?? []; } else { col.filterValue = filter.search ?? null; col.search = filter.search ?? ''; col.query.first_value = filter.query?.first_value ?? null; col.query.second_value = filter.query?.second_value ?? null; col.query.first_condition = filter.query?.first_condition ?? filter.type !== 'date' ? 'contain' : 'equal'; col.query.second_condition = filter.query?.second_condition ?? filter.type !== 'date' ? 'contain' : 'equal'; col.query.condition = filter.query?.condition ?? 'none'; } } if (Array.isArray(col.children) && col.children.length > 0) { col.children = await this.applyFiltersToColumns(col.children, filters); } } return columns; } updateActiveFilteredColumns(columns) { const collectFiltered = (cols) => { let result = []; for (let i = 0; i < cols.length; i++) { const col = cols[i]; if (col.children && col.children.length > 0) { result = result.concat(collectFiltered(col.children)); } if (col.query) { const hasDropdownFilter = Array.isArray(col.query._ids) && col.query._ids.length > 0; const hasValueFilter = (col.query.first_value && col.query.first_value !== '') || (col.query.second_value && col.query.second_value !== ''); if (hasDropdownFilter || hasValueFilter) { result.push(col); } } } return result; }; this.activeFilteredColumns = [...collectFiltered(columns)]; return this.activeFilteredColumns; } hasFieldChanged(current, original, type) { switch (type) { case 'number': return Number(current) !== Number(original); case 'string': return String(current || '') !== String(original || ''); case 'dropdown': if (typeof current === 'object' && typeof original === 'object') { return current?.id !== original?.id || current?.value !== original?.value; } return current !== original; case 'boolean': return Boolean(current) !== Boolean(original); case 'date': const currentDate = new Date(current).getTime(); const originalDate = new Date(original).getTime(); return isNaN(currentDate) || isNaN(originalDate) ? current !== original : currentDate !== originalDate; default: return JSON.stringify(current) !== JSON.stringify(original); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CommonService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CommonService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CommonService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return []; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhLWdyaWQvc3JjL2xpYi9zZXJ2aWNlcy9jb21tb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8sYUFBYTtJQUV4QjtRQXNLRiwwQkFBcUIsR0FBVSxFQUFFLENBQUM7SUF0S2hCLENBQUM7SUFDakIsb0JBQW9CLENBQUMsT0FBYztRQUNqQyxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQWMsRUFBVyxFQUFFO1lBQy9DLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUMxQixJQUFJLEdBQUcsRUFBRSxVQUFVO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUNqQyxJQUFJLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFO29CQUN6QixPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ25DO2dCQUNELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFDRixPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsc0JBQXNCLENBQUMsT0FBYztRQUNuQyxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQWMsRUFBVyxFQUFFO1lBQy9DLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUMxQixJQUFJLENBQUMsR0FBRyxFQUFFLFVBQVU7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQ2xDLElBQUksR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUU7b0JBQ3pCLE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDbkM7Z0JBQ0Qs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QUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNoRCxNQUFNLFlBQVksR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbEQsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQztvQkFDOUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxRQUFRO29CQUN0QixDQUFDLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQztZQUVuQztnQkFDRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMvRDtJQUNILENBQUM7K0dBbk9VLGFBQWE7bUhBQWIsYUFBYSxjQUZaLE1BQU07OzRGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tbW9uU2VydmljZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcbiAgZ2V0aGFzVmlzaWJsZUNvbHVtbnMoY29sdW1uczogYW55W10pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNoZWNrVmlzaWJsZSA9IChjb2x1bW5zOiBhbnlbXSk6IGJvb2xlYW4gPT4ge1xyXG4gICAgICByZXR1cm4gY29sdW1ucy5zb21lKChjb2wpID0+IHtcclxuICAgICAgICBpZiAoY29sPy5pc192aXNpYmxlKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAoY29sPy5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICByZXR1cm4gY2hlY2tWaXNpYmxlKGNvbC5jaGlsZHJlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGNoZWNrVmlzaWJsZShjb2x1bW5zKTtcclxuICB9XHJcblxyXG4gIGdldGhhc0luVmlzaWJsZUNvbHVtbnMoY29sdW1uczogYW55W10pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNoZWNrVmlzaWJsZSA9IChjb2x1bW5zOiBhbnlbXSk6IGJvb2xlYW4gPT4ge1xyXG4gICAgICByZXR1cm4gY29sdW1ucy5zb21lKChjb2wpID0+IHtcclxuICAgICAgICBpZiAoIWNvbD8uaXNfdmlzaWJsZSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKGNvbD8uY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcmV0dXJuIGNoZWNrVmlzaWJsZShjb2wuY2hpbGRyZW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBjaGVja1Zpc2libGUoY29sdW1ucyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0VG90YWxDb2x1bW5zTGVuZ3RoKGNvbHVtbnM6IGFueVtdKTogbnVtYmVyIHtcclxuICAgIGxldCBjb3VudCA9IDA7XHJcblxyXG4gICAgY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGlmIChjb2wuY2hpbGRyZW4gJiYgQXJyYXkuaXNBcnJheShjb2wuY2hpbGRyZW4pICYmIGNvbC5jaGlsZHJlbi5sZW5ndGgpIHtcclxuICAgICAgICBjb3VudCArPSBjb2wuY2hpbGRyZW4ubGVuZ3RoOyAvLyBjb3VudCBjaGlsZHJlbiBpbnN0ZWFkIG9mIHBhcmVudFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvdW50ICs9IDE7IC8vIGNvdW50IHBhcmVudCBkaXJlY3RseVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gY291bnQ7XHJcbiAgfVxyXG5cclxuICBnZXRoYXNSaWdodFBpbm5lZENvbHVtbnMoY29sdW1uczogYW55W10pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNoZWNrUGlubmVkUmlnaHQgPSAoY29sdW1uczogYW55W10pOiBib29sZWFuID0+IHtcclxuICAgICAgcmV0dXJuIGNvbHVtbnMuc29tZSgoY29sKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbD8ucGlubmVkID09PSAncmlnaHQnICYmIGNvbD8uaXNfdmlzaWJsZSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKGNvbD8uY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcmV0dXJuIGNoZWNrUGlubmVkUmlnaHQoY29sLmNoaWxkcmVuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gY2hlY2tQaW5uZWRSaWdodChjb2x1bW5zKTtcclxuICB9XHJcblxyXG4gIGdldGhhc0xlZnRQaW5uZWRDb2x1bW5zKGNvbHVtbnM6IGFueVtdKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBjaGVja1Bpbm5lZFJpZ2h0ID0gKGNvbHVtbnM6IGFueVtdKTogYm9vbGVhbiA9PiB7XHJcbiAgICAgIHJldHVybiBjb2x1bW5zLnNvbWUoKGNvbCkgPT4ge1xyXG4gICAgICAgIGlmIChjb2w/LnBpbm5lZCA9PT0gJ2xlZnQnICYmIGNvbD8uaXNfdmlzaWJsZSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKGNvbD8uY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcmV0dXJuIGNoZWNrUGlubmVkUmlnaHQoY29sLmNoaWxkcmVuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gY2hlY2tQaW5uZWRSaWdodChjb2x1bW5zKTtcclxuICB9XHJcblxyXG5cclxuICBnZXRFeHBhbmRlZFJvd0NvdW50KGRhdGE6IGFueVtdKTogbnVtYmVyIHtcclxuICAgIGxldCBncm91cENvdW50ID0gMDtcclxuICAgIGxldCByb3dDb3VudCA9IDA7XHJcblxyXG4gICAgZGF0YS5mb3JFYWNoKGdyb3VwID0+IHtcclxuICAgICAgaWYgKGdyb3VwPy5pc0dyb3VwKSB7XHJcbiAgICAgICAgZ3JvdXBDb3VudCsrO1xyXG5cclxuICAgICAgICBpZiAoZ3JvdXA/LmlzRXhwYW5kICYmIEFycmF5LmlzQXJyYXkoZ3JvdXA/LmNoaWxkcmVuKSkge1xyXG4gICAgICAgICAgZ3JvdXAuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY2hpbGQuaXNHcm91cCkge1xyXG4gICAgICAgICAgICAgIGlmIChjaGlsZC5pc0V4cGFuZCAmJiBBcnJheS5pc0FycmF5KGNoaWxkLmNoaWxkcmVuKSkge1xyXG4gICAgICAgICAgICAgICAgcm93Q291bnQgKz0gY2hpbGQuY2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByb3dDb3VudCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChncm91cENvdW50ID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBkYXRhLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZ3JvdXBDb3VudCArIHJvd0NvdW50O1xyXG4gIH1cclxuXHJcblxyXG5nZXRGaWx0ZXJzRnJvbUNvbHVtbnMoY29sdW1uczogYW55W10sIGZpbHRlcnNDb25maWc6YW55IFtdKTogYW55W10ge1xyXG4gIGNvbnN0IHJlc3VsdDogYW55W10gPSBbXTtcclxuIFxyXG4gIGNvbnN0IGNoZWNrQ29sdW1uID0gKGNvbDogYW55KSA9PiB7XHJcbiAgICBjb25zdCBoYXNGaXJzdFZhbHVlID0gY29sLnF1ZXJ5Py5maXJzdF92YWx1ZSAhPSBudWxsICYmIGNvbC5xdWVyeT8uZmlyc3RfdmFsdWUgIT09IFwiXCIgJiYgZmlsdGVyc0NvbmZpZy5zb21lKChlbGUpPT4gZWxlLmZpZWxkID09IGNvbC5maWVsZCk7XHJcbiAgICBjb25zdCBoYXNJZHMgPSBBcnJheS5pc0FycmF5KGNvbC5xdWVyeT8uX2lkcykgJiYgY29sLnF1ZXJ5Ll9pZHMubGVuZ3RoID4gMCAmJiBmaWx0ZXJzQ29uZmlnLnNvbWUoKGVsZSk9PiBlbGUuZmllbGQgPT0gY29sLmZpZWxkKTtcclxuICAgIGlmIChoYXNGaXJzdFZhbHVlIHx8IGhhc0lkcykge1xyXG4gICAgICByZXN1bHQucHVzaCh7XHJcbiAgICAgICAgc2VhcmNoOiBjb2wuc2VhcmNoID8/IFwiXCIsXHJcbiAgICAgICAgZmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICB0eXBlOiBjb2wudHlwZSxcclxuICAgICAgICBfaWRzOiBjb2wudHlwZSA9PSAnZHJvcGRvd24nPyBjb2wucXVlcnk/Ll9pZHM6IFtdLFxyXG4gICAgICAgIHF1ZXJ5OiBjb2wudHlwZSA9PSAnZHJvcGRvd24nPyBudWxsIDogKGNvbD8ucXVlcnk/LmZpcnN0X3ZhbHVlID8gY29sPy5xdWVyeSA6IG51bGwpXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb2wuY2hpbGRyZW4pICYmIGNvbC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbC5jaGlsZHJlbi5mb3JFYWNoKGNoZWNrQ29sdW1uKTtcclxuICAgIH1cclxuICB9O1xyXG4gIGNvbHVtbnMuZm9yRWFjaChjaGVja0NvbHVtbik7XHJcbiBcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5hc3luYyBhcHBseUZpbHRlcnNUb0NvbHVtbnMoY29sdW1uczogYW55W10sIGZpbHRlcnM6IGFueVtdKTogUHJvbWlzZTxhbnlbXT4ge1xyXG4gIGRlYnVnZ2VyXHJcbiAgZm9yIChjb25zdCBjb2wgb2YgY29sdW1ucykge1xyXG4gICAgaWYgKCFjb2wucXVlcnkpIHtcclxuICAgICAgY29sLnF1ZXJ5ID0ge1xyXG4gICAgICAgIGZpcnN0X3ZhbHVlOiBudWxsLFxyXG4gICAgICAgIHNlY29uZF92YWx1ZTogbnVsbCxcclxuICAgICAgICBmaXJzdF9jb25kaXRpb246IGNvbC50eXBlICE9PSAnZGF0ZSc/ICdjb250YWluJzogJ2VxdWFsJyxcclxuICAgICAgICBzZWNvbmRfY29uZGl0aW9uOiBjb2wudHlwZSAhPT0gJ2RhdGUnPyAnY29udGFpbic6ICdlcXVhbCcsXHJcbiAgICAgICAgY29uZGl0aW9uOiAnbm9uZScsXHJcbiAgICAgICAgX2lkczogW11cclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaWx0ZXIgPSBmaWx0ZXJzLmZpbmQoZiA9PiBmLmZpZWxkID09PSBjb2wuZmllbGQpO1xyXG5cclxuICAgIGlmIChmaWx0ZXIpIHtcclxuICAgICAgaWYgKGNvbC50eXBlID09PSAnZHJvcGRvd24nKSB7XHJcbiAgICAgICAgY29sLmZpbHRlclZhbHVlID0gZmlsdGVyLl9pZHMgPz8gW107XHJcbiAgICAgICAgY29sLnNlYXJjaCA9IGZpbHRlci5zZWFyY2ggPz8gJyc7XHJcbiAgICAgICAgY29sLnF1ZXJ5Ll9pZHMgPSBmaWx0ZXIuX2lkcyA/PyBbXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb2wuZmlsdGVyVmFsdWUgPSBmaWx0ZXIuc2VhcmNoID8/IG51bGw7XHJcbiAgICAgICAgY29sLnNlYXJjaCA9IGZpbHRlci5zZWFyY2ggPz8gJyc7XHJcbiAgICAgICAgY29sLnF1ZXJ5LmZpcnN0X3ZhbHVlID0gZmlsdGVyLnF1ZXJ5Py5maXJzdF92YWx1ZSA/PyBudWxsO1xyXG4gICAgICAgIGNvbC5xdWVyeS5zZWNvbmRfdmFsdWUgPSBmaWx0ZXIucXVlcnk/LnNlY29uZF92YWx1ZSA/PyBudWxsO1xyXG4gICAgICAgIGNvbC5xdWVyeS5maXJzdF9jb25kaXRpb24gPSBmaWx0ZXIucXVlcnk/LmZpcnN0X2NvbmRpdGlvbiA/PyBmaWx0ZXIudHlwZSAhPT0gJ2RhdGUnPyAnY29udGFpbic6ICdlcXVhbCc7XHJcbiAgICAgICAgY29sLnF1ZXJ5LnNlY29uZF9jb25kaXRpb24gPSBmaWx0ZXIucXVlcnk/LnNlY29uZF9jb25kaXRpb24gPz8gZmlsdGVyLnR5cGUgIT09ICdkYXRlJz8gJ2NvbnRhaW4nOiAnZXF1YWwnO1xyXG4gICAgICAgIGNvbC5xdWVyeS5jb25kaXRpb24gPSBmaWx0ZXIucXVlcnk/LmNvbmRpdGlvbiA/PyAnbm9uZSc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbC5jaGlsZHJlbikgJiYgY29sLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29sLmNoaWxkcmVuID0gYXdhaXQgdGhpcy5hcHBseUZpbHRlcnNUb0NvbHVtbnMoY29sLmNoaWxkcmVuLCBmaWx0ZXJzKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGNvbHVtbnM7XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5hY3RpdmVGaWx0ZXJlZENvbHVtbnM6IGFueVtdID0gW107XHJcbnVwZGF0ZUFjdGl2ZUZpbHRlcmVkQ29sdW1ucyhjb2x1bW5zOiBhbnlbXSk6IGFueVtdIHtcclxuICBjb25zdCBjb2xsZWN0RmlsdGVyZWQgPSAoY29sczogYW55W10pOiBhbnlbXSA9PiB7XHJcbiAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjb2wgPSBjb2xzW2ldO1xyXG4gICAgICBpZiAoY29sLmNoaWxkcmVuICYmIGNvbC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChjb2xsZWN0RmlsdGVyZWQoY29sLmNoaWxkcmVuKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb2wucXVlcnkpIHtcclxuICAgICAgICBjb25zdCBoYXNEcm9wZG93bkZpbHRlciA9XHJcbiAgICAgICAgICBBcnJheS5pc0FycmF5KGNvbC5xdWVyeS5faWRzKSAmJiBjb2wucXVlcnkuX2lkcy5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICBjb25zdCBoYXNWYWx1ZUZpbHRlciA9XHJcbiAgICAgICAgICAoY29sLnF1ZXJ5LmZpcnN0X3ZhbHVlICYmIGNvbC5xdWVyeS5maXJzdF92YWx1ZSAhPT0gJycpIHx8XHJcbiAgICAgICAgICAoY29sLnF1ZXJ5LnNlY29uZF92YWx1ZSAmJiBjb2wucXVlcnkuc2Vjb25kX3ZhbHVlICE9PSAnJyk7XHJcblxyXG4gICAgICAgIGlmIChoYXNEcm9wZG93bkZpbHRlciB8fCBoYXNWYWx1ZUZpbHRlcikge1xyXG4gICAgICAgICAgcmVzdWx0LnB1c2goY29sKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfTtcclxuICB0aGlzLmFjdGl2ZUZpbHRlcmVkQ29sdW1ucyA9IFsuLi5jb2xsZWN0RmlsdGVyZWQoY29sdW1ucyldO1xyXG4gIHJldHVybiB0aGlzLmFjdGl2ZUZpbHRlcmVkQ29sdW1ucztcclxufVxyXG5cclxuXHJcblxyXG5oYXNGaWVsZENoYW5nZWQoY3VycmVudDogYW55LCBvcmlnaW5hbDogYW55LCB0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlICdudW1iZXInOlxyXG4gICAgICAgIHJldHVybiBOdW1iZXIoY3VycmVudCkgIT09IE51bWJlcihvcmlnaW5hbCk7XHJcblxyXG4gICAgICBjYXNlICdzdHJpbmcnOlxyXG4gICAgICAgIHJldHVybiBTdHJpbmcoY3VycmVudCB8fCAnJykgIT09IFN0cmluZyhvcmlnaW5hbCB8fCAnJyk7XHJcblxyXG4gICAgICBjYXNlICdkcm9wZG93bic6XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50ID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb3JpZ2luYWwgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICByZXR1cm4gY3VycmVudD8uaWQgIT09IG9yaWdpbmFsPy5pZCB8fCBjdXJyZW50Py52YWx1ZSAhPT0gb3JpZ2luYWw/LnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY3VycmVudCAhPT0gb3JpZ2luYWw7XHJcblxyXG4gICAgICBjYXNlICdib29sZWFuJzpcclxuICAgICAgICByZXR1cm4gQm9vbGVhbihjdXJyZW50KSAhPT0gQm9vbGVhbihvcmlnaW5hbCk7XHJcblxyXG4gICAgICBjYXNlICdkYXRlJzpcclxuICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnQpLmdldFRpbWUoKTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbERhdGUgPSBuZXcgRGF0ZShvcmlnaW5hbCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIHJldHVybiBpc05hTihjdXJyZW50RGF0ZSkgfHwgaXNOYU4ob3JpZ2luYWxEYXRlKVxyXG4gICAgICAgICAgPyBjdXJyZW50ICE9PSBvcmlnaW5hbFxyXG4gICAgICAgICAgOiBjdXJyZW50RGF0ZSAhPT0gb3JpZ2luYWxEYXRlO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY3VycmVudCkgIT09IEpTT04uc3RyaW5naWZ5KG9yaWdpbmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxufVxyXG5cclxuXHJcblxyXG5cclxuIl19