@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
178 lines • 30.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.userId ? undefined : new UserValue(this._safeTask.userId, '', '', '', ''),
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZWdhdGUtdGFzay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi90YXNrL3NlcnZpY2VzL2RlbGVnYXRlLXRhc2suc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBUW5FLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBRzlFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnREFBZ0QsQ0FBQztBQUV6RSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxxREFBcUQsQ0FBQztBQUM5RixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFHOUQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBSXBDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQU9sRTs7R0FFRztBQUVILE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxtQkFBbUI7SUFFbEM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUM2QjtJQUNrQjtJQVpyRSxZQUFzQixJQUFtQixFQUNuQixnQkFBaUMsRUFDakMsb0JBQXlDLEVBQ3pDLFNBQTBCLEVBQzFCLFVBQTRCLEVBQzVCLFVBQW1DLEVBQ25DLFVBQTRCLEVBQzVCLGdCQUFpQyxFQUNqQyxXQUE4QixFQUM5QixhQUEyQixFQUMzQixxQkFBMkMsRUFDZCxlQUErQixFQUNiLG9CQUF5QixFQUN0RSxvQkFBeUMsRUFDckQsbUJBQXVDO1FBQy9DLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBZi9CLFNBQUksR0FBSixJQUFJLENBQWU7UUFDbkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUNqQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQ3pDLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBQzFCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzVCLGVBQVUsR0FBVixVQUFVLENBQXlCO1FBQ25DLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzVCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFDakMsZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBQzNCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBc0I7UUFDZCxvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDYix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQUs7SUFJOUYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLFFBQVEsQ0FBQyxjQUEyQixJQUFJLFdBQVcsRUFBRTtRQUN4RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUVoRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQzVDLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQ3JFO1lBQ0ksS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUNyRCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQ3hDO1lBQ0QsYUFBYSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDM0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDM0UsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFFckQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDcEQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtnQkFDMUIsT0FBTzthQUNWO1lBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxXQUFXLENBQzFDLEdBQUcsRUFBRTtnQkFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNULElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHFGQUFxRixDQUFDLENBQUM7aUJBQzFHO2dCQUNELE9BQU8sTUFBTSxDQUFDO1lBQ2xCLENBQUMsRUFDRCxTQUFTLENBQUMsRUFBRTtnQkFDUixJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN4RixDQUFDLENBQ0osQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ08sc0JBQXNCLENBQUMsV0FBd0IsRUFBRSxlQUF1QixFQUFFLGVBQW9CLEVBQUUsU0FBc0I7UUFDNUgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUNwRyxDQUFDLGVBQTRDLEVBQUUsRUFBRTtZQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0ZBQW9GLENBQUMsQ0FBQztnQkFDdEcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDekIsT0FBTzthQUNWO1lBRUQsSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFO2dCQUN6QixJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxPQUFtQyxDQUFDLENBQUM7Z0JBQzlGLE1BQU0sZ0JBQWdCLEdBQXFCLElBQUksQ0FBQyxhQUFhO3FCQUN4RCxpQ0FBaUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyxDQUFDLGdCQUFnQixFQUFFO29CQUNwQixJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztpQkFDbEU7Z0JBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxPQUFtQyxDQUFDLENBQUM7YUFDckc7aUJBQU0sSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFO2dCQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ3ZEO1FBQ0wsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7Z0JBQ3BGLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pCLE9BQU87YUFDVjtZQUVELElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQzt1QkFDakYsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEQsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxlQUFlLENBQUMsV0FBd0IsRUFBRSxTQUFzQixFQUFFLE9BQTBCO1FBQ2xHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7O09BRUc7SUFDTyxlQUFlLENBQUMsV0FBd0IsRUFBRSxTQUFzQixFQUFFLE1BQWUsRUFBRSxPQUEwQjtRQUNuSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGdCQUFnQixDQUFDLE9BQWdCLEVBQUUsT0FBMEI7UUFDbkUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDeEgsQ0FBQzt3R0E1SVEsbUJBQW1CLHlYQWFSLG1CQUFtQixhQUNQLHlCQUF5Qjs0R0FkaEQsbUJBQW1COzs0RkFBbkIsbUJBQW1CO2tCQUQvQixVQUFVOzswQkFjTSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMseUJBQXlCOzswQkFDNUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NpZGVNZW51U2l6ZX0gZnJvbSAnLi4vLi4vc2lkZS1tZW51L21vZGVscy9zaWRlLW1lbnUtc2l6ZSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1NpZGVNZW51U2VydmljZX0gZnJvbSAnLi4vLi4vc2lkZS1tZW51L3NlcnZpY2VzL3NpZGUtbWVudS5zZXJ2aWNlJztcbmltcG9ydCB7VGFza1Jlc291cmNlU2VydmljZX0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2VuZ2luZS1lbmRwb2ludC90YXNrLXJlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrQ29udGVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy90YXNrLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQge1NuYWNrQmFyU2VydmljZX0gZnJvbSAnLi4vLi4vc25hY2stYmFyL3NlcnZpY2VzL3NuYWNrLWJhci5zZXJ2aWNlJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1Rhc2tSZXF1ZXN0U3RhdGVTZXJ2aWNlfSBmcm9tICcuL3Rhc2stcmVxdWVzdC1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7VGFza0hhbmRsaW5nU2VydmljZX0gZnJvbSAnLi90YXNrLWhhbmRsaW5nLXNlcnZpY2UnO1xuaW1wb3J0IHtOQUVfVEFTS19PUEVSQVRJT05TfSBmcm9tICcuLi9tb2RlbHMvdGFzay1vcGVyYXRpb25zLWluamVjdGlvbi10b2tlbic7XG5pbXBvcnQge1Rhc2tPcGVyYXRpb25zfSBmcm9tICcuLi9pbnRlcmZhY2VzL3Rhc2stb3BlcmF0aW9ucyc7XG5pbXBvcnQge1VzZXJMaXN0SW5qZWN0ZWREYXRhfSBmcm9tICcuLi8uLi9zaWRlLW1lbnUvY29udGVudC1jb21wb25lbnRzL3VzZXItYXNzaWduL21vZGVsL3VzZXItbGlzdC1pbmplY3RlZC1kYXRhJztcbmltcG9ydCB7VXNlclZhbHVlfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy91c2VyLWZpZWxkL21vZGVscy91c2VyLXZhbHVlJztcbmltcG9ydCB7U2VsZWN0ZWRDYXNlU2VydmljZX0gZnJvbSAnLi9zZWxlY3RlZC1jYXNlLnNlcnZpY2UnO1xuaW1wb3J0IHtOQUVfVVNFUl9BU1NJR05fQ09NUE9ORU5UfSBmcm9tICcuLi8uLi9zaWRlLW1lbnUvY29udGVudC1jb21wb25lbnRzL2luamVjdGlvbi10b2tlbnMnO1xuaW1wb3J0IHtjcmVhdGVUYXNrRXZlbnROb3RpZmljYXRpb259IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9tb2RlbC90YXNrLWV2ZW50LW5vdGlmaWNhdGlvbic7XG5pbXBvcnQge1Rhc2tFdmVudH0gZnJvbSAnLi4vLi4vdGFzay1jb250ZW50L21vZGVsL3Rhc2stZXZlbnQnO1xuaW1wb3J0IHtUYXNrRXZlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvc2VydmljZXMvdGFzay1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7VGFza0RhdGFTZXJ2aWNlfSBmcm9tICcuL3Rhc2stZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7dGFrZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtEZWxlZ2F0ZVRhc2tFdmVudE91dGNvbWV9IGZyb20gJy4uLy4uL2V2ZW50L21vZGVsL2V2ZW50LW91dGNvbWVzL3Rhc2stb3V0Y29tZXMvZGVsZWdhdGUtdGFzay1ldmVudC1vdXRjb21lJztcbmltcG9ydCB7RXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL21lc3NhZ2UtcmVzb3VyY2UnO1xuaW1wb3J0IHtFdmVudFF1ZXVlU2VydmljZX0gZnJvbSAnLi4vLi4vZXZlbnQtcXVldWUvc2VydmljZXMvZXZlbnQtcXVldWUuc2VydmljZSc7XG5pbXBvcnQge1F1ZXVlZEV2ZW50fSBmcm9tICcuLi8uLi9ldmVudC1xdWV1ZS9tb2RlbC9xdWV1ZWQtZXZlbnQnO1xuaW1wb3J0IHtBZnRlckFjdGlvbn0gZnJvbSAnLi4vLi4vdXRpbGl0eS9jYWxsLWNoYWluL2FmdGVyLWFjdGlvbic7XG5pbXBvcnQge0NoYW5nZWRGaWVsZHNTZXJ2aWNlfSBmcm9tICcuLi8uLi9jaGFuZ2VkLWZpZWxkcy9zZXJ2aWNlcy9jaGFuZ2VkLWZpZWxkcy5zZXJ2aWNlJztcbmltcG9ydCB7RXZlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi9ldmVudC9zZXJ2aWNlcy9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7Q2hhbmdlZEZpZWxkc01hcH0gZnJvbSAnLi4vLi4vZXZlbnQvc2VydmljZXMvaW50ZXJmYWNlcy9jaGFuZ2VkLWZpZWxkcy1tYXAnO1xuaW1wb3J0IHtUYXNrRXZlbnRPdXRjb21lfSBmcm9tICcuLi8uLi9ldmVudC9tb2RlbC9ldmVudC1vdXRjb21lcy90YXNrLW91dGNvbWVzL3Rhc2stZXZlbnQtb3V0Y29tZSc7XG5cblxuLyoqXG4gKiBTZXJ2aWNlIHRoYXQgaGFuZGxlcyB0aGUgbG9naWMgb2YgZGVsZWdhdGluZyBhIHRhc2suXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZWxlZ2F0ZVRhc2tTZXJ2aWNlIGV4dGVuZHMgVGFza0hhbmRsaW5nU2VydmljZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2xvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3NpZGVNZW51U2VydmljZTogU2lkZU1lbnVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdGFza1Jlc291cmNlU2VydmljZTogVGFza1Jlc291cmNlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3NuYWNrQmFyOiBTbmFja0JhclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90YXNrU3RhdGU6IFRhc2tSZXF1ZXN0U3RhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdGFza0V2ZW50OiBUYXNrRXZlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdGFza0RhdGFTZXJ2aWNlOiBUYXNrRGF0YVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9ldmVudFF1ZXVlOiBFdmVudFF1ZXVlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2V2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfY2hhbmdlZEZpZWxkc1NlcnZpY2U6IENoYW5nZWRGaWVsZHNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIEBJbmplY3QoTkFFX1RBU0tfT1BFUkFUSU9OUykgcHJvdGVjdGVkIF90YXNrT3BlcmF0aW9uczogVGFza09wZXJhdGlvbnMsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOQUVfVVNFUl9BU1NJR05fQ09NUE9ORU5UKSBwcm90ZWN0ZWQgX3VzZXJBc3NpZ25Db21wb25lbnQ6IGFueSxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBfc2VsZWN0ZWRDYXNlU2VydmljZTogU2VsZWN0ZWRDYXNlU2VydmljZSxcbiAgICAgICAgICAgICAgICBfdGFza0NvbnRlbnRTZXJ2aWNlOiBUYXNrQ29udGVudFNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoX3Rhc2tDb250ZW50U2VydmljZSwgX3NlbGVjdGVkQ2FzZVNlcnZpY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHRoZSAnZGVsZWdhdGUnIG9wZXJhdGlvbiBvbiB0aGUgdGFzayBoZWxkIGJ5IHtAbGluayBUYXNrQ29udGVudFNlcnZpY2V9LlxuICAgICAqXG4gICAgICogRG9lc24ndCBzZW5kIGFueSByZXF1ZXN0cyBpZiB0aGUgbG9hZGluZyBpbmRpY2F0b3IgaXMgaW4gaXQncyBhY3RpdmUgc3RhdGUuXG4gICAgICogT3RoZXJ3aXNlIHNldHMgdGhlIGluZGljYXRvciB0byB0aGUgYWN0aXZlIHN0YXRlIGFuZCBkaXNhYmxlcyBpdCBvbmNlIHRoZSByZXF1ZXN0IHJlc3BvbnNlIGlzIHJlY2VpdmVkLlxuICAgICAqXG4gICAgICogVGhlIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIGNoYWluIG9wZXJhdGlvbnMgdG9nZXRoZXIsXG4gICAgICogb3IgdG8gZXhlY3V0ZSBjb2RlIGNvbmRpdGlvbmFsbHkgYmFzZWQgb24gdGhlIHN1Y2Nlc3Mgc3RhdGUgb2YgdGhlIGRlbGVnYXRlIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIElmIHRoZSB0YXNrIGhlbGQgd2l0aGluIHRoZSB7QGxpbmsgVGFza0NvbnRlbnRTZXJ2aWNlfSBjaGFuZ2VzIGJlZm9yZSBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBpZ25vcmVkXG4gICAgICogYW5kIHRoZSBgYWZ0ZXJBY3Rpb25gIHdpbGwgbm90IGJlIGV4ZWN1dGVkLlxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiBpZiBkZWxlZ2F0ZSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IGB0cnVlYCB3aWxsIGJlIGVtaXR0ZWQgaW50byB0aGlzIFN1YmplY3QsIG90aGVyd2lzZSBgZmFsc2VgIHdpbGwgYmUgZW1pdHRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxlZ2F0ZShhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24gPSBuZXcgQWZ0ZXJBY3Rpb24oKSkge1xuICAgICAgICBjb25zdCBkZWxlZ2F0ZWRUYXNrSWQgPSB0aGlzLl9zYWZlVGFzay5zdHJpbmdJZDtcblxuICAgICAgICBpZiAodGhpcy5fdGFza1N0YXRlLmlzTG9hZGluZyhkZWxlZ2F0ZWRUYXNrSWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2lkZU1lbnVTZXJ2aWNlLm9wZW4odGhpcy5fdXNlckFzc2lnbkNvbXBvbmVudCwgU2lkZU1lbnVTaXplLk1FRElVTSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByb2xlczogT2JqZWN0LmtleXModGhpcy5fc2FmZVRhc2sucm9sZXMpLmZpbHRlcihyb2xlID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NhZmVUYXNrLnJvbGVzW3JvbGVdWydhc3NpZ24nXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX3NhZmVUYXNrLnJvbGVzW3JvbGVdWydhc3NpZ24nXSksXG4gICAgICAgICAgICAgICAgdmFsdWU6ICF0aGlzLl9zYWZlVGFzay51c2VySWQgPyB1bmRlZmluZWQgOiBuZXcgVXNlclZhbHVlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYWZlVGFzay51c2VySWQsICcnLCAnJywgJycsICcnXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBuZWdhdGl2ZVJvbGVzOiBPYmplY3Qua2V5cyh0aGlzLl9zYWZlVGFzay5yb2xlcykuZmlsdGVyKHJvbGUgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2FmZVRhc2sucm9sZXNbcm9sZV1bJ2Fzc2lnbiddICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuX3NhZmVUYXNrLnJvbGVzW3JvbGVdWydhc3NpZ24nXSlcbiAgICAgICAgICAgIH0gYXMgVXNlckxpc3RJbmplY3RlZERhdGEpLm9uQ2xvc2Uuc3Vic2NyaWJlKGV2ZW50ID0+IHtcblxuICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdEZWxlZ2F0ZSBzaWRlbWVudSBldmVudDonICsgZXZlbnQpO1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZXZlbnRRdWV1ZS5zY2hlZHVsZUV2ZW50KG5ldyBRdWV1ZWRFdmVudChcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaXNUYXNrUmVsZXZhbnQoZGVsZWdhdGVkVGFza0lkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnY3VycmVudCB0YXNrIGNoYW5nZWQgYmVmb3JlIHRoZSBkZWxlZ2F0ZSBzaWRlIG1lbnUgZGF0YSB3YXMgcmVjZWl2ZWQsIGRpc2NhcmRpbmcuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbmV4dEV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtRGVsZWdhdGVSZXF1ZXN0KGFmdGVyQWN0aW9uLCBkZWxlZ2F0ZWRUYXNrSWQsIGV2ZW50LmRhdGEuaWQsIG5leHRFdmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgYGRlbGVnYXRlYCByZXF1ZXN0IG9uIHRoZSB0YXNrIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhlIGB0YXNrQ29udGVudGAgc2VydmljZVxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gZGVsZWdhdGVkVGFza0lkIGlkIG9mIHRoZSB0YXNrIHRoYXQgaXMgYmVpbmcgZGVsZWdhdGVkXG4gICAgICogQHBhcmFtIGRlbGVnYXRlZFVzZXJJZCBpZCBvZiB0aGUgdXNlciB3aG9tIHRoZSB0YXNrIGlzIGJlaW5nIGRlbGVnYXRlZFxuICAgICAqIEBwYXJhbSBuZXh0RXZlbnQgaW5kaWNhdGVzIHRvIHRoZSBldmVudCBxdWV1ZSB0aGF0IHRoZSBuZXh0IGV2ZW50IGNhbiBiZSBwcm9jZXNzZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcGVyZm9ybURlbGVnYXRlUmVxdWVzdChhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24sIGRlbGVnYXRlZFRhc2tJZDogc3RyaW5nLCBkZWxlZ2F0ZWRVc2VySWQ6IGFueSwgbmV4dEV2ZW50OiBBZnRlckFjdGlvbikge1xuICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RhcnRMb2FkaW5nKGRlbGVnYXRlZFRhc2tJZCk7XG4gICAgICAgIHRoaXMuX3Rhc2tSZXNvdXJjZVNlcnZpY2UuZGVsZWdhdGVUYXNrKHRoaXMuX3NhZmVUYXNrLnN0cmluZ0lkLCBkZWxlZ2F0ZWRVc2VySWQpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgKG91dGNvbWVSZXNvdXJjZTogRXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKGRlbGVnYXRlZFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVGFza1JlbGV2YW50KGRlbGVnYXRlZFRhc2tJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdjdXJyZW50IHRhc2sgY2hhbmdlZCBiZWZvcmUgdGhlIGRlbGVnYXRlIHJlc3BvbnNlIGNvdWxkIGJlIHJlY2VpdmVkLCBkaXNjYXJkaW5nLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvdXRjb21lUmVzb3VyY2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudXBkYXRlU3RhdGVEYXRhKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lIGFzIERlbGVnYXRlVGFza0V2ZW50T3V0Y29tZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRGaWVsZHNNYXA6IENoYW5nZWRGaWVsZHNNYXAgPSB0aGlzLl9ldmVudFNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJzZUNoYW5nZWRGaWVsZHNGcm9tT3V0Y29tZVRyZWUob3V0Y29tZVJlc291cmNlLm91dGNvbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoISFjaGFuZ2VkRmllbGRzTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VkRmllbGRzU2VydmljZS5lbWl0Q2hhbmdlZEZpZWxkcyhjaGFuZ2VkRmllbGRzTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlU3VjY2VzcyhhZnRlckFjdGlvbiwgbmV4dEV2ZW50LCBvdXRjb21lUmVzb3VyY2Uub3V0Y29tZSBhcyBEZWxlZ2F0ZVRhc2tFdmVudE91dGNvbWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0Y29tZVJlc291cmNlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW5FcnJvclNuYWNrQmFyKG91dGNvbWVSZXNvdXJjZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVBY3Rpb25zKGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKGRlbGVnYXRlZFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdnZXR0aW5nIHRhc2sgZGF0YSBmYWlsZWQnLCBlcnJvcik7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNUYXNrUmVsZXZhbnQoZGVsZWdhdGVkVGFza0lkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ2N1cnJlbnQgdGFzayBjaGFuZ2VkIGJlZm9yZSB0aGUgZGVsZWdhdGUgZXJyb3IgY291bGQgYmUgcmVjZWl2ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbkVycm9yU25hY2tCYXIoYCR7dGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLmFzc2lnblRhc2snKX1cbiAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5fdGFza30gJHt0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIuZmFpbGVkJyl9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZUFjdGlvbnMoYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCwgZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsb2FkcyB0aGUgdGFzayBhbmQgZW1pdHMgYHRydWVgIHRvIHRoZSBgYWZ0ZXJBY3Rpb25gIHN0cmVhbVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb21wbGV0ZVN1Y2Nlc3MoYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLCBuZXh0RXZlbnQ6IEFmdGVyQWN0aW9uLCBvdXRjb21lPzogVGFza0V2ZW50T3V0Y29tZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl90YXNrT3BlcmF0aW9ucy5yZWxvYWQoKTtcbiAgICAgICAgdGhpcy5jb21wbGV0ZUFjdGlvbnMoYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCwgdHJ1ZSwgb3V0Y29tZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGxldGVzIGFsbCB0aGUgYWN0aW9uIHN0cmVhbXMgYW5kIHNlbmRzIHRoZSBub3RpZmljYXRpb24sIHdpdGggdGhlIHByb3ZpZGVkIHJlc3VsdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb21wbGV0ZUFjdGlvbnMoYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLCBuZXh0RXZlbnQ6IEFmdGVyQWN0aW9uLCByZXN1bHQ6IGJvb2xlYW4sIG91dGNvbWU/OiBUYXNrRXZlbnRPdXRjb21lKSB7XG4gICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbihyZXN1bHQsIG91dGNvbWUpO1xuICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIG5leHRFdmVudC5yZXNvbHZlKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHVibGlzaGVzIGEgZGVsZWdhdGUgbm90aWZpY2F0aW9uIHRvIHRoZSB7QGxpbmsgVGFza0V2ZW50U2VydmljZX1cbiAgICAgKiBAcGFyYW0gc3VjY2VzcyB3aGV0aGVyIHRoZSBkZWxlZ2F0ZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgb3Igbm90XG4gICAgICogQHBhcmFtIG91dGNvbWVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2VuZE5vdGlmaWNhdGlvbihzdWNjZXNzOiBib29sZWFuLCBvdXRjb21lPzogVGFza0V2ZW50T3V0Y29tZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl90YXNrRXZlbnQucHVibGlzaFRhc2tFdmVudChjcmVhdGVUYXNrRXZlbnROb3RpZmljYXRpb24odGhpcy5fc2FmZVRhc2ssIFRhc2tFdmVudC5ERUxFR0FURSwgc3VjY2Vzcywgb3V0Y29tZSkpO1xuICAgIH1cbn1cbiJdfQ==