@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
178 lines • 31.5 kB
JavaScript
import { Inject, Injectable, Optional } from '@angular/core';
import { SideMenuSize } from '../../side-menu/models/side-menu-size';
import { TaskHandlingService } from './task-handling-service';
import { NAE_TASK_OPERATIONS } from '../models/task-operations-injection-token';
import { UserValue } from '../../data-fields/user-field/models/user-value';
import { NAE_USER_ASSIGN_COMPONENT } from '../../side-menu/content-components/injection-tokens';
import { createTaskEventNotification } from '../../task-content/model/task-event-notification';
import { TaskEvent } from '../../task-content/model/task-event';
import { take } from 'rxjs/operators';
import { QueuedEvent } from '../../event-queue/model/queued-event';
import { AfterAction } from '../../utility/call-chain/after-action';
import * as i0 from "@angular/core";
import * as i1 from "../../logger/services/logger.service";
import * as i2 from "../../side-menu/services/side-menu.service";
import * as i3 from "../../resources/engine-endpoint/task-resource.service";
import * as i4 from "../../snack-bar/services/snack-bar.service";
import * as i5 from "@ngx-translate/core";
import * as i6 from "./task-request-state.service";
import * as i7 from "../../task-content/services/task-event.service";
import * as i8 from "./task-data.service";
import * as i9 from "../../event-queue/services/event-queue.service";
import * as i10 from "../../event/services/event.service";
import * as i11 from "../../changed-fields/services/changed-fields.service";
import * as i12 from "./selected-case.service";
import * as i13 from "../../task-content/services/task-content.service";
/**
* Service that handles the logic of delegating a task.
*/
export class DelegateTaskService extends TaskHandlingService {
_log;
_sideMenuService;
_taskResourceService;
_snackBar;
_translate;
_taskState;
_taskEvent;
_taskDataService;
_eventQueue;
_eventService;
_changedFieldsService;
_taskOperations;
_userAssignComponent;
constructor(_log, _sideMenuService, _taskResourceService, _snackBar, _translate, _taskState, _taskEvent, _taskDataService, _eventQueue, _eventService, _changedFieldsService, _taskOperations, _userAssignComponent, _selectedCaseService, _taskContentService) {
super(_taskContentService, _selectedCaseService);
this._log = _log;
this._sideMenuService = _sideMenuService;
this._taskResourceService = _taskResourceService;
this._snackBar = _snackBar;
this._translate = _translate;
this._taskState = _taskState;
this._taskEvent = _taskEvent;
this._taskDataService = _taskDataService;
this._eventQueue = _eventQueue;
this._eventService = _eventService;
this._changedFieldsService = _changedFieldsService;
this._taskOperations = _taskOperations;
this._userAssignComponent = _userAssignComponent;
}
/**
* Performs the 'delegate' operation on the task held by {@link TaskContentService}.
*
* Doesn't send any requests if the loading indicator is in it's active state.
* Otherwise sets the indicator to the active state and disables it once the request response is received.
*
* The argument can be used to chain operations together,
* or to execute code conditionally based on the success state of the delegate operation.
*
* If the task held within the {@link TaskContentService} changes before a response is received, the response will be ignored
* and the `afterAction` will not be executed.
* @param afterAction if delegate completes successfully `true` will be emitted into this Subject, otherwise `false` will be emitted
*/
delegate(afterAction = new AfterAction()) {
const delegatedTaskId = this._safeTask.stringId;
if (this._taskState.isLoading(delegatedTaskId)) {
return;
}
this._sideMenuService.open(this._userAssignComponent, SideMenuSize.MEDIUM, {
roles: Object.keys(this._safeTask.roles).filter(role => this._safeTask.roles[role]['assign'] !== undefined && this._safeTask.roles[role]['assign']),
value: !this._safeTask.assignee ? undefined : new UserValue(this._safeTask.assignee.id, this._safeTask.assignee.realmId, this._safeTask.assignee.fullName?.split(' ')[0] ?? '', this._safeTask.assignee.fullName?.split(' ').slice(1).join(' ') ?? '', this._safeTask.assignee.fullName, this._safeTask.assignee.username),
negativeRoles: Object.keys(this._safeTask.roles).filter(role => this._safeTask.roles[role]['assign'] !== undefined && !this._safeTask.roles[role]['assign'])
}).onClose.subscribe(event => {
this._log.debug('Delegate sidemenu event:' + event);
if (event.data === undefined) {
return;
}
this._eventQueue.scheduleEvent(new QueuedEvent(() => {
const result = this.isTaskRelevant(delegatedTaskId);
if (!result) {
this._log.debug('current task changed before the delegate side menu data was received, discarding...');
}
return result;
}, nextEvent => {
this.performDelegateRequest(afterAction, delegatedTaskId, event.data.id, nextEvent);
}));
});
}
/**
* Performs a `delegate` request on the task currently stored in the `taskContent` service
* @param afterAction the action that should be performed after the request is processed
* @param delegatedTaskId id of the task that is being delegated
* @param delegatedUserId id of the user whom the task is being delegated
* @param nextEvent indicates to the event queue that the next event can be processed
*/
performDelegateRequest(afterAction, delegatedTaskId, delegatedUserId, nextEvent) {
this._taskState.startLoading(delegatedTaskId);
this._taskResourceService.delegateTask(this._safeTask.stringId, delegatedUserId).pipe(take(1)).subscribe((outcomeResource) => {
this._taskState.stopLoading(delegatedTaskId);
if (!this.isTaskRelevant(delegatedTaskId)) {
this._log.debug('current task changed before the delegate response could be received, discarding...');
nextEvent.resolve(false);
return;
}
if (outcomeResource.success) {
this._taskContentService.updateStateData(outcomeResource.outcome);
const changedFieldsMap = this._eventService
.parseChangedFieldsFromOutcomeTree(outcomeResource.outcome);
if (!!changedFieldsMap) {
this._changedFieldsService.emitChangedFields(changedFieldsMap);
}
this.completeSuccess(afterAction, nextEvent, outcomeResource.outcome);
}
else if (outcomeResource.error) {
this._snackBar.openErrorSnackBar(outcomeResource.error);
this.completeActions(afterAction, nextEvent, false);
}
}, error => {
this._taskState.stopLoading(delegatedTaskId);
this._log.debug('getting task data failed', error);
if (!this.isTaskRelevant(delegatedTaskId)) {
this._log.debug('current task changed before the delegate error could be received');
nextEvent.resolve(false);
return;
}
this._snackBar.openErrorSnackBar(`${this._translate.instant('tasks.snackbar.assignTask')}
${this._task} ${this._translate.instant('tasks.snackbar.failed')}`);
this.completeActions(afterAction, nextEvent, false);
});
}
/**
* Reloads the task and emits `true` to the `afterAction` stream
*/
completeSuccess(afterAction, nextEvent, outcome) {
this._taskOperations.reload();
this.completeActions(afterAction, nextEvent, true, outcome);
}
/**
* Completes all the action streams and sends the notification, with the provided result
*/
completeActions(afterAction, nextEvent, result, outcome) {
this.sendNotification(result, outcome);
afterAction.resolve(result);
nextEvent.resolve(result);
}
/**
* Publishes a delegate notification to the {@link TaskEventService}
* @param success whether the delegate operation was successful or not
* @param outcome
*/
sendNotification(success, outcome) {
this._taskEvent.publishTaskEvent(createTaskEventNotification(this._safeTask, TaskEvent.DELEGATE, success, outcome));
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DelegateTaskService, deps: [{ token: i1.LoggerService }, { token: i2.SideMenuService }, { token: i3.TaskResourceService }, { token: i4.SnackBarService }, { token: i5.TranslateService }, { token: i6.TaskRequestStateService }, { token: i7.TaskEventService }, { token: i8.TaskDataService }, { token: i9.EventQueueService }, { token: i10.EventService }, { token: i11.ChangedFieldsService }, { token: NAE_TASK_OPERATIONS }, { token: NAE_USER_ASSIGN_COMPONENT, optional: true }, { token: i12.SelectedCaseService, optional: true }, { token: i13.TaskContentService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DelegateTaskService });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DelegateTaskService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.LoggerService }, { type: i2.SideMenuService }, { type: i3.TaskResourceService }, { type: i4.SnackBarService }, { type: i5.TranslateService }, { type: i6.TaskRequestStateService }, { type: i7.TaskEventService }, { type: i8.TaskDataService }, { type: i9.EventQueueService }, { type: i10.EventService }, { type: i11.ChangedFieldsService }, { type: undefined, decorators: [{
type: Inject,
args: [NAE_TASK_OPERATIONS]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NAE_USER_ASSIGN_COMPONENT]
}] }, { type: i12.SelectedCaseService, decorators: [{
type: Optional
}] }, { type: i13.TaskContentService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZWdhdGUtdGFzay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi90YXNrL3NlcnZpY2VzL2RlbGVnYXRlLXRhc2suc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBUW5FLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBRzlFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnREFBZ0QsQ0FBQztBQUV6RSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxxREFBcUQsQ0FBQztBQUM5RixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFHOUQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBSXBDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQU9sRTs7R0FFRztBQUVILE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxtQkFBbUI7SUFFbEM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUM2QjtJQUNrQjtJQVpyRSxZQUFzQixJQUFtQixFQUNuQixnQkFBaUMsRUFDakMsb0JBQXlDLEVBQ3pDLFNBQTBCLEVBQzFCLFVBQTRCLEVBQzVCLFVBQW1DLEVBQ25DLFVBQTRCLEVBQzVCLGdCQUFpQyxFQUNqQyxXQUE4QixFQUM5QixhQUEyQixFQUMzQixxQkFBMkMsRUFDZCxlQUErQixFQUNiLG9CQUF5QixFQUN0RSxvQkFBeUMsRUFDckQsbUJBQXVDO1FBQy9DLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBZi9CLFNBQUksR0FBSixJQUFJLENBQWU7UUFDbkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUNqQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQ3pDLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBQzFCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzVCLGVBQVUsR0FBVixVQUFVLENBQXlCO1FBQ25DLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzVCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFDakMsZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBQzNCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBc0I7UUFDZCxvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDYix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQUs7SUFJOUYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLFFBQVEsQ0FBQyxjQUEyQixJQUFJLFdBQVcsRUFBRTtRQUN4RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUVoRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQzVDLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQ3JFO1lBQ0ksS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQ3JELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQ3JFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFDaEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUNuQztZQUNELGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQzNELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzNFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFF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UCx5QkFBeUI7NEdBZGhELG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVTs7MEJBY00sTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUMxQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLHlCQUF5Qjs7MEJBQzVDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtTaWRlTWVudVNpemV9IGZyb20gJy4uLy4uL3NpZGUtbWVudS9tb2RlbHMvc2lkZS1tZW51LXNpemUnO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtTaWRlTWVudVNlcnZpY2V9IGZyb20gJy4uLy4uL3NpZGUtbWVudS9zZXJ2aWNlcy9zaWRlLW1lbnUuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tSZXNvdXJjZVNlcnZpY2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9lbmdpbmUtZW5kcG9pbnQvdGFzay1yZXNvdXJjZS5zZXJ2aWNlJztcbmltcG9ydCB7VGFza0NvbnRlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvc2VydmljZXMvdGFzay1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtTbmFja0JhclNlcnZpY2V9IGZyb20gJy4uLy4uL3NuYWNrLWJhci9zZXJ2aWNlcy9zbmFjay1iYXIuc2VydmljZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtUYXNrUmVxdWVzdFN0YXRlU2VydmljZX0gZnJvbSAnLi90YXNrLXJlcXVlc3Qtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tIYW5kbGluZ1NlcnZpY2V9IGZyb20gJy4vdGFzay1oYW5kbGluZy1zZXJ2aWNlJztcbmltcG9ydCB7TkFFX1RBU0tfT1BFUkFUSU9OU30gZnJvbSAnLi4vbW9kZWxzL3Rhc2stb3BlcmF0aW9ucy1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHtUYXNrT3BlcmF0aW9uc30gZnJvbSAnLi4vaW50ZXJmYWNlcy90YXNrLW9wZXJhdGlvbnMnO1xuaW1wb3J0IHtVc2VyTGlzdEluamVjdGVkRGF0YX0gZnJvbSAnLi4vLi4vc2lkZS1tZW51L2NvbnRlbnQtY29tcG9uZW50cy91c2VyLWFzc2lnbi9tb2RlbC91c2VyLWxpc3QtaW5qZWN0ZWQtZGF0YSc7XG5pbXBvcnQge1VzZXJWYWx1ZX0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvdXNlci1maWVsZC9tb2RlbHMvdXNlci12YWx1ZSc7XG5pbXBvcnQge1NlbGVjdGVkQ2FzZVNlcnZpY2V9IGZyb20gJy4vc2VsZWN0ZWQtY2FzZS5zZXJ2aWNlJztcbmltcG9ydCB7TkFFX1VTRVJfQVNTSUdOX0NPTVBPTkVOVH0gZnJvbSAnLi4vLi4vc2lkZS1tZW51L2NvbnRlbnQtY29tcG9uZW50cy9pbmplY3Rpb24tdG9rZW5zJztcbmltcG9ydCB7Y3JlYXRlVGFza0V2ZW50Tm90aWZpY2F0aW9ufSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvbW9kZWwvdGFzay1ldmVudC1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHtUYXNrRXZlbnR9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9tb2RlbC90YXNrLWV2ZW50JztcbmltcG9ydCB7VGFza0V2ZW50U2VydmljZX0gZnJvbSAnLi4vLi4vdGFzay1jb250ZW50L3NlcnZpY2VzL3Rhc2stZXZlbnQuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tEYXRhU2VydmljZX0gZnJvbSAnLi90YXNrLWRhdGEuc2VydmljZSc7XG5pbXBvcnQge3Rha2V9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7RGVsZWdhdGVUYXNrRXZlbnRPdXRjb21lfSBmcm9tICcuLi8uLi9ldmVudC9tb2RlbC9ldmVudC1vdXRjb21lcy90YXNrLW91dGNvbWVzL2RlbGVnYXRlLXRhc2stZXZlbnQtb3V0Y29tZSc7XG5pbXBvcnQge0V2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZX0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9tZXNzYWdlLXJlc291cmNlJztcbmltcG9ydCB7RXZlbnRRdWV1ZVNlcnZpY2V9IGZyb20gJy4uLy4uL2V2ZW50LXF1ZXVlL3NlcnZpY2VzL2V2ZW50LXF1ZXVlLnNlcnZpY2UnO1xuaW1wb3J0IHtRdWV1ZWRFdmVudH0gZnJvbSAnLi4vLi4vZXZlbnQtcXVldWUvbW9kZWwvcXVldWVkLWV2ZW50JztcbmltcG9ydCB7QWZ0ZXJBY3Rpb259IGZyb20gJy4uLy4uL3V0aWxpdHkvY2FsbC1jaGFpbi9hZnRlci1hY3Rpb24nO1xuaW1wb3J0IHtDaGFuZ2VkRmllbGRzU2VydmljZX0gZnJvbSAnLi4vLi4vY2hhbmdlZC1maWVsZHMvc2VydmljZXMvY2hhbmdlZC1maWVsZHMuc2VydmljZSc7XG5pbXBvcnQge0V2ZW50U2VydmljZX0gZnJvbSAnLi4vLi4vZXZlbnQvc2VydmljZXMvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQge0NoYW5nZWRGaWVsZHNNYXB9IGZyb20gJy4uLy4uL2V2ZW50L3NlcnZpY2VzL2ludGVyZmFjZXMvY2hhbmdlZC1maWVsZHMtbWFwJztcbmltcG9ydCB7VGFza0V2ZW50T3V0Y29tZX0gZnJvbSAnLi4vLi4vZXZlbnQvbW9kZWwvZXZlbnQtb3V0Y29tZXMvdGFzay1vdXRjb21lcy90YXNrLWV2ZW50LW91dGNvbWUnO1xuXG5cbi8qKlxuICogU2VydmljZSB0aGF0IGhhbmRsZXMgdGhlIGxvZ2ljIG9mIGRlbGVnYXRpbmcgYSB0YXNrLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGVsZWdhdGVUYXNrU2VydmljZSBleHRlbmRzIFRhc2tIYW5kbGluZ1NlcnZpY2Uge1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9zaWRlTWVudVNlcnZpY2U6IFNpZGVNZW51U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tSZXNvdXJjZVNlcnZpY2U6IFRhc2tSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9zbmFja0JhcjogU25hY2tCYXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdGFza1N0YXRlOiBUYXNrUmVxdWVzdFN0YXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tFdmVudDogVGFza0V2ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tEYXRhU2VydmljZTogVGFza0RhdGFTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfZXZlbnRRdWV1ZTogRXZlbnRRdWV1ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9ldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2NoYW5nZWRGaWVsZHNTZXJ2aWNlOiBDaGFuZ2VkRmllbGRzU2VydmljZSxcbiAgICAgICAgICAgICAgICBASW5qZWN0KE5BRV9UQVNLX09QRVJBVElPTlMpIHByb3RlY3RlZCBfdGFza09wZXJhdGlvbnM6IFRhc2tPcGVyYXRpb25zLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkFFX1VTRVJfQVNTSUdOX0NPTVBPTkVOVCkgcHJvdGVjdGVkIF91c2VyQXNzaWduQ29tcG9uZW50OiBhbnksXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgX3NlbGVjdGVkQ2FzZVNlcnZpY2U6IFNlbGVjdGVkQ2FzZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgX3Rhc2tDb250ZW50U2VydmljZTogVGFza0NvbnRlbnRTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKF90YXNrQ29udGVudFNlcnZpY2UsIF9zZWxlY3RlZENhc2VTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgJ2RlbGVnYXRlJyBvcGVyYXRpb24gb24gdGhlIHRhc2sgaGVsZCBieSB7QGxpbmsgVGFza0NvbnRlbnRTZXJ2aWNlfS5cbiAgICAgKlxuICAgICAqIERvZXNuJ3Qgc2VuZCBhbnkgcmVxdWVzdHMgaWYgdGhlIGxvYWRpbmcgaW5kaWNhdG9yIGlzIGluIGl0J3MgYWN0aXZlIHN0YXRlLlxuICAgICAqIE90aGVyd2lzZSBzZXRzIHRoZSBpbmRpY2F0b3IgdG8gdGhlIGFjdGl2ZSBzdGF0ZSBhbmQgZGlzYWJsZXMgaXQgb25jZSB0aGUgcmVxdWVzdCByZXNwb25zZSBpcyByZWNlaXZlZC5cbiAgICAgKlxuICAgICAqIFRoZSBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBjaGFpbiBvcGVyYXRpb25zIHRvZ2V0aGVyLFxuICAgICAqIG9yIHRvIGV4ZWN1dGUgY29kZSBjb25kaXRpb25hbGx5IGJhc2VkIG9uIHRoZSBzdWNjZXNzIHN0YXRlIG9mIHRoZSBkZWxlZ2F0ZSBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBJZiB0aGUgdGFzayBoZWxkIHdpdGhpbiB0aGUge0BsaW5rIFRhc2tDb250ZW50U2VydmljZX0gY2hhbmdlcyBiZWZvcmUgYSByZXNwb25zZSBpcyByZWNlaXZlZCwgdGhlIHJlc3BvbnNlIHdpbGwgYmUgaWdub3JlZFxuICAgICAqIGFuZCB0aGUgYGFmdGVyQWN0aW9uYCB3aWxsIG5vdCBiZSBleGVjdXRlZC5cbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gaWYgZGVsZWdhdGUgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBgdHJ1ZWAgd2lsbCBiZSBlbWl0dGVkIGludG8gdGhpcyBTdWJqZWN0LCBvdGhlcndpc2UgYGZhbHNlYCB3aWxsIGJlIGVtaXR0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZWdhdGUoYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uID0gbmV3IEFmdGVyQWN0aW9uKCkpIHtcbiAgICAgICAgY29uc3QgZGVsZWdhdGVkVGFza0lkID0gdGhpcy5fc2FmZVRhc2suc3RyaW5nSWQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX3Rhc2tTdGF0ZS5pc0xvYWRpbmcoZGVsZWdhdGVkVGFza0lkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NpZGVNZW51U2VydmljZS5vcGVuKHRoaXMuX3VzZXJBc3NpZ25Db21wb25lbnQsIFNpZGVNZW51U2l6ZS5NRURJVU0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcm9sZXM6IE9iamVjdC5rZXlzKHRoaXMuX3NhZmVUYXNrLnJvbGVzKS5maWx0ZXIocm9sZSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYWZlVGFzay5yb2xlc1tyb2xlXVsnYXNzaWduJ10gIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9zYWZlVGFzay5yb2xlc1tyb2xlXVsnYXNzaWduJ10pLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAhdGhpcy5fc2FmZVRhc2suYXNzaWduZWUgPyB1bmRlZmluZWQgOiBuZXcgVXNlclZhbHVlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYWZlVGFzay5hc3NpZ25lZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2FmZVRhc2suYXNzaWduZWUucmVhbG1JZCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2FmZVRhc2suYXNzaWduZWUuZnVsbE5hbWU/LnNwbGl0KCcgJylbMF0gPz8gJycsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NhZmVUYXNrLmFzc2lnbmVlLmZ1bGxOYW1lPy5zcGxpdCgnICcpLnNsaWNlKDEpLmpvaW4oJyAnKSA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2FmZVRhc2suYXNzaWduZWUuZnVsbE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NhZmVUYXNrLmFzc2lnbmVlLnVzZXJuYW1lXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBuZWdhdGl2ZVJvbGVzOiBPYmplY3Qua2V5cyh0aGlzLl9zYWZlVGFzay5yb2xlcykuZmlsdGVyKHJvbGUgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2FmZVRhc2sucm9sZXNbcm9sZV1bJ2Fzc2lnbiddICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuX3NhZmVUYXNrLnJvbGVzW3JvbGVdWydhc3NpZ24nXSlcbiAgICAgICAgICAgIH0gYXMgVXNlckxpc3RJbmplY3RlZERhdGEpLm9uQ2xvc2Uuc3Vic2NyaWJlKGV2ZW50ID0+IHtcblxuICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdEZWxlZ2F0ZSBzaWRlbWVudSBldmVudDonICsgZXZlbnQpO1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZXZlbnRRdWV1ZS5zY2hlZHVsZUV2ZW50KG5ldyBRdWV1ZWRFdmVudChcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaXNUYXNrUmVsZXZhbnQoZGVsZWdhdGVkVGFza0lkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnY3VycmVudCB0YXNrIGNoYW5nZWQgYmVmb3JlIHRoZSBkZWxlZ2F0ZSBzaWRlIG1lbnUgZGF0YSB3YXMgcmVjZWl2ZWQsIGRpc2NhcmRpbmcuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbmV4dEV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtRGVsZWdhdGVSZXF1ZXN0KGFmdGVyQWN0aW9uLCBkZWxlZ2F0ZWRUYXNrSWQsIGV2ZW50LmRhdGEuaWQsIG5leHRFdmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgYGRlbGVnYXRlYCByZXF1ZXN0IG9uIHRoZSB0YXNrIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhlIGB0YXNrQ29udGVudGAgc2VydmljZVxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gZGVsZWdhdGVkVGFza0lkIGlkIG9mIHRoZSB0YXNrIHRoYXQgaXMgYmVpbmcgZGVsZWdhdGVkXG4gICAgICogQHBhcmFtIGRlbGVnYXRlZFVzZXJJZCBpZCBvZiB0aGUgdXNlciB3aG9tIHRoZSB0YXNrIGlzIGJlaW5nIGRlbGVnYXRlZFxuICAgICAqIEBwYXJhbSBuZXh0RXZlbnQgaW5kaWNhdGVzIHRvIHRoZSBldmVudCBxdWV1ZSB0aGF0IHRoZSBuZXh0IGV2ZW50IGNhbiBiZSBwcm9jZXNzZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcGVyZm9ybURlbGVnYXRlUmVxdWVzdChhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24sIGRlbGVnYXRlZFRhc2tJZDogc3RyaW5nLCBkZWxlZ2F0ZWRVc2VySWQ6IGFueSwgbmV4dEV2ZW50OiBBZnRlckFjdGlvbikge1xuICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RhcnRMb2FkaW5nKGRlbGVnYXRlZFRhc2tJZCk7XG4gICAgICAgIHRoaXMuX3Rhc2tSZXNvdXJjZVNlcnZpY2UuZGVsZWdhdGVUYXNrKHRoaXMuX3NhZmVUYXNrLnN0cmluZ0lkLCBkZWxlZ2F0ZWRVc2VySWQpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgKG91dGNvbWVSZXNvdXJjZTogRXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKGRlbGVnYXRlZFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVGFza1JlbGV2YW50KGRlbGVnYXRlZFRhc2tJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdjdXJyZW50IHRhc2sgY2hhbmdlZCBiZWZvcmUgdGhlIGRlbGVnYXRlIHJlc3BvbnNlIGNvdWxkIGJlIHJlY2VpdmVkLCBkaXNjYXJkaW5nLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvdXRjb21lUmVzb3VyY2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudXBkYXRlU3RhdGVEYXRhKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lIGFzIERlbGVnYXRlVGFza0V2ZW50T3V0Y29tZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRGaWVsZHNNYXA6IENoYW5nZWRGaWVsZHNNYXAgPSB0aGlzLl9ldmVudFNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJzZUNoYW5nZWRGaWVsZHNGcm9tT3V0Y29tZVRyZWUob3V0Y29tZVJlc291cmNlLm91dGNvbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoISFjaGFuZ2VkRmllbGRzTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VkRmllbGRzU2VydmljZS5lbWl0Q2hhbmdlZEZpZWxkcyhjaGFuZ2VkRmllbGRzTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlU3VjY2VzcyhhZnRlckFjdGlvbiwgbmV4dEV2ZW50LCBvdXRjb21lUmVzb3VyY2Uub3V0Y29tZSBhcyBEZWxlZ2F0ZVRhc2tFdmVudE91dGNvbWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0Y29tZVJlc291cmNlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW5FcnJvclNuYWNrQmFyKG91dGNvbWVSZXNvdXJjZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVBY3Rpb25zKGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKGRlbGVnYXRlZFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdnZXR0aW5nIHRhc2sgZGF0YSBmYWlsZWQnLCBlcnJvcik7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNUYXNrUmVsZXZhbnQoZGVsZWdhdGVkVGFza0lkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ2N1cnJlbnQgdGFzayBjaGFuZ2VkIGJlZm9yZSB0aGUgZGVsZWdhdGUgZXJyb3IgY291bGQgYmUgcmVjZWl2ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbkVycm9yU25hY2tCYXIoYCR7dGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLmFzc2lnblRhc2snKX1cbiAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5fdGFza30gJHt0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIuZmFpbGVkJyl9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZUFjdGlvbnMoYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCwgZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsb2FkcyB0aGUgdGFzayBhbmQgZW1pdHMgYHRydWVgIHRvIHRoZSBgYWZ0ZXJBY3Rpb25gIHN0cmVhbVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb21wbGV0ZVN1Y2Nlc3MoYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLCBuZXh0RXZlbnQ6IEFmdGVyQWN0aW9uLCBvdXRjb21lPzogVGFza0V2ZW50T3V0Y29tZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl90YXNrT3BlcmF0aW9ucy5yZWxvYWQoKTtcbiAgICAgICAgdGhpcy5jb21wbGV0ZUFjdGlvbnMoYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCwgdHJ1ZSwgb3V0Y29tZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGxldGVzIGFsbCB0aGUgYWN0aW9uIHN0cmVhbXMgYW5kIHNlbmRzIHRoZSBub3RpZmljYXRpb24sIHdpdGggdGhlIHByb3ZpZGVkIHJlc3VsdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb21wbGV0ZUFjdGlvbnMoYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLCBuZXh0RXZlbnQ6IEFmdGVyQWN0aW9uLCByZXN1bHQ6IGJvb2xlYW4sIG91dGNvbWU/OiBUYXNrRXZlbnRPdXRjb21lKSB7XG4gICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbihyZXN1bHQsIG91dGNvbWUpO1xuICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIG5leHRFdmVudC5yZXNvbHZlKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHVibGlzaGVzIGEgZGVsZWdhdGUgbm90aWZpY2F0aW9uIHRvIHRoZSB7QGxpbmsgVGFza0V2ZW50U2VydmljZX1cbiAgICAgKiBAcGFyYW0gc3VjY2VzcyB3aGV0aGVyIHRoZSBkZWxlZ2F0ZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgb3Igbm90XG4gICAgICogQHBhcmFtIG91dGNvbWVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2VuZE5vdGlmaWNhdGlvbihzdWNjZXNzOiBib29sZWFuLCBvdXRjb21lPzogVGFza0V2ZW50T3V0Y29tZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl90YXNrRXZlbnQucHVibGlzaFRhc2tFdmVudChjcmVhdGVUYXNrRXZlbnROb3RpZmljYXRpb24odGhpcy5fc2FmZVRhc2ssIFRhc2tFdmVudC5ERUxFR0FURSwgc3VjY2Vzcywgb3V0Y29tZSkpO1xuICAgIH1cbn1cbiJdfQ==