@magic-xpa/gui 4.1200.0-dev4120.21 → 4.1200.0-dev4120.213
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/fesm2022/magic-xpa-gui.mjs +5724 -249
- package/fesm2022/magic-xpa-gui.mjs.map +1 -1
- package/index.d.ts +3 -0
- package/package.json +2 -4
- package/src/GuiEnums.d.ts +3 -0
- package/src/gui/GuiMgControl.d.ts +1 -0
- package/src/management/exp/ExpressionInterface.d.ts +1 -0
- package/src/management/gui/MgControlBase.d.ts +1 -1
- package/src/management/gui/PropInterface.d.ts +2 -1
- package/esm2022/index.mjs +0 -71
- package/esm2022/magic-xpa-gui.mjs +0 -2
- package/esm2022/src/Commands.mjs +0 -184
- package/esm2022/src/Events.mjs +0 -425
- package/esm2022/src/EventsProcessor.mjs +0 -67
- package/esm2022/src/FocusManager.mjs +0 -34
- package/esm2022/src/GuiConstants.mjs +0 -68
- package/esm2022/src/GuiEnums.mjs +0 -301
- package/esm2022/src/GuiEnvironment.mjs +0 -4
- package/esm2022/src/IFlowMonitorQueue.mjs +0 -2
- package/esm2022/src/Manager.mjs +0 -91
- package/esm2022/src/UIBridge.mjs +0 -33
- package/esm2022/src/env/IEnvironment.mjs +0 -2
- package/esm2022/src/gui/ControlBase.mjs +0 -3
- package/esm2022/src/gui/GuiMgControl.mjs +0 -123
- package/esm2022/src/gui/GuiMgForm.mjs +0 -4
- package/esm2022/src/gui/KeyboardItem.mjs +0 -135
- package/esm2022/src/gui/LastFocusedVal.mjs +0 -11
- package/esm2022/src/gui/MgValue.mjs +0 -16
- package/esm2022/src/gui/PropParentInterface.mjs +0 -2
- package/esm2022/src/gui/low/DialogHandler.mjs +0 -7
- package/esm2022/src/gui/low/GuiCommand.mjs +0 -68
- package/esm2022/src/gui/low/GuiCommandQueue.mjs +0 -35
- package/esm2022/src/gui/low/GuiInteractive.mjs +0 -178
- package/esm2022/src/gui/low/Style.mjs +0 -20
- package/esm2022/src/management/RuntimeContextBase.mjs +0 -42
- package/esm2022/src/management/data/BlobType.mjs +0 -281
- package/esm2022/src/management/data/DcValues.mjs +0 -214
- package/esm2022/src/management/data/DcValuesBuilderBase.mjs +0 -96
- package/esm2022/src/management/data/FieldDef.mjs +0 -331
- package/esm2022/src/management/data/FieldsTable.mjs +0 -54
- package/esm2022/src/management/data/GuiDataViewBase.mjs +0 -88
- package/esm2022/src/management/data/GuiFieldBase.mjs +0 -82
- package/esm2022/src/management/data/IRecord.mjs +0 -2
- package/esm2022/src/management/data/IReferencedObject.mjs +0 -2
- package/esm2022/src/management/data/NUM_TYPE.mjs +0 -1739
- package/esm2022/src/management/data/ObjectReferenceBase.mjs +0 -48
- package/esm2022/src/management/data/ObjectReferencesCollection.mjs +0 -27
- package/esm2022/src/management/data/RecordUtils.mjs +0 -361
- package/esm2022/src/management/data/VectorType.mjs +0 -612
- package/esm2022/src/management/data/VectorTypeBase.mjs +0 -88
- package/esm2022/src/management/events/IActionManager.mjs +0 -2
- package/esm2022/src/management/events/IGuiEventsManager.mjs +0 -2
- package/esm2022/src/management/exp/ExpressionInterface.mjs +0 -244
- package/esm2022/src/management/exp/GuiExpressionEvaluator.mjs +0 -305
- package/esm2022/src/management/gui/ControlTable.mjs +0 -118
- package/esm2022/src/management/gui/DisplayConvertor.mjs +0 -1649
- package/esm2022/src/management/gui/FieldValidator.mjs +0 -711
- package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +0 -24
- package/esm2022/src/management/gui/GuiFormPropertyAdapter.mjs +0 -11
- package/esm2022/src/management/gui/HebrewDate.mjs +0 -278
- package/esm2022/src/management/gui/Helps.mjs +0 -237
- package/esm2022/src/management/gui/MgControlBase.mjs +0 -1869
- package/esm2022/src/management/gui/MgFormBase.mjs +0 -741
- package/esm2022/src/management/gui/PIC.mjs +0 -1185
- package/esm2022/src/management/gui/PropDefaults.mjs +0 -230
- package/esm2022/src/management/gui/PropInterface.mjs +0 -246
- package/esm2022/src/management/gui/PropTable.mjs +0 -221
- package/esm2022/src/management/gui/Property.mjs +0 -1362
- package/esm2022/src/management/gui/ValidationDetails.mjs +0 -248
- package/esm2022/src/management/gui/ValidationDetailsBase.mjs +0 -93
- package/esm2022/src/management/gui/WrongFormatException.mjs +0 -29
- package/esm2022/src/management/tasks/GuiDataCollection.mjs +0 -4
- package/esm2022/src/management/tasks/GuiTaskBase.mjs +0 -511
- package/esm2022/src/management/tasks/IMGDataTable.mjs +0 -2
- package/esm2022/src/management/tasks/ITask.mjs +0 -2
- package/esm2022/src/management/tasks/MgTimer.mjs +0 -21
- package/esm2022/src/management/tasks/TaskDefinitionId.mjs +0 -54
- package/esm2022/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +0 -41
- package/esm2022/src/util/MemoryUtil.mjs +0 -35
- package/esm2022/src/util/ObjectReference.mjs +0 -36
- package/esm2022/src/util/UsernamePasswordCredentials.mjs +0 -52
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
import { ApplicationException, NString } from '@magic-xpa/mscorelib';
|
|
2
|
-
import { Rtf, StorageAttribute, StorageAttributeCheck, StrUtil } from '@magic-xpa/utils';
|
|
3
|
-
import { Manager } from '../../Manager';
|
|
4
|
-
import { NUM_TYPE } from '../data/NUM_TYPE';
|
|
5
|
-
import { BlobType } from '../data/BlobType';
|
|
6
|
-
import { DisplayConvertor } from '../gui/DisplayConvertor';
|
|
7
|
-
export class GuiExpressionEvaluator {
|
|
8
|
-
static TRIGGER_TASK = 500000;
|
|
9
|
-
ExpTask = null;
|
|
10
|
-
Events = null;
|
|
11
|
-
eval_op_statusbar_set_text(resVal, statusBarText) {
|
|
12
|
-
resVal.Attr = StorageAttribute.UNICODE;
|
|
13
|
-
resVal.StrVal = Manager.GetCurrentRuntimeContext().DefaultStatusMsg;
|
|
14
|
-
if (Manager.GetCurrentRuntimeContext().DefaultStatusMsg === null) {
|
|
15
|
-
resVal.StrVal = '';
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
resVal.StrVal = Manager.GetCurrentRuntimeContext().DefaultStatusMsg;
|
|
19
|
-
}
|
|
20
|
-
resVal.IsNull = false;
|
|
21
|
-
if (!(statusBarText.Attr !== StorageAttribute.ALPHA && statusBarText.Attr !== StorageAttribute.UNICODE)) {
|
|
22
|
-
if (!statusBarText.IsNull) {
|
|
23
|
-
let text = statusBarText.StrVal;
|
|
24
|
-
let task = this.ExpTask.GetContextTask();
|
|
25
|
-
if (task.getForm() === null && Manager.GetCurrentRuntimeContext().FrameForm !== null) {
|
|
26
|
-
task = Manager.GetCurrentRuntimeContext().FrameForm.getTask();
|
|
27
|
-
}
|
|
28
|
-
task.WriteToMessagePane(text);
|
|
29
|
-
Manager.GetCurrentRuntimeContext().DefaultStatusMsg = text;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
IsParallel() {
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
eval_op_ctrl_name(resVal) {
|
|
37
|
-
let lastClickedCtrlName = Manager.GetCurrentRuntimeContext().LastClickedCtrlName;
|
|
38
|
-
resVal.StrVal = (NString.IsNullOrEmpty(lastClickedCtrlName) ? '' : lastClickedCtrlName);
|
|
39
|
-
resVal.Attr = StorageAttribute.ALPHA;
|
|
40
|
-
}
|
|
41
|
-
eval_op_gotoCtrl(ctrlName, rowNum, generation, retVal) {
|
|
42
|
-
retVal.Attr = StorageAttribute.BOOLEAN;
|
|
43
|
-
retVal.BoolVal = false;
|
|
44
|
-
let task = this.GetContextTask(generation.MgNumVal.NUM_2_LONG());
|
|
45
|
-
if (task === null || task.getForm() === null)
|
|
46
|
-
return;
|
|
47
|
-
let iRowNum = rowNum.MgNumVal.NUM_2_LONG();
|
|
48
|
-
let sCtrlName = StrUtil.rtrim(ctrlName.StrVal);
|
|
49
|
-
let ctrl = task.getForm().GetCtrl(sCtrlName);
|
|
50
|
-
retVal.BoolVal = this.HandleControlGoto(task, ctrl, iRowNum);
|
|
51
|
-
}
|
|
52
|
-
static GetContextTask(currTask, generation) {
|
|
53
|
-
let task = null;
|
|
54
|
-
let taskBase = currTask.GetContextTask();
|
|
55
|
-
if (generation === GuiExpressionEvaluator.TRIGGER_TASK) {
|
|
56
|
-
task = taskBase;
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
if (generation < taskBase.GetTaskDepth()) {
|
|
60
|
-
task = taskBase.GetTaskAncestor(generation);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return task;
|
|
64
|
-
}
|
|
65
|
-
GetContextTask(generation) {
|
|
66
|
-
return GuiExpressionEvaluator.GetContextTask(this.ExpTask, generation);
|
|
67
|
-
}
|
|
68
|
-
ConstructMagicNum(resVal, i, attr) {
|
|
69
|
-
resVal.MgNumVal = new NUM_TYPE();
|
|
70
|
-
resVal.MgNumVal.NUM_4_LONG(i);
|
|
71
|
-
resVal.Attr = attr;
|
|
72
|
-
}
|
|
73
|
-
SetNULL(resVal, attr) {
|
|
74
|
-
resVal.IsNull = true;
|
|
75
|
-
resVal.Attr = attr;
|
|
76
|
-
switch (attr) {
|
|
77
|
-
case StorageAttribute.ALPHA:
|
|
78
|
-
case StorageAttribute.UNICODE:
|
|
79
|
-
resVal.StrVal = null;
|
|
80
|
-
break;
|
|
81
|
-
case StorageAttribute.TIME:
|
|
82
|
-
case StorageAttribute.DATE:
|
|
83
|
-
case StorageAttribute.NUMERIC:
|
|
84
|
-
resVal.MgNumVal = null;
|
|
85
|
-
break;
|
|
86
|
-
case StorageAttribute.BOOLEAN:
|
|
87
|
-
resVal.BoolVal = false;
|
|
88
|
-
break;
|
|
89
|
-
default:
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
GetValidatedValue(currCtrl, oldValue, newValue) {
|
|
94
|
-
let vd = currCtrl.buildCopyPicture(oldValue, newValue);
|
|
95
|
-
vd.evaluate();
|
|
96
|
-
let validationFailed = vd.ValidationFailed;
|
|
97
|
-
let ctrlValue;
|
|
98
|
-
if (validationFailed) {
|
|
99
|
-
let field = currCtrl.getField();
|
|
100
|
-
ctrlValue = ((field.getType() === StorageAttribute.BLOB_VECTOR) ? field.getCellDefualtValue() : field.getDefaultValue());
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
ctrlValue = vd.getDispValue();
|
|
104
|
-
}
|
|
105
|
-
return ctrlValue;
|
|
106
|
-
}
|
|
107
|
-
SetVal(resVal, type, val, pic) {
|
|
108
|
-
switch (type) {
|
|
109
|
-
case StorageAttribute.ALPHA:
|
|
110
|
-
case StorageAttribute.BLOB:
|
|
111
|
-
case StorageAttribute.BLOB_VECTOR:
|
|
112
|
-
case StorageAttribute.UNICODE:
|
|
113
|
-
resVal.Attr = type;
|
|
114
|
-
resVal.StrVal = val;
|
|
115
|
-
if (type === StorageAttribute.BLOB || type === StorageAttribute.BLOB_VECTOR)
|
|
116
|
-
resVal.IncludeBlobPrefix = true;
|
|
117
|
-
break;
|
|
118
|
-
case StorageAttribute.NUMERIC:
|
|
119
|
-
case StorageAttribute.DATE:
|
|
120
|
-
case StorageAttribute.TIME:
|
|
121
|
-
resVal.Attr = type;
|
|
122
|
-
if (val == null)
|
|
123
|
-
resVal.MgNumVal = null;
|
|
124
|
-
else if (pic == null)
|
|
125
|
-
resVal.MgNumVal = new NUM_TYPE(val);
|
|
126
|
-
else
|
|
127
|
-
resVal.MgNumVal = new NUM_TYPE(val, pic, (this.ExpTask).getCompIdx());
|
|
128
|
-
break;
|
|
129
|
-
case StorageAttribute.BOOLEAN:
|
|
130
|
-
resVal.Attr = type;
|
|
131
|
-
resVal.BoolVal = DisplayConvertor.toBoolean(val);
|
|
132
|
-
break;
|
|
133
|
-
default:
|
|
134
|
-
this.SetNULL(resVal, type);
|
|
135
|
-
this.Events.WriteExceptionToLog('ExpressionEvaluator.SetVal() there is no such type : ' + type);
|
|
136
|
-
break;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
static exp_build_string(val) {
|
|
140
|
-
let name = '';
|
|
141
|
-
if (val.StrVal !== null) {
|
|
142
|
-
let len = val.StrVal.length;
|
|
143
|
-
if (len > 0) {
|
|
144
|
-
name = StrUtil.ZstringMake(val.StrVal, len);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
return name;
|
|
148
|
-
}
|
|
149
|
-
static isExpVal(obj) {
|
|
150
|
-
return obj instanceof ExpVal;
|
|
151
|
-
}
|
|
152
|
-
BlobStringConversion(val, expectedType) {
|
|
153
|
-
if (StorageAttributeCheck.IsTypeAlphaOrUnicode(expectedType)) {
|
|
154
|
-
if (val.Attr === StorageAttribute.BLOB) {
|
|
155
|
-
let includeBlobPrefix = val.IncludeBlobPrefix;
|
|
156
|
-
if (includeBlobPrefix) {
|
|
157
|
-
let contentType = BlobType.getContentType(val.StrVal);
|
|
158
|
-
val.StrVal = BlobType.getString(val.StrVal);
|
|
159
|
-
val.IncludeBlobPrefix = false;
|
|
160
|
-
if (contentType !== BlobType.CONTENT_TYPE_BINARY && Rtf.isRtf(val.StrVal)) {
|
|
161
|
-
val.StrVal = StrUtil.GetPlainTextfromRtf(val.StrVal);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
val.Attr = expectedType;
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
if (val.Attr === StorageAttribute.BLOB_VECTOR) {
|
|
168
|
-
let includeBlobPrefix2 = val.IncludeBlobPrefix;
|
|
169
|
-
if (includeBlobPrefix2) {
|
|
170
|
-
val.StrVal = BlobType.removeBlobPrefix(val.StrVal);
|
|
171
|
-
val.IncludeBlobPrefix = false;
|
|
172
|
-
}
|
|
173
|
-
val.Attr = expectedType;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
if (expectedType === StorageAttribute.BLOB) {
|
|
179
|
-
if (StorageAttributeCheck.IsTypeAlphaOrUnicode(val.Attr)) {
|
|
180
|
-
let contentType = (val.Attr === StorageAttribute.ALPHA) ? BlobType.CONTENT_TYPE_ANSI : BlobType.CONTENT_TYPE_UNICODE;
|
|
181
|
-
val.StrVal = BlobType.createFromString(val.StrVal, contentType);
|
|
182
|
-
val.IncludeBlobPrefix = true;
|
|
183
|
-
val.Attr = expectedType;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
eval_op_zimeread(resVal) {
|
|
189
|
-
resVal.Attr = StorageAttribute.ALPHA;
|
|
190
|
-
resVal.StrVal = '';
|
|
191
|
-
let utilImeJpn = Manager.UtilImeJpn;
|
|
192
|
-
if (utilImeJpn !== null) {
|
|
193
|
-
let strImeRead = utilImeJpn.StrImeRead;
|
|
194
|
-
if (!NString.IsNullOrEmpty(utilImeJpn.StrImeRead)) {
|
|
195
|
-
resVal.StrVal = strImeRead;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
ConvertExpVal(val, expectedType) {
|
|
200
|
-
if (StorageAttributeCheck.StorageFldAlphaUnicodeOrBlob(val.Attr, expectedType)) {
|
|
201
|
-
this.BlobStringConversion(val, expectedType);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
export class ExpVal {
|
|
206
|
-
Attr = StorageAttribute.NONE;
|
|
207
|
-
IsNull = false;
|
|
208
|
-
MgNumVal = null;
|
|
209
|
-
StrVal = null;
|
|
210
|
-
BoolVal = false;
|
|
211
|
-
IncludeBlobPrefix = false;
|
|
212
|
-
OriginalNull = false;
|
|
213
|
-
VectorField = null;
|
|
214
|
-
constructor(attr, isNull, mgVal) {
|
|
215
|
-
if (arguments.length === 0) {
|
|
216
|
-
this.constructor_0();
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
219
|
-
this.constructor_1(attr, isNull, mgVal);
|
|
220
|
-
}
|
|
221
|
-
constructor_0() {
|
|
222
|
-
this.Attr = StorageAttribute.NONE;
|
|
223
|
-
}
|
|
224
|
-
constructor_1(attr, isNull, mgVal) {
|
|
225
|
-
this.Init(attr, isNull, mgVal);
|
|
226
|
-
}
|
|
227
|
-
Copy(src) {
|
|
228
|
-
this.Attr = src.Attr;
|
|
229
|
-
this.BoolVal = src.BoolVal;
|
|
230
|
-
this.IncludeBlobPrefix = src.IncludeBlobPrefix;
|
|
231
|
-
this.IsNull = src.IsNull;
|
|
232
|
-
this.MgNumVal = src.MgNumVal;
|
|
233
|
-
this.StrVal = src.StrVal;
|
|
234
|
-
this.VectorField = src.VectorField;
|
|
235
|
-
this.OriginalNull = src.OriginalNull;
|
|
236
|
-
}
|
|
237
|
-
Nullify() {
|
|
238
|
-
this.Init(StorageAttribute.NONE, true, null);
|
|
239
|
-
}
|
|
240
|
-
Init(attr, isNull, mgVal) {
|
|
241
|
-
this.Attr = attr;
|
|
242
|
-
this.IsNull = isNull;
|
|
243
|
-
switch (this.Attr) {
|
|
244
|
-
case StorageAttribute.ALPHA:
|
|
245
|
-
case StorageAttribute.UNICODE:
|
|
246
|
-
this.StrVal = mgVal;
|
|
247
|
-
break;
|
|
248
|
-
case StorageAttribute.BLOB:
|
|
249
|
-
case StorageAttribute.BLOB_VECTOR:
|
|
250
|
-
this.StrVal = mgVal;
|
|
251
|
-
this.IncludeBlobPrefix = true;
|
|
252
|
-
break;
|
|
253
|
-
case StorageAttribute.NUMERIC:
|
|
254
|
-
case StorageAttribute.DATE:
|
|
255
|
-
case StorageAttribute.TIME:
|
|
256
|
-
this.MgNumVal = ((mgVal !== null) ? new NUM_TYPE(mgVal) : null);
|
|
257
|
-
break;
|
|
258
|
-
case StorageAttribute.BOOLEAN:
|
|
259
|
-
this.BoolVal = (mgVal !== null && mgVal === '1');
|
|
260
|
-
break;
|
|
261
|
-
case StorageAttribute.NONE:
|
|
262
|
-
this.BoolVal = false;
|
|
263
|
-
this.StrVal = null;
|
|
264
|
-
this.MgNumVal = null;
|
|
265
|
-
this.OriginalNull = true;
|
|
266
|
-
this.VectorField = null;
|
|
267
|
-
this.IncludeBlobPrefix = false;
|
|
268
|
-
break;
|
|
269
|
-
case StorageAttribute.DOTNET:
|
|
270
|
-
this.StrVal = mgVal;
|
|
271
|
-
break;
|
|
272
|
-
default:
|
|
273
|
-
throw new ApplicationException('in ExpVal.ExpVal() illegal attribute: \'' + this.Attr + '\'');
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
ToMgVal() {
|
|
277
|
-
let str;
|
|
278
|
-
switch (this.Attr) {
|
|
279
|
-
case StorageAttribute.ALPHA:
|
|
280
|
-
case StorageAttribute.BLOB:
|
|
281
|
-
case StorageAttribute.BLOB_VECTOR:
|
|
282
|
-
case StorageAttribute.UNICODE:
|
|
283
|
-
str = this.StrVal;
|
|
284
|
-
break;
|
|
285
|
-
case StorageAttribute.NUMERIC:
|
|
286
|
-
case StorageAttribute.DATE:
|
|
287
|
-
case StorageAttribute.TIME:
|
|
288
|
-
str = this.MgNumVal.toXMLrecord();
|
|
289
|
-
break;
|
|
290
|
-
case StorageAttribute.BOOLEAN:
|
|
291
|
-
str = this.BoolVal
|
|
292
|
-
? '1'
|
|
293
|
-
: '0';
|
|
294
|
-
break;
|
|
295
|
-
default:
|
|
296
|
-
str = '[illegal attribute: ' + this.Attr + ']';
|
|
297
|
-
break;
|
|
298
|
-
}
|
|
299
|
-
return str;
|
|
300
|
-
}
|
|
301
|
-
isEmptyString() {
|
|
302
|
-
return (this.Attr === StorageAttribute.ALPHA || this.Attr === StorageAttribute.UNICODE) && this.StrVal === '';
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3VpRXhwcmVzc2lvbkV2YWx1YXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9leHAvR3VpRXhwcmVzc2lvbkV2YWx1YXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsT0FBTyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbkUsT0FBTyxFQUFDLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQWEsTUFBTSxrQkFBa0IsQ0FBQztBQUduRyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXRDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUcxQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFHMUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFHekQsTUFBTSxPQUFnQixzQkFBc0I7SUFDMUMsTUFBTSxDQUFDLFlBQVksR0FBVyxNQUFNLENBQUM7SUFDckMsT0FBTyxHQUFnQixJQUFJLENBQUM7SUFDcEIsTUFBTSxHQUFRLElBQUksQ0FBQztJQVkzQiwwQkFBMEIsQ0FBQyxNQUFjLEVBQUUsYUFBcUI7UUFDOUQsTUFBTSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7UUFDdkMsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztRQUVwRSxJQUFJLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLGdCQUFnQixLQUFLLElBQUksRUFBRTtZQUNoRSxNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztTQUNwQjthQUFNO1lBQ0wsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsQ0FB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QUksQ0FBQztZQUMzQixLQUFLLGdCQUFnQixDQUFDLElBQUk7Z0JBQ3hCLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNsQyxNQUFNO1lBRVIsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPO2dCQUMzQixHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU87b0JBQ2hCLENBQUMsQ0FBQyxHQUFHO29CQUNMLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ1IsTUFBTTtZQUVSO2dCQUNFLEdBQUcsR0FBRyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztnQkFDL0MsTUFBTTtTQUNUO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBTUQsYUFBYTtRQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDO0lBQ2hILENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBwbGljYXRpb25FeGNlcHRpb24sIE5TdHJpbmd9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtSdGYsIFN0b3JhZ2VBdHRyaWJ1dGUsIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjaywgU3RyVXRpbCwgVXRpbEltZUpwbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7R3VpVGFza0Jhc2V9IGZyb20gJy4uL3Rhc2tzL0d1aVRhc2tCYXNlJztcclxuaW1wb3J0IHtJVGFza30gZnJvbSAnLi4vdGFza3MvSVRhc2snO1xyXG5pbXBvcnQge01hbmFnZXJ9IGZyb20gJy4uLy4uL01hbmFnZXInO1xyXG5pbXBvcnQge01nQ29udHJvbEJhc2V9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2xCYXNlJztcclxuaW1wb3J0IHtOVU1fVFlQRX0gZnJvbSAnLi4vZGF0YS9OVU1fVFlQRSc7XHJcbmltcG9ydCB7R3VpRmllbGRCYXNlfSBmcm9tICcuLi9kYXRhL0d1aUZpZWxkQmFzZSc7XHJcblxyXG5pbXBvcnQge0Jsb2JUeXBlfSBmcm9tICcuLi9kYXRhL0Jsb2JUeXBlJztcclxuaW1wb3J0IHtWYWxpZGF0aW9uRGV0YWlsc30gZnJvbSAnLi4vZ3VpL1ZhbGlkYXRpb25EZXRhaWxzJztcclxuaW1wb3J0IHtQSUN9IGZyb20gJy4uL2d1aS9QSUMnO1xyXG5pbXBvcnQge0Rpc3BsYXlDb252ZXJ0b3J9IGZyb20gJy4uL2d1aS9EaXNwbGF5Q29udmVydG9yJztcclxuXHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgR3VpRXhwcmVzc2lvbkV2YWx1YXRvciB7XHJcbiAgc3RhdGljIFRSSUdHRVJfVEFTSzogbnVtYmVyID0gNTAwMDAwO1xyXG4gIEV4cFRhc2s6IEd1aVRhc2tCYXNlID0gbnVsbDtcclxuICBwcml2YXRlIEV2ZW50czogYW55ID0gbnVsbDtcclxuXHJcblxyXG4gIGFic3RyYWN0IEhhbmRsZUNvbnRyb2xHb3RvKHRhc2s6IElUYXNrLCBjdHJsOiBNZ0NvbnRyb2xCYXNlLCByb3dObzogbnVtYmVyKTogYm9vbGVhbjtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHJvdGVjdGVkKVxyXG4gIC8vLyBzZXRzIHRoZSBzdGF0dXMgYmFyIHRleHQgd2l0aCB0aGUgZ2l2ZW4gdGV4dCBhbmRcclxuICAvLy8gc2V0cyB0aGUgcmVzdWx0IHdpdGggdGhlIGxhc3QgdGV4dCB0aGF0IHdhcyBzZXQgdG8gdGhlIHN0YXR1cyBiYXIgYnkgdGhlIHVzZSBvZiB0aGlzIGZ1bmN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlc1ZhbFwiPmxhc3QgdGV4dCBvZiBzdGF0dXMgYmFyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0YXR1c0JhclRleHRcIj50aGUgdGV4dCB0byBiZSBzZXQgYXQgc3RhdHVzIGJhcjwvcGFyYW0+XHJcbiAgZXZhbF9vcF9zdGF0dXNiYXJfc2V0X3RleHQocmVzVmFsOiBFeHBWYWwsIHN0YXR1c0JhclRleHQ6IEV4cFZhbCk6IHZvaWQge1xyXG4gICAgcmVzVmFsLkF0dHIgPSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU7XHJcbiAgICByZXNWYWwuU3RyVmFsID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5EZWZhdWx0U3RhdHVzTXNnO1xyXG5cclxuICAgIGlmIChNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLkRlZmF1bHRTdGF0dXNNc2cgPT09IG51bGwpIHtcclxuICAgICAgcmVzVmFsLlN0clZhbCA9ICcnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVzVmFsLlN0clZhbCA9IE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuRGVmYXVsdFN0YXR1c01zZztcclxuICAgIH1cclxuICAgIHJlc1ZhbC5Jc051bGwgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIShzdGF0dXNCYXJUZXh0LkF0dHIgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgJiYgc3RhdHVzQmFyVGV4dC5BdHRyICE9PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpKSB7XHJcbiAgICAgIGlmICghc3RhdHVzQmFyVGV4dC5Jc051bGwpIHtcclxuICAgICAgICBsZXQgdGV4dDogc3RyaW5nID0gc3RhdHVzQmFyVGV4dC5TdHJWYWw7XHJcbiAgICAgICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gPEd1aVRhc2tCYXNlPnRoaXMuRXhwVGFzay5HZXRDb250ZXh0VGFzaygpO1xyXG5cclxuICAgICAgICAvLyBJbiBjYXNlIG9mIG5vbiBpbnRlcmFjdGl2ZSB0YXNrcywgaXQgaXMgcG9zc2libGUgdGhhdCB0YXNrIGhhcyBvcGVuIHdpbmRvdyA9IE5vLCBTbyBkaXNwbGF5IHRoZSBzdGF0dXMgYmFyIG1zZyBvbiBmcmFtZSB3aW5kb3cuXHJcbiAgICAgICAgaWYgKHRhc2suZ2V0Rm9ybSgpID09PSBudWxsICYmIE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuRnJhbWVGb3JtICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0YXNrID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5GcmFtZUZvcm0uZ2V0VGFzaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0YXNrLldyaXRlVG9NZXNzYWdlUGFuZSh0ZXh0KTtcclxuICAgICAgICBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLkRlZmF1bHRTdGF0dXNNc2cgPSB0ZXh0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgSXNQYXJhbGxlbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHByb3RlY3RlZClcclxuICAvLy8gcmV0dXJuIHRoZSBjb250cm9sIG5hbWUgb2YgbGFzdCBjbGlja2VkIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGV2YWxfb3BfY3RybF9uYW1lKHJlc1ZhbDogRXhwVmFsKTogdm9pZCB7XHJcbiAgICBsZXQgbGFzdENsaWNrZWRDdHJsTmFtZTogc3RyaW5nID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5MYXN0Q2xpY2tlZEN0cmxOYW1lO1xyXG4gICAgcmVzVmFsLlN0clZhbCA9IChOU3RyaW5nLklzTnVsbE9yRW1wdHkobGFzdENsaWNrZWRDdHJsTmFtZSkgPyAnJyA6IGxhc3RDbGlja2VkQ3RybE5hbWUpO1xyXG4gICAgcmVzVmFsLkF0dHIgPSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHJvdGVjdGVkKVxyXG4gIC8vLyBNb3ZlcyB0aGUgY2FyZXQgdG8gc3BlY2lmaWVkIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybE5hbWVcIj50aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyb3dOdW1cIj50aGUgcm93IGluIHRoZSB0YWJsZSAgMCByZXByZXNlbnRzIGN1cnJlbnQgcm93PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImdlbmVyYXRpb25cIj50aGUgdGFzayBnZW5lcmF0aW9uPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldFZhbFwiPnRoZSByZXN1bHQ8L3BhcmFtPlxyXG4gIGV2YWxfb3BfZ290b0N0cmwoY3RybE5hbWU6IEV4cFZhbCwgcm93TnVtOiBFeHBWYWwsIGdlbmVyYXRpb246IEV4cFZhbCwgcmV0VmFsOiBFeHBWYWwpOiB2b2lkIHtcclxuICAgIHJldFZhbC5BdHRyID0gU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOO1xyXG4gICAgcmV0VmFsLkJvb2xWYWwgPSBmYWxzZTtcclxuICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IHRoaXMuR2V0Q29udGV4dFRhc2soZ2VuZXJhdGlvbi5NZ051bVZhbC5OVU1fMl9MT05HKCkpO1xyXG4gICAgaWYgKHRhc2sgPT09IG51bGwgfHwgdGFzay5nZXRGb3JtKCkgPT09IG51bGwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQgaVJvd051bTogbnVtYmVyID0gcm93TnVtLk1nTnVtVmFsLk5VTV8yX0xPTkcoKTtcclxuICAgIGxldCBzQ3RybE5hbWU6IHN0cmluZyA9IFN0clV0aWwucnRyaW0oY3RybE5hbWUuU3RyVmFsKTtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gdGFzay5nZXRGb3JtKCkuR2V0Q3RybChzQ3RybE5hbWUpO1xyXG4gICAgcmV0VmFsLkJvb2xWYWwgPSB0aGlzLkhhbmRsZUNvbnRyb2xHb3RvKHRhc2ssIGN0cmwsIGlSb3dOdW0pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pihwcm90ZWN0ZWQpXHJcbiAgLy8vIGdldCBjb250ZXh0IHRhc2sgYnkgYSBzcGVjaWZpZWQgZ2VuZXJhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyVGFza1wiPmN1cnJlbnQgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJnZW5lcmF0aW9uXCI+dGFzayBnZW5lcmF0aW9uPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRhc2sgYXQgc3BlY2lmaWVkIGdlbmVyYXRpb248L3JldHVybnM+XHJcbiAgc3RhdGljIEdldENvbnRleHRUYXNrKGN1cnJUYXNrOiBHdWlUYXNrQmFzZSwgZ2VuZXJhdGlvbjogbnVtYmVyKTogR3VpVGFza0Jhc2Uge1xyXG4gICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gbnVsbDtcclxuICAgIGxldCB0YXNrQmFzZTogR3VpVGFza0Jhc2UgPSA8R3VpVGFza0Jhc2U+IGN1cnJUYXNrLkdldENvbnRleHRUYXNrKCk7XHJcbiAgICBpZiAoZ2VuZXJhdGlvbiA9PT0gR3VpRXhwcmVzc2lvbkV2YWx1YXRvci5UUklHR0VSX1RBU0spIHtcclxuICAgICAgdGFzayA9IHRhc2tCYXNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGdlbmVyYXRpb24gPCB0YXNrQmFzZS5HZXRUYXNrRGVwdGgoKSkge1xyXG4gICAgICAgIHRhc2sgPSA8R3VpVGFza0Jhc2U+dGFza0Jhc2UuR2V0VGFza0FuY2VzdG9yKGdlbmVyYXRpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHJvdGVjdGVkKVxyXG4gIC8vLyBnZXQgY29udGV4dCB0YXNrIGJ5IGEgc3BlY2lmaWVkIGdlbmVyYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZ2VuZXJhdGlvblwiPnRhc2sgZ2VuZXJhdGlvbjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0YXNrIGF0IHNwZWNpZmllZCBnZW5lcmF0aW9uPC9yZXR1cm5zPlxyXG4gIEdldENvbnRleHRUYXNrKGdlbmVyYXRpb246IG51bWJlcik6IEd1aVRhc2tCYXNlIHtcclxuICAgIHJldHVybiBHdWlFeHByZXNzaW9uRXZhbHVhdG9yLkdldENvbnRleHRUYXNrKHRoaXMuRXhwVGFzaywgZ2VuZXJhdGlvbik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHByb3RlY3RlZClcclxuICAvLy8gQ3JlYXRlIGEgTlVNX1RZUEUgd2l0aCB0aGUgdmFsdWUgb2YgaSBhbmQgc2V0IHRoZSBFeHBWYWwgd2l0aCBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgQ29uc3RydWN0TWFnaWNOdW0ocmVzVmFsOiBFeHBWYWwsIGk6IG51bWJlciwgYXR0cjogU3RvcmFnZUF0dHJpYnV0ZSk6IHZvaWQge1xyXG4gICAgcmVzVmFsLk1nTnVtVmFsID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICByZXNWYWwuTWdOdW1WYWwuTlVNXzRfTE9ORyhpKTtcclxuICAgIHJlc1ZhbC5BdHRyID0gYXR0cjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHVibGljKVxyXG4gIC8vLyBzZXQgbnVsbCB2YWx1ZSB0byBFeHByZXNzaW9uIEV2YWx1YXRvclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXNWYWxcIj50byBzZXQgaXQgTlVMTDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJhdHRyXCI+YXR0cmlidXRlIG9mIEV4cFZhbHVlPC9wYXJhbT5cclxuICBTZXROVUxMKHJlc1ZhbDogRXhwVmFsLCBhdHRyOiBTdG9yYWdlQXR0cmlidXRlKTogdm9pZCB7XHJcbiAgICByZXNWYWwuSXNOdWxsID0gdHJ1ZTtcclxuICAgIHJlc1ZhbC5BdHRyID0gYXR0cjtcclxuXHJcbiAgICBzd2l0Y2ggKGF0dHIpIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICByZXNWYWwuU3RyVmFsID0gbnVsbDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgcmVzVmFsLk1nTnVtVmFsID0gbnVsbDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgIHJlc1ZhbC5Cb29sVmFsID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHZhbGlkYXRlIHZhbHVlIG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN1cnJDdHJsXCI+Y29udHJvbCB3aG9zZSB2YWx1ZSBuZWVkIHRvIGJlIGV2YWx1YXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbGRWYWx1ZVwiPm9sZCB2YWx1ZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdWYWx1ZVwiPm5ldyB2YWx1ZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgR2V0VmFsaWRhdGVkVmFsdWUoY3VyckN0cmw6IE1nQ29udHJvbEJhc2UsIG9sZFZhbHVlOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IHZkOiBWYWxpZGF0aW9uRGV0YWlscyA9IGN1cnJDdHJsLmJ1aWxkQ29weVBpY3R1cmUob2xkVmFsdWUsIG5ld1ZhbHVlKTtcclxuICAgIHZkLmV2YWx1YXRlKCk7XHJcbiAgICBsZXQgdmFsaWRhdGlvbkZhaWxlZDogYm9vbGVhbiA9IHZkLlZhbGlkYXRpb25GYWlsZWQ7XHJcbiAgICBsZXQgY3RybFZhbHVlOiBzdHJpbmc7XHJcbiAgICBpZiAodmFsaWRhdGlvbkZhaWxlZCkge1xyXG4gICAgICBsZXQgZmllbGQ6IEd1aUZpZWxkQmFzZSA9IGN1cnJDdHJsLmdldEZpZWxkKCk7XHJcbiAgICAgIGN0cmxWYWx1ZSA9ICgoZmllbGQuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSA/IGZpZWxkLmdldENlbGxEZWZ1YWx0VmFsdWUoKSA6IGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGN0cmxWYWx1ZSA9IHZkLmdldERpc3BWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0cmxWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgZXhwVmFsdWUgb2YgbmVlZGVkIHR5cGUgLiB0aGUgdmFsdWUgaXMgaW5pdGVkIGJ5IHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlc1ZhbFwiPm5lZWQgYmUgZXZhbHVhdGVkL2luaXRpYWxpemVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInR5cGVcIj5vZiByZXNWYWwgKEFscGhhfE51bWVyaWN8TG9naWNhbHxEYXRlfFRpbWV8QmxvYnxWZWN0b3IpPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnN0cmluZy9oZXhhIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj5mb3Igc3RyaW5nIGV2YWx1YXRpb248L3BhcmFtPlxyXG4gIFNldFZhbChyZXNWYWw6IEV4cFZhbCwgdHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgdmFsOiBzdHJpbmcsIHBpYzogUElDKTogdm9pZCB7XHJcblxyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIHJlc1ZhbC5BdHRyID0gdHlwZTtcclxuICAgICAgICByZXNWYWwuU3RyVmFsID0gdmFsO1xyXG5cclxuICAgICAgICBpZiAodHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgICByZXNWYWwuSW5jbHVkZUJsb2JQcmVmaXggPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICByZXNWYWwuQXR0ciA9IHR5cGU7XHJcbiAgICAgICAgaWYgKHZhbCA9PSBudWxsKVxyXG4gICAgICAgICAgcmVzVmFsLk1nTnVtVmFsID0gbnVsbDtcclxuICAgICAgICBlbHNlIGlmIChwaWMgPT0gbnVsbClcclxuICAgICAgICAgIHJlc1ZhbC5NZ051bVZhbCA9IG5ldyBOVU1fVFlQRSh2YWwpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHJlc1ZhbC5NZ051bVZhbCA9IG5ldyBOVU1fVFlQRSh2YWwsIHBpYywgKHRoaXMuRXhwVGFzaykuZ2V0Q29tcElkeCgpKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgIHJlc1ZhbC5BdHRyID0gdHlwZTtcclxuICAgICAgICByZXNWYWwuQm9vbFZhbCA9IERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKHZhbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMuU2V0TlVMTChyZXNWYWwsIHR5cGUpO1xyXG5cclxuICAgICAgICB0aGlzLkV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKCdFeHByZXNzaW9uRXZhbHVhdG9yLlNldFZhbCgpIHRoZXJlIGlzIG5vIHN1Y2ggdHlwZSA6ICcgKyB0eXBlKTtcclxuXHJcbiAgICAgICAgLy8gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5Xcml0ZUVycm9yVG9Mb2coXCJFeHByZXNzaW9uRXZhbHVhdG9yLlNldFZhbCgpIHRoZXJlIGlzIG5vIHN1Y2ggdHlwZSA6IFwiICsgdHlwZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHByb3RlY3RlZClcclxuICAvLy8gdHJpbXMgYW5kIHJldHVybnMgdGhlIHN0cmluZy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+Y29udGFpbmluZyBzdHJpbmcgdG8gYmUgdHJpbW1lZCAoc3RyVmFsXyBtZW1iZXIgb2YgRXhwVmFsKTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnRyaW1tZWQgc3RyaW5nPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBleHBfYnVpbGRfc3RyaW5nKHZhbDogRXhwVmFsKTogc3RyaW5nIHtcclxuICAgIGxldCBuYW1lOiBzdHJpbmcgPSAnJztcclxuICAgIGlmICh2YWwuU3RyVmFsICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBsZW46IG51bWJlciA9IDxudW1iZXI+dmFsLlN0clZhbC5sZW5ndGg7XHJcbiAgICAgIGlmIChsZW4gPiAwKSB7XHJcbiAgICAgICAgbmFtZSA9IFN0clV0aWwuWnN0cmluZ01ha2UodmFsLlN0clZhbCwgPG51bWJlcj5sZW4pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2tzIGlmIHRoZSBvYmplY3QgaXMgaW5zdGFuY2Ugb2YgRXhwVmFsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvYmpcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIGlzRXhwVmFsKG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRXhwVmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pihwcml2YXRlKVxyXG4gIC8vLyBoYW5kbGUgY29udmVyc2lvbnMgYmV0d2VlbiBibG9iIGFuZCB1bmljb2RlL2FscGhhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4cGVjdGVkVHlwZVwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBCbG9iU3RyaW5nQ29udmVyc2lvbih2YWw6IEV4cFZhbCwgZXhwZWN0ZWRUeXBlOiBTdG9yYWdlQXR0cmlidXRlKTogdm9pZCB7XHJcbiAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLklzVHlwZUFscGhhT3JVbmljb2RlKGV4cGVjdGVkVHlwZSkpIHtcclxuICAgICAgaWYgKHZhbC5BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IpIHtcclxuICAgICAgICBsZXQgaW5jbHVkZUJsb2JQcmVmaXg6IGJvb2xlYW4gPSB2YWwuSW5jbHVkZUJsb2JQcmVmaXg7XHJcbiAgICAgICAgaWYgKGluY2x1ZGVCbG9iUHJlZml4KSB7XHJcbiAgICAgICAgICBsZXQgY29udGVudFR5cGU6IHN0cmluZyA9IEJsb2JUeXBlLmdldENvbnRlbnRUeXBlKHZhbC5TdHJWYWwpO1xyXG4gICAgICAgICAgdmFsLlN0clZhbCA9IEJsb2JUeXBlLmdldFN0cmluZyh2YWwuU3RyVmFsKTtcclxuICAgICAgICAgIHZhbC5JbmNsdWRlQmxvYlByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9PSBCbG9iVHlwZS5DT05URU5UX1RZUEVfQklOQVJZICYmIFJ0Zi5pc1J0Zih2YWwuU3RyVmFsKSkge1xyXG4gICAgICAgICAgICB2YWwuU3RyVmFsID0gU3RyVXRpbC5HZXRQbGFpblRleHRmcm9tUnRmKHZhbC5TdHJWYWwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB2YWwuQXR0ciA9IGV4cGVjdGVkVHlwZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodmFsLkF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgICAgIGxldCBpbmNsdWRlQmxvYlByZWZpeDI6IGJvb2xlYW4gPSB2YWwuSW5jbHVkZUJsb2JQcmVmaXg7XHJcbiAgICAgICAgICBpZiAoaW5jbHVkZUJsb2JQcmVmaXgyKSB7XHJcbiAgICAgICAgICAgIHZhbC5TdHJWYWwgPSBCbG9iVHlwZS5yZW1vdmVCbG9iUHJlZml4KHZhbC5TdHJWYWwpO1xyXG4gICAgICAgICAgICB2YWwuSW5jbHVkZUJsb2JQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhbC5BdHRyID0gZXhwZWN0ZWRUeXBlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB7XHJcbiAgICAgICAgaWYgKFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5Jc1R5cGVBbHBoYU9yVW5pY29kZSh2YWwuQXR0cikpIHtcclxuICAgICAgICAgIGxldCBjb250ZW50VHlwZTogc3RyaW5nID0gKHZhbC5BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBKSA/IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9BTlNJIDogQmxvYlR5cGUuQ09OVEVOVF9UWVBFX1VOSUNPREU7XHJcbiAgICAgICAgICB2YWwuU3RyVmFsID0gQmxvYlR5cGUuY3JlYXRlRnJvbVN0cmluZyh2YWwuU3RyVmFsLCBjb250ZW50VHlwZSk7XHJcbiAgICAgICAgICB2YWwuSW5jbHVkZUJsb2JQcmVmaXggPSB0cnVlO1xyXG4gICAgICAgICAgdmFsLkF0dHIgPSBleHBlY3RlZFR5cGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBldmFsX29wX3ppbWVyZWFkKHJlc1ZhbDogRXhwVmFsKTogdm9pZCB7XHJcbiAgICByZXNWYWwuQXR0ciA9IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE7XHJcbiAgICByZXNWYWwuU3RyVmFsID0gJyc7XHJcbiAgICBsZXQgdXRpbEltZUpwbjogVXRpbEltZUpwbiA9IE1hbmFnZXIuVXRpbEltZUpwbjtcclxuICAgIGlmICh1dGlsSW1lSnBuICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBzdHJJbWVSZWFkOiBzdHJpbmcgPSB1dGlsSW1lSnBuLlN0ckltZVJlYWQ7XHJcbiAgICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHV0aWxJbWVKcG4uU3RySW1lUmVhZCkpIHtcclxuICAgICAgICByZXNWYWwuU3RyVmFsID0gc3RySW1lUmVhZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBDb252ZXJ0RXhwVmFsKHZhbDogRXhwVmFsLCBleHBlY3RlZFR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUpOiB2b2lkIHtcclxuICAgIGlmIChTdG9yYWdlQXR0cmlidXRlQ2hlY2suU3RvcmFnZUZsZEFscGhhVW5pY29kZU9yQmxvYih2YWwuQXR0ciwgZXhwZWN0ZWRUeXBlKSkge1xyXG4gICAgICB0aGlzLkJsb2JTdHJpbmdDb252ZXJzaW9uKHZhbCwgZXhwZWN0ZWRUeXBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBUaGUgY2xhc3MgaG9sZHMgZGF0YSBvZiBhIGJhc2ljIGVsZW1lbnQgKGNvbnN0YW50IG9yIHZhcmlhYmxlKSB0aGF0XHJcbi8vLyAgIGFwcGVhcnMgb3IgYXJlIHJlc3VsdCBvZiBleGVjdXRpb24gb2Ygb3BlcmF0b3JcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIEV4cFZhbCB7XHJcbiAgQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTtcclxuICBJc051bGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBNZ051bVZhbDogTlVNX1RZUEUgPSBudWxsO1xyXG4gIFN0clZhbDogc3RyaW5nID0gbnVsbDtcclxuICBCb29sVmFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgSW5jbHVkZUJsb2JQcmVmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBPcmlnaW5hbE51bGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBWZWN0b3JGaWVsZDogR3VpRmllbGRCYXNlID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoKTtcclxuICBjb25zdHJ1Y3RvcihhdHRyOiBTdG9yYWdlQXR0cmlidXRlLCBpc051bGw6IGJvb2xlYW4sIG1nVmFsOiBzdHJpbmcpO1xyXG4gIGNvbnN0cnVjdG9yKGF0dHI/OiBTdG9yYWdlQXR0cmlidXRlLCBpc051bGw/OiBib29sZWFuLCBtZ1ZhbD86IHN0cmluZykge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29uc3RydWN0b3JfMShhdHRyLCBpc051bGwsIG1nVmFsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuQXR0ciA9IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShhdHRyOiBTdG9yYWdlQXR0cmlidXRlLCBpc051bGw6IGJvb2xlYW4sIG1nVmFsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuSW5pdChhdHRyLCBpc051bGwsIG1nVmFsKTtcclxuICB9XHJcblxyXG4gIENvcHkoc3JjOiBFeHBWYWwpOiB2b2lkIHtcclxuICAgIHRoaXMuQXR0ciA9IHNyYy5BdHRyO1xyXG4gICAgdGhpcy5Cb29sVmFsID0gc3JjLkJvb2xWYWw7XHJcbiAgICB0aGlzLkluY2x1ZGVCbG9iUHJlZml4ID0gc3JjLkluY2x1ZGVCbG9iUHJlZml4O1xyXG4gICAgdGhpcy5Jc051bGwgPSBzcmMuSXNOdWxsO1xyXG4gICAgdGhpcy5NZ051bVZhbCA9IHNyYy5NZ051bVZhbDtcclxuICAgIHRoaXMuU3RyVmFsID0gc3JjLlN0clZhbDtcclxuICAgIHRoaXMuVmVjdG9yRmllbGQgPSBzcmMuVmVjdG9yRmllbGQ7XHJcbiAgICB0aGlzLk9yaWdpbmFsTnVsbCA9IHNyYy5PcmlnaW5hbE51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIG51bGxpZnlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIE51bGxpZnkoKTogdm9pZCB7XHJcbiAgICB0aGlzLkluaXQoU3RvcmFnZUF0dHJpYnV0ZS5OT05FLCB0cnVlLCBudWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbml0aWFsaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBJbml0KGF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUsIGlzTnVsbDogYm9vbGVhbiwgbWdWYWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5BdHRyID0gYXR0cjtcclxuICAgIHRoaXMuSXNOdWxsID0gaXNOdWxsO1xyXG5cclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuQXR0cikge1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIHRoaXMuU3RyVmFsID0gbWdWYWw7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICAgIHRoaXMuU3RyVmFsID0gbWdWYWw7XHJcbiAgICAgICAgdGhpcy5JbmNsdWRlQmxvYlByZWZpeCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgIHRoaXMuTWdOdW1WYWwgPSAoKG1nVmFsICE9PSBudWxsKSA/IG5ldyBOVU1fVFlQRShtZ1ZhbCkgOiBudWxsKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgIHRoaXMuQm9vbFZhbCA9IChtZ1ZhbCAhPT0gbnVsbCAmJiBtZ1ZhbCA9PT0gJzEnKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OT05FOlxyXG4gICAgICAgIHRoaXMuQm9vbFZhbCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuU3RyVmFsID0gbnVsbDtcclxuICAgICAgICB0aGlzLk1nTnVtVmFsID0gbnVsbDtcclxuICAgICAgICB0aGlzLk9yaWdpbmFsTnVsbCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5WZWN0b3JGaWVsZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5JbmNsdWRlQmxvYlByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRPVE5FVDpcclxuICAgICAgICAvLyBGb3IgZG90bmV0IG9iamVjdHMsIEV4cFZhbCBzaG91bGQgYmUgY29uc3RydWN0ZWQgdXNpbmcgb3ZlcmxvYWRlZCBDb25zdHJ1Y3Rvci5cclxuICAgICAgICAvLyBJZiBpdCBpcyBhIGJsb2JQcmVmaXgsIGl0IHNob3VsZCBiZSBkb25lIGhlcmUuXHJcbiAgICAgICAgdGhpcy5TdHJWYWwgPSBtZ1ZhbDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdpbiBFeHBWYWwuRXhwVmFsKCkgaWxsZWdhbCBhdHRyaWJ1dGU6IFxcJycgKyB0aGlzLkF0dHIgKyAnXFwnJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0cyB0aGUgc3RyaW5nIGZvcm0gb2YgdGhlIHZhbHVlIGluIHRoZSBFeHBWYWwgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFRvTWdWYWwoKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgc3RyOiBzdHJpbmc7XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLkF0dHIpIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICBzdHIgPSB0aGlzLlN0clZhbDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgc3RyID0gdGhpcy5NZ051bVZhbC50b1hNTHJlY29yZCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgc3RyID0gdGhpcy5Cb29sVmFsXHJcbiAgICAgICAgICA/ICcxJ1xyXG4gICAgICAgICAgOiAnMCc7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHN0ciA9ICdbaWxsZWdhbCBhdHRyaWJ1dGU6ICcgKyB0aGlzLkF0dHIgKyAnXSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gZW1wdHkgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRW1wdHlTdHJpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCB0aGlzLkF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkgJiYgdGhpcy5TdHJWYWwgPT09ICcnO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { XMLConstants } from '@magic-xpa/utils';
|
|
2
|
-
import { MgControlBase } from './MgControlBase';
|
|
3
|
-
import { List, NString } from '@magic-xpa/mscorelib';
|
|
4
|
-
export class ControlTable {
|
|
5
|
-
_controls = null;
|
|
6
|
-
_mgForm = null;
|
|
7
|
-
constructor() {
|
|
8
|
-
this._controls = new List();
|
|
9
|
-
}
|
|
10
|
-
fillData(mgForm, parser) {
|
|
11
|
-
this._mgForm = mgForm;
|
|
12
|
-
while (this.initInnerObjects(parser.getNextTag(), parser)) {
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
initInnerObjects(foundTagName, parser) {
|
|
16
|
-
if (foundTagName === null)
|
|
17
|
-
return false;
|
|
18
|
-
if (foundTagName === XMLConstants.MG_TAG_CONTROL) {
|
|
19
|
-
let control = this._mgForm.ConstructMgControl();
|
|
20
|
-
control.fillData(this._mgForm, this._controls.length, parser);
|
|
21
|
-
this._controls.push(control);
|
|
22
|
-
}
|
|
23
|
-
else if (foundTagName === ("/" + XMLConstants.MG_TAG_CONTROL)) {
|
|
24
|
-
parser.setCurrIndex2EndOfTag();
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
else
|
|
28
|
-
return false;
|
|
29
|
-
return true;
|
|
30
|
-
}
|
|
31
|
-
getSize() {
|
|
32
|
-
return this._controls.length;
|
|
33
|
-
}
|
|
34
|
-
getCtrl(idxOrCtrlName) {
|
|
35
|
-
if (arguments.length === 1 && (idxOrCtrlName === null || typeof idxOrCtrlName === "undefined" || idxOrCtrlName.constructor === Number)) {
|
|
36
|
-
return this.getCtrl_0(idxOrCtrlName);
|
|
37
|
-
}
|
|
38
|
-
return this.getCtrl_1(idxOrCtrlName);
|
|
39
|
-
}
|
|
40
|
-
getCtrl_0(idx) {
|
|
41
|
-
if (idx < this.getSize())
|
|
42
|
-
return this._controls.get_Item(idx);
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
getCtrl_1(ctrlName) {
|
|
46
|
-
if (!NString.IsNullOrEmpty(ctrlName)) {
|
|
47
|
-
return this._controls.find(ctrl => {
|
|
48
|
-
return (NString.Equals(ctrlName, ctrl.getName(), true) ||
|
|
49
|
-
NString.Equals(ctrlName, ctrl.Name, true));
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
getCtrlByName(ctrlName, ctrlType) {
|
|
55
|
-
if (!NString.IsNullOrEmpty(ctrlName)) {
|
|
56
|
-
return this._controls.find(ctrl => {
|
|
57
|
-
return ((ctrl.Type === ctrlType) && NString.Equals(ctrlName, ctrl.getName(), true) ||
|
|
58
|
-
NString.Equals(ctrlName, ctrl.Name, true));
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
GetControlByIsn(isn) {
|
|
64
|
-
let ctrlByIsn = null;
|
|
65
|
-
ctrlByIsn = this._controls.find(ctrl => {
|
|
66
|
-
return (ctrl.ControlIsn === isn);
|
|
67
|
-
});
|
|
68
|
-
return ctrlByIsn;
|
|
69
|
-
}
|
|
70
|
-
GetControl(predicate) {
|
|
71
|
-
return this._controls.find(predicate);
|
|
72
|
-
}
|
|
73
|
-
filter(callackFuntion) {
|
|
74
|
-
return this._controls.filter(callackFuntion);
|
|
75
|
-
}
|
|
76
|
-
contains(ctrl) {
|
|
77
|
-
let contains = false;
|
|
78
|
-
if (ctrl !== null)
|
|
79
|
-
contains = this._controls.Contains(ctrl);
|
|
80
|
-
return contains;
|
|
81
|
-
}
|
|
82
|
-
addControl(ctrl) {
|
|
83
|
-
this._controls.push(ctrl);
|
|
84
|
-
}
|
|
85
|
-
setControlAt(ctrl, index) {
|
|
86
|
-
if (this._controls.length <= index)
|
|
87
|
-
this._controls.SetSize(index + 1);
|
|
88
|
-
this._controls.set_Item(index, ctrl);
|
|
89
|
-
}
|
|
90
|
-
deleteControlAt(index) {
|
|
91
|
-
this._controls.set_Item(index, null);
|
|
92
|
-
}
|
|
93
|
-
Remove(ctrlOrIdx) {
|
|
94
|
-
if (arguments.length === 1 && (ctrlOrIdx === null || ctrlOrIdx instanceof MgControlBase)) {
|
|
95
|
-
return this.Remove_0(ctrlOrIdx);
|
|
96
|
-
}
|
|
97
|
-
this.Remove_1(ctrlOrIdx);
|
|
98
|
-
}
|
|
99
|
-
Remove_0(ctrl) {
|
|
100
|
-
this._controls.Remove(ctrl);
|
|
101
|
-
return this._controls.Contains(ctrl);
|
|
102
|
-
}
|
|
103
|
-
Remove_1(idx) {
|
|
104
|
-
this._controls.RemoveAt(idx);
|
|
105
|
-
}
|
|
106
|
-
getControlIdx(inCtrl, includeSubs) {
|
|
107
|
-
let counter = 0;
|
|
108
|
-
for (let i = 0; i < this._controls.length; i++) {
|
|
109
|
-
let ctrl = this._controls.get_Item(i);
|
|
110
|
-
if (inCtrl === ctrl)
|
|
111
|
-
return counter;
|
|
112
|
-
else if (includeSubs || !ctrl.isSubform())
|
|
113
|
-
counter++;
|
|
114
|
-
}
|
|
115
|
-
return -1;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbFRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL3NyYy9tYW5hZ2VtZW50L2d1aS9Db250cm9sVGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixZQUFZLEVBQWEsTUFBTSxrQkFBa0IsQ0FBQztBQUUxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxNQUFNLE9BQU8sWUFBWTtJQUNmLFNBQVMsR0FBd0IsSUFBSSxDQUFDO0lBQ3RDLE9BQU8sR0FBZSxJQUFJLENBQUM7SUFHbkM7UUFDRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUdELFFBQVEsQ0FBQyxNQUFrQixFQUFFLE1BQWlCO1FBRTVDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTtTQUMxRDtJQUNILENBQUM7SUFLTyxnQkFBZ0IsQ0FBQyxZQUFvQixFQUFFLE1BQWlCO1FBQzlELElBQUksWUFBWSxLQUFLLElBQUk7WUFDdkIsT0FBTyxLQUFLLENBQUM7UUFFZixJQUFJLFlBQVksS0FBSyxZQUFZLENBQUMsY0FBYyxFQUFFO1lBQ2hELElBQUksT0FBTyxHQUFrQixJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDL0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlCO2FBQ0ksSUFBSSxZQUFZLEtBQUssQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQzNELE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDO1NBQ2hCOztZQUVDLE9BQU8sS0FBSyxDQUFDO1FBRWYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBSUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDL0IsQ0FBQztJQUlELE9BQU8sQ0FBQyxhQUFrQjtRQUN4QixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksSUFBSSxPQUFPLGFBQWEsS0FBSyxXQUFXLElBQUksYUFBYSxDQUFDLFdBQVcsS0FBSyxNQUFNLENBQUMsRUFBRTtZQUN0SSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDdEM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUtPLFNBQVMsQ0FBQyxHQUFXO1FBQzNCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDdEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV0QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFNTyxTQUFTLENBQUMsUUFBZ0I7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFFcEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDaEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUM7b0JBQ3BELE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMvQyxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBTUQsYUFBYSxDQUFDLFFBQWdCLEVBQUUsUUFBdUI7UUFDckQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDcEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDaEMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDO29CQUNoRixPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7WUFDOUMsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQU9ELGVBQWUsQ0FBQyxHQUFXO1FBQ3pCLElBQUksU0FBUyxHQUFrQixJQUFJLENBQUM7UUFDcEMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLEdBQUcsQ0FBQyxDQUFBO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQU9ELFVBQVUsQ0FBQyxTQUE0QztRQUNyRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxNQUFNLENBQUMsY0FBK0M7UUFDM0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUUvQyxDQUFDO0lBSUQsUUFBUSxDQUFDLElBQW1CO1FBQzFCLElBQUksUUFBUSxHQUFZLEtBQUssQ0FBQztRQUM5QixJQUFJLElBQUksS0FBSyxJQUFJO1lBQ2YsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFJRCxVQUFVLENBQUMsSUFBbUI7UUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUtELFlBQVksQ0FBQyxJQUFtQixFQUFFLEtBQWE7UUFDN0MsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxLQUFLO1lBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUlELGVBQWUsQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBSUQsTUFBTSxDQUFDLFNBQWM7UUFDbkIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxZQUFZLGFBQWEsQ0FBQyxFQUFFO1lBQ3hGLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNqQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUlPLFFBQVEsQ0FBQyxJQUFtQjtRQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFJTyxRQUFRLENBQUMsR0FBVztRQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBS0QsYUFBYSxDQUFDLE1BQXFCLEVBQUUsV0FBb0I7UUFDdkQsSUFBSSxPQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0RCxJQUFJLElBQUksR0FBa0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsSUFBSSxNQUFNLEtBQUssSUFBSTtnQkFDakIsT0FBTyxPQUFPLENBQUM7aUJBQ1osSUFBSSxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUN2QyxPQUFPLEVBQUUsQ0FBQztTQUNiO1FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7Q0FHRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1nQ29udHJvbFR5cGUsIFhNTENvbnN0YW50cywgWG1sUGFyc2VyIH0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7IE1nRm9ybUJhc2UgfSBmcm9tICcuL01nRm9ybUJhc2UnO1xyXG5pbXBvcnQgeyBNZ0NvbnRyb2xCYXNlIH0gZnJvbSAnLi9NZ0NvbnRyb2xCYXNlJztcclxuaW1wb3J0IHsgTGlzdCwgTlN0cmluZyB9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sVGFibGUge1xyXG4gIHByaXZhdGUgX2NvbnRyb2xzOiBMaXN0PE1nQ29udHJvbEJhc2U+ID0gbnVsbDtcclxuICBwcml2YXRlIF9tZ0Zvcm06IE1nRm9ybUJhc2UgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+Q1RPUjwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX2NvbnRyb2xzID0gbmV3IExpc3QoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5wYXJzZSBpbnB1dCBzdHJpbmcgYW5kIGZpbGwgaW5uZXIgZGF0YTwvc3VtbWFyeT5cclxuICBmaWxsRGF0YShtZ0Zvcm06IE1nRm9ybUJhc2UsIHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5fbWdGb3JtID0gbWdGb3JtO1xyXG4gICAgd2hpbGUgKHRoaXMuaW5pdElubmVyT2JqZWN0cyhwYXJzZXIuZ2V0TmV4dFRhZygpLCBwYXJzZXIpKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+VG8gYWxsb2NhdGUgYW5kIGZpbGwgaW5uZXIgb2JqZWN0cyBvZiB0aGUgY2xhc3M8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3VuZFRhZ05hbWVcIj5uYW1lIG9mIHRhZywgb2Ygb2JqZWN0LCB3aGljaCBuZWVkIGJlIGFsbG9jYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIGlmIGlubmVyIHRhZ3MgZmluaXNoZWQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBpbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZTogc3RyaW5nLCBwYXJzZXI6IFhtbFBhcnNlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY29udHJvbDogTWdDb250cm9sQmFzZSA9IHRoaXMuX21nRm9ybS5Db25zdHJ1Y3RNZ0NvbnRyb2woKTtcclxuICAgICAgY29udHJvbC5maWxsRGF0YSh0aGlzLl9tZ0Zvcm0sIHRoaXMuX2NvbnRyb2xzLmxlbmd0aCwgcGFyc2VyKTtcclxuICAgICAgdGhpcy5fY29udHJvbHMucHVzaChjb250cm9sKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gKFwiL1wiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKSkge1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgdGhlIHNpemUgb2YgdGhlIHRhYmxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHNpemUgb2YgdGhlIHRhYmxlPC9yZXR1cm5zPlxyXG4gIGdldFNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250cm9scy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXRDdHJsKGlkeDogbnVtYmVyKTogTWdDb250cm9sQmFzZTtcclxuICBnZXRDdHJsKGN0cmxOYW1lOiBzdHJpbmcpOiBNZ0NvbnRyb2xCYXNlO1xyXG4gIGdldEN0cmwoaWR4T3JDdHJsTmFtZTogYW55KTogTWdDb250cm9sQmFzZSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAoaWR4T3JDdHJsTmFtZSA9PT0gbnVsbCB8fCB0eXBlb2YgaWR4T3JDdHJsTmFtZSA9PT0gXCJ1bmRlZmluZWRcIiB8fCBpZHhPckN0cmxOYW1lLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEN0cmxfMChpZHhPckN0cmxOYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmdldEN0cmxfMShpZHhPckN0cmxOYW1lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgY29udHJvbCBieSBpdHMgaW5kZXg8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj5pcyB0aGUgaW5kZXggb2YgdGhlIGNvbnRyb2wgaW4gdGhlIHRhYmxlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSByZXF1ZXN0ZWQgY29udHJvbCBvYmplY3Q8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRDdHJsXzAoaWR4OiBudW1iZXIpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIGlmIChpZHggPCB0aGlzLmdldFNpemUoKSlcclxuICAgICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xzLmdldF9JdGVtKGlkeCk7XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBjb250cm9sIGJ5IGl0cyBuYW1lPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybE5hbWVcIj5pcyB0aGUgcmVxdWVzdGVkIGNvbnRyb2xzIG5hbWU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHJlcXVlc3RlZCBjb250cm9sIG9iamVjdDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEN0cmxfMShjdHJsTmFtZTogc3RyaW5nKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShjdHJsTmFtZSkpIHtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLl9jb250cm9scy5maW5kKGN0cmwgPT4ge1xyXG4gICAgICAgIHJldHVybiAoTlN0cmluZy5FcXVhbHMoY3RybE5hbWUsIGN0cmwuZ2V0TmFtZSgpLCB0cnVlKSB8fFxyXG4gICAgICAgICAgTlN0cmluZy5FcXVhbHMoY3RybE5hbWUsIGN0cmwuTmFtZSwgdHJ1ZSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgY29udHJvbCAod2hpY2ggaXMgbm90IHRoZSBmcmFtZSBmb3JtKSBieSBpdHMgbmFtZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxOYW1lXCI+aXMgdGhlIHJlcXVlc3RlZCBjb250cm9scyBuYW1lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsVHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcmVxdWVzdGVkIGNvbnRyb2wgb2JqZWN0PC9yZXR1cm5zPlxyXG4gIGdldEN0cmxCeU5hbWUoY3RybE5hbWU6IHN0cmluZywgY3RybFR5cGU6IE1nQ29udHJvbFR5cGUpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KGN0cmxOYW1lKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fY29udHJvbHMuZmluZChjdHJsID0+IHtcclxuICAgICAgICByZXR1cm4gKChjdHJsLlR5cGUgPT09IGN0cmxUeXBlKSAmJiBOU3RyaW5nLkVxdWFscyhjdHJsTmFtZSwgY3RybC5nZXROYW1lKCksIHRydWUpIHx8XHJcbiAgICAgICAgICBOU3RyaW5nLkVxdWFscyhjdHJsTmFtZSwgY3RybC5OYW1lLCB0cnVlKSlcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IGEgY29udHJvbCBieSBpdHMgSVNOXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc25cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0Q29udHJvbEJ5SXNuKGlzbjogbnVtYmVyKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICBsZXQgY3RybEJ5SXNuOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuICAgIGN0cmxCeUlzbiA9IHRoaXMuX2NvbnRyb2xzLmZpbmQoY3RybCA9PiB7XHJcbiAgICAgIHJldHVybiAoY3RybC5Db250cm9sSXNuID09PSBpc24pXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gY3RybEJ5SXNuO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgYSBjb250cm9sIG1hdGhjaGluZyB0aGUgcHJlZGljYXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcmVkaWNhdGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0Q29udHJvbChwcmVkaWNhdGU6ICh2YWx1ZTogTWdDb250cm9sQmFzZSkgPT4gYm9vbGVhbik6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xzLmZpbmQocHJlZGljYXRlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXIoY2FsbGFja0Z1bnRpb246IChpdGVtLCBpbmRleCwgYXJyYXkpID0+IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xzLmZpbHRlcihjYWxsYWNrRnVudGlvbik7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnJldHVybnMgdHJ1ZSBpZiB0aGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBnaXZlbiBjb250cm9sPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPnRoZSBjb250cm9sIHRvIGxvb2sgZm9yPC9wYXJhbT5cclxuICBjb250YWlucyhjdHJsOiBNZ0NvbnRyb2xCYXNlKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgY29udGFpbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChjdHJsICE9PSBudWxsKVxyXG4gICAgICBjb250YWlucyA9IHRoaXMuX2NvbnRyb2xzLkNvbnRhaW5zKGN0cmwpO1xyXG4gICAgcmV0dXJuIGNvbnRhaW5zO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmFkZCBhIGNvbnRyb2wgdG8gdGhlIHRhYmxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmlzIHRoZSBjb250cm9sIHRvIGJlIGFkZGVkPC9wYXJhbT5cclxuICBhZGRDb250cm9sKGN0cmw6IE1nQ29udHJvbEJhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbnRyb2xzLnB1c2goY3RybCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+c2V0IGEgY29udHJvbCB0byBhIGNlbGwgaW4gdGhlIHRhYmxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmlzIHRoZSBjb250cm9sIHRvIGJlIGFkZGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImluZGV4XCI+d2hlcmUgdG8gc2V0IHRoZSBjb250cm9sPC9wYXJhbT5cclxuICBzZXRDb250cm9sQXQoY3RybDogTWdDb250cm9sQmFzZSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2NvbnRyb2xzLmxlbmd0aCA8PSBpbmRleClcclxuICAgICAgdGhpcy5fY29udHJvbHMuU2V0U2l6ZShpbmRleCArIDEpO1xyXG4gICAgdGhpcy5fY29udHJvbHMuc2V0X0l0ZW0oaW5kZXgsIGN0cmwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnJlcGxhY2UgYSBjb250cm9sIGluIHRoZSBjb250cm9sIHRhYmxlIHdpdGggbnVsbDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImluZGV4XCI+b2YgY29udHJvbCB0byBiZSBkZWxldGVkPC9wYXJhbT5cclxuICBkZWxldGVDb250cm9sQXQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fY29udHJvbHMuc2V0X0l0ZW0oaW5kZXgsIG51bGwpO1xyXG4gIH1cclxuXHJcbiAgUmVtb3ZlKGN0cmw6IE1nQ29udHJvbEJhc2UpOiBib29sZWFuO1xyXG4gIFJlbW92ZShpZHg6IG51bWJlcik7XHJcbiAgUmVtb3ZlKGN0cmxPcklkeDogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAoY3RybE9ySWR4ID09PSBudWxsIHx8IGN0cmxPcklkeCBpbnN0YW5jZW9mIE1nQ29udHJvbEJhc2UpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLlJlbW92ZV8wKGN0cmxPcklkeCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLlJlbW92ZV8xKGN0cmxPcklkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+cmVtb3ZlcyBhIGNvbnRyb2wgZnJvbSB0aGUgdGFibGUgYW5kIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPnRoZSBjb250cm9sIHRvIHJlbW92ZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBSZW1vdmVfMChjdHJsOiBNZ0NvbnRyb2xCYXNlKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLl9jb250cm9scy5SZW1vdmUoY3RybCk7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbHMuQ29udGFpbnMoY3RybCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+cmVtb3ZlcyBhIGNvbnRyb2wgZnJvbSB0aGUgdGFibGUgYnkgaW5kZXguPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+dGhlIGlkeCBvZiB0aGUgY29udHJvbCB0byBiZSByZW1vdmVkPC9wYXJhbT5cclxuICBwcml2YXRlIFJlbW92ZV8xKGlkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb250cm9scy5SZW1vdmVBdChpZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbkN0cmxcIj50aGUgY29udHJvbCB3aG9zZSBpbmRleCB3ZSBuZWVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbmNsdWRlU3Vic1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBpZHggb2YgYSBjb250cm9sIGluIHRoZSB0YWJsZSwgZXhjbHVkaW5nIHN1YmZvcm1zIGNvbnRyb2w8L3JldHVybnM+XHJcbiAgZ2V0Q29udHJvbElkeChpbkN0cmw6IE1nQ29udHJvbEJhc2UsIGluY2x1ZGVTdWJzOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBjb3VudGVyOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX2NvbnRyb2xzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5fY29udHJvbHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIGlmIChpbkN0cmwgPT09IGN0cmwpXHJcbiAgICAgICAgcmV0dXJuIGNvdW50ZXI7XHJcbiAgICAgIGVsc2UgaWYgKGluY2x1ZGVTdWJzIHx8ICFjdHJsLmlzU3ViZm9ybSgpKVxyXG4gICAgICAgIGNvdW50ZXIrKztcclxuICAgIH1cclxuICAgIHJldHVybiAtMTtcclxuICB9XHJcblxyXG5cclxufVxyXG4iXX0=
|