@magic-xpa/gui 4.1200.0-dev4120.13 → 4.1200.0-dev4120.130
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 +5712 -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/gui/MgControlBase.d.ts +0 -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,1739 +0,0 @@
|
|
|
1
|
-
import { Int32, NNumber, NString, NumberStyles, StringBuilder } from '@magic-xpa/mscorelib';
|
|
2
|
-
import { Constants, PICInterface, Randomizer, StorageAttribute, UtilStrByteMode } from '@magic-xpa/utils';
|
|
3
|
-
import { PIC } from '../gui/PIC';
|
|
4
|
-
import { Events } from '../../Events';
|
|
5
|
-
import { GuiEnvironment } from '../../GuiEnvironment';
|
|
6
|
-
export class NUM_TYPE {
|
|
7
|
-
static INT_ZERO_HEX = "00000000";
|
|
8
|
-
static NO_ROOM = -1;
|
|
9
|
-
static ZERO_FILL = -2;
|
|
10
|
-
static NUM_SIZE = 20;
|
|
11
|
-
static NUM_LONG_TYPE = -1;
|
|
12
|
-
static EXP_BIAS = 64;
|
|
13
|
-
static SIGN_MASK = -128;
|
|
14
|
-
COMMACHAR = ',';
|
|
15
|
-
DECIMALCHAR = '.';
|
|
16
|
-
SIGNIFICANT_NUM_SIZE = 0;
|
|
17
|
-
_data = new Int8Array(NUM_TYPE.NUM_SIZE);
|
|
18
|
-
set Data(value) {
|
|
19
|
-
this._data = value;
|
|
20
|
-
}
|
|
21
|
-
get Data() {
|
|
22
|
-
return this._data;
|
|
23
|
-
}
|
|
24
|
-
constructor(recordHexStrOrByteValOrDecStrOrNumFrom, offsetOrPic, lengthOrCompIdx) {
|
|
25
|
-
if (arguments.length === 0) {
|
|
26
|
-
this.constructor_0();
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
if (arguments.length === 1 && (recordHexStrOrByteValOrDecStrOrNumFrom === null || recordHexStrOrByteValOrDecStrOrNumFrom.constructor === String)) {
|
|
30
|
-
this.constructor_1(recordHexStrOrByteValOrDecStrOrNumFrom);
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
if (arguments.length === 3 && (recordHexStrOrByteValOrDecStrOrNumFrom === null || recordHexStrOrByteValOrDecStrOrNumFrom instanceof Int8Array) && (offsetOrPic === null || offsetOrPic.constructor === Number) && (lengthOrCompIdx === null || lengthOrCompIdx.constructor === Number)) {
|
|
34
|
-
this.constructor_2(recordHexStrOrByteValOrDecStrOrNumFrom, offsetOrPic, lengthOrCompIdx);
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
if (arguments.length === 1 && (recordHexStrOrByteValOrDecStrOrNumFrom === null || recordHexStrOrByteValOrDecStrOrNumFrom instanceof Int8Array)) {
|
|
38
|
-
this.constructor_3(recordHexStrOrByteValOrDecStrOrNumFrom);
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
if (arguments.length === 3 && (recordHexStrOrByteValOrDecStrOrNumFrom === null || recordHexStrOrByteValOrDecStrOrNumFrom.constructor === String) && (offsetOrPic === null || offsetOrPic instanceof PIC) && (lengthOrCompIdx === null || lengthOrCompIdx.constructor === Number)) {
|
|
42
|
-
this.constructor_4(recordHexStrOrByteValOrDecStrOrNumFrom, offsetOrPic, lengthOrCompIdx);
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
this.constructor_5(recordHexStrOrByteValOrDecStrOrNumFrom);
|
|
46
|
-
}
|
|
47
|
-
constructor_0() {
|
|
48
|
-
this.initConst();
|
|
49
|
-
this.NUM_ZERO();
|
|
50
|
-
}
|
|
51
|
-
constructor_1(recordHexStr) {
|
|
52
|
-
let i = 0;
|
|
53
|
-
let twoDigits;
|
|
54
|
-
this.initConst();
|
|
55
|
-
try {
|
|
56
|
-
for (i = 0; i < this.SIGNIFICANT_NUM_SIZE; i = i + 1) {
|
|
57
|
-
twoDigits = recordHexStr.substr(i * 2, 2);
|
|
58
|
-
this._data[i] = NUM_TYPE.toSByte(NNumber.Parse(twoDigits, NumberStyles.HexNumber));
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
catch (ex) {
|
|
62
|
-
Events.WriteWarningToLog(ex);
|
|
63
|
-
this.NUM_ZERO();
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
constructor_2(byteVal, offset, length) {
|
|
67
|
-
this.constructor_0();
|
|
68
|
-
for (let i = 0; i < length; i = i + 1) {
|
|
69
|
-
this._data[i] = byteVal[i + offset];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
constructor_3(byteVal) {
|
|
73
|
-
this.constructor_2(byteVal, 0, byteVal.length);
|
|
74
|
-
}
|
|
75
|
-
constructor_4(decStr, pic, compIdx) {
|
|
76
|
-
this.constructor_0();
|
|
77
|
-
this.from_a(decStr, pic, compIdx);
|
|
78
|
-
}
|
|
79
|
-
constructor_5(numFrom) {
|
|
80
|
-
this.initConst();
|
|
81
|
-
this._data = new Int8Array(numFrom._data.length);
|
|
82
|
-
for (let _ai = 0; _ai < this._data.length; ++_ai)
|
|
83
|
-
this._data[_ai] = numFrom._data[_ai];
|
|
84
|
-
}
|
|
85
|
-
toDisplayValue(pic) {
|
|
86
|
-
return this.to_a(pic);
|
|
87
|
-
}
|
|
88
|
-
initConst() {
|
|
89
|
-
let env = GuiEnvironment.Environment;
|
|
90
|
-
this.DECIMALCHAR = env.GetDecimal();
|
|
91
|
-
this.COMMACHAR = env.GetThousands();
|
|
92
|
-
this.SIGNIFICANT_NUM_SIZE = env.GetSignificantNumSize();
|
|
93
|
-
}
|
|
94
|
-
toXMLrecord() {
|
|
95
|
-
let hexStr = new StringBuilder(this.SIGNIFICANT_NUM_SIZE * 2);
|
|
96
|
-
let num;
|
|
97
|
-
if (this.NUM_IS_LONG())
|
|
98
|
-
num = 5;
|
|
99
|
-
else
|
|
100
|
-
num = this.SIGNIFICANT_NUM_SIZE;
|
|
101
|
-
for (let i = 0; i < this.SIGNIFICANT_NUM_SIZE; i++) {
|
|
102
|
-
if (i < num)
|
|
103
|
-
hexStr.Append(('0' + (this._data[i] & 0xFF).toString(16)).slice(-2));
|
|
104
|
-
else
|
|
105
|
-
hexStr.Append("00");
|
|
106
|
-
}
|
|
107
|
-
return hexStr.ToString().toUpperCase();
|
|
108
|
-
}
|
|
109
|
-
from_a(Alpha, pic, compIdx) {
|
|
110
|
-
let i;
|
|
111
|
-
let idx;
|
|
112
|
-
let dec;
|
|
113
|
-
let decs;
|
|
114
|
-
let digit;
|
|
115
|
-
let len;
|
|
116
|
-
let no_pic;
|
|
117
|
-
let Pos;
|
|
118
|
-
let SType;
|
|
119
|
-
let SPart;
|
|
120
|
-
let Signed;
|
|
121
|
-
let buf;
|
|
122
|
-
let mask = "";
|
|
123
|
-
let c;
|
|
124
|
-
let NgtvPrmt;
|
|
125
|
-
let Scan = "";
|
|
126
|
-
let Pbuf = "";
|
|
127
|
-
let is_negative;
|
|
128
|
-
let negStr;
|
|
129
|
-
let negPref;
|
|
130
|
-
let posPref;
|
|
131
|
-
let negSuff;
|
|
132
|
-
let posSuff;
|
|
133
|
-
let specialValNewPolicy = GuiEnvironment.Environment.GetSpecialValNewPolicy();
|
|
134
|
-
no_pic = (pic == null);
|
|
135
|
-
len = 0;
|
|
136
|
-
SType = false;
|
|
137
|
-
SPart = false;
|
|
138
|
-
if (!no_pic) {
|
|
139
|
-
mask = pic.getMask();
|
|
140
|
-
if (!specialValNewPolicy)
|
|
141
|
-
if (Alpha.length > pic.getMaskSize())
|
|
142
|
-
Alpha = Alpha.substr(0, pic.getMaskSize());
|
|
143
|
-
NgtvPrmt = pic.isNegative();
|
|
144
|
-
if (NgtvPrmt) {
|
|
145
|
-
negPref = pic.getNegPref_();
|
|
146
|
-
posPref = pic.getPosPref_();
|
|
147
|
-
negSuff = pic.getNegSuff_();
|
|
148
|
-
posSuff = pic.getPosSuff_();
|
|
149
|
-
if (negPref.length === posPref.length) {
|
|
150
|
-
if (negPref.length === 0 || negPref === posPref)
|
|
151
|
-
SPart = false;
|
|
152
|
-
else
|
|
153
|
-
SPart = true;
|
|
154
|
-
}
|
|
155
|
-
else
|
|
156
|
-
SPart = true;
|
|
157
|
-
if (SPart)
|
|
158
|
-
negStr = negPref;
|
|
159
|
-
else
|
|
160
|
-
negStr = negSuff;
|
|
161
|
-
if (negStr.length === 0)
|
|
162
|
-
SType = true;
|
|
163
|
-
else
|
|
164
|
-
SType = false;
|
|
165
|
-
if (SType)
|
|
166
|
-
Scan = (SPart ? posPref : posSuff);
|
|
167
|
-
else
|
|
168
|
-
Scan = (SPart ? negPref : negSuff);
|
|
169
|
-
len = Scan.length;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
pic = new PIC("", StorageAttribute.NUMERIC, compIdx);
|
|
174
|
-
NgtvPrmt = false;
|
|
175
|
-
}
|
|
176
|
-
dec = false;
|
|
177
|
-
decs = 0;
|
|
178
|
-
digit = 0;
|
|
179
|
-
Signed = 0;
|
|
180
|
-
for (idx = 0; idx < Alpha.length;) {
|
|
181
|
-
if (no_pic || (specialValNewPolicy && idx >= pic.getMaskSize()) || mask[idx] === String.fromCharCode(PICInterface.PIC_N)) {
|
|
182
|
-
c = Alpha[idx];
|
|
183
|
-
if (specialValNewPolicy) {
|
|
184
|
-
if (dec && decs === pic.getDec()) {
|
|
185
|
-
break;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
if (UtilStrByteMode.isDigit(c)) {
|
|
189
|
-
digit++;
|
|
190
|
-
Pbuf += c;
|
|
191
|
-
if (dec)
|
|
192
|
-
decs++;
|
|
193
|
-
}
|
|
194
|
-
else if (c === this.DECIMALCHAR) {
|
|
195
|
-
Pbuf += this.DECIMALCHAR;
|
|
196
|
-
dec = true;
|
|
197
|
-
}
|
|
198
|
-
else if (c !== this.COMMACHAR) {
|
|
199
|
-
if (NgtvPrmt && Signed === 0) {
|
|
200
|
-
Signed = 1;
|
|
201
|
-
for (i = idx, Pos = 0; i <= Alpha.length && Pos < len; i++) {
|
|
202
|
-
if (no_pic || mask[i] === String.fromCharCode(PICInterface.PIC_N)) {
|
|
203
|
-
c = Alpha[i];
|
|
204
|
-
if (c !== Scan[Pos]) {
|
|
205
|
-
if (c === '-' && !SType)
|
|
206
|
-
break;
|
|
207
|
-
if (c === '+' && SType)
|
|
208
|
-
break;
|
|
209
|
-
Signed = -1;
|
|
210
|
-
break;
|
|
211
|
-
}
|
|
212
|
-
Pos++;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
if (Pos > 0 && Pos < len)
|
|
216
|
-
Signed = -1;
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
if (idx === 0) {
|
|
220
|
-
if (pic.getNegPref_().length > 0)
|
|
221
|
-
if (Alpha.startsWith(pic.getNegPref_())) {
|
|
222
|
-
idx += pic.getNegPref_().length;
|
|
223
|
-
continue;
|
|
224
|
-
}
|
|
225
|
-
if (pic.getPosPref_().length > 0)
|
|
226
|
-
if (Alpha.startsWith(pic.getPosPref_())) {
|
|
227
|
-
idx += pic.getPosPref_().length;
|
|
228
|
-
continue;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
else {
|
|
232
|
-
if (pic.getNegSuff_().length > 0)
|
|
233
|
-
if (Alpha.endsWith(pic.getNegSuff_())) {
|
|
234
|
-
idx += pic.getNegSuff_().length;
|
|
235
|
-
continue;
|
|
236
|
-
}
|
|
237
|
-
if (pic.getPosSuff_().length > 0)
|
|
238
|
-
if (Alpha.endsWith(pic.getPosSuff_())) {
|
|
239
|
-
idx += pic.getPosSuff_().length;
|
|
240
|
-
continue;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
idx++;
|
|
247
|
-
}
|
|
248
|
-
if (Signed === 0 && SType)
|
|
249
|
-
Signed = 1;
|
|
250
|
-
is_negative = (Signed === 1 && !SType) || (Signed !== 1 && SType);
|
|
251
|
-
if (decs > 0 || digit > 9) {
|
|
252
|
-
buf = (is_negative ? '-' : ' ') + Pbuf;
|
|
253
|
-
this.num_4_a_std(buf);
|
|
254
|
-
}
|
|
255
|
-
else
|
|
256
|
-
this.NUM_4_LONG((is_negative ? -1 : 1) * this.a_2_long(Pbuf));
|
|
257
|
-
}
|
|
258
|
-
num_4_a_std(str) {
|
|
259
|
-
let digstr = "";
|
|
260
|
-
let diglen = 0;
|
|
261
|
-
let wholes = 0;
|
|
262
|
-
let decs = 0;
|
|
263
|
-
let isDec = false;
|
|
264
|
-
let isminus = false;
|
|
265
|
-
let pos;
|
|
266
|
-
for (pos = 0; pos < str.length; pos++) {
|
|
267
|
-
let c = str.charAt(pos);
|
|
268
|
-
if (UtilStrByteMode.isDigit(c)) {
|
|
269
|
-
if (diglen > 0 || c !== '0') {
|
|
270
|
-
diglen++;
|
|
271
|
-
digstr = digstr + c;
|
|
272
|
-
if (!isDec)
|
|
273
|
-
wholes++;
|
|
274
|
-
}
|
|
275
|
-
else if (isDec)
|
|
276
|
-
decs = decs + 1;
|
|
277
|
-
}
|
|
278
|
-
else if (c === this.DECIMALCHAR)
|
|
279
|
-
isDec = true;
|
|
280
|
-
else if (c === '-')
|
|
281
|
-
isminus = true;
|
|
282
|
-
}
|
|
283
|
-
this.NUM_ZERO();
|
|
284
|
-
if (diglen === 0)
|
|
285
|
-
return;
|
|
286
|
-
if (((wholes + decs) & 1) > 0) {
|
|
287
|
-
this._data[1] = NUM_TYPE.toSByte(digstr.charCodeAt(0) - '0'.charCodeAt(0));
|
|
288
|
-
pos = 1;
|
|
289
|
-
}
|
|
290
|
-
else
|
|
291
|
-
pos = 0;
|
|
292
|
-
let numptr = 1 + pos;
|
|
293
|
-
diglen = Math.min(diglen, (this.SIGNIFICANT_NUM_SIZE - 1) * 2 - pos);
|
|
294
|
-
while (pos < diglen) {
|
|
295
|
-
let digit1 = NUM_TYPE.toSByte((digstr.charCodeAt(pos++) - '0'.charCodeAt(0)));
|
|
296
|
-
let digit2 = NUM_TYPE.toSByte(((pos < diglen)
|
|
297
|
-
? (digstr.charCodeAt(pos++) - '0'.charCodeAt(0))
|
|
298
|
-
: '\0'.charCodeAt(0)));
|
|
299
|
-
this._data[numptr++] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(digit1) * 10 + NUM_TYPE.toUByte(digit2));
|
|
300
|
-
}
|
|
301
|
-
if (wholes > 0)
|
|
302
|
-
this._data[0] = NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + ((wholes + 1) >> 1));
|
|
303
|
-
else
|
|
304
|
-
this._data[0] = NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS - (decs >> 1));
|
|
305
|
-
if (isminus)
|
|
306
|
-
this._data[0] |= NUM_TYPE.SIGN_MASK;
|
|
307
|
-
}
|
|
308
|
-
NUM_4_LONG(longVal) {
|
|
309
|
-
let hexStr;
|
|
310
|
-
this.NUM_ZERO();
|
|
311
|
-
if (longVal !== 0) {
|
|
312
|
-
if (longVal < 0)
|
|
313
|
-
longVal = (0xFFFFFFFF + longVal + 1);
|
|
314
|
-
hexStr = longVal.toString(16);
|
|
315
|
-
if (longVal > 0)
|
|
316
|
-
hexStr = NUM_TYPE.INT_ZERO_HEX.substr(hexStr.length) + hexStr;
|
|
317
|
-
this._data[1] = NUM_TYPE.toSByte(parseInt(hexStr.substr(6, (8) - (6)), 16));
|
|
318
|
-
this._data[2] = NUM_TYPE.toSByte(parseInt(hexStr.substr(4, (6) - (4)), 16));
|
|
319
|
-
this._data[3] = NUM_TYPE.toSByte(parseInt(hexStr.substr(2, (4) - (2)), 16));
|
|
320
|
-
this._data[4] = NUM_TYPE.toSByte(parseInt(hexStr.substr(0, (2) - (0)), 16));
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
a_2_long(str) {
|
|
324
|
-
let n = 0;
|
|
325
|
-
for (let pos = 0; pos < str.length; pos++) {
|
|
326
|
-
if (UtilStrByteMode.isDigit(str.charAt(pos))) {
|
|
327
|
-
n = n * 10;
|
|
328
|
-
n = n + str.charCodeAt(pos) - '0'.charCodeAt(0);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
return n;
|
|
332
|
-
}
|
|
333
|
-
to_a(pic) {
|
|
334
|
-
return this.to_a_pic(pic);
|
|
335
|
-
}
|
|
336
|
-
to_a_pic(pic) {
|
|
337
|
-
let buf = new Array(128);
|
|
338
|
-
let remains;
|
|
339
|
-
let sign_n;
|
|
340
|
-
let pref_len;
|
|
341
|
-
let suff_len;
|
|
342
|
-
let pref_str;
|
|
343
|
-
let suff_str;
|
|
344
|
-
let str_pos;
|
|
345
|
-
let str_len;
|
|
346
|
-
let out_pos;
|
|
347
|
-
let out_buf;
|
|
348
|
-
let tmp_out_buf;
|
|
349
|
-
let pad;
|
|
350
|
-
let left;
|
|
351
|
-
let pfill;
|
|
352
|
-
let mask_chars;
|
|
353
|
-
let len;
|
|
354
|
-
let res;
|
|
355
|
-
let i;
|
|
356
|
-
let isOut;
|
|
357
|
-
let outVal;
|
|
358
|
-
len = pic.getMaskSize();
|
|
359
|
-
sign_n = (pic.isNegative() && this.num_is_neg() ? false : true);
|
|
360
|
-
pref_len = (sign_n ? pic.getPosPref_().length : pic.getNegPref_().length);
|
|
361
|
-
suff_len = (sign_n ? pic.getPosSuff_().length : pic.getNegSuff_().length);
|
|
362
|
-
left = pic.isLeft();
|
|
363
|
-
pfill = pic.padFill();
|
|
364
|
-
mask_chars = pic.getMaskChars();
|
|
365
|
-
outVal = NString.ToCharArray(pic.getMask().substr(0, len));
|
|
366
|
-
out_buf = ((left || (mask_chars > 0)) ? buf : outVal);
|
|
367
|
-
if (left) {
|
|
368
|
-
for (i = 0; i < out_buf.length; i++)
|
|
369
|
-
out_buf[i] = '0'.toLowerCase();
|
|
370
|
-
}
|
|
371
|
-
isOut = ((left || (mask_chars > 0)) ? false : true);
|
|
372
|
-
str_pos = pref_len;
|
|
373
|
-
str_len = len - pref_len - suff_len;
|
|
374
|
-
tmp_out_buf = out_buf.slice(str_pos, out_buf.length);
|
|
375
|
-
if (this.NUM_IS_LONG())
|
|
376
|
-
remains = this.num_l_2_str(this.NUM_LONG(), tmp_out_buf, str_len, pic);
|
|
377
|
-
else
|
|
378
|
-
remains = this.to_str(tmp_out_buf, str_len, pic);
|
|
379
|
-
for (i = str_pos; i < out_buf.length; i++)
|
|
380
|
-
out_buf[i] = tmp_out_buf[i - str_pos];
|
|
381
|
-
tmp_out_buf = null;
|
|
382
|
-
if (remains < mask_chars) {
|
|
383
|
-
res = new Array(len);
|
|
384
|
-
for (i = 0; i < len; i++)
|
|
385
|
-
res[i] = (remains === NUM_TYPE.ZERO_FILL ? pic.getZeroPad() : '*');
|
|
386
|
-
return NString.FromChars(res);
|
|
387
|
-
}
|
|
388
|
-
if (mask_chars > 0) {
|
|
389
|
-
remains -= mask_chars;
|
|
390
|
-
str_pos += mask_chars;
|
|
391
|
-
str_len -= mask_chars;
|
|
392
|
-
}
|
|
393
|
-
if (pfill) {
|
|
394
|
-
pad = pic.getPad();
|
|
395
|
-
if (left) {
|
|
396
|
-
for (i = 0; i < remains; i++)
|
|
397
|
-
out_buf[str_pos + str_len + i] = pad;
|
|
398
|
-
str_pos += remains;
|
|
399
|
-
}
|
|
400
|
-
else {
|
|
401
|
-
for (i = 0; i < remains; i++)
|
|
402
|
-
out_buf[str_pos + i] = pad;
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
else {
|
|
406
|
-
pad = ' ';
|
|
407
|
-
str_pos += remains;
|
|
408
|
-
str_len -= remains;
|
|
409
|
-
}
|
|
410
|
-
if (suff_len > 0) {
|
|
411
|
-
suff_str = sign_n ? pic.getPosSuff_() : pic.getNegSuff_();
|
|
412
|
-
if (suff_len === 1)
|
|
413
|
-
out_buf[str_pos + str_len] = suff_str[0];
|
|
414
|
-
else {
|
|
415
|
-
for (i = 0; i < suff_len; i++)
|
|
416
|
-
out_buf[str_pos + str_len + i] = suff_str[i];
|
|
417
|
-
}
|
|
418
|
-
str_len += suff_len;
|
|
419
|
-
}
|
|
420
|
-
if (pref_len > 0) {
|
|
421
|
-
str_pos -= pref_len;
|
|
422
|
-
str_len += pref_len;
|
|
423
|
-
pref_str = sign_n ? pic.getPosPref_() : pic.getNegPref_();
|
|
424
|
-
if (pref_len === 1)
|
|
425
|
-
out_buf[str_pos] = pref_str[0];
|
|
426
|
-
else
|
|
427
|
-
for (i = 0; i < pref_len; i++)
|
|
428
|
-
out_buf[str_pos + i] = pref_str[i];
|
|
429
|
-
}
|
|
430
|
-
if (!pfill) {
|
|
431
|
-
let outBufLen = out_buf.length;
|
|
432
|
-
if (left) {
|
|
433
|
-
for (i = 0; i < remains && (str_pos + str_len + i < outBufLen); i++)
|
|
434
|
-
out_buf[str_pos + str_len + i] = pad;
|
|
435
|
-
}
|
|
436
|
-
else {
|
|
437
|
-
str_pos -= remains;
|
|
438
|
-
for (i = 0; i < remains && (str_pos + i < outBufLen); i++)
|
|
439
|
-
out_buf[str_pos + i] = pad;
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
if (isOut)
|
|
443
|
-
return NString.FromChars(out_buf);
|
|
444
|
-
if (mask_chars === 0) {
|
|
445
|
-
if (str_pos + len > out_buf.length)
|
|
446
|
-
len = out_buf.length - str_pos;
|
|
447
|
-
return NString.FromChars(out_buf, str_pos, len);
|
|
448
|
-
}
|
|
449
|
-
for (out_pos = 0; out_pos < len && str_pos < out_buf.length; out_pos++)
|
|
450
|
-
if (outVal[out_pos] === String.fromCharCode(PICInterface.PIC_N))
|
|
451
|
-
outVal[out_pos] = out_buf[str_pos++];
|
|
452
|
-
return NString.FromChars(outVal);
|
|
453
|
-
}
|
|
454
|
-
num_l_2_str(num, str, len, pic) {
|
|
455
|
-
let commas;
|
|
456
|
-
let digits;
|
|
457
|
-
let i;
|
|
458
|
-
let decs;
|
|
459
|
-
let j;
|
|
460
|
-
if (num < 0)
|
|
461
|
-
num = -num;
|
|
462
|
-
commas = pic.withComa();
|
|
463
|
-
decs = Math.min(pic.getDec(), len - 1);
|
|
464
|
-
if (decs > 0)
|
|
465
|
-
len -= (decs + 1);
|
|
466
|
-
i = len;
|
|
467
|
-
if (num === 0 && !pic.decInFirstPos()) {
|
|
468
|
-
if (pic.zeroFill())
|
|
469
|
-
return (NUM_TYPE.ZERO_FILL);
|
|
470
|
-
if (len === 0)
|
|
471
|
-
return (NUM_TYPE.NO_ROOM);
|
|
472
|
-
if (i > str.length)
|
|
473
|
-
i = str.length;
|
|
474
|
-
str[--i] = '0';
|
|
475
|
-
}
|
|
476
|
-
if (decs > 0) {
|
|
477
|
-
str[len] = this.DECIMALCHAR;
|
|
478
|
-
for (j = 0; j < decs; j++)
|
|
479
|
-
str[len + 1 + j] = '0';
|
|
480
|
-
}
|
|
481
|
-
digits = 0;
|
|
482
|
-
for (; num > 0; num = Math.floor(num / 10)) {
|
|
483
|
-
i--;
|
|
484
|
-
if (commas) {
|
|
485
|
-
if (digits === 3) {
|
|
486
|
-
if (i < 0)
|
|
487
|
-
return (NUM_TYPE.NO_ROOM);
|
|
488
|
-
digits = 0;
|
|
489
|
-
str[i--] = this.COMMACHAR;
|
|
490
|
-
}
|
|
491
|
-
digits++;
|
|
492
|
-
}
|
|
493
|
-
if (i < 0)
|
|
494
|
-
return (NUM_TYPE.NO_ROOM);
|
|
495
|
-
str[i] = ((num % 10).toString());
|
|
496
|
-
}
|
|
497
|
-
return i;
|
|
498
|
-
}
|
|
499
|
-
to_str(str, len, pic) {
|
|
500
|
-
let tmp;
|
|
501
|
-
let commas;
|
|
502
|
-
let digits;
|
|
503
|
-
let decpos;
|
|
504
|
-
let last;
|
|
505
|
-
let first;
|
|
506
|
-
let j;
|
|
507
|
-
let i;
|
|
508
|
-
let decs;
|
|
509
|
-
let num_char;
|
|
510
|
-
commas = pic.withComa();
|
|
511
|
-
decs = pic.getDec();
|
|
512
|
-
if (decs >= len)
|
|
513
|
-
decs = len - 1;
|
|
514
|
-
tmp = new NUM_TYPE(this);
|
|
515
|
-
tmp.round(decs);
|
|
516
|
-
if (tmp.NUM_IS_LONG())
|
|
517
|
-
return tmp.num_l_2_str(tmp.NUM_LONG(), str, len, pic);
|
|
518
|
-
if (pic.zeroFill() && tmp._data[0] === 0)
|
|
519
|
-
return (NUM_TYPE.ZERO_FILL);
|
|
520
|
-
i = len - 1;
|
|
521
|
-
digits = 0;
|
|
522
|
-
decpos = ((tmp._data[0] & ~NUM_TYPE.SIGN_MASK) - NUM_TYPE.EXP_BIAS + 1) * 2;
|
|
523
|
-
last = decpos - 1 + decs;
|
|
524
|
-
first = decpos - 1;
|
|
525
|
-
if (first > 2)
|
|
526
|
-
first = (tmp._data[1] < 10) ? 3 : 2;
|
|
527
|
-
for (j = last; j >= first; j--) {
|
|
528
|
-
if (i < 0)
|
|
529
|
-
return (NUM_TYPE.NO_ROOM);
|
|
530
|
-
if (commas && (j < decpos)) {
|
|
531
|
-
if (digits === 3) {
|
|
532
|
-
digits = 0;
|
|
533
|
-
str[i--] = this.COMMACHAR;
|
|
534
|
-
}
|
|
535
|
-
digits++;
|
|
536
|
-
}
|
|
537
|
-
if (i < 0)
|
|
538
|
-
return (NUM_TYPE.NO_ROOM);
|
|
539
|
-
if ((j < 2) || (j >= this.SIGNIFICANT_NUM_SIZE * 2))
|
|
540
|
-
str[i--] = '0';
|
|
541
|
-
else {
|
|
542
|
-
if (i < 0)
|
|
543
|
-
return (NUM_TYPE.NO_ROOM);
|
|
544
|
-
num_char = tmp._data[j >> 1];
|
|
545
|
-
str[i--] = (((j & 1) !== 0) ? (num_char % 10) : (Math.floor(num_char / 10))).toString();
|
|
546
|
-
}
|
|
547
|
-
if (j === decpos) {
|
|
548
|
-
if (i < 0)
|
|
549
|
-
return (NUM_TYPE.NO_ROOM);
|
|
550
|
-
str[i--] = this.DECIMALCHAR;
|
|
551
|
-
if (i < 0 && pic.decInFirstPos())
|
|
552
|
-
return (0);
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
return (i + 1);
|
|
556
|
-
}
|
|
557
|
-
static add(num1, num2) {
|
|
558
|
-
let sign1;
|
|
559
|
-
let sign2;
|
|
560
|
-
let l;
|
|
561
|
-
let l1;
|
|
562
|
-
let l2;
|
|
563
|
-
let SIGNIFICANT_NUM_SIZE;
|
|
564
|
-
if (num1 === null || num2 === null)
|
|
565
|
-
return null;
|
|
566
|
-
SIGNIFICANT_NUM_SIZE = GuiEnvironment.Environment.GetSignificantNumSize();
|
|
567
|
-
let tmpres = new NUM_TYPE();
|
|
568
|
-
let res = new NUM_TYPE();
|
|
569
|
-
let operData = new OperData();
|
|
570
|
-
if (num1.NUM_IS_LONG()) {
|
|
571
|
-
if (num2.NUM_IS_LONG()) {
|
|
572
|
-
l = l1 = num1.NUM_LONG();
|
|
573
|
-
if (l < 0)
|
|
574
|
-
l = -l;
|
|
575
|
-
if (l < 0x40000000) {
|
|
576
|
-
l = l2 = num2.NUM_LONG();
|
|
577
|
-
if (l < 0)
|
|
578
|
-
l = -l;
|
|
579
|
-
if (l < 0x40000000) {
|
|
580
|
-
l1 += l2;
|
|
581
|
-
res.NUM_4_LONG(l1);
|
|
582
|
-
return res;
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
num2.num_4_std_long();
|
|
586
|
-
}
|
|
587
|
-
num1.num_4_std_long();
|
|
588
|
-
}
|
|
589
|
-
else if (num2.NUM_IS_LONG())
|
|
590
|
-
num2.num_4_std_long();
|
|
591
|
-
sign1 = NUM_TYPE.toSByte(num1._data[0] & NUM_TYPE.SIGN_MASK);
|
|
592
|
-
operData.NUM_Exp1_ = NUM_TYPE.toSByte(num1._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
593
|
-
sign2 = NUM_TYPE.toSByte(num2._data[0] & NUM_TYPE.SIGN_MASK);
|
|
594
|
-
operData.NUM_Exp2_ = NUM_TYPE.toSByte(num2._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
595
|
-
operData.NUM_Diff_ = (operData.NUM_Exp1_ - operData.NUM_Exp2_);
|
|
596
|
-
let cmpval = operData.NUM_Diff_;
|
|
597
|
-
if (cmpval === 0) {
|
|
598
|
-
cmpval = NUM_TYPE.toUByte(num1._data[1]) - NUM_TYPE.toUByte(num2._data[1]);
|
|
599
|
-
if (cmpval === 0)
|
|
600
|
-
cmpval = NUM_TYPE.memcmp(num1, 2, num2, 2, SIGNIFICANT_NUM_SIZE - 2);
|
|
601
|
-
}
|
|
602
|
-
if (cmpval >= 0) {
|
|
603
|
-
if (sign1 === sign2)
|
|
604
|
-
tmpres = NUM_TYPE.add_pos(num1, num2, operData);
|
|
605
|
-
else
|
|
606
|
-
tmpres = NUM_TYPE.sub_pos(num1, num2, operData);
|
|
607
|
-
if (tmpres._data[0] !== 0)
|
|
608
|
-
tmpres._data[0] = NUM_TYPE.toSByte(tmpres._data[0] | sign1);
|
|
609
|
-
}
|
|
610
|
-
else {
|
|
611
|
-
let exp = operData.NUM_Exp1_;
|
|
612
|
-
operData.NUM_Exp1_ = operData.NUM_Exp2_;
|
|
613
|
-
operData.NUM_Exp2_ = exp;
|
|
614
|
-
operData.NUM_Diff_ = -operData.NUM_Diff_;
|
|
615
|
-
if (sign1 === sign2)
|
|
616
|
-
tmpres = NUM_TYPE.add_pos(num2, num1, operData);
|
|
617
|
-
else
|
|
618
|
-
tmpres = NUM_TYPE.sub_pos(num2, num1, operData);
|
|
619
|
-
if (tmpres._data[0] !== 0)
|
|
620
|
-
tmpres._data[0] |= sign2;
|
|
621
|
-
}
|
|
622
|
-
return tmpres;
|
|
623
|
-
}
|
|
624
|
-
static sub(num1, num2) {
|
|
625
|
-
if (num1 === null || num2 === null)
|
|
626
|
-
return null;
|
|
627
|
-
let tmpres = new NUM_TYPE();
|
|
628
|
-
let res = new NUM_TYPE();
|
|
629
|
-
let operData = new OperData();
|
|
630
|
-
if (num1.NUM_IS_LONG()) {
|
|
631
|
-
if (num2.NUM_IS_LONG()) {
|
|
632
|
-
let l;
|
|
633
|
-
let l1 = l = num1.NUM_LONG();
|
|
634
|
-
if (l < 0)
|
|
635
|
-
l = -l;
|
|
636
|
-
if (l < 0x40000000) {
|
|
637
|
-
let l2 = l = num2.NUM_LONG();
|
|
638
|
-
if (l < 0)
|
|
639
|
-
l = -l;
|
|
640
|
-
if (l < 0x40000000) {
|
|
641
|
-
l1 -= l2;
|
|
642
|
-
res.NUM_4_LONG(l1);
|
|
643
|
-
return res;
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
num2.num_4_std_long();
|
|
647
|
-
}
|
|
648
|
-
num1.num_4_std_long();
|
|
649
|
-
}
|
|
650
|
-
else if (num2.NUM_IS_LONG())
|
|
651
|
-
num2.num_4_std_long();
|
|
652
|
-
let sign1 = NUM_TYPE.toSByte(num1._data[0] & NUM_TYPE.SIGN_MASK);
|
|
653
|
-
operData.NUM_Exp1_ = NUM_TYPE.toSByte(num1._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
654
|
-
let sign2 = NUM_TYPE.toSByte(num2._data[0] & NUM_TYPE.SIGN_MASK);
|
|
655
|
-
operData.NUM_Exp2_ = NUM_TYPE.toSByte(num2._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
656
|
-
operData.NUM_Diff_ = (operData.NUM_Exp1_ - operData.NUM_Exp2_);
|
|
657
|
-
let cmpval = operData.NUM_Diff_;
|
|
658
|
-
if (cmpval === 0) {
|
|
659
|
-
cmpval = NUM_TYPE.toUByte(num1._data[1]) - NUM_TYPE.toUByte(num2._data[1]);
|
|
660
|
-
if (cmpval === 0)
|
|
661
|
-
cmpval = NUM_TYPE.memcmp(num1, 2, num2, 2, GuiEnvironment.Environment.GetSignificantNumSize() - 2);
|
|
662
|
-
}
|
|
663
|
-
if (cmpval >= 0) {
|
|
664
|
-
if (sign1 === sign2)
|
|
665
|
-
tmpres = NUM_TYPE.sub_pos(num1, num2, operData);
|
|
666
|
-
else
|
|
667
|
-
tmpres = NUM_TYPE.add_pos(num1, num2, operData);
|
|
668
|
-
}
|
|
669
|
-
else {
|
|
670
|
-
let exp = operData.NUM_Exp1_;
|
|
671
|
-
operData.NUM_Exp1_ = operData.NUM_Exp2_;
|
|
672
|
-
operData.NUM_Exp2_ = exp;
|
|
673
|
-
operData.NUM_Diff_ = -operData.NUM_Diff_;
|
|
674
|
-
if (sign1 === sign2) {
|
|
675
|
-
tmpres = NUM_TYPE.sub_pos(num2, num1, operData);
|
|
676
|
-
sign1 ^= (NUM_TYPE.SIGN_MASK);
|
|
677
|
-
}
|
|
678
|
-
else
|
|
679
|
-
tmpres = NUM_TYPE.add_pos(num2, num1, operData);
|
|
680
|
-
}
|
|
681
|
-
if (tmpres._data[0] !== 0)
|
|
682
|
-
tmpres._data[0] |= sign1;
|
|
683
|
-
return tmpres;
|
|
684
|
-
}
|
|
685
|
-
static mul(num1, num2) {
|
|
686
|
-
let fullres = new Int8Array(38);
|
|
687
|
-
let pwr;
|
|
688
|
-
let len1;
|
|
689
|
-
let len2;
|
|
690
|
-
let pos1;
|
|
691
|
-
let pos2;
|
|
692
|
-
let pos;
|
|
693
|
-
let digit1;
|
|
694
|
-
let prod;
|
|
695
|
-
let carry;
|
|
696
|
-
let l;
|
|
697
|
-
let l1;
|
|
698
|
-
let l2;
|
|
699
|
-
let SIGNIFICANT_NUM_SIZE;
|
|
700
|
-
if (num1 === null || num2 === null)
|
|
701
|
-
return null;
|
|
702
|
-
SIGNIFICANT_NUM_SIZE = GuiEnvironment.Environment.GetSignificantNumSize();
|
|
703
|
-
let res = new NUM_TYPE();
|
|
704
|
-
let operData = new OperData();
|
|
705
|
-
let i;
|
|
706
|
-
let tmpByte;
|
|
707
|
-
if (num1.NUM_IS_LONG()) {
|
|
708
|
-
if (num2.NUM_IS_LONG()) {
|
|
709
|
-
l = l1 = num1.NUM_LONG();
|
|
710
|
-
if (l < 0)
|
|
711
|
-
l = -l;
|
|
712
|
-
if (l < 0xB000) {
|
|
713
|
-
l = l2 = num2.NUM_LONG();
|
|
714
|
-
if (l < 0)
|
|
715
|
-
l = -l;
|
|
716
|
-
if (l < 0xB000) {
|
|
717
|
-
l1 = l1 * l2;
|
|
718
|
-
res.NUM_4_LONG(l1);
|
|
719
|
-
return res;
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
num2.num_4_std_long();
|
|
723
|
-
}
|
|
724
|
-
num1.num_4_std_long();
|
|
725
|
-
}
|
|
726
|
-
else if (num2.NUM_IS_LONG())
|
|
727
|
-
num2.num_4_std_long();
|
|
728
|
-
operData.NUM_Exp1_ = NUM_TYPE.toSByte(num1._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
729
|
-
operData.NUM_Exp2_ = NUM_TYPE.toSByte(num2._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
730
|
-
if (operData.NUM_Exp1_ === 0 || operData.NUM_Exp2_ === 0) {
|
|
731
|
-
res.NUM_ZERO();
|
|
732
|
-
return res;
|
|
733
|
-
}
|
|
734
|
-
for (len1 = SIGNIFICANT_NUM_SIZE - 1; num1._data[len1] === 0; len1--) {
|
|
735
|
-
}
|
|
736
|
-
for (len2 = SIGNIFICANT_NUM_SIZE - 1; num2._data[len2] === 0; len2--) {
|
|
737
|
-
}
|
|
738
|
-
for (i = 0; i < (NUM_TYPE.NUM_SIZE - 1) * 2; i++)
|
|
739
|
-
fullres[i] = 0;
|
|
740
|
-
pos = 0;
|
|
741
|
-
for (pos1 = len1; pos1 > 0; pos1--) {
|
|
742
|
-
pos = pos1 + len2 - 1;
|
|
743
|
-
digit1 = num1._data[pos1];
|
|
744
|
-
carry = 0;
|
|
745
|
-
for (pos2 = len2; pos2 > 0; pos2--) {
|
|
746
|
-
prod = NUM_TYPE.toUByte(digit1) * NUM_TYPE.toUByte(num2._data[pos2]) + carry;
|
|
747
|
-
carry = Math.floor(prod / 100);
|
|
748
|
-
fullres[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(fullres[pos]) + prod % 100);
|
|
749
|
-
tmpByte = fullres[pos];
|
|
750
|
-
pos--;
|
|
751
|
-
if (NUM_TYPE.toUByte(tmpByte) >= 100) {
|
|
752
|
-
fullres[pos + 1] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(fullres[pos + 1]) - 100);
|
|
753
|
-
carry++;
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
fullres[pos] = NUM_TYPE.toSByte(carry);
|
|
757
|
-
}
|
|
758
|
-
pwr = NUM_TYPE.toUByte(operData.NUM_Exp1_) - NUM_TYPE.EXP_BIAS + (NUM_TYPE.toUByte(operData.NUM_Exp2_) - NUM_TYPE.EXP_BIAS);
|
|
759
|
-
if (fullres[0] === 0) {
|
|
760
|
-
pos++;
|
|
761
|
-
pwr--;
|
|
762
|
-
}
|
|
763
|
-
if ((num1._data[0] & NUM_TYPE.SIGN_MASK) === (num2._data[0] & NUM_TYPE.SIGN_MASK))
|
|
764
|
-
res._data[0] = 0;
|
|
765
|
-
else
|
|
766
|
-
res._data[0] = NUM_TYPE.SIGN_MASK;
|
|
767
|
-
res._data[0] |= NUM_TYPE.toSByte(pwr + NUM_TYPE.EXP_BIAS);
|
|
768
|
-
for (i = 0; i < SIGNIFICANT_NUM_SIZE - 1; i++)
|
|
769
|
-
res._data[1 + i] = fullres[pos + i];
|
|
770
|
-
return res;
|
|
771
|
-
}
|
|
772
|
-
static mod(num1, num2) {
|
|
773
|
-
if (num1 === null || num2 === null)
|
|
774
|
-
return null;
|
|
775
|
-
let res = new NUM_TYPE();
|
|
776
|
-
if (num2.num_is_zero()) {
|
|
777
|
-
res.NUM_ZERO();
|
|
778
|
-
return res;
|
|
779
|
-
}
|
|
780
|
-
if (num1.NUM_IS_LONG())
|
|
781
|
-
num1.num_4_std_long();
|
|
782
|
-
if (num2.NUM_IS_LONG())
|
|
783
|
-
num2.num_4_std_long();
|
|
784
|
-
res = NUM_TYPE.div(num1, num2);
|
|
785
|
-
res.num_trunc(0);
|
|
786
|
-
res = NUM_TYPE.mul(res, num2);
|
|
787
|
-
res = NUM_TYPE.sub(num1, res);
|
|
788
|
-
return res;
|
|
789
|
-
}
|
|
790
|
-
static div(num1, num2) {
|
|
791
|
-
let dividend = new Int8Array((NUM_TYPE.NUM_SIZE - 1) * 2);
|
|
792
|
-
let divisor = new Int8Array(NUM_TYPE.NUM_SIZE);
|
|
793
|
-
let pwr;
|
|
794
|
-
let len1;
|
|
795
|
-
let len2;
|
|
796
|
-
let pos1;
|
|
797
|
-
let pos2;
|
|
798
|
-
let pos;
|
|
799
|
-
let quot;
|
|
800
|
-
let prod;
|
|
801
|
-
let carry;
|
|
802
|
-
let SIGNIFICANT_NUM_SIZE;
|
|
803
|
-
if (num1 === null || num2 === null)
|
|
804
|
-
return null;
|
|
805
|
-
SIGNIFICANT_NUM_SIZE = GuiEnvironment.Environment.GetSignificantNumSize();
|
|
806
|
-
let res = new NUM_TYPE();
|
|
807
|
-
let operData = new OperData();
|
|
808
|
-
let i;
|
|
809
|
-
let tmpByte;
|
|
810
|
-
if (num1.NUM_IS_LONG())
|
|
811
|
-
num1.num_4_std_long();
|
|
812
|
-
if (num2.NUM_IS_LONG())
|
|
813
|
-
num2.num_4_std_long();
|
|
814
|
-
operData.NUM_Exp1_ = NUM_TYPE.toSByte(num1._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
815
|
-
operData.NUM_Exp2_ = NUM_TYPE.toSByte(num2._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
816
|
-
if (operData.NUM_Exp1_ === 0 || operData.NUM_Exp2_ === 0) {
|
|
817
|
-
res.NUM_ZERO();
|
|
818
|
-
return res;
|
|
819
|
-
}
|
|
820
|
-
for (len1 = SIGNIFICANT_NUM_SIZE - 1; num1._data[len1] === 0; len1--) {
|
|
821
|
-
}
|
|
822
|
-
for (len2 = SIGNIFICANT_NUM_SIZE - 1; num2._data[len2] === 0; len2--) {
|
|
823
|
-
}
|
|
824
|
-
pos = (NUM_TYPE.memcmp(num1, 1, num2, 1, len2) < 0) ? 0 : 1;
|
|
825
|
-
for (i = 0; i < (NUM_TYPE.NUM_SIZE - 1) * 2; i++)
|
|
826
|
-
dividend[i] = 0;
|
|
827
|
-
for (i = 0; i < len1; i++)
|
|
828
|
-
dividend[pos + i] = num1._data[1 + i];
|
|
829
|
-
for (i = 0; i < len2; i++)
|
|
830
|
-
divisor[1 + i] = num2._data[1 + i];
|
|
831
|
-
res.NUM_SET_ZERO();
|
|
832
|
-
pwr = NUM_TYPE.toUByte(operData.NUM_Exp1_) - NUM_TYPE.toUByte(operData.NUM_Exp2_) + pos;
|
|
833
|
-
res._data[0] = NUM_TYPE.toSByte(pwr + NUM_TYPE.EXP_BIAS);
|
|
834
|
-
if ((num1._data[0] & NUM_TYPE.SIGN_MASK) !== (num2._data[0] & NUM_TYPE.SIGN_MASK))
|
|
835
|
-
res._data[0] |= NUM_TYPE.SIGN_MASK;
|
|
836
|
-
quot = Math.floor(100 / (NUM_TYPE.toUByte(divisor[1]) + 1));
|
|
837
|
-
if (quot > 1) {
|
|
838
|
-
carry = 0;
|
|
839
|
-
for (pos2 = len2; pos2 > 0; pos2--) {
|
|
840
|
-
prod = quot * NUM_TYPE.toUByte(divisor[pos2]) + carry;
|
|
841
|
-
carry = Math.floor(prod / 100);
|
|
842
|
-
divisor[pos2] = NUM_TYPE.toSByte(prod % 100);
|
|
843
|
-
}
|
|
844
|
-
carry = 0;
|
|
845
|
-
for (pos1 = len1 + pos - 1; pos1 >= 0; pos1--) {
|
|
846
|
-
prod = quot * NUM_TYPE.toUByte(dividend[pos1]) + carry;
|
|
847
|
-
carry = Math.floor(prod / 100);
|
|
848
|
-
dividend[pos1] = NUM_TYPE.toSByte(prod % 100);
|
|
849
|
-
}
|
|
850
|
-
}
|
|
851
|
-
for (pos1 = 1; pos1 < SIGNIFICANT_NUM_SIZE; pos1++) {
|
|
852
|
-
quot = NUM_TYPE.toUByte(dividend[pos1 - 1]) * 100 + Math.floor(NUM_TYPE.toUByte(dividend[pos1]) / NUM_TYPE.toUByte(divisor[1]));
|
|
853
|
-
if (quot >= 100)
|
|
854
|
-
quot = 99;
|
|
855
|
-
if (quot !== 0) {
|
|
856
|
-
pos = pos1 + len2 - 1;
|
|
857
|
-
carry = 0;
|
|
858
|
-
for (pos2 = len2; pos2 > 0; pos2--) {
|
|
859
|
-
prod = quot * NUM_TYPE.toUByte(divisor[pos2]) + carry;
|
|
860
|
-
carry = Math.floor(prod / 100);
|
|
861
|
-
dividend[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(dividend[pos]) - prod % 100);
|
|
862
|
-
tmpByte = dividend[pos];
|
|
863
|
-
pos--;
|
|
864
|
-
if (tmpByte < 0) {
|
|
865
|
-
dividend[pos + 1] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(dividend[pos + 1]) + 100);
|
|
866
|
-
carry++;
|
|
867
|
-
}
|
|
868
|
-
}
|
|
869
|
-
dividend[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(dividend[pos]) - carry);
|
|
870
|
-
while (dividend[pos] < 0) {
|
|
871
|
-
quot--;
|
|
872
|
-
pos = pos1 + len2 - 1;
|
|
873
|
-
for (pos2 = len2; pos2 > 0; pos2--) {
|
|
874
|
-
dividend[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(dividend[pos]) + NUM_TYPE.toUByte(divisor[pos2]));
|
|
875
|
-
tmpByte = dividend[pos];
|
|
876
|
-
pos--;
|
|
877
|
-
if (NUM_TYPE.toUByte(tmpByte) >= 100) {
|
|
878
|
-
dividend[pos + 1] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(dividend[pos + 1]) - 100);
|
|
879
|
-
dividend[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(dividend[pos]) + 1);
|
|
880
|
-
}
|
|
881
|
-
}
|
|
882
|
-
}
|
|
883
|
-
}
|
|
884
|
-
res._data[pos1] = NUM_TYPE.toSByte(quot);
|
|
885
|
-
}
|
|
886
|
-
return res;
|
|
887
|
-
}
|
|
888
|
-
static num_cmp(num1, num2) {
|
|
889
|
-
let sign1;
|
|
890
|
-
let sign2;
|
|
891
|
-
let cmpval;
|
|
892
|
-
let l1;
|
|
893
|
-
let l2;
|
|
894
|
-
let tmp;
|
|
895
|
-
let SIGNIFICANT_NUM_SIZE;
|
|
896
|
-
if (num1 == null || num2 == null)
|
|
897
|
-
return Int32.MinValue;
|
|
898
|
-
SIGNIFICANT_NUM_SIZE = GuiEnvironment.Environment.GetSignificantNumSize();
|
|
899
|
-
if (num1.NUM_IS_LONG()) {
|
|
900
|
-
if (num2.NUM_IS_LONG()) {
|
|
901
|
-
l1 = num1.NUM_LONG();
|
|
902
|
-
l2 = num2.NUM_LONG();
|
|
903
|
-
if (l1 >= 0 && l2 >= 0) {
|
|
904
|
-
tmp = l1 - l2;
|
|
905
|
-
if (tmp === 0)
|
|
906
|
-
return (0);
|
|
907
|
-
if (tmp > 0)
|
|
908
|
-
return (1);
|
|
909
|
-
return (-1);
|
|
910
|
-
}
|
|
911
|
-
num2.num_4_std_long();
|
|
912
|
-
}
|
|
913
|
-
num1.num_4_std_long();
|
|
914
|
-
}
|
|
915
|
-
else if (num2.NUM_IS_LONG())
|
|
916
|
-
num2.num_4_std_long();
|
|
917
|
-
sign1 = NUM_TYPE.toSByte(num1._data[0] & NUM_TYPE.SIGN_MASK);
|
|
918
|
-
sign2 = NUM_TYPE.toSByte(num2._data[0] & NUM_TYPE.SIGN_MASK);
|
|
919
|
-
cmpval = (sign1 === sign2)
|
|
920
|
-
? NUM_TYPE.memcmp(num1, 0, num2, 0, SIGNIFICANT_NUM_SIZE)
|
|
921
|
-
: 1;
|
|
922
|
-
if (sign1 !== 0)
|
|
923
|
-
cmpval = -cmpval;
|
|
924
|
-
return (cmpval);
|
|
925
|
-
}
|
|
926
|
-
static numHexStrIsLong(numHexStr) {
|
|
927
|
-
return numHexStr.substr(0, 2) === "FF";
|
|
928
|
-
}
|
|
929
|
-
NUM_ZERO() {
|
|
930
|
-
this.setZero(true);
|
|
931
|
-
}
|
|
932
|
-
NUM_SET_ZERO() {
|
|
933
|
-
this.setZero(false);
|
|
934
|
-
}
|
|
935
|
-
num_is_neg() {
|
|
936
|
-
if (this.NUM_IS_LONG())
|
|
937
|
-
return ((this._data[4] & 0x80) !== 0);
|
|
938
|
-
return ((this._data[0] & NUM_TYPE.SIGN_MASK) !== 0);
|
|
939
|
-
}
|
|
940
|
-
num_is_zero() {
|
|
941
|
-
if (this.NUM_IS_LONG())
|
|
942
|
-
return (this.NUM_LONG() === 0);
|
|
943
|
-
return (this._data[0] === 0);
|
|
944
|
-
}
|
|
945
|
-
num_neg() {
|
|
946
|
-
let l;
|
|
947
|
-
if (this.NUM_IS_LONG()) {
|
|
948
|
-
l = -this.NUM_LONG();
|
|
949
|
-
this.NUM_4_LONG(l);
|
|
950
|
-
return;
|
|
951
|
-
}
|
|
952
|
-
if (this._data[0] !== 0)
|
|
953
|
-
this._data[0] ^= NUM_TYPE.SIGN_MASK;
|
|
954
|
-
}
|
|
955
|
-
NUM_IS_LONG() {
|
|
956
|
-
return this._data[0] === NUM_TYPE.NUM_LONG_TYPE;
|
|
957
|
-
}
|
|
958
|
-
NUM_LONG() {
|
|
959
|
-
if (this._data[1] === 0 && this._data[2] === 0 && this._data[3] === 0 && this._data[4] === -128)
|
|
960
|
-
return Int32.MinValue;
|
|
961
|
-
let dataview = new DataView(this._data.buffer);
|
|
962
|
-
return dataview.getInt32(1, true);
|
|
963
|
-
}
|
|
964
|
-
round(decs) {
|
|
965
|
-
let addval;
|
|
966
|
-
if (this.NUM_IS_LONG())
|
|
967
|
-
return;
|
|
968
|
-
addval = new NUM_TYPE();
|
|
969
|
-
addval._data[0] = NUM_TYPE.toSByte((this._data[0] & NUM_TYPE.SIGN_MASK) | (NUM_TYPE.EXP_BIAS - (decs >> 1)));
|
|
970
|
-
addval._data[1] = NUM_TYPE.toSByte((decs & 1) !== 0 ? 5 : 50);
|
|
971
|
-
let temp = NUM_TYPE.add(this, addval);
|
|
972
|
-
this._data = new Int8Array(temp._data.length);
|
|
973
|
-
this._data = temp._data;
|
|
974
|
-
this.num_trunc(decs);
|
|
975
|
-
}
|
|
976
|
-
dbRound(whole) {
|
|
977
|
-
let addval;
|
|
978
|
-
let pwr;
|
|
979
|
-
let num_diff;
|
|
980
|
-
let i;
|
|
981
|
-
if (this.NUM_IS_LONG())
|
|
982
|
-
return;
|
|
983
|
-
addval = new NUM_TYPE();
|
|
984
|
-
addval._data[0] = NUM_TYPE.toSByte((this._data[0] & NUM_TYPE.SIGN_MASK) | (NUM_TYPE.EXP_BIAS + ((whole + 1) >> 1)));
|
|
985
|
-
addval._data[1] = NUM_TYPE.toSByte(((whole & 1) !== 0) ? 5 : 50);
|
|
986
|
-
let temp = NUM_TYPE.add(this, addval);
|
|
987
|
-
this._data = new Int8Array(temp._data.length);
|
|
988
|
-
for (let _ai = 0; _ai < this._data.length; ++_ai)
|
|
989
|
-
this._data[_ai] = temp._data[_ai];
|
|
990
|
-
pwr = (this._data[0] & ~NUM_TYPE.SIGN_MASK) - NUM_TYPE.EXP_BIAS;
|
|
991
|
-
if ((num_diff = pwr - ((whole + 1) >> 1)) >= 0) {
|
|
992
|
-
if ((whole & 1) !== 0) {
|
|
993
|
-
this._data[1 + num_diff] = NUM_TYPE.toSByte(this._data[1 + num_diff] - this._data[1 + num_diff] % 10);
|
|
994
|
-
num_diff++;
|
|
995
|
-
}
|
|
996
|
-
for (i = 0; i < this.SIGNIFICANT_NUM_SIZE - (1 + num_diff); i++)
|
|
997
|
-
this._data[1 + num_diff + i] = 0;
|
|
998
|
-
}
|
|
999
|
-
else
|
|
1000
|
-
this.NUM_SET_ZERO();
|
|
1001
|
-
}
|
|
1002
|
-
num_trunc(decs) {
|
|
1003
|
-
let pwr;
|
|
1004
|
-
let num_diff;
|
|
1005
|
-
let i;
|
|
1006
|
-
if (this.NUM_IS_LONG())
|
|
1007
|
-
return;
|
|
1008
|
-
pwr = (this._data[0] & ~NUM_TYPE.SIGN_MASK) - NUM_TYPE.EXP_BIAS;
|
|
1009
|
-
if ((num_diff = this.SIGNIFICANT_NUM_SIZE - 1 - pwr - ((decs + 1) >> 1)) < 0)
|
|
1010
|
-
return;
|
|
1011
|
-
if ((num_diff < this.SIGNIFICANT_NUM_SIZE - 1) && ((decs & 1) !== 0)) {
|
|
1012
|
-
this._data[this.SIGNIFICANT_NUM_SIZE - 1 - num_diff] =
|
|
1013
|
-
NUM_TYPE.toSByte(this._data[this.SIGNIFICANT_NUM_SIZE - 1 - num_diff] - this._data[this.SIGNIFICANT_NUM_SIZE - 1 - num_diff] % 10);
|
|
1014
|
-
if (this._data[this.SIGNIFICANT_NUM_SIZE - 1 - num_diff] === 0)
|
|
1015
|
-
num_diff++;
|
|
1016
|
-
}
|
|
1017
|
-
if (num_diff >= this.SIGNIFICANT_NUM_SIZE - 1) {
|
|
1018
|
-
this.NUM_ZERO();
|
|
1019
|
-
return;
|
|
1020
|
-
}
|
|
1021
|
-
for (i = 0; i < num_diff; i++)
|
|
1022
|
-
this._data[this.SIGNIFICANT_NUM_SIZE - num_diff + i] = 0;
|
|
1023
|
-
}
|
|
1024
|
-
num_4_std_long() {
|
|
1025
|
-
let slong;
|
|
1026
|
-
slong = this.NUM_LONG();
|
|
1027
|
-
if (slong >= 0)
|
|
1028
|
-
this.num_4_ulong(slong);
|
|
1029
|
-
else {
|
|
1030
|
-
this.num_4_ulong(-slong);
|
|
1031
|
-
this._data[0] |= NUM_TYPE.SIGN_MASK;
|
|
1032
|
-
}
|
|
1033
|
-
}
|
|
1034
|
-
num_4_ulong(data) {
|
|
1035
|
-
let pwr;
|
|
1036
|
-
let pos;
|
|
1037
|
-
let i;
|
|
1038
|
-
this.NUM_SET_ZERO();
|
|
1039
|
-
pos = pwr = 5;
|
|
1040
|
-
while (data > 0) {
|
|
1041
|
-
this._data[pos--] = NUM_TYPE.toSByte(data % 100);
|
|
1042
|
-
data = Math.floor(data / 100);
|
|
1043
|
-
}
|
|
1044
|
-
if (pos < pwr) {
|
|
1045
|
-
if (pos > 0) {
|
|
1046
|
-
for (i = 0; i < pwr - pos; i++)
|
|
1047
|
-
this._data[1 + i] = this._data[1 + pos + i];
|
|
1048
|
-
for (i = 0; i < pos; i++)
|
|
1049
|
-
this._data[pwr - pos + 1 + i] = 0;
|
|
1050
|
-
}
|
|
1051
|
-
this._data[0] = NUM_TYPE.toSByte(pwr - pos + NUM_TYPE.EXP_BIAS);
|
|
1052
|
-
}
|
|
1053
|
-
}
|
|
1054
|
-
NUM_2_LONG() {
|
|
1055
|
-
if (this.NUM_IS_LONG())
|
|
1056
|
-
return this.NUM_LONG();
|
|
1057
|
-
else
|
|
1058
|
-
return this.num_2_long();
|
|
1059
|
-
}
|
|
1060
|
-
NUM_2_ULONG() {
|
|
1061
|
-
if (this.NUM_IS_LONG())
|
|
1062
|
-
return this.NUM_LONG();
|
|
1063
|
-
else
|
|
1064
|
-
return this.num_2_ulong();
|
|
1065
|
-
}
|
|
1066
|
-
num_2_long() {
|
|
1067
|
-
let slong;
|
|
1068
|
-
let sign;
|
|
1069
|
-
sign = this._data[0] & NUM_TYPE.SIGN_MASK;
|
|
1070
|
-
this._data[0] &= NUM_TYPE.toSByte(~NUM_TYPE.SIGN_MASK);
|
|
1071
|
-
if (sign !== 0) {
|
|
1072
|
-
if (NUM_TYPE.memcmp(this, 0, NUM_TYPE.MinLONG(), 0, this.SIGNIFICANT_NUM_SIZE) > 0)
|
|
1073
|
-
return 0;
|
|
1074
|
-
}
|
|
1075
|
-
else {
|
|
1076
|
-
if (NUM_TYPE.memcmp(this, 0, NUM_TYPE.MaxLONG(), 0, this.SIGNIFICANT_NUM_SIZE) > 0)
|
|
1077
|
-
return 0;
|
|
1078
|
-
}
|
|
1079
|
-
slong = this.num_2_ulong();
|
|
1080
|
-
if (sign !== 0) {
|
|
1081
|
-
slong = -slong;
|
|
1082
|
-
this._data[0] |= NUM_TYPE.toSByte(sign);
|
|
1083
|
-
}
|
|
1084
|
-
return (slong);
|
|
1085
|
-
}
|
|
1086
|
-
num_2_ulong() {
|
|
1087
|
-
let val;
|
|
1088
|
-
let pwr;
|
|
1089
|
-
let pos;
|
|
1090
|
-
let last;
|
|
1091
|
-
pwr = this._data[0] - NUM_TYPE.EXP_BIAS;
|
|
1092
|
-
if (pwr > 5)
|
|
1093
|
-
return (0);
|
|
1094
|
-
last = (pwr === 5);
|
|
1095
|
-
if (last)
|
|
1096
|
-
pwr = 4;
|
|
1097
|
-
val = 0;
|
|
1098
|
-
for (pos = 1; pos <= pwr; pos++)
|
|
1099
|
-
val = val * 100 + NUM_TYPE.toUByte(this._data[pos]);
|
|
1100
|
-
if (last)
|
|
1101
|
-
if (val <= Math.floor((0xFFFFFFFF - NUM_TYPE.toUByte(this._data[5])) / 100))
|
|
1102
|
-
val = val * 100 + NUM_TYPE.toUByte(this._data[5]);
|
|
1103
|
-
else
|
|
1104
|
-
val = 0;
|
|
1105
|
-
return (val);
|
|
1106
|
-
}
|
|
1107
|
-
static add_pos(num1, num2, operData) {
|
|
1108
|
-
let len1;
|
|
1109
|
-
let len2;
|
|
1110
|
-
let len;
|
|
1111
|
-
let pos;
|
|
1112
|
-
let num1ptr;
|
|
1113
|
-
let resptr;
|
|
1114
|
-
let i;
|
|
1115
|
-
let SIGNIFICANT_NUM_SIZE;
|
|
1116
|
-
if (num1 == null || num2 == null)
|
|
1117
|
-
return null;
|
|
1118
|
-
SIGNIFICANT_NUM_SIZE = GuiEnvironment.Environment.GetSignificantNumSize();
|
|
1119
|
-
let res = new NUM_TYPE();
|
|
1120
|
-
if (operData.NUM_Exp2_ === 0 || (operData.NUM_Diff_ >= SIGNIFICANT_NUM_SIZE - 1)) {
|
|
1121
|
-
res = new NUM_TYPE(num1);
|
|
1122
|
-
res._data[0] = operData.NUM_Exp1_;
|
|
1123
|
-
return res;
|
|
1124
|
-
}
|
|
1125
|
-
len1 = 1;
|
|
1126
|
-
for (i = SIGNIFICANT_NUM_SIZE - 2; i > 0; i -= 2) {
|
|
1127
|
-
if (num1.SHRT_IS_ZERO(i))
|
|
1128
|
-
continue;
|
|
1129
|
-
else {
|
|
1130
|
-
len1 = i + 1;
|
|
1131
|
-
break;
|
|
1132
|
-
}
|
|
1133
|
-
}
|
|
1134
|
-
if (num1._data[len1] === 0)
|
|
1135
|
-
len1--;
|
|
1136
|
-
len2 = 1;
|
|
1137
|
-
for (i = SIGNIFICANT_NUM_SIZE - 2; i > 0; i -= 2) {
|
|
1138
|
-
if (num2.SHRT_IS_ZERO(i))
|
|
1139
|
-
continue;
|
|
1140
|
-
else {
|
|
1141
|
-
len2 = i + 1;
|
|
1142
|
-
break;
|
|
1143
|
-
}
|
|
1144
|
-
}
|
|
1145
|
-
if (num2._data[len2] === 0)
|
|
1146
|
-
len2--;
|
|
1147
|
-
if ((len = Math.max(len1, len2 + operData.NUM_Diff_)) > SIGNIFICANT_NUM_SIZE - 1)
|
|
1148
|
-
len = SIGNIFICANT_NUM_SIZE - 1;
|
|
1149
|
-
res.NUM_SET_ZERO();
|
|
1150
|
-
num1ptr = operData.NUM_Diff_;
|
|
1151
|
-
resptr = operData.NUM_Diff_;
|
|
1152
|
-
for (pos = len - operData.NUM_Diff_; pos > 0; pos--) {
|
|
1153
|
-
res._data[resptr + pos] =
|
|
1154
|
-
NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[resptr + pos]) + NUM_TYPE.toUByte(num1._data[num1ptr + pos]) + NUM_TYPE.toUByte(num2._data[pos]));
|
|
1155
|
-
if (NUM_TYPE.toUByte(res._data[resptr + pos]) >= 100) {
|
|
1156
|
-
res._data[resptr + pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[resptr + pos]) - 100);
|
|
1157
|
-
res._data[resptr + pos - 1] = 1;
|
|
1158
|
-
}
|
|
1159
|
-
}
|
|
1160
|
-
for (pos = operData.NUM_Diff_; pos > 0; pos--) {
|
|
1161
|
-
res._data[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[pos]) + NUM_TYPE.toUByte(num1._data[pos]));
|
|
1162
|
-
if (NUM_TYPE.toUByte(res._data[pos]) >= 100) {
|
|
1163
|
-
res._data[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[pos]) - 100);
|
|
1164
|
-
res._data[pos - 1] = 1;
|
|
1165
|
-
}
|
|
1166
|
-
}
|
|
1167
|
-
if (res._data[0] !== 0) {
|
|
1168
|
-
for (pos = Math.min(len, SIGNIFICANT_NUM_SIZE - 2); pos >= 0; pos--)
|
|
1169
|
-
res._data[pos + 1] = res._data[pos];
|
|
1170
|
-
operData.NUM_Exp1_++;
|
|
1171
|
-
}
|
|
1172
|
-
res._data[0] = operData.NUM_Exp1_;
|
|
1173
|
-
return res;
|
|
1174
|
-
}
|
|
1175
|
-
static sub_pos(num1, num2, operData) {
|
|
1176
|
-
let len1;
|
|
1177
|
-
let len2;
|
|
1178
|
-
let len;
|
|
1179
|
-
let pos;
|
|
1180
|
-
let num1ptr;
|
|
1181
|
-
let resptr;
|
|
1182
|
-
let i;
|
|
1183
|
-
let SIGNIFICANT_NUM_SIZE;
|
|
1184
|
-
if (num1 == null || num2 == null)
|
|
1185
|
-
return null;
|
|
1186
|
-
SIGNIFICANT_NUM_SIZE = GuiEnvironment.Environment.GetSignificantNumSize();
|
|
1187
|
-
let res = new NUM_TYPE();
|
|
1188
|
-
let j;
|
|
1189
|
-
if (operData.NUM_Exp2_ === 0 || (operData.NUM_Diff_ >= SIGNIFICANT_NUM_SIZE - 1)) {
|
|
1190
|
-
res = new NUM_TYPE(num1);
|
|
1191
|
-
res._data[0] = operData.NUM_Exp1_;
|
|
1192
|
-
return res;
|
|
1193
|
-
}
|
|
1194
|
-
len1 = 1;
|
|
1195
|
-
for (i = SIGNIFICANT_NUM_SIZE - 2; i > 0; i -= 2) {
|
|
1196
|
-
if (num1.SHRT_IS_ZERO(i))
|
|
1197
|
-
continue;
|
|
1198
|
-
else {
|
|
1199
|
-
len1 = i + 1;
|
|
1200
|
-
break;
|
|
1201
|
-
}
|
|
1202
|
-
}
|
|
1203
|
-
if (num1._data[len1] === 0)
|
|
1204
|
-
len1--;
|
|
1205
|
-
len2 = 1;
|
|
1206
|
-
for (i = SIGNIFICANT_NUM_SIZE - 2; i > 0; i -= 2) {
|
|
1207
|
-
if (num2.SHRT_IS_ZERO(i))
|
|
1208
|
-
continue;
|
|
1209
|
-
else {
|
|
1210
|
-
len2 = i + 1;
|
|
1211
|
-
break;
|
|
1212
|
-
}
|
|
1213
|
-
}
|
|
1214
|
-
if (num2._data[len2] === 0)
|
|
1215
|
-
len2--;
|
|
1216
|
-
if ((len = Math.max(len1, len2 + operData.NUM_Diff_)) > SIGNIFICANT_NUM_SIZE - 1)
|
|
1217
|
-
len = SIGNIFICANT_NUM_SIZE - 1;
|
|
1218
|
-
res.NUM_SET_ZERO();
|
|
1219
|
-
num1ptr = operData.NUM_Diff_;
|
|
1220
|
-
resptr = operData.NUM_Diff_;
|
|
1221
|
-
for (pos = len - operData.NUM_Diff_; pos > 0; pos--) {
|
|
1222
|
-
res._data[resptr + pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[resptr + pos]) + NUM_TYPE.toUByte(num1._data[num1ptr + pos]) - NUM_TYPE.toUByte(num2._data[pos]));
|
|
1223
|
-
if (res._data[resptr + pos] < 0) {
|
|
1224
|
-
res._data[resptr + pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[resptr + pos]) + 100);
|
|
1225
|
-
res._data[resptr + pos - 1] = NUM_TYPE.toSByte(0xFF);
|
|
1226
|
-
}
|
|
1227
|
-
}
|
|
1228
|
-
for (pos = operData.NUM_Diff_; pos > 0; pos--) {
|
|
1229
|
-
res._data[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[pos]) + NUM_TYPE.toUByte(num1._data[pos]));
|
|
1230
|
-
if (res._data[pos] < 0) {
|
|
1231
|
-
res._data[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[pos]) + 100);
|
|
1232
|
-
res._data[pos - 1] = NUM_TYPE.toSByte(0xFF);
|
|
1233
|
-
}
|
|
1234
|
-
}
|
|
1235
|
-
while ((++pos <= len) && res._data[pos] === 0) {
|
|
1236
|
-
}
|
|
1237
|
-
if (pos <= len) {
|
|
1238
|
-
operData.NUM_Diff_ = pos - 1;
|
|
1239
|
-
if (operData.NUM_Diff_ > 0) {
|
|
1240
|
-
for (j = 0; j < len - operData.NUM_Diff_; j++)
|
|
1241
|
-
res._data[1 + j] = res._data[pos + j];
|
|
1242
|
-
for (j = 0; j < operData.NUM_Diff_; j++)
|
|
1243
|
-
res._data[len - operData.NUM_Diff_ + 1 + j] = 0;
|
|
1244
|
-
}
|
|
1245
|
-
res._data[0] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(operData.NUM_Exp1_) - operData.NUM_Diff_);
|
|
1246
|
-
}
|
|
1247
|
-
return res;
|
|
1248
|
-
}
|
|
1249
|
-
num_fix(wholes) {
|
|
1250
|
-
let pwr;
|
|
1251
|
-
let num_diff;
|
|
1252
|
-
if (this.NUM_IS_LONG())
|
|
1253
|
-
this.num_4_std_long();
|
|
1254
|
-
pwr = (this._data[0] & ~NUM_TYPE.SIGN_MASK) - NUM_TYPE.EXP_BIAS;
|
|
1255
|
-
if ((num_diff = pwr - ((wholes + 1) >> 1)) < 0)
|
|
1256
|
-
return;
|
|
1257
|
-
if (num_diff < this.SIGNIFICANT_NUM_SIZE - 1) {
|
|
1258
|
-
if ((wholes & 1) === 1)
|
|
1259
|
-
this._data[1 + num_diff] = NUM_TYPE.toSByte(this._data[1 + num_diff] % 10);
|
|
1260
|
-
while ((num_diff < this.SIGNIFICANT_NUM_SIZE - 1) && this._data[1 + num_diff] === 0)
|
|
1261
|
-
num_diff++;
|
|
1262
|
-
}
|
|
1263
|
-
if (num_diff >= this.SIGNIFICANT_NUM_SIZE - 1) {
|
|
1264
|
-
this.NUM_ZERO();
|
|
1265
|
-
return;
|
|
1266
|
-
}
|
|
1267
|
-
if (num_diff > 0) {
|
|
1268
|
-
let i;
|
|
1269
|
-
for (i = 0; i < this.SIGNIFICANT_NUM_SIZE - 1 - num_diff; i++)
|
|
1270
|
-
this._data[1 + i] = this._data[1 + num_diff + i];
|
|
1271
|
-
for (i = 0; i < num_diff; i++)
|
|
1272
|
-
this._data[this.SIGNIFICANT_NUM_SIZE - num_diff + i] = 0;
|
|
1273
|
-
this._data[0] = NUM_TYPE.toSByte(this._data[0] - NUM_TYPE.toSByte(num_diff));
|
|
1274
|
-
}
|
|
1275
|
-
}
|
|
1276
|
-
SHRT_IS_ZERO(pos) {
|
|
1277
|
-
return this._data[pos] === 0 && this._data[pos + 1] === 0;
|
|
1278
|
-
}
|
|
1279
|
-
setZero(asLong) {
|
|
1280
|
-
let i;
|
|
1281
|
-
for (i = 0; i < NUM_TYPE.NUM_SIZE; i++)
|
|
1282
|
-
this._data[i] = 0;
|
|
1283
|
-
if (asLong)
|
|
1284
|
-
this._data[0] = NUM_TYPE.NUM_LONG_TYPE;
|
|
1285
|
-
}
|
|
1286
|
-
static memcmp(num1, pos1, num2, pos2, len) {
|
|
1287
|
-
let i = 0;
|
|
1288
|
-
while (i < len && num1._data[pos1] === num2._data[pos2] && pos1 < NUM_TYPE.NUM_SIZE && pos2 < NUM_TYPE.NUM_SIZE) {
|
|
1289
|
-
i++;
|
|
1290
|
-
pos1++;
|
|
1291
|
-
pos2++;
|
|
1292
|
-
}
|
|
1293
|
-
if (i === len)
|
|
1294
|
-
return 0;
|
|
1295
|
-
else if (this.toUByte(num1._data[pos1]) < this.toUByte(num2._data[pos2]))
|
|
1296
|
-
return -1;
|
|
1297
|
-
else
|
|
1298
|
-
return 1;
|
|
1299
|
-
}
|
|
1300
|
-
static toUByte(byteVal) {
|
|
1301
|
-
let val = byteVal;
|
|
1302
|
-
if (byteVal < 0)
|
|
1303
|
-
val = 256 + byteVal;
|
|
1304
|
-
return val;
|
|
1305
|
-
}
|
|
1306
|
-
static toSByte(unsignedVal) {
|
|
1307
|
-
let val = 0;
|
|
1308
|
-
if (unsignedVal > Constants.SByteMaxValue)
|
|
1309
|
-
val = (unsignedVal - 256);
|
|
1310
|
-
else
|
|
1311
|
-
val = unsignedVal;
|
|
1312
|
-
return val;
|
|
1313
|
-
}
|
|
1314
|
-
static MaxLONG() {
|
|
1315
|
-
let nUM_TYPE = new NUM_TYPE();
|
|
1316
|
-
nUM_TYPE._data[0] = NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 5);
|
|
1317
|
-
nUM_TYPE._data[1] = 21;
|
|
1318
|
-
nUM_TYPE._data[2] = 47;
|
|
1319
|
-
nUM_TYPE._data[3] = 48;
|
|
1320
|
-
nUM_TYPE._data[4] = 36;
|
|
1321
|
-
nUM_TYPE._data[5] = 47;
|
|
1322
|
-
return nUM_TYPE;
|
|
1323
|
-
}
|
|
1324
|
-
static MinLONG() {
|
|
1325
|
-
let num = new NUM_TYPE();
|
|
1326
|
-
num._data[0] = NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 5);
|
|
1327
|
-
num._data[1] = 21;
|
|
1328
|
-
num._data[2] = 47;
|
|
1329
|
-
num._data[3] = 48;
|
|
1330
|
-
num._data[4] = 36;
|
|
1331
|
-
num._data[5] = 48;
|
|
1332
|
-
return num;
|
|
1333
|
-
}
|
|
1334
|
-
to_double() {
|
|
1335
|
-
return this.storage_mg_2_float(8);
|
|
1336
|
-
}
|
|
1337
|
-
storage_mg_2_float(len) {
|
|
1338
|
-
let sign_pos;
|
|
1339
|
-
let sign;
|
|
1340
|
-
let compnum = new NUM_TYPE();
|
|
1341
|
-
let tmpnum = new NUM_TYPE();
|
|
1342
|
-
let divnum = new NUM_TYPE();
|
|
1343
|
-
let pwr;
|
|
1344
|
-
let bits;
|
|
1345
|
-
let exp;
|
|
1346
|
-
let long1 = 0;
|
|
1347
|
-
let long2 = 0;
|
|
1348
|
-
let fltOut = 0;
|
|
1349
|
-
let cout = new Int8Array([0, 0, 0, 0, 0, 0, 0, 0]);
|
|
1350
|
-
let Num2Pwr23_ = new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 4), 8, 38, 86, 8]);
|
|
1351
|
-
let Num2Pwr52_ = new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 8), 45, 3, 59, 96, 27, 37, 4, 96]);
|
|
1352
|
-
let base_Num16Pwrs = [
|
|
1353
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 1]),
|
|
1354
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 16]),
|
|
1355
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 2), 2, 56]),
|
|
1356
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 2), 40, 96]),
|
|
1357
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 3), 6, 55, 36]),
|
|
1358
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 4), 1, 4, 85, 76]),
|
|
1359
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 4), 16, 77, 72, 16]),
|
|
1360
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 5), 2, 68, 43, 54, 56]),
|
|
1361
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 5), 42, 94, 96, 72, 96]),
|
|
1362
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 6), 6, 87, 19, 47, 67, 36]),
|
|
1363
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 7), 1, 9, 95, 11, 62, 77, 76]),
|
|
1364
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 7), 17, 59, 21, 86, 4, 44, 16]),
|
|
1365
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 8), 2, 81, 47, 49, 76, 71, 6, 56]),
|
|
1366
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 8), 45, 3, 59, 96, 27, 37, 4, 96]),
|
|
1367
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 9), 7, 20, 57, 59, 40, 37, 92, 79, 36])
|
|
1368
|
-
];
|
|
1369
|
-
let base_Num2Pwrs = [
|
|
1370
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 1]),
|
|
1371
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 2]),
|
|
1372
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 4]),
|
|
1373
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 8])
|
|
1374
|
-
];
|
|
1375
|
-
if (this.NUM_IS_LONG())
|
|
1376
|
-
this.num_4_std_long();
|
|
1377
|
-
if (this._data[0] === 0)
|
|
1378
|
-
return 0;
|
|
1379
|
-
sign = NUM_TYPE.toSByte(this._data[0] & NUM_TYPE.SIGN_MASK);
|
|
1380
|
-
this._data[0] = NUM_TYPE.toSByte(this._data[0] & (~NUM_TYPE.SIGN_MASK));
|
|
1381
|
-
if (len === 4) {
|
|
1382
|
-
bits = 24;
|
|
1383
|
-
compnum = new NUM_TYPE(Num2Pwr23_);
|
|
1384
|
-
}
|
|
1385
|
-
else {
|
|
1386
|
-
bits = 53;
|
|
1387
|
-
compnum = new NUM_TYPE(Num2Pwr52_);
|
|
1388
|
-
}
|
|
1389
|
-
pwr = (this._data[0] - NUM_TYPE.EXP_BIAS) << 1;
|
|
1390
|
-
if (pwr < 0)
|
|
1391
|
-
exp = pwr * 3 + Math.floor((pwr + 1) / 3);
|
|
1392
|
-
else
|
|
1393
|
-
exp = pwr * 3 + Math.floor((pwr + 2) / 3);
|
|
1394
|
-
pwr = bits - exp;
|
|
1395
|
-
if (pwr < 0) {
|
|
1396
|
-
pwr = -pwr;
|
|
1397
|
-
tmpnum = NUM_TYPE.div(this, new NUM_TYPE(base_Num16Pwrs[pwr >> 2]));
|
|
1398
|
-
tmpnum = NUM_TYPE.div(tmpnum, new NUM_TYPE(base_Num2Pwrs[pwr & 3]));
|
|
1399
|
-
}
|
|
1400
|
-
else {
|
|
1401
|
-
tmpnum = this;
|
|
1402
|
-
while (pwr >= 60) {
|
|
1403
|
-
tmpnum = NUM_TYPE.mul(tmpnum, new NUM_TYPE(base_Num16Pwrs[14]));
|
|
1404
|
-
pwr -= 56;
|
|
1405
|
-
}
|
|
1406
|
-
tmpnum = NUM_TYPE.mul(tmpnum, new NUM_TYPE(base_Num16Pwrs[pwr >> 2]));
|
|
1407
|
-
tmpnum = NUM_TYPE.mul(tmpnum, new NUM_TYPE(base_Num2Pwrs[pwr & 3]));
|
|
1408
|
-
}
|
|
1409
|
-
while (NUM_TYPE.num_cmp(tmpnum, compnum) < 0) {
|
|
1410
|
-
exp--;
|
|
1411
|
-
tmpnum = NUM_TYPE.add(tmpnum, tmpnum);
|
|
1412
|
-
}
|
|
1413
|
-
if (len === 4) {
|
|
1414
|
-
long1 = tmpnum.num_2_ulong();
|
|
1415
|
-
}
|
|
1416
|
-
else {
|
|
1417
|
-
divnum = NUM_TYPE.div(tmpnum, new NUM_TYPE(base_Num16Pwrs[8]));
|
|
1418
|
-
divnum.num_trunc(0);
|
|
1419
|
-
long1 = divnum.num_2_ulong();
|
|
1420
|
-
divnum = NUM_TYPE.mul(divnum, new NUM_TYPE(base_Num16Pwrs[8]));
|
|
1421
|
-
divnum = NUM_TYPE.sub(tmpnum, divnum);
|
|
1422
|
-
long2 = divnum.num_2_ulong();
|
|
1423
|
-
}
|
|
1424
|
-
sign_pos = len - 1;
|
|
1425
|
-
if (len === 4) {
|
|
1426
|
-
exp += 126;
|
|
1427
|
-
cout[3] = NUM_TYPE.toSByte(exp >> 1);
|
|
1428
|
-
cout[2] = NUM_TYPE.toSByte((this.LO_CHAR(this.HI_SHRT(long1)) & 0x7F) | ((exp & 0x01) << 7));
|
|
1429
|
-
cout[1] = NUM_TYPE.toSByte(this.HI_CHAR(this.LO_SHRT(long1)));
|
|
1430
|
-
cout[0] = NUM_TYPE.toSByte(this.LO_CHAR(this.LO_SHRT(long1)));
|
|
1431
|
-
}
|
|
1432
|
-
else {
|
|
1433
|
-
exp += 1022;
|
|
1434
|
-
cout[7] = NUM_TYPE.toSByte(exp >> 4);
|
|
1435
|
-
cout[6] = NUM_TYPE.toSByte((this.LO_CHAR(this.HI_SHRT(long1)) & 0x0F) | ((exp & 0x0F) << 4));
|
|
1436
|
-
cout[5] = NUM_TYPE.toSByte(this.HI_CHAR(this.LO_SHRT(long1)));
|
|
1437
|
-
cout[4] = NUM_TYPE.toSByte(this.LO_CHAR(this.LO_SHRT(long1)));
|
|
1438
|
-
cout[3] = NUM_TYPE.toSByte(this.HI_CHAR(this.HI_SHRT(long2)));
|
|
1439
|
-
cout[2] = NUM_TYPE.toSByte(this.LO_CHAR(this.HI_SHRT(long2)));
|
|
1440
|
-
cout[1] = NUM_TYPE.toSByte(this.HI_CHAR(this.LO_SHRT(long2)));
|
|
1441
|
-
cout[0] = NUM_TYPE.toSByte(this.LO_CHAR(this.LO_SHRT(long2)));
|
|
1442
|
-
}
|
|
1443
|
-
if (sign !== 0) {
|
|
1444
|
-
cout[sign_pos] |= NUM_TYPE.SIGN_MASK;
|
|
1445
|
-
this._data[0] |= NUM_TYPE.SIGN_MASK;
|
|
1446
|
-
}
|
|
1447
|
-
fltOut = this.sbyteArr_2_Double(cout);
|
|
1448
|
-
return fltOut;
|
|
1449
|
-
}
|
|
1450
|
-
LO_CHAR(n) {
|
|
1451
|
-
return n & 255;
|
|
1452
|
-
}
|
|
1453
|
-
HI_CHAR(n) {
|
|
1454
|
-
return (n & 65280) >> 8;
|
|
1455
|
-
}
|
|
1456
|
-
LO_SHRT(n) {
|
|
1457
|
-
return (n & 65535);
|
|
1458
|
-
}
|
|
1459
|
-
HI_SHRT(n) {
|
|
1460
|
-
return ((n & -65536) >> 16);
|
|
1461
|
-
}
|
|
1462
|
-
static MK_SHRT(c1, c2) {
|
|
1463
|
-
let strInt = (c1 << 8 | c2).toString();
|
|
1464
|
-
return NNumber.Parse(strInt);
|
|
1465
|
-
}
|
|
1466
|
-
static MK_LONG(s1, s2) {
|
|
1467
|
-
let l1 = s1;
|
|
1468
|
-
let l2 = s2;
|
|
1469
|
-
let strLng = (l1 << 16 | l2).toString();
|
|
1470
|
-
return NNumber.Parse(strLng);
|
|
1471
|
-
}
|
|
1472
|
-
sbyteArr_2_Double(array) {
|
|
1473
|
-
let dataview = new DataView(array.buffer);
|
|
1474
|
-
return dataview.getFloat64(0, true);
|
|
1475
|
-
}
|
|
1476
|
-
static double_2_sbyteArray(d) {
|
|
1477
|
-
let buffer = new ArrayBuffer(8);
|
|
1478
|
-
let dataview = new DataView(buffer);
|
|
1479
|
-
dataview.setFloat64(0, d, true);
|
|
1480
|
-
return (new Int8Array(dataview.buffer));
|
|
1481
|
-
}
|
|
1482
|
-
static eval_op_pwr(num1, num2) {
|
|
1483
|
-
let d0;
|
|
1484
|
-
let d1;
|
|
1485
|
-
if (num1 == null || num2 == null)
|
|
1486
|
-
return null;
|
|
1487
|
-
if (num2.NUM_IS_LONG() && !num2.num_is_neg()) {
|
|
1488
|
-
d1 = num2.to_double();
|
|
1489
|
-
let result = NUM_TYPE.from_double(1);
|
|
1490
|
-
for (let i = 0; i < d1; i++)
|
|
1491
|
-
result = this.mul(result, num1);
|
|
1492
|
-
return result;
|
|
1493
|
-
}
|
|
1494
|
-
else {
|
|
1495
|
-
d0 = num1.to_double();
|
|
1496
|
-
d1 = num2.to_double();
|
|
1497
|
-
if (d0 < 0.0 && d1 !== d1)
|
|
1498
|
-
d0 = 0.0;
|
|
1499
|
-
else if (d0 !== 0.0)
|
|
1500
|
-
d0 = Math.pow(d0, d1);
|
|
1501
|
-
}
|
|
1502
|
-
return NUM_TYPE.from_double(d0);
|
|
1503
|
-
}
|
|
1504
|
-
static from_double(d0) {
|
|
1505
|
-
let array = NUM_TYPE.double_2_sbyteArray(d0);
|
|
1506
|
-
return NUM_TYPE.storage_mg_4_float(8, array);
|
|
1507
|
-
}
|
|
1508
|
-
static storage_mg_4_float(len, inp) {
|
|
1509
|
-
let cinp;
|
|
1510
|
-
let sign;
|
|
1511
|
-
let tmp1;
|
|
1512
|
-
let exp;
|
|
1513
|
-
let bias;
|
|
1514
|
-
let long1;
|
|
1515
|
-
let long2;
|
|
1516
|
-
cinp = new Array(inp.length);
|
|
1517
|
-
for (tmp1 = 0; tmp1 < inp.length; tmp1++)
|
|
1518
|
-
cinp[tmp1] = NUM_TYPE.toUByte(inp[tmp1]);
|
|
1519
|
-
sign = cinp[len - 1];
|
|
1520
|
-
if (len === 4) {
|
|
1521
|
-
exp = ((cinp[2] >> 7) | ((cinp[3] & 0x7F) << 1));
|
|
1522
|
-
bias = 150;
|
|
1523
|
-
long1 = 0;
|
|
1524
|
-
long2 = NUM_TYPE.MK_LONG(NUM_TYPE.MK_SHRT(0, cinp[2] | 0x80), NUM_TYPE.MK_SHRT(cinp[1], cinp[0]));
|
|
1525
|
-
}
|
|
1526
|
-
else {
|
|
1527
|
-
exp = (((cinp[7] & 0x7F) << 4) | (cinp[6] >> 4));
|
|
1528
|
-
bias = 1075;
|
|
1529
|
-
long1 = NUM_TYPE.MK_LONG(NUM_TYPE.MK_SHRT(0, (cinp[6] & 0x0F) | 0x10), NUM_TYPE.MK_SHRT(cinp[5], cinp[4]));
|
|
1530
|
-
long2 = NUM_TYPE.MK_LONG(NUM_TYPE.MK_SHRT(cinp[3], cinp[2]), NUM_TYPE.MK_SHRT(cinp[1], cinp[0]));
|
|
1531
|
-
}
|
|
1532
|
-
return NUM_TYPE.storage_num_4_fld_flt(long1, long2, 18, sign, bias, exp);
|
|
1533
|
-
}
|
|
1534
|
-
static storage_num_4_fld_flt(long1, long2, dec, sign, bias, expr) {
|
|
1535
|
-
let base_Num16Pwrs = [
|
|
1536
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 1]),
|
|
1537
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 16]),
|
|
1538
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 2), 2, 56]),
|
|
1539
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 2), 40, 96]),
|
|
1540
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 3), 6, 55, 36]),
|
|
1541
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 4), 1, 4, 85, 76]),
|
|
1542
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 4), 16, 77, 72, 16]),
|
|
1543
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 5), 2, 68, 43, 54, 56]),
|
|
1544
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 5), 42, 94, 96, 72, 96]),
|
|
1545
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 6), 6, 87, 19, 47, 67, 36]),
|
|
1546
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 7), 1, 9, 95, 11, 62, 77, 76]),
|
|
1547
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 7), 17, 59, 21, 86, 4, 44, 16]),
|
|
1548
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 8), 2, 81, 47, 49, 76, 71, 6, 56]),
|
|
1549
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 8), 45, 3, 59, 96, 27, 37, 4, 96]),
|
|
1550
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 9), 7, 20, 57, 59, 40, 37, 92, 79, 36])
|
|
1551
|
-
];
|
|
1552
|
-
let base_Num2Pwrs = [
|
|
1553
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 1]),
|
|
1554
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 2]),
|
|
1555
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 4]),
|
|
1556
|
-
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 8])
|
|
1557
|
-
];
|
|
1558
|
-
let tmpnum = new NUM_TYPE();
|
|
1559
|
-
let outVal = new NUM_TYPE();
|
|
1560
|
-
let exp = expr;
|
|
1561
|
-
if (exp === 0) {
|
|
1562
|
-
outVal.NUM_ZERO();
|
|
1563
|
-
return outVal;
|
|
1564
|
-
}
|
|
1565
|
-
outVal.num_4_ulong(long2);
|
|
1566
|
-
if (long1 !== 0) {
|
|
1567
|
-
tmpnum.num_4_ulong(long1);
|
|
1568
|
-
tmpnum = NUM_TYPE.mul(tmpnum, new NUM_TYPE(base_Num16Pwrs[8]));
|
|
1569
|
-
outVal = NUM_TYPE.add(tmpnum, outVal);
|
|
1570
|
-
}
|
|
1571
|
-
exp = (exp - bias);
|
|
1572
|
-
if (exp < 0) {
|
|
1573
|
-
exp = -exp;
|
|
1574
|
-
while (exp >= 60) {
|
|
1575
|
-
outVal = NUM_TYPE.div(outVal, new NUM_TYPE(base_Num16Pwrs[14]));
|
|
1576
|
-
exp -= 56;
|
|
1577
|
-
}
|
|
1578
|
-
tmpnum = NUM_TYPE.mul(new NUM_TYPE(base_Num16Pwrs[exp >> 2]), new NUM_TYPE(base_Num2Pwrs[exp & 3]));
|
|
1579
|
-
outVal = NUM_TYPE.div(outVal, tmpnum);
|
|
1580
|
-
}
|
|
1581
|
-
else {
|
|
1582
|
-
if (exp >= 60) {
|
|
1583
|
-
outVal.NUM_ZERO();
|
|
1584
|
-
return outVal;
|
|
1585
|
-
}
|
|
1586
|
-
tmpnum = NUM_TYPE.mul(new NUM_TYPE(base_Num16Pwrs[exp >> 2]), new NUM_TYPE(base_Num2Pwrs[exp & 3]));
|
|
1587
|
-
outVal = NUM_TYPE.mul(outVal, tmpnum);
|
|
1588
|
-
}
|
|
1589
|
-
if ((sign & 0x80) !== 0)
|
|
1590
|
-
outVal._data[0] = outVal._data[0] | NUM_TYPE.SIGN_MASK;
|
|
1591
|
-
outVal.round(dec);
|
|
1592
|
-
return outVal;
|
|
1593
|
-
}
|
|
1594
|
-
static eval_op_log(val1) {
|
|
1595
|
-
if (val1 == null)
|
|
1596
|
-
return null;
|
|
1597
|
-
let resVal = new NUM_TYPE();
|
|
1598
|
-
let d = val1.to_double();
|
|
1599
|
-
if (d > 0.0)
|
|
1600
|
-
resVal = NUM_TYPE.from_double(Math.log(d));
|
|
1601
|
-
else
|
|
1602
|
-
resVal.NUM_ZERO();
|
|
1603
|
-
return resVal;
|
|
1604
|
-
}
|
|
1605
|
-
static eval_op_exp(val1) {
|
|
1606
|
-
let resVal;
|
|
1607
|
-
if (val1 === null)
|
|
1608
|
-
return null;
|
|
1609
|
-
let d = val1.to_double();
|
|
1610
|
-
resVal = NUM_TYPE.from_double(Math.exp(d));
|
|
1611
|
-
return resVal;
|
|
1612
|
-
}
|
|
1613
|
-
static eval_op_abs(val1) {
|
|
1614
|
-
if (val1 === null)
|
|
1615
|
-
return null;
|
|
1616
|
-
let resVal = new NUM_TYPE(val1);
|
|
1617
|
-
resVal.num_abs();
|
|
1618
|
-
return resVal;
|
|
1619
|
-
}
|
|
1620
|
-
static eval_op_sin(val1) {
|
|
1621
|
-
if (val1 === null)
|
|
1622
|
-
return null;
|
|
1623
|
-
let resVal = new NUM_TYPE();
|
|
1624
|
-
let d = val1.to_double();
|
|
1625
|
-
resVal = NUM_TYPE.from_double(Math.sin(d));
|
|
1626
|
-
return resVal;
|
|
1627
|
-
}
|
|
1628
|
-
static eval_op_cos(val1) {
|
|
1629
|
-
if (val1 === null)
|
|
1630
|
-
return null;
|
|
1631
|
-
let resVal = new NUM_TYPE();
|
|
1632
|
-
let d = val1.to_double();
|
|
1633
|
-
resVal = NUM_TYPE.from_double(Math.cos(d));
|
|
1634
|
-
return resVal;
|
|
1635
|
-
}
|
|
1636
|
-
static eval_op_tan(val1) {
|
|
1637
|
-
if (val1 == null)
|
|
1638
|
-
return null;
|
|
1639
|
-
let resVal = new NUM_TYPE();
|
|
1640
|
-
let d = val1.to_double();
|
|
1641
|
-
resVal = NUM_TYPE.from_double(Math.tan(d));
|
|
1642
|
-
return resVal;
|
|
1643
|
-
}
|
|
1644
|
-
static eval_op_asin(val1) {
|
|
1645
|
-
if (val1 === null)
|
|
1646
|
-
return null;
|
|
1647
|
-
let resVal = new NUM_TYPE();
|
|
1648
|
-
let d = val1.to_double();
|
|
1649
|
-
if (d <= 1.0 && d >= -1.0)
|
|
1650
|
-
resVal = NUM_TYPE.from_double(Math.asin(d));
|
|
1651
|
-
else
|
|
1652
|
-
resVal = NUM_TYPE.from_double(0.0);
|
|
1653
|
-
return resVal;
|
|
1654
|
-
}
|
|
1655
|
-
static eval_op_acos(val1) {
|
|
1656
|
-
if (val1 === null)
|
|
1657
|
-
return null;
|
|
1658
|
-
let resVal = new NUM_TYPE();
|
|
1659
|
-
let d = val1.to_double();
|
|
1660
|
-
if (d <= 1.0 && d >= -1.0)
|
|
1661
|
-
resVal = NUM_TYPE.from_double(Math.acos(d));
|
|
1662
|
-
else
|
|
1663
|
-
resVal = NUM_TYPE.from_double(0.0);
|
|
1664
|
-
return resVal;
|
|
1665
|
-
}
|
|
1666
|
-
static eval_op_atan(val1) {
|
|
1667
|
-
if (val1 === null)
|
|
1668
|
-
return null;
|
|
1669
|
-
let resVal = new NUM_TYPE();
|
|
1670
|
-
let d = val1.to_double();
|
|
1671
|
-
resVal = NUM_TYPE.from_double(Math.atan(d));
|
|
1672
|
-
return resVal;
|
|
1673
|
-
}
|
|
1674
|
-
num_abs() {
|
|
1675
|
-
let l;
|
|
1676
|
-
if (this.NUM_IS_LONG()) {
|
|
1677
|
-
l = this.NUM_LONG();
|
|
1678
|
-
if (l < 0)
|
|
1679
|
-
l = -l;
|
|
1680
|
-
this.NUM_4_LONG(l);
|
|
1681
|
-
return;
|
|
1682
|
-
}
|
|
1683
|
-
this._data[0] &= NUM_TYPE.toSByte(~NUM_TYPE.SIGN_MASK);
|
|
1684
|
-
}
|
|
1685
|
-
static eval_op_rand(val1) {
|
|
1686
|
-
if (val1 === null)
|
|
1687
|
-
return null;
|
|
1688
|
-
let rand_initialized = Randomizer.get_initialized();
|
|
1689
|
-
let rand_mod;
|
|
1690
|
-
let rand_mul;
|
|
1691
|
-
let rand_seed;
|
|
1692
|
-
let tmp_num = new NUM_TYPE();
|
|
1693
|
-
if (!rand_initialized) {
|
|
1694
|
-
Randomizer.set_initialized();
|
|
1695
|
-
rand_mod = new NUM_TYPE();
|
|
1696
|
-
rand_mul = new NUM_TYPE();
|
|
1697
|
-
rand_seed = new NUM_TYPE();
|
|
1698
|
-
rand_mod.num_4_a_std("100000007");
|
|
1699
|
-
rand_mul.num_4_a_std("75000007");
|
|
1700
|
-
rand_seed.num_4_a_std("12345678");
|
|
1701
|
-
Randomizer.set_mod(rand_mod.to_double());
|
|
1702
|
-
Randomizer.set_mul(rand_mul.to_double());
|
|
1703
|
-
Randomizer.set_seed(rand_seed.to_double());
|
|
1704
|
-
}
|
|
1705
|
-
else {
|
|
1706
|
-
rand_mod = NUM_TYPE.from_double(Randomizer.get_mod());
|
|
1707
|
-
rand_mul = NUM_TYPE.from_double(Randomizer.get_mul());
|
|
1708
|
-
rand_seed = NUM_TYPE.from_double(Randomizer.get_seed());
|
|
1709
|
-
}
|
|
1710
|
-
if (!val1.num_is_zero()) {
|
|
1711
|
-
if (val1.num_is_neg())
|
|
1712
|
-
rand_seed.NUM_4_LONG(NUM_TYPE.hash_rand());
|
|
1713
|
-
else
|
|
1714
|
-
rand_seed = new NUM_TYPE(val1);
|
|
1715
|
-
}
|
|
1716
|
-
else {
|
|
1717
|
-
if (rand_seed.num_is_neg()) {
|
|
1718
|
-
tmp_num.NUM_4_LONG(-1);
|
|
1719
|
-
rand_seed = NUM_TYPE.mul(rand_seed, tmp_num);
|
|
1720
|
-
}
|
|
1721
|
-
}
|
|
1722
|
-
rand_seed = NUM_TYPE.mul(rand_seed, rand_mul);
|
|
1723
|
-
rand_seed = NUM_TYPE.mod(rand_seed, rand_mod);
|
|
1724
|
-
tmp_num = NUM_TYPE.div(rand_seed, rand_mod);
|
|
1725
|
-
Randomizer.set_mod(rand_mod.to_double());
|
|
1726
|
-
Randomizer.set_mul(rand_mul.to_double());
|
|
1727
|
-
Randomizer.set_seed(rand_seed.to_double());
|
|
1728
|
-
return tmp_num;
|
|
1729
|
-
}
|
|
1730
|
-
static hash_rand() {
|
|
1731
|
-
return ((new Date().getMilliseconds()) ^ Math.random() * 12345678);
|
|
1732
|
-
}
|
|
1733
|
-
}
|
|
1734
|
-
export class OperData {
|
|
1735
|
-
NUM_Diff_ = 0;
|
|
1736
|
-
NUM_Exp1_ = 0;
|
|
1737
|
-
NUM_Exp2_ = 0;
|
|
1738
|
-
}
|
|
1739
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTlVNX1RZUEUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZGF0YS9OVU1fVFlQRS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUcsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBYXRELE1BQU0sT0FBTyxRQUFRO0lBSW5CLE1BQU0sQ0FBQyxZQUFZLEdBQVcsVUFBVSxDQUFDO0lBQ3pDLE1BQU0sQ0FBQyxPQUFPLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxDQUFDLFNBQVMsR0FBVyxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLENBQUMsUUFBUSxHQUFXLEVBQUUsQ0FBQztJQUM3QixNQUFNLENBQUMsYUFBYSxHQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sQ0FBQyxRQUFRLEdBQVcsRUFBRSxDQUFDO0lBQzdCLE1BQU0sQ0FBQyxTQUFTLEdBQVcsQ0FBQyxHQUFHLENBQUM7SUFFaEMsU0FBUyxHQUFXLEdBQUcsQ0FBQztJQUN4QixXQUFXLEdBQVcsR0FBRyxDQUFDO0lBQ2xCLG9CQUFvQixHQUFXLENBQUMsQ0FBQztJQUNqQyxLQUFLLEdBQWMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTVELElBQUksSUFBSSxDQUFDLEtBQWdC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LENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDL0QsSUFBSSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hFLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkUsSUFBSSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEUsSUFBSSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDeEUsSUFBSSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1RSxJQUFJLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25GLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0RixJQUFJLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEYsSUFBSSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM1RixDQUFDO1FBRUYsSUFBSSxh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RSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1RSxJQUFJLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25GLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0RixJQUFJLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVB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U0FDRjtRQUVELFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5QyxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTVDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDekMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN6QyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFLTyxNQUFNLENBQUMsU0FBUztRQUN0QixPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDO0lBTXJFLENBQUM7O0FBR0gsTUFBTSxPQUFPLFFBQVE7SUFDbkIsU0FBUyxHQUFXLENBQUMsQ0FBQztJQUN0QixTQUFTLEdBQVcsQ0FBQyxDQUFDO0lBQ3RCLFNBQVMsR0FBVyxDQUFDLENBQUM7Q0FDdkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyAgSW50MzIsIE5OdW1iZXIsIE5TdHJpbmcsIE51bWJlclN0eWxlcywgU3RyaW5nQnVpbGRlciB9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHsgQ29uc3RhbnRzLCBQSUNJbnRlcmZhY2UsIFJhbmRvbWl6ZXIsIFN0b3JhZ2VBdHRyaWJ1dGUsIFV0aWxTdHJCeXRlTW9kZSB9IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQgeyBQSUMgfSBmcm9tICcuLi9ndWkvUElDJztcclxuaW1wb3J0IHsgSUVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vZW52L0lFbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IEV2ZW50cyB9IGZyb20gJy4uLy4uL0V2ZW50cyc7XHJcbmltcG9ydCB7IEd1aUVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vR3VpRW52aXJvbm1lbnQnO1xyXG5cclxuLy8vICAgVGhpcyBjbGFzcyBoYW5kbGVzIGEgTWFnaWMgTnVtYmVyIHRoZSBpZGVudGljYWwgd2F5IGl0J3MgcmVwcmVzZW50ZWQgaW4gTWFnaWMuXHJcbi8vLyAgIE1vc3Qgb2YgdGhlIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyB3ZXJlIGNvcGllZCBmcm9tIHRoZSBDKysgc291cmNlcyBvZiBNYWdpYyxcclxuLy8vICAgaW4gb3JkZXIgdG8ga2VlcCB0aGUgZXhhY3QgbG9naWMgdXNlZCBpbiBvcmRlciB0byBpbXBsZW1lbnQgYWxsIHRoZSBmdW5jdGlvbmFsaXR5XHJcbi8vLyAgIGV4cGVjdGVkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBleGFjdCBtZXRob2RzIG5hbWVzIGFuZCB2YXJpYWJsZXMgbmFtZXMgd2hlcmUgdXNlZFxyXG4vLy8gICBpbiBvcmRlciB0byBtYWtlIGZ1dHVyZSBkZWJ1Z2dpbmcgbW9yZSBlYXN5ZXIuXHJcbi8vLyAgIE5vdGljZSBhIGxvbmcgZGF0YSB0eXBlIHRoYXQgaXMgdXNlZCBpbiBNYWdpYyBDKysgc291cmNlcywgaXMgcmVwcmVzZW50ZWQgaW4gamF2YVxyXG4vLy8gICBieSB0aGUgaW50IGRhdGEgdHlwZS5cclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxhdXRob3I+ICBBbG9uIEJhci1OZXNcclxuLy8vIDwvYXV0aG9yPlxyXG5cclxuZXhwb3J0IGNsYXNzIE5VTV9UWVBFIHtcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIENvbnN0YW50c1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgc3RhdGljIElOVF9aRVJPX0hFWDogc3RyaW5nID0gXCIwMDAwMDAwMFwiO1xyXG4gIHN0YXRpYyBOT19ST09NOiBudW1iZXIgPSAtMTtcclxuICBzdGF0aWMgWkVST19GSUxMOiBudW1iZXIgPSAtMjtcclxuICBzdGF0aWMgTlVNX1NJWkU6IG51bWJlciA9IDIwO1xyXG4gIHN0YXRpYyBOVU1fTE9OR19UWVBFOiBudW1iZXIgPSAtMTtcclxuICBzdGF0aWMgRVhQX0JJQVM6IG51bWJlciA9IDY0O1xyXG4gIHN0YXRpYyBTSUdOX01BU0s6IG51bWJlciA9IC0xMjg7XHJcblxyXG4gIENPTU1BQ0hBUjogc3RyaW5nID0gJywnO1xyXG4gIERFQ0lNQUxDSEFSOiBzdHJpbmcgPSAnLic7XHJcbiAgcHJpdmF0ZSBTSUdOSUZJQ0FOVF9OVU1fU0laRTogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9kYXRhOiBJbnQ4QXJyYXkgPSBuZXcgSW50OEFycmF5KE5VTV9UWVBFLk5VTV9TSVpFKTtcclxuXHJcbiAgc2V0IERhdGEodmFsdWU6IEludDhBcnJheSkge1xyXG4gICAgdGhpcy5fZGF0YSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IERhdGEoKTogSW50OEFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBDb25zdHJ1Y3RvciBsaXN0XHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgY29uc3RydWN0b3IoKTtcclxuICBjb25zdHJ1Y3RvcihyZWNvcmRIZXhTdHI6IHN0cmluZyk7XHJcbiAgY29uc3RydWN0b3IoYnl0ZVZhbDogSW50OEFycmF5LCBvZmZzZXQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpO1xyXG4gIGNvbnN0cnVjdG9yKGJ5dGVWYWw6IEludDhBcnJheSk7XHJcbiAgY29uc3RydWN0b3IoZGVjU3RyOiBzdHJpbmcsIHBpYzogUElDLCBjb21wSWR4OiBudW1iZXIpO1xyXG4gIGNvbnN0cnVjdG9yKG51bUZyb206IE5VTV9UWVBFKTtcclxuICBjb25zdHJ1Y3RvcihyZWNvcmRIZXhTdHJPckJ5dGVWYWxPckRlY1N0ck9yTnVtRnJvbT86IGFueSwgb2Zmc2V0T3JQaWM/OiBhbnksIGxlbmd0aE9yQ29tcElkeD86IG51bWJlcikge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIChyZWNvcmRIZXhTdHJPckJ5dGVWYWxPckRlY1N0ck9yTnVtRnJvbSA9PT0gbnVsbCB8fCByZWNvcmRIZXhTdHJPckJ5dGVWYWxPckRlY1N0ck9yTnVtRnJvbS5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzEocmVjb3JkSGV4U3RyT3JCeXRlVmFsT3JEZWNTdHJPck51bUZyb20pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiAocmVjb3JkSGV4U3RyT3JCeXRlVmFsT3JEZWNTdHJPck51bUZyb20gPT09IG51bGwgfHwgcmVjb3JkSGV4U3RyT3JCeXRlVmFsT3JEZWNTdHJPck51bUZyb20gaW5zdGFuY2VvZiBJbnQ4QXJyYXkpICYmIChvZmZzZXRPclBpYyA9PT0gbnVsbCB8fCBvZmZzZXRPclBpYy5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSAmJiAobGVuZ3RoT3JDb21wSWR4ID09PSBudWxsIHx8IGxlbmd0aE9yQ29tcElkeC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzIocmVjb3JkSGV4U3RyT3JCeXRlVmFsT3JEZWNTdHJPck51bUZyb20sIG9mZnNldE9yUGljLCBsZW5ndGhPckNvbXBJZHgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAocmVjb3JkSGV4U3RyT3JCeXRlVmFsT3JEZWNTdHJPck51bUZyb20gPT09IG51bGwgfHwgcmVjb3JkSGV4U3RyT3JCeXRlVmFsT3JEZWNTdHJPck51bUZyb20gaW5zdGFuY2VvZiBJbnQ4QXJyYXkpKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMyhyZWNvcmRIZXhTdHJPckJ5dGVWYWxPckRlY1N0ck9yTnVtRnJvbSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIChyZWNvcmRIZXhTdHJPckJ5dGVWYWxPckRlY1N0ck9yTnVtRnJvbSA9PT0gbnVsbCB8fCByZWNvcmRIZXhTdHJPckJ5dGVWYWxPckRlY1N0ck9yTnVtRnJvbS5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSAmJiAob2Zmc2V0T3JQaWMgPT09IG51bGwgfHwgb2Zmc2V0T3JQaWMgaW5zdGFuY2VvZiBQSUMpICYmIChsZW5ndGhPckNvbXBJZHggPT09IG51bGwgfHwgbGVuZ3RoT3JDb21wSWR4LmNvbnN0cnVjdG9yID09PSBOdW1iZXIpKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfNChyZWNvcmRIZXhTdHJPckJ5dGVWYWxPckRlY1N0ck9yTnVtRnJvbSwgb2Zmc2V0T3JQaWMsIGxlbmd0aE9yQ29tcElkeCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29uc3RydWN0b3JfNShyZWNvcmRIZXhTdHJPckJ5dGVWYWxPckRlY1N0ck9yTnVtRnJvbSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU2V0IHZhbHVlIHRvIDBcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdENvbnN0KCk7XHJcbiAgICB0aGlzLk5VTV9aRVJPKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ3JlYXRlcyBhIE1hZ2ljIE51bWJlciBmcm9tIGEgc3RyaW5nIGdvdCBmcm9tIHRoZSBYTUwgcmVjb3JkIHZhbHVlLiBUaGVcclxuICAvLy8gICBTdHJpbmcgaXMgNDAgY2hhcmFjdGVycyBsb25nIGluIGFuIGhleGEgcmVwcmVzZW50YXRpb24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY29yZEhleFN0clwiPiAgTWFnaWMgbnVtYmVyIGluIGhleCBmb3JtYXQsIDQwIGNoYXJhY3RlcnMgbG9uZ1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShyZWNvcmRIZXhTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgdHdvRGlnaXRzOiBzdHJpbmc7XHJcbiAgICB0aGlzLmluaXRDb25zdCgpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFOyBpID0gaSArIDEpIHtcclxuICAgICAgICB0d29EaWdpdHMgPSByZWNvcmRIZXhTdHIuc3Vic3RyKCBpICogMiwgMik7XHJcbiAgICAgICAgdGhpcy5fZGF0YVtpXSA9IE5VTV9UWVBFLnRvU0J5dGUoTk51bWJlci5QYXJzZSh0d29EaWdpdHMsIE51bWJlclN0eWxlcy5IZXhOdW1iZXIpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZVdhcm5pbmdUb0xvZyhleCk7XHJcblxyXG4gICAgICB0aGlzLk5VTV9aRVJPKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ3JlYXRlcyBhIE1hZ2ljIE51bWJlciBmcm9tIGFycmF5IG9mIGJ5dGVzLiBVc2VkIGZyb20gdGhlIGV4cHJlc3Npb24gZXZhbHVhdG9yXHJcbiAgLy8vICAgd2hlbiBhIE1hZ2ljIE51bWJlciB2YWx1ZSBhcGVhcnMgd2l0aGluIGFuIGV4cHJlc3Npb24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ5dGVWYWxcIj4gIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIE1hZ2ljIE51bWJlcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvZmZzZXRcIj4gICBJbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGVuZ3RoXCI+ICAgTnVtYmVyIG9mIGJ5dGVzIHRvIHVzZSA8L3BhcmFtPlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMihieXRlVmFsOiBJbnQ4QXJyYXksIG9mZnNldDogbnVtYmVyLCBsZW5ndGg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgdGhpcy5fZGF0YVtpXSA9IGJ5dGVWYWxbaSArIG9mZnNldF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ3JlYXRlcyBhIE1hZ2ljIE51bWJlciBmcm9tIGFycmF5IG9mIGJ5dGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzMoYnl0ZVZhbDogSW50OEFycmF5KTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzIoYnl0ZVZhbCwgMCwgYnl0ZVZhbC5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENyZWF0ZXMgYSBNYWdpYyBOdW1iZXIgZnJvbSBhIGRlY2ltYWwgZm9yIG51bWJlciBhbmQgaXRzIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVjU3RyXCI+ICBUaGUgbnVtYmVyIGluIGEgc3RyaW5nIGRlY2ltYWwgZm9ybWF0IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj4gICAgIFRoZSBwaWN0dXJlIGZvcm1hdCB0byBiZSB1c2VkIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl80KGRlY1N0cjogc3RyaW5nLCBwaWM6IFBJQywgY29tcElkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgIHRoaXMuZnJvbV9hKGRlY1N0ciwgcGljLCBjb21wSWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDcmVhdGVzIGEgTWFnaWMgTnVtYmVyIGZyb20gYSBNYWdpYyBOdW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibnVtRnJvbVwiPiAgVGhlIHNvdXJjZSBNYWdpYyBOdW1iZXIgPC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzUobnVtRnJvbTogTlVNX1RZUEUpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdENvbnN0KCk7XHJcbiAgICB0aGlzLl9kYXRhID0gbmV3IEludDhBcnJheShudW1Gcm9tLl9kYXRhLmxlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBfYWk6IG51bWJlciA9IDA7IF9haSA8IHRoaXMuX2RhdGEubGVuZ3RoOyArK19haSlcclxuICAgICAgdGhpcy5fZGF0YVtfYWldID0gbnVtRnJvbS5fZGF0YVtfYWldO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGVjaW1hbCBzdHJpbmcgZnJvbSB0aGUgbnVtYmVyIHN0b3JlZCBpbiBhIE1hZ2ljIE51bWJlci5cclxuICAvLy8gICBUaGUgc3RyaW5nIGlzIGJ1aWxkIGZyb20gdGhlIHBpY3R1cmUgcHJvdmlkZWQgYXMgYSBwYXJhbWV0ZXIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPlRoZSBwaWN0dXJlIHRvIHVzZSBmb3IgYnVpbGRpbmcgdGhlIGRpc3BsYXkgc3RyaW5nXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBUaGUgZGVjaW1hbCBmb3JtIG9mIHRoZSBNYWdpYyBOdW1iZXIgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHRvRGlzcGxheVZhbHVlKHBpYzogUElDKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRvX2EocGljKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbml0IGNvbnN0YW50cyBvZiB0aGUgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaW5pdENvbnN0KCk6IHZvaWQge1xyXG4gICAgbGV0IGVudjogSUVudmlyb25tZW50ID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQ7XHJcbiAgICB0aGlzLkRFQ0lNQUxDSEFSID0gZW52LkdldERlY2ltYWwoKTtcclxuICAgIHRoaXMuQ09NTUFDSEFSID0gZW52LkdldFRob3VzYW5kcygpO1xyXG4gICAgdGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRSA9IGVudi5HZXRTaWduaWZpY2FudE51bVNpemUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhbiBoZXhhZGVjaW1hbCBzdHJpbmcgZnJvbSB0aGUgTWFnaWMgTnVtYmVyIGZvciB0aGUgZGF0YSByZWNvcmQgaW5cclxuICAvLy8gICB0aGUgWE1MIHRhZyAodG8gYmUgc2VudCB0byB0aGUgTWFnaWMgU2VydmVyKS4gVGhlIGxlbmd0aCBvZiB0aGlzIHN0cmluZ1xyXG4gIC8vLyAgIHdpbGwgYWxsd2F5cyBiZSB0d28gdGltZXMgdGhlIGxlbmd0aCBvZiB0aGUgTWFnaWMgTnVtYmVycyAoaW4gYnl0ZXMpXHJcbiAgLy8vICAgYmVjYXVzZSBldmVyeSBieXRlIGluIHRoZSBNYWdpYyBOdW1iZXIgd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHR3b1xyXG4gIC8vLyAgIGNoYXJhY3RlciBoZXhhZGVjaW1hbCBzdHJpbmcuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBoZXhhZGVjaW1hbCBzdHJpbmdcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHRvWE1McmVjb3JkKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgaGV4U3RyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIodGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRSAqIDIpO1xyXG4gICAgbGV0IG51bTogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0aGlzLk5VTV9JU19MT05HKCkpXHJcbiAgICAgIG51bSA9IDU7XHJcbiAgICBlbHNlXHJcbiAgICAgIG51bSA9IHRoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkU7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkU7IGkrKykge1xyXG4gICAgICBpZiAoaSA8IG51bSlcclxuICAgICAgICBoZXhTdHIuQXBwZW5kKCgnMCcgKyAodGhpcy5fZGF0YVtpXSAmIDB4RkYpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGhleFN0ci5BcHBlbmQoXCIwMFwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaGV4U3RyLlRvU3RyaW5nKCkudG9VcHBlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUcmFuc2Zvcm1pbmcgYSBkZWNpbWFsIHN0cmluZyBudW1iZXIgdG8gYSBNYWdpYyBOdW1iZXIgdXNpbmcgdGhlIGZvcm1hdFxyXG4gIC8vLyAgIHByb3ZpZGVkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJBbHBoYVwiPiAgVGhlIG51bWJlciBpcyBkZWNpbWFsIHN0cmluZyBmb3JtXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj4gICAgVGhlIHBpY3R1cmUgZm9tYXQgdG8gdXNlIGZvciB0aGUgZXh0cmFjdGluZyB0aGUgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBmcm9tX2EoQWxwaGE6IHN0cmluZywgcGljOiBQSUMsIGNvbXBJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBpZHg6IG51bWJlcjtcclxuICAgIGxldCBkZWM6IGJvb2xlYW47XHJcbiAgICBsZXQgZGVjczogbnVtYmVyO1xyXG4gICAgbGV0IGRpZ2l0OiBudW1iZXI7XHJcbiAgICBsZXQgbGVuOiBudW1iZXI7XHJcbiAgICBsZXQgbm9fcGljOiBib29sZWFuO1xyXG4gICAgbGV0IFBvczogbnVtYmVyO1xyXG4gICAgbGV0IFNUeXBlOiBib29sZWFuO1xyXG4gICAgbGV0IFNQYXJ0OiBib29sZWFuO1xyXG4gICAgbGV0IFNpZ25lZDogbnVtYmVyO1xyXG4gICAgbGV0IGJ1Zjogc3RyaW5nO1xyXG4gICAgbGV0IG1hc2s6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgYzogc3RyaW5nO1xyXG4gICAgbGV0IE5ndHZQcm10OiBib29sZWFuO1xyXG4gICAgbGV0IFNjYW46IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgUGJ1Zjogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCBpc19uZWdhdGl2ZTogYm9vbGVhbjtcclxuICAgIGxldCBuZWdTdHI6IHN0cmluZztcclxuICAgIGxldCBuZWdQcmVmOiBzdHJpbmc7XHJcbiAgICBsZXQgcG9zUHJlZjogc3RyaW5nO1xyXG4gICAgbGV0IG5lZ1N1ZmY6IHN0cmluZztcclxuICAgIGxldCBwb3NTdWZmOiBzdHJpbmc7XHJcbiAgICBsZXQgc3BlY2lhbFZhbE5ld1BvbGljeTogYm9vbGVhbiA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFNwZWNpYWxWYWxOZXdQb2xpY3koKTtcclxuXHJcbiAgICAvLyBQYXJzZSB0aGUgcGljdHVyZSBmb3JtYXRcclxuICAgIG5vX3BpYyA9IChwaWMgPT0gbnVsbCk7XHJcbiAgICBsZW4gPSAwO1xyXG4gICAgU1R5cGUgPSBmYWxzZTsgIC8vIFBJQ19QU1RWIDogdHJ1ZSwgUElDX05HVFY6IGZhbHNlXHJcbiAgICBTUGFydCA9IGZhbHNlOyAgLy8gUElDX1BSRUYgOiB0cnVlLCBQSUNfU1VGIDogZmFsc2VcclxuXHJcbiAgICBpZiAoIW5vX3BpYykge1xyXG4gICAgICBtYXNrID0gcGljLmdldE1hc2soKTtcclxuICAgICAgaWYgKCFzcGVjaWFsVmFsTmV3UG9saWN5KVxyXG4gICAgICAgIGlmIChBbHBoYS5sZW5ndGggPiBwaWMuZ2V0TWFza1NpemUoKSlcclxuICAgICAgICAgIEFscGhhID0gQWxwaGEuc3Vic3RyKDAsIHBpYy5nZXRNYXNrU2l6ZSgpKTtcclxuICAgICAgTmd0dlBybXQgPSBwaWMuaXNOZWdhdGl2ZSgpO1xyXG4gICAgICBpZiAoTmd0dlBybXQpIHtcclxuICAgICAgICBuZWdQcmVmID0gcGljLmdldE5lZ1ByZWZfKCk7XHJcbiAgICAgICAgcG9zUHJlZiA9IHBpYy5nZXRQb3NQcmVmXygpO1xyXG4gICAgICAgIG5lZ1N1ZmYgPSBwaWMuZ2V0TmVnU3VmZl8oKTtcclxuICAgICAgICBwb3NTdWZmID0gcGljLmdldFBvc1N1ZmZfKCk7XHJcblxyXG4gICAgICAgIGlmIChuZWdQcmVmLmxlbmd0aCA9PT0gcG9zUHJlZi5sZW5ndGgpIHtcclxuICAgICAgICAgIGlmIChuZWdQcmVmLmxlbmd0aCA9PT0gMCB8fCBuZWdQcmVmID09PSBwb3NQcmVmKVxyXG4gICAgICAgICAgICBTUGFydCA9IGZhbHNlO1xyXG4gICAgICAgICAgLy8gUElDX1NVRlxyXG4gICAgICAgICAgZWxzZSBTUGFydCA9IHRydWU7IC8vIFBJQ19QUkVGXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgU1BhcnQgPSB0cnVlOyAvLyBQSUNfUFJFRlxyXG5cclxuICAgICAgICBpZiAoU1BhcnQpXHJcbiAgICAgICAgICBuZWdTdHIgPSBuZWdQcmVmO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIG5lZ1N0ciA9IG5lZ1N1ZmY7XHJcblxyXG4gICAgICAgIGlmIChuZWdTdHIubGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgU1R5cGUgPSB0cnVlO1xyXG4gICAgICAgIC8vIFBJQ19QT1NJVElWRVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIFNUeXBlID0gZmFsc2U7IC8vIFBJQ19ORUdBVElWRVxyXG5cclxuICAgICAgICBpZiAoU1R5cGUpXHJcbiAgICAgICAgICBTY2FuID0gKFNQYXJ0ID8gcG9zUHJlZiA6IHBvc1N1ZmYpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIFNjYW4gPSAoU1BhcnQgPyBuZWdQcmVmIDogbmVnU3VmZik7XHJcbiAgICAgICAgbGVuID0gU2Nhbi5sZW5ndGg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBwaWMgPSBuZXcgUElDKFwiXCIsIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQywgY29tcElkeCk7XHJcbiAgICAgIE5ndHZQcm10ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTG9jYWxpemUgdmFyaWFibGVzIGFuZCBmbGFnc1xyXG4gICAgZGVjID0gZmFsc2U7XHJcbiAgICBkZWNzID0gMDtcclxuICAgIGRpZ2l0ID0gMDtcclxuICAgIFNpZ25lZCA9IDA7XHJcblxyXG4gICAgLy8gU3BlY2lhbFZhbE5ld1BvbGljeSA9IFlcclxuICAgIC8vIExvb3Agb24gaW5wdXQgc3RyaW5nIG9mIG51bWJlcnMgYW5kIG1hdGNoIHRoZW0gYWdhaW5zdCB0aGUgcGljdHVyZSBtYXNrXHJcbiAgICAvLyBJdCBtYXkgaGFwcGVuIHRoYXQgdGhlIHBpY3R1cmUgbWFzayBpcyBzbWFsbGVyIHRoYW4gcmVjZWl2ZWQgbnVtYmVyIHN0cmluZ1xyXG4gICAgLy8gRm9yIGV4YW1wbGUsIGlmIHRoZSBzdHJpbmcgcmVjZWl2ZWQgaXMgJzEyMzQuNTYnIHdoZXJlYXMgcGljdHVyZSBpcyAnMi4xJ1xyXG4gICAgLy8gdGhlbiB0aGUgY2hhcmFjdGVycyB0byBwYXJzZSBmcm9tIHRoZSBpbnB1dCBzdHJpbmcgaXMgJzEyMzQuNScgaS5lLiAjIGRpZ2l0c1xyXG4gICAgLy8gc3BlY2lmaWVkIGluIHBpY3R1cmUgYmVmb3JlIHRoZSBkZWNpbWFsIHNob3VsZCBiZSBpZ25vcmVkLiBQYXJzaW5nIHNob3VsZFxyXG4gICAgLy8gY29udGludWUgdGlsbCAjIG9mIGRpZ2l0cyBhZnRlciBkZWNpbWFsIHBvaW50IGluIHBpY3R1cmUgbWF0Y2ggd2l0aCB0aG9zZSBpblxyXG4gICAgLy8gdGhlIGlucHV0IHN0cmluZyBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmdcclxuICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgQWxwaGEubGVuZ3RoOyApIHtcclxuICAgICAgLy8gQXMgbWVudGlvbmVkIGFib3ZlLCBjb250aW51ZSBwYXJzaW5nIGV2ZW4gaWYgbWFzayBsZW5ndGggYXMgZXhoYXVzdGVkIGJ5IGNoZWNraW5nXHJcbiAgICAgIC8vIGlkeCA+PSBwaWMubWFza19zaXplLiBIb3dldmVyLCBhcyBsb25nIGFzIG1hc2sgbGVuZ3RoIGlzIHZhbGlkLCBtYXRjaCB0aGUgbWFza1xyXG4gICAgICBpZiAobm9fcGljIHx8IChzcGVjaWFsVmFsTmV3UG9saWN5ICYmIGlkeCA+PSBwaWMuZ2V0TWFza1NpemUoKSkgIHx8IG1hc2tbaWR4XSA9PT0gU3RyaW5nLmZyb21DaGFyQ29kZShQSUNJbnRlcmZhY2UuUElDX04pKSB7XHJcbiAgICAgICAgYyA9IEFscGhhW2lkeF07XHJcbiAgICAgICAgaWYgKHNwZWNpYWxWYWxOZXdQb2xpY3kpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgLy8gc3RvcCBwYXJzaW5nIGlmICMgb2YgZGVjcyBhbHJlYWR5IHJlYWNoZWRcclxuICAgICAgICAgIGlmIChkZWMgJiYgZGVjcyA9PT0gcGljLmdldERlYygpKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBGaW5hbGx5LCBzdG9wIHBhcnNpbmcgb24gbWF0Y2hpbmcgcmVxdWlyZWQgbm8uIG9mIGRlY2ltYWwgZGlnaXRzXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoYykpIHtcclxuICAgICAgICAgIGRpZ2l0Kys7XHJcbiAgICAgICAgICBQYnVmICs9IGM7XHJcbiAgICAgICAgICBpZiAoZGVjKVxyXG4gICAgICAgICAgICBkZWNzKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGMgPT09IHRoaXMuREVDSU1BTENIQVIpIHtcclxuICAgICAgICAgIFBidWYgKz0gdGhpcy5ERUNJTUFMQ0hBUjtcclxuICAgICAgICAgIGRlYyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGMgIT09IHRoaXMuQ09NTUFDSEFSKSB7XHJcbiAgICAgICAgICBpZiAoTmd0dlBybXQgJiYgU2lnbmVkID09PSAwKSB7XHJcbiAgICAgICAgICAgIFNpZ25lZCA9IDE7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IGlkeCwgUG9zID0gMDsgaSA8PSBBbHBoYS5sZW5ndGggJiYgUG9zIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAobm9fcGljIHx8IG1hc2tbaV0gPT09IFN0cmluZy5mcm9tQ2hhckNvZGUoUElDSW50ZXJmYWNlLlBJQ19OKSkge1xyXG4gICAgICAgICAgICAgICAgYyA9IEFscGhhW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGMgIT09IFNjYW5bUG9zXSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJy0nICYmICFTVHlwZSlcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgaWYgKGMgPT09ICcrJyAmJiBTVHlwZSlcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgU2lnbmVkID0gLTE7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgUG9zKys7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChQb3MgPiAwICYmIFBvcyA8IGxlbilcclxuICAgICAgICAgICAgICBTaWduZWQgPSAtMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBRQ1IgIyAzMDk2MjMgOiBJZiBwcmVmaXgvc3VmZml4IHN0cmluZ3MgY29udGFpbnMgZGlnaXRzIGluIGl0LCBpdCBpcyBjb25zaWRlcmVkIGFzIHBhcnQgb2YgZGF0YS5cclxuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gYXZvaWQgaXQgc2tpcCB0aGUgcHJlZml4IC8gc3VmZml4IHN0cmluZ3Mgd2hpbGUgZXh0cmFjdGluZyB0aGUgZGF0YSBwYXJ0IHRvIGJ1aWxkIE5VTV9UWVBFLlxyXG4gICAgICAgICAgICBpZiAoaWR4ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHBpYy5nZXROZWdQcmVmXygpLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICBpZiAoQWxwaGEuc3RhcnRzV2l0aChwaWMuZ2V0TmVnUHJlZl8oKSkpIHtcclxuICAgICAgICAgICAgICAgICAgaWR4ICs9IHBpYy5nZXROZWdQcmVmXygpLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKHBpYy5nZXRQb3NQcmVmXygpLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICBpZiAoQWxwaGEuc3RhcnRzV2l0aChwaWMuZ2V0UG9zUHJlZl8oKSkpIHtcclxuICAgICAgICAgICAgICAgICAgaWR4ICs9IHBpYy5nZXRQb3NQcmVmXygpLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKHBpYy5nZXROZWdTdWZmXygpLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICBpZiAoQWxwaGEuZW5kc1dpdGgocGljLmdldE5lZ1N1ZmZfKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlkeCArPSBwaWMuZ2V0TmVnU3VmZl8oKS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChwaWMuZ2V0UG9zU3VmZl8oKS5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICAgICAgaWYgKEFscGhhLmVuZHNXaXRoKHBpYy5nZXRQb3NTdWZmXygpKSkge1xyXG4gICAgICAgICAgICAgICAgICBpZHggKz0gcGljLmdldFBvc1N1ZmZfKCkubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZHgrKztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoU2lnbmVkID09PSAwICYmIFNUeXBlKVxyXG4gICAgICBTaWduZWQgPSAxO1xyXG5cclxuICAgIC8vIFJldHVybiByZXN1bHQgb2YgZGVjb2RlZCBkaWdpdHNcclxuICAgIGlzX25lZ2F0aXZlID0gKFNpZ25lZCA9PT0gMSAmJiAhU1R5cGUpIHx8IChTaWduZWQgIT09IDEgJiYgU1R5cGUpO1xyXG4gICAgaWYgKGRlY3MgPiAwIHx8IGRpZ2l0ID4gOSkge1xyXG4gICAgICBidWYgPSAoaXNfbmVnYXRpdmUgPyAnLScgOiAnICcpICsgUGJ1ZjtcclxuICAgICAgdGhpcy5udW1fNF9hX3N0ZChidWYpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLk5VTV80X0xPTkcoKGlzX25lZ2F0aXZlID8gLTEgOiAxKSAqIHRoaXMuYV8yX2xvbmcoUGJ1ZikpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEV4dHJhY3RpbmcgYSBub24gbG9uZyBudW1iZXIgZnJvbSBhIGRlY2ltYWwgc3RyaW5nIG51bWJlciAobnVtYmVycyB3aXRoXHJcbiAgLy8vICAgZGVjaW1hbCBwb2ludCwgZXRjLi4uKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJcIj4gIFRoZSBkZWNpbWFsIHN0cmluZyBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICBudW1fNF9hX3N0ZChzdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGRpZ3N0cjogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCBkaWdsZW46IG51bWJlciA9IDA7XHJcbiAgICBsZXQgd2hvbGVzOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGRlY3M6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgaXNEZWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBpc21pbnVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgcG9zOiBudW1iZXI7XHJcblxyXG4gICAgZm9yIChwb3MgPSAwOyBwb3MgPCBzdHIubGVuZ3RoOyBwb3MrKykge1xyXG4gICAgICBsZXQgYzogc3RyaW5nID0gc3RyLmNoYXJBdChwb3MpO1xyXG4gICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoYykpIHtcclxuICAgICAgICBpZiAoZGlnbGVuID4gMCB8fCBjICE9PSAnMCcpIHtcclxuICAgICAgICAgIGRpZ2xlbisrO1xyXG4gICAgICAgICAgZGlnc3RyID0gZGlnc3RyICsgYztcclxuICAgICAgICAgIGlmICghaXNEZWMpXHJcbiAgICAgICAgICAgIHdob2xlcysrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpc0RlYylcclxuICAgICAgICAgIGRlY3MgPSBkZWNzICsgMTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChjID09PSB0aGlzLkRFQ0lNQUxDSEFSKVxyXG4gICAgICAgIGlzRGVjID0gdHJ1ZTtcclxuICAgICAgZWxzZSBpZiAoYyA9PT0gJy0nKVxyXG4gICAgICAgIGlzbWludXMgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuTlVNX1pFUk8oKTtcclxuICAgIGlmIChkaWdsZW4gPT09IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoKCh3aG9sZXMgKyBkZWNzKSAmIDEpID4gMCkge1xyXG4gICAgICB0aGlzLl9kYXRhWzFdID0gTlVNX1RZUEUudG9TQnl0ZShkaWdzdHIuY2hhckNvZGVBdCgwKSAtICcwJy5jaGFyQ29kZUF0KDApKTtcclxuICAgICAgcG9zID0gMTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcG9zID0gMDtcclxuXHJcbiAgICBsZXQgbnVtcHRyOiBudW1iZXIgPSAxICsgcG9zO1xyXG4gICAgZGlnbGVuID0gTWF0aC5taW4oZGlnbGVuLCAodGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDEpICogMiAtIHBvcyk7XHJcbiAgICB3aGlsZSAocG9zIDwgZGlnbGVuKSB7XHJcbiAgICAgIGxldCBkaWdpdDE6IG51bWJlciA9IE5VTV9UWVBFLnRvU0J5dGUoKGRpZ3N0ci5jaGFyQ29kZUF0KHBvcysrKSAtICcwJy5jaGFyQ29kZUF0KDApKSk7XHJcbiAgICAgIGxldCBkaWdpdDI6IG51bWJlciA9IE5VTV9UWVBFLnRvU0J5dGUoKChwb3MgPCBkaWdsZW4pXHJcbiAgICAgICAgPyAoZGlnc3RyLmNoYXJDb2RlQXQocG9zKyspIC0gJzAnLmNoYXJDb2RlQXQoMCkpXHJcbiAgICAgICAgOiAnXFwwJy5jaGFyQ29kZUF0KDApKSk7XHJcbiAgICAgIHRoaXMuX2RhdGFbbnVtcHRyKytdID0gTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS50b1VCeXRlKGRpZ2l0MSkgKiAxMCArIE5VTV9UWVBFLnRvVUJ5dGUoZGlnaXQyKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdob2xlcyA+IDApXHJcbiAgICAgIHRoaXMuX2RhdGFbMF0gPSBOVU1fVFlQRS50b1NCeXRlKDxudW1iZXI+TlVNX1RZUEUuRVhQX0JJQVMgKyAoKHdob2xlcyArIDEpID4+IDEpKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5fZGF0YVswXSA9IE5VTV9UWVBFLnRvU0J5dGUoPG51bWJlcj5OVU1fVFlQRS5FWFBfQklBUyAtIChkZWNzID4+IDEpKTtcclxuXHJcbiAgICBpZiAoaXNtaW51cylcclxuICAgICAgdGhpcy5fZGF0YVswXSB8PSBOVU1fVFlQRS5TSUdOX01BU0s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVHJhbnNsYXRpbmcgYSBsb25nIHZhbHVlIGludG8gYW4gaW50ZXJuYWwgTWFnaWMgTnVtYmVyIGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibG9uZ1ZhbFwiPiAgVGhlIG51bWJlciB0byBiZSBrZXB0XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgTlVNXzRfTE9ORyhsb25nVmFsOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBoZXhTdHI6IHN0cmluZztcclxuICAgIHRoaXMuTlVNX1pFUk8oKTtcclxuXHJcbiAgICBpZiAobG9uZ1ZhbCAhPT0gMCkge1xyXG4gICAgICBpZiAobG9uZ1ZhbCA8IDApXHJcbiAgICAgICAgbG9uZ1ZhbCA9ICgweEZGRkZGRkZGICsgbG9uZ1ZhbCArIDEpO1xyXG5cclxuICAgICAgaGV4U3RyID0gbG9uZ1ZhbC50b1N0cmluZygxNik7XHJcbiAgICAgIGlmIChsb25nVmFsID4gMClcclxuICAgICAgICBoZXhTdHIgPSBOVU1fVFlQRS5JTlRfWkVST19IRVguc3Vic3RyKGhleFN0ci5sZW5ndGgpICsgaGV4U3RyO1xyXG5cclxuICAgICAgdGhpcy5fZGF0YVsxXSA9IE5VTV9UWVBFLnRvU0J5dGUocGFyc2VJbnQoaGV4U3RyLnN1YnN0cig2LCAoOCkgLSAoNikpLCAxNikpO1xyXG4gICAgICB0aGlzLl9kYXRhWzJdID0gTlVNX1RZUEUudG9TQnl0ZShwYXJzZUludChoZXhTdHIuc3Vic3RyKDQsICg2KSAtICg0KSksIDE2KSk7XHJcbiAgICAgIHRoaXMuX2RhdGFbM10gPSBOVU1fVFlQRS50b1NCeXRlKHBhcnNlSW50KGhleFN0ci5zdWJzdHIoMiwgKDQpIC0gKDIpKSwgMTYpKTtcclxuICAgICAgdGhpcy5fZGF0YVs0XSA9IE5VTV9UWVBFLnRvU0J5dGUocGFyc2VJbnQoaGV4U3RyLnN1YnN0cigwLCAoMikgLSAoMCkpLCAxNikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldHRpbmcgYSBsb25nIHZhbHVlIGZyb20gYSBkZWNpbWFsIHN0cmluZyByZXByZXNlbnRpbmcgYSBsb25nIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0clwiPiAgdGhlIHN0cmluZyByZXByZXNlbnRpbmcgYSBsb25nIHZhbHVlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbG9uZyBudW1iZXJcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGFfMl9sb25nKHN0cjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBuOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChsZXQgcG9zOiBudW1iZXIgPSAwOyBwb3MgPCBzdHIubGVuZ3RoOyBwb3MrKykge1xyXG4gICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoc3RyLmNoYXJBdChwb3MpKSkge1xyXG4gICAgICAgIG4gPSBuICogMTA7XHJcbiAgICAgICAgbiA9IG4gKyBzdHIuY2hhckNvZGVBdChwb3MpIC0gJzAnLmNoYXJDb2RlQXQoMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBuO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFjdGl2YXRpbmcgdGhlIHByb2Nlc3Mgb2YgYnVpbGRpbmcgYSBkZWNpbWFsIHN0cmluZyBieSB0aGUgZm9ybWF0IGluZGljYXRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj5hIG51bWVyaWMgcGljdHVyZSB0byB1c2UgZm9yIGJ1aWxkaW5nIHRoZSBkaXNwbGF5IHN0cmluZ1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHRvX2EocGljOiBQSUMpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudG9fYV9waWMocGljKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBQZXJmb3JtcyB0aGUgcHJvY2VzcyBvZiBidWlsZGluZyBhIGRlY2ltYWwgc3RyaW5nIGJ5IHRoZSBwaWN0dXJlIHByb3ZpZGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPiAgdGhlIHBpY3R1cmUgY2xhc3MgaG9sZGluZyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBpY3R1cmVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgZm9ybSBvZiB0aGUgTWFnaWMgTnVtYmVyXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcm90ZWN0ZWQgdG9fYV9waWMocGljOiBQSUMpOiBzdHJpbmcge1xyXG4gICAgbGV0IGJ1Zjogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigxMjgpO1xyXG4gICAgbGV0IHJlbWFpbnM6IG51bWJlcjtcclxuICAgIGxldCBzaWduX246IGJvb2xlYW47XHJcbiAgICBsZXQgcHJlZl9sZW46IG51bWJlcjtcclxuICAgIGxldCBzdWZmX2xlbjogbnVtYmVyO1xyXG4gICAgbGV0IHByZWZfc3RyOiBTdHJpbmc7XHJcbiAgICBsZXQgc3VmZl9zdHI6IFN0cmluZztcclxuICAgIGxldCBzdHJfcG9zOiBudW1iZXI7XHJcbiAgICBsZXQgc3RyX2xlbjogbnVtYmVyO1xyXG4gICAgbGV0IG91dF9wb3M6IG51bWJlcjtcclxuICAgIGxldCBvdXRfYnVmOiBzdHJpbmdbXTtcclxuICAgIGxldCB0bXBfb3V0X2J1Zjogc3RyaW5nW107XHJcbiAgICBsZXQgcGFkOiBzdHJpbmc7XHJcbiAgICBsZXQgbGVmdDogYm9vbGVhbjtcclxuICAgIGxldCBwZmlsbDogYm9vbGVhbjtcclxuICAgIGxldCBtYXNrX2NoYXJzOiBudW1iZXI7XHJcbiAgICBsZXQgbGVuOiBudW1iZXI7XHJcbiAgICBsZXQgcmVzOiBzdHJpbmdbXTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgaXNPdXQ6IGJvb2xlYW47XHJcbiAgICBsZXQgb3V0VmFsOiBzdHJpbmdbXTtcclxuXHJcbiAgICBsZW4gPSBwaWMuZ2V0TWFza1NpemUoKTtcclxuXHJcbiAgICAvLyBTZXQgc2lnbnMgb2YgbnVtYmVyXHJcbiAgICBzaWduX24gPSAocGljLmlzTmVnYXRpdmUoKSAmJiB0aGlzLm51bV9pc19uZWcoKSA/IGZhbHNlIDogdHJ1ZSk7XHJcblxyXG4gICAgcHJlZl9sZW4gPSAoc2lnbl9uID8gcGljLmdldFBvc1ByZWZfKCkubGVuZ3RoIDogcGljLmdldE5lZ1ByZWZfKCkubGVuZ3RoKTsgLy8gcGljX3NpZ25bUElDX1BSRUZdLmxlbjtcclxuICAgIHN1ZmZfbGVuID0gKHNpZ25fbiA/IHBpYy5nZXRQb3NTdWZmXygpLmxlbmd0aCA6IHBpYy5nZXROZWdTdWZmXygpLmxlbmd0aCk7IC8vIHBpY19zaWduW1BJQ19TVUZGXS5sZW47XHJcblxyXG4gICAgbGVmdCA9IHBpYy5pc0xlZnQoKTtcclxuICAgIHBmaWxsID0gcGljLnBhZEZpbGwoKTtcclxuICAgIG1hc2tfY2hhcnMgPSBwaWMuZ2V0TWFza0NoYXJzKCk7XHJcbiAgICBvdXRWYWwgPSBOU3RyaW5nLlRvQ2hhckFycmF5KHBpYy5nZXRNYXNrKCkuc3Vic3RyKDAsIGxlbikpO1xyXG4gICAgb3V0X2J1ZiA9ICgobGVmdCB8fCAobWFza19jaGFycyA+IDApKSA/IGJ1ZiA6IG91dFZhbCk7XHJcbiAgICBpZiAobGVmdClcclxuICAgIHtcclxuICAgICAgZm9yIChpPTA7IGkgPCBvdXRfYnVmLmxlbmd0aDsgaSsrIClcclxuICAgICAgICBvdXRfYnVmW2ldID0gKDxzdHJpbmc+JzAnLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfVxyXG4gICAgaXNPdXQgPSAoKGxlZnQgfHwgKG1hc2tfY2hhcnMgPiAwKSkgPyBmYWxzZSA6IHRydWUpO1xyXG5cclxuICAgIC8vIENvbnZlcnQgdG8gc3RyaW5nXHJcbiAgICBzdHJfcG9zID0gcHJlZl9sZW47XHJcbiAgICBzdHJfbGVuID0gbGVuIC0gcHJlZl9sZW4gLSBzdWZmX2xlbjtcclxuICAgIHRtcF9vdXRfYnVmID0gb3V0X2J1Zi5zbGljZShzdHJfcG9zLCBvdXRfYnVmLmxlbmd0aCk7XHJcbiAgICBpZiAodGhpcy5OVU1fSVNfTE9ORygpKVxyXG4gICAgICByZW1haW5zID0gdGhpcy5udW1fbF8yX3N0cih0aGlzLk5VTV9MT05HKCksIHRtcF9vdXRfYnVmLCBzdHJfbGVuLCBwaWMpO1xyXG4gICAgZWxzZVxyXG4gICAgICAgIHJlbWFpbnMgPSB0aGlzLnRvX3N0cih0bXBfb3V0X2J1Ziwgc3RyX2xlbiwgcGljKTtcclxuXHJcbiAgICBmb3IgKGkgPSBzdHJfcG9zOyBpIDwgb3V0X2J1Zi5sZW5ndGg7IGkrKylcclxuICAgICAgICBvdXRfYnVmW2ldID0gdG1wX291dF9idWZbaSAtIHN0cl9wb3NdO1xyXG4gICAgdG1wX291dF9idWYgPSBudWxsO1xyXG5cclxuICAgIGlmIChyZW1haW5zIDwgbWFza19jaGFycykge1xyXG4gICAgICAgIHJlcyA9IG5ldyBBcnJheShsZW4pO1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXHJcbiAgICAgICAgcmVzW2ldID0gKHJlbWFpbnMgPT09IE5VTV9UWVBFLlpFUk9fRklMTCA/IHBpYy5nZXRaZXJvUGFkKCkgOiAnKicpO1xyXG4gICAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMocmVzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWFza19jaGFycyA+IDApIHtcclxuICAgICAgcmVtYWlucyAtPSBtYXNrX2NoYXJzO1xyXG4gICAgICBzdHJfcG9zICs9IG1hc2tfY2hhcnM7XHJcbiAgICAgIHN0cl9sZW4gLT0gbWFza19jaGFycztcclxuICAgIH1cclxuXHJcbiAgICAvLyB0YWtlIGNhcmUgb2YgcGFkIGFmdGVyIGFuZCBiZWZvcmUgbnVtYmVyXHJcbiAgICBpZiAocGZpbGwpIHtcclxuICAgICAgcGFkID0gcGljLmdldFBhZCgpO1xyXG4gICAgICBpZiAobGVmdCkge1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCByZW1haW5zOyBpKyspXHJcbiAgICAgICAgICBvdXRfYnVmIFtzdHJfcG9zICsgc3RyX2xlbiArIGldID0gcGFkO1xyXG4gICAgICAgIHN0cl9wb3MgKz0gcmVtYWlucztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVtYWluczsgaSsrKVxyXG4gICAgICAgICAgb3V0X2J1ZltzdHJfcG9zICsgaV0gPSBwYWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBwYWQgPSAnICc7XHJcbiAgICAgIHN0cl9wb3MgKz0gcmVtYWlucztcclxuICAgICAgc3RyX2xlbiAtPSByZW1haW5zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRha2UgY2FyZSBvZiBzdWZmaXggYW5kIHByZWZpeFxyXG4gICAgaWYgKHN1ZmZfbGVuID4gMCkge1xyXG4gICAgICBzdWZmX3N0ciA9IHNpZ25fbiA/IHBpYy5nZXRQb3NTdWZmXygpIDogcGljLmdldE5lZ1N1ZmZfKCk7XHJcbiAgICAgIGlmIChzdWZmX2xlbiA9PT0gMSlcclxuICAgICAgICBvdXRfYnVmW3N0cl9wb3MgKyBzdHJfbGVuXSA9IHN1ZmZfc3RyWzBdO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3VmZl9sZW47IGkrKylcclxuICAgICAgICAgIG91dF9idWZbc3RyX3BvcyArIHN0cl9sZW4gKyBpXSA9IHN1ZmZfc3RyW2ldO1xyXG4gICAgICB9XHJcbiAgICAgIHN0cl9sZW4gKz0gc3VmZl9sZW47XHJcbiAgICB9XHJcbiAgICBpZiAocHJlZl9sZW4gPiAwKSB7XHJcbiAgICAgIHN0cl9wb3MgLT0gcHJlZl9sZW47XHJcbiAgICAgIHN0cl9sZW4gKz0gcHJlZl9sZW47XHJcbiAgICAgIHByZWZfc3RyID0gc2lnbl9uID8gcGljLmdldFBvc1ByZWZfKCkgOiBwaWMuZ2V0TmVnUHJlZl8oKTtcclxuICAgICAgaWYgKHByZWZfbGVuID09PSAxKVxyXG4gICAgICAgICAgb3V0X2J1ZltzdHJfcG9zXSA9IHByZWZfc3RyWzBdO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHByZWZfbGVuOyBpKyspXHJcbiAgICAgICAgICBvdXRfYnVmW3N0cl9wb3MgKyBpXSA9IHByZWZfc3RyW2ldO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHN0cl9wb3Mgbm93IHBvaW50cyB0byBiZWdpbm5pbmcgb2YgcmVzdWx0IHN0clxyXG4gICAgLy8gdGFrZSBjYXJlIG9mIGZpbmFsIHBhZCBhZnRlciBhbmQgYmVmb3JlIG51bWJlclxyXG4gICAgaWYgKCFwZmlsbCkge1xyXG4gICAgICBsZXQgb3V0QnVmTGVuOiBudW1iZXIgPSBvdXRfYnVmLmxlbmd0aDtcclxuXHJcbiAgICAgIGlmIChsZWZ0KSB7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlbWFpbnMgJiYgKHN0cl9wb3MgKyBzdHJfbGVuICsgaSA8IG91dEJ1Zkxlbik7IGkrKylcclxuICAgICAgICAgIG91dF9idWZbc3RyX3BvcyArIHN0cl9sZW4gKyBpXSA9IHBhZDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBzdHJfcG9zIC09IHJlbWFpbnM7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCByZW1haW5zICYmIChzdHJfcG9zICsgaSA8IG91dEJ1Zkxlbik7IGkrKylcclxuICAgICAgICAgIG91dF9idWZbc3RyX3BvcyArIGldID0gcGFkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmVzdWx0IGJ1aWx0LCBmaW5pc2hcclxuICAgIGlmIChpc091dClcclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKG91dF9idWYpO1xyXG5cclxuICAgIC8vIENvcHkgcmVzdWx0IHRvIG91dHB1dCBidWZmZXJcclxuICAgIGlmIChtYXNrX2NoYXJzID09PSAwKSB7XHJcbiAgICAgIGlmIChzdHJfcG9zICsgbGVuID4gb3V0X2J1Zi5sZW5ndGgpXHJcbiAgICAgICAgbGVuID0gb3V0X2J1Zi5sZW5ndGggLSBzdHJfcG9zO1xyXG4gICAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMob3V0X2J1Ziwgc3RyX3BvcywgIGxlbik7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChvdXRfcG9zID0gMDsgb3V0X3BvcyA8IGxlbiAmJiBzdHJfcG9zIDwgb3V0X2J1Zi5sZW5ndGg7IG91dF9wb3MrKylcclxuICAgICAgaWYgKG91dFZhbFtvdXRfcG9zXSA9PT0gU3RyaW5nLmZyb21DaGFyQ29kZShQSUNJbnRlcmZhY2UuUElDX04pKVxyXG4gICAgICAgIG91dFZhbFtvdXRfcG9zXSA9IG91dF9idWZbc3RyX3BvcysrXTtcclxuXHJcbiAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMob3V0VmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWxkaW5nIHRoZSBiYXNpYyBkZWNpbWFsIHN0cmluZyBudW1iZXIgZnJvbSBhIGxvbmcgdmFsdWUgKHdpdGhvdXRcclxuICAvLy8gICB0aGUgc3BlY2lhbCBwaWN0dXJlIGZlYXR1cmVzKS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibnVtXCI+ICBUaGUgbnVtYmVyIHRvIGJlIHRyYW5zbGF0ZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0clwiPiAgVGhlIG1hc2sgdG8gdXNlIGZvciBidWlsZGluZyB0aGUgc3RyaW5nIG51bWJlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8bGVuPiAgICBsZW4gICB0aGUgbGVuIHRvIHVzZSBpbiB0aGUgc3RyIGNoYXIgYXJyYXkgPC9sZW4+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj4gIFRoZSBwaWN0dXJlIGNsYXNzIGhvbGRpbmcgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQgc3RyaW5nXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcm90ZWN0ZWQgbnVtX2xfMl9zdHIobnVtOiBudW1iZXIsIHN0cjogc3RyaW5nW10sIGxlbjogbnVtYmVyLCBwaWM6IFBJQyk6IG51bWJlciB7XHJcbiAgICBsZXQgY29tbWFzOiBib29sZWFuO1xyXG4gICAgbGV0IGRpZ2l0czogbnVtYmVyO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBkZWNzOiBudW1iZXI7XHJcbiAgICBsZXQgajogbnVtYmVyO1xyXG5cclxuICAgIGlmIChudW0gPCAwKVxyXG4gICAgICBudW0gPSAtbnVtO1xyXG4gICAgY29tbWFzID0gcGljLndpdGhDb21hKCk7XHJcbiAgICBkZWNzID0gTWF0aC5taW4ocGljLmdldERlYygpLCBsZW4gLSAxKTtcclxuICAgIGlmIChkZWNzID4gMClcclxuICAgICAgbGVuIC09IChkZWNzICsgMSk7XHJcbiAgICBpID0gbGVuO1xyXG5cclxuICAgIC8vIDI2LzExLzk3IFNoYXkgWi4gQnVnICM3NzA1MjYgLSBJZiBUaGUgZGVjaW1hbCBwb2ludCBpcyB0aGUgZmlyc3RcclxuICAgIC8vIGluIHRoZSBwaWN0dXJlJ3MgZm9ybWF0IC0gYXNzdW1lIHRoYXQgdGhlIGlucHV0IHZhbHVlIGlzIGxlZ2FsICEhXHJcbiAgICBpZiAobnVtID09PSAwICYmICFwaWMuZGVjSW5GaXJzdFBvcygpKSB7XHJcbiAgICAgIGlmIChwaWMuemVyb0ZpbGwoKSlcclxuICAgICAgICByZXR1cm4gKE5VTV9UWVBFLlpFUk9fRklMTCk7XHJcbiAgICAgIGlmIChsZW4gPT09IDApXHJcbiAgICAgICAgcmV0dXJuIChOVU1fVFlQRS5OT19ST09NKTtcclxuXHJcbiAgICAgIGlmIChpID4gc3RyLmxlbmd0aClcclxuICAgICAgICBpID0gc3RyLmxlbmd0aDtcclxuXHJcbiAgICAgIHN0clstLWldID0gJzAnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkZWNzID4gMCkge1xyXG4gICAgICAgIHN0cltsZW5dID0gdGhpcy5ERUNJTUFMQ0hBUjtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IGRlY3M7IGorKylcclxuICAgICAgICBzdHJbbGVuICsgMSArIGpdID0gJzAnO1xyXG4gICAgfVxyXG5cclxuICAgIGRpZ2l0cyA9IDA7XHJcbiAgICBmb3IgKDsgbnVtID4gMDsgbnVtID0gTWF0aC5mbG9vcihudW0gLyAxMCkpIHtcclxuICAgICAgaS0tO1xyXG4gICAgICBpZiAoY29tbWFzKSB7XHJcbiAgICAgICAgaWYgKGRpZ2l0cyA9PT0gMykge1xyXG4gICAgICAgICAgaWYgKGkgPCAwKVxyXG4gICAgICAgICAgICByZXR1cm4gKE5VTV9UWVBFLk5PX1JPT00pO1xyXG4gICAgICAgICAgZGlnaXRzID0gMDtcclxuICAgICAgICAgIHN0cltpLS1dID0gdGhpcy5DT01NQUNIQVI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRpZ2l0cysrO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpIDwgMClcclxuICAgICAgICByZXR1cm4gKE5VTV9UWVBFLk5PX1JPT00pO1xyXG4gICAgICBzdHJbaV0gPSAoKG51bSAlIDEwKS50b1N0cmluZygpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWxkaW5nIHRoZSBiYXNpYyBkZWNpbWFsIHN0cmluZyBudW1iZXIgZnJvbSBhIG5vbiBsb25nIHZhbHVlICh3aXRob3V0XHJcbiAgLy8vICAgdGhlIHNwZWNpYWwgcGljdHVyZSBmZWF0dXJlcykuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0clwiPiAgVGhlIG1hc2sgdG8gdXNlIGZvciBidWlsZGluZyB0aGUgc3RyaW5nIG51bWJlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8bGVuPiAgICBsZW4gICB0aGUgbGVuIHRvIHVzZSBpbiB0aGUgc3RyIGNoYXIgYXJyYXkgPC9sZW4+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj4gIFRoZSBwaWN0dXJlIGNsYXNzIGhvbGRpbmcgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQgc3RyaW5nXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcm90ZWN0ZWQgdG9fc3RyKHN0cjogc3RyaW5nW10sIGxlbjogbnVtYmVyLCBwaWM6IFBJQyk6IG51bWJlciB7XHJcbiAgICBsZXQgdG1wOiBOVU1fVFlQRTtcclxuICAgIGxldCBjb21tYXM6IGJvb2xlYW47XHJcbiAgICBsZXQgZGlnaXRzOiBudW1iZXI7XHJcbiAgICBsZXQgZGVjcG9zOiBudW1iZXI7XHJcbiAgICBsZXQgbGFzdDogbnVtYmVyO1xyXG4gICAgbGV0IGZpcnN0OiBudW1iZXI7XHJcbiAgICBsZXQgajogbnVtYmVyO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBkZWNzOiBudW1iZXI7XHJcbiAgICBsZXQgbnVtX2NoYXI6IG51bWJlcjtcclxuXHJcbiAgICBjb21tYXMgPSBwaWMud2l0aENvbWEoKTtcclxuICAgIGRlY3MgPSBwaWMuZ2V0RGVjKCk7XHJcbiAgICBpZiAoZGVjcyA+PSBsZW4pXHJcbiAgICAgIGRlY3MgPSBsZW4gLSAxO1xyXG5cclxuICAgIHRtcCA9IG5ldyBOVU1fVFlQRSh0aGlzKTtcclxuICAgIHRtcC5yb3VuZChkZWNzKTtcclxuICAgIGlmICh0bXAuTlVNX0lTX0xPTkcoKSlcclxuICAgICAgcmV0dXJuIHRtcC5udW1fbF8yX3N0cih0bXAuTlVNX0xPTkcoKSwgc3RyLCBsZW4sIHBpYyk7XHJcblxyXG4gICAgaWYgKHBpYy56ZXJvRmlsbCgpICYmIHRtcC5fZGF0YVswXSA9PT0gMClcclxuICAgICAgcmV0dXJuIChOVU1fVFlQRS5aRVJPX0ZJTEwpO1xyXG5cclxuICAgIGkgPSBsZW4gLSAxO1xyXG4gICAgZGlnaXRzID0gMDtcclxuICAgIGRlY3BvcyA9ICgodG1wLl9kYXRhWzBdICYgfk5VTV9UWVBFLlNJR05fTUFTSykgLSBOVU1fVFlQRS5FWFBfQklBUyArIDEpICogMjtcclxuICAgIGxhc3QgPSBkZWNwb3MgLSAxICsgZGVjcztcclxuICAgIGZpcnN0ID0gZGVjcG9zIC0gMTtcclxuICAgIGlmIChmaXJzdCA+IDIpXHJcbiAgICAgIGZpcnN0ID0gKHRtcC5fZGF0YVsxXSA8IDEwKSA/IDMgOiAyO1xyXG5cclxuICAgIGZvciAoaiA9IGxhc3Q7IGogPj0gZmlyc3Q7IGotLSkge1xyXG4gICAgICBpZiAoaSA8IDApXHJcbiAgICAgICAgcmV0dXJuIChOVU1fVFlQRS5OT19ST09NKTtcclxuXHJcbiAgICAgIGlmIChjb21tYXMgJiYgKGogPCBkZWNwb3MpKSB7XHJcbiAgICAgICAgaWYgKGRpZ2l0cyA9PT0gMykge1xyXG4gICAgICAgICAgZGlnaXRzID0gMDtcclxuICAgICAgICAgIHN0cltpLS1dID0gdGhpcy5DT01NQUNIQVI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRpZ2l0cysrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBKUE46MTUvMDgvMTk5NiBZYW1hIChKcG5JRDpaQTA4MTUwMDEpXHJcbiAgICAgIC8vIFdoZW4gRm9ybWF0PVwiTjEyQ1wiIGFuZCBudW0gaXMgYmlnZ2VyIHRoYW4gMTIgZGlnaXRzLlxyXG4gICAgICAvLyBNQUdJQyBjcnVzaGVzLiBCZWNhdXNlIHRoZSB2YXIgaSBiZWNvbWVzIG5lZ2F0aXZlLlxyXG4gICAgICBpZiAoaSA8IDApXHJcbiAgICAgICAgcmV0dXJuIChOVU1fVFlQRS5OT19ST09NKTtcclxuXHJcbiAgICAgIGlmICgoaiA8IDIpIHx8IChqID49IHRoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkUgKiAyKSlcclxuICAgICAgICBzdHJbaS0tXSA9ICcwJztcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGkgPCAwKVxyXG4gICAgICAgICAgcmV0dXJuIChOVU1fVFlQRS5OT19ST09NKTtcclxuICAgICAgICBudW1fY2hhciA9IHRtcC5fZGF0YVtqID4+IDFdO1xyXG4gICAgICAgIHN0cltpLS1dID0gKCgoaiAmIDEpICE9PSAwKSA/IChudW1fY2hhciAlIDEwKSA6IChNYXRoLmZsb29yKG51bV9jaGFyIC8gMTApKSkudG9TdHJpbmcoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGogPT09IGRlY3Bvcykge1xyXG4gICAgICAgIGlmIChpIDwgMClcclxuICAgICAgICAgIHJldHVybiAoTlVNX1RZUEUuTk9fUk9PTSk7XHJcbiAgICAgICAgc3RyW2ktLV0gPSB0aGlzLkRFQ0lNQUxDSEFSO1xyXG5cclxuICAgICAgICAvLyAyNi8xMS85NyBTaGF5IFouIEJ1ZyAjNzcwNTI2IC0gSWYgVGhlIGRlY2ltYWwgcG9pbnQgaXMgdGhlIGZpcnN0XHJcbiAgICAgICAgLy8gaW4gdGhlIHBpY3R1cmUncyBmb3JtYXQgLSBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgdmFsdWUgaXMgbGVnYWwgIVxyXG4gICAgICAgIGlmIChpIDwgMCAmJiBwaWMuZGVjSW5GaXJzdFBvcygpKVxyXG4gICAgICAgICAgcmV0dXJuICgwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAoaSArIDEpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFBlcmZvcm1pbmcgYW4gQWRkIG9wZXJhdGlvbiBvbiB0d28gbWFnaWMgbnVtYmVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW0xXCI+ICB0aGUgZmlyc3QgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW0yXCI+ICB0aGUgZmlyc3QgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcmVzdWx0XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgYWRkKG51bTE6IE5VTV9UWVBFLCBudW0yOiBOVU1fVFlQRSk6IE5VTV9UWVBFIHtcclxuICAgIGxldCBzaWduMTogbnVtYmVyO1xyXG4gICAgbGV0IHNpZ24yOiBudW1iZXI7XHJcbiAgICBsZXQgbDogbnVtYmVyO1xyXG4gICAgbGV0IGwxOiBudW1iZXI7XHJcbiAgICBsZXQgbDI6IG51bWJlcjtcclxuICAgIGxldCBTSUdOSUZJQ0FOVF9OVU1fU0laRTogbnVtYmVyO1xyXG4gICAgLy8gbnVsbCB2YWx1ZXNcclxuICAgIGlmIChudW0xID09PSBudWxsIHx8IG51bTIgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIFNJR05JRklDQU5UX05VTV9TSVpFID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0U2lnbmlmaWNhbnROdW1TaXplKCk7XHJcbiAgICBsZXQgdG1wcmVzOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgbGV0IHJlczogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBvcGVyRGF0YTogT3BlckRhdGEgPSBuZXcgT3BlckRhdGEoKTtcclxuICAgIGlmIChudW0xLk5VTV9JU19MT05HKCkpIHtcclxuICAgICAgaWYgKG51bTIuTlVNX0lTX0xPTkcoKSkge1xyXG5cclxuICAgICAgICBsID0gbDEgPSBudW0xLk5VTV9MT05HKCk7XHJcbiAgICAgICAgaWYgKGwgPCAwKVxyXG4gICAgICAgICAgbCA9IC1sO1xyXG5cclxuICAgICAgICBpZiAobCA8IDB4NDAwMDAwMDApIHtcclxuICAgICAgICAgIGwgPSBsMiA9IG51bTIuTlVNX0xPTkcoKTtcclxuICAgICAgICAgIGlmIChsIDwgMClcclxuICAgICAgICAgICAgbCA9IC1sO1xyXG4gICAgICAgICAgaWYgKGwgPCAweDQwMDAwMDAwKSB7XHJcbiAgICAgICAgICAgIGwxICs9IGwyO1xyXG4gICAgICAgICAgICByZXMuTlVNXzRfTE9ORyhsMSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG51bTIubnVtXzRfc3RkX2xvbmcoKTtcclxuICAgICAgfVxyXG4gICAgICBudW0xLm51bV80X3N0ZF9sb25nKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChudW0yLk5VTV9JU19MT05HKCkpXHJcbiAgICAgIG51bTIubnVtXzRfc3RkX2xvbmcoKTtcclxuXHJcbiAgICBzaWduMSA9IE5VTV9UWVBFLnRvU0J5dGUobnVtMS5fZGF0YVswXSAmIE5VTV9UWVBFLlNJR05fTUFTSyk7XHJcbiAgICBvcGVyRGF0YS5OVU1fRXhwMV8gPSBOVU1fVFlQRS50b1NCeXRlKG51bTEuX2RhdGFbMF0gJiB+TlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICAgIHNpZ24yID0gTlVNX1RZUEUudG9TQnl0ZShudW0yLl9kYXRhWzBdICYgTlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICAgIG9wZXJEYXRhLk5VTV9FeHAyXyA9IE5VTV9UWVBFLnRvU0J5dGUobnVtMi5fZGF0YVswXSAmIH5OVU1fVFlQRS5TSUdOX01BU0spO1xyXG4gICAgb3BlckRhdGEuTlVNX0RpZmZfID0gPG51bWJlcj4ob3BlckRhdGEuTlVNX0V4cDFfIC0gb3BlckRhdGEuTlVNX0V4cDJfKTtcclxuXHJcbiAgICBsZXQgY21wdmFsOiBudW1iZXIgPSBvcGVyRGF0YS5OVU1fRGlmZl87XHJcbiAgICBpZiAoY21wdmFsID09PSAwKSB7XHJcbiAgICAgIGNtcHZhbCA9IE5VTV9UWVBFLnRvVUJ5dGUobnVtMS5fZGF0YVsxXSkgLSBOVU1fVFlQRS50b1VCeXRlKG51bTIuX2RhdGFbMV0pO1xyXG4gICAgICBpZiAoY21wdmFsID09PSAwKVxyXG4gICAgICAgIGNtcHZhbCA9IE5VTV9UWVBFLm1lbWNtcChudW0xLCAyLCBudW0yLCAyLCBTSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjbXB2YWwgPj0gMCkge1xyXG4gICAgICBpZiAoc2lnbjEgPT09IHNpZ24yKVxyXG4gICAgICAgIHRtcHJlcyA9IE5VTV9UWVBFLmFkZF9wb3MobnVtMSwgbnVtMiwgb3BlckRhdGEpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdG1wcmVzID0gTlVNX1RZUEUuc3ViX3BvcyhudW0xLCBudW0yLCBvcGVyRGF0YSk7XHJcblxyXG4gICAgICBpZiAodG1wcmVzLl9kYXRhWzBdICE9PSAwKVxyXG4gICAgICAgIHRtcHJlcy5fZGF0YVswXSA9IE5VTV9UWVBFLnRvU0J5dGUodG1wcmVzLl9kYXRhWzBdIHwgc2lnbjEpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBleHA6IG51bWJlciA9IG9wZXJEYXRhLk5VTV9FeHAxXztcclxuICAgICAgb3BlckRhdGEuTlVNX0V4cDFfID0gb3BlckRhdGEuTlVNX0V4cDJfO1xyXG4gICAgICBvcGVyRGF0YS5OVU1fRXhwMl8gPSBleHA7XHJcbiAgICAgIG9wZXJEYXRhLk5VTV9EaWZmXyA9IC1vcGVyRGF0YS5OVU1fRGlmZl87XHJcblxyXG4gICAgICBpZiAoc2lnbjEgPT09IHNpZ24yKVxyXG4gICAgICAgIHRtcHJlcyA9IE5VTV9UWVBFLmFkZF9wb3MobnVtMiwgbnVtMSwgb3BlckRhdGEpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdG1wcmVzID0gTlVNX1RZUEUuc3ViX3BvcyhudW0yLCBudW0xLCBvcGVyRGF0YSk7XHJcblxyXG4gICAgICBpZiAodG1wcmVzLl9kYXRhWzBdICE9PSAwKVxyXG4gICAgICAgIHRtcHJlcy5fZGF0YVswXSB8PSBzaWduMjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdG1wcmVzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFBlcmZvcm1pbmcgYSBTdWJ0cmFjdCBvcGVyYXRpb24gb24gdHdvIG1hZ2ljIG51bWJlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibnVtMVwiPiAgdGhlIGZpcnN0IG51bWJlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibnVtMlwiPiAgdGhlIGZpcnN0IG51bWJlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHJlc3VsdFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIHN1YihudW0xOiBOVU1fVFlQRSwgbnVtMjogTlVNX1RZUEUpOiBOVU1fVFlQRSB7XHJcbiAgICAvLyBudWxsIHZhbHVlc1xyXG4gICAgaWYgKG51bTEgPT09IG51bGwgfHwgbnVtMiA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgbGV0IHRtcHJlczogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCByZXM6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgb3BlckRhdGE6IE9wZXJEYXRhID0gbmV3IE9wZXJEYXRhKCk7XHJcblxyXG4gICAgaWYgKG51bTEuTlVNX0lTX0xPTkcoKSkge1xyXG4gICAgICBpZiAobnVtMi5OVU1fSVNfTE9ORygpKSB7XHJcbiAgICAgICAgbGV0IGw6IG51bWJlcjtcclxuICAgICAgICBsZXQgbDE6IG51bWJlciA9IGwgPSBudW0xLk5VTV9MT05HKCk7XHJcbiAgICAgICAgaWYgKGwgPCAwKVxyXG4gICAgICAgICAgbCA9IC1sO1xyXG4gICAgICAgIGlmIChsIDwgMHg0MDAwMDAwMCkge1xyXG4gICAgICAgICAgbGV0IGwyOiBudW1iZXIgPSBsID0gbnVtMi5OVU1fTE9ORygpO1xyXG4gICAgICAgICAgaWYgKGwgPCAwKVxyXG4gICAgICAgICAgICBsID0gLWw7XHJcbiAgICAgICAgICBpZiAobCA8IDB4NDAwMDAwMDApIHtcclxuICAgICAgICAgICAgbDEgLT0gbDI7XHJcbiAgICAgICAgICAgIHJlcy5OVU1fNF9MT05HKGwxKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgbnVtMi5udW1fNF9zdGRfbG9uZygpO1xyXG4gICAgICB9XHJcbiAgICAgIG51bTEubnVtXzRfc3RkX2xvbmcoKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG51bTIuTlVNX0lTX0xPTkcoKSlcclxuICAgICAgbnVtMi5udW1fNF9zdGRfbG9uZygpO1xyXG5cclxuICAgIGxldCBzaWduMTogbnVtYmVyID0gTlVNX1RZUEUudG9TQnl0ZShudW0xLl9kYXRhWzBdICYgTlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICAgIG9wZXJEYXRhLk5VTV9FeHAxXyA9IE5VTV9UWVBFLnRvU0J5dGUobnVtMS5fZGF0YVswXSAmIH5OVU1fVFlQRS5TSUdOX01BU0spO1xyXG4gICAgbGV0IHNpZ24yOiBudW1iZXIgPSBOVU1fVFlQRS50b1NCeXRlKG51bTIuX2RhdGFbMF0gJiBOVU1fVFlQRS5TSUdOX01BU0spO1xyXG4gICAgb3BlckRhdGEuTlVNX0V4cDJfID0gTlVNX1RZUEUudG9TQnl0ZShudW0yLl9kYXRhWzBdICYgfk5VTV9UWVBFLlNJR05fTUFTSyk7XHJcbiAgICBvcGVyRGF0YS5OVU1fRGlmZl8gPSA8bnVtYmVyPihvcGVyRGF0YS5OVU1fRXhwMV8gLSBvcGVyRGF0YS5OVU1fRXhwMl8pO1xyXG5cclxuICAgIGxldCBjbXB2YWw6IG51bWJlciA9IG9wZXJEYXRhLk5VTV9EaWZmXztcclxuICAgIGlmIChjbXB2YWwgPT09IDApIHtcclxuICAgICAgY21wdmFsID0gTlVNX1RZUEUudG9VQnl0ZShudW0xLl9kYXRhWzFdKSAtIE5VTV9UWVBFLnRvVUJ5dGUobnVtMi5fZGF0YVsxXSk7XHJcbiAgICAgIGlmIChjbXB2YWwgPT09IDApXHJcbiAgICAgICAgY21wdmFsID0gTlVNX1RZUEUubWVtY21wKG51bTEsIDIsIG51bTIsIDIsIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFNpZ25pZmljYW50TnVtU2l6ZSgpIC0gMik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNtcHZhbCA+PSAwKSB7XHJcbiAgICAgIGlmIChzaWduMSA9PT0gc2lnbjIpXHJcbiAgICAgICAgdG1wcmVzID0gTlVNX1RZUEUuc3ViX3BvcyhudW0xLCBudW0yLCBvcGVyRGF0YSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0bXByZXMgPSBOVU1fVFlQRS5hZGRfcG9zKG51bTEsIG51bTIsIG9wZXJEYXRhKTtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IGV4cDogbnVtYmVyID0gb3BlckRhdGEuTlVNX0V4cDFfO1xyXG4gICAgICBvcGVyRGF0YS5OVU1fRXhwMV8gPSBvcGVyRGF0YS5OVU1fRXhwMl87XHJcbiAgICAgIG9wZXJEYXRhLk5VTV9FeHAyXyA9IGV4cDtcclxuICAgICAgb3BlckRhdGEuTlVNX0RpZmZfID0gLW9wZXJEYXRhLk5VTV9EaWZmXztcclxuICAgICAgaWYgKHNpZ24xID09PSBzaWduMikge1xyXG4gICAgICAgIHRtcHJlcyA9IE5VTV9UWVBFLnN1Yl9wb3MobnVtMiwgbnVtMSwgb3BlckRhdGEpO1xyXG4gICAgICAgIHNpZ24xIF49IChOVU1fVFlQRS5TSUdOX01BU0spO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0bXByZXMgPSBOVU1fVFlQRS5hZGRfcG9zKG51bTIsIG51bTEsIG9wZXJEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodG1wcmVzLl9kYXRhWzBdICE9PSAwKVxyXG4gICAgICB0bXByZXMuX2RhdGFbMF0gfD0gc2lnbjE7XHJcblxyXG4gICAgcmV0dXJuIHRtcHJlcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBQZXJmb3JtaW5nIGEgTXVsdGlwbHkgb3BlcmF0aW9uIG9uIHR3byBtYWdpYyBudW1iZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTFcIj4gIHRoZSBmaXJzdCBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTJcIj4gIHRoZSBmaXJzdCBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSByZXN1bHRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBtdWwobnVtMTogTlVNX1RZUEUsIG51bTI6IE5VTV9UWVBFKTogTlVNX1RZUEUge1xyXG5cclxuICAgIGxldCBmdWxscmVzOiBJbnQ4QXJyYXkgPSBuZXcgSW50OEFycmF5KDM4KTtcclxuICAgIGxldCBwd3I6IG51bWJlcjtcclxuICAgIGxldCBsZW4xOiBudW1iZXI7XHJcbiAgICBsZXQgbGVuMjogbnVtYmVyO1xyXG4gICAgbGV0IHBvczE6IG51bWJlcjtcclxuICAgIGxldCBwb3MyOiBudW1iZXI7XHJcbiAgICBsZXQgcG9zOiBudW1iZXI7XHJcbiAgICBsZXQgZGlnaXQxOiBudW1iZXI7XHJcbiAgICBsZXQgcHJvZDogbnVtYmVyO1xyXG4gICAgbGV0IGNhcnJ5OiBudW1iZXI7XHJcbiAgICBsZXQgbDogbnVtYmVyO1xyXG4gICAgbGV0IGwxOiBudW1iZXI7XHJcbiAgICBsZXQgbDI6IG51bWJlcjtcclxuICAgIGxldCBTSUdOSUZJQ0FOVF9OVU1fU0laRTogbnVtYmVyO1xyXG5cclxuICAgIC8vIG51bGwgdmFsdWVzXHJcbiAgICBpZiAobnVtMSA9PT0gbnVsbCB8fCBudW0yID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBTSUdOSUZJQ0FOVF9OVU1fU0laRSA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFNpZ25pZmljYW50TnVtU2l6ZSgpO1xyXG5cclxuICAgIGxldCByZXM6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgb3BlckRhdGE6IE9wZXJEYXRhID0gbmV3IE9wZXJEYXRhKCk7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IHRtcEJ5dGU6IG51bWJlcjtcclxuXHJcbiAgICBpZiAobnVtMS5OVU1fSVNfTE9ORygpKSB7XHJcbiAgICAgIGlmIChudW0yLk5VTV9JU19MT05HKCkpIHtcclxuICAgICAgICBsID0gbDEgPSBudW0xLk5VTV9MT05HKCk7XHJcbiAgICAgICAgaWYgKGwgPCAwKVxyXG4gICAgICAgICAgbCA9IC1sO1xyXG4gICAgICAgIGlmIChsIDwgMHhCMDAwKSB7XHJcbiAgICAgICAgICBsID0gbDIgPSBudW0yLk5VTV9MT05HKCk7XHJcbiAgICAgICAgICBpZiAobCA8IDApXHJcbiAgICAgICAgICAgIGwgPSAtbDtcclxuICAgICAgICAgIGlmIChsIDwgMHhCMDAwKSB7XHJcbiAgICAgICAgICAgIGwxID0gbDEgKiBsMjtcclxuICAgICAgICAgICAgcmVzLk5VTV80X0xPTkcobDEpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBudW0yLm51bV80X3N0ZF9sb25nKCk7XHJcbiAgICAgIH1cclxuICAgICAgbnVtMS5udW1fNF9zdGRfbG9uZygpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobnVtMi5OVU1fSVNfTE9ORygpKVxyXG4gICAgICAgIG51bTIubnVtXzRfc3RkX2xvbmcoKTtcclxuXHJcbiAgICBvcGVyRGF0YS5OVU1fRXhwMV8gPSBOVU1fVFlQRS50b1NCeXRlKG51bTEuX2RhdGFbMF0gJiB+TlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICAgIG9wZXJEYXRhLk5VTV9FeHAyXyA9IE5VTV9UWVBFLnRvU0J5dGUobnVtMi5fZGF0YVswXSAmIH5OVU1fVFlQRS5TSUdOX01BU0spO1xyXG4gICAgaWYgKG9wZXJEYXRhLk5VTV9FeHAxXyA9PT0gMCB8fCBvcGVyRGF0YS5OVU1fRXhwMl8gPT09IDApIHtcclxuICAgICAgcmVzLk5VTV9aRVJPKCk7XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZW4xID0gU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxO1xyXG4gICAgICAgICBudW0xLl9kYXRhW2xlbjFdID09PSAwO1xyXG4gICAgICAgICBsZW4xLS0pIHtcclxuICAgIH1cclxuICAgIGZvciAobGVuMiA9IFNJR05JRklDQU5UX05VTV9TSVpFIC0gMTtcclxuICAgICAgICAgbnVtMi5fZGF0YVtsZW4yXSA9PT0gMDtcclxuICAgICAgICAgbGVuMi0tKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IChOVU1fVFlQRS5OVU1fU0laRSAtIDEpICogMjsgaSsrKVxyXG4gICAgICBmdWxscmVzW2ldID0gMDtcclxuXHJcbiAgICBwb3MgPSAwO1xyXG4gICAgZm9yIChwb3MxID0gbGVuMTsgcG9zMSA+IDA7IHBvczEtLSkge1xyXG4gICAgICBwb3MgPSBwb3MxICsgbGVuMiAtIDE7XHJcbiAgICAgIGRpZ2l0MSA9IG51bTEuX2RhdGFbcG9zMV07XHJcbiAgICAgIGNhcnJ5ID0gMDtcclxuXHJcbiAgICAgIGZvciAocG9zMiA9IGxlbjI7IHBvczIgPiAwOyBwb3MyLS0pIHtcclxuICAgICAgICBwcm9kID0gTlVNX1RZUEUudG9VQnl0ZShkaWdpdDEpICogTlVNX1RZUEUudG9VQnl0ZShudW0yLl9kYXRhW3BvczJdKSArIGNhcnJ5O1xyXG4gICAgICAgIGNhcnJ5ID0gTWF0aC5mbG9vcihwcm9kIC8gMTAwKTtcclxuICAgICAgICBmdWxscmVzW3Bvc10gPSBOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLnRvVUJ5dGUoZnVsbHJlc1twb3NdKSArIHByb2QgJSAxMDApO1xyXG4gICAgICAgIHRtcEJ5dGUgPSBmdWxscmVzW3Bvc107XHJcbiAgICAgICAgcG9zLS07XHJcbiAgICAgICAgaWYgKE5VTV9UWVBFLnRvVUJ5dGUodG1wQnl0ZSkgPj0gMTAwKSB7XHJcbiAgICAgICAgICBmdWxscmVzW3BvcyArIDFdID0gTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS50b1VCeXRlKGZ1bGxyZXNbcG9zICsgMV0pIC0gMTAwKTtcclxuICAgICAgICAgIGNhcnJ5Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGZ1bGxyZXNbcG9zXSA9IE5VTV9UWVBFLnRvU0J5dGUoY2FycnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB3ciA9IE5VTV9UWVBFLnRvVUJ5dGUob3BlckRhdGEuTlVNX0V4cDFfKSAtIE5VTV9UWVBFLkVYUF9CSUFTICsgKE5VTV9UWVBFLnRvVUJ5dGUob3BlckRhdGEuTlVNX0V4cDJfKSAtIE5VTV9UWVBFLkVYUF9CSUFTKTtcclxuICAgIGlmIChmdWxscmVzWzBdID09PSAwKSB7XHJcbiAgICAgIHBvcysrO1xyXG4gICAgICBwd3ItLTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoKG51bTEuX2RhdGFbMF0gJiBOVU1fVFlQRS5TSUdOX01BU0spID09PSAobnVtMi5fZGF0YVswXSAmIE5VTV9UWVBFLlNJR05fTUFTSykpXHJcbiAgICAgIHJlcy5fZGF0YVswXSA9IDA7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJlcy5fZGF0YVswXSA9IE5VTV9UWVBFLlNJR05fTUFTSztcclxuXHJcbiAgICByZXMuX2RhdGFbMF0gfD0gTlVNX1RZUEUudG9TQnl0ZShwd3IgKyBOVU1fVFlQRS5FWFBfQklBUyk7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxOyBpKyspXHJcbiAgICAgIHJlcy5fZGF0YVsxICsgaV0gPSBmdWxscmVzW3BvcyArIGldO1xyXG5cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUGVyZm9ybWluZyBhIE1vZCBvcGVyYXRpb24gb24gdHdvIG1hZ2ljIG51bWJlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibnVtMVwiPiAgdGhlIGZpcnN0IG51bWJlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibnVtMlwiPiAgdGhlIGZpcnN0IG51bWJlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHJlc3VsdFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIG1vZChudW0xOiBOVU1fVFlQRSwgbnVtMjogTlVNX1RZUEUpOiBOVU1fVFlQRSB7XHJcbiAgICAvLyBudWxsIHZhbHVlc1xyXG4gICAgaWYgKG51bTEgPT09IG51bGwgfHwgbnVtMiA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgbGV0IHJlczogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGlmIChudW0yLm51bV9pc196ZXJvKCkpIHtcclxuICAgICAgcmVzLk5VTV9aRVJPKCk7XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG51bTEuTlVNX0lTX0xPTkcoKSlcclxuICAgICAgbnVtMS5udW1fNF9zdGRfbG9uZygpO1xyXG5cclxuICAgIGlmIChudW0yLk5VTV9JU19MT05HKCkpXHJcbiAgICAgIG51bTIubnVtXzRfc3RkX2xvbmcoKTtcclxuXHJcbiAgICByZXMgPSBOVU1fVFlQRS5kaXYobnVtMSwgbnVtMik7XHJcbiAgICByZXMubnVtX3RydW5jKDApO1xyXG4gICAgcmVzID0gTlVNX1RZUEUubXVsKHJlcywgbnVtMik7XHJcbiAgICByZXMgPSBOVU1fVFlQRS5zdWIobnVtMSwgcmVzKTtcclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFBlcmZvcm1pbmcgYSBEaXZpZGUgb3BlcmF0aW9uIG9uIHR3byBtYWdpYyBudW1iZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTFcIj4gIHRoZSBmaXJzdCBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTJcIj4gIHRoZSBmaXJzdCBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSByZXN1bHRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBkaXYobnVtMTogTlVNX1RZUEUsIG51bTI6IE5VTV9UWVBFKTogTlVNX1RZUEUge1xyXG4gICAgbGV0IGRpdmlkZW5kOiBJbnQ4QXJyYXkgPSBuZXcgSW50OEFycmF5KChOVU1fVFlQRS5OVU1fU0laRSAtIDEpICogMik7XHJcbiAgICBsZXQgZGl2aXNvcjogSW50OEFycmF5ID0gbmV3IEludDhBcnJheShOVU1fVFlQRS5OVU1fU0laRSk7XHJcbiAgICBsZXQgcHdyOiBudW1iZXI7XHJcbiAgICBsZXQgbGVuMTogbnVtYmVyO1xyXG4gICAgbGV0IGxlbjI6IG51bWJlcjtcclxuICAgIGxldCBwb3MxOiBudW1iZXI7XHJcbiAgICBsZXQgcG9zMjogbnVtYmVyO1xyXG4gICAgbGV0IHBvczogbnVtYmVyO1xyXG4gICAgbGV0IHF1b3Q6IG51bWJlcjtcclxuICAgIGxldCBwcm9kOiBudW1iZXI7XHJcbiAgICBsZXQgY2Fycnk6IG51bWJlcjtcclxuICAgIGxldCBTSUdOSUZJQ0FOVF9OVU1fU0laRTogbnVtYmVyO1xyXG5cclxuICAgIC8vIG51bGwgdmFsdWVzXHJcbiAgICBpZiAobnVtMSA9PT0gbnVsbCB8fCBudW0yID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBTSUdOSUZJQ0FOVF9OVU1fU0laRSA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFNpZ25pZmljYW50TnVtU2l6ZSgpO1xyXG5cclxuICAgIGxldCByZXM6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgb3BlckRhdGE6IE9wZXJEYXRhID0gbmV3IE9wZXJEYXRhKCk7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IHRtcEJ5dGU6IG51bWJlcjtcclxuXHJcbiAgICBpZiAobnVtMS5OVU1fSVNfTE9ORygpKVxyXG4gICAgICBudW0xLm51bV80X3N0ZF9sb25nKCk7XHJcbiAgICBpZiAobnVtMi5OVU1fSVNfTE9ORygpKVxyXG4gICAgICBudW0yLm51bV80X3N0ZF9sb25nKCk7XHJcblxyXG4gICAgb3BlckRhdGEuTlVNX0V4cDFfID0gTlVNX1RZUEUudG9TQnl0ZShudW0xLl9kYXRhWzBdICYgfk5VTV9UWVBFLlNJR05fTUFTSyk7XHJcbiAgICBvcGVyRGF0YS5OVU1fRXhwMl8gPSBOVU1fVFlQRS50b1NCeXRlKG51bTIuX2RhdGFbMF0gJiB+TlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICAgIGlmIChvcGVyRGF0YS5OVU1fRXhwMV8gPT09IDAgfHwgb3BlckRhdGEuTlVNX0V4cDJfID09PSAwKSB7XHJcbiAgICAgIHJlcy5OVU1fWkVSTygpO1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGVuMSA9IFNJR05JRklDQU5UX05VTV9TSVpFIC0gMTtcclxuICAgICAgICAgbnVtMS5fZGF0YVtsZW4xXSA9PT0gMDtcclxuICAgICAgICAgbGVuMS0tKSB7XHJcbiAgICB9XHJcbiAgICBmb3IgKGxlbjIgPSBTSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDE7XHJcbiAgICAgICAgIG51bTIuX2RhdGFbbGVuMl0gPT09IDA7XHJcbiAgICAgICAgIGxlbjItLSkge1xyXG4gICAgfVxyXG5cclxuICAgIHBvcyA9IChOVU1fVFlQRS5tZW1jbXAobnVtMSwgMSwgbnVtMiwgMSwgbGVuMikgPCAwKSA/IDAgOiAxO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IChOVU1fVFlQRS5OVU1fU0laRSAtIDEpICogMjsgaSsrKVxyXG4gICAgICBkaXZpZGVuZFtpXSA9IDA7XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjE7IGkrKylcclxuICAgICAgZGl2aWRlbmRbcG9zICsgaV0gPSBudW0xLl9kYXRhWzEgKyBpXTtcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuMjsgaSsrKVxyXG4gICAgICBkaXZpc29yWzEgKyBpXSA9IG51bTIuX2RhdGFbMSArIGldO1xyXG5cclxuICAgIHJlcy5OVU1fU0VUX1pFUk8oKTtcclxuICAgIHB3ciA9IE5VTV9UWVBFLnRvVUJ5dGUob3BlckRhdGEuTlVNX0V4cDFfKSAtIE5VTV9UWVBFLnRvVUJ5dGUob3BlckRhdGEuTlVNX0V4cDJfKSArIHBvcztcclxuICAgIHJlcy5fZGF0YVswXSA9IE5VTV9UWVBFLnRvU0J5dGUocHdyICsgTlVNX1RZUEUuRVhQX0JJQVMpO1xyXG4gICAgaWYgKChudW0xLl9kYXRhWzBdICYgTlVNX1RZUEUuU0lHTl9NQVNLKSAhPT0gKG51bTIuX2RhdGFbMF0gJiBOVU1fVFlQRS5TSUdOX01BU0spKVxyXG4gICAgICByZXMuX2RhdGFbMF0gfD0gTlVNX1RZUEUuU0lHTl9NQVNLO1xyXG5cclxuICAgIC8vIG5vcm1hbGl6ZSBkaXZpZGVuZCAmIGRpdmlzb3JcclxuICAgIHF1b3QgPSBNYXRoLmZsb29yKDEwMCAvIChOVU1fVFlQRS50b1VCeXRlKGRpdmlzb3JbMV0pICsgMSkpO1xyXG4gICAgaWYgKHF1b3QgPiAxKSB7XHJcbiAgICAgIGNhcnJ5ID0gMDtcclxuICAgICAgZm9yIChwb3MyID0gbGVuMjsgcG9zMiA+IDA7IHBvczItLSkge1xyXG4gICAgICAgIHByb2QgPSBxdW90ICogTlVNX1RZUEUudG9VQnl0ZShkaXZpc29yW3BvczJdKSArIGNhcnJ5O1xyXG4gICAgICAgIGNhcnJ5ID0gTWF0aC5mbG9vcihwcm9kIC8gMTAwKTtcclxuICAgICAgICBkaXZpc29yW3BvczJdID0gTlVNX1RZUEUudG9TQnl0ZShwcm9kICUgMTAwKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY2FycnkgPSAwO1xyXG4gICAgICBmb3IgKHBvczEgPSBsZW4xICsgcG9zIC0gMTsgcG9zMSA+PSAwOyBwb3MxLS0pIHtcclxuICAgICAgICBwcm9kID0gcXVvdCAqIE5VTV9UWVBFLnRvVUJ5dGUoZGl2aWRlbmRbcG9zMV0pICsgY2Fycnk7XHJcbiAgICAgICAgY2FycnkgPSBNYXRoLmZsb29yKHByb2QgLyAxMDApO1xyXG4gICAgICAgIGRpdmlkZW5kW3BvczFdID0gTlVNX1RZUEUudG9TQnl0ZShwcm9kICUgMTAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGRpdmlkZSBkaXZpZGVuZCBieSBkaXZpc29yXHJcbiAgICBmb3IgKHBvczEgPSAxOyBwb3MxIDwgU0lHTklGSUNBTlRfTlVNX1NJWkU7IHBvczErKykge1xyXG4gICAgICBxdW90ID0gTlVNX1RZUEUudG9VQnl0ZShkaXZpZGVuZFtwb3MxIC0gMV0pICogMTAwICsgTWF0aC5mbG9vcihOVU1fVFlQRS50b1VCeXRlKGRpdmlkZW5kW3BvczFdKSAvIE5VTV9UWVBFLnRvVUJ5dGUoZGl2aXNvclsxXSkpO1xyXG4gICAgICBpZiAocXVvdCA+PSAxMDApXHJcbiAgICAgICAgcXVvdCA9IDk5O1xyXG5cclxuICAgICAgaWYgKHF1b3QgIT09IDApIHtcclxuICAgICAgICAvLyBtdWx0aXBseSBkaXZpc29yIGJ5IHF1b3RpZW50LCBhbmQgc3VidHJhY3QgZnJvbSBkaXZpZGVuZFxyXG4gICAgICAgIHBvcyA9IHBvczEgKyBsZW4yIC0gMTtcclxuICAgICAgICBjYXJyeSA9IDA7XHJcbiAgICAgICAgZm9yIChwb3MyID0gbGVuMjsgcG9zMiA+IDA7IHBvczItLSkge1xyXG4gICAgICAgICAgcHJvZCA9IHF1b3QgKiBOVU1fVFlQRS50b1VCeXRlKGRpdmlzb3JbcG9zMl0pICsgY2Fycnk7XHJcbiAgICAgICAgICBjYXJyeSA9IE1hdGguZmxvb3IocHJvZCAvIDEwMCk7XHJcbiAgICAgICAgICBkaXZpZGVuZFtwb3NdID0gTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS50b1VCeXRlKGRpdmlkZW5kW3Bvc10pIC0gcHJvZCAlIDEwMCk7XHJcbiAgICAgICAgICB0bXBCeXRlID0gZGl2aWRlbmRbcG9zXTtcclxuICAgICAgICAgIHBvcy0tO1xyXG4gICAgICAgICAgaWYgKHRtcEJ5dGUgPCAwKSB7XHJcbiAgICAgICAgICAgIGRpdmlkZW5kW3BvcyArIDFdID0gTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS50b1VCeXRlKGRpdmlkZW5kW3BvcyArIDFdKSArIDEwMCk7XHJcbiAgICAgICAgICAgIGNhcnJ5Kys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRpdmlkZW5kW3Bvc10gPSBOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLnRvVUJ5dGUoZGl2aWRlbmRbcG9zXSkgLSBjYXJyeSk7XHJcblxyXG4gICAgICAgIC8vIGRlY3JlbWVudCBxdW90aWVudCwgYW5kIGFkZCBiYWNrIGRpdmlzb3IgdG8gZGl2aWRlbmRcclxuICAgICAgICB3aGlsZSAoZGl2aWRlbmRbcG9zXSA8IDApIHtcclxuICAgICAgICAgIHF1b3QtLTtcclxuICAgICAgICAgIHBvcyA9IHBvczEgKyBsZW4yIC0gMTtcclxuICAgICAgICAgIGZvciAocG9zMiA9IGxlbjI7IHBvczIgPiAwOyBwb3MyLS0pIHtcclxuICAgICAgICAgICAgZGl2aWRlbmRbcG9zXSA9IE5VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUudG9VQnl0ZShkaXZpZGVuZFtwb3NdKSArIE5VTV9UWVBFLnRvVUJ5dGUoZGl2aXNvcltwb3MyXSkpO1xyXG4gICAgICAgICAgICB0bXBCeXRlID0gZGl2aWRlbmRbcG9zXTtcclxuICAgICAgICAgICAgcG9zLS07XHJcbiAgICAgICAgICAgIGlmIChOVU1fVFlQRS50b1VCeXRlKHRtcEJ5dGUpID49IDEwMCkge1xyXG4gICAgICAgICAgICAgIGRpdmlkZW5kW3BvcyArIDFdID0gTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS50b1VCeXRlKGRpdmlkZW5kW3BvcyArIDFdKSAtIDEwMCk7XHJcbiAgICAgICAgICAgICAgZGl2aWRlbmRbcG9zXSA9IE5VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUudG9VQnl0ZShkaXZpZGVuZFtwb3NdKSArIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJlcy5fZGF0YVtwb3MxXSA9IE5VTV9UWVBFLnRvU0J5dGUocXVvdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb21wYXJlIHR3byBtYWdpYyBudW1iZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTFcIj4gIFRoZSBmaXJzdCBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTJcIj4gIFRoZSBzZWNvbmQgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiAwIGlmIG51bTE9bnVtMiwgMSBpZiBudW0xPm51bTIgb3IgLTEgaWYgbnVtMTxudW0yXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgbnVtX2NtcChudW0xOiBOVU1fVFlQRSwgbnVtMjogTlVNX1RZUEUpOiBudW1iZXIge1xyXG4gICAgbGV0IHNpZ24xOiBudW1iZXI7XHJcbiAgICBsZXQgc2lnbjI6IG51bWJlcjtcclxuICAgIGxldCBjbXB2YWw6IG51bWJlcjtcclxuICAgIGxldCBsMTogbnVtYmVyO1xyXG4gICAgbGV0IGwyOiBudW1iZXI7XHJcbiAgICBsZXQgdG1wOiBudW1iZXI7XHJcbiAgICBsZXQgU0lHTklGSUNBTlRfTlVNX1NJWkU6IG51bWJlcjtcclxuXHJcbiAgICBpZiAobnVtMSA9PSBudWxsIHx8IG51bTIgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIEludDMyLk1pblZhbHVlO1xyXG5cclxuICAgIFNJR05JRklDQU5UX05VTV9TSVpFID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0U2lnbmlmaWNhbnROdW1TaXplKCk7XHJcblxyXG4gICAgaWYgKG51bTEuTlVNX0lTX0xPTkcoKSkge1xyXG4gICAgICBpZiAobnVtMi5OVU1fSVNfTE9ORygpKSB7XHJcbiAgICAgICAgbDEgPSBudW0xLk5VTV9MT05HKCk7XHJcbiAgICAgICAgbDIgPSBudW0yLk5VTV9MT05HKCk7XHJcbiAgICAgICAgaWYgKGwxID49IDAgJiYgbDIgPj0gMCkge1xyXG4gICAgICAgICAgdG1wID0gbDEgLSBsMjtcclxuICAgICAgICAgIGlmICh0bXAgPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiAoMCk7XHJcbiAgICAgICAgICBpZiAodG1wID4gMClcclxuICAgICAgICAgICAgcmV0dXJuICgxKTtcclxuICAgICAgICAgIHJldHVybiAoLTEpO1xyXG4gICAgfVxyXG4gICAgICAgICAgICBudW0yLm51bV80X3N0ZF9sb25nKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgbnVtMS5udW1fNF9zdGRfbG9uZygpO1xyXG4gICAgICB9XHJcbiAgICBlbHNlIGlmIChudW0yLk5VTV9JU19MT05HKCkpXHJcbiAgICAgICAgICBudW0yLm51bV80X3N0ZF9sb25nKCk7XHJcblxyXG4gICAgc2lnbjEgPSBOVU1fVFlQRS50b1NCeXRlKG51bTEuX2RhdGFbMF0gJiBOVU1fVFlQRS5TSUdOX01BU0spO1xyXG4gICAgc2lnbjIgPSBOVU1fVFlQRS50b1NCeXRlKG51bTIuX2RhdGFbMF0gJiBOVU1fVFlQRS5TSUdOX01BU0spO1xyXG4gICAgY21wdmFsID0gKHNpZ24xID09PSBzaWduMilcclxuICAgICAgPyBOVU1fVFlQRS5tZW1jbXAobnVtMSwgMCwgbnVtMiwgMCwgU0lHTklGSUNBTlRfTlVNX1NJWkUpXHJcbiAgICAgIDogMTtcclxuICAgIGlmIChzaWduMSAhPT0gMClcclxuICAgICAgY21wdmFsID0gLWNtcHZhbDtcclxuICAgIHJldHVybiAoY21wdmFsKTtcclxuICAgICAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDaGVjayBpZiB0aGUgZ2l2ZW4gaGV4IHN0cmluZyByZXByZXNlbnRzIGEgbG9uZyBudW1iZXIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bUhleFN0clwiPiAgVGhlIGhleCBzdHJpbmcgdG8gY2hlY2suXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlLCBpZiB0aGUgc3RyaW5nIHJlcHJlc2VudHMgYSAnbG9uZycgbnVtYmVyIGluIE5VTV9UWVBFLlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIG51bUhleFN0cklzTG9uZyhudW1IZXhTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG51bUhleFN0ci5zdWJzdHIoMCwgMikgPT09IFwiRkZcIjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBaZXJvZXMgdGhlIE1hZ2ljIE51bWJlciBhcyBhIGxvbmcgemVyb1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgTlVNX1pFUk8oKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFplcm8odHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgWmVyb2VzIHRoZSBNYWdpYyBOdW1iZXIgKGFsbCBieXRlcyB3aWxsIHNldCB0byAwKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgTlVNX1NFVF9aRVJPKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRaZXJvKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXR0aW5nIGluZGljYXRpb24gZm9yIHRoZSBzaWduIG9mIHRoZSBNYWdpYyBOdW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpbiB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlLCBmYWxzZSBpZiBwb3NpdGl2ZVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgbnVtX2lzX25lZygpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLk5VTV9JU19MT05HKCkpXHJcbiAgICAgIHJldHVybiAoKHRoaXMuX2RhdGFbNF0gJiAweDgwKSAhPT0gMCk7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9kYXRhWzBdICYgTlVNX1RZUEUuU0lHTl9NQVNLKSAhPT0gMCk7XHJcbiAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXR0aW5nIGluZGljYXRpb24gaWYgdGhlIE1hZ2ljIE51bWJlciBpcyBaRVJPIChhbGwgYnl0ZXMgZXF1YWxzIHRvIDApXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaW4gdGhlIG51bWJlciBpcyBaRVJPLCBmYWxzZSBpZiBwb3NpdGl2ZVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgbnVtX2lzX3plcm8oKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5OVU1fSVNfTE9ORygpKVxyXG4gICAgICByZXR1cm4gKHRoaXMuTlVNX0xPTkcoKSA9PT0gMCk7XHJcbiAgICByZXR1cm4gKHRoaXMuX2RhdGFbMF0gPT09IDApO1xyXG4gICAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ2hhbmdpbmcgc2lnbiBvZiBNYWdpYyBOdW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIG51bV9uZWcoKTogdm9pZCB7XHJcbiAgICBsZXQgbDogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0aGlzLk5VTV9JU19MT05HKCkpIHtcclxuICAgICAgbCA9IC10aGlzLk5VTV9MT05HKCk7XHJcbiAgICAgIHRoaXMuTlVNXzRfTE9ORyhsKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2RhdGFbMF0gIT09IDApXHJcbiAgICAgIHRoaXMuX2RhdGFbMF0gXj0gTlVNX1RZUEUuU0lHTl9NQVNLO1xyXG4gICAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBJcyB0aGUgbnVtYmVyIGtlcHQgaW4gaW4gdGhlIE5VTV9UWVBFIGlzIGEgbG9uZyBudW1iZXI/XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaW4gdGhlIG51bWJlciBpcyBsb25nLCBmYWxzZSBpZiBub3RcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIE5VTV9JU19MT05HKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGFbMF0gPT09IE5VTV9UWVBFLk5VTV9MT05HX1RZUEU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBsb25nIHZhbHVlIGZyb20gdGhlIE5VTV9UWVBFLlxyXG4gIC8vLyAgIFRISVMgRlVOQ1RJT04gTVVTVCBCRSBXUklUVEVOIERJRkVSRU5UTFkhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBsb25nIG51bWJlclxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgTlVNX0xPTkcoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLl9kYXRhWzFdID09PSAwICYmIHRoaXMuX2RhdGFbMl0gPT09IDAgJiYgdGhpcy5fZGF0YVszXSA9PT0gMCAmJiB0aGlzLl9kYXRhWzRdID09PSAtMTI4KVxyXG4gICAgICByZXR1cm4gSW50MzIuTWluVmFsdWU7XHJcblxyXG4gICAgbGV0IGRhdGF2aWV3ID0gbmV3IERhdGFWaWV3KHRoaXMuX2RhdGEuYnVmZmVyKTtcclxuICAgIHJldHVybiBkYXRhdmlldy5nZXRJbnQzMigxLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSb3VuZHMgdGhlIE5VTV9UWVBFIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZWNzXCI+ICBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRvIGRlY2ltYWwgcG9pbnQgdG8gcm91bmQgdG9cclxuICAvLy8gPC9wYXJhbT5cclxuICByb3VuZChkZWNzOiBudW1iZXIpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgYWRkdmFsOiBOVU1fVFlQRTtcclxuXHJcbiAgICBpZiAodGhpcy5OVU1fSVNfTE9ORygpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgYWRkdmFsID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBhZGR2YWwuX2RhdGFbMF0gPSBOVU1fVFlQRS50b1NCeXRlKCh0aGlzLl9kYXRhWzBdICYgTlVNX1RZUEUuU0lHTl9NQVNLKSB8IChOVU1fVFlQRS5FWFBfQklBUyAtIChkZWNzID4+IDEpKSk7XHJcbiAgICBhZGR2YWwuX2RhdGFbMV0gPSBOVU1fVFlQRS50b1NCeXRlKChkZWNzICYgMSkgIT09IDAgPyA1IDogNTApO1xyXG5cclxuICAgIGxldCB0ZW1wOiBOVU1fVFlQRSA9IE5VTV9UWVBFLmFkZCh0aGlzLCBhZGR2YWwpO1xyXG4gICAgdGhpcy5fZGF0YSA9IG5ldyBJbnQ4QXJyYXkodGVtcC5fZGF0YS5sZW5ndGgpO1xyXG5cclxuICAgIHRoaXMuX2RhdGEgPSB0ZW1wLl9kYXRhO1xyXG4gICAgICB0aGlzLm51bV90cnVuYyhkZWNzKTtcclxuICAgIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybnMgYSBudW1lcmljIGV4cHJlc3Npb24sIHJvdW5kZWQgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwid2hvbGVcIj50aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIHdoaWNoIHRoZSBudW1lcmljIGV4cHJlc3Npb24gaXMgcm91bmRlZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIGRiUm91bmQod2hvbGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IGFkZHZhbDogTlVNX1RZUEU7XHJcbiAgICBsZXQgcHdyOiBudW1iZXI7XHJcbiAgICBsZXQgbnVtX2RpZmY6IG51bWJlcjtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKHRoaXMuTlVNX0lTX0xPTkcoKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIEFkZCA1IChpbiB0aGUgY29ycmVzcG9uZGluZyB0byB3aG9sZSBwb3NpdGlvbilcclxuICAgIGFkZHZhbCA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgYWRkdmFsLl9kYXRhWzBdID0gTlVNX1RZUEUudG9TQnl0ZSgodGhpcy5fZGF0YVswXSAmIE5VTV9UWVBFLlNJR05fTUFTSykgfCAoTlVNX1RZUEUuRVhQX0JJQVMgKyAoKHdob2xlICsgMSkgPj4gMSkpKTtcclxuICAgIGFkZHZhbC5fZGF0YVsxXSA9IE5VTV9UWVBFLnRvU0J5dGUoKCh3aG9sZSAmIDEpICE9PSAwKSA/IDUgOiA1MCk7XHJcblxyXG4gICAgbGV0IHRlbXA6IE5VTV9UWVBFID0gTlVNX1RZUEUuYWRkKHRoaXMsIGFkZHZhbCk7XHJcbiAgICB0aGlzLl9kYXRhID0gbmV3IEludDhBcnJheSh0ZW1wLl9kYXRhLmxlbmd0aCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBfYWk6IG51bWJlciA9IDA7IF9haSA8IHRoaXMuX2RhdGEubGVuZ3RoOyArK19haSlcclxuICAgICAgdGhpcy5fZGF0YVtfYWldID0gdGVtcC5fZGF0YVtfYWldO1xyXG5cclxuICAgIC8vIFB1dCAwIGluIHRoZSBlbmQgb2YgdGhlIG51bWJlclxyXG4gICAgcHdyID0gKHRoaXMuX2RhdGFbMF0gJiB+TlVNX1RZUEUuU0lHTl9NQVNLKSAtIE5VTV9UWVBFLkVYUF9CSUFTO1xyXG5cclxuICAgIGlmICgobnVtX2RpZmYgPSBwd3IgLSAoKHdob2xlICsgMSkgPj4gMSkpID49IDApIHtcclxuICAgICAgaWYgKCh3aG9sZSAmIDEpICE9PSAwKSB7XHJcbiAgICAgICAgdGhpcy5fZGF0YVsxICsgbnVtX2RpZmZdID0gTlVNX1RZUEUudG9TQnl0ZSh0aGlzLl9kYXRhWzEgKyBudW1fZGlmZl0gLSB0aGlzLl9kYXRhWzEgKyBudW1fZGlmZl0gJSAxMCk7XHJcbiAgICAgICAgbnVtX2RpZmYrKztcclxuICAgICAgICB9XHJcbiAgICAgIGZvciAoaSA9IDA7XHJcbiAgICAgICAgICAgaSA8IHRoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAoMSArIG51bV9kaWZmKTtcclxuICAgICAgICAgICBpKyspXHJcbiAgICAgICAgdGhpcy5fZGF0YVsxICsgbnVtX2RpZmYgKyBpXSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICAgIHRoaXMuTlVNX1NFVF9aRVJPKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRydW5jYXRlcyB0aGUgTlVNX1RZUEUgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlY3NcIj4gIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdG8gZGVjaW1hbCBwb2ludCB0byBoYXZlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgbnVtX3RydW5jKGRlY3M6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHB3cjogbnVtYmVyO1xyXG4gICAgbGV0IG51bV9kaWZmOiBudW1iZXI7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0aGlzLk5VTV9JU19MT05HKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBwd3IgPSAodGhpcy5fZGF0YVswXSAmIH5OVU1fVFlQRS5TSUdOX01BU0spIC0gTlVNX1RZUEUuRVhQX0JJQVM7XHJcbiAgICBpZiAoKG51bV9kaWZmID0gdGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDEgLSBwd3IgLSAoKGRlY3MgKyAxKSA+PiAxKSkgPCAwKVxyXG4gICAgICByZXR1cm47XHJcbiAgICBpZiAoKG51bV9kaWZmIDwgdGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDEpICYmICgoZGVjcyAmIDEpICE9PSAwKSkge1xyXG4gICAgICB0aGlzLl9kYXRhW3RoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxIC0gbnVtX2RpZmZdID1cclxuICAgICAgICBOVU1fVFlQRS50b1NCeXRlKHRoaXMuX2RhdGFbdGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDEgLSBudW1fZGlmZl0gLSB0aGlzLl9kYXRhW3RoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxIC0gbnVtX2RpZmZdICUgMTApO1xyXG4gICAgICBpZiAodGhpcy5fZGF0YVt0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFIC0gMSAtIG51bV9kaWZmXSA9PT0gMClcclxuICAgICAgICBudW1fZGlmZisrO1xyXG4gICAgICAgICAgfVxyXG4gICAgaWYgKG51bV9kaWZmID49IHRoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxKSB7XHJcbiAgICAgICAgICB0aGlzLk5VTV9aRVJPKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICBmb3IgKGkgPSAwO1xyXG4gICAgICAgICBpIDwgbnVtX2RpZmY7XHJcbiAgICAgICAgIGkrKylcclxuICAgICAgdGhpcy5fZGF0YVt0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFIC0gbnVtX2RpZmYgKyBpXSA9IDA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0cyBhIE1hZ2ljIG51bWJlciBmcm9tIHN0ZCBsb25nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bVwiPiAgVGhlIG51bWJlciB0byBiZSB0cmFuc2xhdGVkXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgbnVtXzRfc3RkX2xvbmcoKTogdm9pZCB7XHJcbiAgICBsZXQgc2xvbmc6IG51bWJlcjtcclxuXHJcbiAgICBzbG9uZyA9IHRoaXMuTlVNX0xPTkcoKTtcclxuICAgIGlmIChzbG9uZyA+PSAwKVxyXG4gICAgICB0aGlzLm51bV80X3Vsb25nKHNsb25nKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm51bV80X3Vsb25nKC1zbG9uZyk7XHJcbiAgICAgIHRoaXMuX2RhdGFbMF0gfD0gTlVNX1RZUEUuU0lHTl9NQVNLO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbnZlcnRzIGEgTWFnaWMgbnVtYmVyIGZyb20gdWxvbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibnVtXCI+ICBUaGUgbnVtYmVyIHRvIGJlIHRyYW5zbGF0ZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICBudW1fNF91bG9uZyhkYXRhOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBwd3I6IG51bWJlcjtcclxuICAgIGxldCBwb3M6IG51bWJlcjtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcblxyXG4gICAgdGhpcy5OVU1fU0VUX1pFUk8oKTtcclxuICAgIHBvcyA9IHB3ciA9IDU7XHJcbiAgICB3aGlsZSAoZGF0YSA+IDApIHtcclxuICAgICAgdGhpcy5fZGF0YVtwb3MtLV0gPSBOVU1fVFlQRS50b1NCeXRlKGRhdGEgJSAxMDApO1xyXG4gICAgICBkYXRhID0gTWF0aC5mbG9vcihkYXRhIC8gMTAwKTtcclxuICAgIH1cclxuICAgIGlmIChwb3MgPCBwd3IpIHtcclxuICAgICAgaWYgKHBvcyA+IDApIHtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHdyIC0gcG9zOyBpKyspXHJcbiAgICAgICAgICB0aGlzLl9kYXRhWzEgKyBpXSA9IHRoaXMuX2RhdGFbMSArIHBvcyArIGldO1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwb3M7IGkrKylcclxuICAgICAgICAgIHRoaXMuX2RhdGFbcHdyIC0gcG9zICsgMSArIGldID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgIHRoaXMuX2RhdGFbMF0gPSBOVU1fVFlQRS50b1NCeXRlKHB3ciAtIHBvcyArIE5VTV9UWVBFLkVYUF9CSUFTKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCB0aGUgbG9uZyB2YWx1ZSBmcm9tIGEgTWFnaWMgTnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBsb25nIHZhbHVlIG9mIHRoZSBudW1iZXJcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIE5VTV8yX0xPTkcoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLk5VTV9JU19MT05HKCkpXHJcbiAgICAgIHJldHVybiB0aGlzLk5VTV9MT05HKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLm51bV8yX2xvbmcoKTtcclxuICAgIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCB0aGUgVWxvbmcgdmFsdWUgZnJvbSBhIE1hZ2ljIE51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbG9uZyB2YWx1ZSBvZiB0aGUgbnVtYmVyXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBOVU1fMl9VTE9ORygpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuTlVNX0lTX0xPTkcoKSlcclxuICAgICAgcmV0dXJuIHRoaXMuTlVNX0xPTkcoKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMubnVtXzJfdWxvbmcoKTtcclxuICAgIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCB0aGUgbG9uZyB2YWx1ZSBmcm9tIGEgbm9uIGxvbmcgTWFnaWMgTnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBsb25nIHZhbHVlIG9mIHRoZSBudW1iZXJcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIG51bV8yX2xvbmcoKTogbnVtYmVyIHtcclxuICAgIGxldCBzbG9uZzogbnVtYmVyO1xyXG4gICAgbGV0IHNpZ246IG51bWJlcjtcclxuXHJcbiAgICBzaWduID0gdGhpcy5fZGF0YVswXSAmIE5VTV9UWVBFLlNJR05fTUFTSztcclxuICAgIHRoaXMuX2RhdGFbMF0gJj0gTlVNX1RZUEUudG9TQnl0ZSh+TlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICAgIGlmIChzaWduICE9PSAwKSB7XHJcbiAgICAgIGlmIChOVU1fVFlQRS5tZW1jbXAodGhpcywgMCwgTlVNX1RZUEUuTWluTE9ORygpLCAwLCB0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFKSA+IDApXHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoTlVNX1RZUEUubWVtY21wKHRoaXMsIDAsIE5VTV9UWVBFLk1heExPTkcoKSwgMCwgdGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRSkgPiAwKVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9XHJcbiAgICBzbG9uZyA9IHRoaXMubnVtXzJfdWxvbmcoKTtcclxuICAgIGlmIChzaWduICE9PSAwKSB7XHJcbiAgICAgIHNsb25nID0gLXNsb25nO1xyXG4gICAgICB0aGlzLl9kYXRhWzBdIHw9IE5VTV9UWVBFLnRvU0J5dGUoc2lnbik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKHNsb25nKTtcclxuICAgIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCB0aGUgdWxvbmcgdmFsdWUgZnJvbSBhIG5vbiBsb25nIE1hZ2ljIE51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgdWxvbmcgdmFsdWUgb2YgdGhlIG51bWJlclxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgbnVtXzJfdWxvbmcoKTogbnVtYmVyIHtcclxuICAgIGxldCB2YWw6IG51bWJlcjtcclxuICAgIGxldCBwd3I6IG51bWJlcjtcclxuICAgIGxldCBwb3M6IG51bWJlcjtcclxuICAgIGxldCBsYXN0OiBib29sZWFuO1xyXG5cclxuICAgIHB3ciA9IHRoaXMuX2RhdGFbMF0gLSBOVU1fVFlQRS5FWFBfQklBUztcclxuICAgIGlmIChwd3IgPiA1KVxyXG4gICAgICByZXR1cm4gKDApO1xyXG4gICAgbGFzdCA9IChwd3IgPT09IDUpO1xyXG4gICAgaWYgKGxhc3QpXHJcbiAgICAgIHB3ciA9IDQ7XHJcblxyXG4gICAgdmFsID0gMDtcclxuICAgIGZvciAocG9zID0gMTsgcG9zIDw9IHB3cjsgcG9zKyspXHJcbiAgICAgIHZhbCA9IHZhbCAqIDEwMCArIE5VTV9UWVBFLnRvVUJ5dGUodGhpcy5fZGF0YVtwb3NdKTtcclxuXHJcbiAgICBpZiAobGFzdClcclxuICAgICAgaWYgKHZhbCA8PSBNYXRoLmZsb29yKCgweEZGRkZGRkZGIC0gTlVNX1RZUEUudG9VQnl0ZSh0aGlzLl9kYXRhWzVdKSkgLyAxMDApKVxyXG4gICAgICAgIHZhbCA9IHZhbCAqIDEwMCArIE5VTV9UWVBFLnRvVUJ5dGUodGhpcy5fZGF0YVs1XSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB2YWwgPSAwO1xyXG4gICAgcmV0dXJuICh2YWwpO1xyXG4gICAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUGVyZm9ybSB0aGUgYWN0dWFsbCBhZGQgb3BlcmF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTFcIj4gICAgICBUaGUgZmlyc3QgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW0yXCI+ICAgICAgVGhlIHNlY29uZCBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9wZXJEYXRhXCI+ICBJbmZvcm1hdGlvbiBmb3IgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBUaGUgdHdvIG51bWJlcnMgYWRkZWRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBhZGRfcG9zKG51bTE6IE5VTV9UWVBFLCBudW0yOiBOVU1fVFlQRSwgb3BlckRhdGE6IE9wZXJEYXRhKTogTlVNX1RZUEUge1xyXG4gICAgbGV0IGxlbjE6IG51bWJlcjtcclxuICAgIGxldCBsZW4yOiBudW1iZXI7XHJcbiAgICBsZXQgbGVuOiBudW1iZXI7XHJcbiAgICBsZXQgcG9zOiBudW1iZXI7XHJcbiAgICBsZXQgbnVtMXB0cjogbnVtYmVyO1xyXG4gICAgbGV0IHJlc3B0cjogbnVtYmVyO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBTSUdOSUZJQ0FOVF9OVU1fU0laRTogbnVtYmVyO1xyXG5cclxuICAgIC8vIG51bGwgdmFsdWVzXHJcbiAgICBpZiAobnVtMSA9PSBudWxsIHx8IG51bTIgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBTSUdOSUZJQ0FOVF9OVU1fU0laRSA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFNpZ25pZmljYW50TnVtU2l6ZSgpO1xyXG5cclxuICAgIGxldCByZXM6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcblxyXG4gICAgaWYgKG9wZXJEYXRhLk5VTV9FeHAyXyA9PT0gMCB8fCAob3BlckRhdGEuTlVNX0RpZmZfID49IFNJR05JRklDQU5UX05VTV9TSVpFIC0gMSkpIHtcclxuICAgICAgcmVzID0gbmV3IE5VTV9UWVBFKG51bTEpO1xyXG4gICAgICByZXMuX2RhdGFbMF0gPSBvcGVyRGF0YS5OVU1fRXhwMV87XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgbGVuMSA9IDE7XHJcbiAgICBmb3IgKGkgPSBTSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDI7IGkgPiAwOyBpIC09IDIpIHtcclxuICAgICAgaWYgKG51bTEuU0hSVF9JU19aRVJPKGkpKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgbGVuMSA9IGkgKyAxO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgaWYgKG51bTEuX2RhdGFbbGVuMV0gPT09IDApXHJcbiAgICAgIGxlbjEtLTtcclxuXHJcbiAgICBsZW4yID0gMTtcclxuICAgIGZvciAoaSA9IFNJR05JRklDQU5UX05VTV9TSVpFIC0gMjsgaSA+IDA7IGkgLT0gMikge1xyXG4gICAgICBpZiAobnVtMi5TSFJUX0lTX1pFUk8oaSkpXHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxlbjIgPSBpICsgMTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIGlmIChudW0yLl9kYXRhW2xlbjJdID09PSAwKVxyXG4gICAgICBsZW4yLS07XHJcblxyXG4gICAgaWYgKChsZW4gPSBNYXRoLm1heChsZW4xLCBsZW4yICsgb3BlckRhdGEuTlVNX0RpZmZfKSkgPiBTSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDEpXHJcbiAgICAgIGxlbiA9IFNJR05JRklDQU5UX05VTV9TSVpFIC0gMTtcclxuXHJcbiAgICByZXMuTlVNX1NFVF9aRVJPKCk7XHJcbiAgICBudW0xcHRyID0gb3BlckRhdGEuTlVNX0RpZmZfO1xyXG4gICAgcmVzcHRyID0gb3BlckRhdGEuTlVNX0RpZmZfO1xyXG4gICAgZm9yIChwb3MgPSBsZW4gLSBvcGVyRGF0YS5OVU1fRGlmZl87IHBvcyA+IDA7IHBvcy0tKSB7XHJcbiAgICAgIHJlcy5fZGF0YVtyZXNwdHIgKyBwb3NdID1cclxuICAgICAgICBOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLnRvVUJ5dGUocmVzLl9kYXRhW3Jlc3B0ciArIHBvc10pICsgTlVNX1RZUEUudG9VQnl0ZShudW0xLl9kYXRhW251bTFwdHIgKyBwb3NdKSArIE5VTV9UWVBFLnRvVUJ5dGUobnVtMi5fZGF0YVtwb3NdKSk7XHJcbiAgICAgIGlmIChOVU1fVFlQRS50b1VCeXRlKHJlcy5fZGF0YVtyZXNwdHIgKyBwb3NdKSA+PSAxMDApIHtcclxuICAgICAgICByZXMuX2RhdGFbcmVzcHRyICsgcG9zXSA9IE5VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUudG9VQnl0ZShyZXMuX2RhdGFbcmVzcHRyICsgcG9zXSkgLSAxMDApO1xyXG4gICAgICAgIHJlcy5fZGF0YVtyZXNwdHIgKyBwb3MgLSAxXSA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIGZvciAocG9zID0gb3BlckRhdGEuTlVNX0RpZmZfOyBwb3MgPiAwOyBwb3MtLSkge1xyXG4gICAgICByZXMuX2RhdGFbcG9zXSA9IE5VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUudG9VQnl0ZShyZXMuX2RhdGFbcG9zXSkgKyBOVU1fVFlQRS50b1VCeXRlKG51bTEuX2RhdGFbcG9zXSkpO1xyXG4gICAgICBpZiAoTlVNX1RZUEUudG9VQnl0ZShyZXMuX2RhdGFbcG9zXSkgPj0gMTAwKSB7XHJcbiAgICAgICAgcmVzLl9kYXRhW3Bvc10gPSBOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLnRvVUJ5dGUocmVzLl9kYXRhW3Bvc10pIC0gMTAwKTtcclxuICAgICAgICByZXMuX2RhdGFbcG9zIC0gMV0gPSAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIGlmIChyZXMuX2RhdGFbMF0gIT09IDApIHtcclxuICAgICAgZm9yIChwb3MgPSBNYXRoLm1pbihsZW4sIFNJR05JRklDQU5UX05VTV9TSVpFIC0gMik7IHBvcyA+PSAwOyBwb3MtLSlcclxuICAgICAgICByZXMuX2RhdGFbcG9zICsgMV0gPSByZXMuX2RhdGFbcG9zXTtcclxuICAgICAgb3BlckRhdGEuTlVNX0V4cDFfKys7XHJcbiAgICAgICAgICB9XHJcbiAgICByZXMuX2RhdGFbMF0gPSBvcGVyRGF0YS5OVU1fRXhwMV87XHJcblxyXG4gICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBQZXJmb3JtIHRoZSBhY3R1YWxsIHN1YiBvcGVyYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibnVtMVwiPiAgICAgIFRoZSBmaXJzdCBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTJcIj4gICAgICBUaGUgc2Vjb25kIG51bWJlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3BlckRhdGFcIj4gIEluZm9ybWF0aW9uIGZvciBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb25cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IFRoZSByZXN1bHQgb2YgdGhlIHN1YnRyYWN0aW9uIG9wZXJhdGlvblxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIHN1Yl9wb3MobnVtMTogTlVNX1RZUEUsIG51bTI6IE5VTV9UWVBFLCBvcGVyRGF0YTogT3BlckRhdGEpOiBOVU1fVFlQRSB7XHJcbiAgICBsZXQgbGVuMTogbnVtYmVyO1xyXG4gICAgbGV0IGxlbjI6IG51bWJlcjtcclxuICAgIGxldCBsZW46IG51bWJlcjtcclxuICAgIGxldCBwb3M6IG51bWJlcjtcclxuICAgIGxldCBudW0xcHRyOiBudW1iZXI7XHJcbiAgICBsZXQgcmVzcHRyOiBudW1iZXI7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IFNJR05JRklDQU5UX05VTV9TSVpFOiBudW1iZXI7XHJcblxyXG4gICAgLy8gbnVsbCB2YWx1ZXNcclxuICAgIGlmIChudW0xID09IG51bGwgfHwgbnVtMiA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBTSUdOSUZJQ0FOVF9OVU1fU0laRSA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFNpZ25pZmljYW50TnVtU2l6ZSgpO1xyXG5cclxuICAgIGxldCByZXM6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgajogbnVtYmVyO1xyXG5cclxuICAgIGlmIChvcGVyRGF0YS5OVU1fRXhwMl8gPT09IDAgfHwgKG9wZXJEYXRhLk5VTV9EaWZmXyA+PSBTSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDEpKSB7XHJcbiAgICAgIHJlcyA9IG5ldyBOVU1fVFlQRShudW0xKTtcclxuICAgICAgcmVzLl9kYXRhWzBdID0gb3BlckRhdGEuTlVNX0V4cDFfO1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIGxlbjEgPSAxO1xyXG4gICAgZm9yIChpID0gU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAyOyBpID4gMDsgaSAtPSAyKSB7XHJcbiAgICAgIGlmIChudW0xLlNIUlRfSVNfWkVSTyhpKSlcclxuICAgICAgICBjb250aW51ZTtcclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGxlbjEgPSBpICsgMTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIGlmIChudW0xLl9kYXRhW2xlbjFdID09PSAwKVxyXG4gICAgICBsZW4xLS07XHJcblxyXG4gICAgbGVuMiA9IDE7XHJcbiAgICBmb3IgKGkgPSBTSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDI7IGkgPiAwOyBpIC09IDIpIHtcclxuICAgICAgaWYgKG51bTIuU0hSVF9JU19aRVJPKGkpKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZW4yID0gaSArIDE7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICBpZiAobnVtMi5fZGF0YVtsZW4yXSA9PT0gMClcclxuICAgICAgbGVuMi0tO1xyXG5cclxuICAgIGlmICgobGVuID0gTWF0aC5tYXgobGVuMSwgbGVuMiArIG9wZXJEYXRhLk5VTV9EaWZmXykpID4gU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxKVxyXG4gICAgICBsZW4gPSBTSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDE7XHJcblxyXG4gICAgcmVzLk5VTV9TRVRfWkVSTygpO1xyXG4gICAgbnVtMXB0ciA9IG9wZXJEYXRhLk5VTV9EaWZmXztcclxuICAgIHJlc3B0ciA9IG9wZXJEYXRhLk5VTV9EaWZmXztcclxuICAgIGZvciAocG9zID0gbGVuIC0gb3BlckRhdGEuTlVNX0RpZmZfOyBwb3MgPiAwOyBwb3MtLSkge1xyXG5cclxuICAgICAgcmVzLl9kYXRhW3Jlc3B0ciArIHBvc10gPSBOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLnRvVUJ5dGUocmVzLl9kYXRhW3Jlc3B0ciArIHBvc10pICsgTlVNX1RZUEUudG9VQnl0ZShudW0xLl9kYXRhW251bTFwdHIgKyBwb3NdKSAtIE5VTV9UWVBFLnRvVUJ5dGUobnVtMi5fZGF0YVtwb3NdKSk7XHJcbiAgICAgIGlmIChyZXMuX2RhdGFbcmVzcHRyICsgcG9zXSA8IDApIHtcclxuICAgICAgICByZXMuX2RhdGFbcmVzcHRyICsgcG9zXSA9IE5VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUudG9VQnl0ZShyZXMuX2RhdGFbcmVzcHRyICsgcG9zXSkgKyAxMDApO1xyXG4gICAgICAgIHJlcy5fZGF0YVtyZXNwdHIgKyBwb3MgLSAxXSA9IE5VTV9UWVBFLnRvU0J5dGUoMHhGRik7IC8vIDI1NVxyXG4gICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgZm9yIChwb3MgPSBvcGVyRGF0YS5OVU1fRGlmZl87IHBvcyA+IDA7IHBvcy0tKSB7XHJcbiAgICAgIHJlcy5fZGF0YVtwb3NdID0gTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS50b1VCeXRlKHJlcy5fZGF0YVtwb3NdKSArIE5VTV9UWVBFLnRvVUJ5dGUobnVtMS5fZGF0YVtwb3NdKSk7XHJcbiAgICAgIGlmIChyZXMuX2RhdGFbcG9zXSA8IDApIHtcclxuICAgICAgICByZXMuX2RhdGFbcG9zXSA9IE5VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUudG9VQnl0ZShyZXMuX2RhdGFbcG9zXSkgKyAxMDApO1xyXG4gICAgICAgIHJlcy5fZGF0YVtwb3MgLSAxXSA9IE5VTV9UWVBFLnRvU0J5dGUoMHhGRik7IC8vIDI1NVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICB3aGlsZSAoKCsrcG9zIDw9IGxlbikgJiYgcmVzLl9kYXRhW3Bvc10gPT09IDApIHtcclxuICAgICAgICB9XHJcbiAgICBpZiAocG9zIDw9IGxlbikge1xyXG4gICAgICBvcGVyRGF0YS5OVU1fRGlmZl8gPSBwb3MgLSAxO1xyXG4gICAgICBpZiAob3BlckRhdGEuTlVNX0RpZmZfID4gMCkge1xyXG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW4gLSBvcGVyRGF0YS5OVU1fRGlmZl87IGorKylcclxuICAgICAgICAgIHJlcy5fZGF0YVsxICsgal0gPSByZXMuX2RhdGFbcG9zICsgal07XHJcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IG9wZXJEYXRhLk5VTV9EaWZmXzsgaisrKVxyXG4gICAgICAgICAgcmVzLl9kYXRhW2xlbiAtIG9wZXJEYXRhLk5VTV9EaWZmXyArIDEgKyBqXSA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgcmVzLl9kYXRhWzBdID0gTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS50b1VCeXRlKG9wZXJEYXRhLk5VTV9FeHAxXykgLSBvcGVyRGF0YS5OVU1fRGlmZl8pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUGVyZm9ybSB0aGUgYWN0dWFsICBGSVggb3BlcmF0aW9uIHdpdGggd2hvbGUgcGFydCBvZiB0aGUgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIndob2xlc1wiPm51bWJlciBvZiBuZWVkZWQgd2hvbGUgZGlnaXRzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgbnVtX2ZpeCh3aG9sZXM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHB3cjogbnVtYmVyO1xyXG4gICAgbGV0IG51bV9kaWZmOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKHRoaXMuTlVNX0lTX0xPTkcoKSlcclxuICAgICAgdGhpcy5udW1fNF9zdGRfbG9uZygpO1xyXG4gICAgcHdyID0gKHRoaXMuX2RhdGFbMF0gJiB+TlVNX1RZUEUuU0lHTl9NQVNLKSAtIE5VTV9UWVBFLkVYUF9CSUFTO1xyXG5cclxuICAgIGlmICgobnVtX2RpZmYgPSBwd3IgLSAoKHdob2xlcyArIDEpID4+IDEpKSA8IDApXHJcbiAgICAgIHJldHVybjtcclxuICAgIGlmIChudW1fZGlmZiA8IHRoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxKSB7XHJcbiAgICAgIGlmICgod2hvbGVzICYgMSkgPT09IDEpXHJcbiAgICAgICAgdGhpcy5fZGF0YVsxICsgbnVtX2RpZmZdID0gTlVNX1RZUEUudG9TQnl0ZSh0aGlzLl9kYXRhWzEgKyBudW1fZGlmZl0gJSAxMCk7XHJcbiAgICAgIHdoaWxlICgobnVtX2RpZmYgPCB0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFIC0gMSkgJiYgdGhpcy5fZGF0YVsxICsgbnVtX2RpZmZdID09PSAwKVxyXG4gICAgICAgIG51bV9kaWZmKys7XHJcbiAgICAgIH1cclxuICAgIGlmIChudW1fZGlmZiA+PSB0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFIC0gMSkge1xyXG4gICAgICAgIHRoaXMuTlVNX1pFUk8oKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICBpZiAobnVtX2RpZmYgPiAwKSB7XHJcbiAgICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFIC0gMSAtIG51bV9kaWZmOyBpKyspXHJcbiAgICAgICAgdGhpcy5fZGF0YVsxICsgaV0gPSB0aGlzLl9kYXRhWzEgKyBudW1fZGlmZiArIGldO1xyXG5cclxuICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9kaWZmOyBpKyspXHJcbiAgICAgICAgdGhpcy5fZGF0YVt0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFIC0gbnVtX2RpZmYgKyBpXSA9IDA7XHJcbiAgICAgIHRoaXMuX2RhdGFbMF0gPSBOVU1fVFlQRS50b1NCeXRlKHRoaXMuX2RhdGFbMF0gLSBOVU1fVFlQRS50b1NCeXRlKG51bV9kaWZmKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgYnl0ZSBvbiBzcGVjaWZpYyBwb3NpdGlvbiBpcyB6ZXJvIG9yIDB4RkZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicG9zaXRpb25cIj5pbiBOVU0gdG8gYmUgY2hlY2tlZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gaXMgdGhlIGJ5dGUgemVyb1xyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgU0hSVF9JU19aRVJPKHBvczogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtwb3NdID09PSAwICYmIHRoaXMuX2RhdGFbcG9zICsgMV0gPT09IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgWmVybyBhIE1hZ2ljIE51bWJlci4gSWYgdGhlIG51bWJlciBzaG91bGQgY29udGFpbiBhIGxvbmcgemVybywgdGhlIGZpcnN0XHJcbiAgLy8vICAgYnl0ZSBpcyBzZXQgdG8gTlVNX0xPTkdfVFlQRS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYXNMb25nXCI+ICBzZXQgdGhlIE1hZ2ljIE51bWJlciB0byBjb250YWluIGEgbG9uZyB6ZXJvIHZhbHVlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRaZXJvKGFzTG9uZzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RZUEUuTlVNX1NJWkU7IGkrKylcclxuICAgICAgdGhpcy5fZGF0YVtpXSA9IDA7XHJcblxyXG4gICAgaWYgKGFzTG9uZylcclxuICAgICAgdGhpcy5fZGF0YVswXSA9IE5VTV9UWVBFLk5VTV9MT05HX1RZUEU7XHJcbiAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb21wYXJlIHR3byBNYWdpYyBOdW1iZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTFcIj4gIFRoZSBmaXJzdCBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBvczFcIj4gIFRoZSBwb3NpdGlvbiBvZiBudW0xIHRvIGNvbXBhcmUgZnJvbVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibnVtMlwiPiAgVGhlIHNlY29uZCBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBvczNcIj4gIFRoZSBwb3NpdGlvbiBvZiBudW0yIHRvIGNvbXBhcmUgZnJvbVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gMCBpZiBpZGVudGljYWwsIDEgaWYgbnVtMT5udW0yLCAtMSBpZiBudW0xPG51bTJcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIG1lbWNtcChudW0xOiBOVU1fVFlQRSwgcG9zMTogbnVtYmVyLCBudW0yOiBOVU1fVFlQRSwgcG9zMjogbnVtYmVyLCBsZW46IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuXHJcbiAgICB3aGlsZSAoaSA8IGxlbiAmJiBudW0xLl9kYXRhW3BvczFdID09PSBudW0yLl9kYXRhW3BvczJdICYmIHBvczEgPCBOVU1fVFlQRS5OVU1fU0laRSAmJiBwb3MyIDwgTlVNX1RZUEUuTlVNX1NJWkUpIHtcclxuICAgICAgaSsrO1xyXG4gICAgICBwb3MxKys7XHJcbiAgICAgIHBvczIrKztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaSA9PT0gbGVuKVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIGVsc2UgaWYgKHRoaXMudG9VQnl0ZShudW0xLl9kYXRhW3BvczFdKSA8IHRoaXMudG9VQnl0ZShudW0yLl9kYXRhW3BvczJdKSlcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gMTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgYSB1bnNpZ25lZCB2YWx1ZSBmcm9tIGEgYnl0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJieXRlVmFsXCI+ICBBIHNpZ25lZCBieXRlIHZhbHVlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgdW5zaWduZWQgdmFsdWUgb2YgdGhlIGJ5dGVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyB0b1VCeXRlKGJ5dGVWYWw6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgdmFsOiBudW1iZXIgPSBieXRlVmFsO1xyXG5cclxuICAgIGlmIChieXRlVmFsIDwgMClcclxuICAgICAgdmFsID0gMjU2ICsgYnl0ZVZhbDtcclxuXHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCBhIHNpZ25lZCBieXRlIHZhbHVlIGZyb20gYSB1bnNpZ25lZCB2YWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2lnbmVkVmFsXCI+ICBBbiB1bnNpZ25lZCBieXRlIHZhbHVlIChhcyBhbiBpbnRlZ2VyKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHNpZ25lZCB2YWx1ZSBhcyBhIGJ5dGVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyB0b1NCeXRlKHVuc2lnbmVkVmFsOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHZhbDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAodW5zaWduZWRWYWwgPiBDb25zdGFudHMuU0J5dGVNYXhWYWx1ZSlcclxuICAgICAgdmFsID0gKHVuc2lnbmVkVmFsIC0gMjU2KTtcclxuICAgIGVsc2VcclxuICAgICAgdmFsID0gdW5zaWduZWRWYWw7XHJcblxyXG4gICAgcmV0dXJuIHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIG1heGltdW0gbG9uZyBudW1iZXIgaW4gTlVNX1RZUEUgc3RkIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIE1heExPTkcoKTogTlVNX1RZUEUge1xyXG4gICAgbGV0IG5VTV9UWVBFOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgblVNX1RZUEUuX2RhdGFbMF0gPSBOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNSk7XHJcbiAgICBuVU1fVFlQRS5fZGF0YVsxXSA9IDIxO1xyXG4gICAgblVNX1RZUEUuX2RhdGFbMl0gPSA0NztcclxuICAgIG5VTV9UWVBFLl9kYXRhWzNdID0gNDg7XHJcbiAgICBuVU1fVFlQRS5fZGF0YVs0XSA9IDM2O1xyXG4gICAgblVNX1RZUEUuX2RhdGFbNV0gPSA0NztcclxuICAgIHJldHVybiBuVU1fVFlQRTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIG1pbmltdW0gbG9uZyBudW1iZXIgaW4gTlVNX1RZUEUgc3RkIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIE1pbkxPTkcoKTogTlVNX1RZUEUge1xyXG4gICAgbGV0IG51bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIG51bS5fZGF0YVswXSA9IE5VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyA1KTtcclxuICAgIG51bS5fZGF0YVsxXSA9IDIxO1xyXG4gICAgbnVtLl9kYXRhWzJdID0gNDc7XHJcbiAgICBudW0uX2RhdGFbM10gPSA0ODtcclxuICAgIG51bS5fZGF0YVs0XSA9IDM2O1xyXG4gICAgbnVtLl9kYXRhWzVdID0gNDg7XHJcbiAgICByZXR1cm4gbnVtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCBkb3VibGUgbnVtYmVyIGZyb20gTWFnaWMgTlVNX1RZUEVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHRvX2RvdWJsZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZV9tZ18yX2Zsb2F0KDgpOyAvLyBMZW5ndGggb2YgZG91YmxlIGlzIDggYnl0ZVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCBkb3VibGUgbnVtYmVyIGZyb20gTWFnaWMgTlVNX1RZUEVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGVuXCI+b2YgYnl0ZSBvZiBuZWVkZWQgbnVtYmVyIC0gVVNFIDhcclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIHN0b3JhZ2VfbWdfMl9mbG9hdChsZW46IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgc2lnbl9wb3M6IG51bWJlcjtcclxuICAgIGxldCBzaWduOiBudW1iZXI7XHJcbiAgICBsZXQgY29tcG51bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCB0bXBudW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgZGl2bnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgbGV0IHB3cjogbnVtYmVyO1xyXG4gICAgbGV0IGJpdHM6IG51bWJlcjtcclxuICAgIGxldCBleHA6IG51bWJlcjtcclxuICAgIGxldCBsb25nMTogbnVtYmVyID0gMDtcclxuICAgIGxldCBsb25nMjogbnVtYmVyID0gMDtcclxuICAgIGxldCBmbHRPdXQ6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgY291dDogSW50OEFycmF5ID0gbmV3IEludDhBcnJheShbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pO1xyXG4gICAgbGV0IE51bTJQd3IyM186IEludDhBcnJheSA9IG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyA0KSwgOCwgMzgsIDg2LCA4XSk7XHJcbiAgICBsZXQgTnVtMlB3cjUyXzogSW50OEFycmF5ID0gbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDgpLCA0NSwgMywgNTksIDk2LCAyNywgMzcsIDQsIDk2XSk7XHJcbiAgICBsZXQgYmFzZV9OdW0xNlB3cnM6IEludDhBcnJheVtdID0gW1xyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgMSksIDFdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDEpLCAxNl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgMiksIDIsIDU2XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyAyKSwgNDAsIDk2XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyAzKSwgNiwgNTUsIDM2XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyA0KSwgMSwgNCwgODUsIDc2XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyA0KSwgMTYsIDc3LCA3MiwgMTZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDUpLCAyLCA2OCwgNDMsIDU0LCA1Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNSksIDQyLCA5NCwgOTYsIDcyLCA5Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNiksIDYsIDg3LCAxOSwgNDcsIDY3LCAzNl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNyksIDEsIDksIDk1LCAxMSwgNjIsIDc3LCA3Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNyksIDE3LCA1OSwgMjEsIDg2LCA0LCA0NCwgMTZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDgpLCAyLCA4MSwgNDcsIDQ5LCA3NiwgNzEsIDYsIDU2XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyA4KSwgNDUsIDMsIDU5LCA5NiwgMjcsIDM3LCA0LCA5Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgOSksIDcsIDIwLCA1NywgNTksIDQwLCAzNywgOTIsIDc5LCAzNl0pXHJcbiAgICBdO1xyXG5cclxuICAgIGxldCBiYXNlX051bTJQd3JzOiBJbnQ4QXJyYXlbXSA9IFtcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDEpLCAxXSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyAxKSwgMl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgMSksIDRdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDEpLCA4XSlcclxuICAgICAgXTtcclxuXHJcbiAgICBpZiAodGhpcy5OVU1fSVNfTE9ORygpKVxyXG4gICAgICB0aGlzLm51bV80X3N0ZF9sb25nKCk7XHJcbiAgICBpZiAodGhpcy5fZGF0YVswXSA9PT0gMClcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICBzaWduID0gTlVNX1RZUEUudG9TQnl0ZSh0aGlzLl9kYXRhWzBdICYgTlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICAgIHRoaXMuX2RhdGFbMF0gPSBOVU1fVFlQRS50b1NCeXRlKHRoaXMuX2RhdGFbMF0gJiA8bnVtYmVyPih+TlVNX1RZUEUuU0lHTl9NQVNLKSk7XHJcbiAgICBpZiAobGVuID09PSA0KSB7XHJcbiAgICAgIGJpdHMgPSAyNDtcclxuICAgICAgY29tcG51bSA9IG5ldyBOVU1fVFlQRShOdW0yUHdyMjNfKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBiaXRzID0gNTM7XHJcbiAgICAgIGNvbXBudW0gPSBuZXcgTlVNX1RZUEUoTnVtMlB3cjUyXyk7XHJcbiAgICB9XHJcbiAgICBwd3IgPSAodGhpcy5fZGF0YVswXSAtIE5VTV9UWVBFLkVYUF9CSUFTKSA8PCAxO1xyXG4gICAgaWYgKHB3ciA8IDApXHJcbiAgICAgIGV4cCA9IHB3ciAqIDMgKyBNYXRoLmZsb29yKChwd3IgKyAxKSAvIDMpO1xyXG4gICAgZWxzZSBleHAgPSBwd3IgKiAzICsgTWF0aC5mbG9vcigocHdyICsgMikgLyAzKTtcclxuICAgIHB3ciA9IGJpdHMgLSBleHA7XHJcbiAgICBpZiAocHdyIDwgMCkge1xyXG4gICAgICBwd3IgPSAtcHdyO1xyXG4gICAgICB0bXBudW0gPSBOVU1fVFlQRS5kaXYodGhpcywgbmV3IE5VTV9UWVBFKGJhc2VfTnVtMTZQd3JzW3B3ciA+PiAyXSkpO1xyXG4gICAgICB0bXBudW0gPSBOVU1fVFlQRS5kaXYodG1wbnVtLCBuZXcgTlVNX1RZUEUoYmFzZV9OdW0yUHdyc1twd3IgJiAzXSkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRtcG51bSA9IHRoaXM7XHJcbiAgICAgIHdoaWxlIChwd3IgPj0gNjApIHtcclxuICAgICAgICB0bXBudW0gPSBOVU1fVFlQRS5tdWwodG1wbnVtLCBuZXcgTlVNX1RZUEUoYmFzZV9OdW0xNlB3cnNbMTRdKSk7XHJcbiAgICAgICAgcHdyIC09IDU2O1xyXG4gICAgICB9XHJcbiAgICAgIHRtcG51bSA9IE5VTV9UWVBFLm11bCh0bXBudW0sIG5ldyBOVU1fVFlQRShiYXNlX051bTE2UHdyc1twd3IgPj4gMl0pKTtcclxuICAgICAgdG1wbnVtID0gTlVNX1RZUEUubXVsKHRtcG51bSwgbmV3IE5VTV9UWVBFKGJhc2VfTnVtMlB3cnNbcHdyICYgM10pKTtcclxuICAgIH1cclxuICAgIHdoaWxlIChOVU1fVFlQRS5udW1fY21wKHRtcG51bSwgY29tcG51bSkgPCAwKSB7XHJcbiAgICAgIGV4cC0tO1xyXG4gICAgICB0bXBudW0gPSBOVU1fVFlQRS5hZGQodG1wbnVtLCB0bXBudW0pO1xyXG4gICAgfVxyXG4gICAgaWYgKGxlbiA9PT0gNCkge1xyXG4gICAgICBsb25nMSA9IHRtcG51bS5udW1fMl91bG9uZygpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGRpdm51bSA9IE5VTV9UWVBFLmRpdih0bXBudW0sIG5ldyBOVU1fVFlQRShiYXNlX051bTE2UHdyc1s4XSkpO1xyXG4gICAgICBkaXZudW0ubnVtX3RydW5jKDApO1xyXG4gICAgICBsb25nMSA9IGRpdm51bS5udW1fMl91bG9uZygpO1xyXG4gICAgICBkaXZudW0gPSBOVU1fVFlQRS5tdWwoZGl2bnVtLCBuZXcgTlVNX1RZUEUoYmFzZV9OdW0xNlB3cnNbOF0pKTtcclxuICAgICAgZGl2bnVtID0gTlVNX1RZUEUuc3ViKHRtcG51bSwgZGl2bnVtKTtcclxuICAgICAgbG9uZzIgPSBkaXZudW0ubnVtXzJfdWxvbmcoKTtcclxuICAgIH1cclxuICAgIHNpZ25fcG9zID0gbGVuIC0gMTtcclxuICAgIGlmIChsZW4gPT09IDQpIHtcclxuICAgICAgZXhwICs9IDEyNjtcclxuICAgICAgY291dFszXSA9IE5VTV9UWVBFLnRvU0J5dGUoZXhwID4+IDEpO1xyXG4gICAgICBjb3V0WzJdID0gTlVNX1RZUEUudG9TQnl0ZSgodGhpcy5MT19DSEFSKHRoaXMuSElfU0hSVChsb25nMSkpICYgMHg3RikgfCAoKGV4cCAmIDB4MDEpIDw8IDcpKTtcclxuICAgICAgY291dFsxXSA9IE5VTV9UWVBFLnRvU0J5dGUodGhpcy5ISV9DSEFSKHRoaXMuTE9fU0hSVChsb25nMSkpKTtcclxuICAgICAgY291dFswXSA9IE5VTV9UWVBFLnRvU0J5dGUodGhpcy5MT19DSEFSKHRoaXMuTE9fU0hSVChsb25nMSkpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBleHAgKz0gMTAyMjtcclxuICAgICAgY291dFs3XSA9IE5VTV9UWVBFLnRvU0J5dGUoZXhwID4+IDQpO1xyXG5cclxuICAgICAgY291dFs2XSA9IE5VTV9UWVBFLnRvU0J5dGUoKHRoaXMuTE9fQ0hBUih0aGlzLkhJX1NIUlQobG9uZzEpKSAmIDB4MEYpIHwgKChleHAgJiAweDBGKSA8PCA0KSk7XHJcblxyXG4gICAgICBjb3V0WzVdID0gTlVNX1RZUEUudG9TQnl0ZSh0aGlzLkhJX0NIQVIodGhpcy5MT19TSFJUKGxvbmcxKSkpO1xyXG5cclxuICAgICAgY291dFs0XSA9IE5VTV9UWVBFLnRvU0J5dGUodGhpcy5MT19DSEFSKHRoaXMuTE9fU0hSVChsb25nMSkpKTtcclxuICAgICAgY291dFszXSA9IE5VTV9UWVBFLnRvU0J5dGUodGhpcy5ISV9DSEFSKHRoaXMuSElfU0hSVChsb25nMikpKTtcclxuICAgICAgY291dFsyXSA9IE5VTV9UWVBFLnRvU0J5dGUodGhpcy5MT19DSEFSKHRoaXMuSElfU0hSVChsb25nMikpKTtcclxuICAgICAgY291dFsxXSA9IE5VTV9UWVBFLnRvU0J5dGUodGhpcy5ISV9DSEFSKHRoaXMuTE9fU0hSVChsb25nMikpKTtcclxuICAgICAgY291dFswXSA9IE5VTV9UWVBFLnRvU0J5dGUodGhpcy5MT19DSEFSKHRoaXMuTE9fU0hSVChsb25nMikpKTtcclxuICAgIH1cclxuICAgIGlmIChzaWduICE9PSAwKSB7XHJcbiAgICAgIGNvdXRbc2lnbl9wb3NdIHw9IE5VTV9UWVBFLlNJR05fTUFTSztcclxuICAgICAgdGhpcy5fZGF0YVswXSB8PSBOVU1fVFlQRS5TSUdOX01BU0s7XHJcbiAgICB9XHJcbiAgICBmbHRPdXQgPSB0aGlzLnNieXRlQXJyXzJfRG91YmxlKGNvdXQpO1xyXG4gICAgcmV0dXJuIGZsdE91dDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCaXRfV2lzZSBtYXNrIDogTGVhdmUgbGFzdCBieXRlIGluIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBMT19DSEFSKG46IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gbiAmIDI1NTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCaXRfV2lzZSBtYXNrIDogTGVhdmUgYnl0ZSBiZWZvcmUgbGFzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBISV9DSEFSKG46IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKG4gJiA2NTI4MCkgPj4gODtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCaXRfV2lzZSBtYXNrIDogTGVhdmUgMiBsYXN0IGJ5dGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIExPX1NIUlQobjogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiA8bnVtYmVyPihuICYgNjU1MzUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJpdF9XaXNlIG1hc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSElfU0hSVChuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIDxudW1iZXI+KChuICYgLTY1NTM2KSA+PiAxNik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQml0X1dpc2UgbWFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgTUtfU0hSVChjMTogbnVtYmVyLCBjMjogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBzdHJJbnQ6IHN0cmluZyA9IChjMSA8PCA4IHwgYzIpLnRvU3RyaW5nKCk7XHJcbiAgICByZXR1cm4gTk51bWJlci5QYXJzZShzdHJJbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJpdF9XaXNlIG1hc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc3RhdGljIE1LX0xPTkcoczE6IG51bWJlciwgczI6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgbDE6IG51bWJlciA9IDxudW1iZXI+czE7XHJcbiAgICBsZXQgbDI6IG51bWJlciA9IDxudW1iZXI+czI7XHJcbiAgICBsZXQgc3RyTG5nOiBzdHJpbmcgPSAobDEgPDwgMTYgfCBsMikudG9TdHJpbmcoKTtcclxuICAgIHJldHVybiBOTnVtYmVyLlBhcnNlKHN0ckxuZyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBkb3VibGUgZnJvbSBhcnJheSBvZiBieXRlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJhcnJheVwiPm9mIGJ5dGVzLCBpbm5lciByZXByZXNlbnRhdGlvbiBvZiB0aGUgZG91YmxlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBkb3VibGVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc2J5dGVBcnJfMl9Eb3VibGUoYXJyYXk6IEludDhBcnJheSk6IG51bWJlciB7XHJcbiAgICBsZXQgZGF0YXZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyYXkuYnVmZmVyKTtcclxuICAgIHJldHVybiBkYXRhdmlldy5nZXRGbG9hdDY0KDAsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBieXRlIGFycmF5IGZvciBkb3VibGUgKDggYnl0ZXMgaW4gSmF2YSlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZG91YmxlXCI+dG8gZ2V0IGl0cyBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBieXRlIGFycmF5XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBkb3VibGVfMl9zYnl0ZUFycmF5KGQ6IG51bWJlcik6IEludDhBcnJheSB7XHJcbiAgICBsZXQgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgpO1xyXG4gICAgbGV0IGRhdGF2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XHJcbiAgICBkYXRhdmlldy5zZXRGbG9hdDY0KDAsIGQsIHRydWUpO1xyXG4gICAgcmV0dXJuIChuZXcgSW50OEFycmF5KGRhdGF2aWV3LmJ1ZmZlcikpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFBlcmZvcm1pbmcgYW4gUG93ZXIgb3BlcmF0aW9uIG9uIHR3byBtYWdpYyBudW1iZXJzIFZhbDFeVmFsMlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW0xXCI+ICB0aGUgZmlyc3QgbnVtYmVyIC0gbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW0yXCI+ICB0aGUgZmlyc3QgbnVtYmVyIC0gcG93ZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSByZXN1bHRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBldmFsX29wX3B3cihudW0xOiBOVU1fVFlQRSwgbnVtMjogTlVNX1RZUEUpOiBOVU1fVFlQRSB7XHJcbiAgICBsZXQgZDA6IG51bWJlcjtcclxuICAgIGxldCBkMTogbnVtYmVyO1xyXG5cclxuICAgIC8vIG51bGwgdmFsdWVzXHJcbiAgICBpZiAobnVtMSA9PSBudWxsIHx8IG51bTIgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gSWYgc2Vjb25kIG9wZXJhdG9yIGlzIGFuIGludGVnZXIgKHdoaWNoIGlzIHNvIGluIG1vc3Qgb2YgdGhlIGNhc2VzKVxyXG4gICAgLy8gYW5kIGl0IGlzIG5vdCAtdmUsIHRoZW4gY2FsY3VsYXRlIHBvd2VyIHVzaW5nIHNpbXBsZSBtdWx0aXBsaWNhdGlvblxyXG4gICAgLy8gVGhlcmUgaXMgYSBwcm9ibGVtIGluIGZyb21fZG91YmxlIGFzIGl0IGRvZXNuJ3QgcmV0dXJuIGV4YWN0XHJcbiAgICAvLyB2YWx1ZXMgKGZvciBleGFtcGxlLCBwYXNzaW5nIDEuMDAyNDQxIGluIG51bSB0byBmcm9tX2RvdWJsZSB3b3VsZFxyXG4gICAgLy8gcmV0dXJuIDEuMDAyNDQwOTk5OTk5OTkpLiBidHcsIHRoaXMgcHJvYmxlbSBleGlzdHMgZXZlbiBpbiBWaXN1YWwgc3R1ZGlvJ3NcclxuICAgIC8vIHdhdGNoIHdpbmRvdyAodHJ5IHR5cGluZyAxLjAwMjQ0MSBpbiBOYW1lIGNvbHVtbiBvZiB3YXRjaCB3aW5kb3cpLlxyXG4gICAgaWYgKG51bTIuTlVNX0lTX0xPTkcoKSAmJiAhbnVtMi5udW1faXNfbmVnKCkpIHtcclxuICAgICAgZDEgPSBudW0yLnRvX2RvdWJsZSgpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBOVU1fVFlQRSA9IE5VTV9UWVBFLmZyb21fZG91YmxlKDEpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZDE7IGkrKylcclxuICAgICAgICByZXN1bHQgPSB0aGlzLm11bChyZXN1bHQsIG51bTEpO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgZDAgPSBudW0xLnRvX2RvdWJsZSgpO1xyXG4gICAgICBkMSA9IG51bTIudG9fZG91YmxlKCk7XHJcbiAgICAgIGlmIChkMCA8IDAuMCAmJiBkMSAhPT0gPG51bWJlcj4gZDEpXHJcbiAgICAgICAgZDAgPSAwLjA7XHJcbiAgICAgIC8qIHB3ciAoMC4wLCAwLjApIC0+IGVycm9yICovXHJcbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXHJcbiAgICAgIGVsc2UgaWYgKGQwICE9PSAwLjApXHJcbiAgICAgICAgZDAgPSBNYXRoLnBvdyhkMCwgZDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBOVU1fVFlQRS5mcm9tX2RvdWJsZShkMCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJhbnNsYXRlIGRvdWJsZSB0byBOVU1fVFlQRVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkb3VibGVcIj50byB0cmFuc2xhdGVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IE5VTV9UWVBFIG9mIHRoZSBkb3VibGVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBmcm9tX2RvdWJsZShkMDogbnVtYmVyKTogTlVNX1RZUEUge1xyXG4gICAgbGV0IGFycmF5OiBJbnQ4QXJyYXkgPSBOVU1fVFlQRS5kb3VibGVfMl9zYnl0ZUFycmF5KGQwKTtcclxuICAgIHJldHVybiBOVU1fVFlQRS5zdG9yYWdlX21nXzRfZmxvYXQoOCwgYXJyYXkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRyYW5zbGF0ZSBieXRlIGFycmF5ICB0byBOVU1fVFlQRVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsZW5cIj5vZiB0aGUgbmVlZGVkIG51bWJlcig4KVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYnl0ZVwiPmFycmF5IG1hc2tcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IE5VTV9UWVBFIGZvciB0aGUgbmVlZGVkIGF0dHJpYnV0ZXNcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIHN0b3JhZ2VfbWdfNF9mbG9hdChsZW46IG51bWJlciwgaW5wOiBJbnQ4QXJyYXkpOiBOVU1fVFlQRSB7XHJcbiAgICBsZXQgY2lucDogbnVtYmVyW107XHJcbiAgICBsZXQgc2lnbjogbnVtYmVyO1xyXG4gICAgbGV0IHRtcDE6IG51bWJlcjtcclxuICAgIGxldCBleHA6IG51bWJlcjtcclxuICAgIGxldCBiaWFzOiBudW1iZXI7XHJcbiAgICBsZXQgbG9uZzE6IG51bWJlcjtcclxuICAgIGxldCBsb25nMjogbnVtYmVyO1xyXG5cclxuICAgIGNpbnAgPSBuZXcgQXJyYXk8bnVtYmVyPihpbnAubGVuZ3RoKTtcclxuICAgIGZvciAodG1wMSA9IDA7XHJcbiAgICAgICAgIHRtcDEgPCBpbnAubGVuZ3RoO1xyXG4gICAgICAgICB0bXAxKyspXHJcbiAgICAgIGNpbnBbdG1wMV0gPSBOVU1fVFlQRS50b1VCeXRlKGlucFt0bXAxXSk7XHJcblxyXG4gICAgc2lnbiA9IGNpbnBbbGVuIC0gMV07XHJcbiAgICBpZiAobGVuID09PSA0KSB7XHJcbiAgICAgIGV4cCA9IDxudW1iZXI+KChjaW5wWzJdID4+IDcpIHwgKChjaW5wWzNdICYgMHg3RikgPDwgMSkpO1xyXG4gICAgICBiaWFzID0gMTUwOyAvLyAxMjYgKyAoMSArIDIzKTtcclxuICAgICAgbG9uZzEgPSAwO1xyXG4gICAgICBsb25nMiA9IE5VTV9UWVBFLk1LX0xPTkcoTlVNX1RZUEUuTUtfU0hSVCgwLCBjaW5wWzJdIHwgMHg4MCksIE5VTV9UWVBFLk1LX1NIUlQoY2lucFsxXSwgY2lucFswXSkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGV4cCA9IDxudW1iZXI+KCgoY2lucFs3XSAmIDB4N0YpIDw8IDQpIHwgKGNpbnBbNl0gPj4gNCkpO1xyXG4gICAgICBiaWFzID0gMTA3NTsgLy8gMTAyMiArICgxICsgMjAgKyAzMik7XHJcbiAgICAgIGxvbmcxID0gTlVNX1RZUEUuTUtfTE9ORyhOVU1fVFlQRS5NS19TSFJUKDAsIChjaW5wWzZdICYgMHgwRikgfCAweDEwKSwgTlVNX1RZUEUuTUtfU0hSVChjaW5wWzVdLCBjaW5wWzRdKSk7XHJcbiAgICAgIGxvbmcyID0gTlVNX1RZUEUuTUtfTE9ORyhOVU1fVFlQRS5NS19TSFJUKGNpbnBbM10sIGNpbnBbMl0pLCBOVU1fVFlQRS5NS19TSFJUKGNpbnBbMV0sIGNpbnBbMF0pKTtcclxuICAgIH1cclxuICAgIHJldHVybiBOVU1fVFlQRS5zdG9yYWdlX251bV80X2ZsZF9mbHQobG9uZzEsIGxvbmcyLCAxOCwgc2lnbiwgYmlhcywgZXhwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2xhdGUgYnl0ZSBhcnJheSAgdG8gTlVNX1RZUEUgKGxpa2UgaW4gTWFnaWMgU291Y2UgY29kZSkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHN0YXRpYyBzdG9yYWdlX251bV80X2ZsZF9mbHQobG9uZzE6IG51bWJlciwgbG9uZzI6IG51bWJlciwgZGVjOiBudW1iZXIsIHNpZ246IG51bWJlciwgYmlhczogbnVtYmVyLCBleHByOiBudW1iZXIpOiBOVU1fVFlQRSB7XHJcbiAgICBsZXQgYmFzZV9OdW0xNlB3cnM6IEludDhBcnJheVtdID0gW1xyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgMSksIDFdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDEpLCAxNl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgMiksIDIsIDU2XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyAyKSwgNDAsIDk2XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyAzKSwgNiwgNTUsIDM2XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyA0KSwgMSwgNCwgODUsIDc2XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyA0KSwgMTYsIDc3LCA3MiwgMTZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDUpLCAyLCA2OCwgNDMsIDU0LCA1Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNSksIDQyLCA5NCwgOTYsIDcyLCA5Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNiksIDYsIDg3LCAxOSwgNDcsIDY3LCAzNl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNyksIDEsIDksIDk1LCAxMSwgNjIsIDc3LCA3Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNyksIDE3LCA1OSwgMjEsIDg2LCA0LCA0NCwgMTZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDgpLCAyLCA4MSwgNDcsIDQ5LCA3NiwgNzEsIDYsIDU2XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyA4KSwgNDUsIDMsIDU5LCA5NiwgMjcsIDM3LCA0LCA5Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgOSksIDcsIDIwLCA1NywgNTksIDQwLCAzNywgOTIsIDc5LCAzNl0pXHJcbiAgICBdO1xyXG5cclxuICAgIGxldCBiYXNlX051bTJQd3JzOiBJbnQ4QXJyYXlbXSA9IFtcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDEpLCAxXSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyAxKSwgMl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgMSksIDRdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDEpLCA4XSlcclxuICAgIF07XHJcbiAgICBsZXQgdG1wbnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgbGV0IG91dFZhbDogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBleHA6IG51bWJlciA9IDxudW1iZXI+ZXhwcjtcclxuICAgIGlmIChleHAgPT09IDApIHtcclxuICAgICAgb3V0VmFsLk5VTV9aRVJPKCk7XHJcbiAgICAgIHJldHVybiBvdXRWYWw7XHJcbiAgICB9XHJcbiAgICBvdXRWYWwubnVtXzRfdWxvbmcobG9uZzIpO1xyXG4gICAgaWYgKGxvbmcxICE9PSAwKSB7XHJcbiAgICAgIHRtcG51bS5udW1fNF91bG9uZyhsb25nMSk7XHJcbiAgICAgIHRtcG51bSA9IE5VTV9UWVBFLm11bCh0bXBudW0sIG5ldyBOVU1fVFlQRShiYXNlX051bTE2UHdyc1s4XSkpO1xyXG4gICAgICBvdXRWYWwgPSBOVU1fVFlQRS5hZGQodG1wbnVtLCBvdXRWYWwpO1xyXG4gICAgfVxyXG4gICAgZXhwID0gPG51bWJlcj4oZXhwIC0gYmlhcyk7XHJcbiAgICBpZiAoZXhwIDwgMCkge1xyXG4gICAgICBleHAgPSAtZXhwO1xyXG4gICAgICB3aGlsZSAoZXhwID49IDYwKSB7XHJcbiAgICAgICAgb3V0VmFsID0gTlVNX1RZUEUuZGl2KG91dFZhbCwgbmV3IE5VTV9UWVBFKGJhc2VfTnVtMTZQd3JzWzE0XSkpO1xyXG4gICAgICAgIGV4cCAtPSA1NjtcclxuICAgICAgfVxyXG4gICAgICB0bXBudW0gPSBOVU1fVFlQRS5tdWwobmV3IE5VTV9UWVBFKGJhc2VfTnVtMTZQd3JzW2V4cCA+PiAyXSksXHJcbiAgICAgICAgbmV3IE5VTV9UWVBFKGJhc2VfTnVtMlB3cnNbZXhwICYgM10pKTtcclxuICAgICAgb3V0VmFsID0gTlVNX1RZUEUuZGl2KG91dFZhbCwgdG1wbnVtKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoZXhwID49IDYwKSB7XHJcbiAgICAgICAgb3V0VmFsLk5VTV9aRVJPKCk7XHJcbiAgICAgICAgcmV0dXJuIG91dFZhbDtcclxuICAgICAgfVxyXG4gICAgICB0bXBudW0gPSBOVU1fVFlQRS5tdWwobmV3IE5VTV9UWVBFKGJhc2VfTnVtMTZQd3JzW2V4cCA+PiAyXSksXHJcbiAgICAgICAgbmV3IE5VTV9UWVBFKGJhc2VfTnVtMlB3cnNbZXhwICYgM10pKTtcclxuICAgICAgb3V0VmFsID0gTlVNX1RZUEUubXVsKG91dFZhbCwgdG1wbnVtKTtcclxuICAgIH1cclxuICAgIGlmICgoc2lnbiAmIDB4ODApICE9PSAwKVxyXG4gICAgICBvdXRWYWwuX2RhdGFbMF0gPSBvdXRWYWwuX2RhdGFbMF0gfCBOVU1fVFlQRS5TSUdOX01BU0s7XHJcbiAgICBvdXRWYWwucm91bmQoZGVjKTtcclxuICAgIHJldHVybiBvdXRWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgTWF0aGVtYXRpY2FsIGZ1bmN0aW9ucyBpbXBsZW1lbnRhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGV2YWxfb3BfbG9nKHZhbDE6IE5VTV9UWVBFKTogTlVNX1RZUEUge1xyXG4gICAgaWYgKHZhbDEgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQgcmVzVmFsOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgbGV0IGQ6IG51bWJlciA9IHZhbDEudG9fZG91YmxlKCk7XHJcblxyXG4gICAgaWYgKGQgPiAwLjApXHJcbiAgICAgIHJlc1ZhbCA9IE5VTV9UWVBFLmZyb21fZG91YmxlKE1hdGgubG9nKGQpKTtcclxuICAgIGVsc2VcclxuICAgICAgcmVzVmFsLk5VTV9aRVJPKCk7XHJcbiAgICByZXR1cm4gcmVzVmFsO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGV2YWxfb3BfZXhwKHZhbDE6IE5VTV9UWVBFKTogTlVNX1RZUEUge1xyXG4gICAgbGV0IHJlc1ZhbDogTlVNX1RZUEU7XHJcblxyXG4gICAgaWYgKHZhbDEgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBsZXQgZDogbnVtYmVyID0gdmFsMS50b19kb3VibGUoKTtcclxuICAgIHJlc1ZhbCA9IE5VTV9UWVBFLmZyb21fZG91YmxlKE1hdGguZXhwKGQpKTtcclxuICAgIHJldHVybiByZXNWYWw7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZXZhbF9vcF9hYnModmFsMTogTlVNX1RZUEUpOiBOVU1fVFlQRSB7XHJcbiAgICBpZiAodmFsMSA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQgcmVzVmFsOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSh2YWwxKTtcclxuICAgIHJlc1ZhbC5udW1fYWJzKCk7XHJcbiAgICByZXR1cm4gcmVzVmFsO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGV2YWxfb3Bfc2luKHZhbDE6IE5VTV9UWVBFKTogTlVNX1RZUEUge1xyXG4gICAgaWYgKHZhbDEgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgbGV0IHJlc1ZhbDogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBkOiBudW1iZXIgPSB2YWwxLnRvX2RvdWJsZSgpO1xyXG4gICAgcmVzVmFsID0gTlVNX1RZUEUuZnJvbV9kb3VibGUoTWF0aC5zaW4oZCkpO1xyXG4gICAgcmV0dXJuIHJlc1ZhbDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBldmFsX29wX2Nvcyh2YWwxOiBOVU1fVFlQRSk6IE5VTV9UWVBFIHtcclxuICAgIGlmICh2YWwxID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIGxldCByZXNWYWw6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICAgIGxldCBkOiBudW1iZXIgPSB2YWwxLnRvX2RvdWJsZSgpO1xyXG4gICAgcmVzVmFsID0gTlVNX1RZUEUuZnJvbV9kb3VibGUoTWF0aC5jb3MoZCkpO1xyXG4gICAgcmV0dXJuIHJlc1ZhbDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBldmFsX29wX3Rhbih2YWwxOiBOVU1fVFlQRSk6IE5VTV9UWVBFIHtcclxuICAgIGlmICh2YWwxID09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgbGV0IHJlc1ZhbDogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBkOiBudW1iZXIgPSB2YWwxLnRvX2RvdWJsZSgpO1xyXG4gICAgcmVzVmFsID0gTlVNX1RZUEUuZnJvbV9kb3VibGUoTWF0aC50YW4oZCkpO1xyXG4gICAgcmV0dXJuIHJlc1ZhbDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBldmFsX29wX2FzaW4odmFsMTogTlVNX1RZUEUpOiBOVU1fVFlQRSB7XHJcbiAgICBpZiAodmFsMSA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQgcmVzVmFsOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgbGV0IGQ6IG51bWJlciA9IHZhbDEudG9fZG91YmxlKCk7XHJcbiAgICBpZiAoZCA8PSAxLjAgJiYgZCA+PSAtMS4wKVxyXG4gICAgICByZXNWYWwgPSBOVU1fVFlQRS5mcm9tX2RvdWJsZShNYXRoLmFzaW4oZCkpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXNWYWwgPSBOVU1fVFlQRS5mcm9tX2RvdWJsZSgwLjApO1xyXG4gICAgcmV0dXJuIHJlc1ZhbDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBldmFsX29wX2Fjb3ModmFsMTogTlVNX1RZUEUpOiBOVU1fVFlQRSB7XHJcbiAgICBpZiAodmFsMSA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQgcmVzVmFsOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgbGV0IGQ6IG51bWJlciA9IHZhbDEudG9fZG91YmxlKCk7XHJcblxyXG4gICAgaWYgKGQgPD0gMS4wICYmIGQgPj0gLTEuMClcclxuICAgICAgcmVzVmFsID0gTlVNX1RZUEUuZnJvbV9kb3VibGUoTWF0aC5hY29zKGQpKTtcclxuICAgIGVsc2VcclxuICAgICAgcmVzVmFsID0gTlVNX1RZUEUuZnJvbV9kb3VibGUoMC4wKTtcclxuICAgIHJldHVybiByZXNWYWw7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZXZhbF9vcF9hdGFuKHZhbDE6IE5VTV9UWVBFKTogTlVNX1RZUEUge1xyXG4gICAgaWYgKHZhbDEgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgbGV0IHJlc1ZhbDogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgICAgbGV0IGQ6IG51bWJlciA9IHZhbDEudG9fZG91YmxlKCk7XHJcbiAgICByZXNWYWwgPSBOVU1fVFlQRS5mcm9tX2RvdWJsZShNYXRoLmF0YW4oZCkpO1xyXG4gICAgcmV0dXJuIHJlc1ZhbDtcclxuICB9XHJcblxyXG4gIG51bV9hYnMoKTogdm9pZCB7XHJcbiAgICBsZXQgbDogbnVtYmVyO1xyXG4gICAgaWYgKHRoaXMuTlVNX0lTX0xPTkcoKSkge1xyXG4gICAgICBsID0gdGhpcy5OVU1fTE9ORygpO1xyXG4gICAgICBpZiAobCA8IDApXHJcbiAgICAgICAgbCA9IC1sO1xyXG4gICAgICB0aGlzLk5VTV80X0xPTkcobCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX2RhdGFbMF0gJj0gTlVNX1RZUEUudG9TQnl0ZSh+TlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSYW5kb21hbCBNYXRoIGZ1bmN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgZXZhbF9vcF9yYW5kKHZhbDE6IE5VTV9UWVBFKTogTlVNX1RZUEUge1xyXG4gICAgaWYgKHZhbDEgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGxldCByYW5kX2luaXRpYWxpemVkOiBib29sZWFuID0gUmFuZG9taXplci5nZXRfaW5pdGlhbGl6ZWQoKTtcclxuICAgIGxldCByYW5kX21vZDogTlVNX1RZUEU7XHJcbiAgICBsZXQgcmFuZF9tdWw6IE5VTV9UWVBFO1xyXG4gICAgbGV0IHJhbmRfc2VlZDogTlVNX1RZUEU7XHJcblxyXG4gICAgbGV0IHRtcF9udW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcblxyXG4gICAgaWYgKCFyYW5kX2luaXRpYWxpemVkKSB7XHJcbiAgICAgIFJhbmRvbWl6ZXIuc2V0X2luaXRpYWxpemVkKCk7IC8vIHNldCB0byB0cnVlXHJcbiAgICAgIHJhbmRfbW9kID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICAgIHJhbmRfbXVsID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICAgIHJhbmRfc2VlZCA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgICByYW5kX21vZC5udW1fNF9hX3N0ZChcIjEwMDAwMDAwN1wiKTtcclxuICAgICAgcmFuZF9tdWwubnVtXzRfYV9zdGQoXCI3NTAwMDAwN1wiKTtcclxuICAgICAgcmFuZF9zZWVkLm51bV80X2Ffc3RkKFwiMTIzNDU2NzhcIik7XHJcblxyXG4gICAgICBSYW5kb21pemVyLnNldF9tb2QocmFuZF9tb2QudG9fZG91YmxlKCkpO1xyXG4gICAgICBSYW5kb21pemVyLnNldF9tdWwocmFuZF9tdWwudG9fZG91YmxlKCkpO1xyXG4gICAgICBSYW5kb21pemVyLnNldF9zZWVkKHJhbmRfc2VlZC50b19kb3VibGUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICByYW5kX21vZCA9IE5VTV9UWVBFLmZyb21fZG91YmxlKFJhbmRvbWl6ZXIuZ2V0X21vZCgpKTtcclxuICAgICAgcmFuZF9tdWwgPSBOVU1fVFlQRS5mcm9tX2RvdWJsZShSYW5kb21pemVyLmdldF9tdWwoKSk7XHJcbiAgICAgIHJhbmRfc2VlZCA9IE5VTV9UWVBFLmZyb21fZG91YmxlKFJhbmRvbWl6ZXIuZ2V0X3NlZWQoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIGlmICghdmFsMS5udW1faXNfemVybygpKSB7XHJcbiAgICAgIGlmICh2YWwxLm51bV9pc19uZWcoKSlcclxuICAgICAgICByYW5kX3NlZWQuTlVNXzRfTE9ORyhOVU1fVFlQRS5oYXNoX3JhbmQoKSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICByYW5kX3NlZWQgPSBuZXcgTlVNX1RZUEUodmFsMSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgIGlmIChyYW5kX3NlZWQubnVtX2lzX25lZygpKSB7XHJcbiAgICAgICAgdG1wX251bS5OVU1fNF9MT05HKC0xKTtcclxuICAgICAgICByYW5kX3NlZWQgPSBOVU1fVFlQRS5tdWwocmFuZF9zZWVkLCB0bXBfbnVtKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJhbmRfc2VlZCA9IE5VTV9UWVBFLm11bChyYW5kX3NlZWQsIHJhbmRfbXVsKTtcclxuICAgIHJhbmRfc2VlZCA9IE5VTV9UWVBFLm1vZChyYW5kX3NlZWQsIHJhbmRfbW9kKTtcclxuICAgIHRtcF9udW0gPSBOVU1fVFlQRS5kaXYocmFuZF9zZWVkLCByYW5kX21vZCk7XHJcbiAgICAvLyByZXNldCBnbG9iYWxzIHZhcmlhYmxlc1xyXG4gICAgUmFuZG9taXplci5zZXRfbW9kKHJhbmRfbW9kLnRvX2RvdWJsZSgpKTtcclxuICAgIFJhbmRvbWl6ZXIuc2V0X211bChyYW5kX211bC50b19kb3VibGUoKSk7XHJcbiAgICBSYW5kb21pemVyLnNldF9zZWVkKHJhbmRfc2VlZC50b19kb3VibGUoKSk7XHJcbiAgICByZXR1cm4gdG1wX251bTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSByYW5kb20gdmFsdWUgdG8gdXNlIGFzIHRoZSBjdGwgZW5jcmlwdGlvbiAga2V5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHN0YXRpYyBoYXNoX3JhbmQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAoKG5ldyBEYXRlKCkuZ2V0TWlsbGlzZWNvbmRzKCkpIF4gTWF0aC5yYW5kb20oKSAqIDEyMzQ1Njc4KTtcclxuICAgIC8vIGxldCBhcnJheTogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPigxMDApO1xyXG4gICAgLy8gZm9yIChsZXQgX2FpOiBudW1iZXIgPSAwOyBfYWkgPCBhcnJheS5sZW5ndGg7ICsrX2FpKVxyXG4gICAgLy8gICBhcnJheVtfYWldID0gMDtcclxuICAgIC8vIG5ldyBSYW5kb20oKS5OZXh0Qnl0ZXMoYXJyYXkpO1xyXG4gICAgLy8gcmV0dXJuIDxudW1iZXI+KE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgXiBOVU1fVFlQRS5oYXNoX3N0cl9uZXcoYXJyYXkpKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBPcGVyRGF0YSB7XHJcbiAgTlVNX0RpZmZfOiBudW1iZXIgPSAwO1xyXG4gIE5VTV9FeHAxXzogbnVtYmVyID0gMDtcclxuICBOVU1fRXhwMl86IG51bWJlciA9IDA7XHJcbn1cclxuXHJcbiJdfQ==
|