@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
478 lines • 71.1 kB
JavaScript
import { Component, EventEmitter, Inject, Input, Optional, Output } from '@angular/core';
import { filter, map, take } from 'rxjs/operators';
import { toMoment } from '../../resources/types/nae-date-type';
import { DATE_TIME_FORMAT_STRING } from '../../moment/time-formats';
import { TaskMetaField } from '../../header/task-header/task-meta-enum';
import { NAE_TASK_PANEL_DISABLE_BUTTON_FUNCTIONS } from './models/disable-functions';
import { AbstractPanelWithImmediateDataComponent } from '../abstract/panel-with-immediate-data';
import { NAE_TASK_FORCE_OPEN } from '../../view/task-view/models/injection-token-task-force-open';
import { NAE_TAB_DATA } from '../../tabs/tab-data-injection-token/tab-data-injection-token';
import { UnlimitedTaskContentService } from "../../task-content/services/unlimited-task-content.service";
import * as i0 from "@angular/core";
import * as i1 from "../../task-content/services/task-content.service";
import * as i2 from "../../logger/services/logger.service";
import * as i3 from "../../view/task-view/service/task-view.service";
import * as i4 from "../../navigation/quick-panel/components/paper-view.service";
import * as i5 from "../../task-content/services/task-event.service";
import * as i6 from "../../task/services/assign-task.service";
import * as i7 from "../../task/services/delegate-task.service";
import * as i8 from "../../task/services/cancel-task.service";
import * as i9 from "../../task/services/finish-task.service";
import * as i10 from "../../task/services/task-request-state.service";
import * as i11 from "../../task/services/task-data.service";
import * as i12 from "../../task/services/assign-policy.service";
import * as i13 from "../../task/services/finish-policy.service";
import * as i14 from "../../utility/call-chain/call-chain.service";
import * as i15 from "../../task/models/subject-task-operations";
import * as i16 from "@ngx-translate/core";
import * as i17 from "@angular/common";
import * as i18 from "../../changed-fields/services/changed-fields.service";
import * as i19 from "../../authorization/permission/permission.service";
import * as i20 from "../../user/services/user-comparator.service";
import * as i21 from "../../header/services/overflow.service";
export class AbstractTaskPanelComponent extends AbstractPanelWithImmediateDataComponent {
_taskContentService;
_log;
_taskViewService;
_paperView;
_taskEventService;
_assignTaskService;
_delegateTaskService;
_cancelTaskService;
_finishTaskService;
_taskState;
_taskDataService;
_assignPolicyService;
_finishPolicyService;
_callChain;
_taskOperations;
_disableFunctions;
_translate;
_currencyPipe;
_changedFieldsService;
_permissionService;
_userComparator;
_taskForceOpen;
/**
* @ignore
* Set by an @Input() on a setter function, that also resolves featured fields.
*/
_taskPanelData;
_forceLoadDataOnOpen = false;
taskListVirtualScroll;
panelContentComponent;
first;
last;
responsiveBody = true;
preventExpand = false;
preventCollapse = false;
hidePanelHeader = false;
hideActionRow = false;
actionButtonTemplates;
actionRowJustifyContent;
showMoreMenu = true;
thisContext = {
canAssign: () => this.canAssign(),
assign: () => this.assign(),
getAssignTitle: () => this.getAssignTitle(),
delegate: () => this.delegate(),
getDelegateTitle: () => this.getDelegateTitle(),
canReassign: () => this.canReassign(),
canCancel: () => this.canCancel(),
cancel: () => this.cancel(),
getCancelTitle: () => this.getCancelTitle(),
canFinish: () => this.canFinish(),
finish: () => this.finish(),
getFinishTitle: () => this.getFinishTitle(),
canCollapse: () => this.canCollapse(),
collapse: () => this.collapse(),
canDisable: (arg) => this.canDisable(arg),
canDo: (arg) => this.canDo(arg),
isLoading: () => this.isLoading
};
set forceLoadDataOnOpen(force) {
this._forceLoadDataOnOpen = force;
this._assignPolicyService.forced = force;
}
textEllipsis = false;
/**
* Emits notifications about task events
*/
taskEvent;
panelRefOutput;
portal;
panelRef;
_sub;
_subTaskEvent;
_subTaskData;
_subPanelUpdate;
_taskDisableButtonFunctions;
_unsub;
_canReload;
constructor(_taskContentService, _log, _taskViewService, _paperView, _taskEventService, _assignTaskService, _delegateTaskService, _cancelTaskService, _finishTaskService, _taskState, _taskDataService, _assignPolicyService, _finishPolicyService, _callChain, _taskOperations, _disableFunctions, _translate, _currencyPipe, _changedFieldsService, _permissionService, _userComparator, overflowService, _taskForceOpen, injectedTabData) {
super(_translate, _currencyPipe, overflowService);
this._taskContentService = _taskContentService;
this._log = _log;
this._taskViewService = _taskViewService;
this._paperView = _paperView;
this._taskEventService = _taskEventService;
this._assignTaskService = _assignTaskService;
this._delegateTaskService = _delegateTaskService;
this._cancelTaskService = _cancelTaskService;
this._finishTaskService = _finishTaskService;
this._taskState = _taskState;
this._taskDataService = _taskDataService;
this._assignPolicyService = _assignPolicyService;
this._finishPolicyService = _finishPolicyService;
this._callChain = _callChain;
this._taskOperations = _taskOperations;
this._disableFunctions = _disableFunctions;
this._translate = _translate;
this._currencyPipe = _currencyPipe;
this._changedFieldsService = _changedFieldsService;
this._permissionService = _permissionService;
this._userComparator = _userComparator;
this._taskForceOpen = _taskForceOpen;
this.taskEvent = new EventEmitter();
this.panelRefOutput = new EventEmitter();
this._subTaskEvent = _taskEventService.taskEventNotifications$.subscribe(event => {
this.taskEvent.emit(event);
});
this._subTaskData = _changedFieldsService.changedFields$.subscribe((changedFieldsMap) => {
const filteredCaseIds = Object.keys(changedFieldsMap).filter(caseId => Object.keys(this._taskContentService.referencedTaskAndCaseIds)?.includes(caseId));
const changedFields = [];
filteredCaseIds.forEach(caseId => {
const taskIds = this._taskContentService.referencedTaskAndCaseIds[caseId];
changedFields.push(...this._changedFieldsService.parseChangedFieldsByCaseAndTaskIds(caseId, taskIds, changedFieldsMap));
});
changedFields.filter(fields => fields !== undefined).forEach(fields => {
this.taskPanelData.changedFields.next(fields);
});
});
_taskOperations.open$.subscribe(() => {
if (!this.preventExpand) {
this.expand();
}
});
_taskOperations.close$.subscribe(() => {
if (!(this._taskForceOpen || this.preventCollapse)) {
this.collapse();
}
});
_taskOperations.reload$.subscribe(() => {
this._taskViewService.reloadCurrentPage();
});
_taskOperations.forceReload$.subscribe(() => {
this._taskViewService.reloadCurrentPage(true);
});
this._taskDisableButtonFunctions = {
finish: (t) => false,
assign: (t) => false,
delegate: (t) => false,
reassign: (t) => false,
cancel: (t) => false,
};
if (_disableFunctions) {
Object.assign(this._taskDisableButtonFunctions, _disableFunctions);
}
if (injectedTabData !== null) {
this._unsub = injectedTabData.tabSelected$.pipe(filter(bool => bool && this.isExpanded())).subscribe(() => {
if (this._canReload) {
this._taskDataService.initializeTaskDataFields(this._callChain.create(() => {
const task = this._taskContentService.task;
const taskShouldBeBlocked = !task?.assignee
|| !this._userComparator.compareUsers(task.assignee.id);
this._taskContentService.blockFields(taskShouldBeBlocked);
}), true);
}
else {
this._canReload = true;
}
});
}
}
ngOnInit() {
super.ngOnInit();
this._taskContentService.task = this._taskPanelData.task;
this.createContentPortal();
this._sub = this._taskPanelData.changedFields.subscribe(chFields => {
this._taskContentService.updateFromChangedFields(chFields);
});
this._subPanelUpdate = this._taskViewService.panelUpdate.pipe(map(a => a.find(p => p.task.stringId === this.taskPanelData.task.stringId)), filter(p => !!p)).subscribe(value => {
this.resolveFeaturedFieldsValues();
});
}
ngAfterViewInit() {
this.panelRef.opened.subscribe(() => {
if (!this.preventExpand) {
this._taskContentService.expansionStarted();
if (!this._taskState.isLoading()) {
this._assignPolicyService.performAssignPolicy(true);
}
}
});
this.panelRef.closed.subscribe(() => {
if (!this._taskState.isLoading()) {
this._assignPolicyService.performAssignPolicy(false);
}
});
this.panelRef.afterExpand.subscribe(() => {
this._taskContentService.$shouldCreate.pipe(take(1)).subscribe(() => {
this._taskContentService.blockFields(this.hasNoFinishPermission());
this._taskPanelData.initiallyExpanded = true;
});
this._taskContentService.expansionFinished();
});
this.panelRef.afterCollapse.subscribe(() => {
this._taskPanelData.initiallyExpanded = false;
});
if ((this._taskPanelData.initiallyExpanded || this._taskForceOpen) && !this.preventExpand) {
this.panelRef.expanded = true;
}
}
set taskPanelData(data) {
this._taskPanelData = data;
if (this._taskContentService instanceof UnlimitedTaskContentService && this.panelRef) {
this.collapse();
this._taskContentService.task = this._taskPanelData.task;
if (this._sub) {
this._sub.unsubscribe();
}
this._sub = this._taskPanelData.changedFields.subscribe(chFields => {
this._taskContentService.updateFromChangedFields(chFields);
});
this.expand();
}
this.resolveFeaturedFieldsValues();
}
get taskPanelData() {
return this._taskPanelData;
}
get isLoading() {
return this._taskState.isLoading();
}
stopLoading() {
this._taskState.stopLoading(this._taskPanelData.task.stringId);
}
preventPanelOpen($event) {
$event.stopPropagation();
return false;
}
isPaperView() {
return this._paperView.paperView;
}
setPanelRef(panelRef) {
this.panelRef = panelRef;
this.panelRefOutput.emit(panelRef);
}
assign() {
this._assignTaskService.assign(this._callChain.create((afterAction => {
if (afterAction) {
this._taskDataService.initializeTaskDataFields();
this._finishPolicyService.performFinishPolicy();
}
})));
}
delegate() {
this._delegateTaskService.delegate();
}
cancel() {
this._cancelTaskService.cancel(this._callChain.create(() => {
this._taskOperations.reload();
this._taskOperations.close();
}));
}
finish() {
if (!this._taskContentService.validateTaskData()) {
if (this._taskContentService.task.dataSize <= 0) {
this._taskDataService.initializeTaskDataFields();
}
const invalidFields = this._taskContentService.getInvalidTaskData();
document.getElementById(invalidFields[0].stringId).scrollIntoView({
behavior: 'smooth',
block: 'start',
inline: 'nearest'
});
}
else {
this._finishTaskService.validateDataAndFinish();
}
}
collapse() {
this.panelRef.close();
this.panelRef.expanded = false;
}
expand() {
if (this.preventExpand) {
return;
}
this.panelRef.open();
this.panelRef.expanded = true;
}
canAssign() {
return this._permissionService.canAssign(this.taskPanelData.task) && this.getAssignTitle() !== '';
}
canReassign() {
return this._permissionService.canReassign(this.taskPanelData.task);
}
canCancel() {
return this._permissionService.canCancel(this.taskPanelData.task) && this.getCancelTitle() !== '';
}
canFinish() {
return this._permissionService.canFinish(this.taskPanelData.task) && this.getFinishTitle() !== '';
}
hasNoFinishPermission() {
return !this._permissionService.canFinish(this.taskPanelData.task);
}
canCollapse() {
return this._taskForceOpen ? false : this._permissionService.canCollapse(this.taskPanelData.task);
}
canDo(action) {
return this._permissionService.hasTaskPermission(this.taskPanelData.task, action) && this.getDelegateTitle() !== '';
}
getAssignTitle() {
return (this.taskPanelData.task.assignTitle === '' || this.taskPanelData.task.assignTitle)
? this.taskPanelData.task.assignTitle : 'tasks.view.assign';
}
getCancelTitle() {
return (this.taskPanelData.task.cancelTitle === '' || this.taskPanelData.task.cancelTitle)
? this.taskPanelData.task.cancelTitle : 'tasks.view.cancel';
}
getDelegateTitle() {
return (this.taskPanelData.task.delegateTitle === '' || this.taskPanelData.task.delegateTitle)
? this.taskPanelData.task.delegateTitle : 'tasks.view.delegate';
}
getFinishTitle() {
return (this.taskPanelData.task.finishTitle === '' || this.taskPanelData.task.finishTitle)
? this.taskPanelData.task.finishTitle : 'tasks.view.finish';
}
canDisable(type) {
let disable = false;
if (!!this.taskPanelData && !!this.taskPanelData.task) {
disable = disable
|| !!this._taskState.isLoading(this.taskPanelData.task.stringId)
|| !!this._taskState.isUpdating(this.taskPanelData.task.stringId);
}
return disable || this._taskDisableButtonFunctions[type]({ ...this._taskContentService.task });
}
getFeaturedMetaValue(selectedHeader) {
const task = this._taskPanelData.task;
switch (selectedHeader.fieldIdentifier) {
case TaskMetaField.CASE:
return { value: task.caseTitle, icon: '', type: 'meta' };
case TaskMetaField.CASE_ID:
return { value: task.caseId, icon: '', type: 'meta' };
case TaskMetaField.TASK_ID:
return { value: task.stringId, icon: '', type: 'meta' };
case TaskMetaField.TITLE:
return { value: task.title, icon: '', type: 'meta' };
case TaskMetaField.PRIORITY:
// TODO priority
if (!task.priority || task.priority < 2) {
return { value: 'high', icon: 'error', type: 'meta' };
}
if (task.priority === 2) {
return { value: 'medium', icon: 'north', type: 'meta' };
}
return { value: 'low', icon: 'south', type: 'meta' };
case TaskMetaField.USER:
//TODO: refactor after User refactor PR is merged
return { value: task.assignee ? task.assignee.fullName : '', icon: 'account_circle', type: 'meta' };
case TaskMetaField.ASSIGN_DATE:
return {
value: task.startDate ? toMoment(task.startDate).format(DATE_TIME_FORMAT_STRING) : '',
icon: 'event',
type: 'meta'
};
}
}
getFeaturedImmediateValue(selectedHeader) {
if (this._taskContentService.task && this._taskContentService.task.immediateData) {
const immediate = this._taskContentService.task.immediateData.find(it => it.stringId === selectedHeader.fieldIdentifier);
return this.parseImmediateValue(immediate);
}
return { value: '', icon: '', type: '' };
}
ngOnDestroy() {
super.ngOnDestroy();
this._sub.unsubscribe();
this._subTaskEvent.unsubscribe();
this._subTaskData.unsubscribe();
this._taskOperations.destroy();
this._subPanelUpdate.unsubscribe();
this.taskEvent.complete();
if (this._unsub) {
this._unsub.unsubscribe();
}
}
isForceOpen() {
return this._taskForceOpen && !!this.taskListVirtualScroll?.getElementRef()?.nativeElement;
}
getContentMinHeight() {
return this.taskListVirtualScroll.getElementRef().nativeElement.offsetHeight - 32 + 'px';
}
isExpanded() {
return this.panelRef?.expanded && !this._taskContentService?.isExpanding;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractTaskPanelComponent, deps: [{ token: i1.TaskContentService }, { token: i2.LoggerService }, { token: i3.TaskViewService }, { token: i4.PaperViewService }, { token: i5.TaskEventService }, { token: i6.AssignTaskService }, { token: i7.DelegateTaskService }, { token: i8.CancelTaskService }, { token: i9.FinishTaskService }, { token: i10.TaskRequestStateService }, { token: i11.TaskDataService }, { token: i12.AssignPolicyService }, { token: i13.FinishPolicyService }, { token: i14.CallChainService }, { token: i15.SubjectTaskOperations }, { token: NAE_TASK_PANEL_DISABLE_BUTTON_FUNCTIONS, optional: true }, { token: i16.TranslateService }, { token: i17.CurrencyPipe }, { token: i18.ChangedFieldsService }, { token: i19.PermissionService }, { token: i20.UserComparatorService }, { token: i21.OverflowService, optional: true }, { token: NAE_TASK_FORCE_OPEN, optional: true }, { token: NAE_TAB_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AbstractTaskPanelComponent, selector: "ncc-abstract-legal-notice", inputs: { taskListVirtualScroll: "taskListVirtualScroll", panelContentComponent: "panelContentComponent", first: "first", last: "last", responsiveBody: "responsiveBody", preventExpand: "preventExpand", preventCollapse: "preventCollapse", hidePanelHeader: "hidePanelHeader", hideActionRow: "hideActionRow", actionButtonTemplates: "actionButtonTemplates", actionRowJustifyContent: "actionRowJustifyContent", showMoreMenu: "showMoreMenu", forceLoadDataOnOpen: "forceLoadDataOnOpen", textEllipsis: "textEllipsis", taskPanelData: "taskPanelData" }, outputs: { taskEvent: "taskEvent", panelRefOutput: "panelRefOutput" }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractTaskPanelComponent, decorators: [{
type: Component,
args: [{
selector: 'ncc-abstract-legal-notice',
template: ''
}]
}], ctorParameters: () => [{ type: i1.TaskContentService }, { type: i2.LoggerService }, { type: i3.TaskViewService }, { type: i4.PaperViewService }, { type: i5.TaskEventService }, { type: i6.AssignTaskService }, { type: i7.DelegateTaskService }, { type: i8.CancelTaskService }, { type: i9.FinishTaskService }, { type: i10.TaskRequestStateService }, { type: i11.TaskDataService }, { type: i12.AssignPolicyService }, { type: i13.FinishPolicyService }, { type: i14.CallChainService }, { type: i15.SubjectTaskOperations }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NAE_TASK_PANEL_DISABLE_BUTTON_FUNCTIONS]
}] }, { type: i16.TranslateService }, { type: i17.CurrencyPipe }, { type: i18.ChangedFieldsService }, { type: i19.PermissionService }, { type: i20.UserComparatorService }, { type: i21.OverflowService, decorators: [{
type: Optional
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NAE_TASK_FORCE_OPEN]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NAE_TAB_DATA]
}] }], propDecorators: { taskListVirtualScroll: [{
type: Input
}], panelContentComponent: [{
type: Input
}], first: [{
type: Input
}], last: [{
type: Input
}], responsiveBody: [{
type: Input
}], preventExpand: [{
type: Input
}], preventCollapse: [{
type: Input
}], hidePanelHeader: [{
type: Input
}], hideActionRow: [{
type: Input
}], actionButtonTemplates: [{
type: Input
}], actionRowJustifyContent: [{
type: Input
}], showMoreMenu: [{
type: Input
}], forceLoadDataOnOpen: [{
type: Input
}], textEllipsis: [{
type: Input
}], taskEvent: [{
type: Output
}], panelRefOutput: [{
type: Output
}], taskPanelData: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtdGFzay1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3BhbmVsL3Rhc2stcGFuZWwvYWJzdHJhY3QtdGFzay1wYW5lbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUdULE1BQU0sZUFBZSxDQUFDO0FBUXZCLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWpELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQU9sRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFPdEUsT0FBTyxFQUF3Qix1Q0FBdUMsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRzFHLE9BQU8sRUFBQyx1Q0FBdUMsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBUzlGLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDZEQUE2RCxDQUFDO0FBR2hHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSw4REFBOEQsQ0FBQztBQUUxRixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSw0REFBNEQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPdkcsTUFBTSxPQUFnQiwwQkFBMkIsU0FBUSx1Q0FBdUM7SUFrRTVEO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUM2RDtJQUM3RDtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBRXlDO0lB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QkFBN0IsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkF3QkYsbUJBQW1CO3NCQUR0QixLQUFLO2dCQU1HLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQXFKSSxhQUFhO3NCQUR2QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFR5cGVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01hdEV4cGFuc2lvblBhbmVsfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xuaW1wb3J0IHtDb21wb25lbnRQb3J0YWx9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHtUYXNrQ29udGVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy90YXNrLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tQYW5lbERhdGF9IGZyb20gJy4uL3Rhc2stcGFuZWwtZGF0YS90YXNrLXBhbmVsLWRhdGEnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtUYXNrVmlld1NlcnZpY2V9IGZyb20gJy4uLy4uL3ZpZXcvdGFzay12aWV3L3NlcnZpY2UvdGFzay12aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHtmaWx0ZXIsIG1hcCwgdGFrZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtIZWFkZXJDb2x1bW59IGZyb20gJy4uLy4uL2hlYWRlci9tb2RlbHMvaGVhZGVyLWNvbHVtbic7XG5pbXBvcnQge3RvTW9tZW50fSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvdHlwZXMvbmFlLWRhdGUtdHlwZSc7XG5pbXBvcnQge0RBVEVfVElNRV9GT1JNQVRfU1RSSU5HfSBmcm9tICcuLi8uLi9tb21lbnQvdGltZS1mb3JtYXRzJztcbmltcG9ydCB7UGFwZXJWaWV3U2VydmljZX0gZnJvbSAnLi4vLi4vbmF2aWdhdGlvbi9xdWljay1wYW5lbC9jb21wb25lbnRzL3BhcGVyLXZpZXcuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tFdmVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy90YXNrLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtBc3NpZ25UYXNrU2VydmljZX0gZnJvbSAnLi4vLi4vdGFzay9zZXJ2aWNlcy9hc3NpZ24tdGFzay5zZXJ2aWNlJztcbmltcG9ydCB7RGVsZWdhdGVUYXNrU2VydmljZX0gZnJvbSAnLi4vLi4vdGFzay9zZXJ2aWNlcy9kZWxlZ2F0ZS10YXNrLnNlcnZpY2UnO1xuaW1wb3J0IHtDYW5jZWxUYXNrU2VydmljZX0gZnJvbSAnLi4vLi4vdGFzay9zZXJ2aWNlcy9jYW5jZWwtdGFzay5zZXJ2aWNlJztcbmltcG9ydCB7RmluaXNoVGFza1NlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2svc2VydmljZXMvZmluaXNoLXRhc2suc2VydmljZSc7XG5pbXBvcnQge1Rhc2tNZXRhRmllbGR9IGZyb20gJy4uLy4uL2hlYWRlci90YXNrLWhlYWRlci90YXNrLW1ldGEtZW51bSc7XG5pbXBvcnQge1Rhc2tSZXF1ZXN0U3RhdGVTZXJ2aWNlfSBmcm9tICcuLi8uLi90YXNrL3NlcnZpY2VzL3Rhc2stcmVxdWVzdC1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7VGFza0RhdGFTZXJ2aWNlfSBmcm9tICcuLi8uLi90YXNrL3NlcnZpY2VzL3Rhc2stZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7QXNzaWduUG9saWN5U2VydmljZX0gZnJvbSAnLi4vLi4vdGFzay9zZXJ2aWNlcy9hc3NpZ24tcG9saWN5LnNlcnZpY2UnO1xuaW1wb3J0IHtTdWJqZWN0VGFza09wZXJhdGlvbnN9IGZyb20gJy4uLy4uL3Rhc2svbW9kZWxzL3N1YmplY3QtdGFzay1vcGVyYXRpb25zJztcbmltcG9ydCB7Q2FsbENoYWluU2VydmljZX0gZnJvbSAnLi4vLi4vdXRpbGl0eS9jYWxsLWNoYWluL2NhbGwtY2hhaW4uc2VydmljZSc7XG5pbXBvcnQge1Rhc2tFdmVudE5vdGlmaWNhdGlvbn0gZnJvbSAnLi4vLi4vdGFzay1jb250ZW50L21vZGVsL3Rhc2stZXZlbnQtbm90aWZpY2F0aW9uJztcbmltcG9ydCB7RGlzYWJsZUJ1dHRvbkZ1bnRpb25zLCBOQUVfVEFTS19QQU5FTF9ESVNBQkxFX0JVVFRPTl9GVU5DVElPTlN9IGZyb20gJy4vbW9kZWxzL2Rpc2FibGUtZnVuY3Rpb25zJztcbmltcG9ydCB7VGFza30gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS90YXNrJztcbmltcG9ydCB7Q2hhbmdlZEZpZWxkc30gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvbW9kZWxzL2NoYW5nZWQtZmllbGRzJztcbmltcG9ydCB7QWJzdHJhY3RQYW5lbFdpdGhJbW1lZGlhdGVEYXRhQ29tcG9uZW50fSBmcm9tICcuLi9hYnN0cmFjdC9wYW5lbC13aXRoLWltbWVkaWF0ZS1kYXRhJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0ZlYXR1cmVkVmFsdWV9IGZyb20gJy4uL2Fic3RyYWN0L2ZlYXR1cmVkLXZhbHVlJztcbmltcG9ydCB7Q3VycmVuY3lQaXBlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtQZXJtaXNzaW9uU2VydmljZX0gZnJvbSAnLi4vLi4vYXV0aG9yaXphdGlvbi9wZXJtaXNzaW9uL3Blcm1pc3Npb24uc2VydmljZSc7XG5pbXBvcnQge0NoYW5nZWRGaWVsZHNTZXJ2aWNlfSBmcm9tICcuLi8uLi9jaGFuZ2VkLWZpZWxkcy9zZXJ2aWNlcy9jaGFuZ2VkLWZpZWxkcy5zZXJ2aWNlJztcbmltcG9ydCB7Q2hhbmdlZEZpZWxkc01hcH0gZnJvbSAnLi4vLi4vZXZlbnQvc2VydmljZXMvaW50ZXJmYWNlcy9jaGFuZ2VkLWZpZWxkcy1tYXAnO1xuaW1wb3J0IHtUYXNrUGFuZWxDb250ZXh0fSBmcm9tICcuL21vZGVscy90YXNrLXBhbmVsLWNvbnRleHQnO1xuaW1wb3J0IHtPdmVyZmxvd1NlcnZpY2V9IGZyb20gJy4uLy4uL2hlYWRlci9zZXJ2aWNlcy9vdmVyZmxvdy5zZXJ2aWNlJztcbmltcG9ydCB7TkFFX1RBU0tfRk9SQ0VfT1BFTn0gZnJvbSAnLi4vLi4vdmlldy90YXNrLXZpZXcvbW9kZWxzL2luamVjdGlvbi10b2tlbi10YXNrLWZvcmNlLW9wZW4nO1xuaW1wb3J0IHtDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnR9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgRmluaXNoUG9saWN5U2VydmljZSB9IGZyb20gJy4uLy4uL3Rhc2svc2VydmljZXMvZmluaXNoLXBvbGljeS5zZXJ2aWNlJztcbmltcG9ydCB7TkFFX1RBQl9EQVRBfSBmcm9tICcuLi8uLi90YWJzL3RhYi1kYXRhLWluamVjdGlvbi10b2tlbi90YWItZGF0YS1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHtJbmplY3RlZFRhYkRhdGF9IGZyb20gJy4uLy4uL3RhYnMvaW50ZXJmYWNlcyc7XG5pbXBvcnQge1VubGltaXRlZFRhc2tDb250ZW50U2VydmljZX0gZnJvbSBcIi4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy91bmxpbWl0ZWQtdGFzay1jb250ZW50LnNlcnZpY2VcIjtcbmltcG9ydCB7VXNlckNvbXBhcmF0b3JTZXJ2aWNlfSBmcm9tICcuLi8uLi91c2VyL3NlcnZpY2VzL3VzZXItY29tcGFyYXRvci5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduY2MtYWJzdHJhY3QtbGVnYWwtbm90aWNlJyxcbiAgICB0ZW1wbGF0ZTogJydcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUYXNrUGFuZWxDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdFBhbmVsV2l0aEltbWVkaWF0ZURhdGFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICogU2V0IGJ5IGFuIEBJbnB1dCgpIG9uIGEgc2V0dGVyIGZ1bmN0aW9uLCB0aGF0IGFsc28gcmVzb2x2ZXMgZmVhdHVyZWQgZmllbGRzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfdGFza1BhbmVsRGF0YTogVGFza1BhbmVsRGF0YTtcbiAgICBwcm90ZWN0ZWQgX2ZvcmNlTG9hZERhdGFPbk9wZW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSB0YXNrTGlzdFZpcnR1YWxTY3JvbGw6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgICBASW5wdXQoKSBwYW5lbENvbnRlbnRDb21wb25lbnQ6IFR5cGU8YW55PjtcbiAgICBASW5wdXQoKSBwdWJsaWMgZmlyc3Q6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGxhc3Q6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVzcG9uc2l2ZUJvZHkgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHByZXZlbnRFeHBhbmQgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwcmV2ZW50Q29sbGFwc2UgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBoaWRlUGFuZWxIZWFkZXIgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBoaWRlQWN0aW9uUm93ID0gZmFsc2U7XG4gICAgQElucHV0KCkgYWN0aW9uQnV0dG9uVGVtcGxhdGVzOiBBcnJheTxUZW1wbGF0ZVJlZjxhbnk+PjtcbiAgICBASW5wdXQoKSBhY3Rpb25Sb3dKdXN0aWZ5Q29udGVudDogJ3NwYWNlLWJldHdlZW4nIHwgJ2ZsZXgtc3RhcnQnIHwgJ2ZsZXgtZW5kJyB8ICdjZW50ZXInIHwgJ3NwYWNlLWFyb3VuZCcgfFxuICAgICAgICAnaW5pdGlhbCcgfCAnc3RhcnQnIHwgJ2VuZCcgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ3JldmVydCcgfCAnaW5oZXJpdCcgfCAndW5zZXQnXG4gICAgQElucHV0KCkgc2hvd01vcmVNZW51OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIHRoaXNDb250ZXh0OiBUYXNrUGFuZWxDb250ZXh0ID0ge1xuICAgICAgICBjYW5Bc3NpZ246ICgpID0+IHRoaXMuY2FuQXNzaWduKCksXG4gICAgICAgIGFzc2lnbjogKCkgPT4gdGhpcy5hc3NpZ24oKSxcbiAgICAgICAgZ2V0QXNzaWduVGl0bGU6ICgpID0+IHRoaXMuZ2V0QXNzaWduVGl0bGUoKSxcbiAgICAgICAgZGVsZWdhdGU6ICgpID0+IHRoaXMuZGVsZWdhdGUoKSxcbiAgICAgICAgZ2V0RGVsZWdhdGVUaXRsZTogKCkgPT4gdGhpcy5nZXREZWxlZ2F0ZVRpdGxlKCksXG4gICAgICAgIGNhblJlYXNzaWduOiAoKSA9PiB0aGlzLmNhblJlYXNzaWduKCksXG4gICAgICAgIGNhbkNhbmNlbDogKCkgPT4gdGhpcy5jYW5DYW5jZWwoKSxcbiAgICAgICAgY2FuY2VsOiAoKSA9PiB0aGlzLmNhbmNlbCgpLFxuICAgICAgICBnZXRDYW5jZWxUaXRsZTogKCkgPT4gdGhpcy5nZXRDYW5jZWxUaXRsZSgpLFxuICAgICAgICBjYW5GaW5pc2g6ICgpID0+IHRoaXMuY2FuRmluaXNoKCksXG4gICAgICAgIGZpbmlzaDogKCkgPT4gdGhpcy5maW5pc2goKSxcbiAgICAgICAgZ2V0RmluaXNoVGl0bGU6ICgpID0+IHRoaXMuZ2V0RmluaXNoVGl0bGUoKSxcbiAgICAgICAgY2FuQ29sbGFwc2U6ICgpID0+IHRoaXMuY2FuQ29sbGFwc2UoKSxcbiAgICAgICAgY29sbGFwc2U6ICgpID0+IHRoaXMuY29sbGFwc2UoKSxcbiAgICAgICAgY2FuRGlzYWJsZTogKGFyZzogc3RyaW5nKSA9PiB0aGlzLmNhbkRpc2FibGUoYXJnKSxcbiAgICAgICAgY2FuRG86IChhcmc6IHN0cmluZykgPT4gdGhpcy5jYW5EbyhhcmcpLFxuICAgICAgICBpc0xvYWRpbmc6ICgpID0+IHRoaXMuaXNMb2FkaW5nXG4gICAgfTtcblxuXG4gICAgQElucHV0KClcbiAgICBzZXQgZm9yY2VMb2FkRGF0YU9uT3Blbihmb3JjZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9mb3JjZUxvYWREYXRhT25PcGVuID0gZm9yY2U7XG4gICAgICAgIHRoaXMuX2Fzc2lnblBvbGljeVNlcnZpY2UuZm9yY2VkID0gZm9yY2U7XG4gICAgfVxuXG4gICAgQElucHV0KCkgdGV4dEVsbGlwc2lzID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogRW1pdHMgbm90aWZpY2F0aW9ucyBhYm91dCB0YXNrIGV2ZW50c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSB0YXNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxUYXNrRXZlbnROb3RpZmljYXRpb24+O1xuICAgIEBPdXRwdXQoKSBwYW5lbFJlZk91dHB1dDogRXZlbnRFbWl0dGVyPE1hdEV4cGFuc2lvblBhbmVsPjtcblxuICAgIHB1YmxpYyBwb3J0YWw6IENvbXBvbmVudFBvcnRhbDxhbnk+O1xuICAgIHB1YmxpYyBwYW5lbFJlZjogTWF0RXhwYW5zaW9uUGFuZWw7XG4gICAgcHJvdGVjdGVkIF9zdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBwcm90ZWN0ZWQgX3N1YlRhc2tFdmVudDogU3Vic2NyaXB0aW9uO1xuICAgIHByb3RlY3RlZCBfc3ViVGFza0RhdGE6IFN1YnNjcmlwdGlvbjtcbiAgICBwcm90ZWN0ZWQgX3N1YlBhbmVsVXBkYXRlOiBTdWJzY3JpcHRpb247XG4gICAgcHJvdGVjdGVkIF90YXNrRGlzYWJsZUJ1dHRvbkZ1bmN0aW9uczogRGlzYWJsZUJ1dHRvbkZ1bnRpb25zO1xuICAgIHByb3RlY3RlZCBfdW5zdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBwcm90ZWN0ZWQgX2NhblJlbG9hZDogYm9vbGVhbjtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX3Rhc2tDb250ZW50U2VydmljZTogVGFza0NvbnRlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90YXNrVmlld1NlcnZpY2U6IFRhc2tWaWV3U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9wYXBlclZpZXc6IFBhcGVyVmlld1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdGFza0V2ZW50U2VydmljZTogVGFza0V2ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9hc3NpZ25UYXNrU2VydmljZTogQXNzaWduVGFza1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfZGVsZWdhdGVUYXNrU2VydmljZTogRGVsZWdhdGVUYXNrU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9jYW5jZWxUYXNrU2VydmljZTogQ2FuY2VsVGFza1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfZmluaXNoVGFza1NlcnZpY2U6IEZpbmlzaFRhc2tTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tTdGF0ZTogVGFza1JlcXVlc3RTdGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdGFza0RhdGFTZXJ2aWNlOiBUYXNrRGF0YVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfYXNzaWduUG9saWN5U2VydmljZTogQXNzaWduUG9saWN5U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9maW5pc2hQb2xpY3lTZXJ2aWNlOiBGaW5pc2hQb2xpY3lTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2NhbGxDaGFpbjogQ2FsbENoYWluU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90YXNrT3BlcmF0aW9uczogU3ViamVjdFRhc2tPcGVyYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5BRV9UQVNLX1BBTkVMX0RJU0FCTEVfQlVUVE9OX0ZVTkNUSU9OUykgcHJvdGVjdGVkIF9kaXNhYmxlRnVuY3Rpb25zOiBEaXNhYmxlQnV0dG9uRnVudGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2N1cnJlbmN5UGlwZTogQ3VycmVuY3lQaXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2NoYW5nZWRGaWVsZHNTZXJ2aWNlOiBDaGFuZ2VkRmllbGRzU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9wZXJtaXNzaW9uU2VydmljZTogUGVybWlzc2lvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdXNlckNvbXBhcmF0b3I6IFVzZXJDb21wYXJhdG9yU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgb3ZlcmZsb3dTZXJ2aWNlOiBPdmVyZmxvd1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkFFX1RBU0tfRk9SQ0VfT1BFTikgcHJvdGVjdGVkIF90YXNrRm9yY2VPcGVuOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5BRV9UQUJfREFUQSkgaW5qZWN0ZWRUYWJEYXRhOiBJbmplY3RlZFRhYkRhdGEpIHtcbiAgICAgICAgc3VwZXIoX3RyYW5zbGF0ZSwgX2N1cnJlbmN5UGlwZSwgb3ZlcmZsb3dTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy50YXNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFRhc2tFdmVudE5vdGlmaWNhdGlvbj4oKTtcbiAgICAgICAgdGhpcy5wYW5lbFJlZk91dHB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8TWF0RXhwYW5zaW9uUGFuZWw+KCk7XG4gICAgICAgIHRoaXMuX3N1YlRhc2tFdmVudCA9IF90YXNrRXZlbnRTZXJ2aWNlLnRhc2tFdmVudE5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICB0aGlzLnRhc2tFdmVudC5lbWl0KGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3N1YlRhc2tEYXRhID0gX2NoYW5nZWRGaWVsZHNTZXJ2aWNlLmNoYW5nZWRGaWVsZHMkLnN1YnNjcmliZSgoY2hhbmdlZEZpZWxkc01hcDogQ2hhbmdlZEZpZWxkc01hcCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRDYXNlSWRzOiBBcnJheTxzdHJpbmc+ID0gT2JqZWN0LmtleXMoY2hhbmdlZEZpZWxkc01hcCkuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGNhc2VJZCA9PiBPYmplY3Qua2V5cyh0aGlzLl90YXNrQ29udGVudFNlcnZpY2UucmVmZXJlbmNlZFRhc2tBbmRDYXNlSWRzKT8uaW5jbHVkZXMoY2FzZUlkKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRGaWVsZHM6IEFycmF5PENoYW5nZWRGaWVsZHM+ID0gW107XG4gICAgICAgICAgICBmaWx0ZXJlZENhc2VJZHMuZm9yRWFjaChjYXNlSWQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhc2tJZHM6IEFycmF5PHN0cmluZz4gPSB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UucmVmZXJlbmNlZFRhc2tBbmRDYXNlSWRzW2Nhc2VJZF07XG4gICAgICAgICAgICAgICAgY2hhbmdlZEZpZWxkcy5wdXNoKC4uLnRoaXMuX2NoYW5nZWRGaWVsZHNTZXJ2aWNlLnBhcnNlQ2hhbmdlZEZpZWxkc0J5Q2FzZUFuZFRhc2tJZHMoY2FzZUlkLCB0YXNrSWRzLCBjaGFuZ2VkRmllbGRzTWFwKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNoYW5nZWRGaWVsZHMuZmlsdGVyKGZpZWxkcyA9PiBmaWVsZHMgIT09IHVuZGVmaW5lZCkuZm9yRWFjaChmaWVsZHMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGFza1BhbmVsRGF0YS5jaGFuZ2VkRmllbGRzLm5leHQoZmllbGRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgX3Rhc2tPcGVyYXRpb25zLm9wZW4kLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucHJldmVudEV4cGFuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBfdGFza09wZXJhdGlvbnMuY2xvc2UkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLl90YXNrRm9yY2VPcGVuIHx8IHRoaXMucHJldmVudENvbGxhcHNlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29sbGFwc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIF90YXNrT3BlcmF0aW9ucy5yZWxvYWQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90YXNrVmlld1NlcnZpY2UucmVsb2FkQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIF90YXNrT3BlcmF0aW9ucy5mb3JjZVJlbG9hZCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2tWaWV3U2VydmljZS5yZWxvYWRDdXJyZW50UGFnZSh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3Rhc2tEaXNhYmxlQnV0dG9uRnVuY3Rpb25zID0ge1xuICAgICAgICAgICAgZmluaXNoOiAodDogVGFzaykgPT4gZmFsc2UsXG4gICAgICAgICAgICBhc3NpZ246ICh0OiBUYXNrKSA9PiBmYWxzZSxcbiAgICAgICAgICAgIGRlbGVnYXRlOiAodDogVGFzaykgPT4gZmFsc2UsXG4gICAgICAgICAgICByZWFzc2lnbjogKHQ6IFRhc2spID0+IGZhbHNlLFxuICAgICAgICAgICAgY2FuY2VsOiAodDogVGFzaykgPT4gZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChfZGlzYWJsZUZ1bmN0aW9ucykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl90YXNrRGlzYWJsZUJ1dHRvbkZ1bmN0aW9ucywgX2Rpc2FibGVGdW5jdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmplY3RlZFRhYkRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3Vuc3ViID0gaW5qZWN0ZWRUYWJEYXRhLnRhYlNlbGVjdGVkJC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcihib29sID0+IGJvb2wgJiYgdGhpcy5pc0V4cGFuZGVkKCkpXG4gICAgICAgICAgICApLnN1YnNjcmliZSggKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jYW5SZWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFza0RhdGFTZXJ2aWNlLmluaXRpYWxpemVUYXNrRGF0YUZpZWxkcyh0aGlzLl9jYWxsQ2hhaW4uY3JlYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudGFzaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2tTaG91bGRCZUJsb2NrZWQgPSAhdGFzaz8uYXNzaWduZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhdGhpcy5fdXNlckNvbXBhcmF0b3IuY29tcGFyZVVzZXJzKHRhc2suYXNzaWduZWUuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLmJsb2NrRmllbGRzKHRhc2tTaG91bGRCZUJsb2NrZWQpO1xuICAgICAgICAgICAgICAgICAgICB9KSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuUmVsb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudGFzayA9IHRoaXMuX3Rhc2tQYW5lbERhdGEudGFzaztcblxuICAgICAgICB0aGlzLmNyZWF0ZUNvbnRlbnRQb3J0YWwoKTtcbiAgICAgICAgdGhpcy5fc3ViID0gdGhpcy5fdGFza1BhbmVsRGF0YS5jaGFuZ2VkRmllbGRzLnN1YnNjcmliZShjaEZpZWxkcyA9PiB7XG4gICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudXBkYXRlRnJvbUNoYW5nZWRGaWVsZHMoY2hGaWVsZHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9zdWJQYW5lbFVwZGF0ZSA9IHRoaXMuX3Rhc2tWaWV3U2VydmljZS5wYW5lbFVwZGF0ZS5waXBlKFxuICAgICAgICAgICAgbWFwKGEgPT4gYS5maW5kKHAgPT4gcC50YXNrLnN0cmluZ0lkID09PSB0aGlzLnRhc2tQYW5lbERhdGEudGFzay5zdHJpbmdJZCkpLFxuICAgICAgICAgICAgZmlsdGVyKHAgPT4gISFwKVxuICAgICAgICApLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVGZWF0dXJlZEZpZWxkc1ZhbHVlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMucGFuZWxSZWYub3BlbmVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucHJldmVudEV4cGFuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS5leHBhbnNpb25TdGFydGVkKCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90YXNrU3RhdGUuaXNMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXNzaWduUG9saWN5U2VydmljZS5wZXJmb3JtQXNzaWduUG9saWN5KHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucGFuZWxSZWYuY2xvc2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2tTdGF0ZS5pc0xvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Fzc2lnblBvbGljeVNlcnZpY2UucGVyZm9ybUFzc2lnblBvbGljeShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBhbmVsUmVmLmFmdGVyRXhwYW5kLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLmJsb2NrRmllbGRzKHRoaXMuaGFzTm9GaW5pc2hQZXJtaXNzaW9uKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tQYW5lbERhdGEuaW5pdGlhbGx5RXhwYW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UuZXhwYW5zaW9uRmluaXNoZWQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucGFuZWxSZWYuYWZ0ZXJDb2xsYXBzZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdGFza1BhbmVsRGF0YS5pbml0aWFsbHlFeHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoKHRoaXMuX3Rhc2tQYW5lbERhdGEuaW5pdGlhbGx5RXhwYW5kZWQgfHwgdGhpcy5fdGFza0ZvcmNlT3BlbikgJiYgIXRoaXMucHJldmVudEV4cGFuZCkge1xuICAgICAgICAgICAgdGhpcy5wYW5lbFJlZi5leHBhbmRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlQ29udGVudFBvcnRhbCgpOiB2b2lkO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHRhc2tQYW5lbERhdGEoZGF0YTogVGFza1BhbmVsRGF0YSkge1xuICAgICAgICB0aGlzLl90YXNrUGFuZWxEYXRhID0gZGF0YTtcbiAgICAgICAgaWYgKHRoaXMuX3Rhc2tDb250ZW50U2VydmljZSBpbnN0YW5jZW9mIFVubGltaXRlZFRhc2tDb250ZW50U2VydmljZSAmJiB0aGlzLnBhbmVsUmVmKSB7XG4gICAgICAgICAgICB0aGlzLmNvbGxhcHNlKCk7XG4gICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudGFzayA9IHRoaXMuX3Rhc2tQYW5lbERhdGEudGFzaztcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdWIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3N1YiA9IHRoaXMuX3Rhc2tQYW5lbERhdGEuY2hhbmdlZEZpZWxkcy5zdWJzY3JpYmUoY2hGaWVsZHMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS51cGRhdGVGcm9tQ2hhbmdlZEZpZWxkcyhjaEZpZWxkcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNvbHZlRmVhdHVyZWRGaWVsZHNWYWx1ZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRhc2tQYW5lbERhdGEoKTogVGFza1BhbmVsRGF0YSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YXNrUGFuZWxEYXRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFza1N0YXRlLmlzTG9hZGluZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdG9wTG9hZGluZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKHRoaXMuX3Rhc2tQYW5lbERhdGEudGFzay5zdHJpbmdJZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXZlbnRQYW5lbE9wZW4oJGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1BhcGVyVmlldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcGVyVmlldy5wYXBlclZpZXc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFBhbmVsUmVmKHBhbmVsUmVmOiBNYXRFeHBhbnNpb25QYW5lbCkge1xuICAgICAgICB0aGlzLnBhbmVsUmVmID0gcGFuZWxSZWY7XG4gICAgICAgIHRoaXMucGFuZWxSZWZPdXRwdXQuZW1pdChwYW5lbFJlZik7XG4gICAgfVxuXG4gICAgYXNzaWduKCkge1xuICAgICAgICB0aGlzLl9hc3NpZ25UYXNrU2VydmljZS5hc3NpZ24odGhpcy5fY2FsbENoYWluLmNyZWF0ZSgoYWZ0ZXJBY3Rpb24gPT4ge1xuICAgICAgICAgICAgaWYgKGFmdGVyQWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFza0RhdGFTZXJ2aWNlLmluaXRpYWxpemVUYXNrRGF0YUZpZWxkcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaFBvbGljeVNlcnZpY2UucGVyZm9ybUZpbmlzaFBvbGljeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSkpO1xuICAgIH1cblxuICAgIGRlbGVnYXRlKCkge1xuICAgICAgICB0aGlzLl9kZWxlZ2F0ZVRhc2tTZXJ2aWNlLmRlbGVnYXRlKCk7XG4gICAgfVxuXG4gICAgY2FuY2VsKCkge1xuICAgICAgICB0aGlzLl9jYW5jZWxUYXNrU2VydmljZS5jYW5jZWwodGhpcy5fY2FsbENoYWluLmNyZWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90YXNrT3BlcmF0aW9ucy5yZWxvYWQoKTtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2tPcGVyYXRpb25zLmNsb3NlKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBmaW5pc2goKSB7XG4gICAgICAgIGlmICghdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnZhbGlkYXRlVGFza0RhdGEoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrLmRhdGFTaXplIDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90YXNrRGF0YVNlcnZpY2UuaW5pdGlhbGl6ZVRhc2tEYXRhRmllbGRzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpbnZhbGlkRmllbGRzID0gdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLmdldEludmFsaWRUYXNrRGF0YSgpO1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW52YWxpZEZpZWxkc1swXS5zdHJpbmdJZCkuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgICAgICAgICBibG9jazogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICBpbmxpbmU6ICduZWFyZXN0J1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9maW5pc2hUYXNrU2VydmljZS52YWxpZGF0ZURhdGFBbmRGaW5pc2goKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbGxhcHNlKCkge1xuICAgICAgICB0aGlzLnBhbmVsUmVmLmNsb3NlKCk7XG4gICAgICAgIHRoaXMucGFuZWxSZWYuZXhwYW5kZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBleHBhbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLnByZXZlbnRFeHBhbmQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHRoaXMucGFuZWxSZWYub3BlbigpO1xuICAgICAgICB0aGlzLnBhbmVsUmVmLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQXNzaWduKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGVybWlzc2lvblNlcnZpY2UuY2FuQXNzaWduKHRoaXMudGFza1BhbmVsRGF0YS50YXNrKSAmJiB0aGlzLmdldEFzc2lnblRpdGxlKCkgIT09ICcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5SZWFzc2lnbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25TZXJ2aWNlLmNhblJlYXNzaWduKHRoaXMudGFza1BhbmVsRGF0YS50YXNrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQ2FuY2VsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGVybWlzc2lvblNlcnZpY2UuY2FuQ2FuY2VsKHRoaXMudGFza1BhbmVsRGF0YS50YXNrKSAmJiB0aGlzLmdldENhbmNlbFRpdGxlKCkgIT09ICcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5GaW5pc2goKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wZXJtaXNzaW9uU2VydmljZS5jYW5GaW5pc2godGhpcy50YXNrUGFuZWxEYXRhLnRhc2spICYmIHRoaXMuZ2V0RmluaXNoVGl0bGUoKSAhPT0gJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNOb0ZpbmlzaFBlcm1pc3Npb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fcGVybWlzc2lvblNlcnZpY2UuY2FuRmluaXNoKHRoaXMudGFza1BhbmVsRGF0YS50YXNrKVxuICAgIH1cblxuICAgIHB1YmxpYyBjYW5Db2xsYXBzZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rhc2tGb3JjZU9wZW4gPyBmYWxzZSA6IHRoaXMuX3Blcm1pc3Npb25TZXJ2aWNlLmNhbkNvbGxhcHNlKHRoaXMudGFza1BhbmVsRGF0YS50YXNrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuRG8oYWN0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wZXJtaXNzaW9uU2VydmljZS5oYXNUYXNrUGVybWlzc2lvbih0aGlzLnRhc2tQYW5lbERhdGEudGFzaywgYWN0aW9uKSAmJiB0aGlzLmdldERlbGVnYXRlVGl0bGUoKSAhPT0gJyc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFzc2lnblRpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAodGhpcy50YXNrUGFuZWxEYXRhLnRhc2suYXNzaWduVGl0bGUgPT09ICcnIHx8IHRoaXMudGFza1BhbmVsRGF0YS50YXNrLmFzc2lnblRpdGxlKVxuICAgICAgICAgICAgPyB0aGlzLnRhc2tQYW5lbERhdGEudGFzay5hc3NpZ25UaXRsZSA6ICd0YXNrcy52aWV3LmFzc2lnbic7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENhbmNlbFRpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAodGhpcy50YXNrUGFuZWxEYXRhLnRhc2suY2FuY2VsVGl0bGUgPT09ICcnIHx8IHRoaXMudGFza1BhbmVsRGF0YS50YXNrLmNhbmNlbFRpdGxlKVxuICAgICAgICAgICAgPyB0aGlzLnRhc2tQYW5lbERhdGEudGFzay5jYW5jZWxUaXRsZSA6ICd0YXNrcy52aWV3LmNhbmNlbCc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlbGVnYXRlVGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnRhc2tQYW5lbERhdGEudGFzay5kZWxlZ2F0ZVRpdGxlID09PSAnJyB8fCB0aGlzLnRhc2tQYW5lbERhdGEudGFzay5kZWxlZ2F0ZVRpdGxlKVxuICAgICAgICAgICAgPyB0aGlzLnRhc2tQYW5lbERhdGEudGFzay5kZWxlZ2F0ZVRpdGxlIDogJ3Rhc2tzLnZpZXcuZGVsZWdhdGUnO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaW5pc2hUaXRsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gKHRoaXMudGFza1BhbmVsRGF0YS50YXNrLmZpbmlzaFRpdGxlID09PSAnJyB8fCB0aGlzLnRhc2tQYW5lbERhdGEudGFzay5maW5pc2hUaXRsZSlcbiAgICAgICAgICAgID8gdGhpcy50YXNrUGFuZWxEYXRhLnRhc2suZmluaXNoVGl0bGUgOiAndGFza3Mudmlldy5maW5pc2gnO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5EaXNhYmxlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgZGlzYWJsZSA9IGZhbHNlO1xuICAgICAgICBpZiAoISF0aGlzLnRhc2tQYW5lbERhdGEgJiYgISF0aGlzLnRhc2tQYW5lbERhdGEudGFzaykge1xuICAgICAgICAgICAgZGlzYWJsZSA9IGRpc2FibGVcbiAgICAgICAgICAgICAgICB8fCAhIXRoaXMuX3Rhc2tTdGF0ZS5pc0xvYWRpbmcodGhpcy50YXNrUGFuZWxEYXRhLnRhc2suc3RyaW5nSWQpXG4gICAgICAgICAgICAgICAgfHwgISF0aGlzLl90YXNrU3RhdGUuaXNVcGRhdGluZyh0aGlzLnRhc2tQYW5lbERhdGEudGFzay5zdHJpbmdJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpc2FibGUgfHwgdGhpcy5fdGFza0Rpc2FibGVCdXR0b25GdW5jdGlvbnNbdHlwZV0oey4uLnRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEZlYXR1cmVkTWV0YVZhbHVlKHNlbGVjdGVkSGVhZGVyOiBIZWFkZXJDb2x1bW4pOiBGZWF0dXJlZFZhbHVlIHtcbiAgICAgICAgY29uc3QgdGFzayA9IHRoaXMuX3Rhc2tQYW5lbERhdGEudGFzaztcbiAgICAgICAgc3dpdGNoIChzZWxlY3RlZEhlYWRlci5maWVsZElkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIGNhc2UgVGFza01ldGFGaWVsZC5DQVNFOlxuICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IHRhc2suY2FzZVRpdGxlLCBpY29uOiAnJywgdHlwZTogJ21ldGEnfTtcbiAgICAgICAgICAgIGNhc2UgVGFza01ldGFGaWVsZC5DQVNFX0lEOlxuICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IHRhc2suY2FzZUlkLCBpY29uOiAnJywgdHlwZTogJ21ldGEnfTtcbiAgICAgICAgICAgIGNhc2UgVGFza01ldGFGaWVsZC5UQVNLX0lEOlxuICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IHRhc2suc3RyaW5nSWQsIGljb246ICcnLCB0eXBlOiAnbWV0YSd9O1xuICAgICAgICAgICAgY2FzZSBUYXNrTWV0YUZpZWxkLlRJVExFOlxuICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IHRhc2sudGl0bGUsIGljb246ICcnLCB0eXBlOiAnbWV0YSd9O1xuICAgICAgICAgICAgY2FzZSBUYXNrTWV0YUZpZWxkLlBSSU9SSVRZOlxuICAgICAgICAgICAgICAgIC8vIFRPRE8gcHJpb3JpdHlcbiAgICAgICAgICAgICAgICBpZiAoIXRhc2sucHJpb3JpdHkgfHwgdGFzay5wcmlvcml0eSA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt2YWx1ZTogJ2hpZ2gnLCBpY29uOiAnZXJyb3InLCB0eXBlOiAnbWV0YSd9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGFzay5wcmlvcml0eSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3ZhbHVlOiAnbWVkaXVtJywgaWNvbjogJ25vcnRoJywgdHlwZTogJ21ldGEnfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt2YWx1ZTogJ2xvdycsIGljb246ICdzb3V0aCcsIHR5cGU6ICdtZXRhJ307XG4gICAgICAgICAgICBjYXNlIFRhc2tNZXRhRmllbGQuVVNFUjpcbiAgICAgICAgICAgICAgICAvL1RPRE86IHJlZmFjdG9yIGFmdGVyIFVzZXIgcmVmYWN0b3IgUFIgaXMgbWVyZ2VkXG4gICAgICAgICAgICAgICAgcmV0dXJuIHt2YWx1ZTogdGFzay5hc3NpZ25lZSA/IHRhc2suYXNzaWduZWUuZnVsbE5hbWUgOiAnJywgaWNvbjogJ2FjY291bnRfY2lyY2xlJywgdHlwZTogJ21ldGEnfTtcbiAgICAgICAgICAgIGNhc2UgVGFza01ldGFGaWVsZC5BU1NJR05fREFURTpcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGFzay5zdGFydERhdGUgPyB0b01vbWVudCh0YXNrLnN0YXJ0RGF0ZSkuZm9ybWF0KERBVEVfVElNRV9GT1JNQVRfU1RSSU5HKSA6ICcnLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiAnZXZlbnQnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWV0YSdcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEZlYXR1cmVkSW1tZWRpYXRlVmFsdWUoc2VsZWN0ZWRIZWFkZXI6IEhlYWRlckNvbHVtbik6IEZlYXR1cmVkVmFsdWUge1xuICAgICAgICBpZiAodGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2sgJiYgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2suaW1tZWRpYXRlRGF0YSkge1xuICAgICAgICAgICAgY29uc3QgaW1tZWRpYXRlID0gdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2suaW1tZWRpYXRlRGF0YS5maW5kKGl0ID0+IGl0LnN0cmluZ0lkID09PSBzZWxlY3RlZEhlYWRlci5maWVsZElkZW50aWZpZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VJbW1lZGlhdGVWYWx1ZShpbW1lZGlhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7dmFsdWU6ICcnLCBpY29uOiAnJywgdHlwZTogJyd9O1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLl9zdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fc3ViVGFza0V2ZW50LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX3N1YlRhc2tEYXRhLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX3Rhc2tPcGVyYXRpb25zLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fc3ViUGFuZWxVcGRhdGUudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy50YXNrRXZlbnQuY29tcGxldGUoKTtcbiAgICAgICAgaWYgKHRoaXMuX3Vuc3ViKSB7XG4gICAgICAgICAgICB0aGlzLl91bnN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGlzRm9yY2VPcGVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFza0ZvcmNlT3BlbiAmJiAhIXRoaXMudGFza0xpc3RWaXJ0dWFsU2Nyb2xsPy5nZXRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbnRlbnRNaW5IZWlnaHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFza0xpc3RWaXJ0dWFsU2Nyb2xsLmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAtIDMyICsgJ3B4JztcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFeHBhbmRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFuZWxSZWY/LmV4cGFuZGVkICYmICF0aGlzLl90YXNrQ29udGVudFNlcnZpY2U/LmlzRXhwYW5kaW5nO1xuICAgIH1cbn1cbiJdfQ==