@magic-xpa/gui 4.1200.0-dev4120.21 → 4.1200.0-dev4120.212
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,1185 +0,0 @@
|
|
|
1
|
-
import { MsgInterface, PICInterface, StorageAttribute, UtilImeJpn, UtilStrByteMode } from '@magic-xpa/utils';
|
|
2
|
-
import { Events } from '../../Events';
|
|
3
|
-
import { ApplicationException, Int32, NString, StringBuilder } from '@magic-xpa/mscorelib';
|
|
4
|
-
import { GuiEnvironment } from '../../GuiEnvironment';
|
|
5
|
-
export class PIC {
|
|
6
|
-
_mskLen = 0;
|
|
7
|
-
_negPref = new StringBuilder();
|
|
8
|
-
_negSuff = new StringBuilder();
|
|
9
|
-
_picAttr = StorageAttribute.NONE;
|
|
10
|
-
_posPref = new StringBuilder();
|
|
11
|
-
_posSuff = new StringBuilder();
|
|
12
|
-
_autoSkip_ = false;
|
|
13
|
-
_padFill = false;
|
|
14
|
-
_zeroFill = false;
|
|
15
|
-
_comma = false;
|
|
16
|
-
_decimalDigits = 0;
|
|
17
|
-
_decPointIsFirst = false;
|
|
18
|
-
_decimal = false;
|
|
19
|
-
_embeded = false;
|
|
20
|
-
_formatIdx = 0;
|
|
21
|
-
_format = null;
|
|
22
|
-
hebrew = false;
|
|
23
|
-
_imeMode = -1;
|
|
24
|
-
_left = false;
|
|
25
|
-
_maskLength = 0;
|
|
26
|
-
_maskChars = 0;
|
|
27
|
-
_maskSize = 0;
|
|
28
|
-
_mixed = false;
|
|
29
|
-
_formatExp = false;
|
|
30
|
-
_msk = null;
|
|
31
|
-
_needLength = false;
|
|
32
|
-
_negative = false;
|
|
33
|
-
_pad = '\0';
|
|
34
|
-
_prefLen = 0;
|
|
35
|
-
_size = 0;
|
|
36
|
-
_suffLen = 0;
|
|
37
|
-
_termFlag = false;
|
|
38
|
-
_trim = false;
|
|
39
|
-
_whole = 0;
|
|
40
|
-
_zero = '\0';
|
|
41
|
-
constructor(picStr, attr, compIdx) {
|
|
42
|
-
this._picAttr = attr;
|
|
43
|
-
if (this._picAttr === StorageAttribute.BLOB ||
|
|
44
|
-
this._picAttr === StorageAttribute.BLOB_VECTOR) {
|
|
45
|
-
if (picStr.trim().length > 0) {
|
|
46
|
-
Events.WriteDevToLog("PIC.PIC the picture of BLOB must be empty string");
|
|
47
|
-
}
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
this._format = NString.ToCharArray(picStr);
|
|
51
|
-
this._formatIdx = 0;
|
|
52
|
-
this._mskLen = this.getMaskLen(compIdx);
|
|
53
|
-
this.prs_all(compIdx);
|
|
54
|
-
}
|
|
55
|
-
isHebrew() {
|
|
56
|
-
return this.hebrew;
|
|
57
|
-
}
|
|
58
|
-
isMixed() {
|
|
59
|
-
return this._mixed;
|
|
60
|
-
}
|
|
61
|
-
embededChars() {
|
|
62
|
-
return this._embeded;
|
|
63
|
-
}
|
|
64
|
-
isNegative() {
|
|
65
|
-
return this._negative;
|
|
66
|
-
}
|
|
67
|
-
withComa() {
|
|
68
|
-
return this._comma;
|
|
69
|
-
}
|
|
70
|
-
isLeft() {
|
|
71
|
-
return this._left;
|
|
72
|
-
}
|
|
73
|
-
padFill() {
|
|
74
|
-
return this._padFill;
|
|
75
|
-
}
|
|
76
|
-
getPad() {
|
|
77
|
-
return this._pad;
|
|
78
|
-
}
|
|
79
|
-
zeroFill() {
|
|
80
|
-
return this._zeroFill;
|
|
81
|
-
}
|
|
82
|
-
getZeroPad() {
|
|
83
|
-
return this._zero;
|
|
84
|
-
}
|
|
85
|
-
isTrimed() {
|
|
86
|
-
return this._trim;
|
|
87
|
-
}
|
|
88
|
-
autoSkip() {
|
|
89
|
-
return this._autoSkip_;
|
|
90
|
-
}
|
|
91
|
-
withDecimal() {
|
|
92
|
-
return this._decimal;
|
|
93
|
-
}
|
|
94
|
-
withTerm() {
|
|
95
|
-
return this._termFlag;
|
|
96
|
-
}
|
|
97
|
-
getMaskChars() {
|
|
98
|
-
return this._maskChars;
|
|
99
|
-
}
|
|
100
|
-
getWholes() {
|
|
101
|
-
return this._whole;
|
|
102
|
-
}
|
|
103
|
-
getDec() {
|
|
104
|
-
return this._decimalDigits;
|
|
105
|
-
}
|
|
106
|
-
getSize() {
|
|
107
|
-
return this._size;
|
|
108
|
-
}
|
|
109
|
-
getMaskSize() {
|
|
110
|
-
return this._maskSize;
|
|
111
|
-
}
|
|
112
|
-
getMaskLength() {
|
|
113
|
-
return this._maskLength;
|
|
114
|
-
}
|
|
115
|
-
decInFirstPos() {
|
|
116
|
-
return this._decPointIsFirst;
|
|
117
|
-
}
|
|
118
|
-
setFormatExp(val) {
|
|
119
|
-
this._formatExp = val;
|
|
120
|
-
}
|
|
121
|
-
isFormatExp() {
|
|
122
|
-
return this._formatExp;
|
|
123
|
-
}
|
|
124
|
-
getPosPref_() {
|
|
125
|
-
return this._posPref.ToString();
|
|
126
|
-
}
|
|
127
|
-
getPosSuff_() {
|
|
128
|
-
return this._posSuff.ToString();
|
|
129
|
-
}
|
|
130
|
-
getNegPref_() {
|
|
131
|
-
return this._negPref.ToString();
|
|
132
|
-
}
|
|
133
|
-
getNegSuff_() {
|
|
134
|
-
return this._negSuff.ToString();
|
|
135
|
-
}
|
|
136
|
-
getMask() {
|
|
137
|
-
return NString.FromChars(this._msk);
|
|
138
|
-
}
|
|
139
|
-
getFormat() {
|
|
140
|
-
return NString.FromChars(this._format);
|
|
141
|
-
}
|
|
142
|
-
getAttr() {
|
|
143
|
-
return this._picAttr;
|
|
144
|
-
}
|
|
145
|
-
setAttr(set) {
|
|
146
|
-
this._picAttr == set;
|
|
147
|
-
}
|
|
148
|
-
getImeMode() {
|
|
149
|
-
return this._imeMode;
|
|
150
|
-
}
|
|
151
|
-
prs_all(compIdx) {
|
|
152
|
-
if (!this._needLength) {
|
|
153
|
-
this._msk = new Array(this._mskLen);
|
|
154
|
-
for (let _ai = 0; _ai < this._msk.length; ++_ai)
|
|
155
|
-
this._msk[_ai] = '\0';
|
|
156
|
-
}
|
|
157
|
-
switch (this._picAttr) {
|
|
158
|
-
case StorageAttribute.ALPHA:
|
|
159
|
-
case StorageAttribute.UNICODE:
|
|
160
|
-
this.alpha_prs();
|
|
161
|
-
break;
|
|
162
|
-
case StorageAttribute.NUMERIC:
|
|
163
|
-
this.num_prs();
|
|
164
|
-
break;
|
|
165
|
-
case StorageAttribute.DATE:
|
|
166
|
-
this.date_prs(compIdx);
|
|
167
|
-
break;
|
|
168
|
-
case StorageAttribute.TIME:
|
|
169
|
-
this.time_prs();
|
|
170
|
-
break;
|
|
171
|
-
case StorageAttribute.BOOLEAN:
|
|
172
|
-
this.bool_prs();
|
|
173
|
-
break;
|
|
174
|
-
case StorageAttribute.BLOB:
|
|
175
|
-
case StorageAttribute.BLOB_VECTOR:
|
|
176
|
-
break;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
alpha_prs() {
|
|
180
|
-
let currChr;
|
|
181
|
-
let drv;
|
|
182
|
-
let count;
|
|
183
|
-
while (this._formatIdx < this._format.length) {
|
|
184
|
-
currChr = this._format[this._formatIdx];
|
|
185
|
-
switch (currChr) {
|
|
186
|
-
case 'H':
|
|
187
|
-
this._formatIdx++;
|
|
188
|
-
this.setHebrew();
|
|
189
|
-
break;
|
|
190
|
-
case 'A':
|
|
191
|
-
this._autoSkip_ = true;
|
|
192
|
-
this._formatIdx++;
|
|
193
|
-
break;
|
|
194
|
-
case '#':
|
|
195
|
-
case 'L':
|
|
196
|
-
case 'U':
|
|
197
|
-
case 'X':
|
|
198
|
-
drv = 0;
|
|
199
|
-
switch (currChr) {
|
|
200
|
-
case '#':
|
|
201
|
-
drv = PICInterface.PIC_N;
|
|
202
|
-
break;
|
|
203
|
-
case 'L':
|
|
204
|
-
drv = PICInterface.PIC_L;
|
|
205
|
-
break;
|
|
206
|
-
case 'U':
|
|
207
|
-
drv = PICInterface.PIC_U;
|
|
208
|
-
break;
|
|
209
|
-
case 'X':
|
|
210
|
-
drv = PICInterface.PIC_X;
|
|
211
|
-
break;
|
|
212
|
-
}
|
|
213
|
-
this._formatIdx++;
|
|
214
|
-
count = this.pik_count();
|
|
215
|
-
this.pik_drv_fill(drv, count);
|
|
216
|
-
break;
|
|
217
|
-
default:
|
|
218
|
-
if (UtilStrByteMode.isLocaleDefLangDBCS()) {
|
|
219
|
-
let useImeJpn = UtilStrByteMode.isLocaleDefLangJPN();
|
|
220
|
-
if (currChr === 'K' && useImeJpn) {
|
|
221
|
-
if (this.pic_kanji())
|
|
222
|
-
break;
|
|
223
|
-
}
|
|
224
|
-
if (GuiEnvironment.Environment.GetLocalAs400Set()) {
|
|
225
|
-
drv = 0;
|
|
226
|
-
if (currChr === 'J')
|
|
227
|
-
drv = PICInterface.PIC_J;
|
|
228
|
-
else if (currChr === 'T')
|
|
229
|
-
drv = PICInterface.PIC_T;
|
|
230
|
-
else if (currChr === 'G')
|
|
231
|
-
drv = PICInterface.PIC_G;
|
|
232
|
-
else if (currChr === 'S')
|
|
233
|
-
drv = PICInterface.PIC_S;
|
|
234
|
-
if (drv !== 0) {
|
|
235
|
-
if (this._imeMode === -1 && useImeJpn) {
|
|
236
|
-
if (drv === PICInterface.PIC_J || drv === PICInterface.PIC_G)
|
|
237
|
-
this._imeMode = UtilImeJpn.IME_ZEN_HIRAGANA_ROMAN;
|
|
238
|
-
else if (drv === PICInterface.PIC_S)
|
|
239
|
-
this._imeMode = UtilImeJpn.IME_FORCE_OFF;
|
|
240
|
-
}
|
|
241
|
-
this._formatIdx++;
|
|
242
|
-
count = this.pik_count();
|
|
243
|
-
this.pik_drv_fill(drv, count);
|
|
244
|
-
break;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
if (UtilStrByteMode.isDigit(currChr)) {
|
|
249
|
-
count = this.pik_count();
|
|
250
|
-
this.pik_drv_fill(PICInterface.PIC_X, count);
|
|
251
|
-
}
|
|
252
|
-
else
|
|
253
|
-
this.pik_mask();
|
|
254
|
-
break;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
if (this._maskSize === 0)
|
|
258
|
-
this.pik_drv_fill(PICInterface.PIC_X, this._mskLen);
|
|
259
|
-
this._size = this._maskSize;
|
|
260
|
-
if (!this._embeded)
|
|
261
|
-
this._size -= this._maskChars;
|
|
262
|
-
}
|
|
263
|
-
num_prs() {
|
|
264
|
-
let i;
|
|
265
|
-
let j;
|
|
266
|
-
let currChr;
|
|
267
|
-
let count;
|
|
268
|
-
let tmp;
|
|
269
|
-
let tmps;
|
|
270
|
-
let tmp_c = 0;
|
|
271
|
-
let first = true;
|
|
272
|
-
this._zero = ' ';
|
|
273
|
-
this._pad = ' ';
|
|
274
|
-
this._negPref.Append('-');
|
|
275
|
-
for (i = 0; i < this._format.length; i = i + 1) {
|
|
276
|
-
if (this._format[i] === '+' || this._format[i] === '-') {
|
|
277
|
-
break;
|
|
278
|
-
}
|
|
279
|
-
if (this._format[i] === '\\' || this._format[i] === 'P') {
|
|
280
|
-
i = i + 1;
|
|
281
|
-
}
|
|
282
|
-
if (this._format[i] === 'C') {
|
|
283
|
-
this._comma = true;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
while (this._formatIdx < this._format.length) {
|
|
287
|
-
currChr = this._format[this._formatIdx];
|
|
288
|
-
switch (currChr) {
|
|
289
|
-
case 'N':
|
|
290
|
-
this._formatIdx++;
|
|
291
|
-
this._negative = true;
|
|
292
|
-
break;
|
|
293
|
-
case 'C':
|
|
294
|
-
this._formatIdx++;
|
|
295
|
-
this._comma = true;
|
|
296
|
-
break;
|
|
297
|
-
case 'L':
|
|
298
|
-
this._formatIdx++;
|
|
299
|
-
this._left = true;
|
|
300
|
-
break;
|
|
301
|
-
case 'P':
|
|
302
|
-
this._formatIdx++;
|
|
303
|
-
this._padFill = true;
|
|
304
|
-
if (this._formatIdx < this._format.length)
|
|
305
|
-
this._pad = this._format[this._formatIdx++];
|
|
306
|
-
break;
|
|
307
|
-
case 'Z':
|
|
308
|
-
this._formatIdx++;
|
|
309
|
-
this._zeroFill = true;
|
|
310
|
-
if (this._formatIdx < this._format.length)
|
|
311
|
-
this._zero = this._format[this._formatIdx++];
|
|
312
|
-
break;
|
|
313
|
-
case 'A':
|
|
314
|
-
this._formatIdx++;
|
|
315
|
-
this._autoSkip_ = true;
|
|
316
|
-
break;
|
|
317
|
-
case '.':
|
|
318
|
-
this._formatIdx++;
|
|
319
|
-
if (this._needLength)
|
|
320
|
-
this._maskLength++;
|
|
321
|
-
this._decimal = true;
|
|
322
|
-
if (this._maskSize < this._mskLen)
|
|
323
|
-
this._msk[this._maskSize] = String.fromCharCode(PICInterface.PIC_N);
|
|
324
|
-
if (this._maskSize === 0)
|
|
325
|
-
this._decPointIsFirst = true;
|
|
326
|
-
this._maskSize++;
|
|
327
|
-
break;
|
|
328
|
-
case '+':
|
|
329
|
-
case '-':
|
|
330
|
-
this.pik_sign();
|
|
331
|
-
break;
|
|
332
|
-
default:
|
|
333
|
-
if (UtilStrByteMode.isDigit(currChr) || currChr === '#') {
|
|
334
|
-
tmp = this._formatIdx;
|
|
335
|
-
if (currChr === '#')
|
|
336
|
-
this._formatIdx++;
|
|
337
|
-
count = this.pik_count();
|
|
338
|
-
this.pik_drv_fill(PICInterface.PIC_N, count);
|
|
339
|
-
if (this._format[tmp] === '#') {
|
|
340
|
-
if (count === 1) {
|
|
341
|
-
tmps = this._formatIdx;
|
|
342
|
-
this._formatIdx = tmp;
|
|
343
|
-
tmp_c = this.pik_dup();
|
|
344
|
-
this._formatIdx = tmps;
|
|
345
|
-
}
|
|
346
|
-
if (first && (tmp_c > 0 || count > 1)) {
|
|
347
|
-
if (count > 1)
|
|
348
|
-
tmp_c = count;
|
|
349
|
-
if (this._comma && !this._decimal)
|
|
350
|
-
this.pik_drv_fill(PICInterface.PIC_N, Math.floor((tmp_c - 1) / 3));
|
|
351
|
-
first = false;
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
else if (this._comma && !this._decimal)
|
|
355
|
-
this.pik_drv_fill(PICInterface.PIC_N, Math.floor((count - 1) / 3));
|
|
356
|
-
if (this._decimal)
|
|
357
|
-
this._decimalDigits += count;
|
|
358
|
-
else
|
|
359
|
-
this._whole += count;
|
|
360
|
-
}
|
|
361
|
-
else
|
|
362
|
-
this.pik_mask();
|
|
363
|
-
break;
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
this._prefLen = this._posPref.Length;
|
|
367
|
-
this._suffLen = this._posSuff.Length;
|
|
368
|
-
if (this._negative) {
|
|
369
|
-
if (this._negPref.Length > this._prefLen) {
|
|
370
|
-
this._prefLen = this._negPref.Length;
|
|
371
|
-
}
|
|
372
|
-
if (this._negSuff.Length > this._suffLen) {
|
|
373
|
-
this._suffLen = this._negSuff.Length;
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
if (this._whole === 0 && this._decimalDigits === 0) {
|
|
377
|
-
count = PICInterface.PIC_MAX_MSK_LEN - this._prefLen - this._suffLen;
|
|
378
|
-
if (this._maskSize < count) {
|
|
379
|
-
this._whole = count - this._maskSize;
|
|
380
|
-
if (this._comma)
|
|
381
|
-
this._whole -= Math.floor(this._whole / 4);
|
|
382
|
-
this.pik_drv_fill(PICInterface.PIC_N, this._whole);
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
if (this._comma) {
|
|
386
|
-
count = Math.floor((this._whole - 1) / 3);
|
|
387
|
-
this.pik_drv_fill(PICInterface.PIC_N, count);
|
|
388
|
-
this._maskSize -= count;
|
|
389
|
-
}
|
|
390
|
-
i = this._prefLen;
|
|
391
|
-
if (i > 0 && this._msk != null) {
|
|
392
|
-
if ((this._maskSize + i) <= this._mskLen) {
|
|
393
|
-
for (j = this._maskSize - 1; j >= 0; j--)
|
|
394
|
-
this._msk[j + i] = this._msk[j];
|
|
395
|
-
for (j = 0; j < i; j++)
|
|
396
|
-
if (this._msk != null && j < this._msk.length)
|
|
397
|
-
this._msk[j] = String.fromCharCode(PICInterface.PIC_N);
|
|
398
|
-
}
|
|
399
|
-
this._maskSize += i;
|
|
400
|
-
}
|
|
401
|
-
i = this._suffLen;
|
|
402
|
-
if (i > 0 && this._msk != null) {
|
|
403
|
-
if (this._maskSize + this._suffLen <= this._mskLen)
|
|
404
|
-
for (j = 0; j < this._suffLen; j++)
|
|
405
|
-
this._msk[this._maskSize + j] = String.fromCharCode(PICInterface.PIC_N);
|
|
406
|
-
this._maskSize += i;
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
getUnformattedNumericPic() {
|
|
410
|
-
let picStr = '';
|
|
411
|
-
if (this.isNegative())
|
|
412
|
-
picStr = this.isNegative() ? 'N' : '';
|
|
413
|
-
picStr += this.getWholes().toString();
|
|
414
|
-
if (this.getDec() > 0)
|
|
415
|
-
picStr += '.' + this.getDec().toString();
|
|
416
|
-
if (this._zeroFill)
|
|
417
|
-
picStr += 'Z';
|
|
418
|
-
let newPic = new PIC(picStr, StorageAttribute.NUMERIC, 0);
|
|
419
|
-
return newPic;
|
|
420
|
-
}
|
|
421
|
-
date_prs(compIdx) {
|
|
422
|
-
let i;
|
|
423
|
-
let ocr;
|
|
424
|
-
let count;
|
|
425
|
-
let drv = 0;
|
|
426
|
-
let SwitchAndExpandDate = false;
|
|
427
|
-
let SWExpandDateChecked = false;
|
|
428
|
-
let currChr;
|
|
429
|
-
let isJpnEraYear = false;
|
|
430
|
-
this._zero = ' ';
|
|
431
|
-
ocr = 0;
|
|
432
|
-
if (this._format.length === 0 || this._format[0] === '\0')
|
|
433
|
-
this._format = NString.ToCharArray(PIC.getDefaultDateMask(GuiEnvironment.Environment.GetDateMode(compIdx)));
|
|
434
|
-
for (let j = 0; j < this._format.length; j++)
|
|
435
|
-
if (this._format[j] === 'H')
|
|
436
|
-
this.setHebrew();
|
|
437
|
-
while (this._formatIdx < this._format.length) {
|
|
438
|
-
currChr = this._format[this._formatIdx];
|
|
439
|
-
switch (currChr) {
|
|
440
|
-
case 'H':
|
|
441
|
-
this._formatIdx++;
|
|
442
|
-
break;
|
|
443
|
-
case 'Z':
|
|
444
|
-
this._formatIdx++;
|
|
445
|
-
this._zeroFill = true;
|
|
446
|
-
if (this._formatIdx < this._format.length)
|
|
447
|
-
this._zero = this._format[this._formatIdx++];
|
|
448
|
-
break;
|
|
449
|
-
case 'T':
|
|
450
|
-
this._formatIdx++;
|
|
451
|
-
this._trim = true;
|
|
452
|
-
break;
|
|
453
|
-
case 'A':
|
|
454
|
-
this._formatIdx++;
|
|
455
|
-
this._autoSkip_ = true;
|
|
456
|
-
break;
|
|
457
|
-
case 'L':
|
|
458
|
-
if (this.hebrew) {
|
|
459
|
-
this._formatIdx++;
|
|
460
|
-
this.pik_drv_fill(PICInterface.PIC_HL, 1);
|
|
461
|
-
}
|
|
462
|
-
else
|
|
463
|
-
this.pik_mask();
|
|
464
|
-
break;
|
|
465
|
-
case 'Y':
|
|
466
|
-
count = this.pik_dup();
|
|
467
|
-
drv = 0;
|
|
468
|
-
i = count;
|
|
469
|
-
switch (count) {
|
|
470
|
-
case 1:
|
|
471
|
-
break;
|
|
472
|
-
case 2:
|
|
473
|
-
if (!this.hebrew)
|
|
474
|
-
drv = PICInterface.PIC_YY;
|
|
475
|
-
break;
|
|
476
|
-
case 4:
|
|
477
|
-
if (!this.hebrew)
|
|
478
|
-
drv = PICInterface.PIC_YYYY;
|
|
479
|
-
else
|
|
480
|
-
drv = PICInterface.PIC_HYYYYY;
|
|
481
|
-
break;
|
|
482
|
-
case 5:
|
|
483
|
-
case 6:
|
|
484
|
-
if (this.hebrew)
|
|
485
|
-
drv = PICInterface.PIC_HYYYYY;
|
|
486
|
-
break;
|
|
487
|
-
}
|
|
488
|
-
if (drv !== 0) {
|
|
489
|
-
this._formatIdx += count;
|
|
490
|
-
this.pik_drv_fill(drv, i);
|
|
491
|
-
}
|
|
492
|
-
else
|
|
493
|
-
this.pik_mask();
|
|
494
|
-
break;
|
|
495
|
-
case 'M':
|
|
496
|
-
count = this.pik_dup();
|
|
497
|
-
drv = 0;
|
|
498
|
-
if (count === 2)
|
|
499
|
-
drv = PICInterface.PIC_MMD;
|
|
500
|
-
else if (count > 2) {
|
|
501
|
-
drv = PICInterface.PIC_MMM;
|
|
502
|
-
if (count > 10)
|
|
503
|
-
drv = 0;
|
|
504
|
-
}
|
|
505
|
-
if (drv !== 0) {
|
|
506
|
-
this._formatIdx += count;
|
|
507
|
-
this.pik_drv_fill(drv, count);
|
|
508
|
-
}
|
|
509
|
-
else
|
|
510
|
-
this.pik_mask();
|
|
511
|
-
break;
|
|
512
|
-
case 'D':
|
|
513
|
-
count = this.pik_dup();
|
|
514
|
-
drv = 0;
|
|
515
|
-
switch (count) {
|
|
516
|
-
case 2:
|
|
517
|
-
if (!this.hebrew) {
|
|
518
|
-
drv = PICInterface.PIC_DD;
|
|
519
|
-
break;
|
|
520
|
-
}
|
|
521
|
-
case 3:
|
|
522
|
-
if (!this.hebrew)
|
|
523
|
-
drv = PICInterface.PIC_DDD;
|
|
524
|
-
else
|
|
525
|
-
drv = PICInterface.PIC_HDD;
|
|
526
|
-
break;
|
|
527
|
-
case 4:
|
|
528
|
-
if (!this.hebrew)
|
|
529
|
-
drv = PICInterface.PIC_DDDD;
|
|
530
|
-
else
|
|
531
|
-
this.pik_mask();
|
|
532
|
-
break;
|
|
533
|
-
default:
|
|
534
|
-
this.pik_mask();
|
|
535
|
-
break;
|
|
536
|
-
}
|
|
537
|
-
if (drv !== 0) {
|
|
538
|
-
this.pik_drv_fill(drv, count);
|
|
539
|
-
this._formatIdx += count;
|
|
540
|
-
}
|
|
541
|
-
break;
|
|
542
|
-
case '#':
|
|
543
|
-
count = this.pik_dup();
|
|
544
|
-
if (count === 2) {
|
|
545
|
-
drv = 0;
|
|
546
|
-
ocr++;
|
|
547
|
-
if (!this.hebrew)
|
|
548
|
-
switch (GuiEnvironment.Environment.GetDateMode(compIdx)) {
|
|
549
|
-
case 'B':
|
|
550
|
-
case 'E':
|
|
551
|
-
switch (ocr) {
|
|
552
|
-
case 1:
|
|
553
|
-
drv = PICInterface.PIC_DD;
|
|
554
|
-
break;
|
|
555
|
-
case 2:
|
|
556
|
-
drv = PICInterface.PIC_MMD;
|
|
557
|
-
break;
|
|
558
|
-
case 3:
|
|
559
|
-
drv = PICInterface.PIC_YY;
|
|
560
|
-
break;
|
|
561
|
-
}
|
|
562
|
-
break;
|
|
563
|
-
case 'A':
|
|
564
|
-
switch (ocr) {
|
|
565
|
-
case 1:
|
|
566
|
-
drv = PICInterface.PIC_MMD;
|
|
567
|
-
break;
|
|
568
|
-
case 2:
|
|
569
|
-
drv = PICInterface.PIC_DD;
|
|
570
|
-
break;
|
|
571
|
-
case 3:
|
|
572
|
-
drv = PICInterface.PIC_YY;
|
|
573
|
-
break;
|
|
574
|
-
}
|
|
575
|
-
break;
|
|
576
|
-
case 'J':
|
|
577
|
-
case 'S':
|
|
578
|
-
switch (ocr) {
|
|
579
|
-
case 1:
|
|
580
|
-
if (!SWExpandDateChecked) {
|
|
581
|
-
SwitchAndExpandDate = NString.FromChars(this._format).indexOf("####") > -1;
|
|
582
|
-
SWExpandDateChecked = true;
|
|
583
|
-
}
|
|
584
|
-
if (SwitchAndExpandDate)
|
|
585
|
-
this.pik_drv_fill(PICInterface.PIC_YYYY, 4);
|
|
586
|
-
else
|
|
587
|
-
drv = PICInterface.PIC_YY;
|
|
588
|
-
break;
|
|
589
|
-
case 2:
|
|
590
|
-
drv = PICInterface.PIC_MMD;
|
|
591
|
-
break;
|
|
592
|
-
case 3:
|
|
593
|
-
drv = PICInterface.PIC_DD;
|
|
594
|
-
break;
|
|
595
|
-
}
|
|
596
|
-
break;
|
|
597
|
-
}
|
|
598
|
-
if (drv !== 0)
|
|
599
|
-
this.pik_drv_fill(drv, 2);
|
|
600
|
-
}
|
|
601
|
-
else if (count === 4) {
|
|
602
|
-
drv = 0;
|
|
603
|
-
ocr++;
|
|
604
|
-
if (!this.hebrew)
|
|
605
|
-
switch (GuiEnvironment.Environment.GetDateMode(compIdx)) {
|
|
606
|
-
case 'B':
|
|
607
|
-
case 'E':
|
|
608
|
-
case 'A':
|
|
609
|
-
if (ocr === 3)
|
|
610
|
-
drv = PICInterface.PIC_YYYY;
|
|
611
|
-
break;
|
|
612
|
-
case 'J':
|
|
613
|
-
case 'S':
|
|
614
|
-
if (ocr === 1)
|
|
615
|
-
drv = PICInterface.PIC_YYYY;
|
|
616
|
-
else {
|
|
617
|
-
if (!SWExpandDateChecked) {
|
|
618
|
-
SwitchAndExpandDate = NString.FromChars(this._format).indexOf("####") > -1;
|
|
619
|
-
SWExpandDateChecked = true;
|
|
620
|
-
}
|
|
621
|
-
if (SwitchAndExpandDate && ocr === 3)
|
|
622
|
-
this.pik_drv_fill(PICInterface.PIC_DD, 2);
|
|
623
|
-
}
|
|
624
|
-
break;
|
|
625
|
-
}
|
|
626
|
-
if (drv !== 0)
|
|
627
|
-
this.pik_drv_fill(drv, 4);
|
|
628
|
-
}
|
|
629
|
-
this._formatIdx += count;
|
|
630
|
-
break;
|
|
631
|
-
case 'W':
|
|
632
|
-
count = this.pik_dup();
|
|
633
|
-
i = count;
|
|
634
|
-
if (count === 1)
|
|
635
|
-
drv = PICInterface.PIC_W;
|
|
636
|
-
else if (this.hebrew)
|
|
637
|
-
if (count === 5)
|
|
638
|
-
drv = PICInterface.PIC_WWW;
|
|
639
|
-
else
|
|
640
|
-
i = 0;
|
|
641
|
-
else if (count > 2 && count <= 10)
|
|
642
|
-
drv = PICInterface.PIC_WWW;
|
|
643
|
-
else
|
|
644
|
-
i = 0;
|
|
645
|
-
this._formatIdx += count;
|
|
646
|
-
this.pik_drv_fill(drv, i);
|
|
647
|
-
break;
|
|
648
|
-
case '/':
|
|
649
|
-
this._formatIdx++;
|
|
650
|
-
this.pik_drv_fill(GuiEnvironment.Environment.GetDate().charCodeAt(0), 1);
|
|
651
|
-
break;
|
|
652
|
-
case 'S':
|
|
653
|
-
if (UtilStrByteMode.isLocaleDefLangJPN()) {
|
|
654
|
-
count = this.pik_dup();
|
|
655
|
-
i = count;
|
|
656
|
-
if (count !== 2 && count !== 4 && count !== 6)
|
|
657
|
-
i = 0;
|
|
658
|
-
drv = PICInterface.PIC_BB;
|
|
659
|
-
this._formatIdx += count;
|
|
660
|
-
this.pik_drv_fill(drv, i);
|
|
661
|
-
}
|
|
662
|
-
else {
|
|
663
|
-
this.pik_mask();
|
|
664
|
-
}
|
|
665
|
-
break;
|
|
666
|
-
case 'J':
|
|
667
|
-
if (UtilStrByteMode.isLocaleDefLangJPN()) {
|
|
668
|
-
count = this.pik_dup();
|
|
669
|
-
i = count;
|
|
670
|
-
isJpnEraYear = true;
|
|
671
|
-
switch (count) {
|
|
672
|
-
case 1:
|
|
673
|
-
drv = PICInterface.PIC_JY1;
|
|
674
|
-
break;
|
|
675
|
-
case 2:
|
|
676
|
-
drv = PICInterface.PIC_JY2;
|
|
677
|
-
break;
|
|
678
|
-
case 4:
|
|
679
|
-
drv = PICInterface.PIC_JY4;
|
|
680
|
-
break;
|
|
681
|
-
default:
|
|
682
|
-
i = 0;
|
|
683
|
-
isJpnEraYear = false;
|
|
684
|
-
break;
|
|
685
|
-
}
|
|
686
|
-
this._formatIdx += count;
|
|
687
|
-
this.pik_drv_fill(drv, i);
|
|
688
|
-
}
|
|
689
|
-
else {
|
|
690
|
-
this.pik_mask();
|
|
691
|
-
}
|
|
692
|
-
break;
|
|
693
|
-
default:
|
|
694
|
-
this.pik_mask();
|
|
695
|
-
break;
|
|
696
|
-
}
|
|
697
|
-
}
|
|
698
|
-
if (!this._needLength && isJpnEraYear) {
|
|
699
|
-
for (i = 0; i < this._msk.length; i++) {
|
|
700
|
-
if (this._msk[i].charCodeAt(0) === PICInterface.PIC_YY)
|
|
701
|
-
this._msk[i] = String.fromCharCode(PICInterface.PIC_YJ);
|
|
702
|
-
else if (this._msk[i].charCodeAt(0) === PICInterface.PIC_YYYY)
|
|
703
|
-
this._msk[i] = 'Y';
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
time_prs() {
|
|
708
|
-
let drv;
|
|
709
|
-
let NoFormat;
|
|
710
|
-
let currChr;
|
|
711
|
-
this._zero = ' ';
|
|
712
|
-
if (this._format.length === 0 || this._format[0].charCodeAt(0) === 0) {
|
|
713
|
-
NoFormat = "HH:MM:SS";
|
|
714
|
-
if (this._mskLen < 8)
|
|
715
|
-
NoFormat = NoFormat.substr(0, this._mskLen);
|
|
716
|
-
this._format = NString.ToCharArray(NoFormat);
|
|
717
|
-
}
|
|
718
|
-
while (this._formatIdx < this._format.length) {
|
|
719
|
-
currChr = this._format[this._formatIdx];
|
|
720
|
-
let maskLength;
|
|
721
|
-
switch (currChr) {
|
|
722
|
-
case 'H':
|
|
723
|
-
case 'M':
|
|
724
|
-
case 'S':
|
|
725
|
-
maskLength = 2;
|
|
726
|
-
if (this._formatIdx + 1 < this._format.length && this._format[this._formatIdx] === this._format[this._formatIdx + 1]) {
|
|
727
|
-
switch (currChr) {
|
|
728
|
-
case 'H':
|
|
729
|
-
drv = PICInterface.PIC_HH;
|
|
730
|
-
break;
|
|
731
|
-
case 'M':
|
|
732
|
-
drv = PICInterface.PIC_MMT;
|
|
733
|
-
break;
|
|
734
|
-
case 'S':
|
|
735
|
-
drv = PICInterface.PIC_SS;
|
|
736
|
-
break;
|
|
737
|
-
default:
|
|
738
|
-
drv = PICInterface.NULL_CHAR;
|
|
739
|
-
break;
|
|
740
|
-
}
|
|
741
|
-
this._formatIdx += maskLength;
|
|
742
|
-
this.pik_drv_fill(drv, maskLength);
|
|
743
|
-
}
|
|
744
|
-
else
|
|
745
|
-
this.pik_mask();
|
|
746
|
-
break;
|
|
747
|
-
case 'm':
|
|
748
|
-
maskLength = 3;
|
|
749
|
-
if (this._formatIdx + 2 < this._format.length &&
|
|
750
|
-
(this._format[this._formatIdx] === this._format[this._formatIdx + 1] &&
|
|
751
|
-
this._format[this._formatIdx + 1] === this._format[this._formatIdx + 2])) {
|
|
752
|
-
drv = PICInterface.PIC_MS;
|
|
753
|
-
this._formatIdx += maskLength;
|
|
754
|
-
this.pik_drv_fill(drv, maskLength);
|
|
755
|
-
}
|
|
756
|
-
else
|
|
757
|
-
this.pik_mask();
|
|
758
|
-
break;
|
|
759
|
-
case ':':
|
|
760
|
-
this._formatIdx++;
|
|
761
|
-
this.pik_drv_fill(GuiEnvironment.Environment.GetTime().charCodeAt(0), 1);
|
|
762
|
-
break;
|
|
763
|
-
case 'Z':
|
|
764
|
-
this._formatIdx++;
|
|
765
|
-
this._zeroFill = true;
|
|
766
|
-
if (this._formatIdx < this._format.length)
|
|
767
|
-
this._zero = this._format[this._formatIdx++];
|
|
768
|
-
break;
|
|
769
|
-
case 'A':
|
|
770
|
-
this._formatIdx++;
|
|
771
|
-
this._autoSkip_ = true;
|
|
772
|
-
break;
|
|
773
|
-
case 'P':
|
|
774
|
-
if (this._format[this._formatIdx + 1] === 'M') {
|
|
775
|
-
this._formatIdx += 2;
|
|
776
|
-
this.pik_drv_fill(PICInterface.PIC_PM, 2);
|
|
777
|
-
}
|
|
778
|
-
else
|
|
779
|
-
this.pik_mask();
|
|
780
|
-
break;
|
|
781
|
-
default:
|
|
782
|
-
this.pik_mask();
|
|
783
|
-
break;
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
|
-
}
|
|
787
|
-
static buildPicture(type, val, compIdx, useDecimal) {
|
|
788
|
-
let pic = null;
|
|
789
|
-
let mask = new StringBuilder(10);
|
|
790
|
-
let decimalSeparator;
|
|
791
|
-
let thousands;
|
|
792
|
-
let currChar;
|
|
793
|
-
let counter;
|
|
794
|
-
let length;
|
|
795
|
-
let beforeDec;
|
|
796
|
-
let afterDec;
|
|
797
|
-
let decimalDelimFound;
|
|
798
|
-
let isThousandsDelim;
|
|
799
|
-
let isNegative;
|
|
800
|
-
switch (type) {
|
|
801
|
-
case StorageAttribute.NUMERIC:
|
|
802
|
-
decimalSeparator = GuiEnvironment.Environment.GetDecimal();
|
|
803
|
-
thousands = GuiEnvironment.Environment.GetThousands();
|
|
804
|
-
beforeDec = afterDec = 0;
|
|
805
|
-
decimalDelimFound = false;
|
|
806
|
-
isThousandsDelim = false;
|
|
807
|
-
isNegative = false;
|
|
808
|
-
if (val === null || val.length === 0)
|
|
809
|
-
beforeDec = afterDec = 1;
|
|
810
|
-
else {
|
|
811
|
-
length = val.length;
|
|
812
|
-
counter = 0;
|
|
813
|
-
while (counter < length) {
|
|
814
|
-
currChar = val[counter];
|
|
815
|
-
switch (currChar) {
|
|
816
|
-
case '+':
|
|
817
|
-
case '-':
|
|
818
|
-
isNegative = true;
|
|
819
|
-
break;
|
|
820
|
-
default:
|
|
821
|
-
if (useDecimal && currChar === decimalSeparator)
|
|
822
|
-
decimalDelimFound = true;
|
|
823
|
-
else if (currChar === thousands)
|
|
824
|
-
isThousandsDelim = true;
|
|
825
|
-
else if (decimalDelimFound)
|
|
826
|
-
afterDec++;
|
|
827
|
-
else
|
|
828
|
-
beforeDec++;
|
|
829
|
-
break;
|
|
830
|
-
}
|
|
831
|
-
counter++;
|
|
832
|
-
}
|
|
833
|
-
mask.Append("" + beforeDec + decimalSeparator + afterDec);
|
|
834
|
-
if (isNegative)
|
|
835
|
-
mask.Append('N');
|
|
836
|
-
if (isThousandsDelim)
|
|
837
|
-
mask.Append('C');
|
|
838
|
-
}
|
|
839
|
-
break;
|
|
840
|
-
case StorageAttribute.DATE:
|
|
841
|
-
mask.Append(this.getDefaultDateMask(GuiEnvironment.Environment.GetDateMode(compIdx)));
|
|
842
|
-
break;
|
|
843
|
-
case StorageAttribute.TIME:
|
|
844
|
-
mask.Append("HH" + GuiEnvironment.Environment.GetTime() + "MM" + GuiEnvironment.Environment.GetTime() + "SS");
|
|
845
|
-
break;
|
|
846
|
-
default:
|
|
847
|
-
Events.WriteDevToLog("Event.buildPicture() there is no PICTURE building for type :" + type +
|
|
848
|
-
" and value :" + val);
|
|
849
|
-
return pic;
|
|
850
|
-
}
|
|
851
|
-
pic = new PIC(mask.ToString(), type, compIdx);
|
|
852
|
-
return pic;
|
|
853
|
-
}
|
|
854
|
-
setHebrew() {
|
|
855
|
-
if (GuiEnvironment.Environment.Language === 'H')
|
|
856
|
-
this.hebrew = true;
|
|
857
|
-
}
|
|
858
|
-
static getDefaultDateMask(dataMode) {
|
|
859
|
-
let frmt;
|
|
860
|
-
switch (dataMode) {
|
|
861
|
-
case 'J':
|
|
862
|
-
case 'S':
|
|
863
|
-
frmt = "####/##/##";
|
|
864
|
-
break;
|
|
865
|
-
case 'B':
|
|
866
|
-
case 'E':
|
|
867
|
-
case 'A':
|
|
868
|
-
default:
|
|
869
|
-
frmt = "##/##/####";
|
|
870
|
-
break;
|
|
871
|
-
}
|
|
872
|
-
return frmt;
|
|
873
|
-
}
|
|
874
|
-
bool_prs() {
|
|
875
|
-
let count;
|
|
876
|
-
let currChr;
|
|
877
|
-
while (this._formatIdx < this._format.length) {
|
|
878
|
-
currChr = this._format[this._formatIdx];
|
|
879
|
-
switch (currChr) {
|
|
880
|
-
case 'H':
|
|
881
|
-
this._formatIdx++;
|
|
882
|
-
this.setHebrew();
|
|
883
|
-
break;
|
|
884
|
-
case 'A':
|
|
885
|
-
this._formatIdx++;
|
|
886
|
-
this._autoSkip_ = true;
|
|
887
|
-
break;
|
|
888
|
-
case 'X':
|
|
889
|
-
this._formatIdx++;
|
|
890
|
-
count = this.pik_count();
|
|
891
|
-
this.pik_drv_fill(PICInterface.PIC_X, count);
|
|
892
|
-
break;
|
|
893
|
-
default:
|
|
894
|
-
if (UtilStrByteMode.isDigit(currChr)) {
|
|
895
|
-
count = this.pik_count();
|
|
896
|
-
this.pik_drv_fill(PICInterface.PIC_X, count);
|
|
897
|
-
}
|
|
898
|
-
else
|
|
899
|
-
this.pik_mask();
|
|
900
|
-
break;
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
|
-
if (this._maskSize === 0)
|
|
904
|
-
this.pik_drv_fill(PICInterface.PIC_X, this._mskLen);
|
|
905
|
-
}
|
|
906
|
-
pik_sign() {
|
|
907
|
-
let posSign;
|
|
908
|
-
let signStr;
|
|
909
|
-
let currChr;
|
|
910
|
-
posSign = this._format[this._formatIdx] === '+'
|
|
911
|
-
? true
|
|
912
|
-
: false;
|
|
913
|
-
this._formatIdx++;
|
|
914
|
-
if (posSign)
|
|
915
|
-
signStr = this._posPref;
|
|
916
|
-
else {
|
|
917
|
-
this._negPref.Remove(0, this._negPref.Length);
|
|
918
|
-
signStr = this._negPref;
|
|
919
|
-
}
|
|
920
|
-
while (this._formatIdx < this._format.length) {
|
|
921
|
-
currChr = this._format[this._formatIdx];
|
|
922
|
-
switch (currChr) {
|
|
923
|
-
case ';':
|
|
924
|
-
this._formatIdx++;
|
|
925
|
-
return;
|
|
926
|
-
case ',':
|
|
927
|
-
this._formatIdx++;
|
|
928
|
-
if (posSign)
|
|
929
|
-
signStr = this._posSuff;
|
|
930
|
-
else
|
|
931
|
-
signStr = this._negSuff;
|
|
932
|
-
break;
|
|
933
|
-
case '\\':
|
|
934
|
-
this._formatIdx++;
|
|
935
|
-
if (this._formatIdx >= this._format.length)
|
|
936
|
-
return;
|
|
937
|
-
currChr = this._format[this._formatIdx];
|
|
938
|
-
default:
|
|
939
|
-
signStr.Append(currChr);
|
|
940
|
-
this._formatIdx++;
|
|
941
|
-
break;
|
|
942
|
-
}
|
|
943
|
-
}
|
|
944
|
-
}
|
|
945
|
-
pik_count() {
|
|
946
|
-
let specialValNewPolicy = GuiEnvironment.Environment.GetSpecialValNewPolicy();
|
|
947
|
-
let val;
|
|
948
|
-
let isDigit = false;
|
|
949
|
-
val = 0;
|
|
950
|
-
while (this._formatIdx < this._format.length && UtilStrByteMode.isDigit(this._format[this._formatIdx])) {
|
|
951
|
-
val *= 10;
|
|
952
|
-
isDigit = true;
|
|
953
|
-
val += this._format[this._formatIdx].charCodeAt(0) - '0'.charCodeAt(0);
|
|
954
|
-
this._formatIdx++;
|
|
955
|
-
}
|
|
956
|
-
if (val > 32000)
|
|
957
|
-
val = 32000;
|
|
958
|
-
else if (val <= 0) {
|
|
959
|
-
if (specialValNewPolicy && isDigit && val === 0)
|
|
960
|
-
return 0;
|
|
961
|
-
else
|
|
962
|
-
val = 1;
|
|
963
|
-
}
|
|
964
|
-
if (val > Int32.MaxValue)
|
|
965
|
-
throw new ApplicationException(Events.GetMessageString(MsgInterface.STR_ERR_MAX_VAR_SIZE));
|
|
966
|
-
return (val);
|
|
967
|
-
}
|
|
968
|
-
pik_drv_fill(drv, count) {
|
|
969
|
-
let MskZ;
|
|
970
|
-
let i = 0;
|
|
971
|
-
if (this._needLength) {
|
|
972
|
-
this._maskLength += count;
|
|
973
|
-
return;
|
|
974
|
-
}
|
|
975
|
-
MskZ = this._maskSize;
|
|
976
|
-
this._maskSize += count;
|
|
977
|
-
if (MskZ + count > this._mskLen)
|
|
978
|
-
count = this._mskLen - MskZ;
|
|
979
|
-
if (count > 0) {
|
|
980
|
-
for (i = 0; i < count; i++)
|
|
981
|
-
this._msk[MskZ + i] = String.fromCharCode(drv);
|
|
982
|
-
return;
|
|
983
|
-
}
|
|
984
|
-
}
|
|
985
|
-
pik_mask() {
|
|
986
|
-
let currChr;
|
|
987
|
-
let count;
|
|
988
|
-
if (this._format[this._formatIdx] === '\\')
|
|
989
|
-
this._formatIdx++;
|
|
990
|
-
if (this._formatIdx < this._format.length) {
|
|
991
|
-
currChr = this._format[this._formatIdx];
|
|
992
|
-
this._formatIdx++;
|
|
993
|
-
count = this.pik_count();
|
|
994
|
-
this.pik_drv_fill(currChr.charCodeAt(0), count);
|
|
995
|
-
this._maskChars += count;
|
|
996
|
-
}
|
|
997
|
-
}
|
|
998
|
-
pik_dup() {
|
|
999
|
-
let dupCount = 1;
|
|
1000
|
-
let c;
|
|
1001
|
-
let tmpIdx = this._formatIdx;
|
|
1002
|
-
c = this._format[tmpIdx];
|
|
1003
|
-
tmpIdx++;
|
|
1004
|
-
while (tmpIdx < this._format.length && c === this._format[tmpIdx]) {
|
|
1005
|
-
dupCount++;
|
|
1006
|
-
tmpIdx++;
|
|
1007
|
-
}
|
|
1008
|
-
return dupCount;
|
|
1009
|
-
}
|
|
1010
|
-
pic_kanji() {
|
|
1011
|
-
let count;
|
|
1012
|
-
if (this._formatIdx + 1 >= this._format.length)
|
|
1013
|
-
return false;
|
|
1014
|
-
if (!UtilStrByteMode.isDigit(this._format[this._formatIdx + 1]))
|
|
1015
|
-
return false;
|
|
1016
|
-
this._formatIdx++;
|
|
1017
|
-
if (this._format[this._formatIdx] === '0') {
|
|
1018
|
-
this._imeMode = UtilImeJpn.IME_FORCE_OFF;
|
|
1019
|
-
this._formatIdx++;
|
|
1020
|
-
}
|
|
1021
|
-
else {
|
|
1022
|
-
count = this.pik_count();
|
|
1023
|
-
if (1 <= count && count <= 9)
|
|
1024
|
-
this._imeMode = count;
|
|
1025
|
-
}
|
|
1026
|
-
return true;
|
|
1027
|
-
}
|
|
1028
|
-
getMaskLen(compIdx) {
|
|
1029
|
-
this._needLength = true;
|
|
1030
|
-
this._maskLength = 0;
|
|
1031
|
-
this._formatIdx = 0;
|
|
1032
|
-
this.prs_all(compIdx);
|
|
1033
|
-
if (this._picAttr === StorageAttribute.NUMERIC && (this._prefLen > 0 || this._suffLen > 0))
|
|
1034
|
-
this._maskLength += (this._prefLen + this._suffLen);
|
|
1035
|
-
this._needLength = false;
|
|
1036
|
-
this._formatIdx = this._maskChars = this._whole = this._decimalDigits = this._size = this._maskSize = this._prefLen = this._suffLen = 0;
|
|
1037
|
-
this._pad = this._zero = String.fromCharCode(0);
|
|
1038
|
-
this.hebrew = this._mixed = this._embeded = this._negative = this._comma = this._left = this._padFill = this._zeroFill = this._trim = this._autoSkip_ = this._decimal = this._termFlag = this._decPointIsFirst = false;
|
|
1039
|
-
this._posPref.Remove(0, this._posPref.Length);
|
|
1040
|
-
this._posSuff.Remove(0, this._posSuff.Length);
|
|
1041
|
-
this._negPref.Remove(0, this._negPref.Length);
|
|
1042
|
-
this._negSuff.Remove(0, this._negSuff.Length);
|
|
1043
|
-
return this._maskLength;
|
|
1044
|
-
}
|
|
1045
|
-
picIsMask(pos) {
|
|
1046
|
-
if (pos < 0 || pos >= this._maskLength)
|
|
1047
|
-
pos = 0;
|
|
1048
|
-
return this._msk[pos].charCodeAt(0) > PICInterface.PIC_MAX_OP;
|
|
1049
|
-
}
|
|
1050
|
-
getDirectiveLen(posOrMskPos, bufPos, buf) {
|
|
1051
|
-
if (arguments.length === 1)
|
|
1052
|
-
return this.getDirectiveLen_0(posOrMskPos);
|
|
1053
|
-
else
|
|
1054
|
-
return this.getDirectiveLen_1(posOrMskPos, bufPos, buf);
|
|
1055
|
-
}
|
|
1056
|
-
getDirectiveLen_0(pos) {
|
|
1057
|
-
let c = this._msk[pos];
|
|
1058
|
-
let num = pos;
|
|
1059
|
-
while (num < this._maskSize && c === this._msk[num]) {
|
|
1060
|
-
num = num + 1;
|
|
1061
|
-
}
|
|
1062
|
-
return num - pos;
|
|
1063
|
-
}
|
|
1064
|
-
getDirectiveLen_1(mskPos, bufPos, buf) {
|
|
1065
|
-
let drv = this._msk[mskPos];
|
|
1066
|
-
let currMskPos = mskPos;
|
|
1067
|
-
let currBufPos = bufPos;
|
|
1068
|
-
while (currMskPos < this._maskSize && drv === this._msk[currMskPos]) {
|
|
1069
|
-
if (currBufPos < buf.length && UtilStrByteMode.isLocaleDefLangDBCS() && this.isAttrAlphaOrDate()) {
|
|
1070
|
-
if (!UtilStrByteMode.isHalfWidth(buf[currBufPos++]))
|
|
1071
|
-
currMskPos++;
|
|
1072
|
-
}
|
|
1073
|
-
currMskPos++;
|
|
1074
|
-
}
|
|
1075
|
-
return (currMskPos - mskPos);
|
|
1076
|
-
}
|
|
1077
|
-
validateChar(charToValidate, pos) {
|
|
1078
|
-
let charReturned = charToValidate;
|
|
1079
|
-
if (pos >= this.getMaskSize())
|
|
1080
|
-
return charReturned;
|
|
1081
|
-
while (this.picIsMask(pos))
|
|
1082
|
-
pos++;
|
|
1083
|
-
switch (this._msk[pos].charCodeAt(0)) {
|
|
1084
|
-
case PICInterface.PIC_U:
|
|
1085
|
-
charReturned = charToValidate.toUpperCase();
|
|
1086
|
-
break;
|
|
1087
|
-
case PICInterface.PIC_L:
|
|
1088
|
-
charReturned = charToValidate.toLowerCase();
|
|
1089
|
-
default:
|
|
1090
|
-
if (!UtilStrByteMode.isDigit(charToValidate))
|
|
1091
|
-
for (let i = 0; i < PICInterface.NumDirective.length; i++)
|
|
1092
|
-
if (this._msk[pos].charCodeAt(0) === PICInterface.NumDirective[i]) {
|
|
1093
|
-
charReturned = this.isValidInNum(charToValidate);
|
|
1094
|
-
break;
|
|
1095
|
-
}
|
|
1096
|
-
break;
|
|
1097
|
-
}
|
|
1098
|
-
return charReturned;
|
|
1099
|
-
}
|
|
1100
|
-
isValidInNum(letter) {
|
|
1101
|
-
let charRet = '\0';
|
|
1102
|
-
let decimalChar = GuiEnvironment.Environment.GetDecimal();
|
|
1103
|
-
if (GuiEnvironment.Environment.CanReplaceDecimalSeparator() && this.isAttrNumeric())
|
|
1104
|
-
if (letter === '.')
|
|
1105
|
-
letter = decimalChar;
|
|
1106
|
-
switch (letter) {
|
|
1107
|
-
case ' ':
|
|
1108
|
-
case '-':
|
|
1109
|
-
case '*':
|
|
1110
|
-
case '+':
|
|
1111
|
-
case '/':
|
|
1112
|
-
charRet = letter;
|
|
1113
|
-
break;
|
|
1114
|
-
default:
|
|
1115
|
-
if (letter === decimalChar || letter === GuiEnvironment.Environment.GetThousands())
|
|
1116
|
-
charRet = letter;
|
|
1117
|
-
break;
|
|
1118
|
-
}
|
|
1119
|
-
return charRet;
|
|
1120
|
-
}
|
|
1121
|
-
isAttrLogical() {
|
|
1122
|
-
return (this._picAttr === StorageAttribute.BOOLEAN);
|
|
1123
|
-
}
|
|
1124
|
-
isAttrNumeric() {
|
|
1125
|
-
return (this._picAttr === StorageAttribute.NUMERIC);
|
|
1126
|
-
}
|
|
1127
|
-
isAttrAlpha() {
|
|
1128
|
-
return (this._picAttr === StorageAttribute.ALPHA);
|
|
1129
|
-
}
|
|
1130
|
-
isAttrUnicode() {
|
|
1131
|
-
return (this._picAttr === StorageAttribute.UNICODE);
|
|
1132
|
-
}
|
|
1133
|
-
isAttrAlphaOrDate() {
|
|
1134
|
-
return (this._picAttr === StorageAttribute.ALPHA || this._picAttr === StorageAttribute.DATE);
|
|
1135
|
-
}
|
|
1136
|
-
isAttrDateOrTime() {
|
|
1137
|
-
return (this._picAttr === StorageAttribute.TIME || this._picAttr === StorageAttribute.DATE);
|
|
1138
|
-
}
|
|
1139
|
-
isAttrBlob() {
|
|
1140
|
-
return (this._picAttr === StorageAttribute.BLOB ||
|
|
1141
|
-
this._picAttr === StorageAttribute.BLOB_VECTOR);
|
|
1142
|
-
}
|
|
1143
|
-
isNumeric(pos) {
|
|
1144
|
-
return this._msk[pos] === String.fromCharCode(PICInterface.PIC_N);
|
|
1145
|
-
}
|
|
1146
|
-
isAllX() {
|
|
1147
|
-
return (this._msk[0] === String.fromCharCode(PICInterface.PIC_X) && this.getDirectiveLen(0) === this._maskSize);
|
|
1148
|
-
}
|
|
1149
|
-
isMaskPicEq(pos, maskPic) {
|
|
1150
|
-
return this._msk[pos] === String.fromCharCode(maskPic);
|
|
1151
|
-
}
|
|
1152
|
-
isValidChar_as400(charToValidate, firstChar, pos) {
|
|
1153
|
-
let ret = true;
|
|
1154
|
-
switch (this._msk[pos].charCodeAt(0)) {
|
|
1155
|
-
case PICInterface.PIC_J:
|
|
1156
|
-
case PICInterface.PIC_G:
|
|
1157
|
-
ret = !UtilStrByteMode.isHalfWidth(charToValidate);
|
|
1158
|
-
break;
|
|
1159
|
-
case (PICInterface.PIC_T):
|
|
1160
|
-
if (firstChar === '\x0000')
|
|
1161
|
-
ret = true;
|
|
1162
|
-
else if (UtilStrByteMode.isHalfWidth(firstChar))
|
|
1163
|
-
ret = UtilStrByteMode.isHalfWidth(charToValidate);
|
|
1164
|
-
else
|
|
1165
|
-
ret = !UtilStrByteMode.isHalfWidth(charToValidate);
|
|
1166
|
-
break;
|
|
1167
|
-
case (PICInterface.PIC_S):
|
|
1168
|
-
ret = UtilStrByteMode.isHalfWidth(charToValidate);
|
|
1169
|
-
break;
|
|
1170
|
-
default:
|
|
1171
|
-
break;
|
|
1172
|
-
}
|
|
1173
|
-
return ret;
|
|
1174
|
-
}
|
|
1175
|
-
getMinimumValueLength() {
|
|
1176
|
-
let minLength = this.getMaskLength();
|
|
1177
|
-
while (minLength > 0 && !this.picIsMask(minLength - 1))
|
|
1178
|
-
minLength--;
|
|
1179
|
-
return minLength;
|
|
1180
|
-
}
|
|
1181
|
-
toString() {
|
|
1182
|
-
return "{Picture: " + this._format + "}";
|
|
1183
|
-
}
|
|
1184
|
-
}
|
|
1185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUElDLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL3NyYy9tYW5hZ2VtZW50L2d1aS9QSUMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBUXRELE1BQU0sT0FBTyxHQUFHO0lBSU4sT0FBTyxHQUFXLENBQUMsQ0FBQztJQUNwQixRQUFRLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7SUFDOUMsUUFBUSxHQUFrQixJQUFJLGFBQWEsRUFBRSxDQUFDO0lBQzlDLFFBQVEsR0FBcUIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0lBQ25ELFFBQVEsR0FBa0IsSUFBSSxhQUFhLEVBQUUsQ0FBQztJQUM5QyxRQUFRLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7SUFDOUMsVUFBVSxHQUFZLEtBQUssQ0FBQztJQUM1QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBQzFCLFNBQVMsR0FBWSxLQUFLLENBQUM7SUFDM0IsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUN4QixjQUFjLEdBQVcsQ0FBQyxDQUFDO0lBQzNCLGdCQUFnQixHQUFZLEtBQUssQ0FBQztJQUNsQyxRQUFRLEdBQVksS0FBSyxDQUFDO0lBQzFCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsVUFBVSxHQUFXLENBQUMsQ0FBQztJQUN2QixPQUFPLEdBQWEsSUFBSSxDQUFDO0lBQ3pCLE1BQU0sR0FBWSxLQUFL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YyxDQUFDLENBQUM7Z0JBQ25ELE1BQU07WUFFUixLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxTQUFTLEtBQUssUUFBUTtvQkFDeEIsR0FBRyxHQUFHLElBQUksQ0FBQztxQkFDUixJQUFJLGVBQWUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO29CQUM3QyxHQUFHLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQzs7b0JBRWxELEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3JELE1BQU07WUFFUixLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztnQkFDdkIsR0FBRyxHQUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ2xELE1BQU07WUFFUjtnQkFDRSxNQUFNO1NBQ1Q7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFLRCxxQkFBcUI7UUFDbkIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBR3JDLE9BQU8sU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNwRCxTQUFTLEVBQUUsQ0FBQztRQUVkLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTSxRQUFRO1FBQ2IsT0FBTyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDM0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTXNnSW50ZXJmYWNlLCBQSUNJbnRlcmZhY2UsIFN0b3JhZ2VBdHRyaWJ1dGUsIFV0aWxJbWVKcG4sIFV0aWxTdHJCeXRlTW9kZSB9IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQgeyBFdmVudHMgfSBmcm9tICcuLi8uLi9FdmVudHMnO1xyXG5pbXBvcnQgeyBBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgSW50MzIsIE5TdHJpbmcsIFN0cmluZ0J1aWxkZXIgfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7IEd1aUVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vR3VpRW52aXJvbm1lbnQnO1xyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBUaGUgY2xhc3MgaGFuZGxlcyB0aGUgcHJvY2VzcyBvZiBjb252ZXJ0aW5nIGludGVybmFsIGRhdGEgdG8gZGlzcGxheWVkIGRhdGFcclxuLy8vICAgYnkgdXNpbmcgYSBzcGVjaWZpYyBmb3JtYXQuXHJcbi8vLyAgIFRoZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBQSUMgc3RydWN0dXJlIG9mIE1hZ2ljLCBhbmQgYWxsIGl0cyByZWxhdGVkIG9wZXJhdGlvbnMuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBQSUMge1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gT3JpZ2luYWwgbWVtYmVycyBvZiB0aGUgTWFnaWMgUElDIHN0cnVjdHVyZVxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgcHJpdmF0ZSBfbXNrTGVuOiBudW1iZXIgPSAwOyAvLyBUaGUgbWFzayBsZW5cclxuICBwcml2YXRlIF9uZWdQcmVmOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICBwcml2YXRlIF9uZWdTdWZmOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICBwcml2YXRlIF9waWNBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gIHByaXZhdGUgX3Bvc1ByZWY6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gIHByaXZhdGUgX3Bvc1N1ZmY6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gIHByaXZhdGUgX2F1dG9Ta2lwXzogYm9vbGVhbiA9IGZhbHNlOyAgLy8gQXV0b3NraXAgP1xyXG4gIHByaXZhdGUgX3BhZEZpbGw6IGJvb2xlYW4gPSBmYWxzZTsgLy8gUGFkIGZpbGwgP1xyXG4gIHByaXZhdGUgX3plcm9GaWxsOiBib29sZWFuID0gZmFsc2U7ICAvLyBaZXJvIGZpbGwgP1xyXG4gIHByaXZhdGUgX2NvbW1hOiBib29sZWFuID0gZmFsc2U7IC8vIERpc3BsYXkgbnVtYmVycyB3aXRoIGNvbW1hcyA/XHJcbiAgcHJpdmF0ZSBfZGVjaW1hbERpZ2l0czogbnVtYmVyID0gMDsgLy8gRGVjaW1hbCBkaWdpdHNcclxuICBwcml2YXRlIF9kZWNQb2ludElzRmlyc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9kZWNpbWFsOiBib29sZWFuID0gZmFsc2U7IC8vIERlY2ltYWxzID9cclxuICBwcml2YXRlIF9lbWJlZGVkOiBib29sZWFuID0gZmFsc2U7IC8vIEVtYmVkZWQgY2hhcmFjdGVycyA/XHJcbiAgcHJpdmF0ZSBfZm9ybWF0SWR4OiBudW1iZXIgPSAwOyAvLyBDdXJyZW50IGNoYXIgcHJvY2Vzc2VkIGluIGZvcm1hdF87XHJcbiAgcHJpdmF0ZSBfZm9ybWF0OiBzdHJpbmdbXSA9IG51bGw7IC8vIFRoZSBmb3JtYXQgcHJvY2Vzc2VkXHJcbiAgcHJpdmF0ZSBoZWJyZXc6IGJvb2xlYW4gPSBmYWxzZTsgLy8gSGVicmV3ID9cclxuICBwcml2YXRlIF9pbWVNb2RlOiBudW1iZXIgPSAtMTsgLy8gSlBOOiBJTUUgc3VwcG9ydFxyXG4gIHByaXZhdGUgX2xlZnQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gTGVmdCBqdXN0aWZpZWQgP1xyXG4gIHByaXZhdGUgX21hc2tMZW5ndGg6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfbWFza0NoYXJzOiBudW1iZXIgPSAwOyAvLyBNYXNrIGNoYXJzIGNvdW50XHJcbiAgcHJpdmF0ZSBfbWFza1NpemU6IG51bWJlciA9IDA7IC8vIFNpemUgb2YgcGljdHVyZSBpL28gbWFza1xyXG4gIHByaXZhdGUgX21peGVkOiBib29sZWFuID0gZmFsc2U7IC8vIE1peGVkIGxhbmd1YWdlID9cclxuICBwcml2YXRlIF9mb3JtYXRFeHA6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gQWRkZWQgdmFyaWFibGVzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICBwcml2YXRlIF9tc2s6IHN0cmluZ1tdID0gbnVsbDsgLy8gVGhlIG1hc2sgZm9yIHRoZSBzcGVjaWZpZWQgcGljdHVyZSBmb3JtYXRcclxuICBwcml2YXRlIF9uZWVkTGVuZ3RoOiBib29sZWFuID0gZmFsc2U7IC8vIGdldCBsZW5ndGggb2YgdGhlIHBpY3R1cmUgYWZ0ZXIgcGFyc2luZ1xyXG4gIHByaXZhdGUgX25lZ2F0aXZlOiBib29sZWFuID0gZmFsc2U7IC8vIE5lZ2F0aXZlIHZhbHVlcyBhbGxvd2VkID9cclxuICBwcml2YXRlIF9wYWQ6IHN0cmluZyA9ICdcXDAnOyAvLyBQYWQgY2hhcmFjdGVyXHJcbiAgcHJpdmF0ZSBfcHJlZkxlbjogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9zaXplOiBudW1iZXIgPSAwOyAvLyBTaXplIG9mIEFscGhhIGRhdGEgIHdpdGhvdXQgbWFzayBjaGFyYWN0ZXJzXHJcbiAgcHJpdmF0ZSBfc3VmZkxlbjogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF90ZXJtRmxhZzogYm9vbGVhbiA9IGZhbHNlOyAvLyBhcmUgdGVybWluYXRvcnMgc3BlY2lmaWVkID9cclxuICBwcml2YXRlIF90cmltOiBib29sZWFuID0gZmFsc2U7IC8vIFRyaW0gP1xyXG4gIHByaXZhdGUgX3dob2xlOiBudW1iZXIgPSAwOyAvLyBXaG9sZSBkaWdpdHNcclxuICBwcml2YXRlIF96ZXJvOiBzdHJpbmcgPSAnXFwwJzsgLy8gWmVybyBjaGFyYWN0ZXJcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZHMgYSBQSUMgY2xhc3MgZnJvbSBwaWN0dXJlIGZvcm1hdCBhbmQgYXR0cmlidXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPlRoZSBwaWN0dXJlIGZvcm1hdCBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYXR0clwiPlRoZSBkYXRhIGF0dHJpYnV0ZSAoTi9BL0QvVC8uLi4pPC9wYXJhbT5cclxuICBjb25zdHJ1Y3RvcihwaWNTdHI6IHN0cmluZywgYXR0cjogU3RvcmFnZUF0dHJpYnV0ZSwgY29tcElkeDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9waWNBdHRyID0gYXR0cjtcclxuXHJcbiAgICBpZiAodGhpcy5fcGljQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8XHJcbiAgICAgIHRoaXMuX3BpY0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgaWYgKHBpY1N0ci50cmltKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIEV2ZW50cy5Xcml0ZURldlRvTG9nKFwiUElDLlBJQyB0aGUgcGljdHVyZSBvZiBCTE9CIG11c3QgYmUgZW1wdHkgc3RyaW5nXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9mb3JtYXQgPSBOU3RyaW5nLlRvQ2hhckFycmF5KHBpY1N0cik7XHJcbiAgICB0aGlzLl9mb3JtYXRJZHggPSAwO1xyXG5cclxuICAgIHRoaXMuX21za0xlbiA9IHRoaXMuZ2V0TWFza0xlbihjb21wSWR4KTtcclxuICAgIHRoaXMucHJzX2FsbChjb21wSWR4KTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCBpbmZvcm1hdGlvbiBtZXRob2RzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzSGVicmV3KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaGVicmV3O1xyXG4gIH1cclxuXHJcbiAgaXNNaXhlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9taXhlZDtcclxuICB9XHJcblxyXG4gIGVtYmVkZWRDaGFycygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9lbWJlZGVkO1xyXG4gIH1cclxuXHJcbiAgaXNOZWdhdGl2ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9uZWdhdGl2ZTtcclxuICB9XHJcblxyXG4gIHdpdGhDb21hKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbW1hO1xyXG4gIH1cclxuXHJcbiAgaXNMZWZ0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xlZnQ7XHJcbiAgfVxyXG5cclxuICBwYWRGaWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZEZpbGw7XHJcbiAgfVxyXG5cclxuICBnZXRQYWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9wYWQ7XHJcbiAgfVxyXG5cclxuICB6ZXJvRmlsbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl96ZXJvRmlsbDtcclxuICB9XHJcblxyXG4gIGdldFplcm9QYWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl96ZXJvO1xyXG4gIH1cclxuXHJcbiAgaXNUcmltZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJpbTtcclxuICB9XHJcblxyXG4gIGF1dG9Ta2lwKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1dG9Ta2lwXztcclxuICB9XHJcblxyXG4gIHdpdGhEZWNpbWFsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RlY2ltYWw7XHJcbiAgfVxyXG5cclxuICB3aXRoVGVybSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl90ZXJtRmxhZztcclxuICB9XHJcblxyXG4gIGdldE1hc2tDaGFycygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX21hc2tDaGFycztcclxuICB9XHJcblxyXG4gIGdldFdob2xlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3dob2xlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGVjKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVjaW1hbERpZ2l0cztcclxuICB9XHJcblxyXG4gIGdldFNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zaXplO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWFza1NpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXNrU2l6ZTtcclxuICB9XHJcblxyXG4gIGdldE1hc2tMZW5ndGgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXNrTGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZGVjSW5GaXJzdFBvcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kZWNQb2ludElzRmlyc3Q7XHJcbiAgfVxyXG5cclxuICBzZXRGb3JtYXRFeHAodmFsIDpib29sZWFuKSB7XHJcbiAgICB0aGlzLl9mb3JtYXRFeHAgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBpc0Zvcm1hdEV4cCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JtYXRFeHA7XHJcbiAgfVxyXG4gIGdldFBvc1ByZWZfKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fcG9zUHJlZi5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UG9zU3VmZl8oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9wb3NTdWZmLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICBnZXROZWdQcmVmXygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX25lZ1ByZWYuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIGdldE5lZ1N1ZmZfKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fbmVnU3VmZi5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWFzaygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKHRoaXMuX21zayk7XHJcbiAgfVxyXG5cclxuICBnZXRGb3JtYXQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBOU3RyaW5nLkZyb21DaGFycyh0aGlzLl9mb3JtYXQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cigpOiBTdG9yYWdlQXR0cmlidXRlIHtcclxuICAgIHJldHVybiB0aGlzLl9waWNBdHRyO1xyXG4gIH1cclxuXHJcblxyXG4gIHNldEF0dHIoc2V0OlN0b3JhZ2VBdHRyaWJ1dGUpOiB2b2lkIHtcclxuICAgIHRoaXMuX3BpY0F0dHIgPT0gc2V0O1xyXG4gIH1cclxuXHJcbiAgZ2V0SW1lTW9kZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ltZU1vZGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUGFyc2UgdGhlIHBpY3R1cmUgZm9ybWF0IGJ5IHRoZSBhdHRyaWJ1dGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgcHJzX2FsbChjb21wSWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5fbmVlZExlbmd0aCkge1xyXG4gICAgICB0aGlzLl9tc2sgPSBuZXcgQXJyYXk8c3RyaW5nPih0aGlzLl9tc2tMZW4pO1xyXG4gICAgICBmb3IgKGxldCBfYWk6IG51bWJlciA9IDA7IF9haSA8IHRoaXMuX21zay5sZW5ndGg7ICsrX2FpKVxyXG4gICAgICAgIHRoaXMuX21za1tfYWldID0gJ1xcMCc7XHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKHRoaXMuX3BpY0F0dHIpIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICB0aGlzLmFscGhhX3BycygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgdGhpcy5udW1fcHJzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICB0aGlzLmRhdGVfcHJzKGNvbXBJZHgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgdGhpcy50aW1lX3BycygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgdGhpcy5ib29sX3BycygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgIC8vIGRvIG5vdGhpbmdcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFBhcnNlIGFuIGFscGhhIHBpY3R1cmUgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFscGhhX3BycygpOiB2b2lkIHtcclxuICAgIGxldCBjdXJyQ2hyOiBzdHJpbmc7XHJcbiAgICBsZXQgZHJ2OiBudW1iZXI7XHJcbiAgICBsZXQgY291bnQ6IG51bWJlcjtcclxuXHJcbiAgICB3aGlsZSAodGhpcy5fZm9ybWF0SWR4IDwgdGhpcy5fZm9ybWF0Lmxlbmd0aCkge1xyXG4gICAgICBjdXJyQ2hyID0gdGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeF07XHJcbiAgICAgIHN3aXRjaCAoY3VyckNocikge1xyXG4gICAgICAgIGNhc2UgJ0gnOlxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICB0aGlzLnNldEhlYnJldygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ0EnOlxyXG4gICAgICAgICAgdGhpcy5fYXV0b1NraXBfID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJyMnOlxyXG4gICAgICAgIGNhc2UgJ0wnOlxyXG4gICAgICAgIGNhc2UgJ1UnOlxyXG4gICAgICAgIGNhc2UgJ1gnOlxyXG4gICAgICAgICAgZHJ2ID0gMDtcclxuICAgICAgICAgIHN3aXRjaCAoY3VyckNocikge1xyXG4gICAgICAgICAgICBjYXNlICcjJzpcclxuICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX047XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdMJzpcclxuICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX0w7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdVJzpcclxuICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX1U7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdYJzpcclxuICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX1g7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIGNvdW50ID0gdGhpcy5waWtfY291bnQoKTtcclxuICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKGRydiwgY291bnQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkgLy8gSlBOOiBEQkNTIHN1cHBvcnRcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy8gSlBOOiBJTUUgc3VwcG9ydFxyXG4gICAgICAgICAgICBsZXQgdXNlSW1lSnBuOiBib29sZWFuID0gVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0pQTigpO1xyXG4gICAgICAgICAgICBpZiAoY3VyckNociA9PT0gJ0snICYmIHVzZUltZUpwbikge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLnBpY19rYW5qaSgpKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRMb2NhbEFzNDAwU2V0KCkpIHtcclxuICAgICAgICAgICAgICBkcnYgPSAwO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoY3VyckNociA9PT0gJ0onKVxyXG4gICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19KO1xyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJDaHIgPT09ICdUJylcclxuICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfVDtcclxuICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyQ2hyID09PSAnRycpXHJcbiAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX0c7XHJcbiAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyckNociA9PT0gJ1MnKVxyXG4gICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19TO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZHJ2ICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBKUE46IElNRSBzdXBwb3J0XHJcbiAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgSU1FIG1vZGUgZnJvbSBBUy80MDAgcGljdHVyZXMgaWYgS2FuamkgcGFyYW1ldGVyIGlzbid0IHNwZWNpZmllZC5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbWVNb2RlID09PSAtMSAmJiB1c2VJbWVKcG4pIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGRydiA9PT0gUElDSW50ZXJmYWNlLlBJQ19KIHx8IGRydiA9PT0gUElDSW50ZXJmYWNlLlBJQ19HKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ltZU1vZGUgPSBVdGlsSW1lSnBuLklNRV9aRU5fSElSQUdBTkFfUk9NQU47XHJcbiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRydiA9PT0gUElDSW50ZXJmYWNlLlBJQ19TKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ltZU1vZGUgPSBVdGlsSW1lSnBuLklNRV9GT1JDRV9PRkY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgICAgICAgIGNvdW50ID0gdGhpcy5waWtfY291bnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKGRydiwgY291bnQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KGN1cnJDaHIpKSB7XHJcbiAgICAgICAgICAgIGNvdW50ID0gdGhpcy5waWtfY291bnQoKTtcclxuICAgICAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoUElDSW50ZXJmYWNlLlBJQ19YLCBjb3VudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMucGlrX21hc2soKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSW4gY2FzZSB0aGF0IG5vIHBpY3R1cmUgaXMgc3BlY2lmaWVkLCBhc3N1bWUgYWxsIGlzIFhzXHJcbiAgICBpZiAodGhpcy5fbWFza1NpemUgPT09IDApXHJcbiAgICAgIHRoaXMucGlrX2Rydl9maWxsKFBJQ0ludGVyZmFjZS5QSUNfWCwgdGhpcy5fbXNrTGVuKTtcclxuXHJcbiAgICAvLyBDb21wdXRlIG1hc2sgc2l6ZSB3aXRob3V0IHRoZSBtYXNrIGNoYXJhY3RlcnNcclxuICAgIHRoaXMuX3NpemUgPSB0aGlzLl9tYXNrU2l6ZTtcclxuICAgIGlmICghdGhpcy5fZW1iZWRlZClcclxuICAgICAgdGhpcy5fc2l6ZSAtPSB0aGlzLl9tYXNrQ2hhcnM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUGFyc2UgYSBudW1lcmljIHBpY3R1cmUgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG51bV9wcnMoKTogdm9pZCB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IGo6IG51bWJlcjtcclxuICAgIGxldCBjdXJyQ2hyOiBzdHJpbmc7XHJcbiAgICBsZXQgY291bnQ6IG51bWJlcjtcclxuICAgIGxldCB0bXA6IG51bWJlcjtcclxuICAgIGxldCB0bXBzOiBudW1iZXI7XHJcbiAgICBsZXQgdG1wX2M6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZmlyc3Q6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHJcbiAgICB0aGlzLl96ZXJvID0gJyAnLyonICcqLztcclxuICAgIHRoaXMuX3BhZCA9ICcgJy8qJyAnKi87XHJcbiAgICB0aGlzLl9uZWdQcmVmLkFwcGVuZCgnLScpLyonLScqLztcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5fZm9ybWF0Lmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGlmICh0aGlzLl9mb3JtYXRbaV0gPT09ICcrJyAvKicrJyovIHx8IHRoaXMuX2Zvcm1hdFtpXSA9PT0gJy0nLyonLScqLykge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9mb3JtYXRbaV0gPT09ICdcXFxcJyAvKidcXCcqLyB8fCB0aGlzLl9mb3JtYXRbaV0gPT09ICdQJy8qJ1AnKi8pIHtcclxuICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuX2Zvcm1hdFtpXSA9PT0gJ0MnLyonQycqLykge1xyXG4gICAgICAgIHRoaXMuX2NvbW1hID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlICh0aGlzLl9mb3JtYXRJZHggPCB0aGlzLl9mb3JtYXQubGVuZ3RoKSB7XHJcbiAgICAgIGN1cnJDaHIgPSB0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4XTtcclxuICAgICAgc3dpdGNoIChjdXJyQ2hyKSB7XHJcbiAgICAgICAgY2FzZSAnTic6XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIHRoaXMuX25lZ2F0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdDJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgdGhpcy5fY29tbWEgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ0wnOlxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICB0aGlzLl9sZWZ0ID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdQJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgdGhpcy5fcGFkRmlsbCA9IHRydWU7XHJcbiAgICAgICAgICBpZiAodGhpcy5fZm9ybWF0SWR4IDwgdGhpcy5fZm9ybWF0Lmxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5fcGFkID0gdGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeCsrXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdaJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgdGhpcy5femVyb0ZpbGwgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2Zvcm1hdElkeCA8IHRoaXMuX2Zvcm1hdC5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuX3plcm8gPSB0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4KytdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ0EnOlxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICB0aGlzLl9hdXRvU2tpcF8gPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJy4nOlxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICBpZiAodGhpcy5fbmVlZExlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5fbWFza0xlbmd0aCsrO1xyXG4gICAgICAgICAgdGhpcy5fZGVjaW1hbCA9IHRydWU7XHJcbiAgICAgICAgICBpZiAodGhpcy5fbWFza1NpemUgPCB0aGlzLl9tc2tMZW4pXHJcbiAgICAgICAgICAgIHRoaXMuX21za1t0aGlzLl9tYXNrU2l6ZV0gPSAgU3RyaW5nLmZyb21DaGFyQ29kZShQSUNJbnRlcmZhY2UuUElDX04pO1xyXG4gICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICAgIC8vIDI2LzExLzk3IFNoYXkgWi4gQnVnICM3NzA1MjYgLSBNYXJrIHRoYXRcclxuICAgICAgICAgIC8vIERlY2ltYWwgUG9pbnQgaXMgaW4gRmlyc3QgUG9zaXRpb246XHJcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgICAgaWYgKHRoaXMuX21hc2tTaXplID09PSAwKVxyXG4gICAgICAgICAgICB0aGlzLl9kZWNQb2ludElzRmlyc3QgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5fbWFza1NpemUrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICcrJzpcclxuICAgICAgICBjYXNlICctJzpcclxuICAgICAgICAgIHRoaXMucGlrX3NpZ24oKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KGN1cnJDaHIpIHx8IGN1cnJDaHIgPT09ICcjJykge1xyXG4gICAgICAgICAgICB0bXAgPSB0aGlzLl9mb3JtYXRJZHg7XHJcbiAgICAgICAgICAgIGlmIChjdXJyQ2hyID09PSAnIycpXHJcbiAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICAgIGNvdW50ID0gdGhpcy5waWtfY291bnQoKTtcclxuICAgICAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoUElDSW50ZXJmYWNlLlBJQ19OLCBjb3VudCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9mb3JtYXRbdG1wXSA9PT0gJyMnKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB0bXBzID0gdGhpcy5fZm9ybWF0SWR4O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0SWR4ID0gdG1wO1xyXG4gICAgICAgICAgICAgICAgdG1wX2MgPSB0aGlzLnBpa19kdXAoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCA9IHRtcHM7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChmaXJzdCAmJiAodG1wX2MgPiAwIHx8IGNvdW50ID4gMSkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDEpXHJcbiAgICAgICAgICAgICAgICAgIHRtcF9jID0gY291bnQ7XHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgY29tbWFzIGJlZm9yIHBsYWNlc1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbW1hICYmICF0aGlzLl9kZWNpbWFsKVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChQSUNJbnRlcmZhY2UuUElDX04sIE1hdGguZmxvb3IoKHRtcF9jIC0gMSkgLyAzKSk7XHJcbiAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBhZGQgY29tbWFzIGJlZm9yIHBsYWNlc1xyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9jb21tYSAmJiAhdGhpcy5fZGVjaW1hbClcclxuICAgICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChQSUNJbnRlcmZhY2UuUElDX04sIE1hdGguZmxvb3IoKGNvdW50IC0gMSkgLyAzKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVjaW1hbClcclxuICAgICAgICAgICAgICB0aGlzLl9kZWNpbWFsRGlnaXRzICs9IGNvdW50O1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdGhpcy5fd2hvbGUgKz0gY291bnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMucGlrX21hc2soKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4vLyBTdG9yZSB0aGUgbWF4aW1hbCBsZW5ndGggb2Ygc2lnbiBwcmVmaXggYW5kIHN1ZmZpeCBiZXR3ZWVuIG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZVxyXG4gICAgdGhpcy5fcHJlZkxlbiA9IHRoaXMuX3Bvc1ByZWYuTGVuZ3RoO1xyXG4gICAgdGhpcy5fc3VmZkxlbiA9IHRoaXMuX3Bvc1N1ZmYuTGVuZ3RoO1xyXG4gICAgaWYgKHRoaXMuX25lZ2F0aXZlKSB7XHJcbiAgICAgIGlmICh0aGlzLl9uZWdQcmVmLkxlbmd0aCA+IHRoaXMuX3ByZWZMZW4pIHtcclxuICAgICAgICB0aGlzLl9wcmVmTGVuID0gdGhpcy5fbmVnUHJlZi5MZW5ndGg7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuX25lZ1N1ZmYuTGVuZ3RoID4gdGhpcy5fc3VmZkxlbikge1xyXG4gICAgICAgIHRoaXMuX3N1ZmZMZW4gPSB0aGlzLl9uZWdTdWZmLkxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGZvciBhIGZvcm1hdCB3aXRob3V0IGRpZ2l0c1xyXG4gICAgaWYgKHRoaXMuX3dob2xlID09PSAwICYmIHRoaXMuX2RlY2ltYWxEaWdpdHMgPT09IDApIHtcclxuICAgICAgY291bnQgPSBQSUNJbnRlcmZhY2UuUElDX01BWF9NU0tfTEVOIC0gdGhpcy5fcHJlZkxlbiAtIHRoaXMuX3N1ZmZMZW47XHJcbiAgICAgIGlmICh0aGlzLl9tYXNrU2l6ZSA8IGNvdW50KSB7XHJcbiAgICAgICAgdGhpcy5fd2hvbGUgPSBjb3VudCAtIHRoaXMuX21hc2tTaXplO1xyXG4gICAgICAgIGlmICh0aGlzLl9jb21tYSlcclxuICAgICAgICAgIHRoaXMuX3dob2xlIC09IE1hdGguZmxvb3IodGhpcy5fd2hvbGUgLyA0KTtcclxuICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChQSUNJbnRlcmZhY2UuUElDX04sIHRoaXMuX3dob2xlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGFkZCBleHRyYSBmb3IgcHJlZi9zdWZmIGFuZCBjb21tYXNcclxuICAgIGlmICh0aGlzLl9jb21tYSkge1xyXG4gICAgICBjb3VudCA9IE1hdGguZmxvb3IoKHRoaXMuX3dob2xlIC0gMSkgLyAzKTtcclxuICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoUElDSW50ZXJmYWNlLlBJQ19OLCBjb3VudCk7XHJcbiAgICAgIC8vIHJlbW92ZSBjb21tYXMgcGxhY2VzXHJcbiAgICAgIHRoaXMuX21hc2tTaXplIC09IGNvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIGkgPSB0aGlzLl9wcmVmTGVuO1xyXG4gICAgaWYgKGkgPiAwICYmIHRoaXMuX21zayAhPSBudWxsKSB7XHJcbiAgICAgIGlmICgodGhpcy5fbWFza1NpemUgKyBpKSA8PSB0aGlzLl9tc2tMZW4pIHtcclxuICAgICAgICBmb3IgKGogPSB0aGlzLl9tYXNrU2l6ZSAtIDE7XHJcbiAgICAgICAgICAgICBqID49IDA7XHJcbiAgICAgICAgICAgICBqLS0pXHJcbiAgICAgICAgICB0aGlzLl9tc2tbaiArIGldID0gdGhpcy5fbXNrW2pdO1xyXG4gICAgICAgIC8vIG1lbXNldCAodGhpcy0+bXNrLCBQSUNfTiwgaSk7IC8vIE9yaWdpbmFsIExpbmVcclxuICAgICAgICBmb3IgKGogPSAwO1xyXG4gICAgICAgICAgICAgaiA8IGk7XHJcbiAgICAgICAgICAgICBqKyspXHJcbiAgICAgICAgICBpZiAodGhpcy5fbXNrICE9IG51bGwgJiYgaiA8IHRoaXMuX21zay5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuX21za1tqXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoUElDSW50ZXJmYWNlLlBJQ19OKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9tYXNrU2l6ZSArPSBpO1xyXG4gICAgfVxyXG4gICAgaSA9IHRoaXMuX3N1ZmZMZW47XHJcbiAgICBpZiAoaSA+IDAgJiYgdGhpcy5fbXNrICE9IG51bGwpIHtcclxuICAgICAgaWYgKHRoaXMuX21hc2tTaXplICsgdGhpcy5fc3VmZkxlbiA8PSB0aGlzLl9tc2tMZW4pXHJcbiAgICAgIC8vIG1lbXNldCAoJk1za1t0aGlzLT5waWMtPm1hc2tfc2l6ZV0sIFBJQ19OLCB0aGlzLT5waWMtPnN1ZmZfbGVuKTsgLy8gT3JpZ2luYWwgTGluZVxyXG4gICAgICAgIGZvciAoaiA9IDA7XHJcbiAgICAgICAgICAgICBqIDwgdGhpcy5fc3VmZkxlbjtcclxuICAgICAgICAgICAgIGorKylcclxuICAgICAgICAgIHRoaXMuX21za1t0aGlzLl9tYXNrU2l6ZSArIGpdID0gU3RyaW5nLmZyb21DaGFyQ29kZShQSUNJbnRlcmZhY2UuUElDX04pO1xyXG4gICAgICB0aGlzLl9tYXNrU2l6ZSArPSBpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldFVuZm9ybWF0dGVkTnVtZXJpY1BpYyBmcm9tIGN1cnJlbnQgcGljXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgZ2V0VW5mb3JtYXR0ZWROdW1lcmljUGljKCk6IFBJQyB7XHJcbiAgICBsZXQgcGljU3RyID0gJyc7XHJcbiAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpXHJcbiAgICAgIHBpY1N0ciA9IHRoaXMuaXNOZWdhdGl2ZSgpID8gJ04nOiAnJztcclxuXHJcbiAgICBwaWNTdHIgKz0gdGhpcy5nZXRXaG9sZXMoKS50b1N0cmluZygpO1xyXG5cclxuICAgIGlmICh0aGlzLmdldERlYygpID4gMClcclxuICAgICAgcGljU3RyICs9ICAnLicgKyB0aGlzLmdldERlYygpLnRvU3RyaW5nKCk7XHJcbiAgICBpZiAodGhpcy5femVyb0ZpbGwpXHJcbiAgICAgIHBpY1N0ciArPSAnWic7XHJcbiAgICBsZXQgIG5ld1BpYyA9IG5ldyBQSUMgKHBpY1N0ciwgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDLCAwKTtcclxuXHJcbiAgICByZXR1cm4gbmV3UGljO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFBhcnNlIGEgZGF0ZSBwaWN0dXJlIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBkYXRlX3Bycyhjb21wSWR4OiBudW1iZXIpIHtcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBPcmlnaW5hbCB2YXJzXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBvY3I6IG51bWJlcjtcclxuICAgIGxldCBjb3VudDogbnVtYmVyO1xyXG4gICAgbGV0IGRydjogbnVtYmVyID0gMDtcclxuICAgIGxldCBTd2l0Y2hBbmRFeHBhbmREYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgU1dFeHBhbmREYXRlQ2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBBZGRlZCB2YXJzXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgbGV0IGN1cnJDaHI6IHN0cmluZztcclxuICAgIGxldCBpc0pwbkVyYVllYXI6IGJvb2xlYW4gPSBmYWxzZTsgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgdGhpcy5femVybyA9ICcgJztcclxuICAgIG9jciA9IDA7XHJcblxyXG4gICAgaWYgKHRoaXMuX2Zvcm1hdC5sZW5ndGggPT09IDAgfHwgdGhpcy5fZm9ybWF0WzBdID09PSAnXFwwJylcclxuICAgICAgdGhpcy5fZm9ybWF0ID0gTlN0cmluZy5Ub0NoYXJBcnJheShQSUMuZ2V0RGVmYXVsdERhdGVNYXNrKEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldERhdGVNb2RlKGNvbXBJZHgpKSk7XHJcblxyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLl9mb3JtYXQubGVuZ3RoOyBqKyspXHJcbiAgICAgIGlmICh0aGlzLl9mb3JtYXRbal0gPT09ICdIJylcclxuICAgICAgICB0aGlzLnNldEhlYnJldygpO1xyXG5cclxuICAgIHdoaWxlICh0aGlzLl9mb3JtYXRJZHggPCB0aGlzLl9mb3JtYXQubGVuZ3RoKSB7XHJcbiAgICAgIGN1cnJDaHIgPSB0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4XTtcclxuICAgICAgc3dpdGNoIChjdXJyQ2hyKSB7XHJcbiAgICAgICAgY2FzZSAnSCc6XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdaJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgdGhpcy5femVyb0ZpbGwgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2Zvcm1hdElkeCA8IHRoaXMuX2Zvcm1hdC5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuX3plcm8gPSB0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4KytdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ1QnOlxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICB0aGlzLl90cmltID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdBJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgdGhpcy5fYXV0b1NraXBfID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdMJzpcclxuICAgICAgICAgIGlmICh0aGlzLmhlYnJldykge1xyXG4gICAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoUElDSW50ZXJmYWNlLlBJQ19ITCwgMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMucGlrX21hc2soKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdZJzpcclxuICAgICAgICAgIGNvdW50ID0gdGhpcy5waWtfZHVwKCk7XHJcbiAgICAgICAgICBkcnYgPSAwO1xyXG4gICAgICAgICAgaSA9IGNvdW50O1xyXG4gICAgICAgICAgc3dpdGNoIChjb3VudCkge1xyXG4gICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmhlYnJldylcclxuICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfWVk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmhlYnJldylcclxuICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfWVlZWTtcclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX0hZWVlZWTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgNTpcclxuICAgICAgICAgICAgY2FzZSA2OlxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmhlYnJldylcclxuICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfSFlZWVlZO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGRydiAhPT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9mb3JtYXRJZHggKz0gY291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKGRydiwgaSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMucGlrX21hc2soKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdNJzpcclxuICAgICAgICAgIGNvdW50ID0gdGhpcy5waWtfZHVwKCk7XHJcbiAgICAgICAgICBkcnYgPSAwO1xyXG4gICAgICAgICAgaWYgKGNvdW50ID09PSAyKVxyXG4gICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX01NRDtcclxuICAgICAgICAgIGVsc2UgaWYgKGNvdW50ID4gMikge1xyXG4gICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX01NTTtcclxuICAgICAgICAgICAgaWYgKGNvdW50ID4gMTApXHJcbiAgICAgICAgICAgICAgZHJ2ID0gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChkcnYgIT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fZm9ybWF0SWR4ICs9IGNvdW50O1xyXG4gICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChkcnYsIGNvdW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5waWtfbWFzaygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ0QnOlxyXG4gICAgICAgICAgY291bnQgPSB0aGlzLnBpa19kdXAoKTtcclxuICAgICAgICAgIGRydiA9IDA7XHJcbiAgICAgICAgICBzd2l0Y2ggKGNvdW50KSB7XHJcbiAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuaGVicmV3KSB7XHJcbiAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX0REO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvKiAgZmFsbHMgdGhyb3VnaCAqL1xyXG4gICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmhlYnJldylcclxuICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfREREO1xyXG4gICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfSEREO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5oZWJyZXcpXHJcbiAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX0REREQ7XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWtfbWFzaygpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICB0aGlzLnBpa19tYXNrKCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZHJ2ICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKGRydiwgY291bnQpO1xyXG4gICAgICAgICAgICB0aGlzLl9mb3JtYXRJZHggKz0gY291bnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnIyc6XHJcbiAgICAgICAgICBjb3VudCA9IHRoaXMucGlrX2R1cCgpO1xyXG4gICAgICAgICAgaWYgKGNvdW50ID09PSAyKSB7XHJcbiAgICAgICAgICAgIGRydiA9IDA7XHJcbiAgICAgICAgICAgIG9jcisrO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaGVicmV3KVxyXG4gICAgICAgICAgICAgIHN3aXRjaCAoR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RGF0ZU1vZGUoY29tcElkeCkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0InOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnRSc6XHJcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAob2NyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19ERDtcclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX01NRDtcclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX1lZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnQSc6XHJcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAob2NyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19NTUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19ERDtcclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX1lZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnSic6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdTJzpcclxuICAgICAgICAgICAgICAgICAgc3dpdGNoIChvY3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIVNXRXhwYW5kRGF0ZUNoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZm9ybWF0XyBjb250YWlucyBcIiMjIyNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hBbmRFeHBhbmREYXRlID0gTlN0cmluZy5Gcm9tQ2hhcnModGhpcy5fZm9ybWF0KS5pbmRleE9mKFwiIyMjI1wiKSA+IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBTV0V4cGFuZERhdGVDaGVja2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChTd2l0Y2hBbmRFeHBhbmREYXRlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChQSUNJbnRlcmZhY2UuUElDX1lZWVksIDQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX1lZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfTU1EO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgICAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfREQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkcnYgIT09IDApXHJcbiAgICAgICAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoZHJ2LCAyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGNvdW50ID09PSA0KSB7XHJcbiAgICAgICAgICAgIGRydiA9IDA7XHJcbiAgICAgICAgICAgIG9jcisrO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaGVicmV3KVxyXG4gICAgICAgICAgICAgIHN3aXRjaCAoR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RGF0ZU1vZGUoY29tcElkeCkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0InOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnRSc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdBJzpcclxuICAgICAgICAgICAgICAgICAgaWYgKG9jciA9PT0gMylcclxuICAgICAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX1lZWVk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0onOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnUyc6XHJcbiAgICAgICAgICAgICAgICAgIGlmIChvY3IgPT09IDEpXHJcbiAgICAgICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19ZWVlZO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIVNXRXhwYW5kRGF0ZUNoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGZvcm1hdF8gY29udGFpbnMgXCIjIyMjXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaEFuZEV4cGFuZERhdGUgPSAgTlN0cmluZy5Gcm9tQ2hhcnModGhpcy5fZm9ybWF0KS5pbmRleE9mKFwiIyMjI1wiKSA+IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgU1dFeHBhbmREYXRlQ2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChTd2l0Y2hBbmRFeHBhbmREYXRlICYmIG9jciA9PT0gMylcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKFBJQ0ludGVyZmFjZS5QSUNfREQsIDIpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZHJ2ICE9PSAwKVxyXG4gICAgICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKGRydiwgNCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4ICs9IGNvdW50O1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlICdXJzpcclxuICAgICAgICAgIGNvdW50ID0gdGhpcy5waWtfZHVwKCk7XHJcbiAgICAgICAgICBpID0gY291bnQ7XHJcbiAgICAgICAgICBpZiAoY291bnQgPT09IDEpXHJcbiAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfVztcclxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaGVicmV3KVxyXG4gICAgICAgICAgICBpZiAoY291bnQgPT09IDUpXHJcbiAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19XV1c7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBpID0gMDtcclxuICAgICAgICAgIGVsc2UgaWYgKGNvdW50ID4gMiAmJiBjb3VudCA8PSAxMClcclxuICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19XV1c7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGkgPSAwO1xyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4ICs9IGNvdW50O1xyXG4gICAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoZHJ2LCBpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICcvJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RGF0ZSgpLmNoYXJDb2RlQXQoMCksIDEpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ1MnOiAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcblxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSkge1xyXG4gICAgICAgICAgICBjb3VudCA9IHRoaXMucGlrX2R1cCgpO1xyXG4gICAgICAgICAgICBpID0gY291bnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoY291bnQgIT09IDIgJiYgY291bnQgIT09IDQgJiYgY291bnQgIT09IDYpXHJcbiAgICAgICAgICAgICAgaSA9IDA7XHJcblxyXG4gICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX0JCO1xyXG4gICAgICAgICAgICB0aGlzLl9mb3JtYXRJZHggKz0gY291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKGRydiwgaSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5waWtfbWFzaygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ0onOiAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcblxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSkge1xyXG4gICAgICAgICAgICBjb3VudCA9IHRoaXMucGlrX2R1cCgpO1xyXG4gICAgICAgICAgICBpID0gY291bnQ7XHJcbiAgICAgICAgICAgIGlzSnBuRXJhWWVhciA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvdW50KSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19KWTE7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19KWTI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19KWTQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGkgPSAwO1xyXG4gICAgICAgICAgICAgICAgaXNKcG5FcmFZZWFyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fZm9ybWF0SWR4ICs9IGNvdW50O1xyXG4gICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChkcnYsIGkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucGlrX21hc2soKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHRoaXMucGlrX21hc2soKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLl9uZWVkTGVuZ3RoICYmIGlzSnBuRXJhWWVhcilcclxuLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAge1xyXG4gICAgICBmb3IgKGkgPSAwO1xyXG4gICAgICAgICAgIGkgPCB0aGlzLl9tc2subGVuZ3RoO1xyXG4gICAgICAgICAgIGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLl9tc2tbaV0uY2hhckNvZGVBdCgwKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZWSlcclxuICAgICAgICAgIHRoaXMuX21za1tpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIFBJQ0ludGVyZmFjZS5QSUNfWUopO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX21za1tpXS5jaGFyQ29kZUF0KDApID09PSBQSUNJbnRlcmZhY2UuUElDX1lZWVkpXHJcbiAgICAgICAgICB0aGlzLl9tc2tbaV0gPSAnWSc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBQYXJzZSBhIG51bWVyaWMgcGljdHVyZSBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgdGltZV9wcnMoKTogdm9pZCB7XHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gT3JpZ2luYWwgdmFyc1xyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIGxldCBkcnY6IG51bWJlcjtcclxuICAgIGxldCBOb0Zvcm1hdDogc3RyaW5nO1xyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEFkZGVkIHZhcnNcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBsZXQgY3VyckNocjogc3RyaW5nO1xyXG5cclxuICAgIHRoaXMuX3plcm8gPSAnICc7XHJcblxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIFVzZSBhIGRlZmF1bHQgZm9ybWF0LCBpZiBvbmUgaXMgbm90IHNwZWNpZmllZFxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIGlmICh0aGlzLl9mb3JtYXQubGVuZ3RoID09PSAwIHx8IHRoaXMuX2Zvcm1hdFswXS5jaGFyQ29kZUF0KDApID09PSAwKSB7XHJcbiAgICAgIE5vRm9ybWF0ID0gXCJISDpNTTpTU1wiO1xyXG4gICAgICBpZiAodGhpcy5fbXNrTGVuIDwgOClcclxuICAgICAgICBOb0Zvcm1hdCA9IE5vRm9ybWF0LnN1YnN0cigwLCB0aGlzLl9tc2tMZW4pOyAvLyBOb0Zvcm1hdFt0aGlzLT5tc2tfbGVuXSA9IDA7IC8vIE9yaWdpbmFsIExpbmVcclxuICAgICAgdGhpcy5fZm9ybWF0ID0gTlN0cmluZy5Ub0NoYXJBcnJheShOb0Zvcm1hdCk7XHJcbiAgICB9XHJcblxyXG4gICAgd2hpbGUgKHRoaXMuX2Zvcm1hdElkeCA8IHRoaXMuX2Zvcm1hdC5sZW5ndGgpIHtcclxuICAgICAgY3VyckNociA9IHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHhdO1xyXG5cclxuICAgICAgbGV0IG1hc2tMZW5ndGg6IG51bWJlcjtcclxuICAgICAgc3dpdGNoIChjdXJyQ2hyKSB7XHJcbiAgICAgICAgY2FzZSAnSCc6XHJcbiAgICAgICAgY2FzZSAnTSc6XHJcbiAgICAgICAgY2FzZSAnUyc6XHJcbiAgICAgICAgICBtYXNrTGVuZ3RoID0gMjtcclxuICAgICAgICAgIC8qIHdlIHBhcnNlICdIL00vUycgb25seSBpZiBpdCBoYXMgb25lIHNpbWlsYXIgY2hhcmFjdGVyIGFmdGVyIGl0IChpLmUuICdISCcvJ01NJy8nU1MnKSAqL1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2Zvcm1hdElkeCArIDEgPCB0aGlzLl9mb3JtYXQubGVuZ3RoICYmIHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHhdID09PSB0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4ICsgMV0pIHtcclxuICAgICAgICAgICAgc3dpdGNoIChjdXJyQ2hyKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAnSCc6XHJcbiAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX0hIO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGNhc2UgJ00nOlxyXG4gICAgICAgICAgICAgICAgZHJ2ID0gUElDSW50ZXJmYWNlLlBJQ19NTVQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgY2FzZSAnUyc6XHJcbiAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuUElDX1NTO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBkcnYgPSBQSUNJbnRlcmZhY2UuTlVMTF9DSEFSO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fZm9ybWF0SWR4ICs9IG1hc2tMZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKGRydiwgbWFza0xlbmd0aCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMucGlrX21hc2soKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdtJzpcclxuICAgICAgICAgIG1hc2tMZW5ndGggPSAzO1xyXG4gICAgICAgICAgLyogd2UgcGFyc2UgJ20nIG9ubHkgaWYgaXQgaGFzIDIgc2ltaWxhciBjaGFyYWN0ZXJzIGFmdGVyIGl0IChpLmUuICdtbW0nKSAqL1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2Zvcm1hdElkeCArIDIgPCB0aGlzLl9mb3JtYXQubGVuZ3RoICYmXHJcbiAgICAgICAgICAgICh0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4XSA9PT0gdGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeCArIDFdICYmXHJcbiAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeCArIDFdID09PSB0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4ICsgMl0pKSB7XHJcbiAgICAgICAgICAgIGRydiA9IFBJQ0ludGVyZmFjZS5QSUNfTVM7XHJcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCArPSBtYXNrTGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChkcnYsIG1hc2tMZW5ndGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnBpa19tYXNrKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnOic6XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFRpbWUoKS5jaGFyQ29kZUF0KDApLCAxKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdaJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgdGhpcy5femVyb0ZpbGwgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2Zvcm1hdElkeCA8IHRoaXMuX2Zvcm1hdC5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuX3plcm8gPSB0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4KytdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ0EnOlxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICB0aGlzLl9hdXRvU2tpcF8gPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ1AnOlxyXG4gICAgICAgICAgaWYgKHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHggKyAxXSA9PT0gJ00nKVxyXG4gICAgICAgICAgLy8gY2hhbmdlZCBmcm9tIGZvcm1hdF9bMV0gLT4gZm9ybWF0X1tmb3JtYXRJZHhfKzFdXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCArPSAyO1xyXG4gICAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChQSUNJbnRlcmZhY2UuUElDX1BNLCAyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5waWtfbWFzaygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aGlzLnBpa19tYXNrKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBQaWN0dXJlIGZvciB0aGUgdmFyaWFibGUgb2YgdGhlICd0eXBlJyB3aXRoICd2YWx1ZSdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidHlwZVwiPm9mIHRoZSBwaWN0dXJlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlXCI+aXMgbmVlZGVkIHRvIGJlIGV2YWx1YXRlZCB3aXRoIHRoZSBwaWN0dXJlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IFBJQ3R1cmUgb2YgdGhlIG5lZWRlZCAndHlwZSc8L3JldHVybnM+XHJcbiAgcHVibGljIHN0YXRpYyBidWlsZFBpY3R1cmUodHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgdmFsOiBzdHJpbmcsIGNvbXBJZHg6IG51bWJlciwgdXNlRGVjaW1hbDogYm9vbGVhbik6IFBJQyB7XHJcbiAgICBsZXQgcGljOiBQSUMgPSBudWxsO1xyXG4gICAgbGV0IG1hc2s6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMCk7XHJcbiAgICBsZXQgZGVjaW1hbFNlcGFyYXRvcjogc3RyaW5nO1xyXG4gICAgbGV0IHRob3VzYW5kczogc3RyaW5nO1xyXG4gICAgbGV0IGN1cnJDaGFyOiBzdHJpbmc7XHJcbiAgICBsZXQgY291bnRlcjogbnVtYmVyO1xyXG4gICAgbGV0IGxlbmd0aDogbnVtYmVyO1xyXG4gICAgbGV0IGJlZm9yZURlYzogbnVtYmVyO1xyXG4gICAgbGV0IGFmdGVyRGVjOiBudW1iZXI7XHJcbiAgICBsZXQgZGVjaW1hbERlbGltRm91bmQ6IGJvb2xlYW47XHJcbiAgICBsZXQgaXNUaG91c2FuZHNEZWxpbTogYm9vbGVhbjtcclxuICAgIGxldCBpc05lZ2F0aXZlOiBib29sZWFuO1xyXG5cclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgICBkZWNpbWFsU2VwYXJhdG9yID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RGVjaW1hbCgpO1xyXG4gICAgICAgIHRob3VzYW5kcyA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFRob3VzYW5kcygpO1xyXG4gICAgICAgIGJlZm9yZURlYyA9IGFmdGVyRGVjID0gMDtcclxuICAgICAgICBkZWNpbWFsRGVsaW1Gb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgIGlzVGhvdXNhbmRzRGVsaW0gPSBmYWxzZTtcclxuICAgICAgICBpc05lZ2F0aXZlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsLmxlbmd0aCA9PT0gMClcclxuICAgICAgICAgIGJlZm9yZURlYyA9IGFmdGVyRGVjID0gMTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxlbmd0aCA9IHZhbC5sZW5ndGg7XHJcbiAgICAgICAgICBjb3VudGVyID0gMDtcclxuXHJcbiAgICAgICAgICB3aGlsZSAoY291bnRlciA8IGxlbmd0aCkge1xyXG4gICAgICAgICAgICBjdXJyQ2hhciA9IHZhbFtjb3VudGVyXTtcclxuICAgICAgICAgICAgc3dpdGNoIChjdXJyQ2hhcikge1xyXG4gICAgICAgICAgICAgIGNhc2UgJysnOlxyXG4gICAgICAgICAgICAgIGNhc2UgJy0nOlxyXG4gICAgICAgICAgICAgICAgaXNOZWdhdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBpZiAodXNlRGVjaW1hbCAmJiBjdXJyQ2hhciA9PT0gZGVjaW1hbFNlcGFyYXRvcilcclxuICAgICAgICAgICAgICAgICAgZGVjaW1hbERlbGltRm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyckNoYXIgPT09IHRob3VzYW5kcylcclxuICAgICAgICAgICAgICAgICAgaXNUaG91c2FuZHNEZWxpbSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWNpbWFsRGVsaW1Gb3VuZClcclxuICAgICAgICAgICAgICAgICAgYWZ0ZXJEZWMrKztcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgYmVmb3JlRGVjKys7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb3VudGVyKys7XHJcbiAgICAgICAgICB9IC8vIGVuZCBvZiB3aGlsZSBmb3IgbG9va2luZyBpbiB0aGUgdmFsdWVcclxuXHJcbiAgICAgICAgICBtYXNrLkFwcGVuZChcIlwiICsgYmVmb3JlRGVjICsgZGVjaW1hbFNlcGFyYXRvciArIGFmdGVyRGVjKTtcclxuICAgICAgICAgIGlmIChpc05lZ2F0aXZlKVxyXG4gICAgICAgICAgICBtYXNrLkFwcGVuZCgnTicpO1xyXG4gICAgICAgICAgaWYgKGlzVGhvdXNhbmRzRGVsaW0pXHJcbiAgICAgICAgICAgIG1hc2suQXBwZW5kKCdDJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICAgIG1hc2suQXBwZW5kKHRoaXMuZ2V0RGVmYXVsdERhdGVNYXNrKEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldERhdGVNb2RlKGNvbXBJZHgpKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgbWFzay5BcHBlbmQoXCJISFwiICsgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0VGltZSgpICsgXCJNTVwiICsgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0VGltZSgpICsgXCJTU1wiKTtcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBFdmVudHMuV3JpdGVEZXZUb0xvZyhcIkV2ZW50LmJ1aWxkUGljdHVyZSgpIHRoZXJlIGlzIG5vIFBJQ1RVUkUgYnVpbGRpbmcgZm9yIHR5cGUgOlwiICsgdHlwZSArXHJcbiAgICAgICAgICBcIiBhbmQgdmFsdWUgOlwiICsgdmFsKTtcclxuICAgICAgICByZXR1cm4gcGljOyAvLyBudWxsLCB0aGUgUElDIGRpZG4ndCBidWlsZFxyXG4gICAgfVxyXG5cclxuICAgIHBpYyA9IG5ldyBQSUMobWFzay5Ub1N0cmluZygpLCB0eXBlLCBjb21wSWR4KTtcclxuICAgIHJldHVybiBwaWM7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBzZXQgSGVicmV3IHRvIHRydWVcclxuLy8vIDwvc3VtbWFyeT5cclxuICBzZXRIZWJyZXcoKTogdm9pZCB7XHJcbiAgICAvLyBEZWZlY3QgMTE2MjU4LiBTZXQgaGVicmV3IGZsYWcgb25seSBmb3IgaGVicmV3IG1nY29uc3QuXHJcbiAgICBpZiAoR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuTGFuZ3VhZ2UgPT09ICdIJylcclxuICAgICAgdGhpcy5oZWJyZXcgPSB0cnVlO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgZ2V0IGRlZmF1bHQgbWFzayBmb3IgRGF0ZSB0eXBlXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YU1vZGVcIj4tIGRhdGEgbW9kZSAoSixTLEIsRSxBKTwvcGFyYW0+XHJcbi8vLyA8cmV0dXJucz4gbWFzayBvZiBkZWZhdWx0IGRhdGU8L3JldHVybnM+XHJcbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXREZWZhdWx0RGF0ZU1hc2soZGF0YU1vZGU6IHN0cmluZykge1xyXG4gICAgbGV0IGZybXQ6IHN0cmluZztcclxuICAgIHN3aXRjaCAoZGF0YU1vZGUpIHtcclxuICAgICAgY2FzZSAnSic6XHJcbiAgICAgIGNhc2UgJ1MnOlxyXG4gICAgICAgIGZybXQgPSBcIiMjIyMvIyMvIyNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ0InOlxyXG4gICAgICBjYXNlICdFJzpcclxuICAgICAgY2FzZSAnQSc6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZnJtdCA9IFwiIyMvIyMvIyMjI1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZybXQ7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBQYXJzZSBhIG51bWVyaWMgcGljdHVyZSBmb3JtYXRcclxuLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGJvb2xfcHJzKCk6IHZvaWQge1xyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIE9yaWdpbmFsIHZhcnNcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBsZXQgY291bnQ6IG51bWJlcjsgLy8gQ291bnQgb2YgZGlyZXZ0aXZlIG9yIG1hc2sgY2hhcmFjdGVyXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gQWRkZWQgdmFyc1xyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIGxldCBjdXJyQ2hyOiBzdHJpbmc7XHJcblxyXG4gICAgd2hpbGUgKHRoaXMuX2Zvcm1hdElkeCA8IHRoaXMuX2Zvcm1hdC5sZW5ndGgpIHtcclxuICAgICAgY3VyckNociA9IHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHhdO1xyXG4gICAgICBzd2l0Y2ggKGN1cnJDaHIpIHtcclxuICAgICAgICBjYXNlICdIJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgdGhpcy5zZXRIZWJyZXcoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSAnQSc6XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIHRoaXMuX2F1dG9Ta2lwXyA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgJ1gnOlxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICBjb3VudCA9IHRoaXMucGlrX2NvdW50KCk7XHJcbiAgICAgICAgICB0aGlzLnBpa19kcnZfZmlsbChQSUNJbnRlcmZhY2UuUElDX1gsIGNvdW50KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChjdXJyQ2hyKSkge1xyXG4gICAgICAgICAgICBjb3VudCA9IHRoaXMucGlrX2NvdW50KCk7XHJcbiAgICAgICAgICAgIHRoaXMucGlrX2Rydl9maWxsKFBJQ0ludGVyZmFjZS5QSUNfWCwgY291bnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnBpa19tYXNrKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBGaWxsIGluIGFuIGVtcHR5IGZvcm1hdFxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIGlmICh0aGlzLl9tYXNrU2l6ZSA9PT0gMClcclxuICAgICAgdGhpcy5waWtfZHJ2X2ZpbGwoUElDSW50ZXJmYWNlLlBJQ19YLCB0aGlzLl9tc2tMZW4pO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgUGFyc2UgdGhlIHNpZ24gcHJlZml4L3N1ZmZpeCBmcm9tIHRoZSBmb3JtYXRcclxuLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHBpa19zaWduKCk6IHZvaWQge1xyXG4gICAgbGV0IHBvc1NpZ246IGJvb2xlYW47XHJcbiAgICBsZXQgc2lnblN0cjogU3RyaW5nQnVpbGRlcjtcclxuICAgIGxldCBjdXJyQ2hyOiBzdHJpbmc7XHJcblxyXG4gICAgcG9zU2lnbiA9IHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHhdID09PSAnKydcclxuICAgICAgPyB0cnVlXHJcbiAgICAgIDogZmFsc2U7XHJcbiAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuXHJcbiAgICBpZiAocG9zU2lnbilcclxuICAgICAgc2lnblN0ciA9IHRoaXMuX3Bvc1ByZWY7XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fbmVnUHJlZi5SZW1vdmUoMCwgdGhpcy5fbmVnUHJlZi5MZW5ndGgpO1xyXG4gICAgICBzaWduU3RyID0gdGhpcy5fbmVnUHJlZjtcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSAodGhpcy5fZm9ybWF0SWR4IDwgdGhpcy5fZm9ybWF0Lmxlbmd0aCkge1xyXG4gICAgICBjdXJyQ2hyID0gdGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeF07XHJcbiAgICAgIHN3aXRjaCAoY3VyckNocikge1xyXG4gICAgICAgIGNhc2UgJzsnOlxyXG4gICAgICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG5cclxuICAgICAgICBjYXNlICcsJzpcclxuICAgICAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgICAgICAgaWYgKHBvc1NpZ24pXHJcbiAgICAgICAgICAgIHNpZ25TdHIgPSB0aGlzLl9wb3NTdWZmO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBzaWduU3RyID0gdGhpcy5fbmVnU3VmZjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSAnXFxcXCc6XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIGlmICh0aGlzLl9mb3JtYXRJZHggPj0gdGhpcy5fZm9ybWF0Lmxlbmd0aClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgY3VyckNociA9IHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHhdO1xyXG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgc2lnblN0ci5BcHBlbmQoY3VyckNocik7XHJcbiAgICAgICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBQYXJzZSBhIG51bWJlciB3aGljaCBpcyBhIGNvdW50ZXIgb2Ygc3BlY2lmaWMgY2hhciBpbiB0aGUgZm9ybWF0XHJcbi8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBwaWtfY291bnQoKTogbnVtYmVyIHtcclxuICAgIGxldCBzcGVjaWFsVmFsTmV3UG9saWN5OiBib29sZWFuID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0U3BlY2lhbFZhbE5ld1BvbGljeSgpO1xyXG4gICAgbGV0IHZhbDogbnVtYmVyO1xyXG4gICAgbGV0IGlzRGlnaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICB2YWwgPSAwO1xyXG5cclxuICAgIHdoaWxlICh0aGlzLl9mb3JtYXRJZHggPCB0aGlzLl9mb3JtYXQubGVuZ3RoICYmIFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHhdKSkge1xyXG4gICAgICB2YWwgKj0gMTA7XHJcbiAgICAgIGlzRGlnaXQgPSB0cnVlO1xyXG4gICAgICB2YWwgKz0gdGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeF0uY2hhckNvZGVBdCgwKSAtICcwJy5jaGFyQ29kZUF0KDApO1xyXG4gICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsID4gMzIwMDApXHJcbiAgICAgIHZhbCA9IDMyMDAwO1xyXG4gICAgZWxzZSBpZiAodmFsIDw9IDApIHtcclxuICAgICAgLy8gSWYgIGZsYWcgU3BlY2lhbFZhbE5ld1BvbGljeSBpcyBzZXQsIHRoZW4gcGljdHVyZSBoYXZpbmcgd2hvbGUvZGVjIGFzIDAgZS5nLiAnMy4wJyBzaG91bGQgcmV0dXJuIGFzIDAuXHJcbiAgICAgIGlmIChzcGVjaWFsVmFsTmV3UG9saWN5ICYmIGlzRGlnaXQgJiYgdmFsID09PSAwKVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdmFsID0gMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsID4gSW50MzIuTWF4VmFsdWUpXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuU1RSX0VSUl9NQVhfVkFSX1NJWkUpKTtcclxuXHJcbiAgICByZXR1cm4gKHZhbCk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBGaWxsIGEgc3BlY2lmaWMgbWFzayBjaGFyYWN0ZXIgaW4gdGhlIG1hc2sgc3RyaW5nXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8cGFyYW0gbmFtZSA9IFwiZHJ2XCI+ICAgIFRoZSBtYXNrIGNoYXJhY3RlciB0byBmaWxsPC9wYXJhbT5cclxuLy8vIDxwYXJhbSBuYW1lID0gXCJjb3VudFwiPiAgTnVtYmVyIG9mIHRpbWVzIGZvciB0aGUgbWFzayBjaGFyYWN0ZXIgdG8gYXBlYXI8L3BhcmFtPlxyXG4gIHByaXZhdGUgcGlrX2Rydl9maWxsKGRydjogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcblxyXG4gICAgbGV0IE1za1o6IG51bWJlcjtcclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG5cclxuXHJcbiAgICBpZiAodGhpcy5fbmVlZExlbmd0aCkge1xyXG4gICAgICB0aGlzLl9tYXNrTGVuZ3RoICs9IGNvdW50O1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgTXNrWiA9IHRoaXMuX21hc2tTaXplO1xyXG4gICAgdGhpcy5fbWFza1NpemUgKz0gY291bnQ7XHJcblxyXG4gICAgaWYgKE1za1ogKyBjb3VudCA+IHRoaXMuX21za0xlbilcclxuICAgICAgY291bnQgPSB0aGlzLl9tc2tMZW4gLSBNc2taO1xyXG5cclxuICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgLy8gbWVtc2V0ICgmdGhpcy0+bXNrW3RoaXMuTXNrWl0sIChVY2hhcikgZHJ2LCBjb3VudCk7IC8vIE9yaWdpbmFsIExpbmVcclxuICAgICAgZm9yIChpID0gMDtcclxuICAgICAgICAgICBpIDwgY291bnQ7XHJcbiAgICAgICAgICAgaSsrKVxyXG4gICAgICAgIHRoaXMuX21za1tNc2taICsgaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGRydik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIFBhcnNlIGEgZ2VuZXJhbCBtYXNrIGNoYXJhY3RlclxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgcGlrX21hc2soKTogdm9pZCB7XHJcbiAgICBsZXQgY3VyckNocjogc3RyaW5nO1xyXG4gICAgbGV0IGNvdW50OiBudW1iZXI7XHJcblxyXG4gICAgaWYgKHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHhdID09PSAnXFxcXCcpXHJcbiAgICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG4gICAgaWYgKHRoaXMuX2Zvcm1hdElkeCA8IHRoaXMuX2Zvcm1hdC5sZW5ndGgpIHtcclxuICAgICAgY3VyckNociA9IHRoaXMuX2Zvcm1hdFt0aGlzLl9mb3JtYXRJZHhdO1xyXG4gICAgICB0aGlzLl9mb3JtYXRJZHgrKztcclxuICAgICAgY291bnQgPSB0aGlzLnBpa19jb3VudCgpO1xyXG4gICAgICB0aGlzLnBpa19kcnZfZmlsbChjdXJyQ2hyLmNoYXJDb2RlQXQoMCksIGNvdW50KTtcclxuICAgICAgdGhpcy5fbWFza0NoYXJzICs9IGNvdW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgQ291bnQgY29udGludWVzIG9jY3VycmVuY2VzIG9mIGEgbWFzayBjaGFyYWN0ZXIgaW4gdGhlIGZvcm1hdCBzdHJpbmdcclxuLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHBpa19kdXAoKTogbnVtYmVyIHtcclxuXHJcbiAgICBsZXQgZHVwQ291bnQgPSAxO1xyXG5cclxuICAgIGxldCBjOiBzdHJpbmc7XHJcblxyXG4gICAgbGV0IHRtcElkeCA9IHRoaXMuX2Zvcm1hdElkeDtcclxuXHJcbiAgICBjID0gdGhpcy5fZm9ybWF0W3RtcElkeF07XHJcbiAgICB0bXBJZHgrKztcclxuICAgIHdoaWxlICh0bXBJZHggPCB0aGlzLl9mb3JtYXQubGVuZ3RoICYmIGMgPT09IHRoaXMuX2Zvcm1hdFt0bXBJZHhdKSB7XHJcbiAgICAgIGR1cENvdW50Kys7XHJcbiAgICAgIHRtcElkeCsrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkdXBDb3VudDtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHNldCBJTUUgbW9kZSBkZXBlbmRzIG9uIEsgcGljdHVyZSAoSzAgLSBLOSlcclxuLy8vICAgKEpQTjogSU1FIHN1cHBvcnQpXHJcbi8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBwaWNfa2FuamkoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgY291bnQ7XHJcblxyXG4gICAgaWYgKHRoaXMuX2Zvcm1hdElkeCArIDEgPj0gdGhpcy5fZm9ybWF0Lmxlbmd0aClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICghVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQodGhpcy5fZm9ybWF0W3RoaXMuX2Zvcm1hdElkeCArIDFdKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHRoaXMuX2Zvcm1hdElkeCsrO1xyXG5cclxuICAgIGlmICh0aGlzLl9mb3JtYXRbdGhpcy5fZm9ybWF0SWR4XSA9PT0gJzAnKSAgLy8gSzBcclxuICAgIHtcclxuICAgICAgdGhpcy5faW1lTW9kZSA9IFV0aWxJbWVKcG4uSU1FX0ZPUkNFX09GRjtcclxuICAgICAgdGhpcy5fZm9ybWF0SWR4Kys7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY291bnQgPSB0aGlzLnBpa19jb3VudCgpO1xyXG4gICAgICBpZiAoMSA8PSBjb3VudCAmJiBjb3VudCA8PSA5KSAvLyBLMSAtIEs5XHJcbiAgICAgICAgdGhpcy5faW1lTW9kZSA9IGNvdW50O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBGaW5kIGxlbmd0aCBvZiB0aGUgcGljdHVyZSBhZnRlciBwYXJzaW5nIHRoZSBwaWN0dXJlXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8cmV0dXJucz4gbGVuZ3RoIG9mIHRoZSBwaWN0dXJlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0TWFza0xlbihjb21wSWR4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX25lZWRMZW5ndGggPSB0cnVlO1xyXG4gICAgdGhpcy5fbWFza0xlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9mb3JtYXRJZHggPSAwO1xyXG5cclxuICAgIHRoaXMucHJzX2FsbChjb21wSWR4KTtcclxuXHJcbiAgICAvLyBhZGQgcHJlZml4IGFuZCBzdWZmaXggbGVuZ3RoIHRvIHRoZSBtYXNrXHJcbiAgICBpZiAodGhpcy5fcGljQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDICYmICh0aGlzLl9wcmVmTGVuID4gMCB8fCB0aGlzLl9zdWZmTGVuID4gMCkpXHJcbiAgICAgIHRoaXMuX21hc2tMZW5ndGggKz0gKHRoaXMuX3ByZWZMZW4gKyB0aGlzLl9zdWZmTGVuKTtcclxuXHJcbiAgICB0aGlzLl9uZWVkTGVuZ3RoID0gZmFsc2U7XHJcbiAgICAvLyBpbml0IGZvciBuZXh0IHJ1bm5pbmcgOlxyXG4gICAgdGhpcy5fZm9ybWF0SWR4ID0gdGhpcy5fbWFza0NoYXJzID0gdGhpcy5fd2hvbGUgPSB0aGlzLl9kZWNpbWFsRGlnaXRzID0gdGhpcy5fc2l6ZSA9IHRoaXMuX21hc2tTaXplID0gdGhpcy5fcHJlZkxlbiA9IHRoaXMuX3N1ZmZMZW4gPSAwO1xyXG4gICAgdGhpcy5fcGFkID0gdGhpcy5femVybyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7XHJcbiAgICB0aGlzLmhlYnJldyA9IHRoaXMuX21peGVkID0gdGhpcy5fZW1iZWRlZCA9IHRoaXMuX25lZ2F0aXZlID0gdGhpcy5fY29tbWEgPSB0aGlzLl9sZWZ0ID0gdGhpcy5fcGFkRmlsbCA9IHRoaXMuX3plcm9GaWxsID0gdGhpcy5fdHJpbSA9IHRoaXMuX2F1dG9Ta2lwXyA9IHRoaXMuX2RlY2ltYWwgPSB0aGlzLl90ZXJtRmxhZyA9IHRoaXMuX2RlY1BvaW50SXNGaXJzdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5fcG9zUHJlZi5SZW1vdmUoMCwgdGhpcy5fcG9zUHJlZi5MZW5ndGgpO1xyXG4gICAgdGhpcy5fcG9zU3VmZi5SZW1vdmUoMCwgdGhpcy5fcG9zU3VmZi5MZW5ndGgpO1xyXG4gICAgdGhpcy5fbmVnUHJlZi5SZW1vdmUoMCwgdGhpcy5fbmVnUHJlZi5MZW5ndGgpO1xyXG4gICAgdGhpcy5fbmVnU3VmZi5SZW1vdmUoMCwgdGhpcy5fbmVnU3VmZi5MZW5ndGgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX21hc2tMZW5ndGg7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICByZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYW4gZW1iZWRlZCBjaGFyIGluIHRoZSBtYXNrIGluIGEgZ2l2dmVuIHBvc2l0aW9uLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLy8gPHBhcmFtIG5hbWUgPSBcInBvc1wiPjwvcGFyYW0+XHJcbi8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBwaWMgaXMgbWFzazwvcmV0dXJucz5cclxuICBwdWJsaWMgcGljSXNNYXNrKHBvczogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAocG9zIDwgMCB8fCBwb3MgPj0gdGhpcy5fbWFza0xlbmd0aClcclxuICAgICAgcG9zID0gMDtcclxuICAgIHJldHVybiB0aGlzLl9tc2tbcG9zXS5jaGFyQ29kZUF0KDApID4gUElDSW50ZXJmYWNlLlBJQ19NQVhfT1A7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcnMgdGlsbCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS5cclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxwYXJhbSBuYW1lID0gXCJtc2tQb3NcIj48L3BhcmFtPlxyXG4vLy8gPHBhcmFtIG5hbWUgPSBcImJ1ZlBvc1wiPjwvcGFyYW0+XHJcbi8vLyA8cGFyYW0gbmFtZSA9IFwiYnVmXCI+PC9wYXJhbT5cclxuLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXREaXJlY3RpdmVMZW4ocG9zOiBudW1iZXIpOiBudW1iZXI7XHJcbiAgZ2V0RGlyZWN0aXZlTGVuKG1za1BvczogbnVtYmVyLCBidWZQb3M6IG51bWJlciwgYnVmOiBzdHJpbmcpOiBudW1iZXI7XHJcbiAgZ2V0RGlyZWN0aXZlTGVuKHBvc09yTXNrUG9zOiBudW1iZXIsIGJ1ZlBvcz86IG51bWJlciwgYnVmPzogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXREaXJlY3RpdmVMZW5fMChwb3NPck1za1Bvcyk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLmdldERpcmVjdGl2ZUxlbl8xKHBvc09yTXNrUG9zLCBidWZQb3MsIGJ1Zik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJzIHRpbGwgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBvc1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBudW1iZXIgb2YgY2hhcnMgdGlsbCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldERpcmVjdGl2ZUxlbl8wKHBvczogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBjOiBzdHJpbmcgPSB0aGlzLl9tc2tbcG9zXTtcclxuICAgIGxldCBudW06IG51bWJlciA9IHBvcztcclxuICAgIHdoaWxlIChudW0gPCB0aGlzLl9tYXNrU2l6ZSAmJiBjID09PSB0aGlzLl9tc2tbbnVtXSkge1xyXG4gICAgICBudW0gPSBudW0gKyAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bSAtIHBvcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcnMgdGlsbCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibXNrUG9zXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ1ZlBvc1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJidWZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXREaXJlY3RpdmVMZW5fMShtc2tQb3M6IG51bWJlciwgYnVmUG9zOiBudW1iZXIsIGJ1Zjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBkcnY6IHN0cmluZyA9IHRoaXMuX21za1ttc2tQb3NdO1xyXG4gICAgbGV0IGN1cnJNc2tQb3M6IG51bWJlciA9IG1za1BvcztcclxuICAgIGxldCBjdXJyQnVmUG9zOiBudW1iZXIgPSBidWZQb3M7XHJcblxyXG4gICAgLy8gdGlsbCB0aGUgZW5kIG9mIHRoZSBtYXNrLCBpZiBtYXNrW3Bvc10gaGFzIHNhbWUgZGlyZWN0aXZlIGFzIG91cnMsIHRoaXMgaXMgdGhlIHNhbWUgc2VxdWVuY2UuXHJcbiAgICB3aGlsZSAoY3Vyck1za1BvcyA8IHRoaXMuX21hc2tTaXplICYmIGRydiA9PT0gdGhpcy5fbXNrW2N1cnJNc2tQb3NdKSB7XHJcbiAgICAgIC8vIElnbm9yZSB0aGUgY2hhbmdlIG9mIHNlcXVlbmNlIGlmIGl0IGlzIGluLWJldHdlZW4gYSBEQkNTIGNoYXIuXHJcbiAgICAgIC8vIElmIHRoZSBjdXJyZW50IGNoYXIgaXMgYSBGdWxsIFdpZHRoIGNoYXIsIHRoZW4gdGhlIG5leHQgbWFzayBiaXRcclxuICAgICAgLy8gaXMgYWN0dWFsbHkgbm90IHVzZWQuIFNvLCBpZ25vcmUgdGhhdCBiaXQgYW5kIG1vdmUgb24uXHJcbiAgICAgIGlmIChjdXJyQnVmUG9zIDwgYnVmLmxlbmd0aCAmJiBVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpICYmIHRoaXMuaXNBdHRyQWxwaGFPckRhdGUoKSkge1xyXG4gICAgICAgIGlmICghVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKGJ1ZltjdXJyQnVmUG9zKytdKSlcclxuICAgICAgICAgIGN1cnJNc2tQb3MrKztcclxuICAgICAgfVxyXG5cclxuICAgICAgY3Vyck1za1BvcysrO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJldHVybiBvbmx5IGhvdyBtYW55IGNoYXJzIHRvIHRoZSBlbmQsIGluY2x1ZGluZyBvdXIgcG9zLlxyXG4gICAgcmV0dXJuIChjdXJyTXNrUG9zIC0gbXNrUG9zKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGNoZWNrIGlmIGNoYXIgaXMgdmFsaWQgaW4gdGhlIGdpdmVuIG1hc2sgcG9zaXRpb25cclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxwYXJhbSBuYW1lID0gXCJjaGFyVG9WYWxpZGF0ZVwiPlxyXG4vLy8gPC9wYXJhbT5cclxuLy8vIDxwYXJhbSBuYW1lID0gXCJwb3NcIj5vZiBkaXJlY3RpdmUgbWFzayB0byBjaGVja1xyXG4vLy8gICBUaGUgcmV0dXJuZWQgY2hhciBtaWdodCBiZSBkaWZmZXJlbnQgdGhlbiB0aGUgY2hhciB0aGF0IHdhcyBjaGVja2VkLlxyXG4vLy8gICBUaGUgcmVhc29uIGlzIHRoYXQgJ1UnIGFuZCAnTCcgZGlyZWN0aXZlIG1pZ2h0IGNoYW5nZSBpdCwgYW5kIGluIG51bWVyaWMsXHJcbi8vLyAgIGRlY2ltYWwgc2VwYXJhdG9yIGFuZCB0aG91c2FuZCBzZXBhcmF0b3IgbWlnaHQgYmUgY2hhbmdlZCBhcyB3ZWxsIHdoaWxlIHR5cGluZy5cclxuLy8vIDwvcGFyYW0+XHJcbi8vLyA8cmV0dXJucz4gMCBpZiBub3QgdmFsaWQgb3IgYSBjaGFyIGlmIHZhbGlkLjwvcmV0dXJucz5cclxuICBwdWJsaWMgdmFsaWRhdGVDaGFyKGNoYXJUb1ZhbGlkYXRlOiBzdHJpbmcsIHBvczogbnVtYmVyKSB7XHJcbiAgICBsZXQgY2hhclJldHVybmVkID0gY2hhclRvVmFsaWRhdGU7XHJcbiAgICBpZiAocG9zID49IHRoaXMuZ2V0TWFza1NpemUoKSlcclxuICAgICAgcmV0dXJuIGNoYXJSZXR1cm5lZDtcclxuXHJcbiAgICAvLyB3ZSBuZWVkIHRvIHNraXAgYW55IGNoYXJhY3RlcnMgd2hpY2ggYXJlIGVtYmVkZWQgaW50byB0aGUgcGljdHVyZVxyXG4gICAgd2hpbGUgKHRoaXMucGljSXNNYXNrKHBvcykpXHJcbiAgICAgIHBvcysrO1xyXG5cclxuICAgIHN3aXRjaCAodGhpcy5fbXNrW3Bvc10uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVTpcclxuICAgICAgICBjaGFyUmV0dXJuZWQgPSBjaGFyVG9WYWxpZGF0ZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0w6XHJcbiAgICAgICAgY2hhclJldHVybmVkID0gY2hhclRvVmFsaWRhdGUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBpZiAoIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KGNoYXJUb1ZhbGlkYXRlKSlcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgUElDSW50ZXJmYWNlLk51bURpcmVjdGl2ZS5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21za1twb3NdLmNoYXJDb2RlQXQoMCkgPT09IFBJQ0ludGVyZmFjZS5OdW1EaXJlY3RpdmVbaV0pIHtcclxuICAgICAgICAgICAgICBjaGFyUmV0dXJuZWQgPSB0aGlzLmlzVmFsaWRJbk51bShjaGFyVG9WYWxpZGF0ZSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBjaGFyUmV0dXJuZWQ7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBDaGVja3Mgd2hldGhlciBhIG5vbiBkaWdpdCBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4gYSBudW1lcmljIG1hc2tcclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxwYXJhbSBuYW1lID0gXCJsZXR0ZXI6XCI+YSBjaGFyYWN0ZXIgdG8gYmUgY2hlY2tlZC48L3BhcmFtPlxyXG4vLy8gPHJldHVybnM+IDAgaWYgbm90IHZhbGlkLiBjaGFyIGlmIHZhbGlkLiBjaGFyIG1pZ2h0IGJlIGRpZmZlcmVudCB0aGVuIGxldHRlci48L3JldHVybnM+XHJcbiAgaXNWYWxpZEluTnVtKGxldHRlcjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBjaGFyUmV0ID0gJ1xcMCc7XHJcbiAgICBsZXQgZGVjaW1hbENoYXI6IHN0cmluZyA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldERlY2ltYWwoKTtcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgICAvKiAgcmVwbGFjZSAnLicgd2l0aCBhIGRpZmZlcmVudCBjaGFyIGZvciBudW1lcmljIHNlcGVyYXRvciBvbmx5IGlmXHJcbiAgICAqICBTcGVjaWFsTW9kaWZpZWREZWNpbWFsU2VwYXJhdG9yID0gWSovXHJcbiAgICAvLyBmb3IgbnVtZXJpYywgaWYgJy4nIHdhcyBlbnRlcmVkLCBjaGFuZ2UgaXQgdG8gdGhlIGVudiBzZXBlcmF0b3IuXHJcbiAgICAvLyAjOTMxNzg0OiBJZiBTcGVjaWFsTW9kaWZpZWREZWNpbWFsU2VwYXJhdG9yID0gWSB0aGVuIHJlcGxhY2UgJy4nIGJ5IGRlY2ltYWwgc2VwYXJhdG9yLlxyXG4gICAgaWYgKEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkNhblJlcGxhY2VEZWNpbWFsU2VwYXJhdG9yKCkgJiYgdGhpcy5pc0F0dHJOdW1lcmljKCkpXHJcbiAgICAgIGlmIChsZXR0ZXIgPT09ICcuJylcclxuICAgICAgICBsZXR0ZXIgPSBkZWNpbWFsQ2hhcjtcclxuXHJcbiAgICBzd2l0Y2ggKGxldHRlcikge1xyXG4gICAgICBjYXNlICcgJzpcclxuICAgICAgY2FzZSAnLSc6XHJcbiAgICAgIGNhc2UgJyonOlxyXG4gICAgICBjYXNlICcrJzpcclxuICAgICAgY2FzZSAnLyc6XHJcbiAgICAgICAgY2hhclJldCA9IGxldHRlcjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgLy8gdGhlIGVudiBkZWNpbWFsIHNlcGVyYXRvciBhbmQgdGhvdXNhbmRzIHNlcGVyYXRvciBhcmUgYWxzbyB2YWxpZFxyXG4gICAgICAgIGlmIChsZXR0ZXIgPT09IGRlY2ltYWxDaGFyIHx8IGxldHRlciA9PT0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0VGhvdXNhbmRzKCkpXHJcbiAgICAgICAgICBjaGFyUmV0ID0gbGV0dGVyO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjaGFyUmV0O1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgY2hlY2sgaWYgdGhlIGF0dHJpYnV0ZSBpcyBsb2dpY2FsXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHVibGljIGlzQXR0ckxvZ2ljYWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuX3BpY0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTik7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBjaGVjayBpZiB0aGUgYXR0cmlidXRlIGlzIG51bWVyaWNcclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwdWJsaWMgaXNBdHRyTnVtZXJpYygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5fcGljQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGNoZWNrIGlmIHRoZSBhdHRyaWJ1dGUgaXMgYWxwaGFcclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwdWJsaWMgaXNBdHRyQWxwaGEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuX3BpY0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEpO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgY2hlY2sgaWYgdGhlIGF0dHJpYnV0ZSBpcyB1bmljb2RlXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHVibGljIGlzQXR0clVuaWNvZGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuX3BpY0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBjaGVjayBpZiB0aGUgYXR0cmlidXRlIGlzIGFscGhhIG9yIGRhdGVcclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwdWJsaWMgaXNBdHRyQWxwaGFPckRhdGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuX3BpY0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHwgdGhpcy5fcGljQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGNoZWNrIGlmIHRoZSBhdHRyaWJ1dGUgaXMgdGltZSBvciBkYXRlXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHVibGljIGlzQXR0ckRhdGVPclRpbWUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuX3BpY0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSB8fCB0aGlzLl9waWNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUpO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgY2hlY2sgaWYgdGhlIGF0dHJpYnV0ZSBpcyBibG9iXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHVibGljIGlzQXR0ckJsb2IoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuX3BpY0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fFxyXG4gICAgICB0aGlzLl9waWNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGNoZWNrIGlmIHRoZSBtYXNrIGF0IGEgZ2l2ZW4gcG9zaXRpb24gaXMgbnVtZXJpY1xyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLy8gPHBhcmFtIG5hbWUgPSBcInBvc1wiPjwvcGFyYW0+XHJcbi8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHVibGljIGlzTnVtZXJpYyhwb3M6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX21zayBbcG9zXSA9PT0gU3RyaW5nLmZyb21DaGFyQ29kZShQSUNJbnRlcmZhY2UuUElDX04pO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgY2hlY2sgaWYgdGhlIG1hc2sgaXMgYWxsIFhcclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwdWJsaWMgaXNBbGxYKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLl9tc2tbMF0gPT09IFN0cmluZy5mcm9tQ2hhckNvZGUoUElDSW50ZXJmYWNlLlBJQ19YKSAmJiB0aGlzLmdldERpcmVjdGl2ZUxlbigwKSA9PT0gdGhpcy5fbWFza1NpemUpO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgY2hlY2sgaXMgbWFzayBhdCBwb3NpdGlvbiBwb3MgaXMgc2FtZSBhcyBwYXJhbWV0ZXIgbWFza1BpY1xyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLy8gPHBhcmFtIG5hbWUgPSBcInBvc1wiPjwvcGFyYW0+XHJcbi8vLyA8cGFyYW0gbmFtZSA9IFwibWFza1BpY1wiPjwvcGFyYW0+XHJcbi8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHVibGljIGlzTWFza1BpY0VxKHBvczogbnVtYmVyLCBtYXNrUGljOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9tc2tbcG9zXSA9PT0gU3RyaW5nLmZyb21DaGFyQ29kZShtYXNrUGljKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGNoZWNrIGlmIHRoZSBpbnB1dCBjaGFyIGlzIHZhbGlkIGZvciBsb2NhbCBBUzQwMCAoc3lzdGVtIGkpIHBpY3R1cmVzLlxyXG4vLy8gICAoREJDUyBTdXBwb3J0KVxyXG4vLy8gPC9zdW1tYXJ5PlxyXG4vLy8gPHBhcmFtIG5hbWUgPSBcImNoYXJUb1ZhbGlkYXRlXCI+PC9wYXJhbT5cclxuLy8vIDxwYXJhbSBuYW1lID0gXCJmaXJzdENoYXJcIj48L3BhcmFtPlxyXG4vLy8gPHBhcmFtIG5hbWUgPSBcInBvc1wiPjwvcGFyYW0+XHJcbi8vLyA8cmV0dXJucz4gMCBpZiBub3QgdmFsaWQgb3IgYSBjaGFyIGlmIHZhbGlkLjwvcmV0dXJucz5cclxuICBwdWJsaWMgaXNWYWxpZENoYXJfYXM0MDAoY2hhclRvVmFsaWRhdGU6IHN0cmluZywgZmlyc3RDaGFyOiBzdHJpbmcsIHBvczogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0ID0gdHJ1ZTtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuX21za1twb3NdLmNoYXJDb2RlQXQoMCkpIHtcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0o6XHJcbiAgICAgIC8vIG9ubHkgZnVsbC13aWR0aCBjaGFyYWN0ZXJzIGFyZSBhbGxvd2VkXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19HOlxyXG4gICAgICAgIHJldCA9ICFVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgoY2hhclRvVmFsaWRhdGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19UKTogLy8gbWl4dHVyZSBvZiBmdWxsLXdpZHRoIGFuZCBoYWxmLXdpZHRoIGlzIG5vdCBhbGxvd2VkXHJcbiAgICAgICAgaWYgKGZpcnN0Q2hhciA9PT0gJ1xceDAwMDAnKVxyXG4gICAgICAgICAgcmV0ID0gdHJ1ZTtcclxuICAgICAgICBlbHNlIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgoZmlyc3RDaGFyKSlcclxuICAgICAgICAgIHJldCA9IFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChjaGFyVG9WYWxpZGF0ZSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmV0ID0gIVV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChjaGFyVG9WYWxpZGF0ZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1MpOiAvLyBvbmx5IGhhbGYtd2lkdGggY2hhcmFjdGVycyBhcmUgYWxsb3dlZFxyXG4gICAgICAgIHJldCA9IFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChjaGFyVG9WYWxpZGF0ZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUgbGVuZ3RoXHJcbi8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TWluaW11bVZhbHVlTGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICBsZXQgbWluTGVuZ3RoID0gdGhpcy5nZXRNYXNrTGVuZ3RoKCk7XHJcblxyXG4gICAgLy8gdHJhdmVyc2UgZnJvbSByaWdodCB0aWxsIGEgdmFsaWQgbWFzayBjaGFyIGlzIGVuY291bnRlcmVkXHJcbiAgICB3aGlsZSAobWluTGVuZ3RoID4gMCAmJiAhdGhpcy5waWNJc01hc2sobWluTGVuZ3RoIC0gMSkpXHJcbiAgICAgIG1pbkxlbmd0aC0tO1xyXG5cclxuICAgIHJldHVybiBtaW5MZW5ndGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBcIntQaWN0dXJlOiBcIiArIHRoaXMuX2Zvcm1hdCArIFwifVwiO1xyXG4gIH1cclxufVxyXG4iXX0=
|