UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

561 lines 84.5 kB
import { EventEmitter, Injectable } from '@angular/core'; import { BehaviorSubject, of } from 'rxjs'; import { LoadingEmitter } from "../../../utility/loading-emitter"; import { filter, map, take } from "rxjs/operators"; import { DoubleDrawerUtils } from "../util/double-drawer-utils"; import { HttpParams } from "@angular/common/http"; import { PaginationParams } from "../../../utility/pagination/pagination-params"; import { SimpleFilter } from "../../../filter/models/simple-filter"; import { MENU_IDENTIFIERS, MenuOrder, RIGHT_SIDE_INIT_PAGE_SIZE, RIGHT_SIDE_NEW_PAGE_SIZE, SETTINGS_TRANSITION_ID } from '../../model/navigation-configs'; import { GroupNavigationConstants } from "../../model/group-navigation-constants"; import { PathService } from "../../service/path.service"; import * as i0 from "@angular/core"; import * as i1 from "../../../logger/services/logger.service"; import * as i2 from "../../../configuration/configuration.service"; import * as i3 from "@angular/router"; import * as i4 from "../../../resources/engine-endpoint/case-resource.service"; import * as i5 from "../../../authorization/permission/access.service"; import * as i6 from "@ngx-translate/core"; import * as i7 from "../../../routing/dynamic-navigation-route-provider/dynamic-navigation-route-provider.service"; import * as i8 from "../../../routing/redirect-service/redirect.service"; import * as i9 from "../../service/path.service"; import * as i10 from "../../../user/services/user.service"; /** * Service for managing navigation in double-drawer * */ export class DoubleDrawerNavigationService { _log; _config; _activatedRoute; _caseResourceService; _accessService; _translateService; _dynamicRoutingService; _redirectService; _pathService; _userService; /** * List of displayed items on the left side * */ _leftItems$; /** * List of displayed items on the right side * */ _rightItems$; /** * List of hidden items * */ _moreItems$; /** * List of custom items in more menu * */ _hiddenCustomItems$; /** * List of custom items * */ _childCustomViews; itemsOrder; _leftLoading$; _rightLoading$; _nodeLoading$; _currentPathSubscription; /** * Currently display uri * Siblings of the node are on the left, children are on the right */ _currentPath; _fromResolver; /** * Currently selected navigation item */ _currentNavigationItem; defaultViewIcon = 'filter_alt'; customItemsInitialized; hiddenCustomItemsInitialized; itemClicked; itemLoaded; constructor(_log, _config, _activatedRoute, _caseResourceService, _accessService, _translateService, _dynamicRoutingService, _redirectService, _pathService, _userService) { this._log = _log; this._config = _config; this._activatedRoute = _activatedRoute; this._caseResourceService = _caseResourceService; this._accessService = _accessService; this._translateService = _translateService; this._dynamicRoutingService = _dynamicRoutingService; this._redirectService = _redirectService; this._pathService = _pathService; this._userService = _userService; this._leftItems$ = new BehaviorSubject([]); this._rightItems$ = new BehaviorSubject([]); this._moreItems$ = new BehaviorSubject([]); this._hiddenCustomItems$ = new BehaviorSubject([]); this._childCustomViews = {}; this._leftLoading$ = new LoadingEmitter(); this._rightLoading$ = new LoadingEmitter(); this._nodeLoading$ = new LoadingEmitter(); this._currentNavigationItem = undefined; this.itemsOrder = MenuOrder.Ascending; this.customItemsInitialized = false; this.hiddenCustomItemsInitialized = false; this.itemClicked = new EventEmitter(); this.itemLoaded = new EventEmitter(); } ngOnDestroy() { this._currentPathSubscription?.unsubscribe(); this._leftLoading$.complete(); this._rightLoading$.complete(); this._nodeLoading$.complete(); this.itemClicked.complete(); this.itemLoaded.complete(); } get canGoBackLoading$() { return this._nodeLoading$; } get currentPath() { return this._currentPath; } set currentPath(path) { if (path === this._currentPath || this.leftLoading$.isActive || this.rightLoading$.isActive) { return; } this._currentPath = path; if (!path) { return; } if (this.nodeLoading$.isActive) { this.nodeLoading$.subscribe(() => { this.resolveMenuItems(path); }); } else { this.resolveMenuItems(path); } } set currentNavigationItem(item) { this._currentNavigationItem = item; } resolveMenuItems(path) { if (path === PathService.SEPARATOR) { this._leftItems$.next([]); this.loadRightSide(); } else { if (!this.leftItems.find(item => item.resource?.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH)?.value === path)) { this.loadLeftSide(); } this.loadRightSide(); } } get itemClicked$() { return this.itemClicked; } get itemLoaded$() { return this.itemLoaded; } get rightItems$() { return this._rightItems$; } get leftItems$() { return this._leftItems$; } get moreItems$() { return this._moreItems$; } get hiddenCustomItems$() { return this._hiddenCustomItems$; } get rightItems() { return this._rightItems$.getValue(); } get leftItems() { return this._leftItems$.getValue(); } get moreItems() { return this._moreItems$.getValue(); } get hiddenCustomItems() { return this._hiddenCustomItems$.getValue(); } get leftLoading$() { return this._leftLoading$; } get rightLoading$() { return this._rightLoading$; } get nodeLoading$() { return this._nodeLoading$; } set fromResolver(value) { this._fromResolver = value; } loadNavigationItems(node) { if (this.currentPath === PathService.SEPARATOR) { this._leftItems$.next([]); this.loadRightSide(); } else { if (!this._leftItems$.getValue().find(item => DoubleDrawerUtils.isNodeCorrespondingToItem(node, item))) { this.loadLeftSide(); } this.loadRightSide(); } } /** * On home click, the current level is set to 0, and current parent is * set to root node. * */ onHomeClick() { if (this.leftLoading$.isActive || this.rightLoading$.isActive) { return; } this._pathService.activePath = PathService.SEPARATOR; } /** * On back click, the parent is set to parent of left nodes, that will solve * the right side menu (elements that were in left side, after backward * navigation will be on the right side). * Current level is set to a lower number in order to set the left side menu. * */ onBackClick() { if (this.leftLoading$.isActive || this.rightLoading$.isActive || this.currentPath === PathService.SEPARATOR) { return; } this._pathService.activePath = this.extractParentPath(this.currentPath); this.itemClicked.emit({ path: this._pathService.activePath, isHome: false }); } /** * On item click, the selected item's view is rendered (by routerLink). If the selected item has children items, the menu is updated * and view, that is rendered is selected by the defined rule. The rule is: On first check for default view in children. * On second check if the clicked item has a view. On third, pick any other children's view, else show nothing. * */ onItemClick(item) { this._currentNavigationItem = item; if (item.resource === undefined) { // custom view represented only in nae.json if (item.processUri === this.currentPath) { this._pathService.activePath = this.currentPath; } else { this._pathService.activePath = this.extractParentPath(this.currentPath); } this.itemClicked.emit({ path: this._pathService.activePath, isHome: false }); } else { const path = item.resource.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH)?.value; if (DoubleDrawerUtils.hasItemChildren(item) && !this.leftLoading$.isActive && !this.rightLoading$.isActive) { this._pathService.activePath = path; this.itemClicked.emit({ path: this._pathService.activePath, isHome: false }); this._rightLoading$.pipe(filter(isRightLoading => isRightLoading === false), take(1)).subscribe(() => { this.openAvailableView(); }); } else if (!path.includes(this.currentPath)) { this._pathService.activePath = this.extractParentPath(this.currentPath); this.itemClicked.emit({ path: this._pathService.activePath, isHome: false }); } else { this._pathService.activePath = this.currentPath; this.itemClicked.emit({ path: this._pathService.activePath, isHome: false }); } } } /** * Opens a view of the current right items in the menu by defined rule. The rule is: First, it checks whether a navigation * item was clicked. Second, check for default view in children. * Third check if the clicked item has a view. Fourth, pick any other children's view, else * show nothing. * */ openAvailableView() { let allItems = this.rightItems.concat(this.moreItems); if (this._currentNavigationItem) { let alreadyClickedItem = allItems.find(item => item.id === this._currentNavigationItem.id); if (!!alreadyClickedItem) { // when the folder has not changed and a menu item is clicked. return; } } if (this._fromResolver) { this._fromResolver = false; return; } let autoOpenItems = allItems.filter(item => DoubleDrawerUtils.hasItemAutoOpenView(item)); if (autoOpenItems.length > 0) { this._redirectService.redirect(autoOpenItems[0].routing.path); return; } if (DoubleDrawerUtils.hasItemView(this._currentNavigationItem)) { // is routed by routerLink on item click return; } let itemsWithView = allItems.filter(item => DoubleDrawerUtils.hasItemView(item)); if (itemsWithView.length > 0) { this._redirectService.redirect(autoOpenItems[0].routing.path); } } loadMoreItems() { if (this.moreItems.length > RIGHT_SIDE_NEW_PAGE_SIZE) { let currentRightItems = this.rightItems; let currentMoreItems = this.moreItems; currentRightItems.push(...currentMoreItems.splice(0, RIGHT_SIDE_NEW_PAGE_SIZE)); this.rightItems$.next(currentRightItems); this.moreItems$.next(currentMoreItems); } else { let currentRightItems = this.rightItems; currentRightItems.push(...this.moreItems); this.rightItems$.next(currentRightItems); this.moreItems$.next([]); } } initializeCustomViewsOfView(view, viewConfigPath) { if (!view || this.customItemsInitialized || this.hiddenCustomItemsInitialized) return; Object.entries(view.children).forEach(([key, childView]) => { const childViewConfigPath = viewConfigPath + '/' + key; this.resolveUriForChildViews(childViewConfigPath, childView); this.resolveHiddenMenuItemFromChildViews(childViewConfigPath, childView); }); this.resolveCustomViewsInRightSide(); this.resolveCustomViewsInLeftSide(); this.customItemsInitialized = true; this.hiddenCustomItemsInitialized = true; } switchOrder() { this.itemsOrder = (this.itemsOrder + 1) % 2; let multiplier = 1; if (this.itemsOrder === MenuOrder.Descending) { multiplier = -1; } let currentRightItems = this.rightItems; let currentLeftItems = this.leftItems; currentRightItems.sort((a, b) => multiplier * a?.navigation?.title.localeCompare(b?.navigation?.title)); currentLeftItems.sort((a, b) => multiplier * a?.navigation?.title.localeCompare(b?.navigation?.title)); this.rightItems$.next(currentRightItems); this.leftItems$.next(currentLeftItems); } isAscending() { return this.itemsOrder === MenuOrder.Ascending; } loadLeftSide() { if (this.currentPath === PathService.SEPARATOR) { this._leftItems$.next([]); return; } this.leftLoading$.on(); this.getItemCaseByPath(this.extractParentPath(this.currentPath)).subscribe(page => { let childCases$; let targetItem; let orderedChildCaseIds; if (page?.pagination?.totalElements === 0) { childCases$ = of([]); } else { targetItem = page.content[0]; orderedChildCaseIds = DoubleDrawerUtils.extractChildCaseIds(targetItem); if (orderedChildCaseIds == undefined || orderedChildCaseIds.length === 0) { childCases$ = of([]); } else { childCases$ = this.getItemCasesByIdsInOnePage(orderedChildCaseIds).pipe(map(p => p.content)); } } childCases$.subscribe(result => { result = result.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i); this._leftItems$.next(result.sort((a, b) => orderedChildCaseIds.indexOf(a.resource.stringId) - orderedChildCaseIds.indexOf(b.resource.stringId))); this.resolveCustomViewsInLeftSide(); this._leftLoading$.off(); this.itemLoaded.emit({ menu: 'left', items: this.leftItems }); }, error => { this._log.error(error); this._leftItems$.next([]); this.resolveCustomViewsInLeftSide(); this._leftLoading$.off(); }); }, error => { this._log.error(error); this._leftItems$.next([]); this.resolveCustomViewsInLeftSide(); this._leftLoading$.off(); }); } loadRightSide() { this._rightLoading$.on(); this._moreItems$.next([]); this.getItemCaseByPath(this.currentPath).subscribe(page => { let childCases$; let targetItem; let orderedChildCaseIds; if (page?.pagination?.totalElements === 0) { childCases$ = of([]); } else { targetItem = page?.content[0]; orderedChildCaseIds = DoubleDrawerUtils.extractChildCaseIds(targetItem); if (orderedChildCaseIds === undefined || orderedChildCaseIds.length === 0) { childCases$ = of([]); } else { childCases$ = this.getItemCasesByIdsInOnePage(orderedChildCaseIds).pipe(map(p => p.content)); } } childCases$.subscribe(result => { result = result.sort((a, b) => orderedChildCaseIds.indexOf(a.stringId) - orderedChildCaseIds.indexOf(b.stringId)); if (result.length > RIGHT_SIDE_INIT_PAGE_SIZE) { const rawRightItems = result.splice(0, RIGHT_SIDE_INIT_PAGE_SIZE); this._rightItems$.next(rawRightItems.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i)); this._moreItems$.next(result.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i)); } else { this._rightItems$.next(result.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i)); } this.resolveCustomViewsInRightSide(); this._rightLoading$.off(); this.itemLoaded.emit({ menu: 'right', items: this.rightItems }); this.openAvailableView(); }, error => { this._log.error(error); this._rightItems$.next([]); this._moreItems$.next([]); this.resolveCustomViewsInRightSide(); this._rightLoading$.off(); }); }, error => { this._log.error(error); this._rightItems$.next([]); this._moreItems$.next([]); this.resolveCustomViewsInRightSide(); this._rightLoading$.off(); }); } getItemCasesByIdsInOnePage(caseIds) { return this.getItemCasesByIds(caseIds, 0, caseIds.length); } getItemCasesByIds(caseIds, pageNumber, pageSize) { const searchBody = { id: caseIds, process: MENU_IDENTIFIERS.map(id => ({ identifier: id })), }; let httpParams = new HttpParams() .set(PaginationParams.PAGE_SIZE, pageSize) .set(PaginationParams.PAGE_NUMBER, pageNumber); return this._caseResourceService.searchCases(SimpleFilter.fromCaseQuery(searchBody), httpParams); } resolveItemCaseToNavigationItem(itemCase) { if (DoubleDrawerUtils.representsRootNode(itemCase)) { return; } const item = { access: {}, navigation: { icon: itemCase.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_MENU_ICON)?.value || this.defaultViewIcon, title: this.getTranslation(itemCase.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_MENU_NAME)?.value) || itemCase.title, }, routing: { path: this.getItemRoutingPath(itemCase), }, id: itemCase.stringId, resource: itemCase, }; const resolvedRoles = DoubleDrawerUtils.resolveAccessRoles(itemCase, GroupNavigationConstants.ITEM_FIELD_ID_ALLOWED_ROLES); const resolvedBannedRoles = DoubleDrawerUtils.resolveAccessRoles(itemCase, GroupNavigationConstants.ITEM_FIELD_ID_BANNED_ROLES); if (!!resolvedRoles) item.access['role'] = resolvedRoles; if (!!resolvedBannedRoles) item.access['bannedRole'] = resolvedBannedRoles; if (!this._accessService.canAccessView(item, item.routing?.path)) return; return item; } resolveCustomViewsInLeftSide() { if (!!this.extractParentPath(this.currentPath) && !!this._childCustomViews[this.extractParentPath(this.currentPath)]) { let currentLeftItems = this._leftItems$.getValue(); currentLeftItems.push(...Object.values(this._childCustomViews[this.extractParentPath(this.currentPath)])); this._leftItems$.next(currentLeftItems); } } resolveCustomViewsInRightSide() { if (!!this._currentPath && !!this._childCustomViews[this._currentPath]) { let currentRightItems = this._rightItems$.getValue(); currentRightItems.push(...Object.values(this._childCustomViews[this._currentPath])); this._rightItems$.next(currentRightItems); } } resolveUriForChildViews(configPath, childView) { if (!childView.processUri) return; if (!this._accessService.canAccessView(childView, configPath)) return; if (!this._childCustomViews[childView.processUri]) { this._childCustomViews[childView.processUri] = {}; } this._childCustomViews[childView.processUri][configPath] = { id: configPath, ...childView, }; } resolveHiddenMenuItemFromChildViews(configPath, childView) { if (!childView.navigation) return; if (!this._accessService.canAccessView(childView, configPath)) return; if (!!(childView?.navigation?.hidden)) { let currentHiddenCustomItems = this._hiddenCustomItems$.getValue(); currentHiddenCustomItems.push({ id: configPath, ...childView, }); this._hiddenCustomItems$.next(currentHiddenCustomItems); } } getTranslation(value) { const locale = this._translateService.currentLang.split('-')[0]; return locale in value.translations ? value.translations[locale] : value.defaultValue; } getItemRoutingPath(itemCase) { const taskId = DoubleDrawerUtils.findTaskIdInCase(itemCase, SETTINGS_TRANSITION_ID); const url = this._dynamicRoutingService.route; const prefix = url.startsWith('/') ? '' : '/'; return `${prefix}${url}/${taskId}`; } processLeftItems(cases, orderedChildCaseIds) { const result = cases .map(folder => this.resolveItemCaseToNavigationItem(folder)) .filter(i => !!i); return result.sort((a, b) => orderedChildCaseIds.indexOf(a.resource.stringId) - orderedChildCaseIds.indexOf(b.resource.stringId)); } /** * Retrieves a case item based on the given path. * @param {string} [path] - The identifier path to locate the specific case item. If undefined, it defaults to searching without a specific path. * @return {Observable<Page<Case>>} An observable stream containing the page of case items which match the provided path. */ getItemCaseByPath(path) { const searchBody = { data: { [GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH]: path }, process: { identifier: "menu_item" } }; let httpParams = new HttpParams() .set(PaginationParams.PAGE_SIZE, 1) .set(PaginationParams.PAGE_NUMBER, 0); return this._caseResourceService.searchCases(SimpleFilter.fromCaseQuery(searchBody), httpParams); } extractParentPath(path) { if (path === '/') { return path; } if (path?.lastIndexOf('/') === 0) { return '/'; } return path?.substring(0, path?.lastIndexOf('/')); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DoubleDrawerNavigationService, deps: [{ token: i1.LoggerService }, { token: i2.ConfigurationService }, { token: i3.ActivatedRoute }, { token: i4.CaseResourceService }, { token: i5.AccessService }, { token: i6.TranslateService }, { token: i7.DynamicNavigationRouteProviderService }, { token: i8.RedirectService }, { token: i9.PathService }, { token: i10.UserService }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DoubleDrawerNavigationService, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DoubleDrawerNavigationService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: () => [{ type: i1.LoggerService }, { type: i2.ConfigurationService }, { type: i3.ActivatedRoute }, { type: i4.CaseResourceService }, { type: i5.AccessService }, { type: i6.TranslateService }, { type: i7.DynamicNavigationRouteProviderService }, { type: i8.RedirectService }, { type: i9.PathService }, { type: i10.UserService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG91YmxlLWRyYXdlci1uYXZpZ2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL25hdmlnYXRpb24vbmF2aWdhdGlvbi1kb3VibGUtZHJhd2VyL3NlcnZpY2UvZG91YmxlLWRyYXdlci1uYXZpZ2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxFQUFDLGVBQWUsRUFBYyxFQUFFLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRzlELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUMvRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFZbEUsT0FBTyxFQUNILGdCQUFnQixFQUNoQixTQUFTLEVBRVQseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4QixzQkFBc0IsRUFDekIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUd4QyxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7OztBQUd2RDs7S0FFSztBQUlMLE1BQU0sT0FBTyw2QkFBNkI7SUE0Q3hCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNB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QUcsS0FBSzthQUNmLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMzRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ3hCLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUN0RyxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxJQUFhO1FBQzNCLE1BQU0sVUFBVSxHQUEwQjtZQUN0QyxJQUFJLEVBQUU7Z0JBQ0YsQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLElBQUk7YUFDM0Q7WUFDRCxPQUFPLEVBQUUsRUFBQyxVQUFVLEVBQUUsV0FBVyxFQUFDO1NBQ3JDLENBQUM7UUFFRixJQUFJLFVBQVUsR0FBRyxJQUFJLFVBQVUsRUFBRTthQUM1QixHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQzthQUNsQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxJQUFZO1FBQ2pDLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRTtZQUNkLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzlCLE9BQU8sR0FBRyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO3dHQTFqQlEsNkJBQTZCOzRHQUE3Qiw2QkFBNkIsY0FGMUIsTUFBTTs7NEZBRVQsNkJBQTZCO2tCQUh6QyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtMb2FkaW5nRW1pdHRlcn0gZnJvbSBcIi4uLy