dynamic-mat-table
Version:
dynamic-mat-table is an Angular component for presenting large and complex data with a lightning fast performance (at least 10x faster) and excellent level of control over the presentation.
134 lines • 20.2 kB
JavaScript
import { combineLatest, merge, Observable, of, ReplaySubject, Subscription } from 'rxjs';
import { map } from 'rxjs/operators';
import { MatTableDataSource } from '@angular/material/table';
import { titleCase } from '../utilizes/utilizes';
export class TableVirtualScrollDataSource extends MatTableDataSource {
constructor() {
super(...arguments);
this.filterMap = {};
this.columns = [];
}
get allData() {
return this.data;
}
toTranslate() {
const tranList = [];
const keys = Object.keys(this.filterMap);
for (const k of keys) {
let fieldTotalTran = '';
for (const f of this.filterMap[k]) {
fieldTotalTran += f.toPrint();
}
if (fieldTotalTran !== '') {
tranList.push({ key: titleCase(k), value: fieldTotalTran });
}
}
return tranList;
}
getFilter(fieldName) {
return this.filterMap[fieldName];
}
setFilter(fieldName, filters) {
this.filterMap[fieldName] = filters;
return new Observable(subscriber => {
setTimeout(() => {
this.refreshFilterPredicate();
subscriber.next();
subscriber.complete();
}, 200); // for show progress
});
}
clearFilter(fieldName = null) {
if (fieldName != null) {
delete this.filterMap[fieldName];
}
else {
this.filterMap = {};
}
this.refreshFilterPredicate();
}
clearData() {
this.data = [];
}
refreshFilterPredicate() {
let conditionsString = '';
Object.keys(this.filterMap).forEach(key => {
let fieldCondition = '';
this.filterMap[key].forEach((fieldFilter, row, array) => {
if (row < array.length - 1) {
fieldCondition += fieldFilter.toString(key) + (fieldFilter.type === 'and' ? ' && ' : ' || ');
}
else {
fieldCondition += fieldFilter.toString(key);
}
});
if (fieldCondition !== '') {
conditionsString += ` ${conditionsString === '' ? '' : ' && '} ( ${fieldCondition} )`;
}
});
if (conditionsString !== '') {
const filterFunction = new Function('_a$', 'return ' + conditionsString);
this.filterPredicate = (data, filter) => filterFunction(data);
}
else {
this.filterPredicate = (data, filter) => true;
}
this.filter = conditionsString;
}
// When client paging active use for retrieve paging data
pagingData(data) {
const p = this._paginator;
if (p && p !== null) {
const end = (p.pageIndex + 1) * p.pageSize;
const start = p.pageIndex * p.pageSize;
return data.slice(start, end);
}
return data;
}
_updateChangeSubscription() {
var _a;
this.initStreams();
const sort = this._sort;
const paginator = this._paginator;
const internalPageChanges = this._internalPageChanges;
const filter = this._filter;
const renderData = this._renderData;
const dataStream = this._data;
const sortChange = sort ?
merge(sort.sortChange, sort.initialized) : of(null);
const pageChange = paginator ?
merge(paginator.page, internalPageChanges, paginator.initialized) : of(null);
// First Filter
const filteredData = combineLatest([dataStream, filter]).pipe(map(([data]) => this._filterData(data)));
// Second Order
const orderedData = combineLatest([filteredData, sortChange]).pipe(map(([data, sortColumn]) => {
const sc = sortColumn;
if (!sc) {
return data;
}
else if (sc.active !== '') {
const column = this.columns.filter(c => c.name == sc.active)[0];
if (column.sort === 'server-side') {
return data;
}
else if (column.sort === 'client-side') {
return this._orderData(data);
}
}
}));
// Last Paging
const paginatedData = combineLatest([orderedData, pageChange]).pipe(map(([data]) => this.pagingData(data)));
(_a = this._renderChangesSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
this._renderChangesSubscription = new Subscription();
this._renderChangesSubscription.add(paginatedData.subscribe(data => this.dataToRender$.next(data)));
this._renderChangesSubscription.add(this.dataOfRange$.subscribe(data => renderData.next(data)));
}
initStreams() {
if (!this.streamsReady) {
this.dataToRender$ = new ReplaySubject(1);
this.dataOfRange$ = new ReplaySubject(1);
this.streamsReady = true;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9keW5hbWljLW1hdC10YWJsZS9zcmMvbGliL2NvcmVzL3RhYmxlLWRhdGEtc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUIsYUFBYSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBVyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSTdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUtqRCxNQUFNLE9BQU8sNEJBQWlELFNBQVEsa0JBQXFCO0lBQTNGOztRQUlVLGNBQVMsR0FBOEIsRUFBRSxDQUFDO1FBQzNDLFlBQU8sR0FBb0IsRUFBRSxDQUFBO0lBZ0t0QyxDQUFDO0lBL0pDLElBQUksT0FBTztRQUVULE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsV0FBVztRQUVULE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNwQixNQUFNLElBQUksR0FBYSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFDcEI7WUFDRSxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7WUFDeEIsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUNqQztnQkFDRSxjQUFjLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQy9CO1lBQ0QsSUFBSSxjQUFjLEtBQUssRUFBRSxFQUN6QjtnQkFDRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVB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VSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU1RyxNQUFBLElBQUksQ0FBQywwQkFBMEIsMENBQUUsV0FBVyxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRU8sV0FBVztRQUVqQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFDdEI7WUFDRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFNLENBQUMsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxhQUFhLENBQU0sQ0FBQyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIG1lcmdlLCBPYnNlcnZhYmxlLCBvZiwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBNYXRTb3J0LCBTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgQWJzdHJhY3RGaWx0ZXIgfSBmcm9tICcuLi9keW5hbWljLW1hdC10YWJsZS9leHRlbnNpb25zL2ZpbHRlci9jb21wYXJlL2Fic3RyYWN0LWZpbHRlcic7XHJcbmltcG9ydCB7IHRpdGxlQ2FzZSB9IGZyb20gJy4uL3V0aWxpemVzL3V0aWxpemVzJztcclxuaW1wb3J0IHsgSGFzaE1hcCB9IGZyb20gJy4vdHlwZSc7XHJcbmltcG9ydCB7IFRhYmxlRmllbGQgfSBmcm9tICcuLi9tb2RlbHMvdGFibGUtZmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBUYWJsZVJvdyB9IGZyb20gJy4uL21vZGVscy90YWJsZS1yb3cubW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhYmxlVmlydHVhbFNjcm9sbERhdGFTb3VyY2U8VCBleHRlbmRzIFRhYmxlUm93PiBleHRlbmRzIE1hdFRhYmxlRGF0YVNvdXJjZTxUPiB7XHJcbiAgcHVibGljIGRhdGFUb1JlbmRlciQ6IFN1YmplY3Q8VFtdPjtcclxuICBwdWJsaWMgZGF0YU9mUmFuZ2UkOiBTdWJqZWN0PFRbXT47XHJcbiAgcHJpdmF0ZSBzdHJlYW1zUmVhZHk6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBmaWx0ZXJNYXA6IEhhc2hNYXA8QWJzdHJhY3RGaWx0ZXJbXT4gPSB7fTtcclxuICBwdWJsaWMgY29sdW1uczogVGFibGVGaWVsZDxUPltdID0gW11cclxuICBnZXQgYWxsRGF0YSgpOiBUW11cclxuICB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xyXG4gIH1cclxuXHJcbiAgdG9UcmFuc2xhdGUoKTogYW55W11cclxuICB7XHJcbiAgICBjb25zdCB0cmFuTGlzdCA9IFtdO1xyXG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyh0aGlzLmZpbHRlck1hcCk7XHJcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5cylcclxuICAgIHtcclxuICAgICAgbGV0IGZpZWxkVG90YWxUcmFuID0gJyc7XHJcbiAgICAgIGZvciAoY29uc3QgZiBvZiB0aGlzLmZpbHRlck1hcFtrXSlcclxuICAgICAge1xyXG4gICAgICAgIGZpZWxkVG90YWxUcmFuICs9IGYudG9QcmludCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmaWVsZFRvdGFsVHJhbiAhPT0gJycpXHJcbiAgICAgIHtcclxuICAgICAgICB0cmFuTGlzdC5wdXNoKHsga2V5OiB0aXRsZUNhc2UoayksIHZhbHVlOiBmaWVsZFRvdGFsVHJhbiB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRyYW5MaXN0O1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nKTogQWJzdHJhY3RGaWx0ZXJbXVxyXG4gIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlck1hcFtmaWVsZE5hbWVdO1xyXG4gIH1cclxuXHJcbiAgc2V0RmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJzOiBBYnN0cmFjdEZpbHRlcltdKTogT2JzZXJ2YWJsZTxudWxsPlxyXG4gIHtcclxuICAgIHRoaXMuZmlsdGVyTWFwW2ZpZWxkTmFtZV0gPSBmaWx0ZXJzO1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZXIgPT5cclxuICAgIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PlxyXG4gICAgICB7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRmlsdGVyUHJlZGljYXRlKCk7XHJcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XHJcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICB9LCAyMDApOyAvLyBmb3Igc2hvdyBwcm9ncmVzc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbGVhckZpbHRlcihmaWVsZE5hbWU6IHN0cmluZyA9IG51bGwpXHJcbiAge1xyXG4gICAgaWYgKGZpZWxkTmFtZSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBkZWxldGUgdGhpcy5maWx0ZXJNYXBbZmllbGROYW1lXTtcclxuICAgIH0gZWxzZVxyXG4gICAge1xyXG4gICAgICB0aGlzLmZpbHRlck1hcCA9IHt9O1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyUHJlZGljYXRlKCk7XHJcbiAgfVxyXG5cclxuICBjbGVhckRhdGEoKVxyXG4gIHtcclxuICAgIHRoaXMuZGF0YSA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2hGaWx0ZXJQcmVkaWNhdGUoKVxyXG4gIHtcclxuICAgIGxldCBjb25kaXRpb25zU3RyaW5nID0gJyc7XHJcbiAgICBPYmplY3Qua2V5cyh0aGlzLmZpbHRlck1hcCkuZm9yRWFjaChrZXkgPT5cclxuICAgIHtcclxuICAgICAgbGV0IGZpZWxkQ29uZGl0aW9uID0gJyc7XHJcbiAgICAgIHRoaXMuZmlsdGVyTWFwW2tleV0uZm9yRWFjaCgoZmllbGRGaWx0ZXIsIHJvdywgYXJyYXkpID0+XHJcbiAgICAgIHtcclxuICAgICAgICBpZiAocm93IDwgYXJyYXkubGVuZ3RoIC0gMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZENvbmRpdGlvbiArPSBmaWVsZEZpbHRlci50b1N0cmluZyhrZXkpICsgKGZpZWxkRmlsdGVyLnR5cGUgPT09ICdhbmQnID8gJyAmJiAnIDogJyB8fCAnKTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZENvbmRpdGlvbiArPSBmaWVsZEZpbHRlci50b1N0cmluZyhrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChmaWVsZENvbmRpdGlvbiAhPT0gJycpXHJcbiAgICAgIHtcclxuICAgICAgICBjb25kaXRpb25zU3RyaW5nICs9IGAgJHtjb25kaXRpb25zU3RyaW5nID09PSAnJyA/ICcnIDogJyAmJiAnfSAoICR7ZmllbGRDb25kaXRpb259IClgO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChjb25kaXRpb25zU3RyaW5nICE9PSAnJylcclxuICAgIHtcclxuICAgICAgY29uc3QgZmlsdGVyRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oJ19hJCcsICdyZXR1cm4gJyArIGNvbmRpdGlvbnNTdHJpbmcpO1xyXG4gICAgICB0aGlzLmZpbHRlclByZWRpY2F0ZSA9IChkYXRhOiBULCBmaWx0ZXI6IHN0cmluZykgPT4gZmlsdGVyRnVuY3Rpb24oZGF0YSkgYXMgYm9vbGVhbjtcclxuICAgIH0gZWxzZVxyXG4gICAge1xyXG4gICAgICB0aGlzLmZpbHRlclByZWRpY2F0ZSA9IChkYXRhOiBULCBmaWx0ZXI6IHN0cmluZykgPT4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuZmlsdGVyID0gY29uZGl0aW9uc1N0cmluZztcclxuICB9XHJcblxyXG4gIC8vIFdoZW4gY2xpZW50IHBhZ2luZyBhY3RpdmUgdXNlIGZvciByZXRyaWV2ZSBwYWdpbmcgZGF0YVxyXG4gIHBhZ2luZ0RhdGEoZGF0YSlcclxuICB7XHJcbiAgICBjb25zdCBwOiBNYXRQYWdpbmF0b3IgPSAodGhpcyBhcyBhbnkpLl9wYWdpbmF0b3I7XHJcbiAgICBpZiAocCAmJiBwICE9PSBudWxsKVxyXG4gICAge1xyXG4gICAgICBjb25zdCBlbmQgPSAocC5wYWdlSW5kZXggKyAxKSAqIHAucGFnZVNpemU7XHJcbiAgICAgIGNvbnN0IHN0YXJ0ID0gcC5wYWdlSW5kZXggKiBwLnBhZ2VTaXplO1xyXG4gICAgICByZXR1cm4gZGF0YS5zbGljZShzdGFydCwgZW5kKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpXHJcbiAge1xyXG4gICAgdGhpcy5pbml0U3RyZWFtcygpO1xyXG4gICAgY29uc3Qgc29ydDogTWF0U29ydCB8IG51bGwgPSAodGhpcyBhcyBhbnkpLl9zb3J0O1xyXG4gICAgY29uc3QgcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3IgfCBudWxsID0gKHRoaXMgYXMgYW55KS5fcGFnaW5hdG9yO1xyXG4gICAgY29uc3QgaW50ZXJuYWxQYWdlQ2hhbmdlczogU3ViamVjdDx2b2lkPiA9ICh0aGlzIGFzIGFueSkuX2ludGVybmFsUGFnZUNoYW5nZXM7XHJcbiAgICBjb25zdCBmaWx0ZXI6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gKHRoaXMgYXMgYW55KS5fZmlsdGVyO1xyXG4gICAgY29uc3QgcmVuZGVyRGF0YTogQmVoYXZpb3JTdWJqZWN0PFRbXT4gPSAodGhpcyBhcyBhbnkpLl9yZW5kZXJEYXRhO1xyXG4gICAgY29uc3QgZGF0YVN0cmVhbTogQmVoYXZpb3JTdWJqZWN0PFRbXT4gPSAodGhpcyBhcyBhbnkpLl9kYXRhO1xyXG5cclxuICAgIGNvbnN0IHNvcnRDaGFuZ2U6IE9ic2VydmFibGU8U29ydCB8IG51bGwgfCB2b2lkPiA9IHNvcnQgP1xyXG4gICAgICBtZXJnZShzb3J0LnNvcnRDaGFuZ2UsIHNvcnQuaW5pdGlhbGl6ZWQpIGFzIE9ic2VydmFibGU8U29ydCB8IHZvaWQ+IDogb2YobnVsbCk7XHJcbiAgICBjb25zdCBwYWdlQ2hhbmdlOiBPYnNlcnZhYmxlPFBhZ2VFdmVudCB8IG51bGwgfCB2b2lkPiA9IHBhZ2luYXRvciA/XHJcbiAgICAgIG1lcmdlKHBhZ2luYXRvci5wYWdlLCBpbnRlcm5hbFBhZ2VDaGFuZ2VzLCBwYWdpbmF0b3IuaW5pdGlhbGl6ZWQpIGFzIE9ic2VydmFibGU8UGFnZUV2ZW50IHwgdm9pZD4gOiBvZihudWxsKTtcclxuXHJcbiAgICAvLyBGaXJzdCBGaWx0ZXJcclxuICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IGNvbWJpbmVMYXRlc3QoW2RhdGFTdHJlYW0sIGZpbHRlcl0pLnBpcGUobWFwKChbZGF0YV0pID0+IHRoaXMuX2ZpbHRlckRhdGEoZGF0YSkpKTtcclxuICAgIC8vIFNlY29uZCBPcmRlclxyXG4gICAgY29uc3Qgb3JkZXJlZERhdGEgPSBjb21iaW5lTGF0ZXN0KFtmaWx0ZXJlZERhdGEsIHNvcnRDaGFuZ2VdKS5waXBlKG1hcCgoW2RhdGEsIHNvcnRDb2x1bW5dKSA9PlxyXG4gICAge1xyXG4gICAgICBjb25zdCBzYzogU29ydCA9IHNvcnRDb2x1bW4gYXMgU29ydDtcclxuICAgICAgaWYgKCFzYylcclxuICAgICAge1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9IGVsc2UgaWYgKHNjLmFjdGl2ZSAhPT0gJycpXHJcbiAgICAgIHtcclxuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5uYW1lID09IHNjLmFjdGl2ZSlbMF07XHJcbiAgICAgICAgaWYgKGNvbHVtbi5zb3J0ID09PSAnc2VydmVyLXNpZGUnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnNvcnQgPT09ICdjbGllbnQtc2lkZScpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX29yZGVyRGF0YShkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICAgIC8vIExhc3QgUGFnaW5nXHJcbiAgICBjb25zdCBwYWdpbmF0ZWREYXRhID0gY29tYmluZUxhdGVzdChbb3JkZXJlZERhdGEsIHBhZ2VDaGFuZ2VdKS5waXBlKG1hcCgoW2RhdGFdKSA9PiB0aGlzLnBhZ2luZ0RhdGEoZGF0YSkpKTtcclxuXHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24uYWRkKHBhZ2luYXRlZERhdGEuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5kYXRhVG9SZW5kZXIkLm5leHQoZGF0YSkpKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24uYWRkKHRoaXMuZGF0YU9mUmFuZ2UkLnN1YnNjcmliZShkYXRhID0+IHJlbmRlckRhdGEubmV4dChkYXRhKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0U3RyZWFtcygpXHJcbiAge1xyXG4gICAgaWYgKCF0aGlzLnN0cmVhbXNSZWFkeSlcclxuICAgIHtcclxuICAgICAgdGhpcy5kYXRhVG9SZW5kZXIkID0gbmV3IFJlcGxheVN1YmplY3Q8VFtdPigxKTtcclxuICAgICAgdGhpcy5kYXRhT2ZSYW5nZSQgPSBuZXcgUmVwbGF5U3ViamVjdDxUW10+KDEpO1xyXG4gICAgICB0aGlzLnN0cmVhbXNSZWFkeSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==