UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

219 lines 31.2 kB
import { Injectable } from '@angular/core'; import { BehaviorSubject, forkJoin, of, Subject, timer } from 'rxjs'; import { LoadingEmitter } from '../../utility/loading-emitter'; import { catchError, map, mergeMap, scan, tap } from 'rxjs/operators'; import { HttpParams } from '@angular/common/http'; import { PaginationParams } from '../../utility/pagination/pagination-params'; import * as i0 from "@angular/core"; import * as i1 from "../../resources/engine-endpoint/ldap-group-resource.service"; import * as i2 from "../../logger/services/logger.service"; import * as i3 from "../../snack-bar/services/snack-bar.service"; import * as i4 from "@ngx-translate/core"; export class LdapGroupListService { _resources; _log; _snackbar; _translate; /** * Ldap Group Value array stream, that represents ldap group loading from backend. */ _ldapGroups$; /** * Emit ldap group loading status from backend. */ _loading$; /** * Number stream of next page ldap group list, that to be requested from backend. */ _nextPage$; /** * Signals the end of loaded ldap groups. */ _endOfData; /** * Necessary for pagination parameters in ldap group assign loading from backend. */ _pagination; /** * Signals if response is empty or no. */ _clear; /** * The search content that should be applied to the request */ _searchQuery; /** * Roles that should be applied to the request */ rolesQuery; /** * negative Roles that should be applied to the request */ negativeRolesQuery; _updateProgress$; _ldapGroupsReload$; /** * Inject services. * Initialize declared attributes. * * Loading and mapped stream of ldap groups. * @param _resources Loading ldap groups from backend. * @param _log Logging action status. * @param _snackbar Display info about loading from backend for ldap group. * @param _translate Translate messages for ldap group. */ constructor(_resources, _log, _snackbar, _translate) { this._resources = _resources; this._log = _log; this._snackbar = _snackbar; this._translate = _translate; this._loading$ = new LoadingEmitter(); this._updateProgress$ = new LoadingEmitter(); this._ldapGroupsReload$ = new Subject(); this._nextPage$ = new BehaviorSubject(null); this._endOfData = false; this._pagination = { size: 20, totalElements: undefined, totalPages: undefined, number: -1 }; this._searchQuery = ''; this._clear = false; this.negativeRolesQuery = new Array(); this.rolesQuery = new Array(); const ldapGroupsMap = this._nextPage$.pipe(mergeMap(p => this.loadPage(p)), tap(() => { if (!this._clear) { this._ldapGroupsReload$.next(); } }), scan((acc, value) => { const result = this._clear ? {} : { ...acc, ...value }; this._clear = false; return result; }, {})); this._ldapGroups$ = ldapGroupsMap.pipe(map(v => Object.values(v))); } ngOnDestroy() { this._loading$.complete(); this._updateProgress$.complete(); this._ldapGroupsReload$.complete(); this._nextPage$.complete(); } get loading() { return this._loading$.isActive; } get loading$() { return this._loading$.asObservable(); } get ldapGroupsReload$() { return this._ldapGroupsReload$.asObservable(); } get ldapGroups$() { return this._ldapGroups$; } get updating$() { return this._updateProgress$.asObservable(); } get totalLdapGroups() { return this._pagination.totalElements ? this._pagination.totalElements : 0; } /** * Get all ldapGroups from backend and mapped to [ldapGroupValue]{@link ldapGroupValue} interface with catching errors. * @param page Page number that is requested. / Next page ldapGroups list. */ loadPage(page) { if (page === null || page === undefined || this._clear) { return of({}); } let params = new HttpParams(); params = this.addPageParams(params, page); this._loading$.on(); return this._resources.searchLdapGroups({ fulltext: this._searchQuery }).pipe(catchError(err => { this._log.error('Loading ldap groups has failed on page ' + this._pagination.number, err); return of({ ldapGroupResponseBodies: [], pagination: { ...this._pagination, number: this._pagination.number - 1 } }); }), tap(ldapGroupResponseBody => this._endOfData = !Array.isArray(ldapGroupResponseBody.ldapGroupResponseBodies) || (Array.isArray(ldapGroupResponseBody.ldapGroupResponseBodies) && ldapGroupResponseBody.ldapGroupResponseBodies.length === 0)), map(ldapGroupResponseBody => (Array.isArray(ldapGroupResponseBody.ldapGroupResponseBodies) ? ldapGroupResponseBody : { ...ldapGroupResponseBody, ldapGroupResponseBodies: [] })), map(ldapGroupResponseBody => { const result = {}; ldapGroupResponseBody.ldapGroupResponseBodies.forEach(ldapGroup => { const item = ldapGroup; item.roles = new Set(ldapGroup.processRoles.map(pr => pr.stringId)); item.processRoles = undefined; item.selected = false; item.toggle = function () { this.selected = !this.selected; }; result[ldapGroup.dn] = item; }); return result; }), tap(_ => this._loading$.off())); } /** * Set value to nextPage stream as next page ldapGroups list. * @param lastRendered Last rendered ldapGroup index. * @param totalRendered Total loaded size ldapGroups. */ nextPage(lastRendered, totalRendered) { if (this.loading || this._endOfData) { return; } if (lastRendered === totalRendered) { this._nextPage$.next(this._pagination.number + 1); } } /** * Reload page with ldapGroups. */ reload(newSearchQuery = '') { if (!this._ldapGroups$ || !this._pagination) { return; } this._clear = true; this._endOfData = false; this._pagination.number = -1; this._searchQuery = newSearchQuery; this.nextPage(0, 0); timer(100).subscribe(_ => { this._pagination.number = -1; this.nextPage(0, 0); }); } updateRoles(selectedLdapGroups, selectedRoles = []) { if (!selectedLdapGroups || selectedLdapGroups.length === 0) { return of([]); } this._updateProgress$.on(); return forkJoin(selectedLdapGroups.map(ldapGroup => this._resources.assignRolesToLdapGroup({ groupDn: ldapGroup.dn, roleIds: selectedRoles }))).pipe(tap(messages => { messages.forEach((message, idx) => { if (message.error) { this._log.error(message.error, message); this._snackbar.openErrorSnackBar(message.error); } else { this._log.info(message.success); selectedLdapGroups[idx].roles = new Set(selectedRoles); this._snackbar.openSuccessSnackBar(this._translate.instant('tasks.snackbar.rolesSuccessAssign')); } }); this._updateProgress$.off(); })); } /** * Returns HttpParams with page params addition. * @param params Existing HttpParams. * @param page Page number that is requested. / Next page ldapGroups list. */ addPageParams(params, page) { params = params.set(PaginationParams.PAGE_SIZE, `${this._pagination.size}`); page = page !== null ? page : this._pagination.number; params = params.set(PaginationParams.PAGE_NUMBER, `${page}`); return params; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LdapGroupListService, deps: [{ token: i1.LdapGroupResourceService }, { token: i2.LoggerService }, { token: i3.SnackBarService }, { token: i4.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LdapGroupListService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LdapGroupListService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.LdapGroupResourceService }, { type: i2.LoggerService }, { type: i3.SnackBarService }, { type: i4.TranslateService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGRhcC1ncm91cC1saXN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL2dyb3Vwcy9zZXJ2aWNlcy9sZGFwLWdyb3VwLWxpc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBQyxlQUFlLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQy9FLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUs3RCxPQUFPLEVBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQzs7Ozs7O0FBYTVFLE1BQU0sT0FBTyxvQkFBb0I7SUFvRFA7SUFDQTtJQUNBO0lBQ0E7SUFyRHRCOztPQUVHO0lBQ2dCLFlBQVksQ0FBdUM7SUFDdEU7O09BRUc7SUFDTyxTQUFTLENBQWlCO0lBQ3BDOztPQUVHO0lBQ08sVUFBVSxDQUEwQjtJQUM5Qzs7T0FFRztJQUNPLFVBQVUsQ0FBVTtJQUM5Qjs7T0FFRztJQUNPLFdBQVcsQ0FBYTtJQUNsQzs7T0FFRztJQUNPLE1BQU0sQ0FBVTtJQUMxQjs7T0FFRztJQUNPLFlBQVksQ0FBUztJQUMvQjs7T0FFRztJQUNJLFVBQVUsQ0FBZ0I7SUFDakM7O09BRUc7SUFDSSxrQkFBa0IsQ0FBZ0I7SUFDL0IsZ0JBQWdCLENBQWlCO0lBQ2pDLGtCQUFrQixDQUFnQjtJQUc1Qzs7Ozs7Ozs7O09BU0c7SUFD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LGFBQWEsQ0FBQyxNQUFrQixFQUFFLElBQWE7UUFDckQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3RELE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQzt3R0FsT1Esb0JBQW9COzRHQUFwQixvQkFBb0I7OzRGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCB0aW1lcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0xvYWRpbmdFbWl0dGVyfSBmcm9tICcuLi8uLi91dGlsaXR5L2xvYWRpbmctZW1pdHRlcic7XG5pbXBvcnQge1BhZ2luYXRpb259IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvcGFnaW5hdGlvbic7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1NuYWNrQmFyU2VydmljZX0gZnJvbSAnLi4vLi4vc25hY2stYmFyL3NlcnZpY2VzL3NuYWNrLWJhci5zZXJ2aWNlJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge2NhdGNoRXJyb3IsIG1hcCwgbWVyZ2VNYXAsIHNjYW4sIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1BhZ2luYXRpb25QYXJhbXN9IGZyb20gJy4uLy4uL3V0aWxpdHkvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLXBhcmFtcyc7XG5pbXBvcnQge0xkYXBHcm91cCwgTGRhcEdyb3VwUmVzcG9uc2VCb2R5fSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2xkYXBHcm91cFJlc3BvbnNlQm9keSc7XG5pbXBvcnQge0xkYXBHcm91cFJlc291cmNlU2VydmljZX0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2VuZ2luZS1lbmRwb2ludC9sZGFwLWdyb3VwLXJlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtNZXNzYWdlUmVzb3VyY2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvbWVzc2FnZS1yZXNvdXJjZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGRhcEdyb3VwTGlzdEl0ZW0gZXh0ZW5kcyBMZGFwR3JvdXAge1xuICAgIHNlbGVjdGVkOiBib29sZWFuO1xuICAgIHJvbGVzOiBTZXQ8c3RyaW5nPjtcblxuICAgIHRvZ2dsZSgpOiB2b2lkO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTGRhcEdyb3VwTGlzdFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgLyoqXG4gICAgICogTGRhcCBHcm91cCBWYWx1ZSBhcnJheSBzdHJlYW0sIHRoYXQgcmVwcmVzZW50cyBsZGFwIGdyb3VwIGxvYWRpbmcgZnJvbSBiYWNrZW5kLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfbGRhcEdyb3VwcyQ6IE9ic2VydmFibGU8QXJyYXk8TGRhcEdyb3VwTGlzdEl0ZW0+PjtcbiAgICAvKipcbiAgICAgKiBFbWl0IGxkYXAgZ3JvdXAgbG9hZGluZyBzdGF0dXMgZnJvbSBiYWNrZW5kLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbG9hZGluZyQ6IExvYWRpbmdFbWl0dGVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBzdHJlYW0gb2YgbmV4dCBwYWdlIGxkYXAgZ3JvdXAgbGlzdCwgdGhhdCB0byBiZSByZXF1ZXN0ZWQgZnJvbSBiYWNrZW5kLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbmV4dFBhZ2UkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPjtcbiAgICAvKipcbiAgICAgKiBTaWduYWxzIHRoZSBlbmQgb2YgbG9hZGVkIGxkYXAgZ3JvdXBzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZW5kT2ZEYXRhOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIE5lY2Vzc2FyeSBmb3IgcGFnaW5hdGlvbiBwYXJhbWV0ZXJzIGluIGxkYXAgZ3JvdXAgYXNzaWduIGxvYWRpbmcgZnJvbSBiYWNrZW5kLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGFnaW5hdGlvbjogUGFnaW5hdGlvbjtcbiAgICAvKipcbiAgICAgKiBTaWduYWxzIGlmIHJlc3BvbnNlIGlzIGVtcHR5IG9yIG5vLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY2xlYXI6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBjb250ZW50IHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3NlYXJjaFF1ZXJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUm9sZXMgdGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgcmVxdWVzdFxuICAgICAqL1xuICAgIHB1YmxpYyByb2xlc1F1ZXJ5OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIG5lZ2F0aXZlIFJvbGVzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHJlcXVlc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgbmVnYXRpdmVSb2xlc1F1ZXJ5OiBBcnJheTxzdHJpbmc+O1xuICAgIHByb3RlY3RlZCBfdXBkYXRlUHJvZ3Jlc3MkOiBMb2FkaW5nRW1pdHRlcjtcbiAgICBwcm90ZWN0ZWQgX2xkYXBHcm91cHNSZWxvYWQkOiBTdWJqZWN0PHZvaWQ+O1xuXG5cbiAgICAvKipcbiAgICAgKiBJbmplY3Qgc2VydmljZXMuXG4gICAgICogSW5pdGlhbGl6ZSBkZWNsYXJlZCBhdHRyaWJ1dGVzLlxuICAgICAqXG4gICAgICogTG9hZGluZyBhbmQgbWFwcGVkIHN0cmVhbSBvZiBsZGFwIGdyb3Vwcy5cbiAgICAgKiBAcGFyYW0gX3Jlc291cmNlcyBMb2FkaW5nIGxkYXAgZ3JvdXBzIGZyb20gYmFja2VuZC5cbiAgICAgKiBAcGFyYW0gX2xvZyBMb2dnaW5nIGFjdGlvbiBzdGF0dXMuXG4gICAgICogQHBhcmFtIF9zbmFja2JhciBEaXNwbGF5IGluZm8gYWJvdXQgbG9hZGluZyBmcm9tIGJhY2tlbmQgZm9yIGxkYXAgZ3JvdXAuXG4gICAgICogQHBhcmFtIF90cmFuc2xhdGUgVHJhbnNsYXRlIG1lc3NhZ2VzIGZvciBsZGFwIGdyb3VwLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfcmVzb3VyY2VzOiBMZGFwR3JvdXBSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9zbmFja2JhcjogU25hY2tCYXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuX2xvYWRpbmckID0gbmV3IExvYWRpbmdFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVByb2dyZXNzJCA9IG5ldyBMb2FkaW5nRW1pdHRlcigpO1xuICAgICAgICB0aGlzLl9sZGFwR3JvdXBzUmVsb2FkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgICAgIHRoaXMuX25leHRQYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihudWxsKTtcbiAgICAgICAgdGhpcy5fZW5kT2ZEYXRhID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb24gPSB7XG4gICAgICAgICAgICBzaXplOiAyMCxcbiAgICAgICAgICAgIHRvdGFsRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRvdGFsUGFnZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG51bWJlcjogLTFcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fc2VhcmNoUXVlcnkgPSAnJztcbiAgICAgICAgdGhpcy5fY2xlYXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5uZWdhdGl2ZVJvbGVzUXVlcnkgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgICAgICB0aGlzLnJvbGVzUXVlcnkgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgICAgIGNvbnN0IGxkYXBHcm91cHNNYXAgPSB0aGlzLl9uZXh0UGFnZSQucGlwZShcbiAgICAgICAgICAgIG1lcmdlTWFwKHAgPT4gdGhpcy5sb2FkUGFnZShwKSksXG4gICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2xlYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGRhcEdyb3Vwc1JlbG9hZCQubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc2NhbigoYWNjLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2NsZWFyID8ge30gOiB7Li4uYWNjLCAuLi52YWx1ZX07XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xlYXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSwge30pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2xkYXBHcm91cHMkID0gbGRhcEdyb3Vwc01hcC5waXBlKFxuICAgICAgICAgICAgbWFwKHYgPT4gT2JqZWN0LnZhbHVlcyh2KSBhcyBBcnJheTxMZGFwR3JvdXBMaXN0SXRlbT4pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9sb2FkaW5nJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl91cGRhdGVQcm9ncmVzcyQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fbGRhcEdyb3Vwc1JlbG9hZCQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fbmV4dFBhZ2UkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZyQuaXNBY3RpdmU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb2FkaW5nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGRhcEdyb3Vwc1JlbG9hZCQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sZGFwR3JvdXBzUmVsb2FkJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxkYXBHcm91cHMkKCk6IE9ic2VydmFibGU8QXJyYXk8TGRhcEdyb3VwTGlzdEl0ZW0+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sZGFwR3JvdXBzJDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHVwZGF0aW5nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZVByb2dyZXNzJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRvdGFsTGRhcEdyb3VwcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnaW5hdGlvbi50b3RhbEVsZW1lbnRzID8gdGhpcy5fcGFnaW5hdGlvbi50b3RhbEVsZW1lbnRzIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGxkYXBHcm91cHMgZnJvbSBiYWNrZW5kIGFuZCBtYXBwZWQgdG8gW2xkYXBHcm91cFZhbHVlXXtAbGluayBsZGFwR3JvdXBWYWx1ZX0gaW50ZXJmYWNlIHdpdGggY2F0Y2hpbmcgZXJyb3JzLlxuICAgICAqIEBwYXJhbSBwYWdlIFBhZ2UgbnVtYmVyIHRoYXQgaXMgcmVxdWVzdGVkLiAvIE5leHQgcGFnZSBsZGFwR3JvdXBzIGxpc3QuXG4gICAgICovXG4gICAgcHVibGljIGxvYWRQYWdlKHBhZ2U6IG51bWJlcik6IE9ic2VydmFibGU8eyBbazogc3RyaW5nXTogTGRhcEdyb3VwTGlzdEl0ZW0gfT4ge1xuICAgICAgICBpZiAocGFnZSA9PT0gbnVsbCB8fCBwYWdlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fY2xlYXIpIHtcbiAgICAgICAgICAgIHJldHVybiBvZih7fSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgICAgIHBhcmFtcyA9IHRoaXMuYWRkUGFnZVBhcmFtcyhwYXJhbXMsIHBhZ2UpO1xuICAgICAgICB0aGlzLl9sb2FkaW5nJC5vbigpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VzLnNlYXJjaExkYXBHcm91cHMoe2Z1bGx0ZXh0OiB0aGlzLl9zZWFyY2hRdWVyeX0pLnBpcGUoXG4gICAgICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKCdMb2FkaW5nIGxkYXAgZ3JvdXBzIGhhcyBmYWlsZWQgb24gcGFnZSAnICsgdGhpcy5fcGFnaW5hdGlvbi5udW1iZXIsIGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHtsZGFwR3JvdXBSZXNwb25zZUJvZGllczogW10sIHBhZ2luYXRpb246IHsuLi50aGlzLl9wYWdpbmF0aW9uLCBudW1iZXI6IHRoaXMuX3BhZ2luYXRpb24ubnVtYmVyIC0gMX19KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKGxkYXBHcm91cFJlc3BvbnNlQm9keSA9PiB0aGlzLl9lbmRPZkRhdGEgPSAhQXJyYXkuaXNBcnJheShsZGFwR3JvdXBSZXNwb25zZUJvZHkubGRhcEdyb3VwUmVzcG9uc2VCb2RpZXMpIHx8XG4gICAgICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkobGRhcEdyb3VwUmVzcG9uc2VCb2R5LmxkYXBHcm91cFJlc3BvbnNlQm9kaWVzKVxuICAgICAgICAgICAgICAgICAgICAmJiBsZGFwR3JvdXBSZXNwb25zZUJvZHkubGRhcEdyb3VwUmVzcG9uc2VCb2RpZXMubGVuZ3RoID09PSAwKSksXG4gICAgICAgICAgICBtYXAobGRhcEdyb3VwUmVzcG9uc2VCb2R5ID0+IChBcnJheS5pc0FycmF5KGxkYXBHcm91cFJlc3BvbnNlQm9keS5sZGFwR3JvdXBSZXNwb25zZUJvZGllcykgP1xuICAgICAgICAgICAgICAgIGxkYXBHcm91cFJlc3BvbnNlQm9keSA6IHsuLi5sZGFwR3JvdXBSZXNwb25zZUJvZHksIGxkYXBHcm91cFJlc3BvbnNlQm9kaWVzOiBbXX0pKSxcbiAgICAgICAgICAgIG1hcCggbGRhcEdyb3VwUmVzcG9uc2VCb2R5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgICAgICAgICBsZGFwR3JvdXBSZXNwb25zZUJvZHkubGRhcEdyb3VwUmVzcG9uc2VCb2RpZXMuZm9yRWFjaCggbGRhcEdyb3VwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGxkYXBHcm91cCBhcyBMZGFwR3JvdXBMaXN0SXRlbTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5yb2xlcyA9IG5ldyBTZXQ8c3RyaW5nPihsZGFwR3JvdXAucHJvY2Vzc1JvbGVzLm1hcChwciA9PiBwci5zdHJpbmdJZCkpO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnByb2Nlc3NSb2xlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnRvZ2dsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9ICF0aGlzLnNlbGVjdGVkO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbbGRhcEdyb3VwLmRuXSA9IGl0ZW07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKF8gPT4gdGhpcy5fbG9hZGluZyQub2ZmKCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHZhbHVlIHRvIG5leHRQYWdlIHN0cmVhbSBhcyBuZXh0IHBhZ2UgbGRhcEdyb3VwcyBsaXN0LlxuICAgICAqIEBwYXJhbSBsYXN0UmVuZGVyZWQgTGFzdCByZW5kZXJlZCBsZGFwR3JvdXAgaW5kZXguXG4gICAgICogQHBhcmFtIHRvdGFsUmVuZGVyZWQgVG90YWwgbG9hZGVkIHNpemUgbGRhcEdyb3Vwcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dFBhZ2UobGFzdFJlbmRlcmVkOiBudW1iZXIsIHRvdGFsUmVuZGVyZWQ6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5sb2FkaW5nIHx8IHRoaXMuX2VuZE9mRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxhc3RSZW5kZXJlZCA9PT0gdG90YWxSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5fbmV4dFBhZ2UkLm5leHQodGhpcy5fcGFnaW5hdGlvbi5udW1iZXIgKyAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbG9hZCBwYWdlIHdpdGggbGRhcEdyb3Vwcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVsb2FkKG5ld1NlYXJjaFF1ZXJ5ID0gJycpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sZGFwR3JvdXBzJCB8fCAhdGhpcy5fcGFnaW5hdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NsZWFyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZW5kT2ZEYXRhID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb24ubnVtYmVyID0gLTE7XG4gICAgICAgIHRoaXMuX3NlYXJjaFF1ZXJ5ID0gbmV3U2VhcmNoUXVlcnk7XG4gICAgICAgIHRoaXMubmV4dFBhZ2UoMCwgMCk7XG4gICAgICAgIHRpbWVyKDEwMCkuc3Vic2NyaWJlKF8gPT4ge1xuICAgICAgICAgICAgdGhpcy5fcGFnaW5hdGlvbi5udW1iZXIgPSAtMTtcbiAgICAgICAgICAgIHRoaXMubmV4dFBhZ2UoMCwgMCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVSb2xlcyhzZWxlY3RlZExkYXBHcm91cHM6IEFycmF5PExkYXBHcm91cExpc3RJdGVtPiwgc2VsZWN0ZWRSb2xlczogQXJyYXk8c3RyaW5nPiA9IFtdKTpcbiAgICBPYnNlcnZhYmxlPEFycmF5PE1lc3NhZ2VSZXNvdXJjZT4+IHtcbiAgICAgICAgaWYgKCFzZWxlY3RlZExkYXBHcm91cHMgfHwgc2VsZWN0ZWRMZGFwR3JvdXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVQcm9ncmVzcyQub24oKTtcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKHNlbGVjdGVkTGRhcEdyb3Vwcy5tYXAobGRhcEdyb3VwID0+IHRoaXMuX3Jlc291cmNlcy5hc3NpZ25Sb2xlc1RvTGRhcEdyb3VwKFxuICAgICAgICAgICAge2dyb3VwRG46IGxkYXBHcm91cC5kbiwgcm9sZUlkczogc2VsZWN0ZWRSb2xlc30pKSkucGlwZShcbiAgICAgICAgICAgIHRhcChtZXNzYWdlcyA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZXMuZm9yRWFjaCgobWVzc2FnZSwgaWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IobWVzc2FnZS5lcnJvciwgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zbmFja2Jhci5vcGVuRXJyb3JTbmFja0JhcihtZXNzYWdlLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5pbmZvKG1lc3NhZ2Uuc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZExkYXBHcm91cHNbaWR4XS5yb2xlcyA9IG5ldyBTZXQ8c3RyaW5nPihzZWxlY3RlZFJvbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLm9wZW5TdWNjZXNzU25hY2tCYXIodGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLnJvbGVzU3VjY2Vzc0Fzc2lnbicpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVByb2dyZXNzJC5vZmYoKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIEh0dHBQYXJhbXMgd2l0aCBwYWdlIHBhcmFtcyBhZGRpdGlvbi5cbiAgICAgKiBAcGFyYW0gcGFyYW1zIEV4aXN0aW5nIEh0dHBQYXJhbXMuXG4gICAgICogQHBhcmFtIHBhZ2UgUGFnZSBudW1iZXIgdGhhdCBpcyByZXF1ZXN0ZWQuIC8gTmV4dCBwYWdlIGxkYXBHcm91cHMgbGlzdC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkUGFnZVBhcmFtcyhwYXJhbXM6IEh0dHBQYXJhbXMsIHBhZ2U/OiBudW1iZXIpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldChQYWdpbmF0aW9uUGFyYW1zLlBBR0VfU0laRSwgYCR7dGhpcy5fcGFnaW5hdGlvbi5zaXplfWApO1xuICAgICAgICBwYWdlID0gcGFnZSAhPT0gbnVsbCA/IHBhZ2UgOiB0aGlzLl9wYWdpbmF0aW9uLm51bWJlcjtcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldChQYWdpbmF0aW9uUGFyYW1zLlBBR0VfTlVNQkVSLCBgJHtwYWdlfWApO1xuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbn1cbiJdfQ==