@magic-xpa/angular 4.800.0 → 4.801.0-dev000.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/index.mjs +57 -0
- package/{esm2015/magic-xpa-angular.js → esm2020/magic-xpa-angular.mjs} +0 -0
- package/esm2020/src/controls.metadata.model.mjs +180 -0
- package/{esm2015/src/interfaces/sub-form-definition.iterface.js → esm2020/src/interfaces/sub-form-definition.iterface.mjs} +1 -0
- package/esm2020/src/magic.core.module.mjs +157 -0
- package/{esm2015/src/services/ISubformMagicService.js → esm2020/src/services/ISubformMagicService.mjs} +1 -0
- package/esm2020/src/services/OverlayWindowService.mjs +208 -0
- package/esm2020/src/services/StylesMapManager.mjs +28 -0
- package/esm2020/src/services/accessor.magic.service.mjs +302 -0
- package/{esm2015/src/services/commands-collector.magic.service.js → esm2020/src/services/commands-collector.magic.service.mjs} +7 -4
- package/esm2020/src/services/component-list.magic.service.mjs +46 -0
- package/{esm2015/src/services/confirmation.components.magic.provider.js → esm2020/src/services/confirmation.components.magic.provider.mjs} +2 -2
- package/esm2020/src/services/engine.magic.service.mjs +82 -0
- package/{esm2015/src/services/exit.magic.service.js → esm2020/src/services/exit.magic.service.mjs} +2 -2
- package/esm2020/src/services/magic.lazy.loader.service.mjs +16 -0
- package/{esm2015/src/services/magic.providers.js → esm2020/src/services/magic.providers.mjs} +0 -0
- package/{esm2015/src/services/magic.services.js → esm2020/src/services/magic.services.mjs} +2 -2
- package/{esm2015/src/services/mg-date-adapter.js → esm2020/src/services/mg-date-adapter.mjs} +2 -2
- package/{esm2015/src/services/overlay.conainer.magic.provider.js → esm2020/src/services/overlay.conainer.magic.provider.mjs} +2 -2
- package/esm2020/src/services/router-commands.magic.service.mjs +28 -0
- package/esm2020/src/services/subform.magic.service.mjs +185 -0
- package/{esm2015/src/services/table.magic.service.js → esm2020/src/services/table.magic.service.mjs} +2 -2
- package/esm2020/src/services/task.magics.service.mjs +611 -0
- package/{esm2015/src/services/title.magic.service.js → esm2020/src/services/title.magic.service.mjs} +2 -2
- package/esm2020/src/ui/GuiInteractiveExecutor.mjs +98 -0
- package/{esm2015/src/ui/components/base-magic-alert.component.js → esm2020/src/ui/components/base-magic-alert.component.mjs} +2 -2
- package/{esm2015/src/ui/components/base-magic-confirm.component.js → esm2020/src/ui/components/base-magic-confirm.component.mjs} +2 -2
- package/esm2020/src/ui/components/magic-alert.component.mjs +71 -0
- package/esm2020/src/ui/components/magic-confirmation-box.component.mjs +82 -0
- package/{esm2015/src/ui/directives/NonMagicControlDirective.js → esm2020/src/ui/directives/NonMagicControlDirective.mjs} +2 -2
- package/{esm2015/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.js → esm2020/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.mjs} +2 -2
- package/{esm2015/src/ui/directives/magic/checkbox.magic.directive.js → esm2020/src/ui/directives/magic/checkbox.magic.directive.mjs} +2 -2
- package/{esm2015/src/ui/directives/magic/combobox.magic.directive.js → esm2020/src/ui/directives/magic/combobox.magic.directive.mjs} +2 -2
- package/{esm2015/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.js → esm2020/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.mjs} +3 -4
- package/{esm2015/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.js → esm2020/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.mjs} +2 -2
- package/{esm2015/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.js → esm2020/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.mjs} +3 -4
- package/{esm2015/src/ui/directives/magic/input.noformcontrol.magic.directive.js → esm2020/src/ui/directives/magic/input.noformcontrol.magic.directive.mjs} +2 -2
- package/{esm2015/src/ui/directives/magic/nocontrol.magic.directive.js → esm2020/src/ui/directives/magic/nocontrol.magic.directive.mjs} +2 -2
- package/{esm2015/src/ui/directives/magic/row.magic.directive.js → esm2020/src/ui/directives/magic/row.magic.directive.mjs} +2 -2
- package/{esm2015/src/ui/directives/magic-focus.directive.js → esm2020/src/ui/directives/magic-focus.directive.mjs} +2 -2
- package/esm2020/src/ui/directives/magic.directive.mjs +207 -0
- package/esm2020/src/ui/directives/magicViewContainerRef.directive.mjs +20 -0
- package/{esm2015/src/ui/directives/mgformat.magic.directive.js → esm2020/src/ui/directives/mgformat.magic.directive.mjs} +2 -2
- package/{esm2015/src/ui/directives/range-validator.magic.directive.js → esm2020/src/ui/directives/range-validator.magic.directive.mjs} +2 -2
- package/{esm2015/src/ui/magic-confirmationBox.js → esm2020/src/ui/magic-confirmationBox.mjs} +0 -0
- package/{esm2015/src/ui/magic-modal/base-magic-overlay-container.js → esm2020/src/ui/magic-modal/base-magic-overlay-container.mjs} +0 -0
- package/{esm2015/src/ui/magic-modal/magic-modal-form.js → esm2020/src/ui/magic-modal/magic-modal-form.mjs} +0 -0
- package/{esm2015/src/ui/magic-modal/magic-modal-interface.js → esm2020/src/ui/magic-modal/magic-modal-interface.mjs} +1 -0
- package/esm2020/src/ui/magic-modal/magic-overlay-container-wrapper.mjs +135 -0
- package/esm2020/src/ui/magic-modal/magic-overlay-container.mjs +165 -0
- package/esm2020/src/ui/magic-root.component.mjs +237 -0
- package/esm2020/src/ui/mgerror.magic.component.mjs +120 -0
- package/esm2020/src/ui/pipes/date.magic.pipe.mjs +105 -0
- package/{esm2015/src/ui/pipes/time.magic.pipe.js → esm2020/src/ui/pipes/time.magic.pipe.mjs} +3 -3
- package/esm2020/src/ui/router-container.magic.component.mjs +109 -0
- package/esm2020/src/ui/subform.magic.component.mjs +52 -0
- package/{esm2015/src/ui/task-base.magic.component.js → esm2020/src/ui/task-base.magic.component.mjs} +2 -2
- package/{esm2015/src/ui/utils.js → esm2020/src/ui/utils.mjs} +0 -0
- package/fesm2015/magic-xpa-angular.mjs +4578 -0
- package/fesm2015/magic-xpa-angular.mjs.map +1 -0
- package/{fesm2015/magic-xpa-angular.js → fesm2020/magic-xpa-angular.mjs} +435 -415
- package/fesm2020/magic-xpa-angular.mjs.map +1 -0
- package/index.d.ts +1 -0
- package/package.json +28 -15
- package/src/magic.core.module.d.ts +3 -8
- package/src/services/OverlayWindowService.d.ts +2 -2
- package/src/services/accessor.magic.service.d.ts +2 -2
- package/src/services/commands-collector.magic.service.d.ts +2 -2
- package/src/services/component-list.magic.service.d.ts +3 -0
- package/src/services/confirmation.components.magic.provider.d.ts +2 -2
- package/src/services/engine.magic.service.d.ts +2 -2
- package/src/services/exit.magic.service.d.ts +2 -2
- package/src/services/magic.lazy.loader.service.d.ts +6 -0
- package/src/services/magic.services.d.ts +2 -2
- package/src/services/mg-date-adapter.d.ts +2 -2
- package/src/services/overlay.conainer.magic.provider.d.ts +2 -2
- package/src/services/router-commands.magic.service.d.ts +2 -2
- package/src/services/subform.magic.service.d.ts +6 -4
- package/src/services/table.magic.service.d.ts +2 -2
- package/src/services/task.magics.service.d.ts +2 -2
- package/src/services/title.magic.service.d.ts +2 -2
- package/src/ui/components/base-magic-alert.component.d.ts +2 -2
- package/src/ui/components/base-magic-confirm.component.d.ts +2 -2
- package/src/ui/components/magic-alert.component.d.ts +2 -2
- package/src/ui/components/magic-confirmation-box.component.d.ts +2 -2
- package/src/ui/directives/NonMagicControlDirective.d.ts +2 -2
- package/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.d.ts +2 -2
- package/src/ui/directives/magic/checkbox.magic.directive.d.ts +2 -2
- package/src/ui/directives/magic/combobox.magic.directive.d.ts +2 -2
- package/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.d.ts +2 -2
- package/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.d.ts +2 -2
- package/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.d.ts +2 -2
- package/src/ui/directives/magic/input.noformcontrol.magic.directive.d.ts +2 -2
- package/src/ui/directives/magic/nocontrol.magic.directive.d.ts +2 -2
- package/src/ui/directives/magic/row.magic.directive.d.ts +2 -2
- package/src/ui/directives/magic-focus.directive.d.ts +2 -2
- package/src/ui/directives/magic.directive.d.ts +2 -2
- package/src/ui/directives/magicViewContainerRef.directive.d.ts +2 -2
- package/src/ui/directives/mgformat.magic.directive.d.ts +2 -2
- package/src/ui/directives/range-validator.magic.directive.d.ts +2 -2
- package/src/ui/magic-modal/magic-overlay-container-wrapper.d.ts +7 -5
- package/src/ui/magic-modal/magic-overlay-container.d.ts +2 -2
- package/src/ui/magic-root.component.d.ts +2 -2
- package/src/ui/mgerror.magic.component.d.ts +2 -2
- package/src/ui/pipes/date.magic.pipe.d.ts +2 -2
- package/src/ui/pipes/time.magic.pipe.d.ts +2 -2
- package/src/ui/router-container.magic.component.d.ts +2 -2
- package/src/ui/subform.magic.component.d.ts +2 -2
- package/src/ui/task-base.magic.component.d.ts +2 -2
- package/bundles/magic-xpa-angular.umd.js +0 -5028
- package/bundles/magic-xpa-angular.umd.js.map +0 -1
- package/bundles/magic-xpa-angular.umd.min.js +0 -16
- package/bundles/magic-xpa-angular.umd.min.js.map +0 -1
- package/esm2015/index.js +0 -56
- package/esm2015/src/controls.metadata.model.js +0 -180
- package/esm2015/src/magic.core.module.js +0 -173
- package/esm2015/src/services/OverlayWindowService.js +0 -205
- package/esm2015/src/services/StylesMapManager.js +0 -29
- package/esm2015/src/services/accessor.magic.service.js +0 -302
- package/esm2015/src/services/component-list.magic.service.js +0 -36
- package/esm2015/src/services/engine.magic.service.js +0 -82
- package/esm2015/src/services/router-commands.magic.service.js +0 -25
- package/esm2015/src/services/subform.magic.service.js +0 -182
- package/esm2015/src/services/task.magics.service.js +0 -611
- package/esm2015/src/ui/GuiInteractiveExecutor.js +0 -98
- package/esm2015/src/ui/components/magic-alert.component.js +0 -72
- package/esm2015/src/ui/components/magic-confirmation-box.component.js +0 -83
- package/esm2015/src/ui/directives/magic.directive.js +0 -207
- package/esm2015/src/ui/directives/magicViewContainerRef.directive.js +0 -20
- package/esm2015/src/ui/magic-modal/magic-overlay-container-wrapper.js +0 -131
- package/esm2015/src/ui/magic-modal/magic-overlay-container.js +0 -169
- package/esm2015/src/ui/magic-root.component.js +0 -237
- package/esm2015/src/ui/mgerror.magic.component.js +0 -120
- package/esm2015/src/ui/pipes/date.magic.pipe.js +0 -106
- package/esm2015/src/ui/router-container.magic.component.js +0 -109
- package/esm2015/src/ui/subform.magic.component.js +0 -52
- package/fesm2015/magic-xpa-angular.js.map +0 -1
|
@@ -1,611 +0,0 @@
|
|
|
1
|
-
import { EventEmitter, Injectable } from '@angular/core';
|
|
2
|
-
import { FormControl, FormGroup } from '@angular/forms';
|
|
3
|
-
import { filter } from 'rxjs/operators';
|
|
4
|
-
import { Subject } from 'rxjs';
|
|
5
|
-
import { isNullOrUndefined, isUndefined } from 'util';
|
|
6
|
-
import { StylesMapManager } from './StylesMapManager';
|
|
7
|
-
import { EngineMagicService } from './engine.magic.service';
|
|
8
|
-
import { Records } from '../controls.metadata.model';
|
|
9
|
-
import { CommandType, GuiConstants, HtmlProperties } from '@magic-xpa/gui';
|
|
10
|
-
import { NString, StringBuilder } from '@magic-xpa/mscorelib';
|
|
11
|
-
import { StorageAttribute } from '@magic-xpa/utils';
|
|
12
|
-
import { getGuiEventObj } from '@magic-xpa/engine';
|
|
13
|
-
import { GuiInteractiveExecutor } from '../ui/GuiInteractiveExecutor';
|
|
14
|
-
import { OverlayWindowService } from './OverlayWindowService';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "./engine.magic.service";
|
|
17
|
-
import * as i2 from "./OverlayWindowService";
|
|
18
|
-
export class TaskMagicService {
|
|
19
|
-
constructor(magic, overlayWindowService) {
|
|
20
|
-
this.magic = magic;
|
|
21
|
-
this.overlayWindowService = overlayWindowService;
|
|
22
|
-
this.Records = new Records();
|
|
23
|
-
this.formGroups = [];
|
|
24
|
-
this.refreshDom = new Subject();
|
|
25
|
-
this.detectChanges = new Subject();
|
|
26
|
-
this.interactiveCommands = new Subject();
|
|
27
|
-
this.OnSelectedRowChanged = new EventEmitter();
|
|
28
|
-
this.customPropertiesSubject = new Subject();
|
|
29
|
-
this.recordsCountChangeSubject = new Subject();
|
|
30
|
-
this.oldPageSize = 0;
|
|
31
|
-
this.Records.setGuiTopIndex(0);
|
|
32
|
-
this.mgInputDateFormat = null;
|
|
33
|
-
}
|
|
34
|
-
getIsLoggenIn() {
|
|
35
|
-
return this.magic.getIsLoggedIn();
|
|
36
|
-
}
|
|
37
|
-
get taskId() {
|
|
38
|
-
return this._taskId;
|
|
39
|
-
}
|
|
40
|
-
set taskId(value) {
|
|
41
|
-
this._taskId = value;
|
|
42
|
-
}
|
|
43
|
-
get ScreenControlsData() {
|
|
44
|
-
return this.Records.list['0'];
|
|
45
|
-
}
|
|
46
|
-
settemplate(value) {
|
|
47
|
-
this.template = value;
|
|
48
|
-
}
|
|
49
|
-
buildScreenModeControls() {
|
|
50
|
-
const group = new FormGroup({});
|
|
51
|
-
for (const key in this.template) {
|
|
52
|
-
if (this.template[key] == '0') {
|
|
53
|
-
let fc = new FormControl('');
|
|
54
|
-
this.setStubValue(0, fc, key);
|
|
55
|
-
group.addControl(key, fc);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
this.ScreenModeControls = group;
|
|
59
|
-
}
|
|
60
|
-
isTableControl(id) {
|
|
61
|
-
return this.template[id] == '1';
|
|
62
|
-
}
|
|
63
|
-
getMgInputDateFormat() { return this.mgInputDateFormat; }
|
|
64
|
-
getFormControl(guiRowid, id) {
|
|
65
|
-
let c;
|
|
66
|
-
let group = this.isTableControl(id) ? this.formGroups[guiRowid] : this.ScreenModeControls;
|
|
67
|
-
if (!isNullOrUndefined(group)) {
|
|
68
|
-
group.get(id);
|
|
69
|
-
c = group.controls[id];
|
|
70
|
-
}
|
|
71
|
-
return c;
|
|
72
|
-
}
|
|
73
|
-
setInputTextValue(controlId, guiRowid, val) {
|
|
74
|
-
this.setValue(controlId, guiRowid, this.ConvertValToNative(controlId, 0, val));
|
|
75
|
-
const fc = this.getFormControl(guiRowid, controlId);
|
|
76
|
-
if (!isNullOrUndefined(val))
|
|
77
|
-
fc.setValue(val);
|
|
78
|
-
}
|
|
79
|
-
buildTableRowControls(guiRowId) {
|
|
80
|
-
const group = new FormGroup({});
|
|
81
|
-
for (const key in this.template) {
|
|
82
|
-
if (this.template[key] == '1') {
|
|
83
|
-
let fc = new FormControl('');
|
|
84
|
-
this.setStubValue(guiRowId, fc, key);
|
|
85
|
-
group.addControl(key, fc);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
this.formGroups[guiRowId] = group;
|
|
89
|
-
}
|
|
90
|
-
updateRecordsBeforeCurrentView(value) {
|
|
91
|
-
this.Records.recordsBeforeCurrentView = value;
|
|
92
|
-
}
|
|
93
|
-
setIncludesFirst(value) {
|
|
94
|
-
this.Records.includesFirst = value;
|
|
95
|
-
}
|
|
96
|
-
setIncludesLast(value) {
|
|
97
|
-
this.Records.includesLast = value;
|
|
98
|
-
}
|
|
99
|
-
markRowAsCreated(guiRowId) {
|
|
100
|
-
this.Records.markRowAsCreated(guiRowId);
|
|
101
|
-
}
|
|
102
|
-
markRowAsNotCreated(guiRowId) {
|
|
103
|
-
this.Records.markRowAsNotCreated(guiRowId);
|
|
104
|
-
}
|
|
105
|
-
startRowEditing(guiRowId) {
|
|
106
|
-
this.Records.startRowEditing(guiRowId);
|
|
107
|
-
}
|
|
108
|
-
stopRowEditing(guiRowId) {
|
|
109
|
-
this.Records.stopRowEditing(guiRowId);
|
|
110
|
-
}
|
|
111
|
-
isRowInRowEditing(guiRowId) {
|
|
112
|
-
return this.Records.isRowInRowEditing(guiRowId);
|
|
113
|
-
}
|
|
114
|
-
setIsEmptyDataView(isEmpty) {
|
|
115
|
-
if (this.Records.isEmptyDataView !== isEmpty) {
|
|
116
|
-
if (isEmpty)
|
|
117
|
-
this.recordsCountChangeSubject.next(0);
|
|
118
|
-
this.Records.isEmptyDataView = isEmpty;
|
|
119
|
-
this.tableService.refreshDataSource();
|
|
120
|
-
this.refreshView();
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
initTask(taskId, taskDescription) {
|
|
124
|
-
this.Records.createFirst();
|
|
125
|
-
this.oldPageSize = 0;
|
|
126
|
-
if (this.IsStub()) {
|
|
127
|
-
this.loadData();
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
this.taskId = taskId;
|
|
131
|
-
this.settemplate(taskDescription);
|
|
132
|
-
}
|
|
133
|
-
this.buildScreenModeControls();
|
|
134
|
-
if (!isNullOrUndefined(this.subscribeRefreshDom))
|
|
135
|
-
this.subscribeRefreshDom.unsubscribe();
|
|
136
|
-
if (!isNullOrUndefined(this.subscribeInteractiveCommands))
|
|
137
|
-
this.subscribeInteractiveCommands.unsubscribe();
|
|
138
|
-
this.subscribeRefreshDom = this.magic.refreshDom.pipe(filter(command => command.TaskTag === this.taskId))
|
|
139
|
-
.subscribe(command => {
|
|
140
|
-
this.executeCommand(command);
|
|
141
|
-
});
|
|
142
|
-
this.subscribeInteractiveCommands = this.magic.interactiveCommands
|
|
143
|
-
.pipe(filter(command => command.TaskTag === this.taskId))
|
|
144
|
-
.subscribe(command => {
|
|
145
|
-
this.executeInteractiveCommand(command);
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
refreshView() {
|
|
149
|
-
this.detectChanges.next('');
|
|
150
|
-
}
|
|
151
|
-
insertEvent(guiEvent) {
|
|
152
|
-
guiEvent.TaskID = this.taskId;
|
|
153
|
-
this.magic.insertEvent(guiEvent);
|
|
154
|
-
}
|
|
155
|
-
GetControlPictureMask(controlName) {
|
|
156
|
-
return this.magic.GetControlPictureMask(this.taskId, controlName);
|
|
157
|
-
}
|
|
158
|
-
ValidateControlValue(controlName, value) {
|
|
159
|
-
return this.magic.ValidateControlValue(this.taskId, controlName, value);
|
|
160
|
-
}
|
|
161
|
-
GetRangedValue(controlName, value) {
|
|
162
|
-
return this.magic.GetRangedValue(this.taskId, controlName, value);
|
|
163
|
-
}
|
|
164
|
-
GetFldRanges(controlName) {
|
|
165
|
-
return this.magic.GetFldRanges(this.taskId, controlName);
|
|
166
|
-
}
|
|
167
|
-
getProperty(controlId, prop, guiRowId) {
|
|
168
|
-
if (isNullOrUndefined(guiRowId))
|
|
169
|
-
guiRowId = '0';
|
|
170
|
-
if (this.IsStub())
|
|
171
|
-
return this.getPropertyStub(this.Records.list[guiRowId], controlId, prop);
|
|
172
|
-
else {
|
|
173
|
-
let rec = this.Records.list[guiRowId];
|
|
174
|
-
if (isNullOrUndefined(rec))
|
|
175
|
-
debugger;
|
|
176
|
-
else
|
|
177
|
-
return this.Records.list[guiRowId].getProperty(controlId, prop);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
getPropertyStub(ControlsProperties, controlId, prop) {
|
|
181
|
-
ControlsProperties = ControlsProperties.ControlsProperties;
|
|
182
|
-
if (controlId in ControlsProperties) {
|
|
183
|
-
if (prop in ControlsProperties[controlId].properties) {
|
|
184
|
-
return ControlsProperties[controlId].properties[prop];
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
return '';
|
|
188
|
-
}
|
|
189
|
-
getStyleStub(ControlsProperties, controlId, styleName) {
|
|
190
|
-
ControlsProperties = ControlsProperties.ControlsProperties;
|
|
191
|
-
return ControlsProperties[controlId].stylesMap.get(styleName);
|
|
192
|
-
}
|
|
193
|
-
getClasses(controlId, guiRowId) {
|
|
194
|
-
if (isNullOrUndefined(guiRowId))
|
|
195
|
-
guiRowId = '0';
|
|
196
|
-
return this.Records.list[guiRowId].getControlMetadata(controlId).classes;
|
|
197
|
-
}
|
|
198
|
-
getStyle(controlId, styleName, guiRowId) {
|
|
199
|
-
if (isNullOrUndefined(guiRowId))
|
|
200
|
-
guiRowId = '0';
|
|
201
|
-
if (this.IsStub())
|
|
202
|
-
return this.getStyleStub(this.Records.list[guiRowId], controlId, styleName);
|
|
203
|
-
else {
|
|
204
|
-
let magicValue = this.Records.list[guiRowId].getControlMetadata(controlId).stylesMap.get(styleName);
|
|
205
|
-
return StylesMapManager.magicValueGetStyle(styleName, magicValue);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
getValue(controlId, guiRowId) {
|
|
209
|
-
if (isNullOrUndefined(guiRowId))
|
|
210
|
-
guiRowId = '0';
|
|
211
|
-
return this.Records.list.length > +guiRowId ? this.Records.list[guiRowId].values[controlId] : '';
|
|
212
|
-
}
|
|
213
|
-
getFormattedValue(controlName, val) {
|
|
214
|
-
return this.magic.GetFormattedValue(this.taskId, controlName, val);
|
|
215
|
-
}
|
|
216
|
-
setValue(controlId, guiRowId, value) {
|
|
217
|
-
return this.Records.list[guiRowId].setValue(controlId, value);
|
|
218
|
-
}
|
|
219
|
-
executeInteractiveCommand(guiInteractiveCommand) {
|
|
220
|
-
GuiInteractiveExecutor.executeInteractiveCommand(this, guiInteractiveCommand, this.overlayWindowService);
|
|
221
|
-
this.interactiveCommands.next(guiInteractiveCommand);
|
|
222
|
-
}
|
|
223
|
-
handleSetProperty(command, isTableChild) {
|
|
224
|
-
let controlId = command.CtrlName;
|
|
225
|
-
let dvRowId = (command.line || 0);
|
|
226
|
-
let guiRowId = this.getGuiRowId(dvRowId, isTableChild);
|
|
227
|
-
let properties;
|
|
228
|
-
if (command.Operation === HtmlProperties.SelectedRow) {
|
|
229
|
-
if (command.obj1 !== GuiConstants.NO_ROW_SELECTED) {
|
|
230
|
-
guiRowId = this.getGuiRowId(command.obj1, true);
|
|
231
|
-
properties = this.Records.list[guiRowId].getControlMetadata(controlId);
|
|
232
|
-
properties.properties.set(command.Operation, command.line);
|
|
233
|
-
this.tableService.selectRow(guiRowId.toString());
|
|
234
|
-
this.OnSelectedRowChanged.emit(guiRowId.toString());
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
else if (command.Operation === HtmlProperties.Enabled) {
|
|
238
|
-
let c = this.getFormControl(guiRowId.toString(), controlId);
|
|
239
|
-
if (!isNullOrUndefined(c)) {
|
|
240
|
-
if (command.obj1)
|
|
241
|
-
c.enable();
|
|
242
|
-
else
|
|
243
|
-
c.disable();
|
|
244
|
-
}
|
|
245
|
-
properties = this.Records.list[guiRowId].getControlMetadata(controlId);
|
|
246
|
-
properties.properties.set(command.Operation, command.obj1);
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
properties = this.Records.list[guiRowId].getControlMetadata(controlId);
|
|
250
|
-
properties.properties.set(command.Operation, command.obj1);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
executeCommand(command) {
|
|
254
|
-
let dvRowId = (command.line || 0);
|
|
255
|
-
let guiRowId = 0;
|
|
256
|
-
let controlId = command.CtrlName;
|
|
257
|
-
let properties;
|
|
258
|
-
let isTableChild = this.isTableControl(controlId);
|
|
259
|
-
if (command.obj !== null)
|
|
260
|
-
isTableChild = isTableChild || command.obj.IsTableChild;
|
|
261
|
-
guiRowId = this.getGuiRowId(dvRowId, isTableChild);
|
|
262
|
-
switch (command.CommandType) {
|
|
263
|
-
case CommandType.SET_IS_LOGGED_IN:
|
|
264
|
-
break;
|
|
265
|
-
case CommandType.SET_TABLE_TOP_INDEX:
|
|
266
|
-
this.tableService.setTableTopIndex(command.number);
|
|
267
|
-
break;
|
|
268
|
-
case CommandType.REFRESH_TASK:
|
|
269
|
-
this.tableService.refreshDataSource();
|
|
270
|
-
this.refreshView();
|
|
271
|
-
break;
|
|
272
|
-
case CommandType.SET_TABLE_ITEMS_COUNT:
|
|
273
|
-
if (!isUndefined(command.number)) {
|
|
274
|
-
this.tableService.updateTableSize(command.number);
|
|
275
|
-
if (command.number > 0 && this.Records.sizeUpdated &&
|
|
276
|
-
!this.Records.isEmptyDataView) {
|
|
277
|
-
this.recordsCountChangeSubject.next(command.number);
|
|
278
|
-
this.Records.sizeUpdated = false;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
break;
|
|
282
|
-
case CommandType.SET_RECORDS_BEFORE_CURRENT_VIEW:
|
|
283
|
-
this.updateRecordsBeforeCurrentView(command.number);
|
|
284
|
-
break;
|
|
285
|
-
case CommandType.CREATE_TABLE_ROW:
|
|
286
|
-
guiRowId = this.getGuiRowId(command.number, true);
|
|
287
|
-
this.buildTableRowControls(guiRowId);
|
|
288
|
-
this.markRowAsCreated(guiRowId);
|
|
289
|
-
break;
|
|
290
|
-
case CommandType.SET_IS_ROW_EDITING:
|
|
291
|
-
guiRowId = this.getGuiRowId(command.line, command.value);
|
|
292
|
-
this.startRowEditing(guiRowId);
|
|
293
|
-
break;
|
|
294
|
-
case CommandType.SET_NOT_IS_ROW_EDITING:
|
|
295
|
-
guiRowId = this.getGuiRowId(command.line, command.value);
|
|
296
|
-
this.stopRowEditing(guiRowId);
|
|
297
|
-
break;
|
|
298
|
-
case CommandType.UNDO_CREATE_TABLE_ROW:
|
|
299
|
-
this.markRowAsNotCreated(this.getGuiRowId(command.number, true));
|
|
300
|
-
break;
|
|
301
|
-
case CommandType.SET_TABLE_INCLUDES_FIRST:
|
|
302
|
-
this.setIncludesFirst(command.Bool1);
|
|
303
|
-
break;
|
|
304
|
-
case CommandType.SET_TABLE_INCLUDES_LAST:
|
|
305
|
-
this.setIncludesLast(command.Bool1);
|
|
306
|
-
break;
|
|
307
|
-
case CommandType.SET_PROPERTY:
|
|
308
|
-
this.handleSetProperty(command, isTableChild);
|
|
309
|
-
if (command.Operation == HtmlProperties.ReadOnly)
|
|
310
|
-
this.refreshDom.next(command);
|
|
311
|
-
break;
|
|
312
|
-
case CommandType.PROP_SET_USER_PROPERTY:
|
|
313
|
-
properties = this.Records.list[guiRowId].getControlMetadata(controlId);
|
|
314
|
-
if (properties.userProperties.get(command.Operation) !== command.obj1) {
|
|
315
|
-
properties.userProperties.set(command.Operation, command.obj1);
|
|
316
|
-
this.customPropertiesSubject.next({ propertyName: controlId + '~' + command.Operation, value: command.obj1, rowId: guiRowId });
|
|
317
|
-
}
|
|
318
|
-
break;
|
|
319
|
-
case CommandType.PROP_SET_CUSTOM_VALIDATOR:
|
|
320
|
-
{
|
|
321
|
-
properties = this.Records.list[guiRowId].getControlMetadata(controlId);
|
|
322
|
-
let control = this.getFormControl(guiRowId.toString(), controlId);
|
|
323
|
-
if (control != null) {
|
|
324
|
-
properties.customValidators.set(command.Operation, command.obj1);
|
|
325
|
-
if (control.validator != null)
|
|
326
|
-
control.setValidators([control.validator, this.customValidator(guiRowId.toString(), controlId)]);
|
|
327
|
-
else
|
|
328
|
-
control.setValidators(this.customValidator(guiRowId.toString(), controlId));
|
|
329
|
-
control.updateValueAndValidity();
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
break;
|
|
333
|
-
case CommandType.SET_CLASS:
|
|
334
|
-
properties = this.Records.list[guiRowId].getControlMetadata(controlId);
|
|
335
|
-
properties.setClass(command.Operation, command.obj1);
|
|
336
|
-
break;
|
|
337
|
-
case CommandType.SET_STYLE:
|
|
338
|
-
properties = this.Records.list[guiRowId].getControlMetadata(controlId);
|
|
339
|
-
properties.setStyle(command.Operation, command.obj1);
|
|
340
|
-
break;
|
|
341
|
-
case CommandType.SET_ATTRIBUTE:
|
|
342
|
-
properties = this.Records.list[0].getControlMetadata(controlId);
|
|
343
|
-
properties.dataType = String.fromCharCode(command.number);
|
|
344
|
-
break;
|
|
345
|
-
case CommandType.SET_VALUE:
|
|
346
|
-
this.Records.list[guiRowId].values[controlId] = command.value;
|
|
347
|
-
let c = this.getFormControl(guiRowId.toString(), controlId);
|
|
348
|
-
if (!isNullOrUndefined(c)) {
|
|
349
|
-
c.setValue(this.ConvertValFromNative(controlId, command.line, command.value));
|
|
350
|
-
}
|
|
351
|
-
break;
|
|
352
|
-
case CommandType.CREATE_SUB_FORM:
|
|
353
|
-
this.mgSubformService.addSubformComp(command.CtrlName, command.userDropFormat.toString(), command.str, command.fileName, command.contextID, command.params, command.Bool1);
|
|
354
|
-
break;
|
|
355
|
-
case CommandType.CLOSE_SUB_FORM:
|
|
356
|
-
this.mgSubformService.deleteSubformComp(command.CtrlName, command.userDropFormat.toString());
|
|
357
|
-
break;
|
|
358
|
-
case CommandType.SET_EMPTY_DATAVIEW:
|
|
359
|
-
this.setIsEmptyDataView(command.Bool1);
|
|
360
|
-
break;
|
|
361
|
-
case CommandType.SET_FOCUS:
|
|
362
|
-
this.refreshDom.next(command);
|
|
363
|
-
break;
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
customValidator(rowid, id) {
|
|
367
|
-
return (control) => {
|
|
368
|
-
let controlMetadata;
|
|
369
|
-
controlMetadata = this.Records.list[rowid].getControlMetadata(id);
|
|
370
|
-
for (let key of controlMetadata.customValidators.keys()) {
|
|
371
|
-
let validator = controlMetadata.customValidators.get(key);
|
|
372
|
-
if (!validator.isValid()) {
|
|
373
|
-
return { [key]: true };
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
return null;
|
|
377
|
-
};
|
|
378
|
-
}
|
|
379
|
-
ConvertValToNative(controlId, rowId, val) {
|
|
380
|
-
let properties;
|
|
381
|
-
properties = this.Records.list[0].getControlMetadata(controlId);
|
|
382
|
-
switch (properties.dataType) {
|
|
383
|
-
case StorageAttribute.BOOLEAN: {
|
|
384
|
-
if (typeof val === 'string') {
|
|
385
|
-
let ranges = this.GetFldRanges(controlId);
|
|
386
|
-
let found = ranges.indexOf(',');
|
|
387
|
-
let trueOption = ranges.substr(0, found);
|
|
388
|
-
let falseOption = ranges.substr(found + 1);
|
|
389
|
-
if (NString.Equals(val, trueOption, true))
|
|
390
|
-
return true;
|
|
391
|
-
else if (NString.Equals(val, falseOption, true))
|
|
392
|
-
return false;
|
|
393
|
-
else
|
|
394
|
-
return val;
|
|
395
|
-
}
|
|
396
|
-
else
|
|
397
|
-
return val;
|
|
398
|
-
}
|
|
399
|
-
case StorageAttribute.TIME: {
|
|
400
|
-
if (typeof val === 'string') {
|
|
401
|
-
let idx = val.indexOf(':', 0);
|
|
402
|
-
let hours = +val.substr(0, idx);
|
|
403
|
-
let minutes = +val.substr(idx + 1, 2);
|
|
404
|
-
let seconds = 0;
|
|
405
|
-
if (val.length > 5) {
|
|
406
|
-
idx = val.indexOf(':', idx + 1);
|
|
407
|
-
if (idx >= 0)
|
|
408
|
-
seconds = +val.substr(idx + 1, 2);
|
|
409
|
-
}
|
|
410
|
-
if (val.indexOf('PM') > 0)
|
|
411
|
-
hours += 12;
|
|
412
|
-
let dt = new Date();
|
|
413
|
-
dt.setHours(hours);
|
|
414
|
-
dt.setMinutes(minutes);
|
|
415
|
-
dt.setSeconds(seconds);
|
|
416
|
-
return dt;
|
|
417
|
-
}
|
|
418
|
-
else
|
|
419
|
-
return val;
|
|
420
|
-
}
|
|
421
|
-
case StorageAttribute.NUMERIC:
|
|
422
|
-
return (val === null) ? 0 : val;
|
|
423
|
-
default:
|
|
424
|
-
return val;
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
ConvertValFromNative(controlId, rowId, val) {
|
|
428
|
-
let properties;
|
|
429
|
-
properties = this.Records.list[0].getControlMetadata(controlId);
|
|
430
|
-
switch (properties.dataType) {
|
|
431
|
-
case StorageAttribute.TIME: {
|
|
432
|
-
if (val instanceof Date) {
|
|
433
|
-
let str = new StringBuilder();
|
|
434
|
-
let format = val.getHours() > 9 ? '{0}' : '0{0}';
|
|
435
|
-
str.AppendFormat(format, val.getHours().toString());
|
|
436
|
-
str.Append(':');
|
|
437
|
-
format = val.getMinutes() > 9 ? '{0}' : '0{0}';
|
|
438
|
-
str.AppendFormat(format, val.getMinutes().toString());
|
|
439
|
-
if (val.getSeconds() > 0) {
|
|
440
|
-
str.Append(':');
|
|
441
|
-
format = val.getSeconds() > 9 ? '{0}' : '0{0}';
|
|
442
|
-
str.AppendFormat(format, val.getSeconds().toString());
|
|
443
|
-
}
|
|
444
|
-
return str.ToString();
|
|
445
|
-
}
|
|
446
|
-
else
|
|
447
|
-
return val;
|
|
448
|
-
}
|
|
449
|
-
case StorageAttribute.BOOLEAN: {
|
|
450
|
-
let properties;
|
|
451
|
-
properties = this.Records.list['0'].getControlMetadata(controlId);
|
|
452
|
-
if (typeof val === 'boolean' && properties.rangeValidator) {
|
|
453
|
-
let ranges = this.GetFldRanges(controlId);
|
|
454
|
-
let found = ranges.indexOf(',');
|
|
455
|
-
let trueOption = ranges.substr(0, found);
|
|
456
|
-
let falseOption = ranges.substr(found + 1);
|
|
457
|
-
if (val)
|
|
458
|
-
return trueOption;
|
|
459
|
-
else
|
|
460
|
-
return falseOption;
|
|
461
|
-
}
|
|
462
|
-
else
|
|
463
|
-
return val;
|
|
464
|
-
}
|
|
465
|
-
default:
|
|
466
|
-
return val;
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
resize(pageSize, topGuiRowId) {
|
|
470
|
-
let guiEvent = getGuiEventObj('resize', 'table', 0);
|
|
471
|
-
guiEvent.PageSize = pageSize;
|
|
472
|
-
guiEvent.Line = topGuiRowId;
|
|
473
|
-
this.insertEvent(guiEvent);
|
|
474
|
-
}
|
|
475
|
-
onScrollDown() {
|
|
476
|
-
if (!this.Records.includesLast) {
|
|
477
|
-
let guiEvent = getGuiEventObj('getRows', 'table', 0);
|
|
478
|
-
guiEvent.Line = this.formGroups.length;
|
|
479
|
-
this.insertEvent(guiEvent);
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
setTitle(newTitle) {
|
|
483
|
-
this.mgTitleService.setTitle(newTitle);
|
|
484
|
-
}
|
|
485
|
-
getGuiRowId(dvRowId, isTableControl) {
|
|
486
|
-
return (isTableControl ? dvRowId + this.Records.recordsBeforeCurrentView : 0);
|
|
487
|
-
}
|
|
488
|
-
getDvRowId(guiRowId) {
|
|
489
|
-
return (guiRowId - this.Records.recordsBeforeCurrentView);
|
|
490
|
-
}
|
|
491
|
-
dispose() {
|
|
492
|
-
this.refreshDom.complete();
|
|
493
|
-
this.detectChanges.complete();
|
|
494
|
-
this.subscribeInteractiveCommands.unsubscribe();
|
|
495
|
-
this.subscribeRefreshDom.unsubscribe();
|
|
496
|
-
this.interactiveCommands.complete();
|
|
497
|
-
this.customPropertiesSubject.complete();
|
|
498
|
-
this.OnSelectedRowChanged.complete();
|
|
499
|
-
}
|
|
500
|
-
onComboboxSelectionChanged(event, idx, line) {
|
|
501
|
-
let guiEvent = getGuiEventObj('selectionchanged', idx, line);
|
|
502
|
-
if (typeof (event) == 'number') {
|
|
503
|
-
guiEvent.Value = event;
|
|
504
|
-
}
|
|
505
|
-
else {
|
|
506
|
-
if (!isNullOrUndefined(event.target)) {
|
|
507
|
-
let indexes = new Array(event.target.selectedOptions.length);
|
|
508
|
-
for (let i = 0; i < event.target.selectedOptions.length; i++) {
|
|
509
|
-
indexes[i] = event.target.selectedOptions[i].index;
|
|
510
|
-
}
|
|
511
|
-
guiEvent.Value = indexes.join(',');
|
|
512
|
-
}
|
|
513
|
-
else
|
|
514
|
-
guiEvent.Value = event.value;
|
|
515
|
-
}
|
|
516
|
-
this.insertEvent(guiEvent);
|
|
517
|
-
}
|
|
518
|
-
onListBoxSelectionChanged(event, idx) {
|
|
519
|
-
let guiEvent = getGuiEventObj('selectionchanged', idx, 0);
|
|
520
|
-
let selectedOptions;
|
|
521
|
-
if (!isNullOrUndefined(event.target))
|
|
522
|
-
selectedOptions = event.target.selectedOptions;
|
|
523
|
-
else
|
|
524
|
-
selectedOptions = event.source.selectedOptions.selected;
|
|
525
|
-
let length = selectedOptions.length;
|
|
526
|
-
let indexes = new Array(length);
|
|
527
|
-
for (let i = 0; i < length; i++) {
|
|
528
|
-
if (!isNullOrUndefined(event.target))
|
|
529
|
-
indexes[i] = (selectedOptions[i]).index;
|
|
530
|
-
else
|
|
531
|
-
indexes[i] = (selectedOptions[i]).value;
|
|
532
|
-
}
|
|
533
|
-
guiEvent.Value = indexes;
|
|
534
|
-
this.insertEvent(guiEvent);
|
|
535
|
-
}
|
|
536
|
-
onCheckChanged(event, idx, rowId) {
|
|
537
|
-
if (typeof rowId === 'undefined')
|
|
538
|
-
rowId = 0;
|
|
539
|
-
let guiEvent = getGuiEventObj('selectionchanged', idx, rowId);
|
|
540
|
-
if (typeof (event) == 'boolean') {
|
|
541
|
-
guiEvent.Value = event;
|
|
542
|
-
}
|
|
543
|
-
else {
|
|
544
|
-
if (typeof event.target === 'undefined')
|
|
545
|
-
guiEvent.Value = (event).checked;
|
|
546
|
-
else
|
|
547
|
-
guiEvent.Value = (event.target).checked;
|
|
548
|
-
}
|
|
549
|
-
this.insertEvent(guiEvent);
|
|
550
|
-
}
|
|
551
|
-
mgOnTabSelectionChanged(idx, layer) {
|
|
552
|
-
let guiEvent = getGuiEventObj('selectionchanged', idx, 0);
|
|
553
|
-
guiEvent.Value = layer.toString();
|
|
554
|
-
this.insertEvent(guiEvent);
|
|
555
|
-
}
|
|
556
|
-
mgOnRadioSelectionChanged(event, idx) {
|
|
557
|
-
let result = this.getFormControl('0', idx);
|
|
558
|
-
let guiEvent = getGuiEventObj('selectionchanged', idx, 0);
|
|
559
|
-
if (typeof result.value !== 'string')
|
|
560
|
-
guiEvent.Value = result.value.index;
|
|
561
|
-
else
|
|
562
|
-
guiEvent.Value = result.value;
|
|
563
|
-
this.insertEvent(guiEvent);
|
|
564
|
-
}
|
|
565
|
-
close() {
|
|
566
|
-
this.insertEvent(getGuiEventObj('close', null, 0));
|
|
567
|
-
}
|
|
568
|
-
IsStub() {
|
|
569
|
-
return this.magic.isStub;
|
|
570
|
-
}
|
|
571
|
-
saveData(data) {
|
|
572
|
-
this.magic.saveData(data);
|
|
573
|
-
}
|
|
574
|
-
createData() {
|
|
575
|
-
let myData = {
|
|
576
|
-
records: this.Records,
|
|
577
|
-
template: this.template
|
|
578
|
-
};
|
|
579
|
-
let text = 'loadData():any {\n' +
|
|
580
|
-
' let stubData = ' + JSON.stringify(myData) + ';\n' +
|
|
581
|
-
' this.loadStubData(stubData);}';
|
|
582
|
-
console.log(text);
|
|
583
|
-
this.saveData(text);
|
|
584
|
-
}
|
|
585
|
-
loadStubData(stubData) {
|
|
586
|
-
this.Records = stubData.records;
|
|
587
|
-
this.settemplate(stubData.template);
|
|
588
|
-
this.taskId = '1';
|
|
589
|
-
for (let i = 0; i < this.Records.list.length; i++)
|
|
590
|
-
this.buildTableRowControls(i);
|
|
591
|
-
}
|
|
592
|
-
loadData() {
|
|
593
|
-
alert('Please, overwrite method loadData');
|
|
594
|
-
}
|
|
595
|
-
setStubValue(guiRowId, fc, name) {
|
|
596
|
-
if (this.IsStub()) {
|
|
597
|
-
try {
|
|
598
|
-
let val = this.Records.list[guiRowId].values[name];
|
|
599
|
-
fc.setValue(val);
|
|
600
|
-
}
|
|
601
|
-
catch (e) {
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
TaskMagicService.ɵfac = function TaskMagicService_Factory(t) { return new (t || TaskMagicService)(i0.ɵɵinject(i1.EngineMagicService), i0.ɵɵinject(i2.OverlayWindowService)); };
|
|
607
|
-
TaskMagicService.ɵprov = i0.ɵɵdefineInjectable({ token: TaskMagicService, factory: TaskMagicService.ɵfac });
|
|
608
|
-
(function () { i0.ɵsetClassMetadata(TaskMagicService, [{
|
|
609
|
-
type: Injectable
|
|
610
|
-
}], function () { return [{ type: i1.EngineMagicService }, { type: i2.OverlayWindowService }]; }, null); })();
|
|
611
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay5tYWdpY3Muc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXIvc3JjL3NlcnZpY2VzL3Rhc2subWFnaWNzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFrQixXQUFXLEVBQUUsU0FBUyxFQUFnQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFrQixPQUFPLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsV0FBVyxFQUErQixZQUFZLEVBQWtCLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXRILE9BQU8sRUFBQyxPQUFPLEVBQUUsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDNUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGNBQWMsRUFBWSxNQUFNLG1CQUFtQixDQUFDO0FBSTVELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDOzs7O0FBTTVELE1BQU0sT0FBTyxnQkFBZ0I7SUFxRjNCLFlBQXNCLEtBQXlCLEVBQVUsb0JBQTBDO1FB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QUFNLEVBQUUsQ0FBQyxFQUFFO1lBQy9DLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBS00sUUFBUTtRQUNiLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFLRCxZQUFZLENBQUMsUUFBZ0IsRUFBRSxFQUFlLEVBQUUsSUFBWTtRQUMxRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNqQixJQUFJO2dCQUNGLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkQsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNsQjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2FBQ1g7U0FDRjtJQUNILENBQUM7O2dGQXZoQ1UsZ0JBQWdCO3dEQUFoQixnQkFBZ0IsV0FBaEIsZ0JBQWdCO29DQUFoQixnQkFBZ0I7Y0FENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7U3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7aXNOdWxsT3JVbmRlZmluZWQsIGlzVW5kZWZpbmVkfSBmcm9tICd1dGlsJztcclxuaW1wb3J0IHtTdHlsZXNNYXBNYW5hZ2VyfSBmcm9tICcuL1N0eWxlc01hcE1hbmFnZXInO1xyXG5cclxuaW1wb3J0IHtFbmdpbmVNYWdpY1NlcnZpY2V9IGZyb20gJy4vZW5naW5lLm1hZ2ljLnNlcnZpY2UnO1xyXG5pbXBvcnQge0NvbnRyb2xNZXRhZGF0YSwgUmVjb3Jkc30gZnJvbSAnLi4vY29udHJvbHMubWV0YWRhdGEubW9kZWwnO1xyXG5pbXBvcnQge0NvbW1hbmRUeXBlLCBDdXN0b21WYWxpZGF0b3IsIEd1aUNvbW1hbmQsIEd1aUNvbnN0YW50cywgR3VpSW50ZXJhY3RpdmUsIEh0bWxQcm9wZXJ0aWVzfSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcblxyXG5pbXBvcnQge05TdHJpbmcsIFN0cmluZ0J1aWxkZXJ9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtTdG9yYWdlQXR0cmlidXRlfSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtnZXRHdWlFdmVudE9iaiwgSUd1aUV2ZW50fSBmcm9tICdAbWFnaWMteHBhL2VuZ2luZSc7XHJcbmltcG9ydCB7U3ViZm9ybU1hZ2ljU2VydmljZX0gZnJvbSAnLi9zdWJmb3JtLm1hZ2ljLnNlcnZpY2UnO1xyXG5pbXBvcnQge1RpdGxlTWFnaWNTZXJ2aWNlfSBmcm9tICcuL3RpdGxlLm1hZ2ljLnNlcnZpY2UnO1xyXG5pbXBvcnQge0FjY2Vzc29yTWFnaWNTZXJ2aWNlfSBmcm9tICcuL2FjY2Vzc29yLm1hZ2ljLnNlcnZpY2UnO1xyXG5pbXBvcnQge0d1aUludGVyYWN0aXZlRXhlY3V0b3J9IGZyb20gJy4uL3VpL0d1aUludGVyYWN0aXZlRXhlY3V0b3InO1xyXG5pbXBvcnQge092ZXJsYXlXaW5kb3dTZXJ2aWNlfSBmcm9tICcuL092ZXJsYXlXaW5kb3dTZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBNYWluIHNlcnZpY2UgdG8gY29ubmVjdCB0aGUgVUkgd2l0aCB0aGUgTWFnaWMgV2ViQ0xpZW50XHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUYXNrTWFnaWNTZXJ2aWNlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogU2VydmljZSB0byBwcm92aWRlIHRhYmxlLXJlbGF0ZWQgZnVuY3Rpb25hbGl0aWVzXHJcbiAgICovXHJcbiAgcHVibGljIHRhYmxlU2VydmljZTogYW55O1xyXG4gIC8qKlxyXG4gICAqIENvbGxlY3Rpb24gb2YgZGF0YSBmb3IgYWxsIGNvbnRyb2xzXHJcbiAgICovXHJcbiAgUmVjb3JkczogYW55ID0gbmV3IFJlY29yZHMoKTtcclxuICAvKipcclxuICAgKiBGb3JtR3JvdXAgY29sbGVjdGlvbiBmb3IgbGluZSBtb2RlXHJcbiAgICovXHJcbiAgZm9ybUdyb3VwczogQXJyYXk8Rm9ybUdyb3VwPiA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIEZvcm1Hcm91cCBmb3IgYWxsIGNvbnRyb2xzIGluIHNjcmVlbiBtb2RlXHJcbiAgICovXHJcbiAgU2NyZWVuTW9kZUNvbnRyb2xzOiBGb3JtR3JvdXA7XHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHJlZnJlc2hEb206IFN1YmplY3Q8R3VpQ29tbWFuZD4gPSBuZXcgU3ViamVjdCgpO1xyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBzdWJzY3JpYmVSZWZyZXNoRG9tOiBTdWJzY3JpcHRpb247XHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGRldGVjdENoYW5nZXM6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHN1YnNjcmliZUludGVyYWN0aXZlQ29tbWFuZHM6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGludGVyYWN0aXZlQ29tbWFuZHM6IFN1YmplY3Q8R3VpSW50ZXJhY3RpdmU+PSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICogVGhpcyBldmVudCBpcyBlbWl0dGVkIHdoZW4gdGhlIHNlbGVjdGVkIHJvdyBpbiBhIHRhYmxlIGNoYW5nZXMuXHJcbiAgICovXHJcbiAgT25TZWxlY3RlZFJvd0NoYW5nZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBjdXN0b21Qcm9wZXJ0aWVzU3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICByZWNvcmRzQ291bnRDaGFuZ2VTdWJqZWN0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHVibGljIHRlbXBsYXRlOiB7IFtpZDogc3RyaW5nXTogc3RyaW5nOyB9O1xyXG4gIC8qKlxyXG4gICAqIFNlcnZpY2UgdG8gcHJvdmlkZSBzdWJmb3JtLXJlbGF0ZWQgZnVuY3Rpb25hbGl0aWVzXHJcbiAgICovXHJcbiAgcHVibGljIG1nU3ViZm9ybVNlcnZpY2U6IFN1YmZvcm1NYWdpY1NlcnZpY2U7XHJcbiAgLyoqXHJcbiAgICogU2VydmljZSB0byBwcm92aWRlIHRoZSB0aXRsZS1jaGFuZ2UgZnVuY3Rpb25hbGl0eVxyXG4gICAqL1xyXG4gIHB1YmxpYyBtZ1RpdGxlU2VydmljZTogVGl0bGVNYWdpY1NlcnZpY2U7XHJcbiAgLyoqXHJcbiAgICogU2VydmljZSB3aGljaCBlbmFibGVzIGdldHRpbmcvc2V0dGluZyB2YWx1ZXMgZnJvbS90byB0aGUgTWFnaWMgV2ViQ2xpZW50IGVuZ2luZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBtZ0FjY2Vzc29yU2VydmljZTogQWNjZXNzb3JNYWdpY1NlcnZpY2U7XHJcblxyXG4gIHB1YmxpYyBtZ0lucHV0RGF0ZUZvcm1hdDtcclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIG9sZFBhZ2VTaXplID0gMDtcclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcGFyYW0gIG1hZ2ljXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIG1hZ2ljOiBFbmdpbmVNYWdpY1NlcnZpY2UsIHByaXZhdGUgb3ZlcmxheVdpbmRvd1NlcnZpY2U6IE92ZXJsYXlXaW5kb3dTZXJ2aWNlKSB7XHJcbiAgICB0aGlzLlJlY29yZHMuc2V0R3VpVG9wSW5kZXgoMCk7XHJcbiAgICB0aGlzLm1nSW5wdXREYXRlRm9ybWF0ID0gbnVsbDtcclxuICB9XHJcblxyXG4gICAvKipcclxuICAgKiByZXR1cm5zIHRydWUgaWYgdXNlZCBpcyBsb2dnZWQgaW5cclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRJc0xvZ2dlbkluKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWFnaWMuZ2V0SXNMb2dnZWRJbigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSWQgb2YgdGFzayB0byB3aGljaCB0aGlzIHNlcnZpY2UgcmVmZXJzXHJcbiAgICovXHJcbiAgX3Rhc2tJZDogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiByZXR1cm5zIHRoZSB0YXNrIElkXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBnZXQgdGFza0lkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tJZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHRhc2sgSWRcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHRhc2sgaWQgdG8gc2V0XHJcbiAgICovXHJcbiAgc2V0IHRhc2tJZCh2YWx1ZSkge1xyXG4gICAgLy8gZGVidWdnZXI7XHJcbiAgICB0aGlzLl90YXNrSWQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHRhc2sncyBkYXRhIGluIFNjcmVlbiBtb2RlXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBnZXQgU2NyZWVuQ29udHJvbHNEYXRhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuUmVjb3Jkcy5saXN0WycwJ107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc2V0dGVtcGxhdGUodmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy50ZW1wbGF0ZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkcyB0aGUgRm9ybUNvbnRyb2wgZm9yIGVhY2ggYW5kIGV2ZXJ5IGNvbnRyb2xcclxuICAgKi9cclxuICBidWlsZFNjcmVlbk1vZGVDb250cm9scygpIHtcclxuICAgIGNvbnN0IGdyb3VwOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMudGVtcGxhdGUpIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLnRlbXBsYXRlW2tleV0gPT0gJzAnKSB7XHJcbiAgICAgICAgbGV0IGZjID0gbmV3IEZvcm1Db250cm9sKCcnKTtcclxuICAgICAgICB0aGlzLnNldFN0dWJWYWx1ZSgwLCBmYywga2V5KTtcclxuICAgICAgICBncm91cC5hZGRDb250cm9sKGtleSwgZmMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5TY3JlZW5Nb2RlQ29udHJvbHMgPSBncm91cDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIElzIHRoZSBjb250cm9sIGEgdGFibGUgY29udHJvbFxyXG4gICAqIEBwYXJhbSBpZCBJZCBvZiB0aGUgY29udHJvbFxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgaXNUYWJsZUNvbnRyb2woaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVbaWRdID09ICcxJztcclxuICB9XHJcblxyXG4gIGdldE1nSW5wdXREYXRlRm9ybWF0KCk6IHN0cmluZyB7cmV0dXJuIHRoaXMubWdJbnB1dERhdGVGb3JtYXQ7fVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBGb3JtQ29udHJvbCBvZiBhIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gZ3VpUm93aWQgSWQgb2YgdGhlIHJlcXVlc3RlZCByb3dcclxuICAgKiBAcGFyYW0gaWQgSWQgb2YgdGhlIGNvbnRyb2xcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGdldEZvcm1Db250cm9sKGd1aVJvd2lkOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgbGV0IGM6IEFic3RyYWN0Q29udHJvbDtcclxuICAgIGxldCBncm91cDogRm9ybUdyb3VwID0gdGhpcy5pc1RhYmxlQ29udHJvbChpZCkgPyB0aGlzLmZvcm1Hcm91cHNbZ3VpUm93aWRdIDogdGhpcy5TY3JlZW5Nb2RlQ29udHJvbHM7XHJcbiAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGdyb3VwKSkge1xyXG4gICAgICBncm91cC5nZXQoaWQpO1xyXG4gICAgICBjID0gZ3JvdXAuY29udHJvbHNbaWRdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBoYW5kbGUgdGhlIGNoYW5nZSBvZiB0ZXh0IGZvciBpbnB1dCBjb250cm9sIGluc2lkZSB0YWJsZVxyXG4gICAqIEBwYXJhbSAgZ3VpUm93SWQgSWQgb2YgdGhlIHJvdyBmb3Igd2hpY2ggdGhlIEZvcm1Db250cm9scyBhcmUgYnVpbHRcclxuICAgKiBzZXQgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgZm9ybWNvbnRyb2xcclxuICAgKi9cclxuICBzZXRJbnB1dFRleHRWYWx1ZShjb250cm9sSWQ6IHN0cmluZywgZ3VpUm93aWQ6IHN0cmluZywgdmFsOiBhbnkpIHtcclxuICAgIHRoaXMuc2V0VmFsdWUoY29udHJvbElkLCBndWlSb3dpZCwgdGhpcy5Db252ZXJ0VmFsVG9OYXRpdmUoY29udHJvbElkLCAwLCB2YWwpKTtcclxuXHJcbiAgICBjb25zdCBmYyA9IHRoaXMuZ2V0Rm9ybUNvbnRyb2woZ3VpUm93aWQsIGNvbnRyb2xJZCk7XHJcbiAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKHZhbCkpXHJcbiAgICAgIGZjLnNldFZhbHVlKHZhbCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWlsZCB0aGUgRm9ybUNvbnRyb2xzIGZvciBhIHRhYmxlIHJvd1xyXG4gICAqIEBwYXJhbSAgZ3VpUm93SWQgSWQgb2YgdGhlIHJvdyBmb3Igd2hpY2ggdGhlIEZvcm1Db250cm9scyBhcmUgYnVpbHRcclxuICAgKi9cclxuICBidWlsZFRhYmxlUm93Q29udHJvbHMoZ3VpUm93SWQ6IG51bWJlcikge1xyXG5cclxuICAgIGNvbnN0IGdyb3VwOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnRlbXBsYXRlKSB7XHJcblxyXG4gICAgICBpZiAodGhpcy50ZW1wbGF0ZVtrZXldID09ICcxJykge1xyXG4gICAgICAgIGxldCBmYyA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XHJcbiAgICAgICAgdGhpcy5zZXRTdHViVmFsdWUoZ3VpUm93SWQsIGZjLCBrZXkpO1xyXG4gICAgICAgIGdyb3VwLmFkZENvbnRyb2woa2V5LCBmYyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZm9ybUdyb3Vwc1tndWlSb3dJZF0gPSBncm91cDtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICB1cGRhdGVSZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcodmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5SZWNvcmRzLnJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHNldEluY2x1ZGVzRmlyc3QodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5pbmNsdWRlc0ZpcnN0ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc2V0SW5jbHVkZXNMYXN0KHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlY29yZHMuaW5jbHVkZXNMYXN0ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgbWFya1Jvd0FzQ3JlYXRlZChndWlSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlY29yZHMubWFya1Jvd0FzQ3JlYXRlZChndWlSb3dJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgbWFya1Jvd0FzTm90Q3JlYXRlZChndWlSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlY29yZHMubWFya1Jvd0FzTm90Q3JlYXRlZChndWlSb3dJZCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHN0YXJ0Um93RWRpdGluZyhndWlSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlY29yZHMuc3RhcnRSb3dFZGl0aW5nKGd1aVJvd0lkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBzdG9wUm93RWRpdGluZyhndWlSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlY29yZHMuc3RvcFJvd0VkaXRpbmcoZ3VpUm93SWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGlzUm93SW5Sb3dFZGl0aW5nKGd1aVJvd0lkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlJlY29yZHMuaXNSb3dJblJvd0VkaXRpbmcoZ3VpUm93SWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHNldElzRW1wdHlEYXRhVmlldyhpc0VtcHR5OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5SZWNvcmRzLmlzRW1wdHlEYXRhVmlldyAhPT0gaXNFbXB0eSkge1xyXG5cclxuICAgICAgaWYgKGlzRW1wdHkpXHJcbiAgICAgICAgdGhpcy5yZWNvcmRzQ291bnRDaGFuZ2VTdWJqZWN0Lm5leHQoMCk7XHJcblxyXG4gICAgICB0aGlzLlJlY29yZHMuaXNFbXB0eURhdGFWaWV3ID0gaXNFbXB0eTtcclxuICAgICAgdGhpcy50YWJsZVNlcnZpY2UucmVmcmVzaERhdGFTb3VyY2UoKTtcclxuICAgICAgdGhpcy5yZWZyZXNoVmlldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbGl6ZSB0aGUgc2VydmljZSB0byB3b3JrIHdpdGggdGhlIHRhc2tcclxuICAgKiBAcGFyYW0gdGFza0lkIElkIG9mIHRoZSB0YXNrXHJcbiAgICogQHBhcmFtIHRhc2tEZXNjcmlwdGlvblxyXG4gICAqL1xyXG4gIGluaXRUYXNrKHRhc2tJZCwgdGFza0Rlc2NyaXB0aW9uKSB7XHJcbiAgICB0aGlzLlJlY29yZHMuY3JlYXRlRmlyc3QoKTtcclxuICAgIHRoaXMub2xkUGFnZVNpemUgPSAwO1xyXG4gICAgaWYgKHRoaXMuSXNTdHViKCkpIHtcclxuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50YXNrSWQgPSB0YXNrSWQ7XHJcbiAgICAgIHRoaXMuc2V0dGVtcGxhdGUodGFza0Rlc2NyaXB0aW9uKTtcclxuICAgIH1cclxuICAgIHRoaXMuYnVpbGRTY3JlZW5Nb2RlQ29udHJvbHMoKTtcclxuXHJcbiAgICAvLyByZW1vdmUgcHJldmlvdXMgc3Vic2NyaXB0aW9uc1xyXG4gICAgaWYoIWlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuc3Vic2NyaWJlUmVmcmVzaERvbSkpXHJcbiAgICAgIHRoaXMuc3Vic2NyaWJlUmVmcmVzaERvbS51bnN1YnNjcmliZSgpO1xyXG4gICAgaWYoIWlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuc3Vic2NyaWJlSW50ZXJhY3RpdmVDb21tYW5kcykpXHJcbiAgICAgIHRoaXMuc3Vic2NyaWJlSW50ZXJhY3RpdmVDb21tYW5kcy51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaWJlUmVmcmVzaERvbSA9IHRoaXMubWFnaWMucmVmcmVzaERvbS5waXBlKGZpbHRlcihjb21tYW5kID0+IGNvbW1hbmQuVGFza1RhZyA9PT0gdGhpcy50YXNrSWQpKVxyXG4gICAgICAuc3Vic2NyaWJlKGNvbW1hbmQgPT4ge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVGFzayBcIiArIGNvbW1hbmQuVGFza1RhZyArIFwiY29tbWFuZCBcIiArIGNvbW1hbmQuQ29tbWFuZFR5cGUpO1xyXG4gICAgICAgIHRoaXMuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVJbnRlcmFjdGl2ZUNvbW1hbmRzID0gdGhpcy5tYWdpYy5pbnRlcmFjdGl2ZUNvbW1hbmRzXHJcbiAgICAgIC5waXBlKGZpbHRlcihjb21tYW5kID0+IGNvbW1hbmQuVGFza1RhZyA9PT0gdGhpcy50YXNrSWQpKVxyXG4gICAgICAuc3Vic2NyaWJlKGNvbW1hbmQgPT4ge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVGFzayBcIiArIGNvbW1hbmQuVGFza1RhZyArIFwiY29tbWFuZCBcIiArIGNvbW1hbmQuQ29tbWFuZFR5cGUpO1xyXG4gICAgICAgIHRoaXMuZXhlY3V0ZUludGVyYWN0aXZlQ29tbWFuZChjb21tYW5kKTtcclxuICAgICAgfSk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICByZWZyZXNoVmlldygpIHtcclxuICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcy5uZXh0KCcnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VydCBhbiBldmVudCB0byB0aGUgTWFnaWMgV2ViQ2xpZW50IGV2ZW50IHF1ZXVlXHJcbiAgICogQHBhcmFtIGd1aUV2ZW50IFRoZSBldmVudCB0byBpbnNlcnRcclxuICAgKi9cclxuICBpbnNlcnRFdmVudChndWlFdmVudDogSUd1aUV2ZW50KTogdm9pZCB7XHJcbiAgICBndWlFdmVudC5UYXNrSUQgPSB0aGlzLnRhc2tJZDtcclxuICAgIHRoaXMubWFnaWMuaW5zZXJ0RXZlbnQoZ3VpRXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIEdldENvbnRyb2xQaWN0dXJlTWFzayhjb250cm9sTmFtZTogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm1hZ2ljLkdldENvbnRyb2xQaWN0dXJlTWFzayh0aGlzLnRhc2tJZCwgY29udHJvbE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGVzIHRoZSBjb250cm9sIHZhbHVlLCB1c2luZyB0aGUgTWFnaWMgV2ViQ2xpZW50XHJcbiAgICogQHBhcmFtIGNvbnRyb2xOYW1lIElkIG9mIHZhbGlkYXRlZCBjb250cm9sXHJcbiAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZFxyXG4gICAqIEByZXR1cm5zIElmIHZhbGlkYXRpb24gZmFpbHMsIHJldHVybnMgZXJyb3IgbWVzc2FnZSwgZWxzZSByZXR1cm5zIG51bGxcclxuICAgKi9cclxuICBWYWxpZGF0ZUNvbnRyb2xWYWx1ZShjb250cm9sTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLm1hZ2ljLlZhbGlkYXRlQ29udHJvbFZhbHVlKHRoaXMudGFza0lkLCBjb250cm9sTmFtZSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIEdldFJhbmdlZFZhbHVlKGNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubWFnaWMuR2V0UmFuZ2VkVmFsdWUodGhpcy50YXNrSWQsIGNvbnRyb2xOYW1lLCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgR2V0RmxkUmFuZ2VzKGNvbnRyb2xOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubWFnaWMuR2V0RmxkUmFuZ2VzKHRoaXMudGFza0lkLCBjb250cm9sTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiByZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sXHJcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBJZCBvZiBjb250cm9sXHJcbiAgICogQHBhcmFtIHByb3AgUHJvcGVydHlcclxuICAgKiBAcGFyYW0gZ3VpUm93SWQgUm93IElkLCBpZiBhcHBsaWNhYmxlXHJcbiAgICogQHJldHVybnMgUHJvcGVydHkgdmFsdWVcclxuICAgKi9cclxuICBnZXRQcm9wZXJ0eShjb250cm9sSWQ6IHN0cmluZywgcHJvcDogSHRtbFByb3BlcnRpZXMsIGd1aVJvd0lkPzogc3RyaW5nKSB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoZ3VpUm93SWQpKVxyXG4gICAgICBndWlSb3dJZCA9ICcwJztcclxuICAgIGlmICh0aGlzLklzU3R1YigpKVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVN0dWIodGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLCBjb250cm9sSWQsIHByb3ApO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCByZWMgPSB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF07XHJcbiAgICAgIGlmIChpc051bGxPclVuZGVmaW5lZChyZWMpKVxyXG4gICAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS5nZXRQcm9wZXJ0eShjb250cm9sSWQsIHByb3ApO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBnZXRQcm9wZXJ0eVN0dWIoQ29udHJvbHNQcm9wZXJ0aWVzOiBhbnksIGNvbnRyb2xJZCwgcHJvcCkge1xyXG4gICAgQ29udHJvbHNQcm9wZXJ0aWVzID0gQ29udHJvbHNQcm9wZXJ0aWVzLkNvbnRyb2xzUHJvcGVydGllcztcclxuICAgIGlmIChjb250cm9sSWQgaW4gQ29udHJvbHNQcm9wZXJ0aWVzKSB7XHJcbiAgICAgIGlmIChwcm9wIGluIENvbnRyb2xzUHJvcGVydGllc1tjb250cm9sSWRdLnByb3BlcnRpZXMpIHtcclxuICAgICAgICByZXR1cm4gQ29udHJvbHNQcm9wZXJ0aWVzW2NvbnRyb2xJZF0ucHJvcGVydGllc1twcm9wXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGdldFN0eWxlU3R1YihDb250cm9sc1Byb3BlcnRpZXM6IGFueSwgY29udHJvbElkLCBzdHlsZU5hbWU6IHN0cmluZykge1xyXG4gICAgQ29udHJvbHNQcm9wZXJ0aWVzID0gQ29udHJvbHNQcm9wZXJ0aWVzLkNvbnRyb2xzUHJvcGVydGllcztcclxuICAgIHJldHVybiBDb250cm9sc1Byb3BlcnRpZXNbY29udHJvbElkXS5zdHlsZXNNYXAuZ2V0KHN0eWxlTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIENTUyBjbGFzc2VzIHVzZWQgZm9yIHRoaXMgY29udHJvbFxyXG4gICAqIEBwYXJhbSBjb250cm9sSWQgSWQgb2YgY29udHJvbFxyXG4gICAqIEBwYXJhbSBndWlSb3dJZCBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKiBAcmV0dXJucyBTdHJpbmcgY29udGFpbmluZyB0aGUgY2xhc3NlcyBjdXJyZW50bHkgZGVmaW5lZCBmb3IgdGhpcyBjb250cm9sXHJcbiAgICovXHJcbiAgZ2V0Q2xhc3Nlcyhjb250cm9sSWQ6IHN0cmluZywgZ3VpUm93SWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGd1aVJvd0lkKSlcclxuICAgICAgZ3VpUm93SWQgPSAnMCc7XHJcbiAgICByZXR1cm4gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpLmNsYXNzZXM7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiBhIHN0eWxlIHVzZWQgZm9yIGEgY29udHJvbFxyXG4gICAqIEBwYXJhbSBjb250cm9sSWQgSWQgb2YgY29udHJvbFxyXG4gICAqIEBwYXJhbSBzdHlsZU5hbWUgTmFtZSBvZiBzdHlsZVxyXG4gICAqIEBwYXJhbSBndWlSb3dJZCBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKiBAcmV0dXJucyB2YWx1ZSBvZiBzdHlsZSBvZiB0aGUgY29udHJvbFxyXG4gICAqL1xyXG4gIGdldFN0eWxlKGNvbnRyb2xJZDogc3RyaW5nLCBzdHlsZU5hbWU6IHN0cmluZywgZ3VpUm93SWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGd1aVJvd0lkKSlcclxuICAgICAgZ3VpUm93SWQgPSAnMCc7XHJcbiAgICBpZiAodGhpcy5Jc1N0dWIoKSlcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0U3R5bGVTdHViKHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXSwgY29udHJvbElkLCBzdHlsZU5hbWUpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBtYWdpY1ZhbHVlID0gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpLnN0eWxlc01hcC5nZXQoc3R5bGVOYW1lKTtcclxuICAgICAgcmV0dXJuIFN0eWxlc01hcE1hbmFnZXIubWFnaWNWYWx1ZUdldFN0eWxlKHN0eWxlTmFtZSwgbWFnaWNWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGEgY29udHJvbFxyXG4gICAqIEBwYXJhbSBjb250cm9sSWQgSWQgb2YgY29udHJvbFxyXG4gICAqIEBwYXJhbSBndWlSb3dJZCBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKiBAcmV0dXJucyB2YWx1ZSBvZiB0aGUgY29udHJvbFxyXG4gICAqL1xyXG4gIGdldFZhbHVlKGNvbnRyb2xJZDogc3RyaW5nLCBndWlSb3dJZD86IHN0cmluZykge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGd1aVJvd0lkKSlcclxuICAgICAgZ3VpUm93SWQgPSAnMCc7XHJcbiAgICByZXR1cm4gdGhpcy5SZWNvcmRzLmxpc3QubGVuZ3RoID4gK2d1aVJvd0lkID8gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLnZhbHVlc1tjb250cm9sSWRdIDogJyc7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBmb3JtYXR0ZWQgdmFsdWUgb2YgYSBjb250cm9sXHJcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBJZCBvZiBjb250cm9sXHJcbiAgICogQHBhcmFtIGd1aVJvd0lkIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqIEByZXR1cm5zIHZhbHVlIG9mIHRoZSBjb250cm9sXHJcbiAgICovXHJcbiAgZ2V0Rm9ybWF0dGVkVmFsdWUoY29udHJvbE5hbWU6IHN0cmluZywgdmFsOiBhbnkpOiBzdHJpbmcge1xyXG5cclxuICAgIHJldHVybiB0aGlzLm1hZ2ljLkdldEZvcm1hdHRlZFZhbHVlKHRoaXMudGFza0lkLCBjb250cm9sTmFtZSwgdmFsKTtcclxuIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBjb250cm9sXHJcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBJZCBvZiBjb250cm9sXHJcbiAgICogQHBhcmFtIGd1aVJvd0lkIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzZXRcclxuICAgKi9cclxuICBzZXRWYWx1ZShjb250cm9sSWQ6IHN0cmluZywgZ3VpUm93SWQ6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgcmV0dXJuIHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS5zZXRWYWx1ZShjb250cm9sSWQsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgZXhlY3V0ZUludGVyYWN0aXZlQ29tbWFuZChndWlJbnRlcmFjdGl2ZUNvbW1hbmQ6IEd1aUludGVyYWN0aXZlKVxyXG4gIHtcclxuICAgIEd1aUludGVyYWN0aXZlRXhlY3V0b3IuZXhlY3V0ZUludGVyYWN0aXZlQ29tbWFuZCh0aGlzLCBndWlJbnRlcmFjdGl2ZUNvbW1hbmQsIHRoaXMub3ZlcmxheVdpbmRvd1NlcnZpY2UpO1xyXG4gICAgdGhpcy5pbnRlcmFjdGl2ZUNvbW1hbmRzLm5leHQoZ3VpSW50ZXJhY3RpdmVDb21tYW5kKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGhhbmRsZVNldFByb3BlcnR5KGNvbW1hbmQ6IEd1aUNvbW1hbmQsIGlzVGFibGVDaGlsZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IGNvbnRyb2xJZCA9IGNvbW1hbmQuQ3RybE5hbWU7XHJcbiAgICBsZXQgZHZSb3dJZDogbnVtYmVyID0gKGNvbW1hbmQubGluZSB8fCAwKTtcclxuICAgIGxldCBndWlSb3dJZDogbnVtYmVyID0gdGhpcy5nZXRHdWlSb3dJZChkdlJvd0lkLCBpc1RhYmxlQ2hpbGQpO1xyXG4gICAgbGV0IHByb3BlcnRpZXM6IENvbnRyb2xNZXRhZGF0YTtcclxuXHJcbiAgICBpZiAoY29tbWFuZC5PcGVyYXRpb24gPT09IEh0bWxQcm9wZXJ0aWVzLlNlbGVjdGVkUm93KSB7XHJcbiAgICAgIGlmIChjb21tYW5kLm9iajEgIT09IEd1aUNvbnN0YW50cy5OT19ST1dfU0VMRUNURUQpIHtcclxuICAgICAgICBndWlSb3dJZCA9IHRoaXMuZ2V0R3VpUm93SWQoY29tbWFuZC5vYmoxLCB0cnVlKTtcclxuICAgICAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG4gICAgICAgIHByb3BlcnRpZXMucHJvcGVydGllcy5zZXQoY29tbWFuZC5PcGVyYXRpb24sIGNvbW1hbmQubGluZSk7XHJcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uuc2VsZWN0Um93KGd1aVJvd0lkLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIHRoaXMuT25TZWxlY3RlZFJvd0NoYW5nZWQuZW1pdChndWlSb3dJZC50b1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChjb21tYW5kLk9wZXJhdGlvbiA9PT0gSHRtbFByb3BlcnRpZXMuRW5hYmxlZCkge1xyXG4gICAgICBsZXQgYyA9IHRoaXMuZ2V0Rm9ybUNvbnRyb2woZ3VpUm93SWQudG9TdHJpbmcoKSwgY29udHJvbElkKTtcclxuICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChjKSkge1xyXG4gICAgICAgIGlmIChjb21tYW5kLm9iajEpXHJcbiAgICAgICAgICBjLmVuYWJsZSgpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGMuZGlzYWJsZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHByb3BlcnRpZXMgPSB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcbiAgICAgIHByb3BlcnRpZXMucHJvcGVydGllcy5zZXQoY29tbWFuZC5PcGVyYXRpb24sIGNvbW1hbmQub2JqMSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG4gICAgICBwcm9wZXJ0aWVzLnByb3BlcnRpZXMuc2V0KDxIdG1sUHJvcGVydGllcz5jb21tYW5kLk9wZXJhdGlvbiwgY29tbWFuZC5vYmoxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBleGVjdXRlQ29tbWFuZChjb21tYW5kOiBHdWlDb21tYW5kKTogdm9pZCB7XHJcbiAgICBsZXQgZHZSb3dJZDogbnVtYmVyID0gKGNvbW1hbmQubGluZSB8fCAwKTtcclxuICAgIGxldCBndWlSb3dJZDogbnVtYmVyID0gMDtcclxuICAgIGxldCBjb250cm9sSWQgPSBjb21tYW5kLkN0cmxOYW1lO1xyXG4gICAgbGV0IHByb3BlcnRpZXM6IENvbnRyb2xNZXRhZGF0YTtcclxuICAgIGxldCBpc1RhYmxlQ2hpbGQ6IGJvb2xlYW4gPSB0aGlzLmlzVGFibGVDb250cm9sKGNvbnRyb2xJZCk7XHJcblxyXG4gICAgLy8gRm9yIG5vbi1pbnB1dCB0eXBlIGNvbnRyb2xzIG9uIHRhYmxlLlxyXG4gICAgaWYgKGNvbW1hbmQub2JqICE9PSBudWxsKVxyXG4gICAgICBpc1RhYmxlQ2hpbGQgPSBpc1RhYmxlQ2hpbGQgfHwgY29tbWFuZC5vYmouSXNUYWJsZUNoaWxkO1xyXG5cclxuICAgIGd1aVJvd0lkID0gdGhpcy5nZXRHdWlSb3dJZChkdlJvd0lkLCBpc1RhYmxlQ2hpbGQpO1xyXG5cclxuICAgIHN3aXRjaCAoY29tbWFuZC5Db21tYW5kVHlwZSkge1xyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9JU19MT0dHRURfSU46XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9UQUJMRV9UT1BfSU5ERVg6XHJcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uuc2V0VGFibGVUb3BJbmRleChjb21tYW5kLm51bWJlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuUkVGUkVTSF9UQVNLOlxyXG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLnJlZnJlc2hEYXRhU291cmNlKCk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoVmlldygpO1xyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfVEFCTEVfSVRFTVNfQ09VTlQ6XHJcbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChjb21tYW5kLm51bWJlcikpIHtcclxuICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLnVwZGF0ZVRhYmxlU2l6ZShjb21tYW5kLm51bWJlcik7XHJcblxyXG4gICAgICAgICAgaWYgKGNvbW1hbmQubnVtYmVyID4gMCAmJiB0aGlzLlJlY29yZHMuc2l6ZVVwZGF0ZWQgJiZcclxuICAgICAgICAgICAgIXRoaXMuUmVjb3Jkcy5pc0VtcHR5RGF0YVZpZXcpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWNvcmRzQ291bnRDaGFuZ2VTdWJqZWN0Lm5leHQoY29tbWFuZC5udW1iZXIpO1xyXG4gICAgICAgICAgICB0aGlzLlJlY29yZHMuc2l6ZVVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9SRUNPUkRTX0JFRk9SRV9DVVJSRU5UX1ZJRVc6XHJcbiAgICAgICAgdGhpcy51cGRhdGVSZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcoY29tbWFuZC5udW1iZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5DUkVBVEVfVEFCTEVfUk9XOlxyXG4gICAgICAgIGd1aVJvd0lkID0gdGhpcy5nZXRHdWlSb3dJZChjb21tYW5kLm51bWJlciwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5idWlsZFRhYmxlUm93Q29udHJvbHMoZ3VpUm93SWQpO1xyXG4gICAgICAgIHRoaXMubWFya1Jvd0FzQ3JlYXRlZChndWlSb3dJZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9JU19ST1dfRURJVElORzpcclxuICAgICAgICBndWlSb3dJZCA9IHRoaXMuZ2V0R3VpUm93SWQoY29tbWFuZC5saW5lLCBjb21tYW5kLnZhbHVlKTtcclxuICAgICAgICB0aGlzLnN0YXJ0Um93RWRpdGluZyhndWlSb3dJZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9OT1RfSVNfUk9XX0VESVRJTkc6XHJcbiAgICAgICAgZ3VpUm93SWQgPSB0aGlzLmdldEd1aVJvd0lkKGNvbW1hbmQubGluZSwgY29tbWFuZC52YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5zdG9wUm93RWRpdGluZyhndWlSb3dJZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5VTkRPX0NSRUFURV9UQUJMRV9ST1c6XHJcbiAgICAgICAgdGhpcy5tYXJrUm93QXNOb3RDcmVhdGVkKHRoaXMuZ2V0R3VpUm93SWQoY29tbWFuZC5udW1iZXIsIHRydWUpKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19GSVJTVDpcclxuICAgICAgICB0aGlzLnNldEluY2x1ZGVzRmlyc3QoY29tbWFuZC5Cb29sMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0xBU1Q6XHJcbiAgICAgICAgdGhpcy5zZXRJbmNsdWRlc0xhc3QoY29tbWFuZC5Cb29sMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFk6XHJcbiAgICAgICAgdGhpcy5oYW5kbGVTZXRQcm9wZXJ0eShjb21tYW5kLCBpc1RhYmxlQ2hpbGQpO1xyXG4gICAgICAgIGlmIChjb21tYW5kLk9wZXJhdGlvbiA9PSBIdG1sUHJvcGVydGllcy5SZWFkT25seSlcclxuICAgICAgICAgIHRoaXMucmVmcmVzaERvbS5uZXh0KGNvbW1hbmQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5QUk9QX1NFVF9VU0VSX1BST1BFUlRZOlxyXG4gICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcbiAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGhhcyBjaGFuZ2VkLCBzZXQgdGhlIHByb3BlcnR5IGFuZCByYWlzZSB0aGUgc3ViamVjdFxyXG4gICAgICAgIGlmKHByb3BlcnRpZXMudXNlclByb3BlcnRpZXMuZ2V0KGNvbW1hbmQuT3BlcmF0aW9uKSE9PSBjb21tYW5kLm9iajEpIHtcclxuICAgICAgICAgIHByb3BlcnRpZXMudXNlclByb3BlcnRpZXMuc2V0KGNvbW1hbmQuT3BlcmF0aW9uLCBjb21tYW5kLm9iajEpO1xyXG4gICAgICAgICAgLy8gdGhlIHByb3BlcnR5IG5hbWUgaXMgb2YgZm9ybWF0IDxjb250cm9sTmFtZT5+PHByb3BlcnR5TmFtZT5cclxuICAgICAgICAgIHRoaXMuY3VzdG9tUHJvcGVydGllc1N1YmplY3QubmV4dCh7IHByb3BlcnR5TmFtZTogY29udHJvbElkICsgJ34nICsgY29tbWFuZC5PcGVyYXRpb24sIHZhbHVlOiBjb21tYW5kLm9iajEsIHJvd0lkOiBndWlSb3dJZCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlBST1BfU0VUX0NVU1RPTV9WQUxJREFUT1I6IHtcclxuICAgICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcblxyXG4gICAgICAgICAgbGV0IGNvbnRyb2wgPSB0aGlzLmdldEZvcm1Db250cm9sKGd1aVJvd0lkLnRvU3RyaW5nKCksIGNvbnRyb2xJZCk7XHJcbiAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByb3BlcnRpZXMuY3VzdG9tVmFsaWRhdG9ycy5zZXQoY29tbWFuZC5PcGVyYXRpb24sIGNvbW1hbmQub2JqMSk7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLnZhbGlkYXRvciAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhbY29udHJvbC52YWxpZGF0b3IsIHRoaXMuY3VzdG9tVmFsaWRhdG9yKGd1aVJvd0lkLnRvU3RyaW5nKCksIGNvbnRyb2xJZCldKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLmN1c3RvbVZhbGlkYXRvcihndWlSb3dJZC50b1N0cmluZygpLCBjb250cm9sSWQpKTtcclxuXHJcbiAgICAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9DTEFTUzpcclxuICAgICAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG4gICAgICAgIHByb3BlcnRpZXMuc2V0Q2xhc3MoY29tbWFuZC5PcGVyYXRpb24sIGNvbW1hbmQub2JqMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9TVFlMRTpcclxuICAgICAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG4gICAgICAgIHByb3BlcnRpZXMuc2V0U3R5bGUoY29tbWFuZC5PcGVyYXRpb24sIGNvbW1hbmQub2JqMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9BVFRSSUJVVEU6XHJcbiAgICAgICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0WzBdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG4gICAgICAgIHByb3BlcnRpZXMuZGF0YVR5cGUgPSA8U3RvcmFnZUF0dHJpYnV0ZT5TdHJpbmcuZnJvbUNoYXJDb2RlKGNvbW1hbmQubnVtYmVyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgIENvbW1hbmRUeXBlLlNFVF9WQUxVRTpcclxuICAgICAgICB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0udmFsdWVzW2NvbnRyb2xJZF0gPSBjb21tYW5kLnZhbHVlO1xyXG4gICAgICAgIGxldCBjID0gdGhpcy5nZXRGb3JtQ29udHJvbChndWlSb3dJZC50b1N0cmluZygpLCBjb250cm9sSWQpO1xyXG4gICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoYykpIHtcclxuICAgICAgICAgIGMuc2V0VmFsdWUodGhpcy5Db252ZXJ0VmFsRnJvbU5hdGl2ZShjb250cm9sSWQsIGNvbW1hbmQubGluZSwgY29tbWFuZC52YWx1ZSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLkNSRUFURV9TVUJfRk9STTpcclxuICAgICAgICB0aGlzLm1nU3ViZm9ybVNlcnZpY2UuYWRkU3ViZm9ybUNvbXAoY29tbWFuZC5DdHJsTmFtZSwgY29tbWFuZC51c2VyRHJvcEZvcm1hdC50b1N0cmluZygpLCBjb21tYW5kLnN0ciwgY29tbWFuZC5maWxlTmFtZSwgY29tbWFuZC5jb250ZXh0SUQsIGNvbW1hbmQucGFyYW1zLCBjb21tYW5kLkJvb2wxKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuQ0xPU0VfU1VCX0ZPUk06XHJcbiAgICAgICAgdGhpcy5tZ1N1YmZvcm1TZXJ2aWNlLmRlbGV0ZVN1YmZvcm1Db21wKGNvbW1hbmQuQ3RybE5hbWUsIGNvbW1hbmQudXNlckRyb3BGb3JtYXQudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9FTVBUWV9EQVRBVklFVzpcclxuICAgICAgICB0aGlzLnNldElzRW1wdHlEYXRhVmlldyhjb21tYW5kLkJvb2wxKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX0ZPQ1VTOlxyXG4gICAgICAgIHRoaXMucmVmcmVzaERvbS5uZXh0KGNvbW1hbmQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIGN1c3RvbSB2YWxpZGF0b3JcclxuICAqL1xyXG4gIGN1c3RvbVZhbGlkYXRvcihyb3dpZDogc3RyaW5nLCBpZDogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xyXG5cclxuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyA9PiB7XHJcbiAgICAgIGxldCBjb250cm9sTWV0YWRhdGE6IENvbnRyb2xNZXRhZGF0YTtcclxuICAgICAgY29udHJvbE1ldGFkYXRhID0gdGhpcy5SZWNvcmRzLmxpc3Rbcm93aWRdLmdldENvbnRyb2xNZXRhZGF0YShpZCk7XHJcbiAgICAgIGZvciAobGV0IGtleSBvZiBjb250cm9sTWV0YWRhdGEuY3VzdG9tVmFsaWRhdG9ycy5rZXlzKCkpIHtcclxuICAgICAgICBsZXQgdmFsaWRhdG9yID0gY29udHJvbE1ldGFkYXRhLmN1c3RvbVZhbGlkYXRvcnMuZ2V0KGtleSk7XHJcbiAgICAgICAgaWYgKCEoPEN1c3RvbVZhbGlkYXRvcj52YWxpZGF0b3IpLmlzVmFsaWQoKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHsgW2tleV06IHRydWUgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ09udmVydCBhIHZhbHVlIGZyb20gTWFnaWMgZm9ybWF0IHRvIG5hdGl2ZSBmb3JtYXRcclxuICAgKiBAcGFyYW0gY29udHJvbElkIElkIG9mIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gIHJvd0lkIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqIEBwYXJhbSB2YWwgVmFsdWUgdG8gY29udmVydFxyXG4gICAqIEByZXR1cm5zIENvbnZlcnRlZCB2YWx1ZVxyXG4gICAqL1xyXG4gIENvbnZlcnRWYWxUb05hdGl2ZShjb250cm9sSWQ6IHN0cmluZywgcm93SWQ6IG51bWJlciwgdmFsOiBhbnkpOiBhbnkge1xyXG5cclxuICAgIGxldCBwcm9wZXJ0aWVzOiBDb250cm9sTWV0YWRhdGE7XHJcbiAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbMF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcblxyXG4gICAgc3dpdGNoIChwcm9wZXJ0aWVzLmRhdGFUeXBlKSB7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjoge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgbGV0IHJhbmdlczogc3RyaW5nID0gdGhpcy5HZXRGbGRSYW5nZXMoY29udHJvbElkKTtcclxuICAgICAgICAgIGxldCBmb3VuZDogbnVtYmVyID0gcmFuZ2VzLmluZGV4T2YoJywnKTtcclxuICAgICAgICAgIGxldCB0cnVlT3B0aW9uOiBzdHJpbmcgPSByYW5nZXMuc3Vic3RyKDAsIGZvdW5kKTtcclxuICAgICAgICAgIGxldCBmYWxzZU9wdGlvbjogc3RyaW5nID0gcmFuZ2VzLnN1YnN0cihmb3VuZCArIDEpO1xyXG4gICAgICAgICAgaWYgKE5TdHJpbmcuRXF1YWxzKHZhbCwgdHJ1ZU9wdGlvbiwgdHJ1ZSkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgZWxzZSBpZiAoTlN0cmluZy5FcXVhbHModmFsLCBmYWxzZU9wdGlvbiwgdHJ1ZSkpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKXtcclxuICAgICAgICBsZXQgaWR4ID0gdmFsLmluZGV4T2YoJzonLDApO1xyXG4gICAgICAgIGxldCBob3VyczogbnVtYmVyID0gK3ZhbC5zdWJzdHIoMCwgaWR4KTtcclxuICAgICAgICBsZXQgbWludXRlczogbnVtYmVyID0gK3ZhbC5zdWJzdHIoaWR4KzEsIDIpO1xyXG4gICAgICAgIGxldCBzZWNvbmRzID0gMDtcclxuICAgICAgICBpZiAodmFsLmxlbmd0aCA+IDUpIHtcclxuICAgICAgICAgIGlkeCA9IHZhbC5pbmRleE9mKCc6JywgaWR4ICsgMSk7XHJcbiAgICAgICAgICBpZiAoaWR4ID49IDApXHJcbiAgICAgICAgICAgIHNlY29uZHMgPSArdmFsLnN1YnN0cihpZHggKyAxLCAyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbC5pbmRleE9mKCdQTScpPjApXHJcbiAgICAgICAgICBob3VycyArPSAxMjtcclxuICAgICAgICBsZXQgZHQ6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGR0LnNldEhvdXJzKGhvdXJzKTtcclxuICAgICAgICBkdC5zZXRNaW51dGVzKG1pbnV0ZXMpO1xyXG4gICAgICAgIGR0LnNldFNlY29uZHMoc2Vjb25kcyk7XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gZHQ7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgICByZXR1cm4gKHZhbCA9PT0gbnVsbCkgPyAwIDogdmFsO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB2YWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0IGEgdmFsdWUgZnJvbSBuYXRpdmUgdG8gTWFnaWMgZm9ybWF0XHJcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBJZCBvZiBjb250cm9sXHJcbiAgICogQHBhcmFtICByb3dJZCBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKiBAcGFyYW0gdmFsIFZhbHVlIHRvIGNvbnZlcnRcclxuICAgKiBAcmV0dXJucyBDb252ZXJ0ZWQgdmFsdWVcclxuICAgKi9cclxuICBDb252ZXJ0VmFsRnJvbU5hdGl2ZShjb250cm9sSWQ6IHN0cmluZywgcm93SWQ6IG51bWJlciwgdmFsOiBhbnkpOiBhbnkge1xyXG5cclxuICAgIGxldCBwcm9wZXJ0aWVzOiBDb250cm9sTWV0YWRhdGE7XHJcbiAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbMF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcblxyXG4gICAgc3dpdGNoIChwcm9wZXJ0aWVzLmRhdGFUeXBlKSB7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRToge1xyXG4gICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICBsZXQgc3RyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgICAgIGxldCBmb3JtYXQ6IHN0cmluZyA9IHZhbC5nZXRIb3VycygpID4gOSA/ICd7MH0nIDogJzB7MH0nO1xyXG4gICAgICAgICAgc3RyLkFwcGVuZEZvcm1hdChmb3JtYXQsIHZhbC5nZXRIb3VycygpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgc3RyLkFwcGVuZCgnOicpO1xyXG4gICAgICAgICAgZm9ybWF0ID0gdmFsLmdldE1pbnV0ZXMoKSA+IDkgPyAnezB9JyA6ICcwezB9JztcclxuICAgICAgICAgIHN0ci5BcHBlbmRGb3JtYXQoZm9ybWF0LCB2YWwuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgaWYgKCB2YWwuZ2V0U2Vjb25kcygpID4gMCkge1xyXG4gICAgICAgICAgICBzdHIuQXBwZW5kKCc6Jyk7XHJcbiAgICAgICAgICAgIGZvcm1hdCA9IHZhbC5nZXRTZWNvbmRzKCkgPiA5ID8gJ3swfScgOiAnMHswfSc7XHJcbiAgICAgICAgICAgIHN0ci5BcHBlbmRGb3JtYXQoZm9ybWF0LCB2YWwuZ2V0U2Vjb25kcygpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHN0ci5Ub1N0cmluZygpO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgfVxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjoge1xyXG4gICAgICAgIGxldCBwcm9wZXJ0aWVzOiBDb250cm9sTWV0YWRhdGE7XHJcbiAgICAgICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0WycwJ10uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJyAmJiBwcm9wZXJ0aWVzLnJhbmdlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICBsZXQgcmFuZ2VzOiBzdHJpbmcgPSB0aGlzLkdldEZsZFJhbmdlcyhjb250cm9sSWQpO1xyXG4gICAgICAgICAgbGV0IGZvdW5kOiBudW1iZXIgPSByYW5nZXMuaW5kZXhPZignLCcpO1xyXG4gICAgICAgICAgbGV0IHRydWVPcHRpb246IHN0cmluZyA9IHJhbmdlcy5zdWJzdHIoMCwgZm91bmQpO1xyXG4gICAgICAgICAgbGV0IGZhbHNlT3B0aW9uOiBzdHJpbmcgPSByYW5nZXMuc3Vic3RyKGZvdW5kICsgMSk7XHJcbiAgICAgICAgICBpZiAodmFsKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZU9wdGlvbjtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlT3B0aW9uO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHJlc2l6ZSBhbmQgYWxzbyBmZXRjaCBjaHVuayBvZiByZWNvcmRzIGlmIGhhdmluZyBhbiBlbXB0eSB2aWV3LlxyXG4gICAqIEBpZ25vcmVcclxuICAgKiBAcGFyYW0gcGFnZVNpemUgOiBQYWdlU2l6ZVxyXG4gICAqIEBwYXJhbSB0b3BHdWlSb3dJZCA6IEd1aVJvd0lkIG9mIGZpcnN0IHJlY29yZCBpbiB2aWV3LlxyXG4gICAqL1xyXG4gICByZXNpemUocGFnZVNpemU6IG51bWJlciwgdG9wR3VpUm93SWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IGd1aUV2ZW50OiBJR3VpRXZlbnQgPSBnZXRHdWlFdmVudE9iaigncmVzaXplJywgJ3RhYmxlJywgMCk7XHJcbiAgICBndWlFdmVudC5QYWdlU2l6ZSA9IHBhZ2VTaXplO1xyXG5cclxuICAgIC8vQXMgJ2dldFJvd3MnIGV2ZW50IGFsc28gZ2V0cyBleGVjdXRlZCwgc2V0IHRoZSBndWlFdmVudC5MaW5lIHBhcmFtZXRlci5cclxuICAgIGd1aUV2ZW50LkxpbmUgPSB0b3BHdWlSb3dJZDtcclxuICAgIHRoaXMuaW5zZXJ0RXZlbnQoZ3VpRXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyBkYXRhIGZvciBuZXcgdGFibGUgcm93cyB3aGVuIHNjcm9sbGluZyBkb25lXHJcbiAgICovXHJcbiAgb25TY3JvbGxEb3duKCkge1xyXG4gICAgaWYgKCF0aGlzLlJlY29yZHMuaW5jbHVkZXNMYXN0KSB7XHJcbiAgICAgIGxldCBndWlFdmVudDogSUd1aUV2ZW50ID0gZ2V0R3VpRXZlbnRPYmooJ2dldFJvd3MnLCAndGFibGUnLCAwKTtcclxuICAgICAgZ3VpRXZlbnQuTGluZSA9IHRoaXMuZm9ybUdyb3Vwcy5sZW5ndGg7XHJcbiAgICAgIHRoaXMuaW5zZXJ0RXZlbnQoZ3VpRXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgbmV3IGJyb3dzZXIgd2luZG93IHRpdGxlXHJcbiAgICogQHBhcmFtIG5ld1RpdGxlIE5ldyB3aW5kb3cgdGl0bGVcclxuICAgKi9cclxuICBzZXRUaXRsZShuZXdUaXRsZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLm1nVGl0bGVTZXJ2aWNlLnNldFRpdGxlKG5ld1RpdGxlKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgZ2V0R3VpUm93SWQoZHZSb3dJZDogbnVtYmVyLCBpc1RhYmxlQ29udHJvbDogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKGlzVGFibGVDb250cm9sID8gZHZSb3dJZCArIHRoaXMuUmVjb3Jkcy5yZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgOiAwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGdldER2Um93SWQoZ3VpUm93SWQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKGd1aVJvd0lkIC0gdGhpcy5SZWNvcmRzLnJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhbiB1cCB0aGUgc2VydmljZSB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWRcclxuICAgKi9cclxuICBkaXNwb3NlKCkge1xyXG4gICAgIHRoaXMucmVmcmVzaERvbS5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy5kZXRlY3RDaGFuZ2VzLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZUludGVyYWN0aXZlQ29tbWFuZHMudW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlUmVmcmVzaERvbS51bnN1YnNjcmliZSgpO1xyXG4gICAgIHRoaXMuaW50ZXJhY3RpdmVDb21tYW5kcy5jb21wbGV0ZSgpO1xyXG4gICAgIHRoaXMuY3VzdG9tUHJvcGVydGllc1N1YmplY3QuY29tcGxldGUoKTtcclxuICAgICB0aGlzLk9uU2VsZWN0ZWRSb3dDaGFuZ2VkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgLy9FdmVudHM6XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSB0aGUgQ29tYm9ib3ggXCJjaGFuZ2VcIiBldmVudFxyXG4gICAqIEBwYXJhbSBldmVudCAgVGhlIGV2ZW50IHJlY2VpdmVkIGZyb20gdGhlIFVJXHJcbiAgICogQHBhcmFtIGlkeCBJZCBvZiB0aGUgY29udHJvbCByYWlzaW5nIHRoZSBldmVudFxyXG4gICAqIEBwYXJhbSBsaW5lIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqL1xyXG4gIG9uQ29tYm9ib3hTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50OiBFdmVudCwgaWR4OiBzdHJpbmcsIGxpbmU6IG51bWJlcikge1xyXG4gICAgbGV0IGd1aUV2ZW50OiBJR3VpRXZlbnQgPSBnZXRHdWlFdmVudE9iaignc2VsZWN0aW9uY2hhbmdlZCcsIGlkeCwgbGluZSk7XHJcblxyXG4gICAgaWYgKHR5cGVvZiAoZXZlbnQpID09ICdudW1iZXInKSB7XHJcbiAgICAgICAgZ3VpRXZlbnQuVmFsdWUgPSBldmVudDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICAgICAgICBsZXQgaW5kZXhlczogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPigoPGFueT5ldmVudC50YXJnZXQpLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICg8YW55PmV2ZW50LnRhcmdldCkuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpbmRleGVzW2ldID0gKDxIVE1MT3B0aW9uRWxlbWVudD4oPGFueT5ldmVudC50YXJnZXQpLnNlbGVjdGVkT3B0aW9uc1tpXSkuaW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZ3VpRXZlbnQuVmFsdWUgPSBpbmRleGVzLmpvaW4oJywnKTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgZ3VpRXZlbnQuVmFsdWUgPSAoPGFueT5ldmVudCkudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbnNlcnRFdmVudChndWlFdmVudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgdGhlIExpc3Rib3ggXCJjaGFuZ2VcIiBldmVudFxyXG4gICAqIEBwYXJhbSAgZXZlbnQgVGhlIGV2ZW50IHJlY2VpdmVkIGZyb20gdGhlIFVJXHJcbiAgICogQHBhcmFtIGlkeCBJZCBvZiB0aGUgY29udHJvbCByYWlzaW5nIHRoZSBldmVudFxyXG4gICAqL1xyXG4gIG9uTGlzdEJveFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQ6IEV2ZW50LCBpZHg6IHN0cmluZykge1xyXG4gICAgbGV0IGd1aUV2ZW50OiBJR3VpRXZlbnQgPSBnZXRHdWlFdmVudE9iaignc2VsZWN0aW9uY2hhbmdlZCcsIGlkeCwgMCk7XHJcblxyXG4gICAgbGV0IHNlbGVjdGVkT3B0aW9ucztcclxuICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZXZlbnQudGFyZ2V0KSlcclxuICAgICAgc2VsZWN0ZWRPcHRpb25zID0gKDxhbnk+ZXZlbnQudGFyZ2V0KS5zZWxlY3RlZE9wdGlvbnM7XHJcbiAgICBlbHNlXHJcbiAgICAgIHNlbGVjdGVkT3B0aW9ucyA9ICg8YW55PmV2ZW50KS5zb3VyY2Uuc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkO1xyXG5cclxuICAgIGxldCBsZW5ndGggPSBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoO1xyXG4gICAgbGV0IGluZGV4ZXM6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4obGVuZ3RoKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZXZlbnQudGFyZ2V0KSlcclxuICAgICAgICBpbmRleGVzW2ldID0gKHNlbGVjdGVkT3B0aW9uc1tpXSkuaW5kZXg7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBpbmRleGVzW2ldID0gKHNlbGVjdGVkT3B0aW9uc1tpXSkudmFsdWU7XHJcbiAgICB9XHJcbiAgICBndWlFdmVudC5WYWx1ZSA9IDxhbnk+aW5kZXhlczsgLy8gVE9ETzogZml4XHJcbiAgICB0aGlzLmluc2VydEV2ZW50KGd1aUV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSB0aGUgQ2hlY2tib3ggXCJjaGFuZ2VcIiBldmVudFxyXG4gICAqIEBwYXJhbSAgZXZlbnQgVGhlIGV2ZW50IHJlY2VpdmVkIGZyb20gdGhlIFVJXHJcbiAgICogQHBhcmFtIGlkeCBJZCBvZiB0aGUgY29udHJvbCByYWlzaW5nIHRoZSBldmVudFxyXG4gICAqIEBwYXJhbSAgcm93SWQgUm93IElkLCBpZiBhcHBsaWNhYmxlXHJcbiAgICovXHJcbiAgb25DaGVja0NoYW5nZWQoZXZlbnQ6IEV2ZW50LCBpZHg6IHN0cmluZywgcm93SWQ6IG51bWJlcikge1xyXG4gICAgaWYgKHR5cGVvZiByb3dJZCA9PT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgIHJvd0lkID0gMDtcclxuICAgIGxldCBndWlFdmVudDogSUd1aUV2ZW50ID0gZ2V0R3VpRXZlbnRPYmooJ3NlbGVjdGlvbmNoYW5nZWQnLCBpZHgsIHJvd0lkKTtcclxuXHJcbiAgICBpZiAodHlwZW9mIChldmVudCkgPT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgZ3VpRXZlbnQuVmFsdWUgPSBldmVudDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQudGFyZ2V0ID09PSAndW5kZWZpbmVkJylcclxuICAgICAgICAgICAgZ3VpRXZlbnQuVmFsdWUgPSAoPGFueT4oZXZlbnQpKS5jaGVja2VkO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgZ3VpRXZlbnQuVmFsdWUgPSAoPGFueT4oZXZlbnQudGFyZ2V0KSkuY2hlY2tlZDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluc2VydEV2ZW50KGd1aUV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSB0YWIgc2VsZWN0aW9uIGNoYW5nZSwgY2F1c2VkIGJ5IFVJIGV2ZW50c1xyXG4gICAqIEBwYXJhbSBpZHggSWQgb2YgdGhlIGNvbnRyb2wgcmFpc2luZyB0aGUgZXZlbnRcclxuICAgKiBAcGFyYW0gIGxheWVyIElkIG9mIHNlbGVjdGVkIHRhYnBhZ2VcclxuICAgKi9cclxuICBtZ09uVGFiU2VsZWN0aW9uQ2hhbmdlZChpZHg6IHN0cmluZywgbGF5ZXI6IG51bWJlcikge1xyXG4gICAgbGV0IGd1aUV2ZW50OiBJR3VpRXZlbnQgPSBnZXRHdWlFdmVudE9iaignc2VsZWN0aW9uY2hhbmdlZCcsIGlkeCwgMCk7XHJcbiAgICBndWlFdmVudC5WYWx1ZSA9IGxheWVyLnRvU3RyaW5nKCk7XHJcbiAgICB0aGlzLmluc2VydEV2ZW50KGd1aUV2ZW50KTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgdGhlIFJhZGlvIGJ1dHRvbiBcImNoYW5nZVwiIGV2ZW50XHJcbiAgICogQHBhcmFtICBldmVudCBUaGUgZXZlbnQgcmVjZWl2ZWQgZnJvbSB0aGUgVUlcclxuICAgKiBAcGFyYW0gaWR4IElkIG9mIHRoZSBjb250cm9sIHJhaXNpbmcgdGhlIGV2ZW50XHJcbiAgICovXHJcbiAgbWdPblJhZGlvU2VsZWN0aW9uQ2hhbmdlZChldmVudDogRXZlbnQsIGlkeDogc3RyaW5nKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gdGhpcy5nZXRGb3JtQ29udHJvbCgnMCcsIGlkeCk7XHJcbiAgICBsZXQgZ3VpRXZlbnQ6IElHdWlFdmVudCA9IGdldEd1aUV2ZW50T2JqKCdzZWxlY3Rpb25jaGFuZ2VkJywgaWR4LCAwKTtcclxuICAgIGlmKHR5cGVvZiByZXN1bHQudmFsdWUgIT09ICdzdHJpbmcnKVxyXG4gICAgICBndWlFdmVudC5WYWx1ZSA9IHJlc3VsdC52YWx1ZS5pbmRleDtcclxuICAgIGVsc2VcclxuICAgICAgZ3VpRXZlbnQuVmFsdWUgPSAgcmVzdWx0LnZhbHVlO1xyXG4gICAgdGhpcy5pbnNlcnRFdmVudChndWlFdmVudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbnNlcnRzIHRoZSBcImNsb3NlXCIgZXZlbnQgdG8gdGhlIG1hZ2ljIFdlYkNsaWVudCBldmVudCBxdWV1ZVxyXG4gICAqL1xyXG4gIGNsb3NlKCkge1xyXG4gICAgdGhpcy5pbnNlcnRFdmVudChnZXRHdWlFdmVudE9iaignY2xvc2UnLCBudWxsLCAwKSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIElzU3R1YigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1hZ2ljLmlzU3R1YjtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gIC8vL1N0dWIgaGFuZGxpbmdcclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAganNvbkRhdGE6IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHNhdmVEYXRhKGRhdGE6IHN0cmluZykge1xyXG4gICAgdGhpcy5tYWdpYy5zYXZlRGF0YShkYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwdWJsaWMgY3JlYXRlRGF0YSgpIHtcclxuICAgIGxldCBteURhdGEgPSB7XHJcbiAgICAgIHJlY29yZHM6IHRoaXMuUmVjb3JkcyxcclxuICAgICAgdGVtcGxhdGU6IHRoaXMudGVtcGxhdGVcclxuICAgIH07XHJcbiAgICBsZXQgdGV4dDogc3RyaW5nID0gJ2xvYWREYXRhKCk6YW55ICAge1xcbicgK1xyXG4gICAgICAnICAgIGxldCBzdHViRGF0YSA9ICcgKyBKU09OLnN0cmluZ2lmeShteURhdGEpICsgJztcXG4nICtcclxuICAgICAgJyAgICB0aGlzLmxvYWRTdHViRGF0YShzdHViRGF0YSk7fSc7XHJcbiAgICBjb25zb2xlLmxvZyh0ZXh0KTtcclxuICAgIHRoaXMuc2F2ZURhdGEodGV4dCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBsb2FkU3R1YkRhdGEoc3R1YkRhdGE6IGFueSkge1xyXG5cclxuICAgIHRoaXMuUmVjb3JkcyA9IHN0dWJEYXRhLnJlY29yZHM7XHJcbiAgICB0aGlzLnNldHRlbXBsYXRlKHN0dWJEYXRhLnRlbXBsYXRlKTtcclxuICAgIHRoaXMudGFza0lkID0gJzEnO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLlJlY29yZHMubGlzdC5sZW5ndGg7IGkrKylcclxuICAgICAgdGhpcy5idWlsZFRhYmxlUm93Q29udHJvbHMoaSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHVibGljIGxvYWREYXRhKCkge1xyXG4gICAgYWxlcnQoJ1BsZWFzZSwgb3ZlcndyaXRlIG1ldGhvZCBsb2FkRGF0YScpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHNldFN0dWJWYWx1ZShndWlSb3dJZDogbnVtYmVyLCBmYzogRm9ybUNvbnRyb2wsIG5hbWU6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuSXNTdHViKCkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBsZXQgdmFsID0gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLnZhbHVlc1tuYW1lXTtcclxuICAgICAgICBmYy5zZXRWYWx1ZSh2YWwpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEVuZCBvZiBzdHViIGhhbmRsaW5cclxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG59XHJcblxyXG4iXX0=
|