UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

172 lines 25.9 kB
import { LoadingEmitter } from '../../../utility/loading-emitter'; import { forkJoin, of, Subject, timer } from 'rxjs'; import { catchError, map, tap } from 'rxjs/operators'; export class ProcessList { _resources; _log; _loading$; _processes; _rolesIndex; _selectedRoles; constructor(_resources, _log) { this._resources = _resources; this._log = _log; this._loading$ = new LoadingEmitter(); this._processes = []; this._rolesIndex = {}; this._selectedRoles = new Set(); } get loading() { return this._loading$.getValue(); } get loading$() { return this._loading$.asObservable(); } get processes() { return this._processes; } get selectedRoles() { return [...this._selectedRoles]; } loadProcesses() { if (this.loading) { return; } const processes = new Subject(); this._loading$.on(); this._resources.getAll().pipe(catchError(err => { this._log.error('Failed to load Petri nets', err); return of([]); }), map(p => Array.isArray(p) ? p : []), map(ps => ps.map(p => ({ ...p, roles: [] })))).subscribe(nets => { const cache = {}; nets.forEach(net => { if (cache[net.identifier]) { cache[net.identifier].processes.push(net); } else { cache[net.identifier] = { identifier: net.identifier, title: net.title, initials: net.initials, newestVersion: undefined, processes: [net], loading: true, emptyRoles: true, someRolesSelected: false }; } cache[net.identifier].processes.sort((a, b) => { return b.version.localeCompare(a.version, undefined, { numeric: true }); }); cache[net.identifier].newestVersion = cache[net.identifier].processes[0].version; }); this._processes = Object.values(cache).sort(); processes.next(this._processes); this._loading$.off(); }); return processes.asObservable(); } prepareToTryAgainToLoadRoles(item) { if (!item || !item.emptyRoles) { return; } item.loading = true; } selectRoles(roleIds) { if (!roleIds) { roleIds = new Set([]); } roleIds.forEach(role => { this._selectedRoles.delete(role); }); this._selectedRoles.forEach(role => { if (this._rolesIndex[role]) { this._rolesIndex[role].forEach(r => r.selected = false); } }); this._selectedRoles = roleIds; this._selectedRoles.forEach(role => { if (this._rolesIndex[role]) { this._rolesIndex[role].forEach(r => r.selected = true); } }); this.updateSelectedRolesFlag(Object.keys(this._rolesIndex) .filter(r => this._selectedRoles.has(r)) .map(r => this._rolesIndex[r].length !== 0 ? this._rolesIndex[r][0].processIdentifier : null)); } updateSelectedRoles(role) { role.selected ? this._selectedRoles.add(role.stringId) : this._selectedRoles.delete(role.stringId); this._rolesIndex[role.stringId].forEach(r => r.selected = role.selected); } loadProcessItemRoles(item) { if (!item || !item.emptyRoles) { return; } item.loading = true; forkJoin(item.processes.map(p => this.loadNetRoles(p))).subscribe(roles => { let isEmpty = true; roles.forEach((rs, i) => { item.processes[i].roles = rs; isEmpty = isEmpty && rs.length === 0; }); item.emptyRoles = isEmpty; item.loading = false; }); } loadNetRoles(net) { if (net.roles && net.roles.length !== 0) { return of(net.roles); } return this._resources.getPetriNetRoles(net.stringId).pipe(catchError(err => { this._log.error('Failed to load roles for Petri net [' + net.stringId + '] ' + net.title, err); return of([]); }), map((roles) => roles.processRoles.map(role => ({ ...role, selected: false, processIdentifier: net.identifier, toggle() { this.selected = !this.selected; } }))), tap(roles => roles.forEach(role => { if (!this._rolesIndex[role.stringId]) { this._rolesIndex[role.stringId] = [role]; } else { this._rolesIndex[role.stringId].push(role); } if (this._selectedRoles.has(role.stringId)) { role.selected = true; } }))); } updateSelectedRolesFlag(identifiers) { if (!identifiers) { return; } timer(0).subscribe(_ => { if (identifiers.length === 0) { this._processes.forEach(process => { process.someRolesSelected = false; }); } identifiers.forEach(identifier => { if (!identifier) { return; } const requested = this._processes.find(process => process.identifier === identifier); if (requested) { requested.someRolesSelected = requested.processes.some(version => version.roles.length !== 0); } }); this._processes.forEach(process => { if (!identifiers.find(i => process.identifier === i)) { process.someRolesSelected = false; } }); }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvY2Vzc0xpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL2FkbWluL3JvbGUtYXNzaWdubWVudC9zZXJ2aWNlcy9Qcm9jZXNzTGlzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFJaEUsT0FBTyxFQUFDLFFBQVEsRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQTBCcEQsTUFBTSxPQUFPLFdBQVc7SUFNQTtJQUE2QztJQUx6RCxTQUFTLENBQWlCO0lBQzFCLFVBQVUsQ0FBeUI7SUFDMUIsV0FBVyxDQUE4QztJQUNsRSxjQUFjLENBQWM7SUFFcEMsWUFBb0IsVUFBbUMsRUFBVSxJQUFtQjtRQUFoRSxlQUFVLEdBQVYsVUFBVSxDQUF5QjtRQUFVLFNBQUksR0FBSixJQUFJLENBQWU7UUFDaEYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELElBQVcsU0FBUztRQUNoQixPQUFPLElB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QUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLENBQUM7Z0JBQ3JGLElBQUksU0FBUyxFQUFFO29CQUNYLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUNqRztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDbEQsT0FBTyxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztpQkFDckM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMb2FkaW5nRW1pdHRlcn0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0eS9sb2FkaW5nLWVtaXR0ZXInO1xuaW1wb3J0IHtQZXRyaU5ldFJlZmVyZW5jZX0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9wZXRyaS1uZXQtcmVmZXJlbmNlJztcbmltcG9ydCB7UGV0cmlOZXRSZXNvdXJjZVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlcy9lbmdpbmUtZW5kcG9pbnQvcGV0cmktbmV0LXJlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIHRpbWVyfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgbWFwLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCBOZXRSb2xlIGZyb20gJy4uLy4uLy4uL3Byb2Nlc3MvbmV0Um9sZSc7XG5pbXBvcnQgUm9sZXNBbmRQZXJtaXNzaW9ucyBmcm9tICcuLi8uLi8uLi9wcm9jZXNzL3JvbGVzQW5kUGVybWlzc2lvbnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVuZGVkUHJvY2Vzc1JvbGUgZXh0ZW5kcyBOZXRSb2xlIHtcbiAgICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgICBwcm9jZXNzSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gICAgdG9nZ2xlKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc1ZlcnNpb24gZXh0ZW5kcyBQZXRyaU5ldFJlZmVyZW5jZSB7XG4gICAgcm9sZXM6IEFycmF5PEV4dGVuZGVkUHJvY2Vzc1JvbGU+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NMaXN0SXRlbSB7XG4gICAgaWRlbnRpZmllcjogc3RyaW5nO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgaW5pdGlhbHM6IHN0cmluZztcbiAgICBuZXdlc3RWZXJzaW9uOiBzdHJpbmc7XG4gICAgcHJvY2Vzc2VzOiBBcnJheTxQcm9jZXNzVmVyc2lvbj47XG4gICAgbG9hZGluZzogYm9vbGVhbjtcbiAgICBlbXB0eVJvbGVzOiBib29sZWFuO1xuICAgIHNvbWVSb2xlc1NlbGVjdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgUHJvY2Vzc0xpc3Qge1xuICAgIHByaXZhdGUgX2xvYWRpbmckOiBMb2FkaW5nRW1pdHRlcjtcbiAgICBwcml2YXRlIF9wcm9jZXNzZXM6IEFycmF5PFByb2Nlc3NMaXN0SXRlbT47XG4gICAgcHJpdmF0ZSByZWFkb25seSBfcm9sZXNJbmRleDogeyBbazogc3RyaW5nXTogQXJyYXk8RXh0ZW5kZWRQcm9jZXNzUm9sZT4gfTtcbiAgICBwcml2YXRlIF9zZWxlY3RlZFJvbGVzOiBTZXQ8c3RyaW5nPjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3Jlc291cmNlczogUGV0cmlOZXRSZXNvdXJjZVNlcnZpY2UsIHByaXZhdGUgX2xvZzogTG9nZ2VyU2VydmljZSkge1xuICAgICAgICB0aGlzLl9sb2FkaW5nJCA9IG5ldyBMb2FkaW5nRW1pdHRlcigpO1xuICAgICAgICB0aGlzLl9wcm9jZXNzZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fcm9sZXNJbmRleCA9IHt9O1xuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvbGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZyQuZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwcm9jZXNzZXMoKTogQXJyYXk8UHJvY2Vzc0xpc3RJdGVtPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWxlY3RlZFJvbGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuX3NlbGVjdGVkUm9sZXNdO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkUHJvY2Vzc2VzKCk6IE9ic2VydmFibGU8QXJyYXk8UHJvY2Vzc0xpc3RJdGVtPj4ge1xuICAgICAgICBpZiAodGhpcy5sb2FkaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvY2Vzc2VzID0gbmV3IFN1YmplY3Q8QXJyYXk8UHJvY2Vzc0xpc3RJdGVtPj4oKTtcbiAgICAgICAgdGhpcy5fbG9hZGluZyQub24oKTtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VzLmdldEFsbCgpLnBpcGUoXG4gICAgICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBQZXRyaSBuZXRzJywgZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YoW10gYXMgQXJyYXk8UHJvY2Vzc1ZlcnNpb24+KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKHAgPT4gQXJyYXkuaXNBcnJheShwKSA/IHAgOiBbXSBhcyBBcnJheTxQcm9jZXNzVmVyc2lvbj4pLFxuICAgICAgICAgICAgbWFwKHBzID0+IHBzLm1hcChwID0+ICh7XG4gICAgICAgICAgICAgICAgLi4ucCxcbiAgICAgICAgICAgICAgICByb2xlczogW11cbiAgICAgICAgICAgIH0pIGFzIFByb2Nlc3NWZXJzaW9uKSlcbiAgICAgICAgKS5zdWJzY3JpYmUobmV0cyA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZTogeyBbazogc3RyaW5nXTogUHJvY2Vzc0xpc3RJdGVtIH0gPSB7fTtcbiAgICAgICAgICAgIG5ldHMuZm9yRWFjaChuZXQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjYWNoZVtuZXQuaWRlbnRpZmllcl0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVbbmV0LmlkZW50aWZpZXJdLnByb2Nlc3Nlcy5wdXNoKG5ldCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVbbmV0LmlkZW50aWZpZXJdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogbmV0LmlkZW50aWZpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogbmV0LnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbHM6IG5ldC5pbml0aWFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld2VzdFZlcnNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlczogW25ldF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlSb2xlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVSb2xlc1NlbGVjdGVkOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWNoZVtuZXQuaWRlbnRpZmllcl0ucHJvY2Vzc2VzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIudmVyc2lvbi5sb2NhbGVDb21wYXJlKGEudmVyc2lvbiwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2FjaGVbbmV0LmlkZW50aWZpZXJdLm5ld2VzdFZlcnNpb24gPSBjYWNoZVtuZXQuaWRlbnRpZmllcl0ucHJvY2Vzc2VzWzBdLnZlcnNpb247XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NlcyA9IE9iamVjdC52YWx1ZXMoY2FjaGUpLnNvcnQoKTtcbiAgICAgICAgICAgIHByb2Nlc3Nlcy5uZXh0KHRoaXMuX3Byb2Nlc3Nlcyk7XG4gICAgICAgICAgICB0aGlzLl9sb2FkaW5nJC5vZmYoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwcm9jZXNzZXMuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVUb1RyeUFnYWluVG9Mb2FkUm9sZXMoaXRlbTogUHJvY2Vzc0xpc3RJdGVtKTogdm9pZCB7XG4gICAgICAgIGlmICghaXRlbSB8fCAhaXRlbS5lbXB0eVJvbGVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaXRlbS5sb2FkaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0Um9sZXMocm9sZUlkczogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFyb2xlSWRzKSB7XG4gICAgICAgICAgICByb2xlSWRzID0gbmV3IFNldDxzdHJpbmc+KFtdKTtcbiAgICAgICAgfVxuICAgICAgICByb2xlSWRzLmZvckVhY2gocm9sZSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJvbGVzLmRlbGV0ZShyb2xlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm9sZXMuZm9yRWFjaChyb2xlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb2xlc0luZGV4W3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcm9sZXNJbmRleFtyb2xlXS5mb3JFYWNoKHIgPT4gci5zZWxlY3RlZCA9IGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm9sZXMgPSByb2xlSWRzO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvbGVzLmZvckVhY2gocm9sZSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcm9sZXNJbmRleFtyb2xlXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JvbGVzSW5kZXhbcm9sZV0uZm9yRWFjaChyID0+IHIuc2VsZWN0ZWQgPSB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRSb2xlc0ZsYWcoT2JqZWN0LmtleXModGhpcy5fcm9sZXNJbmRleClcbiAgICAgICAgICAgIC5maWx0ZXIociA9PiB0aGlzLl9zZWxlY3RlZFJvbGVzLmhhcyhyKSlcbiAgICAgICAgICAgIC5tYXAociA9PiB0aGlzLl9yb2xlc0luZGV4W3JdLmxlbmd0aCAhPT0gMCA/IHRoaXMuX3JvbGVzSW5kZXhbcl1bMF0ucHJvY2Vzc0lkZW50aWZpZXIgOiBudWxsKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZVNlbGVjdGVkUm9sZXMocm9sZTogRXh0ZW5kZWRQcm9jZXNzUm9sZSk6IHZvaWQge1xuICAgICAgICByb2xlLnNlbGVjdGVkID8gdGhpcy5fc2VsZWN0ZWRSb2xlcy5hZGQocm9sZS5zdHJpbmdJZCkgOiB0aGlzLl9zZWxlY3RlZFJvbGVzLmRlbGV0ZShyb2xlLnN0cmluZ0lkKTtcbiAgICAgICAgdGhpcy5fcm9sZXNJbmRleFtyb2xlLnN0cmluZ0lkXS5mb3JFYWNoKHIgPT4gci5zZWxlY3RlZCA9IHJvbGUuc2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkUHJvY2Vzc0l0ZW1Sb2xlcyhpdGVtOiBQcm9jZXNzTGlzdEl0ZW0pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpdGVtIHx8ICFpdGVtLmVtcHR5Um9sZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBmb3JrSm9pbihpdGVtLnByb2Nlc3Nlcy5tYXAocCA9PiB0aGlzLmxvYWROZXRSb2xlcyhwKSkpLnN1YnNjcmliZShyb2xlcyA9PiB7XG4gICAgICAgICAgICBsZXQgaXNFbXB0eSA9IHRydWU7XG4gICAgICAgICAgICByb2xlcy5mb3JFYWNoKChycywgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucHJvY2Vzc2VzW2ldLnJvbGVzID0gcnM7XG4gICAgICAgICAgICAgICAgaXNFbXB0eSA9IGlzRW1wdHkgJiYgcnMubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpdGVtLmVtcHR5Um9sZXMgPSBpc0VtcHR5O1xuICAgICAgICAgICAgaXRlbS5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZE5ldFJvbGVzKG5ldDogUHJvY2Vzc1ZlcnNpb24pOiBPYnNlcnZhYmxlPEFycmF5PEV4dGVuZGVkUHJvY2Vzc1JvbGU+PiB7XG4gICAgICAgIGlmIChuZXQucm9sZXMgJiYgbmV0LnJvbGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKG5ldC5yb2xlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlcy5nZXRQZXRyaU5ldFJvbGVzKG5ldC5zdHJpbmdJZCkucGlwZShcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHJvbGVzIGZvciBQZXRyaSBuZXQgWycgKyBuZXQuc3RyaW5nSWQgKyAnXSAnICsgbmV0LnRpdGxlLCBlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvZihbXSBhcyBBcnJheTxFeHRlbmRlZFByb2Nlc3NSb2xlPik7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcCgocm9sZXM6IFJvbGVzQW5kUGVybWlzc2lvbnMpID0+IHJvbGVzLnByb2Nlc3NSb2xlcy5tYXAocm9sZSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnJvbGUsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NJZGVudGlmaWVyOiBuZXQuaWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICB0b2dnbGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSAhdGhpcy5zZWxlY3RlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSBhcyBFeHRlbmRlZFByb2Nlc3NSb2xlKSksXG4gICAgICAgICAgICB0YXAocm9sZXMgPT4gcm9sZXMuZm9yRWFjaChyb2xlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3JvbGVzSW5kZXhbcm9sZS5zdHJpbmdJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm9sZXNJbmRleFtyb2xlLnN0cmluZ0lkXSA9IFtyb2xlXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb2xlc0luZGV4W3JvbGUuc3RyaW5nSWRdLnB1c2gocm9sZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZFJvbGVzLmhhcyhyb2xlLnN0cmluZ0lkKSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVNlbGVjdGVkUm9sZXNGbGFnKGlkZW50aWZpZXJzOiBBcnJheTxzdHJpbmc+KTogdm9pZCB7XG4gICAgICAgIGlmICghaWRlbnRpZmllcnMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lcigwKS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICAgICAgICBpZiAoaWRlbnRpZmllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc2VzLmZvckVhY2gocHJvY2VzcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3Muc29tZVJvbGVzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlkZW50aWZpZXJzLmZvckVhY2goaWRlbnRpZmllciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVkID0gdGhpcy5fcHJvY2Vzc2VzLmZpbmQocHJvY2VzcyA9PiBwcm9jZXNzLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkLnNvbWVSb2xlc1NlbGVjdGVkID0gcmVxdWVzdGVkLnByb2Nlc3Nlcy5zb21lKHZlcnNpb24gPT4gdmVyc2lvbi5yb2xlcy5sZW5ndGggIT09IDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc2VzLmZvckVhY2gocHJvY2VzcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpZGVudGlmaWVycy5maW5kKGkgPT4gcHJvY2Vzcy5pZGVudGlmaWVyID09PSBpKSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLnNvbWVSb2xlc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==